diff --git a/.i18n-state.json b/.i18n-state.json index dc54b6740f45..cd5ca8c8384b 100644 --- a/.i18n-state.json +++ b/.i18n-state.json @@ -18,7 +18,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -31,7 +31,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -44,7 +44,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -57,7 +57,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -70,7 +70,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -83,7 +83,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -96,7 +96,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -109,7 +109,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -122,7 +122,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -135,7 +135,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -148,7 +148,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -161,7 +161,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -174,7 +174,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -187,7 +187,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -200,7 +200,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -213,7 +213,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -226,7 +226,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -239,7 +239,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -252,7 +252,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -265,7 +265,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -278,7 +278,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -291,7 +291,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -304,7 +304,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -317,7 +317,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -330,7 +330,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -343,7 +343,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -356,7 +356,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -369,7 +369,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -382,7 +382,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -395,7 +395,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -408,7 +408,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -421,7 +421,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -434,7 +434,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -447,7 +447,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -460,7 +460,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -473,7 +473,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -486,7 +486,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -499,7 +499,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -512,7 +512,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -525,7 +525,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -538,7 +538,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -551,7 +551,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -564,7 +564,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -577,7 +577,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -590,7 +590,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -603,7 +603,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -616,7 +616,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -629,7 +629,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -642,7 +642,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -655,7 +655,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -668,7 +668,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -681,7 +681,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -694,7 +694,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -707,7 +707,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -720,7 +720,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -733,7 +733,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -746,7 +746,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -759,7 +759,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -772,7 +772,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -785,7 +785,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -798,7 +798,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -811,7 +811,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -824,7 +824,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -837,7 +837,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "b90b22873977a250f16576a05ee3eae11b4a6be0882674d3d368985032201a88", @@ -850,7 +850,7 @@ "0230edb63f1f", "067f0a1d366e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -869,7 +869,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -883,7 +883,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -897,7 +897,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -911,7 +911,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -925,7 +925,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -939,7 +939,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -953,7 +953,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -967,7 +967,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -981,7 +981,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -995,7 +995,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1009,7 +1009,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1023,7 +1023,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1037,7 +1037,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1051,7 +1051,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1065,7 +1065,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1079,7 +1079,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1093,7 +1093,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1107,7 +1107,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1121,7 +1121,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1135,7 +1135,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1149,7 +1149,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1163,7 +1163,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1177,7 +1177,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1191,7 +1191,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1205,7 +1205,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1219,7 +1219,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1233,7 +1233,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1247,7 +1247,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1261,7 +1261,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1275,7 +1275,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1289,7 +1289,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1303,7 +1303,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1317,7 +1317,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1331,7 +1331,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1345,7 +1345,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1359,7 +1359,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1373,7 +1373,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1387,7 +1387,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1401,7 +1401,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1415,7 +1415,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1429,7 +1429,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1443,7 +1443,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1457,7 +1457,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1471,7 +1471,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1485,7 +1485,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1499,7 +1499,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1513,7 +1513,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1527,7 +1527,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1541,7 +1541,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1555,7 +1555,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1569,7 +1569,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1583,7 +1583,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1597,7 +1597,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1611,7 +1611,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1625,7 +1625,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1639,7 +1639,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1653,7 +1653,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1667,7 +1667,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1681,7 +1681,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1695,7 +1695,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1709,7 +1709,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1723,7 +1723,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1737,7 +1737,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1751,7 +1751,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "151cd0ae57fb50b8a7363c084ecc4593f59c6bf73f7ef632c077e7b8c41923ea", @@ -1765,7 +1765,7 @@ "d792555d879c", "ac0e8fd4868e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -1787,7 +1787,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1804,7 +1804,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1821,7 +1821,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1838,7 +1838,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1855,7 +1855,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1872,7 +1872,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1889,7 +1889,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1906,7 +1906,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1923,7 +1923,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1940,7 +1940,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1957,7 +1957,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1974,7 +1974,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -1991,7 +1991,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2008,7 +2008,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2025,7 +2025,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2042,7 +2042,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2059,7 +2059,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2076,7 +2076,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2093,7 +2093,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2110,7 +2110,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2127,7 +2127,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2144,7 +2144,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2161,7 +2161,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2178,7 +2178,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2195,7 +2195,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2212,7 +2212,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2229,7 +2229,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2246,7 +2246,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2263,7 +2263,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2280,7 +2280,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2297,7 +2297,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2314,7 +2314,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2331,7 +2331,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2348,7 +2348,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2365,7 +2365,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2382,7 +2382,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2399,7 +2399,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2416,7 +2416,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2433,7 +2433,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2450,7 +2450,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2467,7 +2467,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2484,7 +2484,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2501,7 +2501,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2518,7 +2518,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2535,7 +2535,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2552,7 +2552,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2569,7 +2569,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2586,7 +2586,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2603,7 +2603,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2620,7 +2620,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2637,7 +2637,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2654,7 +2654,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2671,7 +2671,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2688,7 +2688,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2705,7 +2705,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2722,7 +2722,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2739,7 +2739,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2756,7 +2756,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2773,7 +2773,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2790,7 +2790,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2807,7 +2807,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2824,7 +2824,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2841,7 +2841,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2858,7 +2858,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0da9cb7b6ec091538e7fbafbdf8d7e3a3e7e2c12ea352c56722cec883596f8e1", @@ -2875,7 +2875,7 @@ "ecfaa4a13490", "1b6ca9f7d357" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -2886,403 +2886,403 @@ "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "e7b3e5a65d58974cfd98d32567722f42a302f4c4b430c36171c46f855d7dab1d", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "74367e9a76bf12da52f7a905aa5b4f1b68a490274eafd1c4841c1d17ff944398", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "ab7a6a68e24d4ae670487d8feac250eb3ce4d77c968f8de9be7293d3060090cd", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "ee1726d4693a7c5a552769329075c4df6ce18892ca8249e73d189758534cfa8b", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "5670d7ba38df431186d07f837584913d2354aa629610ae0ca58172a8d87b4b08", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "06ae96c28eaeac1844de9025b74b1e6b540b6b724e845e190c2b11aa9f67d9fa", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "9fcbb4b5b595db012bc9b1215a614796d0aaa6b1694fd40e6041c31b4b198a51", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "44f67c9f7178bc5d5bb77c9301d6770fac06b236cce747f8c24f5b311431a9d6", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "4dc4b6ed612f915bc7c0525dbb487046c20e421eea9f38c2fc1eeda1e4f4f0d5", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "ebe1c8ecdca57fd9e036cd62b58d9a95c4a2f558d79269a0743a5c172567ff3b", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "f568d5ea27690127926303f043713e6aed453bcc9cac9f41b33c6a88ef9ab37f", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d58467fc5b3944bdae9ac220b882e110af6eb66122e1de9890db44ecd3b8aeca", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d822e3f33a9c769dcbfbed25ce2956131b9c95ee423a66d03748568b0052f324", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "37fb156c3e3b9948610a9bbd314ef82720fd980fd2074a9fde02e7a317767bf9", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "565561ef3fd52c694118002a7ce92e8a2c730b668abed9c7c89cb9fbfda377e4", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "9c7f273df9809e4c0efdb35987b5fd566f1e540e895dffb69553091f16e22dc8", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "3d5f1adb274aa07d5d191a817f5dec3a8d1dd4e81e9eb5834b62845a3a394a1b", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "09795d6af12b6de2d4a5412c9b3361529b56e89df2ce32d0d6b7f7c8f99bda4c", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "72f6dcc0ca4d2824b01d8399b84e58cad89e9814e88c2095de73db08b3558260", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "2022b7c177fb8e6e0a7cc9c263d45f7836dcaa69d0d9cc2e16a4e244be0cfe69", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "70dc304dc7a0f7fa4c5110a696f5ec52506bb230f7c165e4b8601e548c8517e8", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "c60dc108c4cb6663bd923cccbcf13f657b70f7c81b2cb74b2b2aa401633b63c7", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d411a5c0482b987f253fcfdaa17afb546a61dca8af826a03ea0d61352b33bce2", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "a8a9f1ee9c70400fde8e65c718f46467e1ef23b526fba1907a49cac28298cde1", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "bbdb1759bf8c8f5cbf25af4be064748d93e21d48e0367b305dcee0d3b4eb62fc", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "a0b9986ac3a13ea8c687075a70c8662a64044f0a113359254d6ef835cf6646f3", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d22a4d9155f188aefaa07147d02ba93573780e10dc7eaa1f5eef9c7e9a1b5a9d", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "33d432ff8e336da9a03f057e615b1872a1d6e8b123cae4071f06f341475b7772", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "c40b5412df13a3aba6d39b4321f4d616a11b4672bc6ed77684af987f74f68b0a", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "5c6dc5aa8c6b8033b12cd92101c7eb63e06c16eb0ac383966e2d93ce4abcc9d7", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "ce6bcd9037a882f1f006fc4fc287e1b81c47b0ad9a147e10bf4fb052a439f3d5", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "2ecec1518060e0ca7bdfa916f737aa2635b7cbd07a76dd04e202820b60e7641c", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "b21aa8282da518f68c0c7199f3b9bfbaa40804239a72cf0baa21bdd63d8271af", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d7925655c36866764ea300b216de8c7a2a0e5bb713de3a952725f05fb7b02035", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "e3e248fb04b38ec725f65e93377ea8c5e7324869e091887f6d2b4d977f5ac054", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "683a13281308a227e845a90064ca89311cfd65dd7fac0a110a53e667d7150386", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "065b6e3760019380d3fdf02ca9b6c4cc75e58b1ba2a907570cc54b35989b460e", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "23e6ccb0c3e196d62b36e592bb1823162a8db3a3e80d6ef795e1566c63144d3b", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "cab6d6696eb39d984045800661570bf833c5d7a26b489907ae675a807c22abe9", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "39b684cd59169fce0d185f1c5fe4537c960ae93945f3a3b2cd3ff51bad7ff349", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "2fc094728a049773811ecb57f35080957f03c093b024c3154ac95a740f610963", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "2f92e57810db364f7abb9593274116188d94f7b800a0964a8dba0ebe57627311", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d3bc6179d095b4715d2e0a0d4459890a1710a0dcf0525d3d4196db8b50263224", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "536943df9adca0456e6a9092f27b327ba07dab767456a0b7f2cfc22511a3dd0a", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "8ab6724bd86d16c25cb0a5389a6ebbae88eeb5e9eef68bf35dc529190e71c361", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "faa9032f72e9778111b3838fb9626fb76e73745fe9fc6297bceb46089ab2adb3", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "67d3b48f0e9ad43066aff491994465e117de90fec3fd7bf37ae75dc654ab68d7", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "0f011713bce7157df44c9247f6f61cf7b80ba8e0c3e18375428d734b401b6a64", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "921c8b2ed6c5ada13826a27f2233f23c4739094aab3ae7d746170fbeb9163fe9", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "cd8e98ee761ce0534551ea64d7ba2c143032b7420499add989af9e2dcfe3754e", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "81334dc0e84175de3c45b4f786b81eef341ae1edd59b87ecbeff8069aad42176", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "461aaeef1c69ddbb09dbd4ec595280b816a4ea6c0a678edf4138a3dae0a3509b", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "9e4144124eec8f94e82cf417c0686e7d3cd048ac094f0024d09697e4be91acc8", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "fac37d9907750279b1924b801f47d2ddebfdb96fe5b390d1c310bfbf2cd56bc4", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "63d3e18a2068fb0d91ac1a8434c5132ea59162c9bddc276e2af8ae24bc8b5ac0", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "42e53400f4cd054ffc393c330fc481bfd10faf7b0b73745d1a678bed3ba91987", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "26a334f8a2930ad244e93ddb5330ddf96d306362bab4d14b656157abd63dee59", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "d13ffa18312874e2c81e481e0875cabf6511a7a84ed64b426280ba9374c5056f", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "37d3aa46ee53102034ab4754da194783d4a4daf4871090e319e1b25042a357da", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "239333295f065882f9126141948e6eef3f0cf4f5bac8613b5def4c2c9e0c7279", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "0fe0cc0272a411ad53e38bf1325fae0b6c18673c86926412796f63f153eeb3b8", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "632bcea6b14f70f1df10b855083fed4e8f73ca2d0c5cce3309701bc1556f1b16", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "c0d5f00eb35c2767764d1819816dbbb761842fdc4dce7b3a5d0129fd46380c29", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "a7ebf3bdd7a63c1807fd91eac767e962fa85e6423fb10177f46a2127790f8766", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "8ce18538a6fafc686015b9d5c69e0f9f0f9ec4465173b96d09f5502067abaf1e", "target_hash": "85a074aa497971b45503f7be30644fa00434ff75ace0b6fa4901b188adb37810", "section_hashes": ["5f35908464cf"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "README.md": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", "locales": { "ar": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "74902779a5bbbe9025b14e5257f0d82cf98b38626b1d6079c5adfa7c823d15af", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "f0b4eadeebe60e0479713356bf3ef304d296c9ea41c71168c4e19084533f64ca", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3292,16 +3292,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3309,14 +3309,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "0f1b453966dd544293ed573448e86e9a38c72eb3e76bce98764ee1354e06ae9a", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "c71439bcff808dc9b360949dcec8d95ae25377ef4b741e5b629d8b500b0c96ab", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3326,16 +3326,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3343,14 +3343,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "f55791bb8ed68aa7caea473107bf3cba21f51c80bf30a319f1c78d1cd53c1bbd", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "69143d78e6c642cb0fed8bd82cc6d8d93722171abd41278859736745b157fea4", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3360,16 +3360,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3377,14 +3377,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "5bc81d2fa9451137977503b67bb09ed3b07bc55235f1b6d269dd560c146993a2", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "482738125eb1ab85600310f443a4df2b68a1e8cc39851b6a725d2517afa47223", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3394,16 +3394,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3411,14 +3411,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "4ae1626d35dfc24bec2b777b2a88c70286377e5d47102d9c4cdc5aea0dac8d44", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "2913bc02079041879270c9f63517b6c098772c3670b7ffc3633aa7ccde0d1790", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3428,16 +3428,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3445,14 +3445,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "dd6e1475f0985d0ea2cdd5a4848ffc589b26b6074d6ff9cd079480443a9aa7e5", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "5d5ce5a4f12392e6ee7e796220f298b470229367d4267dd8a0afe16c352dd2c9", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3462,16 +3462,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3479,14 +3479,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "f4c88229e142036d625274689298d19f55164206c29ff4763ce7fbf02c06fa4d", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "7b1154f2d41821a024166cf69715397ea123a6a8dd08812c390548c76fc9ce84", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -3496,16 +3496,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -3513,11 +3513,249 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "64bff3e2ffb6d5004dfba3faf8a49e95914bd9b61a02e6d37b4b23933fe7d989", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "fa": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "33881656628666b41b56dd851a65d67bdb7cd198769960fd9bf3fa2d80a7e77b", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "fi": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "7a1e56f4ba93a989dd123ff491498bbcac97d879966bae290cc232fe0b565d4d", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "fr": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "35fb23fb175621d8995739a2997d0ef672742784099dd44fbf3c0e57c6d38f4b", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "gu": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "0b07a32f705ddf578089e6500f0af0f729669201baaa0ca71f0a83322b364dc3", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "he": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "ce00f3f84311f0b00829eedcde76eaffe3d93212a4a9f9f688c2f14764436adf", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "hi": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "52056618cee799eb737fa38d26ba18ab063cd5e9616ece2556a793f33f669a7c", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "hu": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "4ad86e56c07d399f12d400685e3a323dacad23b20d169c98f777dfda7a3653da", + "target_hash": "37b22b466042e131820a63d5812392e521365c69b6b86cb35a8a8415a8dbe457", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3547,11 +3785,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "fa": { + "id": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "c3b17eced33c57ec9d4bce39b415033d0a3e5f415a490695fc2e080af98b815a", + "target_hash": "1a3fce065a49131316acd38026819284084ed4f2591fd3bec13e7999e47d4b55", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3581,11 +3819,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "fi": { + "it": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "fd8d9caae8da953945cac471325a7446bb4d046a9a30524a4539193a68d4adf4", + "target_hash": "205071577397917a0de9f0a2b21c6bb84a6b6ed9af6947dc33579dc6bf7c8527", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3615,11 +3853,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "fr": { + "ja": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "7c02b0cd87dca1bd225176e13199de40b4501f0f91f8ee780278f896ad26ef58", + "target_hash": "9102f09a014bf7e6506b10f9635f7e96d0c1d54227009b66a97ffc022c50fff4", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3649,11 +3887,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "gu": { + "ko": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "ba1c234bbb692bbe893fe7eb265e9eb5e707c84c65381e93b9eb6a0c8fd5ca44", + "target_hash": "725c79c7564e979d68d68ef084655f1ce99cd8c88cfebe7754b78d7c38ee2ddf", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3683,11 +3921,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "he": { + "mr": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "5479157570b156f2e995bcdbc29197e3fedb1c83ae80f35bb2705c95ce856c3a", + "target_hash": "69f32be8aca6d2a374aff03bf41005f56cc3c6a9839b9cc7a3657a33190e6410", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3717,11 +3955,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "hi": { + "ms": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "c95676cb1278fc42ecc9daab422a5e78e57e6cbdf56468a50611d032dd119b10", + "target_hash": "d36c05f2a80cb832a1602fdb480272f161adf0daa5d7808818fa2ed5298e24f5", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3751,11 +3989,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "hu": { + "nl": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "37b22b466042e131820a63d5812392e521365c69b6b86cb35a8a8415a8dbe457", + "target_hash": "545d2f0abd381d48e426a6b5faf72af479bcab7af41b23b44774cc3d9f2d683a", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3785,11 +4023,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "id": { + "no": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "cc0b8b52e359e0c655de2e6cc9b3c8f60b0d67a646b1c27c13f37e87a05b4a43", + "target_hash": "179d8c318f19fa3d2ee3d04c394621eb66b17c789c27d199a89b2392896d31d0", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3819,11 +4057,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "it": { + "phi": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "205071577397917a0de9f0a2b21c6bb84a6b6ed9af6947dc33579dc6bf7c8527", + "target_hash": "a464a488df3f8ebc9837e9203ff958dc0c5923944f5865caf4d61679dfdef5c5", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3853,11 +4091,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ja": { + "pl": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "9102f09a014bf7e6506b10f9635f7e96d0c1d54227009b66a97ffc022c50fff4", + "target_hash": "ce1de1251e21dca71582583b93f36d662c62de16723a15bfaf14a97501e857a1", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3887,11 +4125,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ko": { + "pt": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "725c79c7564e979d68d68ef084655f1ce99cd8c88cfebe7754b78d7c38ee2ddf", + "target_hash": "04cdb2ab5a0e8d2d6598d1dcce89bdf0eb1bca089f17d27d1e1b065a103933d0", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3921,11 +4159,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "mr": { + "pt-BR": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "69f32be8aca6d2a374aff03bf41005f56cc3c6a9839b9cc7a3657a33190e6410", + "target_hash": "a7bf6f73714a92daa442c12921ea99cf985c55be913b7c57aed8874eaf806a1c", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3955,11 +4193,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ms": { + "ro": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "d36c05f2a80cb832a1602fdb480272f161adf0daa5d7808818fa2ed5298e24f5", + "target_hash": "c3032fd763e8e0b37a33c1147d30e00a5c407c6588ee0a63fe1da081ef675ce7", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -3989,11 +4227,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "nl": { + "ru": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "545d2f0abd381d48e426a6b5faf72af479bcab7af41b23b44774cc3d9f2d683a", + "target_hash": "510a2d7325cab6460bc93587cc04d79579b018b13e39fc616855740d816a6706", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4023,11 +4261,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "no": { + "sk": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "179d8c318f19fa3d2ee3d04c394621eb66b17c789c27d199a89b2392896d31d0", + "target_hash": "1ec4f0be5cb351ace6d852699652ea098910941e954a6150b40e7acae49c77b9", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4057,11 +4295,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "phi": { + "sv": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "a464a488df3f8ebc9837e9203ff958dc0c5923944f5865caf4d61679dfdef5c5", + "target_hash": "0b8a212149df7ce2b08066b9fd05f68414b32046b83ef2e46cd28ed9aa85be60", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4091,11 +4329,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "pl": { + "sw": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "ce1de1251e21dca71582583b93f36d662c62de16723a15bfaf14a97501e857a1", + "target_hash": "2a4907b1dcbc7d635be8f212755330cfae892ee27678ccee64cde331f32c0de3", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4125,11 +4363,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "pt": { + "ta": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "04cdb2ab5a0e8d2d6598d1dcce89bdf0eb1bca089f17d27d1e1b065a103933d0", + "target_hash": "fe89d230ef814646fc44ed7ad35c6c94dd670ee9e1772ce52b50eafa603b6600", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4159,11 +4397,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "pt-BR": { + "te": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "a7bf6f73714a92daa442c12921ea99cf985c55be913b7c57aed8874eaf806a1c", + "target_hash": "ac8cd5aac17e9b2ea3f467ccafe5d1b0d14d3b8c1443da9fc2fbe95882d9dd6d", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4193,11 +4431,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ro": { + "th": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "c3032fd763e8e0b37a33c1147d30e00a5c407c6588ee0a63fe1da081ef675ce7", + "target_hash": "23352db8744dfcc5bcff86cc60e6feefcaa3c04e3bf29f8590548e0e1679a1d8", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4227,11 +4465,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ru": { + "tr": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "510a2d7325cab6460bc93587cc04d79579b018b13e39fc616855740d816a6706", + "target_hash": "fca9871f9d38ad3db0dc19923527d4d79e08a194f084efc7150a09896261f38b", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4261,11 +4499,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "sk": { + "uk-UA": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "1ec4f0be5cb351ace6d852699652ea098910941e954a6150b40e7acae49c77b9", + "target_hash": "c638fcd0cd44824b509b9a10c147ecd67b02796bfabd8da0722aeea3768fe693", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4295,11 +4533,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "sv": { + "ur": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "0b8a212149df7ce2b08066b9fd05f68414b32046b83ef2e46cd28ed9aa85be60", + "target_hash": "0d5b1b4d4a600b27ba9f924a302b2f9b8f92878c22c4e69df4b521a74e8a83a0", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4329,11 +4567,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "sw": { + "vi": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "2a4907b1dcbc7d635be8f212755330cfae892ee27678ccee64cde331f32c0de3", + "target_hash": "8e08495556b7b97e9d1c015bc9bb4fd71928dd2a679051ae82f6b4a11fc03a2c", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4363,11 +4601,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ta": { + "zh-CN": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "fe89d230ef814646fc44ed7ad35c6c94dd670ee9e1772ce52b50eafa603b6600", + "target_hash": "e40f7bf040bb9014196dc6b8a68457a377178ebb60449653aa1ab14b92661dde", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4397,11 +4635,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "te": { + "zh-TW": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "ac8cd5aac17e9b2ea3f467ccafe5d1b0d14d3b8c1443da9fc2fbe95882d9dd6d", + "target_hash": "5e6f23821915043e2c2824a8132af46cc05eb5356d5c4bb480c47b0de3095ef8", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4431,14 +4669,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "th": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "23352db8744dfcc5bcff86cc60e6feefcaa3c04e3bf29f8590548e0e1679a1d8", + "el": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "74c8d11f0335512e333f310929fbfc3eb7917b54204ff4777298e4b6eaf9353c", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -4448,16 +4686,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -4465,14 +4703,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "tr": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "fca9871f9d38ad3db0dc19923527d4d79e08a194f084efc7150a09896261f38b", + "hr": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "18701a148110cb342e2b9b5177e886f15946e1803f1562c97fc07f8e6d031bb4", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -4482,16 +4720,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -4499,11 +4737,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "uk-UA": { + "sr": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "c638fcd0cd44824b509b9a10c147ecd67b02796bfabd8da0722aeea3768fe693", + "target_hash": "cde9d6f24f928da06ba69fc25644e0fefe1ab5191e5e1bed1cc85f4a7f8e85f6", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4533,11 +4771,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ur": { + "lt": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "0d5b1b4d4a600b27ba9f924a302b2f9b8f92878c22c4e69df4b521a74e8a83a0", + "target_hash": "a29e72384733737c3930df0171d73bb0af8e04eb118038352dfd749e940e80c4", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4567,14 +4805,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "vi": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "8e08495556b7b97e9d1c015bc9bb4fd71928dd2a679051ae82f6b4a11fc03a2c", + "et": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "fa41e203df9d4eb53220847f4a00a7f64fdf498d7514024cc04cf83a6a86bfe3", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -4584,16 +4822,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -4601,11 +4839,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "zh-CN": { + "lv": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "e40f7bf040bb9014196dc6b8a68457a377178ebb60449653aa1ab14b92661dde", + "target_hash": "c95a760aa8fcda4413a42a8365918343156e8422aca95001004745affee16368", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4635,11 +4873,45 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "zh-TW": { + "sl": { + "source_hash": "bb7a09f5bcaa7c60570c3fbd38f8b409613b9dc686e90fbc01d6e62994a32587", + "target_hash": "f1c51963e92cdbea0767210a30798eb93b427825929542ab18722ae91646863b", + "section_hashes": [ + "c1277b7d865b", + "abbdd5e98a69", + "6edc096c29cc", + "a840b181c39b", + "38de55b17fae", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "19b31df5e2fc", + "a0d409f31279", + "fb69916ce838", + "97e1a33f059f", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "4015f19bbb00", + "4e98cf08812d", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "mt": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "5e6f23821915043e2c2824a8132af46cc05eb5356d5c4bb480c47b0de3095ef8", + "target_hash": "6bc84ab9e34fdf6325d7d628a3deac3a595edcb67be0d8898d2d7ff5daa6741e", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4669,14 +4941,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "el": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "6c96fc052ef82b6826fffc7002a4510dc94378eab25fdca676963a85e3cc50f9", + "ga": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "e251fae99f6624cd586f07040289ea698a759175caef30471167a3fa98471673", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -4686,16 +4958,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -4703,11 +4975,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "hr": { + "kn": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "aca27b76f57f5a554b9331201ca0b201e40599e4f6b56e97b8cf8d7ad61259ed", + "target_hash": "89b4d0c66965a1fa341788c87f3b09d9f685f3f8e80ff8bb33a791b1491e8f6a", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4737,11 +5009,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "sr": { + "ml": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "cde9d6f24f928da06ba69fc25644e0fefe1ab5191e5e1bed1cc85f4a7f8e85f6", + "target_hash": "5961af5025f5251d8abfc5bf180c70fca8b2544aeb2b21c374cb25e0adf3b07c", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4771,11 +5043,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "lt": { + "or": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "a29e72384733737c3930df0171d73bb0af8e04eb118038352dfd749e940e80c4", + "target_hash": "be38a49c75f97d60706ebf10e72a7d9274bd9fd796a46ea0923313eadf1b1d5c", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4805,11 +5077,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "et": { + "pa": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "e31fd118451120a1bb76ff38db0c33362da9840a971cc5126c6830aa76960c71", + "target_hash": "a70966d6d7afc4735c185e86fa67323e01072610c9e05a0c4fa3559a39a1cdf4", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4839,11 +5111,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "lv": { + "ne": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "c95a760aa8fcda4413a42a8365918343156e8422aca95001004745affee16368", + "target_hash": "83cec8a463e6cea4e50ffae47d336cf0b2fd7fff0610119867d959541064c9ac", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4873,25 +5145,25 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "sl": { - "source_hash": "bb7a09f5bcaa7c60570c3fbd38f8b409613b9dc686e90fbc01d6e62994a32587", - "target_hash": "f1c51963e92cdbea0767210a30798eb93b427825929542ab18722ae91646863b", + "si": { + "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", + "target_hash": "7c9a7e3809afec66806f052044203c15a59c0baedb83d06596b95b7b73561f66", "section_hashes": [ - "c1277b7d865b", - "abbdd5e98a69", - "6edc096c29cc", - "a840b181c39b", - "38de55b17fae", + "eec5f6e99e0c", + "98eeb7e39ac2", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", "8c10e8039eb4", "75ab68ccf82b", "f638bedd0265", "1042c61cb3bf", - "19b31df5e2fc", + "a13895047756", "a0d409f31279", "fb69916ce838", - "97e1a33f059f", + "e4e534c3a084", "245f7bda796e", "8777b70d1fc1", "4161451b598b", @@ -4899,7 +5171,7 @@ "6a41ebf320d0", "a9f8c4e16498", "4015f19bbb00", - "4e98cf08812d", + "3aa3eb3bcb0e", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -4907,11 +5179,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "mt": { + "my": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "6bc84ab9e34fdf6325d7d628a3deac3a595edcb67be0d8898d2d7ff5daa6741e", + "target_hash": "cdd6cdd4468cf5fedfe5dee3c0d0026a04348f3d7cd5259c7a03b61394e19e45", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4941,11 +5213,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ga": { + "km": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "0b57def245d3ff899888f73ba61f8102e9db6ec9e6e141dc18d71c6dcca8c269", + "target_hash": "15969548e5f25e506268b3cb830eb0d012240c5f12ad6ba924cf6cfbe7f5595d", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -4975,11 +5247,45 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "kn": { + "ha": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "a0c883b2eb42692b70a298a03b30aba21cba7f8ebf77999796d6c0d4181256d5", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "yo": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "89b4d0c66965a1fa341788c87f3b09d9f685f3f8e80ff8bb33a791b1491e8f6a", + "target_hash": "3f97cf53d78d7704269b10751db023751b37a52fa00ab9ec2e8837eb0770642d", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -5009,11 +5315,11 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "ml": { + "ig": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "5961af5025f5251d8abfc5bf180c70fca8b2544aeb2b21c374cb25e0adf3b07c", + "target_hash": "685177d6ee5f23fae34c431bcce517014a6e157f161d771ebf2c7d1a9a7b29fa", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -5043,11 +5349,45 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, - "or": { + "am": { + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "bc93f4a356cfb42393a22dafc16a2fdc10f2a811fd85ea9a90ebf8ee6f412d32", + "section_hashes": [ + "eec5f6e99e0c", + "fcd558913af8", + "acb167783f73", + "69e6cb4bd690", + "2e11c2cac15b", + "8c10e8039eb4", + "75ab68ccf82b", + "f638bedd0265", + "1042c61cb3bf", + "a13895047756", + "a0d409f31279", + "97db437d213f", + "639e1f809876", + "245f7bda796e", + "8777b70d1fc1", + "4161451b598b", + "358da53cd9f3", + "6a41ebf320d0", + "a9f8c4e16498", + "554390ce7742", + "7f577d55c3fd", + "c7287604504d", + "48b3122c7edf", + "42ad24d52818", + "b9545d32f9f4", + "cda4b8edce13", + "bb365dd60378" + ], + "updated_at": "2026-09-19T04:41:38.614Z" + }, + "uz": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "be38a49c75f97d60706ebf10e72a7d9274bd9fd796a46ea0923313eadf1b1d5c", + "target_hash": "20d04fb1d8c5b93f3003d44f5eeed1b0062d6624e0867be44c361855016ebbb4", "section_hashes": [ "eec5f6e99e0c", "98eeb7e39ac2", @@ -5077,347 +5417,7 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "pa": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "a70966d6d7afc4735c185e86fa67323e01072610c9e05a0c4fa3559a39a1cdf4", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "ne": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "83cec8a463e6cea4e50ffae47d336cf0b2fd7fff0610119867d959541064c9ac", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "si": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "7c9a7e3809afec66806f052044203c15a59c0baedb83d06596b95b7b73561f66", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "my": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "cdd6cdd4468cf5fedfe5dee3c0d0026a04348f3d7cd5259c7a03b61394e19e45", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "km": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "15969548e5f25e506268b3cb830eb0d012240c5f12ad6ba924cf6cfbe7f5595d", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "ha": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "1420c277677b1316e1155861a8712d200fd428b66380485a81bf243dd95d1186", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "yo": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "3f97cf53d78d7704269b10751db023751b37a52fa00ab9ec2e8837eb0770642d", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "ig": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "685177d6ee5f23fae34c431bcce517014a6e157f161d771ebf2c7d1a9a7b29fa", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "am": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "8707f3fc5b3aa6a8585a2c9b96523225ce07bf0c6d6edc7c147ca259feac1fe5", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" - }, - "uz": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "20d04fb1d8c5b93f3003d44f5eeed1b0062d6624e0867be44c361855016ebbb4", - "section_hashes": [ - "eec5f6e99e0c", - "98eeb7e39ac2", - "acb167783f73", - "69e6cb4bd690", - "2e11c2cac15b", - "8c10e8039eb4", - "75ab68ccf82b", - "f638bedd0265", - "1042c61cb3bf", - "a13895047756", - "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", - "245f7bda796e", - "8777b70d1fc1", - "4161451b598b", - "358da53cd9f3", - "6a41ebf320d0", - "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", - "c7287604504d", - "48b3122c7edf", - "42ad24d52818", - "b9545d32f9f4", - "cda4b8edce13", - "bb365dd60378" - ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", @@ -5451,14 +5451,14 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "0a406d88160f7ffd026e1c4b8b8f7afb1cb9a476227067a591628c5bb440f6e2", - "target_hash": "cd8b7cf577d83bfd9dfe50bca5d2874e4e3f0f00ae11a163a7c64408d3e4ac6c", + "source_hash": "458399525821ef741e5b340ca3908f8959f65127f80caffa2a426c7978b9e949", + "target_hash": "4411481de04df09d51bbe4520c930fb3a528deddc690a44dc8204548f2f5665f", "section_hashes": [ "eec5f6e99e0c", - "98eeb7e39ac2", + "fcd558913af8", "acb167783f73", "69e6cb4bd690", "2e11c2cac15b", @@ -5468,16 +5468,16 @@ "1042c61cb3bf", "a13895047756", "a0d409f31279", - "fb69916ce838", - "e4e534c3a084", + "97db437d213f", + "639e1f809876", "245f7bda796e", "8777b70d1fc1", "4161451b598b", "358da53cd9f3", "6a41ebf320d0", "a9f8c4e16498", - "4015f19bbb00", - "3aa3eb3bcb0e", + "554390ce7742", + "7f577d55c3fd", "c7287604504d", "48b3122c7edf", "42ad24d52818", @@ -5485,16 +5485,16 @@ "cda4b8edce13", "bb365dd60378" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "SECURITY.md": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", "locales": { "ar": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "f7866541e7df05dfe5984c75bbecf192451277ac15067843c30b077a3d8970ac", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "ed18c5014a09c89fd35984e14f2b17d1aeaa3567917a3b09658f59ba5832c986", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5504,14 +5504,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "01698cd5978551685fcca4e562ce09ca9259d09cb25a593a0c6863b0d15c57f5", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "599f954c8838c05193689a19da7e03d8861c816aec8276c27d19e6fd71bca4a4", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5521,14 +5521,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "f646875f88dcacae08d2270957396889738e8ba1091610634f1acc48d146dac9", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "9cb9ea7ec0565a44fddba6e0edf06043684cbc9dde24e216559e861465f286ac", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5538,14 +5538,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "d1e56c6ca7f3e50fb069d00f0fe0e599c54f25a06f86e780a15207d88537abf1", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "625904e01c88acfa89781f905f4982d8a751984d3d84672d79a3fdfd98217e69", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5555,14 +5555,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "b32f6a6b6e465e100983e80a088d64da2aca014bf796c6876b7d31aa782ccc33", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "dfd414f7b04d89d3c35ce3b8da2acf29d1b233bfd4fa6c694d43c03a1ac58e2e", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5572,14 +5572,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "45e1359658778cf70aa33a711d9a69afacc2867746ca0bb493fb57414de9a803", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "3f04e8a83210716bb2103c7ae6feea42241894513f4fc475b8e2cca9a4bfe5d2", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5589,14 +5589,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "bdefc9809348f81685f31c62a1c436b4b5e8592f63ceba85d138b02d8074b130", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "04dd819e5965b8c9b4ead679f5b16f122fc168889e6b4fd0846f85de6157d72f", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5606,14 +5606,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "c81a91872517b5bb9b388249a6b135d5bf75403ceefc1b2183d8bfc77f0e0131", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "3c8834d8cdb2856d8cc4e35a1e69a2d50ee2fc7adc56d09abdf5e50240325ac4", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5623,14 +5623,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "3f0ed6a9d136f685182c06c8961aec611aa0dc7cd7242f07f0af4c60cafc4c45", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "1d18b62aec310780335db5f6052d5c9e8fadbbcce6cabe3336f40bb6d89af8be", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5640,14 +5640,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "1436685d0acefd36a7442168624118d1f680acb475fcc6e2e8d657cb7b58a25a", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "810ded79a6ebe395898b83f2455ebd576404726ad94e95f059321e731193740b", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5657,14 +5657,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "c7ae12a5fa1e2f1c3ce602a24ffcaa1ec87aca30983a5e02fdabe696b7854e8d", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "e620ddfccbb9b92f643aee83c860b0cafe8a3e394ca9be3040014ccc4dd40619", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5674,14 +5674,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "64ffeee67e37eb5acb9cc2d718923e5f7ff08365341047c3ff661838078b0f6f", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "0438ba2afd009b8be9f02d1fb1cc89c36515e364e8f49d2b7720375166b24c3d", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5691,14 +5691,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "226b53000b17cafb18556733d472713ea11450827b912e905b28aa66c8ad9b82", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "5486d7dbbe17bb6d8bc284512b8ea854aa4226d195650d37826826a97d2e79e5", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5708,14 +5708,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "e6bd9fb7b1571c44a6e52fc983440871970996a1c2b37a3c4d02dc8f806c202b", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "df52ae08c990522987e4f93a40dd6ba7f050a649f39580289397e5621eff4f92", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5725,14 +5725,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "3d819e746263f84398ce36b916814e1b0354c32c682ee2ce875224c1b5d463a4", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "798c0f7e3fb97935506d2e8020b3c326a0e7d07b52814dea6006d564ef50d903", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5742,14 +5742,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "ae9461f4d02d2b265620e1e62646a7b54a9c21af70ba1de205072703e1fb4cf7", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "abaf3e20040be2120bd36e158aaa47170137f054d8ca26d6d81c30f15dfe3932", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -5759,10 +5759,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5779,7 +5779,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5796,7 +5796,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5813,7 +5813,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5830,7 +5830,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5847,7 +5847,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5864,7 +5864,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5881,7 +5881,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5898,7 +5898,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5915,7 +5915,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5932,7 +5932,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5949,7 +5949,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5966,7 +5966,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -5983,7 +5983,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6000,7 +6000,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6017,7 +6017,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6034,7 +6034,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6051,7 +6051,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6068,7 +6068,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6085,7 +6085,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6102,7 +6102,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6119,7 +6119,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6136,7 +6136,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6153,7 +6153,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6170,7 +6170,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6187,11 +6187,11 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "487ba5e15a683e04beb2b688a03eafb32e01dfb16ec893a6e6c919ed3d27aa04", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "027201b944f6d09b939512a9ae9197f6a02f66c43d5f482f5168a2772ea489db", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6201,14 +6201,14 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "0a0e424d1c60504f4d9032c0fa28c395cf5203b4b3aae5973e45732b34e0d128", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "0338aab3ea318623e34182bed2a66c202b1546f2a4e5c1d0c4c23654283d579b", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6218,10 +6218,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6238,7 +6238,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6255,11 +6255,11 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "a613fab0aebb8af7f5d1537cfd7083573bff4beb7c902d297207bf1ed08dd75c", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "bf383e038c9724c0e26079e545cfbd9ef1b2038e3d72bf35032215c24cd9c31c", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6269,10 +6269,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6289,7 +6289,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6306,7 +6306,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6323,11 +6323,11 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "014ce30b51ba1c9cfb66b258687cd05e77fd3fe73a61e1d9f60c76a762a2fa20", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "1a148cbaf5e1486fac4f9a18c4c7f6b0a3c6fbc650df99232e27f53f5b7a5569", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6337,10 +6337,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6357,7 +6357,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6374,7 +6374,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6391,7 +6391,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6408,7 +6408,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6425,7 +6425,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6442,7 +6442,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6459,7 +6459,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6476,11 +6476,11 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "d46865c056361b58ea8016849469bbd66fef42374be5262230949e1f800e6eec", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "ecfc53478b54cbf63fc329138c3f73e79c926d664b1d77d0c4051349200d7722", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6490,10 +6490,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6510,7 +6510,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6527,11 +6527,11 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "da2b998eb92a5d2b92e18220325968d84f3691b0fc8f248ebeb6d86b7a8688db", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "7e85fd1aebfd5e5faff2d4b7b7618475e6fd97e82638579e1fcda8cc5c3efbf2", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6541,10 +6541,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6561,7 +6561,7 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", @@ -6578,11 +6578,11 @@ "b57d3bc54984", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "a784514e599ce28c194b9f80ad5c1c32e58569974d1915743686732e1bd2df2b", - "target_hash": "760401352040d758510684423f49826c7d2abbaae8a2d7b6dabf5781eede6fcf", + "source_hash": "66fac7b0f9f34ac357594dd3c394616281d5c0cb31ffaf96d2722ea277a3971d", + "target_hash": "bd13796945b00415b5b86c2ac7832f5da631bd0eca067d4de54fd0845e9651a7", "section_hashes": [ "8b7d0d2d9f1b", "53a1fdad5161", @@ -6592,10 +6592,10 @@ "08fab9471813", "a425bf3cea6e", "07ec37c8737a", - "b57d3bc54984", + "62b1ad888029", "9ddd813b41e7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -6612,7 +6612,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6624,7 +6624,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6636,7 +6636,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6648,7 +6648,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6660,7 +6660,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6672,7 +6672,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6684,7 +6684,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6696,7 +6696,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6708,7 +6708,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6720,7 +6720,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6732,7 +6732,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6744,7 +6744,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6756,7 +6756,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6768,7 +6768,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6780,7 +6780,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6792,7 +6792,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6804,7 +6804,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6816,7 +6816,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6828,7 +6828,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6840,7 +6840,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6852,7 +6852,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6864,7 +6864,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6876,7 +6876,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6888,7 +6888,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6900,7 +6900,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6912,7 +6912,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6924,7 +6924,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6936,7 +6936,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6948,7 +6948,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6960,7 +6960,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6972,7 +6972,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6984,7 +6984,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -6996,7 +6996,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7008,7 +7008,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7020,7 +7020,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7032,7 +7032,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7044,7 +7044,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7056,7 +7056,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7068,7 +7068,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7080,7 +7080,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7092,7 +7092,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7104,7 +7104,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7116,7 +7116,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7128,7 +7128,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7140,7 +7140,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7152,7 +7152,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7164,7 +7164,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7176,7 +7176,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7188,7 +7188,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7200,7 +7200,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7212,7 +7212,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7224,7 +7224,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7236,7 +7236,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7248,7 +7248,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7260,7 +7260,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7272,7 +7272,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7284,7 +7284,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7296,7 +7296,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7308,7 +7308,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7320,7 +7320,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7332,7 +7332,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7344,7 +7344,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7356,7 +7356,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7368,7 +7368,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6fe1440747e67daef474f4fd1c869e1a8623cd178641a83a4099085829dbf084", @@ -7380,7 +7380,7 @@ "0ba973060355", "98731b3c0167" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -7400,7 +7400,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7415,7 +7415,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7430,7 +7430,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7445,7 +7445,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7460,7 +7460,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7475,7 +7475,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7490,7 +7490,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7505,7 +7505,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7520,7 +7520,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7535,7 +7535,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7550,7 +7550,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7565,7 +7565,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7580,7 +7580,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7595,7 +7595,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7610,7 +7610,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7625,7 +7625,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7640,7 +7640,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7655,7 +7655,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7670,7 +7670,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7685,7 +7685,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7700,7 +7700,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7715,7 +7715,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7730,7 +7730,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7745,7 +7745,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7760,7 +7760,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7775,7 +7775,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7790,7 +7790,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7805,7 +7805,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7820,7 +7820,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7835,7 +7835,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7850,7 +7850,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7865,7 +7865,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7880,7 +7880,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7895,7 +7895,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7910,7 +7910,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7925,7 +7925,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7940,7 +7940,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7955,7 +7955,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7970,7 +7970,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -7985,7 +7985,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8000,7 +8000,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8015,7 +8015,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8030,7 +8030,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8045,7 +8045,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8060,7 +8060,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8075,7 +8075,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8090,7 +8090,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8105,7 +8105,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8120,7 +8120,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8135,7 +8135,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8150,7 +8150,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8165,7 +8165,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8180,7 +8180,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8195,7 +8195,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8210,7 +8210,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8225,7 +8225,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8240,7 +8240,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8255,7 +8255,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8270,7 +8270,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8285,7 +8285,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8300,7 +8300,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8315,7 +8315,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8330,7 +8330,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8345,7 +8345,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "440546e20dc2217adcab9d68378cc95488e40669400fde7e5d1f13dfafaab1bc", @@ -8360,7 +8360,7 @@ "2f04adfe418d", "7a512a6354a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -8371,391 +8371,391 @@ "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "79e3db0e94bd8d83f22862d75d5d6000fe8920f85c0e1c79b087e7a62b3b99c3", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "8548392668652a2ba7244eba5083c9ab184e99ca3888ea1de33877c6e475d7b3", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "4c4ae7f03dc2e12392b62e42fbe16f473ccc05f0c0a96e579aa5296bacbbc396", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "5c3b759c1858384006379d96d7dd472c73281e0f0cb5b9978e6cea54d4ce32b6", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "1b3e8405530c8e7a1c998e016a50378def928e57eb5ac53b7e7d64ab25a23ab0", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "ca214c9c361cf7e932ac440b2217d76901e82f2678e6942aea2501ca02786605", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "e10def3a85ea677f90914e0002df3322873c2276e6d8a4d33bb329b1789c9784", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "f43f1cee26aad96b849113bee065ed9a67998a678d694f5d616dfe554cccd4b3", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "67a47d4b218f2aae25e42a843b92dcbeacaaf6a7c47ffd73ed9ed311e0b78aaf", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "eeafc9bd96e8b2ff7e616a3a6195c53bfec434e036a046dd32f4b817aa3835d5", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "6bef331a03815e645a3089578d4fe879eb0942739241608856a952b36ee9be16", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "cd34f240765f5c760e6fc66fb6f568ec35ef233ef010c9744aea4835b10d90ef", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "3639226070bf900315b12fea46cf2a467176506bb011ba6122dc96cb51e547f3", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "f66b4d743d753a35327905b961ba626b6784fb5a0a5b70556294bd79099569ef", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "f3621315b7d5b2fbf14c9a07b48630d042d6f894a196ddc5cd4d164bbbbc24a1", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "7940b56f4b52a53e2fa64ce5b419c756dd1a11ec1f6dd6ba129ad4216ec41ba9", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "0efa2b8d7fcf0aae0f15ebe8ded67228dc217fd135bb7f6979e3d69e343e8d96", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "61c31a0576d2a4277d04ef3122b53b223dd9e6378211fbad7be851b6d17cbbdf", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "e92b3c7fe565c5804e7e0b972069f480a059c9628670766bfce26de5bb5afe50", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "b333e46e804abce47d50b65b753754f908a674846f060e60680bea975b086861", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "89898db70a4b1d3a80b4ee5e5dd34dab1b48a98b79e00ee04620365fd8bcf9e8", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "b5d8414a4133a00ec714df97fdbc4ac21699ff7850b4219584e78c2ba6abccd4", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "309b91198208bd369760eacd46ad8f09fe66a5ea27394041b721de2265514641", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "d8aaa2c7a9e239d79f65a9a1a9a0c126f8591dfa9fe0fde4ce64a1e0fa96f3c7", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "4661187b3d63e3af7cb22c79b0e240056ffa78e6fc0dfcfbb0dd5bb1833156f5", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "d4ef9457c3b007650ec4d51403b3e33000cf01ed0bff8ac19e2f249e69705914", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "64faff36b662568d1dc3eea656c9536745cff3d8fb0ef9e4ee81cd5f7ee7fcc5", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "fd83a68b70c78e886be0d293224ce1d0c423e84c5725b2146033b57e94b9ac77", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "29130924c04d9a128e615275b56be03ea3e10a0e7b1e6ff57b57d196582daf4f", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "5aa400753ce968bab20a29203ecf4bd3dd442f62297f246315fef062989611fb", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "a201477116722c53e5afd5e35195396b77e7792516f166d18dc4901ec41ff6d5", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "e9a023e5d19f98751dd953f751490fa0c53658e5c78053b1ccd92e3b5a68dfbd", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "ba1f900fba6ca3c0a7b18f72ed5f410ffa10ecdee78e8e0faab50109e994e00d", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "e5cd7d75dec3299da84dc3cddb592613265a6fa2c3c724da1e8781d4dc63f79d", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "fb97d33971e208b3c6e60036381d79f2d6f60035cd27fab0c3cc2bdd2e325cf8", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "0f3d652c51585144ef2b5b24d30927147c5cf501bcb8f2ec6793ad61c4940c96", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "1c04c94d1e09de4ea2fbd040eb41ccbfbad74a3d27a0d188b32fe2203a608ffd", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "8fc7f4c6e0f08534a0ddabda0222416529b85516aee22b8d5dde31845945ef3d", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "35bbccfbe52f0efca8f11d3651c64c460620a63cb3758ec064a01b7ff49ac561", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "1fc2bab7fa1c8bc8a2cb1ac67f6b076f99e4b224a3ea791618dbedb07b943847", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "84beb42bda41b31762fc61b5243d014871a5d0522d3ee809173b7020e05b2881", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "cfe89aa7e523fb59a84d289187bc8772e739a3b78400951a5e11ea0d0fc93b01", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "ce75bd5e1a347f7af1507a9d9bb8816ad16e9888a329b5cd8268ce2b00997382", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "41f712d08fe5bde39d46f695a0ba3ec9b6ef423aef3c0198e2ea4ed71fad475e", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "8fdf4549190b0c35a3efb6763354230301b8d9786d8d8ec883556d9990e93913", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "bb35e4382e30468ecf4139e90c7e2b76a9a8a845d8c4a0ce4424d4ad4dc6370e", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "6e3c06801b13efd0a0eab210d71a59f83f08ead12032f95a18a68bdb7a352726", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "96f913f3fdc29211bba87859ae6c060b8fc93376881c61afec1d07d497d56e72", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "4a3679f183db84f3c6c7acfcd682f121fb286696fc6c5c4e5751b768c1a23caf", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "683259e1595aa4bc36289654f80c347616ed884fbef6ada7264c11294cac56fe", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "865531ea4296e9fb1021d69f19d4e5ea6114472b7259fb4da3c1793e2a122452", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "e260b06b46861c1eb48b6efef76d248486e14fcfab1b6d906c84612c1bfb9b34", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "31ff679585dc91b04eb1516d28e272eaeb5e871e8395b8ca04667f1b6c499e82", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "b980c4db3d801e91650b2732b6801284d7a403f1790f8ae6ef35674d4c9ae5c4", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "da4cfb7c370173cb3ab42d41b8666ec377f5370acb4a38a00376fa6b7b4e3850", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "388932516b82a05d2927c668be02adf98154c528a563914592dbed218e7ac040", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "3af27ebdb8e5ab2908aa150a3456b259205c598f766934fbe5a81ab54a397937", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "1db4a5f2580006d253e88dc7e6718fedd48c8daa4d5093870a6cca93f2a5a749", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "ce1cf76e54717294ade2572126be95a66c0cbfc930e48f021cc72b5745d99271", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "fc32242d4364744363c728e9241853e60690df7da49090e43d464c033c7c4416", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "f9f1f28f0f4ffdd98568a67305f2ad1ad87dc3e3b3c009b4bdce3fefa93357c5", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "112cc4c59686e927f284267d3ad32dcefc5da0e476b276274f6db913a3c2b228", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "727f1c90657be4e1c47530d84f269a12492b3ce1f4f33ea694829d9397a89cc0", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "ea9649c6fab4c42aa8a297a28a51877715985aac1aaff8cf86f1b33b77d79623", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "8cd564ba6ac1124ffeb9d814aca1f48474abfb4769831d34f6669dc6297f2ee7", "target_hash": "9a1d52a728b26d6eb3e2be5aa424438a9c784d4406a9364d59153d60ae31a4eb", "section_hashes": ["11f1da7d820b"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -8766,391 +8766,391 @@ "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "ae41933cd9cd44ddf8d704e34d59db52501499100f261c9d7b4380a66cb699c1", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "a1d05402f08960df41c73a6dd1ef0cc8602cab949e5c605d485fc1229cf9865a", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "a67788349cabd65f46715d109c915710382caca1e7ed84dd4aaddb919f4e01c6", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "bc041d835fad80e94e724b0980e1be4c48b7486b54419d2d17c4247ecf758849", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "e948fc4d13419c231c63ade14ea6434ec4b44aa8c59bf39ba8739bdeba959191", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "78de947331f7ed86ea192910afe5673fa36b6ac661f5970830b41aaada46bbb0", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "23a083cb6ba709cf66e839643e76ec3aef60269db5f9baa7bb7c1fb6113ec9ca", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "402f6e6a5f66f90595ffd1bf1e8479c27c4d16190ed41c9964844c60b7438c04", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "18f282ef91f52e366d439ae0ef5cf5f361e4de89af5db26796aa69eab5c54cb9", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "593bf0299bd02230fb6f05a2aae824c0adbe947a29623a279b81fe56e873f2e9", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "b1f9c173551f5f873312a93aeaeb371b5d1954fe81be4699ddb2d9b6e0866bf6", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "92d4de97a248da4b0fd13886ee6321f20e266f9e69e6b8dc15643d50aa3cccd8", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "25567a70ad896ebc074ba6971df3f8be286443d694af8078f9710708a8d86071", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "15b822ef5911b95de168e6f78fb262f9945fdbe0054146d54f64ec06951dae22", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "181e4cc120f4466445f212d21c7b50a19b34696e21f2d57ac1aca0cb0a399ad9", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "60c7f1128e1ea920c301211a247ecfd592a930aba747ba37f4ce103d7862ccc0", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "028651f66abf33fd46874e8b8201c8d248731b98b469606d2cfc139c20c2df8c", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "908d463e4f834741c102072da6378ca8e5d38ad70a9fed89bd4185e4aca814f2", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "a8c3e48228b221470e3bb5dd9130a41eec72d894862880976815e51e3d2f94e0", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "12b6517932cf21bbc65c6dc9000e154cd8deef5a647fec6e7b6988ceb9c89f34", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "e8ff7004993f97c8d25446d828298f4b93e0180765ae3c3db33dac59588866b8", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "7d1db61c4e119f96f3cfa047c479e15c91a5f703126c8a9c8ddbd2065ddfa9f0", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "77ed603ea6ecb52924582513f4392a1b8e6f7b73153eeb66049f51f181f113a8", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "94c5fa6cc26e70d1026a0c9c1f99902a5739862a968959f8e45601efe3b9d76f", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "69f5a18242752d8d75d168bf7162224b5ba24501499edde987f6013a63514680", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "97b0a9b8f166cbcf67d36618dcc72794182acd1422656fd5e6c2e4f7e0b503ec", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "b912b6e1b9a28c086af960605ccf65365f5fc9ef5e3b9aa4034695bed68804fe", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "6c16c77ddb93ce7474afb7a173ca2ebef6eded6cd49c23f93a44ad326458cd39", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "b6e01b602f2fd4b7cc0e576eccb76bc86aba56ac88fcdb2a4e39e1c5f27efa05", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "60de6528b5fac5938e8a56ecf7955ff7a21dc2813c5060ca3f2acdb0e808733d", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "f0eb2090f5031b8f7b6b228f1e11ecc95b686f1589a28dff9ddf0e9c1bba8919", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "ea6f7aa0f44c022f5419589e07189aa5317a0b798b490dda90034bb2e7b3d513", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "7f17a9545fb58f8cf0e2efc543a62c63e3ebb76d49d3c06f3ce9cc8095af829b", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "fcad279bbf3afdf8e2192729fae97ee7426043537c5813dc5760e06a002d59ef", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "0d70cf5889b722ea38e84a078a619a7b7ff43bedbaee78bc4dab22e1b9567733", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "5f5df9585a84b50f05079a79c44236326312c1a9f55f22701f2afc885fe76311", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "a68ef55a32802fc4dfbafc77234b045253820a0697428d23902cbc8c350bc833", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "3fa763acc3e532ab844bf1dc9fbcf1f52b831623ed577d9f591b465316f0ef1c", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "97c6d9313dc3aca1bf5320e996128d90edb45f8204e3e8ec66cf698fdb5a4e4d", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "feaef54a1181ccfb19e1ee4712ce7b50dc56de44a3729df96413550cc6499f6c", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "52bd91b2b93750938f4783f70471ff874a00b79d2237be25c4191ac7af89b2d5", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "4bdf44ea9f8406d0d7fc6fdb58fa90e2fee5715b715601e20eebb9c8a2a446d1", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "79b5fb877b232bc737dcbfb9fa28d1a691fe7b24b9a77a77753039242f9f5c63", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "9cd14572a6954e447ee56da1421eabe7608461d1e36a7e6efe087d53b5a64538", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "521336b2d391629e32ce29dd4eeb714a1436b36607486558cae988a12fbf32c4", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "df845805403874b2068e0b8e494d0d48d0503d11331e8bccd61b74a545ec5809", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "f44750167c5cb64c309dc8583e10bc1189ad0c288647f7ae46dfa3fa5369ea56", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "6a31b3bfb5cb5f66c06d4844c71c4dff9729c46ed57046afdc651ee80e577bc9", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "51b69da7fe67a4e9e12d04a21b85669fab04b1945cd3ca67ddf1f0b187cff347", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "bf6e4806ca0babd5fe2fbe9545745aa8fa75a4803e898e9c3988565e98e1cf15", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "771f56e35894d82357a98356a75f59224976b5c343f8cd0e697a2eee34f1fe27", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "2061c7202a4dac8a8b8771e9bdf097e644f63479b999cdcea05134c0c97b759c", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "4cc745d0b323839e36bf2785e8e8479736cdb8da677e660acbf4d3a4a366eecd", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "a7d0fff38fbaac25379f9ad6a591f9de5629a780cd928b7bc25d31a2765a0821", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "682ca4d21f554035fc1baec293d10e3e1c9dd820598b998cbe7163ed864f380c", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "ec24e6815a1234048b1cbbf767129f8146438849cba35ccfa18375be1d14cdf1", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "6593ae10f2d87a5bb6b8547b506f4884dc74f631f3111e640e50909b2b91362f", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "9295e3d105e604879793e70f282ade96da535572c7a6d183eb722dfd489fbf2e", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "00196c38b7b5fa8ddd23d6fe0fd27d99d061dcc1c8004150f42c112055f63725", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "9b88e70ffeab7c26cf0166a96b523db1d2168502e9486ffd3c7b0e4c0733d9d0", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "5be44f3cac11ed8e91e043db12766afdff67e3351d37dd00a9f0518a46297d89", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "ce6250c08f01941095ddda077f39617883028fcb4a1b4401e5440ac76442c9a0", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "48a6514600f5e7c1c119ff25600f8318f5b2d3210e7904650df0a34fe74a4e9f", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "9a8e8c825e1272a696f8221edc1821de54abdd0520635fb5fac67b0833ac6c69", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6fa6e3b466b9a682ef9e9591d03cf4e6c6affc2c02da5d7b7569a142d55a0b43", "target_hash": "59fb69fd137ad6cfc4f0196a05d1c7200ab940b8eee42b6e219abbc07240886b", "section_hashes": ["0eae750fc7c6"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -9161,391 +9161,391 @@ "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "352f7faecef2f9e6c1c0f27b08347cd3799f5b3585f8dffbe534ac33ef3680d2", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "4301a5eeb80d3e86c599ddf0ff092131e3957c4330dfe77a2c3a872d870c79f1", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "922ed13bd5bb51112f5960bd1554cc975ec5ab1e4b6cf197343aeed7822fa2ee", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "b19c85d580e6d599cca93d7675e965378c9b45d4cf61a313915b598d8d8970d9", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "27e33a2b55b2f17e071be42682c22fb4524c36474859476111e6aa23c73b6bc9", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "ec5f34ef3810b27ecb55c9a22797bb4836cc96c680e545020748ddf0a4269cbf", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "51b0d582738c6d065d5bd386e401cd2782640d8fc6e453227397daec0e549eaf", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "050f7cde49d7158fd9f77fdcfec0429afb7b2f1fff2a6cbe00d446ed1e84a155", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "28504055b50f8d9818097dd71cf504f9ea94c3afdf99d244227305b9a509862d", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "3c851d8a2b26aebef99fa905b66a6e0c6e9fe189cd697e3df4f4416e1ff3f102", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "689360baa7f0c1122ee6f6f61a6c1fed963db3b71ba353adeeb5ca1774cde94e", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "963f7bd6bfeba802a11aadcc455cd266e7029a208ebfaf6def3b7e569635564e", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "2a5f531c6beb2e80aaf999bbd5106416115d4e95c761a043b034bc8417c2d199", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "88199d6cee2d602140b442efa9b1bb6af6eb6a5e81df845c394686e94894d401", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "913d7ec74ec419a00155cdbd8ee0d3dff04066198fd48a1b3fd289242b6721df", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "e0c44446519b18107ebe21f11a6ff0a7a54e8ee1780de65ec940225a20eb4c8a", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "1d04f385df05bc9d21cd46a2f73a8c29f295d48d351a420f8ee84c0a7690cfdb", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "bed441c49e9711cf64c1fce3f15dec1548b87b310dc5c312a5c42efbbc589202", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "84cf12f409f0b33bf93b5b17e28a95f39ff8151c3cdb3c8764961ec7488069fa", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "f70b8872c6e09f73cd79d288fc0012d528120653a7c348f3558a7bf36247ac5d", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "43264f311f5ebec37ba4de1be3194cec5d984d7420f6c267f3e42c99ff5df880", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "53d9870db41711cb6dbad457ce47ca9433a6f07d90c13c62823b62067d752b03", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "d582a648bf69fa48c095b8ada62d7cec601372f02bce26d56237d06e82cc5c61", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "c770ab14b97141ff614f38088363d85ccee3ac447e29f28581d16fbb0f5a68a6", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "b1dd80642f8257b9a8680b2e2881a12d8c3e4af2b63766dfc507990ef35cacfa", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "ef40ccc4a9fc0a3441a3c23ad422c024573e12c97848aa2f8561de7c210d1162", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "3208d8348559958a69cf4a3faf08f1ed5cd5f3aac0ef194ae459208bb0481c39", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "3a4556eb3986bcb8827733fa5764b678384cd8c9650ed2d539f1b5c0e4a7dbc1", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "6e05918be7a89ed9f2cf6c2b54ff10e7c085d262e0a9f7d4f7643114ea5e7441", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "114b9e13835f3dd7a6b3f9ece79eb03df424ecd71d4f359f90ec8f26919c0f27", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "99a124bdefddefac827437cf810d6f3ac53796eb0bb2008836ba0ba3fd9f4bca", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "006b84f5c13280f0468192244174c71b390ac10a57e05390afcf95d6fafafaea", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "c137c1179f75cdd62ae226f1688a56be14363db14fc7bf6176eff9cb16948592", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "b4ba4804fa1635fb2b0e8d9c9b8a398862c458bfcf415a0c3d4a41ad45f2fdcd", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "cdac546fb4dfb45bd63cb109c3e6c1f79c81009c5207c030a3311ac2c8c0a358", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "8e2210d5ff040918b11ab42c1d19aeed5574da6da9c0f911d2948e3741bf0188", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "8aa111511ebc46cb15cb3c275ff80dd8caf5493c375cd5b6b627f0d6c8730b35", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "c76f963b5d020bab5da94ad230c0f96eb8238d7dcf2f2530d7f2e70513a4e65a", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "fb47d7a176a053668471682d970e66861d5a1844a9c7f20463ca2e05d2b011ec", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "1f2e92e631d8dcd519888493309409910f24d141b14c53623835af285841543b", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "89a699065373ed0a789fd68eca92f1d53aa86e37456a8839e3804df4f42af6d3", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "26c059e316a8c005d1d758a5168c9d8be6b52417cbe17a156a6bae92ea833bc5", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "502c05b3419cc5652caed346d76747d783eac126980ce4a030960135772ee8c6", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "b94e560d38396ba3d92a886ff85f257939a281dc86c12d5e4be35cfcbcccc1ee", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "1f1567b54d28d30cc8535e20ec805a36dad5cb02f04ba521663a3d041adb3e09", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "d85ace51cfb06af5591fbff70c89adcea4a1846e34285826d4b9eb22b367ac55", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "ebaa67a545afed741fb15006837055c6c4854c0488230877a6f2ca0d93952b18", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "d7ee0234fa5a934347d036fadf359e395d79e6f7eac743dc9def5b913f7324f6", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "61f1022cff8efae257dd06b22dadc3962d677446a31eced60e128079f045b82f", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "04addd3f54d0f59b7ab76aa39c54a6809d0cc2b53f8abfee7434b0b922652b82", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "ea2754bbb244a77d7c4e2245a040fd538f1f344e4162c3eaafbb1df05e6ed645", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "43c0f772d6e79c2f2be6f3c8785bd80fb2f40ca68a67a89ebd7213953866c56f", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "b1997f5de33e1c6dc2b633a3b99a557ef9c4fd5692c80d2e517806c3ee38cfdf", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "7f2adcbb1a5cd6757e3ee0546fb54237f1163d199c68868fc7d444bf648d850e", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "f7c19e68a82dad6fa6a8e2f5c9b6cf551a69ec766e172bd8228a77eae0daac73", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "6dcc80b84d2487a9eee7ee4a704a3699020b66fc4f25021999ebdcb3a2dca3e0", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "f5e5a2e252e263f4a4b15f6b3e0163ff8628766cd7f558f89781ae7a6b7067f7", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "43a6f5934f00ba20f1b5d7d53bd110525cb5e9651c9a868dab5c80b811975330", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "2acaed03865c30730c214da1edd108c618d670ce631451ab48b7a3f5ffe608bc", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "41f5659351e1fab3c32b757b551400d680863b6e254b7a0b15ccf5d369b6c87f", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "b04eb59f3dea6d51c1dcebfebb0c963ba31b67401b7ca3cf99c36b32e48f1a26", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "d0332e54b0b0d124adf847b8db7dfe299d9757ee482d8eff0446545a69e6a194", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "15fe0f4e265cd91bc55b5ab1079aadad57a6a86f66a6c597c88df5ae9ba0c79b", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "c50a7d5340ede3e592d0d47d332121090d56c97f150ce27b448cfd5ed7b8762c", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6a4983441e4d0f21d61de35841d265d96668153938f633650fbf6bee96d473a4", "target_hash": "98cf944cdc87d84f57b0a09cfe90e1a0fc9353b1e3149e42687f1bcc0e9b5fce", "section_hashes": ["010ee2af3ddc", "a553945446f7"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -9556,391 +9556,391 @@ "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "24849d2974243289484141d773280ce06ba2258fb96b461f707c78f7f155f7c1", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "4f9a4e8d3d71a64928150f250ba49940650944a6f3c561604f6ab32d8a5e529b", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "327d9d648db6365bf94366c3a30bd7480e3482735583ca3c74deed9116bf3d9b", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "1ad753de0ea9473c553e9c35f10f84a99d47f3d1a40e6240a0ccc477dbf4022a", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "b4a5ea1339e389bcc152846e566c6125ac71a4a2105b49d314dfb2888247de55", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "f6619a623c35f398c6356b3c70d5024e016aa1a6bbd279db34039808be9f2c91", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "607c37ff527755c9275e91598cb8d4db5f5c8c37b8bfaa0036f5b9159ccc63f2", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "2743874423e0ac9b1a843e0ebc5bc4af19e59749b296336b602c2594686456e9", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "679b88d74f7837f91ad942c11d5ddd30254832b0063cdfad4bb141225f5b04fd", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "7efec5f5213ac3f8c08c72919e13ece56e0663449afeeea217d8035b5ca759d9", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "6d7ae2c84d8efcaac47973b7fe22e95bf74e9dd1e9292d145ac7d6695ff328cc", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "fb89cd4711cde1088f809e6339968cf68b7df133ddccde488c1fa772b45b9f08", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "a1fdace3a9cc480a8c002880ba31c550754b483633918128b53dc1b0342d80e8", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "d9a25ba96c586b0a9ebbe26d03834f9ac89b924a651172bb959847f5c2792ac2", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "49f4a319ad3f109799ec8e20c5f20d66749858cb62ea12443c39472d50b4f84e", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "53c4ff590a2ca81b670336b358baf50982c9bbd0450b83efd540c1680dfebaf6", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "ce86a0e4e435714b6d773d964db757bd8da5f660a40e442ee121bc67d1296430", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "4ff322ed756c137d7778509cfbac8c6f6b00584469188a7e083c4f039ea42401", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "f00664b62805880d667c419e224b3c7cbdaae996da7e7d33cca9cddd2eb2ff61", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "cfb8f67fb088b2af80b133a23cb30c552713f6ec51cb55e660daa0dabdb7ff70", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "0f2d1c03d6857e245dd60ebd4b1ad76f43d146d8eeca2829f745a3e0f0bddc89", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "61f6ac21fbc019583ef44c33c135c14e695ad8da9969c6f4d27316f0698998ae", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "deb07c58376d33daeca65725b4f107a0261071ccbe6c235173323c016fb228b4", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "2d671584978aedfc9cce4a385f87b3f3f46c4ddc67cd97956e3fdccd0d24c0ba", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "350f12ab168dec8c32a09024b4982686867646ca6fa9ff336628f63ddb3a3639", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "d71a8d908936f273aa8b66e2bb74530f9f9574e2b63d879ccf9b942d5c699cd9", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "5e5d5324dc764d74be9bfb8168c9cb7792fd7b4f8d10235153e0eeed105658df", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "013752e4e106939a49f6cac9a837717108b9f364da017726eeadfb5e79321d93", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "2f8b484288991cc9792af82c4ae6aee94ec0da88f58e1d64d6b603f38d3ce882", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "c82d74372cf3921ebe0b107258d391c38d227e61a7488321e19f7d2b65114673", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "c020d51d34bbe2c5203696260b48d3728bd5151ea55ca2554f46a9396a77f34c", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "e7becccad3a1d6c79571495cb60137ef1e3ceb8bc1fca65b7e81d62a4bd8b834", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "c929abf62fd6a48dc8701d2273dff82f6015f30cb91346aa203148ce33b1c5d4", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "fb67d5f1b83635d18c023cf1cf235c866d3ae6c9e1e27bf0847575858b11915c", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "7ee219a911703ef665da662e94567e872ac532f78f65ce1fd3d8909b04664906", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "f3201f6501726334c04396d3323ee31b0f1f4fcf8719299f6523091625716604", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "f3f0d3748b3a8fa2a836178d3e089b63bbb94bf4d423e297f2958c14a7c0cb95", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "5dd941823c820bdc04cf1bad50d9397dd0b64978e62085141609504e6f63c19c", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "1288ceb5d713720284a94a835b89e52ea5482b86579cb1c00d11073e1fbf4bff", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "7fa06e50f8266fe977f811b3c3601a47bb63869dd596c97eebeba437b2913b0b", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "0cf1e5375ff6a1d77eb53040d4637662491761a82ec7ee32b4042505b69ec7c4", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "0b87e87a6ae14a4bcd784abe11ad5f59678678228e77f1eacd53a9ca34dc8957", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "d36a9a773bac83307335266a9e227c9c597585aaed4fc95ef5f0542b76c01060", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "59cd6fdf3f8d902cd90ad727191860d81e012f4579ebb48a50be83b5a1c2d487", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "18c357ec0b2dda67923fe40504be96b49036a0d5bbb982b2c173004af0819b8e", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "11e4b9bd3ba2929f49d21c11f4fb3c008ce0f7263ae41dbe8eb353051e098efa", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "7a7aacaf2febaf030a334340f907d0fb8deb6ca31cc9b136ac9b7790e00a8394", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "36684d6b2df784f8c814532705cc81a8e20e734b5fdcd3cbacfdb6d0987bcfd4", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "4bb3170db5d1c385abe3135f90406123163892d067e9b38e64adb98c7cf5bc25", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "6a6bf90a08bcab88ddb4b2af958f9b44787a00a67d7d6dda3db6422dff889446", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "4950fbef18bc2209870803635ac1fc2299408bdef6e4110234945735b8ab8812", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "c8637303ee1a057e91a0763a5f9a7b8f59e65201a072134337f0727abc354874", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "09a6992c7ddc75e6746b5077f11a6e5729ce59f42f87b9bec2a4d170abc98743", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "b857b1322e3b8bfa104d0e1c66bfbdbff2b53255dc7bebbabc41b32847f13a25", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "f287a11a8c498fade04355923789dcb74c4c2da78b6b05f0e5127e5ce7f3d2e7", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "a27506851a8e4226bfa78e0d9930c73f1ebb56a07857c523247dfd498079d082", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "ad73c68aef51c4b4db29863dd12d420019fe95e9e2f58706d6f461bd7003271b", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "58fdd98fb912979999adbc6e72fe2fd94d21576cbae7a613f945fd237172a765", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "da042764f484bcfec15074b5ecaea8e07a814fc6742b4277ae00eff76737fa93", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "c3b56b7c7b8d033228b838f29da8c6e6e2e8c632080d79c254542132ab9c1348", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "d29886730186333e41572bbff3d9be64257dc65084e64b5322ce505afe5303ea", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "f487ee3147abb576f9e183f535a4cea4f0a24c8b5893c4043963d10c8148ef9f", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "cc5148bda166cb5afa6f351a677c57f21d98033d0ec8135936fd595f8871fc89", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "8135bc0c2810dfb545b7dae18179d0bb7dfdee0f4ebddc776ba4c8f51cc5b52c", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0415e6018749665e40b55a5374340126a793e616c1df2b35a3e9c13464014feb", "target_hash": "65ad651fc657cb51212693c4a5d72f468b8f57a40cf00c3899410a6ab2e34b42", "section_hashes": ["84275b597d7e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -9964,7 +9964,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -9983,7 +9983,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10002,7 +10002,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10021,7 +10021,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10040,7 +10040,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10059,7 +10059,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10078,7 +10078,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10097,7 +10097,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10116,7 +10116,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10135,7 +10135,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10154,7 +10154,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10173,7 +10173,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10192,7 +10192,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10211,7 +10211,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10230,7 +10230,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10249,7 +10249,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10268,7 +10268,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10287,7 +10287,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10306,7 +10306,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10325,7 +10325,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10344,7 +10344,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10363,7 +10363,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10382,7 +10382,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10401,7 +10401,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10420,7 +10420,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10439,7 +10439,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10458,7 +10458,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10477,7 +10477,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10496,7 +10496,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10515,7 +10515,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10534,7 +10534,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10553,7 +10553,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10572,7 +10572,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10591,7 +10591,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10610,7 +10610,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10629,7 +10629,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10648,7 +10648,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10667,7 +10667,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10686,7 +10686,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10705,7 +10705,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10724,7 +10724,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10743,7 +10743,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10762,7 +10762,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10781,7 +10781,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10800,7 +10800,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10819,7 +10819,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10838,7 +10838,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10857,7 +10857,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10876,7 +10876,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10895,7 +10895,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10914,7 +10914,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10933,7 +10933,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10952,7 +10952,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10971,7 +10971,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -10990,7 +10990,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11009,7 +11009,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11028,7 +11028,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11047,7 +11047,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11066,7 +11066,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11085,7 +11085,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11104,7 +11104,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11123,7 +11123,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11142,7 +11142,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11161,7 +11161,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "4e2bb669321a2c6dfba9dc165c00ca185be7e051d56d3119d9c65a869538ae3d", @@ -11180,7 +11180,7 @@ "15e9a542ec1e", "56d0c07efd61" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -11231,7 +11231,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11277,7 +11277,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11323,7 +11323,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11369,7 +11369,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11415,7 +11415,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11461,7 +11461,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11507,7 +11507,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11553,7 +11553,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11599,7 +11599,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11645,7 +11645,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11691,7 +11691,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11737,7 +11737,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11783,7 +11783,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11829,7 +11829,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11875,7 +11875,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11921,7 +11921,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -11967,7 +11967,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12013,7 +12013,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12059,7 +12059,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12105,7 +12105,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12151,7 +12151,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12197,7 +12197,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12243,7 +12243,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12289,7 +12289,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12335,7 +12335,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12381,7 +12381,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12427,7 +12427,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12473,7 +12473,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12519,7 +12519,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12565,7 +12565,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12611,7 +12611,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12657,7 +12657,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12703,7 +12703,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12749,7 +12749,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12795,7 +12795,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12841,7 +12841,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12887,7 +12887,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12933,7 +12933,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -12979,7 +12979,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13025,7 +13025,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13071,7 +13071,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13117,7 +13117,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13163,7 +13163,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13209,7 +13209,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13255,7 +13255,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13301,7 +13301,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13347,7 +13347,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13393,7 +13393,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13439,7 +13439,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13485,7 +13485,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13531,7 +13531,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13577,7 +13577,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13623,7 +13623,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13669,7 +13669,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13715,7 +13715,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13761,7 +13761,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13807,7 +13807,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13853,7 +13853,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13899,7 +13899,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13945,7 +13945,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -13991,7 +13991,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -14037,7 +14037,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -14083,7 +14083,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -14129,7 +14129,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "a565cbb9327394258c0c07d76791724d547262236a6aeab4ea433ebe321b0467", @@ -14175,7 +14175,7 @@ "e9a2c22593a2", "f5e0bf887df9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -14200,7 +14200,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14220,7 +14220,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14240,7 +14240,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14260,7 +14260,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14280,7 +14280,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14300,7 +14300,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14320,7 +14320,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14340,7 +14340,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14360,7 +14360,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14380,7 +14380,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14400,7 +14400,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14420,7 +14420,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14440,7 +14440,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14460,7 +14460,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14480,7 +14480,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14500,7 +14500,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14520,7 +14520,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14540,7 +14540,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14560,7 +14560,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14580,7 +14580,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14600,7 +14600,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14620,7 +14620,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14640,7 +14640,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14660,7 +14660,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14680,7 +14680,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14700,7 +14700,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14720,7 +14720,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14740,7 +14740,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14760,7 +14760,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14780,7 +14780,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14800,7 +14800,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14820,7 +14820,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14840,7 +14840,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14860,7 +14860,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14880,7 +14880,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14900,7 +14900,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14920,7 +14920,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14940,7 +14940,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14960,7 +14960,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -14980,7 +14980,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15000,7 +15000,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15020,7 +15020,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15040,7 +15040,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15060,7 +15060,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15080,7 +15080,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15100,7 +15100,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15120,7 +15120,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15140,7 +15140,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15160,7 +15160,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15180,7 +15180,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15200,7 +15200,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15220,7 +15220,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15240,7 +15240,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15260,7 +15260,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15280,7 +15280,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15300,7 +15300,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15320,7 +15320,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15340,7 +15340,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15360,7 +15360,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15380,7 +15380,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15400,7 +15400,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15420,7 +15420,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15440,7 +15440,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15460,7 +15460,7 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9874b7de47d0a0d09d8de554b91db91b5f11c728919535622d760693abc6b1e3", @@ -15480,22 +15480,22 @@ "de0a19d6715d", "8487c0f8a921" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/architecture/CODEBASE_DOCUMENTATION.md": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", "locales": { "ar": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "9d77663f16a828411f9e80c5163ae47c361ae57e2e3fe6ea92331bae3f0a00de", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "106a4004fe0f27ad615f4bc60adba1bc25242827d0cd3e91effadfb11a01dd19", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15506,17 +15506,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "5c08e0012e9364c4ac8e53f2f70562d4e7be3a31f724d0ce53c739f5234e6f3a", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "7135d82204dff4c0c96e77bad72bd40ba94ab662b0a87ed69619020ee1836f3a", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15527,17 +15527,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "a9ba33700c323b1be409b35aa9f677e594940d843f208e2280ccbc74842c2492", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "eec91991c5763dd63fe3e31e443fa647631e6ac3b1ea8f3df8441782e7718076", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15548,17 +15548,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "347cf1cb6b07f6a604ab9627be76ef447e9e33b513e15472a57d8c4ca795506c", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "6af1df6ff525464b376a52161ee01cbd1f9aefb5f0b4172b42eae46ec0ee7d99", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15569,17 +15569,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "3f7ec2e3b7a349c32b9ed2227048a0aaba348497dbc3d137cff1344bc2cb46e1", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "91f2c8a814f36f856fb58d13aa9df7b0763ec869d4a2555601daddc2b8df92b5", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15590,17 +15590,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "2f88aa8bb3ba432eb2cc6b3e719d7195beb05fc4745291cdcbc0adc4089095f3", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "10cb7b7480ec764f43c649adbd4d0887f2210eb17aead178f8776f76b3bd90b4", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15611,17 +15611,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "f17060d4c586a59dd309f44e462de8ba754dda4d2dbe67e523ff268a15eddd5c", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "91be2eb1862c3000b75b9d3218c50da032d2c7ce61150d4b75ac0ccb7947db23", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15632,17 +15632,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "1ec199920a54810e9d835720d977b056780a8e9b586613a323993df0d7d1db17", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "80150765cbcc8bcd7a360d1714b84d86937384b6242290d06baa5bf5870d0c1c", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15653,17 +15653,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "c67dbc0ef4048c7abea2b0149c8a178b2247081ec15a562a52c07db21831efa5", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "c7f6835de2762f54e4712396492f22f260c4f406f1897a85424686b46c8bf930", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15674,17 +15674,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "c66f1fd2972c8d6c0b7b7f0781bb37ab846fa19a2b5377c3d1cfc1c0a897bdd9", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "bf52c139e82162a4e96c7c4b59afc31f7d920a8cca6f31edddf05201bb073be4", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15695,17 +15695,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "7e0c1a06dcf1509470439833be16778d5720be947fed8e35333e0c005c57aaeb", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "621edffe8d7d8ade06597d96884c219f81a36555b39eeaf7a35bf65957f0bb09", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15716,17 +15716,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "046ad8928b35b0c901c22a7b29964621e709dee0dc832dfce4a3cd66ee4e4ce8", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "56fe8da8a0e0ebe5cedb368ceab262cf59a5ae84c21f722a6bd52a3cf047f70f", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15737,17 +15737,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "7c6e16b28789aa1b3b41ac1660fe5ac0646d94c9fb8e77f517db8bdad45cfee0", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "a2b79dda9b87f48700efd233c8649e708b7fdca20a8b9ecb351888c98554c449", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15758,17 +15758,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "ee6393db2f639b84b1922b0a0f8ea00ddde1449b392874098a704e8f61d21243", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "1848b37d00b63a4fba54a2892dc2b03c23b433a313e05313e5e8e79dd9dcada4", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15779,17 +15779,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "191a6d1245114688c9aa59973abea39caae230b2812e2fa31f034aee7b5edbc8", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "ed4a9fb6a6bffdac64e0d4b9ef79af585a81adcf31fa3b75caee6f13018a5bd2", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15800,17 +15800,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "0dd54cc1ea2c32b9caa757665caee34e28e7073b89a1a543f57719d848c59836", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "f657c93359645128cd9608c746acefebed8e9b2919b9bcf9dbb17d1a7fd0df86", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -15821,7 +15821,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15842,7 +15842,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15863,7 +15863,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15884,7 +15884,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15905,7 +15905,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15926,7 +15926,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15947,7 +15947,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15968,7 +15968,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -15989,7 +15989,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16010,7 +16010,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16031,7 +16031,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16052,7 +16052,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16073,7 +16073,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16094,7 +16094,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16115,7 +16115,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16136,7 +16136,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16157,7 +16157,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16178,7 +16178,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16199,7 +16199,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16220,7 +16220,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16241,7 +16241,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16262,7 +16262,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16283,7 +16283,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16304,7 +16304,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16325,7 +16325,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16346,17 +16346,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "d4d165c41bf255a6862b58df194eb78a79bbb67e231c593cb40f410643c702cd", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "cd42df2b852a51cb2167bacdbaae0e22a30231260b66429cc85af95a0c6aa43d", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16367,17 +16367,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "942a04a568f3affce0a37e48657ff6ff56052470609bc9934d1839f13b3d7183", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "87a8fefd3bf866b176d019a6a7c0d72d6251887e8e8ad53fda351c5f4474f490", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16388,7 +16388,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16409,7 +16409,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16430,17 +16430,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "727116a8b62b6da7c77d06140b1f836fb79045e00910b949d88d0a33a340119b", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "cb9efbbb27a7b1f3af57099c5560fc1959bc1a7a742316c1cdfa1b009cab78ac", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16451,7 +16451,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16472,7 +16472,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16493,7 +16493,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16514,17 +16514,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "558720a522832c3e0386f1e2c8e6a635eef1ababe6ebd4251c2a2f3e068cb29c", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "5b479c672eaeef04b8f82af75ce436ca2bc42cc63809ab09b0470e53b53c8cb5", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16535,7 +16535,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16556,7 +16556,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16577,7 +16577,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16598,7 +16598,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16619,7 +16619,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16640,7 +16640,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16661,7 +16661,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16682,7 +16682,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16703,17 +16703,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "6f8bc8eadf3de5e2e8fb9c3230b5a5c01a76032282725c1ff5a9d83a299c2477", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "4ceb8b3ce15a543fcdfe6ee5393b5c3af239f61a690726e8d1eee652f274cb1e", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16724,7 +16724,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16745,7 +16745,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16766,17 +16766,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "b7e9e8177c3345de1086f4cff1b3cf7c5126f7ca7112bbc71a592bdc6c66e0bf", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "38dbc017ee7517b1191ba80822a578101499bf46f1b476d34fa8178e8820a672", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16787,7 +16787,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16808,7 +16808,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", @@ -16829,17 +16829,17 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "4bf39417abaf277eee6ad55d4c8c934cf7e9190084111818fd0810c7b4d9e466", - "target_hash": "e4ef27a3bfca6e52568408a31dfb4041cd2f9a6142cd4c79acda30f17853248d", + "source_hash": "974aac2e0936294e56987cb3145752e1caa19d10c743dfb99d4253ce48a5c2ef", + "target_hash": "9916ec12160adfa00a71289538515e8f868fde4322bd525f8a30b6afe98bd651", "section_hashes": [ "26c153cd9cc0", "aa3929d4fa86", "aa62c8ec1b70", "64ca5a75ab96", - "f9918b3ea1da", + "2b304873282b", "a1e2d1692282", "b7b95d891013", "152950966765", @@ -16850,7 +16850,7 @@ "bdadf4401c7c", "f231837e6c99" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -16860,7 +16860,7 @@ "pl": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", "target_hash": "9dc80c4a3bbd7eda751dea3ebbff069ba57de54decbd8600146eed9989e61464", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16878,7 +16878,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16896,7 +16896,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16914,7 +16914,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16932,7 +16932,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16950,7 +16950,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16968,7 +16968,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -16986,7 +16986,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17004,7 +17004,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17022,7 +17022,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17040,7 +17040,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17058,7 +17058,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17076,7 +17076,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17094,7 +17094,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17112,7 +17112,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17130,7 +17130,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17148,7 +17148,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17166,7 +17166,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17184,7 +17184,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17202,7 +17202,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17220,7 +17220,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17238,7 +17238,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17256,7 +17256,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17274,7 +17274,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17292,7 +17292,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17310,7 +17310,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17328,7 +17328,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17346,7 +17346,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17364,7 +17364,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17382,7 +17382,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17400,7 +17400,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17418,7 +17418,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17436,7 +17436,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17454,7 +17454,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17472,7 +17472,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17490,7 +17490,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17508,7 +17508,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17526,7 +17526,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17544,7 +17544,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17562,7 +17562,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17580,7 +17580,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17598,7 +17598,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17616,7 +17616,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17634,7 +17634,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17652,7 +17652,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17670,7 +17670,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17688,7 +17688,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17706,7 +17706,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17724,7 +17724,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17742,7 +17742,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17760,7 +17760,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17778,7 +17778,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17796,7 +17796,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17814,7 +17814,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17832,7 +17832,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17850,7 +17850,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17868,7 +17868,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17886,7 +17886,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17904,7 +17904,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17922,7 +17922,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17940,7 +17940,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17958,7 +17958,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17976,7 +17976,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -17994,7 +17994,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "911b4488c619a45208d8d8882243837de750b5f2da1eaf4580411f66bad2c90a", @@ -18012,7 +18012,7 @@ "cc0674b08670", "d956dad6ebe1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -18031,7 +18031,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18045,7 +18045,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18059,7 +18059,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18073,7 +18073,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18087,7 +18087,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18101,7 +18101,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18115,7 +18115,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18129,7 +18129,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18143,7 +18143,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18157,7 +18157,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18171,7 +18171,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18185,7 +18185,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18199,7 +18199,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18213,7 +18213,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18227,7 +18227,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18241,7 +18241,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18255,7 +18255,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18269,7 +18269,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18283,7 +18283,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18297,7 +18297,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18311,7 +18311,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18325,7 +18325,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18339,7 +18339,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18353,7 +18353,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18367,7 +18367,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18381,7 +18381,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18395,7 +18395,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18409,7 +18409,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18423,7 +18423,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18437,7 +18437,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18451,7 +18451,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18465,7 +18465,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18479,7 +18479,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18493,7 +18493,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18507,7 +18507,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18521,7 +18521,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18535,7 +18535,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18549,7 +18549,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18563,7 +18563,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18577,7 +18577,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18591,7 +18591,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18605,7 +18605,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18619,7 +18619,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18633,7 +18633,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18647,7 +18647,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18661,7 +18661,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18675,7 +18675,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18689,7 +18689,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18703,7 +18703,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18717,7 +18717,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18731,7 +18731,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18745,7 +18745,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18759,7 +18759,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18773,7 +18773,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18787,7 +18787,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18801,7 +18801,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18815,7 +18815,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18829,7 +18829,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18843,7 +18843,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18857,7 +18857,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18871,7 +18871,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18885,7 +18885,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18899,7 +18899,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18913,7 +18913,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6fd77dec23610f04069de935de6b5e19dcfe68fc334fdf06f414f93debc92741", @@ -18927,7 +18927,7 @@ "84489153dc0a", "a031a223bfae" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -18951,7 +18951,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -18970,7 +18970,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -18989,7 +18989,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19008,7 +19008,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19027,7 +19027,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19046,7 +19046,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19065,7 +19065,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19084,7 +19084,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19103,7 +19103,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19122,7 +19122,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19141,7 +19141,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19160,7 +19160,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19179,7 +19179,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19198,7 +19198,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19217,7 +19217,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19236,7 +19236,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19255,7 +19255,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19274,7 +19274,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19293,7 +19293,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19312,7 +19312,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19331,7 +19331,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19350,7 +19350,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19369,7 +19369,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19388,7 +19388,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19407,7 +19407,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19426,7 +19426,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19445,7 +19445,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19464,7 +19464,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19483,7 +19483,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19502,7 +19502,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19521,7 +19521,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19540,7 +19540,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19559,7 +19559,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19578,7 +19578,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19597,7 +19597,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19616,7 +19616,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19635,7 +19635,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19654,7 +19654,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19673,7 +19673,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19692,7 +19692,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19711,7 +19711,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19730,7 +19730,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19749,7 +19749,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19768,7 +19768,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19787,7 +19787,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19806,7 +19806,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19825,7 +19825,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19844,7 +19844,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19863,7 +19863,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19882,7 +19882,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19901,7 +19901,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19920,7 +19920,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19939,7 +19939,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19958,7 +19958,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19977,7 +19977,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -19996,7 +19996,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20015,7 +20015,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20034,7 +20034,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20053,7 +20053,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20072,7 +20072,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20091,7 +20091,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20110,7 +20110,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20129,7 +20129,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20148,7 +20148,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6a5ad948c3a62166fa166f8b7c9f1c236ccebf538a861773f0047287b9974acb", @@ -20167,7 +20167,7 @@ "f78b02ca82d4", "00edca0fcda6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -20199,7 +20199,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20226,7 +20226,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20253,7 +20253,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20280,7 +20280,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20307,7 +20307,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20334,7 +20334,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20361,7 +20361,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20388,7 +20388,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20415,7 +20415,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20442,7 +20442,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20469,7 +20469,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20496,7 +20496,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20523,7 +20523,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20550,7 +20550,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20577,7 +20577,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20604,7 +20604,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20631,7 +20631,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20658,7 +20658,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20685,7 +20685,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20712,7 +20712,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20739,7 +20739,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20766,7 +20766,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20793,7 +20793,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20820,7 +20820,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20847,7 +20847,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20874,7 +20874,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20901,7 +20901,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20928,7 +20928,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20955,7 +20955,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -20982,7 +20982,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21009,7 +21009,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21036,7 +21036,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21063,7 +21063,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21090,7 +21090,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21117,7 +21117,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21144,7 +21144,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21171,7 +21171,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21198,7 +21198,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21225,7 +21225,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21252,7 +21252,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21279,7 +21279,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21306,7 +21306,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21333,7 +21333,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21360,7 +21360,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21387,7 +21387,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21414,7 +21414,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21441,7 +21441,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21468,7 +21468,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21495,7 +21495,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21522,7 +21522,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21549,7 +21549,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21576,7 +21576,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21603,7 +21603,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21630,7 +21630,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21657,7 +21657,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21684,7 +21684,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21711,7 +21711,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21738,7 +21738,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21765,7 +21765,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21792,7 +21792,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21819,7 +21819,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21846,7 +21846,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21873,7 +21873,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21900,7 +21900,7 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "c4c42eda70dbf3e8bf15dcc95d829980d836a3664f98fd4990d8598e7bf885d0", @@ -21927,12 +21927,12 @@ "2c14c63f3cb0", "11fc5c5c741c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/architecture/RESILIENCE_GUIDE.md": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", "locales": { "pl": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -21952,18 +21952,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "b36cb292a8af15209722d75b07a9cdb3d36de26a640ab4e43b104c88b1b3e992", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "ba608c7055b37e734626789e75db7930f0f5e68934eb2a5be8ee6c980d42a516", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -21972,18 +21972,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "295db26d525f489af98c19a47072b57def2ebb7d93b67cde3bb8cf9261074916", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "7b3363cb2ebe8e840039fef3dc009d62ad72e16101b07f817f67543ddb2ee729", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -21992,18 +21992,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "6a325a1ab245063c209f3c3db7c24fc1798e053d102b2274fce9bcbf3e076981", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "403ff32dd4d0c10af9f5868c0b6587a61fa53229fe79f74908a9ced444088a66", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22012,18 +22012,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "9700f60e95e496919841974e9cbcc3a09929e43d83752ae46e791df69b990ce5", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "e0e6efdace6a1c8cdb18740081f008cbf7c782806034dc2ba1ded4073fb78f90", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22032,18 +22032,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "098c1a137ab50312c4433374e64633587de061474b1b11aa814e63acd8cb497d", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "79d79250dad3bb5ccd20c06db7de5c1b8965b4bb718f277e564351e58f2f6b72", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22052,18 +22052,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "b0e5a7e7631ce922ea37ad920fdea5e1edbbc2f44f006bc49cd36dddd2859ee4", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "ae5d6c7d8fd694cbc6bbb600308137dd93d64f9aaff6dd237d82bed0bd534490", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22072,18 +22072,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "e5771544531581b3fb622d94974a43a44697078cff578596fbb300401ffad4a5", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "9ff3da6b3b8ccbe4637b46476e7db76958fe1008f9f84db17b38671ad975a83c", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22092,18 +22092,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "4dca94537c900e58ac09bbee56a43b3aa0f728e723801201cef1aea9da979375", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "fc28e2ada7422f54d4f853c12d7f71c5a13d4df8525d205c4f9b97eb33c7d7e0", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22112,18 +22112,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "8e499bf9e61fc4a7674c8ad1c140390fed30d700758d83f0208b15dfeff5e4bb", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "f088af96ead62eddf738708d6bf73bb80875af38f89d00bd0f72a8a7bb80d770", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22132,18 +22132,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "84eb94e8e91a0585d91d4bf1c1447d881bba3bce52e3c64f0eb63d091d746525", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "f07eb68997add224cc99fedfb5739acb9dd0fd7c04128fef9a3571799122e63d", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22152,18 +22152,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "84d31c65123d1e09c3427a7b08aed88afe058bcb371658dee326ac848282f23d", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "d96847476298b84731ff8c1636aa95d60e9090d6dcbe471f20ab81247cb7347d", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22172,18 +22172,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "819e280a5c532fd2d4bd48cafa70cf677a1ad071e502125fb05c930edb684b69", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "5b59e529451577174b8915d1ec775d03526e9353fc0310b589573eb336fed089", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22192,18 +22192,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "07bd169e300674d15bdf83d2e9bd6099d592503d1c34300c4959be051bbcc197", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "f8078c3573a7542358a0215745ef43ad338b422f84bd1c294e1eac42d8759093", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22212,18 +22212,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "e50eaec946d0995c1731dc9d0ee26e2ea07ec60b36ce27bad6e15d94ed400874", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "2f1b72863fba541705b1992651aa0c49dcec01e5663d922eb7724a0b875db1f4", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22232,18 +22232,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "7a5c8667dddae9b16cd84eb18b08d9a1407de05dfb773879ecbc39bfb9569a72", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "09d674a48f6ad882f713754a238be64f12e256e4eceaffa3bfa53d5f18e8c74c", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22252,18 +22252,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "bc32ca928d341e49d47698c739a3467e18ee6f5dfa1cc2f575f312e5881f3617", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "10c492f923736e2131bb5429fd84f0a2badd5d990744fc416ac1470973f9c42e", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22272,18 +22272,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "137347760d242f5953f7c6b6ea666b7a2e1690c5de9c8d308331c3c1664931e1", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "508dfd3661c722061e6251372e19ce4ead4b79624a5f856d4086d35a42b5fa70", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22292,18 +22292,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "69c206461e4aab4acadfa47c225b871e0d0704cfe9790bd7dc6bf1f133ea1dd4", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "babea00965ac9fd5c3425fad9dd9edc1b2a7e3cfb37e0df0811b28940f63d9c0", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22312,18 +22312,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "2487610646b28f1a0a0e34341502947ef956de1dbd748d69c0a09b6e4009cb5d", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "0efeb8dcab197b10dc22c5c6dd37313c7eed3fcc7ebe1f76cab7fdb93784f541", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22332,18 +22332,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "532f35b1b4d7d8f75ffd014ecd1f656ca6db6f4972f80fa85a205c6cbca6848b", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "331df4ae8b8ef3d2b58f8d4dc7ab45cc0ffaff4f02474ca791daa23d48106625", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22352,18 +22352,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "f5e0d8ad290be4b3b72661b3d4047b45a3e7638268b1e2b39139306d218f30f2", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "1b1fb1d3bac45ce2326bddf3812d6cb4d05f7e232180059e136330bc1cd5ee02", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22372,18 +22372,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "c62eef479ea90e9a0310efdbd58596af87c6def1da19fd64e083c432ec3af722", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "b95035a6a2d8840d9b382ef9d5cc0f04c6a295469ee2174b7a8cd646a4ce0e80", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22392,18 +22392,18 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", - "target_hash": "2200384aa8667082904e7a00146d8c6c5809202e596441037380d57e1d630c00", + "source_hash": "1e0a398f8473ed435b20a9f17cc553587125fcf9c9a9252e44b3e28931eb6bb1", + "target_hash": "a426c0cb43e19d3ecae0d78ce3b76eccd2e745453af828e4e8a8fa1218b71552", "section_hashes": [ "15ba7314426c", "ce3fb2647dda", - "9fa52b30e29b", + "95aa5d11702e", "45d160ecfbd9", "5a8870d81eef", - "fe5abcc3dd6a", + "3eb96bd72521", "410c3e43f410", "6875871eef95", "939c16e4ae8b", @@ -22412,7 +22412,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22432,7 +22432,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22452,7 +22452,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22472,7 +22472,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22492,7 +22492,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22512,7 +22512,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22532,7 +22532,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22552,7 +22552,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22572,7 +22572,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22592,7 +22592,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22612,7 +22612,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22632,7 +22632,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22652,7 +22652,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22672,7 +22672,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22692,7 +22692,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22712,7 +22712,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22732,7 +22732,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22752,7 +22752,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22772,7 +22772,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22792,7 +22792,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22812,7 +22812,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22832,7 +22832,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22852,7 +22852,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22872,7 +22872,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22892,7 +22892,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22912,7 +22912,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22932,7 +22932,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22952,7 +22952,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22972,7 +22972,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -22992,7 +22992,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23012,7 +23012,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23032,7 +23032,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23052,7 +23052,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23072,7 +23072,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23092,7 +23092,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23112,7 +23112,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23132,7 +23132,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23152,7 +23152,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23172,7 +23172,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23192,7 +23192,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23212,7 +23212,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "375397fac9c22e5e60174b623ca1243850297b8c97f2c7fbce50099a586b0675", @@ -23232,7 +23232,7 @@ "07e2d767adb6", "c710e1078ad5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -23242,7 +23242,7 @@ "pl": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", "target_hash": "8bf837b12b508520ce83ceec3bba236f1b6c65ecf1bb64b2d62cc8a57fb2d6bf", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23256,7 +23256,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23270,7 +23270,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23284,7 +23284,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23298,7 +23298,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23312,7 +23312,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23326,7 +23326,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23340,7 +23340,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23354,7 +23354,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23368,7 +23368,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23382,7 +23382,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23396,7 +23396,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23410,7 +23410,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23424,7 +23424,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23438,7 +23438,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23452,7 +23452,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23466,7 +23466,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23480,7 +23480,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23494,7 +23494,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23508,7 +23508,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23522,7 +23522,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23536,7 +23536,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23550,7 +23550,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23564,7 +23564,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23578,7 +23578,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23592,7 +23592,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23606,7 +23606,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23620,7 +23620,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23634,7 +23634,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23648,7 +23648,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23662,7 +23662,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23676,7 +23676,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23690,7 +23690,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23704,7 +23704,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23718,7 +23718,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23732,7 +23732,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23746,7 +23746,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23760,7 +23760,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23774,7 +23774,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23788,7 +23788,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23802,7 +23802,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23816,7 +23816,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23830,7 +23830,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23844,7 +23844,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23858,7 +23858,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23872,7 +23872,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23886,7 +23886,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23900,7 +23900,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23914,7 +23914,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23928,7 +23928,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23942,7 +23942,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23956,7 +23956,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23970,7 +23970,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23984,7 +23984,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -23998,7 +23998,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24012,7 +24012,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24026,7 +24026,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24040,7 +24040,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24054,7 +24054,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24068,7 +24068,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24082,7 +24082,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24096,7 +24096,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24110,7 +24110,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24124,7 +24124,7 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "62f7caad8677dc65e86eb57e61db8dcbf0055b45299c318b27967581a28c2106", @@ -24138,334 +24138,334 @@ "11ad4b7fb589", "d66fdc49bc54" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/architecture/admission-lanes.md": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", "locales": { "ar": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "51cae80f22fdd497426cc31211318e949aa18ca32e01fcab78b573e9654d1600", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "02b7f518af85ba7896265420ab546d34aa4b8e9d5523def81cf97ffff72601ea", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "2acf0692bac82e8d50d42e7d5e681ae1be7eec65b4be5447cb92f484de54c543", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "2e3f594b0b7ad2e198341c02edac6396448f812c3954d0f464c1c1dcbbb47005", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "950934cec583183b5dbe03b842f8c3547868a0ec7c1089b0d510d762f51ed34b", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "cccebd5dbc8736cb62e08f6861f042ea875c5f30d22fabfa0260c0a45761c461", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "38f5f9bcd7a167e8ef953075abd5b61fc8550447297bc56c7d27cd14132b1625", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "a5084e602833484a61fdf6d268244a82e5ca69248607fe974af3b479ec9c8cdf", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "0d2ab28acfefdca13a300992bdfd34dbe3844047c931e4332552a490ee3d7059", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "0992bd638d083f792f5e4a8ded110dfb017f6d74030f13b9c4d188e7cb330068", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "218adecac622fce891be0cdace33d1e9858d783c717ef98ddb6fc07fafbf879e", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "0e1f29ff46334603cfffbe65821ae041d4595b3834d2a1febece27f9e265c7fe", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "3918741c93d3bfd942aa99e3dc5c5e7ded4113b2e704a3edb18d37629491c67e", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "dca8b0c1a14c283fd91738407563e68f69a0ce94442b930379fc7fa86aaf1647", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "c5436504a079c19a02814e7191dcae04af6bdac6f3bb18c0b09bd1f38c72efb2", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "491b354ea248317031eb8da8273feba0d79de2ba64bb9fe123b0ad7056e09530", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "7de0dc663278c351267d172fde574228f239d615705b91eac29c493cd7dfbcbb", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "b04c301791789317f6ca8d56f1857385014679e761e7452ce8335cb9ebc3adda", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "6a16000dde3d59c12220e29129bf765d974b902ab1f0e231289f7a9c74cecd26", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "f584e2efca09a2e1ed71c46ed138f79d78014f55ef0f46ad9bc9edd44c322c02", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "5df0b6cd8c8b5f3759c8ce3ac8bf377fe1a8387e78718922b0bc462a3593d52e", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "3c5c5693f17e698ba947c6d905e90acc0f108af21e50596804f01001f7d48c70", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "c815c6565e06b9f54d001a9d33a6e16b5ef3b56f2b8bb1de7aaf6f6adf66d938", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "940cfde2b08bd5c772e2adddc670bca7f7a7968fd24f5f3d93e52c3b6348de26", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "756c38d8b99fe98c75fb980dd6d8f9fb2a62a91f63596c6c7fb7de155725117c", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "2bdc6210b9f9ac59cccbd38d61f5cd4c9a5e6bc4edea773b9803d12acfa9a0dc", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "871d8c0878f24157199cd31f16395e4ad57cb5e0fe4387d5ddf8d236f460128a", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "675d92f47e8978ff5d3280c35c7c66be6af1c1498abfa45d6886ede151f797fd", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "464d7a28a2afdbcac8283e226c8df7d4279a4c49f2a2bfcc5fa9b5b0143e31a6", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "411f42bfc0efa2a57df5c3592c316f04a371144e01e74db3a495972288b65a71", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "27ed210db54d71b3b7792cc5ca714fc953fba2a6e472f663d3fec9baf00e7cfa", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "a7df8b5e7f012a3ea989cc9bc7bc9905feb4ccf0ca49348e86466f55ce75eebb", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "66b133729d2c3a0ec58b8a49f5103a5d38e473d139a41be4a00ef09c2c0d174f", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "03cab82b00860dfb4b8487f91de731034380b97154e887d8313c765d1fea245d", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "09fd631b63c99160902a0fb7360c6f7265e05d283b67f7319ca96d3edbc25af7", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "c63c9f8e7d9237bfd95d3a7f6ef74fb63285482ae4693c973796b6eebb588f0a", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "a547de54b390ef415384e81b45f460fecf8112d8a95f341216d5d3621bbc4f46", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "9352e1d0a76ef6396def7f3e41828f90f7f307c4fdb149208a0bca163ffa75cc", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "558c31d53a0ddf02a6306874548f05075f3a390670ef0542981d01baa2c37267", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "7794da13c54798cf5d19785eb2af0e94b45fa0375f9895befa20934c2ec9b9ba", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "0c02a838f23fe5e35ee75b5a64835032bea677df8500300b161213bef13dbe41", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "a567f1f4ff9d1fca58422dad826b92477c95d902cec3f453279ab4f4f94c0f34", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "673c9f2eee4fcab099783737126f60dc7d7314c21147451e6366c752f6bcc848", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "a8167c47409d3a7be1dc52316937816362322ee71099503b8835e78c37397432", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", - "target_hash": "855dbdbb126c9e8125a59cb5006ae810448adeb6daa41809fe5848f8e30377d3", + "source_hash": "c6a9c72a1c17605dd67b8b8a9d80d04b3352af3e9235880a97775efbcaaaf0a1", + "target_hash": "a35476c3bb89df878267259ce5120c959584590d06fdbe00b55d62ff0a7af905", "section_hashes": [ "349d7c4cca00", - "449753331997", + "42c21f0f23a6", "e4a9bf4b2ffe", "32c4c7cfa0b3", "639db70be38e", "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24479,7 +24479,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24493,7 +24493,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24507,7 +24507,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24521,7 +24521,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24535,7 +24535,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24549,7 +24549,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24563,7 +24563,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24577,7 +24577,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24591,7 +24591,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24605,7 +24605,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24619,7 +24619,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24633,7 +24633,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24647,7 +24647,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24661,7 +24661,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24675,7 +24675,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24689,7 +24689,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24703,7 +24703,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24717,7 +24717,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24731,7 +24731,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24745,7 +24745,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24759,7 +24759,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24773,7 +24773,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24787,7 +24787,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24801,7 +24801,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24815,7 +24815,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24829,7 +24829,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24843,7 +24843,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24857,7 +24857,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24871,7 +24871,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24885,7 +24885,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24899,7 +24899,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24913,7 +24913,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24927,7 +24927,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24941,7 +24941,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24955,7 +24955,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24969,7 +24969,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24983,7 +24983,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -24997,7 +24997,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -25011,7 +25011,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -25025,7 +25025,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -25039,7 +25039,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "06c78ac3dc02f766a716b43e03100b92302529b9e55bf94b819ee334ceade12b", @@ -25053,7 +25053,7 @@ "1d869832da33", "97344075e965" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -25063,7 +25063,7 @@ "pl": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", "target_hash": "302929df77d66358c89b5ad3910a77a70b346a18b937975c09baddacfbd25a05", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25077,7 +25077,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25091,7 +25091,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25105,7 +25105,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25119,7 +25119,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25133,7 +25133,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25147,7 +25147,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25161,7 +25161,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25175,7 +25175,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25189,7 +25189,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25203,7 +25203,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25217,7 +25217,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25231,7 +25231,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25245,7 +25245,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25259,7 +25259,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25273,7 +25273,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25287,7 +25287,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25301,7 +25301,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25315,7 +25315,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25329,7 +25329,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25343,7 +25343,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25357,7 +25357,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25371,7 +25371,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25385,7 +25385,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25399,7 +25399,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25413,7 +25413,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25427,7 +25427,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25441,7 +25441,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25455,7 +25455,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25469,7 +25469,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25483,7 +25483,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25497,7 +25497,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25511,7 +25511,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25525,7 +25525,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25539,7 +25539,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25553,7 +25553,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25567,7 +25567,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25581,7 +25581,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25595,7 +25595,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25609,7 +25609,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25623,7 +25623,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25637,7 +25637,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25651,7 +25651,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25665,7 +25665,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25679,7 +25679,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25693,7 +25693,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25707,7 +25707,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25721,7 +25721,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25735,7 +25735,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25749,7 +25749,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25763,7 +25763,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25777,7 +25777,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25791,7 +25791,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25805,7 +25805,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25819,7 +25819,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25833,7 +25833,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25847,7 +25847,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25861,7 +25861,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25875,7 +25875,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25889,7 +25889,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25903,7 +25903,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25917,7 +25917,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25931,7 +25931,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25945,7 +25945,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "b2e7d6083e4ffc08b95a94df5bf1ed87b819b94fc8a70cc7808a87a82589d27c", @@ -25959,7 +25959,7 @@ "68f4c0dffe08", "cb9f2ed94589" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -25969,7 +25969,7 @@ "pl": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", "target_hash": "0171e8b37aa6c56fabf90eb1863359be3e1add09a309d628b65ae483fe3995df", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -25989,7 +25989,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26009,7 +26009,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26029,7 +26029,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26049,7 +26049,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26069,7 +26069,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26089,7 +26089,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26109,7 +26109,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26129,7 +26129,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26149,7 +26149,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26169,7 +26169,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26189,7 +26189,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26209,7 +26209,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26229,7 +26229,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26249,7 +26249,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26269,7 +26269,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26289,7 +26289,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26309,7 +26309,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26329,7 +26329,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26349,7 +26349,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26369,7 +26369,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26389,7 +26389,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26409,7 +26409,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26429,7 +26429,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26449,7 +26449,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26469,7 +26469,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26489,7 +26489,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26509,7 +26509,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26529,7 +26529,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26549,7 +26549,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26569,7 +26569,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26589,7 +26589,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26609,7 +26609,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26629,7 +26629,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26649,7 +26649,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26669,7 +26669,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26689,7 +26689,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26709,7 +26709,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26729,7 +26729,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26749,7 +26749,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26769,7 +26769,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26789,7 +26789,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26809,7 +26809,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26829,7 +26829,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26849,7 +26849,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26869,7 +26869,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26889,7 +26889,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26909,7 +26909,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26929,7 +26929,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26949,7 +26949,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26969,7 +26969,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -26989,7 +26989,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27009,7 +27009,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27029,7 +27029,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27049,7 +27049,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27069,7 +27069,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27089,7 +27089,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27109,7 +27109,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27129,7 +27129,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27149,7 +27149,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27169,7 +27169,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27189,7 +27189,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27209,7 +27209,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27229,7 +27229,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "82f765990f98f3bca598d75452ff7a3a02a5ddfd1489a74ab9ecd475c9dbc772", @@ -27249,7 +27249,7 @@ "7e65b884f0c8", "dca529342543" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -27266,7 +27266,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27278,7 +27278,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27290,7 +27290,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27302,7 +27302,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27314,7 +27314,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27326,7 +27326,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27338,7 +27338,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27350,7 +27350,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27362,7 +27362,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27374,7 +27374,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27386,7 +27386,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27398,7 +27398,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27410,7 +27410,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27422,7 +27422,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27434,7 +27434,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27446,7 +27446,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27458,7 +27458,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27470,7 +27470,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27482,7 +27482,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27494,7 +27494,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27506,7 +27506,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27518,7 +27518,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27530,7 +27530,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27542,7 +27542,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27554,7 +27554,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27566,7 +27566,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27578,7 +27578,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27590,7 +27590,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27602,7 +27602,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27614,7 +27614,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27626,7 +27626,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27638,7 +27638,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27650,7 +27650,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27662,7 +27662,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27674,7 +27674,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27686,7 +27686,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27698,7 +27698,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27710,7 +27710,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27722,7 +27722,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27734,7 +27734,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27746,7 +27746,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27758,7 +27758,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27770,7 +27770,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27782,7 +27782,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27794,7 +27794,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27806,7 +27806,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27818,7 +27818,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27830,7 +27830,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27842,7 +27842,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27854,7 +27854,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27866,7 +27866,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27878,7 +27878,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27890,7 +27890,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27902,7 +27902,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27914,7 +27914,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27926,7 +27926,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27938,7 +27938,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27950,7 +27950,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27962,7 +27962,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27974,7 +27974,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27986,7 +27986,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -27998,7 +27998,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -28010,7 +28010,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -28022,7 +28022,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "aae288a51e3df2b8a5386bb53711148e0e8783dfdf93ce4e105c87b282e10bc8", @@ -28034,7 +28034,7 @@ "75f2e38ee4db", "8e693a8a3c94" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -28060,7 +28060,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28081,7 +28081,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28102,7 +28102,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28123,7 +28123,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28144,7 +28144,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28165,7 +28165,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28186,7 +28186,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28207,7 +28207,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28228,7 +28228,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28249,7 +28249,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28270,7 +28270,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28291,7 +28291,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28312,7 +28312,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28333,7 +28333,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28354,7 +28354,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28375,7 +28375,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28396,7 +28396,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28417,7 +28417,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28438,7 +28438,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28459,7 +28459,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28480,7 +28480,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28501,7 +28501,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28522,7 +28522,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28543,7 +28543,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28564,7 +28564,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28585,7 +28585,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28606,7 +28606,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28627,7 +28627,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28648,7 +28648,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28669,7 +28669,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28690,7 +28690,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28711,7 +28711,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28732,7 +28732,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28753,7 +28753,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28774,7 +28774,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28795,7 +28795,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28816,7 +28816,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28837,7 +28837,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28858,7 +28858,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28879,7 +28879,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28900,7 +28900,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28921,7 +28921,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28942,7 +28942,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28963,7 +28963,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -28984,7 +28984,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29005,7 +29005,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29026,7 +29026,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29047,7 +29047,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29068,7 +29068,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29089,7 +29089,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29110,7 +29110,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29131,7 +29131,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29152,7 +29152,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29173,7 +29173,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29194,7 +29194,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29215,7 +29215,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29236,7 +29236,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29257,7 +29257,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29278,7 +29278,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29299,7 +29299,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29320,7 +29320,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29341,7 +29341,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29362,7 +29362,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29383,7 +29383,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "de88e4a30f735e8e58a7e175a346b18885ff769aef09a02c9f81384a4b7c5638", @@ -29404,7 +29404,7 @@ "5b792221aa25", "c320591509c9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -29429,7 +29429,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29449,7 +29449,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29469,7 +29469,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29489,7 +29489,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29509,7 +29509,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29529,7 +29529,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29549,7 +29549,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29569,7 +29569,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29589,7 +29589,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29609,7 +29609,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29629,7 +29629,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29649,7 +29649,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29669,7 +29669,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29689,7 +29689,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29709,7 +29709,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29729,7 +29729,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29749,7 +29749,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29769,7 +29769,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29789,7 +29789,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29809,7 +29809,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29829,7 +29829,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29849,7 +29849,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29869,7 +29869,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29889,7 +29889,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29909,7 +29909,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29929,7 +29929,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29949,7 +29949,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29969,7 +29969,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -29989,7 +29989,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30009,7 +30009,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30029,7 +30029,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30049,7 +30049,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30069,7 +30069,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30089,7 +30089,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30109,7 +30109,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30129,7 +30129,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30149,7 +30149,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30169,7 +30169,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30189,7 +30189,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30209,7 +30209,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30229,7 +30229,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30249,7 +30249,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30269,7 +30269,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30289,7 +30289,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30309,7 +30309,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30329,7 +30329,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30349,7 +30349,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30369,7 +30369,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30389,7 +30389,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30409,7 +30409,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30429,7 +30429,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30449,7 +30449,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30469,7 +30469,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30489,7 +30489,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30509,7 +30509,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30529,7 +30529,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30549,7 +30549,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30569,7 +30569,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30589,7 +30589,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30609,7 +30609,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30629,7 +30629,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30649,7 +30649,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30669,7 +30669,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30689,7 +30689,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "14a2b1713d5359da209d4cad7461be0b21b03e5f333a5be518f0d036c6359558", @@ -30709,7 +30709,7 @@ "f8488ea7e911", "1f90083224fc" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -30719,7 +30719,7 @@ "pl": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", "target_hash": "6890e165fef9642d07a0539290c37c367e8791754fef478abaa991d5e8413d46", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30734,7 +30734,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30749,7 +30749,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30764,7 +30764,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30779,7 +30779,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30794,7 +30794,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30809,7 +30809,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30824,7 +30824,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30839,7 +30839,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30854,7 +30854,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30869,7 +30869,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30884,7 +30884,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30899,7 +30899,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30914,7 +30914,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30929,7 +30929,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30944,7 +30944,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30959,7 +30959,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30974,7 +30974,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -30989,7 +30989,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31004,7 +31004,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31019,7 +31019,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31034,7 +31034,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31049,7 +31049,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31064,7 +31064,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31079,7 +31079,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31094,7 +31094,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31109,7 +31109,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31124,7 +31124,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31139,7 +31139,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31154,7 +31154,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31169,7 +31169,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31184,7 +31184,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31199,7 +31199,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31214,7 +31214,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31229,7 +31229,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31244,7 +31244,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31259,7 +31259,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31274,7 +31274,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31289,7 +31289,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31304,7 +31304,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31319,7 +31319,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31334,7 +31334,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31349,7 +31349,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31364,7 +31364,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31379,7 +31379,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31394,7 +31394,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31409,7 +31409,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31424,7 +31424,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31439,7 +31439,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31454,7 +31454,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31469,7 +31469,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31484,7 +31484,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31499,7 +31499,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31514,7 +31514,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31529,7 +31529,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31544,7 +31544,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31559,7 +31559,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31574,7 +31574,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31589,7 +31589,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31604,7 +31604,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31619,7 +31619,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31634,7 +31634,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31649,7 +31649,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31664,7 +31664,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "5a8920f8cffdd9778556e6d34a3b3158737ad4de3756b049ad58c44c671b54fe", @@ -31679,7 +31679,7 @@ "bacefc4db261", "38c7b6aa54aa" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -31689,7 +31689,7 @@ "pl": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", "target_hash": "948f668f138f45a66b0afa9c28406b466eae72a72f573ebadb5b2a373fb3e86e", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31701,7 +31701,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31713,7 +31713,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31725,7 +31725,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31737,7 +31737,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31749,7 +31749,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31761,7 +31761,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31773,7 +31773,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31785,7 +31785,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31797,7 +31797,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31809,7 +31809,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31821,7 +31821,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31833,7 +31833,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31845,7 +31845,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31857,7 +31857,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31869,7 +31869,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31881,7 +31881,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31893,7 +31893,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31905,7 +31905,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31917,7 +31917,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31929,7 +31929,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31941,7 +31941,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31953,7 +31953,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31965,7 +31965,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31977,7 +31977,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -31989,7 +31989,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32001,7 +32001,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32013,7 +32013,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32025,7 +32025,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32037,7 +32037,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32049,7 +32049,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32061,7 +32061,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32073,7 +32073,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32085,7 +32085,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32097,7 +32097,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32109,7 +32109,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32121,7 +32121,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32133,7 +32133,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32145,7 +32145,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32157,7 +32157,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32169,7 +32169,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32181,7 +32181,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32193,7 +32193,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32205,7 +32205,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32217,7 +32217,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32229,7 +32229,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32241,7 +32241,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32253,7 +32253,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32265,7 +32265,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32277,7 +32277,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32289,7 +32289,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32301,7 +32301,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32313,7 +32313,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32325,7 +32325,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32337,7 +32337,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32349,7 +32349,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32361,7 +32361,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32373,7 +32373,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32385,7 +32385,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32397,7 +32397,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32409,7 +32409,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32421,7 +32421,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32433,7 +32433,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32445,7 +32445,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "fcd863fd55fae0163c17289ba1216739f2311a19dd21bf83b9e512ad1179c872", @@ -32457,7 +32457,7 @@ "76ab2a7cda32", "ab6ae78eb1d3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -32467,7 +32467,7 @@ "pl": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", "target_hash": "8d1905e504c106c3701de2c8f1575b035742d827bdca64ef80f606039b820e5f", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32482,7 +32482,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32497,7 +32497,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32512,7 +32512,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32527,7 +32527,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32542,7 +32542,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32557,7 +32557,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32572,7 +32572,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32587,7 +32587,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32602,7 +32602,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32617,7 +32617,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32632,7 +32632,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32647,7 +32647,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32662,7 +32662,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32677,7 +32677,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32692,7 +32692,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32707,7 +32707,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32722,7 +32722,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32737,7 +32737,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32752,7 +32752,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32767,7 +32767,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32782,7 +32782,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32797,7 +32797,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32812,7 +32812,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32827,7 +32827,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32842,7 +32842,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32857,7 +32857,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32872,7 +32872,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32887,7 +32887,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32902,7 +32902,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32917,7 +32917,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32932,7 +32932,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32947,7 +32947,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32962,7 +32962,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32977,7 +32977,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -32992,7 +32992,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33007,7 +33007,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33022,7 +33022,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33037,7 +33037,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33052,7 +33052,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33067,7 +33067,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33082,7 +33082,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33097,7 +33097,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33112,7 +33112,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33127,7 +33127,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33142,7 +33142,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33157,7 +33157,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33172,7 +33172,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33187,7 +33187,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33202,7 +33202,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33217,7 +33217,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33232,7 +33232,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33247,7 +33247,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33262,7 +33262,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33277,7 +33277,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33292,7 +33292,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33307,7 +33307,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33322,7 +33322,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33337,7 +33337,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33352,7 +33352,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33367,7 +33367,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33382,7 +33382,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33397,7 +33397,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33412,7 +33412,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9d2d68507d41f8eac88b7ad2b56949571bbf62e38f5c6ce064069e04b06f08e9", @@ -33427,7 +33427,7 @@ "975e5da49a31", "4a448398f4b0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -33437,7 +33437,7 @@ "pl": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", "target_hash": "3a7b2e0bc83c41c15a0a0397a9ac4efe848579346d88d94f6e44195541b90714", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33453,7 +33453,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33469,7 +33469,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33485,7 +33485,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33501,7 +33501,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33517,7 +33517,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33533,7 +33533,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33549,7 +33549,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33565,7 +33565,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33581,7 +33581,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33597,7 +33597,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33613,7 +33613,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33629,7 +33629,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33645,7 +33645,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33661,7 +33661,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33677,7 +33677,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33693,7 +33693,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33709,7 +33709,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33725,7 +33725,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33741,7 +33741,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33757,7 +33757,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33773,7 +33773,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33789,7 +33789,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33805,7 +33805,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33821,7 +33821,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33837,7 +33837,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33853,7 +33853,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33869,7 +33869,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33885,7 +33885,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33901,7 +33901,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33917,7 +33917,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33933,7 +33933,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33949,7 +33949,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33965,7 +33965,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33981,7 +33981,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -33997,7 +33997,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34013,7 +34013,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34029,7 +34029,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34045,7 +34045,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34061,7 +34061,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34077,7 +34077,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34093,7 +34093,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34109,7 +34109,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34125,7 +34125,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34141,7 +34141,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34157,7 +34157,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34173,7 +34173,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34189,7 +34189,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34205,7 +34205,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34221,7 +34221,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34237,7 +34237,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34253,7 +34253,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34269,7 +34269,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34285,7 +34285,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34301,7 +34301,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34317,7 +34317,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34333,7 +34333,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34349,7 +34349,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34365,7 +34365,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34381,11 +34381,11 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", - "target_hash": "da1868948af5c6e713395441c391c4999b80da73897d0dc52235520a76ae2dbf", + "target_hash": "6e54f953dc86988246b26b2b1e04ac47ff5ca618a2df165fc59a2a0b843a8ae8", "section_hashes": [ "dce12939b182", "9d9fbf269685", @@ -34397,7 +34397,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34413,7 +34413,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34429,7 +34429,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34445,7 +34445,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a86e0a8b88711283623c64d053fadf8959feb198db4504f402d87bf6eb9dbc67", @@ -34461,7 +34461,7 @@ "9c18a09154ae", "d1071fec39fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -34471,7 +34471,7 @@ "pl": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", "target_hash": "b5ac5489f327fdc39433bd7c58a44738445b0be508370c01f07e1fe5da8489fd", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34495,7 +34495,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34519,7 +34519,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34543,7 +34543,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34567,7 +34567,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34591,7 +34591,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34615,7 +34615,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34639,7 +34639,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34663,7 +34663,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34687,7 +34687,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34711,7 +34711,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34735,7 +34735,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34759,7 +34759,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34783,7 +34783,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34807,7 +34807,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34831,7 +34831,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34855,7 +34855,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34879,7 +34879,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34903,7 +34903,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34927,7 +34927,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34951,7 +34951,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34975,7 +34975,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -34999,7 +34999,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35023,7 +35023,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35047,7 +35047,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35071,7 +35071,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35095,7 +35095,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35119,7 +35119,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35143,7 +35143,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35167,7 +35167,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35191,7 +35191,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35215,7 +35215,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35239,7 +35239,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35263,7 +35263,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35287,7 +35287,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35311,7 +35311,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35335,7 +35335,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35359,7 +35359,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35383,7 +35383,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35407,7 +35407,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35431,7 +35431,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35455,7 +35455,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35479,7 +35479,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35503,7 +35503,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35527,7 +35527,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35551,7 +35551,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35575,7 +35575,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35599,7 +35599,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35623,7 +35623,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35647,7 +35647,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35671,7 +35671,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35695,7 +35695,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35719,7 +35719,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35743,7 +35743,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35767,7 +35767,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35791,7 +35791,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35815,7 +35815,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35839,7 +35839,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35863,7 +35863,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35887,11 +35887,11 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", - "target_hash": "706cceaa727a135458c9e696c3ae5d6303689ddd4f6f4fe7e32ed2e46b7eac76", + "target_hash": "26d605312eca0c74a5d56d64fcf582af719cf9bcd2b030b68f8b780e3f53fab6", "section_hashes": [ "e2e09996f22a", "33fa23ae693a", @@ -35911,7 +35911,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35935,7 +35935,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35959,7 +35959,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -35983,7 +35983,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ab00069d9b51d071b2ce0b9ec82c70d94f681333af0add67f3bcf4aed0ca86dd", @@ -36007,7 +36007,7 @@ "0e168864fe85", "8c654c6bc81d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -36031,7 +36031,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36050,7 +36050,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36069,7 +36069,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36088,7 +36088,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36107,7 +36107,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36126,7 +36126,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36145,7 +36145,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36164,7 +36164,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36183,7 +36183,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36202,7 +36202,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36221,7 +36221,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36240,7 +36240,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36259,7 +36259,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36278,7 +36278,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36297,7 +36297,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36316,7 +36316,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36335,7 +36335,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36354,7 +36354,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36373,7 +36373,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36392,7 +36392,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36411,7 +36411,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36430,7 +36430,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36449,7 +36449,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36468,7 +36468,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36487,7 +36487,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36506,7 +36506,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36525,7 +36525,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36544,7 +36544,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36563,7 +36563,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36582,7 +36582,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36601,7 +36601,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36620,7 +36620,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36639,7 +36639,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36658,7 +36658,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36677,7 +36677,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36696,7 +36696,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36715,7 +36715,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36734,7 +36734,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36753,7 +36753,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36772,7 +36772,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36791,7 +36791,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36810,7 +36810,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36829,7 +36829,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36848,7 +36848,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36867,7 +36867,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36886,7 +36886,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36905,7 +36905,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36924,7 +36924,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36943,7 +36943,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36962,7 +36962,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -36981,7 +36981,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37000,7 +37000,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37019,7 +37019,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37038,7 +37038,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37057,7 +37057,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37076,7 +37076,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37095,7 +37095,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37114,7 +37114,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37133,7 +37133,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37152,7 +37152,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37171,7 +37171,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37190,7 +37190,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37209,7 +37209,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37228,7 +37228,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "9c132a2f85f7d809acfc51d38efc7f5c077ad83f3b162f68e0d470c2fcff74c1", @@ -37247,7 +37247,7 @@ "b8f202acbf51", "62984457af2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -37257,7 +37257,7 @@ "pl": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", "target_hash": "3ebaf87a2ac37ba216872697eff77843ec33d55d21e63002089b96d917be8895", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37277,7 +37277,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37297,7 +37297,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37317,7 +37317,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37337,7 +37337,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37357,7 +37357,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37377,7 +37377,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37397,7 +37397,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37417,7 +37417,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37437,7 +37437,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37457,7 +37457,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37477,7 +37477,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37497,7 +37497,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37517,7 +37517,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37537,7 +37537,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37557,7 +37557,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37577,7 +37577,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37597,7 +37597,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37617,7 +37617,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37637,7 +37637,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37657,7 +37657,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37677,7 +37677,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37697,7 +37697,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37717,7 +37717,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37737,7 +37737,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37757,7 +37757,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37777,7 +37777,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37797,7 +37797,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37817,7 +37817,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37837,7 +37837,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37857,7 +37857,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37877,7 +37877,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37897,7 +37897,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37917,7 +37917,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37937,7 +37937,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37957,7 +37957,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37977,7 +37977,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -37997,7 +37997,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38017,7 +38017,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38037,7 +38037,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38057,7 +38057,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38077,7 +38077,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38097,7 +38097,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38117,7 +38117,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38137,7 +38137,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38157,7 +38157,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38177,7 +38177,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38197,7 +38197,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38217,7 +38217,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38237,7 +38237,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38257,7 +38257,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38277,7 +38277,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38297,7 +38297,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38317,7 +38317,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38337,7 +38337,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38357,7 +38357,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38377,7 +38377,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38397,7 +38397,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38417,7 +38417,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38437,11 +38437,11 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", - "target_hash": "b6207ec06c7af12ecb8c0d05eef877042d89ced2574eca8685a721e8ab6cff5e", + "target_hash": "60c7f29364880d2c041b8ac1287883ecdd94473261388d53d3e4a5d2443f772b", "section_hashes": [ "88a39e10fa95", "0721d5804407", @@ -38457,7 +38457,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38477,7 +38477,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38497,7 +38497,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38517,7 +38517,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "80321c623aa3a53bf1afa487d7be94ff9b943694ad07a32550d423478caa3b40", @@ -38537,7 +38537,7 @@ "b15d65873c38", "f8e14ed39ac3" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -38561,7 +38561,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38580,7 +38580,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38599,7 +38599,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38618,7 +38618,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38637,7 +38637,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38656,7 +38656,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38675,7 +38675,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38694,7 +38694,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38713,7 +38713,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38732,7 +38732,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38751,7 +38751,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38770,7 +38770,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38789,7 +38789,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38808,7 +38808,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38827,7 +38827,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38846,7 +38846,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38865,7 +38865,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38884,7 +38884,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38903,7 +38903,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38922,7 +38922,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38941,7 +38941,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38960,7 +38960,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38979,7 +38979,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -38998,7 +38998,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39017,7 +39017,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39036,7 +39036,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39055,7 +39055,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39074,7 +39074,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39093,7 +39093,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39112,7 +39112,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39131,7 +39131,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39150,7 +39150,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39169,7 +39169,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39188,7 +39188,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39207,7 +39207,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39226,7 +39226,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39245,7 +39245,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39264,7 +39264,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39283,7 +39283,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39302,7 +39302,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39321,7 +39321,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39340,7 +39340,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39359,7 +39359,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39378,7 +39378,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39397,7 +39397,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39416,7 +39416,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39435,7 +39435,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39454,7 +39454,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39473,7 +39473,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39492,7 +39492,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39511,7 +39511,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39530,7 +39530,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39549,7 +39549,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39568,7 +39568,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39587,7 +39587,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39606,7 +39606,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39625,7 +39625,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39644,7 +39644,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39663,7 +39663,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39682,7 +39682,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39701,7 +39701,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39720,7 +39720,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39739,7 +39739,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39758,7 +39758,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e79de0d778a47847cb9d91a1b9834f467e82f87ac09625500abb4ae24e97dc76", @@ -39777,7 +39777,7 @@ "13174f7647ce", "a485057194db" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -39798,7 +39798,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39814,7 +39814,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39830,7 +39830,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39846,7 +39846,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39862,7 +39862,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39878,7 +39878,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39894,7 +39894,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39910,7 +39910,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39926,7 +39926,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39942,7 +39942,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39958,7 +39958,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39974,7 +39974,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -39990,7 +39990,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40006,7 +40006,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40022,7 +40022,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40038,7 +40038,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40054,7 +40054,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40070,7 +40070,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40086,7 +40086,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40102,7 +40102,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40118,7 +40118,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40134,7 +40134,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40150,7 +40150,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40166,7 +40166,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40182,7 +40182,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40198,7 +40198,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40214,7 +40214,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40230,7 +40230,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40246,7 +40246,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40262,7 +40262,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40278,7 +40278,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40294,7 +40294,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40310,7 +40310,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40326,7 +40326,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40342,7 +40342,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40358,7 +40358,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40374,7 +40374,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40390,7 +40390,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40406,7 +40406,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40422,7 +40422,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40438,7 +40438,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40454,7 +40454,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40470,7 +40470,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40486,7 +40486,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40502,7 +40502,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40518,7 +40518,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40534,7 +40534,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40550,7 +40550,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40566,7 +40566,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40582,7 +40582,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40598,7 +40598,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40614,7 +40614,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40630,7 +40630,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40646,7 +40646,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40662,7 +40662,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40678,7 +40678,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40694,7 +40694,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40710,7 +40710,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40726,7 +40726,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40742,11 +40742,11 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", - "target_hash": "a4a0791660b77d17a35ab204599d265a442ab70da18a63730977b430713039a5", + "target_hash": "dfd06ced012a4701d89f9e8b3cefe7ebc02ad78cd2cfb693272f5937f3c867ab", "section_hashes": [ "46236e44f648", "1791873058f1", @@ -40758,7 +40758,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40774,7 +40774,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40790,7 +40790,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40806,7 +40806,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0ec91b7de86c9b5ec76c03f3bc7ffef2ff10a56172cb0a55418c66653125e0e0", @@ -40822,7 +40822,7 @@ "f6b430aab8c3", "c72fde4b840b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -40832,7 +40832,7 @@ "pl": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", "target_hash": "90f876da8bcdfb3a2dd3b46cfedb2aeb9523d599b1f446c86d0dc7eaf8763304", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40850,7 +40850,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40868,7 +40868,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40886,7 +40886,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40904,7 +40904,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40922,7 +40922,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40940,7 +40940,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40958,7 +40958,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40976,7 +40976,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -40994,7 +40994,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41012,7 +41012,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41030,7 +41030,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41048,7 +41048,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41066,7 +41066,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41084,7 +41084,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41102,7 +41102,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41120,7 +41120,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41138,7 +41138,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41156,7 +41156,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41174,7 +41174,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41192,7 +41192,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41210,7 +41210,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41228,7 +41228,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41246,7 +41246,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41264,7 +41264,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41282,7 +41282,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41300,7 +41300,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41318,7 +41318,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41336,7 +41336,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41354,7 +41354,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41372,7 +41372,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41390,7 +41390,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41408,7 +41408,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41426,7 +41426,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41444,7 +41444,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41462,7 +41462,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41480,7 +41480,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41498,7 +41498,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41516,7 +41516,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41534,7 +41534,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41552,7 +41552,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41570,7 +41570,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41588,7 +41588,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41606,7 +41606,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41624,7 +41624,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41642,7 +41642,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41660,7 +41660,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41678,7 +41678,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41696,7 +41696,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41714,7 +41714,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41732,7 +41732,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41750,7 +41750,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41768,7 +41768,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41786,7 +41786,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41804,7 +41804,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41822,7 +41822,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41840,7 +41840,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41858,7 +41858,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41876,7 +41876,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41894,7 +41894,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41912,7 +41912,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41930,7 +41930,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41948,7 +41948,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41966,7 +41966,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "583da56119c620ab0375f7081ff85befdff62471cd0afaf4dc4c316332a8b07c", @@ -41984,7 +41984,7 @@ "df09c6a633a1", "69f5b6175dd2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -41994,7 +41994,7 @@ "pl": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", "target_hash": "0f9efd227976ca69b5be7f8cc6fe81a352aea6750bea8a48f4f579e095f735b7", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42015,7 +42015,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42036,7 +42036,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42057,7 +42057,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42078,7 +42078,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42099,7 +42099,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42120,7 +42120,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42141,7 +42141,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42162,7 +42162,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42183,7 +42183,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42204,7 +42204,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42225,7 +42225,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42246,7 +42246,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42267,7 +42267,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42288,7 +42288,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42309,7 +42309,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42330,7 +42330,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42351,7 +42351,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42372,7 +42372,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42393,7 +42393,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42414,7 +42414,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42435,7 +42435,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42456,7 +42456,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42477,7 +42477,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42498,7 +42498,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42519,7 +42519,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42540,7 +42540,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42561,7 +42561,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42582,7 +42582,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42603,7 +42603,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42624,7 +42624,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42645,7 +42645,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42666,7 +42666,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42687,7 +42687,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42708,7 +42708,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42729,7 +42729,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42750,7 +42750,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42771,7 +42771,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42792,7 +42792,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42813,7 +42813,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42834,7 +42834,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42855,7 +42855,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42876,7 +42876,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42897,7 +42897,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42918,7 +42918,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42939,7 +42939,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42960,7 +42960,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -42981,7 +42981,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43002,7 +43002,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43023,7 +43023,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43044,7 +43044,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43065,7 +43065,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43086,7 +43086,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43107,7 +43107,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43128,7 +43128,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43149,7 +43149,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43170,7 +43170,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43191,7 +43191,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43212,7 +43212,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43233,11 +43233,11 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", - "target_hash": "81f6eb4fbe49b13d3bf0f24d63efa849ddfbc2e6c63dd3b8bcd312900fcabd96", + "target_hash": "9fb8a3ee203fe1cf621066b24088bf932ab8f8eaf0d76acb4800594480363fe4", "section_hashes": [ "54ce4f0bbc60", "62035ce1d8b1", @@ -43254,7 +43254,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43275,7 +43275,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43296,7 +43296,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43317,7 +43317,7 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "2d629d7d30d8bd516d604ae118cfb916d4c47fff2e3b2168f9844cf48c349117", @@ -43338,431 +43338,431 @@ "d6258f2bf9c7", "ab88e4f1ac18" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/frameworks/EMBEDDED-SERVICES.md": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", "locales": { "pl": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", "target_hash": "e79a97afbe0ccd357868bf3357b7a574682f9f6e2d9616746205f161a42e924c", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "34d79216ae173f7e24bac27afe23c1100131dd5a850e85f6504973ffa5e05f97", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "5d4a272956e298d05fe94c5f98dd5ca8dad49f832e316b5692c41288166e9e5e", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "99915aadc81880cb6c036c242cc8d448bf99760bf599fa9f7d487a854bcc97c5", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "34202bd8ebeb846e9d5aa9c45df716076c91d682ab553011a49043079c6aab5d", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "34e5b4e6c14206ad42b00cce9c8ce6c6cdeb6e17c4eeb189cef62fb15e8ee2bc", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "8a40d70d2fcc15b8fb20e8462030b4f4e48ca17c878c21d016a68d0eb1fffa7f", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "6dddac9b812e436f67609cfff304d9d9b6dda6c73f3d3cdf8362993ff2eb26e5", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "6f96671c02c997576e656a6d1d473182556a9cb730c9962734532db4a8f97bb4", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "f4e90f2715a76a7285906321d5f991f99048a7a2fd3956f5bc59ab1e57add2e8", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "f2450a99c3a4591d72203f6b8e0a7309d5fbe998f1202a04bb887c957e94218b", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "f7416e53eee40075cef91ae3350e24e3e6e27f2dfd3a261eb1969514dc701730", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "80805534db97ee40b45edb1cf2a18897ab91f6fae0ac8f3af41182e8b9617926", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "dabced715c9bbfe38ea9edafb47775c88e25b263f21eefc86224fe4515adb9d3", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "8bce0b33b757c495a999290ebd6781eafa0fbabdab579a6a16f8c28cd18d2d32", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "c5e4227116b157068ab7a27f5f7e51eb6d680acb582e8490c61eab17925b3216", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "e87c64c6daf8d613639901242ad82f0b22199b146d5adfa0662f07da574f8627", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "7f6343ae4b792d9745805a8ea38de9d5b571d18a52a3ec2661a66f9c70ccc2cd", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "f19ac4c1e94478095032866f40c936950ac84242ccc07e3c3b989b9dfebdbb48", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "feeb7594f04a3b5f5f31dc81869e31e1c94c24089824853691226a868b73ccb6", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "72bad0452727788a81d709cd6d68c02031e61b80b4df8f3c38c925051d596849", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "88452abaeb146a690404c3546fc66874c5311d2dd166f811c8b001ae1cb1df55", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "1ad471ffa1b620ddc667ddb56b705b78da0919b65607de08368ffef89aa6f984", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "ed73599a03091a7dab01f216463000bdfddffd651d87d85e211a7194d0864abc", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "7da5ea29452f86cafbad49953584e6da3055f149ce3535bf896ea8559cfe8d37", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "69015ce6d6b4cb4109356bafa0761e772558650129e6cbc9a3b640242ed52ec4", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "086847ad05386c8c37e824ecea8a54f3ca32e1f0be8bf9abded14cf85c7f81aa", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "e9f70b2a695ed16847438926d4a49edd7a23f980b0d74ea99603704131fb925b", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "969a60ab215a4bc63271b0f1509e2cc67b156a3f307baf77aa74346eb8f54a8b", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "dadf98abb01c5fb093f008a0fcb78b3704b59e774d6aa066980193a5fb66fd11", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "559cf296378abd45ce2e700b7cd2de820bc85f4ab3cf014ba6eff2b859d78a01", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "986b8845611b952185ed13337f9fed36be0496bcb5803f28e6fc8967c67f1f2f", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "7808aa6624903570738d506bb0bcfc4a4e80e99b9db82db066a93b19131b61a7", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "961964757e5069de2058879c4b18f3c82a6831cd14ca83334efacd24fbf952cd", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "b01d2e80df5462f45ed0757a43d442a5774ffb588a09824f8cc2f0888b481bbc", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "3b9da51514e09ea998b72c4a9a8acf4b6a08cfafb3d02db7ccca65a1282ea8f8", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "065ae12bfa67d228bc78550755c9ce3106ce902d477f43e4d4411f979ddc0031", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "ffa324f36feb65b7d0efd893decef0d5c519160789b636e20acf3a92c4e5f588", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "02a063010a25cbc164b2111ec7d3004d130f1a941938cd5ea1eff0f498b375f1", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "2ec1d25ee7ff255bd4a1bee4c5e162c8b3160cbb4c7ec8258946f2041ba2ffae", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "06cbaa4de1c0798465da76912922a4c3cb69d237201692b93da8bf2d44a86445", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "03864378f0ba1eed0d0e2e76d140dc40628828f8055090998603b0e34ab12311", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "79f8df7fefdf318a1e94478a315ef8134ca6d9f63124321fcf3687d65471cf7a", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "47bd95581689d4852a479fb21d0f1257c1f9745d2a3919726146e07339e4cd0b", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "92974ac774512a63e1f5c4a66f128abdf0d4fd80f763499bc6d176471636b449", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", - "target_hash": "b44e83303a635b8012ccb0d7f3f24a5a36fb9a59241cc78e403c4007301a25ef", + "source_hash": "19a2881aa00f2636c5df51fa1f26d87a84adad1ea95fb47d89965549625240a0", + "target_hash": "a906f9337d36507a079c41875dbe8c9ea509cb28467c7db6c10aca859c21a3e6", "section_hashes": [ - "1d98f07310d3", + "01dfe33f13bf", "99e9925aa7fa", - "a257fa698afe", - "fd4c6b855ebd", + "24cca85fea9a", + "4c810134d368", "b3186dce71c2", - "28d4ce26818a", + "b6f5bff0491a", "bef9b42ca9b3", "34440383caf8", "6d6742b4d721", "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43780,7 +43780,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43798,7 +43798,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43816,7 +43816,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43834,7 +43834,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43852,7 +43852,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43870,7 +43870,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43888,7 +43888,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43906,7 +43906,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43924,7 +43924,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43942,7 +43942,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43960,7 +43960,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43978,7 +43978,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -43996,7 +43996,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44014,7 +44014,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44032,7 +44032,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44050,7 +44050,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44068,7 +44068,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44086,7 +44086,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44104,7 +44104,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44122,7 +44122,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44140,7 +44140,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44158,7 +44158,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44176,7 +44176,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44194,7 +44194,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44212,7 +44212,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44230,7 +44230,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44248,7 +44248,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44266,7 +44266,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44284,7 +44284,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44302,7 +44302,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44320,7 +44320,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44338,7 +44338,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44356,7 +44356,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44374,7 +44374,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44392,7 +44392,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44410,7 +44410,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44428,7 +44428,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44446,7 +44446,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44464,7 +44464,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44482,7 +44482,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "55af47d6292d89295a9e1d4d9527b893fe7806bde562e6b11fd60bb626c2645a", @@ -44500,7 +44500,7 @@ "ffa17c5ac309", "b68bf7eedc90" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -44510,7 +44510,7 @@ "pl": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", "target_hash": "a6e1aa14e6f570900e9d1916ca8a1c54d8885bf2986df7325791ae5442fae34e", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44528,7 +44528,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44546,7 +44546,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44564,7 +44564,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44582,7 +44582,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44600,7 +44600,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44618,7 +44618,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44636,7 +44636,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44654,7 +44654,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44672,7 +44672,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44690,7 +44690,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44708,7 +44708,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44726,7 +44726,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44744,7 +44744,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44762,7 +44762,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44780,7 +44780,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44798,7 +44798,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44816,7 +44816,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44834,7 +44834,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44852,7 +44852,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44870,7 +44870,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44888,7 +44888,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44906,7 +44906,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44924,7 +44924,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44942,7 +44942,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44960,7 +44960,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44978,7 +44978,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -44996,7 +44996,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45014,7 +45014,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45032,7 +45032,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45050,7 +45050,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45068,7 +45068,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45086,7 +45086,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45104,7 +45104,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45122,7 +45122,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45140,7 +45140,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45158,7 +45158,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45176,7 +45176,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45194,7 +45194,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45212,7 +45212,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45230,7 +45230,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45248,7 +45248,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45266,7 +45266,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45284,7 +45284,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45302,7 +45302,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45320,7 +45320,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45338,7 +45338,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45356,7 +45356,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45374,7 +45374,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45392,7 +45392,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45410,7 +45410,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45428,7 +45428,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45446,7 +45446,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45464,7 +45464,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45482,7 +45482,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45500,7 +45500,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45518,7 +45518,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45536,7 +45536,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45554,7 +45554,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45572,7 +45572,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45590,7 +45590,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45608,7 +45608,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45626,7 +45626,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45644,7 +45644,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "5f289d55d0335b6751e54c52f185649193a2e1d923d19b0b22a69c2a6742e064", @@ -45662,7 +45662,7 @@ "43ecc9840055", "392de54fa699" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -45695,7 +45695,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45723,7 +45723,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45751,7 +45751,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45779,7 +45779,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45807,7 +45807,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45835,7 +45835,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45863,7 +45863,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45891,7 +45891,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45919,7 +45919,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45947,7 +45947,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -45975,7 +45975,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46003,7 +46003,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46031,7 +46031,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46059,7 +46059,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46087,7 +46087,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46115,7 +46115,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46143,7 +46143,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46171,7 +46171,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46199,7 +46199,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46227,7 +46227,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46255,7 +46255,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46283,7 +46283,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46311,7 +46311,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46339,7 +46339,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46367,7 +46367,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46395,7 +46395,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46423,7 +46423,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46451,7 +46451,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46479,7 +46479,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46507,7 +46507,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46535,7 +46535,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46563,7 +46563,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46591,7 +46591,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46619,7 +46619,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46647,7 +46647,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46675,7 +46675,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46703,7 +46703,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46731,7 +46731,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46759,7 +46759,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46787,7 +46787,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46815,7 +46815,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46843,7 +46843,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46871,7 +46871,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46899,7 +46899,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46927,7 +46927,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46955,7 +46955,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -46983,7 +46983,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47011,7 +47011,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47039,7 +47039,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47067,7 +47067,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47095,7 +47095,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47123,7 +47123,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47151,7 +47151,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47179,7 +47179,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47207,7 +47207,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47235,7 +47235,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47263,7 +47263,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47291,7 +47291,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47319,7 +47319,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47347,11 +47347,11 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", - "target_hash": "edc22ab609a177533003b6fe226aa18057de917b8c8cc59e884991f0790ba559", + "target_hash": "f9170676c0f77302247e19f3d665c6c0c1a45e728775594880a4cc2812585cc7", "section_hashes": [ "328774135833", "426358d60fea", @@ -47375,7 +47375,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47403,7 +47403,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47431,7 +47431,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47459,7 +47459,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e86df45bc47aaecf1cf4d9cd539dbf04a2643e754b3c217097ac287c4da97684", @@ -47487,7 +47487,7 @@ "2fcf669a6c24", "4e1a9c6a0860" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -47497,7 +47497,7 @@ "pl": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", "target_hash": "ff498afa7762ec16b404c99c13986824344cbae6ec248c731e3de0a66487b5da", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47510,7 +47510,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47523,7 +47523,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47536,7 +47536,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47549,7 +47549,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47562,7 +47562,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47575,7 +47575,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47588,7 +47588,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47601,7 +47601,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47614,7 +47614,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47627,7 +47627,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47640,7 +47640,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47653,7 +47653,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47666,7 +47666,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47679,7 +47679,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47692,7 +47692,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47705,7 +47705,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47718,7 +47718,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47731,7 +47731,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47744,7 +47744,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47757,7 +47757,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47770,7 +47770,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47783,7 +47783,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47796,7 +47796,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47809,7 +47809,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47822,7 +47822,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47835,7 +47835,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47848,7 +47848,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47861,7 +47861,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47874,7 +47874,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47887,7 +47887,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47900,7 +47900,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47913,7 +47913,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47926,7 +47926,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47939,7 +47939,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47952,7 +47952,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47965,7 +47965,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47978,7 +47978,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -47991,7 +47991,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48004,7 +48004,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48017,7 +48017,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48030,7 +48030,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48043,7 +48043,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48056,7 +48056,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48069,7 +48069,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48082,7 +48082,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48095,7 +48095,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48108,7 +48108,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48121,7 +48121,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48134,7 +48134,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48147,7 +48147,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48160,7 +48160,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48173,7 +48173,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48186,7 +48186,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48199,7 +48199,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48212,7 +48212,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48225,7 +48225,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48238,7 +48238,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48251,7 +48251,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48264,7 +48264,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48277,7 +48277,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48290,7 +48290,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48303,7 +48303,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48316,7 +48316,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a878e8f648fae9e28b18340c1812cfa587c5d15656ffbcb9dc8c528c694712ca", @@ -48329,7 +48329,7 @@ "e1b48218032e", "117617930abd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -48348,7 +48348,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48362,7 +48362,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48376,7 +48376,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48390,7 +48390,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48404,7 +48404,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48418,7 +48418,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48432,7 +48432,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48446,7 +48446,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48460,7 +48460,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48474,7 +48474,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48488,7 +48488,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48502,7 +48502,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48516,7 +48516,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48530,7 +48530,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48544,7 +48544,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48558,7 +48558,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48572,7 +48572,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48586,7 +48586,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48600,7 +48600,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48614,7 +48614,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48628,7 +48628,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48642,7 +48642,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48656,7 +48656,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48670,7 +48670,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48684,7 +48684,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48698,7 +48698,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48712,7 +48712,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48726,7 +48726,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48740,7 +48740,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48754,7 +48754,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48768,7 +48768,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48782,7 +48782,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48796,7 +48796,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48810,7 +48810,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48824,7 +48824,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48838,7 +48838,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48852,7 +48852,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48866,7 +48866,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48880,7 +48880,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48894,7 +48894,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48908,7 +48908,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48922,7 +48922,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48936,7 +48936,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48950,7 +48950,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48964,7 +48964,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48978,7 +48978,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -48992,7 +48992,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49006,7 +49006,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49020,7 +49020,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49034,7 +49034,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49048,7 +49048,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49062,7 +49062,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49076,7 +49076,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49090,7 +49090,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49104,7 +49104,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49118,7 +49118,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49132,7 +49132,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49146,7 +49146,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49160,7 +49160,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49174,7 +49174,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49188,7 +49188,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49202,7 +49202,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49216,7 +49216,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49230,7 +49230,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "fab37611a2115ee5edbc00da9bc68356b58b0320d27c3cb70e3e68923845144f", @@ -49244,7 +49244,7 @@ "3f1c98e24bcb", "dca1281a49a7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -49278,7 +49278,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49307,7 +49307,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49336,7 +49336,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49365,7 +49365,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49394,7 +49394,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49423,7 +49423,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49452,7 +49452,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49481,7 +49481,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49510,7 +49510,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49539,7 +49539,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49568,7 +49568,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49597,7 +49597,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49626,7 +49626,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49655,7 +49655,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49684,7 +49684,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49713,7 +49713,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49742,7 +49742,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49771,7 +49771,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49800,7 +49800,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49829,7 +49829,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49858,7 +49858,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49887,7 +49887,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49916,7 +49916,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49945,7 +49945,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -49974,7 +49974,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50003,7 +50003,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50032,7 +50032,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50061,7 +50061,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50090,7 +50090,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50119,7 +50119,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50148,7 +50148,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50177,7 +50177,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50206,7 +50206,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50235,7 +50235,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50264,7 +50264,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50293,7 +50293,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50322,7 +50322,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50351,7 +50351,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50380,7 +50380,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50409,7 +50409,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50438,7 +50438,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50467,7 +50467,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50496,7 +50496,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50525,7 +50525,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50554,7 +50554,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50583,7 +50583,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50612,7 +50612,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50641,7 +50641,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50670,7 +50670,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50699,7 +50699,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50728,7 +50728,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50757,7 +50757,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50786,7 +50786,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50815,7 +50815,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50844,7 +50844,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50873,7 +50873,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50902,7 +50902,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50931,7 +50931,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50960,7 +50960,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -50989,7 +50989,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -51018,7 +51018,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -51047,7 +51047,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -51076,7 +51076,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -51105,7 +51105,7 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "8fc7ff2eb64c523d9e106a78a34e87d8317646cf2e30522ccbb6335de3e1f9da", @@ -51134,12 +51134,12 @@ "a130004a15b9", "106955b9a8bd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/frameworks/MEMORY.md": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", "locales": { "pl": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -51171,11 +51171,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "f4366531984be6903be2c0968eda0bcf59ed8cf410fb9883da7191c246600d53", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "b3cc26229db55e07c4bfc6140abc62de5f85bff623f6dde75f05f9ed1bc14158", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51183,7 +51183,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51203,11 +51203,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "0fff044a31fb50f6594418fae265f6ba83ea29c6acb802b34319d43a64f7e599", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "bf1067c90713f14c84a273a44c7cbc74588714cbc22c065da06c7cb1ea16c0c8", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51215,7 +51215,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51235,11 +51235,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "df84a9bee2b71f51045a19ca6f043f225a3f4ab661e29d7eeae07cd6442ab058", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "b72687e24c76a7a3ea3c20034e24078031576f60340e31d857d91df495d9061f", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51247,7 +51247,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51267,11 +51267,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "531220b62c1e03ac063cf259313bed7746bc03e6a01d1069d420b01b3cd4738b", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "a886c703a8742426bd2de4fbfa3fd8472cdfe93ec23f935c1cc9deb973d7d6c3", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51279,7 +51279,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51299,11 +51299,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "9b9fed706ddfea9ba50b581f3d0c09b2690f4b5c87d0e6d98f870a8e71d000e9", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "c531e5128ef28afa4be79e4d7971fd7e4d857c4a30c1ee52fa251a489b9ac10e", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51311,7 +51311,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51331,11 +51331,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "8212fe576829d17adeafb45a168ce87ec7c3441fa878db3dbe6663bcb537eaaa", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "accd403e53e1c049f7daad969603cf0a21477f1830a3a638736ecf8270cff559", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51343,7 +51343,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51363,11 +51363,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "aac6df3d2f85fb4c6843d45443326f0306297c7e980dd5afdce6a047d52b27bd", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "6cc2a0456ef4b6e8e5d58072128e2cdc78fb488a836f33a43e92b10ad05b748e", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51375,7 +51375,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51395,11 +51395,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "2f5cd781ac8ba39f51423a34b1312262af9dc12d593f4f2985139d8e6b2bbfc1", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "72c69880b9193d7c32b2a104e99767d6bfcbd4979a5e58d7e0890567b738167d", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51407,7 +51407,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51427,11 +51427,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "62c8ec7d6f1747544e1bfad4ea8da74bd472ba55193a943744fd4be3e5483241", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "06e93507fa8ef1a11b93bd6637906ddb2515aa99fa9c3aa11c4b0056124cd10b", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51439,7 +51439,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51459,11 +51459,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "272ad4875c22f0128aeda4b64ea07a8512740b814ee60c137dbe53233c819dcd", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "2ea144ee5314d3e1ebff9f4c44bf989c060b1e5b3712a03665a1bc3d2db0aeaa", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51471,7 +51471,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51491,11 +51491,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "e44680847e77ff6b074a42f209c1f9ce93dfd9f5b20d94ac8bf17b6eab6dfe28", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "f4b8a4a90dd732274ba02438c75d7bcd2e1ca2a9d11aeaae811b86464dd62fe4", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51503,7 +51503,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51523,11 +51523,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "5b853b4e7263894a993b9e2695f821ab3d522ebc6071b1411ec14ebd8f006523", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "9b061b8b6e3937f70eefbfd1f253793f05d7cbbdd2ee8202267bd3dcd1b9ec58", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51535,7 +51535,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51555,11 +51555,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "ca118fdfcb1d2ba915f734da8582cf72d4a4f7eb96c679e28c003b20cd73b373", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "7707f53694005a68b20f3259d57c1286d2d52f233634365b5421a6e4a6493f44", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51567,7 +51567,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51587,11 +51587,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "2c35373359b9959466fbbd3528442f38026e293deaaee135bd7326a67be6aaec", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "89a84235626921c9debd47977a389acb9f9f27fced1d1284e51722c1ee8cfea7", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51599,7 +51599,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51619,11 +51619,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "522843d415a13574c846b17d8247277bab0dba0a975798e8ce7c184b9ee6e6b4", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "39a8d7f3b3c5735778fa28f1cb1f68736ad9329aead2cbd72101eab85425bd96", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51631,7 +51631,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51651,11 +51651,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "558d84ebea924455e1bf210e4ba6938ed0a61239a19a7f6c7e120dd19d4a99a1", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "7a06287ce85cd74a33fa8ccba2fd0706789dca9bd964be17932a6e47671e45da", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51663,7 +51663,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51683,11 +51683,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "b8817087760271d06184fbd304688a9bca295b7e8a2fa78924754378ebcac931", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "d08f58c08079210f2cdf2942dd32957ab4c3b6e1abe975f3fe518c21ea051c90", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51695,7 +51695,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51715,11 +51715,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "32c2c828ac208884f3348824edc553f06717718318cca8dc3cb066a5b1652169", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "6803e5d3542f85a45ec50f8ddfdd85ff37df41fcb7f0384596bd9d1abe494180", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51727,7 +51727,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51747,11 +51747,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "93c81aa3b4a127502154432fb5d029ef9eec84e03464a4c761983d42bd1e5afd", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "da9a28612ed386cf835af4c08f9fb1d5eb64a46ebf3d1615aef1f8dba977f942", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51759,7 +51759,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51779,11 +51779,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "5f33dbc826b7a7765f901e3b14f7733e2c5bab2dba353c18554a244862881833", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "42928c4f37269ce98bff1dac67cb2f60354997400c55383284a89a30eaebf25f", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51791,7 +51791,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51811,11 +51811,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "72dbf6adaafdaf472154fb9318b2034aa8f9dcf1671c882f1821a25f850bb9e8", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "20f21bc75fd7a355228a5abc127505750bf29b3e4e813381ee09fa4d9a42530d", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51823,7 +51823,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51843,11 +51843,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "124d3e498a94ef09e3336d93efffc2b7d2254a3f51f8eae536ea3428a442738e", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "a1f639674b35fcd0726e2f65fe384734d15db0a8208236a53da3b41816536780", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51855,7 +51855,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51875,11 +51875,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "ab841576e69c2ca1a56c1f19231c99635fb54f07e94eb4280e0c0aa98b179cdd", + "source_hash": "2817788aa9f196d3b87963859d07c92b4bee4c97c2e9f97af18432ac371c2b4d", + "target_hash": "7048576e43a210d9588afa920b536563cab45572e7f381988ef26a46346b6299", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -51887,7 +51887,7 @@ "bb82d2f0ccce", "d8fbdf93a6b4", "d50d2fcc4b72", - "23644c9a6820", + "69283a7950dd", "1b0279365af9", "ece83d119d2b", "97c66908fbc5", @@ -51907,7 +51907,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -51939,7 +51939,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -51971,7 +51971,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52003,7 +52003,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52035,7 +52035,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52067,7 +52067,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52099,7 +52099,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52131,7 +52131,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52163,7 +52163,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52195,7 +52195,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52227,7 +52227,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52259,7 +52259,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52291,7 +52291,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52323,7 +52323,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52355,7 +52355,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52387,7 +52387,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52419,7 +52419,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52451,7 +52451,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52483,7 +52483,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52515,7 +52515,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52547,7 +52547,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52579,7 +52579,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52611,7 +52611,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52643,7 +52643,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52675,7 +52675,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52707,7 +52707,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52739,7 +52739,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52771,7 +52771,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52803,7 +52803,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52835,7 +52835,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52867,7 +52867,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52899,7 +52899,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52931,7 +52931,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52963,7 +52963,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -52995,7 +52995,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -53027,7 +53027,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -53059,11 +53059,11 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", - "target_hash": "faa09bbfae590f91147d68384a537de24a5042105db6f186be95751b2dcee316", + "target_hash": "da05125ccdc29a07f5e731b521858c9464bec29c47a3ed8c79345c28c8140174", "section_hashes": [ "da5ca1ba5e13", "ffeae614628d", @@ -53091,7 +53091,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -53123,7 +53123,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -53155,7 +53155,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -53187,7 +53187,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "82b355d38f942077a6154f81e71b40fd264fb455635f8b2b2e03371e5b93512d", @@ -53219,7 +53219,7 @@ "edfd46050340", "dee403844efb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -53229,7 +53229,7 @@ "pl": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", "target_hash": "6e9eef7faf4c53380d560a957f0be6b66107235f2c0f22ddd843d3ac6f150931", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53243,7 +53243,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53257,7 +53257,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53271,7 +53271,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53285,7 +53285,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53299,7 +53299,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53313,7 +53313,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53327,7 +53327,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53341,7 +53341,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53355,7 +53355,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53369,7 +53369,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53383,7 +53383,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53397,7 +53397,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53411,7 +53411,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53425,7 +53425,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53439,7 +53439,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53453,7 +53453,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53467,7 +53467,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53481,7 +53481,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53495,7 +53495,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53509,7 +53509,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53523,7 +53523,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53537,7 +53537,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53551,7 +53551,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53565,7 +53565,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53579,7 +53579,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53593,7 +53593,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53607,7 +53607,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53621,7 +53621,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53635,7 +53635,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53649,7 +53649,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53663,7 +53663,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53677,7 +53677,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53691,7 +53691,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53705,7 +53705,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53719,7 +53719,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53733,7 +53733,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53747,7 +53747,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53761,7 +53761,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53775,7 +53775,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53789,7 +53789,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53803,7 +53803,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53817,7 +53817,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53831,7 +53831,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53845,7 +53845,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53859,7 +53859,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53873,7 +53873,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53887,7 +53887,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53901,7 +53901,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53915,7 +53915,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53929,7 +53929,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53943,7 +53943,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53957,7 +53957,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53971,7 +53971,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53985,7 +53985,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -53999,7 +53999,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54013,7 +54013,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54027,7 +54027,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54041,7 +54041,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54055,7 +54055,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54069,7 +54069,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54083,7 +54083,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54097,7 +54097,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54111,7 +54111,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "d8f943bc9b0125c9d959ddb577002891d6a7a119819019990e08981dce06899b", @@ -54125,7 +54125,7 @@ "7713c07e26db", "d5bfa2107cbf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -54135,7 +54135,7 @@ "pl": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", "target_hash": "fbcf22755d31250d43e09b6a566c850a009cb2a5d4179a953bd0279b1f46ff4e", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54149,7 +54149,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54163,7 +54163,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54177,7 +54177,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54191,7 +54191,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54205,7 +54205,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54219,7 +54219,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54233,7 +54233,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54247,7 +54247,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54261,7 +54261,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54275,7 +54275,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54289,7 +54289,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54303,7 +54303,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54317,7 +54317,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54331,7 +54331,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54345,7 +54345,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54359,7 +54359,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54373,7 +54373,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54387,7 +54387,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54401,7 +54401,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54415,7 +54415,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54429,7 +54429,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54443,7 +54443,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54457,7 +54457,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54471,7 +54471,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54485,7 +54485,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54499,7 +54499,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54513,7 +54513,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54527,7 +54527,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54541,7 +54541,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54555,7 +54555,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54569,7 +54569,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54583,7 +54583,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54597,7 +54597,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54611,7 +54611,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54625,7 +54625,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54639,7 +54639,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54653,7 +54653,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54667,7 +54667,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54681,7 +54681,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54695,7 +54695,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54709,7 +54709,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54723,7 +54723,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54737,7 +54737,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54751,7 +54751,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54765,7 +54765,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54779,7 +54779,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54793,7 +54793,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54807,7 +54807,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54821,7 +54821,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54835,7 +54835,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54849,7 +54849,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54863,7 +54863,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54877,7 +54877,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54891,7 +54891,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54905,7 +54905,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54919,7 +54919,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54933,7 +54933,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54947,7 +54947,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54961,7 +54961,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54975,7 +54975,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -54989,7 +54989,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -55003,7 +55003,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -55017,7 +55017,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "80a20416af055577b2fca2469678346c4eb478e747bcafe4b90d4d526dbe0f6b", @@ -55031,7 +55031,7 @@ "bd3284ce64bf", "e11d01773c74" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -55041,7 +55041,7 @@ "pl": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", "target_hash": "98ab603e1b66b166ff2f2cfae90cce573c2b85880132f1c773f01d9efec54ca1", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55057,7 +55057,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55073,7 +55073,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55089,7 +55089,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55105,7 +55105,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55121,7 +55121,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55137,7 +55137,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55153,7 +55153,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55169,7 +55169,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55185,7 +55185,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55201,7 +55201,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55217,7 +55217,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55233,7 +55233,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55249,7 +55249,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55265,7 +55265,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55281,7 +55281,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55297,7 +55297,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55313,7 +55313,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55329,7 +55329,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55345,7 +55345,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55361,7 +55361,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55377,7 +55377,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55393,7 +55393,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55409,7 +55409,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55425,7 +55425,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55441,7 +55441,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55457,7 +55457,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55473,7 +55473,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55489,7 +55489,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55505,7 +55505,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55521,7 +55521,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55537,7 +55537,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55553,7 +55553,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55569,7 +55569,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55585,7 +55585,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55601,7 +55601,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55617,7 +55617,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55633,7 +55633,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55649,7 +55649,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55665,7 +55665,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55681,7 +55681,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55697,7 +55697,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55713,7 +55713,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55729,7 +55729,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55745,7 +55745,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55761,7 +55761,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55777,7 +55777,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55793,7 +55793,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55809,7 +55809,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55825,7 +55825,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55841,7 +55841,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55857,7 +55857,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55873,7 +55873,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55889,7 +55889,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55905,7 +55905,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55921,7 +55921,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55937,7 +55937,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55953,7 +55953,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55969,7 +55969,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -55985,7 +55985,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -56001,7 +56001,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -56017,7 +56017,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -56033,7 +56033,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -56049,7 +56049,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "bde6f6774b0df7509efd52d127ccfb4e521c952aa07aeecb929e025954c1ca65", @@ -56065,7 +56065,7 @@ "c9825236dfe8", "731ca3efba46" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -56074,7 +56074,7 @@ "locales": { "pl": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "9f22382d00274476a218a07ad4833ebfbb481a0402723d9a4c3127dcc6554494", + "target_hash": "994c6b933555b58e89c9b1fd8f8bde03dbe6b972955fad6b4b990f6d3bb6e988", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56090,11 +56090,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "c07469a7058cbf03651682f5581a2e20e10c61ddff059fca19ac471fcd7fbf43", + "target_hash": "5197ab63d1099d6ebe2037deaec1b7015980d3ab7481772b1ad9cb8ba3a901af", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56110,11 +56110,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "61aa36bca2d2618f99c306fc53a306bec4c4f1d1d5c3fd6dd853922e106fe7f9", + "target_hash": "f5d3a974f1609737add6bb2905aa0cd89a85ea2ac0745234121d4e2e77ab7897", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56130,11 +56130,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "1017daeb92e350f5dbef08d377e5773447dde31421cf80ccf91763b9bfa63a30", + "target_hash": "dfa35eca1fadea07f8a243931858a2858199c50a1d6054719230d39b45ed20eb", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56150,11 +56150,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "9334336022639b802dc9f1f4daf00bbbd55b8cadcfbe9db736ddb129e6cc17d4", + "target_hash": "ccebb3bf260ac20a652579d9db982a44ec80a580bab64482e54b45a28a77ef76", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56170,11 +56170,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "ffaf793d64d5447c8d27cfcee865c4fcf445059a13f1cb46df7081574a2e07c2", + "target_hash": "b9e9252edbc9f5c8549568395bddc2bf64bb623268ac887b617e0520d4dfa8f8", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56190,11 +56190,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "e8b51c39264a4ef3a1e1e447103f5dcc22afc88b373eb9120dfcbdefa3a33ae2", + "target_hash": "5c042e3378c7621dac2cdae50539e325763fcacb662daf1336fe490df76f733c", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56210,11 +56210,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "bda50a659c70a3ced3386061ebe02c5edb5697b63a271736979cf4a56832055d", + "target_hash": "cac188aed9bae555ea985e95ae42d5e5558ec0bc284dfa6b184b6a8e88b2c018", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56230,11 +56230,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "305b8f20bd585984f526bd70bd3f22e2618feab23c59c9cb7710eb3bfeddb265", + "target_hash": "a6dd17438bb3bb95b44cdeb385dd6211aecd2d679373953f60a33d5ab4221ad8", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56250,11 +56250,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "b0eee92068526a6fa39a691cf35f921b44727d7c783e97800082eb85d010a332", + "target_hash": "c6d50658769226e62d789d93407a409f4e21271fdb65ead221ce45a347640910", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56270,11 +56270,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "72070b1221065ea7513963a8e52808926b75b296f4b92001eb7c6094a749cfb2", + "target_hash": "24bad9c29cf36cedcaf28007a6819fc7a99cb38dbfca2253842f4e5396f2d85a", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56290,11 +56290,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "2b9c0bbaa47dcd82737747e9dbd67e8388a5d1e081b5bb9c9b2fb1b5f0a9df69", + "target_hash": "9ef157d3d1be97a8afa70aaff7275410edc194fa4228ccff001daa3b08cd190a", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56310,11 +56310,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "f1716d5f330f5074ebe9b895641ec0c14d224f07950ee780e878733c8d1994a4", + "target_hash": "284f18701f3cf92dcc8800767d31ca52014538361ac8e4cc8a3898ce1399b56c", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56330,11 +56330,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "7791711c531b2ded5fa7b3d2bf968b524db08e9063c18c5327e7125c79e91ffc", + "target_hash": "a2c8844ace11eda52dd8282508ab3092c20d30b933ea3d4e248adea595ac9c7e", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56350,11 +56350,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "005ce946c348b434b187b3eff50fbe058544095de4df2e0ab0ea69a0407b0142", + "target_hash": "d27f3273469b9257e70ab21207df4397516f513225ff6a3a6bb578fb230ab908", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56370,11 +56370,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "c6d3387b9d2f3c49ba283ea5a5509a9c61841d368150a03eb4df0a2eec2ae492", + "target_hash": "90ba8af3e9c86ff3e10dd3b5133c9f890e063d1e0b4fdc67ab35e35a1390e36d", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56390,11 +56390,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "d9f5583a1b3a5e164d7b5887c420612176e4027ce2ba874a3d88ebde6ad06d05", + "target_hash": "8425e0221635a2cbc718c28463ca66a734e3f180a99895fbc73c56685c839cea", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56410,11 +56410,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "a3aceb4e6e8955e8d3505fd01bd89a815797bc9f49965e3574d82dab54decdab", + "target_hash": "13b64b8a60e264cc24ef8aeab78617c9593be9a144b2277f13c26aa2f5e707a8", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56430,11 +56430,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "e58af92d3f151442d4c9684aba3780bcb3b523f799b608bb27886f91287957c7", + "target_hash": "31dfb321d554442425eb99d4f59cf9498452179a3f6cc5b09c886423dcf54853", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56450,11 +56450,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "1fa5be5c07b58f18f8310eb2a262e24b077def31401b7b3c658ab6b8ee6e517b", + "target_hash": "b67953ef1d2cc6a07fd5e4f8c83ab04dc7a9284fa122c9daf20570cc7ad63971", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56470,11 +56470,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "937709d28548af380b32dfb8def75a5f0d6c873be27a471f5ce57139bafe25d8", + "target_hash": "02e8c160ea554f2a80c12566adb48be8dbe99f0e23bf95e20cf21f32493bcdb9", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56490,11 +56490,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "bae788c6ffb4855671cd4744dcbf123c215fbb1659c02f6211eaf82fa0164832", + "target_hash": "b9498ba979908cf884c71b5f5a40a3ca4e818d072d81c65d091bc52e7c4ae858", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56510,11 +56510,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "6433d4776f6edfa61858654e7a47b90346de4c3cf1416d1b3ffe01f95252d805", + "target_hash": "6f5dff0b1c1ac0bfcdbbe9183125966cd314d741a72527ef3a0cd6cb1c913784", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56530,11 +56530,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "b7bb54a337b76c50191e8887390129c64b1d3e8d4d68b56e96254fb57a3c5779", + "target_hash": "77b712fdee761be1a32c968b80e03ce2e19c361e648188465c915b8f1c81fe72", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56550,11 +56550,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "badab6d89fc1d6299b36f65aceecfc07ed234e83193f4c17f63119fa4b62b3c7", + "target_hash": "d0608d2987275e937a572d7475617c277cbd7910baa7c12db939447f016e0066", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56570,11 +56570,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "04e8bd3132109ba3a20a65de9c8542cfe0b560abbb85e45dc83819ec36ad39ef", + "target_hash": "e7e78f0365769fc27454e18f5e68dd96fc6e63ec65605d0a41028977bc79ea71", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56590,11 +56590,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "226e10197f5bb112dde3bad375c3af558e261105a3b2d99e8c1620aadfd48d2d", + "target_hash": "47a7e21afa5bbaf84554a21ba2eacc42498c893fce6cb3f04b254f56c23460d8", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56610,11 +56610,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "b8c57026a3b3f6ec0715482dd6b3b0df263ac3e0c3c70f2e404228e3262ba8de", + "target_hash": "61eb0e3c9ba09a96fccbf5e2dba591fd6b96c00dd8b61cdfa84a9240eaf9e579", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56630,11 +56630,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "be2cd901a8a9b5a54a1fbf1fc2a380d472fec7657475a7e8df3aaa15a06d10bc", + "target_hash": "ee279cfb8aa31ce2c5e43f4d91326d584da4e3318c91c0634c01a46854aec159", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56650,11 +56650,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "1e7e9105f46a1b207f72a728173bdc99d4c2e66861e6f692e87620a209c3c97f", + "target_hash": "8aa792c32c5c59708131d5817839198215b87932cca2c6505958b287f3a2bf1f", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56670,11 +56670,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "b705157c17441fc6017c0af1300bd5c77a520b01dcda6d10382eca0ad65d830a", + "target_hash": "8c4cfd2749dc4ce5e90aebcfd1f8a37e8f5145941beae8030dc399418558e525", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56690,11 +56690,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "de375741ec6878277d8530beb15f96478ba2fbf1e11279181594df40849b5350", + "target_hash": "06fe234571c1b2c64c32e0a527ef1f602e9b17bdc1179bcd0624f4c90100d553", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56710,11 +56710,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "edb67eaed29f34346607f8e7f9cf0263ac409f0d035cb178697820e71b87f189", + "target_hash": "82fed2a5fc0c1e29c456c9628391ff8cbb886aeb0e83d87d43557283e6ea10a3", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56730,11 +56730,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "27320a429ada68decc56d2ead98101c791cea72a22734a9833d3dfa12661e0bf", + "target_hash": "ae023122ba6c41834c75397e1d2a7df89711f456c08d83137ad581157d737483", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56750,11 +56750,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "6f3590e511c99ad47fcbad34fe679b8e4fca798e6aad9b199be317e93afb2a33", + "target_hash": "bf66127687ab3da513f303d61d10e3bf40c5e3ee92f4e66cfff18cef5f2b6fa8", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56770,11 +56770,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "df474872f803cb8b2d02aac7ff76ea0d2f98b174458392bfdb7d26cd9ec0e17e", + "target_hash": "d39d79b935910513f40e5df3b3c075aaf678c29ac17f0301eb0812366fd095b3", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56790,11 +56790,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "6da0fc447fc56acad4a719a0290d1833b881651ff880f4c951980d3f399bba5f", + "target_hash": "a0e93a0b309db364eeb7aedb99ca02c5b625c4b3eb9e47e448aabe5b183c6b0a", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56810,11 +56810,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "0912c2e66521f0fff3aa94923b0889402f6bcecb355105c839a9bfd19d43fec6", + "target_hash": "5d966017f5e3bcca398b59929eaa679bc7846b826a2ff866eb41aba31c7cf716", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56830,11 +56830,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "46b067a3268f5f23eaf6f4780feb6d78ff81215509ba2a29d7817a06f0f88efc", + "target_hash": "b89bbd2a40a51787f1d12910f4747d0217c160c65ff55d64c222e6add393bafa", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56850,11 +56850,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "4828029426e19946303e1cc23afb7516a64fcd2a1f8e765ff512ff5d5acb9cce", + "target_hash": "84bfd788fe36b09673e1dc60ece4d43fecb734e234384f6e30f916ec3f73a4da", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56870,11 +56870,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "c13e26eaa343fdabfe24fb216b18b96fdd4a555d51d4fb82c9e195b4b324b5a6", + "target_hash": "beb49c5e2984d90ecf6ab2ed6b579bf22966034c33b6ab4718a583f6b0a44f58", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56890,11 +56890,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "8d4c3fcbb94a0ed2ffe8b16ce195d38f6482a8961d09c6f1f7a2bde4a6f5d968", + "target_hash": "75a1327808862ee70ed9bdb68cd62e3448cbcabe76799f0a7b0103f3f535e627", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56910,11 +56910,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "88dfd1a8de1dc69703eaea08f1612ea290ff37d5959db8d66c312966144e7dec", + "target_hash": "b62e1ea40728f072d3164b0fd7e355d118037fe153bb295505e26cb85b04a1e1", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56930,11 +56930,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "3e50969d1d477463c148b4ff54350fa7330729bfc3eaa366425326f5e0b5f6e3", + "target_hash": "70abc1d13bdaf6205c45ab4040bf360fb08c8eceb6346c7cfcb3bbf594c8a522", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56950,11 +56950,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "7a8c307a24bc18260e921b6df7b09acafffd7990341756e43e7377af6f11e0d5", + "target_hash": "e5c140487ead2a8d0a3141ae92dc7701d165b7bbaf81eff060fcb07565d57567", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56970,11 +56970,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "52adae03080b0572217f18d41a27de70fca9ca49af8e1de988201591f9ae5970", + "target_hash": "92c0118e5801c1e91c40bf94e713dc6ea3d9b34a686cb815958db6df470ead31", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -56990,11 +56990,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "856c6460ba96fe860fd08cb795ec1ee2a838a2642d682b2ce733fac2618ecc01", + "target_hash": "346a33000ae6f7764d94740168b15cd5ee27f9204ce021e7323e8ad4fd959e43", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57010,11 +57010,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "43d8ec586ab4bcc95ca5f0e70edd8d4d8c67ee1ec960705ef43aa102d0e3d4df", + "target_hash": "1f7d047f99d3ede316f8d525534de380a4338b16a6b8d440a8fd8bb892c455b2", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57030,11 +57030,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "31a2aaaf830a0184c9537f3cbf8eeb219adeb242e6f2708e40d302dcb9acf0d6", + "target_hash": "e6c673de4fa1ae353e208a252245781141cfd16e5a359d6077efddc6b7de9ac6", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57050,11 +57050,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "0d5a66e175c8dc00688348a7eb02b8ac0fbe6722a557231e291f2f97dd57e3b3", + "target_hash": "251254ab87f1c592490690ab44cbb3b990563b3209d0427420e50c3955ca495a", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57070,11 +57070,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "ac776a59a67c0be6799731e9d490ad00447fe7e4ab8a138ea795b5f8428cd04c", + "target_hash": "fc05573bd46ebdf3f225c2d8701d7fa55909b548f943a0da159e40d4165f15da", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57090,11 +57090,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "fccf524bf9b26f4f8d2a79b193fac27669f15a306613bee8743b76ca670f0413", + "target_hash": "6d2450c18bad2386e897f50d636738db9aea167ddc49e1c484c31f7cfc2b2230", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57110,11 +57110,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "92a0621bdf2a29040e93a363a1e7e73ce1018907f55f51432bced43e3ff71081", + "target_hash": "7e83a61bc923fd1a08d41166562d3e96537f09337d0864f41fb9f3c0304c8b3a", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57130,11 +57130,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "4a30f7bcdf11bbde11e5ebc6ff05c29647a7227040ff979b7987e321aa7ed783", + "target_hash": "4f4b250a2dfc7d6a32dc23514d4666b9b9de2781bb505d37cf08d4a89376de3c", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57150,11 +57150,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "d3f3f4a3de5ef59c6fa1f2cc3fa84c0ed8fc596c93cc790e99f378ec99d85107", + "target_hash": "202d5dc9d20a39c3f261b936864d4b53b2963ed50526b6f31ac53a1cb12aaa64", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57170,11 +57170,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "69da81beb00684783480b166aa820848b85b9ed9ed2beddaf0925b128f9c4839", + "target_hash": "b00060382bdba6e22db323df8f2ba36677bae3e0845958edd97b37927e44503e", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57190,11 +57190,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "358952f39dc49a8631f8575b6dcab0482cff4c65918af37c837c8430cd09621c", + "target_hash": "bab994ffcf54028844dbf6782fa364012ffd3496a551c01063090a9fc7715090", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57210,11 +57210,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "07770e0d900752bb0b7ca2dcf0b3f000606cb8f0d9b93c42805c713d17e048df", + "target_hash": "96873b344f3914cdbcff65ddcb9dc39ba093206251cf8ababa2f6d6bd04b4bc7", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57230,11 +57230,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "9e11864133204a5ae4328247d415b37c8b6ec8942d896fa02da3d2505a76017d", + "target_hash": "d6f3d804700d22c3e305426943a54ebf901c76323d6c478beb7b008bbc5fd5ba", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57250,11 +57250,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "aa4683eba79c1a9c50da1be55856bd3f1a2b0bfbe6545cee7c1db44e8a139b10", + "target_hash": "34dc6f0824d1eeaec46210a074b2f7553ebea83eb2c9908bc094001f27d28f54", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57270,11 +57270,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "5af34fafc89324b9cda5aec43af6d6c29c9bf221416f5f849a9fa7f9697d3f75", + "target_hash": "a39e783b018b426450c1d3606766c7e9035d480cf8922f898830bf7ebe43ac04", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57290,11 +57290,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "cba7eb652d31742ff647f9b97ab5776ace4dcab24f12c3317f72af28007bd64d", + "target_hash": "6a5a9007d443d94468166313c483e71c6edc27c5b8ebedeb10c2b24aa53895dd", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57310,11 +57310,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "378d0ae89d760656d65fdf6cd3ca432bbbe622424fea05e6361119f5f3dd560e", + "target_hash": "9a7252d9d965dff18fd9d1d55bc95cbe1f08f1a1f3d0c2edede79ad77c04efcc", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57330,11 +57330,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "e6167686a49b17070f7f72a21f6dc441799833a2203a56ffb5f7604c3e96d1a6", + "target_hash": "f1b962bba7eb5d39828ef73077fdd329849626f1a274061d60d4153a6ff42fcb", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57350,11 +57350,11 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0eb0405cc3dac44f4cdab64763f46818f2ca159d6f9da1eb4e9f1a077a660cf1", - "target_hash": "99f4ea6936d04e2d3f8b3a42c3d048dbef4b4bfdcaf89e580974907fd7b7fff3", + "target_hash": "3c1588d1818d14bdb5dd7034dfe553f8eb0156b09a26520f54aa3abe78ebcf44", "section_hashes": [ "f7585f486f9b", "2f36cbf31ab7", @@ -57370,7 +57370,7 @@ "e5e60acd9d0c", "1372aec9223f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -57380,7 +57380,7 @@ "pl": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", "target_hash": "2b7b954f71af25c24aac71a40219894b5b08e32d5019c12cf632c18b0313935d", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57400,7 +57400,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57420,7 +57420,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57440,7 +57440,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57460,7 +57460,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57480,7 +57480,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57500,7 +57500,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57520,7 +57520,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57540,7 +57540,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57560,7 +57560,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57580,7 +57580,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57600,7 +57600,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57620,7 +57620,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57640,7 +57640,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57660,7 +57660,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57680,7 +57680,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57700,7 +57700,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57720,7 +57720,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57740,7 +57740,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57760,7 +57760,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57780,7 +57780,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57800,7 +57800,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57820,7 +57820,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57840,7 +57840,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57860,7 +57860,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57880,7 +57880,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57900,7 +57900,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57920,7 +57920,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57940,7 +57940,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57960,7 +57960,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -57980,7 +57980,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58000,7 +58000,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58020,7 +58020,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58040,7 +58040,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58060,7 +58060,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58080,7 +58080,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58100,7 +58100,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58120,7 +58120,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58140,7 +58140,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58160,7 +58160,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58180,7 +58180,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58200,7 +58200,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58220,7 +58220,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58240,7 +58240,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58260,7 +58260,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58280,7 +58280,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58300,7 +58300,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58320,7 +58320,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58340,7 +58340,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58360,7 +58360,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58380,7 +58380,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58400,7 +58400,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58420,7 +58420,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58440,7 +58440,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58460,7 +58460,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58480,7 +58480,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58500,7 +58500,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58520,7 +58520,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58540,7 +58540,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58560,7 +58560,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58580,7 +58580,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58600,7 +58600,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58620,7 +58620,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58640,7 +58640,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "05c3636cb4ef384715941a4d8d18d89ef235342398e8601c2c4760bb1177f9c0", @@ -58660,7 +58660,7 @@ "68154f18a2c1", "d798c153497a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -58670,7 +58670,7 @@ "pl": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", "target_hash": "2c46c285df877d403b39853dcadf0251d587bc9350f746bcad28a84861eaefca", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58685,7 +58685,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58700,7 +58700,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58715,7 +58715,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58730,7 +58730,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58745,7 +58745,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58760,7 +58760,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58775,7 +58775,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58790,7 +58790,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58805,7 +58805,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58820,7 +58820,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58835,7 +58835,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58850,7 +58850,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58865,7 +58865,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58880,7 +58880,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58895,7 +58895,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58910,7 +58910,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58925,7 +58925,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58940,7 +58940,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58955,7 +58955,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58970,7 +58970,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -58985,7 +58985,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59000,7 +59000,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59015,7 +59015,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59030,7 +59030,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59045,7 +59045,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59060,7 +59060,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59075,7 +59075,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59090,7 +59090,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59105,7 +59105,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59120,7 +59120,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59135,7 +59135,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59150,7 +59150,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59165,7 +59165,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59180,7 +59180,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59195,7 +59195,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59210,7 +59210,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59225,7 +59225,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59240,7 +59240,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59255,7 +59255,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59270,7 +59270,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59285,7 +59285,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59300,7 +59300,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59315,7 +59315,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59330,7 +59330,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59345,7 +59345,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59360,7 +59360,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59375,7 +59375,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59390,7 +59390,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59405,7 +59405,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59420,7 +59420,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59435,7 +59435,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59450,7 +59450,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59465,7 +59465,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59480,7 +59480,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59495,7 +59495,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59510,7 +59510,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59525,7 +59525,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59540,7 +59540,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59555,7 +59555,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59570,7 +59570,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59585,7 +59585,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59600,7 +59600,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59615,7 +59615,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ab8c80915c28d29dc3984d7d8d4ff383074cef646562f0f83b03ea46f7d5dc87", @@ -59630,7 +59630,7 @@ "c1bb92f207fb", "0b75b76b8da0" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -59640,7 +59640,7 @@ "pl": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", "target_hash": "8049e42b2bf98e6234b6f554bace424bc563c0bee8ed274df05ca67931388ec4", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59658,7 +59658,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59676,7 +59676,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59694,7 +59694,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59712,7 +59712,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59730,7 +59730,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59748,7 +59748,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59766,7 +59766,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59784,7 +59784,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59802,7 +59802,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59820,7 +59820,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59838,7 +59838,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59856,7 +59856,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59874,7 +59874,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59892,7 +59892,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59910,7 +59910,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59928,7 +59928,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59946,7 +59946,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59964,7 +59964,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -59982,7 +59982,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60000,7 +60000,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60018,7 +60018,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60036,7 +60036,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60054,7 +60054,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60072,7 +60072,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60090,7 +60090,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60108,7 +60108,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60126,7 +60126,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60144,7 +60144,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60162,7 +60162,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60180,7 +60180,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60198,7 +60198,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60216,7 +60216,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60234,7 +60234,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60252,7 +60252,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60270,7 +60270,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60288,7 +60288,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60306,7 +60306,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60324,7 +60324,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60342,7 +60342,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60360,7 +60360,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60378,7 +60378,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60396,7 +60396,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60414,7 +60414,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60432,7 +60432,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60450,7 +60450,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60468,7 +60468,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60486,7 +60486,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60504,7 +60504,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60522,7 +60522,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60540,7 +60540,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60558,7 +60558,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60576,7 +60576,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60594,7 +60594,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60612,7 +60612,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60630,7 +60630,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60648,7 +60648,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60666,7 +60666,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60684,7 +60684,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60702,7 +60702,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60720,7 +60720,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60738,7 +60738,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60756,7 +60756,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60774,7 +60774,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "54d8f4d4829910ffbffe2a3606ca290e0009aa7fbd2df3ebc40dacbf7ad66c2f", @@ -60792,7 +60792,7 @@ "f6f09ffc8ecd", "dab7444d3863" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -60802,7 +60802,7 @@ "pl": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", "target_hash": "c7f32ca9455aaed5972948a18892e466c111b20a910b1601c680abd6f7d0d003", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60817,7 +60817,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60832,7 +60832,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60847,7 +60847,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60862,7 +60862,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60877,7 +60877,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60892,7 +60892,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60907,7 +60907,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60922,7 +60922,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60937,7 +60937,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60952,7 +60952,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60967,7 +60967,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60982,7 +60982,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -60997,7 +60997,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61012,7 +61012,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61027,7 +61027,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61042,7 +61042,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61057,7 +61057,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61072,7 +61072,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61087,7 +61087,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61102,7 +61102,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61117,7 +61117,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61132,7 +61132,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61147,7 +61147,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61162,7 +61162,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61177,7 +61177,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61192,7 +61192,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61207,7 +61207,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61222,7 +61222,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61237,7 +61237,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61252,7 +61252,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61267,7 +61267,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61282,7 +61282,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61297,7 +61297,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61312,7 +61312,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61327,7 +61327,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61342,7 +61342,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61357,7 +61357,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61372,7 +61372,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61387,7 +61387,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61402,7 +61402,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61417,7 +61417,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61432,7 +61432,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61447,7 +61447,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61462,7 +61462,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61477,7 +61477,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61492,7 +61492,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61507,7 +61507,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61522,7 +61522,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61537,7 +61537,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61552,7 +61552,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61567,7 +61567,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61582,7 +61582,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61597,7 +61597,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61612,7 +61612,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61627,7 +61627,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61642,7 +61642,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61657,7 +61657,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61672,7 +61672,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61687,11 +61687,11 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", - "target_hash": "29e5abf5d75c89c97868acad3ad9fce33bdaa3e3079cc7bd7b70ae3c6ee273d9", + "target_hash": "70da24736e82e8d1f5646f24ea2d64be8de0cbcc1cf70ed257fa7a7628d38359", "section_hashes": [ "dbbb352d2812", "469c3c8b5797", @@ -61702,7 +61702,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61717,7 +61717,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61732,7 +61732,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61747,7 +61747,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "30acec62f3d5c0a44fed23e0d011ee8953182ac8f28811a0aae4eccd993efe3f", @@ -61762,7 +61762,7 @@ "a97a5de28b90", "2202cae42ea4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -61790,7 +61790,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61813,7 +61813,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61836,7 +61836,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61859,7 +61859,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61882,7 +61882,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61905,7 +61905,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61928,7 +61928,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61951,7 +61951,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61974,7 +61974,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -61997,7 +61997,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62020,7 +62020,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62043,7 +62043,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62066,7 +62066,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62089,7 +62089,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62112,7 +62112,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62135,7 +62135,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62158,7 +62158,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62181,7 +62181,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62204,7 +62204,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62227,7 +62227,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62250,7 +62250,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62273,7 +62273,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62296,7 +62296,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62319,7 +62319,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62342,7 +62342,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62365,7 +62365,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62388,7 +62388,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62411,7 +62411,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62434,7 +62434,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62457,7 +62457,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62480,7 +62480,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62503,7 +62503,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62526,7 +62526,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62549,7 +62549,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62572,7 +62572,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62595,7 +62595,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62618,7 +62618,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62641,7 +62641,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62664,7 +62664,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62687,7 +62687,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62710,7 +62710,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62733,7 +62733,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62756,7 +62756,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62779,7 +62779,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62802,7 +62802,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62825,7 +62825,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62848,7 +62848,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62871,7 +62871,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62894,7 +62894,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62917,7 +62917,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62940,7 +62940,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62963,7 +62963,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -62986,7 +62986,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63009,7 +63009,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63032,7 +63032,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63055,7 +63055,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63078,7 +63078,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63101,7 +63101,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63124,7 +63124,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63147,7 +63147,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63170,7 +63170,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63193,7 +63193,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63216,7 +63216,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63239,7 +63239,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "c2b293bf2def1b9e429e78d4aa908f1bd76b35e1985eb117ab930f4e0cbd1067", @@ -63262,7 +63262,7 @@ "3a657a6baaff", "3e44493d657d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -63285,7 +63285,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63303,7 +63303,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63321,7 +63321,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63339,7 +63339,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63357,7 +63357,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63375,7 +63375,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63393,7 +63393,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63411,7 +63411,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63429,7 +63429,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63447,7 +63447,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63465,7 +63465,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63483,7 +63483,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63501,7 +63501,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63519,7 +63519,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63537,7 +63537,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63555,7 +63555,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63573,7 +63573,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63591,7 +63591,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63609,7 +63609,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63627,7 +63627,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63645,7 +63645,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63663,7 +63663,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63681,7 +63681,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63699,7 +63699,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63717,7 +63717,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63735,7 +63735,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63753,7 +63753,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63771,7 +63771,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63789,7 +63789,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63807,7 +63807,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63825,7 +63825,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63843,7 +63843,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63861,7 +63861,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63879,7 +63879,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63897,7 +63897,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63915,7 +63915,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63933,7 +63933,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63951,7 +63951,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63969,7 +63969,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -63987,7 +63987,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64005,7 +64005,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64023,7 +64023,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64041,7 +64041,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64059,7 +64059,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64077,7 +64077,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64095,7 +64095,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64113,7 +64113,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64131,7 +64131,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64149,7 +64149,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64167,7 +64167,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64185,7 +64185,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64203,7 +64203,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64221,7 +64221,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64239,7 +64239,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64257,7 +64257,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64275,7 +64275,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64293,7 +64293,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64311,7 +64311,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64329,7 +64329,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64347,7 +64347,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64365,7 +64365,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64383,7 +64383,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64401,7 +64401,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64419,7 +64419,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "4d7d18abb0225f17e6a844dbac1b7759b56d714210f79b7ce28da3f544adbd19", @@ -64437,7 +64437,7 @@ "909faa98ca90", "1a5b8b2bb7a8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -64447,7 +64447,7 @@ "pl": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", "target_hash": "e75fbd54811dba15872799e8e916e16928902da70bc5574ee733b8c874c3fb9c", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64470,7 +64470,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64493,7 +64493,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64516,7 +64516,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64539,7 +64539,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64562,7 +64562,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64585,7 +64585,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64608,7 +64608,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64631,7 +64631,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64654,7 +64654,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64677,7 +64677,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64700,7 +64700,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64723,7 +64723,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64746,7 +64746,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64769,7 +64769,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64792,7 +64792,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64815,7 +64815,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64838,7 +64838,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64861,7 +64861,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64884,7 +64884,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64907,7 +64907,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64930,7 +64930,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64953,7 +64953,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64976,7 +64976,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -64999,7 +64999,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65022,7 +65022,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65045,7 +65045,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65068,7 +65068,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65091,7 +65091,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65114,7 +65114,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65137,7 +65137,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65160,7 +65160,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65183,7 +65183,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65206,7 +65206,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65229,7 +65229,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65252,7 +65252,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65275,7 +65275,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65298,7 +65298,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65321,7 +65321,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65344,7 +65344,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65367,7 +65367,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65390,7 +65390,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65413,7 +65413,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65436,7 +65436,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65459,7 +65459,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65482,7 +65482,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65505,7 +65505,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65528,7 +65528,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65551,7 +65551,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65574,7 +65574,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65597,7 +65597,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65620,7 +65620,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65643,7 +65643,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65666,7 +65666,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65689,7 +65689,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65712,7 +65712,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65735,7 +65735,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65758,7 +65758,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65781,7 +65781,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65804,7 +65804,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65827,7 +65827,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65850,7 +65850,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65873,7 +65873,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65896,7 +65896,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "28a01227b43d4bd03a30354fced80cb04806e95fda984df28afbdd98d841f018", @@ -65919,7 +65919,7 @@ "7a1a198d2f76", "f547e8224895" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -65940,7 +65940,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -65956,7 +65956,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -65972,7 +65972,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -65988,7 +65988,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66004,7 +66004,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66020,7 +66020,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66036,7 +66036,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66052,7 +66052,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66068,7 +66068,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66084,7 +66084,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66100,7 +66100,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66116,7 +66116,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66132,7 +66132,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66148,7 +66148,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66164,7 +66164,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66180,7 +66180,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66196,7 +66196,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66212,7 +66212,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66228,7 +66228,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66244,7 +66244,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66260,7 +66260,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66276,7 +66276,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66292,7 +66292,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66308,7 +66308,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66324,7 +66324,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66340,7 +66340,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66356,7 +66356,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66372,7 +66372,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66388,7 +66388,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66404,7 +66404,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66420,7 +66420,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66436,7 +66436,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66452,7 +66452,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66468,7 +66468,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66484,7 +66484,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66500,7 +66500,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66516,7 +66516,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66532,7 +66532,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66548,7 +66548,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66564,7 +66564,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66580,7 +66580,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66596,7 +66596,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66612,7 +66612,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66628,7 +66628,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66644,7 +66644,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66660,7 +66660,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66676,7 +66676,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66692,7 +66692,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66708,7 +66708,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66724,7 +66724,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66740,7 +66740,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66756,7 +66756,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66772,7 +66772,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66788,7 +66788,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66804,7 +66804,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66820,7 +66820,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66836,7 +66836,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66852,7 +66852,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66868,7 +66868,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66884,7 +66884,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66900,7 +66900,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66916,7 +66916,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66932,7 +66932,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66948,7 +66948,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "62779038dd1b2c49fbf21e7ac0a3aaf7f730bec129d271d56fb9c5b31f6df4a0", @@ -66964,7 +66964,7 @@ "ad2eadc559af", "a84c9ef97872" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -66974,7 +66974,7 @@ "pl": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", "target_hash": "a4017bf4b6e8be86948c133f60f64698165e8ccc495b709fbdf80f5585ed4782", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -66992,7 +66992,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67010,7 +67010,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67028,7 +67028,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67046,7 +67046,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67064,7 +67064,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67082,7 +67082,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67100,7 +67100,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67118,7 +67118,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67136,7 +67136,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67154,7 +67154,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67172,7 +67172,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67190,7 +67190,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67208,7 +67208,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67226,7 +67226,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67244,7 +67244,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67262,7 +67262,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67280,7 +67280,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67298,7 +67298,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67316,7 +67316,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67334,7 +67334,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67352,7 +67352,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67370,7 +67370,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67388,7 +67388,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67406,7 +67406,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67424,7 +67424,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67442,7 +67442,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67460,7 +67460,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67478,7 +67478,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67496,7 +67496,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67514,7 +67514,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67532,7 +67532,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67550,7 +67550,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67568,7 +67568,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67586,7 +67586,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67604,7 +67604,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67622,7 +67622,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67640,7 +67640,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67658,7 +67658,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67676,7 +67676,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67694,7 +67694,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67712,7 +67712,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67730,7 +67730,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67748,7 +67748,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67766,7 +67766,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67784,7 +67784,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67802,7 +67802,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67820,7 +67820,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67838,7 +67838,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67856,7 +67856,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67874,7 +67874,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67892,7 +67892,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67910,7 +67910,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67928,7 +67928,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67946,7 +67946,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67964,7 +67964,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -67982,7 +67982,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68000,7 +68000,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68018,7 +68018,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68036,11 +68036,11 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", - "target_hash": "39c94d81e854371c1f038ee9b582e6e1da03405af33f68a4f4d55401a412ab03", + "target_hash": "9e51de804c5cfb9cb430026014bb09d6bc15e9af822e30565f1b9033fc927c49", "section_hashes": [ "ac2c71a9252f", "fb07159a08ea", @@ -68054,7 +68054,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68072,7 +68072,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68090,7 +68090,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68108,7 +68108,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "20ebdc7341ead4a9a33efc0e2a00210cdd3bc617382595c703292425ef1ce3fc", @@ -68126,7 +68126,7 @@ "2850c6c2b018", "7466a8efcac6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -68136,7 +68136,7 @@ "pl": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", "target_hash": "c5ba5cc1c8be55db869e2df6eba2ae184d7ca3e79a2cd9f15eb9ee4b44848dca", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68154,7 +68154,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68172,7 +68172,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68190,7 +68190,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68208,7 +68208,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68226,7 +68226,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68244,7 +68244,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68262,7 +68262,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68280,7 +68280,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68298,7 +68298,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68316,7 +68316,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68334,7 +68334,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68352,7 +68352,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68370,7 +68370,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68388,7 +68388,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68406,7 +68406,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68424,7 +68424,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68442,7 +68442,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68460,7 +68460,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68478,7 +68478,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68496,7 +68496,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68514,7 +68514,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68532,7 +68532,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68550,7 +68550,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68568,7 +68568,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68586,7 +68586,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68604,7 +68604,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68622,7 +68622,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68640,7 +68640,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68658,7 +68658,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68676,7 +68676,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68694,7 +68694,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68712,7 +68712,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68730,7 +68730,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68748,7 +68748,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68766,7 +68766,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68784,7 +68784,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68802,7 +68802,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68820,7 +68820,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68838,7 +68838,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68856,7 +68856,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68874,7 +68874,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68892,7 +68892,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68910,7 +68910,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68928,7 +68928,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68946,7 +68946,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68964,7 +68964,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -68982,7 +68982,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69000,7 +69000,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69018,7 +69018,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69036,7 +69036,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69054,7 +69054,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69072,7 +69072,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69090,7 +69090,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69108,7 +69108,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69126,7 +69126,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69144,7 +69144,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69162,7 +69162,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69180,7 +69180,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69198,7 +69198,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69216,7 +69216,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69234,7 +69234,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69252,7 +69252,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69270,7 +69270,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "113d282921cf4bb189d7d444727e0a752aedd39c9574cd7cd48cffe4b1563296", @@ -69288,7 +69288,7 @@ "a3d8d77bacf5", "6b98b1d33d63" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -69310,7 +69310,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69327,7 +69327,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69344,7 +69344,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69361,7 +69361,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69378,7 +69378,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69395,7 +69395,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69412,7 +69412,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69429,7 +69429,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69446,7 +69446,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69463,7 +69463,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69480,7 +69480,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69497,7 +69497,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69514,7 +69514,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69531,7 +69531,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69548,7 +69548,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69565,7 +69565,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69582,7 +69582,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69599,7 +69599,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69616,7 +69616,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69633,7 +69633,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69650,7 +69650,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69667,7 +69667,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69684,7 +69684,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69701,7 +69701,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69718,7 +69718,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69735,7 +69735,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69752,7 +69752,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69769,7 +69769,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69786,7 +69786,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69803,7 +69803,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69820,7 +69820,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69837,7 +69837,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69854,7 +69854,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69871,7 +69871,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69888,7 +69888,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69905,7 +69905,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69922,7 +69922,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69939,7 +69939,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69956,7 +69956,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69973,7 +69973,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -69990,7 +69990,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70007,7 +70007,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70024,7 +70024,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70041,7 +70041,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70058,7 +70058,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70075,7 +70075,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70092,7 +70092,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70109,7 +70109,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70126,7 +70126,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70143,7 +70143,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70160,7 +70160,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70177,7 +70177,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70194,7 +70194,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70211,7 +70211,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70228,7 +70228,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70245,7 +70245,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70262,7 +70262,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70279,7 +70279,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70296,7 +70296,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70313,7 +70313,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70330,7 +70330,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70347,7 +70347,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70364,7 +70364,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70381,7 +70381,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "f60be16d7b8a96d812a8286b0547323d57585c1dd8666ffd922dc3da967e7ca0", @@ -70398,7 +70398,7 @@ "485d9591da7f", "e1a7bb007ec2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -70421,7 +70421,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70439,7 +70439,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70457,7 +70457,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70475,7 +70475,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70493,7 +70493,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70511,7 +70511,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70529,7 +70529,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70547,7 +70547,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70565,7 +70565,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70583,7 +70583,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70601,7 +70601,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70619,7 +70619,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70637,7 +70637,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70655,7 +70655,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70673,7 +70673,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70691,7 +70691,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70709,7 +70709,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70727,7 +70727,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70745,7 +70745,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70763,7 +70763,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70781,7 +70781,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70799,7 +70799,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70817,7 +70817,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70835,7 +70835,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70853,7 +70853,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70871,7 +70871,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70889,7 +70889,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70907,7 +70907,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70925,7 +70925,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70943,7 +70943,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70961,7 +70961,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70979,7 +70979,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -70997,7 +70997,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71015,7 +71015,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71033,7 +71033,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71051,7 +71051,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71069,7 +71069,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71087,7 +71087,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71105,7 +71105,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71123,7 +71123,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71141,7 +71141,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71159,7 +71159,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71177,7 +71177,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71195,7 +71195,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71213,7 +71213,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71231,7 +71231,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71249,7 +71249,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71267,7 +71267,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71285,7 +71285,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71303,7 +71303,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71321,7 +71321,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71339,7 +71339,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71357,7 +71357,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71375,7 +71375,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71393,7 +71393,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71411,7 +71411,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71429,7 +71429,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71447,7 +71447,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71465,7 +71465,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71483,7 +71483,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71501,7 +71501,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71519,7 +71519,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71537,7 +71537,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71555,7 +71555,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "df59bd25a1c05b789bb269b9fc273ea3a183431eadd72b13f051df617fdd7a02", @@ -71573,7 +71573,7 @@ "caac010b6088", "1247a72b9a47" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -71583,7 +71583,7 @@ "pl": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", "target_hash": "1df32ebf5851fa5ad0e195b5d4a3f6623e70e7fef3312eee709a09aecdd5cef5", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71599,7 +71599,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71615,7 +71615,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71631,7 +71631,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71647,7 +71647,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71663,7 +71663,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71679,7 +71679,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71695,7 +71695,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71711,7 +71711,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71727,7 +71727,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71743,7 +71743,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71759,7 +71759,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71775,7 +71775,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71791,7 +71791,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71807,7 +71807,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71823,7 +71823,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71839,7 +71839,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71855,7 +71855,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71871,7 +71871,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71887,7 +71887,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71903,7 +71903,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71919,7 +71919,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71935,7 +71935,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71951,7 +71951,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71967,7 +71967,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71983,7 +71983,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -71999,7 +71999,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72015,7 +72015,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72031,7 +72031,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72047,7 +72047,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72063,7 +72063,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72079,7 +72079,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72095,7 +72095,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72111,7 +72111,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72127,7 +72127,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72143,7 +72143,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72159,7 +72159,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72175,7 +72175,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72191,7 +72191,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72207,7 +72207,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72223,7 +72223,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72239,7 +72239,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72255,7 +72255,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72271,7 +72271,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72287,7 +72287,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72303,7 +72303,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72319,7 +72319,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72335,7 +72335,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72351,7 +72351,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72367,7 +72367,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72383,7 +72383,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72399,7 +72399,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72415,7 +72415,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72431,7 +72431,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72447,7 +72447,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72463,7 +72463,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72479,7 +72479,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72495,7 +72495,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72511,7 +72511,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72527,7 +72527,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72543,7 +72543,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72559,7 +72559,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72575,7 +72575,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72591,7 +72591,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ee65b3f0ec8185f56eb4a73c32d4fd54330ae340430fdb7783790c73b8937492", @@ -72607,7 +72607,7 @@ "477a489925d4", "21bab737a900" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -72628,7 +72628,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72644,7 +72644,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72660,7 +72660,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72676,7 +72676,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72692,7 +72692,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72708,7 +72708,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72724,7 +72724,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72740,7 +72740,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72756,7 +72756,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72772,7 +72772,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72788,7 +72788,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72804,7 +72804,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72820,7 +72820,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72836,7 +72836,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72852,7 +72852,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72868,7 +72868,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72884,7 +72884,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72900,7 +72900,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72916,7 +72916,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72932,7 +72932,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72948,7 +72948,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72964,7 +72964,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72980,7 +72980,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -72996,7 +72996,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73012,7 +73012,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73028,7 +73028,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73044,7 +73044,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73060,7 +73060,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73076,7 +73076,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73092,7 +73092,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73108,7 +73108,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73124,7 +73124,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73140,7 +73140,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73156,7 +73156,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73172,7 +73172,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73188,7 +73188,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73204,7 +73204,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73220,7 +73220,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73236,7 +73236,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73252,7 +73252,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73268,7 +73268,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73284,7 +73284,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73300,7 +73300,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73316,7 +73316,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73332,7 +73332,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73348,7 +73348,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73364,7 +73364,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73380,7 +73380,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73396,7 +73396,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73412,7 +73412,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73428,7 +73428,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73444,7 +73444,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73460,7 +73460,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73476,7 +73476,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73492,7 +73492,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73508,7 +73508,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73524,7 +73524,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73540,7 +73540,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73556,7 +73556,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73572,7 +73572,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73588,7 +73588,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73604,7 +73604,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73620,7 +73620,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73636,7 +73636,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a8345a135d8724a4f938bb19cb2bd4385a5f78744bda09b2819f0b4b640621b9", @@ -73652,7 +73652,7 @@ "e19283a03c34", "b25789910d2d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -73672,7 +73672,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73687,7 +73687,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73702,7 +73702,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73717,7 +73717,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73732,7 +73732,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73747,7 +73747,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73762,7 +73762,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73777,7 +73777,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73792,7 +73792,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73807,7 +73807,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73822,7 +73822,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73837,7 +73837,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73852,7 +73852,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73867,7 +73867,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73882,7 +73882,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73897,7 +73897,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73912,7 +73912,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73927,7 +73927,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73942,7 +73942,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73957,7 +73957,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73972,7 +73972,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -73987,7 +73987,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74002,7 +74002,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74017,7 +74017,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74032,7 +74032,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74047,7 +74047,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74062,7 +74062,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74077,7 +74077,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74092,7 +74092,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74107,7 +74107,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74122,7 +74122,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74137,7 +74137,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74152,7 +74152,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74167,7 +74167,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74182,7 +74182,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74197,7 +74197,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74212,7 +74212,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74227,7 +74227,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74242,7 +74242,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74257,7 +74257,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74272,7 +74272,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74287,7 +74287,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74302,7 +74302,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74317,7 +74317,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74332,7 +74332,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74347,7 +74347,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74362,7 +74362,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74377,7 +74377,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74392,7 +74392,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74407,7 +74407,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74422,7 +74422,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74437,7 +74437,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74452,7 +74452,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74467,7 +74467,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74482,7 +74482,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74497,7 +74497,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74512,7 +74512,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74527,7 +74527,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74542,7 +74542,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74557,7 +74557,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74572,7 +74572,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74587,7 +74587,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74602,7 +74602,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74617,7 +74617,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "4fa3fcefc35c56293d0170cb92fea1bb55fda1cf41eab1b0ee7a26ced6bd96a4", @@ -74632,7 +74632,7 @@ "c63e35271c39", "e7a8683b963f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -74649,7 +74649,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74661,7 +74661,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74673,7 +74673,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74685,7 +74685,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74697,7 +74697,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74709,7 +74709,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74721,7 +74721,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74733,7 +74733,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74745,7 +74745,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74757,7 +74757,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74769,7 +74769,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74781,7 +74781,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74793,7 +74793,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74805,7 +74805,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74817,7 +74817,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74829,7 +74829,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74841,7 +74841,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74853,7 +74853,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74865,7 +74865,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74877,7 +74877,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74889,7 +74889,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74901,7 +74901,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74913,7 +74913,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74925,7 +74925,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74937,7 +74937,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74949,7 +74949,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74961,7 +74961,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74973,7 +74973,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74985,7 +74985,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -74997,7 +74997,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75009,7 +75009,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75021,7 +75021,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75033,7 +75033,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75045,7 +75045,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75057,7 +75057,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75069,7 +75069,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75081,7 +75081,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75093,7 +75093,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75105,7 +75105,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75117,7 +75117,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75129,7 +75129,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75141,7 +75141,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75153,7 +75153,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75165,7 +75165,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75177,7 +75177,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75189,7 +75189,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75201,7 +75201,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75213,7 +75213,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75225,7 +75225,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75237,7 +75237,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75249,7 +75249,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75261,7 +75261,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75273,7 +75273,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75285,7 +75285,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75297,7 +75297,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75309,7 +75309,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75321,7 +75321,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75333,7 +75333,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75345,7 +75345,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75357,7 +75357,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75369,7 +75369,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75381,7 +75381,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75393,7 +75393,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75405,7 +75405,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ba67f26a283e7e522a5fab7fd0b14992ab8a703a25c5568a4b7705b91e2591f0", @@ -75417,7 +75417,7 @@ "c49ea8f66872", "09936d7ebbaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -75427,7 +75427,7 @@ "pl": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", "target_hash": "f74941eb955fc05408956bd848a56064e86bf562f1942eac58aa8a9e03819f42", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75443,7 +75443,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75459,7 +75459,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75475,7 +75475,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75491,7 +75491,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75507,7 +75507,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75523,7 +75523,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75539,7 +75539,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75555,7 +75555,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75571,7 +75571,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75587,7 +75587,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75603,7 +75603,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75619,7 +75619,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75635,7 +75635,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75651,7 +75651,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75667,7 +75667,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75683,7 +75683,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75699,7 +75699,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75715,7 +75715,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75731,7 +75731,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75747,7 +75747,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75763,7 +75763,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75779,7 +75779,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75795,7 +75795,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75811,7 +75811,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75827,7 +75827,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75843,7 +75843,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75859,7 +75859,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75875,7 +75875,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75891,7 +75891,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75907,7 +75907,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75923,7 +75923,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75939,7 +75939,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75955,7 +75955,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75971,7 +75971,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -75987,7 +75987,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76003,7 +76003,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76019,7 +76019,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76035,7 +76035,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76051,7 +76051,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76067,7 +76067,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76083,7 +76083,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76099,7 +76099,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76115,7 +76115,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76131,7 +76131,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76147,7 +76147,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76163,7 +76163,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76179,7 +76179,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76195,7 +76195,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76211,7 +76211,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76227,7 +76227,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76243,7 +76243,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76259,7 +76259,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76275,7 +76275,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76291,7 +76291,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76307,7 +76307,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76323,7 +76323,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76339,7 +76339,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76355,7 +76355,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76371,7 +76371,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76387,7 +76387,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76403,7 +76403,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76419,7 +76419,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76435,7 +76435,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "690bbb6faba1429b3df3066f0e42414a9d17ceb4024a2d41d2dd07795b162fd7", @@ -76451,7 +76451,7 @@ "37ffd5b69c91", "81a75836d3b1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -76473,7 +76473,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76490,7 +76490,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76507,7 +76507,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76524,7 +76524,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76541,7 +76541,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76558,7 +76558,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76575,7 +76575,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76592,7 +76592,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76609,7 +76609,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76626,7 +76626,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76643,7 +76643,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76660,7 +76660,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76677,7 +76677,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76694,7 +76694,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76711,7 +76711,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76728,7 +76728,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76745,7 +76745,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76762,7 +76762,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76779,7 +76779,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76796,7 +76796,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76813,7 +76813,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76830,7 +76830,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76847,7 +76847,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76864,7 +76864,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76881,7 +76881,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76898,7 +76898,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76915,7 +76915,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76932,7 +76932,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76949,7 +76949,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76966,7 +76966,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -76983,7 +76983,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77000,7 +77000,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77017,7 +77017,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77034,7 +77034,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77051,7 +77051,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77068,7 +77068,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77085,7 +77085,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77102,7 +77102,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77119,7 +77119,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77136,7 +77136,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77153,7 +77153,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77170,7 +77170,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77187,7 +77187,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77204,7 +77204,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77221,7 +77221,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77238,7 +77238,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77255,7 +77255,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77272,7 +77272,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77289,7 +77289,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77306,7 +77306,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77323,7 +77323,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77340,7 +77340,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77357,7 +77357,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77374,7 +77374,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77391,7 +77391,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77408,7 +77408,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77425,7 +77425,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77442,7 +77442,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77459,7 +77459,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77476,7 +77476,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77493,7 +77493,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77510,7 +77510,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77527,7 +77527,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77544,7 +77544,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "9b918cb119ce715c7ca68fbb0c407bcc04631a4a5db9b8b4598e3eab84306419", @@ -77561,7 +77561,7 @@ "cea4e3637cba", "cef80c483b88" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -77579,7 +77579,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77592,7 +77592,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77605,7 +77605,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77618,7 +77618,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77631,7 +77631,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77644,7 +77644,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77657,7 +77657,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77670,7 +77670,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77683,7 +77683,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77696,7 +77696,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77709,7 +77709,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77722,7 +77722,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77735,7 +77735,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77748,7 +77748,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77761,7 +77761,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77774,7 +77774,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77787,7 +77787,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77800,7 +77800,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77813,7 +77813,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77826,7 +77826,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77839,7 +77839,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77852,7 +77852,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77865,7 +77865,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77878,7 +77878,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77891,7 +77891,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77904,7 +77904,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77917,7 +77917,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77930,7 +77930,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77943,7 +77943,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77956,7 +77956,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77969,7 +77969,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77982,7 +77982,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -77995,7 +77995,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78008,7 +78008,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78021,7 +78021,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78034,7 +78034,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78047,7 +78047,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78060,7 +78060,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78073,7 +78073,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78086,7 +78086,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78099,7 +78099,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78112,7 +78112,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78125,7 +78125,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78138,7 +78138,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78151,7 +78151,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78164,7 +78164,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78177,7 +78177,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78190,7 +78190,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78203,7 +78203,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78216,7 +78216,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78229,7 +78229,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78242,7 +78242,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78255,7 +78255,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78268,7 +78268,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78281,7 +78281,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78294,7 +78294,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78307,7 +78307,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78320,7 +78320,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78333,7 +78333,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78346,7 +78346,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78359,7 +78359,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78372,7 +78372,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78385,7 +78385,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78398,7 +78398,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "61b7030eadc90ca97ef26373f991ed720c3fe7d4b6a6b53884859e8b0c493de3", @@ -78411,7 +78411,7 @@ "45da7a1bfe0e", "607c54652fb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -78421,7 +78421,7 @@ "pl": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", "target_hash": "7b520daa303e272ea7e49dd737af73578dd492a7895aee911c07f97b0101a448", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78443,7 +78443,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78465,7 +78465,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78487,7 +78487,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78509,7 +78509,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78531,7 +78531,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78553,7 +78553,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78575,7 +78575,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78597,7 +78597,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78619,7 +78619,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78641,7 +78641,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78663,7 +78663,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78685,7 +78685,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78707,7 +78707,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78729,7 +78729,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78751,7 +78751,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78773,7 +78773,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78795,7 +78795,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78817,7 +78817,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78839,7 +78839,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78861,7 +78861,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78883,7 +78883,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78905,7 +78905,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78927,7 +78927,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78949,7 +78949,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78971,7 +78971,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -78993,7 +78993,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79015,7 +79015,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79037,7 +79037,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79059,7 +79059,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79081,7 +79081,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79103,7 +79103,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79125,7 +79125,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79147,7 +79147,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79169,7 +79169,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79191,7 +79191,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79213,7 +79213,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79235,7 +79235,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79257,7 +79257,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79279,7 +79279,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79301,7 +79301,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79323,7 +79323,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79345,7 +79345,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79367,7 +79367,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79389,7 +79389,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79411,7 +79411,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79433,7 +79433,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79455,7 +79455,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79477,7 +79477,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79499,7 +79499,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79521,7 +79521,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79543,7 +79543,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79565,7 +79565,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79587,7 +79587,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79609,7 +79609,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79631,7 +79631,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79653,7 +79653,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79675,7 +79675,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79697,7 +79697,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79719,7 +79719,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79741,7 +79741,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79763,7 +79763,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79785,7 +79785,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79807,7 +79807,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9023181188088b29242b3486270499fef51dc3e29e75150677e5a59536e71298", @@ -79829,7 +79829,7 @@ "cf1c62419cf7", "76103b462408" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -79839,7 +79839,7 @@ "pl": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", "target_hash": "b30bbc34a3b766bd75a9dcf601fa8d8be7f8ebcf16bf901933f23d6e48aee97c", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79853,7 +79853,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79867,7 +79867,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79881,7 +79881,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79895,7 +79895,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79909,7 +79909,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79923,7 +79923,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79937,7 +79937,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79951,7 +79951,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79965,7 +79965,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79979,7 +79979,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -79993,7 +79993,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80007,7 +80007,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80021,7 +80021,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80035,7 +80035,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80049,7 +80049,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80063,7 +80063,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80077,7 +80077,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80091,7 +80091,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80105,7 +80105,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80119,7 +80119,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80133,7 +80133,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80147,7 +80147,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80161,7 +80161,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80175,7 +80175,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80189,7 +80189,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80203,7 +80203,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80217,7 +80217,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80231,7 +80231,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80245,7 +80245,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80259,7 +80259,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80273,7 +80273,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80287,7 +80287,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80301,7 +80301,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80315,7 +80315,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80329,7 +80329,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80343,7 +80343,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80357,7 +80357,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80371,7 +80371,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80385,7 +80385,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80399,7 +80399,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80413,7 +80413,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80427,7 +80427,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80441,7 +80441,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80455,7 +80455,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80469,7 +80469,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80483,7 +80483,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80497,7 +80497,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80511,7 +80511,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80525,7 +80525,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80539,7 +80539,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80553,7 +80553,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80567,7 +80567,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80581,7 +80581,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80595,7 +80595,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80609,7 +80609,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80623,7 +80623,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80637,7 +80637,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80651,7 +80651,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80665,7 +80665,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80679,7 +80679,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80693,7 +80693,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80707,7 +80707,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80721,7 +80721,7 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "d30f989533ba92322ee859bc5dfa4eaaa05972b24297cf7936da493f3f2f60bd", @@ -80735,12 +80735,12 @@ "c30face701df", "b619d9ca2672" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/guides/DOCKER_GUIDE.md": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", "locales": { "pl": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -80766,15 +80766,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "8cc50520c352669c40db93a98568dd00b36545828f2f2ce29fe9cfc5085e0597", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "b5907b48eb618c5d91cd17f74b06f11ffec6c13a5df8b58cded3b067377b4469", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80792,15 +80792,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "e654d718579e2299e3b79e50e3cb056d1622016bc3f11c5ee854aea7950e886b", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "ae7987ae5a92f3f7e5918390d469fc456177b0f40bccb89d8f1a03d9438e0821", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80818,15 +80818,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "bcc9aa90f4da3548c7e7407fef812e0dc9aae78617373684dee217c5e14531de", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "9bce367a08bf3bbd3c28616a83adab41816fbe3e69fc18a9b1082802d0ceef4a", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80844,15 +80844,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "ffd047b06cc0a791f710305def3014d16987d0e35549c527e824c8a75716e091", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "79fc2e9a2ca1ea73c668d2ab0eb205ea397b51c88b8c33d1f2fdacae67f2dd1a", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80870,15 +80870,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "bd6899037b2e5f155a218b93b6cafb56c0ba512f6ea98f2762cb7eccb1f4bf4e", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "d89a26a74c602cafa0d4ac94b52ff4c7a7b4d123222bddd734968eaf30eb7107", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80896,15 +80896,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "7d117beefa08883385d8dde194cf5032c6c867dcee8821c718add74f42d6c13a", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "06e76dbd3581ce24c1b4af8647d08742482bdc013ad5a345541059356b0e10aa", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80922,15 +80922,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "8a3496bd43b442c3598506841c358a95f012d2c2c16b087cf1a957e9b3478bd0", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "adb8007ce4f751b40775661b9b840330ce7cc6511fc4690c4d47b6620a955085", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80948,15 +80948,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "ba9a2554cc83928a9714d608d0156ebbb882410ec0ea10ba5b1afcd51badef85", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "de3c55bc888ffd1cdb5a516b8bebc6a19c01ee1dbf8406fa3fffd9787a7e08a9", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -80974,15 +80974,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "db864b37095aeedcaf08b983f9c5fa56ac7b03d1aba5ddbd54de57ced8778b89", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "9959b4e4de95eba7c59eb08face8c098541e4e396dc622af96f8eb2437ac2f7f", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81000,15 +81000,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "57572c0d568ed4d0a37d8161e0a7b99bb693aa79696ff86348e01c131ebac594", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "e2a2586aa8a8abd3fb89f32135acf622ac811d3f8d8065be904cf2f41e0220ea", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81026,15 +81026,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "3f18c579cad5a3e001e012fb1b1091bb8411e672caca009458d1968a4a39d9c6", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "a0824e8076f5f6a7d50ad8647ed886f9343cb2070c605df2d0f372b2d0eb57c6", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81052,15 +81052,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "0c09a05dd098839266cdee75a255f66ca9c9dc5c8b03d2d490e815a48c62020d", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "ce1763a9323c3ff223503d21aa04951ccb3bf7143a7a4c1ffcf0c70a4c48536f", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81078,15 +81078,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "502dbf1b640410de910fcde595593508b0e5a91456d9ab74855c7e942923aab2", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "9d792a46442cbcb987c6680b3184be0086279bfb7a97726522ee03d2057ea981", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81104,15 +81104,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "0a8defeb6bc411bf3aea6a0aa2ebb0f62e15d63a6e1c5649e3da271387fc2161", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "f55cae8485cb8c0a84815be44a81115d148cc687a334f482f39a58d6af9151a1", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81130,15 +81130,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "bf6cca27e47af49e4e21967447d3f21ca86f9e1c9e0cb7815c546f4c6d7d6c10", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "473773d9307737afd3db21f90224fcc78b7c8fd8a027c7a4609100909a29df98", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81156,15 +81156,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "65f94daed8202df181d98d22d2a16821363cb442a9b1bd46ceac7cf21fab0537", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "95f51f3c86450c3e35116acd58ebf9fb7d090deb01c0a39317235625b1637900", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81182,15 +81182,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "47f720a229d93241146fade50d20dc4fadaa3f4b8a53999d4263cce95221682e", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "b6bfdb9187454815a8e34d9d04e731f8916834c1f95200c2c284b9dd1afd373b", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81208,15 +81208,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "24215d1befd892551617ef7b9ac58caa4123e348346c6930641869eb5dcc46ab", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "2db331f3a0d2a10702f4c095f7577b25d2b43bb1de041e9baf4ca9f71e8d60ea", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81234,15 +81234,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "6fcdf52f9fd1b2f84e1c75683536f471f0be671efdcf936f343e25ecab8cf725", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "63e71e219b0161d127d8045c0689c0de997ef58fc73e5eaedc232bc292376a36", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81260,15 +81260,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "6da5a92af0e0e2edefcb8695bb977cd030365178b8dbe7174cde33c57072acce", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "2ee6b0f95b5e6afd68e0631424abd671a52ba581495be429702df0330de1e79b", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81286,15 +81286,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "f12c3a2c657fe396a580fc70ad3f52803ee42ce467e1085e402c16716273a71d", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "72f21e78cb44cb3a684c6fad3638a8739a2d756a3fe934e0ceb440acc1d80d6f", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81312,15 +81312,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "8c8a7804f7ccc4bb85fe0e53706b90d37c792866d27c0dc7f8d4a5512476eebb", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "20227d7c0aaddd0fdbd8a3355f8024b62f5cef5bb0e6692adc61446c9c2d4db8", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81338,15 +81338,15 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", - "target_hash": "e1be054dd253b448517848d6094dd575a17d164cec00d1546fe514bbb76a93a0", + "source_hash": "efa7d82b2ef97d7e90f51ea78eb39cca7edd93fbde24d523ca1e94cf543ed087", + "target_hash": "9b8f9f17806149d0d558535cf36918bc62cf1ee106efce935217802d31737c9d", "section_hashes": [ "69d02ce6a243", "2ff327384a95", - "1cb2458c5511", + "dd9bb6cf4163", "8e9abd6c096a", "4c40de9d138f", "f7a3bca47527", @@ -81364,7 +81364,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81390,7 +81390,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81416,7 +81416,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81442,7 +81442,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81468,7 +81468,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81494,7 +81494,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81520,7 +81520,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81546,7 +81546,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81572,7 +81572,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81598,7 +81598,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81624,7 +81624,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81650,7 +81650,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81676,7 +81676,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81702,7 +81702,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81728,7 +81728,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81754,7 +81754,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81780,7 +81780,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81806,7 +81806,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81832,7 +81832,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81858,7 +81858,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81884,7 +81884,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81910,7 +81910,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81936,7 +81936,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81962,7 +81962,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -81988,7 +81988,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82014,7 +82014,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82040,7 +82040,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82066,7 +82066,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82092,7 +82092,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82118,7 +82118,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82144,7 +82144,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82170,7 +82170,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82196,7 +82196,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82222,7 +82222,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82248,7 +82248,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82274,7 +82274,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82300,7 +82300,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82326,7 +82326,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82352,7 +82352,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82378,7 +82378,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82404,7 +82404,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "8d8935c18cd00f093bee11bf96bd7bdbd25f1b376d2f33ad12c8c47a8f1bacb1", @@ -82430,7 +82430,7 @@ "7317b76faaaa", "c68737563e9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -82440,7 +82440,7 @@ "pl": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", "target_hash": "cafe657b070b5d128aafd2a5176d127a7dd635d20826550078aec576ef276b6d", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82464,7 +82464,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82488,7 +82488,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82512,7 +82512,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82536,7 +82536,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82560,7 +82560,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82584,7 +82584,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82608,7 +82608,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82632,7 +82632,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82656,7 +82656,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82680,7 +82680,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82704,7 +82704,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82728,7 +82728,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82752,7 +82752,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82776,7 +82776,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82800,7 +82800,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82824,7 +82824,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82848,7 +82848,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82872,7 +82872,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82896,7 +82896,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82920,7 +82920,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82944,7 +82944,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82968,7 +82968,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -82992,7 +82992,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83016,7 +83016,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83040,7 +83040,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83064,7 +83064,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83088,7 +83088,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83112,7 +83112,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83136,7 +83136,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83160,7 +83160,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83184,7 +83184,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83208,7 +83208,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83232,7 +83232,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83256,7 +83256,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83280,7 +83280,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83304,7 +83304,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83328,7 +83328,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83352,7 +83352,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83376,7 +83376,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83400,7 +83400,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83424,7 +83424,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83448,7 +83448,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83472,7 +83472,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83496,7 +83496,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83520,7 +83520,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83544,7 +83544,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83568,7 +83568,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83592,7 +83592,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83616,7 +83616,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83640,7 +83640,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83664,7 +83664,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83688,7 +83688,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83712,7 +83712,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83736,7 +83736,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83760,7 +83760,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83784,7 +83784,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83808,7 +83808,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83832,7 +83832,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83856,7 +83856,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83880,7 +83880,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83904,7 +83904,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83928,7 +83928,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83952,7 +83952,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "da2cd2f3c2ad22b07a7bda3392f7d1751c5c27d411589f1f0e85cb53436d9bcf", @@ -83976,7 +83976,7 @@ "e51157de749f", "c515aae02fce" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -84019,7 +84019,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84057,7 +84057,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84095,7 +84095,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84133,7 +84133,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84171,7 +84171,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84209,7 +84209,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84247,7 +84247,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84285,7 +84285,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84323,7 +84323,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84361,7 +84361,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84399,7 +84399,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84437,7 +84437,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84475,7 +84475,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84513,7 +84513,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84551,7 +84551,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84589,7 +84589,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84627,7 +84627,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84665,7 +84665,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84703,7 +84703,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84741,7 +84741,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84779,7 +84779,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84817,7 +84817,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84855,7 +84855,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84893,7 +84893,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84931,7 +84931,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -84969,7 +84969,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85007,7 +85007,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85045,7 +85045,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85083,7 +85083,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85121,7 +85121,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85159,7 +85159,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85197,7 +85197,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85235,7 +85235,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85273,7 +85273,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85311,7 +85311,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85349,7 +85349,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85387,7 +85387,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85425,7 +85425,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85463,7 +85463,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85501,7 +85501,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85539,7 +85539,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85577,7 +85577,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85615,7 +85615,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85653,7 +85653,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85691,7 +85691,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85729,7 +85729,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85767,7 +85767,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85805,7 +85805,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85843,7 +85843,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85881,7 +85881,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85919,7 +85919,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85957,7 +85957,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -85995,7 +85995,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86033,7 +86033,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86071,7 +86071,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86109,7 +86109,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86147,7 +86147,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86185,7 +86185,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86223,7 +86223,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86261,7 +86261,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86299,7 +86299,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86337,7 +86337,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86375,7 +86375,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86413,7 +86413,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "a26befb4aef10c9887b1e26c827f0994a5ffe7ec745bb570c9e0b31dd3f2a341", @@ -86451,7 +86451,7 @@ "7c105ea32885", "3a1ce419154d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -86461,7 +86461,7 @@ "pl": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", "target_hash": "f98c7c431d25642ca8a14854b6430b8019f6a93fe1b197d6132c74340e72e693", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86474,7 +86474,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86487,7 +86487,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86500,7 +86500,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86513,7 +86513,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86526,7 +86526,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86539,7 +86539,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86552,7 +86552,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86565,7 +86565,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86578,7 +86578,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86591,7 +86591,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86604,7 +86604,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86617,7 +86617,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86630,7 +86630,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86643,7 +86643,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86656,7 +86656,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86669,7 +86669,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86682,7 +86682,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86695,7 +86695,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86708,7 +86708,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86721,7 +86721,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86734,7 +86734,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86747,7 +86747,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86760,7 +86760,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86773,7 +86773,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86786,7 +86786,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86799,7 +86799,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86812,7 +86812,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86825,7 +86825,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86838,7 +86838,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86851,7 +86851,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86864,7 +86864,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86877,7 +86877,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86890,7 +86890,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86903,7 +86903,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86916,7 +86916,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86929,7 +86929,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86942,7 +86942,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86955,7 +86955,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86968,7 +86968,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86981,7 +86981,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -86994,7 +86994,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87007,7 +87007,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87020,7 +87020,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87033,7 +87033,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87046,7 +87046,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87059,7 +87059,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87072,7 +87072,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87085,7 +87085,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87098,7 +87098,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87111,7 +87111,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87124,7 +87124,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87137,7 +87137,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87150,7 +87150,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87163,7 +87163,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87176,7 +87176,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87189,7 +87189,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87202,7 +87202,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87215,7 +87215,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87228,7 +87228,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87241,7 +87241,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87254,7 +87254,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87267,7 +87267,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87280,7 +87280,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "b159542019e7188f4ef67bac0e1e16b00ea1842d9090fac72f41ba9f7163826c", @@ -87293,7 +87293,7 @@ "57a3af4b3dd4", "abe7d026d8d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -87303,7 +87303,7 @@ "pl": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", "target_hash": "668a046b825a253a5e08e71e0ddb42d8c51ab0b7a3f9470b09a6d52d6df26540", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87319,7 +87319,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87335,7 +87335,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87351,7 +87351,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87367,7 +87367,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87383,7 +87383,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87399,7 +87399,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87415,7 +87415,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87431,7 +87431,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87447,7 +87447,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87463,7 +87463,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87479,7 +87479,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87495,7 +87495,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87511,7 +87511,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87527,7 +87527,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87543,7 +87543,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87559,7 +87559,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87575,7 +87575,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87591,7 +87591,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87607,7 +87607,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87623,7 +87623,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87639,7 +87639,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87655,7 +87655,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87671,7 +87671,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87687,7 +87687,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87703,7 +87703,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87719,7 +87719,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87735,7 +87735,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87751,7 +87751,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87767,7 +87767,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87783,7 +87783,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87799,7 +87799,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87815,7 +87815,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87831,7 +87831,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87847,7 +87847,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87863,7 +87863,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87879,7 +87879,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87895,7 +87895,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87911,7 +87911,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87927,7 +87927,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87943,7 +87943,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87959,7 +87959,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87975,7 +87975,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -87991,7 +87991,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88007,7 +88007,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88023,7 +88023,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88039,7 +88039,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88055,7 +88055,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88071,7 +88071,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88087,7 +88087,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88103,7 +88103,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88119,7 +88119,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88135,7 +88135,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88151,7 +88151,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88167,7 +88167,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88183,7 +88183,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88199,7 +88199,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88215,7 +88215,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88231,7 +88231,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88247,7 +88247,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88263,7 +88263,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88279,7 +88279,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88295,7 +88295,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88311,7 +88311,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "65285718640286f05af499143cea817a9ba75c0f436d54de030f7b2c2f9c3cf5", @@ -88327,7 +88327,7 @@ "2c5b8f9dea93", "6d6f825feca2" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -88346,7 +88346,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88360,7 +88360,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88374,7 +88374,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88388,7 +88388,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88402,7 +88402,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88416,7 +88416,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88430,7 +88430,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88444,7 +88444,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88458,7 +88458,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88472,7 +88472,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88486,7 +88486,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88500,7 +88500,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88514,7 +88514,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88528,7 +88528,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88542,7 +88542,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88556,7 +88556,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88570,7 +88570,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88584,7 +88584,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88598,7 +88598,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88612,7 +88612,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88626,7 +88626,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88640,7 +88640,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88654,7 +88654,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88668,7 +88668,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88682,7 +88682,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88696,7 +88696,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88710,7 +88710,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88724,7 +88724,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88738,7 +88738,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88752,7 +88752,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88766,7 +88766,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88780,7 +88780,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88794,7 +88794,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88808,7 +88808,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88822,7 +88822,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88836,7 +88836,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88850,7 +88850,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88864,7 +88864,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88878,7 +88878,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88892,7 +88892,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88906,7 +88906,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88920,7 +88920,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88934,7 +88934,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88948,7 +88948,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88962,7 +88962,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88976,7 +88976,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -88990,7 +88990,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89004,7 +89004,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89018,7 +89018,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89032,7 +89032,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89046,7 +89046,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89060,7 +89060,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89074,7 +89074,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89088,7 +89088,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89102,7 +89102,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89116,7 +89116,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89130,7 +89130,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89144,7 +89144,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89158,7 +89158,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89172,7 +89172,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89186,7 +89186,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89200,7 +89200,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89214,7 +89214,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89228,7 +89228,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "737cfea38aa4baf7baffbe5dc42d0140303cbba8a05f8064bf1b3c04395ffcff", @@ -89242,7 +89242,7 @@ "329375447eef", "d7f352a54df5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -89264,7 +89264,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89281,7 +89281,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89298,7 +89298,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89315,7 +89315,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89332,7 +89332,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89349,7 +89349,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89366,7 +89366,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89383,7 +89383,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89400,7 +89400,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89417,7 +89417,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89434,7 +89434,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89451,7 +89451,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89468,7 +89468,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89485,7 +89485,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89502,7 +89502,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89519,7 +89519,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89536,7 +89536,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89553,7 +89553,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89570,7 +89570,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89587,7 +89587,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89604,7 +89604,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89621,7 +89621,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89638,7 +89638,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89655,7 +89655,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89672,7 +89672,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89689,7 +89689,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89706,7 +89706,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89723,7 +89723,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89740,7 +89740,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89757,7 +89757,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89774,7 +89774,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89791,7 +89791,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89808,7 +89808,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89825,7 +89825,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89842,7 +89842,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89859,7 +89859,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89876,7 +89876,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89893,7 +89893,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89910,7 +89910,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89927,7 +89927,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89944,7 +89944,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89961,7 +89961,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89978,7 +89978,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -89995,7 +89995,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90012,7 +90012,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90029,7 +90029,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90046,7 +90046,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90063,7 +90063,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90080,7 +90080,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90097,7 +90097,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90114,7 +90114,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90131,7 +90131,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90148,7 +90148,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90165,7 +90165,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90182,7 +90182,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90199,7 +90199,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90216,7 +90216,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90233,7 +90233,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90250,7 +90250,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90267,7 +90267,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90284,7 +90284,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90301,7 +90301,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90318,7 +90318,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90335,7 +90335,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "94813fd24e7e84d0e685b4dbdc2c4efce6ea3202d6e5dfa6fc529ff5da665d28", @@ -90352,7 +90352,7 @@ "673f0d2dcc2a", "13df09b1e734" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -90376,7 +90376,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90395,7 +90395,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90414,7 +90414,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90433,7 +90433,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90452,7 +90452,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90471,7 +90471,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90490,7 +90490,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90509,7 +90509,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90528,7 +90528,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90547,7 +90547,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90566,7 +90566,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90585,7 +90585,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90604,7 +90604,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90623,7 +90623,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90642,7 +90642,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90661,7 +90661,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90680,7 +90680,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90699,7 +90699,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90718,7 +90718,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90737,7 +90737,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90756,7 +90756,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90775,7 +90775,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90794,7 +90794,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90813,7 +90813,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90832,7 +90832,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90851,7 +90851,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90870,7 +90870,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90889,7 +90889,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90908,7 +90908,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90927,7 +90927,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90946,7 +90946,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90965,7 +90965,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -90984,7 +90984,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91003,7 +91003,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91022,7 +91022,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91041,7 +91041,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91060,7 +91060,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91079,7 +91079,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91098,7 +91098,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91117,7 +91117,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91136,7 +91136,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91155,7 +91155,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91174,7 +91174,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91193,7 +91193,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91212,7 +91212,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91231,7 +91231,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91250,7 +91250,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91269,7 +91269,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91288,7 +91288,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91307,7 +91307,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91326,7 +91326,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91345,7 +91345,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91364,7 +91364,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91383,7 +91383,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91402,7 +91402,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91421,7 +91421,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91440,7 +91440,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91459,7 +91459,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91478,7 +91478,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91497,7 +91497,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91516,7 +91516,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91535,7 +91535,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91554,7 +91554,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91573,7 +91573,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "bcce13f95347d962215bc3e2985585fab0910207922c87d2262caa56a56ecd10", @@ -91592,7 +91592,7 @@ "d97d7be0b4da", "6f7a09c85a11" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -91602,7 +91602,7 @@ "pl": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", "target_hash": "08bb73bc03ff3caab4013c63d113cdd175b2ed60e1573eccd262ac5f5d08a650", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91618,7 +91618,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91634,7 +91634,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91650,7 +91650,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91666,7 +91666,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91682,7 +91682,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91698,7 +91698,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91714,7 +91714,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91730,7 +91730,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91746,7 +91746,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91762,7 +91762,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91778,7 +91778,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91794,7 +91794,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91810,7 +91810,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91826,7 +91826,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91842,7 +91842,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91858,7 +91858,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91874,7 +91874,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91890,7 +91890,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91906,7 +91906,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91922,7 +91922,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91938,7 +91938,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91954,7 +91954,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91970,7 +91970,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -91986,7 +91986,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92002,7 +92002,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92018,7 +92018,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92034,7 +92034,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92050,7 +92050,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92066,7 +92066,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92082,7 +92082,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92098,7 +92098,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92114,7 +92114,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92130,7 +92130,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92146,7 +92146,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92162,7 +92162,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92178,7 +92178,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92194,7 +92194,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92210,7 +92210,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92226,7 +92226,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92242,7 +92242,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92258,7 +92258,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92274,7 +92274,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92290,7 +92290,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92306,7 +92306,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92322,7 +92322,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92338,7 +92338,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92354,7 +92354,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92370,7 +92370,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92386,7 +92386,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92402,7 +92402,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92418,7 +92418,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92434,7 +92434,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92450,7 +92450,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92466,7 +92466,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92482,7 +92482,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92498,7 +92498,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92514,7 +92514,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92530,7 +92530,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92546,7 +92546,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92562,7 +92562,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92578,7 +92578,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92594,7 +92594,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92610,7 +92610,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0cfe583891c0196105a321f8763a1df90e8243a6a3b0567c37ef162aca16a129", @@ -92626,7 +92626,7 @@ "8dae03f7d8eb", "fcd3b8c89194" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -92636,7 +92636,7 @@ "pl": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", "target_hash": "a54965e9e0b6080d3213effb08b27cf16c62dd2e101e687f36b36777e2ea7dec", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92652,7 +92652,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92668,7 +92668,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92684,7 +92684,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92700,7 +92700,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92716,7 +92716,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92732,7 +92732,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92748,7 +92748,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92764,7 +92764,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92780,7 +92780,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92796,7 +92796,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92812,7 +92812,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92828,7 +92828,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92844,7 +92844,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92860,7 +92860,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92876,7 +92876,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92892,7 +92892,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92908,7 +92908,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92924,7 +92924,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92940,7 +92940,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92956,7 +92956,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92972,7 +92972,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -92988,7 +92988,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93004,7 +93004,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93020,7 +93020,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93036,7 +93036,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93052,7 +93052,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93068,7 +93068,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93084,7 +93084,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93100,7 +93100,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93116,7 +93116,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93132,7 +93132,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93148,7 +93148,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93164,7 +93164,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93180,7 +93180,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93196,7 +93196,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93212,7 +93212,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93228,7 +93228,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93244,7 +93244,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93260,7 +93260,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93276,7 +93276,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93292,7 +93292,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93308,7 +93308,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93324,7 +93324,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93340,7 +93340,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93356,7 +93356,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93372,7 +93372,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93388,7 +93388,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93404,7 +93404,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93420,7 +93420,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93436,7 +93436,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93452,7 +93452,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93468,7 +93468,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93484,7 +93484,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93500,7 +93500,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93516,7 +93516,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93532,7 +93532,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93548,7 +93548,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93564,7 +93564,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93580,7 +93580,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93596,7 +93596,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93612,7 +93612,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93628,7 +93628,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93644,7 +93644,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ef75ca1653a5c04d7e611da6ec9ca8c418dee73477bc1bd0d24bffcfbfd51295", @@ -93660,7 +93660,7 @@ "08f5de954bfe", "fdab43c9da71" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -93679,7 +93679,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93693,7 +93693,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93707,7 +93707,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93721,7 +93721,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93735,7 +93735,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93749,7 +93749,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93763,7 +93763,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93777,7 +93777,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93791,7 +93791,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93805,7 +93805,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93819,7 +93819,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93833,7 +93833,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93847,7 +93847,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93861,7 +93861,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93875,7 +93875,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93889,7 +93889,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93903,7 +93903,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93917,7 +93917,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93931,7 +93931,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93945,7 +93945,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93959,7 +93959,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93973,7 +93973,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -93987,7 +93987,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94001,7 +94001,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94015,7 +94015,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94029,7 +94029,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94043,7 +94043,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94057,7 +94057,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94071,7 +94071,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94085,7 +94085,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94099,7 +94099,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94113,7 +94113,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94127,7 +94127,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94141,7 +94141,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94155,7 +94155,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94169,7 +94169,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94183,7 +94183,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94197,7 +94197,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94211,7 +94211,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94225,7 +94225,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94239,7 +94239,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94253,7 +94253,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94267,7 +94267,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94281,7 +94281,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94295,7 +94295,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94309,7 +94309,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94323,7 +94323,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94337,7 +94337,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94351,7 +94351,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94365,7 +94365,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94379,7 +94379,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94393,7 +94393,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94407,7 +94407,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94421,7 +94421,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94435,7 +94435,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94449,7 +94449,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94463,7 +94463,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94477,7 +94477,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94491,7 +94491,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94505,7 +94505,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94519,7 +94519,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94533,7 +94533,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94547,7 +94547,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94561,7 +94561,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "7c88ff18be2e76c9216e00e32ffc25e6c335dabce8e13d1501e80a059e7a5d87", @@ -94575,7 +94575,7 @@ "431cd7b7d011", "53ac591b667c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -94585,7 +94585,7 @@ "pl": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", "target_hash": "52233a366aaa5f527f236b3e06ccce17f27e704061abc48140f873e0b20efd27", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94599,7 +94599,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94613,7 +94613,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94627,7 +94627,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94641,7 +94641,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94655,7 +94655,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94669,7 +94669,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94683,7 +94683,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94697,7 +94697,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94711,7 +94711,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94725,7 +94725,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94739,7 +94739,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94753,7 +94753,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94767,7 +94767,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94781,7 +94781,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94795,7 +94795,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94809,7 +94809,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94823,7 +94823,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94837,7 +94837,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94851,7 +94851,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94865,7 +94865,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94879,7 +94879,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94893,7 +94893,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94907,7 +94907,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94921,7 +94921,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94935,7 +94935,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94949,7 +94949,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94963,7 +94963,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94977,7 +94977,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -94991,7 +94991,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95005,7 +95005,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95019,7 +95019,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95033,7 +95033,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95047,7 +95047,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95061,7 +95061,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95075,7 +95075,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95089,7 +95089,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95103,7 +95103,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95117,7 +95117,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95131,7 +95131,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95145,7 +95145,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95159,7 +95159,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95173,7 +95173,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95187,7 +95187,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95201,7 +95201,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95215,7 +95215,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95229,7 +95229,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95243,7 +95243,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95257,7 +95257,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95271,7 +95271,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95285,7 +95285,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95299,7 +95299,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95313,7 +95313,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95327,7 +95327,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95341,7 +95341,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95355,7 +95355,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95369,7 +95369,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95383,7 +95383,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95397,7 +95397,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95411,7 +95411,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95425,7 +95425,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95439,7 +95439,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95453,7 +95453,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95467,7 +95467,7 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "7d08a55656e078501044a3e018a6c91adaad177a5729042637979918de70e2d8", @@ -95481,21 +95481,21 @@ "8fed20fa7764", "4759275562a5" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/guides/TROUBLESHOOTING.md": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", "locales": { "ar": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "79ce590855d24aeb238cdb4b26f09a028b8698fcc6cd017264c04dfa64e93660", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "250939e9fe100f2a7a3da6b5badf80262ac79b02ee1df8fed2113b70a12234c1", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95514,16 +95514,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "8877b2f745679120e4d4f5dc5f2e5feefc9ac589b0470ab0b12315471f544aa4", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "e5fc2e3fc2bd828f706b4098107a3624adab92c9575f365c87b4cd2100b9f9a5", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95542,16 +95542,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "9b36caebedaf88f6f19898592eeced1ce64d731e969f1e388ebf38acae942255", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "1e35860ecc3c7e504f21b171ab706aa3f72cbd4899e28e6c1baee4e0c98c3317", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95570,16 +95570,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "4e5821ecc7477b93073349d393ecbd9ed96220d32af93b70ce84d905df650f8d", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "f95642342d3e400a3c32e7af6d71e049a24117239ea5730152aee9b8659549e0", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95598,16 +95598,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "407bee848aea666d67bebd3d1c49259adbded646025f932a1234e75cfb094128", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "c122d04811bf010482e35b22bb9933a2d66e682a5efbfb4ae85d1a1d3edc1e84", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95626,16 +95626,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "93fe769d4d1e1f3309dbb1e6ecabb2a9346221013d30b0b86ef7a81659d39f14", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "3970828810aaa383a9222b839121e9e894abdf8f9a3cfe46d003ae76bbfca51c", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95654,16 +95654,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "a46535f942ee5f364da88e268d7403231878594dcff4a30a5b580bdd36df125a", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "e69f1d782e3589a0866f146f9b3972727db87c5dad6fd0c5f15f50e9e39461d0", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95682,16 +95682,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "10170b13bbd0f9aead50056692b5f72c37e9f73059288b75d43ef5e1452d6bab", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "39b5c1bddef0b629c56901aad7bc4f602f4c47d051f746294f01f9a8597f3bdb", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95710,16 +95710,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "a15bc7a0fd97b0e340e4ff31c493589899a66db3c71f2fcee5d04a32e00ea0b5", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "7d2e58aad1c72fdd4e72e3eee98ddac22581dd515189f2f65115879c6bbdb995", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95738,16 +95738,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "b5912d0ef1e4db85a1249d0910207b1a09e77b2e82cd50f023d4c8b8d1ce900e", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "ac6344cbba18c1819c0cf9b63292530862aaf9faf2386b50870106a8cef91cd7", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95766,16 +95766,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "4d08fdee7831cda80d54aad4295597358c7b8b8d0d607ae00889c4639aecd5e9", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "510d8f82d6e090adb3bf5259bfe9fbd49c7122dbc4f358c19388ef997c33cf81", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95794,16 +95794,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "c16897678318c3d45e4ebe9aa0802fd3de3a013d90a946f8bdf97030b8513f53", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "c75cfb1f8e9cf3664cd094db04972c73231b250c8a68193cd18ac554bcc6e00f", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95822,16 +95822,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "e555c81dd9fa3953116eb53e8c7a56da19d2d6996eac78ac7fdd97d2452205e0", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "0c063dea4f8f7c92fd4e751608fcfa3ab1da829fd3cc4bd6276f74c53f8d573b", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95850,16 +95850,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "2c5cfbe484032b75691862ad12fd1fc3a3651875d9cae581f6171da6dad7149d", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "831dbaecabf97107882be3b387a092868615724fc291de71e9c47abdcbf53d87", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95878,16 +95878,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "fb0fcff004da66c00c028d3364c13fff7829a60d0c2f48237d0767eb3d329969", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "fef898fb8fa8a3f2c52152decf892b0491ca0105db7f010e0b34e434b12434b8", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95906,16 +95906,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "405e787e104334331939aee45da052196be7f3fb1e30283878dba7e8b8e64894", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "45068d8c49a7f3dd30e631fb0c43fd87d50c829d774c3ae2922030c3b82e395f", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -95934,7 +95934,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -95962,7 +95962,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -95990,7 +95990,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96018,7 +96018,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96046,7 +96046,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96074,7 +96074,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96102,7 +96102,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96130,7 +96130,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96158,7 +96158,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96186,7 +96186,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96214,7 +96214,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96242,7 +96242,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96270,7 +96270,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96298,7 +96298,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96326,7 +96326,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96354,7 +96354,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96382,7 +96382,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96410,7 +96410,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96438,7 +96438,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96466,7 +96466,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96494,7 +96494,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96522,7 +96522,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96550,7 +96550,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96578,7 +96578,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96606,7 +96606,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96634,16 +96634,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "2478618ed22be72723c42cdbb4ec4443a6a81dccecc5ef47c140ea1eb5e1efa5", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "2a26ee242ff23662fd82f13617f34af1e214eafc1414da0c732599ae2cf0d61b", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -96662,16 +96662,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "2a8ef5d56465a3ed022601bea7ef6ece9a948fee157078f6e5b3d5b4656ab6a5", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "0842fbefec612281a046545d3ec771d1e06318d8fc8cbb3a031b295d229bada0", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -96690,7 +96690,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96718,7 +96718,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96746,16 +96746,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "b2e427c14a957d1bf6359c3ec43e08d53b17e7f66c2012957edab39851e8263e", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "0e5e2690200e596d568a3619ed4a9c8d85fcc5c2dd6fe3148777eb4520028044", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -96774,7 +96774,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96802,7 +96802,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96830,7 +96830,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96858,16 +96858,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "1b288ee0a8fb7478815929794dc7b3c19344fd9b437a430dc52fa8f0c0c8ed65", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "89fd5e2c0359eda12b3f6cfce413782cbb8557f494ada0273233a0121e577070", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -96886,7 +96886,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96914,7 +96914,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96942,7 +96942,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96970,7 +96970,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -96998,7 +96998,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97026,7 +97026,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97054,7 +97054,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97082,7 +97082,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97110,16 +97110,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "ff768ba688d65c2bcfe6a6f4b18a0627131a11d29995172864fdc9f6e7c6cfd4", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "28cb462a28684536b33a69ec9f01b5fddbf1e22c6b89c5c525c2670df15ebb5e", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -97138,7 +97138,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97166,7 +97166,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97194,16 +97194,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "728eda290ce16d6f853377ce20d7d794909b1efbb74d6ec67417fe6c21e3da94", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "1624a5ee41b4c9c2151cadf171a44d30f7adb65bb3bb33f71edb1d52d68ca7bc", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -97222,7 +97222,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97250,7 +97250,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", @@ -97278,16 +97278,16 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "b26d8cc672c6ce7a202ae365eaaf083a2c7a28bde27cf646a47d0bfacb25eeec", - "target_hash": "6c1c019d789084289b286ebe579ecde97a83fbe966b42f558b11c12609853ff4", + "source_hash": "c86745d811538040892b67108a4cfaf3b86923ca787aa1cf73b47e929772fc0d", + "target_hash": "80443dfa36ee90ca5600dc7aa66590508d0e815cb72419f99c6efbe090096a98", "section_hashes": [ "cfc399882022", "c7474daef255", "b3db12b2f55a", - "6820e58845ba", + "2cb469fb70b8", "72594f4fc095", "e192ff47ce38", "4e7abf9bc399", @@ -97306,7 +97306,7 @@ "ce2a7cf04f26", "24fb64d37981" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -97323,7 +97323,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97335,7 +97335,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97347,7 +97347,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97359,7 +97359,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97371,7 +97371,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97383,7 +97383,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97395,7 +97395,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97407,7 +97407,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97419,7 +97419,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97431,7 +97431,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97443,7 +97443,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97455,7 +97455,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97467,7 +97467,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97479,7 +97479,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97491,7 +97491,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97503,7 +97503,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97515,7 +97515,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97527,7 +97527,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97539,7 +97539,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97551,7 +97551,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97563,7 +97563,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97575,7 +97575,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97587,7 +97587,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97599,7 +97599,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97611,7 +97611,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97623,7 +97623,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97635,7 +97635,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97647,7 +97647,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97659,7 +97659,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97671,7 +97671,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97683,7 +97683,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97695,7 +97695,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97707,7 +97707,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97719,7 +97719,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97731,7 +97731,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97743,7 +97743,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97755,7 +97755,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97767,7 +97767,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97779,7 +97779,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97791,7 +97791,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97803,7 +97803,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97815,7 +97815,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97827,7 +97827,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97839,7 +97839,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97851,7 +97851,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97863,7 +97863,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97875,7 +97875,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97887,7 +97887,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97899,7 +97899,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97911,7 +97911,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97923,7 +97923,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97935,7 +97935,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97947,7 +97947,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97959,7 +97959,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97971,7 +97971,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97983,7 +97983,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -97995,7 +97995,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98007,7 +98007,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98019,7 +98019,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98031,7 +98031,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98043,7 +98043,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98055,7 +98055,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98067,7 +98067,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98079,7 +98079,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ee4735ce48416a0c64fe6e0541ca54cc6e0d491ffdc9ab690ca78d944078ef6d", @@ -98091,7 +98091,7 @@ "61d53d9c4c97", "85fb5e897f2f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -98101,7 +98101,7 @@ "pl": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", "target_hash": "4dc20653aa4492340ce36b8f511af8680f87e11a5181d801a606d0c8c872492a", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98113,7 +98113,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98125,7 +98125,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98137,7 +98137,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98149,7 +98149,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98161,7 +98161,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98173,7 +98173,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98185,7 +98185,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98197,7 +98197,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98209,7 +98209,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98221,7 +98221,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98233,7 +98233,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98245,7 +98245,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98257,7 +98257,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98269,7 +98269,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98281,7 +98281,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98293,7 +98293,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98305,7 +98305,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98317,7 +98317,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98329,7 +98329,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98341,7 +98341,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98353,7 +98353,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98365,7 +98365,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98377,7 +98377,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98389,7 +98389,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98401,7 +98401,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98413,7 +98413,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98425,7 +98425,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98437,7 +98437,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98449,7 +98449,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98461,7 +98461,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98473,7 +98473,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98485,7 +98485,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98497,7 +98497,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98509,7 +98509,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98521,7 +98521,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98533,7 +98533,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98545,7 +98545,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98557,7 +98557,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98569,7 +98569,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98581,7 +98581,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98593,7 +98593,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98605,7 +98605,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98617,7 +98617,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98629,7 +98629,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98641,7 +98641,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98653,7 +98653,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98665,7 +98665,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98677,7 +98677,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98689,7 +98689,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98701,7 +98701,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98713,7 +98713,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98725,7 +98725,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98737,7 +98737,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98749,7 +98749,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98761,7 +98761,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98773,7 +98773,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98785,7 +98785,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98797,7 +98797,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98809,7 +98809,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98821,7 +98821,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98833,7 +98833,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98845,7 +98845,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98857,7 +98857,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "d286daf2055a2ad6e0979ebbf3296968ef02734e8fa9a6b2dbbaae729cf2923e", @@ -98869,7 +98869,7 @@ "4f09146dc8b8", "833ac169895b" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -98900,7 +98900,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -98926,7 +98926,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -98952,7 +98952,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -98978,7 +98978,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99004,7 +99004,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99030,7 +99030,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99056,7 +99056,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99082,7 +99082,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99108,7 +99108,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99134,7 +99134,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99160,7 +99160,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99186,7 +99186,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99212,7 +99212,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99238,7 +99238,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99264,7 +99264,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99290,7 +99290,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99316,7 +99316,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99342,7 +99342,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99368,7 +99368,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99394,7 +99394,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99420,7 +99420,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99446,7 +99446,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99472,7 +99472,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99498,7 +99498,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99524,7 +99524,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99550,7 +99550,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99576,7 +99576,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99602,7 +99602,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99628,7 +99628,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99654,7 +99654,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99680,7 +99680,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99706,7 +99706,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99732,7 +99732,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99758,7 +99758,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99784,7 +99784,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99810,7 +99810,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99836,7 +99836,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99862,7 +99862,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99888,7 +99888,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99914,7 +99914,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99940,7 +99940,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99966,7 +99966,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -99992,7 +99992,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100018,7 +100018,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100044,7 +100044,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100070,7 +100070,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100096,7 +100096,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100122,7 +100122,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100148,7 +100148,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100174,7 +100174,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100200,7 +100200,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100226,7 +100226,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100252,7 +100252,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100278,7 +100278,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100304,7 +100304,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100330,7 +100330,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100356,7 +100356,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100382,7 +100382,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100408,7 +100408,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100434,7 +100434,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100460,7 +100460,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100486,7 +100486,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100512,7 +100512,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100538,7 +100538,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "cb45a5bfc71160ec5a0995b03e2e80b22332add63685c4884a34771b7864c594", @@ -100564,7 +100564,7 @@ "0fe355b3aaaa", "8af1252b116a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -100583,7 +100583,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100597,7 +100597,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100611,7 +100611,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100625,7 +100625,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100639,7 +100639,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100653,7 +100653,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100667,7 +100667,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100681,7 +100681,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100695,7 +100695,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100709,7 +100709,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100723,7 +100723,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100737,7 +100737,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100751,7 +100751,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100765,7 +100765,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100779,7 +100779,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100793,7 +100793,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100807,7 +100807,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100821,7 +100821,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100835,7 +100835,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100849,7 +100849,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100863,7 +100863,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100877,7 +100877,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100891,7 +100891,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100905,7 +100905,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100919,7 +100919,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100933,7 +100933,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100947,7 +100947,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100961,7 +100961,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100975,7 +100975,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -100989,7 +100989,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101003,7 +101003,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101017,7 +101017,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101031,7 +101031,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101045,7 +101045,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101059,7 +101059,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101073,7 +101073,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101087,7 +101087,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101101,7 +101101,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101115,7 +101115,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101129,7 +101129,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101143,7 +101143,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101157,7 +101157,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101171,7 +101171,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101185,7 +101185,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101199,7 +101199,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101213,7 +101213,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101227,7 +101227,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101241,7 +101241,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101255,7 +101255,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101269,7 +101269,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101283,7 +101283,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101297,7 +101297,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101311,7 +101311,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101325,7 +101325,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101339,7 +101339,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101353,7 +101353,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101367,7 +101367,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101381,7 +101381,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101395,7 +101395,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101409,7 +101409,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101423,7 +101423,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101437,7 +101437,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101451,7 +101451,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101465,7 +101465,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "bcf155d5508003d6e7495bf3370c5b844b6d1ed5a4efb547fbf5835de63d5816", @@ -101479,7 +101479,7 @@ "e6b8adddb94e", "76c9ca7dbe9d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -101489,7 +101489,7 @@ "pl": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", "target_hash": "b241220481a7462bfa14828420e552ca1307ba063d0e650987dce889e6e06a74", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101502,7 +101502,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101515,7 +101515,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101528,7 +101528,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101541,7 +101541,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101554,7 +101554,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101567,7 +101567,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101580,7 +101580,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101593,7 +101593,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101606,7 +101606,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101619,7 +101619,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101632,7 +101632,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101645,7 +101645,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101658,7 +101658,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101671,7 +101671,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101684,7 +101684,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101697,7 +101697,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101710,7 +101710,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101723,7 +101723,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101736,7 +101736,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101749,7 +101749,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101762,7 +101762,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101775,7 +101775,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101788,7 +101788,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101801,7 +101801,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101814,7 +101814,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101827,7 +101827,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101840,7 +101840,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101853,7 +101853,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101866,7 +101866,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101879,7 +101879,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101892,7 +101892,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101905,7 +101905,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101918,7 +101918,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101931,7 +101931,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101944,7 +101944,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101957,7 +101957,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101970,7 +101970,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101983,7 +101983,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -101996,7 +101996,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102009,7 +102009,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102022,7 +102022,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102035,7 +102035,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102048,7 +102048,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102061,7 +102061,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102074,7 +102074,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102087,7 +102087,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102100,7 +102100,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102113,7 +102113,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102126,7 +102126,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102139,7 +102139,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102152,7 +102152,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102165,7 +102165,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102178,7 +102178,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102191,7 +102191,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102204,7 +102204,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102217,7 +102217,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102230,7 +102230,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102243,7 +102243,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102256,7 +102256,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102269,7 +102269,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102282,7 +102282,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102295,7 +102295,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102308,7 +102308,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "aeb3c53a79cb1c6ca5b95cf409936b69d407dfef3d5d8d17e91194fb732fbb78", @@ -102321,7 +102321,7 @@ "93434f5a50f8", "2250a5c7f534" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -102331,391 +102331,391 @@ "pl": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "fd3960a9fd856c353b32469937b14e63debc07f764791144f887b5636262e880", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "7e7f0fe1a03279d28b73b7833ec9a76bad68f00eef1ff63007cfd8d3ac43080a", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "f28350242533311720bb775fe9c8c1cf1e6a450ac06a20c401593b5f62e56acb", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "50e2c9a65e583d387b664d2ffb530710ee9ae33990d7dc70e8d0de6b9f84170a", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "4ab6449d972a1ff2db52c5c6905b01d81a919bd5f5379d23a085f61a4056597e", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "dac35538a1a5074012d20d12ca46516249e35c03cefec22479fb14488aebb445", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "4d417a5b0ca380a4f2acee64c82280987d096808ee78126d7f240817db7166e7", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "46dde827c7d50f2bd3f55142ddb5ff0d4353fbb71f2d2329ffef3776da707b20", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "26592478673ccad01f8038b66d2cb0672ca84a29a4e47dd04bf64f30847fe689", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "54f041357f7bc3a922af65b1f0acf5437801747529ffc1da53ddb2ab291f8add", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "5db386bc9ef2f0231d552a30bc74730d41e20e4c1263003c2c002966017ac43c", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "979e6de0199b135d7ac1fb3a464af603bd5beaab7d1a8733c8348fcf1a763e11", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "0662b8c00a66f99088b216d86de2df0ebcc5d04c81ec624011274f71b0faf89c", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "1ae2675bc4728a136076c4de3018f80afd5da6453ae26194322d7debb2347b28", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "09ad07864bc3aef3203a5c40fba5e145280329654d222f323f64d590529836c7", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "ffcaa69c0786c6702e78fad2f12bb35c4044373af6ae4dc8ae63267e6ea4f4ab", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "d575b4447d1ac3c1f103f5140112b64bd4c64a621984e49ce458ad5bf9fcde6b", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "d684d951e3714bd7697fa481987b519a7c6460304ee5ecebd19f43fd43564ddf", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "b07bc74defac3ffac46d187b1040db7b2ebafc491029e787496bee370ba843c5", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "b8b9f73b66140db151c5cdca3d62727de13177f284cde6492e0e14c941475d8f", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "0efcb1dc7cb1f007631ebd64785f521f55a7a09751170a913a1b8c6b0b6d062d", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "b0626d8be310f2ac6c97bdcee49348939acad332567fe83f250be9650bfa5cb0", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "6edbd3fdbb1a564ae2a6cf24ea5d39fbc180a736d43c09de33d701dba89526da", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "bf58bae2ed2352d46117193402894eb92642130e3ad7051df27313dcadf4c3a4", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "fafc66dd027f6fc65f5b677245b1bab20231fb3fe405cbf8ee4f0006b3b59feb", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "84b16e16209cab11ca8da85baa288ba08bab3a55be2bdf04f35685b8d05b666c", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "3221aa424fa96b22955c759940a0064742d929d036e1807e3265de580e8ccc6e", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "77f6ee6d1a76f3e25f703d9c5a467cf29eec78774428b6dc8aeb853b9cd4cab2", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "62e68848225be7535c08bec62a7a5574fe8a35d5b9e2e28fbdd3a7b6da1b3a95", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "e8f0814070054f538ad940b6beb8a614a989168356ebdcdcc4aad4614bc33301", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "8a631e4a87a11a886de342bf00b642ed2c7f6c955cd4ca21d142e7a4529e3576", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "74a7b14865b8d873dfc596005d283cf7f1593e29234c7236252a016ffcaa2e86", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "e1c237377ec4ee8c9aaf0ff1352a09dfd1783c6c87104567e83163567883a1b5", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "93991ff148b5bf718b2c7044d187038660274aa23013bdbc02d908bac467a173", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "bb7a0e5bf80319d0dfb31cad6f48f7729dc78522b38c872a36adab720dd7074a", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "be91c311dc997bf9f7b6b0fcf4e59e96afedd27376d191c23f9c20d79ce771aa", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "61978ff87a94c2c581c0a8d36702fbd2665e65b8182cc6e11d6df11d0900f628", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "be013d8d9de77338b496f1b84adb5f694ab6e6bd487aac15bccd932e032f8870", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "ffe02b9c82cba53cb3716201351e18438f3d70d9c9817da7f167cf489003a9f3", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "3ae7e63c5a2cd8b17512a3b8427b72a1964953c977d27ee419e15e45c66f4452", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "6c1b175b7a349be8bf53ba34cea6f800336e6040819b9ee2c26d36412132a88e", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "469d6e557f0cfc2681f2e4ceab63422c4c2ee5357ffa0092d39c4579b33c24c3", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "99466a126d30f99aa5bce0629d112c6da42174c039d07af95c61c090059c92f9", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "c209660c6c6145e1e7370c795f86277c417b580f3cb707dbc1afb7aba126aefa", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "5d6ddcf1180d0e9f9497b6e0032fdf6f8a4bd69b73d0a64fbc20134dc3c0534c", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "5cc6e5045f2f2a848017b0dd07eb6c678b85dd1a69a1e7b351bb1acfa47c4b26", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "fbba9f0481717f8b0113e47bafda4bbee4c0bd958ec15d5d0cf2a3cd2e767bc9", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "ba9231e12814ce89fbe029aad37fbc889cbb004406dc9bfa60a986c8750b5fab", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "0e182faf5eb510c64a3ff4ac9e76e99488e051e19f450ad860ed84ae9a671095", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "1f6bdf55db748fce0505913493cb240f756f21cc244e1b87a172d4c5fc3483b4", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "e1876a6a1648371cdc17f9d808c9db16791a39ab6e8e56f7f01d70c828aaedd9", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "becb4f4555b0fed18baf40448d3293a0f50d179698f873541c829d694d80f12c", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "201192e967fe5a239c3f4531453a767207afb79a82d606243b7967ffb32f27ce", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "6de51d9a001cc05a69c48012cda5d35d52f5913a24d5d4a9b6cdd8bbdc4b4735", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "202e481f6ba757c09c980cc44cc3def2721076c31298f6c3a9c116d3522e325f", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "21ecec1b5ab02eec089a3bdb08f832e882324de8b7ef6052f917ca4685881a57", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "44385ccca4d4bff688d19251f89e3f4e8523f48a87b6099cea753a880ddabc6a", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "5bea13f62bad0731094f8bddce8cd4f62c2698723b515e6276e30d0ce66b859a", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "0253c4ca81e118a389f40ac7578b4e861f15a9ae9c3a345a0518b460802a8c1d", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "3cadad119367bbc155e49e759e7412843a66b5190b785a4fe1759786e7ba4558", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "2223c43f8f770b4b5fc4e6954edc9458a8a5d9e32b07d15c8202e9cb8f301c68", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "a04ecd36eec2de6f67b7a5170471f3478551d3e2ea11e0c8e9e830319d446bd6", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "e9315609cf1747e0d3b6b5c32c3fe4404aa1b15c9302154972d9f815a3086fd4", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "0bc7d79e96a5f83509b7539fa7a70ea718efef3d36b97e3c41a66cc3875f2d80", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e1ce17414e65ba12c6a49d18149cf61d2b84d89a50e32df41a67a8a409f1816a", "target_hash": "375e1842750583d9b47a9559f951b90fd66c528a1155431c7a3e85601e0195c8", "section_hashes": ["8092d72df715"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -102732,7 +102732,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102744,7 +102744,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102756,7 +102756,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102768,7 +102768,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102780,7 +102780,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102792,7 +102792,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102804,7 +102804,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102816,7 +102816,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102828,7 +102828,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102840,7 +102840,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102852,7 +102852,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102864,7 +102864,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102876,7 +102876,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102888,7 +102888,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102900,7 +102900,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102912,7 +102912,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102924,7 +102924,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102936,7 +102936,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102948,7 +102948,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102960,7 +102960,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102972,7 +102972,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102984,7 +102984,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -102996,7 +102996,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103008,7 +103008,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103020,7 +103020,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103032,7 +103032,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103044,7 +103044,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103056,7 +103056,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103068,7 +103068,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103080,7 +103080,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103092,7 +103092,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103104,7 +103104,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103116,7 +103116,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103128,7 +103128,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103140,7 +103140,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103152,7 +103152,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103164,7 +103164,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103176,7 +103176,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103188,7 +103188,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103200,7 +103200,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103212,7 +103212,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103224,7 +103224,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103236,7 +103236,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103248,7 +103248,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103260,7 +103260,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103272,7 +103272,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103284,7 +103284,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103296,7 +103296,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103308,7 +103308,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103320,7 +103320,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103332,7 +103332,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103344,7 +103344,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103356,7 +103356,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103368,7 +103368,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103380,7 +103380,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103392,7 +103392,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103404,7 +103404,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103416,7 +103416,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103428,7 +103428,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103440,7 +103440,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103452,7 +103452,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103464,7 +103464,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103476,7 +103476,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103488,7 +103488,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "c2e19e8fc37c85ff85c24c4d638066e86bcf1eb784b06a1cc52c4ad2b51c063c", @@ -103500,7 +103500,7 @@ "0e1c707b80db", "c0414f8ead81" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -103521,7 +103521,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103537,7 +103537,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103553,7 +103553,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103569,7 +103569,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103585,7 +103585,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103601,7 +103601,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103617,7 +103617,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103633,7 +103633,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103649,7 +103649,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103665,7 +103665,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103681,7 +103681,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103697,7 +103697,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103713,7 +103713,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103729,7 +103729,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103745,7 +103745,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103761,7 +103761,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103777,7 +103777,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103793,7 +103793,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103809,7 +103809,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103825,7 +103825,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103841,7 +103841,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103857,7 +103857,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103873,7 +103873,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103889,7 +103889,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103905,7 +103905,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103921,7 +103921,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103937,7 +103937,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103953,7 +103953,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103969,7 +103969,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -103985,7 +103985,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104001,7 +104001,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104017,7 +104017,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104033,7 +104033,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104049,7 +104049,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104065,7 +104065,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104081,7 +104081,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104097,7 +104097,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104113,7 +104113,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104129,7 +104129,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104145,7 +104145,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104161,7 +104161,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104177,7 +104177,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104193,7 +104193,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104209,7 +104209,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104225,7 +104225,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104241,7 +104241,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104257,7 +104257,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104273,7 +104273,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104289,7 +104289,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104305,7 +104305,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104321,7 +104321,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104337,7 +104337,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104353,7 +104353,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104369,7 +104369,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104385,7 +104385,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104401,7 +104401,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104417,7 +104417,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104433,7 +104433,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104449,7 +104449,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104465,7 +104465,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104481,7 +104481,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104497,7 +104497,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104513,7 +104513,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104529,7 +104529,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "c4baff7b3acbf3851df536092938b2d75b15c1ea374a7a8d55b8a7d08f72f775", @@ -104545,7 +104545,7 @@ "0368fb6ed20e", "6d1c856e73a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -104573,7 +104573,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104596,7 +104596,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104619,7 +104619,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104642,7 +104642,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104665,7 +104665,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104688,7 +104688,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104711,7 +104711,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104734,7 +104734,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104757,7 +104757,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104780,7 +104780,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104803,7 +104803,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104826,7 +104826,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104849,7 +104849,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104872,7 +104872,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104895,7 +104895,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104918,7 +104918,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104941,7 +104941,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104964,7 +104964,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -104987,7 +104987,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105010,7 +105010,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105033,7 +105033,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105056,7 +105056,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105079,7 +105079,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105102,7 +105102,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105125,7 +105125,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105148,7 +105148,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105171,7 +105171,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105194,7 +105194,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105217,7 +105217,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105240,7 +105240,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105263,7 +105263,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105286,7 +105286,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105309,7 +105309,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105332,7 +105332,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105355,7 +105355,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105378,7 +105378,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105401,7 +105401,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105424,7 +105424,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105447,7 +105447,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105470,7 +105470,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105493,7 +105493,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105516,7 +105516,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105539,7 +105539,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105562,7 +105562,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105585,7 +105585,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105608,7 +105608,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105631,7 +105631,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105654,7 +105654,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105677,7 +105677,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105700,7 +105700,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105723,7 +105723,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105746,7 +105746,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105769,7 +105769,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105792,7 +105792,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105815,7 +105815,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105838,7 +105838,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105861,7 +105861,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105884,7 +105884,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105907,7 +105907,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105930,7 +105930,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105953,7 +105953,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105976,7 +105976,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -105999,7 +105999,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -106022,7 +106022,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "19a460c34885bacb6c2dc3494aba5da8f252b3c4bec0e51f773f8ea15e8fccc6", @@ -106045,7 +106045,7 @@ "1089ca6126f2", "86d5fe5203ea" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -106072,7 +106072,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106094,7 +106094,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106116,7 +106116,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106138,7 +106138,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106160,7 +106160,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106182,7 +106182,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106204,7 +106204,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106226,7 +106226,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106248,7 +106248,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106270,7 +106270,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106292,7 +106292,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106314,7 +106314,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106336,7 +106336,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106358,7 +106358,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106380,7 +106380,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106402,7 +106402,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106424,7 +106424,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106446,7 +106446,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106468,7 +106468,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106490,7 +106490,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106512,7 +106512,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106534,7 +106534,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106556,7 +106556,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106578,7 +106578,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106600,7 +106600,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106622,7 +106622,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106644,7 +106644,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106666,7 +106666,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106688,7 +106688,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106710,7 +106710,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106732,7 +106732,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106754,7 +106754,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106776,7 +106776,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106798,7 +106798,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106820,7 +106820,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106842,7 +106842,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106864,7 +106864,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106886,7 +106886,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106908,7 +106908,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106930,7 +106930,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106952,7 +106952,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106974,7 +106974,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -106996,7 +106996,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107018,7 +107018,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107040,7 +107040,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107062,7 +107062,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107084,7 +107084,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107106,7 +107106,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107128,7 +107128,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107150,7 +107150,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107172,7 +107172,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107194,7 +107194,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107216,7 +107216,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107238,7 +107238,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107260,7 +107260,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107282,7 +107282,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107304,7 +107304,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107326,7 +107326,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107348,7 +107348,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107370,7 +107370,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107392,7 +107392,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107414,7 +107414,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107436,7 +107436,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107458,7 +107458,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "bea4a7166194e8ed25e75d91deb2cff7f6e370abad1265258b60ffdcb193980a", @@ -107480,7 +107480,7 @@ "c7bc1f48d98a", "9acad70ca7b7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -107490,7 +107490,7 @@ "pl": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", "target_hash": "d060915ce0cbb2842411aae6556f4c8e9fde60e8cec8600d003422bd7d1f93e8", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107504,7 +107504,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107518,7 +107518,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107532,7 +107532,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107546,7 +107546,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107560,7 +107560,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107574,7 +107574,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107588,7 +107588,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107602,7 +107602,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107616,7 +107616,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107630,7 +107630,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107644,7 +107644,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107658,7 +107658,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107672,7 +107672,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107686,7 +107686,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107700,7 +107700,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107714,7 +107714,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107728,7 +107728,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107742,7 +107742,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107756,7 +107756,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107770,7 +107770,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107784,7 +107784,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107798,7 +107798,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107812,7 +107812,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107826,7 +107826,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107840,7 +107840,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107854,7 +107854,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107868,7 +107868,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107882,7 +107882,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107896,7 +107896,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107910,7 +107910,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107924,7 +107924,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107938,7 +107938,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107952,7 +107952,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107966,7 +107966,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107980,7 +107980,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -107994,7 +107994,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108008,7 +108008,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108022,7 +108022,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108036,7 +108036,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108050,7 +108050,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108064,7 +108064,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108078,7 +108078,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108092,7 +108092,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108106,7 +108106,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108120,7 +108120,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108134,7 +108134,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108148,7 +108148,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108162,7 +108162,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108176,7 +108176,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108190,7 +108190,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108204,7 +108204,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108218,7 +108218,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108232,7 +108232,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108246,7 +108246,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108260,7 +108260,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108274,7 +108274,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108288,7 +108288,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108302,7 +108302,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108316,7 +108316,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108330,7 +108330,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108344,7 +108344,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108358,7 +108358,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108372,7 +108372,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0a1423feb85f8acd9debac07f716b65e06eaef8b222038d90d12b9823fe19c94", @@ -108386,7 +108386,7 @@ "010e6473d4ca", "2d8c1c27b184" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -108396,391 +108396,391 @@ "pl": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "4bde081f2a64813a33d7c174277bfba89af65d590e93c09339619bc68ad6bbe9", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "0630ac628dfae82d4881225e91f195b3926e70655d35977d39c20a8d55e1d119", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "e09e4ad55fb3e3e01f378651bda95fc0c482b5aacc2edded5ce65e0082232a6d", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "ba6be570611b90ef7c4a4390e35eb79a9914b2cabfd9a3627b1e690977cae320", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "8e3cd1c2dacc79c9734cbee2d5376568f2a428a7d6a6300040771d904e2f12a7", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "fc1aa361c3c8c449621575cf40887fd73adadf3b77f171441e3ae02acacc736a", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "ee53fda448870cedf1f6d26a0ebfe1384b6fa8e7e9492cd5e3e1b53321cd5c2f", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "31b64494f890d8106d00bbb208499c4475891ae401bf1bfb8b407ab87c55ac53", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "11fb12100fc5fecb39beb3e98afabc8b6382a659b21d40357c285f042f239fd9", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "a746acfb1ec8e9657cfb3b0ec67903cd12cf835746d166bb82326252668ca9aa", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "1b0bc9b40c0869203bafa886f1ec2658529929ae5d8ab7ccda7a8e865e4a6e9e", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "be15aab3e866535ee06c4fb7f46fe43b6c341a3966633c52310131f6526b586b", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "e96123602c4b8c95a94c6391b519cfcbf6620a270d3a2de5266f8d3be7ef0749", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "2d5575455191a3d892fcbaefd917486bc4f1bcd98dbbe81bbfe7809ad9a97014", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "d164c326785e3ab1cedc9545d04b2b553f14598949d10d5ef65872cdcffcdede", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "aac69b03155a4bfab228a76354761f8c67c54ebb1a4260f8f5634ea4b450141e", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "86b3c793f996f06a751c24a46764207ce12befd58182176feee2b09e0f096d09", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "375effa48c360fa38603b0ea72733ff513311dde52f2f73ff19e0fad4e58f0c1", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "9117497dd98a28fdbe21e3e12d5289ef8c80a3a201033042ab5e17021f91b0fe", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "fb62c5f1ae598636bf1be749e11ea3d11b9706dea54ea4d135f7fa4e1efc22b6", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "c74cc148e4c5a91019f8215874de67b54e3db9bb7ef29fa0ce1912980e2c9d83", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "9d4e0fff9ca2cf0cc2b0be0b82a664279fd6a8a4e4a59983866946c0da66363a", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "9e4cdbe5a459214d651fb4d0d759bf2a4e5a15f93bd59309d9f36af457187579", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "1e56cde18dc3fcd6a6db056592fe59e3a5ff749437ba168f364111433db742cd", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "001065143d5faf0be3831a0b565c002c7f5048a2e177913bd338f9a4b2fcc2a6", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "258171fdb2c8223ff13b5b1063cd74596a1c3ff9416ae0582d3acd98e8d212f4", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "a436c71263fb8bf67457c34ab89bd565c181857641b527d31a0f933a2317e10e", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "63911c66ec28cbb38e9b3b33815934dc859323a30affe0ae3880e1e48056263e", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "d0f14158efd9acfc7c8e35c235ae3deba63062f78cf4364f72c59cb6362fba46", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "a3cf97f51483d1582265bb49519d7ae8e62d59f8c1ecea1f802db6f3e755bf9d", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "b190d663520a2f2ca45472329b5fe17c2a05c3446f97564a0903d1dcf2d06cf0", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "fe955f9022d6f288a0baeeebe6df4cf04c5276d6262b81ad340c55f926bce4aa", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "d5a416cf5bd2db1a945bda3b382c3d0c59235118863743858c989f46c61903e5", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "4ed40bd08f1a73471c36f0dbead59ec079286ff79dc10ce84c0d4ee799acb1ff", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "8e8291dd2ee8fc752be858ead770e1ad717c6921266243b5613e7c9360286fe1", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "0c7dbb930266b9e2ea13a18aaf9e793fbb6da2fa7f7013b045e991d37030a8a4", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "e11535e7a60342f7e3fae1c84fc012b01259898aa36bb5b7c68c88760454e4e4", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "f1dcd424edf39ea53a9ca37220a2c3cd614b050b3b0b10fcea1b98f3d2fc3b60", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "1de0761a8f775c8e85dd0597372289d8c1912a0db278bc87ba7edf62fda248a0", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "421eb18ec11943021f4bc7fc7115b2c550a4e01fa04be5adeabc758f70772180", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "32680690ed983d9aaf236f85473b1dd345d5439b6b6b2654b79b3f76494ac596", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "99cc82f2d2e26521a7e04f9f99eb4eb71297acbc7af929c1263aabac6c732e2d", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "c48f0e914c2c15ebb5a021c9c3f4c03c90b14d1bb1f64b2b7e84160167bdd3c0", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "2a5b8c960b2482eb05bd77ada91246dc384ca99c016b0f7aad4f795bfa94fc0f", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "641739f182d8bc312aab3a230a585c3800cb7f5e765ec0e4f27e6dd8d0ebdfc3", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "646aeef4dd7a567c05b51b4ef88890c73a1f6d4cc2ffef772b4f4bf48ae42c58", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "d4ece1e8ebe2db4b8a0838b7e28b528477132ad5992ebdfa3cea526156ad17b8", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "b5974f56d21adf7ac8977b60c0a1865f9f00110e340562f4c4b1c8ffe512988c", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "da91788e3e60c31f1a97b33b0d671769aabbe5d4bd5c84c02c92cfb6c5172ed9", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "ac867f756056abf2182af6b8f75722092ef91249f35e6fbb0617fd150ba6f20f", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "bf5c5a79535304ad03de4e93f81d1150c0dc9e04467495c208094109f4c7a1a5", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "d0deb8b46a0a8ff911a2500b9d1a20904acc321add69c32ca870ed32999914c8", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "7c47da8cc7ec92114afcb954a16659da453608e27ea425ddfaa9db5b7d541d9b", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "0c6f94f3192b8fa1e650cca1a401fdf1391ec41ea6b7076076c49f64abd895c1", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "d72387d456a1eb4cd83505c60848efd86a7c55c0870586d8f4a5c56a1dcd4ab3", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "3274f95d2e0d0814af5f6fba2140a5a89d3041afbf514ed755eee343a4dff2b8", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "75d33f2317967cd64e3505c7f8638ec21c1b9bbce259a39bc93a7bed7cac50e3", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "807c89bc10c27a52f2adaa67a0d87fc01973bf5b676d145e89e2ec049b728d44", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "ecca40715b56680813aa3be51433761734f9d735c21dee3ddd0f56cb3a8182d9", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "6798ffb42d12b8fb110c12313fe91681a9cfb67d47d91428a05510ad9418fed8", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "acb1bcb8aa03d0339262dbe6fcf59bcdf3dfed8221835eb3cdd3ff2412b4f714", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "998cbe968055f3f8cb2b66112d51509d98f0ca43f9b4f3113f97db27e11f6ecf", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "70789b0e8bab447de426fd5d5e5185b49f1b8fa46c79762a5326345573487d6f", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "0647ecd41a06134c95d904ea521456f4ac3244810f5a88d97b29ff812fb6cd41", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "c29927e069170dbbce4193657763478acc9df1a6cca967a10dfc92a0f9cde721", "target_hash": "bf0b3a05db3b34ee9b1931622992e6a5895c5ad5eef73480ea254128941e6c1c", "section_hashes": ["0ad9c748c800", "3fd8f9692360", "0a14fa51418e", "8c083bf10fb1"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -108807,7 +108807,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108829,7 +108829,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108851,7 +108851,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108873,7 +108873,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108895,7 +108895,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108917,7 +108917,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108939,7 +108939,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108961,7 +108961,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -108983,7 +108983,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109005,7 +109005,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109027,7 +109027,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109049,7 +109049,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109071,7 +109071,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109093,7 +109093,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109115,7 +109115,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109137,7 +109137,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109159,7 +109159,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109181,7 +109181,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109203,7 +109203,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109225,7 +109225,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109247,7 +109247,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109269,7 +109269,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109291,7 +109291,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109313,7 +109313,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109335,7 +109335,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109357,7 +109357,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109379,7 +109379,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109401,7 +109401,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109423,7 +109423,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109445,7 +109445,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109467,7 +109467,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109489,7 +109489,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109511,7 +109511,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109533,7 +109533,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109555,7 +109555,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109577,7 +109577,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109599,7 +109599,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109621,7 +109621,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109643,7 +109643,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109665,7 +109665,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109687,7 +109687,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109709,7 +109709,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109731,7 +109731,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109753,7 +109753,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109775,7 +109775,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109797,7 +109797,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109819,7 +109819,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109841,7 +109841,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109863,7 +109863,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109885,7 +109885,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109907,7 +109907,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109929,7 +109929,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109951,7 +109951,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109973,7 +109973,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -109995,7 +109995,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110017,7 +110017,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110039,7 +110039,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110061,7 +110061,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110083,7 +110083,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110105,11 +110105,11 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", - "target_hash": "751c8ff71145e39048c2973ab841fa3b0f84100c4e93d72498798b31109c0472", + "target_hash": "c56501f4b41f88269b258b0ed358301ef99234b73b3d6cd15e0103f9ab3dc202", "section_hashes": [ "ab8849df9634", "7e02b8d0c1e0", @@ -110127,7 +110127,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110149,7 +110149,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110171,7 +110171,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110193,7 +110193,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "a79837793ac88b1cc25125995f9d33e98a69355b42f704e4dd95ed06efda1dee", @@ -110215,7 +110215,7 @@ "77e16a35c8f1", "a36d04952ace" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -110225,7 +110225,7 @@ "pl": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", "target_hash": "6094e483566f05d725457f9884f2a43d57d58231cb4ad57a5ba6a7fdc14adddb", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110250,7 +110250,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110275,7 +110275,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110300,7 +110300,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110325,7 +110325,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110350,7 +110350,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110375,7 +110375,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110400,7 +110400,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110425,7 +110425,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110450,7 +110450,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110475,7 +110475,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110500,7 +110500,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110525,7 +110525,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110550,7 +110550,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110575,7 +110575,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110600,7 +110600,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110625,7 +110625,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110650,7 +110650,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110675,7 +110675,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110700,7 +110700,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110725,7 +110725,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110750,7 +110750,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110775,7 +110775,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110800,7 +110800,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110825,7 +110825,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110850,7 +110850,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110875,7 +110875,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110900,7 +110900,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110925,7 +110925,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110950,7 +110950,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -110975,7 +110975,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111000,7 +111000,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111025,7 +111025,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111050,7 +111050,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111075,7 +111075,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111100,7 +111100,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111125,7 +111125,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111150,7 +111150,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111175,7 +111175,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111200,7 +111200,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111225,7 +111225,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111250,7 +111250,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111275,7 +111275,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111300,7 +111300,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111325,7 +111325,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111350,7 +111350,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111375,7 +111375,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111400,7 +111400,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111425,7 +111425,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111450,7 +111450,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111475,7 +111475,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111500,7 +111500,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111525,7 +111525,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111550,7 +111550,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111575,7 +111575,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111600,7 +111600,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111625,7 +111625,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111650,7 +111650,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111675,7 +111675,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111700,11 +111700,11 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", - "target_hash": "9f2ff326ba6e5edcbb5ddd926385e9516c63cbed2ae43937482f4c6c7fd0d602", + "target_hash": "72cbfb5110b18c05e8b6894f8be1883d6ad44ba5fe3f9e9c3349dbb652cc7de4", "section_hashes": [ "5f4447ea6c15", "ea68898f1cba", @@ -111725,7 +111725,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111750,7 +111750,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111775,7 +111775,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111800,7 +111800,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "1fa535ab3c9dbd5324ad8de7f4f59e91c56712b94817eccea5025efd7a587e9d", @@ -111825,7 +111825,7 @@ "2cb520d2706e", "494f80016552" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -111835,7 +111835,7 @@ "pl": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", "target_hash": "f95ae3cb1c27edeb3d232919433b4f0e44c863f46e3ced1e52a9f3da52f30bde", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111850,7 +111850,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111865,7 +111865,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111880,7 +111880,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111895,7 +111895,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111910,7 +111910,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111925,7 +111925,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111940,7 +111940,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111955,7 +111955,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111970,7 +111970,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -111985,7 +111985,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112000,7 +112000,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112015,7 +112015,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112030,7 +112030,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112045,7 +112045,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112060,7 +112060,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112075,7 +112075,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112090,7 +112090,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112105,7 +112105,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112120,7 +112120,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112135,7 +112135,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112150,7 +112150,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112165,7 +112165,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112180,7 +112180,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112195,7 +112195,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112210,7 +112210,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112225,7 +112225,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112240,7 +112240,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112255,7 +112255,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112270,7 +112270,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112285,7 +112285,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112300,7 +112300,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112315,7 +112315,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112330,7 +112330,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112345,7 +112345,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112360,7 +112360,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112375,7 +112375,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112390,7 +112390,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112405,7 +112405,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112420,7 +112420,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112435,7 +112435,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112450,7 +112450,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112465,7 +112465,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112480,7 +112480,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112495,7 +112495,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112510,7 +112510,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112525,7 +112525,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112540,7 +112540,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112555,7 +112555,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112570,7 +112570,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112585,7 +112585,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112600,7 +112600,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112615,7 +112615,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112630,7 +112630,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112645,7 +112645,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112660,7 +112660,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112675,7 +112675,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112690,7 +112690,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112705,7 +112705,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112720,7 +112720,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112735,7 +112735,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112750,7 +112750,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112765,7 +112765,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112780,7 +112780,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e7d30fb4d962f260cb06e265b9db7a8526042a582cd8887d20eca7aa4e0a3045", @@ -112795,7 +112795,7 @@ "4b81ad79a528", "240026694b06" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -112813,7 +112813,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112826,7 +112826,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112839,7 +112839,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112852,7 +112852,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112865,7 +112865,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112878,7 +112878,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112891,7 +112891,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112904,7 +112904,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112917,7 +112917,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112930,7 +112930,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112943,7 +112943,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112956,7 +112956,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112969,7 +112969,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112982,7 +112982,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -112995,7 +112995,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113008,7 +113008,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113021,7 +113021,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113034,7 +113034,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113047,7 +113047,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113060,7 +113060,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113073,7 +113073,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113086,7 +113086,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113099,7 +113099,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113112,7 +113112,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113125,7 +113125,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113138,7 +113138,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113151,7 +113151,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113164,7 +113164,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113177,7 +113177,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113190,7 +113190,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113203,7 +113203,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113216,7 +113216,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113229,7 +113229,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113242,7 +113242,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113255,7 +113255,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113268,7 +113268,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113281,7 +113281,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113294,7 +113294,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113307,7 +113307,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113320,7 +113320,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113333,7 +113333,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113346,7 +113346,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113359,7 +113359,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113372,7 +113372,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113385,7 +113385,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113398,7 +113398,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113411,7 +113411,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113424,7 +113424,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113437,7 +113437,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113450,7 +113450,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113463,7 +113463,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113476,7 +113476,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113489,7 +113489,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113502,7 +113502,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113515,7 +113515,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113528,7 +113528,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113541,7 +113541,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113554,7 +113554,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113567,7 +113567,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113580,7 +113580,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113593,7 +113593,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113606,7 +113606,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113619,7 +113619,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113632,7 +113632,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "f1713be4173f2fd7dd7c19f0e67b57f1018018580fb48a77b53ed01ca630eb7c", @@ -113645,7 +113645,7 @@ "70ff5c36b3c8", "74291d61a2d9" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -113667,7 +113667,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113684,7 +113684,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113701,7 +113701,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113718,7 +113718,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113735,7 +113735,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113752,7 +113752,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113769,7 +113769,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113786,7 +113786,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113803,7 +113803,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113820,7 +113820,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113837,7 +113837,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113854,7 +113854,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113871,7 +113871,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113888,7 +113888,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113905,7 +113905,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113922,7 +113922,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113939,7 +113939,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113956,7 +113956,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113973,7 +113973,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -113990,7 +113990,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114007,7 +114007,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114024,7 +114024,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114041,7 +114041,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114058,7 +114058,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114075,7 +114075,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114092,7 +114092,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114109,7 +114109,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114126,7 +114126,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114143,7 +114143,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114160,7 +114160,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114177,7 +114177,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114194,7 +114194,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114211,7 +114211,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114228,7 +114228,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114245,7 +114245,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114262,7 +114262,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114279,7 +114279,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114296,7 +114296,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114313,7 +114313,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114330,7 +114330,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114347,7 +114347,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114364,7 +114364,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114381,7 +114381,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114398,7 +114398,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114415,7 +114415,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114432,7 +114432,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114449,7 +114449,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114466,7 +114466,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114483,7 +114483,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114500,7 +114500,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114517,7 +114517,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114534,7 +114534,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114551,7 +114551,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114568,7 +114568,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114585,7 +114585,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114602,7 +114602,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114619,7 +114619,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114636,7 +114636,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114653,7 +114653,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114670,7 +114670,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114687,7 +114687,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114704,7 +114704,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114721,7 +114721,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114738,7 +114738,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "52ade6827c7ee5ba9b62cf287cea4e6718ef714bea1cfd1a40b8820ae29e1e60", @@ -114755,7 +114755,7 @@ "e6a2ec2f3b4c", "426c570b8bb4" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -114765,7 +114765,7 @@ "pl": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", "target_hash": "96421fad9e1945697b1a26f35952e17aa56db6cc3932bbf9d86006c4b734642a", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114779,7 +114779,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114793,7 +114793,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114807,7 +114807,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114821,7 +114821,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114835,7 +114835,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114849,7 +114849,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114863,7 +114863,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114877,7 +114877,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114891,7 +114891,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114905,7 +114905,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114919,7 +114919,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114933,7 +114933,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114947,7 +114947,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114961,7 +114961,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114975,7 +114975,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -114989,7 +114989,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115003,7 +115003,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115017,7 +115017,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115031,7 +115031,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115045,7 +115045,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115059,7 +115059,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115073,7 +115073,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115087,7 +115087,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115101,7 +115101,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115115,7 +115115,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115129,7 +115129,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115143,7 +115143,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115157,7 +115157,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115171,7 +115171,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115185,7 +115185,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115199,7 +115199,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115213,7 +115213,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115227,7 +115227,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115241,7 +115241,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115255,7 +115255,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115269,7 +115269,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115283,7 +115283,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115297,7 +115297,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115311,7 +115311,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115325,7 +115325,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115339,7 +115339,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115353,7 +115353,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115367,7 +115367,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115381,7 +115381,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115395,7 +115395,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115409,7 +115409,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115423,7 +115423,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115437,7 +115437,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115451,7 +115451,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115465,7 +115465,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115479,7 +115479,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115493,7 +115493,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115507,7 +115507,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115521,7 +115521,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115535,7 +115535,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115549,7 +115549,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115563,7 +115563,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115577,7 +115577,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115591,7 +115591,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115605,7 +115605,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115619,7 +115619,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115633,7 +115633,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115647,7 +115647,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "2e9eb65469c90ff48e0d27c46c3346216372c63b130266a529a5ab0c11b409cd", @@ -115661,7 +115661,7 @@ "eafa6057fce9", "c48c806ad856" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -115671,391 +115671,391 @@ "pl": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "05c0399529b4a03597760a2af4ed6cb047468e2cb36334440a7c6e35a5043738", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "dac4b5952b294d1b32a01ad3a9eb56b8a5c025faad3c97b89ed8d60f349697c8", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "cf390d38ecc50abf245b5e2ad59de866cee3fa6f33e5c9d30c0aa4a898304ef3", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "cb6af305ccbbfc45035fb8f677addf3f560a57a7ab940798881d95897edecf99", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "76c8b616d712f1e7c0fb6339b1e4c8f6a6afc0610854c12dafc79f0fd9f8930c", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "0e3f6ac6a2d00b6cb81e68fd0e000c0968b7de622db9a3abfed08915a6895ae2", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "51efdf7fe3105f15c20c0d7bd21d8d85bbfea11fd1c4d7a32f052fda4df451e2", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "7f5ef2b464086e447df4c59f9be859156a61cf1d693dd9b93da84ca0aaea9ac6", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "e392960a720313a74be4ab8e56d3dd25ce2d6370587145fea53a409cab44f98f", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "3163d54bb0ce59a02b08ee6c7b38d9267c539df03b213690b725e44b06338e45", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "05732e92d134070459d049dd28b5028e37220384e691323cfa82ed4e90455b78", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "748bec619a08222fb6535cab453902a3ab54c7bf7a6bb58b7776396cd1bac58c", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "9d5ccc1cdbcbed8188bc4cef922ca14f59de5a71d7156037a2ed205104808fbe", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "02cd6658d39dbef36126c99fdac7c949554c8935be5e56231d21b186d96ba603", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "378e60652d0e118c2abeeb4fec03c22adf68a86668ff52ea57b5d7e3a375bed6", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "e804ed995656b7509559ab3d050cd78e138ff94cd01a0e3bbfa6ff0735935e72", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "15e814236c1f0ccfe311f4ea4a78738c86b94001c6d3ce43e71cc57eeebbb7f5", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "9777b48e43780f16a6d52dd6fa125d95ac51d3c43d2fb32bb8c38781500b06bf", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "dc151632506c945341d76a1343c7a92791d8a8b6af3028a1ada0dd03d94fc361", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "5c2e5488ce0264f70777e48955c3e4207d9fa8a8bc3b5466717d91db5921e512", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "1b38e2360983eea23829b4bfb5a4d3b58cb7c513bbd3f227249d898bd4438054", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "41e87a0d76a1fe484af73179450c8c304bbde846f3dfcaebda4b79f0f42a73d4", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "01c41a1ef96f0a8e5d1d84a90b1c9bcf6085172e5b65e9fde6fe855cc270e2b3", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "a0a99450a6629fa13fdf8f80e61d9d4c1cc2dd2f0b28278f416507f2fa5302a6", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "df8a4c25a0ea0919bcedc41be6d6a4a0c875e0609853ace09c849fb2d4867285", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "134189ec3c963ccbc2904db2fb09976ff3638ff8d6c23879650c106fdf1c696b", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "4b447d209b9743635894f56c5df52c9b83b0ca7e097b2f750a147aa299abb7fb", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "5dafc35b328878e7bd293d96e9fbdaa39730ea62d1833309f11ff0466b1e7268", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "685a82676c860ada24c0a9bf8f0826b9c99982598df549c8aca70843799fc515", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "4bbcd6f5b150083542f18101fba5143f5cf1ec1a586f3cf0fa4e0e96c4170beb", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "e8efef6140fe9bc02b99bcbcea5f4090a341054f5a365262591e1984f904a65f", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "3922fab9ab32185eda7d49931219f0a5fb4beaf3f357e055f9b5c442c9ee5fcd", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "51b2a35fcf52a97949311f6045a5d106e281e76c560b965e7bd07afff755c1a9", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "5e45cad5d82f1fa8b33fbdc9bc587e6d6f301464fc334d6243286650772527ad", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "76fe0659abb1d243fba8362b55399c21260ed80b96cf3faca01325d680ad12db", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "9bac722efccd4ce874440108b33e4109d20b7d54ef16a36bf7d0fc4298b4380c", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "a07b9d510a433470cbf6f68de6e54d9bf11e31572fbb6eee34bdf3d49e96856e", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "e4371890f8fa08de53d4f73390f6fc0d8fd0e9dbc9006007483a02ada66adc9c", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "8d89dff4e641194b2ffb70e1201712c00d3adc5ce48dbccc0755fc26d9692add", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "1c0f1fc96f4f34a1ec9ec699c1ef8afa4bd10e4c6c73a9f1fd660d17a389ae61", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "9687be458e435c383a4dc6634981a5e328de979b4c9e7ac96572b6e864deb68a", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "c06be50646481284e4407121ed3e5821f5192f58eb7c271750783d33e1c8d979", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "3c9fb3295131a352e4848cc7cb3002dc046f1ac195eeeee2773a06dd75be1bca", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "8fca64fb440588057cf12db218704883c9f7cfdd1968147a92f9e8f1db9ef95a", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "3e0fe69699666d546de93cb7200fb88476f291d830ed87c205ed9b59902dbf81", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "9cccc04f784d570411d0f8c83edcc0656d681ca9c5ab4a1a61348ba2b216e2f4", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "09c27cca236d558f04ed061fb1456e8c2b0eec44912f67bf14a4f5799bf349fa", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "61b0e37662382209bf66d4c0177de975c410339ebd0919a8af7d8177da592eb4", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "5129c38366e6a23834bf254c4d26d2f7e19f51491a1f0e09750c4793accc711b", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "4e4e266acea3e09e38b50daa99f24407edc5e2f728e163af534b9beaed395ad6", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "037f53431643d60f52eb121b61f6cbe02b2c7213eef912f409f1e21111f575c6", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "5155354dbdc3cae6b07150b1495b4a43b8bb6f483e7ebc0786fa5f4caa257ead", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "168c310ea9f29958a1191cb2295f242f3b55fcdd32640cf3dfee1d5d4b614a59", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "ceed0745e25292c760819cdae5a4adc37867bc97163c17c28aa04a7641161ae8", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "181b400a46cb45f25f2b9ea9bdb1d3e47c2191ee9ad47335d78b713a656a057e", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "0dbea8a12f974735df23b5b5a50f9e158645f0989073ee3c6ff71a96fb665dd9", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "8973f9cbe388d010d652327ac2d5e6a2cb8ee37d7b17cdb54f5e632215d662bd", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "20b127aa6af9a6427bf06fd89d15657158548315f8ae756862510ecdb5808800", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "d14dd785dc8ed0ef10e8c094f9551ce7c20cceb2b17f0f29a5fd6eee0ee0fa95", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "4f1bf9b1b7007798060b92f0e2671a9ba733434647d65dbb43e1eb1cabd1f54f", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "53299d664761d488a27fb659ea00e5c23e8cc7859b0bc7f61357d8efb7558263", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "e8ba2164ff809d1bf0d292eb6edbf1b3be01273dd272cdc01fddcfa95b67ce0e", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "7b8bb955f55ca71d3f1358011a191804055b898f9d26abf69c8844d5581d1841", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "464c5f50653b63174db4098a435b92bf2a387896154e0e74c3f46672fc674cbb", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ffdb7f8695298a78f16bfc22cdb81311329d987d3f6ed657e1992a7ccb280b18", "target_hash": "ff2e652c8c483c070cfe6b6a285dbec8d3c4b23c68233cfdaa02249b1cfdf8eb", "section_hashes": ["36cf94a9caea", "bdf253043a44", "13f84529f9da", "72df22656954"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -116065,7 +116065,7 @@ "pl": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", "target_hash": "532b407095cc885286c4eef6ed7edc175602f523409f4bce067c4cc1537cf8cf", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116079,7 +116079,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116093,7 +116093,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116107,7 +116107,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116121,7 +116121,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116135,7 +116135,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116149,7 +116149,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116163,7 +116163,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116177,7 +116177,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116191,7 +116191,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116205,7 +116205,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116219,7 +116219,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116233,7 +116233,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116247,7 +116247,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116261,7 +116261,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116275,7 +116275,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116289,7 +116289,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116303,7 +116303,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116317,7 +116317,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116331,7 +116331,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116345,7 +116345,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116359,7 +116359,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116373,7 +116373,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116387,7 +116387,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116401,7 +116401,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116415,7 +116415,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116429,7 +116429,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116443,7 +116443,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116457,7 +116457,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116471,7 +116471,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116485,7 +116485,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116499,7 +116499,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116513,7 +116513,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116527,7 +116527,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116541,7 +116541,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116555,7 +116555,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116569,7 +116569,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116583,7 +116583,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116597,7 +116597,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116611,7 +116611,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116625,7 +116625,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116639,7 +116639,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116653,7 +116653,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116667,7 +116667,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116681,7 +116681,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116695,7 +116695,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116709,7 +116709,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116723,7 +116723,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116737,7 +116737,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116751,7 +116751,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116765,7 +116765,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116779,7 +116779,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116793,7 +116793,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116807,7 +116807,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116821,7 +116821,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116835,7 +116835,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116849,7 +116849,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116863,7 +116863,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116877,7 +116877,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116891,7 +116891,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116905,7 +116905,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116919,7 +116919,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116933,7 +116933,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116947,7 +116947,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "059bcbb3e8bda92378de7cf56ad50f469e9ef6ddf78e014658298a844cf4be78", @@ -116961,7 +116961,7 @@ "ec8c41d7eaef", "6e56c55f0eaf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -116971,7 +116971,7 @@ "pl": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", "target_hash": "5388731b37ee6a32e08db97e071ee443ce5cf9ef2e7a4fd68847f9f740e442ac", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -116988,7 +116988,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117005,7 +117005,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117022,7 +117022,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117039,7 +117039,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117056,7 +117056,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117073,7 +117073,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117090,7 +117090,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117107,7 +117107,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117124,7 +117124,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117141,7 +117141,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117158,7 +117158,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117175,7 +117175,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117192,7 +117192,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117209,7 +117209,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117226,7 +117226,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117243,7 +117243,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117260,7 +117260,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117277,7 +117277,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117294,7 +117294,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117311,7 +117311,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117328,7 +117328,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117345,7 +117345,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117362,7 +117362,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117379,7 +117379,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117396,7 +117396,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117413,7 +117413,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117430,7 +117430,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117447,7 +117447,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117464,7 +117464,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117481,7 +117481,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117498,7 +117498,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117515,7 +117515,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117532,7 +117532,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117549,7 +117549,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117566,7 +117566,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117583,7 +117583,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117600,7 +117600,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117617,7 +117617,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117634,7 +117634,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117651,7 +117651,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117668,7 +117668,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117685,7 +117685,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117702,7 +117702,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117719,7 +117719,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117736,7 +117736,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117753,7 +117753,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117770,7 +117770,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117787,7 +117787,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117804,7 +117804,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117821,7 +117821,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117838,7 +117838,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117855,7 +117855,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117872,7 +117872,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117889,7 +117889,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117906,7 +117906,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117923,7 +117923,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117940,7 +117940,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117957,7 +117957,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117974,7 +117974,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -117991,7 +117991,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -118008,7 +118008,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -118025,7 +118025,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -118042,7 +118042,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "74663d79665a1ad8ac2d8163f5ffcc6fb0eb932f659c0b3e370afa2a2841005b", @@ -118059,7 +118059,7 @@ "5d44786488ac", "d2d983469714" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -118082,7 +118082,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118100,7 +118100,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118118,7 +118118,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118136,7 +118136,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118154,7 +118154,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118172,7 +118172,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118190,7 +118190,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118208,7 +118208,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118226,7 +118226,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118244,7 +118244,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118262,7 +118262,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118280,7 +118280,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118298,7 +118298,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118316,7 +118316,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118334,7 +118334,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118352,7 +118352,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118370,7 +118370,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118388,7 +118388,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118406,7 +118406,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118424,7 +118424,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118442,7 +118442,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118460,7 +118460,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118478,7 +118478,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118496,7 +118496,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118514,7 +118514,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118532,7 +118532,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118550,7 +118550,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118568,7 +118568,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118586,7 +118586,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118604,7 +118604,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118622,7 +118622,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118640,7 +118640,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118658,7 +118658,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118676,7 +118676,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118694,7 +118694,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118712,7 +118712,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118730,7 +118730,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118748,7 +118748,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118766,7 +118766,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118784,7 +118784,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118802,7 +118802,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118820,7 +118820,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118838,7 +118838,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118856,7 +118856,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118874,7 +118874,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118892,7 +118892,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118910,7 +118910,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118928,7 +118928,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118946,7 +118946,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118964,7 +118964,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -118982,7 +118982,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119000,7 +119000,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119018,7 +119018,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119036,7 +119036,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119054,7 +119054,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119072,7 +119072,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119090,7 +119090,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119108,7 +119108,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119126,7 +119126,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119144,7 +119144,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119162,7 +119162,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119180,7 +119180,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119198,7 +119198,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119216,7 +119216,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "60e04b5ff8fb53d4be105e9d1712b7148188200d91b07ce80b6aa9ce95ebf71b", @@ -119234,7 +119234,7 @@ "9aa588261cf5", "f1150fc2035c" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -119251,7 +119251,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119263,7 +119263,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119275,7 +119275,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119287,7 +119287,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119299,7 +119299,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119311,7 +119311,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119323,7 +119323,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119335,7 +119335,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119347,7 +119347,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119359,7 +119359,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119371,7 +119371,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119383,7 +119383,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119395,7 +119395,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119407,7 +119407,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119419,7 +119419,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119431,7 +119431,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119443,7 +119443,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119455,7 +119455,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119467,7 +119467,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119479,7 +119479,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119491,7 +119491,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119503,7 +119503,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119515,7 +119515,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119527,7 +119527,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119539,7 +119539,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119551,7 +119551,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119563,7 +119563,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119575,7 +119575,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119587,7 +119587,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119599,7 +119599,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119611,7 +119611,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119623,7 +119623,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119635,7 +119635,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119647,7 +119647,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119659,7 +119659,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119671,7 +119671,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119683,7 +119683,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119695,7 +119695,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119707,7 +119707,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119719,7 +119719,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119731,7 +119731,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119743,7 +119743,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119755,7 +119755,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119767,7 +119767,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119779,7 +119779,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119791,7 +119791,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119803,7 +119803,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119815,7 +119815,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119827,7 +119827,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119839,7 +119839,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119851,7 +119851,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119863,7 +119863,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119875,7 +119875,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119887,7 +119887,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119899,7 +119899,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119911,7 +119911,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119923,7 +119923,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119935,7 +119935,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119947,7 +119947,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119959,7 +119959,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119971,7 +119971,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119983,7 +119983,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -119995,7 +119995,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -120007,7 +120007,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ea672d4b77b14e22e62b5485723062af6e1dbadb58e5172045df582a9ee1e0fd", @@ -120019,7 +120019,7 @@ "ba2ccf1b3b57", "777bc66520cd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -120030,391 +120030,391 @@ "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "604379246e33566eecae212bf102646e08a46036e53ca89ca8971cb8609c95df", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "9debc91e506102a728fb8019e86220083a6060490663cd9a24b9714ece293078", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "86d7fd50a967aa2bf4fd4476414c4c409e814e7404509a01b2c10ff573fefb45", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "881c104f269fd7b1d180d8939892d8a70b8a716b57ba2bd5a382ab7d4f666c4b", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "753e7af759949d155b67c3cade430e2571922b3d7e96375e9f352250080e81df", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "dc29c03e0707008e56216baab89e0d512e39d96e0bacf45f61a4ae7ad38074e0", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "01928192326607bb5cd6c245cfc6e1bb3162cdde8e474afb012ca16a3729f888", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "2dc9b82f8b6e5670b5fa3be38f579ffc1511e3ef34b30925be123104e445fed3", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "6e1eb34e509fcb13fbf11e1e8b12b990f9d3782e1d354d89bf07818301d44051", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "4509f6b706e238220d2fd262e273b247672580109a4b633b4217684b9b99c1da", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "8f44a6fffe8191915867c66dfac53662e830e633b187e60ea483e09a2f0c1847", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "f2bc83090431c728c446cd1dfe3d78033885150a8d3cf2e60ddc68f88910b647", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "731cfcc2f7d3de6a3e04ce1c166e67d02cf210d0ce7adb9437928f7c848f3caa", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "3b13e9549ef37484d8004a0f2865921fa86dcaeae0c03b2f4487e37218143c41", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "d80055198b126e5171011c8e37bc9e2841431a812c7f25852d9cfe5edacb5d28", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "0210b79dcfd79be86863cc4fd777ae6b026b602451406968a0118e5c1b249783", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "b31bdfa54905dfafb067c4901e053bc3593afa8caff800a58cce3695ceaf3a16", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "52f25c825fc07ca24139237dfb1937612cb9451a4bd65d9145677eb0593536c6", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "23314a39c4525d7aa0cc5842b76715b6a1d9588d8177a646f216752e988e9b15", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "ef91219556431bf944904b81ec7e7d73790f539c6e46e6af51e91527c7d2fc5f", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "20bce40267388a2dbf61c57b8835e474a570b4a3daea436286041dff33fa099d", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "d4fa13424b5b2f0b499ec6d23fc00228c30a46967ba0e1c45d96ea67c5f7f2b7", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "4ebb17b3138fb7b91a037e2d7994b06863c517936857253070e5156e5544874c", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "e7f6835fda11051f0f17f8cc9ebc5799cd9b4dd1d2ae2a4eb43a624e0b4ec1ee", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "2f5f287581c3bfe9537cd2cb94f459ee416c8139203b024660616be0e1a70eaa", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "b77619ac5f8514ab11bdb4211eb93b6b0953989931d8e7ef91ae2b658fa9b767", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "3bfb9705b2c5766f2a9e4ebecb387a817f09225fb844e459e7c5ffd10d542b4c", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "3d99041e9b4d89d13ae7b0b763a2b77f61bdb43c12117fd4b4f1299e1bf09e65", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "2c5556e329c02f99c93fa92ac3e384adae37ce65e5a9817abc4b2731c3a2eba9", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "43bcbfc8f577604c86c70b8f0348895a3162bfc628089aa4f1101e5f72110cd6", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "a4a2266228f1bdd9b14b3577d0a118a34645d2e79be0716ebc5d86ca03b61452", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "760c203cf93b3ba5a4cfcfc4b29e7cf8a0c1e01a45d0dd1b54631038ed019a20", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "7d7a69085e1e4e38706eb1c2e73985d835e1d935e5a2444dbfcf49b8a4d0a6e7", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "c7604e46140f5e2eb70968de1d63268575fa3c6a950bf6520c7445dac164e9a3", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "ba5f7c10c1ac9f998fb8f7975676fd2958858693d2c244284fb7c26156805117", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "905d0657d9b625fcb4a7da60f58a5a9b57dd9ac15635352823439d0b568490b4", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "b2becc656e3420818160cf3ff4ddfbf9e739b6e1d86ddcfe4675031e8ddcf7e9", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "d045a17bf8e67b62ee2c8245e763bcdd7ba6df7162ed8e7501b0d20216b10fb8", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "b28102fadfce82cd118007906f5b085cf079c7b8239b0be62188de01c1c8be8f", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "b35caae58d5412f162fbb50d9d3456a24989ebe430ccfc2c74c523cbdf092def", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "018b243b1dfb7cb50a215eca375998c0fa1284199aefe10962a767b6d96f2393", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "4f22b8c5002e2a368e108b3af04375ff80c18e49a5974c1397dddbbadab71a7e", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "93b676ea9329f28a41a0f39020648282a6c9de2c24a417413baa0c8d7bdd3e59", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "40b569b1a3e97b924b541d981c0e2d102d0081fde7764825b6f54990d69a3995", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "ec2ed381e5a50442eb58b78f1184d402b286bdb4df42f7980866bf9e25fd5a78", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "0d91dd43fa06cb8db93195c24b007d09b0f753b7c25144657c76bfbc3edd19b9", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "deacee2ab6602618663df055997a58d229c69cb4bc72a41683420e9098a83ac6", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "aa705d96ba59640466b61e917c21f917f881f25dae5379b7804040be6e6e2913", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "ebcc255382dabdd7c5433165f0548fa14dfaa7dcd804a0e4eb5d6953e3bb26bd", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "01d24d15f2a2e6e4f4bd885b90a16dc1340455bad6278c6384735c24833e344e", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "7783ec7e64ea218a28153c7bfc2b373eecacf0e51bfbd9fb8b3a4ef6595e3c46", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "566e6d111c7665ce8d2b416261c4c1fcda33bab4323ba4197887cb4eaddd6f48", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "f78184a3456888040f1e8b96dc91126ea84f9ba1405038f7dff42dc7e548294a", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "e0d292fbc6bf643406a3f641f688919f22dfa266ed1220a4587be7f0387da562", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "367d00e1dc9053ef0a02bfc6eea80631e68de2d82f440f688c41bad6cd956bea", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "cffb3196d4b518af459880cfb3539283c07e4c67e5acd6d39fd7a0eab82ff016", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "304845aa0007c330ca76cfc96ebd7c4a9f012b424be99e02362b7488d7b9e451", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "741d2762a53eacc2be57c466170f77b77cdae3307f47f4d472a530fee9fdd6a7", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "0f2d92d4eae35546b6a3f3c6ee9c99fd7cefcf66bb6b1f66df5d9ddb0e3dd192", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "3222556025fdf60d9a0de9557c07a08a73e9c14d4daa55f235640d06618c535e", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "fffdf09f7d669846c6c8ece2f54e30daa0a528892f26b697ada4b4684d194829", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "ff14d0e652e6ad3c9992b93ea4c3901985dd5e23d1922fd4e69e2859e4a2de8c", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "cbf66a8df4aa2025a0c8d938ec389fed78e5e28e34005c9ce9e462497cfe25ef", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "0a896bd959c736efa195277c26d62bb2132dee389f1d13ad238288c8955b052b", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e495b8347ee0e1ca0674e22fbe937285581e0a5cdc9ba513481aa1e591479deb", "target_hash": "85f82ae43de82ea428e0760297fe12a95d7330614b2449fc9bcad5e788503201", "section_hashes": ["e577b41a38b8"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -120436,7 +120436,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120453,7 +120453,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120470,7 +120470,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120487,7 +120487,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120504,7 +120504,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120521,7 +120521,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120538,7 +120538,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120555,7 +120555,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120572,7 +120572,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120589,7 +120589,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120606,7 +120606,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120623,7 +120623,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120640,7 +120640,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120657,7 +120657,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120674,7 +120674,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120691,7 +120691,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120708,7 +120708,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120725,7 +120725,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120742,7 +120742,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120759,7 +120759,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120776,7 +120776,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120793,7 +120793,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120810,7 +120810,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120827,7 +120827,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120844,7 +120844,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120861,7 +120861,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120878,7 +120878,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120895,7 +120895,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120912,7 +120912,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120929,7 +120929,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120946,7 +120946,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120963,7 +120963,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120980,7 +120980,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -120997,7 +120997,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121014,7 +121014,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121031,7 +121031,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121048,7 +121048,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121065,7 +121065,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121082,7 +121082,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121099,7 +121099,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121116,7 +121116,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121133,7 +121133,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121150,7 +121150,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121167,7 +121167,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121184,7 +121184,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121201,7 +121201,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121218,7 +121218,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121235,7 +121235,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121252,7 +121252,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121269,7 +121269,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121286,7 +121286,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121303,7 +121303,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121320,7 +121320,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121337,7 +121337,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121354,7 +121354,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121371,7 +121371,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121388,7 +121388,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121405,7 +121405,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121422,7 +121422,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121439,7 +121439,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121456,7 +121456,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121473,7 +121473,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121490,7 +121490,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121507,7 +121507,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "7c689b038f26dc4da2729873b2927df62a1f5b696a1d4426faef11ec0ac4dcc6", @@ -121524,7 +121524,7 @@ "88b3aa0b0274", "c1c62ed7814f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -121534,7 +121534,7 @@ "pl": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", "target_hash": "7fdae062fe9a00e533d26183f86b2c95abe6e1d5058bb2adc15bf477783c3113", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121547,7 +121547,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121560,7 +121560,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121573,7 +121573,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121586,7 +121586,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121599,7 +121599,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121612,7 +121612,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121625,7 +121625,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121638,7 +121638,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121651,7 +121651,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121664,7 +121664,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121677,7 +121677,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121690,7 +121690,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121703,7 +121703,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121716,7 +121716,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121729,7 +121729,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121742,7 +121742,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121755,7 +121755,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121768,7 +121768,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121781,7 +121781,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121794,7 +121794,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121807,7 +121807,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121820,7 +121820,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121833,7 +121833,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121846,7 +121846,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121859,7 +121859,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121872,7 +121872,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121885,7 +121885,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121898,7 +121898,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121911,7 +121911,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121924,7 +121924,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121937,7 +121937,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121950,7 +121950,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121963,7 +121963,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121976,7 +121976,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -121989,7 +121989,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122002,7 +122002,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122015,7 +122015,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122028,7 +122028,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122041,7 +122041,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122054,7 +122054,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122067,7 +122067,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122080,7 +122080,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122093,7 +122093,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122106,7 +122106,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122119,7 +122119,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122132,7 +122132,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122145,7 +122145,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122158,7 +122158,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122171,7 +122171,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122184,7 +122184,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122197,7 +122197,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122210,7 +122210,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122223,7 +122223,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122236,7 +122236,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122249,7 +122249,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122262,7 +122262,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122275,7 +122275,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122288,7 +122288,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122301,7 +122301,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122314,7 +122314,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122327,7 +122327,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122340,7 +122340,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122353,7 +122353,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "f1c997fbde59a8c170cb2232719c769ce8d1a156138bd8ef177f7fb905b92c8b", @@ -122366,7 +122366,7 @@ "a4f02c056ff8", "c646956f7571" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -122388,7 +122388,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122405,7 +122405,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122422,7 +122422,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122439,7 +122439,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122456,7 +122456,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122473,7 +122473,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122490,7 +122490,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122507,7 +122507,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122524,7 +122524,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122541,7 +122541,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122558,7 +122558,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122575,7 +122575,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122592,7 +122592,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122609,7 +122609,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122626,7 +122626,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122643,7 +122643,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122660,7 +122660,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122677,7 +122677,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122694,7 +122694,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122711,7 +122711,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122728,7 +122728,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122745,7 +122745,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122762,7 +122762,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122779,7 +122779,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122796,7 +122796,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122813,7 +122813,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122830,7 +122830,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122847,7 +122847,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122864,7 +122864,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122881,7 +122881,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122898,7 +122898,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122915,7 +122915,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122932,7 +122932,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122949,7 +122949,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122966,7 +122966,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -122983,7 +122983,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123000,7 +123000,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123017,7 +123017,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123034,7 +123034,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123051,7 +123051,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123068,7 +123068,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123085,7 +123085,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123102,7 +123102,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123119,7 +123119,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123136,7 +123136,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123153,7 +123153,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123170,7 +123170,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123187,7 +123187,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123204,7 +123204,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123221,7 +123221,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123238,7 +123238,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123255,7 +123255,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123272,7 +123272,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123289,7 +123289,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123306,7 +123306,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123323,7 +123323,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123340,7 +123340,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123357,7 +123357,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123374,7 +123374,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123391,7 +123391,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123408,7 +123408,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123425,7 +123425,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123442,7 +123442,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123459,7 +123459,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "f9a2ba781de0fb548e8bc6b8b01146406bdfca2b1788d88dcba963ae38ece09e", @@ -123476,7 +123476,7 @@ "0d42014c4e5e", "b3d7a83a33f7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -123486,786 +123486,924 @@ "pl": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "6e72f8f98ab55bfceef8856d14c83d808f4807c4d37fcdefcdaa42cd3543dc58", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "3d2c783ba93c556f9e11d2b2fb5344ada5e0358c15b38a15443718baf8ffb5c6", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "3288f824797306e07cb75a13f5b1c98e4220dccc00bc0671af53bd52baf11e58", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "5c3c6e5e980a06981120ffa5b81898dc989c53ad411154e1e0a3546ba5da0ee2", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "e25445451de5ca09299efae38766550a4e65a3350b7baf4c39a7e712b002a079", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "2a7762b60c183597c1bcd2c1e7fae5e9d829726279e9a549f8e1f38a9e7d19f8", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "7da1c12a9295c7ceb8cc965c71bdda52bb258bf770392e62c1e1828e79ad2db5", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "35fa4b93d2baa5813e905202bcae17da651338f1d6cf4fb306222d9a9ff3fc30", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "4e7c3e4cc2fca1dd7bbcca47e59bb34394ec72a1c18738f224f98f81c9f814a4", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "e049f3465fe02bcd29e1e3b0502543032bee2d65433ccec0eb9189c829c81953", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "5b7f5a2882faa1cc7ea80d0ceb25ccdd94e4eb1b54f8afd8d79eacaf37a8276c", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "9c75b30c52ca7ef5de6dcfc4c45bbc2dbcb2213231a18ae52f53a7d40bdcc75e", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "3fff03fc21fb45df87a120c96b7afadfc7aa6ba8f477d306d199cf9c3b51c4c0", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "bb9f551c6a7407028092a5bc4bf7cebc7176ac9da0d506d66c7908421f8366e3", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "1cdf82e60fd560431aa70f5cec50ea90ae506f01bafdd90111d6c4f30a92d012", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "a5e11b2d8f744b2871f64aa3db9e1576881cd1a64ce89cc123d57c392582b84f", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "17c2b823602e86c170389f6b4c786b7a0f0a530cfcdf5c48499a0f3729e6ca00", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "f67e30ed1d9954dd9567ee035380fdaa9f83c4a5752e4085cba309acc8b0e0a5", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "6f0a274ee88a683a782cf3c5ce1f76c28296b29bb0ca180817d4e2563d23417c", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "67ba77ae207b1529b2ef8032c5c0f38b7644c91e4f730e2546738b6d2ffdf8fb", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "5448fe36837021b132bc6a384cd9ea2b50dbbf846d221776b0aaaa25157f4a67", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "fe1f77511637cc485dc3ad261f853589b6ce22b19e4c35324e452ff153f6f7ac", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "de0e85bcb21e53031c8822a59c2b9b7424de248a16b599359276f178457e86aa", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "10e08c7b75b1db3430074fba6b8407ff1f64db9de8f63b8a72c3eebbdf9d2ed2", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "3cb04ec09ad8c7879706f4f31dead4a9052b80919a85d96a3cbf8947376f902f", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "0e8a8289136357b8200b4cfe606179bce57de0e097b7d952c756775ec365ce09", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "4af16470ae31e3ef29700b973c279e1cd5c26fc4a503d08256260bbd22030316", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "ff824ac14d2307b1b067cdc294ba0729e42be329be9f0b90b527d4f43b13cffe", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "a1a916e02fec964019c80b580d762b5f55271ef553a87cb1a157c974f70ef652", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "9b4e522377b3fc22277eb3dc4177cc7696717f40315f07a437f877d3cea0dc49", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "06d87c3e42eebba9441fea7a0fb93f7e7b14138e5155f60d017a2756f2ee5d76", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "2c2879151e8128bbcced80fba4956db89bbf00acbcdc9be7a1b288c8e3a98cd6", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "2f1f5ab160723ce247f076fea947be9d38504deb22afcbe2384144deeb84d047", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "90c5040a6d81fe5b9a94ec93623cbf21c9332bea2afe53a0a5aeaf3043dd88d3", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "aac9f15414a6b9e27f0d9eefff22cf8176aee385ce377e337b5fd8a9c97c9821", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "2b323d58674b8a5101d05d485e4822987a4c039fbe6540e57bf411e744059547", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "6f3c026fd87bf30bbb59bb4f694f57616304280eec0f5d5b59274a7b51b1d280", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "25d625cd2de1db94dc106f40686b3b08eeef653a038f31907d9ad3faee674a4f", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "8c088c6d9aeab3eaa629f773f87c23e11087b2103e4a1e1b7eaaca6a0a98153c", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "13a0c0a9395ee7240f872eafe1564064a795db777300adeac0f1aa893b944e50", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "a2287d765508d413e09229f0dc7899fde6c3885f605806658774743e57c5825b", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "8025bc5e22a238057714964cc6f9bd76aa301eeeb3b4042bb17ae6de4546e3ad", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "dc5c432a7e0821b30988d88c5741009260b95dc04a82f2c81eaebf65ca12e678", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "8e18b1e194617d78036f3e6369457bb412da5ed32642ae8e7134b9aedc1a7a41", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "1aa6427ab5528140c6fb0653356ff5f9d0ad3f2ac967c5312141e6ff22755f6b", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "24f52176101f8cf386353ebac0147eed32a932cb081d510a04d7eef698534c8e", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "3c31ae6256f4603afd05ce15cd2b67cb3f357c519c37399a56a85227925352fd", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "cb44da6683d79c18c4e5f3524f6d47c87a074c1c5c5a42ff29e1cc645ec849d4", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "c53751fcbc4c8625d12d973d09db63ddb432a8e1909d37df3f9dcfed63caa025", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "df130e25526b54d04086af44f84aa0c3a73d1afec318d4595388056653bd65e6", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "438c06f118711bcc5af8b584aee98b6812285e619c882f0f7bd596cda6f083ff", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "55bddec3cb4a281f54e2e8dc75f4678e2f118256d6c45a2d494469efdca05883", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "49edf3c82a96ce6f70a0cc31e130573a52c346a9fdf418a53a7cc2477ac17e73", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "f2f260f4072f39805859fd57b53acf7625384a567440708d39e3be2b045793ed", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "02a9fd375071f6c2086a645935caf293b98d86c651738abfac248f126e0388f1", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "93fb488488f5099a2b94dd9b486344864f851acaf98884fc8d82382ffb43fb99", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "affa288babf9a3c7d698e2a23216d55a25ef355b17f9a83aa940e406b87f36ae", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "7528955ccea11a91d31dffb7d55605e701f9876a86544154fc31653faab0947d", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "8d168bfae4c88ba5ffd6713427e191736ec3d27bc406ea6ee11965600b50ab88", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "700c59461e7f89cbd16dda53f6995a98b5246800489c7da38e2a305041d9efd1", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "83eeed73db19cd75f1ace4ea909cd2760968f4f1a62eda45174b0a025929735f", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "75e31f9a70613fb355cf0be517ff677274b80428e7d6777c3a38861d62b9c4fd", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "63a15e9a0d4092bceb50cb21fd7ed32d0f5d38b741dcf36239234f959a7d8435", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "7031ec705365dd53d5135596047647fb1777e8f3f74234333fb5192b3a5e1f31", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "afe4fcfdc2128ddd524148c5816437b2a4be1e34a295d16b2bcb70aec45722a1", "target_hash": "41c00b6aa9b4c88e0376f45ed50394e854c18641cfe38db9fda309fd24ff29fc", "section_hashes": ["f6eb57a75cec"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/providers/CURSOR-API-KEY-AND-CLI.md": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", "locales": { "ar": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "d77e395938b8815da3669fb4077b69cfdec03c721d055e680f82fa053fc2aed7", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "3cdbc9edcc41b4ef08a4bfc0f70a940cd12acedcc70d69213a4c5095163c22e3", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "c4a645f72f0517a4ed4d8ce40a5bc2c75de38c9eee03471ae125aa755a02cafd", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "cd1a0dabbd22b4d58ae6b4f3886ce2060cc5a40c5e94713661d177fdffdad4c1", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "e1151781eeabace5e8c9fbc264191e2d3ac76fbd8f7bb08a8b2cc46ce113ced8", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "163d70993fd62953abf4487688cf4142955e4b63e5768624fc23a3cef045fae8", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "c6d1b1aacb3f6034ec689bd9b2f5ebfa1dd7c2a824c6ae0bc571b74ac23d9027", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "7c96b37573b293648776bdc520fff58e47b385bb44a8adabfac022903824b778", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "6649406ef4a45499d23518d9687d4a8db991456d39a3977a0296d61884b978b3", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "351f2c62a14bf6d49876f166a0c507bed2643c0414d3d0821960d5ffcdaf8b81", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "249ee616f381cce03c24d87120b94f06a881e90e51679c52a21ebe18975df7b1", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "6598a09842f33ebe987c8499e1dabcce60924a3a3c9263cf97ea3d65d79186ef", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "dec32121671aee200ee72966f28f63f15199fe6e823dc791ce89f0c00611b022", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "f7b4f231608f78858daf2a0a6375f37897bf6a8aa6f3de240b49fc12d74ba275", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "beb891e83936c38b138e0a1f9526ba439d15437052f1c8905562707e9cb38c54", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "2f805530370ed687bf6ff0d3c35e5852e7e7c31fae3e8824356c37f08a8c6c06", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "d68be93bface59fb938b1d384258a9f7eb9c673bde01eb1d87f99a887dda9326", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "b8870b79f5462286e95a8d62917839739fed86feb9d9661e6f7e0a8c60c716a1", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "17e809f8e6765f9aa6bbb0be8cadbf8015da9af05d5a0352baf4744198185ec1", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "d526f1b1f91ed8c387e8767c243c02c14def7c477ff7e1c7985ee5e132f2fca3", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "bfad37be4edb639d1eb351f672aeeb2c05966654c14ee323e883b55ea40c0c6b", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "3b28ab13fc45af9c9387ff6a429f916d88f9a19ab9f4f327b4f0c9768a5e5f68", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "271f0e7cfed4fd7f9d5c7f26b33a52133fa2b259e6e3fb39506586412226dcb5", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "c4c6a0b249457a3489ec53fc885ef51537fcec3ef245c63e728d37b3165735de", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "685636b017101160394cea0f7cb8b82b5b5fe11985ab836976feb8c57ff512ef", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "f9929507d956d002bb1611dadfdd6c5f1203c3d6c709688a83fc1cf25a15886d", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "3200ea7a0c3692b97523b606757b3d5e4131e1e7f9114b5669b63b415a042fe1", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "852d055712af828c698a3ba7a3e58e0e010dde017eb43271fc2f7cb344b1e897", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "3723ffc02b319fe959a23be600e8817b7991cbaf5a5248344e54d6c4e5af3121", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "67da546e2e59e5f41735722fb1792ec3ede4ab0e6dcba84453dddf6af301f29e", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "3f30f3d1e6f29d57e3b6941ed73260bf584906174c59a48d247560ef37aea4c2", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "e2006cd8fb40ac9282dfa7d01b42d9ff9fca459109d5a9a3c9b1e8c589a0cbb6", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "0cbc56d479e23cd6b626f6a96398dda363dde4795e11084c9c6768b9d44342eb", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "b4e154facd3790293b19ac2860627e30e234c55f87f67012ab29f543baf2df8a", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "9931f19727f52e13c3aa74895bcee67f8f543b5dd8323a3ecc6fc62957a35b99", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "ca0a615c868e222456936c8c6921e7c786b20e41cc5800def3ea6621a0d37957", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "6a26135346b09fea28f4984e428385d0bdb1a58714e78bc134c219659e68b3b2", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "51a3309826be5414e13fdc16b109a689542a11c131c282e80b69f1f09bf41f46", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "9a9b4baad9c22eaae1a8283af76eb5a89137a4c2ca161915aa06e6f3bd2f47e4", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "9542d0bfef62a7be0a0d3fde3c6e340c01f841e746af752177b05b803760f097", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "00a2c87400bc42fe982a3c696e383a633e57d3cf175f012abc19a472ac4a308c", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "f6401510567352bbe4dc21e88f4ee95f1b5252e8a4902793c487875ce5790e90", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "a283c3adf9ca7676a3c29179396a72692006948632ceb20a9743c6a0708a1c9e", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "ae48d47a6214dd6e099612150a0df7e7c68012043d5e9162fd9c340a4592471f", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", - "target_hash": "aa63561f40fd2a8b7753f4f0c1ef09c888723458da0b7a01afe8fd8650e6b807", - "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "source_hash": "9e8cdc3508e243fe2ddcbd3e556a4324f7c045041c36132ff86d58c627943804", + "target_hash": "72038744fc5bdfd9ddfe14195d29d8abfab3524abc95c075a487553c134e7cd5", + "section_hashes": [ + "449fa7012bcc", + "5726d3b1cb81", + "3f8aa8c3a154", + "49b087f71cd8", + "aaf3899beb9e" + ], + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "49d64fd4e9d6844527ff0a4ebf141f1a9838f922628c48d84ce48436779e40bf", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "51b9f38ad5ebb4b2cfa6abab77e8ff16792f3e5386afbcc734077918e32c66e2", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "9728dcefbd6b6725461c624538469dc4fc271295b7c5c0ed8e36acc8624c9d37", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "1a7f422cb1e251f85204dfbf64d0982173991574e8c04ed98c41fc1eb1c40bb3", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "4fc5967178fa8a2ff6a535f2a0aac4f9dd519d0590ad33bfdf04e8431223e966", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "f54ba13557d4e4e6ade1158aaaee732c5afe257663fa4eaa34c007ed7bdcc7d4", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "d868f4a91bf922193ee97acf9d9d37fd73d9b94d0ea688c3696067b9b4049d6c", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "81b81b407191813c2fb07989984196abfad2671270f3b3c0e547b583a61e8b55", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "f2820d520ec54840063bb56511c5cf5891aea6c4066dca4a104f8df578af1fb3", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "18922205648ee0e783d22f46b2f2825fda2964eb16e11a793847e080f081e33e", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "3f9428de444d719d02953f5734516a7190a7a2023ad3457a5eddfb784cb368e0", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "430d696ab4579b1bb13cae562011ad28f72ce66f73b3a73a4c2f26eb7b7af4ff", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "402d64761dbab8e3ee290aae49b4b25b4441f481725005b21db02989aefcccbb", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "bc94abfa461059c12aef8ee9d7744b99ecb04f0cb3bf9e73949ff7e87f3c0969", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "46aa578afdda9c8c3a08bc97586a38f3e45260c44a6e412d2b155d1af2241156", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "3d90ece381af7a51f8d8d0629d7d1e74b06381b7fce8cc4f7e2d13b85246f259", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "8ed5aeb8b9c0789bed4b0ddd7ec4752883869a99e6d053348dad580ec61fdf11", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "d3607f80c5bf9cc8237ae0fda2505499f492ad654c96729624abc7113822a178", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "d34c009ececa3051eb2b9f73de517094252fb6a440a3fbf39f6de7203e8c38b5", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "1c74c0eeb21e6faa7762a4b45a456e0d11d83904e89342e15cf010bdeaf11950", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "9a83f86371a27969e9057038c904ed34235a16c5d6972b2b5462b1a0bdf60f8f", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "66e867a78466fdc24bbf3da5196024316790d4a76ebec5b9e194fbd9def4f189", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "d8029208afd16cd871e02cea84aaeb1c59adb71479b0825f3c1c6003897d73bd", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "4e67225d713723d014dfceb124d2d003957b23522acadada76768ce9ccf055af", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "7fd6276013bd06432c2d30e5b66974d475e6eec0e73aee00b8e470bb04e0bc2a", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "dbc023d9d3e5d9d4d8191a67bef9bd3787b218c8a68c3ae1178751c0fd0c193a", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "993828bf70980671a007611822a30e48a7917cf482646477fbe77d108d8cfe04", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "254b58e65bc3e9510af6b6e79c3c9ba826918f0f1c0941e04e582e1810b20e88", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "19cd379923a7f50753d3f7870743beb1c35dff72ae119cf7cb79e4da812aeeaf", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "6c0ee79091702a887b6321e068463c4850fe8ba8c60c6383ba3129c6bfa3cb15", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "caf8ee67650a8f5c661242244ef02c5bfa35a3de6b4d86bfc0edd2ecdad1335e", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "dfc969ae79be9c38153ae7929245f7bfde7dfc7c3b148a67e249862611764073", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "7c9b14503d8190298edefb79ef6446f7f5b27925ee7f9b371e621771d695b9e0", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "72c9ea8d1a344f7a875032ad29df414fd7140e2802e48e4c65ca0402cd8121b1", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "b7739152fa39d09db3e62612e3155679b7280a599c585cae8e1291a1904f8189", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "1e6c26971b3eed612cad1f9c1a1e10d07a42e16d83226a239c8ef6452e5ef326", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "5ee8535f08ffba2cd66db6d8a90ccf702b06509e65471a0d686a2d0bbb017df5", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "95b78c279506c838f39e6ade2f82924bbfafe6e32a32e2ce2bd9be009f7196d4", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "117bd712de8ccf9b4983478c192164ace0f1a49ea550249c8d497ef9ddfa3492", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "02a95090c2043e5110ea5110d24c606763f945878e05045f8f82be0f2673aad6", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "e75e7fd5a57c3445d3fdf6cb1a70baa06e49ef7217822fcb4e2507c7b2a404d7", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "b3d822fa7931c643b08fe94a3d32f5cdfd446772c79e9b870ef542db3d705d7b", "target_hash": "3ffeeb6a2dd6b72175b58fb89c9803514da6213a284f4fdfc9e1b61c6b712b46", "section_hashes": ["449fa7012bcc", "5726d3b1cb81", "3f8aa8c3a154", "aaf3899beb9e"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -124286,7 +124424,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124302,7 +124440,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124318,7 +124456,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124334,7 +124472,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124350,7 +124488,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124366,7 +124504,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124382,7 +124520,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124398,7 +124536,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124414,7 +124552,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124430,7 +124568,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124446,7 +124584,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124462,7 +124600,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124478,7 +124616,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124494,7 +124632,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124510,7 +124648,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124526,7 +124664,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124542,7 +124680,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124558,7 +124696,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124574,7 +124712,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124590,7 +124728,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124606,7 +124744,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124622,7 +124760,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124638,7 +124776,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124654,7 +124792,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124670,7 +124808,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124686,7 +124824,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124702,7 +124840,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124718,7 +124856,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124734,7 +124872,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124750,7 +124888,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124766,7 +124904,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124782,7 +124920,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124798,7 +124936,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124814,7 +124952,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124830,7 +124968,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124846,7 +124984,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124862,7 +125000,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124878,7 +125016,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124894,7 +125032,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124910,7 +125048,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124926,7 +125064,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124942,7 +125080,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124958,7 +125096,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124974,7 +125112,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -124990,7 +125128,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125006,7 +125144,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125022,7 +125160,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125038,7 +125176,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125054,7 +125192,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125070,7 +125208,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125086,7 +125224,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125102,7 +125240,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125118,7 +125256,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125134,7 +125272,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125150,7 +125288,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125166,7 +125304,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125182,7 +125320,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125198,7 +125336,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125214,7 +125352,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125230,7 +125368,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125246,7 +125384,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125262,7 +125400,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125278,7 +125416,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125294,7 +125432,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6141459487b9d9d3c17c9ea659a2e31235d5c8fc85504a9dda09618db5bc9f0f", @@ -125310,7 +125448,7 @@ "fab14aa80ee9", "241b5d10a60f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -125329,7 +125467,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125343,7 +125481,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125357,7 +125495,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125371,7 +125509,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125385,7 +125523,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125399,7 +125537,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125413,7 +125551,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125427,7 +125565,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125441,7 +125579,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125455,7 +125593,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125469,7 +125607,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125483,7 +125621,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125497,7 +125635,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125511,7 +125649,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125525,7 +125663,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125539,7 +125677,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125553,7 +125691,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125567,7 +125705,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125581,7 +125719,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125595,7 +125733,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125609,7 +125747,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125623,7 +125761,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125637,7 +125775,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125651,7 +125789,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125665,7 +125803,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125679,7 +125817,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125693,7 +125831,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125707,7 +125845,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125721,7 +125859,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125735,7 +125873,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125749,7 +125887,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125763,7 +125901,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125777,7 +125915,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125791,7 +125929,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125805,7 +125943,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125819,7 +125957,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125833,7 +125971,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125847,7 +125985,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125861,7 +125999,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125875,7 +126013,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125889,7 +126027,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125903,7 +126041,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125917,7 +126055,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125931,7 +126069,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125945,7 +126083,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125959,7 +126097,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125973,7 +126111,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -125987,7 +126125,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126001,7 +126139,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126015,7 +126153,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126029,7 +126167,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126043,7 +126181,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126057,7 +126195,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126071,7 +126209,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126085,7 +126223,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126099,7 +126237,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126113,7 +126251,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126127,7 +126265,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126141,7 +126279,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126155,7 +126293,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126169,7 +126307,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126183,7 +126321,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126197,7 +126335,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126211,7 +126349,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "67be529170f43f063f35359d76704637f6505e4fe2074b0656f8d6f74dbb3a7c", @@ -126225,7 +126363,7 @@ "983f2d00dc52", "f206a6d8e1de" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -126235,7 +126373,7 @@ "pl": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", "target_hash": "e9b4983080533175eaf987e640215c6d0e4847aa6bde2f60631198fb39673e4a", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126249,7 +126387,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126263,7 +126401,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126277,7 +126415,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126291,7 +126429,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126305,7 +126443,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126319,7 +126457,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126333,7 +126471,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126347,7 +126485,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126361,7 +126499,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126375,7 +126513,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126389,7 +126527,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126403,7 +126541,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126417,7 +126555,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126431,7 +126569,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126445,7 +126583,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126459,7 +126597,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126473,7 +126611,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126487,7 +126625,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126501,7 +126639,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126515,7 +126653,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126529,7 +126667,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126543,7 +126681,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126557,7 +126695,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126571,7 +126709,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126585,7 +126723,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126599,7 +126737,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126613,7 +126751,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126627,7 +126765,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126641,7 +126779,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126655,7 +126793,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126669,7 +126807,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126683,7 +126821,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126697,7 +126835,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126711,7 +126849,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126725,7 +126863,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126739,7 +126877,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126753,7 +126891,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126767,7 +126905,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126781,7 +126919,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126795,7 +126933,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126809,7 +126947,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126823,7 +126961,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126837,7 +126975,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126851,7 +126989,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126865,7 +127003,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126879,7 +127017,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126893,7 +127031,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126907,7 +127045,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126921,7 +127059,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126935,7 +127073,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126949,7 +127087,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126963,7 +127101,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126977,7 +127115,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -126991,7 +127129,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127005,7 +127143,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127019,7 +127157,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127033,7 +127171,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127047,7 +127185,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127061,7 +127199,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127075,7 +127213,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127089,7 +127227,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127103,7 +127241,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127117,7 +127255,7 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "60c679beb7e4b5e31757af38044b33ddeb718951f81c422772693d37effbf2b7", @@ -127131,16 +127269,16 @@ "989b4d77f418", "80a37ccd59f6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/reference/API_REFERENCE.md": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", "locales": { "ar": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "b90ec0ccaa07d751229f7850386b5437c3c90649550945900fd06528b68dc234", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "f8bec49217686ce9e23cb762d9c99469aa73c9b6ea6346f8fd85cc46e03b1cd1", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127151,7 +127289,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127193,11 +127331,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "fc1ecc2eada895226a2e61f7801ad48fdf226bf26571a9122b9ef2e1f188ee21", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "4368ea3aac879b80bfe280b07efb62ee038efc4575ea077f8069419a7f8b5459", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127208,7 +127346,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127250,11 +127388,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "dfbab5546c8a03d8bdfe1b30e42994d4239f1cd8bc55b3ffc25fc6b19ecd1387", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "9e3f04e00966222aaa70e1ec1fba3452ced92ab3eba1de9e67ea355aa5fe117c", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127265,7 +127403,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127307,11 +127445,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "a1c5f248f11774f7da602b3d6f403126bb0233ed4b3c7a125158b1f3d80451ea", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "7c90bfd93fc7b930cddfb9fc4d1be745a9171534722bfe04b5c1d4ba9ad10b99", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127322,7 +127460,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127364,11 +127502,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "38906134deee0e7e76fd80131a27ac8d490d6cc8b88944835577b8bac595408c", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "d1ee1b5fc4f898adb8b99b8ec7370d23aa04106fe33add55759df6bb38c6f56c", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127379,7 +127517,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127421,11 +127559,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "8b2a3780d1f51ee5598199dd2656c0af903180e24d5f6d792062e38f194de4cf", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "618495004018f196c1bb5a940727ca1b61399029de87f90e23cc38b426f4406d", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127436,7 +127574,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127478,11 +127616,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "83c26f406e205cb2b7e0fb627e043561757fe79cd3ea06534f0c6d869615938f", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "0042614cabe4e83b081bacc58ba7b379d867ef7772ab2abd7df0103f8da412e8", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127493,7 +127631,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127535,11 +127673,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "da8815d501eb9a653fbdad9939d4bc2dd37bbee9ee02c3e467d1eed66103ad6b", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "7182e468d992b35e25da254244ee62cfaec0ab0e0e394dce2b3ccda481b70a29", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127550,7 +127688,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127592,11 +127730,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "578f0213d180f258d30e35dd90c5198b7f6ee0d2267cd7a0b667522ac2a809e5", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "fad5e5c37c986260e8292aee468a7632654506cc1f1c267442e8fd2a2e9c301c", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127607,7 +127745,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127649,11 +127787,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "80440a2d6816ad6b202e610b07042b8f5f0b1e34c99c6843150661fbcb1f1fa0", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "8014f00fdaefb45f7e992b6c7868d3de8b7bd62cdbb306b61f2a88546b891b52", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127664,7 +127802,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127706,11 +127844,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "db486ca0fb6baa04350c193aecc9e5249cbbda587aa6055e5871c47b3c945114", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "7256222f50dbf1466bcc4afe7dbc8bcf68afd3f42962e484b126f863e1713497", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127721,7 +127859,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127763,11 +127901,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "20396b1b023e84840d216bfa95d92b93250d522f017349e713aa19e27bef581f", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "946ed88c4b1696495f35ce0d049d9c407a2e1c07b7bf9727b3b2df36ec2a364b", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127778,7 +127916,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127820,11 +127958,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "75539b349aa3abcb6b89a03115f9b0fb86095dc6861061f643a6ca342321a62b", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "30eb59935470a029312230db30175931fe58c78c719d06159e304d053584479a", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127835,7 +127973,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127877,11 +128015,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "2723fa2a8e1741464bfae803a05d0885c8d9dc0bf202ced47d621cec66163213", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "70264c2fdd32520efa6f89d016459a21c0dfdc0e23bf6665a95103dca170e0f5", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127892,7 +128030,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127934,11 +128072,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "2f5465c25e6dfecc80c701089fe4694e0db3dd6bd2ac68b9aa23b84ce35c6d16", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "a0cf944b994336406a38e4389851377c3039734bd9b530c83538e86ff86aa0b5", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -127949,7 +128087,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -127991,11 +128129,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "9fdfc9fe523b44d54f77f91791d30e1da07ab111a226c973425d453f28728fae", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "ce26c7eb513e4b26524ec4e126952a5775ca07b05ed42b6fe654d24edc3cec90", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128006,7 +128144,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -128048,11 +128186,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "3b11fda9aa37ef182eef8e95e7dcb5c9de05308edda79b8636c5a7eceb8e57f3", + "target_hash": "4b0b892fc7e5e03d61d9c5e92111f9ffd66027863380dc1a30aa6fce2ebed11a", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128105,11 +128243,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "8cf2dded90839db158f1aa227777fcf15002a06c08776b39d89676ab1a2ab0be", + "target_hash": "14d043ebf741b27f8056123790115dd2ccc052ae4796f71ac4130c5f69628925", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128162,11 +128300,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "e459545d3ca7178460c8d446c73d0d0ef1011f0c95b5ee77041a0db3a5599549", + "target_hash": "ef879334cfd9efba62d87c6a60c0016fa9138a3d2e2ae53c2a435fbd6f5dc6e0", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128219,11 +128357,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "836478177eb09a5ec4b76a89a631b656d31f52604b80019961521f6254e31360", + "target_hash": "92f3cf45def06b05510aca7903887377598591840d81bfcb6690c7e7f6f387b8", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128276,11 +128414,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "37a10e1208336f1d32939cfed2430ac1a4d1c16ff1ce468735eee6ff7721186b", + "target_hash": "fe7cf9b0ec91b4dc0caac06477b074a258dff236364418aeb394eef04e41cf38", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128333,11 +128471,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "399be7f41ed4f34ad2a53e54c69cbdaa67e3b591de400c0684eacea6575252fc", + "target_hash": "dfce5b1f877a19ec3af7d065f42e120469b24bc28d83f7c57e70337d7864f0cc", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128390,11 +128528,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "7ab45956078b3e77c7681d9abdd16c3bb12a5908ed04053eef5e29035b1f349c", + "target_hash": "8ba07de659249bbc80d777c7680039d1a099ae2f686586e643dfd6714f61b393", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128447,11 +128585,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "496fa31c51001823d6c3dd9984a289983cde0d45e26b23e85a8b1eb82f7f4c1f", + "target_hash": "54b235543480801903d356fc1f48169008497641a7dbe5f79bc42440417f73f8", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128504,11 +128642,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "90027212c9c9d982b45a70ff10ed40d871f070bbe09abb92dda2dfa31c9b4142", + "target_hash": "b8e8381cc047c70637faca560a049254de071b131d51689fd784614f67fd5f20", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128561,11 +128699,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "c70b321ac880bf3a26906ddc1fbc99607efc2b2150611ce6a2af7cf51e37dcfc", + "target_hash": "e7b0563de97ca587f31795f06fe4cf1afd5a401a4c1df783d6c20bb37a289599", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128618,11 +128756,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "d8488a3277afb6bc3c17c3ee3976d5c3ca26bfcae8e402892198c3384f3412eb", + "target_hash": "b5ace1f5ea25c260aa7354434d4798c5dda7451a4508d7adb6279e8a18105e0e", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128675,11 +128813,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "e0cb0b5db8e633f05464d7ec63a6414846dfb457d2e53d6105d694320daca9b1", + "target_hash": "b60ac53902ea43210bee108313488ce3b06242335e94fb4ac5de15ab67c0f271", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128732,11 +128870,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "c4e13d29339aa7fc53bb28fd49c1b5f289565e7a2efe504b1c9b0e5eaf179fa1", + "target_hash": "8cb0457763fc0aee0a4f6811609f4ed8457cee6d628ddff0964582ca6e928793", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128789,11 +128927,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "de9ac9c119d902f576736297e6bf21cf934fe8c4127a6140ab66b66553412e7e", + "target_hash": "5755a882d07da00b6f7eae422d3eda3254e1c37fef8a44947dda06eab3e8c16a", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128846,11 +128984,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "8191825efcf4b5e6a6a2c31b4724c56a975cc45828b1788ea046fd8b9bf4a6ad", + "target_hash": "b9f2baceabe28a9c955cb8687857edf4a810cf64b10875d57306479eb7256880", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128903,11 +129041,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "cfab8dd8fecdfb6974fa6418bed508327d622dffd2d709272c191ffd145b5c5a", + "target_hash": "37a249c82b24267441f1a5e2ab5cd4b5609e30195c2c3dcdfbea1ba6b09a2739", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -128960,11 +129098,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "3b9ba8ff88954251f6861baac9bddf635c7d31ac48a2a1b8b9cb910281032719", + "target_hash": "40ac2c79b8603a317914544f1b63c380d44478d44a341d0a9bfeff876409ce6a", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129017,11 +129155,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "9d7208f582f48eda7dfede6c7827a752b0a8273566aef6ac9107edd38448a402", + "target_hash": "190f2602d1e40d61a8138c13ab9cb1c0bcbbb1e2a19fa273c84805ddb0707179", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129074,11 +129212,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "29672d71526e31542725abf76f8a864c7d5fa273fafb8951c24a50f34afcfdc4", + "target_hash": "b3c8f60156839c2a8eb8014c127790e588f71323f4c14ca81e9db4a419a5d90d", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129131,11 +129269,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "2b1d0a552f00c3109ca6d703e7fefc074669ca90ab774f212f4cdd2d73e76677", + "target_hash": "261f9d2f41bfe8ca7511b6a1fb8619edb17227705783e509aa6d5d20bd8d98cd", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129188,11 +129326,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "b47471a272e3ad368c5e40b6b4b4d5e899449470403cdb5f3d2fe13f415142a9", + "target_hash": "4bae15704265eb59da3f0f8b161ecc347f6cf77d87b06986ba356b08c8d6a338", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129245,11 +129383,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "02c1fdfb6b4dc21b145940275b4463c1884753c0eb44e0279ca415db32587c14", + "target_hash": "b17f28c292c9ddc47724e78a13048258f08c6d4cfb4fe78ab552c5aa6166d166", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129302,11 +129440,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "e0113560df5839293f7a9fafa429725d36692f896e6add1701e02e0a045e21cc", + "target_hash": "996f2b4310c26ac2c89e5a903aab221fb30819bfdad6010f59177c10c982b4e7", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129359,11 +129497,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "747740f90d5b288757e018c651126a77fa7e9c2b4e1be47923d1fd129f978a37", + "target_hash": "d9dffddac9f372281f35f399915e80fb9db489d60836c809c808efff271cd9a5", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129416,11 +129554,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "45a41d987545357b7fcdb824a604499ba000c9299fc8abdd814c2a440c09518b", + "target_hash": "2dc4423ef5f69205eef8e05bd292d2f868b800a9cf9b8f49a344d1aa764488bd", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129473,11 +129611,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "6e49530ba12a4db0fcca2b12c8a93e5a8d473c6bd0b2c6c4ccf01a89d342ed2a", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "5829801f1b0d0a9927e531764bd997ffe6524817e6b220efd158f11bf3fb460e", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129488,7 +129626,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -129530,11 +129668,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "c646e0f036974a680d7dbc7a524e939c7c45b39a9978a69996ff4cac9b568b8b", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "ebe94f11d074647b56fa536355dc6098fa9fe44d1c137d8126e1fdf835431bb5", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129545,7 +129683,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -129587,11 +129725,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "a10040d68689ae29fc120e0c7d5942353bc3438b8c57b31fe0ffb15fb124c485", + "target_hash": "0bdd860d61c6bf4b714b749cf33e572336694a3c177c35beb49a9914a72351f9", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129644,11 +129782,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "4999d5a00e8b677b0265194dea51b4e0dae49ae9cbb54d3d90fad0ddcb56030a", + "target_hash": "cbd8d932cfd5b90f378d534aac28057affb4c44c57163a649b74a0de4f22fadf", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129701,11 +129839,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "567544b5b2ca841e94987fefac6dd28a722657336e41f7efe93b52ec745095fd", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "d48869bab42b26d65b33cce273724aabe868237945b269fb9372c4e7c2116e21", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129716,7 +129854,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -129758,11 +129896,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "8a3c75cdd1e6d52c963af3403890964ff567c4cb3645a4638a6a0f7cf9c1223f", + "target_hash": "ba1ba69a756aed5582baf8959a7825e69a7a2f5919454e935b556dc6a2b602f3", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129815,11 +129953,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "397f3325406843e10e46c3c099c44be69875e796cd04ff87671b01d78cdbf284", + "target_hash": "0b4398894bcf1947b1b428792857cb2632ad94e7f25e69b36147417363965718", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129872,11 +130010,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "d6113a436619d136bcfc441247826e05ae947733b195a720e6adb3f2e82d7d64", + "target_hash": "bed278c08dc2e161d8dc56b1bb5cd3f52efb96df7d865c25a874ad8770a8a349", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129929,11 +130067,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "1cabea23114c34a10fe65a3d9757c7d097e1ef93833484db6e212348696a34c7", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "fa5c396bdc0ddb05581e38ff63c690fe21e0dc49034bab5bd382807e4d2c9f73", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -129944,7 +130082,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -129986,11 +130124,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "77fe8561d2c41b6d17d33406cfb4729d144d526ba72346fd7f40140d0aef7f4d", + "target_hash": "23333390e96a012e7525330adf6145a96832ae723ec017c5e83b41c68bcbfce7", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130043,11 +130181,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "616514cf121ba19c674c5e3ddf08b0d13fd7a1842bad11a2bcdc13c7319bbff2", + "target_hash": "411342436ae5b5a16d5c9a6fb65b36cc320af408b43e623e4636bc971a66d76b", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130100,11 +130238,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "de00796bf8cc53503bbc829add0a650eeb4226c8d039786098e2eaff052c3959", + "target_hash": "f68ec2df0db61c2dc6d631ac04323a6f748d91a0e3d6fbd89895c9e237aa07d2", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130157,11 +130295,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "83615cdd34135e63b3ced1309efe6b9079f3e60f01174f82b199c4649d487617", + "target_hash": "488384a9ce6758a8831e143b6a6afbfc131ff3028921dbba4884b7c4e5e68ad0", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130214,11 +130352,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "f31867271dcb2dd286ce82cb606456b5e3142d794ec3045c89f087cdfa48d0b6", + "target_hash": "d74e0bc0b86fd6618e9e14bcf2c22a24adc0abfe133649b69f20b665e66413f5", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130271,11 +130409,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "157196029ecaf5e0c678e5ba8740265a188215d64705106c85636bb8974ad582", + "target_hash": "868b170aed7f5fb43c386414dd2a886b1813b1b693f73efd7321dc095fa1ae11", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130328,11 +130466,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "233bfd8ee2768bfd0e2de1e459cf2e36cb81609cd5fbd1e0fdd4c431f9b12595", + "target_hash": "1fce5de18e2e50a636100bcc3e128f7025f90f380a945661d8e76527af12c017", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130385,11 +130523,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "96b88265680d3863fe342a26bea9dbf49c2bf0b993e0509dda1d7b0eb9942e6b", + "target_hash": "205ebd9541c4b4643d6742c876285bee4ff91d8457a8f05fe4d0d72712c573c2", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130442,11 +130580,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "271fb4484332e92054d1b24c41b10ebf24af0ea8b06c699432ecfbd096e73bce", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "fffa789ee9d4b09b4d2d51cb5168f04be8971db06868a65854e56042133aa61f", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130457,7 +130595,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -130499,11 +130637,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "cd2ab4ce1b5e364a93df44969fdc064d4597a0b7350a34ae711cdc6ac256c544", + "target_hash": "19d91f623dc193c77be86350f38aefa46439db5f167c3afc0181a865304880ae", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130556,11 +130694,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "2733583560fba3ef8daa59b73b1fd67082db5ebeaac15c3b60105e805f45e25b", + "target_hash": "a4a39ab34655ee14f7f505ca23bcfce16813248237ab0a2ae9b5b352b48ab2d3", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130613,11 +130751,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "98e6153e41d6c51b498576ef1a7e401af2f9b6d455ef1615268eb7c46cf37501", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "cbbe40e087ecf3cd9d94eea8f6dd180587b6e178dd834286af5ebde7c1958ff6", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130628,7 +130766,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -130670,11 +130808,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "d820e0d96a92b5b15035325b8943010038a33fc02958b12c4aa24cf01f8cb0ed", + "target_hash": "a04075407f2541e6fb63c47e4b878de733b7be6678ce1b77aa98f070c590786c", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130727,11 +130865,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "28f961560767a1295d9727814d5d9f320dbff6eb326b1c3e0c9c588abf42d829", + "target_hash": "9ab1beb6c22ec3663b74e264dc771c8743b0e13ca40a3a009c5367ad7a048ba5", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130784,11 +130922,11 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "9aca97ba85ea7f84a2436aca565d7fc76c80c5739749e30f5ea716ef06c3f912", - "target_hash": "b653cdbfffe4b7d1997f7697c62e3ed72386a84339d7096eaeee4c044be4a47d", + "source_hash": "f5d71654d79697dca4e03bb3571b9da42125e526f6141e4307876911ba9c6a5c", + "target_hash": "3d853c9edb0582ec058cf0314addb1cb8c08a3698b78fa5610ba5437c9ade68e", "section_hashes": [ "91b0eaed402c", "347341ba6233", @@ -130799,7 +130937,7 @@ "f5031749e5e2", "fcc4e86034f8", "9c2d17f8f88c", - "b14b9f9f8056", + "c48f8ea4a21d", "b21010bacda0", "f857debd468b", "7f149429c43c", @@ -130841,7 +130979,7 @@ "09c726593fd5", "488a77759b48" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -130869,7 +131007,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -130892,7 +131030,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -130915,7 +131053,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -130938,7 +131076,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -130961,7 +131099,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -130984,7 +131122,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131007,7 +131145,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131030,7 +131168,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131053,7 +131191,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131076,7 +131214,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131099,7 +131237,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131122,7 +131260,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131145,7 +131283,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131168,7 +131306,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131191,7 +131329,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131214,7 +131352,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131237,7 +131375,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131260,7 +131398,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131283,7 +131421,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131306,7 +131444,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131329,7 +131467,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131352,7 +131490,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131375,7 +131513,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131398,7 +131536,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131421,7 +131559,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131444,7 +131582,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131467,7 +131605,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131490,7 +131628,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131513,7 +131651,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131536,7 +131674,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131559,7 +131697,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131582,7 +131720,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131605,7 +131743,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131628,7 +131766,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131651,7 +131789,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131674,7 +131812,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131697,7 +131835,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131720,11 +131858,11 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", - "target_hash": "a931a0e45a9f9bc775281b42c7792ae1b69011b0801139d46e714ab04eb6cc0e", + "target_hash": "11fb79b54cbc7fb5844738f4de7d20fc40707309481039e5d692db9a6c048d68", "section_hashes": [ "336a7795b403", "8c51d9b0bf1d", @@ -131743,7 +131881,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131766,7 +131904,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131789,7 +131927,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131812,7 +131950,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131835,7 +131973,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131858,7 +131996,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131881,7 +132019,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131904,7 +132042,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131927,7 +132065,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131950,7 +132088,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131973,7 +132111,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -131996,7 +132134,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132019,7 +132157,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132042,7 +132180,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132065,7 +132203,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132088,7 +132226,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132111,7 +132249,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132134,7 +132272,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132157,7 +132295,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132180,7 +132318,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132203,7 +132341,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132226,7 +132364,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132249,7 +132387,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132272,7 +132410,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132295,7 +132433,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132318,7 +132456,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "b34753a696f448a27f8fe356fca6ec99bb89082df5211a43952b6f28540e1820", @@ -132341,7 +132479,7 @@ "d83ab231873b", "a40207921896" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -132352,418 +132490,418 @@ "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "c406cc4fc27d39f56afc6076c9c2fc8ef966593febf4bc23afde98b8b528ec33", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "c37117cf6653863cd7ecdad900694ac6510b659d7c2bfb75a3bab4f215c80cf3", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "ba1c0deb3b93f0e9ce5f8d95cb4ff426698ebf48c4ff9fdb2a362907a88f5cc9", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "8abc8d5e6c55c27247a79de0c33a8cd62a524fe0629c81d44b2938b458017e2b", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "a01f2c0499650f58e00f2dac64de83f38548cace7ca2e4ab9e3033f5f9743d5b", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "e823dd19e9eeaad03e1e77e81e063d0806235bf443bd6a8204f4e689157fd4bd", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "707392da8d5aed8ea8a6b631f1894d2cda79a40673e597e2c1f2d8ea88379b50", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "5783d35404f64b60b01ecec30a50c0b844ab14eab93cf9d68f2e7fcef122b628", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "99222e3bda1b75886a7e3862e567272668683bb2d516e69d29610954e35d4564", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "8c4e04c87405abaee999be40075202da40cd4ce98e4ce31a1b44e42c851601e0", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "0de1882416421e83a2a48f246d85bfff034040b0a533eca33ce2bd970a6dd112", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "4fcb45f2be54c5149f7a1de0d136d4f04b7ff47f800b66362bae9d0dea3b0fc0", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "366cbc5f561f3d1e8419aa8b2261c5cdd99d591ac421dd9c160d86aec5bcb925", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "5c7215b0f940d9987a6727cd78f25c0d86c97184b03666ca52f3342152a97f42", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "b22d20cdd1d7deb5dd8ec115b93657e521289e4bca60fd1e987f57edf63faf21", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "86141e66d7b594208aa23c36ca3ff1dcc0b59e67c2b31e1fb0c27adc8d38cd14", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "ec68659d1e0719d86fe77d0bbcafd27cd7db0d71243bf1ab705ccac00b750003", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "af9f2df6a7c0251411461503fb9f235b98fa41f070ebf5dafe60170ce6d631d9", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "500885141610e6ceb242fec1bf49410f0bf139622b7ab8170b333c100887d2ed", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "4343cbbd365d5dda5f39860fba5465ada9e0d0ec330877513245a6ca3a3ca433", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "f954f427b8a3b158537602449847d2d8be766af5d84f36e58d124d4a9c3eb5cf", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "37a54d353386bf36d4ddd058941e2d4e76f3f04f346a03b6477e825427372baf", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "611b9d62039970556e5a6d88e0f03c59b8577e07ca9063e3bf0752acb0fa2bf9", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "7f331f3596be794134b21c99ecce8f31e539795aec226c480fa94a651d10db61", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "dbe817cb2db7b8df38662e860c2318228cc63b4be9234cc56c456071aafaac8d", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "7f2ac3a46b59633fb047bb1db7b87521f24054f2b8a3f67914f7b3b0e3b569f4", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "fcec817c817728b9ef2c111c20d8820052fbde57cec98d3c663e5e526ecd94ba", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "ff235471d15263b37caef4210215d9fb63540665ad4493c7c7218e6fa93accdc", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "aae32351e7a40f87fce54f1a088dc33c0c65942b327f3bd3e17daff71d59a90f", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "48881a6d5973a6e96280661b592459eb20d318cdc44a4aaf7031c909eda0d708", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "8431b6964910a97afac5d46a00b79661a362cad85a0b02d641f4be4e10208cab", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "2e21e6162b387a9992ed95ff3cf0efb90b1addbc33d70726732534d0f97b402d", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "5d438028bb988dbe87c401a26b6e5eb9ad6453d18f77de25869fd21e5f754f79", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "77b24348311a64a859cd03ff2b0d9cd249168089cef461db74f66af882e5b8fe", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "3987e7826c3c7dfb456bdb3a7be3cbb6c6080d21b692e138cf06a4f1d2fdfcf3", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "741c7b4a75ddf75e2762d975c0d72567839e1409d67ce64124ab7ed92a975a65", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "6311876b450cae576a43ac041cb8e45b5d750d2ce48360a7a51547d5fcd47abc", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "f07a836ad4f462ebf87a66e06fd2e901e6ad195621d35602376eeca7668e16a1", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "1c4c0c77d6a38f1c2d59d8501cd8fb84c62648b0b8234b14538bb487260d1340", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "307c6c70da320962b98784666f1f52c18e3b3694104fcb1265c77460aee0af11", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "e8dc1c2930b990e983981cba97e4d3d881826537952ab76bef55624f26fe7e5e", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "17b952d41ad274665ccdf01ee02095779c3a4eaa6cc3ea73216a8ee6986c9722", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "0f9c431f51fe643ac10500dad7961e6832ac03d5372d88002ee38acd87d58fd6", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "fa496b3ba7774866ccb62e1968ffb42fd3b7011d6f3973f75f39a70667b48b8b", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "269873c2e37557a241b1745caac7d31fa66f3952f5bf100a71e3706bc21df45b", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "421aca68044ecb84423fe8c7ce6d513823003a81c3897a87fa40a33a1fc9f63c", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "77b0308cd61eb307de3d0e59f93e4e17d919804bdf4737bdc6ba0b6257b44078", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "227ae823cb469c7b9d4a2a38a1cdade6a5516500d532430847c9ff9506eaad85", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "d9a94a418dc4a283658a2474a3007f4e3990111831b339b2c3aadea92b196a4b", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "ac5baf6ff2fa5780bfc494121c114411a09e707363278ed4379cba66ed06739a", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "a7d779de09bd36f946ecff5e40449cccbfbe806d073e41f5f1f09401d1d8ff3e", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "ec4b91ad8cdf60ebc51db2653d517cff870309822f897230a5f8dbff9f356799", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "a72644e6eb6ccb05f2167d1dceb262ef1f9e51fe69ee4326d9520d925e0f5b34", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "07e8490d5029bed6eae53a8069192846c63a6126a9a32722dffbcf4de59f72a4", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "dfc9e88473802d6da3ed11776f3a2ec512fa0813dd0ff81c0e9c4e34dbbcd91c", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "93b6c432af3781aaa3d60de9e625563bbea40105e63c3b61cf8c80a583873014", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "6aaf374a5045102ab8ab468be971571a05387222c77fefa43943ff13931f5bca", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "def16965d30eee9fc48c378b5b722fe21fd84933f6b42130ad8024dbc2598446", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "c6bda62d7a0ba119bc89a9c373500ce901d07163337711281d8249dc7d62e87f", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "a9a7ea6ef4fcd4ed7076962e3b549264a3f440e7f9344bb17a90fd28f49d338e", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "33d16c2832c28394ad77efbabee0ddcad10ab80f7f01352c98c168e3e1ce4479", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "ad655b54e089822762c9a9976e061b574af326a3174919f894ffad5ed61ea9eb", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "8de9a1623071a002688455f27c4b9f32e7d94b97a568d1236a3af2180d3c5388", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "a19eb6a7d6c0c0614d7418a658a67425c36a40380528a9efbadf28751425591e", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "4c0e0e95f7bd40fdbf9732091454ce4199d76e50244e9992b349eeab11d6a7d9", "target_hash": "243384976a474c355c464d106dcf1179d11e83601bd4eae3282070adf1122414", "section_hashes": ["0b289c723752", "31dd7985b49f", "a04f16655688", "60c73d142489"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/reference/ENVIRONMENT.md": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", "locales": { "ar": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "1387008341317baecd78b93c822a66ce08386c729ea3f050c4a781098c918eae", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "de8e1fdea272afaa462626fa3527799ab0d95f564c17fbc9190d94b7dfdf75a3", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -132774,8 +132912,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -132786,29 +132924,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "400e0a6abff3681bace80e6d4513d7ecd361c517f4aefb1e3a46e5fa411b61b3", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "92bab3dccb5b6ff1ece272e26f93654bbf565c9f4ab61e3c622b41a50fdd7b62", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -132819,8 +132957,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -132831,29 +132969,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "707adea694c3fb1abfa9b70eb3b05e171154e750445e20b0bc78813ab365939e", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "c9e1c684b54fc84775e2f71432005170792a638926d7f1d74f95810a1dccb804", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -132864,8 +133002,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -132876,29 +133014,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "a7c6d93a3ee8d9a3d6c0e9a4716c8786e58a590da28838cf5d38c9e5a753c176", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "86b58a7747320f025ce8b2a7f0198bc3182baf2fab1881ba6f859978af97ee2c", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -132909,8 +133047,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -132921,29 +133059,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "0773bea62be9b1b691b2a0a793abf5ac2fd77db281af1be335023d969e6f44cd", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "8e8c041512d4c620379905dfd08e775a4d74be63775a3a441e582d01179bc8ea", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -132954,8 +133092,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -132966,29 +133104,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "f2484511e292e7bd13a7fbc1c1abe0e4cba84049afd6a38dc5ad44407f582263", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "fbae84eb762f4a11100b14a1b1e27d748ea4a987d8dd5f71ee7b28f21089d488", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -132999,8 +133137,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133011,29 +133149,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "78cf1e51a4cf20116de7d81c9488e33006e517a8d358e152d464522b5618d698", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "1e9f0522748534ba752ce2e19b65d736c9ca0f6613a02f555a4a1e36aed10a15", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133044,8 +133182,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133056,29 +133194,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "1dadccd6fb27ba5f70f2a75082d37f6a8d3fe3db87d51bbc46aa6bfd3d871fc2", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "8c77cd6c92c96b5ad05a34fc12a286825dd6fe6b28e4bbc206a7fa1303a062da", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133089,8 +133227,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133101,29 +133239,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "4071a6edd176121df7c9527820ef750829a0675fbc70409d9eeac69231ef1cb8", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "33d65f3fbcf07b09d0939a764b41d4b90ce5d804d8b47f0d30132763f577b6db", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133134,8 +133272,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133146,29 +133284,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "95a69b1e8160dc80a4acfeb7f847d14c02b8b0466a57431ce294d679d27c657b", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "8203702aef5df955d85293bad73978861f1dd5617fe375fa8c0713253a6502ab", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133179,8 +133317,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133191,29 +133329,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "c4a9c977ddb92dcfd155f60629ccf8a92ef7d9aa3ec57aafd41717bf1a167a9d", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "ad76ecb1c154784fd5d35dced0d981e1c8236f1ecc5cf902d9815063fee8269a", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133224,8 +133362,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133236,29 +133374,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "96d02868c345bca9dec50720d3dd6794a30a9badb9e22e970b65b52151a40be1", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "1def596a6f54a15f715ea146399ac8618abd2b92ba57576d9c46224e6ddf1283", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133269,8 +133407,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133281,7 +133419,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133326,29 +133464,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "65c4f13c564db15907d2cea561fd1c84188e81d17ea22f84493b3d6111524b54", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "2d3d234a2525a4087327d30a9738dfc7a735ba1fbdf6d02cf3c0e76721a4b991", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -133359,8 +133497,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -133371,7 +133509,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133416,7 +133554,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133461,7 +133599,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133506,7 +133644,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133551,7 +133689,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133596,7 +133734,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133641,7 +133779,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133686,7 +133824,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133731,7 +133869,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133776,7 +133914,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133821,7 +133959,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133866,7 +134004,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133911,7 +134049,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -133956,7 +134094,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134001,7 +134139,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134046,7 +134184,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134091,7 +134229,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134136,7 +134274,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134181,7 +134319,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134226,7 +134364,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134271,7 +134409,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134316,7 +134454,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134361,7 +134499,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134406,7 +134544,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134451,7 +134589,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134496,7 +134634,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134541,29 +134679,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "b97c69b0149bc4eb2af93e4a91c5035b26ac4821945a6654034d088c836ed730", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "ebb1c9675b5112c94a20e169557281e14c4f0764713c0317a91646a9c98bb5eb", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -134574,8 +134712,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -134586,29 +134724,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "91d5dd7d0042ab47774c3576fccb13f37f9c50bf7aded24701debd719547f738", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "57e93f839df7c231308cd807b69d6df7386d7ade204e221deb74a40c5a49c1f7", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -134619,8 +134757,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -134631,29 +134769,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "57dc1aea7cd9fa1fae4b1c7954f93aa7b574a73351f5621670fd859766d45246", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "80ba3c01f1f38dcdd9de3519a0bbda501a9d8d109c87bd3d7b852c72df6e6b7b", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -134664,8 +134802,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -134676,29 +134814,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "f055b30872d4b063594eea2c99ef1633058d4d5a09f71ea4e9a9b308638aa5d4", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "aeb8e6579214bc46486fe7f53421347eda274a4ca26b4d848301093685478595", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -134709,8 +134847,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -134721,29 +134859,29 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", - "target_hash": "de197ee4adcd462d5e26f3b4b1feee197faffeb0d771b754bff723ab2e2d4965", + "source_hash": "4aec4d11f0eea7c0bac9dbc1b85082c7dad23a75de06880b825d9b46a77ba9dc", + "target_hash": "059e6864ef1e3b74ac8a15999568dcdbb616b5c06b635cbe05d953af03c601b6", "section_hashes": [ "c7914887e077", "93c63cd7c00b", "b1fc9134af99", - "643f5d4a1197", + "de6bed4aa8f2", "86c0d212bfa8", - "4c569fb059b7", + "63edc67061bf", "4b3527de00e4", - "aa688237088f", - "b6580ca80310", + "02ab6ff5cc52", + "e3c03bde0bc5", "f1785e55be2a", "71200920c7b5", "71d2f2ac0cc2", - "62f6fd40242b", + "67f2ad09d03d", "f0707b80be83", "272d62ffedf5", "5a81b930d1fe", - "425ac1bbe3b2", + "5a976ba319ad", "aa24dd0dfc34", "1ef41c9da920", "243eadf2310d", @@ -134754,8 +134892,8 @@ "1e6cc45bb598", "ed1a9b885aed", "f0ea5e357d33", - "813495d154fa", - "d9c81e917f22", + "7ccdd3ef52b5", + "54fbe037f418", "e0c9b8623eb6", "67417e743e79", "7d12e45e096d", @@ -134766,7 +134904,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134811,7 +134949,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134856,7 +134994,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134901,7 +135039,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134946,7 +135084,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -134991,7 +135129,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135036,7 +135174,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135081,7 +135219,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135126,7 +135264,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135171,7 +135309,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135216,7 +135354,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135261,7 +135399,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135306,7 +135444,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135351,7 +135489,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135396,7 +135534,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135441,7 +135579,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135486,7 +135624,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135531,7 +135669,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135576,7 +135714,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135621,7 +135759,7 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "89ed54248a92c9568d8bacfd5efaa25df6ba33fba25d6e24fa9b3c429e714c3e", @@ -135666,272 +135804,272 @@ "f48ac62f9f6a", "e7327d596060" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/reference/FEATURE_FLAGS.md": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", "locales": { "ar": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "8dd8326436f2937e6a4773a6cc68b6248151836f0e13296a13f97a962ab4bde6", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "9addb82b9f11c2d64a63ab6bc53f9e32263fe520a27ae024bc57b6d873f7d9dc", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "beccca0928a10dc2a0ff4a4e9d9609175d8a313b0fc4dbfb63345563cb3a1dfa", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "f40cf6643a7660eecbd0c710821e4ee764a569d16b0098a90f11dd8d6e93c2e7", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "d85264aa45c20bf4369ec6f15bc07da7ced01b0f5c861f493caecbea4f31ea89", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "4b67d218d7f9d3a34738000580a23796a7643ac6439067ffeea246b19e6cfedc", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "25f6d2201c1b8a4fd406690a3e511b4b2d7b44db6fa9dc5fc501c02cd94a4bbb", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "c5afa6ccd16c1b0244042a783e3ea3ef9450250ba7f79475fcd108343caf7cf0", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "1ba62162c522eda052a9e966d8b9620372d9ba20788ef6ee4f98a8cf10fd7f23", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "753216f2fbd89fb3465b38e187dae4a4e818721d92c70b2a3364928e1313becd", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "a562ec4ce70cc85b2639fc9aa2418e24c09ca41e55f346ede747c309d162582c", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "ff569212297efd44a79e647537919ead344cf8a17fd49d0727d792e47e1d1757", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "647e0f1ca473809cef7ae2dd6497f5d6de1662dd71bb069dc86bb27a65172e05", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "f8a5f71b754707cd356362ffe892389228c3e556d3b3109f114a539da62354f6", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "0897026f9cd33c91853f1c64cb69ccf17070eb0496bc2810d9ebe83fba80fa04", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "d5c6944f46202db8c2b70247caadf722c71152f2b88c3809608334b01394c564", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "5cd00c20ad0a44928e378049e786fe2ea3734512c6151afa008d7cd4ebf6d6a4", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "db7566f6fd86a0b4bea4a6cb3621353a9122263160844443eab00012a8cfcdcc", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "6aad85a4dcd8f6741d87fdfb52a5dca8e8dc9606a774265779f81b26fd2aadfb", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "ac3ec818a1a40d99aed3b97e3faf9d567eb80e19f1fbdadf1ea474f48311a0ee", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "94bf555ac37bd4c00d16057e10ee2302f8590304db21b2f5ccb0b95d2cd78145", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "01643765dea07d3f91f9f08196915b723beb054dac6e4b32302ba174548210da", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "b5ab4792683a970bc6e7c54c029317b3f689ec1d7518e9cab3d445444cd4436b", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "c7c2b8208ca68f2635432573a330adede10ecd4326414348b204c82d417e6159", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "3fee2753a44bf5b8e48071f8c499a940dee183508d0f1fce007e979ae9779988", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "6bb592b7c694a0ae25a4773217796b1cb12cafee068750493ae451a5de7f480f", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "da226c1951f716a0edc16ee1208b8153ea774bc53b3bd5145c3c6d0982f5c22d", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "397b94315c3b3c8daa9f9867360395393646f5238c76ee265a517830f2b17c65", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "b59a1fbc29ef8fa548d20baffa35cf465af28068399573a8dafce063ae51e1bc", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "1211ee2dcc18ae0e6b915d14f37737417ff47e3bc5fd630a1a521e72af6a4eb5", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "3cff53ee84b3eaf14632becfca13de51787c906b57c6c36e7fa4ab18c3fb9823", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "6af299dd2ada70144ea0585f08b98a949a8593b9fc0b3abdb0cc310a1e4d2531", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "81b9f976f99324c1d30d3f11f8c3b7807b2c969a7c8a02038e571ebcc4f914be", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "fb349b7ce8b94fd2c31c01fa7a95c3fa77c17d297bb7c27e36e956cde9691558", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "f4639b64862c90f34d747e76f6ee60c820fbbfbac4245a3f4fe930c15f634101", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "097985f8f8029f3d04ff9ddc8a8854427828676f7a326cb4f4c4a409e87c1a3b", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "2cfc851394199a4a0e969db200042ed2f080c31587709d057eb7125320d0c90e", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "12fa4fb58789b39db15ec9b77de029f6c53e82c2e2cc1ce51d634ab32a5116dd", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "ef32061b7c56f3c58f50eb4bfc024e424a24aae04f0b913924f4d022e96e2c1d", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "dcb4df65687cb19549e6b6dd3259656b43ec907cbd6ad1624f5e1154e032094e", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -135944,24 +136082,24 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "e958c5e4fd3ed62fcedd949bf97d0bae303bdea1fe67a9a939f11237bfc4b550", + "source_hash": "c5a0cd7054e37c4957e90609f1009a4f9b1df4f28d75a95a5dffd21752cdf53b", + "target_hash": "2421e25ed7377352953b0e7a2bae4c77715c28ae7e827c6078e1724049efcd0c", "section_hashes": [ "b262b53b0362", "406fb7034705", - "d2205d9ade34", - "8c27b86bccad", + "b24bd278e81e", + "37c1e77b3ce7", "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", - "target_hash": "13143882da92e0f6ace57f023b90b16a90a359ea2d8ac1ead379b23d90bc3974", + "target_hash": "0f5e99bf8ab495ee985b82962f70618f55b3b026daa80cc3d8c6482054a957b1", "section_hashes": [ "b262b53b0362", "406fb7034705", @@ -135970,7 +136108,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -135983,7 +136121,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -135996,7 +136134,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136009,7 +136147,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136022,7 +136160,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136035,7 +136173,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136048,7 +136186,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136061,7 +136199,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136074,7 +136212,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136087,7 +136225,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136100,7 +136238,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136113,7 +136251,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136126,7 +136264,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136139,7 +136277,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136152,7 +136290,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136165,7 +136303,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136178,7 +136316,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136191,7 +136329,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136204,7 +136342,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136217,7 +136355,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136230,7 +136368,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136243,7 +136381,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136256,7 +136394,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136269,7 +136407,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136282,7 +136420,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136295,7 +136433,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136308,7 +136446,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136321,7 +136459,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136334,7 +136472,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136347,7 +136485,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136360,7 +136498,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136373,7 +136511,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136386,7 +136524,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136399,7 +136537,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136412,7 +136550,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136425,7 +136563,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136438,7 +136576,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136451,7 +136589,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136464,7 +136602,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136477,7 +136615,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136490,7 +136628,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136503,7 +136641,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "34507de88ef9c8977cba6dfd0ae098b61f2090295f932c15aae2b3cbcda1082d", @@ -136516,7 +136654,7 @@ "2ce3e88b1669", "3a6f5d25e3a1" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -136533,7 +136671,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136545,7 +136683,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136557,7 +136695,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136569,7 +136707,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136581,7 +136719,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136593,7 +136731,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136605,7 +136743,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136617,7 +136755,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136629,7 +136767,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136641,7 +136779,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136653,7 +136791,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136665,7 +136803,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136677,7 +136815,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136689,7 +136827,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136701,7 +136839,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136713,7 +136851,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136725,7 +136863,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136737,7 +136875,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136749,7 +136887,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136761,7 +136899,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136773,7 +136911,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136785,7 +136923,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136797,7 +136935,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136809,7 +136947,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136821,7 +136959,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136833,7 +136971,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136845,7 +136983,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136857,7 +136995,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136869,7 +137007,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136881,7 +137019,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136893,7 +137031,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136905,7 +137043,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136917,7 +137055,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136929,7 +137067,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136941,7 +137079,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136953,7 +137091,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136965,7 +137103,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136977,7 +137115,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -136989,7 +137127,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137001,7 +137139,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137013,7 +137151,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137025,7 +137163,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137037,7 +137175,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137049,7 +137187,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137061,7 +137199,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137073,7 +137211,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137085,7 +137223,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137097,7 +137235,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137109,7 +137247,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137121,7 +137259,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137133,7 +137271,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137145,7 +137283,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137157,7 +137295,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137169,7 +137307,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137181,7 +137319,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137193,7 +137331,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137205,7 +137343,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137217,7 +137355,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137229,7 +137367,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137241,7 +137379,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137253,7 +137391,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137265,7 +137403,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137277,7 +137415,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137289,7 +137427,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "1de3f3be467f6004323c0547074622d8d8c0eaa3b5b1a50e4b86b8a338b5d66d", @@ -137301,7 +137439,7 @@ "71f0669b524e", "bc4c47c6afdd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -137323,7 +137461,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137340,7 +137478,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137357,7 +137495,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137374,7 +137512,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137391,7 +137529,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137408,7 +137546,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137425,7 +137563,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137442,7 +137580,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137459,7 +137597,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137476,7 +137614,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137493,7 +137631,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137510,7 +137648,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137527,7 +137665,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137544,7 +137682,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137561,7 +137699,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137578,7 +137716,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137595,7 +137733,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137612,7 +137750,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137629,7 +137767,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137646,7 +137784,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137663,7 +137801,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137680,7 +137818,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137697,7 +137835,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137714,7 +137852,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137731,7 +137869,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137748,7 +137886,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137765,7 +137903,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137782,7 +137920,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137799,7 +137937,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137816,7 +137954,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137833,7 +137971,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137850,7 +137988,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137867,7 +138005,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137884,7 +138022,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137901,7 +138039,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137918,7 +138056,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137935,7 +138073,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137952,7 +138090,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137969,7 +138107,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -137986,7 +138124,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138003,7 +138141,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138020,7 +138158,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138037,7 +138175,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138054,7 +138192,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138071,7 +138209,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138088,7 +138226,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138105,7 +138243,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138122,7 +138260,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138139,7 +138277,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138156,7 +138294,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138173,7 +138311,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138190,7 +138328,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138207,7 +138345,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138224,7 +138362,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138241,7 +138379,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138258,7 +138396,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138275,7 +138413,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138292,7 +138430,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138309,7 +138447,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138326,7 +138464,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138343,7 +138481,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138360,7 +138498,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138377,7 +138515,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138394,7 +138532,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0105f8a8a30b4035017ddae03d143ffa8874e403ec0fd0ad18ed9a041460d023", @@ -138411,7 +138549,7 @@ "e41ea6d30c9f", "02571c4c19e6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -138430,7 +138568,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138444,7 +138582,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138458,7 +138596,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138472,7 +138610,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138486,7 +138624,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138500,7 +138638,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138514,7 +138652,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138528,7 +138666,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138542,7 +138680,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138556,7 +138694,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138570,7 +138708,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138584,7 +138722,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138598,7 +138736,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138612,7 +138750,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138626,7 +138764,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138640,7 +138778,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138654,7 +138792,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138668,7 +138806,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138682,7 +138820,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138696,7 +138834,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138710,7 +138848,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138724,7 +138862,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138738,7 +138876,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138752,7 +138890,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138766,7 +138904,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138780,7 +138918,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138794,7 +138932,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138808,7 +138946,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138822,7 +138960,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138836,7 +138974,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138850,7 +138988,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138864,7 +139002,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138878,7 +139016,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138892,7 +139030,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138906,7 +139044,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138920,7 +139058,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138934,7 +139072,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138948,7 +139086,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138962,7 +139100,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138976,7 +139114,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -138990,7 +139128,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139004,7 +139142,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139018,7 +139156,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139032,7 +139170,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139046,7 +139184,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139060,7 +139198,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139074,7 +139212,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139088,7 +139226,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139102,7 +139240,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139116,7 +139254,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139130,7 +139268,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139144,7 +139282,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139158,7 +139296,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139172,7 +139310,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139186,7 +139324,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139200,7 +139338,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139214,7 +139352,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139228,7 +139366,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139242,7 +139380,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139256,7 +139394,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139270,7 +139408,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139284,7 +139422,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139298,7 +139436,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139312,7 +139450,7 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "52f40a5bb68ad220d445ceefde16fa6ba95a7f1bc5605b9b31975f2e56aad908", @@ -139326,23 +139464,23 @@ "1fb91cbfec0e", "c16912ad6c89" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/reference/PROVIDER_REFERENCE.md": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", "locales": { "cs": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "4128879079c395bbdab51da26b01293a4e2eef49e2d7e7a696269d3d5d0d268b", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "e5e64b80e2e96cc07f80e3525fb8b9ed0fb22360dc7c7a6610c01ae93cf941b5", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139352,18 +139490,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "3788cf198e6a143e6f4d6fb223542fbac21e2ba6785ecf1e9dcd2fb6d9de7a96", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "ea5236a34aaee68672de61dc5c72bdfb0e5bc7f21ceb0c06cef7658f7b56683a", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139373,18 +139511,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "817f31abe0bbeeddaa724776643b2859e611b0032b5e34d4863efe784cb5b694", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "83cccf8ed41686a79a955878943f7bdef009481f064d9a300296d25e113fd136", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139394,18 +139532,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "62e36e428087a803b94210ae131e5c5ec94a33630f8e04fdd39d65900e617ee5", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "dbcc4283a80c1f44e5d599c48eff416646f6a79c4a999455544456de175ab38b", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139415,18 +139553,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "3ecb1b4171b11c0383cb784be486f665fd6445df03da5adbb14a229f71b4f2a6", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "5561fc4c61fd85710ef2c02e71ca01077c154575e74f20d6b4219c4d12b6bc87", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139436,18 +139574,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "b5b8375316194a09adb8f1fb037a97be7f4239340b3635bd9c1758c1f4bbe641", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "078fadd543d8709f66c48a1fd7a941487d6ce12c23ba979a6cec54ccd917a812", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139457,18 +139595,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "3f2ca2318d8e892c28653e171c598ee93dd4038b06d1efaf105c71954a292445", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "390171f49efdd3688b6c075db0195e842086af14d060beb007a3ec2745c4aa91", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139478,18 +139616,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "2c20774ec7de16c740ff6c34f07d2c0ddac606cb75c1254cd5bb78faab68ddc5", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "6bec0f5d364ad70b3cda052f2961dc89a00db2d0dff6b351e4ae66d4713e1296", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139499,18 +139637,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "3e9f72f3fc4b8ea86edac2c6d76d25d941cbbd1a5838efff7f92c3fc8fb74d38", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "ddf5f782e4e6f594ad3b5015274d4ac2aa50b0344c27fde4624351760b7790c8", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139520,18 +139658,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "17b267490c3597ec22d29f19959f274d99c8d487af8d31ef508b92085714eba2", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "4c15224f0b1c7fe0cd925e99653320b2b49b37fcaafc976f5af434c197deb9b5", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139541,18 +139679,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "0950452d3bdcca5212aada1fc673d15f87ad1fc0dd1d4194248b55818264e2e6", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "3331026c2450fd6adc6b8498d52097ade008097d47d1d1cf39205bfc69cc8555", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139562,18 +139700,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "45311980991c5aa35190780b1f4c4f3adb0de74e4480f8aa715793cef2d6cfa1", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "3b2916a44284a2c0378aef61c7882ca96d50c5d5f588ec8005f2855f24fcd84d", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139583,18 +139721,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "dc7011f757b40b4561da61d7022209279cb45966d6d2c382cc835a1e91ec8942", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "a72af36a1cdc1ea24dae629e1668b174145efc38c0c5469a4d8665ecae47c6e3", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139604,18 +139742,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "b1ce3275bc47061f3c2800dfee868107a93b42e1a5f9829f88a51c3ce4a9a10d", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "ee480e8a4481f051fef6303c31b8670fb99baf8cba1ed74fed780b1e05462844", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139625,18 +139763,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "a64d940a199c3f0cdfc3fc6193839813300b1c1c2c351f27ab0a40a692697aa1", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "6d41c9570fa16ca03e2e1481f5592b3760d8e96b15b4423f6a2c97cb47f90f8e", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139646,18 +139784,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "cae3296b34c45c28e1edae9fbf044b6414f59deeba7f665152691fa8e8d3ec85", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "6d22a1c566e4f4f59623809127df1031c39212d7b19c89a8801306edf36de487", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139667,18 +139805,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "de84d0793f29d575ca6f4bf063ca071e5c8f707db7b0207519af3ba8def01c27", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "3d54eaf574669bd2be54c46f27c7bc301ede691b5ff466ef67fcfc9c7bb6a57a", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139688,18 +139826,18 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "53202f558860ca88dfee9b911425e98f3d772b73263a1cee84723172cb74e1fd", + "source_hash": "a5af4e9c10ce7baa6f8bbe17041a80a1bbfb035cf03e4c4e9b91262b751bd5ff", + "target_hash": "f557ea835ad85ff5454e853e8841f039eb9d5e439eea74eba06fec1996b2c68f", "section_hashes": [ - "5163bbf041f7", + "261963b151f0", "8ab33a31d2cb", - "df933ec3a0aa", - "8261318080d5", + "247045a88cfc", + "3bd72a2f8338", "b71ab0b34594", - "7ecf394c96fe", + "0935a5e291e1", "5a0dd732ec60", "abb3e114751a", "5b129d0710da", @@ -139709,7 +139847,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139730,11 +139868,11 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", - "target_hash": "34541a5d0ebb20eb9d7425560d03bbe9c74ac4f4e2201c88f708ba68c4f1be9e", + "target_hash": "6498ff77dfd94b957aac201aecd1499ef30a50c324efb2961b60fc1d78769045", "section_hashes": [ "5163bbf041f7", "8ab33a31d2cb", @@ -139751,7 +139889,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139772,7 +139910,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139793,7 +139931,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139814,7 +139952,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139835,7 +139973,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139856,7 +139994,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139877,7 +140015,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139898,7 +140036,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139919,7 +140057,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139940,7 +140078,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139961,7 +140099,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -139982,7 +140120,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140003,7 +140141,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140024,7 +140162,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140045,7 +140183,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140066,7 +140204,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140087,7 +140225,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140108,7 +140246,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140129,7 +140267,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140150,7 +140288,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140171,7 +140309,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140192,7 +140330,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140213,7 +140351,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140234,7 +140372,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140255,7 +140393,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140276,7 +140414,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140297,7 +140435,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140318,7 +140456,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140339,7 +140477,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140360,7 +140498,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140381,7 +140519,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140402,7 +140540,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140423,7 +140561,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140444,7 +140582,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140465,7 +140603,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140486,7 +140624,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140507,7 +140645,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140528,7 +140666,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140549,7 +140687,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140570,7 +140708,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140591,7 +140729,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140612,7 +140750,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140633,7 +140771,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140654,7 +140792,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140675,7 +140813,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "ac2711eec74f311deaf9978372c7acf7b5ad061972afdc7bd154f720de2fa1fa", @@ -140696,7 +140834,7 @@ "b6b4a660705e", "c071fec914c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -140715,7 +140853,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140729,7 +140867,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140743,7 +140881,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140757,7 +140895,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140771,7 +140909,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140785,7 +140923,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140799,7 +140937,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140813,7 +140951,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140827,7 +140965,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140841,7 +140979,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140855,7 +140993,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140869,7 +141007,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140883,7 +141021,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140897,7 +141035,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140911,7 +141049,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140925,7 +141063,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140939,7 +141077,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140953,7 +141091,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140967,7 +141105,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140981,7 +141119,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -140995,7 +141133,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141009,7 +141147,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141023,7 +141161,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141037,7 +141175,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141051,7 +141189,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141065,7 +141203,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141079,7 +141217,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141093,7 +141231,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141107,7 +141245,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141121,7 +141259,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141135,7 +141273,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141149,7 +141287,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141163,7 +141301,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141177,7 +141315,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141191,7 +141329,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141205,7 +141343,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141219,7 +141357,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141233,7 +141371,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141247,7 +141385,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141261,7 +141399,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141275,7 +141413,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141289,7 +141427,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141303,7 +141441,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141317,7 +141455,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141331,7 +141469,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141345,7 +141483,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141359,7 +141497,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141373,7 +141511,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141387,7 +141525,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141401,7 +141539,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141415,7 +141553,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141429,7 +141567,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141443,7 +141581,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141457,7 +141595,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141471,7 +141609,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141485,7 +141623,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141499,7 +141637,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141513,7 +141651,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141527,7 +141665,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141541,7 +141679,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141555,7 +141693,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141569,7 +141707,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141583,7 +141721,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141597,7 +141735,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "5ff245112a1246894c29de5c9f049cc92f6a74b20b55bbd322d3c10f0a15c483", @@ -141611,7 +141749,7 @@ "91b85980361d", "ea551accf008" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -141629,7 +141767,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141642,7 +141780,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141655,7 +141793,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141668,7 +141806,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141681,7 +141819,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141694,7 +141832,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141707,7 +141845,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141720,7 +141858,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141733,7 +141871,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141746,7 +141884,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141759,7 +141897,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141772,7 +141910,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141785,7 +141923,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141798,7 +141936,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141811,7 +141949,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141824,7 +141962,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141837,7 +141975,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141850,7 +141988,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141863,7 +142001,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141876,7 +142014,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141889,7 +142027,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141902,7 +142040,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141915,7 +142053,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141928,7 +142066,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141941,7 +142079,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141954,7 +142092,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141967,7 +142105,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141980,7 +142118,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -141993,7 +142131,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142006,7 +142144,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142019,7 +142157,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142032,7 +142170,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142045,7 +142183,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142058,7 +142196,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142071,7 +142209,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142084,7 +142222,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142097,7 +142235,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142110,7 +142248,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142123,7 +142261,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142136,7 +142274,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142149,7 +142287,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142162,7 +142300,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142175,7 +142313,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142188,7 +142326,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142201,7 +142339,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142214,7 +142352,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142227,7 +142365,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142240,7 +142378,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142253,7 +142391,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142266,7 +142404,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142279,7 +142417,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142292,7 +142430,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142305,7 +142443,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142318,7 +142456,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142331,7 +142469,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142344,7 +142482,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142357,7 +142495,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142370,7 +142508,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142383,7 +142521,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142396,7 +142534,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142409,7 +142547,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142422,7 +142560,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142435,7 +142573,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142448,7 +142586,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "aced413cdbc2974712238968976237c6c988d4b0e930d4f01d989479bc55d8ac", @@ -142461,7 +142599,7 @@ "05e650d39b28", "b4a6a5a2ece7" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -142490,7 +142628,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142514,7 +142652,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142538,7 +142676,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142562,7 +142700,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142586,7 +142724,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142610,7 +142748,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142634,7 +142772,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142658,7 +142796,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142682,7 +142820,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142706,7 +142844,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142730,7 +142868,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142754,7 +142892,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142778,7 +142916,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142802,7 +142940,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142826,7 +142964,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142850,7 +142988,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142874,7 +143012,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142898,7 +143036,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142922,7 +143060,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142946,7 +143084,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142970,7 +143108,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -142994,7 +143132,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143018,7 +143156,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143042,7 +143180,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143066,7 +143204,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143090,7 +143228,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143114,7 +143252,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143138,7 +143276,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143162,7 +143300,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143186,7 +143324,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143210,7 +143348,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143234,7 +143372,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143258,7 +143396,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143282,7 +143420,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143306,7 +143444,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143330,7 +143468,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143354,7 +143492,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143378,7 +143516,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143402,7 +143540,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143426,7 +143564,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143450,7 +143588,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143474,7 +143612,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143498,7 +143636,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143522,7 +143660,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143546,7 +143684,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143570,7 +143708,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143594,7 +143732,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143618,7 +143756,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143642,7 +143780,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143666,7 +143804,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143690,7 +143828,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143714,7 +143852,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143738,7 +143876,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143762,7 +143900,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143786,7 +143924,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143810,7 +143948,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143834,7 +143972,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143858,7 +143996,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143882,7 +144020,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143906,7 +144044,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143930,7 +144068,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143954,7 +144092,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -143978,7 +144116,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -144002,7 +144140,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "30a0893ed0750a56ef298a18a09cf7e3a53b0bf4a58c9a0a6f09659f183d4ca8", @@ -144026,7 +144164,7 @@ "0dca3a410e59", "5047b407788f" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -144043,7 +144181,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144055,7 +144193,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144067,7 +144205,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144079,7 +144217,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144091,7 +144229,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144103,7 +144241,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144115,7 +144253,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144127,7 +144265,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144139,7 +144277,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144151,7 +144289,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144163,7 +144301,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144175,7 +144313,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144187,7 +144325,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144199,7 +144337,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144211,7 +144349,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144223,7 +144361,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144235,7 +144373,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144247,7 +144385,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144259,7 +144397,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144271,7 +144409,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144283,7 +144421,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144295,7 +144433,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144307,7 +144445,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144319,7 +144457,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144331,7 +144469,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144343,7 +144481,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144355,7 +144493,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144367,7 +144505,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144379,7 +144517,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144391,7 +144529,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144403,7 +144541,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144415,7 +144553,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144427,7 +144565,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144439,7 +144577,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144451,7 +144589,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144463,7 +144601,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144475,7 +144613,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144487,7 +144625,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144499,7 +144637,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144511,7 +144649,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144523,7 +144661,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144535,7 +144673,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144547,7 +144685,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144559,7 +144697,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144571,7 +144709,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144583,7 +144721,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144595,7 +144733,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144607,7 +144745,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144619,7 +144757,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144631,7 +144769,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144643,7 +144781,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144655,7 +144793,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144667,7 +144805,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144679,7 +144817,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144691,7 +144829,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144703,7 +144841,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144715,7 +144853,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144727,7 +144865,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144739,7 +144877,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144751,7 +144889,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144763,7 +144901,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144775,7 +144913,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144787,7 +144925,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144799,7 +144937,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "53fae81597c09fb2d6b607736dac18a62886c13c2afa96d711d329e89a27ceb5", @@ -144811,7 +144949,7 @@ "e5bb27e3a220", "47577ebe8144" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -144821,7 +144959,7 @@ "pl": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", "target_hash": "7ab1867332b6aac8f35f764a5c94810b5d3fdc549ef08c4c258038218941ab50", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144843,7 +144981,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144865,7 +145003,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144887,7 +145025,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144909,7 +145047,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144931,7 +145069,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144953,7 +145091,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144975,7 +145113,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -144997,7 +145135,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145019,7 +145157,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145041,7 +145179,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145063,7 +145201,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145085,7 +145223,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145107,7 +145245,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145129,7 +145267,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145151,7 +145289,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145173,7 +145311,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145195,7 +145333,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145217,7 +145355,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145239,7 +145377,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145261,7 +145399,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145283,7 +145421,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145305,7 +145443,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145327,7 +145465,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145349,7 +145487,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145371,7 +145509,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145393,7 +145531,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145415,7 +145553,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145437,7 +145575,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145459,7 +145597,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145481,7 +145619,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145503,7 +145641,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145525,7 +145663,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145547,7 +145685,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145569,7 +145707,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145591,7 +145729,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145613,7 +145751,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145635,7 +145773,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145657,7 +145795,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145679,7 +145817,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145701,7 +145839,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145723,7 +145861,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145745,7 +145883,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145767,7 +145905,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145789,7 +145927,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145811,7 +145949,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145833,7 +145971,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145855,7 +145993,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145877,7 +146015,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145899,7 +146037,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145921,7 +146059,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145943,7 +146081,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145965,7 +146103,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -145987,7 +146125,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146009,7 +146147,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146031,7 +146169,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146053,7 +146191,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146075,7 +146213,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146097,7 +146235,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146119,7 +146257,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146141,7 +146279,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146163,7 +146301,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146185,7 +146323,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146207,7 +146345,7 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "3cb723ac2fb0c041c4008e91c7f5125d18541bfe494c3464018d240d559caae6", @@ -146229,25 +146367,25 @@ "7b06e46a3a12", "2eddb7dc88cb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/routing/REASONING_REPLAY.md": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", "locales": { "pl": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", "target_hash": "4b86b13d5a21f1b1615ea3bc897e92730148aab9a522c080eb418913f3072f78", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "f822771e649021b9134d7bb957809727edbb9f6bbb2fcee36f0829ff40a4e08f", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "867002ecb398f3776380a54176a0521029bd9a11acbb16629f7765ccb5730947", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146255,15 +146393,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "f14aab0e1019b3fd94855d277e92dc1ae094e695a2c18fad871d58bd19b189d3", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "359761b9f2c63b3a589aa667934aefe79b6166070a3443a96eb3c709876dd4c5", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146271,15 +146409,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "c3bc5729a6d25102bcbd1ad8ebf600ca7464e77d0f63beadfe2f351cc4eef035", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "d57c9dea1866d9d0af795b9abbd44531f3ecad771a4fb8e8a1e344c943beef0d", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146287,15 +146425,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "0f90a9e6819e5ab2481638a298525188e0d213a1db77b3f7d81057b0087e45ab", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "93968ad4c09ea8984e54c6953a0d87309cecaddb553f61746d465c179d44e808", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146303,15 +146441,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "28362f4ab83855373c3d024838201161d22a1c7905bbc4bb883c41c8a816e9a9", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "ee9964537b19f73e2cb4604f38f2a9cfd24a0d2dd8be1474bd1589e42c4abd8b", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146319,15 +146457,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "2fdbadf380c2e683c2bac3bcda97b4d7cd688646a5d2ad2b4b8623a9d69f5411", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "fe0098fb140c764380245c2af4beb2fbc1d85c0c6ce12df4aee482b3baf73884", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146335,15 +146473,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "d24a54b5a8025b3cb53b47876e3be72ca1a26b1cdea95936276603fbff67c114", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "d62247bc6e22a16bab2ee10d416090e4785d23a69d6148cdc626be9c687486e5", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146351,15 +146489,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "5c376a1dde8905306942d3591432e85ff688105469d8f6833ad518f19195e8f2", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "b7442c2b3650a4db8d515d3a652dfa9c6bf42f45c3fdce4c92c08dda7e9241cb", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146367,15 +146505,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "f98a372e5e7704f0637f36fe5f42f3dd84303650956ac1bc5d5240246469b504", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "b3fd5cf40969e0afd68f6fd30362a9fe47b92be84e8c0e61cd0f1db8c0c3bbf3", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146383,15 +146521,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "42a3fd1ca3a104f05876e4936774637992fac091ade3cd7d36b1f393f4b7d4ca", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "6d3b711db30781a73281e7bfa8cb4ae469267385bf3adc8ec76a26723c462f6d", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146399,15 +146537,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "56a4e00a66538366a414f6b9bc4184c5aaafffd53fc4664d2b3355406319eec2", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "83cb12a029dc9b6f7bf535817606dfa7fd6ca8b01b6a74da3ac94e46f7e459bd", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146415,15 +146553,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "34ef3165942d4d03c67fea41226bbc04b51f0ac3364a46ff9a907b896c6a76c8", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "8fc349cd7a1f1242228e54f54e76650d8f7e12fac19ddef400eed42fc8a666b8", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146431,15 +146569,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "be5e7d1e09b3acf90a93cdbdada20d61950bed3e6e240260d966f271f7aad93f", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "88a75f1afcb3124fc440a7c86e9228330f423e9202f7717497477a184773487b", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146447,15 +146585,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "5da434a330a37aa34b2d7d5c14f73b14d323d2b517b2c0c13fe2be1474234be2", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "9aca859b64ccc19eafc42c5dddb49b8925fbf7150f05cfcb7e6b4919c5734784", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146463,15 +146601,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "01b5c4c8b8231b2868ac796cb972ce45929d8da1861683c761967681e890d892", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "58def10b1a5fecc131dd87ceaf3f44cc555bdc5e5397afe7bd04609fb1f3ad71", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146479,15 +146617,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "05e55498b1cbf254f6e79c77950336807343c5f05724e9e9a8a1e87eabd853e2", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "418294eaa91c2842a53b77a7efd0188e03d8a79f1151f9f6ffe3ea2c6a71a749", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146495,15 +146633,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "3e5d3859b6fefb5672471bc06b2bca000a804629d50db421ac87bd092aa1ac18", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "088f444c0b01deba8d212e66d065d512580500c2e8e17a92b4b4e7cb1a7535c8", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146511,15 +146649,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "d63c3b70f8f658492e04ae19fe2e2340441ad024b44b42e1659c60371058e415", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "58b9e82911bfb18c4d6b5ebcba76fb3f87cda9f5cd1d76d5d1ea5f6021e4f855", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146527,15 +146665,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "7f5ef80fa7f04a6762c03c1a47af2b2c4803101526bca6b6168fc79311655c84", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "f2dbcc3d0bca7439ebb6191788af2d28162f998d228439b080e98a36e9c5518f", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146543,15 +146681,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "bcaa54a20c9eea4beba9dd26e4c7174332a0600b919ff6c2084846a03be1401b", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "9e815bbc863f26b59da05c3cb5f99e41f2456783c975e6e9851b121cf565e192", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146559,11 +146697,11 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "0922cd06a538f4b28f54b9b07bde677175ffca6dc6b6a1f25987cee3a30b6d36", + "target_hash": "5de0b32cb0343a864b2debf3508c434e0e3609df16fb30748b559823cc6987cb", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", @@ -146575,11 +146713,11 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "7195d333ed426b322373ea7279c2a41d30420691e60a946d7bfae16849c58522", + "target_hash": "4c3a6799dabc37f8f2ac85595146aad170e76d24b1fd849cc7db45f41656a16a", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", @@ -146591,15 +146729,15 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", - "target_hash": "86058f605be02bf13b2fefed8081e10664ffa9e24fcf07132d31dc808e19cbf4", + "source_hash": "a3806ced11d379777af89907f1aac3f3d3b6a1b2efb34b846fc74e8c78185dd4", + "target_hash": "422679911d393f201e3184cfb967efb8cac36b5ff6c0ee6be3d293f4a758e235", "section_hashes": [ "b6f55d28f096", "84bdfaef9ad8", - "ef2bf3da1fe6", + "30f6d644a64b", "342dfd21a627", "f085aa104fc7", "2c085e9ca501", @@ -146607,7 +146745,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146623,7 +146761,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146639,7 +146777,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146655,7 +146793,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146671,7 +146809,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146687,7 +146825,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146703,7 +146841,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146719,7 +146857,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146735,7 +146873,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146751,7 +146889,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146767,7 +146905,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146783,7 +146921,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146799,7 +146937,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146815,7 +146953,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146831,7 +146969,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146847,7 +146985,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146863,7 +147001,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146879,7 +147017,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146895,7 +147033,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146911,7 +147049,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146927,7 +147065,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146943,7 +147081,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146959,7 +147097,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146975,7 +147113,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -146991,7 +147129,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147007,7 +147145,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147023,7 +147161,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147039,7 +147177,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147055,7 +147193,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147071,7 +147209,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147087,7 +147225,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147103,7 +147241,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147119,7 +147257,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147135,7 +147273,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147151,7 +147289,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147167,7 +147305,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147183,7 +147321,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147199,7 +147337,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147215,7 +147353,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147231,7 +147369,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147247,7 +147385,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0832833b4afd195b8db2580542ef9dcda6dd70b3c027c3e2fcb50371677468cf", @@ -147263,7 +147401,7 @@ "06646cbc800f", "7acad1ac329e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -147273,7 +147411,7 @@ "pl": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", "target_hash": "2348e1024854cc83f1bb077a0ca23bb5b2ccb75b035568fe38fd5b3cf154159f", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147286,7 +147424,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147299,7 +147437,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147312,7 +147450,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147325,7 +147463,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147338,7 +147476,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147351,7 +147489,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147364,7 +147502,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147377,7 +147515,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147390,7 +147528,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147403,7 +147541,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147416,7 +147554,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147429,7 +147567,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147442,7 +147580,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147455,7 +147593,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147468,7 +147606,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147481,7 +147619,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147494,7 +147632,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147507,7 +147645,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147520,7 +147658,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147533,7 +147671,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147546,7 +147684,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147559,7 +147697,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147572,7 +147710,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147585,7 +147723,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147598,7 +147736,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147611,7 +147749,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147624,7 +147762,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147637,7 +147775,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147650,7 +147788,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147663,7 +147801,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147676,7 +147814,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147689,7 +147827,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147702,7 +147840,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147715,7 +147853,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147728,7 +147866,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147741,7 +147879,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147754,7 +147892,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147767,7 +147905,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147780,7 +147918,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147793,7 +147931,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147806,7 +147944,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147819,7 +147957,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147832,7 +147970,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147845,7 +147983,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147858,7 +147996,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147871,7 +148009,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147884,7 +148022,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147897,7 +148035,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147910,7 +148048,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147923,7 +148061,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147936,7 +148074,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147949,7 +148087,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147962,7 +148100,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147975,7 +148113,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -147988,7 +148126,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148001,7 +148139,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148014,7 +148152,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148027,7 +148165,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148040,7 +148178,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148053,7 +148191,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148066,7 +148204,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148079,7 +148217,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148092,7 +148230,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6ecb87e3fba360aa0ab8d663d61d45f4f87c2a43a9dd198ce4a13d80c0f82357", @@ -148105,7 +148243,7 @@ "073aba1471fb", "5bc103a19c8a" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -148125,7 +148263,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148140,7 +148278,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148155,7 +148293,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148170,7 +148308,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148185,7 +148323,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148200,7 +148338,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148215,7 +148353,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148230,7 +148368,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148245,7 +148383,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148260,7 +148398,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148275,7 +148413,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148290,7 +148428,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148305,7 +148443,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148320,7 +148458,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148335,7 +148473,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148350,7 +148488,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148365,7 +148503,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148380,7 +148518,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148395,7 +148533,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148410,7 +148548,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148425,7 +148563,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148440,7 +148578,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148455,7 +148593,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148470,7 +148608,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148485,7 +148623,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148500,7 +148638,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148515,7 +148653,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148530,7 +148668,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148545,7 +148683,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148560,7 +148698,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148575,7 +148713,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148590,7 +148728,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148605,7 +148743,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148620,7 +148758,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148635,7 +148773,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148650,7 +148788,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148665,7 +148803,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148680,7 +148818,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148695,7 +148833,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148710,7 +148848,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148725,7 +148863,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148740,7 +148878,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148755,7 +148893,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148770,7 +148908,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148785,7 +148923,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148800,7 +148938,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148815,7 +148953,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148830,7 +148968,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148845,7 +148983,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148860,7 +148998,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148875,7 +149013,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148890,7 +149028,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148905,7 +149043,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148920,7 +149058,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148935,7 +149073,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148950,7 +149088,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148965,7 +149103,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148980,7 +149118,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -148995,7 +149133,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -149010,7 +149148,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -149025,7 +149163,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -149040,7 +149178,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -149055,7 +149193,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -149070,7 +149208,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0dfc46b285a6839d1603fe85a3179b085cf0cf510d67d2af1921f12cd31bbaff", @@ -149085,7 +149223,7 @@ "e0901cc271d6", "da32b48282a6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -149107,7 +149245,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149124,7 +149262,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149141,7 +149279,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149158,7 +149296,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149175,7 +149313,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149192,7 +149330,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149209,7 +149347,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149226,7 +149364,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149243,7 +149381,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149260,7 +149398,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149277,7 +149415,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149294,7 +149432,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149311,7 +149449,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149328,7 +149466,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149345,7 +149483,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149362,7 +149500,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149379,7 +149517,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149396,7 +149534,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149413,7 +149551,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149430,7 +149568,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149447,7 +149585,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149464,7 +149602,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149481,7 +149619,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149498,7 +149636,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149515,7 +149653,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149532,7 +149670,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149549,7 +149687,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149566,7 +149704,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149583,7 +149721,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149600,7 +149738,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149617,7 +149755,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149634,7 +149772,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149651,7 +149789,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149668,7 +149806,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149685,7 +149823,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149702,7 +149840,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149719,7 +149857,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149736,7 +149874,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149753,7 +149891,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149770,7 +149908,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149787,7 +149925,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149804,7 +149942,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149821,7 +149959,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149838,7 +149976,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149855,7 +149993,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149872,7 +150010,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149889,7 +150027,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149906,7 +150044,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149923,7 +150061,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149940,7 +150078,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149957,7 +150095,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149974,7 +150112,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -149991,7 +150129,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150008,7 +150146,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150025,7 +150163,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150042,7 +150180,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150059,7 +150197,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150076,7 +150214,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150093,7 +150231,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150110,11 +150248,11 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", - "target_hash": "17be69ce1842d556afdfce8cd8104cd540e5c1e0c6b5163685ac253b7cefdb37", + "target_hash": "cfef8f0b1c9ac5780ecf87c1bc38bd4ae43bf91d626c3e8e8a52c15d54b2c2a9", "section_hashes": [ "a12fb75ea214", "edee4fd6fcc1", @@ -150127,7 +150265,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150144,7 +150282,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150161,7 +150299,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150178,7 +150316,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e0608dc6d37542667f459307864303dc6bf16161823e4dfd9d13d9bf0d7f0d5a", @@ -150195,7 +150333,7 @@ "efe09e2cc603", "3c930b32496d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -150215,7 +150353,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150230,7 +150368,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150245,7 +150383,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150260,7 +150398,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150275,7 +150413,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150290,7 +150428,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150305,7 +150443,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150320,7 +150458,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150335,7 +150473,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150350,7 +150488,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150365,7 +150503,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150380,7 +150518,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150395,7 +150533,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150410,7 +150548,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150425,7 +150563,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150440,7 +150578,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150455,7 +150593,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150470,7 +150608,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150485,7 +150623,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150500,7 +150638,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150515,7 +150653,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150530,7 +150668,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150545,7 +150683,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150560,7 +150698,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150575,7 +150713,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150590,7 +150728,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150605,7 +150743,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150620,7 +150758,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150635,7 +150773,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150650,7 +150788,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150665,7 +150803,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150680,7 +150818,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150695,7 +150833,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150710,7 +150848,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150725,7 +150863,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150740,7 +150878,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150755,7 +150893,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150770,7 +150908,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150785,7 +150923,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150800,7 +150938,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150815,7 +150953,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150830,7 +150968,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150845,7 +150983,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150860,7 +150998,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150875,7 +151013,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150890,7 +151028,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150905,7 +151043,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150920,7 +151058,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150935,7 +151073,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150950,7 +151088,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150965,7 +151103,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150980,7 +151118,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -150995,7 +151133,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151010,7 +151148,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151025,7 +151163,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151040,7 +151178,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151055,7 +151193,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151070,7 +151208,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151085,7 +151223,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151100,7 +151238,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151115,7 +151253,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151130,7 +151268,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151145,7 +151283,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151160,7 +151298,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "fa3cf700c3d0baee8b83daf06562791eb1a24c14b63e217da4304a5a5d1eddc0", @@ -151175,7 +151313,7 @@ "dc0116f4fd71", "83d7ebc3ab73" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -151185,7 +151323,7 @@ "pl": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", "target_hash": "b61cd9dfc819303f82495b2e074369666a1f3188637c140a63ac766f037cee44", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151200,7 +151338,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151215,7 +151353,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151230,7 +151368,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151245,7 +151383,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151260,7 +151398,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151275,7 +151413,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151290,7 +151428,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151305,7 +151443,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151320,7 +151458,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151335,7 +151473,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151350,7 +151488,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151365,7 +151503,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151380,7 +151518,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151395,7 +151533,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151410,7 +151548,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151425,7 +151563,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151440,7 +151578,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151455,7 +151593,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151470,7 +151608,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151485,7 +151623,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151500,7 +151638,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151515,7 +151653,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151530,7 +151668,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151545,7 +151683,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151560,7 +151698,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151575,7 +151713,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151590,7 +151728,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151605,7 +151743,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151620,7 +151758,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151635,7 +151773,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151650,7 +151788,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151665,7 +151803,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151680,7 +151818,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151695,7 +151833,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151710,7 +151848,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151725,7 +151863,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151740,7 +151878,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151755,7 +151893,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151770,7 +151908,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151785,7 +151923,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151800,7 +151938,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151815,7 +151953,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151830,7 +151968,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151845,7 +151983,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151860,7 +151998,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151875,7 +152013,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151890,7 +152028,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151905,7 +152043,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151920,7 +152058,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151935,7 +152073,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151950,7 +152088,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151965,7 +152103,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151980,7 +152118,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -151995,7 +152133,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152010,7 +152148,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152025,7 +152163,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152040,7 +152178,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152055,7 +152193,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152070,7 +152208,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152085,7 +152223,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152100,7 +152238,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152115,7 +152253,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152130,7 +152268,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "0b700575f344f5f6b7a86d7afe2d7fcff6dda7f93acad8f11da83d05eda163ad", @@ -152145,7 +152283,7 @@ "1a91ad5869d7", "cd2dfcccb0ac" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -152165,7 +152303,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152180,7 +152318,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152195,7 +152333,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152210,7 +152348,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152225,7 +152363,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152240,7 +152378,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152255,7 +152393,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152270,7 +152408,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152285,7 +152423,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152300,7 +152438,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152315,7 +152453,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152330,7 +152468,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152345,7 +152483,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152360,7 +152498,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152375,7 +152513,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152390,7 +152528,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152405,7 +152543,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152420,7 +152558,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152435,7 +152573,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152450,7 +152588,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152465,7 +152603,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152480,7 +152618,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152495,7 +152633,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152510,7 +152648,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152525,7 +152663,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152540,7 +152678,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152555,7 +152693,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152570,7 +152708,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152585,7 +152723,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152600,7 +152738,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152615,7 +152753,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152630,7 +152768,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152645,7 +152783,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152660,7 +152798,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152675,7 +152813,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152690,7 +152828,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152705,7 +152843,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152720,7 +152858,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152735,7 +152873,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152750,7 +152888,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152765,7 +152903,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152780,7 +152918,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152795,7 +152933,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152810,7 +152948,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152825,7 +152963,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152840,7 +152978,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152855,7 +152993,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152870,7 +153008,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152885,7 +153023,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152900,7 +153038,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152915,7 +153053,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152930,7 +153068,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152945,7 +153083,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152960,7 +153098,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152975,7 +153113,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -152990,7 +153128,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153005,7 +153143,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153020,7 +153158,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153035,7 +153173,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153050,7 +153188,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153065,7 +153203,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153080,7 +153218,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153095,7 +153233,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153110,7 +153248,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "fb659fe65202ac95adba54d3a9588453914f7abf76f686706dbb616140304994", @@ -153125,7 +153263,7 @@ "77fa66951d15", "2781dd0616bf" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -153135,7 +153273,7 @@ "pl": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", "target_hash": "0e801aaa401a0a66fa9dad8b1340f98cf4d012b03469eaba6ac029598279c09e", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153152,7 +153290,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153169,7 +153307,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153186,7 +153324,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153203,7 +153341,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153220,7 +153358,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153237,7 +153375,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153254,7 +153392,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153271,7 +153409,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153288,7 +153426,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153305,7 +153443,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153322,7 +153460,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153339,7 +153477,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153356,7 +153494,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153373,7 +153511,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153390,7 +153528,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153407,7 +153545,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153424,7 +153562,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153441,7 +153579,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153458,7 +153596,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153475,7 +153613,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153492,7 +153630,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153509,7 +153647,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153526,7 +153664,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153543,7 +153681,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153560,7 +153698,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153577,7 +153715,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153594,7 +153732,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153611,7 +153749,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153628,7 +153766,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153645,7 +153783,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153662,7 +153800,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153679,7 +153817,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153696,7 +153834,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153713,7 +153851,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153730,7 +153868,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153747,7 +153885,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153764,7 +153902,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153781,7 +153919,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153798,7 +153936,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153815,7 +153953,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153832,7 +153970,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153849,7 +153987,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153866,7 +154004,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153883,7 +154021,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153900,7 +154038,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153917,7 +154055,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153934,7 +154072,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153951,7 +154089,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153968,7 +154106,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -153985,7 +154123,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154002,7 +154140,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154019,7 +154157,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154036,7 +154174,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154053,7 +154191,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154070,7 +154208,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154087,7 +154225,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154104,7 +154242,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154121,7 +154259,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154138,7 +154276,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154155,7 +154293,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154172,7 +154310,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154189,7 +154327,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154206,7 +154344,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "dddea3aa9ec515ef8beafd4408953b32dde8ffa9d427c0e7fd564091c7b19660", @@ -154223,7 +154361,7 @@ "dc43cac52c54", "534424b3f74d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -154233,7 +154371,7 @@ "pl": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", "target_hash": "42967273839376a354da5bd0998da321bf4c50fc19ee5593596fc90d3dfd7cd8", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154249,7 +154387,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154265,7 +154403,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154281,7 +154419,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154297,7 +154435,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154313,7 +154451,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154329,7 +154467,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154345,7 +154483,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154361,7 +154499,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154377,7 +154515,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154393,7 +154531,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154409,7 +154547,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154425,7 +154563,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154441,7 +154579,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154457,7 +154595,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154473,7 +154611,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154489,7 +154627,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154505,7 +154643,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154521,7 +154659,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154537,7 +154675,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154553,7 +154691,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154569,7 +154707,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154585,7 +154723,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154601,7 +154739,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154617,7 +154755,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154633,7 +154771,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154649,7 +154787,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154665,7 +154803,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154681,7 +154819,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154697,7 +154835,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154713,7 +154851,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154729,7 +154867,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154745,7 +154883,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154761,7 +154899,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154777,7 +154915,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154793,7 +154931,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154809,7 +154947,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154825,7 +154963,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154841,7 +154979,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154857,7 +154995,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154873,7 +155011,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154889,7 +155027,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154905,7 +155043,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154921,7 +155059,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154937,7 +155075,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154953,7 +155091,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154969,7 +155107,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -154985,7 +155123,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155001,7 +155139,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155017,7 +155155,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155033,7 +155171,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155049,7 +155187,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155065,7 +155203,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155081,7 +155219,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155097,7 +155235,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155113,7 +155251,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155129,7 +155267,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155145,7 +155283,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155161,7 +155299,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155177,7 +155315,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155193,7 +155331,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155209,7 +155347,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155225,7 +155363,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155241,7 +155379,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "45e1f52053846efd41ef7f156482299945f2515bbb7498a0c31a95b0db38802b", @@ -155257,7 +155395,7 @@ "448f61bfe8c9", "7b269d397b0d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -155281,7 +155419,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155300,7 +155438,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155319,7 +155457,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155338,7 +155476,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155357,7 +155495,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155376,7 +155514,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155395,7 +155533,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155414,7 +155552,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155433,7 +155571,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155452,7 +155590,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155471,7 +155609,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155490,7 +155628,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155509,7 +155647,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155528,7 +155666,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155547,7 +155685,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155566,7 +155704,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155585,7 +155723,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155604,7 +155742,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155623,7 +155761,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155642,7 +155780,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155661,7 +155799,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155680,7 +155818,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155699,7 +155837,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155718,7 +155856,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155737,7 +155875,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155756,7 +155894,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155775,7 +155913,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155794,7 +155932,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155813,7 +155951,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155832,7 +155970,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155851,7 +155989,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155870,7 +156008,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155889,7 +156027,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155908,7 +156046,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155927,7 +156065,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155946,7 +156084,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155965,7 +156103,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -155984,7 +156122,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156003,7 +156141,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156022,7 +156160,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156041,7 +156179,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156060,7 +156198,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156079,7 +156217,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156098,7 +156236,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156117,7 +156255,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156136,7 +156274,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156155,7 +156293,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156174,7 +156312,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156193,7 +156331,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156212,7 +156350,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156231,7 +156369,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156250,7 +156388,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156269,7 +156407,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156288,7 +156426,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156307,7 +156445,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156326,7 +156464,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156345,7 +156483,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156364,7 +156502,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156383,7 +156521,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156402,11 +156540,11 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", - "target_hash": "a71f72ca0773a06fd20b209494ef8bba06cd4c6a97c4ce23d6cb2200501f13b1", + "target_hash": "2ec178532730e9bbd355b7dca9e68242603c92573f93bf913d1cfea20ae015a5", "section_hashes": [ "dd2a1afb2218", "c98260ded6c2", @@ -156421,7 +156559,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156440,7 +156578,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156459,7 +156597,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156478,7 +156616,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "e479a28f054074737f805d60e3a71d63221cd1ce9f2e0953aa4d18e73bd3ee40", @@ -156497,7 +156635,7 @@ "207dcdd907de", "66ce74b2d562" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -156517,7 +156655,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156532,7 +156670,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156547,7 +156685,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156562,7 +156700,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156577,7 +156715,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156592,7 +156730,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156607,7 +156745,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156622,7 +156760,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156637,7 +156775,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156652,7 +156790,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156667,7 +156805,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156682,7 +156820,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156697,7 +156835,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156712,7 +156850,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156727,7 +156865,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156742,7 +156880,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156757,7 +156895,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156772,7 +156910,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156787,7 +156925,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156802,7 +156940,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156817,7 +156955,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156832,7 +156970,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156847,7 +156985,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156862,7 +157000,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156877,7 +157015,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156892,7 +157030,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156907,7 +157045,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156922,7 +157060,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156937,7 +157075,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156952,7 +157090,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156967,7 +157105,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156982,7 +157120,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -156997,7 +157135,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157012,7 +157150,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157027,7 +157165,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157042,7 +157180,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157057,7 +157195,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157072,7 +157210,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157087,7 +157225,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157102,7 +157240,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157117,7 +157255,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157132,7 +157270,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157147,7 +157285,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157162,7 +157300,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157177,7 +157315,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157192,7 +157330,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157207,7 +157345,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157222,7 +157360,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157237,7 +157375,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157252,7 +157390,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157267,7 +157405,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157282,7 +157420,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157297,7 +157435,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157312,7 +157450,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157327,7 +157465,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157342,7 +157480,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157357,7 +157495,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157372,7 +157510,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157387,7 +157525,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157402,11 +157540,11 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", - "target_hash": "3f76e550323dcfa9dccf3f5168425621b14e386022e9259d7129a8225c9b5a5c", + "target_hash": "80a11e0090a36a7938b0eed1b40f3c503bb9df27b50cf5914bde2f1df5ceb2e2", "section_hashes": [ "1013e15d9d52", "ee993d86e938", @@ -157417,7 +157555,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157432,7 +157570,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157447,7 +157585,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157462,7 +157600,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "812bac536ad139e75539de11f3d1e1df495977f9c63d15dfedf6a40eea26d15c", @@ -157477,7 +157615,7 @@ "c0a1129fd179", "c5645e4bf6b8" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -157499,7 +157637,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157516,7 +157654,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157533,7 +157671,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157550,7 +157688,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157567,7 +157705,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157584,7 +157722,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157601,7 +157739,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157618,7 +157756,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157635,7 +157773,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157652,7 +157790,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157669,7 +157807,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157686,7 +157824,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157703,7 +157841,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157720,7 +157858,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157737,7 +157875,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157754,7 +157892,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157771,7 +157909,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157788,7 +157926,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157805,7 +157943,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157822,7 +157960,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157839,7 +157977,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157856,7 +157994,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157873,7 +158011,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157890,7 +158028,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157907,7 +158045,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157924,7 +158062,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157941,7 +158079,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157958,7 +158096,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157975,7 +158113,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -157992,7 +158130,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158009,7 +158147,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158026,7 +158164,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158043,7 +158181,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158060,7 +158198,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158077,7 +158215,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158094,7 +158232,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158111,7 +158249,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158128,7 +158266,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158145,7 +158283,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158162,7 +158300,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158179,7 +158317,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158196,7 +158334,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158213,7 +158351,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158230,7 +158368,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158247,7 +158385,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158264,7 +158402,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158281,7 +158419,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158298,7 +158436,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158315,7 +158453,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158332,7 +158470,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158349,7 +158487,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158366,7 +158504,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158383,7 +158521,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158400,7 +158538,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158417,7 +158555,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158434,7 +158572,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158451,7 +158589,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158468,7 +158606,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158485,7 +158623,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158502,11 +158640,11 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", - "target_hash": "792deb13acb7698f5035813fc934f09e5811754ebaa3897f2e286ae4b3ba4b05", + "target_hash": "adb0f0b39552713a17be1954c33839f97a3e7d056d4cf9954ec9af122ae47195", "section_hashes": [ "4d23ad7eb5c6", "9e50a2f613f2", @@ -158519,7 +158657,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158536,7 +158674,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158553,7 +158691,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158570,7 +158708,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "9d03447614681d714c412d67f148d465d76ed8fd5d00dcb7c7a6ec55d5b1301d", @@ -158587,7 +158725,7 @@ "41864b605a74", "8c17200a15fd" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -158597,7 +158735,7 @@ "pl": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", "target_hash": "5e0701b9d0a306e5a6bea8f049d29913a72a37ea8592bc574a1ca96079d02168", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158616,7 +158754,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158635,7 +158773,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158654,7 +158792,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158673,7 +158811,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158692,7 +158830,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158711,7 +158849,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158730,7 +158868,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158749,7 +158887,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158768,7 +158906,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158787,7 +158925,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158806,7 +158944,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158825,7 +158963,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158844,7 +158982,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158863,7 +159001,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158882,7 +159020,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158901,7 +159039,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158920,7 +159058,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158939,7 +159077,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158958,7 +159096,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158977,7 +159115,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -158996,7 +159134,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159015,7 +159153,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159034,7 +159172,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159053,7 +159191,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159072,7 +159210,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159091,7 +159229,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159110,7 +159248,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159129,7 +159267,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159148,7 +159286,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159167,7 +159305,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159186,7 +159324,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159205,7 +159343,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159224,7 +159362,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159243,7 +159381,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159262,7 +159400,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159281,7 +159419,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159300,7 +159438,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159319,7 +159457,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159338,7 +159476,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159357,7 +159495,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159376,7 +159514,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159395,7 +159533,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159414,7 +159552,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159433,7 +159571,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159452,7 +159590,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159471,7 +159609,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159490,7 +159628,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159509,7 +159647,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159528,7 +159666,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159547,7 +159685,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159566,7 +159704,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159585,7 +159723,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159604,7 +159742,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159623,7 +159761,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159642,7 +159780,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159661,7 +159799,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159680,7 +159818,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159699,7 +159837,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159718,7 +159856,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159737,7 +159875,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159756,7 +159894,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159775,7 +159913,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159794,7 +159932,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "56c3e1f4910e8e9484216e3aba9cafae5570e7fbcb45c8f4d20cf502e8456742", @@ -159813,7 +159951,7 @@ "62aef5b51f60", "2c33511fc4c6" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -159823,7 +159961,7 @@ "pl": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", "target_hash": "4788378490b19044a7ce7569360a1af42b6ef35754d637bae67342779f283ce7", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159836,7 +159974,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159849,7 +159987,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159862,7 +160000,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159875,7 +160013,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159888,7 +160026,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159901,7 +160039,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159914,7 +160052,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159927,7 +160065,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159940,7 +160078,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159953,7 +160091,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159966,7 +160104,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159979,7 +160117,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -159992,7 +160130,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160005,7 +160143,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160018,7 +160156,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160031,7 +160169,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160044,7 +160182,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160057,7 +160195,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160070,7 +160208,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160083,7 +160221,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160096,7 +160234,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160109,7 +160247,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160122,7 +160260,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160135,7 +160273,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160148,7 +160286,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160161,7 +160299,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160174,7 +160312,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160187,7 +160325,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160200,7 +160338,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160213,7 +160351,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160226,7 +160364,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160239,7 +160377,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160252,7 +160390,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160265,7 +160403,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160278,7 +160416,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160291,7 +160429,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160304,7 +160442,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160317,7 +160455,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160330,7 +160468,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160343,7 +160481,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160356,7 +160494,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160369,7 +160507,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160382,7 +160520,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160395,7 +160533,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160408,7 +160546,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160421,7 +160559,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160434,7 +160572,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160447,7 +160585,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160460,7 +160598,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160473,7 +160611,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160486,7 +160624,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160499,7 +160637,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160512,7 +160650,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160525,7 +160663,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160538,7 +160676,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160551,7 +160689,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160564,7 +160702,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160577,7 +160715,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160590,7 +160728,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160603,7 +160741,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160616,7 +160754,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160629,7 +160767,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160642,7 +160780,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "3d0d4039ad665156ba9127ed93976b8544f9815f9739181bb4bab15a99fce6f7", @@ -160655,7 +160793,7 @@ "a7e3b91e64d4", "f1c81129d235" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -160675,7 +160813,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160690,7 +160828,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160705,7 +160843,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160720,7 +160858,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160735,7 +160873,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160750,7 +160888,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160765,7 +160903,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160780,7 +160918,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160795,7 +160933,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160810,7 +160948,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160825,7 +160963,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160840,7 +160978,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160855,7 +160993,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160870,7 +161008,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160885,7 +161023,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160900,7 +161038,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160915,7 +161053,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160930,7 +161068,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160945,7 +161083,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160960,7 +161098,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160975,7 +161113,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -160990,7 +161128,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161005,7 +161143,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161020,7 +161158,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161035,7 +161173,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161050,7 +161188,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161065,7 +161203,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161080,7 +161218,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161095,7 +161233,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161110,7 +161248,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161125,7 +161263,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161140,7 +161278,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161155,7 +161293,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161170,7 +161308,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161185,7 +161323,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161200,7 +161338,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161215,7 +161353,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161230,7 +161368,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161245,7 +161383,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161260,7 +161398,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161275,7 +161413,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161290,7 +161428,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161305,7 +161443,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161320,7 +161458,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161335,7 +161473,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161350,7 +161488,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161365,7 +161503,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161380,7 +161518,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161395,7 +161533,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161410,7 +161548,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161425,7 +161563,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161440,7 +161578,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161455,7 +161593,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161470,7 +161608,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161485,7 +161623,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161500,7 +161638,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161515,7 +161653,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161530,7 +161668,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161545,7 +161683,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161560,7 +161698,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161575,7 +161713,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161590,7 +161728,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161605,7 +161743,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161620,7 +161758,7 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "d323d691a2d87c5290419545a3a0bfab8ea65488305fe0560927922704ae3852", @@ -161635,23 +161773,23 @@ "ba950787cd3a", "b737fdacfb1d" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, "docs/security/SOCKET_DEV_FINDINGS.md": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", "locales": { "pl": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", "target_hash": "93d77902b4a1d07516aa54675818e1991b791e66ad694a518aecdf87282858e6", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "aaabe5dcc93ae6785b18436eb16aa4f2a7f5d49e411ef2e1d865b8299bb4b817", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "7fddd215389a78345f8672c3a6a8c6dfb7be9261fb514d10227987e7ad337613", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161660,13 +161798,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "dfbb2990fcc2690fbf12bc81fa8ccb26bb2df23d7e84d83611e269d003c9c17f", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "76012f2f972bff5271a08aebbe664d18146666f7fcc7437d1301c2909c29c07f", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161675,13 +161813,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "8988d2f0d9db4ee03b13fe930e0bbfc00bc97217bcd2645fc5128e53948a10d1", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "f6ac36cd8a7adbaa5944b40b94791fdb5d8c415b839d8741a09623f945833bb3", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161690,13 +161828,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "94fb1617b2bea88e8652daedb48fd51b61db6dd6a6af1a319f56ee883e2c44bd", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "7c887a51157332edce477e3b7e07410a7dcb16619492a8d57aa0fccb636b03b7", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161705,13 +161843,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "121b9f664c0f0a2249ba86e1406d0ffc256482825ee578c18814121a17f15198", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "411aa30e39ba173f0e0685b28e6818ac52838a379a395e7b8ba68efcf1172107", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161720,13 +161858,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "f85faf9c62a30f9b75d894c007dc2af1567d41e1e69e9cb2801e27705c254df9", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "154ead9d3ad6838fa7562c50cad519a60d18676214bfcee12d046c64e7f8a2db", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161735,13 +161873,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "44ba00f9b95e93726360f947978ce661db59a33763ffeae7748a6a6106b24015", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "6ddc42cf2e83a8c64da558167520fa551d63a9aa6ca22d18d19582220cb73bf4", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161750,13 +161888,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "5635be520f9e9909337d03a08a31e3f109d9a03bfcb5c57bbd7a4c96c5d81c76", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "d827cb96b0abd0c7d36a6705da399139a03cc5cf897dfaa1d547b8fc6f9a9f89", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161765,13 +161903,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "ccb2320622ab85dfdd279698de430ab899fd230b8b18a2da6bb0ee8ab2ce10a0", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "fb6adeed3e8d9599d7d1a2fd50eef3065f29eeee5c86f1afa0afb76b986a09d7", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161780,13 +161918,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "55683efa3141d275a8fe3b8ac4fb43c495958ddcd061b641d0b9d99437bdc527", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "4c9f375b9cec6294068931e8ab7f1be4229d30ee2aa6197e2c4422c7d68e8f9d", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161795,13 +161933,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "d21bdf415926fa8286edabbfec0e57e9753d8264e129e4ce546930fcc291a8b5", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "725b957b2a112da61d7a512015c965bbd418f374b2e8896e2231635f9cf022b0", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161810,13 +161948,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "eb2b81b0fa5fb03879d9cd5cb417ad85d16c82f981844cc63f385f9c296ceaee", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "62a534c10ca1f60eee413935af0be370c0532fe38a3fa89910cacf72a8467541", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161825,13 +161963,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "a3aa5183846d3ee81dad371dabc7a8079a5c1f26f63b599fbfac8a5be57b6302", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "359a73ee6a98edc56f5512778ac6dc1bc379ef509208afb7ba6042d953b66a68", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161840,13 +161978,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "568f98305779ce0ac9b35d6da76240d449b83eab32f35f25fdeaf64ecfdcc554", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "204c045f98db4ca23e311c74a02590e698d8af607ed29d5aac83b190d9526fe8", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161855,13 +161993,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "87ed6c67769675f597493e7972be5fa59be14572798b05d1b457244aed71eecb", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "7c6b12a1fa58ffcaa602beaae93b6c7840cdf0b00f85dfc7695db81f48a94412", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161870,13 +162008,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "df34a6d960346881e5af71fc917ef3f204a0800fddfacb5a82472cd364576fbf", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "3c49fa51a241243c1a7cc24ae4289b96bcd1e0e83f657f66ad50b70c605ca3c2", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161885,13 +162023,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "17294dd969deb5d2a0a0198a83393534dff00ee4e88e0dedf7eebaa05edfe303", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "8fd880287e2c31ed75e6318c973cc4956cd2fa3efd0e2e600a28ca41b4b2c48d", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161900,13 +162038,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "21a0debc4a8efe1056b3c71cdad275058d62d0b552cf77f90d236701c60e1c8d", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "af17885b8258a62799d8afa0a37236e4855cd9aa2a8f201834491ce369f4bdc4", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161915,13 +162053,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "415fe2d8b3a41752c0c4ef59167a58f0e678dc8def078c941addd0efeb7baeb8", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "70ce5b5a6d00679a8c48a902add57799451dbbe9955f063b6c782f2d599bd7b0", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161930,13 +162068,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "3b24a78c053518c2b287dfd563ebc632b08497c05fec166707dd7074c222d3fb", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "a9588ba8567d7073d4e47dd60811a0a446b797300a2ee88228a46f70639c2093", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161945,11 +162083,11 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "fa062a7ea4aec3bafd3b2caa495229f8472a18b766b370172652980a7a81b04b", + "target_hash": "96e9e92fad074738269ef1f5a4c7ec85c6e0a2d94785223b9b2901f40c673b1b", "section_hashes": [ "7e44efdfa9d0", "754b5717bfc0", @@ -161960,13 +162098,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "6155aea1d1e2cc5d63fe21980580ed657e999b1358e305ee544705583bdc745b", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "6f02af925f2d458b2d340ee62460139737e7086d0fbc490adea28de644e97e5d", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161975,13 +162113,13 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { - "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", - "target_hash": "9f32740b0b711ddc487e29fa30f58084eff97ba3c4cb019c5e37a456292afed1", + "source_hash": "e7948b255dc58eedef2c6c057837214ee63b1dc802ef2337c057357482b2be3d", + "target_hash": "d9e5685ede30eef625679e0bccf2162491b9bacd9d113a92d33455e904e0dca9", "section_hashes": [ - "7e44efdfa9d0", + "255963a2c187", "754b5717bfc0", "d74975bdfcf7", "9fdffee1f39a", @@ -161990,7 +162128,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162005,7 +162143,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162020,7 +162158,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162035,7 +162173,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162050,7 +162188,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162065,7 +162203,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162080,7 +162218,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162095,7 +162233,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162110,7 +162248,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162125,7 +162263,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162140,7 +162278,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162155,7 +162293,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162170,7 +162308,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162185,7 +162323,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162200,7 +162338,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162215,7 +162353,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162230,7 +162368,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162245,7 +162383,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162260,7 +162398,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162275,7 +162413,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162290,7 +162428,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162305,7 +162443,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162320,7 +162458,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162335,7 +162473,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162350,7 +162488,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162365,7 +162503,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162380,7 +162518,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162395,7 +162533,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162410,7 +162548,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162425,7 +162563,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162440,7 +162578,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162455,7 +162593,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162470,7 +162608,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162485,7 +162623,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162500,7 +162638,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162515,7 +162653,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162530,7 +162668,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162545,7 +162683,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162560,7 +162698,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162575,7 +162713,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162590,7 +162728,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "18ebe1e1b5bc505d27a17bca71d496e4a24ea7a02ae88d81b70dc87364525b9a", @@ -162605,7 +162743,7 @@ "f1d33ee50341", "52cadd699472" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -162630,7 +162768,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162650,7 +162788,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162670,7 +162808,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162690,7 +162828,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162710,7 +162848,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162730,7 +162868,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162750,7 +162888,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162770,7 +162908,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162790,7 +162928,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162810,7 +162948,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162830,7 +162968,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162850,7 +162988,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162870,7 +163008,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162890,7 +163028,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162910,7 +163048,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162930,7 +163068,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162950,7 +163088,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162970,7 +163108,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -162990,7 +163128,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163010,7 +163148,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163030,7 +163168,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163050,7 +163188,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163070,7 +163208,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163090,7 +163228,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163110,7 +163248,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163130,7 +163268,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163150,7 +163288,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163170,7 +163308,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163190,7 +163328,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163210,7 +163348,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163230,7 +163368,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163250,7 +163388,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163270,7 +163408,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163290,7 +163428,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163310,7 +163448,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163330,7 +163468,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163350,7 +163488,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163370,7 +163508,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163390,7 +163528,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163410,7 +163548,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163430,7 +163568,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163450,7 +163588,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163470,7 +163608,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163490,7 +163628,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163510,7 +163648,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163530,7 +163668,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163550,7 +163688,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163570,7 +163708,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163590,7 +163728,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163610,7 +163748,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163630,7 +163768,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163650,7 +163788,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163670,7 +163808,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163690,7 +163828,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163710,7 +163848,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163730,7 +163868,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163750,7 +163888,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163770,7 +163908,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163790,7 +163928,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163810,7 +163948,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163830,7 +163968,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163850,7 +163988,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163870,7 +164008,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163890,7 +164028,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "f4fcad2c6f21db83052a28128a8c9ac71b3efe4e1d77861c1f05ab680b963421", @@ -163910,7 +164048,7 @@ "43e82f857be4", "87f4eee642eb" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -163920,391 +164058,391 @@ "pl": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "8151fb84feab9427133b4d05cafe6d81e77152439a7a42052b78d92f4aedfd7f", - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ar": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "ea5c0cceb5f4289ab8f4f4b127ccc46d025315b89e44783b3d4f9434074346f3", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "b7477a14cc05063ad56d092aaa68522a891c636e7c613661a4c4944a346967a9", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "122523a6c8d4ebe6bc5636607e9f4a121eb64c3b7f95c92a5f6469988cbac597", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "bb4ee6ffc0d92b8521b687cfa40bdee691a96ce559d0dadf492cf303f3ec4dfd", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "4296578bc5cf9c256df975ca2d6768daae09b13444b682ea0d7f1a925f1dfe20", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "523cfa8f3cd8aa3681023644b9982db79682a5adab4aa5544cc71f3c4eecba26", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "5487013b779db06f527cf95e0e869ee211418c8c330f24e218e39a1a5ee0043d", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "3644a162c65ec9f67f86a4adf5465563764522e660791b3795d944d04f2484b5", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "a757a6e86cb145d97bc8d542f16bc2f82cd2538a87aa1b32947ea30378dab376", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "a251f1acec90a28c07af44ae24112e5893700600bbcc81ad088677a3161025fe", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "52512607fe47eca17f9930d7fb9c8f9d3b85217d7efdea90662f62ae998ee02c", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "ec2d9a5d4083f54f446a2fe033535e60f71593425480a3e76759e0b015534859", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "b90c3983ec5c9190a451e0bf7f8d64e66ea5c02b6595076514faae675c4f4042", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "9bda8cc2cedd62e94d8980a5590ec252ea6438f5d4c09391272f78dc99bd1971", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "68fd3a144f99ca8555950259e11ecae000d36c2c8f51f39093dfc21e6aaf8843", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "9ad3859a401a01c94803cd26ed1a36e5757fc0fb798b42e82b7eccd5392c6d42", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "95dbdb66537923ccde9927cd09db56dbfda932dc6e276afc1a7f26a8a88cc463", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "b8018cb28012157d6bd2635aaf02dd4c88f7446aa407bd1ed02b433d31386e73", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "b1185584e991a132fba47f7ba844c02d4ebd10a3c0b28f8bbce5b5ec6575295e", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "aabf91aafd66084c08bc6aeace894800fce9afb2f53c2f5f306758e4e5b2495a", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "d3c971a6c655976b4f918d7fba98c34d9f1536f2050891a936367bb0650d3827", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "e2936d7a767cb13a191a6e3240e6405b70151d3b63e27618a1850db41a49fbf2", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "4b475107ab5b439b88970e181ef9be8f1877b33f0bf7721f3f5317d479d4ba87", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "355d20dc5c6fcc4ef48147144f63bceebdce9fb25a499b43395587ed37a097df", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "ff214bfe675ca3b513a0cca02db446cdc627d9f092ad113099ba63e7191a5b22", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "56bffb5d74913a3bb49f0d419d1b7c6763f5a8ca129eb8301449153024fbc068", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "f6c295cf12fa663665e0d81e913f9f3a7755b67df81ad52d777348996649d51d", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "0f33dc4e34bc37e1c288e86ba54ec69ef9fdc35ed8c467dd1322d50ad0ef73e7", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "d4baf9ba8c060de110b71ed0f2d6accf2f2f7b2f2567d482ec5f2e6940abbbae", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "43a0a2dd4a34b213fd613a6f0a4cdc7f199cf5bfa1224306b2b7b250f0a5cbe0", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "f7598610a46dbb82ea0e71484f532e552abbdbfca37aecccbb1f0a9f117b94f0", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "832d3da7992a2f23c7d14f00ecf1a3271b849fd424614a9b64279cb682fa4f18", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "49d72b240468b9f71bc65e29e546a97bd2f686444e4be298510495d0060c4cff", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "133e0250b04256dd91150de09d5a8ef91bf5f821b6b513d41e41170ad555c17b", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "9c354d18641381b0c70239295865e24b61b3999d11dbe191388333fcd0e88926", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "f0d5ca23734e22678cb76c247a9b19243af171df09dc866d719f082c72c679af", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "0ddac4a02476e8c5cfa8a774fdaa7342665170d25cd52a7690cc40c9684132f0", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "cd1edf5b6c8347c9f96be22dfdd92eb1b1f72777396510d20f9245a608ff8264", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "64932d394339ba1989ae4dadbb45e77ad83c89f3a7562d1354e5dbdb4b92e8f4", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "034177e907d86e5ff6518e0fefe0602183e2648398ce470a2bf98ee63992c215", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "0614a3b6ed51fbe7a9f2a34937aacf552e3fd33000277763d7165f4bde227364", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "503d85f5b4d301a02d0d3e6a5bd466d87757c8863d13ffbcb70c22801afcfa92", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "e35bf47d2f62bd21090840590b47dc12ab637035081b5f51616e2a78c89d33a8", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "8fb5ae86074c121e3eeb60ef8beb939dba56b7912f80db19f5dc22f2df3c89cc", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "53100a350e99d26ef3308dd3059cbe08a300333fe5a9990c06e2532355ebdc82", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "004436b359a6eabfc8ea6d5f2b316b6cc06bbe48a6e172a4fb5fab4ef8106044", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "8f4913cb16b09fd8d2c409c34e308036846dd43dde97253efb191e52788a53a1", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "6f286aa3950cf095217899097e599ffb311d4174861624c0966ae0d4c0b662bd", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "b02f1d09f63d38da6c9411f56d389a942cf0cdd14776fc586d2c5a44f8e0abd8", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "04120635fa3300439f0b5389df63a79346bb882e3646892ae18f7aba4efa6c5d", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "eb9a66a12af9c91dc5334c1252d7c2f43b26e0cf979dadb5063b15d4cc68e72c", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "f8944eabf2583452d0bff27ac0a7c1bad252cad4db4efb50371253cbc3fad03e", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "b0e2c3f0060efb2e3fe346cbfda806ec3f7d4900812f1356acd5913b6b95ad0c", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "e56ca584bec0fe9962580091925ebc8158d50c452be1bfed950d6330731191ae", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "55e0df625ef8e03e087d2403e6057b6446937616f7ce5c3dd355b8049de10734", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "492bd9f4292417f0c9ac448f8ac60cc1be72a3f3dcc120df129136bbbed9cbc5", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "80e8f33dd699cbd2ca06d04313a6b24ff8aa4ffdd3873a2cd9062f7e85a049ba", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "a680e1c52700cc0da1efe1f5f6425ae9f97ee964ada4ca4f943ba38c5eeb390a", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "6ed9a479e18e5f41b24e9694d271be4ec0aae91285ced655f2117077af6891a1", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "841c303ad18abc5c698f7e7ec7cf76c58a4f95dc08e14a6d2956109128b7de2a", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "afb299e68ab60008843c6fc487bbc4a4834162d55d0e61fcf9476f54456ce0bc", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "593e42ee8f3c9c7df256e84129eb4d7ebf2e20180f192b41721d88049fea87bc", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "ff6433da4ee96c8d5862daa3337bbabec29c67a0b6968a9a3de9119b9f089837", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "079243e76b5a1d691b76c0f1069225fa23c51483e726dae4e952f18705271460", "target_hash": "d5730f66455cc0b88bfed717442224fe24b8910486c03dc633c5a4ed8750e576", "section_hashes": ["49d2e9fff519", "375bc8492229", "9199a77a4bb5"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -164325,7 +164463,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164341,7 +164479,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164357,7 +164495,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164373,7 +164511,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164389,7 +164527,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164405,7 +164543,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164421,7 +164559,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164437,7 +164575,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164453,7 +164591,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164469,7 +164607,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164485,7 +164623,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164501,7 +164639,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164517,7 +164655,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164533,7 +164671,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164549,7 +164687,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164565,7 +164703,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164581,7 +164719,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164597,7 +164735,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164613,7 +164751,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164629,7 +164767,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164645,7 +164783,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164661,7 +164799,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164677,7 +164815,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164693,7 +164831,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164709,7 +164847,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164725,7 +164863,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164741,7 +164879,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164757,7 +164895,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164773,7 +164911,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164789,7 +164927,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164805,7 +164943,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164821,7 +164959,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164837,7 +164975,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164853,7 +164991,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164869,7 +165007,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164885,7 +165023,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164901,7 +165039,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164917,7 +165055,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164933,7 +165071,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164949,7 +165087,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164965,7 +165103,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164981,7 +165119,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -164997,7 +165135,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165013,7 +165151,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165029,7 +165167,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165045,7 +165183,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165061,7 +165199,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165077,7 +165215,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165093,7 +165231,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165109,7 +165247,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165125,7 +165263,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165141,7 +165279,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165157,7 +165295,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165173,7 +165311,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165189,7 +165327,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165205,7 +165343,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165221,7 +165359,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165237,7 +165375,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165253,7 +165391,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165269,7 +165407,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165285,7 +165423,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165301,7 +165439,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165317,7 +165455,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165333,7 +165471,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "d666da44da62ea086cfe547e44c09b8980041360e331f74a64a2bab2ecd0f44b", @@ -165349,7 +165487,7 @@ "5ac52da3109f", "b1dd5fb2d738" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -165360,391 +165498,391 @@ "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "355f4053d9a198dc7ff934bb3f2e81172163c3500c27f665f194e41842f27c6a", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "4ff68e5b4141f3485c173ee29332f6c29e144484c43b9c20aa61b95a803eef1b", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "859db5a16463dd06bbbe8f98988bddca415f75c4b0a495b0531174f1a045b93f", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "a047de5a3cc1ba4dab08154db95b167969846342249393461907d2d79ff41444", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "ca98752a97855170c57d04136b1d25e7e3b468586e1ccb9d7c3f1505a7f2c6da", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "651750209b8096d32acc1561378cd4e5350521bd926724c321b0415a893a918c", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "45940140e68831f3e5b16226d50cf03352484c06f922addb742034122abb3e33", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "5d0539c939970b9972a6add61251ca08e60fd388f50dd90ccfc19ee74a7874a3", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "ca1e3b74af0ecc10fb0c9b11eb3a4e39627172f6fe16ebfea65c7bc9086a8250", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "ee2b6a15e736c483d7556199bee99cad7014bb766484fc8375ba8bbe107b39cd", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "4d940e2de33fc0ca903d216a9d11422b16d911b1eb958f94c1b366a199fc675d", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "b4fb68062d54528f4ee508f56272c49f3e92313e357bb4a7913f8f24c42fe274", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "36388242283b40c07b4803a5f0676eda8fde1220217aae279bd25a44460622df", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "e2ecba8b575afca542215ebf518eee15bc4b452badf33660516b73f228df6182", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "ac46f8a15fea583e8df8ab278289a27d1f640bf872c6da61df2ec1d78f2f2dae", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "f353b988a1572ad0bd9ef27895d313282154ca0ba5bb7a11414b18ea94336077", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "33a9519286b1997f422a7b5c691a23e24c064a0719137db45214f51c4f148fd9", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "829feb2273a87e566990da67584677a884fb4a2efab172094bafd33135a2cc34", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "f07b59a4084ccfd126711feebfc50e07e62ca58fe82ec18533b75b256ba89ab6", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "2d8a2be65723520f836ef26bd6bc7035d49aec18ab3c6be990c581d1b64b531e", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "378de5a8751514ef747496d314499d3975f2657d3daaf56dca3a09bfe3453d1c", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "14e7b18b3193547015f66701dd7451af1a9e5535c948afaf6210827eedb0c3d0", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "7d3f3216dc640767d852fc19c35813a7c11c69ad0806c4946ca06a4e135ce223", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "12b9f1a5d8b6a568ad596350d3653cd260061dff3be065ea3bb1f3205289e0ec", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "ad5cb5a49954ba10f7fd1b3d0de85cbd0bcc4ef7dff64b0e7a4ed17bdeb074a7", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "d32815b2a4b70e4e50e9efe8a5e3bb179a1c9bf20d597afbecc91215cfdd64cb", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "9858e15f0c303c750cb13c46e1d8c622dc526c51be8842ed37026b6b05e3dc5e", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "e6da73162e17119132ad6466d64f5d4fdf6358f6ebb1827d7548f1ade0bb07ba", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "9609d827660134dff0f66ff6e22fcad30c99995ab661e12e3a36361a2a30982b", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "13f248b95995e1e960ec7e6b51cf6ed02e53b468fa5a111a10f1a9cc75359168", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "473d2e92a293b5530a41400e883200961d42fb83615656a1b98273304d2a6e03", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "a795f49c3d1b6262ffc5bdedad7a894abf9caa48deba6832d2d4ab72fab21881", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "a441452b4958ef99b3edab9223521823f6fcb1dbde3f2e6051394f0ecfbd995e", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "7340526acc69e2e3a32b340ce857140ea4305d374a0a9f52226f81d5b8c13d6c", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "66260395391481a42b3fd5df8751bac647df85ebb36971ef62773dfc77b3d392", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "b26e8ccaaf1012aaaa8dca11fa2253ab0f616335e64111cb51c066e605d6f792", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "028cc09d009f4cba4920b0e6694a9a302e9216c0076090b05ce07e54f8c27665", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "12fca0c7b4434e6991dadecfb5164331caaf3665b87f9180728b2cf6a2df147d", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "8d87cd7f63801d8215c9a8ef6fd1052e0bb46ad40eb17685095537581983f80d", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "d800963f131d2bdaa06403c809ec55c3abc30eb178d2f0c4dc05165eaa6cce42", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "f36a2e602757357737e140f45bf34aebe98867e96c8186317f50e9d3bc04f154", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "f249c0af9ca1062ee210e6792ab625f99f478c80e9dbc64b55bac50e6e618ddc", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "44ab9c9c51b081d52764959aa9cbc77cf4775f55901f14a2aef379aeb2d4526a", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "bd5b51bdfb0f36bac74549cbcbb9ff0b9dc7adc803bd073fdfa3fa53f5abd780", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "622577254c301a35accc42c697e69a3a1dccac4770ac7e5b605d1b6aa5186628", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "7a1f9c137a5dcd693ab4ca0ebb0733cbcb294a3db2c6944891f86017ad20396a", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "086a8eb96a60c22c924ba88646e18ac7ef3fbdf773a5b84fc0b15ea52f812985", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "d3c204ca5b08279152138b58adbfe6b6f50d74d550844a429adf7c24bdd9e554", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "9f6415142ece8ce7af88f2df3760671b07161f3f93ed8cd7abd8844b454be44b", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "8fb9f5670a5e94855de0a5443d6904ff4cc4269f5d4d2f41bd948eb87a8059d2", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "1a897fd77b6aa7b5499e8a2726e2b6cf02a08fbee378541f831adda7ad00958e", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "0ad5d4265246c445335d409a7c5355841e02ca571bbeea4d31ae4d1fe04f9fdf", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "c2d34f620cfc2fc58203ce5b3632695a574ec57e9bad5e7935249340a3e78ef5", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "e293e4e25a54dc838f19d55cb8536cfd41648698f50349db793138c366ba313e", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "c97eccd65166576724d7511f12733427c6cd258080b4c1603815ff59baf3eb27", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "fe591b6e46fd1935e716fac5ad76223364d62f85fb0fceec6d44fba644616bc4", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "7964a37b4ad77e96a87caced43eb6df4637dd60b2a96b8f7943337b63c42f9d6", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "ba2de0b083a19f5a213b15efc68c35f87336e314445e61bd10b8ca5779557fc0", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "1cc13404bc45ae107fe47dcd6a14d4f1fef8f23546fe78a85479a37cf986a1a3", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "a911aadeafc26362ce2060eab197b27a61a865856968c97be9c0fe8af2ee3424", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "f064426161f148b29940dafbe9a248e09ece0e463596e7174406b2d962f21f01", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "c8fce3bafb52f66c8fb676503f72616cff480808bf2a547b03c54fb1b7b61ac5", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "1208364b18249ea2413c4ea5e352037a69bdb65d7d1ff8d16b94bf0b2d387251", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "71af7b4074da0021d6bd20f0fd72184143168065f5f3ebe0aec664d1c9020067", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "eb7a507afa3e74b92180a732e77f11e368dd543fb556e21c0d988aba3e20bb5d", "target_hash": "36c2cea0ef3508f1eaa02304f9e8ac7ce970e161c313723f7e517fda75ed6778", "section_hashes": ["4d36438e84b1", "50770e75c649", "4fa9d1e70b35"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -165764,7 +165902,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165779,7 +165917,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165794,7 +165932,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165809,7 +165947,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165824,7 +165962,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165839,7 +165977,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165854,7 +165992,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165869,7 +166007,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165884,7 +166022,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165899,7 +166037,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165914,7 +166052,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165929,7 +166067,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165944,7 +166082,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165959,7 +166097,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165974,7 +166112,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -165989,7 +166127,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166004,7 +166142,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166019,7 +166157,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166034,7 +166172,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166049,7 +166187,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166064,7 +166202,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166079,7 +166217,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166094,7 +166232,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166109,7 +166247,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166124,7 +166262,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166139,7 +166277,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166154,7 +166292,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166169,7 +166307,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166184,7 +166322,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166199,7 +166337,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166214,7 +166352,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166229,7 +166367,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166244,7 +166382,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166259,7 +166397,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166274,7 +166412,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166289,7 +166427,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166304,7 +166442,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166319,7 +166457,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166334,7 +166472,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166349,7 +166487,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166364,7 +166502,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166379,7 +166517,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166394,7 +166532,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166409,7 +166547,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166424,7 +166562,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166439,7 +166577,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166454,7 +166592,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166469,7 +166607,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166484,7 +166622,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166499,7 +166637,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166514,7 +166652,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166529,7 +166667,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166544,7 +166682,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166559,7 +166697,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166574,7 +166712,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166589,7 +166727,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166604,7 +166742,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166619,7 +166757,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166634,7 +166772,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166649,7 +166787,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166664,7 +166802,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166679,7 +166817,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166694,7 +166832,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166709,7 +166847,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "bb5087a17bcb6411b9e566f9d4e52548241d4b39b786f32acbbb62253ceebbb2", @@ -166724,7 +166862,7 @@ "7a420ed52517", "04b36ae05b6e" ], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } }, @@ -166735,391 +166873,391 @@ "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "07765b86bc3216e0f629926672876b1c0b1f18e31250fd3b067fd9331bfc55ac", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "cs": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "a05e63cbde6e4332def40a089ff2f8ab421680798abe81cf6a524656885787ab", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bg": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "741c1a05f697eafe6c794294a2ccfdec84800abd94f653615dacf7349d037756", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "bn": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "04fdbc966e1fd292b814a411c74a31733678bd409effb3126c81efc34488358d", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "az": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "48e304087bd4843c4bf99474fa2759411932dc0afec6ce6b3c38bb40ed60a36e", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "da": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "49f207a325c7c95c790da566fd8362699803f3bba5d4245ca4a1c443b827fc58", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "de": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "cbeceedd61ef6aabd99b6398b74148f0424b57e9d06d6440f0ff2e229a170534", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "es": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "6d14ef9620864de4947580fe71df67f4c40a1f6d52e5b3dcbff867dcb0d36e59", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "et": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "3b22bc9f4b2cb5f32eae9860459aad986944ce69df502d43d81be3c64b72384f", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "el": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c772fc432eb18ff97c2e86105736d9d0493db64fc7c6941f13b16d6cffe21608", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "am": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "29ed56a84c6aa0c3f778e99a61e951a16fa18169dac2b7033d100144705137f7", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fr": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "b813fba77c6c99e12c299c871d40a066c0174a4586b2860a0cb933afe24a1e42", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fa": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "9885f3e5f6ac86e6609ebac5d99e152eedac9c247a67829b5305a81c9a4c5deb", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "fi": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c801cb307c5b76e94918bd41381ed82d6988660615d53494dc43010ad8d511d8", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ga": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "1d1d2a4fd49cb9e08a68e1d2013cc6c79a8cb77b205a836b98e73d7e5ac2feba", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "gu": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "90e04207edaa0c4bde403011fd187265582511602dcc9a3590ad299e04b7afc4", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ha": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "14effafb4b3056045bdfdf1a14ac53209bf02b0c7587cc58e3bf20ae3f4d426e", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "he": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "0a974a39421a5e13c8a84fcabb1611620d557e95a94c7c82959f4fb1c52ef33a", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hi": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "819b5f7fd2511552a68494296750bb6a2d6a5a4ae0f78a52c74593a9518de2a6", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hr": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "58ac4e89f943c03120c65baeaf9d78529b97d30fac19ca8350c66733065732e4", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hu": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "76e84e6ae1633cad647529b33c9d87f43530809b70c864f83faa005bd691bdd7", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "hy": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "862c05afdafcd7f27ad7a1c79d5e4136711d310e78f78e09887b7f2f7fe9ad18", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "id": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "9d2c0ac4588f0d8249b19ed98d062f9628458e635352833887db68dbb90fd4d3", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "it": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "e1c299827f238457c917c65688c58e213a2af5538a79da156ff0e568c5704d95", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ig": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c13deb3be5aa0253c3c7db0d0cd0575c10aab107a809377d5d7a185233bf2500", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ja": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "031d6a99d34d8b917137f30219bb388d93f8c7019fee2f3f5738fac7b9df93a7", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ka": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "a964c986a41cf3e348fa52fc160b0400b3ed3fd9f2b2209a67b247fae477519b", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ko": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "5a3f75c0a186aab17e92749a5cd641ee7b0965ebd6d554c1765bc57dd32b1ef6", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "kn": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "7c2fbb28037b28232a78a588cf650e7d514a45352fe920f6540db4b8cc85f827", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "km": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "4475da1c1a986061a4634f8fa7d296b58e7fcf41f8065bbd088b10ccd8cdf7b4", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lt": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "d7a5f6f12a25832777e5e48325b713bbcdced5684e97fcfe57eef149dc672a86", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "lv": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "0067b80ab7e0bec45b7f7a950a0316a57927f505355b6ea42045b4057e1d1680", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ml": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "51af0b485d4874f9caac76eb04e739fdc7d6a7f9bd1678bb5c1969a8b06a0f04", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ms": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "1cfeb4efebc599333e9afaaa0bb340e7def5ab3ec410a36b9db25838b3c64405", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mr": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "78419fe464526aa6a0ce0cecb29cd845775f71d16d39ec768c85c75b4e3a9747", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "mt": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "4c8d50dc61536a2c968726773c7938874d215d09d2bf72c4f694cf039d8d5db3", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ne": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "22313e7a81805417e7c6f0cce0c6c506fa214a8945ffb6b9b38bb4620f10e93e", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "my": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "eb6a600e95b8468b37293f0d2f35520434e2d791072ea97993d59d1f1bdbfbc5", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "nl": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "83221b2b55f9e42c754e095ebe5826bf042e9f6697c1642d4f2b6f84c021c012", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "no": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "ec3da53b660f4e06f2c0db9681899cf190c4f671ca2428c9675f4a8ce4238b1c", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pl": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "f3467a861f524eb5e66e451c73875b6cf1576a0d9264e0e4dbdc2cc06edab79e", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "phi": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "e84bc2b0c56d208c87cd2bc2d1784e4401c99ffd64ea6211e7a35154e29e3dca", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt-BR": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "2d3d0382207f59a07173362452eaa24eb2aab6707978de2857cf95a5fd2786e8", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pt": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "72238bf730b22f30374a416857379e43852560b592c8be1ba735a8b3f0eb19c4", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "pa": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "fa6125da9d1905bfd2eb78fce0637cec3dfd0b61e1cddca8ed6b2f20e0cbd17b", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ro": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "7b4f2367a8fe29cf148711152f752d8265771f86c554fed39cbafa5ca756d0ea", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "or": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "97b477919dccb8a53ec9feedbcec2151757ca0f11bb3453afd8381f784ca67da", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ru": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "63d1b7eb253c06d17da609ebf87e58308f00a982650605da20da7225ca5ba903", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sk": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "539ba3fb8db613531c320c436a26fefeb81c653886ce8e5d5fb2fb23f2642cf9", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "si": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "5f619935f9295777708488fd8d622059d4963933ec3ea84e3838d1b8a6046774", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sl": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c66067ec2d116d3f479901314f283e966e89e438a0201670940bc4191f4f7341", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sv": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "a2d14ff54f6d4721f416f513c91cbe9d8db9ee4db90d7b475493b25297b757f0", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sr": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "f860180fa3c7b781a8f43b905c0038b4e02d667a51eea97f3e14347cfb7705c2", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "sw": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "e3d76a139f683a415a5188c1dde6884a5c239959e468474b0517f5d63615413b", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ta": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "4e7f1c2f47ba9c6cefc43b1c053e0328680cd8bec06699682f473eb7b88b1ad9", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "te": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "6c6f912df9664ed751bafc8fde9bdeec216aa6d2e7385ac72b422fee43a4a2d0", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "th": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "dbcc854986467c07f31311fdb0c00001c4deee62387d4a7a71b754fa31a1da0f", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "tr": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c38dc61b842a3aaa2033ac20414eb31e4c040660bed0d02c286bc7aa04bab222", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uk-UA": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "b9473c9c0505fe42802f335cdfebe166790e24a34f67273faceb9b2e979270bd", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "ur": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "722ffd118e5053cfb7c452a0c68821bcadd5007507cc96ce860788e22b61efca", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "vi": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "7ccc7483305f065d46e4810df6ac4a3ea1e8280ed85c44a8d42c2a2df02bb6e1", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-CN": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "8a2661fb4614fe14b00ba938585f20a6e9108f4516f2bf82c4ff2fef9d1c12f4", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "uz": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "fea36b33f353ba27c5d9ebc27a4130928445a1046e9a1875e4cf4e01c0cd7587", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "zh-TW": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c1d43a00bf37f0074662a794cdba18ca7b82e6755d0f8d34cee12a3e8ad9892f", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" }, "yo": { "source_hash": "6da74515aafa227ef6047c9c6fd442ce21053e7d80b727f08cbd49bfebb0b70d", "target_hash": "c966e2f31652b76edf5ef196166adc31b824386e2aa21e345fd636d67920c841", "section_hashes": ["492c0eaf722e", "e3f403671566", "b8556f29eebf", "5f56c9ad1c18"], - "updated_at": "2026-09-18T14:33:40.044Z" + "updated_at": "2026-09-19T04:41:38.614Z" } } } diff --git a/docs/guides/I18N.md b/docs/guides/I18N.md index f3f7d682461f..b094e14ebcb7 100644 --- a/docs/guides/I18N.md +++ b/docs/guides/I18N.md @@ -216,6 +216,10 @@ npm run i18n:check-ui-coverage && npm run i18n:check-ratio && npm run check:docs adapter and must not be edited by hand. The Google-Translate generator (`generate-multilang.mjs`) is deprecated and is not part of this flow. +### Stale mirrors after an interrupted refresh + +`npm run i18n:check` also lists **stale targets**: mirrors whose locale record in `.i18n-state.json` was written from an older version of the source than the top-level `source_hash` now records. That is what a refresh run interrupted halfway (an upstream quota `429`, a killed runner) leaves behind — the source no longer reads as changed and the mirrors' own hashes still match, so without this check the gate would say PASS. Stale targets are a warning, not a failure: rerun `npm run i18n:run -- --locale= --files=` for the listed locales (or `_artifacts`-style batch runner) and the list empties. + ## Keeping catalogs complete and retranslating English copies Three gates guard the catalogs, and they see different things: diff --git a/docs/i18n/am/README.md b/docs/i18n/am/README.md index b5793d4d4847..3c2b7b543923 100644 --- a/docs/i18n/am/README.md +++ b/docs/i18n/am/README.md @@ -23,13 +23,13 @@ -> ነፃ ደረጃዎችን በእጅ ማደራጀት አስቸጋሪ ነው — በደርዘን የሚቆጠሩ SDKዎች፣ በደርዘን የሚቆጠሩ የፍጥነት ገደቦች፣ እና በእውነት ምን ያህል እንዳለዎት የማወቂያ መንገድ የለም። OmniRoute **በ35 ተደጋጋሚ የpool ቁልፎች ውስጥ 491 የነፃ ደረጃ ግቤቶችን** ይመዘግባል፣ እና የቶከን ዋና ቁጥሩን **ይፋ የሆነ አዎንታዊ ወርሃዊ በጀት ካላቸው 17 poolዎች እና አምስት በሞዴል የተወሰኑ የGroq ገደቦች** ያሰላል፤ በጋራ pool የሚጋሩትንም አንድ ጊዜ ብቻ ይቆጥራል። ከክልላዊ ማንነት ማረጋገጫ በኋላ ብቻ የሚከፈቱ ኮታዎች (በአሁኑ ጊዜ፦ ModelScope) ለየት ብለው ይታያሉ፤ +~6M ከክልላዊ ማንነት ማረጋገጫ በስተጀርባ ይገኛሉ፣ እና በዋናው ቁጥር ውስጥ ፈጽሞ አይደመሩም። ውጤቱ በዳሽቦርዱ (`/dashboard/free-tiers`) ላይ ሁልጊዜ ይታያል። +> ነፃ የአገልግሎት ደረጃዎችን በእጅ ማዋሃድ አስቸጋሪ ነው — በደርዘን የሚቆጠሩ SDKዎች፣ በደርዘን የሚቆጠሩ የፍጥነት ገደቦች፣ እና በእርግጥ ምን ያህል እንዳለዎት የማወቂያ መንገድ የለም። OmniRoute **በ35 ተደጋጋሚ የፑል ቁልፎች ውስጥ 489 የነፃ ደረጃ ግቤቶችን** በካታሎግ ያደራጃል፤ እንዲሁም የቶከን ዋና ቁጥሩን **ይፋ የተደረገ አዎንታዊ ወርሃዊ በጀት ካላቸው 17 ፑሎች እና ለእያንዳንዱ ሞዴል ከተወሰኑ አምስት የGroq ገደቦች** ያሰላል፤ የጋራ ፑሎችንም አንድ ጊዜ ብቻ ይቆጥራል። ከክልላዊ ማንነት ማረጋገጫ በኋላ ብቻ የሚከፈቱ ኮታዎች (በአሁኑ ጊዜ፦ ModelScope) ለብቻቸው ይታያሉ፤ ከክልላዊ ማንነት ማረጋገጫ በስተጀርባ +~6M ይገኛሉ፣ እና በዋናው ቁጥር ውስጥ ፈጽሞ አይደመሩም። ውጤቱ በዳሽቦርዱ (`/dashboard/free-tiers`) ላይ ሁልጊዜ ይታያል። -የOmniRoute ነፃ ደረጃ በጀት ካርድ፦ በወር ~1.62B ነፃ ቶከኖች በቋሚነት፣ በመጀመሪያው ወር ከምዝገባ ክሬዲቶች ጋር እስከ ~2.22B፤ ከአንድ endpoint በስተጀርባ 491 የተመዘገቡ የነፃ ደረጃ ግቤቶችን ከሚሸፍኑ 35 በሰነድ የተገለጹ ተደጋጋሚ የpool ቁልፎች። ታማኝ፣ የpool ድግግሞሽን ያስወገደ ስሌት — እያንዳንዱ የጋራ pool አንድ ጊዜ ብቻ ይቆጠራል፤ ይህም ይፋ የሆነ አዎንታዊ ወርሃዊ የቶከን በጀት ያላቸውን 17 ተደጋጋሚ poolዎች እና አምስት በሞዴል የተወሰኑ የGroq ገደቦችን ያካትታል፤ 13 አቅራቢዎች በውል-ስጋት ካታሎጉ ውስጥ እንዲወገዱ ምልክት ተደርጎባቸዋል፣ ስለዚህ እርስዎ ይወስናሉ። የበጀት አሞሌው Mistral 1B፣ Nara 210M፣ LLM7 150M፣ xKiro 150M፣ Groq 30M (አምስት በሞዴል የተወሰኑ ገደቦች) እና አነስተኛ poolዎችን ያካትታል፤ በተጨማሪም የመጀመሪያ ወር የምዝገባ ክሬዲቶች እና በቋሚነት ነፃ የሆኑ የቶከን ገደብ የሌላቸው አቅራቢዎች ዋናውን ቁጥር እንዳያጋንኑ ለየት ብለው ይታያሉ። የቀጥታ ጥቅም ላይ የዋለ/የቀረ መጠን በ /dashboard/free-tiers። +የOmniRoute ነፃ ደረጃ በጀት ካርድ፦ በመደበኛነት በወር ~1.62B ነፃ ቶከኖች፣ በመጀመሪያው ወር ከምዝገባ ክሬዲቶች ጋር እስከ ~2.22B፤ ይህም በአንድ የመዳረሻ ነጥብ በስተጀርባ 489 በካታሎግ የተመዘገቡ የነፃ ደረጃ ግቤቶችን ከሚሸፍኑ 35 በሰነድ የተረጋገጡ ተደጋጋሚ የፑል ቁልፎች ይገኛል። ግልጽ፣ ፑሎችን በማይደጋገም መልኩ የሚቆጥር ስሌት — እያንዳንዱ የጋራ ፑል አንድ ጊዜ ብቻ ይቆጠራል፤ ይህም ይፋ የተደረገ አዎንታዊ ወርሃዊ የቶከን በጀት ያላቸውን 17 ተደጋጋሚ ፑሎች እና ለእያንዳንዱ ሞዴል የተወሰኑ አምስት የGroq ገደቦችን ያካትታል፤ እርስዎ እንዲወስኑ 13 አቅራቢዎች በውሎች ስጋት ካታሎግ ውስጥ እንዲወገዱ ምልክት ተደርጎባቸዋል። የበጀት አሞሌው Mistral 1B፣ Nara 210M፣ LLM7 150M፣ xKiro 150M፣ Groq 30M (ለእያንዳንዱ ሞዴል አምስት ገደቦች) እና አነስተኛ ፑሎችን ያካትታል፤ እንዲሁም የመጀመሪያ ወር የምዝገባ ክሬዲቶች እና በቋሚነት ነፃ የሆኑ የቶከን ገደብ የሌላቸው አቅራቢዎች ዋናውን ቁጥር እንዳያጋንኑ ለብቻቸው ይታያሉ። በቀጥታ ያገለገለው/የቀረው መጠን በ /dashboard/free-tiers ላይ። -> የቀጥታው `/dashboard/free-tiers` ገጽ እነማዊ ማጠቃለያ። ሙሉ ዘዴው (የpool ድግግሞሽ ማስወገድ፣ የክሬዲት ደረጃዎች፣ የአቅራቢ ውሎች)፦ **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**። +> የቀጥታው `/dashboard/free-tiers` ገጽ በእንቅስቃሴ የቀረበ ማጠቃለያ። ሙሉ ዘዴው (የፑል ድግግሞሽን ማስወገድ፣ የክሬዲት ደረጃዎች፣ የአቅራቢዎች ውሎች)፦ **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**። > -> እነዚህ ቁጥሮች በየሁለት ሳምንቱ ከቀጥታው ካታሎግ ጋር እንደገና ኦዲት ይደረግባቸዋል፣ እና **ወደ ሁለቱም አቅጣጫዎች ይንቀሳቀሳሉ** — አንድ አቅራቢ ነፃ ደረጃውን ሲያቆም ቁጥሩ ይቀንሳል፤ አዲስ ሲጨመር ደግሞ ይጨምራል። የምናትመው ካታሎጉ በእውነት የሚያሰላውን ነው፤ ወደ ላይ የተጠጋጋ ምርጥ ሁኔታን ፈጽሞ አናትምም። +> እነዚህ ቁጥሮች በየሁለት ሳምንቱ ከቀጥታው ካታሎግ ጋር እንደገና ኦዲት ይደረግባቸዋል፣ እና **ወደ ሁለቱም አቅጣጫ ይለዋወጣሉ** — አንድ አቅራቢ ነፃ ደረጃውን ሲያቋርጥ ቁጥሩ ይቀንሳል፤ አዲስ አቅራቢ ሲጨመር ደግሞ ይጨምራል። እኛ ካታሎጉ በእርግጥ ያሰላውን እናትማለን፤ ወደ ላይ የተጠጋጋ ምርጥ ሁኔታን ፈጽሞ አናቀርብም።
@@ -37,29 +37,29 @@

-⭐ OMNIROUTE ገንዘብ እንዲቆጥቡ እና ሥራዎን እንዲያቀሉ ከረዳዎት repoውን Star ያድርጉ። +⭐ OMNIROUTE ገንዘብ እንዲቆጥቡ እና ሥራዎን እንዲያቀሉ ከረዳዎት ማከማቻውን በኮከብ ይደግፉ።

[![ኮከቦች](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) diegosouzapw%2FOmniRoute | Trendshift -[![የStar ታሪክ ደረጃ](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) +[![የኮከብ ታሪክ ደረጃ](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) [![olud.ai](https://olud.ai/badge.php?tool=diegosouzapw-omniroute)](https://olud.ai/project/diegosouzapw-omniroute.html) ### 💬 ማህበረሰቡን ይቀላቀሉ -**👋 ጠብቃውን ይከተሉ — ስለ አዳዲስ አቅራቢዎች፣ ልቀቶች እና ጠቃሚ ምክሮች ቀድመው ይወቁ፦** +**👋 ጠብቃውን ይከተሉ — አዳዲስ አቅራቢዎችን፣ ልቀቶችን እና ጠቃሚ ምክሮችን ቀድመው ያግኙ፦** [![Diegoን በLinkedIn ይከተሉ](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![@diegosouzapwን በGitHub ይከተሉ](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![ዓለም አቀፍ WhatsApp](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp ዓለም አቀፍ](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) [![WhatsApp ብራዚል](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) -[![ድረ ገጽ](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) +[![ድረ-ገጽ](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**ጥያቄዎች፣ የአቅራቢ ምክሮች፣ የልማት እቅድ እና ድጋፍ → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 ዓለም አቀፍ](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 ብራዚል](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [ፖርታል](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**ጥያቄዎች፣ የአቅራቢ ጠቃሚ ምክሮች፣ የዕቅድ መንገድ እና ድጋፍ → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 ዓለም አቀፍ](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 ብራዚል](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [ፖርታል](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -590,7 +590,7 @@ Radar በምርጫ የሚነቃ ሲሆን GET ጥያቄዎችን ብቻ ይጠ
-## 🤖 ተኳኋኝ CLIs እና የኮድ አጻጻፍ ወኪሎች +## 🤖 ተኳኋኝ CLIs እና የኮዲንግ ወኪሎች > አንድ ውቅር — `http://localhost:20128/v1` — እና **ሁሉም** AI IDE ወይም CLI በነጻ እና ዝቅተኛ ወጪ ባላቸው ሞዴሎች ላይ ይሰራል። @@ -626,23 +626,23 @@ Radar በምርጫ የሚነቃ ሲሆን GET ጥያቄዎችን ብቻ ይጠ Goose
Goose
                            Open Interpreter
Open Interpreter
                            Warp AI
Warp AI
                            - Agent Deck
Agent Deck
                            + deyin.ai
deyin.ai
                           
-+ ከእነዚህም ጋር ይሰራል · Kiro · Command Code · Antigravity · Windsurf · AMP · ከማንኛውም OpenAI-ተኳኋኝ መሣሪያ ጋር ++ ከእነዚህም ጋር ይሰራል · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · ማንኛውም ከOpenAI ጋር ተኳኋኝ የሆነ መሣሪያ
-📖 ለሁሉም 36 መሣሪያዎች (26 CLI Code's + 10 CLI Agents) የእያንዳንዱ መሣሪያ ማዋቀሪያ → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode ተሰኪ → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 ለሁሉም 36 መሣሪያዎች (26 CLI Code መሣሪያዎች + 10 CLI Agents) የየመሣሪያው ማዋቀሪያ → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode ተሰኪ → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)
-**OmniRouteን በመጠቀም የሚደገፍ ማንኛውንም CLI በአንድ ትዕዛዝ ያስጀምሩ** — ምንም የማዋቀሪያ ፋይል አይጻፍም፣ -ምስክርነቶች ለእያንዳንዱ ሂደት ይገባሉ፣ Qwen/Gemini ደግሞ ጊዜያዊ የተነጠለ መነሻ ያገኛሉ፦ +**ማንኛውንም የሚደገፍ CLI በአንድ ትዕዛዝ በOmniRoute በኩል ያስጀምሩ** — ምንም የውቅረት ፋይሎች አይጻፉም፣ +የመግቢያ ማረጋገጫዎች ለእያንዳንዱ ሂደት ይገባሉ፣ እንዲሁም Qwen/Gemini ጊዜያዊና የተነጠለ home ያገኛሉ፦ ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,27 +653,27 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# ወይም አቅራቢውንና ሞዴሉን በይነተገናኝ ይምረጡና የመሣሪያውን የራሱን ማዋቀሪያ ይጻፉ፦ -omniroute configure codex # እነዚህንም ይደግፋል፦ claude opencode qwen aider goose gemini cline continue kilo +# ወይም provider+modelን በይነተገናኝ ሁኔታ ይምረጡና የመሣሪያውን የራሱን ውቅር ይጻፉ፦ +omniroute configure codex # እነዚህም፦ claude opencode qwen aider goose gemini cline continue kilo ``` እያንዳንዱ ትዕዛዝ ንቁውን የርቀት አውድ (`omniroute connect `) ያከብራል፤ `--dry-run` -ሳያስፈጽም ትክክለኛዎቹን env/args አስቀድሞ ያሳያል፣ እንዲሁም `--api-key-env NAME` ሚስጥሮችን +ሳያስፈጽም ትክክለኛዎቹን env/args አስቀድሞ ያሳያል፣ እና `--api-key-env NAME` ሚስጥሮችን ከshell ታሪክዎ ውጭ ያቆያል። → [የCLI ውህደቶች](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 የAI አቅራቢዎች — 152 በካታሎግ ነፃ ተብለው የተመለከቱ +## 🌐 357 የAI አቅራቢዎች — 152 በካታሎግ እንደ ነፃ የተመለከቱ
-> በመደበኛዎቹ የውይይት፣ ሚዲያ፣ ፍለጋ፣ አካባቢያዊ፣ የደመና-ወኪል እና የስርዓት ስብስቦች ውስጥ **357 የተመዘገቡ አቅራቢዎች** ሲኖሩ፣ ከእነዚህም **152ቱ `hasFree: true` የግኝት ሜታዳታ ይዘዋል**። የውይይት ሞዴል መዝገቡ **229 አቅራቢዎችን / 2,554 የተለያዩ የአቅራቢ-ሞዴል ጥንዶችን / 1,283 ጥሬ የሞዴል IDsን** ያካትታል፤ የተለየው የነፃ በጀት ካታሎግ ደግሞ **491 የእያንዳንዱ ሞዴል ረድፎች**፣ **35 ተደጋጋሚ ስብስቦች** እና **54 ተደጋጋሚ/ቁልፍ-አልባ ለዘላለም ነፃ አቅራቢዎች** አሉት። እነዚህ በንድፍ የተለያዩ መለኪያዎች ናቸው፤ ትርጓሜዎችና ተመሳሳይ ስብስቦችን ያስወገዱ ስሌቶች በ[የአቅራቢዎች ማጣቀሻ](docs/reference/PROVIDER_REFERENCE.md) እና [ነፃ ደረጃዎች](docs/reference/FREE_TIERS.md) ውስጥ ይገኛሉ። +> በመደበኛዎቹ የውይይት፣ ሚዲያ፣ ፍለጋ፣ አካባቢያዊ፣ የደመና-ወኪል እና የስርዓት ስብስቦች ውስጥ **357 የተመዘገቡ አቅራቢዎች** ሲኖሩ፣ ከእነዚህም **152ቱ `hasFree: true` የማግኛ ሜታዳታ አላቸው**። የውይይት ሞዴል መዝገቡ **229 አቅራቢዎችን / 2,554 የተለያዩ የአቅራቢ-ሞዴል ጥንዶችን / 1,283 ጥሬ የሞዴል መለያዎችን** ይሸፍናል፤ የተለየው የነፃ በጀት ካታሎግ ደግሞ **491 በሞዴል የተደራጁ ረድፎች**፣ **35 ተደጋጋሚ የአቅም ጥምረቶች** እና **54 ተደጋጋሚ/ቁልፍ-አልባ ለዘላለም ነፃ አቅራቢዎች** አሉት። እነዚህ በንድፍ የተለያዩ መነሻ ድምሮች ናቸው፤ ትርጓሜዎች እና ተመሳሳይ የአቅም ጥምረቶችን ያስወገዱ ስሌቶች በ[የአቅራቢዎች ማጣቀሻ](docs/reference/PROVIDER_REFERENCE.md) እና [ነፃ ደረጃዎች](docs/reference/FREE_TIERS.md) ውስጥ ይገኛሉ።
-### 🏢 ሁሉም ዋና ላቦራቶሪዎች — በአንድ የመገናኛ ነጥብ +### 🏢 ሁሉም ዋና ላቦራቶሪዎች — በአንድ የመዳረሻ ነጥብ @@ -687,7 +687,7 @@ omniroute configure codex # እነዚህንም ይደግፋል፦ claud - + @@ -702,7 +702,7 @@ omniroute configure codex # እነዚህንም ይደግፋል፦ claud
Qwen
Qwen
                           
Meta Llama
Meta Llama
                           
Groq
Groq
                           
Groq
Groq
                           
NVIDIA
NVIDIA
                           
MiniMax
MiniMax
                           
Cohere
Cohere
                           
-…እና ሌሎች 330+ — እያንዳንዱ አዶ ከዳሽቦርዱ የአቅራቢዎች ካታሎግ በቀጥታ ይጫናል። 📖 [የአቅራቢዎች ማጣቀሻ](docs/reference/PROVIDER_REFERENCE.md) +…እና 330+ ተጨማሪ — እያንዳንዱ አዶ ከዳሽቦርዱ የአቅራቢዎች ካታሎግ በቀጥታ ይጫናል። 📖 [የአቅራቢዎች ማጣቀሻ](docs/reference/PROVIDER_REFERENCE.md)
@@ -720,14 +720,14 @@ omniroute configure codex # እነዚህንም ይደግፋል፦ claud Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
ያልተገደበ ነፃ አገልግሎት
Pollinations
Pollinations
GPT, Llama, Claude
ቁልፍ አያስፈልግም
- Cloudflare AI
Cloudflare AI
50+ ሞዴሎች
10K ኒውሮኖች/ቀን
+ Cloudflare AI
Cloudflare AI
50+ ሞዴሎች
10K ኒውሮኖች/በቀን
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM በነፃ
- Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M ቶከኖች/ቀን
+ Openference
Openference
Qwen3.8 27B, Llama 3.2
ነፃ ደረጃ
OpenRouter
OpenRouter
:free ሞዴሎች
+$10 → ከፍተኛ RPM
-📖 ሙሉ በማሽን ሊነበብ የሚችል ካታሎግ → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 ሙሉ በማሽን የሚነበብ ካታሎግ → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1262,22 +1262,22 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1ም ይዘለዋ - + - - - + + + - - - - - - - + + + + + + + - - + +
ንብርብርቴክኖሎጂ
የማስኬጃ አካባቢNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
ቋንቋTypeScript 6.0 — በsrc/ እና open-sse/ ውስጥ በሙሉ 100% TypeScript (ከv2.0 ጀምሮ በዋናው ክፍል ውስጥ ምንም any የለም)
ቋንቋTypeScript 6.0 — በsrc/ እና open-sse/ ውስጥ 100% TypeScript (ከv2.0 ጀምሮ በዋናው ክፍል ዜሮ any)
ማዕቀፍNext.js 16 + React 19 + Tailwind CSS 4
የውሂብ ጎታbetter-sqlite3 (SQLite፣ WAL ጆርናሊንግ) + LowDB (የቆየ JSON) — 122 የዶሜይን ሞጁሎች፣ 176 ፍልሰቶች
ማህደረ ትውስታSQLite FTS5 ሙሉ-ጽሑፍ + int8-ኳንታይዝድ የቬክተር ውክልናዎች፣ ዓይነት-የተወሰነ መቀነስ
ንድፎችZod 4 — የMCP መሣሪያ I/O ማረጋገጫ + የAPI ውሎች
የውሂብ ጎታbetter-sqlite3 (SQLite፣ WAL ጆርናሊንግ) + LowDB (የቆየ JSON) — 122 የጎራ ሞጁሎች፣ 178 ፍልሰቶች
ማህደረ ትውስታSQLite FTS5 ሙሉ-ጽሑፍ + int8-የተመጠኑ የቬክተር ውክልናዎች፣ በዓይነት የተወሰነ መቀነስ
መርሃግብሮችZod 4 — የMCP መሣሪያ I/O ማረጋገጫ + የAPI ውሎች
ፕሮቶኮሎችMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
ዥረት ማሰራጨትServer-Sent Events (SSE) + WebSocket ድልድይ (/v1/ws)
ማመቅባለ12-ኤንጂን የሂደት መስመር — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
ማረጋገጫ እና ደኅንነትOAuth 2.0 (PKCE) + JWT + የAPI ቁልፎች + የMCP ወሰን-ተኮር ማረጋገጫ · በማከማቻ ላይ AES-256-GCM · DOMPurify
ስውርነትwreq-js — የJA3 / JA4 TLS የጣት አሻራ ማስመሰል፣ ባለ3-ደረጃ ፕሮክሲ
የመቋቋም አቅምየወረዳ አቋራጭ፣ ኤክስፖነንሻል የድጋሚ ሙከራ መዘግየት፣ የተቀናጀ ድንገተኛ ጭነት መከላከያ፣ ራስ-ሰር ጥምረት ራስን መጠገን
ምዝገባpino — የጥያቄ ዐውድን የያዙ የተዋቀሩ JSON መዝገቦች
ሙከራNode.js test runner + Vitest — በ5,100+ ክትትል በሚደረግባቸው የሙከራ ፋይሎች ውስጥ 39,000+ የማይለዋወጡ የሙከራ መግለጫዎች (አሃድ፣ ውህደት፣ E2E፣ ደኅንነት፣ ሥነ-ምህዳር)
ዥረት ማስተላለፍከአገልጋይ የሚላኩ ክስተቶች (SSE) + WebSocket ድልድይ (/v1/ws)
ማመቅባለ12-ሞተር የሂደት መስመር — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
ማረጋገጫ & ደህንነትOAuth 2.0 (PKCE) + JWT + API ቁልፎች + ወሰን የተበጀለት የMCP ማረጋገጫ · በእረፍት ጊዜ AES-256-GCM · DOMPurify
ስውርነትwreq-js — የJA3 / JA4 TLS አሻራ ማስመሰል፣ ባለ3-ደረጃ ፕሮክሲ
ጽናትየወረዳ መቋረጫ፣ ጨምሮ የሚሄድ ዳግም ሙከራ መዘግየት፣ የተመሳሳይ ጥያቄዎችን መጨናነቅ መከላከል፣ ራሱን በራሱ የሚጠግን ራስ-ጥምረት
ምዝግብ ማስቀመጥpino — የጥያቄ አውድን ያካተቱ የተዋቀሩ JSON ምዝግቦች
ሙከራNode.js test runner + Vitest — በ5,100+ ክትትል በሚደረግባቸው የሙከራ ፋይሎች ውስጥ 39,000+ የማይንቀሳቀሱ የሙከራ መግለጫዎች (አሃድ፣ ውህደት፣ E2E፣ ደህንነት፣ ሥነ-ምህዳር)
መድረኮችዴስክቶፕ (Electron) · Android (Termux) · PWA (ማንኛውም አሳሽ)
CI/CDGitHub Actions — በልቀት ጊዜ ራስ-ሰር npm ማተም + Docker Hub
አገናኞችድረ ገጽ · npm · Docker Hub
CI/CDGitHub Actions — ሲለቀቅ በራስ-ሰር ወደ npm ማተም + Docker Hub
አገናኞችድረ-ገጽ · npm · Docker Hub
@@ -1295,41 +1295,41 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1ም ይዘለዋ የተጠቃሚ መመሪያአቅራቢዎች፣ ጥምረቶች፣ የCLI ውህደት፣ ማሰማራት የማዋቀር መመሪያሙሉ የመጫኛ ዘዴዎች፣ የCLI መሣሪያ ውቅሮች፣ የፕሮቶኮል ማዋቀር፣ የጊዜ ገደብ ማስተካከያ የCLI መሣሪያዎች መመሪያለClaude Code፣ Codex፣ Cursor፣ Cline፣ OpenClaw፣ Kilo፣ Copilot የየመሣሪያው ማዋቀር - የርቀት ሁነታየተገደበ ወሰን ባላቸው የመዳረሻ ቶከኖች አማካኝነት ከላፕቶፕዎ CLI የርቀት OmniRoute (VPS)ን ያስተዳድሩ - የClaude Code ውቅርበlaunch + ለእያንዳንዱ ሞዴል መገለጫዎች Claude Codeን ወደ OmniRoute (አካባቢያዊ/የርቀት) ያመልክቱ + የርቀት ሁነታወሰን ያላቸውን የመዳረሻ ቶከኖች በመጠቀም የርቀት OmniRoute (VPS)ን ከላፕቶፕዎ CLI ያስተዳድሩ + የClaude Code ውቅርlaunch + የየሞዴሉ መገለጫዎችን በመጠቀም Claude Codeን ወደ OmniRoute (አካባቢያዊ/የርቀት) ያመልክቱ ፈጣን ጅምርባለ3-ደረጃ መጫን → ማገናኘት → ማዋቀር -### 🔧 ክዋኔዎች እና ማሰማራት +### 🔧 ክወናዎች እና ማሰማራት - + - - - - + + + + - +
ሰነድመግለጫ
የDocker መመሪያDocker run፣ Compose መገለጫዎች፣ Caddy HTTPS፣ ቱነሎች፣ የምስል መለያዎች
የDocker መመሪያDocker run፣ የCompose መገለጫዎች፣ Caddy HTTPS፣ ዋሻዎች፣ የምስል መለያዎች
የPodman መመሪያየQuadlet systemd ውህደት፣ podman-compose፣ SELinux
የVM ማሰማራትሙሉ መመሪያ፦ VM + nginx + Cloudflare ማዋቀር
የFly.io ማሰማራትበቋሚ ማከማቻ Fly.io ላይ ያሰማሩ
የTermux መመሪያOmniRouteን በTermux በኩል Android ላይ ያስኪዱ
የPWA መመሪያየProgressive Web App መጫን፣ መሸጎጥ፣ ሥነ ሕንፃ
የVM ማሰማራትየተሟላ መመሪያ፦ VM + nginx + Cloudflare ማዋቀር
የFly.io ማሰማራትቋሚ ማከማቻን በመጠቀም ወደ Fly.io ያሰማሩ
የTermux መመሪያOmniRouteን በTermux በኩል በAndroid ላይ ያስኪዱ
የPWA መመሪያየProgressive Web App ጭነት፣ መሸጎጫ፣ አርክቴክቸር
የማራገፍ መመሪያለሁሉም የመጫኛ ዘዴዎች ንጹሕ ማስወገድ
የአካባቢ ውቅርሙሉ የ.env ተለዋዋጮች እና ማጣቀሻዎች
የአካባቢ ውቅርየተሟሉ የ.env ተለዋዋጮች እና ማጣቀሻዎች
-### 🧠 ባህሪያት እና ሥነ ሕንፃ +### 🧠 ባህሪያት እና አርክቴክቸር - - - - - - - - - - - - + + + + + + + + + + + +
ሰነድመግለጫ
ሥነ ሕንፃየሥርዓት ሥነ ሕንፃ፣ የውሂብ ፍሰት እና ውስጣዊ አሠራሮች
የማመቅ መመሪያባለ7-አማራጭ ቧንቧ፦ ጠፍቷል / ቀላል / መደበኛ / ኃይለኛ / እጅግ ከፍተኛ / RTK / የተደራረበ
የRTK ማመቅየትዕዛዝ ውጤት ማመቅ፣ ማጣሪያዎች፣ መተማመን፣ ማረጋገጥ፣ ያልተሠራበትን ውጤት መልሶ ማግኘት
የማመቅ ሞተሮችCaveman፣ RTK፣ የተደራረቡ ቧንቧዎች፣ የዳሽቦርድ/API/MCP በይነገጾች
የማመቅ ደንቦች ቅርጸትለCaveman እና RTK ማጣሪያዎች የJSON የደንብ-ጥቅል ንድፎች
የማመቅ ቋንቋ ጥቅሎችቋንቋን መለየት እና የCaveman የደንብ-ጥቅል ዝግጅት
የጽናት መመሪያየወረዳ ቆራጮች፣ የማቀዝቀዣ ጊዜያት፣ ወረፋ፣ ድንገተኛ የጋራ ጥያቄ መከላከያ፣ የTLS ማስመሰል
የራስ-ሰር ጥምረት ሞተርባለ16-መስፈርት ነጥብ አሰጣጥ፣ የሁነታ ጥቅሎች፣ ራስን ማዳን
የProxy መመሪያባለ3-ደረጃ የproxy ሥርዓት፣ የ1proxy ገበያ፣ የመዝገብ CRUD
ነፃ ደረጃዎችየተጠናከረ ማውጫ፦ 35 በሰነድ የተመዘገቡ ተደጋጋሚ ስብስቦች / 491 በካታሎግ የተመዘገቡ የነፃ-ደረጃ ግቤቶች
የባህሪያት ማዕከለ ስዕላትከቅጽበተ ማያ ገጾች ጋር የሚቀርብ ምስላዊ የዳሽቦርድ ጉብኝት
የኮድ ማከማቻ ሰነድለጀማሪዎች ምቹ የኮድ ማከማቻ ዝርዝር መመሪያ
አርክቴክቸርየስርዓት አርክቴክቸር፣ የውሂብ ፍሰት እና ውስጣዊ አሠራር
የማመቂያ መመሪያባለ7-አማራጭ ቧንቧ፦ ጠፍቷል / ቀላል / መደበኛ / ኃይለኛ / እጅግ ከፍተኛ / RTK / የተደራረበ
የRTK ማመቂያየትዕዛዝ ውጤት ማመቂያ፣ ማጣሪያዎች፣ እምነት፣ ማረጋገጥ፣ ያልተሰናዳ ውጤትን መልሶ ማግኘት
የማመቂያ ሞተሮችCaveman፣ RTK፣ የተደራረቡ ቧንቧዎች፣ የዳሽቦርድ/API/MCP በይነገጾች
የማመቂያ ደንቦች ቅርጸትለCaveman እና RTK ማጣሪያዎች የJSON የደንብ-ጥቅል መርሐግብሮች
የማመቂያ ቋንቋ ጥቅሎችቋንቋን መለየት እና የCaveman የደንብ-ጥቅል ዝግጅት
የጽናት መመሪያየወረዳ ሰባሪዎች፣ የማቀዝቀዣ ጊዜዎች፣ ወረፋ፣ የጎርፍ ጥያቄ መከላከያ፣ የTLS ማስመሰል
የራስ-ጥምረት ሞተርባለ16-ምክንያት ውጤት አሰጣጥ፣ የሁነታ ጥቅሎች፣ ራስን መጠገን
የፕሮክሲ መመሪያባለ3-ደረጃ የፕሮክሲ ስርዓት፣ የ1proxy ገበያ፣ የመዝገብ CRUD
ነፃ ደረጃዎችየተጠቃለለ ማውጫ፦ 35 በሰነድ የተገለጹ ተደጋጋሚ ስብስቦች / 489 በካታሎግ የተመዘገቡ የነፃ-ደረጃ ግቤቶች
የባህሪያት ማዕከለ-ስዕላትከቅጽበታዊ ገጽ ምስሎች ጋር የሚቀርብ ምስላዊ የዳሽቦርድ ጉብኝት
የኮድ ስብስብ ሰነድለጀማሪዎች ምቹ የኮድ ስብስብ ዝርዝር መመሪያ
### 🤖 ፕሮቶኮሎች እና APIዎች @@ -1338,37 +1338,37 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1ም ይዘለዋ ሰነድመግለጫ የAPI ማጣቀሻሁሉም የመጨረሻ ነጥቦች ከምሳሌዎች ጋር የOpenAPI ዝርዝር መግለጫየOpenAPI 3.0 ዝርዝር መግለጫ - MCP አገልጋይ110 የMCP መሣሪያዎች፣ የIDE ውቅሮች፣ Python/TS/Go ደንበኞች - የMCP አገልጋይ መመሪያየMCP መጫን፣ ማጓጓዣዎች እና የመሣሪያ ማጣቀሻ - A2A አገልጋይየJSON-RPC 2.0 ፕሮቶኮል፣ ክህሎቶች፣ ዥረት ማስተላለፍ፣ የተግባር አስተዳደር - የA2A አገልጋይ መመሪያየA2A ወኪል ካርድ፣ ተግባራት፣ ክህሎቶች እና ዥረት ማስተላለፍ + MCP አገልጋይ110 የMCP መሣሪያዎች፣ የIDE ውቅሮች፣ የPython/TS/Go ደንበኞች + የMCP አገልጋይ መመሪያየMCP ጭነት፣ ማጓጓዣዎች እና የመሣሪያ ማጣቀሻ + A2A አገልጋይየJSON-RPC 2.0 ፕሮቶኮል፣ ክህሎቶች፣ ዥረት ማሰራጨት፣ የተግባር አስተዳደር + የA2A አገልጋይ መመሪያየA2A ወኪል ካርድ፣ ተግባራት፣ ክህሎቶች እና ዥረት ማሰራጨት ### 📋 ፕሮጀክት እና ጥራት - - - + + + - - - + + +
ሰነድመግለጫ
አስተዋጽኦ ማድረግየልማት ማዋቀሪያ እና መመሪያዎች
የቅርንጫፍ እና የልቀት ሞዴልPR-ዎች የሚያነጣጥሩበት (release/*)፣ main እና መለያዎች ምን እንደሚያመለክቱ
የለውጦች መዝገብሙሉ የየስሪቱ የልቀት ታሪክ
አስተዋጽዖ ማድረግየልማት ማዋቀሪያ እና መመሪያዎች
የቅርንጫፍ እና ልቀት ሞዴልPRዎች የሚያነጣጥሩበት (release/*)፣ main እና መለያዎች ምን ማለት እንደሆኑ
የለውጥ መዝገብየእያንዳንዱ ስሪት ሙሉ የልቀት ታሪክ
የደህንነት ፖሊሲየተጋላጭነት ሪፖርት አደራረግ እና የደህንነት ልምዶች
የi18n መመሪያየ42 ቋንቋዎች ድጋፍ፣ የትርጉም የሥራ ፍሰት፣ RTL
የልቀት ማረጋገጫ ዝርዝርከልቀት በፊት የሚከናወኑ የማረጋገጫ ደረጃዎች
የሽፋን ዕቅድበ5,100+ ክትትል በሚደረግባቸው የሙከራ ፋይሎች ውስጥ ላሉ 39,000+ የማይለወጡ የሙከራ መግለጫዎች የሙከራ ሽፋን ስትራቴጂ
የi18n መመሪያየ42 ቋንቋዎች ድጋፍ፣ የትርጉም የስራ ፍሰት፣ RTL
የልቀት ማረጋገጫ ዝርዝርከልቀት በፊት የማረጋገጫ ደረጃዎች
የሽፋን ዕቅድበ5,100+ ክትትል በሚደረግባቸው የሙከራ ፋይሎች ውስጥ ለ39,000+ ቋሚ የሙከራ መግለጫዎች የሙከራ ሽፋን ስትራቴጂ

-# ⭐ ከፍተኛ አስተዋጽኦ አድራጊዎች +# ⭐ ከፍተኛ አስተዋጽዖ አድራጊዎች -> OmniRoute በትጋት በሚሳተፍ ክፍት ምንጭ ማህበረሰብ የተቀረጸ ነው። እነዚህ ግለሰቦች በፕሮጀክቱ ጥራት፣ መረጋጋት እና ተደራሽነት ላይ ቀጥተኛ ተጽዕኖ ያላቸውን ልዩ አስተዋጽኦዎች አድርገዋል። **እናመሰግናለን።** +> OmniRoute በጋለ ስሜት ባለው ክፍት ምንጭ ማህበረሰብ የተቀረጸ ነው። እነዚህ ግለሰቦች በፕሮጀክቱ ጥራት፣ መረጋጋት እና ተደራሽነት ላይ ቀጥተኛ ተፅዕኖ ያላቸውን ልዩ አስተዋጽዖዎች አድርገዋል። **እናመሰግናለን።** -### በተዋሃዱ pull request-ዎች ብዛት የተደረደሩ ውጫዊ አስተዋጽኦ አድራጊዎች +### በተዋሃዱ pull requestዎች የተደረደሩ ውጫዊ አስተዋጽዖ አድራጊዎች - + @@ -1392,7 +1392,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1ም ይዘለዋ
ደረጃአስተዋጽኦ አድራጊየተዋሃዱ PR-ዎች~የተለወጡ መስመሮች
ደረጃአስተዋጽዖ አድራጊየተዋሃዱ PRዎች~የተለወጡ መስመሮች
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-በቀጥታ ባለው release/v3.8.50 የመጨረሻ ነጥብ dafb4ae808 ላይ፣ እስከ 2026-08-24 05:26:03 UTC ባሉ ውህደቶች ተወስኗል። በገጾች የተከፋፈለው የGitHub GraphQL ቆጠራ 5,911 የተዋሃዱ PR-ዎችን ይዟል፤ 2,707 በማከማቻው ባለቤት፣ 179 በDependabot፣ እና 3,025 ውጫዊ PR-ዎች ከ535 የተለያዩ አስተዋጽኦ አድራጊዎች። “የተለወጡ መስመሮች” የGitHub ጭማሪዎችን + ስረዛዎችን ያመለክታል፣ እንዲሁም የመነጩ ፋይሎችን፣ lockfile-ዎችን፣ ካታሎጎችን፣ ትርጉሞችን እና ሰነዶችን ያካትታል፤ ይህ የለውጥ መጠን እንጂ በደራሲ የተጻፉ LOC አይደሉም። በመቁረጫ ነጥቡ ላይ ያሉ እኩል ውጤቶች ተጠብቀዋል። +በቀጥታ ስርጭት ላይ ባለው release/v3.8.50 ጫፍ dafb4ae808፣ እስከ 2026-08-24 05:26:03 UTC ድረስ ባሉ ውህደቶች ላይ የተወሰነ። በገጽ የተከፋፈለው የGitHub GraphQL ቆጠራ 5,911 የተዋሃዱ PRዎችን ይዟል፦ 2,707 በማከማቻው ባለቤት፣ 179 በDependabot እና 3,025 ውጫዊ PRዎች ከ535 የተለያዩ አስተዋጽዖ አድራጊዎች። “የተለወጡ መስመሮች” የGitHub ጭማሪዎችን + ቅነሳዎችን የሚያመለክት ሲሆን የመነጩ ፋይሎችን፣ lockfileዎችን፣ ካታሎጎችን፣ ትርጉሞችን እና ሰነዶችን ያካትታል፤ ይህ የለውጥ መጠን እንጂ በደራሲዎች የተጻፉ LOC አይደሉም። በመቁረጫው ነጥብ ላይ ያሉ እኩል ደረጃዎች ተጠብቀዋል። ### በGitHub የተመደቡ commits @@ -1480,9 +1480,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1ም ይዘለዋ -በ2026-08-24 06:14:31 UTC እንደገና ተረጋግጧል፦ ለrelease/v3.8.50 ነባሪ branch በማከማቻው Contributors API የተዘገቡ በGitHub የተመዘገቡ commits። APIው 525 ማንነቶችን (415 ተጠቃሚዎች፣ 2 bots፣ 108 ስም-አልባ) መልሷል፤ ይህ ሰንጠረዥ ጠባቂውን፣ botsን እና ስም-አልባ ማንነቶችን አያካትትም፣ የውድድር እኩልነቶችንም እንዳሉ ያቆያል። ይህም ከላይ ካለው የተዋሃዱ PRዎች ደረጃ አሰጣጥ እና ከታች ካለው የ639 ሰዎች Git-metadata ቆጠራ ሁለቱም የተለየ ነው። +በ2026-08-24 06:14:31 UTC እንደገና ተረጋግጧል፦ ለrelease/v3.8.50 ነባሪ branch በrepository Contributors API የተዘገቡ በGitHub የተመዘገቡ commits። APIው 525 ማንነቶችን (415 ተጠቃሚዎች፣ 2 bots፣ 108 ስም-አልባ) መልሷል፤ ይህ ሰንጠረዥ maintainerን፣ botsን እና ስም-አልባ ማንነቶችን አያካትትም፣ የውድድር እኩል ውጤቶችንም ይጠብቃል። ይህ ከላይ ካለው የmerged-PR ደረጃ አሰጣጥም ሆነ ከታች ካለው የ639 ሰዎች Git-metadata ቆጠራ የተለየ ነው። -> 🙏 የእነዚህ አስተዋጽዖ አድራጊዎች ባህሪያት፣ የሳንካ ማስተካከያዎች እና የመሠረተ ልማት ማሻሻያዎች OmniRouteን አስተማማኝና በባህሪያት የበለፀገ ከሚያደርጉት ነገሮች **ዋና ክፍል** ናቸው። እያንዳንዱ pull request፣ እያንዳንዱ የሙከራ ጉዳይ እና እያንዳንዱ የi18n ትርጉም ፋይል አስፈላጊ ነው። ክፍት ምንጭ እንደ እነርሱ ባሉ ሰዎች ይገነባል። +> 🙏 የእነዚህ አስተዋጽዖ አበርካቾች ባህሪያት፣ የስህተት ማስተካከያዎች እና የመሠረተ ልማት ማሻሻያዎች OmniRouteን አስተማማኝ እና በባህሪያት የበለፀገ ከሚያደርጉት ነገሮች **ዋና ክፍል** ናቸው። እያንዳንዱ pull request፣ እያንዳንዱ test case እና እያንዳንዱ የi18n ትርጉም ፋይል አስፈላጊ ነው። Open source የሚገነባው እንደእነሱ ባሉ ሰዎች ነው።
diff --git a/docs/i18n/am/SECURITY.md b/docs/i18n/am/SECURITY.md index 9cc5843b280e..910a12c2a81a 100644 --- a/docs/i18n/am/SECURITY.md +++ b/docs/i18n/am/SECURITY.md @@ -220,19 +220,38 @@ docker run -d \ 10. **የ`exec()` / `spawn()` runtime እሴቶችን በ`env` option በኩል ያስተላልፉ** — ውጫዊ pathsን ወይም የማይታመኑ እሴቶችን ወደ shell በሚላኩ scripts ውስጥ በstring-interpolation በፍጹም አያስገቡ። ማጣቀሻ፦ `src/mitm/cert/install.ts::updateNssDatabases`። 11. **በነባሪነት ደህንነታቸው የተጠበቀ ላይብረሪዎችን ይምረጡ** — [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults)ን ይመልከቱ (Helmet.js፣ DOMPurify፣ ssrf-req-filter፣ safe-regex፣ Google Tink)። የራስዎን ከመፍጠርዎ በፊት እነዚህን ይጠቀሙ። -## የአቅርቦት ሰንሰለት ስካነር ግኝቶች (Socket.dev / Snyk / ተመሳሳይ) +## የሶፍትዌር አቅርቦት ሰንሰለት ስካነር ግኝቶች (Socket.dev / Snyk / ተመሳሳይ) -የታተመው `omniroute` npm አርቲፋክት የNext.js `output: "standalone"` ግንባታን በውስጡ ይዟል፤ ይህም ማለት እያንዳንዱ የመስመር ተቆጣጣሪ — በሰነድ የተገለጹ ልዩ መብት ያላቸውን ባህሪያት (MITM፣ Zed import፣ Cloud Sync፣ የተካተተ የአገልግሎት ተቆጣጣሪ) ጨምሮ — በ`.next/server/*.js` ውስጥ ባሉ የተጨመቁ ቁርጥራጮች ውስጥ እንዲካተት ያደርጋል። በግምታዊ ዘዴ የሚሰሩ የአቅርቦት ሰንሰለት ስካነሮች እነዚያን ቁርጥራጮች ከተንኮል አዘል ሶፍትዌር ፊርማዎች ጋር በተደጋጋሚ በስርዓተ-ጥለት ያዛምዳሉ። +> **የወሰን ማስታወሻ፦** በማከማቻው ሥር ያለው `socket.yml`፣ ለታተመው npm አርቲፋክት በSocket.dev ሬጂስትሪ በኩል ከህትመት በኋላ በሚደረገው ቅኝት ውስጥ `projectIgnorePaths`ን ብቻ ይቀርጻል — በCI/PR ውህደት ላይ ተፈጻሚ የሆነ መግቢያ በር አይደለም። በ`.github/workflows` ውስጥ ያለ ምንም የሥራ ፍሰት፣ ምንም የ`package.json` ስክሪፕት፣ እና ምንም የ`Makefile` ዒላማ Socket.devን አይጠራም። -የምንጠቀምበት የስካነር ውቅር በማከማቻው ስር በሚገኘው [`socket.yml`](socket.yml) ውስጥ ነው (የSocket.dev GitHub App ቅርጸት v2 — ን ይመልከቱ)። ስካነሩ በእውነቱ ወደ ታተሙ ተጠቃሚዎች ስለሚደርሱ የኮድ መንገዶች ብቻ ሪፖርት እንዲያደርግ፣ የማይላኩ ማውጫዎችን (`tests/`፣ `_tasks/`፣ `_references/`፣ `_ideia/`፣ `_mono_repo/`፣ `docs/`፣ ወዘተ) በግልጽ ሁኔታ አያካትትም — ስካኑ ራሱ የሚካሄደው ያንን ፋይል በሚያነበው Socket GitHub App ነው፤ በዚህ ማከማቻ ውስጥ ባለ የሥራ ፍሰት አይደለም። +የታተመው `omniroute` npm አርቲፋክት የNext.js `output: "standalone"` +ግንባታን አቅፎ ይዟል፤ ይህም እያንዳንዱ የመንገድ መቆጣጠሪያ — በሰነድ የተገለጹ ልዩ ፈቃድ የሚጠይቁ +ባህሪያትን (MITM፣ Zed import፣ Cloud Sync፣ የተካተተ የአገልግሎት ተቆጣጣሪ) ጨምሮ — በመጨረሻ +በ`.next/server/*.js` ውስጥ ወደሚገኙ የተጨመቁ ቁርጥራጮች ይገባል ማለት ነው። በሂዩሪስቲክ ላይ የተመሠረቱ የሶፍትዌር አቅርቦት ሰንሰለት ስካነሮች +እነዚያን ቁርጥራጮች ከማልዌር ፊርማዎች ጋር በተደጋጋሚ በስርዓተ-ጥለት ያዛምዳሉ። -ለእያንዳንዱ የግኝት ምድብ፣ በግኝት ደረጃ የተዘጋጀ የአስተዳዳሪ ማረጋገጫ እንይዛለን፦ +የምንጠቀመው የስካነር ውቅር በማከማቻው ሥር ባለው +[`socket.yml`](socket.yml) ውስጥ ይገኛል (የSocket.dev GitHub App ቅርጸት v2 — ይመልከቱ +)። ስካነሩ በትክክል ወደታተሙ ተጠቃሚዎች +የሚደርሱ የኮድ መንገዶችን ብቻ እንዲዘግብ፣ ያልተላኩ ማውጫዎችን (`tests/`፣ `_tasks/`፣ `_references/`፣ `_ideia/`፣ +`_mono_repo/`፣ `docs/`፣ ወዘተ) በግልጽ ያገላል — ቅኝቱ ራሱ በዚህ ማከማቻ ውስጥ ባለ +የሥራ ፍሰት ሳይሆን ፋይሉን በሚያነበው Socket +GitHub App ይከናወናል። -- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - የእያንዳንዱ ግኝት ካርታ፦ የምንጭ ፋይል ↔ ምልክት የተደረገበት ቁርጥራጭ ↔ ባህሪ ↔ በv3.8.6 ውስጥ የተተገበረ ማቃለያ። -- በምንጭ ውስጥ ያሉ `SECURITY-AUDITOR-NOTE:` ብሎኮች በእያንዳንዱ ምልክት በተደረገበት የፈንክሽን ነጥብ ወደዚያው ሰነድ ይጠቁማሉ። +ለእያንዳንዱ የግኝት ምድብ፣ በግኝት ደረጃ የተዘጋጀ የጥገና ኃላፊ ማረጋገጫ እናቆያለን፦ -የሥራ ፍሰታቸው ማንቂያውን ማላላት ለማይችል ተጠቃሚዎች፦ በ`OMNIROUTE_BUILD_PROFILE=minimal npm run build` ይገንቡ። ይህ አራቱን ስሱ ሞጁሎች በአሂድ ጊዜ HTTP 503 `feature-disabled` በሚመልሱ ተተኪዎች ይቀይራቸዋል፤ በዚህም ልዩ መብት ያላቸው የኮድ መንገዶች በቁልፉ ውስጥ በአካል እንዳይኖሩ ያደርጋል። ለህትመት አሰራሩ [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)ን ይመልከቱ። +- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — + የእያንዳንዱ ግኝት ካርታ፦ ምንጭ ፋይል ↔ ምልክት የተደረገበት ቁርጥራጭ ↔ ባህሪ ↔ በv3.8.6 ውስጥ + የተተገበረ የአደጋ ቅነሳ። +- በምንጭ ኮዱ ውስጥ በእያንዳንዱ ምልክት በተደረገበት ፈንክሽን ላይ ያሉ `SECURITY-AUDITOR-NOTE:` ብሎኮች + ወደዚያው ሰነድ ይጠቁማሉ። + +የሥራ ፍሰታቸው ማንቂያውን ማላላት ለማይችል ተጠቃሚዎች፦ +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`ን በመጠቀም ይገንቡ። ይህም አራቱን +ስሱ ሞጁሎች በአሂድ ጊዜ HTTP 503 `feature-disabled`ን በሚመልሱ +ተተኪዎች ይተካቸዋል፤ በዚህም ልዩ ፈቃድ የሚጠይቁ የኮድ መንገዶች በቁሳዊ ሁኔታ ከጥቅሉ ውስጥ አይኖሩም። +የህትመት አሠራሩን ለማየት [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)ን +ይመልከቱ። ## ማጣቀሻዎች diff --git a/docs/i18n/am/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/am/docs/architecture/CODEBASE_DOCUMENTATION.md index c5ec264be7fa..62716a6c651a 100644 --- a/docs/i18n/am/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/am/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -433,64 +433,64 @@ server/ --- -## 4. `open-sse/` — የስትሪሚንግ ሞተር የሥራ ቦታ +## 4. `open-sse/` — የዥረት ማስኬጃ የሥራ ቦታ -እንደ `@omniroute/open-sse` የሚታተም የተለየ npm የሥራ ቦታ። የጥያቄ ሂደትን፣ -አስፈጻሚዎችን፣ ተርጓሚዎችን፣ አገልግሎቶችን፣ ቀያሪውን እና MCP አገልጋዩን ይይዛል። +እንደ `@omniroute/open-sse` የሚታተም የተለየ npm የሥራ ቦታ። የጥያቄ +ማስኬድን፣ አስፈጻሚዎችን፣ ተርጓሚዎችን፣ አገልግሎቶችን፣ ቀያሪውን እና MCP አገልጋዩን ይይዛል። ``` open-sse/ -├── index.ts ይፋዊ ወደ ውጭ የሚላኩ አካላት -├── package.json የሥራ ቦታ መግለጫ +├── index.ts ይፋዊ ወደ ውጭ ማጋለጫዎች +├── package.json የሥራ ቦታ ማኒፌስት ├── tsconfig.json ├── types.d.ts ├── config/ የአቅራቢ መዝገቦች፣ የራስጌ መገለጫዎች፣ ማንነት፣ … -├── handlers/ የጥያቄ አስተናጋጆች (ውይይት፣ ኢምቤዲንጎች፣ ድምፅ፣ ምስል፣ …) -├── executors/ 108 ለአቅራቢ የተለዩ HTTP አስፈጻሚዎች -├── translator/ የቅርጸት ልወጣ (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Responses API ↔ Chat Completions የስትሪም ቀያሪ -├── services/ 80+ የአገልግሎት ሞጁሎች (ጥምረቶች፣ ተተኪ፣ ኮታዎች፣ ማንነት፣ …) -├── utils/ የስትሪሚንግ ረዳቶች፣ TLS ደንበኛ፣ AWS SigV4፣ የፕሮክሲ ሰርስሮ ማምጣት፣ … +├── handlers/ የጥያቄ ተቆጣጣሪዎች (ውይይት፣ ኢምቤዲንጎች፣ ድምፅ፣ ምስል፣ …) +├── executors/ 108 ለአቅራቢዎች የተለዩ HTTP አስፈጻሚዎች +├── translator/ የቅርጸት መቀየር (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) +├── transformer/ Responses API ↔ Chat Completions የዥረት ቀያሪ +├── services/ 80+ የአገልግሎት ሞጁሎች (ጥምረቶች፣ ተተኪ አማራጭ፣ ኮታዎች፣ ማንነት፣ …) +├── utils/ የዥረት ረዳቶች፣ TLS ደንበኛ፣ AWS SigV4፣ የፕሮክሲ ሰርስሮ ማምጣት፣ … └── mcp-server/ MCP አገልጋይ (3 ማጓጓዣዎች፣ 33 ወሰኖች፣ 110 መሣሪያዎች) ``` ### 4.1 `open-sse/handlers/` -| አስተናጋጅ | ዓላማ | -| ----------------------- | ----------------------------------------------------------- | -| `chatCore.ts` | ዋናው የውይይት ፓይፕላይን (መሸጎጫ፣ የፍጥነት ገደብ፣ የጥምረት ማዘዋወር፣ የአስፈጻሚ መላክ) | -| `responsesHandler.ts` | የOpenAI Responses API መግቢያ ነጥብ | -| `embeddings.ts` | ኢምቤዲንጎች | -| `imageGeneration.ts` | ምስል ማመንጨት | -| `audioSpeech.ts` | ጽሑፍን ወደ ንግግር መቀየር | -| `audioTranscription.ts` | ንግግርን ወደ ጽሑፍ መቀየር | -| `videoGeneration.ts` | ቪዲዮ ማመንጨት | -| `musicGeneration.ts` | ሙዚቃ ማመንጨት | -| `rerank.ts` | ዳግም ደረጃ መስጠት | -| `moderations.ts` | የይዘት ቁጥጥር | -| `search.ts` | የድር ፍለጋ | -| `sseParser.ts` | የSSE ክስተት ተንታኝ | -| `usageExtractor.ts` | ከላይኛው የስትሪም ፍሰቶች የቶከን ብዛቶችን ማውጣት | -| `responseSanitizer.ts` | ለአቅራቢ የተለዩ አላስፈላጊ መረጃዎችን ማስወገድ | -| `responseTranslator.ts` | በአቅራቢው ምላሽ እና በትርጉም ንብርብሩ መካከል ያለ ማገናኛ | +| ተቆጣጣሪ | ዓላማ | +| ----------------------- | -------------------------------------------------------------- | +| `chatCore.ts` | ዋና የውይይት የማስኬጃ መስመር (መሸጎጫ፣ የፍጥነት ገደብ፣ የጥምረት ማዘዋወር፣ የአስፈጻሚ መላክ) | +| `responsesHandler.ts` | የOpenAI Responses API መግቢያ ነጥብ | +| `embeddings.ts` | ኢምቤዲንጎች | +| `imageGeneration.ts` | ምስል ማመንጨት | +| `audioSpeech.ts` | ጽሑፍን ወደ ንግግር መቀየር | +| `audioTranscription.ts` | ንግግርን ወደ ጽሑፍ መቀየር | +| `videoGeneration.ts` | ቪዲዮ ማመንጨት | +| `musicGeneration.ts` | ሙዚቃ ማመንጨት | +| `rerank.ts` | ዳግም ደረጃ ማውጣት | +| `moderations.ts` | የይዘት ቁጥጥር | +| `search.ts` | የድር ፍለጋ | +| `sseParser.ts` | የSSE ክስተት ተንታኝ | +| `usageExtractor.ts` | ከላይኛው ምንጭ ዥረቶች የቶከን ብዛቶችን ማውጣት | +| `responseSanitizer.ts` | ለአቅራቢው የተለየ አላስፈላጊ ይዘትን ማስወገድ | +| `responseTranslator.ts` | በአቅራቢው ምላሽ እና በትርጉም ንብርብሩ መካከል ያለ አገናኝ | ### 4.2 `open-sse/executors/` -108 የአቅራቢ አስፈጻሚዎች፤ እያንዳንዳቸው `BaseExecutor` (`base.ts`)ን ያራዝማሉ፦ +108 የአቅራቢ አስፈጻሚዎች፣ እያንዳንዳቸው `BaseExecutor` (`base.ts`)ን ያስፋፋሉ፦ `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, -`pollinations`, `qoder`, `vertex`, `devin-desktop`፣ እንዲሁም `claudeIdentity.ts` +`pollinations`, `qoder`, `vertex`, `devin-desktop`፣ በተጨማሪም `claudeIdentity.ts` (የጋራ የማንነት ረዳት) እና `index.ts` (መዝገብ)። -> ማስታወሻ፦ እዚህ ያልተዘረዘሩ አቅራቢዎች አጠቃላይ -> ከOpenAI ጋር ተኳሃኝ የሆነውን አስፈጻሚ በመጠቀም በ`default.ts` ይቀርባሉ። ሙሉው የአቅራቢዎች ካታሎግ (355 አቅራቢዎች) -> በ`src/shared/constants/providers.ts` ውስጥ ይገኛል። +> ማስታወሻ፦ እዚህ ያልተዘረዘሩ አቅራቢዎች አጠቃላዩን +> ከOpenAI ጋር ተኳሃኝ የሆነ አስፈጻሚ በመጠቀም በ`default.ts` ይቀርባሉ። ሙሉው የአቅራቢዎች ካታሎግ (355 አቅራቢዎች) በ +> `src/shared/constants/providers.ts` ውስጥ ይገኛል። ### 4.3 `open-sse/translator/` -የማዕከል-እና-ቅርንጫፍ ትርጉም (OpenAI ማዕከሉ ነው)። +ማዕከል-እና-ቅርንጫፍ ትርጉም (OpenAI ማዕከሉ ነው)። - **9 የጥያቄ ተርጓሚዎች** (`translator/request/`)፦ `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -502,7 +502,7 @@ open-sse/ `openai-to-claude`. - **9 ረዳቶች** (`translator/helpers/`)፦ `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, - `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`፣ እንዲሁም + `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`፣ በተጨማሪም የረዳት ሙከራዎች። - **የምስል ረዳቶች** (`translator/image/sizeMapper.ts`)። - ከፍተኛ ደረጃ፦ `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. @@ -510,59 +510,59 @@ open-sse/ ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — በ`TransformStream` ላይ የተመሠረተ Responses API ↔ Chat - Completions ቀያሪ (በ`responses/` መስመር ሁሉን-አቀፍ መያዣ ጥቅም ላይ ይውላል)። + Completions ቀያሪ (በ`responses/` መስመር ሁሉን-አካታች ተቆጣጣሪ የሚጠቀምበት)። ### 4.5 `open-sse/services/` ዋና ዋና ክፍሎች (ሙሉው ዝርዝር በ`open-sse/services/` ስር ይገኛል)፦ -| ጉዳይ | ፋይሎች | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| የCombo ማዘዋወር | `combo.ts` (19 ስልቶች)፣ `comboConfig.ts`፣ `comboMetrics.ts`፣ `comboManifestMetrics.ts`፣ `comboAgentMiddleware.ts` | -| ራስ-ሰር Combo ሞተር | `autoCombo/` — `engine.ts`፣ `scoring.ts`፣ `taskFitness.ts`፣ `virtualFactory.ts`፣ `modePacks.ts`፣ `autoPrefix.ts`፣ `persistence.ts`፣ `providerDiversity.ts`፣ `providerRegistryAccessor.ts`፣ `routerStrategy.ts`፣ `selfHealing.ts`፣ `index.ts` | -| የመቋቋም አቅም | `accountFallback.ts` (የማቀዝቀዣ ጊዜ + መቆለፍ)፣ `errorClassifier.ts`፣ `requestRejectedStreak.ts`፣ `emergencyFallback.ts`፣ `rateLimitManager.ts`፣ `rateLimitSemaphore.ts`፣ `accountSemaphore.ts`፣ `accountSelector.ts` | -| ኮታዎች | `quotaMonitor.ts`፣ `quotaPreflight.ts`፣ `bailianQuotaFetcher.ts`፣ `codexQuotaFetcher.ts`፣ `deepseekQuotaFetcher.ts`፣ `openrouterQuotaFetcher.ts`፣ `openrouterFreeWindow.ts`፣ `crofUsageFetcher.ts`፣ `antigravityCredits.ts` | -| መሸጎጥ | `reasoningCache.ts`፣ `searchCache.ts`፣ `signatureCache.ts`፣ `requestDedup.ts` | -| የማዘዋወር ብልህነት | `intentClassifier.ts`፣ `taskAwareRouter.ts`፣ `backgroundTaskDetector.ts`፣ `volumeDetector.ts`፣ `wildcardRouter.ts`፣ `workflowFSM.ts`፣ `specificityDetector.ts`፣ `specificityRules.ts`፣ `specificityTypes.ts` | -| የሞዴል አስተዳደር | `modelCapabilities.ts`፣ `modelDeprecation.ts`፣ `modelFamilyFallback.ts`፣ `modelStrip.ts`፣ `model.ts`፣ `provider.ts`፣ `providerRequestDefaults.ts`፣ `providerCostData.ts`፣ `payloadRules.ts` | -| ማመቅ | `compression/` — የተሟላ የማመቂያ ሞተር ሽቦ-አገናኝ | -| ቶከን + ክፍለ-ጊዜ | `tokenRefresh.ts`፣ `sessionManager.ts`፣ `apiKeyRotator.ts`፣ `contextManager.ts`፣ `contextHandoff.ts`፣ `systemPrompt.ts`፣ `roleNormalizer.ts`፣ `responsesInputSanitizer.ts`፣ `toolSchemaSanitizer.ts`፣ `toolLimitDetector.ts`፣ `thinkingBudget.ts` | -| ደረጃ / ማኒፌስት | `tierResolver.ts`፣ `tierConfig.ts`፣ `tierDefaults.json`፣ `tierTypes.ts`፣ `manifestAdapter.ts` | -| IP / አውታረ መረብ | `ipFilter.ts`፣ `webSearchFallback.ts` | -| ባችዎች | `batchProcessor.ts` | -| አጠቃቀም | `usage.ts` | +| ጉዳይ | ፋይሎች | +| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Combo ማዘዋወር | `combo.ts` (19 ስልቶች), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Auto Combo ሞተር | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| ጽናት | `accountFallback.ts` (የማቀዝቀዣ ጊዜ + መቆለፍ), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| ኮታዎች | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| መሸጎጫ | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| የማዘዋወር ብልህነት | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| የሞዴል አያያዝ | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| መጭመቅ | `compression/` — የተሟላ የመጭመቂያ ሞተር ማገናኛ | +| ቶከን + ክፍለ ጊዜ | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| ደረጃ / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / አውታረ መረብ | `ipFilter.ts`, `webSearchFallback.ts` | +| ባችዎች | `batchProcessor.ts` | +| አጠቃቀም | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 ልዩ መሣሪያዎች** በ`server.ts` ውስጥ ተገናኝተዋል (`schemas/tools.ts` ውስጥ 45 መደበኛ መሣሪያዎች + - የማህደረ ትውስታ፣ ክህሎቶች፣ GitHub-ክህሎቶች፣ ፑል፣ ጌሚፊኬሽን፣ ተሰኪ፣ Notion፣ Obsidian፣ - የአካባቢያዊ-ኮርፐስ እና የማመቂያ ሞጁሎች — ውህዱ በ`countUniqueMcpTools` ተቆጥሯል)። +- **110 ልዩ መሣሪያዎች** በ`server.ts` ውስጥ ተገናኝተዋል (45 መደበኛ መሣሪያዎች በ`schemas/tools.ts` + + የማስታወሻ፣ ክህሎቶች፣ GitHub-skills፣ ጥምር፣ gamification፣ plugin፣ Notion፣ Obsidian፣ + local-corpus እና compression ሞጁሎች — ድምሩ በ`countUniqueMcpTools` የተቆጠረ)። - **3 ማጓጓዣዎች**፦ stdio፣ HTTP Streamable፣ SSE። -- **33 ወሰኖች** በአሂድ ጊዜ ይተገበራሉ — መሠረታዊው ዝርዝር በ`src/shared/constants/mcpScopes.ts` ውስጥ ሲሆን፣ ሙሉው ስብስብ በእያንዳንዱ የመሣሪያ ሞጁል የተገለጹት ወሰኖች ውህድ ነው። +- **33 scopes** በአሂድ ጊዜ ተፈጻሚ ይሆናሉ — መሠረታዊ ዝርዝሩ በ`src/shared/constants/mcpScopes.ts` ውስጥ ሲሆን፣ ሙሉው ስብስብ በእያንዳንዱ የመሣሪያ ሞጁል የተገለጹ scopes ድምር ነው። - የኦዲት ሰንጠረዥ፦ `mcp_tool_audit` (በ`audit.ts` የሚሞላ)። -- ፋይሎች፦ `server.ts`፣ `index.ts`፣ `httpTransport.ts`፣ `audit.ts`፣ `scopeEnforcement.ts`፣ - `runtimeHeartbeat.ts`፣ `descriptionCompressor.ts`፣ `schemas/{tools, a2a, audit, index}.ts`፣ - `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`፣ - እንዲሁም በ`__tests__/` ስር ያሉ ሙከራዎች። +- ፋይሎች፦ `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, + `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, + `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, + እንዲሁም በ`__tests__/` ሥር ያሉ ሙከራዎች። - ሙሉውን የመሣሪያ ካታሎግ ለማየት [MCP-SERVER.md](../frameworks/MCP-SERVER.md)ን ይመልከቱ። ### 4.7 `open-sse/config/` -የአቅራቢ መዝገቦች (`providerRegistry.ts`፣ `providerModels.ts`፣ -`providerHeaderProfiles.ts`)፣ በቅርጸት የተከፋፈሉ የሞዴል መዝገቦች (`audioRegistry.ts`፣ -`embeddingRegistry.ts`፣ `imageRegistry.ts`፣ `moderationRegistry.ts`፣ -`musicRegistry.ts`፣ `rerankRegistry.ts`፣ `searchRegistry.ts`፣ `videoRegistry.ts`)፣ -የማንነት አጋዥ መሣሪያዎች (`codexIdentity.ts`፣ `codexInstructions.ts`፣ -`anthropicHeaders.ts`፣ `antigravityUpstream.ts`፣ `antigravityModelAliases.ts`፣ -`cliFingerprints.ts`፣ `toolCloaking.ts`፣ `defaultThinkingSignature.ts`)፣ -የማረጋገጫ መረጃ አጋዥ መሣሪያዎች (`credentialLoader.ts`፣ `codexClient.ts`)፣ እና የደመና -አስማሚዎች (`azureAi.ts`፣ `bedrock.ts`፣ `datarobot.ts`፣ `glmProvider.ts`፣ -`maritalk.ts`፣ `oci.ts`፣ `petals.ts`፣ `runway.ts`፣ `sap.ts`፣ `watsonx.ts`፣ -`ollamaModels.ts`፣ `errorConfig.ts`፣ `constants.ts`፣ `registryUtils.ts`)። +የአቅራቢ መዝገቦች (`providerRegistry.ts`, `providerModels.ts`, +`providerHeaderProfiles.ts`)፣ በእያንዳንዱ ቅርጸት የሞዴል መዝገቦች (`audioRegistry.ts`, +`embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, +`musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`)፣ +የማንነት ረዳቶች (`codexIdentity.ts`, `codexInstructions.ts`, +`anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, +`cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`)፣ +የማረጋገጫ መረጃ ረዳቶች (`credentialLoader.ts`, `codexClient.ts`) እና የደመና +አስማሚዎች (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, +`maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, +`ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`)። ### 4.8 `open-sse/utils/` -የዥረት መሠረታዊ አካላት እና የአቅራቢ ረዳቶች፦ `stream.ts`፣ `streamHandler.ts`፣ +የዥረት መሠረታዊ ክፍሎች እና የአቅራቢ ረዳቶች፦ `stream.ts`፣ `streamHandler.ts`፣ `streamHelpers.ts`፣ `streamPayloadCollector.ts`፣ `streamReadiness.ts`፣ `sseHeartbeat.ts`፣ `proxyFetch.ts`፣ `proxyDispatcher.ts`፣ `tlsClient.ts`፣ `networkProxy.ts`፣ `awsSigV4.ts`፣ `cacheControlPolicy.ts`፣ @@ -655,7 +655,7 @@ bin/ ## 8. `scripts/` -እንደ ዓላማቸው በ6 ንዑስ አቃፊዎች የተደራጁ ናቸው። +በዓላማቸው መሠረት በ6 ንዑስ አቃፊዎች ተደራጅተዋል። - **`scripts/build/`** — `build-next-isolated.mjs`, `prepublish.ts`, `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, diff --git a/docs/i18n/am/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/am/docs/architecture/RESILIENCE_GUIDE.md index 6d5393de99dc..e3b93f8ae921 100644 --- a/docs/i18n/am/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/am/docs/architecture/RESILIENCE_GUIDE.md @@ -71,92 +71,137 @@ OmniRoute ሦስት የተለያዩ ግን ተዛማጅ የመቋቋም ዘዴ **ወሰን:** አንድ የአቅራቢ ግንኙነት/መለያ/ቁልፍ። -**ዓላማ:** ሌሎች የዚያው አቅራቢ ግንኙነቶች አገልግሎት መስጠታቸውን ሲቀጥሉ አንድ ችግር ያለበትን ቁልፍ ማለፍ። +**ዓላማ:** ለተመሳሳይ አቅራቢ ያሉ ሌሎች ግንኙነቶች አገልግሎት መስጠታቸውን እንዲቀጥሉ አንድ ችግር ያለበትን ቁልፍ መዝለል። **አተገባበር:** -- እንደማይገኝ ምልክት ማድረግ: `src/sse/services/auth.ts::markAccountUnavailable()` -- ምርጫ: በዚያው ፋይል ውስጥ `getProviderCredentials*` -- የማቀዝቀዣ ጊዜ ስሌት: `open-sse/services/accountFallback.ts::checkFallbackError()` -- ቅንብሮች: `src/lib/resilience/settings.ts` +- እንደማይገኝ ምልክት ማድረግ፦ `src/sse/services/auth.ts::markAccountUnavailable()` +- ምርጫ፦ በተመሳሳይ ፋይል ውስጥ `getProviderCredentials*` +- የማቀዝቀዣ ጊዜ ስሌት፦ `open-sse/services/accountFallback.ts::checkFallbackError()` +- ቅንብሮች፦ `src/lib/resilience/settings.ts` -**በእያንዳንዱ ግንኙነት የሚኖሩ መስኮች:** +**በእያንዳንዱ ግንኙነት ያሉ መስኮች:** -- `rateLimitedUntil` — የማቀዝቀዣ ጊዜው እስኪያበቃ ያለው የጊዜ ማህተም +- `rateLimitedUntil` — የማቀዝቀዣ ጊዜው እስኪያበቃ ድረስ ያለው የጊዜ ማህተም - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — የኤክስፖነንሻል ማፈግፈግ ቆጣሪ +- `backoffLevel` — ኤክስፖነንሻል የመጠባበቂያ ቆጣሪ **ነባሪ የማቀዝቀዣ ጊዜያት:** -- የOAuth መሠረት: 5s -- የAPI ቁልፍ መሠረት: 3s -- የAPI ቁልፍ 429: ከላይኛው አገልግሎት የሚመጡ `Retry-After`/ዳግም ማስጀመሪያ ራስጌዎችን/ሊተነተን የሚችል የዳግም ማስጀመሪያ ጽሑፍን ይመርጣል -- ማፈግፈግ: `baseCooldownMs * 2 ** failureIndex` +- የOAuth መነሻ፦ 5s +- የAPI-key መነሻ፦ 3s +- API-key 429፦ ከውጫዊው አገልግሎት የሚመጡ `Retry-After`/ዳግም ማስጀመሪያ ራስጌዎችን/ሊተነተን የሚችል የዳግም ማስጀመሪያ ጽሑፍን ይመርጣል +- መጠባበቂያ፦ `baseCooldownMs * 2 ** failureIndex` -**የተመሳሳይ ጊዜ ከፍተኛ ጥያቄ መከላከያ:** በተመሳሳይ ጊዜ የሚከሰቱ ውድቀቶች የማቀዝቀዣ ጊዜውን ከመጠን በላይ እንዳያራዝሙ ወይም `backoffLevel`ን ሁለት ጊዜ እንዳይጨምሩ ይከላከላል። +**የተመሳሳይ ጊዜ ጫና መከላከያ:** በአንድ ጊዜ የሚከሰቱ አለመሳካቶች የማቀዝቀዣ ጊዜውን ከመጠን በላይ እንዳያራዝሙ ወይም `backoffLevel`ን ሁለት ጊዜ እንዳይጨምሩ ይከላከላል። **የመጨረሻ ሁኔታዎች (የማቀዝቀዣ ጊዜያት አይደሉም):** -- `banned` — በታገደ ቁልፍ ቃል / የመለያ እገዳ ማወቂያ ([BAN_DETECTION](../security/BAN_DETECTION.md)ን ይመልከቱ)፣ እንዲሁም በአንድ ጥያቄ ደረጃ ከላይኛው አገልግሎት በተከታታይ በሚደርሱ ሦስት እምቢታዎች (`request_rejected`፣ ለምሳሌ Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`) ይቀናበራል፤ አንድ እምቢታ ብቻ ግንኙነቱን ለማቀዝቀዣ ጊዜ ብቻ ያስገባዋል -- `expired` (ከተወሰኑ ዳግም ሙከራዎች በኋላ ወደ መጨረሻ ሁኔታ ይሸጋገራል — ከኤክስፖነንሻል ማፈግፈግ ጋር `EXPIRED_RETRY_MAX = 3` — ስለዚህ ጊዜያዊ የOAuth ስህተቶች መለያው ለዘለቄታው ከመሰናከሉ በፊት ራሳቸውን ማስተካከል ይችላሉ) +- `banned` — የታገደ ቁልፍ ቃል / የመለያ እገዳ ሲገኝ ይዘጋጃል ([BAN_DETECTION](../security/BAN_DETECTION.md)ን ይመልከቱ)፤ እንዲሁም በሦስት ተከታታይ ከውጫዊው አገልግሎት በእያንዳንዱ ጥያቄ ላይ በሚደርሱ እምቢታዎች (`request_rejected`፣ ለምሳሌ Anthropic OAuth 403 "ጥያቄው አልተፈቀደም" — `open-sse/services/requestRejectedStreak.ts`)፤ አንድ እምቢታ ብቻ ግንኙነቱን ለማቀዝቀዣ ጊዜ ብቻ ያስገባል +- `expired` (ከተወሰነ የድጋሚ ሙከራ ብዛት በኋላ ወደ የመጨረሻ ሁኔታ ይሸጋገራል — `EXPIRED_RETRY_MAX = 3` ከኤክስፖነንሻል መጠባበቂያ ጋር — ስለዚህ ጊዜያዊ የOAuth ስህተቶች መለያው በቋሚነት ከመሰናከሉ በፊት ራሳቸውን ማስተካከል ይችላሉ) - `credits_exhausted` -እነዚህ የማረጋገጫ መረጃዎች እስኪቀየሩ ወይም ኦፕሬተር ዳግም እስኪያስጀምራቸው ድረስ ይቆያሉ። የመጨረሻ ሁኔታዎችን በጊዜያዊ የማቀዝቀዣ ሁኔታ አይተኩ። +እነዚህ የመግቢያ ማረጋገጫዎቹ እስኪለወጡ ወይም ኦፕሬተር ዳግም እስኪያስጀምራቸው ድረስ ይቆያሉ። የመጨረሻ ሁኔታዎችን በጊዜያዊ የማቀዝቀዣ ሁኔታ አይተኩ። -**ሰነፍ መልሶ ማግኛ:** `rateLimitedUntil` ካለፈ በኋላ ግንኙነቱ እንደገና ለምርጫ ብቁ ይሆናል። በተሳካ ሁኔታ ጥቅም ላይ ሲውል `clearAccountError()` ሁሉንም የስህተት መስኮች ያጸዳል። +**ሰነፍ ማገገም:** `rateLimitedUntil` ካለፈ በኋላ ግንኙነቱ እንደገና ለምርጫ ብቁ ይሆናል። በተሳካ ሁኔታ ሥራ ላይ ሲውል `clearAccountError()` ሁሉንም የስህተት መስኮች ያጸዳል። -### የክፍለ ጊዜ ትስስር (#7274) +### የClaude OAuth የአጠቃቀም ገደብ፦ ዝቅተኛ ቅድሚያ መስመር + የክፍለ ጊዜ ገደብ ዳግም ማስጀመር -**ወሰን:** አንድ የደንበኛ ክፍለ ጊዜ (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` ራስጌ) ለ**ማንኛውም** አቅራቢ ከአንድ ግንኙነት ጋር ይያያዛል። - -**ዓላማ:** ባለብዙ-ዙር ወኪልን (Claude Code፣ aider፣ ብጁ ወኪሎች) በተለያዩ ጥያቄዎች ላይ በተመሳሳዩ መለያ እንዲቆይ ማድረግ፤ ይህም በመለያዎች መካከል የአውድ መጥፋትን እና በእያንዳንዱ መለያ የክፍለ ጊዜ ሁኔታ ባላቸው አቅራቢዎች ላይ ተደጋጋሚ የመጀመሪያ ማስጀመሪያ 429ዎችን ይቀንሳል። +**ወሰን:** አንድ የClaude የደንበኝነት ምዝገባ (OAuth) ግንኙነት። ሁለቱም ባህሪያት **በእያንዳንዱ ግንኙነት በፈቃድ የሚነቁ** +ናቸው (ግንኙነትን አርትዕ → Claude ክፍል → በ`providerSpecificData` ውስጥ `lowPriorityMode` / `autoLimitReset`፣ +ሁለቱም በነባሪ ጠፍተዋል) እና የClaude Code `/low-priority` እና +`/limit-reset` ትዕዛዞችን ያንጸባርቃሉ (የግንኙነት ውሉ ከClaude Code 2.1.263 የተመዘገበ ነው)። **አተገባበር:** -- የTTL ውሳኔ: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- የማያያዣ ምርጫ/ፈጠራ: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- የራስጌ ማውጣት (አጠቃላይ፣ ለማንኛውም አቅራቢ): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- ቋሚ የማያያዣ ሰንጠረዥ: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- ቅንብር: `sessionAffinityTtlMs` (በms የሚለካ ዓለም አቀፍ TTL፣ `0` ያሰናክለዋል) — `src/lib/db/settings.ts`። ከCodex-ብቻ `codexSessionAffinityTtlMs` በፍልሰት `124_generic_session_affinity_ttl.sql` ስሙ ተቀይሯል፤ ይህም ከዚህ በፊት የተዋቀረውን ማንኛውንም የCodex TTL እንደ አዲሱ ነባሪ ያስተላልፋል። +- የሁኔታ ማሽን + የምላሽ ምደባ፦ `open-sse/services/claudeLowPriority.ts` +- የዳግም ማስጀመሪያ ሁኔታ/ጥያቄ ደንበኛ፦ `open-sse/services/claudeLimitReset.ts` +- የአስፈጻሚ ማያያዣ (ራስጌ ማስገባት + በተመሳሳይ መለያ ዳግም መሞከር)፦ `open-sse/executors/base.ts::execute()` +- የፈቃድ ማንቃት ቋሚ ማከማቻ፦ `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**ቀስቃሽ:** የ5-ሰዓት የአጠቃቀም ገደብ — ራስጌዎቹ +`anthropic-ratelimit-unified-status: rejected`ን የያዙ እና፣ መለያው ብቁ ሲሆን፣ +`anthropic-ratelimit-unified-slow-offer: treatment`ን የያዙ `429`። ያ የመጀመሪያ የገደብ +429 ከመድረሱ በፊት ምንም ነገር አይላክም፤ ወጥ የሆኑ ራስጌዎች የሌሉት ድንገተኛ 429 በመደበኛው የማቀዝቀዣ መንገድ ያልፋል። + +**ዝቅተኛ ቅድሚያ መስመር** (`lowPriorityMode`): + +- የገደብ 429 ሲከሰት አስፈጻሚው ቅናሹን ተቀብሎ `anthropic-usage-limit: slow`ን በመጠቀም **ተመሳሳዩን** + መለያ ወዲያውኑ እንደገና ይሞክራል፤ መስመሩ እስከታወጀው + `anthropic-ratelimit-unified-reset` (+60s የእፎይታ ጊዜ) ድረስ ንቁ ሆኖ ይቆያል፣ እና በዚያ መስኮት ውስጥ ያለ እያንዳንዱ ጥያቄ + ራስጌውን ይይዛል። የተያዘው 429 በፍጹም `handleChatCore` ላይ አይደርስም፣ ስለዚህ ግንኙነቱ + ወደ ማቀዝቀዣ ጊዜ **አይገባም** እና ወደ ሌላ አይቀየርም። +- በኋላ በሚመጡ ምላሾች ላይ `anthropic-ratelimit-unified-slow-status`፦ `active` / `not_needed` + መስመሩን ያስቀጥላሉ፤ `slot_busy` (429) ወይም `529` በአገልጋዩ + `anthropic-ratelimit-unified-slow-retry-after` መሠረት ይጠብቃሉ (ነባሪ 20s፣ ገደብ 5–600s፣ ±30% የዘፈቀደ ልዩነት) + እና እንደገና ይሞክራሉ፤ ይህም በ`anthropic-ratelimit-unified-slow-max-wait` የተገደበ ነው (ነባሪ 20 min፣ ገደብ + 1 min–6 h) — ከዚያ በኋላ መስመሩ ያበቃል እና የ10 ደቂቃ የእፎይታ ጊዜ ዳግም መቀበልን ይከለክላል። + የመጠበቂያ ጊዜው በጥያቄው የራሱ የውጫዊ አገልግሎት ማስጀመሪያ ጊዜ ማብቂያ + (`resolveFetchStartTimeout`፣ በነባሪ 10 min) ከ5 s ህዳግ በኋላ በሚቀረው ጊዜም ይገደባል፦ ያለዚህ ገደብ + የ20-ደቂቃው ነባሪ ከፍተኛ መጠበቂያ ጥያቄው ካበቃ በኋላም ይቀጥላል፣ እና እንቅልፉ + በመጠበቅ መካከል ይቋረጣል፤ ይህም ከሰላማዊው `max_wait` መጨረሻ + የእፎይታ ጊዜ ይልቅ `TimeoutError`ን ያሳያል። +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`፣ የ5h-መስኮት መቀየር፣ ወይም + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (የተከፈለበት ትርፍ አጠቃቀም አሁን ገደቡን ስለሚሸፍን፣ + በማንኛውም ሁኔታ እንደ `extra_usage` ያበቃዋል) መስመሩን ያበቃሉ፤ ከዚያም + ምላሹ ወደ መደበኛው የማቀዝቀዣ መንገድ ይፈሳል። `budget_exhausted` እስከታወጀው የበጀት ዳግም ማስጀመሪያ + (≤ 8 days) ድረስ ይታወሳል። +- የገደብ ፍተሻው የሚካሄደው በ400 ከሚነሱት የአስፈጻሚው በሙከራ ውስጥ ያሉ ድጋሚ ሙከራዎች (የአውድ + አርትዖት፣ የአስተሳሰብ/ጥረት ገደቦች፣ የመለኪያ ራስ-ሰር መማር) በኋላ ነው፣ ስለዚህ ከእነዚያ ድጋሚ ሙከራዎች + በአንዱ ላይ ብቻ የሚታይ የገደብ 429 ወደ ማቀዝቀዣ መንገድ ከመድረሱ ይልቅ አሁንም ይያዛል። +- ሁኔታው በእያንዳንዱ ግንኙነት በማህደረ ትውስታ ውስጥ ይገኛል (ዳግም ማስጀመር እንደገና ለመቀበል አንድ ተጨማሪ የገደብ 429 ያስፈልገዋል)። + +**የክፍለ ጊዜ ገደብ ዳግም ማስጀመር** (`autoLimitReset`፣ ሁለቱም ሲነቁ ከመስመሩ በፊት ይሞከራል): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + ብሎክ፤ `arm: "reset"` እና `available: true` ሲሆኑ፣ + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` ከ + `{ "program": "juniper_tide" }` ጋር (የድርጅቱ UUID ከ + `providerSpecificData.organizationUUID`፣ የመነሻ አማራጭ)። +- `result: reset|not_limited` → ጥያቄው በሙሉ ፍጥነት እንደገና ይሞከራል (የዝግታ ራስጌ የለም)። + `already_used` / `not_offered` `next_available_at`ን ያስታውሳሉ (ነባሪ አንድ ሳምንት)፤ ማንኛውም + አለመሳካት ለ15 ደቂቃ መጠባበቂያ ያደርጋል። ዳግም ማስጀመሩ በሳምንት አንድ ጊዜ ሲሆን አሁንም በሳምንታዊ ገደቡ ውስጥ ይቆጠራል። + +የኋሊት ማፈግፈግ መከላከያዎች፦ `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`። + +### የክፍለ ጊዜ ቁርኝት (#7274) + +**ወሰን:** አንድ የደንበኛ ክፍለ ጊዜ (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` ራስጌ) ለ**ማንኛውም** አቅራቢ ወደ አንድ ግንኙነት የተቸከለ። + +**ዓላማ፦** ባለብዙ ዙር ወኪልን (Claude Code, aider, custom agents) በጥያቄዎች መካከል በተመሳሳይ መለያ ላይ ማቆየት፣ በመለያዎች መካከል የአውድ መጥፋትን እና በየመለያው የክፍለ-ጊዜ ሁኔታ ባላቸው አቅራቢዎች ላይ የሚከሰቱ ተደጋጋሚ የቀዝቃዛ-ጅምር 429 ስህተቶችን መቀነስ። + +**አተገባበር፦** -ከ#7274 በፊት፣ `resolveSessionAffinityTtlMs()` ከ`codex` በስተቀር ለሁሉም አቅራቢዎች ወዲያውኑ `0` በመመለስ ይቋረጥ ነበር፤ ስለዚህ የማያያዝ ዘዴው እና የራስጌ ማውጣቱ ቀድሞውኑ ከአቅራቢ ነፃ ቢሆኑም የTTL ቅንብሩ (እና የክፍለ ጊዜ ራስጌዎቹ) በሌላ ቦታ ምንም ተጽዕኖ አልነበራቸውም። ማስተካከያው ያንን ቀደምት መመለስ አስወግዷል፤ TTLው ከላይ በዓለም አቀፍ ደረጃ ከ`0` በላይ ከተቀናበረ በኋላ አሁን ለእያንዳንዱ አቅራቢ በእኩል ይተገበራል። +- የ-TTL መወሰን፦ `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- ፒን መምረጥ/መፍጠር፦ `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- ራስጌን ማውጣት (አጠቃላይ፣ ለማንኛውም አቅራቢ)፦ `src/sse/services/auth.ts::extractSessionAffinityKey()` +- የማይጠፋ የፒን ሰንጠረዥ፦ `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- ቅንብር፦ `sessionAffinityTtlMs` (ዓለም አቀፍ TTL በms፣ `0` ያሰናክላል) — `src/lib/db/settings.ts`። ከCodex ብቻ ከነበረው `codexSessionAffinityTtlMs` በፍልሰት `124_generic_session_affinity_ttl.sql` እንደገና ተሰይሟል፤ ይህም ቀደም ሲል የተዋቀረ ማንኛውንም የCodex TTL እንደ አዲሱ ነባሪ ያስተላልፋል። -ሦስቱ የክፍለ ጊዜ ትስስር ራስጌዎች ወደ ላይኛው አገልግሎት ፈጽሞ አይተላለፉም — አስፈጻሚዎች የደንበኛ ራስጌዎችን በቀጥታ ከማሳለፍ ይልቅ የራሳቸውን የላይኛው አገልግሎት ራስጌዎች ከባዶ ይገነባሉ፤ ስለዚህ ይህ የውስጥ ማዛመጃ id ብቻ ሆኖ ይቆያል። +ከ#7274 በፊት፣ `resolveSessionAffinityTtlMs()` ከ`codex` በስተቀር ለሁሉም አቅራቢዎች ወዲያውኑ `0` በመመለስ ይወጣ ነበር፤ ስለዚህ የፒን ማድረጊያው ስልት እና የራስጌ ማውጣቱ ቀድሞውኑ ከአቅራቢ ነጻ ቢሆኑም፣ የ-TTL ቅንብሩ (እና የክፍለ-ጊዜ ራስጌዎቹ) በሌላ ቦታ ምንም ውጤት አልነበራቸውም። ማስተካከያው ያንን የቀድሞ መውጫ አስወግዷል፤ አሁን TTL በዓለም አቀፍ ደረጃ ከ`0` በላይ ከተቀናበረ በኋላ ለሁሉም አቅራቢዎች በአንድነት ይተገበራል። -### ብቸኛ የሚተዳደሩ የክፍለ ጊዜ ግንኙነት ኪራዮች +ሦስቱ የክፍለ-ጊዜ ቅርርብ ራስጌዎች ወደ ላይኛው አገልግሎት ፈጽሞ አይተላለፉም — አስፈጻሚዎች የደንበኛ ራስጌዎችን እንዳሉ ከማስተላለፍ ይልቅ የራሳቸውን የላይኛው አገልግሎት ራስጌዎች ከባዶ ይገነባሉ፤ ስለዚህ ይህ የውስጥ ተዛማጅነት መለያ ብቻ ሆኖ ይቆያል። -**ወሰን:** አንድ ንቁ የሚተዳደር HTTP ደንበኛ/ክፍለ ጊዜ አንድ ብቁ የOmniRoute ግንኙነት ይይዛል። +### ልዩ የሚተዳደሩ የክፍለ-ጊዜ ግንኙነት ኪራዮች -**ዓላማ:** በተለያዩ ጥያቄዎች መካከል ጥብቅ የማዞሪያ -ድንበር ለሚያስፈልጋቸው ደንበኞች ዘላቂ ብቸኛ የግንኙነት ባለቤትነትን መስጠት። ይህ ለስላሳ የቀጣይነት ምርጫ ከሆነው የክፍለ ጊዜ ትስስር ይለያል፦ -ብቸኛ ኪራይ የሕይወት ዑደት ሁኔታን በSQLite ውስጥ በቋሚነት ያስቀምጣል፣ ዓለም አቀፋዊ የንቁ-ባለቤት እና -የንቁ-ግንኙነት ልዩነትን ያስገድዳል፣ እና ወደ አቅራቢው ከመላኩ በፊት ጊዜ ያለፈበትን ትውልድ ውድቅ ያደርጋል። +**ወሰን፦** አንድ ንቁ የሚተዳደር HTTP ደንበኛ/ክፍለ-ጊዜ አንድ ብቁ የOmniRoute ግንኙነትን ይይዛል። -ባህሪው ለእያንዳንዱ API ቁልፍ በምርጫ የሚነቃ ነው። የሚተዳደር ቁልፍ `lease:exclusive` ወሰን እና -በግልጽ የተቀመጠ ባዶ ያልሆነ `allowedConnections` ዝርዝር ሊኖረው ይገባል። ማንኛውም HTTP ደንበኛ የሕይወት ዑደት መጨረሻ ነጥቡን መጠቀም ይችላል፤ -የደንበኛ ስም፣ የተጠቃሚ ወኪል፣ አቅራቢ፣ የOAuth ዘዴ ወይም ሞዴል አያስፈልግም። ኪራዩ የሚይዘው ግንኙነት እንጂ -ሞዴል አይደለም፤ ስለዚህ ግንኙነቱ በመደበኛነት ብቁ ሆኖ እስከቆየ ድረስ የሞዴል ለውጥ ትስስሩን ይዞ ይቆያል። -መደበኛ የሞዴል፣ የኮታ፣ የጤና፣ የማቀዝቀዣ ጊዜ እና የፈቃድ ዝርዝር ደንቦች ወሳኝ ሆነው ይቀጥላሉ፣ እና -ተመሳሳዩን ትውልድ ወደ ሌላ ነፃ ብቁ ግንኙነት ሊያሸጋግሩ ይችላሉ። +**ዓላማ፦** በጥያቄዎች መካከል ጥብቅ የማስተላለፊያ ወሰን ለሚያስፈልጋቸው ደንበኞች ዘላቂ እና ልዩ የግንኙነት ባለቤትነትን ማቅረብ። ይህ ለስላሳ የቀጣይነት ምርጫ ከሆነው የክፍለ-ጊዜ ቅርርብ የተለየ ነው፦ +ልዩ ኪራይ የሕይወት ዑደት ሁኔታን በSQLite ውስጥ በዘላቂነት ያከማቻል፣ የዓለም አቀፍ ንቁ-ባለቤትና +ንቁ-ግንኙነት ልዩነትን ያስገድዳል፣ እና ወደ አቅራቢው ከመላኩ በፊት ጊዜ ያለፈበትን ትውልድ ውድቅ ያደርጋል። -የሕይወት ዑደቱ `POST /api/v1/session-leases` ሲሆን የJSON ድርጊቶቹ `acquire`፣ `renew` እና `release` ናቸው። -የሚተዳደሩ የግምት ጥያቄዎች ግልጽ ያልሆነውን `X-OmniRoute-Lease-Owner` እሴት እና ትክክለኛውን -`X-OmniRoute-Lease-Generation` ያቀርባሉ። ባለቤቱ `vlo_`ን በ43 base64url ቁምፊዎች ያስከትላል፤ -የሚቀመጠው የእሱ SHA-256 ሃሽ ብቻ ነው። እያንዳንዱ የመጨረሻ የመላኪያ ድንበር የተረጋገጠውን የAPI ቁልፍ ID እና -የንቁ ግንኙነት IDንም ያስተሳስራል። የኪራይ መቆጣጠሪያ ራስጌዎች ከምዝግቦች፣ ተጠብቀው ከሚቆዩ የጥያቄ ቅጽበተ-ምስሎች እና -ከላይኛው አገልግሎት አስፈጻሚ ራስጌዎች ይወገዳሉ። +ባህሪው ለእያንዳንዱ API ቁልፍ በምርጫ የሚነቃ ነው። የሚተዳደር ቁልፍ የ`lease:exclusive` ወሰን እና በግልጽ የተገለጸ ባዶ ያልሆነ የ`allowedConnections` ዝርዝር ሊኖረው ይገባል። ማንኛውም HTTP ደንበኛ የሕይወት ዑደት መጨረሻ ነጥቡን መጠቀም ይችላል፤ የደንበኛ ስም፣ user-agent፣ አቅራቢ፣ OAuth ዘዴ ወይም ሞዴል አያስፈልግም። ኪራዩ የግንኙነት እንጂ የሞዴል ባለቤት አይደለም፤ ስለዚህ ግንኙነቱ በተለመደው ሁኔታ ብቁ ሆኖ እስከቆየ ድረስ የሞዴል ለውጥ ትስስሩን ይዞ ይቆያል። የተለመዱ የሞዴል፣ የኮታ፣ የጤና፣ የማቀዝቀዣ ጊዜ እና የፈቃድ ዝርዝር ደንቦች አሁንም ዋና ስልጣን ያላቸው ሲሆን፣ ተመሳሳዩን ትውልድ ወደ ሌላ ነጻ እና ብቁ ግንኙነት ሊያሸጋግሩት ይችላሉ። -መደበኛ ማዞሪያ ብቁ የሚተዳደሩ እጩዎች ካሉት፣ ነገር ግን እያንዳንዱ ነፃ እጩ በሌላ -ንቁ ኪራይ የተያዘ ከሆነ፣ OmniRoute HTTP `429`፣ lease-capacity-unavailable ኮድ፣ -አቅምን-የመጠበቅ ሁኔታ እና በቀደመው ተዛማጅ የማብቂያ ጊዜ ላይ የተመሠረተ የተገደበ `Retry-After` ይመልሳል። -መደበኛ ባዶ ብቁነት የኪራይ ፉክክር አይደለም፣ እና ነባሩን የማዞሪያ ስህተት ትርጉም ይዞ ይቆያል። +የሕይወት ዑደቱ `POST /api/v1/session-leases` ሲሆን፣ የJSON ድርጊቶቹ `acquire`፣ `renew` እና `release` ናቸው። የሚተዳደሩ የግምት ጥያቄዎች ግልጽ ያልሆነውን `X-OmniRoute-Lease-Owner` እሴት እና ትክክለኛውን `X-OmniRoute-Lease-Generation` ያቀርባሉ። ባለቤቱ `vlo_`ን ተከትለው የሚመጡ 43 base64url ቁምፊዎችን ይጠቀማል፤ የሚከማቸው የእሱ SHA-256 hash ብቻ ነው። እያንዳንዱ የመጨረሻ መላኪያ ወሰን የተረጋገጠውን API ቁልፍ ID እና ንቁውን የግንኙነት ID ጭምር ያስተሳስራል። የኪራይ መቆጣጠሪያ ራስጌዎች ከመዝገቦች፣ ከተያዙ የጥያቄ ቅጽበተ-ሁኔታዎች እና ከላይኛው አገልግሎት አስፈጻሚ ራስጌዎች ይወገዳሉ። -ተዛማጅ ዘዴዎች ተለያይተው ይቆያሉ፦ +የተለመደው ማስተላለፍ ብቁ የሚተዳደሩ እጩዎች እያሉት እያንዳንዱ ነጻ እጩ በሌላ ንቁ ኪራይ የተያዘ ከሆነ፣ OmniRoute HTTP `429`፣ lease-capacity-unavailable ኮድ፣ አቅምን-የመጠበቅ ሁኔታ እና ከመጀመሪያው ተዛማጅ የማብቂያ ጊዜ የተገኘ የተገደበ `Retry-After` ይመልሳል። በተለመደው ሁኔታ ምንም ብቁ እጩ አለመኖሩ የኪራይ ፉክክር አይደለም፣ እና ያሉትን የማስተላለፍ ስህተት ትርጉሞች እንዳሉ ያቆያል። -- የOAuth ክፍለ ጊዜ ይዞታ ለOAuth መለያዎች በሂደት ውስጥ ብቻ የሚኖር ለስላሳ ስርጭት ነው። -- የመለያ ሴማፎሮች የጥያቄ-በተመሳሳይ-ጊዜ ፈቃዶችን ይሰጣሉ፣ እና ጥያቄው ሲጠናቀቅ ያበቃሉ። -- ብቸኛ የሚተዳደሩ የክፍለ ጊዜ ኪራዮች የትውልድ ድንበር ያለው ዘላቂ የሕይወት ዑደት ባለቤትነት ናቸው። +ተዛማጅ ስልቶች እርስ በርሳቸው የተለዩ ሆነው ይቆያሉ፦ + +- የOAuth ክፍለ-ጊዜ ይዞታ ለOAuth መለያዎች በሂደት ውስጥ ብቻ የሚሰራ ለስላሳ ስርጭት ነው። +- የመለያ ሴማፎሮች የጥያቄ-ትይዩነት ፈቃዶችን ይሰጣሉ፣ እና ጥያቄው ሲጠናቀቅ ያበቃሉ። +- ልዩ የሚተዳደሩ የክፍለ-ጊዜ ኪራዮች ከትውልድ ወሰን ጋር የሚሰራ ዘላቂ የሕይወት ዑደት ባለቤትነት ናቸው። --- @@ -273,27 +318,70 @@ DB ውስጥ በቋሚነት አይቀመጡም — ዳግም ሲነሳ ይጠ ## 5. የጥያቄ ወረፋ መግቢያ ቁጥጥር (v3.8.49 · issue #6593) -**ወሰን**፦ የአካባቢው በየአቅራቢው+ግንኙነቱ የፍጥነት ገደብ ወረፋ (`open-sse/services/rateLimitManager.ts`፣ -በBottleneck የሚደገፍ)፣ ከላይ ካሉት ሦስት ዘዴዎች አንድ ንብርብር በታች። - -**`maxWaitMs` ለአፈጻጸም ማብቂያ የቆየ ቋሚ ስም ነው።** -`resilienceSettings.requestQueue.maxWaitMs` እንደ job `expiration` ወደ Bottleneck ይተላለፋል፤ timer የሚጀምረውም ከማሰራጨት በኋላ ብቻ ነው። ስለዚህ ይህ በአካባቢው ወረፋ ውስጥ የሚጠፋውን ጊዜ ሳይሆን በlimiter የሚተዳደረውን አፈጻጸም ይገድባል። Expiration እንደ ታማኝ የአካባቢ `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) ይቀርባል፤ የቀድሞው የqueue-timeout code ስም የሚቀበለው ለታማኝ ውስጣዊ የኋላ ተኳኋኝነት ብቻ ነው። ነባሪው 15000ms ነው፤ በ`RATE_LIMIT_MAX_WAIT_MS` (env) ወይም በdashboard (**Settings → Resilience**፣ -1–30000ms UI ጣሪያ) በኩል ይቀይሩት። በወረፋ ውስጥ ለሚቆይበት ጊዜ የጊዜ ገደብ የለውም፤ ወረፋ የያዙ ጠሪዎችን ለመገደብ ከታች ያለውን `maxQueueDepth` ይጠቀሙ። +**ወሰን**፦ የአካባቢው፣ ለእያንዳንዱ provider+connection የተለየ የፍጥነት-ገደብ ወረፋ (`open-sse/services/rateLimitManager.ts`፣ +በBottleneck የሚደገፍ)፤ ከላይ ካሉት ሦስት ዘዴዎች አንድ ደረጃ በታች። + +**`maxWaitMs` የወረፋ ጥበቃን ይገድባል፤ `executionMaxWaitMs` ደግሞ አፈጻጸምን ይገድባል።** +ሁለቱ ሆን ተብለው የተለያዩ ናቸው፣ አንዳቸውም ለሌላው ግብዓት አይሆንም። + +`resilienceSettings.requestQueue.maxWaitMs` **የወረፋ-ጥበቃ በጀት** ነው፦ +የprovider ቦታ እስኪገኝ መጠበቅን እና ከዚያ QUEUED ሁኔታ ውስጥ መቆየትን ያካትታል፤ ሥራው +ከQUEUED ወጥቶ መፈጸም በጀመረበት ቅጽበት የጊዜ ቆጣሪው ይሰረዛል +(`rateLimitManager.ts`፣ `wrappedFn`)። ይህን ጊዜ ያለፈ ጥያቄ +ወደ upstream ፈጽሞ አይደርስም። ነባሪው 30000ms ሲሆን፣ +በ`src/lib/resilience/settings.ts` ውስጥ ባለው `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +ይቀርባል እና በ`tests/unit/ratelimit-admission-control-6593.test.ts` +ተወስኖ ተቀምጧል፤ ስለዚህ በእሱ ላይ የሚደረግ ለውጥ ይህ አንቀጽ ሳይታወቅ ጊዜ ያለፈበት ሆኖ እንዲቀር ከማድረግ ይልቅ +ያንን ሙከራ ያሳክታል። + +`resilienceSettings.requestQueue.executionMaxWaitMs` Bottleneck +እንደ ሥራ `expiration` የሚቀበለው ሲሆን፣ የጊዜ ቆጣሪው መላክ ከተከናወነ በኋላ ብቻ ይጀምራል። የራሳቸው +upstream timeout ለሌላቸው executors የመጨረሻ መከላከያ ነው፤ የexecutor የራሱ fetch-start timeout ከዚህ የሚረዝም ከሆነም +ወደዚያ ጊዜ ይጨመራል፣ ስለዚህ ጤናማ እና በሂደት ላይ ያለ ምላሽን ሊያቋርጥ አይችልም። ነባሪው 600000ms (10 ደቂቃ) ነው። + +የወረፋውን በጀት ወደ `expiration` ማስገባት ቀደም ሲል non-incremental +gatewaysን በሥራ መካከል ይገድል የነበረው ነው — የመጀመሪያዎቹ ባይቶች ከመምጣታቸው በፊት ለደቂቃዎች መሥራታቸው ትክክለኛ ነው — +እናም expiration እንደ `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) የሚቀርበው፣ የወረፋው በጀት ደግሞ +የqueue-timeout codeን የሚይዘው በዚህ ምክንያት ነው። አንዳቸውንም በ`RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) ወይም በdashboard +(**Settings → Resilience**) በኩል ይቀይሩ። ሁለቱም መደበኛ ሲደረጉ በ1ms–24h መካከል ይገደባሉ። + +**ለሁለቱም የቅድሚያ ቅደም ተከተል፦** env var የሚያቀርበው _ነባሪውን_ ብቻ ነው። +በ`resilienceSettings.requestQueue` ውስጥ በቋሚነት የተቀመጠ እሴት (dashboard / API patch፣ +በ`key_value` ውስጥ የተከማቸ) ከእሱ ቅድሚያ ያገኛል፤ እና ለእያንዳንዱ connection የተወሰነ +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` ከዚያም ቅድሚያ ያገኛል። ስለዚህ +አስቀድሞ በቋሚነት የተቀመጠ እሴት ባለው deployment ላይ env varን ማቀናበር +ምንም ነገር አይቀይርም — በምትኩ በቋሚነት የተቀመጠውን ቅንብር ያጽዱ ወይም ያዘምኑ። + +በወረፋ ውስጥ የመቆያ ጊዜ በ`maxWaitMs` ይገደባል፤ ከታች ያለው `maxQueueDepth` ደግሞ +በአንድ ጊዜ ስንት ጠሪዎች በወረፋ ሊቆዩ እንደሚችሉ ይገድባል። **`maxQueueDepth` — በምርጫ የሚነቃ የመግቢያ ገደብ (አዲስ)።** `resilienceSettings.requestQueue.maxQueueDepth` -ለአንድ provider+connection በአንድ ጊዜ ምን ያህል ጥያቄዎች በወረፋ ውስጥ (ገና ሳይሰራጩ) መቀመጥ እንደሚችሉ ይገድባል። ወረፋው አስቀድሞ `maxQueueDepth` ጥያቄዎችን ከያዘ፣ አዲስ ጥያቄ ወደ `limiter.schedule()` ከመድረሱ **በፊት** በtyped `code: "RATE_LIMIT_QUEUE_FULL"` ስህተት በፍጥነት ውድቅ ይደረጋል — ስለዚህ ውድቅ ማድረጉ አነስተኛ ወጪ ያለው ሲሆን ለዚያ ጥያቄ ማንኛውም downstream prompt-compression / translation ሥራ ከመከናወኑ በፊት ይፈጸማል። ነባሪ `0` = -የተሰናከለ፣ ነባሩን ያልተገደበ የወረፋ ባህሪ የሚጠብቅ፤ የተፈቀደው ወሰን 0–100000 ነው። +ለአንድ provider+connection በአንድ ጊዜ ስንት ጥያቄዎች በወረፋ ሊቆዩ (ገና ሳይላኩ) እንደሚችሉ +ይገድባል። ወረፋው አስቀድሞ `maxQueueDepth` +ጥያቄዎችን ይዞ ሲገኝ፣ አዲስ ጥያቄ እስከ `limiter.schedule()` ከመድረሱ **በፊት** +typed `code: "RATE_LIMIT_QUEUE_FULL"` error በመስጠት ወዲያውኑ ውድቅ ይደረጋል — +ስለዚህ ውድቅ ማድረጉ አነስተኛ ወጪ ያለው ሲሆን፣ ለዚያ ጥያቄ ማንኛውም downstream +prompt-compression / translation ሥራ ከመከናወኑ በፊት ይፈጸማል። ነባሪው `0` = +የተሰናከለ ሲሆን፣ ነባሩን ገደብ-የለሽ የወረፋ ባህሪ ይጠብቃል፤ በ0–100000 መካከል ይገደባል። በ`RATE_LIMIT_MAX_QUEUE_DEPTH` (env) ወይም -`resilienceSettings.requestQueue.maxQueueDepth` (dashboard/API patch) በኩል ይቀይሩት። +`resilienceSettings.requestQueue.maxQueueDepth` (dashboard/API patch) በኩል ይቀይሩ። -የመግቢያ ማረጋገጫው ራሱ pure function ነው -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`)፤ ስለዚህ እውነተኛ Bottleneck limiter ሳያስፈልግ unit-test ሊደረግ ይችላል። +የመግቢያ ፍተሻው ራሱ pure function ነው +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`)፣ ስለዚህ +እውነተኛ Bottleneck limiter ሳያስፈልግ በunit test መፈተሽ ይቻላል። > #6593ን የከፈተው RFC የ`bypassCompressionOnRateLimit` -> flagንም ሐሳብ አቅርቦ ነበር። የዚህ repo `open-sse/services/compression/` pipeline -> በoutbound LLM ጥያቄ ላይ የprompt/context compression ነው (`chatCore.ts`፣ +> flagንም አቅርቦ ነበር። የዚህ repo `open-sse/services/compression/` pipeline +> በወጪው LLM ጥያቄ ላይ የሚከናወን prompt/context compression ነው (`chatCore.ts`፣ > በ`resolveCompressionSettings`/`selectCompressionStrategy` block አካባቢ)፤ -> በተፈጠሩ 429 bodies ላይ የHTTP response compression አይደለም — ለቀጥተኛ bypass flag የሚዛመድ የcode path የለም። ያ የprompt-compression ደረጃም በአሁኑ ጊዜ በጥያቄ pipeline ውስጥ ከ`withRateLimit()` _በፊት_ ይሰራል፤ ስለዚህ queue-full rejection ሲኖር እሱን ለመዝለል ቅደም ተከተሉን እንደገና ማደራጀት ከዚህ issue ወሰን የተለየና የበለጠ ትልቅ ለውጥ ነው፤ እዚህ ላይ ሆን ተብሎ **አልተተገበረም**፣ እና CPUን ከመቆጠብ የሚገኘው ጥቅም የቅደም ተከተል ለውጡን አደጋ የሚያዋጣ ከሆነ ለቀጣይ ሥራ ተትቷል። +> በተፈጠሩ 429 bodies ላይ የሚከናወን HTTP response compression አይደለም — ለቀጥተኛ bypass flag +> የሚዛመድ code path የለም። ያ የprompt-compression ደረጃም +> በአሁኑ ጊዜ በጥያቄ pipeline ውስጥ ከ`withRateLimit()` _በፊት_ ይሠራል፤ ስለዚህ +> queue-full በሚል ውድቅ ሲደረግ እሱን ለመዝለል ቅደም ተከተሉን መቀየር፣ ከዚህ issue ወሰን የተለየና ትልቅ +> ለውጥ ነው፤ ሆን ተብሎ **እዚህ አልተተገበረም**፣ እና የCPU ቁጠባው ጥቅም +> የቅደም ተከተል መቀየሩን ስጋት የሚያዋጣ ከሆነ እንደ follow-up ተትቷል። --- diff --git a/docs/i18n/am/docs/architecture/admission-lanes.md b/docs/i18n/am/docs/architecture/admission-lanes.md index 1b88871f942b..73d57a26621b 100644 --- a/docs/i18n/am/docs/architecture/admission-lanes.md +++ b/docs/i18n/am/docs/architecture/admission-lanes.md @@ -7,46 +7,50 @@ OmniRoute የተለያዩ ወሰኖች ያሏቸው በሂደት ውስጥ ብቻ የሚሰሩ **ሁለት** የመስመር ሥርዓቶች አሉት። እነዚህ እርስ በርሳቸው የሚደጋገፉ ናቸው፤ ኦፕሬተሮች የትኛውን እየተመለከቱ እንደሆነ ማወቅ አለባቸው። -## 1. በባይት ደረጃ በጠቅላላው ሂደት ላይ የሚተገበር የመቀበያ ቁጥጥር (`chatBodyAdmission.ts`) +## 1. በባይት ደረጃ በመላው ሂደት የሚሰራ የመግቢያ ቁጥጥር (`chatBodyAdmission.ts`) - **ወሰን፦** ለ`POST /v1/chat/completions`፣ - `/v1/messages`፣ `/v1/responses` እና ሌሎች የውይይት ቅርጽ ላላቸው መንገዶች የተከማቸ-የጥያቄ-ይዘት/heap መስመር። - በትላልቅ የኮድ አዘጋጅ ወኪሎች የጥያቄ ይዘቶች ምክንያት የሚፈጠርን የheap ማባዛት ይከላከላል (#4380)። -- **አንድ የሂደቱ ዓለም አቀፍ መቆጣጠሪያ እንጂ ለእያንዳንዱ ቁልፍ የተለዩ መስመሮች አይደሉም (#10110)።** እያንዳንዱ የAPI ቁልፍ - (hash የተደረገ) ወይም `anonymous` ክፍለ ጊዜ በ**ተመሳሳዩ** የጋራ በጀት መሠረት ይቀበላል — - hash የተደረገው የክፍለ ጊዜ መለያ ለፍትሐዊነት መርሐግብር ቁልፍ (በተጠባባቂዎች መካከል ተራ በተራ - ለማሰራጨት) **ብቻ** ጥቅም ላይ ይውላል፤ በፍጹም እንደ የአቅም ክፍፍል አያገለግልም። የዚህ ሰነድ ቀደምት ስሪት - ራሳቸውን የቻሉ አቅሞች ያሏቸውን ለእያንዳንዱ ቁልፍ የተለዩ መስመሮች የሚገልጽ ነበር፤ ያልተረጋገጡ የውሸት ማረጋገጫዎች - የሂደቱን አጠቃላይ ገደብ ማባዛት ስለሚያስችሉ #10110 ላይ ይህ ሞዴል ተወግዷል። -- **በር (#503-fanout)፦ በራስ-ሰር የሚወሰን የግብዓት BYTE በጀት እንጂ ቋሚ የጥያቄ - ብዛት አይደለም።** የቀድሞው `CHAT_MAX_HEAVY_IN_FLIGHT` የጥያቄ-ብዛት ገደብ (ከዚህ ማስተካከያ በፊት ነባሪው `1` - ነበር) የኮድ አዘጋጅ ወኪሎችን የስራ ስርጭት (በርካታ ንዑስ ወኪሎች/CLIs፣ - በመደበኛነት > 256 KB የሆኑ የጥያቄ ይዘቶች) ውጤታማ የትይዩነት መጠን ~1 እንዲሆን በማድረግ ያጠብ ነበር፤ ይህም - ሙሉ በሙሉ መደበኛ በሆነ ጭነት ውስጥ 503 እንዲመለስ ያደርግ ነበር። አሁን ይህ ገደብ የሚተገበረው ኦፕሬተር - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`ን በግልጽ ሁኔታ ሲያዘጋጅ ብቻ ነው። ሳይዘጋጅ ሲቀር፣ መቀበሉ በምትኩ - በ`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ይገደባል — ይህም ከሂደቱ ትክክለኛ የማህደረ ትውስታ ጣሪያ - (`src/shared/middleware/admissionBudget.ts`) በራስ-ሰር የሚወሰን በጀት ነው፦ - ከV8 heap ገደብ እና ከማንኛውም የcgroup/container ገደብ ይበልጥ ጥብቅ የሆነውን 25%፣ - ለ8x ጊዜያዊ የማባዛት ሁኔታ ተካፍሎ፣ በ8 MiB እና - 2 GiB መካከል የተገደበ። ግልጽ የሆኑ ተተኪ ቅንብሮችም ተመሳሳይ ገደቦችን ይጠቀማሉ። ይህም ምንም የenv ማስተካከያ ሳያስፈልገው - ከ512 MB container እስከ 32 GB desktop ድረስ ራሱን ያስተካክላል። በተግባር ላይ ባለው በጀት ውስጥ - ሊገባ የማይችል የጥያቄ ይዘት ወዲያውኑ በ`413 body_exceeds_budget` ይከሽፋል፤ - በተናጠል ሊስተናገዱ በሚችሉ የጥያቄ ይዘቶች መካከል ያለ ፉክክር ብቻ ገደብ ወዳለው - ፍትሐዊነት ወረፋ ይገባል። በቀጥታ የሚሰራ ባለብዙ-ምልክት የሀብት-ጫና መከታተያ (የV8 heap ጥምርታ፣ - cgroup፣ PSI፣ OOM ክስተቶች — `open-sse/utils/resourcePressurePolicy.ts`) በ`high` ጫና - ጊዜ የተገደበውን የጥበቃ ጊዜ ያሳጥራል፣ በ`critical` ጫና ጊዜ ደግሞ አንድም ባይት - ከመግባቱ በፊት በ`503 resource_pressure` ወዲያውኑ ጭነትን ይቀንሳል። + `/v1/messages`፣ `/v1/responses` እና ለሌሎች የውይይት ቅርጽ ላላቸው መስመሮች የሚያገለግለው የተከማቸ-ይዘት/heap መንገድ። + ከትላልቅ የኮዲንግ ወኪል ይዘቶች የሚመጣውን የheap ማባዛት ይከላከላል (#4380)። +- **ለእያንዳንዱ ቁልፍ የተለዩ መስመሮች ሳይሆኑ፣ አንድ በመላው ሂደት የሚጋራ መቆጣጠሪያ (#10110)።** እያንዳንዱ API ቁልፍ + (hash የተደረገ) ወይም `anonymous` ክፍለ-ጊዜ በ**ተመሳሳዩ** የጋራ በጀት ላይ ተመስርቶ ይገባል — + hash የተደረገው የክፍለ-ጊዜ መለያ የሚያገለግለው እንደ ፍትሃዊ የጊዜ ሰሌዳ ቁልፍ ብቻ ነው (በተጠባባቂዎች መካከል + ዙር-በ-ዙር ስርጭት)፤ እንደ አቅም ክፍፍል ፈጽሞ አያገለግልም። የዚህ ሰነድ ቀዳሚ ስሪት + ነጻ አቅም ያላቸውን ለእያንዳንዱ ቁልፍ የተለዩ መስመሮች ይገልጽ ነበር፤ ያ ሞዴል + ማረጋገጫ የሌላቸው የሐሰት ምስክርነቶች የመላውን ሂደት ገደብ እንዲያባዙ ስለፈቀደ + በ#10110 ተወግዷል። +- **መዝጊያ (#503-fanout)፦ በራስ-ሰር የሚወሰን የግብዓት BYTE በጀት እንጂ ቋሚ የጥያቄ + ብዛት አይደለም።** የቆየው የ`CHAT_MAX_HEAVY_IN_FLIGHT` የጥያቄ-ብዛት ገደብ (ከዚህ ማስተካከያ በፊት ነባሪው `1`) + የኮዲንግ ወኪል የተስፋፋ ስርጭትን (በርካታ ንዑስ ወኪሎች/CLIs፣ + ዘወትር > 256 KB የሆኑ ይዘቶች) ወደ ~1 ውጤታማ ትይዩነት ያወርደው ነበር፣ ይህም + ፍጹም መደበኛ በሆነ ጭነት ላይ 503 እንዲመለስ ያደርግ ነበር። አሁን የሚያስገድደው ኦፕሬተሩ + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`ን በግልጽ ሲያዘጋጅ ብቻ ነው። ሳይዘጋጅ ሲቀር፣ መግቢያው በምትኩ + በ`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ይገደባል — ከሂደቱ እውነተኛ የማህደረ ትውስታ ጣሪያ + (`src/shared/middleware/admissionBudget.ts`) በራስ-ሰር የሚወሰን በጀት፦ + ከV8 heap ገደብ እና ከማንኛውም cgroup/container ገደብ ውስጥ ይበልጥ ጥብቅ የሆነው 25%፣ + በ8x ጊዜያዊ-ማባዣ መጠን ተካፍሎ፣ በ8 MiB እና + 2 GiB መካከል ተገድቦ። ግልጽ መተኪያዎችም እነዚሁን ገደቦች ይጠቀማሉ። ይህ ያለምንም env ማስተካከያ ከ + 512 MB container እስከ 32 GB desktop ድረስ ራሱን ያመጣጥናል። በውጤታማው በጀት ውስጥ + ሊገባ የማይችል ይዘት ወዲያውኑ `413 body_exceeds_budget` በሚል ይከሽፋል፤ + በተናጠል ሊስተናገዱ በሚችሉ ይዘቶች መካከል ያለ ፉክክር ብቻ ወደ ውስን + የፍትሃዊነት ወረፋ ይገባል። ቀጥታ የሚሰራ ባለብዙ-ምልክት የሀብት-ጫና መከታተያ (የV8 heap ሬሾ፣ + cgroup፣ PSI፣ OOM ክስተቶች — `open-sse/utils/resourcePressurePolicy.ts`) በ`high` ጫና ወቅት + ውስን የጥበቃ ጊዜውን ያሳጥራል፣ በ`critical` ጫና ወቅት ደግሞ ማንኛውም ባይት ከመግባቱ በፊት + ወዲያውኑ `503 resource_pressure` በሚል ጭነቱን ይቀንሳል። PSI በሚገኝበት ጊዜ ከዚህ አሃድ cgroup `memory.pressure` + (`open-sse/utils/resourcePressureSampler.ts`) ይነበባል፤ `/proc/pressure/memory` + የመላው host መረጃ ሲሆን በbare metal / cgroup v1 ላይ ብቻ እንደ መጠባበቂያ ያገለግላል፣ ስለዚህ swapping + የሚያደርግ host ስራ ፈት የሆነ container 503 እንዲመልስ ማድረግ አይችልም። - **ማስተካከያ፦** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — በራስ-ሰር ለሚወሰነው የባይት በጀት ተተኪ ቅንብር - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — የቀድሞ የጥያቄ-ብዛት ገደብ፣ በምርጫ ብቻ የሚነቃ - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503 ከመመለሱ በፊት ያለ የወረፋ ጥበቃ (ነባሪው 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — በወረፋ ያሉ ባይቶችን የሚቆጣጠር የheap ቫልቭ (ነባሪው 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — ከ#10110 ጀምሮ የተተዉ - ምንም ተግባር የሌላቸው ቅንብሮች (ለውቅር ተኳሃኝነት ሲባል ይቀበላሉ፣ ግን ችላ ይባላሉ) + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — በራስ-ሰር ለሚወሰነው የባይት በጀት መተኪያ + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — የቆየ የጥያቄ-ብዛት ገደብ፣ በምርጫ ብቻ የሚነቃ + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503 ከመመለሱ በፊት የወረፋ ጥበቃ ጊዜ (ነባሪ 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — የተሰለፉ-ባይቶች heap መቆጣጠሪያ (ነባሪ 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — ከ#10110 ጀምሮ ጥቅም ላይ የማይውሉ + ምንም-የማያደርጉ ቅንብሮች (ለውቅር ተኳኋኝነት ይቀበላሉ፣ ግን ችላ ይባላሉ) - **ሪፖርቶች፦** `GET /api/monitoring/health` → `chatAdmission` (#11244) — የ#503-fanout ተጨማሪዎችን `inflightBytes`፣ `maxInflightBytes`፣ `budgetSource` (`v8_heap` | `cgroup` | `override`)፣ `pressureSeverity` እና `countCapEnabled`ን ጨምሮ - (በነባሪ ስርጭት ላይ false ነው — በትክክል ገደብ እየጣለ ያለው የባይት በጀቱ እንጂ የቀድሞው + (በነባሪ ስርጭት ላይ false — በተግባር እየገደበ ያለው የባይት በጀቱ እንጂ የቆየው የብዛት ገደብ አለመሆኑን ያረጋግጣል)። ## 2. ተስማሚ የአሂድ ጊዜ ምናባዊ መስመሮች (`open-sse/services/admission`) diff --git a/docs/i18n/am/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/am/docs/frameworks/EMBEDDED-SERVICES.md index 97bbb0ca4e10..301bc72b2a06 100644 --- a/docs/i18n/am/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/am/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **ስሪት:** v3.8.44 -> **ለመጨረሻ ጊዜ የተዘመነው:** 2026-07-03 -> **ዒላማ አንባቢዎች:** የተካተቱ አገልግሎቶችን (9Router, CLIProxyAPI, Mux, Bifrost) የሚጨምሩ፣ የሚንከባከቡ ወይም ስህተት የሚያርሙ መሐንዲሶች። +> **ለመጨረሻ ጊዜ የተዘመነው:** 2026-09-09 +> **ታዳሚዎች:** የተካተቱ አገልግሎቶችን (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) የሚጨምሩ፣ የሚያስተዳድሩ ወይም ስህተት የሚፈልጉ መሐንዲሶች። -የተካተቱ አገልግሎቶች OmniRoute በአካባቢው የሚጭናቸው፣ የሚቆጣጠራቸው እና -እንደ ዋና የማዘዋወሪያ ዒላማዎች የሚያቀርባቸው በአካባቢው የተጫኑ የሂደት ጎን-ለ-ጎን መሣሪያዎች ናቸው። ከውጫዊ አቅራቢዎች (በAPI ቁልፎች -አማካኝነት በበይነመረብ የሚደረስባቸው) በተለየ፣ የተካተቱ አገልግሎቶች ከOmniRoute ጋር በአንድ ማሽን ላይ ይሰራሉ እና በloopback በኩል ይገናኛሉ። +የተካተቱ አገልግሎቶች OmniRoute የሚጭናቸው፣ የሚቆጣጠራቸው እና +እንደ ሙሉ የማዘዋወሪያ መዳረሻዎች የሚያቀርባቸው፣ በአካባቢው የተጫኑ የሂደት ተጓዳኝ መሣሪያዎች ናቸው። ከውጫዊ አቅራቢዎች (API ቁልፎችን በመጠቀም +በበይነመረብ የሚደረስባቸው) በተለየ፣ የተካተቱ አገልግሎቶች ከOmniRoute ጋር በአንድ ማሽን ላይ ይሰራሉ እና በloopback በኩል ይገናኛሉ። --- @@ -29,35 +29,36 @@ ## 1. አጠቃላይ እይታ -### የተካተቱ አገልግሎቶች ለምን ያስፈልጋሉ? +### የተካተቱ አገልግሎቶች ለምን? -አምስት አገልግሎቶች ተካተዋል፦ +ስድስት አገልግሎቶች ተካትተዋል፦ -| አገልግሎት | npm ጥቅል | ነባሪ ወደብ | ዓላማ | -| --------------- | ---------------------------------- | :-----: | --------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | OmniRoute እንደ ንዑስ አቅራቢ ሊጠቀምበት የሚችል AI ራውተር። ሞዴሎች እንደ `9router/{sub}/{model}` ይቀርባሉ | -| **CLIProxyAPI** | የGitHub ልቀት ባይነሪ (`cliproxy`) | 8317 | ለAnthropic CLI የማረጋገጫ ፍሰቶች የአካባቢ ፕሮክሲ አስማሚ። የOAuth ቶከኖች ጊዜያቸው ሲያልቅ ተተኪ ማዘዋወርን ያቀርባል | -| **Mux** | `mux` (ያለ ግራፊክ በይነገጽ `mux server`) | 8322 | የአካባቢ ወኪል-ማቀናበሪያ ዴሞን (coder/mux)። የሕይወት ዑደቱ ብቻ የሚተዳደር — የማዘዋወሪያ ዒላማ አይደለም (የLLM ፕሮክሲ ማድረግ የለም)። | -| **Bifrost** | `@maximhq/bifrost` | 8080 | የGo AI-ጌትዌይ ማስተላለፊያ የኋላ-ጫፍ። በሚሰራበት ጊዜ በማስተላለፊያ መስመሩ (`/v1/relay/`) በራስ-ሰር ይመረጣል | -| **Dario** | `@askalf/dario` | 3456 | የClaude ምዝገባ ፕሮክሲ — ለClaude-Code ቅርጽ ላለው ትራፊክ የCLIProxyAPI አማራጭ/ተተኪ፤ የገባው ቁልፍ `DARIO_ADMIN_TOKEN` በመሆን የእሱን `/admin/*` OAuth መቆጣጠሪያ ክፍል ይጠብቃል | +| አገልግሎት | npm ጥቅል | ነባሪ ወደብ | ዓላማ | +| --------------- | ----------------------------- | :-----: | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | OmniRoute እንደ ንዑስ አቅራቢ ሊጠቀምበት የሚችል AI ራውተር። ሞዴሎች በ`9router/{sub}/{model}` መልክ ይቀርባሉ | +| **CLIProxyAPI** | GitHub የልቀት ባይነሪ (`cliproxy`) | 8317 | ለAnthropic CLI ማረጋገጫ ፍሰቶች የአካባቢ ፕሮክሲ አስማሚ። OAuth ቶከኖች ጊዜያቸው ሲያልቅ የመጠባበቂያ ራውቲንግ ያቀርባል | +| **Mux** | `mux` (ያለ በይነገጽ `mux server`) | 8322 | የአካባቢ ወኪል-ማቀናበሪያ daemon (coder/mux)። የሕይወት ዑደቱ ብቻ ይተዳደራል — የራውቲንግ ዒላማ አይደለም (የLLM ፕሮክሲ ማድረግ የለም)። | +| **Bifrost** | `@maximhq/bifrost` | 8080 | በGo የተሠራ AI-ጌትዌይ ሪሌይ ባክኤንድ። በሚሠራበት ጊዜ በሪሌይ መስመሩ (`/v1/relay/`) በራስ-ሰር ይመረጣል | +| **Dario** | `@askalf/dario` | 3456 | የClaude ደንበኝነት ምዝገባ ፕሮክሲ — Claude-Code ቅርጽ ላለው ትራፊክ የCLIProxyAPI አማራጭ/የመጠባበቂያ መፍትሔ፤ የገባው ቁልፍ የ`/admin/*` OAuth መቆጣጠሪያ ክፍሉን የሚጠብቅ `DARIO_ADMIN_TOKEN` ይሆናል | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web አውቶሜሽን (ያለ በይነገጽ Chromium በPuppeteer በኩል)። የሕይወት ዑደቱ ብቻ ይተዳደራል — የራውቲንግ ዒላማ አይደለም። | -አምስቱም ተመሳሳይ የቁጥጥር ሞዴል ይከተላሉ፦ +ስድስቱም ተመሳሳይ የቁጥጥር ሞዴል ይከተላሉ፦ - OmniRoute በ`DATA_DIR/services/{name}/` ስር ይጭናቸዋል (ከOmniRoute የራሱ `package.json` ተለይተው) -- OmniRoute እንደ ልጅ ሂደቶች ያስጀምራቸዋል እና ይከታተላቸዋል -- OmniRoute ጊዜያዊ API ቁልፍን ወደ ልጅ ሂደቱ አካባቢ ያስገባል፣ እንዲሁም አገልግሎቱን ሳያቋርጥ ያድሰዋል (ተግባራዊ በሚሆንበት ቦታ) +- OmniRoute እንደ ልጅ ሂደቶች ያስነሳቸዋል እና ይከታተላቸዋል +- OmniRoute ጊዜያዊ API ቁልፍን ወደ ልጅ ሂደቱ አካባቢ ያስገባል፣ እና አገልግሎት ሳይቋረጥ ይቀይረዋል (ተፈጻሚ በሚሆንበት ጊዜ) - ሁሉም የአስተዳደር መስመሮች (`/api/services/*`) **LOCAL_ONLY** ናቸው — ከloopback ብቻ ተደራሽ ናቸው (ጥብቅ ደንብ #17) ### ቁልፍ ውሳኔዎች (ከንድፍ ዕቅዱ) | ውሳኔ | እሴት | | ----------------------------- | ----------------------------------------------------------------- | -| የዳሽቦርድ መዳረሻ ወደ 9Router ቤተኛ UI | በ`/dashboard/providers/services/9router/embed/*` ላይ Reverse proxy | -| የመጫኛ ዘዴ | `npm install {package}` በ`execFile` በኩል (የshell እሴት ማስገባት የለም) | -| የአጠቃቀም ሁነታ | አቅራቢው በማዘዋወሪያ ሞተሩ ውስጥ እንደ `9router/{sub}/{model}` ይመዘገባል | +| ከዳሽቦርድ ወደ 9Router ቤተኛ UI መዳረሻ | Reverse proxy በ`/dashboard/providers/services/9router/embed/*` | +| የመጫኛ ዘዴ | `npm install {package}` በ`execFile` በኩል (የshell መስፋፋት የለም) | +| የአጠቃቀም ሁኔታ | አቅራቢው በራውቲንግ ሞተሩ ውስጥ እንደ `9router/{sub}/{model}` ይመዘገባል | | የAPI ቁልፍ አስተዳደር | OmniRoute ያመነጫል፣ በማከማቻ ላይ ያመሰጥራል (AES-256-GCM)፣ እና በenv በኩል ያስገባል | -| የዳሽቦርድ አካባቢ | `/dashboard/providers/services` (ሦስት ትሮች) | -| ራስ-ሰር ማስጀመር | ለእያንዳንዱ አገልግሎት የማብሪያ/ማጥፊያ አማራጭ፣ ነባሪው OFF | +| የዳሽቦርድ መገኛ | `/dashboard/providers/services` (ሦስት ትሮች) | +| ራስ-ሰር መጀመር | ለእያንዳንዱ አገልግሎት የሚቀያየር፣ በነባሪ OFF | --- @@ -67,10 +68,10 @@ ┌────────────────────────────────────────────────────────────────────┐ │ ንብርብር 1 — UI │ │ /dashboard/providers/services (ትሮች፦ CLIProxyAPI | 9Router | Mux) │ -│ የቀጥታ ሎጎች (SSE)፣ ማስጀመር/ማቆም/ዳግም ማስጀመር/ማዘመን፣ ቅንብሮች፣ መጫን │ +│ ቀጥታ ምዝግቦች (SSE)፣ ማስጀመር/ማቆም/ዳግም ማስጀመር/ማዘመን፣ ቅንብሮች፣ መጫን │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx ሼል + በ ?tab= የትር ማዘዋወር │ +│ ├── page.tsx Shell + በ?tab= የትር ማስተላለፊያ │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -87,72 +88,73 @@ │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (የተገላቢጦሽ HTTP + WebSocket ፕሮክሲ → የ9Router upstream) │ +│ (የተገላቢጦሽ HTTP + WebSocket ፕሮክሲ → ወደ 9Router upstream) │ │ │ -│ መግቢያ መቆጣጠሪያ፦ LOCAL_ONLY_API_PREFIXES "/api/services/" እና │ -│ "/dashboard/providers/services/*/embed/" ያካትታል │ +│ መግቢያ መቆጣጠሪያ፦ LOCAL_ONLY_API_PREFIXES "/api/services/" እና │ +│ "/dashboard/providers/services/*/embed/" ያካትታል │ └──────────────────────┬─────────────────────────────────────────────┘ - │ በሂደት ውስጥ የሚደረጉ ጥሪዎች + │ በሂደቱ ውስጥ የሚደረጉ ጥሪዎች ┌──────────────────────▼─────────────────────────────────────────────┐ │ ንብርብር 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts አጠቃላይ ተቆጣጣሪ (child_process.spawn) │ -│ ├── መጫን፦ execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── ማስጀመር፦ spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key፦ crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── ፖርት፦ ለ9Router 20130 (ሊዋቀር የሚችል) │ -│ ├── ሎጎች፦ የstdio ቀለበት ቋት 5 MB → የSSE ክስተቶች │ -│ ├── ጤና፦ HTTP GET /health በየ2–5 s፣ በፍላጎት ጊዜ ማገገም │ +│ ├── መጫን፦ execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── ማስጀመር፦ spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key፦ crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── ወደብ፦ 20130 ለ9Router (ሊዋቀር የሚችል) │ +│ ├── ምዝግቦች፦ stdio ring buffer 5 MB → SSE ክስተቶች │ +│ ├── ጤና፦ HTTP GET /health በየ2–5 s፣ የዘገየ መልሶ ማግኛ │ │ └── የሕይወት ዑደት፦ SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts ሂደቱ ሲጀምር ሁሉንም SERVICES[] ያስነሳል │ +│ bootstrap.ts ሂደቱ ሲጀምር ሁሉንም SERVICES[] ያስነሳል │ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts ወቅታዊ GET /v1/models → service_models ሰንጠረዥ │ -│ ringBuffer.ts ክብ የሎግ ቋት (ለእያንዳንዱ አገልግሎት 5 MB) │ -│ healthCheck.ts በየጊዜው የሚጠይቅ HTTP የጤና መመርመሪያ │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (የጫኝ ማስማሚያዎች) │ +│ modelSync.ts ወቅታዊ GET /v1/models → service_models ሰንጠረዥ │ +│ ringBuffer.ts ክብ ቅርጽ ያለው የምዝግብ ቋት (ለእያንዳንዱ አገልግሎት 5 MB)│ +│ healthCheck.ts በየጊዜው የሚጠይቅ HTTP የጤና ምርመራ │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (የመጫኛ አስማሚዎች) │ └──────────────────────┬─────────────────────────────────────────────┘ │ ከOpenAI ጋር ተኳሃኝ HTTP (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ ንብርብር 4 — አቅራቢ / ማዘዋወር │ +│ ንብርብር 4 — አቅራቢ / ማስተላለፊያ │ │ │ │ open-sse/executors/ninerouter.ts │ -│ በእያንዳንዱ ጥያቄ ፖርቱንና API ቁልፉን እንደገና ይፈልጋል (መሸጎጥ የለም)። │ -│ ፕሮክሲ ከማድረጉ በፊት ከሞዴል id ላይ "9router/" ቅድመ ቅጥያን ያስወግዳል።│ -│ ተቆጣጣሪው በ "running" ሁኔታ ካልሆነ 503 service_not_running ይመልሳል።│ +│ ለእያንዳንዱ ጥያቄ ወደቡን እና API ቁልፉን እንደገና ያፈላልጋል (መሸጎጫ የለም)።│ +│ ፕሮክሲ ከማድረጉ በፊት ከሞዴል id የ"9router/" ቅድመ ቅጥያን ያስወግዳል። │ +│ ተቆጣጣሪው በ"running" ሁኔታ ካልሆነ 503 service_not_running ይመልሳል። │ │ │ │ src/shared/constants/providers.ts │ -│ የ"9router" ግቤት፦ isEmbeddedService: true │ +│ የ"9router" ግቤት፦ isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ ሞዴሎች እንደ "9router/{sub}/{model}" (ቅድመ ቅጥያ ያላቸው) ይቀመጣሉ። │ +│ ሞዴሎች እንደ "9router/{sub}/{model}" (ቅድመ ቅጥያ ተጨምሮባቸው) ይከማቻሉ።│ │ በmodelSync.ts በየ5 min ይመሳሰላሉ። │ │ │ -│ Mux የሕይወት ዑደቱ ብቻ ይተዳደራል (ንብርብሮች 1-3) — ይህ የagent- │ -│ ኦርኬስትሬሽን daemon እንጂ LLM ፕሮክሲ አይደለም፤ ስለዚህ የንብርብር 4 │ -│ executor/provider ግቤት የለውም፣ መቼም የማዘዋወር መድረሻ አይሆንም። │ +│ Mux የሕይወት ዑደቱ ብቻ የሚተዳደር ነው (ንብርብሮች 1-3) — ይህ የagent │ +│ ማቀናበሪያ daemon እንጂ LLM ፕሮክሲ አይደለም፤ ስለዚህ የንብርብር 4 │ +│ executor/provider ግቤት የለውም፣ እንዲሁም ፈጽሞ የማስተላለፊያ ዒላማ አይሆንም።│ └────────────────────────────────────────────────────────────────────┘ ``` ### ቁልፍ የምንጭ ፋይሎች -| ፋይል | ሚና | -| ------------------------------------------- | -------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | ዋና ክፍል፦ የሕይወት ዑደት፣ መቆለፊያ፣ ጤና፣ የቀለበት ቋት | -| `src/lib/services/bootstrap.ts` | በሂደት ደረጃ ምዝገባ እና ራስ-ሰር ማስጀመር | -| `src/lib/services/registry.ts` | ነጠላ ኢንስታንስ ካርታ `tool → supervisor` | -| `src/lib/services/apiKey.ts` | ቁልፍ ማመንጨት፣ በእረፍት ላይ የAES-256-GCM ምስጠራ | -| `src/lib/services/modelSync.ts` | ወቅታዊ የሞዴል ማመሳሰል (5 ደቂቃ) + በጥያቄ ጊዜ | -| `src/lib/services/ringBuffer.ts` | SSE የደንበኝነት ምዝገባ ያለው 5 MB ክብ የሎግ ቋት | -| `src/lib/services/healthCheck.ts` | HTTP የጤና ፍተሻ (ሊዋቀር የሚችል የጊዜ ልዩነት) | -| `src/lib/services/installers/ninerouter.ts` | ለ9Router npm መጫን/ማዘመን/ማራገፍ | -| `src/lib/services/installers/cliproxy.ts` | ለCLIProxyAPI npm መጫን/ማዘመን/ማራገፍ | -| `src/lib/services/installers/mux.ts` | ለMux npm መጫን/ማዘመን/ማራገፍ | -| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` ረዳት | -| `src/app/api/services/[name]/logs/route.ts` | የጋራ SSE ሎጎች መዳረሻ | -| `open-sse/executors/ninerouter.ts` | የአቅራቢ አስፈጻሚ (ንብርብር 4) | +| ፋይል | ሚና | +| ------------------------------------------- | ----------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | ዋና ክፍል፦ የሕይወት ዑደት፣ መቆለፊያ፣ ጤናማነት፣ የቀለበት ቋት | +| `src/lib/services/bootstrap.ts` | የሂደት-ደረጃ ምዝገባ እና ራስ-ሰር ማስጀመር | +| `src/lib/services/registry.ts` | ነጠላ አብነት ካርታ `መሣሪያ → ተቆጣጣሪ` | +| `src/lib/services/apiKey.ts` | የቁልፍ ማመንጨት፣ AES-256-GCM በማከማቻ ላይ ምስጠራ | +| `src/lib/services/modelSync.ts` | ወቅታዊ የሞዴል ማመሳሰል (5 ደቂቃ) + ሲጠየቅ | +| `src/lib/services/ringBuffer.ts` | SSE ምዝገባ ያለው 5 MB ክብ የምዝግብ ቋት | +| `src/lib/services/healthCheck.ts` | የHTTP ጤናማነት ምርመራ (ክፍተቱ ሊዋቀር የሚችል) | +| `src/lib/services/installers/ninerouter.ts` | ለ9Router npm መጫን/ማዘመን/ማራገፍ | +| `src/lib/services/installers/cliproxy.ts` | ለCLIProxyAPI npm መጫን/ማዘመን/ማራገፍ | +| `src/lib/services/installers/mux.ts` | ለMux npm መጫን/ማዘመን/ማራገፍ | +| `src/lib/services/installers/openwa.ts` | ለopen-wa npm መጫን/ማዘመን/ማራገፍ | +| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` ረዳት | +| `src/app/api/services/[name]/logs/route.ts` | የጋራ SSE ምዝግቦች መዳረሻ | +| `open-sse/executors/ninerouter.ts` | የአቅራቢ አስፈጻሚ (ንብርብር 4) | --- @@ -207,56 +209,56 @@ --- -## 4. የAPI ማጣቀሻ +## 4. API ማጣቀሻ -በ`/api/services/` ስር ያሉ ሁሉም routes **LOCAL_ONLY** ናቸው (loopback ብቻ፣ ጥብቅ ደንብ #17)። -ከloopback ውጭ የሆኑ ጥያቄዎች auth token ቢኖራቸውም `403 LOCAL_ONLY` ይቀበላሉ። +በ`/api/services/` ስር ያሉ ሁሉም መስመሮች **LOCAL_ONLY** ናቸው (loopback ብቻ፣ ጥብቅ ደንብ #17)። +loopback ያልሆኑ ጥያቄዎች የማረጋገጫ ቶከኑ ምንም ይሁን ምን `403 LOCAL_ONLY` ይቀበላሉ። -### 4.1 የ9Router endpoints (11 routes) +### 4.1 የ9Router መዳረሻዎች (11 መስመሮች) #### `POST /api/services/9router/install` -9Routerን ከnpm ይጫናል። የራሱ `package.json` እና `node_modules/` ያሉትን -`DATA_DIR/services/9router/` ይፈጥራል። ከOmniRoute የራሱ deps ጋር አይጋጭም። +9Routerን ከnpm ይጫናል። የራሱን `package.json` እና `node_modules/` የያዘ +`DATA_DIR/services/9router/` ይፈጥራል። ከOmniRoute የራሱ ጥገኞች ጋር አይጋጭም። -**የጥያቄ አካል** (ሁሉም አማራጭ ናቸው): +**የጥያቄ ይዘት** (ሁሉም አማራጭ ናቸው): ```json { "version": "latest" } ``` -| መስክ | ዓይነት | ነባሪ | መግለጫ | -| --------- | -------- | ---------- | -------------------------------- | -| `version` | `string` | `"latest"` | የሚጫነው npm version tag ወይም semver | +| መስክ | ዓይነት | ነባሪ | መግለጫ | +| --------- | -------- | ---------- | ----------------------------- | +| `version` | `string` | `"latest"` | የሚጫነው የnpm ስሪት መለያ ወይም semver | **ምላሾች:** -| ሁኔታ | መግለጫ | -| ----- | ---------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | ልክ ያልሆነ የጥያቄ አካል (የZod ማረጋገጫ አልተሳካም) | -| `409` | አስቀድሞ በመጫን ላይ ነው (መቆለፊያው ተይዟል) | -| `500` | npm install አልተሳካም — ቀላል የስህተት መልዕክት ለማየት `message`ን ይመልከቱ | +| ሁኔታ | መግለጫ | +| ----- | ------------------------------------------------------ | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | ልክ ያልሆነ የጥያቄ ይዘት (የZod ማረጋገጫ አለመሳካት) | +| `409` | ቀድሞውኑ በመጫን ላይ ነው (መቆለፊያው ተይዟል) | +| `500` | የnpm ጭነት አልተሳካም — ለግልጽ የስህተት መልዕክት `message`ን ይመልከቱ | **ማስታወሻዎች:** `execFile('npm', [...])`ን ይጠቀማል — shell የለም፣ interpolation የለም (ጥብቅ ደንብ #13)። -የEACCES ስህተቶች በቀላሉ ሊገቡ እንደሚችሉ መልዕክቶች ይቀርባሉ። +የEACCES ስህተቶች ግልጽና ተስማሚ መልዕክቶች ሆነው ይቀርባሉ። --- #### `POST /api/services/9router/start` -9Routerን ያስጀምራል። አስቀድሞ ካልተመዘገበ supervisor ይመዘግባል፣ ከዚያ -`supervisor.start()`ን ይጠራል። አስቀድሞ እየሰራ ከሆነ idempotent ነው። +9Routerን ያስጀምራል። አስቀድሞ ካልተመዘገበ supervisorን ይመዘግባል፣ ከዚያም +`supervisor.start()`ን ይጠራል። አስቀድሞ እየሰራ ከሆነ በተደጋጋሚ መጥራት ተመሳሳይ ውጤት ይሰጣል። -**የጥያቄ አካል:** የለም +**የጥያቄ ይዘት:** የለም **ምላሾች:** -| ሁኔታ | መግለጫ | -| ----- | ---------------------------------------------- | -| `200` | `ServiceStatus` object (ከታች ያለውን schema ይመልከቱ) | -| `409` | 9Router አልተጫነም (`status: "not_installed"`) | -| `503` | መጀመር አልተሳካም (የሂደት ስህተት — `lastError`ን ይመልከቱ) | +| ሁኔታ | መግለጫ | +| ----- | ------------------------------------------------- | +| `200` | `ServiceStatus` ነገር (ከታች ያለውን schema ይመልከቱ) | +| `409` | 9Router አልተጫነም (`status: "not_installed"`) | +| `503` | ማስጀመር አልተሳካም (የprocess ስህተት — `lastError`ን ይመልከቱ) | **የServiceStatus schema:** @@ -276,10 +278,10 @@ #### `POST /api/services/9router/stop` -9Routerን በተገቢው ሁኔታ ያቆማል። SIGTERM ይልካል፣ 15 s ይጠብቃል፣ አሁንም በሕይወት ካለ ከዚያ SIGKILL ይልካል። -አስቀድሞ ቆሞ ከሆነ idempotent ነው። +9Routerን በሥርዓት ያቆማል። SIGTERMን ይልካል፣ 15 s ይጠብቃል፣ ከዚያም አሁንም እየሰራ ከሆነ SIGKILLን ይልካል። +አስቀድሞ ቆሞ ከሆነ በተደጋጋሚ መጥራት ተመሳሳይ ውጤት ይሰጣል። -**የጥያቄ አካል:** የለም +**የጥያቄ ይዘት:** የለም **ምላሾች:** @@ -292,9 +294,9 @@ #### `POST /api/services/9router/restart` -በክወና መቆለፊያው ውስጥ `stop()` ከዚያ `start()` ከማድረግ ጋር ተመሳሳይ ነው። +በክወና መቆለፊያው ስር `stop()`ን ከዚያም `start()`ን ከመጥራት ጋር ተመሳሳይ ነው። -**የጥያቄ አካል:** የለም +**የጥያቄ ይዘት:** የለም **ምላሾች:** ከ`start` ጋር ተመሳሳይ ናቸው (የመጨረሻውን `ServiceStatus` ይመልሳል)። @@ -302,11 +304,11 @@ #### `POST /api/services/9router/update` -9Routerን ወደ አዲስ npm version ያዘምናል። አገልግሎቱ እየሰራ ከሆነ በመጀመሪያ -ይቆማል፣ npm install ይካሄዳል (አዲሱን version በቦታው ላይ ይጭናል)፣ ከዚያም +9Routerን ወደ አዲስ የnpm ስሪት ያዘምናል። አገልግሎቱ እየሰራ ከሆነ በመጀመሪያ +ይቆማል፣ npm install ይከናወናል (አዲሱን ስሪት በነባሩ ቦታ ላይ በመጫን)፣ ከዚያም አገልግሎቱ እንደገና ይጀምራል። -**የጥያቄ አካል** (ሁሉም አማራጭ ናቸው): +**የጥያቄ ይዘት** (ሁሉም አማራጭ ናቸው): ```json { "version": "latest" } @@ -317,40 +319,43 @@ | ሁኔታ | መግለጫ | | ----- | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | ልክ ያልሆነ አካል | -| `500` | npm update አልተሳካም | +| `400` | ልክ ያልሆነ ይዘት | +| `500` | የnpm ማዘመን አልተሳካም | --- #### `POST /api/services/9router/rotate-key` -ለ9Router አዲስ API ቁልፍ ያመነጫል፣ በማከማቻ ላይ ሳለ ያመሰጥረዋል፣ እና አገልግሎቱ እየሰራ ከሆነ አዲሱን ቁልፍ ከአካባቢው እንዲወስድ ዳግም ያስጀምረዋል። የቀድሞው ቁልፍ ወዲያውኑ ዋጋ አልባ ይደረጋል። +ለ9Router አዲስ API ቁልፍ ያመነጫል፣ በማከማቻ ላይ እያለ ያመሰጥረዋል፣ እና አገልግሎቱ +እየሰራ ከሆነ አዲሱን ቁልፍ ከenvironment እንዲያገኝ እንደገና ያስጀምረዋል። አሮጌው ቁልፍ +ወዲያውኑ ዋጋ እንዳይኖረው ይደረጋል። -**የጥያቄ አካል፦** የለም +**የጥያቄ ይዘት:** የለም -**ምላሾች፦** +**ምላሾች:** | ሁኔታ | መግለጫ | | ----- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | ቁልፍ ማዞር አልተሳካም | +| `500` | የቁልፍ መቀየር አልተሳካም | -**ደህንነት፦** አዲሱ ቁልፍ በምላሹ ውስጥ ፈጽሞ አይመለስም (የማረጋገጫ መረጃ እንዳይፈስ)። በ`version_manager` ሰንጠረዥ ውስጥ ተመስጥሮ (AES-256-GCM) ይከማቻል። +**ደህንነት:** አዲሱ ቁልፍ በምላሹ ውስጥ ፈጽሞ አይመለስም (የምስክርነት መረጃ እንዳይጋለጥ)። +በ`version_manager` ሰንጠረዥ ውስጥ ተመስጥሮ (AES-256-GCM) ይከማቻል። --- #### `GET /api/services/9router/status` -የስሪት ሜታዳታን እና የAPI ቁልፍ ቅድመ ዕይታን ጨምሮ የተጣመረ የቀጥታ + DB ሁኔታን ይመልሳል። +የስሪት metadataን እና የAPI ቁልፍ ቅድመ ዕይታን ጨምሮ የቀጥታ + DB ሁኔታን በአንድ ላይ ይመልሳል። -**ምላሾች፦** +**ምላሾች:** | ሁኔታ | መግለጫ | | ----- | --------------------- | -| `200` | ከታች ያለውን መርሐግብር ይመልከቱ | -| `500` | የሁኔታ ንባብ አልተሳካም | +| `200` | ከታች ያለውን schema ይመልከቱ | +| `500` | ሁኔታን ማንበብ አልተሳካም | -**የምላሽ መርሐግብር፦** +**የምላሽ schema:** ```json { @@ -374,43 +379,44 @@ #### `POST /api/services/9router/auto-start` -የራስ-ሰር ማስጀመሪያ ጠቋሚውን ያብሩ ወይም ያጥፉ። `enabled: true` ሲሆን፣ በሚቀጥለው ጊዜ OmniRoute ሲነሳ አገልግሎቱ በራስ-ሰር ይጀምራል (አገልግሎቱ ከተጫነ)። +የራስ-ሰር ማስጀመሪያ ምልክቱን ያበራል ወይም ያጠፋል። `enabled: true` ሲሆን፣ በሚቀጥለው ጊዜ +OmniRoute ሲነሳ አገልግሎቱ በራስ-ሰር ይጀምራል (አገልግሎቱ ከተጫነ)። -**የጥያቄ አካል፦** +**የጥያቄ ይዘት:** ```json { "enabled": true } ``` -**ምላሾች፦** +**ምላሾች:** | ሁኔታ | መግለጫ | | ----- | --------------------- | | `200` | `{ autoStart: true }` | -| `400` | ልክ ያልሆነ አካል | +| `400` | ልክ ያልሆነ ይዘት | --- #### `GET /api/services/9router/logs` -ከ9Router stdout/stderr ቀለበታዊ ቋት የሚመጡ የቀጥታ ምዝግቦች SSE ዥረት። +ከ9Router stdout/stderr ring buffer የሚመጡ የቀጥታ ምዝግቦች የSSE stream። -**የመጠይቅ መለኪያዎች፦** +**የQuery መለኪያዎች:** -| መለኪያ | ዓይነት | ነባሪ | መግለጫ | -| -------- | --------- | --- | ---------------------------------------------------------- | -| `tail` | `integer` | 200 | በመጀመሪያ የሚላኩ የታሪክ መስመሮች ብዛት (ከፍተኛው 1000) | -| `filter` | `string` | የለም | የፊደል መጠንን የማይለይ ንዑስ ሕብረቁምፊ ማጣሪያ (regex የለም — ከReDoS የተጠበቀ) | +| መለኪያ | ዓይነት | ነባሪ | መግለጫ | +| -------- | --------- | --- | --------------------------------------------------------------- | +| `tail` | `integer` | 200 | በመጀመሪያ የሚላኩ የታሪካዊ መስመሮች ብዛት (ከፍተኛው 1000) | +| `filter` | `string` | የለም | ለፊደል መጠን ልዩነት ግድ የሌለው substring filter (regex የለም — ReDoS-safe) | -**የSSE ክስተቶች፦** +**የSSE ክስተቶች:** -| ክስተት | ውሂብ | መግለጫ | -| ----------- | ----------- | --------------------- | -| `snapshot` | `LogLine[]` | የመጀመሪያ ታሪካዊ የመጨረሻ ክፍል | -| `log` | `LogLine` | የቀጥታ ምዝግብ መስመር | -| `heartbeat` | `{}` | በየ15 ሰከንዱ ግንኙነትን ማቆየት | +| ክስተት | ውሂብ | መግለጫ | +| ----------- | ----------- | ----------------------- | +| `snapshot` | `LogLine[]` | የመጀመሪያ ታሪካዊ የመጨረሻ መስመሮች | +| `log` | `LogLine` | የቀጥታ ምዝግብ መስመር | +| `heartbeat` | `{}` | በየ15 s የሚላክ keep-alive | -**የLogLine መርሐግብር፦** +**የLogLine schema:** ```json { @@ -420,83 +426,128 @@ } ``` -**ምላሾች፦** +**ምላሾች:** | ሁኔታ | መግለጫ | | ----- | ---------------------------------------- | | `200` | `text/event-stream` | | `400` | የ`filter` መለኪያው በጣም ረጅም ነው (> 200 ቁምፊዎች) | -| `404` | አገልግሎቱ አልተገኘም (በተቆጣጣሪው ውስጥ አልተመዘገበም) | +| `404` | አገልግሎቱ አልተገኘም (ተቆጣጣሪው አልተመዘገበም) | --- -### 4.2 የCLIProxyAPI የመዳረሻ ነጥቦች (10 መስመሮች) +### 4.2 የCLIProxyAPI መጨረሻ ነጥቦች (10 መስመሮች) -CLIProxyAPI ከ`rotate-key` በስተቀር ከ9Router ጋር ተመሳሳይ የመዳረሻ ነጥብ ቅርጽ አለው፤ በተጨማሪም `accounts`፣ `provider-expose` እና `auto-restart-adopted` አሉት። አሁን በማስጀመር ጊዜ የሚወከል የተለየ የውሂብ-አውታር API ቁልፍ ይቀበላል (`needsApiKey: true` በ`bootstrap.ts` ውስጥ፣ ለሞዴል ማመሳሰል የሚውል)፤ `status` ያነሱ መስኮችን ያካትታል። +CLIProxyAPI ከ`rotate-key` በስተቀር ከ9Router ጋር ተመሳሳይ የመጨረሻ ነጥብ ቅርጽ አለው፤ በተጨማሪም +`accounts`፣ `provider-expose` እና `auto-restart-adopted` አሉት። አሁን በማስጀመሪያ ጊዜ የሚከተት +ራሱን የቻለ የውሂብ-አውታር API ቁልፍ ይቀበላል (`needsApiKey: true` በ +`bootstrap.ts` ውስጥ፣ ለሞዴል ማመሳሰል የሚያገለግል)፤ `status` ጥቂት መስኮችን ያካትታል። -| ዘዴ | ዱካ | መግለጫ | -| ------ | ----------------------------------- | ---------------------------------- | -| `POST` | `/api/services/cliproxy/install` | CLIProxyAPIን ከnpm ይጫኑ | -| `POST` | `/api/services/cliproxy/start` | CLIProxyAPIን ያስጀምሩ | -| `POST` | `/api/services/cliproxy/stop` | CLIProxyAPIን ያቁሙ | -| `POST` | `/api/services/cliproxy/restart` | CLIProxyAPIን ዳግም ያስጀምሩ | -| `POST` | `/api/services/cliproxy/update` | ወደ አዲስ ስሪት ያዘምኑ | -| `GET` | `/api/services/cliproxy/status` | የቀጥታ + DB ሁኔታ (`apiKeyMasked` የለም) | -| `POST` | `/api/services/cliproxy/auto-start` | ራስ-ሰር ማስጀመርን ያብሩ ወይም ያጥፉ | +| ዘዴ | ዱካ | መግለጫ | +| ------ | ----------------------------------- | --------------------------------- | +| `POST` | `/api/services/cliproxy/install` | CLIProxyAPIን ከnpm ጫን | +| `POST` | `/api/services/cliproxy/start` | CLIProxyAPIን አስጀምር | +| `POST` | `/api/services/cliproxy/stop` | CLIProxyAPIን አቁም | +| `POST` | `/api/services/cliproxy/restart` | CLIProxyAPIን እንደገና አስጀምር | +| `POST` | `/api/services/cliproxy/update` | ወደ አዲስ ስሪት አዘምን | +| `GET` | `/api/services/cliproxy/status` | ቀጥታ + DB ሁኔታ (`apiKeyMasked` የለም) | +| `POST` | `/api/services/cliproxy/auto-start` | ራስ-ሰር ማስጀመርን አብራ/አጥፋ | -የጋራው `GET /api/services/{name}/logs` የመዳረሻ ነጥብ (§4.1ን ይመልከቱ) የ`[name]` ተለዋዋጭ ክፍልን በመጠቀም ለአራቱም አገልግሎቶች ይሰራል። +የጋራው `GET /api/services/{name}/logs` መጨረሻ ነጥብ (§4.1ን ይመልከቱ) የ`[name]` +ተለዋዋጭ ክፍልን በመጠቀም ለአራቱም አገልግሎቶች ይሠራል። --- -### 4.3 የMux መዳረሻ ነጥቦች (8 መስመሮች) +### 4.3 የMux መጨረሻ ነጥቦች (8 መስመሮች) -Mux ከCLIProxyAPI ጋር ተመሳሳይ የመዳረሻ ነጥብ ቅርጽ አለው — በAPI ወለል ላይ የ`rotate-key` መስመር የለም (የbearer token በ`getOrCreateApiKey("mux")` በኩል እንደ9Router ተመሳሳይ መንገድ ይመነጫል እና በ`MUX_SERVER_AUTH_TOKEN` የአካባቢ ተለዋዋጭ በኩል ይወከላል፣ ነገር ግን እስካሁን የተለየ የማዞሪያ መዳረሻ ነጥብ የለም)። Mux የሚተዳደረው በሕይወት-ዑደት ብቻ ነው፦ እንደ9Router ሳይሆን፣ Layer 4 አስፈጻሚ የለውም እና እንደ የማዞሪያ አቅራቢ ፈጽሞ አይመዘገብም። +Mux ከCLIProxyAPI ጋር ተመሳሳይ የመጨረሻ ነጥብ ቅርጽ አለው — በAPI +ገጽ ላይ የ`rotate-key` መስመር የለም (የbearer token ልክ እንደ9Router +በ`getOrCreateApiKey("mux")` ይፈጠራል እና በ`MUX_SERVER_AUTH_TOKEN` የአካባቢ ተለዋዋጭ +በኩል ይከተታል፣ ነገር ግን እስካሁን ራሱን የቻለ የማዞሪያ መጨረሻ ነጥብ የለም)። Mux በሕይወት-ዑደት +ብቻ የሚተዳደር ነው፦ ከ9Router በተለየ የንብርብር 4 አስፈጻሚ የለውም እና እንደ ማዞሪያ አቅራቢ ፈጽሞ አይመዘገብም። -| ዘዴ | ዱካ | መግለጫ | -| ------ | ------------------------------ | --------------------------- | -| `POST` | `/api/services/mux/install` | Muxን ከnpm ይጫኑ (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Muxን ያስጀምሩ (`mux server`) | -| `POST` | `/api/services/mux/stop` | Muxን ያቁሙ | -| `POST` | `/api/services/mux/restart` | Muxን ዳግም ያስጀምሩ | -| `POST` | `/api/services/mux/update` | ወደ አዲስ የnpm ስሪት ያዘምኑ | -| `GET` | `/api/services/mux/status` | የቀጥታ + DB ሁኔታ | -| `POST` | `/api/services/mux/auto-start` | ራስ-ሰር ማስጀመርን ያብሩ ወይም ያጥፉ | +| ዘዴ | ዱካ | መግለጫ | +| ------ | ------------------------------ | -------------------------- | +| `POST` | `/api/services/mux/install` | Muxን ከnpm ጫን (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Muxን አስጀምር (`mux server`) | +| `POST` | `/api/services/mux/stop` | Muxን አቁም | +| `POST` | `/api/services/mux/restart` | Muxን እንደገና አስጀምር | +| `POST` | `/api/services/mux/update` | ወደ አዲስ የnpm ስሪት አዘምን | +| `GET` | `/api/services/mux/status` | ቀጥታ + DB ሁኔታ | +| `POST` | `/api/services/mux/auto-start` | ራስ-ሰር ማስጀመርን አብራ/አጥፋ | --- -### 4.4 የBifrost መዳረሻ ነጥቦች (8 መስመሮች) +### 4.4 የBifrost መጨረሻ ነጥቦች (8 መስመሮች) -Bifrost በGo የተገነባ AI-ጌትዌይ ማስተላለፊያ የኋላ-ጫፍ ነው (`@maximhq/bifrost`)። ከCLIProxyAPI ጋር ተመሳሳይ የመዳረሻ ነጥብ ቅርጽ ይጠቀማል (`rotate-key` የለም — Bifrost በ`-app-dir` ስር ባለው `config.json` ውስጥ የራሱን የአቅራቢ ቁልፎች ያስተዳድራል)። +Bifrost የGo AI-መግቢያ ቅብብል ጀርባ-ክፍል ነው (`@maximhq/bifrost`)። ከCLIProxyAPI ጋር ተመሳሳይ +የመጨረሻ ነጥብ ቅርጽ ይጠቀማል (`rotate-key` የለም — Bifrost የራሱን የአቅራቢ +ቁልፎች በ`-app-dir` ስር በ`config.json` ውስጥ ያስተዳድራል)። -| ዘዴ | መንገድ | መግለጫ | -| ------ | ---------------------------------- | ----------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Bifrostን ከ npm (`@maximhq/bifrost`) ይጫኑ | -| `POST` | `/api/services/bifrost/start` | Bifrostን በ8080 ፖርት (ነባሪ) ያስጀምሩ | -| `POST` | `/api/services/bifrost/stop` | Bifrostን ያቁሙ | -| `POST` | `/api/services/bifrost/restart` | Bifrostን እንደገና ያስጀምሩ | -| `POST` | `/api/services/bifrost/update` | ወደ አዲስ ስሪት ያዘምኑ | -| `GET` | `/api/services/bifrost/status` | የቀጥታ + DB ሁኔታ | -| `POST` | `/api/services/bifrost/auto-start` | ራስ-ሰር ማስጀመርን ያብሩ/ያጥፉ | -| `GET` | `/api/services/bifrost/logs` | የSSE ሎግ መጨረሻ (በጋራ `[name]/logs` ተለዋዋጭ መስመር በኩል) | +| ዘዴ | ዱካ | መግለጫ | +| ------ | ---------------------------------- | ------------------------------------------------ | +| `POST` | `/api/services/bifrost/install` | Bifrostን ከnpm ጫን (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Bifrostን በወደብ 8080 አስጀምር (ነባሪ) | +| `POST` | `/api/services/bifrost/stop` | Bifrostን አቁም | +| `POST` | `/api/services/bifrost/restart` | Bifrostን እንደገና አስጀምር | +| `POST` | `/api/services/bifrost/update` | ወደ አዲስ ስሪት አዘምን | +| `GET` | `/api/services/bifrost/status` | ቀጥታ + DB ሁኔታ | +| `POST` | `/api/services/bifrost/auto-start` | ራስ-ሰር ማስጀመርን አብራ/አጥፋ | +| `GET` | `/api/services/bifrost/logs` | የSSE ምዝግብ ጭራ (በጋራው `[name]/logs` ተለዋዋጭ መስመር በኩል) | -**የራውቲንግ ውቅር:** `BIFROST_BASE_URL` ካልተቀናበረ እና ቁጥጥር ስር ያለው Bifrost -ኢንስታንስ እየሰራ ከሆነ፣ `getBifrostRoutingConfig()` (`routingBackend.ts` ውስጥ) በራስ-ሰር -`http://127.0.0.1:{port}`ን እንደ የሪሌይ መሠረታዊ URL ይጠቀማል። በግልጽ የተቀናበረ `BIFROST_BASE_URL` የአካባቢ ተለዋዋጭ -ሁልጊዜ ቅድሚያ ይኖረዋል። +**የማዞሪያ ሽቦ ግንኙነት፦** `BIFROST_BASE_URL` ካልተዋቀረ እና በቁጥጥር ስር ያለው የBifrost +አብነት እየሠራ ከሆነ፣ `getBifrostRoutingConfig()` (`routingBackend.ts` ውስጥ) `http://127.0.0.1:{port}`ን +በራስ-ሰር እንደ የቅብብል መሠረታዊ URL ይጠቀማል። በግልጽ የተዋቀረ `BIFROST_BASE_URL` የአካባቢ +ተለዋዋጭ ሁልጊዜ ቅድሚያ ይኖረዋል። --- ### 4.5 የDario መጨረሻ ነጥቦች (12 መስመሮች) -እንደ ሌሎቹ አገልግሎቶች ተመሳሳይ የሕይወት ዑደት ቅርጽ (`install`፣ `start`፣ `stop`፣ `restart`፣ -`update`፣ `status`፣ `auto-start`፣ `auto-restart-adopted`) እንዲሁም በ`admin/` ስር በቶከን የተጠበቀ OAuth -መቆጣጠሪያ አለ፦ `admin/accounts`፣ `admin/import-from-omniroute`፣ +ከሌሎቹ አገልግሎቶች ጋር ተመሳሳይ የሕይወት-ዑደት ቅርጽ (`install`፣ `start`፣ `stop`፣ `restart`፣ +`update`፣ `status`፣ `auto-start`፣ `auto-restart-adopted`) አለው፤ በተጨማሪም በ`admin/` ስር +በtoken የተገደበ OAuth መቆጣጠሪያ አውታር አለው፦ `admin/accounts`፣ `admin/import-from-omniroute`፣ `admin/login-start`፣ `admin/login-complete` (ሁሉም በ`DARIO_ADMIN_TOKEN` የተጠበቁ ናቸው)። -### 4.6 ተቃራኒ ፕሮክሲ (የ9Router ዳሽቦርድ መክተቻ) +### 4.6 የopen-wa መጨረሻ ነጥቦች (7 መስመሮች) + +open-wa (`@open-wa/wa-automate`) WhatsApp Webን በራስ-ሰር ለማስኬድ ያለራስ የChromium አብነትን +(በPuppeteer በኩል) ያንቀሳቅሳል። ከMux ጋር ተመሳሳይ የመጨረሻ ነጥብ ቅርጽ ይጠቀማል (እስካሁን +የ`rotate-key` መስመር የለም)። በሕይወት-ዑደት ብቻ የሚተዳደር ነው — የማዞሪያ ዒላማ አይደለም፣ +የንብርብር 4 አስፈጻሚ/አቅራቢ ግቤትም የለውም። + +| ዘዴ | ዱካ | መግለጫ | +| ------ | --------------------------------- | --------------------------------------------- | +| `POST` | `/api/services/openwa/install` | open-waን ከnpm (`@open-wa/wa-automate`) ይጫኑ | +| `POST` | `/api/services/openwa/start` | open-waን በወደብ 8323 (ነባሪ) ያስጀምሩ | +| `POST` | `/api/services/openwa/stop` | open-waን ያቁሙ | +| `POST` | `/api/services/openwa/restart` | open-waን እንደገና ያስጀምሩ | +| `POST` | `/api/services/openwa/update` | ወደ አዲስ ስሪት ያዘምኑ | +| `GET` | `/api/services/openwa/status` | ቀጥታ + DB ሁኔታ | +| `POST` | `/api/services/openwa/auto-start` | ራስ-ሰር ማስጀመርን ያብሩ/ያጥፉ | +| `GET` | `/api/services/openwa/logs` | የSSE ሎግ ጭራ (በጋራ `[name]/logs` ተለዋዋጭ መስመር በኩል) | + +**የAPI ቁልፍ፦** እንደ `WA_KEY` ይገባል — የopen-wa አጠቃላይ `WA_*`-ቅድመ ቅጥያ ያለው የenv +መሻሪያ ወደ `--key`/`-k` CLI አማራጭ ያዛምደዋል +(`dist/cli/setup.js::envArgs()`፣ ከተጫነው 4.76.0 +package ጋር ተረጋግጧል)። በ`generateServiceApiKey()` ሲመነጭ `ow_` ቅድመ ቅጥያ ይኖረዋል። open-wa +ቁልፉን ከ`key`/`api_key` HTTP ራስጌ መልሶ ያነባል (`Authorization: +Bearer` አይደለም)፤ `/api-docs*` በግልጽ ከፍተሻው ነፃ ተደርጓል +(`setupAuthenticationLayer` በ`dist/cli/server.js` ውስጥ)፣ ስለዚህ የጤና ምርመራው +የማረጋገጫ ራስጌ አያስፈልገውም። + +**ማጣመር፦** open-wa ይፋዊ ያልሆነና ከWhatsApp ጋር ግንኙነት የሌለው ነው — +የተገናኘው ቁጥር በWhatsApp የራስ-ሰር ሥራ መለያ ምክንያት የመታገድ ስጋት አለበት። +በመጀመሪያው ማስጀመር ጊዜ የማጣመሪያ QR ኮድ ወደ stdout ይታተማል፣ እናም በነባሩ +የሎጎች ፓነል/SSE ዥረት በኩል ይታያል — በዚህ ውህደት ውስጥ እስካሁን የተለየ የQR-ምስል መጨረሻ ነጥብ +የለም። + +--- + +### 4.7 ተቃራኒ ፕሮክሲ (የ9Router ዳሽቦርድ መክተቻ) -ዳሽቦርዱ የ9Router ድር UIን በውስጣዊ ተቃራኒ -ፕሮክሲ በኩል በiframe ውስጥ ያካትታል፦ +ዳሽቦርዱ የ9Router የድር UIን በiframe ውስጥ በውስጣዊ ተቃራኒ +ፕሮክሲ በኩል ይከትታል፦ ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -505,17 +556,17 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] ይህ ፕሮክሲ፦ - ጥያቄውን ወደ `http://127.0.0.1:{port}/{path}` ያስተላልፋል (loopback ብቻ) -- ገቢ `cookie` እና `authorization` ራስጌዎችን ያስወግዳል (የOmniRoute ክፍለ ጊዜ መረጃ እንዳይፈስ) -- ለ9Router ማረጋገጫ `Authorization: Bearer {apiKey}`ን ያስገባል -- ከምላሹ `set-cookie`፣ `content-security-policy`፣ `x-frame-options`፣ `cross-origin-*`ን ያስወግዳል -- ``ን ለማስገባት እና ፍጹም መንገዶችን መደበኛ ለማድረግ (`/foo` → `/dashboard/.../embed/foo`) የHTML ምላሾችን እንደገና ይጽፋል +- ገቢ `cookie` እና `authorization` ራስጌዎችን ያስወግዳል (የOmniRoute ክፍለ ጊዜ እንዳይፈስ) +- ለ9Router ማረጋገጫ `Authorization: Bearer {apiKey}` ያስገባል +- `set-cookie`፣ `content-security-policy`፣ `x-frame-options`፣ `cross-origin-*`ን ከምላሹ ያስወግዳል +- ``ን ለማስገባት እና ፍጹም ዱካዎችን መደበኛ ለማድረግ (`/foo` → `/dashboard/.../embed/foo`) የHTML ምላሾችን እንደገና ይጽፋል -ለተካተተው ዳሽቦርድ የWebSocket ማሻሻያዎች በተለየ -ፖርት ላይ ባለ አጋር አገልጋይ ይስተናገዳሉ (`src/lib/services/embedWsProxy.ts`ን ይመልከቱ)። +ለተከተተው ዳሽቦርድ የWebSocket ማሻሻያዎች በተለየ +ወደብ ላይ ባለ አጋር አገልጋይ ይከናወናሉ (`src/lib/services/embedWsProxy.ts`ን ይመልከቱ)። -**ደህንነት:** የመክተቻ ፕሮክሲ መስመሮች በ`LOCAL_ONLY_API_PREFIXES` ስር የተመደቡ ሲሆን -ከloopback ብቻ ሊደረስባቸው ይችላል። በCloudflare/Ngrok ቱነል በኩል JWT ያገኘ አጥቂ -ወደ ተካተቱ አገልግሎቶች በፕሮክሲ መግባት አይችልም። +**ደህንነት፦** የመክተቻ ፕሮክሲ መስመሮች በ`LOCAL_ONLY_API_PREFIXES` +ስር የተመደቡ ሲሆን ከloopback ብቻ ሊደረስባቸው ይችላል። በ +Cloudflare/Ngrok tunnel በኩል JWT ያገኘ አጥቂ ወደ ተከተቱ አገልግሎቶች ፕሮክሲ ማድረግ አይችልም። --- diff --git a/docs/i18n/am/docs/frameworks/MEMORY.md b/docs/i18n/am/docs/frameworks/MEMORY.md index 8f5d8068fb64..ddbac50ad20f 100644 --- a/docs/i18n/am/docs/frameworks/MEMORY.md +++ b/docs/i18n/am/docs/frameworks/MEMORY.md @@ -149,35 +149,36 @@ RRF በልዩ ልዩ retrieval systems መካከል የውጤት መደበኛነ ## የቅንብሮች ቅጥያ -ዘጠኝ የembedding እና vector መስኮች በ`MemorySettingsExtended` ውስጥ፣ -በ`src/shared/schemas/memory.ts` ይገኛሉ፤ በ`src/lib/db/settings.ts` በኩል ዘላቂ ሆነው ይቀመጣሉ፦ - -| መስክ | ዓይነት | ነባሪ | መግለጫ | -| ------------------------ | -------------------------------------------------- | -------- | ---------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | የትኛውን የembedding ምንጭ መጠቀም እንዳለበት | -| `embeddingProviderModel` | `string \| null` | `null` | አቅራቢ/ሞዴል በ`provider/model` ቅርጸት | -| `customBaseUrl` | `string \| null` | `null` | ለማህደረ ትውስታ ብቻ የሚያገለግል OpenAI-ተኳኋኝ endpoint መሠረታዊ URL | -| `customModelId` | `string \| null` | `null` | ወደብጁ endpoint የሚላክ የሞዴል ID | -| `transformersEnabled` | `boolean` | `false` | ለTransformers.js በፈቃደኝነት ማንቃት (MiniLM፣ ~400MB) | -| `staticEnabled` | `boolean` | `false` | ለአካባቢያዊው ቋሚ potion-base-8M ሞዴል በፈቃደኝነት ማንቃት | -| `rerankEnabled` | `boolean` | `false` | እንደገና የደረጃ አሰጣጥ ደረጃን ማንቃት (+200-500ms/req ይጨምራል) | -| `rerankProviderModel` | `string \| null` | `null` | የእንደገና ደረጃ አሰጣጥ አቅራቢ/ሞዴል በ`provider/model` ቅርጸት | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | የትኛውን የvector backend መጠቀም እንዳለበት | - -እነዚህ በ`GET /PUT /api/settings/memory` (schema `MemorySettingsExtendedSchema`) በኩል ተደራሽ ተደርገዋል። +ዘጠኝ የመክተቻና የቬክተር መስኮች በ`MemorySettingsExtended` ውስጥ +በ`src/shared/schemas/memory.ts` ይገኛሉ፣ በ`src/lib/db/settings.ts` በኩልም በቋሚነት ይቀመጣሉ፦ + +| መስክ | ዓይነት | ነባሪ | መግለጫ | +| ------------------------ | -------------------------------------------------- | -------- | ------------------------------------------------------ | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | የትኛውን የመክተቻ ምንጭ መጠቀም እንዳለበት | +| `embeddingProviderModel` | `string \| null` | `null` | አቅራቢ/ሞዴል በ`provider/model` ቅርጸት | +| `customBaseUrl` | `string \| null` | `null` | ለMemory ብቻ የሚያገለግል OpenAI-ተኳሃኝ የመዳረሻ ነጥብ መሠረታዊ URL | +| `customModelId` | `string \| null` | `null` | ወደ ብጁ የመዳረሻ ነጥቡ የሚላክ የሞዴል ID | +| `transformersEnabled` | `boolean` | `false` | ለTransformers.js የፈቃድ መርጦ መግባት (MiniLM፣ ~400MB) | +| `staticEnabled` | `boolean` | `false` | ለስታቲክ potion-base-8M አካባቢያዊ ሞዴል የፈቃድ መርጦ መግባት | +| `rerankEnabled` | `boolean` | `false` | የዳግም ደረጃ ማውጣት ደረጃን ማንቃት (በእያንዳንዱ ጥያቄ +200-500ms ይጨምራል) | +| `rerankProviderModel` | `string \| null` | `null` | የዳግም ደረጃ ማውጣት አቅራቢ/ሞዴል በ`provider/model` ቅርጸት | + +`rerankProviderModel` በ`POST /v1/rerank` (በloopback በኩል የሚጠራ) ይፈታል፤ ስለዚህ ያ መንገድ የሚቀበለውን ማንኛውንም ነገር ይቀበላል፦ የተመረጠ የደመና ዳግም-ደረጃ ማውጫ ሞዴል (`cohere/rerank-v3.5`፣ `jina-ai/jina-reranker-v3.5`፣ …) ወይም OpenAI-ተኳሃኝ የአቅራቢ ኖድ እንደ `/` (ለምሳሌ፣ ለTEI/Infinity ሳጥን `skilled-mini/bge-reranker-v2-m3`)። Loopback ኖዶች ሁልጊዜ ብቁ ናቸው፤ በሌላ አስተናጋጅ (LAN፣ Tailscale) ላይ ያለ ኖድ በተጨማሪ የ`RERANK_REMOTE_PROVIDER_NODES` ባህሪ ሰንደቅን ይፈልጋል፣ እንዲሁም የአቅራቢውን ወጪ URL ፖሊሲ ማለፍ አለበት — [የባህሪ ሰንደቆች](../reference/FEATURE_FLAGS.md)ን ይመልከቱ። የዳሽቦርዱ መራጭ የተመረጡ አቅራቢዎችንና አካባቢያዊ ኖዶችን ይዘረዝራል፤ ማንኛውም ትክክለኛ `provider/model` ሕብረቁምፊ በ`PUT /api/settings/memory` በኩል በቀጥታ ሊዋቀር ይችላል። +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | የትኛውን የቬክተር ጀርባ አገልግሎት መጠቀም እንዳለበት | + +እነዚህ በ`GET /PUT /api/settings/memory` (ስኪማ `MemorySettingsExtendedSchema`) በኩል ይቀርባሉ። ለ`remote` ምንጭ፣ Memory አማራጭ የሆኑትን `customBaseUrl` እና -`customModelId` ቅንብሮችም ይቀበላል። እነዚህ በአንድነት ዓለም አቀፉን የembedding registry -ሳይቀይሩ OpenAI-ተኳኋኝ የ`/embeddings` endpoint እና ሞዴል ይመርጣሉ። endpoint ጥቅም ላይ -ከመዋሉ በፊት መደበኛ ቅርጽ ይሰጠዋል፣ እና በአቅራቢው የወጪ URL ፖሊሲ ይፈተሻል፦ HTTP(S) -ያስፈልጋል፣ የተካተቱ የመግቢያ ማረጋገጫዎች እና query strings ውድቅ ይደረጋሉ፣ እንዲሁም -የcloud-metadata አድራሻዎች እንደታገዱ ይቆያሉ። ባዶ እሴቶች የተመረጠውን የregistry አቅራቢ -እንዳለ ያቆዩታል። ወደ dashboard የሚመለሱ ስህተቶች ሚስጥራዊ መረጃ እንዳያካትቱ -ይጣራሉ፣ እና የendpoint የመግቢያ ማረጋገጫዎች ፈጽሞ አይመዘገቡም። - -> **TODO (D20):** የ`global` scope (በሁሉም API keys መካከል ማህደረ ትውስታዎችን መጋራት) -> በዚህ ልቀት ውስጥ አልተተገበረም። የschema ለውጦችን እና ዓለም አቀፍ የretrieval -> መንገድን ይፈልጋል። ለብቻው ይከታተሉት። +`customModelId` ቅንብሮችም ይቀበላል። ሁለቱ በአንድነት፣ ዓለም አቀፉን የመክተቻ መዝገብ ሳይቀይሩ OpenAI-ተኳሃኝ የ`/embeddings` +መዳረሻ ነጥብና ሞዴል ይመርጣሉ። የመዳረሻ ነጥቡ ከመጠቀሙ በፊት +መደበኛ ይደረጋል፣ እንዲሁም በአቅራቢው ወጪ URL ፖሊሲ ይፈተሻል፦ HTTP(S) +ያስፈልጋል፣ የተካተቱ ማረጋገጫዎችና የጥያቄ ሕብረቁምፊዎች ውድቅ ይደረጋሉ፣ እንዲሁም የደመና-ሜታዳታ +አድራሻዎች እንደታገዱ ይቆያሉ። ባዶ እሴቶች የተመረጠውን የመዝገብ አቅራቢ እንዳለ ያቆያሉ። ወደ +ዳሽቦርዱ የሚመለሱ ስህተቶች ከስሱ መረጃ ይጸዳሉ፣ የመዳረሻ ነጥብ ማረጋገጫዎችም በፍጹም አይመዘገቡም። + +> **TODO (D20)፦** `global` ወሰን (በሁሉም API ቁልፎች መካከል ትውስታዎችን ማጋራት) +> በዚህ ልቀት ውስጥ አልተተገበረም። የስኪማ ለውጦችንና ዓለም አቀፍ የመልሶ ማግኛ +> መንገድን ይፈልጋል። በተናጠል ይከታተሉት። ## የማከማቻ ንብርብሮች diff --git a/docs/i18n/am/docs/guides/DOCKER_GUIDE.md b/docs/i18n/am/docs/guides/DOCKER_GUIDE.md index 18e59d40e869..cfa7b430224f 100644 --- a/docs/i18n/am/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/am/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## ፈጣን ማስኬድ +> **በአንድ ትዕዛዝ በራስዎ ማስተናገድ ይፈልጋሉ?** +> [በራስዎ የማስተናገድ መመሪያን](../getting-started/SELF_HOST_GUIDE.md) ይመልከቱ — +> `docker compose -f docker-compose.selfhost.yml up -d` (የታተመ image + +> Redis፣ loopback ብቻ፣ የprofile ምርጫ የለም)። ከታች ያለው ፈጣን ማስኬድ Redisን በሌላ ቦታ +> አስቀድመው ለሚያስኬዱ ተጠቃሚዎች የታሰበ የአንድ-container መንገድ ነው። + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/am/docs/guides/TROUBLESHOOTING.md b/docs/i18n/am/docs/guides/TROUBLESHOOTING.md index 8a405fdbfc9b..22666fffb0f6 100644 --- a/docs/i18n/am/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/am/docs/guides/TROUBLESHOOTING.md @@ -70,12 +70,22 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # ወዲያውኑ እንደገና `npm install -g omniroute` ሲያስኬዱ፣ እንደ `npm warn ERESOLVE`፣ የ peer-dependency ማሳወቂያዎች እና `deprecated` መልዕክቶች ያሉ ብዙ ማስጠንቀቂያዎችን ሊያዩ ይችላሉ። **እነዚህ የሚጠበቁ እና ጉዳት የሌላቸው ናቸው።** በውጤቱ ውስጥ `added packages` ካዩ፣ ጭነቱ በተሳካ ሁኔታ ተጠናቋል። -ማስጠንቀቂያዎቹ OmniRoute ሊቆጣጠራቸው በማይችላቸው የሶስተኛ ወገን ፓኬጆች ውስጥ ካሉ ጊዜ ያለፈባቸው የ peer-dependency ክልሎች የሚመጡ ናቸው፦ +የ peer-dependency መፍቻ ማስጠንቀቂያዎችን ለማፈን፣ በ OmniRoute የሚደገፈውን የጭነት ቅርጽ ይጠቀሙ፦ + +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` የሚያፍነው `ERESOLVE` እና የ peer-dependency ማሳወቂያዎችን ብቻ ነው። የተቋረጠ ድጋፍ ማሳወቂያዎች ከተዘዋዋሪ የሦስተኛ ወገን packages ስለሚመጡ እንደታዩ ይቆያሉ፤ እነዚህም ጭነቱ እንዳልተሳካ አያመለክቱም። + +ማስጠንቀቂያዎቹ የሚመጡት OmniRoute በማይቆጣጠራቸው የሦስተኛ ወገን packages ውስጥ ካሉ ጊዜ ያለፈባቸው የ peer-dependency ክልሎች ነው፦ 1. **`marked-terminal` `marked >=1 <16` ይፈልጋል፣ `marked@18` ግን ተገኝቷል** — በተግባር በትክክል ይሠራል፤ የ upstream peer ክልሉ ጊዜ ያለፈበት ብቻ ነው። -2. **`deprecated prebuild-install@7.1.3`** — በተዘዋዋሪ የሚጠቀም የ native-binary ማውረጃ ረዳት ነው። የተወሰነውን `wreq-js` transport binding ለመጫን ጥቅም ላይ አይውልም፣ እንዲሁም የ web-cookie provider transport ዝግጅት አለመሳካቱን አያመለክትም። +2. **`deprecated prebuild-install@7.1.3`** — ተዘዋዋሪ የ native-binary ማውረጃ አጋዥ ነው። የተወሰነውን `wreq-js` transport binding ለመጫን + ጥቅም ላይ አይውልም፣ እንዲሁም የ web-cookie provider transport ዝግጅት + አልተሳካም ማለት አይደለም። -**ምንም እርምጃ አያስፈልግም** — upstream ፓኬጆችን fork ሳያደርጉ ማስጠንቀቂያዎቹን ሙሉ በሙሉ ማጥፋት አይቻልም። +**ምንም እርምጃ አያስፈልግም** — upstream packagesን fork ሳያደርጉ ማስጠንቀቂያዎቹን ሙሉ በሙሉ ማፈን አይቻልም። --- diff --git a/docs/i18n/am/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/am/docs/providers/CURSOR-API-KEY-AND-CLI.md index 4a9bf1893783..a71d26c1bc59 100644 --- a/docs/i18n/am/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/am/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,28 +4,29 @@ --- -ያለ IDE ክፍለ ጊዜ Cursorን ከOmniRoute ጀርባ ለማድረግ ሁለት መንገዶች፦ +ያለ IDE ክፍለ-ጊዜ Cursorን ከOmniRoute ጀርባ ለማስቀመጥ ሁለት መንገዶች፦ 1. **`cursor-api` አቅራቢ** (ካርድ "Cursor API"፣ ተለዋጭ ስም `cua`)፦ የCursor ተጠቃሚ API ቁልፍን (`crsr_…`፣ በ `https://cursor.com/dashboard/api` የሚፈጠር) የሚይዝ API-ቁልፍ - አቅራቢ። ማንኛውም የOmniRoute ደንበኛ ከዚያ በኋላ በመደበኛዎቹ የኮታ፣ የምትክ እና የምዝግብ ንብርብሮች - Cursor ሞዴሎችን በ`/v1/chat/completions` በኩል እንደ `cursor-api/` ወይም - `cua/` ይደርስባቸዋል። የIDE - አቅራቢው (`cursor`፣ OAuth/IDE ክፍለ ጊዜ) ሳይቀየር ይቆያል። -2. **የCursor CLI ቀጥታ ማስተላለፊያ**፦ CLIው የሚያደርገው እያንዳንዱ RPC በOmniRoute API ቁልፍ እንዲረጋገጥ፣ - የ`cursor-api` ግንኙነት ማረጋገጫን በመጠቀም ወደ Cursor እንዲተላለፍ እና - በLogs ገጽ ላይ እንዲመዘገብ Cursor CLIን (`agent`) ወደ OmniRoute ያመልክቱ። + አቅራቢ ነው። ከዚያ ማንኛውም የOmniRoute ደንበኛ + በ`/v1/chat/completions` በኩል Cursor ሞዴሎችን እንደ `cursor-api/` ወይም + `cua/` በተለመዱት የኮታ፣ የመጠባበቂያ እና የምዝግብ ንብርብሮች ያገኛል። የIDE + አቅራቢው (`cursor`፣ OAuth/IDE ክፍለ-ጊዜ) ሳይለወጥ ይቆያል። +2. **የCursor CLI ቀጥታ ማስተላለፊያ**፦ የCursor CLI (`agent`) ወደ OmniRoute እንዲጠቁም ያድርጉ፤ ይህም + CLIው የሚያደርገው እያንዳንዱ RPC በOmniRoute API ቁልፍ እንዲረጋገጥ፣ በ + `cursor-api` ግንኙነት ማረጋገጫ መረጃ ወደ Cursor እንዲተላለፍ እና በ + ምዝግቦች ገጽ ላይ እንዲመዘገብ ያደርጋል። ## ቁልፉ ለምን እንደሚለዋወጥ `api2.cursor.sh` ጥሬ `crsr_…` ቁልፍን እንደ Bearer ቶከን አይቀበልም (401)። Cursor -CLI በመጀመሪያ ቁልፉን ወደ `/auth/exchange_user_api_key` POST በማድረግ ከአንድ ሰዓት በኋላ የሚያልቅ -የክፍለ ጊዜ JWT ይቀበላል፤ የተመለሰው `refreshToken` ተመሳሳይ +CLI መጀመሪያ ቁልፉን ወደ `/auth/exchange_user_api_key` POST ያደርግና ከአንድ ሰዓት በኋላ +የሚያበቃ የክፍለ-ጊዜ JWT ይቀበላል፤ የተመለሰው `refreshToken` ተመሳሳይ `exp` ስላለው፣ ማደስ ማለት ቁልፉን እንደገና መለዋወጥ ማለት ነው። -`open-sse/services/cursorApiKeyAuth.ts` ያንን ልውውጥ ያከናውናል፣ ለእያንዳንዱ ቁልፍ አንድ የክፍለ ጊዜ -ቶከን በመሸጎጫ ያስቀምጣል፣ ከማለቁ አምስት ደቂቃ በፊት እንደገና ይለዋወጣል እና Cursor 401 -ሲመልስ የተሸጎጠውን ቶከን ይሰርዛል። `CursorExecutor` ለ`cursor-api` ግንኙነቶች -የላይኛውን ዥረት ከመክፈቱ በፊት ወዲያውኑ ይጠራዋል። +`open-sse/services/cursorApiKeyAuth.ts` ያንን ልውውጥ ያከናውናል፣ ለእያንዳንዱ ቁልፍ አንድ የክፍለ-ጊዜ +ቶከን በመሸጎጫ ያስቀምጣል፣ ከማብቂያው አምስት ደቂቃ በፊት እንደገና ይለዋወጣል እና Cursor 401 ሲመልስ በመሸጎጫ የተቀመጠውን +ቶከን ያስወግዳል። `CursorExecutor` ለ`cursor-api` ግንኙነቶች ወደላይኛው +ዥረት ከመክፈቱ በፊት ወዲያውኑ ይጠራዋል። ## የ`cursor-api` አቅራቢ @@ -36,7 +37,7 @@ CLI በመጀመሪያ ቁልፉን ወደ `/auth/exchange_user_api_key` POST `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`)። -ዳሽቦርድ፦ Providers → Cursor API → Add API key። +ዳሽቦርድ፦ አቅራቢዎች → Cursor API → API ቁልፍ አክል። REST፦ @@ -57,43 +58,55 @@ curl -sS http://localhost:20128/v1/chat/completions \ ማስታወሻዎች፦ -- የ`cursor-api` ሞዴል ዝርዝር ከማይለዋወጠው የCursor መዝገብ ይመጣል (የIDE - አቅራቢው በአማራጭነት የሚጠቀመው ተመሳሳይ ዝርዝር)፤ በOmniRoute አስተናጋጅ ላይ `cursor-agent` መጫን +- የ`cursor-api` ሞዴል ዝርዝር ከቋሚው የCursor መዝገብ (የIDE አቅራቢው እንደ መጠባበቂያ + የሚጠቀምበት ተመሳሳይ ዝርዝር) ይመጣል፤ በOmniRoute አስተናጋጅ ላይ `cursor-agent` መጫን አያስፈልግም። - `POST /api/providers/{id}/refresh-cursor` ለ`cursor` IDE አቅራቢ - ብቻ ነው፤ የ`cursor-api` ግንኙነቶች የሚታደስ IDE ክፍለ ጊዜ የላቸውም። + ብቻ ነው፤ የ`cursor-api` ግንኙነቶች ለማደስ የIDE ክፍለ-ጊዜ የላቸውም። -## የCursor CLI ቀጥታ ማስተላለፊያ +## የመነሻ ሞዴል መታወቂያዎች እና የጥረት ደረጃ + +ለ`cursor` / `cu` እና `cursor-api` / `cua`፣ የጋራው የClaude ጥረት ደረጃ መደበኛ አድራጊ +የተጠየቀውን የሞዴል መታወቂያ ሳይለውጥ ይተወዋል። Cursor እንደ `-low` ያለ ቅጥያን +እንደ እውነተኛ የሞዴል መታወቂያ አካል ሊያሳይ ይችላል፣ እንደ OmniRoute የጥረት ደረጃ ተለዋጭ ስም አይደለም። +የCursor አስፈጻሚ ከቀጥታ ካታሎጉ ጋር ትክክለኛ የሆነ ግጥሚያን ይጠብቃል፤ ግጥሚያ +በሌለበት ጊዜ፣ ነባሩ የሞዴል መፍቻው የቅጥያ-ወደ-መለኪያ መጠባበቂያውን ይቆጣጠራል። + +ይህ ለቀጥታ Claude፣ Claude-ተኳሃኝ ወይም Vertex መስመሮች የጥረት ደረጃ መደበኛ ማድረግን አይለውጥም። +ተገኝነት አሁንም በተመረጠው የCursor መለያ ካታሎግ እና ፈቃድ ላይ ይመሰረታል። + +## Cursor CLI ማስተላለፊያ መስመር፦ `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`። መያዣው `/api/cursor-cli/` በ -`src/shared/constants/publicApiRoutes.ts` ውስጥ ተመዝግቧል፣ ምክንያቱም አስተናጋጁ +`open-sse/handlers/cursorCliProxy.ts`። ቅድመ ቅጥያው `/api/cursor-cli/` +በ`src/shared/constants/publicApiRoutes.ts` ውስጥ ተመዝግቧል፤ ምክንያቱም ማስተናገጃው የራሱን ማረጋገጫ ያስፈጽማል፦ -| ዱካ | ከCLIው የሚጠበቅ ማረጋገጫ | OmniRoute የሚያደርገው | -| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | ቁልፉን ያረጋግጣል፣ ለ1 ሰዓት የሚያገለግል HS256 JWT (`JWT_SECRET` በመጠቀም የተፈረመ) ይፈጥርና ይመልሰዋል | -| ሌሎች ሁሉም ዱካዎች (`/aiserver.v1.*`፣ `/agent.v1.AgentService/RunSSE`፣ `/aiserver.v1.BidiService/BidiAppend`፣ `/v1/traces`፣ …) | `Bearer ` | ሰጪውን/ተቀባዩን/የማብቂያ ጊዜውን ያረጋግጣል፣ ንቁ የ`cursor-api` ግንኙነት ይመርጣል፣ የAuthorization ራስጌውን በተለዋወጠው የCursor ቶከን ይተካል እና ምላሹን በዥረት ይመልሳል | +| ዱካ | CLIው የሚጠብቀው ማረጋገጫ | OmniRoute የሚያደርገው | +| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | ቁልፉን ያረጋግጣል፣ ለ1 ሰዓት የሚያገለግል HS256 JWT (`JWT_SECRET` በመጠቀም የተፈረመ) ያመነጫል እና ይመልሰዋል | +| ሌሎች ዱካዎች በሙሉ (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | አውጪውን/ተቀባዩን/የማብቂያ ጊዜውን ያረጋግጣል፣ ንቁ የሆነ `cursor-api` ግንኙነት ይመርጣል፣ የAuthorization ራስጌውን በተለወጠው የCursor ቶከን ይተካል እና ምላሹን መልሶ በዥረት ያስተላልፋል | -CLIው ከሚቀበለው ማንኛውም ቶከን `exp`ን ዲኮድ ያደርጋል፣ ስለዚህ ግልጽ ያልሆነ -ቶከን መስጠት ከሞላ ጎደል ከእያንዳንዱ ጥያቄ በፊት እንደገና እንዲለዋወጥ ያደርገዋል፤ የተፈጠረው JWT ይህንን -ያስወግዳል። ከOmniRoute የሚመጣ 401 CLIው እንደገና ልውውጥ እንዲያደርግ ያደርገዋል። +CLIው ከሚቀበለው ማንኛውም ቶከን `exp`ን ዲኮድ ያደርጋል፤ ስለዚህ ግልጽ ያልሆነ +ቶከን መስጠት ከእያንዳንዱ ጥያቄ በፊት እንደገና እንዲለዋወጥ ያደርገዋል፤ የሚመነጨው JWT ይህንን +ያስወግዳል። ከOmniRoute የሚመጣ 401 CLIው እንደገና እንዲለዋወጥ ያደርገዋል። ### ማዋቀር -1. የOmniRoute API ቁልፍ (Dashboard → API keys) እና የ`cursor-api` +1. የOmniRoute API ቁልፍ (ዳሽቦርድ → API ቁልፎች) እና የ`cursor-api` ግንኙነት ይፍጠሩ። -2. CLIው ለagent ዥረት HTTP/1.1 እንዲጠቀም ያድርጉ። በ - `~/.cursor/cli-config.json`፦ +2. CLIው ለወኪሉ ዥረት HTTP/1.1 እንዲጠቀም ያድርጉ። በ + `~/.cursor/cli-config.json` ውስጥ፦ ```json { "network": { "useHttp1ForAgent": true } } ``` - ያለዚህ CLIው የagent ተራውን በHTTP/2 በተለየ ሁኔታ - ወደተዋቀረ agent አስተናጋጅ ይከፍታል፣ እና በendpoint በኩል የሚያልፉት የcontrol-plane RPCዎች ብቻ ይሆናሉ። + ያለዚህ፣ CLIው የወኪሉን ዙር በHTTP/2 በተለየ ሁኔታ + ወደተዋቀረ የወኪል አስተናጋጅ ይከፍታል፤ በመጨረሻ ነጥቡ በኩል የሚያልፉትም + የቁጥጥር አውታሩ RPCዎች ብቻ ናቸው። -3. CLIውን OmniRouteን በመጠቀም ያስኪዱ፦ +3. CLIውን ከOmniRoute ጋር ያስኪዱ፦ ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -101,19 +114,19 @@ CLIው ከሚቀበለው ማንኛውም ቶከን `exp`ን ዲኮድ ያደር agent -p --trust "Reply with exactly OK" ``` -እያንዳንዱ ሽግግር በLogs ውስጥ እንደ አቅራቢ `cursor-api`፣ የጥያቄ ዓይነት `cursor-cli`፣ -ዱካ `/api/cursor-cli/` ሆኖ፣ ለOmniRoute API ቁልፉ እና ለአገለገለው -ግንኙነት ተመድቦ ይመዘገባል። +እያንዳንዱ የማስተላለፊያ ደረጃ በLogs ውስጥ በአቅራቢ `cursor-api`፣ በጥያቄ ዓይነት `cursor-cli`፣ +በዱካ `/api/cursor-cli/` ይመዘገባል፤ እንዲሁም ጥያቄው ለOmniRoute API ቁልፍ እና +ላገለገለው ግንኙነት ይመደባል። ### የውድቀት ሁኔታዎች -| ሁኔታ | ለCLI የሚሰጥ ምላሽ | -| ---------------------------------------------- | ------------------------------------------------ | -| ያልታወቀ የOmniRoute ቁልፍ እና `REQUIRE_API_KEY=true` | በልውውጥ ጊዜ 401 `unauthenticated` | -| `REQUIRE_API_KEY=false` | ስም-አልባ ክፍለ-ጊዜ (የ`/v1/*` ባህሪን ያንጸባርቃል) | -| ጊዜው ያለፈ / የውጭ / የተቀየረ የክፍለ-ጊዜ JWT | 401፣ CLIው እንደገና ይለዋወጣል | -| ከልውውጡ በኋላ የተሻረ የOmniRoute API ቁልፍ | በሚቀጥለው RPC ላይ 401 | -| ንቁ የ`cursor-api` ግንኙነት የለም | 503 `unavailable` | -| Cursor የግንኙነቱን ቁልፍ ውድቅ ያደርጋል | 401 `unauthenticated`፣ በመሸጎጫ የተቀመጠው ክፍለ-ጊዜ ይወገዳል | -| የላይኛው አገልግሎት ላይ መድረስ አይቻልም | 502 `unavailable` (የተጣራ መልዕክት) | -| `JWT_SECRET` አልተዋቀረም | በልውውጥ ጊዜ 503 | +| ሁኔታ | ለCLIው የሚሰጥ ምላሽ | +| ---------------------------------------------- | ------------------------------------------ | +| ያልታወቀ የOmniRoute ቁልፍ እና `REQUIRE_API_KEY=true` | በልውውጥ ወቅት 401 `unauthenticated` | +| `REQUIRE_API_KEY=false` | ስም-አልባ ክፍለ ጊዜ (የ`/v1/*`ን ባህሪ ያንጸባርቃል) | +| ጊዜው ያለፈ / የሌላ ምንጭ / የተነካካ የክፍለ ጊዜ JWT | 401፣ CLIው እንደገና ይለዋወጣል | +| ከልውውጡ በኋላ የOmniRoute API ቁልፉ ተሰርዟል | በሚቀጥለው RPC ላይ 401 | +| ንቁ የ`cursor-api` ግንኙነት የለም | 503 `unavailable` | +| Cursor የግንኙነቱን ቁልፍ ውድቅ ያደርጋል | 401 `unauthenticated`፣ የተሸጎጠው ክፍለ ጊዜ ይሰረዛል | +| ወደላይ ያለው አገልግሎት ሊደረስበት አይችልም | 502 `unavailable` (የተጣራ መልዕክት) | +| `JWT_SECRET` አልተዋቀረም | በልውውጥ ወቅት 503 | diff --git a/docs/i18n/am/docs/reference/API_REFERENCE.md b/docs/i18n/am/docs/reference/API_REFERENCE.md index 156b6503c3dd..b775fcd9169b 100644 --- a/docs/i18n/am/docs/reference/API_REFERENCE.md +++ b/docs/i18n/am/docs/reference/API_REFERENCE.md @@ -438,7 +438,7 @@ GET /api/v1/provider-plugin-manifest --- -## የተኳኋኝነት መዳረሻ ነጥቦች +## የተኳኋኝነት መጨረሻ ነጥቦች | ዘዴ | ዱካ | ቅርጸት | | ---- | ----------------------------------------- | ------------------------------------ | @@ -447,12 +447,12 @@ GET /api/v1/provider-plugin-manifest | POST | `/v1/responses` | OpenAI Responses | | POST | `/v1/embeddings` | OpenAI | | POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (ማርትዕ/መሙላት) | -| POST | `/v1/videos/generations` | የOpenAI ቅጥ ያለው የቪዲዮ ማመንጨት | -| POST | `/v1/music/generations` | የOpenAI ቅጥ ያለው የሙዚቃ ማመንጨት | +| POST | `/v1/images/edits` | OpenAI Images (ማስተካከያ/ውስጥ መሙላት) | +| POST | `/v1/videos/generations` | የOpenAI ዓይነት ቪዲዮ ማመንጨት | +| POST | `/v1/music/generations` | የOpenAI ዓይነት ሙዚቃ ማመንጨት | | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (የድምፅ ይዘት ይመልሳል) | -| POST | `/v1/rerank` | የCohere/Voyage ቅጥ ያለው ዳግም ደረጃ አሰጣጥ | +| POST | `/v1/audio/speech` | OpenAI TTS (የድምፅ ይዘትን ይመልሳል) | +| POST | `/v1/rerank` | የCohere/Voyage ዓይነት ዳግም ደረጃ መስጠት | | POST | `/v1/classify` | Jina ምደባ (`api.jina.ai`) | | POST | `/v1/segment` | Jina ከፋይ (`segment.jina.ai`) | | POST | `/v1/moderations` | OpenAI Moderations | @@ -463,43 +463,65 @@ GET /api/v1/provider-plugin-manifest | POST | `/v1/api/chat` | Ollama | | GET | `/api/v1/vscode/{token}/` | የOpenAI ካታሎግ ተለዋጭ ስም | | GET | `/api/v1/vscode/{token}/models` | የOpenAI ሞዴሎች ተለዋጭ ስም | -| POST | `/api/v1/vscode/{token}/chat/completions` | በቶከን የተደረገ የOpenAI ተለዋጭ ስም | -| POST | `/api/v1/vscode/{token}/responses` | በቶከን የተደረገ የOpenAI Responses ተለዋጭ ስም | -| POST | `/api/v1/vscode/{token}/api/chat` | በቶከን የተደረገ የOllama ተለዋጭ ስም | -| GET | `/api/v1/vscode/{token}/api/tags` | በቶከን የተደረገ የOllama መለያዎች ተለዋጭ ስም | +| POST | `/api/v1/vscode/{token}/chat/completions` | በቶክን የተወከለ የOpenAI ተለዋጭ ስም | +| POST | `/api/v1/vscode/{token}/responses` | በቶክን የተወከለ የOpenAI Responses ተለዋጭ ስም | +| POST | `/api/v1/vscode/{token}/api/chat` | በቶክን የተወከለ የOllama ተለዋጭ ስም | +| GET | `/api/v1/vscode/{token}/api/tags` | በቶክን የተወከለ የOllama መለያዎች ተለዋጭ ስም | -ሁሉም POST መስመሮች ተመሳሳይ ቅርጽን ይከተላሉ፦ `Bearer your-api-key` + በZod የተረጋገጠ JSON ይዘት (`v1RerankSchema`፣ `v1ModerationSchema`፣ `v1AudioSpeechSchema`፣ ወዘተ፤ `src/shared/validation/schemas.ts`ን ይመልከቱ)። የስኪማ ማረጋገጥ ሲከሽፍ 4xx ይመለሳል። +ሁሉም የPOST መስመሮች ተመሳሳይ አወቃቀር ይከተላሉ፦ `Bearer your-api-key` + በZod የተረጋገጠ JSON ይዘት (`v1RerankSchema`፣ `v1ModerationSchema`፣ `v1AudioSpeechSchema`፣ ወዘተ፤ `src/shared/validation/schemas.ts`ን ይመልከቱ)። የስኬማ ማረጋገጥ ሲወድቅ 4xx ይመለሳል። -`Authorization: Bearer ...`ን ማያያዝ ለማይችሉ ደንበኞች፣ OmniRoute በURL ውስጥ የAPI ቁልፎችን በመጠይቅ-ሕብረቁምፊ ተኳኋኝነት (`?token=...`፣ `?apiKey=...`፣ `?api_key=...`፣ `?key=...`) ወይም ከታች በተመዘገቡት የተለዩ `/api/v1/vscode/{token}/...` መዳረሻ ነጥቦች በኩል ይቀበላል። +`Authorization: Bearer ...`ን ማያያዝ ለማይችሉ ደንበኞች፣ OmniRoute በመጠይቅ-ሕብረቁምፊ ተኳኋኝነት (`?token=...`፣ `?apiKey=...`፣ `?api_key=...`፣ `?key=...`) ወይም ከታች በተመዘገቡት ልዩ `/api/v1/vscode/{token}/...` መጨረሻ ነጥቦች በኩል በURL ውስጥ የAPI ቁልፎችን ይቀበላል። ```bash -# ዳግም ደረጃ አሰጣጥ +# ዳግም ደረጃ መስጠት (የደመና መዝገብ አቅራቢ፣ ወይም እንደ "/" ያለ ከOpenAI ጋር ተኳኋኝ የአቅራቢ ኖድ) POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina ምደባ (የFoundation API ማረጋገጫዎች) +# Jina ምደባ (የFoundation API ማረጋገጫ መረጃዎች) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Jina ከፋይ POST /v1/segment { "content": "...", "return_chunks": true } -# Jina ፍለጋ (s.jina.ai፤ የአቅራቢ ተለዋጭ ስሞች፦ jina-search, jina-ai, jina) +# Jina ፍለጋ (s.jina.ai፤ የአቅራቢ ተለዋጭ ስሞች፦ jina-search፣ jina-ai፣ jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# የይዘት ቁጥጥር +# የይዘት ቁጥጥሮች POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — የaudio/mpeg ይዘትን (ወይም የተጠየቀውን ቅርጸት) ይመልሳል +# TTS — የaudio/mpeg (ወይም የተጠየቀውን ቅርጸት) ይዘት ይመልሳል POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } -# የምስል ማርትዕ (multipart) +# የምስል ማስተካከያ (ባለብዙ ክፍል) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# የቪዲዮ / ሙዚቃ ማመንጨት (በአቅራቢ ቅድመ ቅጥያ የተጀመረ የሞዴል መታወቂያ) +# ቪዲዮ / ሙዚቃ ማመንጨት (በአቅራቢ ቅድመ ቅጥያ የተሰጠ የሞዴል መታወቂያ) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### የተለዩ የአቅራቢ መስመሮች +> **የዳግም ደረጃ መስጫ አቅራቢ ኖዶች፦** `POST /v1/rerank` እንዲሁም እንደ `/` ወደሚጠቀሱ +> ከOpenAI ጋር ተኳኋኝ የአቅራቢ ኖዶች (oMLX፣ vLLM፣ Infinity፣ ከመግቢያ በስተጀርባ TEI፣ …) ጥያቄዎችን ያሰራጫል። የloopback +> ኖዶች (`localhost`፣ `127.0.0.1`፣ `172.16.0.0/12`) ሁልጊዜ ብቁ ናቸው። በሌላ ማንኛውም +> አስተናጋጅ ላይ ያሉ ኖዶች — የLAN ማሽን ወይም የTailscale አቻ — ብቁ የሚሆኑት ኦፕሬተሩ +> `RERANK_REMOTE_PROVIDER_NODES` የባህሪ ጥቆማን ሲያነቃ **እና** የኖዱ መሠረታዊ URL የአቅራቢውን +> የወጪ URL መመሪያ (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) ሲያልፍ ብቻ ነው፤ +> የደመና-ሜታዳታ አስተናጋጆች ፈጽሞ ጥያቄ አይደርሳቸውም። የማስታወሻ ሞተሩ የዳግም ደረጃ መስጫ ደረጃ ይህን መስመር በ +> loopback በኩል ይጠራል፣ ስለዚህ ይኸው ደንብ በማስታወሻ ቅንብሮች ውስጥ `rerankProviderModel`ን ይቆጣጠራል። +> +> **የአካባቢያዊ አገልጋይ አወቃቀሮች፦** ኖዱ በ`/v1/rerank`፣ እና 404 ሲመለስ በ`/rerank` +> (Infinity፣ TEI) ይጠራል። ወደላይኛው አገልግሎት የሚላከው ይዘት ሁለቱንም የCohere/OpenAI አጻጻፍ (`documents`፣ +> `return_documents`) እና የTEI አጻጻፍ (`texts`፣ `return_text`) ይይዛል፤ እንዲሁም የወደላይኛው አገልግሎት ምላሽ +> ወደ Cohere መጠቅለያ መደበኛ ይደረጋል፦ የTEI ጥሬ `[{index, score, text}]`፣ ከቀላል መግቢያዎች የሚመጣ +> `{results: [{index, score}]}`፣ እና የVoyage ዓይነት `{data: [...]}` ሁሉም ወደ ደንበኛው +> እንደ `{results: [{index, relevance_score, document?}]}` ይመለሳሉ፣ በውጤት ተደርድረው እና በ`top_n` ተገድበው። + +> **የአቅራቢ ኖድ ማግኘት፦** ከOpenAI ጋር ተኳኋኝ በሆነ የአቅራቢ ኖድ ላይ ያሉ ሞዴሎች በኖዱ ቅድመ ቅጥያ ሥር በ`GET /v1/models` +> ውስጥ ይታያሉ። የመጨረሻ ነጥብ ሜታዳታ የሌላቸው ረድፎች (በአካባቢያዊ `/v1/models` ዝርዝሮች ላይ የተለመደ) +> የኖዱን `apiType` ይወርሳሉ፤ ስለዚህ የ`embeddings` ኖድ ሞዴሎች `type: "embedding"` እና የ +> `rerank` ኖድ ሞዴሎች በነባሪ ወደ ውይይት ከመመደብ ይልቅ `type: "rerank"` ይሆናሉ፤ በተመሳሰለ ወይም በእጅ በተጨመረ ረድፍ ላይ ያለ ግልጽ +> `supportedEndpoints` አሁንም ቅድሚያ ይኖረዋል። + +### ልዩ የአቅራቢ መስመሮች ```bash POST /v1/providers/{provider}/chat/completions @@ -507,7 +529,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -የአቅራቢው ቅድመ ቅጥያ ከጎደለ በራስ-ሰር ይጨመራል። የማይዛመዱ ሞዴሎች `400` ይመልሳሉ። +የአቅራቢው ቅድመ ቅጥያ ከሌለ በራስ-ሰር ይታከላል። የማይዛመዱ ሞዴሎች `400` ይመልሳሉ። --- @@ -1148,7 +1170,7 @@ Content-Type: application/json } ``` -> **የSchema ማስታወሻዎች** (`setBudgetSchema`)፦ `apiKeyId` ያስፈልጋል፤ ከ`dailyLimitUsd`፣ `weeklyLimitUsd` ወይም `monthlyLimitUsd` ቢያንስ አንዱ ከዜሮ መብለጥ አለበት። አማራጭ መስኮች፦ `warningThreshold` (0–1)፣ `resetInterval` (`daily` | `weekly` | `monthly`)፣ `resetTime` (`HH:MM`)። የቀድሞው `{keyId, limit, period}` ቅርጽ `400 Bad Request` ይመልሳል። +> **የስኪማ ማስታወሻዎች** (`setBudgetSchema`)፦ `apiKeyId` አስፈላጊ ነው፤ ከ`dailyLimitUsd`፣ `weeklyLimitUsd` ወይም `monthlyLimitUsd` ቢያንስ አንዱ ከዜሮ የሚበልጥ መሆን አለበት። አማራጭ መስኮች፦ `warningThreshold` (0–1)፣ `resetInterval` (`daily` | `weekly` | `monthly`)፣ `resetTime` (`HH:MM`)። የቀድሞው `{keyId, limit, period}` ቅርጽ `400 Bad Request` ይመልሳል። ## የቶከን ገደቦች diff --git a/docs/i18n/am/docs/reference/ENVIRONMENT.md b/docs/i18n/am/docs/reference/ENVIRONMENT.md index 691f2c06e450..9fa0186c25e5 100644 --- a/docs/i18n/am/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/am/docs/reference/ENVIRONMENT.md @@ -79,70 +79,69 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. ማከማቻ እና የውሂብ ጎታ -OmniRoute ለሁሉም ቋሚ ማከማቻ **SQLite**ን (በ`better-sqlite3` በኩል) ይጠቀማል። እነዚህ ተለዋዋጮች የውሂብ መገኛን፣ ምስጠራን እና የሕይወት ዑደትን ይቆጣጠራሉ። - -| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | የSQLite DB፣ ምትኬዎች እና የውሂብ ፋይሎች ስርወ ማውጫ። ለDocker volumes ወይም ለብጁ ዱካዎች ይህን ይሽሩ። | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(አልተዋቀረም)_ | `src/lib/dataPaths.ts` | ለሙከራ/ግምገማ DATA_DIR ጥበቃ (#10428) የማለፊያ መንገድ። `DATA_DIR` የሌላቸው ሙከራዎች እና የNode ግምገማ/ማተሚያ ምርመራዎች (`-e`/`--eval`/`-p`/`--print`፣ `--eval=`/`--print=` ቅርጾችን ጨምሮ) የኦፕሬተሩን እውነተኛ የውሂብ ጎታ እንዳይከፍቱ ወደ ጊዜያዊ የሙከራ ማውጫ ይዛወራሉ፤ ወደ እውነተኛው ማውጫ መልሶ ለመግባት ወደ `1` ያዋቅሩት። | -| `OMNIROUTE_BUILD_SHA` | _(አልተዋቀረም)_ | `src/lib/monitoring/buildSha.ts` | እየሄደ ያለው አርቲፋክት Git SHA። በ`npm run build:release` ይታተማል፤ ያለ `dist/BUILD_SHA` ጠቋሚ በሚላኩ ኮንቴይነሮች ውስጥ ሊወጋ ይችላል። በ`/api/monitoring/health` ላይ እንደ `system.buildSha` ይታያል። | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | የpack-artifact ምንጭ ማረጋገጫ በር የbuild SHAን የሚያነጻጽርበት Ref (#10427)። | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(አልተዋቀረም)_ | `scripts/build/buildProvenance.ts` | SHAው በልቀት መስመሩ ላይ የሌለ buildን ማሸግ ለመፍቀድ ወደ `1` ያዋቅሩት፤ ይህም በሩን ከማሳካት ይልቅ ሆን ተብሎ እንደተደረገ canary ይመዘግበዋል (#10427)። | -| `OMNIROUTE_SMOKE_API_KEY` | _(አልተዋቀረም)_ | `scripts/ops/deploy-canary.mjs` | በ`/v1/chat/completions` ላይ እንደ `Authorization: Bearer` የሚላከው፣ ለcanary-deploy smoke ምርመራ የሚያገለግል API key። በdeploy ስክሪፕቱ ብቻ ጥቅም ላይ ይውላል (#10429)፤ በሰርቨሩ ፈጽሞ አይጠቀምም። ከopt-in CLI smoke harness `OMNIROUTE_SMOKE_*` ተለዋዋጮች (`RUN_CLI_SMOKE=1`፣ `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` በ`tests/integration/upstream-cli-smoke.int.test.ts` ውስጥ) ጋር አይዛመድም — [የCLI ውህደቶች → እውነተኛ smoke sweep](../guides/CLI-INTEGRATIONS.md)ን ይመልከቱ። | -| `OMNIROUTE_BUILDING` | _(አልተዋቀረም)_ | `src/lib/buildPhase.ts` | የbuild ደረጃ ምልክት (#10060)፦ በ`scripts/build/build-next-isolated.mjs` ወደ `1` ይዋቀራል፣ እንዲሁም በመነሻቸው በሚፈጠሩ ሁሉም build worker ይወረሳል፤ በዚህም የDB ንብርብር native better-sqlite3 addonን (በመውጫ ጊዜ workerን የሚያቋርጠውን) ከመጫን ይልቅ ምንም የማያደርግ stub ይመልሳል። ለሚሠራው ሰርቨር ፈጽሞ አይዋቀርም። | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | ለተለመዱ ያልሆኑ vendored treeዎች የአማራጭ native dependency prebuild ምርመራን ለመዝለል ወደ `1` ያዋቅሩት። ይህ የጎደለ dependencyን build ማድረግ የሚቻል አያደርገውም፤ native dependencyዎች ከውጭ ሲቀርቡ ብቻ ይጠቀሙበት። | -| `OMNIROUTE_DATA_DIR` | _(አልተዋቀረም)_ | `open-sse/executors/promptql/threadSticky.ts` | ለ`DATA_DIR` **የመጠባበቂያ ተለዋጭ ስም**፤ `DATA_DIR` ሳይዋቀር ሲቀር ብቻ ይመረመራል። የPromptQL executorን በዲስክ ላይ የሚገኝ thread-sticky session cache (`/promptql-thread-sessions.json`) ለማግኘት ይጠቅማል፤ ከሁለቱም ተለዋዋጮች አንዳቸውም ካልተዋቀሩ፣ cacheው በማህደረ ትውስታ ውስጥ ብቻ ይቆያል (ከዳግም ማስጀመሮች በኋላ አይቆይም)። | -| `OMNIROUTE_PLUGINS_DIR` | _(አልተዋቀረም)_ | `src/lib/plugins/scanner.ts` | **runtime plugin scanner** የሚያነበው ማውጫ — እና plugin manager የሚጭንበት ስርወ ማውጫ — ከhome የሚመነጨውን ነባሪ በመሻር (#11827)። የscan ዱካውን ለመቀየር ብቻ HOMEን ከማንቀሳቀስ ይልቅ፣ በDocker/K8s ውስጥ ወደ bind-mounted plugin treeው ያመልክቱት (HOME ሌሎች ከhome አንጻራዊ የሆኑ ባህሪያትንም ሁሉ ይቆጣጠራል)። አልተዋቀረም = `~/.omniroute/plugins`፣ ወይም processው ምንም home ካላስተላለፈ `/tmp/.omniroute/plugins` — ይህ ተለዋዋጭ የሚያስወግደው ያለማሳወቂያ የማይገኙበት ሁኔታ። የተፈታው ማውጫ በstartup ጊዜ አሸናፊ ከሆነው input ጋር አንድ ጊዜ እንደ `scanner.dir_resolved` ይመዘገባል። በserver-side ብቻ፦ የCLI command pluginዎች የራሳቸውን `OMNIROUTE_PLUGIN_PATH` ይይዛሉ (ክፍል 9)። | -| `STORAGE_ENCRYPTION_KEY` | _(ባዶ = የተሰናከለ)_ | `src/lib/db/encryption.ts` | የSQLite ዳታቤዝን በዲስክ ላይ ሙሉ በሙሉ ለማመስጠር የሚያገለግል AES ቁልፍ። በ`openssl rand -hex 32` ያመንጩት። | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | የምስጠራ ቁልፉ የስሪት መለያ። የቆዩ ምትኬዎችን መፍታት እንዲቻል ቁልፍ በሚቀየርበት ጊዜ እሴቱን ይጨምሩ። | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` ሲሆን፣ መደበኛ/ከመጻፍ በፊት የሚደረጉ የSQLite ፋይል ምትኬዎችን (የmodels.dev ዋጋ ማስቀመጥ/ማጽዳት፣ የቅንብሮች ጽሁፎች) ይዘላል። በእጅ የሚደረጉ እና ከመመለስ በፊት የሚደረጉ ምትኬዎች አሁንም ይሰራሉ። ይህ የማይግሬሽን አስኪያጁን አስገዳጅ ዘላቂ የደህንነት ቅጽበታዊ ቅጂ ወይም ለነባር ቋሚ DB የጅምላ ማይግሬሽን መከላከያን **አያሰናክልም**። በእጅ ያልተደረጉ ምትኬዎች ቢበዛ በየ60 ደቂቃው አንድ ጊዜ እንዲከናወኑ ይገደባሉ። የዳሽቦርዱ **Settings → Storage** መደበኛ ራስ-ሰር ምትኬን ለብቻው ማሰናከል ይችላል። | -| `OMNIROUTE_CRYPT_KEY` | _(ያልተቀናበረ)_ | `src/lib/db/encryption.ts` | ለ`STORAGE_ENCRYPTION_KEY` **የቆየ ተለዋጭ ስም**። ዋናው ተለዋዋጭ በማይኖርበት ጊዜ እንደ አማራጭ ይቀበላል። | -| `OMNIROUTE_API_KEY_BASE64` | _(ያልተቀናበረ)_ | `src/lib/db/encryption.ts` | **የቆየ ተለዋጭ ስም** (በBase64 የተቀየረ ቅርጸት) እንደ አማራጭ ይቀበላል። ከመጠቀም በፊት በራስ-ሰር ይፈታል። | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ያልተቀናበረ)_ | `src/lib/db/core.ts` | ወቅታዊውን የSQLite ጤና ምርመራ ክፍተት (ms) ይቀይሩ። ካልተቀናበረ፣ ነባሪ እሴቶቹ ከ`NODE_ENV` ይወሰዳሉ። | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/walMaintenance.ts` | ወቅታዊውን `wal_checkpoint(TRUNCATE)` ክፍተት (ms) ይቀይሩ። ራስ-ሰር checkpoint የWAL ፋይሉን ራሱን ፈጽሞ አያሳንስም፣ እንዲሁም ለረጅም ጊዜ የሚሰራ ሰርቨር DBውን ፈጽሞ አይዘጋም። `0` ያሰናክላል። | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | ተደጋጋሚውን `wal_checkpoint(PASSIVE)` ክፍተት (ms) ይቀይሩ። በመጠባበቅ ላይ ያሉ WAL frames አነስተኛ እንዲሆኑ በማድረግ፣ ወቅታዊው TRUNCATE በዋናው thread ላይ ባለብዙ-GB backlog እንዳይቀዳ ያደርጋል። `0` ያሰናክላል። | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | አንድ PASSIVE tick የWAL ፋይሉ ከዚህ መጠን በላይ መሆኑን ሲያገኝ፣ ዘገምተኛውን tick ከመጠበቅ ይልቅ ወዲያውኑ ወደ `wal_checkpoint(TRUNCATE)` ያሳድገዋል። | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | ወሳኝ የሀብት ጫና ለ`OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` ያህል ከቀጠለ በኋላ processውን ለማቋረጥ ወደ `1`/`true`/`yes`/`on` ያቀናብሩ፤ ይህም 503ዎችን ያለገደብ ከማቅረብ ይልቅ supervisor (systemd `Restart=always`፣ Docker restart policy) ንጹህ process እንዲያስነሳ ያስችለዋል። | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | የራስ-ዳግም-ማስጀመሪያ መውጫው ከመቀስቀሱ በፊት ወሳኝ ጫናው ምን ያህል ጊዜ መቆየት እንዳለበት። | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(ራስ-ሰር ማግኘት)_ | `src/lib/db/adapters/sqljsAdapter.ts` | የ`sql.js` WASM አማራጭ adapterን ሲጠቀሙ ወደ `sql-wasm.wasm` የሚወስድ ግልጽ ዱካ (ፍጹም ወይም ከcwd አንጻር)። ካልተቀናበረ፣ በpackage dependencies እና candidate layouts አማካኝነት በራስ-ሰር ይገኛል። | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/core.ts` | ወቅታዊውን `wal_checkpoint(TRUNCATE)` ክፍተት (ms) ይቀይሩ። ራስ-ሰር checkpoint የWAL ፋይሉን ራሱን ፈጽሞ አያሳንስም፣ እንዲሁም ለረጅም ጊዜ የሚሰራ ሰርቨር DBውን ፈጽሞ አይዘጋም። `0` ያሰናክላል። | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | ተርሚናል (የተጠናቀቀ/ያልተሳካ/የተሰረዘ/ጊዜው ያለፈ) የBatch API job checkpoints፣ የተጠቀሱ input/output/error ፋይሎች እና row በራስ-ሰር cleanup sweep ከመሰረዛቸው በፊት የሚቆዩበት የቀናት ብዛት። ውጤት የሚኖረው `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ከበራ በኋላ ብቻ ነው፤ ከOpenAI የራሱ Batch API output retention window ጋር ይዛመዳል። በንድፍ ያለምንም ቅድመ ሁኔታ (የዕድሜ ማጣሪያ ሳይኖረው) እንደሚቆየው በoperator የሚቀሰቀሰውን `DELETE /api/v1/batches/delete-completed` route አይነካም። | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` ሲሆን፣ ራስ-ሰር የማጽዳት ሂደቱ ከ`OMNIROUTE_BATCH_RETENTION_DAYS` ያለፉ የመጨረሻ ሁኔታ ላይ የደረሱ Batch API ሥራዎችን (እና የማስቀጠያ ነጥቦቻቸውን) እንዲሰርዝ እና የራሳቸው `expires_at` ካለፈ በኋላ የተሰቀሉ ፋይሎችን BLOB ይዘት እንዲያጸዳ ይፈቅዳል። በነባሪነት ጠፍቷል፦ ኦፕሬተር እስኪያነቃው ድረስ እያንዳንዱ ነባር ጭነት ይህን ውሂብ ልክ እንደበፊቱ ያቆያል። እንዲሁም ከዳሽቦርዱ ሊስተካከል የሚችል የባህሪ ጥቆማ ነው — `docs/reference/FEATURE_FLAGS.md` → የአሂድ ጊዜን ይመልከቱ። | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | በጅምር ወቅት የDB ጤና ምርመራውን ሙሉ በሙሉ ለመዝለል ወደ `1` ያቀናብሩ። ለአጭር ጊዜ ለሚኖሩ ተግባራት እና የውህደት ሙከራዎች ጠቃሚ ነው። | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | በተለምዶ የሚዘለልበት ጊዜም ቢሆን (ለምሳሌ፣ ለአጭር ጊዜ የሚኖሩ ተግባራት) የDB ጤና ምርመራ ዑደቱን በግድ ለማንቃት ወደ `1` ያቀናብሩ። | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | በ`npm install` ወቅት የቤተኛ-runtime ማሟሟቂያውን ለመዝለል ወደ `1` ያቀናብሩ። sqlite አስቀድሞ በተገነባባቸው CI/ራስ-አልባ ጭነቶች ጠቃሚ ነው። | -| `OMNIROUTE_MIGRATIONS_DIR` | _(በራስ-ሰር የሚገኝ)_ | `src/lib/db/migrationRunner.ts` | የስደት አሂዱ የሚቃኘውን ማውጫ ይተኩ። በብጁ ግንባታዎች ውስጥ በጥቅል የተካተቱ ስደቶችን ሲያቀርቡ ጠቃሚ ነው። | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ያልተቀናበረ)_ | `src/lib/db/migrationRunner/extraDirs.ts` | በመድረኩ የዱካ መለያያ የተለያዩ ተጨማሪ የስደት ማውጫዎችን እንደ `namespace=dir` ግቤቶች ይግለጹ (ለምሳሌ `ee=/opt/app/enterprise/db/migrations`)። እዚያ የተገኙ ፋይሎች እንደ `-` ይመዘገባሉ፤ ስለዚህ የራሱን ስደቶች የሚያቀርብ ስርጭት ከዋናዎቹ የቁጥር ቦታዎች ጋር ፈጽሞ አይጋጭም። የተበላሸ ግቤት፣ ልክ ያልሆነ namespace ወይም የጎደለ ማውጫ ስኪማውን በጸጥታ ከመዝለል ይልቅ በጅምር ወቅት ስህተት ያስነሳል። | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | የብዙ ተጠባባቂ ስደቶች ደህንነት ገደብ (#3416)። በነባር DB ላይ ከዚህ ቁጥር በላይ ስደቶች ተጠባባቂ ከሆኑ ጅምሩ ይቋረጣል (የመከታተያ ሰንጠረዡ ከመጥፋት ይከላከላል)። የቆየ ምትኬን ለመመለስ ያሳድጉት፤ ምርመራውን ለማሰናከል ወደ `0` ያቀናብሩ። | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | ለ`check:install-upgrade` ልቀት በር የሥራ ማውጫ። በግምት 12 GB (ሁለት ~3 GB የጭነት ዛፎች እና tarball) ያስፈልገዋል፤ ስለዚህ በትንሽ tmpfs ላይ መስራት የለበትም — በራስ-አስተናጋጅ runner ላይ `/tmp` 12 GB RAM-የተደገፈ tmpfs ሲሆን በሩ ሙሉ በሙሉ በመሙላቱ ጥቅሉ ተቆርጧል። | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(ነባሪው በኮድ ውስጥ)_ | `src/lib/spend/batchWriter.ts` | ለተከማቸው የወጪ/ዋጋ ጸሐፊ የማፍሰሻ ክፍተት (ms)። ዝቅተኛ እሴቶች የጽሑፍ ማዋሃድን ይቀንሳሉ፤ ከፍተኛ እሴቶች የDB ፉክክርን ይቀንሳሉ። | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(ነባሪው በኮድ ውስጥ)_ | `src/lib/spend/batchWriter.ts` | በግድ ከመፍሰሱ በፊት የሚከማቹ ከፍተኛው የወጪ ግቤቶች ብዛት። ከፍተኛ-QPS ባላቸው ማሰማሪያዎች ላይ ያሳድጉት፤ የተወሰነ ማህደረ ትውስታ የበለጠ አስፈላጊ ሲሆን ይቀንሱት። | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ያልተቀናበረ)_ | `open-sse/utils/proxyFetch.ts` | በVercel relay ዱካ ላይ `[ProxyFetch]` የማረም ምዝግቦችን ለማውጣት ወደ `"true"` ያቀናብሩ። የማዞሪያ ፍንጮችን ላለማጋለጥ በነባሪነት ጠፍቷል። | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | በዝርዝር `[ProxyEgress]` የሂደት-ምዝግብ መስመር ውስጥ የደንበኛ/መውጫ IPዎችን እና የመለያውን ቅድመ ቅጥያ ለማካተት ወደ `"true"` ወይም `"1"` ያቀናብሩ። የሂደት ምዝግቡ IPዎችን ወይም የመለያውን ቅድመ ቅጥያ እንዳያጋልጥ በነባሪነት እንደጠፋ ተቀምጧል። | -| `OMNIROUTE_DEBUG` | _(ያልተቀናበረ)_ | `bin/cli/commands/quota.mjs` | ከCLI የኮታ ትዕዛዞች ለእያንዳንዱ ጥያቄ የጊዜ ምርመራ መረጃ (`[omniroute] GET completed in Nms`) ወደ stderr ለማተም ወደ `1` ያቀናብሩ። | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(ራስ-ሰር)_ | `scripts/dev/healthcheck.mjs` | በኮንቴይነሩ የጤና ምርመራ በግልጽ የሚፈተሽ ዱካ። ሳይቀናበር ሲቀር፣ መመርመሪያው ከ`OMNIROUTE_BASE_PATH` ያመነጨዋል፤ እሴት ማቀናበሩ ጥልቅ የክትትል መጨረሻ ነጥቡን እንደገና ያነቃል። | -| `OMNIROUTE_DEBUG_COMPLETION` | _(ያልተቀናበረ)_ | `bin/cli/commands/completion.mjs` | ከCLI shell-completion መሸጎጫ ዱካዎች (ማንበብ/ማደስ/መጻፍ) `[omniroute completion]` የምርመራ መረጃ ለማውጣት ማንኛውንም ባዶ ያልሆነ እሴት ያቀናብሩ። በነባሪነት ጠፍቷል — የጎደለ ወይም የተበላሸ መሸጎጫ tab-completionን በፍጹም እንዳያበላሽ እነዚያ መሸጎጫዎች በጸጥታ ሳይሳኩ ይቀራሉ። | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ሰዓት) | `open-sse/services/batchProcessor.ts` | ለእያንዳንዱ የባች ንጥል ከፍተኛው የድጋሚ ሙከራ ጊዜ መስኮት (ms)። ይህን ጊዜ ያለፉ ንጥሎች እንደ ያልተሳኩ ምልክት ይደረግባቸዋል። | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | ለባች ንጥል ድጋሚ ሙከራዎች የኤክስፖነንሻል መዘግየት መሠረታዊ ጊዜ (ms)። | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ሰዓት) | `open-sse/services/batchProcessor.ts` | በባች ንጥል ድጋሚ ሙከራዎች መካከል ለኤክስፖነንሻል መዘግየት የሚደረግ ከፍተኛ ገደብ (ms)። | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | በአንድ ጊዜ የሚሰናዱ ባቾች ከፍተኛ ብዛት። የማስኬጃ አቅምን ለመጨመር ከፍ ያድርጉት፤ የተመን-ገደብ መብዛትን ለማስቀረት ዝቅ አድርገው ያቆዩት። | +OmniRoute ለሁሉም ቋሚ ውሂብ ማከማቻ **SQLite**ን (በ`better-sqlite3` በኩል) ይጠቀማል። እነዚህ ተለዋዋጮች የውሂብ መገኛን፣ ምስጠራን እና የሕይወት ዑደትን ይቆጣጠራሉ። + +| ተለዋዋጭ | ነባሪ | ምንጭ ፋይል | መግለጫ | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | ለSQLite የውሂብ ጎታ፣ ምትኬዎች እና የውሂብ ፋይሎች ዋና ማውጫ። ለDocker ቮልዩሞች ወይም ብጁ ዱካዎች ይተኩት። | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(አልተዋቀረም)_ | `src/lib/dataPaths.ts` | ለሙከራ/ግምገማ DATA_DIR ጥበቃ የማለፊያ መንገድ (#10428)። `DATA_DIR` የሌላቸው ሙከራዎች እና የNode ግምገማ/ማተሚያ መመርመሪያዎች (`-e`/`--eval`/`-p`/`--print`፣ የ`--eval=`/`--print=` ቅርጾችን ጨምሮ) የአስተዳዳሪውን እውነተኛ የውሂብ ጎታ መክፈት እንዳይችሉ ወደ አንድ ጊዜ ጥቅም ላይ የሚውል ጊዜያዊ ማውጫ ይዛወራሉ፤ እውነተኛውን ማውጫ እንደገና ለመጠቀም ወደ `1` ያዋቅሩት። | +| `OMNIROUTE_BUILD_SHA` | _(አልተዋቀረም)_ | `src/lib/monitoring/buildSha.ts` | በሂደት ላይ ያለው አርቲፋክት Git SHA። በ`npm run build:release` ምልክት ይደረግበታል፤ የ`dist/BUILD_SHA` ጠቋሚ በሌላቸው ኮንቴይነሮች ውስጥ ማስገባት ይቻላል። በ`/api/monitoring/health` ላይ እንደ `system.buildSha` ይታያል። | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | የጥቅል-አርቲፋክት ምንጭ ማረጋገጫ በር የግንባታ SHAን የሚያረጋግጥበት ref (#10427)። | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(አልተዋቀረም)_ | `scripts/build/buildProvenance.ts` | SHAው በልቀት መስመሩ ላይ የሌለ ግንባታን መጠቅለል ለመፍቀድ ወደ `1` ያዋቅሩት፤ በሩን ከማሰናከል ይልቅ ሆን ተብሎ እንደተደረገ canary ይመዘገባል (#10427)። | +| `OMNIROUTE_SMOKE_API_KEY` | _(አልተዋቀረም)_ | `scripts/ops/deploy-canary.mjs` | በ`/v1/chat/completions` ላይ እንደ `Authorization: Bearer` የሚላከው፣ ለcanary ማሰማሪያ smoke መመርመሪያ የAPI ቁልፍ። በማሰማሪያ ስክሪፕቱ ብቻ ይጠቀማል (#10429)፣ በአገልጋዩ ፈጽሞ አይጠቀምም። ከመርጦ-መግቢያ CLI smoke መሣሪያ የ`OMNIROUTE_SMOKE_*` ተለዋዋጮች (`RUN_CLI_SMOKE=1`፣ `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` በ`tests/integration/upstream-cli-smoke.int.test.ts`) ጋር ግንኙነት የለውም — [የCLI ውህደቶች → እውነተኛ smoke ቅኝት](../guides/CLI-INTEGRATIONS.md)ን ይመልከቱ። | +| `OMNIROUTE_BUILDING` | _(አልተዋቀረም)_ | `src/lib/buildPhase.ts` | የግንባታ-ደረጃ ምልክት (#10060)፦ በ`scripts/build/build-next-isolated.mjs` ወደ `1` ይዋቀራል፣ እንዲሁም በተጀመሩ የግንባታ ሠራተኞች ሁሉ ይወረሳል፤ በዚህም የውሂብ ጎታው ንብርብር ቤተኛውን better-sqlite3 ተጨማሪ ከመጫን ይልቅ ምንም የማያደርግ stub ይመልሳል (ተጨማሪው ሠራተኛው ሲወጣ እንዲቋረጥ ያደርገዋል)። በሂደት ላይ ላለው አገልጋይ ፈጽሞ አይዋቀርም። | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | ለተለዩ vendored የፋይል ዛፎች አማራጭ የቤተኛ-ጥገኝነት ቅድመ-ግንባታ ማረጋገጫን ለመዝለል ወደ `1` ያዋቅሩት። ይህ የጎደለ ጥገኝነትን ሊገነባ የሚችል አያደርገውም፤ ቤተኛ ጥገኝነቶች ከመደበኛው ሂደት ውጭ ሲቀርቡ ብቻ ይጠቀሙበት። | +| `OMNIROUTE_DATA_DIR` | _(አልተዋቀረም)_ | `open-sse/executors/promptql/threadSticky.ts` | ለ`DATA_DIR` **ተተኪ ቅጽል ስም**፤ የሚመረመረው `DATA_DIR` ሳይዋቀር ሲቀር ብቻ ነው። የPromptQL አስፈጻሚውን በዲስክ ላይ የሚገኝ thread-sticky የክፍለ ጊዜ መሸጎጫ (`/promptql-thread-sessions.json`) ለማግኘት ይጠቅማል፤ ሁለቱም ተለዋዋጮች ካልተዋቀሩ መሸጎጫው በማህደረ ትውስታ ውስጥ ብቻ ይቆያል (ከዳግም ማስጀመር በኋላ አይቆይም)። | +| `OMNIROUTE_PLUGINS_DIR` | _(አልተዋቀረም)_ | `src/lib/plugins/scanner.ts` | **የአሂድ ጊዜ ተሰኪ መቃኛው** የሚያነበው — እና የተሰኪ አስተዳዳሪው የሚጭንበት ስር — ማውጫ፣ ከመነሻ ማውጫው የሚመነጨውን ነባሪ በመተካት (#11827)። የመቃኛ ዱካውን ለማዛወር ብቻ HOMEን ከመቀየር ይልቅ በDocker/K8s ውስጥ ወደ bind-mounted የተሰኪ ዛፍ ያመልክቱት (HOME ሌሎች ሁሉንም ከመነሻ ማውጫ ጋር የተያያዙ ባህሪያትንም ይቆጣጠራል)። ካልተዋቀረ = `~/.omniroute/plugins`፣ ወይም ሂደቱ ምንም መነሻ ማውጫ ካልላከ `/tmp/.omniroute/plugins` — ይህ ተለዋዋጭ የሚያስወግደው በዝምታ ያለመገኘት ችግኝ። የተፈታው ማውጫ ሲጀመር አንድ ጊዜ እንደ `scanner.dir_resolved` ከተመረጠው ግቤት ጋር ይመዘገባል። በአገልጋይ በኩል ብቻ፦ የCLI ትዕዛዝ ተሰኪዎች የራሳቸውን `OMNIROUTE_PLUGIN_PATH` ይይዛሉ (ክፍል 9)። | +| `STORAGE_ENCRYPTION_KEY` | _(ባዶ = የተሰናከለ)_ | `src/lib/db/encryption.ts` | ሙሉውን የSQLite የውሂብ ጎታ በማከማቻ ላይ ሳለ ለማመስጠር የሚያገለግል AES ቁልፍ። በ`openssl rand -hex 32` ያመንጩ። | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | የምስጠራ ቁልፉ የስሪት መለያ። የቆዩ ምትኬዎችን መፍታት እንዲቻል ቁልፍ በሚቀየርበት ጊዜ ይጨምሩት። | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` ሲሆን፣ መደበኛ/ከመጻፍ በፊት የሚደረጉ የSQLite ፋይል ምትኬዎችን (የmodels.dev ዋጋ ማስቀመጥ/ማጽዳት፣ የቅንብሮች ጽሁፎች) ይዘላል። በእጅ የሚደረጉ እና ከመመለስ በፊት የሚደረጉ ምትኬዎች አሁንም ይሰራሉ። የስደት አስኪያጁን አስገዳጅ ዘላቂ የደህንነት ቅጽበተ-ፎቶ ወይም ላለ ቋሚ DB የጅምላ-ስደት መከላከያን **አያሰናክልም**። በእጅ ያልተደረጉ ምትኬዎች ቢበዛ በየ60 ደቂቃው አንድ ጊዜ እንዲከናወኑ ይገደባሉ። የዳሽቦርዱ **ቅንብሮች → ማከማቻ** መደበኛ ራስ-ሰር ምትኬን በተናጥል ማሰናከል ይችላል። | +| `OMNIROUTE_CRYPT_KEY` | _(ያልተዋቀረ)_ | `src/lib/db/encryption.ts` | የ`STORAGE_ENCRYPTION_KEY` **የቆየ ተለዋጭ ስም**። ዋናው ተለዋዋጭ በማይኖርበት ጊዜ እንደ አማራጭ ይቀበላል። | +| `OMNIROUTE_API_KEY_BASE64` | _(ያልተዋቀረ)_ | `src/lib/db/encryption.ts` | እንደ አማራጭ የሚቀበል **የቆየ ተለዋጭ ስም** (በBase64 የተመሰጠረ ቅርጽ)። ከመጠቀም በፊት በራስ-ሰር ይፈታል። | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ያልተዋቀረ)_ | `src/lib/db/core.ts` | ወቅታዊውን የSQLite ጤና ምርመራ ክፍተት (ms) ይተኩ። ካልተዋቀረ፣ ነባሪዎቹ ከ`NODE_ENV` ይወሰናሉ። | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(የተወገደ)_ | `src/lib/db/walMaintenance.ts` | **ተወግዷል።** ወቅታዊ ቀጥታ `wal_checkpoint(TRUNCATE)` የጋራውን የwal-index ካርታ ስራ ሊያሳጣ እና ሂደቱን በSIGBUS (#13973) ሊያቋርጥ ስለሚችል፣ መርሐግብር አስኪያጁ ከእንግዲህ የለም። ተለዋዋጩ የማይሰራ ነው፦ አዎንታዊ እሴት የአንድ ጊዜ የመቋረጥ ማስጠንቀቂያ ይመዘግባል፣ `0` ወይም አለመዋቀር ግን ዝም ይላል። WAL በPASSIVE የፍተሻ ነጥቦች (ከታች) ይጠበቃል፣ እና በመዝጊያ የፍተሻ ነጥብ ይቆረጣል። | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | ተደጋጋሚውን የ`wal_checkpoint(PASSIVE)` ክፍተት (ms) ይተኩ። የፍተሻ ነጥቦች ፈጣን እንዲሆኑና የWAL ፋይሉ በመዝጊያ ቆረጣዎች መካከል የተገደበ እንዲሆን በመጠባበቅ ላይ ያሉ የWAL ክፈፎችን ትንሽ አድርጎ ይይዛል። `0` ያሰናክለዋል። | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | የPASSIVE ዙር የWAL ፋይሉ ከዚህ መጠን በላይ መሆኑን ሲያገኝ፣ ካርታ የተሰራለትን wal-index እንደገና ሳይጽፍ WAL እንደገና እንዲጀምር `wal_checkpoint(RESTART)`ን ያሂዱ። የቀጥታ truncate-mode የፍተሻ ነጥቦች ተወግደዋል (የ`OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` ረድፍን ይመልከቱ)። | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | ወሳኝ የሀብት ጫና ለ`OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` ከቀጠለ በኋላ ሂደቱ እንዲወጣ `1`/`true`/`yes`/`on` ያድርጉት፤ ይህም 503 ምላሾችን ላልተወሰነ ጊዜ ከማቅረብ ይልቅ ተቆጣጣሪ (systemd `Restart=always`፣ የDocker ዳግም ማስጀመር ፖሊሲ) ንጹህ ሂደት እንዲመልስ ያስችለዋል። | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | ራስን ዳግም ለማስጀመር መውጫው ከመነሳቱ በፊት ወሳኝ ጫናው ምን ያህል ጊዜ መቆየት እንዳለበት። | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(በራስ-ሰር የሚገኝ)_ | `src/lib/db/adapters/sqljsAdapter.ts` | የ`sql.js` WASM አማራጭ አስማሚን ሲጠቀሙ ወደ `sql-wasm.wasm` የሚወስድ ግልጽ ዱካ (ፍጹም ወይም ከcwd አንጻር)። ካልተዋቀረ በጥቅል ጥገኝነቶችና በእጩ አቀማመጦች በኩል በራስ-ሰር ይገኛል። | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | የመጨረሻ ሁኔታ ላይ ያለ (የተጠናቀቀ/ያልተሳካ/የተሰረዘ/ጊዜው ያለፈ) የBatch API ስራ የፍተሻ ነጥቦች፣ ተጠቃሽ የግቤት/ውጤት/ስህተት ፋይሎች እና ረድፉ በራስ-ሰር የማጽዳት ዙር ከመሰረዛቸው በፊት የሚቆዩባቸው ቀናት። `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ከበራ በኋላ ብቻ ተግባራዊ ይሆናል፤ ከOpenAI የራሱ የBatch API ውጤት ማቆያ ጊዜ ጋር ይዛመዳል። በንድፍ ሁሌም ያለ ቅድመ ሁኔታ (ያለ የዕድሜ ማጣሪያ) በሚቆየው፣ በኦፕሬተር በሚነሳው `DELETE /api/v1/batches/delete-completed` መስመር ላይ ተጽዕኖ አያሳድርም። | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` ሲሆን፣ ራስ-ሰር የማጽዳት ዙሩ ከ`OMNIROUTE_BATCH_RETENTION_DAYS` ያለፉ የመጨረሻ ሁኔታ ላይ ያሉ የBatch API ስራዎችን (እና የፍተሻ ነጥቦቻቸውን) እንዲሰርዝ፣ እንዲሁም የራሳቸው `expires_at` ያለፈባቸውን የተሰቀሉ ፋይሎች BLOB ይዘት እንዲያጸዳ ይፍቀዱ። በነባሪነት ጠፍቷል፦ ኦፕሬተር በፈቃዱ እስኪያበራው ድረስ እያንዳንዱ ነባር ጭነት ይህን ውሂብ ልክ እንደበፊቱ ያቆያል። እንዲሁም በዳሽቦርድ ሊስተካከል የሚችል የባህሪ ሰንደቅ ነው — `docs/reference/FEATURE_FLAGS.md` → Runtime ይመልከቱ። | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | በማስጀመር ጊዜ የDB ጤና ምርመራውን ሙሉ በሙሉ ለመዝለል ወደ `1` ያቀናብሩ። ለአጭር ጊዜ ለሚሰሩ ተግባራት እና የውህደት ሙከራዎች ጠቃሚ ነው። | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | በተለምዶ በሚዘለልበት ጊዜም እንኳ (ለምሳሌ፣ ለአጭር ጊዜ በሚሰሩ ተግባራት) የDB ጤና ምርመራ ዑደቱን በግድ ለማብራት ወደ `1` ያቀናብሩ። | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | በ`npm install` ጊዜ የቤተኛ runtime ቅድመ-ማሞቂያውን ለመዝለል ወደ `1` ያቀናብሩ። sqlite አስቀድሞ በተገነባባቸው የCI/headless ጭነቶች ውስጥ ጠቃሚ ነው። | +| `OMNIROUTE_MIGRATIONS_DIR` | _(በራስ-ሰር የሚገኝ)_ | `src/lib/db/migrationRunner.ts` | የmigration runner የሚቃኘውን ማውጫ ይተኩ። በብጁ builds ውስጥ የታሸጉ migrations ሲላኩ ጠቃሚ ነው። | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(አልተቀናበረም)_ | `src/lib/db/migrationRunner/extraDirs.ts` | በመድረኩ የpath delimiter የተለያዩ ተጨማሪ የmigration ማውጫዎችን እንደ `namespace=dir` ግቤቶች ይግለጹ (ለምሳሌ `ee=/opt/app/enterprise/db/migrations`)። እዚያ የተገኙ ፋይሎች እንደ `-` ይመዘገባሉ፤ ስለዚህ የራሱን migrations የሚያቀርብ ስርጭት ከupstream የቁጥር ቦታዎች ጋር ፈጽሞ አይጋጭም። የተሳሳተ ቅርጸት ያለው ግቤት፣ ልክ ያልሆነ namespace ወይም የጎደለ ማውጫ schemaውን በዝምታ ከመዝለል ይልቅ በማስጀመር ጊዜ ስህተት ያስነሳል። | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | የብዙ በመጠባበቅ ላይ ያሉ migrations የደህንነት ገደብ (#3416)። በነባር DB ላይ ከዚህ ቁጥር በላይ migrations የሚጠባበቁ ከሆነ ማስጀመሩ ይቋረጣል (ይህም የመከታተያ ሰንጠረዥ ከመጥፋት ይከላከላል)። የቆየ backup ለመመለስ ከፍ ያድርጉት፤ ምርመራውን ለማሰናከል ወደ `0` ያቀናብሩ። | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | ለ`check:install-upgrade` የrelease gate የሥራ ማውጫ። በግምት 12 GB (ሁለት ~3 GB የጭነት ዛፎች እና tarball) ያስፈልገዋል፤ ስለዚህ በትንሽ tmpfs ላይ መሮጥ የለበትም — በself-hosted runner ላይ `/tmp` በRAM የሚደገፍ 12 GB tmpfs ሲሆን gateው ሙሉ በሙሉ ተጠቅሞበት packageውን አቋርጦታል። | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(በኮድ ውስጥ ያለው ነባሪ)_ | `src/lib/spend/batchWriter.ts` | በbatch ለሚጻፈው የወጪ/cost writer የflush ክፍተት (ms)። ዝቅተኛ እሴቶች የጽሑፍ ማዋሃድን ይቀንሳሉ፤ ከፍተኛ እሴቶች የDB ፉክክርን ይቀንሳሉ። | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(በኮድ ውስጥ ያለው ነባሪ)_ | `src/lib/spend/batchWriter.ts` | በግዳጅ flush ከመደረጉ በፊት ሊከማቹ የሚችሉ ከፍተኛው የወጪ ግቤቶች ብዛት። ከፍተኛ-QPS ባላቸው deployments ላይ ከፍ ያድርጉት፤ የተገደበ memory የበለጠ አስፈላጊ ሲሆን ዝቅ ያድርጉት። | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(አልተቀናበረም)_ | `open-sse/utils/proxyFetch.ts` | በVercel relay path ላይ የ`[ProxyFetch]` debug logs ለማውጣት ወደ `"true"` ያቀናብሩ። የrouting ፍንጮችን እንዳያጋልጥ በነባሪነት ጠፍቷል። | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | በዝርዝር የ`[ProxyEgress]` process-log መስመር ውስጥ የclient/egress IPዎችን እና የaccount prefixን ለማካተት ወደ `"true"` ወይም `"1"` ያቀናብሩ። process logው IPዎችን ወይም የaccount prefixን እንዳያጋልጥ በነባሪነት ጠፍቶ ይቆያል። | +| `OMNIROUTE_DEBUG` | _(አልተቀናበረም)_ | `bin/cli/commands/quota.mjs` | ከCLI quota commands ለእያንዳንዱ ጥያቄ የጊዜ ምርመራዎችን (`[omniroute] GET completed in Nms`) ወደ stderr ለማተም ወደ `1` ያቀናብሩ። | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(በራስ-ሰር)_ | `scripts/dev/healthcheck.mjs` | በcontainer health check የሚመረመረው ግልጽ path። ካልተቀናበረ፣ probeው ከ`OMNIROUTE_BASE_PATH` ያመነጨዋል፤ እሱን ማቀናበር ወደ ጥልቅ monitoring endpoint እንደገና ያስገባል። | +| `OMNIROUTE_DEBUG_COMPLETION` | _(አልተቀናበረም)_ | `bin/cli/commands/completion.mjs` | ከCLI shell-completion cache paths (read/refresh/write) የ`[omniroute completion]` ምርመራዎችን ለማውጣት ወደ ማንኛውም ባዶ ያልሆነ እሴት ያቀናብሩ። በነባሪነት ጠፍቷል — እነዚያ caches በዝምታ ስለሚከሽፉ የጎደለ/የተበላሸ cache tab-completionን በፍጹም አያበላሽም። | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | ለእያንዳንዱ batch item ከፍተኛው የዳግም ሙከራ ጊዜ መስኮት (ms)። ይህን ጊዜ የሚያልፉ ንጥሎች እንደ ያልተሳኩ ምልክት ይደረግባቸዋል። | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | የባች ንጥሎች ዳግም ሙከራ ሲደረግ ለኤክስፖነንሻል መጠበቂያ መሠረታዊ መዘግየት (ms)። | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | በባች ንጥሎች ዳግም ሙከራዎች መካከል ለኤክስፖነንሻል መጠበቂያ ከፍተኛው ገደብ (ms)። | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | በአንድ ጊዜ ሊከናወኑ የሚችሉ ከፍተኛው የባቾች ብዛት። የማስኬድ አቅምን ለመጨመር ያሳድጉት፤ የተመን ገደብ መብዛትን ለማስወገድ ዝቅተኛ ያድርጉት። | > [!IMPORTANT] -> ነባር ቋሚ የውሂብ ጎታን ከመቀየሩ በፊት፣ የፍልሰት አስኬጁ ሙሉ፣ -> በይዘት አድራሻ የተሰጠውን ቅጽበተ-ገጽ በ`DATA_DIR/db_backups/` ስር ያትማል። ህትመቱ በተመሳሳይ የፋይል ስርዓት ላይ፣ -> መተካት የማይፈቅዱ ጠንካራ አገናኞችን እና ዘላቂ የፋይል ማመሳሰልን የሚደግፍ የፋይል ስርዓት -> ይፈልጋል። POSIX አስተናጋጆች የማውጫ ማመሳሰልንም ይፈልጋሉ፤ በWindows ላይ Node የማውጫ መያዣዎችን ላይቀበል ስለሚችል፣ OmniRoute -> የታተመውን ፋይል ያጸዳል እና የማውጫ ግቤት ማመሳሰልን እንደ ምርጥ ጥረት ይቆጥረዋል። -> የተጫነው `DATA_DIR` እነዚያን ዋስትናዎች ማቅረብ ካልቻለ፣ ፍልሰት ከመተግበሩ በፊት ጅማሬው በደህንነት ይቋረጣል። -> `DATA_DIR`ን እነዚያ መሠረታዊ ክወናዎች ወዳሉት የውሂብ ጥራዝ ያንቀሳቅሱት፤ የፍልሰት ደህንነትን ለማለፍ -> `DISABLE_SQLITE_AUTO_BACKUP`ን አይጠቀሙ። +> ነባር ቋሚ የውሂብ ጎታን ከመቀየሩ በፊት፣ የፍልሰት አስኪያጁ የተሟላ፣ +> በይዘት አድራሻ የሚሰጠውን ቅጽበተ-ፎቶ በ`DATA_DIR/db_backups/` ስር ያትማል። ህትመቱ በተመሳሳይ የፋይል ስርዓት ውስጥ +> ያሉ፣ በላያቸው የማይጻፍ ጠንካራ አገናኞችን እና ዘላቂ የፋይል ማመሳሰልን የሚደግፍ የፋይል ስርዓት +> ይፈልጋል። የPOSIX አስተናጋጆች የማውጫ ማመሳሰልንም ይፈልጋሉ፤ በWindows ላይ Node የማውጫ መያዣዎችን ላይቀበል ይችላል፣ ስለዚህ OmniRoute +> የታተመውን ፋይል ወደ ዲስክ ይጽፋል እና የማውጫ ግቤት ማመሳሰልን እንደ ተቻለ መጠን የሚከናወን አድርጎ ይቆጥራል። +> የተጫነው `DATA_DIR` እነዚያን ዋስትናዎች መስጠት ካልቻለ፣ ፍልሰት ከመተግበሩ +> በፊት ማስጀመር በደህንነት ምክንያት ይቋረጣል። `DATA_DIR`ን እነዚያ መሠረታዊ ባህሪያት ወዳሉት የማከማቻ ጥራዝ ያንቀሳቅሱ፤ +> የፍልሰት ደህንነትን ለማለፍ `DISABLE_SQLITE_AUTO_BACKUP`ን አይጠቀሙ። ### ሁኔታዎች | ሁኔታ | ውቅር | | ------------------- | ----------------------------------------------------------------------- | -| **የአካባቢ ልማት** | ሁሉንም ነባሪ ቅንብሮች እንዳሉ ይተዉ። የውሂብ ጎታው በ`~/.omniroute/omniroute.db` ይኖራል። | -| **Docker** | `DATA_DIR=/data` + በ`/data` ላይ የውሂብ ጥራዝ ይጫኑ። | +| **አካባቢያዊ ልማት** | ሁሉንም ነባሪ ቅንብሮች እንዳሉ ይተዉ። የውሂብ ጎታው በ`~/.omniroute/omniroute.db` ይገኛል። | +| **Docker** | `DATA_DIR=/data` + በ`/data` ላይ የማከማቻ ጥራዝ ይጫኑ። | | **በማከማቻ ጊዜ የተመሰጠረ** | `STORAGE_ENCRYPTION_KEY`ን ያዘጋጁ + የቁልፉን ምትኬዎች ያስቀምጡ! እሱን ማጣት = ውሂብን ማጣት። | | **CI/ሙከራ** | `DATA_DIR=/tmp/omniroute-test` — ጊዜያዊ ነው፣ ምስጠራ አያስፈልግም። | @@ -213,44 +212,45 @@ OmniRoute ለሁሉም ቋሚ ማከማቻ **SQLite**ን (በ`better-sqlite3` ## 4. ደህንነት እና ማረጋገጫ -| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | -| ------------------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | ለማሽን አሻራ ልየታ ከሃርድዌር መለያዎች ጋር የሚጣመር salt። ለእያንዳንዱ deployment ለይቶ ለማቆየት ይቀይሩት። | -| `OMNIROUTE_CLI_SALT` | _(ካልተዋቀረ = በእያንዳንዱ install በዘፈቀደ የሚፈጠር salt፣ በ`/cli-token-salt.json` ላይ የሚቀመጥ)_ | `src/lib/machineToken.ts` | የአካባቢያዊ CLI auth tokenን ለማመንጨት የሚያገለግል HMAC salt። ይህን እሴት ማዋቀር በማሽኑ ላይ ያሉትን ሁሉንም CLI tokens ያድሳል፣ እንዲሁም ሁልጊዜ ከተቀመጠው salt ቅድሚያ ያገኛል። `docs/security/CLI_TOKEN.md`ን ይመልከቱ። | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | በsession cookies ላይ የ`Secure` flagን ያዘጋጃል። ከHTTPS በስተጀርባ ሲሰራ **`true` መሆን አለበት**። | -| `REQUIRE_API_KEY` | `false` | API middleware | `true` ሲሆን፣ ሁሉም የ`/v1/*` proxy requests ትክክለኛ API key ማካተት አለባቸው። | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | ሙሉ የAPI key እሴቶች በDashboard UI ውስጥ እንዲታዩ ይፈቅዳል። ከDashboard Feature Flags ማዋቀር ይቻላል፤ በጋራ ጥቅም ላይ በሚውሉ instances ላይ የደህንነት ስጋት አለው። | -| `NO_LOG_API_KEY_IDS` | _(ባዶ)_ | `src/lib/compliance/index.ts` | request loggingን የሚያልፉ፣ በኮማ የተለያዩ API key IDs (ለGDPR ተገዢነት)። | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(ካልተዋቀረ = ያልተገደበ)_ | `src/shared/utils/apiKeyPolicy.ts` | የ`rate_limits` column null ለሆነባቸው API keys ተግባራዊ የሚደረግ የዕለታዊ requests መጠባበቂያ ገደብ። ካልተዋቀረ ወይም ባዶ ከሆነ፦ በራሱ የሚተገበር ገደብ የለም (#2289, #11017)። `0`ም ተመሳሳይ ነው (ያልተገደበ)። አዎንታዊ integer N፣ N/day፣ 5N/week፣ 20N/monthን ያነቃል። ቅርጸቱ የተበላሸ ባዶ ያልሆነ እሴት ወደ ቀድሞዎቹ የ1000/day፣ 5000/week፣ 20000/month ጊዜ መስኮቶች ይመለሳል። | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | የተፈቀደው ከፍተኛው የrequest body መጠን። ከዚህ ገደብ የሚበልጡ payloadsን ውድቅ ያደርጋል። | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | ከዚህ threshold ጋር እኩል ወይም ከዚያ በላይ የሆኑ ትክክለኛ request bodies፣ JSON ከመተንተኑ በፊት atomic process-local heavyweight admission leaseን ይወስዳሉ (`POST /v1/responses`ን ጨምሮ የBYTE path)። ከstructure-heavy ጋር ተመሳሳይ የ[#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) healthy-headroom ማምለጫ አለው፤ ሆኖም [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) እንዳይመለስ አሁንም በ`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) የተገደበ ነው። | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | `Content-Length` የሌላቸውን፣ ልክ ያልሆነ ወይም የሐሰት `Content-Length` ያላቸውን requests ጨምሮ፣ በተገደበ ingestion ወቅት በተነበቡ bytes ላይ የሚተገበር የchat-route ጥብቅ ከፍተኛ ገደብ፤ ከገደቡ በላይ የሆነ ጥያቄ `413` ይቀበላል። | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(አልተዋቀረም — በጥያቄ ብዛት ላይ ገደብ የለም)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** ይህ የቆየ የጥያቄ-ብዛት ገደብ አሁን በግልጽ ሲዋቀር ብቻ ተፈጻሚ ይሆናል። ሳይዋቀር ከቀረ (ነባሪው)፣ ከባድ የውይይት ጥያቄዎችን መቀበል በምትኩ በ`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ይገደባል — በ**አንድ ፕሮሰስ** (አንድ V8 heap) ውስጥ ከፕሮሰሱ ትክክለኛ የማህደረ ትውስታ ጣሪያ መጠን በራስ-ሰር የሚሰላ የBYTE በጀት። ሁለት ተደራራቢ ~750k-token `/v1/responses` 12 GiB ገደማ ያላቸውን heaps ያቋርጣሉ (#7849) — ይህ ጠንካራ የምርት ከፍተኛ ገደብ 2 ሳይሆን የ**ማህደረ ትውስታ-በጀት** ማስጠንቀቂያ ነው። ጤናማ ፕሮሰስ (heap ከመቀነሻ ጥምርታው በታች ሲሆን) በ`OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` አማካይነት ተጨማሪ ተጓዳኝ ረጅም `/v1/responses` ሊቀበል ይችላል። በአስርዎች የሚቆጠሩ ረጅም SSE ደንበኞች (40–50) ጉዳይ heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 ነው፤ “ከፍተኛው 2” አይደለም። “host-ን ለመጠቀም” ብቻ ይህን ያለ ግንዛቤ ከፍ ማድረግ #7849ን መልሶ ያመጣል። **heaps**ን በ**N ነጻ `DATA_DIR`s** (#11024) ያባዙ፤ በአንድ SQLite ፋይል ላይ `replicas>1`ን ፈጽሞ አይጠቀሙ። | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(በራስ-ሰር የሚሰላ)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** በራስ-ሰር ለሚሰላው የማስገቢያ byte በጀት ማሻሻያ (ከሁለቱ ይበልጥ ጥብቅ ከሆነው V8/cgroup የማህደረ ትውስታ ጣሪያ 25%፣ በ8x ጊዜያዊ ማጉላት የተከፈለ)። የተሰሉና በግልጽ የተዋቀሩ እሴቶች በ8 MiB–2 GiB መካከል ይገደባሉ። ከተፈጻሚው በጀት የሚበልጥ body ወዲያውኑ በ`413 body_exceeds_budget` አይሳካም፤ በተናጠል ሊስተናገዱ በሚችሉ bodies መካከል ያለ ፉክክር እንደገና ሊሞከር የሚችል `503` ሆኖ ይቆያል። 40–50 ተጓዳኝ ረጅም SSE ደንበኞች የዚህ በጀት + heap ጉዳይ ናቸው፤ ጠንካራ “ከፍተኛው 2” ገደብ አይደለም። ከማስተካከልዎ በፊት በ`/api/monitoring/health` ላይ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity`ን ያንብቡ። | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | ለBYTE እና STRUCTURE ከባድ ጥያቄዎች መቀበል የheap-ጫና መቀነሻ ጥምርታ (`heapUsed / heap_size_limit`) (#10183, #10268, #10437)። ከ`OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` የሚያልፍ ተጓዳኝ ከባድ ጥያቄ፣ heap እንዲሁም በዚህ ጥምርታ ወይም ከዚያ በላይ ሲሆን ብቻ እንደገና ሊሞከር በሚችል `503` ይቀነሳል፤ በጤናማ heap ላይ ግን በhealthy-headroom በኩል ይቀበላል። | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ነባሪ `1`) | `src/shared/middleware/chatBodyAdmission.ts` | ለጤናማ-heap ፈጣን መንገድ (#10437) በ**ሁለቱም** STRUCTURE እና BYTE (`admitChatRequest`፣ ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` የሆኑ bodiesን ጨምሮ) የተገደበ ተጨማሪ አቅም። ያለዚህ ገደብ፣ እያንዳንዱ ስራ-የበዛበት-ነገር-ግን-ጤናማ-heap ጥያቄ ያለ ምንም ጣሪያ የመቀበያ ቁጥጥሩን ያልፍ ነበር። በጤናማ-heap መንገድ በኩል ይህን ያህል ተጓዳኝ leases ንቁ ከሆኑ በኋላ፣ ተጨማሪ ስራ-የበዛባቸው ጥያቄዎች በእውነተኛ heap ጫና ጊዜ ወደሚጠቀመው ተመሳሳይ የተገደበ-መጠበቂያ/መቀነሻ መንገድ ይወርዳሉ። `0` ማለፊያውን ሙሉ በሙሉ ያሰናክላል። | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | bodyው ከbyte ወሰኑ በታች ቢሆንም የውይይት ጥያቄን ከባድ ብሎ የሚመድብ የመልዕክት ብዛት። | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | bodyው ከbyte ወሰኑ በታች ቢሆንም የውይይት ጥያቄን ከባድ ብሎ የሚመድብ የመሣሪያ ብዛት። | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | ጥያቄን ከባድ ብሎ የሚመድብ ጥንቃቄ ያለው የstring-መጠን token ግምት፤ ይህ የመቀበያ-ወጪ ምትክ መለኪያ እንጂ የአቅራቢ የክፍያ tokenization አይደለም። | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (የተሰናከለ) | `src/shared/middleware/chatBodyAdmission.ts` | አማራጭ በፍላጎት የሚነቃ የውይይት ታሪክ ገደብ። በነባሪ የተሰናከለ ነው፦ የመልዕክት ብዛት የdeployment ፖሊሲ እንጂ የጥያቄ ሁሉን አቀፍ ባህሪ አይደለም፤ እዚህ ላይ መገደብም የማመቅ ሂደቱ ሊስተናገዱ የሚችሉ እንዲያደርጋቸው ከመቻሉ በፊት ውይይቶችን በመጨረሻዊ `413` ውድቅ ያደርጋል። የheap እድገት በ`OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` እና በheap-ጫና መቀነሻው ይገደባል። ጠንካራ ጣሪያ በሚያስፈልጋቸው ማህደረ ትውስታ-ውስን deployments ላይ አዎንታዊ እሴት ያዋቅሩ፤ ከገደቡ የሚበልጠው ከዚያ የተዋቀረ compact-required `413` ይቀበላል። | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | ሙሉ በሙሉ ወደ ማህደረ ትውስታ በbuffer ለሚደረግ non-streaming upstream ምላሽ ጠንካራ ገደብ። ከዚህ በላይ upstream reader ይሰረዛል፣ እና ጥያቄው heap እስኪሟጠጥ ድረስ ገደብ የለሽ string ከማሳደግ ይልቅ በፍጥነት አይሳካም። | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | ከupstream ምላሽ headers የሚተላለፉ ከፍተኛው የwire bytes። በጀቱ ሲታለፍ፣ በተለመዱ reverse-proxy header ገደቦች ውስጥ ለመቆየት ዝቅተኛ-ቅድሚያ headers (ለምሳሌ፣ ብጁ `x-codex-*`፣ `x-oai-request-id`) ይጣላሉ። በትልቅ የምላሽ header መጠን ወጪ ተጨማሪ upstream metadata ለማስተላለፍ ከፍ ያለ እሴት ያዋቅሩ። | -| `CORS_ORIGIN` | _(አልተዋቀረም)_ | `src/server/cors/origins.ts` | የቆየ ባለአንድ መነሻ CORS የፍቃድ ዝርዝር። ለአዲስ ስምሪቶች `CORS_ALLOWED_ORIGINS`ን ይምረጡ። CORS መነሻቸው የተለያየ ለሆኑ የአሳሽ API ደንበኞች ብቻ ነው፤ የተረጋገጡ የዳሽቦርድ የመጻፍ ጥያቄዎች በምትኩ ተመሳሳይ መነሻ ያላቸውን ጥያቄዎች ከክፍለ ጊዜ ጋር የተያያዘ የCSRF ጥበቃ ጋር ይጠቀማሉ። | -| `CORS_ALLOWED_ORIGINS` | _(አልተዋቀረም)_ | `src/server/cors/origins.ts` | በኮማ የተለያየ የCORS ፍቃድ ዝርዝር። `CORS_ALLOW_ALL=true` በግልጽ ካልተዋቀረ በስተቀር ምንም ሁለንተናዊ ምልክት አይላክም። | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | ማንኛውንም የአሳሽ `Origin` መልሶ ለማስተጋባት ለልማት ብቻ የሚያገለግል ማምለጫ መንገድ። በጋራ ወይም በምርት ስምሪቶች ላይ አያንቁት። | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | የግል/loopback/link-local IP ክልሎችን ዒላማ ያደረጉ የአቅራቢ ጥሪዎችን ያግዱ። በተነጠሉ የሙከራ አካባቢዎች ብቻ ያሰናክሉት። | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | ወደ የግል/አካባቢያዊ አውታረ መረቦች (localhost, 192.168.x.x, 10.x.x.x፣ ወዘተ) የሚያመለክቱ የአቅራቢ URLዎችን ይፍቀዱ። **በራስ ለሚስተናገዱ አቅራቢዎች ያስፈልጋል** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG)። `false` ሲሆን ዳሽቦርዱ የአካባቢያዊ URLዎችን ማረጋገጥ ውድቅ ያደርጋል። | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | በአካባቢያዊ/የግል አድራሻዎች (127.0.0.1, localhost, LAN, የግል ክልሎች) ላይ አቅራቢዎችን ማከል/ማረጋገጥ ይፍቀዱ — ይህም በአቅራቢ ማረጋገጫ መንገድ ላይ ብቻ የተወሰነ ነው። **ነባሪው `true` ነው** (ለአካባቢያዊ ቅድሚያ የሚሰጥ)፤ ይፋዊ አድራሻዎችን ብቻ የሚፈቅድ ጥብቅ እገዳን ለማስፈጸም `false` ያድርጉት። የደመና ሜታዳታ መገልገያ ነጥቦች (169.254.169.254, metadata.google.internal) ምንም ይሁን ምን እንደታገዱ ይቆያሉ። (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | የ`/v1/audio/*` መስመሮች (ጽሑፍ ቅጂዎች፣ ንግግር፣ ትርጉሞች) ከlocalhost ውጭ የሚስተናገድ OpenAI-ተኳሃኝ የአቅራቢ ኖድ እንዲጠቀሙ ያስችላል። በነባሪ ጠፍቷል — ኦዲዮን ወደ ርቀት አስተናጋጅ ማስተላለፍ የወጪ ትራፊክ ማንነትን ይቀይራል፣ እናም ይህ ግልጽ የከዋኝ ውሳኔ መሆን አለበት። Loopback/የግል ኖዶች (localhost, 127.0.0.1, 172.16-31.x) ሁልጊዜ የተፈቀዱ ሲሆን ምንም ተጽዕኖ አያድርባቸውም። (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC ሲነቃ ተጠቃሚዎች በOIDC ነጠላ መግቢያ ብቻ ማንነታቸውን ማረጋገጥ እንዲችሉ በይለፍ ቃል መግባትን ያሰናክሉ። አጭሩ ተለዋጭ ስም `OIDC_DISABLE_PASSWORD_LOGIN` እንዲሁም ተቀባይነት አለው፤ ተመሳሳይ ቁልፍ ያለው የዳሽቦርድ ባህሪ ጠቋሚ ቅድሚያ ይሰጠዋል። (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | የ`OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` አጭር ተለዋጭ ስም (#10889)። | - -### የደኅንነት ማጠናከሪያ ማረጋገጫ ዝርዝር +| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | +| ------------------------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | የማሽን አሻራ ለመፍጠር ከሃርድዌር መለያዎች ጋር የሚጣመር salt። ማግለልን ለማረጋገጥ በእያንዳንዱ deployment ይቀይሩት። | +| `OMNIROUTE_CLI_SALT` | _(ካልተዋቀረ = በእያንዳንዱ install በዘፈቀደ የሚፈጠር እና በ`/cli-token-salt.json` የሚቀመጥ salt)_ | `src/lib/machineToken.ts` | የአካባቢያዊውን CLI ማረጋገጫ token ለማመንጨት የሚያገለግል HMAC salt። ይህን እሴት ማዋቀር በማሽኑ ላይ ያሉትን ሁሉንም CLI tokens ያድሳል፣ እንዲሁም ሁልጊዜ ከተቀመጠው salt ይልቅ ቅድሚያ ያገኛል። `docs/security/CLI_TOKEN.md`ን ይመልከቱ። | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | በsession cookies ላይ የ`Secure` flagን ያዘጋጃል። ከHTTPS በስተጀርባ ሲሰራ **`true` መሆን አለበት**። | +| `REQUIRE_API_KEY` | `false` | API middleware | `true` ሲሆን፣ ሁሉም የ`/v1/*` proxy requests ትክክለኛ API key ማካተት አለባቸው። **ይህ flag `GET /v1/models`ን አይገድብም**፤ በምትኩ የDashboard login postureን (`requireAuthForModels`) ይከተላል — ስለዚህ ከ`/v1/models` የሚመጣ `401` inference የተጠበቀ ነው ማለት **አይደለም**። `docs/security/INFERENCE_AUTH_POSTURE.md`ን (#13695) ይመልከቱ። | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | በDashboard UI ውስጥ ሙሉ የAPI key እሴቶችን ማሳየት ያስችላል። ከDashboard Feature Flags ሊዋቀር ይችላል፤ በጋራ ጥቅም ላይ በሚውሉ instances ላይ የደህንነት አደጋ አለው። | +| `NO_LOG_API_KEY_IDS` | _(ባዶ)_ | `src/lib/compliance/index.ts` | request loggingን የሚያልፉ በነጠላ ሰረዝ የተለያዩ API key IDs (ለGDPR compliance)። | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(ካልተዋቀረ = ያልተገደበ)_ | `src/shared/utils/apiKeyPolicy.ts` | የ`rate_limits` column null ለሆነባቸው API keys የሚተገበር ተተኪ የዕለታዊ request budget። ካልተዋቀረ ወይም ባዶ ከሆነ፦ በስውር የሚተገበር ገደብ የለም (#2289, #11017)። `0`ም ተመሳሳይ ነው (ያልተገደበ)። አዎንታዊ ኢንቲጀር N፣ N/ቀን፣ 5N/ሳምንት፣ 20N/ወር ያነቃል። ቅርጸት የተበላሸ ባዶ ያልሆነ እሴት ወደ ቀድሞው 1000/ቀን፣ 5000/ሳምንት፣ 20000/ወር windows ይመለሳል። | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | ከፍተኛው የተፈቀደ request body መጠን። ከዚህ ገደብ የሚበልጡ payloadsን ውድቅ ያደርጋል። | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | ከዚህ threshold ጋር እኩል ወይም በላይ የሆኑ ትክክለኛ request bodies JSON ከመተንተናቸው በፊት አቶሚካዊውን፣ process-local heavyweight admission lease ይወስዳሉ (BYTE path፣ `POST /v1/responses`ን ጨምሮ)። ከstructure-heavy ጋር ተመሳሳይ የ[#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) healthy-headroom escape ነው፤ አሁንም በ`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) የተገደበ ስለሆነ [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) እንደገና አይከሰትም። | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | የ`Content-Length` እሴት የጎደለ፣ ልክ ያልሆነ ወይም ሐሰተኛ የሆነባቸውን ጥያቄዎች ጨምሮ፣ በተወሰነ የማስገባት ሂደት ወቅት በተነበቡ ባይቶች ላይ የሚተገበር የውይይት መስመር ጥብቅ ገደብ፤ ገደቡን ያለፈ ጥያቄ `413` ይቀበላል። | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(አልተዋቀረም — የጥያቄ ብዛት ገደብ የለም)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** ይህ የቆየ የጥያቄ-ብዛት ገደብ አሁን የሚተገበረው በግልጽ ሲዋቀር ብቻ ነው። ሳይዋቀር ከተተወ (ነባሪው)፣ ከባድ የውይይት ጥያቄዎችን መቀበል በምትኩ በ`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ይገደባል — በ**አንድ ሂደት** (አንድ V8 heap) ውስጥ ካለው እውነተኛ የሂደቱ የማህደረ ትውስታ ጣሪያ በራስ-ሰር የሚሰላ የባይት በጀት። ሁለት ተደራራቢ ~~750k-token `/v1/responses` በ~~12 Gi heaps ላይ መቋረጥ ያስከትላሉ (#7849) — ይህ **የማህደረ ትውስታ በጀት** ማስጠንቀቂያ እንጂ የምርቱ ጥብቅ ከፍተኛ ገደብ 2 ነው ማለት አይደለም። ጤናማ ሂደት (heap ከማስወገጃ ጥምርታው በታች ሲሆን) በ`OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` በኩል ተጨማሪ በአንድ ጊዜ የሚካሄዱ ረጅም `/v1/responses` ሊቀበል ይችላል። በአስሮች የሚቆጠሩ ረጅም SSE ደንበኞች (40–50) ጉዳይ heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 ነው፣ “ከፍተኛው 2” አይደለም። ይህን “የአስተናጋጁን አቅም ለመጠቀም” በግዴለሽነት ከፍ ማድረግ #7849ን እንደገና ያስከትላል። **heaps**ን በ**N ነጻ `DATA_DIR`s** (#11024) ያባዙ፤ በአንድ SQLite ፋይል ላይ `replicas>1` ፈጽሞ አይጠቀሙ። | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(በራስ-ሰር የሚሰላ)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** በራስ-ሰር ለሚሰላው የማስገቢያ ባይት በጀት የሚደረግ ማሻሻያ (ከV8/cgroup የማህደረ ትውስታ ጣሪያዎች ይበልጥ ጥብቅ ከሆነው 25%፣ በ8x ጊዜያዊ ማጉላት የተከፈለ)። የተሰሉ እና በግልጽ የተዋቀሩ እሴቶች በ8 MiB–2 GiB መካከል ይገደባሉ። ከተግባራዊው በጀት የሚበልጥ body ወዲያውኑ በ`413 body_exceeds_budget` ይሳካለታል፤ በተናጠል ሊስተናገዱ በሚችሉ bodies መካከል ያለ ፉክክር እንደገና ሊሞከር የሚችል `503` ሆኖ ይቆያል። 40–50 በአንድ ጊዜ የሚገናኙ ረጅም SSE ደንበኞች ጉዳይ ይህ በጀት + heap ነው፣ ጥብቅ “ከፍተኛው 2” አይደለም። ከማስተካከልዎ በፊት በ`/api/monitoring/health` ላይ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity`ን ያንብቡ። | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | ለBYTE እና STRUCTURE ከባድ ጥያቄዎች መቀበል የheap-ጫና ማስወገጃ ጥምርታ (`heapUsed / heap_size_limit`) (#10183, #10268, #10437)። `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`ን ያለፈ በአንድ ጊዜ የሚካሄድ ከባድ ጥያቄ እንደገና ሊሞከር በሚችለው `503` የሚወገደው heap ደግሞ በዚህ ጥምርታ ወይም ከዚያ በላይ ሲሆን ብቻ ነው፤ ጤናማ heap ላይ በhealthy-headroom በኩል ይቀበላል። | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ነባሪ `1`) | `src/shared/middleware/chatBodyAdmission.ts` | ለጤናማ-heap ፈጣን መንገድ (#10437) በ**ሁለቱም** STRUCTURE እና BYTE (`admitChatRequest`፣ ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` የሆኑ bodiesን ጨምሮ) የተወሰነ ተጨማሪ አቅም። ያለዚህ ገደብ፣ heap ጤናማ ሆኖ ስራ የበዛበት እያንዳንዱ ጥያቄ ያለ ጣሪያ የመቀበያ ሂደቱን ያልፍ ነበር። በጤናማ-heap መንገድ በኩል ይህን ያህል በአንድ ጊዜ የሚካሄዱ leases ንቁ ከሆኑ በኋላ፣ ተጨማሪ የስራ ጫና ያለባቸው ጥያቄዎች በእውነተኛ heap ጫና ወቅት ወደሚጠቀመው ተመሳሳይ የተወሰነ-መጠበቂያ/ማስወገጃ መንገድ ይወርዳሉ። `0` ማለፊያውን ሙሉ በሙሉ ያሰናክላል። | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | bodyው ከባይት ወሰኑ በታች ቢሆንም የውይይት ጥያቄን ከባድ ብሎ የሚመድብ የመልዕክት ብዛት። | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | bodyው ከባይት ወሰኑ በታች ቢሆንም የውይይት ጥያቄን ከባድ ብሎ የሚመድብ የመሣሪያ ብዛት። | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | ጥያቄን ከባድ ብሎ የሚመድብ ጥንቃቄ ያለው በሕብረቁምፊ መጠን ላይ የተመሠረተ የtoken ግምት፤ ይህ የመቀበያ ወጪ ግምታዊ መለኪያ እንጂ የአቅራቢ ክፍያ tokenization አይደለም። | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (ተሰናክሏል) | `src/shared/middleware/chatBodyAdmission.ts` | አማራጭ በፈቃድ የሚነቃ የውይይት ታሪክ ገደብ። በነባሪ ተሰናክሏል፦ የመልዕክት ብዛት የስርዓት ማሰማራት ፖሊሲ እንጂ የጥያቄ ሁሉን አቀፍ ባህሪ አይደለም፣ እዚህ ላይ ገደብ ማድረግም የማመቅ ሂደቱ ሊስተናገዱ የሚችሉ ከማድረጉ በፊት ውይይቶችን በመጨረሻዊ `413` ውድቅ ያደርጋል። የheap እድገት በ`OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` እና በheap-ጫና ማስወገጃው ይገደባል። ጥብቅ ጣሪያ በሚያስፈልጋቸው የማህደረ ትውስታ ገደብ ባለባቸው ማሰማራቶች ላይ አዎንታዊ እሴት ያዋቅሩ፤ ከገደቡ ያለፈ ጥያቄ ከዚያ የተዋቀረ ማመቅ-አስፈላጊ `413` ይቀበላል። | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | ሙሉ በሙሉ ወደ ማህደረ ትውስታ ለሚከማች ዥረት-አልባ የላይኛው ምላሽ ጥብቅ ገደብ። ከዚህ ገደብ በላይ የላይኛው አንባቢ ይሰረዛል፣ እናም heap እስኪሟጠጥ ድረስ ገደብ የሌለው ሕብረቁምፊ እንዲያድግ ከማድረግ ይልቅ ጥያቄው በፍጥነት ይሳካለታል። | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | ከወደላይ የሚመጡ የምላሽ ራስጌዎች የሚተላለፉበት ከፍተኛው የዋየር ባይት መጠን። በጀቱ ሲያልፍ፣ በተለመዱ የreverse-proxy ራስጌ ገደቦች ውስጥ ለመቆየት ዝቅተኛ ቅድሚያ ያላቸው ራስጌዎች (ለምሳሌ፣ ብጁ `x-codex-*`፣ `x-oai-request-id`) ይተዋሉ። በትልቅ የምላሽ ራስጌ መጠን ምትክ ተጨማሪ ከወደላይ የሚመጣ metadata ለማስተላለፍ ከፍ ያለ ዋጋ ያዘጋጁ። | +| `CORS_ORIGIN` | _(አልተዘጋጀም)_ | `src/server/cors/origins.ts` | የቆየ ባለአንድ-origin የCORS ፈቃድ ዝርዝር። ለአዳዲስ ስምሪቶች `CORS_ALLOWED_ORIGINS`ን ይምረጡ። CORS ለcross-origin የአሳሽ API ደንበኞች ብቻ ነው፤ ማንነታቸው የተረጋገጠ የዳሽቦርድ የመጻፍ ጥያቄዎች በምትኩ same-origin ጥያቄዎችን ከsession-bound CSRF ጥበቃ ጋር ይጠቀማሉ። | +| `CORS_ALLOWED_ORIGINS` | _(አልተዘጋጀም)_ | `src/server/cors/origins.ts` | በነጠላ ሰረዝ የተለየ የCORS ፈቃድ ዝርዝር። `CORS_ALLOW_ALL=true` በግልጽ ካልተዋቀረ በስተቀር ምንም wildcard አይላክም። | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | ማንኛውንም የአሳሽ `Origin` መልሶ ለማስተጋባት ለልማት ብቻ የሚያገለግል የማለፊያ አማራጭ። በጋራ ወይም በproduction ስምሪቶች ላይ አያንቁት። | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | ወደ private/loopback/link-local IP ክልሎች የሚያመለክቱ የprovider ጥሪዎችን ያግዱ። በተነጠሉ የሙከራ አካባቢዎች ውስጥ ብቻ ያሰናክሉት። | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | ወደ private/local አውታረ መረቦች (localhost፣ 192.168.x.x፣ 10.x.x.x፣ ወዘተ) የሚያመለክቱ የprovider URLዎችን ፍቀድ። **በራስ ለሚስተናገዱ providerዎች ያስፈልጋል** (LM Studio፣ Ollama፣ vLLM፣ Llamafile፣ Triton፣ SearXNG)። `false` ሲሆን፣ ዳሽቦርዱ የlocal URLዎችን ማረጋገጥ ውድቅ ያደርጋል። | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | በlocal/private አድራሻዎች (127.0.0.1፣ localhost፣ LAN፣ private ክልሎች) ላይ providerዎችን ማከል/ማረጋገጥ ፍቀድ — ይህም በprovider ማረጋገጫ መንገድ ብቻ የተወሰነ ነው። **ነባሪው `true` ነው** (local-first)፤ public አድራሻዎችን ብቻ የሚፈቅድ ጥብቅ እገዳ ለማስፈጸም `false` ያዘጋጁ። የcloud-metadata endpoints (169.254.169.254፣ metadata.google.internal) ምንም ይሁን ምን እንደታገዱ ይቆያሉ። (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | የ`/v1/audio/*` መንገዶች (የጽሑፍ ቅጂዎች፣ ንግግር፣ ትርጉሞች) ከlocalhost ውጭ የተስተናገደ OpenAI-compatible provider node እንዲጠቀሙ ፍቀድ። በነባሪ የጠፋ ነው — audioን ወደ remote host መምራት የወጪ ትራፊክ ማንነትን ይቀይራል፣ ስለዚህ ግልጽ የኦፕሬተር ውሳኔ መሆን አለበት። Loopback/private nodes (localhost፣ 127.0.0.1፣ 172.16-31.x) ሁልጊዜ የተፈቀዱ ሲሆን ተጽዕኖም አያድርባቸውም። (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | `POST /v1/rerank` (እና የmemory engine loopback rerank ደረጃ) ከlocalhost ውጭ የተስተናገደ OpenAI-compatible provider node — TEI፣ Infinity፣ vLLM፣ ወዘተ የሚያስኬድ LAN ማሽን ወይም Tailscale peer — እንዲጠቀም ፍቀድ። በነባሪ የጠፋ ነው — ወደ remote host መምራት የወጪ ትራፊክ ማንነትን ይቀይራል፣ ስለዚህ ግልጽ የኦፕሬተር ውሳኔ መሆን አለበት። Loopback nodes (localhost፣ 127.0.0.1፣ 172.16-31.x) ሁልጊዜ የተፈቀዱ ሲሆን ተጽዕኖም አያድርባቸውም። Remote nodes በተጨማሪ የprovider outbound URL ፖሊሲን (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) ማለፍ አለባቸው፤ የcloud-metadata hosts በፍጹም ወደእነሱ አይመሩም። | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC ሲነቃ፣ ተጠቃሚዎች በOIDC Single Sign-On ብቻ ማንነታቸውን እንዲያረጋግጡ የይለፍ ቃል መግቢያን ያሰናክሉ። ቀጥተኛው alias `OIDC_DISABLE_PASSWORD_LOGIN` እንዲሁም ተቀባይነት አለው፤ ተመሳሳይ key ያለው የDashboard Feature Flag ቅድሚያ ይሰጠዋል። (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | የ`OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` ቀጥተኛ alias (#10889)። | + +### የደህንነት ማጠናከሪያ ማረጋገጫ ዝርዝር ```bash -# ዝቅተኛው የምርት ደኅንነት መስፈርት፦ -AUTH_COOKIE_SECURE=true # HTTPS ያስፈልጋል -REQUIRE_API_KEY=true # ሁሉንም የወኪል ጥሪዎች ማንነት ያረጋግጡ +# ዝቅተኛው የproduction ደህንነት መስፈርት፦ +AUTH_COOKIE_SECURE=true # HTTPS ያስፈልገዋል +REQUIRE_API_KEY=true # ሁሉንም የproxy ጥሪዎች ማንነት ያረጋግጡ ALLOW_API_KEY_REVEAL=false # ቁልፎችን በUI ውስጥ በፍጹም አያጋልጡ CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # የ5 MB ገደብ @@ -299,61 +299,68 @@ OmniRoute ባለሁለት-ንብርብር መከላከያ ያቀርባል፦ በ --- -## 6. የመሣሪያ እና የማዘዋወር ፖሊሲዎች - -| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | የLLM መሣሪያ/ፋንክሽን ጥሪ መዳረሻን ይቆጣጠራል። `allowlist` = የተዘረዘሩ መሣሪያዎች ብቻ፣ `denylist` = ከተዘረዘሩት በስተቀር ሁሉም፣ `disabled` = ምንም ገደቦች የሉም። | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | የpayload ማስተካከያ ደንቦች JSON ፋይል ዱካ (በእያንዳንዱ ሞዴል/ፕሮቶኮል የupstream ማስተካከያዎች)። | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | የpayload ደንቦች ፋይልን በቀጥታ እንደገና ለመጫን የጊዜ ክፍተት (ms)። ዝቅተኛው `1000` ነው። | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | በምርጫ የሚነቃ፦ የአቅራቢ ቅድመ ቅጥያ ከመጠየቅ ይልቅ ከClaude Code ደንበኞች የሚመጡ ቅድመ ቅጥያ የሌላቸውን `claude-*` የሞዴል IDዎች በClaude Code OAuth መለያ በኩል ያዘዋውራል። ግልጽ የአቅራቢ ቅድመ ቅጥያዎች አሁንም ቅድሚያ ያገኛሉ። እንዲሁም በClaude አቅራቢ ገጽ ላይ ባለው የዳሽቦርድ ማብሪያ/ማጥፊያ በኩል ማዋቀር ይቻላል። | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | ለround-robin combos የእያንዳንዱ ሞዴል ትይዩነት ገደብ (#9100)። የround-robin combo semaphore ያለምንም የመሻር አማራጭ በእያንዳንዱ ሞዴል 3 ትይዩ ጥያቄዎች ላይ በጥብቅ ተገድቦ ነበር፣ ይህም ከዚያ ገደብ በስተጀርባ ከፍተኛ ትይዩነት ያለውን ትራፊክ በተከታታይ እንዲሰራ ያደርገው ነበር። `>= 1` መሆኑ ይረጋገጣል፣ እና እስከ `<= 32` ይገደባል። | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | ለቀጥታ ነጠላ-ሞዴል ጥያቄዎች የOmniRouteን አካባቢያዊ context-window / ከፍተኛ-input-token ማረጋገጫ የሚዘል አደገኛ የምርጫ ቅንብር። Upstream አቅራቢዎች ትክክለኛ ገደቦቻቸውን አሁንም ያስፈጽማሉ፤ የprompt ማመቂያ እና የሞዴሉ የራሱ የoutput-token ገደብ እንደነቃ ይቆያሉ። ውጤታማው ቅድሚያ Feature Flags DB መሻር > የአካባቢ ተለዋዋጭ > ነባሪ ነው፤ ዳግም ማስጀመር አያስፈልግም። | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(አልተዋቀረም)_ | `open-sse/services/conversationTracker.ts` | የውይይት ታሪክ መሰብሰብን ለማቆም `1` ያዘጋጁ። `resolveConversationId()` SQLiteን ከማንበቡ ወይም የመልዕክት ታሪክን ከመተንተኑ በፊት ክትትል የማይደረግበት ውጤት ይመልሳል፣ እና በደንበኛ የቀረቡ session IDዎችም ይካተታሉ። የrouting-session አያያዝ ሳይለወጥ ይቆያል፣ እና ነባር መዝገቦች አይሰረዙም። ይህ የዳሽቦርዱን የውይይት እይታ ለማይጠቀሙ እና የturn ሰንጠረዡ ማደጉን ለማቆም ለሚፈልጉ deployments ነው። | +## 6. የመሣሪያ እና የማዘዋወሪያ ፖሊሲዎች + +| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | +| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | የLLM መሣሪያ/ተግባር-ጥሪ መዳረሻን ይቆጣጠራል። `allowlist` = የተዘረዘሩ መሣሪያዎች ብቻ፣ `denylist` = ከተዘረዘሩት በስተቀር ሁሉም፣ `disabled` = ምንም ገደቦች የሉም። | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | የpayload ማቀናበሪያ ደንቦች JSON ፋይል መንገድ (በሞዴል/ፕሮቶኮል የሚደረጉ የupstream ማስተካከያዎች)። | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | የpayload ደንቦች ፋይልን በቀጥታ እንደገና ለመጫን የሚውል የጊዜ ልዩነት (ms)። ዝቅተኛው `1000` ነው። | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | በፈቃድ የሚነቃ፦ የአቅራቢ ቅድመ ቅጥያ ከመጠየቅ ይልቅ ከClaude Code ደንበኞች የሚመጡ ቅድመ ቅጥያ የሌላቸውን `claude-*` የሞዴል መለያዎች በClaude Code OAuth መለያ በኩል ያዘዋውራል። በግልጽ የተገለጹ የአቅራቢ ቅድመ ቅጥያዎች አሁንም ቅድሚያ ያገኛሉ። በClaude አቅራቢ ገጽ ላይ ባለው የዳሽቦርድ መቀያየሪያም ሊዋቀር ይችላል። | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | ለround-robin ጥምረቶች በእያንዳንዱ ሞዴል የሚተገበር የትይዩነት ገደብ (#9100)። የround-robin ጥምረት semaphore የሚሽረው ቅንብር ሳይኖረው በእያንዳንዱ ሞዴል 3 ትይዩ ጥያቄዎች ላይ በቋሚነት ተገድቦ ነበር፣ ይህም ከፍተኛ ትይዩነት ያለውን ትራፊክ ከዚያ ገደብ ጀርባ በተከታታይ እንዲሠራ ያደርግ ነበር። `>= 1` እንዲሆን ይረጋገጣል፣ በ`<= 32` ይገደባል። | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | ለቀጥታ ነጠላ-ሞዴል ጥያቄዎች የOmniRoute አካባቢያዊ context-window / max-input-token ምርመራን የሚዘል አደገኛ በፈቃድ የሚነቃ አማራጭ። የUpstream አቅራቢዎች አሁንም ትክክለኛ ገደቦቻቸውን ያስገድዳሉ፤ የprompt ማመቅ እና የሞዴሉ የራሱ የውጤት-token ገደብ ንቁ ሆነው ይቆያሉ። ተግባራዊው የቅድሚያ ቅደም ተከተል የFeature Flags DB መሻር > የenvironment variable > ነባሪ ነው፤ ዳግም ማስጀመር አያስፈልግም። | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(አልተዋቀረም)_ | `open-sse/services/selfHostedEntry.ts` | በመስመር ውስጥ የሚገለጽ YAML `providers:` ሰነድ (RIC-738, D4)። ሲዋቀር (`strategy:` ብሎክ ኖረውም ሆነ ሳይኖረው)፣ `/v1/chat/completions` ከcloud pipeline ይልቅ ወደ በራስ የሚስተናገደው የተዋሐደ OpenAI-ተኳኋኝ መግቢያ ይዘዋወራል። ካልተዋቀረ (ነባሪው)፦ መስመሩ በቀጥታ ወደ ነባሩ cloud pipeline ያልፋል። `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`ን ይመልከቱ። | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(አልተዋቀረም)_ | `open-sse/services/selfHostedEntry.ts` | በመስመር ውስጥ ካለ environment variable ይልቅ ፋይልን ለሚመርጡ የማሰማሪያ አካባቢዎች፣ ከ`OMNIROUTE_SELF_HOSTED_PROVIDERS` ጋር ተመሳሳይ `providers:` ሰነድን የያዘ የYAML ፋይል መንገድ። ከሁለቱ አንዱ በራስ የሚስተናገደውን መግቢያ ያነቃል። | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(አልተዋቀረም — ክፍት መስመር)_ | `open-sse/services/selfHostedEntry.ts` | ለተዋሐደው በራስ የሚስተናገድ መግቢያ አማራጭ የጋራ API ቁልፍ (D5 መሠረታዊ መዋቅር፣ ለበቁልፍ የኮታ ሥርዓት የተያዘ)። ሲዋቀር ጥያቄዎች `Authorization: Bearer `ን ማካተት አለባቸው። ካልተዋቀረ፦ መስመሩ ክፍት ሲሆን፣ ከነባሩ በራስ የሚስተናገድ የአካባቢ-አቅራቢ ንድፍ (loopback/የታመነ-አውታረ መረብ ማሰማራት) ጋር ይዛመዳል። | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(አልተዋቀረም)_ | `open-sse/services/routingStrategies.ts` | ለውሳኔ-አይለዋወጥ ማዘዋወሪያ ሞተር በመስመር ውስጥ የሚገለጽ YAML `strategy:` ሰነድ (M2/RIC-740, D3) — blacklist/whitelist፣ cooldown breaker፣ የወጪ ቅድሚያ፣ መዘግየትን የሚያገናዝብ፣ fallback chain። በእያንዳንዱ ቁልፍ መሠረት፣ በ`OMNIROUTE_SELF_HOSTED_PROVIDERS` ውስጥ የተካተተውን የመስመር ውስጥ `strategy:` ብሎክ ይሽራል። `docs/routing/DETERMINISTIC_ROUTING.md`ን ይመልከቱ። | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(አልተዋቀረም)_ | `open-sse/services/routingStrategies.ts` | በመስመር ውስጥ ካለ environment variable ይልቅ ፋይልን ለሚመርጡ የማሰማሪያ አካባቢዎች፣ ከ`OMNIROUTE_SELF_HOSTED_STRATEGY` ጋር ተመሳሳይ `strategy:` ሰነድን የያዘ የYAML ፋይል መንገድ። | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(አልተዋቀረም)_ | `open-sse/services/conversationTracker.ts` | የውይይት ታሪክ መሰብሰብን ለማቆም `1` ያዘጋጁ። `resolveConversationId()` SQLite ከማንበቡ ወይም የመልዕክት ታሪክን ከመተንተኑ በፊት ክትትል ያልተደረገበት ውጤት ይመልሳል፤ በደንበኛው የቀረቡ የክፍለ ጊዜ መለያዎችም በዚህ ውስጥ ይካተታሉ። የማዞሪያ ክፍለ ጊዜ አስተዳደር ሳይለወጥ ይቆያል፣ እና ነባር መዝገቦች አይሰረዙም። ይህ የዳሽቦርዱን የውይይት እይታ ለማይጠቀሙ እና የተራ ሰንጠረዡ ማደጉን ማቆም ለሚፈልጉ ስምሪቶች ነው። | --- -## 7. URLs እና የCloud ማመሳሰል - -| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | የውስጥ ማመሳሰል ሥራዎች `/api/sync/cloud`ን እንዲጠሩ የሚያገለግል የአገልጋይ-ወገን URL። መተግበሪያው በይፋ በፕሮክሲ በኩል ተደራሽ በሚሆንበት ጊዜም ይህን እንደ loopback/container URL ያቆዩት። | -| `CLOUD_URL` | _(ባዶ)_ | `src/lib/cloudSync.ts` | የደመና relay endpoint URL (ፕሪሚየም ባህሪ)። | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ለደመና ማመሳሰል ጥያቄዎች የHTTP ጊዜ ገደብ። | -| `OMNIROUTE_BUILD_PROFILE` | `full` | የWebpack ግንባታ ውቅር | የግንባታ-ጊዜ መገለጫ (ልዩ ፈቃድ ያላቸውን modules ከbundle በአካል ለማስወገድ ወደ `minimal` ያዘጋጁት)። | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone ውጤት_ | `scripts/build/colocate-standalone.mjs` | ከግንባታ በኋላ ባለው የአብሮ-ማስቀመጥ ደረጃ ለሚጠቀምበት standalone የውጤት ማውጫ የግንባታ-ጊዜ override። ይህ የruntime ቅንብር አይደለም። | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(ባዶ)_ | `src/lib/cloudSync.ts` | የCloud Sync ምላሾችን HMAC-SHA256 ፊርማ ለማረጋገጥ የሚያገለግል የጋራ ሚስጥር። | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | የCloud Sync endpoint የአካባቢ credentialsን እንዲተካ ለመፍቀድ ወደ `true` ያዘጋጁት። ነባሪው `false` ነው። | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | ምንም የአካባቢ ሚስጥር ሳይዋቀር ያልተፈረመ የCloud Sync ምላሽን ውድቅ ለማድረግ ወደ `true` ያዘጋጁት (#13679)። ይህ ጠቋሚ ምንም ይሁን ምን፣ ያለ ፊርማ ሁልጊዜ ይረጋገጣል—እና `OMNIROUTE_CLOUD_SYNC_SECRET` ካልተዘጋጀ ሁልጊዜ ውድቅ ይደረጋል። በv3.9 ነባሪው ወደ ግዴታ ማስፈጸም ይቀየራል። | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | ያለተጠቃሚ ማረጋገጫ ወደ v3.8.5 የአንድ-ደረጃ «ሁሉንም አስመጣ» ባህሪ ለመመለስ ወደ `true` ያዘጋጁት። | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth፣ Dashboard፣ ማመሳሰል | ለOAuth redirect_uri፣ ለDashboard አገናኞች እና ለሚፈጠሩ ይፋዊ URLዎች ሕዝብ-ተደራሽ URL። የOAuth callbacks ወይም የሚፈጠሩ የbrowser አገናኞች መደበኛ reverse-proxy host መጠቀም ሲኖርባቸው ይህን ወደ የተረጋጋው ይፋዊ URL ያዘጋጁት። | -| `NEXT_PUBLIC_CLOUD_URL` | _(ባዶ)_ | የClient-ወገን | የ`CLOUD_URL` የclient-ወገን ቅጂ። | -| `NEXT_PUBLIC_APP_URL` | _(አልተዘጋጀም)_ | `src/shared/services/cloudSyncScheduler.ts` | ለ`NEXT_PUBLIC_BASE_URL` የቀድሞ fallback። | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(አልተዘጋጀም)_ | ይፋዊ-origin resolver፣ የምስል URLዎች | ይፋዊ URLዎችን ለማመንጨት እና Dashboard ላልሆኑ የbrowser-origin ማረጋገጫዎች የሚያገለግል ከፍተኛ-ቅድሚያ ያለው ለbrowser የሚታይ OmniRoute origin። OpenWebUI ወይም ሌላ relay ወደ OmniRoute በውስጣዊ URL ሲደርስ፣ ነገር ግን የተጠቃሚው browser የሚመነጨውን media ከLAN፣ tunnel ወይም public origin ማውረድ ሲኖርበት ይህን ያዘጋጁ። `/v1`ን **አያካትቱ**። | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(አልተዘጋጀም)_ | `open-sse/config/providerPluginManifestUrl.ts` | ለsidecar clients የሚታወጅ ፍጹም provider plugin manifest URL። ካልተዘጋጀ፣ OmniRoute `/api/v1/provider-plugin-manifest`ን ከጥያቄ origin ወይም HOST/PORT ያመነጫል። | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | የጥያቄ origin ሳይኖር provider plugin manifest URLን ከHOST/PORT ሲያመነጭ የሚጠቀምበት protocol። ግልጽ `OMNIROUTE_PROVIDER_MANIFEST_URL` ካልተዘጋጀ፣ TLSን ከሚያቋርጥ ይፋዊ proxy ጀርባ ወደ `https` ያዘጋጁት። | -| `OMNIROUTE_TRUST_PROXY` | _(አልተዘጋጀም)_ | `src/server/origin/publicOrigin.ts` | ለተላለፉ የpublic-origin headers አማራጭ የእምነት ሁነታ። ካልተዘጋጀ = ለደህንነት ውሳኔዎች `Forwarded` / `X-Forwarded-*`ን አትመኑ። `true` / `loopback` በtoken ምልክት ካለው loopback proxy የሚመጣ forwarded host/protoን ብቻ ያምናል። `private` / `lan` የግል-LAN proxy peersንም ያምናል። በproduction ውስጥ ግልጽ `NEXT_PUBLIC_BASE_URL`ን ይምረጡ። | -| `KIE_CALLBACK_URL` | _(አልተዘጋጀም)_ | `open-sse/utils/kieTask.ts` | ለasynchronous kie.ai ሥራዎች ይፋዊ callback URL። ከ`OMNIROUTE_KIE_CALLBACK_URL` እና `OMNIROUTE_PUBLIC_URL` በፊት ከፍተኛ-ቅድሚያ ያለው override። | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(አልተዘጋጀም)_ | `open-sse/utils/kieTask.ts` | የ`KIE_CALLBACK_URL` አማራጭ አጻጻፍ። ዋናው ተለዋዋጭ ካልተዘጋጀ fallback ይሆናል። | -| `OMNIROUTE_PUBLIC_URL` | _(አልተዘጋጀም)_ | `open-sse/utils/kieTask.ts` | async callback URLዎችን ለማቀናበር የሚጠቅም public origin። ለkie.ai callbacks ዝቅተኛ-ቅድሚያ fallback፤ እንዲሁም ለሌሎች relays እንደ አጠቃላይ ይፋዊ URL ያገለግላል። | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | በUsage ገጽ የሚጠቀምበት የCrofAI quota ፍለጋ endpoint። ለrelays / test fixtures override ያድርጉ። | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | በUsage ገጽ የሚጠቀምበት፣ በAPI key የተረጋገጠ ይፋዊ OpenCode Go usage endpoint። ለrelays / test fixtures override ያድርጉ። | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | client ባልላካቸው opencode-go/zen upstream ጥያቄዎች ላይ የOpenCode CLI identity headersን (User-Agent፣ x-opencode-client/project፣ request/session UUIDዎች) ያመነጫል፣ ይህም በVPS egress ላይ Cloudflare እንዲቀበላቸው ያደርጋል (#6210/#5997)። ከ#10571 ጀምሮ በነባሪነት በርቷል፤ በ`false`/`0`/`no`/`off` ማሰናከል ይቻላል። | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` በርቶ ሲሆን እና ለእያንዳንዱ provider የ`_USER_AGENT` override ካልተዘጋጀ የሚጠቀምበት ነባሪ User-Agent። ለopencode executors ብቻ ይተገበራል። | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` በርቶ ሲሆን ለሚመነጨው `x-opencode-client` header የሚሰጥ እሴት። | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` በርቶ ሲሆን ለሚመነጨው `x-opencode-project` header የሚሰጥ እሴት። | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | quotaን ከገጹ ለመሰብሰብ የሚጠቀምበት የOllama Cloud settings URL። ለrelays / test fixtures override ያድርጉ። | -| `OLLAMA_USAGE_COOKIE` | _(አልተዘጋጀም)_ | `open-sse/services/usage.ts` | settings-page quotaን ከገጹ ለመሰብሰብ የሚጠቀምበት የOllama Cloud `__Secure-session` cookie። ስሱ መረጃ ነው፤ ብዙ accounts ሲዋቀሩ የእያንዳንዱን connection Dashboard field መጠቀም ይመረጣል። | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(አልተዘጋጀም)_ | `open-sse/services/usage.ts` | አማራጭ የOllama Cloud `__Secure-session` cookie env var። ስሱ መረጃ ነው፤ ብዙ accounts ሲዋቀሩ የእያንዳንዱን connection Dashboard field መጠቀም ይመረጣል። | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(አልተዘጋጀም)_ | `open-sse/services/usage.ts` | ከአጭር aliases በፊት የሚጠቀምበት አማራጭ የOllama Cloud `__Secure-session` cookie env var። ስሱ መረጃ ነው፤ ብዙ accounts ሲዋቀሩ የእያንዳንዱን connection Dashboard field መጠቀም ይመረጣል። | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | የCodeWhisperer (AWS Kiro) usage limits endpoint። ለrelays / test fixtures override ያድርጉ። | +## 7. URLs እና የCloud Sync ማመሳሰል + +| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | የውስጥ ማመሳሰል ሥራዎች `/api/sync/cloud`ን እንዲጠሩ የሚያስችል የአገልጋይ-ወገን URL። መተግበሪያው በይፋ በፕሮክሲ በኩል ተደራሽ ቢሆንም ይህን እንደ loopback/container URL ያቆዩት። | +| `CLOUD_URL` | _(ባዶ)_ | `src/lib/cloudSync.ts` | የCloud relay መጨረሻ ነጥብ URL (ፕሪሚየም ባህሪ)። | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ለCloud Sync ጥያቄዎች የHTTP ጊዜ ማብቂያ። | +| `OMNIROUTE_BUILD_PROFILE` | `full` | የWebpack ግንባታ ውቅር | የግንባታ-ጊዜ መገለጫ (ልዩ መብት ያላቸውን ሞጁሎች ከbundle በተጨባጭ ለማስወገድ ወደ `minimal` ያቀናብሩ)። | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone ውጤት_ | `scripts/build/colocate-standalone.mjs` | ከግንባታ በኋላ ባለው አብሮ የማስቀመጥ ደረጃ ጥቅም ላይ ለሚውለው standalone የውጤት ማውጫ የግንባታ-ጊዜ መሻሪያ። ይህ የruntime ቅንብር አይደለም። | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(ባዶ)_ | `src/lib/cloudSync.ts` | የCloud Sync ምላሾችን HMAC-SHA256 ፊርማ ለማረጋገጥ ጥቅም ላይ የሚውል የጋራ ምስጢር። | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | የCloud Sync መጨረሻ ነጥብ የአካባቢ ምስክርነቶችን እንዲተካ ለመፍቀድ ወደ `true` ያቀናብሩ። ነባሪው `false` ነው። | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | ምንም የአካባቢ ምስጢር ባልተዋቀረበት ጊዜ ፊርማ የሌለውን የCloud Sync ምላሽ ላለመቀበል ወደ `true` ያቀናብሩ (#13679)። ይህ ጠቋሚ ምንም ይሁን ምን፣ ያለ ፊርማ ሁልጊዜ ይረጋገጣል — እና `OMNIROUTE_CLOUD_SYNC_SECRET` ካልተዋቀረ ሁልጊዜ ውድቅ ይደረጋል። በv3.9 ነባሪው ወደ የግዴታ ማስፈጸም ይቀየራል። | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | ያለተጠቃሚ ማረጋገጫ ወደ v3.8.5 የአንድ-ደረጃ "ሁሉንም ነገር አስመጣ" ባህሪ ለመመለስ ወደ `true` ያቀናብሩ። | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth፣ Dashboard፣ ማመሳሰል | ለOAuth redirect_uri፣ ለDashboard አገናኞች እና ለሚፈጠሩ ይፋዊ URLs የሚያገለግል ለሕዝብ የሚታይ URL። የOAuth callbacks ወይም የሚፈጠሩ browser አገናኞች መደበኛ የreverse-proxy host መጠቀም ሲኖርባቸው፣ ይህን ወደ የተረጋጋው ይፋዊ URL ያቀናብሩ። | +| `NEXT_PUBLIC_CLOUD_URL` | _(ባዶ)_ | የደንበኛ-ወገን | የ`CLOUD_URL` የደንበኛ-ወገን ነጸብራቅ። | +| `NEXT_PUBLIC_APP_URL` | _(አልተዋቀረም)_ | `src/shared/services/cloudSyncScheduler.ts` | ለ`NEXT_PUBLIC_BASE_URL` የቆየ አማራጭ። | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(አልተዋቀረም)_ | የይፋ መነሻ አድራሻ ፈቺ፣ የምስል URLs | ለይፋዊ URL ማመንጨት እና ከዳሽቦርድ ውጭ የሆነ የአሳሽ መነሻ አድራሻ ማረጋገጫ የሚያገለግለው፣ ቅድሚያው ከሁሉ ከፍተኛ የሆነው ለአሳሽ የሚታይ የOmniRoute መነሻ አድራሻ። OpenWebUI ወይም ሌላ አስተላላፊ OmniRouteን በውስጣዊ URL ሲደርስበት፣ ነገር ግን የተጠቃሚው አሳሽ የተፈጠሩ ሚዲያዎችን ከLAN፣ ከቱነል ወይም ከይፋዊ መነሻ አድራሻ ማምጣት ሲኖርበት ይህን ያዋቅሩ። `/v1`ን **አያካትቱ**። | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(አልተዋቀረም)_ | `open-sse/config/providerPluginManifestUrl.ts` | ለsidecar ደንበኞች የሚገለጽ ፍጹም የአቅራቢ ተሰኪ manifest URL። ሳይዋቀር ሲቀር፣ OmniRoute `/api/v1/provider-plugin-manifest`ን ከጥያቄው መነሻ አድራሻ ወይም ከHOST/PORT ያመነጫል። | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | የጥያቄ መነሻ አድራሻ በሌለበት፣ የአቅራቢ ተሰኪ manifest URLን ከHOST/PORT ለማመንጨት የሚያገለግል ፕሮቶኮል። ግልጽ `OMNIROUTE_PROVIDER_MANIFEST_URL` ካልተዋቀረ፣ TLSን ከሚያቋርጥ ይፋዊ proxy ጀርባ ወደ `https` ያዋቅሩት። | +| `OMNIROUTE_TRUST_PROXY` | _(አልተዋቀረም)_ | `src/server/origin/publicOrigin.ts` | ለተላለፉ የይፋ መነሻ አድራሻ ራስጌዎች አማራጭ የመተማመን ሁነታ። አልተዋቀረም = ለደህንነት ውሳኔዎች `Forwarded` / `X-Forwarded-*`ን አትመኑ። `true` / `loopback` የተላለፈውን host/proto የሚያምነው በቶከን ምልክት ከተደረገበት loopback proxy ሲመጣ ብቻ ነው። `private` / `lan` የግል-LAN proxy አቻዎችንም ያምናል። በምርት አካባቢ ግልጽ `NEXT_PUBLIC_BASE_URL`ን ይምረጡ። | +| `KIE_CALLBACK_URL` | _(አልተዋቀረም)_ | `open-sse/utils/kieTask.ts` | ለተመሳሳይ ጊዜ ላልሆኑ kie.ai ሥራዎች ይፋዊ callback URL። ከ`OMNIROUTE_KIE_CALLBACK_URL` እና `OMNIROUTE_PUBLIC_URL` በፊት የሚተገበር ከፍተኛ ቅድሚያ ያለው መሻሪያ። | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(አልተዋቀረም)_ | `open-sse/utils/kieTask.ts` | የ`KIE_CALLBACK_URL` አማራጭ አጻጻፍ። ዋናው ተለዋዋጭ ሳይዋቀር ሲቀር እንደ አማራጭ ያገለግላል። | +| `OMNIROUTE_PUBLIC_URL` | _(አልተዋቀረም)_ | `open-sse/utils/kieTask.ts` | ተመሳሳይ ጊዜ ያልሆኑ callback URLsን ለመገንባት የሚያገለግል ይፋዊ መነሻ አድራሻ። ለkie.ai callbacks ዝቅተኛው ቅድሚያ ያለው አማራጭ፤ ለሌሎች አስተላላፊዎችም እንደ አጠቃላይ ይፋዊ URL ያገለግላል። | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | በአጠቃቀም ገጹ ላይ የሚጠቀምበት የCrofAI ኮታ መፈለጊያ endpoint። ለአስተላላፊዎች / የሙከራ fixtures ይሽሩት። | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | በአጠቃቀም ገጹ ላይ የሚጠቀምበት፣ በAPI key የተረጋገጠ ይፋዊ የOpenCode Go አጠቃቀም endpoint። ለአስተላላፊዎች / የሙከራ fixtures ይሽሩት። | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | ደንበኛው ባልላካቸው opencode-go/zen upstream ጥያቄዎች ላይ የOpenCode CLI ማንነት ራስጌዎችን (User-Agent, x-opencode-client/project, የጥያቄ/ክፍለ ጊዜ UUIDs) ያመነጫል፤ ይህም በVPS egress ላይ Cloudflare እንዲቀበላቸው ነው (#6210/#5997)። ከ#10571 ጀምሮ በነባሪነት የነቃ ነው፤ በ`false`/`0`/`no`/`off` ያሰናክሉት። | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ሲበራ እና ለእያንዳንዱ አቅራቢ የሚዘጋጅ `_USER_AGENT` መሻሪያ ካልተዋቀረ የሚያገለግል ነባሪ User-Agent። የሚተገበረው በopencode executors ላይ ብቻ ነው። upstream በሚገድበው ቁልፍ አልባ ጥያቄ ላይ፣ `opencode/= 1.17>`ን ያልያዘ የተዋቀረ እሴት ከመከልከል ይልቅ በዚህ ነባሪ ይተካል። | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ሲበራ ለሚመነጨው `x-opencode-client` ራስጌ የሚያገለግል እሴት። | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` በርቶ ሲሆን ለሚፈጠረው `x-opencode-project` ራስጌ የሚውል እሴት። | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(አልተዋቀረም)_ | `open-sse/executors/opencodeFreeTierContract.ts` | ቁልፍ የሌላቸውን OpenCode ጥያቄዎች አካል (የዥረት ማሰራጫ ጠቋሚና የመሣሪያዎች ዝርዝር) ማስተካከል ለማቆም ወደ `off` ያዋቅሩት። ራስጌዎች አሁንም ይተገበራሉ። በእያንዳንዱ ጥያቄ ጊዜ ይነበባል፤ ስለዚህ ለውጥ ወዲያውኑ ተግባራዊ ይሆናል። | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(አልተዋቀረም)_ | `open-sse/executors/opencodeFreeTierContract.ts` | ምንም መሣሪያ በሌለው ቁልፍ-አልባ OpenCode ጥያቄ ላይ፣ ለዚያ ሞዴል ገና ምንም ነገር ካልታየ የሚገለጹ በነጠላ ሰረዝ የተለያዩ የመሣሪያ ስሞች። ባዶ ከሆነ ሞዴሉ እንዳይጠራው ወደሚነገረው አንድ ቦታ-ያዥ ይመለሳል። እስከ 32 ግቤቶች፣ `[A-Za-z_][A-Za-z0-9_-]{0,63}`፤ ልክ ያልሆኑ ግቤቶች ችላ ይባላሉ። | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | የኮታ መረጃን ለመሰብሰብ የሚያገለግል የOllama Cloud ቅንብሮች URL። ለማስተላለፊያዎች / የሙከራ መገልገያዎች ይተኩት። | +| `OLLAMA_USAGE_COOKIE` | _(አልተዋቀረም)_ | `open-sse/services/usage.ts` | ከቅንብሮች ገጽ የኮታ መረጃን ለመሰብሰብ የሚያገለግል የOllama Cloud `__Secure-session` ኩኪ። ሚስጥራዊ ነው፤ ብዙ መለያዎች ሲዋቀሩ የእያንዳንዱን ግንኙነት Dashboard መስክ መጠቀም ይመረጣል። | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(አልተዋቀረም)_ | `open-sse/services/usage.ts` | አማራጭ የOllama Cloud `__Secure-session` ኩኪ የአካባቢ ተለዋዋጭ። ሚስጥራዊ ነው፤ ብዙ መለያዎች ሲዋቀሩ የእያንዳንዱን ግንኙነት Dashboard መስክ መጠቀም ይመረጣል። | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(አልተዋቀረም)_ | `open-sse/services/usage.ts` | ከአጫጭር ተለዋጭ ስሞች በፊት የሚያገለግል አማራጭ የOllama Cloud `__Secure-session` ኩኪ የአካባቢ ተለዋዋጭ። ሚስጥራዊ ነው፤ ብዙ መለያዎች ሲዋቀሩ የእያንዳንዱን ግንኙነት Dashboard መስክ መጠቀም ይመረጣል። | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | የCodeWhisperer (AWS Kiro) የአጠቃቀም ገደቦች መጨረሻ ነጥብ። ለማስተላለፊያዎች / የሙከራ መገልገያዎች ይተኩት። | > [!IMPORTANT] -> ከተገላቢጦሽ ፕሮክሲ (nginx, Caddy) ጀርባ ሲያሰማሩ፣ OAuth የመልስ ጥሪዎች ወይም የሚፈጠሩ ይፋዊ አገናኞች ያንን የአስተናጋጅ ስም መጠቀም ሲኖርባቸው `NEXT_PUBLIC_BASE_URL`ን ወደ ቋሚ ይፋዊ URLዎ (ለምሳሌ፣ `https://omniroute.example.com`) ያቀናብሩ። ይህ ካልተደረገ፣ redirect_uri ስለማይዛመድ OAuth የመልስ ጥሪዎች ሊከሽፉ ይችላሉ፣ እንዲሁም የሚፈጠሩ ይፋዊ አገናኞች ወደ ውስጣዊው የኮንቴይነር መነሻ ሊያመለክቱ ይችላሉ። +> ከreverse proxy (nginx, Caddy) ጀርባ ሲዘረጋ፣ የOAuth መልሶ ጥሪዎች ወይም የሚፈጠሩ ይፋዊ አገናኞች ያንን የአስተናጋጅ ስም መጠቀም ሲኖርባቸው `NEXT_PUBLIC_BASE_URL`ን ወደ ቋሚ ይፋዊ URLዎ (ለምሳሌ፣ `https://omniroute.example.com`) ያዋቅሩ። ይህ ከሌለ፣ redirect_uri ስለማይዛመድ የOAuth መልሶ ጥሪዎች ሊሳኩ ይችላሉ፣ እንዲሁም የሚፈጠሩ ይፋዊ አገናኞች ወደ ውስጣዊው የcontainer origin ሊያመለክቱ ይችላሉ። > -> ለአገልጋይ-ወደ-አገልጋይ ሥራዎች `BASE_URL`ን እንደ ውስጣዊ loopback/ኮንቴይነር URL ያቆዩት። ምስክርነት መረጃ ለያዙ ውስጣዊ ራስ-ጥያቄዎች የአሳሽ `Origin`ን ወይም ይፋዊ የአስተናጋጅ ስምን አይጠቀሙ። +> ለserver-to-server ሥራዎች `BASE_URL`ን እንደ ውስጣዊ loopback/container URL ያቆዩት። ማረጋገጫ መረጃ ለሚይዙ ውስጣዊ self-fetches የአሳሽ `Origin` ወይም ይፋዊ የአስተናጋጅ ስም አይጠቀሙ። > -> ማንነት የተረጋገጠባቸው የዳሽቦርድ የመጻፍ ጥያቄዎች ቋሚ ይፋዊ መሠረታዊ URL አያስፈልጋቸውም፦ ዳሽቦርዱ ከክፍለ-ጊዜው ጋር የተሳሰረ CSRF ቶከን በመጠቀም ከተመሳሳይ መነሻ የሚላኩ ደህንነታቸው ያልተረጋገጠ ጥያቄዎችን ይልካል። OmniRoute ዳሽቦርድ ላልሆኑ የአሳሽ ውህደቶች የይፋዊ መነሻ ማረጋገጫን አሁንም በአንድ ቦታ ያስተዳድራል፦ በግልጽ የተወሰኑ የይፋዊ URL የአካባቢ ተለዋዋጮች በመጀመሪያ የታመኑ ናቸው፤ ጥሬ `Forwarded` / `X-Forwarded-*` ራስጌዎች ግን `OMNIROUTE_TRUST_PROXY` እስካልነቃ እና ቀጥተኛው የፕሮክሲ ጎረቤት እንደ ታመነ በቶከን ምልክት እስካልተደረገበት ድረስ ችላ ይባላሉ። ከተመሳሳይ መነሻ የሚላኩ የዳሽቦርድ ጥያቄዎችን ለማስተካከል የCORS ቅንብሮችን አይጠቀሙ፤ CORS የሚያገለግለው ከተለያዩ መነሻዎች ለሚመጡ የአሳሽ ደንበኞች ብቻ ነው። +> ማንነት የተረጋገጠባቸው የdashboard ጽሑፍ ለውጦች ቋሚ ይፋዊ መሠረታዊ URL አያስፈልጋቸውም፦ dashboardው ከsession ጋር የተሳሰረ CSRF token በመጠቀም same-origin ደህንነቱ ያልተጠበቀ ጥያቄዎችን ይልካል። OmniRoute ለdashboard ያልሆኑ የአሳሽ ውህደቶች የይፋዊ origin ማረጋገጥን አሁንም በአንድ ቦታ ያስተዳድራል፦ በግልጽ የተዋቀሩ የይፋዊ URL የአካባቢ ተለዋዋጮች መጀመሪያ ይታመናሉ፤ `OMNIROUTE_TRUST_PROXY` ካልነቃ እና ቀጥተኛው proxy peer እንደ ታማኝ token ካልተለጠፈበት በስተቀር፣ ጥሬ `Forwarded` / `X-Forwarded-*` ራስጌዎች ችላ ይባላሉ። same-origin የdashboard ጥያቄዎችን ለማስተካከል የCORS ቅንብሮችን አይጠቀሙ፤ CORS የሚያገለግለው ለcross-origin የአሳሽ ደንበኞች ብቻ ነው። --- @@ -588,47 +595,48 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude ## 11. የOAuth አቅራቢ ማረጋገጫዎች -ለ**localhost ልማት** አብሮገነብ ማረጋገጫዎች። በርቀት ለሚደረጉ ስርጭቶች፣ በእያንዳንዱ አቅራቢ የገንቢ ኮንሶል ላይ የራስዎን ያስመዝግቡ። - -| ተለዋዋጭ | አቅራቢ | ማስታወሻዎች | -| --------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | ይፋዊ ደንበኛ — ሚስጥር አያስፈልግም። | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | የመልሶ ማዞሪያ URIን ይቀይሩ። ነባሪ፦ `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | ይፋዊ ደንበኛ። | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | ተዛማጅ `_SECRET` ያስፈልገዋል። | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | ይፋዊ ደንበኛ። | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | ተዛማጅ `_SECRET` ያስፈልገዋል። | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | ይፋዊ ደንበኛ። | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | ለGitHub Enterprise Copilot OAuth ደንበኛ መለያ አማራጭ ለውጥ። ካልተዋቀረ ወደ `GITHUB_OAUTH_CLIENT_ID` ይፋዊ ነባሪ ይመለሳል። | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | ለእያንዳንዱ ግንኙነት ማረጋገጫ መረጃ በማይገኝበት ጊዜ በ`open-sse/executors/devin-cli.ts` የሚጠቀምበት የAPI ቁልፍ ምትክ። አማራጭ ነው። | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | ወደ Devin CLI ሁለትዮሽ (`devin`) ብጁ ዱካ። በ`open-sse/executors/devin-cli.ts` ይፈታል። | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ለGitLab Duo የOAuth ደንበኛ መለያ። በ`https://gitlab.com/-/profile/applications` ላይ የመልሶ ማዞሪያ URI `/callback` እና ወሰኖች `api, read_user, openid, profile, email` ያሉትን መተግበሪያ ይመዝግቡ። ወደ `GITLAB_OAUTH_CLIENT_ID` ይመለሳል። | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | ለGitLab Duo የOAuth ደንበኛ ሚስጥር። አማራጭ ነው — የPKCE ፍሰት ሚስጥር አያስፈልገውም። ወደ `GITLAB_OAUTH_CLIENT_SECRET` ይመለሳል። | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | የGitLab መሠረታዊ URLን ይቀይሩ (በራስ የሚስተናገድ GitLab)። ነባሪው `https://gitlab.com` ነው። ወደ `GITLAB_BASE_URL` ይመለሳል። | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | ለ`GITLAB_DUO_BASE_URL` የቆየ ምትክ። የ`_DUO_` ተለዋጩ ባልተዋቀረ ጊዜ ጥቅም ላይ ይውላል። | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | በ`src/lib/oauth/constants/oauth.ts` ጥቅም ላይ የሚውል ለ`GITLAB_DUO_OAUTH_CLIENT_ID` የቆየ ምትክ። | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | በ`src/lib/oauth/constants/oauth.ts` ጥቅም ላይ የሚውል ለ`GITLAB_DUO_OAUTH_CLIENT_SECRET` የቆየ ምትክ። | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuthን ለማንቃት ያዋቅሩት። | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | ቀጥተኛ የAPI ቁልፍ ምትክ (OAuthን ያልፋል)። | -| `QODER_CLI_WORKSPACE` | Qoder | ለQoder CLI የሥራ ቦታ መለያ። | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | ለ`QODER_CLI_WORKSPACE` ተለዋጭ ስም። | -| `QODER_CLI_CONFIG_DIR` | Qoder | የQoder CLI ውቅረት ማውጫን ይቀይሩ (የተነጠለ PAT ክፍለ ጊዜ፣ የአሳሽ መግቢያን ከመደምሰስ ይቆጠባል)። | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | በ`/api/chat` ላይ እንደ `validated` የሚላክ የፊት ገጽ `tk` ቶከን። Blackbox የቶከን ማዛመድን ሲያስገድድ ያስፈልጋል፤ አለበለዚያ OmniRoute ወደ የዘፈቀደ UUID ይመለሳል። ጉዳይ #2252ን ይመልከቱ። | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge መከላከያ | Anthropic ላልሆኑ የvision-bridge ጥሪዎች OpenAI-ተኳሃኝ መሠረታዊ URL። ነባሪው የቆየው OpenAI URL env ወይም api.openai.com ነው። ወደ OmniRoute `/v1` ራስ-ዙር ወይም ወደማንኛውም OpenAI-ተኳሃኝ መጨረሻ ነጥብ (Gemini OpenAI-compat፣ OpenRouter) ያመልክቱ። ጉዳይ #2232። URLው የOmniRoute የራሱ `/v1` ሲሆን፣ የdescribe ንዑስ-ጥያቄው `x-omniroute-admission-bypass: internal` ይልካል እና በተፈታው የራስ-ዙር ማረጋገጫ መረጃ (በአካባቢያዊ ሁኔታ `sk_omniroute` ጠቋሚ፣ ወይም `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) ማንነትን ያረጋግጣል፤ በዚህም `REQUIRE_API_KEY=true` ስርጭቶች ይሰራሉ። | -| `VISION_BRIDGE_API_KEY` | Vision Bridge መከላከያ | ከላይ ላለው URL የAPI ቁልፍ። Anthropic ላልሆኑ የvision-bridge ጥሪዎች የየአቅራቢውን OpenAI / Google env ተለዋዋጮች ይተካል። የAnthropic ሞዴሎች የተለየውን የAnthropic ቁልፍ ዱካቸውን ይዘው ይቆያሉ። ጉዳይ #2232። | +ለ**localhost ልማት** አብሮገነብ ማረጋገጫዎች። በርቀት ለሚደረጉ ማሰማራቶች፣ በእያንዳንዱ አቅራቢ የገንቢ ኮንሶል ላይ የራስዎን ይመዝግቡ። + +| ተለዋዋጭ | አቅራቢ | ማስታወሻዎች | +| --------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | ይፋዊ ደንበኛ — ሚስጥር አያስፈልግም። | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | የመልሶ ማዘዋወሪያ URIን ይተካል። ነባሪ፦ `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | ይፋዊ ደንበኛ። | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | ተዛማጅ `_SECRET` ያስፈልገዋል። | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | ይፋዊ ደንበኛ። | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | ተዛማጅ `_SECRET` ያስፈልገዋል። | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | ይፋዊ ደንበኛ። | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | ለGitHub Enterprise Copilot OAuth የደንበኛ መታወቂያ አማራጭ መተኪያ። ካልተዋቀረ ወደ `GITHUB_OAUTH_CLIENT_ID` ይፋዊ ነባሪ ይመለሳል። | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | በ`Copilot-Integration-Id` እና `Editor-Plugin-Version` ራስጌዎች ውስጥ ለሚላከው የGitHub Copilot ደንበኛ ውህደት መታወቂያ አማራጭ መተኪያ። ነባሪው `copilot-developer-cli` ነው። | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | ለእያንዳንዱ ግንኙነት ማረጋገጫ በማይኖርበት ጊዜ በ`open-sse/executors/devin-cli.ts` ጥቅም ላይ የሚውል የAPI ቁልፍ መጠባበቂያ። አማራጭ። | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | ወደ Devin CLI ሁለትዮሽ (`devin`) ብጁ ዱካ። በ`open-sse/executors/devin-cli.ts` ይፈታል። | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ለGitLab Duo የOAuth ደንበኛ መታወቂያ። በ`https://gitlab.com/-/profile/applications` ላይ የመልሶ ማዘዋወሪያ URI `/callback` እና ወሰኖች `api, read_user, openid, profile, email` ያሉት መተግበሪያ ይመዝግቡ። ወደ `GITLAB_OAUTH_CLIENT_ID` ይመለሳል። | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | ለGitLab Duo የOAuth ደንበኛ ሚስጥር። አማራጭ — የPKCE ፍሰት ሚስጥር አያስፈልገውም። ወደ `GITLAB_OAUTH_CLIENT_SECRET` ይመለሳል። | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | የGitLab መሠረት URLን ይተካል (በራስ የሚስተናገድ GitLab)። ነባሪው `https://gitlab.com` ነው። ወደ `GITLAB_BASE_URL` ይመለሳል። | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | ለ`GITLAB_DUO_BASE_URL` የቀድሞ ስሪት መጠባበቂያ። የ`_DUO_` ልዩነቱ ካልተዋቀረ ጥቅም ላይ ይውላል። | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | በ`src/lib/oauth/constants/oauth.ts` ጥቅም ላይ ለሚውለው `GITLAB_DUO_OAUTH_CLIENT_ID` የቆየ ተተኪ። | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | በ`src/lib/oauth/constants/oauth.ts` ጥቅም ላይ ለሚውለው `GITLAB_DUO_OAUTH_CLIENT_SECRET` የቆየ ተተኪ። | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuthን ለማንቃት ያዘጋጁ። | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | ቀጥተኛ የAPI ቁልፍ ተተኪ (OAuthን ያልፋል)። | +| `QODER_CLI_WORKSPACE` | Qoder | ለQoder CLI የመሥሪያ ቦታ ID። | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | የ`QODER_CLI_WORKSPACE` ተለዋጭ ስም። | +| `QODER_CLI_CONFIG_DIR` | Qoder | የQoder CLI ውቅር ማውጫን ይተኩ (የተነጠለ PAT ክፍለ ጊዜ፣ የአሳሽ መግቢያን እንዳይደርብ ያደርጋል)። | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | በ`/api/chat` ላይ እንደ `validated` የሚላክ የፊት-ገጽ `tk` ቶከን። Blackbox የቶከን ማዛመድን ሲያስገድድ ያስፈልጋል፤ ካልሆነ OmniRoute ወደ የዘፈቀደ UUID ይመለሳል። ጉዳይ #2252ን ይመልከቱ። | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge መከላከያ | Anthropic ላልሆኑ የvision-bridge ጥሪዎች OpenAI-ተኳሃኝ መሠረታዊ URL። በነባሪ የቆየውን OpenAI URL env ወይም api.openai.com ይጠቀማል። ወደ OmniRoute `/v1` ራስ-ዙር ወይም ወደ ማንኛውም OpenAI-ተኳሃኝ መጨረሻ ነጥብ (Gemini OpenAI-compat፣ OpenRouter) ያመልክቱ። ጉዳይ #2232። URLው የOmniRoute ራሱ `/v1` ሲሆን፣ የመግለጫ ንዑስ-ጥያቄው `x-omniroute-admission-bypass: internal`ን ይልካል እና በተፈታው የራስ-ዙር ማረጋገጫ (በአካባቢያዊ ሁነታ `sk_omniroute` sentinel፣ ወይም `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) ማንነቱን ያረጋግጣል፤ ስለዚህ `REQUIRE_API_KEY=true` ስርጭቶች ይሰራሉ። | +| `VISION_BRIDGE_API_KEY` | Vision Bridge መከላከያ | ከላይ ላለው URL የAPI ቁልፍ። Anthropic ላልሆኑ የvision-bridge ጥሪዎች የእያንዳንዱን አቅራቢ OpenAI / Google env ተለዋዋጮች ይተካል። Anthropic ሞዴሎች የየራሳቸውን የAnthropic ቁልፍ መንገድ ይይዛሉ። ጉዳይ #2232። | > [!WARNING] > -> 1. ወደ [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) ይሂዱ +> 1. ወደ [Google Cloud Console → ማረጋገጫዎች](https://console.cloud.google.com/apis/credentials) ይሂዱ > 2. OAuth 2.0 Client ID ይፍጠሩ (ዓይነት፦ "የድር መተግበሪያ") -> 3. የአገልጋይዎን URL እንደ Authorized redirect URI ያክሉ -> 4. በ`.env` ውስጥ ያሉትን የማረጋገጫ መረጃ እሴቶች ይተኩ። +> 3. የአገልጋይዎን URL እንደ የተፈቀደ የማዞሪያ URI ያክሉ +> 4. በ`.env` ውስጥ ያሉትን የማረጋገጫ እሴቶች ይተኩ። --- @@ -731,12 +739,12 @@ process.env[`${PROVIDER_ID}_USER_AGENT`] ## 15. የጊዜ ገደብ ቅንብሮች -ሁሉም ዋጋዎች በ**ሚሊሰከንድ** ናቸው። የተማከለ የመወሰን ሂደቱ በ`src/shared/utils/runtimeTimeouts.ts` ውስጥ ይገኛል። +ሁሉም እሴቶች በ**ሚሊሰከንድ** ናቸው። ማዕከላዊ እሴት መወሰኛው `src/shared/utils/runtimeTimeouts.ts` ውስጥ ይገኛል። ### የጊዜ ገደብ ተዋረድ ``` -REQUEST_TIMEOUT_MS (አጠቃላይ መሻሪያ) +REQUEST_TIMEOUT_MS (አጠቃላይ ተተኪ ቅንብር) ├─→ FETCH_TIMEOUT_MS (ወደ ላይኛው አቅራቢ የሚደረጉ ጥሪዎች፣ ነባሪ፦ 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (ከFETCH_TIMEOUT_MS ይወርሳል) │ ├─→ FETCH_BODY_TIMEOUT_MS (ከFETCH_TIMEOUT_MS ይወርሳል) @@ -748,122 +756,122 @@ REQUEST_TIMEOUT_MS (አጠቃላይ መሻሪያ) ├─→ STREAM_IDLE_TIMEOUT_MS (ከREQUEST_TIMEOUT_MS ይወርሳል፣ ነባሪ፦ 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (ገለልተኛ፣ ነባሪ፦ 1260000፤ 0 ያሰናክለዋል) ├─→ STREAM_READINESS_TIMEOUT_MS (ከREQUEST_TIMEOUT_MS ይወርሳል፣ ነባሪ፦ 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (ተለዋዋጭ የዝግጁነት ማራዘሚያዎችን ይገድባል፣ ነባሪ፦ 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (የሚለማመዱ የዝግጁነት ማራዘሚያዎችን ይገድባል፣ ነባሪ፦ 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (ከREQUEST_TIMEOUT_MS ይወርሳል፣ ነባሪ፦ 30000) - ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (የተወሰደ፣ ነባሪ፦ 300000) + ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (የተዋቀረ፣ ነባሪ፦ 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (ነባሪ፦ 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (ነባሪ፦ 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (ነባሪ፦ 0 = ተሰናክሏል) ``` -| ተለዋዋጭ | ነባሪ | መግለጫ | -| ----------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(አልተዋቀረም)_ | ዓለም አቀፍ አቋራጭ — የ`FETCH_TIMEOUT_MS` እና `STREAM_IDLE_TIMEOUT_MS` ነባሪዎችን ይተካል። | -| `FETCH_TIMEOUT_MS` | `600000` | ወደ ላይኛው አቅራቢ ለሚደረጉ ጥሪዎች አጠቃላይ የHTTP ጥያቄ ጊዜ ገደብ። | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | ከማቋረጡ በፊት በጥሬ የላይኛው ዥረት ባይቶች መካከል የሚፈቀደው ከፍተኛው የዝምታ ጊዜ። የተራዘመ አስተሳሰብ ሞዴሎች ከ90 ሰከንድ በላይ ለአፍታ ማቆማቸው ብርቅ ነው። | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | ከፍተኛው ጠቅላላ የንቁ SSE ዥረት የሕይወት ጊዜ፤ በላይኛው ዥረት ባይቶች በጭራሽ አይጀመርም እና ከ`REQUEST_TIMEOUT_MS` ነፃ ነው። በመዝገቡ ውስጥ ካለው ትልቁ የየሞዴሉ `timeoutMs` (1200000, Codex) ላይ የ60000 ህዳግ በመጨመር የተገኘ ሲሆን፣ ሙሉ የጊዜ በጀቱን እንዲጠቀም የተፈቀደለት ሞዴል በመልሱ መካከል እንዳይቋረጥ ያደርጋል። ለማሰናከል `0` ያዘጋጁ። | -| `OMNIROUTE_SSE_COMMENTS` | _(ተሰናክሏል)_ | OmniRoute የSSE `:` የአስተያየት መስመሮችን (ለምሳሌ የ`: keepalive` ምት እና `x-omniroute-*` ዲበ ውሂብ ተጨማሪ መረጃዎችን) ማውጣት ይችል እንደሆነ። ጥብቅ የOpenAI-ተኳኋኝ ደንበኞች በእያንዳንዱ SSE መስመር ላይ JSON.parse በማድረግ በ`:` አስተያየቶች ምክንያት ስለሚበላሹ፣ በነባሪነት ተሰናክሏል (#10524)፤ `data:` ምቶች ግን አይነኩም። እንደገና ለማንቃት `on`/`true`/`1`/`yes` ያዘጋጁ። በ`open-sse/utils/sseHeartbeat.ts` ጥቅም ላይ ይውላል። | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | የመጀመሪያውን ፒንግ ያልሆነ SSE ክስተት ለመቀበል የሚፈቀድ ጊዜ። `REQUEST_TIMEOUT_MS` ሲዘጋጅ ዋጋውን ይወርሳል። | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | ለትላልቅ፣ ብዙ መሣሪያ ለሚጠቀሙ ወይም ከፍተኛ አመክንዮ ለሚፈልጉ የዥረት ጥያቄዎች ከፍተኛው ተስማሚ የመጀመሪያ ክስተት ዝግጁነት መስኮት። | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | ለ`/goal` ግምታዊ ዘዴ የማቋረጫ መቀየሪያ። ማወቂያውን ሙሉ በሙሉ ለማሰናከል `false`/`0`/`off` ያዘጋጁ — የዝግጁነት ጊዜ ገደቦች እና የዥረት መልሶ ማግኛ በጥያቄ አካል/ራስጌዎች ፈጽሞ አይጨምሩም፣ ይህም በደንበኛ የሚቆጣጠር የጊዜ ገደብ ማጉላትን ይቀንሳል። | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | ለተገኙ የ`/goal` ወኪል ክወናዎች ወይም በ`x-omniroute-agent-goal` ለተገደዱ ጥያቄዎች ከፍተኛው የመጀመሪያ ክስተት ዝግጁነት መስኮት። | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | ለተገኙ የ`/goal` ወኪል ክወናዎች ቀደምት የዥረት መልሶ ማግኛን በራስ-ሰር ያንቁ። ለግቡ የተለየውን ተሳትፎ ለማሰናከል `false`/`0`/`off` ያዘጋጁ። ይህ በኦፕሬተሩ ነባሪ ላይ መልሶ ማግኛን መጨመር ብቻ ይችላል — ግልጽ የ`STREAM_RECOVERY_ENABLED`/DB ቅንብሮች አለመሳተፍን በፍጹም አይተካም። | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | የOpenAI SDK `responses.stream()` በ502 እንዲበላሽ የሚያደርጉ መደበኛ ያልሆኑ `codex.*` SSE ክስተቶችን (ለምሳሌ `codex.rate_limits`) ያስወግዱ። በነባሪነት በርቷል (#11014)። ለማስተላለፍ `0`/`false`/`no`/`off` ያዘጋጁ። | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(አልተዋቀረም)_ | በምርጫ የሚነቃ የCodex app-server ማጓጓዣ። የአካባቢ `codex app-server` የጎን ኮንቴነር WebSocket መጨረሻ ነጥብ (`ws://`/`wss://`)። ከቶከን ጋር አብሮ ሲዘጋጅ፣ የCodex ጥያቄዎች ከHTTP Responses API ይልቅ በJSON-RPC በኩል ወደ ጎን ኮንቴነሩ ይመራሉ። በእያንዳንዱ ግንኙነት `providerSpecificData.codexAppServerUrl` በኩልም ሊዘጋጅ ይችላል። በ`open-sse/executors/codex/appServerConfig.ts` ጥቅም ላይ ይውላል። | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(አልተዋቀረም)_ | ለapp-server የሚቀርብ ቀጥታ የችሎታ/bearer ቶከን። የየግንኙነቱ መተኪያ፦ `providerSpecificData.codexAppServerToken`። | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(አልተዋቀረም)_ | የapp-server ችሎታ ቶከንን የያዘ ፋይል ዱካ (ከ`codex app-server --ws-token-file`)። `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ባልተዋቀረ ጊዜ ጥቅም ላይ ይውላል። የየግንኙነቱ መተኪያ፦ `providerSpecificData.codexAppServerTokenFile`። | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | የapp-server ዙር የሚሠራበት የሥራ ማውጫ። የየግንኙነቱ መተኪያ፦ `providerSpecificData.codexAppServerCwd`። | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(አልተዋቀረም)_ | ለapp-server ዙር የሚተላለፍ የማጽደቅ ፖሊሲ (ለምሳሌ `never`፣ `on-request`)። የየግንኙነቱ መተኪያ፦ `providerSpecificData.codexAppServerApprovalPolicy`። | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(አልተዋቀረም)_ | ለapp-server ዙር የሚተላለፍ የSandbox ፖሊሲ (ለምሳሌ `read-only`፣ `workspace-write`፣ `danger-full-access`)። ባልተዋቀረ ጊዜ አስፈጻሚው በነባሪነት `workspace-write` ይጠቀማል (የተጠናከረ፤ ከዚህ ቀደም `danger-full-access`)። የየግንኙነቱ መተኪያ፦ `providerSpecificData.codexAppServerSandbox`። | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | የapp-server የራሱን የማጽደቅ ጥያቄዎች (በአስተናጋጁ ላይ የትዕዛዝ/ፋይል/ፈቃድ ማስፈጸም) በራስ-ሰር ያጽድቁ። በነባሪነት ጠፍቷል — ጥያቄዎች በራስ-ሰር ውድቅ ይደረጋሉ፤ የharness መሣሪያ ጥሪዎች አይነኩም (በተለየው `item/tool/call` ቀጥታ ማስተላለፊያ ይጓዛሉ)። `true`/`1`/`yes` ይቀበላል። የየግንኙነቱ መተኪያ፦ `providerSpecificData.codexAppServerAutoApprove`። | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | የምላሽ ራስጌዎችን ለመቀበል የሚፈቀድ ጊዜ። | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | ለእያንዳንዱ ቀጥተኛ ፕሮክሲ-አልባ ሙከራ ምላሹ እስኪጀምር የሚጠበቅበት ከፍተኛው ጊዜ (ms)። ጊዜው ካለፈ በአዲስ socket ላይ አንድ ጊዜ እንደገና ይሞከራል፤ ገደቡን ለማሰናከል እና የቀድሞውን ባህሪ ለማቆየት `0` ያዘጋጁ። | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | ሙሉውን የምላሽ body ለመቀበል የሚፈቀደው ጊዜ። | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | የTCP ግንኙነት ማቋቋሚያ ጊዜ ገደብ። | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | የkeep-alive socket ስራ-አልባ ጊዜ ገደብ። | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | የTLS fingerprint proxy (wreq-js) ጊዜ ገደብ። | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | በተለይ በwreq-js TLS-fingerprint transport body ላይ የመጀመሪያው ባይት እስኪደርስ ያለውን ጊዜ ይገድባል፤ headers እንደደረሱ ስለሚፈታ `TLS_CLIENT_TIMEOUT_MS` ብቻውን የቆመ body ሊያውቅ አይችልም (#12656)። ጊዜው ካለፈ wreq readerን ይሰርዛል እና ወደ direct/proxy dispatcher ይመለሳል፤ `0` watchdogን ያሰናክላል። | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | ለOpenCode executor ብቻ፣ እንዲሁም `OPENCODE_RESPONSES_STALL_ROTATION` feature flag በርቶ ሳለ ብቻ (በነባሪ ጠፍቷል)፦ headers ከደረሱ በኋላ ከstream የሚደረግ Responses reply የመጀመሪያው body byte እስኪደርስ ያለውን የጥበቃ ጊዜ ይገድባል (#13484)። የResponses stream በ`response.created` ስለሚከፈት፣ ከዚህ የጊዜ መስኮት በላይ ያለ ዝምታ stall ነው፦ accountው ለጊዜው ይታገዳል እና requestው አንድ ጊዜ ወደሚቀጥለው account ይዞራል፤ ሁለተኛ stall ከተከሰተ ወዲያውኑ ይከሽፋል። flagው በርቶ ቢሆንም `0` guardውን ያሰናክላል። | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | ለ`/v1` bridge requests የproxy hop ጊዜ ገደብ። | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | የFirecrawl web-fetch executorን በራስዎ ወደሚስተናገድ instance ያመልክቱ (ከcloud ውጭ API key አማራጭ ነው)። | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | ለFirecrawl web-fetch executor የእያንዳንዱ request ጊዜ ገደብ። | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | ለbridgeው አጠቃላይ የserver request ጊዜ ገደብ። | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | በbridgeው በኩል የምላሽ headersን ለመላክ የሚፈቀደው ጊዜ። | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | የbridge keep-alive ስራ-አልባ ጊዜ ገደብ። | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | የraw socket ጊዜ ገደብ (0 = ተሰናክሏል)። | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | በSIGTERM/SIGINT ጊዜ በግድ ከመውጣት በፊት የሚሰጥ የእፎይታ ጊዜ። | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` ካልተዘጋጀ፣ በ`src/shared/utils/fetchTimeout.ts` ጥቅም ላይ የሚውል fallback። | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | በ`src/shared/network/safeOutboundFetch.ts` ውስጥ ላሉት `validationRead` እና `modelsProbe` presets የጊዜ ገደብ (ms)። በdashboard ላይ በactive/error መካከል ተደጋጋሚ መቀያየርን ለመከላከል ለዝግተኛ endpoints (Cerebras, Cloudflare AI, Groq) ዋጋውን ከፍ ያድርጉ። ልክ ላልሆኑ (<1000) ወይም ቁጥር ላልሆኑ እሴቶች ወደ 8000ms ይመለሳል። | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | በ`open-sse/utils/proxyFetch.ts` ውስጥ relay-specific fetch ጊዜ ገደብ (#9158)። ተጣብቆ የቀረ relay ከclient/agent ጊዜ ገደብ (~30s) በፊት መክሸፍ አለበት፤ በዚህም ጠሪዎች አጠቃላይ upstream ጊዜ ገደብ ሳይሆን relay-specific ውድቀትን ያያሉ። ሁልጊዜ ቀድሞ እንዲነሳ በ`29000` ተገድቧል። | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | በ`open-sse/utils/proxyFetch.ts` ውስጥ ላሉ direct/relay/proxy retry-once መንገዶች የጋራ retry backoff (#9158)። `0` = ወዲያውኑ እንደገና ሞክር። | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | የnative wreq-js request ጊዜ ገደብ (`claudeTlsClient.ts`)። | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | በnative timeout ላይ የሚጨመር ፍጹም የJS hard-deadline የእፎይታ ጊዜ። | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | የnative wreq-js request ጊዜ ገደብ (`perplexityTlsClient.ts`)። | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | በnative timeout ላይ የሚጨመር ፍጹም የJS hard-deadline የእፎይታ ጊዜ። | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (ጠፍቷል) | "You have built-in web search. Answer questions directly using search results." የሚለውን ወደ ጠሪው የስርዓት መልዕክት ያክላል (`perplexity-web/protocol.ts`)። በነባሪነት ጠፍቷል — Perplexity ለማንኛውም ፍለጋ ያደርጋል፣ እና ዓረፍተ ነገሩ ለኮዲንግ ደንበኞች በሚሰጡ ምላሾች ውስጥ እንደ ሜታ-አስተያየት ይታያል። መልሶ ለማንቃት `1`/`true`/`yes`/`on` ያዘጋጁ። | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | የአገርኛ wreq-js ጥያቄ የጊዜ ገደብ (`grokTlsClient.ts`)። | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | በአገርኛው የጊዜ ገደብ ላይ የሚጨመር ፍጹም የJS ጥብቅ የመጨረሻ ጊዜ ማራዘሚያ። | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | የአገርኛ wreq-js ጥያቄ የጊዜ ገደብ (`notionTlsClient.ts`)፤ `notion-web` ለረጅም የማመንጨት ሂደቶች በየጥያቄው ወደ `180000` ያሳድገዋል። | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | በአገርኛው የጊዜ ገደብ ላይ የሚጨመር ፍጹም የJS ጥብቅ የመጨረሻ ጊዜ ማራዘሚያ። | -| `OMNIROUTE_BROWSER_POOL` | `on` | በአሳሽ ላይ ለተመሠረተ የድር-ኩኪ ውይይት የጋራ Playwright የአሳሽ ፑል (`browserPool.ts`)፤ ለማሰናከል `off` ያዘጋጁ። | -| `OBSCURA_BIN` | `auto-detect` | በአሳሽ ፑሉ እና በCloudflare Playground አስፈጻሚው እንደ ዋና ኤንጂን ጥቅም ላይ የሚውለው የ`obscura` ባይነሪ ዱካ (`open-sse/services/obscura.ts`)፤ ካልተዘጋጀ ከስርዓቱ PATH በራስ-ሰር ይገኛል። | -| `OBSCURA_CDP_ENDPOINT` | _(አልተዘጋጀም)_ | አዲስ ከማስጀመር ይልቅ አስቀድሞ ወደሚሠራ Obscura (`http://host:port`) ያመልክቱ፤ ሞጁሉ የዚያ ሂደት ባለቤት አይደለም (`open-sse/services/obscura.ts`)። | -| `OBSCURA_PORT` | `random free port` | ለሚጀመረው `obscura serve` የተወሰነ ፖርት፤ ካልተዘጋጀ ነፃ ፖርት በራስ-ሰር ይመረጣል (`open-sse/services/obscura.ts`)። | -| `WEB_COOKIE_USE_BROWSER` | `0` | የድር-ኩኪ ውይይት ጥያቄን በአሳሽ ላይ በተመሠረተው መንገድ እንዲሄድ ያስመርጣል (`browserBackedChat.ts`)፤ ለማንቃት `1`። | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | ለKimi Web (ዓለም አቀፉ kimi.ai Connect-RPC) አስፈጻሚ መሠረታዊ URL (`kimi-web.ts`)፤ ለመስታወት/ተኪ መጨረሻ ነጥቦች ብቻ ይቀይሩት። | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | ለKimi Web አስፈጻሚው ሙሉ የውይይት መጨረሻ ነጥብ (`kimi-web.ts`)። | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(በራስ-ሰር የተገኘ)_ | ለAdobe Firefly መስተጋብራዊ የአሳሽ መግቢያ የስርዓት Chrome/Edge executable ዱካ (`adobeFireflyBrowserLogin.ts`)፤ የየOS ራስ-ሰር ፍለጋን ይሽራል። | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ የstandalone ውጤት_ | ከግንባታ በኋላ ባለው የአብሮ-ማስቀመጥ ደረጃ ለሚጠቀምበት የstandalone ውጤት ማውጫ የግንባታ-ጊዜ መሻሪያ (`scripts/build/colocate-standalone.mjs`)፤ የግንባታ መሣሪያ እንጂ የአሂድ-ጊዜ አይደለም። | - -የኮምቦ ዒላማ ሙከራዎች የተፈታውን የላይኛው ዥረት ጥያቄ የጊዜ ገደብ (`FETCH_TIMEOUT_MS`፣ ወይም -የfetch ነባሪውን ሲያቀርብ `REQUEST_TIMEOUT_MS`) ይወርሳሉ። የኮምቦ ወደ ተጠባባቂ መቀየርን ፈጣን ለማድረግ ብቻ `targetTimeoutMs`ን በኮምቦ፣ -በኮምቦ ነባሪዎች ወይም በአቅራቢ መሻሪያ ውስጥ ያዘጋጁ፤ አሁን ካለው -የላይኛው ዥረት የጊዜ ገደብ በላይ ያሉ እሴቶች በዚያው ገደብ ይቆረጣሉ። - -`comboTimeoutMs` በተጠባባቂ ዒላማዎች ሁሉ ላይ የሚተገበር የተለየ የሙሉ-ኮምቦ የግድግዳ-ሰዓት በጀት ነው። -ያልተገደበ ድግግሞሽ ለማቆየት ሳይዘጋጅ ይተዉት ወይም `0` ያዘጋጁ (የ10-ደቂቃው -`COMBO_LOOP_SAFETY_TIMEOUT_MS` የመንጠልጠል ማቆሚያ አሁንም ይተገበራል)። አዎንታዊ እሴት ለኮምቦው ያንን -የደኅንነት መረብ ይተካል። ከዘገየ የመጀመሪያ ዒላማ በኋላ ወደ ተጠባባቂ ለመቀየር -አሁንም ጊዜ እንዲኖር `comboTimeoutMs`ን ከ`targetTimeoutMs` የበለጠ ያድርጉት። +| ተለዋዋጭ | ነባሪ | መግለጫ | +| ----------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(አልተዋቀረም)_ | አጠቃላይ አቋራጭ — የሁለቱንም `FETCH_TIMEOUT_MS` እና `STREAM_IDLE_TIMEOUT_MS` ነባሪዎች ይሽራል። | +| `FETCH_TIMEOUT_MS` | `600000` | ወደላይኛው አቅራቢ ለሚደረጉ ጥሪዎች አጠቃላይ የHTTP ጥያቄ ጊዜ ገደብ። | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | ከማቋረጥ በፊት በጥሬ ወደላይኛው መረጃ ባይቶች መካከል የሚፈቀደው ከፍተኛ የዝምታ ጊዜ። የተራዘመ አስተሳሰብ ሞዴሎች ከ90 ሰከንድ በላይ ለአፍታ የሚቆሙት አልፎ አልፎ ነው። | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | የነቃ SSE ዥረት ከፍተኛው ጠቅላላ የቆይታ ጊዜ፤ በወደላይኛው ባይቶች ፈጽሞ አይጀመርም እና ከ`REQUEST_TIMEOUT_MS` ነፃ ነው። በመዝገቡ ውስጥ ካለው ትልቁ የየሞዴሉ `timeoutMs` (1200000, Codex) እና ተጨማሪ 60000 ጊዜ በመነሳት የተወሰነ ስለሆነ፣ ሙሉ በጀቱን እንዲጠቀም የተፈቀደለት ሞዴል መልስ በማመንጨት መካከል ፈጽሞ አይቋረጥም። ለማሰናከል ወደ `0` ያዋቅሩ። | +| `OMNIROUTE_SSE_COMMENTS` | _(ተሰናክሏል)_ | OmniRoute የSSE `:` የአስተያየት መስመሮችን (ለምሳሌ፣ የ`: keepalive` የልብ ምት ምልክት እና የ`x-omniroute-*` ሜታዳታ መዝጊያዎች) ማውጣት ይችል እንደሆነ። ጥብቅ OpenAI-ተኳኋኝ ደንበኞች እያንዳንዱን የSSE መስመር JSON.parse ስለሚያደርጉ እና በ`:` አስተያየቶች ላይ ስለሚበላሹ፣ በነባሪ ተሰናክሏል (#10524)፤ የ`data:` የልብ ምት ምልክቶች አይነኩም። እንደገና ለመርጦ መግባት `on`/`true`/`1`/`yes` ያዋቅሩ። በ`open-sse/utils/sseHeartbeat.ts` ጥቅም ላይ ይውላል። | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | የመጀመሪያውን ፒንግ ያልሆነ የSSE ክስተት ለመቀበል የሚሰጥ ጊዜ። `REQUEST_TIMEOUT_MS` ሲዋቀር እሴቱን ይወርሳል። | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | ለትላልቅ፣ ብዙ መሣሪያ ለሚጠቀሙ ወይም ከፍተኛ አመክንዮ ለሚፈልጉ የዥረት ጥያቄዎች ከፍተኛው ተለዋዋጭ የመጀመሪያ ክስተት ዝግጁነት መጠበቂያ ጊዜ። | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | ለ`/goal` ግምታዊ ዘዴ የማጥፊያ መቀየሪያ። መለየትን ሙሉ በሙሉ ለማሰናከል `false`/`0`/`off` ያዋቅሩ — የዝግጁነት ጊዜ ገደቦች እና የዥረት መልሶ ማግኛ በጥያቄ አካል/ራስጌዎች ፈጽሞ ከፍ አይደረጉም፣ ይህም በደንበኛ የሚቆጣጠር የጊዜ ገደብ ማጉላትን ይቀንሳል። | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | ለተለዩ የ`/goal` ወኪል አሂዶች ወይም በ`x-omniroute-agent-goal` ለተገደዱ ጥያቄዎች ከፍተኛው የመጀመሪያ ክስተት ዝግጁነት መጠበቂያ ጊዜ። | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | ለተለዩ የ`/goal` ወኪል አሂዶች ቀደምት የዥረት መልሶ ማግኛን በራስ-ሰር ያንቁ። ለግቡ የተለየውን መርጦ መግባት ለማሰናከል `false`/`0`/`off` ያዋቅሩ። ይህ ከኦፕሬተሩ ነባሪ በላይ መልሶ ማግኛን መጨመር ብቻ ይችላል — ግልጽ የ`STREAM_RECOVERY_ENABLED`/DB ቅንብሮች መርጦ መውጣትን ፈጽሞ አይሽርም። | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | የOpenAI SDK `responses.stream()`ን በ502 የሚያበላሹ መደበኛ ያልሆኑ የ`codex.*` SSE ክስተቶችን (ለምሳሌ `codex.rate_limits`) ያስወግዱ። በነባሪ በርቷል (#11014)። እነሱን ለማስተላለፍ `0`/`false`/`no`/`off` ያዋቅሩ። | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(አልተዋቀረም)_ | መርጦ የሚነቃ የCodex app-server ማጓጓዣ። የአካባቢያዊ `codex app-server` sidecar WebSocket መጨረሻ ነጥብ (`ws://`/`wss://`)። ከቶከን ጋር ሲዋቀር፣ የCodex ጥያቄዎች በHTTP Responses API ፋንታ በJSON-RPC በኩል ወደ sidecar ይመራሉ። እንዲሁም በየግንኙነቱ በ`providerSpecificData.codexAppServerUrl` በኩል ሊዋቀር ይችላል። በ`open-sse/executors/codex/appServerConfig.ts` ጥቅም ላይ ይውላል። | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(አልተዋቀረም)_ | ለapp-server የሚቀርብ የቀጥታ የችሎታ/bearer ቶከን። የየግንኙነቱ መሻር፦ `providerSpecificData.codexAppServerToken`። | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(አልተዋቀረም)_ | የapp-server ችሎታ ቶከንን የያዘ ፋይል ዱካ (ከ`codex app-server --ws-token-file`)። `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ባልተዋቀረ ጊዜ ጥቅም ላይ ይውላል። የየግንኙነቱ መሻር፦ `providerSpecificData.codexAppServerTokenFile`። | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | የapp-server ዙር የሚሰራበት የሥራ ማውጫ። የየግንኙነቱ መሻር፦ `providerSpecificData.codexAppServerCwd`። | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(አልተዋቀረም)_ | ወደ app-server ዙር የሚተላለፍ የማጽደቅ ፖሊሲ (ለምሳሌ `never`፣ `on-request`)። የየግንኙነቱ መሻር፦ `providerSpecificData.codexAppServerApprovalPolicy`። | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(አልተዋቀረም)_ | ወደ app-server ዙር የሚተላለፍ የsandbox ፖሊሲ (ለምሳሌ `read-only`፣ `workspace-write`፣ `danger-full-access`)። ባልተዋቀረ ጊዜ አስፈጻሚው በነባሪ `workspace-write`ን ይጠቀማል (ደህንነቱ የተጠናከረ፤ ቀደም ሲል `danger-full-access`)። የየግንኙነቱ መሻር፦ `providerSpecificData.codexAppServerSandbox`። | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | የapp-serverን የራሱን የማጽደቅ ጥያቄዎች (በአስተናጋጁ ላይ የትዕዛዝ/ፋይል/ፈቃድ አፈጻጸም) በራስ-ሰር ያጽድቁ። በነባሪ ጠፍቷል — ጥያቄዎች በራስ-ሰር ውድቅ ይደረጋሉ፤ የharness መሣሪያ ጥሪዎች አይነኩም (በተለየው `item/tool/call` ቀጥታ ማስተላለፊያ በኩል ይጓዛሉ)። `true`/`1`/`yes` ይቀበላል። የየግንኙነቱ መሻር፦ `providerSpecificData.codexAppServerAutoApprove`። | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | የምላሽ ራስጌዎችን ለመቀበል የሚሰጥ ጊዜ። | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 ሰከንድ) | ለእያንዳንዱ ቀጥተኛ ፕሮክሲ-አልባ ሙከራ ምላሹ እስኪጀምር የሚጠበቅበት ከፍተኛው ጊዜ (ms)። ጊዜው ካለፈ በአዲስ socket ላይ አንድ ጊዜ እንደገና ይሞከራል፤ ገደቡን ለማሰናከል እና የቀድሞውን ባህሪ ለማስቀጠል `0` ያዘጋጁ። | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 ደቂቃ) | ከላይ ባለው የተጋራ ሙከራ የምላሽ-መጀመሪያ ጊዜ ማብቂያ በኋላ፣ በአዲስ socket ለሚደረገው RETRY ሙከራ ከፍተኛው ገደብ (ms) (#13703)። ይህ ተጠሪው የራሱን የጊዜ ገደብ ምልክት (የተፈታው connection/model/provider/`FETCH_TIMEOUT_MS` ቅደም ተከተል) አስቀድሞ ሲያያይዝ ብቻ ተግባራዊ ይሆናል፤ በታሰበው መንገድ ትክክለኛው ገደብ ያ ምልክት ሲሆን ቀድሞ ይነሳል፣ ስለዚህ ይህ ቋሚ ከፍተኛ ገደብ ሳይሆን ሰፊ የመጨረሻ መከላከያ ነው — ይህ ከሌለ፣ ዳግም ሙከራው የተጋራው ሙከራ የተጠቀመበትን ያንኑ አጭር የ`OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` ጊዜ መስኮት እንደገና ይጠቀም ነበር፣ ይህም ጤናማ ነገር ግን ዝግተኛ-TTFB ያላቸውን የreasoning ሞዴሎች በ504 ስህተት እንዲያቋርጥ ያደርግ ነበር። ከላይ ካለው ቋሚ ዝቅተኛ ገደብ በታች በፍጹም አይፈቀድም፤ ተጠሪው ምንም የጊዜ ገደብ ምልክት ካላቀረበ፣ ዳግም ሙከራው ቋሚውን ዝቅተኛ ገደብ ሳይቀይር ይጠብቃል። | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | ሙሉውን የምላሽ body ለመቀበል የሚፈቀደው ጊዜ። | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | የTCP ግንኙነት ማቋቋሚያ ጊዜ ማብቂያ። | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | የkeep-alive socket ስራ-ፈት ጊዜ ማብቂያ። | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | የTLS fingerprint ፕሮክሲ (wreq-js) ጊዜ ማብቂያ። | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | በተለይ በwreq-js TLS-fingerprint ማጓጓዣ body ላይ የመጀመሪያው ባይት እስኪደርስ ያለውን ጊዜ ይገድባል፤ headers እንደደረሱ ስለሚፈታ `TLS_CLIENT_TIMEOUT_MS` ብቻውን የቆመ bodyን ማወቅ አይችልም (#12656)። ጊዜው ሲያልቅ wreq readerን ይሰርዛል እና ወደ ቀጥተኛ/ፕሮክሲ dispatcher ይመለሳል፤ `0` watchdogን ያሰናክላል። | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | ለOpenCode executor ብቻ፣ እና የ`OPENCODE_RESPONSES_STALL_ROTATION` ባህሪ ባንዲራ በርቶ ሳለ ብቻ (በነባሪ ጠፍቷል)፦ headers ከደረሱ በኋላ የstream የResponses ምላሽ የመጀመሪያ body ባይት እስኪመጣ ያለውን ጥበቃ ይገድባል (#13484)። የResponses stream በ`response.created` ይከፈታል፣ ስለዚህ ከዚህ ጊዜ መስኮት በላይ ያለ ዝምታ መቆምን ያመለክታል፦ መለያው በጊዜያዊነት እንዲያርፍ ይደረጋል እና ጥያቄው አንድ ጊዜ ወደሚቀጥለው መለያ ይዞራል፤ ሁለተኛ መቆም በፍጥነት እንዲከሽፍ ያደርጋል። ባንዲራው በርቶ ቢሆንም `0` መከላከያውን ያሰናክላል። | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | ለ`/v1` bridge ጥያቄዎች የፕሮክሲ hop ጊዜ ማብቂያ። | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | የFirecrawl web-fetch executorን በራስዎ ወደተስተናገደ instance ያመልክቱ (ከcloud ውጭ API key አማራጭ ነው)። | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | ለFirecrawl web-fetch executor በእያንዳንዱ ጥያቄ የሚተገበር ጊዜ ማብቂያ። | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | ለbridge አጠቃላይ የserver ጥያቄ ጊዜ ማብቂያ። | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | የምላሽ headersን በbridge በኩል ለመላክ የሚፈቀደው ጊዜ። | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | የbridge keep-alive ስራ-ፈት ጊዜ ማብቂያ። | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | የraw socket ጊዜ ማብቂያ (0 = ተሰናክሏል)። | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | ከSIGTERM/SIGINT በኋላ በግድ ከመውጣት በፊት ያለው የእፎይታ ጊዜ። | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` ባልተዘጋጀ ጊዜ በ`src/shared/utils/fetchTimeout.ts` ጥቅም ላይ የሚውል fallback። | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | በ`src/shared/network/safeOutboundFetch.ts` ውስጥ ላሉት `validationRead` እና `modelsProbe` presets የጊዜ ማብቂያ (ms)። በdashboard ላይ በactive/error መካከል መዋዠቅን ለመከላከል ለዝግተኛ endpoints (Cerebras, Cloudflare AI, Groq) ከፍ ያድርጉት። ልክ ላልሆኑ (<1000) ወይም ቁጥር ላልሆኑ እሴቶች ወደ 8000ms fallback ያደርጋል። | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | በ`open-sse/utils/proxyFetch.ts` ውስጥ ለrelay የተለየ የfetch ጊዜ ማብቂያ (#9158)። ተጣብቆ የቀረ relay ከclient/agent ጊዜ ማብቂያ (~30 ሰከንድ) በፊት መክሸፍ አለበት፣ ይህም ተጠሪዎች አጠቃላይ የupstream ጊዜ ማብቂያ ሳይሆን ለrelay የተለየ ውድቀት እንዲያዩ ያደርጋል። ሁልጊዜ ቀድሞ እንዲነሳ በ`29000` ተገድቧል። | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | በ`open-sse/utils/proxyFetch.ts` ውስጥ ላሉት ቀጥተኛ/relay/ፕሮክሲ አንድ-ጊዜ-ዳግም-ሙከራ መንገዶች የጋራ የዳግም ሙከራ መዘግየት (#9158)። `0` = ወዲያውኑ እንደገና ሞክር። | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | የNative wreq-js ጥያቄ ጊዜ ገደብ (`claudeTlsClient.ts`)። | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | በNative ጊዜ ገደቡ ላይ የሚጨመር ፍጹም የJS ጥብቅ የመጨረሻ ጊዜ ተጨማሪ ጊዜ። | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | የNative wreq-js ጥያቄ ጊዜ ገደብ (`perplexityTlsClient.ts`)። | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | በNative ጊዜ ገደቡ ላይ የሚጨመር ፍጹም የJS ጥብቅ የመጨረሻ ጊዜ ተጨማሪ ጊዜ። | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (ጠፍቷል) | "አብሮገነብ የድር ፍለጋ አለዎት። የፍለጋ ውጤቶችን በመጠቀም ጥያቄዎችን በቀጥታ ይመልሱ።" የሚለውን ወደ ጠሪው የስርዓት መልዕክት ያክላል (`perplexity-web/protocol.ts`)። በነባሪ ጠፍቷል — Perplexity ለማንኛውም ይፈልጋል፣ እና ዓረፍተ ነገሩ ለኮዲንግ ደንበኞች እንደ ሜታ-አስተያየት ወደ ምላሾች ይገባል። መልሶ ለማንቃት `1`/`true`/`yes`/`on` ያዘጋጁ። | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | የNative wreq-js ጥያቄ ጊዜ ገደብ (`grokTlsClient.ts`)። | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | በNative ጊዜ ገደቡ ላይ የሚጨመር ፍጹም የJS ጥብቅ የመጨረሻ ጊዜ ተጨማሪ ጊዜ። | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | የNative wreq-js ጥያቄ ጊዜ ገደብ (`notionTlsClient.ts`)፤ `notion-web` ለረጅም ማመንጨቶች በእያንዳንዱ ጥያቄ ወደ `180000` ከፍ ያደርገዋል። | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | በNative ጊዜ ገደቡ ላይ የሚጨመር ፍጹም የJS ጥብቅ የመጨረሻ ጊዜ ተጨማሪ ጊዜ። | +| `OMNIROUTE_BROWSER_POOL` | `on` | በአሳሽ ለሚደገፍ የድር-ኩኪ ውይይት የጋራ Playwright የአሳሽ ፑል (`browserPool.ts`)፤ ለማሰናከል `off` ያዘጋጁ። | +| `OBSCURA_BIN` | `auto-detect` | በአሳሽ ፑሉ እና በCloudflare Playground አስፈጻሚ እንደ ዋና ሞተር ጥቅም ላይ የሚውለው የ`obscura` ባይነሪ ዱካ (`open-sse/services/obscura.ts`)፤ ካልተዘጋጀ ከስርዓቱ PATH በራስ-ሰር ይገኛል። | +| `OBSCURA_CDP_ENDPOINT` | _(አልተዘጋጀም)_ | አዲስ ከማስጀመር ይልቅ ቀድሞ ወደሚሰራ Obscura (`http://host:port`) ያመልክቱ፤ ሞጁሉ የዚያ ሂደት ባለቤት አይደለም (`open-sse/services/obscura.ts`)። | +| `OBSCURA_PORT` | `በዘፈቀደ ነፃ ወደብ` | ለተጀመረው `obscura serve` ግልጽ ወደብ፤ ካልተዘጋጀ ነፃ ወደብ በራስ-ሰር ይመረጣል (`open-sse/services/obscura.ts`)። | +| `WEB_COOKIE_USE_BROWSER` | `0` | የድር-ኩኪ ውይይት ጥያቄን በአሳሽ ወደሚደገፈው መንገድ እንዲገባ ያድርጉ (`browserBackedChat.ts`)፤ ለማንቃት `1`። | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | ለKimi Web (ዓለም አቀፉ kimi.ai Connect-RPC) አስፈጻሚ መሠረታዊ URL (`kimi-web.ts`)፤ ለሚረር/ፕሮክሲ የመዳረሻ ነጥቦች ብቻ ይቀይሩት። | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | ለKimi Web አስፈጻሚው ሙሉ የውይይት መዳረሻ ነጥብ (`kimi-web.ts`)። | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(በራስ-ሰር የተገኘ)_ | ለAdobe Firefly በይነተገናኝ የአሳሽ መግቢያ የስርዓት Chrome/Edge ተፈጻሚ ፋይል ዱካ (`adobeFireflyBrowserLogin.ts`)፤ የእያንዳንዱን OS ራስ-ሰር ማግኘት ይተካል። | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ ራሱን የቻለ ውጤት_ | ከግንባታ በኋላ ባለው አብሮ-ማስቀመጥ ደረጃ ጥቅም ላይ ለሚውለው ራሱን የቻለ የውጤት ማውጫ የግንባታ-ጊዜ መተኪያ (`scripts/build/colocate-standalone.mjs`)፤ ይህ የግንባታ መሣሪያ እንጂ የአሂድ-ጊዜ አይደለም። | + +የCombo ዒላማ ሙከራዎች የተፈታውን የላይኛው አገልግሎት ጥያቄ ጊዜ ገደብ (`FETCH_TIMEOUT_MS`፣ ወይም +የfetch ነባሪውን ሲያቀርብ `REQUEST_TIMEOUT_MS`) ይወርሳሉ። የCombo መጠባበቂያ ሽግግርን ፈጣን ለማድረግ ብቻ `targetTimeoutMs`ን በCombo፣ +በCombo ነባሪዎች ወይም በአቅራቢ መተኪያ ውስጥ ያዘጋጁ፤ ከአሁኑ የላይኛው አገልግሎት ጊዜ ገደብ በላይ ያሉ እሴቶች +በዚያው የላይኛው አገልግሎት ጊዜ ገደብ ይገደባሉ። + +`comboTimeoutMs` በመጠባበቂያ ሽግግር ዒላማዎች ሁሉ ላይ የሚተገበር የሙሉ Combo የግድግዳ-ሰዓት በጀት ነው። +ያልተገደበ ድግግሞሽ ለማስቀጠል ሳይዘጋጅ ይተዉት ወይም `0` ያዘጋጁ (የ10 ደቂቃው +`COMBO_LOOP_SAFETY_TIMEOUT_MS` የመቆየት-ማቆሚያ አሁንም ተግባራዊ ነው)። አዎንታዊ እሴት ለCombo ያንን +የደኅንነት መረብ ይተካዋል። ከዝግተኛ የመጀመሪያ ዒላማ በኋላም ለመጠባበቂያ ሽግግር ጊዜ እንዲኖር `comboTimeoutMs`ን ከ`targetTimeoutMs` የበለጠ ያድርጉ። ### የወረዳ ሰባሪ ገደቦች የአቅራቢ-ደረጃ የወረዳ ሰባሪ ማስተካከያ። ነባሪዎቹ ከv3.6 ጀምሮ ለ500+ ግንኙነቶች ጥቅም ላይ የዋሉትን የተመጣጠኑ እሴቶች ያንጸባርቃሉ። -| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | -| ------------------------------------------------------------- | --------- | ------------------------------ | ---------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ወረዳ አቋራጩ ከመነሳቱ በፊት ለOAuth አቅራቢዎች የሚፈቀደው ተከታታይ የውድቀት ገደብ። | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | ለOAuth አቅራቢ ወረዳ አቋራጭ የዳግም ማስጀመሪያ መስኮት (ms)። | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | ለAPI-key አቅራቢዎች የተከታታይ ውድቀት ገደብ። | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | ለAPI-key አቅራቢ ወረዳ አቋራጭ የዳግም ማስጀመሪያ መስኮት (ms)። | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | ለአካባቢያዊ አቅራቢዎች (Ollama፣ LM Studio፣ ...) የተከታታይ ውድቀት ገደብ። | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | ለአካባቢያዊ አቅራቢ ወረዳ አቋራጭ የዳግም ማስጀመሪያ መስኮት (ms)። | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ ሙሉው የOAuth አቅራቢ ወደ ማቀዝቀዣ ጊዜ ከመግባቱ በፊት በመስኮቱ ውስጥ የሚከሰቱ ውድቀቶች። | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ ለOAuth አቅራቢዎች ተንቀሳቃሽ የውድቀት ቆጠራ መስኮት (ms)። | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ የOAuth አቅራቢው ገደብ ከተደረሰ በኋላ የማቀዝቀዣ ጊዜ (ms)። | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | የOAuth አቅራቢው በዚህ የውድቀት ብዛት ወደ DEGRADED ይገባል። | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | ለOAuth አቅራቢ ከፍተኛው የresetTimeout የጭማሪ ብዜት። | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | የOAuth አቅራቢው ከዚህ ብዛት የክፍት ዑደቶች በኋላ ደረጃውን ያሳድጋል። | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ ሙሉው የAPI-key አቅራቢ ወደ ማቀዝቀዣ ጊዜ ከመግባቱ በፊት በመስኮቱ ውስጥ የሚከሰቱ ውድቀቶች። | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ ለAPI-key አቅራቢዎች ተንቀሳቃሽ የውድቀት ቆጠራ መስኮት (ms)። | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ የAPI-key አቅራቢው ገደብ ከተደረሰ በኋላ የማቀዝቀዣ ጊዜ (ms)። | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | የAPI-key አቅራቢው በዚህ የውድቀት ብዛት ወደ DEGRADED ይገባል። | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | ለAPI-key አቅራቢ ከፍተኛው የresetTimeout የጭማሪ ብዜት። | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | የAPI-key አቅራቢው ከዚህ ብዛት የክፍት ዑደቶች በኋላ ደረጃውን ያሳድጋል። | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ ሙሉው አካባቢያዊ አቅራቢ ወደ ማቀዝቀዣ ጊዜ ከመግባቱ በፊት የሚከሰቱ ውድቀቶች። | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ ለአካባቢያዊ አቅራቢዎች ተንቀሳቃሽ የውድቀት ቆጠራ መስኮት (ms)። | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ወረዳ አቋራጭ፦ የአካባቢያዊ አቅራቢው ገደብ ከተደረሰ በኋላ የማቀዝቀዣ ጊዜ (ms)። | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | የአውድ መሸጎጫ ፒን አቅራቢ በዘላቂነት ጤናማ እንዳልሆነ የሚቆጠርበት እና ለመተኪያ ሽግግር ፒኑ የሚጣልበት የመጠበቂያ ጥልቀት። | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | የአውድ መሸጎጫ ፒን ከመጣሉ በፊት አጭር ጊዜያዊ የማቀዝቀዣ ጊዜዎችን የሚታገስ ፈጣን መለዋወጥን የሚከላከል መስኮት (ms)። | +| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | +| ------------------------------------------------------------- | --------- | ------------------------------ | --------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ሰርኪዩት ብሬከሩ ከመነሳቱ በፊት ለOAuth አቅራቢዎች የሚፈቀደው ተከታታይ የውድቀት ገደብ። | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | ለOAuth አቅራቢ ብሬከር የዳግም ማስጀመሪያ ጊዜ መስኮት (ms)። | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API ቁልፍ ለሚጠቀሙ አቅራቢዎች የተከታታይ ውድቀት ገደብ። | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API ቁልፍ ለሚጠቀም አቅራቢ ብሬከር የዳግም ማስጀመሪያ ጊዜ መስኮት (ms)። | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | ለአካባቢያዊ አቅራቢዎች (Ollama፣ LM Studio፣ ...) የተከታታይ ውድቀት ገደብ። | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | ለአካባቢያዊ አቅራቢ ብሬከር የዳግም ማስጀመሪያ ጊዜ መስኮት (ms)። | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ መላው የOAuth አቅራቢ ወደ ማቀዝቀዣ ጊዜ ከመግባቱ በፊት በጊዜ መስኮቱ ውስጥ የሚፈቀዱ ውድቀቶች። | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ ለOAuth አቅራቢዎች ተንቀሳቃሽ የውድቀት ቆጠራ ጊዜ መስኮት (ms)። | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ የOAuth አቅራቢው ገደብ ከተደረሰ በኋላ የማቀዝቀዣ ጊዜ (ms)። | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | የOAuth አቅራቢው ይህን ያህል ውድቀቶች ሲያጋጥሙት ወደ DEGRADED ይገባል። | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | ለOAuth አቅራቢው ከፍተኛው የresetTimeout ጭማሪ ብዜት። | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | የOAuth አቅራቢው ከዚህ ብዛት የመክፈት ዑደቶች በኋላ የማፈግፈግ ደረጃውን ያሳድጋል። | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ መላው የAPI ቁልፍ አቅራቢ ወደ ማቀዝቀዣ ጊዜ ከመግባቱ በፊት በጊዜ መስኮቱ ውስጥ የሚፈቀዱ ውድቀቶች። | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ API ቁልፍ ለሚጠቀሙ አቅራቢዎች ተንቀሳቃሽ የውድቀት ቆጠራ ጊዜ መስኮት (ms)። | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ API ቁልፍ የሚጠቀመው አቅራቢ ገደብ ከተደረሰ በኋላ የማቀዝቀዣ ጊዜ (ms)። | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API ቁልፍ የሚጠቀመው አቅራቢ ይህን ያህል ውድቀቶች ሲያጋጥሙት ወደ DEGRADED ይገባል። | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API ቁልፍ ለሚጠቀመው አቅራቢ ከፍተኛው የresetTimeout ጭማሪ ብዜት። | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API ቁልፍ የሚጠቀመው አቅራቢ ከዚህ ብዛት የመክፈት ዑደቶች በኋላ የማፈግፈግ ደረጃውን ያሳድጋል። | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ መላው አካባቢያዊ አቅራቢ ወደ ማቀዝቀዣ ጊዜ ከመግባቱ በፊት የሚፈቀዱ ውድቀቶች። | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ ለአካባቢያዊ አቅራቢዎች ተንቀሳቃሽ የውድቀት ቆጠራ ጊዜ መስኮት (ms)። | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | የአቅራቢ ደረጃ ብሬከር፦ የአካባቢያዊ አቅራቢው ገደብ ከተደረሰ በኋላ የማቀዝቀዣ ጊዜ (ms)። | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | የአውድ መሸጎጫ ፒን አቅራቢ ለረጅም ጊዜ ጤናማ እንዳልሆነ የሚቆጠርበትና ፒኑ ለአማራጭ ሽግግር የሚጣልበት የማፈግፈግ ጥልቀት። | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | የአውድ መሸጎጫ ፒን ከመጣሉ በፊት አጭር ጊዜያዊ የማቀዝቀዣ ጊዜዎችን የሚታገስ የመዋዠቅ መከላከያ ጊዜ መስኮት (ms)። | ### ሁኔታዎች -| ሁኔታ | ውቅር | -| --------------------------- | -------------------------------------------------- | -| **ለረጅም ጊዜ የሚካሄድ የኮድ ማመንጨት** | `REQUEST_TIMEOUT_MS=900000` (15 ደቂቃ) | -| **የዥረቱን ጠቅላላ የቆይታ ጊዜ መገደብ** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 ደቂቃ) | -| **ለምርት API ፈጣን ውድቀት** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **የተራዘመ አስተሳሰብ ሞዴሎች** | `STREAM_IDLE_TIMEOUT_MS=300000` (በክፍሎች መካከል 5 ደቂቃ) | +| ሁኔታ | ውቅር | +| ---------------------------- | ------------------------------------------------------ | +| **ለረጅም ጊዜ የሚካሄድ የኮድ ማመንጨት** | `REQUEST_TIMEOUT_MS=900000` (15 ደቂቃ) | +| **የጠቅላላ ዥረት የሕይወት ጊዜን መገደብ** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 ደቂቃ) | +| **ለምርት API ፈጣን ውድቀት** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **የተራዘመ አስተሳሰብ ሞዴሎች** | `STREAM_IDLE_TIMEOUT_MS=300000` (በውሂብ ቁራጮች መካከል 5 ደቂቃ) | --- @@ -1115,98 +1123,100 @@ OmniRoute እነዚያ ሪሌዎች እንዲቀበሏቸው ጥያቄዎችን ## 21. የፕሮክሲ ጤንነት -| ተለዋዋጭ | ነባሪ | ምንጭ ፋይል | መግለጫ | -| ------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | ፈጣን-ውድቀት የጤና ምርመራ የጊዜ ገደብ። | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | በመዘግየት-የተመቻቸ የፑል ስትራቴጂ ውስጥ የእጩ ፕሮክሲዎችን አማካይ መዘግየት ለማስላት የሚያገለግል የጊዜ መስኮት (በሰዓት)። | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | የጤና ምርመራ ውጤት መሸጎጫ TTL። | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | ላልተሳኩ የፕሮክሲ ጤና መመርመሪያዎች የመሸጎጫ TTL። በከፍተኛ ትይዩነት ወቅት የሚከሰቱ ጊዜያዊ የፕሮክሲ የጊዜ ገደብ ማለፎች፣ በእውነት የሞቱ ፕሮክሲዎች ላይ ፈጣን-ውድቀትን ሳያሰናክሉ በፍጥነት እንዲሞከሩ፣ ይህን ከ`PROXY_HEALTH_CACHE_TTL_MS` አጭር ያድርጉት። | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | የተመዘገቡ ፕሮክሲዎችን በየጊዜው የሚመረምረውን የጀርባ የፕሮክሲ ጤና መርሐግብር አስኪያጅ ለማሰናከል `false` ያዘጋጁ። | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | የጀርባ የጤና መርሐግብር አስኪያጅ የቅኝት ክፍተት በms (ዝቅተኛው `60000`)። | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | በመርሐግብር አስኪያጁ እና በ`/api/settings/proxies/auto-test` መጨረሻ ነጥብ የሚጠቀሙበት የተደራሽነት መመርመሪያ ዒላማ። ይፋዊውን ነባሪ ለማስወገድ ወደ ውስጣዊ/በራስ የተስተናገደ URL ያመልክቱት። | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | በእያንዳንዱ ባች በአንድ ጊዜ የሚጀመሩ መመርመሪያዎች፤ በመርሐግብር አስኪያጁ እና በ`/api/settings/proxies/auto-test` መጨረሻ ነጥብ የጋራ ጥቅም ላይ ይውላል። ዝቅተኛው 1 ሲሆን ከፍተኛው 50 ነው። | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | በአንድ ባች ውስጥ በሁለት መመርመሪያ መነሻዎች መካከል ያለ መዘግየት በms። ያለዚህ ሙሉው ባች በአንድ ቅጽበት ይወጣል፣ እና የጋራ የመውጫ IP በተመን-የተገደበ ዒላማን ሊቀሰቅስ ይችላል። ክፍተቱን ለማሰናከል `0` ያዘጋጁ፤ ከፍተኛው 5000 ነው። | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | ለፕሮክሲ የተመደበውን የአቅራቢ እውነተኛ አስተናጋጅ (`GET /models`፣ API ቁልፍ የለም) መመርመር ለማቆም እና በምትኩ ሁልጊዜ `PROXY_HEALTH_TEST_URL` ለመጠቀም `"false"` ያዘጋጁ። | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` ሲሆን (ነባሪ)፣ ራስ-ሰር የተደራሽነት መመርመሪያዎች (መርሐግብር አስኪያጁ + የ`/api/settings/proxies/auto-test` “ሁሉንም ሞክር” አዝራር) **ለንባብ-ብቻ** ናቸው እና የፕሮክሲን ሁኔታ ፈጽሞ አይጽፉም — ገቢር/የቦዘነ ሁኔታን የሚያዘጋጀው ኦፕሬተሩ ብቻ ነው፣ ስለዚህ ያልተረጋጋ መመርመሪያ የተመደበ ፕሮክሲን ከጥቅም ውጭ ሊያደርገው አይችልም (#6246)። የቀድሞውን ሞክሮ-አዘጋጅ ባህሪ ለመመለስ `true` ያዘጋጁ። | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | በምርጫ የሚነቃ የባህሪ ዕልባት ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ይመልከቱ፤ የዳሽቦርድ DB ማሻሻያ ቅድሚያ ያገኛል)። `true` (ወይም `1`፣ `yes`) በዳሽቦርድ ውስጥ ከፕሮክሲ ፑል ሥር ለንባብ-ብቻ የሆነውን የፑል መውጫ ምልከታ ያሳያል (ከፕሮክሲ ምዝግብ ባለፉት 24 ሰዓታት የተወሰዱ የተለያዩ የመውጫ IPዎች፣ ግንኙነቶች እና ከአንድ IP ጀርባ በብዛት የታዩት)። ለማዘዋወር ፈጽሞ ጥቅም ላይ አይውልም። | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | ከተደጋጋሚ ተከታታይ ውድቀቶች በኋላ መርሐግብር አስኪያጁ ፕሮክሲዎችን በራስ-ሰር እንዲያስወግድ `true` ያዘጋጁ። | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | መርሐግብር አስኪያጁ ፕሮክሲን በራስ-ሰር ከማስወገዱ በፊት የሚፈቀዱ ተከታታይ ውድቀቶች (`PROXY_AUTO_REMOVE=true` ሲሆን)። | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | ከተደጋጋሚ ተከታታይ ውድቀቶች በኋላ መርሐግብር አስኪያጁ ፕሮክሲን ከማስወገድ ይልቅ በለስላሳ እንዲያሰናክለው (ሁኔታ `dead`፣ ፈጽሞ አይሰረዝም) `true` ያዘጋጁ። ለ`PROXY_AUTO_REMOVE` አጥፊ ያልሆነ አማራጭ፦ ፕሮክሲው ወዲያውኑ ከፑል/ዙር መፍቻ ይወጣል (በወሰን-ፑል መፍቻ የሚጠቀመው የሕያው-ሁኔታ ማጣሪያ አስቀድሞ ያስወግደዋል)፣ እና መመርመሪያዎችን እንደገና ማለፍ ሲጀምር በራስ-ሰር እንደገና ይነቃል። የ`PROXY_AUTO_REMOVE_AFTER` ገደብን ይጋራል። ሁለቱም ዕልባቶች `true` ከሆኑ፣ `PROXY_AUTO_REMOVE` ቅድሚያ ያገኛል። | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | የፕሮክሲ ተደራሽነት ቅድመ-ምርመራዎች ሲወድቁ፣ OAuth እና የአቅራቢ ማረጋገጫ ፍሰቶች የተሰካውን ፕሮክሲ አልፈው በቀጥታ እንዲገናኙ ይፍቀዱ። ተግባራዊው ቅድሚያ የባህሪ ዕልባቶች DB ማሻሻያ > የአካባቢ ተለዋዋጭ > ነባሪ ነው። | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 ሰከንድ) | `open-sse/services/rateLimitManager.ts` | ጥያቄው ከመውደቁ በፊት በ429 ላይ የሚጠበቀው ከፍተኛው ጊዜ። | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 ደቂቃ) | `open-sse/services/rateLimitManager.ts` | ተቀባይነት ያገኘ ጥያቄ የተመን-ገደብ ማስያዣው ከማብቃቱ በፊት በአፈጻጸም ውስጥ ሊቆይ የሚችልበት ከፍተኛ ጊዜ — በማያድጉ መግቢያ በሮች ላይ ቀርፋፋ የማምጣት-ጅምር የጊዜ ገደብ እንዳያልፍ፣ ከወረፋ-መጠበቂያ በጀት ተለይቷል (#12027)። | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (ተሰናክሏል) | `open-sse/services/rateLimitManager.ts` | የወረፋ መግቢያ ገደብ፦ ይህን ያህል ጥያቄዎች አስቀድመው ወረፋ ከያዙ በኋላ በ429 `queue_full` ውድቅ ያድርጉ። `0` = ያልተገደበ (ነባሪ)። | -| `RATE_LIMIT_AUTO_ENABLE` | _(አልተዘጋጀም)_ | `open-sse/services/rateLimitManager.ts` | የተቀመጠው የዳሽቦርድ ቅንብር ምንም ቢሆን፣ የተመን ገደብ የደህንነት መረብ ራስ-ሰር ማንቃትን በግድ ያብሩ/ያጥፉ። በግድ ለማብራት `true`/`1`/`on`፣ በግድ ለማጥፋት `false`/`0`/`off` ይቀበላል። | -| `PROVIDER_COOLDOWN_ENABLED` | _(አልተዘጋጀም → ጠፍቷል)_ | `open-sse/services/providerCooldownTracker.ts` | በምርጫ የሚነቃ አጠቃላይ የጥያቄዎች-ተሻጋሪ የአቅራቢ/ግንኙነት ዕረፍት ጊዜ ክትትል። በነባሪ ጠፍቷል (ከግንኙነት ዕረፍት ጊዜ/የአቅራቢ የወረዳ ተላላፊ ጋር ይደራረባል)። ለማንቃት `true`/`1`/`on` ይቀበላል። | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | ያልተሳካ አቅራቢ/ግንኙነት እንደገና ከመሞከሩ በፊት ዝቅተኛው የዕረፍት ጊዜ (ms)። በተከታታይ ውድቀቶች ቁጥር መሠረት በኤክስፖነንሻል ይመጠናል። `PROVIDER_COOLDOWN_ENABLED` ሲሆን ብቻ ጥቅም ላይ ይውላል። | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 ደቂቃ) | `open-sse/services/providerCooldownTracker.ts` | ያልተሳካ አቅራቢ/ግንኙነት ምንም ቢሆን እንደገና ከመሞከሩ በፊት ያለው ከፍተኛ የዕረፍት ጊዜ (ms) ገደብ። `PROVIDER_COOLDOWN_ENABLED` ሲሆን ብቻ ጥቅም ላይ ይውላል። | -| `STREAM_RECOVERY_ENABLED` | _(አልተዘጋጀም → ጠፍቷል)_ | `src/lib/resilience/settings.ts` (መነሻ መረጃ) → `open-sse/services/streamRecovery.ts` (ሎጂክ) | **ምንድን ነው፦** የተቆራረጡ የላይኛው-ምንጭ ዥረቶችን ግልጽ በሆነ መንገድ ማገገም (የfree-claude-code ወደብ)። የመክፈቻውን SSE መስኮት እስከ `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) ይይዛል፣ ስለዚህ _ከመፈጸም በፊት_ የሚከሰት መቋረጥ — ማንኛውም ባይት ወደ ደንበኛው ከመድረሱ በፊት የሚከሰት — ዳግም ተከፍቶ ሳይታይ እንደገና ይሞከራል። **መቼ ማንቃት እንዳለብዎ፦** ያልተረጋጉ/በዥረት ጅምር ላይ በተደጋጋሚ 0-ባይት የሚቆርጡ የላይኛው-ምንጮች፤ በእያንዳንዱ ዥረት ላይ እስከ 750 ms የሚደርስ ተጨማሪ እስከ-መጀመሪያ-ቶከን ጊዜ መቀበል ካልቻሉ ጠፍቶ ይቆይ። `true`/`1`/`on` ይቀበላል። የተቀመጠውን የመቋቋም ቅንብር በመነሻ መረጃ ያስጀምራል፤ የዳሽቦርድ ቅንብሩ አንዴ ከተዘጋጀ ቅድሚያ ያገኛል። | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(አልተዘጋጀም → ጠፍቷል)_ | `src/lib/resilience/settings.ts` (መነሻ መረጃ) → `open-sse/services/streamRecovery.ts` (ሎጂክ) | **ምንድን ነው፦** በዥረት-መሃል መቀጠል (ደረጃ 4.4) — _ከመፈጸም በኋላ_ ከሚከሰት መቋረጥ በኋላ (ባይቶች አስቀድመው ደንበኛው ዘንድ ደርሰዋል)፣ ከፊል ጽሑፉን እንደ ረዳት ቅድመ-ሙሌት በመጠቀም ዳግም ይጠይቃል እና የጎደለውን ቅጥያ ይቀጣጥላል። ተራ-ጽሑፍ OpenAI-ተኳሃኝ ዥረቶች ብቻ፤ የመሣሪያ ጥሪ በሂደት ላይ እያለ ፈጽሞ አይነሳም። **መቼ ማንቃት እንዳለብዎ፦** በመልስ መሃል የሚቋረጡ ረጅም ፈጠራዎች፣ እና የተመለሰው የመጨረሻ ክፍል ቶከን-በ-ቶከን ሳይሆን እንደ አንድ ፍንዳታ መድረሱን የሚቀበሉ ከሆነ። ከ`STREAM_RECOVERY_ENABLED` ነጻ ነው (የተለየ የአደጋ መገለጫ)። `true`/`1`/`on` ይቀበላል። | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(አልተዘጋጀም → ጠፍቷል)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | በምርጫ የሚነቃ የገቢር-ዥረት ጠቃሚ-ውጤት ተቆጣጣሪ። ቁራጮችን መላካቸውን የሚቀጥሉ ነገር ግን ከተዋቀረው የረዳት-ውጤት መጠን በታች የሚቆዩ ዥረቶችን ይለያል፤ የልብ ምት ምልክቶች፣ የአጠቃቀም ክስተቶች፣ ባዶ ለውጦች እና የመሣሪያ/የማመዛዘን ደረጃዎች እድገት መስለው አይታዩም። ከስራ-ፈት እና ከጠንካራ-የመጨረሻ ጊዜ ገደቦች የተለየ ነው። | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | የውጤት መጠን ግምገማ ከመጀመሩ በፊት ያለ የእፎይታ ጊዜ፣ በ0–600000 ms መካከል የተገደበ። | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | የሚንከባለል ጠቃሚ-ውጤት መስኮት፣ በ1000–600000 ms መካከል የተገደበ፤ ከማቋረጥ በፊት አንድ ሙሉ መስኮት ያስፈልጋል። | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | ዝቅተኛው የUTF-8 ረዳት-ውጤት የባይት መጠን (ጥንቃቄ የተሞላበት የቶከን ተወካይ)፣ በ1–1000000 መካከል የተገደበ። | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | ሊለካ የሚችል ተብሎ የሚቆጠር ዝቅተኛው ዜሮ ያልሆነ ጠቃሚ-ውጤት ናሙና፣ በ1–1000000 ባይቶች መካከል የተገደበ። | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | በማስጀመሪያ ጊዜ በአቅራቢ ቶከን ጤና ምርመራዎች መካከል ያለ የማዘግያ ክፍተት (ms)። | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | ፍንዳታን ለመከላከል በአቅራቢ ቶከን ጤና ምርመራዎች መካከል በ`HEALTHCHECK_STAGGER_MS` ላይ የሚጨመር ዝቅተኛው የዘፈቀደ መወዛወዝ (ms) (ጉዳይ #1220)። | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | ፍንዳታን ለመከላከል በአቅራቢ ቶከን ጤና ምርመራዎች መካከል በ`HEALTHCHECK_STAGGER_MS` ላይ የሚጨመር ከፍተኛው የዘፈቀደ መወዛወዝ (ms) (ጉዳይ #1220)። | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | ለማስጀመሪያው የቶከን-ጤና ምርመራ ቅኝት የትይዩ-ምርመራ ባች መጠን፤ ትላልቅ እሴቶች ተጨማሪ ግንኙነቶችን በትይዩ ይመረምራሉ፣ ትናንሽ እሴቶች ድንገተኛ ጭነትን ይቀንሳሉ (ጉዳይ #7875፣ የ#7719 ዳግም ውድቀት)። | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ስህተቱን ወደ ደንበኛው ከመመለስ በፊት በሞዴል-ወሰን የዕረፍት ጊዜ ምላሾች ላይ የሚደረጉ ራስ-ሰር ዳግም ሙከራዎች ብዛት። | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | በዕረፍት ጊዜ ዳግም ሙከራዎች መካከል ያለው ከፍተኛ የመመለሻ ክፍተት (ሰከንዶች)። የላይኛው-ምንጭ `Retry-After` ምንም ቢሆን በዚህ እሴት ይገደባል። | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | የHeadroom ቶከን-ቆጣቢ ፕሮክሲ URL። የዳሽቦርድ የሕይወት ዑደት (`api/headroom/*`) በነባሪ በloopback ላይ አካባቢያዊ `headroom-ai` CLI ያስነሳል፤ ወደ ውጫዊ Docker sidecar ፕሮክሲ ለማመልከት ብቻ ይሻሩት። | - -### የዥረት መልሶ ማግኛ ማስተካከያ ቋሚዎች - -የመልሶ ማግኛ የማቆየት ባህሪው በ -`open-sse/config/constants.ts` (`STREAM_RECOVERY`) ውስጥ በቀጥታ በተጻፉ ቋሚዎች ይስተካከላል፤ ለማጣቀሻ እዚህ ተዘርዝረዋል — -እነዚህን ለመቀየር የኮድ ማስተካከያ ያስፈልጋል፤ በአካባቢ ተለዋዋጭ ሊቀየሩ አይችሉም፦ - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — ማንኛውም ባይት ለደንበኛው ከመላኩ በፊት ቀደም ብሎ የሚከሰት መቋረጥ እንደገና እንዲሞከር፣ የመክፈቻው SSE መስኮት ለምን ያህል ጊዜ እንደሚቆይ። -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — በተያዘው መስኮት ላይ ያለው ጥብቅ ከፍተኛ ገደብ፤ የጊዜ ቆጣሪው ምንም ይሁን፣ ይህን ያህል ባይቶች እንደተከማቹ ወዲያውኑ ይላካል +| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | +| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | የፈጣን-ውድቀት ጤንነት ማረጋገጫ የጊዜ ገደብ። | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | በመዘግየት-የተመቻቸ የፑል ስልት ውስጥ የዕጩ ፕሮክሲዎችን አማካይ መዘግየት ለማስላት የሚያገለግል የጊዜ መስኮት (በሰዓታት)። | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | የጤንነት ማረጋገጫ ውጤት መሸጎጫ TTL። | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | ላልተሳኩ የፕሮክሲ ጤንነት መመርመሪያዎች የመሸጎጫ TTL። በከፍተኛ ተመሳሳይ ጊዜ አፈጻጸም ወቅት የሚከሰቱ ጊዜያዊ የፕሮክሲ ጊዜ ማለፎች በፍጥነት እንደገና እንዲሞከሩ፣ በእውነት ለማይሰሩ ፕሮክሲዎች ፈጣን-ውድቀትን ሳያሰናክል፣ ይህን ከ`PROXY_HEALTH_CACHE_TTL_MS` ያጠረ ያድርጉት። | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | የተመዘገቡ ፕሮክሲዎችን በየጊዜው የሚመረምረውን የበስተጀርባ የፕሮክሲ ጤንነት መርሐግብር አስኪያጅ ለማሰናከል `false` ያድርጉ። | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | የበስተጀርባ ጤንነት መርሐግብር አስኪያጅ የፍተሻ ክፍተት በms (ዝቅተኛው `60000`)። | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | በመርሐግብር አስኬጁ እና በ`/api/settings/proxies/auto-test` መዳረሻ ነጥብ የሚጠቀሙበት የተደራሽነት መፈተሻ ዒላማ። ነባሪውን ይፋዊ ዒላማ ለማስቀረት ወደ ውስጣዊ/በራስዎ የሚስተናገድ URL ያመልክቱት። | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | በእያንዳንዱ ባች በአንድ ጊዜ የሚጀመሩ መፈተሻዎች ብዛት፤ ይህም በመርሐግብር አስኬጁ እና በ`/api/settings/proxies/auto-test` መዳረሻ ነጥብ መካከል ይጋራል። ዝቅተኛው 1 ሲሆን ከፍተኛው በ50 የተገደበ ነው። | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | በአንድ ባች ውስጥ በሁለት መፈተሻዎች መነሻ መካከል ያለው መዘግየት በms። ይህ ካልነበረ ሙሉው ባች በአንድ ጊዜ ይላካል፣ እና የጋራ ወጪ IP የጥያቄ ፍጥነት ገደብ ያለበትን ዒላማ ሊያስነሳ ይችላል። ክፍተቱን ለማሰናከል ወደ `0` ያዋቅሩት፤ ከፍተኛው በ5000 የተገደበ ነው። | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | ለፕሮክሲ የተመደበውን አቅራቢ እውነተኛ አስተናጋጅ (`GET /models`፣ ያለ API ቁልፍ) መፈተሽ ለማቆም እና በምትኩ ሁልጊዜ `PROXY_HEALTH_TEST_URL`ን ለመጠቀም "false" ያዋቅሩ። | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` (ነባሪ) ሲሆን፣ ራስ-ሰር የተደራሽነት መፈተሻዎች (መርሐግብር አስኬጁ + የ`/api/settings/proxies/auto-test` "ሁሉንም ፈትሽ" አዝራር) **ለንባብ ብቻ** ናቸው እና የፕሮክሲን ሁኔታ ፈጽሞ አይጽፉም — ገቢር/ኢ-ገቢርነቱን የሚያዘጋጀው ኦፕሬተሩ ብቻ ነው፣ ስለዚህ ያልተረጋጋ መፈተሻ የተመደበን ፕሮክሲ ጥቅም ውጭ ሊያደርገው አይችልም (#6246)። የቀድሞውን ፈትሾ-የማዋቀር ባህሪ ለመመለስ `true` ያዋቅሩ። | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | በፈቃድ የሚነቃ የባህሪ ጠቋሚ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md)ን ይመልከቱ፤ የዳሽቦርድ DB መሻሪያ ቅድሚያ ይኖረዋል)። `true` (ወይም `1`፣ `yes`) በዳሽቦርዱ ውስጥ ከፕሮክሲ ፑል ስር ለንባብ ብቻ የሆነውን የፑሉን ወጪ ትዝብት ያሳያል (ከፕሮክሲ ምዝግብ ላይ በመመሥረት፣ ባለፉት 24 h ውስጥ የተለያዩ ወጪ IPዎች፣ ግንኙነቶች እና ከአንድ IP በስተጀርባ በብዛት የታዩት)። ለማዘዋወር ፈጽሞ ጥቅም ላይ አይውልም። | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | ከተደጋጋሚ ተከታታይ ውድቀቶች በኋላ መርሐግብር አስኬጁ ፕሮክሲዎችን በራስ-ሰር እንዲያስወግድ `true` ያዋቅሩ። | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | መርሐግብር አስኬጁ ፕሮክሲን በራስ-ሰር ከማስወገዱ በፊት የሚያስፈልጉ ተከታታይ ውድቀቶች ብዛት (`PROXY_AUTO_REMOVE=true` ሲሆን)። | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | ተደጋጋሚ ተከታታይ ውድቀቶች ካጋጠሙ በኋላ ፕሮክሲውን ከማስወገድ ይልቅ መርሐግብር አስኬጁ በለስላሳ ሁኔታ እንዲያሰናክለው (ሁኔታው `dead`፣ ፈጽሞ አይሰረዝም) `true` ያድርጉ። ለ`PROXY_AUTO_REMOVE` ውሂብ የማያጠፋ አማራጭ ነው፦ ፕሮክሲው ወዲያውኑ ከፑል/ማዞሪያ መፍቻ ይወጣል (በወሰን-ፑል መፍቻ የሚጠቀመው የነቃ-ሁኔታ ማጣሪያ አስቀድሞ ያገለዋል)፣ እና ፍተሻዎችን እንደገና ማለፍ ሲጀምር በራስ-ሰር እንደገና ይነቃል። የ`PROXY_AUTO_REMOVE_AFTER` ገደብን ይጋራል። ሁለቱም ጠቋሚዎች `true` ከሆኑ፣ `PROXY_AUTO_REMOVE` ቅድሚያ ያገኛል። | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | የፕሮክሲ ተደራሽነት ቅድመ-ምርመራዎች ሳይሳኩ ሲቀሩ፣ OAuth እና የአቅራቢ ማረጋገጫ ፍሰቶች የተወሰነላቸውን ፕሮክሲ አልፈው በቀጥታ እንዲገናኙ ይፍቀዱ። የሚተገበረው ቅድሚያ Feature Flags DB መሻር > env var > ነባሪ ነው። | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 ሰከንድ) | `src/lib/resilience/settings.ts` | ነባሪ **የወረፋ-ጥበቃ** በጀት፦ አንድ ጥያቄ ወደ ላይኛው አገልግሎት ሳይደርስ ከመቀበል በፊት የአቅራቢ ቦታ ለማግኘትና በወረፋ ውስጥ ለመቆየት የሚፈቀድለት ጊዜ። ሥራው መፈጸም እንደጀመረ ጊዜ ቆጣሪው ይሰረዛል — የአፈጻጸም ጊዜው በተናጠል በ`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` ይገደባል። env የሚያዘጋጀው ነባሪውን ብቻ ነው፦ የተቀመጠ `resilienceSettings.requestQueue.maxWaitMs`፣ ከዚያም የየግንኙነቱ `rateLimitOverrides.maxWaitMs`፣ እያንዳንዳቸው ከእሱ ቅድሚያ ያገኛሉ። | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 ደቂቃ) | `open-sse/services/rateLimitManager.ts` | የተፈቀደለት ጥያቄ የፍጥነት-ገደብ ማስያዣው ከማብቃቱ በፊት በአፈጻጸም ውስጥ ሊቆይ የሚችልበት ከፍተኛ ጊዜ — የማይጨምሩ ጌትዌይዎች ላይ ዘገምተኛ የሰርስሮ-ማምጣት መጀመር የጊዜ ገደቡን እንዳያልፍ ከወረፋ-ጥበቃ በጀቱ ተለይቷል (#12027)። | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (ተሰናክሏል) | `open-sse/services/rateLimitManager.ts` | የወረፋ መግቢያ ገደብ፦ ይህን ያህል ጥያቄዎች አስቀድመው በወረፋ ከተያዙ፣ በ429 `queue_full` ውድቅ ያድርጉ። `0` = ገደብ የለሽ (ነባሪ)። | +| `RATE_LIMIT_AUTO_ENABLE` | _(አልተዘጋጀም)_ | `open-sse/services/rateLimitManager.ts` | የተቀመጠው የDashboard ቅንብር ምንም ቢሆን፣ የፍጥነት ገደብ ራስ-ሰር ማንቃት የደህንነት መረብን በግድ ያብሩ/ያጥፉ። በግድ ለማብራት `true`/`1`/`on`ን፣ በግድ ለማጥፋት `false`/`0`/`off`ን ይቀበላል። | +| `PROVIDER_COOLDOWN_ENABLED` | _(አልተዘጋጀም → ጠፍቷል)_ | `open-sse/services/providerCooldownTracker.ts` | በጥያቄዎች መካከል የሚሠራ ዓለም-አቀፍ የአቅራቢ/ግንኙነት ማቀዝቀዣ ክትትል። በነባሪ ጠፍቷል (ከConnection Cooldown / Provider Circuit Breaker ጋር ይደራረባል)። ለማንቃት `true`/`1`/`on`ን ይቀበላል። | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | ያልተሳካ አቅራቢ/ግንኙነት እንደገና ከመሞከሩ በፊት ዝቅተኛው የማቀዝቀዣ ጊዜ (ms)። በተከታታይ ውድቀቶች መጠን በኤክስፖነንሻል ይጨምራል። `PROVIDER_COOLDOWN_ENABLED` ሲነቃ ብቻ ጥቅም ላይ ይውላል። | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 ደቂቃ) | `open-sse/services/providerCooldownTracker.ts` | ያልተሳካ አቅራቢ/ግንኙነት ምንም ይሁን ምን እንደገና ከመሞከሩ በፊት የሚጠበቀው ከፍተኛው የማቀዝቀዣ ጊዜ (ms) ገደብ። `PROVIDER_COOLDOWN_ENABLED` ሲሆን ብቻ ጥቅም ላይ ይውላል። | +| `STREAM_RECOVERY_ENABLED` | _(አልተዋቀረም → ጠፍቷል)_ | `src/lib/resilience/settings.ts` (መነሻ እሴት) → `open-sse/services/streamRecovery.ts` (አመክንዮ) | **ምንድን ነው:** የተቋረጡ የላይኛው ምንጭ ዥረቶችን በግልጽነት ማገገም (free-claude-code ፖርት)። አንድም ባይት ወደ ደንበኛው ከመድረሱ በፊት የሚከሰት _ቅድመ-ማረጋገጫ_ መቋረጥ ሳይታይ እንደገና ተከፍቶ እንዲሞከር፣ የመክፈቻውን SSE መስኮት እስከ `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) ድረስ ይይዛል። **መቼ ማንቃት እንዳለብዎት:** በዥረት መጀመሪያ ላይ ብዙ ጊዜ በ0-ባይት የሚቋረጡ ያልተረጋጉ/የላይኛው ምንጮች ሲኖሩ፤ በእያንዳንዱ ዥረት ላይ ወደ መጀመሪያው ቶከን የሚወስደው ጊዜ እስከ 750 ms እንዲጨምር መፍቀድ ካልቻሉ እንደጠፋ ይተዉት። `true`/`1`/`on` ይቀበላል። የሚቀመጠውን Resilience ቅንብር የመነሻ እሴት ይወስናል፤ አንዴ ከተዋቀረ የDashboard ቅንብር ቅድሚያ ያገኛል። | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(አልተዋቀረም → ጠፍቷል)_ | `src/lib/resilience/settings.ts` (መነሻ እሴት) → `open-sse/services/streamRecovery.ts` (አመክንዮ) | **ምንድን ነው:** በዥረት መካከል መቀጠል (ደረጃ 4.4) — ከ_ድህረ-ማረጋገጫ_ መቋረጥ በኋላ (ባይቶች አስቀድመው ደንበኛው ጋር ደርሰዋል)፣ ከፊል ጽሑፉን እንደ ረዳት ቅድመ-ሙላት በመጠቀም እንደገና ይጠይቃል እና የጎደለውን ቅጥያ ያገናኛል። ለግልጽ-ጽሑፍ OpenAI-ተኳሃኝ ዥረቶች ብቻ ነው፤ የመሣሪያ ጥሪ በሂደት ላይ እያለ ፈጽሞ አይነሳም። **መቼ ማንቃት እንዳለብዎት:** በመልስ መካከል የሚቋረጡ ረጅም የይዘት ማመንጫዎች ሲኖሩ እና የተመለሰው ጭራ ቶከን-በ-ቶከን ከመምጣት ይልቅ በአንድ ጊዜ እንዲደርስ የሚቀበሉ ከሆነ። ከ`STREAM_RECOVERY_ENABLED` ነፃ ነው (የተለየ የአደጋ መገለጫ)። `true`/`1`/`on` ይቀበላል። | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(አልተዋቀረም → ጠፍቷል)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | በፈቃድ የሚነቃ የንቁ-ዥረት ጠቃሚ-ውጤት ተቆጣጣሪ። ቁርጥራጮችን መላክ የሚቀጥሉ ነገር ግን ከተዋቀረው የረዳት-ውጤት ፍጥነት በታች የሚቆዩ ዥረቶችን ይለያል፤ የልብ ምት ምልክቶች፣ የአጠቃቀም ክስተቶች፣ ባዶ ልዩነቶች እና የመሣሪያ/የማመዛዘን ደረጃዎች እድገት እንደሆኑ አያስመስሉም። ከስራ-ፈት እና ከጥብቅ-የጊዜ-ገደብ ማብቂያዎች የተለየ ነው። | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | የውጤት ፍጥነት ግምገማ ከመጀመሩ በፊት ያለ የእፎይታ ጊዜ፤ በ0–600000 ms የተገደበ። | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | ተንከባላይ ጠቃሚ-ውጤት መስኮት፣ በ1000–600000 ms የተገደበ፤ ከማቋረጥ በፊት አንድ ሙሉ መስኮት ያስፈልጋል። | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | ዝቅተኛው የUTF-8 ረዳት-ውጤት ባይት ፍጥነት (ጥንቃቄ የተሞላበት የቶከን ተኪ)፣ በ1–1000000 የተገደበ። | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | ሊለካ የሚችል ተብሎ የሚታሰብ ዝቅተኛው ዜሮ ያልሆነ ጠቃሚ-ውጤት ናሙና፣ በ1–1000000 ባይት የተገደበ። | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | በማስጀመሪያ ጊዜ በአቅራቢ ቶከን የጤና ፍተሻዎች መካከል ያለ የማፈናጠጫ ክፍተት (ms)። | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | ፈጣን ተከታታይ ጥያቄዎችን ለመከላከል በአቅራቢ ቶከን የጤና ፍተሻዎች መካከል በ`HEALTHCHECK_STAGGER_MS` ላይ የሚጨመረው ዝቅተኛው የዘፈቀደ የጊዜ ልዩነት (ms) (Issue #1220)። | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | ፈጣን ተከታታይ ጥያቄዎችን ለመከላከል በአቅራቢ ቶከን የጤና ፍተሻዎች መካከል በ`HEALTHCHECK_STAGGER_MS` ላይ የሚጨመረው ከፍተኛው የዘፈቀደ የጊዜ ልዩነት (ms) (Issue #1220)። | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | በመነሻ ጊዜ ለሚከናወነው የቶከን ጤና-ምርመራ ቅኝት በአንድ ጊዜ የሚፈተሸው የባች መጠን፤ ትላልቅ እሴቶች ተጨማሪ ግንኙነቶችን በትይዩ ይፈትሻሉ፣ አነስተኛ እሴቶች ደግሞ ድንገተኛ ጭነትን ይቀንሳሉ (ጉዳይ #7875፣ የ#7719 ሪግሬሽን)። | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ስህተትን ወደ ደንበኛው ከመመለስ በፊት፣ በሞዴል-የተወሰኑ የማቀዝቀዣ ምላሾች ላይ የሚደረጉ ራስ-ሰር ዳግም ሙከራዎች ብዛት። | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | በማቀዝቀዣ ዳግም ሙከራዎች መካከል ያለው ከፍተኛው የመጠበቂያ ጊዜ ልዩነት (በሰከንዶች)። ከላይኛው አገልግሎት የሚመጣው `Retry-After` ምንም ይሁን ምን፣ በዚህ እሴት ይገደባል። | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | የHeadroom ቶከን-ቆጣቢ ፕሮክሲ URL። የዳሽቦርዱ የሕይወት ዑደት (`api/headroom/*`) በነባሪነት አካባቢያዊ `headroom-ai` CLIን በloopback ላይ ያስነሳል፤ ወደ ውጫዊ Docker sidecar ፕሮክሲ ለማመልከት ብቻ ይሻሩት። | + +### የዥረት-መልሶ ማግኛ ማስተካከያ ቋሚዎች + +የመልሶ ማግኛ የማቆያ ባህሪው በ +`open-sse/config/constants.ts` (`STREAM_RECOVERY`) ውስጥ በቋሚነት በተጻፉ ቋሚዎች ይስተካከላል፤ እነዚህም ለማጣቀሻ እዚህ ታይተዋል — +እነሱን መቀየር የኮድ አርትዖት ይፈልጋል፣ የenv var ለውጥ አይደለም፦ + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — ማንኛውም ባይት ለደንበኛው ከመላኩ በፊት ቀደምት መቆረጥን ዳግም መሞከር እንዲቻል፣ የመክፈቻው SSE መስኮት የሚቆይበት ጊዜ። +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — በተያዘው መስኮት ላይ ያለ ጥብቅ ከፍተኛ ገደብ፤ የሰዓት ቆጣሪው ምንም ይሁን ምን፣ ይህን ያህል ባይቶች እንደተከማቹ ወዲያውኑ ይላኩ (flush + passthrough)። -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — የማቆያው ይዘት ገና ካልተላከ፣ የላይኛው ምንጭ ዥረት በግልጽነት እንደገና ሊከፈት የሚችልበት ከፍተኛው ብዛት። +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — ማቆያው ገና ሳይላክ በላይኛው + ዥረት ላይ በግልጽነት የሚደረጉ ከፍተኛው የዳግም መክፈት ብዛት። -> **ለእያንዳንዱ አቅራቢ የሚሰራ ተንሸራታች-መስኮት የፍጥነት ገደብ (የአካባቢ ተለዋዋጭ የለውም)፦** ከFCC የተወሰደው -> ለእያንዳንዱ አቅራቢ የሚሰራ የተንሸራታች-መስኮት ፍጥነት ገደብ _fallback_ በኮዱ ውስጥ ይገኛል +> **በአቅራቢ-የተወሰነ ተንሸራታች-መስኮት የፍጥነት ገደብ (env var የለውም)፦** ከFCC የተላለፈው +> በአቅራቢ-የተወሰነ ተንሸራታች-መስኮት የፍጥነት ገደብ _መጠባበቂያ_ በኮዱ ውስጥ አለ > (`open-sse/services/providerDefaultRateLimit.ts`፣ በ -> `open-sse/services/rateLimitManager.ts` በኩል የተገናኘ)፣ ነገር ግን በ**ባዶ ነባሪ map** -> የሚቀርብ ሲሆን በአሁኑ ጊዜ **ለኦፕሬተር የተዘጋጀ የአካባቢ ተለዋዋጭ የለውም** — የሚነቃው በሙከራ hook / -> የኮድ ማስተካከያ ብቻ ነው። ሆን ተብሎ ከላይ ባለው ሰንጠረዥ ውስጥ አልተካተተም። የማስተካከያ መቆጣጠሪያ _ያለው_ የእያንዳንዱ-`(token, IP)` -> relay ገዳቢ `RELAY_IP_PER_MINUTE` ነው (§3 አውታረ መረብ እና ፖርቶች)። +> `open-sse/services/rateLimitManager.ts` በኩል የተገናኘ)፣ ነገር ግን ከ**ባዶ ነባሪ map** ጋር ይሰራጫል +> እና በአሁኑ ጊዜ **የኦፕሬተር env var የለውም** — የሚነቃው በሙከራ hook / +> የኮድ አርትዖት ብቻ ነው። ሆን ተብሎ ከላይ ባለው ሠንጠረዥ ውስጥ አልተዘረዘረም። መቆጣጠሪያ ያለው በ-`(token, IP)` +> የሪሌይ ገዳቢው ግን `RELAY_IP_PER_MINUTE` ነው (§3 አውታረ መረብ እና ወደቦች)። --- ## 22. ማረም > [!CAUTION] -> እነዚህ ተለዋዋጮች **ዝርዝር ውጤት** ያመነጫሉ፣ እንዲሁም ሚስጥራዊ ውሂብን ሊያጋልጡ ይችላሉ። **በምርት አካባቢ በፍጹም አያንቁ።** - -| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | -| ------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(አልተዋቀረም)_ | `open-sse/executors/cursor.ts` | ዝርዝር የCursor executor ምዝግቦችን (የተፈቱ SSE ቁርጥራጮች፣ ወዘተ) ለማንቃት `1` ያዋቅሩ። | -| `CURSOR_STREAM_DEBUG` | _(አልተዋቀረም)_ | `open-sse/executors/cursor.ts` | ከቀድሞ ስሪቶች ጋር ተኳሃኝ የሆነ የ`CURSOR_DEBUG` ተለዋጭ ስም። | -| `CURSOR_DUMP_FILE` | _(አልተዋቀረም)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG=1` ሲሆን ጥሬ የተፈቱ Cursor ቁርጥራጮችን የሚቀበል አማራጭ የፋይል ዱካ። | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | ለCursor executor የዥረት እንቅስቃሴ-አልባ የጊዜ ገደብ (ms)። | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | ባይቶች በbuffer ውስጥ ሲቀሩ፣ ከcomposer kv_after_text ለስላሳ ማቋረጫ በኋላ የሚሰጥ የችሮታ ጊዜ (ms) — በመጨረሻ የሚመጣ exec_mcp የመሣሪያ ጥሪ ፍሬሙን እንዲያጠናቅቅ ጊዜ ይሰጣል። | -| `CURSOR_TOOL_DIRECTIVE` | ነቅቷል (`!== "0"`) | `open-sse/executors/cursor.ts` | composer-2.5 የመሣሪያ ጥሪዎችን በአስተማማኝ ሁኔታ እንዲያወጣ የሚያደርግ የመሣሪያ-ማጽደቂያ መመሪያ። ለማሰናከል `0` ያዋቅሩ። | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(አልተዋቀረም)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | ከትርጉም በኋላ ወደsystem መልዕክቱ የሚያያዝ በአስተዳዳሪ የተገለጸ የsystem prompt ጽሑፍ (ከትርጉም በኋላ የሚደረግ ማስገባት)፤ ይህም ወደcodex/Responses እና `/v1/messages` ዱካዎች ይደርሳል። ከተመለሱ የsystem መግቢያ ብሎኮች ላይ የሚወገደው የመመሪያ ቅድመ ቅጥያም በመሆን ያገለግላል። ለማሰናከል ሳይዋቀር ይተዉት። | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | ለሩቅ `image_url` የእይታ ግብዓት፣ በእያንዳንዱ ምስል የማምጫ ጊዜ ገደብ (ms)። | -| `CURSOR_STATE_DB_PATH` | _(ይፈለጋል)_ | `open-sse/utils/cursorVersionDetector.ts` | ለIDE ስሪት ማወቂያ የሚያገለግለውን የCursor IDE state DB ፍለጋ ይተኩ። | -| `CURSOR_AGENT_CLI_VERSION` | _(ማወቂያ / ቋሚ ማድረጊያ)_ | `open-sse/utils/cursorAgentCliVersion.ts` | በAgent Run ላይ ለ`x-cursor-client-version: cli-…` የAgent CLI build id (`YYYY.MM.DD-`)። | -| `CURSOR_AGENT_BIN` | _(አልተዋቀረም)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለምስል ማመንጨት የሚያገለግለው የCursor Agent binary ዱካ። ካልተዋቀረ፣ handler መጀመሪያ `providerSpecificData.agentBin`ን፣ ከዚያ PATHን ይጠቀማል። | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለCursor Agent የምስል ሥራዎች፣ በእያንዳንዱ ምስል የሰዓት ጊዜ ገደብ (ms)። | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለCursor የምስል ሥራዎች የጋራ ፈቃድ ተመሳሳይ-ጊዜ ሥራ መቆጣጠሪያ። | -| `CURSOR_IMG_MODEL` | ጥያቄ / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለምስል ሥራዎች የCursor CLI `--model`ን ይተኩ። | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | የUC (uncensored.com) ምስል-ማመንጨት ውጤት መጠይቅ ድግግሞሽ (ms)። | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | የUC ምስል-ማመንጨት ውጤት መጠይቅ የሰዓት ጊዜ ገደብ (ms)። | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | የUC (uncensored.com) ቪዲዮ-ማመንጨት ውጤት መጠይቅ ድግግሞሽ (ms)። | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | የUC ቪዲዮ-ማመንጨት ውጤት መጠይቅ የሰዓት ጊዜ ገደብ (ms)። | -| `CURSOR_DATA_DIR` | _(ይፈለጋል)_ | `open-sse/utils/cursorAgentCliVersion.ts` | የCursor Agent CLI ውሂብ ማውጫን (`…/versions/`) ይተኩ፤ ይህ ይፋዊው agent የሚጠቀምበት ተመሳሳይ ተለዋዋጭ ነው። | -| `CURSOR_TOKEN` | _(አልተዋቀረም)_ | `scripts/ad-hoc/cursor-tap.cjs` | በገንቢ መሣሪያዎች የሚጠቀሙበት ቀጥተኛ የCursor bearer token። | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | ተሰናክሏል (በ`"1"` በመምረጥ ይነቃል) | `src/app/api/v1/chat/completions/route.ts` | `"1"` ሲዋቀር ለትላልቅ የውይይት payloads የcontent-type/length ምልክቶችን ይመዝግቡ። የምዝግብ ጫጫታን ለመቀነስ በነባሪነት ጠፍቷል። | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(አልተዋቀረም)_ | `open-sse/handlers/responseTranslator.ts` | የResponses API SSE→JSON ትርጉም ዝርዝሮችን ለመመዝገብ `true` ያዋቅሩ። | -| `DEBUG_CLAUDE_NONSTREAM` | _(አልተዋቀረም)_ | `open-sse/handlers/responseTranslator.ts` | በClaude ምላሽ ትርጉም ዱካ ውስጥ ባዶ textContent ቁርጥራጮችን እንዲታዩ ለማድረግ `true` ያዋቅሩ (ለማረሚያ ብቻ)። | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(አልተዋቀረም)_ | የE2E የሙከራ ማዕቀፍ | የE2E ሙከራ ሁኔታን (የላላ ማረጋገጫ፣ የሙከራ hooks) ለማንቃት `true` ያዋቅሩ። | +> እነዚህ ተለዋዋጮች **ዝርዝር ውጤት** ያመነጫሉ፣ እንዲሁም ሚስጥራዊ ውሂብን ሊያጋልጡ ይችላሉ። **በምርት አካባቢ ፈጽሞ አያንቁ።** + +| ተለዋዋጭ | ነባሪ | የምንጭ ፋይል | መግለጫ | +| ------------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CURSOR_DEBUG` | _(አልተዋቀረም)_ | `open-sse/executors/cursor.ts` | ዝርዝር የCursor አስፈጻሚ ምዝግቦችን (ዲኮድ የተደረጉ SSE ቁርጥራጮችን ወዘተ) ለማንቃት `1` ያዘጋጁ። | +| `CURSOR_STREAM_DEBUG` | _(አልተዋቀረም)_ | `open-sse/executors/cursor.ts` | ወደኋላ ተኳሃኝ የሆነ የ`CURSOR_DEBUG` ቅጽል ስም። | +| `CURSOR_DUMP_FILE` | _(አልተዋቀረም)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG=1` ሲሆን ጥሬ ዲኮድ የተደረጉ የCursor ቁርጥራጮችን የሚቀበል አማራጭ የፋይል ዱካ። | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | ለCursor አስፈጻሚው የዥረት ስራ-ፈት ጊዜ ገደብ (ms)። | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | ባይቶች በቋቱ ውስጥ ሲቀሩ ከcomposer kv_after_text ለስላሳ ማብቂያ በኋላ ያለው የጸጋ ጊዜ (ms) — ተከትሎ ለሚመጣው exec_mcp የመሣሪያ ጥሪ ፍሬሙን ለማጠናቀቅ ጊዜ ይሰጣል። | +| `CURSOR_TOOL_DIRECTIVE` | ነቅቷል (`!== "0"`) | `open-sse/executors/cursor.ts` | composer-2.5 የመሣሪያ ጥሪዎችን በአስተማማኝ ሁኔታ እንዲያወጣ የሚያደርግ የመሣሪያ ማረጋገጫ መመሪያ። ለማሰናከል `0` ያዘጋጁ። | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(አልተዋቀረም)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | ከትርጉም በኋላ ወደስርዓት መልዕክቱ የሚጨመር በኦፕሬተሩ የተገለጸ የስርዓት ጥያቄ ጽሑፍ (ከትርጉም በኋላ ማስገባት)፤ codex/Responses እና `/v1/messages` ዱካዎችን ይደርሳል። እንዲሁም በድጋሚ ከተላኩ የስርዓት መግቢያ ብሎኮች የሚወገደው የመመሪያ ቅድመ ቅጥያ ሆኖ ያገለግላል። ለማሰናከል ሳይዋቀር ይተዉት። | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (ጠፍቷል) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | በድጋሚ የተላኩ የስርዓት-ጥያቄ መግቢያ ብሎኮችን ከopenai→claude ዥረት መጀመሪያ ለማስወገድ `1` ያዘጋጁ። በነባሪ ጠፍቷል — ግምታዊ ደንቦቹ በእንግሊዝኛ ስድ ጽሑፍ ቅርጽ የተሰሩ ሲሆን የምላሹን ይዘት ይቀይራሉ፤ ስለዚህ በትክክል እንዲህ ባለ ክፍል የሚጀምር ምላሽ ያንን ክፍል ያጣል። | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | ለርቀት `image_url` የምስል ግብዓት የእያንዳንዱ ምስል ማምጣት ጊዜ ገደብ (ms)። | +| `CURSOR_STATE_DB_PATH` | _(ተፈልጎ ይገኛል)_ | `open-sse/utils/cursorVersionDetector.ts` | የIDE ስሪትን ለማወቅ የሚጠቅመውን የCursor IDE ሁኔታ DB ፍለጋ ይተኩ። | +| `CURSOR_AGENT_CLI_VERSION` | _(ለይ / አ固定)_ | `open-sse/utils/cursorAgentCliVersion.ts` | በAgent Run ላይ ለ`x-cursor-client-version: cli-…` የAgent CLI ግንባታ መለያ (`YYYY.MM.DD-`)። | +| `CURSOR_AGENT_BIN` | _(አልተዋቀረም)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ምስል ለማመንጨት የሚያገለግለው የCursor Agent ባይነሪ ዱካ። ካልተዋቀረ ተቆጣጣሪው `providerSpecificData.agentBin`ን ከዚያም PATHን ይጠቀማል። | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለCursor Agent የምስል ስራዎች የእያንዳንዱ ምስል አጠቃላይ ጊዜ ገደብ (ms)። | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለCursor የምስል ስራዎች የጋራ መቀመጫ ተመሳሳይ ጊዜ ማስኬጃ በር። | +| `CURSOR_IMG_MODEL` | ጥያቄ / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ለምስል ስራዎች የCursor CLI `--model`ን ይተኩ። | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | የUC (uncensored.com) ምስል-ማመንጨት ውጤት ምርመራ ድግግሞሽ (ms)። | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | የUC ምስል-ማመንጨት ውጤት ምርመራ አጠቃላይ ጊዜ ገደብ (ms)። | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | የUC (uncensored.com) ቪዲዮ-ማመንጨት ውጤት ምርመራ ድግግሞሽ (ms)። | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | የUC ቪዲዮ-ማመንጨት ውጤት ምርመራ አጠቃላይ ጊዜ ገደብ (ms)። | +| `CURSOR_DATA_DIR` | _(ተፈልጎ ይገኛል)_ | `open-sse/utils/cursorAgentCliVersion.ts` | የCursor Agent CLI ውሂብ ማውጫን (`…/versions/`) ይተኩ፤ ይህ ይፋዊው ወኪል የሚጠቀመው ተመሳሳይ ተለዋዋጭ ነው። | +| `CURSOR_TOKEN` | _(አልተዋቀረም)_ | `scripts/ad-hoc/cursor-tap.cjs` | በገንቢ መሣሪያዎች የሚጠቀም ቀጥተኛ የCursor bearer ቶከን። | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | ተሰናክሏል (በ`"1"` በፈቃድ ይነቃል) | `src/app/api/v1/chat/completions/route.ts` | `"1"` ሲዘጋጅ ለትላልቅ የውይይት ይዘቶች የይዘት-አይነት/ርዝመት ምልክቶችን ይመዝግቡ። የምዝግብ ጫጫታን ለመቀነስ በነባሪ ጠፍቷል። | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(አልተዋቀረም)_ | `open-sse/handlers/responseTranslator.ts` | የResponses API SSE→JSON ትርጉም ዝርዝሮችን ለመመዝገብ `true` ያዘጋጁ። | +| `DEBUG_CLAUDE_NONSTREAM` | _(አልተዋቀረም)_ | `open-sse/handlers/responseTranslator.ts` | በClaude ምላሽ ትርጉም ዱካ ውስጥ ባዶ textContent ቁርጥራጮችን ለማሳየት `true` ያዘጋጁ (ለማረም ብቻ)። | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(አልተዋቀረም)_ | የE2E ሙከራ ማስኬጃ | የE2E ሙከራ ሁነታን (የተለሳለሰ ማረጋገጫ፣ የሙከራ ማያያዣዎች) ለማንቃት `true` ያዘጋጁ። | --- @@ -1224,7 +1234,7 @@ OmniRoute እነዚያ ሪሌዎች እንዲቀበሏቸው ጥያቄዎችን ## የማሰማራት ሁኔታዎች -ለrelay backend SRE መመሪያ (የts/bifrost/auto ባህሪ፣ የ9router እና CLIProxyAPI አቀማመጥ፣ እንዲሁም ከፍተኛ የውሂብ ፍሰት የመጠባበቂያ ስልት)፣ [የRelay Backend ስልት](/docs/reference/RELAY_BACKEND_STRATEGY.md)ን ይመልከቱ። +ለrelay backend SRE መመሪያ (የts/bifrost/auto ባህሪ፣ የ9router እና CLIProxyAPI አቀማመጥ፣ እንዲሁም የከፍተኛ ውጤት መጠን አማራጭ ስትራቴጂ)፣ [የRelay Backend ስትራቴጂ](/docs/reference/RELAY_BACKEND_STRATEGY.md)ን ይመልከቱ። ### አነስተኛ የአካባቢ ልማት @@ -1236,7 +1246,7 @@ PORT=20128 NODE_ENV=development ``` -### የDocker ምርት አካባቢ +### የDocker ፕሮዳክሽን ```bash JWT_SECRET= @@ -1266,7 +1276,7 @@ OMNIROUTE_DISABLE_BACKGROUND_SERVICES=true APP_LOG_TO_FILE=false ``` -### Reverse Proxy ያለው VPS (nginx + Cloudflare) +### የReverse Proxy ያለው VPS (nginx + Cloudflare) ```bash JWT_SECRET= diff --git a/docs/i18n/am/docs/reference/FEATURE_FLAGS.md b/docs/i18n/am/docs/reference/FEATURE_FLAGS.md index ae3e85df336e..5d28ff70684f 100644 --- a/docs/i18n/am/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/am/docs/reference/FEATURE_FLAGS.md @@ -42,156 +42,158 @@ --- -## የጠቋሚዎች ማውጫ +## የፍላግ ካታሎግ -በ6 ምድቦች ውስጥ 72 ጠቋሚዎች። **ነባሪ** ማለት የትርጉሙ ነባሪ ነው — የDB ተተኪ እሴትም ሆነ -የአካባቢ ተለዋዋጭ በሌለበት ጊዜ ጥቅም ላይ የሚውለው እሴት። +በ6 ምድቦች የተከፋፈሉ 74 ፍላጎች። **ነባሪ** ማለት የትርጉም ነባሪው ነው — የDB መተካትም ሆነ የአካባቢ ተለዋዋጭ በማይኖርበት ጊዜ +ጥቅም ላይ የሚውለው እሴት። ### ደህንነት (10) -| ቁልፍ | ዓይነት | ነባሪ | መግለጫ | -| --------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | ለሁሉም ገቢ ጥያቄዎች API ቁልፍ እንዲኖር አስገዳጅ ያድርጉ። | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | ለሁሉም ጥያቄዎች የግቤት ማጽዳትን ያንቁ። | -| `INJECTION_GUARD_MODE` | enum | `off` | የፕሮምፕት መርፌ ጥቃት መከላከያ ሁነታ። እሴቶች፦ `off`፣ `warn`፣ `block`፣ `redact`። | -| `PII_REDACTION_ENABLED` | boolean | `false` | PIIን ከጥያቄዎች ያጥፉ (`INPUT_SANITIZER_MODE` ላይ ያልተመሠረተ)። | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | PIIን ከአቅራቢ ምላሾች ያጽዱ። | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | ለPII ምላሽ ማጽዳት የሚውል ሁነታ። እሴቶች፦ `redact`፣ `warn`፣ `block`፣ `off`። | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | ወደ የግል/ውስጣዊ IP ክልሎች የሚደረጉ ወጪ ጥያቄዎችን ያግዱ። | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | የተረጋገጡ የዳሽቦርድ ተጠቃሚዎች የተሸፈኑ እሴቶችን ብቻ ከማየት ይልቅ የተከማቹ API ቁልፎችን እንዲያሳዩ ይፍቀዱ። | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | በAUTH ምዝግብ መስመሮች ውስጥ የመለያ ቅድመ ቅጥያውን ያካትቱ (ለምሳሌ፦ " መለያ ጥቅም ላይ እየዋለ ነው፦ abc12345...")። የመለያ መለያዎች ከጋራ/ባለብዙ ተከራይ የሂደት ምዝግቦች እንዲደበቁ በነባሪ ተሰናክሏል። ከDebug Mode ነጻ ነው፤ Debug Modeን መቀየር ይህን አያሳይም። | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | OIDC ሲነቃ፣ ተጠቃሚዎች በOIDC Single Sign-On በኩል ብቻ ማረጋገጥ እንዲችሉ በይለፍ ቃል መግባትን ያሰናክሉ። ሲሰናከል (ነባሪው)፣ በይለፍ ቃል መግባትም ሆነ OIDC ይገኛሉ። | - -### አውታረ መረብ (15) - -| ቁልፍ | ዓይነት | ነባሪ | ዳግም ማስጀመር | መግለጫ | -| ----------------------------------------------- | ------- | ------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | የTLS fingerprint ስውር ሁነታን ያንቁ። | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | የ/v1/audio/* መስመሮች localhost ውጭ የሚስተናገዱ OpenAI-ተኳኋኝ provider nodes እንዲጠቀሙ ይፍቀዱ። በነባሪ ጠፍቷል — audioን ወደ remote host ማዞር የወጪ ትራፊክ ማንነትን ይቀይራል፣ ስለዚህ ግልጽ የoperator ውሳኔ መሆን አለበት። Loopback nodes ሁልጊዜ የተፈቀዱ ሲሆኑ በዚህ አይነኩም። | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | ለአንድ connection proxy ካልተመደበለት፣ ከregistryው ውስጥ የመጀመሪያውን የሚሠራ proxy በራስ-ሰር ይምረጡ። በነባሪ ጠፍቷል (ካልሆነ ማንኛውም የregistry proxy ዓለም አቀፍ fallback ይሆናል — #3332)። | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | የproxy ተደራሽነት ቅድመ-ምርመራዎች ሳይሳኩ ሲቀሩ፣ OAuth እና provider validation flows የተወሰነላቸውን proxy አልፈው በቀጥታ እንዲገናኙ ይፍቀዱ። ይህ የወጪ ትራፊክ IPን ሊቀይር ስለሚችል በነባሪ ጠፍቷል። | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | በmulti-account rotation executor ላይ የnetwork exception (timeout፣ connection refused/reset) ሲከሰት፣ ያልተሳካው account የራሱ dedicated proxy ከሌለው፣ እያንዳንዱን እንደገና ከመሞከር ይልቅ አጭር cooldown ይተግብሩ እና ለቀሪው request proxy የሌላቸውን ሌሎች accounts ይዝለሉ። በነባሪ በርቷል (ደህንነቱ የተጠበቀ፦ የወጪ ትራፊክ IP አይቀየርም፤ በshared-egress accounts ላይ የlatency/cooldown አደጋን ብቻ ይቀንሳል)። የመጀመሪያው proxy የሌለው throw ሲከሰት ፈጣን propagationን ለመመለስ ያሰናክሉ። | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proxy pools እና የopencode per-account rotation አሁን ያልተሳካ proxyን (ያልተሳካ TCP probe፣ ወይም በእሱ በኩል የተቀበለው 429)፣ በእያንዳንዱ ተደጋጋሚ ሙከራ እስከ ከፍተኛ ገደብ ድረስ በእጥፍ ለሚጨምር የper-process ጊዜ እንደገና ማቅረብ ያቆማሉ። ምንም የproxy status አይጻፍም፤ እያንዳንዱ candidate ወደ ጎን ሲቀመጥ ምርጫው ሳይቀየር ይቆያል። በነባሪ ጠፍቷል። | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | በdashboard ውስጥ ከproxy pool ስር፣ ባለፉት 24 h ምን ያህል የታዩ የወጪ ትራፊክ IPs አባላቱን እንዳገለገሉ እና ምን ያህል connections እንደተጠቀሙባቸው ያሳዩ። ለንባብ ብቻ ነው፣ ከproxy log ይሰላል፣ ፈጽሞ ለrouting አይጠቀምም። በነባሪ ጠፍቷል። | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | ለOpenCode executor፣ የstreamed Responses reply የመጀመሪያውን body byte ይከታተሉ (መስኮት፦ `RESPONSES_FIRST_BYTE_TIMEOUT_MS`፣ ነባሪ `15000`)። መስኮቱ ካለፈ በኋላም ዝም ያለ 2xx Responses stream stalled ተደርጎ ይወሰዳል፦ accountው cooldown ይደረጋል እና requestው አንድ ጊዜ ወደ ቀጣዩ account ይዞራል፤ ሁለተኛ stall በፍጥነት ያስከሽፋል። በነባሪ ጠፍቷል፦ stalled streams እስከ stream readiness timeout ድረስ ያለውን የዛሬ መጠበቅ ይቀጥላሉ። | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode executor፦ `user_blocked` refusal ያለበት 403/451 ሲያጋጥም (geo ያልሆነ፣ የCloudflare fingerprint rejection ያልሆነ)፣ refused accountውን cooldown ያድርጉ እና በእያንዳንዱ request ቢበዛ አንድ ጊዜ ወደ ቀጣዩ account ያዙሩ፤ ሁለተኛ refusal ያለ success mark እንዳለ ይመለሳል። በነባሪ ጠፍቷል፦ upstream user blockን አልፎ routing ማድረግ እንደ ማምለጥ ሊታይ እና flagውን በመላው fleet ሊያሰራጭ ይችላል። | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode rotation፦ ሁለት ተከታታይ transient upstream failures (5xx ወይም ባዶ 400) ከተከሰቱ በኋላ፣ ወደ ቀጣዩ account ከመሄድዎ በፊት ይቆዩ — 1.5s ሲሆን በእያንዳንዱ ተጨማሪ failure በእጥፍ ይጨምራል፣ በእያንዳንዱ pause 6s እና በእያንዳንዱ request 10s ላይ ይገደባል፣ client ግንኙነቱን ሲያቋርጥ ይዘለላል፤ ያልተሳካው body ከመጠበቁ በፊት ይለቀቃል። በነባሪ ጠፍቷል፦ failover ፈጣን ሆኖ ይቆያል። | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode rotation፦ እንደ እውነተኛ rate limit በተመደበው የመጀመሪያ 429 ላይ account waveውን ያቁሙ (ሊተነተን የሚችል `Retry-After`፣ ወይም rate/usage limitን የሚጠቅስ body) እና ያንን upstream 429 ሳይቀየር ይመልሱ። ያልተመደቡ 429s rotationን ይቀጥላሉ። በነባሪ ጠፍቷል፦ free tier በእያንዳንዱ የወጪ ትራፊክ IP የተገደበ ነው (#9611)፣ ስለዚህ እያንዳንዱ 429 rotation ያደርጋል እና ያለቀ wave የመጨረሻውን upstream 429 ይመልሳል። | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | ለMITM proxy የTLS certificate verificationን ያሰናክሉ። **አደገኛ።** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | ወደ private/internal networks የሚያመለክቱ provider URLsን ይፍቀዱ። | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | በlocal/private addresses (127.0.0.1, localhost, LAN) ላይ providersን ማከል/ማረጋገጥ ይፍቀዱ። በነባሪ በርቷል (local-first)፤ ጥብቅ public-only blocking ለማድረግ ያሰናክሉ። Cloud-metadata እንደታገደ ይቆያል። | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | ከClaude Code ጋር ተኳኋኝ የሆነ provider modeን ያንቁ። | +| ቁልፍ | ዓይነት | ነባሪ | መግለጫ | +| --------------------------------------- | ---- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | ቡሊያን | `false` | ለሁሉም ገቢ ጥያቄዎች የAPI ቁልፍ ያስፈልግ። | +| `INPUT_SANITIZER_ENABLED` | ቡሊያን | `true` | ለሁሉም ጥያቄዎች የግቤት ማጽዳትን አንቃ። | +| `INJECTION_GUARD_MODE` | ዝርዝር | `off` | የፕሮምፕት መርፌ ጥቃት መከላከያ ሁነታ። እሴቶች፦ `off`፣ `warn`፣ `block`፣ `redact`። | +| `PII_REDACTION_ENABLED` | ቡሊያን | `false` | ከጥያቄዎች ውስጥ PIIን ደብቅ (`INPUT_SANITIZER_MODE` ላይ የማይወሰን)። | +| `PII_RESPONSE_SANITIZATION` | ቡሊያን | `false` | ከአቅራቢ ምላሾች PIIን አጽዳ። | +| `PII_RESPONSE_SANITIZATION_MODE` | ዝርዝር | `redact` | የPII ምላሽ ማጽዳት ሁነታ። እሴቶች፦ `redact`፣ `warn`፣ `block`፣ `off`። | +| `OUTBOUND_SSRF_GUARD_ENABLED` | ቡሊያን | `true` | ወደ የግል/የውስጥ IP ክልሎች የሚላኩ ወጪ ጥያቄዎችን አግድ። | +| `ALLOW_API_KEY_REVEAL` | ቡሊያን | `false` | ማረጋገጫ ያለፉ የዳሽቦርድ ተጠቃሚዎች የተሸፈኑ እሴቶችን ብቻ ከማየት ይልቅ የተከማቹ የAPI ቁልፎችን እንዲያሳዩ ፍቀድ። | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | ቡሊያን | `false` | በAUTH ሎግ መስመሮች ውስጥ የመለያ ቅድመ ቅጥያን አካትት (ለምሳሌ፦ "የ መለያን በመጠቀም ላይ፦ abc12345...")። የመለያ መለያዎች ከጋራ/ባለብዙ ተከራይ የሂደት ሎጎች እንዲደበቁ በነባሪ ተሰናክሏል። ከDebug Mode ነጻ ነው፤ Debug Modeን መቀየር ይህን አያሳይም። | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | ቡሊያን | `false` | OIDC ሲነቃ፣ ተጠቃሚዎች በOIDC ነጠላ መግቢያ ብቻ ማረጋገጥ እንዲችሉ በይለፍ ቃል መግባትን አሰናክል። ሲሰናከል (ነባሪ)፣ በይለፍ ቃል መግባት እና OIDC ሁለቱም ይገኛሉ። | + +### አውታረ መረብ (16) + +| ቁልፍ | ዓይነት | ነባሪ | ዳግም ማስጀመር | መግለጫ | +| ----------------------------------------------- | ------- | ------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | የTLS fingerprint ድብቅነት ሁነታን አንቃ። | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | የ/v1/audio/* መስመሮች localhost ውጭ የሚስተናገዱ OpenAI-ተኳኋኝ የአቅራቢ ኖዶችን እንዲጠቀሙ ፍቀድ። በነባሪ የተሰናከለ ነው — ኦዲዮን ወደ ሩቅ አስተናጋጅ ማዘዋወር የወጪ ትራፊክ ማንነትን ይለውጣል፣ ስለዚህም የኦፕሬተሩ ግልጽ ውሳኔ መሆን አለበት። Loopback ኖዶች ሁልጊዜ የተፈቀዱ ሲሆኑ በዚህ ቅንብር አይነኩም። | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | POST /v1/rerank (እና የማህደረ ትውስታ ሞተሩ loopback rerank ደረጃ) localhost ውጭ የሚስተናገዱ OpenAI-ተኳኋኝ የአቅራቢ ኖዶችን እንዲጠቀም ፍቀድ። በነባሪ የተሰናከለ ነው — ወደ ሩቅ አስተናጋጅ ማዘዋወር የወጪ ትራፊክ ማንነትን ይለውጣል፣ ስለዚህም የኦፕሬተሩ ግልጽ ውሳኔ መሆን አለበት። Loopback ኖዶች ሁልጊዜ የተፈቀዱ ናቸው፤ ሩቅ ኖዶች ደግሞ የአቅራቢውን የወጪ URL ፖሊሲ ማለፍ አለባቸው። | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | ለግንኙነት ምንም proxy ባልተመደበበት ጊዜ፣ ከመዝገቡ ውስጥ የመጀመሪያውን የሚሰራ proxy በራስ-ሰር ምረጥ። በነባሪ የተሰናከለ ነው (አለበለዚያ በመዝገቡ ውስጥ ያለ ማንኛውም proxy ዓለም አቀፍ ምትክ ይሆናል — #3332)። | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | የproxy ተደራሽነት ቅድመ-ማረጋገጫዎች ሲከሽፉ፣ OAuth እና የአቅራቢ ማረጋገጫ ፍሰቶች የተወሰነላቸውን proxy አልፈው በቀጥታ እንዲገናኙ ፍቀድ። ይህ የወጪ IPን ሊለውጥ ስለሚችል በነባሪ የተሰናከለ ነው። | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | ለብዙ-መለያ ቅያሬ አስፈጻሚ የአውታረ መረብ ልዩ ሁኔታ (ጊዜው ማለፍ፣ ግንኙነት ውድቅ መደረግ/ዳግም መጀመር) ሲከሰት፣ ያልተሳካው መለያ የራሱ proxy ከሌለው፣ እያንዳንዱን ከመሞከር ይልቅ አጭር የማቀዝቀዣ ጊዜ ተግብር እና ለቀሪው ጥያቄ proxy የሌላቸውን ሌሎች መለያዎች ዝለል። በነባሪ የነቃ ነው (ደህንነቱ የተጠበቀ፦ የወጪ IP አይለወጥም፣ በጋራ የወጪ ትራፊክ መለያዎች ላይ የመዘግየት/የማቀዝቀዣ ጊዜ ስጋትን ብቻ ይቀንሳል)። proxy በሌለው የመጀመሪያ ስህተት ላይ ወዲያውኑ ስህተቱን ለማስተላለፍ አሰናክለው። | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | የProxy ስብስቦች እና የopencode የእያንዳንዱ-መለያ ቅያሬ አሁን የተሳነውን proxy (ውድቅ የተደረገ TCP probe፣ ወይም በእሱ በኩል የተቀበለ 429) እንደገና ማቅረብ ያቆማሉ፤ ይህም በእያንዳንዱ ድግግሞሽ እስከ ከፍተኛ ገደብ ድረስ በእጥፍ ለሚጨምር የእያንዳንዱ-ሂደት ጊዜ ነው። ምንም የproxy ሁኔታ አይጻፍም፤ እያንዳንዱ እጩ ወደ ጎን ሲቀመጥ ምርጫው አይለወጥም። በነባሪ የተሰናከለ ነው። | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | በዳሽቦርዱ ውስጥ በproxy ስብስብ ስር፣ ባለፉት 24 h ውስጥ ምን ያህል የታዩ የወጪ IPዎች አባላቱን እንዳገለገሉ እና ምን ያህል ግንኙነቶች እንደተጠቀሙባቸው አሳይ። ለንባብ ብቻ ነው፣ ከproxy ምዝግብ የሚሰላ ሲሆን ለማዘዋወር ፈጽሞ ጥቅም ላይ አይውልም። በነባሪ የተሰናከለ ነው። | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | ለOpenCode አስፈጻሚ፣ በዥረት የሚተላለፍ Responses ምላሽ የመጀመሪያውን የይዘት byte ተከታተል (መስኮት፦ `RESPONSES_FIRST_BYTE_TIMEOUT_MS`፣ ነባሪ `15000`)። ከመስኮቱ በላይ ዝም የሚል የ2xx Responses ዥረት እንደቆመ ይቆጠራል፦ መለያው ለማቀዝቀዣ ጊዜ ይቀመጣል እና ጥያቄው አንድ ጊዜ ወደሚቀጥለው መለያ ይቀየራል፤ ለሁለተኛ ጊዜ ከቆመ ወዲያውኑ ይከሽፋል። በነባሪ የተሰናከለ ነው፦ የቆሙ ዥረቶች የዥረት ዝግጁነት ጊዜው እስኪያልፍ ድረስ የአሁኑን መጠበቅ ይቀጥላሉ። | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode አስፈጻሚ፦ `user_blocked` እምቢታን የያዘ 403/451 ሲከሰት (ከጂኦግራፊያዊ እገዳ ወይም ከCloudflare የጣት አሻራ ውድቅ መደረግ የተለየ)፣ ውድቅ የተደረገውን መለያ ለጊዜው ያሳርፍና በእያንዳንዱ ጥያቄ ቢበዛ አንድ ጊዜ ወደ ቀጣዩ መለያ ይቀይር፤ ሁለተኛ እምቢታ የስኬት ምልክት ሳይደረግበት እንዳለ ይመለሳል። በነባሪነት ጠፍቷል፦ የላይኛውን አገልግሎት የተጠቃሚ እገዳ በሌላ መንገድ ማለፍ እንደ ማምለጥ ሊታይና ምልክቱን በመላው የመለያ ስብስብ ሊያሰራጭ ይችላል። | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode ሽክርክር፦ ሁለት ተከታታይ ጊዜያዊ የላይኛው አገልግሎት ውድቀቶች (5xx ወይም ባዶ 400) ከተከሰቱ በኋላ ወደ ቀጣዩ መለያ ከመሸጋገር በፊት ቆም ይበል — ከ1.5 ሰከንድ ጀምሮ በእያንዳንዱ ተጨማሪ ውድቀት በእጥፍ ይጨምራል፣ በእያንዳንዱ ማቆሚያ እስከ 6 ሰከንድ እና በእያንዳንዱ ጥያቄ እስከ 10 ሰከንድ ይገደባል፣ ደንበኛው ግንኙነቱን ካቋረጠ ይዘለላል፤ ከመጠበቁ በፊት ያልተሳካው የመልስ ይዘት ይለቀቃል። በነባሪነት ጠፍቷል፦ ወደ ተለዋጭ መለያ መሸጋገር ወዲያውኑ ይቀጥላል። | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode ሽክርክር፦ እንደ እውነተኛ የፍጥነት ገደብ የተመደበው የመጀመሪያ 429 ሲከሰት (ሊተነተን የሚችል `Retry-After` ወይም የፍጥነት/አጠቃቀም ገደብን የሚጠቅስ የመልስ ይዘት) የመለያዎችን ዙር ያቁምና ያንን የላይኛው አገልግሎት 429 ሳይቀይር ይመልስ። ያልተመደቡ 429ዎች ሽክርክሩን ይቀጥላሉ። በነባሪነት ጠፍቷል፦ ነፃው ደረጃ በእያንዳንዱ ወጪ IP የተገደበ ስለሆነ (#9611)፣ እያንዳንዱ 429 ወደ ቀጣዩ መለያ ያሸጋግራል፣ ዙሩም ሲሟጠጥ የመጨረሻውን የላይኛው አገልግሎት 429 ይመልሳል። | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | ለMITM ፕሮክሲው የTLS ሰርቲፊኬት ማረጋገጫን አሰናክል። **አደገኛ።** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | ወደ የግል/ውስጣዊ አውታረ መረቦች የሚያመለክቱ የአቅራቢ URLዎችን ፍቀድ። | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | በአካባቢያዊ/የግል አድራሻዎች (127.0.0.1, localhost, LAN) ላይ አቅራቢዎችን ማከል/ማረጋገጥን ፍቀድ። በነባሪነት ነቅቷል (አካባቢያዊን ቅድሚያ የሚሰጥ)፤ ለጥብቅ የሕዝብ አውታረ መረብ-ብቻ እገዳ አሰናክለው። የCloud ሜታዳታ እንደታገደ ይቆያል። | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | ከClaude Code ጋር ተኳሃኝ የሆነ የአቅራቢ ሁነታን አንቃ። | ### ፖሊሲዎች (5) -| ቁልፍ | ዓይነት | ነባሪ | መግለጫ | -| ------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | የመሣሪያ አጠቃቀም ፖሊሲ ማስፈጸሚያ ሁነታ። እሴቶች፦ `disabled`፣ `warn`፣ `block`። | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | በአጠቃቀም ስልቶች ላይ በመመሥረት የጥያቄ መጠን ገደብን በራስ-ሰር ያንቁ። | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | ቀጥተኛ የአንድ-ሞዴል ጥያቄዎችን በተመለከተ የOmniRoute አካባቢያዊ የዐውድ መስኮት / ከፍተኛ የግቤት ቶከን ፍተሻን ዝለል። የወደላይ አቅራቢ ገደቦች አሁንም ተፈጻሚ ናቸው። | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | ዒላማው ሞዴል አስፈላጊ ችሎታዎች ከሌሉት (ምስል፣ መሣሪያዎች፣ የተዋቀረ ውጤት፣ የዐውድ መስኮት) ጥያቄዎችን ከመላካቸው በፊት ውድቅ ያድርጉ። የጥምር-ንብርብር ተኳኋኝነት ማጣሪያን የሚያልፉ ቀጥተኛ የአንድ-አቅራቢ ጥያቄዎችን ይጠብቃል። | -| `RADAR_ENABLED` | boolean | `false` | የOmniRoute Radar ሞጁልን (የካታሎግ ምግብ ማሳያዎችን እና ማመሳሰልን) ያንቁ። በነባሪ ጠፍቷል፤ ማንቃት የተጠቃሚ በይነገጹን ብቻ ይከፍታል — የውሂብ ማመሳሰል የተለየ የመርጦ መግባት ሂደት ሆኖ ይቆያል። | - -### የአሂድ ጊዜ (32) - -| ቁልፍ | ዓይነት | ነባሪ | ዳግም ማስጀመር | መግለጫ | -| ------------------------------------------- | ------- | ------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | የኮምቦ ማዘዋወር ሞዴሎችን ሲቀይር የውይይት ማጠቃለያዎችን ያመነጫል እና ያስገባል። የሞዴል መቀያየርን በተናጠል ለማስተናገድ እና ለሁሉም ነባርና ወደፊት ለሚፈጠሩ ኮምቦዎች የጀርባ ሂደት ርክክብ ጥያቄዎችን ለመከላከል ያሰናክሉት። | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | ወደ ደንበኞች ከመላካቸው በፊት የውስጥ አስተያየት-ደረጃ ውጤት ንጥሎችን ከResponses API passthrough ዥረቶች ያስወግዳል። ጥሬውን የላይኛው ምንጭ አስተያየት ለመቀበል ያሰናክሉት። | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | በMCP መሣሪያ መዳረሻ ላይ የወሰን ገደቦችን ያስፈጽማል። | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | የቶከን አጠቃቀምን ለመቀነስ የMCP መሣሪያ መግለጫዎችን ይጨምቃል። | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | በአሂድ ጊዜ የጀርባ ሂደት ተግባር ማቀናበርን ያነቃል። | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | ሁሉንም የጀርባ ሂደት አገልግሎቶች (የኮታ ማደስ፣ ማመሳሰል፣ ወዘተ) ያሰናክላል። | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | የፕሮጀክት-ደረጃ RTK ማጣሪያዎችን ያለማረጋገጫ ያምናል። | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | ሲመጣ የቅጽበታዊ ዳሽቦርድ WebSocket አገልጋይን ያስጀምራል (በነባሪ ፖርት 20132)። | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex የResponses-over-WebSocket ማጓጓዣን እንዲጠቀም ይፈቅዳል። ሲጠፋ Codex ወደ HTTP Responses ይመለሳል። | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex የአካባቢ app-server WebSocket JSON-RPC ማጓጓዣን (codexTransport=app-server) እንዲጠቀም ይፈቅዳል። ሲጠፋ app-serverን ለመጠቀም የተመረጡ ግንኙነቶች ወደ ሌሎች የCodex ማጓጓዣዎች ይመለሳሉ። | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | በጀታቸው ያለቀ ጥያቄዎችን ወደ ድንገተኛ ነጻ ተተኪ አቅራቢ/ሞዴል ያዘዋውራል። (ከታች [የድንገተኛ በጀት ተተኪ](#emergency-budget-fallback)ን ይመልከቱ።) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | ማንኛውም የምላሽ ባይቶች ወደ ደንበኛው ከመድረሳቸው በፊት ለተቆረጡ የላይኛው ምንጭ SSE ዥረቶች ግልጽ የሆነ ቀደምት ዳግም ሙከራን ያነቃል። | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | ባይቶች ቀድሞውኑ ወደ ደንበኛው ከደረሱ በኋላ የዥረት መልሶ ማግኘት ምላሽን ዳግም እንዲጠይቅና እንዲያገናኝ ይፈቅዳል። | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | የዥረት-መካከል ቀጣይነትን ለመሣሪያ ጥሪ ደህንነቱ የተጠበቀ ያደርጋል፦ አንድ ጊዜ የመሣሪያ ጥሪ ከተለቀቀ (በሂደት ላይ ወይም በfinish_reason tool_calls አስቀድሞ ከተጠናቀቀ) የተቆረጠ ዥረትን ፈጽሞ አይቀጥልም፣ እና መላውን በጀት ከማውጣት ይልቅ ከአንድ ባዶ ቀጣይነት በኋላ ይዘጋል። ጠፍቶ ሲሆን፦ የልቀት ባህሪ። | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | አንድ SSE ዥረት ማንኛውንም ጠቃሚ ፍሬም ከመልቀቁ በፊት ሲዘጋ እና የተወሰነው የተመሳሳይ-ግንኙነት ዳግም ሙከራ ሲያልቅ፣ አንድ ጊዜ ወደ እኩያ ግንኙነት ያስተላልፋል፤ ጥቅም ላይ የሚውል እኩያ ከሌለ የመጀመሪያው `STREAM_EARLY_EOF` 502 ይመለሳል። በነባሪ ጠፍቷል፦ ቀደምት-EOF ከተመሳሳይ-ግንኙነት ዳግም ሙከራ በኋላ መጨረሻ ሆኖ ይቆያል። | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | በ`/v1/models` ምላሾች ውስጥ ለእይታ አመቺ የሆኑ የስም መስኮችን ያካትታል። የሞዴል መታወቂያዎችን ብቻ ለሚጠብቁ ደንበኞች ያሰናክሉት። | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | የሞዴል መታወቂያዎች በ/v1/models ውስጥ እንዴት ቅድመ ቅጥያ እንደሚያገኙ ይቆጣጠራል። 'dual' (ነባሪ) ለኋላ ተኳኋኝነት ሁለቱንም ቅጽል ስም እና መደበኛ provider-id ቅድመ ቅጥያዎችን ያወጣል። 'alias' አጭሩን የቅጽል ስም ቅድመ ቅጥያ ብቻ ያወጣል (ለምሳሌ ds-web/model፣ deepseek-web/model አይደለም)። 'canonical' ሙሉውን provider-id ቅድመ ቅጥያ ብቻ ያወጣል። እሴቶች፦ `dual`፣ `alias`፣ `canonical`። | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | ለሞዴል የመረጃ ደረጃዎች ወቅታዊ የArena AI የመሪዎች ሰንጠረዥ ELO ማመሳሰልን ያነቃል። | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | የClaude Code ጌትዌይ የሞዴል ፍለጋ Claude ያልሆኑ ሞዴሎችን እንዲዘረዝር `claude//` የመስታወት መታወቂያዎችን በ`/v1/models` ላይ ያስተዋውቃል። የሦስት-ደረጃ በር ዓለም አቀፍ ደረጃ (env ከዳሽቦርዱ ማሻሻያ ይቀድማል)። [የClaude Code ውቅር](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker)ን ይመልከቱ። | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | ለno-think// ጌትዌይ ቅጽል ስሞች ዋና ማብሪያ/ማጥፊያ። ሲበራ (ነባሪ)፦ /v1/models ለእያንዳንዱ ብቁ የማሰብ ችሎታ ላለው Claude ሞዴል የማያስብ ተለዋጭ ያስተዋውቃል፣ እና በጥያቄ ውስጥ የተላከ no-think/ መታወቂያ አመክንዮ ተገድቦ ወደ እውነተኛው ሞዴል ይፈታል። ሲጠፋ፦ ምንም ተለዋጮች አይተዋወቁም እና no-think/ መታወቂያ እንደማንኛውም ሌላ ያልታወቀ የሞዴል መታወቂያ ይያዛል። ይህ በርቶ ሳለ የእያንዳንዱ ሞዴል ModelSpec.noThinkingAlias የመርጦ-መግባት/የመርጦ-መውጣት አሁንም ይተገበራል። | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | በ/v1/models ካታሎግ ውስጥ የማሰብ ደረጃ ተለዋጮችን (ለምሳሌ -low፣ -medium፣ -high) ማመንጨትን ያሰናክላል። | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | ለአቅራቢ መላክ በተከራይ የሚስማሙ ምናባዊ የመግቢያ መስመሮችን ያነቃል (#9654)፦ የአንድ ተከራይ ድንገተኛ ጭማሪ ከእንግዲህ ሌላውን 503 አያስከትልበትም። OMNIROUTE_CHAT_VIRTUAL_LANES env var ከዚህ የዳሽቦርድ ማሻሻያ ይቀድማል፤ ለውጦች አገልጋዩ ዳግም ሲጀመር ተግባራዊ ይሆናሉ። | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | መደበኛ ባለቤታቸው ንቁ ማረጋገጫ የሌለው ነገር ግን ንቁ ማረጋገጫ ያለው passthrough ጌትዌይ የሚያዘዋውራቸው ሞዴሎችን በተመለከተ / የመስታወት መታወቂያዎችን በ/v1/models ላይ ያስተዋውቃል። ማስጠንቀቂያ፦ በዓለም አቀፍ ደረጃ ሲነቃ ለሁሉም ደንበኞች የካታሎግ ግቤቶችን ይጨምራል። | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | ከNew-API / One-API / Sub2API አሰባሳቢ ጋር ተኳኋኝ ለሆኑ ኖዶች የቀሪ ሂሳብ ማወቅን ያነቃል። ሲነቃ፣ የአሰባሳቢ ባንዲራ የተዘጋጀላቸው ተኳኋኝ ኖዶች ቀሪ ሂሳባቸውን በዳሽቦርዱ እና በኮታ-ቅድመ ማጣሪያ ማዘዋወር ውስጥ ሪፖርት ያደርጋሉ። | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | ሞዴሉ ደንበኛው ሊጠቀምበት የሚችል ምላሽ እስኪመልስ ድረስ በአገልጋዩ የሚተዳደሩ ዥረት-አልባ የመሣሪያ ጥሪዎችን ይቀጥላል። | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | የፍለጋ ስታቲስቲክስና የቅርብ ጊዜ ፍለጋዎች አሁንም ንቁ ግንኙነት ያላቸውን አቅራቢዎች ብቻ ይቆጥራሉ (እንደ duckduckgo-free ያሉ ቁልፍ-አልባ አቅራቢዎች ሁልጊዜ ይቆጠራሉ)። ሲጠፋ፣ እያንዳንዱን የተያዘ የፍለጋ ረድፍ ከአቅራቢ መታወቂያው ጋር ያቆያል። | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | የዳሽቦርድ አቅራቢ ገጾች፦ የነጻ ባጅን አቅራቢው በሚያከብራቸው ምልክቶች ላይ ብቻ ያሳያል — የማሳያ-ስም ግምታዊ ዘዴን፣ boolean ያልሆኑ የነጻ መስኮችን እና ሰነድ የተደረገ ነጻ ደረጃ በሌላቸው የተመዘገቡ አቅራቢዎች ላይ ያሉ :free ቅጥያዎችን ያስወግዳል። ሲጠፋ ታሪካዊውን የባጅ ደንብ ያቆያል። | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | በተሰባሰቡ 429/503 የማይገኝ ምላሾች ላይ፣ ተጨባጭ የወደፊት ዳግም ሙከራ ጊዜ ሳይታወቅ `Retry-After`ን ይተዋል (ከሰው ሰራሽ 1s ይልቅ)፣ `error.retry_after_provenance` (`signal` \| `none`)ን ይጨምራል፣ እና የኮምቦ ማስወገጃ ዱካዎች ከJSON እና ከግልጽ-ጽሑፍ የላይኛው ምንጭ አካላት ጽሑፋዊ የዳግም ሙከራ ፍንጮችን እንዲያነቡ ይፈቅዳል። መስኩ በ`unavailableResponse()` በተገነቡ ምላሾች ላይ ብቻ ይታያል፤ ሌሎች 429/503 አካላት ሳይቀየሩ ይቆያሉ። | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | fallback-only-on-quota-exhaustion ተብሎ ምልክት የተደረገበት `priority` የኮምቦ ዒላማ፣ ኮታ እንዳልሆነ በእርግጠኝነት ሊረጋገጥ በሚችል ምክንያት (የአቅራቢ የወረዳ መቆራረጫ መክፈት፣ ትንበያዊ የመዘግየት መዝለል) ኮምቦውን ሲያቆም፣ ኮታ የሚመስለውን 503 ከመመለስ ይልቅ 502 ይመልሳል። መቆለፍ፣ ማቀዝቀዝ፣ አለመገኘት፣ መሟጠጥ እና የትይዩነት-ገደብ ማቆሚያዎች 503ን ያቆያሉ። | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | ተራ Mistral 401 (`{"detail":"Unauthorized"}`፣ ግልጽ የማረጋገጫ ምልክት የሌለው) ለተሻረ ቁልፍም ሆነ ለተሟጠጠ ኮታ ተመሳሳይ ነው። ሲበራ፣ ግንኙነቱን `expired` አድርጎ ከማቆም ይልቅ ያቀዘቅዘዋል፤ ለእያንዳንዱ ግንኙነት በሰዓት ቢበዛ 3 ጊዜ፤ ቀጣዩ ያቆመዋል፣ ስለዚህ የተሻረ ቁልፍ አሁንም ወደ ቋሚ ሁኔታ ይደርሳል። በነባሪ ጠፍቷል፦ እያንዳንዱ ተራ Mistral 401 እንደበፊቱ ግንኙነቱን ያቆማል። | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | የቀዘቀዘውን የማይንቀሳቀስ መነሻ ከመጠቀም ይልቅ፣ የOAuth bearer ቶከንን በመጠቀም ለ`xai-oauth` ግንኙነቶች የቀጥታውን xAI ሞዴል ካታሎግ ከ`https://api.x.ai/v1/models` ያመጣል። በነባሪ ጠፍቷል፦ `xai-oauth` የማይንቀሳቀሰውን መነሻ ሳይቀይር ማቅረቡን ይቀጥላል። በማንኛውም የመፍታት ስህተት፣ ፍለጋው ወደ መነሻው ይመለሳል (x.ai በዚህ መጨረሻ ነጥብ OAuth bearerን እንደሚቀበል አልተረጋገጠም)። | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | ራስ-ሰር የማጽዳት ቅኝት `OMNIROUTE_BATCH_RETENTION_DAYS` ካለፈባቸው የመጨረሻ ሁኔታ ላይ ያሉ (የተጠናቀቁ/ያልተሳኩ/የተሰረዙ/ጊዜያቸው ያለፈ) Batch API ሥራዎችን ከየመስመራቸው የሂደት መቆጣጠሪያ ነጥቦች ጋር እንዲሰርዝ፣ እንዲሁም የራሳቸው `expires_at` ያለፈባቸውን የተሰቀሉ ፋይሎች BLOB ይዘት እንዲያጸዳ ይፈቅዳል። በነባሪ ጠፍቷል፦ ኦፕሬተር መርጦ እስኪያነቃው ድረስ እያንዳንዱ ነባር ጭነት ይህን ውሂብ ልክ እንደበፊቱ ያቆያል። በኦፕሬተር የሚነሳው `DELETE /api/v1/batches/delete-completed` መስመር በሁለቱም ሁኔታ አይነካም — እሱ የተለየ፣ ቅድመ ሁኔታ የሌለው የሕዝብ API ውል ነው። | +| ቁልፍ | ዓይነት | ነባሪ | መግለጫ | +| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | የመሣሪያ አጠቃቀም ፖሊሲ ማስፈጸሚያ ሁነታ። እሴቶች፦ `disabled`፣ `warn`፣ `block`። | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | በአጠቃቀም ንድፎች መሠረት የፍጥነት ገደብን በራስ-ሰር አንቃ። | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | ለቀጥታ ነጠላ-ሞዴል ጥያቄዎች የOmniRouteን አካባቢያዊ የአውድ-መስኮት / ከፍተኛ-የግብዓት-ቶከን ፍተሻ ዝለል። የላይኛው አገልግሎት ገደቦች አሁንም ተፈጻሚ ናቸው። | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | ዒላማው ሞዴል አስፈላጊ ችሎታዎች ከሌሉት (ምስል፣ መሣሪያዎች፣ የተዋቀረ ውጤት፣ የአውድ መስኮት) ጥያቄዎችን ከመላካቸው በፊት ውድቅ አድርግ። ይህ የጥምር-ንብርብሩን የተኳኋኝነት ማጣሪያ የሚያልፉ ቀጥተኛ የነጠላ-አቅራቢ ጥያቄዎችን ይጠብቃል። | +| `RADAR_ENABLED` | boolean | `false` | የOmniRoute Radar ሞጁልን (የካታሎግ ምግብ ማያ ገጾችና ማመሳሰል) አንቃ። በነባሪነት ጠፍቷል፤ ማንቃት የተጠቃሚ በይነገጹን ብቻ ይከፍታል — የውሂብ ማመሳሰል የተለየ በምርጫ የሚነቃ ሆኖ ይቆያል። | + +### የሩጫ ጊዜ (33) + +| ቁልፍ | ዓይነት | ነባሪ | ዳግም ማስጀመር | መግለጫ | +| ------------------------------------------- | ------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | ቡሊያን | `true` | | የጥምር ማዘዋወር ሞዴሎችን ሲቀይር የውይይት ማጠቃለያዎችን ያመነጫል እና ያስገባል። የሞዴል ለውጦችን እያንዳንዳቸውን ለብቻ ለማስተናገድ እና ለሁሉም ነባርና ወደፊት ለሚፈጠሩ ጥምሮች የበስተጀርባ ርክክብ ጥያቄዎችን ለመከላከል ያሰናክሉት። | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | ቡሊያን | `true` | | ወደ ደንበኞች ከመላካቸው በፊት ከResponses API ቀጥታ-ማሳለፊያ ዥረቶች ውስጣዊ የአስተያየት-ደረጃ ውጤት ንጥሎችን ያስወግዳል። ጥሬ የላይኛው ዥረት አስተያየትን ለመቀበል ያሰናክሉት። | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | ቡሊያን | `true` | | የMCP መሣሪያ መዳረሻ ላይ የወሰን ገደቦችን ያስፈጽማል። | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | ቡሊያን | `false` | | የቶከን አጠቃቀምን ለመቀነስ የMCP መሣሪያ መግለጫዎችን ይጨምቃል። | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | ቡሊያን | `false` | | በአሂድ ጊዜ የበስተጀርባ ተግባር ሂደትን ያነቃል። | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | ቡሊያን | `false` | ✓ | ሁሉንም የበስተጀርባ አገልግሎቶችን (የኮታ ማደስ፣ ማመሳሰል፣ ወዘተ) ያሰናክላል። | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | የፕሮጀክት ደረጃ RTK ማጣሪያዎችን ያለ ማረጋገጫ እመን። | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | በማስመጣት ጊዜ የእውነተኛ ጊዜ ዳሽቦርድ WebSocket አገልጋይን አስጀምር (በነባሪ port 20132)። | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex የResponses-over-WebSocket ማጓጓዣን እንዲጠቀም ፍቀድ። ሲጠፋ Codex ወደ HTTP Responses ይመለሳል። | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex የአካባቢውን app-server WebSocket JSON-RPC ማጓጓዣ (`codexTransport=app-server`) እንዲጠቀም ፍቀድ። ሲጠፋ፣ app-serverን ለመጠቀም የተመረጡ ግንኙነቶች ወደ ሌሎች የCodex ማጓጓዣዎች ይመለሳሉ። | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | በጀታቸው ያለቀባቸውን ጥያቄዎች ወደ ድንገተኛ ነፃ ተተኪ አቅራቢ/ሞዴል ላክ። (ከታች [የድንገተኛ ጊዜ የበጀት ተተኪ](#emergency-budget-fallback)ን ይመልከቱ።) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | ማንኛውም የምላሽ ባይቶች ወደ ደንበኛው ከመድረሳቸው በፊት፣ ለተቆራረጡ የላይኛው ምንጭ SSE ዥረቶች ግልጽ ያልሆነ ቀደምት ዳግም ሙከራን አንቃ። | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | ባይቶች ወደ ደንበኛው ከደረሱ በኋላ የዥረት መልሶ ማግኘት ምላሽን እንደገና እንዲጠይቅና እንዲያገናኝ ፍቀድ። | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | በዥረት መካከል ያለውን ቀጣይነት ለመሣሪያ ጥሪ ደህንነቱ የተጠበቀ አድርግ፦ የመሣሪያ ጥሪ አንዴ ከተላከ (በሂደት ላይ ያለ ወይም በ`finish_reason` `tool_calls` የተጠናቀቀ) የተቋረጠ ዥረትን በፍጹም አትቀጥል፣ እንዲሁም ሙሉውን በጀት ከማውጣት ይልቅ ከአንድ ባዶ ቀጣይነት በኋላ ዝጋ። ሲጠፋ፦ የልቀት ባህሪ። | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | አንድ SSE ዥረት ምንም ጠቃሚ ፍሬም ሳያወጣ ሲዘጋ እና የተገደበው የተመሳሳይ-ግንኙነት ዳግም ሙከራ ሲያልቅ፣ አንድ ጊዜ ወደ ተጓዳኝ ግንኙነት ያዛውሩ፤ ጥቅም ላይ የሚውል ተጓዳኝ ከሌለ የመጀመሪያው `STREAM_EARLY_EOF` 502 ይመለሳል። በነባሪ የተሰናከለ ነው፦ ከተመሳሳይ-ግንኙነት ዳግም ሙከራ በኋላ early-EOF የመጨረሻ ሁኔታ ሆኖ ይቆያል። | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | በ`/v1/models` ምላሾች ውስጥ ለእይታ ምቹ የሆኑ የስም መስኮችን ያካትቱ። የሞዴል IDs ብቻ ለሚጠብቁ ደንበኞች ያሰናክሉት። | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | በ/v1/models ውስጥ የሞዴል IDs ቅድመ ቅጥያ እንዴት እንደሚያገኙ ይቆጣጠራል። 'dual' (ነባሪ) ከቀድሞ ስሪቶች ጋር ለመጣጣም የቅጽል ስም እና መደበኛ የአቅራቢ-id ቅድመ ቅጥያዎችን ሁለቱንም ያወጣል። 'alias' አጭሩን የቅጽል ስም ቅድመ ቅጥያ ብቻ ያወጣል (ለምሳሌ፣ ds-web/model እንጂ deepseek-web/model አይደለም)። 'canonical' ሙሉውን የአቅራቢ-id ቅድመ ቅጥያ ብቻ ያወጣል። እሴቶች፦ `dual`፣ `alias`፣ `canonical`። | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | ለሞዴል ብልህነት ደረጃዎች ወቅታዊ የArena AI የመሪዎች ሰንጠረዥ ELO ማመሳሰልን ያንቁ። | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Claude Code gateway የሞዴል ግኝት Claude ያልሆኑ ሞዴሎችን እንዲዘረዝር፣ የ`claude//` አንጸባራቂ idsን በ`/v1/models` ላይ ያስተዋውቁ። የሶስት-ደረጃ በር ዓለም-አቀፍ ደረጃ (env ከdashboard override ይቀድማል)። [Claude Code ውቅረት](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker)ን ይመልከቱ። | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | ለno-think// gateway ቅጽል ስሞች ዋና መቀየሪያ። ሲበራ (ነባሪ)፦ /v1/models ለእያንዳንዱ ብቁ የማሰብ ችሎታ ላለው Claude ሞዴል የማያስብ ተለዋጭ ያስተዋውቃል፤ እንዲሁም በጥያቄ ላይ የተላከ no-think/ id፣ reasoning ታፍኖ ወደ እውነተኛው ሞዴል ይፈታል። ሲጠፋ፦ ምንም ተለዋጮች አይተዋወቁም፣ እና no-think/ id እንደማንኛውም ሌላ ያልታወቀ የሞዴል id ይቆጠራል። ይህ በርቶ ሳለ የእያንዳንዱ ሞዴል ModelSpec.noThinkingAlias opt-in/opt-out አሁንም ተፈጻሚ ይሆናል። | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | በ/v1/models ካታሎግ ውስጥ የማሰብ ደረጃ ተለዋጮችን (ለምሳሌ፣ -low፣ -medium፣ -high) ማመንጨትን ያሰናክሉ። | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | ለአቅራቢ ማሰማራት በተከራይ የሚለያዩ አስማሚ ምናባዊ የመግቢያ መስመሮችን ያንቁ (#9654)፦ የአንድ ተከራይ ድንገተኛ ጭማሪ ከእንግዲህ ሌላውን 503 አያስመልስበትም። `OMNIROUTE_CHAT_VIRTUAL_LANES` env var ከዚህ dashboard override ይቀድማል፤ ለውጦች ሰርቨሩ ዳግም ሲጀምር ተግባራዊ ይሆናሉ። | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | መደበኛ ባለቤታቸው ንቁ ማረጋገጫ የሌለውን፣ ነገር ግን ንቁ ማረጋገጫ ያለው ቀጥታ ማሳለፊያ gateway ወደእነሱ የሚያዞርባቸውን ሞዴሎች / mirror ids በ /v1/models ላይ ያስተዋውቁ። ማስጠንቀቂያ፦ በዓለም አቀፍ ደረጃ ሲነቃ ለሁሉም ደንበኞች የካታሎግ ግቤቶችን ይጨምራል። | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | ከ New-API / One-API / Sub2API aggregator ጋር ተኳሃኝ ለሆኑ nodes የሒሳብ ቀሪ ማወቂያን ያንቁ። ሲነቃ፣ የ aggregator ምልክት የተቀናበረላቸው ተኳሃኝ nodes የሒሳብ ቀሪያቸውን በ dashboard እና በ quota-preflight routing ውስጥ ያሳውቃሉ። | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | ሞዴሉ ደንበኛው ሊጠቀምበት የሚችል ምላሽ እስኪመልስ ድረስ በ server ባለቤትነት የሚተዳደሩ የማይለቀቁ tool calls እንዲቀጥሉ ያድርጉ። | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | የፍለጋ ስታቲስቲክስ እና የቅርብ ጊዜ ፍለጋዎች አሁንም ንቁ connection ያላቸውን providers ብቻ ይቆጥራሉ (እንደ duckduckgo-free ያሉ keyless providers ሁልጊዜ ይቆጠራሉ)። ሲጠፋ፣ provider id ያለውን እያንዳንዱን የተያዘ የፍለጋ ረድፍ ያቆያል። | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | የ dashboard provider ገጾች፦ Free badgeን provider በሚያከብራቸው ምልክቶች ላይ ብቻ ያሳዩ — የ display-name ግምታዊ ዘዴን፣ boolean ያልሆኑ free fieldsን እና በሰነድ የተገለጸ free tier በሌላቸው የተመዘገቡ providers ላይ ያሉ :free suffixesን ያስወግዳል። ሲጠፋ፣ ታሪካዊውን የ badge ደንብ ያቆያል። | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | በተዋሃዱ 429/503 የአገልግሎት አለመኖር ምላሾች ላይ፣ የተወሰነ የወደፊት የድጋሚ ሙከራ ጊዜ በማይታወቅበት ጊዜ `Retry-After`ን ይተዉ (በሰው ሠራሽ 1s ፋንታ)፣ `error.retry_after_provenance` (`signal` \| `none`)ን ያክሉ፣ እንዲሁም combo drain paths ከ JSON እና plain-text upstream bodies ውስጥ በስድ ንባብ የቀረቡ የድጋሚ ሙከራ ፍንጮችን እንዲያነቡ ያድርጉ። ይህ field በ `unavailableResponse()` በተገነቡ ምላሾች ላይ ብቻ ይታያል፤ ሌሎች 429/503 bodies አይለወጡም። | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | fallback-only-on-quota-exhaustion ተብሎ ምልክት የተደረገበት `priority` combo target ከ quota ጋር እንደማይዛመድ በእርግጠኝነት ሊረጋገጥ በሚችል ምክንያት (የ provider circuit breaker መከፈት፣ predictive latency skip) comboውን ሲያቆም፣ quota ያለቀ በሚመስለው 503 ፋንታ 502 ይመልሱ። በ lockout፣ cooldown፣ unavailable፣ exhaustion እና concurrency-cap ምክንያት የሚፈጠሩ ማቆሚያዎች 503ን ይይዛሉ። | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | ተጨማሪ ዝርዝር የሌለው Mistral 401 (`{"detail":"Unauthorized"}`፣ ግልጽ የ auth ምልክት የሌለው) ለተሻረ key እና quotaው ላለቀበት key ተመሳሳይ ነው። ሲበራ፣ connectionን `expired` ብሎ ከማቆም ይልቅ cooldown ውስጥ ያስገባዋል፣ ለእያንዳንዱ connection በሰዓት ከፍተኛው 3 ጊዜ፤ ቀጣዩ ያቆመዋል፣ ስለዚህ የተሻረ key በመጨረሻ ወደተገቢው ሁኔታ ይደርሳል። በነባሪ ጠፍቷል፦ እያንዳንዱ ተጨማሪ ዝርዝር የሌለው Mistral 401 እንደቀድሞው connectionን ያቆማል። | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | ከተወሰነው የማይለወጥ መነሻ ይልቅ፣ የOAuth bearer ቶከንን በመጠቀም ለ`xai-oauth` ግንኙነቶች የቀጥታውን የxAI ሞዴል ካታሎግ ከ`https://api.x.ai/v1/models` ያምጣ። በነባሪ ጠፍቷል፦ `xai-oauth` የማይለወጠውን መነሻ ያለምንም ለውጥ ማቅረቡን ይቀጥላል። በማንኛውም የመፍታት ስህተት ጊዜ፣ ግኝቱ ወደ መነሻው ይመለሳል (x.ai በዚህ የመዳረሻ ነጥብ ላይ የOAuth bearer ቶከንን ይቀበል እንደሆነ አልተረጋገጠም)። | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | ራስ-ሰር የማጽዳት ሂደቱ ከ`OMNIROUTE_BATCH_RETENTION_DAYS` በላይ የቆዩ የመጨረሻ ሁኔታ ላይ ያሉ (የተጠናቀቁ/ያልተሳኩ/የተሰረዙ/ጊዜያቸው ያለፈ) የBatch API ሥራዎችን ከየመስመራቸው የፍተሻ ነጥቦች ጋር እንዲሰርዝ፣ እንዲሁም የራሳቸው `expires_at` ካለፈ በኋላ የተሰቀሉ ፋይሎችን BLOB ይዘት እንዲያጸዳ ይፍቀዱ። በነባሪ ጠፍቷል፦ ኦፕሬተር እስኪያነቃው ድረስ እያንዳንዱ ነባር ጭነት ይህን ውሂብ ልክ እንደበፊቱ ያቆየዋል። በኦፕሬተር የሚጀመረው `DELETE /api/v1/batches/delete-completed` መስመር በሁለቱም ሁኔታዎች አይነካም — ይህ የተለየ፣ ቅድመ ሁኔታ የሌለው የሕዝብ API ውል ነው። | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | የመረጠው ጥያቄ ለሚያካሂደው የዥረት የሕይወት ዑደት የተመረጠውን Antigravity መለያ ያስይዙ፤ በዚህም በአንድ ጊዜ የሚካሄድ ድጋሚ ሙከራ ወይም የማረጋገጫ መረጃ ርክክብ፣ በሂደት ላይ ላለ ዥረት አስቀድሞ የተመደበ መለያን ዳግም እንዳይመርጥ ያደርጋል። ማስያዣው በ(ግንኙነት፣ ሊጠራ በሚችል የላይኛው አቅራቢ ሞዴል) ወሰን የተገደበ ስለሆነ፣ አንድ መለያ አሁንም ሁለት የተለያዩ ሞዴሎችን በአንድ ጊዜ ማገልገል ይችላል። ለዚያ ሞዴል ሁሉም ብቁ መለያዎች አስቀድመው በማስያዝ ላይ ሲሆኑ፣ ጥያቄው በተጨናነቀ መለያ ላይ ከመከመር ይልቅ ከተገደበ `Retry-After` ጋር የተዋቀረ 503 `antigravity_pool_busy` ይመልሳል። በነባሪ ጠፍቷል፦ የመለያ ምርጫው ልክ እንደበፊቱ ይቆያል፣ ምንም ማስያዣም አይደረግም። | ### CLI (5) -| ቁልፍ | ዓይነት | ነባሪ | ዳግም ማስጀመር | መግለጫ | -| ------------------------------------- | ------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | ለሁሉም CLI ደንበኞች የተኳኋኝነት ሁነታን ያንቁ። | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | የሞዴል ተለዋጭ ስም ተኳኋኝነት ንብርብርን ያንቁ። | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | ራስ-ሰር የዋጋ መረጃ ማመሳሰልን ያንቁ (`PRICING_SYNC_ENABLED` የአካባቢ ተለዋዋጭንም ይፈልጋል)። | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | የአቅራቢ ሞዴል ከተመሳሰለ በኋላ፣ ከቀጥታ ካታሎጉ በመጠቀም የ~/.codex/*.config.toml መገለጫ ፋይሎችን በራስ-ሰር (እንደገና) ይጻፉ። ንቁውን/ነባሪውን Codex ውቅር ፈጽሞ አይቀይርም። በነባሪ ጠፍቷል። | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | የአቅራቢ ሞዴል ከተመሳሰለ በኋላ፣ ከቀጥታ ካታሎጉ በመጠቀም የ~/.claude/profiles//settings.json Claude Code መገለጫዎችን በራስ-ሰር (እንደገና) ይጻፉ። ንቁውን/ነባሪውን Claude ውቅር ፈጽሞ አይቀይርም። በነባሪ ጠፍቷል። | +| ቁልፍ | ዓይነት | ነባሪ | ዳግም ማስጀመር | መግለጫ | +| ------------------------------------- | ------- | ------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | ለሁሉም የCLI ደንበኞች የተኳኋኝነት ሁነታን ያንቁ። | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | የሞዴል ተለዋጭ ስም ተኳኋኝነት ንብርብርን ያንቁ። | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | ራስ-ሰር የዋጋ መረጃ ማመሳሰልን ያንቁ (የ`PRICING_SYNC_ENABLED` የአካባቢ ተለዋዋጭንም ይፈልጋል)። | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | የአቅራቢ ሞዴል ከተመሳሰለ በኋላ፣ የ~/.codex/*.config.toml መገለጫ ፋይሎችን ከቀጥታው ካታሎግ በራስ-ሰር (እንደገና) ይጻፉ። ንቁውን/ነባሪውን የCodex ውቅር ፈጽሞ አይለውጥም። በነባሪ ጠፍቷል። | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | የአቅራቢ ሞዴል ከተመሳሰለ በኋላ፣ የ~/.claude/profiles//settings.json Claude Code መገለጫዎችን ከቀጥታው ካታሎግ በራስ-ሰር (እንደገና) ይጻፉ። ንቁውን/ነባሪውን የClaude ውቅር ፈጽሞ አይለውጥም። በነባሪ ጠፍቷል። | ### ጤና (5) -| ቁልፍ | ዓይነት | ነባሪ | መግለጫ | -| ----------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | የአካባቢያዊ ኢንስታንስ ጤና ምርመራ መጨረሻ ነጥብን ያሰናክሉ። | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | የቶከን ማረጋገጫ ጤና ምርመራን ያሰናክሉ። | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | በክህሎቶች sandbox አካባቢ ውስጥ የአውታረ መረብ መዳረሻን ያንቁ። | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | በፕሮክሲ ጤና ፍተሻ ውስጥ፣ ዒላማው ያልተቀበለው መመርመሪያ (401/403/429) የፕሮክሲውን ተከታታይ-ውድቀት ቆጠራ ዳግም ያስጀምራል። በነባሪ ጠፍቷል፦ አለመቀበል ገለልተኛ ሆኖ ይቆያል (#10654)። 5xx በሁለቱም ሁኔታ ያልተወሰነ ሆኖ ይቆያል፤ አለመቀበል ፕሮክሲን ፈጽሞ አያስወግድም፣ አያሰናክልም ወይም ዳግም አያነቃም። | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | የአገልጋዩን መጀመር እስኪጠናቀቅ ድረስ ከማገድ ይልቅ፣ አገልጋዩ ጥያቄዎችን መቀበል ከጀመረ በኋላ (በ`setImmediate` በኩል) የመነሻ DB ታማኝነት/ጤና ምርመራን ያሂዱ (#13717)። በነባሪ ጠፍቷል፦ መጀመር ከዚህ PR በፊት እንደነበረው በትክክል ይታገዳል። | +| ቁልፍ | ዓይነት | ነባሪ | መግለጫ | +| ----------------------------------------- | ---- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | ቡሊያን | `false` | የአካባቢያዊ ኢንስታንሱን የጤና ምርመራ መጨረሻ ነጥብ ያሰናክላል። | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | ቡሊያን | `false` | የቶከን ማረጋገጫ የጤና ምርመራን ያሰናክላል። | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | ቡሊያን | `false` | በችሎታዎች sandbox አካባቢ ውስጥ የኔትወርክ መዳረሻን ያነቃል። | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | ቡሊያን | `false` | በፕሮክሲ ጤና ፍተሻ ውስጥ ዒላማው ያልተቀበለው መመርመሪያ (401/403/429) የፕሮክሲውን ተከታታይ የውድቀት ቆጠራ ዳግም ያስጀምራል። በነባሪነት ጠፍቷል፦ አለመቀበል ገለልተኛ ሆኖ ይቆያል (#10654)። 5xx በሁለቱም ሁኔታ የማያረጋግጥ ሆኖ ይቆያል፤ አለመቀበል ፕሮክሲን ፈጽሞ አያስወግድም፣ አያሰናክልም ወይም ዳግም አያነቃም። | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | ቡሊያን | `false` | የአገልጋዩን ጅምር እስኪጠናቀቅ ከማገድ ይልቅ አገልጋዩ ጥያቄዎችን መቀበል ከጀመረ በኋላ (በ`setImmediate` አማካኝነት) የጅምር DB ትክክለኛነት/ጤና ምርመራን ያካሂዳል (#13717)። በነባሪነት ጠፍቷል፦ ጅምሩ ከዚህ PR በፊት እንደነበረው በትክክል ይታገዳል። | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` እና የቆየው ተለዋጭ ስሙ +> `INPUT_SANITIZER_BLOCK_THRESHOLD` እና የቀድሞ ተለዋጭ ስሙ > `INJECTION_GUARD_BLOCK_THRESHOLD` የ`INJECTION_GUARD_MODE`ን `block` ሁነታ -> ያስተካክላሉ፣ ነገር ግን በ +> ያስተካክላሉ፣ ነገር ግን እነዚህ በ > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> የሚነበቡ ተራ የአካባቢ ተለዋዋጮች እንጂ የባህሪ ጠቋሚዎች አይደሉም፦ የDB ሽረትም ሆነ የዳሽቦርድ መቀያየሪያ የላቸውም። +> የሚነበቡ መደበኛ የአካባቢ ተለዋዋጮች እንጂ የባህሪ ባንዲራዎች አይደሉም፦ የDB መሻሪያም ሆነ የዳሽቦርድ መቀያየሪያ የላቸውም። > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication)ን ይመልከቱ። > [!NOTE] -> የ`Restart` ዓምድ `requiresRestart: true` ያላቸውን ጠቋሚዎች ያመለክታል — እሴቱ -> ወዲያውኑ ይቀመጣል፣ ነገር ግን ተግባራዊ የሚሆነው ሂደቱ ዳግም ከተጫነ በኋላ ብቻ ነው። የEnum -> ጠቋሚዎች ከተፈቀደላቸው ስብስብ ውጭ ያለን ማንኛውንም እሴት ውድቅ ያደርጋሉ (በሁለቱም -> `setFeatureFlagOverride()` እና በREST `PUT` ተቆጣጣሪ ውስጥ በአገልጋይ-በኩል የተረጋገጠ)። +> የ`Restart` ዓምድ `requiresRestart: true` ያላቸውን ባንዲራዎች ያመለክታል — እሴቱ +> ወዲያውኑ ይቀመጣል፣ ነገር ግን ሂደቱ ዳግም ከተጫነ በኋላ ብቻ ተግባራዊ ይሆናል። Enum +> ባንዲራዎች ከተፈቀደው ስብስባቸው ውጭ ያለ ማንኛውንም እሴት ውድቅ ያደርጋሉ (በሁለቱም +> `setFeatureFlagOverride()` እና የREST `PUT` ተቆጣጣሪ ውስጥ በአገልጋይ በኩል የተረጋገጠ)። --- -## ፍላጎት አመልካቾችን ማብራትና ማጥፋት +## ፍላጎችን ማብራትና ማጥፋት ### ዳሽቦርድ -ወደ **ዳሽቦርድ → ቅንብሮች → የባህሪ አመልካቾች** -(`/dashboard/settings/feature-flags`) ይሂዱ። ሰንጠረዡ +ወደ **Dashboard → Settings → Feature Flags** +(`/dashboard/settings/feature-flags`) ይሂዱ። ፍርግርጉ (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) የሚከተሉትን ይደግፋል፦ -- በቁልፍ ወይም በመግለጫ **መፈለግ**፣ እና በምድብ **ማጣራት** (በተጨማሪም ሰው ሠራሽ - **ዳግም ማስጀመር ይፈልጋል** እይታ)። -- ለቡሊያን አመልካቾች **ማብሪያ/ማጥፊያ** እና ለenum አመልካቾች **ተቆልቋይ ምናሌ** +- በቁልፍ ወይም በመግለጫ **መፈለግ**፣ እንዲሁም በምድብ **ማጣራት** (በተጨማሪ ሰው ሠራሽ + **Requires Restart** እይታ)። +- ለቡሊያን ፍላጎች **ማብሪያ/ማጥፊያ** እና ለenum ፍላጎች **ተቆልቋይ ምናሌ** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`)። -- ለእያንዳንዱ አመልካች ውጤታማው እሴት ከየት እንደመጣ የሚያሳይ **የምንጭ ባጅ** — `DB`፣ `ENV`፣ ወይም `DEF`። -- ተተኪውን ለማስወገድ **ዳግም አስጀምር** አዝራር (ምንጫቸው `DB` ለሆኑ አመልካቾች ብቻ ይታያል)፣ - እና ከታች **ሁሉንም ተተኪዎች ዳግም አስጀምር** አዝራር። -- `requiresRestart` አመልካች ሲቀየር **ሰርቨሩን ዳግም አስጀምር** ባነር። +- ውጤታማው እሴት ከየት እንደመጣ የሚያሳይ፣ ለእያንዳንዱ ፍላግ የሚታይ **የምንጭ ባጅ** — `DB`፣ `ENV` ወይም `DEF`። +- ማሻሻያውን ለማስወገድ **Reset** አዝራር (`DB` ምንጭ ላላቸው ፍላጎች ብቻ የሚታይ)፣ + እና ከታች **Reset All Overrides** አዝራር። +- `requiresRestart` ፍላግ ሲቀየር **Restart Server** ሰንደቅ። ### REST API -ሁሉም ክወናዎች በአንድ መንገድ ያልፋሉ፦ +ሁሉም ክወናዎች በአንድ መስመር በኩል ያልፋሉ፦ [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts)። -እያንዳንዱ ዘዴ የተረጋገጠ የዳሽቦርድ ክፍለ-ጊዜ ይፈልጋል (አለበለዚያ `401`)። +እያንዳንዱ ዘዴ የተረጋገጠ የዳሽቦርድ ክፍለ ጊዜ ይፈልጋል (ካልሆነ `401`)። #### `GET /api/settings/feature-flags` -እያንዳንዱን አመልካች ከውጤታማ እሴቱ፣ ምንጩ እና ማጠቃለያው ጋር ይመልሳል። +እያንዳንዱን ፍላግ ከውጤታማ እሴቱ፣ ምንጩ እና ማጠቃለያው ጋር ይመልሳል። ```jsonc { @@ -209,7 +211,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... ሁሉም 72 አመልካቾች + // ... ሁሉም 74 ፍላጎች ], "summary": { "total": 56, @@ -223,33 +225,33 @@ #### `PUT /api/settings/feature-flags` -አንድ ተተኪ ያዘጋጁ ወይም ያስወግዱ። የጥያቄ አካል፦ `{ key: string; value?: string }`። -`value`ን አለማካተት ተተኪውን ያስወግዳል (env / ነባሪውን ይመልሳል)። +አንድ ማሻሻያ ያዘጋጁ ወይም ያስወግዱ። የጥያቄ አካል፦ `{ key: string; value?: string }`። +`value`ን አለማካተት ማሻሻያውን ያስወግዳል (env / defaultን ይመልሳል)። ```bash -# የDB ተተኪ ያዘጋጁ +# የDB ማሻሻያ አዘጋጅ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# ተተኪውን ያስወግዱ ("value" የለም) +# ማሻሻያውን አስወግድ ("value" የለም) curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` ምላሹ አዲሱን `effectiveValue`/`source`፣ `previousValue`/ -`previousSource`፣ እና `requiresRestart` መልሶ ያሳያል። ያልታወቁ ቁልፎች እና ከክልል ውጭ የሆኑ enum +`previousSource` እና `requiresRestart` መልሶ ያሳያል። ያልታወቁ ቁልፎች እና ከተፈቀደው ክልል ውጭ ያሉ የenum እሴቶች በ`400` ውድቅ ይደረጋሉ። #### `DELETE /api/settings/feature-flags` -**ሁሉንም** የDB ተተኪዎች በአንድ ጊዜ በማጽዳት፣ እያንዳንዱን አመልካች ወደ env / ነባሪ +ሁሉንም የDB ማሻሻያዎች በአንድ ጊዜ ያጸዳል፣ እያንዳንዱን ፍላግ ወደ env / default እሴቱ ይመልሳል። `{ cleared: , message: "..." }`ን ይመልሳል። > [!NOTE] -> `requiresRestart: true` ያላቸው አመልካቾች ተግባራዊ የሚሆኑት ሂደቱ ዳግም ከተጫነ በኋላ ብቻ ነው። -> የዳሽቦርዱ የዳግም ማስጀመር ሂደት `POST /api/restart`ን ይጠራል፣ ከዚያም ሰርቨሩ ዳግም እስኪነሳ ድረስ +> `requiresRestart: true` ያላቸው ፍላጎች ተግባራዊ የሚሆኑት ሂደቱ እንደገና ከተጫነ በኋላ ብቻ ነው። +> የዳሽቦርዱ እንደገና ማስጀመሪያ ፍሰት `POST /api/restart`ን ይጠራና አገልጋዩ እንደገና እስኪነሳ ድረስ > `GET /api/health/ping`ን በተደጋጋሚ ይፈትሻል። --- diff --git a/docs/i18n/am/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/am/docs/reference/PROVIDER_REFERENCE.md index 1a969d90247b..af006e0068d5 100644 --- a/docs/i18n/am/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/am/docs/reference/PROVIDER_REFERENCE.md @@ -5,10 +5,10 @@ --- > **በራስ-ሰር የተፈጠረ** ከ`src/shared/constants/providers.ts` — በእጅ አርትዕ አያድርጉት። -> በዚህ እንደገና ያመንጩት፦ `npm run gen:provider-reference` -> **ለመጨረሻ ጊዜ የተፈጠረው፦** 2026-09-17 +> እንደገና ለማመንጨት፦ `npm run gen:provider-reference` +> **መጨረሻ የተመነጨው፦** 2026-09-18 -አጠቃላይ አቅራቢዎች፦ **359**። የምድብ ዝርዝሩን ከታች ይመልከቱ። +ጠቅላላ አቅራቢዎች፦ **359**። የምድቦቹን ዝርዝር ከታች ይመልከቱ። ## ምድቦች @@ -32,49 +32,49 @@ --- -## ማረጋገጫ-የማይፈልጉ አቅራቢዎች (ቁልፍ አያስፈልግም) (10) - -| ID | ተለዋጭ ስም | ስም | መለያዎች | ድረ-ገጽ | ማስታወሻዎች | የመሣሪያ ጥሪ | -| ----------------------- | ---------- | ------------------------- | ----------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `aihorde` | `horde` | AI Horde | ማረጋገጫ የማይፈልግ | [አገናኝ](https://aihorde.net) | የAPI ቁልፍ አያስፈልግም — በሰነድ የተገለጸውን የAI Horde ስም-አልባ ቁልፍ ይጠቀማል። ነፃ የaihorde.net ቁልፍ ማከል አማራጭ ሲሆን የሚያስገኘው ከፍተኛ የወረፋ ቅድሚያ (kudos) ብቻ ነው። | — | -| `auggie` | `aug` | Augment (Auggie CLI) | ማረጋገጫ የማይፈልግ | [አገናኝ](https://augmentcode.com) | OmniRoute ምንም የAPI ቁልፍ አያከማችም። Auggie CLIን ይጫኑና በዚህ ማሽን ላይ `auggie login`ን ያስኪዱ፤ ከዚያ OmniRoute ለእያንዳንዱ ጥያቄ በአካባቢው ያስነሳዋል። | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | ማረጋገጫ የማይፈልግ | [አገናኝ](https://playground.ai.cloudflare.com) | ምንም የመግቢያ ማረጋገጫ አያስፈልግም — በተገላቢጦሽ ምህንድስና በተገኘ cf_agent WebSocket ፕሮቶኮል (Playwright ማጓጓዣ) ላይ ስም-አልባ የአሳሽ ክፍለ-ጊዜዎችን ይጠቀማል። | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | ማረጋገጫ የማይፈልግ | [አገናኝ](https://developers.openai.com/codex/cli) | OmniRoute ምንም ቶከን አያከማችም። የCodex CLI app-server የራሱን የChatGPT መግቢያ (~/.codex/auth.json፣ በራስ-ሰር የሚታደስ) ያስተዳድራል። CLIው ገና ካልተረጋገጠ “በChatGPT ይግቡ”ን ይጠቀሙ። | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | ማረጋገጫ የማይፈልግ | [አገናኝ](https://docs.devin.ai/work-with-devin/devin-cli) | ማረጋገጫው በይፋዊው Devin CLI በተነጠለው የድልድይ ዲስክ ክፍል ውስጥ ይተዳደራል። | የተመሰለ | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | ማረጋገጫ የማይፈልግ | [አገናኝ](https://duckduckgo.com/duckchat) | ምንም የመግቢያ ማረጋገጫ አያስፈልግም — DuckDuckGo AI Chat ስም-አልባ እና ነፃ ነው። | የተመሰለ | -| `opencode` | `oc` | OpenCode Free | ማረጋገጫ የማይፈልግ | [አገናኝ](https://opencode.ai) | የAPI ቁልፍ አያስፈልግም — የOpenCodeን ይፋዊ ነፃ endpoint ይጠቀማል። | — | -| `uncloseai` | `unc` | UncloseAI | ማረጋገጫ የማይፈልግ | [አገናኝ](https://uncloseai.com) | ማረጋገጫ አያስፈልግም። APIው ለመለያ እንደ ቁልፍ ማንኛውንም ባዶ ያልሆነ ሕብረቁምፊ ይቀበላል። የቆዩ አብሮ-የተካተቱ ሞዴሎች 404 ከመለሱ፣ የሚገኙ ሞዴሎች → ከ /models አስመጣ ወይም ራስ-ሰር አመሳስልን ይጠቀሙ፤ በቀጥታ ስርጭት የተረጋገጠ ሞዴል፦ solidrust/Hermes-3-Llama-3.1-8B-AWQ። | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | ማረጋገጫ የማይፈልግ፣ ቪዲዮ | [አገናኝ](https://veoaifree.com) | ማረጋገጫ አያስፈልግም። በእያንዳንዱ IP በሰዓት እስከ 6 ጥያቄዎች የፍጥነት ገደብ አለው። | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | ማረጋገጫ የማይፈልግ | [አገናኝ](https://zcode.z.ai) | OmniRoute ምንም የAPI ቁልፍ አያከማችም። የአካባቢው ZCode app-server ነባሩን builtin:zai-coding-plan መግቢያ ይጠቀማል። | — | - -## የOAuth አቅራቢዎች (24) - -| ID | ተለዋጭ ስም | ስም | መለያዎች | ድረ ገጽ | ማስታወሻዎች | -| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [አገናኝ](https://antigravity.google) | የAntigravity CLI (`agy`) መግቢያዎን ያስመጡ (የቶከን ፋይሉን ይለጥፉ/ይስቀሉ)፣ የአካባቢያዊ CLI መግቢያን በራስ-ሰር ያግኙ፣ ወይም በGoogle ይግቡ። የAntigravity ባክኤንድን (የClaude ሞዴሎችን ጨምሮ) ይጋራል። | -| `amazon-q` | `aq` | Amazon Q | OAuth | [አገናኝ](https://aws.amazon.com/q/developer/) | እንደ Kiro ተመሳሳዩን AWS Builder ID ወይም የመጣ refresh-token ፍሰት ይጠቀማል፣ ነገር ግን የAmazon Q ግንኙነቶችን ለየብቻ ያቆያል። | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [አገናኝ](https://cline.bot/cline-pass) | ClinePass 10 ክፍት የኮድ ማዘጋጃ ሞዴሎችን በአንድ ላይ የሚያቀርብ የCline $9.99/በወር ምዝገባ ነው። በCline መለያዎ (ከCline CLI/IDE ጋር ተመሳሳይ መግቢያ) ይግቡ፣ ወይም ቀጥተኛ የClinePass API ቁልፍ ይለጥፉ (app.cline.bot → ቅንብሮች → API ቁልፎች)። የClinePass ምዝገባ የcline-pass/* ሞዴሎችን ይከፍታል። የCline WorkOS OAuth ፍሰትን እንደገና ይጠቀማል። | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [አገናኝ](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com)። በይፋዊው CLI device-code ፍሰት ይግቡ፣ ወይም ቀጥተኛ API ቁልፍ ይለጥፉ (እንደ Authorization: Bearer ይላካል)። ካታሎግ፦ GLM / Kimi / MiniMax / DeepSeek / Hunyuan። | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [አገናኝ](https://cli.devin.ai) | የDevin CLI ሁለትዮሽ ፋይልን ይፈልጋል። ማረጋገጫ ለማድረግ `devin auth login` ያሂዱ፣ ወይም WINDSURF_API_KEYዎን ያቅርቡ። መጫኛ፦ https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [አገናኝ](https://devin.ai) | ማረጋገጫ ከተደረገበት የDevin ክፍለ ጊዜ ያለን የDevin API ቁልፍ ይለጥፉ። ቁልፍ የመላክ ተገኝነትና ደረጃዎች እንደ Devin ስሪትና መለያ ይለያያሉ። | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | በአቅራቢ ቅንብሮች ውስጥ የGHE ኢንስታንስ URLዎን (ለምሳሌ፣ https://ghe.company.com) ያስገቡ፣ ከዚያም በመሣሪያ ፍሰት ማረጋገጫ ያድርጉ። | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [አገናኝ](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth አልተዋቀረም። በhttps://gitlab.com/-/profile/applications ላይ OAuth መተግበሪያ በredirect URI http://localhost:20128/callback እና በ"ai_features read_user" ወሰኖች ይመዝግቡ፤ ከዚያ GITLAB_DUO_OAUTH_CLIENT_IDን (እና ከፈለጉ GITLAB_DUO_OAUTH_CLIENT_SECRETን) ያዘጋጁና እንደገና ያስጀምሩ። | -| `grok-cli` | `gc` | Grok Build | OAuth | — | በአሳሽዎ ይግቡ፣ ወይም ከGrok Build CLI የተገኘውን ~/.grok/auth.json (ወይም JWT የመዳረሻ ቶከን) ይለጥፉ፤ በሁለቱም መንገድ refresh_token በራስ-ሰር ይቀየራል። | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [አገናኝ](https://www.kimi.com/code?aff=omniroute) | በKimi Code CLI ላይ በሚጠቀሙበት ተመሳሳይ የKimi መለያ ይግቡ። OmniRoute የCLI OAuth ፍሰቱንና የKimi Coding Plan የመጨረሻ ነጥቦችን ይጠቀማል። | -| `kiro` | `kr` | Kiro AI | OAuth | — | ነፃ ደረጃ፦ በወር 50 ክሬዲቶች (~25K–100K ቶከኖች)። ⚠️ የKiro ToS የሦስተኛ ወገን proxy/harness አጠቃቀምን ይከለክላል። | -| `openference` | `of` | Openference | OAuth | [አገናኝ](https://openference.com) | ጥያቄዎችን በapi.openference.com በኩል ለማስተላለፍ በOpenference መለያዎ ይግቡ። ለኢንፈረንስ ንቁ ዕቅድ ያስፈልጋል — OAuth ማረጋገጫ ሊያደርግ ቢችልም ያለ ንቁ ዕቅድ 402 ሊመልስ ይችላል። | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [አገናኝ](https://trae.ai) | Trae በByteDance የተሠራ AI-ተወላጅ IDE (SOLO የርቀት ወኪል) ነው። በብቅ ባይ መስኮቱ በtrae.ai በኩል ፈቃድ ይስጡ፣ ወይም በsolo.trae.ai ይግቡና Cloud-IDE-JWTን (እንደ 'Authorization: Cloud-IDE-JWT ' የሚላክ፣ የ~14 ቀናት የቆይታ ጊዜ ያለው) እንደ የመዳረሻ ቶከን ይለጥፉ፤ web_id/biz_user_id/user_unique_id/scope/tenant/region በproviderSpecificData በኩል ይተላለፋሉ። ለተለጠፉ ቶከኖች headless እድሳት የለም — ጊዜያቸው ሲያልቅ እንደገና ይለጥፉ። | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [አገናኝ](https://x.ai) | እንደ Grok 4.5 ያሉ የapi.x.ai ሞዴሎችን ለመጠቀም በxAI ይግቡ። ይህ cli-chat-proxy.grok.comንና የgrok-build ሞዴል ተለዋጭ ስሞችን ከሚጠቀሙት የGrok Build JWT ክፍለ ጊዜዎች የተለየ ነው። | -| `zed` | `zd` | Zed IDE | OAuth | [አገናኝ](https://zed.dev) | Zed የLLM አቅራቢ ምስክርነቶችን (OpenAI, Anthropic, Google, Mistral, xAI) በOS ቁልፍ ማከማቻ ውስጥ ያስቀምጣል። በራስ-ሰር ለማግኘትና ለማስመጣት ከታች ያለውን የማስመጣት አዝራር ይጠቀሙ። | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [አገናኝ](https://zed.dev) | በZed መለያዎ (native-app መግቢያ) ይግቡ። OmniRoute የአንድ ጊዜ RSA ቁልፍ ጥንድ ያመነጫል እና ፈቃድ ለመስጠት zed.devን ይከፍታል — በርቀት/headless ጭነት ላይ የተገኘውን የ127.0.0.1 callback URL ከአሳሽዎ የአድራሻ አሞሌ ቀድተው እዚህ መልሰው ይለጥፉት። ከላይ ካለው የ'Zed IDE' ምስክርነት-ማስመጫ ግቤት የተለየ ነው፦ ይህ በZed ዕቅድዎ ሥር የAnthropic/OpenAI/Google/xAI ሞዴሎችን የሚያቀርበውን የZed የራሱን የሆስት ሞዴል ማሰባሰቢያ (cloud.zed.dev) በመጠቀም የውይይት ማጠናቀቂያዎችን proxy ያደርጋል። | +## ማረጋገጫ የማይፈልጉ አቅራቢዎች (ቁልፍ አያስፈልግም) (10) + +| ID | ተለዋጭ ስም | ስም | መለያዎች | ድረ ገጽ | ማስታወሻዎች | የመሣሪያ ጥሪ | +| ----------------------- | ---------- | ------------------------- | ----------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `aihorde` | `horde` | AI Horde | ማረጋገጫ የማይፈልግ | [አገናኝ](https://aihorde.net) | የAPI ቁልፍ አያስፈልግም — በAI Horde ሰነድ የተገለጸውን የማንነት ያልታወቀ ቁልፍ ይጠቀማል። ነፃ የaihorde.net ቁልፍ ማከል አማራጭ ሲሆን የሚያስገኘው ከፍ ያለ የወረፋ ቅድሚያ (kudos) ብቻ ነው። | — | +| `auggie` | `aug` | Augment (Auggie CLI) | ማረጋገጫ የማይፈልግ | [አገናኝ](https://augmentcode.com) | OmniRoute ምንም የAPI ቁልፍ አያከማችም። Auggie CLIን ይጫኑና በዚህ ማሽን ላይ `auggie login`ን ያስኪዱ፤ ከዚያ OmniRoute ለእያንዳንዱ ጥያቄ በአካባቢው ያስነሳዋል። | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | ማረጋገጫ የማይፈልግ | [አገናኝ](https://playground.ai.cloudflare.com) | ምንም የመግቢያ ማረጋገጫ አያስፈልግም — በተገላቢጦሽ ምሕንድስና በተተነተነ cf_agent WebSocket ፕሮቶኮል (Playwright ማጓጓዣ) ላይ የማንነት ያልታወቁ የአሳሽ ክፍለ-ጊዜዎችን ይጠቀማል። | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | ማረጋገጫ የማይፈልግ | [አገናኝ](https://developers.openai.com/codex/cli) | OmniRoute ምንም ቶከን አያከማችም። የCodex CLI app-server የራሱን የChatGPT መግቢያ (~/.codex/auth.json፣ በራስ-ሰር የሚታደስ) ያስተዳድራል። CLIው ገና ካልተረጋገጠ “Sign in with ChatGPT”ን ይጠቀሙ። | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | ማረጋገጫ የማይፈልግ | [አገናኝ](https://docs.devin.ai/work-with-devin/devin-cli) | ማረጋገጫው በተለየው የbridge volume ውስጥ ባለው ይፋዊ Devin CLI የሚተዳደር ነው። | የተመሰለ | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | ማረጋገጫ የማይፈልግ | [አገናኝ](https://duckduckgo.com/duckchat) | ምንም የመግቢያ ማረጋገጫ አያስፈልግም — DuckDuckGo AI Chat ስም-አልባና ነፃ ነው። | የተመሰለ | +| `opencode` | `oc` | OpenCode Free | ማረጋገጫ የማይፈልግ | [አገናኝ](https://opencode.ai) | የAPI ቁልፍ አያስፈልግም — የOpenCodeን ይፋዊ ነፃ endpoint ይጠቀማል። | — | +| `uncloseai` | `unc` | UncloseAI | ማረጋገጫ የማይፈልግ | [አገናኝ](https://uncloseai.com) | ማረጋገጫ አያስፈልግም። APIው ለመለያ ማንኛውንም ባዶ ያልሆነ ሕብረቁምፊ እንደ ቁልፍ ይቀበላል። የቆዩ አብሮገነብ ሞዴሎች 404 ከመለሱ፣ Available Models → Import from /models ወይም Auto-Syncን ይጠቀሙ፤ እየሠራ መሆኑ የተረጋገጠ ሞዴል፦ Lorbus/Qwen3.6-27B-int4-AutoRound። | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | ማረጋገጫ የማይፈልግ፣ ቪዲዮ | [አገናኝ](https://veoaifree.com) | ማረጋገጫ አያስፈልግም። በእያንዳንዱ IP በሰዓት እስከ 6 ጥያቄዎች የተገደበ ነው። | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | ማረጋገጫ የማይፈልግ | [አገናኝ](https://zcode.z.ai) | OmniRoute ምንም የAPI ቁልፍ አያከማችም። የአካባቢው ZCode app-server ነባሩን builtin:zai-coding-plan መግቢያ ይጠቀማል። | — | + +## OAuth አቅራቢዎች (24) + +| መታወቂያ | ተለዋጭ ስም | ስም | መለያዎች | ድረ ገጽ | ማስታወሻዎች | +| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [አገናኝ](https://antigravity.google) | የAntigravity CLI (`agy`) መግቢያዎን ያስመጡ (የቶከን ፋይሉን ይለጥፉ/ይስቀሉ)፣ የአካባቢያዊ CLI መግቢያን በራስ-ሰር ያግኙ፣ ወይም በGoogle ይግቡ። የAntigravity የጀርባ ስርዓትን (የClaude ሞዴሎችን ጨምሮ) ይጋራል። | +| `amazon-q` | `aq` | Amazon Q | OAuth | [አገናኝ](https://aws.amazon.com/q/developer/) | እንደ Kiro ተመሳሳዩን AWS Builder ID ወይም የመጣ የrefresh-token ፍሰት ይጠቀማል፣ ነገር ግን የAmazon Q ግንኙነቶችን ለይቶ ያስቀምጣል። | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [አገናኝ](https://cline.bot/cline-pass) | ClinePass 10 ክፍት የኮድ ማዘጋጃ ሞዴሎችን በአንድ ላይ የሚያቀርብ የCline $9.99/በወር የደንበኝነት ምዝገባ ነው። በCline መለያዎ (ከCline CLI/IDE ጋር ተመሳሳይ መግቢያ) ይግቡ፣ ወይም ቀጥተኛ የClinePass API ቁልፍ ይለጥፉ (app.cline.bot → ቅንብሮች → API ቁልፎች)። የClinePass የደንበኝነት ምዝገባ cline-pass/* ሞዴሎችን ይከፍታል። የCline WorkOS OAuth ፍሰትን እንደገና ይጠቀማል። | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [አገናኝ](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com)። በይፋዊው CLI የመሣሪያ-ኮድ ፍሰት ይግቡ፣ ወይም ቀጥተኛ API ቁልፍ ይለጥፉ (እንደ Authorization: Bearer ይላካል)። ካታሎግ፦ GLM / Kimi / MiniMax / DeepSeek / Hunyuan። | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [አገናኝ](https://cli.devin.ai) | የDevin CLI ሁለትዮሽ ፋይልን ይፈልጋል። ለማረጋገጥ `devin auth login` ያስኪዱ፣ ወይም WINDSURF_API_KEYዎን ያቅርቡ። ጭነት፦ https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [አገናኝ](https://devin.ai) | ከተረጋገጠ የDevin ክፍለ-ጊዜ ያለን ነባር የDevin API ቁልፍ ይለጥፉ። ቁልፍን ወደ ውጭ የመላክ ተገኝነትና ደረጃዎች እንደ Devin ስሪትና መለያ ይለያያሉ። | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | የGHE አብነት URLዎን (ለምሳሌ፣ https://ghe.company.com) በአቅራቢ ቅንብሮች ውስጥ ያስገቡ፣ ከዚያ በመሣሪያ ፍሰት ያረጋግጡ። | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [አገናኝ](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth አልተዋቀረም። በhttps://gitlab.com/-/profile/applications ላይ፣ የመመለሻ URIን http://localhost:20128/callback እና ወሰኖችን "ai_features read_user" በማድረግ የOAuth መተግበሪያ ይመዝግቡ፤ ከዚያ GITLAB_DUO_OAUTH_CLIENT_IDን (እና እንደ አማራጭ GITLAB_DUO_OAUTH_CLIENT_SECRETን) ያዘጋጁና እንደገና ያስጀምሩ። | +| `grok-cli` | `gc` | Grok Build | OAuth | — | በአሳሽዎ ይግቡ፣ ወይም ~/.grok/auth.jsonዎን (ወይም የJWT መዳረሻ ቶከኑን) ከGrok Build CLI ይለጥፉ፤ በሁለቱም መንገዶች refresh_token በራስ-ሰር ይቀየራል። | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [አገናኝ](https://www.kimi.com/code?aff=omniroute) | በKimi Code CLI ከሚጠቀሙበት ተመሳሳይ የKimi መለያ ይግቡ። OmniRoute የCLI OAuth ፍሰቱንና የKimi Coding Plan የመጨረሻ ነጥቦችን ይጠቀማል። | +| `kiro` | `kr` | Kiro AI | OAuth | — | ነጻ ደረጃ፦ 50 ክሬዲቶች/በወር (~25K–100K ቶከኖች)። ⚠️ የKiro ToS የሶስተኛ ወገን proxy/harness አጠቃቀምን ይከለክላል። | +| `openference` | `of` | Openference | OAuth | [አገናኝ](https://openference.com) | ጥያቄዎችን በapi.openference.com በኩል ለማስተላለፍ በOpenference መለያዎ ይግቡ። የQwen3.8 27b እና Llama 3.2 3B የነጻ-ደረጃ መዳረሻን ያካትታል — የአሁኑን የእቅድ ውሎች ለማየት openference.com/pricingን ይመልከቱ። | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [አገናኝ](https://trae.ai) | Trae በByteDance የተሰራ AI-ተወላጅ IDE (SOLO የርቀት ወኪል) ነው። በብቅ ባዩ ውስጥ በtrae.ai በኩል ፈቃድ ይስጡ፣ ወይም በsolo.trae.ai ይግቡና Cloud-IDE-JWTን (እንደ 'Authorization: Cloud-IDE-JWT ' ይላካል፣ የ~14-ቀን የሚቆይ) እንደ መዳረሻ ቶከን ይለጥፉ፤ web_id/biz_user_id/user_unique_id/scope/tenant/region በproviderSpecificData በኩል ይተላለፋሉ። ለተለጠፉ ቶከኖች ያለ በይነገጽ እድሳት የለም — ሲያልቅ እንደገና ይለጥፉ። | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [አገናኝ](https://x.ai) | እንደ Grok 4.5 ያሉ api.x.ai ሞዴሎችን ለመጠቀም በxAI ይግቡ። ይህ cli-chat-proxy.grok.comንና grok-build የሞዴል ተለዋጭ ስሞችን ከሚጠቀሙት የGrok Build JWT ክፍለ-ጊዜዎች የተለየ ነው። | +| `zed` | `zd` | Zed IDE | OAuth | [አገናኝ](https://zed.dev) | Zed የLLM አቅራቢ ማረጋገጫዎችን (OpenAI፣ Anthropic፣ Google፣ Mistral፣ xAI) በOS ቁልፍ ማከማቻ ውስጥ ያስቀምጣል። እነሱን በራስ-ሰር ለማግኘትና ለማስመጣት ከታች ያለውን የማስመጣት አዝራር ይጠቀሙ። | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [አገናኝ](https://zed.dev) | በZed መለያዎ ይግቡ (የቤተኛ-መተግበሪያ መግቢያ)። OmniRoute አንድ ጊዜ ብቻ የሚያገለግል RSA የቁልፍ ጥንድ ይፈጥራልና ፈቃድ ለመስጠት zed.devን ይከፍታል — በርቀት/ያለ በይነገጽ ጭነት ላይ፣ የተገኘውን የ127.0.0.1 መመለሻ URL ከአሳሽዎ የአድራሻ አሞሌ ገልብጠው እዚህ ይለጥፉት። ይህ ከላይ ካለው የ'Zed IDE' ማረጋገጫ-ማስመጣት ግቤት የተለየ ነው፦ የውይይት ማጠናቀቂያዎችን በZed የራሱ የተስተናገደ የሞዴል አሰባሳቢ (cloud.zed.dev) በኩል በproxy ያስተላልፋል፣ በZed እቅድዎ ስር ያሉ Anthropic/OpenAI/Google/xAI ሞዴሎችን ከፊት ሆኖ ያቀርባል። | ## የድር ኩኪ አቅራቢዎች (34) @@ -117,250 +117,250 @@ ## የAPI ቁልፍ አቅራቢዎች (የሚከፈልባቸው / ከነፃ ክሬዲቶች ጋር የሚከፈልባቸው) (242) -| ID | ተለዋጭ ስም | ስም | መለያዎች | ድረ ገጽ | ማስታወሻዎች | -| ------------------------ | --------------- | ------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | የAPI ቁልፍ | [አገናኝ](https://ai.360.cn) | የAPI ቁልፍን ከ ai.360.cn ያግኙ | -| `agentrouter` | `agentrouter` | AgentRouter | የAPI ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://agentrouter.org) | ሲመዘገቡ $200 ነፃ ክሬዲት — የባለብዙ ሞዴል ማዞሪያ ጌትዌይ | -| `agnes` | `agnes` | Agnes AI | የAPI ቁልፍ፣ ቪዲዮ | [አገናኝ](https://agnes-ai.com) | የAPI ቁልፍን ከ agnes-ai.com ያግኙ | -| `agnes-cn` | `agnescn` | Agnes AI (ቻይና) | የAPI ቁልፍ | [አገናኝ](https://api.agnes-ai.cn) | የAPI ቁልፍን ከ Agnes CN ጣቢያ ያግኙ። | -| `ai21` | `ai21` | AI21 Labs | የAPI ቁልፍ | [አገናኝ](https://www.ai21.com) | ሲመዘገቡ $10 የሙከራ ክሬዲት (ለ3 ወራት የሚያገለግል)፣ የክሬዲት ካርድ አያስፈልግም | -| `aimlapi` | `aiml` | AI/ML API | የAPI ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://aimlapi.com) | ነፃው ደረጃ ለጊዜው ቆሟል (2026) — AI/ML API አሁን የሚጠቀሙትን ያህል ክፍያ ብቻ ይጠይቃል (ዝቅተኛው $20 መሙላት)፤ ተደጋጋሚ ነፃ ክሬዲቶች የሉም። | -| `ainative` | `ainative` | AINative Studio | የAPI ቁልፍ | [አገናኝ](https://ainative.studio) | በ ainative.studio ነፃ የAPI ቁልፍ ይፍጠሩ (ካርድ አያስፈልግም)፣ ከዚያም እዚህ እንደ Bearer ቶከን ይለጥፉት። | -| `aion` | `aion` | Aion Labs | የAPI ቁልፍ | [አገናኝ](https://www.aionlabs.ai) | በ aionlabs.ai ነፃ የAPI ቁልፍ ይፍጠሩ (ካርድ አያስፈልግም)፣ ከዚያም እዚህ እንደ Bearer ቶከን ይለጥፉት። | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | የAPI ቁልፍ | [አገናኝ](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (ቻይና) | የAPI ቁልፍ | [አገናኝ](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | የAPI ቁልፍ | [አገናኝ](https://developer.ant-ling.com/en/docs/) | በ Ant Ling API ኮንሶል (https://chat.ant-ling.com/open) ይመዝገቡና የAPI ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ ይለጥፉት። OmniRoute የውይይት ትራፊክን ወደ https://api.ant-ling.com/v1/chat/completions ያዞራል፤ አቅራቢው ከOpenAI ጋር ተኳሃኝ ሲሆን ከAnthropic ጋር ተኳሃኝ የሆነ በይነገጽም ያቀርባል። | -| `anthropic` | `anthropic` | Anthropic | የAPI ቁልፍ | [አገናኝ](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | የAPI ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://anyapi.ai) | ነፃ ዕቅድ፦ ብቁ ለሆኑ Free/Basic ሞዴሎች በቀን 100,000 ANY ቶከኖች እና 100 RPM፤ የክሬዲት ካርድ አያስፈልግም። | -| `api-airforce` | `af` | Api.airforce | የAPI ቁልፍ | [አገናኝ](https://api.airforce) | Grok-3፣ Claude 3.7፣ Qwen3፣ Kimi-K2፣ Gemini 2.5 Flash እና DeepSeek-V3ን ጨምሮ 55 የነፃ ደረጃ ሞዴሎች | -| `arcee-ai` | `arcee` | Arcee AI | የAPI ቁልፍ | [አገናኝ](https://arcee.ai) | የAPI ቁልፍን ከ arcee.ai ያግኙ | -| `auriko` | `auriko` | Auriko | የAPI ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.auriko.ai) | ነፃው ዕቅድ 1,000 Platform RPM እና 10,000 BYOK RPM ይሰጣል። የPlatform ኢንፈረንስ አሁንም የአቅራቢውን ወጪ ያስከትላል፤ ይህ ነፃ የቶከን ክምችት ወይም ገደብ የሌለው ነፃ ኢንፈረንስ አይደለም። | -| `azure-ai` | `azure-ai` | Azure AI Foundry | የAPI ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://learn.microsoft.com/azure/ai-foundry) | የAzure AI Foundry ቁልፍዎን ይጠቀሙ። መሠረታዊ URL https://.services.ai.azure.com/openai/v1/ ወይም https://.openai.azure.com/openai/v1/ ሊሆን ይችላል። | -| `azure-openai` | `azure` | Azure OpenAI | የAPI ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://azure.microsoft.com/products/ai-services/openai-service) | የAzure OpenAI API ቁልፍዎን ይጠቀሙ። መሠረታዊ URL የሪሶርስዎ የመጨረሻ ነጥብ መሆን አለበት፤ ለምሳሌ https://my-resource.openai.azure.com። | -| `bai` | `bai` | b.ai | የAPI ቁልፍ | [አገናኝ](https://b.ai) | ከOpenAI ጋር ተኳሃኝ ለሆነው የb.ai LLM ጌትዌይ (ከTheB.AI የተለየ) የBearer API ቁልፍ። በ https://docs.b.ai ቁልፍ ይፍጠሩ፣ ከዚያም https://api.b.ai/v1ን ከOpenAI ጋር ተኳሃኝ እንደሆነ መሠረታዊ URL ይጠቀሙ። | -| `baichuan` | `baichuan` | Baichuan | የAPI ቁልፍ | [አገናኝ](https://www.baichuan-ai.com/) | የAPI ቁልፍን ከ platform.baichuan-ai.com ያግኙ | -| `baidu` | `baidu` | Baidu (ERNIE) | የAPI ቁልፍ | [አገናኝ](https://ernie.baidu.com/) | የAPI ቁልፍን ከ console.bce.baidu.com ያግኙ | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | የAPI ቁልፍ | [አገናኝ](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | የAPI ቁልፍ | [አገናኝ](https://baseten.co) | ለGPU ኢንፈረንስ $30 ነፃ የሙከራ ክሬዲት | -| `bazaarlink` | `bzl` | BazaarLink | የAPI ቁልፍ | [አገናኝ](https://bazaarlink.ai) | የBazaarLink API ቁልፍዎን (በ sk-bl- የሚጀምር) በ Authorization: Bearer ውስጥ ይጠቀሙ። OpenAI SDK ከመሠረታዊ URL https://bazaarlink.ai/api/v1 ጋር ይሰራል። ሞዴሎች የ provider/model-name ቅርጸትን ይጠቀማሉ። | -| `bedrock` | `bedrock` | Amazon Bedrock | የAPI ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://aws.amazon.com/bedrock) | የAmazon Bedrock API ቁልፍዎን ይጠቀሙ እና ሞዴሎችዎ የነቁበትን የAWS ክልል ያዋቅሩ (ለምሳሌ eu-west-2)። OmniRoute የBedrockን ቤተኛ Converse API በቀጥታ ይጠራል። | -| `black-forest-labs` | `bfl` | Black Forest Labs | የAPI ቁልፍ፣ ምስል | [አገናኝ](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | የAPI ቁልፍ | [አገናኝ](https://blackbox.ai) | ⚠️ **ጊዜው ያለፈበት።** api.blackbox.ai በሁሉም የዱካ ልዩነቶች HTTP 404 ይመልሳል (ምርመራ 2026-08-21)፤ የሕዝብ ኢንፈረንስ በይነገጹ ወደ የተገደበው enterprise.blackbox.ai/v1 የመጨረሻ ነጥብ ተዛውሯል። | -| `bluesminds` | `bm` | BluesMinds | የAPI ቁልፍ | [አገናኝ](https://www.bluesminds.com) | ነፃ ዕለታዊ pi ክሬዲቶች — GPT-4o፣ GPT-4.1፣ Claude Sonnet 4.5፣ Gemini 2.0 Flash፣ DeepSeek V4፣ Qwen እና Kimi K2ን ጨምሮ ከ200 በላይ ሞዴሎችን ይደግፋል | -| `byteplus` | `bpm` | BytePlus ModelArk | የAPI ቁልፍ | [አገናኝ](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | የAPI ቁልፍ | [አገናኝ](https://bytez.com) | $1 ነፃ ክሬዲት፣ በየ4 ሳምንቱ ይታደሳል | -| `cerebras` | `cerebras` | Cerebras | የAPI ቁልፍ | [አገናኝ](https://inference.cerebras.ai) | የአንድ ጊዜ $5 የምዝገባ ክሬዲት (ለ30 ቀናት የሚያገለግል)፤ የክፍያ ዘዴ ያስፈልጋል። ተደጋጋሚ ነፃ ደረጃ አይደለም። | -| `charm-hyper` | `charm-hyper` | Charm Hyper | የAPI ቁልፍ | [አገናኝ](https://hyper.charm.land) | ሲመዘገቡ በየወሩ 100 ነፃ Hypercredits | -| `chat-oripe` | `chat-oripe` | Chat Oripe | የAPI ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://api.oriper.com) | ይፋዊው ሜታዳታ በወር 2M ቶከኖችን ያስተዋውቃል፣ ነገር ግን በኦዲቱ ወቅት የሕዝብ ጣቢያው እና ሰነዶቹ ታግደው ነበር፤ ኮታውንና የምርት ስም ማዛመዱን እንዳልተረጋገጡ ይቁጠሩ። | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://chatanywhere.tech) | ለግል፣ ለትምህርት ወይም ለምርምር አጠቃቀም ብቻ፦ ይፋዊ ሰነዶቹ በቀን 10,000 ነጥቦችን እና ለእያንዳንዱ IP/ቁልፍ በቀን 200 ጥያቄዎችን ይጠቅሳሉ፤ ለንግድ ትራፊክ አይጠቀሙበት። | -| `cheaperinference` | `cinf` | Cheaper Inference | API ቁልፍ | [አገናኝ](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API ቁልፍ | [አገናኝ](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://chutes.ai) | ከ OpenAI ጋር ተኳሃኝ ለሆነው የChutes ጌትዌይ Bearer API ቁልፍ። | -| `clarifai` | `clarifai` | Clarifai | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://docs.clarifai.com) | የClarifai PATዎን ወይም ለመተግበሪያው የተወሰነ API ቁልፍ ይጠቀሙ። OmniRoute ከ OpenAI ጋር ተኳሃኝ የሆነውን በ https://api.clarifai.com/v2/ext/openai/v1 ያለውን መዳረሻ ያነጣጥራል እና Authorization: Key በመጠቀም ማረጋገጫ ያደርጋል። | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://cloudcode.one) | የታተሙት ነፃ ሞዴሎች glm-4.7-flash እና glm-4.6v-flashን ያካትታሉ፤ የቁጥር ኮታ አልታተመም፣ እና ቁልፍ መፍጠር ክሬዲት ወይም ኩፖን ሊያስፈልገው ይችላል። | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API ቁልፍ | [አገናኝ](https://developers.cloudflare.com/workers-ai) | API Token እና Account ID (በ dash.cloudflare.com የሚገኝ) ሁለቱንም ይፈልጋል | -| `clova-studio` | `clova` | Naver CLOVA Studio | API ቁልፍ | [አገናኝ](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API ቁልፍ | [አገናኝ](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API ቁልፍ | [አገናኝ](https://cohere.com) | ነፃ ሙከራ፦ ለሙከራ በወር 1,000 API ጥሪዎች፣ የክሬዲት ካርድ አያስፈልግም | -| `command-code` | `cmd` | Command Code | API ቁልፍ | [አገናኝ](https://commandcode.ai/) | የCommand Code API ቁልፍ ይጠቀሙ። ጥያቄዎች ወደ Command Code /provider/v1/chat/completions መዳረሻ ይላካሉ። | -| `coze` | `coze` | Coze | API ቁልፍ | [አገናኝ](https://coze.com) | API ቁልፍን ከ coze.com/open/api ያግኙ | -| `crof` | `crof` | CrofAI | API ቁልፍ | [አገናኝ](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API ቁልፍ | [አገናኝ](https://cursor.com/dashboard/api) | ከ cursor.com/dashboard/api የCursor ተጠቃሚ API ቁልፍ (crsr_...) ይለጥፉ። OmniRoute በተፈለገ ጊዜ ወደ የክፍለ-ጊዜ ቶከን ይለውጠዋል፤ IDE ወይም cursor-agent መጫን አያስፈልግም። የአጠቃቀም ክፍያው ቁልፉን በያዘው የCursor ዕቅድ ላይ ይከፈላል። | -| `dahl` | `dahl` | Dahl | API ቁልፍ | [አገናኝ](https://inference.dahl.global) | ቶከን በራስ-ሰር ለማመንጨት 'Add Account'ን ጠቅ ያድርጉ፣ ወይም API ቁልፍን በእጅ ያክሉ። | -| `databricks` | `databricks` | Databricks | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://docs.datarobot.com) | የDataRobot API ቶከንዎን ይጠቀሙ። አማራጭ Base URL የመለያው መነሻ (ለ LLM Gateway) ወይም በ /api/v2/deployments/ ስር ያለ የማሰማሪያ URL ሊሆን ይችላል። | -| `deepai` | `deepai` | DeepAI | API ቁልፍ፣ ምስል | [አገናኝ](https://deepai.org) | የDeepAI API ቁልፍዎን ይጠቀሙ። ከ deepai.org ያግኙ — የPro ደንበኝነት ምዝገባ ($9.99/ወር) ያስፈልጋል። | -| `deepinfra` | `deepinfra` | DeepInfra | API ቁልፍ | [አገናኝ](https://deepinfra.com) | ለAPI ሙከራ እና ሞዴል አሰሳ ሲመዘገቡ ነፃ ክሬዲቶች | -| `deepseek` | `ds` | DeepSeek | API ቁልፍ | [አገናኝ](https://platform.deepseek.com) | ሲመዘገቡ 5M ነፃ ቶከኖች — የክሬዲት ካርድ አያስፈልግም | -| `dgrid` | `dgrid` | DGrid | API ቁልፍ | [አገናኝ](https://dgrid.ai) | DGrid ነፃ ሞዴሎች ራውተር፦ በደቂቃ 10 ጥያቄዎች እና በቀን 100 ጥያቄዎች። የዕድሜ ልክ $5 ተጨማሪ ክፍያ እስከ በደቂቃ 20 ጥያቄዎች እና በቀን 1,000 ጥያቄዎች ድረስ ይከፍታል። | -| `dify` | `dify` | Dify | API ቁልፍ | [አገናኝ](https://dify.ai) | API ቁልፍን ከDify ኢንስታንስዎ ያግኙ። | -| `digitalocean` | `digitalocean` | DigitalOcean | API ቁልፍ | [አገናኝ](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API ቁልፍ | [አገናኝ](https://dit.ai) | የdit.ai API ቁልፍዎን በ Authorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ ከ OpenAI ጋር ተኳሃኝ ነው — በቀጥታ የሚተካ ሲሆን፣ base URLን ወደ https://api.dit.ai/v1 ብቻ ይቀይሩ። | -| `doubao` | `doubao` | Doubao | API ቁልፍ | [አገናኝ](https://doubao.com) | API ቁልፍን ከ console.volcengine.com ያግኙ | -| `dxnt` | `dxnt` | DXNT / DX Token | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://www.dxnt.com) | ነፃ መለያዎች በቀን 100 ጥሪዎች እንዳላቸው ተመዝግቧል፤ ኮታው በግብዣዎች ሊጨምር እና እንደ መለያው ሊለያይ ይችላል። | -| `electronhub` | `electronhub` | Electron Hub | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://www.electronhub.ai) | ነፃ ዕቅድ፦ 5 RPM፣ በሳምንት $0.25 ክሬዲት እና ለ :free ሞዴሎች በቀን 10 Neutrinos፤ የቤተሰብ በጀቶችም ተፈጻሚ ይሆናሉ። | -| `empower` | `empower` | Empower | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://docs.empower.dev) | ከ OpenAI ጋር ተኳሃኝ ለሆነው የEmpower መዳረሻ Bearer API ቁልፍ። | -| `eurouter` | `eurouter` | EURouter | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API ቁልፍ | [አገናኝ](https://factory.ai) | ከ OpenAI ጋር ተኳሃኝ ለሆነው የFactory ጌትዌይ Bearer API ቁልፍ። | -| `fal-ai` | `fal` | Fal.ai | API ቁልፍ፣ ምስል | [አገናኝ](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://fastrouter.ai) | :free ቅጥያ ያላቸው ሞዴሎች ለእያንዳንዱ ድርጅት እና ሞዴል በቀን 10 ጥያቄዎችን ይፈቅዳሉ፤ ተገኝነቱ ሊቀየር ይችላል። | -| `featherless-ai` | `featherless` | Featherless AI | API ቁልፍ | [አገናኝ](https://featherless.ai) | ነፃ ደረጃ ይገኛል — የክሬዲት ካርድ አያስፈልግም | -| `fenayai` | `fenayai` | FenayAI | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://fenayai.com) | ከ OpenAI ጋር ተኳሃኝ ለሆነው የFenayAI ጌትዌይ Bearer API ቁልፍ። | -| `fireworks` | `fireworks` | Fireworks AI | API ቁልፍ | [አገናኝ](https://fireworks.ai) | ለAPI ሙከራ ሲመዘገቡ $1 ነፃ የመጀመሪያ ክሬዲት | -| `free-ai` | `free-ai` | Free.ai | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://free.ai) | ኢሜይል ከተረጋገጠ በኋላ በቀን 30,000 ቶከኖች በራስ የሚስተናገዱ ሞዴሎችን ይሸፍናሉ። ከዚህ ስብስብ በላይ ያለ አጠቃቀም በቀጥታ ወጪ ሊከፈልበት ይችላል፣ እና ፕሪሚየም ውጫዊ ሞዴሎች የሚከፈልባቸው ናቸው። | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API ቁልፍ | [አገናኝ](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API ቁልፍ | [አገናኝ](https://freebuff.com) | የFreebuff / Codebuff ማረጋገጫ ቶከን ያስገቡ (በCLI መግቢያ ወይም በራስ-ሰር ሰብሳቢ የተገኘ)። | -| `freeinference` | `freeinference` | FreeInference | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://freeinference.org) | ያለ ካርድ ነፃ የምርምር መዳረሻ፤ ከHarvard ውጭ ያሉ አመልካቾች በእጅ ማጽደቅ ይፈልጋሉ፣ እንዲሁም ምንም የቁጥር ኮታ በይፋ ዋስትና አልተሰጠውም። | -| `freemodel-dev` | `fmd` | FreeModel.dev | API ቁልፍ | [አገናኝ](https://freemodel.dev) | ሲመዘገቡ $300 ነፃ ክሬዲት — የብድር ካርድ አያስፈልግም። GPT-5.4 እና GPT-5.5ን (የOpenAI የቅርብ ጊዜ ዋና ሞዴሎች) ከOpenAI ጋር ተኳሃኝ በሆነ API በኩል ይድረሱባቸው። | -| `freetheai` | `fta` | FreeTheAi | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://freetheai.xyz) | ነፃ API ቁልፍዎን ለማግኘት የFreeTheAi Discordን ይቀላቀሉ። | -| `friendliai` | `friendli` | FriendliAI | API ቁልፍ | [አገናኝ](https://friendli.ai) | አገልጋይ-አልባ ኢንፈረንስ ነፃ ደረጃ — የብድር ካርድ አያስፈልግም | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | ስም-አልባ የኬክ ክሬዲቶችን በg4f.dev/chat ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ይፍጠሩ)። | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | ስም-አልባ የኬክ ክሬዲቶችን በg4f.dev/chat ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ይፍጠሩ)። | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | ስም-አልባ የኬክ ክሬዲቶችን በg4f.dev/chat ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ይፍጠሩ)። | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | ስም-አልባ የኬክ ክሬዲቶችን በg4f.dev/chat ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ይፍጠሩ)። | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | ስም-አልባ የኬክ ክሬዲቶችን በg4f.dev/chat ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ይፍጠሩ)። | -| `galadriel` | `galadriel` | Galadriel | API ቁልፍ | [አገናኝ](https://galadriel.com) | ⚠️ **ጥቅም ላይ አይውልም።** api.galadriel.ai ከእንግዲህ አይፈታም (ፍተሻ 2026-06-19)፤ የኢንፈረንስ APIው የተቋረጠ ይመስላል። | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API ቁልፍ | [አገናኝ](https://aistudio.google.com) | ነፃ ደረጃ በGoogle AI Studio በኩል ይገኛል፤ የአሁኑ የእያንዳንዱ ሞዴል ኮታዎችና ክልላዊ ገደቦች ተፈጻሚ ይሆናሉ | -| `getgoapi` | `ggo` | GoAPI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API ቁልፍ | [አገናኝ](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API ቁልፍ | [አገናኝ](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | ለይፋዊው Code Suggestions API የGitLab የግል መዳረሻ ቶከን። gitlab.comን በማይጠቀሙበት ጊዜ በራስዎ የሚስተናገድ መሠረታዊ URL ያዋቅሩ። | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API ቁልፍ | [አገናኝ](https://opengateway.gitlawb.com) | ነፃ MiMo (xiaomi/mimo-v2.5) በ2026-05 ተሰርዟል — Opengateway አሁን በተጠቀሙት መጠን የሚከፈልበት የክሬዲት ጌትዌይ ነው፤ ተደጋጋሚ ነፃ ሞዴል የለም። | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API ቁልፍ | [አገናኝ](https://opengateway.gitlawb.com) | የነፃ Nemotron ማስተዋወቂያ በ2026-06 አብቅቷል — የGMI Cloud መስመር አሁን በተጠቀሙት መጠን የሚከፈል ክሬዲት ብቻ ነው። | -| `glm` | `glm` | GLM Coding | API ቁልፍ | [አገናኝ](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (ቻይና) | API ቁልፍ | [አገናኝ](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API ቁልፍ | [አገናኝ](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API ቁልፍ | [አገናኝ](https://greenpt.com) | የAPI ምዝገባ መፍጠር ነፃ ነው፤ ኢንፈረንስ በእያንዳንዱ ቶከን ይከፈላል። ምንም ነፃ የኢንፈረንስ ፈቃድ አልታተመም። | -| `groq` | `groq` | Groq | API ቁልፍ | [አገናኝ](https://groq.com) | ነፃ ዕቅድ፦ የእያንዳንዱ ሞዴል ገደቦች (ለእያንዳንዱ የውይይት ሞዴል 200K ቶከኖች/ቀን፤ ለRPM/RPD console.groq.com/docs/rate-limitsን ይመልከቱ) — በመዝገብ ላይ ምንም የክፍያ ዘዴ የለም። | -| `haiper` | `hp` | Haiper | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://haiper.ai) | API ቁልፍን በhaiper.ai/haiper-api ያግኙ | -| `hcnsec` | `hcnsec` | Huancheng Public API | API ቁልፍ | [አገናኝ](https://api.hcnsec.cn) | API ቁልፍን በapi.hcnsec.cn ያግኙ | -| `helixmind` | `helixmind` | HelixMind | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://helixmind.online) | ቀደም ሲል ይሰራጩ የነበሩት የ3 RPM/50 RPD እና ካርድ-አልባ ይገኛል የሚሉ መግለጫዎች በ2026-08-02 ኦዲት ወቅት አልተረጋገጡም፤ የአሁኑ ኮታና ክፍያ የመለያ ማረጋገጫ ይፈልጋሉ። | -| `helyxai` | `helyxai` | Helyx AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://helyxai.space) | ተግባራዊው ነፃ ዕቅድ 100,000 ቶከኖች/ቀን እንደሚሰጥ ይገልጻል፤ የጣቢያው የተለየ የ2M+ የገበያ ማስተዋወቂያ መግለጫ ከዚህ ጋር ይጋጫል፣ ስለዚህ እንደ ኮታ ዋስትና አይቆጠርም። | -| `heroku` | `heroku` | Heroku AI | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API ቁልፍ | [አገናኝ](https://huggingface.co) | ለበርካታ ሺህ ሞዴሎች ነፃ Inference API (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API ቁልፍ | [አገናኝ](https://hyperbolic.xyz) | ለአገልጋይ-አልባ ኢንፈረንስ ሲመዘገቡ $1-5 የሙከራ ክሬዲት | -| `ideogram` | `ideo` | Ideogram | API ቁልፍ | [አገናኝ](https://ideogram.ai) | API ቁልፍን በideogram.ai/docs/api ያግኙ | -| `iflytek` | `iflytek` | iFlytek Spark | API ቁልፍ | [አገናኝ](https://xinghuo.xfyun.cn) | API ቁልፍን በconsole.xfyun.cn ያግኙ | -| `inception` | `inception` | Inception | API ቁልፍ | [አገናኝ](https://docs.inceptionlabs.ai) | ሲመዘገቡ 10M ነፃ ቶከኖች፣ የብድር ካርድ አያስፈልግም። | -| `inference-net` | `inet` | Inference.net | API ቁልፍ | [አገናኝ](https://inference.net) | ሲመዘገቡ $25 ነፃ ክሬዲት፣ በተጨማሪም የምርምር ድጎማዎች ይገኛሉ | -| `internlm` | `internlm` | InternLM (Intern-S1) | API ቁልፍ | [አገናኝ](https://internlm.intern-ai.org.cn/) | ነፃ ወርሃዊ ኮታ ~1M የግቤት / 3M የውጤት ቶከኖች (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API ቁልፍ፣ embed/rerank | [አገናኝ](https://jina.ai) | ለ api.jina.ai የBearer API ቁልፍ — embeddings፣ rerank፣ classify፣ segment እና search። የDashboard ቁልፎች ከ JINA_AI_API_KEY ቅድሚያ ያገኛሉ። ይህ የReader / r.jina.ai ካርድ አይደለም፣ URLsንም አያመጣም። | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API ቁልፍ | [አገናኝ](https://jina.ai/reader) | ለ r.jina.ai URL-to-markdown (/v1/web/fetch ብቻ) የBearer API ቁልፍ። /v1/embeddings ወይም /v1/rerankን አያቀርብም። ከFoundation API ጋር ተመሳሳዩ የJina token ይሰራል፤ ይህ ካርድ ባዶ ሲሆን OmniRoute የjina-ai dashboard ቁልፍን ወይም JINA_AI_API_KEYን እንደገና ይጠቀማል። | -| `kenari` | `kenari` | Kenari | API ቁልፍ | [አገናኝ](https://kenari.id) | የKenari API ቁልፍዎን (kn-...) በAuthorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ ከOpenAI ጋር ተኳሃኝ ነው። የAPI መሠረት URL፦ https://kenari.id/v1። | -| `kie` | `kie` | KIE.AI | API ቁልፍ | [አገናኝ](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (የቀድሞ Moonshot API) | API ቁልፍ | [አገናኝ](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API ቁልፍ | [አገናኝ](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API ቁልፍ | [አገናኝ](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://leonardo.ai) | API ቁልፍን ከ leonardo.ai/developer ያግኙ | -| `liquid` | `liquid` | Liquid AI | API ቁልፍ | [አገናኝ](https://liquid.ai) | API ቁልፍን ከ liquid.ai ያግኙ | -| `literouter` | `literouter` | LiteRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://literouter.com) | ነፃ የmodel ልዩነቶች የ :free ቅጥያን ይጠቀማሉ፤ የዕለታዊ credit ገደቦች እንደ model ይለያያሉ፣ ነፃ inputም በ5,000 tokens የተገደበ ነው። | -| `llamagate` | `llamagate` | LlamaGate | API ቁልፍ | [አገናኝ](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://llm.kiwi) | ነፃው ዕቅድ auto እና hrLLMን ያቀርባል፤ በይፋ የታተመው በሰዓት 40 requests ገደብ በhrLLM ላይ ይተገበራል። | -| `llm7` | `llm7` | LLM7.io | API ቁልፍ | [አገናኝ](https://llm7.io) | ባዶ ያልሆነ ማንኛውንም ቁልፍ (ለምሳሌ 'unused') ይጠቀሙ። የቆዩ አብሮገነብ models model_unavailableን ከመለሱ፣ Available Models → Import from /models ወይም Auto-Syncን ይጠቀሙ፤ በቀጥታ ስርጭት የተረጋገጠ model፦ gemini-3.1-flash-lite። | -| `llmgateway` | `llmgateway` | LLM Gateway | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://llmgateway.io) | የHosted Free ዕቅድ፦ መለያው credits በማይኖረው ጊዜ ነፃ ዋጋ ያላቸው models በ10 ደቂቃ ውስጥ በ5 requests የተገደቡ ናቸው። | -| `logfare` | `logfare` | Logfare | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://logfare.ai) | ፈጣን API ቁልፍ ለማግኘት በ https://logfare.ai/register ነፃ መለያ (username/password፣ የemail ማረጋገጫ ሳያስፈልግ) ይፍጠሩ፣ ከዚያም እዚህ እንደ Bearer token ይለጥፉት። | -| `longcat` | `lc` | LongCat AI | API ቁልፍ | [አገናኝ](https://longcat.chat/platform/docs) | ነፃ፦ መለያ ከተመዘገበ እና KYC ከተረጋገጠ በኋላ የአንድ ጊዜ የ10M-token ድጎማ (LongCat-2.0)። ለአንድ ጊዜ ብቻ ነው — በየቀኑ/በየወሩ የሚደጋገም ፈቃድ አይደለም። | -| `magnific` | `freepik` | Magnific | API ቁልፍ፣ ምስል | [አገናኝ](https://www.magnific.com) | API ቁልፍን ከ magnific.com/user/api-keys (header x-magnific-api-key) ያግኙ። የቀድሞ Freepik developer ቁልፎች አሁንም ይሰራሉ። | -| `maritalk` | `maritalk` | Maritalk | API ቁልፍ | [አገናኝ](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://meganova.ai) | ያለ ካርድ ነፃ ምዝገባ። በይፋ የታተሙት የTier 1 በmodel የሚታዩ ኮታዎች በድምሩ 550 requests/day ናቸው፤ የጋራ global pool አይደሉም፣ እና ከነቃ የሚከፈልበት ትርፍ አጠቃቀም ሊተገበር ይችላል። | -| `meta-llama` | `meta` | Meta Llama API | API ቁልፍ | [አገናኝ](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (ቻይና) | API ቁልፍ | [አገናኝ](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API ቁልፍ | [አገናኝ](https://mistral.ai) | ነፃ Experiment tier፦ በrate limit የተገደበ የሁሉም models መዳረሻ፣ credit card አያስፈልግም | -| `mixedbread` | `mxbai` | Mixedbread AI | API ቁልፍ | [አገናኝ](https://www.mixedbread.com) | ለMixedbread embeddings API የBearer API ቁልፍ። | -| `mixlayer` | `mixlayer` | Mixlayer | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.mixlayer.com) | qwen/qwen3.5-4b-free model ለprototype ሥራ ነፃ ሲሆን rate limit አለው፤ የተወሰነ ይፋዊ RPM ወይም ዕለታዊ ኮታ አልተረጋገጠም። | -| `mnn-ai` | `mnn-ai` | MNN AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://mnnai.ru) | ነፃ ዕቅድ፦ በወር $1 credits፣ 10 RPM እና Free ተብለው ምልክት የተደረገባቸው models ብቻ መዳረሻ። | -| `modal` | `mdl` | Modal | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://modal.com/docs) | ከነቃ፣ የModal deploymentዎን የሚጠብቀውን bearer token ይጠቀሙ። Base URL ከOpenAI ጋር ተኳሃኝ ወደሆነው የModal appዎ ማመልከት አለበት፣ ለምሳሌ https://--.modal.run/v1። | -| `modelscope` | `ms` | ModelScope | API ቁልፍ | [አገናኝ](https://modelscope.cn) | ነፃ tier በModelScope API-Inference በኩል — የAlibaba መለያ ያስፈልጋል። | -| `monsterapi` | `monster` | MonsterAPI | API ቁልፍ | [አገናኝ](https://monsterapi.ai) | ⚠️ **ጥቅም ላይ ከመዋል የተቋረጠ።** Monster API በ2026-06-30 ሥራውን አቁሟል። ከOpenAI ጋር ተኳሃኝ የሆኑ አማራጭ providersን ይጠቀሙ። | -| `moonshot` | `moonshot` | Kimi | API ቁልፍ | [አገናኝ](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API ቁልፍ | [አገናኝ](https://morphllm.com) | ነፃ tier፦ 250K credits/month፣ $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API ቁልፍ | [አገናኝ](https://github.com/meta-llama/llama-stack) | የእርስዎን META_API_KEY env var እንደ Bearer token ይጠቀሙ። Muse Code CLI የOpenAI Responses API wire formatን (POST /responses) ይጠቀማል። | -| `naga-ac` | `naga` | Naga.ac | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://naga.ac) | API ቁልፍን ከ naga.ac ያግኙ — በGoogle/GitHub/Discord መመዝገብ ይቻላል። | -| `naga-ai` | `naga-ai` | Naga AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://naga.ac) | :free ተብለው ምልክት የተደረገባቸው ሞዴሎች በይፋ ተዘርዝረዋል፣ ነገር ግን በቁጥር የተገለጸ ኮታ አልተረጋገጠም። የNaga ፖሊሲ በነፃው ደረጃ የሚቀርቡ ጥያቄዎችና ውጤቶች ሊሰበሰቡ ወይም ለሥልጠና ሊውሉ እንደሚችሉ ያስጠነቅቃል። | -| `nanogpt` | `nanogpt` | NanoGPT | API ቁልፍ | [አገናኝ](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API ቁልፍ | [አገናኝ](https://bynara.id) | ነፃ የNaraRouter መለያ ይፍጠሩ፣ Telegramዎን ያገናኙ (/v1 ምላሾችን ከማግኘትዎ በፊት ያስፈልጋል)፣ ከዚያም ቁልፉን እዚህ እንደ Bearer ቶከን ይለጥፉ። | -| `navy` | `navy` | NavyAI | API ቁልፍ | [አገናኝ](https://api.navy) | ከNavyAI ዳሽቦርድ ነፃ API ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ እንደ Bearer ቶከን ይለጥፉት። | -| `nebius` | `nebius` | Nebius AI | API ቁልፍ | [አገናኝ](https://nebius.com) | ለAPI ሙከራ ሲመዘገቡ ~$1 የሙከራ ክሬዲት | -| `nlpcloud` | `nlpc` | NLP Cloud | API ቁልፍ | [አገናኝ](https://docs.nlpcloud.com) | የNLP Cloud API ቁልፍዎን በAuthorization: Token ውስጥ ይጠቀሙ። OmniRoute በነባሪነት https://api.nlpcloud.io/v1/gpu//chatbot ላይ ያለውን የቻትቦት መጨረሻ ነጥብ ይጠቀማል። | -| `nomic` | `nomic` | Nomic | API ቁልፍ | [አገናኝ](https://nomic.ai) | API ቁልፍን በatlas.nomic.ai ያግኙ | -| `nous-research` | `nous` | Nous Research | API ቁልፍ | [አገናኝ](https://portal.nousresearch.com/help) | የNous Portal API ቁልፍዎን ይጠቀሙ። OmniRoute በhttps://inference-api.nousresearch.com/v1 ላይ ያለውን OpenAI-ተኳሃኝ ኦፊሴላዊ የኢንፈረንስ መጨረሻ ነጥብ ይጠቀማል። | -| `novita` | `novita` | Novita AI | API ቁልፍ፣ ቪዲዮ፣ አሰባሳቢ | [አገናኝ](https://novita.ai) | ሲመዘገቡ $0.50 የሙከራ ክሬዲት (ለ1 ዓመት ያህል የሚሰራ) | -| `nscale` | `nscale` | nScale | API ቁልፍ | [አገናኝ](https://nscale.com) | ለኢንፈረንስ ሙከራ ሲመዘገቡ $5 ነፃ ክሬዲት | -| `nube` | `nube` | Nube.sh | API ቁልፍ | [አገናኝ](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API ቁልፍ | [አገናኝ](https://build.nvidia.com) | ነፃ የገንቢ መዳረሻ፦ ~40 RPM፣ 70+ ሞዴሎች (Kimi K2.5፣ GLM 4.7፣ DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API ቁልፍ፣ ድርጅት | [አገናኝ](https://www.oracle.com/artificial-intelligence/generative-ai) | የOCI Generative AI API ቁልፍዎን ወይም IAM bearer ቶከንዎን ይጠቀሙ። የመሠረት URL https://inference.generativeai..oci.oraclecloud.com/openai/v1/ ሊሆን ይችላል። | -| `ofoxai` | `ofoxai` | OfoxAI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://ofox.ai) | የአሁኑ ካታሎግ በይፋ የተገለጸ የቁጥር ኮታ የሌላቸው 10+ ነፃ ሞዴሎችን ያስተዋውቃል፤ በምርት አገልግሎት ከመጠቀምዎ በፊት የต้นทาง ምንጭን፣ የውሂብ ማቆያን እና የሥልጠና ውሎችን ይገምግሙ። | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API ቁልፍ | [አገናኝ](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API ቁልፍ | [አገናኝ](https://1min.ai) | በhttps://docs.1min.ai/docs/api/create-api-key API ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ ይለጥፉት። | -| `openadapter` | `oad` | OpenAdapter | API ቁልፍ | [አገናኝ](https://openadapter.dev) | የOpenAdapter API ቁልፍዎን በAuthorization: Bearer sk-cv- ውስጥ ይጠቀሙ። ሙሉ በሙሉ OpenAI-ተኳሃኝ ነው። የAPI መሠረት URL፦ https://api.openadapter.in/v1። | -| `openai` | `openai` | OpenAI | API ቁልፍ | [አገናኝ](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API ቁልፍ | [አገናኝ](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API ቁልፍ | [አገናኝ](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API ቁልፍ | [አገናኝ](https://openference.com) | ነፃ ዕቅድ፦ ክፍት-ምንጭ ሞዴሎችን የሚያካትት የ3 ቀን ሙከራ — የክሬዲት ካርድ አያስፈልግም | -| `openrouter` | `openrouter` | OpenRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://openrouter.ai) | :free ቅጥያ ያላቸው ነፃ ሞዴሎች በ$0/token - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API ቁልፍ | [አገናኝ](https://openvecta.com) | በLLMs፣ embeddings እና የምክንያታዊ አስተሳሰብ ሞዴሎች ላይ ለOpenAI-ተኳሃኝ ኢንፈረንስ ሲመዘገቡ ነፃ ክሬዲት | -| `opper` | `opper` | Opper | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API ቁልፍ | [አገናኝ](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API ቁልፍ | [አገናኝ](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API ቁልፍ | [አገናኝ](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API ቁልፍ | [አገናኝ](https://www.perplexity.ai) | የPerplexity API ቁልፍዎን ይጠቀሙ። OmniRoute የAgent API ሞዴል መለያዎችን በPerplexity Responses-ተኳሃኝ መጨረሻ ነጥብ በኩል ያስተላልፋል። | -| `piapi` | `pi` | PiAPI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API ቁልፍ | [አገናኝ](https://pioneer.ai) | $75 ነፃ የአጠቃቀም ክሬዲት — የክሬዲት ካርድ አያስፈልግም | -| `plamo` | `plamo` | PLaMo | API ቁልፍ | [አገናኝ](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://creator.poe.com/api-reference) | ለPoe OpenAI-ተኳሃኝ API የBearer API ቁልፍ። | -| `poixe-ai` | `poixe-ai` | Poixe AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://poixe.com) | የአሁኑ ይፋዊ ነፃ ገደቦች አነስተኛና ለሞዴል ቡድን የተወሰኑ ናቸው፦ ለlarge-cup ሞዴሎች 2 RPM/5 RPD፣ ለsmall-cup ሞዴሎች ደግሞ 20 RPM/50 RPD። | -| `pollinations` | `pol` | Pollinations AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://pollinations.ai) | በሰነድ የተገለጹትን ነፃ ሞዴሎች በማንነት ሳይገለጽ/ያለ ቁልፍ ማግኘት በተቻለ መጠን ብቻ ይሰጣል። የአካባቢ v3.8.50 ማረጋገጫ (2026-07-31) በOmniRoute በኩል 401 እና ከተመሳሳይ አውታረ መረብ በቀጥታ ወደต้นทาง በተደረጉ ሙከራዎች Cloudflare 1010 መልሷል። Premium ሞዴሎች አሁንም ከenter.pollinations.ai የሚገኝ የPollinations API ቁልፍ ያስፈልጋቸዋል። | -| `poolside` | `poolside` | Poolside | API ቁልፍ | [አገናኝ](https://poolside.ai) | Laguna S 2.1 እና XS 2.1 በPreview ጊዜ ነፃ ናቸው፤ በይፋ የታተመ የቁጥር ኮታ የለም። | -| `predibase` | `predibase` | Predibase | API ቁልፍ | [አገናኝ](https://predibase.com) | ⚠️ **ጊዜው ያለፈበት።** serving.app.predibase.com ከእንግዲህ አይፈታም (ፍተሻ 2026-06-19)፤ የሚተዳደረው የማቅረቢያ API የተቋረጠ ይመስላል። | -| `publicai` | `publicai` | PublicAI | API ቁልፍ | [አገናኝ](https://publicai.co) | API ቁልፍ ያስፈልጋል — አንድ ጊዜ የሚሰጥ የምዝገባ ክሬዲት፣ ከዚያ በኋላ በክፍያ | -| `qianfan` | `qianfan` | Baidu Qianfan | API ቁልፍ | [አገናኝ](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API ቁልፍ | [አገናኝ](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API ቁልፍ | [አገናኝ](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API ቁልፍ | [አገናኝ](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API ቁልፍ፣ ምስል | [አገናኝ](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API ቁልፍ | [አገናኝ](https://regolo.ai) | የRegolo API ቁልፍዎን ከregolo.ai ያግኙ፣ ከዚያም እዚህ እንደ Bearer token ይለጥፉት። | -| `reka` | `reka` | Reka | API ቁልፍ | [አገናኝ](https://docs.reka.ai/chat/overview) | የReka API ቁልፍዎን ይጠቀሙ። OmniRoute ከOpenAI ጋር ተኳዃኝ የሆነውን መሠረታዊ URL https://api.reka.ai/v1 ይጠቀማል፣ እና ለተኳዃኝነት ሁለቱንም Authorization እና X-Api-Key headers ይልካል። | -| `requesty` | `requesty` | Requesty | API ቁልፍ | [አገናኝ](https://requesty.ai) | ነፃ ደረጃ፦ በቀን ~200 ጥያቄዎች — ባለብዙ-ሞዴል ማስተላለፊያ gateway (300+ ሞዴሎች) | -| `routeway` | `routeway` | Routeway | API ቁልፍ | [አገናኝ](https://routeway.ai) | በrouteway.ai ነፃ API ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ እንደ Bearer token ይለጥፉት። | -| `runwayml` | `runway` | Runway | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://docs.dev.runwayml.com) | የRunway API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። OmniRoute በhttps://api.dev.runwayml.com/v1 ያለውን የአሁኑን Runway API ይጠቀማል፣ እና አስፈላጊውን X-Runway-Version header በራስ-ሰር ይልካል። | -| `sambanova` | `samba` | SambaNova | API ቁልፍ | [አገናኝ](https://sambanova.ai) | ሲመዘገቡ $5 ነፃ ክሬዲት (ለ30 ቀናት የሚያገለግል)፣ የክሬዲት ካርድ አያስፈልግም | -| `sap` | `sap` | SAP Generative AI Hub | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | የSAP AI Core bearer tokenዎን ይጠቀሙ። መሠረታዊ URL የAI_API_URL rootዎ ወይም ከGenerative AI Hub የመጣ deploymentUrl ሊሆን ይችላል። | -| `sarvam` | `sarvam` | Sarvam AI | API ቁልፍ | [አገናኝ](https://docs.sarvam.ai) | ሲመዘገቡ ₹1,000 ነፃ ክሬዲት — ፈጽሞ አያበቃም | -| `scaleway` | `scw` | Scaleway AI | API ቁልፍ | [አገናኝ](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | ለአዲስ መለያዎች 1M ነፃ tokens — ከEU/GDPR ጋር ተኳዃኝ (Paris)፣ Qwen3 235B እና Llama 70B | -| `sealion` | `sealion` | SEA-LION | API ቁልፍ | [አገናኝ](https://sea-lion.ai) | በGoogle አማካኝነት ወደ sea-lion.ai ይግቡ (ካርድ አያስፈልግም፣ የክልል ገደብም የለም)፣ API ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ ይለጥፉት። | -| `seekai` | `ska` | SeekAi | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://seekai.cc) | በhttps://seekai.cc API ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ እንደ Bearer token ይለጥፉት። | -| `segmind` | `segmind` | Segmind | API ቁልፍ፣ ምስል፣ ቪዲዮ | [አገናኝ](https://segmind.com) | የSegmind API ቁልፍዎን በx-api-key header ውስጥ ይጠቀሙ። OmniRoute https://api.segmind.com/v1/ ይጠቀማል፣ እና የተፈጠረውን የምስል/ቪዲዮ bytes በቀጥታ ይመልሳል። | -| `sensenova` | `sensenova` | SenseNova | API ቁልፍ | [አገናኝ](https://platform.sensenova.cn) | API ቁልፍ ከplatform.sensenova.cn ያግኙ | -| `siliconflow` | `siliconflow` | SiliconFlow | API ቁልፍ | [አገናኝ](https://cloud.siliconflow.com) | $1 ነፃ ክሬዲት፣ እንዲሁም የማንነት ማረጋገጫ ከተደረገ በኋላ በአሁኑ ጊዜ $0 ተብለው የተዘረዘሩ ሞዴሎች፤ ተገኝነትና ገደቦች ሊለወጡ ይችላሉ | -| `snowflake` | `snowflake` | Snowflake Cortex | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API ቁልፍ | [አገናኝ](https://xinghuo.xfyun.cn) | API ቁልፍ ከconsole.xfyun.cn ያግኙ | -| `speka` | `speka` | Speka AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://speka.me) | ነፃ ዕቅድ፦ በየወሩ $1 አጠቃቀም፣ 10 RPM፣ አንድ API ቁልፍ፣ እንዲሁም ክፍት ሞዴሎችንና playgroundን የመጠቀም መብት፤ ካርድ አያስፈልግም። | -| `stability-ai` | `stability` | Stability AI | API ቁልፍ፣ ምስል | [አገናኝ](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API ቁልፍ | [አገናኝ](https://stepfun.com) | API ቁልፍ ከplatform.stepfun.com ያግኙ | -| `sumopod` | `sumopod` | SumoPod | API ቁልፍ | [አገናኝ](https://ai.sumopod.com) | የSumoPod API ቁልፍዎን (sk-...) በAuthorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ ከOpenAI ጋር ተኳዃኝ ነው። የAPI መሠረታዊ URL፦ https://ai.sumopod.com/v1። | -| `suno` | `suno` | Suno | API ቁልፍ | [አገናኝ](https://suno.ai) | session cookieውን ከsuno.ai (Clerk auth) ይለጥፉ | -| `synthetic` | `synthetic` | Synthetic | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API ቁልፍ | [አገናኝ](https://hunyuan.tencent.com) | API ቁልፍ ከconsole.cloud.tencent.com ያግኙ | -| `thebai` | `thebai` | TheB.AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://theb.ai) | ከOpenAI ጋር ተኳዃኝ ለሆነው TheB.AI gateway የBearer API ቁልፍ። | -| `tinyfish` | `tf` | TinyFish Fetch | API ቁልፍ | [አገናኝ](https://docs.tinyfish.ai/fetch-api) | X-API-Key ከagent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API ቁልፍ | [አገናኝ](https://agent-router.gaib.ai) | የToken Kiosk API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ ከOpenAI ጋር ተኳዃኝ gateway ነው። የAPI መሠረታዊ URL፦ https://agent-router.gaib.ai/v1። | -| `tokenreply` | `tokenreply` | TokenReply | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.tokenreply.com) | ነፃ የሚል መለያ ያላቸው ሞዴሎች በሞዴሉና በዘመቻው የሚወሰኑ ዕለታዊ ገደቦች አሏቸው፤ ቋሚ ዓለም አቀፍ ነፃ ኮታ አልታተመም። | -| `tokenrouter` | `trk` | TokenRouter | API ቁልፍ | [አገናኝ](https://tokenrouter.com) | የTokenRouter API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ ከOpenAI ጋር ተኳዃኝ ነው። የAPI መሠረታዊ URL፦ https://api.tokenrouter.com/v1። | -| `topaz` | `topaz` | Topaz | API ቁልፍ፣ ምስል | [አገናኝ](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API ቁልፍ | [አገናኝ](https://docs.opentyphoon.ai) | 5 req/s እና 200 req/m የፍጥነት ገደብ ያለው ነፃ API ቁልፍ። | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API ቁልፍ | [አገናኝ](https://uncensored.com) | የuncensored.com Developer API ቁልፍዎን (uai_sk_live_...) ይጠቀሙ። OmniRoute ወደ OpenAI-ተኳሃኝ https://api.uncensored.com/api/v1 መጨረሻ ነጥብ እንደ X-api-key ራስጌ ይልከዋል። ቁልፉ ፈጽሞ አያበቃም። ይህ በአጠቃቀም የሚለካ/በክሬዲት የሚከፈል በይነገጽ ነው፤ ያልተለካው የደንበኝነት ምዝገባ ውይይት የተለየው 'uc' አቅራቢ ነው። | -| `udio` | `udio` | Udio | API ቁልፍ | [አገናኝ](https://udio.com) | ከudio.com የክፍለ ጊዜ cookie (Supabase auth) ይለጥፉ | -| `unorouter` | `unorouter` | UnoRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://unorouter.ai) | :free ቅጥያ ያላቸው ሞዴሎች ቀሪ ሂሳብን አይቀንሱም፤ ገደቡ ለእያንዳንዱ ነፃ ሞዴል በተጠቃሚ በደቂቃ 1 ጥያቄ ነው። | -| `upstage` | `upstage` | Upstage | API ቁልፍ | [አገናኝ](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API ቁልፍ | [አገናኝ](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API ቁልፍ | [አገናኝ](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API ቁልፍ፣ የድርጅት | [አገናኝ](https://cloud.google.com/vertex-ai) | Service Account JSON፣ OAuth የመዳረሻ token፣ Vertex Express API ቁልፍ ወይም ከservice account ጋር የተያያዘ የፈቃድ ቁልፍ ያቅርቡ። Express ሁነታ Geminiን ብቻ ይደግፋል፤ የአጋር ሞዴሎች በፕሮጀክት የተገደቡ ማረጋገጫዎችን ይፈልጋሉ። | -| `vertex-partner` | `vp` | Vertex AI Partners | API ቁልፍ፣ የድርጅት | [አገናኝ](https://cloud.google.com/vertex-ai) | Service Account JSON ወይም OAuth ማረጋገጫዎችን ያቅርቡ። ከservice account ጋር የተያያዘ የፈቃድ ቁልፍ ማግኘትንም ይደግፋል፣ ነገር ግን የአጋር inference በተጨማሪ የGoogle Cloud ፕሮጀክት IDውን ይፈልጋል። መደበኛ Express ቁልፎች Geminiን ብቻ ይደግፋሉ። | -| `void-ai` | `void-ai` | Void AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://voidai.app) | ይፋዊው የሞዴል ካታሎግ አንዳንድ ሞዴሎችን የነፃ ዕቅድ መስፈርት እንዳላቸው ያመለክታል፣ ነገር ግን መዳረሻው በሁኔታዎች የተገደበ ሲሆን ምንም የተረጋገጠ የቁጥር ኮታ የለም። | -| `volcengine` | `volcengine` | Volcengine | API ቁልፍ | [አገናኝ](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API ቁልፍ | [አገናኝ](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | የVolcano Engine መለያዎን ያገናኙ ወይም የArk Agent Plan የደንበኝነት ምዝገባ API ቁልፍ ይጠቀሙ። | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API ቁልፍ | [አገናኝ](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | የVolcano Engine መለያዎን ያገናኙ ወይም የArk Coding Plan የደንበኝነት ምዝገባ API ቁልፍ ይጠቀሙ። | -| `voyage-ai` | `voyage` | Voyage AI | API ቁልፍ፣ embed/rerank | [አገናኝ](https://www.voyageai.com) | ለVoyage AI embeddings እና rerank APIs የBearer API ቁልፍ። | -| `wafer` | `wafer` | Wafer AI | API ቁልፍ | [አገናኝ](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API ቁልፍ | [አገናኝ](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API ቁልፍ፣ የድርጅት | [አገናኝ](https://www.ibm.com/products/watsonx-ai) | የwatsonx bearer tokenዎን ይጠቀሙ። መሠረታዊ URL https://.ml.cloud.ibm.com/ml/gateway/v1/ ወይም በራስ የሚተዳደር /ml/gateway/v1 መጨረሻ ነጥብ ሊሆን ይችላል። | -| `writer` | `writer` | Writer | API ቁልፍ | [አገናኝ](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API ቁልፍ | [አገናኝ](https://x5lab.dev) | የX5Lab API ቁልፍዎን (x5-...) በAuthorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ OpenAI-ተኳሃኝ ነው። የAPI መሠረታዊ URL፦ https://api.x5lab.dev/v1። | -| `xai` | `xai` | xAI (Grok) | API ቁልፍ | [አገናኝ](https://x.ai) | ይፋዊ የxAI API ቁልፍ ይጠቀሙ ወይም በxAI OAuth ይግቡ። Grok Build JWT ክፍለ ጊዜዎች የተለየ አቅራቢ ሆነው ይቆያሉ። | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API ቁልፍ | [አገናኝ](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API ቁልፍ | [አገናኝ](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://xkiro.com) | በxkiro.com ነፃ መለያ ይፍጠሩና ቁልፉን እዚህ ይለጥፉ (Bearer፤ x-api-keyም ተቀባይነት አለው)። | -| `yi` | `yi` | Yi (01.AI) | API ቁልፍ | [አገናኝ](https://01.ai) | API ቁልፉን ከplatform.lingyiwanwu.com ያግኙ | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://yolo-auto.com) | ነፃ የAPI መዳረሻ በጥያቄ ብዛት የተገደበ እና ለሙከራ የታሰበ ነው፤ ምንም የቁጥር ዕለታዊ ኮታ አልታተመም፣ እንዲሁም ነፃ መዳረሻው ለዘላለም እንደሚቀጥል ቃል አልተገባም። | -| `zai` | `zai` | Z.AI | API ቁልፍ | [አገናኝ](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API ቁልፍ | [አገናኝ](https://zenmux.ai) | የZenMux API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ZenMux ሙሉ በሙሉ OpenAI-ተኳሃኝ ነው። መሠረታዊ URL፦ https://zenmux.ai/api/v1። | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.zerolimitai.com) | ጊዜያዊ ነፃ ሙከራ ቢያስተዋውቅም፣ ይፋዊ ገጾች በ3 እና 7 ቀናት መካከል ይጋጫሉ፤ በቀን 100 ጥሪዎች የሚለው መግለጫ እንደ ቋሚ አይወሰድም። | -| `zylo-api` | `zylo` | Zylo API | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://zyloai.net) | መሠረታዊ ዕቅድ፦ 10 RPM፣ በቀን 7,200 ጥያቄዎች እና በቀን 200,000 tokens፤ በBasic የጽሑፍ ሞዴሎች ብቻ የተገደበ። | +| ID | ተለዋጭ ስም | ስም | መለያዎች | ድረ ገጽ | ማስታወሻዎች | +| ------------------------ | --------------- | ------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API ቁልፍ | [አገናኝ](https://ai.360.cn) | የAPI ቁልፍን ከai.360.cn ያግኙ | +| `agentrouter` | `agentrouter` | AgentRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://agentrouter.org) | ሲመዘገቡ $200 ነፃ ክሬዲት — ባለብዙ ሞዴል ማዘዋወሪያ መግቢያ | +| `agnes` | `agnes` | Agnes AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://agnes-ai.com) | የAPI ቁልፍን ከagnes-ai.com ያግኙ | +| `agnes-cn` | `agnescn` | Agnes AI (ቻይና) | API ቁልፍ | [አገናኝ](https://api.agnes-ai.cn) | የAPI ቁልፍን ከAgnes CN ጣቢያ ያግኙ። | +| `ai21` | `ai21` | AI21 Labs | API ቁልፍ | [አገናኝ](https://www.ai21.com) | ሲመዘገቡ $10 የሙከራ ክሬዲት (ለ3 ወራት የሚሰራ)፣ ክሬዲት ካርድ አያስፈልግም | +| `aimlapi` | `aiml` | AI/ML API | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://aimlapi.com) | ነፃው ደረጃ ታግዷል (2026) — AI/ML API አሁን በአጠቃቀም መጠን ብቻ የሚከፈል ነው (ዝቅተኛው $20 መሙላት)፤ በተደጋጋሚ የሚሰጥ ነፃ ክሬዲት የለም። | +| `ainative` | `ainative` | AINative Studio | API ቁልፍ | [አገናኝ](https://ainative.studio) | በainative.studio ነፃ የAPI ቁልፍ ይፍጠሩ (ካርድ አያስፈልግም)፣ ከዚያ እዚህ እንደ Bearer token ይለጥፉት። | +| `aion` | `aion` | Aion Labs | API ቁልፍ | [አገናኝ](https://www.aionlabs.ai) | በaionlabs.ai ነፃ የAPI ቁልፍ ይፍጠሩ (ካርድ አያስፈልግም)፣ ከዚያ እዚህ እንደ Bearer token ይለጥፉት። | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API ቁልፍ | [አገናኝ](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (ቻይና) | API ቁልፍ | [አገናኝ](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API ቁልፍ | [አገናኝ](https://developer.ant-ling.com/en/docs/) | በAnt Ling API ኮንሶል (https://chat.ant-ling.com/open) ይመዝገቡና የAPI ቁልፍ ይፍጠሩ፣ ከዚያ እዚህ ይለጥፉት። OmniRoute የውይይት ትራፊክን ወደ https://api.ant-ling.com/v1/chat/completions ያዘዋውራል፤ አቅራቢው ከOpenAI ጋር ተኳሃኝ ሲሆን ከAnthropic ጋር ተኳሃኝ በይነገጽም ያቀርባል። | +| `anthropic` | `anthropic` | Anthropic | API ቁልፍ | [አገናኝ](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://anyapi.ai) | ነፃ ዕቅድ፦ ብቁ ለሆኑ Free/Basic ሞዴሎች በቀን 100,000 ANY Tokens እና 100 RPM፤ ክሬዲት ካርድ አያስፈልግም። | +| `api-airforce` | `af` | Api.airforce | API ቁልፍ | [አገናኝ](https://api.airforce) | Grok-3፣ Claude 3.7፣ Qwen3፣ Kimi-K2፣ Gemini 2.5 Flash እና DeepSeek-V3ን ጨምሮ 55 የነፃ ደረጃ ሞዴሎች | +| `arcee-ai` | `arcee` | Arcee AI | API ቁልፍ | [አገናኝ](https://arcee.ai) | የAPI ቁልፍን ከarcee.ai ያግኙ | +| `auriko` | `auriko` | Auriko | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.auriko.ai) | ነፃው ዕቅድ 1,000 የመድረክ RPM እና 10,000 BYOK RPM ያቀርባል። የመድረክ ኢንፈረንስ አሁንም የአቅራቢውን ወጪ ያስከትላል፤ ይህ ነፃ የቶከን ስብስብ ወይም ገደብ የሌለው ነፃ ኢንፈረንስ አይደለም። | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://learn.microsoft.com/azure/ai-foundry) | የAzure AI Foundry ቁልፍዎን ይጠቀሙ። መሠረታዊ URL https://.services.ai.azure.com/openai/v1/ ወይም https://.openai.azure.com/openai/v1/ ሊሆን ይችላል። | +| `azure-openai` | `azure` | Azure OpenAI | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://azure.microsoft.com/products/ai-services/openai-service) | የAzure OpenAI API ቁልፍዎን ይጠቀሙ። መሠረታዊ URL የሀብትዎ መገልገያ ጫፍ መሆን አለበት፣ ለምሳሌ https://my-resource.openai.azure.com። | +| `bai` | `bai` | b.ai | API ቁልፍ | [አገናኝ](https://b.ai) | ከOpenAI ጋር ተኳሃኝ ለሆነው የb.ai LLM መግቢያ Bearer API ቁልፍ (ከTheB.AI የተለየ)። በhttps://docs.b.ai ቁልፍ ይፍጠሩ፣ ከዚያ https://api.b.ai/v1ን ከOpenAI ጋር ተኳሃኝ እንደሆነ መሠረታዊ URL ይጠቀሙ። | +| `baichuan` | `baichuan` | Baichuan | API ቁልፍ | [አገናኝ](https://www.baichuan-ai.com/) | የAPI ቁልፍን ከplatform.baichuan-ai.com ያግኙ | +| `baidu` | `baidu` | Baidu (ERNIE) | API ቁልፍ | [አገናኝ](https://ernie.baidu.com/) | የAPI ቁልፍን ከconsole.bce.baidu.com ያግኙ | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API ቁልፍ | [አገናኝ](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API ቁልፍ | [አገናኝ](https://baseten.co) | ለGPU ኢንፈረንስ $30 ነፃ የሙከራ ክሬዲት | +| `bazaarlink` | `bzl` | BazaarLink | API ቁልፍ | [አገናኝ](https://bazaarlink.ai) | የBazaarLink API ቁልፍዎን (በsk-bl- የሚጀምር) በAuthorization: Bearer ውስጥ ይጠቀሙ። OpenAI SDK ከመሠረታዊ URL https://bazaarlink.ai/api/v1 ጋር ይሰራል። ሞዴሎች provider/model-name ቅርጸትን ይጠቀማሉ። | +| `bedrock` | `bedrock` | Amazon Bedrock | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://aws.amazon.com/bedrock) | የAmazon Bedrock API ቁልፍዎን ይጠቀሙ እና ሞዴሎችዎ የነቁበትን AWS ክልል ያዋቅሩ (ለምሳሌ eu-west-2)። OmniRoute የBedrock ተፈጥሯዊ Converse APIን በቀጥታ ይጠራል። | +| `black-forest-labs` | `bfl` | Black Forest Labs | API ቁልፍ፣ ምስል | [አገናኝ](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API ቁልፍ | [አገናኝ](https://blackbox.ai) | ⚠️ **ጊዜው ያለፈበት።** api.blackbox.ai በእያንዳንዱ የመንገድ ልዩነት HTTP 404 ይመልሳል (ምርመራ 2026-08-21)፤ የሕዝብ ኢንፈረንስ በይነገጹ ወደ የተገደበው enterprise.blackbox.ai/v1 መገልገያ ጫፍ ተዛውሯል። | +| `bluesminds` | `bm` | BluesMinds | API ቁልፍ | [አገናኝ](https://www.bluesminds.com) | በየቀኑ ነፃ pi ክሬዲት — GPT-4o፣ GPT-4.1፣ Claude Sonnet 4.5፣ Gemini 2.0 Flash፣ DeepSeek V4፣ Qwen እና Kimi K2ን ጨምሮ ከ200 በላይ ሞዴሎችን ይደግፋል | +| `byteplus` | `bpm` | BytePlus ModelArk | API ቁልፍ | [አገናኝ](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API ቁልፍ | [አገናኝ](https://bytez.com) | $1 ነፃ ክሬዲት፣ በየ4 ሳምንቱ ይታደሳል | +| `cerebras` | `cerebras` | Cerebras | API ቁልፍ | [አገናኝ](https://inference.cerebras.ai) | አንድ ጊዜ ብቻ የሚሰጥ $5 የምዝገባ ክሬዲት (ለ30 ቀናት የሚሰራ)፤ የክፍያ ዘዴ ያስፈልጋል። በተደጋጋሚ የሚታደስ ነፃ ደረጃ አይደለም። | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API ቁልፍ | [አገናኝ](https://hyper.charm.land) | ሲመዘገቡ በየወሩ 100 ነፃ Hypercredits | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://api.oriper.com) | ይፋዊው ሜታዳታ በወር 2M ቶከኖችን ያስተዋውቃል፣ ነገር ግን በኦዲት ወቅት የሕዝብ ጣቢያውና ሰነዶቹ ታግደው ነበር፤ ኮታውንና የምርት ስም ማዛመዱን እንዳልተረጋገጠ ይቁጠሩ። | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://chatanywhere.tech) | ለግል፣ ለትምህርት ወይም ለምርምር አጠቃቀም ብቻ፦ ይፋዊ ሰነዶቹ በቀን 10,000 ነጥቦች እና ለእያንዳንዱ IP/ቁልፍ በቀን 200 ጥያቄዎች እንደሚፈቀዱ ይገልጻሉ፤ ለንግድ ትራፊክ አይጠቀሙበት። | +| `cheaperinference` | `cinf` | Cheaper Inference | API ቁልፍ | [አገናኝ](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API ቁልፍ | [አገናኝ](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://chutes.ai) | ከOpenAI ጋር ተኳሃኝ ለሆነው የChutes ጌትዌይ Bearer API ቁልፍ። | +| `clarifai` | `clarifai` | Clarifai | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://docs.clarifai.com) | የClarifai PATዎን ወይም ለመተግበሪያው የተወሰነ API ቁልፍ ይጠቀሙ። OmniRoute በhttps://api.clarifai.com/v2/ext/openai/v1 ላይ ያለውን ከOpenAI ጋር ተኳሃኝ የመጨረሻ ነጥብ ይጠቀማል፣ እና በAuthorization: Key ማረጋገጫ ያደርጋል። | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://cloudcode.one) | ይፋ የተደረጉ ነፃ ሞዴሎች glm-4.7-flash እና glm-4.6v-flashን ያካትታሉ፤ በቁጥር የተገለጸ ኮታ የለም፣ እና ቁልፍ ለመፍጠር ክሬዲት ወይም ኩፖን ሊያስፈልግ ይችላል። | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API ቁልፍ | [አገናኝ](https://developers.cloudflare.com/workers-ai) | API Token እና Account ID ሁለቱንም ይፈልጋል (በdash.cloudflare.com ይገኛል) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API ቁልፍ | [አገናኝ](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API ቁልፍ | [አገናኝ](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API ቁልፍ | [አገናኝ](https://cohere.com) | ነፃ ሙከራ፦ ለሙከራ በወር 1,000 API ጥሪዎች፣ የክሬዲት ካርድ አያስፈልግም | +| `command-code` | `cmd` | Command Code | API ቁልፍ | [አገናኝ](https://commandcode.ai/) | የCommand Code API ቁልፍ ይጠቀሙ። ጥያቄዎች ወደ Command Code /provider/v1/chat/completions የመጨረሻ ነጥብ ይላካሉ። | +| `coze` | `coze` | Coze | API ቁልፍ | [አገናኝ](https://coze.com) | API ቁልፍን በcoze.com/open/api ያግኙ | +| `crof` | `crof` | CrofAI | API ቁልፍ | [አገናኝ](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API ቁልፍ | [አገናኝ](https://cursor.com/dashboard/api) | ከcursor.com/dashboard/api የCursor ተጠቃሚ API ቁልፍ (crsr_...) ይለጥፉ። OmniRoute በሚያስፈልግበት ጊዜ ለክፍለ ጊዜ ቶከን ይለውጠዋል፤ IDE ወይም cursor-agent መጫን አያስፈልግም። የአጠቃቀም ክፍያው ቁልፉን በያዘው የCursor ዕቅድ ላይ ይከፈላል። | +| `dahl` | `dahl` | Dahl | API ቁልፍ | [አገናኝ](https://inference.dahl.global) | ቶከን በራስ-ሰር ለማመንጨት 'Add Account'ን ጠቅ ያድርጉ፣ ወይም API ቁልፍን በእጅ ያክሉ። | +| `databricks` | `databricks` | Databricks | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://docs.datarobot.com) | የDataRobot API ቶከንዎን ይጠቀሙ። አማራጭ Base URL የመለያው ስር (ለLLM Gateway) ወይም በ/api/v2/deployments/ ስር ያለ የማሰማሪያ URL ሊሆን ይችላል። | +| `deepai` | `deepai` | DeepAI | API ቁልፍ፣ ምስል | [አገናኝ](https://deepai.org) | የDeepAI API ቁልፍዎን ይጠቀሙ። በdeepai.org ያግኙት — የPro ምዝገባ ($9.99/በወር) ያስፈልጋል። | +| `deepinfra` | `deepinfra` | DeepInfra | API ቁልፍ | [አገናኝ](https://deepinfra.com) | ለAPI ሙከራ እና ሞዴል ማሰሻ በነፃ ሲመዘገቡ ክሬዲቶች ይሰጣሉ | +| `deepseek` | `ds` | DeepSeek | API ቁልፍ | [አገናኝ](https://platform.deepseek.com) | ሲመዘገቡ 5M ነፃ ቶከኖች — የክሬዲት ካርድ አያስፈልግም | +| `dgrid` | `dgrid` | DGrid | API ቁልፍ | [አገናኝ](https://dgrid.ai) | DGrid Free Models Router፦ በደቂቃ 10 ጥያቄዎች እና በቀን 100 ጥያቄዎች። የአንድ ጊዜ $5 ተጨማሪ ክፍያ እስከ በደቂቃ 20 ጥያቄዎች እና በቀን 1,000 ጥያቄዎችን ይከፍታል። | +| `dify` | `dify` | Dify | API ቁልፍ | [አገናኝ](https://dify.ai) | API ቁልፍን ከDify ኢንስታንስዎ ያግኙ። | +| `digitalocean` | `digitalocean` | DigitalOcean | API ቁልፍ | [አገናኝ](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API ቁልፍ | [አገናኝ](https://dit.ai) | የdit.ai API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ከOpenAI ጋር ሙሉ በሙሉ ተኳሃኝ ነው — በቀጥታ ምትክ ሆኖ ይሰራል፤ base URLን ብቻ ወደ https://api.dit.ai/v1 ይቀይሩ። | +| `doubao` | `doubao` | Doubao | API ቁልፍ | [አገናኝ](https://doubao.com) | API ቁልፍን በconsole.volcengine.com ያግኙ | +| `dxnt` | `dxnt` | DXNT / DX Token | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://www.dxnt.com) | ነፃ መለያዎች በቀን 100 ጥሪዎች እንዳላቸው ተመዝግቧል፤ ኮታው በግብዣዎች ሊጨምር እና እንደ መለያው ሊለያይ ይችላል። | +| `electronhub` | `electronhub` | Electron Hub | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://www.electronhub.ai) | ነፃ ዕቅድ፦ 5 RPM፣ በሳምንት $0.25 ክሬዲት እና ለ:free ሞዴሎች በቀን 10 Neutrinos፤ የቤተሰብ በጀቶችም ተፈጻሚ ይሆናሉ። | +| `empower` | `empower` | Empower | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://docs.empower.dev) | ከOpenAI ጋር ተኳሃኝ ለሆነው የEmpower የመጨረሻ ነጥብ Bearer API ቁልፍ። | +| `eurouter` | `eurouter` | EURouter | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API ቁልፍ | [አገናኝ](https://factory.ai) | ከOpenAI ጋር ተኳሃኝ ለሆነው የFactory ጌትዌይ Bearer API ቁልፍ። | +| `fal-ai` | `fal` | Fal.ai | API ቁልፍ፣ ምስል | [አገናኝ](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://fastrouter.ai) | የ:free ቅጥያ ያላቸው ሞዴሎች ለእያንዳንዱ ድርጅት እና ሞዴል በቀን 10 ጥያቄዎችን ይፈቅዳሉ፤ ተደራሽነቱ ሊቀየር ይችላል። | +| `featherless-ai` | `featherless` | Featherless AI | API ቁልፍ | [አገናኝ](https://featherless.ai) | ነፃ ደረጃ ይገኛል — የክሬዲት ካርድ አያስፈልግም | +| `fenayai` | `fenayai` | FenayAI | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://fenayai.com) | ከOpenAI ጋር ተኳሃኝ ለሆነው የFenayAI ጌትዌይ Bearer API ቁልፍ። | +| `fireworks` | `fireworks` | Fireworks AI | API ቁልፍ | [አገናኝ](https://fireworks.ai) | ለAPI ሙከራ ሲመዘገቡ $1 ነፃ የመጀመሪያ ክሬዲት | +| `free-ai` | `free-ai` | Free.ai | API ቁልፍ፣ አጠቃላይ አቅራቢ | [አገናኝ](https://free.ai) | የኢሜይል ማረጋገጫ ከተደረገ በኋላ በቀን 30,000 ቶከኖች በራስዎ የሚስተናገዱ ሞዴሎችን ይሸፍናሉ። ከዚህ ክምችት በላይ ያለ አጠቃቀም በቀጥታ ወጪ ሊከፈልበት ይችላል፣ እና ፕሪሚየም ውጫዊ ሞዴሎች የሚከፈልባቸው ናቸው። | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API ቁልፍ | [አገናኝ](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API ቁልፍ | [አገናኝ](https://freebuff.com) | የFreebuff / Codebuff Auth Token ያስገቡ (በCLI መግባት ወይም በራስ-ሰር harvester የተገኘ)። | +| `freeinference` | `freeinference` | FreeInference | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://freeinference.org) | ያለ ካርድ ነፃ የምርምር መዳረሻ፤ ከHarvard ውጭ ያሉ አመልካቾች በእጅ ማጽደቅ ያስፈልጋቸዋል፣ እንዲሁም በይፋ የተረጋገጠ የቁጥር ኮታ የለም። | +| `freemodel-dev` | `fmd` | FreeModel.dev | API ቁልፍ | [አገናኝ](https://freemodel.dev) | ሲመዘገቡ $300 ነፃ ክሬዲት — የክሬዲት ካርድ አያስፈልግም። GPT-5.4 እና GPT-5.5ን (የOpenAI የቅርብ ጊዜ ዋና ሞዴሎች) ከOpenAI ጋር ተኳሃኝ በሆነ API በኩል ይድረሱባቸው። | +| `freetheai` | `fta` | FreeTheAi | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://freetheai.xyz) | ነፃ API ቁልፍዎን ለማግኘት የFreeTheAi Discordን ይቀላቀሉ። | +| `friendliai` | `friendli` | FriendliAI | API ቁልፍ | [አገናኝ](https://friendli.ai) | ለserverless inference ነፃ ደረጃ — የክሬዲት ካርድ አያስፈልግም | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | በg4f.dev/chat ላይ ስም-አልባ cake ክሬዲቶችን ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ላይ ይፍጠሩ)። | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | በg4f.dev/chat ላይ ስም-አልባ cake ክሬዲቶችን ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ላይ ይፍጠሩ)። | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | በg4f.dev/chat ላይ ስም-አልባ cake ክሬዲቶችን ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ላይ ይፍጠሩ)። | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | በg4f.dev/chat ላይ ስም-አልባ cake ክሬዲቶችን ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ላይ ይፍጠሩ)። | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://g4f.space) | በg4f.dev/chat ላይ ስም-አልባ cake ክሬዲቶችን ያዘጋጁ፣ ወይም የg4f.dev አባል ቁልፍ ይጠቀሙ (በg4f.dev/members.html ላይ ይፍጠሩ)። | +| `galadriel` | `galadriel` | Galadriel | API ቁልፍ | [አገናኝ](https://galadriel.com) | ⚠️ **ጥቅም ላይ እንዳይውል የተደረገ።** api.galadriel.ai ከእንግዲህ አይፈታም (የ2026-06-19 ፍተሻ)፤ inference APIው የተቋረጠ ይመስላል። | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API ቁልፍ | [አገናኝ](https://aistudio.google.com) | ነፃ ደረጃ በGoogle AI Studio በኩል ይገኛል፤ የአሁኑ የእያንዳንዱ ሞዴል ኮታዎችና ክልላዊ ገደቦች ተፈጻሚ ይሆናሉ | +| `getgoapi` | `ggo` | GoAPI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API ቁልፍ | [አገናኝ](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API ቁልፍ | [አገናኝ](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | ለሕዝባዊው Code Suggestions API የGitLab የግል መዳረሻ token። gitlab.comን በማይጠቀሙበት ጊዜ በራስዎ የሚስተናገድ base URL ያዋቅሩ። | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API ቁልፍ | [አገናኝ](https://opengateway.gitlawb.com) | ነፃ MiMo (xiaomi/mimo-v2.5) በ2026-05 ተሰርዟል — Opengateway አሁን በአጠቃቀም መጠን የሚከፈልበት የክሬዲት gateway ነው፤ ተደጋጋሚ ነፃ ሞዴል የለም። | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API ቁልፍ | [አገናኝ](https://opengateway.gitlawb.com) | የነፃው Nemotron ማስተዋወቂያ በ2026-06 አብቅቷል — የGMI Cloud መስመር አሁን በአጠቃቀም መጠን የሚከፈልበት ክሬዲት ብቻ ነው። | +| `glm` | `glm` | GLM Coding | API ቁልፍ | [አገናኝ](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (China) | API ቁልፍ | [አገናኝ](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API ቁልፍ | [አገናኝ](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API ቁልፍ | [አገናኝ](https://greenpt.com) | የAPI ምዝገባ በነፃ መፍጠር ይቻላል፤ inference በእያንዳንዱ token ይከፈልበታል። ምንም ነፃ የinference ድርሻ አልታተመም። | +| `groq` | `groq` | Groq | API ቁልፍ | [አገናኝ](https://groq.com) | ነፃ ዕቅድ፦ የእያንዳንዱ ሞዴል ገደቦች (ለእያንዳንዱ chat ሞዴል 200K tokens/ቀን፤ ለRPM/RPD console.groq.com/docs/rate-limitsን ይመልከቱ) — የክፍያ ዘዴ በመዝገብ ላይ አይኖርም። | +| `haiper` | `hp` | Haiper | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://haiper.ai) | API ቁልፍን በhaiper.ai/haiper-api ያግኙ | +| `hcnsec` | `hcnsec` | Huancheng Public API | API ቁልፍ | [አገናኝ](https://api.hcnsec.cn) | API ቁልፍን በapi.hcnsec.cn ያግኙ | +| `helixmind` | `helixmind` | HelixMind | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://helixmind.online) | ከዚህ በፊት ይሰራጩ የነበሩት የ3 RPM/50 RPD እና ካርድ አያስፈልግም የሚሉ መግለጫዎች በ2026-08-02 ኦዲት ወቅት አልተረጋገጡም፤ የአሁኑን ኮታና ክፍያ ለማወቅ የመለያ ማረጋገጫ ያስፈልጋል። | +| `helyxai` | `helyxai` | Helyx AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://helyxai.space) | ተግባራዊው ነፃ ዕቅድ 100,000 tokens/ቀን እንደሚሰጥ ይገልጻል፤ የጣቢያው የተለየ የ2M+ የግብይት መግለጫ ከዚህ ጋር ስለሚጋጭ እንደ የኮታ ዋስትና አይቆጠርም። | +| `heroku` | `heroku` | Heroku AI | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API ቁልፍ | [አገናኝ](https://huggingface.co) | ለሺዎች ሞዴሎች (Whisper, VITS, SDXL…) ነፃ Inference API | +| `hyperbolic` | `hyp` | Hyperbolic | API ቁልፍ | [አገናኝ](https://hyperbolic.xyz) | ሲመዘገቡ ለserverless inference $1-5 የሙከራ ክሬዲቶች | +| `ideogram` | `ideo` | Ideogram | API ቁልፍ | [አገናኝ](https://ideogram.ai) | API ቁልፍን በideogram.ai/docs/api ያግኙ | +| `iflytek` | `iflytek` | iFlytek Spark | API ቁልፍ | [አገናኝ](https://xinghuo.xfyun.cn) | API ቁልፍን በconsole.xfyun.cn ያግኙ | +| `inception` | `inception` | Inception | API ቁልፍ | [አገናኝ](https://docs.inceptionlabs.ai) | ሲመዘገቡ 10M ነፃ tokens፣ የክሬዲት ካርድ አያስፈልግም። | +| `inference-net` | `inet` | Inference.net | API ቁልፍ | [አገናኝ](https://inference.net) | ሲመዘገቡ $25 ነፃ ክሬዲቶች፣ በተጨማሪም የምርምር ድጎማዎች ይገኛሉ | +| `internlm` | `internlm` | InternLM (Intern-S1) | API ቁልፍ | [አገናኝ](https://internlm.intern-ai.org.cn/) | ነፃ ወርሃዊ ኮታ ~1M የግቤት / 3M የውጤት tokens (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API ቁልፍ፣ embed/rerank | [አገናኝ](https://jina.ai) | ለapi.jina.ai የBearer API ቁልፍ — embeddings፣ rerank፣ classify፣ segment እና search። የዳሽቦርድ ቁልፎች ከJINA_AI_API_KEY ቅድሚያ ያገኛሉ። ይህ የReader / r.jina.ai ካርድ አይደለም፣ URLsንም አያወርድም። | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API ቁልፍ | [አገናኝ](https://jina.ai/reader) | ለr.jina.ai URL-ወደ-markdown (/v1/web/fetch ብቻ) የBearer API ቁልፍ። /v1/embeddings ወይም /v1/rerankን አያቀርብም። ከFoundation API ጋር ተመሳሳዩ የJina ቶከን ይሰራል፤ ይህ ካርድ ባዶ ሲሆን OmniRoute የjina-ai ዳሽቦርድ ቁልፍን ወይም JINA_AI_API_KEYን እንደገና ይጠቀማል። | +| `kenari` | `kenari` | Kenari | API ቁልፍ | [አገናኝ](https://kenari.id) | የKenari API ቁልፍዎን (kn-...) በAuthorization: Bearer ውስጥ ይጠቀሙ። ከOpenAI ጋር ሙሉ በሙሉ ተኳሃኝ ነው። የAPI መሠረታዊ URL፦ https://kenari.id/v1። | +| `kie` | `kie` | KIE.AI | API ቁልፍ | [አገናኝ](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (የቆየ Moonshot API) | API ቁልፍ | [አገናኝ](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API ቁልፍ | [አገናኝ](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API ቁልፍ | [አገናኝ](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://leonardo.ai) | API ቁልፍን ከleonardo.ai/developer ያግኙ | +| `liquid` | `liquid` | Liquid AI | API ቁልፍ | [አገናኝ](https://liquid.ai) | API ቁልፍን ከliquid.ai ያግኙ | +| `literouter` | `literouter` | LiteRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://literouter.com) | ነፃ የሞዴል ልዩነቶች የ:free ቅጥያን ይጠቀማሉ፤ ዕለታዊ የክሬዲት ገደቦች እንደ ሞዴሉ ይለያያሉ፣ እና ነፃ ግብዓት በ5,000 ቶከኖች የተገደበ ነው። | +| `llamagate` | `llamagate` | LlamaGate | API ቁልፍ | [አገናኝ](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://llm.kiwi) | ነፃው ዕቅድ auto እና hrLLMን ያቀርባል፤ ይፋ የተደረገው የ40 ጥያቄዎች/ሰዓት ገደብ በhrLLM ላይ ይተገበራል። | +| `llm7` | `llm7` | LLM7.io | API ቁልፍ | [አገናኝ](https://llm7.io) | ባዶ ያልሆነ ማንኛውንም ቁልፍ ይጠቀሙ (ለምሳሌ 'unused')። የቆዩ አብሮገነብ ሞዴሎች model_unavailableን ከመለሱ፣ Available Models → Import from /models ወይም Auto-Syncን ይጠቀሙ፤ በቀጥታ ስርጭት የተረጋገጠ ሞዴል፦ gemini-3.1-flash-lite። | +| `llmgateway` | `llmgateway` | LLM Gateway | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://llmgateway.io) | በአስተናጋጅ የሚቀርብ ነፃ ዕቅድ፦ መለያው ክሬዲት ከሌለው ነፃ ዋጋ ያላቸው ሞዴሎች በ10 ደቂቃ ውስጥ በ5 ጥያቄዎች የተገደቡ ናቸው። | +| `logfare` | `logfare` | Logfare | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://logfare.ai) | ወዲያውኑ API ቁልፍ ለማግኘት በhttps://logfare.ai/register ነፃ መለያ ይፍጠሩ (የተጠቃሚ ስም/የይለፍ ቃል፣ የኢሜይል ማረጋገጫ አያስፈልግም)፤ ከዚያ እዚህ እንደ Bearer ቶከን ይለጥፉት። | +| `longcat` | `lc` | LongCat AI | API ቁልፍ | [አገናኝ](https://longcat.chat/platform/docs) | ነፃ፦ መለያ ከተመዘገበ እና KYC ማረጋገጫ ከተጠናቀቀ በኋላ አንድ ጊዜ የሚሰጥ የ10M-ቶከን ድጎማ (LongCat-2.0)። ለአንድ ጊዜ ብቻ ነው — በየቀኑ/በየወሩ የሚደገም ድልድል አይደለም። | +| `magnific` | `freepik` | Magnific | API ቁልፍ፣ ምስል | [አገናኝ](https://www.magnific.com) | API ቁልፍን ከmagnific.com/user/api-keys ያግኙ (ራስጌ x-magnific-api-key)። የቆዩ የFreepik ገንቢ ቁልፎች አሁንም ይሰራሉ። | +| `maritalk` | `maritalk` | Maritalk | API ቁልፍ | [አገናኝ](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://meganova.ai) | ያለ ካርድ ነፃ ምዝገባ። ይፋ የተደረጉት የTier 1 የእያንዳንዱ ሞዴል ኮታዎች በድምሩ 550 ጥያቄዎች/ቀን ናቸው፤ እነዚህ የጋራ ዓለም አቀፍ ማከማቻ አይደሉም፣ እና ከኮታ በላይ የሚከፈል አጠቃቀም ከነቃ ተጨማሪ ክፍያ ሊተገበር ይችላል። | +| `meta-llama` | `meta` | Meta Llama API | API ቁልፍ | [አገናኝ](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (ቻይና) | API ቁልፍ | [አገናኝ](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API ቁልፍ | [አገናኝ](https://mistral.ai) | ነፃ Experiment ደረጃ፦ የክሬዲት ካርድ ሳያስፈልግ በጥያቄ ፍጥነት ገደብ ወደ ሁሉም ሞዴሎች መዳረሻ | +| `mixedbread` | `mxbai` | Mixedbread AI | API ቁልፍ | [አገናኝ](https://www.mixedbread.com) | ለMixedbread embeddings API የBearer API ቁልፍ። | +| `mixlayer` | `mixlayer` | Mixlayer | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.mixlayer.com) | qwen/qwen3.5-4b-free ሞዴል ለፕሮቶታይፕ ስራ ነፃ ሲሆን የጥያቄ ፍጥነቱ የተገደበ ነው፤ የተወሰነ ይፋዊ RPM ወይም ዕለታዊ ኮታ አልተረጋገጠም። | +| `mnn-ai` | `mnn-ai` | MNN AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://mnnai.ru) | ነፃ ዕቅድ፦ በወር $1 ክሬዲት፣ 10 RPM እና Free ተብለው የተሰየሙ ሞዴሎችን ብቻ የመጠቀም መዳረሻ። | +| `modal` | `mdl` | Modal | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://modal.com/docs) | ከነቃ፣ የModal ማሰማሪያዎን የሚጠብቀውን bearer ቶከን ይጠቀሙ። መሠረታዊ URL ከOpenAI ጋር ተኳሃኝ ወደሆነው የModal መተግበሪያዎ መጠቆም አለበት፤ ለምሳሌ https://--.modal.run/v1። | +| `modelscope` | `ms` | ModelScope | API ቁልፍ | [አገናኝ](https://modelscope.cn) | በModelScope API-Inference በኩል ነፃ ደረጃ — የAlibaba መለያ ያስፈልጋል። | +| `monsterapi` | `monster` | MonsterAPI | API ቁልፍ | [አገናኝ](https://monsterapi.ai) | ⚠️ **ጊዜ ያለፈበት።** Monster API በ2026-06-30 ሥራውን አቁሟል። አማራጭ ከOpenAI ጋር ተኳሃኝ አቅራቢዎችን ይጠቀሙ። | +| `moonshot` | `moonshot` | Kimi | API ቁልፍ | [አገናኝ](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API ቁልፍ | [አገናኝ](https://morphllm.com) | ነፃ ደረጃ፦ 250K ክሬዲቶች/ወር፣ $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API ቁልፍ | [አገናኝ](https://github.com/meta-llama/llama-stack) | የMETA_API_KEY env varዎን እንደ Bearer ቶከን ይጠቀሙ። Muse Code CLI የOpenAI Responses API የውሂብ ልውውጥ ቅርጸትን ይጠቀማል (POST /responses)። | +| `naga-ac` | `naga` | Naga.ac | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://naga.ac) | API ቁልፍን ከnaga.ac ያግኙ — በGoogle/GitHub/Discord መመዝገብ ይቻላል። | +| `naga-ai` | `naga-ai` | Naga AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://naga.ac) | :free የሚል ምልክት ያላቸው ሞዴሎች በይፋ ተዘርዝረዋል፣ ነገር ግን የተረጋገጠ ቁጥራዊ ኮታ የለም። የNaga ፖሊሲ የነፃ ደረጃ ጥያቄዎችና ውጤቶች ሊሰበሰቡ ወይም ለሥልጠና ሊውሉ እንደሚችሉ ያስጠነቅቃል። | +| `nanogpt` | `nanogpt` | NanoGPT | API ቁልፍ | [አገናኝ](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API ቁልፍ | [አገናኝ](https://bynara.id) | ነፃ የNaraRouter መለያ ይፍጠሩ፣ Telegramዎን ያገናኙ (/v1 መልሶችን ከማግኘትዎ በፊት ያስፈልጋል)፣ ከዚያም ቁልፉን እዚህ እንደ Bearer token ይለጥፉ። | +| `navy` | `navy` | NavyAI | API ቁልፍ | [አገናኝ](https://api.navy) | ከNavyAI ዳሽቦርድ ነፃ API ቁልፍ ይፍጠሩ፣ ከዚያም እዚህ እንደ Bearer token ይለጥፉት። | +| `nebius` | `nebius` | Nebius AI | API ቁልፍ | [አገናኝ](https://nebius.com) | ለAPI ሙከራ ሲመዘገቡ ~$1 የሙከራ ክሬዲት | +| `nlpcloud` | `nlpc` | NLP Cloud | API ቁልፍ | [አገናኝ](https://docs.nlpcloud.com) | የNLP Cloud API ቁልፍዎን በAuthorization: Token ውስጥ ይጠቀሙ። OmniRoute በነባሪነት https://api.nlpcloud.io/v1/gpu//chatbot ላይ ያለውን የቻትቦት endpoint ያነጣጥራል። | +| `nomic` | `nomic` | Nomic | API ቁልፍ | [አገናኝ](https://nomic.ai) | API ቁልፉን ከatlas.nomic.ai ያግኙ | +| `nous-research` | `nous` | Nous Research | API ቁልፍ | [አገናኝ](https://portal.nousresearch.com/help) | የNous Portal API ቁልፍዎን ይጠቀሙ። OmniRoute በhttps://inference-api.nousresearch.com/v1 ያለውን ይፋዊ OpenAI-ተኳሃኝ inference endpoint ያነጣጥራል። | +| `novita` | `novita` | Novita AI | API ቁልፍ፣ ቪዲዮ፣ አሰባሳቢ | [አገናኝ](https://novita.ai) | ሲመዘገቡ $0.50 የሙከራ ክሬዲት (ለ1 ዓመት ገደማ የሚያገለግል) | +| `nscale` | `nscale` | nScale | API ቁልፍ | [አገናኝ](https://nscale.com) | ለinference ሙከራ ሲመዘገቡ $5 ነፃ ክሬዲት | +| `nube` | `nube` | Nube.sh | API ቁልፍ | [አገናኝ](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API ቁልፍ | [አገናኝ](https://build.nvidia.com) | ነፃ የገንቢ መዳረሻ፦ ~40 RPM፣ 70+ ሞዴሎች (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API ቁልፍ፣ ድርጅታዊ | [አገናኝ](https://www.oracle.com/artificial-intelligence/generative-ai) | የOCI Generative AI API ቁልፍዎን ወይም IAM bearer token ይጠቀሙ። መሠረታዊ URL https://inference.generativeai..oci.oraclecloud.com/openai/v1/ ሊሆን ይችላል። | +| `ofoxai` | `ofoxai` | OfoxAI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://ofox.ai) | የአሁኑ ካታሎግ ይፋዊ ቁጥራዊ ኮታ የሌላቸው 10+ ነፃ ሞዴሎችን ያስተዋውቃል፤ ለምርት አገልግሎት ከመጠቀምዎ በፊት የላይኛውን ምንጭ፣ የውሂብ ማቆያ እና የሥልጠና ውሎችን ይገምግሙ። | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API ቁልፍ | [አገናኝ](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API ቁልፍ | [አገናኝ](https://1min.ai) | API ቁልፍ በhttps://docs.1min.ai/docs/api/create-api-key ይፍጠሩ፣ ከዚያም እዚህ ይለጥፉት። | +| `openadapter` | `oad` | OpenAdapter | API ቁልፍ | [አገናኝ](https://openadapter.dev) | የOpenAdapter API ቁልፍዎን በAuthorization: Bearer sk-cv- ውስጥ ይጠቀሙ። ሙሉ በሙሉ OpenAI-ተኳሃኝ ነው። የAPI መሠረታዊ URL፦ https://api.openadapter.in/v1። | +| `openai` | `openai` | OpenAI | API ቁልፍ | [አገናኝ](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API ቁልፍ | [አገናኝ](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API ቁልፍ | [አገናኝ](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API ቁልፍ | [አገናኝ](https://openference.com) | ነፃ ደረጃ፦ Qwen3.8 27b እና Llama 3.2 3Bን ያካትታል — የአሁኑን ውሎች ለማየት openference.com/pricingን ይመልከቱ | +| `openrouter` | `openrouter` | OpenRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://openrouter.ai) | :free ቅጥያ ያላቸው ነፃ ሞዴሎች በ$0/token - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API ቁልፍ | [አገናኝ](https://openvecta.com) | በLLMs፣ embeddings እና የ reasoning ሞዴሎች ላይ ለOpenAI-ተኳሃኝ inference ሲመዘገቡ ነፃ ክሬዲት | +| `opper` | `opper` | Opper | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API ቁልፍ | [አገናኝ](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API ቁልፍ | [አገናኝ](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API ቁልፍ | [አገናኝ](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API ቁልፍ | [አገናኝ](https://www.perplexity.ai) | የPerplexity API ቁልፍዎን ይጠቀሙ። OmniRoute የAgent API ሞዴል IDsን በPerplexity Responses-ተኳሃኝ endpoint በኩል ያስተላልፋል። | +| `piapi` | `pi` | PiAPI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API ቁልፍ | [አገናኝ](https://pioneer.ai) | $75 ነፃ የአጠቃቀም ክሬዲት — የክሬዲት ካርድ አያስፈልግም | +| `plamo` | `plamo` | PLaMo | API ቁልፍ | [አገናኝ](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://creator.poe.com/api-reference) | ለPoe OpenAI-ተኳሃኝ API የBearer API ቁልፍ። | +| `poixe-ai` | `poixe-ai` | Poixe AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://poixe.com) | የአሁኑ ይፋዊ ነፃ ገደቦች አነስተኛና ለየሞዴል ቡድኑ የተወሰኑ ናቸው፦ ለlarge-cup ሞዴሎች 2 RPM/5 RPD እና ለsmall-cup ሞዴሎች 20 RPM/50 RPD። | +| `pollinations` | `pol` | Pollinations AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://pollinations.ai) | በሰነድ የተገለጹትን ነፃ ሞዴሎች በስም-አልባ/ቁልፍ-አልባ ሁኔታ መድረስ በተቻለ መጠን ብቻ የሚቀርብ ነው። የአካባቢ v3.8.50 ማረጋገጫ (2026-07-31) በOmniRoute በኩል 401 እና ከተመሳሳይ አውታረ መረብ በቀጥታ የላይኛውን አገልግሎት ሲፈትሽ Cloudflare 1010 መልሷል። Premium ሞዴሎች አሁንም ከenter.pollinations.ai የሚገኝ Pollinations API ቁልፍ ያስፈልጋቸዋል። | +| `poolside` | `poolside` | Poolside | API ቁልፍ | [አገናኝ](https://poolside.ai) | Laguna S 2.1 እና XS 2.1 በPreview ጊዜ ነፃ ናቸው፤ ይፋዊ ቁጥራዊ ኮታ አልታተመም። | +| `predibase` | `predibase` | Predibase | API ቁልፍ | [አገናኝ](https://predibase.com) | ⚠️ **ጥቅም ላይ እንዳይውል የተደረገ።** serving.app.predibase.com ከእንግዲህ resolve አያደርግም (ፍተሻ 2026-06-19)፤ የሚተዳደረው serving API የተቋረጠ ይመስላል። | +| `publicai` | `publicai` | PublicAI | API ቁልፍ | [አገናኝ](https://publicai.co) | API ቁልፍ ያስፈልጋል — አንድ ጊዜ ሲመዘገቡ ክሬዲት ያገኛሉ፣ ከዚያ በኋላ ክፍያ ያስፈልጋል | +| `qianfan` | `qianfan` | Baidu Qianfan | API ቁልፍ | [አገናኝ](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API ቁልፍ | [አገናኝ](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API ቁልፍ | [አገናኝ](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API ቁልፍ | [አገናኝ](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API ቁልፍ፣ ምስል | [አገናኝ](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API ቁልፍ | [አገናኝ](https://regolo.ai) | የRegolo API ቁልፍዎን ከregolo.ai ያግኙ፣ ከዚያ እዚህ እንደ Bearer token ይለጥፉት። | +| `reka` | `reka` | Reka | API ቁልፍ | [አገናኝ](https://docs.reka.ai/chat/overview) | የReka API ቁልፍዎን ይጠቀሙ። OmniRoute ከOpenAI ጋር ተኳሃኝ የሆነውን መሠረታዊ URL https://api.reka.ai/v1 ይጠቀማል፣ እንዲሁም ለተኳሃኝነት ሁለቱንም Authorization እና X-Api-Key headers ይልካል። | +| `requesty` | `requesty` | Requesty | API ቁልፍ | [አገናኝ](https://requesty.ai) | ነፃ ደረጃ ~200 ጥያቄዎች/ቀን - ባለብዙ-ሞዴል ማስተላለፊያ መግቢያ (300+ ሞዴሎች) | +| `routeway` | `routeway` | Routeway | API ቁልፍ | [አገናኝ](https://routeway.ai) | በrouteway.ai ነፃ API ቁልፍ ይፍጠሩ፣ ከዚያ እዚህ እንደ Bearer token ይለጥፉት። | +| `runwayml` | `runway` | Runway | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://docs.dev.runwayml.com) | የRunway API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። OmniRoute አሁን ያለውን Runway API በhttps://api.dev.runwayml.com/v1 ይጠቀማል፣ እንዲሁም አስፈላጊውን X-Runway-Version header በራስ-ሰር ይልካል። | +| `sambanova` | `samba` | SambaNova | API ቁልፍ | [አገናኝ](https://sambanova.ai) | ሲመዘገቡ $5 ነፃ ክሬዲት (የ30-ቀን የሚያገለግል)፣ ክሬዲት ካርድ አያስፈልግም | +| `sap` | `sap` | SAP Generative AI Hub | API ቁልፍ፣ የድርጅት | [አገናኝ](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | የSAP AI Core bearer tokenዎን ይጠቀሙ። መሠረታዊ URL የAI_API_URL rootዎ ወይም ከGenerative AI Hub የተገኘ deploymentUrl ሊሆን ይችላል። | +| `sarvam` | `sarvam` | Sarvam AI | API ቁልፍ | [አገናኝ](https://docs.sarvam.ai) | ሲመዘገቡ ₹1,000 ነፃ ክሬዲት — ፈጽሞ አያልቅም | +| `scaleway` | `scw` | Scaleway AI | API ቁልፍ | [አገናኝ](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | ለአዲስ መለያዎች 1M ነፃ tokens — EU/GDPRን የሚያከብር (Paris)፣ Qwen3 235B እና Llama 70B | +| `sealion` | `sealion` | SEA-LION | API ቁልፍ | [አገናኝ](https://sea-lion.ai) | በsea-lion.ai በGoogle ይግቡ (ካርድ አያስፈልግም፣ የክልል ገደብ የለም)፣ API ቁልፍ ይፍጠሩ፣ ከዚያ እዚህ ይለጥፉት። | +| `seekai` | `ska` | SeekAi | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://seekai.cc) | በhttps://seekai.cc API ቁልፍ ይፍጠሩ፣ ከዚያ እዚህ እንደ Bearer token ይለጥፉት። | +| `segmind` | `segmind` | Segmind | API ቁልፍ፣ ምስል፣ ቪዲዮ | [አገናኝ](https://segmind.com) | የSegmind API ቁልፍዎን በx-api-key header ውስጥ ይጠቀሙ። OmniRoute https://api.segmind.com/v1/ን ይጠቀማል፣ እንዲሁም የተፈጠረውን የምስል/ቪዲዮ bytes በቀጥታ ይመልሳል። | +| `sensenova` | `sensenova` | SenseNova | API ቁልፍ | [አገናኝ](https://platform.sensenova.cn) | API ቁልፍን ከplatform.sensenova.cn ያግኙ | +| `siliconflow` | `siliconflow` | SiliconFlow | API ቁልፍ | [አገናኝ](https://cloud.siliconflow.com) | $1 ነፃ ክሬዲት እና ማንነት ከተረጋገጠ በኋላ በአሁኑ ጊዜ $0 ተብለው የተዘረዘሩ ሞዴሎች፤ ተገኝነት እና ገደቦች ሊለወጡ ይችላሉ | +| `snowflake` | `snowflake` | Snowflake Cortex | API ቁልፍ፣ የድርጅት | [አገናኝ](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API ቁልፍ | [አገናኝ](https://xinghuo.xfyun.cn) | API ቁልፍን ከconsole.xfyun.cn ያግኙ | +| `speka` | `speka` | Speka AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://speka.me) | ነፃ ዕቅድ፦ በወር $1 አጠቃቀም፣ 10 RPM፣ አንድ API ቁልፍ፣ እንዲሁም ክፍት ሞዴሎችን እና playgroundን የመጠቀም ዕድል፤ ካርድ አያስፈልግም። | +| `stability-ai` | `stability` | Stability AI | API ቁልፍ፣ ምስል | [አገናኝ](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API ቁልፍ | [አገናኝ](https://stepfun.com) | API ቁልፍን ከplatform.stepfun.com ያግኙ | +| `sumopod` | `sumopod` | SumoPod | API ቁልፍ | [አገናኝ](https://ai.sumopod.com) | የSumoPod API ቁልፍዎን (sk-...) በAuthorization: Bearer ውስጥ ይጠቀሙ። ከOpenAI ጋር ሙሉ በሙሉ ተኳሃኝ ነው። የAPI መሠረታዊ URL፦ https://ai.sumopod.com/v1። | +| `suno` | `suno` | Suno | API ቁልፍ | [አገናኝ](https://suno.ai) | ከsuno.ai የsession cookieን (Clerk auth) ይለጥፉ | +| `synthetic` | `synthetic` | Synthetic | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API ቁልፍ | [አገናኝ](https://hunyuan.tencent.com) | API ቁልፍን ከconsole.cloud.tencent.com ያግኙ | +| `thebai` | `thebai` | TheB.AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://theb.ai) | ከOpenAI ጋር ለሚጣጣመው የTheB.AI gateway የBearer API ቁልፍ። | +| `tinyfish` | `tf` | TinyFish Fetch | API ቁልፍ | [አገናኝ](https://docs.tinyfish.ai/fetch-api) | X-API-Key ከagent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API ቁልፍ፣ ቪዲዮ | [አገናኝ](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API ቁልፍ | [አገናኝ](https://agent-router.gaib.ai) | የToken Kiosk API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ከOpenAI ጋር ሙሉ በሙሉ ተኳሃኝ gateway። የAPI መሠረታዊ URL፦ https://agent-router.gaib.ai/v1። | +| `tokenreply` | `tokenreply` | TokenReply | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.tokenreply.com) | ነፃ ተብለው የተሰየሙ ሞዴሎች በሞዴሉ እና በዘመቻው የሚወሰኑ ዕለታዊ ገደቦች አሏቸው፤ የተወሰነ አጠቃላይ ነፃ ኮታ አልታተመም። | +| `tokenrouter` | `trk` | TokenRouter | API ቁልፍ | [አገናኝ](https://tokenrouter.com) | የTokenRouter API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ከOpenAI ጋር ሙሉ በሙሉ ተኳሃኝ ነው። የAPI መሠረታዊ URL፦ https://api.tokenrouter.com/v1። | +| `topaz` | `topaz` | Topaz | API ቁልፍ፣ ምስል | [አገናኝ](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API ቁልፍ | [አገናኝ](https://docs.opentyphoon.ai) | የ5 req/s እና 200 req/m የፍጥነት ገደብ ያለው ነፃ API ቁልፍ። | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API ቁልፍ | [አገናኝ](https://uncensored.com) | የuncensored.com Developer API ቁልፍዎን (uai_sk_live_...) ይጠቀሙ። OmniRoute ይህንን እንደ X-api-key ራስጌ ወደ OpenAI-ተኳሃኝ https://api.uncensored.com/api/v1 መጨረሻ ነጥብ ይልከዋል። ቁልፉ ፈጽሞ ጊዜው አያልፍበትም። ይህ በአጠቃቀም/ክሬዲት የሚለካው አገልግሎት ነው፤ ያልተለካው የደንበኝነት ምዝገባ ውይይት የተለየው 'uc' አቅራቢ ነው። | +| `udio` | `udio` | Udio | API ቁልፍ | [አገናኝ](https://udio.com) | ከudio.com የክፍለ ጊዜ ኩኪውን (Supabase ማረጋገጫ) ይለጥፉ | +| `unorouter` | `unorouter` | UnoRouter | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://unorouter.ai) | :free ቅጥያ ያላቸው ሞዴሎች ቀሪ ሂሳብን አይቀንሱም፤ ገደቡ ለእያንዳንዱ ተጠቃሚ በእያንዳንዱ ነጻ ሞዴል በደቂቃ 1 ጥያቄ ነው። | +| `upstage` | `upstage` | Upstage | API ቁልፍ | [አገናኝ](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API ቁልፍ | [አገናኝ](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API ቁልፍ | [አገናኝ](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API ቁልፍ፣ የድርጅት | [አገናኝ](https://cloud.google.com/vertex-ai) | Service Account JSON፣ OAuth የመዳረሻ ቶከን፣ Vertex Express API ቁልፍ ወይም ከአገልግሎት መለያ ጋር የተያያዘ የፈቃድ ቁልፍ ያቅርቡ። Express ሁነታ Geminiን ብቻ ይደግፋል፤ የአጋር ሞዴሎች በፕሮጀክት የተወሰኑ ምስክርነቶችን ይፈልጋሉ። | +| `vertex-partner` | `vp` | Vertex AI Partners | API ቁልፍ፣ የድርጅት | [አገናኝ](https://cloud.google.com/vertex-ai) | Service Account JSON ወይም OAuth ምስክርነቶችን ያቅርቡ። ከአገልግሎት መለያ ጋር የተያያዘ የፈቃድ ቁልፍም ፍለጋን ይደግፋል፣ ነገር ግን የአጋር ማስኬድ በተጨማሪ የGoogle Cloud ፕሮጀክት IDውን ይፈልጋል። መደበኛ Express ቁልፎች Geminiን ብቻ ይደግፋሉ። | +| `void-ai` | `void-ai` | Void AI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://voidai.app) | ይፋዊው የሞዴል ካታሎግ አንዳንድ ሞዴሎችን የነጻ ዕቅድ መስፈርት እንዳላቸው ያመለክታል፣ ነገር ግን መዳረሻው በሁኔታዎች የተወሰነ ሲሆን ምንም የተረጋገጠ የቁጥር ኮታ የለም። | +| `volcengine` | `volcengine` | Volcengine | API ቁልፍ | [አገናኝ](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API ቁልፍ | [አገናኝ](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | የVolcano Engine መለያዎን ያገናኙ ወይም የArk Agent Plan የደንበኝነት ምዝገባ API ቁልፍ ይጠቀሙ። | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API ቁልፍ | [አገናኝ](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | የVolcano Engine መለያዎን ያገናኙ ወይም የArk Coding Plan የደንበኝነት ምዝገባ API ቁልፍ ይጠቀሙ። | +| `voyage-ai` | `voyage` | Voyage AI | API ቁልፍ፣ ማካተት/እንደገና ደረጃ መስጠት | [አገናኝ](https://www.voyageai.com) | ለVoyage AI ማካተቻዎች እና የድጋሚ ደረጃ መስጫ APIዎች የBearer API ቁልፍ። | +| `wafer` | `wafer` | Wafer AI | API ቁልፍ | [አገናኝ](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API ቁልፍ | [አገናኝ](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API ቁልፍ፣ የድርጅት | [አገናኝ](https://www.ibm.com/products/watsonx-ai) | የwatsonx bearer ቶከንዎን ይጠቀሙ። መሠረታዊ URL https://.ml.cloud.ibm.com/ml/gateway/v1/ ወይም በራስ የሚተዳደር /ml/gateway/v1 መጨረሻ ነጥብ ሊሆን ይችላል። | +| `writer` | `writer` | Writer | API ቁልፍ | [አገናኝ](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API ቁልፍ | [አገናኝ](https://x5lab.dev) | የX5Lab API ቁልፍዎን (x5-...) በAuthorization: Bearer ውስጥ ይጠቀሙ። ሙሉ በሙሉ OpenAI-ተኳሃኝ ነው። የAPI መሠረታዊ URL፦ https://api.x5lab.dev/v1። | +| `xai` | `xai` | xAI (Grok) | API ቁልፍ | [አገናኝ](https://x.ai) | ይፋዊ የxAI API ቁልፍ ይጠቀሙ ወይም በxAI OAuth ይግቡ። Grok Build JWT ክፍለ ጊዜዎች እንደ የተለየ አቅራቢ ይቆያሉ። | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API ቁልፍ | [አገናኝ](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API ቁልፍ | [አገናኝ](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://xkiro.com) | በxkiro.com ነጻ መለያ ይፍጠሩ እና ቁልፉን እዚህ ይለጥፉ (Bearer፤ x-api-keyም ተቀባይነት አለው)። | +| `yi` | `yi` | Yi (01.AI) | API ቁልፍ | [አገናኝ](https://01.ai) | API ቁልፍን ከplatform.lingyiwanwu.com ያግኙ | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://yolo-auto.com) | ነጻ የAPI መዳረሻ በጥያቄ ብዛት የተገደበ እና ለሙከራ የታሰበ ነው፤ ምንም የቁጥር ዕለታዊ ኮታ አልታተመም፣ እንዲሁም ነጻ መዳረሻው ላልተወሰነ ጊዜ እንደሚቀጥል ቃል አልተገባም። | +| `zai` | `zai` | Z.AI | API ቁልፍ | [አገናኝ](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API ቁልፍ | [አገናኝ](https://zenmux.ai) | የZenMux API ቁልፍዎን በAuthorization: Bearer ውስጥ ይጠቀሙ። ZenMux ሙሉ በሙሉ OpenAI-ተኳሃኝ ነው። መሠረታዊ URL፦ https://zenmux.ai/api/v1። | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://www.zerolimitai.com) | ጊዜያዊ ነጻ ሙከራ እንዳለ ይተዋወቃል፣ ነገር ግን ይፋዊ ገጾች በ3 እና 7 ቀናት መካከል ይጋጫሉ፤ በቀን 100 ጥሪዎች የሚለው ይገባኛል እንደ ቋሚ አይወሰድም። | +| `zylo-api` | `zylo` | Zylo API | API ቁልፍ፣ አሰባሳቢ | [አገናኝ](https://zyloai.net) | መሠረታዊ ዕቅድ፦ 10 RPM፣ በቀን 7,200 ጥያቄዎች እና በቀን 200,000 ቶከኖች፤ በመሠረታዊ የጽሑፍ ሞዴሎች ብቻ የተገደበ። | ## አካባቢያዊ አቅራቢዎች (14) diff --git a/docs/i18n/am/docs/routing/REASONING_REPLAY.md b/docs/i18n/am/docs/routing/REASONING_REPLAY.md index b943b73bf4bf..93c2b7b7eeba 100644 --- a/docs/i18n/am/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/am/docs/routing/REASONING_REPLAY.md @@ -23,21 +23,23 @@ OmniRoute በማሰብ ሁነታ ሞዴሎች የሚመነጨውን የረዳት ``` ዙር N (ረዳቱ ያመነጫል): - → ምላሹ reasoning_content + tool_calls ይይዛል - → requiresReasoningReplay(provider, model) እውነት ከሆነ፦ cacheReasoningFromAssistantMessage() - በእያንዳንዱ tool_call.id ቁልፍነት (ማህደረ ትውስታ + DB) ላይ ይጽፋል - → ምላሹን ወደ ደንበኛው ያስተላልፋል (ደንበኛው ማመዛዘኑን ሊያቆየው ወይም ላያቆየው ይችላል) + → ምላሹ reasoning_content + tool_calls ይዟል + → requiresReasoningReplay(provider, model) ከሆነ፦ cacheReasoningFromAssistantMessage() + በእያንዳንዱ tool_call.id ቁልፍ ተደርጎ (memory + DB) ላይ ይጽፋል + → ምላሹን ምክንያታዊ ይዘቱን ሊያቆይም ላያቆይም ወደሚችለው ደንበኛ ያስተላልፋል ዙር N+1 (ደንበኛው ተከታይ ጥያቄ ይልካል): - → ተርጓሚው ያገኛል፦ requiresReasoningReplay(provider, model) === true + → ተርጓሚው ይህን ይለያል፦ requiresReasoningReplay(provider, model) === true → tool_calls ላለው እና reasoning_content ለሌለው ለእያንዳንዱ የረዳት መልዕክት፦ - lookupReasoning(toolCalls[0].id) → ማህደረ ትውስታ → DB - ከተገኘ → msg.reasoning_content = cached; recordReplay() - ካልተገኘ → msg.reasoning_content = "" (ለቆዩ የDeepSeek ስሪቶች ተኳሃኝነት የቆየ አማራጭ) - → የላይኛው አገልግሎት ወጥ ታሪክ ያያል → 400 አይኖርም + lookupReasoning(toolCalls[0].id) → memory → DB + ከተገኘ → msg.reasoning_content = cached; recordReplay() + ካልተገኘ → msg.reasoning_content = "" (ለቆዩ DeepSeek ስሪቶች የተተወ አማራጭ) + → ወደላይ ያለው አገልግሎት ወጥ የሆነ ታሪክ ያያል → 400 አይከሰትም ``` -ይዘት መያዝ በ`open-sse/handlers/chatCore.ts` ውስጥ ይከናወናል (በሁለት ቦታዎች፣ በሁለቱ የ`cacheReasoningFromAssistantMessage` ጥሪ ቦታዎች)። እንደገና ማጫወት በ`open-sse/translator/index.ts` ውስጥ ከመርሃግብር ማስማማት በኋላ፣ ነገር ግን ከማሰራጨት በፊት ይከናወናል። +ቀረጻው በ`open-sse/handlers/chatCore.ts` ውስጥ (በሁለት ቦታዎች፣ በሁለቱ የ`cacheReasoningFromAssistantMessage` ጥሪ ቦታዎች) ይከናወናል። ድጋሚ ማጫወቱ ከስኬማ ማስማማት በኋላ፣ ነገር ግን ከማሰራጨት በፊት በ`open-sse/translator/index.ts` ውስጥ ይከናወናል። + +ተራ (የመሣሪያ ጥሪ የሌላቸው) የረዳት ዙሮች በተለየ መንገድ ቁልፍ ይሰጣቸዋል፦ `buildAssistantMessageCacheKey()` የክፍለ-ጊዜውን ወሰን እና እስከዚያ ዙር ድረስ ያለውን መደበኛ የተደረገ የOpenAI-ቅርጸት ውይይት ዲጄስት ያደርጋል፤ ምክንያቱም `tools` ከተካተተ በኋላ DeepSeek የ_እያንዳንዱን_ ቀዳሚ ዙር ምክንያታዊ ይዘት ይፈልጋል። ለResponses-API ዒላማዎች (ለምሳሌ `opencode-go/deepseek-v4-flash`፣ ወደ `/responses` የሚመራ) ወደላይ የሚላከው የጥያቄ አካል `messages` ሳይሆን `input` ይይዛል፤ ስለዚህ `translateRequest()` (`open-sse/translator/index.ts`) በመልሶ ጥሪ አማራጭ በኩል ዲጄስት ያደረገውን የሽግግር ውይይት ሪፖርት ያደርጋል፣ የቀረጻ ቦታዎቹም ያንኑ ውይይት ዲጄስት ያደርጋሉ። የResponses ድጋሚ ማጫወት ሂደት ለእያንዳንዱ የምንጭ ቅርጸት በOpenAI የሽግግር ቅርጽ ላይ ይሠራል፤ ስለዚህ የAnthropic Messages ደንበኞችም (Claude → OpenAI → Responses) እንደገና ይጫወታሉ። ## ማከማቻ — ድብልቅ ማህደረ ትውስታ + SQLite @@ -56,9 +58,9 @@ OmniRoute በማሰብ ሁነታ ሞዴሎች የሚመነጨውን የረዳት - ከፍተኛው የማህደረ ትውስታ ግቤቶች ብዛት፦ `200` (`MAX_MEMORY_ENTRIES`) - ማስወገድ፦ አሮጌው `createdAt` መጀመሪያ -## የውሂብ ጎታ መርሃግብር +## የውሂብ ጎታ መዋቅር -ፍልሰት፦ `src/lib/db/migrations/033_create_reasoning_cache.sql` +ማይግሬሽን፦ `src/lib/db/migrations/033_create_reasoning_cache.sql` ```sql CREATE TABLE IF NOT EXISTS reasoning_cache ( @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -ማውጫዎች፦ `expires_at`፣ `provider`፣ `model`፣ `created_at`። `expires_at` እንደ Unix epoch ሰከንዶች ይከማቻል፤ የSELECT ንብርብር የቆዩ የጽሑፍ እሴቶችን በ`EXPIRES_AT_EPOCH_SQL` በኩል ወደ መደበኛ ቅርጽ ይቀይራል። +ኢንዴክሶች፦ `expires_at`፣ `provider`፣ `model`፣ `created_at`። `expires_at` እንደ Unix epoch ሰከንዶች ይከማቻል፤ የSELECT ንብርብር የቆዩ የጽሑፍ እሴቶችን በ`EXPIRES_AT_EPOCH_SQL` በኩል ደረጃቸውን ያስተካክላል። ## አቅራቢ / ሞዴል ማወቂያ diff --git a/docs/i18n/am/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/am/docs/security/SOCKET_DEV_FINDINGS.md index eda62b3321d8..fda6bfccc81c 100644 --- a/docs/i18n/am/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/am/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- +> **የወሰን ማስታወሻ፦** `socket.yml` የSocket.devን በሬጅስትሪ በኩል የሚካሄድ ከህትመት በኋላ ያለውን የnpm አርቲፋክት ቅኝት ያዋቅራል (እንደ `tests/`፣ `docs/` እና የግንባታ ሪፖርቶች ያሉ በሚለቀቀው ጥቅል ውስጥ የማይካተቱ ይዘቶችን ችላ የሚሉ ዱካዎች)። የCI/PR ውህደት መቆጣጠሪያን አያገናኝም — በ`.github/workflows` ውስጥ ምንም የስራ ፍሰት፣ ምንም የ`package.json` ስክሪፕት እና ምንም የ`Makefile` ዒላማ Socket.devን አይጠራም። + ይህ ሰነድ በ`omniroute@3.8.5` ላይ ለተነሱት ስድስት `AI-detected potential malware` ግኝቶች እና በ`omniroute@3.8.6` ላይ -ለተተገበሩት የመከላከያ ማሻሻያዎች በጥገና ኃላፊው የተዘጋጀ ማረጋገጫ ነው። ዓላማውም፦ - -1. የደህንነት ፓይፕላይን ኦፕሬተሮች ግኝቶቹን ከትክክለኛው ምንጭ - አንጻር መገምገም ሲያስፈልጋቸው ሊጠቅሱት የሚችሉት አንድ ማጣቀሻ እንዲኖራቸው ነው። -2. የወደፊት AI ስካነሮች እያንዳንዱ ጥቆማ የተደረገበት ዱካ ሆን ተብሎ የተሰራ፣ - በፈቃድ ብቻ የሚነቃ እና በሰነድ የተገለጸ መሆኑን የሚያሳየውን በጥገና ኃላፊው የተፈረመ ማረጋገጫ እንዲያገኙ ነው። -3. እያንዳንዱ የጥሪ ቦታ በዚህ መልኩ የተቀረጸበትን _ምክንያት_ የሚያስረዳ የጽሑፍ መዝገብ እንዲኖረን ነው — - በዚህም የወደፊት የኮድ መልሶ-ማዋቀር ሆን ተብሎ የተወገደን አሻራ - በድንገት እንዳያስመልስ። - -የv3.8.6 የመከላከያ ማሻሻያዎች ከተለቀቁ በኋላ ከታች ካሉት የጥሪ ቦታዎች -ማንኛውንም እንደገና ጥቆማ የሚያደርግ ስካነር የምታስተዳድሩ ከሆነ፣ እባክዎ ከስካን ዱካው ጋር -issue ይክፈቱ፤ እኛም ማረጋገጫውን እዚህ እናስፋፋለን። +ለተተገበሩት ማቃለያዎች በጥገና አስተዳዳሪው የተዘጋጀ ማረጋገጫ ነው። የሚከተሉትን ለማስቻል ተዘጋጅቷል፦ + +1. የደህንነት ፓይፕላይን ኦፕሬተሮች ግኝቶቹን ከትክክለኛው ምንጭ ጋር + ማገናዘብ ሲያስፈልጋቸው የሚጠቅሱት አንድ ወጥ ማጣቀሻ እንዲኖራቸው። +2. ወደፊት የሚመጡ የAI ስካነሮች ምልክት የተደረገበት እያንዳንዱ + ዱካ ሆን ተብሎ የተሰራ፣ በምርጫ ብቻ የሚነቃ እና በሰነድ የተብራራ መሆኑን የሚገልጸውን በጥገና አስተዳዳሪው የተፈረመ ማረጋገጫ እንዲለዩ። +3. እያንዳንዱ የጥሪ ቦታ በዚህ መልኩ የተቀረጸበትን _ምክንያት_ የሚገልጽ የጽሑፍ መዝገብ እንዲኖረን — + በዚህም ወደፊት የሚደረግ የኮድ መልሶ ማዋቀር ሆን ተብሎ የተወገደን የመለያ ንድፍ + በስህተት ዳግም እንዳያስገባ። + +የv3.8.6 ማቃለያዎች ከተለቀቁ በኋላ ከታች ካሉት የጥሪ ቦታዎች ውስጥ +ማንኛቸውንም ዳግም ምልክት የሚያደርግ ስካነር የምታስተዳድሩ ከሆነ፣ ከቅኝቱ ዱካ ጋር አንድ ጉዳይ ይክፈቱ፤ +እኛም ማረጋገጫውን እዚህ እናስፋፋለን። --- diff --git a/docs/i18n/ar/README.md b/docs/i18n/ar/README.md index d12a7a65cec2..94a634172933 100644 --- a/docs/i18n/ar/README.md +++ b/docs/i18n/ar/README.md @@ -19,17 +19,17 @@
-## 💰 نحو 1.62B من الرموز المجانية شهريًا +## 💰 ~1.62 مليار رمز مجاني / شهريًا
-> إن تجميع الخطط المجانية يدويًا أمر شاق — عشرات حزم SDK، وعشرات حدود المعدل، ولا توجد طريقة لمعرفة مقدار ما لديك فعليًا. يفهرس OmniRoute **491 إدخالًا ضمن الخطط المجانية عبر 35 مفتاحًا للتجمعات المتكررة**، ويحسب إجمالي الرموز الرئيسي استنادًا إلى **17 تجمعًا بميزانية شهرية موجبة ومنشورة، بالإضافة إلى خمسة حدود Groq لكل نموذج**، مع إزالة التكرار حسب التجمع المشترك. تُعرض بشكل منفصل الحصص التي لا تتاح إلا بعد التحقق الإقليمي من الهوية (حاليًا: ModelScope)، بما يزيد عن نحو 6M خلف التحقق الإقليمي من الهوية، ولا تُضاف أبدًا إلى الإجمالي الرئيسي. وتظل النتيجة ظاهرة في لوحة المعلومات (`/dashboard/free-tiers`). +> إن تجميع الخطط المجانية يدويًا أمر شاق — عشرات حزم SDK، وعشرات حدود المعدّل، ولا توجد طريقة لمعرفة مقدار ما تملكه فعليًا. يفهرس OmniRoute **489 إدخالًا ضمن الخطط المجانية عبر 35 مفتاحًا لمجموعات متكررة**، ويحسب إجمالي الرموز الرئيسي استنادًا إلى **17 مجموعة ذات ميزانية شهرية موجبة ومنشورة، بالإضافة إلى خمسة حدود Groq لكل نموذج**، مع إزالة التكرار حسب المجموعة المشتركة. تُعرض الحصص التي لا تتاح إلا بعد التحقق الإقليمي من الهوية (حاليًا: ModelScope) بشكل منفصل، وهي +~6 ملايين خلف التحقق الإقليمي من الهوية، ولا تُضاف مطلقًا إلى الإجمالي الرئيسي. وتظل النتيجة ظاهرة في لوحة المعلومات (`/dashboard/free-tiers`). -بطاقة ميزانية الخطط المجانية في OmniRoute: نحو 1.62B من الرموز المجانية شهريًا بصورة مستمرة، وما يصل إلى نحو 2.22B في الشهر الأول مع أرصدة التسجيل، من 35 مفتاحًا موثقًا للتجمعات المتكررة تغطي 491 إدخالًا مفهرسًا ضمن الخطط المجانية خلف نقطة نهاية واحدة. حسابات دقيقة مع إزالة تكرار التجمعات — يُحتسب كل تجمع مشترك مرة واحدة، بما في ذلك 17 تجمعًا متكررًا بميزانية شهرية موجبة ومنشورة للرموز، بالإضافة إلى خمسة حدود Groq لكل نموذج؛ وتمييز 13 مزودًا بعلامة تجنّب في فهرس مخاطر الشروط لتقرر بنفسك. يتضمن شريط الميزانية Mistral 1B وNara 210M وLLM7 150M وxKiro 150M وGroq 30M (خمسة حدود لكل نموذج) وتجمعات أصغر، بالإضافة إلى أرصدة التسجيل للشهر الأول والمزودين المجانيين دائمًا من دون حد للرموز، المعروضين بصورة منفصلة كي لا يضخموا الإجمالي الرئيسي مطلقًا. الاستخدام والمتبقي مباشرةً على /dashboard/free-tiers. +بطاقة ميزانية الخطط المجانية في OmniRoute: نحو 1.62 مليار رمز مجاني شهريًا بصورة ثابتة، وما يصل إلى نحو 2.22 مليار في الشهر الأول مع أرصدة التسجيل، من 35 مفتاحًا موثقًا لمجموعات متكررة تغطي 489 إدخالًا مفهرسًا ضمن الخطط المجانية خلف نقطة نهاية واحدة. حسابات صادقة مع إزالة تكرار المجموعات — تُحتسب كل مجموعة مشتركة مرة واحدة، بما في ذلك 17 مجموعة متكررة ذات ميزانية شهرية موجبة ومنشورة للرموز، بالإضافة إلى خمسة حدود Groq لكل نموذج؛ وقد وُسم 13 مزودًا بعبارة «يُفضّل تجنبه» في فهرس مخاطر الشروط، لتقرر بنفسك. يتضمن شريط الميزانية Mistral بمليار، وNara بـ210 ملايين، وLLM7 بـ150 مليونًا، وxKiro بـ150 مليونًا، وGroq بـ30 مليونًا (خمسة حدود لكل نموذج)، إلى جانب مجموعات أصغر، بالإضافة إلى أرصدة التسجيل للشهر الأول والمزودين المجانيين دائمًا من دون حد أقصى للرموز، والذين يُعرضون بشكل منفصل كي لا يضخّموا الإجمالي الرئيسي مطلقًا. الاستخدام والمتبقي مباشرةً على /dashboard/free-tiers. -> ملخص متحرك لصفحة `/dashboard/free-tiers` المباشرة. المنهجية الكاملة (إزالة تكرار التجمعات، وفئات الأرصدة، وشروط المزودين): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> ملخص متحرك لصفحة `/dashboard/free-tiers` المباشرة. المنهجية الكاملة (إزالة تكرار المجموعات، فئات الأرصدة، شروط المزودين): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> تُعاد مراجعة هذه الأرقام كل أسبوعين بمقارنتها مع الفهرس المباشر، وهي **تتحرك في الاتجاهين** — إذا أنهى مزود خطة مجانية ينخفض الرقم، وإذا أُضيفت خطة جديدة يرتفع. ننشر ما يحسبه الفهرس فعليًا، وليس أفضل سيناريو بعد تقريبه إلى الأعلى. +> تُعاد مراجعة هذه الأرقام كل أسبوعين بالاستناد إلى الفهرس المباشر، وهي **تتحرك في الاتجاهين** — إذا أنهى مزود خطة مجانية انخفض الرقم؛ وإذا أُضيفت خطة جديدة ارتفع. ننشر ما يحسبه الفهرس فعليًا، وليس أفضل سيناريو بعد تقريبه إلى الأعلى.
@@ -37,7 +37,7 @@

-⭐ امنح المستودع نجمة إذا ساعدك OMNIROUTE على توفير المال وتسهيل عملك. +⭐ ضع نجمة للمستودع إذا ساعدك OMNIROUTE على توفير المال وتسهيل عملك.

@@ -48,7 +48,7 @@ ### 💬 انضم إلى المجتمع -**👋 تابع المشرف — وكن أول من يعرف بالمزودين الجدد والإصدارات والنصائح:** +**👋 تابع المشرف — وكن أول من يحصل على المزودين الجدد والإصدارات والنصائح:** [![تابع Diego على LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![تابع @diegosouzapw على GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -59,7 +59,7 @@ [![WhatsApp البرازيل](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![الموقع الإلكتروني](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**الأسئلة، ونصائح المزودين، وخارطة الطريق، والدعم ← [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 العالمي](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 البرازيل](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [البوابة](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**الأسئلة، ونصائح المزودين، وخريطة الطريق، والدعم ← [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 العالمي](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 البرازيل](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [البوابة](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -590,9 +590,9 @@ Radar اختياري ويستخدم طلبات GET فقط. لا يرفع عمي
-## 🤖 واجهات سطر الأوامر ووكلاء البرمجة المتوافقة +## 🤖 واجهات سطر الأوامر ووكلاء البرمجة المتوافقون -> إعداد واحد — `http://localhost:20128/v1` — وسيعمل **كل** محرر أو واجهة سطر أوامر مدعومة بالذكاء الاصطناعي باستخدام نماذج مجانية ومنخفضة التكلفة. +> إعداد واحد — `http://localhost:20128/v1` — ويعمل **كل** محرر IDE أو واجهة سطر أوامر مدعومة بالذكاء الاصطناعي باستخدام نماذج مجانية ومنخفضة التكلفة.
@@ -626,54 +626,54 @@ Radar اختياري ويستخدم طلبات GET فقط. لا يرفع عمي - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ يعمل أيضًا مع · Kiro · Command Code · Antigravity · Windsurf · AMP · أي أداة متوافقة مع OpenAI ++ يعمل أيضًا مع · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · أي أداة متوافقة مع OpenAI
-📖 إعداد خاص بكل أداة لجميع الأدوات الـ 36 (26 أداة CLI Code + 10 وكلاء CLI) ← [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 إضافة OpenCode ← [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 إعداد مخصص لكل أداة لجميع الأدوات الـ 36 (26 أداة CLI للبرمجة + 10 وكلاء CLI) ← [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 إضافة OpenCode ← [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**شغّل أي أداة CLI مدعومة عبر OmniRoute بأمر واحد** — دون كتابة ملفات إعداد، -مع تمرير بيانات الاعتماد لكل عملية، واستخدام مجلد رئيسي مؤقت ومعزول لـ Qwen/Gemini: +**شغّل أي CLI مدعوم عبر OmniRoute بأمر واحد** — من دون كتابة ملفات إعداد، +مع حقن بيانات الاعتماد لكل عملية، وحصول Qwen/Gemini على مجلد رئيسي مؤقت ومعزول: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code -omniroute run codex --model glm/glm-5.2 # OpenAI Codex CLI +omniroute run codex --model glm/glm-5.2 # واجهة OpenAI Codex لسطر الأوامر omniroute run aider --model glm/glm-5.2 -- --message "reply OK" omniroute run goose --model glm/glm-5.2 omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# أو اختر المزوّد+النموذج تفاعليًا واكتب إعدادات الأداة نفسها: +# أو اختر المزوّد+النموذج تفاعليًا واكتب ملف إعداد الأداة نفسها: omniroute configure codex # أيضًا: claude opencode qwen aider goose gemini cline continue kilo ``` -يحترم كل أمر سياق الاتصال البعيد النشط (`omniroute connect `)، ويعرض `--dry-run` -معاينة دقيقة للبيئة/الوسائط دون تنفيذ، بينما يُبقي `--api-key-env NAME` الأسرار خارج +يحترم كل أمر السياق البعيد النشط (`omniroute connect `)، ويعرض `--dry-run` +معاينة دقيقة لمتغيرات البيئة/الوسائط من دون تنفيذ، بينما يُبقي `--api-key-env NAME` الأسرار خارج سجل أوامر الصدفة. ← [تكاملات CLI](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 مزوّد ذكاء اصطناعي — 152 منها معلَّمة في الكتالوج بأنها مجانية +## 🌐 357 مزودًا للذكاء الاصطناعي — 152 منها مُصنَّفة في الدليل على أنها مجانية
-> **357 مزوّدًا مسجّلًا** عبر مجموعات الدردشة والوسائط والبحث والمزوّدين المحليين ووكلاء السحابة والنظام الأساسية، منها **152 تحمل بيانات الاكتشاف الوصفية `hasFree: true`**. يغطي سجل نماذج الدردشة **229 مزوّدًا / 2,554 زوجًا مميزًا من المزوّدين والنماذج / 1,283 معرّف نموذج أولي**؛ بينما يحتوي كتالوج الميزانيات المجانية المنفصل على **491 صفًا خاصًا بالنماذج**، و**35 مجموعة دورية**، و**54 مزوّدًا مجانيًا دائمًا، إما دوريًا أو بلا مفتاح**. صُممت هذه الأعداد لتستخدم مقامات مختلفة؛ وتتوفر التعريفات والحسابات بعد إزالة تكرار المجموعات في [مرجع المزوّدين](docs/reference/PROVIDER_REFERENCE.md) و[الباقات المجانية](docs/reference/FREE_TIERS.md). +> **357 مزودًا مسجلًا** عبر المجموعات القياسية للدردشة والوسائط والبحث والتشغيل المحلي ووكلاء السحابة والنظام، منها **152 تحمل بيانات الاكتشاف الوصفية `hasFree: true`**. يشمل سجل نماذج الدردشة **229 مزودًا / 2,554 زوجًا مميزًا من المزود والنموذج / 1,283 معرّف نموذج أوليًا**؛ بينما يحتوي دليل الميزانية المجانية المنفصل على **491 صفًا لكل نموذج**، و**35 حصة مشتركة متكررة**، و**54 مزودًا مجانيًا دائمًا بحصص متكررة أو من دون مفاتيح**. صُممت هذه المقامات لتكون مختلفة؛ وتتوفر التعريفات والحسابات التي أزيل منها تكرار الحصص المشتركة في [مرجع المزودين](docs/reference/PROVIDER_REFERENCE.md) و[الخطط المجانية](docs/reference/FREE_TIERS.md).
-### 🏢 كل مختبر رئيسي — عبر نقطة نهاية واحدة +### 🏢 جميع المختبرات الكبرى — عبر نقطة نهاية واحدة @@ -702,28 +702,28 @@ omniroute configure codex # أيضًا: claude opencode qwen aider goos
-…وأكثر من 330 مزوّدًا آخر — يُحمَّل كل رمز مباشرةً من كتالوج المزوّدين في لوحة المعلومات. 📖 [مرجع المزوّدين](docs/reference/PROVIDER_REFERENCE.md) +…وأكثر من 330 مزودًا آخر — يُحمَّل كل رمز مباشرةً من دليل المزودين في لوحة المعلومات. 📖 [مرجع المزودين](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 مجاني إلى الأبد — $0، بلا بطاقة ائتمان +### 🆓 مجاني إلى الأبد — $0، من دون بطاقة - + - - + + - - + + - - - + + +
OpenCode Zen
OpenCode Zen
DeepSeek V4، Nemotron 3
دون حد أقصى للرموز
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
دون حد للرموز
Kilo Code
Kilo Code
موجّه تلقائي، Tencent Hy3
مجاني إلى الأبد
Requesty
Requesty
GPT-OSS 120B، Nemotron
مجاني إلى الأبد
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
خطة مجانية
Requesty
Requesty
GPT-OSS 120B, Nemotron
مجاني إلى الأبد
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
فئة مجانية
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
مجاني إلى الأبد
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
مجاني إلى الأبد
Qoder AI
Qoder AI
Qwen3-Max، Kimi-K2
مجاني بلا حدود
Pollinations
Pollinations
GPT، Llama، Claude
لا حاجة إلى مفتاح
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
مجاني بلا حدود
Pollinations
Pollinations
GPT, Llama, Claude
لا حاجة إلى مفتاح
Cloudflare AI
Cloudflare AI
أكثر من 50 نموذجًا
10 آلاف عصبون/يوم
NVIDIA NIM
NVIDIA NIM
GLM، MiniMax
حوالي 40 طلبًا في الدقيقة مجانًا
Cerebras
Cerebras
GLM 4.7، GPT-OSS
مليون رمز/يوم
OpenRouter
OpenRouter
نماذج :free
+10 دولارات ← معدل طلبات أعلى في الدقيقة
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
نحو 40 طلبًا في الدقيقة مجانًا
Openference
Openference
Qwen3.8 27B, Llama 3.2
فئة مجانية
OpenRouter
OpenRouter
نماذج :free
+$10 ← معدل طلبات أعلى في الدقيقة
@@ -1256,27 +1256,27 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً
-## 🛠️ الحزمة التقنية +## 🛠️ المكدس التقني
- + - - - + + + - - - - - - - + + + + + + +
الطبقةالتقنية
بيئة التشغيلNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
اللغةTypeScript 6.0 — TypeScript بنسبة 100% عبر src/ وopen-sse/ (من دون أي any في النواة منذ v2.0)
اللغةTypeScript 6.0 — TypeScript بنسبة 100% عبر src/ وopen-sse/ (دون أي استخدام لـany في النواة منذ v2.0)
إطار العملNext.js 16 + React 19 + Tailwind CSS 4
قاعدة البياناتbetter-sqlite3 (SQLite، تسجيل WAL) + LowDB (نظام JSON قديم) — 122 وحدة نطاق، و176 عملية ترحيل
الذاكرةبحث نصي كامل باستخدام SQLite FTS5 + تضمينات متجهية مكمّمة إلى int8، وتضاؤل مُنمّط
المخططاتZod 4 — التحقق من مدخلات ومخرجات أدوات MCP + عقود API
قاعدة البياناتbetter-sqlite3 ‏(SQLite، تسجيل WAL) + LowDB ‏(نظام JSON قديم) — 122 وحدة نطاق، و178 عملية ترحيل
الذاكرةبحث نصي كامل باستخدام SQLite FTS5 + تضمينات متجهية مكمّمة بصيغة int8، مع تضاؤل محدد الأنواع
المخططاتZod 4 — التحقق من صحة مدخلات ومخرجات أدوات MCP + عقود API
البروتوكولاتMCP ‏(stdio / HTTP / SSE) + A2A v0.3 ‏(JSON-RPC 2.0 + SSE)
البثالأحداث المرسلة من الخادم (SSE) + جسر WebSocket ‏(/v1/ws)
الضغطمسار معالجة يضم 12 محركًا — RTK، وCaveman، وLLMLingua-2 ‏(MobileBERT ONNX)، وGCF، وOmniGlyph
المصادقة والأمانOAuth 2.0 ‏(PKCE) + JWT + مفاتيح API + مصادقة MCP محددة النطاق · AES-256-GCM للبيانات غير النشطة · DOMPurify
التخفيwreq-js — انتحال بصمات JA3 / JA4 الخاصة بـTLS، ووكيل بثلاثة مستويات
المرونةقاطع الدارة، وتراجع أُسّي، ومنع الاندفاع المتزامن، وإصلاح ذاتي تلقائي للتركيبات
التسجيلpino — سجلات JSON منظّمة مع سياق الطلب
الاختبارمشغّل اختبارات Node.js + Vitest — أكثر من 39,000 تعريف اختبار ثابت عبر أكثر من 5,100 ملف اختبار متتبَّع (اختبارات الوحدة، والتكامل، والشاملة E2E، والأمان، والمنظومة)
المنصاتسطح المكتب (Electron) · Android ‏(Termux) · PWA (أي متصفح)
الضغطمسار معالجة من 12 محركًا — RTK، وCaveman، وLLMLingua-2 ‏(MobileBERT ONNX)، وGCF، وOmniGlyph
المصادقة والأمانOAuth 2.0 ‏(PKCE) + JWT + مفاتيح API + مصادقة MCP محددة النطاقات · تشفير AES-256-GCM للبيانات المخزنة · DOMPurify
التخفيwreq-js — انتحال بصمات JA3 / JA4 لبروتوكول TLS، ووكيل من 3 مستويات
المرونةقاطع الدائرة، وتراجع أُسّي، ومنع الاندفاع المتزامن، وتعافٍ ذاتي تلقائي للتركيبات
التسجيلpino — سجلات JSON منظمة مع سياق الطلب
الاختبارمشغّل اختبارات Node.js + Vitest — أكثر من 39,000 تصريح اختبار ثابت عبر أكثر من 5,100 ملف اختبار متتبّع (وحدات، وتكامل، وE2E، وأمان، ونظام بيئي)
المنصاتسطح المكتب (Electron) · Android ‏(Termux) · PWA ‏(أي متصفح)
CI/CDGitHub Actions — نشر تلقائي إلى npm وDocker Hub عند الإصدار
الروابطالموقع الإلكتروني · npm · Docker Hub
@@ -1295,10 +1295,10 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً المستندالوصف دليل المستخدمالمزوّدون، والتركيبات، والتكامل مع CLI، والنشر دليل الإعدادطرق التثبيت الكاملة، وإعدادات أدوات CLI، وإعداد البروتوكولات، وضبط المهلات الزمنية - دليل أدوات CLIإعداد كل أداة من Claude Code وCodex وCursor وCline وOpenClaw وKilo وCopilot - الوضع البعيدالتحكم في OmniRoute بعيد (على VPS) من CLI على حاسوبك المحمول عبر رموز وصول محددة النطاق + دليل أدوات CLIإعداد كل أداة على حدة لـ Claude Code وCodex وCursor وCline وOpenClaw وKilo وCopilot + الوضع البعيدالتحكم في OmniRoute بعيد (على VPS) من CLI حاسوبك المحمول عبر رموز وصول محدودة النطاق إعداد Claude Codeتوجيه Claude Code إلى OmniRoute (محلي/بعيد) باستخدام launch + ملفات تعريف خاصة بكل نموذج - البدء السريعتثبيت من 3 خطوات ← اتصال ← إعداد + البدء السريع3 خطوات: التثبيت ← الاتصال ← الإعداد ### 🔧 العمليات والنشر @@ -1307,12 +1307,12 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً المستندالوصف دليل Dockerتشغيل Docker، وملفات تعريف Compose، وCaddy HTTPS، والأنفاق، ووسوم الصور دليل Podmanتكامل Quadlet مع systemd، وpodman-compose، وSELinux - النشر على VMدليل كامل: إعداد VM + nginx + Cloudflare + نشر الآلات الافتراضيةدليل كامل: إعداد VM + nginx + Cloudflare النشر على Fly.ioالنشر على Fly.io باستخدام تخزين دائم دليل Termuxتشغيل OmniRoute على Android عبر Termux دليل PWAتثبيت تطبيق الويب التقدمي، والتخزين المؤقت، والبنية دليل إلغاء التثبيتإزالة نظيفة لجميع طرق التثبيت - إعداد البيئةمتغيرات .env ومراجعها الكاملة + إعداد البيئةمتغيرات .env الكاملة ومراجعها ### 🧠 الميزات والبنية @@ -1320,17 +1320,17 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً - + - + - - + + - + - +
المستندالوصف
البنيةبنية النظام، وتدفق البيانات، والمكوّنات الداخلية
دليل الضغطمسار من 7 خيارات: إيقاف / خفيف / قياسي / مكثّف / فائق / RTK / متراكم
دليل الضغطمسار من 7 خيارات: إيقاف / خفيف / قياسي / مكثّف / فائق / RTK / مكدّس
ضغط RTKضغط مخرجات الأوامر، والمرشحات، والثقة، والتحقق، واستعادة المخرجات الخام
محركات الضغطCaveman وRTK والمسارات المتراكمة وواجهات لوحة المعلومات/API/MCP
محركات الضغطCaveman وRTK والمسارات المكدّسة وواجهات لوحة المعلومات/API/MCP
تنسيق قواعد الضغطمخططات حزم قواعد JSON لمرشحات Caveman وRTK
حزم لغات الضغطاكتشاف اللغة وتأليف حزم قواعد Caveman
دليل المرونةقواطع الدوائر، وفترات التهدئة، وقائمة الانتظار، ومنع اندفاع الطلبات المتزامنة، وانتحال TLS
محرك Auto-Comboتقييم قائم على 16 عاملًا، وحزم الأوضاع، والإصلاح الذاتي
دليل المرونةقواطع الدوائر، وفترات التهدئة، وقائمة الانتظار، ومنع الاندفاع المتزامن، وانتحال TLS
محرك Auto-Comboتقييم من 16 عاملًا، وحزم الأوضاع، والإصلاح الذاتي
دليل الوكيلنظام وكيل من 3 مستويات، وسوق 1proxy، وعمليات CRUD للسجل
المستويات المجانيةدليل موحّد: 35 مجموعة دورية موثقة / 491 إدخالًا مفهرسًا ضمن المستوى المجاني
الخطط المجانيةدليل موحّد: 35 مجموعة دورية موثّقة / 489 إدخالًا مفهرسًا ضمن الخطط المجانية
معرض الميزاتجولة مرئية في لوحة المعلومات مع لقطات شاشة
توثيق قاعدة الشفرةشرح تفصيلي لقاعدة الشفرة مناسب للمبتدئين
توثيق قاعدة الشفرةشرح تفصيلي لقاعدة الشفرة ملائم للمبتدئين
### 🤖 البروتوكولات وواجهات API @@ -1339,8 +1339,8 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً المستندالوصف مرجع APIجميع نقاط النهاية مع أمثلة مواصفات OpenAPIمواصفات OpenAPI 3.0 - خادم MCP110 أداة MCP، وإعدادات IDE، وعملاء Python/TS/Go - دليل خادم MCPتثبيت MCP، ووسائل النقل، ومرجع الأدوات + خادم MCP110 أدوات MCP، وإعدادات IDE، وعملاء Python/TS/Go + دليل خادم MCPتثبيت MCP، ووسائط النقل، ومرجع الأدوات خادم A2Aبروتوكول JSON-RPC 2.0، والمهارات، والبث، وإدارة المهام دليل خادم A2Aبطاقة وكيل A2A، والمهام، والمهارات، والبث @@ -1350,12 +1350,12 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً - - - - + + + + - +
المستندالوصف
المساهمةإعداد بيئة التطوير وإرشاداتها
نموذج التفريع والإصدارالفروع التي تستهدفها طلبات السحب (release/*)، وما يعنيه main وما تعنيه العلامات
سجل التغييراتالسجل الكامل للإصدارات حسب كل إصدار
سياسة الأمانالإبلاغ عن الثغرات والممارسات الأمنية
دليل التدويلدعم 42 لغة، وسير عمل الترجمة، والكتابة من اليمين إلى اليسار
نموذج التفريع والإصدارالفروع التي تستهدفها طلبات السحب (release/*)، وما يعنيه main والوسوم
سجل التغييراتالسجل الكامل للإصدارات بحسب كل إصدار
سياسة الأمانالإبلاغ عن الثغرات وممارسات الأمان
دليل i18nدعم 42 لغة، وسير عمل الترجمة، والكتابة من اليمين إلى اليسار
قائمة التحقق من الإصدارخطوات التحقق السابقة للإصدار
خطة التغطيةاستراتيجية تغطية الاختبارات لأكثر من 39,000 تصريح اختبار ثابت موزعة على أكثر من 5,100 ملف اختبار متتبَّع
خطة التغطيةاستراتيجية تغطية الاختبارات لأكثر من 39,000 تصريح اختبار ثابت عبر أكثر من 5,100 ملف اختبار متتبَّع

@@ -1364,7 +1364,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً # ⭐ أبرز المساهمين -> يتشكل OmniRoute بفضل مجتمع شغوف بالمصادر المفتوحة. قدّم هؤلاء الأفراد مساهمات استثنائية تؤثر مباشرةً في جودة المشروع واستقراره وانتشاره. **شكرًا لكم.** +> يتشكل OmniRoute بفضل مجتمع شغوف مفتوح المصدر. قدّم هؤلاء الأفراد مساهمات استثنائية تؤثر مباشرةً في جودة المشروع واستقراره وانتشاره. **شكرًا لكم.** ### المساهمون الخارجيون حسب طلبات السحب المدمجة @@ -1393,7 +1393,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً 20Prudhvivuda246,312 -ثُبِّتت هذه البيانات عند أحدث نقطة في release/v3.8.50 وهي dafb4ae808، مع عمليات الدمج حتى 2026-08-24 05:26:03 UTC. يتضمن إحصاء GitHub GraphQL المقسّم إلى صفحات 5,911 طلب سحب مدمجًا: 2,707 بواسطة مالك المستودع، و179 بواسطة Dependabot، و3,025 طلب سحب خارجيًا من 535 مساهمًا مختلفًا. يشير مصطلح «الأسطر المتغيرة» إلى الإضافات وعمليات الحذف في GitHub، ويشمل الملفات المُنشأة وملفات القفل والكتالوجات والترجمات والوثائق؛ وهو مقياس لحجم التغييرات، وليس لعدد أسطر الشيفرة المؤلَّفة. يُحتفظ بحالات التعادل عند حد الإدراج. +جُمِّدت البيانات عند أحدث نقطة من release/v3.8.50 وهي dafb4ae808، مع عمليات دمج حتى 2026-08-24 05:26:03 UTC. يتضمن إحصاء GitHub GraphQL المقسّم إلى صفحات 5,911 طلب سحب مدمجًا: 2,707 بواسطة مالك المستودع، و179 بواسطة Dependabot، و3,025 طلب سحب خارجيًا من 535 مساهمًا مختلفًا. تشير «الأسطر المتغيرة» إلى إضافات GitHub وعمليات الحذف فيه، وتشمل الملفات المُنشأة، وملفات القفل، والكتالوجات، والترجمات، والوثائق؛ وهي مقياس لحجم التغييرات وليست عدد أسطر الشفرة المؤلَّفة. تُحتفَظ بالمراتب المتعادلة عند حد الإدراج. ### الإيداعات المنسوبة عبر GitHub @@ -1404,42 +1404,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً backryun
backryun
- 🥇 220 عملية إيداع منسوبة إلى GitHub + 🥇 220 إيداعًا منسوبًا إلى GitHub Paijo
Paijo

- 🥈 219 عملية إيداع منسوبة إلى GitHub + 🥈 219 إيداعًا منسوبًا إلى GitHub Randi
Randi

- 🥉 108 عمليات إيداع منسوبة إلى GitHub + 🥉 108 إيداعات منسوبة إلى GitHub Ravi Tharuma
Ravi Tharuma

- 🏅 81 عملية إيداع منسوبة إلى GitHub + 🏅 81 إيداعًا منسوبًا إلى GitHub Chris
Chris

- 🏅 70 عملية إيداع منسوبة إلى GitHub + 🏅 70 إيداعًا منسوبًا إلى GitHub Markus Hartung
Markus Hartung

- 🏅 69 عملية إيداع منسوبة إلى GitHub · متعادل في المركز #6 + 🏅 69 إيداعًا منسوبًا إلى GitHub · متعادل في المركز السادس @@ -1448,42 +1448,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # يؤدي CI=1 أيضً Dizzle
Dizzle
- 🏅 69 عملية إيداع منسوبة إلى GitHub · متعادل في المركز #6 + 🏅 69 إيداعًا منسوبًا إلى GitHub · متعادل في المركز السادس Jan Leon
Jan Leon

- 🏅 64 عملية إيداع منسوبة إلى GitHub + 🏅 64 إيداعًا منسوبًا إلى GitHub zenobit
zenobit

- 🏅 62 عملية إيداع منسوبة إلى GitHub + 🏅 62 إيداعًا منسوبًا إلى GitHub Bob.Hou
Bob.Hou

- 🏅 51 عملية إيداع منسوبة إلى GitHub · متعادل في المركز #10 + 🏅 51 إيداعًا منسوبًا إلى GitHub · متعادل في المركز العاشر Xiangzhe
Xiangzhe

- 🏅 51 عملية إيداع منسوبة إلى GitHub · متعادل في المركز #10 + 🏅 51 إيداعًا منسوبًا إلى GitHub · متعادل في المركز العاشر -أُعيد التحقق في 2026-08-24 06:14:31 UTC: عمليات الإيداع المنسوبة إلى GitHub التي أبلغت عنها واجهة Contributors API الخاصة بالمستودع للفرع الافتراضي release/v3.8.50. أعادت واجهة API عدد 525 هوية (415 مستخدمًا، وروبوتين، و108 هويات مجهولة)؛ يستبعد هذا الجدول المشرف على الصيانة والروبوتات والهويات المجهولة، ويُبقي على حالات التعادل في الترتيب. وهو يختلف عن كلٍ من ترتيب طلبات السحب المدمجة أعلاه وإحصاء بيانات Git الوصفية الذي يشمل 639 شخصًا أدناه. +أُعيد التحقق في 2026-08-24 06:14:31 UTC: الإيداعات المنسوبة إلى GitHub كما أبلغت عنها واجهة Contributors API الخاصة بالمستودع للفرع الافتراضي release/v3.8.50. أعادت واجهة API عدد 525 هوية (415 مستخدمًا، وبوتين، و108 هويات مجهولة)؛ يستبعد هذا الجدول المشرف والبوتات والهويات المجهولة، ويحتفظ بحالات التعادل في الترتيب. وهو يختلف عن كل من ترتيب طلبات السحب المدمجة أعلاه وإحصاء بيانات Git الوصفية الذي يشمل 639 شخصًا أدناه. -> 🙏 إن الميزات وإصلاحات الأخطاء وتحسينات البنية التحتية التي قدمها هؤلاء المساهمون تُعد **جزءًا أساسيًا** مما يجعل OmniRoute موثوقًا وغنيًا بالميزات. كل طلب سحب، وكل حالة اختبار، وكل ملف ترجمة i18n له أهميته. تُبنى البرمجيات مفتوحة المصدر بأشخاص مثلهم. +> 🙏 تُعد ميزات هؤلاء المساهمين وإصلاحاتهم للأخطاء وتحسيناتهم للبنية التحتية **جزءًا أساسيًا** مما يجعل OmniRoute موثوقًا وغنيًا بالميزات. فكل طلب سحب، وكل حالة اختبار، وكل ملف ترجمة i18n له أهميته. تُبنى البرمجيات مفتوحة المصدر بأيدي أشخاص مثلهم.
diff --git a/docs/i18n/ar/SECURITY.md b/docs/i18n/ar/SECURITY.md index 33ec58f8b6e3..42dfde48cd1d 100644 --- a/docs/i18n/ar/SECURITY.md +++ b/docs/i18n/ar/SECURITY.md @@ -220,36 +220,38 @@ docker run -d \ 10. **مرّر قيم وقت التشغيل الخاصة بـ `exec()` / `spawn()` عبر الخيار `env`** — لا تُقحم مطلقًا المسارات الخارجية أو القيم غير الموثوقة نصيًا في البرامج النصية الممررة إلى الصدفة. المرجع: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **فضّل المكتبات الآمنة افتراضيًا** — راجع [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js، DOMPurify، ssrf-req-filter، safe-regex، Google Tink). استخدمها قبل إنشاء حلولك الخاصة. -## نتائج فحص سلسلة التوريد (Socket.dev / Snyk / أدوات مماثلة) +## نتائج فاحص سلسلة التوريد (Socket.dev / Snyk / ما شابه) + +> **ملاحظة حول النطاق:** لا يفعل `socket.yml` الموجود في جذر المستودع سوى تحديد `projectIgnorePaths` لفحص Socket.dev اللاحق للنشر من جهة السجل لحزمة npm المنشورة — وهو ليس بوابة دمج مفروضة ضمن CI/PR. لا يوجد أي سير عمل في `.github/workflows`، ولا أي برنامج نصي في `package.json`، ولا أي هدف في `Makefile` يستدعي Socket.dev. تتضمن حزمة npm المنشورة `omniroute` إصدار Next.js ذي الإعداد `output: "standalone"`، -ما يعني أن كل معالج للمسارات — بما في ذلك الميزات المميّزة الموثّقة -(MITM، واستيراد Zed، وCloud Sync، والمشرف المضمّن على الخدمات) — ينتهي به المطاف -ضمن أجزاء مصغّرة في `.next/server/*.js`. وغالبًا ما تطابق أدوات فحص سلسلة التوريد -الاستدلالية أنماط تلك الأجزاء مع توقيعات البرمجيات الضارة. - -يوجد إعداد أداة الفحص الذي نستخدمه في [`socket.yml`](socket.yml) ضمن جذر -المستودع (بتنسيق Socket.dev GitHub App الإصدار v2 — راجع -). وهو يستبعد صراحةً -المجلدات غير المضمّنة في الحزمة المنشورة (`tests/`، و`_tasks/`، و`_references/`، و`_ideia/`، -و`_mono_repo/`، و`docs/`، وغيرها)، بحيث لا تُبلغ أداة الفحص إلا عن مسارات الشيفرة التي -تصل فعليًا إلى مستخدمي الحزمة المنشورة — وتُجرى عملية الفحص نفسها بواسطة تطبيق Socket +ما يعني أن كل معالج مسار — بما في ذلك الميزات المميزة الموثقة +(MITM، واستيراد Zed، وCloud Sync، ومشرف الخدمة المضمّن) — ينتهي به المطاف +ضمن مقاطع `.next/server/*.js` المصغّرة. وكثيرًا ما تطابق فاحصات سلسلة التوريد +الاستدلالية تلك المقاطع مع توقيعات البرمجيات الخبيثة اعتمادًا على الأنماط. + +يوجد إعداد الفاحص الذي نستخدمه في [`socket.yml`](socket.yml) في +جذر المستودع (تنسيق Socket.dev GitHub App بالإصدار v2 — راجع +). ويستبعد صراحةً +الأدلة غير المشمولة في الحزمة المنشورة (`tests/`، و`_tasks/`، و`_references/`، و`_ideia/`، +و`_mono_repo/`، و`docs/`، وما إلى ذلك)، بحيث لا يُبلغ الفاحص إلا عن مسارات التعليمات البرمجية التي +تصل فعليًا إلى مستخدمي الحزمة المنشورة — ويُشغَّل الفحص نفسه بواسطة تطبيق Socket على GitHub الذي يقرأ هذا الملف، وليس بواسطة سير عمل في هذا المستودع. -نحتفظ، لكل فئة من النتائج، بإقرار من المشرفين خاص بكل نتيجة: +نحتفظ لكل فئة من النتائج بإقرار من المشرف خاص بكل نتيجة: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - خريطة لكل نتيجة: ملف المصدر ↔ الجزء الذي جرى الإبلاغ عنه ↔ السلوك ↔ إجراء التخفيف + خريطة لكل نتيجة: ملف المصدر ↔ المقطع المُبلّغ عنه ↔ السلوك ↔ إجراء التخفيف المطبّق في v3.8.6. -- كتل `SECURITY-AUDITOR-NOTE:` داخل الشيفرة عند كل دالة جرى الإبلاغ عنها، - والتي تشير إلى المستند نفسه. +- تشير كتل `SECURITY-AUDITOR-NOTE:` داخل المصدر عند كل دالة مُبلّغ عنها + إلى المستند نفسه. -بالنسبة إلى المستخدمين الذين لا تسمح مسارات المعالجة لديهم بتخفيف التنبيه: ابنوا المشروع باستخدام +بالنسبة إلى المستخدمين الذين لا يمكن لمسار عملهم تخفيف التنبيه: ابنوا باستخدام `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. يستبدل ذلك الوحدات الحساسة الأربع -بوحدات بديلة تُرجع استجابة HTTP 503 بالقيمة `feature-disabled` أثناء -التشغيل، وبذلك تغيب مسارات الشيفرة المميّزة فعليًا عن الحزمة. +ببدائل صورية تُرجع HTTP 503 و`feature-disabled` في +وقت التشغيل، بحيث تغيب مسارات التعليمات البرمجية ذات الامتيازات فعليًا عن الحزمة. راجع [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) -للاطلاع على خطوات النشر. +لمعرفة وصفة النشر. ## المراجع diff --git a/docs/i18n/ar/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/ar/docs/architecture/CODEBASE_DOCUMENTATION.md index 2395c92ad200..130740891c75 100644 --- a/docs/i18n/ar/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/ar/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,7 +436,7 @@ server/ ## 4. `open-sse/` — مساحة عمل محرك البث -مساحة عمل npm منفصلة تُنشر باسم `@omniroute/open-sse`. تتولى معالجة +مساحة عمل npm منفصلة، منشورة باسم `@omniroute/open-sse`. تتولى معالجة الطلبات، والمنفّذات، والمترجمات، والخدمات، والمحوّل، وخادم MCP. ``` @@ -457,27 +457,27 @@ open-sse/ ### 4.1 `open-sse/handlers/` -| المعالج | الغرض | -| ----------------------- | --------------------------------------------------------------------------------------------------- | -| `chatCore.ts` | مسار معالجة الدردشة الرئيسي (ذاكرة التخزين المؤقت، وتحديد المعدل، وتوجيه التركيبات، وإرسال المنفّذ) | -| `responsesHandler.ts` | نقطة دخول OpenAI Responses API | -| `embeddings.ts` | التضمينات | -| `imageGeneration.ts` | توليد الصور | -| `audioSpeech.ts` | تحويل النص إلى كلام | -| `audioTranscription.ts` | تحويل الكلام إلى نص | -| `videoGeneration.ts` | توليد الفيديو | -| `musicGeneration.ts` | توليد الموسيقى | -| `rerank.ts` | إعادة الترتيب | -| `moderations.ts` | الإشراف على المحتوى | -| `search.ts` | البحث على الويب | -| `sseParser.ts` | محلل أحداث SSE | -| `usageExtractor.ts` | استخراج أعداد الرموز المميّزة من التدفقات الواردة | -| `responseSanitizer.ts` | إزالة الضوضاء الخاصة بالمزوّد | -| `responseTranslator.ts` | طبقة الربط بين استجابة المزوّد وطبقة الترجمة | +| المعالج | الغرض | +| ----------------------- | --------------------------------------------------------------------------------------------- | +| `chatCore.ts` | مسار معالجة الدردشة الرئيسي (التخزين المؤقت، وتحديد المعدل، وتوجيه التركيبات، وتوزيع التنفيذ) | +| `responsesHandler.ts` | نقطة دخول OpenAI Responses API | +| `embeddings.ts` | التضمينات | +| `imageGeneration.ts` | توليد الصور | +| `audioSpeech.ts` | تحويل النص إلى كلام | +| `audioTranscription.ts` | تحويل الكلام إلى نص | +| `videoGeneration.ts` | توليد الفيديو | +| `musicGeneration.ts` | توليد الموسيقى | +| `rerank.ts` | إعادة الترتيب | +| `moderations.ts` | الإشراف على المحتوى | +| `search.ts` | البحث على الويب | +| `sseParser.ts` | محلل أحداث SSE | +| `usageExtractor.ts` | استخراج أعداد الرموز من التدفقات الواردة | +| `responseSanitizer.ts` | إزالة الضوضاء الخاصة بالمزوّد | +| `responseTranslator.ts` | طبقة الربط بين استجابة المزوّد وطبقة الترجمة | ### 4.2 `open-sse/executors/` -108 منفّذات للمزوّدين، يرث كل منها `BaseExecutor` ‏(`base.ts`): +108 منفّذات للمزوّدين، يمتد كل منها من `BaseExecutor` (`base.ts`): `antigravity`، `azure-openai`، `blackbox-web`، `cliproxyapi`، `chatgpt-web-codex`، `cloudflare-ai`، `codex`، `commandCode`، `cursor`، `default`، `devin-cli`، @@ -485,13 +485,13 @@ open-sse/ `pollinations`، `qoder`، `vertex`، `devin-desktop`، بالإضافة إلى `claudeIdentity.ts` (أداة مساعدة مشتركة للهوية) و`index.ts` (السجل). -> ملاحظة: تُخدَم المزوّدات غير المدرجة هنا بواسطة `default.ts` باستخدام المنفّذ العام +> ملاحظة: تُخدَّم المزوّدات غير المدرجة هنا بواسطة `default.ts` باستخدام المنفّذ العام > المتوافق مع OpenAI. يوجد كتالوج المزوّدين الكامل (355 مزوّدًا) في > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -ترجمة بنمط المحور والأطراف (OpenAI هو المحور). +ترجمة بنمط المحور والأفرع (OpenAI هو المحور). - **9 مترجمات للطلبات** (`translator/request/`): `antigravity-to-openai`، `claude-to-gemini`، `claude-to-openai`، @@ -515,37 +515,37 @@ open-sse/ ### 4.5 `open-sse/services/` -أبرز العناصر (القائمة الكاملة ضمن `open-sse/services/`): - -| مجال الاهتمام | الملفات | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| توجيه Combo | `combo.ts` (19 استراتيجية)، `comboConfig.ts`، `comboMetrics.ts`، `comboManifestMetrics.ts`، `comboAgentMiddleware.ts` | -| محرك Auto Combo | `autoCombo/` — `engine.ts`، `scoring.ts`، `taskFitness.ts`، `virtualFactory.ts`، `modePacks.ts`، `autoPrefix.ts`، `persistence.ts`، `providerDiversity.ts`، `providerRegistryAccessor.ts`، `routerStrategy.ts`، `selfHealing.ts`، `index.ts` | -| المرونة | `accountFallback.ts` (فترة تهدئة + قفل)، `errorClassifier.ts`، `requestRejectedStreak.ts`، `emergencyFallback.ts`، `rateLimitManager.ts`، `rateLimitSemaphore.ts`، `accountSemaphore.ts`، `accountSelector.ts` | -| الحصص | `quotaMonitor.ts`، `quotaPreflight.ts`، `bailianQuotaFetcher.ts`، `codexQuotaFetcher.ts`، `deepseekQuotaFetcher.ts`، `openrouterQuotaFetcher.ts`، `openrouterFreeWindow.ts`، `crofUsageFetcher.ts`، `antigravityCredits.ts` | -| التخزين المؤقت | `reasoningCache.ts`، `searchCache.ts`، `signatureCache.ts`، `requestDedup.ts` | -| ذكاء التوجيه | `intentClassifier.ts`، `taskAwareRouter.ts`، `backgroundTaskDetector.ts`، `volumeDetector.ts`، `wildcardRouter.ts`، `workflowFSM.ts`، `specificityDetector.ts`، `specificityRules.ts`، `specificityTypes.ts` | -| معالجة النماذج | `modelCapabilities.ts`، `modelDeprecation.ts`، `modelFamilyFallback.ts`، `modelStrip.ts`، `model.ts`، `provider.ts`، `providerRequestDefaults.ts`، `providerCostData.ts`، `payloadRules.ts` | -| الضغط | `compression/` — توصيل محرك الضغط بالكامل | -| الرموز المميزة + الجلسة | `tokenRefresh.ts`، `sessionManager.ts`، `apiKeyRotator.ts`، `contextManager.ts`، `contextHandoff.ts`، `systemPrompt.ts`، `roleNormalizer.ts`، `responsesInputSanitizer.ts`، `toolSchemaSanitizer.ts`، `toolLimitDetector.ts`، `thinkingBudget.ts` | -| المستوى / البيان | `tierResolver.ts`، `tierConfig.ts`، `tierDefaults.json`، `tierTypes.ts`، `manifestAdapter.ts` | -| عنوان IP / الشبكة | `ipFilter.ts`، `webSearchFallback.ts` | -| الدفعات | `batchProcessor.ts` | -| الاستخدام | `usage.ts` | +أبرز المكوّنات (القائمة الكاملة ضمن `open-sse/services/`): + +| مجال الاهتمام | الملفات | +| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| توجيه Combo | `combo.ts` (19 استراتيجية)، `comboConfig.ts`، `comboMetrics.ts`، `comboManifestMetrics.ts`، `comboAgentMiddleware.ts` | +| محرك Auto Combo | `autoCombo/` — `engine.ts`، `scoring.ts`، `taskFitness.ts`، `virtualFactory.ts`، `modePacks.ts`، `autoPrefix.ts`، `persistence.ts`، `providerDiversity.ts`، `providerRegistryAccessor.ts`، `routerStrategy.ts`، `selfHealing.ts`، `index.ts` | +| المرونة | `accountFallback.ts` (فترة تهدئة + حظر)، `errorClassifier.ts`، `requestRejectedStreak.ts`، `emergencyFallback.ts`، `rateLimitManager.ts`، `rateLimitSemaphore.ts`، `accountSemaphore.ts`، `accountSelector.ts` | +| الحصص | `quotaMonitor.ts`، `quotaPreflight.ts`، `bailianQuotaFetcher.ts`، `codexQuotaFetcher.ts`، `deepseekQuotaFetcher.ts`، `openrouterQuotaFetcher.ts`، `openrouterFreeWindow.ts`، `llmgatewayQuotaFetcher.ts`، `crofUsageFetcher.ts`، `antigravityCredits.ts` | +| التخزين المؤقت | `reasoningCache.ts`، `searchCache.ts`، `signatureCache.ts`، `requestDedup.ts` | +| ذكاء التوجيه | `intentClassifier.ts`، `taskAwareRouter.ts`، `backgroundTaskDetector.ts`، `volumeDetector.ts`، `wildcardRouter.ts`، `workflowFSM.ts`، `specificityDetector.ts`، `specificityRules.ts`، `specificityTypes.ts` | +| معالجة النماذج | `modelCapabilities.ts`، `modelDeprecation.ts`، `modelFamilyFallback.ts`، `modelStrip.ts`، `model.ts`، `provider.ts`، `providerRequestDefaults.ts`، `providerCostData.ts`، `payloadRules.ts` | +| الضغط | `compression/` — الربط الكامل لمحرك الضغط | +| الرموز المميزة + الجلسة | `tokenRefresh.ts`، `sessionManager.ts`، `apiKeyRotator.ts`، `contextManager.ts`، `contextHandoff.ts`، `systemPrompt.ts`، `roleNormalizer.ts`، `responsesInputSanitizer.ts`، `toolSchemaSanitizer.ts`، `toolLimitDetector.ts`، `thinkingBudget.ts` | +| المستوى / البيان | `tierResolver.ts`، `tierConfig.ts`، `tierDefaults.json`، `tierTypes.ts`، `manifestAdapter.ts` | +| عنوان IP / الشبكة | `ipFilter.ts`، `webSearchFallback.ts` | +| الدُفعات | `batchProcessor.ts` | +| الاستخدام | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 أدوات فريدة** موصولة في `server.ts` (45 أداة أساسية في `schemas/tools.ts` + - وحدات الذاكرة والمهارات ومهارات GitHub والمجمّع والتلعيب والملحق وNotion وObsidian - والمجموعة المحلية والضغط — يُحتسب اتحادها بواسطة `countUniqueMcpTools`). -- **3 وسائل نقل**: stdio وHTTP Streamable وSSE. -- **33 نطاقًا** تُفرض في وقت التشغيل — القائمة الأساسية في `src/shared/constants/mcpScopes.ts`، والمجموعة الكاملة هي اتحاد النطاقات المعلنة بواسطة كل وحدة أدوات. + وحدات الذاكرة والمهارات ومهارات GitHub والمجموعة والتلعيب والإضافات وNotion وObsidian + والمجموعة المحلية والضغط — يُحتسب الاتحاد بواسطة `countUniqueMcpTools`). +- **3 وسائل نقل**: stdio، وHTTP Streamable، وSSE. +- **33 نطاقًا** تُفرض في وقت التشغيل — القائمة الأساسية موجودة في `src/shared/constants/mcpScopes.ts`، والمجموعة الكاملة هي اتحاد النطاقات التي تصرّح بها كل وحدة أدوات. - جدول التدقيق: `mcp_tool_audit` (تتم تعبئته بواسطة `audit.ts`). - الملفات: `server.ts`، `index.ts`، `httpTransport.ts`، `audit.ts`، `scopeEnforcement.ts`، `runtimeHeartbeat.ts`، `descriptionCompressor.ts`، `schemas/{tools, a2a, audit, index}.ts`، `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`، بالإضافة إلى الاختبارات ضمن `__tests__/`. -- راجع [MCP-SERVER.md](../frameworks/MCP-SERVER.md) للاطلاع على كتالوج الأدوات الكامل. +- راجع [MCP-SERVER.md](../frameworks/MCP-SERVER.md) للاطلاع على فهرس الأدوات الكامل. ### 4.7 `open-sse/config/` @@ -553,17 +553,17 @@ open-sse/ `providerHeaderProfiles.ts`)، وسجلات النماذج الخاصة بكل تنسيق (`audioRegistry.ts`، `embeddingRegistry.ts`، `imageRegistry.ts`، `moderationRegistry.ts`، `musicRegistry.ts`، `rerankRegistry.ts`، `searchRegistry.ts`، `videoRegistry.ts`)، -وأدوات الهوية المساعدة (`codexIdentity.ts`، `codexInstructions.ts`، +ومساعدات الهوية (`codexIdentity.ts`، `codexInstructions.ts`، `anthropicHeaders.ts`، `antigravityUpstream.ts`، `antigravityModelAliases.ts`، `cliFingerprints.ts`، `toolCloaking.ts`، `defaultThinkingSignature.ts`)، -وأدوات بيانات الاعتماد المساعدة (`credentialLoader.ts`، `codexClient.ts`)، ومهايئات -الخدمات السحابية (`azureAi.ts`، `bedrock.ts`، `datarobot.ts`، `glmProvider.ts`، +ومساعدات بيانات الاعتماد (`credentialLoader.ts`، `codexClient.ts`)، ومهايئات +السحابة (`azureAi.ts`، `bedrock.ts`، `datarobot.ts`، `glmProvider.ts`، `maritalk.ts`، `oci.ts`، `petals.ts`، `runway.ts`، `sap.ts`، `watsonx.ts`، `ollamaModels.ts`، `errorConfig.ts`، `constants.ts`، `registryUtils.ts`). ### 4.8 `open-sse/utils/` -أساسيات البث والأدوات المساعدة لموفّدي الخدمة: `stream.ts`، `streamHandler.ts`، +أساسيات البث وأدوات موفّري الخدمة المساعدة: `stream.ts`، `streamHandler.ts`، `streamHelpers.ts`، `streamPayloadCollector.ts`، `streamReadiness.ts`، `sseHeartbeat.ts`، `proxyFetch.ts`، `proxyDispatcher.ts`، `tlsClient.ts`، `networkProxy.ts`، `awsSigV4.ts`، `cacheControlPolicy.ts`، diff --git a/docs/i18n/ar/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/ar/docs/architecture/RESILIENCE_GUIDE.md index 7e71b3ca85d7..93d787e9acd5 100644 --- a/docs/i18n/ar/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/ar/docs/architecture/RESILIENCE_GUIDE.md @@ -66,91 +66,155 @@ **النطاق:** اتصال/حساب/مفتاح واحد لمزوّد الخدمة. -**الغرض:** تخطّي مفتاح واحد به مشكلة مع استمرار الاتصالات الأخرى للمزوّد نفسه في تقديم الخدمة. +**الغرض:** تجاوز مفتاح واحد معطّل، مع استمرار الاتصالات الأخرى لمزوّد الخدمة نفسه في تقديم الخدمة. **التنفيذ:** -- وضع علامة «غير متاح»: `src/sse/services/auth.ts::markAccountUnavailable()` +- وضع علامة غير متاح: `src/sse/services/auth.ts::markAccountUnavailable()` - الاختيار: `getProviderCredentials*` في الملف نفسه - حساب فترة التهدئة: `open-sse/services/accountFallback.ts::checkFallbackError()` - الإعدادات: `src/lib/resilience/settings.ts` **الحقول لكل اتصال:** -- `rateLimitedUntil` — الطابع الزمني الذي تنتهي عنده فترة التهدئة +- `rateLimitedUntil` — الطابع الزمني لانتهاء فترة التهدئة - `testStatus: "unavailable"` - `lastError`، و`lastErrorType`، و`errorCode` - `backoffLevel` — عدّاد التراجع الأُسّي **فترات التهدئة الافتراضية:** -- الأساس لـ OAuth: 5 ثوانٍ -- الأساس لمفتاح API: 3 ثوانٍ -- الاستجابة 429 لمفتاح API: تُفضَّل ترويسات `Retry-After`/إعادة الضبط الواردة من المنبع أو نص إعادة الضبط القابل للتحليل +- الأساس لـ OAuth: ‏5 ثوانٍ +- الأساس لمفتاح API: ‏3 ثوانٍ +- الحالة 429 لمفتاح API: تُفضّل قيمة `Retry-After` الواردة من المنبع/ترويسات إعادة الضبط/نص إعادة الضبط القابل للتحليل - التراجع: `baseCooldownMs * 2 ** failureIndex` -**آلية الحماية من الاندفاع المتزامن:** تمنع حالات الفشل المتزامنة من تمديد فترة التهدئة أكثر من اللازم أو زيادة `backoffLevel` مرتين. +**آلية منع الاندفاع المتزامن:** تمنع حالات الفشل المتزامنة من إطالة فترة التهدئة أكثر من اللازم أو زيادة `backoffLevel` مرتين. -**الحالات النهائية (وليست فترات تهدئة):** +**الحالات النهائية (ليست فترات تهدئة):** -- `banned` — تُعيَّن عند اكتشاف كلمة مفتاحية للحظر / حظر الحساب (راجع [BAN_DETECTION](../security/BAN_DETECTION.md))، وكذلك بعد ثلاث حالات رفض متتالية لكل طلب من المنبع (`request_rejected`، مثل استجابة Anthropic OAuth 403 التي تحمل الرسالة "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`)؛ أمّا حالة رفض واحدة فتضع الاتصال في فترة تهدئة فقط -- `expired` (تنتقل إلى حالة نهائية بعد عدد محدود من المحاولات — `EXPIRED_RETRY_MAX = 3` مع تراجع أُسّي — بحيث يمكن لأخطاء OAuth العابرة أن تتعافى ذاتيًا قبل إلغاء تنشيط الحساب نهائيًا) +- `banned` — تُعيَّن عند اكتشاف كلمة محظورة/حظر حساب (راجع [BAN_DETECTION](../security/BAN_DETECTION.md))، وكذلك بعد ثلاث حالات رفض متتالية من المنبع لكل طلب (`request_rejected`، مثل خطأ Anthropic OAuth ‏403 "الطلب غير مسموح" — `open-sse/services/requestRejectedStreak.ts`)؛ لا يؤدي الرفض الواحد إلا إلى وضع الاتصال في فترة تهدئة +- `expired` (تنتقل إلى حالة نهائية بعد عدد محدود من المحاولات — `EXPIRED_RETRY_MAX = 3` مع تراجع أُسّي — كي تتمكن أخطاء OAuth العابرة من إصلاح نفسها قبل إلغاء تنشيط الحساب نهائيًا) - `credits_exhausted` تستمر هذه الحالات إلى أن تتغير بيانات الاعتماد أو يعيد أحد المشغّلين ضبطها. لا تستبدل الحالات النهائية بحالة تهدئة عابرة. -**الاسترداد الكسول:** عندما يصبح `rateLimitedUntil` في الماضي، يصبح الاتصال مؤهلًا مجددًا. وعند الاستخدام الناجح، تمسح `clearAccountError()` جميع حقول الأخطاء. +**الاسترداد الكسول:** عندما يصبح `rateLimitedUntil` في الماضي، يصبح الاتصال مؤهلًا مرة أخرى. وعند الاستخدام الناجح، يمسح `clearAccountError()` جميع حقول الأخطاء. -### اقتران الجلسة (#7274) +### حاجز استخدام Claude OAuth: مسار أقل أولوية + إعادة ضبط حد الجلسة -**النطاق:** جلسة عميل واحدة (ترويسة `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) مثبّتة على اتصال واحد، لأي مزوّد. +**النطاق:** اتصال واحد لاشتراك Claude ‏(OAuth). تتطلب كلتا الميزتين **تفعيلًا اختياريًا لكل +اتصال** (تعديل الاتصال ← قسم Claude ← ‏`lowPriorityMode` / ‏`autoLimitReset` ضمن +`providerSpecificData`، وكلاهما معطّل افتراضيًا)، وتحاكيان الأمرين `/low-priority` و +`/limit-reset` في Claude Code (عقد الاتصال مأخوذ من Claude Code 2.1.263). -**الغرض:** إبقاء وكيل متعدد الأدوار (Claude Code، أو aider، أو الوكلاء المخصصين) على الحساب نفسه عبر الطلبات، مما يقلل فقدان السياق بين الحسابات واستجابات 429 المتكررة عند البدء البارد لدى المزوّدين الذين يحتفظون بحالة جلسة لكل حساب. +**التنفيذ:** + +- آلة الحالات + تصنيف الاستجابة: `open-sse/services/claudeLowPriority.ts` +- عميل حالة/مطالبة إعادة الضبط: `open-sse/services/claudeLimitReset.ts` +- خطّاف المنفّذ (حقن الترويسة + إعادة المحاولة بالحساب نفسه): `open-sse/executors/base.ts::execute()` +- حفظ التفعيل الاختياري: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**المُشغِّل:** حاجز الاستخدام لمدة 5 ساعات — استجابة `429` تحمل ترويساتها +`anthropic-ratelimit-unified-status: rejected`، وعندما يكون الحساب مؤهلًا، +`anthropic-ratelimit-unified-slow-offer: treatment`. لا يُرسل شيء قبل أول استجابة 429 +لهذا الحاجز؛ أما استجابة 429 اندفاعية من دون ترويسات موحّدة، فتمر عبر مسار التهدئة المعتاد. + +**المسار الأقل أولوية** (`lowPriorityMode`): + +- عند استجابة 429 الخاصة بالحاجز، يقبل المنفّذ العرض ويعيد المحاولة فورًا باستخدام الحساب + **نفسه** مع `anthropic-usage-limit: slow`؛ ويظل المسار نشطًا حتى موعد + `anthropic-ratelimit-unified-reset` المُعلَن (+60 ثانية كهامش سماح)، وتحمل كل الطلبات + ضمن تلك النافذة هذه الترويسة. لا تصل استجابة 429 التي تم اعتراضها إلى `handleChatCore`، + ولذلك لا يُوضع الاتصال في فترة تهدئة ولا يجري التبديل عنه. +- ترويسة `anthropic-ratelimit-unified-slow-status` في الاستجابات اللاحقة: تُبقي القيمتان + `active` / `not_needed` المسار قائمًا؛ أما `slot_busy` ‏(429) أو `529` فتنتظر المدة المحددة + في `anthropic-ratelimit-unified-slow-retry-after` من الخادم (الافتراضي 20 ثانية، مع حصر + بين 5 و600 ثانية، وتذبذب ±30%) ثم تعيد المحاولة، ضمن حد + `anthropic-ratelimit-unified-slow-max-wait` (الافتراضي 20 دقيقة، مع حصر بين دقيقة واحدة + و6 ساعات) — وبعد تجاوزه ينتهي المسار، وتمنع فترة توقف مدتها 10 دقائق إعادة القبول. كما + تُحَد مدة الانتظار بما تبقى من مهلة بدء المنبع الخاصة بالطلب + (`resolveFetchStartTimeout`، ومدتها الافتراضية 10 دقائق) مطروحًا منها هامش 5 ثوانٍ: فمن + دون هذا الحد، ستتجاوز مدة الانتظار القصوى الافتراضية البالغة 20 دقيقة عمر الطلب، وسيُلغى + السكون في منتصف الانتظار، ما يؤدي إلى ظهور `TimeoutError` بدلًا من النهاية السلسة + `max_wait` + فترة التوقف. +- تنهي الحالات `weekly_limit` / `budget_exhausted` / `off` / `ineligible`، أو بدء نافذة + 5 ساعات جديدة، أو `ineligible` + ‏`anthropic-ratelimit-unified-overage-in-use: true` + (ما ينهيها بوصفها `extra_usage` مع أي حالة، لأن الاستخدام الإضافي المدفوع يغطي الحاجز + الآن) المسار؛ ثم تمر الاستجابة إلى مسار التهدئة المعتاد. تُحفَظ حالة `budget_exhausted` + حتى موعد إعادة ضبط الميزانية المُعلَن (≤ 8 أيام). +- يعمل فحص الحاجز بعد عمليات إعادة المحاولة داخل المحاولة نفسها التي ينفذها المنفّذ استجابةً + لأخطاء 400 (تحرير السياق، وضبط حدود التفكير/الجهد، والتعلّم التلقائي للمعاملات)، ولذلك + تظل استجابة 429 الخاصة بالحاجز، التي لا تظهر إلا في إحدى عمليات إعادة المحاولة تلك، + معترضة بدلًا من وصولها إلى مسار التهدئة. +- تُحفَظ الحالة في الذاكرة لكل اتصال (تؤدي إعادة التشغيل إلى استجابة 429 إضافية واحدة + للحاجز من أجل إعادة القبول). + +**إعادة ضبط حد الجلسة** (`autoLimitReset`، تُجرَّب قبل المسار عند تفعيل كليهما): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` ← كتلة `juniper_tide`؛ + وعندما تكون `arm: "reset"` و`available: true`، + يُرسل `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` مع + `{ "program": "juniper_tide" }` (معرّف UUID للمؤسسة من + `providerSpecificData.organizationUUID`، مع استخدام قيمة التهيئة الأولية كخيار احتياطي). +- تؤدي `result: reset|not_limited` إلى إعادة محاولة الطلب بالسرعة الكاملة (من دون ترويسة + الإبطاء). تحفظ `already_used` / `not_offered` قيمة `next_available_at` مؤقتًا (الافتراضي + أسبوع واحد)؛ ويؤدي أي فشل إلى تراجع لمدة 15 دقيقة. تتاح إعادة الضبط مرة واحدة أسبوعيًا، + وتظل محسوبة ضمن الحد الأسبوعي. + +اختبارات منع التراجع: `tests/unit/claude-low-priority-mode.test.ts`، +`tests/unit/claude-limit-reset.test.ts`، `tests/unit/claude-low-priority-executor.test.ts`. + +### ثبات الجلسة (#7274) + +**النطاق:** جلسة عميل واحدة (ترويسة `X-Session-Id` / ‏`x-codex-session-id` / ‏`x-omniroute-session`) مثبّتة على اتصال واحد، لدى **أي** مزوّد خدمة. + +**الغرض:** إبقاء وكيل متعدد الجولات (Claude Code، وaider، والوكلاء المخصصين) على الحساب نفسه عبر الطلبات، مما يقلل فقدان السياق الناتج عن الانتقال بين الحسابات وتكرار أخطاء 429 عند البدء البارد لدى موفري الخدمة الذين يحتفظون بحالة جلسة خاصة بكل حساب. **التنفيذ:** - تحديد TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- اختيار التثبيت/إنشاؤه: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- استخراج الترويسة (عام، لأي مزوّد): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- جدول التثبيت المستمر: `sessionAccountAffinity` ‏(`src/lib/db/sessionAccountAffinity.ts`) -- الإعداد: `sessionAffinityTtlMs` (مدة TTL عامة بالمللي ثانية، وتعطّلها القيمة `0`) — `src/lib/db/settings.ts`. أُعيدت تسميته من `codexSessionAffinityTtlMs` المخصص لـ Codex فقط بواسطة عملية الترحيل `124_generic_session_affinity_ttl.sql`، التي تنقل أي مدة TTL سبق تكوينها لـ Codex لتصبح القيمة الافتراضية الجديدة. +- تحديد/إنشاء التثبيت: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- استخراج الترويسة (عام، لأي موفر): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- جدول التثبيت الدائم: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- الإعداد: `sessionAffinityTtlMs` (مدة TTL عامة بالمللي ثانية، والقيمة `0` تعطلها) — `src/lib/db/settings.ts`. أُعيدت تسميته من الإعداد الخاص بـ Codex فقط، وهو `codexSessionAffinityTtlMs`، بواسطة عملية الترحيل `124_generic_session_affinity_ttl.sql`، التي تنقل أي قيمة TTL سبق تكوينها لـ Codex لتصبح القيمة الافتراضية الجديدة. -قبل #7274، كانت `resolveSessionAffinityTtlMs()` تنهي التنفيذ مباشرةً وتعيد `0` لكل مزوّد باستثناء `codex`، ولذلك لم يكن لإعداد TTL (ولا لترويسات الجلسة) أي تأثير في أي موضع آخر، رغم أن آلية التثبيت واستخراج الترويسات كانا بالفعل غير مرتبطين بمزوّد معين. أزال الإصلاح ذلك الإرجاع المبكر؛ وأصبحت مدة TTL تنطبق الآن بصورة موحدة على كل مزوّد بعد ضبطها عموميًا على قيمة أكبر من `0`. +قبل #7274، كانت `resolveSessionAffinityTtlMs()` تُرجع `0` مباشرة لكل موفر باستثناء `codex`، ولذلك لم يكن لإعداد TTL (ولا لترويسات الجلسة) أي تأثير في أي موضع آخر، رغم أن آلية التثبيت واستخراج الترويسات كانا بالفعل غير مرتبطين بموفر بعينه. أزال الإصلاح ذلك الإرجاع المبكر؛ وأصبحت قيمة TTL تُطبَّق الآن بصورة موحدة على كل موفر بمجرد ضبطها عالميًا على قيمة أكبر من `0`. -لا تُمرَّر ترويسات اقتران الجلسة الثلاث إلى المنبع مطلقًا — إذ تبني المنفّذات ترويسات المنبع الخاصة بها من الصفر بدلًا من تمرير ترويسات العميل، ولذلك تظل هذه مجرد معرّف ارتباط داخلي. +لا تُمرَّر ترويسات تقارب الجلسة الثلاث إلى المنبع مطلقًا — إذ تنشئ المنفِّذات ترويسات المنبع الخاصة بها من الصفر بدلًا من تمرير ترويسات العميل، ولذلك تظل هذه مجرد معرّف ارتباط داخلي. -### عقود الإيجار الحصرية لاتصالات الجلسات المُدارة +### عقود إيجار حصرية لاتصالات الجلسات المُدارة -**النطاق:** يمتلك عميل/جلسة HTTP مُدارة نشطة اتصال OmniRoute مؤهلًا واحدًا. +**النطاق:** يمتلك عميل/جلسة HTTP مُدارة نشطة واحدة اتصال OmniRoute مؤهلًا واحدًا. -**الغرض:** توفير ملكية حصرية دائمة للاتصال للعملاء الذين يحتاجون إلى حاجز توجيه صارم -عبر الطلبات. يختلف هذا عن اقتران الجلسة، الذي يُعد تفضيلًا مرنًا للاستمرارية: -إذ يحتفظ عقد الإيجار الحصري بحالة دورة الحياة في SQLite، ويفرض تفرّد المالك النشط -والاتصال النشط على المستوى العام، ويرفض الجيل القديم قبل الإرسال إلى المزوّد. +**الغرض:** توفير ملكية حصرية ودائمة للاتصال للعملاء الذين يحتاجون إلى حاجز توجيه صارم +عبر الطلبات. يختلف هذا عن تقارب الجلسة، الذي يُعد تفضيلًا مرنًا للاستمرارية: +إذ يحتفظ عقد الإيجار الحصري بحالة دورة الحياة في SQLite، ويفرض تفرد المالك النشط +والاتصال النشط على المستوى العام، ويرفض الجيل القديم قبل الإرسال إلى موفر الخدمة. -الميزة اختيارية لكل مفتاح API. يجب أن يمتلك المفتاح المُدار النطاق `lease:exclusive` وقائمة -`allowedConnections` صريحة وغير فارغة. يمكن لأي عميل HTTP استخدام نقطة نهاية دورة الحياة؛ ولا -يلزم اسم عميل أو وكيل مستخدم أو مزوّد أو طريقة OAuth أو نموذج. يمتلك عقد الإيجار اتصالًا، -وليس نموذجًا، ولذلك يحتفظ تغيير النموذج بالارتباط ما دام الاتصال مؤهلًا -بصورة اعتيادية. تظل قواعد النموذج والحصة والحالة الصحية وفترة التهدئة وقائمة السماح العادية -هي المرجع النهائي، وقد تنقل الجيل نفسه إلى اتصال مؤهل آخر غير مشغول. +تُفعَّل الميزة اختياريًا لكل مفتاح API. يجب أن يمتلك المفتاح المُدار نطاق `lease:exclusive` +وقائمة `allowedConnections` صريحة وغير فارغة. يمكن لأي عميل HTTP استخدام نقطة نهاية دورة الحياة؛ ولا +يلزم اسم عميل أو وكيل مستخدم أو موفر أو طريقة OAuth أو نموذج. يمتلك عقد الإيجار اتصالًا، +وليس نموذجًا، ولذلك فإن تغيير النموذج يُبقي الارتباط قائمًا ما دام الاتصال مؤهلًا +وفق الشروط المعتادة. تظل قواعد النموذج والحصة والصحة وفترة التهدئة وقائمة السماح المعتادة هي المرجع الحاكم، وقد +تنقل الجيل نفسه إلى اتصال مؤهل آخر متاح. -تتمثل دورة الحياة في `POST /api/v1/session-leases` مع إجراءات JSON المسماة `acquire` و`renew` و`release`. -تقدّم طلبات الاستدلال المُدارة قيمة `X-OmniRoute-Lease-Owner` المعتمة وقيمة -`X-OmniRoute-Lease-Generation` الدقيقة. يستخدم المالك السابقة `vlo_` متبوعةً بـ 43 محرفًا من base64url؛ ولا -يُخزّن سوى تجزئة SHA-256 الخاصة به. يربط كل حاجز إرسال نهائي أيضًا معرّف مفتاح API المُصادَق عليه -ومعرّف الاتصال النشط. تُزال ترويسات التحكم في عقد الإيجار من السجلات ولقطات الطلبات المحتفظ بها -وترويسات منفّذ المنبع. +تتم إدارة دورة الحياة عبر `POST /api/v1/session-leases` باستخدام إجراءات JSON التالية: `acquire` و`renew` و`release`. +تُرسل طلبات الاستدلال المُدارة القيمة المبهمة `X-OmniRoute-Lease-Owner` والقيمة المطابقة تمامًا +`X-OmniRoute-Lease-Generation`. يبدأ المالك بـ `vlo_` متبوعًا بـ 43 محرفًا من base64url؛ ولا +تُخزَّن سوى قيمة تجزئة SHA-256 الخاصة به. يربط كل حاجز إرسال نهائي أيضًا معرّف مفتاح API المصادَق عليه +ومعرّف الاتصال النشط. تُزال ترويسات التحكم بعقد الإيجار من السجلات ولقطات الطلبات المحفوظة +وترويسات منفِّذات المنبع. -إذا كان التوجيه العادي يضم مرشحين مُدارين مؤهلين، لكن كل مرشح غير مشغول محجوز بعقد -إيجار نشط أجنبي، فستعيد OmniRoute استجابة HTTP `429`، ورمز عدم توفر سعة عقد الإيجار، -وحالة انتظار للسعة، وقيمة `Retry-After` محدودة مشتقة من أقرب انتهاء صلاحية ذي صلة. -لا يُعد غياب الأهلية العادي تنافسًا على عقد إيجار، ويحتفظ بدلالات خطأ التوجيه الحالية. +إذا كان التوجيه المعتاد يحتوي على مرشحين مُدارين مؤهلين، لكن كل مرشح متاح مشغول بعقد إيجار +نشط أجنبي، فإن OmniRoute يُرجع HTTP `429`، والرمز `lease-capacity-unavailable`، وحالة +انتظار للسعة، وقيمة `Retry-After` محدودة مشتقة من أقرب وقت انتهاء ذي صلة. +أما عدم وجود أهلية وفق التوجيه المعتاد فلا يُعد تنازعًا على عقد إيجار، ويحتفظ بدلالات أخطاء التوجيه الحالية. تظل الآليات ذات الصلة منفصلة: -- إشغال جلسة OAuth هو توزيع مرن محلي للعملية لحسابات OAuth. -- تمنح إشارات الحساب تصاريح لتزامن الطلبات وتنتهي عند اكتمال الطلب. +- إشغال جلسات OAuth هو توزيع مرن محلي للعملية لحسابات OAuth. +- تمنح إشارات الحساب تصاريح تزامن الطلبات وتنتهي عند اكتمال الطلب. - عقود الإيجار الحصرية للجلسات المُدارة هي ملكية دائمة لدورة الحياة مع حاجز للجيل. --- @@ -272,47 +336,73 @@ _حالة_ الحظر النشطة مؤقتة. --- -## 5. التحكم في قبول قائمة انتظار الطلبات (v3.8.49 · المشكلة #6593) - -**النطاق**: قائمة انتظار حد المعدل المحلية لكل مزوّد+اتصال (`open-sse/services/rateLimitManager.ts`، -والمدعومة بواسطة Bottleneck)، وهي طبقة أدنى من الآليات الثلاث المذكورة أعلاه. - -**`maxWaitMs` اسم قديم محفوظ لانتهاء صلاحية التنفيذ.** -تُمرر `resilienceSettings.requestQueue.maxWaitMs` إلى Bottleneck بوصفها قيمة -`expiration` للمهمة، ولا يبدأ مؤقتها إلا بعد التوجيه. ولذلك فهي تحد تنفيذ المهمة -الذي يديره محدد المعدل، وليس الوقت المستغرق في قائمة الانتظار المحلية. ويظهر انتهاء الصلاحية -بصيغة `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` محلية موثوقة (HTTP 504)؛ -ولا يُقبل اسم رمز مهلة قائمة الانتظار السابق إلا لضمان التوافق الداخلي الموثوق -مع الإصدارات السابقة. القيمة الافتراضية هي 15000ms؛ ويمكن تجاوزها عبر -`RATE_LIMIT_MAX_WAIT_MS` (متغير بيئة) أو لوحة المعلومات (**الإعدادات ← المرونة**، -بسقف واجهة مستخدم يتراوح بين 1 و30000ms). لا توجد مهلة زمنية للإقامة في قائمة الانتظار؛ استخدم -`maxQueueDepth` أدناه لتحديد عدد المستدعين المنتظرين. - -**`maxQueueDepth` — حد قبول اختياري (جديد).** يحدد `resilienceSettings.requestQueue.maxQueueDepth` -عدد الطلبات التي يمكن أن تبقى في قائمة الانتظار (ولم تُوجّه بعد) لمزوّد+اتصال واحد -في الوقت نفسه. عندما تحتوي قائمة الانتظار بالفعل على `maxQueueDepth` -من الطلبات، يُرفض الطلب الجديد سريعًا بخطأ ذي نوع محدد -`code: "RATE_LIMIT_QUEUE_FULL"` **قبل** أن يصل إلى `limiter.schedule()` -— ولذلك يكون الرفض منخفض التكلفة ويحدث قبل أي عمل لاحق متعلق بضغط -المطالبة / الترجمة لذلك الطلب. القيمة الافتراضية `0` = -معطّل، مما يحافظ على سلوك قائمة الانتظار غير المحدودة الحالي؛ والنطاق المسموح هو 0–100000. -يمكن التجاوز عبر `RATE_LIMIT_MAX_QUEUE_DEPTH` (متغير بيئة) أو -`resilienceSettings.requestQueue.maxQueueDepth` (تحديث جزئي عبر لوحة المعلومات/API). - -فحص القبول نفسه دالة نقية -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`)، لذا -يمكن اختبارها باختبارات الوحدات دون محدد Bottleneck فعلي. +## 5. التحكم في قبول طابور الطلبات (v3.8.49 · المشكلة #6593) + +**النطاق**: طابور تحديد المعدّل المحلي لكل مزوّد+اتصال (`open-sse/services/rateLimitManager.ts`، +والمدعوم بواسطة Bottleneck)، وهو طبقة واحدة أسفل الآليات الثلاث المذكورة أعلاه. + +**يحدّد `maxWaitMs` مدة الانتظار في الطابور؛ ويحدّد `executionMaxWaitMs` مدة التنفيذ.** +الاثنان منفصلان عمدًا، ولا يؤثر أيّ منهما في الآخر. + +يمثّل `resilienceSettings.requestQueue.maxWaitMs` **ميزانية انتظار الطابور**: فهو +يشمل انتظار خانة متاحة لدى المزوّد، ثم البقاء في حالة QUEUED، ويُلغى مؤقّته +بمجرد مغادرة المهمة حالة QUEUED وبدء تنفيذها +(`rateLimitManager.ts`، ‏`wrappedFn`). الطلب الذي يتجاوز هذه المدة لا يصل مطلقًا +إلى الخدمة الأولية. القيمة الافتراضية هي 30000ms، وتوفّرها +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +في `src/lib/resilience/settings.ts`، كما يثبّتها الاختبار +`tests/unit/ratelimit-admission-control-6593.test.ts`، ولذلك فإن تغييرها يؤدي +إلى فشل ذلك الاختبار بدلًا من أن تصبح هذه الفقرة قديمة دون تنبيه. + +أما `resilienceSettings.requestQueue.executionMaxWaitMs` فهي القيمة التي +يتلقّاها Bottleneck بوصفها `expiration` للمهمة، ولا يبدأ مؤقّتها إلا بعد +الإرسال. وهي آلية احتياطية للمنفّذات التي لا تملك مهلة انتهاء خاصة بها عند +التعامل مع الخدمة الأولية، وتُرفع إلى مهلة بدء الجلب الخاصة بالمنفّذ عندما +تكون الأخيرة أطول، بحيث لا تقطع استجابة سليمة قيد التنفيذ. القيمة الافتراضية +هي 600000ms (10 دقائق). + +كان تمرير ميزانية الطابور إلى `expiration` هو ما يتسبّب سابقًا في إنهاء +البوابات غير التزايدية أثناء التنفيذ — إذ تعمل بصورة مشروعة لدقائق قبل وصول +أول وحدات البايت — ولهذا يظهر انتهاء الصلاحية بالصيغة `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` ‏(HTTP 504)، بينما تحمل ميزانية الطابور رمز +انتهاء مهلة الطابور. يمكن تجاوز أيٍّ منهما عبر `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (متغيّرات البيئة)، أو من لوحة التحكم +(**الإعدادات ← المرونة**). تُقيّد القيمتان ضمن النطاق 1ms–24h عند تسويتهما. + +**الأسبقية لكليهما:** لا يوفّر متغيّر البيئة سوى القيمة _الافتراضية_. تتغلّب +عليه أي قيمة محفوظة في `resilienceSettings.requestQueue` (عبر لوحة التحكم / +تصحيح API، ومخزّنة في `key_value`)، وتتغلّب عليها بدورها قيمة +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` الخاصة بالاتصال. +لذلك، فإن ضبط متغيّر البيئة في نشر يحتوي مسبقًا على قيمة محفوظة لا يغيّر +شيئًا — امسح الإعداد المحفوظ أو حدّثه بدلًا من ذلك. + +تُقيَّد مدة البقاء في الطابور بواسطة `maxWaitMs`؛ بينما يحدّد +`maxQueueDepth` أدناه عدد المستدعين الذين يمكن وضعهم في الطابور في الوقت نفسه. + +**`maxQueueDepth` — حدّ قبول اختياري (جديد).** يحدّد `resilienceSettings.requestQueue.maxQueueDepth` +عدد الطلبات التي يمكن أن تبقى في الطابور (دون إرسالها بعد) لمزوّد+اتصال واحد +في الوقت نفسه. عندما يحتوي الطابور بالفعل على `maxQueueDepth` من الطلبات، +يُرفض الطلب الجديد سريعًا بخطأ ذي نوع محدّد +`code: "RATE_LIMIT_QUEUE_FULL"` **قبل** أن يصل مطلقًا إلى `limiter.schedule()` +— وبذلك يكون الرفض منخفض التكلفة ويحدث قبل أي عمل لاحق لضغط الموجّه / الترجمة +لذلك الطلب. القيمة الافتراضية `0` = معطّل، مما يحافظ على سلوك الطابور الحالي +غير المحدود؛ والنطاق المقيّد هو 0–100000. يمكن التجاوز عبر +`RATE_LIMIT_MAX_QUEUE_DEPTH` (متغيّر البيئة)، أو +`resilienceSettings.requestQueue.maxQueueDepth` (تصحيح لوحة التحكم/API). + +فحص القبول نفسه هو دالة خالصة +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`)، ولذلك +يمكن اختباره على مستوى الوحدة دون محدّد Bottleneck حقيقي. > اقترح RFC الذي فتح المشكلة #6593 أيضًا علامة `bypassCompressionOnRateLimit`. -> إن مسار `open-sse/services/compression/` في هذا المستودع مخصص -> لضغط المطالبة/السياق في طلب LLM الصادر (`chatCore.ts`، -> بالقرب من كتلة `resolveCompressionSettings`/`selectCompressionStrategy`)، -> وليس لضغط استجابة HTTP لأجسام 429 المُنشأة — ولا يوجد -> مسار برمجي مطابق لعلامة تجاوز حرفية. كما أن خطوة ضغط المطالبة هذه -> تعمل حاليًا _قبل_ `withRateLimit()` في مسار الطلب، لذا فإن -> إعادة الترتيب لتخطيها عند رفض امتلاء قائمة الانتظار تمثل تغييرًا منفصلًا وأكبر -> من نطاق هذه المشكلة؛ ولذلك **لم** تُنفذ هنا عمدًا، -> وتُركت كمتابعة لاحقة إذا كانت وفورات CPU تستحق مخاطر +> يمثّل مسار `open-sse/services/compression/` في هذا المستودع ضغط +> الموجّه/السياق في طلب LLM الصادر (`chatCore.ts`، +> حول كتلة `resolveCompressionSettings`/`selectCompressionStrategy`)، +> وليس ضغط استجابة HTTP لنصوص 429 المنشأة — ولا يوجد مسار برمجي مطابق لعلامة +> تجاوز حرفية. كما أن خطوة ضغط الموجّه هذه تعمل حاليًا _قبل_ `withRateLimit()` +> في مسار معالجة الطلب، ولذلك فإن إعادة الترتيب لتجاوزها عند رفض امتلاء الطابور +> تمثّل تغييرًا منفصلًا وأكبر من نطاق هذه المشكلة؛ وقد تقرّر عمدًا **عدم** +> تنفيذها هنا، وتُركت كمتابعة لاحقة إذا كان مكسب توفير موارد CPU يستحق مخاطر > إعادة الترتيب. --- diff --git a/docs/i18n/ar/docs/architecture/admission-lanes.md b/docs/i18n/ar/docs/architecture/admission-lanes.md index c522ae45a994..121f9bd19ac7 100644 --- a/docs/i18n/ar/docs/architecture/admission-lanes.md +++ b/docs/i18n/ar/docs/architecture/admission-lanes.md @@ -7,48 +7,52 @@ لدى OmniRoute نظامان **اثنان** للمسارات محليان داخل العملية، ولكل منهما نطاق مختلف. وهما متكاملان؛ وينبغي للمشغّلين معرفة أيّهما ينظرون إليه. -## 1. التحكم في القبول على مستوى البايت للعملية بأكملها (`chatBodyAdmission.ts`) - -- **النطاق:** مسار النص المخزّن مؤقتًا/الكومة لطلبات `POST /v1/chat/completions` - و`/v1/messages` و`/v1/responses` والمسارات الأخرى المشابهة للدردشة. يحمي - من تضخيم استخدام الكومة الناتج عن نصوص طلبات وكلاء البرمجة الكبيرة (#4380). -- **وحدة تحكم عامة واحدة لكل عملية، وليست مسارات منفصلة لكل مفتاح (#10110).** يُقبَل كل مفتاح API - (بعد تجزئته) أو جلسة `anonymous` ضمن **الميزانية** المشتركة نفسها — - ولا يُستخدم معرّف الجلسة المُجزّأ إلا كمفتاح لجدولة عادلة (توزيع - الانتظار بالتناوب)، ولا يُستخدم أبدًا لتقسيم السعة. وصفت نسخة سابقة من هذا - المستند مسارات لكل مفتاح ذات سعات مستقلة؛ وقد أُزيل ذلك النموذج - في #10110 لأنه كان يسمح لبيانات اعتماد مزيفة غير مصادق عليها بمضاعفة - الحد على مستوى العملية. -- **البوابة (#503-fanout): ميزانية إدخال بالبايت تُشتق تلقائيًا، وليست عددًا ثابتًا - للطلبات.** كان حد عدد الطلبات القديم `CHAT_MAX_HEAVY_IN_FLIGHT` (بقيمة افتراضية `1` - قبل هذا الإصلاح) يخفض التوزيع المتشعب لوكلاء البرمجة (عدة وكلاء فرعيين/واجهات CLI، - ونصوص طلبات تتجاوز عادةً 256 KB) إلى تزامن فعلي يبلغ نحو 1، ما كان يؤدي إلى - استجابات 503 تحت حمل طبيعي تمامًا. وأصبح الآن مفعّلًا فقط عندما يضبط المشغّل - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` صراحةً. وإذا تُرك دون ضبط، فسيُتحكم في القبول بدلًا من ذلك +## 1. القبول على مستوى البايت للعملية بأكملها (`chatBodyAdmission.ts`) + +- **النطاق:** مسار نص الطلب المخزّن مؤقتًا/الذاكرة الديناميكية لطلبات `POST /v1/chat/completions`، + و`/v1/messages`، و`/v1/responses`، والمسارات الأخرى المشابهة للدردشة. يحمي + من تضخيم استخدام الذاكرة الديناميكية الناتج عن نصوص طلبات وكلاء البرمجة الكبيرة (#4380). +- **متحكّم عام واحد لكل العملية، وليس مسارات منفصلة لكل مفتاح (#10110).** تُقبل كل جلسة + مرتبطة بمفتاح API (مُجزّأ) أو جلسة `anonymous` ضمن **الميزانية** المشتركة نفسها — + ولا يُستخدم معرّف الجلسة المُجزّأ إلا كمفتاح لجدولة عادلة (توزيع دوري + بين المنتظرين)، ولا يُستخدم مطلقًا لتقسيم السعة. وصفت نسخة سابقة من هذا + المستند مسارات منفصلة لكل مفتاح بسعات مستقلة؛ وقد أُزيل ذلك النموذج + في #10110 لأنه كان يسمح لبيانات الاعتماد الوهمية غير الموثّقة بمضاعفة + الحد على مستوى العملية بأكملها. +- **البوابة (#503-fanout): ميزانية إدخال بالبايت مشتقة تلقائيًا، وليست عددًا ثابتًا + من الطلبات.** كان الحد القديم لعدد الطلبات `CHAT_MAX_HEAVY_IN_FLIGHT` (القيمة الافتراضية `1` + قبل هذا الإصلاح) يخفض تفرّع وكلاء البرمجة (عدة وكلاء فرعيين/واجهات CLI، + مع نصوص طلبات تتجاوز عادةً 256 KB) إلى تزامن فعلي يبلغ نحو 1، ما كان يؤدي إلى + إرجاع 503 في ظل حمل طبيعي تمامًا. ولم يعد هذا الحد مُلزمًا إلا عندما يضبطه المشغّل صراحةً + عبر `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. وعند تركه دون ضبط، يُتحكم في القبول بدلًا من ذلك بواسطة `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — وهي ميزانية مشتقة تلقائيًا من الحد الفعلي لذاكرة العملية (`src/shared/middleware/admissionBudget.ts`): - نسبة 25% من الحد الأكثر تقييدًا بين حد كومة V8 وأي حد لمجموعة cgroup/الحاوية، - مقسومة على معامل تضخيم عابر قدره 8x، ومقيّدة بين 8 MiB و - 2 GiB. تستخدم التجاوزات الصريحة القيود نفسها. ويتدرج هذا تلقائيًا من - حاوية بحجم 512 MB إلى حاسوب مكتبي بذاكرة 32 GB دون ضبط متغيرات البيئة. يفشل فورًا أي نص طلب - لا يمكن احتواؤه ضمن الميزانية الفعلية، مع `413 body_exceeds_budget`؛ - ولا تدخل طابور العدالة المحدود سوى حالات التنافس بين نصوص الطلبات التي يمكن خدمتها - كلٌّ على حدة. ويقوم متعقب مباشر لضغط الموارد متعدد الإشارات (نسبة كومة V8، - وcgroup، وPSI، وأحداث OOM — `open-sse/utils/resourcePressurePolicy.ts`) بتقصير - مدة الانتظار المحدودة عند ضغط `high`، ويرفض الحمل فورًا باستخدام - `503 resource_pressure` عند ضغط `critical`، قبل إدخال أي بايتات أصلًا. + 25% من الحد الأكثر تقييدًا بين حد ذاكرة V8 وأي حد خاص بـ cgroup/الحاوية، + مقسومًا على معامل تضخيم مؤقت قدره 8x، ومقيّدًا بين 8 MiB و + 2 GiB. تستخدم التجاوزات الصريحة القيود نفسها. وبذلك تتكيّف الميزانية تلقائيًا من + حاوية بسعة 512 MB إلى حاسوب مكتبي بسعة 32 GB دون أي ضبط لمتغيرات البيئة. يفشل فورًا أي نص طلب + لا يمكن احتواؤه ضمن الميزانية الفعلية مع `413 body_exceeds_budget`؛ + ولا تدخل قائمة انتظار العدالة المحدودة إلا حالات التنافس بين نصوص الطلبات التي يمكن خدمتها + كلٌّ على حدة. ويعمل متتبّع مباشر لضغط الموارد متعدد الإشارات (نسبة ذاكرة V8 الديناميكية، + وcgroup، وPSI، وأحداث OOM — `open-sse/utils/resourcePressurePolicy.ts`) على تقصير + مدة الانتظار المحدودة تحت ضغط `high`، وإسقاط الطلبات فورًا مع + `503 resource_pressure` تحت ضغط `critical`، قبل إدخال أي بايتات أصلًا. + تُقرأ PSI من `memory.pressure` الخاصة بـ cgroup لهذه الوحدة عند وجودها + (`open-sse/utils/resourcePressureSampler.ts`)؛ أما `/proc/pressure/memory` فهي + على مستوى المضيف بالكامل، ولا تُستخدم إلا كخيار احتياطي على الأجهزة الفعلية / cgroup v1، بحيث لا + يمكن لمضيف يستخدم التبديل أن يتسبب في إرجاع 503 من حاوية خاملة. - **الضبط:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — تجاوز لميزانية البايتات المشتقة تلقائيًا - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — حد قديم لعدد الطلبات، اختياري فقط - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — مدة الانتظار في الطابور قبل إرجاع 503 (الافتراضي 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — صمام للكومة خاص بالبايتات الموضوعة في الطابور (الافتراضي 4 MB) + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — تجاوز لميزانية البايت المشتقة تلقائيًا + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — حد قديم لعدد الطلبات، لا يُفعّل إلا صراحةً + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — مدة الانتظار في قائمة الانتظار قبل إرجاع 503 (القيمة الافتراضية 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — صمام للذاكرة الديناميكية خاص بالبايتات الموضوعة في قائمة الانتظار (القيمة الافتراضية 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — مهملان - ولا تأثير لهما منذ #10110 (مقبولان لتوافق الإعدادات، لكن يتم تجاهلهما) + ولا ينفّذان أي إجراء منذ #10110 (مقبولان للتوافق مع الإعدادات، لكن يتم تجاهلهما) - **التقارير:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — بما في ذلك - إضافات #503-fanout التالية: `inflightBytes` و`maxInflightBytes` و`budgetSource` - (`v8_heap` | `cgroup` | `override`) و`pressureSeverity` و`countCapEnabled` - (تكون قيمته false في النشر الافتراضي — ما يؤكد أن ميزانية البايتات، لا حد - العدد القديم، هي المطبقة فعليًا). + إضافات #503-fanout: `inflightBytes`، و`maxInflightBytes`، و`budgetSource` + (`v8_heap` | `cgroup` | `override`)، و`pressureSeverity`، و`countCapEnabled` + (تكون false في النشر الافتراضي — ما يؤكد أن ميزانية البايت، لا حد العدد القديم، + هي القيد الفعلي). ## 2. المسارات الافتراضية التكيفية وقت التشغيل (`open-sse/services/admission`) diff --git a/docs/i18n/ar/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/ar/docs/frameworks/EMBEDDED-SERVICES.md index f9e7a4ec5441..f3c497216f07 100644 --- a/docs/i18n/ar/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/ar/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,11 +5,11 @@ --- > **الإصدار:** v3.8.44 -> **آخر تحديث:** 2026-07-03 -> **الجمهور المستهدف:** المهندسون الذين يضيفون الخدمات المضمّنة (9Router وCLIProxyAPI وMux وBifrost) أو يصونونها أو يصحّحون أخطاءها. +> **آخر تحديث:** 2026-09-09 +> **الجمهور المستهدف:** المهندسون الذين يضيفون الخدمات المضمّنة أو يصونونها أو يصححون أخطاءها (9Router، CLIProxyAPI، Mux، Bifrost، open-wa). -الخدمات المضمّنة هي أدوات جانبية للعمليات، مثبّتة محليًا، يقوم OmniRoute بتثبيتها والإشراف عليها -وإتاحتها كوجهات توجيه من الدرجة الأولى. وعلى عكس المزوّدين الخارجيين (الذين يُتّصل بهم عبر الإنترنت +الخدمات المضمّنة هي أدوات عمليات جانبية مثبّتة محليًا يقوم OmniRoute بتثبيتها والإشراف عليها +وإتاحتها كوجهات توجيه من الدرجة الأولى. بخلاف المزوّدين الخارجيين (الذين يجري الوصول إليهم عبر الإنترنت باستخدام مفاتيح API)، تعمل الخدمات المضمّنة على الجهاز نفسه الذي يعمل عليه OmniRoute وتتواصل عبر واجهة الاسترجاع الحلقي. --- @@ -29,45 +29,46 @@ ## 1. نظرة عامة -### لماذا نستخدم الخدمات المضمّنة؟ +### لماذا الخدمات المضمّنة؟ -هناك خمس خدمات مضمّنة: +تم تضمين ست خدمات: -| الخدمة | حزمة npm | المنفذ الافتراضي | الغرض | -| --------------- | -------------------------------------- | :--------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **9Router** | `9router` | 20130 | موجّه ذكاء اصطناعي يمكن لـ OmniRoute استخدامه كمزوّد فرعي. تُتاح النماذج بالصيغة `9router/{sub}/{model}` | -| **CLIProxyAPI** | ملف ثنائي من إصدار GitHub (`cliproxy`) | 8317 | مهايئ وكيل محلي لتدفّقات مصادقة Anthropic CLI. يوفّر توجيهًا احتياطيًا عند انتهاء صلاحية رموز OAuth | -| **Mux** | `mux` (الأمر غير الرسومي `mux server`) | 8322 | برنامج خفي محلي لتنسيق الوكلاء (coder/mux). تُدار دورة حياته فقط — وليس وجهة توجيه (لا يوكّل طلبات LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | واجهة خلفية لترحيل بوابة ذكاء اصطناعي مكتوبة بلغة Go. عند تشغيلها، يحدّدها مسار الترحيل (`/v1/relay/`) تلقائيًا | -| **Dario** | `@askalf/dario` | 3456 | وكيل لاشتراك Claude — بديل/خيار تجاوز فشل لـ CLIProxyAPI لحركة البيانات المتوافقة مع بنية Claude Code؛ يصبح المفتاح المحقون `DARIO_ADMIN_TOKEN` الذي يقيّد مستوى تحكّم OAuth في `/admin/*` | +| الخدمة | حزمة npm | المنفذ الافتراضي | الغرض | +| --------------- | ------------------------------------------- | :--------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | موجّه ذكاء اصطناعي يمكن لـ OmniRoute استخدامه كمزوّد فرعي. تُعرض النماذج بصيغة `9router/{sub}/{model}` | +| **CLIProxyAPI** | ملف ثنائي من إصدار GitHub (`cliproxy`) | 8317 | محوّل وكيل محلي لتدفقات مصادقة Anthropic CLI. يوفّر توجيهًا احتياطيًا عند انتهاء صلاحية رموز OAuth | +| **Mux** | `mux` (تشغيل `mux server` دون واجهة رسومية) | 8322 | برنامج خفي محلي لتنسيق الوكلاء (coder/mux). تُدار دورة حياته فقط — وليس هدفًا للتوجيه (لا ينفّذ تمريرًا وكيلاً لطلبات LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | واجهة خلفية لترحيل بوابة ذكاء اصطناعي مكتوبة بلغة Go. عند تشغيلها، يجري اختيارها تلقائيًا بواسطة مسار الترحيل (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | وكيل لاشتراك Claude — بديل/خيار تجاوز فشل لـ CLIProxyAPI لحركة البيانات المتوافقة مع Claude Code؛ يصبح المفتاح المحقون `DARIO_ADMIN_TOKEN` الذي يحمي مستوى تحكم OAuth ضمن `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | أتمتة WhatsApp Web (متصفح Chromium دون واجهة رسومية عبر Puppeteer). تُدار دورة حياته فقط — وليس هدفًا للتوجيه. | -تتبع الخدمات الخمس جميعها نموذج الإشراف نفسه: +تتبع الخدمات الست جميعها نموذج الإشراف نفسه: - يثبّتها OmniRoute ضمن `DATA_DIR/services/{name}/` (بمعزل عن ملف `package.json` الخاص بـ OmniRoute) - يشغّلها OmniRoute ويراقبها كعمليات فرعية -- يحقن OmniRoute مفتاح API مؤقتًا في بيئة العملية الفرعية ويقوم بتدويره دون توقّف الخدمة (حيثما ينطبق ذلك) -- جميع مسارات الإدارة (`/api/services/*`) هي **LOCAL_ONLY** — ولا يمكن الوصول إليها إلا من واجهة الاسترجاع الحلقي (القاعدة الصارمة رقم 17) +- يحقن OmniRoute مفتاح API مؤقتًا في بيئة العملية الفرعية ويدوّره دون توقف الخدمة (حيثما ينطبق) +- جميع مسارات الإدارة (`/api/services/*`) هي **LOCAL_ONLY** — ولا يمكن الوصول إليها إلا من عنوان الاسترجاع المحلي (القاعدة الصارمة رقم 17) ### القرارات الرئيسية (من خطة التصميم) -| القرار | القيمة | -| --------------------------------------------- | ----------------------------------------------------------------------------------- | -| وصول لوحة المعلومات إلى واجهة 9Router الأصلية | وكيل عكسي عند `/dashboard/providers/services/9router/embed/*` | -| آلية التثبيت | `npm install {package}` عبر `execFile` (دون استيفاء أوامر shell) | -| وضع الاستخدام | تسجيل المزوّد بالصيغة `9router/{sub}/{model}` في محرّك التوجيه | -| إدارة مفتاح API | ينشئ OmniRoute المفتاح ويشفّره عند التخزين (AES-256-GCM) ويحقنه عبر متغيّرات البيئة | -| موقع لوحة المعلومات | `/dashboard/providers/services` (ثلاث علامات تبويب) | -| التشغيل التلقائي | مفتاح تبديل لكل خدمة، مع تعطيله افتراضيًا | +| القرار | القيمة | +| --------------------------------------------- | ---------------------------------------------------------------------------------- | +| وصول لوحة المعلومات إلى واجهة 9Router الأصلية | وكيل عكسي عند `/dashboard/providers/services/9router/embed/*` | +| آلية التثبيت | `npm install {package}` عبر `execFile` (دون استيفاء أوامر الصدفة) | +| وضع الاستخدام | تسجيل المزوّد بصيغة `9router/{sub}/{model}` في محرك التوجيه | +| إدارة مفتاح API | ينشئ OmniRoute المفتاح ويشفّره عند التخزين (AES-256-GCM) ويحقنه عبر متغيرات البيئة | +| موقع لوحة المعلومات | `/dashboard/providers/services` (ثلاث علامات تبويب) | +| التشغيل التلقائي | مفتاح تبديل لكل خدمة، ويكون معطّلًا افتراضيًا | --- -## 2. البنية — 4 طبقات +## 2. البنية المعمارية — 4 طبقات ``` ┌────────────────────────────────────────────────────────────────────┐ │ الطبقة 1 — واجهة المستخدم │ │ /dashboard/providers/services (علامات التبويب: CLIProxyAPI | 9Router | Mux)│ -│ السجلات المباشرة (SSE)، البدء/الإيقاف/إعادة التشغيل/التحديث، الإعدادات، التثبيت│ +│ السجلات المباشرة (SSE)، بدء/إيقاف/إعادة تشغيل/تحديث، الإعدادات، التثبيت│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx الغلاف + توجيه علامات التبويب عبر ?tab=│ @@ -76,9 +77,9 @@ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ │ ServiceLogsPanel, ApiKeyCard, ... │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP ‏(Next.js fetch) + │ HTTP (طلب Next.js عبر fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ الطبقة 2 — API ‏(LOCAL_ONLY — الاسترجاع الحلقي فقط) │ +│ الطبقة 2 — واجهة API (LOCAL_ONLY — عبر loopback فقط) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -87,52 +88,52 @@ │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (وكيل عكسي لـ HTTP وWebSocket ← خدمة 9Router المنبع) │ +│ (وكيل عكسي لـ HTTP وWebSocket ← المنبع 9Router) │ │ │ │ البوابة: تتضمن LOCAL_ONLY_API_PREFIXES المسار "/api/services/" و │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ استدعاءات داخل العملية ┌──────────────────────▼─────────────────────────────────────────────┐ -│ الطبقة 3 — ServiceSupervisor ‏(src/lib/services/) │ +│ الطبقة 3 — ServiceSupervisor ‏(src/lib/services/) │ │ │ │ ServiceSupervisor.ts مشرف عام (child_process.spawn) │ │ ├── التثبيت: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── البدء: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── مفتاح API: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── مفتاح API: crypto.randomBytes(32) ← env NINEROUTER_API_KEY │ │ ├── المنفذ: 20130 لـ 9Router (قابل للتهيئة) │ │ ├── السجلات: مخزن حلقي لـ stdio بحجم 5 MB ← أحداث SSE │ -│ ├── الصحة: HTTP GET /health كل 2–5 ثوانٍ، مع استرداد كسول │ -│ └── دورة الحياة: SIGTERM لمدة 15 ثانية ← SIGKILL │ +│ ├── الصحة: HTTP GET /health كل 2–5 ثوانٍ، استرداد كسول │ +│ └── دورة الحياة: SIGTERM لمدة 15 ثانية ← SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts يهيئ جميع SERVICES[] عند بدء العملية │ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts طلب GET دوري إلى /v1/models ← جدول service_models│ +│ modelSync.ts طلب GET /v1/models دوري ← جدول service_models │ │ ringBuffer.ts مخزن سجلات دائري (5 MB لكل خدمة) │ -│ healthCheck.ts فحص صحة HTTP بالاستقصاء │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ healthCheck.ts مسبار دوري لفحص صحة HTTP │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (مهايئات التثبيت) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP متوافق مع OpenAI (استرجاع حلقي) + │ HTTP متوافق مع OpenAI ‏(loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ الطبقة 4 — المزوّد / التوجيه │ +│ الطبقة 4 — المزوّد / التوجيه │ │ │ │ open-sse/executors/ninerouter.ts │ -│ يعيد البحث عن المنفذ ومفتاح API لكل طلب (من دون تخزين مؤقت). │ +│ يعيد البحث عن المنفذ ومفتاح API لكل طلب (من دون تخزين مؤقت). │ │ يزيل البادئة "9router/" من معرّف النموذج قبل تمريره عبر الوكيل. │ │ يعيد 503 service_not_running إذا لم يكن المشرف في حالة "running".│ │ │ │ src/shared/constants/providers.ts │ -│ إدخال لـ "9router": isEmbeddedService: true │ +│ إدخال لـ "9router":‏ isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ تُخزّن النماذج بصيغة "9router/{sub}/{model}" (مع بادئة). │ +│ تُخزّن النماذج بصيغة "9router/{sub}/{model}" (ببادئة). │ │ تتم مزامنتها كل 5 دقائق بواسطة modelSync.ts. │ │ │ │ تتم إدارة دورة حياة Mux فقط (الطبقات 1-3) — فهو برنامج خفي │ -│ لتنسيق الوكلاء، وليس وكيل LLM، ولذلك لا يملك منفّذًا أو إدخال │ -│ مزوّد في الطبقة 4، ولا يكون أبدًا هدفًا للتوجيه. │ +│ لتنسيق الوكلاء، وليس وكيل LLM، لذلك لا يملك منفّذًا أو إدخال │ +│ مزوّد في الطبقة 4، ولا يُستخدم مطلقًا هدفًا للتوجيه. │ └────────────────────────────────────────────────────────────────────┘ ``` @@ -143,13 +144,14 @@ | `src/lib/services/ServiceSupervisor.ts` | الفئة الأساسية: دورة الحياة، القفل، الصحة، المخزن الحلقي | | `src/lib/services/bootstrap.ts` | التسجيل على مستوى العملية والبدء التلقائي | | `src/lib/services/registry.ts` | خريطة مفردة `tool → supervisor` | -| `src/lib/services/apiKey.ts` | إنشاء المفاتيح، وتشفير AES-256-GCM للبيانات المخزنة | -| `src/lib/services/modelSync.ts` | مزامنة دورية للنماذج (كل 5 دقائق) + عند الطلب | -| `src/lib/services/ringBuffer.ts` | مخزن مؤقت دائري للسجلات بحجم 5 MB مع الاشتراك عبر SSE | -| `src/lib/services/healthCheck.ts` | فحص صحة عبر HTTP (بفاصل زمني قابل للتهيئة) | -| `src/lib/services/installers/ninerouter.ts` | تثبيت/تحديث/إلغاء تثبيت 9Router باستخدام npm | -| `src/lib/services/installers/cliproxy.ts` | تثبيت/تحديث/إلغاء تثبيت CLIProxyAPI باستخدام npm | -| `src/lib/services/installers/mux.ts` | تثبيت/تحديث/إلغاء تثبيت Mux باستخدام npm | +| `src/lib/services/apiKey.ts` | إنشاء المفاتيح وتشفير AES-256-GCM للبيانات المخزنة | +| `src/lib/services/modelSync.ts` | مزامنة دورية للنماذج (5 دقائق) + عند الطلب | +| `src/lib/services/ringBuffer.ts` | مخزن دائري للسجلات بسعة 5 MB مع الاشتراك عبر SSE | +| `src/lib/services/healthCheck.ts` | فحص صحة HTTP (بفاصل زمني قابل للتهيئة) | +| `src/lib/services/installers/ninerouter.ts` | تثبيت 9Router وتحديثه وإلغاء تثبيته باستخدام npm | +| `src/lib/services/installers/cliproxy.ts` | تثبيت CLIProxyAPI وتحديثه وإلغاء تثبيته باستخدام npm | +| `src/lib/services/installers/mux.ts` | تثبيت Mux وتحديثه وإلغاء تثبيته باستخدام npm | +| `src/lib/services/installers/openwa.ts` | تثبيت open-wa وتحديثه وإلغاء تثبيته باستخدام npm | | `src/app/api/services/9router/_lib.ts` | الدالة المساعدة `getOrInitSupervisor()` | | `src/app/api/services/[name]/logs/route.ts` | نقطة نهاية مشتركة لسجلات SSE | | `open-sse/executors/ninerouter.ts` | منفّذ المزوّد (الطبقة 4) | @@ -208,15 +210,15 @@ ## 4. مرجع API -جميع المسارات ضمن `/api/services/` هي **LOCAL_ONLY** (عنوان الاسترجاع فقط، القاعدة الصارمة رقم 17). -تتلقى الطلبات الواردة من عناوين غير عنوان الاسترجاع الاستجابة `403 LOCAL_ONLY` بغض النظر عن رمز المصادقة. +جميع المسارات ضمن `/api/services/` هي **LOCAL_ONLY** (واجهة الاسترجاع فقط، القاعدة الصارمة رقم 17). +تتلقى الطلبات الواردة من خارج واجهة الاسترجاع `403 LOCAL_ONLY` بغض النظر عن رمز المصادقة. ### 4.1 نقاط نهاية 9Router (11 مسارًا) #### `POST /api/services/9router/install` -تثبيت 9Router من npm. ينشئ `DATA_DIR/services/9router/` متضمنًا -`package.json` و`node_modules/` خاصين به. لا يتعارض مع تبعيات OmniRoute الخاصة. +تثبيت 9Router من npm. ينشئ `DATA_DIR/services/9router/` مع ملف +`package.json` ومجلد `node_modules/` خاصين به. لا يتعارض مع تبعيات OmniRoute الخاصة. **نص الطلب** (جميع الحقول اختيارية): @@ -230,32 +232,32 @@ **الاستجابات:** -| الحالة | الوصف | -| ------ | ------------------------------------------------------ | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | نص طلب غير صالح (فشل تحقق Zod) | -| `409` | التثبيت جارٍ بالفعل (القفل محجوز) | -| `500` | فشل تثبيت npm — راجع `message` للاطلاع على خطأ واضح | +| الحالة | الوصف | +| ------ | ------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | نص طلب غير صالح (فشل تحقق Zod) | +| `409` | التثبيت جارٍ بالفعل (القفل محجوز) | +| `500` | فشل تثبيت npm — راجع `message` لمعرفة الخطأ بصيغة واضحة | -**ملاحظات:** يستخدم `execFile('npm', [...])` — دون صدفة أو استيفاء نصي (القاعدة الصارمة رقم 13). -تُعرض أخطاء EACCES على شكل رسائل واضحة. +**ملاحظات:** يستخدم `execFile('npm', [...])` — بلا shell وبلا استيفاء (القاعدة الصارمة رقم 13). +تُعرض أخطاء EACCES في صورة رسائل واضحة. --- #### `POST /api/services/9router/start` -تشغيل 9Router. يسجّل مشرفًا إذا لم يكن مسجلًا بالفعل، ثم يستدعي -`supervisor.start()`. تكون العملية متكافئة التكرار إذا كانت الخدمة قيد التشغيل بالفعل. +بدء تشغيل 9Router. يسجّل مشرفًا إذا لم يكن مسجلًا بالفعل، ثم يستدعي +`supervisor.start()`. العملية متكررة آمنة إذا كانت الخدمة قيد التشغيل بالفعل. **نص الطلب:** لا يوجد **الاستجابات:** -| الحالة | الوصف | -| ------ | ----------------------------------------------- | -| `200` | كائن `ServiceStatus` (راجع المخطط أدناه) | -| `409` | 9Router غير مثبّت (`status: "not_installed"`) | -| `503` | فشل التشغيل (خطأ في العملية — راجع `lastError`) | +| الحالة | الوصف | +| ------ | --------------------------------------------------- | +| `200` | كائن `ServiceStatus` (راجع المخطط أدناه) | +| `409` | 9Router غير مثبت (`status: "not_installed"`) | +| `503` | فشل بدء التشغيل (خطأ في العملية — راجع `lastError`) | **مخطط ServiceStatus:** @@ -275,34 +277,34 @@ #### `POST /api/services/9router/stop` -إيقاف 9Router بسلاسة. يرسل SIGTERM وينتظر 15 ث، ثم يرسل SIGKILL إذا ظلت العملية حية. -تكون العملية متكافئة التكرار إذا كانت الخدمة متوقفة بالفعل. +إيقاف 9Router بأمان. يرسل SIGTERM، وينتظر 15 ثانية، ثم يرسل SIGKILL إذا ظلت العملية قيد التشغيل. +العملية متكررة آمنة إذا كانت الخدمة متوقفة بالفعل. **نص الطلب:** لا يوجد **الاستجابات:** -| الحالة | الوصف | -| ------ | ----------------------------------- | -| `200` | `ServiceStatus` (الحالة: "stopped") | -| `503` | فشل الإيقاف بشكل غير متوقع | +| الحالة | الوصف | +| ------ | ------------------------------------- | +| `200` | `ServiceStatus` (الحالة: `"stopped"`) | +| `503` | فشل الإيقاف على نحو غير متوقع | --- #### `POST /api/services/9router/restart` -يكافئ `stop()` متبوعًا بـ `start()` ضمن قفل العمليات. +يكافئ تنفيذ `stop()` ثم `start()` ضمن قفل العملية. **نص الطلب:** لا يوجد -**الاستجابات:** مماثلة لـ `start` (تُرجع `ServiceStatus` النهائي). +**الاستجابات:** مماثلة لـ `start` (تعيد كائن `ServiceStatus` النهائي). --- #### `POST /api/services/9router/update` يحدّث 9Router إلى إصدار npm أحدث. إذا كانت الخدمة قيد التشغيل، فتُوقَف -أولًا، ثم يُشغَّل تثبيت npm (لتثبيت الإصدار الأحدث في موضعه)، وبعد ذلك +أولًا، ثم يُشغَّل تثبيت npm (لتثبيت الإصدار الأحدث في الموضع نفسه)، وبعد ذلك تُعاد عملية تشغيل الخدمة. **نص الطلب** (جميع الحقول اختيارية): @@ -316,14 +318,14 @@ | الحالة | الوصف | | ------ | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | نص طلب غير صالح | +| `400` | نص غير صالح | | `500` | فشل تحديث npm | --- #### `POST /api/services/9router/rotate-key` -يُنشئ مفتاح API جديدًا لـ 9Router، ويُشفّره أثناء التخزين، ثم يعيد تشغيل الخدمة +ينشئ مفتاح API جديدًا لـ 9Router، ويشفّره عند التخزين، ويعيد تشغيل الخدمة (إذا كانت قيد التشغيل) لكي تستخدم المفتاح الجديد من بيئتها. يُلغى المفتاح القديم فورًا. @@ -336,14 +338,14 @@ | `200` | `{ keyRotated: true, restarted: boolean }` | | `500` | فشل تدوير المفتاح | -**الأمان:** لا يُعاد المفتاح الجديد مطلقًا في الاستجابة (لمنع تسرّب بيانات الاعتماد). -ويُخزَّن مشفّرًا (AES-256-GCM) في جدول `version_manager`. +**الأمان:** لا يُعاد المفتاح الجديد مطلقًا في الاستجابة (لمنع تسريب بيانات الاعتماد). +ويُخزَّن مشفرًا (AES-256-GCM) في جدول `version_manager`. --- #### `GET /api/services/9router/status` -يعيد حالة مجمّعة من الحالة المباشرة وقاعدة البيانات، بما في ذلك بيانات الإصدار الوصفية ومعاينة مفتاح API. +يعيد الحالة المجمعة المباشرة ومن قاعدة البيانات، بما يشمل بيانات تعريف الإصدار ومعاينة مفتاح API. **الاستجابات:** @@ -376,8 +378,8 @@ #### `POST /api/services/9router/auto-start` -يبدّل علامة التشغيل التلقائي. عندما تكون `enabled: true`، تبدأ الخدمة تلقائيًا -في المرة التالية التي يبدأ فيها OmniRoute (إذا كانت الخدمة مثبّتة). +تبديل علامة البدء التلقائي. عندما تكون `enabled: true`، تبدأ الخدمة تلقائيًا +في المرة التالية التي يبدأ فيها OmniRoute (إذا كانت الخدمة مثبتة). **نص الطلب:** @@ -390,7 +392,7 @@ | الحالة | الوصف | | ------ | --------------------- | | `200` | `{ autoStart: true }` | -| `400` | نص طلب غير صالح | +| `400` | نص غير صالح | --- @@ -400,16 +402,16 @@ **معاملات الاستعلام:** -| المعامل | النوع | القيمة الافتراضية | الوصف | -| -------- | --------- | ----------------- | -------------------------------------------------------------------- | -| `tail` | `integer` | 200 | عدد الأسطر السابقة المراد إرسالها أولًا (الحد الأقصى 1000) | -| `filter` | `string` | لا يوجد | مرشح سلسلة فرعية غير حساس لحالة الأحرف (من دون regex — آمن من ReDoS) | +| المعامل | النوع | القيمة الافتراضية | الوصف | +| -------- | --------- | ----------------- | ----------------------------------------------------------------- | +| `tail` | `integer` | 200 | عدد أسطر السجل السابقة التي تُرسل أولًا (الحد الأقصى 1000) | +| `filter` | `string` | لا شيء | مرشح سلسلة فرعية غير حساس لحالة الأحرف (بلا regex — آمن من ReDoS) | **أحداث SSE:** | الحدث | البيانات | الوصف | | ----------- | ----------- | ------------------------------- | -| `snapshot` | `LogLine[]` | الجزء التاريخي الأولي | +| `snapshot` | `LogLine[]` | الجزء السابق الأولي من السجل | | `log` | `LogLine` | سطر سجل مباشر | | `heartbeat` | `{}` | إبقاء الاتصال نشطًا كل 15 ثانية | @@ -425,25 +427,25 @@ **الاستجابات:** -| الحالة | الوصف | -| ------ | -------------------------------------- | -| `200` | `text/event-stream` | -| `400` | المعامل `filter` طويل جدًا (> 200 حرف) | -| `404` | لم يُعثر على الخدمة (المشرف غير مسجّل) | +| الحالة | الوصف | +| ------ | ------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | المعامل `filter` طويل جدًا (> 200 حرف) | +| `404` | لم يتم العثور على الخدمة (المشرف غير مسجّل) | --- ### 4.2 نقاط نهاية CLIProxyAPI (10 مسارات) -تملك CLIProxyAPI بنية نقاط النهاية نفسها الخاصة بـ 9Router باستثناء `rotate-key`، مع إضافة -`accounts` و`provider-expose` و`auto-restart-adopted`. وتتلقى الآن مفتاح API مخصصًا -لمستوى البيانات، يُحقن عند إنشاء العملية (`needsApiKey: true` في -`bootstrap.ts`، ويُستخدم لمزامنة النماذج)؛ وتتضمن `status` حقولًا أقل. +يمتلك CLIProxyAPI بنية نقاط النهاية نفسها الخاصة بـ 9Router باستثناء `rotate-key`، بالإضافة إلى +`accounts` و`provider-expose` و`auto-restart-adopted`. ويتلقى الآن +مفتاح API مخصصًا لمستوى البيانات يُحقن عند التشغيل (`needsApiKey: true` في +`bootstrap.ts`، ويُستخدم لمزامنة النماذج)؛ ويتضمن `status` حقولًا أقل. | الطريقة | المسار | الوصف | | ------- | ----------------------------------- | ------------------------------------------------------------- | | `POST` | `/api/services/cliproxy/install` | تثبيت CLIProxyAPI من npm | -| `POST` | `/api/services/cliproxy/start` | بدء CLIProxyAPI | +| `POST` | `/api/services/cliproxy/start` | بدء تشغيل CLIProxyAPI | | `POST` | `/api/services/cliproxy/stop` | إيقاف CLIProxyAPI | | `POST` | `/api/services/cliproxy/restart` | إعادة تشغيل CLIProxyAPI | | `POST` | `/api/services/cliproxy/update` | التحديث إلى إصدار أحدث | @@ -457,16 +459,16 @@ ### 4.3 نقاط نهاية Mux (8 مسارات) -تملك Mux بنية نقاط النهاية نفسها الخاصة بـ CLIProxyAPI — لا يوجد مسار `rotate-key` ضمن واجهة -API (يُنشأ رمز الحامل بالطريقة نفسها المتبعة مع 9Router عبر +يمتلك Mux بنية نقاط النهاية نفسها الخاصة بـ CLIProxyAPI — لا يوجد مسار `rotate-key` ضمن واجهة +API (يُنشأ رمز الحامل بالطريقة نفسها المتبعة في 9Router عبر `getOrCreateApiKey("mux")` ويُحقن من خلال متغير البيئة `MUX_SERVER_AUTH_TOKEN`، ولكن -لا توجد حتى الآن نقطة نهاية مخصصة لتدويره). لا تُدار Mux إلا من ناحية دورة الحياة: وعلى خلاف -9Router، لا تملك منفّذًا للطبقة 4 ولا تُسجّل مطلقًا كموفّر توجيه. +لا توجد حتى الآن نقطة نهاية مخصصة للتدوير). تتم إدارة دورة حياة Mux فقط: فعلى خلاف +9Router، لا يمتلك منفّذًا للطبقة 4 ولا يُسجّل أبدًا كمزوّد توجيه. | الطريقة | المسار | الوصف | | ------- | ------------------------------ | ------------------------------------- | | `POST` | `/api/services/mux/install` | تثبيت Mux من npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | بدء Mux (`mux server`) | +| `POST` | `/api/services/mux/start` | بدء تشغيل Mux (`mux server`) | | `POST` | `/api/services/mux/stop` | إيقاف Mux | | `POST` | `/api/services/mux/restart` | إعادة تشغيل Mux | | `POST` | `/api/services/mux/update` | التحديث إلى إصدار npm أحدث | @@ -477,57 +479,91 @@ API (يُنشأ رمز الحامل بالطريقة نفسها المتبعة ### 4.4 نقاط نهاية Bifrost (8 مسارات) -Bifrost هي خلفية ترحيل لبوابة ذكاء اصطناعي مكتوبة بلغة Go (`@maximhq/bifrost`). وتستخدم بنية -نقاط النهاية نفسها الخاصة بـ CLIProxyAPI (من دون `rotate-key` — تدير Bifrost مفاتيح موفّريها -بنفسها في `config.json` ضمن `-app-dir`). - -| الطريقة | المسار | الوصف | -| ------- | ---------------------------------- | ------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | تثبيت Bifrost من npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | تشغيل Bifrost على المنفذ 8080 (افتراضيًا) | -| `POST` | `/api/services/bifrost/stop` | إيقاف Bifrost | -| `POST` | `/api/services/bifrost/restart` | إعادة تشغيل Bifrost | -| `POST` | `/api/services/bifrost/update` | التحديث إلى إصدار أحدث | -| `GET` | `/api/services/bifrost/status` | الحالة المباشرة + حالة قاعدة البيانات | -| `POST` | `/api/services/bifrost/auto-start` | تبديل التشغيل التلقائي | -| `GET` | `/api/services/bifrost/logs` | ذيل السجل عبر SSE (من خلال المسار الديناميكي المشترك `[name]/logs`) | - -**إعداد التوجيه:** عندما لا يكون `BIFROST_BASE_URL` معيّنًا وكانت نسخة Bifrost +Bifrost هو نظام خلفي لترحيل بوابة ذكاء اصطناعي مكتوب بلغة Go (`@maximhq/bifrost`). ويستخدم بنية +نقاط النهاية نفسها الخاصة بـ CLIProxyAPI (من دون `rotate-key` — يدير Bifrost مفاتيح المزوّدين +الخاصة به في `config.json` ضمن `-app-dir`). + +| الطريقة | المسار | الوصف | +| ------- | ---------------------------------- | --------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | تثبيت Bifrost من npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | بدء تشغيل Bifrost على المنفذ 8080 (افتراضيًا) | +| `POST` | `/api/services/bifrost/stop` | إيقاف Bifrost | +| `POST` | `/api/services/bifrost/restart` | إعادة تشغيل Bifrost | +| `POST` | `/api/services/bifrost/update` | التحديث إلى إصدار أحدث | +| `GET` | `/api/services/bifrost/status` | الحالة المباشرة + حالة قاعدة البيانات | +| `POST` | `/api/services/bifrost/auto-start` | تبديل التشغيل التلقائي | +| `GET` | `/api/services/bifrost/logs` | ذيل سجل SSE (عبر المسار الديناميكي المشترك `[name]/logs`) | + +**ربط التوجيه:** عندما لا يكون `BIFROST_BASE_URL` معيّنًا وتكون نسخة Bifrost الخاضعة للإشراف قيد التشغيل، تستخدم `getBifrostRoutingConfig()` (في `routingBackend.ts`) تلقائيًا -`http://127.0.0.1:{port}` بوصفه عنوان URL الأساسي للترحيل. ويكون لمتغير البيئة `BIFROST_BASE_URL` الصريح -الأولوية دائمًا. +`http://127.0.0.1:{port}` بوصفه عنوان URL الأساسي للترحيل. تكون الأولوية دائمًا لمتغير البيئة +`BIFROST_BASE_URL` الصريح. --- ### 4.5 نقاط نهاية Dario (12 مسارًا) -تتبع دورة الحياة البنية نفسها للخدمات الأخرى (`install` و`start` و`stop` و`restart` +بنية دورة الحياة نفسها الخاصة بالخدمات الأخرى (`install` و`start` و`stop` و`restart` و`update` و`status` و`auto-start` و`auto-restart-adopted`)، بالإضافة إلى مستوى تحكم OAuth -محمي برمز مميز ضمن `admin/`: ‏`admin/accounts` و`admin/import-from-omniroute` +محمي برمز ضمن `admin/`: ‏`admin/accounts` و`admin/import-from-omniroute` و`admin/login-start` و`admin/login-complete` (جميعها محمية بواسطة `DARIO_ADMIN_TOKEN`). -### 4.6 الوكيل العكسي (تضمين لوحة معلومات 9Router) +### 4.6 نقاط نهاية open-wa (7 مسارات) -تُضمّن لوحة المعلومات واجهة ويب 9Router داخل إطار iframe عبر وكيل عكسي داخلي +يشغّل open-wa (`@open-wa/wa-automate`) نسخة Chromium بلا واجهة رسومية (عبر +Puppeteer) لأتمتة WhatsApp Web. ويستخدم بنية نقاط النهاية نفسها الخاصة بـ Mux (لا يوجد +مسار `rotate-key` حتى الآن). تتم إدارة دورة حياته فقط — فهو ليس هدفًا للتوجيه، +ولا يملك منفّذًا للطبقة 4 أو إدخال مزوّد. + +| الطريقة | المسار | الوصف | +| ------- | --------------------------------- | --------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | تثبيت open-wa من npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | تشغيل open-wa على المنفذ 8323 (افتراضيًا) | +| `POST` | `/api/services/openwa/stop` | إيقاف open-wa | +| `POST` | `/api/services/openwa/restart` | إعادة تشغيل open-wa | +| `POST` | `/api/services/openwa/update` | التحديث إلى إصدار أحدث | +| `GET` | `/api/services/openwa/status` | الحالة المباشرة + حالة قاعدة البيانات | +| `POST` | `/api/services/openwa/auto-start` | تبديل التشغيل التلقائي | +| `GET` | `/api/services/openwa/logs` | ذيل سجل SSE (عبر المسار الديناميكي المشترك `[name]/logs`) | + +**مفتاح API:** يُحقن باسم `WA_KEY` — ويحوّله تجاوز متغيرات البيئة العام في open-wa، الذي يستخدم البادئة `WA_*`، إلى خيار CLI‏ `--key`/`-k` +(`dist/cli/setup.js::envArgs()`، جرى التحقق منه مقابل الحزمة المثبتة بالإصدار 4.76.0). +تُضاف إليه البادئة `ow_` عند إنشائه بواسطة `generateServiceApiKey()`. يقرأ open-wa +المفتاح مجددًا من ترويسة HTTP باسم `key`/`api_key` (وليس `Authorization: +Bearer`)؛ ويُعفى `/api-docs*` صراحةً من عملية التحقق +(`setupAuthenticationLayer` في `dist/cli/server.js`)، لذلك لا يحتاج فحص السلامة +إلى ترويسة مصادقة. + +**الاقتران:** open-wa غير رسمي وغير تابع لـ WhatsApp — والرقم +المتصل معرض لخطر الحظر بسبب آليات اكتشاف الأتمتة الخاصة بـ WhatsApp. +عند التشغيل لأول مرة، تُطبع شفرة QR الخاصة بالاقتران إلى stdout وتُعرض عبر +لوحة السجلات/تدفق SSE الموجود — ولا توجد بعد نقطة نهاية مخصصة لصورة QR +في هذا التكامل. + +--- + +### 4.7 الوكيل العكسي (تضمين لوحة معلومات 9Router) + +تُضمّن لوحة المعلومات واجهة ويب 9Router داخل iframe عبر وكيل عكسي داخلي على: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] ``` -هذا الوكيل: +يقوم هذا الوكيل بما يلي: -- يعيد توجيه الطلب إلى `http://127.0.0.1:{port}/{path}` (الاسترجاع الحلقي فقط) -- يزيل ترويستي `cookie` و`authorization` الواردتين (لمنع تسرّب جلسة OmniRoute) -- يضيف `Authorization: Bearer {apiKey}` لمصادقة 9Router +- يعيد توجيه الطلب إلى `http://127.0.0.1:{port}/{path}` (عبر الاسترجاع الحلقي فقط) +- يزيل ترويستي `cookie` و`authorization` الواردتين (لمنع تسرب جلسة OmniRoute) +- يحقن `Authorization: Bearer {apiKey}` لمصادقة 9Router - يزيل `set-cookie` و`content-security-policy` و`x-frame-options` و`cross-origin-*` من الاستجابة -- يعيد كتابة استجابات HTML لإضافة `` وتوحيد المسارات المطلقة (`/foo` ← `/dashboard/.../embed/foo`) +- يعيد كتابة استجابات HTML لحقن `` وتوحيد المسارات المطلقة (`/foo` → `/dashboard/.../embed/foo`) -تتم معالجة ترقيات WebSocket الخاصة بلوحة المعلومات المضمّنة بواسطة خادم مرافق على -منفذ مخصص (راجع `src/lib/services/embedWsProxy.ts`). +تتولى خادومة مصاحبة على منفذ مخصص معالجة ترقيات WebSocket الخاصة بلوحة المعلومات +المضمّنة (راجع `src/lib/services/embedWsProxy.ts`). **الأمان:** تُصنّف مسارات وكيل التضمين ضمن `LOCAL_ONLY_API_PREFIXES` -ولا يمكن الوصول إليها إلا من خلال واجهة الاسترجاع الحلقي. ولا يستطيع المهاجم الذي يحصل على JWT عبر +ولا يمكن الوصول إليها إلا من خلال الاسترجاع الحلقي. ولا يمكن لمهاجم يحصل على JWT عبر نفق Cloudflare/Ngrok استخدام الوكيل للوصول إلى الخدمات المضمّنة. --- diff --git a/docs/i18n/ar/docs/frameworks/MEMORY.md b/docs/i18n/ar/docs/frameworks/MEMORY.md index 5eb12ea8e7ca..77c15b917507 100644 --- a/docs/i18n/ar/docs/frameworks/MEMORY.md +++ b/docs/i18n/ar/docs/frameworks/MEMORY.md @@ -156,34 +156,36 @@ Cormack وآخرين الأصلية، وتعمل جيدًا مع المجموع ## امتداد الإعدادات -تتوفر تسعة حقول للتضمينات والمتجهات في `MemorySettingsExtended` ضمن +تتوفر تسعة حقول للتضمين والمتجهات في `MemorySettingsExtended` ضمن `src/shared/schemas/memory.ts`، ويتم حفظها عبر `src/lib/db/settings.ts`: -| الحقل | النوع | القيمة الافتراضية | الوصف | -| ------------------------ | -------------------------------------------------- | ----------------- | ------------------------------------------------------------------ | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | مصدر التضمينات الذي سيُستخدم | -| `embeddingProviderModel` | `string \| null` | `null` | المزوّد/النموذج بتنسيق `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | عنوان URL الأساسي لنقطة نهاية متوافقة مع OpenAI ومخصصة للذاكرة فقط | -| `customModelId` | `string \| null` | `null` | معرّف النموذج المُرسل إلى نقطة النهاية المخصصة | -| `transformersEnabled` | `boolean` | `false` | اشتراك اختياري في Transformers.js ‏(MiniLM، بحجم ~400MB) | -| `staticEnabled` | `boolean` | `false` | اشتراك اختياري في نموذج potion-base-8M المحلي الثابت | -| `rerankEnabled` | `boolean` | `false` | تفعيل خطوة إعادة الترتيب (تضيف +200-500ms/req) | -| `rerankProviderModel` | `string \| null` | `null` | مزوّد/نموذج إعادة الترتيب بتنسيق `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | الواجهة الخلفية المتجهية التي ستُستخدم | +| الحقل | النوع | القيمة الافتراضية | الوصف | +| ------------------------ | -------------------------------------------------- | ----------------- | ------------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | مصدر التضمين الذي سيُستخدم | +| `embeddingProviderModel` | `string \| null` | `null` | المزوّد/النموذج بتنسيق `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | عنوان URL الأساسي لنقطة نهاية متوافقة مع OpenAI ومخصّصة للذاكرة فقط | +| `customModelId` | `string \| null` | `null` | معرّف النموذج المُرسل إلى نقطة النهاية المخصّصة | +| `transformersEnabled` | `boolean` | `false` | الاشتراك الاختياري في Transformers.js ‏(MiniLM، بحجم ~400MB) | +| `staticEnabled` | `boolean` | `false` | الاشتراك الاختياري في نموذج potion-base-8M المحلي الثابت | +| `rerankEnabled` | `boolean` | `false` | تمكين خطوة إعادة الترتيب (تضيف +200-500ms/req) | +| `rerankProviderModel` | `string \| null` | `null` | مزوّد/نموذج إعادة الترتيب بتنسيق `provider/model` | -تُتاح هذه الحقول عبر `GET /PUT /api/settings/memory` (المخطط `MemorySettingsExtendedSchema`). +يتم تحليل `rerankProviderModel` بواسطة `POST /v1/rerank` (ويُستدعى عبر واجهة الاسترجاع المحلية)، لذا فهو يقبل أي قيمة يقبلها ذلك المسار: نموذج إعادة ترتيب سحابي منسّق (`cohere/rerank-v3.5`، `jina-ai/jina-reranker-v3.5`، …) أو عقدة مزوّد متوافقة مع OpenAI بالصيغة `/` (مثل `skilled-mini/bge-reranker-v2-m3` لصندوق TEI/Infinity). تكون عقد الاسترجاع المحلية مؤهلة دائمًا؛ أما العقدة الموجودة على مضيف آخر (LAN، Tailscale) فتتطلب أيضًا علامة الميزة `RERANK_REMOTE_PROVIDER_NODES` ويجب أن تجتاز سياسة عناوين URL الصادرة الخاصة بالمزوّد — راجع [علامات الميزات](../reference/FEATURE_FLAGS.md). تعرض أداة الاختيار في لوحة المعلومات المزوّدين المنسّقين بالإضافة إلى العقد المحلية؛ ويمكن تعيين أي سلسلة `provider/model` صالحة مباشرةً عبر `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | مخزن المتجهات الخلفي الذي سيُستخدم | + +تُعرض هذه الإعدادات عبر `GET /PUT /api/settings/memory` (المخطط `MemorySettingsExtendedSchema`). بالنسبة إلى المصدر `remote`، تقبل الذاكرة أيضًا الإعدادين الاختياريين `customBaseUrl` و `customModelId`. ويحددان معًا نقطة نهاية `/embeddings` متوافقة مع OpenAI -والنموذج، من دون تغيير سجل التضمينات العام. تتم تسوية نقطة النهاية -قبل الاستخدام والتحقق منها وفق سياسة عناوين URL الصادرة الخاصة بالمزوّد: يُشترط استخدام HTTP(S)، -وتُرفض بيانات الاعتماد المضمّنة وسلاسل الاستعلام، وتظل عناوين -بيانات تعريف السحابة محظورة. تحافظ القيم الفارغة على مزوّد السجل المحدد. تُنقّى الأخطاء -المُعادة إلى لوحة المعلومات، ولا تُسجّل بيانات اعتماد نقطة النهاية مطلقًا. - -> **مهمة لاحقة (D20):** النطاق `global` (مشاركة الذكريات عبر جميع مفاتيح API) غير -> منفّذ في هذا الإصدار. وهو يتطلب تغييرات في المخطط ومسار استرجاع -> عامًا. يجب تتبّعه بشكل منفصل. +والنموذج، من دون تغيير سجل التضمين العام. تتم تسوية نقطة النهاية +قبل استخدامها وفحصها وفقًا لسياسة عناوين URL الصادرة الخاصة بالمزوّد: يلزم استخدام HTTP(S)، +وتُرفض بيانات الاعتماد المضمّنة وسلاسل الاستعلام، كما تظل عناوين +بيانات تعريف السحابة محظورة. تحافظ القيم الفارغة على مزوّد السجل المحدد. تُنقَّح الأخطاء +المُعادة إلى لوحة المعلومات، ولا تُسجَّل بيانات اعتماد نقطة النهاية مطلقًا. + +> **مهمة مطلوبة (D20):** النطاق `global` (مشاركة الذكريات عبر جميع مفاتيح API) غير +> مطبّق في هذا الإصدار. فهو يتطلب تغييرات في المخطط ومسار استرجاع +> عامًا. يجب تتبعه بشكل منفصل. ## طبقات التخزين diff --git a/docs/i18n/ar/docs/guides/DOCKER_GUIDE.md b/docs/i18n/ar/docs/guides/DOCKER_GUIDE.md index 41771ce3d34a..44ead1447f5e 100644 --- a/docs/i18n/ar/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/ar/docs/guides/DOCKER_GUIDE.md @@ -25,7 +25,13 @@ --- -## التشغيل السريع +## تشغيل سريع + +> **هل تريد الاستضافة الذاتية بأمر واحد؟** راجع +> [دليل الاستضافة الذاتية](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (صورة منشورة + +> Redis، متاح عبر واجهة الاسترجاع فقط، من دون اختيار ملف تعريف). التشغيل السريع أدناه هو +> مسار الحاوية الواحدة للمستخدمين الذين يشغّلون Redis بالفعل في مكان آخر. ```bash docker run -d \ diff --git a/docs/i18n/ar/docs/guides/TROUBLESHOOTING.md b/docs/i18n/ar/docs/guides/TROUBLESHOOTING.md index d19cb08f7dc2..ab51026b44f9 100644 --- a/docs/i18n/ar/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/ar/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # انتظار محدود أطول ## تحذيرات npm install ‏(ERESOLVE / peer / deprecated) -عند تشغيل `npm install -g omniroute`، قد ترى عددًا كبيرًا من التحذيرات مثل `npm warn ERESOLVE`، وإشعارات تبعيات النظراء، ورسائل `deprecated`. **هذه التحذيرات متوقعة وغير ضارة.** يكون التثبيت قد نجح إذا رأيت `added packages` في المخرجات. +عند تشغيل `npm install -g omniroute`، قد ترى عددًا كبيرًا من التحذيرات مثل `npm warn ERESOLVE`، وإشعارات تبعيات النظير، ورسائل `deprecated`. **هذه التحذيرات متوقعة وغير ضارة.** يكون التثبيت قد نجح إذا رأيت `added packages` في المخرجات. -تأتي التحذيرات من نطاقات قديمة لتبعيات النظراء في حزم خارجية لا تتحكم فيها OmniRoute: +لكتم تحذيرات حلّ تبعيات النظير، استخدم صيغة التثبيت المدعومة من OmniRoute: -1. **تتطلب `marked-terminal` الإصدار `marked >=1 <16`، بينما عُثر على `marked@18`** — تعمل بصورة جيدة عمليًا؛ فنطاق النظير في المشروع الأصلي قديم فحسب. -2. **`deprecated prebuild-install@7.1.3`** — أداة مساعدة انتقالية لجلب الملفات الثنائية الأصلية. ولا تُستخدم - لتثبيت ربط النقل المثبّت الإصدار `wreq-js`، كما أنها لا تشير إلى فشل إعداد نقل - موفّر ملفات تعريف الارتباط للويب. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +يكتم `--legacy-peer-deps` إشعارات `ERESOLVE` وتبعيات النظير فقط. وتظل إشعارات الإهمال ظاهرة لأنها تأتي من حزم خارجية انتقالية؛ ولا تعني فشل التثبيت. + +تأتي التحذيرات من نطاقات قديمة لتبعيات النظير في حزم خارجية لا يتحكم فيها OmniRoute: + +1. **يريد `marked-terminal` الإصدار `marked >=1 <16`، ولكن عُثر على `marked@18`** — يعمل جيدًا عمليًا؛ فنطاق النظير في المصدر الرئيسي قديم فحسب. +2. **`deprecated prebuild-install@7.1.3`** — أداة انتقالية مساعدة لجلب الملفات الثنائية الأصلية. ولا تُستخدم + لتثبيت رابط النقل المثبّت الإصدار `wreq-js`، ولا تشير إلى فشل إعداد نقل + موفّر ملفات تعريف ارتباط الويب. -**لا يلزم اتخاذ أي إجراء** — لا يمكن إسكات التحذيرات بالكامل دون إنشاء نسخ متفرعة من الحزم الأصلية. +**لا يلزم اتخاذ أي إجراء** — لا يمكن كتم التحذيرات بالكامل دون إنشاء نسخ متفرعة من الحزم الأصلية. --- diff --git a/docs/i18n/ar/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/ar/docs/providers/CURSOR-API-KEY-AND-CLI.md index 9a1c7106032b..adef5b90aed0 100644 --- a/docs/i18n/ar/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/ar/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,40 +4,40 @@ --- -طريقتان لوضع Cursor خلف OmniRoute من دون جلسة IDE: +طريقتان لوضع Cursor خلف OmniRoute دون جلسة IDE: -1. **موفّر `cursor-api`** (البطاقة "Cursor API"، والاسم المستعار `cua`): موفّر يعتمد على مفتاح API - ويحتفظ بمفتاح API لمستخدم Cursor‏ (`crsr_…`، يُنشأ من - `https://cursor.com/dashboard/api`). يمكن بعد ذلك لأي عميل OmniRoute الوصول إلى - نماذج Cursor عبر `/v1/chat/completions` بصيغة `cursor-api/` أو +1. موفّر **`cursor-api`** (البطاقة "Cursor API"، والاسم المستعار `cua`): موفّر + يعتمد على مفتاح API ويحتفظ بمفتاح API لمستخدم Cursor (`crsr_…`، يتم إنشاؤه من + `https://cursor.com/dashboard/api`). يمكن لأي عميل OmniRoute بعد ذلك الوصول + إلى نماذج Cursor عبر `/v1/chat/completions` بصيغة `cursor-api/` أو `cua/`، مع طبقات الحصة والرجوع الاحتياطي والتسجيل المعتادة. يظل موفّر IDE - (`cursor`، جلسة OAuth/IDE) من دون تغيير. -2. **التمرير المباشر لـ Cursor CLI**: وجّه Cursor CLI‏ (`agent`) إلى OmniRoute بحيث - تتم مصادقة كل RPC يجريه CLI باستخدام مفتاح API خاص بـ OmniRoute، ثم يُمرَّر - إلى Cursor باستخدام بيانات اعتماد اتصال `cursor-api`، ويُسجَّل في - صفحة السجلات. - -## لماذا يتم تبديل المفتاح - -يرفض `api2.cursor.sh` مفتاح `crsr_…` خامًا باعتباره رمز Bearer‏ (401). يرسل Cursor -CLI المفتاح أولًا عبر POST إلى `/auth/exchange_user_api_key` ويتلقى JWT للجلسة -تنتهي صلاحيته بعد ساعة واحدة؛ ويحمل `refreshToken` المُعاد قيمة `exp` -نفسها، لذا يعني التحديث إعادة تبديل المفتاح. -ينفّذ `open-sse/services/cursorApiKeyAuth.ts` عملية التبديل هذه، ويخزّن مؤقتًا رمز -جلسة واحدًا لكل مفتاح، ويعيد التبديل قبل انتهاء الصلاحية بخمس دقائق، ويحذف الرمز -المخزّن مؤقتًا عندما يستجيب Cursor بالحالة 401. يستدعيه `CursorExecutor` مباشرةً قبل فتح -تدفق المنبع لاتصالات `cursor-api`. + (`cursor`، جلسة OAuth/IDE) دون تغيير. +2. **التمرير المباشر لـ Cursor CLI**: وجّه Cursor CLI (`agent`) إلى OmniRoute بحيث + تتم مصادقة كل RPC يجريه CLI باستخدام مفتاح API لـ OmniRoute، ثم يُعاد توجيهه + إلى Cursor باستخدام بيانات اعتماد اتصال `cursor-api`، ويُسجّل في صفحة + السجلات. + +## سبب استبدال المفتاح + +يرفض `api2.cursor.sh` مفتاح `crsr_…` خامًا بوصفه رمز Bearer مميزًا (401). يرسل Cursor +CLI المفتاح أولًا عبر POST إلى `/auth/exchange_user_api_key` ويتلقى JWT لجلسة +تنتهي صلاحيته بعد ساعة واحدة؛ ويحمل `refreshToken` المُعاد قيمة `exp` نفسها، +لذلك يعني التحديث إعادة استبدال المفتاح. +يتولى `open-sse/services/cursorApiKeyAuth.ts` عملية الاستبدال، ويخزّن مؤقتًا رمز +جلسة واحدًا لكل مفتاح، ويعيد الاستبدال قبل انتهاء الصلاحية بخمس دقائق، ويحذف +الرمز المخزّن مؤقتًا عندما يرد Cursor بالحالة 401. يستدعيه `CursorExecutor` +مباشرةً قبل فتح التدفق الصاعد لاتصالات `cursor-api`. ## موفّر `cursor-api` السجل: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`، و`authType: "apikey"`، ونفس `format` و`baseUrl` -و`models` الخاصة بـ `cursor`). بطاقة الكتالوج: +(`cursor_apiProvider`، و`authType: "apikey"`، وبقيم `format` و`baseUrl` و +`models` نفسها الخاصة بـ `cursor`). بطاقة الكتالوج: `src/shared/constants/providers/apikey/specialty-media.ts`. خريطة المنفّذات: -`open-sse/executors/index.ts`‏ (`"cursor-api"` / `cua` ← +`open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -لوحة التحكم: الموفّرون → Cursor API → إضافة مفتاح API. +لوحة المعلومات: الموفّرون → Cursor API → إضافة مفتاح API. REST: @@ -58,31 +58,44 @@ curl -sS http://localhost:20128/v1/chat/completions \ ملاحظات: -- تأتي قائمة النماذج لـ `cursor-api` من سجل Cursor الثابت (وهي - القائمة نفسها التي يرجع إليها موفّر IDE احتياطيًا)؛ ولا يلزم تثبيت `cursor-agent` - على مضيف OmniRoute. -- إن `POST /api/providers/{id}/refresh-cursor` مخصص لموفّر `cursor` الخاص بـ IDE +- تأتي قائمة النماذج الخاصة بـ `cursor-api` من سجل Cursor الثابت (وهي + القائمة نفسها التي يرجع إليها موفّر IDE احتياطيًا)؛ ولا يلزم تثبيت + `cursor-agent` على مضيف OmniRoute. +- المسار `POST /api/providers/{id}/refresh-cursor` مخصص لموفّر `cursor` الخاص بـ IDE فقط؛ إذ لا تحتوي اتصالات `cursor-api` على جلسة IDE لتجديدها. -## التمرير المباشر لـ Cursor CLI +## معرّفات النماذج الأصلية ومستوى الجهد + +بالنسبة إلى `cursor` / `cu` و`cursor-api` / `cua`، يترك موحّد جهد Claude المشترك +معرّف النموذج المطلوب دون تغيير. يمكن لـ Cursor الإعلان عن لاحقة مثل +`-low` بوصفها جزءًا من معرّف نموذج فعلي، بدلًا من كونها اسمًا مستعارًا للجهد في OmniRoute. +يحافظ منفّذ Cursor على التطابق التام مع الكتالوج المباشر؛ وعند عدم وجود +تطابق، يتولى محلّل النماذج الحالي لديه الرجوع من اللاحقة إلى المَعلمة. + +لا يغيّر هذا تسوية الجهد لمسارات Claude المباشرة، أو المسارات المتوافقة مع +Claude، أو مسارات Vertex. ويظل التوفر معتمدًا على كتالوج حساب Cursor المحدد +واستحقاقاته. + +## تمرير Cursor CLI المسار: `src/app/api/cursor-cli/[...path]/route.ts` ← -`open-sse/handlers/cursorCliProxy.ts`. تُسجَّل البادئة `/api/cursor-cli/` في -`src/shared/constants/publicApiRoutes.ts` لأن المعالج +`open-sse/handlers/cursorCliProxy.ts`. البادئة `/api/cursor-cli/` +مسجّلة في `src/shared/constants/publicApiRoutes.ts` لأن المعالج يفرض المصادقة الخاصة به: -| المسار | المصادقة المتوقعة من CLI | ما يفعله OmniRoute | -| ----------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | يتحقق من المفتاح، ويُصدر JWT بصيغة HS256 لمدة ساعة واحدة (موقّعًا باستخدام `JWT_SECRET`) ويعيده | -| كل مسار آخر (`/aiserver.v1.*`، `/agent.v1.AgentService/RunSSE`، `/aiserver.v1.BidiService/BidiAppend`، `/v1/traces`، …) | `Bearer ` | يتحقق من جهة الإصدار والجمهور وانتهاء الصلاحية، ويختار اتصال `cursor-api` نشطًا، ويستبدل ترويسة Authorization برمز Cursor المُبدَّل، ثم يعيد بث الرد | +| المسار | المصادقة المتوقعة من CLI | ما يفعله OmniRoute | +| -------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | يتحقق من المفتاح، ويُصدر JWT صالحًا لمدة ساعة باستخدام HS256 (وموقّعًا بواسطة `JWT_SECRET`)، ثم يعيده | +| كل مسار آخر (`/aiserver.v1.*`، و`/agent.v1.AgentService/RunSSE`، و`/aiserver.v1.BidiService/BidiAppend`، و`/v1/traces`، …) | `Bearer ` | يتحقق من المُصدِر والجمهور وتاريخ انتهاء الصلاحية، ويختار اتصال `cursor-api` نشطًا، ويستبدل ترويسة Authorization برمز Cursor المستبدل، ثم يعيد بث الاستجابة إلى العميل | -يفك CLI ترميز `exp` من أي رمز يتلقاه، لذا فإن تزويده برمز -مبهم يجعله يعيد التبديل قبل كل طلب تقريبًا؛ ويتجنب JWT المُصدَر -ذلك. تؤدي استجابة 401 من OmniRoute إلى إعادة CLI لعملية التبديل. +يفك CLI ترميز `exp` من أي رمز يتلقاه، لذا فإن تزويده برمز مبهم +يجعله يعيد الاستبدال قبل كل طلب تقريبًا؛ ويتجنب JWT المُصدر +ذلك. تؤدي استجابة 401 من OmniRoute إلى إعادة CLI لعملية الاستبدال. ### الإعداد -1. أنشئ مفتاح API لـ OmniRoute (لوحة التحكم → مفاتيح API) واتصالًا من نوع `cursor-api`. +1. أنشئ مفتاح OmniRoute API (لوحة التحكم ← مفاتيح API) واتصال + `cursor-api`. 2. وجّه CLI إلى استخدام HTTP/1.1 لتدفق الوكيل. في `~/.cursor/cli-config.json`: @@ -91,10 +104,10 @@ curl -sS http://localhost:20128/v1/chat/completions \ ``` من دون ذلك، يفتح CLI دورة الوكيل عبر HTTP/2 إلى مضيف وكيل - مُعدّ بصورة منفصلة، ولا تمر عبر نقطة النهاية سوى استدعاءات RPC الخاصة بمستوى - التحكم. + مهيأ بشكل منفصل، ولا تمر عبر نقطة النهاية سوى استدعاءات RPC الخاصة + بمستوى التحكم. -3. شغّل CLI مقابل OmniRoute: +3. شغّل CLI عبر OmniRoute: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -102,19 +115,19 @@ curl -sS http://localhost:20128/v1/chat/completions \ agent -p --trust "Reply with exactly OK" ``` -تصل كل قفزة إلى السجلات بالموفّر `cursor-api`، ونوع الطلب `cursor-cli`، -والمسار `/api/cursor-cli/`، وتُنسب إلى مفتاح API الخاص بـ OmniRoute وإلى -الاتصال الذي خدمها. +تظهر كل مرحلة في السجلات مع المزوّد `cursor-api`، ونوع الطلب `cursor-cli`، +والمسار `/api/cursor-cli/`، وتُنسب إلى مفتاح OmniRoute API والاتصال +الذي خدمها. ### حالات الفشل -| الحالة | الاستجابة إلى CLI | -| --------------------------------------------------- | --------------------------------------------------- | -| مفتاح OmniRoute غير معروف و`REQUIRE_API_KEY=true` | 401 `unauthenticated` عند التبادل | -| `REQUIRE_API_KEY=false` | جلسة مجهولة الهوية (تعكس سلوك `/v1/*`) | -| رمز JWT للجلسة منتهي الصلاحية / أجنبي / تم العبث به | 401، يعيد CLI إجراء التبادل | -| تم إلغاء مفتاح OmniRoute API بعد التبادل | 401 عند استدعاء RPC التالي | -| لا يوجد اتصال `cursor-api` نشط | 503 `unavailable` | -| يرفض Cursor مفتاح الاتصال | 401 `unauthenticated`، وتُحذف الجلسة المخزنة مؤقتًا | -| يتعذر الوصول إلى المنبع | 502 `unavailable` (رسالة منقّحة) | -| لم يتم تعيين `JWT_SECRET` | 503 عند التبادل | +| الحالة | الاستجابة إلى CLI | +| ------------------------------------------------- | --------------------------------------------------- | +| مفتاح OmniRoute غير معروف و`REQUIRE_API_KEY=true` | 401 `unauthenticated` عند الاستبدال | +| `REQUIRE_API_KEY=false` | جلسة مجهولة (تماثل سلوك `/v1/*`) | +| JWT للجلسة منتهي الصلاحية أو أجنبي أو عُبث به | 401، ويعيد CLI عملية الاستبدال | +| إلغاء مفتاح OmniRoute API بعد الاستبدال | 401 عند استدعاء RPC التالي | +| لا يوجد اتصال `cursor-api` نشط | 503 `unavailable` | +| رفض Cursor لمفتاح الاتصال | 401 `unauthenticated`، وتُحذف الجلسة المخزنة مؤقتًا | +| تعذّر الوصول إلى الخدمة الأصلية | 502 `unavailable` (رسالة منقّحة) | +| عدم تعيين `JWT_SECRET` | 503 عند الاستبدال | diff --git a/docs/i18n/ar/docs/reference/API_REFERENCE.md b/docs/i18n/ar/docs/reference/API_REFERENCE.md index d1111a2f0a10..291d78b941ba 100644 --- a/docs/i18n/ar/docs/reference/API_REFERENCE.md +++ b/docs/i18n/ar/docs/reference/API_REFERENCE.md @@ -447,14 +447,14 @@ GET /api/v1/provider-plugin-manifest | POST | `/v1/embeddings` | OpenAI | | POST | `/v1/images/generations` | صور OpenAI | | POST | `/v1/images/edits` | صور OpenAI (تحرير/ترميم) | -| POST | `/v1/videos/generations` | إنشاء فيديو بأسلوب OpenAI | -| POST | `/v1/music/generations` | إنشاء موسيقى بأسلوب OpenAI | +| POST | `/v1/videos/generations` | توليد فيديو بنمط OpenAI | +| POST | `/v1/music/generations` | توليد موسيقى بنمط OpenAI | | POST | `/v1/audio/transcriptions` | صوت OpenAI (تحويل الكلام إلى نص) | -| POST | `/v1/audio/speech` | تحويل النص إلى كلام من OpenAI (يعيد محتوى صوتيًا) | -| POST | `/v1/rerank` | إعادة ترتيب بأسلوب Cohere/Voyage | -| POST | `/v1/classify` | تصنيف Jina ‏(`api.jina.ai`) | -| POST | `/v1/segment` | مُجزّئ Jina ‏(`segment.jina.ai`) | -| POST | `/v1/moderations` | الإشراف على المحتوى من OpenAI | +| POST | `/v1/audio/speech` | تحويل النص إلى كلام من OpenAI (يعيد جسمًا صوتيًا) | +| POST | `/v1/rerank` | إعادة ترتيب بنمط Cohere/Voyage | +| POST | `/v1/classify` | تصنيف Jina (`api.jina.ai`) | +| POST | `/v1/segment` | مُقسِّم Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | الإشراف من OpenAI | | GET | `/v1/models` | OpenAI | | POST | `/v1/messages/count_tokens` | Anthropic | | GET | `/v1beta/models` | Gemini | @@ -462,43 +462,65 @@ GET /api/v1/provider-plugin-manifest | POST | `/v1/api/chat` | Ollama | | GET | `/api/v1/vscode/{token}/` | اسم مستعار لكتالوج OpenAI | | GET | `/api/v1/vscode/{token}/models` | اسم مستعار لنماذج OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | اسم مستعار مُرمّز برمز لـ OpenAI | -| POST | `/api/v1/vscode/{token}/responses` | اسم مستعار مُرمّز برمز لاستجابات OpenAI | -| POST | `/api/v1/vscode/{token}/api/chat` | اسم مستعار مُرمّز برمز لـ Ollama | -| GET | `/api/v1/vscode/{token}/api/tags` | اسم مستعار مُرمّز برمز لوسوم Ollama | +| POST | `/api/v1/vscode/{token}/chat/completions` | اسم مستعار لـ OpenAI مزوّد برمز | +| POST | `/api/v1/vscode/{token}/responses` | اسم مستعار لاستجابات OpenAI مزوّد برمز | +| POST | `/api/v1/vscode/{token}/api/chat` | اسم مستعار لـ Ollama مزوّد برمز | +| GET | `/api/v1/vscode/{token}/api/tags` | اسم مستعار لوسوم Ollama مزوّد برمز | -تتبع جميع مسارات POST البنية نفسها: `Bearer your-api-key` + محتوى JSON تم التحقق منه باستخدام Zod ‏(`v1RerankSchema` و`v1ModerationSchema` و`v1AudioSpeechSchema` وغيرها؛ راجع `src/shared/validation/schemas.ts`). تُعاد حالة 4xx عند فشل التحقق من المخطط. +تتبع جميع مسارات POST البنية نفسها: `Bearer your-api-key` + جسم JSON تم التحقق منه بواسطة Zod (`v1RerankSchema`، و`v1ModerationSchema`، و`v1AudioSpeechSchema`، وغيرها؛ راجع `src/shared/validation/schemas.ts`). تُعاد حالة 4xx عند فشل التحقق من المخطط. -بالنسبة إلى العملاء الذين لا يمكنهم إرفاق `Authorization: Bearer ...`، يقبل OmniRoute أيضًا مفاتيح API ضمن عنوان URL، إما عبر توافق سلسلة الاستعلام (`?token=...` أو `?apiKey=...` أو `?api_key=...` أو `?key=...`) أو عبر نقاط النهاية المخصصة `/api/v1/vscode/{token}/...` الموثقة أدناه. +بالنسبة إلى العملاء الذين لا يمكنهم إرفاق `Authorization: Bearer ...`، يقبل OmniRoute أيضًا مفاتيح API في عنوان URL، إما عبر التوافق باستخدام سلسلة الاستعلام (`?token=...`، أو `?apiKey=...`، أو `?api_key=...`، أو `?key=...`) أو عبر نقاط النهاية المخصصة `/api/v1/vscode/{token}/...` والموثقة أدناه. ```bash -# إعادة الترتيب +# إعادة الترتيب (موفّر سجل سحابي، أو عقدة موفّر متوافقة مع OpenAI بصيغة "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # تصنيف Jina (بيانات اعتماد Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# مُجزّئ Jina +# مُقسِّم Jina POST /v1/segment { "content": "...", "return_chunks": true } -# بحث Jina ‏(s.jina.ai؛ الأسماء المستعارة للمزوّد: jina-search وjina-ai وjina) +# بحث Jina ‏(s.jina.ai؛ الأسماء المستعارة للموفّر: jina-search، وjina-ai، وjina) POST /v1/search { "query": "...", "provider": "jina-search" } -# الإشراف على المحتوى +# الإشراف POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# تحويل النص إلى كلام — يعيد محتوى audio/mpeg (أو التنسيق المطلوب) +# تحويل النص إلى كلام — يعيد جسمًا بصيغة audio/mpeg (أو بالتنسيق المطلوب) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # تحرير صورة (متعدد الأجزاء) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# إنشاء فيديو / موسيقى (معرّف نموذج مسبوق باسم المزوّد) +# توليد فيديو / موسيقى (معرّف نموذج مسبوق باسم الموفّر) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### مسارات المزوّد المخصصة +> **عُقد موفّر إعادة الترتيب:** يوجّه `POST /v1/rerank` الطلبات أيضًا إلى عُقد موفّرين متوافقة مع OpenAI +> (مثل oMLX، وvLLM، وInfinity، وTEI خلف بوابة، …) ويُشار إليها بصيغة `/`. تكون عُقد +> الاسترجاع المحلي (`localhost`، و`127.0.0.1`، و`172.16.0.0/12`) مؤهلة دائمًا. أما العُقد الموجودة على أي +> مضيف آخر — سواء كان جهازًا على شبكة LAN أو نظيرًا على Tailscale — فلا تكون مؤهلة إلا عندما يفعّل المشغّل +> علامة الميزة `RERANK_REMOTE_PROVIDER_NODES` **و** يجتاز عنوان URL الأساسي للعقدة سياسة عناوين URL +> الصادرة الخاصة بالموفّر (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`)؛ +> ولا تُوجَّه الطلبات مطلقًا إلى مضيفي بيانات تعريف السحابة. تستدعي خطوة إعادة الترتيب في محرك الذاكرة هذا المسار +> عبر الاسترجاع المحلي، ولذلك تحكم القاعدة نفسها `rerankProviderModel` في إعدادات الذاكرة. +> +> **بُنى الخادم المحلي:** تُستدعى العقدة عند `/v1/rerank`، وعند الحصول على 404، عند `/rerank` +> (Infinity، وTEI). يحمل الجسم المُرسل إلى المصدر كلاً من صياغة Cohere/OpenAI (`documents`، +> و`return_documents`) وصياغة TEI (`texts`، و`return_text`)، وتُطبَّع استجابة المصدر إلى غلاف Cohere: +> إذ تُعاد مصفوفة TEI المجرّدة `[{index, score, text}]`، و`{results: [{index, score}]}` الواردة +> من البوابات الخفيفة، و`{data: [...]}` بنمط Voyage، جميعها إلى العميل بصيغة +> `{results: [{index, relevance_score, document?}]}`، مرتبة حسب الدرجة ومحدودة بالقيمة `top_n`. + +> **اكتشاف عُقد الموفّرين:** تظهر النماذج الموجودة على عقدة موفّر متوافقة مع OpenAI في `GET /v1/models` +> تحت بادئة العقدة. ترث الصفوف التي لا تحمل بيانات تعريف لنقطة النهاية (كما هو معتاد في قوائم `/v1/models` المحلية) +> قيمة `apiType` الخاصة بالعقدة، ولذلك تكون نماذج عقدة `embeddings` من النوع `type: "embedding"` ونماذج +> عقدة `rerank` من النوع `type: "rerank"` بدلًا من اعتماد الدردشة افتراضيًا؛ ومع ذلك، تظل قيمة +> `supportedEndpoints` الصريحة في صف متزامن أو مضاف يدويًا ذات أولوية. + +### مسارات الموفّرين المخصصة ```bash POST /v1/providers/{provider}/chat/completions @@ -506,7 +528,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -تُضاف بادئة المزوّد تلقائيًا إذا كانت مفقودة. تعيد النماذج غير المتطابقة `400`. +تُضاف بادئة المزوّد تلقائيًا إذا كانت مفقودة. تُرجع النماذج غير المتطابقة `400`. --- diff --git a/docs/i18n/ar/docs/reference/ENVIRONMENT.md b/docs/i18n/ar/docs/reference/ENVIRONMENT.md index b41698ef6495..75b0a24a8e75 100644 --- a/docs/i18n/ar/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/ar/docs/reference/ENVIRONMENT.md @@ -79,72 +79,71 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. التخزين وقاعدة البيانات -يستخدم OmniRoute قاعدة بيانات **SQLite** (عبر `better-sqlite3`) لجميع عمليات التخزين الدائم. تتحكم هذه المتغيرات في موقع البيانات والتشفير ودورة حياتها. - -| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | -| ------------------------------------------ | -------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | الدليل الجذر لقاعدة بيانات SQLite والنسخ الاحتياطية وملفات البيانات. عيّنه بقيمة أخرى لاستخدام وحدات تخزين Docker أو مسارات مخصصة. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(غير معيّن)_ | `src/lib/dataPaths.ts` | آلية تجاوز لحاجز DATA_DIR الخاص بالاختبارات/التقييم (#10428). تُعاد توجيه الاختبارات وعمليات فحص التقييم/الطباعة في Node (`-e`/`--eval`/`-p`/`--print`، بما في ذلك الصيغتان `--eval=`/`--print=`) التي لا تحتوي على `DATA_DIR` إلى دليل مؤقت قابل للتخلص منه، بحيث لا يمكنها فتح قاعدة البيانات الحقيقية للمشغّل؛ عيّنه إلى `1` لإعادة الاشتراك في استخدام الدليل الحقيقي. | -| `OMNIROUTE_BUILD_SHA` | _(غير معيّن)_ | `src/lib/monitoring/buildSha.ts` | قيمة Git SHA للعنصر الجاري تشغيله. تُضمَّن بواسطة `npm run build:release`؛ ويمكن حقنها في الحاويات التي تُشحن من دون ملف التحقق `dist/BUILD_SHA`. تظهر باسم `system.buildSha` على `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | المرجع الذي تقارن بوابة مصدر حزمة العنصر قيمة SHA للبناء به (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(غير معيّن)_ | `scripts/build/buildProvenance.ts` | عيّنه إلى `1` للسماح بحزم بناء لا تقع قيمة SHA الخاصة به على خط الإصدار، مع تسجيله بوصفه إصدار canary مقصودًا بدلًا من إخفاق البوابة (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(غير معيّن)_ | `scripts/ops/deploy-canary.mjs` | مفتاح API لفحص الدخان الخاص بنشر canary، ويُرسل بصيغة `Authorization: Bearer` إلى `/v1/chat/completions`. لا يستخدمه سوى برنامج النشر النصي (#10429)، ولا يستخدمه الخادم مطلقًا. ولا يرتبط بمتغيرات `OMNIROUTE_SMOKE_*` الخاصة بأداة فحص الدخان الاختيارية لسطر الأوامر (`RUN_CLI_SMOKE=1` و`OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` في `tests/integration/upstream-cli-smoke.int.test.ts`) — راجع [تكاملات CLI ← الفحص الحقيقي الشامل](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(غير معيّن)_ | `src/lib/buildPhase.ts` | إشارة مرحلة البناء (#10060): يعيّنها `scripts/build/build-next-isolated.mjs` إلى `1`، وترثها كل عملية بناء عاملة تُنشأ، بحيث تُرجع طبقة قاعدة البيانات بديلًا وهميًا لا ينفذ أي عمليات بدلًا من تحميل إضافة better-sqlite3 الأصلية (التي تُنهي العملية العاملة عند الخروج). لا تُعيَّن مطلقًا للخادم قيد التشغيل. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | عيّنه إلى `1` لتخطي فحص ما قبل البناء الاختياري للتبعيات الأصلية في أشجار المورّد غير المعتادة. لا يجعل ذلك التبعية المفقودة قابلة للبناء؛ استخدمه فقط عندما تكون التبعيات الأصلية موفَّرة عبر قناة خارجية. | -| `OMNIROUTE_DATA_DIR` | _(غير معيّن)_ | `open-sse/executors/promptql/threadSticky.ts` | **اسم بديل احتياطي** لـ `DATA_DIR`، ولا يُفحص إلا عندما يكون `DATA_DIR` غير معيّن. يُستخدم لتحديد موقع ذاكرة التخزين المؤقت على القرص لجلسات PromptQL المثبّتة على سلسلة التنفيذ (`/promptql-thread-sessions.json`)؛ وإذا لم يكن أي من المتغيرين معيّنًا، فتبقى ذاكرة التخزين المؤقت في الذاكرة فقط (ولا تُحفظ عبر عمليات إعادة التشغيل). | -| `OMNIROUTE_PLUGINS_DIR` | _(غير معيّن)_ | `src/lib/plugins/scanner.ts` | الدليل الذي يقرأه **ماسح الإضافات في وقت التشغيل** — وهو أيضًا الجذر الذي يثبّت مدير الإضافات فيه — متجاوزًا القيمة الافتراضية المشتقة من الدليل المنزلي (#11827). وجّهه إلى شجرة الإضافات المركّبة عبر bind mount في Docker/K8s بدلًا من نقل HOME لمجرد تغيير موقع مسار الفحص (إذ يتحكم HOME أيضًا في كل سلوك آخر مرتبط بالدليل المنزلي). عدم تعيينه = `~/.omniroute/plugins`، أو `/tmp/.omniroute/plugins` عندما لا تصدّر العملية أي دليل منزلي إطلاقًا — ما يزيل مشكلة عدم الاكتشاف الصامت. يُسجَّل الدليل المحدد مرة واحدة عند بدء التشغيل باسم `scanner.dir_resolved` مع الإدخال الذي تم اعتماده. خاص بجانب الخادم فقط: تحتفظ إضافات أوامر CLI بمتغير `OMNIROUTE_PLUGIN_PATH` الخاص بها (القسم 9). | -| `STORAGE_ENCRYPTION_KEY` | _(فارغ = معطّل)_ | `src/lib/db/encryption.ts` | مفتاح AES لتشفير قاعدة بيانات SQLite بالكامل وهي مخزّنة. أنشئه باستخدام `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | تسمية إصدار مفتاح التشفير. زِدها عند إجراء تدوير للمفتاح لدعم فك تشفير النسخ الاحتياطية القديمة. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | عندما تكون القيمة `true`، يتم تخطي النسخ الاحتياطية الدورية/السابقة للكتابة لملف SQLite (حفظ/مسح تسعير models.dev وعمليات كتابة الإعدادات). تظل النسخ الاحتياطية اليدوية والسابقة للاستعادة قيد التشغيل. وهذا **لا** يعطّل لقطة الأمان الدائمة الإلزامية الخاصة بمشغّل الترحيل أو حاجز الترحيل الشامل لقاعدة بيانات دائمة موجودة. تُقيّد النسخ الاحتياطية غير اليدوية بحيث لا تُجرى أكثر من مرة واحدة كل 60 دقيقة. يمكن من **الإعدادات → التخزين** في لوحة المعلومات تعطيل النسخ الاحتياطي التلقائي الدوري بصورة مستقلة. | -| `OMNIROUTE_CRYPT_KEY` | _(غير معيّن)_ | `src/lib/db/encryption.ts` | **اسم بديل قديم** لـ `STORAGE_ENCRYPTION_KEY`. يُقبل كخيار احتياطي عندما لا يكون المتغير الأساسي موجودًا. | -| `OMNIROUTE_API_KEY_BASE64` | _(غير معيّن)_ | `src/lib/db/encryption.ts` | **اسم بديل قديم** (بصيغة مرمّزة باستخدام Base64) يُقبل كخيار احتياطي. يُفك ترميزه تلقائيًا قبل الاستخدام. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(غير معيّن)_ | `src/lib/db/core.ts` | تجاوز الفاصل الزمني للفحص الدوري لصحة SQLite (بالمللي ثانية). عندما لا يكون معيّنًا، تُشتق القيم الافتراضية من `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 ساعات) | `src/lib/db/walMaintenance.ts` | تجاوز الفاصل الزمني الدوري لـ `wal_checkpoint(TRUNCATE)` (بالمللي ثانية). لا يؤدي الفحص التلقائي مطلقًا إلى تقليص ملف WAL نفسه، كما أن الخادم طويل التشغيل لا يغلق قاعدة بياناته مطلقًا. تؤدي القيمة `0` إلى التعطيل. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 دقائق) | `src/lib/db/walMaintenance.ts` | تجاوز الفاصل الزمني المتكرر لـ `wal_checkpoint(PASSIVE)` (بالمللي ثانية). يُبقي إطارات WAL المعلّقة صغيرة كي لا تنسخ عملية TRUNCATE الدورية مطلقًا تراكمًا بحجم عدة غيغابايت على الخيط الرئيسي. تؤدي القيمة `0` إلى التعطيل. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | عندما تجد دورة PASSIVE أن ملف WAL يتجاوز هذا الحجم، يتم التصعيد فورًا إلى `wal_checkpoint(TRUNCATE)` بدلًا من انتظار الدورة البطيئة. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | عيّنه إلى `1`/`true`/`yes`/`on` لإنهاء العملية بعد استمرار الضغط الحرج على الموارد لمدة `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`، مما يتيح للمشرف (systemd مع `Restart=always`، أو سياسة إعادة التشغيل في Docker) تشغيل عملية نظيفة مجددًا بدلًا من الاستمرار إلى أجل غير مسمى في تقديم استجابات 503. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (دقيقتان) | `open-sse/utils/resourcePressure.ts` | المدة التي يجب أن يستمر خلالها الضغط الحرج قبل تنفيذ الخروج الخاص بإعادة التشغيل الذاتية. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(اكتشاف تلقائي)_ | `src/lib/db/adapters/sqljsAdapter.ts` | المسار الصريح (المطلق أو النسبي إلى cwd) للملف `sql-wasm.wasm` عند استخدام محوّل WASM الاحتياطي الخاص بـ `sql.js`. يتم اكتشافه تلقائيًا عبر تبعيات الحزمة والتخطيطات المرشحة عندما لا يكون معيّنًا. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 ساعات) | `src/lib/db/core.ts` | تجاوز الفاصل الزمني الدوري لـ `wal_checkpoint(TRUNCATE)` (بالمللي ثانية). لا يؤدي الفحص التلقائي مطلقًا إلى تقليص ملف WAL نفسه، كما أن الخادم طويل التشغيل لا يغلق قاعدة بياناته مطلقًا. تؤدي القيمة `0` إلى التعطيل. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | عدد الأيام التي يتم خلالها الاحتفاظ بنقاط التحقق والملفات المرجعية للإدخال/الإخراج/الأخطاء والسجل الخاص بمهمة Batch API نهائية (مكتملة/فاشلة/ملغاة/منتهية الصلاحية) بواسطة عملية التنظيف التلقائية قبل الحذف. لا يسري ذلك إلا بعد تفعيل `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`؛ وهو يطابق مدة الاحتفاظ بمخرجات Batch API لدى OpenAI. لا يؤثر في المسار `DELETE /api/v1/batches/delete-completed` الذي يشغّله المسؤول، إذ يظل غير مشروط (من دون مرشح للعمر) حسب التصميم. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | عندما تكون القيمة `true`، اسمح لعملية التنظيف التلقائي بحذف مهام Batch API النهائية (ونقاط التحقق الخاصة بها) التي تجاوزت `OMNIROUTE_BATCH_RETENTION_DAYS`، ومسح محتوى BLOB للملفات المرفوعة التي تجاوزت قيمة `expires_at` الخاصة بها. تكون معطّلة افتراضيًا: يحتفظ كل تثبيت حالي بهذه البيانات تمامًا كما كان من قبل إلى أن يفعّلها المشغّل. وهي أيضًا علامة ميزة قابلة للتعديل من لوحة المعلومات — راجع `docs/reference/FEATURE_FLAGS.md` ← وقت التشغيل. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | اضبطها على `1` لتخطي فحص سلامة قاعدة البيانات بالكامل عند بدء التشغيل. مفيدة للمهام قصيرة العمر واختبارات التكامل. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | اضبطها على `1` لفرض تشغيل حلقة فحص سلامة قاعدة البيانات، حتى عندما يتم تخطيها عادةً (مثلًا في المهام قصيرة العمر). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | اضبطها على `1` لتخطي الإحماء المسبق لبيئة التشغيل الأصلية أثناء `npm install`. مفيدة في عمليات التثبيت ضمن CI أو البيئات عديمة الواجهة حيث يكون sqlite مبنيًا بالفعل. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(اكتشاف تلقائي)_ | `src/lib/db/migrationRunner.ts` | تجاوز الدليل الذي يفحصه مشغّل عمليات الترحيل. مفيد عند شحن عمليات ترحيل مجمّعة ضمن إصدارات مخصصة. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(غير معيّنة)_ | `src/lib/db/migrationRunner/extraDirs.ts` | أدلة ترحيل إضافية على هيئة إدخالات `namespace=dir` مفصولة بمحدِّد المسارات الخاص بالمنصة (مثل `ee=/opt/app/enterprise/db/migrations`). تُسجّل الملفات الموجودة هناك بصيغة `-`، لذلك لا تتعارض أي توزيعة تشحن عمليات الترحيل الخاصة بها مع الخانات الرقمية للمشروع الأصلي. يؤدي الإدخال المشوّه أو مساحة الاسم غير الصالحة أو الدليل المفقود إلى طرح خطأ عند بدء التشغيل بدلًا من تخطي المخطط بصمت. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | حد أمان لعدد كبير من عمليات الترحيل المعلّقة (#3416). يُلغى بدء التشغيل إذا كان عدد عمليات الترحيل المعلّقة على قاعدة بيانات موجودة يتجاوز هذه القيمة (للحماية من جدول تتبّع تم مسحه). ارفع القيمة لاستعادة نسخة احتياطية أقدم؛ واضبطها على `0` لتعطيل الفحص. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | دليل العمل لبوابة الإصدار `check:install-upgrade`. يحتاج إلى نحو 12 GB (شجرتا تثبيت بحجم ~3 GB لكل منهما بالإضافة إلى ملف tarball)، لذا يجب ألا يعمل على tmpfs صغير — في المشغّل ذاتي الاستضافة، يكون `/tmp` عبارة عن tmpfs بسعة 12 GB ومدعوم بذاكرة RAM، وقد استنفدته البوابة، مما أدى إلى اقتطاع الحزمة. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(القيمة الافتراضية في الشيفرة)_ | `src/lib/spend/batchWriter.ts` | الفاصل الزمني للتفريغ (بالمللي ثانية) لكاتب الإنفاق/التكلفة المجمّع. تقلل القيم الأصغر من دمج عمليات الكتابة؛ وتقلل القيم الأكبر من التنافس على قاعدة البيانات. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(القيمة الافتراضية في الشيفرة)_ | `src/lib/spend/batchWriter.ts` | الحد الأقصى لإدخالات الإنفاق المخزّنة مؤقتًا قبل فرض التفريغ. ارفع القيمة في عمليات النشر ذات QPS المرتفع؛ واخفضها عندما تكون الذاكرة المحدودة أكثر أهمية. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(غير معيّنة)_ | `open-sse/utils/proxyFetch.ts` | اضبطها على `"true"` لإصدار سجلات تصحيح `[ProxyFetch]` على مسار ترحيل Vercel. تكون معطّلة افتراضيًا لتجنب تسريب تلميحات التوجيه. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | اضبطها على `"true"` أو `"1"` لتضمين عناوين IP الخاصة بالعميل/الخروج وبادئة الحساب في سطر سجل العملية المفصّل `[ProxyEgress]`. تبقى معطّلة افتراضيًا كي لا يسرّب سجل العملية عناوين IP أو بادئة الحساب. | -| `OMNIROUTE_DEBUG` | _(غير معيّنة)_ | `bin/cli/commands/quota.mjs` | اضبطها على `1` لطباعة بيانات تشخيص التوقيت لكل طلب (`[omniroute] GET completed in Nms`) من أوامر حصة CLI إلى stderr. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(تلقائي)_ | `scripts/dev/healthcheck.mjs` | المسار الصريح الذي يفحصه فحص سلامة الحاوية. عند عدم تعيينه، يستنتجه الفحص من `OMNIROUTE_BASE_PATH`؛ ويؤدي تعيينه إلى إعادة تفعيل نقطة نهاية المراقبة المتعمقة. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(غير معيّنة)_ | `bin/cli/commands/completion.mjs` | اضبطها على أي قيمة غير فارغة لإصدار بيانات تشخيص `[omniroute completion]` من مسارات ذاكرة التخزين المؤقت للإكمال التلقائي في صدفة CLI (قراءة/تحديث/كتابة). تكون معطّلة افتراضيًا — تفشل ذاكرات التخزين المؤقت هذه بصمت كي لا تؤدي ذاكرة مفقودة/تالفة أبدًا إلى تعطيل الإكمال بمفتاح Tab. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ساعة) | `open-sse/services/batchProcessor.ts` | الحد الأقصى لنافذة إعادة المحاولة لعناصر الدُفعة الفردية (بالمللي ثانية). تُعلَّم العناصر التي تتجاوز هذه المدة على أنها فشلت. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | التأخير الأساسي (بالمللي ثانية) للتراجع الأُسّي عند إعادة محاولة عناصر الدُفعة. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (ساعة واحدة) | `open-sse/services/batchProcessor.ts` | الحد الأقصى (بالمللي ثانية) للتراجع الأُسّي بين محاولات إعادة معالجة عناصر الدُفعة. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | الحد الأقصى لعدد الدُفعات التي تُعالَج بالتزامن. ارفعه لزيادة معدل المعالجة؛ وأبقِه منخفضًا لتجنب موجات تجاوز حدود المعدل. | +يستخدم OmniRoute قاعدة بيانات **SQLite** (عبر `better-sqlite3`) لجميع عمليات التخزين الدائم. تتحكم هذه المتغيرات في موقع البيانات والتشفير ودورة الحياة. + +| المتغير | القيمة الافتراضية | ملف المصدر | الوصف | +| ------------------------------------------ | -------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | الدليل الجذر لقاعدة بيانات SQLite والنسخ الاحتياطية وملفات البيانات. تجاوز هذه القيمة لوحدات تخزين Docker أو المسارات المخصصة. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(غير معيّن)_ | `src/lib/dataPaths.ts` | مخرج استثنائي لحاجز DATA_DIR الخاص بالاختبارات/التقييم (#10428). تُعاد توجيه الاختبارات وعمليات فحص التقييم/الطباعة في Node (`-e`/`--eval`/`-p`/`--print`، بما في ذلك الصيغتان `--eval=`/`--print=`) التي لا تحتوي على `DATA_DIR` إلى دليل مؤقت يُتخلّص منه، بحيث لا يمكنها فتح قاعدة البيانات الحقيقية للمشغّل؛ اضبطه على `1` لإعادة الاشتراك في استخدام الدليل الحقيقي. | +| `OMNIROUTE_BUILD_SHA` | _(غير معيّن)_ | `src/lib/monitoring/buildSha.ts` | قيمة SHA في Git للعنصر البرمجي قيد التشغيل. تُثبَّت بواسطة `npm run build:release`؛ ويمكن حقنها في الحاويات التي تُشحن من دون ملف العلامة `dist/BUILD_SHA`. تظهر باسم `system.buildSha` في `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | المرجع الذي تتحقق بوابة مصدر عنصر الحزمة من قيمة SHA للبناء مقابله (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(غير معيّن)_ | `scripts/build/buildProvenance.ts` | اضبطه على `1` للسماح بحزم بناء لا تقع قيمة SHA الخاصة به على مسار الإصدار، مع تسجيله عمدًا بوصفه إصدارًا تجريبيًا بدلًا من إخفاق البوابة (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(غير معيّن)_ | `scripts/ops/deploy-canary.mjs` | مفتاح API لفحص الدخان الخاص بنشر الإصدار التجريبي، ويُرسل بصيغة `Authorization: Bearer` إلى `/v1/chat/completions`. لا يستخدمه سوى برنامج النشر النصي (#10429)، ولا يستخدمه الخادم مطلقًا. لا يرتبط بمتغيرات `OMNIROUTE_SMOKE_*` الخاصة بأداة فحص الدخان الاختيارية لواجهة سطر الأوامر (`RUN_CLI_SMOKE=1` و`OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` في `tests/integration/upstream-cli-smoke.int.test.ts`) — راجع [تكاملات واجهة سطر الأوامر ← الفحص الحقيقي الشامل](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(غير معيّن)_ | `src/lib/buildPhase.ts` | إشارة مرحلة البناء (#10060): يضبطها `scripts/build/build-next-isolated.mjs` على `1`، وترثها كل عملية بناء عاملة يتم إنشاؤها، بحيث تُرجع طبقة قاعدة البيانات بديلًا شكليًا لا ينفّذ أي عملية بدلًا من تحميل ملحق better-sqlite3 الأصلي (الذي يُجهض العملية العاملة عند الخروج). لا تُضبط مطلقًا للخادم قيد التشغيل. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | اضبطه على `1` لتخطي فحص ما قبل البناء الاختياري للتبعيات الأصلية في أشجار المورّدين غير المعتادة. لا يجعل هذا التبعية المفقودة قابلة للبناء؛ استخدمه فقط عندما تُوفَّر التبعيات الأصلية خارج النطاق المعتاد. | +| `OMNIROUTE_DATA_DIR` | _(غير معيّن)_ | `open-sse/executors/promptql/threadSticky.ts` | **اسم بديل احتياطي** لـ`DATA_DIR`، ولا يُتحقق منه إلا عندما يكون `DATA_DIR` غير معيّن. يُستخدم لتحديد موقع ذاكرة التخزين المؤقت على القرص لجلسات PromptQL المثبّتة بمؤشر الترابط (`/promptql-thread-sessions.json`)؛ وإذا لم يُضبط أي من المتغيرين، فتبقى ذاكرة التخزين المؤقت في الذاكرة فقط (ولا تستمر عبر عمليات إعادة التشغيل). | +| `OMNIROUTE_PLUGINS_DIR` | _(غير معيّن)_ | `src/lib/plugins/scanner.ts` | الدليل الذي يقرأه **ماسح الإضافات في وقت التشغيل** — والجذر الذي يثبّت مدير الإضافات فيه — متجاوزًا القيمة الافتراضية المشتقة من الدليل الرئيسي (#11827). وجّهه إلى شجرة الإضافات المربوطة في Docker/K8s بدلًا من نقل HOME لمجرد تغيير موقع مسار الفحص (إذ يتحكم HOME أيضًا في كل سلوك آخر مرتبط بالدليل الرئيسي). غير معيّن = `~/.omniroute/plugins`، أو `/tmp/.omniroute/plugins` عندما لا تصدّر العملية أي دليل رئيسي على الإطلاق — ما يزيل مشكلة عدم الاكتشاف الصامت. يُسجَّل الدليل المُحدَّد مرة واحدة عند بدء التشغيل باسم `scanner.dir_resolved` مع قيمة الإدخال التي كانت لها الأولوية. خاص بجانب الخادم فقط: تحتفظ إضافات أوامر واجهة سطر الأوامر بمتغيرها الخاص `OMNIROUTE_PLUGIN_PATH` (القسم 9). | +| `STORAGE_ENCRYPTION_KEY` | _(فارغ = معطّل)_ | `src/lib/db/encryption.ts` | مفتاح AES لتشفير قاعدة بيانات SQLite بالكامل أثناء التخزين. أنشئه باستخدام `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | تسمية إصدار مفتاح التشفير. زِدها عند تدوير المفتاح لدعم فك تشفير النسخ الاحتياطية القديمة. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | عندما تكون القيمة `true`، يتم تخطي النسخ الاحتياطية الدورية/السابقة للكتابة لملف SQLite (حفظ/مسح تسعير models.dev وعمليات الكتابة إلى الإعدادات). تظل النسخ الاحتياطية اليدوية والسابقة للاستعادة قيد التشغيل. وهي **لا** تعطّل لقطة الأمان الدائمة الإلزامية الخاصة بمشغّل الترحيل أو حاجز الترحيل الشامل لقاعدة بيانات دائمة موجودة. تُقيّد النسخ الاحتياطية غير اليدوية بحيث لا تتجاوز مرة واحدة كل 60 دقيقة. يمكن من لوحة المعلومات **الإعدادات ← التخزين** تعطيل النسخ الاحتياطي التلقائي الدوري بشكل مستقل. | +| `OMNIROUTE_CRYPT_KEY` | _(غير معيّن)_ | `src/lib/db/encryption.ts` | **اسم بديل قديم** لـ `STORAGE_ENCRYPTION_KEY`. يُقبل كخيار احتياطي عند غياب المتغير الأساسي. | +| `OMNIROUTE_API_KEY_BASE64` | _(غير معيّن)_ | `src/lib/db/encryption.ts` | **اسم بديل قديم** (بصيغة مشفّرة باستخدام Base64) يُقبل كخيار احتياطي. يُفك ترميزه تلقائيًا قبل الاستخدام. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(غير معيّن)_ | `src/lib/db/core.ts` | تجاوز الفاصل الزمني للفحص الدوري لحالة SQLite (بالمللي ثانية). عند عدم تعيينه، تُشتق القيم الافتراضية من `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(تمت إزالته)_ | `src/lib/db/walMaintenance.ts` | **تمت إزالته.** يمكن أن يؤدي تشغيل `wal_checkpoint(TRUNCATE)` دوريًا أثناء العمل إلى إبطال تعيين فهرس wal المشترك وتعطيل العملية بإشارة SIGBUS (#13973)، لذلك لم يعد المجدول موجودًا. المتغير غير فعّال: تؤدي القيمة الموجبة إلى تسجيل تحذير إهمال لمرة واحدة، بينما تظل القيمة `0` أو عدم التعيين صامتة. تتم صيانة WAL بواسطة نقاط تحقق PASSIVE (أدناه)، ويُقتطع بواسطة نقطة تحقق إيقاف التشغيل. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 دقائق) | `src/lib/db/walMaintenance.ts` | تجاوز الفاصل الزمني المتكرر لـ `wal_checkpoint(PASSIVE)` (بالمللي ثانية). يحافظ على صغر حجم إطارات WAL المعلّقة كي تظل نقاط التحقق سريعة ويظل حجم ملف WAL محدودًا بين عمليات الاقتطاع عند إيقاف التشغيل. تؤدي القيمة `0` إلى التعطيل. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | عندما تكتشف دورة PASSIVE أن حجم ملف WAL يتجاوز هذه القيمة، يتم تشغيل `wal_checkpoint(RESTART)` ليبدأ WAL من جديد دون إعادة كتابة فهرس wal المعيّن. تمت إزالة نقاط التحقق بنمط الاقتطاع أثناء التشغيل (راجع صف `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | اضبطه على `1`/`true`/`yes`/`on` لإنهاء العملية بعد استمرار ضغط الموارد الحرج لمدة `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`، مما يتيح لمشرف العمليات (systemd مع `Restart=always` أو سياسة إعادة التشغيل في Docker) إعادة تشغيل عملية نظيفة بدلًا من الاستمرار في تقديم استجابات 503 إلى أجل غير مسمى. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (دقيقتان) | `open-sse/utils/resourcePressure.ts` | المدة التي يجب أن يستمر خلالها الضغط الحرج قبل تنفيذ الخروج لإعادة التشغيل الذاتية. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(اكتشاف تلقائي)_ | `src/lib/db/adapters/sqljsAdapter.ts` | مسار صريح (مطلق أو نسبي إلى cwd) إلى `sql-wasm.wasm` عند استخدام محوّل WASM الاحتياطي `sql.js`. يُكتشف تلقائيًا عبر تبعيات الحزمة والتخطيطات المرشحة عند عدم تعيينه. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | عدد الأيام التي تُحتفظ خلالها نقاط التحقق والملفات المشار إليها للإدخال/الإخراج/الأخطاء والسجل الخاص بمهمة Batch API نهائية (مكتملة/فاشلة/ملغاة/منتهية الصلاحية) قبل حذفها بواسطة عملية التنظيف التلقائية. لا يسري إلا بعد تشغيل `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`؛ ويتوافق مع فترة الاحتفاظ بمخرجات Batch API لدى OpenAI. لا يؤثر في المسار `DELETE /api/v1/batches/delete-completed` الذي يشغّله المشغّل، إذ يظل غير مشروط (بلا مرشح للعمر) حسب التصميم. | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | عندما تكون القيمة `true`، يُسمح لعملية التنظيف التلقائية بحذف مهام Batch API النهائية (ونقاط التحقق الخاصة بها) التي تجاوزت `OMNIROUTE_BATCH_RETENTION_DAYS`، ومسح محتوى BLOB للملفات المرفوعة التي تجاوزت قيمة `expires_at` الخاصة بها. تكون معطّلة افتراضيًا: يحتفظ كل تثبيت موجود بهذه البيانات كما كانت تمامًا حتى يختار المشغّل تفعيلها. وهي أيضًا علامة ميزة قابلة للتعديل من لوحة المعلومات — راجع `docs/reference/FEATURE_FLAGS.md` ← وقت التشغيل. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | اضبطه على `1` لتخطي فحص سلامة قاعدة البيانات بالكامل عند بدء التشغيل. مفيد للمهام قصيرة العمر واختبارات التكامل. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | اضبطه على `1` لفرض تشغيل حلقة فحص سلامة قاعدة البيانات، حتى عندما يجري تخطيها عادةً (مثلًا، في المهام قصيرة العمر). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | اضبطه على `1` لتخطي تهيئة بيئة التشغيل الأصلية أثناء `npm install`. مفيد في عمليات التثبيت ضمن CI أو البيئات عديمة الواجهة حيث يكون sqlite مبنيًا بالفعل. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(اكتشاف تلقائي)_ | `src/lib/db/migrationRunner.ts` | تجاوز الدليل الذي يفحصه مشغّل عمليات الترحيل. مفيد عند شحن عمليات ترحيل مجمّعة ضمن إصدارات مخصصة. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(غير معيّن)_ | `src/lib/db/migrationRunner/extraDirs.ts` | أدلة ترحيل إضافية على هيئة إدخالات `namespace=dir` تفصل بينها علامة فصل المسارات الخاصة بالمنصة (مثل `ee=/opt/app/enterprise/db/migrations`). تُسجَّل الملفات الموجودة فيها بصيغة `-`، بحيث لا تتعارض التوزيعة التي تشحن عمليات الترحيل الخاصة بها أبدًا مع الخانات الرقمية للمصدر الرئيسي. يؤدي وجود إدخال مشوّه أو مساحة اسم غير صالحة أو دليل مفقود إلى طرح خطأ عند بدء التشغيل بدلًا من تخطي المخطط بصمت. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | حد أمان لعدد كبير من عمليات الترحيل المعلّقة (#3416). يُجهَض بدء التشغيل إذا كان عدد عمليات الترحيل المعلّقة في قاعدة بيانات موجودة يتجاوز هذه القيمة (للحماية من مسح جدول التتبع). ارفع القيمة لاستعادة نسخة احتياطية أقدم؛ واضبطها على `0` لتعطيل الفحص. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | دليل العمل لبوابة الإصدار `check:install-upgrade`. يحتاج إلى نحو 12 غيغابايت (شجرتا تثبيت بحجم ~3 غيغابايت لكل منهما بالإضافة إلى ملف tarball)، لذا يجب عدم تشغيله على tmpfs صغير — ففي المشغّل ذاتي الاستضافة، يكون `/tmp` نظام tmpfs مدعومًا بذاكرة RAM بسعة 12 غيغابايت، وقد استنفدته البوابة مما أدى إلى اقتطاع الحزمة. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(القيمة الافتراضية في الشيفرة)_ | `src/lib/spend/batchWriter.ts` | الفاصل الزمني للتفريغ (مللي ثانية) لكاتب الإنفاق/التكلفة المجمّع على دفعات. تقلل القيم المنخفضة دمج عمليات الكتابة؛ وتقلل القيم المرتفعة التنافس على قاعدة البيانات. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(القيمة الافتراضية في الشيفرة)_ | `src/lib/spend/batchWriter.ts` | الحد الأقصى لعدد إدخالات الإنفاق المخزنة مؤقتًا قبل التفريغ الإجباري. ارفعه في عمليات النشر ذات معدل QPS المرتفع؛ واخفضه عندما تكون الذاكرة المحدودة أكثر أهمية. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(غير معيّن)_ | `open-sse/utils/proxyFetch.ts` | اضبطه على `"true"` لإصدار سجلات تصحيح `[ProxyFetch]` في مسار ترحيل Vercel. يكون معطلًا افتراضيًا لتجنب تسريب تلميحات التوجيه. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | اضبطه على `"true"` أو `"1"` لتضمين عناوين IP للعميل/الخروج وبادئة الحساب في سطر سجل العملية التفصيلي `[ProxyEgress]`. يظل معطلًا افتراضيًا حتى لا يسرّب سجل العملية عناوين IP أو بادئة الحساب. | +| `OMNIROUTE_DEBUG` | _(غير معيّن)_ | `bin/cli/commands/quota.mjs` | اضبطه على `1` لطباعة تشخيصات التوقيت لكل طلب (`[omniroute] GET completed in Nms`) من أوامر حصة CLI إلى stderr. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(تلقائي)_ | `scripts/dev/healthcheck.mjs` | المسار الصريح الذي يفحصه فحص سلامة الحاوية. عند عدم تعيينه، يستنتج الفحص المسار من `OMNIROUTE_BASE_PATH`؛ ويؤدي تعيينه إلى إعادة استخدام نقطة نهاية المراقبة العميقة. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(غير معيّن)_ | `bin/cli/commands/completion.mjs` | اضبطه على أي قيمة غير فارغة لإصدار تشخيصات `[omniroute completion]` من مسارات ذاكرة التخزين المؤقت للإكمال التلقائي في صدفة CLI (قراءة/تحديث/كتابة). يكون معطلًا افتراضيًا — إذ تفشل هذه الذاكرات المؤقتة بصمت كي لا تؤدي ذاكرة مؤقتة مفقودة/تالفة إلى تعطيل الإكمال بزر Tab. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ساعة) | `open-sse/services/batchProcessor.ts` | الحد الأقصى لنافذة إعادة المحاولة لعناصر الدفعة الفردية (مللي ثانية). تُعلَّم العناصر التي تتجاوز هذه المدة على أنها فاشلة. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | التأخير الأساسي (بالمللي ثانية) للتراجع الأُسّي عند إعادة محاولة عناصر الدفعة. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (ساعة واحدة) | `open-sse/services/batchProcessor.ts` | الحد الأقصى (بالمللي ثانية) للتراجع الأُسّي بين محاولات إعادة معالجة عناصر الدفعة. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | الحد الأقصى لعدد الدفعات التي تُعالَج بالتزامن. ارفعه لزيادة معدل المعالجة؛ وأبقِه منخفضًا لتجنب موجات تجاوز حدود المعدل. | > [!IMPORTANT] -> قبل تغيير قاعدة بيانات دائمة موجودة، ينشر مُشغِّل الترحيل لقطة كاملة +> قبل تغيير قاعدة بيانات دائمة موجودة، تنشر أداة تشغيل الترحيلات لقطة كاملة > معنونة بالمحتوى ضمن `DATA_DIR/db_backups/`. يتطلب النشر نظام ملفات -> يدعم الروابط الصلبة غير القابلة للاستبدال ضمن نظام الملفات نفسه، بالإضافة إلى مزامنة دائمة للملفات. تتطلب مضيفات POSIX أيضًا -> مزامنة الدليل؛ أما على Windows، فقد يرفض Node مقابض الأدلة، لذا يقوم OmniRoute بتفريغ -> الملف المنشور ويعامل مزامنة إدخال الدليل على أنها جهد قدر الإمكان. -> إذا تعذّر على `DATA_DIR` المركّب توفير هذه الضمانات، يفشل بدء التشغيل بشكل آمن قبل تطبيق -> أي ترحيل. انقل `DATA_DIR` إلى وحدة تخزين توفر هذه الإمكانات؛ ولا تستخدم -> `DISABLE_SQLITE_AUTO_BACKUP` لتجاوز أمان الترحيل. +> يدعم الروابط الثابتة ضمن نظام الملفات نفسه ومن دون استبدال، إضافةً إلى مزامنة دائمة للملفات. تتطلب مضيفات POSIX أيضًا +> مزامنة الدليل؛ أما على Windows، فقد يرفض Node مقابض الأدلة، لذا يقوم OmniRoute بمزامنة +> الملف المنشور ويعامل مزامنة إدخال الدليل على أنها أفضل جهد ممكن. +> إذا تعذر على `DATA_DIR` المركّب توفير هذه الضمانات، يفشل بدء التشغيل بصورة آمنة قبل تطبيق +> أي ترحيل. انقل `DATA_DIR` إلى وحدة تخزين توفر هذه الوظائف الأساسية؛ ولا تستخدم +> `DISABLE_SQLITE_AUTO_BACKUP` لتجاوز إجراءات أمان الترحيل. ### السيناريوهات -| السيناريو | التكوين | -| ------------------------- | ------------------------------------------------------------------------------------------ | -| **التطوير المحلي** | اترك جميع الإعدادات الافتراضية. توجد قاعدة البيانات في `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` مع تركيب وحدة تخزين عند `/data`. | -| **التشفير أثناء التخزين** | عيّن `STORAGE_ENCRYPTION_KEY` واحتفظ بنسخ احتياطية من المفتاح! فقدانه يعني فقدان البيانات. | -| **CI/الاختبار** | `DATA_DIR=/tmp/omniroute-test` — مؤقت، ولا حاجة إلى التشفير. | +| السيناريو | الإعداد | +| ------------------------- | ---------------------------------------------------------------------------------------- | +| **التطوير المحلي** | اترك جميع القيم الافتراضية. توجد قاعدة البيانات في `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + اركب وحدة تخزين عند `/data`. | +| **التشفير في وضع السكون** | عيّن `STORAGE_ENCRYPTION_KEY` + احتفظ بنسخ احتياطية من المفتاح! فقدانه = فقدان البيانات. | +| **CI/الاختبار** | `DATA_DIR=/tmp/omniroute-test` — مؤقت، ولا حاجة إلى التشفير. | --- @@ -213,39 +212,40 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 4. الأمان والمصادقة -| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | -| ------------------------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | قيمة salt تُدمج مع معرّفات الأجهزة لإنشاء بصمة الجهاز. غيّرها لكل عملية نشر لضمان العزل. | -| `OMNIROUTE_CLI_SALT` | _(غير معيّن = قيمة salt عشوائية لكل تثبيت، تُحفَظ في `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | قيمة salt لـ HMAC تُستخدم لاشتقاق رمز مصادقة CLI المحلي. يؤدي تعيين هذه القيمة إلى تدوير جميع رموز CLI على الجهاز، وتكون لها دائمًا الأولوية على قيمة salt المحفوظة. راجع `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | يعيّن العلامة `Secure` في ملفات تعريف ارتباط الجلسة. **يجب أن تكون `true`** عند التشغيل خلف HTTPS. | -| `REQUIRE_API_KEY` | `false` | وسيط API | عندما تكون `true`، يجب أن تتضمن جميع طلبات الوكيل `/v1/*` مفتاح API صالحًا. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | يسمح بعرض القيم الكاملة لمفاتيح API في واجهة لوحة المعلومات. يمكن ضبطه من علامات ميزات لوحة المعلومات؛ ويمثل خطرًا أمنيًا في النُسخ المشتركة. | -| `NO_LOG_API_KEY_IDS` | _(فارغ)_ | `src/lib/compliance/index.ts` | معرّفات مفاتيح API مفصولة بفواصل تتجاوز تسجيل الطلبات (للامتثال لـ GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(غير معيّن = غير محدود)_ | `src/shared/utils/apiKeyPolicy.ts` | ميزانية طلبات احتياطية يومية تُطبَّق على مفاتيح API التي يكون عمود `rate_limits` فيها فارغًا. إذا كانت القيمة غير معيّنة أو فارغة: فلا يوجد حد ضمني (#2289، #11017). وتؤدي القيمة `0` المعنى نفسه (غير محدود). يفعّل العدد الصحيح الموجب N حدودًا قدرها N/يوم، و5N/أسبوع، و20N/شهر. أما القيم غير الفارغة ذات التنسيق غير الصحيح فتعود إلى النوافذ القديمة: 1000/يوم، و5000/أسبوع، و20000/شهر. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | الحد الأقصى المسموح به لحجم متن الطلب. يرفض الحمولات التي تتجاوز هذا الحد. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | تحصل متون الطلبات الفعلية التي تبلغ هذا الحد أو تتجاوزه على تأجير القبول الذري والثقيل والمحلي للعملية قبل تحليل JSON (مسار BYTE، بما في ذلك `POST /v1/responses`). يستخدم آلية الإفلات نفسها عند توفر هامش سليم [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) كما في البُنى الثقيلة؛ ويظل مقيّدًا بواسطة `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) كي لا تعود المشكلة [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | حد أقصى صارم لمسارات الدردشة يُفرَض على وحدات البايت المقروءة أثناء الاستيعاب المحدود، بما في ذلك الطلبات التي تحتوي على `Content-Length` مفقود أو غير صالح أو غير صادق؛ ويتلقى ما يتجاوز الحد استجابة `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(غير مضبوط — لا يوجد حد أقصى لعدد الطلبات)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** لا يصبح الحد القديم القائم على عدد الطلبات نافذًا الآن إلا عند ضبطه صراحةً. وعند تركه غير مضبوط (وهو الإعداد الافتراضي)، يخضع قبول طلبات الدردشة الثقيلة بدلًا من ذلك إلى `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — وهي ميزانية BYTE مشتقة تلقائيًا ومحددة وفق حد الذاكرة الفعلي للعملية ضمن **عملية واحدة** (كومة V8 واحدة). يؤدي تداخل طلبين من `/v1/responses` بحجم نحو 750 ألف رمز مميز إلى انهيار أكوام بسعة نحو 12 Gi (#7849) — وهذا تحذير بشأن **ميزانية الذاكرة**، وليس حدًا أقصى ثابتًا للمنتج مقداره طلبان. يجوز لعملية سليمة (تكون فيها الكومة دون نسبة التخلص) قبول المزيد من طلبات `/v1/responses` الطويلة المتزامنة عبر `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. إن تشغيل عشرات عملاء SSE طويلي الأمد (40–50) تحكمه الكومة + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110، وليس «حدًا أقصى مقداره 2». تؤدي زيادة هذه القيمة عشوائيًا «لاستخدام المضيف» إلى إعادة ظهور #7849. ضاعف **الأكوام** باستخدام **N من `DATA_DIR` المستقلة** (#11024)؛ ولا تستخدم مطلقًا `replicas>1` مع ملف SQLite واحد. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(مشتقة تلقائيًا)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** قيمة لتجاوز ميزانية بايتات الإدخال المشتقة تلقائيًا (25% من الحد الأكثر تقييدًا لذاكرة V8/cgroup مقسومة على تضخيم مؤقت بمقدار 8x). تُقيَّد القيم المشتقة والصريحة ضمن نطاق 8 MiB–2 GiB. يفشل أي جسم طلب أكبر من الميزانية الفعلية فورًا مع `413 body_exceeds_budget`؛ أما التنافس بين أجسام الطلبات التي يمكن خدمتها كلٌ على حدة فيظل قابلًا لإعادة المحاولة مع `503`. إن تشغيل 40–50 عميل SSE طويل الأمد تحكمه هذه الميزانية + الكومة، وليس «حدًا أقصى مقداره 2». اقرأ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` عند `/api/monitoring/health` قبل الضبط. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | نسبة التخلص عند ضغط الكومة (`heapUsed / heap_size_limit`) لقبول الطلبات الثقيلة من نوعي BYTE وSTRUCTURE (#10183، #10268، #10437). لا يُتخلَّص من طلب ثقيل متزامن يتجاوز `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` باستخدام `503` القابل لإعادة المحاولة إلا عندما تكون الكومة أيضًا عند هذه النسبة أو أعلى منها؛ أما عند سلامة الكومة، فيُقبل عبر السعة الإضافية السليمة بدلًا من ذلك. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (القيمة الافتراضية `1`) | `src/shared/middleware/chatBodyAdmission.ts` | سعة إضافية محدودة للمسار السريع عند سلامة الكومة (#10437) لكلٍ من STRUCTURE وBYTE (`admitChatRequest`، بما في ذلك الأجسام التي يبلغ حجمها ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). من دون هذا الحد، كان كل طلب مشغول مع كومة سليمة يتجاوز آلية القبول بلا سقف. بمجرد تنشيط هذا العدد من عقود الإشغال المتزامنة عبر مسار الكومة السليمة، تنتقل الطلبات المشغولة الإضافية إلى مسار الانتظار المحدود/التخلص نفسه المستخدم تحت ضغط الكومة الحقيقي. تؤدي القيمة `0` إلى تعطيل التجاوز بالكامل. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | عدد الرسائل الذي يصنّف طلب الدردشة على أنه ثقيل حتى عندما يكون جسمه دون عتبة البايتات. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | عدد الأدوات الذي يصنّف طلب الدردشة على أنه ثقيل حتى عندما يكون جسمه دون عتبة البايتات. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | تقدير محافظ لعدد الرموز المميزة بناءً على حجم السلسلة النصية، ويصنّف الطلب على أنه ثقيل؛ وهو مؤشر بديل لتكلفة القبول، وليس آلية احتساب الرموز المميزة لفوترة المزوّد. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (معطّل) | `src/shared/middleware/chatBodyAdmission.ts` | حد اختياري لسجل الدردشة يتطلب تفعيلًا صريحًا. وهو معطّل افتراضيًا: فعدد الرسائل سياسة خاصة ببيئة النشر، وليس خاصية عامة للطلب، كما أن فرض حد هنا يرفض المحادثات نهائيًا باستخدام `413` قبل أن يتمكن مسار الضغط من جعلها قابلة للخدمة. يُقيَّد نمو الكومة بواسطة `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` وآلية التخلص عند ضغط الكومة. اضبط قيمة موجبة في بيئات النشر محدودة الذاكرة التي تحتاج إلى سقف ثابت؛ وعندها تتلقى الطلبات الزائدة استجابة `413` منظّمة تفيد بضرورة الضغط. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | حد ثابت لاستجابة غير متدفقة من المنبع يجري تخزينها مؤقتًا بالكامل في الذاكرة. عند تجاوز هذا الحد، يُلغى قارئ المنبع ويفشل الطلب بسرعة بدلًا من استمرار نمو سلسلة نصية بلا حدود حتى نفاد الكومة. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | الحد الأقصى لبايتات النقل المعاد توجيهها من ترويسات استجابة المنبع. عند تجاوز الميزانية، تُحذف الترويسات ذات الأولوية الأقل (مثل `x-codex-*` المخصصة و`x-oai-request-id`) للبقاء ضمن حدود ترويسات الوكيل العكسي الشائعة. اضبط قيمة أعلى لإعادة توجيه المزيد من بيانات المنبع الوصفية على حساب زيادة حجم ترويسات الاستجابة. | -| `CORS_ORIGIN` | _(غير معيّن)_ | `src/server/cors/origins.ts` | قائمة سماح CORS القديمة ذات الأصل الواحد. يُفضّل استخدام `CORS_ALLOWED_ORIGINS` لعمليات النشر الجديدة. يُستخدم CORS فقط لعملاء API في المتصفح عبر أصول مختلفة؛ أما عمليات الكتابة الموثّقة في لوحة المعلومات فتستخدم طلبات من الأصل نفسه بالإضافة إلى حماية CSRF مرتبطة بالجلسة. | -| `CORS_ALLOWED_ORIGINS` | _(غير معيّن)_ | `src/server/cors/origins.ts` | قائمة سماح CORS مفصولة بفواصل. لا يُرسل حرف بدل ما لم تتم تهيئة `CORS_ALLOW_ALL=true` صراحةً. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | خيار تجاوز مخصّص للتطوير فقط، يعكس أي قيمة `Origin` من المتصفح. لا تُمكّنه في عمليات النشر المشتركة أو الإنتاجية. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | حظر استدعاءات المزوّد التي تستهدف نطاقات عناوين IP الخاصة أو عناوين الاسترجاع أو العناوين المحلية للرابط. لا تُعطّله إلا في بيئات اختبار معزولة. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | السماح بعناوين URL للمزوّد التي تشير إلى شبكات خاصة/محلية (localhost و192.168.x.x و10.x.x.x وما إلى ذلك). **مطلوب للمزوّدين المستضافين ذاتيًا** (LM Studio وOllama وvLLM وLlamafile وTriton وSearXNG). عندما تكون القيمة `false`، ترفض لوحة المعلومات التحقق من صحة عناوين URL المحلية. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | السماح بإضافة المزوّدين على عناوين محلية/خاصة (127.0.0.1 وlocalhost وLAN والنطاقات الخاصة) والتحقق من صحتهم — ضمن نطاق مسار التحقق من صحة المزوّد. **القيمة الافتراضية `true`** (الأولوية للمحلي)؛ اضبطها على `false` لفرض حظر صارم يقتصر على العناوين العامة. تظل نقاط نهاية بيانات تعريف السحابة (169.254.169.254 وmetadata.google.internal) محظورة بغض النظر عن ذلك. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | السماح لمسارات `/v1/audio/*` (النسخ والكلام والترجمات) باستخدام عقدة مزوّد متوافقة مع OpenAI ومستضافة خارج localhost. يكون هذا الخيار معطّلًا افتراضيًا — فتوجيه الصوت إلى مضيف بعيد يغيّر هوية الخروج، ويجب أن يكون قرارًا صريحًا من المشغّل. يُسمح دائمًا بعُقد الاسترجاع/العُقد الخاصة (localhost و127.0.0.1 و172.16-31.x)، ولا تتأثر بهذا الإعداد. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | عند تمكين OIDC، عطّل تسجيل الدخول بكلمة المرور بحيث لا يتمكن المستخدمون من المصادقة إلا عبر تسجيل الدخول الموحّد باستخدام OIDC. يُقبل أيضًا الاسم البديل المجرّد `OIDC_DISABLE_PASSWORD_LOGIN`؛ وتكون لعلامة ميزة لوحة المعلومات التي تحمل المفتاح نفسه الأولوية. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | الاسم البديل المجرّد لـ`OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | - -### قائمة التحقق من التقوية الأمنية +| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | +| ------------------------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | قيمة salt تُدمج مع معرّفات الأجهزة لإنشاء بصمة الجهاز. غيّرها لكل عملية نشر لضمان العزل. | +| `OMNIROUTE_CLI_SALT` | _(غير معيّن = قيمة salt عشوائية لكل تثبيت، محفوظة في `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | قيمة salt لخوارزمية HMAC لاشتقاق رمز مصادقة CLI المحلي. يؤدي تعيين هذه القيمة إلى تدوير جميع رموز CLI على الجهاز، وتكون لها دائمًا الأولوية على قيمة salt المحفوظة. راجع `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | يعيّن العلامة `Secure` في ملفات تعريف ارتباط الجلسة. **يجب أن تكون `true`** عند التشغيل خلف HTTPS. | +| `REQUIRE_API_KEY` | `false` | البرمجيات الوسيطة لـ API | عندما تكون `true`، يجب أن تتضمن جميع طلبات الوكيل `/v1/*` مفتاح API صالحًا. **لا تتحكم هذه العلامة في `GET /v1/models`**، إذ يتبع بدلًا من ذلك وضع تسجيل الدخول إلى لوحة المعلومات (`requireAuthForModels`) — لذلك فإن الاستجابة `401` من `/v1/models` لا تعني أن الاستدلال محمي. راجع `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | يسمح بعرض قيم مفاتيح API كاملة في واجهة مستخدم لوحة المعلومات. يمكن تهيئته من علامات الميزات في لوحة المعلومات؛ ويمثل خطرًا أمنيًا على النسخ المشتركة. | +| `NO_LOG_API_KEY_IDS` | _(فارغ)_ | `src/lib/compliance/index.ts` | معرّفات مفاتيح API مفصولة بفواصل تتجاوز تسجيل الطلبات (للامتثال للائحة GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(غير معيّن = غير محدود)_ | `src/shared/utils/apiKeyPolicy.ts` | ميزانية طلبات احتياطية يومية تُطبّق على مفاتيح API التي يكون عمود `rate_limits` لها فارغًا. غير معيّن أو فارغ: لا يوجد حد ضمني (#2289، #11017). القيمة `0` لها المعنى نفسه (غير محدود). يفعّل العدد الصحيح الموجب N حدود N/يوم و5N/أسبوع و20N/شهر. تعود القيم غير الفارغة والمشوّهة إلى النوافذ القديمة: 1000/يوم و5000/أسبوع و20000/شهر. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | الحد الأقصى المسموح به لحجم نص الطلب. يرفض الحمولات التي تتجاوز هذا الحد. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | تحصل نصوص الطلبات الفعلية التي تساوي هذه العتبة أو تتجاوزها على حجز القبول الذري محلي العملية للأحمال الثقيلة قبل تحليل JSON (مسار BYTE، بما في ذلك `POST /v1/responses`). يستخدم مسار الإفلات نفسه في حال توافر هامش سعة سليم كما في [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) للطلبات الثقيلة من حيث البنية؛ ويظل مقيّدًا بـ `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) كي لا تعود المشكلة [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 ميغابايت) | `src/shared/middleware/chatBodyAdmission.ts` | حدّ صارم لمسار الدردشة يُفرض على عدد البايتات المقروءة أثناء الاستيعاب المحدود، بما في ذلك الطلبات ذات `Content-Length` المفقود أو غير الصالح أو غير الصادق؛ ويؤدي التجاوز إلى تلقي `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(غير معيّن — لا يوجد حدّ لعدد الطلبات)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** لا يعود هذا الحدّ القديم لعدد الطلبات نافذًا إلا عند تعيينه صراحةً. وعند تركه غير معيّن (وهو الافتراضي)، يُضبط قبول طلبات الدردشة الثقيلة بدلًا من ذلك بواسطة `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — وهي ميزانية بايتات مشتقة تلقائيًا ومحددة وفق سقف الذاكرة الفعلي للعملية في **عملية واحدة** (كومة V8 واحدة). يؤدي تداخل طلبي `/v1/responses` بحجم يقارب 750 ألف رمز إلى انهيار أكوام بحجم يقارب 12 غيغابايت (#7849) — وهذا تحذير بشأن **ميزانية الذاكرة**، وليس حدًا أقصى ثابتًا للمنتج قدره 2. يجوز لعملية سليمة (تكون فيها الكومة دون نسبة التخلص من الحمل) قبول مزيد من طلبات `/v1/responses` الطويلة المتزامنة عبر `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. وجود عشرات عملاء SSE طويلي الاتصال (40–50) تحكمه الكومة + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110، وليس «حد أقصى 2». تؤدي زيادة هذه القيمة دون تمحيص بهدف «استخدام المضيف» إلى إعادة ظهور #7849. ضاعف **الأكوام** باستخدام **N من `DATA_DIR` المستقلة** (#11024)؛ ولا تستخدم مطلقًا `replicas>1` مع ملف SQLite واحد. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(مشتقة تلقائيًا)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** تجاوز لميزانية بايتات الاستيعاب المشتقة تلقائيًا (25% من الحد الأكثر تقييدًا لذاكرة V8/cgroup مقسومة على تضخيم مؤقت بمقدار 8x). تُقيّد القيم المشتقة والصريحة ضمن نطاق 8 ميبيبايت–2 غيبيبايت. يفشل الجسم الأكبر من الميزانية الفعلية فورًا مع `413 body_exceeds_budget`؛ أما التنافس بين الأجسام التي يمكن خدمتها كلٌّ على حدة فيظل قابلًا لإعادة المحاولة مع `503`. وجود 40–50 عميل SSE طويل الاتصال ومتزامن تحكمه هذه الميزانية + الكومة، وليس حدًا ثابتًا قدره «2 كحد أقصى». اقرأ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` في `/api/monitoring/health` قبل الضبط. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | نسبة التخلص من الحمل عند ضغط الكومة (`heapUsed / heap_size_limit`) لقبول الطلبات الثقيلة من نوع BYTE وSTRUCTURE ‏(#10183، #10268، #10437). لا يُتخلّص من طلب ثقيل متزامن يتجاوز `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` باستخدام `503` القابل لإعادة المحاولة إلا عندما تكون الكومة **أيضًا** عند هذه النسبة أو أعلى منها؛ أما مع كومة سليمة، فيُقبل عبر السعة الإضافية السليمة بدلًا من ذلك. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (الافتراضي `1`) | `src/shared/middleware/chatBodyAdmission.ts` | سعة إضافية محدودة للمسار السريع ذي الكومة السليمة (#10437) لكلٍ من STRUCTURE وBYTE (`admitChatRequest`، بما في ذلك الأجسام ذات الحجم ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). من دون هذا الحد، كان كل طلب مشغول لكن ذا كومة سليمة يتجاوز آلية القبول دون سقف. وبمجرد أن ينشط هذا العدد من عقود الإشغال المتزامنة عبر مسار الكومة السليمة، تنتقل الطلبات المشغولة الإضافية إلى مسار الانتظار المحدود/التخلص من الحمل **نفسه** المستخدم تحت ضغط الكومة الفعلي. تؤدي القيمة `0` إلى تعطيل التجاوز بالكامل. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | عدد الرسائل الذي يصنّف طلب دردشة باعتباره ثقيلًا حتى عندما يكون جسمه دون حد البايتات. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | عدد الأدوات الذي يصنّف طلب دردشة باعتباره ثقيلًا حتى عندما يكون جسمه دون حد البايتات. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | تقدير محافظ لعدد الرموز استنادًا إلى حجم السلسلة النصية، ويصنّف الطلب باعتباره ثقيلًا؛ وهو مؤشر تقريبي لتكلفة القبول، وليس ترميز الفوترة الخاص بمزوّد الخدمة. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (معطّل) | `src/shared/middleware/chatBodyAdmission.ts` | حد اختياري لسجل الدردشة يتطلب الاشتراك الصريح. وهو معطّل افتراضيًا: إذ إن عدد الرسائل سياسة نشر، وليس خاصية عامة للطلب، كما أن فرض حد هنا يرفض المحادثات نهائيًا باستخدام `413` قبل أن يتمكن مسار الضغط من جعلها قابلة للخدمة. يُحد نمو الكومة بواسطة `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` وآلية التخلص من الحمل عند ضغط الكومة. عيّن قيمة موجبة في عمليات النشر المقيّدة بالذاكرة التي تحتاج إلى سقف صارم؛ وعندها يؤدي التجاوز إلى تلقي استجابة `413` منظّمة تفيد بضرورة الضغط. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 ميغابايت) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | حد صارم لاستجابة منبع غير متدفقة تُخزّن مؤقتًا بالكامل في الذاكرة. عند تجاوزه، تُلغى قراءة المنبع ويفشل الطلب سريعًا بدلًا من تنمية سلسلة نصية غير محدودة حتى نفاد الكومة. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | الحد الأقصى لعدد البايتات المنقولة عبر الشبكة والمُمرَّرة من ترويسات استجابة المنبع. عند تجاوز الحد، تُحذف الترويسات ذات الأولوية الأقل (مثل `x-codex-*` و`x-oai-request-id`) للبقاء ضمن حدود أحجام الترويسات الشائعة في الوكلاء العكسيين. اضبطه على قيمة أعلى لتمرير المزيد من البيانات الوصفية للمنبع، على حساب زيادة حجم ترويسات الاستجابة. | +| `CORS_ORIGIN` | _(غير معيّن)_ | `src/server/cors/origins.ts` | قائمة سماح CORS قديمة لأصل واحد. يُفضّل استخدام `CORS_ALLOWED_ORIGINS` لعمليات النشر الجديدة. يُستخدم CORS فقط لعملاء واجهة API في المتصفح من أصول مختلفة؛ أما عمليات الكتابة المصادَق عليها في لوحة المعلومات فتستخدم طلبات من الأصل نفسه بالإضافة إلى حماية CSRF مرتبطة بالجلسة. | +| `CORS_ALLOWED_ORIGINS` | _(غير معيّن)_ | `src/server/cors/origins.ts` | قائمة سماح CORS مفصولة بفواصل. لا تُرسل علامة بدل ما لم يُضبط `CORS_ALLOW_ALL=true` صراحةً. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | آلية تجاوز مخصصة للتطوير تُعيد أي قيمة `Origin` من المتصفح. لا تفعّلها في عمليات النشر المشتركة أو الإنتاجية. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | حظر استدعاءات المزوّد التي تستهدف نطاقات عناوين IP الخاصة أو عناوين الاسترجاع أو الارتباط المحلي. عطّلها فقط في بيئات الاختبار المعزولة. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | السماح بعناوين URL للمزوّد التي تشير إلى شبكات خاصة/محلية (localhost و192.168.x.x و10.x.x.x وما إلى ذلك). **مطلوب للمزوّدين المستضافين ذاتيًا** (LM Studio وOllama وvLLM وLlamafile وTriton وSearXNG). عندما تكون القيمة `false`، ترفض لوحة المعلومات التحقق من صحة عناوين URL المحلية. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | السماح بإضافة المزوّدين والتحقق منهم على العناوين المحلية/الخاصة (127.0.0.1 وlocalhost وLAN والنطاقات الخاصة) — ويقتصر ذلك على مسار التحقق من المزوّد. **القيمة الافتراضية `true`** (الأولوية للمحلي)؛ اضبطها على `false` لفرض حظر صارم يقتصر على العناوين العامة. تظل نقاط نهاية البيانات الوصفية السحابية (169.254.169.254 وmetadata.google.internal) محظورة بصرف النظر عن ذلك. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | السماح لمسارات `/v1/audio/*` (النسخ والكلام والترجمة) باستخدام عقدة مزوّد متوافقة مع OpenAI ومستضافة خارج localhost. تكون معطّلة افتراضيًا — فتوجيه الصوت إلى مضيف بعيد يغيّر هوية الخروج ويجب أن يكون قرارًا صريحًا من المشغّل. يُسمح دائمًا بعُقد الاسترجاع/العُقد الخاصة (localhost و127.0.0.1 و172.16-31.x)، ولا تتأثر بهذا الإعداد. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | السماح لـ`POST /v1/rerank` (وكذلك خطوة إعادة الترتيب عبر الاسترجاع في محرك الذاكرة) باستخدام عقدة مزوّد متوافقة مع OpenAI ومستضافة خارج localhost — مثل جهاز على LAN أو نظير Tailscale يشغّل TEI أوInfinity أوvLLM وما إلى ذلك. تكون معطّلة افتراضيًا — فتوجيه الطلب إلى مضيف بعيد يغيّر هوية الخروج ويجب أن يكون قرارًا صريحًا من المشغّل. يُسمح دائمًا بعُقد الاسترجاع (localhost و127.0.0.1 و172.16-31.x)، ولا تتأثر بهذا الإعداد. يجب أيضًا أن تجتاز العُقد البعيدة سياسة عناوين URL الصادرة للمزوّد (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`)؛ ولا تُوجَّه الطلبات مطلقًا إلى مضيفات البيانات الوصفية السحابية. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | عند تمكين OIDC، عطّل تسجيل الدخول بكلمة المرور بحيث لا يمكن للمستخدمين المصادقة إلا عبر تسجيل الدخول الأحادي باستخدام OIDC. يُقبل أيضًا الاسم البديل المجرّد `OIDC_DISABLE_PASSWORD_LOGIN`؛ وتكون لعلامة ميزة لوحة المعلومات التي تحمل المفتاح نفسه الأولوية. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | الاسم البديل المجرّد لـ`OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | + +### قائمة التحقق من التحصين ```bash # الحد الأدنى لأمان بيئة الإنتاج: @@ -253,7 +253,7 @@ AUTH_COOKIE_SECURE=true # يتطلب HTTPS REQUIRE_API_KEY=true # مصادقة جميع استدعاءات الوكيل ALLOW_API_KEY_REVEAL=false # عدم كشف المفاتيح مطلقًا في واجهة المستخدم CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # حد قدره 5 MB +MAX_BODY_SIZE_BYTES=5242880 # حد يبلغ 5 MB ``` --- @@ -301,59 +301,66 @@ MAX_BODY_SIZE_BYTES=5242880 # حد قدره 5 MB ## 6. سياسات الأدوات والتوجيه -| المتغير | القيمة الافتراضية | الملف المصدر | الوصف | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | يتحكم في وصول LLM إلى استدعاء الأدوات/الدوال. `allowlist` = الأدوات المدرجة فقط، و`denylist` = جميع الأدوات باستثناء المدرجة، و`disabled` = بلا قيود. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | مسار ملف JSON لقواعد معالجة الحمولة (تعديلات خاصة بكل نموذج/بروتوكول لدى الجهة المزوّدة). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | الفاصل الزمني لإعادة التحميل (بالمللي ثانية) لإعادة تحميل ملف قواعد الحمولة أثناء التشغيل. الحد الأدنى `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | إعداد اختياري: يوجّه معرّفات نماذج `claude-*` المجرّدة من عملاء Claude Code عبر حساب OAuth الخاص بـ Claude Code بدلًا من اشتراط بادئة المزوّد. تظل لبادئات المزوّد الصريحة الأولوية. يمكن أيضًا ضبطه عبر مفتاح تبديل في لوحة المعلومات ضمن صفحة مزوّد Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | الحد الأقصى للتزامن لكل نموذج في التركيبات ذات التناوب الدوري (#9100). كان سيمافور التركيبة ذات التناوب الدوري مقيّدًا بشكل ثابت عند 3 طلبات متزامنة لكل نموذج من دون إمكانية تجاوز، مما كان يؤدي إلى تسلسل حركة المرور الأعلى تزامنًا خلف ذلك الحد. يتم التحقق من أن القيمة `>= 1` وتقييدها لتكون `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | إعداد اختياري خطير يتجاوز فحص OmniRoute المحلي لنافذة السياق / الحد الأقصى لرموز الإدخال للطلبات المباشرة إلى نموذج واحد. تظل الجهات المزوّدة تفرض حدودها الفعلية؛ كما يظل ضغط الموجّه والحد الأقصى لرموز إخراج النموذج مفعّلين. ترتيب الأولوية الفعلي هو: تجاوز قاعدة بيانات Feature Flags > متغير البيئة > القيمة الافتراضية؛ ولا تلزم إعادة التشغيل. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(غير معيّن)_ | `open-sse/services/conversationTracker.ts` | اضبطه على `1` لإيقاف جمع سجل المحادثات. تعيد `resolveConversationId()` نتيجة غير متتبعة قبل أن تقرأ SQLite أو تحلل سجل الرسائل، ويشمل ذلك أيضًا معرّفات الجلسات المقدمة من العميل. تظل معالجة جلسة التوجيه دون تغيير ولا تُحذف السجلات الحالية. هذا مخصص لعمليات النشر التي لا تستخدم عرض المحادثات في لوحة المعلومات وتريد إيقاف نمو جدول الأدوار. | +| المتغير | القيمة الافتراضية | الملف المصدر | الوصف | +| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | يتحكم في وصول نموذج اللغة الكبير إلى الأدوات/استدعاء الدوال. `allowlist` = الأدوات المدرجة فقط، و`denylist` = جميع الأدوات باستثناء المدرجة، و`disabled` = بلا قيود. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | مسار ملف JSON لقواعد معالجة الحمولة (تعديلات خاصة بكل نموذج/بروتوكول لخدمات المنبع). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | الفاصل الزمني لإعادة التحميل (بالمللي ثانية) لإعادة التحميل الفوري لملف قواعد الحمولة. الحد الأدنى `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | خيار اشتراك: يوجّه معرّفات النماذج المجردة `claude-*` الواردة من عملاء Claude Code عبر حساب OAuth الخاص بـ Claude Code بدلًا من اشتراط بادئة لمزوّد الخدمة. تظل لبادئات مزوّدي الخدمة الصريحة الأولوية. يمكن أيضًا ضبطه عبر مفتاح تبديل في لوحة المعلومات ضمن صفحة مزوّد Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | الحد الأقصى للتزامن لكل نموذج في التركيبات ذات التناوب الدوري (#9100). كان محدِّد التزامن للتركيبات ذات التناوب الدوري مقيّدًا بشكل ثابت عند 3 طلبات متزامنة لكل نموذج دون إمكانية تجاوز ذلك، مما كان يؤدي إلى تسلسل حركة المرور الأعلى تزامنًا خلف هذا الحد. يتم التحقق من أن القيمة `>= 1` وتقييدها لتكون `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | خيار اشتراك خطير يتجاوز فحص OmniRoute المحلي لنافذة السياق/الحد الأقصى لرموز الإدخال في طلبات النموذج الواحد المباشرة. تظل خدمات المنبع تفرض حدودها الفعلية؛ كما يظل ضغط المطالبة والحد الأقصى لرموز إخراج النموذج نشطين. ترتيب الأولوية الفعلي هو تجاوز قاعدة بيانات علامات الميزات > متغير البيئة > القيمة الافتراضية؛ ولا تلزم إعادة التشغيل. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(غير معيّن)_ | `open-sse/services/selfHostedEntry.ts` | مستند YAML مضمّن من نوع `providers:` ‏(RIC-738، D4). عند تعيينه (سواء مع كتلة `strategy:` أو بدونها)، يتم تحويل `/v1/chat/completions` إلى نقطة الدخول الموحدة ذاتية الاستضافة والمتوافقة مع OpenAI بدلًا من مسار المعالجة السحابي. عند عدم تعيينه (وهو الوضع الافتراضي): يمر المسار مباشرةً إلى مسار المعالجة السحابي الحالي. راجع `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(غير معيّن)_ | `open-sse/services/selfHostedEntry.ts` | مسار إلى ملف YAML يحتوي على مستند `providers:` نفسه الموجود في `OMNIROUTE_SELF_HOSTED_PROVIDERS`، لعمليات النشر التي تفضّل استخدام ملف بدلًا من متغير بيئة مضمّن. يؤدي تعيين أيٍّ منهما إلى تفعيل نقطة الدخول ذاتية الاستضافة. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(غير معيّن — المسار مفتوح)_ | `open-sse/services/selfHostedEntry.ts` | مفتاح API مشترك اختياري لنقطة الدخول الموحدة ذاتية الاستضافة (هيكل D5 الأولي، محجوز لنظام الحصص لكل مفتاح). عند تعيينه، يجب أن تتضمن الطلبات `Authorization: Bearer `. عند عدم تعيينه: يكون المسار مفتوحًا، بما يتطابق مع نمط مزوّد الخدمة المحلي ذاتي الاستضافة الحالي (النشر عبر loopback/شبكة موثوقة). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(غير معيّن)_ | `open-sse/services/routingStrategies.ts` | مستند YAML مضمّن من نوع `strategy:` لمحرك التوجيه الحتمي (M2/RIC-740، D3) — القائمة السوداء/القائمة البيضاء، وقاطع فترة التهدئة، وأولوية التكلفة، ومراعاة زمن الاستجابة، وسلسلة الرجوع الاحتياطي. يتجاوز كتلة `strategy:` مضمّنة ومتداخلة داخل `OMNIROUTE_SELF_HOSTED_PROVIDERS`، لكل مفتاح. راجع `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(غير معيّن)_ | `open-sse/services/routingStrategies.ts` | مسار إلى ملف YAML يحتوي على مستند `strategy:` نفسه الموجود في `OMNIROUTE_SELF_HOSTED_STRATEGY`، لعمليات النشر التي تفضّل استخدام ملف بدلًا من متغير بيئة مضمّن. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(غير معيّن)_ | `open-sse/services/conversationTracker.ts` | اضبطه على `1` لإيقاف جمع سجل المحادثات. تُرجع `resolveConversationId()` نتيجة غير متتبَّعة قبل قراءة SQLite أو تحليل سجل الرسائل، ويشمل ذلك أيضًا معرّفات الجلسات المقدَّمة من العميل. تظل معالجة جلسات التوجيه دون تغيير، ولا تُحذف السجلات الحالية. مخصّص لعمليات النشر التي لا تستخدم عرض المحادثات في لوحة المعلومات وترغب في إيقاف نمو جدول الأدوار. | --- ## 7. عناوين URL والمزامنة السحابية -| المتغير | القيمة الافتراضية | ملف المصدر | الوصف | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | عنوان URL من جانب الخادم لتستدعي مهام المزامنة الداخلية المسار `/api/sync/cloud`. أبقِ هذا العنوان كعنوان استرجاع حلقي/حاوية حتى عند تمرير التطبيق علنًا عبر وكيل. | -| `CLOUD_URL` | _(فارغ)_ | `src/lib/cloudSync.ts` | عنوان URL لنقطة نهاية ترحيل السحابة (ميزة مدفوعة). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | مهلة HTTP لطلبات المزامنة السحابية. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | إعداد بناء Webpack | ملف تعريف وقت البناء (اضبطه على `minimal` لاستبعاد الوحدات ذات الامتيازات فعليًا من الحزمة). | -| `OMNIROUTE_STANDALONE_DIR` | _مخرجات standalone في .build/_ | `scripts/build/colocate-standalone.mjs` | تجاوز وقت البناء لدليل مخرجات standalone الذي تستهلكه خطوة التجميع المشترك التالية للبناء. ليس إعدادًا لوقت التشغيل. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(فارغ)_ | `src/lib/cloudSync.ts` | السر المشترك المستخدم للتحقق من توقيع HMAC-SHA256 لاستجابات Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | اضبطه على `true` للسماح لنقطة نهاية Cloud Sync بالكتابة فوق بيانات الاعتماد المحلية. القيمة الافتراضية هي `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | اضبطه على `true` لرفض استجابة Cloud Sync غير الموقعة عند عدم تكوين سر محلي (#13679). يُتحقق دائمًا من أي توقيع موجود — ويُرفض دائمًا عندما لا يكون `OMNIROUTE_CLOUD_SYNC_SECRET` معينًا — بصرف النظر عن هذه العلامة. ستصبح القيمة الافتراضية مفروضة في v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | اضبطه على `true` للرجوع إلى سلوك "استيراد كل شيء" بخطوة واحدة في v3.8.5 من دون تأكيد المستخدم. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth، لوحة المعلومات، المزامنة | عنوان URL المتاح للعامة من أجل OAuth redirect_uri وروابط لوحة المعلومات وعناوين URL العامة المُنشأة. اضبطه على عنوان URL العام الثابت عندما يجب أن تستخدم استدعاءات OAuth الراجعة أو روابط المتصفح المُنشأة مضيف وكيل عكسي قياسيًا. | -| `NEXT_PUBLIC_CLOUD_URL` | _(فارغ)_ | جانب العميل | النسخة المناظرة من جانب العميل لـ `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(غير معيّن)_ | `src/shared/services/cloudSyncScheduler.ts` | خيار احتياطي قديم لـ `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(غير معيّن)_ | محلل الأصل العام، عناوين URL للصور | أصل OmniRoute الموجّه للمتصفح ذو الأولوية القصوى، والمستخدم لإنشاء عناوين URL العامة والتحقق من أصل المتصفح خارج لوحة المعلومات. اضبطه عندما يصل OpenWebUI أو مُرحِّل آخر إلى OmniRoute عبر عنوان URL داخلي، لكن يجب على متصفح المستخدم جلب الوسائط المُنشأة من أصل على الشبكة المحلية أو نفق أو أصل عام. **لا** تُضمّن `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(غير معيّن)_ | `open-sse/config/providerPluginManifestUrl.ts` | عنوان URL مطلق لبيان المكوّن الإضافي للمزوّد، يُعلَن لعملاء sidecar. عندما لا يكون معيّنًا، يشتق OmniRoute المسار `/api/v1/provider-plugin-manifest` من أصل الطلب أو HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | البروتوكول المستخدم عند اشتقاق عنوان URL لبيان المكوّن الإضافي للمزوّد من HOST/PORT من دون أصل للطلب. اضبطه على `https` خلف وكيل عام ينهي TLS عندما لا يكون `OMNIROUTE_PROVIDER_MANIFEST_URL` معيّنًا صراحةً. | -| `OMNIROUTE_TRUST_PROXY` | _(غير معيّن)_ | `src/server/origin/publicOrigin.ts` | وضع ثقة اختياري لترويسات الأصل العام المُمررة. غير معيّن = عدم الوثوق بـ `Forwarded` / `X-Forwarded-*` في القرارات الأمنية. يثق `true` / `loopback` بالمضيف/البروتوكول المُمررَين فقط من وكيل استرجاع حلقي موسوم برمز مميز. يثق `private` / `lan` أيضًا بأقران الوكيل على الشبكة المحلية الخاصة. يُفضّل استخدام `NEXT_PUBLIC_BASE_URL` صراحةً في بيئة الإنتاج. | -| `KIE_CALLBACK_URL` | _(غير معيّن)_ | `open-sse/utils/kieTask.ts` | عنوان URL عام للاستدعاء الراجع لمهام kie.ai غير المتزامنة. تجاوز ذو أولوية قصوى قبل `OMNIROUTE_KIE_CALLBACK_URL` و`OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(غير معيّن)_ | `open-sse/utils/kieTask.ts` | صياغة بديلة لـ `KIE_CALLBACK_URL`. يُستخدم كخيار احتياطي عندما لا يكون المتغير الأساسي معيّنًا. | -| `OMNIROUTE_PUBLIC_URL` | _(غير معيّن)_ | `open-sse/utils/kieTask.ts` | الأصل العام المستخدم لإنشاء عناوين URL للاستدعاءات الراجعة غير المتزامنة. الخيار الاحتياطي ذو الأولوية الدنيا لاستدعاءات kie.ai الراجعة؛ ويُستخدم أيضًا كعنوان URL عام للمرحّلات الأخرى. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | نقطة نهاية الاستعلام عن حصة CrofAI التي تستخدمها صفحة الاستخدام. يمكن تجاوزها للمرحّلات / تجهيزات الاختبار. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | نقطة نهاية الاستخدام الرسمية لـ OpenCode Go والمصادَق عليها بمفتاح API، التي تستخدمها صفحة الاستخدام. يمكن تجاوزها للمرحّلات / تجهيزات الاختبار. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | يُنشئ ترويسات هوية OpenCode CLI (`User-Agent` و`x-opencode-client/project` ومعرّفات UUID للطلب/الجلسة) في طلبات opencode-go/zen الصاعدة التي لم يرسلها العميل، كي يقبلها Cloudflare عند الخروج من VPS (#6210/#5997). مفعّل افتراضيًا منذ #10571؛ عطّله باستخدام `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | قيمة `User-Agent` الافتراضية المستخدمة عندما يكون `OPENCODE_SYNTHESIZE_CLI_HEADERS` مفعّلًا ولا يكون تجاوز `_USER_AGENT` الخاص بالمزوّد معيّنًا. تُطبّق فقط على منفّذات opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | قيمة الترويسة المُنشأة `x-opencode-client` عندما يكون `OPENCODE_SYNTHESIZE_CLI_HEADERS` مفعّلًا. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | قيمة الترويسة المُنشأة `x-opencode-project` عندما يكون `OPENCODE_SYNTHESIZE_CLI_HEADERS` مفعّلًا. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | عنوان URL لإعدادات Ollama Cloud المستخدم لاستخراج بيانات الحصة. يمكن تجاوزه للمرحّلات / تجهيزات الاختبار. | -| `OLLAMA_USAGE_COOKIE` | _(غير معيّن)_ | `open-sse/services/usage.ts` | ملف تعريف الارتباط `__Secure-session` لـ Ollama Cloud، المستخدم لاستخراج بيانات الحصة من صفحة الإعدادات. حساس؛ يُفضّل حقل لوحة المعلومات الخاص بكل اتصال عند تكوين حسابات متعددة. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(غير معيّن)_ | `open-sse/services/usage.ts` | متغير بيئة بديل لملف تعريف الارتباط `__Secure-session` لـ Ollama Cloud. حساس؛ يُفضّل حقل لوحة المعلومات الخاص بكل اتصال عند تكوين حسابات متعددة. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(غير معيّن)_ | `open-sse/services/usage.ts` | متغير بيئة بديل لملف تعريف الارتباط `__Secure-session` لـ Ollama Cloud، ويُستخدم قبل الأسماء البديلة الأقصر. حساس؛ يُفضّل حقل لوحة المعلومات الخاص بكل اتصال عند تكوين حسابات متعددة. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | نقطة نهاية حدود استخدام CodeWhisperer ‏(AWS Kiro). يمكن تجاوزها للمرحّلات / تجهيزات الاختبار. | +| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | عنوان URL من جانب الخادم، تستخدمه مهام المزامنة الداخلية لاستدعاء `/api/sync/cloud`. أبقِ هذا العنوان عنوانًا للحاوية/الاسترجاع الحلقي حتى عند توفير التطبيق للعامة عبر وكيل. | +| `CLOUD_URL` | _(فارغ)_ | `src/lib/cloudSync.ts` | عنوان URL لنقطة نهاية ترحيل المزامنة السحابية (ميزة مدفوعة). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | مهلة HTTP لطلبات المزامنة السحابية. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | إعداد بناء Webpack | ملف تعريف وقت البناء (اضبطه على `minimal` لاستبعاد الوحدات ذات الصلاحيات فعليًا من الحزمة). | +| `OMNIROUTE_STANDALONE_DIR` | _مخرجات `.build/` المستقلة_ | `scripts/build/colocate-standalone.mjs` | تجاوز في وقت البناء لدليل المخرجات المستقلة الذي تستخدمه خطوة التجميع المشترك اللاحقة للبناء. ليس إعدادًا لوقت التشغيل. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(فارغ)_ | `src/lib/cloudSync.ts` | السر المشترك المستخدم للتحقق من توقيع HMAC-SHA256 لاستجابات المزامنة السحابية. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | اضبطه على `true` للسماح لنقطة نهاية المزامنة السحابية بالكتابة فوق بيانات الاعتماد المحلية. القيمة الافتراضية هي `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | اضبطه على `true` لرفض استجابة مزامنة سحابية غير موقعة عند عدم تكوين سر محلي (#13679). يُتحقق دائمًا من أي توقيع موجود — ويُرفض دائمًا عند عدم تعيين `OMNIROUTE_CLOUD_SYNC_SECRET` — بصرف النظر عن هذه العلامة. ستتغير القيمة الافتراضية إلى فرض التوقيع في v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | اضبطه على `true` للرجوع إلى سلوك v3.8.5 ذي الخطوة الواحدة «استيراد كل شيء» دون تأكيد المستخدم. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth، لوحة المعلومات، المزامنة | عنوان URL العام لعنوان OAuth `redirect_uri`، وروابط لوحة المعلومات، وعناوين URL العامة المُنشأة. اضبطه على عنوان URL العام الثابت عندما يجب أن تستخدم استدعاءات OAuth أو روابط المتصفح المُنشأة مضيف وكيل عكسي أساسيًا. | +| `NEXT_PUBLIC_CLOUD_URL` | _(فارغ)_ | جانب العميل | نسخة مطابقة من جانب العميل لـ `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(غير معيّن)_ | `src/shared/services/cloudSyncScheduler.ts` | خيار احتياطي قديم لـ `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(غير معيّن)_ | محلّل الأصل العام، عناوين URL للصور | أصل OmniRoute الموجّه للمتصفح ذو الأولوية القصوى، ويُستخدم لإنشاء عناوين URL العامة والتحقق من أصل المتصفح خارج لوحة المعلومات. عيّن هذا عندما يصل OpenWebUI أو مُرحّل آخر إلى OmniRoute عبر عنوان URL داخلي، بينما يجب أن يجلب متصفح المستخدم الوسائط المُنشأة من شبكة LAN أو نفق أو أصل عام. **لا** تُضمّن `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(غير معيّن)_ | `open-sse/config/providerPluginManifestUrl.ts` | عنوان URL المطلق لبيان المكوّن الإضافي لمزوّد الخدمة، والذي يُعلَن لعملاء sidecar. عند عدم تعيينه، يشتق OmniRoute المسار `/api/v1/provider-plugin-manifest` من أصل الطلب أو HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | البروتوكول المستخدم عند اشتقاق عنوان URL لبيان المكوّن الإضافي لمزوّد الخدمة من HOST/PORT من دون أصل للطلب. عيّنه إلى `https` خلف وكيل عام ينهي TLS عند عدم تعيين `OMNIROUTE_PROVIDER_MANIFEST_URL` صراحةً. | +| `OMNIROUTE_TRUST_PROXY` | _(غير معيّن)_ | `src/server/origin/publicOrigin.ts` | وضع ثقة اختياري لترويسات الأصل العام المُمرّرة. غير معيّن = عدم الوثوق بـ `Forwarded` / `X-Forwarded-*` لاتخاذ القرارات الأمنية. يثق `true` / `loopback` بالمضيف/البروتوكول المُمرّرين فقط من وكيل loopback موسوم برمز مميّز. يثق `private` / `lan` أيضًا بأقران الوكيل ضمن شبكة LAN الخاصة. يُفضّل استخدام `NEXT_PUBLIC_BASE_URL` صراحةً في بيئة الإنتاج. | +| `KIE_CALLBACK_URL` | _(غير معيّن)_ | `open-sse/utils/kieTask.ts` | عنوان URL العام لمعاودة الاتصال لمهام kie.ai غير المتزامنة. تجاوز ذو أولوية قصوى قبل `OMNIROUTE_KIE_CALLBACK_URL` و`OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(غير معيّن)_ | `open-sse/utils/kieTask.ts` | صيغة بديلة لـ `KIE_CALLBACK_URL`. يُستخدم كخيار احتياطي عند عدم تعيين المتغيّر الأساسي. | +| `OMNIROUTE_PUBLIC_URL` | _(غير معيّن)_ | `open-sse/utils/kieTask.ts` | الأصل العام المستخدم لتكوين عناوين URL لمعاودة الاتصال غير المتزامنة. الخيار الاحتياطي ذو الأولوية الأدنى لمعاودات اتصال kie.ai؛ ويُستخدم أيضًا كعنوان URL عام لمُرحّلات أخرى. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | نقطة نهاية الاستعلام عن حصة CrofAI التي تستخدمها صفحة الاستخدام. يمكن تجاوزها للمُرحّلات / تجهيزات الاختبار. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | نقطة نهاية OpenCode Go الرسمية للمصادقة بمفتاح API والمستخدمة في صفحة الاستخدام. يمكن تجاوزها للمُرحّلات / تجهيزات الاختبار. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | يُنشئ ترويسات هوية OpenCode CLI (User-Agent وx-opencode-client/project ومعرّفات UUID للطلب/الجلسة) لطلبات opencode-go/zen الصاعدة التي لم يرسلها العميل، لكي تقبلها Cloudflare عند الخروج من VPS (#6210/#5997). مفعّل افتراضيًا منذ #10571؛ ويمكن تعطيله باستخدام `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | قيمة User-Agent الافتراضية المستخدمة عندما يكون `OPENCODE_SYNTHESIZE_CLI_HEADERS` مفعّلًا ولا يكون هناك تجاوز `_USER_AGENT` خاص بكل مزوّد. تُطبّق فقط على منفّذات opencode. في الطلبات بلا مفتاح التي تقيّدها الجهة الصاعدة، تُستبدل القيمة المضبوطة التي لا تتضمن `opencode/= 1.17>` بهذه القيمة الافتراضية بدلًا من رفضها. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | قيمة الترويسة `x-opencode-client` المُنشأة عندما يكون `OPENCODE_SYNTHESIZE_CLI_HEADERS` مفعّلًا. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | قيمة ترويسة `x-opencode-project` المُنشأة عند تفعيل `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(غير معيّن)_ | `open-sse/executors/opencodeFreeTierContract.ts` | اضبطه على `off` لإيقاف تعديل جسم طلبات OpenCode من دون مفتاح (علامة البث وقائمة الأدوات). تظل الترويسات مطبّقة. تُقرأ القيمة مع كل طلب، لذا يسري أي تغيير فورًا. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(غير معيّن)_ | `open-sse/executors/opencodeFreeTierContract.ts` | أسماء أدوات مفصولة بفواصل للإعلان عنها في طلب OpenCode من دون مفتاح لا يتضمن أي أدوات، عندما لا تكون قد رُصدت أي أدوات لذلك النموذج بعد. تؤدي القيمة الفارغة إلى استخدام عنصر نائب واحد يُطلب من النموذج عدم استدعائه. بحد أقصى 32 إدخالًا، `[A-Za-z_][A-Za-z0-9_-]{0,63}`؛ ويتم تجاهل الإدخالات غير الصالحة. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | عنوان URL لإعدادات Ollama Cloud المستخدم لاستخلاص بيانات الحصة. يمكن تجاوزه للمرحّلات / تجهيزات الاختبار. | +| `OLLAMA_USAGE_COOKIE` | _(غير معيّن)_ | `open-sse/services/usage.ts` | ملف تعريف ارتباط `__Secure-session` الخاص بـ Ollama Cloud والمستخدم لاستخلاص بيانات الحصة من صفحة الإعدادات. حساس؛ يُفضّل استخدام حقل لوحة المعلومات الخاص بكل اتصال عند تهيئة حسابات متعددة. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(غير معيّن)_ | `open-sse/services/usage.ts` | متغير بيئة بديل لملف تعريف ارتباط `__Secure-session` الخاص بـ Ollama Cloud. حساس؛ يُفضّل استخدام حقل لوحة المعلومات الخاص بكل اتصال عند تهيئة حسابات متعددة. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(غير معيّن)_ | `open-sse/services/usage.ts` | متغير بيئة بديل لملف تعريف ارتباط `__Secure-session` الخاص بـ Ollama Cloud يُستخدم قبل الأسماء المستعارة الأقصر. حساس؛ يُفضّل استخدام حقل لوحة المعلومات الخاص بكل اتصال عند تهيئة حسابات متعددة. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | نقطة نهاية حدود الاستخدام لـ CodeWhisperer ‏(AWS Kiro). يمكن تجاوزها للمرحّلات / تجهيزات الاختبار. | > [!IMPORTANT] -> عند النشر خلف وكيل عكسي (nginx، Caddy)، عيّن `NEXT_PUBLIC_BASE_URL` إلى عنوان URL العام الثابت لديك (مثل `https://omniroute.example.com`) عندما يجب أن تستخدم استدعاءات OAuth أو الروابط العامة المُنشأة اسم المضيف هذا. من دون ذلك، قد تفشل استدعاءات OAuth لأن `redirect_uri` لن يتطابق، وقد تشير الروابط العامة المُنشأة إلى مصدر الحاوية الداخلي. +> عند النشر خلف وكيل عكسي (nginx، Caddy)، اضبط `NEXT_PUBLIC_BASE_URL` على عنوان URL العام الثابت لديك (مثل `https://omniroute.example.com`) عندما يجب أن تستخدم استدعاءات OAuth الراجعة أو الروابط العامة المُنشأة اسم المضيف هذا. من دون ذلك، قد تفشل استدعاءات OAuth الراجعة لأن `redirect_uri` لن يتطابق، وقد تشير الروابط العامة المُنشأة إلى أصل الحاوية الداخلي. > -> أبقِ `BASE_URL` كعنوان URL داخلي للاسترجاع الحلقي/الحاوية للمهام من خادم إلى خادم. لا تستخدم `Origin` خاصًا بالمتصفح أو اسم مضيف عامًا لعمليات الجلب الذاتي الداخلية التي تحمل بيانات اعتماد. +> احتفظ بـ `BASE_URL` كعنوان URL داخلي للاسترجاع الحلقي/الحاوية لمهام الاتصال من خادم إلى خادم. لا تستخدم `Origin` خاصًا بالمتصفح أو اسم مضيف عامًا لعمليات الجلب الذاتي الداخلية التي تحمل بيانات اعتماد. > -> لا تتطلب عمليات الكتابة الموثَّقة في لوحة المعلومات عنوان URL عامًا ثابتًا: ترسل لوحة المعلومات الطلبات غير الآمنة من المصدر نفسه مع رمز CSRF مرتبط بالجلسة. لا يزال OmniRoute يجعل التحقق من المصدر العام مركزيًا لعمليات التكامل من المتصفح من خارج لوحة المعلومات: تُوثق متغيرات البيئة الصريحة لعناوين URL العامة أولًا؛ ويتم تجاهل ترويسات `Forwarded` / `X-Forwarded-*` الأولية ما لم يكن `OMNIROUTE_TRUST_PROXY` مُمكّنًا وكان نظير الوكيل المباشر موسومًا برمز على أنه موثوق. لا تستخدم إعدادات CORS لإصلاح طلبات لوحة المعلومات من المصدر نفسه؛ إذ إن CORS مخصص فقط لعملاء المتصفح من مصادر مختلفة. +> لا تتطلب عمليات الكتابة المصادَق عليها في لوحة المعلومات عنوان URL عامًا ثابتًا: ترسل لوحة المعلومات الطلبات غير الآمنة من الأصل نفسه مع رمز CSRF مرتبط بالجلسة. لا يزال OmniRoute يوحّد التحقق من الأصل العام لتكاملات المتصفح التي لا تستخدم لوحة المعلومات: تُوثق متغيرات بيئة عنوان URL العام الصريحة أولًا؛ ويتم تجاهل ترويسات `Forwarded` / `X-Forwarded-*` الأولية ما لم يكن `OMNIROUTE_TRUST_PROXY` مفعّلًا وكان نظير الوكيل المباشر موسومًا برمز مميز باعتباره موثوقًا. لا تستخدم إعدادات CORS لإصلاح طلبات لوحة المعلومات من الأصل نفسه؛ إذ إن CORS مخصص فقط لعملاء المتصفح عبر الأصول المختلفة. --- @@ -581,46 +588,47 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude ## 11. بيانات اعتماد موفّر OAuth -بيانات اعتماد مضمّنة **للتطوير على localhost**. بالنسبة إلى عمليات النشر عن بُعد، سجّل بيانات اعتمادك الخاصة في وحدة تحكم المطوّرين لكل موفّر. - -| المتغير | المزوّد | ملاحظات | -| --------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | عميل عام — لا حاجة إلى سر. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | تجاوز URI لإعادة التوجيه. القيمة الافتراضية: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | عميل عام. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | يتطلب قيمة `_SECRET` مطابقة. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | عميل عام. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | يتطلب قيمة `_SECRET` مطابقة. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | عميل عام. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | تجاوز اختياري لمعرّف عميل OAuth الخاص بـ GitHub Enterprise Copilot. يعود إلى القيمة العامة الافتراضية لـ `GITHUB_OAUTH_CLIENT_ID` عند عدم تعيينه. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | مفتاح API احتياطي يستخدمه `open-sse/executors/devin-cli.ts` عند عدم توفر بيانات اعتماد خاصة بالاتصال. اختياري. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | مسار مخصص لملف Devin CLI الثنائي (`devin`). يُحدَّد بواسطة `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | معرّف عميل OAuth لـ GitLab Duo. سجّل تطبيقًا على `https://gitlab.com/-/profile/applications` باستخدام URI إعادة التوجيه `/callback` والنطاقات `api, read_user, openid, profile, email`. يعود إلى `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | سر عميل OAuth لـ GitLab Duo. اختياري — لا يتطلب تدفق PKCE سرًا. يعود إلى `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | تجاوز عنوان URL الأساسي لـ GitLab (نسخة GitLab مستضافة ذاتيًا). القيمة الافتراضية هي `https://gitlab.com`. يعود إلى `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | قيمة احتياطية قديمة لـ `GITLAB_DUO_BASE_URL`. تُستخدم عند عدم تعيين صيغة `_DUO_`. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | قيمة احتياطية قديمة لـ `GITLAB_DUO_OAUTH_CLIENT_ID` يستخدمها `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | قيمة احتياطية قديمة لـ `GITLAB_DUO_OAUTH_CLIENT_SECRET` يستخدمها `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | عيّنه لتمكين OAuth في Qoder. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | مفتاح API احتياطي مباشر (يتجاوز OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | معرّف مساحة العمل لـ Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | اسم بديل لـ `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | تجاوز دليل إعداد Qoder CLI (جلسة PAT معزولة تتجنب الكتابة فوق تسجيل دخول المتصفح). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | رمز `tk` للواجهة الأمامية لإرساله كقيمة `validated` إلى `/api/chat`. مطلوب عندما يفرض Blackbox مطابقة الرمز؛ وإلا يعود OmniRoute إلى UUID عشوائي. راجع المشكلة #2252. | -| `VISION_BRIDGE_BASE_URL` | حاجز Vision Bridge | عنوان URL أساسي متوافق مع OpenAI لاستدعاءات vision-bridge غير التابعة لـ Anthropic. القيمة الافتراضية هي متغير بيئة عنوان URL القديم لـ OpenAI أو api.openai.com. وجّهه إلى الحلقة الذاتية `/v1` الخاصة بـ OmniRoute أو إلى أي نقطة نهاية متوافقة مع OpenAI (Gemini OpenAI-compat، OpenRouter). المشكلة #2232. عندما يكون عنوان URL هو `/v1` الخاص بـ OmniRoute، يرسل طلب الوصف الفرعي `x-omniroute-admission-bypass: internal` ويصادق باستخدام بيانات اعتماد الحلقة الذاتية المحددة (القيمة الدلالية `sk_omniroute` في الوضع المحلي، أو `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) لكي تعمل عمليات النشر التي تستخدم `REQUIRE_API_KEY=true`. | -| `VISION_BRIDGE_API_KEY` | حاجز Vision Bridge | مفتاح API لعنوان URL أعلاه. يتجاوز متغيرات البيئة الخاصة بكل مزوّد لـ OpenAI / Google في استدعاءات vision-bridge غير التابعة لـ Anthropic. تحتفظ نماذج Anthropic بمسار مفتاح Anthropic المخصص لها. المشكلة #2232. | +بيانات اعتماد مضمّنة لتطوير **localhost**. بالنسبة إلى عمليات النشر البعيدة، سجّل بيانات اعتمادك الخاصة في وحدة تحكم المطوّرين لكل موفّر. + +| المتغير | الموفّر | ملاحظات | +| --------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | عميل عام — لا يلزم مفتاح سري. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | تجاوز معرّف URI لإعادة التوجيه. القيمة الافتراضية: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | عميل عام. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | يتطلب `_SECRET` مطابقًا. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | عميل عام. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | يتطلب `_SECRET` مطابقًا. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | عميل عام. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | تجاوز اختياري لمعرّف عميل OAuth الخاص بـ GitHub Enterprise Copilot. يعود إلى القيمة العامة الافتراضية لـ `GITHUB_OAUTH_CLIENT_ID` عند عدم تعيينه. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | تجاوز اختياري لمعرّف تكامل عميل GitHub Copilot المُرسل في ترويستي `Copilot-Integration-Id` و`Editor-Plugin-Version`. القيمة الافتراضية هي `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | مفتاح API احتياطي يستخدمه `open-sse/executors/devin-cli.ts` عند عدم توفر بيانات اعتماد خاصة بالاتصال. اختياري. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | مسار مخصص لملف Devin CLI الثنائي (`devin`). يتم حله بواسطة `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | معرّف عميل OAuth لـ GitLab Duo. سجّل تطبيقًا في `https://gitlab.com/-/profile/applications` باستخدام معرّف URI لإعادة التوجيه `/callback` والنطاقات `api, read_user, openid, profile, email`. يعود إلى `GITLAB_OAUTH_CLIENT_ID` كخيار احتياطي. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | مفتاح عميل OAuth السري لـ GitLab Duo. اختياري — لا يتطلب تدفق PKCE مفتاحًا سريًا. يعود إلى `GITLAB_OAUTH_CLIENT_SECRET` كخيار احتياطي. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | تجاوز عنوان URL الأساسي لـ GitLab (GitLab المستضاف ذاتيًا). القيمة الافتراضية هي `https://gitlab.com`. يعود إلى `GITLAB_BASE_URL` كخيار احتياطي. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | خيار احتياطي قديم لـ `GITLAB_DUO_BASE_URL`. يُستخدم عند عدم تعيين المتغير الذي يحتوي على `_DUO_`. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | قيمة احتياطية قديمة لـ `GITLAB_DUO_OAUTH_CLIENT_ID` يستخدمها `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | قيمة احتياطية قديمة لـ `GITLAB_DUO_OAUTH_CLIENT_SECRET` يستخدمها `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | اضبطه لتفعيل OAuth في Qoder. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | مفتاح API احتياطي مباشر (يتجاوز OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | معرّف مساحة العمل لـ Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | اسم بديل لـ `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | تجاوز دليل إعدادات Qoder CLI (جلسة PAT معزولة، لتجنب الكتابة فوق بيانات تسجيل الدخول عبر المتصفح). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | رمز `tk` للواجهة الأمامية لإرساله بالقيمة `validated` إلى `/api/chat`. مطلوب عندما يفرض Blackbox مطابقة الرموز؛ وإلا يعود OmniRoute إلى UUID عشوائي. راجع المشكلة #2252. | +| `VISION_BRIDGE_BASE_URL` | حاجز حماية Vision Bridge | عنوان URL أساسي متوافق مع OpenAI لاستدعاءات vision-bridge غير التابعة لـ Anthropic. تكون قيمته الافتراضية عنوان URL القديم لـ OpenAI من متغيرات البيئة أو api.openai.com. وجّهه إلى الحلقة الذاتية `/v1` الخاصة بـ OmniRoute أو إلى أي نقطة نهاية متوافقة مع OpenAI (Gemini OpenAI-compat، OpenRouter). المشكلة #2232. عندما يكون عنوان URL هو `/v1` الخاص بـ OmniRoute، يرسل الطلب الفرعي للوصف `x-omniroute-admission-bypass: internal` ويصادق باستخدام بيانات اعتماد الحلقة الذاتية التي تم تحديدها (القيمة الدالة `sk_omniroute` في الوضع المحلي، أو `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350)، بحيث تعمل عمليات النشر التي تستخدم `REQUIRE_API_KEY=true`. | +| `VISION_BRIDGE_API_KEY` | حاجز حماية Vision Bridge | مفتاح API لعنوان URL أعلاه. يتجاوز متغيرات بيئة OpenAI / Google الخاصة بكل موفر لاستدعاءات vision-bridge غير التابعة لـ Anthropic. تحتفظ نماذج Anthropic بمسار مفتاح Anthropic المخصص لها. المشكلة #2232. | > [!WARNING] > -> 1. انتقل إلى [Google Cloud Console → بيانات الاعتماد](https://console.cloud.google.com/apis/credentials) +> 1. انتقل إلى [Google Cloud Console ← Credentials](https://console.cloud.google.com/apis/credentials) > 2. أنشئ معرّف عميل OAuth 2.0 (النوع: "تطبيق ويب") -> 3. أضف عنوان URL لخادمك كمعرّف URI معتمد لإعادة التوجيه +> 3. أضف عنوان URL لخادمك بوصفه معرّف URI معتمدًا لإعادة التوجيه > 4. استبدل قيم بيانات الاعتماد في `.env`. --- @@ -722,11 +730,11 @@ process.env[`${PROVIDER_ID}_USER_AGENT`] --- -## 15. إعدادات المهلة الزمنية +## 15. إعدادات المهلة جميع القيم بوحدة **المللي ثانية**. تتم معالجة القيم مركزيًا في `src/shared/utils/runtimeTimeouts.ts`. -### التسلسل الهرمي للمهل الزمنية +### التسلسل الهرمي للمهل ``` REQUEST_TIMEOUT_MS (تجاوز عام) @@ -739,9 +747,9 @@ REQUEST_TIMEOUT_MS (تجاوز عام) │ ├── FETCH_CONNECT_TIMEOUT_MS (مستقل، القيمة الافتراضية: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (مستقل، القيمة الافتراضية: 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (يرث من REQUEST_TIMEOUT_MS، القيمة الافتراضية: 600000) -├─→ STREAM_ACTIVE_TIMEOUT_MS (مستقل، القيمة الافتراضية: 1260000؛ تؤدي القيمة 0 إلى تعطيله) +├─→ STREAM_ACTIVE_TIMEOUT_MS (مستقل، القيمة الافتراضية: 1260000؛ القيمة 0 تعطّله) ├─→ STREAM_READINESS_TIMEOUT_MS (يرث من REQUEST_TIMEOUT_MS، القيمة الافتراضية: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (يحدّ من تمديدات الجاهزية التكيفية، القيمة الافتراضية: 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (يضع حدًا أقصى لتمديدات الجاهزية التكيفية، القيمة الافتراضية: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (يرث من REQUEST_TIMEOUT_MS، القيمة الافتراضية: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (مشتق، القيمة الافتراضية: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (القيمة الافتراضية: 60000) @@ -749,113 +757,114 @@ REQUEST_TIMEOUT_MS (تجاوز عام) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (القيمة الافتراضية: 0 = معطّل) ``` -| المتغير | القيمة الافتراضية | الوصف | -| ----------------------------------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(غير معيّن)_ | اختصار عام — يتجاوز القيم الافتراضية لكلٍ من `FETCH_TIMEOUT_MS` و`STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | المهلة الإجمالية لطلب HTTP لاستدعاءات المزوّد الخارجي. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | الحد الأقصى للصمت بين وحدات البايت الأولية الواردة من المصدر الخارجي قبل الإلغاء. نادرًا ما تتوقف نماذج التفكير الممتد لأكثر من 90 ثانية. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | الحد الأقصى الإجمالي لعمر تدفق SSE النشط؛ لا يُعاد ضبطه أبدًا عند ورود وحدات بايت من المصدر الخارجي، وهو مستقل عن `REQUEST_TIMEOUT_MS`. مشتق من أكبر قيمة `timeoutMs` خاصة بكل نموذج في السجل (1200000، Codex)، بالإضافة إلى هامش قدره 60000، بحيث لا يُنهى النموذج في منتصف الإجابة إذا سُمح له باستهلاك ميزانيته الزمنية كاملةً. اضبطه على `0` لتعطيله. | -| `OMNIROUTE_SSE_COMMENTS` | _(معطّل)_ | ما إذا كان يمكن لـ OmniRoute إصدار أسطر تعليقات SSE التي تبدأ بـ `:` (مثل نبضة `: keepalive` وتذييلات بيانات التعريف `x-omniroute-*`). معطّل افتراضيًا (#10524) لأن العملاء المتوافقين بصرامة مع OpenAI يطبّقون JSON.parse على كل سطر SSE ويتعطلون عند تعليقات `:`؛ أما نبضات `data:` فلا تتأثر. اضبطه على `on`/`true`/`1`/`yes` لإعادة الاشتراك. يُستخدم بواسطة `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | الوقت المتاح لاستلام أول حدث SSE ليس إشارة ping. يرث قيمة `REQUEST_TIMEOUT_MS` عند تعيينها. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | الحد الأقصى لنافذة الاستعداد التكيفية لأول حدث لطلبات البث الكبيرة أو كثيفة استخدام الأدوات أو التي تتطلب قدرًا كبيرًا من الاستدلال. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | مفتاح إيقاف طارئ للاستدلال الإرشادي `/goal`. اضبطه على `false`/`0`/`off` لتعطيل الاكتشاف بالكامل — لن تُرفع أبدًا مهل الاستعداد واستعادة التدفق استنادًا إلى جسم الطلب أو ترويساته، مما يحد من تضخيم المهلة الذي يتحكم فيه العميل. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | الحد الأقصى لنافذة الاستعداد لأول حدث لعمليات الوكيل `/goal` المكتشفة أو الطلبات المفروضة باستخدام `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | تمكين الاستعادة المبكرة للتدفق تلقائيًا لعمليات الوكيل `/goal` المكتشفة. اضبطه على `false`/`0`/`off` لتعطيل الاشتراك الخاص بالهدف. لا يمكن لهذا إلا إضافة الاستعادة فوق الإعداد الافتراضي للمشغّل — ولا يتجاوز أبدًا إلغاء الاشتراك الصريح عبر `STREAM_RECOVERY_ENABLED` أو إعدادات قاعدة البيانات. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | إزالة أحداث SSE غير القياسية `codex.*` (مثل `codex.rate_limits`) التي تتسبب في تعطل `responses.stream()` في OpenAI SDK بخطأ 502. مفعّل افتراضيًا (#11014). اضبطه على `0`/`false`/`no`/`off` لتمريرها. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(غير معيّن)_ | وسيلة نقل اختيارية لخادم تطبيق Codex. نقطة نهاية WebSocket ‏(`ws://`/`wss://`) لعملية `codex app-server` جانبية محلية. عند تعيينها مع رمز مميز، تُوجّه طلبات Codex عبر JSON-RPC إلى العملية الجانبية بدلًا من واجهة HTTP Responses API. يمكن أيضًا تعيينها لكل اتصال عبر `providerSpecificData.codexAppServerUrl`. تُستخدم بواسطة `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(غير معيّن)_ | رمز الإمكانية/الحامل المضمّن المقدَّم إلى خادم التطبيق. التجاوز لكل اتصال: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(غير معيّن)_ | مسار إلى ملف يحتوي على رمز إمكانية خادم التطبيق (من `codex app-server --ws-token-file`). يُستخدم عندما لا تكون `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` معيّنة. التجاوز لكل اتصال: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | دليل العمل الذي تُشغّل فيه دورة خادم التطبيق. التجاوز لكل اتصال: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(غير معيّن)_ | سياسة الموافقة الممررة إلى دورة خادم التطبيق (مثل `never` و`on-request`). التجاوز لكل اتصال: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(غير معيّن)_ | سياسة البيئة المعزولة الممررة إلى دورة خادم التطبيق (مثل `read-only` و`workspace-write` و`danger-full-access`). عندما لا تكون معيّنة، يستخدم المنفّذ `workspace-write` افتراضيًا (أكثر تحصينًا؛ كانت سابقًا `danger-full-access`). التجاوز لكل اتصال: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | الموافقة تلقائيًا على مطالبات الموافقة الخاصة بخادم التطبيق نفسه (تنفيذ الأوامر/الملفات/الأذونات على المضيف). معطّل افتراضيًا — تُرفض المطالبات تلقائيًا؛ ولا تتأثر استدعاءات أدوات بيئة التشغيل (إذ تنتقل عبر مسار التمرير المنفصل `item/tool/call`). يقبل `true`/`1`/`yes`. التجاوز لكل اتصال: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | الوقت المتاح لاستلام ترويسات الاستجابة. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 ثانية) | الحد الأقصى لانتظار بدء الاستجابة (بالمللي ثانية) لكل محاولة مباشرة من دون وكيل. عند انتهاء المهلة، تُعاد المحاولة مرة واحدة عبر مقبس جديد؛ اضبطه على `0` لتعطيل الحد والإبقاء على السلوك السابق. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | الوقت المتاح لاستلام نص الاستجابة بالكامل. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | مهلة إنشاء اتصال TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | مهلة خمول مقبس إبقاء الاتصال حيًا. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | مهلة وكيل بصمة TLS ‏(wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | يحدّد تحديدًا زمن الوصول إلى البايت الأول في نص نقل بصمة TLS عبر wreq-js؛ لا يستطيع `TLS_CLIENT_TIMEOUT_MS` وحده اكتشاف نص متوقف لأنه يُحسم بمجرد وصول الترويسات (#12656). يؤدي انتهاء المهلة إلى إلغاء قارئ wreq والرجوع إلى مُرسِل الطلبات المباشر/عبر الوكيل؛ ويعطّل `0` آلية المراقبة. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | لمنفّذ OpenCode فقط، وفقط عندما تكون علامة الميزة `OPENCODE_RESPONSES_STALL_ROTATION` مفعّلة (معطّلة افتراضيًا): يحدّد مدة انتظار أول بايت من النص في رد Responses متدفق بعد وصول ترويساته (#13484). يبدأ تدفق Responses بالحدث `response.created`، لذا يُعد غياب البيانات بعد هذه المدة توقفًا: يُوضَع الحساب في فترة تهدئة ويُحوَّل الطلب إلى الحساب التالي مرة واحدة؛ ويؤدي توقف ثانٍ إلى فشل فوري. يعطّل `0` آلية الحماية حتى مع تفعيل العلامة. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | مهلة خطوة الوكيل لطلبات الجسر `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | يوجّه منفّذ جلب الويب Firecrawl إلى نسخة مستضافة ذاتيًا (مفتاح API اختياري خارج السحابة). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | مهلة كل طلب لمنفّذ جلب الويب Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | المهلة الإجمالية لطلب الخادم الخاص بالجسر. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | الوقت المتاح لإرسال ترويسات الاستجابة عبر الجسر. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | مهلة خمول إبقاء اتصال الجسر حيًا. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | مهلة المقبس الخام (`0` = معطّلة). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | فترة السماح عند SIGTERM/SIGINT قبل الخروج القسري. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | القيمة الاحتياطية التي يستخدمها `src/shared/utils/fetchTimeout.ts` عندما لا تكون `FETCH_TIMEOUT_MS` معيّنة. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | المهلة (بالمللي ثانية) للإعدادين المسبقين `validationRead` و`modelsProbe` في `src/shared/network/safeOutboundFetch.ts`. ارفعها لنقاط النهاية البطيئة (Cerebras وCloudflare AI وGroq) لمنع التذبذب بين حالتي النشاط/الخطأ في لوحة المعلومات. تعود إلى 8000 مللي ثانية للقيم غير الصالحة (أقل من 1000) أو غير الرقمية. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | مهلة الجلب الخاصة بالمُرحِّل في `open-sse/utils/proxyFetch.ts` ‏(#9158). يجب أن يفشل المُرحِّل المتوقف قبل مهلة العميل/الوكيل (نحو 30 ثانية) كي يرى المستدعون فشلًا خاصًا بالمُرحِّل بدلًا من مهلة عامة للمصدر الأعلى. الحد الأقصى هو `29000` لضمان تفعيلها أولًا دائمًا. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | فترة التراجع المشتركة قبل إعادة المحاولة لمسارات إعادة المحاولة لمرة واحدة، المباشرة/عبر المُرحِّل/عبر الوكيل، في `open-sse/utils/proxyFetch.ts` ‏(#9158). القيمة `0` = إعادة المحاولة فورًا. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | مهلة طلب wreq-js الأصلية (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | فترة سماح لموعد JS النهائي الصارم تُضاف إلى المهلة الأصلية. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | مهلة طلب wreq-js الأصلية (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | فترة سماح لموعد JS النهائي الصارم تُضاف إلى المهلة الأصلية. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (متوقف) | تُلحق العبارة "لديك بحث ويب مضمّن. أجب عن الأسئلة مباشرةً باستخدام نتائج البحث." برسالة النظام الخاصة بالمتصل (`perplexity-web/protocol.ts`). تكون متوقفة افتراضيًا — إذ يجري Perplexity عمليات البحث على أي حال، وتتسرب الجملة إلى الردود كتعليق وصفي لعملاء البرمجة. اضبطها على `1`/`true`/`yes`/`on` لاستعادتها. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | مهلة طلب wreq-js الأصلية (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | فترة سماح للموعد النهائي الصارم المطلق في JS تُضاف إلى المهلة الأصلية. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | مهلة طلب wreq-js الأصلية (`notionTlsClient.ts`)؛ يرفعها `notion-web` لكل طلب إلى `180000` لعمليات التوليد الطويلة. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | فترة سماح للموعد النهائي الصارم المطلق في JS تُضاف إلى المهلة الأصلية. | -| `OMNIROUTE_BROWSER_POOL` | `on` | مجموعة متصفحات Playwright مشتركة لمحادثات ملفات تعريف ارتباط الويب المدعومة بالمتصفح (`browserPool.ts`)؛ اضبطها على `off` لتعطيلها. | -| `OBSCURA_BIN` | `auto-detect` | المسار إلى الملف التنفيذي `obscura` المُستخدم كمحرك أساسي بواسطة مجموعة المتصفحات ومنفّذ Cloudflare Playground (`open-sse/services/obscura.ts`)؛ يُكتشف تلقائيًا من PATH الخاص بالنظام عند عدم تعيينه. | -| `OBSCURA_CDP_ENDPOINT` | _(غير معيّن)_ | وجّه إلى مثيل Obscura قيد التشغيل بالفعل (`http://host:port`) بدلًا من تشغيل مثيل جديد؛ لا تمتلك الوحدة تلك العملية (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `منفذ عشوائي متاح` | منفذ صريح لأمر `obscura serve` الذي يتم تشغيله؛ يُختار منفذ متاح تلقائيًا عند عدم تعيينه (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | استخدم مسارًا مدعومًا بالمتصفح لطلب محادثة ملفات تعريف ارتباط الويب (`browserBackedChat.ts`)؛ استخدم `1` للتمكين. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | عنوان URL الأساسي لمنفّذ Kimi Web (واجهة Connect-RPC الدولية لـ kimi.ai) (`kimi-web.ts`)؛ لا تتجاوزه إلا لنقاط نهاية النسخ المتطابقة/الوكيلة. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | نقطة نهاية المحادثة الكاملة لمنفّذ Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(مُكتشف تلقائيًا)_ | المسار إلى ملف Chrome/Edge تنفيذي على النظام لتسجيل الدخول التفاعلي عبر المتصفح إلى Adobe Firefly (`adobeFireflyBrowserLogin.ts`)؛ يتجاوز الاكتشاف التلقائي حسب نظام التشغيل. | -| `OMNIROUTE_STANDALONE_DIR` | _مخرجات .build/ المستقلة_ | تجاوز وقت البناء لدليل المخرجات المستقلة الذي تستهلكه خطوة التجميع المشترك بعد البناء (`scripts/build/colocate-standalone.mjs`)؛ يخص أدوات البناء، وليس وقت التشغيل. | - -ترث محاولات وجهة المجموعة مهلة طلب المصدر الصاعد التي جرى حلها (`FETCH_TIMEOUT_MS`، أو -`REQUEST_TIMEOUT_MS` عندما يوفّر القيمة الافتراضية للجلب). عيّن `targetTimeoutMs` في مجموعة، -أو إعدادات المجموعة الافتراضية، أو تجاوز المزوّد فقط لجعل الرجوع الاحتياطي للمجموعة أسرع؛ وتُقيَّد القيم الأعلى من -مهلة المصدر الصاعد الحالية عند قيمة مهلة المصدر الصاعد. - -`comboTimeoutMs` هي ميزانية زمنية مستقلة وفق ساعة الحائط للمجموعة بأكملها عبر وجهات تجاوز الفشل. -اتركها دون تعيين أو عيّنها على `0` للإبقاء على التكرار غير المحدود (يظل حد إيقاف التعليق البالغ 10 دقائق -`COMBO_LOOP_SAFETY_TIMEOUT_MS` ساريًا). تحل قيمة موجبة محل شبكة الأمان تلك -للمجموعة. اجعل `comboTimeoutMs` أطول من `targetTimeoutMs` حتى يظل لدى تجاوز الفشل -وقت بعد بطء الوجهة الأولى. +| المتغير | القيمة الافتراضية | الوصف | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(غير معيّن)_ | اختصار عام — يتجاوز القيم الافتراضية لكلٍ من `FETCH_TIMEOUT_MS` و`STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | المهلة الإجمالية لطلب HTTP لاستدعاءات المزوّد الخارجي. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | الحد الأقصى لفترة الصمت بين وحدات البايت الخام الواردة من المصدر الخارجي قبل الإلغاء. نادرًا ما تتوقف نماذج التفكير الممتد لأكثر من 90 ثانية. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | الحد الأقصى لإجمالي مدة تدفق SSE النشط؛ لا يُعاد ضبطه أبدًا عند ورود وحدات بايت من المصدر الخارجي، وهو مستقل عن `REQUEST_TIMEOUT_MS`. وهو مشتق من أكبر قيمة `timeoutMs` خاصة بكل نموذج في السجل (`1200000`، Codex)، بالإضافة إلى هامش قدره `60000`، بحيث لا يُوقف نموذج في منتصف الإجابة إذا سُمح له باستخدام ميزانيته الزمنية كاملةً. اضبطه على `0` لتعطيله. | +| `OMNIROUTE_SSE_COMMENTS` | _(معطّل)_ | ما إذا كان يُسمح لـ OmniRoute بإرسال أسطر تعليقات SSE التي تبدأ بـ `:` (مثل نبضة الاستمرار `: keepalive` وتذييلات بيانات التعريف `x-omniroute-*`). معطّل افتراضيًا (#10524) لأن العملاء المتوافقين بدقة مع OpenAI يطبّقون JSON.parse على كل سطر SSE ويتعطلون عند تعليقات `:`؛ ولا تتأثر نبضات `data:`. اضبطه على `on`/`true`/`1`/`yes` لإعادة الاشتراك. يُستخدم بواسطة `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | المدة المتاحة لاستلام أول حدث SSE ليس حدث ping. يرث قيمة `REQUEST_TIMEOUT_MS` عند تعيينها. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | الحد الأقصى لنافذة الاستعداد التكيفية للحدث الأول لطلبات البث الكبيرة، أو كثيفة استخدام الأدوات، أو ذات الاستدلال المكثف. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | مفتاح إيقاف لقاعدة `/goal` الاستدلالية. اضبطه على `false`/`0`/`off` لتعطيل الاكتشاف بالكامل — عندئذٍ لا تُزاد مهل الاستعداد واستعادة التدفق مطلقًا استنادًا إلى جسم الطلب أو ترويساته، ما يحدّ من تضخيم المهلة الذي يتحكم فيه العميل. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | الحد الأقصى لنافذة استعداد الحدث الأول لتشغيلات وكيل `/goal` المكتشفة أو الطلبات المفروضة باستخدام `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | تمكين الاستعادة المبكرة للتدفق تلقائيًا لتشغيلات وكيل `/goal` المكتشفة. اضبطه على `false`/`0`/`off` لتعطيل الاشتراك الخاص بالهدف. لا يمكن لهذا سوى إضافة الاستعادة فوق الإعداد الافتراضي للمشغّل — ولا يتجاوز أبدًا إلغاء اشتراك صريحًا عبر `STREAM_RECOVERY_ENABLED` أو إعدادات قاعدة البيانات. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | إزالة أحداث SSE غير القياسية من النوع `codex.*` (مثل `codex.rate_limits`) التي تتسبب في تعطّل `responses.stream()` ضمن OpenAI SDK بخطأ 502. مفعّل افتراضيًا (#11014). اضبطه على `0`/`false`/`no`/`off` لتمريرها. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(غير معيّن)_ | خيار اشتراك لاستخدام ناقل خادم تطبيقات Codex. نقطة نهاية WebSocket (`ws://`/`wss://`) لعملية `codex app-server` جانبية محلية. عند تعيينه مع رمز مميز، تُوجّه طلبات Codex عبر JSON-RPC إلى العملية الجانبية بدلًا من واجهة HTTP Responses API. ويمكن أيضًا تعيينه لكل اتصال عبر `providerSpecificData.codexAppServerUrl`. يُستخدم بواسطة `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(غير معيّن)_ | رمز قدرة/حامل مضمن يُقدّم إلى خادم التطبيقات. التجاوز لكل اتصال: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(غير معيّن)_ | مسار ملف يحتوي على رمز قدرة خادم التطبيقات (من `codex app-server --ws-token-file`). يُستخدم عندما يكون `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` غير معيّن. التجاوز لكل اتصال: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | دليل العمل الذي تُشغّل فيه دورة خادم التطبيقات. التجاوز لكل اتصال: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(غير معيّن)_ | سياسة الموافقة الممررة إلى دورة خادم التطبيقات (مثل `never` و`on-request`). التجاوز لكل اتصال: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(غير معيّن)_ | سياسة بيئة العزل الممررة إلى دورة خادم التطبيقات (مثل `read-only` و`workspace-write` و`danger-full-access`). عندما تكون غير معيّنة، يستخدم المنفّذ `workspace-write` افتراضيًا (أكثر تحصينًا؛ كانت سابقًا `danger-full-access`). التجاوز لكل اتصال: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | الموافقة تلقائيًا على مطالبات الموافقة الخاصة بخادم التطبيقات نفسه (تنفيذ الأوامر/الملفات/الأذونات على المضيف). معطّل افتراضيًا — تُرفض المطالبات تلقائيًا؛ ولا تتأثر استدعاءات أدوات إطار التشغيل (إذ تنتقل عبر مسار التمرير المنفصل `item/tool/call`). يقبل `true`/`1`/`yes`. التجاوز لكل اتصال: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | المدة المتاحة لاستلام ترويسات الاستجابة. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 ث) | الحد الأقصى لانتظار بدء الاستجابة (بالمللي ثانية) لكل محاولة مباشرة من دون وكيل. عند انتهاء المهلة، تُعاد المحاولة مرة واحدة عبر مقبس جديد؛ اضبطه على `0` لتعطيل الحد والإبقاء على السلوك السابق. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 دقائق) | الحد الأقصى (بالمللي ثانية) لمحاولة RETRY عبر مقبس جديد بعد انتهاء مهلة بدء الاستجابة لمحاولة تستخدم اتصالًا من التجمع أعلاه (#13703). لا ينطبق إلا عندما يكون المستدعي قد أرفق بالفعل إشارة مهلة خاصة به (تسلسل الاتصال/النموذج/المزوّد/`FETCH_TIMEOUT_MS` بعد حلّه)؛ إذ تمثل تلك الإشارة الحد الفعلي وتُفعّل أولًا في المسار المقصود، لذا فهذا إجراء احتياطي سخي وليس حدًا ثابتًا — فمن دونه، كانت إعادة المحاولة تستخدم نافذة `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` القصيرة نفسها التي استخدمتها محاولة الاتصال من التجمع، مما كان يؤدي إلى استجابة 504 لنماذج الاستدلال السليمة ذات الزمن البطيء للوصول إلى البايت الأول. لا يُسمح أبدًا بأن يقل عن الحد الأدنى الثابت أعلاه؛ وعندما لا يوفّر المستدعي أي إشارة مهلة على الإطلاق، تُبقي إعادة المحاولة الحد الأدنى الثابت من دون تغيير. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | الوقت المسموح لاستلام نص الاستجابة كاملًا. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | مهلة إنشاء اتصال TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | مهلة خمول مقبس الإبقاء على الاتصال. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | مهلة وكيل بصمة TLS ‏(wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | يحد تحديدًا من وقت الوصول إلى البايت الأول لنص نقل بصمة TLS الخاص بـ wreq-js؛ إذ لا يستطيع `TLS_CLIENT_TIMEOUT_MS` وحده اكتشاف نص متوقف لأن المهلة تنتهي بمجرد وصول الترويسات (#12656). يؤدي انتهاء المهلة إلى إلغاء قارئ wreq والرجوع إلى موزّع الاتصال المباشر/الوكيل؛ ويؤدي `0` إلى تعطيل آلية المراقبة. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | لمنفّذ OpenCode فقط، وفقط أثناء تفعيل علامة الميزة `OPENCODE_RESPONSES_STALL_ROTATION` (معطّلة افتراضيًا): يحد وقت انتظار أول بايت من نص رد Responses متدفق بعد وصول ترويساته (#13484). يبدأ تدفق Responses بالحدث `response.created`، لذا يُعد غياب البيانات بعد هذه النافذة توقفًا: يُوضَع الحساب في فترة تهدئة ويُحوَّل الطلب إلى الحساب التالي مرة واحدة؛ ويؤدي التوقف الثاني إلى فشل سريع. يعطّل `0` آلية الحماية حتى عند تفعيل العلامة. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | مهلة مرحلة الوكيل لطلبات جسر `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | يوجّه منفّذ جلب الويب Firecrawl إلى نسخة مستضافة ذاتيًا (مفتاح API اختياري خارج السحابة). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | مهلة كل طلب لمنفّذ جلب الويب Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | المهلة الإجمالية لطلب الخادم عبر الجسر. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | الوقت المسموح لإرسال ترويسات الاستجابة عبر الجسر. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | مهلة خمول الإبقاء على اتصال الجسر. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | مهلة المقبس الخام (`0` = معطّلة). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | فترة السماح عند SIGTERM/SIGINT قبل الخروج الإجباري. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | القيمة الاحتياطية التي يستخدمها `src/shared/utils/fetchTimeout.ts` عندما لا يكون `FETCH_TIMEOUT_MS` معيّنًا. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | المهلة (بالمللي ثانية) لإعدادي `validationRead` و`modelsProbe` المسبقين في `src/shared/network/safeOutboundFetch.ts`. ارفعها لنقاط النهاية البطيئة (Cerebras وCloudflare AI وGroq) لمنع التذبذب بين حالتي النشاط/الخطأ في لوحة المعلومات. تعود إلى 8000 مللي ثانية للقيم غير الصالحة (<1000) أو غير الرقمية. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | مهلة الجلب الخاصة بالترحيل في `open-sse/utils/proxyFetch.ts` ‏(#9158). يجب أن يفشل الترحيل المتوقف قبل مهلة العميل/الوكيل (~30 ث) حتى يرى المستدعون فشلًا خاصًا بالترحيل بدلًا من مهلة عامة للخدمة الأصلية. الحد الأقصى هو `29000` لضمان تفعيلها أولًا دائمًا. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | مهلة التراجع المشتركة لإعادة المحاولة في مسارات المحاولة الواحدة عبر الاتصال المباشر/الترحيل/الوكيل في `open-sse/utils/proxyFetch.ts` ‏(#9158). `0` = إعادة المحاولة فورًا. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | مهلة طلب wreq-js الأصلية (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | فترة سماح إضافية للمهلة النهائية الصارمة في JS، تُضاف فوق المهلة الأصلية. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | مهلة طلب wreq-js الأصلية (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | فترة سماح إضافية للمهلة النهائية الصارمة في JS، تُضاف فوق المهلة الأصلية. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (معطّل) | يُلحق "لديك بحث ويب مدمج. أجب عن الأسئلة مباشرةً باستخدام نتائج البحث." برسالة النظام الخاصة بالمستدعي (`perplexity-web/protocol.ts`). وهو معطّل افتراضيًا — إذ يبحث Perplexity على أي حال، كما تتسرّب الجملة إلى الردود كتعليق وصفي لعملاء البرمجة. اضبطه على `1`/`true`/`yes`/`on` لاستعادته. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | مهلة طلب wreq-js الأصلية (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | فترة سماح إضافية للمهلة النهائية الصارمة في JS، تُضاف فوق المهلة الأصلية. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | مهلة طلب wreq-js الأصلية (`notionTlsClient.ts`)؛ يرفعها `notion-web` لكل طلب إلى `180000` لعمليات التوليد الطويلة. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | فترة سماح إضافية للمهلة النهائية الصارمة في JS، تُضاف فوق المهلة الأصلية. | +| `OMNIROUTE_BROWSER_POOL` | `on` | تجمّع متصفح Playwright مشترك لدردشة ملفات تعريف ارتباط الويب المدعومة بالمتصفح (`browserPool.ts`)؛ اضبطه على `off` لتعطيله. | +| `OBSCURA_BIN` | `auto-detect` | المسار إلى الملف الثنائي `obscura` المستخدم كمحرّك أساسي بواسطة تجمّع المتصفح ومنفّذ Cloudflare Playground (`open-sse/services/obscura.ts`)؛ يُكتشف تلقائيًا من PATH الخاص بالنظام عندما لا يكون معيّنًا. | +| `OBSCURA_CDP_ENDPOINT` | _(غير معيّن)_ | يشير إلى مثيل Obscura قيد التشغيل بالفعل (`http://host:port`) بدلًا من تشغيل مثيل جديد؛ لا تدير الوحدة تلك العملية (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `منفذ عشوائي متاح` | منفذ صريح لأمر `obscura serve` الذي يتم تشغيله؛ يُختار منفذ متاح تلقائيًا عندما لا يكون معيّنًا (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | يوجّه طلب دردشة ملفات تعريف ارتباط الويب إلى المسار المدعوم بالمتصفح (`browserBackedChat.ts`)؛ استخدم `1` للتمكين. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | عنوان URL الأساسي لمنفّذ Kimi Web (‏kimi.ai الدولي المستند إلى Connect-RPC) (`kimi-web.ts`)؛ لا تتجاوزه إلا لنقاط نهاية النسخة المطابقة/الوكيل. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | نقطة نهاية الدردشة الكاملة لمنفّذ Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(يُكتشف تلقائيًا)_ | المسار إلى ملف Chrome/Edge تنفيذي على النظام لتسجيل الدخول التفاعلي عبر المتصفح إلى Adobe Firefly (`adobeFireflyBrowserLogin.ts`)؛ يتجاوز الاكتشاف التلقائي الخاص بكل نظام تشغيل. | +| `OMNIROUTE_STANDALONE_DIR` | _مخرجات .build/ المستقلة_ | تجاوز في وقت البناء لدليل المخرجات المستقلة الذي تستهلكه خطوة التجميع المشترك اللاحقة للبناء (`scripts/build/colocate-standalone.mjs`)؛ خاص بأدوات البناء وليس بوقت التشغيل. | + +ترث محاولات أهداف المجموعة مهلة طلب المصدر العلوي المحسوبة (`FETCH_TIMEOUT_MS`، أو +`REQUEST_TIMEOUT_MS` عندما يوفّر القيمة الافتراضية للجلب). اضبط `targetTimeoutMs` في مجموعة، +أو إعدادات المجموعة الافتراضية، أو تجاوز المزوّد فقط لجعل الرجوع الاحتياطي للمجموعة أسرع؛ تُقيّد القيم التي تتجاوز +مهلة المصدر العلوي الحالية بمهلة المصدر العلوي. + +يمثّل `comboTimeoutMs` ميزانية منفصلة لوقت الساعة الفعلي للمجموعة بأكملها عبر أهداف تجاوز الفشل. +اتركه غير معيّن أو اضبطه على `0` للحفاظ على تكرار غير محدود (مع استمرار تطبيق +آلية إيقاف التعليق `COMBO_LOOP_SAFETY_TIMEOUT_MS` البالغة 10 دقائق). تحلّ القيمة الموجبة محل +آلية الأمان تلك للمجموعة. اجعل `comboTimeoutMs` أطول من `targetTimeoutMs` بحيث يظل لدى تجاوز الفشل +وقت كافٍ بعد بطء الهدف الأول. ### حدود قاطع الدائرة ضبط قاطع الدائرة على مستوى المزوّد. تعكس القيم الافتراضية القيم الموسّعة المستخدمة منذ v3.6 لأكثر من 500 اتصال. -| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | -| ------------------------------------------------------------- | ----------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | حدّ حالات الفشل المتتالية لموفّري OAuth قبل تفعيل قاطع الدائرة. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | نافذة إعادة الضبط (مللي ثانية) لقاطع موفّر OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | حدّ حالات الفشل المتتالية للموفّرين الذين يستخدمون مفتاح API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | نافذة إعادة الضبط (مللي ثانية) لقاطع الموفّر الذي يستخدم مفتاح API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | حدّ حالات الفشل المتتالية للموفّرين المحليين (Ollama وLM Studio وغيرهما). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | نافذة إعادة الضبط (مللي ثانية) لقاطع الموفّر المحلي. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: عدد حالات الفشل ضمن النافذة قبل أن يدخل موفّر OAuth بأكمله في فترة التهدئة. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: نافذة متحركة لعدّ حالات الفشل (مللي ثانية) لموفّري OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: فترة التهدئة (مللي ثانية) بعد بلوغ موفّر OAuth الحدّ. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | يدخل موفّر OAuth الحالة DEGRADED عند بلوغ هذا العدد من حالات الفشل. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | الحد الأقصى لمضاعِف تصعيد resetTimeout لموفّر OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | يُصعّد موفّر OAuth بعد هذا العدد من دورات الفتح. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: عدد حالات الفشل ضمن النافذة قبل أن يدخل الموفّر الذي يستخدم مفتاح API بأكمله في فترة التهدئة. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: نافذة متحركة لعدّ حالات الفشل (مللي ثانية) للموفّرين الذين يستخدمون مفتاح API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: فترة التهدئة (مللي ثانية) بعد بلوغ الموفّر الذي يستخدم مفتاح API الحدّ. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | يدخل الموفّر الذي يستخدم مفتاح API الحالة DEGRADED عند بلوغ هذا العدد من حالات الفشل. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | الحد الأقصى لمضاعِف تصعيد resetTimeout للموفّر الذي يستخدم مفتاح API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | يُصعّد الموفّر الذي يستخدم مفتاح API بعد هذا العدد من دورات الفتح. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: عدد حالات الفشل قبل أن يدخل الموفّر المحلي بأكمله في فترة التهدئة. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: نافذة متحركة لعدّ حالات الفشل (مللي ثانية) للموفّرين المحليين. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: فترة التهدئة (مللي ثانية) بعد بلوغ الموفّر المحلي الحدّ. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | عمق التراجع الذي عنده يُعدّ موفّر تثبيت ذاكرة التخزين المؤقت للسياق غير سليم على نحو مستمر، ويُزال التثبيت للسماح بالتبديل عند الفشل. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | نافذة منع التذبذب (مللي ثانية) التي تتسامح مع فترات التهدئة العابرة والموجزة قبل إزالة تثبيت ذاكرة التخزين المؤقت للسياق. | +| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | +| ------------------------------------------------------------- | ----------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | حد الإخفاقات المتتالية لموفّري OAuth قبل تفعيل قاطع الدائرة. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | نافذة إعادة الضبط (مللي ثانية) لقاطع موفّر OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | حد الإخفاقات المتتالية لموفّري مفاتيح API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | نافذة إعادة الضبط (مللي ثانية) لقاطع موفّر مفتاح API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | حد الإخفاقات المتتالية للموفّرين المحليين (Ollama وLM Studio و...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | نافذة إعادة الضبط (مللي ثانية) لقاطع الموفّر المحلي. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: عدد الإخفاقات ضمن النافذة قبل دخول موفّر OAuth بأكمله في فترة تهدئة. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: نافذة متحركة لعدّ الإخفاقات (مللي ثانية) لموفّري OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: فترة التهدئة (مللي ثانية) بعد بلوغ موفّر OAuth الحد. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | يدخل موفّر OAuth في حالة DEGRADED عند بلوغ هذا العدد من الإخفاقات. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | الحد الأقصى لمضاعِف تصعيد resetTimeout لموفّر OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | يصعّد موفّر OAuth بعد هذا العدد من دورات الفتح. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: عدد الإخفاقات ضمن النافذة قبل دخول موفّر مفتاح API بأكمله في فترة تهدئة. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: نافذة متحركة لعدّ الإخفاقات (مللي ثانية) لموفّري مفاتيح API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: فترة التهدئة (مللي ثانية) بعد بلوغ موفّر مفتاح API الحد. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | يدخل موفّر مفتاح API في حالة DEGRADED عند بلوغ هذا العدد من الإخفاقات. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | الحد الأقصى لمضاعِف تصعيد resetTimeout لموفّر مفتاح API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | يصعّد موفّر مفتاح API بعد هذا العدد من دورات الفتح. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: عدد الإخفاقات قبل دخول الموفّر المحلي بأكمله في فترة تهدئة. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: نافذة متحركة لعدّ الإخفاقات (مللي ثانية) للموفّرين المحليين. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | القاطع على مستوى الموفّر: فترة التهدئة (مللي ثانية) بعد بلوغ الموفّر المحلي الحد. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | عمق التراجع الذي عنده يُعد موفّر تثبيت ذاكرة التخزين المؤقت للسياق غير سليم بصورة مستدامة، ويُزال التثبيت لإتاحة تجاوز الفشل. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | نافذة منع التذبذب (مللي ثانية) التي تسمح بفترات التهدئة العابرة القصيرة قبل إزالة تثبيت ذاكرة التخزين المؤقت للسياق. | ### السيناريوهات | السيناريو | الإعداد | | --------------------------------------- | ----------------------------------------------------- | -| **توليد التعليمات البرمجية طويل الأمد** | `REQUEST_TIMEOUT_MS=900000` (15 دقيقة) | -| **تقييد العمر الإجمالي للتدفق** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 دقيقة) | -| **الفشل السريع لواجهة API الإنتاجية** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **توليد الشيفرة طويل الأمد** | `REQUEST_TIMEOUT_MS=900000` (15 دقيقة) | +| **تقييد العمر الإجمالي للدفق** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 دقيقة) | +| **الإخفاق السريع لواجهة API الإنتاجية** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **نماذج التفكير الممتد** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 دقائق بين الأجزاء) | --- @@ -1108,100 +1117,101 @@ Claude Code CLI فقط، أو لم تكن متأكدًا من ماهية هذه ## 21. صحة الوكيل -| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | -| ------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | مهلة الفحص الصحي للفشل السريع. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | النافذة الزمنية (بالساعات) لحساب متوسط زمن استجابة الوكلاء المرشحين في استراتيجية التجمع المحسّنة لزمن الاستجابة. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | مدة بقاء نتائج الفحص الصحي في ذاكرة التخزين المؤقت. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | مدة بقاء نتائج اختبارات صحة الوكيل الفاشلة في ذاكرة التخزين المؤقت. اجعلها أقصر من `PROXY_HEALTH_CACHE_TTL_MS` لكي يُعاد سريعًا اختبار حالات انتهاء مهلة الوكيل العابرة تحت التزامن العالي، من دون تعطيل الفشل السريع للوكلاء المتوقفين فعليًا. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | اضبطه على `false` لتعطيل مجدول صحة الوكلاء في الخلفية الذي يختبر الوكلاء المسجلين دوريًا. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | الفاصل الزمني بالمللي ثانية بين عمليات المسح التي يجريها مجدول الصحة في الخلفية (الحد الأدنى `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | هدف اختبار إمكانية الوصول الذي يستخدمه المجدول ونقطة النهاية `/api/settings/proxies/auto-test`. وجّهه إلى عنوان URL داخلي/ذاتي الاستضافة لتجنب القيمة الافتراضية العامة. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | عدد الاختبارات التي تبدأ دفعة واحدة لكل مجموعة، ويشترك فيه المجدول ونقطة النهاية `/api/settings/proxies/auto-test`. يُقرب إلى 1 كحد أدنى ويُقيد عند 50 كحد أقصى. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | التأخير بالمللي ثانية بين انطلاق اختبارين داخل الدفعة. من دونه تنطلق الدفعة بأكملها في اللحظة نفسها، وقد يتسبب عنوان IP مشترك للخروج في تشغيل تقييد المعدل لدى الهدف. اضبطه على `0` لتعطيل التباعد؛ والحد الأقصى 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | اضبطه على "false" لإيقاف اختبار المضيف الحقيقي لمزوّد معيّن إلى الوكيل (`GET /models`، من دون مفتاح API)، واستخدام `PROXY_HEALTH_TEST_URL` دائمًا بدلًا منه. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | عندما تكون القيمة `false` (الافتراضية)، تكون اختبارات إمكانية الوصول الآلية (المجدول + زر "اختبار الكل" في `/api/settings/proxies/auto-test`) **للقراءة فقط** ولا تكتب حالة الوكيل مطلقًا — المشغّل وحده يحدد نشط/غير نشط، وبذلك لا يمكن لاختبار متذبذب أن يترك وكيلًا معيّنًا عالقًا (#6246). اضبطه على `true` لاستعادة سلوك الاختبار والتعيين القديم. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | علامة ميزة اختيارية (راجع [FEATURE_FLAGS.md](./FEATURE_FLAGS.md)؛ يتغلب تجاوز قاعدة بيانات لوحة المعلومات). تعرض القيمة `true` (أو `1`، `yes`) ملاحظة خروج التجمع للقراءة فقط أسفل تجمع الوكلاء في لوحة المعلومات (عناوين IP المميزة للخروج، والاتصالات، والعنوان الأكثر ظهورًا خلف عنوان IP واحد خلال آخر 24 ساعة، استنادًا إلى سجل الوكيل). لا تُستخدم مطلقًا للتوجيه. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | اضبطه على `true` للسماح للمجدول بإزالة الوكلاء تلقائيًا بعد حالات فشل متتالية ومتكررة. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | عدد حالات الفشل المتتالية قبل أن يزيل المجدول وكيلًا تلقائيًا (عندما تكون `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | اضبطه على `true` للسماح للمجدول بتعطيل الوكيل تعطيلًا مرنًا (الحالة `dead`، من دون حذفه مطلقًا) بعد حالات فشل متتالية ومتكررة، بدلًا من إزالته. بديل غير هدّام لـ `PROXY_AUTO_REMOVE`: يخرج الوكيل فورًا من حلّ التجمع/التناوب (مرشح الحالة الحية الذي يستخدمه حلّ تجمع النطاق يستبعده بالفعل)، ويُعاد تنشيطه تلقائيًا بمجرد أن يبدأ في اجتياز الاختبارات مرة أخرى. يشترك في عتبة `PROXY_AUTO_REMOVE_AFTER`. إذا كانت كلتا العلامتين `true`، تكون الأولوية لـ `PROXY_AUTO_REMOVE`. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | السماح لتدفقات OAuth والتحقق من صحة المزوّد بتجاوز وكيل مثبت والاتصال مباشرةً عند فشل الفحوصات المسبقة لإمكانية الوصول إلى الوكيل. ترتيب الأولوية الفعلي هو تجاوز قاعدة بيانات علامات الميزات > متغير البيئة > القيمة الافتراضية. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30ث) | `open-sse/services/rateLimitManager.ts` | أقصى مدة انتظار عند تلقي 429 قبل إفشال الطلب. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 دقائق) | `open-sse/services/rateLimitManager.ts` | الحد الأقصى لمدة بقاء طلب مقبول قيد التنفيذ قبل انتهاء صلاحية حجز حد المعدل الخاص به — وهو منفصل عن ميزانية انتظار قائمة الانتظار، بحيث لا يؤدي بطء بدء الجلب على البوابات غير التزايدية إلى انتهاء المهلة (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (معطّل) | `open-sse/services/rateLimitManager.ts` | الحد الأقصى لقبول الطلبات في قائمة الانتظار: الرفض بحالة 429 و`queue_full` بمجرد وجود هذا العدد من الطلبات في قائمة الانتظار. `0` = غير محدود (الافتراضي). | -| `RATE_LIMIT_AUTO_ENABLE` | _(غير معيّن)_ | `open-sse/services/rateLimitManager.ts` | فرض تشغيل/إيقاف شبكة أمان التمكين التلقائي لحد المعدل بغض النظر عن إعداد لوحة المعلومات المحفوظ. يقبل `true`/`1`/`on` لفرض التشغيل، و`false`/`0`/`off` لفرض الإيقاف. | -| `PROVIDER_COOLDOWN_ENABLED` | _(غير معيّن → متوقف)_ | `open-sse/services/providerCooldownTracker.ts` | تتبع اختياري وعام لفترة تهدئة المزوّد/الاتصال عبر الطلبات. متوقف افتراضيًا (يتداخل مع تهدئة الاتصال / قاطع دائرة المزوّد). يقبل `true`/`1`/`on` للتمكين. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | الحد الأدنى لفترة التهدئة (بالمللي ثانية) قبل إعادة محاولة المزوّد/الاتصال الفاشل. تتزايد أسيًا مع حالات الفشل المتتالية. لا يُستخدم إلا عند تمكين `PROVIDER_COOLDOWN_ENABLED`. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 دقائق) | `open-sse/services/providerCooldownTracker.ts` | الحد الأقصى لفترة التهدئة (بالمللي ثانية) قبل إعادة محاولة المزوّد/الاتصال الفاشل في جميع الأحوال. لا يُستخدم إلا عند تمكين `PROVIDER_COOLDOWN_ENABLED`. | -| `STREAM_RECOVERY_ENABLED` | _(غير معيّن → متوقف)_ | `src/lib/resilience/settings.ts` (تهيئة) → `open-sse/services/streamRecovery.ts` (منطق) | **ما هي:** استعادة شفافة للتدفقات الصاعدة المبتورة (منقول من free-claude-code). تحتفظ بنافذة SSE الافتتاحية لمدة تصل إلى `STREAM_RECOVERY.HOLDBACK_MS` (750 مللي ثانية)، بحيث يُعاد فتح القطع _السابق للإرسال_ — الذي يحدث قبل وصول أي بايت إلى العميل — وتُعاد محاولته بصورة غير مرئية. **متى تُمكّن:** عند وجود مصادر صاعدة متذبذبة/تُجري بترًا متكررًا دون أي بايت عند بدء التدفق؛ اتركها متوقفة إذا لم يكن بإمكانك تحمّل ما يصل إلى 750 مللي ثانية إضافية في زمن الوصول إلى أول رمز مميز لكل تدفق. تقبل `true`/`1`/`on`. تهيّئ إعداد المرونة المحفوظ؛ وتكون الغلبة لإعداد لوحة المعلومات بعد تعيينه. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(غير معيّن → متوقف)_ | `src/lib/resilience/settings.ts` (تهيئة) → `open-sse/services/streamRecovery.ts` (منطق) | **ما هي:** استمرارية منتصف التدفق (المرحلة 4.4) — بعد بتر _لاحق للإرسال_ (وصلت البايتات بالفعل إلى العميل)، يُعاد الطلب باستخدام النص الجزئي بوصفه تعبئة مسبقة للمساعد، وتُلحم اللاحقة المفقودة. تدفقات نص عادي متوافقة مع OpenAI فقط؛ ولا تعمل مطلقًا أثناء وجود استدعاء أداة قيد التنفيذ. **متى تُمكّن:** عند وجود عمليات توليد طويلة تنقطع في منتصف الإجابة، وإذا كنت تقبل وصول الذيل المستعاد دفعة واحدة بدلًا من رمز مميز تلو الآخر. مستقلة عن `STREAM_RECOVERY_ENABLED` (ملف مخاطر مختلف). تقبل `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(غير معيّن → متوقف)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | مراقب اختياري للمخرجات المفيدة في التدفقات النشطة. يكتشف التدفقات التي تستمر في إرسال المقاطع لكنها تظل دون معدل مخرجات المساعد المضبوط؛ ولا تتنكر نبضات القلب وأحداث الاستخدام والفروق الفارغة ومراحل الأدوات/الاستدلال في صورة تقدم. وهو منفصل عن مهل الخمول والمواعيد النهائية الصارمة. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | فترة سماح قبل تقييم معدل النقل، محدودة بين 0 و600000 مللي ثانية. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | نافذة متحركة للمخرجات المفيدة، محدودة بين 1000 و600000 مللي ثانية؛ ويلزم اكتمال نافذة واحدة قبل الإيقاف. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | الحد الأدنى لمعدل بايتات مخرجات المساعد بترميز UTF-8 (بديل محافظ للرموز المميزة)، محدود بين 1 و1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | الحد الأدنى لعينة المخرجات المفيدة غير الصفرية التي تُعد قابلة للقياس، محدود بين 1 و1000000 بايت. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | الفاصل المتدرج (بالمللي ثانية) بين فحوصات صحة الرموز المميزة للمزوّد عند بدء التشغيل. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | الحد الأدنى للتفاوت العشوائي (بالمللي ثانية) المضاف فوق `HEALTHCHECK_STAGGER_MS` بين فحوصات صحة الرموز المميزة للمزوّد، لمنع الاندفاعات (المشكلة #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | الحد الأقصى للتفاوت العشوائي (بالمللي ثانية) المضاف فوق `HEALTHCHECK_STAGGER_MS` بين فحوصات صحة الرموز المميزة للمزوّد، لمنع الاندفاعات (المشكلة #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | حجم دفعة الفحص المتزامن لمسح صحة الرموز المميزة عند بدء التشغيل؛ تفحص القيم الأكبر اتصالات أكثر بالتوازي، بينما تقلل القيم الأصغر حمل الاندفاع (المشكلة #7875، تراجع في #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | عدد المحاولات التلقائية عند استجابات التهدئة محددة النطاق بالنموذج قبل إعادة الخطأ إلى العميل. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | أقصى فاصل للتراجع (بالثواني) بين محاولات التهدئة. يُقيد بهذه القيمة بغض النظر عن `Retry-After` الوارد من المصدر الصاعد. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | عنوان URL لوكيل توفير الرموز المميزة Headroom. تُطلق دورة حياة لوحة المعلومات (`api/headroom/*`) افتراضيًا واجهة CLI محلية لـ `headroom-ai` على واجهة الاسترجاع المحلية؛ لا تتجاوزها إلا للإشارة إلى وكيل Docker جانبي خارجي. | - -### ثوابت ضبط استرداد التدفق - -يُضبط سلوك تأخير الاسترداد بواسطة ثوابت مضمّنة في الشيفرة داخل -`open-sse/config/constants.ts` (`STREAM_RECOVERY`)، وهي موضحة هنا للرجوع إليها — +| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | +| ------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | مهلة الفحص الصحي للفشل السريع. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | النافذة الزمنية (بالساعات) لحساب متوسط زمن الاستجابة للوكلاء المرشحين ضمن استراتيجية المجموعة المحسّنة لزمن الاستجابة. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | مدة صلاحية ذاكرة التخزين المؤقت لنتيجة الفحص الصحي. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | مدة صلاحية ذاكرة التخزين المؤقت لعمليات فحص صحة الوكيل الفاشلة. أبقِ هذه المدة أقصر من `PROXY_HEALTH_CACHE_TTL_MS` حتى يُعاد سريعًا إجراء المحاولة عند انتهاء مهلة الوكيل بصورة عابرة في ظل التزامن المرتفع، من دون تعطيل الفشل السريع للوكلاء المتوقفين فعليًا. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | عيّنها إلى `false` لتعطيل مجدول صحة الوكيل في الخلفية الذي يفحص الوكلاء المسجلين دوريًا. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | الفاصل الزمني لجولة مجدول الصحة في الخلفية بالمللي ثانية (الحد الأدنى `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | هدف اختبار قابلية الوصول الذي يستخدمه المجدول ونقطة النهاية `/api/settings/proxies/auto-test`. وجّهه إلى عنوان URL داخلي/مستضاف ذاتيًا لتجنب العنوان العام الافتراضي. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | عدد الاختبارات التي تبدأ دفعةً واحدة في كل حزمة، والمشتركة بين المجدول ونقطة النهاية `/api/settings/proxies/auto-test`. يُضبط الحد الأدنى على 1 والحد الأقصى على 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | التأخير بالمللي ثانية بين انطلاق اختبارين داخل حزمة. من دونه، تنطلق الحزمة بأكملها في اللحظة نفسها، وقد يؤدي عنوان IP مشترك للخروج إلى تجاوز حد المعدل للهدف. اضبطه على `0` لتعطيل التباعد؛ والحد الأقصى هو 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | اضبطه على "false" لإيقاف اختبار المضيف الفعلي لمزوّد الوكيل المعيّن (`GET /models`، من دون مفتاح API) واستخدام `PROXY_HEALTH_TEST_URL` دائمًا بدلًا منه. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | عندما تكون القيمة `false` (الافتراضية)، تكون اختبارات قابلية الوصول الآلية (المجدول + زر "اختبار الكل" في `/api/settings/proxies/auto-test`) **للقراءة فقط** ولا تعدّل حالة الوكيل مطلقًا — فالمشغّل وحده هو من يحدّد الحالة النشطة/غير النشطة، وبذلك لا يمكن لاختبار متقلب أن يعطّل وكيلًا معيّنًا (#6246). اضبطها على `true` لاستعادة سلوك الاختبار والتعيين القديم. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | علامة ميزة اختيارية (راجع [FEATURE_FLAGS.md](./FEATURE_FLAGS.md)؛ وتتغلب عليها قيمة التجاوز في قاعدة بيانات لوحة المعلومات). تعرض القيمة `true` (أو `1` أو `yes`) ملاحظة خروج المجمّع للقراءة فقط أسفل مجمّع وكلاء في لوحة المعلومات (عناوين IP المميزة للخروج، والاتصالات، وأعلى عدد شوهد خلف عنوان IP واحد خلال آخر 24 ساعة، استنادًا إلى سجل الوكيل). لا تُستخدم مطلقًا للتوجيه. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | اضبطها على `true` للسماح للمجدول بإزالة الوكلاء تلقائيًا بعد إخفاقات متتالية ومتكررة. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | عدد الإخفاقات المتتالية قبل أن يزيل المجدول وكيلًا تلقائيًا (عندما تكون `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | اضبطه على `true` للسماح للمجدول بإجراء تعطيل مبدئي للوكيل (الحالة `dead`، من دون حذفه مطلقًا) بعد إخفاقات متتالية ومتكررة، بدلًا من إزالته. وهو بديل غير هدّام لـ `PROXY_AUTO_REMOVE`: يُستبعد الوكيل فورًا من تحليل المجموعة/التناوب (مرشح الحالة النشطة الذي يستخدمه تحليل مجموعة النطاق يستبعده بالفعل)، ويُعاد تنشيطه تلقائيًا بمجرد أن يبدأ في اجتياز عمليات الفحص مرة أخرى. يستخدم حد `PROXY_AUTO_REMOVE_AFTER` نفسه. إذا كانت كلتا العلامتين `true`، تكون الأولوية لـ `PROXY_AUTO_REMOVE`. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | السماح لتدفقات OAuth والتحقق من صحة المزوّد بتجاوز وكيل مثبّت والاتصال مباشرةً عند فشل عمليات التحقق المسبق من إمكانية الوصول إلى الوكيل. ترتيب الأولوية الفعلي هو: تجاوز قاعدة بيانات علامات الميزات > متغير البيئة > القيمة الافتراضية. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 ثانية) | `src/lib/resilience/settings.ts` | ميزانية **انتظار قائمة الانتظار** الافتراضية: المدة التي يمكن أن ينتظرها الطلب للحصول على خانة لدى المزوّد وأن يظل خلالها في قائمة الانتظار قبل رفضه، من دون أن يصل مطلقًا إلى الخدمة المصدر. يُلغى المؤقت بمجرد بدء تنفيذ المهمة — ويُقيّد التنفيذ بشكل منفصل بواسطة `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. يعيّن متغير البيئة القيمة الافتراضية فقط: تتغلب عليها أولًا القيمة المحفوظة `resilienceSettings.requestQueue.maxWaitMs`، ثم قيمة `rateLimitOverrides.maxWaitMs` الخاصة بكل اتصال. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 دقائق) | `open-sse/services/rateLimitManager.ts` | الحد الأقصى للمدة التي يمكن أن يبقى خلالها الطلب المقبول قيد التنفيذ قبل انتهاء صلاحية حجز حد المعدل الخاص به — وهو منفصل عن ميزانية انتظار قائمة الانتظار، بحيث لا يؤدي البطء في بدء الجلب عبر البوابات غير التزايدية إلى انتهاء المهلة (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (معطّل) | `open-sse/services/rateLimitManager.ts` | الحد الأقصى لقبول الطلبات في قائمة الانتظار: يُرفض الطلب باستجابة 429 وقيمة `queue_full` بمجرد وجود هذا العدد من الطلبات في قائمة الانتظار بالفعل. `0` = بلا حد (القيمة الافتراضية). | +| `RATE_LIMIT_AUTO_ENABLE` | _(غير معيّن)_ | `open-sse/services/rateLimitManager.ts` | فرض تشغيل شبكة أمان التمكين التلقائي لحد المعدل أو إيقافها بغض النظر عن إعداد لوحة المعلومات المحفوظ. يقبل `true`/`1`/`on` لفرض التشغيل، و`false`/`0`/`off` لفرض الإيقاف. | +| `PROVIDER_COOLDOWN_ENABLED` | _(غير معيّن → متوقف)_ | `open-sse/services/providerCooldownTracker.ts` | تتبع اختياري وعام لفترة تهدئة المزوّد/الاتصال عبر الطلبات المختلفة. يكون متوقفًا افتراضيًا (يتداخل مع فترة تهدئة الاتصال / قاطع دائرة المزوّد). يقبل `true`/`1`/`on` للتمكين. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | الحد الأدنى لفترة التهدئة (بالمللي ثانية) قبل إعادة محاولة استخدام مزوّد/اتصال فاشل. تزداد أُسيًا مع الإخفاقات المتتالية. لا تُستخدم إلا عند تمكين `PROVIDER_COOLDOWN_ENABLED`. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 دقائق) | `open-sse/services/providerCooldownTracker.ts` | الحد الأقصى لفترة التهدئة (بالمللي ثانية) قبل إعادة محاولة استخدام مزوّد/اتصال فاشل بغض النظر عن الظروف. يُستخدم فقط عند تفعيل `PROVIDER_COOLDOWN_ENABLED`. | +| `STREAM_RECOVERY_ENABLED` | _(غير معيّن → متوقف)_ | `src/lib/resilience/settings.ts` (تهيئة) → `open-sse/services/streamRecovery.ts` (المنطق) | **ما هو:** استرداد شفاف للتدفقات المبتورة من المصدر (منقول من free-claude-code). يحتفظ بنافذة SSE الافتتاحية لمدة تصل إلى `STREAM_RECOVERY.HOLDBACK_MS` (750 مللي ثانية)، بحيث يُعاد فتح الانقطاع _السابق للالتزام_ — أي الذي يحدث قبل وصول أي بايت إلى العميل — وتُعاد محاولته بصورة غير مرئية. **متى يُفعّل:** مع المصادر غير المستقرة/التي كثيرًا ما تبتور التدفق عند بدايته دون إرسال أي بايت؛ اتركه متوقفًا إذا لم يكن بإمكانك تحمّل إضافة ما يصل إلى 750 مللي ثانية إلى زمن الوصول إلى أول رمز في كل تدفق. يقبل `true`/`1`/`on`. يهيّئ إعداد المرونة الدائم؛ وتكون الأولوية لإعداد لوحة المعلومات بمجرد تعيينه. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(غير معيّن → متوقف)_ | `src/lib/resilience/settings.ts` (تهيئة) → `open-sse/services/streamRecovery.ts` (المنطق) | **ما هو:** استكمال منتصف التدفق (المرحلة 4.4) — بعد حدوث بتر _لاحق للالتزام_ (أي بعد وصول بايتات بالفعل إلى العميل)، يُعاد إرسال الطلب مع النص الجزئي كتعبئة مسبقة لرد المساعد، ثم تُدمج اللاحقة المفقودة. يقتصر ذلك على التدفقات النصية الصرفة المتوافقة مع OpenAI؛ ولا يُفعّل أبدًا أثناء تنفيذ استدعاء أداة. **متى يُفعّل:** مع عمليات التوليد الطويلة التي تنقطع في منتصف الإجابة، وإذا كنت تقبل وصول الجزء المسترد دفعة واحدة بدلًا من وصوله رمزًا تلو الآخر. مستقل عن `STREAM_RECOVERY_ENABLED` (وله نمط مخاطر مختلف). يقبل `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(غير معيّن → متوقف)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | مراقب اختياري للمخرجات المفيدة في التدفقات النشطة. يكتشف التدفقات التي تستمر في إرسال المقاطع لكنها تظل دون معدل مخرجات المساعد المضبوط؛ ولا تُحتسب نبضات الاستمرارية، أو أحداث الاستخدام، أو الفروق الفارغة، أو مراحل الأدوات/الاستدلال كتقدّم زائف. وهو منفصل عن مهل الخمول والمواعيد النهائية الصارمة. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | فترة سماح قبل تقييم معدل النقل، محصورة بين 0 و600000 مللي ثانية. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | نافذة متحركة للمخرجات المفيدة، محصورة بين 1000 و600000 مللي ثانية؛ ويلزم اكتمال نافذة واحدة قبل الإلغاء. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | الحد الأدنى لمعدل بايتات UTF-8 لمخرجات المساعد (بديل تقريبي متحفظ للرموز)، محصور بين 1 و1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | الحد الأدنى لعينة المخرجات المفيدة غير الصفرية التي تُعد قابلة للقياس، محصور بين 1 و1000000 بايت. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | الفاصل الزمني المتدرّج (بالمللي ثانية) بين فحوصات سلامة رموز المزوّدين عند بدء التشغيل. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | الحد الأدنى للتفاوت العشوائي (بالمللي ثانية) المُضاف فوق `HEALTHCHECK_STAGGER_MS` بين فحوصات سلامة رموز المزوّدين، لمنع إرسالها دفعة واحدة (المشكلة #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | الحد الأقصى للتفاوت العشوائي (بالمللي ثانية) المُضاف فوق `HEALTHCHECK_STAGGER_MS` بين فحوصات سلامة رموز المزوّدين، لمنع إرسالها دفعة واحدة (المشكلة #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | حجم دفعة الفحوصات المتزامنة لمسح التحقق من صحة الرموز عند بدء التشغيل؛ تتحقق القيم الأكبر من مزيد من الاتصالات بالتوازي، بينما تقلل القيم الأصغر حمل الاندفاع (المشكلة #7875، تراجع ناتج عن #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | عدد مرات إعادة المحاولة التلقائية عند تلقي استجابات تهدئة خاصة بالنموذج قبل إرجاع خطأ إلى العميل. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | الحد الأقصى لفاصل التراجع (بالثواني) بين محاولات إعادة المحاولة بعد التهدئة. يُقيَّد بهذه القيمة بغض النظر عن قيمة `Retry-After` الواردة من المصدر العلوي. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | عنوان URL لوكيل Headroom الموفّر للرموز. تُشغّل دورة حياة لوحة المعلومات (`api/headroom/*`) افتراضيًا أداة سطر الأوامر `headroom-ai` محليًا على واجهة الاسترجاع؛ لا تتجاوز هذه القيمة إلا للإشارة إلى وكيل جانبي خارجي يعمل ضمن Docker. | + +### ثوابت ضبط استعادة التدفق + +يُضبط سلوك تأخير الاستعادة بواسطة ثوابت مضمنة في الشيفرة ضمن +`open-sse/config/constants.ts` ‏(`STREAM_RECOVERY`)، وهي موضحة هنا للرجوع إليها — ويتطلب تغييرها تعديل الشيفرة، وليس متغير بيئة: - `STREAM_RECOVERY.HOLDBACK_MS = 750` — المدة التي تُحتجز خلالها نافذة SSE الافتتاحية بحيث يمكن إعادة المحاولة عند حدوث اقتطاع مبكر قبل إرسال أي بايت إلى العميل. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — الحد الأقصى الصارم للنافذة المحتجزة؛ يتم الإرسال - (التفريغ + التمرير المباشر) بمجرد تراكم هذا العدد من البايتات، بصرف النظر عن المؤقت. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — الحد الأقصى لعمليات إعادة الفتح الشفافة لتدفق - المصدر أثناء بقاء المحتوى المحتجز غير مُرسل. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — الحد الأقصى الصارم للنافذة المحتجزة؛ يجري اعتمادها + (التفريغ + التمرير المباشر) بمجرد تراكم هذا العدد من البايتات، بغض النظر عن المؤقت. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — الحد الأقصى لعمليات إعادة الفتح الشفافة للتدفق العلوي + ما دام التأخير لم يُعتمد بعد. -> **حد المعدل لكل موفّر باستخدام نافذة منزلقة (من دون متغير بيئة):** يوجد في الشيفرة +> **حد المعدل لكل موفّر باستخدام نافذة منزلقة (دون متغير بيئة):** يوجد في الشيفرة > حد معدل _احتياطي_ لكل موفّر باستخدام نافذة منزلقة، والمنقول من FCC > (`open-sse/services/providerDefaultRateLimit.ts`، والموصول عبر > `open-sse/services/rateLimitManager.ts`)، لكنه يأتي مع **خريطة افتراضية فارغة** -> ولا يتضمن حاليًا **متغير بيئة للمشغّل** — ولا يُفعّل إلا عبر نقطة ربط اختبارية / -> تعديل الشيفرة. وقد تعمّدنا عدم إدراجه في الجدول أعلاه. أما محدِّد الترحيل لكل -> `(token, IP)` الذي _يتضمن_ بالفعل إعدادًا قابلًا للضبط فهو `RELAY_IP_PER_MINUTE` (§3 الشبكة والمنافذ). +> ولا يتوفر له حاليًا **متغير بيئة للمشغّل** — ولا يُفعّل إلا عبر خطاف اختبار / +> تعديل الشيفرة. ولهذا السبب لا يُدرج عمدًا في الجدول أعلاه. أما محدد معدل الترحيل لكل +> `(token, IP)` الذي _يتضمن_ إعدادًا قابلًا للضبط فهو `RELAY_IP_PER_MINUTE` (§3 الشبكة والمنافذ). --- ## 22. تصحيح الأخطاء > [!CAUTION] -> تُنتج هذه المتغيرات **مخرجات تفصيلية** وقد تسرّب بيانات حساسة. **لا تفعّلها مطلقًا في بيئة الإنتاج.** - -| المتغير | القيمة الافتراضية | الملف المصدري | الوصف | -| ------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(غير معيّن)_ | `open-sse/executors/cursor.ts` | اضبطه على `1` لتمكين سجلات منفّذ Cursor التفصيلية (أجزاء SSE مفككة الترميز، وما إلى ذلك). | -| `CURSOR_STREAM_DEBUG` | _(غير معيّن)_ | `open-sse/executors/cursor.ts` | اسم مستعار متوافق مع الإصدارات السابقة للمتغير `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(غير معيّن)_ | `open-sse/executors/cursor.ts` | مسار ملف اختياري يستقبل أجزاء Cursor الأولية مفككة الترميز عندما تكون القيمة `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | مهلة خمول الدفق (بالمللي ثانية) لمنفّذ Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | نافذة سماح (بالمللي ثانية) بعد فاصل composer `kv_after_text` المرن عندما تبقى وحدات بايت في المخزن المؤقت — مما يمنح استدعاء أداة `exec_mcp` اللاحق وقتًا لإكمال إطاره. | -| `CURSOR_TOOL_DIRECTIVE` | مفعّل (`!== "0"`) | `open-sse/executors/cursor.ts` | توجيه لاعتماد الأداة يجعل composer-2.5 يصدر استدعاءات الأدوات بصورة موثوقة. اضبطه على `0` لتعطيله. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(غير معيّن)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | نص موجّه النظام الذي يحدده المشغّل، ويُلحق برسالة النظام بعد الترجمة (حقن ما بعد الترجمة)، ليصل إلى مسارات codex/Responses و`/v1/messages`. يُستخدم أيضًا كبادئة التوجيه التي تُزال من كتل تمهيد النظام المكررة. اتركه دون تعيين لتعطيله. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | مهلة جلب كل صورة (بالمللي ثانية) لإدخال الرؤية البعيد `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(مُكتشَف بالفحص)_ | `open-sse/utils/cursorVersionDetector.ts` | تجاوز البحث عن قاعدة بيانات حالة Cursor IDE المستخدمة لاكتشاف إصدار IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(اكتشاف / تثبيت)_ | `open-sse/utils/cursorAgentCliVersion.ts` | معرّف بنية Agent CLI‏ (`YYYY.MM.DD-`) للترويسة `x-cursor-client-version: cli-…` عند تشغيل Agent. | -| `CURSOR_AGENT_BIN` | _(غير معيّن)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | مسار الملف التنفيذي لـCursor Agent المستخدم في إنشاء الصور. عند عدم تعيينه، يستخدم المعالج `providerSpecificData.agentBin` ثم PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | الوقت الفعلي الأقصى لكل صورة (بالمللي ثانية) لمهام صور Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | بوابة التزامن للمقعد المشترك لمهام صور Cursor. | -| `CURSOR_IMG_MODEL` | الطلب / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | تجاوز خيار Cursor CLI‏ `--model` لمهام الصور. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | وتيرة استطلاع نتائج إنشاء الصور في UC‏ (uncensored.com) (بالمللي ثانية). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | الوقت الفعلي الأقصى لاستطلاع نتائج إنشاء الصور في UC (بالمللي ثانية). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | وتيرة استطلاع نتائج إنشاء الفيديو في UC‏ (uncensored.com) (بالمللي ثانية). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | الوقت الفعلي الأقصى لاستطلاع نتائج إنشاء الفيديو في UC (بالمللي ثانية). | -| `CURSOR_DATA_DIR` | _(مُكتشَف بالفحص)_ | `open-sse/utils/cursorAgentCliVersion.ts` | تجاوز دليل بيانات Cursor Agent CLI‏ (`…/versions/`)؛ وهو المتغير نفسه الذي يستخدمه الوكيل الرسمي. | -| `CURSOR_TOKEN` | _(غير معيّن)_ | `scripts/ad-hoc/cursor-tap.cjs` | رمز حامل Cursor مباشر تستخدمه أدوات المطورين. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | معطّل (الاشتراك الاختياري عبر `"1"`) | `src/app/api/v1/chat/completions/route.ts` | تسجيل مؤشرات نوع المحتوى/الطول لحمولات المحادثة الكبيرة عند تعيين `"1"`. يكون متوقفًا افتراضيًا لتقليل ضوضاء السجل. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(غير معيّن)_ | `open-sse/handlers/responseTranslator.ts` | اضبطه على `true` لتسجيل تفاصيل ترجمة Responses API من SSE إلى JSON. | -| `DEBUG_CLAUDE_NONSTREAM` | _(غير معيّن)_ | `open-sse/handlers/responseTranslator.ts` | اضبطه على `true` لإظهار أجزاء `textContent` الفارغة في مسار ترجمة استجابة Claude (لتصحيح الأخطاء فقط). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(غير معيّن)_ | بيئة اختبار E2E | اضبطه على `true` لتمكين وضع اختبار E2E (مصادقة مخففة، وخطافات اختبار). | +> تُنتج هذه المتغيرات **مخرجات مطوّلة** وقد تسرّب بيانات حساسة. **لا تفعّلها مطلقًا في بيئة الإنتاج.** + +| المتغير | القيمة الافتراضية | الملف المصدر | الوصف | +| ------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(غير معيّن)_ | `open-sse/executors/cursor.ts` | اضبطه على `1` لتمكين سجلات منفّذ Cursor المطوّلة (أجزاء SSE التي فُك ترميزها، وما إلى ذلك). | +| `CURSOR_STREAM_DEBUG` | _(غير معيّن)_ | `open-sse/executors/cursor.ts` | اسم مستعار متوافق مع الإصدارات السابقة للمتغير `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(غير معيّن)_ | `open-sse/executors/cursor.ts` | مسار ملف اختياري يستقبل أجزاء Cursor الأولية التي فُك ترميزها عندما تكون القيمة `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | مهلة خمول التدفق (بالمللي ثانية) لمنفّذ Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | نافذة سماح (بالمللي ثانية) بعد محدِّد composer `kv_after_text` المرن عندما تظل وحدات بايت مخزّنة مؤقتًا — مما يمنح استدعاء أداة `exec_mcp` اللاحق وقتًا لإكمال إطاره. | +| `CURSOR_TOOL_DIRECTIVE` | مفعّل (`!== "0"`) | `open-sse/executors/cursor.ts` | توجيه لتثبيت الأداة يجعل `composer-2.5` يصدر استدعاءات الأدوات بصورة موثوقة. اضبطه على `0` لتعطيله. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(غير معيّن)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | نص موجّه النظام الذي يحدده المشغّل، ويُلحَق برسالة النظام بعد الترجمة (حقن ما بعد الترجمة)، ليصل إلى مسارات codex/Responses و`/v1/messages`. ويُستخدم أيضًا كبادئة توجيه تُزال من كتل تمهيد النظام المرتدة. اتركه دون تعيين لتعطيله. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (متوقف) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | اضبطه على `1` لإزالة كتل تمهيد موجّه النظام المرتدة من بداية تدفق openai→claude. يكون متوقفًا افتراضيًا — إذ إن أساليب الاستدلال مصممة وفق نمط النثر الإنجليزي وتعدّل حمولة الاستجابة، ولذلك فإن أي رد يبدأ بصورة مشروعة بقسم من هذا النوع سيفقده. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | مهلة جلب كل صورة (بالمللي ثانية) لمدخلات الرؤية البعيدة `image_url`. | +| `CURSOR_STATE_DB_PATH` | _(يُكتشف)_ | `open-sse/utils/cursorVersionDetector.ts` | تجاوز البحث عن قاعدة بيانات حالة Cursor IDE المستخدمة لاكتشاف إصدار IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(اكتشاف / تثبيت)_ | `open-sse/utils/cursorAgentCliVersion.ts` | معرّف إصدار Agent CLI (`YYYY.MM.DD-`) المستخدم مع `x-cursor-client-version: cli-…` في Agent Run. | +| `CURSOR_AGENT_BIN` | _(غير معيّن)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | مسار ملف Cursor Agent الثنائي المستخدم لتوليد الصور. عند عدم تعيينه، يستخدم المعالج `providerSpecificData.agentBin` ثم PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | الوقت الفعلي الأقصى لكل صورة (بالمللي ثانية) لمهام صور Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | بوابة التزامن للمقعد المشترك لمهام صور Cursor. | +| `CURSOR_IMG_MODEL` | الطلب / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | تجاوز قيمة `--model` في Cursor CLI لمهام الصور. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | وتيرة استطلاع نتائج توليد الصور في UC (uncensored.com) (بالمللي ثانية). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | الوقت الفعلي الأقصى لاستطلاع نتائج توليد الصور في UC (بالمللي ثانية). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | وتيرة استطلاع نتائج توليد الفيديو في UC (uncensored.com) (بالمللي ثانية). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | الوقت الفعلي الأقصى لاستطلاع نتائج توليد الفيديو في UC (بالمللي ثانية). | +| `CURSOR_DATA_DIR` | _(يُكتشف)_ | `open-sse/utils/cursorAgentCliVersion.ts` | تجاوز دليل بيانات Cursor Agent CLI (`…/versions/`)؛ وهو المتغير نفسه الذي يستخدمه الوكيل الرسمي. | +| `CURSOR_TOKEN` | _(غير معيّن)_ | `scripts/ad-hoc/cursor-tap.cjs` | رمز حامل Cursor مباشر تستخدمه أدوات المطورين. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | معطّل (تفعيل اختياري عبر `"1"`) | `src/app/api/v1/chat/completions/route.ts` | تسجيل مؤشرات نوع المحتوى/الطول لحمولات المحادثة الكبيرة عند تعيين `"1"`. يكون متوقفًا افتراضيًا لتقليل ضجيج السجلات. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(غير معيّن)_ | `open-sse/handlers/responseTranslator.ts` | اضبطه على `true` لتسجيل تفاصيل ترجمة Responses API من SSE→JSON. | +| `DEBUG_CLAUDE_NONSTREAM` | _(غير معيّن)_ | `open-sse/handlers/responseTranslator.ts` | اضبطه على `true` لإظهار أجزاء `textContent` الفارغة في مسار ترجمة استجابة Claude (للتصحيح فقط). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(غير معيّن)_ | بيئة اختبارات E2E | اضبطه على `true` لتمكين وضع اختبارات E2E (مصادقة مخففة، وخطافات اختبار). | --- @@ -1219,7 +1229,7 @@ Claude Code CLI فقط، أو لم تكن متأكدًا من ماهية هذه ## سيناريوهات النشر -للحصول على إرشادات SRE الخاصة بالواجهة الخلفية للترحيل (سلوك ts/bifrost/auto، وموضع 9router مقارنةً بـ CLIProxyAPI، واستراتيجية الرجوع الاحتياطي عند معدل النقل المرتفع)، راجع [استراتيجية الواجهة الخلفية للترحيل](/docs/reference/RELAY_BACKEND_STRATEGY.md). +للحصول على إرشادات هندسة موثوقية المواقع (SRE) للواجهة الخلفية للترحيل (سلوك ts/bifrost/auto، وموضع 9router مقارنةً بـ CLIProxyAPI، واستراتيجية الرجوع الاحتياطي لمعدلات النقل العالية)، راجع [استراتيجية الواجهة الخلفية للترحيل](/docs/reference/RELAY_BACKEND_STRATEGY.md). ### الحد الأدنى للتطوير المحلي @@ -1250,7 +1260,7 @@ OMNIROUTE_MEMORY_MB=8192 CORS_ORIGIN=https://your-frontend.example.com ``` -### البيئات المعزولة شبكيًا / CI +### البيئات المعزولة عن الشبكة / CI ```bash JWT_SECRET=test-jwt-secret-for-ci diff --git a/docs/i18n/ar/docs/reference/FEATURE_FLAGS.md b/docs/i18n/ar/docs/reference/FEATURE_FLAGS.md index 8e1a3f2cf451..ae9e7febbff0 100644 --- a/docs/i18n/ar/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/ar/docs/reference/FEATURE_FLAGS.md @@ -42,157 +42,159 @@ --- -## دليل العلامات +## فهرس العلامات -72 علامة موزعة على 6 فئات. **القيمة الافتراضية** هي القيمة الافتراضية للتعريف — أي القيمة +74 علامة موزعة على 6 فئات. **الافتراضي** هو القيمة الافتراضية في التعريف — أي القيمة المستخدمة عند عدم وجود تجاوز في قاعدة البيانات أو متغير بيئة. ### الأمان (10) -| المفتاح | النوع | القيمة الافتراضية | الوصف | -| --------------------------------------- | ----- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | منطقي | `false` | طلب مفتاح API لجميع الطلبات الواردة. | -| `INPUT_SANITIZER_ENABLED` | منطقي | `true` | تفعيل تنقية المدخلات لجميع الطلبات. | -| `INJECTION_GUARD_MODE` | تعداد | `off` | وضع الحماية من حقن المطالبات. القيم: `off` و`warn` و`block` و`redact`. | -| `PII_REDACTION_ENABLED` | منطقي | `false` | حجب معلومات التعريف الشخصية من الطلبات (بشكل مستقل عن `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | منطقي | `false` | تنقية معلومات التعريف الشخصية من استجابات مزوّد الخدمة. | -| `PII_RESPONSE_SANITIZATION_MODE` | تعداد | `redact` | وضع تنقية معلومات التعريف الشخصية في الاستجابات. القيم: `redact` و`warn` و`block` و`off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | منطقي | `true` | حظر الطلبات الصادرة إلى نطاقات عناوين IP الخاصة/الداخلية. | -| `ALLOW_API_KEY_REVEAL` | منطقي | `false` | السماح لمستخدمي لوحة المعلومات المصادَق عليهم بكشف مفاتيح API المخزنة بدلًا من رؤية القيم المقنّعة فقط. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | منطقي | `false` | تضمين بادئة الحساب في أسطر سجل AUTH (مثل "استخدام حساب : abc12345..."). يكون هذا معطّلًا افتراضيًا بحيث تُحجب معرّفات الحسابات من سجلات العمليات المشتركة/متعددة المستأجرين. وهو مستقل عن وضع تصحيح الأخطاء؛ فتبديل وضع تصحيح الأخطاء لا يكشف هذه المعرّفات. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | منطقي | `false` | عند تفعيل OIDC، يُعطَّل تسجيل الدخول بكلمة المرور بحيث لا يمكن للمستخدمين المصادقة إلا عبر تسجيل الدخول الموحّد باستخدام OIDC. وعند تعطيله (وهو الإعداد الافتراضي)، يتوفر كلٌّ من تسجيل الدخول بكلمة المرور وOIDC. | - -### الشبكة (15) - -| المفتاح | النوع | الافتراضي | إعادة التشغيل | الوصف | -| ----------------------------------------------- | ------- | --------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | تمكين وضع التخفي ببصمة TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | السماح لمسارات /v1/audio/* باستخدام عُقد موفّرين متوافقة مع OpenAI ومستضافة خارج localhost. يكون معطّلًا افتراضيًا — إذ إن توجيه الصوت إلى مضيف بعيد يغيّر هوية الخروج، ويجب أن يكون قرارًا صريحًا من المشغّل. عُقد الاسترجاع الحلقي مسموح بها دائمًا ولا تتأثر. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | عند عدم تعيين وكيل لاتصال، يتم تلقائيًا اختيار أول وكيل عامل من السجل. يكون معطّلًا افتراضيًا (وإلا فسيصبح أي وكيل في السجل بديلًا احتياطيًا عامًا — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | السماح لتدفقات OAuth والتحقق من الموفّر بتجاوز وكيل مثبّت والاتصال مباشرةً عند فشل عمليات التحقق المسبق من إمكانية الوصول إلى الوكيل. يكون معطّلًا افتراضيًا لأن ذلك قد يغيّر عنوان IP للخروج. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | عند حدوث استثناء في الشبكة (انتهاء المهلة أو رفض الاتصال/إعادة تعيينه) لمنفّذ تدوير متعدد الحسابات، وعندما لا يملك الحساب المتعثر وكيلًا مخصصًا، تُطبّق فترة تهدئة قصيرة وتُتخطى الحسابات الأخرى التي لا تملك وكلاء لبقية الطلب بدلًا من إعادة محاولة كل حساب منها. يكون مفعّلًا افتراضيًا (آمن: لا يغيّر عنوان IP للخروج، بل يقلّل فقط مخاطر زمن الاستجابة/التهدئة للحسابات ذات الخروج المشترك). عطّله لاستعادة النشر الفوري عند أول استثناء صادر عن حساب بلا وكيل. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | تتوقف مجموعات الوكلاء وعملية التدوير لكل حساب في opencode عن إعادة تقديم وكيل فشل للتو (فشل فحص TCP بسبب الرفض، أو تلقّي 429 عبره) لمدة خاصة بكل عملية تتضاعف مع كل تكرار حتى حد أقصى. لا تُكتب أي حالة للوكيل؛ وعند استبعاد جميع المرشحين يبقى الاختيار دون تغيير. يكون معطّلًا افتراضيًا. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | إظهار عدد عناوين IP المرصودة للخروج التي خدمت أعضاء مجموعة وكلاء خلال آخر 24 ساعة، وعدد الاتصالات التي استخدمتها، أسفل مجموعة الوكلاء في لوحة المعلومات. للقراءة فقط، ويُحتسب من سجل الوكيل، ولا يُستخدم مطلقًا للتوجيه. يكون معطّلًا افتراضيًا. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | بالنسبة إلى منفّذ OpenCode، راقب أول بايت من النص الأساسي لاستجابة Responses متدفقة (النافذة: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`، والقيمة الافتراضية `15000`). يُعامل تدفق Responses ذي حالة 2xx الذي يظل صامتًا بعد انقضاء النافذة على أنه متوقف: يُوضع الحساب في فترة تهدئة ويُدوّر الطلب إلى الحساب التالي مرة واحدة؛ ويؤدي توقف ثانٍ إلى فشل سريع. يكون معطّلًا افتراضيًا: تحتفظ التدفقات المتوقفة بمدة الانتظار الحالية حتى انتهاء مهلة جاهزية التدفق. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | منفّذ OpenCode: عند ورود 403/451 يحمل رفضًا من نوع `user_blocked` (ليس متعلقًا بالموقع الجغرافي، وليس رفضًا لبصمة Cloudflare)، ضع الحساب المرفوض في فترة تهدئة ودوّر إلى الحساب التالي مرة واحدة كحد أقصى لكل طلب؛ ويُعاد الرفض الثاني كما هو، دون علامة نجاح. يكون معطّلًا افتراضيًا: قد يبدو الالتفاف في التوجيه حول حظر مستخدم من المنبع كنوع من المراوغة، وقد ينشر العلامة عبر كامل الأسطول. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | تدوير OpenCode: بعد فشلين عابرين متتاليين من المنبع (5xx أو 400 فارغ)، توقّف مؤقتًا قبل الانتقال إلى الحساب التالي — 1.5 ثانية تتضاعف مع كل فشل إضافي، بحد أقصى 6 ثوانٍ لكل توقف و10 ثوانٍ لكل طلب، ويُتخطى ذلك عند قطع العميل للاتصال؛ ويُحرر النص الأساسي الفاشل قبل الانتظار. يكون معطّلًا افتراضيًا: يظل تجاوز الفشل فوريًا. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | تدوير OpenCode: أوقف موجة الحسابات عند أول 429 يُصنّف على أنه حد فعلي لمعدل الطلبات (`Retry-After` قابل للتحليل، أو نص أساسي يذكر حدًا للمعدل/الاستخدام)، وأعد استجابة 429 الواردة من المنبع دون تغيير. تستمر الاستجابات 429 غير المصنّفة في التدوير. يكون معطّلًا افتراضيًا: تُقيّد الفئة المجانية لكل عنوان IP للخروج (#9611)، لذا تؤدي كل استجابة 429 إلى التدوير، وتعيد الموجة المستنفدة آخر استجابة 429 من المنبع. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | تعطيل التحقق من شهادة TLS لوكيل MITM. **خطر.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | السماح بعناوين URL للموفّرين التي تشير إلى شبكات خاصة/داخلية. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | السماح بإضافة الموفّرين أو التحقق منهم على العناوين المحلية/الخاصة (127.0.0.1، localhost، LAN). يكون مفعّلًا افتراضيًا (المحلي أولًا)؛ عطّله لفرض الحظر الصارم الذي يسمح بالعناوين العامة فقط. تظل بيانات تعريف السحابة محظورة. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | تمكين وضع الموفّر المتوافق مع Claude Code. | +| المفتاح | النوع | الافتراضي | الوصف | +| --------------------------------------- | ----- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUIRE_API_KEY` | منطقي | `false` | اشتراط مفتاح API لجميع الطلبات الواردة. | +| `INPUT_SANITIZER_ENABLED` | منطقي | `true` | تمكين تنقية المدخلات لجميع الطلبات. | +| `INJECTION_GUARD_MODE` | تعداد | `off` | وضع الحماية من حقن المطالبات. القيم: `off`، و`warn`، و`block`، و`redact`. | +| `PII_REDACTION_ENABLED` | منطقي | `false` | حجب معلومات التعريف الشخصية من الطلبات (بشكل مستقل عن `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | منطقي | `false` | تنقية معلومات التعريف الشخصية من استجابات المزوّد. | +| `PII_RESPONSE_SANITIZATION_MODE` | تعداد | `redact` | وضع تنقية معلومات التعريف الشخصية من الاستجابات. القيم: `redact`، و`warn`، و`block`، و`off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | منطقي | `true` | حظر الطلبات الصادرة إلى نطاقات عناوين IP الخاصة/الداخلية. | +| `ALLOW_API_KEY_REVEAL` | منطقي | `false` | السماح لمستخدمي لوحة المعلومات المصادَق عليهم بإظهار مفاتيح API المخزنة بدلاً من رؤية القيم المقنّعة فقط. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | منطقي | `false` | تضمين بادئة الحساب في أسطر سجل AUTH (مثلاً: "استخدام حساب : abc12345..."). يكون هذا معطلاً افتراضياً لحجب معرّفات الحسابات من سجلات العمليات المشتركة/متعددة المستأجرين. وهو مستقل عن وضع تصحيح الأخطاء؛ فتبديل وضع تصحيح الأخطاء لا يكشف هذه المعلومات. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | منطقي | `false` | عند تمكين OIDC، يتم تعطيل تسجيل الدخول بكلمة المرور بحيث لا يتمكن المستخدمون من المصادقة إلا عبر تسجيل الدخول الموحّد باستخدام OIDC. وعند تعطيله (وهو الوضع الافتراضي)، يتوفر كل من تسجيل الدخول بكلمة المرور وOIDC. | + +### الشبكة (16) + +| المفتاح | النوع | القيمة الافتراضية | إعادة التشغيل | الوصف | +| ----------------------------------------------- | ------- | ----------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | منطقي | `false` | ✓ | تفعيل وضع التخفي لبصمة TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | منطقي | `false` | | السماح لمسارات /v1/audio/* باستخدام عُقد موفّرين متوافقة مع OpenAI ومستضافة خارج localhost. يكون هذا معطّلًا افتراضيًا، إذ إن توجيه الصوت إلى مضيف بعيد يغيّر هوية الخروج، ويجب أن يكون قرارًا صريحًا من المشغّل. يُسمح دائمًا بعُقد الاسترجاع الحلقي ولا تتأثر بهذا الإعداد. | +| `RERANK_REMOTE_PROVIDER_NODES` | منطقي | `false` | | السماح لـ POST /v1/rerank (وكذلك خطوة إعادة الترتيب عبر الاسترجاع الحلقي في محرك الذاكرة) باستخدام عُقد موفّرين متوافقة مع OpenAI ومستضافة خارج localhost. يكون هذا معطّلًا افتراضيًا، إذ إن التوجيه إلى مضيف بعيد يغيّر هوية الخروج، ويجب أن يكون قرارًا صريحًا من المشغّل. يُسمح دائمًا بعُقد الاسترجاع الحلقي؛ ويجب أيضًا أن تجتاز العُقد البعيدة سياسة عناوين URL الصادرة الخاصة بالموفّر. | +| `PROXY_AUTO_SELECT_ENABLED` | منطقي | `false` | | عند عدم تعيين وكيل لاتصال، يُحدَّد تلقائيًا أول وكيل عامل من السجل. يكون هذا معطّلًا افتراضيًا (وإلا فسيصبح أي وكيل في السجل خيارًا احتياطيًا عامًا — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | منطقي | `false` | | السماح لتدفقات OAuth والتحقق من الموفّر بتجاوز وكيل مثبّت والاتصال مباشرةً عند فشل اختبارات التحقق المسبق من إمكانية الوصول إلى الوكيل. يكون هذا معطّلًا افتراضيًا لأنه قد يغيّر عنوان IP للخروج. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | منطقي | `true` | | عند حدوث استثناء في الشبكة (انتهاء المهلة، أو رفض الاتصال/إعادة تعيينه) لمنفّذ تناوب متعدد الحسابات، وإذا لم يكن للحساب الذي فشل وكيل مخصّص، تُطبَّق فترة تهدئة قصيرة ويُتخطّى سائر الحسابات التي لا تستخدم وكلاء خلال بقية الطلب بدلًا من إعادة محاولة كل حساب منها. يكون هذا مفعّلًا افتراضيًا (آمن: لا يغيّر عنوان IP للخروج، بل يقلّل فقط مخاطر زمن الاستجابة/فترة التهدئة للحسابات ذات الخروج المشترك). عطّله لاستعادة الانتشار الفوري عند أول استثناء من حساب بلا وكيل. | +| `PROXY_SKIP_RECENTLY_FAILED` | منطقي | `false` | | تتوقف مجموعات الوكلاء وتناوب opencode لكل حساب عن إعادة تقديم وكيل فشل للتو (فشل اختبار TCP بسبب الرفض، أو تلقّي استجابة 429 عبره) لمدة خاصة بكل عملية تتضاعف مع كل تكرار، حتى حد أقصى. لا تُسجَّل أي حالة للوكيل؛ وعند تنحية كل مرشح يظل الاختيار دون تغيير. يكون هذا معطّلًا افتراضيًا. | +| `PROXY_POOL_EGRESS_OBSERVATION` | منطقي | `false` | | إظهار عدد عناوين IP المرصودة للخروج التي خدمت أعضاء مجموعة وكلاء خلال آخر 24 ساعة، وعدد الاتصالات التي استخدمتها، أسفل مجموعة الوكلاء في لوحة المعلومات. هذه معلومات للقراءة فقط، وتُحتسب من سجل الوكيل، ولا تُستخدم مطلقًا للتوجيه. يكون هذا معطّلًا افتراضيًا. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | منطقي | `false` | | بالنسبة إلى منفّذ OpenCode، راقب أول بايت من محتوى رد Responses متدفق (النافذة: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`، والقيمة الافتراضية `15000`). يُعامل تدفق Responses بحالة 2xx يظل صامتًا بعد انتهاء النافذة على أنه متوقف: يُوضع الحساب في فترة تهدئة ويُحوَّل الطلب إلى الحساب التالي مرة واحدة؛ ويؤدي التوقف الثاني إلى فشل سريع. يكون هذا معطّلًا افتراضيًا: تواصل التدفقات المتوقفة الانتظار وفق السلوك الحالي حتى انتهاء مهلة جاهزية التدفق. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | منفّذ OpenCode: عند ورود رفض 403/451 يحمل `user_blocked` (وليس حظرًا جغرافيًا أو رفضًا بسبب بصمة Cloudflare)، ضع الحساب المرفوض في فترة تهدئة وانتقل إلى الحساب التالي مرة واحدة كحد أقصى لكل طلب؛ ويُعاد الرفض الثاني كما هو، دون تسجيل علامة نجاح. معطّل افتراضيًا: قد يبدو الالتفاف على حظر مستخدم من الجهة المنبع كنوع من التحايل، وقد يؤدي إلى انتشار العلامة عبر مجموعة الحسابات. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | تدوير OpenCode: بعد فشلين مؤقتين متتاليين من الجهة المنبع (5xx أو استجابة 400 فارغة)، انتظر قبل الانتقال إلى الحساب التالي — تبدأ المهلة من 1.5 ثانية وتتضاعف مع كل فشل إضافي، بحد أقصى 6 ثوانٍ لكل مهلة و10 ثوانٍ لكل طلب، ويُتجاوز الانتظار عند قطع اتصال العميل؛ ويُحرَّر نص الاستجابة الفاشلة قبل الانتظار. معطّل افتراضيًا: يظل تجاوز الفشل فوريًا. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | تدوير OpenCode: أوقف دورة الحسابات عند أول استجابة 429 تُصنَّف على أنها حد حقيقي لمعدل الطلبات (`Retry-After` قابل للتحليل، أو نص استجابة يذكر حدًا للمعدل/الاستخدام)، وأعد استجابة 429 الواردة من الجهة المنبع دون تغيير. تستمر الاستجابات 429 غير المصنفة في التدوير. معطّل افتراضيًا: تقتصر الفئة المجانية بحسب عنوان IP للخروج (#9611)، لذلك تؤدي كل استجابة 429 إلى التدوير، وعند استنفاد دورة الحسابات تُعاد آخر استجابة 429 من الجهة المنبع. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | عطّل التحقق من شهادة TLS لوكيل MITM. **خطر.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | اسمح بعناوين URL لموفري الخدمة تشير إلى شبكات خاصة/داخلية. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | اسمح بإضافة موفري الخدمة والتحقق منهم على عناوين محلية/خاصة (127.0.0.1، localhost، LAN). مفعّل افتراضيًا (الأولوية للمحلي)؛ عطّله لفرض حظر صارم يقتصر على العناوين العامة. تظل بيانات تعريف السحابة محظورة. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | فعّل وضع موفر الخدمة المتوافق مع Claude Code. | ### السياسات (5) -| المفتاح | النوع | القيمة الافتراضية | الوصف | -| ------------------------------- | ----- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | تعداد | `disabled` | وضع فرض سياسة استخدام الأدوات. القيم: `disabled`، `warn`، `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | منطقي | `false` | تمكين تحديد معدل الطلبات تلقائيًا استنادًا إلى أنماط الاستخدام. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | منطقي | `false` | تخطي فحص OmniRoute المحلي لنافذة السياق / الحد الأقصى لرموز الإدخال للطلبات المباشرة ذات النموذج الواحد. تظل حدود الخدمات المزوّدة سارية. | -| `CAPABILITY_FILTER_ENABLED` | منطقي | `false` | رفض الطلبات قبل إرسالها عندما يفتقر النموذج المستهدف إلى القدرات المطلوبة (الرؤية، الأدوات، المخرجات المنظَّمة، نافذة السياق). يحمي طلبات المزوّد الواحد المباشرة التي تتجاوز عامل تصفية التوافق في طبقة التجميع. | -| `RADAR_ENABLED` | منطقي | `false` | تمكين وحدة OmniRoute Radar (شاشات موجز الكتالوج والمزامنة). تكون معطّلة افتراضيًا؛ ولا يؤدي تمكينها إلا إلى إتاحة واجهة المستخدم — إذ تظل مزامنة البيانات خيارًا منفصلًا يتطلب الاشتراك. | - -### وقت التشغيل (32) - -| المفتاح | النوع | الافتراضي | إعادة التشغيل | الوصف | -| ------------------------------------------- | ----- | --------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | منطقي | `true` | | إنشاء ملخصات للمحادثة وإدراجها عندما يؤدي التوجيه المركّب إلى تبديل النماذج. عطّله للتعامل مع عمليات تبديل النماذج بصورة مستقلة ومنع طلبات التسليم في الخلفية لجميع التركيبات الحالية والمستقبلية. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | منطقي | `true` | | إسقاط عناصر المخرجات الداخلية الخاصة بمرحلة التعليق من تدفقات العبور الخاصة بـ Responses API قبل تمريرها إلى العملاء. عطّله لتلقي التعليقات الأولية من المصدر. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | منطقي | `true` | | فرض قيود النطاق على الوصول إلى أدوات MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | منطقي | `false` | | ضغط أوصاف أدوات MCP لتقليل استخدام الرموز. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | منطقي | `false` | | تمكين معالجة مهام الخلفية في وقت التشغيل. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | منطقي | `false` | ✓ | تعطيل جميع خدمات الخلفية (تحديث الحصة والمزامنة وما إلى ذلك). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | منطقي | `false` | | الوثوق بمرشحات RTK على مستوى المشروع دون تحقق. | -| `OMNIROUTE_ENABLE_LIVE_WS` | منطقي | `true` | ✓ | تشغيل خادم WebSocket للوحة المعلومات في الوقت الفعلي عند الاستيراد (المنفذ 20132 افتراضيًا). | -| `OMNIROUTE_CODEX_WS_ENABLED` | منطقي | `true` | | السماح لـ Codex باستخدام نقل Responses عبر WebSocket. عند إيقافه، يعود Codex إلى HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | منطقي | `true` | | السماح لـ Codex باستخدام نقل WebSocket JSON-RPC لخادم التطبيقات المحلي (codexTransport=app-server). عند إيقافه، تعود الاتصالات التي اختارت app-server إلى وسائل النقل الأخرى الخاصة بـ Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | منطقي | `true` | | توجيه الطلبات التي استنفدت الميزانية إلى موفر/نموذج الرجوع الاحتياطي المجاني للطوارئ. (راجع [الرجوع الاحتياطي لميزانية الطوارئ](#emergency-budget-fallback) أدناه.) | -| `STREAM_RECOVERY_ENABLED` | منطقي | `false` | | تمكين إعادة المحاولة المبكرة والشفافة لتدفقات SSE المصدرية المبتورة قبل وصول أي بايتات استجابة إلى العميل. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | منطقي | `false` | | السماح باسترداد التدفق عبر إعادة الطلب ودمج الاستجابة بعد وصول البايتات بالفعل إلى العميل. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | منطقي | `false` | | جعل متابعة منتصف التدفق آمنة لاستدعاءات الأدوات: عدم استئناف تدفق مقطوع مطلقًا بعد إصدار استدعاء أداة (قيد التنفيذ أو منتهي بالفعل مع finish_reason tool_calls)، والإغلاق بعد متابعة فارغة واحدة بدلًا من استهلاك الميزانية كاملة. عند الإيقاف: سلوك الإصدار القياسي. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | منطقي | `false` | | التحويل مرة واحدة إلى اتصال نظير عندما يُغلق تدفق SSE قبل إصدار أي إطار مفيد وبعد استنفاد إعادة المحاولة المحدودة على الاتصال نفسه؛ وفي حال عدم توفر نظير صالح للاستخدام، تُعاد استجابة `STREAM_EARLY_EOF` 502 الأصلية. متوقف افتراضيًا: يظل انتهاء الملف المبكر نهائيًا بعد إعادة المحاولة على الاتصال نفسه. | -| `MODEL_CATALOG_INCLUDE_NAMES` | منطقي | `true` | | تضمين حقول أسماء ملائمة للعرض في استجابات `/v1/models`. عطّله للعملاء الذين يتوقعون معرّفات النماذج فقط. | -| `MODELS_CATALOG_PREFIX_MODE` | تعداد | `dual` | | يتحكم في كيفية إضافة البادئات إلى معرّفات النماذج في /v1/models. يصدر 'dual' (الافتراضي) بادئتي الاسم المستعار ومعرّف الموفر الأساسي معًا للتوافق مع الإصدارات السابقة. يصدر 'alias' بادئة الاسم المستعار القصيرة فقط (مثل ds-web/model، وليس deepseek-web/model). يصدر 'canonical' بادئة معرّف الموفر الكاملة فقط. القيم: `dual`، `alias`، `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | منطقي | `true` | | تمكين المزامنة الدورية لتصنيفات ELO في لوحة صدارة Arena AI من أجل تصنيفات ذكاء النماذج. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | منطقي | `false` | | الإعلان عن معرّفات النسخ المتطابقة `claude//` في `/v1/models` لكي يعرض اكتشاف نماذج بوابة Claude Code النماذج غير التابعة لـ Claude. المستوى العام للبوابة ثلاثية المستويات (متغير البيئة له الأولوية على تجاوز لوحة المعلومات). راجع [تهيئة Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | منطقي | `true` | | المفتاح الرئيسي للأسماء المستعارة للبوابة no-think//. عند التشغيل (الافتراضي): يعلن /v1/models عن متغير بلا تفكير لكل نموذج Claude مؤهل وقادر على التفكير، ويُعاد تحليل معرّف no-think/ المُرسل في الطلب إلى النموذج الحقيقي مع كبح الاستدلال. عند الإيقاف: لا يتم الإعلان عن أي متغيرات ويُعامل معرّف no-think/ مثل أي معرّف نموذج آخر غير معروف. يظل الاشتراك/إلغاء الاشتراك لكل نموذج عبر ModelSpec.noThinkingAlias مطبقًا أثناء تشغيل هذا الخيار. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | منطقي | `false` | | تعطيل إنشاء متغيرات مستوى التفكير (مثل -low و-medium- و-high-) في دليل /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | منطقي | `false` | ✓ | تمكين مسارات قبول افتراضية تكيفية لكل مستأجر لإرسال الطلبات إلى الموفر (#9654): لن تؤدي طفرة طلبات أحد المستأجرين بعد الآن إلى أخطاء 503 لمستأجر آخر. تكون الأولوية لمتغير البيئة OMNIROUTE_CHAT_VIRTUAL_LANES على تجاوز لوحة المعلومات هذا؛ وتسري التغييرات عند إعادة تشغيل الخادم. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | منطقي | `false` | | الإعلان عن معرّفات النسخ المتطابقة / في /v1/models للنماذج التي لا يملك مالكها الأساسي بيانات اعتماد نشطة، لكن توجد بوابة عبور ذات بيانات اعتماد نشطة تتولى توجيهها. تحذير: يؤدي تمكينه عالميًا إلى إضافة إدخالات في الدليل لجميع العملاء. | -| `NEWAPI_AGGREGATOR_BALANCE` | منطقي | `false` | | تمكين اكتشاف الرصيد للعُقد المتوافقة مع مجمّعات New-API / One-API / Sub2API. عند التمكين، ستعرض العُقد المتوافقة التي ضُبطت عليها علامة المجمّع رصيدها في لوحة المعلومات وفي توجيه الفحص المسبق للحصة. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | منطقي | `false` | | متابعة استدعاءات الأدوات غير المتدفقة التي يملكها الخادم حتى يعيد النموذج استجابة صالحة للاستخدام من قِبل العميل. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | منطقي | `false` | | لا تحتسب إحصاءات البحث وعمليات البحث الأخيرة إلا الموفرين الذين لا يزال لديهم اتصال نشط (يُحتسب دائمًا الموفرون الذين لا يتطلبون مفتاحًا مثل duckduckgo-free). عند إيقافه، يُحتفظ بكل صف بحث محفوظ يتضمن معرّف موفر. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | منطقي | `false` | | صفحات الموفرين في لوحة المعلومات: إظهار شارة «مجاني» فقط عند وجود إشارات يحترمها الموفر — مع تجاهل الاستدلال من اسم العرض وحقول المجانية غير المنطقية واللواحق :free لدى الموفرين المسجلين الذين لا يملكون فئة مجانية موثقة. عند إيقافه، يُحتفظ بقاعدة الشارة السابقة. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | منطقي | `false` | | في استجابات عدم التوفر المجمعة 429/503، إغفال `Retry-After` عندما لا يكون وقت إعادة المحاولة المستقبلي الفعلي معروفًا (بدلًا من قيمة اصطناعية قدرها 1s)، وإضافة `error.retry_after_provenance` (`signal` \| `none`)، والسماح لمسارات استنفاد التركيبة بقراءة تلميحات إعادة المحاولة النصية من أجسام JSON والنص العادي الواردة من المصدر. لا يظهر الحقل إلا في الاستجابات التي تنشئها `unavailableResponse()`؛ وتظل أجسام 429/503 الأخرى دون تغيير. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | منطقي | `false` | | عندما يؤدي هدف تركيبة من نوع `priority` وموسوم بأنه احتياطي عند استنفاد الحصة فقط إلى إيقاف التركيبة لسبب يمكن إثبات أنه لا يتعلق بالحصة (قاطع دائرة الموفر مفتوح، أو تخطٍ تنبؤي بسبب زمن الاستجابة)، تكون الاستجابة 502 بدلًا من 503 التي تبدو مرتبطة بالحصة. تظل حالات الحظر وفترة التهدئة وعدم التوفر والاستنفاد والتوقف بسبب حد التزامن على 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | منطقي | `false` | | تكون استجابة Mistral 401 المجردة (`{"detail":"Unauthorized"}`، من دون إشارة مصادقة صريحة) متطابقة عند إلغاء المفتاح وعند استنفاد الحصة. عند التشغيل، تضع الاتصال في فترة تهدئة بدلًا من إيقافه بوصفه `expired`، بحد أقصى 3 مرات في الساعة لكل اتصال؛ أما المرة التالية فتوقفه، بحيث يستقر المفتاح الملغى في النهاية. متوقف افتراضيًا: تؤدي كل استجابة Mistral 401 مجردة إلى إيقاف الاتصال كما في السابق. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | منطقي | `false` | | جلب دليل نماذج xAI المباشر لاتصالات `xai-oauth` من `https://api.x.ai/v1/models` باستخدام رمز OAuth للحامل، بدلًا من البذرة الثابتة المجمّدة. متوقف افتراضيًا: يواصل `xai-oauth` تقديم البذرة الثابتة دون تغيير. عند حدوث أي خطأ في التحليل، يعود الاكتشاف إلى البذرة (لم يتم التحقق مما إذا كان x.ai يقبل رمز OAuth للحامل عند نقطة النهاية هذه). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | منطقي | `false` | | السماح لعملية التنظيف التلقائي بحذف مهام Batch API النهائية (المكتملة/الفاشلة/الملغاة/منتهية الصلاحية) الأقدم من `OMNIROUTE_BATCH_RETENTION_DAYS`، إلى جانب نقاط التحقق لكل سطر، ومسح محتوى BLOB للملفات المرفوعة التي تجاوزت قيمة `expires_at` الخاصة بها. متوقف افتراضيًا: يحتفظ كل تثبيت حالي بهذه البيانات كما كان من قبل إلى أن يختار المشغّل الاشتراك. لا يتأثر مسار `DELETE /api/v1/batches/delete-completed` الذي يشغّله المشغّل في الحالتين — فهو عقد API عام منفصل وغير مشروط. | +| المفتاح | النوع | الافتراضي | الوصف | +| ------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | وضع إنفاذ سياسة استخدام الأدوات. القيم: `disabled`، `warn`، `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | فعّل تحديد معدل الطلبات تلقائيًا استنادًا إلى أنماط الاستخدام. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | تخطَّ فحص OmniRoute المحلي لنافذة السياق/الحد الأقصى لرموز الإدخال للطلبات المباشرة أحادية النموذج. تظل حدود الجهة المنبع سارية. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | ارفض الطلبات قبل إرسالها عندما يفتقر النموذج المستهدف إلى الإمكانات المطلوبة (الرؤية، الأدوات، المخرجات المنظَّمة، نافذة السياق). يحمي الطلبات المباشرة أحادية الموفّر التي تتجاوز عامل تصفية التوافق في طبقة التجميع. | +| `RADAR_ENABLED` | boolean | `false` | فعّل وحدة OmniRoute Radar (شاشات موجز الكتالوج والمزامنة). معطّلة افتراضيًا؛ لا يؤدي تمكينها إلا إلى إتاحة واجهة المستخدم — وتظل مزامنة البيانات خيارًا منفصلًا يتطلب الاشتراك. | + +### وقت التشغيل (33) + +| المفتاح | النوع | الافتراضي | إعادة التشغيل | الوصف | +| ------------------------------------------- | ------- | --------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | منطقي | `true` | | إنشاء ملخصات للمحادثات وحقنها عند تبديل نماذج التوجيه المركّب. عطّل هذا الخيار للتعامل مع تبديلات النماذج بصورة مستقلة ومنع طلبات التسليم في الخلفية لجميع التركيبات الحالية والمستقبلية. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | منطقي | `true` | | إسقاط عناصر المخرجات الداخلية لمرحلة التعليقات من تدفقات التمرير المباشر لواجهة Responses API قبل إعادة توجيهها إلى العملاء. عطّل هذا الخيار لتلقي التعليقات الأولية من المصدر الرئيسي. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | منطقي | `true` | | فرض قيود النطاق على الوصول إلى أدوات MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | منطقي | `false` | | ضغط أوصاف أدوات MCP لتقليل استخدام الرموز. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | منطقي | `false` | | تمكين معالجة المهام في الخلفية أثناء وقت التشغيل. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | منطقي | `false` | ✓ | تعطيل جميع خدمات الخلفية (تحديث الحصة، والمزامنة، وما إلى ذلك). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | الوثوق بمرشحات RTK على مستوى المشروع من دون التحقق منها. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | تشغيل خادم WebSocket للوحة المعلومات في الوقت الفعلي عند الاستيراد (المنفذ 20132 افتراضيًا). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | السماح لـ Codex باستخدام نقل Responses-over-WebSocket. عند تعطيله، يعود Codex إلى HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | السماح لـ Codex باستخدام نقل WebSocket JSON-RPC لخادم التطبيقات المحلي (codexTransport=app-server). عند تعطيله، تعود الاتصالات التي اختارت app-server إلى وسائل النقل الأخرى في Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | توجيه الطلبات التي استنفدت الميزانية إلى المزوّد/النموذج الاحتياطي المجاني للطوارئ. (راجع [الرجوع الاحتياطي للميزانية في حالات الطوارئ](#emergency-budget-fallback) أدناه.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | تمكين إعادة المحاولة المبكرة والشفافة لتدفقات SSE الصادرة المبتورة، قبل وصول أي بايتات من الاستجابة إلى العميل. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | السماح لاسترداد التدفق بإعادة الطلب ودمج الاستجابة بعد وصول البايتات بالفعل إلى العميل. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | جعل استئناف منتصف التدفق آمنًا لاستدعاءات الأدوات: عدم استئناف أي تدفق منقطع مطلقًا بمجرد إصدار استدعاء أداة (سواء كان قيد التنفيذ أو انتهى بالفعل مع finish_reason بقيمة tool_calls)، والإغلاق بعد استئناف فارغ واحد بدلًا من استنفاد الميزانية بالكامل. عند التعطيل: سلوك الإصدار. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | انتقل احتياطيًا مرة واحدة إلى اتصال شقيق عندما يُغلق تدفق SSE قبل إصدار أي إطار مفيد وبعد استنفاد إعادة المحاولة المحدودة على الاتصال نفسه؛ وإذا لم يتوفر اتصال شقيق قابل للاستخدام، يُعاد خطأ 502 الأصلي `STREAM_EARLY_EOF`. يكون معطّلًا افتراضيًا: يظل الإغلاق المبكر EOF نهائيًا بعد إعادة المحاولة على الاتصال نفسه. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | تضمين حقول الأسماء الملائمة للعرض في استجابات `/v1/models`. عطّل هذا الخيار للعملاء الذين يتوقعون معرّفات النماذج فقط. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | يتحكم في كيفية إضافة البادئات إلى معرّفات النماذج في /v1/models. يُصدر 'dual' (الافتراضي) بادئات الاسم البديل ومعرّف المزوّد الأساسي معًا لضمان التوافق مع الإصدارات السابقة. يُصدر 'alias' بادئة الاسم البديل القصيرة فقط (مثل ds-web/model، وليس deepseek-web/model). يُصدر 'canonical' بادئة معرّف المزوّد الكاملة فقط. القيم: `dual`، `alias`، `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | تمكين المزامنة الدورية لتصنيف ELO في لوحة صدارة Arena AI من أجل تصنيفات ذكاء النماذج. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | الإعلان عن معرّفات النسخ المطابقة `claude//` على `/v1/models` بحيث تعرض ميزة اكتشاف النماذج في بوابة Claude Code النماذج غير التابعة لـ Claude. هذا هو المستوى العام لآلية التحكم ثلاثية المستويات (متغير البيئة له الأولوية على تجاوز لوحة المعلومات). راجع [إعداد Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | المفتاح الرئيسي للأسماء البديلة no-think// في البوابة. عند التفعيل (الافتراضي): يعلن /v1/models عن متغير بلا تفكير لكل نموذج Claude مؤهل وقادر على التفكير، ويُحل معرّف no-think/ المُرسل في الطلب إلى النموذج الحقيقي مع تعطيل الاستدلال. عند التعطيل: لا يُعلن عن أي متغيرات، ويُعامل معرّف no-think/ مثل أي معرّف نموذج آخر غير معروف. يظل الاشتراك أو إلغاء الاشتراك لكل نموذج عبر ModelSpec.noThinkingAlias ساريًا أثناء تفعيل هذا الخيار. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | تعطيل إنشاء متغيرات مستويات التفكير (مثل -low و-medium و-high) في كتالوج /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | تمكين مسارات قبول افتراضية تكيفية لكل مستأجر من أجل الإرسال إلى المزوّد (#9654): لن يؤدي الارتفاع المفاجئ في طلبات أحد المستأجرين بعد الآن إلى حصول مستأجر آخر على خطأ 503. تكون لمتغير البيئة OMNIROUTE_CHAT_VIRTUAL_LANES الأولوية على هذا التجاوز في لوحة المعلومات؛ وتصبح التغييرات نافذة عند إعادة تشغيل الخادم. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | منطقي | `false` | | الإعلان عن معرّفات النسخ المطابقة / على /v1/models للنماذج التي لا يملك مالكها الأساسي بيانات اعتماد نشطة، ولكن تقوم بوابة تمرير لديها بيانات اعتماد نشطة بتوجيهها. تحذير: يضيف إدخالات إلى الكتالوج لجميع العملاء عند تمكينه عموميًا. | +| `NEWAPI_AGGREGATOR_BALANCE` | منطقي | `false` | | تمكين اكتشاف الرصيد للعُقد المتوافقة مع مجمّعات New-API / One-API / Sub2API. عند تمكينه، ستعرض العُقد المتوافقة التي تم تعيين علامة المجمّع لها رصيدها في لوحة المعلومات وفي توجيه الفحص المسبق للحصة. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | منطقي | `false` | | متابعة استدعاءات الأدوات غير المتدفقة والمملوكة للخادم حتى يعيد النموذج استجابة قابلة للاستخدام من جانب العميل. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | منطقي | `false` | | لا تحتسب إحصاءات البحث وعمليات البحث الأخيرة إلا المزوّدين الذين لا يزال لديهم اتصال نشط (تُحتسب دائمًا المزوّدات التي لا تتطلب مفتاحًا، مثل duckduckgo-free). عند الإيقاف، يُحتفظ بكل صف بحث محفوظ يحتوي على معرّف مزوّد. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | منطقي | `false` | | صفحات المزوّدين في لوحة المعلومات: إظهار شارة «مجاني» فقط بناءً على الإشارات التي يعتمدها المزوّد — مع تجاهل الاستدلال من اسم العرض، والحقول المجانية غير المنطقية، واللواحق :free لدى المزوّدين المسجلين الذين لا يملكون فئة مجانية موثقة. عند الإيقاف، تُستخدم قاعدة الشارة السابقة. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | منطقي | `false` | | في استجابات عدم التوفر المجمّعة 429/503، حذف `Retry-After` عندما لا يكون هناك وقت مستقبلي محدد معروف لإعادة المحاولة (بدلًا من قيمة مصطنعة قدرها ثانية واحدة)، وإضافة `error.retry_after_provenance` (`signal` \| `none`)، والسماح لمسارات استنفاد التركيبات بقراءة تلميحات إعادة المحاولة النصية من أجسام المصدر الصاعد بتنسيق JSON والنص العادي. لا يظهر الحقل إلا في الاستجابات التي تُنشئها `unavailableResponse()`؛ وتظل أجسام استجابات 429/503 الأخرى دون تغيير. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | منطقي | `false` | | عندما يتسبب هدف تركيبة من نوع `priority` وموسوم بأنه احتياطي فقط عند استنفاد الحصة في إيقاف التركيبة لسبب ثبت أنه لا يتعلق بالحصة (قاطع دائرة المزوّد مفتوح، أو التخطي التنبؤي بسبب زمن الاستجابة)، تكون الاستجابة 502 بدلًا من 503 التي توحي بوجود مشكلة في الحصة. تظل حالات الحظر المؤقت، وفترة التهدئة، وعدم التوفر، والاستنفاد، والتوقف بسبب حد التزامن تستجيب بالرمز 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | منطقي | `false` | | تكون استجابة Mistral 401 المجرّدة (`{"detail":"Unauthorized"}`، دون إشارة مصادقة صريحة) متطابقة في حالتي المفتاح الملغى والحصة المستنفدة. عند التفعيل، تُدخل الاتصال في فترة تهدئة بدلًا من إيقافه باعتباره `expired`، وبحد أقصى 3 مرات في الساعة لكل اتصال؛ أما المرة التالية فتؤدي إلى إيقافه، بحيث يستقر المفتاح الملغى في النهاية على الحالة الصحيحة. يكون هذا الخيار متوقفًا افتراضيًا: كل استجابة Mistral 401 مجرّدة توقف الاتصال كما كان سابقًا. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | منطقي | `false` | | جلب كتالوج نماذج xAI المباشر لاتصالات `xai-oauth` من `https://api.x.ai/v1/models` باستخدام رمز OAuth من نوع bearer، بدلًا من البذرة الثابتة المجمّدة. معطّل افتراضيًا: يواصل `xai-oauth` تقديم البذرة الثابتة دون تغيير. عند حدوث أي خطأ في الاستبانة، يعود الاكتشاف إلى البذرة (لم يتم التحقق مما إذا كان x.ai يقبل رمز OAuth من نوع bearer عند نقطة النهاية هذه). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | منطقي | `false` | | السماح لعملية التنظيف التلقائية بحذف مهام Batch API النهائية (المكتملة/الفاشلة/الملغاة/منتهية الصلاحية) الأقدم من `OMNIROUTE_BATCH_RETENTION_DAYS`، إلى جانب نقاط التحقق الخاصة بكل سطر، ومسح محتوى BLOB للملفات المرفوعة التي تجاوزت قيمة `expires_at` الخاصة بها. معطّل افتراضيًا: يحتفظ كل تثبيت حالي بهذه البيانات كما كانت تمامًا إلى أن يفعّل أحد المشغّلين هذا الخيار. لا يتأثر مسار `DELETE /api/v1/batches/delete-completed` الذي يشغّله المشغّل في كلتا الحالتين — فهو عقد API عام منفصل وغير مشروط. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | منطقي | `false` | | حجز حساب Antigravity المحدد طوال دورة حياة البث للطلب الذي اختاره، بحيث لا تتمكن إعادة محاولة متزامنة أو عملية تسليم بيانات الاعتماد من إعادة اختيار حساب ملتزم بالفعل ببث قيد التنفيذ. يقتصر نطاق الحجز على (الاتصال، نموذج المزوّد القابل للاستدعاء)، ولذلك يظل بإمكان حساب واحد خدمة نموذجين مختلفين في الوقت نفسه. عندما تكون جميع الحسابات المؤهلة محجوزة بالفعل لذلك النموذج، يعيد الطلب استجابة 503 منظّمة تتضمن `antigravity_pool_busy` وقيمة `Retry-After` محدودة، بدلًا من تكديس الطلبات على حساب مشغول. معطّل افتراضيًا: يظل اختيار الحساب كما كان تمامًا، ولا يُجرى أي حجز. | ### واجهة سطر الأوامر (5) | المفتاح | النوع | الافتراضي | إعادة التشغيل | الوصف | | ------------------------------------- | ----- | --------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CLI_COMPAT_ALL` | منطقي | `false` | ✓ | تمكين وضع التوافق لجميع عملاء واجهة سطر الأوامر. | -| `MODEL_ALIAS_COMPAT_ENABLED` | منطقي | `false` | | تمكين طبقة توافق الأسماء المستعارة للنماذج. | +| `MODEL_ALIAS_COMPAT_ENABLED` | منطقي | `false` | | تمكين طبقة توافق الأسماء البديلة للنماذج. | | `PRICING_SYNC_ENABLED` | منطقي | `false` | | تمكين المزامنة التلقائية لبيانات التسعير (يتطلب أيضًا متغير البيئة `PRICING_SYNC_ENABLED`). | | `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | منطقي | `false` | | بعد مزامنة نماذج المزوّد، إعادة كتابة ملفات ملفات التعريف ~/.codex/*.config.toml تلقائيًا من الكتالوج المباشر. لا يغيّر أبدًا إعداد Codex النشط/الافتراضي. معطّل افتراضيًا. | | `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | منطقي | `false` | | بعد مزامنة نماذج المزوّد، إعادة كتابة ملفات تعريف Claude Code في ~/.claude/profiles//settings.json تلقائيًا من الكتالوج المباشر. لا يغيّر أبدًا إعداد Claude النشط/الافتراضي. معطّل افتراضيًا. | -### السلامة (5) +### الصحة (5) -| المفتاح | النوع | الافتراضي | الوصف | -| ----------------------------------------- | ----- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | منطقي | `false` | تعطيل نقطة نهاية فحص سلامة المثيل المحلي. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | منطقي | `false` | تعطيل فحص سلامة التحقق من الرمز المميز. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | منطقي | `false` | تمكين الوصول إلى الشبكة في بيئة الحماية المعزولة للمهارات. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | منطقي | `false` | في عملية مسح سلامة الوكيل، يعيد الفحص الذي رفضه الهدف (401/403/429) ضبط سلسلة الإخفاقات المتتالية للوكيل. معطّل افتراضيًا: يظل الرفض محايدًا (#10654). تظل استجابة 5xx غير حاسمة في كلتا الحالتين؛ ولا يؤدي الرفض أبدًا إلى إزالة وكيل أو تعطيله أو إعادة تنشيطه. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | منطقي | `false` | تشغيل فحص تكامل/سلامة قاعدة البيانات عند بدء التشغيل بعد أن يبدأ الخادم في قبول الطلبات (عبر `setImmediate`) بدلًا من حظر بدء التشغيل حتى اكتماله (#13717). معطّل افتراضيًا: يُحظر بدء التشغيل تمامًا كما كان قبل طلب السحب هذا. | +| المفتاح | النوع | القيمة الافتراضية | الوصف | +| ----------------------------------------- | ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | منطقي | `false` | تعطيل نقطة نهاية فحص صحة النسخة المحلية. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | منطقي | `false` | تعطيل فحص صحة التحقق من الرمز المميز. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | منطقي | `false` | تمكين الوصول إلى الشبكة في بيئة الحماية المعزولة للمهارات. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | منطقي | `false` | أثناء عملية فحص صحة الوكيل، يؤدي الاستقصاء الذي رفضه الهدف (401/403/429) إلى تصفير سلسلة الإخفاقات المتتالية للوكيل. يكون معطّلًا افتراضيًا: يظل الرفض محايدًا (#10654). وتظل استجابة 5xx غير حاسمة في كلتا الحالتين؛ ولا يؤدي الرفض مطلقًا إلى إزالة وكيل أو تعطيله أو إعادة تنشيطه. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | منطقي | `false` | تشغيل فحص سلامة/صحة قاعدة البيانات عند بدء التشغيل بعد أن يبدأ الخادم في قبول الطلبات (عبر `setImmediate`)، بدلًا من حظر بدء التشغيل حتى اكتماله (#13717). يكون معطّلًا افتراضيًا: يُحظر بدء التشغيل تمامًا كما كان قبل طلب السحب هذا. | > [!NOTE] > يضبط `INPUT_SANITIZER_BLOCK_THRESHOLD` واسمه المستعار القديم > `INJECTION_GUARD_BLOCK_THRESHOLD` وضع `block` الخاص بـ -> `INJECTION_GUARD_MODE`، لكنهما متغيرا بيئة عاديان تقرؤهما +> `INJECTION_GUARD_MODE`، لكنهما متغيرا بيئة عاديان تتم قراءتهما بواسطة > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts)، -> وليسا علامتي ميزات: فلا يوجد لهما تجاوز في قاعدة البيانات ولا مفتاح تبديل في لوحة المعلومات. راجع +> وليسا علامتي ميزات: فلا توجد لهما قيمة متجاوزة في قاعدة البيانات ولا مفتاح تبديل في لوحة المعلومات. راجع > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> يشير عمود `إعادة التشغيل` إلى العلامات التي تحتوي على `requiresRestart: true` — تُحفَظ القيمة -> فورًا، لكنها لا تدخل حيز التنفيذ إلا بعد إعادة تحميل العملية. ترفض علامات -> التعداد أي قيمة خارج المجموعة المسموح بها (يُتحقق منها على جانب الخادم في كلٍ من +> يشير عمود `Restart` إلى العلامات التي تتضمن `requiresRestart: true` — تُحفَظ القيمة +> فورًا، لكنها لا تصبح سارية إلا بعد إعادة تحميل العملية. ترفض علامات التعداد +> أي قيمة خارج مجموعتها المسموح بها (يتم التحقق منها على جانب الخادم في كل من > `setFeatureFlagOverride()` ومعالج REST `PUT`). --- ## تبديل العلامات -### لوحة التحكم +### لوحة المعلومات -انتقل إلى **لوحة التحكم → الإعدادات → علامات الميزات** +انتقل إلى **لوحة المعلومات → الإعدادات → علامات الميزات** (`/dashboard/settings/feature-flags`). تدعم الشبكة (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) ما يلي: -- **البحث** حسب المفتاح أو الوصف، و**التصفية** حسب الفئة (بالإضافة إلى عرض اصطناعي - باسم **يتطلب إعادة التشغيل**). +- **البحث** حسب المفتاح أو الوصف، و**التصفية** حسب الفئة (بالإضافة إلى عرض اصطناعي باسم + **يتطلب إعادة التشغيل**). - **مفتاح تبديل** للعلامات المنطقية و**قائمة منسدلة** لعلامات التعداد (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - **شارة مصدر** لكل علامة — `DB` أو `ENV` أو `DEF` — توضّح مصدر القيمة الفعلية. -- زر **إعادة التعيين** (يظهر فقط للعلامات التي مصدرها `DB`) لإزالة التجاوز، +- زر **إعادة تعيين** (يظهر فقط للعلامات التي يكون مصدرها `DB`) لإزالة التجاوز، وزر **إعادة تعيين جميع التجاوزات** في الأسفل. -- لافتة **إعادة تشغيل الخادم** عند تغيير علامة ذات `requiresRestart`. +- لافتة **إعادة تشغيل الخادم** عند تغيير علامة `requiresRestart`. ### واجهة REST API تمر جميع العمليات عبر مسار واحد: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -تتطلب كل طريقة جلسة لوحة تحكم موثّقة (وإلا تُرجع `401`). +تتطلب كل طريقة جلسة لوحة معلومات موثّقة (وإلا فستُرجع `401`). #### `GET /api/settings/feature-flags` -تُرجع كل علامة مع قيمتها الفعلية ومصدرها وملخص. +يُرجع جميع العلامات مع قيمتها الفعلية ومصدرها وملخص. ```jsonc { @@ -210,7 +212,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... جميع العلامات الـ 72 + // ... جميع العلامات الـ 74 ], "summary": { "total": 56, @@ -224,11 +226,11 @@ #### `PUT /api/settings/feature-flags` -يضبط تجاوزًا واحدًا أو يزيله. المتن: `{ key: string; value?: string }`. +يضبط تجاوزًا واحدًا أو يزيله. نص الطلب: `{ key: string; value?: string }`. يؤدي حذف `value` إلى إزالة التجاوز (واستعادة قيمة متغير البيئة / القيمة الافتراضية). ```bash -# ضبط تجاوز في DB +# تعيين تجاوز في DB curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' @@ -239,18 +241,18 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -تُعيد الاستجابة قيمتي `effectiveValue`/`source` الجديدتين، وقيمتي `previousValue`/ -`previousSource`، و`requiresRestart`. تُرفض المفاتيح غير المعروفة وقيم التعداد -الخارجة عن النطاق بالرمز `400`. +تكرر الاستجابة القيمة الجديدة `effectiveValue`/`source` والقيمة السابقة `previousValue`/ +`previousSource`، بالإضافة إلى `requiresRestart`. تُرفض المفاتيح غير المعروفة وقيم التعداد +الواقعة خارج النطاق باستخدام `400`. #### `DELETE /api/settings/feature-flags` -يمسح **جميع** تجاوزات DB دفعة واحدة، ويعيد كل علامة إلى قيمة متغير البيئة / القيمة -الافتراضية الخاصة بها. يُرجع `{ cleared: , message: "..." }`. +يمسح **جميع** تجاوزات DB دفعة واحدة، ويعيد كل علامة إلى قيمة متغير البيئة / القيمة الافتراضية +الخاصة بها. يُرجع `{ cleared: , message: "..." }`. > [!NOTE] -> لا تصبح العلامات ذات `requiresRestart: true` سارية إلا بعد إعادة تحميل العملية. -> يستدعي مسار إعادة التشغيل في لوحة التحكم `POST /api/restart` ثم يستطلع +> لا تصبح العلامات التي تحتوي على `requiresRestart: true` سارية إلا بعد إعادة تحميل العملية. +> يستدعي مسار إعادة التشغيل في لوحة المعلومات `POST /api/restart` ثم يستطلع > `GET /api/health/ping` حتى يعود الخادم إلى العمل. --- diff --git a/docs/i18n/ar/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/ar/docs/reference/PROVIDER_REFERENCE.md index 009c99fb558c..8c538fd34349 100644 --- a/docs/i18n/ar/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/ar/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > **مُنشأ تلقائيًا** من `src/shared/constants/providers.ts` — لا تعدّله يدويًا. > أعِد إنشاءه باستخدام: `npm run gen:provider-reference` -> **تاريخ آخر إنشاء:** 2026-09-17 +> **تاريخ آخر إنشاء:** 2026-09-18 -إجمالي مزوّدي الخدمة: **359**. راجع التصنيف حسب الفئة أدناه. +إجمالي موفّري الخدمات: **359**. راجع التصنيف حسب الفئة أدناه. ## الفئات @@ -32,49 +32,49 @@ --- -## مزوّدو الخدمة دون مصادقة (لا يلزم مفتاح) (10) - -| المعرّف | الاسم المستعار | الاسم | الوسوم | الموقع الإلكتروني | ملاحظات | استدعاء الأدوات | -| ----------------------- | -------------- | ------------------------- | ----------------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | -| `aihorde` | `horde` | AI Horde | دون مصادقة | [رابط](https://aihorde.net) | لا يلزم مفتاح API — يستخدم مفتاح AI Horde المجهول الموثّق. إضافة مفتاح مجاني من aihorde.net اختيارية، ولا تمنح سوى أولوية أعلى في قائمة الانتظار (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | دون مصادقة | [رابط](https://augmentcode.com) | لا يخزّن OmniRoute أي مفتاح API. ثبّت Auggie CLI وشغّل `auggie login` على هذا الجهاز، ثم يشغّله OmniRoute محليًا لكل طلب. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | دون مصادقة | [رابط](https://playground.ai.cloudflare.com) | لا تلزم بيانات اعتماد — تُستخدم جلسات متصفح مجهولة عبر بروتوكول cf_agent WebSocket خضع للهندسة العكسية (وسيلة نقل Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | دون مصادقة | [رابط](https://developers.openai.com/codex/cli) | لا يخزّن OmniRoute أي رمز مميز. يدير app-server الخاص بـ Codex CLI عملية تسجيل الدخول إلى ChatGPT بنفسه (~/.codex/auth.json، مع تحديث تلقائي). استخدم “تسجيل الدخول باستخدام ChatGPT” إذا لم تتم مصادقة CLI بعد. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | دون مصادقة | [رابط](https://docs.devin.ai/work-with-devin/devin-cli) | تتولى أداة Devin CLI الرسمية المصادقة داخل وحدة تخزين الجسر المعزولة الخاصة بها. | مُحاكى | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | دون مصادقة | [رابط](https://duckduckgo.com/duckchat) | لا تلزم بيانات اعتماد — خدمة DuckDuckGo AI Chat مجهولة ومجانية. | مُحاكى | -| `opencode` | `oc` | OpenCode Free | دون مصادقة | [رابط](https://opencode.ai) | لا يلزم مفتاح API — تستخدم نقطة النهاية العامة المجانية لـ OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | دون مصادقة | [رابط](https://uncloseai.com) | لا تلزم المصادقة. تقبل API أي سلسلة غير فارغة كمفتاح للتعريف. إذا أعادت النماذج المضمّنة الأقدم الخطأ 404، فاستخدم النماذج المتاحة ← الاستيراد من /models أو المزامنة التلقائية؛ النموذج المباشر الذي تم التحقق منه: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | دون مصادقة، فيديو | [رابط](https://veoaifree.com) | لا تلزم المصادقة. الحد الأقصى للمعدل هو 6 طلبات/ساعة لكل عنوان IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | دون مصادقة | [رابط](https://zcode.z.ai) | لا يخزّن OmniRoute أي مفتاح API. يستخدم app-server المحلي الخاص بـ ZCode تسجيل الدخول الحالي إلى builtin:zai-coding-plan. | — | - -## موفّرو OAuth (24) - -| المعرّف | الاسم المستعار | الاسم | الوسوم | الموقع الإلكتروني | ملاحظات | -| --------------- | -------------- | ------------------------- | ------ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [رابط](https://antigravity.google) | استورد بيانات تسجيل دخول Antigravity CLI (`agy`) الخاصة بك (عبر لصق/رفع ملف الرمز المميز)، أو اكتشف تلقائيًا تسجيل دخول محليًا إلى CLI، أو سجّل الدخول باستخدام Google. يشارك الواجهة الخلفية لـ Antigravity (بما في ذلك نماذج Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [رابط](https://aws.amazon.com/q/developer/) | يستخدم AWS Builder ID نفسه أو مسار رمز التحديث المستورد نفسه الذي يستخدمه Kiro، لكنه يُبقي اتصالات Amazon Q منفصلة. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [رابط](https://cline.bot/cline-pass) | ‏ClinePass هو اشتراك Cline بقيمة 9.99 دولارًا شهريًا، ويجمع 10 نماذج برمجة مفتوحة. سجّل الدخول باستخدام حساب Cline الخاص بك (بيانات الدخول نفسها المستخدمة في Cline CLI/IDE)، أو الصق مفتاح ClinePass API مباشرًا (app.cline.bot ← الإعدادات ← مفاتيح API). يتيح اشتراك ClinePass نماذج cline-pass/*. ويعيد استخدام مسار Cline WorkOS OAuth. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [رابط](https://copilot.tencent.com) | ‏Tencent CodeBuddy CN ‏(copilot.tencent.com). سجّل الدخول عبر مسار رمز الجهاز الرسمي لـ CLI، أو الصق مفتاح API مباشرًا (يُرسَل كـ Authorization: Bearer). الكتالوج: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [رابط](https://cli.devin.ai) | يتطلب الملف التنفيذي لـ Devin CLI. شغّل `devin auth login` للمصادقة، أو أدخل WINDSURF_API_KEY الخاص بك. التثبيت: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [رابط](https://devin.ai) | الصق مفتاح Devin API موجودًا من جلسة Devin تمت مصادقتها. يختلف توفر تصدير المفتاح وخطواته حسب إصدار Devin والحساب. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | أدخل عنوان URL لمثيل GHE الخاص بك (مثل https://ghe.company.com) في إعدادات الموفّر، ثم صادِق عبر مسار الجهاز. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [رابط](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | لم تتم تهيئة GitLab Duo OAuth. سجّل تطبيق OAuth على https://gitlab.com/-/profile/applications باستخدام عنوان URI لإعادة التوجيه http://localhost:20128/callback والنطاقين "ai_features read_user"، ثم عيّن GITLAB_DUO_OAUTH_CLIENT_ID (واختياريًا GITLAB_DUO_OAUTH_CLIENT_SECRET) وأعِد التشغيل. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | سجّل الدخول باستخدام متصفحك، أو الصق ~/.grok/auth.json الخاص بك (أو رمز وصول JWT) من Grok Build CLI؛ يُدوَّر refresh_token تلقائيًا في كلتا الحالتين. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [رابط](https://www.kimi.com/code?aff=omniroute) | سجّل الدخول باستخدام حساب Kimi نفسه المستخدم في Kimi Code CLI. يستخدم OmniRoute مسار CLI OAuth ونقاط نهاية Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | الخطة المجانية: 50 رصيدًا شهريًا (نحو 25K–100K رمزًا). ⚠️ تحظر شروط خدمة Kiro استخدام الوكلاء/أطر التشغيل التابعة لجهات خارجية. | -| `openference` | `of` | Openference | OAuth | [رابط](https://openference.com) | سجّل الدخول باستخدام حساب Openference الخاص بك لتوجيه الطلبات عبر api.openference.com. يلزم وجود خطة نشطة للاستدلال — قد تنجح مصادقة OAuth، لكنها تُرجع 402 دون خطة نشطة. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [رابط](https://trae.ai) | ‏Trae هو IDE أصيل قائم على الذكاء الاصطناعي من ByteDance (الوكيل البعيد SOLO). فوّض عبر trae.ai في النافذة المنبثقة، أو سجّل الدخول على solo.trae.ai والصق Cloud-IDE-JWT (يُرسَل كـ 'Authorization: Cloud-IDE-JWT '، بصلاحية تقارب 14 يومًا) باعتباره رمز الوصول؛ وتُنقَل web_id/biz_user_id/user_unique_id/scope/tenant/region عبر providerSpecificData. لا يتوفر تحديث دون واجهة للرموز الملصقة — أعِد لصق الرمز عند انتهاء صلاحيته. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [رابط](https://x.ai) | سجّل الدخول باستخدام xAI لاستعمال نماذج api.x.ai مثل Grok 4.5. وهذا منفصل عن جلسات Grok Build JWT، التي تستخدم cli-chat-proxy.grok.com والأسماء المستعارة لنماذج grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [رابط](https://zed.dev) | يخزّن Zed بيانات اعتماد موفّري LLM ‏(OpenAI وAnthropic وGoogle وMistral وxAI) في سلسلة مفاتيح نظام التشغيل. استخدم زر الاستيراد أدناه لاكتشافها واستيرادها تلقائيًا. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [رابط](https://zed.dev) | سجّل الدخول باستخدام حساب Zed الخاص بك (تسجيل دخول التطبيق الأصلي). يُنشئ OmniRoute زوج مفاتيح RSA لمرة واحدة ويفتح zed.dev لتفويضه — عند التثبيت على جهاز بعيد/دون واجهة، انسخ عنوان URL الناتج لرد الاتصال 127.0.0.1 من شريط عناوين متصفحك والصقه هنا. يختلف هذا عن مُدخل استيراد بيانات اعتماد 'Zed IDE' أعلاه: إذ يمرّر إكمالات المحادثة عبر مجمّع النماذج المستضافة الخاص بـ Zed ‏(cloud.zed.dev)، الذي يوفّر نماذج Anthropic/OpenAI/Google/xAI ضمن خطة Zed الخاصة بك. | +## المزوّدون دون مصادقة (لا يتطلبون مفتاحًا) (10) + +| المعرّف | الاسم المستعار | الاسم | الوسوم | الموقع الإلكتروني | ملاحظات | استدعاء الأدوات | +| ----------------------- | -------------- | ------------------------- | ----------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | +| `aihorde` | `horde` | AI Horde | دون مصادقة | [رابط](https://aihorde.net) | لا يتطلب مفتاح API — يستخدم المفتاح المجهول الموثّق الخاص بـ AI Horde. إضافة مفتاح مجاني من aihorde.net اختيارية ولا تمنح سوى أولوية أعلى في قائمة الانتظار (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | دون مصادقة | [رابط](https://augmentcode.com) | لا يخزّن OmniRoute أي مفتاح API. ثبّت Auggie CLI وشغّل `auggie login` على هذا الجهاز، ثم يشغّله OmniRoute محليًا لكل طلب. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | دون مصادقة | [رابط](https://playground.ai.cloudflare.com) | لا يتطلب بيانات اعتماد — جلسات متصفح مجهولة عبر بروتوكول WebSocket ‏cf_agent خضع للهندسة العكسية (باستخدام Playwright للنقل). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | دون مصادقة | [رابط](https://developers.openai.com/codex/cli) | لا يخزّن OmniRoute أي رمز مميّز. يدير خادم التطبيق الخاص بـ Codex CLI عملية تسجيل الدخول إلى ChatGPT بنفسه (~/.codex/auth.json، مع تحديث تلقائي). استخدم «تسجيل الدخول باستخدام ChatGPT» إذا لم تتم مصادقة CLI بعد. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | دون مصادقة | [رابط](https://docs.devin.ai/work-with-devin/devin-cli) | تتولى أداة Devin CLI الرسمية المصادقة داخل وحدة تخزين الجسر المعزولة الخاصة بها. | محاكى | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | دون مصادقة | [رابط](https://duckduckgo.com/duckchat) | لا يتطلب بيانات اعتماد — خدمة DuckDuckGo AI Chat مجهولة ومجانية. | محاكى | +| `opencode` | `oc` | OpenCode Free | دون مصادقة | [رابط](https://opencode.ai) | لا يتطلب مفتاح API — يستخدم نقطة النهاية العامة المجانية الخاصة بـ OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | دون مصادقة | [رابط](https://uncloseai.com) | لا يتطلب مصادقة. تقبل API أي سلسلة غير فارغة كمفتاح للتعريف. إذا أعادت النماذج المضمّنة الأقدم الخطأ 404، فاستخدم «النماذج المتاحة» ← «استيراد من /models» أو «المزامنة التلقائية»؛ النموذج الفعّال الذي تم التحقق منه: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | دون مصادقة، فيديو | [رابط](https://veoaifree.com) | لا يتطلب مصادقة. يقتصر المعدّل على 6 طلبات/ساعة لكل عنوان IP. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | دون مصادقة | [رابط](https://zcode.z.ai) | لا يخزّن OmniRoute أي مفتاح API. يستخدم خادم التطبيق المحلي الخاص بـ ZCode تسجيل الدخول الحالي إلى builtin:zai-coding-plan. | — | + +## موفرو OAuth (24) + +| المعرّف | الاسم المستعار | الاسم | الوسوم | الموقع الإلكتروني | ملاحظات | +| --------------- | -------------- | ------------------------- | ------ | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [رابط](https://antigravity.google) | استورد بيانات تسجيل دخول Antigravity CLI (`agy`) الخاصة بك (عبر لصق/رفع ملف الرمز المميز الخاص به)، أو اكتشف تلقائيًا تسجيل دخول محليًا إلى CLI، أو سجّل الدخول باستخدام Google. يشارك الواجهة الخلفية لـ Antigravity (بما في ذلك نماذج Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [رابط](https://aws.amazon.com/q/developer/) | يستخدم AWS Builder ID نفسه أو مسار رمز التحديث المستورد نفسه كما في Kiro، لكنه يُبقي اتصالات Amazon Q منفصلة. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [رابط](https://cline.bot/cline-pass) | ClinePass هو اشتراك Cline بقيمة 9.99 دولارًا شهريًا، ويجمع 10 نماذج ترميز مفتوحة. سجّل الدخول باستخدام حساب Cline الخاص بك (بيانات الدخول نفسها المستخدمة في Cline CLI/IDE)، أو الصق مفتاح ClinePass API مباشرًا (app.cline.bot → الإعدادات → مفاتيح API). يتيح اشتراك ClinePass نماذج cline-pass/*. ويعيد استخدام مسار Cline WorkOS OAuth. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [رابط](https://copilot.tencent.com) | Tencent CodeBuddy CN ‏(copilot.tencent.com). سجّل الدخول عبر مسار رمز الجهاز الرسمي لـ CLI، أو الصق مفتاح API مباشرًا (يُرسل بصيغة Authorization: Bearer). الكتالوج: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [رابط](https://cli.devin.ai) | يتطلب الملف التنفيذي لـ Devin CLI. شغّل `devin auth login` للمصادقة، أو قدّم WINDSURF_API_KEY الخاص بك. التثبيت: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [رابط](https://devin.ai) | الصق مفتاح Devin API موجودًا من جلسة Devin موثّقة. يختلف توفر تصدير المفتاح وخطواته حسب إصدار Devin والحساب. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | أدخل عنوان URL لمثيل GHE الخاص بك (مثل https://ghe.company.com) في إعدادات الموفّر، ثم صادِق عبر مسار الجهاز. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [رابط](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | لم تتم تهيئة GitLab Duo OAuth. سجّل تطبيق OAuth على https://gitlab.com/-/profile/applications باستخدام عنوان URI لإعادة التوجيه http://localhost:20128/callback والنطاقين "ai_features read_user"، ثم عيّن GITLAB_DUO_OAUTH_CLIENT_ID (واختياريًا GITLAB_DUO_OAUTH_CLIENT_SECRET) وأعد التشغيل. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | سجّل الدخول باستخدام متصفحك، أو الصق ~/.grok/auth.json الخاص بك (أو رمز وصول JWT) من Grok Build CLI؛ ويُدوَّر refresh_token تلقائيًا في كلتا الحالتين. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [رابط](https://www.kimi.com/code?aff=omniroute) | سجّل الدخول باستخدام حساب Kimi نفسه المستخدم مع Kimi Code CLI. يستخدم OmniRoute مسار CLI OAuth ونقاط نهاية Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | الفئة المجانية: 50 رصيدًا شهريًا (نحو 25 ألفًا–100 ألف رمز مميز). ⚠️ تحظر شروط خدمة Kiro استخدام الوكلاء/أطر التشغيل التابعة لجهات خارجية. | +| `openference` | `of` | Openference | OAuth | [رابط](https://openference.com) | سجّل الدخول باستخدام حساب Openference الخاص بك لتوجيه الطلبات عبر api.openference.com. يتضمن وصولًا ضمن الفئة المجانية إلى Qwen3.8 27b وLlama 3.2 3B — راجع openference.com/pricing للاطلاع على شروط الخطة الحالية. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [رابط](https://trae.ai) | Trae هو IDE أصلي للذكاء الاصطناعي من ByteDance (وكيل SOLO بعيد). فوّض عبر trae.ai في النافذة المنبثقة، أو سجّل الدخول على solo.trae.ai والصق Cloud-IDE-JWT (يُرسل بصيغة 'Authorization: Cloud-IDE-JWT '، بصلاحية تبلغ نحو 14 يومًا) بوصفه رمز الوصول؛ وتُنقل web_id/biz_user_id/user_unique_id/scope/tenant/region عبر providerSpecificData. لا يتوفر تحديث دون واجهة للرموز الملصقة — أعد لصق الرمز عند انتهاء صلاحيته. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [رابط](https://x.ai) | سجّل الدخول باستخدام xAI لاستعمال نماذج api.x.ai مثل Grok 4.5. هذا منفصل عن جلسات Grok Build JWT، التي تستخدم cli-chat-proxy.grok.com والأسماء المستعارة لنماذج grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [رابط](https://zed.dev) | يخزّن Zed بيانات اعتماد موفري LLM ‏(OpenAI وAnthropic وGoogle وMistral وxAI) في سلسلة مفاتيح نظام التشغيل. استخدم زر الاستيراد أدناه لاكتشافها واستيرادها تلقائيًا. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [رابط](https://zed.dev) | سجّل الدخول باستخدام حساب Zed الخاص بك (تسجيل الدخول عبر التطبيق الأصلي). ينشئ OmniRoute زوج مفاتيح RSA صالحًا لمرة واحدة ويفتح zed.dev لتفويضه — في تثبيت بعيد/دون واجهة، انسخ عنوان URL الناتج لمعاودة الاتصال 127.0.0.1 من شريط عناوين متصفحك والصقه هنا. يختلف هذا عن إدخال استيراد بيانات اعتماد 'Zed IDE' أعلاه: إذ يمرّر إكمالات الدردشة عبر مجمّع النماذج المستضافة الخاص بـ Zed ‏(cloud.zed.dev)، الذي يتيح نماذج Anthropic/OpenAI/Google/xAI ضمن خطة Zed الخاصة بك. | ## موفرو ملفات تعريف الارتباط للويب (34) @@ -115,252 +115,252 @@ | `zai-web` | `zw` | Z.ai Web | ملف تعريف ارتباط للويب | [الرابط](https://chat.z.ai) | انسخ قيمة "token" من chat.z.ai ← DevTools ← Application ← Local Storage. لا تنسخ ملفات تعريف الارتباط؛ يتولى OmniRoute اختبار CAPTCHA لكل طلب عبر وسيلة النقل الخاصة بالمتصفح. | — | | `zenmux-free` | `zmf` | ZenMux Free (الويب) | ملف تعريف ارتباط للويب | [الرابط](https://zenmux.ai) | سجّل الدخول في zenmux.ai، ثم صدّر جميع ملفات تعريف الارتباط باستخدام EditThisCookie أو Cookie-Editor والصق سلسلة ترويسة Cookie الكاملة هنا. حدّثها كل نحو 30 يومًا. | — | -## موفّرو مفاتيح API (مدفوعة / مدفوعة مع أرصدة مجانية) (242) - -| المعرّف | الاسم المستعار | الاسم | الوسوم | الموقع الإلكتروني | ملاحظات | -| ------------------------ | --------------- | ---------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | مفتاح API | [رابط](https://ai.360.cn) | احصل على مفتاح API من ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | مفتاح API، مجمّع | [رابط](https://agentrouter.org) | أرصدة مجانية بقيمة $200 عند التسجيل — بوابة توجيه متعددة النماذج | -| `agnes` | `agnes` | Agnes AI | مفتاح API، فيديو | [رابط](https://agnes-ai.com) | احصل على مفتاح API من agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (الصين) | مفتاح API | [رابط](https://api.agnes-ai.cn) | احصل على مفتاح API من موقع Agnes CN. | -| `ai21` | `ai21` | AI21 Labs | مفتاح API | [رابط](https://www.ai21.com) | أرصدة تجريبية بقيمة $10 عند التسجيل (صالحة لمدة 3 أشهر)، ولا تُشترط بطاقة ائتمان | -| `aimlapi` | `aiml` | AI/ML API | مفتاح API، مجمّع | [رابط](https://aimlapi.com) | أُوقفت الخطة المجانية مؤقتًا (2026) — أصبحت AI/ML API الآن بنظام الدفع حسب الاستخدام فقط (الحد الأدنى للشحن $20)؛ ولا توجد أرصدة مجانية متكررة. | -| `ainative` | `ainative` | AINative Studio | مفتاح API | [رابط](https://ainative.studio) | أنشئ مفتاح API مجانيًا في ainative.studio (من دون بطاقة)، ثم الصقه هنا كرمز Bearer. | -| `aion` | `aion` | Aion Labs | مفتاح API | [رابط](https://www.aionlabs.ai) | أنشئ مفتاح API مجانيًا في aionlabs.ai (من دون بطاقة)، ثم الصقه هنا كرمز Bearer. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | مفتاح API | [رابط](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (الصين) | مفتاح API | [رابط](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | مفتاح API | [رابط](https://developer.ant-ling.com/en/docs/) | سجّل وأنشئ مفتاح API في وحدة تحكم Ant Ling API ‏(https://chat.ant-ling.com/open)، ثم الصقه هنا. يوجّه OmniRoute حركة محادثات الدردشة إلى https://api.ant-ling.com/v1/chat/completions؛ والموفّر متوافق مع OpenAI ويوفّر أيضًا واجهة متوافقة مع Anthropic. | -| `anthropic` | `anthropic` | Anthropic | مفتاح API | [رابط](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | مفتاح API، مجمّع | [رابط](https://anyapi.ai) | الخطة المجانية: 100,000 من رموز ANY يوميًا و100 طلب في الدقيقة للنماذج المجانية/الأساسية المؤهلة؛ ولا تُشترط بطاقة ائتمان. | -| `api-airforce` | `af` | Api.airforce | مفتاح API | [رابط](https://api.airforce) | 55 نموذجًا ضمن الخطة المجانية، بما في ذلك Grok-3 وClaude 3.7 وQwen3 وKimi-K2 وGemini 2.5 Flash وDeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | مفتاح API | [رابط](https://arcee.ai) | احصل على مفتاح API من arcee.ai | -| `auriko` | `auriko` | Auriko | مفتاح API، مجمّع | [رابط](https://www.auriko.ai) | تتيح الخطة المجانية 1,000 طلب منصة في الدقيقة و10,000 طلب BYOK في الدقيقة. لا يزال الاستدلال عبر المنصة خاضعًا لتكلفة الموفّر؛ فهذه ليست مجموعة رموز مجانية ولا استدلالًا مجانيًا غير محدود. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | مفتاح API، مؤسسات | [رابط](https://learn.microsoft.com/azure/ai-foundry) | استخدم مفتاح Azure AI Foundry الخاص بك. يمكن أن يكون عنوان URL الأساسي https://.services.ai.azure.com/openai/v1/ أو https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | مفتاح API، مؤسسات | [رابط](https://azure.microsoft.com/products/ai-services/openai-service) | استخدم مفتاح Azure OpenAI API الخاص بك. يجب أن يكون عنوان URL الأساسي هو نقطة نهاية موردك، مثل https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | مفتاح API | [رابط](https://b.ai) | مفتاح Bearer API لبوابة نماذج LLM المتوافقة مع OpenAI التابعة لـ b.ai (وهي مختلفة عن TheB.AI). أنشئ مفتاحًا في https://docs.b.ai، ثم استخدم https://api.b.ai/v1 كعنوان URL أساسي متوافق مع OpenAI. | -| `baichuan` | `baichuan` | Baichuan | مفتاح API | [رابط](https://www.baichuan-ai.com/) | احصل على مفتاح API من platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | مفتاح API | [رابط](https://ernie.baidu.com/) | احصل على مفتاح API من console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | مفتاح API | [رابط](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | مفتاح API | [رابط](https://baseten.co) | أرصدة تجريبية مجانية بقيمة $30 للاستدلال باستخدام GPU | -| `bazaarlink` | `bzl` | BazaarLink | مفتاح API | [رابط](https://bazaarlink.ai) | استخدم مفتاح BazaarLink API الخاص بك (يبدأ بـ sk-bl-) في Authorization: Bearer . تعمل OpenAI SDK مع عنوان URL الأساسي https://bazaarlink.ai/api/v1. تستخدم النماذج تنسيق provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | مفتاح API، مؤسسات | [رابط](https://aws.amazon.com/bedrock) | استخدم مفتاح Amazon Bedrock API الخاص بك واضبط منطقة AWS التي تكون نماذجك مفعّلة فيها (مثل eu-west-2). يستدعي OmniRoute واجهة Converse API الأصلية الخاصة بـ Bedrock مباشرةً. | -| `black-forest-labs` | `bfl` | Black Forest Labs | مفتاح API، صور | [رابط](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | مفتاح API | [رابط](https://blackbox.ai) | ⚠️ **مُهمَل.** يعيد api.blackbox.ai استجابة HTTP 404 لكل صيغة من صيغ المسار (فحص 2026-08-21)؛ وقد نُقلت واجهة الاستدلال العامة إلى نقطة النهاية المقيّدة enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | مفتاح API | [رابط](https://www.bluesminds.com) | أرصدة pi يومية مجانية — يدعم أكثر من 200 نموذج، بما في ذلك GPT-4o وGPT-4.1 وClaude Sonnet 4.5 وGemini 2.0 Flash وDeepSeek V4 وQwen وKimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | مفتاح API | [رابط](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | مفتاح API | [رابط](https://bytez.com) | أرصدة مجانية بقيمة $1، تتجدد كل 4 أسابيع | -| `cerebras` | `cerebras` | Cerebras | مفتاح API | [رابط](https://inference.cerebras.ai) | رصيد تسجيل لمرة واحدة بقيمة $5 (صالح لمدة 30 يومًا)؛ وتُشترط وسيلة دفع. ليست هذه خطة مجانية متكررة. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | مفتاح API | [رابط](https://hyper.charm.land) | 100 من أرصدة Hypercredits الشهرية المجانية عند التسجيل | -| `chat-oripe` | `chat-oripe` | Chat Oripe | مفتاح API، مجمّع | [رابط](https://api.oriper.com) | تشير البيانات الوصفية الرسمية إلى مليوني رمز شهريًا، لكن الموقع العام والوثائق كانا محجوبين أثناء التدقيق؛ لذا اعتبر الحصة وربط العلامة التجارية غير مؤكّدين. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | مفتاح API، مُجمِّع | [رابط](https://chatanywhere.tech) | للاستخدام الشخصي أو التعليمي أو البحثي فقط: تشير الوثائق العامة إلى 10,000 نقطة/يوم و200 طلب/يوم لكل عنوان IP/مفتاح؛ لا تستخدمه لحركة المرور التجارية. | -| `cheaperinference` | `cinf` | Cheaper Inference | مفتاح API | [رابط](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | مفتاح API | [رابط](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | مفتاح API، مُجمِّع | [رابط](https://chutes.ai) | مفتاح API من نوع Bearer لبوابة Chutes المتوافقة مع OpenAI. | -| `clarifai` | `clarifai` | Clarifai | مفتاح API، مؤسسي | [رابط](https://docs.clarifai.com) | استخدم PAT الخاص بك من Clarifai أو مفتاح API خاصًا بالتطبيق. يستهدف OmniRoute نقطة النهاية المتوافقة مع OpenAI على https://api.clarifai.com/v2/ext/openai/v1 ويُجري المصادقة باستخدام Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | مفتاح API، مُجمِّع | [رابط](https://cloudcode.one) | تشمل النماذج المجانية المنشورة glm-4.7-flash وglm-4.6v-flash؛ لم تُنشر حصة رقمية، وقد يتطلب إنشاء المفتاح رصيدًا أو قسيمة. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | مفتاح API | [رابط](https://developers.cloudflare.com/workers-ai) | يتطلب API Token وAccount ID (يمكن العثور عليه في dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | مفتاح API | [رابط](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | مفتاح API | [رابط](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | مفتاح API | [رابط](https://cohere.com) | تجربة مجانية: 1,000 استدعاء API شهريًا للاختبار، دون الحاجة إلى بطاقة ائتمان | -| `command-code` | `cmd` | Command Code | مفتاح API | [رابط](https://commandcode.ai/) | استخدم مفتاح API من Command Code. تُرسل الطلبات إلى نقطة النهاية /provider/v1/chat/completions الخاصة بـCommand Code. | -| `coze` | `coze` | Coze | مفتاح API | [رابط](https://coze.com) | احصل على مفتاح API من coze.com/open/api | -| `crof` | `crof` | CrofAI | مفتاح API | [رابط](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | مفتاح API | [رابط](https://cursor.com/dashboard/api) | الصق مفتاح API لمستخدم Cursor ‏(crsr_...) من cursor.com/dashboard/api. يستبدله OmniRoute برمز جلسة عند الطلب؛ ولا يلزم تثبيت IDE أو cursor-agent. تُحتسب رسوم الاستخدام على خطة Cursor المالكة للمفتاح. | -| `dahl` | `dahl` | Dahl | مفتاح API | [رابط](https://inference.dahl.global) | انقر على 'Add Account' لإنشاء رمز تلقائيًا، أو أضف مفتاح API يدويًا. | -| `databricks` | `databricks` | Databricks | مفتاح API، مؤسسي | [رابط](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | مفتاح API، مؤسسي | [رابط](https://docs.datarobot.com) | استخدم رمز API الخاص بك من DataRobot. يمكن أن يكون Base URL الاختياري جذر الحساب (لـLLM Gateway) أو عنوان URL لنشر ضمن /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | مفتاح API، صور | [رابط](https://deepai.org) | استخدم مفتاح API الخاص بك من DeepAI. احصل عليه من deepai.org — يتطلب اشتراك Pro ‏($9.99/شهر). | -| `deepinfra` | `deepinfra` | DeepInfra | مفتاح API | [رابط](https://deepinfra.com) | أرصدة مجانية عند التسجيل لاختبار API واستكشاف النماذج | -| `deepseek` | `ds` | DeepSeek | مفتاح API | [رابط](https://platform.deepseek.com) | 5M رمز مميز مجاني عند التسجيل - دون الحاجة إلى بطاقة ائتمان | -| `dgrid` | `dgrid` | DGrid | مفتاح API | [رابط](https://dgrid.ai) | موجّه النماذج المجانية من DGrid: ‏10 طلبات/دقيقة و100 طلب/يوم. تؤدي تعبئة بقيمة $5 لمرة واحدة إلى إتاحة ما يصل إلى 20 طلبًا/دقيقة و1,000 طلب/يوم. | -| `dify` | `dify` | Dify | مفتاح API | [رابط](https://dify.ai) | احصل على مفتاح API من مثيل Dify الخاص بك. | -| `digitalocean` | `digitalocean` | DigitalOcean | مفتاح API | [رابط](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | مفتاح API | [رابط](https://dit.ai) | استخدم مفتاح API الخاص بك من dit.ai في Authorization: Bearer . متوافق بالكامل مع OpenAI — بديل مباشر، ما عليك سوى تغيير عنوان URL الأساسي إلى https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | مفتاح API | [رابط](https://doubao.com) | احصل على مفتاح API من console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | مفتاح API، مُجمِّع | [رابط](https://www.dxnt.com) | الحسابات المجانية موثقة بحد 100 استدعاء/يوم؛ وقد تزداد الحصة عبر الدعوات ويمكن أن تختلف حسب الحساب. | -| `electronhub` | `electronhub` | Electron Hub | مفتاح API، مُجمِّع | [رابط](https://www.electronhub.ai) | الخطة المجانية: 5 RPM، وأرصدة أسبوعية بقيمة $0.25، و10 Neutrinos/يوم لنماذج :free؛ كما تُطبّق ميزانيات العائلة. | -| `empower` | `empower` | Empower | مفتاح API، مُجمِّع | [رابط](https://docs.empower.dev) | مفتاح API من نوع Bearer لنقطة نهاية Empower المتوافقة مع OpenAI. | -| `eurouter` | `eurouter` | EURouter | مفتاح API، مُجمِّع | [رابط](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | مفتاح API | [رابط](https://factory.ai) | مفتاح API من نوع Bearer لبوابة Factory المتوافقة مع OpenAI. | -| `fal-ai` | `fal` | Fal.ai | مفتاح API، صور | [رابط](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | مفتاح API، مُجمِّع | [رابط](https://fastrouter.ai) | تسمح النماذج ذات اللاحقة :free بإجراء 10 طلبات/يوم لكل مؤسسة ونموذج؛ وقد يتغير التوفر. | -| `featherless-ai` | `featherless` | Featherless AI | مفتاح API | [رابط](https://featherless.ai) | تتوفر فئة مجانية — دون الحاجة إلى بطاقة ائتمان | -| `fenayai` | `fenayai` | FenayAI | مفتاح API، مُجمِّع | [رابط](https://fenayai.com) | مفتاح API من نوع Bearer لبوابة FenayAI المتوافقة مع OpenAI. | -| `fireworks` | `fireworks` | Fireworks AI | مفتاح API | [رابط](https://fireworks.ai) | أرصدة بدء مجانية بقيمة $1 عند التسجيل لاختبار API | -| `free-ai` | `free-ai` | Free.ai | مفتاح API، مُجمِّع | [رابط](https://free.ai) | تغطي 30,000 رمز مميز/يوم النماذج ذاتية الاستضافة بعد التحقق من البريد الإلكتروني. قد تُفوْتر الاستخدامات التي تتجاوز الحصة بالتكلفة الفعلية، أما النماذج الخارجية المتميزة فمدفوعة. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | مفتاح API | [رابط](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | مفتاح API | [رابط](https://freebuff.com) | أدخل رمز مصادقة Freebuff / Codebuff (يُحصل عليه عبر تسجيل الدخول باستخدام CLI أو أداة تجميع آلية). | -| `freeinference` | `freeinference` | FreeInference | مفتاح API، مُجمِّع | [رابط](https://freeinference.org) | وصول بحثي مجاني دون بطاقة؛ يحتاج المتقدمون من خارج Harvard إلى موافقة يدوية، ولا توجد حصة رقمية مضمونة علنًا. | -| `freemodel-dev` | `fmd` | FreeModel.dev | مفتاح API | [رابط](https://freemodel.dev) | رصيد مجاني بقيمة $300 عند التسجيل — دون الحاجة إلى بطاقة ائتمان. يمكنك الوصول إلى GPT-5.4 وGPT-5.5 (أحدث نماذج OpenAI الرائدة) من خلال API متوافق مع OpenAI. | -| `freetheai` | `fta` | FreeTheAi | مفتاح API، مُجمِّع | [رابط](https://freetheai.xyz) | انضم إلى Discord الخاص بـ FreeTheAi للحصول على مفتاح API المجاني. | -| `friendliai` | `friendli` | FriendliAI | مفتاح API | [رابط](https://friendli.ai) | فئة مجانية للاستدلال دون خادم — لا تتطلب بطاقة ائتمان | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | أنشئ أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | أنشئ أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | أنشئ أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | أنشئ أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | أنشئ أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | مفتاح API | [رابط](https://galadriel.com) | ⚠️ **مهمل.** لم يعد api.galadriel.ai قابلاً للتحليل (فحص 2026-06-19)؛ ويبدو أن API الخاص بالاستدلال قد أُوقف. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | مفتاح API | [رابط](https://aistudio.google.com) | تتوفر فئة مجانية عبر Google AI Studio؛ وتُطبَّق الحصص الحالية لكل نموذج والقيود الإقليمية | -| `getgoapi` | `ggo` | GoAPI | مفتاح API، مُجمِّع | [رابط](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | مفتاح API | [رابط](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | مفتاح API | [رابط](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | رمز وصول شخصي لـ GitLab مخصص لـ API العام الخاص باقتراحات التعليمات البرمجية. اضبط عنوان URL أساسيًا مستضافًا ذاتيًا عند عدم استخدام gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | مفتاح API | [رابط](https://opengateway.gitlawb.com) | أُلغي MiMo المجاني (xiaomi/mimo-v2.5) في 2026-05 — أصبح Opengateway الآن بوابة أرصدة بنظام الدفع حسب الاستخدام؛ ولا يوجد نموذج مجاني متكرر. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | مفتاح API | [رابط](https://opengateway.gitlawb.com) | انتهى عرض Nemotron المجاني في 2026-06 — وأصبح مسار GMI Cloud الآن قائمًا على أرصدة الدفع حسب الاستخدام فقط. | -| `glm` | `glm` | GLM Coding | مفتاح API | [رابط](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (الصين) | مفتاح API | [رابط](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | مفتاح API | [رابط](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | مفتاح API | [رابط](https://greenpt.com) | يمكن إنشاء اشتراك API مجانًا؛ وتُفرض رسوم الاستدلال لكل رمز. لا يوجد بدل مجاني منشور للاستدلال. | -| `groq` | `groq` | Groq | مفتاح API | [رابط](https://groq.com) | الخطة المجانية: حدود قصوى لكل نموذج (200K رمز/يوم لكل نموذج محادثة؛ راجع console.groq.com/docs/rate-limits لمعرفة RPM/RPD) — دون وسيلة دفع مسجَّلة. | -| `haiper` | `hp` | Haiper | مفتاح API، فيديو | [رابط](https://haiper.ai) | احصل على مفتاح API من haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | مفتاح API | [رابط](https://api.hcnsec.cn) | احصل على مفتاح API من api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | مفتاح API، مُجمِّع | [رابط](https://helixmind.online) | لم تُؤكَّد الادعاءات المتداولة سابقًا بشأن 3 RPM/50 RPD وعدم الحاجة إلى بطاقة خلال تدقيق 2026-08-02؛ وتتطلب الحصة والفوترة الحاليتان التحقق من الحساب. | -| `helyxai` | `helyxai` | Helyx AI | مفتاح API، مُجمِّع | [رابط](https://helyxai.space) | توثّق الخطة المجانية التشغيلية 100,000 رمز/يوم؛ ويتعارض ادعاء التسويق المنفصل للموقع البالغ 2M+ مع ذلك، ولا يُعتد به كضمان للحصة. | -| `heroku` | `heroku` | Heroku AI | مفتاح API، مؤسسات | [رابط](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | مفتاح API | [رابط](https://huggingface.co) | API مجاني للاستدلال لآلاف النماذج (Whisper، VITS، SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | مفتاح API | [رابط](https://hyperbolic.xyz) | أرصدة تجريبية بقيمة $1-5 عند التسجيل للاستدلال دون خادم | -| `ideogram` | `ideo` | Ideogram | مفتاح API | [رابط](https://ideogram.ai) | احصل على مفتاح API من ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | مفتاح API | [رابط](https://xinghuo.xfyun.cn) | احصل على مفتاح API من console.xfyun.cn | -| `inception` | `inception` | Inception | مفتاح API | [رابط](https://docs.inceptionlabs.ai) | 10M رمز مجاني عند التسجيل، دون الحاجة إلى بطاقة ائتمان. | -| `inference-net` | `inet` | Inference.net | مفتاح API | [رابط](https://inference.net) | أرصدة مجانية بقيمة $25 عند التسجيل، بالإضافة إلى توفر منح بحثية | -| `internlm` | `internlm` | InternLM (Intern-S1) | مفتاح API | [رابط](https://internlm.intern-ai.org.cn/) | حصة شهرية مجانية تبلغ نحو 1M من رموز الإدخال / 3M من رموز الإخراج (نحو 10 RPM) | -| `jina-ai` | `jina` | Jina AI ‏(Foundation API) | مفتاح API، تضمين/إعادة ترتيب | [رابط](https://jina.ai) | مفتاح API من نوع Bearer لـ api.jina.ai — للتضمينات وإعادة الترتيب والتصنيف والتقسيم والبحث. تكون لمفاتيح لوحة التحكم الأولوية على JINA_AI_API_KEY. هذه ليست بطاقة Reader / r.jina.ai ولا تجلب عناوين URL. | -| `jina-reader` | `jr` | Jina Reader ‏(r.jina.ai) | مفتاح API | [رابط](https://jina.ai/reader) | مفتاح API من نوع Bearer لخدمة تحويل عنوان URL إلى Markdown عبر r.jina.ai ‏(/v1/web/fetch فقط). لا يوفّر /v1/embeddings أو /v1/rerank. يعمل رمز Jina نفسه المستخدم مع Foundation API؛ ويعيد OmniRoute استخدام مفتاح jina-ai من لوحة التحكم أو JINA_AI_API_KEY عندما تكون هذه البطاقة فارغة. | -| `kenari` | `kenari` | Kenari | مفتاح API | [رابط](https://kenari.id) | استخدم مفتاح Kenari API الخاص بك (kn-...) في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي للـ API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | مفتاح API | [رابط](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | مفتاح API، مُجمِّع | [رابط](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi ‏(واجهة Moonshot API القديمة) | مفتاح API | [رابط](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | مفتاح Kimi Code API | مفتاح API | [رابط](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | مفتاح API | [رابط](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | مفتاح API، مُجمِّع | [رابط](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | مفتاح API، فيديو | [رابط](https://leonardo.ai) | احصل على مفتاح API من leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | مفتاح API | [رابط](https://liquid.ai) | احصل على مفتاح API من liquid.ai | -| `literouter` | `literouter` | LiteRouter | مفتاح API، مُجمِّع | [رابط](https://literouter.com) | تستخدم إصدارات النماذج المجانية اللاحقة :free؛ وتختلف حدود الرصيد اليومية حسب النموذج، ويقتصر الإدخال المجاني على 5,000 رمز. | -| `llamagate` | `llamagate` | LlamaGate | مفتاح API | [رابط](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | مفتاح API، مُجمِّع | [رابط](https://llm.kiwi) | تتيح الخطة المجانية auto وhrLLM؛ وينطبق الحد المنشور البالغ 40 طلبًا/ساعة على hrLLM. | -| `llm7` | `llm7` | LLM7.io | مفتاح API | [رابط](https://llm7.io) | استخدم أي مفتاح غير فارغ (على سبيل المثال 'unused'). إذا أعادت النماذج المضمّنة الأقدم الخطأ model_unavailable، فاستخدم Available Models → Import from /models أو Auto-Sync؛ النموذج الفعّال الذي تم التحقق منه: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | مفتاح API، مُجمِّع | [رابط](https://llmgateway.io) | خطة Free المستضافة: تقتصر النماذج ذات السعر المجاني على 5 طلبات لكل 10 دقائق عندما لا يحتوي الحساب على أرصدة. | -| `logfare` | `logfare` | Logfare | مفتاح API، مُجمِّع | [رابط](https://logfare.ai) | أنشئ حسابًا مجانيًا على https://logfare.ai/register (اسم مستخدم/كلمة مرور، دون التحقق من البريد الإلكتروني) للحصول فورًا على مفتاح API، ثم الصقه هنا كرمز Bearer. | -| `longcat` | `lc` | LongCat AI | مفتاح API | [رابط](https://longcat.chat/platform/docs) | مجانًا: منحة لمرة واحدة قدرها 10 ملايين رمز بعد تسجيل الحساب والتحقق من الهوية (LongCat-2.0). تُمنح مرة واحدة فقط — وليست حصة دورية يومية/شهرية. | -| `magnific` | `freepik` | Magnific | مفتاح API، صورة | [رابط](https://www.magnific.com) | احصل على مفتاح API من magnific.com/user/api-keys (الترويسة x-magnific-api-key). لا تزال مفاتيح مطوري Freepik القديمة تعمل. | -| `maritalk` | `maritalk` | Maritalk | مفتاح API | [رابط](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | مفتاح API، مُجمِّع | [رابط](https://meganova.ai) | تسجيل مجاني دون بطاقة. يبلغ إجمالي حصص Tier 1 المنشورة لكل نموذج 550 طلبًا/يوم؛ وهي ليست مجموعة عامة مشتركة، وقد تُطبّق رسوم الاستخدام الزائد إذا كانت مفعّلة. | -| `meta-llama` | `meta` | Meta Llama API | مفتاح API | [رابط](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | مفتاح API، فيديو | [رابط](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (الصين) | مفتاح API | [رابط](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | مفتاح API | [رابط](https://mistral.ai) | فئة Experiment المجانية: وصول محدود المعدّل إلى جميع النماذج، دون الحاجة إلى بطاقة ائتمان | -| `mixedbread` | `mxbai` | Mixedbread AI | مفتاح API | [رابط](https://www.mixedbread.com) | مفتاح API من نوع Bearer لواجهة Mixedbread embeddings API. | -| `mixlayer` | `mixlayer` | Mixlayer | مفتاح API، مُجمِّع | [رابط](https://www.mixlayer.com) | النموذج qwen/qwen3.5-4b-free مجاني لإنشاء النماذج الأولية ومحدود المعدّل؛ ولم يتم تأكيد حد RPM عام ثابت أو حصة يومية. | -| `mnn-ai` | `mnn-ai` | MNN AI | مفتاح API، مُجمِّع | [رابط](https://mnnai.ru) | الخطة المجانية: أرصدة شهرية بقيمة $1، و10 RPM، ووصول إلى النماذج التي تحمل علامة Free فقط. | -| `modal` | `mdl` | Modal | مفتاح API، مؤسسات | [رابط](https://modal.com/docs) | استخدم رمز Bearer الذي يحمي نشر Modal الخاص بك، إذا كان مفعّلًا. يجب أن يشير عنوان URL الأساسي إلى تطبيق Modal المتوافق مع OpenAI، على سبيل المثال https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | مفتاح API | [رابط](https://modelscope.cn) | فئة مجانية عبر ModelScope API-Inference — يلزم حساب Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | مفتاح API | [رابط](https://monsterapi.ai) | ⚠️ **مهملة.** أوقفت Monster API عملياتها في 2026-06-30. استخدم موفّرين بديلين متوافقين مع OpenAI. | -| `moonshot` | `moonshot` | Kimi | مفتاح API | [رابط](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | مفتاح API | [رابط](https://morphllm.com) | الفئة المجانية: 250 ألف رصيد/شهر، $0 | -| `muse-code` | `mc` | Muse Code ‏(Meta) | مفتاح API | [رابط](https://github.com/meta-llama/llama-stack) | استخدم متغير البيئة META_API_KEY الخاص بك كرمز Bearer. تستخدم Muse Code CLI تنسيق OpenAI Responses API عبر الشبكة (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | مفتاح API، مُجمِّع | [رابط](https://naga.ac) | احصل على مفتاح API من naga.ac — يتوفر التسجيل عبر Google/GitHub/Discord. | -| `naga-ai` | `naga-ai` | Naga AI | مفتاح API، مُجمِّع | [رابط](https://naga.ac) | النماذج المميزة باللاحقة :free مدرجة علنًا، ولكن لا توجد حصة رقمية مؤكدة. تحذر سياسة Naga من أن مطالبات ومخرجات الفئة المجانية قد تُجمع أو تُستخدم للتدريب. | -| `nanogpt` | `nanogpt` | NanoGPT | مفتاح API | [رابط](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | مفتاح API | [رابط](https://bynara.id) | أنشئ حساب NaraRouter مجانيًا، واربط حسابك على Telegram (مطلوب قبل الحصول على إجابات عبر /v1)، ثم الصق المفتاح هنا كرمز Bearer. | -| `navy` | `navy` | NavyAI | مفتاح API | [رابط](https://api.navy) | أنشئ مفتاح API مجانيًا من لوحة معلومات NavyAI، ثم الصقه هنا كرمز Bearer. | -| `nebius` | `nebius` | Nebius AI | مفتاح API | [رابط](https://nebius.com) | أرصدة تجريبية بقيمة ~$1 عند التسجيل لاختبار API | -| `nlpcloud` | `nlpc` | NLP Cloud | مفتاح API | [رابط](https://docs.nlpcloud.com) | استخدم مفتاح API الخاص بـ NLP Cloud في Authorization: Token . يستهدف OmniRoute افتراضيًا نقطة نهاية روبوت الدردشة على https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | مفتاح API | [رابط](https://nomic.ai) | احصل على مفتاح API من atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | مفتاح API | [رابط](https://portal.nousresearch.com/help) | استخدم مفتاح API الخاص بك من Nous Portal. يستهدف OmniRoute نقطة نهاية الاستدلال الرسمية المتوافقة مع OpenAI على https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | مفتاح API، فيديو، مُجمِّع | [رابط](https://novita.ai) | أرصدة تجريبية بقيمة $0.50 عند التسجيل (صالحة لنحو عام واحد) | -| `nscale` | `nscale` | nScale | مفتاح API | [رابط](https://nscale.com) | أرصدة مجانية بقيمة $5 عند التسجيل لاختبار الاستدلال | -| `nube` | `nube` | Nube.sh | مفتاح API | [رابط](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | مفتاح API | [رابط](https://build.nvidia.com) | وصول مجاني للمطورين: نحو 40 طلبًا في الدقيقة، وأكثر من 70 نموذجًا (Kimi K2.5، وGLM 4.7، وDeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | مفتاح API، مؤسسات | [رابط](https://www.oracle.com/artificial-intelligence/generative-ai) | استخدم مفتاح API الخاص بـ OCI Generative AI أو رمز IAM من نوع bearer. يمكن أن يكون عنوان URL الأساسي هو https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | مفتاح API، مُجمِّع | [رابط](https://ofox.ai) | يعلن الكتالوج الحالي عن أكثر من 10 نماذج مجانية من دون حصة رقمية عامة؛ راجع مصدر الخدمات الموردة وسياسات الاحتفاظ وشروط التدريب قبل الاستخدام في بيئة الإنتاج. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | مفتاح API | [رابط](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | مفتاح API | [رابط](https://1min.ai) | أنشئ مفتاح API على https://docs.1min.ai/docs/api/create-api-key، ثم الصقه هنا. | -| `openadapter` | `oad` | OpenAdapter | مفتاح API | [رابط](https://openadapter.dev) | استخدم مفتاح API الخاص بـ OpenAdapter في Authorization: Bearer sk-cv-. متوافق بالكامل مع OpenAI. عنوان URL الأساسي لـ API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | مفتاح API | [رابط](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | مفتاح API | [رابط](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | مفتاح API | [رابط](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | مفتاح API | [رابط](https://openference.com) | الخطة المجانية: فترة تجريبية لمدة 3 أيام مع نماذج مفتوحة المصدر — لا تتطلب بطاقة ائتمان | -| `openrouter` | `openrouter` | OpenRouter | مفتاح API، مُجمِّع | [رابط](https://openrouter.ai) | نماذج مجانية بسعر $0 لكل رمز مع اللاحقة :free - 20 طلبًا في الدقيقة / 200 طلب يوميًا | -| `openvecta` | `openvecta` | OpenVecta | مفتاح API | [رابط](https://openvecta.com) | أرصدة مجانية عند التسجيل للاستدلال المتوافق مع OpenAI عبر نماذج LLM والتضمينات ونماذج الاستدلال | -| `opper` | `opper` | Opper | مفتاح API، مُجمِّع | [رابط](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | مفتاح API | [رابط](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | مفتاح API | [رابط](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | مفتاح API | [رابط](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | مفتاح API | [رابط](https://www.perplexity.ai) | استخدم مفتاح API الخاص بـ Perplexity. يوجّه OmniRoute معرّفات نماذج Agent API عبر نقطة نهاية Perplexity المتوافقة مع Responses. | -| `piapi` | `pi` | PiAPI | مفتاح API، مُجمِّع | [رابط](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | مفتاح API | [رابط](https://pioneer.ai) | أرصدة استخدام مجانية بقيمة $75 — لا تتطلب بطاقة ائتمان | -| `plamo` | `plamo` | PLaMo | مفتاح API | [رابط](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | مفتاح API، مُجمِّع | [رابط](https://creator.poe.com/api-reference) | مفتاح API من نوع Bearer لواجهة Poe API المتوافقة مع OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | مفتاح API، مُجمِّع | [رابط](https://poixe.com) | الحدود المجانية العامة الحالية صغيرة وخاصة بكل مجموعة نماذج: طلبان في الدقيقة/5 طلبات يوميًا لنماذج large-cup و20 طلبًا في الدقيقة/50 طلبًا يوميًا لنماذج small-cup. | -| `pollinations` | `pol` | Pollinations AI | مفتاح API، فيديو | [رابط](https://pollinations.ai) | يتوفر الوصول المجهول/من دون مفتاح إلى النماذج المجانية الموثقة على أساس بذل أفضل جهد. أعاد التحقق المحلي باستخدام v3.8.50 ‏(2026-07-31) الخطأ 401 عبر OmniRoute والخطأ Cloudflare 1010 في اختبارات الاتصال المباشرة بالخدمة الموردة من الشبكة نفسها. لا تزال النماذج المميزة تتطلب مفتاح Pollinations API من enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | مفتاح API | [رابط](https://poolside.ai) | يتوفر Laguna S 2.1 وXS 2.1 مجانًا خلال مرحلة المعاينة؛ ولم تُنشر حصة رقمية عامة. | -| `predibase` | `predibase` | Predibase | مفتاح API | [رابط](https://predibase.com) | ⚠️ **مهمل.** لم يعد serving.app.predibase.com قابلاً للحل (فحص 2026-06-19)؛ ويبدو أن API المُدارة لتقديم النماذج قد أُوقفت. | -| `publicai` | `publicai` | PublicAI | مفتاح API | [رابط](https://publicai.co) | يتطلب مفتاح API — رصيد لمرة واحدة عند التسجيل، ثم يصبح مدفوعًا | -| `qianfan` | `qianfan` | Baidu Qianfan | مفتاح API | [رابط](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | مفتاح API | [رابط](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | مفتاح API | [رابط](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | مفتاح API | [رابط](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | مفتاح API، صور | [رابط](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | مفتاح API | [رابط](https://regolo.ai) | احصل على مفتاح Regolo API من regolo.ai، ثم الصقه هنا كرمز Bearer. | -| `reka` | `reka` | Reka | مفتاح API | [رابط](https://docs.reka.ai/chat/overview) | استخدم مفتاح Reka API الخاص بك. يدعم OmniRoute عنوان URL الأساسي المتوافق مع OpenAI وهو https://api.reka.ai/v1، ويرسل ترويستي Authorization وX-Api-Key للتوافق. | -| `requesty` | `requesty` | Requesty | مفتاح API | [رابط](https://requesty.ai) | الفئة المجانية: نحو 200 طلب يوميًا — بوابة توجيه متعددة النماذج (أكثر من 300 نموذج) | -| `routeway` | `routeway` | Routeway | مفتاح API | [رابط](https://routeway.ai) | أنشئ مفتاح API مجانيًا على routeway.ai، ثم الصقه هنا كرمز Bearer. | -| `runwayml` | `runway` | Runway | مفتاح API، فيديو | [رابط](https://docs.dev.runwayml.com) | استخدم مفتاح Runway API الخاص بك في Authorization: Bearer . يستهدف OmniRoute واجهة Runway API الحالية على https://api.dev.runwayml.com/v1، ويرسل ترويسة X-Runway-Version المطلوبة تلقائيًا. | -| `sambanova` | `samba` | SambaNova | مفتاح API | [رابط](https://sambanova.ai) | أرصدة مجانية بقيمة $5 عند التسجيل (صالحة لمدة 30 يومًا)، ولا تُطلب بطاقة ائتمان | -| `sap` | `sap` | SAP Generative AI Hub | مفتاح API، مؤسسات | [رابط](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | استخدم رمز SAP AI Core من نوع Bearer. يمكن أن يكون عنوان URL الأساسي هو جذر AI_API_URL لديك أو deploymentUrl من Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | مفتاح API | [رابط](https://docs.sarvam.ai) | أرصدة مجانية بقيمة ₹1,000 عند التسجيل — لا تنتهي صلاحيتها مطلقًا | -| `scaleway` | `scw` | Scaleway AI | مفتاح API | [رابط](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | مليون رمز مجاني للحسابات الجديدة — متوافق مع قوانين الاتحاد الأوروبي وGDPR (باريس)، مع Qwen3 235B وLlama 70B | -| `sealion` | `sealion` | SEA-LION | مفتاح API | [رابط](https://sea-lion.ai) | سجّل الدخول إلى sea-lion.ai باستخدام Google (من دون بطاقة أو قيود إقليمية)، وأنشئ مفتاح API، ثم الصقه هنا. | -| `seekai` | `ska` | SeekAi | مفتاح API، مُجمِّع | [رابط](https://seekai.cc) | أنشئ مفتاح API على https://seekai.cc، ثم الصقه هنا كرمز Bearer. | -| `segmind` | `segmind` | Segmind | مفتاح API، صور، فيديو | [رابط](https://segmind.com) | استخدم مفتاح Segmind API الخاص بك في ترويسة x-api-key. يستهدف OmniRoute العنوان https://api.segmind.com/v1/ ويُرجع بايتات الصورة/الفيديو المُنشأة مباشرةً. | -| `sensenova` | `sensenova` | SenseNova | مفتاح API | [رابط](https://platform.sensenova.cn) | احصل على مفتاح API من platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | مفتاح API | [رابط](https://cloud.siliconflow.com) | أرصدة مجانية بقيمة $1، بالإضافة إلى نماذج $0 المدرجة حاليًا بعد التحقق من الهوية؛ قد يتغير التوفر والحدود | -| `snowflake` | `snowflake` | Snowflake Cortex | مفتاح API، مؤسسات | [رابط](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | مفتاح API | [رابط](https://xinghuo.xfyun.cn) | احصل على مفتاح API من console.xfyun.cn | -| `speka` | `speka` | Speka AI | مفتاح API، مُجمِّع | [رابط](https://speka.me) | الخطة المجانية: استخدام شهري بقيمة $1، و10 RPM، ومفتاح API واحد، وإمكانية الوصول إلى النماذج المفتوحة وبيئة التجربة؛ ولا تُطلب بطاقة. | -| `stability-ai` | `stability` | Stability AI | مفتاح API، صور | [رابط](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | مفتاح API | [رابط](https://stepfun.com) | احصل على مفتاح API من platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | مفتاح API | [رابط](https://ai.sumopod.com) | استخدم مفتاح SumoPod API الخاص بك (sk-...) في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | مفتاح API | [رابط](https://suno.ai) | الصق ملف تعريف ارتباط الجلسة من suno.ai (مصادقة Clerk) | -| `synthetic` | `synthetic` | Synthetic | مفتاح API، مُجمِّع | [رابط](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | مفتاح API، مُجمِّع | [رابط](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | مفتاح API | [رابط](https://hunyuan.tencent.com) | احصل على مفتاح API من console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | مفتاح API، مُجمِّع | [رابط](https://theb.ai) | مفتاح API من نوع Bearer لبوابة TheB.AI المتوافقة مع OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | مفتاح API | [رابط](https://docs.tinyfish.ai/fetch-api) | مفتاح X-API-Key من agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | مفتاح API، فيديو | [رابط](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | مفتاح API | [رابط](https://agent-router.gaib.ai) | استخدم مفتاح Token Kiosk API الخاص بك في Authorization: Bearer . بوابة متوافقة بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | مفتاح API، مُجمِّع | [رابط](https://www.tokenreply.com) | للنماذج الموسومة بأنها مجانية حدود يومية خاصة بكل نموذج وحملة؛ ولا توجد حصة مجانية عالمية ثابتة منشورة. | -| `tokenrouter` | `trk` | TokenRouter | مفتاح API | [رابط](https://tokenrouter.com) | استخدم مفتاح TokenRouter API الخاص بك في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | مفتاح API، صور | [رابط](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | مفتاح API | [رابط](https://docs.opentyphoon.ai) | مفتاح API مجاني بحد معدل يبلغ 5 طلبات/ثانية و200 طلب/دقيقة. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | مفتاح API | [رابط](https://uncensored.com) | استخدم مفتاح Developer API الخاص بك من uncensored.com ‏(uai_sk_live_...). يرسله OmniRoute ضمن ترويسة X-api-key إلى نقطة النهاية https://api.uncensored.com/api/v1 المتوافقة مع OpenAI. لا تنتهي صلاحية المفتاح مطلقًا. هذه هي الواجهة المقاسة/القائمة على الأرصدة؛ أما دردشة الاشتراك غير المقاسة فهي موفّر 'uc' منفصل. | -| `udio` | `udio` | Udio | مفتاح API | [رابط](https://udio.com) | الصق ملف تعريف ارتباط الجلسة من udio.com ‏(مصادقة Supabase) | -| `unorouter` | `unorouter` | UnoRouter | مفتاح API، مُجمِّع | [رابط](https://unorouter.ai) | النماذج ذات اللاحقة :free لا تخصم من الرصيد؛ والحد هو طلب واحد/دقيقة لكل نموذج مجاني لكل مستخدم. | -| `upstage` | `upstage` | Upstage | مفتاح API | [رابط](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | مفتاح API | [رابط](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | مفتاح API | [رابط](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | مفتاح API، مُجمِّع | [رابط](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | مفتاح API، مؤسسي | [رابط](https://cloud.google.com/vertex-ai) | قدّم JSON لحساب خدمة، أو رمز وصول OAuth، أو مفتاح Vertex Express API، أو مفتاح تخويل مرتبطًا بحساب خدمة. يدعم وضع Express نموذج Gemini فقط؛ وتتطلب نماذج الشركاء بيانات اعتماد محددة النطاق بالمشروع. | -| `vertex-partner` | `vp` | Vertex AI Partners | مفتاح API، مؤسسي | [رابط](https://cloud.google.com/vertex-ai) | قدّم JSON لحساب خدمة أو بيانات اعتماد OAuth. يدعم مفتاح التخويل المرتبط بحساب خدمة الاكتشاف أيضًا، لكن استدلال الشركاء يتطلب بالإضافة إلى ذلك معرّف مشروع Google Cloud الخاص به. تدعم مفاتيح Express القياسية نموذج Gemini فقط. | -| `void-ai` | `void-ai` | Void AI | مفتاح API، مُجمِّع | [رابط](https://voidai.app) | يضع دليل النماذج العام علامة على بعض النماذج تشير إلى اشتراط خطة مجانية، لكن الوصول مشروط ولم يتم تأكيد أي حصة رقمية. | -| `volcengine` | `volcengine` | Volcengine | مفتاح API | [رابط](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | مفتاح API | [رابط](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | اربط حسابك في Volcano Engine أو استخدم مفتاح API لاشتراك Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | مفتاح API | [رابط](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | اربط حسابك في Volcano Engine أو استخدم مفتاح API لاشتراك Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | مفتاح API، تضمين/إعادة ترتيب | [رابط](https://www.voyageai.com) | مفتاح Bearer API لواجهات API الخاصة بالتضمينات وإعادة الترتيب في Voyage AI. | -| `wafer` | `wafer` | Wafer AI | مفتاح API | [رابط](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | مفتاح API | [رابط](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | مفتاح API، مؤسسي | [رابط](https://www.ibm.com/products/watsonx-ai) | استخدم رمز bearer الخاص بك في watsonx. يمكن أن يكون عنوان URL الأساسي https://.ml.cloud.ibm.com/ml/gateway/v1/ أو نقطة نهاية /ml/gateway/v1 مُدارة ذاتيًا. | -| `writer` | `writer` | Writer | مفتاح API | [رابط](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | مفتاح API | [رابط](https://x5lab.dev) | استخدم مفتاح X5Lab API الخاص بك (x5-...) في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لـ API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | مفتاح API | [رابط](https://x.ai) | استخدم مفتاح xAI API رسميًا، أو سجّل الدخول باستخدام xAI OAuth. تظل جلسات Grok Build JWT موفّرًا منفصلًا. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | مفتاح API | [رابط](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | مفتاح API | [رابط](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | مفتاح API، مُجمِّع | [رابط](https://xkiro.com) | أنشئ حسابًا مجانيًا على xkiro.com والصق المفتاح هنا (Bearer؛ ويُقبل x-api-key أيضًا). | -| `yi` | `yi` | Yi (01.AI) | مفتاح API | [رابط](https://01.ai) | احصل على مفتاح API من platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | مفتاح API، مُجمِّع | [رابط](https://yolo-auto.com) | الوصول المجاني إلى API محدود بعدد الطلبات ومخصص للاختبار؛ ولا توجد حصة يومية رقمية منشورة، كما أن استمرار الوصول المجاني إلى أجل غير مسمى غير مضمون. | -| `zai` | `zai` | Z.AI | مفتاح API | [رابط](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | مفتاح API | [رابط](https://zenmux.ai) | استخدم مفتاح ZenMux API الخاص بك في Authorization: Bearer . يتوافق ZenMux بالكامل مع OpenAI. عنوان URL الأساسي: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | مفتاح API، مُجمِّع | [رابط](https://www.zerolimitai.com) | يُعلَن عن فترة تجريبية مجانية مؤقتة، لكن الصفحات الرسمية متضاربة بين 3 و7 أيام؛ ولا يُتعامل مع ادعاء 100 استدعاء/يوم على أنه دائم. | -| `zylo-api` | `zylo` | Zylo API | مفتاح API، مُجمِّع | [رابط](https://zyloai.net) | الخطة الأساسية: 10 طلبات في الدقيقة، و7,200 طلب/يوم، و200,000 رمز/يوم؛ وتقتصر على نماذج النصوص الأساسية. | +## موفّرو مفاتيح API (مدفوع / مدفوع مع أرصدة مجانية) (242) + +| المعرّف | الاسم المستعار | الاسم | الوسوم | الموقع الإلكتروني | ملاحظات | +| ------------------------ | --------------- | --------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | مفتاح API | [رابط](https://ai.360.cn) | احصل على مفتاح API من ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | مفتاح API، مجمّع | [رابط](https://agentrouter.org) | رصيد مجاني بقيمة $200 عند التسجيل — بوابة توجيه متعددة النماذج | +| `agnes` | `agnes` | Agnes AI | مفتاح API، فيديو | [رابط](https://agnes-ai.com) | احصل على مفتاح API من agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (الصين) | مفتاح API | [رابط](https://api.agnes-ai.cn) | احصل على مفتاح API من موقع Agnes CN. | +| `ai21` | `ai21` | AI21 Labs | مفتاح API | [رابط](https://www.ai21.com) | رصيد تجريبي بقيمة $10 عند التسجيل (صالح لمدة 3 أشهر)، ولا يلزم استخدام بطاقة ائتمان | +| `aimlapi` | `aiml` | AI/ML API | مفتاح API، مجمّع | [رابط](https://aimlapi.com) | أُوقفت الخطة المجانية مؤقتًا (2026) — أصبحت AI/ML API الآن بنظام الدفع حسب الاستخدام فقط (الحد الأدنى لإعادة الشحن $20)؛ ولا توجد أرصدة مجانية متكررة. | +| `ainative` | `ainative` | AINative Studio | مفتاح API | [رابط](https://ainative.studio) | أنشئ مفتاح API مجانيًا على ainative.studio (من دون بطاقة)، ثم الصقه هنا كرمز Bearer. | +| `aion` | `aion` | Aion Labs | مفتاح API | [رابط](https://www.aionlabs.ai) | أنشئ مفتاح API مجانيًا على aionlabs.ai (من دون بطاقة)، ثم الصقه هنا كرمز Bearer. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | مفتاح API | [رابط](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (الصين) | مفتاح API | [رابط](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | مفتاح API | [رابط](https://developer.ant-ling.com/en/docs/) | سجّل وأنشئ مفتاح API في وحدة تحكم Ant Ling API ‏(https://chat.ant-ling.com/open)، ثم الصقه هنا. يوجّه OmniRoute حركة محادثات الدردشة إلى https://api.ant-ling.com/v1/chat/completions؛ ويتوافق المزوّد مع OpenAI ويوفر أيضًا واجهة متوافقة مع Anthropic. | +| `anthropic` | `anthropic` | Anthropic | مفتاح API | [رابط](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | مفتاح API، مجمّع | [رابط](https://anyapi.ai) | الخطة المجانية: 100,000 من رموز ANY يوميًا و100 RPM للنماذج المجانية/الأساسية المؤهلة؛ ولا يلزم استخدام بطاقة ائتمان. | +| `api-airforce` | `af` | Api.airforce | مفتاح API | [رابط](https://api.airforce) | 55 نموذجًا ضمن الخطة المجانية، بما في ذلك Grok-3 وClaude 3.7 وQwen3 وKimi-K2 وGemini 2.5 Flash وDeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | مفتاح API | [رابط](https://arcee.ai) | احصل على مفتاح API من arcee.ai | +| `auriko` | `auriko` | Auriko | مفتاح API، مجمّع | [رابط](https://www.auriko.ai) | توفر الخطة المجانية 1,000 RPM للمنصة و10,000 RPM لـ BYOK. لا يزال الاستدلال عبر المنصة يتحمل تكلفة المزوّد؛ فهذه ليست حصة مجانية من الرموز ولا استدلالًا مجانيًا غير محدود. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | مفتاح API، مؤسسي | [رابط](https://learn.microsoft.com/azure/ai-foundry) | استخدم مفتاح Azure AI Foundry الخاص بك. يمكن أن يكون عنوان URL الأساسي هو https://.services.ai.azure.com/openai/v1/ أو https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | مفتاح API، مؤسسي | [رابط](https://azure.microsoft.com/products/ai-services/openai-service) | استخدم مفتاح Azure OpenAI API الخاص بك. يجب أن يكون عنوان URL الأساسي هو نقطة نهاية المورد، مثل https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | مفتاح API | [رابط](https://b.ai) | مفتاح Bearer API لبوابة LLM الخاصة بـ b.ai والمتوافقة مع OpenAI (وهي مختلفة عن TheB.AI). أنشئ مفتاحًا على https://docs.b.ai، ثم استخدم https://api.b.ai/v1 كعنوان URL أساسي متوافق مع OpenAI. | +| `baichuan` | `baichuan` | Baichuan | مفتاح API | [رابط](https://www.baichuan-ai.com/) | احصل على مفتاح API من platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | مفتاح API | [رابط](https://ernie.baidu.com/) | احصل على مفتاح API من console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | مفتاح API | [رابط](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | مفتاح API | [رابط](https://baseten.co) | رصيد تجريبي مجاني بقيمة $30 للاستدلال باستخدام GPU | +| `bazaarlink` | `bzl` | BazaarLink | مفتاح API | [رابط](https://bazaarlink.ai) | استخدم مفتاح BazaarLink API الخاص بك (يبدأ بـ sk-bl-) في Authorization: Bearer . تعمل حزمة OpenAI SDK مع عنوان URL الأساسي https://bazaarlink.ai/api/v1. تستخدم النماذج التنسيق provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | مفتاح API، مؤسسي | [رابط](https://aws.amazon.com/bedrock) | استخدم مفتاح Amazon Bedrock API الخاص بك واضبط منطقة AWS التي فُعّلت فيها نماذجك (مثل eu-west-2). يستدعي OmniRoute واجهة Converse API الأصلية الخاصة بـ Bedrock مباشرةً. | +| `black-forest-labs` | `bfl` | Black Forest Labs | مفتاح API، صور | [رابط](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | مفتاح API | [رابط](https://blackbox.ai) | ⚠️ **مهمل.** يعيد api.blackbox.ai استجابة HTTP 404 لكل صيغة من صيغ المسار (فحص بتاريخ 2026-08-21)؛ وقد نُقلت واجهة الاستدلال العامة إلى نقطة النهاية المقيّدة enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | مفتاح API | [رابط](https://www.bluesminds.com) | أرصدة pi يومية مجانية — يدعم أكثر من 200 نموذج، بما في ذلك GPT-4o وGPT-4.1 وClaude Sonnet 4.5 وGemini 2.0 Flash وDeepSeek V4 وQwen وKimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | مفتاح API | [رابط](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | مفتاح API | [رابط](https://bytez.com) | رصيد مجاني بقيمة $1، يُجدّد كل 4 أسابيع | +| `cerebras` | `cerebras` | Cerebras | مفتاح API | [رابط](https://inference.cerebras.ai) | رصيد تسجيل لمرة واحدة بقيمة $5 (صالح لمدة 30 يومًا)؛ ويلزم توفير وسيلة دفع. هذه ليست خطة مجانية متكررة. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | مفتاح API | [رابط](https://hyper.charm.land) | 100 من أرصدة Hypercredits الشهرية المجانية عند التسجيل | +| `chat-oripe` | `chat-oripe` | Chat Oripe | مفتاح API، مجمّع | [رابط](https://api.oriper.com) | تعلن البيانات الوصفية الرسمية عن مليوني رمز شهريًا، لكن الموقع العام والوثائق كانا محجوبين أثناء التدقيق؛ لذا اعتبر الحصة وربط العلامة التجارية غير مؤكدين. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | مفتاح API، مُجمِّع | [رابط](https://chatanywhere.tech) | للاستخدام الشخصي أو التعليمي أو البحثي فقط: تشير الوثائق العامة إلى 10,000 نقطة/يوم و200 طلب/يوم لكل عنوان IP/مفتاح؛ لا تستخدمه لحركة البيانات التجارية. | +| `cheaperinference` | `cinf` | Cheaper Inference | مفتاح API | [رابط](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | مفتاح API | [رابط](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | مفتاح API، مُجمِّع | [رابط](https://chutes.ai) | مفتاح API من نوع Bearer لبوابة Chutes المتوافقة مع OpenAI. | +| `clarifai` | `clarifai` | Clarifai | مفتاح API، مؤسسات | [رابط](https://docs.clarifai.com) | استخدم PAT الخاص بك من Clarifai أو مفتاح API خاصًا بالتطبيق. يستهدف OmniRoute نقطة النهاية المتوافقة مع OpenAI على https://api.clarifai.com/v2/ext/openai/v1 ويُجري المصادقة باستخدام Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | مفتاح API، مُجمِّع | [رابط](https://cloudcode.one) | تشمل النماذج المجانية المنشورة glm-4.7-flash وglm-4.6v-flash؛ لا توجد حصة رقمية منشورة، وقد يتطلب إنشاء المفتاح رصيدًا أو قسيمة. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | مفتاح API | [رابط](https://developers.cloudflare.com/workers-ai) | يتطلب رمز API ومعرّف الحساب معًا (يمكن العثور عليه في dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | مفتاح API | [رابط](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | مفتاح API | [رابط](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | مفتاح API | [رابط](https://cohere.com) | تجربة مجانية: 1,000 استدعاء API شهريًا للاختبار، دون الحاجة إلى بطاقة ائتمان | +| `command-code` | `cmd` | Command Code | مفتاح API | [رابط](https://commandcode.ai/) | استخدم مفتاح API من Command Code. تُرسل الطلبات إلى نقطة النهاية /provider/v1/chat/completions الخاصة بـ Command Code. | +| `coze` | `coze` | Coze | مفتاح API | [رابط](https://coze.com) | احصل على مفتاح API من coze.com/open/api | +| `crof` | `crof` | CrofAI | مفتاح API | [رابط](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | مفتاح API | [رابط](https://cursor.com/dashboard/api) | الصق مفتاح API لمستخدم Cursor ‏(crsr_...) من cursor.com/dashboard/api. يستبدله OmniRoute برمز جلسة عند الطلب؛ ولا يلزم تثبيت IDE أو cursor-agent. تُحتسب تكلفة الاستخدام على خطة Cursor المالكة للمفتاح. | +| `dahl` | `dahl` | Dahl | مفتاح API | [رابط](https://inference.dahl.global) | انقر فوق 'إضافة حساب' لإنشاء رمز تلقائيًا، أو أضف مفتاح API يدويًا. | +| `databricks` | `databricks` | Databricks | مفتاح API، مؤسسات | [رابط](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | مفتاح API، مؤسسات | [رابط](https://docs.datarobot.com) | استخدم رمز API الخاص بك من DataRobot. يمكن أن يكون عنوان URL الأساسي الاختياري جذر الحساب (لـ LLM Gateway) أو عنوان URL لعملية نشر ضمن /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | مفتاح API، صور | [رابط](https://deepai.org) | استخدم مفتاح API الخاص بك من DeepAI. احصل عليه من deepai.org — يتطلب اشتراك Pro ‏($9.99/شهريًا). | +| `deepinfra` | `deepinfra` | DeepInfra | مفتاح API | [رابط](https://deepinfra.com) | أرصدة مجانية عند التسجيل لاختبار API واستكشاف النماذج | +| `deepseek` | `ds` | DeepSeek | مفتاح API | [رابط](https://platform.deepseek.com) | 5M رمز مجاني عند التسجيل - دون الحاجة إلى بطاقة ائتمان | +| `dgrid` | `dgrid` | DGrid | مفتاح API | [رابط](https://dgrid.ai) | موجّه النماذج المجانية من DGrid: ‏10 طلبات/دقيقة و100 طلب/يوم. تتيح إضافة رصيد بقيمة $5 مرة واحدة ما يصل إلى 20 طلبًا/دقيقة و1,000 طلب/يوم. | +| `dify` | `dify` | Dify | مفتاح API | [رابط](https://dify.ai) | احصل على مفتاح API من مثيل Dify الخاص بك. | +| `digitalocean` | `digitalocean` | DigitalOcean | مفتاح API | [رابط](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | مفتاح API | [رابط](https://dit.ai) | استخدم مفتاح API الخاص بك من dit.ai في Authorization: Bearer . متوافق بالكامل مع OpenAI ويعمل كبديل مباشر — ما عليك سوى تغيير عنوان URL الأساسي إلى https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | مفتاح API | [رابط](https://doubao.com) | احصل على مفتاح API من console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | مفتاح API، مُجمِّع | [رابط](https://www.dxnt.com) | تشير الوثائق إلى أن الحسابات المجانية تحصل على 100 استدعاء/يوم؛ وقد تزيد الحصة من خلال الدعوات ويمكن أن تختلف حسب الحساب. | +| `electronhub` | `electronhub` | Electron Hub | مفتاح API، مُجمِّع | [رابط](https://www.electronhub.ai) | الخطة المجانية: 5 RPM، وأرصدة أسبوعية بقيمة $0.25، و10 Neutrinos/يوم للنماذج ذات اللاحقة :free؛ كما تنطبق ميزانيات العائلة. | +| `empower` | `empower` | Empower | مفتاح API، مُجمِّع | [رابط](https://docs.empower.dev) | مفتاح API من نوع Bearer لنقطة نهاية Empower المتوافقة مع OpenAI. | +| `eurouter` | `eurouter` | EURouter | مفتاح API، مُجمِّع | [رابط](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | مفتاح API | [رابط](https://factory.ai) | مفتاح API من نوع Bearer لبوابة Factory المتوافقة مع OpenAI. | +| `fal-ai` | `fal` | Fal.ai | مفتاح API، صور | [رابط](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | مفتاح API، مُجمِّع | [رابط](https://fastrouter.ai) | تتيح النماذج ذات اللاحقة :free عدد 10 طلبات/يوم لكل مؤسسة ونموذج؛ وقد يتغير التوفر. | +| `featherless-ai` | `featherless` | Featherless AI | مفتاح API | [رابط](https://featherless.ai) | تتوفر فئة مجانية — دون الحاجة إلى بطاقة ائتمان | +| `fenayai` | `fenayai` | FenayAI | مفتاح API، مُجمِّع | [رابط](https://fenayai.com) | مفتاح API من نوع Bearer لبوابة FenayAI المتوافقة مع OpenAI. | +| `fireworks` | `fireworks` | Fireworks AI | مفتاح API | [رابط](https://fireworks.ai) | أرصدة بدء مجانية بقيمة $1 عند التسجيل لاختبار API | +| `free-ai` | `free-ai` | Free.ai | مفتاح API، مُجمِّع | [رابط](https://free.ai) | تغطي 30,000 رمز/يوم النماذج ذاتية الاستضافة بعد التحقق من البريد الإلكتروني. قد تُحتسب تكلفة الاستخدام الذي يتجاوز الحصة بالسعر الفعلي، كما أن النماذج الخارجية المتميزة مدفوعة. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | مفتاح API | [رابط](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | مفتاح API | [رابط](https://freebuff.com) | أدخل رمز مصادقة Freebuff / Codebuff (يُحصل عليه عبر تسجيل الدخول من خلال CLI أو أداة جمع آلية). | +| `freeinference` | `freeinference` | FreeInference | مفتاح API، مُجمِّع | [رابط](https://freeinference.org) | وصول مجاني للأبحاث دون بطاقة؛ يتطلب المتقدمون من خارج Harvard موافقة يدوية، ولا توجد حصة رقمية مضمونة ومعلنة للعامة. | +| `freemodel-dev` | `fmd` | FreeModel.dev | مفتاح API | [رابط](https://freemodel.dev) | رصيد مجاني بقيمة $300 عند التسجيل — دون الحاجة إلى بطاقة ائتمان. يمكنك الوصول إلى GPT-5.4 وGPT-5.5 (أحدث نماذج OpenAI الرائدة) من خلال API متوافق مع OpenAI. | +| `freetheai` | `fta` | FreeTheAi | مفتاح API، مُجمِّع | [رابط](https://freetheai.xyz) | انضم إلى خادم FreeTheAi على Discord للحصول على مفتاح API المجاني الخاص بك. | +| `friendliai` | `friendli` | FriendliAI | مفتاح API | [رابط](https://friendli.ai) | فئة مجانية للاستدلال دون خادم — لا تتطلب بطاقة ائتمان | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | اجمع أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | اجمع أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | اجمع أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | اجمع أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | مفتاح API، مُجمِّع | [رابط](https://g4f.space) | اجمع أرصدة cake مجهولة الهوية على g4f.dev/chat، أو استخدم مفتاح عضو في g4f.dev (أنشئ واحدًا على g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | مفتاح API | [رابط](https://galadriel.com) | ⚠️ **مهمل.** لم يعد api.galadriel.ai قابلاً للوصول (فحص 2026-06-19)؛ ويبدو أن API الاستدلال قد أُوقف. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | مفتاح API | [رابط](https://aistudio.google.com) | تتوفر فئة مجانية من خلال Google AI Studio؛ وتُطبق الحصص الحالية الخاصة بكل نموذج والقيود الإقليمية | +| `getgoapi` | `ggo` | GoAPI | مفتاح API، مُجمِّع | [رابط](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | مفتاح API | [رابط](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | مفتاح API | [رابط](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | رمز وصول شخصي إلى GitLab لاستخدام API العام لاقتراحات التعليمات البرمجية. اضبط عنوان URL أساسيًا مستضافًا ذاتيًا عند عدم استخدام gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | مفتاح API | [رابط](https://opengateway.gitlawb.com) | أُلغي الوصول المجاني إلى MiMo (xiaomi/mimo-v2.5) في 2026-05 — أصبحت Opengateway الآن بوابة أرصدة بنظام الدفع حسب الاستخدام؛ ولا يوجد نموذج مجاني متجدد. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | مفتاح API | [رابط](https://opengateway.gitlawb.com) | انتهى عرض Nemotron المجاني في 2026-06 — وأصبح مسار GMI Cloud الآن متاحًا فقط بأرصدة تُحاسب بنظام الدفع حسب الاستخدام. | +| `glm` | `glm` | GLM Coding | مفتاح API | [رابط](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (الصين) | مفتاح API | [رابط](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | مفتاح API | [رابط](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | مفتاح API | [رابط](https://greenpt.com) | يمكن إنشاء اشتراك API مجانًا؛ وتُحتسب رسوم الاستدلال لكل رمز. لا توجد حصة مجانية معلنة للاستدلال. | +| `groq` | `groq` | Groq | مفتاح API | [رابط](https://groq.com) | الخطة المجانية: حدود قصوى لكل نموذج (200K رمز/يوم لكل نموذج محادثة؛ راجع console.groq.com/docs/rate-limits لمعرفة RPM/RPD) — دون وسيلة دفع مسجلة. | +| `haiper` | `hp` | Haiper | مفتاح API، فيديو | [رابط](https://haiper.ai) | احصل على مفتاح API من haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | مفتاح API | [رابط](https://api.hcnsec.cn) | احصل على مفتاح API من api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | مفتاح API، مُجمِّع | [رابط](https://helixmind.online) | لم تُؤكد أثناء تدقيق 2026-08-02 الادعاءات المتداولة سابقًا بشأن 3 RPM/50 RPD وعدم الحاجة إلى بطاقة؛ وتتطلب الحصة والفوترة الحاليتان التحقق من الحساب. | +| `helyxai` | `helyxai` | Helyx AI | مفتاح API، مُجمِّع | [رابط](https://helyxai.space) | توثّق الخطة المجانية التشغيلية حصة قدرها 100,000 رمز/يوم؛ ويتعارض معها الادعاء التسويقي المنفصل للموقع بشأن 2M+، ولذلك لا يُعامل بوصفه ضمانًا للحصة. | +| `heroku` | `heroku` | Heroku AI | مفتاح API، للمؤسسات | [رابط](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | مفتاح API | [رابط](https://huggingface.co) | API مجاني للاستدلال لآلاف النماذج (Whisper وVITS وSDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | مفتاح API | [رابط](https://hyperbolic.xyz) | أرصدة تجريبية بقيمة $1-5 عند التسجيل للاستدلال دون خادم | +| `ideogram` | `ideo` | Ideogram | مفتاح API | [رابط](https://ideogram.ai) | احصل على مفتاح API من ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | مفتاح API | [رابط](https://xinghuo.xfyun.cn) | احصل على مفتاح API من console.xfyun.cn | +| `inception` | `inception` | Inception | مفتاح API | [رابط](https://docs.inceptionlabs.ai) | 10M رمز مجاني عند التسجيل، دون الحاجة إلى بطاقة ائتمان. | +| `inference-net` | `inet` | Inference.net | مفتاح API | [رابط](https://inference.net) | أرصدة مجانية بقيمة $25 عند التسجيل، بالإضافة إلى منح بحثية متاحة | +| `internlm` | `internlm` | InternLM (Intern-S1) | مفتاح API | [رابط](https://internlm.intern-ai.org.cn/) | حصة شهرية مجانية تبلغ نحو 1M من رموز الإدخال / 3M من رموز الإخراج (نحو 10 RPM) | +| `jina-ai` | `jina` | Jina AI (واجهة Foundation API) | مفتاح API، تضمين/إعادة ترتيب | [رابط](https://jina.ai) | مفتاح Bearer API لـ api.jina.ai — للتضمينات وإعادة الترتيب والتصنيف والتقسيم والبحث. تكون لمفاتيح لوحة التحكم الأولوية على JINA_AI_API_KEY. هذه ليست بطاقة Reader / r.jina.ai ولا تجلب عناوين URL. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | مفتاح API | [رابط](https://jina.ai/reader) | مفتاح Bearer API لخدمة تحويل عناوين URL إلى Markdown عبر r.jina.ai (المسار /v1/web/fetch فقط). لا يوفّر /v1/embeddings أو /v1/rerank. يعمل رمز Jina نفسه المستخدم مع Foundation API؛ ويعيد OmniRoute استخدام مفتاح jina-ai من لوحة التحكم أو JINA_AI_API_KEY عندما تكون هذه البطاقة فارغة. | +| `kenari` | `kenari` | Kenari | مفتاح API | [رابط](https://kenari.id) | استخدم مفتاح Kenari API الخاص بك (kn-...) في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | مفتاح API | [رابط](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | مفتاح API، مجمّع | [رابط](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (واجهة Moonshot API القديمة) | مفتاح API | [رابط](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | مفتاح API | [رابط](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | مفتاح API | [رابط](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | مفتاح API، مجمّع | [رابط](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | مفتاح API، فيديو | [رابط](https://leonardo.ai) | احصل على مفتاح API من leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | مفتاح API | [رابط](https://liquid.ai) | احصل على مفتاح API من liquid.ai | +| `literouter` | `literouter` | LiteRouter | مفتاح API، مجمّع | [رابط](https://literouter.com) | تستخدم إصدارات النماذج المجانية اللاحقة :free؛ وتختلف حدود الرصيد اليومية حسب النموذج، كما يقتصر الإدخال المجاني على 5,000 رمز. | +| `llamagate` | `llamagate` | LlamaGate | مفتاح API | [رابط](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | مفتاح API، مجمّع | [رابط](https://llm.kiwi) | تتيح الخطة المجانية auto وhrLLM؛ وينطبق الحد المنشور البالغ 40 طلبًا/ساعة على hrLLM. | +| `llm7` | `llm7` | LLM7.io | مفتاح API | [رابط](https://llm7.io) | استخدم أي مفتاح غير فارغ (مثل 'unused'). إذا أعادت النماذج المضمنة القديمة model_unavailable، فاستخدم Available Models → Import from /models أو Auto-Sync؛ النموذج المباشر الذي تم التحقق منه: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | مفتاح API، مجمّع | [رابط](https://llmgateway.io) | خطة Hosted Free: تقتصر النماذج المجانية على 5 طلبات كل 10 دقائق عندما لا يحتوي الحساب على أرصدة. | +| `logfare` | `logfare` | Logfare | مفتاح API، مجمّع | [رابط](https://logfare.ai) | أنشئ حسابًا مجانيًا على https://logfare.ai/register (اسم مستخدم/كلمة مرور، دون التحقق من البريد الإلكتروني) للحصول فورًا على مفتاح API، ثم الصقه هنا بصفته رمز Bearer. | +| `longcat` | `lc` | LongCat AI | مفتاح API | [رابط](https://longcat.chat/platform/docs) | مجانًا: منحة لمرة واحدة قدرها 10M رمز بعد تسجيل الحساب والتحقق من KYC (LongCat-2.0). لمرة واحدة فقط — وليست حصة يومية/شهرية متكررة. | +| `magnific` | `freepik` | Magnific | مفتاح API، صور | [رابط](https://www.magnific.com) | احصل على مفتاح API من magnific.com/user/api-keys (الترويسة x-magnific-api-key). لا تزال مفاتيح مطوري Freepik القديمة تعمل. | +| `maritalk` | `maritalk` | Maritalk | مفتاح API | [رابط](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | مفتاح API، مجمّع | [رابط](https://meganova.ai) | تسجيل مجاني دون بطاقة. يبلغ إجمالي الحصص المنشورة لكل نموذج في Tier 1 عدد 550 طلبًا/يوم؛ وهي ليست مجموعة عامة مشتركة، وقد تُطبّق رسوم تجاوز مدفوعة إذا كانت مفعّلة. | +| `meta-llama` | `meta` | Meta Llama API | مفتاح API | [رابط](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | مفتاح API، فيديو | [رابط](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (الصين) | مفتاح API | [رابط](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | مفتاح API | [رابط](https://mistral.ai) | فئة Experiment المجانية: وصول محدود المعدل إلى جميع النماذج، دون الحاجة إلى بطاقة ائتمان | +| `mixedbread` | `mxbai` | Mixedbread AI | مفتاح API | [رابط](https://www.mixedbread.com) | مفتاح Bearer API لواجهة تضمينات Mixedbread API. | +| `mixlayer` | `mixlayer` | Mixlayer | مفتاح API، مجمّع | [رابط](https://www.mixlayer.com) | النموذج qwen/qwen3.5-4b-free مجاني لإنشاء النماذج الأولية ومحدود المعدل؛ ولم يتم تأكيد حد RPM عام ثابت أو حصة يومية. | +| `mnn-ai` | `mnn-ai` | MNN AI | مفتاح API، مجمّع | [رابط](https://mnnai.ru) | الخطة المجانية: أرصدة شهرية بقيمة $1، و10 RPM، والوصول فقط إلى النماذج المعلّمة بأنها Free. | +| `modal` | `mdl` | Modal | مفتاح API، مؤسسات | [رابط](https://modal.com/docs) | استخدم رمز Bearer الذي يحمي نشر Modal الخاص بك، إذا كان مفعّلًا. يجب أن يشير عنوان URL الأساسي إلى تطبيق Modal المتوافق مع OpenAI، مثل https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | مفتاح API | [رابط](https://modelscope.cn) | فئة مجانية عبر ModelScope API-Inference — يلزم حساب Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | مفتاح API | [رابط](https://monsterapi.ai) | ⚠️ **مهمل.** أوقفت Monster API عملياتها في 2026-06-30. استخدم موفّرين بديلين متوافقين مع OpenAI. | +| `moonshot` | `moonshot` | Kimi | مفتاح API | [رابط](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | مفتاح API | [رابط](https://morphllm.com) | الفئة المجانية: 250K رصيد/شهر، $0 | +| `muse-code` | `mc` | Muse Code (Meta) | مفتاح API | [رابط](https://github.com/meta-llama/llama-stack) | استخدم متغير البيئة META_API_KEY الخاص بك كرمز Bearer. تستخدم Muse Code CLI تنسيق الاتصال لواجهة OpenAI Responses API ‏(POST /responses). | +| `naga-ac` | `naga` | Naga.ac | مفتاح API، مجمّع | [رابط](https://naga.ac) | احصل على مفتاح API من naga.ac — يتوفر التسجيل عبر Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | مفتاح API، مُجمِّع | [رابط](https://naga.ac) | النماذج الموسومة بـ :free مُدرجة علنًا، ولكن لم تُؤكَّد أي حصة رقمية. تحذّر سياسة Naga من أن مطالبات ومخرجات المستوى المجاني قد تُجمع أو تُستخدم للتدريب. | +| `nanogpt` | `nanogpt` | NanoGPT | مفتاح API | [رابط](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | مفتاح API | [رابط](https://bynara.id) | أنشئ حساب NaraRouter مجانيًا، واربط حسابك على Telegram (مطلوب قبل إجابات /v1)، ثم الصق المفتاح هنا بصفته رمز Bearer. | +| `navy` | `navy` | NavyAI | مفتاح API | [رابط](https://api.navy) | أنشئ مفتاح API مجانيًا من لوحة معلومات NavyAI، ثم الصقه هنا بصفته رمز Bearer. | +| `nebius` | `nebius` | Nebius AI | مفتاح API | [رابط](https://nebius.com) | أرصدة تجريبية بقيمة نحو $1 عند التسجيل لاختبار API | +| `nlpcloud` | `nlpc` | NLP Cloud | مفتاح API | [رابط](https://docs.nlpcloud.com) | استخدم مفتاح API الخاص بـ NLP Cloud في Authorization: Token . يستهدف OmniRoute افتراضيًا نقطة نهاية روبوت الدردشة على https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | مفتاح API | [رابط](https://nomic.ai) | احصل على مفتاح API من atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | مفتاح API | [رابط](https://portal.nousresearch.com/help) | استخدم مفتاح API الخاص بـ Nous Portal. يستهدف OmniRoute نقطة نهاية الاستدلال الرسمية المتوافقة مع OpenAI على https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | مفتاح API، فيديو، مُجمِّع | [رابط](https://novita.ai) | أرصدة تجريبية بقيمة $0.50 عند التسجيل (صالحة لنحو عام واحد) | +| `nscale` | `nscale` | nScale | مفتاح API | [رابط](https://nscale.com) | أرصدة مجانية بقيمة $5 عند التسجيل لاختبار الاستدلال | +| `nube` | `nube` | Nube.sh | مفتاح API | [رابط](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | مفتاح API | [رابط](https://build.nvidia.com) | وصول مجاني للمطورين: نحو 40 RPM، وأكثر من 70 نموذجًا (Kimi K2.5، وGLM 4.7، وDeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | مفتاح API، مؤسسي | [رابط](https://www.oracle.com/artificial-intelligence/generative-ai) | استخدم مفتاح API الخاص بـ OCI Generative AI أو رمز IAM bearer. يمكن أن يكون عنوان URL الأساسي https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | مفتاح API، مُجمِّع | [رابط](https://ofox.ai) | يعلن الكتالوج الحالي عن أكثر من 10 نماذج مجانية دون حصة رقمية منشورة؛ راجع مصدر المنبع وشروط الاحتفاظ والتدريب قبل الاستخدام في بيئة الإنتاج. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | مفتاح API | [رابط](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | مفتاح API | [رابط](https://1min.ai) | أنشئ مفتاح API على https://docs.1min.ai/docs/api/create-api-key، ثم الصقه هنا. | +| `openadapter` | `oad` | OpenAdapter | مفتاح API | [رابط](https://openadapter.dev) | استخدم مفتاح API الخاص بـ OpenAdapter في Authorization: Bearer sk-cv-. متوافق بالكامل مع OpenAI. عنوان URL الأساسي لـ API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | مفتاح API | [رابط](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | مفتاح API | [رابط](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | مفتاح API | [رابط](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | مفتاح API | [رابط](https://openference.com) | المستوى المجاني: يشمل Qwen3.8 27b وLlama 3.2 3B — راجع openference.com/pricing للاطلاع على الشروط الحالية | +| `openrouter` | `openrouter` | OpenRouter | مفتاح API، مُجمِّع | [رابط](https://openrouter.ai) | نماذج مجانية بسعر $0/token مع اللاحقة :free -‏ 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | مفتاح API | [رابط](https://openvecta.com) | أرصدة مجانية عند التسجيل للاستدلال المتوافق مع OpenAI عبر نماذج LLM والتضمينات ونماذج الاستدلال | +| `opper` | `opper` | Opper | مفتاح API، مُجمِّع | [رابط](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | مفتاح API | [رابط](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | مفتاح API | [رابط](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | مفتاح API | [رابط](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | مفتاح API | [رابط](https://www.perplexity.ai) | استخدم مفتاح API الخاص بـ Perplexity. يوجّه OmniRoute معرّفات نماذج Agent API عبر نقطة نهاية Perplexity المتوافقة مع Responses. | +| `piapi` | `pi` | PiAPI | مفتاح API، مُجمِّع | [رابط](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | مفتاح API | [رابط](https://pioneer.ai) | أرصدة استخدام مجانية بقيمة $75 — لا يلزم استخدام بطاقة ائتمانية | +| `plamo` | `plamo` | PLaMo | مفتاح API | [رابط](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | مفتاح API، مُجمِّع | [رابط](https://creator.poe.com/api-reference) | مفتاح Bearer API لواجهة Poe API المتوافقة مع OpenAI. | +| `poixe-ai` | `poixe-ai` | Poixe AI | مفتاح API، مُجمِّع | [رابط](https://poixe.com) | الحدود المجانية العامة الحالية صغيرة ومحددة بحسب مجموعة النماذج: 2 RPM/5 RPD لنماذج large-cup و20 RPM/50 RPD لنماذج small-cup. | +| `pollinations` | `pol` | Pollinations AI | مفتاح API، فيديو | [رابط](https://pollinations.ai) | الوصول المجهول/من دون مفتاح إلى النماذج المجانية الموثقة متاح على أساس أفضل جهد. أعاد التحقق المحلي للإصدار v3.8.50 ‏(2026-07-31) الخطأ 401 عبر OmniRoute والخطأ Cloudflare 1010 عند إجراء اختبارات مباشرة للمنبع من الشبكة نفسها. لا تزال النماذج المتميزة تتطلب مفتاح Pollinations API من enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | مفتاح API | [رابط](https://poolside.ai) | يتوفر Laguna S 2.1 وXS 2.1 مجانًا خلال مرحلة Preview؛ ولم تُنشر أي حصة رقمية عامة. | +| `predibase` | `predibase` | Predibase | مفتاح API | [رابط](https://predibase.com) | ⚠️ **مُهمَل.** لم يعد serving.app.predibase.com قابلاً للتحليل (فحص 2026-06-19)؛ ويبدو أن API المُدارة لتقديم النماذج قد أُوقفت. | +| `publicai` | `publicai` | PublicAI | مفتاح API | [رابط](https://publicai.co) | يتطلب مفتاح API — رصيد تسجيل لمرة واحدة، ثم يصبح مدفوعًا | +| `qianfan` | `qianfan` | Baidu Qianfan | مفتاح API | [رابط](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | مفتاح API | [رابط](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | مفتاح API | [رابط](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | مفتاح API | [رابط](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | مفتاح API، صور | [رابط](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | مفتاح API | [رابط](https://regolo.ai) | احصل على مفتاح API الخاص بك من Regolo عبر regolo.ai، ثم الصقه هنا بوصفه رمز Bearer. | +| `reka` | `reka` | Reka | مفتاح API | [رابط](https://docs.reka.ai/chat/overview) | استخدم مفتاح API الخاص بك من Reka. يدعم OmniRoute عنوان URL الأساسي المتوافق مع OpenAI‏ https://api.reka.ai/v1 ويرسل ترويستي Authorization وX-Api-Key كلتيهما لضمان التوافق. | +| `requesty` | `requesty` | Requesty | مفتاح API | [رابط](https://requesty.ai) | الفئة المجانية: نحو 200 طلب يوميًا — بوابة توجيه متعددة النماذج (أكثر من 300 نموذج) | +| `routeway` | `routeway` | Routeway | مفتاح API | [رابط](https://routeway.ai) | أنشئ مفتاح API مجانيًا على routeway.ai، ثم الصقه هنا بوصفه رمز Bearer. | +| `runwayml` | `runway` | Runway | مفتاح API، فيديو | [رابط](https://docs.dev.runwayml.com) | استخدم مفتاح API الخاص بك من Runway في Authorization: Bearer . يستهدف OmniRoute واجهة API الحالية لـ Runway على https://api.dev.runwayml.com/v1 ويرسل ترويسة X-Runway-Version المطلوبة تلقائيًا. | +| `sambanova` | `samba` | SambaNova | مفتاح API | [رابط](https://sambanova.ai) | رصيد مجاني بقيمة $5 عند التسجيل (صالح لمدة 30 يومًا)، ولا يلزم إدخال بطاقة ائتمان | +| `sap` | `sap` | SAP Generative AI Hub | مفتاح API، مؤسسات | [رابط](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | استخدم رمز Bearer الخاص بك من SAP AI Core. يمكن أن يكون عنوان URL الأساسي هو جذر AI_API_URL الخاص بك أو deploymentUrl من Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | مفتاح API | [رابط](https://docs.sarvam.ai) | رصيد مجاني بقيمة ₹1,000 عند التسجيل — لا تنتهي صلاحيته أبدًا | +| `scaleway` | `scw` | Scaleway AI | مفتاح API | [رابط](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | مليون رمز مجاني للحسابات الجديدة — متوافق مع لوائح الاتحاد الأوروبي/GDPR (باريس)، مع Qwen3 235B وLlama 70B | +| `sealion` | `sealion` | SEA-LION | مفتاح API | [رابط](https://sea-lion.ai) | سجّل الدخول إلى sea-lion.ai باستخدام Google (من دون بطاقة أو قيود إقليمية)، وأنشئ مفتاح API، ثم الصقه هنا. | +| `seekai` | `ska` | SeekAi | مفتاح API، مجمّع | [رابط](https://seekai.cc) | أنشئ مفتاح API على https://seekai.cc، ثم الصقه هنا بوصفه رمز Bearer. | +| `segmind` | `segmind` | Segmind | مفتاح API، صور، فيديو | [رابط](https://segmind.com) | استخدم مفتاح API الخاص بك من Segmind في ترويسة x-api-key. يستهدف OmniRoute العنوان https://api.segmind.com/v1/ ويعيد بايتات الصورة/الفيديو المُنشأة مباشرةً. | +| `sensenova` | `sensenova` | SenseNova | مفتاح API | [رابط](https://platform.sensenova.cn) | احصل على مفتاح API من platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | مفتاح API | [رابط](https://cloud.siliconflow.com) | رصيد مجاني بقيمة $1، بالإضافة إلى النماذج المدرجة حاليًا بسعر $0 بعد التحقق من الهوية؛ قد يتغير التوفر والحدود | +| `snowflake` | `snowflake` | Snowflake Cortex | مفتاح API، مؤسسات | [رابط](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | مفتاح API | [رابط](https://xinghuo.xfyun.cn) | احصل على مفتاح API من console.xfyun.cn | +| `speka` | `speka` | Speka AI | مفتاح API، مجمّع | [رابط](https://speka.me) | الخطة المجانية: استخدام شهري بقيمة $1، و10 طلبات في الدقيقة، ومفتاح API واحد، وإمكانية الوصول إلى النماذج المفتوحة وبيئة التجربة؛ لا يلزم إدخال بطاقة. | +| `stability-ai` | `stability` | Stability AI | مفتاح API، صور | [رابط](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | مفتاح API | [رابط](https://stepfun.com) | احصل على مفتاح API من platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | مفتاح API | [رابط](https://ai.sumopod.com) | استخدم مفتاح API الخاص بك من SumoPod‏ (sk-...) في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API:‏ https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | مفتاح API | [رابط](https://suno.ai) | الصق ملف تعريف ارتباط الجلسة من suno.ai (مصادقة Clerk) | +| `synthetic` | `synthetic` | Synthetic | مفتاح API، مجمّع | [رابط](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | مفتاح API، مجمّع | [رابط](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | مفتاح API | [رابط](https://hunyuan.tencent.com) | احصل على مفتاح API من console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | مفتاح API، مجمّع | [رابط](https://theb.ai) | مفتاح API من نوع Bearer لبوابة TheB.AI المتوافقة مع OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | مفتاح API | [رابط](https://docs.tinyfish.ai/fetch-api) | مفتاح X-API-Key من agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | مفتاح API، فيديو | [رابط](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | مفتاح API | [رابط](https://agent-router.gaib.ai) | استخدم مفتاح API الخاص بك من Token Kiosk في Authorization: Bearer . بوابة متوافقة بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API:‏ https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | مفتاح API، مجمّع | [رابط](https://www.tokenreply.com) | للنماذج الموسومة بأنها مجانية حدود يومية خاصة بكل نموذج وحملة؛ ولا توجد حصة مجانية عامة ثابتة منشورة. | +| `tokenrouter` | `trk` | TokenRouter | مفتاح API | [رابط](https://tokenrouter.com) | استخدم مفتاح API الخاص بك من TokenRouter في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لواجهة API:‏ https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | مفتاح API، صور | [رابط](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | مفتاح API | [رابط](https://docs.opentyphoon.ai) | مفتاح API مجاني بحد أقصى لمعدل الطلبات يبلغ 5 طلبات/ثانية و200 طلب/دقيقة. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | مفتاح API | [رابط](https://uncensored.com) | استخدم مفتاح Developer API الخاص بك من uncensored.com ‏(uai_sk_live_...). يرسله OmniRoute في ترويسة X-api-key إلى نقطة النهاية https://api.uncensored.com/api/v1 المتوافقة مع OpenAI. لا تنتهي صلاحية المفتاح أبدًا. هذه هي الواجهة القائمة على القياس/الأرصدة؛ أما دردشة الاشتراك غير المقيسة فهي موفّر 'uc' منفصل. | +| `udio` | `udio` | Udio | مفتاح API | [رابط](https://udio.com) | الصق ملف تعريف ارتباط الجلسة من udio.com ‏(مصادقة Supabase) | +| `unorouter` | `unorouter` | UnoRouter | مفتاح API، مجمّع | [رابط](https://unorouter.ai) | النماذج ذات اللاحقة :free لا تخصم من الرصيد؛ والحد هو طلب واحد في الدقيقة لكل نموذج مجاني لكل مستخدم. | +| `upstage` | `upstage` | Upstage | مفتاح API | [رابط](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | مفتاح API | [رابط](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | مفتاح API | [رابط](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | مفتاح API، مجمّع | [رابط](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | مفتاح API، مؤسسي | [رابط](https://cloud.google.com/vertex-ai) | قدّم JSON لحساب الخدمة، أو رمز وصول OAuth، أو مفتاح Vertex Express API، أو مفتاح تخويل مرتبطًا بحساب خدمة. يدعم وضع Express نماذج Gemini فقط؛ وتتطلب نماذج الشركاء بيانات اعتماد محددة النطاق بالمشروع. | +| `vertex-partner` | `vp` | Vertex AI Partners | مفتاح API، مؤسسي | [رابط](https://cloud.google.com/vertex-ai) | قدّم JSON لحساب الخدمة أو بيانات اعتماد OAuth. يدعم مفتاح التخويل المرتبط بحساب خدمة الاكتشاف أيضًا، لكن استدلال نماذج الشركاء يتطلب بالإضافة إلى ذلك معرّف مشروع Google Cloud الخاص به. تدعم مفاتيح Express القياسية نماذج Gemini فقط. | +| `void-ai` | `void-ai` | Void AI | مفتاح API، مجمّع | [رابط](https://voidai.app) | يشير كتالوج النماذج العام إلى أن بعض النماذج تتطلب خطة مجانية، لكن الوصول مشروط ولم تُؤكَّد أي حصة رقمية. | +| `volcengine` | `volcengine` | Volcengine | مفتاح API | [رابط](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | مفتاح API | [رابط](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | اربط حساب Volcano Engine الخاص بك أو استخدم مفتاح API لاشتراك Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | مفتاح API | [رابط](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | اربط حساب Volcano Engine الخاص بك أو استخدم مفتاح API لاشتراك Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | مفتاح API، تضمين/إعادة ترتيب | [رابط](https://www.voyageai.com) | مفتاح Bearer API لواجهات API الخاصة بالتضمينات وإعادة الترتيب في Voyage AI. | +| `wafer` | `wafer` | Wafer AI | مفتاح API | [رابط](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | مفتاح API | [رابط](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | مفتاح API، مؤسسي | [رابط](https://www.ibm.com/products/watsonx-ai) | استخدم رمز watsonx من نوع Bearer. يمكن أن يكون عنوان URL الأساسي https://.ml.cloud.ibm.com/ml/gateway/v1/ أو نقطة نهاية /ml/gateway/v1 مُدارة ذاتيًا. | +| `writer` | `writer` | Writer | مفتاح API | [رابط](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | مفتاح API | [رابط](https://x5lab.dev) | استخدم مفتاح X5Lab API الخاص بك ‏(x5-...) في Authorization: Bearer . متوافق بالكامل مع OpenAI. عنوان URL الأساسي لـ API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | مفتاح API | [رابط](https://x.ai) | استخدم مفتاح xAI API رسميًا، أو سجّل الدخول باستخدام xAI OAuth. تظل جلسات Grok Build JWT موفّرًا منفصلًا. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | مفتاح API | [رابط](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | مفتاح API | [رابط](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | مفتاح API، مجمّع | [رابط](https://xkiro.com) | أنشئ حسابًا مجانيًا على xkiro.com والصق المفتاح هنا (Bearer؛ ويُقبل x-api-key أيضًا). | +| `yi` | `yi` | Yi (01.AI) | مفتاح API | [رابط](https://01.ai) | احصل على مفتاح API من platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | مفتاح API، مجمّع | [رابط](https://yolo-auto.com) | يخضع الوصول المجاني إلى API لحدود على الطلبات وهو مخصص للاختبار؛ لا توجد حصة يومية رقمية منشورة، ولا يوجد وعد باستمرار الوصول المجاني إلى أجل غير مسمى. | +| `zai` | `zai` | Z.AI | مفتاح API | [رابط](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | مفتاح API | [رابط](https://zenmux.ai) | استخدم مفتاح ZenMux API الخاص بك في Authorization: Bearer . يتوافق ZenMux بالكامل مع OpenAI. عنوان URL الأساسي: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | مفتاح API، مجمّع | [رابط](https://www.zerolimitai.com) | يُعلَن عن فترة تجريبية مجانية مؤقتة، لكن الصفحات الرسمية تتعارض بين 3 و7 أيام؛ ولا يُتعامل مع ادعاء إتاحة 100 استدعاء يوميًا على أنه دائم. | +| `zylo-api` | `zylo` | Zylo API | مفتاح API، مجمّع | [رابط](https://zyloai.net) | الخطة الأساسية: 10 طلبات في الدقيقة، و7,200 طلب يوميًا، و200,000 رمز مميّز يوميًا؛ وتقتصر على نماذج النص الأساسية. | ## المزوّدون المحليون (14) diff --git a/docs/i18n/ar/docs/routing/REASONING_REPLAY.md b/docs/i18n/ar/docs/routing/REASONING_REPLAY.md index d74875f6439e..3910533e0c80 100644 --- a/docs/i18n/ar/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/ar/docs/routing/REASONING_REPLAY.md @@ -19,25 +19,27 @@ لكن العملاء المعتادين (Cursor وCline وRoo Code وOpenAI SDK) يزيلون `reasoning_content` من السجل الذي يعيدون تمريره. يستعيده OmniRoute من ذاكرة تخزين مؤقت من جانب الخادم بحيث يكون الطلب الذي يراه المنبع متسقًا. قدّمت المشكلة #1628 آلية التخزين الهجينة في الذاكرة/SQLite لكي تظل ذاكرة التخزين المؤقت محفوظة بعد إعادة تشغيل العملية. -## البنية +## البنية المعمارية ``` -الدور N (ينشئ المساعد الاستجابة): +الدور N (ينشئ المساعد): → تحتوي الاستجابة على reasoning_content + tool_calls → إذا كانت requiresReasoningReplay(provider, model): استدعاء cacheReasoningFromAssistantMessage() - يكتب (في الذاكرة + قاعدة البيانات)، باستخدام كل tool_call.id كمفتاح + يكتب في (الذاكرة + قاعدة البيانات)، مع الفهرسة حسب كل tool_call.id → تمرير الاستجابة إلى العميل (الذي قد يحتفظ بالاستدلال أو لا يحتفظ به) -الدور N+1 (يرسل العميل طلب متابعة): +الدور N+1 (يرسل العميل متابعة): → يكتشف المترجم أن: requiresReasoningReplay(provider, model) === true → لكل رسالة مساعد تحتوي على tool_calls ولا تحتوي على reasoning_content: lookupReasoning(toolCalls[0].id) → الذاكرة → قاعدة البيانات - إصابة → msg.reasoning_content = cached; recordReplay() - إخفاق → msg.reasoning_content = "" (حل احتياطي قديم للإصدارات الأقدم من DeepSeek) + إصابة → msg.reasoning_content = cached; استدعاء recordReplay() + إخفاق → msg.reasoning_content = "" (خيار رجوع قديم لإصدارات DeepSeek الأقدم) → يرى المنبع سجلًا متسقًا → لا يوجد خطأ 400 ``` -تتم عملية الالتقاط في `open-sse/handlers/chatCore.ts` (في موضعين، عند موضعي استدعاء `cacheReasoningFromAssistantMessage`). وتتم إعادة التمرير في `open-sse/translator/index.ts` بعد مواءمة المخطط، ولكن قبل الإرسال. +تحدث عملية الالتقاط في `open-sse/handlers/chatCore.ts` (في موضعين، عند موضعي استدعاء `cacheReasoningFromAssistantMessage`). وتحدث إعادة التشغيل في `open-sse/translator/index.ts` بعد تحويل المخطط، ولكن قبل الإرسال. + +تُفهرس أدوار المساعد العادية (التي لا تتضمن استدعاءات أدوات) بطريقة مختلفة: تحسب `buildAssistantMessageCacheKey()` ملخصًا لنطاق الجلسة بالإضافة إلى نص المحادثة الموحّد بتنسيق OpenAI حتى ذلك الدور، لأن DeepSeek يتطلب استدلال _كل_ دور سابق بمجرد وجود `tools`. بالنسبة إلى الوجهات التي تستخدم Responses API (مثل `opencode-go/deepseek-v4-flash`، الموجّه إلى `/responses`)، يحمل نص الطلب المرسل إلى المنبع الحقل `input` بدلًا من `messages`، ولذلك تُبلغ `translateRequest()`‏ (`open-sse/translator/index.ts`) عبر خيار رد نداء عن نص المحادثة المحوري الذي حسبت ملخصه، ثم تحسب مواضع الالتقاط ملخص ذلك النص نفسه. تعمل مرحلة إعادة تشغيل Responses على المحور المتوافق مع OpenAI لكل تنسيق مصدر، ولذلك تُعاد أيضًا رسائل عملاء Anthropic Messages ‏(Claude → OpenAI → Responses). ## التخزين — الذاكرة الهجينة + SQLite diff --git a/docs/i18n/ar/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/ar/docs/security/SOCKET_DEV_FINDINGS.md index 8888cfb419fa..a46af997cba4 100644 --- a/docs/i18n/ar/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/ar/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- -هذا المستند هو الإقرار الذي أعدّه المشرف بشأن النتائج الست من نوع -`AI-detected potential malware` التي أُثيرت ضد `omniroute@3.8.5`، وبشأن -إجراءات التخفيف المطبّقة في `omniroute@3.8.6`. والغرض منه هو: - -1. توفير مرجع واحد يمكن لمشغّلي مسارات الأمان الاستشهاد به عندما يحتاجون - إلى تقييم النتائج مقارنةً بالمصدر الفعلي. -2. تمكين أدوات الفحص المستقبلية المعتمدة على الذكاء الاصطناعي من التعرّف على ادعاء المشرف الموقّع بأن كل - مسار جرى الإبلاغ عنه مقصود، ويعمل بالاشتراك الاختياري، وموثّق. -3. الاحتفاظ بسجل مكتوب يوضح _سبب_ تشكيل كل موضع استدعاء بهذه الطريقة — +> **ملاحظة حول النطاق:** يضبط `socket.yml` فحص Socket.dev الذي يُجرى من جانب السجل بعد نشر حزمة npm (مع تجاهل مسارات المحتوى غير المضمّن في الحزمة المنشورة، مثل `tests/` و`docs/` وتقارير البناء). ولا ينشئ بوابة دمج ضمن CI/PR — فلا يوجد سير عمل في `.github/workflows`، ولا برنامج نصي في `package.json`، ولا هدف في `Makefile` يستدعي Socket.dev. + +هذه الوثيقة هي إفادة أعدّها المشرف بشأن نتائج +`برمجيات ضارة محتملة مكتشفة بواسطة الذكاء الاصطناعي` الست التي أُثيرت حول `omniroute@3.8.5` +والإجراءات التخفيفية المطبقة في `omniroute@3.8.6`. وهي موجودة لكي: + +1. يتوفر لمشغّلي مسار الأمان مرجع واحد يمكنهم الاستشهاد به عندما يحتاجون + إلى تقييم النتائج بالرجوع إلى الشيفرة المصدرية الفعلية. +2. تتمكن أدوات الفحص المستقبلية المعتمدة على الذكاء الاصطناعي من التقاط إفادة المشرف الموقعة التي تؤكد أن كل + مسار جرى الإبلاغ عنه مقصود، ويتطلب تمكينًا صريحًا، وموثق. +3. يكون لدينا سجل مكتوب يوضح _سبب_ تصميم كل موضع استدعاء على النحو الحالي — حتى لا تؤدي إعادة هيكلة مستقبلية، دون قصد، إلى إعادة إدخال بصمة أُزيلت عمدًا. -إذا كنت تشغّل أداة فحص تعيد الإبلاغ عن أي من مواضع الاستدعاء أدناه بعد -طرح إجراءات التخفيف الخاصة بـ v3.8.6، فيُرجى فتح مشكلة مع سجل الفحص، -وسنوسّع الإقرار هنا. +إذا كنتم تشغّلون أداة فحص تعيد الإبلاغ عن أي من مواضع الاستدعاء أدناه بعد +إصدار الإجراءات التخفيفية في v3.8.6، فيُرجى فتح مشكلة وإرفاق سجل تتبع الفحص، +وسنوسّع الإفادة هنا. --- diff --git a/docs/i18n/az/README.md b/docs/i18n/az/README.md index 136aa5ba5fe4..980094b568d1 100644 --- a/docs/i18n/az/README.md +++ b/docs/i18n/az/README.md @@ -23,13 +23,13 @@
-> Pulsuz paketləri əl ilə birləşdirmək əziyyətlidir — onlarla SDK, onlarla sürət limiti və əslində nə qədər resursunuz olduğuna dair heç bir təsəvvür yoxdur. OmniRoute **35 təkrarlanan hovuz açarı üzrə 491 pulsuz paket qeydini** kataloqlaşdırır və token göstəricisini **dərc edilmiş müsbət aylıq büdcəsi olan 17 hovuz, üstəgəl model üzrə beş Groq limiti** əsasında hesablayır; ortaq hovuzlar təkrarlanmır. Yalnız regional şəxsiyyət yoxlamasından sonra əlçatan olan kvotalar (hazırda: ModelScope) ayrıca göstərilir — regional şəxsiyyət təsdiqindən sonra +~6M — və heç vaxt əsas göstəriciyə əlavə edilmir. Nəticə idarəetmə panelində (`/dashboard/free-tiers`) görünür. +> Pulsuz səviyyələri əl ilə birləşdirmək əziyyətlidir — onlarla SDK, onlarla sürət limiti və əslində nə qədər resursunuz olduğuna dair heç bir təsəvvür yoxdur. OmniRoute **35 təkrarlanan hovuz açarı üzrə 489 pulsuz səviyyə qeydini** kataloqlaşdırır və token göstəricisini **dərc edilmiş müsbət aylıq büdcəsi olan 17 hovuz, üstəgəl model üzrə beş Groq limiti** əsasında hesablayır; ortaq hovuzlar təkrarlanmır. Yalnız regional şəxsiyyət yoxlamasından sonra açılan kvotalar (hazırda: ModelScope) ayrıca göstərilir — regional şəxsiyyət təsdiqinin arxasında +~6M — və heç vaxt əsas göstəriciyə əlavə edilmir. Nəticə idarəetmə panelində (`/dashboard/free-tiers`) görünən olaraq qalır. -OmniRoute pulsuz paket büdcəsi kartı: ayda stabil olaraq ~1.62B pulsuz token, qeydiyyat kreditləri ilə ilk ayda ~2.22B-a qədər; bir endpoint arxasında kataloqlaşdırılmış 491 pulsuz paket qeydini əhatə edən 35 sənədləşdirilmiş təkrarlanan hovuz açarı. Dürüst, hovuz üzrə təkrarlanmayan hesablama — dərc edilmiş müsbət aylıq token büdcəsi olan 17 təkrarlanan hovuz və model üzrə beş Groq limiti daxil olmaqla, hər ortaq hovuz yalnız bir dəfə sayılır; şərtlərlə bağlı risk kataloqunda 13 provayder avoid kimi işarələnib, buna görə qərarı siz verirsiniz. Büdcə panelinə Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (model üzrə beş limit) və daha kiçik hovuzlar daxildir; ilk ay üçün qeydiyyat kreditləri və token limiti olmayan daimi pulsuz provayderlər ayrıca göstərilir ki, əsas göstəricini heç vaxt süni şəkildə artırmasınlar. Cari istifadə və qalıq /dashboard/free-tiers səhifəsində. +OmniRoute pulsuz səviyyə büdcəsi kartı: ayda sabit ~1.62B pulsuz token, qeydiyyat kreditləri ilə ilk ayda ~2.22B-dək; bir son nöqtənin arxasında kataloqlaşdırılmış 489 pulsuz səviyyə qeydini əhatə edən 35 sənədləşdirilmiş təkrarlanan hovuz açarından. Dürüst, hovuz üzrə təkrarsız hesablamalar — hər ortaq hovuz yalnız bir dəfə hesablanır; buraya dərc edilmiş müsbət aylıq token büdcəsi olan 17 təkrarlanan hovuz, üstəgəl model üzrə beş Groq limiti daxildir; şərtlərlə bağlı risk kataloqunda 13 provayderdən çəkinmək tövsiyə olunur, qərarı siz verirsiniz. Büdcə zolağına Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (model üzrə beş limit) və daha kiçik hovuzlar daxildir; həmçinin ilk ay üçün qeydiyyat kreditləri və daimi pulsuz, token limiti olmayan provayderlər ayrıca göstərilir ki, əsas göstəricini heç vaxt şişirtməsinlər. /dashboard/free-tiers səhifəsində canlı istifadə olunan/qalan miqdar. > Canlı `/dashboard/free-tiers` səhifəsinin animasiyalı xülasəsi. Tam metodologiya (hovuzların təkrarsızlaşdırılması, kredit səviyyələri, provayder şərtləri): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Bu rəqəmlər hər iki həftədən bir canlı kataloqla müqayisə edilərək yenidən yoxlanılır və **hər iki istiqamətdə dəyişir** — provayder pulsuz paketi dayandırdıqda rəqəm azalır, yenisi əlavə olunduqda isə artır. Biz yuvarlaqlaşdırılmış ən yaxşı ehtimalı deyil, kataloqun faktiki hesabladığı nəticəni dərc edirik. +> Bu rəqəmlər hər iki həftədən bir canlı kataloqla müqayisə edilərək yenidən yoxlanılır və **hər iki istiqamətdə dəyişir** — provayder pulsuz səviyyəni dayandırdıqda rəqəm azalır; yenisi əlavə edildikdə isə artır. Biz yuvarlaqlaşdırılmış ən yaxşı ssenarini deyil, kataloqun faktiki hesabladığı nəticəni dərc edirik.
@@ -37,7 +37,7 @@

-⭐ OMNIROUTE pulunuza qənaət etməyə və işinizi asanlaşdırmağa kömək edibsə, repoya ulduz verin. +⭐ OMNIROUTE pula qənaət etməyinizə və işinizi asanlaşdırmağınıza kömək edibsə, repoya ulduz verin.

@@ -48,7 +48,7 @@ ### 💬 İcmaya qoşulun -**👋 Müşayiətçini izləyin — yeni provayderlər, buraxılışlar və məsləhətlərdən ilk siz xəbərdar olun:** +**👋 Məsul şəxsi izləyin — yeni provayderlər, buraxılışlar və məsləhətlərdən ilk siz xəbərdar olun:** [![Diego-nu LinkedIn-də izləyin](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![GitHub-da @diegosouzapw hesabını izləyin](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -592,7 +592,7 @@ Radar-a qoşulmaq ixtiyaridir və o, yalnız GET sorğularından istifadə edir. ## 🤖 Uyğun CLI-lər və Kodlaşdırma Agentləri -> Tək bir konfiqurasiya — `http://localhost:20128/v1` — və **hər bir** süni intellekt IDE-si və ya CLI pulsuz və aşağı qiymətli modellərdə işləyir. +> Bir konfiqurasiya — `http://localhost:20128/v1` — və **hər bir** süni intellekt IDE-si və ya CLI pulsuz və aşağı qiymətli modellərdə işləyir.
@@ -626,23 +626,23 @@ Radar-a qoşulmaq ixtiyaridir və o, yalnız GET sorğularından istifadə edir. - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ həmçinin bunlarla işləyir · Kiro · Command Code · Antigravity · Windsurf · AMP · OpenAI ilə uyğun istənilən alət ++ həmçinin bunlarla işləyir · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · istənilən OpenAI-uyğun alət
-📖 Bütün 36 alət üçün fərdi quraşdırma (26 CLI kodlaşdırma aləti + 10 CLI agenti) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode plagini → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Bütün 36 alət üçün ayrıca quraşdırma (26 CLI Code + 10 CLI Agent) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode plagini → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)
-**Dəstəklənən istənilən CLI-ni bir əmrlə OmniRoute vasitəsilə başladın** — heç bir konfiqurasiya faylı yazılmır, -giriş məlumatları hər prosesə ayrıca ötürülür, Qwen/Gemini isə müvəqqəti, təcrid olunmuş ev qovluğu əldə edir: +**Dəstəklənən istənilən CLI-ni OmniRoute vasitəsilə bir əmrlə başladın** — heç bir konfiqurasiya faylı yazılmır, +giriş məlumatları hər proses üçün ayrıca ötürülür, Qwen/Gemini isə birdəfəlik, təcrid olunmuş ev qovluğu əldə edir: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -658,18 +658,18 @@ omniroute configure codex # həmçinin: claude opencode qwen aider goos ``` Hər bir əmr aktiv uzaq konteksti (`omniroute connect `) nəzərə alır, `--dry-run` -icra etmədən dəqiq mühit dəyişənlərini/arqumentləri önizləyir, `--api-key-env NAME` isə məxfi məlumatların +icra etmədən dəqiq mühit dəyişənlərini/arqumentləri əvvəlcədən göstərir, `--api-key-env NAME` isə məxfi məlumatların əmr tarixçənizə düşməsinin qarşısını alır. → [CLI inteqrasiyaları](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 AI Provayderi — 152-si Kataloqda Pulsuz kimi İşarələnib +## 🌐 357 AI Provayderi — 152-si Kataloqda Pulsuz Olaraq İşarələnib
-> Kanonik çat, media, axtarış, lokal, bulud agenti və sistem kolleksiyalarında **357 qeydiyyatdan keçmiş provayder**, o cümlədən **`hasFree: true` aşkarlama metadatası daşıyan 152 provayder** mövcuddur. Çat modeli reyestri **229 provayderi / 2,554 unikal provayder-model cütünü / 1,283 emal edilməmiş model ID-sini** əhatə edir; ayrıca pulsuz büdcə kataloqunda isə **modellər üzrə 491 sətir**, **35 təkrarlanan hovuz** və **54 təkrarlanan/açarsız, həmişə pulsuz provayder** var. Bunlar məqsədli şəkildə fərqli məxrəclərdir; təriflər və hovuzlar üzrə dublikatları çıxarılmış hesablamalar [Provayder Arayışı](docs/reference/PROVIDER_REFERENCE.md) və [Pulsuz Tariflər](docs/reference/FREE_TIERS.md) sənədlərində təqdim olunur. +> Kanonik çat, media, axtarış, lokal, bulud agenti və sistem kolleksiyalarında **357 qeydiyyatdan keçmiş provayder**, o cümlədən **`hasFree: true` aşkarlama metadatasına malik 152 provayder** mövcuddur. Çat modeli reyestri **229 provayderi / 2,554 fərqli provayder-model cütünü / 1,283 xam model ID-sini** əhatə edir; ayrıca pulsuz büdcə kataloqunda isə **model üzrə 491 sətir**, **35 təkrarlanan hovuz** və **54 təkrarlanan/açarsız, həmişə pulsuz provayder** var. Bunların məxrəcləri məqsədli şəkildə fərqlidir; təriflər və hovuz üzrə dublikatları aradan qaldırılmış hesablamalar [Provayder Arayışı](docs/reference/PROVIDER_REFERENCE.md) və [Pulsuz Tariflər](docs/reference/FREE_TIERS.md) sənədlərində təqdim olunur.
@@ -702,7 +702,7 @@ icra etmədən dəqiq mühit dəyişənlərini/arqumentləri önizləyir, `--api -…və daha 330+ provayder — hər bir ikon birbaşa idarəetmə panelinin provayder kataloqundan yüklənir. 📖 [Provayder Arayışı](docs/reference/PROVIDER_REFERENCE.md) +…və daha 330+ provayder — hər bir ikon birbaşa idarə panelinin provayder kataloqundan yüklənir. 📖 [Provayder Arayışı](docs/reference/PROVIDER_REFERENCE.md)
@@ -710,8 +710,8 @@ icra etmədən dəqiq mühit dəyişənlərini/arqumentləri önizləyir, `--api - - + + @@ -720,9 +720,9 @@ icra etmədən dəqiq mühit dəyişənlərini/arqumentləri önizləyir, `--api - - - + + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Token məhdudiyyəti yoxdur
Kilo Code
Kilo Code
Avtomatik marşrutlaşdırıcı, Tencent Hy3
Həmişə pulsuz
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Token limiti yoxdur
Kilo Code
Kilo Code
Avtomatik yönləndirici, Tencent Hy3
Həmişə pulsuz
Requesty
Requesty
GPT-OSS 120B, Nemotron
Həmişə pulsuz
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Pulsuz tarif
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Həmişə pulsuz
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Limitsiz PULSUZ
Pollinations
Pollinations
GPT, Llama, Claude
Açar tələb olunmur
Cloudflare AI
Cloudflare AI
50+ model
Gündə 10K neyron
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM pulsuz
Cerebras
Cerebras
GLM 4.7, GPT-OSS
Gündə 1M token
Cloudflare AI
Cloudflare AI
50-dən çox model
Gündə 10K neyron
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
Pulsuz ~40 RPM
Openference
Openference
Qwen3.8 27B, Llama 3.2
Pulsuz tarif
OpenRouter
OpenRouter
:free modelləri
+$10 → daha yüksək RPM
@@ -1261,21 +1261,21 @@ bir portda təqdim olunur, buna görə hazırda ayrıca yalnız CLI üçün pake
- + - - - - - + + + + + - + - - - - + + + + @@ -1289,73 +1289,73 @@ bir portda təqdim olunur, buna görə hazırda ayrıca yalnız CLI üçün pake -### 📘 İşə Başlama +### 📘 Başlanğıc
SəviyyəTexnologiya
TəbəqəTexnologiya
İcra mühitiNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
DilTypeScript 6.0 — src/ və open-sse/ boyunca 100% TypeScript (v2.0-dan bəri nüvədə sıfır any)
FreymvorkNext.js 16 + React 19 + Tailwind CSS 4
Verilənlər bazasıbetter-sqlite3 (SQLite, WAL jurnallaşdırması) + LowDB (köhnə JSON formatı) — 122 domen modulu, 176 miqrasiya
YaddaşSQLite FTS5 tam mətnli axtarış + int8-kvantlaşdırılmış vektor yerləşdirmələri, tipləşdirilmiş zəifləmə
SxemlərZod 4 — MCP alətlərinin giriş/çıxış yoxlaması + API müqavilələri
DilTypeScript 6.0 — src/ və open-sse/ boyunca 100% TypeScript (v2.0-dan bəri əsas hissədə sıfır any)
Frey motsivörkNext.js 16 + React 19 + Tailwind CSS 4
Verilənlər bazasıbetter-sqlite3 (SQLite, WAL jurnallaşdırması) + LowDB (köhnə JSON formatı) — 122 domen modulu, 178 miqrasiya
YaddaşSQLite FTS5 tam mətn axtarışı + int8-kvantlaşdırılmış vektor yerləşdirmələri, tipləşdirilmiş zəifləmə
SxemlərZod 4 — MCP alətinin giriş/çıxış validasiyası + API müqavilələri
ProtokollarMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
Axın ötürülməsiServer-Sent Events (SSE) + WebSocket körpüsü (/v1/ws)
Sıxılma12 mühərrikli emal xətti — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Sıxılma12 mühərrikli konveyer — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autentifikasiya və təhlükəsizlikOAuth 2.0 (PKCE) + JWT + API açarları + MCP əhatə dairəli autentifikasiya · saxlanma zamanı AES-256-GCM · DOMPurify
Gizlilikwreq-js — JA3 / JA4 TLS rəqəmsal izinin təqlidi, 3 səviyyəli proksi
DavamlılıqDövrə açarı, eksponensial geri çəkilmə, kütləvi eyni vaxtlı sorğuların qarşısının alınması, avtomatik kombinasiyalı özünübərpa
Jurnallaşdırmapino — sorğu kontekstli strukturlaşdırılmış JSON jurnalları
TestləşdirməNode.js test icraedicisi + Vitest — 5,100-dən çox izlənilən test faylında 39,000-dən çox statik test bəyanı (modul, inteqrasiya, E2E, təhlükəsizlik, ekosistem)
Gizlilikwreq-js — JA3 / JA4 TLS barmaq izi təqlidi, 3 səviyyəli proksi
DözümlülükDövrə açarı, eksponensial geri çəkilmə, kütləvi paralel sorğu axınının qarşısının alınması, avtomatik kombinasiya ilə özünübərpa
Jurnallaşdırmapino — sorğu konteksti ilə strukturlaşdırılmış JSON jurnalları
TestləşdirməNode.js test icraçısı + Vitest — izlənilən 5,100+ test faylında 39,000+ statik test elanı (modul, inteqrasiya, E2E, təhlükəsizlik, ekosistem)
PlatformalarMasaüstü (Electron) · Android (Termux) · PWA (istənilən brauzer)
CI/CDGitHub Actions — buraxılış zamanı avtomatik npm nəşri + Docker Hub
KeçidlərVeb-sayt · npm · Docker Hub
- - - - - - + + + + + +
SənədTəsvir
İstifadəçi TəlimatıProvayderlər, kombinasiyalar, CLI inteqrasiyası, yerləşdirmə
Quraşdırma TəlimatıTam quraşdırma üsulları, CLI aləti konfiqurasiyaları, protokol quraşdırması, vaxt aşımı sazlaması
CLI Alətləri TəlimatıClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo və Copilot üçün hər alət üzrə quraşdırma
Uzaq RejimƏhatə dairəsi məhdud giriş tokenləri vasitəsilə noutbukunuzdakı CLI-dan uzaq OmniRoute-u (VPS) idarə edin
Claude Code Konfiqurasiyasılaunch və hər model üzrə profillərlə Claude Code-u OmniRoute-a (lokal/uzaq) yönləndirin
Sürətli Başlanğıc3 addımda quraşdırma → qoşulma → konfiqurasiya
İstifadəçi təlimatıProvayderlər, kombinasiyalar, CLI inteqrasiyası, yerləşdirmə
Quraşdırma təlimatıTam quraşdırma üsulları, CLI alətlərinin konfiqurasiyaları, protokol quraşdırması, vaxt aşımı tənzimləməsi
CLI alətləri təlimatıClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo və Copilot üçün ayrıca quraşdırma
Uzaq rejimMəhdud əhatəli giriş tokenləri vasitəsilə noutbukunuzdakı CLI-dan uzaq OmniRoute-u (VPS) idarə edin
Claude Code konfiqurasiyasılaunch və hər model üçün profillərlə Claude Code-u OmniRoute-a (lokal/uzaq) yönləndirin
Sürətli başlanğıc3 addımda quraşdırma → qoşulma → konfiqurasiya
-### 🔧 Əməliyyatlar və Yerləşdirmə +### 🔧 Əməliyyatlar və yerləşdirmə - - - - - - - - + + + + + + + +
SənədTəsvir
Docker TəlimatıDocker run, Compose profilləri, Caddy HTTPS, tunellər, təsvir teqləri
Podman TəlimatıQuadlet systemd inteqrasiyası, podman-compose, SELinux
VM YerləşdirməsiTam təlimat: VM + nginx + Cloudflare quraşdırması
Fly.io YerləşdirməsiDavamlı yaddaşla Fly.io-da yerləşdirin
Termux TəlimatıOmniRoute-u Termux vasitəsilə Android-də işə salın
PWA TəlimatıProqressiv Veb Tətbiqinin quraşdırılması, keşləmə, arxitektura
Silinmə TəlimatıBütün quraşdırma üsulları üçün təmiz silinmə
Mühit KonfiqurasiyasıTam .env dəyişənləri və istinadlar
Docker təlimatıDocker işə salınması, Compose profilləri, Caddy HTTPS, tunellər, təsvir teqləri
Podman təlimatıQuadlet systemd inteqrasiyası, podman-compose, SELinux
VM yerləşdirilməsiTam təlimat: VM + nginx + Cloudflare quraşdırması
Fly.io-da yerləşdirməDavamlı yaddaşla Fly.io-da yerləşdirin
Termux təlimatıOmniRoute-u Termux vasitəsilə Android-də işə salın
PWA təlimatıProqressiv veb tətbiqin quraşdırılması, keşləmə, arxitektura
Silmə təlimatıBütün quraşdırma üsulları üçün təmiz silmə
Mühit konfiqurasiyasıTam .env dəyişənləri və istinadlar
-### 🧠 Xüsusiyyətlər və Arxitektura +### 🧠 Funksiyalar və arxitektura - - - - - - - - - - - + + + + + + + + + + +
SənədTəsvir
ArxitekturaSistem arxitekturası, məlumat axını və daxili mexanizmlər
Sıxılma Təlimatı7 seçimli konveyer: söndürülmüş / yüngül / standart / aqressiv / ultra / RTK / yığılmış
RTK SıxılmasıƏmr çıxışının sıxılması, filtrlər, etibar, doğrulama, xam çıxışın bərpası
Sıxılma MühərrikləriCaveman, RTK, yığılmış konveyerlər, idarə paneli/API/MCP interfeysləri
Sıxılma Qaydaları FormatıCaveman və RTK filtrləri üçün JSON qayda paketi sxemləri
Sıxılma Dil PaketləriDilin aşkarlanması və Caveman qayda paketlərinin hazırlanması
Dayanıqlılıq TəlimatıDövrə kəsiciləri, soyuma müddətləri, növbə, eyni vaxtda həddindən artıq sorğuların qarşısının alınması, TLS saxtalaşdırması
Avtomatik Kombinasiya Mühərriki16 amilli qiymətləndirmə, rejim paketləri, özünübərpa
Proksi Təlimatı3 səviyyəli proksi sistemi, 1proxy bazarı, reyestr CRUD əməliyyatları
Pulsuz SəviyyələrBirləşdirilmiş kataloq: sənədləşdirilmiş 35 təkrarlanan hovuz / kataloqlaşdırılmış 491 pulsuz səviyyə qeydi
Xüsusiyyətlər QalereyasıEkran görüntüləri ilə idarə panelinin vizual icmalı
Kod Bazasının SənədləşdirməsiYeni başlayanlar üçün əlçatan kod bazası icmalı
Sıxışdırma təlimatı7 seçimli konveyer: söndürülmüş / yüngül / standart / aqressiv / ultra / RTK / yığılmış
RTK sıxışdırmasıƏmr çıxışının sıxışdırılması, filtrlər, etibar, yoxlama, xam çıxışın bərpası
Sıxışdırma mühərrikləriCaveman, RTK, yığılmış konveyerlər, idarə paneli/API/MCP interfeysləri
Sıxışdırma qaydalarının formatıCaveman və RTK filtrləri üçün JSON qayda paketi sxemləri
Sıxışdırma dil paketləriDilin aşkarlanması və Caveman qayda paketinin yaradılması
Dayanıqlılıq təlimatıDövrə kəsiciləri, soyuma müddətləri, növbə, kütləvi eyni vaxtlı sorğuların qarşısının alınması, TLS saxtalaşdırması
Auto-Combo mühərriki16 amilli qiymətləndirmə, rejim paketləri, özünübərpa
Proksi təlimatı3 səviyyəli proksi sistemi, 1proxy bazarı, reyestr CRUD əməliyyatları
Pulsuz səviyyələrBirləşdirilmiş kataloq: sənədləşdirilmiş 35 təkrarlanan hovuz / kataloqlaşdırılmış 489 pulsuz səviyyə qeydi
Funksiyalar qalereyasıEkran görüntüləri ilə idarə panelinə vizual baxış
Kod bazasının sənədləşdirilməsiYeni başlayanlar üçün anlaşılan kod bazası icmalı
### 🤖 Protokollar və API-lər - - - - - - + + + + + +
SənədTəsvir
API İstinadıNümunələrlə bütün son nöqtələr
OpenAPI SpesifikasiyasıOpenAPI 3.0 spesifikasiyası
MCP Serveri110 MCP aləti, IDE konfiqurasiyaları, Python/TS/Go klientləri
MCP Serveri TəlimatıMCP quraşdırılması, nəqliyyat mexanizmləri və alət istinadı
A2A ServeriJSON-RPC 2.0 protokolu, bacarıqlar, axın ötürməsi, tapşırıqların idarə edilməsi
A2A Serveri TəlimatıA2A agent kartı, tapşırıqlar, bacarıqlar və axın ötürməsi
API istinadıNümunələrlə bütün son nöqtələr
OpenAPI spesifikasiyasıOpenAPI 3.0 spesifikasiyası
MCP serveri110 MCP aləti, IDE konfiqurasiyaları, Python/TS/Go klientləri
MCP serveri təlimatıMCP quraşdırılması, nəqliyyat mexanizmləri və alətlər üzrə istinad
A2A serveriJSON-RPC 2.0 protokolu, bacarıqlar, axın ötürməsi, tapşırıqların idarə edilməsi
A2A serveri təlimatıA2A agent kartı, tapşırıqlar, bacarıqlar və axın ötürməsi
-### 📋 Layihə və Keyfiyyət +### 📋 Layihə və keyfiyyət - - - + + + - - + +
SənədTəsvir
Töhfə verməİnkişaf mühitinin qurulması və təlimatlar
Budaqlanma və buraxılış modeliPR-lərin hara yönəldildiyi (release/*), main və teqlərin nə ifadə etdiyi
Dəyişiklik jurnalıVersiyalar üzrə tam buraxılış tarixçəsi
Töhfə verməİnkişaf mühitinin qurulması və qaydalar
Budaqlanma və buraxılış modeliPR-lərin hansı budağa yönəldildiyi (release/*), main və teqlərin nə ifadə etdiyi
Dəyişikliklər jurnalıVersiyalar üzrə tam buraxılış tarixçəsi
Təhlükəsizlik siyasətiZəifliklərin bildirilməsi və təhlükəsizlik təcrübələri
i18n təlimatı42 dil dəstəyi, tərcümə iş axını, RTL
Buraxılış yoxlama siyahısıBuraxılışdan əvvəl yoxlama addımları
Əhatə planıİzlənilən 5,100-dən çox test faylındakı 39,000-dən çox statik test bəyannaməsi üçün test əhatəsi strategiyası
Buraxılış yoxlama siyahısıBuraxılışdan əvvəl doğrulama addımları
Əhatə planı5,100-dən çox izlənilən test faylındakı 39,000-dən çox statik test elanı üçün test əhatəsi strategiyası

@@ -1393,9 +1393,9 @@ bir portda təqdim olunur, buna görə hazırda ayrıca yalnız CLI üçün pake 20Prudhvivuda246,312 -2026-08-24 05:26:03 UTC tarixinədək birləşdirmələri əhatə edən canlı release/v3.8.50 budağının dafb4ae808 son nöqtəsində dondurulub. Səhifələnmiş GitHub GraphQL siyahıyaalması 5,911 birləşdirilmiş PR ehtiva edir: 2,707-si repozitoriya sahibi, 179-u Dependabot və 3,025 xarici PR isə 535 fərqli töhfəçi tərəfindən təqdim edilib. “Dəyişdirilmiş sətirlər” GitHub əlavələri + silinmələridir və yaradılmış faylları, kilid fayllarını, kataloqları, tərcümələri və sənədləri əhatə edir; bu, dəyişiklik həcmidir, müəllif tərəfindən yazılmış LOC deyil. Son həddə bərabər olan nəticələr saxlanılıb. +2026-08-24 05:26:03 UTC tarixinədək birləşdirmələri əhatə etməklə, aktiv release/v3.8.50 budağının son dafb4ae808 kommiti üzrə sabitlənib. Səhifələnmiş GitHub GraphQL siyahısında 5,911 birləşdirilmiş PR var: 2,707-si repozitoriya sahibindən, 179-u Dependabot-dan və 535 fərqli töhfəçidən 3,025 xarici PR. “Dəyişdirilmiş sətirlər” GitHub əlavələri ilə silinmələrinin cəmidir və yaradılmış faylları, kilid fayllarını, kataloqları, tərcümələri və sənədləri əhatə edir; bu, dəyişiklik həcmini göstərir, müəllif tərəfindən yazılmış LOC deyil. Son həddə bərabər nəticələr saxlanılıb. -### GitHub tərəfindən aid edilən commit-lər +### GitHub-a aid edilən kommitlər @@ -1439,7 +1439,7 @@ bir portda təqdim olunur, buna görə hazırda ayrıca yalnız CLI üçün pake Markus Hartung
Markus Hartung
- 🏅 GitHub-a aid 69 commit · ortaq 6-cı yer + 🏅 GitHub-a aid 69 commit · 6-cı yer bölüşdürülür @@ -1448,7 +1448,7 @@ bir portda təqdim olunur, buna görə hazırda ayrıca yalnız CLI üçün pake Dizzle
Dizzle
- 🏅 GitHub-a aid 69 commit · ortaq 6-cı yer + 🏅 GitHub-a aid 69 commit · 6-cı yer bölüşdürülür
@@ -1469,21 +1469,21 @@ bir portda təqdim olunur, buna görə hazırda ayrıca yalnız CLI üçün pake Bob.Hou
Bob.Hou

- 🏅 GitHub-a aid 51 commit · ortaq 10-cu yer + 🏅 GitHub-a aid 51 commit · 10-cu yer bölüşdürülür
Xiangzhe
Xiangzhe

- 🏅 GitHub-a aid 51 commit · ortaq 10-cu yer + 🏅 GitHub-a aid 51 commit · 10-cu yer bölüşdürülür
-2026-08-24 06:14:31 UTC tarixində yenidən yoxlanılıb: Repozitoriyanın Contributors API-si tərəfindən standart release/v3.8.50 budağı üçün bildirilən GitHub-a aid commitlər. API 525 identifikasiya qaytardı (415 istifadəçi, 2 bot, 108 anonim); bu cədvəl texniki xidmətçini, botları və anonim identifikasiyaları istisna edir və bərabər nəticələri saxlayır. Bu, həm yuxarıdakı birləşdirilmiş PR reytinqindən, həm də aşağıdakı 639 nəfərlik Git metadata siyahıyaalmasından fərqlidir. +2026-08-24 06:14:31 UTC tarixində yenidən yoxlanılıb: repozitoriyanın Contributors API-si tərəfindən standart release/v3.8.50 budağı üçün bildirilən GitHub-a aid commitlər. API 525 identiklik qaytardı (415 istifadəçi, 2 bot, 108 anonim); bu cədvəl texniki xidmətçini, botları və anonim identiklikləri istisna edir və bərabər nəticələri saxlayır. Bu, həm yuxarıdakı birləşdirilmiş PR sıralamasından, həm də aşağıdakı 639 nəfərlik Git metadata siyahıyaalmasından fərqlidir. -> 🙏 Bu töhfəçilərin funksiyaları, xəta düzəlişləri və infrastruktur təkmilləşdirmələri OmniRoute-u etibarlı və funksiyalarla zəngin edən amillərin **əsas hissəsidir**. Hər bir pull request, hər bir test nümunəsi və hər bir i18n tərcümə faylı əhəmiyyətlidir. Açıq mənbə onlar kimi insanlar tərəfindən qurulur. +> 🙏 Bu töhfəçilərin funksiyaları, xəta düzəlişləri və infrastruktur təkmilləşdirmələri OmniRoute-u etibarlı və funksiyalarla zəngin edən amillərin **əsas hissəsidir**. Hər bir pull request, hər bir test nümunəsi və hər bir i18n tərcümə faylı vacibdir. Açıq mənbə onların kimi insanlar tərəfindən qurulur. diff --git a/docs/i18n/az/SECURITY.md b/docs/i18n/az/SECURITY.md index 90c82d0c8697..829e717e3cbe 100644 --- a/docs/i18n/az/SECURITY.md +++ b/docs/i18n/az/SECURITY.md @@ -222,34 +222,38 @@ Bu qaydaların icrası alətlər və yoxlayan şəxslər tərəfindən təmin ed ## Təchizat zənciri skanerinin aşkarlamaları (Socket.dev / Snyk / oxşarları) +> **Əhatə dairəsi qeydi:** Repozitoriyanın kökündəki `socket.yml` yalnız dərc edilmiş npm artefaktının Socket.dev registri tərəfində dərcdən sonra skan edilməsi üçün `projectIgnorePaths` parametrini formalaşdırır — bu, məcburi CI/PR birləşdirmə keçidi deyil. `.github/workflows` daxilində heç bir iş axını, heç bir `package.json` skripti və heç bir `Makefile` hədəfi Socket.dev-i çağırmır. + Dərc edilmiş `omniroute` npm artefaktı Next.js `output: "standalone"` -yığımını paketə daxil edir; bu isə sənədləşdirilmiş imtiyazlı -funksiyalar (MITM, Zed idxalı, Cloud Sync, daxili xidmət nəzarətçisi) daxil olmaqla hər bir marşrut emalçısının -`.next/server/*.js` daxilindəki minifikasiya edilmiş hissələrə düşməsi deməkdir. Evristik təchizat zənciri skanerləri -tez-tez həmin hissələri zərərli proqram imzaları ilə nümunə uyğunlaşdırması vasitəsilə müqayisə edir. +quruluşunu paketləyir; bu isə sənədləşdirilmiş imtiyazlı +funksiyalar (MITM, Zed idxalı, Cloud Sync, daxili xidmət nəzarətçisi) daxil olmaqla +hər bir marşrut emalçısının `.next/server/*.js` minimallaşdırılmış fraqmentlərinə +düşməsi deməkdir. Evristik təchizat zənciri skanerləri tez-tez həmin fraqmentləri +zərərli proqram imzaları ilə nümunə uyğunlaşdırması vasitəsilə müqayisə edir. İstifadə etdiyimiz skaner konfiqurasiyası repozitoriyanın kökündəki [`socket.yml`](socket.yml) faylında yerləşir (Socket.dev GitHub App formatı v2 — baxın: -). O, göndərilməyən -qovluqları (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/` və s.) açıq şəkildə istisna edir ki, skaner yalnız -faktiki olaraq dərc edilmiş istifadəçilərə çatan kod yolları barədə məlumat versin — skanın özü bu repozitoriyadakı -iş axını ilə deyil, həmin faylı oxuyan Socket -GitHub App tərəfindən həyata keçirilir. +). O, skanerin yalnız faktiki olaraq +dərc edilmiş istifadəçilərə çatan kod yolları barədə hesabat verməsi üçün +göndərilməyən qovluqları (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` və s.) açıq şəkildə istisna edir — skanın özü bu +repozitoriyadakı iş axını tərəfindən deyil, həmin faylı oxuyan Socket +GitHub App tərəfindən başladılır. -Hər bir aşkarlama kateqoriyası üçün ayrı-ayrı aşkarlamalara dair müşayiətçi təsdiqini saxlayırıq: +Hər bir aşkarlama kateqoriyası üçün ayrıca texniki xidmətçi təsdiqi saxlayırıq: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - ayrı-ayrı aşkarlamaların xəritəsi: mənbə faylı ↔ işarələnmiş hissə ↔ davranış ↔ v3.8.6 versiyasında - tətbiq edilmiş risk azaltma tədbiri. -- Hər bir işarələnmiş funksiyadakı mənbədaxili `SECURITY-AUDITOR-NOTE:` blokları + hər aşkarlama üzrə xəritə: mənbə faylı ↔ işarələnmiş fraqment ↔ davranış ↔ v3.8.6-da + tətbiq edilmiş zəiflətmə tədbiri. +- Hər işarələnmiş funksiyadakı mənbədaxili `SECURITY-AUDITOR-NOTE:` blokları eyni sənədə istinad edir. Konveyeri xəbərdarlığı yumşalda bilməyən istifadəçilər üçün: -`OMNIROUTE_BUILD_PROFILE=minimal npm run build` ilə yığın. Bu, dörd +`OMNIROUTE_BUILD_PROFILE=minimal npm run build` ilə qurun. Bu, dörd həssas modulu icra zamanı HTTP 503 `feature-disabled` qaytaran -stub-larla əvəz edir; beləliklə, imtiyazlı kod yolları paketdə fiziki olaraq mövcud olmur. -Dərcetmə təlimatları üçün [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) +stub-larla əvəz edir, beləliklə imtiyazlı kod yolları paketdə fiziki olaraq mövcud olmur. +Dərcetmə təlimatı üçün +[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) sənədinə baxın. ## İstinadlar diff --git a/docs/i18n/az/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/az/docs/architecture/CODEBASE_DOCUMENTATION.md index 22fb87cbe5e1..0a7ced1b39dc 100644 --- a/docs/i18n/az/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/az/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -435,48 +435,48 @@ Xüsusi təyinatlı alt qovluqlara bölünüb: ## 4. `open-sse/` — Axın mühərriki iş sahəsi -`@omniroute/open-sse` kimi yayımlanan ayrıca npm iş sahəsi. Sorğuların +`@omniroute/open-sse` adı ilə yayımlanan ayrıca npm iş sahəsi. Sorğuların emalını, icraçıları, tərcüməçiləri, xidmətləri, transformatoru və MCP serverini idarə edir. ``` open-sse/ -├── index.ts İctimai ixraclar +├── index.ts İctimai eksportlar ├── package.json İş sahəsi manifesti ├── tsconfig.json ├── types.d.ts ├── config/ Provayder reyestrləri, başlıq profilləri, identiklik, … ├── handlers/ Sorğu emalçıları (çat, yerləşdirmələr, audio, şəkil, …) -├── executors/ Provayderə xas 108 HTTP icraçısı +├── executors/ Provayderlərə xas 108 HTTP icraçısı ├── translator/ Format çevrilməsi (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions axın transformatoru -├── services/ 80-dən çox xidmət modulu (kombinasiyalar, ehtiyat keçid, kvotalar, identiklik, …) +├── services/ 80-dən çox xidmət modulu (kombinasiyalar, ehtiyat mexanizmi, kvotalar, identiklik, …) ├── utils/ Axın köməkçiləri, TLS klienti, AWS SigV4, proksi sorğusu, … -└── mcp-server/ MCP serveri (3 nəqliyyat, 33 əhatə dairəsi, 110 alət) +└── mcp-server/ MCP serveri (3 nəqliyyat mexanizmi, 33 əhatə dairəsi, 110 alət) ``` ### 4.1 `open-sse/handlers/` -| Emalçı | Təyinatı | -| ----------------------- | -------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Əsas çat emal xətti (keş, sürət limiti, kombinasiya marşrutlaşdırması, icraçıya yönləndirmə) | -| `responsesHandler.ts` | OpenAI Responses API giriş nöqtəsi | -| `embeddings.ts` | Yerləşdirmələr | -| `imageGeneration.ts` | Şəkil generasiyası | -| `audioSpeech.ts` | Mətndən nitqə | -| `audioTranscription.ts` | Nitqdən mətnə | -| `videoGeneration.ts` | Video generasiyası | -| `musicGeneration.ts` | Musiqi generasiyası | -| `rerank.ts` | Yenidən sıralama | -| `moderations.ts` | Moderasiya | -| `search.ts` | Veb axtarışı | -| `sseParser.ts` | SSE hadisə parseri | -| `usageExtractor.ts` | Yuxarı axınlardan token saylarını çıxarır | -| `responseSanitizer.ts` | Provayderə xas artıq məlumatları təmizləyir | -| `responseTranslator.ts` | Provayder cavabı ilə tərcüməçi qatı arasındakı əlaqələndirici | +| Emalçı | Məqsəd | +| ----------------------- | ------------------------------------------------------------------------------------------------ | +| `chatCore.ts` | Əsas çat konveyeri (keş, sürət limiti, kombinasiya marşrutlaşdırması, icraçının yönləndirilməsi) | +| `responsesHandler.ts` | OpenAI Responses API giriş nöqtəsi | +| `embeddings.ts` | Yerləşdirmələr | +| `imageGeneration.ts` | Şəkil generasiyası | +| `audioSpeech.ts` | Mətndən nitqə | +| `audioTranscription.ts` | Nitqdən mətnə | +| `videoGeneration.ts` | Video generasiyası | +| `musicGeneration.ts` | Musiqi generasiyası | +| `rerank.ts` | Yenidən sıralama | +| `moderations.ts` | Moderasiya | +| `search.ts` | Veb axtarışı | +| `sseParser.ts` | SSE hadisə təhlilçisi | +| `usageExtractor.ts` | Yuxarı axınlardan token saylarını çıxarır | +| `responseSanitizer.ts` | Provayderə xas səs-küyü silir | +| `responseTranslator.ts` | Provayder cavabı ilə tərcüməçi qatı arasındakı əlaqələndirici | ### 4.2 `open-sse/executors/` -Hər biri `BaseExecutor`-u (`base.ts`) genişləndirən 108 provayder icraçısı: +Hər biri `BaseExecutor` (`base.ts`) sinfini genişləndirən 108 provayder icraçısı: `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, @@ -485,12 +485,12 @@ Hər biri `BaseExecutor`-u (`base.ts`) genişləndirən 108 provayder icraçıs (ortaq identiklik köməkçisi) və `index.ts` (reyestr). > Qeyd: burada sadalanmayan provayderlərə ümumi OpenAI-uyğun icraçıdan istifadə edən -> `default.ts` xidmət göstərir. Tam provayder kataloqu (355 provayder) -> `src/shared/constants/providers.ts` daxilindədir. +> `default.ts` vasitəsilə xidmət göstərilir. Tam provayder kataloqu (355 provayder) +> `src/shared/constants/providers.ts` daxilində yerləşir. ### 4.3 `open-sse/translator/` -Mərkəz və şüa tipli tərcümə (OpenAI mərkəzdir). +Mərkəz və şüa modeli üzrə tərcümə (OpenAI mərkəz rolunu oynayır). - **9 sorğu tərcüməçisi** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -505,51 +505,51 @@ Mərkəz və şüa tipli tərcümə (OpenAI mərkəzdir). `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, həmçinin köməkçi testləri. - **Şəkil köməkçiləri** (`translator/image/sizeMapper.ts`). -- Yuxarı səviyyə: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. +- Üst səviyyə: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream` əsaslı Responses API ↔ Chat - Completions çeviricisi (`responses/` marşrutunun bütün digər sorğuları tutan emalçısı tərəfindən istifadə olunur). + Completions çeviricisi (`responses/` marşrutunun ümumi emalçısı tərəfindən istifadə olunur). ### 4.5 `open-sse/services/` Əsas məqamlar (tam siyahı `open-sse/services/` daxilindədir): -| Mövzu | Fayllar | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Kombinə edilmiş marşrutlaşdırma | `combo.ts` (19 strategiya), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Avtomatik Combo mühərriki | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Dayanıqlılıq | `accountFallback.ts` (gözləmə müddəti + bloklama), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kvotalar | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Keşləmə | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Marşrutlaşdırma intellekti | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Modelin idarə edilməsi | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Sıxışdırma | `compression/` — sıxışdırma mühərrikinin tam əlaqələndirilməsi | -| Token + sessiya | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Səviyyə / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / şəbəkə | `ipFilter.ts`, `webSearchFallback.ts` | -| Paketlər | `batchProcessor.ts` | -| İstifadə | `usage.ts` | +| Məsələ | Fayllar | +| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Kombinə edilmiş marşrutlaşdırma | `combo.ts` (19 strategiya), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Avtomatik Combo mühərriki | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Dayanıqlılıq | `accountFallback.ts` (gözləmə müddəti + bloklama), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kvotalar | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Keşləmə | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Marşrutlaşdırma intellekti | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Modelin idarə edilməsi | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Sıxılma | `compression/` — sıxılma mühərrikinin tam bağlantısı | +| Token + sessiya | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Səviyyə / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / şəbəkə | `ipFilter.ts`, `webSearchFallback.ts` | +| Paketlər | `batchProcessor.ts` | +| İstifadə | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - `server.ts` daxilində əlaqələndirilmiş **110 unikal alət** (`schemas/tools.ts` daxilində 45 kanonik alət + yaddaş, bacarıqlar, GitHub bacarıqları, hovuz, oyunlaşdırma, plagin, Notion, Obsidian, - lokal korpus və sıxışdırma modulları — birləşmə `countUniqueMcpTools` tərəfindən hesablanır). + lokal korpus və sıxılma modulları — birləşmə `countUniqueMcpTools` tərəfindən hesablanır). - **3 nəqliyyat mexanizmi**: stdio, HTTP Streamable, SSE. -- İcra zamanı məcburi tətbiq edilən **33 əhatə dairəsi** — əsas siyahı `src/shared/constants/mcpScopes.ts` daxilindədir, tam dəst isə hər bir alət modulunun elan etdiyi əhatə dairələrinin birləşməsidir. +- İcra zamanı tətbiq edilən **33 əhatə dairəsi** — əsas siyahı `src/shared/constants/mcpScopes.ts` daxilındədir, tam dəst isə hər bir alət modulunun elan etdiyi əhatə dairələrinin birləşməsidir. - Audit cədvəli: `mcp_tool_audit` (`audit.ts` tərəfindən doldurulur). - Fayllar: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - həmçinin `__tests__/` daxilindəki testlər. -- Tam alət kataloqu üçün [MCP-SERVER.md](../frameworks/MCP-SERVER.md) sənədinə baxın. + həmçinin `__tests__/` altındakı testlər. +- Alətlərin tam kataloqu üçün [MCP-SERVER.md](../frameworks/MCP-SERVER.md) sənədinə baxın. ### 4.7 `open-sse/config/` Provayder reyestrləri (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), hər format üçün model reyestrləri (`audioRegistry.ts`, +`providerHeaderProfiles.ts`), hər format üzrə model reyestrləri (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), identifikasiya köməkçiləri (`codexIdentity.ts`, `codexInstructions.ts`, @@ -655,7 +655,7 @@ bin/ ## 8. `scripts/` -Təyinatına görə 6 alt qovluqda təşkil olunub. +Təyinatına görə 6 alt qovluqda təşkil edilib. - **`scripts/build/`** — `build-next-isolated.mjs`, `prepublish.ts`, `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, diff --git a/docs/i18n/az/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/az/docs/architecture/RESILIENCE_GUIDE.md index ba63658e5481..12f8ec173e39 100644 --- a/docs/i18n/az/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/az/docs/architecture/RESILIENCE_GUIDE.md @@ -70,9 +70,9 @@ Reqressiyadan qorunma testi: `tests/unit/provider-cooldown-window-gate.test.ts`. **Əhatə dairəsi:** tək provayder bağlantısı/hesabı/açarı. -**Məqsəd:** eyni provayderə aid digər bağlantılar xidmət göstərməyə davam edərkən bir problemli açarı ötürmək. +**Məqsəd:** eyni provayderə aid digər bağlantılar xidmət göstərməyə davam edərkən nasaz bir açarı ötürmək. -**Tətbiq:** +**İcra:** - Əlçatmaz kimi işarələmə: `src/sse/services/auth.ts::markAccountUnavailable()` - Seçim: eyni fayldakı `getProviderCredentials*` @@ -81,64 +81,124 @@ Reqressiyadan qorunma testi: `tests/unit/provider-cooldown-window-gate.test.ts`. **Hər bağlantı üzrə sahələr:** -- `rateLimitedUntil` — gözləmə müddəti bitənədək zaman damğası +- `rateLimitedUntil` — gözləmə müddətinin bitdiyi vaxt damğası - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — eksponensial geri çəkilmə sayğacı -**Standart gözləmə müddətləri:** +**Defolt gözləmə müddətləri:** -- OAuth bazası: 5s -- API açarı bazası: 3s -- API açarı üçün 429: yuxarı axından gələn `Retry-After`/sıfırlama başlıqlarına/təhlil edilə bilən sıfırlama mətninə üstünlük verir +- OAuth bazası: 5 san. +- API açarı bazası: 3 san. +- API açarı üçün 429: yuxarı axının `Retry-After`/sıfırlama başlıqlarına/pars edilə bilən sıfırlama mətninə üstünlük verir - Geri çəkilmə: `baseCooldownMs * 2 ** failureIndex` -**Kütləvi eyni vaxtlı sorğu qoruyucusu:** paralel xətaların gözləmə müddətini həddindən artıq uzatmasının və ya `backoffLevel` dəyərini iki dəfə artırmasının qarşısını alır. +**Eyni anda sorğu axınının qarşısını alan qoruyucu mexanizm:** paralel xətaların gözləmə müddətini həddən artıq uzatmasının və ya `backoffLevel` dəyərini iki dəfə artırmasının qarşısını alır. -**Terminal vəziyyətlər (gözləmə müddətləri DEYİL):** +**Terminal vəziyyətlər (gözləmə müddəti DEYİL):** -- `banned` — qadağan olunmuş açar söz / hesab qadağası aşkarlanması ilə (bax: [BAN_DETECTION](../security/BAN_DETECTION.md)) və hər sorğu üzrə yuxarı axından ardıcıl üç imtina ilə (`request_rejected`, məsələn, Anthropic OAuth 403 "Sorğuya icazə verilmir" — `open-sse/services/requestRejectedStreak.ts`) təyin edilir; tək bir imtina yalnız bağlantını gözləmə vəziyyətinə keçirir -- `expired` (məhdud sayda təkrar cəhddən sonra terminal vəziyyətə keçir — eksponensial geri çəkilmə ilə `EXPIRED_RETRY_MAX = 3` — beləliklə, keçici OAuth xətaları hesab həmişəlik deaktiv edilməzdən əvvəl öz-özünə bərpa oluna bilər) +- `banned` — qadağan edilmiş açar söz / hesab qadağası aşkarlanması ilə (baxın: [BAN_DETECTION](../security/BAN_DETECTION.md)), həmçinin yuxarı axından hər sorğu üzrə ardıcıl üç imtina ilə təyin edilir (`request_rejected`, məsələn, Anthropic OAuth 403 "Sorğuya icazə verilmir" — `open-sse/services/requestRejectedStreak.ts`); tək bir imtina yalnız bağlantını gözləmə rejiminə keçirir +- `expired` (məhdud sayda təkrar cəhddən sonra terminal vəziyyətə keçir — eksponensial geri çəkilmə ilə `EXPIRED_RETRY_MAX = 3` — beləliklə, müvəqqəti OAuth xətaları hesab həmişəlik deaktiv edilməzdən əvvəl öz-özünə bərpa oluna bilər) - `credits_exhausted` -Bu vəziyyətlər giriş məlumatları dəyişənədək və ya operator onları sıfırlayanadək qalır. Terminal vəziyyətləri keçici gözləmə vəziyyəti ilə əvəz etməyin. +Bunlar giriş məlumatları dəyişənə və ya operator onları sıfırlayana qədər qalır. Terminal vəziyyətləri müvəqqəti gözləmə vəziyyəti ilə əvəz etməyin. + +**Tənbəl bərpa:** `rateLimitedUntil` vaxtı keçdikdə bağlantı yenidən uyğun olur. Uğurlu istifadədən sonra `clearAccountError()` bütün xəta sahələrini təmizləyir. -**Tənbəl bərpa:** `rateLimitedUntil` keçdikdə bağlantı yenidən uyğun olur. Uğurlu istifadədən sonra `clearAccountError()` bütün xəta sahələrini təmizləyir. +### Claude OAuth istifadə həddi: aşağı prioritetli kanal + sessiya limitinin sıfırlanması -### Sessiya yaxınlığı (#7274) +**Əhatə dairəsi:** bir Claude abunəliyi (OAuth) bağlantısı. Hər iki funksiya **hər bağlantı üçün ayrıca aktivləşdirilir** +(Bağlantını redaktə et → Claude bölməsi → `providerSpecificData` daxilində `lowPriorityMode` / `autoLimitReset`, +hər ikisi defolt olaraq söndürülüb) və Claude Code-un `/low-priority` və +`/limit-reset` əmrlərini əks etdirir (protokol müqaviləsi Claude Code 2.1.263-dən götürülüb). -**Əhatə dairəsi:** **istənilən** provayder üçün bir bağlantıya bərkidilmiş bir müştəri sessiyası (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` başlığı). +**İcra:** -**Məqsəd:** çoxgedişli agenti (Claude Code, aider, fərdi agentlər) sorğular arasında eyni hesabda saxlamaqla hesablararası kontekst itkisini və hesab üzrə sessiya vəziyyəti saxlayan provayderlərdə təkrarlanan soyuq başlanğıc 429 xətalarını azaltmaq. +- Vəziyyət maşını + cavab təsnifatı: `open-sse/services/claudeLowPriority.ts` +- Sıfırlama statusu/iddia müştərisi: `open-sse/services/claudeLimitReset.ts` +- İcra mexanizminin qarmağı (başlığın əlavə edilməsi + eyni hesabla təkrar cəhd): `open-sse/executors/base.ts::execute()` +- Aktivləşdirmə seçiminin saxlanması: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Tətikləyici:** 5 saatlıq istifadə həddi — başlıqlarında +`anthropic-ratelimit-unified-status: rejected` və hesab uyğun olduqda +`anthropic-ratelimit-unified-slow-offer: treatment` olan `429`. Həmin ilk hədd +429 cavabından əvvəl heç nə göndərilmir; vahid başlıqları olmayan intensiv 429 axını normal gözləmə müddəti yolu ilə emal olunur. + +**Aşağı prioritetli kanal** (`lowPriorityMode`): + +- Hədd üzrə 429 cavabında icra mexanizmi təklifi qəbul edir və dərhal **eyni** + hesabla `anthropic-usage-limit: slow` başlığından istifadə edərək yenidən cəhd edir; kanal elan edilmiş + `anthropic-ratelimit-unified-reset` vaxtına (+60 san. güzəşt müddəti) qədər aktiv qalır və həmin zaman + pəncərəsindəki hər sorğu bu başlığı daşıyır. Tutulmuş 429 cavabı heç vaxt `handleChatCore` funksiyasına + çatmır, buna görə də bağlantı gözləmə rejiminə keçirilmir və başqa bağlantı ilə əvəzlənmir. +- Sonrakı cavablardakı `anthropic-ratelimit-unified-slow-status`: `active` / `not_needed` + kanalı saxlayır; `slot_busy` (429) və ya `529` serverin + `anthropic-ratelimit-unified-slow-retry-after` müddətini gözləyir (defolt 20 san., 5–600 san. həddində məhdudlaşdırılır, ±30% təsadüfi yayınma) + və `anthropic-ratelimit-unified-slow-max-wait` ilə məhdudlaşdırılmış şəkildə yenidən cəhd edir (defolt 20 dəq., 1 dəq.–6 saat + həddində məhdudlaşdırılır) — bu müddət keçdikdən sonra kanal bağlanır və 10 dəqiqəlik fasilə + yenidən qəbulu bloklayır. Gözləmə müddəti əlavə olaraq sorğunun öz yuxarı axın başlanğıcı üçün taymautundan + (`resolveFetchStartTimeout`, defolt olaraq 10 dəq.) qalan müddət minus 5 san. ilə məhdudlaşdırılır: bu məhdudiyyət olmasaydı, + 20 dəqiqəlik defolt maksimum gözləmə sorğunun ömrünü aşar və gözləmə zamanı yuxu dayandırılaraq + səliqəli `max_wait` sonluğu + fasilə əvəzinə `TimeoutError` göstərilərdi. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, 5 saatlıq pəncərənin yenilənməsi və ya + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (ödənişli əlavə istifadə artıq həddi qarşıladığı üçün + istənilən statusda onu `extra_usage` kimi tamamlayır) kanalı bağlayır; bundan sonra + cavab normal gözləmə müddəti yolu ilə emal olunur. `budget_exhausted` elan edilmiş büdcə sıfırlanmasına qədər + (≤ 8 gün) yadda saxlanılır. +- Hədd yoxlaması icra mexanizminin öz 400 cavabı ilə başladılan cəhdaxili təkrarlarından (kontekstin + redaktəsi, düşünmə/səy məhdudiyyətləri, parametrin avtomatik öyrənilməsi) sonra işləyir, beləliklə, yalnız + bu təkrarlardan birində üzə çıxan hədd üzrə 429 cavabı gözləmə müddəti yoluna çatmaq əvəzinə yenə də tutulur. +- Vəziyyət hər bağlantı üzrə yaddaşda saxlanılır (yenidən başlatma təkrar qəbul üçün əlavə bir hədd üzrə 429 cavabına səbəb olur). + +**Sessiya limitinin sıfırlanması** (`autoLimitReset`, hər ikisi aktiv olduqda kanaldan əvvəl sınanır): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + bloku; `arm: "reset"` və `available: true` olduqda, + `{ "program": "juniper_tide" }` ilə + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` + (`providerSpecificData.organizationUUID` daxilindəki təşkilat UUID-si, ilkin yükləmə ehtiyat variantı). +- `result: reset|not_limited` → sorğu tam sürətlə yenidən sınanır (yavaş rejim başlığı olmadan). + `already_used` / `not_offered` dəyərləri `next_available_at` dəyərini yadda saxlayır (defolt olaraq bir həftə); + istənilən xəta 15 dəqiqəlik geri çəkilməyə səbəb olur. Sıfırlama həftədə bir dəfədir və yenə də + həftəlik limitə daxil edilir. + +Reqressiyadan qorunma testləri: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + +### Sessiya bağlılığı (#7274) + +**Əhatə dairəsi:** **istənilən** provayder üçün bir bağlantıya bağlanmış bir müştəri sessiyası (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` başlığı). + +**Məqsəd:** çoxturlu agenti (Claude Code, aider, xüsusi agentlər) sorğular arasında eyni hesabda saxlamaq, hesablararası kontekst itkisini və hesab üzrə sessiya vəziyyətinə malik provayderlərdə təkrarlanan soyuq başlanğıc `429` xətalarını azaltmaq. -**Tətbiq:** +**İcra:** -- TTL-in müəyyənləşdirilməsi: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Bərkitmənin seçilməsi/yaradılması: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- TTL-in müəyyən edilməsi: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- Pin seçimi/yaradılması: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Başlığın çıxarılması (ümumi, istənilən provayder): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Daimi bərkitmə cədvəli: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Parametr: `sessionAffinityTtlMs` (ms ilə qlobal TTL, `0` deaktiv edir) — `src/lib/db/settings.ts`. Yalnız Codex üçün olan `codexSessionAffinityTtlMs` adından `124_generic_session_affinity_ttl.sql` miqrasiyası ilə dəyişdirilib; bu miqrasiya əvvəlcədən konfiqurasiya edilmiş istənilən Codex TTL-ni yeni standart dəyər kimi köçürür. +- Daimi saxlanılan pin cədvəli: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Parametr: `sessionAffinityTtlMs` (ms ilə qlobal TTL, `0` deaktiv edir) — `src/lib/db/settings.ts`. Yalnız Codex üçün olan `codexSessionAffinityTtlMs` adından `124_generic_session_affinity_ttl.sql` miqrasiyası vasitəsilə dəyişdirilib; bu miqrasiya əvvəllər konfiqurasiya edilmiş istənilən Codex TTL dəyərini yeni standart dəyər kimi köçürür. -#7274-dən əvvəl `resolveSessionAffinityTtlMs()`, `codex` istisna olmaqla, hər provayder üçün dərhal `0` qaytarırdı, buna görə də bərkitmə mexanizmi və başlıqların çıxarılması artıq provayderdən asılı olmasa da, TTL parametrinin (və sessiya başlıqlarının) başqa heç bir yerdə təsiri yox idi. Düzəliş həmin erkən qayıdışı aradan qaldırdı; TTL qlobal olaraq `0`-dan yuxarı təyin edildikdən sonra bütün provayderlərə eyni qaydada tətbiq olunur. +#7274-dən əvvəl `resolveSessionAffinityTtlMs()` `codex` istisna olmaqla hər bir provayder üçün dərhal `0` qaytarırdı, buna görə də pinləmə mexanizmi və başlıq çıxarılması artıq provayderdən asılı olmasa da, TTL parametri (və sessiya başlıqları) başqa heç bir yerdə təsir göstərmirdi. Düzəliş həmin erkən çıxışı aradan qaldırdı; TTL qlobal olaraq `0`-dan yuxarı təyin edildikdən sonra bütün provayderlərə vahid şəkildə tətbiq olunur. -Üç sessiya yaxınlığı başlığı heç vaxt yuxarı axına ötürülmür — icraedicilər müştəri başlıqlarını olduğu kimi ötürmək əvəzinə öz yuxarı axın başlıqlarını sıfırdan yaradırlar, buna görə də bu, yalnız daxili korrelyasiya identifikatoru olaraq qalır. +Üç sessiya yaxınlığı başlığının heç biri yuxarı axına ötürülmür — icraedicilər müştəri başlıqlarını olduğu kimi ötürmək əvəzinə öz yuxarı axın başlıqlarını sıfırdan qururlar, buna görə də bu, yalnız daxili korrelyasiya identifikatoru olaraq qalır. ### Eksklüziv idarə olunan sessiya bağlantısı icarələri **Əhatə dairəsi:** bir aktiv idarə olunan HTTP müştərisi/sessiyası bir uyğun OmniRoute bağlantısına sahib olur. -**Məqsəd:** sorğular arasında sərt marşrutlaşdırma sərhədinə ehtiyacı olan müştərilər üçün davamlı eksklüziv bağlantı sahibliyi təmin etmək. Bu, yumşaq davamlılıq üstünlüyü olan sessiya yaxınlığından fərqlənir: eksklüziv icarə həyat dövrü vəziyyətini SQLite-da saxlayır, qlobal aktiv sahib və aktiv bağlantı unikallığını tətbiq edir və provayderə göndərilməzdən əvvəl köhnəlmiş nəsli rədd edir. +**Məqsəd:** sorğular arasında sərt marşrutlaşdırma sərhədinə ehtiyac duyan müştərilər üçün davamlı eksklüziv bağlantı sahibliyi təmin etmək. Bu, yumşaq davamlılıq üstünlüyü olan sessiya yaxınlığından fərqlənir: eksklüziv icarə həyat dövrü vəziyyətini SQLite-da saxlayır, qlobal aktiv sahib və aktiv bağlantı unikallığını təmin edir və provayderə göndərişdən əvvəl köhnəlmiş nəsli rədd edir. -Bu funksiya hər API açarı üçün ayrıca aktivləşdirilir. İdarə olunan açar `lease:exclusive` əhatə dairəsinə və açıq şəkildə göstərilmiş boş olmayan `allowedConnections` siyahısına malik olmalıdır. İstənilən HTTP müştərisi həyat dövrü son nöqtəsindən istifadə edə bilər; müştəri adı, istifadəçi agenti, provayder, OAuth metodu və ya model tələb olunmur. İcarə modelə deyil, bağlantıya sahib olur, buna görə də bağlantı adi qaydada uyğun qaldığı müddətdə model dəyişikliyi bağlılığı qoruyur. Normal model, kvota, sağlamlıq, gözləmə müddəti və icazə siyahısı qaydaları əsas olaraq qalır və eyni nəsli başqa sərbəst uyğun bağlantıya keçirə bilər. +Funksiya hər API açarı üçün ayrıca aktivləşdirilir. İdarə olunan açar `lease:exclusive` əhatə dairəsinə və açıq şəkildə göstərilmiş, boş olmayan `allowedConnections` siyahısına malik olmalıdır. İstənilən HTTP müştərisi həyat dövrü son nöqtəsindən istifadə edə bilər; müştəri adı, user-agent, provayder, OAuth metodu və ya model tələb olunmur. İcarə modelə deyil, bağlantıya sahib olur, buna görə də bağlantı adi qaydada uyğun qaldığı müddətdə model dəyişikliyi bağlanmanı qoruyur. Normal model, kvota, sağlamlıq, gözləmə müddəti və icazə siyahısı qaydaları qüvvədə qalır və eyni nəsli başqa sərbəst uyğun bağlantıya keçirə bilər. -Həyat dövrü `acquire`, `renew` və `release` JSON əməliyyatları ilə `POST /api/v1/session-leases` şəklindədir. İdarə olunan nəticəçıxarma sorğuları qeyri-şəffaf `X-OmniRoute-Lease-Owner` dəyərini və dəqiq `X-OmniRoute-Lease-Generation` dəyərini təqdim edir. Sahib identifikatoru `vlo_` prefiksindən və ardınca gələn 43 base64url simvolundan ibarətdir; yalnız onun SHA-256 heşi saxlanılır. Hər yekun göndəriş sərhədi həmçinin autentifikasiya edilmiş API açarı ID-sini və aktiv bağlantı ID-sini əlaqələndirir. İcarə idarəetmə başlıqları jurnallardan, saxlanılan sorğu anlıq görüntülərindən və yuxarı axın icraedicisinin başlıqlarından silinir. +Həyat dövrü `acquire`, `renew` və `release` JSON əməliyyatları ilə `POST /api/v1/session-leases` vasitəsilə idarə olunur. İdarə olunan çıxarış sorğuları qeyri-şəffaf `X-OmniRoute-Lease-Owner` dəyərini və dəqiq `X-OmniRoute-Lease-Generation` dəyərini təqdim edir. Sahib identifikatoru `vlo_` prefiksindən və ardınca gələn 43 base64url simvolundan ibarətdir; yalnız onun SHA-256 heşi saxlanılır. Hər yekun göndəriş sərhədi həmçinin autentifikasiya edilmiş API açarı ID-sini və aktiv bağlantı ID-sini bağlayır. İcarəyə nəzarət başlıqları jurnallardan, saxlanılan sorğu anlıq görüntülərindən və yuxarı axın icraedici başlıqlarından silinir. -Adi marşrutlaşdırmanın uyğun idarə olunan namizədləri varsa, lakin hər sərbəst namizəd xarici aktiv icarə tərəfindən tutulubsa, OmniRoute HTTP `429`, icarə tutumunun əlçatmazlığı kodu, tutum gözləmə vəziyyəti və ən erkən uyğun bitmə vaxtından hesablanan məhdud `Retry-After` qaytarır. Uyğunluğun adi qaydada boş olması icarə mübahisəsi deyil və mövcud marşrutlaşdırma xətası semantikasını qoruyur. +Adi marşrutlaşdırmada uyğun idarə olunan namizədlər mövcuddursa, lakin bütün sərbəst namizədlər başqa aktiv icarələr tərəfindən tutulubsa, OmniRoute HTTP `429`, lease-capacity-unavailable kodu, tutum gözləmə vəziyyəti və ən erkən müvafiq bitmə vaxtından hesablanan məhdud `Retry-After` qaytarır. Adi uyğunluq siyahısının boş olması icarə çəkişməsi deyil və mövcud marşrutlaşdırma xətası semantikasını qoruyur. Əlaqəli mexanizmlər ayrı qalır: -- OAuth sessiya məşğulluğu OAuth hesabları üçün prosesdaxili yumşaq paylamadır. -- Hesab semaforları sorğu paralelliyi icazələri verir və sorğu tamamlandıqda başa çatır. +- OAuth sessiya məşğulluğu OAuth hesabları üçün proses daxilində yumşaq paylamadır. +- Hesab semaforları sorğu paralelliyi icazələri verir və sorğu tamamlandıqda bitir. - Eksklüziv idarə olunan sessiya icarələri nəsil sərhədinə malik davamlı həyat dövrü sahibliyidir. --- @@ -280,54 +340,80 @@ səbəbləri üçün heç vaxt gözləmir. --- -## 5. Sorğu növbəsinə qəbul nəzarəti (v3.8.49 · issue #6593) - -**Əhatə dairəsi**: yuxarıdakı üç mexanizmdən bir səviyyə aşağıda yerləşən, -hər provayder+bağlantı üzrə lokal sürət məhdudiyyəti növbəsi -(`open-sse/services/rateLimitManager.ts`, Bottleneck əsasında). - -**`maxWaitMs` icranın vaxt aşımı üçün saxlanılmış köhnə addır.** -`resilienceSettings.requestQueue.maxWaitMs` Bottleneck-ə `expiration` tapşırıq -parametri kimi ötürülür və onun taymeri yalnız yönləndirmədən sonra başlayır. -Buna görə də bu parametr lokal növbədə sərf olunan vaxtı deyil, məhdudlaşdırıcı -tərəfindən idarə olunan icranı məhdudlaşdırır. Vaxt aşımı etibarlı lokal -`code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) kimi təqdim olunur; -əvvəlki növbə vaxt aşımı kodunun adı yalnız etibarlı daxili geriyə uyğunluq -üçün qəbul edilir. Standart dəyər 15000ms-dir; onu `RATE_LIMIT_MAX_WAIT_MS` -(mühit dəyişəni) və ya idarəetmə paneli (**Settings → Resilience**, -UI-də 1–30000ms yuxarı həddi) vasitəsilə dəyişdirin. Növbədə qalma vaxtı üçün -son müddət yoxdur; növbədəki sorğuların sayını məhdudlaşdırmaq üçün aşağıdakı -`maxQueueDepth` parametrindən istifadə edin. - -**`maxQueueDepth` — seçimlə aktivləşdirilən qəbul həddi (yeni).** -`resilienceSettings.requestQueue.maxQueueDepth` eyni anda bir -provayder+bağlantı üçün neçə sorğunun növbədə (hələ yönləndirilməmiş) qala -biləcəyini məhdudlaşdırır. Növbədə artıq `maxQueueDepth` sayda sorğu olduqda, -yeni sorğu `limiter.schedule()` mərhələsinə çatmamışdan **əvvəl** -`code: "RATE_LIMIT_QUEUE_FULL"` tipli xəta ilə dərhal rədd edilir — beləliklə, -rəddetmə az resurs tələb edir və həmin sorğu üçün sonrakı prompt sıxılması / -tərcümə işlərindən əvvəl baş verir. Standart `0` = deaktivdir və mövcud -məhdudiyyətsiz növbə davranışını qoruyur; icazə verilən diapazon 0–100000-dir. -`RATE_LIMIT_MAX_QUEUE_DEPTH` (mühit dəyişəni) və ya -`resilienceSettings.requestQueue.maxQueueDepth` (idarəetmə paneli/API yaması) -vasitəsilə dəyişdirin. +## 5. Sorğu Növbəsinə Qəbul Nəzarəti (v3.8.49 · məsələ #6593) + +**Əhatə dairəsi**: yuxarıdakı üç mexanizmdən bir səviyyə aşağıda yerləşən, hər provider+connection üçün lokal sürət məhdudiyyəti növbəsi (`open-sse/services/rateLimitManager.ts`, +Bottleneck əsasında). + +**`maxWaitMs` növbədə gözləmə müddətini, `executionMaxWaitMs` isə icra müddətini məhdudlaşdırır.** +Bu ikisi qəsdən ayrıdır və heç biri digərinə təsir etmir. + +`resilienceSettings.requestQueue.maxWaitMs` **növbədə gözləmə büdcəsidir**: o, +provider slotunun boşalmasını gözləməyi və sonra QUEUED vəziyyətində qalmağı +əhatə edir; tapşırıq QUEUED vəziyyətindən çıxıb icraya başlayan kimi onun +taymeri silinir (`rateLimitManager.ts`, `wrappedFn`). Bu müddəti aşan sorğu +heç vaxt yuxarı axındakı xidmətə çatmır. Defolt dəyər 30000ms-dir, +`src/lib/resilience/settings.ts` daxilindəki `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +tərəfindən təmin edilir və +`tests/unit/ratelimit-admission-control-6593.test.ts` tərəfindən sabitlənir; +beləliklə, onun dəyişdirilməsi bu paraqrafı səssizcə köhnəlmiş saxlamaq əvəzinə +həmin testi uğursuz edir. + +`resilienceSettings.requestQueue.executionMaxWaitMs` Bottleneck-ə tapşırığın +`expiration` dəyəri kimi ötürülür və onun taymeri yalnız yönləndirmədən sonra +işə düşür. Bu, öz yuxarı axın taymautu olmayan icraçılar üçün ehtiyat +mexanizmidir və icraçının öz fetch-start taymautu daha uzun olduqda həmin +dəyərə yüksəldilir; beləliklə, normal şəkildə davam edən cavabı yarıda kəsə +bilməz. Defolt dəyər 600000ms-dir (10 dəq). + +Növbə büdcəsinin `expiration` parametrinə ötürülməsi əvvəllər qeyri-inkremental +şlüzləri icranın ortasında dayandırırdı — onlar ilk baytları göndərməzdən əvvəl +haqlı olaraq bir neçə dəqiqə işləyə bilərlər — və buna görə də müddətin bitməsi +`code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) kimi təqdim olunur, növbə +büdcəsi isə növbə taymautu kodunu daşıyır. Hər iki dəyəri +`RATE_LIMIT_MAX_WAIT_MS` / `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (mühit dəyişəni) +və ya idarə paneli (**Settings → Resilience**) vasitəsilə dəyişdirin. +Normallaşdırılarkən hər ikisi 1ms–24h aralığı ilə məhdudlaşdırılır. + +**Hər ikisi üçün prioritet:** mühit dəyişəni yalnız _defolt_ dəyəri təmin edir. +`resilienceSettings.requestQueue` daxilində saxlanılmış dəyər (idarə paneli / +API patch, `key_value` daxilində saxlanılır) onu üstələyir, hər connection üçün +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` isə həmin dəyəri də +üstələyir. Buna görə də artıq saxlanılmış dəyəri olan yerləşdirmədə mühit +dəyişəninin təyin edilməsi heç nəyi dəyişmir — bunun əvəzinə saxlanılmış +parametri silin və ya yeniləyin. + +Növbədə qalma müddəti `maxWaitMs` ilə məhdudlaşdırılır; aşağıdakı +`maxQueueDepth` isə eyni vaxtda neçə çağırışçının növbədə ola biləcəyini +məhdudlaşdırır. + +**`maxQueueDepth` — aktivləşdirilməsi seçimə bağlı qəbul limiti (yeni).** `resilienceSettings.requestQueue.maxQueueDepth` +bir provider+connection üçün eyni vaxtda neçə sorğunun növbədə (hələ +yönləndirilməmiş) qala biləcəyini məhdudlaşdırır. Növbədə artıq +`maxQueueDepth` sayda sorğu olduqda yeni sorğu `limiter.schedule()` metoduna +çatmamışdan **əvvəl** tipli `code: "RATE_LIMIT_QUEUE_FULL"` xətası ilə dərhal +rədd edilir — beləliklə, rəddetmə az resurs tələb edir və həmin sorğu üçün hər +hansı aşağı axın prompt sıxışdırması / tərcümə işi başlamazdan əvvəl baş verir. +Defolt `0` = deaktivdir və mövcud məhdudiyyətsiz növbə davranışını qoruyur; +0–100000 aralığı ilə məhdudlaşdırılır. Dəyəri `RATE_LIMIT_MAX_QUEUE_DEPTH` +(mühit dəyişəni) və ya `resilienceSettings.requestQueue.maxQueueDepth` +(idarə paneli/API patch) vasitəsilə dəyişdirin. Qəbul yoxlamasının özü saf funksiyadır -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), buna görə -də real Bottleneck məhdudlaşdırıcısı olmadan vahid testlərlə yoxlana bilər. - -> #6593-ü başladan RFC həmçinin `bypassCompressionOnRateLimit` -> bayrağını təklif etmişdi. Bu repozitorinin `open-sse/services/compression/` -> konveyeri sintez edilmiş 429 cavab gövdələrində HTTP cavab sıxılması deyil, -> çıxan LLM sorğusunun prompt/kontekst sıxılmasıdır (`chatCore.ts`, -> `resolveCompressionSettings`/`selectCompressionStrategy` blokunun ətrafı) — -> literal keçid bayrağına uyğun gələn kod yolu yoxdur. Həmin prompt sıxılması -> addımı hazırda sorğu konveyerində `withRateLimit()` çağırışından _əvvəl_ -> icra olunur; buna görə də növbənin dolu olması səbəbilə rəddetmə zamanı onu -> ötürmək üçün ardıcıllığın dəyişdirilməsi bu məsələnin əhatə dairəsindən ayrı -> və daha böyük dəyişiklikdir. Bu funksiya burada qəsdən **tətbiq edilməyib** və -> CPU resurslarına qənaətin qazancı ardıcıllığın dəyişdirilməsi riskinə dəyərsə, -> sonrakı iş kimi saxlanılıb. +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), buna +görə də real Bottleneck məhdudlaşdırıcısı olmadan vahid testlərlə yoxlana bilər. + +> #6593 məsələsini açan RFC həmçinin `bypassCompressionOnRateLimit` +> bayrağını təklif edirdi. Bu repozitorinin `open-sse/services/compression/` +> konveyeri sintez edilmiş 429 gövdələrində HTTP cavab sıxışdırması deyil, +> çıxan LLM sorğusunun prompt/kontekst sıxışdırılmasıdır (`chatCore.ts`, +> `resolveCompressionSettings`/`selectCompressionStrategy` bloku ətrafında) +> — hərfi bypass bayrağına uyğun kod yolu yoxdur. Həmin prompt sıxışdırma +> addımı hazırda sorğu konveyerində `withRateLimit()` çağırışından _əvvəl_ də +> icra olunur; buna görə də növbə dolu olduqda rəddetmə zamanı onu ötürmək üçün +> ardıcıllığın dəyişdirilməsi bu məsələnin əhatə dairəsindən ayrı və daha böyük +> dəyişiklikdir. Bu, burada qəsdən **həyata keçirilməyib** və CPU qənaəti +> ardıcıllığın dəyişdirilməsi riskinə dəyərsə, sonrakı iş kimi saxlanılıb. --- diff --git a/docs/i18n/az/docs/architecture/admission-lanes.md b/docs/i18n/az/docs/architecture/admission-lanes.md index 18b5baed2e2e..a5abd897d5fe 100644 --- a/docs/i18n/az/docs/architecture/admission-lanes.md +++ b/docs/i18n/az/docs/architecture/admission-lanes.md @@ -7,53 +7,55 @@ OmniRoute müxtəlif əhatə dairələrinə malik **iki** proses-lokal zolaq sisteminə malikdir. Onlar bir-birini tamamlayır; operatorlar hansına baxdıqlarını bilməlidirlər. -## 1. Bayt səviyyəsində, bütün proses üzrə qəbul (`chatBodyAdmission.ts`) - -- **Əhatə dairəsi:** `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` və digər çat formalı marşrutlar üçün - buferlənmiş sorğu gövdəsi/heap yolu. Böyük kodlaşdırma agenti gövdələrinin - yaratdığı heap amplifikasiyasından qoruyur (#4380). -- **Hər açar üçün ayrıca zolaqlar deyil, proses üzrə bir qlobal kontroller (#10110).** Hər API açarı - (heşlənmiş) və ya `anonymous` sessiyası **eyni** ortaq büdcə üzrə qəbul edilir — - heşlənmiş sessiya ID-si YALNIZ ədalətli planlaşdırma açarı kimi (gözləyənlər - arasında dairəvi növbə ilə yönləndirmə) istifadə olunur, heç vaxt tutum şardı - kimi istifadə edilmir. Bu sənədin əvvəlki versiyasında müstəqil tutuma malik - hər açar üçün ayrıca zolaqlar təsvir edilirdi; autentifikasiya olunmamış saxta - etimadnamələrin proses üzrə limiti çoxaltmasına imkan verdiyi üçün həmin model - #10110 çərçivəsində ləğv edildi. +## 1. Bayt səviyyəsində proses miqyaslı qəbul (`chatBodyAdmission.ts`) + +- **Əhatə dairəsi:** `POST /v1/chat/completions`, `/v1/messages`, + `/v1/responses` və digər çat tipli marşrutlar üçün buferlənmiş gövdə/heap yolu. + Böyük kodlaşdırma agenti gövdələrinin yaratdığı heap amplifikasiyasından qoruyur (#4380). +- **Hər açar üçün ayrıca zolaqlar deyil, proses üzrə vahid qlobal kontroller (#10110).** Hər API açarı + (heşlənmiş) və ya `anonymous` sessiya **eyni** ortaq büdcə əsasında qəbul edilir — + heşlənmiş sessiya id-si YALNIZ ədalətli planlaşdırma açarı kimi (gözləyənlər arasında + növbəli göndəriş) istifadə olunur, heç vaxt tutum seqmenti kimi istifadə edilmir. Bu + sənədin əvvəlki versiyasında müstəqil tutuma malik, hər açar üçün ayrıca zolaqlar + təsvir edilmişdi; həmin model #10110-da silindi, çünki autentifikasiyadan keçməmiş + saxta giriş məlumatları proses miqyaslı həddi dəfələrlə artırmağa imkan verirdi. - **Keçid (#503-fanout): sabit sorğu sayı deyil, avtomatik hesablanan qəbul BAYT büdcəsi.** Köhnə `CHAT_MAX_HEAVY_IN_FLIGHT` sorğu sayı limiti (bu düzəlişdən - əvvəl standart olaraq `1`) kodlaşdırma agentlərinin genişlənməsini (çoxsaylı - subagentlər/CLI-lər, müntəzəm olaraq > 256 KB olan gövdələr) effektiv olaraq - ~1 paralellik səviyyəsinə endirirdi və tamamilə normal yük altında 503 xətasına - səbəb olurdu. İndi bu limit yalnız operator `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` - parametrini açıq şəkildə təyin etdikdə tətbiq olunur. Təyin edilmədikdə qəbul - əvəzində `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ilə — prosesin real yaddaş - tavanından avtomatik hesablanan büdcə ilə - (`src/shared/middleware/admissionBudget.ts`) məhdudlaşdırılır: - V8 heap limitindən və hər hansı cgroup/konteyner limitindən daha sərt olanın - 25%-i götürülür, 8x keçici amplifikasiya əmsalına bölünür və 8 MiB ilə - 2 GiB arasında məhdudlaşdırılır. Açıq şəkildə verilən əvəzləyici dəyərlərə də - eyni məhdudiyyətlər tətbiq olunur. Bu, heç bir env sazlaması olmadan - 512 MB-lıq konteynerdən 32 GB-lıq masaüstü sistemə qədər özünü miqyaslandırır. - Effektiv büdcəyə sığmayan gövdə dərhal `413 body_exceeds_budget` xətası ilə - rədd edilir; yalnız ayrı-ayrılıqda emal edilə bilən gövdələr arasındakı - rəqabət məhdudlaşdırılmış ədalət növbəsinə daxil olur. Canlı, çoxsiqnallı - resurs təzyiqi izləyicisi (V8 heap nisbəti, cgroup, PSI, OOM hadisələri — - `open-sse/utils/resourcePressurePolicy.ts`) `high` təzyiq altında - məhdudlaşdırılmış gözləmə müddətini qısaldır və hər hansı bayt qəbul edilməzdən - əvvəl `critical` təzyiq altında yükü dərhal `503 resource_pressure` ilə rədd edir. + əvvəl standart olaraq `1`) kodlaşdırma agentlərinin şaxələnməsini (çoxsaylı + subagentlər/CLI-lər, adətən > 256 KB olan gövdələr) faktiki olaraq ~1 paralellik + səviyyəsinə endirirdi və tamamilə normal yük altında 503 xətasına səbəb olurdu. + İndi bu limit yalnız operator `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` parametrini + açıq şəkildə təyin etdikdə tətbiq olunur. Təyin edilmədikdə qəbul əvəzinə + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ilə — prosesin real yaddaş həddindən + (`src/shared/middleware/admissionBudget.ts`) avtomatik hesablanan büdcə ilə + idarə olunur: V8 heap limiti ilə istənilən cgroup/konteyner limitindən daha sərt + olanın 25%-i götürülür, 8x müvəqqəti amplifikasiya əmsalına bölünür və 8 MiB ilə + 2 GiB arasında məhdudlaşdırılır. Açıq şəkildə verilən əvəzləmələrə də eyni + məhdudiyyətlər tətbiq olunur. Bu, mühit dəyişənlərini sazlamadan 512 MB-lıq + konteynerdən 32 GB-lıq masaüstü kompüterədək avtomatik miqyaslanır. Effektiv + büdcəyə sığmayan gövdə dərhal `413 body_exceeds_budget` xətası ilə rədd edilir; + yalnız ayrı-ayrılıqda emal edilə bilən gövdələr arasındakı rəqabət məhdud + ədalət növbəsinə daxil olur. Canlı, çoxsiqnallı resurs təzyiqi izləyicisi + (V8 heap nisbəti, cgroup, PSI, OOM hadisələri — + `open-sse/utils/resourcePressurePolicy.ts`) `high` təzyiq zamanı məhdud gözləmə + müddətini qısaldır və hələ heç bir bayt qəbul edilməzdən əvvəl `critical` + təzyiq zamanı dərhal `503 resource_pressure` xətası ilə yükü azaldır. Mövcud + olduqda PSI bu vahidin cgroup `memory.pressure` faylından oxunur + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` bütün + host miqyasındadır və yalnız fiziki serverdə / cgroup v1-də ehtiyat variant + kimi istifadə olunur, beləliklə svopinq edən host boşdayanan konteynerin 503 + xətası qaytarmasına səbəb ola bilməz. - **Sazlama:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — avtomatik hesablanan bayt büdcəsi üçün əvəzləyici dəyər - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — köhnə sorğu sayı limiti, yalnız açıq seçimlə aktivdir + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — avtomatik hesablanan bayt büdcəsinin əvəzlənməsi + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — köhnə sorğu sayı limiti, yalnız seçim əsasında - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503-dən əvvəl növbədə gözləmə müddəti (standart 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — növbəyə alınmış baytlar üçün heap klapanı (standart 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110-dan etibarən köhnəlmiş - və heç bir əməliyyat yerinə yetirmir (konfiqurasiya uyğunluğu üçün qəbul edilir, nəzərə alınmır) -- **Hesabatlar:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — o cümlədən - #503-fanout əlavələri: `inflightBytes`, `maxInflightBytes`, `budgetSource` + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — növbədəki baytlar üçün heap qoruyucu klapanı (standart 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110-dan + bəri köhnəlmiş və heç bir əməliyyat yerinə yetirməyən parametrlərdir (konfiqurasiya uyğunluğu üçün qəbul edilir, nəzərə alınmır) +- **Hesabatlar:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — həmçinin + #503-fanout əlavələri olan `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` və `countCapEnabled` - (standart yerləşdirmədə false — faktiki məhdudlaşdırıcının köhnə say limiti + (standart yerləşdirmədə false — faktiki məhdudlaşdırıcı amilin köhnə say limiti deyil, bayt büdcəsi olduğunu təsdiqləyir). ## 2. Adaptiv icra zamanı virtual zolaqları (`open-sse/services/admission`) diff --git a/docs/i18n/az/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/az/docs/frameworks/EMBEDDED-SERVICES.md index a7944ee355f1..91d9eaccd2b3 100644 --- a/docs/i18n/az/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/az/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,10 +5,10 @@ --- > **Versiya:** v3.8.44 -> **Son yenilənmə:** 2026-07-03 -> **Auditoriya:** Daxili xidmətləri (9Router, CLIProxyAPI, Mux, Bifrost) əlavə edən, dəstəkləyən və ya sazlayan mühəndislər. +> **Son yenilənmə:** 2026-09-09 +> **Auditoriya:** Daxili xidmətləri (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) əlavə edən, texniki baxışını həyata keçirən və ya sazlayan mühəndislər. -Daxili xidmətlər OmniRoute-un quraşdırdığı, nəzarət etdiyi və birinci dərəcəli marşrutlaşdırma hədəfləri kimi təqdim etdiyi, lokal şəkildə quraşdırılan köməkçi proses alətləridir. İnternet üzərindən API açarları vasitəsilə əlaqə qurulan xarici provayderlərdən fərqli olaraq, daxili xidmətlər OmniRoute ilə eyni maşında işləyir və loopback üzərindən əlaqə saxlayır. +Daxili xidmətlər OmniRoute-un quraşdırdığı, nəzarət etdiyi və tamhüquqlu marşrutlaşdırma hədəfləri kimi təqdim etdiyi, lokal olaraq quraşdırılan köməkçi proses alətləridir. Xarici provayderlərdən (internet üzərindən API açarları vasitəsilə əlaqə qurulan) fərqli olaraq, daxili xidmətlər OmniRoute ilə eyni maşında işləyir və geri dövrə interfeysi üzərindən əlaqə saxlayır. --- @@ -25,37 +25,38 @@ Daxili xidmətlər OmniRoute-un quraşdırdığı, nəzarət etdiyi və birinci --- -## 1. İcmal +## 1. Ümumi baxış -### Daxili xidmətlər nə üçün lazımdır? +### Niyə daxili xidmətlər? -Beş xidmət daxili şəkildə təqdim olunur: +Altı xidmət daxil edilib: -| Xidmət | npm paketi | Standart port | Məqsəd | -| --------------- | ----------------------------------------- | :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | OmniRoute-un alt provayder kimi istifadə edə biləcəyi süni intellekt marşrutlayıcısı. Modellər `9router/{sub}/{model}` kimi təqdim olunur | -| **CLIProxyAPI** | GitHub buraxılış binar faylı (`cliproxy`) | 8317 | Anthropic CLI autentifikasiya axınları üçün lokal proksi adapteri. OAuth tokenlərinin müddəti bitdikdə ehtiyat marşrutlaşdırma təmin edir | -| **Mux** | `mux` (başsız `mux server`) | 8322 | Lokal agent orkestrasiya demonu (coder/mux). Yalnız həyat dövrü idarə olunur — marşrutlaşdırma hədəfi deyil (LLM proksiləməsi yoxdur). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go süni intellekt şlüzünün relay backend-i. İşlədiyi zaman relay marşrutu (`/v1/relay/`) tərəfindən avtomatik seçilir | -| **Dario** | `@askalf/dario` | 3456 | Claude abunəliyi proksisi — Claude-Code formatlı trafik üçün CLIProxyAPI-yə alternativ/ehtiyat həll; inyeksiya edilmiş açar onun `/admin/*` OAuth idarəetmə müstəvisinə girişi məhdudlaşdıran `DARIO_ADMIN_TOKEN` olur | +| Xidmət | npm paketi | Defolt port | Məqsəd | +| --------------- | ----------------------------------------- | :---------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | OmniRoute-un alt provayder kimi istifadə edə biləcəyi AI marşrutlayıcısı. Modellər `9router/{sub}/{model}` şəklində təqdim olunur | +| **CLIProxyAPI** | GitHub buraxılış binar faylı (`cliproxy`) | 8317 | Anthropic CLI autentifikasiya axınları üçün lokal proksi adapteri. OAuth tokenlərinin müddəti bitdikdə ehtiyat marşrutlaşdırma təmin edir | +| **Mux** | `mux` (başlıqsız `mux server`) | 8322 | Lokal agent orkestrasiya demonu (coder/mux). Yalnız həyat dövrü idarə olunur — marşrutlaşdırma hədəfi deyil (LLM proksiləşdirilməsi yoxdur). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go əsaslı AI şlüz rele backend-i. İşlədiyi zaman rele marşrutu (`/v1/relay/`) tərəfindən avtomatik seçilir | +| **Dario** | `@askalf/dario` | 3456 | Claude abunəlik proksisi — Claude-Code formatlı trafik üçün CLIProxyAPI-yə alternativ/ehtiyat variant; daxil edilən açar onun `/admin/*` OAuth idarəetmə müstəvisinə girişi məhdudlaşdıran `DARIO_ADMIN_TOKEN` olur | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web avtomatlaşdırması (Puppeteer vasitəsilə başlıqsız Chromium). Yalnız həyat dövrü idarə olunur — marşrutlaşdırma hədəfi deyil. | -Beşinin hamısı eyni nəzarət modelinə əməl edir: +Altı xidmətin hamısı eyni nəzarət modelinə tabedir: - OmniRoute onları `DATA_DIR/services/{name}/` altında quraşdırır (OmniRoute-un öz `package.json` faylından təcrid olunmuş şəkildə) - OmniRoute onları alt proseslər kimi işə salır və izləyir -- OmniRoute müvəqqəti API açarını alt prosesin mühitinə inyeksiya edir və onu dayanma olmadan rotasiya edir (tətbiq olunduğu hallarda) -- Bütün idarəetmə marşrutları (`/api/services/*`) **LOCAL_ONLY**-dir — yalnız loopback üzərindən əlçatandır (sərt qayda #17) +- OmniRoute alt prosesin mühitinə efemer API açarı daxil edir və onu dayanma olmadan rotasiya edir (tətbiq olunduğu hallarda) +- Bütün idarəetmə marşrutları (`/api/services/*`) **YALNIZ_LOKALDIR** — yalnız geri dönmə interfeysindən əlçatandır (sərt qayda #17) ### Əsas qərarlar (dizayn planından) -| Qərar | Dəyər | -| ------------------------------------------------- | -------------------------------------------------------------------------------------------- | -| 9Router-un yerli UI-na idarəetmə panelindən giriş | `/dashboard/providers/services/9router/embed/*` ünvanında əks proksi | -| Quraşdırma mexanizmi | `execFile` vasitəsilə `npm install {package}` (shell interpolyasiyası olmadan) | -| İstifadə rejimi | Marşrutlaşdırma mühərrikində `9router/{sub}/{model}` kimi qeydiyyatdan keçirilmiş provayder | -| API açarının idarə edilməsi | OmniRoute yaradır, saxlanma zamanı şifrələyir (AES-256-GCM) və env vasitəsilə inyeksiya edir | -| İdarəetmə panelindəki yer | `/dashboard/providers/services` (üç tab) | -| Avtomatik başlatma | Hər xidmət üçün ayrıca keçid, standart olaraq SÖNDÜRÜLÜDÜR | +| Qərar | Dəyər | +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| 9Router-un yerli UI-sinə idarə panelindən giriş | `/dashboard/providers/services/9router/embed/*` ünvanında əks proksi | +| Quraşdırma mexanizmi | `execFile` vasitəsilə `npm install {package}` (shell interpolasiyası olmadan) | +| İstifadə rejimi | Provayder marşrutlaşdırma mühərrikində `9router/{sub}/{model}` kimi qeydiyyata alınır | +| API açarının idarə edilməsi | OmniRoute açarı yaradır, saxlanma zamanı şifrələyir (AES-256-GCM) və mühit vasitəsilə daxil edir | +| İdarə panelindəki yerləşmə | `/dashboard/providers/services` (üç tab) | +| Avtomatik başlatma | Hər xidmət üçün keçid, defolt olaraq SÖNÜLÜ | --- @@ -66,10 +67,10 @@ Beşinin hamısı eyni nəzarət modelinə əməl edir: │ Qat 1 — İstifadəçi interfeysi │ │ /dashboard/providers/services (tablar: CLIProxyAPI | 9Router | Mux)│ │ Canlı jurnallar (SSE), Başlat/Dayandır/Yenidən başlat/Yenilə, │ -│ Parametrlər, Quraşdır │ +│ Parametrlər, Quraşdırma │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Qabıq + ?tab= üzrə tab marşrutlaması │ +│ ├── page.tsx Qabıq + ?tab= ilə tab marşrutlaşdırması│ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -88,41 +89,40 @@ Beşinin hamısı eyni nəzarət modelinə əməl edir: │ /dashboard/providers/services/9router/embed/[...path] │ │ (əks HTTP + WebSocket proksisi → 9Router upstream) │ │ │ -│ Keçid nəzarəti: LOCAL_ONLY_API_PREFIXES aşağıdakıları ehtiva edir:│ +│ Keçid nəzarəti: LOCAL_ONLY_API_PREFIXES dəyişəninə │ │ "/api/services/" və │ -│ "/dashboard/providers/services/*/embed/" │ +│ "/dashboard/providers/services/*/embed/" daxildir │ └──────────────────────┬─────────────────────────────────────────────┘ │ prosesdaxili çağırışlar ┌──────────────────────▼─────────────────────────────────────────────┐ │ Qat 3 — ServiceSupervisor (src/lib/services/) │ │ │ -│ ServiceSupervisor.ts Ümumi supervayzer (child_process.spawn) │ +│ ServiceSupervisor.ts Ümumi nəzarətçi (child_process.spawn) │ │ ├── quraşdırma: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── başlatma: spawn(node, [entrypoint], {env, cwd}) │ │ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── port: 9Router üçün 20130 (konfiqurasiya edilə bilər) │ -│ ├── jurnallar: stdio halqa buferi 5 MB → SSE hadisələri │ -│ ├── sağlamlıq: hər 2–5 s HTTP GET /health, tənbəl bərpa │ -│ └── həyat dövrü: SIGTERM 15 s → SIGKILL │ +│ ├── jurnallar: stdio halqavari buferi, 5 MB → SSE hadisələri │ +│ ├── sağlamlıq: hər 2–5 san. HTTP GET /health, tənbəl bərpa │ +│ └── həyat dövrü: SIGTERM 15 san. → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts Proses başlayarkən bütün SERVICES[] yüklənir │ +│ bootstrap.ts Proses başlayanda bütün SERVICES[] elementlərini işə salır│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Dövri GET /v1/models → service_models cədvəli │ -│ ringBuffer.ts Dairəvi jurnal buferi (hər xidmətə 5 MB) │ -│ healthCheck.ts Sorğulanan HTTP sağlamlıq yoxlaması │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ ringBuffer.ts Dairəvi jurnal buferi (hər xidmət üçün 5 MB) │ +│ healthCheck.ts Sorğulama əsaslı HTTP sağlamlıq yoxlaması │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (quraşdırıcı adapterləri) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ OpenAI-uyğun HTTP (loopback) + │ OpenAI ilə uyğun HTTP (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Qat 4 — Provayder / Marşrutlama │ +│ Qat 4 — Provayder / Marşrutlaşdırma │ │ │ │ open-sse/executors/ninerouter.ts │ │ Hər sorğuda portu və API açarını yenidən axtarır (keşləmə yoxdur).│ -│ Proksiləmədən əvvəl model id-dən "9router/" prefiksini silir. │ -│ Supervayzer "running" vəziyyətində deyilsə, │ -│ 503 service_not_running qaytarır. │ +│ Proksiləmədən əvvəl model id-sindən "9router/" prefiksini silir.│ +│ Nəzarətçi "running" vəziyyətində deyilsə, 503 service_not_running qaytarır.│ │ │ │ src/shared/constants/providers.ts │ │ "9router" üçün qeyd: isEmbeddedService: true │ @@ -131,29 +131,31 @@ Beşinin hamısı eyni nəzarət modelinə əməl edir: │ Modellər "9router/{sub}/{model}" kimi saxlanılır (prefiksli). │ │ modelSync.ts tərəfindən hər 5 dəqiqədən bir sinxronlaşdırılır. │ │ │ -│ Mux YALNIZ həyat dövrü üzrə idarə olunur (Qatlar 1-3) — o, LLM │ -│ proksisi deyil, agent orkestrasiya demonudur; buna görə Qat 4 │ -│ icraçı/provayder qeydi yoxdur və heç vaxt marşrutlama hədəfi deyil.│ +│ Mux YALNIZ həyat dövrü baxımından idarə olunur (Qatlar 1–3) — o, │ +│ LLM proksisi deyil, agent orkestrasiya demonudur; buna görə də │ +│ Qat 4 icraçı/provayder qeydinə malik deyil və heç vaxt │ +│ marşrutlaşdırma hədəfi olmur. │ └────────────────────────────────────────────────────────────────────┘ ``` ### Əsas mənbə faylları -| Fayl | Rol | -| ------------------------------------------- | ------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Əsas sinif: həyat dövrü, kilid, sağlamlıq, halqa buferi | -| `src/lib/services/bootstrap.ts` | Proses səviyyəsində qeydiyyat və avtomatik başlatma | -| `src/lib/services/registry.ts` | Singleton xəritəsi `alət → supervayzer` | -| `src/lib/services/apiKey.ts` | Açar yaratma, saxlanma zamanı AES-256-GCM şifrələməsi | -| `src/lib/services/modelSync.ts` | Dövri model sinxronizasiyası (5 dəq) + tələb üzrə | -| `src/lib/services/ringBuffer.ts` | SSE abunəliyi ilə 5 MB-lıq dairəvi jurnal buferi | -| `src/lib/services/healthCheck.ts` | HTTP sağlamlıq yoxlaması (tənzimlənən interval) | -| `src/lib/services/installers/ninerouter.ts` | 9Router üçün npm quraşdırma/yeniləmə/silmə | -| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI üçün npm quraşdırma/yeniləmə/silmə | -| `src/lib/services/installers/mux.ts` | Mux üçün npm quraşdırma/yeniləmə/silmə | -| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` köməkçi funksiyası | -| `src/app/api/services/[name]/logs/route.ts` | Paylaşılan SSE jurnal son nöqtəsi | -| `open-sse/executors/ninerouter.ts` | Provayder icraçısı (Lay 4) | +| Fayl | Rol | +| ------------------------------------------- | ------------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Əsas sinif: həyat dövrü, kilid, sağlamlıq, halqa buferi | +| `src/lib/services/bootstrap.ts` | Proses səviyyəsində qeydiyyat və avtomatik başlatma | +| `src/lib/services/registry.ts` | Sinqlton xəritə `alət → nəzarətçi` | +| `src/lib/services/apiKey.ts` | Açarın yaradılması, saxlanma zamanı AES-256-GCM şifrələməsi | +| `src/lib/services/modelSync.ts` | Dövri model sinxronizasiyası (5 dəq) + tələb üzrə | +| `src/lib/services/ringBuffer.ts` | SSE abunəliyi ilə 5 MB-lıq dairəvi jurnal buferi | +| `src/lib/services/healthCheck.ts` | HTTP sağlamlıq yoxlaması (konfiqurasiya edilə bilən interval) | +| `src/lib/services/installers/ninerouter.ts` | 9Router üçün npm quraşdırması/yenilənməsi/silinməsi | +| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI üçün npm quraşdırması/yenilənməsi/silinməsi | +| `src/lib/services/installers/mux.ts` | Mux üçün npm quraşdırması/yenilənməsi/silinməsi | +| `src/lib/services/installers/openwa.ts` | open-wa üçün npm quraşdırması/yenilənməsi/silinməsi | +| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` köməkçi funksiyası | +| `src/app/api/services/[name]/logs/route.ts` | Paylaşılan SSE jurnal son nöqtəsi | +| `open-sse/executors/ninerouter.ts` | Provayder icraçısı (Səviyyə 4) | --- @@ -211,17 +213,15 @@ anda işə düşdüyü hallarda yarış şəraitinin qarşısını alır. ## 4. API arayışı -`/api/services/` altındakı bütün marşrutlar **LOCAL_ONLY**-dır (yalnız loopback, -sərt qayda #17). Loopback olmayan sorğular autentifikasiya tokenindən asılı olmayaraq -`403 LOCAL_ONLY` cavabı alır. +`/api/services/` altındakı bütün marşrutlar **LOCAL_ONLY**-dir (yalnız geri döngü, sərt qayda #17). +Geri döngü olmayan sorğular autentifikasiya tokenindən asılı olmayaraq `403 LOCAL_ONLY` cavabı alır. ### 4.1 9Router son nöqtələri (11 marşrut) #### `POST /api/services/9router/install` -9Router-i npm-dən quraşdırır. Öz `package.json` və `node_modules/` faylları ilə -`DATA_DIR/services/9router/` yaradır. OmniRoute-un öz asılılıqları ilə ziddiyyət -yaratmır. +9Router-i npm-dən quraşdırır. Öz `package.json` və `node_modules/` faylları ilə birlikdə +`DATA_DIR/services/9router/` yaradır. OmniRoute-un öz asılılıqları ilə ziddiyyət yaratmır. **Sorğu gövdəsi** (hamısı istəyə bağlıdır): @@ -229,28 +229,28 @@ yaratmır. { "version": "latest" } ``` -| Sahə | Növ | İlkin dəyər | Təsvir | -| --------- | -------- | ----------- | -------------------------------------------- | -| `version` | `string` | `"latest"` | quraşdırılacaq npm versiya teqi və ya semver | +| Sahə | Növ | Standart | Təsvir | +| --------- | -------- | ---------- | -------------------------------------------- | +| `version` | `string` | `"latest"` | Quraşdırılacaq npm versiya teqi və ya semver | **Cavablar:** -| Status | Təsvir | -| ------ | ----------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Etibarsız sorğu gövdəsi (Zod doğrulama xətası) | -| `409` | Quraşdırma artıq davam edir (kilid tutulub) | -| `500` | npm quraşdırılması uğursuz oldu — anlaşılan xəta üçün `message`-ə baxın | +| Status | Təsvir | +| ------ | --------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Etibarsız sorğu gövdəsi (Zod doğrulama xətası) | +| `409` | Quraşdırma artıq davam edir (kilid tutulub) | +| `500` | npm quraşdırması uğursuz oldu — anlaşılan xəta üçün `message`-a baxın | -**Qeydlər:** `execFile('npm', [...])` istifadə edir — shell və interpolyasiya yoxdur -(sərt qayda #13). EACCES xətaları anlaşılan mesajlar şəklində təqdim olunur. +**Qeydlər:** `execFile('npm', [...])` istifadə edir — shell və interpolasiya yoxdur (sərt qayda #13). +EACCES xətaları anlaşılan mesajlar kimi təqdim olunur. --- #### `POST /api/services/9router/start` -9Router-i başladır. Artıq qeydiyyatdan keçirilməyibsə, supervisor qeydiyyatdan keçirilir, -sonra `supervisor.start()` çağırılır. Artıq işlədikdə idempotentdir. +9Router-i başladır. Əgər supervayzer hələ qeydiyyatdan keçirilməyibsə, onu qeydiyyatdan keçirir, +sonra `supervisor.start()` çağırır. Artıq işlədiyi halda idempotentdir. **Sorğu gövdəsi:** yoxdur @@ -280,8 +280,8 @@ sonra `supervisor.start()` çağırılır. Artıq işlədikdə idempotentdir. #### `POST /api/services/9router/stop` -9Router-i təhlükəsiz şəkildə dayandırır. SIGTERM göndərir, 15 san. gözləyir, proses -hələ də işləyirsə, SIGKILL göndərir. Artıq dayandırıldıqda idempotentdir. +9Router-i təhlükəsiz şəkildə dayandırır. SIGTERM göndərir, 15 saniyə gözləyir və proses hələ də +aktivdirsə, SIGKILL göndərir. Artıq dayandırıldığı halda idempotentdir. **Sorğu gövdəsi:** yoxdur @@ -296,7 +296,7 @@ hələ də işləyirsə, SIGKILL göndərir. Artıq dayandırıldıqda idempoten #### `POST /api/services/9router/restart` -Əməliyyat kilidi altında əvvəl `stop()`, sonra `start()` çağırılmasına bərabərdir. +Əməliyyat kilidi altında əvvəlcə `stop()`, sonra `start()` çağırılmasına bərabərdir. **Sorğu gövdəsi:** yoxdur @@ -307,7 +307,7 @@ hələ də işləyirsə, SIGKILL göndərir. Artıq dayandırıldıqda idempoten #### `POST /api/services/9router/update` 9Router-i daha yeni npm versiyasına yeniləyir. Xidmət işləyirsə, əvvəlcə dayandırılır, -npm install işə salınır (daha yeni versiya mövcud yerində quraşdırılır), sonra isə +npm quraşdırması başladılır (daha yeni versiya olduğu yerdə quraşdırılır), sonra isə xidmət yenidən başladılır. **Sorğu gövdəsi** (hamısı istəyə bağlıdır): @@ -328,7 +328,8 @@ xidmət yenidən başladılır. #### `POST /api/services/9router/rotate-key` -9Router üçün yeni API açarı yaradır, onu saxlanma zamanı şifrələyir və xidmət işləyirsə, yeni açarı mühitindən götürməsi üçün xidməti yenidən başladır. Köhnə açar dərhal etibarsız edilir. +9Router üçün yeni API açarı yaradır, onu saxlanma zamanı şifrələyir və xidmət işləyirsə, +yeni açarı mühitindən götürməsi üçün onu yenidən başladır. Köhnə açar dərhal etibarsız edilir. **Sorğu gövdəsi:** yoxdur @@ -337,15 +338,16 @@ xidmət yenidən başladılır. | Status | Təsvir | | ------ | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Rotasiya uğursuz oldu | +| `500` | Açarın dəyişdirilməsi uğursuz oldu | -**Təhlükəsizlik:** Yeni açar heç vaxt cavabda qaytarılmır (giriş məlumatlarının sızması yoxdur). O, `version_manager` cədvəlində şifrələnmiş şəkildə (AES-256-GCM) saxlanılır. +**Təhlükəsizlik:** Yeni açar heç vaxt cavabda qaytarılmır (giriş məlumatlarının sızması yoxdur). +O, `version_manager` cədvəlində şifrələnmiş formada (AES-256-GCM) saxlanılır. --- #### `GET /api/services/9router/status` -Versiya metadatası və API açarının önizləməsi daxil olmaqla, birləşdirilmiş canlı + DB statusunu qaytarır. +Versiya metadatası və API açarının önizləməsi daxil olmaqla birləşdirilmiş canlı + DB statusunu qaytarır. **Cavablar:** @@ -378,7 +380,8 @@ Versiya metadatası və API açarının önizləməsi daxil olmaqla, birləşdir #### `POST /api/services/9router/auto-start` -Avtomatik başlatma bayrağını dəyişir. `enabled: true` olduqda, OmniRoute növbəti dəfə işə salınarkən xidmət avtomatik başlayır (xidmət quraşdırılıbsa). +Avtomatik başlatma bayrağını dəyişir. `enabled: true` olduqda, OmniRoute növbəti dəfə +işə düşərkən xidmət avtomatik başladılır (xidmət quraşdırılıbsa). **Sorğu gövdəsi:** @@ -391,28 +394,28 @@ Avtomatik başlatma bayrağını dəyişir. `enabled: true` olduqda, OmniRoute n | Status | Təsvir | | ------ | --------------------- | | `200` | `{ autoStart: true }` | -| `400` | Yanlış gövdə | +| `400` | Etibarsız gövdə | --- #### `GET /api/services/9router/logs` -9Router-un stdout/stderr halqa buferindən canlı jurnalların SSE axını. +9Router-in stdout/stderr halqa buferindən canlı jurnalların SSE axını. **Sorğu parametrləri:** -| Parametr | Növ | Standart | Təsvir | -| -------- | --------- | -------- | ---------------------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Əvvəlcə göndəriləcək keçmiş sətirlərin sayı (maksimum 1000) | -| `filter` | `string` | yoxdur | Böyük-kiçik hərfə həssas olmayan alt sətir filtri (regex yoxdur — ReDoS-a qarşı təhlükəsizdir) | +| Parametr | Növ | Standart | Təsvir | +| -------- | --------- | -------- | -------------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Əvvəlcə göndəriləcək tarixi sətirlərin sayı (maksimum 1000) | +| `filter` | `string` | yoxdur | Registrdən asılı olmayan alt sətir filtri (regex yoxdur — ReDoS-a qarşı təhlükəsizdir) | **SSE hadisələri:** -| Hadisə | Məlumat | Təsvir | -| ----------- | ----------- | ---------------------------------- | -| `snapshot` | `LogLine[]` | İlkin tarixi son sətirlər | -| `log` | `LogLine` | Canlı jurnal sətri | -| `heartbeat` | `{}` | Hər 15 saniyədən bir aktiv saxlama | +| Hadisə | Məlumat | Təsvir | +| ----------- | ----------- | ---------------------------------------------- | +| `snapshot` | `LogLine[]` | İlkin tarixi sonluq | +| `log` | `LogLine` | Canlı jurnal sətri | +| `heartbeat` | `{}` | Hər 15 saniyədən bir bağlantını aktiv saxlayır | **LogLine sxemi:** @@ -426,81 +429,127 @@ Avtomatik başlatma bayrağını dəyişir. `enabled: true` olduqda, OmniRoute n **Cavablar:** -| Status | Təsvir | -| ------ | ------------------------------------------------------ | -| `200` | `text/event-stream` | -| `400` | `filter` parametri həddən artıq uzundur (> 200 simvol) | -| `404` | Xidmət tapılmadı (supervizorda qeydiyyata alınmayıb) | +| Status | Təsvir | +| ------ | ---------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | `filter` parametri çox uzundur (> 200 simvol) | +| `404` | Xidmət tapılmadı (supervayzer qeydiyyatdan keçməyib) | --- ### 4.2 CLIProxyAPI son nöqtələri (10 marşrut) -CLIProxyAPI, `rotate-key` istisna olmaqla, 9Router ilə eyni son nöqtə quruluşuna malikdir və əlavə olaraq `accounts`, `provider-expose` və `auto-restart-adopted` son nöqtələrini ehtiva edir. İndi işə salınma zamanı daxil edilən ayrıca məlumat müstəvisi API açarı alır (`bootstrap.ts` daxilində `needsApiKey: true`, model sinxronizasiyası üçün istifadə olunur); `status` daha az sahə ehtiva edir. +CLIProxyAPI, `rotate-key` istisna olmaqla, 9Router ilə eyni son nöqtə strukturuna malikdir və əlavə olaraq +`accounts`, `provider-expose` və `auto-restart-adopted` son nöqtələrini ehtiva edir. İndi yaradılma zamanı daxil edilən +xüsusi məlumat müstəvisi API açarını qəbul edir (`bootstrap.ts` daxilində +`needsApiKey: true`, model sinxronizasiyası üçün istifadə olunur); `status` daha az sahə ehtiva edir. | Metod | Yol | Təsvir | | ------ | ----------------------------------- | ------------------------------------------- | | `POST` | `/api/services/cliproxy/install` | CLIProxyAPI-ni npm-dən quraşdırır | -| `POST` | `/api/services/cliproxy/start` | CLIProxyAPI-ni başladır | +| `POST` | `/api/services/cliproxy/start` | CLIProxyAPI-ni işə salır | | `POST` | `/api/services/cliproxy/stop` | CLIProxyAPI-ni dayandırır | | `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI-ni yenidən başladır | | `POST` | `/api/services/cliproxy/update` | Daha yeni versiyaya yeniləyir | | `GET` | `/api/services/cliproxy/status` | Canlı + DB statusu (`apiKeyMasked` olmadan) | -| `POST` | `/api/services/cliproxy/auto-start` | Avtomatik başlatmanı dəyişir | +| `POST` | `/api/services/cliproxy/auto-start` | Avtomatik başlatmanı aktiv/deaktiv edir | -Ortaq `GET /api/services/{name}/logs` son nöqtəsi (§4.1-ə baxın) `[name]` dinamik seqmentindən istifadə etməklə dörd xidmətin hamısı üçün işləyir. +Paylaşılan `GET /api/services/{name}/logs` son nöqtəsi (bax: §4.1) `[name]` +dinamik seqmentindən istifadə etməklə bütün dörd xidmət üçün işləyir. --- ### 4.3 Mux son nöqtələri (8 marşrut) -Mux, CLIProxyAPI ilə eyni son nöqtə quruluşuna malikdir — API səthində `rotate-key` marşrutu yoxdur (daşıyıcı tokeni 9Router-da olduğu kimi `getOrCreateApiKey("mux")` vasitəsilə yaradılır və `MUX_SERVER_AUTH_TOKEN` mühit dəyişəni vasitəsilə daxil edilir, lakin hələlik ayrıca rotasiya son nöqtəsi yoxdur). Mux yalnız həyat dövrü baxımından idarə olunur: 9Router-dan fərqli olaraq, onun Layer 4 icraçısı yoxdur və heç vaxt marşrutlaşdırma provayderi kimi qeydiyyata alınmır. +Mux, CLIProxyAPI ilə eyni son nöqtə strukturuna malikdir — API səthində `rotate-key` +marşrutu yoxdur (daşıyıcı tokeni 9Router-də olduğu kimi +`getOrCreateApiKey("mux")` vasitəsilə yaradılır və `MUX_SERVER_AUTH_TOKEN` mühit dəyişəni +vasitəsilə daxil edilir, lakin hələlik xüsusi rotasiya son nöqtəsi yoxdur). Mux yalnız həyat dövrü +üzrə idarə olunur: 9Router-dən fərqli olaraq, onun Layer 4 icraedicisi yoxdur və heç vaxt +marşrutlaşdırma provayderi kimi qeydiyyata alınmır. -| Metod | Yol | Təsvir | -| ------ | ------------------------------ | -------------------------------------- | -| `POST` | `/api/services/mux/install` | Mux-u npm-dən quraşdırır (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Mux-u başladır (`mux server`) | -| `POST` | `/api/services/mux/stop` | Mux-u dayandırır | -| `POST` | `/api/services/mux/restart` | Mux-u yenidən başladır | -| `POST` | `/api/services/mux/update` | Daha yeni npm versiyasına yeniləyir | -| `GET` | `/api/services/mux/status` | Canlı + DB statusu | -| `POST` | `/api/services/mux/auto-start` | Avtomatik başlatmanı dəyişir | +| Metod | Yol | Təsvir | +| ------ | ------------------------------ | --------------------------------------- | +| `POST` | `/api/services/mux/install` | Mux-u npm-dən quraşdırır (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Mux-u işə salır (`mux server`) | +| `POST` | `/api/services/mux/stop` | Mux-u dayandırır | +| `POST` | `/api/services/mux/restart` | Mux-u yenidən başladır | +| `POST` | `/api/services/mux/update` | Daha yeni npm versiyasına yeniləyir | +| `GET` | `/api/services/mux/status` | Canlı + DB statusu | +| `POST` | `/api/services/mux/auto-start` | Avtomatik başlatmanı aktiv/deaktiv edir | --- ### 4.4 Bifrost son nöqtələri (8 marşrut) -Bifrost Go əsaslı süni intellekt şlüzü retranslyasiya arxa xidmətidir (`@maximhq/bifrost`). O, CLIProxyAPI ilə eyni son nöqtə quruluşundan istifadə edir (`rotate-key` yoxdur — Bifrost öz provayder açarlarını `-app-dir` altındakı `config.json` faylında idarə edir). - -| Metod | Yol | Təsvir | -| ------ | ---------------------------------- | ---------------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Bifrost-u npm-dən (`@maximhq/bifrost`) quraşdırır | -| `POST` | `/api/services/bifrost/start` | Bifrost-u 8080 portunda (standart) işə salır | -| `POST` | `/api/services/bifrost/stop` | Bifrost-u dayandırır | -| `POST` | `/api/services/bifrost/restart` | Bifrost-u yenidən başladır | -| `POST` | `/api/services/bifrost/update` | Daha yeni versiyaya yeniləyir | -| `GET` | `/api/services/bifrost/status` | Canlı + verilənlər bazası statusu | -| `POST` | `/api/services/bifrost/auto-start` | Avtomatik işə salınmanı aktivləşdirir və ya deaktivləşdirir | -| `GET` | `/api/services/bifrost/logs` | SSE jurnalının son hissəsi (ortaq `[name]/logs` dinamik marşrutu vasitəsilə) | - -**Marşrutlaşdırmanın əlaqələndirilməsi:** `BIFROST_BASE_URL` təyin edilmədikdə və nəzarət olunan Bifrost +Bifrost, Go dilində yazılmış süni intellekt şlüzü üçün relay backend-dir (`@maximhq/bifrost`). O, +CLIProxyAPI ilə eyni son nöqtə strukturundan istifadə edir (`rotate-key` yoxdur — Bifrost öz provayder +açarlarını `-app-dir` daxilindəki `config.json` faylında idarə edir). + +| Metod | Yol | Təsvir | +| ------ | ---------------------------------- | --------------------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Bifrost-u npm-dən quraşdırır (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Bifrost-u 8080 portunda işə salır (standart) | +| `POST` | `/api/services/bifrost/stop` | Bifrost-u dayandırır | +| `POST` | `/api/services/bifrost/restart` | Bifrost-u yenidən başladır | +| `POST` | `/api/services/bifrost/update` | Daha yeni versiyaya yeniləyir | +| `GET` | `/api/services/bifrost/status` | Canlı + DB statusu | +| `POST` | `/api/services/bifrost/auto-start` | Avtomatik başlatmanı aktiv/deaktiv edir | +| `GET` | `/api/services/bifrost/logs` | SSE jurnalının son hissəsi (paylaşılan `[name]/logs` dinamik marşrutu vasitəsilə) | + +**Marşrutlaşdırma bağlantısı:** `BIFROST_BASE_URL` təyin edilmədikdə və supervayzer tərəfindən idarə olunan Bifrost nümunəsi işlədikdə, `getBifrostRoutingConfig()` (`routingBackend.ts` daxilində) avtomatik olaraq `http://127.0.0.1:{port}` ünvanını relay baza URL-i kimi istifadə edir. Açıq şəkildə təyin edilmiş `BIFROST_BASE_URL` mühit -dəyişəni həmişə üstünlük təşkil edir. +dəyişəni həmişə üstünlüyə malikdir. --- ### 4.5 Dario son nöqtələri (12 marşrut) Digər xidmətlərlə eyni həyat dövrü strukturuna (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), həmçinin `admin/` altında tokenlə qorunan OAuth -idarəetmə müstəvisinə malikdir: `admin/accounts`, `admin/import-from-omniroute`, +`update`, `status`, `auto-start`, `auto-restart-adopted`), həmçinin `admin/` altında +token ilə qorunan OAuth idarəetmə müstəvisinə malikdir: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (hamısı `DARIO_ADMIN_TOKEN` ilə qorunur). -### 4.6 Əks proksi (9Router idarəetmə panelinin yerləşdirilməsi) +### 4.6 open-wa son nöqtələri (7 marşrut) + +open-wa (`@open-wa/wa-automate`) WhatsApp Web-i avtomatlaşdırmaq üçün başsız Chromium nümunəsini +(Puppeteer vasitəsilə) idarə edir. Mux ilə eyni son nöqtə strukturundan istifadə edir (hələlik +`rotate-key` marşrutu yoxdur). Yalnız həyat dövrü üzrə idarə olunur — marşrutlaşdırma hədəfi deyil və +Layer 4 icraedicisi/provayder qeydi yoxdur. + +| Metod | Yol | Təsvir | +| ------ | --------------------------------- | --------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | open-wa-nı npm-dən quraşdırır (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | open-wa-nı 8323 portunda başladır (standart) | +| `POST` | `/api/services/openwa/stop` | open-wa-nı dayandırır | +| `POST` | `/api/services/openwa/restart` | open-wa-nı yenidən başladır | +| `POST` | `/api/services/openwa/update` | Daha yeni versiyaya yeniləyir | +| `GET` | `/api/services/openwa/status` | Canlı + verilənlər bazası statusu | +| `POST` | `/api/services/openwa/auto-start` | Avtomatik başlatmanı aktivləşdirir və ya deaktivləşdirir | +| `GET` | `/api/services/openwa/logs` | SSE jurnalının son hissəsi (ortaq `[name]/logs` dinamik marşrutu ilə) | + +**API açarı:** `WA_KEY` kimi daxil edilir — open-wa-nın ümumi `WA_*` prefiksli mühit +dəyişəni üzərindən əvəzləmə mexanizmi onu `--key`/`-k` CLI seçiminə uyğunlaşdırır +(`dist/cli/setup.js::envArgs()`, quraşdırılmış 4.76.0 paketi ilə yoxlanılıb). +`generateServiceApiKey()` tərəfindən yaradıldıqda `ow_` prefiksi əlavə olunur. open-wa +açarı `key`/`api_key` HTTP başlığından oxuyur (`Authorization: +Bearer` deyil); `/api-docs*` yoxlamadan açıq şəkildə azad edilib +(`dist/cli/server.js` faylındakı `setupAuthenticationLayer`), buna görə sağlamlıq yoxlaması +üçün autentifikasiya başlığı tələb olunmur. + +**Cütləşdirmə:** open-wa qeyri-rəsmidir və WhatsApp ilə əlaqəli deyil — +qoşulmuş nömrənin WhatsApp-ın öz avtomatlaşdırma aşkarlaması səbəbindən bloklanma riski var. +İlk başladılma zamanı cütləşdirmə QR kodu stdout-a yazılır və +mövcud Jurnallar paneli/SSE axını vasitəsilə göstərilir — bu inteqrasiyada hələ +xüsusi QR təsviri endpoint-i yoxdur. + +--- + +### 4.7 Əks proksi (9Router idarəetmə panelinin yerləşdirilməsi) -İdarəetmə paneli 9Router veb interfeysini aşağıdakı ünvanda daxili əks -proksi vasitəsilə iframe daxilində yerləşdirir: +İdarəetmə paneli 9Router veb interfeysini iframe daxilində aşağıdakı ünvandakı daxili əks +proksi vasitəsilə yerləşdirir: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -508,18 +557,18 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Bu proksi: -- Sorğunu `http://127.0.0.1:{port}/{path}` ünvanına yönləndirir (yalnız loopback) +- Sorğunu `http://127.0.0.1:{port}/{path}` ünvanına yönləndirir (yalnız geri döngə) - Daxil olan `cookie` və `authorization` başlıqlarını silir (OmniRoute sessiyasının sızmasının qarşısını alır) -- 9Router autentifikasiyası üçün `Authorization: Bearer {apiKey}` əlavə edir +- 9Router autentifikasiyası üçün `Authorization: Bearer {apiKey}` daxil edir - Cavabdan `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` başlıqlarını silir -- `` əlavə etmək və mütləq yolları normallaşdırmaq üçün HTML cavablarını yenidən yazır (`/foo` → `/dashboard/.../embed/foo`) +- `` daxil etmək və mütləq yolları normallaşdırmaq üçün HTML cavablarını yenidən yazır (`/foo` → `/dashboard/.../embed/foo`) -Yerləşdirilmiş idarəetmə paneli üçün WebSocket yüksəltmələri xüsusi portdakı +Yerləşdirilmiş idarəetmə paneli üçün WebSocket yeniləmələri xüsusi portdakı köməkçi server tərəfindən idarə olunur (`src/lib/services/embedWsProxy.ts` faylına baxın). **Təhlükəsizlik:** Yerləşdirmə proksisi marşrutları `LOCAL_ONLY_API_PREFIXES` -kateqoriyasına daxildir və onlara yalnız loopback vasitəsilə daxil olmaq mümkündür. Cloudflare/Ngrok tuneli vasitəsilə JWT əldə edən -hücumçu yerləşdirilmiş xidmətlərə proksi vasitəsilə daxil ola bilməz. +altında təsnif edilir və onlara yalnız geri döngədən daxil olmaq mümkündür. Cloudflare/Ngrok +tuneli vasitəsilə JWT əldə edən hücumçu yerləşdirilmiş xidmətlərə proksi vasitəsilə daxil ola bilməz. --- diff --git a/docs/i18n/az/docs/frameworks/MEMORY.md b/docs/i18n/az/docs/frameworks/MEMORY.md index 959638ad255f..0e55a8050608 100644 --- a/docs/i18n/az/docs/frameworks/MEMORY.md +++ b/docs/i18n/az/docs/frameworks/MEMORY.md @@ -156,27 +156,37 @@ hər sorğu üzrə maksimum `limit` qədər gözləyən qeydi emal edir. Gedişa - `last_reset_at` — son tam sıfırlamanın zaman damğası. - `vec_loaded` — sqlite-vec-in uğurla yüklənib-yüklənmədiyini göstərən 0/1 bayrağı. -## Parametrlər genişləndirilməsi - -Doqquz embedding və vektor sahəsi `src/shared/schemas/memory.ts` faylındakı `MemorySettingsExtended` daxilində mövcuddur və `src/lib/db/settings.ts` vasitəsilə saxlanılır: - -| Sahə | Növ | İlkin dəyər | Təsvir | -| ------------------------ | -------------------------------------------------- | ----------- | ------------------------------------------------------------------------------ | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | İstifadə ediləcək embedding mənbəyi | -| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` formatında provayder/model | -| `customBaseUrl` | `string \| null` | `null` | Yalnız yaddaş üçün OpenAI-uyğun endpoint baza URL-i | -| `customModelId` | `string \| null` | `null` | Fərdi endpoint-ə göndərilən model ID-si | -| `transformersEnabled` | `boolean` | `false` | Transformers.js üçün seçimlə aktivləşdirmə (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Lokal statik potion-base-8M modeli üçün seçimlə aktivləşdirmə | -| `rerankEnabled` | `boolean` | `false` | Yenidən sıralama mərhələsini aktivləşdirir (hər sorğuya +200-500ms əlavə edir) | -| `rerankProviderModel` | `string \| null` | `null` | `provider/model` formatında yenidən sıralama provayderi/modeli | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | İstifadə ediləcək vektor backend-i | - -Bunlar `GET /PUT /api/settings/memory` vasitəsilə əlçatandır (`MemorySettingsExtendedSchema` sxemi). - -`remote` mənbəyi üçün Memory, həmçinin ixtiyari `customBaseUrl` və `customModelId` parametrlərini qəbul edir. Onlar birlikdə qlobal embedding reyestrini dəyişdirmədən OpenAI-uyğun `/embeddings` endpoint-ini və modelini seçir. Endpoint istifadə edilməzdən əvvəl normallaşdırılır və provayderin xarici URL siyasətinə uyğun yoxlanılır: HTTP(S) tələb olunur, daxil edilmiş autentifikasiya məlumatları və sorğu sətirləri rədd edilir, bulud metadatası ünvanları isə bloklanmış olaraq qalır. Boş dəyərlər seçilmiş reyestr provayderini qoruyur. İdarəetmə panelinə qaytarılan xətalar təmizlənir və endpoint autentifikasiya məlumatları heç vaxt jurnala yazılmır. - -> **TODO (D20):** Bütün API açarları arasında yaddaşların paylaşılması üçün `global` əhatə dairəsi bu buraxılışda tətbiq edilməyib. Bunun üçün sxem dəyişiklikləri və qlobal axtarış yolu tələb olunur. Ayrı şəkildə izləyin. +## Parametrlərin genişləndirilməsi + +Doqquz embedding və vektor sahəsi `src/shared/schemas/memory.ts` faylındakı `MemorySettingsExtended` daxilində mövcuddur və `src/lib/db/settings.ts` vasitəsilə davamlı saxlanılır: + +| Sahə | Tip | Standart dəyər | Təsvir | +| ------------------------ | -------------------------------------------------- | -------------- | ------------------------------------------------------------------------------ | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | İstifadə ediləcək embedding mənbəyi | +| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` formatında provayder/model | +| `customBaseUrl` | `string \| null` | `null` | Yalnız Memory üçün OpenAI-uyğun son nöqtənin baza URL-i | +| `customModelId` | `string \| null` | `null` | Fərdi son nöqtəyə göndərilən model ID-si | +| `transformersEnabled` | `boolean` | `false` | Transformers.js üçün seçimlə aktivləşdirmə (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Statik potion-base-8M lokal modeli üçün seçimlə aktivləşdirmə | +| `rerankEnabled` | `boolean` | `false` | Yenidən sıralama mərhələsini aktivləşdirir (hər sorğuya +200-500ms əlavə edir) | +| `rerankProviderModel` | `string \| null` | `null` | `provider/model` formatında yenidən sıralama provayderi/modeli | + +`rerankProviderModel`, `POST /v1/rerank` tərəfindən müəyyən edilir (loopback üzərindən çağırılır), buna görə həmin marşrutun qəbul etdiyi hər şeyi qəbul edir: seçilmiş bulud yenidən sıralama modeli (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) və ya `/` formatında OpenAI-uyğun provayder qovşağı (məsələn, TEI/Infinity sistemi üçün `skilled-mini/bge-reranker-v2-m3`). Loopback qovşaqları həmişə uyğundur; başqa hostdakı qovşaq (LAN, Tailscale) əlavə olaraq `RERANK_REMOTE_PROVIDER_NODES` funksiya bayrağını tələb edir və provayderin xarici URL siyasətindən keçməlidir — baxın: [Funksiya bayraqları](../reference/FEATURE_FLAGS.md). İdarə panelindəki seçim siyahısı seçilmiş provayderləri və lokal qovşaqları göstərir; istənilən etibarlı `provider/model` sətri birbaşa `PUT /api/settings/memory` vasitəsilə təyin edilə bilər. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | İstifadə ediləcək vektor backend-i | + +Bunlar `GET /PUT /api/settings/memory` vasitəsilə əlçatandır (sxem: `MemorySettingsExtendedSchema`). + +`remote` mənbəyi üçün Memory həmçinin ixtiyari `customBaseUrl` və +`customModelId` parametrlərini qəbul edir. Onlar birlikdə qlobal embedding reyestrini +dəyişdirmədən OpenAI-uyğun `/embeddings` son nöqtəsini və modeli seçirlər. Son nöqtə +istifadədən əvvəl normallaşdırılır və provayderin xarici URL siyasəti ilə yoxlanılır: HTTP(S) +tələb olunur, daxil edilmiş giriş məlumatları və sorğu sətirləri rədd edilir, bulud metadatası +ünvanları isə bloklanmış qalır. Boş dəyərlər seçilmiş reyestr provayderini qoruyur. İdarə +panelinə qaytarılan xətalar təmizlənir və son nöqtənin giriş məlumatları heç vaxt jurnala yazılmır. + +> **TODO (D20):** `global` əhatə dairəsi (yaddaşların bütün API açarları arasında paylaşılması) +> bu buraxılışda həyata keçirilməyib. Bunun üçün sxem dəyişiklikləri və qlobal əldəetmə +> yolu tələb olunur. Ayrı şəkildə izləyin. ## Saxlama qatları diff --git a/docs/i18n/az/docs/guides/DOCKER_GUIDE.md b/docs/i18n/az/docs/guides/DOCKER_GUIDE.md index 553efdf700f7..6d202e3301a0 100644 --- a/docs/i18n/az/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/az/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Sürətli işə salma +> **Bir əmrlə öz serverinizdə yerləşdirmək istəyirsiniz?** Baxın: +> [Öz serverinizdə yerləşdirmə təlimatı](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (dərc edilmiş image + +> Redis, yalnız loopback, profil seçimi olmadan). Aşağıdakı sürətli işə salma +> bölməsi Redis-i artıq başqa yerdə işlədən istifadəçilər üçün tək konteynerli üsuldur. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/az/docs/guides/TROUBLESHOOTING.md b/docs/i18n/az/docs/guides/TROUBLESHOOTING.md index 2ad214ffaf88..c3338abeae9e 100644 --- a/docs/i18n/az/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/az/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ Bunları OmniRoute prosesinin mühitində (demon prosesində, məsələn, Launch ## npm install Xəbərdarlıqları (ERESOLVE / peer / deprecated) -`npm install -g omniroute` əmrini işlətdikdə `npm warn ERESOLVE`, peer-asılılıq bildirişləri və `deprecated` mesajlarından ibarət çoxlu sayda xəbərdarlıq görə bilərsiniz. **Bunlar gözləniləndir və zərərsizdir.** Çıxışda `added packages` görürsünüzsə, quraşdırma uğurla tamamlanıb. +`npm install -g omniroute` əmrini icra etdikdə `npm warn ERESOLVE`, peer-asılılıq bildirişləri və `deprecated` mesajları kimi çoxsaylı xəbərdarlıqlar görə bilərsiniz. **Bunlar gözləniləndir və zərərsizdir.** Çıxışda `added packages` görürsünüzsə, quraşdırma uğurla başa çatıb. + +Peer-asılılıqların həlli ilə bağlı xəbərdarlıqları gizlətmək üçün OmniRoute tərəfindən dəstəklənən aşağıdakı quraşdırma formasından istifadə edin: + +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` yalnız `ERESOLVE` və peer-asılılıq bildirişlərini gizlədir. Köhnəlmə bildirişləri tranzitiv üçüncü tərəf paketlərindən gəldiyi üçün görünməyə davam edir; onlar quraşdırmanın uğursuz olduğunu göstərmir. Xəbərdarlıqlar OmniRoute-un nəzarət etmədiyi üçüncü tərəf paketlərindəki köhnəlmiş peer-asılılıq diapazonlarından qaynaqlanır: -1. **`marked-terminal` paketi `marked >=1 <16` tələb edir, lakin `marked@18` tapılıb** — praktikada problemsiz işləyir; upstream peer diapazonu sadəcə köhnəlib. -2. **`deprecated prebuild-install@7.1.3`** — tranzitiv yerli binar fayl əldəetmə köməkçisidir. O, sabitlənmiş `wreq-js` nəqliyyat bağlantısını quraşdırmaq üçün - istifadə edilmir və veb kuki provayderinin nəqliyyat konfiqurasiyasının uğursuz olduğunu - göstərmir. +1. **`marked-terminal` üçün `marked >=1 <16` tələb olunur, lakin `marked@18` tapılıb** — praktikada problemsiz işləyir; upstream peer diapazonu sadəcə köhnəlib. +2. **`deprecated prebuild-install@7.1.3`** — tranzitiv yerli binar fayl əldəetmə köməkçisidir. O, + sabitlənmiş `wreq-js` nəqliyyat bağlantısını quraşdırmaq üçün istifadə edilmir və web-cookie + provayderinin nəqliyyat konfiqurasiyasının uğursuz olduğunu göstərmir. -**Heç bir tədbir tələb olunmur** — upstream paketləri fork etmədən xəbərdarlıqları tamamilə susdurmaq mümkün deyil. +**Heç bir tədbir tələb olunmur** — upstream paketləri fork etmədən xəbərdarlıqları tamamilə gizlətmək mümkün deyil. --- diff --git a/docs/i18n/az/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/az/docs/providers/CURSOR-API-KEY-AND-CLI.md index c45749262ea7..2c7e7deebf4c 100644 --- a/docs/i18n/az/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/az/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,15 +4,15 @@ --- -Cursor-u IDE sessiyası olmadan OmniRoute-un arxasında yerləşdirməyin iki yolu: +Cursor-u IDE sessiyası olmadan OmniRoute arxasında yerləşdirməyin iki yolu: -1. **`cursor-api` provayderi** (“Cursor API” kartı, ləqəb `cua`): Cursor istifadəçi API açarını (`crsr_…`, `https://cursor.com/dashboard/api` ünvanında yaradılır) saxlayan API açarı əsaslı provayder. Bundan sonra istənilən OmniRoute klienti adi kvota, ehtiyat keçid və jurnallaşdırma qatları ilə `/v1/chat/completions` vasitəsilə Cursor modellərinə `cursor-api/` və ya `cua/` kimi müraciət edə bilər. IDE provayderi (`cursor`, OAuth/IDE sessiyası) dəyişməz qalır. -2. **Cursor CLI birbaşa ötürməsi**: Cursor CLI-ni (`agent`) OmniRoute-a yönəldin ki, CLI-nin etdiyi hər RPC OmniRoute API açarı ilə autentifikasiya edilsin, `cursor-api` bağlantısının giriş məlumatları ilə Cursor-a ötürülsün və Logs səhifəsində qeydə alınsın. +1. **`cursor-api` provayderi** (`Cursor API` kartı, `cua` aliası): Cursor istifadəçi API açarını (`crsr_…`, `https://cursor.com/dashboard/api` ünvanında yaradılır) saxlayan API açarlı provayder. Bundan sonra istənilən OmniRoute klienti adi kvota, ehtiyat marşrut və loqlaşdırma qatları ilə `/v1/chat/completions` vasitəsilə Cursor modellərinə `cursor-api/` və ya `cua/` kimi müraciət edə bilər. IDE provayderi (`cursor`, OAuth/IDE sessiyası) dəyişməz qalır. +2. **Cursor CLI birbaşa ötürməsi**: Cursor CLI-ni (`agent`) OmniRoute-a yönəldin ki, CLI tərəfindən edilən hər bir RPC OmniRoute API açarı ilə autentifikasiya olunsun, `cursor-api` bağlantısının giriş məlumatları ilə Cursor-a ötürülsün və Logs səhifəsində qeydə alınsın. -## Açar niyə dəyişdirilir +## Açar niyə mübadilə edilir -`api2.cursor.sh` xam `crsr_…` açarını Bearer tokeni kimi qəbul etmir (401). Cursor CLI əvvəlcə açarı `/auth/exchange_user_api_key` ünvanına POST sorğusu ilə göndərir və bir saatdan sonra müddəti bitən sessiya JWT-si alır; qaytarılan `refreshToken` eyni `exp` dəyərini daşıyır, buna görə yeniləmə açarın yenidən dəyişdirilməsi deməkdir. -`open-sse/services/cursorApiKeyAuth.ts` bu dəyişdirməni həyata keçirir, hər açar üçün bir sessiya tokenini keşləyir, müddətin bitməsinə beş dəqiqə qalmış açarı yenidən dəyişdirir və Cursor 401 cavabı verdikdə keşlənmiş tokeni silir. `CursorExecutor` `cursor-api` bağlantıları üçün yuxarı axın yayımını açmazdan dərhal əvvəl onu çağırır. +`api2.cursor.sh` xam `crsr_…` açarını Bearer tokeni kimi rədd edir (401). Cursor CLI əvvəlcə açarı `/auth/exchange_user_api_key` ünvanına POST edir və bir saatdan sonra müddəti bitən sessiya JWT-si alır; qaytarılan `refreshToken` eyni `exp` dəyərini daşıyır, buna görə yeniləmə açarın yenidən mübadilə edilməsi deməkdir. +`open-sse/services/cursorApiKeyAuth.ts` həmin mübadiləni həyata keçirir, hər açar üçün bir sessiya tokenini keşləyir, müddətin bitməsinə beş dəqiqə qalmış yenidən mübadilə edir və Cursor 401 cavabı verdikdə keşlənmiş tokeni silir. `CursorExecutor`, `cursor-api` bağlantıları üçün yuxarı axın yayımını açmazdan dərhal əvvəl onu çağırır. ## `cursor-api` provayderi @@ -44,35 +44,48 @@ curl -sS http://localhost:20128/v1/chat/completions \ Qeydlər: -- `cursor-api` üçün modellərin siyahısı statik Cursor reyestrindən gəlir (IDE provayderinin ehtiyat olaraq istifadə etdiyi eyni siyahı); OmniRoute hostunda `cursor-agent` quraşdırılmasına ehtiyac yoxdur. +- `cursor-api` üçün model siyahısı statik Cursor reyestrindən gəlir (IDE provayderinin ehtiyat variant kimi istifadə etdiyi eyni siyahı); OmniRoute hostunda `cursor-agent` quraşdırılmasına ehtiyac yoxdur. - `POST /api/providers/{id}/refresh-cursor` yalnız `cursor` IDE provayderi üçündür; `cursor-api` bağlantılarında yenilənəcək IDE sessiyası yoxdur. -## Cursor CLI birbaşa ötürməsi +## Doğma model ID-ləri və səy səviyyəsi + +`cursor` / `cu` və `cursor-api` / `cua` üçün ortaq Claude səy normallaşdırıcısı tələb olunan model ID-sini olduğu kimi saxlayır. Cursor `-low` kimi bir suffiksi OmniRoute səy aliası kimi deyil, real model ID-sinin bir hissəsi kimi təqdim edə bilər. +Cursor icraçısı canlı kataloqdakı dəqiq uyğunluğu qoruyur; uyğunluq olmadıqda, onun mövcud model həlledicisi suffiksdən parametrə ehtiyat çevrilməni idarə edir. + +Bu, birbaşa Claude, Claude-uyğun və ya Vertex marşrutları üçün səy normallaşdırmasını dəyişmir. Əlçatanlıq yenə də seçilmiş Cursor hesabının kataloqundan və hüquqlarından asılıdır. + +## Cursor CLI keçidi Marşrut: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. `/api/cursor-cli/` prefiksi -`src/shared/constants/publicApiRoutes.ts` faylında qeydiyyatdan keçirilib, çünki işləyici öz autentifikasiyasını tətbiq edir: +`src/shared/constants/publicApiRoutes.ts` faylında qeydiyyatdan keçirilib, çünki işləyici +öz autentifikasiyasını həyata keçirir: -| Yol | CLI-dən gözlənilən autentifikasiya | OmniRoute-un etdiyi | -| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Açarı doğrulayır, 1 saatlıq HS256 JWT (`JWT_SECRET` ilə imzalanır) yaradır və onu qaytarır | -| bütün digər yollar (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Emitenti/auditoriyanı/bitmə müddətini doğrulayır, aktiv `cursor-api` bağlantısı seçir, Authorization başlığını dəyişdirilmiş Cursor tokeni ilə əvəz edir və cavabı geri yayımlayır | +| Yol | CLI-dan gözlənilən autentifikasiya | OmniRoute-un etdiyi | +| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Açarı doğrulayır, 1 saatlıq HS256 JWT (`JWT_SECRET` ilə imzalanmış) yaradır və onu qaytarır | +| bütün digər yollar (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Emitenti/auditoriyanı/etibarlılıq müddətini yoxlayır, aktiv `cursor-api` bağlantısı seçir, Authorization başlığını mübadilə edilmiş Cursor tokeni ilə əvəzləyir və cavabı geri yayımlayır | -CLI aldığı istənilən tokendən `exp` dəyərini dekodlaşdırır, buna görə ona qeyri-şəffaf token verilməsi demək olar ki, hər sorğudan əvvəl yenidən dəyişdirmə aparmasına səbəb olur; yaradılmış JWT bunun qarşısını alır. OmniRoute-dan gələn 401 cavabı CLI-nin dəyişdirməni yenidən həyata keçirməsinə səbəb olur. +CLI aldığı istənilən tokendən `exp` dəyərini deşifrə edir, buna görə də ona qeyri-şəffaf +token verilməsi demək olar ki, hər sorğudan əvvəl yenidən mübadilə etməsinə səbəb olur; yaradılmış JWT +bunun qarşısını alır. OmniRoute-dan gələn 401 cavabı CLI-ın yenidən mübadilə etməsinə səbəb olur. ### Quraşdırma -1. OmniRoute API açarı (Dashboard → API keys) və `cursor-api` bağlantısı yaradın. -2. CLI-yə agent yayımı üçün HTTP/1.1 istifadə etməsini bildirin. +1. OmniRoute API açarı (İdarəetmə paneli → API açarları) və `cursor-api` + bağlantısı yaradın. +2. CLI-a agent axını üçün HTTP/1.1 istifadə etməsini bildirin. `~/.cursor/cli-config.json` faylında: ```json { "network": { "useHttp1ForAgent": true } } ``` - Bu parametr olmadan CLI agent sorğusunu ayrıca konfiqurasiya edilmiş agent hostuna HTTP/2 üzərindən açır və endpoint vasitəsilə yalnız idarəetmə müstəvisi RPC-ləri keçir. + Bu parametr olmadan CLI agent gedişini ayrıca konfiqurasiya edilmiş + agent hostuna HTTP/2 üzərindən açır və yalnız idarəetmə müstəvisi RPC-ləri + son nöqtədən keçir. -3. CLI-ni OmniRoute-a qarşı işə salın: +3. CLI-ı OmniRoute ilə işlədin: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -80,17 +93,19 @@ CLI aldığı istənilən tokendən `exp` dəyərini dekodlaşdırır, buna gör agent -p --trust "Reply with exactly OK" ``` -Hər keçid Logs bölməsinə `cursor-api` provayderi, `cursor-cli` sorğu növü və `/api/cursor-cli/` yolu ilə düşür və OmniRoute API açarı ilə ona xidmət göstərən bağlantıya aid edilir. +Hər keçid Jurnallarda `cursor-api` provayderi, `cursor-cli` sorğu növü və +`/api/cursor-cli/` yolu ilə qeydə alınır və OmniRoute API açarına, həmçinin +sorğunu emal etmiş bağlantıya aid edilir. ### Xəta halları | Vəziyyət | CLI-a cavab | | --------------------------------------------------- | ------------------------------------------------ | | Naməlum OmniRoute açarı və `REQUIRE_API_KEY=true` | Mübadilə zamanı 401 `unauthenticated` | -| `REQUIRE_API_KEY=false` | Anonim sessiya (`/v1/*` davranışını təkrarlayır) | +| `REQUIRE_API_KEY=false` | anonim sessiya (`/v1/*` davranışını təkrarlayır) | | Müddəti bitmiş / yad / dəyişdirilmiş sessiya JWT-si | 401, CLI yenidən mübadilə edir | -| Mübadilədən sonra OmniRoute API açarı ləğv edilib | Növbəti RPC zamanı 401 | +| OmniRoute API açarı mübadilədən sonra ləğv edilib | Növbəti RPC zamanı 401 | | Aktiv `cursor-api` bağlantısı yoxdur | 503 `unavailable` | -| Cursor bağlantı açarını rədd edir | 401 `unauthenticated`, keşlənmiş sessiya silinir | -| Yuxarı axın əlçatmazdır | 502 `unavailable` (təmizlənmiş mesaj) | +| Cursor bağlantının açarını rədd edir | 401 `unauthenticated`, keşlənmiş sessiya silinir | +| Yuxarı axın əlçatan deyil | 502 `unavailable` (təmizlənmiş mesaj) | | `JWT_SECRET` təyin edilməyib | Mübadilə zamanı 503 | diff --git a/docs/i18n/az/docs/reference/API_REFERENCE.md b/docs/i18n/az/docs/reference/API_REFERENCE.md index 0f3abf868f01..5b54ca2f6e44 100644 --- a/docs/i18n/az/docs/reference/API_REFERENCE.md +++ b/docs/i18n/az/docs/reference/API_REFERENCE.md @@ -438,48 +438,48 @@ Sidecar prosesdən kənarda işlədikdə və `open-sse/config/providerPluginMani --- -## Uyğunluq Son Nöqtələri - -| Metod | Yol | Format | -| ----- | ----------------------------------------- | ------------------------------------------ | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (redaktə/doldurma) | -| POST | `/v1/videos/generations` | OpenAI üslubunda video generasiyası | -| POST | `/v1/music/generations` | OpenAI üslubunda musiqi generasiyası | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (nitqdən mətnə) | -| POST | `/v1/audio/speech` | OpenAI TTS (audio gövdəsi qaytarır) | -| POST | `/v1/rerank` | Cohere/Voyage üslubunda yenidən sıralama | -| POST | `/v1/classify` | Jina təsnifatı (`api.jina.ai`) | -| POST | `/v1/segment` | Jina seqmentatoru (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | OpenAI kataloq aliası | -| GET | `/api/v1/vscode/{token}/models` | OpenAI modellər aliası | -| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokenləşdirilmiş aliası | -| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokenləşdirilmiş aliası | -| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenləşdirilmiş aliası | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama teqləri üçün tokenləşdirilmiş alias | - -Bütün POST marşrutları eyni struktura uyğundur: `Bearer your-api-key` + Zod tərəfindən doğrulanan JSON gövdəsi (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` və s.; `src/shared/validation/schemas.ts` faylına baxın). Sxem doğrulaması uğursuz olduqda 4xx qaytarılır. - -`Authorization: Bearer ...` əlavə edə bilməyən müştərilər üçün OmniRoute API açarlarını URL daxilində də qəbul edir: ya sorğu sətri uyğunluğu (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), ya da aşağıda sənədləşdirilmiş xüsusi `/api/v1/vscode/{token}/...` son nöqtələri vasitəsilə. +## Uyğunluq endpoint-ləri + +| Metod | Yol | Format | +| ----- | ----------------------------------------- | ------------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (redaktə/inpaint) | +| POST | `/v1/videos/generations` | OpenAI üslubunda video generasiyası | +| POST | `/v1/music/generations` | OpenAI üslubunda musiqi generasiyası | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (audio gövdəsi qaytarır) | +| POST | `/v1/rerank` | Cohere/Voyage üslubunda yenidən sıralama | +| POST | `/v1/classify` | Jina təsnifatı (`api.jina.ai`) | +| POST | `/v1/segment` | Jina seqmentləşdiricisi (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | OpenAI kataloq aliası | +| GET | `/api/v1/vscode/{token}/models` | OpenAI modelləri aliası | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokenləşdirilmiş aliası | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokenləşdirilmiş aliası | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenləşdirilmiş aliası | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama teqləri üçün tokenləşdirilmiş alias | + +Bütün POST marşrutları eyni quruluşa malikdir: `Bearer your-api-key` + Zod tərəfindən doğrulanan JSON gövdəsi (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` və s.; `src/shared/validation/schemas.ts` faylına baxın). Sxem doğrulaması uğursuz olduqda 4xx qaytarılır. + +`Authorization: Bearer ...` əlavə edə bilməyən klientlər üçün OmniRoute API açarlarını həm sorğu sətri uyğunluğu (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), həm də aşağıda sənədləşdirilmiş xüsusi `/api/v1/vscode/{token}/...` endpoint-ləri vasitəsilə URL-də qəbul edir. ```bash -# Yenidən sıralama +# Yenidən sıralama (bulud reyestri provayderi və ya "/" şəklində OpenAI-uyğun provayder qovşağı) POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina təsnifatı (Foundation API etimadnamələri) +# Jina təsnifatı (Foundation API giriş məlumatları) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Jina seqmentatoru +# Jina seqmentləşdiricisi POST /v1/segment { "content": "...", "return_chunks": true } # Jina axtarışı (s.jina.ai; provayder aliasları: jina-search, jina-ai, jina) @@ -488,17 +488,39 @@ POST /v1/search { "query": "...", "provider": "jina-search" } # Moderasiya POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — audio/mpeg (və ya tələb olunan formatda) gövdəsi qaytarır +# TTS — audio/mpeg (və ya tələb olunan formatda) gövdə qaytarır POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Şəkil redaktəsi (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Video / musiqi generasiyası (provayder prefiksli model ID-si) +# Video / musiqi generasiyası (provayder prefiksli model identifikatoru) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Yenidən sıralama provayder qovşaqları:** `POST /v1/rerank` sorğuları həmçinin `/` kimi ünvanlanan +> OpenAI-uyğun provayder qovşaqlarına (oMLX, vLLM, Infinity, şlüz arxasındakı TEI, …) yönləndirir. Loopback +> qovşaqları (`localhost`, `127.0.0.1`, `172.16.0.0/12`) həmişə uyğundur. İstənilən digər hostdakı +> qovşaqlar — LAN-dakı cihaz və ya Tailscale tərəfi — yalnız operator `RERANK_REMOTE_PROVIDER_NODES` +> funksiya bayrağını aktiv etdikdə **və** qovşağın baza URL-i provayderin çıxış URL siyasətindən +> (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) keçdikdə uyğundur; +> bulud metadata hostlarına heç vaxt yönləndirmə aparılmır. Yaddaş mühərrikinin yenidən sıralama mərhələsi bu marşrutu +> loopback üzərindən çağırır, buna görə də eyni qayda Yaddaş ayarlarındakı `rerankProviderModel` üçün də keçərlidir. +> +> **Lokal server strukturları:** qovşaq `/v1/rerank` ünvanında, 404 halında isə `/rerank` +> ünvanında çağırılır (Infinity, TEI). Yuxarı axına göndərilən gövdə həm Cohere/OpenAI yazılışını (`documents`, +> `return_documents`), həm də TEI yazılışını (`texts`, `return_text`) ehtiva edir və yuxarı axından gələn cavab +> Cohere zərfinə normallaşdırılır: TEI-nin sadə `[{index, score, text}]` formatı, yüngül şlüzlərdən gələn +> `{results: [{index, score}]}` və Voyage üslubundakı `{data: [...]}` cavablarının hamısı klientə +> `{results: [{index, relevance_score, document?}]}` şəklində, xala görə sıralanmış və `top_n` ilə məhdudlaşdırılmış olaraq qaytarılır. + +> **Provayder qovşaqlarının aşkarlanması:** OpenAI-uyğun provayder qovşağındakı modellər `GET /v1/models` +> daxilində qovşaq prefiksi altında görünür. Endpoint metadatası olmayan sətirlər (lokal `/v1/models` siyahıları üçün tipikdir) +> qovşağın `apiType` dəyərini miras alır; beləliklə, susmaya görə çat kimi qəbul edilmək əvəzinə, `embeddings` +> qovşağının modelləri `type: "embedding"`, `rerank` qovşağının modelləri isə `type: "rerank"` olur. +> Sinxronlaşdırılmış və ya əl ilə əlavə edilmiş sətirdə açıq şəkildə göstərilən `supportedEndpoints` yenə də üstünlüyə malikdir. + ### Xüsusi Provayder Marşrutları ```bash diff --git a/docs/i18n/az/docs/reference/ENVIRONMENT.md b/docs/i18n/az/docs/reference/ENVIRONMENT.md index 2f569c70d8d8..3fd4f5821d76 100644 --- a/docs/i18n/az/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/az/docs/reference/ENVIRONMENT.md @@ -77,74 +77,73 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" --- -## 2. Saxlama və verilənlər bazası - -OmniRoute bütün daimi məlumatların saxlanması üçün **SQLite**-dan (`better-sqlite3` vasitəsilə) istifadə edir. Bu dəyişənlər məlumatların yerini, şifrələnməsini və həyat dövrünü idarə edir. - -| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite verilənlər bazası, ehtiyat nüsxələr və məlumat faylları üçün kök qovluq. Docker həcmləri və ya fərdi yollar üçün bunu dəyişdirin. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(təyin edilməyib)_ | `src/lib/dataPaths.ts` | Test/qiymətləndirmə üçün DATA_DIR qoruyucu mexanizmini keçməyə imkan verən vasitədir (#10428). `DATA_DIR` təyin edilmədən işləyən testlər və Node eval/print yoxlamaları (`-e`/`--eval`/`-p`/`--print`, o cümlədən `--eval=`/`--print=` formaları) operatorun real verilənlər bazasını aça bilməmələri üçün birdəfəlik müvəqqəti qovluğa yönləndirilir; real qovluqdan yenidən istifadə etmək üçün bunu `1` olaraq təyin edin. | -| `OMNIROUTE_BUILD_SHA` | _(təyin edilməyib)_ | `src/lib/monitoring/buildSha.ts` | İşləyən artefaktın Git SHA-sı. `npm run build:release` tərəfindən əlavə edilir; `dist/BUILD_SHA` marker faylı olmadan çatdırılan konteynerlərə yeridilə bilər. `/api/monitoring/health` ünvanında `system.buildSha` kimi göstərilir. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Artefaktın paketlənməsi üçün mənşə yoxlamasının qurma SHA-sını müqayisə etdiyi istinad (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(təyin edilməyib)_ | `scripts/build/buildProvenance.ts` | SHA-sı buraxılış xəttində olmayan qurmanın paketlənməsinə icazə vermək və yoxlamanı uğursuz etmək əvəzinə onu məqsədli sınaq qurması kimi qeydə almaq üçün `1` olaraq təyin edin (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(təyin edilməyib)_ | `scripts/ops/deploy-canary.mjs` | Sınaq yerləşdirməsinin smoke yoxlaması üçün API açarı; `/v1/chat/completions` ünvanına `Authorization: Bearer` kimi göndərilir. Yalnız yerləşdirmə skripti tərəfindən istifadə olunur (#10429), server tərəfindən heç vaxt istifadə edilmir. Qoşulması seçimə bağlı CLI smoke mexanizminin `OMNIROUTE_SMOKE_*` dəyişənləri ilə əlaqəli deyil (`tests/integration/upstream-cli-smoke.int.test.ts` daxilində `RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`) — baxın: [CLI inteqrasiyaları → Real smoke yoxlaması](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(təyin edilməyib)_ | `src/lib/buildPhase.ts` | Qurma mərhələsi siqnalı (#10060): `scripts/build/build-next-isolated.mjs` tərəfindən `1` olaraq təyin edilir və işə salınan hər bir qurma işçisi tərəfindən miras alınır; bunun sayəsində verilənlər bazası qatı native `better-sqlite3` əlavəsini yükləmək əvəzinə heç bir əməliyyat yerinə yetirməyən saxta obyekt qaytarır (əks halda əlavə, çıxış zamanı işçinin fəaliyyətini dayandırır). İşləyən server üçün heç vaxt təyin edilmir. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Qeyri-standart, layihəyə daxil edilmiş asılılıq ağacları üçün seçimə bağlı native asılılıqların əvvəlcədən qurulma yoxlamasını keçmək məqsədilə `1` olaraq təyin edin. Bu, çatışmayan asılılıqla qurmanı mümkün etmir; yalnız native asılılıqlar ayrıca təmin edildikdə istifadə edin. | -| `OMNIROUTE_DATA_DIR` | _(təyin edilməyib)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR` üçün **ehtiyat alias**; yalnız `DATA_DIR` təyin edilmədikdə yoxlanılır. PromptQL icraedicisinin diskdəki axına bağlı sessiya keşini (`/promptql-thread-sessions.json`) tapmaq üçün istifadə olunur; dəyişənlərin heç biri təyin edilmədikdə keş yalnız yaddaşda saxlanılır (yenidən başladılmalar arasında qorunmur). | -| `OMNIROUTE_PLUGINS_DIR` | _(təyin edilməyib)_ | `src/lib/plugins/scanner.ts` | **İcra zamanı plagin skanerinin** oxuduğu və plagin menecerinin quraşdırma apardığı kök qovluqdur; ev qovluğundan əldə edilən standart yolu əvəz edir (#11827). Yalnız skan yolunun yerini dəyişmək üçün HOME dəyişənini dəyişmək əvəzinə bunu Docker/K8s daxilində bind-mount edilmiş plagin ağacına yönəldin (HOME digər bütün ev qovluğuna nisbətli davranışları da idarə edir). Təyin edilmədikdə = `~/.omniroute/plugins`; proses ümumiyyətlə ev qovluğu ixrac etmirsə, `/tmp/.omniroute/plugins` — bu dəyişən məhz həmin səssiz aşkarlanmama problemini aradan qaldırır. Müəyyən edilmiş qovluq, üstünlük qazanan girişlə birlikdə, başlanğıc zamanı bir dəfə `scanner.dir_resolved` kimi jurnala yazılır. Yalnız server tərəfi üçün: CLI əmr plaginləri öz `OMNIROUTE_PLUGIN_PATH` dəyişənindən istifadə etməyə davam edir (bölmə 9). | -| `STORAGE_ENCRYPTION_KEY` | _(boş = deaktivdir)_ | `src/lib/db/encryption.ts` | SQLite verilənlər bazasının saxlanma zamanı tam şifrələnməsi üçün AES açarı. `openssl rand -hex 32` ilə yaradın. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Şifrələmə açarı üçün versiya etiketi. Köhnə ehtiyat nüsxələrin şifrəsinin açılmasını dəstəkləmək üçün açar rotasiyası zamanı artırın. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` olduqda rutin/yazmadan əvvəlki SQLite fayl ehtiyat nüsxələri (models.dev qiymətlərinin saxlanması/təmizlənməsi, parametrlərin yazılması) ötürülür. Əl ilə və bərpadan əvvəl yaradılan ehtiyat nüsxələr hələ də icra olunur. Bu, miqrasiya icraedicisinin məcburi dayanıqlı təhlükəsizlik ani görüntüsünü və ya mövcud daimi VB üçün kütləvi miqrasiya qoruyucusunu deaktiv **etmir**. Əl ilə yaradılmayan ehtiyat nüsxələr ən çox 60 dəqiqədə bir dəfə ilə məhdudlaşdırılır. İdarəetmə panelindəki **Parametrlər → Yaddaş** bölməsi rutin avtomatik ehtiyat nüsxələməni müstəqil şəkildə deaktiv edə bilər. | -| `OMNIROUTE_CRYPT_KEY` | _(təyin edilməyib)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` üçün **köhnə alias**. Əsas dəyişən olmadıqda ehtiyat variant kimi qəbul edilir. | -| `OMNIROUTE_API_KEY_BASE64` | _(təyin edilməyib)_ | `src/lib/db/encryption.ts` | Ehtiyat variant kimi qəbul edilən **köhnə alias** (Base64 ilə kodlaşdırılmış forma). İstifadədən əvvəl avtomatik dekodlanır. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(təyin edilməyib)_ | `src/lib/db/core.ts` | Dövri SQLite sağlamlıq yoxlaması intervalını (ms) dəyişdirin. Təyin edilmədikdə standart dəyərlər `NODE_ENV` əsasında müəyyən edilir. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 saat) | `src/lib/db/walMaintenance.ts` | Dövri `wal_checkpoint(TRUNCATE)` intervalını (ms) dəyişdirin. Avtomatik yoxlama nöqtəsi WAL faylının özünü heç vaxt kiçiltmir və uzun müddət işləyən server heç vaxt öz VB-sini bağlamır. `0` deaktiv edir. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 dəq) | `src/lib/db/walMaintenance.ts` | Tez-tez icra olunan `wal_checkpoint(PASSIVE)` intervalını (ms) dəyişdirin. Gözləyən WAL freymlərini kiçik saxlayır ki, dövri TRUNCATE əsas axında çox GB-lıq yığıntını heç vaxt köçürməsin. `0` deaktiv edir. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | PASSIVE icrası WAL faylının bu ölçüdən böyük olduğunu aşkar etdikdə yavaş icranı gözləmək əvəzinə dərhal `wal_checkpoint(TRUNCATE)` əməliyyatına keçir. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Kritik resurs təzyiqi `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` müddətində davam etdikdən sonra prosesdən çıxmaq üçün `1`/`true`/`yes`/`on` olaraq təyin edin; beləliklə, nəzarətçi (systemd `Restart=always`, Docker yenidən başlatma siyasəti) sonsuz müddət 503 cavabları vermək əvəzinə təmiz prosesi yenidən işə sala bilər. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 dəq) | `open-sse/utils/resourcePressure.ts` | Özünü yenidən başlatmaq üçün çıxışın işə düşməsindən əvvəl kritik təzyiqin nə qədər davam etməli olduğu. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(avtomatik aşkarlama)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ehtiyat adapterindən istifadə edərkən `sql-wasm.wasm` faylına açıq yol (mütləq və ya cwd-yə nəzərən nisbi). Təyin edilmədikdə paket asılılıqları və namizəd düzənlər vasitəsilə avtomatik aşkarlanır. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 saat) | `src/lib/db/core.ts` | Dövri `wal_checkpoint(TRUNCATE)` intervalını (ms) dəyişdirin. Avtomatik yoxlama nöqtəsi WAL faylının özünü heç vaxt kiçiltmir və uzun müddət işləyən server heç vaxt öz VB-sini bağlamır. `0` deaktiv edir. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Son vəziyyətdə olan (tamamlanmış/uğursuz/ləğv edilmiş/müddəti bitmiş) Batch API tapşırığının yoxlama nöqtələrinin, istinad edilən giriş/çıxış/xəta fayllarının və sətrinin silinməzdən əvvəl avtomatik təmizləmə əməliyyatı tərəfindən saxlanıldığı günlərin sayı. Yalnız `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` aktiv edildikdən sonra qüvvəyə minir; OpenAI-ın öz Batch API çıxışlarının saxlanma müddətinə uyğundur. Operator tərəfindən başladılan `DELETE /api/v1/batches/delete-completed` marşrutuna təsir etmir; bu marşrut nəzərdə tutulduğu kimi şərtsiz (yaş filtri olmadan) qalır. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` olduqda, avtomatik təmizləmə prosesinə `OMNIROUTE_BATCH_RETENTION_DAYS` müddətini keçmiş, son vəziyyətdə olan Batch API tapşırıqlarını (və onların yoxlama nöqtələrini) silməyə və öz `expires_at` vaxtını keçmiş yüklənmiş faylların BLOB məzmununu təmizləməyə icazə verir. Defolt olaraq deaktivdir: operator bunu aktivləşdirənədək hər bir mövcud quraşdırma bu məlumatları əvvəlki kimi saxlayır. Həmçinin idarəetmə panelindən redaktə edilə bilən funksiya bayrağıdır — baxın: `docs/reference/FEATURE_FLAGS.md` → İcra vaxtı. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Başlanğıc zamanı DB sağlamlıq yoxlamasını tamamilə ötürmək üçün `1` olaraq təyin edin. Qısamüddətli tapşırıqlar və inteqrasiya testləri üçün faydalıdır. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | DB sağlamlıq yoxlaması dövrəsini, normalda ötürüləcəyi hallarda belə (məsələn, qısamüddətli tapşırıqlarda) məcburi aktivləşdirmək üçün `1` olaraq təyin edin. | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` zamanı yerli icra mühitinin ilkin hazırlanmasını ötürmək üçün `1` olaraq təyin edin. sqlite artıq yığılmış olduqda CI/qrafik interfeyssiz quraşdırmalar üçün faydalıdır. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(avtomatik aşkarlama)_ | `src/lib/db/migrationRunner.ts` | Miqrasiya icraedicisinin skan etdiyi qovluğu əvəz edin. Fərdi yığımlarda paketlənmiş miqrasiyaları təqdim edərkən faydalıdır. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(təyin edilməyib)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Platformanın yol ayırıcısı ilə ayrılmış `namespace=dir` qeydləri şəklində əlavə miqrasiya qovluqları (məsələn, `ee=/opt/app/enterprise/db/migrations`). Orada tapılan fayllar `-` kimi qeydə alınır, beləliklə, öz miqrasiyalarını təqdim edən distributiv yuxarı axının rəqəmli yuvaları ilə heç vaxt toqquşmur. Səhv formatlı qeyd, etibarsız ad sahəsi və ya mövcud olmayan qovluq sxemi səssizcə ötürmək əvəzinə başlanğıc zamanı xəta yaradır. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Kütləvi gözləyən miqrasiyalar üçün təhlükəsizlik həddi (#3416). Mövcud DB-də bu saydan daha çox miqrasiya gözləyirsə, başlanğıc dayandırılır (silinmiş izləmə cədvəlindən qoruyur). Daha köhnə ehtiyat nüsxəni bərpa etmək üçün həddi artırın; yoxlamanı deaktiv etmək üçün `0` olaraq təyin edin. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` buraxılış keçidi üçün iş qovluğu. Təxminən 12 GB tələb edir (iki ~3 GB-lıq quraşdırma ağacı və tarball), buna görə də kiçik tmpfs-də işləməməlidir — öz serverində yerləşdirilən icraçıda `/tmp` 12 GB-lıq RAM əsaslı tmpfs-dir və keçid onu dolduraraq paketi yarımçıq qoyub. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(defolt kodda)_ | `src/lib/spend/batchWriter.ts` | Paketlənmiş xərc/məsrəf yazıcısı üçün boşaltma intervalı (ms). Aşağı dəyərlər yazıların birləşdirilməsini azaldır; yüksək dəyərlər DB rəqabətini azaldır. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(defolt kodda)_ | `src/lib/spend/batchWriter.ts` | Məcburi boşaltmadan əvvəl buferdə saxlanılan maksimum xərc qeydlərinin sayı. Yüksək QPS-li yerləşdirmələrdə artırın; məhdud yaddaş daha vacib olduqda azaldın. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(təyin edilməyib)_ | `open-sse/utils/proxyFetch.ts` | Vercel relay yolunda `[ProxyFetch]` sazlama jurnallarını çıxarmaq üçün `"true"` olaraq təyin edin. Marşrutlaşdırma ipuclarının sızmasının qarşısını almaq üçün defolt olaraq deaktivdir. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Ətraflı `[ProxyEgress]` proses jurnalı sətrinə müştəri/çıxış IP-lərini və hesab prefiksini daxil etmək üçün `"true"` və ya `"1"` olaraq təyin edin. Proses jurnalının IP-ləri və ya hesab prefiksini sızdırmaması üçün defolt olaraq DEAKTİV saxlanılır. | -| `OMNIROUTE_DEBUG` | _(təyin edilməyib)_ | `bin/cli/commands/quota.mjs` | CLI kvota əmrlərindən stderr-ə hər sorğu üzrə vaxt diaqnostikasını (`[omniroute] GET completed in Nms`) çap etmək üçün `1` olaraq təyin edin. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(avtomatik)_ | `scripts/dev/healthcheck.mjs` | Konteynerin sağlamlıq yoxlaması tərəfindən sorğulanan açıq yol. Təyin edilmədikdə sorğu yolu `OMNIROUTE_BASE_PATH` əsasında müəyyən edir; onu təyin etmək dərin monitorinq son nöqtəsini yenidən aktivləşdirir. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(təyin edilməyib)_ | `bin/cli/commands/completion.mjs` | CLI qabıq tamamlama keşinin yollarından (oxuma/yeniləmə/yazma) `[omniroute completion]` diaqnostikasını çıxarmaq üçün istənilən boş olmayan dəyərə təyin edin. Defolt olaraq deaktivdir — bu keşlərdəki xətalar səssizcə nəzərə alınmır ki, çatışmayan/zədələnmiş keş tab ilə tamamlamanı heç vaxt pozmasın. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 saat) | `open-sse/services/batchProcessor.ts` | Ayrı-ayrı paket elementləri üçün maksimum yenidən cəhd müddəti (ms). Bu müddəti aşan elementlər uğursuz kimi işarələnir. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Paket elementlərinin yenidən sınanması zamanı eksponensial gecikmə üçün baza gecikməsi (ms). | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 saat) | `open-sse/services/batchProcessor.ts` | Paket elementlərinin yenidən sınanması arasındakı eksponensial gecikmə üçün maksimum hədd (ms). | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Eyni vaxtda emal edilən paketlərin maksimum sayı. Məhsuldarlığı artırmaq üçün yüksəldin; sürət məhdudiyyəti ilə bağlı kütləvi xətaların qarşısını almaq üçün aşağı saxlayın. | +## 2. Saxlama və Verilənlər Bazası + +OmniRoute bütün davamlı məlumat saxlanması üçün **SQLite**-dan (`better-sqlite3` vasitəsilə) istifadə edir. Bu dəyişənlər məlumatların yerini, şifrələnməsini və həyat dövrünü idarə edir. + +| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite verilənlər bazası, ehtiyat nüsxələr və məlumat faylları üçün kök kataloq. Docker həcmləri və ya fərdi yollar üçün dəyişdirin. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(təyin edilməyib)_ | `src/lib/dataPaths.ts` | Test/qiymətləndirmə DATA_DIR qoruyucusu üçün istisna mexanizmi (#10428). `DATA_DIR` olmadan işləyən testlər və Node eval/print yoxlamaları (`-e`/`--eval`/`-p`/`--print`, o cümlədən `--eval=`/`--print=` formaları) birdəfəlik müvəqqəti kataloqa yönləndirilir ki, operatorun real verilənlər bazasını aça bilməsinlər; real kataloqdan yenidən istifadəni seçmək üçün bunu `1` olaraq təyin edin. | +| `OMNIROUTE_BUILD_SHA` | _(təyin edilməyib)_ | `src/lib/monitoring/buildSha.ts` | İşləyən artefaktın Git SHA-sı. `npm run build:release` tərəfindən qeyd olunur; `dist/BUILD_SHA` sentinel faylı olmadan göndərilən konteynerlərə daxil edilə bilər. `/api/monitoring/health` ünvanında `system.buildSha` kimi göstərilir. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Paketləmə artefaktının mənşə yoxlama mexanizminin build SHA-nı müqayisə etdiyi istinad (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(təyin edilməyib)_ | `scripts/build/buildProvenance.ts` | SHA-sı buraxılış xəttində olmayan bir build-in paketlənməsinə icazə vermək üçün bunu `1` olaraq təyin edin; bu halda yoxlama xətası əvəzinə həmin build qəsdən yaradılmış canary kimi qeydə alınır (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(təyin edilməyib)_ | `scripts/ops/deploy-canary.mjs` | Canary yerləşdirməsinin smoke yoxlaması üçün API açarı; `/v1/chat/completions` ünvanına `Authorization: Bearer` kimi göndərilir. Yalnız yerləşdirmə skripti tərəfindən istifadə olunur (#10429), server tərəfindən heç vaxt istifadə edilmir. İstəyə bağlı CLI smoke test mexanizminin `OMNIROUTE_SMOKE_*` dəyişənləri ilə əlaqəli deyil (`tests/integration/upstream-cli-smoke.int.test.ts` faylındakı `RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`) — baxın: [CLI İnteqrasiyaları → Real smoke yoxlaması](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(təyin edilməyib)_ | `src/lib/buildPhase.ts` | Build mərhələsi siqnalı (#10060): `scripts/build/build-next-isolated.mjs` tərəfindən `1` olaraq təyin edilir və yaradılan hər bir build işçisi tərəfindən miras alınır ki, verilənlər bazası qatı yerli better-sqlite3 əlavəsini yükləmək əvəzinə heç bir əməliyyat yerinə yetirməyən stub qaytarsın (həmin əlavə çıxış zamanı işçini dayandırır). İşləyən server üçün heç vaxt təyin edilmir. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Qeyri-adi vendored ağacları üçün istəyə bağlı yerli asılılıqların əvvəlcədən build yoxlamasını keçmək məqsədilə bunu `1` olaraq təyin edin. Bu, çatışmayan asılılığı build edilə bilən etmir; yalnız yerli asılılıqlar ayrıca kanalla təmin edildikdə istifadə edin. | +| `OMNIROUTE_DATA_DIR` | _(təyin edilməyib)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR` üçün **ehtiyat alias**; yalnız `DATA_DIR` təyin edilmədikdə yoxlanılır. PromptQL icraçısının diskdəki thread-sticky sessiya keşini (`/promptql-thread-sessions.json`) tapmaq üçün istifadə olunur; dəyişənlərin heç biri təyin edilməzsə, keş yalnız yaddaşda qalır (yenidən başlatmalar arasında saxlanmır). | +| `OMNIROUTE_PLUGINS_DIR` | _(təyin edilməyib)_ | `src/lib/plugins/scanner.ts` | **İcra zamanı plagin skanerinin** oxuduğu və plagin menecerinin quraşdırma apardığı kök kataloq; ev kataloqu əsasında müəyyən edilən standart dəyəri əvəz edir (#11827). Yalnız skan yolunu dəyişmək üçün HOME-u köçürmək əvəzinə, bunu Docker/K8s-də bind-mount edilmiş plagin ağacına yönəldin (HOME ev kataloquna nisbətən olan bütün digər davranışları da idarə edir). Təyin edilmədikdə = `~/.omniroute/plugins`; proses ümumiyyətlə ev kataloqu ixrac etmədikdə isə `/tmp/.omniroute/plugins` — bu dəyişən səssiz aşkarlanmama problemini aradan qaldırır. Həll edilmiş kataloq işəsalma zamanı üstün gələn girişlə birlikdə `scanner.dir_resolved` kimi bir dəfə jurnala yazılır. Yalnız server tərəfi üçün: CLI əmr plaginləri öz `OMNIROUTE_PLUGIN_PATH` dəyişənindən istifadə etməyə davam edir (bölmə 9). | +| `STORAGE_ENCRYPTION_KEY` | _(boş = deaktiv edilib)_ | `src/lib/db/encryption.ts` | Saxlama zamanı bütün SQLite verilənlər bazasının şifrələnməsi üçün AES açarı. `openssl rand -hex 32` ilə yaradın. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Şifrələmə açarı üçün versiya etiketi. Köhnə ehtiyat nüsxələrin deşifrələnməsini dəstəkləmək üçün açar rotasiyası həyata keçirərkən artırın. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` olduqda, rutin/yazmadan əvvəlki SQLite fayl ehtiyat nüsxələri (models.dev qiymətlərinin saxlanması/təmizlənməsi, parametrlərin yazılması) ötürülür. Əl ilə və bərpadan əvvəl yaradılan ehtiyat nüsxələr yenə də işləyir. Bu, miqrasiya icraçısının məcburi davamlı təhlükəsizlik ani görüntüsünü və ya mövcud daimi DB üçün kütləvi miqrasiya qoruyucusunu deaktiv **etmir**. Əl ilə yaradılmayan ehtiyat nüsxələr ən çox hər 60 dəqiqədə bir dəfə ilə məhdudlaşdırılır. İdarəetmə panelində **Parametrlər → Yaddaş** bölməsi rutin avtomatik ehtiyat nüsxələməni müstəqil şəkildə deaktiv edə bilər. | +| `OMNIROUTE_CRYPT_KEY` | _(təyin edilməyib)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` üçün **köhnə alternativ ad**. Əsas dəyişən olmadıqda ehtiyat variant kimi qəbul edilir. | +| `OMNIROUTE_API_KEY_BASE64` | _(təyin edilməyib)_ | `src/lib/db/encryption.ts` | Ehtiyat variant kimi qəbul edilən **köhnə alternativ ad** (Base64 ilə kodlaşdırılmış forma). İstifadədən əvvəl avtomatik dekodlaşdırılır. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(təyin edilməyib)_ | `src/lib/db/core.ts` | Dövri SQLite sağlamlıq yoxlaması intervalını (ms) dəyişdirin. Təyin edilmədikdə standart dəyərlər `NODE_ENV` əsasında müəyyən edilir. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(silinib)_ | `src/lib/db/walMaintenance.ts` | **Silinib.** Dövri aktiv `wal_checkpoint(TRUNCATE)` paylaşılan wal-index xəritələndirməsini etibarsız edə və prosesi SIGBUS (#13973) ilə çökdürə bilər, buna görə də planlaşdırıcı artıq mövcud deyil. Dəyişən fəaliyyətsizdir: müsbət dəyər birdəfəlik köhnəlmə xəbərdarlığını qeydə alır, `0` və ya təyin edilməmiş dəyər isə səssiz qalır. WAL PASSIVE yoxlama nöqtələri (aşağıda) ilə saxlanılır və bağlanma yoxlama nöqtəsi ilə kiçildilir. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 dəq) | `src/lib/db/walMaintenance.ts` | Tez-tez icra olunan `wal_checkpoint(PASSIVE)` intervalını (ms) dəyişdirin. Gözləyən WAL kadrlarını kiçik saxlayır ki, yoxlama nöqtələri sürətli qalsın və WAL faylının ölçüsü bağlanma zamanı kiçiltmələr arasında məhdud olsun. `0` deaktiv edir. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | PASSIVE dövrü WAL faylının bu ölçüdən böyük olduğunu aşkar etdikdə, xəritələndirilmiş wal-index-i yenidən yazmadan WAL-ın yenidən başlaması üçün `wal_checkpoint(RESTART)` icra edilir. Aktiv truncate rejimli yoxlama nöqtələri silinib (`OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` sətrinə baxın). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Kritik resurs təzyiqi `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` müddətində davam etdikdən sonra prosesdən çıxmaq üçün `1`/`true`/`yes`/`on` olaraq təyin edin; bununla nəzarətçi (systemd `Restart=always`, Docker yenidən başlatma siyasəti) qeyri-müəyyən müddət ərzində 503 cavabları təqdim etmək əvəzinə təmiz prosesi yenidən işə sala bilər. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 dəq) | `open-sse/utils/resourcePressure.ts` | Özünü yenidən başlatma çıxışının işə düşməsindən əvvəl kritik təzyiqin nə qədər davam etməli olduğu. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(avtomatik aşkarlama)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ehtiyat adapterindən istifadə edərkən `sql-wasm.wasm` faylına açıq yol (mütləq və ya cwd-yə nəzərən nisbi). Təyin edilmədikdə paket asılılıqları və namizəd tərtibatları vasitəsilə avtomatik aşkarlanır. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Terminal vəziyyətli (tamamlanmış/uğursuz/ləğv edilmiş/müddəti bitmiş) Batch API tapşırığının yoxlama nöqtələrinin, istinad edilən giriş/çıxış/xəta fayllarının və sətrinin avtomatik təmizləmə zamanı silinməzdən əvvəl saxlanıldığı günlərin sayı. Yalnız `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` aktiv edildikdən sonra qüvvəyə minir; OpenAI-ın öz Batch API çıxışlarının saxlanma müddətinə uyğundur. Operator tərəfindən işə salınan `DELETE /api/v1/batches/delete-completed` marşrutuna təsir etmir; həmin marşrut dizayna əsasən şərtsiz qalır (yaş filtri yoxdur). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` olduqda avtomatik təmizləmə, `OMNIROUTE_BATCH_RETENTION_DAYS` müddətini keçmiş terminal vəziyyətli Batch API tapşırıqlarını (və onların yoxlama nöqtələrini) silir və öz `expires_at` müddətini keçmiş yüklənmiş faylların BLOB məzmununu təmizləyir. Standart olaraq deaktivdir: operator aktivləşdirmə seçimi edənədək hər bir mövcud quraşdırma bu məlumatları əvvəlki kimi saxlayır. Həmçinin idarəetmə panelindən redaktə edilə bilən funksiya bayrağıdır — `docs/reference/FEATURE_FLAGS.md` → İcra mühiti bölməsinə baxın. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | İşə salınma zamanı DB sağlamlıq yoxlamasını tamamilə ötürmək üçün `1` olaraq təyin edin. Qısamüddətli tapşırıqlar və inteqrasiya testləri üçün faydalıdır. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Adətən ötürüləcəyi hallarda belə (məsələn, qısamüddətli tapşırıqlarda) DB sağlamlıq yoxlaması dövrünü məcburi aktivləşdirmək üçün `1` olaraq təyin edin. | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` zamanı yerli icra mühitinin ilkin hazırlanmasını ötürmək üçün `1` olaraq təyin edin. sqlite-ın artıq yığıldığı CI/qrafik interfeyssiz quraşdırmalar üçün faydalıdır. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(avtomatik aşkarlama)_ | `src/lib/db/migrationRunner.ts` | Miqrasiya icraçısının skan etdiyi qovluğu dəyişdirin. Fərdi yığımlarda paketlənmiş miqrasiyaları təqdim edərkən faydalıdır. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(təyin edilməyib)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Platformanın yol ayırıcısı ilə ayrılmış `namespace=dir` qeydləri şəklində əlavə miqrasiya qovluqları (məsələn, `ee=/opt/app/enterprise/db/migrations`). Orada tapılan fayllar `-` kimi qeydə alınır, buna görə öz miqrasiyalarını təqdim edən distributiv heç vaxt əsas layihənin rəqəmli yuvaları ilə toqquşmur. Səhv formatlı qeyd, etibarsız ad sahəsi və ya mövcud olmayan qovluq sxemi səssizcə ötürmək əvəzinə işə salınma zamanı xəta yaradır. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Çoxsaylı gözləyən miqrasiyalar üçün təhlükəsizlik həddi (#3416). Mövcud DB-də bu saydan çox miqrasiya gözləyirsə, işə salınma dayandırılır (silinmiş izləmə cədvəlindən qoruyur). Daha köhnə ehtiyat nüsxəni bərpa etmək üçün həddi artırın; yoxlamanı deaktiv etmək üçün `0` olaraq təyin edin. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` buraxılış keçidi üçün iş qovluğu. Təxminən 12 GB tələb edir (iki ~3 GB-lıq quraşdırma ağacı və tarball), buna görə kiçik tmpfs-də işləməməlidir — öz infrastrukturunda yerləşdirilən icraçıda `/tmp` 12 GB-lıq RAM əsaslı tmpfs-dir və keçid onu dolduraraq paketin yarımçıq qalmasına səbəb olub. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(kodda standart dəyər)_ | `src/lib/spend/batchWriter.ts` | Paketlənmiş xərc/məbləğ yazıcısı üçün boşaltma intervalı (ms). Aşağı dəyərlər yazıların birləşdirilməsini azaldır; yüksək dəyərlər DB-də resurs mübahisəsini azaldır. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(kodda standart dəyər)_ | `src/lib/spend/batchWriter.ts` | Məcburi boşaltmadan əvvəl buferdə saxlanılan xərc qeydlərinin maksimum sayı. Yüksək QPS-li yerləşdirmələrdə artırın; məhdud yaddaş daha vacib olduqda azaldın. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(təyin edilməyib)_ | `open-sse/utils/proxyFetch.ts` | Vercel relay yolu üzrə `[ProxyFetch]` sazlama jurnallarını çıxarmaq üçün `"true"` olaraq təyin edin. Marşrutlaşdırma ipuclarının sızmasının qarşısını almaq üçün standart olaraq söndürülüb. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Ətraflı `[ProxyEgress]` proses jurnalı sətrinə müştəri/çıxış IP-lərini və hesab prefiksini daxil etmək üçün `"true"` və ya `"1"` olaraq təyin edin. Proses jurnalının IP-ləri və ya hesab prefiksini sızdırmaması üçün standart olaraq SÖNDÜRÜLÜ saxlanılır. | +| `OMNIROUTE_DEBUG` | _(təyin edilməyib)_ | `bin/cli/commands/quota.mjs` | CLI kvota komandalarından stderr-ə hər sorğu üzrə vaxt diaqnostikasını (`[omniroute] GET completed in Nms`) çıxarmaq üçün `1` olaraq təyin edin. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(avtomatik)_ | `scripts/dev/healthcheck.mjs` | Konteyner sağlamlıq yoxlamasının sınaqdan keçirdiyi açıq yol. Təyin edilmədikdə sınaq yolu `OMNIROUTE_BASE_PATH` əsasında müəyyənləşdirir; bu dəyişəni təyin etmək dərin monitorinq son nöqtəsini yenidən aktivləşdirir. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(təyin edilməyib)_ | `bin/cli/commands/completion.mjs` | CLI shell tamamlama keşinin yollarından (oxuma/yeniləmə/yazma) `[omniroute completion]` diaqnostikasını çıxarmaq üçün hər hansı boş olmayan dəyər təyin edin. Standart olaraq söndürülüb — bu keşlər səssizcə uğursuz olur ki, çatışmayan/zədələnmiş keş tab ilə tamamlamanı heç vaxt pozmasın. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 saat) | `open-sse/services/batchProcessor.ts` | Ayrı-ayrı paket elementləri üçün maksimum təkrar cəhd müddəti (ms). Bu müddəti aşan elementlər uğursuz kimi işarələnir. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Paket elementlərinin təkrar cəhdlərində eksponensial gecikmə üçün baza gecikməsi (ms). | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 saat) | `open-sse/services/batchProcessor.ts` | Paket elementlərinin təkrar cəhdləri arasındakı eksponensial gecikmə üçün yuxarı hədd (ms). | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Eyni vaxtda emal edilən paketlərin maksimum sayı. Məhsuldarlığı artırmaq üçün yüksəldin; sürət məhdudiyyəti ilə bağlı kütləvi xətaların qarşısını almaq üçün aşağı saxlayın. | > [!IMPORTANT] > Mövcud daimi verilənlər bazasını dəyişməzdən əvvəl miqrasiya icraedicisi `DATA_DIR/db_backups/` -> altında məzmuna görə ünvanlanan tam ani görüntü dərc edir. Dərc prosesi eyni fayl sistemi daxilində -> üzərinə yazmayan sərt keçidləri və etibarlı fayl sinxronizasiyasını dəstəkləyən fayl sistemi tələb edir. -> POSIX hostları həmçinin qovluq sinxronizasiyasını tələb edir; Windows-da Node qovluq deskriptorlarını -> rədd edə bilər, buna görə OmniRoute dərc edilmiş faylı diskə yazır və qovluq qeydinin -> sinxronizasiyasını mümkün olduğu qədər həyata keçirir. +> altında məzmuna görə ünvanlanan tam ani görüntü dərc edir. Dərcetmə eyni fayl sistemi daxilində +> üzərinə yazmadan sərt keçidləri və faylların dayanıqlı sinxronlaşdırılmasını dəstəkləyən fayl sistemi +> tələb edir. POSIX hostlarında kataloq sinxronlaşdırılması da tələb olunur; Windows-da Node kataloq +> deskriptorlarını rədd edə bilər, buna görə OmniRoute dərc edilmiş faylı diskə yazır və kataloq +> qeydinin sinxronlaşdırılmasını mümkün olduğu qədər həyata keçirir. > Qoşulmuş `DATA_DIR` bu təminatları verə bilmirsə, miqrasiya tətbiq edilməzdən əvvəl işəsalma -> təhlükəsizlik məqsədilə dayandırılır. `DATA_DIR`-i bu imkanları təmin edən bir disk bölməsinə köçürün; -> miqrasiya təhlükəsizliyindən yan keçmək üçün `DISABLE_SQLITE_AUTO_BACKUP` istifadə etməyin. +> təhlükəsiz şəkildə dayandırılır. `DATA_DIR`-i bu imkanları təmin edən disk bölməsinə köçürün; +> miqrasiya təhlükəsizliyini keçmək üçün `DISABLE_SQLITE_AUTO_BACKUP` istifadə etməyin. ### Ssenarilər | Ssenari | Konfiqurasiya | | ---------------------- | ------------------------------------------------------------------------------------------------------------- | -| **Lokal tərtibat** | Bütün standart parametrləri dəyişmədən saxlayın. Verilənlər bazası `~/.omniroute/omniroute.db` yolundadır. | -| **Docker** | `DATA_DIR=/data` + `/data` yoluna disk bölməsi qoşun. | -| **Diskdə şifrələnmiş** | `STORAGE_ENCRYPTION_KEY` təyin edin + açarın ehtiyat nüsxələrini saxlayın! Onu itirmək = verilənləri itirmək. | +| **Lokal tərtibat** | Bütün standart parametrləri saxlayın. Verilənlər bazası `~/.omniroute/omniroute.db` ünvanındadır. | +| **Docker** | `DATA_DIR=/data` + `/data` ünvanına disk bölməsi qoşun. | +| **Diskdə şifrələnmiş** | `STORAGE_ENCRYPTION_KEY` təyin edin + açarın ehtiyat nüsxələrini saxlayın! Onu itirmək = məlumatları itirmək. | | **CI/Sınaq** | `DATA_DIR=/tmp/omniroute-test` — müvəqqətidir, şifrələmə tələb olunmur. | --- @@ -214,47 +213,48 @@ OmniRoute bütün daimi məlumatların saxlanması üçün **SQLite**-dan (`bett --- -## 4. Təhlükəsizlik və Autentifikasiya - -| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | -| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Maşın barmaq izinin yaradılması üçün avadanlıq identifikatorları ilə birləşdirilən salt. İzolyasiya üçün hər yerləşdirmədə dəyişdirin. | -| `OMNIROUTE_CLI_SALT` | _(təyin edilməyib = hər quraşdırma üçün təsadüfi salt yaradılır və `/cli-token-salt.json` ünvanında saxlanılır)_ | `src/lib/machineToken.ts` | Lokal CLI autentifikasiya tokeninin törədilməsi üçün HMAC salt-ı. Bu dəyərin təyin edilməsi maşındakı bütün CLI tokenlərini rotasiya edir və saxlanılan salt ilə müqayisədə həmişə üstünlüyə malikdir. `docs/security/CLI_TOKEN.md` sənədinə baxın. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Sessiya kukilərində `Secure` bayrağını təyin edir. HTTPS arxasında işlədikdə **`true` olmalıdır**. | -| `REQUIRE_API_KEY` | `false` | API aralıq proqramı | `true` olduqda, bütün `/v1/*` proksi sorğuları etibarlı API açarı ehtiva etməlidir. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | İdarəetmə panelinin interfeysində API açarlarının tam dəyərlərinin göstərilməsinə icazə verir. İdarəetmə panelindəki Funksiya Bayraqlarından konfiqurasiya edilə bilər; ortaq instanslarda təhlükəsizlik riski yaradır. | -| `NO_LOG_API_KEY_IDS` | _(boş)_ | `src/lib/compliance/index.ts` | Sorğuların jurnal qeydiyyatından yan keçən, vergüllə ayrılmış API açarı ID-ləri (GDPR uyğunluğu). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(təyin edilməyib = limitsiz)_ | `src/shared/utils/apiKeyPolicy.ts` | `rate_limits` sütunu null olan API açarlarına tətbiq edilən gündəlik ehtiyat sorğu büdcəsi. Təyin edilməyib və ya boşdur: dolayı limit yoxdur (#2289, #11017). `0` da eyni mənanı verir (limitsiz). Müsbət tam N ədədi N/gün, 5N/həftə, 20N/ay limitlərini aktivləşdirir. Səhv formatlı, boş olmayan dəyərlər əvvəlki 1000/gün, 5000/həftə, 20000/ay pəncərələrinə qayıdır. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | İcazə verilən maksimum sorğu gövdəsi ölçüsü. Bu limiti aşan faydalı yükləri rədd edir. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Bu həddə çatan və ya onu aşan faktiki sorğu gövdələri JSON emalından əvvəl atomar, proses daxilində lokal ağırçəkili qəbul icarəsini əldə edir (BYTE yolu, o cümlədən `POST /v1/responses`). Struktur baxımından ağır sorğularla eyni [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) sağlam ehtiyat tutum çıxışından istifadə olunur; [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) probleminin geri qayıtmaması üçün yenə də `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) ilə məhdudlaşdırılır. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Çat marşrutu üçün sərt limit məhdudlaşdırılmış qəbul zamanı oxunan baytlara tətbiq edilir; buna `Content-Length` başlığı olmayan, etibarsız və ya yanlış göstərilmiş sorğular da daxildir. Limiti aşan sorğular `413` cavabı alır. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(təyin edilməyib — sorğu sayı üzrə məhdudiyyət yoxdur)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** bu köhnə sorğu SAYI məhdudiyyəti artıq yalnız açıq şəkildə təyin edildikdə qüvvəyə minir. Təyin edilmədikdə (standart vəziyyət), ağır çəkili çat qəbulu əvəzinə `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ilə məhdudlaşdırılır — **bir prosesdə** (bir V8 heap-i) prosesin faktiki yaddaş limitinə əsasən avtomatik hesablanan BAYT büdcəsi. Üst-üstə düşən iki ~750k-token `/v1/responses` sorğusu ~12 Gi heap-ləri dayandırır (#7849) — bu, sərt məhsul maksimumu olan 2 deyil, **yaddaş büdcəsi** xəbərdarlığıdır. Sağlam proses (heap boşaltma nisbətindən aşağı olduqda) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` vasitəsilə daha çox paralel uzun `/v1/responses` sorğusunu qəbul EDƏ BİLƏR. Onlarla uzun SSE klienti (40–50) “maksimum 2” deyil, heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 məsələsidir. “Hostdan istifadə etmək” üçün bunu kor-koranə artırmaq #7849 problemini yenidən yaradır. **N müstəqil `DATA_DIR`** ilə **heap-lərin** sayını artırın (#11024); bir SQLite faylında heç vaxt `replicas>1` istifadə etməyin. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(avtomatik hesablanır)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** avtomatik hesablanan daxiletmə bayt büdcəsinin əvəzlənməsi (daha sərt V8/cgroup yaddaş limitinin 25%-i, 8x müvəqqəti genişlənməyə bölünür). Hesablanan və açıq şəkildə verilən dəyərlər 8 MiB–2 GiB aralığı ilə məhdudlaşdırılır. Effektiv büdcədən böyük sorğu gövdəsi dərhal `413 body_exceeds_budget` xətası ilə uğursuz olur; ayrı-ayrılıqda xidmət göstərilməsi mümkün olan gövdələr arasındakı rəqabət təkrar sınaq edilə bilən `503` olaraq qalır. Eyni vaxtda 40–50 uzun SSE klienti sərt “maksimum 2” deyil, bu büdcə + heap məsələsidir. Tənzimləmədən əvvəl `/api/monitoring/health` ünvanında `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` dəyərlərini oxuyun. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | BAYT və STRUKTUR üzrə ağır çəkili qəbul üçün heap təzyiqi altında imtina nisbəti (`heapUsed / heap_size_limit`) (#10183, #10268, #10437). `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` həddini keçən paralel ağır çəkili sorğu yalnız heap HƏMÇİNİN bu nisbətə çatdığı və ya onu keçdiyi halda təkrar sınaq edilə bilən `503` ilə rədd edilir; sağlam heap-də isə healthy-headroom vasitəsilə qəbul olunur. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (standart `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Həm STRUKTUR, həm də BAYT (`admitChatRequest`, o cümlədən gövdəsi ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` olanlar) üçün sağlam heap sürətli yolu üzrə məhdud əlavə tutum (#10437). Bu məhdudiyyət olmadan, heap-i məşğul, lakin sağlam olan hər sorğu heç bir yuxarı hədd olmadan qəbul nəzarətindən yan keçirdi. Bu sayda paralel icarə healthy-heap yolu ilə aktiv olduqdan sonra növbəti məşğul sorğular real heap təzyiqi altında istifadə edilən EYNİ məhdud gözləmə/imtina yoluna keçir. `0` yan keçməni tamamilə deaktiv edir. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Gövdəsi bayt həddindən aşağı olsa belə, çat sorğusunu ağır çəkili kimi təsnif edən mesaj sayı. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Gövdəsi bayt həddindən aşağı olsa belə, çat sorğusunu ağır çəkili kimi təsnif edən alət sayı. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Sorğunu ağır çəkili kimi təsnif edən konservativ sətir ölçüsü əsasında token təxmini; bu, provayderin ödəniş üçün istifadə etdiyi tokenləşdirmə deyil, qəbul xərcinin proksisidir. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (deaktivdir) | `src/shared/middleware/chatBodyAdmission.ts` | İstəyə bağlı şəkildə aktivləşdirilən çat tarixçəsi limiti. Standart olaraq deaktivdir: mesaj sayı sorğunun universal xüsusiyyəti deyil, yerləşdirmə siyasətidir və burada məhdudiyyət qoyulması söhbətləri sıxılma konveyeri onları xidmət edilə bilən vəziyyətə gətirməzdən əvvəl yekun `413` ilə rədd edir. Heap artımı `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` və heap təzyiqi altında imtina mexanizmi ilə məhdudlaşdırılır. Sərt yuxarı həddə ehtiyacı olan, yaddaşı məhdud yerləşdirmələrdə müsbət dəyər təyin edin; həddi aşan sorğular bu halda sıxlaşdırma tələbini bildirən strukturlaşdırılmış `413` cavabı alır. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Tamamilə yaddaşa buferlənən axınsız yuxarı axın cavabı üçün sərt limit. Bu hədd keçildikdə yuxarı axın oxuyucusu ləğv edilir və sorğu heap tükənənədək qeyri-məhdud sətrin böyüməsi əvəzinə dərhal uğursuz olur. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Yuxarı axın cavab başlıqlarından yönləndirilən maksimum şəbəkə baytı. Büdcə aşıldıqda geniş istifadə olunan əks-proksi başlıq limitləri daxilində qalmaq üçün daha aşağı prioritetli başlıqlar (məsələn, fərdi `x-codex-*`, `x-oai-request-id`) buraxılır. Daha böyük cavab başlığı ölçüsü bahasına daha çox yuxarı axın metadatasını yönləndirmək üçün daha yüksək dəyər təyin edin. | -| `CORS_ORIGIN` | _(təyin edilməyib)_ | `src/server/cors/origins.ts` | Köhnə tək mənşəli CORS icazə siyahısı. Yeni yerləşdirmələr üçün `CORS_ALLOWED_ORIGINS` seçiminə üstünlük verin. CORS yalnız fərqli mənşəli brauzer API klientləri üçündür; autentifikasiya olunmuş idarəetmə paneli yazma əməliyyatları isə eyni mənşəli sorğulardan və sessiyaya bağlı CSRF qorunmasından istifadə edir. | -| `CORS_ALLOWED_ORIGINS` | _(təyin edilməyib)_ | `src/server/cors/origins.ts` | Vergüllə ayrılmış CORS icazə siyahısı. `CORS_ALLOW_ALL=true` açıq şəkildə konfiqurasiya edilmədikcə heç bir joker simvol göndərilmir. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | İstənilən brauzer `Origin` dəyərini əks etdirmək üçün yalnız inkişaf mühitinə aid çıxış yolu. Paylaşılan və ya istehsal yerləşdirmələrində aktivləşdirməyin. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Şəxsi/geridöngə/link-local IP diapazonlarını hədəfləyən provayder çağırışlarını bloklayın. Yalnız təcrid olunmuş sınaq mühitlərində deaktiv edin. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Şəxsi/lokal şəbəkələrə (localhost, 192.168.x.x, 10.x.x.x və s.) yönələn provayder URL-lərinə icazə verin. **Öz serverinizdə yerləşdirilən provayderlər üçün TƏLƏB OLUNUR** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Dəyər `false` olduqda idarəetmə paneli lokal URL-lərin yoxlanmasını rədd edir. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Lokal/şəxsi ünvanlarda (127.0.0.1, localhost, LAN, şəxsi diapazonlar) provayderlərin əlavə edilməsinə/yoxlanmasına icazə verin — yalnız provayderin yoxlanması yolu ilə məhdudlaşır. **Defolt olaraq `true`** (lokal istifadəyə üstünlük verilir); yalnız ictimai ünvanlara icazə verən sərt bloklamanı tətbiq etmək üçün `false` təyin edin. Bulud metadata son nöqtələri (169.254.169.254, metadata.google.internal) bundan asılı olmayaraq bloklanmış qalır. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` marşrutlarına (transkripsiyalar, nitq, tərcümələr) localhost xaricində yerləşdirilən OpenAI-uyğun provayder qovşağından istifadə etməyə icazə verin. Defolt olaraq deaktivdir — audionun uzaq hosta yönləndirilməsi çıxış identifikatorunu dəyişir və operatorun açıq qərarını tələb edir. Geridöngə/şəxsi qovşaqlara (localhost, 127.0.0.1, 172.16-31.x) həmişə icazə verilir və onlar bu parametrdən təsirlənmir. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC aktiv olduqda parol ilə girişi deaktiv edin ki, istifadəçilər yalnız OIDC vahid giriş sistemi vasitəsilə autentifikasiya oluna bilsinlər. Qısa `OIDC_DISABLE_PASSWORD_LOGIN` aliası da qəbul edilir; eyni açara malik İdarəetmə Paneli Funksiya Bayrağı daha yüksək prioritetə malikdir. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` üçün qısa aliasdır (#10889). | - -### Təhlükəsizliyin Gücləndirilməsi üzrə Yoxlama Siyahısı +## 4. Təhlükəsizlik və autentifikasiya + +| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Maşın barmaq izinin yaradılması üçün aparat identifikatorları ilə birləşdirilən duz. İzolyasiyanı təmin etmək üçün hər yerləşdirmədə dəyişdirin. | +| `OMNIROUTE_CLI_SALT` | _(təyin edilməyib = hər quraşdırma üçün təsadüfi duz `/cli-token-salt.json` ünvanında saxlanılır)_ | `src/lib/machineToken.ts` | Lokal CLI autentifikasiya tokenini yaratmaq üçün HMAC duzu. Bu dəyərin təyin edilməsi maşındakı bütün CLI tokenlərini yeniləyir və həmişə saxlanılan duzdan üstün tutulur. `docs/security/CLI_TOKEN.md` sənədinə baxın. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Sessiya kukilərində `Secure` bayrağını təyin edir. HTTPS arxasında işləyərkən **`true` olmalıdır**. | +| `REQUIRE_API_KEY` | `false` | API aralıq proqramı | `true` olduqda, bütün `/v1/*` proksi sorğuları etibarlı API açarı ehtiva etməlidir. **Bu bayraq `GET /v1/models` girişini məhdudlaşdırmır**; həmin sorğu əvəzinə idarəetmə panelinin giriş vəziyyətinə (`requireAuthForModels`) əsaslanır — buna görə də `/v1/models` sorğusundan alınan `401` cavabı inferensiyanın qorunduğu mənasına GƏLMİR. `docs/security/INFERENCE_AUTH_POSTURE.md` sənədinə baxın (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | İdarəetmə paneli interfeysində API açarlarının tam dəyərlərinin göstərilməsinə icazə verir. İdarəetmə panelinin funksiya bayraqlarından konfiqurasiya edilə bilər; ortaq instanslarda təhlükəsizlik riski yaradır. | +| `NO_LOG_API_KEY_IDS` | _(boş)_ | `src/lib/compliance/index.ts` | Sorğuların jurnallaşdırılmasından yan keçən, vergüllə ayrılmış API açarı ID-ləri (GDPR uyğunluğu). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(təyin edilməyib = limitsiz)_ | `src/shared/utils/apiKeyPolicy.ts` | `rate_limits` sütunu null olan API açarlarına tətbiq edilən gündəlik ehtiyat sorğu büdcəsi. Təyin edilməyib və ya boşdur: dolayı limit yoxdur (#2289, #11017). `0` da eyni məna daşıyır (limitsiz). Müsbət tam N ədədi gündə N, həftədə 5N, ayda 20N sorğuya icazə verir. Səhv formatlı, boş olmayan dəyərlər köhnə gündə 1000, həftədə 5000, ayda 20000 limitlərinə qayıdır. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | İcazə verilən maksimum sorğu gövdəsi ölçüsü. Bu limiti aşan faydalı yükləri rədd edir. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Bu həddə çatan və ya onu aşan faktiki sorğu gövdələri JSON təhlilindən əvvəl atomik, proses-lokal ağırçəkili qəbul icarəsini əldə edir (BYTE yolu, o cümlədən `POST /v1/responses`). Struktur baxımından ağır sorğularda olduğu kimi eyni [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) sağlam ehtiyat resurs istisnası tətbiq olunur; [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) probleminin təkrarlanmaması üçün hələ də `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) ilə məhdudlaşdırılır. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Məhdud qəbul zamanı oxunan baytlara tətbiq edilən çat marşrutu üçün sərt hədd; buraya `Content-Length` dəyəri olmayan, etibarsız və ya həqiqəti əks etdirməyən sorğular da daxildir; həddi aşanlar `413` alır. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(təyin edilməyib — sorğu sayı həddi yoxdur)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** bu köhnə sorğu SAYI həddi indi yalnız açıq şəkildə təyin edildikdə tətbiq olunur. Təyin edilmədikdə (standart vəziyyət), ağır çəkili çat qəbulu əvəzinə `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ilə məhdudlaşdırılır — **bir prosesdə** (bir V8 yığını) prosesin real yaddaş həddinə əsasən avtomatik hesablanan BAYT büdcəsi. Üst-üstə düşən iki ~750k-token `/v1/responses` sorğusu ~12 GiB-lıq yığınları dayandırır (#7849) — bu, məhsul üçün sərt maksimum 2 həddi deyil, **yaddaş büdcəsi** xəbərdarlığıdır. Sağlam proses (yığın boşaltma nisbətindən aşağı olduqda) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` vasitəsilə daha çox paralel uzun `/v1/responses` sorğusunu qəbul EDƏ BİLƏR. Onlarla uzun SSE klienti (40–50) “maksimum 2” deyil, yığın + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 məsələsidir. “Hostdan istifadə etmək” üçün bunu kor-koranə artırmaq #7849 problemini yenidən yaradır. **N müstəqil `DATA_DIR`** ilə **yığınların** sayını artırın (#11024); bir SQLite faylında heç vaxt `replicas>1` istifadə etməyin. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(avtomatik hesablanır)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** avtomatik hesablanan qəbul bayt büdcəsi üçün əvəzləyici dəyər (daha məhdud V8/cgroup yaddaş həddinin 25%-i, 8 qat müvəqqəti artıma bölünür). Hesablanan və açıq şəkildə təyin edilən dəyərlər 8 MiB–2 GiB aralığı ilə məhdudlaşdırılır. Effektiv büdcədən böyük gövdə dərhal `413 body_exceeds_budget` xətası ilə rədd edilir; ayrı-ayrılıqda emal edilə bilən gövdələr arasındakı rəqabət üçün yenidən cəhd edilə bilən `503` qaytarılır. Eyni vaxtda 40–50 uzun SSE klienti sərt “maksimum 2” həddi deyil, bu büdcə + yığın məsələsidir. Tənzimləmədən əvvəl `/api/monitoring/health` ünvanında `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` dəyərlərini yoxlayın. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | BAYT və STRUKTUR ağır çəkili qəbulu üçün yığın təzyiqinə əsaslanan yük azaltma nisbəti (`heapUsed / heap_size_limit`) (#10183, #10268, #10437). `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` həddini aşan paralel ağır çəkili sorğu yalnız yığın da bu nisbətə çatdıqda və ya onu aşdıqda yenidən cəhd edilə bilən `503` xətası ilə rədd edilir; sağlam yığında isə sağlam əlavə tutum vasitəsilə qəbul olunur. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (standart `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Həm STRUKTUR, həm də BAYT (`admitChatRequest`, o cümlədən gövdəsi ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` olanlar) üçün sağlam yığın sürətli yolunun (#10437) məhdud əlavə tutumu. Bu məhdudiyyət olmadan məşğul, lakin sağlam yığına malik hər sorğu heç bir yuxarı hədd olmadan qəbul nəzarətindən yan keçirdi. Sağlam yığın yolu vasitəsilə bu sayda paralel icarə aktiv olduqdan sonra növbəti məşğul sorğular real yığın təzyiqi zamanı istifadə edilən EYNİ məhdud gözləmə/yük azaltma yoluna keçir. `0` yan keçidi tamamilə söndürür. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Gövdəsi bayt həddindən aşağı olsa belə, çat sorğusunu ağır çəkili kimi təsnif edən mesaj sayı. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Gövdəsi bayt həddindən aşağı olsa belə, çat sorğusunu ağır çəkili kimi təsnif edən alət sayı. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Sorğunu ağır çəkili kimi təsnif edən konservativ sətir ölçüsünə əsaslanan token təxmini; bu, qəbul xərcinin təxmini göstəricisidir, provayderin ödəniş tokenləşdirilməsi deyil. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (söndürülüb) | `src/shared/middleware/chatBodyAdmission.ts` | Könüllü olaraq aktivləşdirilən çat tarixçəsi həddi. Standart olaraq söndürülüb: mesaj sayı sorğunun universal xüsusiyyəti deyil, yerləşdirmə siyasətidir və burada hədd qoyulması söhbətləri sıxılma konveyeri onları emal edilə bilən hala gətirməzdən əvvəl yekun `413` xətası ilə rədd edir. Yığın artımı `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` və yığın təzyiqinə əsaslanan yük azaltma ilə məhdudlaşdırılır. Sərt yuxarı həddə ehtiyacı olan yaddaşı məhdud yerləşdirmələrdə müsbət dəyər təyin edin; həddi aşanlar bu halda sıxlaşdırma tələbini bildirən strukturlaşdırılmış `413` xətası alır. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Tam şəkildə yaddaşda buferlənən axınsız yuxarı axın cavabı üçün sərt hədd. Bu hədd aşıldıqda yuxarı axın oxuyucusu ləğv edilir və yığın tükənənədək qeyri-məhdud sətir böyütmək əvəzinə sorğu dərhal xəta ilə dayandırılır. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Yuxarı axın cavab başlıqlarından ötürülən maksimum şəbəkə baytları. Büdcə aşıldıqda, geniş yayılmış əks-proksi başlıq limitləri daxilində qalmaq üçün daha aşağı prioritetli başlıqlar (məsələn, fərdi `x-codex-*`, `x-oai-request-id`) silinir. Cavab başlığının ölçüsünün artması hesabına daha çox yuxarı axın metadatasını ötürmək üçün daha yüksək dəyər təyin edin. | +| `CORS_ORIGIN` | _(təyin edilməyib)_ | `src/server/cors/origins.ts` | Köhnə, tək mənşəli CORS icazə siyahısı. Yeni yerləşdirmələr üçün `CORS_ALLOWED_ORIGINS` seçiminə üstünlük verin. CORS yalnız fərqli mənşəli brauzer API müştəriləri üçündür; autentifikasiya edilmiş idarə paneli yazma əməliyyatları bunun əvəzinə eyni mənşəli sorğulardan və sessiyaya bağlı CSRF qorumasından istifadə edir. | +| `CORS_ALLOWED_ORIGINS` | _(təyin edilməyib)_ | `src/server/cors/origins.ts` | Vergüllə ayrılmış CORS icazə siyahısı. `CORS_ALLOW_ALL=true` açıq şəkildə konfiqurasiya edilmədikcə heç bir universal şablon göndərilmir. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | İstənilən brauzer `Origin` dəyərini əks etdirmək üçün yalnız inkişaf mühitinə aid çıxış yolu. Paylaşılan və ya istehsal yerləşdirmələrində aktiv etməyin. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Şəxsi/geri döngə/yerli keçid IP diapazonlarını hədəfləyən provayder çağırışlarını bloklayın. Yalnız təcrid olunmuş sınaq mühitlərində deaktiv edin. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Şəxsi/lokal şəbəkələrə (localhost, 192.168.x.x, 10.x.x.x və s.) yönələn provayder URL-lərinə icazə verin. **Öz serverində yerləşdirilən provayderlər üçün TƏLƏB OLUNUR** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Dəyər `false` olduqda idarə paneli lokal URL-lərin doğrulanmasını rədd edir. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Lokal/şəxsi ünvanlardakı (127.0.0.1, localhost, LAN, şəxsi diapazonlar) provayderlərin əlavə edilməsinə/doğrulanmasına icazə verin — yalnız provayderin doğrulanması yolu ilə məhdudlaşır. **Defolt olaraq `true`** (lokal üstünlüklü); yalnız ictimai ünvanlara icazə verən sərt bloklamanı tətbiq etmək üçün `false` təyin edin. Bulud metadata son nöqtələri (169.254.169.254, metadata.google.internal) bundan asılı olmayaraq bloklanmış qalır. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` marşrutlarının (transkripsiyalar, nitq, tərcümələr) localhost xaricində yerləşdirilmiş OpenAI-uyğun provayder qovşağından istifadə etməsinə icazə verin. Defolt olaraq söndürülüb — audionun uzaq hosta yönləndirilməsi çıxış identikliyini dəyişir və operatorun açıq qərarı olmalıdır. Geri döngə/şəxsi qovşaqlara (localhost, 127.0.0.1, 172.16-31.x) həmişə icazə verilir və onlar bundan təsirlənmir. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | `POST /v1/rerank` sorğusunun (və yaddaş mühərrikinin geri döngəli yenidən sıralama addımının) localhost xaricində yerləşdirilmiş OpenAI-uyğun provayder qovşağından — TEI, Infinity, vLLM və s. işlədən LAN cihazından və ya Tailscale bərabərtərəfindən — istifadə etməsinə icazə verin. Defolt olaraq söndürülüb — uzaq hosta yönləndirmə çıxış identikliyini dəyişir və operatorun açıq qərarı olmalıdır. Geri döngə qovşaqlarına (localhost, 127.0.0.1, 172.16-31.x) həmişə icazə verilir və onlar bundan təsirlənmir. Uzaq qovşaqlar həmçinin provayderin xaricə çıxan URL siyasətindən (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) keçməlidir; bulud metadata hostlarına heç vaxt yönləndirmə edilmir. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC aktiv olduqda parol ilə girişi deaktiv edin ki, istifadəçilər yalnız OIDC Vahid Girişi vasitəsilə autentifikasiya oluna bilsinlər. Sadə `OIDC_DISABLE_PASSWORD_LOGIN` aliası da qəbul edilir; eyni açara malik İdarə Paneli Funksiya Bayrağı üstünlüyə malikdir. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` üçün sadə alias (#10889). | + +### Sərtləşdirmə Yoxlama Siyahısı ```bash -# İstehsal mühiti üçün minimum təhlükəsizlik tələbləri: +# İstehsal təhlükəsizliyi minimumu: AUTH_COOKIE_SECURE=true # HTTPS tələb edir REQUIRE_API_KEY=true # Bütün proksi çağırışlarını autentifikasiya edin -ALLOW_API_KEY_REVEAL=false # Açarları heç vaxt istifadəçi interfeysində göstərməyin +ALLOW_API_KEY_REVEAL=false # Açarları istifadəçi interfeysində heç vaxt göstərməyin CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # 5 MB limit ``` @@ -304,59 +304,66 @@ OmniRoute ikiqat müdafiə təmin edir: sorğu tərəfində inyeksiya skanı və ## 6. Alət və Marşrutlaşdırma Siyasətləri -| Dəyişən | Standart Dəyər | Mənbə Faylı | Təsvir | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM-in alət/funksiya çağırışına girişini idarə edir. `allowlist` = yalnız siyahıda göstərilən alətlər, `denylist` = siyahıda göstərilənlər istisna olmaqla hamısı, `disabled` = məhdudiyyət yoxdur. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Faydalı yükün dəyişdirilməsi qaydalarını ehtiva edən JSON faylına yol (model/protokol üzrə yuxarı axın tənzimləmələri). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Faydalı yük qaydaları faylının isti yenidən yüklənməsi üçün interval (ms). Minimum `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Seçim əsasında aktivləşdirmə: Claude Code klientlərindən gələn prefikssiz `claude-*` model ID-lərini provayder prefiksi tələb etmək əvəzinə Claude Code OAuth hesabı vasitəsilə marşrutlaşdırır. Açıq şəkildə göstərilən provayder prefiksləri yenə də üstünlük təşkil edir. Həmçinin Claude provayderi səhifəsindəki idarəetmə paneli keçidi vasitəsilə konfiqurasiya edilə bilər. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Dövri kombinasiyalar üçün model üzrə paralellik həddi (#9100). Dövri kombinasiya semaforu, dəyişdirmə imkanı olmadan, hər model üzrə 3 paralel sorğu ilə sərt şəkildə məhdudlaşdırılmışdı və daha yüksək paralellikli trafik bu həddin arxasında ardıcıl icra olunurdu. `>= 1` olması yoxlanılır, `<= 32` ilə məhdudlaşdırılır. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Birbaşa tək model sorğuları üçün OmniRoute-un lokal kontekst pəncərəsi / maksimum giriş tokeni yoxlamasını ötürən təhlükəli seçim əsasında aktivləşdirmə. Yuxarı axın provayderləri faktiki limitlərini yenə də tətbiq edir; prompt sıxışdırılması və modelin öz çıxış tokeni həddi aktiv qalır. Effektiv üstünlük sırası belədir: Funksiya Bayraqları DB əvəzləməsi > mühit dəyişəni > standart dəyər; yenidən başlatma tələb olunmur. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(təyin edilməyib)_ | `open-sse/services/conversationTracker.ts` | Söhbət tarixçəsinin toplanmasını dayandırmaq üçün `1` təyin edin. `resolveConversationId()` SQLite-dan oxumadan və ya mesaj tarixçəsini təhlil etmədən əvvəl izlənilməyən nəticə qaytarır və klient tərəfindən təqdim edilən sessiya ID-ləri də buna daxildir. Marşrutlaşdırma sessiyasının emalı dəyişməz qalır və mövcud qeydlər silinmir. Bu seçim idarəetmə panelinin söhbət görünüşündən istifadə etməyən və söhbət gedişləri cədvəlinin böyüməsini dayandırmaq istəyən yerləşdirmələr üçündür. | +| Dəyişən | Standart | Mənbə Faylı | Təsvir | +| ----------------------------------------------------------- | ---------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM alətlərinə/funksiya çağırışlarına girişi idarə edir. `allowlist` = yalnız siyahıda göstərilən alətlər, `denylist` = siyahıda göstərilənlər istisna olmaqla hamısı, `disabled` = heç bir məhdudiyyət yoxdur. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Faydalı yükün idarə edilməsi qaydalarını ehtiva edən JSON faylına aparan yol (model/protokol üzrə upstream tənzimləmələri). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Faydalı yük qaydaları faylının işlək rejimdə yenidən yüklənməsi üçün interval (ms). Minimum `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Seçimlə aktivləşdirmə: Claude Code müştərilərindən gələn prefikssiz `claude-*` model ID-lərini provayder prefiksi tələb etmək əvəzinə Claude Code OAuth hesabı vasitəsilə marşrutlaşdırır. Açıq şəkildə göstərilən provayder prefiksləri yenə də üstünlük təşkil edir. Həmçinin Claude provayderi səhifəsində idarəetmə paneli keçidi vasitəsilə konfiqurasiya edilə bilər. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Dövri kombinasiyalar üçün hər model üzrə paralellik həddi (#9100). Dövri kombinasiya semaforu hər model üçün dəyişdirilməsi mümkün olmayan 3 paralel sorğu ilə sərt şəkildə məhdudlaşdırılmışdı və daha yüksək paralellikli trafiki həmin həddin arxasında ardıcıl emal edirdi. `>= 1` olaraq yoxlanılır, `<= 32` həddinə məhdudlaşdırılır. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Birbaşa tək model sorğuları üçün OmniRoute-un yerli kontekst pəncərəsi / maksimum giriş tokeni yoxlamasını ötürən təhlükəli seçimlə aktivləşdirmə. Upstream provayderlər faktiki limitlərini yenə də tətbiq edir; sorğunun sıxılması və modelin öz çıxış tokeni həddi aktiv qalır. Effektiv üstünlük sırası belədir: Xüsusiyyət Bayraqları DB əvəzləməsi > mühit dəyişəni > standart dəyər; yenidən başlatma tələb olunmur. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(təyin edilməyib)_ | `open-sse/services/selfHostedEntry.ts` | Sətirdaxili YAML `providers:` sənədi (RIC-738, D4). Təyin edildikdə (`strategy:` bloku ilə və ya onsuz), `/v1/chat/completions` bulud emal xətti əvəzinə öz serverində yerləşdirilən vahid OpenAI-uyğun girişə yönləndirilir. Təyin edilmədikdə (standart hal): marşrut birbaşa mövcud bulud emal xəttinə keçir. Baxın: `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(təyin edilməyib)_ | `open-sse/services/selfHostedEntry.ts` | Sətirdaxili mühit dəyişəni əvəzinə fayla üstünlük verən yerləşdirmələr üçün `OMNIROUTE_SELF_HOSTED_PROVIDERS` ilə eyni `providers:` sənədini ehtiva edən YAML faylına aparan yol. Onlardan hər hansı biri öz serverində yerləşdirilən girişi aktivləşdirir. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(təyin edilməyib — açıq marşrut)_ | `open-sse/services/selfHostedEntry.ts` | Öz serverində yerləşdirilən vahid giriş üçün istəyə bağlı ortaq API açarı (D5 karkası, hər açar üzrə kvota sistemi üçün ayrılıb). Təyin edildikdə sorğular `Authorization: Bearer ` ehtiva etməlidir. Təyin edilmədikdə: marşrut açıqdır və mövcud öz serverində yerləşdirilən yerli provayder nümunəsinə uyğundur (loopback/etibarlı şəbəkə yerləşdirməsi). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(təyin edilməyib)_ | `open-sse/services/routingStrategies.ts` | Deterministik marşrutlaşdırma mühərriki üçün sətirdaxili YAML `strategy:` sənədi (M2/RIC-740, D3) — qara siyahı/ağ siyahı, gözləmə müddətli dövrə kəsicisi, xərc prioriteti, gecikməni nəzərə alma, ehtiyat zənciri. Hər açar üzrə `OMNIROUTE_SELF_HOSTED_PROVIDERS` daxilində yerləşdirilmiş sətirdaxili `strategy:` blokunu əvəz edir. Baxın: `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(təyin edilməyib)_ | `open-sse/services/routingStrategies.ts` | Sətirdaxili mühit dəyişəni əvəzinə fayla üstünlük verən yerləşdirmələr üçün `OMNIROUTE_SELF_HOSTED_STRATEGY` ilə eyni `strategy:` sənədini ehtiva edən YAML faylına aparan yol. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(təyin edilməyib)_ | `open-sse/services/conversationTracker.ts` | Söhbət tarixçəsinin toplanmasını dayandırmaq üçün `1` təyin edin. `resolveConversationId()` SQLite-ı oxumazdan və ya mesaj tarixçəsini təhlil etməzdən əvvəl izlənilməyən nəticə qaytarır; müştəri tərəfindən təqdim edilən sessiya ID-ləri də buna daxildir. Marşrutlaşdırma sessiyalarının idarə olunması dəyişməz qalır və mövcud qeydlər silinmir. Bu seçim idarə panelinin söhbət görünüşündən istifadə etməyən və növbələr cədvəlinin böyüməsini dayandırmaq istəyən yerləşdirmələr üçündür. | --- ## 7. URL-lər və Bulud Sinxronizasiyası -| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Daxili sinxronizasiya tapşırıqlarının `/api/sync/cloud` ünvanına müraciət etməsi üçün server tərəfli URL. Tətbiq açıq şəkildə proksi vasitəsilə təqdim edilsə belə, bunu loopback/konteyner URL-i kimi saxlayın. | -| `CLOUD_URL` | _(boş)_ | `src/lib/cloudSync.ts` | Bulud retranslyatorunun son nöqtə URL-i (premium funksiya). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Bulud sinxronizasiya sorğuları üçün HTTP gözləmə müddəti. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack qurma konfiqurasiyası | Qurma zamanı istifadə olunan profil (imtiyazlı modulları paketdən fiziki olaraq çıxarmaq üçün `minimal` olaraq təyin edin). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ müstəqil çıxışı_ | `scripts/build/colocate-standalone.mjs` | Qurmadan sonrakı birgə yerləşdirmə mərhələsinin istifadə etdiyi müstəqil çıxış kataloqu üçün qurma vaxtı dəyişdirilməsi. İcra vaxtı parametri deyil. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(boş)_ | `src/lib/cloudSync.ts` | Cloud Sync cavablarının HMAC-SHA256 imzasını yoxlamaq üçün istifadə edilən ortaq məxfi açar. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Cloud Sync son nöqtəsinin yerli giriş məlumatlarının üzərinə yazmasına icazə vermək üçün `true` olaraq təyin edin. Standart dəyər `false`-dur. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Heç bir yerli məxfi açar konfiqurasiya edilmədikdə imzasız Cloud Sync cavabını rədd etmək üçün `true` olaraq təyin edin (#13679). Mövcud olan imza həmişə yoxlanılır və bu bayraqdan asılı olmayaraq `OMNIROUTE_CLOUD_SYNC_SECRET` təyin edilməyibsə, həmişə rədd olunur. v3.9 versiyasından etibarən standart olaraq məcburi olacaq. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | İstifadəçi təsdiqi olmadan v3.8.5 versiyasındakı biraddımlı «hər şeyi idxal et» davranışına qayıtmaq üçün `true` olaraq təyin edin. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, İdarə paneli, sinxronizasiya | OAuth `redirect_uri`, İdarə paneli keçidləri və yaradılan açıq URL-lər üçün ictimai URL. OAuth geri çağırışları və ya yaradılan brauzer keçidləri kanonik əks-proksi hostundan istifadə etməlidirsə, bunu sabit ictimai URL olaraq təyin edin. | -| `NEXT_PUBLIC_CLOUD_URL` | _(boş)_ | Klient tərəfi | `CLOUD_URL` dəyişəninin klient tərəfli surəti. | -| `NEXT_PUBLIC_APP_URL` | _(təyin edilməyib)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL` üçün köhnə ehtiyat variant. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(təyin edilməyib)_ | İctimai mənşə həlledicisi, şəkil URL-ləri | Açıq URL-lərin yaradılması və İdarə panelindən kənar brauzer mənşəyinin yoxlanması üçün istifadə edilən ən yüksək prioritetli, brauzerə yönəlik OmniRoute mənşəyi. OpenWebUI və ya başqa bir retranslyator OmniRoute-a daxili URL vasitəsilə çatırsa, lakin istifadəçinin brauzeri yaradılmış medianı LAN, tunel və ya ictimai mənşədən əldə etməlidirsə, bunu təyin edin. `/v1` hissəsini **daxil etməyin**. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(təyin edilməyib)_ | `open-sse/config/providerPluginManifestUrl.ts` | Yan klientlərə elan edilən mütləq provayder plaqini manifest URL-i. Təyin edilmədikdə OmniRoute `/api/v1/provider-plugin-manifest` ünvanını sorğu mənşəyindən və ya HOST/PORT dəyərlərindən formalaşdırır. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Sorğu mənşəyi olmadan HOST/PORT dəyərlərindən provayder plaqini manifest URL-i formalaşdırılarkən istifadə edilən protokol. Aşkar `OMNIROUTE_PROVIDER_MANIFEST_URL` təyin edilmədikdə, TLS-i sonlandıran ictimai proksinin arxasında bunu `https` olaraq təyin edin. | -| `OMNIROUTE_TRUST_PROXY` | _(təyin edilməyib)_ | `src/server/origin/publicOrigin.ts` | Ötürülmüş ictimai mənşə başlıqları üçün ixtiyari etibar rejimi. Təyin edilməyib = təhlükəsizlik qərarlarında `Forwarded` / `X-Forwarded-*` başlıqlarına etibar etməyin. `true` / `loopback` ötürülmüş hosta/protokola yalnız tokenlə işarələnmiş loopback proksidən gəldikdə etibar edir. `private` / `lan` həmçinin özəl LAN proksi tərəflərinə etibar edir. İstehsal mühitində aşkar `NEXT_PUBLIC_BASE_URL` təyin etməyə üstünlük verin. | -| `KIE_CALLBACK_URL` | _(təyin edilməyib)_ | `open-sse/utils/kieTask.ts` | Asinxron kie.ai tapşırıqları üçün ictimai geri çağırış URL-i. `OMNIROUTE_KIE_CALLBACK_URL` və `OMNIROUTE_PUBLIC_URL` dəyişənlərindən əvvəl ən yüksək prioritetli dəyişdirmə. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(təyin edilməyib)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL` dəyişəninin alternativ yazılışı. Əsas dəyişən təyin edilmədikdə ehtiyat variant kimi istifadə olunur. | -| `OMNIROUTE_PUBLIC_URL` | _(təyin edilməyib)_ | `open-sse/utils/kieTask.ts` | Asinxron geri çağırış URL-lərini yaratmaq üçün istifadə edilən ictimai mənşə. kie.ai geri çağırışları üçün ən aşağı prioritetli ehtiyat variantdır; digər retranslyatorlar üçün də ümumi ictimai URL kimi istifadə olunur. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | İstifadə səhifəsinin istifadə etdiyi CrofAI kvota sorğusu son nöqtəsi. Retranslyatorlar / sınaq qurğuları üçün dəyişdirilə bilər. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | İstifadə səhifəsinin istifadə etdiyi, API açarı ilə autentifikasiya olunan rəsmi OpenCode Go istifadə son nöqtəsi. Retranslyatorlar / sınaq qurğuları üçün dəyişdirilə bilər. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Klientin göndərmədiyi opencode-go/zen yuxarı axın sorğularında OpenCode CLI identifikasiya başlıqlarını (User-Agent, x-opencode-client/project, sorğu/sessiya UUID-ləri) yaradın ki, VPS çıxışındakı Cloudflare onları qəbul etsin (#6210/#5997). #10571-dən etibarən standart olaraq aktivdir; `false`/`0`/`no`/`off` ilə deaktiv edin. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiv olduqda və provayder üzrə `_USER_AGENT` dəyişdirməsi təyin edilmədikdə istifadə olunan standart User-Agent. Yalnız opencode icraçılarına tətbiq edilir. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiv olduqda yaradılan `x-opencode-client` başlığının dəyəri. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiv olduqda yaradılan `x-opencode-project` başlığının dəyəri. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Kvota məlumatlarının çıxarılması üçün istifadə edilən Ollama Cloud parametrləri URL-i. Retranslyatorlar / sınaq qurğuları üçün dəyişdirilə bilər. | -| `OLLAMA_USAGE_COOKIE` | _(təyin edilməyib)_ | `open-sse/services/usage.ts` | Parametrlər səhifəsindən kvota məlumatlarını çıxarmaq üçün istifadə edilən Ollama Cloud `__Secure-session` kukisi. Həssas məlumatdır; bir neçə hesab konfiqurasiya edildikdə hər bağlantı üçün İdarə paneli sahəsinə üstünlük verin. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(təyin edilməyib)_ | `open-sse/services/usage.ts` | Alternativ Ollama Cloud `__Secure-session` kukisi mühit dəyişəni. Həssas məlumatdır; bir neçə hesab konfiqurasiya edildikdə hər bağlantı üçün İdarə paneli sahəsinə üstünlük verin. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(təyin edilməyib)_ | `open-sse/services/usage.ts` | Daha qısa alternativ adlardan əvvəl istifadə edilən alternativ Ollama Cloud `__Secure-session` kukisi mühit dəyişəni. Həssas məlumatdır; bir neçə hesab konfiqurasiya edildikdə hər bağlantı üçün İdarə paneli sahəsinə üstünlük verin. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) istifadə limitləri son nöqtəsi. Retranslyatorlar / sınaq qurğuları üçün dəyişdirilə bilər. | +| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Daxili sinxronizasiya tapşırıqlarının `/api/sync/cloud` ünvanına müraciət etməsi üçün server tərəfi URL-i. Tətbiq ictimai proksi vasitəsilə əlçatan olduqda belə, bunu loopback/konteyner URL-i kimi saxlayın. | +| `CLOUD_URL` | _(boş)_ | `src/lib/cloudSync.ts` | Bulud relay son nöqtəsinin URL-i (premium funksiya). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Bulud sinxronizasiya sorğuları üçün HTTP taymautu. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack yığım konfiqurasiyası | Yığım vaxtı profili (imtiyazlı modulları paketdən fiziki olaraq çıxarmaq üçün `minimal` dəyərinə təyin edin). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ müstəqil çıxışı_ | `scripts/build/colocate-standalone.mjs` | Yığımdan sonrakı birgə yerləşdirmə mərhələsinin istifadə etdiyi müstəqil çıxış kataloqu üçün yığım vaxtı əvəzləməsi. İcra vaxtı ayarı deyil. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(boş)_ | `src/lib/cloudSync.ts` | Bulud Sinxronizasiyası cavablarının HMAC-SHA256 imzasını yoxlamaq üçün istifadə edilən ortaq məxfi açar. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Bulud Sinxronizasiyası son nöqtəsinin yerli giriş məlumatlarının üzərinə yazmasına icazə vermək üçün `true` dəyərinə təyin edin. Standart dəyər `false`-dur. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Heç bir yerli məxfi açar konfiqurasiya edilmədikdə imzasız Bulud Sinxronizasiyası cavabını rədd etmək üçün `true` dəyərinə təyin edin (#13679). Mövcud olan imza həmişə yoxlanılır və bu bayraqdan asılı olmayaraq `OMNIROUTE_CLOUD_SYNC_SECRET` təyin edilmədikdə həmişə rədd olunur. v3.9-da məcburi olacaq. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | İstifadəçi təsdiqi olmadan v3.8.5 versiyasındakı bir addımlı «hər şeyi idxal et» davranışına geri qayıtmaq üçün `true` dəyərinə təyin edin. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, İdarəetmə paneli, sinxronizasiya | OAuth redirect_uri, İdarəetmə paneli keçidləri və yaradılan ictimai URL-lər üçün ictimai URL. OAuth geri çağırışları və ya yaradılan brauzer keçidləri kanonik əks-proksi hostundan istifadə etməlidirsə, bunu sabit ictimai URL-ə təyin edin. | +| `NEXT_PUBLIC_CLOUD_URL` | _(boş)_ | Müştəri tərəfi | `CLOUD_URL` dəyişəninin müştəri tərəfi güzgüsü. | +| `NEXT_PUBLIC_APP_URL` | _(təyin edilməyib)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL` üçün köhnə ehtiyat variant. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(təyin edilməyib)_ | İctimai mənbə həlledicisi, şəkil URL-ləri | İctimai URL-lərin yaradılması və idarəetmə panelindən kənar brauzer mənbəyinin yoxlanılması üçün istifadə olunan ən yüksək prioritetli, brauzerə yönəlik OmniRoute mənbə ünvanı. OpenWebUI və ya başqa bir relay OmniRoute-a daxili URL vasitəsilə çatırsa, lakin istifadəçinin brauzeri yaradılmış medianı LAN, tunel və ya ictimai mənbədən əldə etməlidirsə, bunu təyin edin. `/v1` hissəsini **daxil etməyin**. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(təyin edilməyib)_ | `open-sse/config/providerPluginManifestUrl.ts` | Sidecar klientlərinə elan edilən mütləq provayder plagini manifesti URL-si. Təyin edilmədikdə OmniRoute sorğu mənbəyindən və ya HOST/PORT-dan `/api/v1/provider-plugin-manifest` ünvanını yaradır. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Sorğu mənbəyi olmadan provayder plagini manifesti URL-si HOST/PORT-dan yaradılarkən istifadə olunan protokol. Açıq `OMNIROUTE_PROVIDER_MANIFEST_URL` təyin edilməyibsə, TLS-i sonlandıran ictimai proksinin arxasında `https` olaraq təyin edin. | +| `OMNIROUTE_TRUST_PROXY` | _(təyin edilməyib)_ | `src/server/origin/publicOrigin.ts` | Yönləndirilmiş ictimai mənbə başlıqları üçün istəyə bağlı etibar rejimi. Təyin edilməyib = təhlükəsizlik qərarları üçün `Forwarded` / `X-Forwarded-*` başlıqlarına etibar etməyin. `true` / `loopback` yalnız tokenlə işarələnmiş loopback proksidən gələn yönləndirilmiş host/protokola etibar edir. `private` / `lan` həmçinin özəl LAN proksi tərəflərinə etibar edir. İstehsal mühitində açıq şəkildə təyin edilmiş `NEXT_PUBLIC_BASE_URL`-a üstünlük verin. | +| `KIE_CALLBACK_URL` | _(təyin edilməyib)_ | `open-sse/utils/kieTask.ts` | Asinxron kie.ai tapşırıqları üçün ictimai geri çağırış URL-si. `OMNIROUTE_KIE_CALLBACK_URL` və `OMNIROUTE_PUBLIC_URL` dəyişənlərindən əvvəl ən yüksək prioritetli əvəzləmə. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(təyin edilməyib)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL` dəyişəninin alternativ yazılışı. Əsas dəyişən təyin edilmədikdə ehtiyat variant kimi istifadə olunur. | +| `OMNIROUTE_PUBLIC_URL` | _(təyin edilməyib)_ | `open-sse/utils/kieTask.ts` | Asinxron geri çağırış URL-lərini yaratmaq üçün istifadə olunan ictimai mənbə. kie.ai geri çağırışları üçün ən aşağı prioritetli ehtiyat variantdır; digər relay-lər üçün də ümumi ictimai URL kimi istifadə olunur. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | İstifadə səhifəsində istifadə olunan CrofAI kvota sorğusu son nöqtəsi. Relay-lər / test qurğuları üçün əvəzləyin. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | İstifadə səhifəsində istifadə olunan, API açarı ilə autentifikasiya edilən rəsmi OpenCode Go istifadə son nöqtəsi. Relay-lər / test qurğuları üçün əvəzləyin. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Klientin göndərmədiyi opencode-go/zen yuxarı axın sorğularında OpenCode CLI identifikasiya başlıqlarını (User-Agent, x-opencode-client/project, sorğu/sessiya UUID-ləri) yaradın ki, VPS çıxışındakı Cloudflare onları qəbul etsin (#6210/#5997). #10571-dən etibarən standart olaraq aktivdir; `false`/`0`/`no`/`off` ilə deaktiv edin. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiv olduqda və provayder üzrə `_USER_AGENT` əvəzləməsi təyin edilmədikdə istifadə olunan standart User-Agent. Yalnız opencode icraçılarına tətbiq edilir. Yuxarı axının məhdudlaşdırdığı açarsız sorğuda `opencode/= 1.17>` ehtiva etməyən konfiqurasiya edilmiş dəyər rədd edilmək əvəzinə bu standart dəyərlə əvəzlənir. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiv olduqda yaradılan `x-opencode-client` başlığı üçün dəyər. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiv olduqda sintez edilmiş `x-opencode-project` başlığı üçün dəyər. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(təyin edilməyib)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Açar olmadan göndərilən OpenCode sorğularının gövdəsinin (axın bayrağı və alətlər siyahısı) tənzimlənməsini dayandırmaq üçün `off` olaraq təyin edin. Başlıqlar yenə də tətbiq olunur. Hər sorğu üçün ayrıca oxunur, buna görə dəyişiklik dərhal qüvvəyə minir. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(təyin edilməyib)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Həmin model üçün hələ heç nə müşahidə edilmədikdə, heç bir alət daşımayan açarsız OpenCode sorğusunda elan ediləcək vergüllə ayrılmış alət adları. Boş olduqda, modelə çağırmaması bildirilən tək bir yer tutucuya geri qayıdır. Ən çoxu 32 qeyd, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; etibarsız qeydlər nəzərə alınmır. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Kvota məlumatlarının əldə edilməsi üçün istifadə olunan Ollama Cloud parametrləri URL-i. Relelər / test qurğuları üçün əvəzləyin. | +| `OLLAMA_USAGE_COOKIE` | _(təyin edilməyib)_ | `open-sse/services/usage.ts` | Parametrlər səhifəsindən kvota məlumatlarını əldə etmək üçün istifadə olunan Ollama Cloud `__Secure-session` kukisi. Həssasdır; birdən çox hesab konfiqurasiya edildikdə hər bağlantı üçün İdarəetmə paneli sahəsinə üstünlük verin. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(təyin edilməyib)_ | `open-sse/services/usage.ts` | Alternativ Ollama Cloud `__Secure-session` kukisi mühit dəyişəni. Həssasdır; birdən çox hesab konfiqurasiya edildikdə hər bağlantı üçün İdarəetmə paneli sahəsinə üstünlük verin. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(təyin edilməyib)_ | `open-sse/services/usage.ts` | Daha qısa alternativ adlardan əvvəl istifadə olunan alternativ Ollama Cloud `__Secure-session` kukisi mühit dəyişəni. Həssasdır; birdən çox hesab konfiqurasiya edildikdə hər bağlantı üçün İdarəetmə paneli sahəsinə üstünlük verin. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) istifadə limitləri son nöqtəsi. Relelər / test qurğuları üçün əvəzləyin. | > [!IMPORTANT] -> Əks proksinin (nginx, Caddy) arxasında yerləşdirərkən, OAuth geri çağırışları və ya yaradılan ictimai keçidlər həmin host adından istifadə etməlidirsə, `NEXT_PUBLIC_BASE_URL` dəyişənini sabit ictimai URL-nizə (məsələn, `https://omniroute.example.com`) təyin edin. Bu olmadan, redirect_uri uyğun gəlmədiyi üçün OAuth geri çağırışları uğursuz ola və yaradılan ictimai keçidlər daxili konteyner mənbəyinə yönələ bilər. +> Əks proksinin (nginx, Caddy) arxasında yerləşdirərkən, OAuth geri çağırışları və ya yaradılmış ictimai keçidlər həmin host adından istifadə etməlidirsə, `NEXT_PUBLIC_BASE_URL` dəyişənini sabit ictimai URL-inizə (məsələn, `https://omniroute.example.com`) təyin edin. Bu olmadan OAuth geri çağırışları uğursuz ola bilər, çünki redirect_uri uyğun gəlməyəcək, yaradılmış ictimai keçidlər isə daxili konteyner mənbəyinə yönələ bilər. > -> Serverlərarası tapşırıqlar üçün `BASE_URL` dəyişənini daxili loopback/konteyner URL-i kimi saxlayın. Giriş məlumatları daşıyan daxili özünə sorğular üçün brauzer `Origin` dəyərindən və ya ictimai host adından istifadə etməyin. +> Serverlərarası tapşırıqlar üçün `BASE_URL` dəyişənini daxili dövrə/konteyner URL-i kimi saxlayın. Giriş məlumatlarını daşıyan daxili özünə sorğular üçün brauzer `Origin` dəyərindən və ya ictimai host adından istifadə etməyin. > -> Autentifikasiya edilmiş idarəetmə panelindəki yazma əməliyyatları statik ictimai baza URL-i tələb etmir: idarəetmə paneli eyni mənbəli təhlükəli sorğuları sessiyaya bağlı CSRF tokeni ilə göndərir. OmniRoute qeyri-idarəetmə paneli brauzer inteqrasiyaları üçün ictimai mənbənin yoxlanmasını yenə də mərkəzləşdirir: əvvəlcə açıq şəkildə göstərilmiş ictimai URL mühit dəyişənlərinə etibar edilir; `OMNIROUTE_TRUST_PROXY` aktivləşdirilmədikcə və birbaşa proksi tərəf etibarlı olduğunu göstərən tokenlə işarələnmədikcə xam `Forwarded` / `X-Forwarded-*` başlıqları nəzərə alınmır. Eyni mənbəli idarəetmə paneli sorğularını düzəltmək üçün CORS parametrlərindən istifadə etməyin; CORS yalnız fərqli mənbələrdən qoşulan brauzer klientləri üçündür. +> Autentifikasiya edilmiş idarəetmə paneli yazma əməliyyatları statik ictimai əsas URL tələb etmir: idarəetmə paneli eyni mənbəli təhlükəli sorğuları sessiyaya bağlı CSRF tokeni ilə göndərir. OmniRoute idarəetmə panelindən kənar brauzer inteqrasiyaları üçün ictimai mənbənin doğrulanmasını yenə də mərkəzləşdirir: əvvəlcə açıq şəkildə göstərilən ictimai URL mühit dəyişənlərinə etibar edilir; `OMNIROUTE_TRUST_PROXY` aktivləşdirilmədiyi və birbaşa proksi tərəfdaşının etibarlı olduğunu göstərən tokenlə işarələnmədiyi halda, xam `Forwarded` / `X-Forwarded-*` başlıqları nəzərə alınmır. Eyni mənbəli idarəetmə paneli sorğularını düzəltmək üçün CORS parametrlərindən istifadə etməyin; CORS yalnız fərqli mənbəli brauzer müştəriləri üçündür. --- @@ -589,49 +596,50 @@ faylının öz davranışını tənzimləyir. --- -## 11. OAuth Provayder Etimadnamələri - -**localhost mühitində hazırlama** üçün daxili etimadnamələr. Uzaq yerləşdirmələr üçün hər bir provayderin tərtibatçı konsolunda öz etimadnamələrinizi qeydiyyatdan keçirin. - -| Dəyişən | Provayder | Qeydlər | -| --------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Açıq müştəri — məxfi açar tələb olunmur. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Yönləndirmə URI-sini dəyişdirir. Standart: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Açıq müştəri. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Uyğun `_SECRET` tələb edir. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Açıq müştəri. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Uyğun `_SECRET` tələb edir. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Açıq müştəri. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot-un OAuth müştəri ID-si üçün istəyə bağlı əvəzetmə. Təyin edilmədikdə `GITHUB_OAUTH_CLIENT_ID` dəyişəninin standart açıq dəyərinə qayıdır. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Hər bağlantı üçün etimadnamə mövcud olmadıqda `open-sse/executors/devin-cli.ts` tərəfindən istifadə edilən ehtiyat API açarı. İstəyə bağlıdır. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI binar faylına (`devin`) xüsusi yol. `open-sse/executors/devin-cli.ts` tərəfindən müəyyən edilir. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo üçün OAuth müştəri ID-si. `https://gitlab.com/-/profile/applications` ünvanında `/callback` yönləndirmə URI-si və `api, read_user, openid, profile, email` əhatə dairələri ilə tətbiq qeydiyyatdan keçirin. `GITLAB_OAUTH_CLIENT_ID` dəyərinə qayıdır. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo üçün OAuth müştəri məxfi açarı. İstəyə bağlıdır — PKCE axını məxfi açar tələb etmir. `GITLAB_OAUTH_CLIENT_SECRET` dəyərinə qayıdır. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab əsas URL-sini dəyişdirir (öz serverində yerləşdirilən GitLab). Standart dəyər `https://gitlab.com`-dur. `GITLAB_BASE_URL` dəyərinə qayıdır. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` üçün köhnə ehtiyat variant. `_DUO_` variantı təyin edilmədikdə istifadə olunur. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` tərəfindən istifadə edilən `GITLAB_DUO_OAUTH_CLIENT_ID` üçün köhnə ehtiyat variant. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` tərəfindən istifadə edilən `GITLAB_DUO_OAUTH_CLIENT_SECRET` üçün köhnə ehtiyat variant. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth-u aktivləşdirmək üçün təyin edin. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Birbaşa API açarı üçün ehtiyat variant (OAuth-dan yan keçir). | -| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI üçün iş sahəsi ID-si. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE` üçün alias. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI konfiqurasiya qovluğunu dəyişdirir (təcrid olunmuş PAT sessiyası; brauzer girişinin üzərinə yazılmasının qarşısını alır). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat` ünvanına `validated` kimi göndəriləcək frontend `tk` tokeni. Blackbox token uyğunluğunu məcburi etdikdə tələb olunur; əks halda OmniRoute təsadüfi UUID dəyərinə qayıdır. #2252 nömrəli məsələyə baxın. | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge qoruyucu mexanizmi | Anthropic-dən kənar vision-bridge çağırışları üçün OpenAI ilə uyğun əsas URL. Standart olaraq köhnə OpenAI URL mühit dəyişənindən və ya api.openai.com ünvanından istifadə edir. OmniRoute-un `/v1` özünədövrəsinə və ya OpenAI ilə uyğun istənilən son nöqtəyə (Gemini OpenAI-compat, OpenRouter) yönəldin. #2232 nömrəli məsələ. URL OmniRoute-un öz `/v1` ünvanı olduqda, təsvir alt sorğusu `x-omniroute-admission-bypass: internal` göndərir və müəyyən edilmiş özünədövrə etimadnaməsi ilə (lokal rejimdə `sk_omniroute` marker dəyəri və ya `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) autentifikasiya edir ki, `REQUIRE_API_KEY=true` olan yerləşdirmələr işləsin. | -| `VISION_BRIDGE_API_KEY` | Vision Bridge qoruyucu mexanizmi | Yuxarıdakı URL üçün API açarı. Anthropic-dən kənar vision-bridge çağırışları üçün hər provayderə aid OpenAI / Google mühit dəyişənlərini əvəz edir. Anthropic modelləri özlərinə ayrılmış Anthropic açar yolundan istifadə etməyə davam edir. #2232 nömrəli məsələ. | +## 11. OAuth Provayderi Etimadnamələri + +**localhost mühitində hazırlanma** üçün daxili etimadnamələr. Uzaq yerləşdirmələr üçün hər provayderin tərtibatçı konsolunda öz etimadnamələrinizi qeydiyyatdan keçirin. + +| Dəyişən | Provayder | Qeydlər | +| --------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Açıq müştəri — məxfi açar tələb olunmur. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Yönləndirmə URI-sini dəyişdirir. İlkin dəyər: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Açıq müştəri. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Uyğun `_SECRET` tələb edir. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Açıq müştəri. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Uyğun `_SECRET` tələb edir. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Açıq müştəri. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot-un OAuth müştəri ID-si üçün isteğe bağlı əvəzetmə. Təyin edilmədikdə `GITHUB_OAUTH_CLIENT_ID` dəyişəninin açıq ilkin dəyərindən istifadə edilir. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | `Copilot-Integration-Id` və `Editor-Plugin-Version` başlıqlarında göndərilən GitHub Copilot müştəri inteqrasiya ID-si üçün isteğe bağlı əvəzetmə. İlkin dəyər `copilot-developer-cli`-dır. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Hər bağlantı üçün etimadnamə mövcud olmadıqda `open-sse/executors/devin-cli.ts` tərəfindən istifadə edilən ehtiyat API açarı. İsteğe bağlıdır. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI binar faylına (`devin`) xüsusi yol. `open-sse/executors/devin-cli.ts` tərəfindən müəyyən edilir. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo üçün OAuth müştəri ID-si. `https://gitlab.com/-/profile/applications` ünvanında yönləndirmə URI-si kimi `/callback` və əhatə dairələri kimi `api, read_user, openid, profile, email` göstərərək tətbiq qeydiyyatdan keçirin. Ehtiyat olaraq `GITLAB_OAUTH_CLIENT_ID` istifadə edilir. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo üçün OAuth müştəri məxfi açarı. İsteğe bağlıdır — PKCE axını məxfi açar tələb etmir. Ehtiyat olaraq `GITLAB_OAUTH_CLIENT_SECRET` istifadə edilir. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab baza URL-sini dəyişdirir (öz serverinizdə yerləşdirilən GitLab). İlkin dəyər `https://gitlab.com`-dur. Ehtiyat olaraq `GITLAB_BASE_URL` istifadə edilir. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` üçün köhnə ehtiyat variant. `_DUO_` variantı təyin edilmədikdə istifadə olunur. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` tərəfindən istifadə edilən `GITLAB_DUO_OAUTH_CLIENT_ID` üçün köhnə ehtiyat dəyər. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` tərəfindən istifadə edilən `GITLAB_DUO_OAUTH_CLIENT_SECRET` üçün köhnə ehtiyat dəyər. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth-u aktivləşdirmək üçün təyin edin. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Birbaşa API açarı üçün ehtiyat variant (OAuth-dan yan keçir). | +| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI üçün iş sahəsi ID-si. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE` üçün alternativ ad. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI konfiqurasiya qovluğunu əvəz edin (izolyasiya edilmiş PAT sessiyası brauzer girişinin üzərinə yazılmasının qarşısını alır). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat` ünvanında `validated` kimi göndəriləcək frontend `tk` tokeni. Blackbox token uyğunluğunu məcburi etdikdə tələb olunur; əks halda OmniRoute təsadüfi UUID-yə qayıdır. #2252 nömrəli problemə baxın. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge qoruyucusu | Anthropic olmayan vision-bridge çağırışları üçün OpenAI ilə uyğun baza URL-si. Defolt olaraq köhnə OpenAI URL mühit dəyişəni və ya api.openai.com istifadə olunur. OmniRoute-un `/v1` özünə geri dövr edən ünvanını və ya OpenAI ilə uyğun istənilən son nöqtəni (Gemini OpenAI-compat, OpenRouter) göstərin. Problem #2232. URL OmniRoute-un öz `/v1` ünvanı olduqda, təsvir alt sorğusu `x-omniroute-admission-bypass: internal` göndərir və həll edilmiş özünə geri dövr etimad məlumatı ilə autentifikasiya olunur (lokal rejimdə `sk_omniroute` sentinel dəyəri və ya `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350); beləliklə, `REQUIRE_API_KEY=true` yerləşdirmələri işləyir. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge qoruyucusu | Yuxarıdakı URL üçün API açarı. Anthropic olmayan vision-bridge çağırışlarında hər provayder üzrə OpenAI / Google mühit dəyişənlərini əvəz edir. Anthropic modelləri özlərinə məxsus Anthropic açar yolundan istifadə etməyə davam edir. Problem #2232. | > [!WARNING] > > 1. [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) səhifəsinə keçin > 2. OAuth 2.0 Client ID yaradın (növ: "Veb tətbiqi") -> 3. Serverinizin URL-sini icazə verilmiş yönləndirmə URI-si kimi əlavə edin -> 4. `.env` faylındakı etimadnamə dəyərlərini dəyişdirin. +> 3. Server URL-nizi Səlahiyyətli yönləndirmə URI-si kimi əlavə edin +> 4. `.env` faylındakı etimad məlumatlarının dəyərlərini əvəz edin. --- @@ -753,120 +761,122 @@ REQUEST_TIMEOUT_MS (qlobal əvəzləmə) ├─→ STREAM_READINESS_TIMEOUT_MS (REQUEST_TIMEOUT_MS dəyərini miras alır, standart: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (adaptiv hazırlıq uzatmalarını məhdudlaşdırır, standart: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (REQUEST_TIMEOUT_MS dəyərini miras alır, standart: 30000) - ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (hesablanmış, standart: 300000) + ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (törəmə, standart: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (standart: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (standart: 5000) - └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (standart: 0 = deaktiv edilib) + └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (standart: 0 = deaktivdir) ``` -| Dəyişən | Standart dəyər | Təsvir | -| ----------------------------------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(təyin edilməyib)_ | Qlobal qısayol — həm `FETCH_TIMEOUT_MS`, həm də `STREAM_IDLE_TIMEOUT_MS` standart dəyərlərini əvəz edir. | -| `FETCH_TIMEOUT_MS` | `600000` | Yuxarı axın provayderinə edilən çağırışlar üçün ümumi HTTP sorğu vaxt aşımı. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Dayandırılmadan əvvəl yuxarı axından gələn xam baytlar arasında icazə verilən maksimum səssizlik müddəti. Genişləndirilmiş düşünmə modelləri nadir hallarda >90 san. fasilə verir. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Aktiv SSE axınının maksimum ümumi işləmə müddəti; yuxarı axın baytları gəldikdə heç vaxt sıfırlanmır və `REQUEST_TIMEOUT_MS` dəyişənindən asılı deyil. Reyestrdəki modellər üzrə ən böyük `timeoutMs` dəyərindən (1200000, Codex) və əlavə 60000 ehtiyatdan hesablanır, beləliklə tam vaxt büdcəsindən istifadə etməsinə icazə verilmiş model cavabın ortasında heç vaxt dayandırılmır. Deaktiv etmək üçün `0` təyin edin. | -| `OMNIROUTE_SSE_COMMENTS` | _(deaktivdir)_ | OmniRoute-un SSE `:` şərh sətirləri (məsələn, `: keepalive` ürək döyüntüsü və `x-omniroute-*` metadata treylerləri) göndərə bilib-bilməməsi. Sərt OpenAI-uyğun müştərilər hər SSE sətrinə JSON.parse tətbiq etdiyi və `:` şərhlərində sıradan çıxdığı üçün standart olaraq deaktivdir (#10524); `data:` ürək döyüntülərinə təsir edilmir. Yenidən aktivləşdirmək üçün `on`/`true`/`1`/`yes` təyin edin. `open-sse/utils/sseHeartbeat.ts` tərəfindən istifadə olunur. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | İlk ping olmayan SSE hadisəsini almaq üçün vaxt. Təyin edildikdə `REQUEST_TIMEOUT_MS` dəyərini miras alır. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Böyük, alət istifadəsi intensiv olan və ya yüksək düşünmə tələb edən axın sorğuları üçün ilk hadisəyə qədər maksimum adaptiv hazırlıq müddəti. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` evristikası üçün təcili deaktivasiya açarı. Aşkarlamanı tamamilə deaktiv etmək üçün `false`/`0`/`off` təyin edin — hazırlıq vaxt aşımları və axının bərpası heç vaxt sorğu gövdəsi/başlıqları əsasında artırılmır və bununla da müştəri tərəfindən idarə olunan vaxt aşımı gücləndirilməsi azaldılır. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Aşkarlanmış `/goal` agent işə salmaları və ya `x-omniroute-agent-goal` ilə məcburi edilmiş sorğular üçün ilk hadisəyə qədər maksimum hazırlıq müddəti. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aşkarlanmış `/goal` agent işə salmaları üçün erkən axın bərpasını avtomatik aktivləşdirir. Məqsədə xas qoşulmanı deaktiv etmək üçün `false`/`0`/`off` təyin edin. Bu, yalnız operatorun standart dəyərinə əlavə olaraq bərpanı AKTİVLƏŞDİRƏ bilər — açıq şəkildə təyin edilmiş `STREAM_RECOVERY_ENABLED`/DB parametrləri vasitəsilə edilmiş imtinanı heç vaxt əvəz etmir. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | OpenAI SDK-nın `responses.stream()` funksiyasının 502 xətası ilə sıradan çıxmasına səbəb olan qeyri-standart `codex.*` SSE hadisələrini (məsələn, `codex.rate_limits`) silir. Standart olaraq AKTİVDİR (#11014). Onları ötürmək üçün `0`/`false`/`no`/`off` təyin edin. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(təyin edilməyib)_ | İstəyə bağlı Codex app-server nəqli. Lokal `codex app-server` sidecar-ının WebSocket son nöqtəsi (`ws://`/`wss://`). Tokenlə birlikdə təyin edildikdə Codex sorğuları HTTP Responses API əvəzinə JSON-RPC vasitəsilə sidecar-a yönləndirilir. Hər bağlantı üçün `providerSpecificData.codexAppServerUrl` vasitəsilə də təyin edilə bilər. `open-sse/executors/codex/appServerConfig.ts` tərəfindən istifadə olunur. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(təyin edilməyib)_ | app-server-ə təqdim olunan sətirdaxili imkan/bearer tokeni. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(təyin edilməyib)_ | app-server imkan tokenini (`codex app-server --ws-token-file` əmrindən) saxlayan fayla yol. `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` təyin edilmədikdə istifadə olunur. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | app-server gedişinin işlədiyi iş kataloqu. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(təyin edilməyib)_ | app-server gedişinə ötürülən təsdiq siyasəti (məsələn, `never`, `on-request`). Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(təyin edilməyib)_ | app-server gedişinə ötürülən sandbox siyasəti (məsələn, `read-only`, `workspace-write`, `danger-full-access`). Təyin edilmədikdə icraçı standart olaraq `workspace-write` istifadə edir (sərtləşdirilib; əvvəllər `danger-full-access` idi). Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-server-in öz təsdiq sorğularını (hostda əmr/fayl/icazə icrası) avtomatik təsdiqləyir. Standart olaraq deaktivdir — sorğular avtomatik rədd edilir; harness alət çağırışlarına təsir göstərilmir (onlar ayrıca `item/tool/call` birbaşa ötürmə mexanizmi ilə hərəkət edir). `true`/`1`/`yes` qəbul edir. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Cavab başlıqlarını almaq üçün vaxt. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 san.) | Proksisiz hər bir birbaşa cəhd üçün cavabın başlamasını gözləmənin maksimum müddəti (ms). Taymaut baş verdikdə təzə soketdə bir dəfə yenidən cəhd edilir; məhdudiyyəti söndürmək və əvvəlki davranışı saxlamaq üçün `0` təyin edin. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tam cavab gövdəsinin alınması üçün müddət. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP bağlantısının qurulması üçün taymaut. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive soketinin boş qalma taymautu. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS barmaq izi proksisinin (wreq-js) taymautu. | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Xüsusilə wreq-js TLS barmaq izi nəqliyyatının cavab gövdəsində ilk baytadək olan müddəti məhdudlaşdırır; yalnız `TLS_CLIENT_TIMEOUT_MS` dayanmış gövdəni aşkarlaya bilmir, çünki başlıqlar daxil olan kimi tamamlanır (#12656). Taymaut wreq oxuyucusunu ləğv edir və birbaşa/proksi dispetçerinə geri keçir; `0` nəzarət mexanizmini söndürür. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Yalnız OpenCode icraçısı üçün və yalnız `OPENCODE_RESPONSES_STALL_ROTATION` funksiya bayrağı aktiv olduqda (standart olaraq deaktivdir): başlıqları alındıqdan sonra axınla ötürülən Responses cavabının ilk gövdə baytını gözləmə müddətini məhdudlaşdırır (#13484). Responses axını `response.created` ilə açılır, buna görə bu müddətdən artıq səssizlik dayanma hesab olunur: hesab üçün soyuma müddəti tətbiq edilir və sorğu bir dəfə növbəti hesaba yönləndirilir; ikinci dayanma zamanı dərhal xəta qaytarılır. `0`, bayraq aktiv olsa belə, qoruyucu mexanizmi söndürür. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` körpü sorğuları üçün proksi keçidi taymautu. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl veb-gətirmə icraçısını öz serverinizdə yerləşdirilmiş instansiyaya yönəldin (buluddan kənarda API açarı istəyə bağlıdır). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl veb-gətirmə icraçısı üçün hər sorğu üzrə taymaut. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Körpü üçün ümumi server sorğusu taymautu. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Cavab başlıqlarını körpü vasitəsilə göndərmək üçün müddət. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Körpünün keep-alive boş qalma taymautu. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Xam soket taymautu (0 = deaktivdir). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | SIGTERM/SIGINT siqnalından sonra məcburi çıxışadək güzəşt müddəti. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` təyin edilmədikdə `src/shared/utils/fetchTimeout.ts` tərəfindən istifadə edilən ehtiyat dəyər. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts` faylındakı `validationRead` və `modelsProbe` ilkin sazlamaları üçün taymaut (ms). İdarə panelində aktiv/xəta vəziyyətləri arasında tez-tez keçidlərin qarşısını almaq üçün yavaş son nöqtələr (Cerebras, Cloudflare AI, Groq) üzrə bu dəyəri artırın. Etibarsız (<1000) və ya rəqəm olmayan dəyərlər üçün 8000ms ehtiyat dəyərinə keçir. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts` faylında relay üçün xüsusi gətirmə taymautu (#9158). İlişmiş relay klient/agent taymautundan (~30 san.) əvvəl uğursuz olmalıdır ki, çağıran tərəflər ümumi yuxarı axın taymautu əvəzinə relay üçün xüsusi xəta görsünlər. Həmişə birinci işə düşməsi üçün maksimum `29000` ilə məhdudlaşdırılıb. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts` faylındakı birbaşa/relay/proksi yollarında bir dəfəlik təkrar cəhd üçün ortaq gecikmə (#9158). `0` = dərhal yenidən cəhd et. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Yerli wreq-js sorğu taymautu (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Yerli taymauta əlavə edilən mütləq JS sərt son müddət güzəşti. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Yerli wreq-js sorğu taymautu (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Yerli taymauta əlavə edilən mütləq JS sərt son müddət güzəşti. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (söndürülüb) | Çağıranın sistem mesajına "Daxili veb axtarışınız var. Suallara birbaşa axtarış nəticələrindən istifadə edərək cavab verin." cümləsini əlavə edir (`perplexity-web/protocol.ts`). Defolt olaraq söndürülüb — Perplexity onsuz da axtarış edir və bu cümlə proqramlaşdırma klientlərinə verilən cavablarda meta-şərh kimi görünür. Bərpa etmək üçün `1`/`true`/`yes`/`on` təyin edin. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Native wreq-js sorğusunun vaxt limiti (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Native vaxt limitinə əlavə edilən mütləq JS sərt son müddət güzəşti. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Native wreq-js sorğusunun vaxt limiti (`notionTlsClient.ts`); `notion-web` uzun generasiyalar üçün hər sorğu üzrə bunu `180000` dəyərinə qaldırır. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Native vaxt limitinə əlavə edilən mütləq JS sərt son müddət güzəşti. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Brauzer əsaslı veb kuki söhbəti üçün ortaq Playwright brauzer hovuzu (`browserPool.ts`); söndürmək üçün `off` təyin edin. | -| `OBSCURA_BIN` | `auto-detect` | Brauzer hovuzu və Cloudflare Playground icraedicisi tərəfindən əsas mühərrik kimi istifadə olunan `obscura` binar faylının yolu (`open-sse/services/obscura.ts`); təyin edilmədikdə sistem PATH dəyişənindən avtomatik aşkarlanır. | -| `OBSCURA_CDP_ENDPOINT` | _(təyin edilməyib)_ | Yeni proses başlatmaq əvəzinə artıq işləyən Obscura ünvanını (`http://host:port`) göstərin; modul həmin prosesə sahib olmur (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `təsadüfi boş port` | Başladılan `obscura serve` üçün açıq şəkildə göstərilən port; təyin edilmədikdə boş port avtomatik seçilir (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Veb kuki söhbət sorğusu üçün brauzer əsaslı yolu aktivləşdirir (`browserBackedChat.ts`); aktivləşdirmək üçün `1` təyin edin. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (beynəlxalq kimi.ai Connect-RPC) icraedicisi üçün əsas URL (`kimi-web.ts`); yalnız güzgü/proksi son nöqtələri üçün dəyişdirin. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web icraedicisi üçün tam söhbət son nöqtəsi (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(avtomatik aşkarlanır)_ | Adobe Firefly interaktiv brauzer girişində istifadə ediləcək sistem Chrome/Edge icra faylının yolu (`adobeFireflyBrowserLogin.ts`); əməliyyat sistemi üzrə avtomatik aşkarlamanı əvəz edir. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ müstəqil çıxışı_ | Quraşdırmadan sonrakı birgə yerləşdirmə addımının istifadə etdiyi müstəqil çıxış qovluğu üçün quraşdırma vaxtı əvəzləməsi (`scripts/build/colocate-standalone.mjs`); icra vaxtı üçün deyil, quraşdırma alətləri üçündür. | - -Kombinasiya hədəfi cəhdləri müəyyən edilmiş yuxarı axın sorğusunun vaxt limitini (`FETCH_TIMEOUT_MS` və ya -fetch defoltunu təmin etdiyi zaman `REQUEST_TIMEOUT_MS`) miras alır. Kombinasiyanın geri dönüşünü -yalnız sürətləndirmək üçün kombinasiyada, kombinasiya defoltlarında və ya provayder əvəzləməsində `targetTimeoutMs` -təyin edin; cari yuxarı axın vaxt limitindən böyük dəyərlər yuxarı axın vaxt limiti ilə məhdudlaşdırılır. - -`comboTimeoutMs` nasazlıq zamanı hədəflər arasında keçidi əhatə edən, bütün kombinasiya üçün ayrıca divar saatı büdcəsidir. -Limitsiz iterasiyanı saxlamaq üçün onu təyin etməyin və ya `0` təyin edin (10 dəqiqəlik -`COMBO_LOOP_SAFETY_TIMEOUT_MS` ilişmə dayandırıcısı yenə də tətbiq olunur). Müsbət dəyər kombinasiya üçün həmin -təhlükəsizlik mexanizmini əvəz edir. Yavaş ilk hədəfdən sonra nasazlıq zamanı keçidə -hələ də vaxt qalması üçün `comboTimeoutMs` dəyərini `targetTimeoutMs` dəyərindən böyük saxlayın. - -### Dövrə Qırıcısının Hədləri - -Provayder səviyyəsində dövrə qırıcısının tənzimlənməsi. Defoltlar v3.6 versiyasından bəri 500-dən çox bağlantı üçün istifadə edilən miqyaslandırılmış dəyərləri əks etdirir. - -| Dəyişən | İlkin dəyər | Mənbə faylı | Təsvir | -| ------------------------------------------------------------- | ----------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Kəsici işə düşməzdən əvvəl OAuth provayderləri üçün ardıcıl uğursuzluq həddi. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth provayderi kəsicisi üçün sıfırlama müddəti (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API açarlı provayderlər üçün ardıcıl uğursuzluq həddi. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API açarlı provayder kəsicisi üçün sıfırlama müddəti (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Lokal provayderlər (Ollama, LM Studio, ...) üçün ardıcıl uğursuzluq həddi. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Lokal provayder kəsicisi üçün sıfırlama müddəti (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: bütün OAuth provayderi gözləmə rejiminə keçməzdən əvvəl zaman pəncərəsi daxilindəki uğursuzluqların sayı. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: OAuth provayderləri üçün sürüşən uğursuzluq sayma pəncərəsi (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: OAuth provayderi həddinə çatdıqdan sonrakı gözləmə müddəti (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth provayderi bu qədər uğursuzluqdan sonra DEGRADED vəziyyətinə keçir. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth provayderi üçün maksimum resetTimeout artım əmsalı. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth provayderi bu qədər açılma dövründən sonra geriçəkilmə səviyyəsini artırır. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: bütün API açarlı provayder gözləmə rejiminə keçməzdən əvvəl zaman pəncərəsi daxilindəki uğursuzluqların sayı. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: API açarlı provayderlər üçün sürüşən uğursuzluq sayma pəncərəsi (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: API açarlı provayder həddinə çatdıqdan sonrakı gözləmə müddəti (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API açarlı provayder bu qədər uğursuzluqdan sonra DEGRADED vəziyyətinə keçir. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API açarlı provayder üçün maksimum resetTimeout artım əmsalı. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API açarlı provayder bu qədər açılma dövründən sonra geriçəkilmə səviyyəsini artırır. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: bütün lokal provayder gözləmə rejiminə keçməzdən əvvəlki uğursuzluqların sayı. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: lokal provayderlər üçün sürüşən uğursuzluq sayma pəncərəsi (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Provayder səviyyəli kəsici: lokal provayder həddinə çatdıqdan sonrakı gözləmə müddəti (ms). | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Kontekst keşi sancağının provayderinin uzunmüddətli qeyri-sağlam hesab edildiyi və nasazlıq zamanı keçid üçün sancağın ləğv edildiyi geriçəkilmə dərinliyi. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Kontekst keşi sancağını ləğv etməzdən əvvəl qısamüddətli keçici gözləmə rejimlərinə dözümlülük göstərən tez-tez keçidə qarşı zaman pəncərəsi (ms). | +| Dəyişən | Standart dəyər | Təsvir | +| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(təyin edilməyib)_ | Qlobal qısayol — həm `FETCH_TIMEOUT_MS`, həm də `STREAM_IDLE_TIMEOUT_MS` standart dəyərlərini əvəz edir. | +| `FETCH_TIMEOUT_MS` | `600000` | Yuxarı axın provayderinə edilən çağırışlar üçün ümumi HTTP sorğu zaman aşımı. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Dayandırılmadan əvvəl yuxarı axından gələn xam baytlar arasındakı maksimum səssizlik müddəti. Genişləndirilmiş düşünmə modelləri nadir hallarda >90s fasilə verir. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Aktiv SSE axınının maksimum ümumi işləmə müddəti; yuxarı axın baytları gəldikdə heç vaxt sıfırlanmır və `REQUEST_TIMEOUT_MS`-dən asılı deyil. Reyestrdəki hər model üçün təyin edilmiş ən böyük `timeoutMs` dəyərindən (1200000, Codex) və əlavə 60000 ehtiyatdan hesablanır, beləliklə tam vaxt büdcəsi ilə işləməsinə icazə verilən model cavabın ortasında heç vaxt dayandırılmır. Deaktiv etmək üçün `0` təyin edin. | +| `OMNIROUTE_SSE_COMMENTS` | _(deaktivdir)_ | OmniRoute-un SSE `:` şərh sətirləri (məsələn, `: keepalive` ürək döyüntüsü və `x-omniroute-*` metadata treylerləri) göndərə bilib-bilməməsi. Defolt olaraq deaktivdir (#10524), çünki ciddi OpenAI-uyğun müştərilər hər SSE sətrinə JSON.parse tətbiq edir və `:` şərhlərində sıradan çıxır; `data:` ürək döyüntülərinə təsir edilmir. Yenidən aktivləşdirmək üçün `on`/`true`/`1`/`yes` təyin edin. `open-sse/utils/sseHeartbeat.ts` tərəfindən istifadə olunur. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | İlk ping olmayan SSE hadisəsini almaq üçün müddət. Təyin edildikdə `REQUEST_TIMEOUT_MS` dəyərini miras alır. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Böyük, alət istifadəsi intensiv və ya yüksək səviyyəli əsaslandırma tələb edən axın sorğuları üçün maksimum adaptiv ilk hadisəyə hazırlıq pəncərəsi. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` evristikası üçün fövqəladə deaktivasiya açarı. Aşkarlamanı tamamilə deaktiv etmək üçün `false`/`0`/`off` təyin edin — hazırlıq zaman aşımları və axın bərpası sorğunun gövdəsi/başlıqları əsasında heç vaxt artırılmır və bununla müştəri tərəfindən idarə olunan zaman aşımı gücləndirilməsi azaldılır. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Aşkarlanmış `/goal` agent işə salmaları və ya `x-omniroute-agent-goal` ilə məcbur edilmiş sorğular üçün maksimum ilk hadisəyə hazırlıq pəncərəsi. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aşkarlanmış `/goal` agent işə salmaları üçün erkən axın bərpasını avtomatik aktivləşdirir. Məqsədə xas razılıq seçimini deaktiv etmək üçün `false`/`0`/`off` təyin edin. Bu, yalnız operatorun standart ayarına əlavə olaraq bərpa funksiyasını AKTİVLƏŞDİRƏ bilər — aşkar şəkildə təyin edilmiş `STREAM_RECOVERY_ENABLED`/DB ayarları ilə deaktivləşdirməni heç vaxt əvəz etmir. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | OpenAI SDK-nın `responses.stream()` metodunu 502 xətası ilə pozan qeyri-standart `codex.*` SSE hadisələrini (məsələn, `codex.rate_limits`) silir. Defolt olaraq AKTİVDİR (#11014). Onları ötürmək üçün `0`/`false`/`no`/`off` təyin edin. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(təyin edilməyib)_ | Codex app-server nəqliyyatı üçün razılıq əsasında aktivləşdirmə. Lokal `codex app-server` köməkçi servisinin WebSocket son nöqtəsi (`ws://`/`wss://`). Tokenlə birlikdə təyin edildikdə Codex sorğuları HTTP Responses API əvəzinə JSON-RPC vasitəsilə köməkçi servisə yönləndirilir. Həmçinin hər bağlantı üçün `providerSpecificData.codexAppServerUrl` vasitəsilə təyin edilə bilər. `open-sse/executors/codex/appServerConfig.ts` tərəfindən istifadə olunur. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(təyin edilməyib)_ | app-server-ə təqdim edilən sətirdaxili imkan/bearer tokeni. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(təyin edilməyib)_ | app-server imkan tokenini saxlayan fayla yol (`codex app-server --ws-token-file` vasitəsilə). `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` təyin edilmədikdə istifadə olunur. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | app-server əməliyyatının işə salındığı iş qovluğu. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(təyin edilməyib)_ | app-server əməliyyatına ötürülən təsdiq siyasəti (məsələn, `never`, `on-request`). Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(təyin edilməyib)_ | app-server əməliyyatına ötürülən sandbox siyasəti (məsələn, `read-only`, `workspace-write`, `danger-full-access`). Təyin edilmədikdə icraçı standart olaraq `workspace-write` istifadə edir (sərtləşdirilib; əvvəl `danger-full-access` idi). Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-server-in öz təsdiq sorğularını (hostda əmr/fayl/icazə icrası) avtomatik təsdiqləyir. Defolt olaraq deaktivdir — sorğular avtomatik rədd edilir; harness alət çağırışlarına təsir edilmir (onlar ayrıca `item/tool/call` keçidi ilə ötürülür). `true`/`1`/`yes` qəbul edir. Hər bağlantı üçün əvəzetmə: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Cavab başlıqlarını almaq üçün müddət. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 san.) | Proksisiz hər bir birbaşa cəhd üçün cavabın başlamasını maksimum gözləmə müddəti (ms). Taym-aut baş verdikdə yeni soketdə bir dəfə təkrar cəhd edilir; həddi söndürmək və əvvəlki davranışı saxlamaq üçün `0` təyin edin. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 dəq.) | Yuxarıdakı birləşdirilmiş soket cəhdində cavabın başlaması taym-autundan sonra yeni soketdəki RETRY cəhdi üçün yuxarı hədd (ms) (#13703). Yalnız çağıran tərəf artıq öz son müddət siqnalını qoşduqda tətbiq edilir (həll edilmiş bağlantı/model/provayder/`FETCH_TIMEOUT_MS` ardıcıllığı); həmin siqnal faktiki həddir və nəzərdə tutulan axında əvvəl işə düşür, buna görə də bu, sabit məhdudiyyətdən daha çox geniş ehtiyat həddidir — bu olmadan təkrar cəhd birləşdirilmiş soket cəhdi ilə eyni qısa `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` pəncərəsindən istifadə edir və sağlam, lakin TTFB-si yavaş olan mühakimə modelləri üçün 504 xətası qaytarırdı. Yuxarıdakı sabit aşağı həddən az olmasına heç vaxt icazə verilmir; çağıran tərəf ümumiyyətlə son müddət siqnalı təqdim etmədikdə, təkrar cəhd sabit aşağı həddi dəyişməz saxlayır. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tam cavab gövdəsini qəbul etmək üçün vaxt. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP bağlantısının qurulması üçün taym-aut. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive soketinin boş qalma taym-autu. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS barmaq izi proksisi (wreq-js) üçün taym-aut. | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Xüsusi olaraq wreq-js TLS barmaq izi nəqliyyatının cavab gövdəsi üçün ilk bayta qədər olan müddəti məhdudlaşdırır; `TLS_CLIENT_TIMEOUT_MS` təkbaşına dayanmış cavab gövdəsini aşkarlaya bilmir, çünki başlıqlar gələn kimi tamamlanır (#12656). Taym-aut wreq oxuyucusunu ləğv edir və birbaşa/proksi dispetçerinə geri keçir; `0` nəzarət mexanizmini söndürür. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Yalnız OpenCode icraedicisi üçün və yalnız `OPENCODE_RESPONSES_STALL_ROTATION` funksiya bayrağı aktiv olduqda (standart olaraq deaktivdir): başlıqlar gəldikdən sonra axınla ötürülən Responses cavabının ilk gövdə baytını gözləmə müddətini məhdudlaşdırır (#13484). Responses axını `response.created` ilə açılır, buna görə də bu pəncərədən sonra səssizlik dayanma hesab olunur: hesab müvəqqəti soyutma rejiminə keçirilir və sorğu bir dəfə növbəti hesaba yönləndirilir; ikinci dayanma dərhal xəta ilə nəticələnir. Bayraq aktiv olsa belə, `0` qoruma mexanizmini söndürür. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` körpü sorğuları üçün proksi keçidi taym-autu. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl veb-gətirmə icraedicisini özünüzün host etdiyi instansiyaya yönəldin (buluddan kənarda API açarı isteğe bağlıdır). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl veb-gətirmə icraedicisi üçün hər sorğu üzrə taym-aut. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Körpü üçün ümumi server sorğusu taym-autu. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Cavab başlıqlarını körpü vasitəsilə göndərmək üçün vaxt. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Körpünün keep-alive bağlantısı üçün boş qalma taym-autu. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Xam soket taym-autu (0 = deaktivdir). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Məcburi çıxışdan əvvəl SIGTERM/SIGINT siqnalları üzrə güzəşt müddəti. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` təyin edilmədikdə `src/shared/utils/fetchTimeout.ts` tərəfindən istifadə olunan ehtiyat dəyər. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts` faylındakı `validationRead` və `modelsProbe` əvvəlcədən təyin edilmiş konfiqurasiyaları üçün taym-aut (ms). İdarəetmə panelində aktiv/xəta vəziyyətləri arasında tez-tez keçidin qarşısını almaq üçün yavaş son nöqtələrdə (Cerebras, Cloudflare AI, Groq) bu dəyəri artırın. Etibarsız (<1000) və ya ədədi olmayan dəyərlər üçün 8000ms ehtiyat dəyərinə qayıdır. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts` faylında relay üçün xüsusi gətirmə taym-autu (#9158). Dayanmış relay müştəri/agent taym-autundan (~30 san.) əvvəl xəta verməlidir ki, çağıran tərəflər ümumi yuxarı axın taym-autu əvəzinə relay üçün xüsusi xəta görsünlər. Həmişə əvvəl işə düşməsi üçün `29000` ilə məhdudlaşdırılıb. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts` faylındakı birbaşa/relay/proksi bir dəfə təkrar cəhd yolları üçün ortaq təkrar cəhd gecikməsi (#9158). `0` = dərhal təkrar cəhd edin. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Yerli wreq-js sorğusu üçün vaxt limiti (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Yerli vaxt limitinə əlavə edilən mütləq JS sərt son müddət güzəşti. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Yerli wreq-js sorğusu üçün vaxt limiti (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Yerli vaxt limitinə əlavə edilən mütləq JS sərt son müddət güzəşti. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (söndürülüb) | Çağıranın sistem mesajına "Daxili veb axtarış imkanınız var. Suallara birbaşa axtarış nəticələrindən istifadə edərək cavab verin." cümləsini əlavə edir (`perplexity-web/protocol.ts`). Defolt olaraq söndürülüb — Perplexity onsuz da axtarış aparır və bu cümlə kodlaşdırma müştərilərinə verilən cavablarda meta-şərh kimi görünür. Bərpa etmək üçün `1`/`true`/`yes`/`on` təyin edin. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Yerli wreq-js sorğusu üçün vaxt limiti (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Yerli vaxt limitinə əlavə edilən mütləq JS sərt son müddət güzəşti. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Yerli wreq-js sorğusu üçün vaxt limiti (`notionTlsClient.ts`); `notion-web` uzun generasiyalar üçün hər sorğuda bunu `180000` dəyərinə qaldırır. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Yerli vaxt limitinə əlavə edilən mütləq JS sərt son müddət güzəşti. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Brauzer əsaslı veb kuki söhbəti üçün ortaq Playwright brauzer hovuzu (`browserPool.ts`); söndürmək üçün `off` təyin edin. | +| `OBSCURA_BIN` | `auto-detect` | Brauzer hovuzu və Cloudflare Playground icraçısı tərəfindən əsas mühərrik kimi istifadə olunan `obscura` binar faylına yol (`open-sse/services/obscura.ts`); təyin edilmədikdə sistem PATH dəyişənindən avtomatik aşkarlanır. | +| `OBSCURA_CDP_ENDPOINT` | _(təyin edilməyib)_ | Yenisini işə salmaq əvəzinə artıq işləyən Obscura instansiyasını (`http://host:port`) göstərin; modul həmin prosesə sahib deyil (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `random free port` | İşə salınan `obscura serve` üçün açıq şəkildə göstərilən port; təyin edilmədikdə boş port avtomatik seçilir (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Veb kuki söhbəti sorğusu üçün brauzer əsaslı yoldan istifadəyə üstünlük verin (`browserBackedChat.ts`); aktivləşdirmək üçün `1` təyin edin. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (beynəlxalq kimi.ai Connect-RPC) icraçısı üçün əsas URL (`kimi-web.ts`); yalnız güzgü/proksi son nöqtələri üçün dəyişdirin. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web icraçısı üçün tam söhbət son nöqtəsi (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(avtomatik aşkarlanır)_ | Adobe Firefly interaktiv brauzer girişində istifadə ediləcək sistem Chrome/Edge icra faylına yol (`adobeFireflyBrowserLogin.ts`); hər bir ƏS üzrə avtomatik aşkarlamanı üstələyir. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ müstəqil çıxışı_ | Qurmadan sonrakı birgə yerləşdirmə addımının istifadə etdiyi müstəqil çıxış qovluğu üçün qurma vaxtı dəyişməsi (`scripts/build/colocate-standalone.mjs`); icra vaxtı üçün deyil, qurma alətləri üçündür. | + +Kombinasiya hədəfi cəhdləri həll edilmiş yuxarı axın sorğusunun vaxt limitini (`FETCH_TIMEOUT_MS` və ya +sorğunun defolt vaxt limitini təmin etdikdə `REQUEST_TIMEOUT_MS`) miras alır. Kombinasiya ehtiyat keçidini +daha sürətli etmək üçün `targetTimeoutMs` parametrini kombinasiyada, kombinasiya defoltlarında və ya +provayder dəyişməsində təyin edin; cari yuxarı axın vaxt limitindən böyük dəyərlər yuxarı axın vaxt limiti +ilə məhdudlaşdırılır. + +`comboTimeoutMs` nasazlıq zamanı keçid hədəflərinin hamısını əhatə edən, bütün kombinasiya üçün ayrıca +divar saatı büdcəsidir. Limitsiz iterasiyanı qorumaq üçün onu təyin etməyin və ya `0` təyin edin (10 dəqiqəlik +`COMBO_LOOP_SAFETY_TIMEOUT_MS` ilişmə dayandırıcısı yenə də tətbiq olunur). Müsbət dəyər kombinasiya üçün +həmin təhlükəsizlik mexanizmini əvəz edir. Yavaş ilk hədəfdən sonra nasazlıq zamanı keçid üçün vaxt qalması +məqsədilə `comboTimeoutMs` dəyərini `targetTimeoutMs` dəyərindən daha böyük saxlayın. + +### Dövrə Qırıcısının Hədd Dəyərləri + +Provayder səviyyəli dövrə qırıcısı tənzimləməsi. Defoltlar v3.6 versiyasından bəri 500-dən çox bağlantı üçün istifadə olunan miqyaslandırılmış dəyərləri əks etdirir. + +| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | +| ------------------------------------------------------------- | -------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Dövrə kəsici işə düşməzdən əvvəl OAuth provayderləri üçün ardıcıl xəta həddi. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth provayderinin dövrə kəsicisi üçün sıfırlama intervalı (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API açarı provayderləri üçün ardıcıl xəta həddi. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API açarı provayderinin dövrə kəsicisi üçün sıfırlama intervalı (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Lokal provayderlər (Ollama, LM Studio, ...) üçün ardıcıl xəta həddi. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Lokal provayderin dövrə kəsicisi üçün sıfırlama intervalı (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: bütün OAuth provayderi soyuma rejiminə keçməzdən əvvəl interval daxilində baş verən xətaların sayı. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: OAuth provayderləri üçün sürüşən xəta sayma intervalı (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: OAuth provayderinin həddinə çatdıqdan sonra soyuma müddəti (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth provayderi bu sayda xətadan sonra DEGRADED vəziyyətinə keçir. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth provayderi üçün maksimum resetTimeout artım əmsalı. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth provayderi bu sayda açıq dövrdən sonra gözləmə müddətini artırır. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: bütün API açarı provayderi soyuma rejiminə keçməzdən əvvəl interval daxilində baş verən xətaların sayı. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: API açarı provayderləri üçün sürüşən xəta sayma intervalı (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: API açarı provayderinin həddinə çatdıqdan sonra soyuma müddəti (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API açarı provayderi bu sayda xətadan sonra DEGRADED vəziyyətinə keçir. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API açarı provayderi üçün maksimum resetTimeout artım əmsalı. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API açarı provayderi bu sayda açıq dövrdən sonra gözləmə müddətini artırır. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: bütün lokal provayder soyuma rejiminə keçməzdən əvvəl baş verən xətaların sayı. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: lokal provayderlər üçün sürüşən xəta sayma intervalı (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Provayder səviyyəli dövrə kəsici: lokal provayderin həddinə çatdıqdan sonra soyuma müddəti (ms). | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Kontekst keşinin sabitlənməsinin provayderinin davamlı olaraq qeyri-sağlam hesab edildiyi və ehtiyat provayderə keçid üçün sabitlənmənin ləğv edildiyi geriçəkilmə dərinliyi. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Kontekst keşinin sabitlənməsi ləğv edilməzdən əvvəl qısamüddətli keçici soyumaları qəbul edən anti-dalğalanma intervalı (ms). | ### Ssenarilər -| Ssenari | Konfiqurasiya | -| ---------------------------------------- | ------------------------------------------------------------ | -| **Uzunmüddətli kod generasiyası** | `REQUEST_TIMEOUT_MS=900000` (15 dəq) | -| **Ümumi axın müddətini məhdudlaşdırmaq** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 dəq) | -| **İstehsal API-si üçün sürətli xəta** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Genişləndirilmiş düşünmə modelləri** | `STREAM_IDLE_TIMEOUT_MS=300000` (fraqmentlər arasında 5 dəq) | +| Ssenari | Konfiqurasiya | +| -------------------------------------- | ------------------------------------------------------------ | +| **Uzunmüddətli kod generasiyası** | `REQUEST_TIMEOUT_MS=900000` (15 dəq) | +| **Ümumi axın ömrünü məhdudlaşdırmaq** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 dəq) | +| **İstehsal API-si üçün sürətli xəta** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Genişləndirilmiş düşünmə modelləri** | `STREAM_IDLE_TIMEOUT_MS=300000` (fraqmentlər arasında 5 dəq) | --- @@ -1115,100 +1125,101 @@ masaüstü quraşdırma üçün tənzimlənib. ## 21. Proksi Sağlamlığı -| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | -| ------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Sürətli uğursuzluq üçün sağlamlıq yoxlamasının vaxt aşımı. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Gecikmə üçün optimallaşdırılmış hovuz strategiyasında namizəd proksilərin orta gecikməsini hesablamaq üçün vaxt pəncərəsi (saatla). | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Sağlamlıq yoxlaması nəticələrinin keş TTL-i. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Uğursuz proksi sağlamlıq sınaqları üçün keş TTL-i. Yüksək paralellik zamanı keçici proksi vaxt aşımlarının həqiqətən işləməyən proksilər üçün sürətli uğursuzluq mexanizmini söndürmədən tez təkrar yoxlanılması üçün bunu `PROXY_HEALTH_CACHE_TTL_MS` dəyərindən daha qısa saxlayın. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Qeydiyyata alınmış proksiləri vaxtaşırı yoxlayan fon proksi sağlamlıq planlaşdırıcısını söndürmək üçün `false` təyin edin. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Fon sağlamlıq planlaşdırıcısının yoxlama intervalı, ms ilə (minimum `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Planlaşdırıcı və `/api/settings/proxies/auto-test` son nöqtəsi tərəfindən istifadə edilən əlçatanlıq sınağının hədəfi. İctimai standart hədəfdən istifadə etməmək üçün onu daxili/öz serverinizdə yerləşdirilən URL-ə yönəldin. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Planlaşdırıcı və `/api/settings/proxies/auto-test` son nöqtəsi tərəfindən ortaq istifadə edilən, hər paketdə eyni anda başladılan sınaqların sayı. Minimum 1-ə yuvarlaqlaşdırılır və maksimum 50 ilə məhdudlaşdırılır. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Paket daxilində iki sınağın göndərilməsi arasındakı gecikmə, ms ilə. Bu olmadan bütün paket eyni anda göndərilir və ortaq çıxış IP-si sorğu tezliyi məhdudlaşdırılan hədəfin limitini işə sala bilər. Aralığı söndürmək üçün `0` təyin edin; maksimum 5000 ilə məhdudlaşdırılır. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Proksiyə təyin edilmiş provayderin real hostunun yoxlanmasını (`GET /models`, API açarı olmadan) dayandırmaq və əvəzində həmişə `PROXY_HEALTH_TEST_URL` istifadə etmək üçün `false` təyin edin. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` olduqda (standart), avtomatlaşdırılmış əlçatanlıq sınaqları (planlaşdırıcı + `/api/settings/proxies/auto-test` səhifəsindəki "Hamısını sınaqdan keçir" düyməsi) **yalnız oxuma rejimindədir** və heç vaxt proksinin statusunu yazmır — aktiv/qeyri-aktiv statusunu yalnız operator təyin edir, beləliklə qeyri-sabit sınaq təyin edilmiş proksini istifadəsiz vəziyyətdə qoya bilməz (#6246). Köhnə sınaqdan-keçir-və-təyin-et davranışını bərpa etmək üçün `true` təyin edin. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Qoşulma tələb edən funksiya bayrağıdır (baxın: [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); idarə panelinin DB əvəzetməsi üstünlük təşkil edir). `true` (və ya `1`, `yes`) idarə panelində proksi hovuzunun altında yalnız oxuma üçün hovuz çıxışı müşahidəsini göstərir (proksi jurnalından son 24 saat üzrə fərqli çıxış IP-ləri, bağlantılar və bir IP arxasında ən çox müşahidə edilən say). Heç vaxt marşrutlaşdırma üçün istifadə edilmir. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Təkrarlanan ardıcıl uğursuzluqlardan sonra planlaşdırıcının proksiləri avtomatik silməsinə icazə vermək üçün `true` təyin edin. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Planlaşdırıcının proksini avtomatik silməsindən əvvəlki ardıcıl uğursuzluqların sayı (`PROXY_AUTO_REMOVE=true` olduqda). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Planlaşdırıcının təkrarlanan ardıcıl uğursuzluqlardan sonra proksini silmək əvəzinə yumşaq şəkildə söndürməsinə (status `dead`, heç vaxt silinmir) icazə vermək üçün `true` təyin edin. `PROXY_AUTO_REMOVE` üçün məlumatları silməyən alternativdir: proksi hovuz/rotasiya seçimindən dərhal çıxarılır (əhatə dairəsi hovuzunun seçimi tərəfindən istifadə edilən işlək status filtri onu artıq istisna edir) və sınaqlardan yenidən uğurla keçməyə başladıqda avtomatik aktivləşdirilir. `PROXY_AUTO_REMOVE_AFTER` həddindən istifadə edir. Hər iki bayraq `true` olarsa, `PROXY_AUTO_REMOVE` üstünlük təşkil edir. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Proksi əlçatanlığının ilkin yoxlamaları uğursuz olduqda OAuth və provayder doğrulama axınlarının sabitlənmiş proksidən yan keçərək birbaşa qoşulmasına icazə verir. Effektiv üstünlük sırası belədir: Funksiya Bayraqları DB əvəzetməsi > mühit dəyişəni > standart dəyər. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 san.) | `open-sse/services/rateLimitManager.ts` | Sorğu uğursuz hesab edilməzdən əvvəl 429 cavabında maksimum gözləmə müddəti. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 dəq.) | `open-sse/services/rateLimitManager.ts` | Qəbul edilmiş sorğunun sorğu tezliyi limiti rezervasiyası bitməzdən əvvəl icrada qala biləcəyi maksimum müddət — növbə gözləmə büdcəsindən ayrıdır ki, artımlı olmayan şlüzlərdə fetch əməliyyatının yavaş başlaması vaxt aşımına səbəb olmasın (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (söndürülüb) | `open-sse/services/rateLimitManager.ts` | Növbəyə qəbul limiti: artıq bu sayda sorğu növbədə olduqda 429 `queue_full` xətası ilə rədd edin. `0` = məhdudiyyətsiz (standart). | -| `RATE_LIMIT_AUTO_ENABLE` | _(təyin edilməyib)_ | `open-sse/services/rateLimitManager.ts` | Saxlanılmış İdarə Paneli parametrindən asılı olmayaraq sorğu tezliyi limitinin avtomatik aktivləşdirilməsi üçün təhlükəsizlik mexanizmini məcburi şəkildə aktivləşdirin/söndürün. Məcburi aktivləşdirmək üçün `true`/`1`/`on`, məcburi söndürmək üçün `false`/`0`/`off` qəbul edir. | -| `PROVIDER_COOLDOWN_ENABLED` | _(təyin edilməyib → söndürülüb)_ | `open-sse/services/providerCooldownTracker.ts` | Qoşulma tələb edən, sorğulararası qlobal provayder/bağlantı gözləmə müddəti izləməsi. Standart olaraq SÖNDÜRÜLÜB (Bağlantı Gözləmə Müddəti / Provayder Dövrə Açarı ilə üst-üstə düşür). Aktivləşdirmək üçün `true`/`1`/`on` qəbul edir. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Uğursuz provayder/bağlantı yenidən sınaqdan keçirilməzdən əvvəl minimum gözləmə müddəti (ms). Ardıcıl uğursuzluqlara əsasən eksponensial şəkildə artırılır. Yalnız `PROVIDER_COOLDOWN_ENABLED` olduqda istifadə edilir. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 dəq.) | `open-sse/services/providerCooldownTracker.ts` | Uğursuz provayder/bağlantı hər halda yenidən sınaqdan keçirilməzdən əvvəl maksimum gözləmə müddəti (ms) həddi. Yalnız `PROVIDER_COOLDOWN_ENABLED` olduqda istifadə edilir. | -| `STREAM_RECOVERY_ENABLED` | _(təyin edilməyib → söndürülüb)_ | `src/lib/resilience/settings.ts` (ilkin dəyər) → `open-sse/services/streamRecovery.ts` (məntiq) | **Nədir:** yarımçıq kəsilmiş yuxarı axın yayımlarının şəffaf bərpası (free-claude-code portu). Açılış SSE pəncərəsini `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) müddətinədək saxlayır ki, _təsdiqdən əvvəlki_ kəsilmə — hər hansı bayt müştəriyə çatmazdan əvvəl baş verən kəsilmə — yenidən açılsın və görünmədən təkrar sınaqdan keçirilsin. **Nə vaxt aktivləşdirilməlidir:** yayımın başlanğıcında tez-tez 0 baytlıq kəsilmələr yaradan qeyri-sabit/yuxarı axınlar üçün; hər yayımda ilk tokenədək müddətin 750 ms-ə qədər artmasını qəbul edə bilmirsinizsə, SÖNDÜRÜLMÜŞ saxlayın. `true`/`1`/`on` qəbul edir. Saxlanılmış Dayanıqlılıq parametrinin ilkin dəyərini müəyyən edir; təyin edildikdən sonra İdarə Paneli parametri üstünlük təşkil edir. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(təyin edilməyib → söndürülüb)_ | `src/lib/resilience/settings.ts` (ilkin dəyər) → `open-sse/services/streamRecovery.ts` (məntiq) | **Nədir:** yayım ortasında davam etdirmə (Mərhələ 4.4) — _təsdiqdən sonrakı_ kəsilmədən sonra (baytlar artıq müştəriyə çatıb) qismən mətni assistant ön əlavəsi kimi istifadə edərək yenidən sorğu göndərir və çatışmayan sonluğu birləşdirir. Yalnız düz mətnli, OpenAI ilə uyğun yayımlar üçündür; icrada alət çağırışı olduqda heç vaxt işə düşmür. **Nə vaxt aktivləşdirilməlidir:** cavabın ortasında kəsilən uzun generasiyalar üçün və bərpa edilmiş sonluğun token-token deyil, bir paket şəklində gəlməsini qəbul etdiyiniz halda. `STREAM_RECOVERY_ENABLED` dəyişənindən müstəqildir (fərqli risk profili). `true`/`1`/`on` qəbul edir. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(təyin edilməyib → söndürülüb)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Qoşulma tələb edən aktiv yayımın faydalı çıxış nəzarətçisi. Hissələr göndərməyə davam edən, lakin konfiqurasiya edilmiş assistant çıxış sürətindən aşağı qalan yayımları aşkarlayır; heartbeat-lər, istifadə hadisələri, boş deltalar və alət/mühakimə mərhələləri irəliləyiş kimi görünmür. Boşdayanma və sərt son müddət vaxt aşımlarından ayrıdır. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Ötürmə qabiliyyəti qiymətləndirilməzdən əvvəlki güzəşt müddəti; 0–600000 ms ilə məhdudlaşdırılır. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Sürüşən faydalı çıxış pəncərəsi; 1000–600000 ms ilə məhdudlaşdırılır; dayandırmadan əvvəl bir tam pəncərə tələb olunur. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimum UTF-8 assistant çıxışı bayt sürəti (mühafizəkar token göstəricisi); 1–1000000 ilə məhdudlaşdırılır. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Ölçülə bilən hesab edilən minimum sıfırdan fərqli faydalı çıxış nümunəsi; 1–1000000 bayt ilə məhdudlaşdırılır. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Başlanğıc zamanı provayder tokenlərinin sağlamlıq yoxlamaları arasındakı mərhələli interval (ms). | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Sorğuların birdən göndərilməsinin qarşısını almaq üçün provayder tokenlərinin sağlamlıq yoxlamaları arasında `HEALTHCHECK_STAGGER_MS` üzərinə əlavə edilən minimum təsadüfi yayınma (ms) (Məsələ #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Sorğuların birdən göndərilməsinin qarşısını almaq üçün provayder tokenlərinin sağlamlıq yoxlamaları arasında `HEALTHCHECK_STAGGER_MS` üzərinə əlavə edilən maksimum təsadüfi yayınma (ms) (Məsələ #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Başlanğıcdakı token sağlamlığı yoxlaması üçün paralel yoxlama paketinin ölçüsü; daha böyük dəyərlər paralel olaraq daha çox bağlantını yoxlayır, daha kiçik dəyərlər isə ani yükü azaldır (Məsələ #7875, #7719-un reqressiyası). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Xəta müştəriyə qaytarılmazdan əvvəl model əhatəli gözləmə müddəti cavablarında avtomatik təkrar cəhdlərin sayı. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Gözləmə müddətindən sonra təkrar cəhdlər arasındakı maksimum geri çəkilmə intervalı (saniyə). Yuxarı axının `Retry-After` dəyərindən asılı olmayaraq bu dəyərlə məhdudlaşdırılır. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom token qənaəti proksisinin URL-i. İdarə panelinin həyat dövrü (`api/headroom/*`) standart olaraq loopback üzərində lokal `headroom-ai` CLI-ni işə salır; yalnız xarici Docker yan-konteyner proksisinə yönləndirmək üçün dəyişdirin. | - -### Axın bərpasının sazlanma sabitləri - -Bərpa zamanı gecikdirmə davranışı `open-sse/config/constants.ts` faylındakı -(`STREAM_RECOVERY`) sərt kodlaşdırılmış sabitlərlə sazlanır; onlar istinad üçün burada göstərilib — -onları dəyişdirmək mühit dəyişəni deyil, kod dəyişikliyi tələb edir: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — ilkin SSE pəncərəsinin nə qədər saxlanıldığını müəyyən edir - ki, erkən kəsilmə halında müştəriyə hər hansı bayt ötürülməzdən əvvəl yenidən cəhd edilə bilsin. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — saxlanılan pəncərə üçün sərt həddir; taymerdən asılı olmayaraq, - bu qədər bayt yığılan kimi ötürmə (buferin boşaldılması + birbaşa ötürmə) başlayır. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — gecikdirilmiş məlumatlar hələ ötürülmədiyi müddətdə yuxarı axının - şəffaf şəkildə yenidən açılması üçün maksimum cəhd sayıdır. - -> **Provayder üzrə sürüşən pəncərəli sürət limiti (mühit dəyişəni yoxdur):** FCC-dən köçürülmüş -> provayder üzrə sürüşən pəncərəli sürət limiti _ehtiyat mexanizmi_ kodda mövcuddur -> (`open-sse/services/providerDefaultRateLimit.ts`, `open-sse/services/rateLimitManager.ts` -> vasitəsilə qoşulub), lakin **boş standart xəritə** ilə təqdim olunur və hazırda -> **operator üçün mühit dəyişəni yoxdur** — yalnız test qarmağı / kod dəyişikliyi vasitəsilə -> aktivləşdirilir. O, bilərəkdən yuxarıdakı cədvəldə göstərilməyib. Tənzimləmə imkanı olan -> hər `(token, IP)` üzrə rele məhdudlaşdırıcısı `RELAY_IP_PER_MINUTE`-dir (§3 Şəbəkə və portlar). +| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | +| ------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Sürətli uğursuzluq üçün sağlamlıq yoxlamasının vaxt aşımı. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Gecikməyə görə optimallaşdırılmış hovuz strategiyasında namizəd proksilərin orta gecikməsini hesablamaq üçün vaxt pəncərəsi (saatla). | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Sağlamlıq yoxlaması nəticələrinin keş TTL-i. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Uğursuz proksi sağlamlıq sınaqları üçün keş TTL-i. Bunu `PROXY_HEALTH_CACHE_TTL_MS` dəyərindən daha qısa saxlayın ki, yüksək paralellik şəraitində müvəqqəti proksi vaxt aşımları tez bir zamanda yenidən sınaqdan keçirilsin və həqiqətən işləməyən proksilər üçün sürətli uğursuzluq mexanizmi deaktiv edilməsin. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Qeydiyyatdan keçmiş proksiləri vaxtaşırı sınaqdan keçirən arxa plan proksi sağlamlığı planlaşdırıcısını deaktiv etmək üçün `false` təyin edin. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Arxa plan sağlamlıq planlaşdırıcısının yoxlama intervalı, ms ilə (minimum `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Planlaşdırıcı və `/api/settings/proxies/auto-test` endpoint-i tərəfindən istifadə olunan əlçatanlıq yoxlamasının hədəfi. İctimai standart hədəfdən yayınmaq üçün onu daxili/özünüz tərəfindən host edilən URL-ə yönəldin. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Planlaşdırıcı və `/api/settings/proxies/auto-test` endpoint-i tərəfindən ortaq istifadə edilərək hər paketdə eyni anda başladılan yoxlamaların sayı. Minimum 1-ə yuvarlaqlaşdırılır və maksimum 50 ilə məhdudlaşdırılır. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Paket daxilində iki yoxlamanın başladılması arasındakı millisaniyə ilə gecikmə. Bu parametr olmadan bütün paket eyni anda göndərilir və ortaq çıxış IP-si sorğu tezliyi məhdudlaşdırılmış hədəfin limitini işə sala bilər. Fasiləni söndürmək üçün `0` təyin edin; maksimum 5000 ilə məhdudlaşdırılır. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Proksiyə təyin edilmiş provayderin faktiki hostunun yoxlanmasını (`GET /models`, API açarı olmadan) dayandırmaq və əvəzinə həmişə `PROXY_HEALTH_TEST_URL` istifadə etmək üçün "false" təyin edin. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` olduqda (standart), avtomatlaşdırılmış əlçatanlıq yoxlamaları (planlaşdırıcı + `/api/settings/proxies/auto-test` endpoint-indəki "Hamısını yoxla" düyməsi) **yalnız oxuma rejimindədir** və proksinin statusunu heç vaxt dəyişmir — aktiv/qeyri-aktiv statusunu yalnız operator təyin edir, buna görə də qeyri-sabit yoxlama təyin edilmiş proksini əlçatmaz vəziyyətdə qoymur (#6246). Köhnə yoxla-və-təyin-et davranışını bərpa etmək üçün `true` təyin edin. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Könüllü aktivləşdirilən funksiya bayrağı ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) sənədinə baxın; idarə panelindəki DB əvəzləməsi üstünlük təşkil edir). `true` (və ya `1`, `yes`) idarə panelində proksi hovuzunun altında yalnız oxuma rejimli çıxış müşahidəsini göstərir (proksi jurnalından son 24 saat ərzində fərqli çıxış IP-ləri, bağlantılar və bir IP arxasında ən çox müşahidə edilən say). Marşrutlaşdırma üçün heç vaxt istifadə edilmir. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Təkrarlanan ardıcıl uğursuzluqlardan sonra planlaşdırıcının proksiləri avtomatik silməsinə icazə vermək üçün `true` təyin edin. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Planlaşdırıcının proksini avtomatik silməsindən əvvəl tələb olunan ardıcıl uğursuzluqların sayı (`PROXY_AUTO_REMOVE=true` olduqda). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Planlaşdırıcının təkrarlanan ardıcıl xətalardan sonra proksini silmək əvəzinə yumşaq şəkildə deaktiv etməsi (`dead` statusu, heç vaxt silinmir) üçün `true` təyin edin. `PROXY_AUTO_REMOVE` üçün dağıdıcı olmayan alternativdir: proksi hovuz/rotasiya həllindən dərhal çıxarılır (əhatə dairəsi hovuzunun həllində istifadə edilən aktiv status filtri onu artıq istisna edir) və yoxlamalardan yenidən uğurla keçməyə başladıqda avtomatik olaraq yenidən aktivləşdirilir. `PROXY_AUTO_REMOVE_AFTER` həddindən ortaq istifadə edir. Hər iki bayraq `true` olarsa, `PROXY_AUTO_REMOVE` üstünlük qazanır. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Proksinin əlçatanlığının ilkin yoxlamaları uğursuz olduqda OAuth və provayder doğrulama axınlarının sabitlənmiş proksidən yan keçərək birbaşa qoşulmasına icazə verin. Effektiv üstünlük sırası belədir: Funksiya Bayraqları VB-dəki əvəzləmə > mühit dəyişəni > standart dəyər. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 san.) | `src/lib/resilience/settings.ts` | Standart **növbədə gözləmə** büdcəsi: sorğu rədd edilməzdən və yuxarı axına heç vaxt çatmadan əvvəl provayder slotunu nə qədər gözləyə və növbədə nə qədər qala bilər. Tapşırıq icra olunmağa başladıqdan sonra taymer sıfırlanır — icra ayrıca `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` ilə məhdudlaşdırılır. Mühit dəyişəni yalnız standart dəyəri təyin edir: əvvəl saxlanılmış `resilienceSettings.requestQueue.maxWaitMs`, sonra isə hər bağlantı üçün `rateLimitOverrides.maxWaitMs` onun üzərində üstünlük qazanır. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 dəq.) | `open-sse/services/rateLimitManager.ts` | Qəbul edilmiş sorğunun sürət limiti rezervasiyasının müddəti bitməzdən əvvəl icrada qala biləcəyi maksimum müddət — növbədə gözləmə büdcəsindən ayrıdır ki, artımlı olmayan şlüzlərdə ləng sorğu başladılması vaxt aşımına səbəb olmasın (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deaktivdir) | `open-sse/services/rateLimitManager.ts` | Növbəyə qəbul limiti: bu sayda sorğu artıq növbədə olduqda 429 `queue_full` xətası ilə rədd edin. `0` = limitsiz (standart). | +| `RATE_LIMIT_AUTO_ENABLE` | _(təyin edilməyib)_ | `open-sse/services/rateLimitManager.ts` | Saxlanılmış İdarəetmə Paneli parametrindən asılı olmayaraq sürət limitinin avtomatik aktivləşdirilməsi üçün təhlükəsizlik mexanizmini məcburi şəkildə aktivləşdirin/deaktivləşdirin. Məcburi aktivləşdirmək üçün `true`/`1`/`on`, məcburi deaktivləşdirmək üçün `false`/`0`/`off` qəbul edir. | +| `PROVIDER_COOLDOWN_ENABLED` | _(təyin edilməyib → söndürülüb)_ | `open-sse/services/providerCooldownTracker.ts` | Sorğular arasında qlobal provayder/bağlantı soyuma müddətinin izlənməsini seçim əsasında aktivləşdirir. Standart olaraq SÖNDÜRÜLÜB (Bağlantı Soyuma Müddəti / Provayder Dövrə Qırıcısı ilə üst-üstə düşür). Aktivləşdirmək üçün `true`/`1`/`on` qəbul edir. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Uğursuz olmuş provayder/bağlantı yenidən sınanmadan əvvəl minimum soyuma müddəti (ms). Ardıcıl uğursuzluqlara uyğun olaraq eksponensial şəkildə artırılır. Yalnız `PROVIDER_COOLDOWN_ENABLED` aktiv olduqda istifadə edilir. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 dəq) | `open-sse/services/providerCooldownTracker.ts` | Uğursuz provayder/bağlantı istənilən halda yenidən sınanmadan əvvəl maksimum gözləmə müddəti (ms). Yalnız `PROVIDER_COOLDOWN_ENABLED` aktiv olduqda istifadə edilir. | +| `STREAM_RECOVERY_ENABLED` | _(təyin edilməyib → sönülü)_ | `src/lib/resilience/settings.ts` (ilkin dəyər) → `open-sse/services/streamRecovery.ts` (məntiq) | **Nədir:** yarımçıq kəsilmiş yuxarı axınların şəffaf bərpası (free-claude-code portu). Açılış SSE pəncərəsini `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) müddətinədək saxlayır ki, _təsdiqdən əvvəlki_ kəsilmə — hər hansı bayt müştəriyə çatmazdan əvvəl baş verən kəsilmə — görünməz şəkildə yenidən açılsın və təkrar sınansın. **Nə zaman aktivləşdirilməlidir:** axın başlayarkən tez-tez 0 baytla kəsilən qeyri-sabit yuxarı axınlar üçün; hər axında ilk tokenədək olan vaxta 750 ms-ə qədər əlavə gecikmə verə bilmirsinizsə, SÖNÜLÜ saxlayın. `true`/`1`/`on` qəbul edir. Saxlanılan Dayanıqlılıq parametrinin ilkin dəyərini təyin edir; bir dəfə təyin edildikdən sonra İdarə panelindəki parametr üstünlük təşkil edir. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(təyin edilməyib → sönülü)_ | `src/lib/resilience/settings.ts` (ilkin dəyər) → `open-sse/services/streamRecovery.ts` (məntiq) | **Nədir:** axının ortasından davametmə (Mərhələ 4.4) — _təsdiqdən sonrakı_ kəsilmədən (baytlar artıq müştəriyə çatıb) sonra qismən mətni assistentin ilkin doldurması kimi istifadə edərək sorğunu yenidən göndərir və çatışmayan sonluğu birləşdirir. Yalnız düz mətnli OpenAI-uyğun axınlar üçün nəzərdə tutulub; alət çağırışı icra olunarkən heç vaxt işə düşmür. **Nə zaman aktivləşdirilməlidir:** cavabın ortasında kəsilən uzun generasiyalar üçün və bərpa edilmiş sonluğun token-token deyil, bir paket şəklində gəlməsini qəbul etdiyiniz halda. `STREAM_RECOVERY_ENABLED` parametrindən asılı deyil (fərqli risk profili). `true`/`1`/`on` qəbul edir. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(təyin edilməyib → sönülü)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Könüllü aktiv axın faydalı çıxış nəzarətçisi. Fraqmentlər göndərməyə davam edən, lakin konfiqurasiya edilmiş assistent çıxışı sürətindən aşağı qalan axınları aşkarlayır; ürək döyüntüləri, istifadə hadisələri, boş deltalar və alət/mühakimə mərhələləri yanlış olaraq irəliləyiş kimi qəbul edilmir. Boşdayanma və sərt son müddət taymautlarından ayrıdır. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Ötürmə qabiliyyətinin qiymətləndirilməsindən əvvəlki güzəşt müddəti; 0–600000 ms ilə məhdudlaşdırılır. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Sürüşən faydalı çıxış pəncərəsi; 1000–600000 ms ilə məhdudlaşdırılır; dayandırmadan əvvəl bir tam pəncərə tələb olunur. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimum UTF-8 assistent çıxışı bayt sürəti (konservativ token əvəzedicisi); 1–1000000 ilə məhdudlaşdırılır. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Ölçülə bilən hesab edilən minimum sıfırdan fərqli faydalı çıxış nümunəsi; 1–1000000 bayt ilə məhdudlaşdırılır. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Başlanğıc zamanı provayder tokenlərinin sağlamlıq yoxlamaları arasındakı mərhələli interval (ms). | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Yüklənmə sıçrayışının qarşısını almaq üçün provayder tokenlərinin sağlamlıq yoxlamaları arasında `HEALTHCHECK_STAGGER_MS` üzərinə əlavə edilən minimum təsadüfi yayınma (ms) (Məsələ #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Yüklənmə sıçrayışının qarşısını almaq üçün provayder tokenlərinin sağlamlıq yoxlamaları arasında `HEALTHCHECK_STAGGER_MS` üzərinə əlavə edilən maksimum təsadüfi yayınma (ms) (Məsələ #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Başlanğıc zamanı token sağlamlıq yoxlaması üzrə ümumi yoxlama üçün paralel yoxlama paketinin ölçüsü; daha böyük dəyərlər daha çox bağlantını paralel yoxlayır, daha kiçik dəyərlər isə ani yükü azaldır (Məsələ #7875, #7719-un reqressiyası). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Müştəriyə xəta qaytarmazdan əvvəl model səviyyəli gözləmə müddəti cavabları üçün avtomatik təkrar cəhdlərin sayı. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Gözləmə müddəti üzrə təkrar cəhdlər arasındakı maksimal geriyə çəkilmə intervalı (saniyə). Yuxarı axındakı `Retry-After` dəyərindən asılı olmayaraq bu dəyərlə məhdudlaşdırılır. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom token qənaəti proksisinin URL-i. İdarəetmə panelinin həyat dövrü (`api/headroom/*`) standart olaraq geridöngə interfeysində lokal `headroom-ai` CLI-ni işə salır; yalnız xarici Docker yan konteyner proksisinə yönləndirmək üçün dəyişdirin. | + +### Axın bərpasının sazlama sabitləri + +Bərpa zamanı saxlayıb gözləmə davranışı +`open-sse/config/constants.ts` faylındakı (`STREAM_RECOVERY`) birbaşa kodlaşdırılmış sabitlərlə sazlanır; onlar istinad üçün burada göstərilib — +onları dəyişdirmək üçün mühit dəyişəni deyil, kod dəyişikliyi tələb olunur: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — ilkin SSE pəncərəsinin nə qədər saxlanacağını müəyyən edir ki, + erkən kəsilmə halında müştəriyə hər hansı bayt göndərilməzdən əvvəl yenidən cəhd edilə bilsin. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — saxlanılan pəncərə üçün sərt yuxarı həddir; taymerdən asılı olmayaraq + bu qədər bayt toplanan kimi ötürmə (boşaltma + birbaşa keçid) həyata keçirilir. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — saxlanılan məlumat hələ ötürülmədiyi müddətdə yuxarı axın + axınının şəffaf şəkildə yenidən açılması üçün maksimal cəhd sayı. + +> **Provayder üzrə sürüşən pəncərəli sürət məhdudiyyəti (mühit dəyişəni yoxdur):** FCC-dən köçürülmüş +> provayder üzrə sürüşən pəncərəli sürət məhdudiyyəti _ehtiyat mexanizmi_ kodda mövcuddur +> (`open-sse/services/providerDefaultRateLimit.ts`, bağlantısı +> `open-sse/services/rateLimitManager.ts` vasitəsilə qurulub), lakin **standart olaraq boş xəritə** ilə təqdim edilir +> və hazırda **operator üçün mühit dəyişəni yoxdur** — o, yalnız test qarmağı / +> kod dəyişikliyi vasitəsilə aktivləşdirilir. O, qəsdən yuxarıdakı cədvəldə göstərilməyib. Tənzimləyicisi olan +> hər bir `(token, IP)` üçün relay məhdudlaşdırıcısı isə `RELAY_IP_PER_MINUTE`-dır (§3 Şəbəkə və Portlar). --- ## 22. Sazlama > [!CAUTION] -> Bu dəyişənlər **ətraflı çıxış** yaradır və həssas məlumatların sızmasına səbəb ola bilər. **İstehsal mühitində heç vaxt aktiv etməyin.** - -| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | -| ------------------------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(təyin edilməyib)_ | `open-sse/executors/cursor.ts` | Cursor icraçısının ətraflı jurnallarını (dekodlaşdırılmış SSE fraqmentləri və s.) aktiv etmək üçün `1` təyin edin. | -| `CURSOR_STREAM_DEBUG` | _(təyin edilməyib)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG` üçün geriyə uyğun alias. | -| `CURSOR_DUMP_FILE` | _(təyin edilməyib)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG=1` olduqda xam dekodlaşdırılmış Cursor fraqmentlərinin yazıldığı ixtiyari fayl yolu. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor icraçısı üçün axının fəaliyyətsizlik taym-autu (ms). | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Baytlar buferdə qaldıqda composer kv_after_text yumşaq sonlandırıcısından sonrakı möhlət müddəti (ms) — sondakı exec_mcp alət çağırışına öz freymini tamamlamaq üçün vaxt verir. | -| `CURSOR_TOOL_DIRECTIVE` | aktivdir (`!== "0"`) | `open-sse/executors/cursor.ts` | composer-2.5 modelinin alət çağırışlarını etibarlı şəkildə həyata keçirməsini təmin edən alət təsdiqləmə direktivi. Deaktiv etmək üçün `0` təyin edin. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(təyin edilməyib)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Tərcümədən SONRA sistem mesajına əlavə edilən operator tərəfindən müəyyənləşdirilmiş sistem göstərişi mətni (tərcümədən sonrakı inyeksiya); codex/Responses və `/v1/messages` yollarına çatır. Həmçinin əks-səda kimi qaytarılan sistem preambulası bloklarından çıxarılan direktiv prefiksi kimi istifadə olunur. Deaktiv etmək üçün təyin etməyin. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Uzaq `image_url` vizual girişi üçün hər şəkil üzrə yükləmə taym-autu (ms). | -| `CURSOR_STATE_DB_PATH` | _(aşkarlanır)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE versiyasının aşkarlanması üçün istifadə edilən Cursor IDE vəziyyət verilənlər bazasının axtarış yolunu dəyişdirin. | -| `CURSOR_AGENT_CLI_VERSION` | _(aşkarlama / sabitləmə)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run-da `x-cursor-client-version: cli-…` üçün Agent CLI yığım identifikatoru (`YYYY.MM.DD-`). | -| `CURSOR_AGENT_BIN` | _(təyin edilməyib)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Şəkil yaratmaq üçün istifadə edilən Cursor Agent binar faylının yolu. Təyin edilmədikdə işləyici əvvəlcə `providerSpecificData.agentBin`, sonra isə PATH istifadə edir. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent şəkil tapşırıqları üçün hər şəkil üzrə ümumi vaxt limiti (ms). | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor şəkil tapşırıqları üçün paylaşılan yer üzrə paralellik məhdudiyyəti. | -| `CURSOR_IMG_MODEL` | sorğu / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Şəkil tapşırıqları üçün Cursor CLI `--model` parametrini dəyişdirin. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) şəkil yaratma nəticəsinin yoxlanma tezliyi (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC şəkil yaratma nəticəsinin yoxlanması üçün ümumi vaxt limiti (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) video yaratma nəticəsinin yoxlanma tezliyi (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video yaratma nəticəsinin yoxlanması üçün ümumi vaxt limiti (ms). | -| `CURSOR_DATA_DIR` | _(aşkarlanır)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI məlumat qovluğunu (`…/versions/`) dəyişdirin; rəsmi agentin istifadə etdiyi eyni dəyişəndir. | -| `CURSOR_TOKEN` | _(təyin edilməyib)_ | `scripts/ad-hoc/cursor-tap.cjs` | Tərtibatçı alətləri tərəfindən istifadə edilən birbaşa Cursor bearer tokeni. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | deaktivdir (`"1"` vasitəsilə seçimli) | `src/app/api/v1/chat/completions/route.ts` | `"1"` təyin edildikdə böyük söhbət faydalı yükləri üçün məzmun növü/uzunluğu markerlərini jurnala yazır. Jurnal səs-küyünü azaltmaq üçün standart olaraq deaktivdir. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(təyin edilməyib)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON tərcüməsinin təfərrüatlarını jurnala yazmaq üçün `true` təyin edin. | -| `DEBUG_CLAUDE_NONSTREAM` | _(təyin edilməyib)_ | `open-sse/handlers/responseTranslator.ts` | Claude cavabının tərcümə yolunda boş textContent fraqmentlərini göstərmək üçün `true` təyin edin (yalnız sazlama üçün). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(təyin edilməyib)_ | E2E sınaq infrastrukturu | E2E sınaq rejimini (yumşaldılmış autentifikasiya, sınaq qarmaqları) aktiv etmək üçün `true` təyin edin. | +> Bu dəyişənlər **ətraflı çıxış** yaradır və həssas məlumatların sızmasına səbəb ola bilər. **Onları heç vaxt istehsal mühitində aktivləşdirməyin.** + +| Dəyişən | Standart dəyər | Mənbə faylı | Təsvir | +| ------------------------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(təyin edilməyib)_ | `open-sse/executors/cursor.ts` | Ətraflı Cursor icraçı jurnallarını (dekodlanmış SSE fraqmentləri və s.) aktivləşdirmək üçün `1` təyin edin. | +| `CURSOR_STREAM_DEBUG` | _(təyin edilməyib)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG` üçün geriyə uyğun alternativ addır. | +| `CURSOR_DUMP_FILE` | _(təyin edilməyib)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG=1` olduqda xam dekodlanmış Cursor fraqmentlərinin yazıldığı istəyə bağlı fayl yolu. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor icraçısı üçün axının boş qalma taymautu (ms). | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Baytlar buferdə qaldıqda composer kv_after_text yumşaq sonlandırıcısından sonrakı güzəşt müddəti (ms) — sondakı exec_mcp alət çağırışına öz çərçivəsini tamamlamaq üçün vaxt verir. | +| `CURSOR_TOOL_DIRECTIVE` | aktivdir (`!== "0"`) | `open-sse/executors/cursor.ts` | composer-2.5-in alət çağırışlarını etibarlı şəkildə yaratmasını təmin edən alət təsdiqləmə direktivi. Deaktivləşdirmək üçün `0` təyin edin. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(təyin edilməyib)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Tərcümədən SONRA sistem mesajına əlavə edilən operator tərəfindən müəyyənləşdirilmiş sistem sorğusu mətni (tərcümədən sonrakı inyeksiya); codex/Responses və `/v1/messages` yollarına çatır. Həmçinin əks etdirilmiş sistem preambulası bloklarından silinən direktiv prefiksi kimi istifadə olunur. Deaktiv saxlamaq üçün təyin etməyin. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (söndürülüb) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | openai→claude axınının başlanğıcından əks etdirilmiş sistem sorğusu preambulası bloklarını silmək üçün `1` təyin edin. Standart olaraq söndürülüb — evristikalar ingilis nəsrinin strukturuna uyğunlaşdırılıb və cavab yükünü dəyişdirir, buna görə də qanuni olaraq belə bir bölmə ilə başlayan cavab həmin bölməni itirər. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Uzaq `image_url` vizual girişi üçün hər təsvir üzrə əldəetmə taymautu (ms). | +| `CURSOR_STATE_DB_PATH` | _(yoxlanılır)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE versiyasının aşkarlanması üçün istifadə olunan Cursor IDE vəziyyət verilənlər bazası axtarışını əvəz edin. | +| `CURSOR_AGENT_CLI_VERSION` | _(aşkarlama / sabitləmə)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run-da `x-cursor-client-version: cli-…` üçün Agent CLI yığım identifikatoru (`YYYY.MM.DD-`). | +| `CURSOR_AGENT_BIN` | _(təyin edilməyib)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Təsvir yaratmaq üçün istifadə olunan Cursor Agent binar faylının yolu. Təyin edilmədikdə işləyici əvvəlcə `providerSpecificData.agentBin`, sonra isə PATH istifadə edir. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent təsvir tapşırıqları üçün hər təsvir üzrə ümumi icra müddəti (ms). | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor təsvir tapşırıqları üçün ortaq yer üzrə paralellik məhdudiyyəti. | +| `CURSOR_IMG_MODEL` | sorğu / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Təsvir tapşırıqları üçün Cursor CLI `--model` parametrini əvəz edin. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) təsvir yaratma nəticəsinin sorğulanma tezliyi (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC təsvir yaratma nəticəsinin sorğulanması üçün ümumi müddət (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) video yaratma nəticəsinin sorğulanma tezliyi (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video yaratma nəticəsinin sorğulanması üçün ümumi müddət (ms). | +| `CURSOR_DATA_DIR` | _(yoxlanılır)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI məlumat qovluğunu (`…/versions/`) əvəz edin; rəsmi agentin istifadə etdiyi eyni dəyişəndir. | +| `CURSOR_TOKEN` | _(təyin edilməyib)_ | `scripts/ad-hoc/cursor-tap.cjs` | Tərtibatçı alətləri tərəfindən istifadə olunan birbaşa Cursor bearer tokeni. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | deaktivdir (`"1"` vasitəsilə aktivləşdirilir) | `src/app/api/v1/chat/completions/route.ts` | `"1"` təyin edildikdə böyük söhbət yükləri üçün məzmun növü/uzunluğu göstəricilərini jurnala yazın. Jurnal səs-küyünü azaltmaq üçün standart olaraq söndürülüb. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(təyin edilməyib)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON tərcümə təfərrüatlarını jurnala yazmaq üçün `true` təyin edin. | +| `DEBUG_CLAUDE_NONSTREAM` | _(təyin edilməyib)_ | `open-sse/handlers/responseTranslator.ts` | Claude cavabının tərcümə yolunda boş textContent fraqmentlərini göstərmək üçün `true` təyin edin (yalnız sazlama üçün). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(təyin edilməyib)_ | E2E test infrastrukturu | E2E test rejimini (yumşaldılmış autentifikasiya, test qarmaqları) aktivləşdirmək üçün `true` təyin edin. | --- diff --git a/docs/i18n/az/docs/reference/FEATURE_FLAGS.md b/docs/i18n/az/docs/reference/FEATURE_FLAGS.md index 4dddbac1f7f3..ccee9ececa5a 100644 --- a/docs/i18n/az/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/az/docs/reference/FEATURE_FLAGS.md @@ -42,166 +42,165 @@ o, **aktiv** hesab edilir (`isFeatureFlagEnabled()` funksiyasına baxın). --- -## Bayraq Kataloqu +## Bayraqlar Kataloqu -6 kateqoriya üzrə 72 bayraq. **Standart dəyər** tərifdəki standart dəyərdir — -nə DB əvəzləməsi, nə də mühit dəyişəni mövcud olduqda istifadə edilən dəyərdir. +6 kateqoriya üzrə 74 bayraq. **Defolt** tərifdə göstərilən defolt dəyərdir — nə DB-də yenidən təyin edilmiş dəyər, nə də mühit dəyişəni mövcud olduqda istifadə edilən dəyərdir. ### Təhlükəsizlik (10) -| Açar | Növ | Standart | Təsvir | -| --------------------------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Bütün daxil olan sorğular üçün API açarı tələb edin. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Bütün sorğular üçün daxilolmaların təmizlənməsini aktivləşdirin. | -| `INJECTION_GUARD_MODE` | enum | `off` | Prompt inyeksiyasından qorunma rejimi. Dəyərlər: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Sorğulardakı PII məlumatlarını redaktə edin (`INPUT_SANITIZER_MODE` parametrindən asılı deyil). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Provayder cavablarındakı PII məlumatlarını təmizləyin. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | PII cavablarının təmizlənməsi rejimi. Dəyərlər: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Şəxsi/daxili IP diapazonlarına gedən çıxış sorğularını bloklayın. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Autentifikasiya edilmiş idarə paneli istifadəçilərinə yalnız maskalanmış dəyərləri görmək əvəzinə saxlanılan API açarlarını göstərməyə icazə verin. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | AUTH jurnal sətirlərinə hesab prefiksini daxil edin (məsələn, " hesabı istifadə edilir: abc12345..."). Hesab identifikatorlarının paylaşılan/çoxicarəçili proses jurnallarında redaktə edilməsi üçün standart olaraq deaktivdir. Debug Mode rejimindən asılı deyil; Debug Mode rejiminin dəyişdirilməsi bunu göstərmir. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | OIDC aktiv olduqda parolla girişi deaktiv edin ki, istifadəçilər yalnız OIDC Single Sign-On vasitəsilə autentifikasiya oluna bilsinlər. Deaktiv olduqda (standart), həm parolla giriş, həm də OIDC əlçatandır. | - -### Şəbəkə (15) - -| Açar | Növ | Standart | Yenidən başlatma | Təsvir | -| ----------------------------------------------- | ------- | -------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS barmaq izi gizlilik rejimini aktivləşdirin. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* marşrutlarına localhost xaricində yerləşdirilən OpenAI-uyğun provayder qovşaqlarından istifadə etməyə icazə verin. Defolt olaraq söndürülüb — audionun uzaq hosta yönləndirilməsi çıxış identikliyini dəyişir və operatorun açıq qərarı olmalıdır. Geri dövrə qovşaqlarına həmişə icazə verilir və onlar bundan təsirlənmir. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Bağlantıya proksi təyin edilmədikdə, reyestrdən işləyən ilk proksini avtomatik seçin. Defolt olaraq söndürülüb (əks halda reyestrdəki istənilən proksi qlobal ehtiyat variantına çevrilir — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Proksinin əlçatanlığının ilkin yoxlamaları uğursuz olduqda OAuth və provayder doğrulama axınlarının sabitlənmiş proksidən yan keçərək birbaşa qoşulmasına icazə verin. Çıxış IP-sini dəyişə biləcəyi üçün defolt olaraq söndürülüb. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Çoxhesablı rotasiya icraçısında şəbəkə istisnası (taym-aut, bağlantının rədd edilməsi/sıfırlanması) baş verdikdə və uğursuz hesabın ayrıca proksisi olmadıqda, hər birini yenidən sınamaq əvəzinə qısa soyuma müddəti tətbiq edin və sorğunun qalan hissəsində proksisiz digər hesabları ötürün. Defolt olaraq aktivdir (təhlükəsizdir: çıxış IP-si dəyişmir, yalnız ortaq çıxışlı hesablarda gecikmə/soyuma riskini azaldır). İlk proksisiz xəta atıldıqda dərhal ötürülməni bərpa etmək üçün söndürün. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proksi hovuzları və opencode-un hər hesab üzrə rotasiyası indicə uğursuz olmuş proksini (rədd edilmiş TCP yoxlaması və ya onun vasitəsilə alınmış 429) hər təkrarda ikiqat artan, yuxarı həddi olan prosesə xas müddət ərzində yenidən təqdim etmir. Proksi statusu yazılmır; bütün namizədlər kənara qoyulduqda seçim dəyişməz qalır. Defolt olaraq söndürülüb. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | İdarə panelində proksi hovuzunun altında son 24 saat ərzində onun üzvlərinə neçə müşahidə edilmiş çıxış IP-sinin xidmət göstərdiyini və neçə bağlantının onlardan istifadə etdiyini göstərin. Yalnız oxumaq üçündür, proksi jurnalından hesablanır və heç vaxt marşrutlaşdırma üçün istifadə edilmir. Defolt olaraq söndürülüb. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode icraçısı üçün axınla ötürülən Responses cavabının ilk gövdə baytını izləyin (pəncərə: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, defolt `15000`). Pəncərə keçənədək səssiz qalan 2xx Responses axını ilişmiş hesab edilir: hesab soyuma rejiminə keçirilir və sorğu bir dəfə növbəti hesaba yönləndirilir; ikinci ilişmə zamanı dərhal xəta qaytarılır. Defolt olaraq söndürülüb: ilişmiş axınlar axının hazır olma taym-autuna qədər hazırkı gözləməni davam etdirir. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode icraçısı: `user_blocked` rəddi daşıyan 403/451 halında (coğrafi məhdudiyyət və ya Cloudflare barmaq izi rəddi olmadıqda) rədd edilmiş hesabı soyuma rejiminə keçirin və hər sorğu üçün ən çox bir dəfə növbəti hesaba yönləndirin; ikinci rədd uğur işarəsi olmadan olduğu kimi qaytarılır. Defolt olaraq söndürülüb: yuxarı xidmətin istifadəçi blokunu dolanmaq yayınma kimi görünə və işarəni bütün hesab parkına yaya bilər. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode rotasiyası: yuxarı xidmətdə iki ardıcıl keçici nasazlıqdan (5xx və ya boş 400) sonra növbəti hesaba keçməzdən əvvəl fasilə verin — hər növbəti nasazlıqda ikiqat artan 1,5 san.; hər fasilə üçün maksimum 6 san. və hər sorğu üçün maksimum 10 san.; müştəri bağlantısı kəsildikdə ötürülür. Uğursuz cavabın gövdəsi gözləmədən əvvəl sərbəst buraxılır. Defolt olaraq söndürülüb: ehtiyat hesaba keçid dərhal baş verir. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode rotasiyası: real sürət limiti kimi təsnif edilən ilk 429-da (təhlil edilə bilən `Retry-After` və ya sürət/istifadə limitini bildirən gövdə) hesablar üzrə keçidi dayandırın və yuxarı xidmətdən gələn həmin 429-u dəyişdirmədən qaytarın. Təsnif edilməmiş 429-lar rotasiyanı davam etdirir. Defolt olaraq söndürülüb: pulsuz səviyyə hər çıxış IP-si üzrə məhdudlaşdırılıb (#9611), buna görə hər 429 rotasiyaya səbəb olur və tükənmiş keçid son yuxarı xidmət 429-unu qaytarır. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM proksisi üçün TLS sertifikatının doğrulanmasını söndürün. **Təhlükəlidir.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Şəxsi/daxili şəbəkələrə yönələn provayder URL-lərinə icazə verin. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Lokal/şəxsi ünvanlarda (127.0.0.1, localhost, LAN) provayderlərin əlavə edilməsinə/doğrulanmasına icazə verin. Defolt olaraq aktivdir (lokal üstünlüklü); yalnız ictimai ünvanlara icazə verən sərt bloklama üçün söndürün. Bulud metadata ünvanları bloklanmış qalır. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code ilə uyğun provayder rejimini aktivləşdirin. | +| Açar | Növ | Defolt | Təsvir | +| --------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | məntiqi | `false` | Bütün daxil olan sorğular üçün API açarı tələb edin. | +| `INPUT_SANITIZER_ENABLED` | məntiqi | `true` | Bütün sorğular üçün giriş məlumatlarının təmizlənməsini aktivləşdirin. | +| `INJECTION_GUARD_MODE` | enum | `off` | Prompt inyeksiyasından qorunma rejimi. Dəyərlər: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | məntiqi | `false` | Sorğulardan PII-ni redaktə edin (`INPUT_SANITIZER_MODE` parametrindən asılı olmayaraq). | +| `PII_RESPONSE_SANITIZATION` | məntiqi | `false` | Provayder cavablarından PII-ni təmizləyin. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | PII cavablarının təmizlənməsi rejimi. Dəyərlər: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | məntiqi | `true` | Özəl/daxili IP diapazonlarına gedən sorğuları bloklayın. | +| `ALLOW_API_KEY_REVEAL` | məntiqi | `false` | Autentifikasiyadan keçmiş idarə paneli istifadəçilərinə yalnız maskalanmış dəyərləri görmək əvəzinə saxlanılan API açarlarını göstərməyə icazə verin. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | məntiqi | `false` | AUTH jurnal sətirlərinə hesab prefiksini daxil edin (məsələn, " hesabından istifadə edilir: abc12345..."). Hesab identifikatorlarının paylaşılan/çoxicarəçili proses jurnallarında gizlədilməsi üçün defolt olaraq deaktivdir. Debug Mode-dan asılı deyil; Debug Mode-un dəyişdirilməsi bunu göstərmir. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | məntiqi | `false` | OIDC aktiv olduqda parolla girişi deaktiv edin ki, istifadəçilər yalnız OIDC Single Sign-On vasitəsilə autentifikasiya oluna bilsinlər. Deaktiv olduqda (defolt), həm parolla giriş, həm də OIDC mövcuddur. | + +### Şəbəkə (16) + +| Açar | Növ | Standart | Yenidən başlatma | Təsvir | +| ----------------------------------------------- | ------- | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS barmaq izi gizlətmə rejimini aktivləşdirin. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* marşrutlarına localhost xaricində yerləşdirilən OpenAI-uyğun provayder qovşaqlarından istifadə etməyə icazə verin. Standart olaraq deaktivdir — audionun uzaq hosta yönləndirilməsi çıxış identikliyini dəyişir və operatorun açıq qərarı olmalıdır. Loopback qovşaqlarına həmişə icazə verilir və onlar bundan təsirlənmir. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | POST /v1/rerank sorğusuna (və yaddaş mühərrikinin loopback üzrə yenidən sıralama addımına) localhost xaricində yerləşdirilən OpenAI-uyğun provayder qovşaqlarından istifadə etməyə icazə verin. Standart olaraq deaktivdir — uzaq hosta yönləndirmə çıxış identikliyini dəyişir və operatorun açıq qərarı olmalıdır. Loopback qovşaqlarına həmişə icazə verilir; uzaq qovşaqlar həmçinin provayderin xaricə çıxan URL siyasətindən keçməlidir. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Bağlantıya heç bir proksi təyin edilmədikdə, reyestrdən işlək olan ilk proksini avtomatik seçin. Standart olaraq deaktivdir (əks halda reyestrdəki istənilən proksi qlobal ehtiyat variantına çevrilir — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Proksiyə əlçatanlığın ilkin yoxlamaları uğursuz olduqda OAuth və provayder doğrulama axınlarının sabitlənmiş proksidən yan keçərək birbaşa qoşulmasına icazə verin. Bu, çıxış IP-sini dəyişə biləcəyi üçün standart olaraq deaktivdir. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Çoxhesablı rotasiya icraçısında şəbəkə istisnası (taymaut, bağlantının rədd edilməsi/sıfırlanması) baş verdikdə, uğursuz hesabın xüsusi proksisi yoxdursa, hər birini yenidən sınamaq əvəzinə qısa gözləmə müddəti tətbiq edin və sorğunun qalan hissəsi üçün proksisiz digər hesabları ötürün. Standart olaraq aktivdir (təhlükəsizdir: çıxış IP-si dəyişmir, yalnız ortaq çıxışlı hesablarda gecikmə/gözləmə müddəti riskini azaldır). İlk proksisiz xəta zamanı dərhal ötürülməni bərpa etmək üçün deaktiv edin. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proksi hovuzları və opencode-un hər hesab üzrə rotasiyası indicə uğursuz olmuş proksini (rədd edilmiş TCP yoxlaması və ya onun vasitəsilə alınmış 429) hər təkrarda ikiqat artan və yuxarı həddi olan proses üzrə müəyyən müddət ərzində yenidən təqdim etməyi dayandırır. Heç bir proksi statusu yazılmır; bütün namizədlər kənara qoyularsa, seçim dəyişməz qalır. Standart olaraq deaktivdir. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | İdarəetmə panelində proksi hovuzunun altında son 24 saat ərzində onun üzvlərinə neçə müşahidə edilmiş çıxış IP-sinin xidmət göstərdiyini və neçə bağlantının onlardan istifadə etdiyini göstərin. Yalnız oxumaq üçündür, proksi jurnalından hesablanır və heç vaxt yönləndirmə üçün istifadə edilmir. Standart olaraq deaktivdir. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode icraçısı üçün axınla ötürülən Responses cavabının ilk gövdə baytını izləyin (pəncərə: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, standart `15000`). Pəncərə müddətində səssiz qalan 2xx Responses axını dayanmış hesab edilir: hesaba gözləmə müddəti tətbiq olunur və sorğu bir dəfə növbəti hesaba keçirilir; ikinci dayanma zamanı dərhal xəta qaytarılır. Standart olaraq deaktivdir: dayanmış axınlar, axının hazırlıq taymautuna qədər mövcud gözləmə davranışını saxlayır. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode icraçısı: `user_blocked` imtinası ehtiva edən 403/451 cavabında (coğrafi məhdudiyyət və ya Cloudflare rəqəmsal izi ilə bağlı rədd cavabı olmadıqda) imtina edilmiş hesab üçün gözləmə müddəti tətbiq edin və hər sorğu üzrə ən çox bir dəfə növbəti hesaba keçin; ikinci imtina uğur işarəsi qoyulmadan olduğu kimi qaytarılır. Defolt olaraq deaktivdir: yuxarı axın istifadəçi blokunu yan keçən marşrutlaşdırma yayınma cəhdi kimi görünə və işarəni bütün hesablar parkına yaya bilər. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode rotasiyası: yuxarı axında ardıcıl iki müvəqqəti nasazlıqdan (5xx və ya boş 400) sonra növbəti hesaba keçməzdən əvvəl fasilə verin — 1,5 san.; hər sonrakı nasazlıqda ikiqat artır, hər fasilə üçün maksimum 6 san. və hər sorğu üçün maksimum 10 san. ilə məhdudlaşır, klient bağlantısı kəsildikdə buraxılır; uğursuz cavab gövdəsi gözləmədən əvvəl sərbəst buraxılır. Defolt olaraq deaktivdir: ehtiyat keçid dərhal həyata keçirilir. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode rotasiyası: real sürət limiti kimi təsnif edilən ilk 429 cavabında (təhlil edilə bilən `Retry-After` və ya sürət/istifadə limitini bildirən cavab gövdəsi) hesablar üzrə keçidi dayandırın və həmin yuxarı axın 429 cavabını dəyişmədən qaytarın. Təsnif edilməmiş 429 cavablarında rotasiya davam edir. Defolt olaraq deaktivdir: pulsuz səviyyə çıxış IP-si üzrə məhdudlaşdırılıb (#9611), buna görə hər 429 cavabı rotasiyaya səbəb olur və bütün hesablar tükəndikdə son yuxarı axın 429 cavabı qaytarılır. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM proksisi üçün TLS sertifikatının yoxlanmasını deaktiv edin. **Təhlükəlidir.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Şəxsi/daxili şəbəkələrə yönələn provayder URL-lərinə icazə verin. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Lokal/şəxsi ünvanlarda (127.0.0.1, localhost, LAN) provayderlərin əlavə edilməsinə/yoxlanmasına icazə verin. Defolt olaraq aktivdir (ilk növbədə lokal); yalnız ictimai ünvanlara icazə verən sərt bloklama üçün deaktiv edin. Bulud metadatası bloklanmış qalır. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code ilə uyğun provayder rejimini aktivləşdirin. | ### Siyasətlər (5) | Açar | Növ | Defolt | Təsvir | | ------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `TOOL_POLICY_MODE` | enum | `disabled` | Alətlərdən istifadə siyasətinin tətbiqi rejimi. Dəyərlər: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | İstifadə nümunələrinə əsasən sorğu tezliyi məhdudiyyətini avtomatik aktivləşdirin. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Birbaşa tək model sorğuları üçün OmniRoute-un lokal kontekst pəncərəsi / maksimum giriş tokeni yoxlamasını ötürün. Yuxarı səviyyə limitləri yenə də qüvvədədir. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Hədəf model tələb olunan imkanlara (görüntü, alətlər, strukturlaşdırılmış çıxış, kontekst pəncərəsi) malik olmadıqda sorğuları göndərilməzdən əvvəl rədd edin. Kombinasiya səviyyəsinin uyğunluq filtrindən yan keçən birbaşa tək provayder sorğularını qoruyur. | -| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar modulunu (kataloq lenti ekranları və sinxronizasiya) aktivləşdirin. Defolt olaraq söndürülüb; aktivləşdirmə yalnız istifadəçi interfeysini əlçatan edir — məlumatların sinxronizasiyası ayrıca seçimlə aktivləşdirilməlidir. | - -### İcra mühiti (32) - -| Açar | Növ | Standart | Yenidən başlatma | Təsvir | -| ------------------------------------------- | ------- | -------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Kombinə edilmiş marşrutlaşdırma modelləri dəyişdikdə söhbət xülasələrini yaradın və daxil edin. Model dəyişikliklərini müstəqil şəkildə emal etmək və bütün mövcud və gələcək kombinasiyalar üçün fonda ötürmə sorğularının qarşısını almaq məqsədilə deaktiv edin. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Müştərilərə yönləndirməzdən əvvəl Responses API-nin birbaşa ötürmə axınlarından daxili şərh mərhələsinin çıxış elementlərini silin. Emal edilməmiş yuxarı axın şərhlərini qəbul etmək üçün deaktiv edin. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | MCP alətlərinə girişdə əhatə dairəsi məhdudiyyətlərini tətbiq edin. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Token istifadəsini azaltmaq üçün MCP alətlərinin təsvirlərini sıxlaşdırın. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | İcra zamanı fon tapşırıqlarının emalını aktivləşdirin. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Bütün fon xidmətlərini (kvotanın yenilənməsi, sinxronizasiya və s.) deaktiv edin. | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Layihə səviyyəli RTK filtrlərinə yoxlama olmadan etibar edin. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | İdxal zamanı real vaxtlı idarə paneli WebSocket serverini başladın (standart olaraq port 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex-in Responses-over-WebSocket nəqliyyatından istifadə etməsinə icazə verin. Söndürüldükdə Codex HTTP Responses-a geri qayıdır. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex-in lokal app-server WebSocket JSON-RPC nəqliyyatından (`codexTransport=app-server`) istifadə etməsinə icazə verin. Söndürüldükdə app-server istifadəsini seçmiş bağlantılar Codex-in digər nəqliyyatlarına geri qayıdır. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Büdcəsi tükənmiş sorğuları fövqəladə pulsuz ehtiyat provayderə/modelə yönləndirin. (Aşağıdakı [Fövqəladə büdcə ehtiyatına](#emergency-budget-fallback) baxın.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Hər hansı cavab baytı müştəriyə çatmazdan əvvəl yarımçıq kəsilmiş yuxarı axın SSE axınları üçün şəffaf erkən təkrar cəhdi aktivləşdirin. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Baytlar artıq müştəriyə çatdıqdan sonra axının bərpasına cavabı yenidən sorğulamağa və birləşdirməyə icazə verin. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Axının ortasındakı davamı alət çağırışları üçün təhlükəsiz edin: alət çağırışı göndərildikdən sonra (icrada olduqda və ya `finish_reason` `tool_calls` ilə artıq tamamlandıqda) kəsilmiş axını heç vaxt davam etdirməyin və bütün büdcəni sərf etmək əvəzinə bir boş davamdan sonra bağlayın. Söndürülüb: buraxılış davranışı. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | SSE axını hər hansı faydalı kadr göndərmədən bağlandıqda və eyni bağlantı üzrə məhdud təkrar cəhd tükəndikdə bir dəfə paralel bağlantıya keçin; istifadə edilə bilən paralel bağlantı olmadıqda ilkin `STREAM_EARLY_EOF` 502 qaytarılır. Standart olaraq söndürülüb: eyni bağlantı üzrə təkrar cəhddən sonra erkən EOF son vəziyyət olaraq qalır. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` cavablarına göstərilmə üçün əlverişli ad sahələrini daxil edin. Yalnız model ID-lərini gözləyən müştərilər üçün deaktiv edin. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | /v1/models daxilində model ID-lərinə prefikslərin necə əlavə olunduğunu idarə edir. 'dual' (standart) geriyə uyğunluq üçün həm ləqəb, həm də kanonik provayder ID-si prefikslərini təqdim edir. 'alias' yalnız qısa ləqəb prefiksini təqdim edir (məsələn, deepseek-web/model deyil, ds-web/model). 'canonical' yalnız tam provayder ID-si prefiksini təqdim edir. Dəyərlər: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Model intellekti reytinqləri üçün Arena AI liderlər cədvəlinin dövri ELO sinxronizasiyasını aktivləşdirin. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Claude Code şlüzünün model aşkarlama siyahısında Claude olmayan modellərin göstərilməsi üçün `/v1/models` üzərində `claude//` güzgü ID-lərini elan edin. Üçsəviyyəli keçidin qlobal səviyyəsi (mühit dəyişəni idarə panelindəki alternativ parametri üstələyir). [Claude Code konfiqurasiyasına](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) baxın. | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// şlüz ləqəbləri üçün əsas keçid. Aktiv olduqda (standart): /v1/models uyğun olan və düşünmə qabiliyyətinə malik hər Claude modeli üçün düşünməsiz variant elan edir və sorğuda göndərilən no-think/ ID-si əsaslandırma basdırılmaqla yenidən həqiqi modelə uyğunlaşdırılır. Söndürüldükdə: heç bir variant elan edilmir və no-think/ ID-si digər naməlum model ID-ləri kimi emal olunur. Bu aktiv olduqda model üzrə ModelSpec.noThinkingAlias qoşulma/çıxma parametri yenə də tətbiq edilir. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | /v1/models kataloqunda düşünmə səviyyəsi variantlarının (məsələn, -low, -medium, -high) yaradılmasını deaktiv edin. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Provayderə göndəriş üçün hər icarəçiyə uyğunlaşan virtual qəbul zolaqlarını aktivləşdirin (#9654): bir icarəçinin sorğu sıçrayışı artıq digər icarəçidə 503 xətasına səbəb olmur. OMNIROUTE_CHAT_VIRTUAL_LANES mühit dəyişəni idarə panelindəki bu alternativ parametri üstələyir; dəyişikliklər server yenidən başladıldıqda qüvvəyə minir. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Kanonik sahibinin aktiv etimadnaməsi olmayan, lakin aktiv etimadnaməli birbaşa ötürmə şlüzü tərəfindən yönləndirilən modellər üçün /v1/models üzərində / güzgü ID-lərini elan edin. Xəbərdarlıq: qlobal olaraq aktivləşdirildikdə bütün müştərilər üçün kataloq qeydləri əlavə edir. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API aqreqatoru ilə uyğun qovşaqlar üçün balans aşkarlanmasını aktivləşdirin. Aktivləşdirildikdə aqreqator bayrağı təyin edilmiş uyğun qovşaqlar öz balanslarını idarə panelində və kvotanın ilkin yoxlanması marşrutlaşdırmasında bildirəcək. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Model müştərinin istifadə edə biləcəyi cavab qaytarana qədər axınsız, server tərəfindən idarə olunan alət çağırışlarını davam etdirin. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Axtarış statistikası və son axtarışlar yalnız hələ də aktiv bağlantısı olan provayderləri nəzərə alır (duckduckgo-free kimi açarsız provayderlər həmişə nəzərə alınır). Söndürüldükdə provayder ID-si olan bütün saxlanılmış axtarış sətirləri qorunur. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | İdarə panelindəki provayder səhifələri: Pulsuz nişanını yalnız provayderin dəstəklədiyi siqnallarda göstərin — sənədləşdirilmiş pulsuz səviyyəsi olmayan qeydiyyatdan keçmiş provayderlər üçün göstərilən ad evristikasını, boolean olmayan pulsuz sahələri və :free suffikslərini nəzərə almayın. Söndürüldükdə tarixi nişan qaydası saxlanılır. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Aqreqasiya edilmiş 429/503 əlçatmazlıq cavablarında konkret gələcək təkrar cəhd vaxtı məlum olmadıqda `Retry-After` başlığını (süni 1 saniyə əvəzinə) buraxın, `error.retry_after_provenance` (`signal` \| `none`) əlavə edin və kombinasiya boşaltma yollarına JSON və adi mətn formatlı yuxarı axın gövdələrindən mətn şəklində təkrar cəhd göstərişlərini oxumağa icazə verin. Sahə yalnız `unavailableResponse()` tərəfindən yaradılmış cavablarda görünür; digər 429/503 gövdələri dəyişməz qalır. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Yalnız kvota tükəndikdə ehtiyat kimi işarələnmiş `priority` kombinasiya hədəfi kvota ilə əlaqəli olmadığı sübut edilə bilən səbəbə görə (provayderin dövrə kəsicisi açıqdır, proqnozlaşdırılan gecikməyə görə keçid) kombinasiyanı dayandırdıqda kvotanı xatırladan 503 əvəzinə 502 cavabı verin. Bloklanma, soyuma müddəti, əlçatmazlıq, tükənmə və paralellik həddi ilə bağlı dayanmalar üçün 503 saxlanılır. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Əlavə məlumatı olmayan Mistral 401 (`{"detail":"Unauthorized"}`, açıq autentifikasiya siqnalı yoxdur) ləğv edilmiş açar və tükənmiş kvota üçün eynidir. Aktiv olduqda bağlantını `expired` kimi dayandırmaq əvəzinə soyuma rejiminə keçirir; hər bağlantı üçün saatda ən çox 3 dəfə. Növbəti hal onu dayandırır, beləliklə ləğv edilmiş açar yenə də son vəziyyətə çatır. Standart olaraq söndürülüb: əvvəlki kimi, əlavə məlumatı olmayan hər Mistral 401 bağlantını dayandırır. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Dondurulmuş statik başlanğıc dəsti əvəzinə OAuth daşıyıcı tokenindən istifadə etməklə `xai-oauth` bağlantıları üçün canlı xAI model kataloqunu `https://api.x.ai/v1/models` ünvanından əldə edin. Standart olaraq söndürülüb: `xai-oauth` statik başlanğıc dəstini dəyişmədən təqdim etməyə davam edir. İstənilən həlletmə xətasında aşkarlama başlanğıc dəstinə geri qayıdır (x.ai-nin bu son nöqtədə OAuth daşıyıcı tokenini qəbul edib-etmədiyi təsdiqlənməyib). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Avtomatik təmizləmə prosesinə `OMNIROUTE_BATCH_RETENTION_DAYS` müddətindən köhnə terminal vəziyyətli (tamamlanmış/uğursuz/ləğv edilmiş/vaxtı bitmiş) Batch API tapşırıqlarını, onların sətir üzrə yoxlama nöqtələri ilə birlikdə silməyə və öz `expires_at` vaxtını keçmiş yüklənmiş faylların BLOB məzmununu təmizləməyə icazə verin. Standart olaraq söndürülüb: operator aktivləşdirənədək hər mövcud quraşdırma bu məlumatları əvvəlki kimi saxlayır. Operator tərəfindən başladılan `DELETE /api/v1/batches/delete-completed` marşrutu hər iki halda təsirlənmir — bu, ayrıca və qeyd-şərtsiz ictimai API müqaviləsidir. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | İstifadə nümunələri əsasında sürət məhdudlaşdırmasını avtomatik aktivləşdirin. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Birbaşa tək modelli sorğular üçün OmniRoute-un lokal kontekst pəncərəsi / maksimum giriş tokeni yoxlamasını keçin. Yuxarı axın limitləri yenə də qüvvədədir. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Hədəf model tələb olunan imkanlara (görüntü, alətlər, strukturlaşdırılmış çıxış, kontekst pəncərəsi) malik olmadıqda sorğuları göndərilməzdən əvvəl rədd edin. Kombinasiya səviyyəsinin uyğunluq filtrindən yan keçən birbaşa tək provayderli sorğuları qoruyur. | +| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar modulunu (kataloq lenti ekranları və sinxronizasiya) aktivləşdirin. Defolt olaraq deaktivdir; aktivləşdirmə yalnız istifadəçi interfeysinin kilidini açır — məlumatların sinxronizasiyası üçün ayrıca razılıq tələb olunur. | + +### İcra mühiti (33) + +| Açar | Növ | Standart | Yenidən başlatma | Təsvir | +| ------------------------------------------- | ------- | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Kombinə edilmiş marşrutlaşdırma modelləri dəyişdikdə söhbət xülasələrini yaradın və əlavə edin. Model dəyişikliklərini müstəqil şəkildə idarə etmək və bütün mövcud və gələcək kombinasiyalar üçün arxa plan ötürmə sorğularının qarşısını almaq məqsədilə deaktiv edin. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Müştərilərə yönləndirməzdən əvvəl Responses API-nin birbaşa ötürmə axınlarından daxili şərh mərhələsinin çıxış elementlərini silin. İlkin yuxarı axın şərhlərini almaq üçün deaktiv edin. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | MCP alətlərinə giriş üçün əhatə dairəsi məhdudiyyətlərini tətbiq edin. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Token istifadəsini azaltmaq üçün MCP alətlərinin təsvirlərini sıxlaşdırın. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | İcra zamanı arxa plan tapşırıqlarının emalını aktivləşdirin. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Bütün arxa plan xidmətlərini (kvota yeniləməsi, sinxronizasiya və s.) deaktiv edin. | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Layihə səviyyəli RTK filtrlərinə doğrulama olmadan etibar edin. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | İdxal zamanı real vaxt rejimində idarə panelinin WebSocket serverini başladın (standart olaraq port 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex-in Responses-over-WebSocket nəqliyyatından istifadə etməsinə icazə verin. Söndürüləndə Codex HTTP Responses-a keçir. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex-in lokal app-server WebSocket JSON-RPC nəqliyyatından (codexTransport=app-server) istifadə etməsinə icazə verin. Söndürüləndə app-server istifadəsini seçmiş bağlantılar Codex-in digər nəqliyyatlarına keçir. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Büdcəsi tükənmiş sorğuları təcili pulsuz ehtiyat provayderə/modelə yönləndirin. (Aşağıdakı [Təcili Büdcə Ehtiyatı](#emergency-budget-fallback) bölməsinə baxın.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Hər hansı cavab baytı müştəriyə çatmazdan əvvəl yarımçıq kəsilmiş yuxarı axın SSE yayımları üçün şəffaf erkən təkrar cəhdi aktivləşdirin. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Baytlar artıq müştəriyə çatdıqdan sonra cavabı yenidən sorğulamaq və birləşdirmək üçün yayımın bərpasına icazə verin. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Yayımın ortasında davamı alət çağırışları üçün təhlükəsiz edin: alət çağırışı göndərildikdən sonra (icra mərhələsində və ya artıq finish_reason tool_calls ilə tamamlanmış olduqda) kəsilmiş yayımı heç vaxt davam etdirməyin və bütün büdcəni sərf etmək əvəzinə bir boş davamdan sonra bağlayın. Söndürülüb: buraxılış davranışı. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | SSE axını hər hansı faydalı freym ötürməzdən əvvəl bağlandıqda və eyni bağlantı üzrə məhdud təkrar cəhd tükəndikdə, əlaqəli bağlantıya bir dəfə keçidi təmin edir; istifadə edilə bilən əlaqəli bağlantı olmadıqda, ilkin `STREAM_EARLY_EOF` 502 xətası qaytarılır. Defolt olaraq deaktivdir: erkən EOF, eyni bağlantı üzrə təkrar cəhddən sonra son vəziyyət olaraq qalır. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` cavablarına göstərilməsi rahat olan ad sahələrini daxil edir. Yalnız model ID-lərini gözləyən klientlər üçün deaktiv edin. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | /v1/models daxilində model ID-lərinə prefikslərin necə əlavə olunduğunu idarə edir. 'dual' (defolt) geriyə uyğunluq üçün həm ləqəb, həm də kanonik provayder ID-si prefikslərini təqdim edir. 'alias' yalnız qısa ləqəb prefiksini təqdim edir (məsələn, deepseek-web/model deyil, ds-web/model). 'canonical' yalnız tam provayder ID-si prefiksini təqdim edir. Dəyərlər: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Modellərin intellekt reytinqləri üçün Arena AI liderlər cədvəlinin ELO göstəricilərinin dövri sinxronizasiyasını aktivləşdirir. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Claude Code şlüzünün model aşkarlama siyahısında Claude olmayan modelləri göstərməsi üçün `/v1/models` ünvanında `claude//` güzgü ID-lərini elan edir. Üçsəviyyəli idarəetmənin qlobal səviyyəsidir (mühit parametri idarəetmə panelindəki ayarı üstələyir). Baxın: [Claude Code konfiqurasiyası](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// şlüz ləqəbləri üçün əsas keçid. Aktiv olduqda (defolt): /v1/models uyğun olan, düşünmə qabiliyyətli hər Claude modeli üçün düşünməsiz variantı elan edir və sorğuda göndərilən no-think/ ID-si əsaslandırma söndürülməklə yenidən həqiqi modelə yönləndirilir. Deaktiv olduqda: heç bir variant elan edilmir və no-think/ ID-si hər hansı digər naməlum model ID-si kimi qəbul edilir. Bu aktiv olduğu müddətdə hər model üzrə ModelSpec.noThinkingAlias qoşulma/çıxma ayarı qüvvədə qalır. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | /v1/models kataloqunda düşünmə səviyyəsi variantlarının (məsələn, -low, -medium, -high) yaradılmasını deaktiv edir. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Provayderə yönləndirmə üçün hər icarəçiyə aid adaptiv virtual qəbul zolaqlarını aktivləşdirir (#9654): bir icarəçinin ani sorğu artımı artıq digər icarəçi üçün 503 xətasına səbəb olmur. OMNIROUTE_CHAT_VIRTUAL_LANES mühit dəyişəni idarəetmə panelindəki bu ayarı üstələyir; dəyişikliklər server yenidən başladıldıqda qüvvəyə minir. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Kanonik sahibinin aktiv etimadnaməsi olmadığı, lakin aktiv etimadnaməyə malik keçid şlüzünün yönləndirdiyi modellər üçün /v1/models ünvanında / güzgü identifikatorlarını elan edin. Xəbərdarlıq: qlobal olaraq aktivləşdirildikdə bütün müştərilər üçün kataloq qeydləri əlavə edir. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API aqreqatoru ilə uyğun qovşaqlar üçün balans aşkarlanmasını aktivləşdirin. Aktiv olduqda aqreqator bayrağı təyin edilmiş uyğun qovşaqlar öz balanslarını idarə panelində və kvotanın ilkin yoxlanışına əsaslanan yönləndirmədə göstərəcək. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Model müştərinin istifadə edə biləcəyi cavab qaytaranadək serverə məxsus axınsız alət çağırışlarını davam etdirin. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Axtarış statistikası və son axtarışlar yalnız hələ də aktiv bağlantısı olan provayderləri nəzərə alır (duckduckgo-free kimi açarsız provayderlər həmişə nəzərə alınır). Söndürülmüş vəziyyətdə provayder identifikatoru olan bütün saxlanılmış axtarış sətirləri qorunur. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | İdarə panelindəki provayder səhifələri: Pulsuz nişanını yalnız provayderin təsdiqlədiyi siqnallara əsasən göstərin — sənədləşdirilmiş pulsuz səviyyəsi olmayan qeydiyyatdan keçmiş provayderlər üçün göstərilən ada əsaslanan evristikanı, məntiqi tipdə olmayan pulsuz sahələri və :free şəkilçilərini nəzərə almır. Söndürülmüş vəziyyətdə əvvəlki nişan qaydası saxlanılır. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Aqreqasiya edilmiş 429/503 əlçatmazlıq cavablarında gələcək konkret təkrar cəhd vaxtı məlum olmadıqda sintetik 1 saniyə əvəzinə `Retry-After` başlığını buraxın, `error.retry_after_provenance` (`signal` \| `none`) əlavə edin və kombinasiya boşaltma yollarına JSON və adi mətn formatlı yuxarı axın gövdələrindən mətn şəklində təkrar cəhd ipuclarını oxumağa icazə verin. Sahə yalnız `unavailableResponse()` tərəfindən yaradılan cavablarda görünür; digər 429/503 gövdələri dəyişməz qalır. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Yalnız kvota tükəndikdə ehtiyat variant kimi işarələnmiş `priority` kombinasiya hədəfi kvota olmadığı sübuta yetirilə bilən səbəbdən (provayderin dövrəqıranı açıqdır, proqnozlaşdırıcı gecikmə səbəbilə keçilir) kombinasiyanı dayandırdıqda, kvotanı xatırladan 503 əvəzinə 502 cavabı verin. Kilidlənmə, gözləmə müddəti, əlçatmazlıq, tükənmə və paralellik həddi səbəbindən dayandırmalar üçün 503 saxlanılır. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Sadə Mistral 401 (`{"detail":"Unauthorized"}`, açıq autentifikasiya siqnalı olmadan) ləğv edilmiş açar və tükənmiş kvota üçün eynidir. Aktiv olduqda bağlantını `expired` kimi dayandırmaq əvəzinə hər bağlantı üzrə saatda ən çox 3 dəfə gözləmə rejiminə keçirir; növbəti hal onu dayandırır, beləliklə ləğv edilmiş açar yenə də son vəziyyətə yaxınlaşır. Defolt olaraq söndürülüb: hər sadə Mistral 401 əvvəlki kimi bağlantını dayandırır. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Dondurulmuş statik ilkin dəst əvəzinə, OAuth daşıyıcı tokenindən istifadə edərək `xai-oauth` bağlantıları üçün aktual xAI model kataloqunu `https://api.x.ai/v1/models` ünvanından əldə edin. Defolt olaraq deaktivdir: `xai-oauth` statik ilkin dəsti dəyişmədən təqdim etməyə davam edir. Hər hansı aşkarlama xətası baş verdikdə, aşkarlama ilkin dəstə geri qayıdır (x.ai saytının bu son nöqtədə OAuth daşıyıcı tokenini qəbul edib-etmədiyi təsdiqlənməyib). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Avtomatik təmizləmə prosesinə `OMNIROUTE_BATCH_RETENTION_DAYS` müddətindən daha köhnə olan yekun vəziyyətdəki (tamamlanmış/uğursuz/ləğv edilmiş/müddəti bitmiş) Batch API tapşırıqlarını onların hər sətir üzrə yoxlama nöqtələri ilə birlikdə silməyə və öz `expires_at` müddətini keçmiş yüklənmiş faylların BLOB məzmununu təmizləməyə icazə verin. Defolt olaraq deaktivdir: operator bunu aktivləşdirənədək hər bir mövcud quraşdırma bu məlumatları əvvəlki kimi saxlayır. Operator tərəfindən başladılan `DELETE /api/v1/batches/delete-completed` marşrutu hər iki halda bundan təsirlənmir — bu, ayrıca və şərtsiz ictimai API müqaviləsidir. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Seçilmiş Antigravity hesabını onu seçmiş sorğunun axın həyat dövrü üçün rezerv edin ki, paralel təkrar cəhd və ya giriş məlumatlarının ötürülməsi artıq icra olunan axına ayrılmış hesabı yenidən seçə bilməsin. Rezervasiya (bağlantı, çağırıla bilən yuxarı axın modeli) çərçivəsi ilə məhdudlaşır, buna görə də bir hesab eyni anda iki fərqli modelə xidmət göstərə bilər. Həmin model üçün bütün uyğun hesablar artıq rezerv edilibsə, sorğu məşğul hesaba əlavə yük yaratmaq əvəzinə məhdudlaşdırılmış `Retry-After` ilə strukturlaşdırılmış 503 `antigravity_pool_busy` cavabı qaytarır. Defolt olaraq deaktivdir: hesab seçimi əvvəlki kimi qalır və heç bir rezervasiya aparılmır. | ### CLI (5) -| Açar | Tip | Standart | Yenidən başlatma | Təsvir | -| ------------------------------------- | ------- | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Bütün CLI müştəriləri üçün uyğunluq rejimini aktivləşdirin. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Model ləqəbi uyğunluq qatını aktivləşdirin. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Qiymət məlumatlarının avtomatik sinxronizasiyasını aktivləşdirin (həmçinin `PRICING_SYNC_ENABLED` mühit dəyişəni tələb olunur). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Provayder modeli sinxronlaşdırıldıqdan sonra canlı kataloq əsasında ~/.codex/*.config.toml profil fayllarını avtomatik olaraq (yenidən) yazın. Aktiv/standart Codex konfiqurasiyasını heç vaxt dəyişmir. Standart olaraq deaktivdir. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Provayder modeli sinxronlaşdırıldıqdan sonra canlı kataloq əsasında ~/.claude/profiles//settings.json Claude Code profillərini avtomatik olaraq (yenidən) yazın. Aktiv/standart Claude konfiqurasiyasını heç vaxt dəyişmir. Standart olaraq deaktivdir. | +| Açar | Növ | Defolt | Yenidən başlatma | Təsvir | +| ------------------------------------- | ------- | ------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Bütün CLI müştəriləri üçün uyğunluq rejimini aktivləşdirin. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Model ləqəbi uyğunluq qatını aktivləşdirin. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Qiymət məlumatlarının avtomatik sinxronizasiyasını aktivləşdirin (həmçinin `PRICING_SYNC_ENABLED` mühit dəyişəni tələb olunur). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Provayder modelləri sinxronlaşdırıldıqdan sonra aktual kataloq əsasında ~/.codex/*.config.toml profil fayllarını avtomatik olaraq (yenidən) yazın. Aktiv/defolt Codex konfiqurasiyasını heç vaxt dəyişmir. Defolt olaraq deaktivdir. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Provayder modelləri sinxronlaşdırıldıqdan sonra aktual kataloq əsasında ~/.claude/profiles//settings.json Claude Code profillərini avtomatik olaraq (yenidən) yazın. Aktiv/defolt Claude konfiqurasiyasını heç vaxt dəyişmir. Defolt olaraq deaktivdir. | ### Sağlamlıq (5) -| Açar | Tip | Standart | Təsvir | -| ----------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Lokal instansiyanın sağlamlıq yoxlaması son nöqtəsini deaktivləşdirin. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Token doğrulaması sağlamlıq yoxlamasını deaktivləşdirin. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Bacarıqların sandbox mühitində şəbəkəyə çıxışı aktivləşdirin. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Proksi sağlamlığı yoxlamasında hədəfin rədd etdiyi sorğu (401/403/429) proksinin ardıcıl uğursuzluq seriyasını sıfırlayır. Standart olaraq deaktivdir: rədd cavabı neytral qalır (#10654). 5xx hər iki halda qeyri-müəyyən qalır; rədd cavabı proksini heç vaxt silmir, deaktiv etmir və ya yenidən aktivləşdirmir. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Başlanğıc DB bütövlük/sağlamlıq yoxlamasını tamamlanana qədər başlanğıcı bloklamaq əvəzinə, server sorğuları qəbul etməyə başladıqdan sonra (`setImmediate` vasitəsilə) işə salın (#13717). Standart olaraq deaktivdir: başlanğıc bu PR-dan əvvəl olduğu kimi bloklanır. | +| Açar | Tip | Standart | Təsvir | +| ----------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Lokal instansiyanın sağlamlıq yoxlaması son nöqtəsini deaktiv edir. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Token doğrulama sağlamlıq yoxlamasını deaktiv edir. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Bacarıqların sandbox mühitində şəbəkəyə çıxışı aktivləşdirir. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Proksi sağlamlığının dövri yoxlanışında hədəfin rədd etdiyi sorğu (401/403/429) proksinin ardıcıl uğursuzluqlar seriyasını sıfırlayır. Standart olaraq deaktivdir: rədd cavabı neytral qalır (#10654). 5xx hər iki halda qeyri-müəyyən qalır; rədd cavabı proksini heç vaxt silmir, deaktiv etmir və ya yenidən aktivləşdirmir. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Başlanğıc DB bütövlüyü/sağlamlıq yoxlamasını tamamlanana qədər başlanğıcı bloklamaq əvəzinə, server sorğuları qəbul etməyə başladıqdan sonra (`setImmediate` vasitəsilə) icra edir (#13717). Standart olaraq deaktivdir: başlanğıc bu PR-dan əvvəl olduğu kimi bloklanır. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` və onun köhnə ləqəbi -> `INJECTION_GUARD_BLOCK_THRESHOLD`, `INJECTION_GUARD_MODE` parametrinin -> `block` rejimini tənzimləyir, lakin bunlar +> `INPUT_SANITIZER_BLOCK_THRESHOLD` və onun köhnə alternativ adı +> `INJECTION_GUARD_BLOCK_THRESHOLD`, `INJECTION_GUARD_MODE` parametrinin `block` +> rejimini tənzimləyir, lakin bunlar > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> tərəfindən oxunan adi mühit dəyişənləridir, funksiya bayraqları deyil: onların DB üzərindən -> əvəzlənməsi və idarəetmə panelində keçid düyməsi yoxdur. Baxın: +> tərəfindən oxunan adi mühit dəyişənləridir, funksiya bayraqları deyil: onların DB əvəzləməsi və idarə panelində keçidi yoxdur. Baxın: > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> `Yenidən başlatma` sütunu `requiresRestart: true` olan bayraqları göstərir — dəyər -> dərhal saxlanılır, lakin yalnız proses yenidən yükləndikdən sonra qüvvəyə minir. Enum -> bayraqları icazə verilən çoxluqdan kənar istənilən dəyəri rədd edir (həm -> `setFeatureFlagOverride()`, həm də REST `PUT` işləyicisində server tərəfində -> doğrulanır). +> `Restart` sütunu `requiresRestart: true` olan bayraqları göstərir — dəyər +> dərhal yadda saxlanılır, lakin yalnız proses yenidən yükləndikdən sonra qüvvəyə minir. Enum +> bayraqları icazə verilən çoxluğa daxil olmayan istənilən dəyəri rədd edir (həm +> `setFeatureFlagOverride()`, həm də REST `PUT` emalçısında server tərəfində doğrulanır). --- -## Bayraqların dəyişdirilməsi +## Bayraqların Dəyişdirilməsi -### İdarəetmə paneli +### İdarəetmə Paneli -**İdarəetmə paneli → Parametrlər → Funksiya bayraqları** bölməsinə keçin +**İdarəetmə Paneli → Parametrlər → Funksiya Bayraqları** bölməsinə keçin (`/dashboard/settings/feature-flags`). Cədvəl (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) aşağıdakıları dəstəkləyir: -- Açar və ya təsvir üzrə **axtarış**, həmçinin kateqoriya üzrə **filtrləmə** (əlavə olaraq sintetik - **Yenidən başlatma tələb edir** görünüşü). -- Boolean bayraqları üçün **keçid**, enum bayraqları üçün isə **açılan siyahı** +- Açar və ya təsvir üzrə **axtarış**, eləcə də kateqoriya üzrə **filtrləmə** (əlavə olaraq sintetik + **Yenidən Başlatma Tələb Edir** görünüşü). +- Məntiqi bayraqlar üçün **keçid**, enum bayraqları üçün isə **açılan siyahı** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - Hər bayraq üçün effektiv dəyərin haradan gəldiyini göstərən **mənbə nişanı** — `DB`, `ENV` və ya `DEF`. - Əvəzləməni silmək üçün **Sıfırla** düyməsi (yalnız mənbəyi `DB` olan bayraqlar üçün göstərilir) - və aşağı hissədə **Bütün əvəzləmələri sıfırla** düyməsi. -- `requiresRestart` bayrağı dəyişdirildikdə **Serveri yenidən başladın** banneri. + və aşağı hissədə **Bütün Əvəzləmələri Sıfırla** düyməsi. +- `requiresRestart` bayrağı dəyişdirildikdə **Serveri Yenidən Başlat** banneri. ### REST API Bütün əməliyyatlar vahid marşrut vasitəsilə həyata keçirilir: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Hər metod autentifikasiya edilmiş idarəetmə paneli sessiyası tələb edir (əks halda `401`). +Hər bir metod autentifikasiya edilmiş idarəetmə paneli sessiyası tələb edir (əks halda `401`). #### `GET /api/settings/feature-flags` -Hər bir bayrağı effektiv dəyəri, mənbəyi və xülasəsi ilə birlikdə qaytarır. +Hər bir bayrağı onun effektiv dəyəri, mənbəyi və xülasəsi ilə qaytarır. ```jsonc { "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Require API Key", - "description": "Require an API key for all incoming requests", + "label": "API Açarı Tələb Et", + "description": "Bütün daxil olan sorğular üçün API açarı tələb et", "category": "security", "type": "boolean", "enumValues": null, @@ -211,7 +210,7 @@ Hər bir bayrağı effektiv dəyəri, mənbəyi və xülasəsi ilə birlikdə qa "requiresRestart": false, "warningLevel": "caution", }, - // ... bütün 72 bayraq + // ... bütün 74 bayraq ], "summary": { "total": 56, @@ -225,34 +224,34 @@ Hər bir bayrağı effektiv dəyəri, mənbəyi və xülasəsi ilə birlikdə qa #### `PUT /api/settings/feature-flags` -Tək bir əvəzləməni təyin edir və ya silir. Gövdə: `{ key: string; value?: string }`. +Tək bir əvəzləməni təyin edir və ya silir. Sorğu gövdəsi: `{ key: string; value?: string }`. `value` buraxıldıqda əvəzləmə silinir (env / standart dəyər bərpa olunur). ```bash -# DB əvəzləməsini təyin edin +# DB əvəzləməsini təyin et curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Əvəzləməni silin ("value" olmadan) +# Əvəzləməni sil ("value" yoxdur) curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` Cavab yeni `effectiveValue`/`source`, əvvəlki `previousValue`/ -`previousSource` və `requiresRestart` dəyərlərini qaytarır. Naməlum açarlar və diapazondan kənar enum +`previousSource` və `requiresRestart` dəyərlərini qaytarır. Naməlum açarlar və icazə verilən diapazondan kənar enum dəyərləri `400` xətası ilə rədd edilir. #### `DELETE /api/settings/feature-flags` -Bütün DB əvəzləmələrini bir dəfəyə təmizləyərək hər bir bayrağın env / standart -dəyərini bərpa edir. `{ cleared: , message: "..." }` qaytarır. +Bütün DB əvəzləmələrini bir dəfəyə təmizləyərək hər bir bayrağı onun env / standart +dəyərinə qaytarır. `{ cleared: , message: "..." }` qaytarır. > [!NOTE] > `requiresRestart: true` olan bayraqlar yalnız proses yenidən yükləndikdən sonra qüvvəyə minir. -> İdarəetmə panelinin yenidən başlatma axını `POST /api/restart` çağırır və sonra server yenidən əlçatan olana qədər -> `GET /api/health/ping` sorğusunu təkrarlayır. +> İdarəetmə panelinin yenidən başlatma axını `POST /api/restart` çağırır və sonra server yenidən işlək vəziyyətə gələnədək +> `GET /api/health/ping` sorğusunu təkrar göndərir. --- diff --git a/docs/i18n/az/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/az/docs/reference/PROVIDER_REFERENCE.md index caa325da8e43..35f8078a924a 100644 --- a/docs/i18n/az/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/az/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > **Avtomatik yaradılıb**: `src/shared/constants/providers.ts` faylından — əl ilə redaktə etməyin. > Yenidən yaratmaq üçün: `npm run gen:provider-reference` -> **Son yaradılma tarixi:** 2026-09-17 +> **Son yaradılma tarixi:** 2026-09-18 -Provayderlərin ümumi sayı: **359**. Aşağıda kateqoriyalar üzrə bölgüyə baxın. +Ümumi provayder sayı: **359**. Aşağıdakı kateqoriyalar üzrə bölgüyə baxın. ## Kateqoriyalar @@ -34,47 +34,47 @@ Hər bir provayderi aktivləşdirmək, konfiqurasiya etmək və sınaqdan keçir ## Autentifikasiya tələb etməyən provayderlər (açar tələb olunmur) (10) -| ID | Ləqəb | Ad | Teqlər | Veb-sayt | Qeydlər | Alət çağırışı | -| ----------------------- | ---------- | ------------------------- | ------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -| `aihorde` | `horde` | AI Horde | Autentifikasiya tələb olunmur | [keçid](https://aihorde.net) | API açarı tələb olunmur — AI Horde-un sənədləşdirilmiş anonim açarından istifadə edir. Pulsuz aihorde.net açarının əlavə edilməsi istəyə bağlıdır və yalnız növbədə daha yüksək prioritet (kudos) təmin edir. | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Autentifikasiya tələb olunmur | [keçid](https://augmentcode.com) | OmniRoute tərəfindən heç bir API açarı saxlanılmır. Auggie CLI-ni quraşdırın və bu maşında `auggie login` əmrini icra edin; bundan sonra OmniRoute hər sorğu üçün onu lokal olaraq işə salır. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Autentifikasiya tələb olunmur | [keçid](https://playground.ai.cloudflare.com) | Heç bir giriş məlumatı tələb olunmur — əks mühəndisliklə təhlil edilmiş cf_agent WebSocket protokolu (Playwright nəqli) üzərindən anonim brauzer sessiyalarından istifadə edir. | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Autentifikasiya tələb olunmur | [keçid](https://developers.openai.com/codex/cli) | OmniRoute tərəfindən heç bir token saxlanılmır. Codex CLI app-server öz ChatGPT girişini (~/.codex/auth.json, avtomatik yenilənir) idarə edir. CLI hələ autentifikasiya edilməyibsə, “ChatGPT ilə daxil olun” seçimindən istifadə edin. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Autentifikasiya tələb olunmur | [keçid](https://docs.devin.ai/work-with-devin/devin-cli) | Autentifikasiya rəsmi Devin CLI tərəfindən onun təcrid olunmuş körpü həcmində idarə edilir. | emulyasiya edilir | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Autentifikasiya tələb olunmur | [keçid](https://duckduckgo.com/duckchat) | Heç bir giriş məlumatı tələb olunmur — DuckDuckGo AI Chat anonim və pulsuzdur. | emulyasiya edilir | -| `opencode` | `oc` | OpenCode Free | Autentifikasiya tələb olunmur | [keçid](https://opencode.ai) | API açarı tələb olunmur — OpenCode-un ictimai pulsuz son nöqtəsindən istifadə edir. | — | -| `uncloseai` | `unc` | UncloseAI | Autentifikasiya tələb olunmur | [keçid](https://uncloseai.com) | Autentifikasiya tələb olunmur. API identifikasiya üçün boş olmayan istənilən sətri açar kimi qəbul edir. Daha köhnə daxili modellər 404 xətası qaytararsa, Mövcud Modellər → /models-dən İdxal və ya Avtomatik Sinxronizasiya seçimindən istifadə edin; işlədiyi təsdiqlənmiş model: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Autentifikasiya tələb olunmur, video | [keçid](https://veoaifree.com) | Autentifikasiya tələb olunmur. Sorğu sayı hər IP üçün saatda 6 sorğu ilə məhdudlaşdırılıb. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Autentifikasiya tələb olunmur | [keçid](https://zcode.z.ai) | OmniRoute tərəfindən heç bir API açarı saxlanılmır. Lokal ZCode app-server mövcud builtin:zai-coding-plan girişindən istifadə edir. | — | +| ID | Ləqəb | Ad | Teqlər | Veb-sayt | Qeydlər | Alət çağırışı | +| ----------------------- | ---------- | ------------------------- | ------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------- | +| `aihorde` | `horde` | AI Horde | Autentifikasiya tələb olunmur | [keçid](https://aihorde.net) | API açarı tələb olunmur — AI Horde-un sənədləşdirilmiş anonim açarından istifadə edir. Pulsuz aihorde.net açarı əlavə etmək istəyə bağlıdır və yalnız növbədə daha yüksək prioritet (kudos) təmin edir. | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Autentifikasiya tələb olunmur | [keçid](https://augmentcode.com) | OmniRoute tərəfindən heç bir API açarı saxlanılmır. Auggie CLI-ni quraşdırın və bu maşında `auggie login` əmrini icra edin; bundan sonra OmniRoute hər sorğu üçün onu lokal olaraq işə salır. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Autentifikasiya tələb olunmur | [keçid](https://playground.ai.cloudflare.com) | Heç bir giriş məlumatı tələb olunmur — əks mühəndisliklə təhlil edilmiş cf_agent WebSocket protokolu üzərindən anonim brauzer sessiyalarından istifadə edir (Playwright nəqli). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Autentifikasiya tələb olunmur | [keçid](https://developers.openai.com/codex/cli) | OmniRoute tərəfindən heç bir token saxlanılmır. Codex CLI app-server öz ChatGPT girişini idarə edir (~/.codex/auth.json, avtomatik yenilənir). CLI hələ autentifikasiyadan keçməyibsə, “ChatGPT ilə daxil ol” seçimindən istifadə edin. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Autentifikasiya tələb olunmur | [keçid](https://docs.devin.ai/work-with-devin/devin-cli) | Autentifikasiya rəsmi Devin CLI tərəfindən öz təcrid olunmuş körpü həcmində idarə edilir. | emulyasiya edilir | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Autentifikasiya tələb olunmur | [keçid](https://duckduckgo.com/duckchat) | Heç bir giriş məlumatı tələb olunmur — DuckDuckGo AI Chat anonim və pulsuzdur. | emulyasiya edilir | +| `opencode` | `oc` | OpenCode Free | Autentifikasiya tələb olunmur | [keçid](https://opencode.ai) | API açarı tələb olunmur — OpenCode-un açıq pulsuz son nöqtəsindən istifadə edir. | — | +| `uncloseai` | `unc` | UncloseAI | Autentifikasiya tələb olunmur | [keçid](https://uncloseai.com) | Autentifikasiya tələb olunmur. API identifikasiya üçün istənilən boş olmayan sətri açar kimi qəbul edir. Köhnə daxili modellər 404 xətası qaytararsa, Mövcud Modellər → /models-dən İdxal və ya Avtomatik Sinxronizasiya seçimindən istifadə edin; işlədiyi təsdiqlənmiş model: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Autentifikasiya tələb olunmur, video | [keçid](https://veoaifree.com) | Autentifikasiya tələb olunmur. Hər IP üçün saatda 6 sorğu ilə məhdudlaşdırılır. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Autentifikasiya tələb olunmur | [keçid](https://zcode.z.ai) | OmniRoute tərəfindən heç bir API açarı saxlanılmır. Lokal ZCode app-server mövcud builtin:zai-coding-plan girişindən istifadə edir. | — | ## OAuth Provayderləri (24) -| ID | Ləqəb | Ad | Teqlər | Veb-sayt | Qeydlər | -| --------------- | ------------- | ------------------------- | ------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `agy` | `agy` | Antigravity CLI | OAuth | [keçid](https://antigravity.google) | Antigravity CLI (`agy`) girişinizi idxal edin (token faylını yapışdırın/yükləyin), lokal CLI girişini avtomatik aşkarlayın və ya Google ilə daxil olun. Antigravity backend-indən (Claude modelləri daxil olmaqla) ortaq istifadə edir. | -| `amazon-q` | `aq` | Amazon Q | OAuth | [keçid](https://aws.amazon.com/q/developer/) | Kiro ilə eyni AWS Builder ID və ya idxal edilmiş yeniləmə tokeni axınından istifadə edir, lakin Amazon Q bağlantılarını ayrıca saxlayır. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [keçid](https://cline.bot/cline-pass) | ClinePass, 10 açıq kodlaşdırma modelini birləşdirən, Cline-a məxsus aylıq $9.99 abunəlikdir. Cline hesabınızla (Cline CLI/IDE ilə eyni giriş) daxil olun və ya birbaşa ClinePass API açarını yapışdırın (app.cline.bot → Parametrlər → API Açarları). ClinePass abunəliyi cline-pass/* modellərini aktivləşdirir. Cline WorkOS OAuth axınından təkrar istifadə edir. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [keçid](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Rəsmi CLI cihaz kodu axını ilə daxil olun və ya birbaşa API açarını yapışdırın (Authorization: Bearer kimi göndərilir). Kataloq: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [keçid](https://cli.devin.ai) | Devin CLI binar faylı tələb olunur. Autentifikasiya etmək üçün `devin auth login` əmrini işə salın və ya WINDSURF_API_KEY təqdim edin. Quraşdırma: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [keçid](https://devin.ai) | Autentifikasiya edilmiş Devin sessiyasından mövcud Devin API açarını yapışdırın. Açarın ixrac imkanları və addımları Devin versiyasına və hesaba görə dəyişir. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Provayder parametrlərində GHE instansiyanızın URL-ni (məs., https://ghe.company.com) daxil edin, sonra cihaz axını vasitəsilə autentifikasiya edin. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [keçid](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth konfiqurasiya edilməyib. https://gitlab.com/-/profile/applications ünvanında yönləndirmə URI-si http://localhost:20128/callback və "ai_features read_user" əhatə dairələri ilə OAuth tətbiqi qeydiyyatdan keçirin, sonra GITLAB_DUO_OAUTH_CLIENT_ID (və istəyə bağlı olaraq GITLAB_DUO_OAUTH_CLIENT_SECRET) təyin edib yenidən başladın. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Brauzerinizlə daxil olun və ya Grok Build CLI-dan ~/.grok/auth.json faylınızı (yaxud JWT giriş tokenini) yapışdırın; hər iki halda refresh_token avtomatik rotasiya olunur. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [keçid](https://www.kimi.com/code?aff=omniroute) | Kimi Code CLI tərəfindən istifadə edilən eyni Kimi hesabı ilə daxil olun. OmniRoute CLI OAuth axınından və Kimi Coding Plan endpoint-lərindən istifadə edir. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Pulsuz səviyyə: ayda 50 kredit (~25K–100K token). ⚠️ Kiro istifadə şərtləri üçüncü tərəf proksi/harness istifadəsini qadağan edir. | -| `openference` | `of` | Openference | OAuth | [keçid](https://openference.com) | Sorğuları api.openference.com üzərindən yönləndirmək üçün Openference hesabınızla daxil olun. İnferensiya üçün aktiv plan tələb olunur — OAuth autentifikasiya edə bilər, lakin plan olmadan 402 xətası qaytara bilər. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [keçid](https://trae.ai) | Trae, ByteDance tərəfindən hazırlanmış süni intellekt əsaslı IDE-dir (SOLO uzaq agenti). Açılan pəncərədə trae.ai vasitəsilə icazə verin və ya solo.trae.ai saytına daxil olaraq Cloud-IDE-JWT-ni (giriş tokeni kimi 'Authorization: Cloud-IDE-JWT ' formatında göndərilir, istifadə müddəti təxminən 14 gündür) yapışdırın; web_id/biz_user_id/user_unique_id/scope/tenant/region providerSpecificData vasitəsilə ötürülür. Yapışdırılmış tokenlər üçün başlıqsız yeniləmə yoxdur — istifadə müddəti bitdikdə yenidən yapışdırın. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [keçid](https://x.ai) | Grok 4.5 kimi api.x.ai modellərindən istifadə etmək üçün xAI ilə daxil olun. Bu, cli-chat-proxy.grok.com və grok-build model ləqəblərindən istifadə edən Grok Build JWT sessiyalarından ayrıdır. | -| `zed` | `zd` | Zed IDE | OAuth | [keçid](https://zed.dev) | Zed LLM provayderlərinin giriş məlumatlarını (OpenAI, Anthropic, Google, Mistral, xAI) əməliyyat sisteminin açarlar zəncirində saxlayır. Onları avtomatik aşkar edib idxal etmək üçün aşağıdakı İdxal düyməsindən istifadə edin. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [keçid](https://zed.dev) | Zed hesabınızla daxil olun (yerli tətbiq girişi). OmniRoute birdəfəlik RSA açar cütü yaradır və onu avtorizasiya etmək üçün zed.dev saytını açır — uzaq/başlıqsız quraşdırmada brauzerinizin ünvan sətrindən əldə edilən 127.0.0.1 geri çağırış URL-ni kopyalayıb buraya yapışdırın. Bu, yuxarıdakı 'Zed IDE' giriş məlumatlarının idxalı qeydindən fərqlidir: bu seçim Zed planınız çərçivəsində Anthropic/OpenAI/Google/xAI modellərini təqdim edən, Zed-in öz hostinq edilən model aqreqatoru (cloud.zed.dev) vasitəsilə çat tamamlamalarını proksiləyir. | +| ID | Ləqəb | Ad | Teqlər | Veb-sayt | Qeydlər | +| --------------- | ------------- | ------------------------- | ------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [keçid](https://antigravity.google) | Antigravity CLI (`agy`) girişinizi idxal edin (token faylını yapışdırın/yükləyin), lokal CLI girişini avtomatik aşkarlayın və ya Google ilə daxil olun. Antigravity backend-indən (Claude modelləri daxil olmaqla) ortaq istifadə edir. | +| `amazon-q` | `aq` | Amazon Q | OAuth | [keçid](https://aws.amazon.com/q/developer/) | Kiro ilə eyni AWS Builder ID və ya idxal edilmiş yeniləmə tokeni axınından istifadə edir, lakin Amazon Q bağlantılarını ayrı saxlayır. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [keçid](https://cline.bot/cline-pass) | ClinePass, 10 açıq kodlaşdırma modelini birləşdirən aylıq $9.99 dəyərində Cline abunəliyidir. Cline hesabınızla (Cline CLI/IDE ilə eyni giriş) daxil olun və ya birbaşa ClinePass API açarını yapışdırın (app.cline.bot → Parametrlər → API Açarları). ClinePass abunəliyi cline-pass/* modellərini istifadəyə açır. Cline WorkOS OAuth axınından təkrar istifadə edir. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [keçid](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Rəsmi CLI cihaz kodu axını vasitəsilə daxil olun və ya birbaşa API açarını yapışdırın (Authorization: Bearer kimi göndərilir). Kataloq: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [keçid](https://cli.devin.ai) | Devin CLI binar faylı tələb olunur. Autentifikasiya üçün `devin auth login` əmrini icra edin və ya WINDSURF_API_KEY təqdim edin. Quraşdırma: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [keçid](https://devin.ai) | Autentifikasiya edilmiş Devin sessiyasından mövcud Devin API açarını yapışdırın. Açarın ixrac imkanları və addımları Devin versiyasına və hesaba görə dəyişir. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Provayder parametrlərində GHE instansiyanızın URL-ni (məsələn, https://ghe.company.com) daxil edin, sonra cihaz axını vasitəsilə autentifikasiya edin. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [keçid](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth konfiqurasiya edilməyib. https://gitlab.com/-/profile/applications ünvanında yönləndirmə URI-si kimi http://localhost:20128/callback və əhatə dairələri kimi "ai_features read_user" göstərərək OAuth tətbiqini qeydiyyatdan keçirin, sonra GITLAB_DUO_OAUTH_CLIENT_ID (və istəyə görə GITLAB_DUO_OAUTH_CLIENT_SECRET) təyin edib yenidən başladın. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Brauzerinizlə daxil olun və ya Grok Build CLI-dən ~/.grok/auth.json faylınızı (yaxud JWT giriş tokenini) yapışdırın; hər iki halda refresh_token avtomatik rotasiya olunur. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [keçid](https://www.kimi.com/code?aff=omniroute) | Kimi Code CLI tərəfindən istifadə olunan eyni Kimi hesabı ilə daxil olun. OmniRoute CLI OAuth axınından və Kimi Coding Plan son nöqtələrindən istifadə edir. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Pulsuz səviyyə: ayda 50 kredit (~25K–100K token). ⚠️ Kiro ToS üçüncü tərəf proksi/sınaq infrastrukturu istifadəsini qadağan edir. | +| `openference` | `of` | Openference | OAuth | [keçid](https://openference.com) | Sorğuları api.openference.com vasitəsilə yönləndirmək üçün Openference hesabınızla daxil olun. Qwen3.8 27b və Llama 3.2 3B modellərinə pulsuz səviyyəli giriş daxildir — cari plan şərtləri üçün openference.com/pricing səhifəsinə baxın. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [keçid](https://trae.ai) | Trae, ByteDance tərəfindən hazırlanmış süni intellekt əsaslı IDE-dir (SOLO uzaq agenti). Açılan pəncərədə trae.ai vasitəsilə icazə verin və ya solo.trae.ai ünvanında daxil olub Cloud-IDE-JWT-ni (giriş tokeni kimi 'Authorization: Cloud-IDE-JWT ' formatında göndərilir, etibarlılıq müddəti təxminən 14 gündür) yapışdırın; web_id/biz_user_id/user_unique_id/scope/tenant/region məlumatları providerSpecificData vasitəsilə ötürülür. Yapışdırılmış tokenlər üçün başlıqsız yeniləmə yoxdur — müddəti bitdikdə yenidən yapışdırın. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [keçid](https://x.ai) | Grok 4.5 kimi api.x.ai modellərindən istifadə etmək üçün xAI ilə daxil olun. Bu, cli-chat-proxy.grok.com və grok-build model ləqəblərindən istifadə edən Grok Build JWT sessiyalarından ayrıdır. | +| `zed` | `zd` | Zed IDE | OAuth | [keçid](https://zed.dev) | Zed LLM provayderlərinin giriş məlumatlarını (OpenAI, Anthropic, Google, Mistral, xAI) əməliyyat sisteminin açar zəncirində saxlayır. Onları avtomatik aşkarlayıb idxal etmək üçün aşağıdakı İdxal düyməsindən istifadə edin. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [keçid](https://zed.dev) | Zed hesabınızla daxil olun (yerli tətbiq vasitəsilə giriş). OmniRoute birdəfəlik RSA açar cütü yaradır və ona icazə vermək üçün zed.dev saytını açır — uzaq/başlıqsız quraşdırmada brauzerinizin ünvan sətrindən əldə edilən 127.0.0.1 geri çağırış URL-ni kopyalayıb buraya yapışdırın. Yuxarıdakı 'Zed IDE' giriş məlumatlarının idxalı elementindən fərqlidir: bu, Zed planınız çərçivəsində Anthropic/OpenAI/Google/xAI modellərini təqdim etməklə, söhbət tamamlamalarını Zed-in öz host edilən model aqreqatoru (cloud.zed.dev) vasitəsilə proksiləyir. | ## Veb kuki provayderləri (34) @@ -117,250 +117,250 @@ Hər bir provayderi aktivləşdirmək, konfiqurasiya etmək və sınaqdan keçir ## API Açarı Təminatçıları (ödənişli / pulsuz kreditlərlə ödənişli) (242) -| ID | Alias | Ad | Teqlər | Veb-sayt | Qeydlər | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API açarı | [keçid](https://ai.360.cn) | API açarını ai.360.cn saytından əldə edin | -| `agentrouter` | `agentrouter` | AgentRouter | API açarı, aqreqator | [keçid](https://agentrouter.org) | Qeydiyyat zamanı $200 pulsuz kredit — çoxmodelli marşrutlaşdırma şlüzü | -| `agnes` | `agnes` | Agnes AI | API açarı, video | [keçid](https://agnes-ai.com) | API açarını agnes-ai.com saytından əldə edin | -| `agnes-cn` | `agnescn` | Agnes AI (Çin) | API açarı | [keçid](https://api.agnes-ai.cn) | API açarını Agnes CN saytından əldə edin. | -| `ai21` | `ai21` | AI21 Labs | API açarı | [keçid](https://www.ai21.com) | Qeydiyyat zamanı $10 sınaq krediti (3 ay etibarlıdır), kredit kartı tələb olunmur | -| `aimlapi` | `aiml` | AI/ML API | API açarı, aqreqator | [keçid](https://aimlapi.com) | Pulsuz səviyyə dayandırılıb (2026) — AI/ML API indi yalnız istifadəyə görə ödənişlidir (minimum $20 balans artırılması); dövri pulsuz kreditlər yoxdur. | -| `ainative` | `ainative` | AINative Studio | API açarı | [keçid](https://ainative.studio) | ainative.studio saytında pulsuz API açarı yaradın (kart tələb olunmur), sonra onu buraya Bearer tokeni kimi yapışdırın. | -| `aion` | `aion` | Aion Labs | API açarı | [keçid](https://www.aionlabs.ai) | aionlabs.ai saytında pulsuz API açarı yaradın (kart tələb olunmur), sonra onu buraya Bearer tokeni kimi yapışdırın. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API açarı | [keçid](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Çin) | API açarı | [keçid](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API açarı | [keçid](https://developer.ant-ling.com/en/docs/) | Ant Ling API konsolunda (https://chat.ant-ling.com/open) qeydiyyatdan keçib API açarı yaradın, sonra onu buraya yapışdırın. OmniRoute çat trafikini https://api.ant-ling.com/v1/chat/completions ünvanına yönləndirir; provayder OpenAI ilə uyğundur və həmçinin Anthropic ilə uyğun interfeys təqdim edir. | -| `anthropic` | `anthropic` | Anthropic | API açarı | [keçid](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API açarı, aqreqator | [keçid](https://anyapi.ai) | Pulsuz plan: uyğun Free/Basic modelləri üçün gündə 100,000 ANY Token və 100 RPM; kredit kartı tələb olunmur. | -| `api-airforce` | `af` | Api.airforce | API açarı | [keçid](https://api.airforce) | Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash və DeepSeek-V3 daxil olmaqla pulsuz səviyyədə 55 model | -| `arcee-ai` | `arcee` | Arcee AI | API açarı | [keçid](https://arcee.ai) | API açarını arcee.ai saytından əldə edin | -| `auriko` | `auriko` | Auriko | API açarı, aqreqator | [keçid](https://www.auriko.ai) | Pulsuz plan 1,000 Platform RPM və 10,000 BYOK RPM təqdim edir. Platforma inferensi yenə də provayder xərclərinə tabedir; bu, pulsuz token hovuzu və ya limitsiz pulsuz inferens deyil. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API açarı, korporativ | [keçid](https://learn.microsoft.com/azure/ai-foundry) | Azure AI Foundry açarınızdan istifadə edin. Əsas URL https://.services.ai.azure.com/openai/v1/ və ya https://.openai.azure.com/openai/v1/ ola bilər. | -| `azure-openai` | `azure` | Azure OpenAI | API açarı, korporativ | [keçid](https://azure.microsoft.com/products/ai-services/openai-service) | Azure OpenAI API açarınızdan istifadə edin. Əsas URL resursunuzun son nöqtəsi olmalıdır, məsələn, https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API açarı | [keçid](https://b.ai) | b.ai OpenAI-uyğun LLM şlüzü üçün Bearer API açarı (TheB.AI-dan fərqlidir). https://docs.b.ai ünvanında açar yaradın, sonra OpenAI-uyğun əsas URL kimi https://api.b.ai/v1 ünvanından istifadə edin. | -| `baichuan` | `baichuan` | Baichuan | API açarı | [keçid](https://www.baichuan-ai.com/) | API açarını platform.baichuan-ai.com saytından əldə edin | -| `baidu` | `baidu` | Baidu (ERNIE) | API açarı | [keçid](https://ernie.baidu.com/) | API açarını console.bce.baidu.com saytından əldə edin | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API açarı | [keçid](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API açarı | [keçid](https://baseten.co) | GPU inferensi üçün $30 pulsuz sınaq krediti | -| `bazaarlink` | `bzl` | BazaarLink | API açarı | [keçid](https://bazaarlink.ai) | BazaarLink API açarınızı (sk-bl- ilə başlayır) Authorization: Bearer daxilində istifadə edin. OpenAI SDK https://bazaarlink.ai/api/v1 əsas URL-i ilə işləyir. Modellər provider/model-name formatından istifadə edir. | -| `bedrock` | `bedrock` | Amazon Bedrock | API açarı, korporativ | [keçid](https://aws.amazon.com/bedrock) | Amazon Bedrock API açarınızdan istifadə edin və modellərinizin aktivləşdirildiyi AWS regionunu konfiqurasiya edin (məsələn, eu-west-2). OmniRoute birbaşa Bedrock-un yerli Converse API-sini çağırır. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API açarı, şəkil | [keçid](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API açarı | [keçid](https://blackbox.ai) | ⚠️ **KÖHNƏLİB.** api.blackbox.ai hər bir yol variantında HTTP 404 qaytarır (yoxlama 2026-08-21); ictimai inferens interfeysi girişi məhdudlaşdırılmış enterprise.blackbox.ai/v1 son nöqtəsinə köçürülüb. | -| `bluesminds` | `bm` | BluesMinds | API açarı | [keçid](https://www.bluesminds.com) | Gündəlik pulsuz pi kreditləri — GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen və Kimi K2 daxil olmaqla 200-dən çox modeli dəstəkləyir | -| `byteplus` | `bpm` | BytePlus ModelArk | API açarı | [keçid](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API açarı | [keçid](https://bytez.com) | $1 pulsuz kredit, hər 4 həftədən bir yenilənir | -| `cerebras` | `cerebras` | Cerebras | API açarı | [keçid](https://inference.cerebras.ai) | Birdəfəlik $5 qeydiyyat krediti (30 gün etibarlıdır); ödəniş üsulu tələb olunur. Bu, dövri pulsuz səviyyə deyil. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API açarı | [keçid](https://hyper.charm.land) | Qeydiyyat zamanı aylıq 100 pulsuz Hypercredit | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API açarı, aqreqator | [keçid](https://api.oriper.com) | Rəsmi metadata ayda 2M token təklif edildiyini bildirir, lakin audit zamanı ictimai sayt və sənədlər bloklanmışdı; kvotanı və brend uyğunluğunu təsdiqlənməmiş hesab edin. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API açarı, aqreqator | [keçid](https://chatanywhere.tech) | Yalnız şəxsi, təhsil və ya tədqiqat məqsədli istifadə üçün: açıq sənədlərdə gündə 10.000 bal və hər IP/açar üçün gündə 200 sorğu göstərilir; kommersiya trafiki üçün istifadə etməyin. | -| `cheaperinference` | `cinf` | Cheaper Inference | API açarı | [keçid](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API açarı | [keçid](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API açarı, aqreqator | [keçid](https://chutes.ai) | Chutes-in OpenAI ilə uyğun şlüzü üçün Bearer API açarı. | -| `clarifai` | `clarifai` | Clarifai | API açarı, korporativ | [keçid](https://docs.clarifai.com) | Clarifai PAT-nizdən və ya tətbiqə xüsusi API açarından istifadə edin. OmniRoute https://api.clarifai.com/v2/ext/openai/v1 ünvanındakı OpenAI ilə uyğun son nöqtəni hədəfləyir və Authorization: Key ilə autentifikasiya edir. | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API açarı, aqreqator | [keçid](https://cloudcode.one) | Dərc edilmiş pulsuz modellərə glm-4.7-flash və glm-4.6v-flash daxildir; heç bir rəqəmsal kvota dərc edilməyib və açar yaratmaq üçün kredit və ya kupon tələb oluna bilər. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API açarı | [keçid](https://developers.cloudflare.com/workers-ai) | API Token VƏ Account ID tələb olunur (dash.cloudflare.com ünvanında tapıla bilər) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API açarı | [keçid](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API açarı | [keçid](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API açarı | [keçid](https://cohere.com) | Pulsuz sınaq: test üçün ayda 1.000 API çağırışı, kredit kartı tələb olunmur | -| `command-code` | `cmd` | Command Code | API açarı | [keçid](https://commandcode.ai/) | Command Code API açarından istifadə edin. Sorğular Command Code-un /provider/v1/chat/completions son nöqtəsinə göndərilir. | -| `coze` | `coze` | Coze | API açarı | [keçid](https://coze.com) | API açarını coze.com/open/api ünvanından əldə edin | -| `crof` | `crof` | CrofAI | API açarı | [keçid](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API açarı | [keçid](https://cursor.com/dashboard/api) | cursor.com/dashboard/api ünvanından Cursor istifadəçi API açarını (crsr_...) yapışdırın. OmniRoute tələb əsasında onu sessiya tokeni ilə dəyişir; IDE və ya cursor-agent quraşdırılması tələb olunmur. İstifadə haqqı açarın aid olduğu Cursor planına hesablanır. | -| `dahl` | `dahl` | Dahl | API açarı | [keçid](https://inference.dahl.global) | Tokeni avtomatik yaratmaq üçün «Add Account» düyməsinə klikləyin və ya API açarını əl ilə əlavə edin. | -| `databricks` | `databricks` | Databricks | API açarı, korporativ | [keçid](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API açarı, korporativ | [keçid](https://docs.datarobot.com) | DataRobot API tokeninizdən istifadə edin. İstəyə bağlı Base URL hesabın kök ünvanı (LLM Gateway üçün) və ya /api/v2/deployments/ altındakı yerləşdirmə URL-si ola bilər. | -| `deepai` | `deepai` | DeepAI | API açarı, şəkil | [keçid](https://deepai.org) | DeepAI API açarınızdan istifadə edin. Onu deepai.org saytından əldə edin — Pro abunəliyi ($9.99/ay) tələb olunur. | -| `deepinfra` | `deepinfra` | DeepInfra | API açarı | [keçid](https://deepinfra.com) | API sınaqları və modellərin araşdırılması üçün qeydiyyat zamanı pulsuz kreditlər | -| `deepseek` | `ds` | DeepSeek | API açarı | [keçid](https://platform.deepseek.com) | Qeydiyyat zamanı 5M pulsuz token — kredit kartı tələb olunmur | -| `dgrid` | `dgrid` | DGrid | API açarı | [keçid](https://dgrid.ai) | DGrid Pulsuz Modellər Router-i: dəqiqədə 10 və gündə 100 sorğu. Birdəfəlik $5 balans artırılması dəqiqədə 20-yə və gündə 1.000-ə qədər sorğu imkanını açır. | -| `dify` | `dify` | Dify | API açarı | [keçid](https://dify.ai) | API açarını Dify instansiyanızdan əldə edin. | -| `digitalocean` | `digitalocean` | DigitalOcean | API açarı | [keçid](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API açarı | [keçid](https://dit.ai) | dit.ai API açarınızı Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur — birbaşa əvəzetmədir, sadəcə əsas URL-ni https://api.dit.ai/v1 olaraq dəyişdirin. | -| `doubao` | `doubao` | Doubao | API açarı | [keçid](https://doubao.com) | API açarını console.volcengine.com ünvanından əldə edin | -| `dxnt` | `dxnt` | DXNT / DX Token | API açarı, aqreqator | [keçid](https://www.dxnt.com) | Sənədlərə əsasən, pulsuz hesablar üçün limit gündə 100 çağırışdır; kvota dəvətlər vasitəsilə artırıla və hesabdan asılı olaraq dəyişə bilər. | -| `electronhub` | `electronhub` | Electron Hub | API açarı, aqreqator | [keçid](https://www.electronhub.ai) | Pulsuz plan: 5 RPM, həftəlik $0.25 kredit və :free modelləri üçün gündə 10 Neutrino; ailə büdcələri də tətbiq olunur. | -| `empower` | `empower` | Empower | API açarı, aqreqator | [keçid](https://docs.empower.dev) | Empower-in OpenAI ilə uyğun son nöqtəsi üçün Bearer API açarı. | -| `eurouter` | `eurouter` | EURouter | API açarı, aqreqator | [keçid](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API açarı | [keçid](https://factory.ai) | Factory-nin OpenAI ilə uyğun şlüzü üçün Bearer API açarı. | -| `fal-ai` | `fal` | Fal.ai | API açarı, şəkil | [keçid](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API açarı, aqreqator | [keçid](https://fastrouter.ai) | :free suffiksli modellər hər təşkilat və model üçün gündə 10 sorğuya icazə verir; əlçatanlıq dəyişə bilər. | -| `featherless-ai` | `featherless` | Featherless AI | API açarı | [keçid](https://featherless.ai) | Pulsuz səviyyə mövcuddur — kredit kartı tələb olunmur | -| `fenayai` | `fenayai` | FenayAI | API açarı, aqreqator | [keçid](https://fenayai.com) | FenayAI-ın OpenAI ilə uyğun şlüzü üçün Bearer API açarı. | -| `fireworks` | `fireworks` | Fireworks AI | API açarı | [keçid](https://fireworks.ai) | API sınaqları üçün qeydiyyat zamanı $1 pulsuz başlanğıc krediti | -| `free-ai` | `free-ai` | Free.ai | API açarı, aqreqator | [keçid](https://free.ai) | E-poçt təsdiqindən sonra gündə 30.000 token öz serverinizdə yerləşdirilən modelləri əhatə edir. Hovuzdan artıq istifadə ilkin maya dəyəri ilə hesablana bilər, premium xarici modellər isə ödənişlidir. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API açarı | [keçid](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API açarı | [keçid](https://freebuff.com) | Freebuff / Codebuff autentifikasiya tokenini daxil edin (CLI girişi və ya avtomatlaşdırılmış toplayıcı vasitəsilə əldə edilir). | -| `freeinference` | `freeinference` | FreeInference | API açarı, aqreqator | [keçid](https://freeinference.org) | Kart tələb etmədən tədqiqat üçün pulsuz giriş; Harvarddan olmayan müraciətçilər əl ilə təsdiq tələb edir və heç bir rəqəmsal kvotaya açıq şəkildə zəmanət verilmir. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API açarı | [keçid](https://freemodel.dev) | Qeydiyyat zamanı $300 pulsuz kredit — kredit kartı tələb olunmur. OpenAI ilə uyğun API vasitəsilə GPT-5.4 və GPT-5.5 modellərinə (OpenAI-ın ən son flaqman modelləri) giriş əldə edin. | -| `freetheai` | `fta` | FreeTheAi | API açarı, aqreqator | [keçid](https://freetheai.xyz) | Pulsuz API açarınızı əldə etmək üçün FreeTheAi Discord serverinə qoşulun. | -| `friendliai` | `friendli` | FriendliAI | API açarı | [keçid](https://friendli.ai) | Serversiz inferensiya üçün pulsuz səviyyə — kredit kartı tələb olunmur | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (birini g4f.dev/members.html ünvanında yaradın). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (birini g4f.dev/members.html ünvanında yaradın). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (birini g4f.dev/members.html ünvanında yaradın). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (birini g4f.dev/members.html ünvanında yaradın). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (birini g4f.dev/members.html ünvanında yaradın). | -| `galadriel` | `galadriel` | Galadriel | API açarı | [keçid](https://galadriel.com) | ⚠️ **KÖHNƏLİB.** api.galadriel.ai artıq həll olunmur (2026-06-19 yoxlaması); inferensiya API-sinin dayandırıldığı görünür. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API açarı | [keçid](https://aistudio.google.com) | Google AI Studio vasitəsilə pulsuz səviyyə mövcuddur; model üzrə cari kvotalar və regional məhdudiyyətlər tətbiq olunur | -| `getgoapi` | `ggo` | GoAPI | API açarı, aqreqator | [keçid](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API açarı | [keçid](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API açarı | [keçid](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | İctimai Code Suggestions API-si üçün GitLab şəxsi giriş tokeni. gitlab.com istifadə edilmədikdə öz serverinizdə yerləşdirilən baza URL-ni konfiqurasiya edin. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API açarı | [keçid](https://opengateway.gitlawb.com) | Pulsuz MiMo (xiaomi/mimo-v2.5) 2026-05 tarixində ləğv edildi — Opengateway indi istifadə qədər ödənişli kredit şlüzüdür; təkrarlanan pulsuz model yoxdur. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API açarı | [keçid](https://opengateway.gitlawb.com) | Pulsuz Nemotron kampaniyası 2026-06 tarixində başa çatdı — GMI Cloud marşrutu indi yalnız istifadə qədər ödənişli kreditlə işləyir. | -| `glm` | `glm` | GLM Coding | API açarı | [keçid](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Çin) | API açarı | [keçid](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API açarı | [keçid](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API açarı | [keçid](https://greenpt.com) | API abunəliyini yaratmaq pulsuzdur; inferensiya token üzrə hesablanır. Pulsuz inferensiya limiti dərc edilməyib. | -| `groq` | `groq` | Groq | API açarı | [keçid](https://groq.com) | Pulsuz plan: model üzrə limitlər (hər söhbət modeli üçün gündə 200K token; RPM/RPD üçün console.groq.com/docs/rate-limits səhifəsinə baxın) — hesabda ödəniş üsulu tələb olunmur. | -| `haiper` | `hp` | Haiper | API açarı, video | [keçid](https://haiper.ai) | API açarını haiper.ai/haiper-api ünvanından əldə edin | -| `hcnsec` | `hcnsec` | Huancheng Public API | API açarı | [keçid](https://api.hcnsec.cn) | API açarını api.hcnsec.cn ünvanından əldə edin | -| `helixmind` | `helixmind` | HelixMind | API açarı, aqreqator | [keçid](https://helixmind.online) | Əvvəllər yayılan 3 RPM/50 RPD və kart tələb olunmaması ilə bağlı iddialar 2026-08-02 auditində təsdiqlənmədi; cari kvota və ödəniş şərtləri hesabın yoxlanılmasını tələb edir. | -| `helyxai` | `helyxai` | Helyx AI | API açarı, aqreqator | [keçid](https://helyxai.space) | İşlək Pulsuz plan sənədlərində gündə 100,000 token göstərilir; saytın ayrıca 2M+ marketinq iddiası bununla ziddiyyət təşkil edir və kvota zəmanəti hesab edilmir. | -| `heroku` | `heroku` | Heroku AI | API açarı, korporativ | [keçid](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API açarı | [keçid](https://huggingface.co) | Minlərlə model üçün pulsuz Inference API (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API açarı | [keçid](https://hyperbolic.xyz) | Serversiz inferensiya üçün qeydiyyat zamanı $1-5 sınaq krediti | -| `ideogram` | `ideo` | Ideogram | API açarı | [keçid](https://ideogram.ai) | API açarını ideogram.ai/docs/api ünvanından əldə edin | -| `iflytek` | `iflytek` | iFlytek Spark | API açarı | [keçid](https://xinghuo.xfyun.cn) | API açarını console.xfyun.cn ünvanından əldə edin | -| `inception` | `inception` | Inception | API açarı | [keçid](https://docs.inceptionlabs.ai) | Qeydiyyat zamanı 10M pulsuz token, kredit kartı tələb olunmur. | -| `inference-net` | `inet` | Inference.net | API açarı | [keçid](https://inference.net) | Qeydiyyat zamanı $25 pulsuz kredit, həmçinin tədqiqat qrantları mövcuddur | -| `internlm` | `internlm` | InternLM (Intern-S1) | API açarı | [keçid](https://internlm.intern-ai.org.cn/) | Aylıq pulsuz kvota: təxminən 1M giriş / 3M çıxış tokeni (təxminən 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API açarı, embed/rerank | [keçid](https://jina.ai) | api.jina.ai üçün Bearer API açarı — embedding, yenidən sıralama, təsnifləndirmə, seqmentləşdirmə və axtarış. İdarəetmə panelindəki açarlar JINA_AI_API_KEY dəyişənindən üstündür. Bu, Reader / r.jina.ai kartı deyil və URL-ləri gətirmir. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API açarı | [keçid](https://jina.ai/reader) | r.jina.ai URL-dən Markdown-a çevirmə xidməti üçün Bearer API açarı (yalnız /v1/web/fetch). /v1/embeddings və ya /v1/rerank xidmətlərini təqdim etmir. Foundation API ilə eyni Jina tokeni işləyir; bu kart boş olduqda OmniRoute jina-ai idarəetmə paneli açarından və ya JINA_AI_API_KEY dəyişənindən təkrar istifadə edir. | -| `kenari` | `kenari` | Kenari | API açarı | [keçid](https://kenari.id) | Kenari API açarınızı (kn-...) Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur. API baza URL-si: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API açarı | [keçid](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API açarı, aqreqator | [keçid](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (Köhnə Moonshot API) | API açarı | [keçid](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API açarı | [keçid](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API açarı | [keçid](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API açarı, aqreqator | [keçid](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API açarı, video | [keçid](https://leonardo.ai) | API açarını leonardo.ai/developer ünvanından əldə edin | -| `liquid` | `liquid` | Liquid AI | API açarı | [keçid](https://liquid.ai) | API açarını liquid.ai ünvanından əldə edin | -| `literouter` | `literouter` | LiteRouter | API açarı, aqreqator | [keçid](https://literouter.com) | Pulsuz model variantları :free suffiksindən istifadə edir; gündəlik kredit limitləri modelə görə dəyişir və pulsuz giriş 5,000 tokenlə məhdudlaşdırılır. | -| `llamagate` | `llamagate` | LlamaGate | API açarı | [keçid](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API açarı, aqreqator | [keçid](https://llm.kiwi) | Pulsuz plan auto və hrLLM modellərini təqdim edir; dərc edilmiş saatda 40 sorğu limiti hrLLM üçün keçərlidir. | -| `llm7` | `llm7` | LLM7.io | API açarı | [keçid](https://llm7.io) | İstənilən boş olmayan açardan istifadə edin (məsələn, 'unused'). Əgər köhnə daxili modellər model_unavailable xətası qaytarırsa, Available Models → Import from /models və ya Auto-Sync seçimindən istifadə edin; işlək olduğu təsdiqlənmiş model: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API açarı, aqreqator | [keçid](https://llmgateway.io) | Hostinq edilən Pulsuz plan: hesabda kredit olmadıqda pulsuz qiymətləndirilən modellər hər 10 dəqiqədə 5 sorğu ilə məhdudlaşdırılır. | -| `logfare` | `logfare` | Logfare | API açarı, aqreqator | [keçid](https://logfare.ai) | Dərhal API açarı əldə etmək üçün https://logfare.ai/register ünvanında pulsuz hesab yaradın (istifadəçi adı/parol, e-poçt təsdiqi tələb olunmur), sonra onu Bearer tokeni kimi buraya yapışdırın. | -| `longcat` | `lc` | LongCat AI | API açarı | [keçid](https://longcat.chat/platform/docs) | Pulsuz: hesab qeydiyyatı və KYC təsdiqindən sonra birdəfəlik 10M tokenlik paket (LongCat-2.0). Yalnız bir dəfə verilir — təkrarlanan gündəlik/aylıq limit deyil. | -| `magnific` | `freepik` | Magnific | API açarı, şəkil | [keçid](https://www.magnific.com) | API açarını magnific.com/user/api-keys ünvanından əldə edin (x-magnific-api-key başlığı). Köhnə Freepik tərtibatçı açarları hələ də işləyir. | -| `maritalk` | `maritalk` | Maritalk | API açarı | [keçid](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API açarı, aqreqator | [keçid](https://meganova.ai) | Kartsız pulsuz qeydiyyat. Dərc edilmiş Tier 1 model üzrə kvotaların cəmi gündə 550 sorğudur; bunlar ortaq qlobal hovuz deyil və aktivləşdirilibsə, limitdən artıq istifadə üçün ödəniş tətbiq oluna bilər. | -| `meta-llama` | `meta` | Meta Llama API | API açarı | [keçid](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API açarı, video | [keçid](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Çin) | API açarı | [keçid](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API açarı | [keçid](https://mistral.ai) | Pulsuz Experiment səviyyəsi: bütün modellərə sürət məhdudiyyətli giriş, kredit kartı tələb olunmur | -| `mixedbread` | `mxbai` | Mixedbread AI | API açarı | [keçid](https://www.mixedbread.com) | Mixedbread embedding API-si üçün Bearer API açarı. | -| `mixlayer` | `mixlayer` | Mixlayer | API açarı, aqreqator | [keçid](https://www.mixlayer.com) | qwen/qwen3.5-4b-free modeli prototipləşdirmə üçün pulsuzdur və sürət məhdudiyyətlidir; sabit ictimai RPM və ya gündəlik kvota təsdiqlənməyib. | -| `mnn-ai` | `mnn-ai` | MNN AI | API açarı, aqreqator | [keçid](https://mnnai.ru) | Pulsuz plan: aylıq $1 kredit, 10 RPM və yalnız Free kimi işarələnmiş modellərə giriş. | -| `modal` | `mdl` | Modal | API açarı, korporativ | [keçid](https://modal.com/docs) | Aktivləşdirilibsə, Modal yerləşdirmənizi qoruyan bearer tokenindən istifadə edin. Baza URL-si OpenAI ilə uyğun Modal tətbiqinizə yönəlməlidir, məsələn https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API açarı | [keçid](https://modelscope.cn) | ModelScope API-Inference vasitəsilə pulsuz səviyyə — Alibaba hesabı tələb olunur. | -| `monsterapi` | `monster` | MonsterAPI | API açarı | [keçid](https://monsterapi.ai) | ⚠️ **KÖHNƏLİB.** Monster API 2026-06-30 tarixində fəaliyyətini dayandırıb. OpenAI ilə uyğun alternativ provayderlərdən istifadə edin. | -| `moonshot` | `moonshot` | Kimi | API açarı | [keçid](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API açarı | [keçid](https://morphllm.com) | Pulsuz səviyyə: ayda 250K kredit, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API açarı | [keçid](https://github.com/meta-llama/llama-stack) | META_API_KEY mühit dəyişəninizdən Bearer tokeni kimi istifadə edin. Muse Code CLI OpenAI Responses API məlumat ötürmə formatından istifadə edir (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API açarı, aqreqator | [keçid](https://naga.ac) | API açarını naga.ac ünvanından əldə edin — Google/GitHub/Discord vasitəsilə qeydiyyat mümkündür. | -| `naga-ai` | `naga-ai` | Naga AI | API açarı, aqreqator | [keçid](https://naga.ac) | :free ilə işarələnmiş modellər açıq şəkildə siyahıya alınıb, lakin rəqəmlə ifadə olunan kvota təsdiqlənməyib. Naga-nın siyasəti pulsuz səviyyədəki sorğuların və cavabların toplana və ya təlim üçün istifadə edilə biləcəyi barədə xəbərdarlıq edir. | -| `nanogpt` | `nanogpt` | NanoGPT | API açarı | [keçid](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API açarı | [keçid](https://bynara.id) | Pulsuz NaraRouter hesabı yaradın, Telegram hesabınızı əlaqələndirin (/v1 cavablarından əvvəl tələb olunur), sonra açarı Bearer tokeni kimi buraya yapışdırın. | -| `navy` | `navy` | NavyAI | API açarı | [keçid](https://api.navy) | NavyAI idarəetmə panelindən pulsuz API açarı yaradın, sonra onu Bearer tokeni kimi buraya yapışdırın. | -| `nebius` | `nebius` | Nebius AI | API açarı | [keçid](https://nebius.com) | API sınaqları üçün qeydiyyat zamanı təxminən $1 sınaq krediti | -| `nlpcloud` | `nlpc` | NLP Cloud | API açarı | [keçid](https://docs.nlpcloud.com) | NLP Cloud API açarınızı Authorization: Token daxilində istifadə edin. OmniRoute standart olaraq https://api.nlpcloud.io/v1/gpu//chatbot ünvanındakı çatbot son nöqtəsini hədəfləyir. | -| `nomic` | `nomic` | Nomic | API açarı | [keçid](https://nomic.ai) | API açarını atlas.nomic.ai ünvanından əldə edin | -| `nous-research` | `nous` | Nous Research | API açarı | [keçid](https://portal.nousresearch.com/help) | Nous Portal API açarınızdan istifadə edin. OmniRoute https://inference-api.nousresearch.com/v1 ünvanındakı rəsmi OpenAI-uyğun çıxarım son nöqtəsini hədəfləyir. | -| `novita` | `novita` | Novita AI | API açarı, video, aqreqator | [keçid](https://novita.ai) | Qeydiyyat zamanı $0.50 sınaq krediti (təxminən 1 il etibarlıdır) | -| `nscale` | `nscale` | nScale | API açarı | [keçid](https://nscale.com) | Çıxarım sınaqları üçün qeydiyyat zamanı $5 pulsuz kredit | -| `nube` | `nube` | Nube.sh | API açarı | [keçid](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API açarı | [keçid](https://build.nvidia.com) | Pulsuz tərtibatçı girişi: təxminən 40 RPM, 70+ model (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API açarı, korporativ | [keçid](https://www.oracle.com/artificial-intelligence/generative-ai) | OCI Generative AI API açarınızdan və ya IAM Bearer tokenindən istifadə edin. Baza URL-i https://inference.generativeai..oci.oraclecloud.com/openai/v1/ ola bilər. | -| `ofoxai` | `ofoxai` | OfoxAI | API açarı, aqreqator | [keçid](https://ofox.ai) | Cari kataloq rəqəmlə ifadə olunan açıq kvota olmadan 10-dan çox pulsuz model təklif edir; istehsal mühitində istifadə etməzdən əvvəl yuxarı axın mənbəyini, saxlama və təlim şərtlərini nəzərdən keçirin. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API açarı | [keçid](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API açarı | [keçid](https://1min.ai) | https://docs.1min.ai/docs/api/create-api-key ünvanında API açarı yaradın, sonra onu buraya yapışdırın. | -| `openadapter` | `oad` | OpenAdapter | API açarı | [keçid](https://openadapter.dev) | OpenAdapter API açarınızı Authorization: Bearer sk-cv- daxilində istifadə edin. OpenAI ilə tam uyğundur. API baza URL-i: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API açarı | [keçid](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API açarı | [keçid](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API açarı | [keçid](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API açarı | [keçid](https://openference.com) | Pulsuz plan: açıq mənbəli modellərlə 3 günlük sınaq — kredit kartı tələb olunmur | -| `openrouter` | `openrouter` | OpenRouter | API açarı, aqreqator | [keçid](https://openrouter.ai) | :free suffiksli, $0/token qiymətli pulsuz modellər — 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API açarı | [keçid](https://openvecta.com) | LLM-lər, daxiletmələr və mülahizə modelləri üzrə OpenAI-uyğun çıxarım üçün qeydiyyat zamanı pulsuz kreditlər | -| `opper` | `opper` | Opper | API açarı, aqreqator | [keçid](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API açarı | [keçid](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API açarı | [keçid](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API açarı | [keçid](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API açarı | [keçid](https://www.perplexity.ai) | Perplexity API açarınızdan istifadə edin. OmniRoute Agent API model ID-lərini Perplexity-nin Responses-uyğun son nöqtəsi vasitəsilə yönləndirir. | -| `piapi` | `pi` | PiAPI | API açarı, aqreqator | [keçid](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API açarı | [keçid](https://pioneer.ai) | $75 pulsuz istifadə krediti — kredit kartı tələb olunmur | -| `plamo` | `plamo` | PLaMo | API açarı | [keçid](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API açarı, aqreqator | [keçid](https://creator.poe.com/api-reference) | Poe-nun OpenAI-uyğun API-si üçün Bearer API açarı. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API açarı, aqreqator | [keçid](https://poixe.com) | Cari açıq pulsuz limitlər kiçikdir və model qrupuna görə dəyişir: böyük ölçülü modellər üçün 2 RPM/5 RPD, kiçik ölçülü modellər üçün isə 20 RPM/50 RPD. | -| `pollinations` | `pol` | Pollinations AI | API açarı, video | [keçid](https://pollinations.ai) | Sənədləşdirilmiş pulsuz modellərə anonim/açarsız giriş imkan daxilində təmin edilir. Yerli v3.8.50 yoxlaması (2026-07-31) OmniRoute vasitəsilə 401, eyni şəbəkədən birbaşa yuxarı axın yoxlamalarında isə Cloudflare 1010 qaytardı. Premium modellər üçün yenə də enter.pollinations.ai ünvanından Pollinations API açarı tələb olunur. | -| `poolside` | `poolside` | Poolside | API açarı | [keçid](https://poolside.ai) | Laguna S 2.1 və XS 2.1 ilkin baxış müddətində pulsuzdur; açıq rəqəmsal kvota dərc edilməyib. | -| `predibase` | `predibase` | Predibase | API açarı | [keçid](https://predibase.com) | ⚠️ **KÖHNƏLİB.** serving.app.predibase.com artıq həll olunmur (yoxlama 2026-06-19); idarə olunan xidmət API-si dayandırılmış görünür. | -| `publicai` | `publicai` | PublicAI | API açarı | [keçid](https://publicai.co) | API açarı tələb olunur — birdəfəlik qeydiyyat krediti, sonra ödənişli | -| `qianfan` | `qianfan` | Baidu Qianfan | API açarı | [keçid](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API açarı | [keçid](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API açarı | [keçid](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API açarı | [keçid](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API açarı, şəkil | [keçid](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API açarı | [keçid](https://regolo.ai) | Regolo API açarınızı regolo.ai saytından əldə edin, sonra onu buraya Bearer tokeni kimi yapışdırın. | -| `reka` | `reka` | Reka | API açarı | [keçid](https://docs.reka.ai/chat/overview) | Reka API açarınızdan istifadə edin. OmniRoute OpenAI ilə uyğun https://api.reka.ai/v1 baza URL-sini dəstəkləyir və uyğunluq üçün həm Authorization, həm də X-Api-Key başlıqlarını göndərir. | -| `requesty` | `requesty` | Requesty | API açarı | [keçid](https://requesty.ai) | Pulsuz səviyyə: gündə təxminən 200 sorğu — çoxmodelli marşrutlaşdırma şlüzü (300-dən çox model) | -| `routeway` | `routeway` | Routeway | API açarı | [keçid](https://routeway.ai) | routeway.ai saytında pulsuz API açarı yaradın, sonra onu buraya Bearer tokeni kimi yapışdırın. | -| `runwayml` | `runway` | Runway | API açarı, video | [keçid](https://docs.dev.runwayml.com) | Runway API açarınızı Authorization: Bearer formatında istifadə edin. OmniRoute https://api.dev.runwayml.com/v1 ünvanındakı cari Runway API-ni hədəfləyir və tələb olunan X-Runway-Version başlığını avtomatik göndərir. | -| `sambanova` | `samba` | SambaNova | API açarı | [keçid](https://sambanova.ai) | Qeydiyyat zamanı $5 pulsuz kredit (30 gün etibarlıdır), kredit kartı tələb olunmur | -| `sap` | `sap` | SAP Generative AI Hub | API açarı, korporativ | [keçid](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | SAP AI Core Bearer tokeninizdən istifadə edin. Baza URL-si AI_API_URL kökünüz və ya Generative AI Hub-dan deploymentUrl ola bilər. | -| `sarvam` | `sarvam` | Sarvam AI | API açarı | [keçid](https://docs.sarvam.ai) | Qeydiyyat zamanı ₹1,000 pulsuz kredit — müddəti heç vaxt bitmir | -| `scaleway` | `scw` | Scaleway AI | API açarı | [keçid](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Yeni hesablar üçün 1M pulsuz token — Aİ/GDPR tələblərinə uyğundur (Paris), Qwen3 235B və Llama 70B | -| `sealion` | `sealion` | SEA-LION | API açarı | [keçid](https://sea-lion.ai) | Google ilə sea-lion.ai saytına daxil olun (kart tələb edilmir, regional məhdudiyyət yoxdur), API açarı yaradın, sonra onu buraya yapışdırın. | -| `seekai` | `ska` | SeekAi | API açarı, aqreqator | [keçid](https://seekai.cc) | https://seekai.cc ünvanında API açarı yaradın, sonra onu buraya Bearer tokeni kimi yapışdırın. | -| `segmind` | `segmind` | Segmind | API açarı, şəkil, video | [keçid](https://segmind.com) | Segmind API açarınızı x-api-key başlığında istifadə edin. OmniRoute https://api.segmind.com/v1/ ünvanını hədəfləyir və yaradılmış şəkil/video baytlarını birbaşa qaytarır. | -| `sensenova` | `sensenova` | SenseNova | API açarı | [keçid](https://platform.sensenova.cn) | API açarını platform.sensenova.cn saytından əldə edin | -| `siliconflow` | `siliconflow` | SiliconFlow | API açarı | [keçid](https://cloud.siliconflow.com) | $1 pulsuz kredit, üstəlik şəxsiyyət təsdiqindən sonra hazırda siyahıda olan $0 modellər; əlçatanlıq və limitlər dəyişə bilər | -| `snowflake` | `snowflake` | Snowflake Cortex | API açarı, korporativ | [keçid](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API açarı | [keçid](https://xinghuo.xfyun.cn) | API açarını console.xfyun.cn saytından əldə edin | -| `speka` | `speka` | Speka AI | API açarı, aqreqator | [keçid](https://speka.me) | Pulsuz plan: aylıq $1 istifadə limiti, 10 RPM, bir API açarı, açıq modellərə və sınaq mühitinə giriş; kart tələb edilmir. | -| `stability-ai` | `stability` | Stability AI | API açarı, şəkil | [keçid](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API açarı | [keçid](https://stepfun.com) | API açarını platform.stepfun.com saytından əldə edin | -| `sumopod` | `sumopod` | SumoPod | API açarı | [keçid](https://ai.sumopod.com) | SumoPod API açarınızı (sk-...) Authorization: Bearer formatında istifadə edin. OpenAI ilə tam uyğundur. API baza URL-si: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API açarı | [keçid](https://suno.ai) | suno.ai saytındakı sessiya kukisini yapışdırın (Clerk autentifikasiyası) | -| `synthetic` | `synthetic` | Synthetic | API açarı, aqreqator | [keçid](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API açarı, aqreqator | [keçid](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API açarı | [keçid](https://hunyuan.tencent.com) | API açarını console.cloud.tencent.com saytından əldə edin | -| `thebai` | `thebai` | TheB.AI | API açarı, aqreqator | [keçid](https://theb.ai) | TheB.AI-nin OpenAI ilə uyğun şlüzü üçün Bearer API açarı. | -| `tinyfish` | `tf` | TinyFish Fetch | API açarı | [keçid](https://docs.tinyfish.ai/fetch-api) | agent.tinyfish.ai/api-keys ünvanından X-API-Key | -| `together` | `together` | Together AI | API açarı, video | [keçid](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API açarı | [keçid](https://agent-router.gaib.ai) | Token Kiosk API açarınızı Authorization: Bearer formatında istifadə edin. OpenAI ilə tam uyğun şlüz. API baza URL-si: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API açarı, aqreqator | [keçid](https://www.tokenreply.com) | Pulsuz kimi işarələnmiş modellərin modelə və kampaniyaya xas gündəlik limitləri var; sabit ümumi pulsuz kvota dərc edilməyib. | -| `tokenrouter` | `trk` | TokenRouter | API açarı | [keçid](https://tokenrouter.com) | TokenRouter API açarınızı Authorization: Bearer formatında istifadə edin. OpenAI ilə tam uyğundur. API baza URL-si: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API açarı, şəkil | [keçid](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API açarı | [keçid](https://docs.opentyphoon.ai) | 5 sorğu/s və 200 sorğu/dəq sürət limiti olan pulsuz API açarı. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API açarı | [keçid](https://uncensored.com) | uncensored.com Developer API açarınızdan (uai_sk_live_...) istifadə edin. OmniRoute onu X-api-key başlığı kimi OpenAI ilə uyğun https://api.uncensored.com/api/v1 son nöqtəsinə göndərir. Açarın müddəti heç vaxt bitmir. Bu, istifadəyə görə ölçülən/kredit əsaslı interfeysdir; limitsiz abunə söhbəti ayrıca 'uc' provayderidir. | -| `udio` | `udio` | Udio | API açarı | [keçid](https://udio.com) | udio.com saytından sessiya kukisini (Supabase autentifikasiyası) yapışdırın | -| `unorouter` | `unorouter` | UnoRouter | API açarı, aqreqator | [keçid](https://unorouter.ai) | :free şəkilçili modellər balansdan vəsait çıxmır; limit hər istifadəçi üçün hər pulsuz model üzrə dəqiqədə 1 sorğudur. | -| `upstage` | `upstage` | Upstage | API açarı | [keçid](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API açarı | [keçid](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API açarı | [keçid](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API açarı, aqreqator | [keçid](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API açarı, korporativ | [keçid](https://cloud.google.com/vertex-ai) | Service Account JSON, OAuth giriş tokeni, Vertex Express API açarı və ya xidmət hesabına bağlı avtorizasiya açarı təqdim edin. Express rejimi yalnız Gemini-ni dəstəkləyir; tərəfdaş modellər layihə əhatəli giriş məlumatları tələb edir. | -| `vertex-partner` | `vp` | Vertex AI Partners | API açarı, korporativ | [keçid](https://cloud.google.com/vertex-ai) | Service Account JSON və ya OAuth giriş məlumatlarını təqdim edin. Xidmət hesabına bağlı avtorizasiya açarı da aşkarlamanı dəstəkləyir, lakin tərəfdaş inferensi əlavə olaraq onun Google Cloud layihə ID-sini tələb edir. Standart Express açarları yalnız Gemini-ni dəstəkləyir. | -| `void-ai` | `void-ai` | Void AI | API açarı, aqreqator | [keçid](https://voidai.app) | Açıq model kataloqu bəzi modelləri pulsuz plan tələbi ilə işarələyir, lakin giriş şərtlidir və heç bir rəqəmsal kvota təsdiqlənməyib. | -| `volcengine` | `volcengine` | Volcengine | API açarı | [keçid](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API açarı | [keçid](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Volcano Engine hesabınızı qoşun və ya Ark Agent Plan abunəlik API açarından istifadə edin. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API açarı | [keçid](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Volcano Engine hesabınızı qoşun və ya Ark Coding Plan abunəlik API açarından istifadə edin. | -| `voyage-ai` | `voyage` | Voyage AI | API açarı, vektorlaşdırma/yenidən sıralama | [keçid](https://www.voyageai.com) | Voyage AI vektorlaşdırma və yenidən sıralama API-ləri üçün Bearer API açarı. | -| `wafer` | `wafer` | Wafer AI | API açarı | [keçid](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API açarı | [keçid](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API açarı, korporativ | [keçid](https://www.ibm.com/products/watsonx-ai) | watsonx bearer tokeninizdən istifadə edin. Əsas URL https://.ml.cloud.ibm.com/ml/gateway/v1/ və ya özünüz idarə etdiyiniz /ml/gateway/v1 son nöqtəsi ola bilər. | -| `writer` | `writer` | Writer | API açarı | [keçid](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API açarı | [keçid](https://x5lab.dev) | X5Lab API açarınızı (x5-...) Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur. API əsas URL-si: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API açarı | [keçid](https://x.ai) | Rəsmi xAI API açarından istifadə edin və ya xAI OAuth ilə daxil olun. Grok Build JWT sessiyaları ayrıca provayder olaraq qalır. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API açarı | [keçid](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API açarı | [keçid](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API açarı, aqreqator | [keçid](https://xkiro.com) | xkiro.com saytında pulsuz hesab yaradın və açarı buraya yapışdırın (Bearer; x-api-key də qəbul edilir). | -| `yi` | `yi` | Yi (01.AI) | API açarı | [keçid](https://01.ai) | API açarını platform.lingyiwanwu.com saytından əldə edin | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API açarı, aqreqator | [keçid](https://yolo-auto.com) | Pulsuz API girişi sorğu sayı ilə məhdudlaşdırılıb və sınaq üçün nəzərdə tutulub; rəqəmlə ifadə olunan gündəlik kvota dərc edilməyib və pulsuz girişin qeyri-müəyyən müddətə davam edəcəyinə zəmanət verilmir. | -| `zai` | `zai` | Z.AI | API açarı | [keçid](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API açarı | [keçid](https://zenmux.ai) | ZenMux API açarınızı Authorization: Bearer daxilində istifadə edin. ZenMux OpenAI ilə tam uyğundur. Əsas URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API açarı, aqreqator | [keçid](https://www.zerolimitai.com) | Müvəqqəti pulsuz sınaq reklam edilir, lakin rəsmi səhifələrdə 3 və 7 gün arasında ziddiyyət var; gündə 100 çağırış iddiası daimi hesab edilmir. | -| `zylo-api` | `zylo` | Zylo API | API açarı, aqreqator | [keçid](https://zyloai.net) | Basic planı: 10 RPM, gündə 7,200 sorğu və gündə 200,000 token; yalnız Basic mətn modelləri ilə məhdudlaşır. | +| ID | Ləqəb | Ad | Teqlər | Veb-sayt | Qeydlər | +| ------------------------ | --------------- | ------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API açarı | [keçid](https://ai.360.cn) | API açarını ai.360.cn saytından əldə edin | +| `agentrouter` | `agentrouter` | AgentRouter | API açarı, aqreqator | [keçid](https://agentrouter.org) | Qeydiyyat zamanı $200 pulsuz kredit — çoxmodelli marşrutlaşdırma şlüzü | +| `agnes` | `agnes` | Agnes AI | API açarı, video | [keçid](https://agnes-ai.com) | API açarını agnes-ai.com saytından əldə edin | +| `agnes-cn` | `agnescn` | Agnes AI (Çin) | API açarı | [keçid](https://api.agnes-ai.cn) | API açarını Agnes CN saytından əldə edin. | +| `ai21` | `ai21` | AI21 Labs | API açarı | [keçid](https://www.ai21.com) | Qeydiyyat zamanı $10 sınaq krediti (3 ay etibarlıdır), kredit kartı tələb olunmur | +| `aimlapi` | `aiml` | AI/ML API | API açarı, aqreqator | [keçid](https://aimlapi.com) | Pulsuz səviyyə dayandırılıb (2026) — AI/ML API artıq yalnız istifadə etdikcə ödənişlidir (minimum $20 balans artırma); təkrarlanan pulsuz kreditlər yoxdur. | +| `ainative` | `ainative` | AINative Studio | API açarı | [keçid](https://ainative.studio) | ainative.studio saytında pulsuz API açarı yaradın (kart tələb olunmur), sonra onu buraya Bearer tokeni kimi yapışdırın. | +| `aion` | `aion` | Aion Labs | API açarı | [keçid](https://www.aionlabs.ai) | aionlabs.ai saytında pulsuz API açarı yaradın (kart tələb olunmur), sonra onu buraya Bearer tokeni kimi yapışdırın. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API açarı | [keçid](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Çin) | API açarı | [keçid](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API açarı | [keçid](https://developer.ant-ling.com/en/docs/) | Ant Ling API konsolunda (https://chat.ant-ling.com/open) qeydiyyatdan keçib API açarı yaradın, sonra onu buraya yapışdırın. OmniRoute çat trafikini https://api.ant-ling.com/v1/chat/completions ünvanına yönləndirir; provayder OpenAI ilə uyğundur və həmçinin Anthropic ilə uyğun interfeys təqdim edir. | +| `anthropic` | `anthropic` | Anthropic | API açarı | [keçid](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API açarı, aqreqator | [keçid](https://anyapi.ai) | Pulsuz plan: uyğun Free/Basic modelləri üçün gündə 100,000 ANY Token və 100 RPM; kredit kartı tələb olunmur. | +| `api-airforce` | `af` | Api.airforce | API açarı | [keçid](https://api.airforce) | Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash və DeepSeek-V3 daxil olmaqla pulsuz səviyyədə 55 model | +| `arcee-ai` | `arcee` | Arcee AI | API açarı | [keçid](https://arcee.ai) | API açarını arcee.ai saytından əldə edin | +| `auriko` | `auriko` | Auriko | API açarı, aqreqator | [keçid](https://www.auriko.ai) | Pulsuz plan 1,000 Platform RPM və 10,000 BYOK RPM təqdim edir. Platforma inferensi yenə də provayder xərclərinə tabedir; bu, pulsuz token hovuzu və ya limitsiz pulsuz inferens deyil. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API açarı, müəssisə | [keçid](https://learn.microsoft.com/azure/ai-foundry) | Azure AI Foundry açarınızdan istifadə edin. Əsas URL https://.services.ai.azure.com/openai/v1/ və ya https://.openai.azure.com/openai/v1/ ola bilər. | +| `azure-openai` | `azure` | Azure OpenAI | API açarı, müəssisə | [keçid](https://azure.microsoft.com/products/ai-services/openai-service) | Azure OpenAI API açarınızdan istifadə edin. Əsas URL resursunuzun son nöqtəsi olmalıdır, məsələn, https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API açarı | [keçid](https://b.ai) | b.ai OpenAI-uyğun LLM şlüzü üçün Bearer API açarı (TheB.AI-dan fərqlidir). https://docs.b.ai ünvanında açar yaradın, sonra OpenAI-uyğun əsas URL kimi https://api.b.ai/v1 ünvanından istifadə edin. | +| `baichuan` | `baichuan` | Baichuan | API açarı | [keçid](https://www.baichuan-ai.com/) | API açarını platform.baichuan-ai.com saytından əldə edin | +| `baidu` | `baidu` | Baidu (ERNIE) | API açarı | [keçid](https://ernie.baidu.com/) | API açarını console.bce.baidu.com saytından əldə edin | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API açarı | [keçid](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API açarı | [keçid](https://baseten.co) | GPU inferensi üçün $30 pulsuz sınaq krediti | +| `bazaarlink` | `bzl` | BazaarLink | API açarı | [keçid](https://bazaarlink.ai) | BazaarLink API açarınızı (sk-bl- ilə başlayır) Authorization: Bearer daxilində istifadə edin. OpenAI SDK https://bazaarlink.ai/api/v1 əsas URL-i ilə işləyir. Modellər provider/model-name formatından istifadə edir. | +| `bedrock` | `bedrock` | Amazon Bedrock | API açarı, müəssisə | [keçid](https://aws.amazon.com/bedrock) | Amazon Bedrock API açarınızdan istifadə edin və modellərinizin aktiv olduğu AWS regionunu konfiqurasiya edin (məsələn, eu-west-2). OmniRoute birbaşa Bedrock-un yerli Converse API-sini çağırır. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API açarı, şəkil | [keçid](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API açarı | [keçid](https://blackbox.ai) | ⚠️ **KÖHNƏLİB.** api.blackbox.ai hər bir yol variantında HTTP 404 qaytarır (yoxlama 2026-08-21); ictimai inferens interfeysi girişi məhdudlaşdırılmış enterprise.blackbox.ai/v1 son nöqtəsinə köçürülüb. | +| `bluesminds` | `bm` | BluesMinds | API açarı | [keçid](https://www.bluesminds.com) | Gündəlik pulsuz pi kreditləri — GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen və Kimi K2 daxil olmaqla 200-dən çox modeli dəstəkləyir | +| `byteplus` | `bpm` | BytePlus ModelArk | API açarı | [keçid](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API açarı | [keçid](https://bytez.com) | $1 pulsuz kredit, hər 4 həftədən bir yenilənir | +| `cerebras` | `cerebras` | Cerebras | API açarı | [keçid](https://inference.cerebras.ai) | Birdəfəlik $5 qeydiyyat krediti (30 gün etibarlıdır); ödəniş üsulu tələb olunur. Təkrarlanan pulsuz səviyyə deyil. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API açarı | [keçid](https://hyper.charm.land) | Qeydiyyat zamanı aylıq 100 pulsuz Hypercredit | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API açarı, aqreqator | [keçid](https://api.oriper.com) | Rəsmi metadata ayda 2M token təqdim edildiyini bildirir, lakin audit zamanı ictimai sayt və sənədlər bloklanmışdı; kvota və brend uyğunluğunu təsdiqlənməmiş hesab edin. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API açarı, aqreqator | [keçid](https://chatanywhere.tech) | Yalnız şəxsi, təhsil və ya tədqiqat məqsədli istifadə üçün: ictimai sənədlərdə gündə 10,000 xal və hər IP/açar üçün gündə 200 sorğu göstərilir; kommersiya trafiki üçün istifadə etməyin. | +| `cheaperinference` | `cinf` | Cheaper Inference | API açarı | [keçid](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API açarı | [keçid](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API açarı, aqreqator | [keçid](https://chutes.ai) | Chutes-un OpenAI-uyğun şlüzü üçün Bearer API açarı. | +| `clarifai` | `clarifai` | Clarifai | API açarı, korporativ | [keçid](https://docs.clarifai.com) | Clarifai PAT-ınızdan və ya tətbiqə xüsusi API açarınızdan istifadə edin. OmniRoute https://api.clarifai.com/v2/ext/openai/v1 ünvanındakı OpenAI-uyğun son nöqtəyə müraciət edir və Authorization: Key vasitəsilə autentifikasiya edir. | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API açarı, aqreqator | [keçid](https://cloudcode.one) | Dərc edilmiş pulsuz modellərə glm-4.7-flash və glm-4.6v-flash daxildir; rəqəmlə ifadə edilmiş kvota dərc edilməyib və açar yaratmaq üçün kredit və ya kupon tələb oluna bilər. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API açarı | [keçid](https://developers.cloudflare.com/workers-ai) | API Token VƏ Account ID tələb olunur (dash.cloudflare.com saytında tapıla bilər) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API açarı | [keçid](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API açarı | [keçid](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API açarı | [keçid](https://cohere.com) | Pulsuz sınaq: test üçün ayda 1,000 API çağırışı, kredit kartı tələb olunmur | +| `command-code` | `cmd` | Command Code | API açarı | [keçid](https://commandcode.ai/) | Command Code API açarından istifadə edin. Sorğular Command Code-un /provider/v1/chat/completions son nöqtəsinə göndərilir. | +| `coze` | `coze` | Coze | API açarı | [keçid](https://coze.com) | API açarını coze.com/open/api ünvanından əldə edin | +| `crof` | `crof` | CrofAI | API açarı | [keçid](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API açarı | [keçid](https://cursor.com/dashboard/api) | cursor.com/dashboard/api ünvanından Cursor istifadəçi API açarını (crsr_...) daxil edin. OmniRoute onu tələb əsasında sessiya tokeni ilə dəyişir; IDE və ya cursor-agent quraşdırmaq lazım deyil. İstifadə haqqı açarın aid olduğu Cursor planına hesablanır. | +| `dahl` | `dahl` | Dahl | API açarı | [keçid](https://inference.dahl.global) | Tokeni avtomatik yaratmaq üçün 'Hesab əlavə et' düyməsinə klikləyin və ya API açarını əl ilə əlavə edin. | +| `databricks` | `databricks` | Databricks | API açarı, korporativ | [keçid](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API açarı, korporativ | [keçid](https://docs.datarobot.com) | DataRobot API tokeninizdən istifadə edin. İxtiyari Base URL hesabın kök ünvanı (LLM Gateway üçün) və ya /api/v2/deployments/ altındakı yerləşdirmə URL-i ola bilər. | +| `deepai` | `deepai` | DeepAI | API açarı, şəkil | [keçid](https://deepai.org) | DeepAI API açarınızdan istifadə edin. Onu deepai.org saytından əldə edin — Pro abunəliyi ($9.99/ay) tələb olunur. | +| `deepinfra` | `deepinfra` | DeepInfra | API açarı | [keçid](https://deepinfra.com) | API sınaqları və modellərin araşdırılması üçün qeydiyyat zamanı pulsuz kreditlər | +| `deepseek` | `ds` | DeepSeek | API açarı | [keçid](https://platform.deepseek.com) | Qeydiyyat zamanı 5M pulsuz token — kredit kartı tələb olunmur | +| `dgrid` | `dgrid` | DGrid | API açarı | [keçid](https://dgrid.ai) | DGrid Pulsuz Model Router-i: dəqiqədə 10 və gündə 100 sorğu. Birdəfəlik $5 balans artırılması dəqiqədə 20-yə və gündə 1,000-ə qədər sorğu imkanını açır. | +| `dify` | `dify` | Dify | API açarı | [keçid](https://dify.ai) | API açarını Dify instansiyanızdan əldə edin. | +| `digitalocean` | `digitalocean` | DigitalOcean | API açarı | [keçid](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API açarı | [keçid](https://dit.ai) | dit.ai API açarınızı Authorization: Bearer daxilində istifadə edin. Tamamilə OpenAI-uyğundur — birbaşa əvəzedicidir, sadəcə əsas URL-i https://api.dit.ai/v1 olaraq dəyişdirin. | +| `doubao` | `doubao` | Doubao | API açarı | [keçid](https://doubao.com) | API açarını console.volcengine.com ünvanından əldə edin | +| `dxnt` | `dxnt` | DXNT / DX Token | API açarı, aqreqator | [keçid](https://www.dxnt.com) | Pulsuz hesablar üçün gündə 100 çağırış sənədləşdirilib; kvota dəvətlər vasitəsilə arta və hesabdan asılı olaraq dəyişə bilər. | +| `electronhub` | `electronhub` | Electron Hub | API açarı, aqreqator | [keçid](https://www.electronhub.ai) | Pulsuz plan: 5 RPM, həftəlik $0.25 kredit və :free modelləri üçün gündə 10 Neutrino; ailə büdcələri də tətbiq olunur. | +| `empower` | `empower` | Empower | API açarı, aqreqator | [keçid](https://docs.empower.dev) | Empower-in OpenAI-uyğun son nöqtəsi üçün Bearer API açarı. | +| `eurouter` | `eurouter` | EURouter | API açarı, aqreqator | [keçid](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API açarı | [keçid](https://factory.ai) | Factory-nin OpenAI-uyğun şlüzü üçün Bearer API açarı. | +| `fal-ai` | `fal` | Fal.ai | API açarı, şəkil | [keçid](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API açarı, aqreqator | [keçid](https://fastrouter.ai) | :free suffiksli modellər hər təşkilat və model üzrə gündə 10 sorğuya icazə verir; əlçatanlıq dəyişə bilər. | +| `featherless-ai` | `featherless` | Featherless AI | API açarı | [keçid](https://featherless.ai) | Pulsuz səviyyə mövcuddur — kredit kartı tələb olunmur | +| `fenayai` | `fenayai` | FenayAI | API açarı, aqreqator | [keçid](https://fenayai.com) | FenayAI-nin OpenAI-uyğun şlüzü üçün Bearer API açarı. | +| `fireworks` | `fireworks` | Fireworks AI | API açarı | [keçid](https://fireworks.ai) | API sınağı üçün qeydiyyat zamanı $1 pulsuz başlanğıc krediti | +| `free-ai` | `free-ai` | Free.ai | API açarı, aqreqator | [keçid](https://free.ai) | E-poçt təsdiqindən sonra gündə 30,000 token özü yerləşdirilən modelləri əhatə edir. Hovuzdan artıq istifadə ilkin maya dəyəri ilə hesablandırıla bilər, premium xarici modellər isə ödənişlidir. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API açarı | [keçid](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API açarı | [keçid](https://freebuff.com) | Freebuff / Codebuff autentifikasiya tokenini daxil edin (CLI girişi və ya avtomatlaşdırılmış toplayıcı vasitəsilə əldə edilir). | +| `freeinference` | `freeinference` | FreeInference | API açarı, aqreqator | [keçid](https://freeinference.org) | Kart tələb etmədən tədqiqat üçün pulsuz giriş; Harvarddan olmayan müraciətçilər üçün əl ilə təsdiq tələb olunur və heç bir rəqəmsal kvotaya açıq şəkildə zəmanət verilmir. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API açarı | [keçid](https://freemodel.dev) | Qeydiyyat zamanı $300 pulsuz kredit — kredit kartı tələb olunmur. OpenAI ilə uyğun API vasitəsilə GPT-5.4 və GPT-5.5 (OpenAI-ın ən son flaqman modelləri) modellərinə giriş. | +| `freetheai` | `fta` | FreeTheAi | API açarı, aqreqator | [keçid](https://freetheai.xyz) | Pulsuz API açarınızı əldə etmək üçün FreeTheAi Discord serverinə qoşulun. | +| `friendliai` | `friendli` | FriendliAI | API açarı | [keçid](https://friendli.ai) | Serversiz inferensiya üçün pulsuz səviyyə — kredit kartı tələb olunmur | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (g4f.dev/members.html ünvanında yaradın). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (g4f.dev/members.html ünvanında yaradın). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (g4f.dev/members.html ünvanında yaradın). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (g4f.dev/members.html ünvanında yaradın). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API açarı, aqreqator | [keçid](https://g4f.space) | g4f.dev/chat ünvanında anonim cake kreditləri hazırlayın və ya g4f.dev üzv açarından istifadə edin (g4f.dev/members.html ünvanında yaradın). | +| `galadriel` | `galadriel` | Galadriel | API açarı | [keçid](https://galadriel.com) | ⚠️ **KÖHNƏLİB.** api.galadriel.ai artıq həll olunmur (2026-06-19 yoxlaması); görünür, inferensiya API-si dayandırılıb. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API açarı | [keçid](https://aistudio.google.com) | Google AI Studio vasitəsilə pulsuz səviyyə mövcuddur; cari model üzrə kvotalar və regional məhdudiyyətlər tətbiq olunur | +| `getgoapi` | `ggo` | GoAPI | API açarı, aqreqator | [keçid](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API açarı | [keçid](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API açarı | [keçid](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Açıq Code Suggestions API-si üçün GitLab şəxsi giriş tokeni. gitlab.com istifadə edilmədikdə öz serverinizdə yerləşdirilən baza URL-ni konfiqurasiya edin. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API açarı | [keçid](https://opengateway.gitlawb.com) | Pulsuz MiMo (xiaomi/mimo-v2.5) 2026-05 tarixində ləğv edilib — Opengateway indi istifadəyə görə ödənişli kredit şlüzüdür; mütəmadi pulsuz model yoxdur. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API açarı | [keçid](https://opengateway.gitlawb.com) | Pulsuz Nemotron kampaniyası 2026-06 tarixində başa çatıb — GMI Cloud marşrutu indi yalnız istifadəyə görə ödənişli kreditlə işləyir. | +| `glm` | `glm` | GLM Coding | API açarı | [keçid](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Çin) | API açarı | [keçid](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API açarı | [keçid](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API açarı | [keçid](https://greenpt.com) | API abunəliyini yaratmaq pulsuzdur; inferensiya üçün hər tokenə görə ödəniş tutulur. Heç bir pulsuz inferensiya limiti dərc edilməyib. | +| `groq` | `groq` | Groq | API açarı | [keçid](https://groq.com) | Pulsuz plan: model üzrə limitlər (hər çat modeli üçün gündə 200K token; RPM/RPD üçün console.groq.com/docs/rate-limits səhifəsinə baxın) — hesabda ödəniş üsulu yoxdur. | +| `haiper` | `hp` | Haiper | API açarı, video | [keçid](https://haiper.ai) | API açarını haiper.ai/haiper-api ünvanından əldə edin | +| `hcnsec` | `hcnsec` | Huancheng Public API | API açarı | [keçid](https://api.hcnsec.cn) | API açarını api.hcnsec.cn ünvanından əldə edin | +| `helixmind` | `helixmind` | HelixMind | API açarı, aqreqator | [keçid](https://helixmind.online) | Əvvəllər yayılan 3 RPM/50 RPD və kart tələb olunmaması iddiaları 2026-08-02 auditində təsdiqlənmədi; cari kvota və hesablaşma üçün hesabın təsdiqlənməsi tələb olunur. | +| `helyxai` | `helyxai` | Helyx AI | API açarı, aqreqator | [keçid](https://helyxai.space) | Aktiv Pulsuz plan sənədlərində gündə 100,000 token göstərilir; saytın ayrıca 2M+ marketinq iddiası bununla ziddiyyət təşkil edir və kvota zəmanəti kimi qəbul edilmir. | +| `heroku` | `heroku` | Heroku AI | API açarı, korporativ | [keçid](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API açarı | [keçid](https://huggingface.co) | Minlərlə model (Whisper, VITS, SDXL…) üçün pulsuz Inference API | +| `hyperbolic` | `hyp` | Hyperbolic | API açarı | [keçid](https://hyperbolic.xyz) | Qeydiyyat zamanı serversiz inferensiya üçün $1-5 sınaq krediti | +| `ideogram` | `ideo` | Ideogram | API açarı | [keçid](https://ideogram.ai) | API açarını ideogram.ai/docs/api ünvanından əldə edin | +| `iflytek` | `iflytek` | iFlytek Spark | API açarı | [keçid](https://xinghuo.xfyun.cn) | API açarını console.xfyun.cn ünvanından əldə edin | +| `inception` | `inception` | Inception | API açarı | [keçid](https://docs.inceptionlabs.ai) | Qeydiyyat zamanı 10M pulsuz token, kredit kartı tələb olunmur. | +| `inference-net` | `inet` | Inference.net | API açarı | [keçid](https://inference.net) | Qeydiyyat zamanı $25 pulsuz kredit, həmçinin tədqiqat qrantları mövcuddur | +| `internlm` | `internlm` | InternLM (Intern-S1) | API açarı | [keçid](https://internlm.intern-ai.org.cn/) | Pulsuz aylıq kvota: təxminən 1M giriş / 3M çıxış tokeni (təxminən 10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API açarı, embed/rerank | [keçid](https://jina.ai) | api.jina.ai üçün Bearer API açarı — embeddings, rerank, classify, segment və search. İdarə panelindəki açarlar JINA_AI_API_KEY üzərində üstünlüyə malikdir. Bu, Reader / r.jina.ai kartı deyil və URL-ləri əldə etmir. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API açarı | [keçid](https://jina.ai/reader) | r.jina.ai URL-dən-markdown-a xidməti üçün Bearer API açarı (yalnız /v1/web/fetch). /v1/embeddings və ya /v1/rerank təqdim etmir. Foundation API ilə eyni Jina tokeni işləyir; bu kart boş olduqda OmniRoute jina-ai idarə paneli açarından və ya JINA_AI_API_KEY-dən təkrar istifadə edir. | +| `kenari` | `kenari` | Kenari | API açarı | [keçid](https://kenari.id) | Kenari API açarınızı (kn-...) Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur. API baza URL-i: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API açarı | [keçid](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API açarı, aqreqator | [keçid](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Köhnə Moonshot API) | API açarı | [keçid](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API açarı | [keçid](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API açarı | [keçid](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API açarı, aqreqator | [keçid](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API açarı, video | [keçid](https://leonardo.ai) | API açarını leonardo.ai/developer ünvanından əldə edin | +| `liquid` | `liquid` | Liquid AI | API açarı | [keçid](https://liquid.ai) | API açarını liquid.ai saytından əldə edin | +| `literouter` | `literouter` | LiteRouter | API açarı, aqreqator | [keçid](https://literouter.com) | Pulsuz model variantları :free suffiksindən istifadə edir; gündəlik kredit limitləri modelə görə dəyişir və pulsuz giriş 5,000 tokenlə məhdudlaşdırılır. | +| `llamagate` | `llamagate` | LlamaGate | API açarı | [keçid](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API açarı, aqreqator | [keçid](https://llm.kiwi) | Pulsuz plan auto və hrLLM modellərini təqdim edir; dərc edilmiş saatda 40 sorğu limiti hrLLM-ə aiddir. | +| `llm7` | `llm7` | LLM7.io | API açarı | [keçid](https://llm7.io) | Boş olmayan istənilən açardan istifadə edin (məsələn, 'unused'). Köhnə daxili modellər model_unavailable qaytararsa, Mövcud Modellər → /models-dən idxal və ya Avtomatik Sinxronizasiya seçimindən istifadə edin; işlədiyi təsdiqlənmiş model: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API açarı, aqreqator | [keçid](https://llmgateway.io) | Hostinqli Pulsuz plan: hesabda kredit olmadıqda pulsuz qiymətləndirilən modellər hər 10 dəqiqədə 5 sorğu ilə məhdudlaşdırılır. | +| `logfare` | `logfare` | Logfare | API açarı, aqreqator | [keçid](https://logfare.ai) | Dərhal API açarı əldə etmək üçün https://logfare.ai/register ünvanında pulsuz hesab yaradın (istifadəçi adı/parol, e-poçt təsdiqi tələb olunmur), sonra onu Bearer tokeni kimi buraya yapışdırın. | +| `longcat` | `lc` | LongCat AI | API açarı | [keçid](https://longcat.chat/platform/docs) | Pulsuz: hesab qeydiyyatından və KYC təsdiqindən sonra birdəfəlik 10M-token qrantı (LongCat-2.0). Yalnız bir dəfə verilir — təkrarlanan gündəlik/aylıq kvota deyil. | +| `magnific` | `freepik` | Magnific | API açarı, şəkil | [keçid](https://www.magnific.com) | API açarını magnific.com/user/api-keys ünvanından əldə edin (x-magnific-api-key başlığı). Köhnə Freepik developer açarları hələ də işləyir. | +| `maritalk` | `maritalk` | Maritalk | API açarı | [keçid](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API açarı, aqreqator | [keçid](https://meganova.ai) | Kart olmadan pulsuz qeydiyyat. Dərc edilmiş Tier 1 model üzrə kvotaların cəmi gündə 550 sorğudur; bunlar ortaq qlobal hovuz deyil və aktivləşdirildiyi halda limiti aşmağa görə ödəniş tətbiq oluna bilər. | +| `meta-llama` | `meta` | Meta Llama API | API açarı | [keçid](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API açarı, video | [keçid](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Çin) | API açarı | [keçid](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API açarı | [keçid](https://mistral.ai) | Pulsuz Experiment səviyyəsi: bütün modellərə sürət limiti ilə giriş, kredit kartı tələb olunmur | +| `mixedbread` | `mxbai` | Mixedbread AI | API açarı | [keçid](https://www.mixedbread.com) | Mixedbread embeddings API-si üçün Bearer API açarı. | +| `mixlayer` | `mixlayer` | Mixlayer | API açarı, aqreqator | [keçid](https://www.mixlayer.com) | qwen/qwen3.5-4b-free modeli prototipləmə üçün pulsuzdur və sürət limiti tətbiq olunur; sabit açıq RPM və ya gündəlik kvota təsdiqlənməyib. | +| `mnn-ai` | `mnn-ai` | MNN AI | API açarı, aqreqator | [keçid](https://mnnai.ru) | Pulsuz plan: aylıq $1 kredit, 10 RPM və yalnız Free kimi işarələnmiş modellərə giriş. | +| `modal` | `mdl` | Modal | API açarı, korporativ | [keçid](https://modal.com/docs) | Aktivləşdirilibsə, Modal yerləşdirmənizi qoruyan bearer tokenindən istifadə edin. Baza URL-i OpenAI ilə uyğun Modal tətbiqinizə yönəlməlidir, məsələn, https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API açarı | [keçid](https://modelscope.cn) | ModelScope API-Inference vasitəsilə pulsuz səviyyə — Alibaba hesabı tələb olunur. | +| `monsterapi` | `monster` | MonsterAPI | API açarı | [keçid](https://monsterapi.ai) | ⚠️ **KÖHNƏLİB.** Monster API 2026-06-30 tarixində fəaliyyətini dayandırdı. OpenAI ilə uyğun alternativ provayderlərdən istifadə edin. | +| `moonshot` | `moonshot` | Kimi | API açarı | [keçid](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API açarı | [keçid](https://morphllm.com) | Pulsuz səviyyə: ayda 250K kredit, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API açarı | [keçid](https://github.com/meta-llama/llama-stack) | META_API_KEY mühit dəyişəninizdən Bearer tokeni kimi istifadə edin. Muse Code CLI OpenAI Responses API kabel formatından istifadə edir (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API açarı, aqreqator | [keçid](https://naga.ac) | API açarını naga.ac saytından əldə edin — Google/GitHub/Discord ilə qeydiyyat mümkündür. | +| `naga-ai` | `naga-ai` | Naga AI | API açarı, aqreqator | [keçid](https://naga.ac) | :free ilə işarələnmiş modellər açıq şəkildə siyahıya alınıb, lakin heç bir rəqəmsal kvota təsdiqlənməyib. Naga-nın siyasətində pulsuz səviyyədəki sorğuların və çıxışların toplana və ya təlim üçün istifadə edilə biləcəyi barədə xəbərdarlıq edilir. | +| `nanogpt` | `nanogpt` | NanoGPT | API açarı | [keçid](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API açarı | [keçid](https://bynara.id) | Pulsuz NaraRouter hesabı yaradın, Telegram hesabınızı əlaqələndirin (/v1 cavablarından əvvəl tələb olunur), sonra açarı Bearer tokeni kimi buraya yapışdırın. | +| `navy` | `navy` | NavyAI | API açarı | [keçid](https://api.navy) | NavyAI idarəetmə panelindən pulsuz API açarı yaradın, sonra onu Bearer tokeni kimi buraya yapışdırın. | +| `nebius` | `nebius` | Nebius AI | API açarı | [keçid](https://nebius.com) | API sınaqları üçün qeydiyyat zamanı təxminən $1 sınaq krediti | +| `nlpcloud` | `nlpc` | NLP Cloud | API açarı | [keçid](https://docs.nlpcloud.com) | NLP Cloud API açarınızı Authorization: Token daxilində istifadə edin. OmniRoute standart olaraq https://api.nlpcloud.io/v1/gpu//chatbot ünvanındakı çatbot son nöqtəsini hədəfləyir. | +| `nomic` | `nomic` | Nomic | API açarı | [keçid](https://nomic.ai) | API açarını atlas.nomic.ai saytından əldə edin | +| `nous-research` | `nous` | Nous Research | API açarı | [keçid](https://portal.nousresearch.com/help) | Nous Portal API açarınızdan istifadə edin. OmniRoute https://inference-api.nousresearch.com/v1 ünvanındakı rəsmi OpenAI-uyğun nəticəçıxarma son nöqtəsini hədəfləyir. | +| `novita` | `novita` | Novita AI | API açarı, video, aqreqator | [keçid](https://novita.ai) | Qeydiyyat zamanı $0.50 sınaq krediti (təxminən 1 il etibarlıdır) | +| `nscale` | `nscale` | nScale | API açarı | [keçid](https://nscale.com) | Nəticəçıxarma sınaqları üçün qeydiyyat zamanı $5 pulsuz kredit | +| `nube` | `nube` | Nube.sh | API açarı | [keçid](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API açarı | [keçid](https://build.nvidia.com) | Pulsuz tərtibatçı girişi: təxminən 40 RPM, 70-dən çox model (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API açarı, korporativ | [keçid](https://www.oracle.com/artificial-intelligence/generative-ai) | OCI Generative AI API açarınızdan və ya IAM bearer tokenindən istifadə edin. Əsas URL https://inference.generativeai..oci.oraclecloud.com/openai/v1/ ola bilər. | +| `ofoxai` | `ofoxai` | OfoxAI | API açarı, aqreqator | [keçid](https://ofox.ai) | Cari kataloq açıq rəqəmsal kvota göstərmədən 10-dan çox pulsuz model təklif edir; istehsalda istifadə etməzdən əvvəl yuxarı axın mənşəyini, saxlama və təlim şərtlərini nəzərdən keçirin. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API açarı | [keçid](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API açarı | [keçid](https://1min.ai) | https://docs.1min.ai/docs/api/create-api-key ünvanında API açarı yaradın, sonra onu buraya yapışdırın. | +| `openadapter` | `oad` | OpenAdapter | API açarı | [keçid](https://openadapter.dev) | OpenAdapter API açarınızı Authorization: Bearer sk-cv- daxilində istifadə edin. OpenAI ilə tam uyğundur. API əsas URL-i: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API açarı | [keçid](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API açarı | [keçid](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API açarı | [keçid](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API açarı | [keçid](https://openference.com) | Pulsuz səviyyə: Qwen3.8 27b və Llama 3.2 3B daxildir — cari şərtlər üçün openference.com/pricing səhifəsinə baxın | +| `openrouter` | `openrouter` | OpenRouter | API açarı, aqreqator | [keçid](https://openrouter.ai) | :free suffiksli, $0/token qiymətində pulsuz modellər — 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API açarı | [keçid](https://openvecta.com) | LLM-lər, yerləşdirmələr və əsaslandırma modelləri üzrə OpenAI-uyğun nəticəçıxarma üçün qeydiyyat zamanı pulsuz kreditlər | +| `opper` | `opper` | Opper | API açarı, aqreqator | [keçid](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API açarı | [keçid](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API açarı | [keçid](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API açarı | [keçid](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API açarı | [keçid](https://www.perplexity.ai) | Perplexity API açarınızdan istifadə edin. OmniRoute Agent API model ID-lərini Perplexity-nin Responses-uyğun son nöqtəsi vasitəsilə yönləndirir. | +| `piapi` | `pi` | PiAPI | API açarı, aqreqator | [keçid](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API açarı | [keçid](https://pioneer.ai) | $75 pulsuz istifadə krediti — kredit kartı tələb olunmur | +| `plamo` | `plamo` | PLaMo | API açarı | [keçid](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API açarı, aqreqator | [keçid](https://creator.poe.com/api-reference) | Poe-nun OpenAI-uyğun API-si üçün Bearer API açarı. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API açarı, aqreqator | [keçid](https://poixe.com) | Cari açıq pulsuz limitlər kiçikdir və model qrupuna görə dəyişir: böyük tutumlu modellər üçün 2 RPM/5 RPD, kiçik tutumlu modellər üçün isə 20 RPM/50 RPD. | +| `pollinations` | `pol` | Pollinations AI | API açarı, video | [keçid](https://pollinations.ai) | Sənədləşdirilmiş pulsuz modellərə anonim/açarsız giriş mümkün imkanlar daxilində təmin edilir. Yerli v3.8.50 yoxlaması (2026-07-31) eyni şəbəkədən OmniRoute vasitəsilə 401, birbaşa yuxarı axın sorğularında isə Cloudflare 1010 qaytardı. Premium modellər üçün yenə də enter.pollinations.ai saytından Pollinations API açarı tələb olunur. | +| `poolside` | `poolside` | Poolside | API açarı | [keçid](https://poolside.ai) | Laguna S 2.1 və XS 2.1 ilkin baxış müddətində pulsuzdur; açıq rəqəmsal kvota dərc edilməyib. | +| `predibase` | `predibase` | Predibase | API açarı | [keçid](https://predibase.com) | ⚠️ **KÖHNƏLİB.** serving.app.predibase.com artıq həll olunmur (yoxlama 2026-06-19); idarə olunan xidmət API-si dayandırılmış görünür. | +| `publicai` | `publicai` | PublicAI | API açarı | [keçid](https://publicai.co) | API açarı tələb edir — qeydiyyat zamanı birdəfəlik kredit, sonra ödənişli | +| `qianfan` | `qianfan` | Baidu Qianfan | API açarı | [keçid](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API açarı | [keçid](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API açarı | [keçid](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API açarı | [keçid](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API açarı, şəkil | [keçid](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API açarı | [keçid](https://regolo.ai) | Regolo API açarınızı regolo.ai saytından əldə edin, sonra onu buraya Bearer tokeni kimi yapışdırın. | +| `reka` | `reka` | Reka | API açarı | [keçid](https://docs.reka.ai/chat/overview) | Reka API açarınızdan istifadə edin. OmniRoute OpenAI ilə uyğun https://api.reka.ai/v1 əsas URL-sini dəstəkləyir və uyğunluq üçün həm Authorization, həm də X-Api-Key başlıqlarını göndərir. | +| `requesty` | `requesty` | Requesty | API açarı | [keçid](https://requesty.ai) | Pulsuz səviyyə: gündə təxminən 200 sorğu — çoxmodelli marşrutlaşdırma şlüzü (300-dən çox model) | +| `routeway` | `routeway` | Routeway | API açarı | [keçid](https://routeway.ai) | routeway.ai saytında pulsuz API açarı yaradın, sonra onu buraya Bearer tokeni kimi yapışdırın. | +| `runwayml` | `runway` | Runway | API açarı, video | [keçid](https://docs.dev.runwayml.com) | Runway API açarınızı Authorization: Bearer daxilində istifadə edin. OmniRoute https://api.dev.runwayml.com/v1 ünvanındakı cari Runway API-sini hədəfləyir və tələb olunan X-Runway-Version başlığını avtomatik göndərir. | +| `sambanova` | `samba` | SambaNova | API açarı | [keçid](https://sambanova.ai) | Qeydiyyat zamanı $5 pulsuz kredit (30 gün etibarlıdır), kredit kartı tələb olunmur | +| `sap` | `sap` | SAP Generative AI Hub | API açarı, korporativ | [keçid](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | SAP AI Core bearer tokeninizdən istifadə edin. Əsas URL AI_API_URL kökünüz və ya Generative AI Hub-dan deploymentUrl ola bilər. | +| `sarvam` | `sarvam` | Sarvam AI | API açarı | [keçid](https://docs.sarvam.ai) | Qeydiyyat zamanı ₹1,000 pulsuz kredit — müddəti heç vaxt bitmir | +| `scaleway` | `scw` | Scaleway AI | API açarı | [keçid](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Yeni hesablar üçün 1M pulsuz token — Aİ/GDPR tələblərinə uyğundur (Paris), Qwen3 235B və Llama 70B | +| `sealion` | `sealion` | SEA-LION | API açarı | [keçid](https://sea-lion.ai) | sea-lion.ai saytına Google ilə daxil olun (kart tələb olunmur, regional məhdudiyyət yoxdur), API açarı yaradın, sonra onu buraya yapışdırın. | +| `seekai` | `ska` | SeekAi | API açarı, aqreqator | [keçid](https://seekai.cc) | https://seekai.cc saytında API açarı yaradın, sonra onu buraya Bearer tokeni kimi yapışdırın. | +| `segmind` | `segmind` | Segmind | API açarı, şəkil, video | [keçid](https://segmind.com) | Segmind API açarınızı x-api-key başlığında istifadə edin. OmniRoute https://api.segmind.com/v1/ ünvanını hədəfləyir və yaradılmış şəkil/video baytlarını birbaşa qaytarır. | +| `sensenova` | `sensenova` | SenseNova | API açarı | [keçid](https://platform.sensenova.cn) | API açarını platform.sensenova.cn saytından əldə edin | +| `siliconflow` | `siliconflow` | SiliconFlow | API açarı | [keçid](https://cloud.siliconflow.com) | $1 pulsuz kredit, həmçinin şəxsiyyət təsdiqindən sonra hazırda siyahıda olan $0 modellər; əlçatanlıq və limitlər dəyişə bilər | +| `snowflake` | `snowflake` | Snowflake Cortex | API açarı, korporativ | [keçid](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API açarı | [keçid](https://xinghuo.xfyun.cn) | API açarını console.xfyun.cn saytından əldə edin | +| `speka` | `speka` | Speka AI | API açarı, aqreqator | [keçid](https://speka.me) | Pulsuz plan: aylıq $1 istifadə, 10 RPM, bir API açarı, açıq modellərə və sınaq meydançasına giriş; kart tələb olunmur. | +| `stability-ai` | `stability` | Stability AI | API açarı, şəkil | [keçid](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API açarı | [keçid](https://stepfun.com) | API açarını platform.stepfun.com saytından əldə edin | +| `sumopod` | `sumopod` | SumoPod | API açarı | [keçid](https://ai.sumopod.com) | SumoPod API açarınızı (sk-...) Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur. API-nin əsas URL-si: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API açarı | [keçid](https://suno.ai) | suno.ai saytından sessiya kukisini (Clerk autentifikasiyası) yapışdırın | +| `synthetic` | `synthetic` | Synthetic | API açarı, aqreqator | [keçid](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API açarı, aqreqator | [keçid](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API açarı | [keçid](https://hunyuan.tencent.com) | API açarını console.cloud.tencent.com saytından əldə edin | +| `thebai` | `thebai` | TheB.AI | API açarı, aqreqator | [keçid](https://theb.ai) | TheB.AI-nin OpenAI ilə uyğun şlüzü üçün Bearer API açarı. | +| `tinyfish` | `tf` | TinyFish Fetch | API açarı | [keçid](https://docs.tinyfish.ai/fetch-api) | agent.tinyfish.ai/api-keys ünvanından X-API-Key | +| `together` | `together` | Together AI | API açarı, video | [keçid](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API açarı | [keçid](https://agent-router.gaib.ai) | Token Kiosk API açarınızı Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğun şlüz. API-nin əsas URL-si: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API açarı, aqreqator | [keçid](https://www.tokenreply.com) | Pulsuz kimi işarələnmiş modellərin modelə və kampaniyaya xas gündəlik limitləri var; sabit ümumi pulsuz kvota dərc edilməyib. | +| `tokenrouter` | `trk` | TokenRouter | API açarı | [keçid](https://tokenrouter.com) | TokenRouter API açarınızı Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur. API-nin əsas URL-si: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API açarı, şəkil | [keçid](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API açarı | [keçid](https://docs.opentyphoon.ai) | 5 sorğu/s və 200 sorğu/dəq tezlik limiti olan pulsuz API açarı. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API açarı | [keçid](https://uncensored.com) | uncensored.com Developer API açarınızdan (uai_sk_live_...) istifadə edin. OmniRoute onu X-api-key başlığı kimi OpenAI ilə uyğun https://api.uncensored.com/api/v1 son nöqtəsinə göndərir. Açarın etibarlılıq müddəti heç vaxt bitmir. Bu, istifadəyə görə ölçülən/kredit əsaslı interfeysdir; limitsiz abunə söhbəti ayrıca 'uc' provayderidir. | +| `udio` | `udio` | Udio | API açarı | [keçid](https://udio.com) | udio.com saytından sessiya kukisini (Supabase autentifikasiyası) yapışdırın | +| `unorouter` | `unorouter` | UnoRouter | API açarı, aqreqator | [keçid](https://unorouter.ai) | :free suffiksli modellər balansdan vəsait çıxmır; limit hər istifadəçi üçün hər pulsuz model üzrə dəqiqədə 1 sorğudur. | +| `upstage` | `upstage` | Upstage | API açarı | [keçid](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API açarı | [keçid](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API açarı | [keçid](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API açarı, aqreqator | [keçid](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API açarı, müəssisə | [keçid](https://cloud.google.com/vertex-ai) | Service Account JSON, OAuth giriş tokeni, Vertex Express API açarı və ya xidmət hesabına bağlı avtorizasiya açarı təqdim edin. Express rejimi yalnız Gemini-ni dəstəkləyir; tərəfdaş modelləri layihə çərçivəli giriş məlumatları tələb edir. | +| `vertex-partner` | `vp` | Vertex AI Partners | API açarı, müəssisə | [keçid](https://cloud.google.com/vertex-ai) | Service Account JSON və ya OAuth giriş məlumatlarını təqdim edin. Xidmət hesabına bağlı avtorizasiya açarı da aşkarlamanı dəstəkləyir, lakin tərəfdaş inferensi əlavə olaraq onun Google Cloud layihə ID-sini tələb edir. Standart Express açarları yalnız Gemini-ni dəstəkləyir. | +| `void-ai` | `void-ai` | Void AI | API açarı, aqreqator | [keçid](https://voidai.app) | İctimai model kataloqu bəzi modelləri pulsuz plan tələbi ilə işarələyir, lakin giriş şərtidir və heç bir rəqəmsal kvota təsdiqlənməyib. | +| `volcengine` | `volcengine` | Volcengine | API açarı | [keçid](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API açarı | [keçid](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Volcano Engine hesabınızı qoşun və ya Ark Agent Plan abunəlik API açarından istifadə edin. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API açarı | [keçid](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Volcano Engine hesabınızı qoşun və ya Ark Coding Plan abunəlik API açarından istifadə edin. | +| `voyage-ai` | `voyage` | Voyage AI | API açarı, yerləşdirmə/yenidən sıralama | [keçid](https://www.voyageai.com) | Voyage AI yerləşdirmə və yenidən sıralama API-ləri üçün Bearer API açarı. | +| `wafer` | `wafer` | Wafer AI | API açarı | [keçid](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API açarı | [keçid](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API açarı, müəssisə | [keçid](https://www.ibm.com/products/watsonx-ai) | watsonx bearer tokeninizdən istifadə edin. Əsas URL https://.ml.cloud.ibm.com/ml/gateway/v1/ və ya özünüzün idarə etdiyiniz /ml/gateway/v1 son nöqtəsi ola bilər. | +| `writer` | `writer` | Writer | API açarı | [keçid](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API açarı | [keçid](https://x5lab.dev) | X5Lab API açarınızı (x5-...) Authorization: Bearer daxilində istifadə edin. OpenAI ilə tam uyğundur. API əsas URL-si: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API açarı | [keçid](https://x.ai) | Rəsmi xAI API açarından istifadə edin və ya xAI OAuth ilə daxil olun. Grok Build JWT sessiyaları ayrıca provayder olaraq qalır. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API açarı | [keçid](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API açarı | [keçid](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API açarı, aqreqator | [keçid](https://xkiro.com) | xkiro.com saytında pulsuz hesab yaradın və açarı buraya yapışdırın (Bearer; x-api-key də qəbul edilir). | +| `yi` | `yi` | Yi (01.AI) | API açarı | [keçid](https://01.ai) | API açarını platform.lingyiwanwu.com saytından əldə edin | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API açarı, aqreqator | [keçid](https://yolo-auto.com) | Pulsuz API girişi sorğu sayı ilə məhdudlaşdırılıb və sınaq üçün nəzərdə tutulub; heç bir rəqəmsal gündəlik kvota dərc edilməyib və pulsuz girişin qeyri-müəyyən müddətə davam edəcəyi vəd olunmur. | +| `zai` | `zai` | Z.AI | API açarı | [keçid](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API açarı | [keçid](https://zenmux.ai) | ZenMux API açarınızı Authorization: Bearer daxilində istifadə edin. ZenMux OpenAI ilə tam uyğundur. Əsas URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API açarı, aqreqator | [keçid](https://www.zerolimitai.com) | Müvəqqəti pulsuz sınaq reklam edilir, lakin rəsmi səhifələrdə müddətin 3 və ya 7 gün olması barədə ziddiyyətli məlumatlar var; gündə 100 çağırış iddiası daimi hesab edilmir. | +| `zylo-api` | `zylo` | Zylo API | API açarı, aqreqator | [keçid](https://zyloai.net) | Basic planı: 10 RPM, gündə 7,200 sorğu və gündə 200,000 token; yalnız Basic mətn modelləri ilə məhdudlaşır. | ## Lokal Provayderlər (14) diff --git a/docs/i18n/az/docs/routing/REASONING_REPLAY.md b/docs/i18n/az/docs/routing/REASONING_REPLAY.md index 7d7b720b373f..8f3cc6ee127f 100644 --- a/docs/i18n/az/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/az/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ Lakin tipik müştərilər (Cursor, Cline, Roo Code, OpenAI SDK) təkrar göndə ## Arxitektura ``` -N-ci gediş (köməkçi yaradır): +N-ci gediş (assistant yaradır): → cavab reasoning_content + tool_calls ehtiva edir → əgər requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - hər tool_call.id əsasında açarlanaraq (yaddaşa + DB-yə) yazır - → cavabı müştəriyə ötürür (müştəri əsaslandırmanı saxlaya da bilər, saxlamaya da bilər) + hər bir tool_call.id ilə açarlanaraq yazır (yaddaş + DB) + → cavabı müştəriyə yönləndirir (müştəri əsaslandırmanı saxlaya da bilər, saxlamaya da bilər) N+1-ci gediş (müştəri növbəti sorğunu göndərir): - → tərcüməçi müəyyən edir: requiresReasoningReplay(provider, model) === true - → tool_calls ehtiva edən və reasoning_content ehtiva etməyən hər köməkçi mesajı üçün: + → tərcüməçi aşkarlayır: requiresReasoningReplay(provider, model) === true + → tool_calls olan və reasoning_content olmayan hər bir assistant mesajı üçün: lookupReasoning(toolCalls[0].id) → yaddaş → DB - uyğunluq var → msg.reasoning_content = cached; recordReplay() - uyğunluq yoxdur → msg.reasoning_content = "" (köhnə DeepSeek üçün əvvəlki ehtiyat davranış) + tapıldı → msg.reasoning_content = cached; recordReplay() + tapılmadı → msg.reasoning_content = "" (köhnə DeepSeek üçün əvvəlki davranışa keçid) → yuxarı axın ardıcıl tarixçə görür → 400 xətası yoxdur ``` -Qeydəalma `open-sse/handlers/chatCore.ts` faylında (iki yerdə, iki `cacheReasoningFromAssistantMessage` çağırış nöqtəsində) baş verir. Təkrar istifadə sxem uyğunlaşdırmasından sonra, lakin göndərişdən əvvəl `open-sse/translator/index.ts` faylında baş verir. +Qeydəalma `open-sse/handlers/chatCore.ts` daxilində (iki yerdə, iki `cacheReasoningFromAssistantMessage` çağırış nöqtəsində) baş verir. Təkrar oynatma `open-sse/translator/index.ts` daxilində, sxemə uyğunlaşdırmadan sonra, lakin göndərişdən əvvəl baş verir. + +Adi (alət çağırışı olmayan) assistant gedişləri fərqli şəkildə açarlanır: `buildAssistantMessageCacheKey()` sessiya əhatəsini və həmin gedişə qədər normallaşdırılmış OpenAI formatlı transkripti həzm edir, çünki `tools` mövcud olduqda DeepSeek _hər bir_ əvvəlki gedişin əsaslandırmasını tələb edir. Responses API hədəfləri üçün (məsələn, `/responses` ünvanına yönləndirilən `opencode-go/deepseek-v4-flash`) yuxarı axın gövdəsi `messages` deyil, `input` daşıyır; buna görə də `translateRequest()` (`open-sse/translator/index.ts`) həzm etdiyi aralıq transkripti callback seçimi vasitəsilə bildirir və qeydəalma nöqtələri həmin transkripti eyni qaydada həzm edir. Responses təkrar oynatma mərhələsi hər bir mənbə formatı üçün OpenAI aralıq təqdimatı üzərində işləyir, buna görə Anthropic Messages müştəriləri (Claude → OpenAI → Responses) üçün də təkrar oynatma həyata keçirilir. ## Saxlama — Hibrid yaddaş + SQLite diff --git a/docs/i18n/az/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/az/docs/security/SOCKET_DEV_FINDINGS.md index 499b259d0446..2bc96ff0e125 100644 --- a/docs/i18n/az/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/az/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,23 @@ --- -Bu sənəd `omniroute@3.8.5` paketinə qarşı irəli sürülmüş altı -`AI-detected potential malware` aşkarlaması və `omniroute@3.8.6` versiyasında -tətbiq edilmiş qarşı tədbirlər üçün baxımçı tərəfindən hazırlanmış təsdiqdir. Bu sənədin məqsədləri: - -1. Təhlükəsizlik konveyeri operatorlarının aşkarlamaları faktiki mənbə kodu ilə - müqayisə edərək qiymətləndirməli olduqları zaman istinad edə biləcəkləri vahid mənbəyə malik olması. -2. Gələcək süni intellekt skanerlərinin işarələnmiş hər bir yolun məqsədli, - seçim əsasında aktivləşdirilən və sənədləşdirilmiş olduğuna dair baxımçı tərəfindən imzalanmış bəyanatı aşkarlaya bilməsi. -3. Hər bir çağırış nöqtəsinin _niyə_ məhz bu formada qurulduğuna dair yazılı qeydin olması — - beləliklə, gələcək refaktorinq qəsdən aradan qaldırılmış izi təsadüfən yenidən yaratmasın. - -Əgər v3.8.6 qarşı tədbirləri yayımlandıqdan sonra aşağıdakı çağırış nöqtələrindən -hər hansı birini yenidən işarələyən skaner işlədirsinizsə, skan izi ilə birlikdə məsələ açın və -biz buradakı təsdiqi genişləndirəcəyik. +> **Əhatə dairəsi qeydi:** `socket.yml` Socket.dev xidmətinin npm artefaktı üçün reyestr tərəfində, dərcdən sonra apardığı skanı konfiqurasiya edir (`tests/`, `docs/` və yığım hesabatları kimi paketə daxil edilməyən məzmun üçün nəzərə alınmayan yollar). O, CI/PR birləşdirmə nəzarətini qoşmur — `.github/workflows` daxilində heç bir iş axını, heç bir `package.json` skripti və heç bir `Makefile` hədəfi Socket.dev xidmətini çağırmır. + +Bu sənəd `omniroute@3.8.5` üçün bildirilmiş altı +`Süni intellekt tərəfindən aşkarlanmış potensial zərərli proqram` tapıntısı və +`omniroute@3.8.6` versiyasında tətbiq edilmiş yumşaltma tədbirləri barədə müşayiətçi tərəfindən hazırlanmış təsdiq bəyanatıdır. Bu sənəd aşağıdakı məqsədlər üçün mövcuddur: + +1. Təhlükəsizlik konveyerinin operatorları tapıntıları faktiki mənbə kodu ilə + müqayisəli şəkildə qiymətləndirməli olduqda istinad edə biləcəkləri vahid mənbəyə malik olsunlar. +2. Gələcək süni intellekt skanerləri işarələnmiş hər bir yolun məqsədli, + seçim əsasında aktivləşdirilən və sənədləşdirilmiş olduğuna dair müşayiətçi tərəfindən imzalanmış bəyanatı aşkarlaya bilsinlər. +3. Hər bir çağırış nöqtəsinin _niyə_ məhz bu şəkildə qurulduğuna dair yazılı qeydimiz olsun — + beləliklə, gələcək refaktorinq qəsdən aradan qaldırılmış bir barmaq izini + təsadüfən yenidən təqdim etməsin. + +v3.8.6 üçün yumşaltma tədbirləri yayımlandıqdan sonra aşağıdakı çağırış +nöqtələrindən hər hansı birini yenidən işarələyən skaner işlədirsinizsə, skan izi ilə birlikdə problem bildirişi açın və +biz buradakı təsdiq bəyanatını genişləndirəcəyik. --- diff --git a/docs/i18n/bg/README.md b/docs/i18n/bg/README.md index c838737a6483..e7e4a19aee60 100644 --- a/docs/i18n/bg/README.md +++ b/docs/i18n/bg/README.md @@ -23,13 +23,13 @@ -> Ръчното комбиниране на безплатни планове е мъчително — десетки SDK пакети, десетки ограничения на заявките и никаква представа с какъв общ капацитет всъщност разполагате. OmniRoute каталогизира **491 записа за безплатни планове в 35 ключа за периодични пулове** и изчислява водещия брой токени въз основа на **17-те пула с публикуван положителен месечен бюджет плюс пет лимита на Groq за отделни модели**, като премахва дублирането при споделени пулове. Квотите, които се активират само след регионална проверка на самоличността (към момента: ModelScope), са показани отделно — +~6M след регионална проверка на самоличността — и никога не се включват във водещата стойност. Резултатът остава видим в таблото за управление (`/dashboard/free-tiers`). +> Ръчното комбиниране на безплатни планове е мъчително — десетки SDK пакети, десетки ограничения на заявките и никаква представа с какво количество всъщност разполагате. OmniRoute каталогизира **489 записа за безплатни планове в 35 ключа за периодично възстановяващи се пулове** и изчислява общия брой токени въз основа на **17-те пула с публикуван положителен месечен бюджет плюс пет лимита на Groq за отделни модели**, като премахва дублиранията при споделените пулове. Квотите, които се активират само след регионална проверка на самоличността (към момента: ModelScope), са показани отделно — +~6M след регионална проверка на самоличността — и никога не се включват в общата стойност. Резултатът остава видим в таблото за управление (`/dashboard/free-tiers`). -Карта на бюджета за безплатни планове на OmniRoute: стабилно ~1.62B безплатни токена месечно и до ~2.22B през първия месец с кредитите при регистрация, от 35 документирани ключа за периодични пулове, обхващащи 491 каталогизирани записа за безплатни планове зад една крайна точка. Честни изчисления с премахване на дублирането по пулове — всеки споделен пул се брои веднъж, включително 17 периодични пула с публикуван положителен месечен бюджет от токени плюс пет лимита на Groq за отделни модели; 13 доставчици са маркирани за избягване в каталога за рискове, свързани с условията, така че решението е ваше. Лентата за бюджета включва Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (пет лимита за отделни модели) и по-малки пулове, както и кредити при регистрация за първия месец и постоянно безплатни доставчици без лимит на токените, показани отделно, така че никога да не завишават водещата стойност. Текущо използвани/оставащи в /dashboard/free-tiers. +Карта на бюджета за безплатните планове на OmniRoute: постоянно ~1.62B безплатни токена на месец и до ~2.22B през първия месец с кредити при регистрация, от 35 документирани ключа за периодично възстановяващи се пулове, обхващащи 489 каталогизирани записа за безплатни планове зад една крайна точка. Коректно изчисление с премахване на дублираните пулове — всеки споделен пул се брои веднъж, включително 17 периодично възстановяващи се пула с публикуван положителен месечен бюджет от токени плюс пет лимита на Groq за отделни модели; 13 доставчици са отбелязани като avoid в каталога за рискове, свързани с условията, така че вие решавате. Лентата на бюджета включва Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (пет лимита за отделни модели) и по-малки пулове, както и кредити при регистрация за първия месец и постоянно безплатни доставчици без лимит на токените, показани отделно, за да не завишават общата стойност. Актуално използвано/оставащо количество на /dashboard/free-tiers. -> Анимирано обобщение на актуалната страница `/dashboard/free-tiers`. Пълна методология (премахване на дублирането по пулове, нива на кредитите, условия на доставчиците): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Анимирано обобщение на страницата `/dashboard/free-tiers` с актуални данни. Пълна методология (премахване на дублирани пулове, нива на кредитите, условия на доставчиците): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Тези стойности се проверяват повторно на всеки две седмици спрямо актуалния каталог и **се променят и в двете посоки** — ако доставчик прекрати безплатен план, стойността намалява; ако се появи нов, тя нараства. Публикуваме това, което каталогът действително изчислява, а не закръглен нагоре най-добър възможен сценарий. +> Тези стойности се проверяват отново на всеки две седмици спрямо актуалния каталог и **се променят и в двете посоки** — ако доставчик прекрати безплатен план, стойността намалява; ако се появи нов, тя нараства. Публикуваме това, което каталогът действително изчислява, а не закръглен нагоре най-добър сценарий.
@@ -48,18 +48,18 @@ ### 💬 Присъединете се към общността -**👋 Последвайте отговорника по поддръжката — научавайте първи за нови доставчици, версии и съвети:** +**👋 Следвайте поддръжника — научавайте първи за нови доставчици, версии и съвети:** -[![Последвайте Diego в LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) -[![Последвайте @diegosouzapw в GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) +[![Следвайте Diego в LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) +[![Следвайте @diegosouzapw в GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![WhatsApp глобален](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) -[![WhatsApp Бразилия](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) +[![WhatsApp Global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Уебсайт](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Въпроси, съвети за доставчици, план за развитие и поддръжка → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Глобален](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Бразилия](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Портал](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Въпроси, съвети за доставчици, пътна карта и поддръжка → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Глобално](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Бразилия](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Портал](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -600,7 +600,7 @@ Radar се използва само по желание и поддържа е ## 🤖 Съвместими CLI инструменти и агенти за програмиране -> Една конфигурация — `http://localhost:20128/v1` — и **всяка** AI IDE или CLI работи с безплатни модели и модели на ниска цена. +> Една конфигурация — `http://localhost:20128/v1` — и **всяка** AI IDE или CLI работи с безплатни и евтини модели.
@@ -634,16 +634,16 @@ Radar се използва само по желание и поддържа е - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ работи също и с · Kiro · Command Code · Antigravity · Windsurf · AMP · всеки инструмент, съвместим с OpenAI ++ работи също и с · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · всеки инструмент, съвместим с OpenAI
-📖 Настройка за всеки инструмент за всичките 36 инструмента (26 CLI инструмента за код + 10 CLI агента) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Приставка за OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Настройка за всеки от 36-те инструмента (26 CLI инструмента за код + 10 CLI агента) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Приставка за OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) @@ -665,9 +665,9 @@ omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" omniroute configure codex # също: claude opencode qwen aider goose gemini cline continue kilo ``` -Всяка команда използва активния отдалечен контекст (`omniroute connect `), `--dry-run` -показва предварително точните променливи на средата и аргументи, без да изпълнява командата, а `--api-key-env NAME` не допуска тайните -до историята на вашата обвивка. → [CLI интеграции](docs/guides/CLI-INTEGRATIONS.md) +Всяка команда зачита активния отдалечен контекст (`omniroute connect `), `--dry-run` +показва предварително точните променливи на средата/аргументи без изпълнение, а `--api-key-env NAME` не допуска тайните +в хронологията на вашата обвивка. → [CLI интеграции](docs/guides/CLI-INTEGRATIONS.md)
@@ -677,11 +677,11 @@ omniroute configure codex # също: claude opencode qwen aider goose -> **357 регистрирани доставчици** в каноничните колекции за чат, мултимедия, търсене, локални услуги, облачни агенти и системни услуги, включително **152 с метаданни за откриване `hasFree: true`**. Регистърът на чат модели обхваща **229 доставчици / 2 554 уникални двойки доставчик–модел / 1 283 необработени идентификатора на модели**; отделният каталог за безплатни квоти съдържа **491 реда за отделни модели**, **35 периодично подновявани пула** и **54 периодично подновявани/безключови доставчици с безплатен достъп завинаги**. Тези знаменатели са различни по замисъл; определенията и изчисленията с премахнати дубликати между пуловете се намират в [Справочника за доставчиците](docs/reference/PROVIDER_REFERENCE.md) и [Безплатните планове](docs/reference/FREE_TIERS.md). +> **357 регистрирани доставчици** в каноничните колекции за чат, медии, търсене, локални услуги, облачни агенти и системни услуги, включително **152 с метаданни за откриване `hasFree: true`**. Регистърът с модели за чат обхваща **229 доставчици / 2,554 различни двойки доставчик-модел / 1,283 необработени идентификатора на модели**; отделният каталог с безплатни бюджети съдържа **491 реда за отделни модели**, **35 периодично възобновяващи се пула** и **54 периодично възобновяващи се/неизискващи ключ доставчици с постоянен безплатен достъп**. Тези знаменатели са различни по замисъл; дефинициите и изчисленията с дедупликация на пуловете са описани в [Справочника за доставчиците](docs/reference/PROVIDER_REFERENCE.md) и [Безплатните планове](docs/reference/FREE_TIERS.md).
-### 🏢 Всяка водеща лаборатория — чрез една крайна точка +### 🏢 Всяка голяма лаборатория — чрез една крайна точка @@ -728,10 +728,10 @@ omniroute configure codex # също: claude opencode qwen aider goose - + - - + +
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Неограничено и БЕЗПЛАТНО
Pollinations
Pollinations
GPT, Llama, Claude
Не е необходим ключ
Cloudflare AI
Cloudflare AI
50+ модела
10K неврона/ден
Cloudflare AI
Cloudflare AI
Над 50 модела
10K неврона/ден
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM безплатно
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M токена/ден
OpenRouter
OpenRouter
:free модели
+$10 → по-висока RPM
Openference
Openference
Qwen3.8 27B, Llama 3.2
Безплатен план
OpenRouter
OpenRouter
:free модели
+$10 → по-висок RPM
@@ -1271,20 +1271,20 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п - - - - - + + + + + - - - - - - + + + + + +
СлойТехнология
Среда за изпълнениеNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
ЕзикTypeScript 6.0 — 100% TypeScript в src/ и open-sse/ (без нито един any в ядрото от v2.0 насам)
ФреймуъркNext.js 16 + React 19 + Tailwind CSS 4
База данниbetter-sqlite3 (SQLite, журнал в режим WAL) + LowDB (наследен JSON формат) — 122 домейн модула, 176 миграции
ПаметПълнотекстово търсене със SQLite FTS5 + int8-квантувани векторни вграждания, типизирано затихване
СхемиZod 4 — валидиране на входа/изхода на MCP инструменти + API договори
ЕзикTypeScript 6.0 — 100% TypeScript в src/ и open-sse/ (нула употреби на any в ядрото от v2.0 насам)
РамкаNext.js 16 + React 19 + Tailwind CSS 4
База данниbetter-sqlite3 (SQLite, WAL журнализиране) + LowDB (наследен JSON формат) — 122 домейн модула, 178 миграции
ПаметSQLite FTS5 пълнотекстово търсене + int8-квантувани векторни вграждания, типизирано затихване
СхемиZod 4 — валидиране на входа/изхода на MCP инструментите + API договори
ПротоколиMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
Поточно предаванеServer-Sent Events (SSE) + WebSocket мост (/v1/ws)
КомпресияКонвейер с 12 механизма — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Удостоверяване & сигурностOAuth 2.0 (PKCE) + JWT + API ключове + MCP удостоверяване с обхвати · AES-256-GCM за данни в покой · DOMPurify
Прикритостwreq-js — имитация на JA3 / JA4 TLS отпечатъци, прокси на 3 нива
УстойчивостПрекъсвач на веригата, експоненциално отстъпване, защита от лавинообразни едновременни заявки, самовъзстановяване чрез автоматично комбиниране
Журнализиранеpino — структурирани JSON журнални записи с контекст на заявката
ТестванеИнструмент за изпълнение на тестове на Node.js + Vitest — 39 000+ статични декларации на тестове в над 5 100 проследявани тестови файла (модулни, интеграционни, E2E, за сигурност, за екосистемата)
ПлатформиНастолен компютър (Electron) · Android (Termux) · PWA (всеки браузър)
Удостоверяване & сигурностOAuth 2.0 (PKCE) + JWT + API ключове + MCP удостоверяване с ограничен обхват · AES-256-GCM за данни в покой · DOMPurify
Прикриванеwreq-js — имитиране на JA3 / JA4 TLS отпечатъци, 3-степенно прокси
УстойчивостПрекъсвач на веригата, експоненциално изчакване, защита срещу „стаден ефект“, самовъзстановяване чрез автоматично комбиниране
Регистриранеpino — структурирани JSON регистрационни записи с контекст на заявката
ТестванеNode.js инструмент за изпълнение на тестове + Vitest — 39 000+ статични декларации на тестове в 5100+ проследявани тестови файла (модулни, интеграционни, E2E, за сигурност и екосистема)
ПлатформиНастолни системи (Electron) · Android (Termux) · PWA (всеки браузър)
CI/CDGitHub Actions — автоматично публикуване в npm + Docker Hub при издание
ВръзкиУебсайт · npm · Docker Hub
@@ -1302,8 +1302,8 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п - - + + @@ -1313,31 +1313,31 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п
ДокументОписание
Ръководство за потребителяДоставчици, комбинации, интеграция с CLI, внедряване
Ръководство за настройванеВсички методи за инсталиране, конфигурации на CLI инструменти, настройване на протоколи, оптимизиране на времето за изчакване
Ръководство за CLI инструментиНастройване по инструменти за Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Ръководство за настройкаВсички методи за инсталиране, конфигурации на CLI инструменти, настройка на протоколи, оптимизиране на времето за изчакване
Ръководство за CLI инструментиНастройка по инструменти за Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Отдалечен режимУправление на отдалечен OmniRoute (VPS) от CLI на вашия лаптоп чрез токени за достъп с ограничен обхват
Конфигурация на Claude CodeСвързване на Claude Code с OmniRoute (локално/отдалечено) чрез launch и профили за отделните модели
Бърз стартИнсталиране в 3 стъпки → свързване → конфигуриране
- + - + - - - + + +
ДокументОписание
Ръководство за DockerDocker run, профили за Compose, Caddy HTTPS, тунели, тагове на образи
Ръководство за DockerDocker run, профили на Compose, Caddy HTTPS, тунели, тагове на образи
Ръководство за PodmanИнтеграция на Quadlet със systemd, podman-compose, SELinux
Внедряване във VMПълно ръководство: настройване на VM + nginx + Cloudflare
Внедряване във виртуална машинаПълно ръководство: настройка на VM + nginx + Cloudflare
Внедряване във Fly.ioВнедряване във Fly.io с постоянно хранилище
Ръководство за TermuxИзпълнение на OmniRoute на Android чрез Termux
Ръководство за PWAИнсталиране, кеширане и архитектура на прогресивно уеб приложение
Ръководство за деинсталиранеПълно премахване за всички методи за инсталиране
Конфигурация на средатаПълен списък с променливи и справочна информация за .env
Ръководство за PWAИнсталиране, кеширане и архитектура на прогресивното уеб приложение
Ръководство за деинсталиранеЧисто премахване за всички методи на инсталиране
Конфигурация на средатаПълен списък с променливи в .env и справочна информация
-### 🧠 Функции и архитектура +### 🧠 Функционалности и архитектура - + - - + + - + - - - + + +
ДокументОписание
АрхитектураСистемна архитектура, поток на данните и вътрешни механизми
АрхитектураАрхитектура на системата, поток на данните и вътрешно устройство
Ръководство за компресиранеКонвейер със 7 опции: изключено / леко / стандартно / агресивно / ултра / RTK / комбинирано
RTK компресиранеКомпресиране на изхода от команди, филтри, доверяване, проверка, възстановяване на необработения изход
Механизми за компресиранеCaveman, RTK, комбинирани конвейери, интерфейси на таблото, API и MCP
Формат на правилата за компресиранеСхеми на JSON пакети с правила за филтрите на Caveman и RTK
Механизми за компресиранеCaveman, RTK, комбинирани конвейери, интерфейси на таблото за управление/API/MCP
Формат на правилата за компресиранеСхеми на JSON пакети с правила за филтрите Caveman и RTK
Езикови пакети за компресиранеРазпознаване на езика и създаване на пакети с правила за Caveman
Ръководство за устойчивостПредпазители на веригата, периоди за изчакване, опашка, предотвратяване на едновременен наплив, TLS спуфинг
Ръководство за устойчивостПрекъсвачи на веригата, периоди за възстановяване, опашка, предотвратяване на лавинообразни заявки, подправяне на TLS
Механизъм Auto-ComboОценяване по 16 фактора, пакети от режими, самовъзстановяване
Ръководство за прокси3-степенна прокси система, пазарът 1proxy, CRUD операции с регистъра
Безплатни ниваОбединен каталог: 35 документирани периодично подновяващи се пула / 491 каталогизирани предложения с безплатно ниво
Галерия с функцииВизуална обиколка на таблото с екранни снимки
Ръководство за прокси3-степенна прокси система, пазар 1proxy, CRUD операции с регистъра
Безплатни ниваОбединен каталог: 35 документирани периодично възобновявани пула / 489 каталогизирани записа за безплатни нива
Галерия с функционалностиВизуална обиколка на таблото за управление с екранни снимки
Документация на кодовата базаПреглед на кодовата база, подходящ за начинаещи
@@ -1348,7 +1348,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п Справочник за APIВсички крайни точки с примери Спецификация OpenAPIСпецификация OpenAPI 3.0 MCP сървър110 MCP инструмента, конфигурации за IDE, клиенти за Python/TS/Go - Ръководство за MCP сървъраИнсталиране на MCP, транспорти и справочник за инструментите + Ръководство за MCP сървъраИнсталиране на MCP, транспортни механизми и справочник за инструментите A2A сървърПротокол JSON-RPC 2.0, умения, поточно предаване, управление на задачи Ръководство за A2A сървъраКарта на A2A агента, задачи, умения и поточно предаване @@ -1357,27 +1357,27 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п - - - + + + - + - +
ДокументОписание
ПриносНастройка на средата за разработка и насоки
Модел за разклоняване и изданияКъм кои клонове са насочени PR-ите (release/*) и какво означават main и таговете
Регистър на променитеПълна история на изданията по версии
Принос към проектаНастройка и насоки за разработка
Модел за разклоняване и изданияКъм кои клонове са насочени PR заявките (release/*) и какво означават main и етикетите
Дневник на променитеПълна история на изданията за всяка версия
Политика за сигурностДокладване на уязвимости и практики за сигурност
Ръководство за i18nПоддръжка на 42 езика, работен процес за превод, RTL
Ръководство за i18nПоддръжка на 42 езика, процес на превод, RTL
Контролен списък за изданиеСтъпки за проверка преди издаване
План за тестово покритиеСтратегия за тестово покритие за над 39 000 статични декларации на тестове в над 5 100 проследявани тестови файла
План за покритиеСтратегия за тестово покритие за над 39 000 статични декларации на тестове в над 5 100 проследявани тестови файла

-# ⭐ Водещи участници +# ⭐ Водещи сътрудници -> OmniRoute се оформя от общност с отворен код, изпълнена с ентусиазъм. Тези хора са направили изключителен принос, който пряко влияе върху качеството, стабилността и обхвата на проекта. **Благодарим ви.** +> OmniRoute се оформя от страстна общност с отворен код. Тези хора са направили изключителен принос, който пряко влияе върху качеството, стабилността и обхвата на проекта. **Благодарим ви.** -### Външни участници по брой слети заявки за изтегляне +### Външни сътрудници по брой слети pull заявки - + @@ -1401,9 +1401,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п
МястоУчастникСлети PR-и~Променени редове
МястоСътрудникСлети PR заявки~Променени редове
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Данните са фиксирани към последния комит dafb4ae808 в активния клон release/v3.8.50, със сливания до 2026-08-24 05:26:03 UTC. Страницираното преброяване чрез GitHub GraphQL съдържа 5 911 слети PR-а: 2 707 от собственика на хранилището, 179 от Dependabot и 3 025 външни PR-а от 535 различни участници. „Променени редове“ представлява сбора от добавянията и изтриванията в GitHub и включва генерирани файлове, lockfile файлове, каталози, преводи и документация; това е обемът на промените, а не броят написани редове код. Равните резултати на граничната позиция са запазени. +Данните са фиксирани към актуалния връх dafb4ae808 на release/v3.8.50, със сливания до 2026-08-24 05:26:03 UTC. Страницираното преброяване чрез GitHub GraphQL съдържа 5 911 слети PR заявки: 2 707 от собственика на хранилището, 179 от Dependabot и 3 025 външни PR заявки от 535 различни сътрудници. „Променени редове“ представлява сбора от добавянията и изтриванията в GitHub и включва генерирани файлове, lockfiles, каталози, преводи и документация; това е обемът на промените, а не авторски LOC. Равните резултати на границата са запазени. -### Комити с авторство, приписано от GitHub +### Комити, приписани от GitHub @@ -1412,42 +1412,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п backryun
backryun
- 🥇 220 комита, приписани от GitHub + 🥇 220 приписани от GitHub комита @@ -1456,42 +1456,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 също го п Dizzle
Dizzle
- 🏅 69 комита, приписани от GitHub · поделено 6-о място + 🏅 69 приписани от GitHub комита · поделено 6-о място
Paijo
Paijo

- 🥈 219 комита, приписани от GitHub + 🥈 219 приписани от GitHub комита
Randi
Randi

- 🥉 108 комита, приписани от GitHub + 🥉 108 приписани от GitHub комита
Ravi Tharuma
Ravi Tharuma

- 🏅 81 комита, приписани от GitHub + 🏅 81 приписани от GitHub комита
Chris
Chris

- 🏅 70 комита, приписани от GitHub + 🏅 70 приписани от GitHub комита
Markus Hartung
Markus Hartung

- 🏅 69 комита, приписани от GitHub · поделено 6-о място + 🏅 69 приписани от GitHub комита · поделено 6-о място
Jan Leon
Jan Leon

- 🏅 64 комита, приписани от GitHub + 🏅 64 приписани от GitHub комита
zenobit
zenobit

- 🏅 62 комита, приписани от GitHub + 🏅 62 приписани от GitHub комита
Bob.Hou
Bob.Hou

- 🏅 51 комита, приписани от GitHub · поделено 10-о място + 🏅 51 приписани от GitHub комита · поделено 10-о място
Xiangzhe
Xiangzhe

- 🏅 51 комита, приписани от GitHub · поделено 10-о място + 🏅 51 приписани от GitHub комита · поделено 10-о място
-Проверено отново на 2026-08-24 06:14:31 UTC: комити, приписани от GitHub, отчетени от API за сътрудници на хранилището за клона по подразбиране release/v3.8.50. API върна 525 самоличности (415 потребители, 2 бота, 108 анонимни); тази таблица изключва поддържащия проекта, ботовете и анонимните самоличности и запазва поделените позиции. Тя се различава както от класацията по слети PR по-горе, така и от преброяването на 639 души въз основа на Git метаданни по-долу. +Проверено отново на 2026-08-24 06:14:31 UTC: приписани от GitHub комити, отчетени от API за сътрудници на хранилището за клона по подразбиране release/v3.8.50. API върна 525 самоличности (415 потребители, 2 бота, 108 анонимни); тази таблица изключва поддържащия проекта, ботовете и анонимните самоличности и запазва поделените места. Тя се различава както от класацията по слети PR по-горе, така и от преброяването на 639 души въз основа на Git метаданни по-долу. -> 🙏 Функционалностите, корекциите на грешки и подобренията на инфраструктурата, създадени от тези сътрудници, са **основна част** от това, което прави OmniRoute надежден и богат на функционалности. Всяка заявка за сливане, всеки тестов случай и всеки файл за i18n превод имат значение. Отвореният код се изгражда от хора като тях. +> 🙏 Функционалностите, корекциите на грешки и подобренията на инфраструктурата, създадени от тези сътрудници, са **основна част** от това, което прави OmniRoute надежден и богат на функционалности. Всяка заявка за изтегляне, всеки тестов случай и всеки файл с i18n превод са от значение. Отвореният код се изгражда от хора като тях.
diff --git a/docs/i18n/bg/SECURITY.md b/docs/i18n/bg/SECURITY.md index 3f8e5cb2a50a..9fad7d63ab33 100644 --- a/docs/i18n/bg/SECURITY.md +++ b/docs/i18n/bg/SECURITY.md @@ -220,19 +220,21 @@ docker run -d \ 10. **Стойностите по време на изпълнение за `exec()` / `spawn()` трябва да се подават чрез опцията `env`** — никога не вмъквайте чрез интерполация външни пътища или ненадеждни стойности в скриптове, предавани на shell. Справка: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Предпочитайте библиотеки със сигурни настройки по подразбиране** — вижте [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Използвайте първо тях, преди да създавате собствено решение. -## Констатации на скенери за веригата за доставки (Socket.dev / Snyk / подобни) +## Констатации от скенери за веригата за доставки (Socket.dev / Snyk / подобни) -Публикуваният npm артефакт `omniroute` включва компилацията на Next.js с `output: "standalone"`, което означава, че всеки обработчик на маршрути — включително документираните привилегировани функционалности (MITM, импортиране от Zed, Cloud Sync, вграден надзорник на услуги) — попада в минифицирани фрагменти `.next/server/*.js`. Евристичните скенери за веригата за доставки често съпоставят тези фрагменти със сигнатури на зловреден софтуер. +> **Бележка за обхвата:** `socket.yml` в корена на хранилището единствено определя `projectIgnorePaths` за извършваното от страна на регистъра сканиране след публикуване на публикувания npm артефакт от Socket.dev — това не е задължителна CI/PR проверка за сливане. Нито един работен процес в `.github/workflows`, скрипт в `package.json` или цел в `Makefile` не извиква Socket.dev. -Конфигурацията на скенера, която използваме, се намира в [`socket.yml`](socket.yml) в корена на хранилището (формат v2 на GitHub App на Socket.dev — вижте ). Тя изрично изключва директории, които не се разпространяват (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` и др.), така че скенерът да отчита само пътища в кода, които действително достигат до потребителите на публикувания пакет — самото сканиране се извършва от GitHub App на Socket, която прочита този файл, а не от работен процес в това хранилище. +Публикуваният npm артефакт `omniroute` включва компилацията на Next.js с `output: "standalone"`, което означава, че всеки обработчик на маршрут — включително документираните привилегировани функционалности (MITM, импортиране от Zed, Cloud Sync, вграден надзорник на услуги) — попада в минифицираните фрагменти `.next/server/*.js`. Евристичните скенери за веригата за доставки често съпоставят тези фрагменти с шаблони от сигнатури за зловреден софтуер. -За всяка категория констатации поддържаме декларация от отговорника за всяка отделна констатация: +Използваната от нас конфигурация на скенера се намира в [`socket.yml`](socket.yml) в корена на хранилището (формат v2 на GitHub App на Socket.dev — вижте ). Тя изрично изключва директории, които не се разпространяват (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` и т.н.), така че скенерът да докладва само за пътища в кода, които действително достигат до потребителите на публикувания пакет — самото сканиране се задейства от GitHub App на Socket, който прочита този файл, а не от работен процес в това хранилище. + +За всяка категория констатации поддържаме удостоверение от отговорник за всяка отделна констатация: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - съпоставка за всяка констатация: файл с изходен код ↔ маркиран фрагмент ↔ поведение ↔ мярка за ограничаване, приложена във v3.8.6. -- Блокове `SECURITY-AUDITOR-NOTE:` в изходния код при всяка маркирана функция, които препращат към същия документ. + карта за всяка констатация: файл с изходен код ↔ маркиран фрагмент ↔ поведение ↔ приложена мярка за ограничаване във v3.8.6. +- Блоковете `SECURITY-AUDITOR-NOTE:` в изходния код при всяка маркирана функция препращат към същия документ. -За потребители, чиито конвейери не позволяват предупреждението да бъде смекчено: компилирайте с `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Това заменя четирите чувствителни модула със заглушки, които по време на изпълнение връщат HTTP 503 `feature-disabled`, така че привилегированите пътища в кода физически да отсъстват от пакета. Вижте [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) за процедурата за публикуване. +За потребители, чиито процеси не позволяват смекчаване на предупреждението: компилирайте с `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Това заменя четирите чувствителни модула със заместители, които по време на изпълнение връщат HTTP 503 `feature-disabled`, така че привилегированите пътища в кода физически да отсъстват от пакета. Вижте [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) за процедурата по публикуване. ## Препратки diff --git a/docs/i18n/bg/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/bg/docs/architecture/CODEBASE_DOCUMENTATION.md index eb97005ae5d1..84e14d38d72c 100644 --- a/docs/i18n/bg/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/bg/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,9 +434,9 @@ server/ --- -## 4. `open-sse/` — Работно пространство на стрийминг енджина +## 4. `open-sse/` — Работно пространство на стрийминг ядрото -Отделно npm работно пространство, публикувано като `@omniroute/open-sse`. Отговаря за обработката на заявки, изпълнителите, транслаторите, услугите, трансформатора и MCP сървъра. +Отделно npm работно пространство, публикувано като `@omniroute/open-sse`. Отговаря за обработката на заявки, изпълнителите, трансляторите, услугите, трансформатора и MCP сървъра. ``` open-sse/ @@ -448,31 +448,31 @@ open-sse/ ├── handlers/ Обработчици на заявки (чат, вграждания, аудио, изображения, …) ├── executors/ 108 специфични за доставчиците HTTP изпълнители ├── translator/ Преобразуване на формати (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Трансформатор на потоци Responses API ↔ Chat Completions -├── services/ Над 80 модула за услуги (комбинации, резервни варианти, квоти, идентичност, …) +├── transformer/ Трансформатор на поток Responses API ↔ Chat Completions +├── services/ Над 80 сервизни модула (комбинации, резервни механизми, квоти, идентичност, …) ├── utils/ Помощни инструменти за стрийминг, TLS клиент, AWS SigV4, прокси извличане, … └── mcp-server/ MCP сървър (3 транспорта, 33 обхвата, 110 инструмента) ``` ### 4.1 `open-sse/handlers/` -| Обработчик | Предназначение | -| ----------------------- | ------------------------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Основен чат конвейер (кеш, ограничаване на честотата, комбинирано маршрутизиране, диспечиране към изпълнител) | -| `responsesHandler.ts` | Входна точка на OpenAI Responses API | -| `embeddings.ts` | Векторни представяния | -| `imageGeneration.ts` | Генериране на изображения | -| `audioSpeech.ts` | Преобразуване на текст в реч | -| `audioTranscription.ts` | Преобразуване на реч в текст | -| `videoGeneration.ts` | Генериране на видео | -| `musicGeneration.ts` | Генериране на музика | -| `rerank.ts` | Пренареждане | -| `moderations.ts` | Модериране | -| `search.ts` | Търсене в уеб | -| `sseParser.ts` | Парсър за SSE събития | -| `usageExtractor.ts` | Извличане на броя токени от потоци от външни доставчици | -| `responseSanitizer.ts` | Премахване на специфичен за доставчика шум | -| `responseTranslator.ts` | Свързващ слой между отговора на доставчика и слоя за транслиране | +| Обработчик | Предназначение | +| ----------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Основен конвейер за чат (кеш, ограничаване на честотата, маршрутизиране на комбинации, изпращане към изпълнител) | +| `responsesHandler.ts` | Входна точка за OpenAI Responses API | +| `embeddings.ts` | Вграждания | +| `imageGeneration.ts` | Генериране на изображения | +| `audioSpeech.ts` | Преобразуване на текст в реч | +| `audioTranscription.ts` | Преобразуване на реч в текст | +| `videoGeneration.ts` | Генериране на видео | +| `musicGeneration.ts` | Генериране на музика | +| `rerank.ts` | Повторно класиране | +| `moderations.ts` | Модериране | +| `search.ts` | Търсене в мрежата | +| `sseParser.ts` | Анализатор на SSE събития | +| `usageExtractor.ts` | Извличане на броя токени от потоците нагоре по веригата | +| `responseSanitizer.ts` | Премахване на специфичен за доставчика шум | +| `responseTranslator.ts` | Свързващ слой между отговора на доставчика и слоя за транслация | ### 4.2 `open-sse/executors/` @@ -484,19 +484,19 @@ open-sse/ `pollinations`, `qoder`, `vertex`, `devin-desktop`, както и `claudeIdentity.ts` (споделен помощен модул за идентичност) и `index.ts` (регистър). -> Забележка: доставчиците, които не са изброени тук, се обслужват от `default.ts` чрез общия -> изпълнител, съвместим с OpenAI. Пълният каталог на доставчиците (355 доставчици) се намира в +> Забележка: доставчиците, които не са изброени тук, се обслужват от `default.ts` чрез универсалния +> OpenAI-съвместим изпълнител. Пълният каталог с доставчици (355 доставчици) се намира в > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Транслиране по модела „център и лъчи“ (OpenAI е центърът). +Транслация по модел „център и спици“ (OpenAI е центърът). -- **9 транслатора на заявки** (`translator/request/`): +- **9 транслятора на заявки** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. -- **9 транслатора на отговори** (`translator/response/`): +- **9 транслятора на отговори** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. @@ -509,37 +509,37 @@ open-sse/ ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — базиран на `TransformStream` конвертор между Responses API ↔ Chat +- `responsesTransformer.ts` — базиран на `TransformStream` преобразувател между Responses API ↔ Chat Completions (използван от универсалния маршрут `responses/`). ### 4.5 `open-sse/services/` -Основни компоненти (пълният списък е в `open-sse/services/`): - -| Област | Файлове | -| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Комбинирано маршрутизиране | `combo.ts` (19 стратегии), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Автоматичен комбиниран механизъм | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Устойчивост | `accountFallback.ts` (период на изчакване + блокиране), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Квоти | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Кеширане | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Интелигентно маршрутизиране | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Обработка на модели | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Компресиране | `compression/` — цялостно свързване на механизма за компресиране | -| Токени + сесии | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Ниво / манифест | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / мрежа | `ipFilter.ts`, `webSearchFallback.ts` | -| Пакетна обработка | `batchProcessor.ts` | -| Използване | `usage.ts` | +Основни компоненти (пълният списък се намира в `open-sse/services/`): + +| Аспект | Файлове | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Комбинирано маршрутизиране | `combo.ts` (19 стратегии), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Автоматичен Combo механизъм | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Устойчивост | `accountFallback.ts` (период на изчакване + блокиране), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Квоти | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Кеширане | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Интелигентно маршрутизиране | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Обработка на модели | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Компресиране | `compression/` — пълно свързване на механизма за компресиране | +| Токени + сесии | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Ниво / манифест | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / мрежа | `ipFilter.ts`, `webSearchFallback.ts` | +| Пакетна обработка | `batchProcessor.ts` | +| Използване | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 уникални инструмента**, свързани в `server.ts` (45 канонични в `schemas/tools.ts` + модули за памет, умения, GitHub умения, пул, геймификация, плъгини, Notion, Obsidian, - локален корпус и компресиране — обединението е преброено чрез `countUniqueMcpTools`). + локален корпус и компресиране — обединението се преброява чрез `countUniqueMcpTools`). - **3 транспорта**: stdio, HTTP Streamable, SSE. -- **33 обхвата**, прилагани по време на изпълнение — базовият списък е в `src/shared/constants/mcpScopes.ts`, а пълният набор е обединението от обхватите, декларирани от всеки модул с инструменти. -- Таблица за одит: `mcp_tool_audit` (попълва се от `audit.ts`). +- **33 обхвата**, налагани по време на изпълнение — основният списък е в `src/shared/constants/mcpScopes.ts`, а пълният набор е обединението на обхватите, декларирани от всеки модул с инструменти. +- Таблица за одит: `mcp_tool_audit` (попълвана от `audit.ts`). - Файлове: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, @@ -549,20 +549,20 @@ open-sse/ ### 4.7 `open-sse/config/` Регистри на доставчици (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), регистри на модели по формат (`audioRegistry.ts`, +`providerHeaderProfiles.ts`), регистри на модели за отделните формати (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), помощни компоненти за идентичност (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), -помощни компоненти за идентификационни данни (`credentialLoader.ts`, `codexClient.ts`) и облачни +помощни компоненти за удостоверителни данни (`credentialLoader.ts`, `codexClient.ts`) и облачни адаптери (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). ### 4.8 `open-sse/utils/` -Примитиви за поточно предаване и помощни инструменти за доставчици: `stream.ts`, `streamHandler.ts`, +Примитиви за поточно предаване и помощни модули за доставчици: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, @@ -655,7 +655,7 @@ bin/ ## 8. `scripts/` -Организирана в 6 подпапки според предназначението. +Организирана е в 6 подпапки според предназначението им. - **`scripts/build/`** — `build-next-isolated.mjs`, `prepublish.ts`, `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, diff --git a/docs/i18n/bg/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/bg/docs/architecture/RESILIENCE_GUIDE.md index b7d973da171b..dbbc3d09e405 100644 --- a/docs/i18n/bg/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/bg/docs/architecture/RESILIENCE_GUIDE.md @@ -69,11 +69,11 @@ OmniRoute има три отделни, но свързани механизма ## 2. Период на изчакване за връзка -**Обхват:** единична връзка/акаунт/ключ на доставчик. +**Обхват:** една връзка/акаунт/ключ към доставчик. -**Цел:** пропускане на един проблемен ключ, докато другите връзки за същия доставчик продължават да обслужват заявки. +**Цел:** пропускане на един проблемен ключ, докато останалите връзки към същия доставчик продължават да обслужват заявки. -**Имплементация:** +**Реализация:** - Маркиране като недостъпен: `src/sse/services/auth.ts::markAccountUnavailable()` - Избор: `getProviderCredentials*` в същия файл @@ -82,65 +82,125 @@ OmniRoute има три отделни, но свързани механизма **Полета за всяка връзка:** -- `rateLimitedUntil` — времева отметка, до която продължава периодът на изчакване +- `rateLimitedUntil` — времеви маркер, до който трае периодът на изчакване - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — брояч за експоненциално отстъпване +- `backoffLevel` — брояч за експоненциалното отлагане **Периоди на изчакване по подразбиране:** -- Базов период за OAuth: 5s -- Базов период за API ключ: 3s -- 429 за API ключ: предпочитат се `Retry-After`/заглавките за нулиране/подлежащият на анализ текст за нулиране от услугата нагоре по веригата -- Отстъпване: `baseCooldownMs * 2 ** failureIndex` +- Базов за OAuth: 5s +- Базов за API ключ: 3s +- API ключ при 429: предпочита подадените от сървъра заглавки `Retry-After`/за нулиране или текст с нулиране, който може да бъде анализиран +- Отлагане: `baseCooldownMs * 2 ** failureIndex` **Защита срещу лавинообразни едновременни заявки:** предотвратява прекомерното удължаване на периода на изчакване или двойното увеличаване на `backoffLevel` при едновременни грешки. **Крайни състояния (НЕ са периоди на изчакване):** -- `banned` — задава се при откриване на забранена ключова дума/блокиран акаунт (вижте [BAN_DETECTION](../security/BAN_DETECTION.md)), както и при три последователни отказа от услугата нагоре по веригата за отделни заявки (`request_rejected`, напр. Anthropic OAuth 403 „Request not allowed“ — `open-sse/services/requestRejectedStreak.ts`); единичен отказ само поставя връзката в период на изчакване -- `expired` (преминава в крайно състояние след ограничен брой повторни опити — `EXPIRED_RETRY_MAX = 3` с експоненциално отстъпване — така че временните OAuth грешки могат да се коригират автоматично, преди акаунтът да бъде деактивиран окончателно) +- `banned` — задава се при откриване на забранена ключова дума/блокиране на акаунт (вижте [BAN_DETECTION](../security/BAN_DETECTION.md)), както и при три последователни отказа от сървъра за отделна заявка (`request_rejected`, напр. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); единичен отказ само поставя връзката в период на изчакване +- `expired` (преминава в крайно състояние след ограничен брой повторни опити — `EXPIRED_RETRY_MAX = 3` с експоненциално отлагане — така че временните OAuth грешки могат да се отстранят автоматично, преди акаунтът да бъде деактивиран окончателно) - `credits_exhausted` -Тези състояния се запазват, докато идентификационните данни не се променят или оператор не ги нулира. Не презаписвайте крайните състояния с временно състояние на изчакване. +Тези състояния се запазват, докато идентификационните данни не се променят или оператор не ги нулира. Не презаписвайте крайните състояния със състояние на временен период на изчакване. + +**Отложено възстановяване:** когато `rateLimitedUntil` е в миналото, връзката отново става допустима за избор. При успешно използване `clearAccountError()` изчиства всички полета за грешки. -**Отложено възстановяване:** когато `rateLimitedUntil` е в миналото, връзката отново става допустима. След успешно използване `clearAccountError()` изчиства всички полета за грешки. +### Ограничение за използване на Claude OAuth: лента с по-нисък приоритет + нулиране на лимита на сесията + +**Обхват:** една абонаментна връзка към Claude (OAuth). И двете функции са с **изрично включване за всяка +връзка** (Редактиране на връзката → раздел Claude → `lowPriorityMode` / `autoLimitReset` в +`providerSpecificData`, и двете са изключени по подразбиране) и съответстват на командите `/low-priority` и +`/limit-reset` на Claude Code (комуникационният договор е извлечен от Claude Code 2.1.263). + +**Реализация:** + +- Машина на състоянията + класифициране на отговорите: `open-sse/services/claudeLowPriority.ts` +- Клиент за състоянието/заявяването на нулиране: `open-sse/services/claudeLimitReset.ts` +- Кука на изпълнителя (добавяне на заглавка + повторен опит със същия акаунт): `open-sse/executors/base.ts::execute()` +- Запазване на изричното включване: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Задействане:** 5-часовото ограничение за използване — отговор `429`, чиито заглавки съдържат +`anthropic-ratelimit-unified-status: rejected` и, когато акаунтът отговаря на условията, +`anthropic-ratelimit-unified-slow-offer: treatment`. Нищо не се изпраща преди първия отговор +429 за това ограничение; внезапен 429 без унифицирани заглавки преминава през нормалния механизъм за период на изчакване. + +**Лента с по-нисък приоритет** (`lowPriorityMode`): + +- При 429 за ограничението изпълнителят приема предложението и незабавно изпълнява повторен опит със **същия** + акаунт с `anthropic-usage-limit: slow`; лентата остава активна до обявения + `anthropic-ratelimit-unified-reset` (+60s толеранс), а всяка заявка в този прозорец съдържа + заглавката. Прихванатият 429 никога не достига до `handleChatCore`, така че връзката + **не** се поставя в период на изчакване и не се заменя с друга. +- `anthropic-ratelimit-unified-slow-status` в следващите отговори: `active` / `not_needed` + запазват лентата; при `slot_busy` (429) или `529` се изчаква посоченото от сървъра + `anthropic-ratelimit-unified-slow-retry-after` (по подразбиране 20s, ограничено до 5–600s, с ±30% случайно отклонение) + и се прави повторен опит в границите на `anthropic-ratelimit-unified-slow-max-wait` (по подразбиране 20 min, ограничено + до 1 min–6 h) — след това лентата приключва и 10-минутен период на изчакване блокира повторното приемане. Освен това + изчакването е ограничено до оставащото време от собствения срок на заявката за започване на заявката към сървъра + (`resolveFetchStartTimeout`, 10 min по подразбиране), минус резерв от 5 s: без това ограничение + максималното изчакване по подразбиране от 20 минути би надживяло заявката и изчакването би било прекъснато + по средата, показвайки `TimeoutError` вместо коректното приключване с `max_wait` + период на изчакване. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, преминаване към нов 5-часов прозорец или + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (което го приключва като + `extra_usage` при всяко състояние, тъй като платеното допълнително използване вече покрива ограничението) прекратяват лентата; + след това отговорът преминава към нормалния механизъм за период на изчакване. `budget_exhausted` се запомня до + обявеното нулиране на бюджета (≤ 8 дни). +- Проверката за ограничението се изпълнява след собствените повторни опити на изпълнителя в рамките на текущия опит, задействани от 400 (редактиране на контекста, + ограничения за мислене/усилие, автоматично научаване на параметри), така че 429 за ограничението, който се появява само при + някой от тези повторни опити, пак се прихваща, вместо да достигне до механизма за период на изчакване. +- Състоянието се съхранява в паметта за всяка връзка (рестартиране води до един допълнителен 429 за ограничението, преди предложението да бъде прието отново). + +**Нулиране на лимита на сесията** (`autoLimitReset`, изпробва се преди лентата, когато и двете са включени): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → блок `juniper_tide`; + когато `arm: "reset"` и `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` с + `{ "program": "juniper_tide" }` (UUID на организацията от + `providerSpecificData.organizationUUID`, резервен вариант чрез първоначално инициализиране). +- `result: reset|not_limited` → заявката се повтаря с пълна скорост (без заглавка за бавен режим). + `already_used` / `not_offered` запомнят `next_available_at` (по подразбиране една седмица); при + всяка грешка се прилага 15-минутно отлагане. Нулирането е веднъж седмично и продължава да се отчита към + седмичния лимит. + +Защити срещу регресии: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Афинитет на сесията (#7274) -**Обхват:** една клиентска сесия (заглавка `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`), прикрепена към една връзка за **всеки** доставчик. +**Обхват:** една клиентска сесия (заглавка `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`), фиксирана към една връзка за **всеки** доставчик. -**Цел:** запазване на многоходов агент (Claude Code, aider, персонализирани агенти) в същия акаунт между заявките, което намалява загубата на контекст при смяна на акаунт и повтарящите се 429 при студен старт от доставчици със сесийно състояние за всеки акаунт. +**Цел:** запазване на многостъпков агент (Claude Code, aider, персонализирани агенти) в същия акаунт между заявките, като се намаляват загубата на контекст при смяна на акаунта и повтарящите се 429 при студен старт от доставчици със състояние на сесията за всеки акаунт. -**Имплементация:** +**Реализация:** - Определяне на TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Избор/създаване на прикрепяне: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Избор/създаване на закрепване: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Извличане на заглавката (общо, за всеки доставчик): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Таблица с постоянно съхранявани прикрепяния: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Настройка: `sessionAffinityTtlMs` (глобален TTL в ms, `0` деактивира) — `src/lib/db/settings.ts`. Преименувано от специфичното само за Codex `codexSessionAffinityTtlMs` чрез миграцията `124_generic_session_affinity_ttl.sql`, която прехвърля всеки предварително конфигуриран TTL за Codex като новата стойност по подразбиране. +- Таблица със запазени закрепвания: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Настройка: `sessionAffinityTtlMs` (глобален TTL в ms, `0` деактивира) — `src/lib/db/settings.ts`. Преименувана от специфичната за Codex `codexSessionAffinityTtlMs` чрез миграцията `124_generic_session_affinity_ttl.sql`, която прехвърля всяка предварително конфигурирана TTL стойност за Codex като нова стойност по подразбиране. -Преди #7274 `resolveSessionAffinityTtlMs()` принудително връщаше `0` за всеки доставчик с изключение на `codex`, така че настройката за TTL (и заглавките на сесията) нямаха ефект никъде другаде, въпреки че механизмът за прикрепяне и извличането на заглавките вече не зависеха от конкретен доставчик. Корекцията премахна това ранно връщане; вече TTL се прилага еднакво към всеки доставчик, след като глобално бъде зададен на стойност над `0`. +Преди #7274 `resolveSessionAffinityTtlMs()` незабавно връщаше `0` за всеки доставчик освен `codex`, така че настройката за TTL (и заглавките на сесията) нямаха ефект никъде другаде, въпреки че механизмът за закрепване и извличането на заглавките вече не зависеха от конкретен доставчик. Корекцията премахна това преждевременно връщане; TTL вече се прилага еднакво към всеки доставчик, след като бъде зададена глобално стойност над `0`. -Трите заглавки за афинитет на сесията никога не се препращат нагоре по веригата — изпълнителите изграждат собствените си заглавки към услугата нагоре по веригата от нулата, вместо да препращат клиентските заглавки, така че това остава само вътрешен идентификатор за корелация. +Трите заглавки за афинитет на сесията никога не се препращат нагоре по веригата — изпълнителите изграждат собствените си заглавки за горната страна от нулата, вместо да препращат клиентските заглавки, така че те остават единствено вътрешен идентификатор за корелация. -### Ексклузивни наеми на връзки за управлявани сесии +### Ексклузивни наеми на управлявани връзки за сесии -**Обхват:** един активен управляван HTTP клиент/сесия притежава една допустима OmniRoute връзка. +**Обхват:** един активен управляван HTTP клиент/сесия притежава една отговаряща на условията връзка на OmniRoute. -**Цел:** осигуряване на устойчиво ексклузивно притежание на връзка за клиенти, които се нуждаят от строга граница при маршрутизиране между заявките. Това се различава от афинитета на сесията, който е меко предпочитание за непрекъснатост: ексклузивният наем съхранява постоянно състоянието на жизнения цикъл в SQLite, налага глобална уникалност на активния собственик и активната връзка и отхвърля остаряло поколение преди изпращането към доставчика. +**Цел:** осигуряване на трайно ексклузивно притежание на връзка за клиенти, които се нуждаят от строга граница за маршрутизиране между заявките. Това се различава от афинитета на сесията, който представлява меко предпочитание за непрекъснатост: ексклузивният наем съхранява състоянието на жизнения цикъл в SQLite, налага глобална уникалност на активния собственик и активната връзка и отхвърля остаряло поколение преди изпращане към доставчика. -Функционалността се включва по желание за всеки API ключ. Управляваният ключ трябва да има обхвата `lease:exclusive` и изричен непразен списък `allowedConnections`. Всеки HTTP клиент може да използва крайната точка за жизнения цикъл; не се изискват име на клиент, потребителски агент, доставчик, OAuth метод или модел. Наемът притежава връзка, а не модел, така че промяната на модела запазва обвързването, докато връзката остава допустима при обичайните условия. Обичайните правила за модел, квота, изправност, период на изчакване и списък с разрешения остават водещи и могат да прехвърлят същото поколение към друга свободна допустима връзка. +Функционалността се активира по избор за всеки API ключ. Управляваният ключ трябва да има обхвата `lease:exclusive` и изричен непразен списък `allowedConnections`. Всеки HTTP клиент може да използва крайната точка за жизнения цикъл; не се изискват име на клиент, user-agent, доставчик, OAuth метод или модел. Наемът притежава връзка, а не модел, така че промяната на модела запазва обвързването, докато връзката продължава да отговаря на обичайните условия за допустимост. Стандартните правила за модел, квота, изправност, период на изчакване и списък с разрешения остават с по-висок приоритет и могат да прехвърлят същото поколение към друга свободна връзка, отговаряща на условията. -Жизненият цикъл е `POST /api/v1/session-leases` с JSON действия `acquire`, `renew` и `release`. Управляваните заявки за инференция подават непрозрачната стойност `X-OmniRoute-Lease-Owner` и точната `X-OmniRoute-Lease-Generation`. Собственикът използва `vlo_`, последвано от 43 base64url знака; съхранява се само неговият SHA-256 хеш. Всяка крайна проверка преди изпращане също обвързва ID на удостоверения API ключ и ID на активната връзка. Заглавките за управление на наема се премахват от регистрационните файлове, запазените моментни снимки на заявките и заглавките на изпълнителя към услугата нагоре по веригата. +Жизненият цикъл използва `POST /api/v1/session-leases` с JSON действия `acquire`, `renew` и `release`. Управляваните заявки за извод подават непрозрачната стойност `X-OmniRoute-Lease-Owner` и точната стойност `X-OmniRoute-Lease-Generation`. Собственикът използва префикс `vlo_`, последван от 43 base64url знака; съхранява се само неговият SHA-256 хеш. Всяка окончателна граница при изпращане обвързва също идентификатора на удостоверения API ключ и идентификатора на активната връзка. Контролните заглавки на наема се премахват от регистрационните файлове, запазените моментни снимки на заявките и заглавките на изпълнителите към горната страна. -Ако обичайното маршрутизиране има допустими управлявани кандидати, но всеки свободен кандидат е зает от чужд активен наем, OmniRoute връща HTTP `429`, код за липса на капацитет за наем, състояние на изчакване за капацитет и ограничен `Retry-After`, изведен от най-ранното релевантно изтичане. Обичайната липса на допустими кандидати не е конфликт за наем и запазва съществуващата семантика за грешки при маршрутизиране. +Ако обичайното маршрутизиране разполага с отговарящи на условията управлявани кандидати, но всеки свободен кандидат е зает от чужд активен наем, OmniRoute връща HTTP `429`, код за липса на капацитет за наем, състояние на изчакване за капацитет и ограничена стойност `Retry-After`, изчислена от най-ранното приложимо изтичане. Обичайната липса на отговарящи на условията кандидати не представлява конфликт за наем и запазва съществуващата семантика за грешки при маршрутизиране. Свързаните механизми остават отделни: -- Заетостта на OAuth сесии е локално за процеса меко разпределение за OAuth акаунти. +- Заетостта на OAuth сесиите представлява локално за процеса меко разпределение за OAuth акаунти. - Семафорите на акаунтите предоставят разрешения за едновременни заявки и приключват при завършване на заявката. -- Ексклузивните наеми на връзки за управлявани сесии представляват устойчиво притежание в рамките на жизнения цикъл с проверка на поколението. +- Ексклузивните наеми на управлявани връзки за сесии представляват трайно притежание за целия жизнен цикъл с граница по поколение. --- @@ -269,32 +329,57 @@ _състояние_ на блокиранията е временно. --- -## 5. Контрол на допускането до опашката със заявки (v3.8.49 · проблем #6593) - -**Обхват**: локалната опашка за ограничаване на честотата за всяка двойка доставчик+връзка (`open-sse/services/rateLimitManager.ts`, -реализирана чрез Bottleneck), намираща се един слой под трите механизма по-горе. - -**`maxWaitMs` е наследено персистирано име за изтичане на времето за изпълнение.** -`resilienceSettings.requestQueue.maxWaitMs` се подава към Bottleneck като -`expiration` на задача, чийто таймер се стартира едва след диспечирането. Следователно то ограничава -управляваното от ограничителя изпълнение, а не времето, прекарано в локалната опашка. Изтичането на времето -се представя като доверено локално `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504); -предишното име на кода за изтичане на времето в опашката се приема само за доверена вътрешна -обратна съвместимост. Стойността по подразбиране е 15000ms; заменете я чрез -`RATE_LIMIT_MAX_WAIT_MS` (променлива на средата) или таблото за управление (**Настройки → Устойчивост**, -максимум 1–30000ms в потребителския интерфейс). Престоят в опашката няма времеви лимит; използвайте -`maxQueueDepth` по-долу, за да ограничите броя на чакащите заявки. - -**`maxQueueDepth` — незадължително ограничение за допускане (ново).** `resilienceSettings.requestQueue.maxQueueDepth` -ограничава броя на заявките, които могат едновременно да чакат на опашка (все още недиспечирани) за една -двойка доставчик+връзка. Когато опашката вече съдържа `maxQueueDepth` -заявки, нова заявка се отхвърля незабавно с типизирана грешка +## 5. Контрол на допускането до опашката за заявки (v3.8.49 · проблем #6593) + +**Обхват**: локалната опашка за ограничаване на честотата за всяка комбинация доставчик+връзка (`open-sse/services/rateLimitManager.ts`, +реализирана чрез Bottleneck), едно ниво под трите механизма по-горе. + +**`maxWaitMs` ограничава чакането в опашката; `executionMaxWaitMs` ограничава изпълнението.** +Двете са умишлено разделени и нито едното не влияе върху другото. + +`resilienceSettings.requestQueue.maxWaitMs` е **бюджетът за чакане в опашката**: той +обхваща чакането за свободен слот при доставчика и последващия престой в състояние QUEUED, а таймерът му се +изчиства в момента, в който задачата напусне QUEUED и започне да се изпълнява +(`rateLimitManager.ts`, `wrappedFn`). Заявка, която го превиши, никога не достига +до сървъра нагоре по веригата. Стойността по подразбиране е 30000ms, зададена чрез `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +в `src/lib/resilience/settings.ts` и фиксирана чрез +`tests/unit/ratelimit-admission-control-6593.test.ts`, така че промяна в нея прави +този тест неуспешен, вместо този абзац неусетно да остане неактуален. + +`resilienceSettings.requestQueue.executionMaxWaitMs` е стойността, която Bottleneck +получава като `expiration` на задачата, чийто таймер започва едва след изпращането. Тя служи +като предпазен механизъм за изпълнители, които нямат собствено изчакване за достигане на сървъра нагоре по веригата, и се +увеличава до собственото изчакване на изпълнителя за започване на извличането, когато то е по-дълго, така че +да не може да прекъсне нормален отговор в процес на получаване. Стойността по подразбиране е 600000ms (10 мин). + +Подаването на бюджета на опашката към `expiration` е причината преди това неинкременталните +шлюзове да бъдат прекъсвани по време на изпълнение — те основателно работят в продължение на минути, преди да пристигнат първите байтове — +и затова изтичането на срока се представя като `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), докато бюджетът на опашката използва +кода за изтичане на времето за изчакване в опашката. Заменете някоя от стойностите чрез `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (променлива на средата) или от таблото за управление +(**Настройки → Устойчивост**). При нормализиране и двете се ограничават в диапазона 1ms–24h. + +**Приоритет и за двете:** променливата на средата задава само стойността _по подразбиране_. Стойност, +запазена в `resilienceSettings.requestQueue` (чрез таблото за управление / API корекция, съхранена +в `key_value`), има предимство пред нея, а специфична за връзката стойност +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` има предимство и пред двете. Следователно задаването +на променливата на средата в среда за внедряване, която вече има запазена стойност, +не променя нищо — вместо това изчистете или актуализирайте запазената настройка. + +Престоят в опашката се ограничава от `maxWaitMs`; `maxQueueDepth` по-долу ограничава броя +на заявителите, които могат да чакат едновременно в опашката. + +**`maxQueueDepth` — незадължителен лимит за допускане (нов).** `resilienceSettings.requestQueue.maxQueueDepth` +ограничава броя на заявките, които могат да чакат в опашката (без още да са изпратени) едновременно за една +комбинация доставчик+връзка. Когато опашката вече съдържа `maxQueueDepth` +заявки, новата заявка се отхвърля незабавно с типизирана грешка `code: "RATE_LIMIT_QUEUE_FULL"` **преди** изобщо да достигне до `limiter.schedule()` -— така отхвърлянето е евтино и се случва преди каквато и да е последваща -компресия / транслация на подканата за тази заявка. Стойността по подразбиране `0` = -деактивирано, което запазва съществуващото поведение с неограничена опашка; допустимият диапазон е 0–100000. +— така отхвърлянето е евтино и се случва преди каквато и да било последваща +компресия / превод на подканата за тази заявка. Стойността по подразбиране `0` = +изключено, което запазва съществуващото поведение с неограничена опашка; допустим диапазон 0–100000. Заменете чрез `RATE_LIMIT_MAX_QUEUE_DEPTH` (променлива на средата) или -`resilienceSettings.requestQueue.maxQueueDepth` (табло за управление/API корекция). +`resilienceSettings.requestQueue.maxQueueDepth` (корекция чрез таблото за управление/API). Самата проверка за допускане е чиста функция (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), така че @@ -304,13 +389,13 @@ _състояние_ на блокиранията е временно. > Конвейерът `open-sse/services/compression/` в това хранилище извършва > компресия на подканата/контекста в изходящата LLM заявка (`chatCore.ts`, > около блока `resolveCompressionSettings`/`selectCompressionStrategy`), -> а не компресия на HTTP отговора за генерирани тела с грешка 429 — не съществува -> съответстващ път в кода за буквален флаг за заобикаляне. Понастоящем тази стъпка за компресия на подканата -> също се изпълнява _преди_ `withRateLimit()` в конвейера за заявки, така че -> пренареждането с цел пропускането ѝ при отхвърляне поради пълна опашка е отделна и по-мащабна +> а не компресия на HTTP отговорите за генерирани тела с код 429 — няма +> съответстващ път в кода за буквален флаг за заобикаляне. Тази стъпка за компресия на подканата +> понастоящем също се изпълнява _преди_ `withRateLimit()` в конвейера за заявки, така че +> промяната на реда с цел пропускането ѝ при отхвърляне поради пълна опашка е отделна, по-мащабна > промяна извън обхвата на този проблем; тя умишлено **не** беше реализирана -> тук и е оставена за последваща работа, ако спестяването на процесорни ресурси оправдава -> риска от пренареждането. +> тук и е оставена като последваща задача, ако спестяването на процесорни ресурси си заслужава +> риска от промяна на реда. --- diff --git a/docs/i18n/bg/docs/architecture/admission-lanes.md b/docs/i18n/bg/docs/architecture/admission-lanes.md index 57f146b835b4..bf6d45c5aec8 100644 --- a/docs/i18n/bg/docs/architecture/admission-lanes.md +++ b/docs/i18n/bg/docs/architecture/admission-lanes.md @@ -7,48 +7,51 @@ OmniRoute има **две** локални за процеса системи от канали с различни обхвати. Те са взаимнодопълващи се; операторите трябва да знаят коя от тях наблюдават. -## 1. Допускане на ниво байтове за целия процес (`chatBodyAdmission.ts`) +## 1. Допуск на ниво байтове за целия процес (`chatBodyAdmission.ts`) -- **Обхват:** пътят на буферираното тяло/heap за `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` и останалите маршрути, структурирани като чат. Предпазва - от увеличаване на използването на heap вследствие на големи тела от агенти за програмиране (#4380). +- **Обхват:** пътят за буферирано тяло/heap за `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` и другите маршрути с форма на чат. Предпазва + от увеличаване на използването на heap при големи тела от coding agent-и (#4380). - **Един глобален контролер за процеса, а не отделни канали за всеки ключ (#10110).** Всеки API ключ (хеширан) или `anonymous` сесия се допуска спрямо **един и същ** споделен бюджет — - хешираният идентификатор на сесията се използва САМО като ключ за справедливо планиране (циклично - разпределяне между изчакващите), никога като сегмент на капацитета. Предишна версия на този + хешираният идентификатор на сесията се използва САМО като ключ за справедливо планиране (round-robin + разпределяне между чакащите), никога като дял от капацитета. Предишна версия на този документ описваше отделни канали за всеки ключ с независим капацитет; този модел беше - премахнат в #10110, защото позволяваше чрез фалшиви неудостоверени идентификационни данни да се - умножи ограничението за целия процес. + премахнат в #10110, тъй като позволяваше на неавтентицирани фалшиви идентификационни данни да умножават + ограничението за целия процес. - **Ограничител (#503-fanout): автоматично изведен БАЙТОВ бюджет за приемане, а не фиксиран брой - заявки.** Остарялото ограничение по брой заявки `CHAT_MAX_HEAVY_IN_FLIGHT` (по подразбиране `1` - преди тази корекция) свеждаше паралелното разпределение на агентите за програмиране (множество подагенти/CLI, - тела обичайно > 256 KB) до ефективна конкурентност от ~1, което водеше до отговори 503 + заявки.** Старото ограничение по брой заявки `CHAT_MAX_HEAVY_IN_FLIGHT` (по подразбиране `1` + преди тази корекция) свеждаше fan-out на coding agent-ите (множество подагенти/CLI инструменти, + тела обичайно > 256 KB) до ефективна конкурентност от ~1, което водеше до 503 при напълно нормално натоварване. Сега то се прилага само когато оператор изрично зададе `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Ако не е зададено, допускането вместо това се ограничава от `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — бюджет, автоматично изведен от реалния лимит на паметта на процеса (`src/shared/middleware/admissionBudget.ts`): - 25% от по-строгия лимит измежду лимита на V8 heap и всеки лимит на cgroup/контейнера, - разделени на коефициент 8x за временно увеличаване, ограничени между 8 MiB и - 2 GiB. Изрично зададените стойности използват същите граници. Това се мащабира автоматично от - контейнер с 512 MB до настолен компютър с 32 GB без настройване чрез променливи на средата. Тяло, което не може - да се побере в ефективния бюджет, се отхвърля незабавно с `413 body_exceeds_budget`; - само конкуренцията между тела, които поотделно могат да бъдат обслужени, влиза в ограничената - справедлива опашка. Механизъм за проследяване в реално време на натиска върху ресурсите чрез множество сигнали (съотношение на V8 heap, + 25% от по-малкия лимит между V8 heap и който и да е cgroup/container лимит, + разделени на 8x коефициент за временно увеличение, ограничени между 8 MiB и + 2 GiB. Изричните замени използват същите граници. Това се мащабира автоматично от + 512 MB контейнер до 32 GB настолен компютър без настройване чрез променливи на средата. Тяло, което не може + да се вмести в ефективния бюджет, се отхвърля незабавно с `413 body_exceeds_budget`; + само конкуренцията между тела, всяко от които може да бъде обслужено самостоятелно, влиза в ограничената + опашка за справедливо обслужване. Активен тракер за ресурсно натоварване с множество сигнали (съотношение на V8 heap, cgroup, PSI, OOM събития — `open-sse/utils/resourcePressurePolicy.ts`) съкращава - ограниченото изчакване при `high` натиск и незабавно отхвърля натоварването с - `503 resource_pressure` при `critical` натиск, още преди да бъдат приети каквито и да е - байтове. + ограниченото изчакване при `high` натоварване и отхвърля незабавно с + `503 resource_pressure` при `critical` натоварване, още преди да бъдат приети каквито и да е + байтове. PSI се чете от cgroup `memory.pressure` на тази единица, когато е наличен + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` обхваща + целия хост и се използва само като резервен вариант на физически сървър / cgroup v1, така че хост, + използващ swap, да не може да предизвика 503 за неактивен контейнер. - **Настройване:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — заместваща стойност за автоматично изведения байтов бюджет - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — остаряло ограничение по брой заявки, само при изрично включване + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — замяна на автоматично изведения байтов бюджет + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — старо ограничение по брой заявки, само при изрично активиране - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — изчакване в опашката преди 503 (по подразбиране 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — предпазен клапан за heap според байтовете в опашката (по подразбиране 4 MB) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — heap клапан за байтовете в опашката (по подразбиране 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — остарели - операции без действие след #10110 (приемат се за съвместимост на конфигурацията, но се игнорират) + no-op настройки от #10110 насам (приемат се за съвместимост на конфигурацията, но се игнорират) - **Отчети:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — включително - допълненията от #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` + добавените в #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` и `countCapEnabled` - (false при внедряване по подразбиране — потвърждава, че реално ограничава байтовият бюджет, а не остарялото + (false при внедряване по подразбиране — потвърждава, че действително ограничава байтовият бюджет, а не старото ограничение по брой). ## 2. Адаптивни виртуални ленти по време на изпълнение (`open-sse/services/admission`) diff --git a/docs/i18n/bg/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/bg/docs/frameworks/EMBEDDED-SERVICES.md index 63f2e9595eb5..bfc323be58e1 100644 --- a/docs/i18n/bg/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/bg/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,11 +5,11 @@ --- > **Версия:** v3.8.44 -> **Последна актуализация:** 2026-07-03 -> **Аудитория:** Инженери, които добавят, поддържат или отстраняват грешки във вградени услуги (9Router, CLIProxyAPI, Mux, Bifrost). +> **Последна актуализация:** 2026-09-09 +> **Аудитория:** Инженери, които добавят, поддържат или отстраняват грешки във вградени услуги (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Вградените услуги са локално инсталирани помощни процеси, които OmniRoute инсталира, контролира и -предоставя като пълноправни цели за маршрутизиране. За разлика от външните доставчици (които са достъпни през интернет +Вградените услуги са локално инсталирани помощни процеси, които OmniRoute инсталира, управлява и +предоставя като пълноправни цели за маршрутизиране. За разлика от външните доставчици (които се достъпват през интернет чрез API ключове), вградените услуги се изпълняват на същата машина като OmniRoute и комуникират през loopback интерфейса. --- @@ -31,33 +31,34 @@ ### Защо вградени услуги? -Вградени са пет услуги: +Вградени са шест услуги: -| Услуга | npm пакет | Порт по подразбиране | Предназначение | -| --------------- | ------------------------------------------ | :------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI маршрутизатор, който OmniRoute може да използва като поддоставчик. Моделите се предоставят като `9router/{sub}/{model}` | -| **CLIProxyAPI** | Двоичен файл от GitHub версия (`cliproxy`) | 8317 | Локален прокси адаптер за потоци за удостоверяване на Anthropic CLI. Осигурява резервно маршрутизиране при изтичане на OAuth токените | -| **Mux** | `mux` (без интерфейс `mux server`) | 8322 | Локален демон за оркестрация на агенти (coder/mux). Управлява се само жизненият му цикъл — не е цел за маршрутизиране (без LLM проксиране). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend за препредаване на Go AI шлюз. Когато работи, се избира автоматично от маршрута за препредаване (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Прокси за абонамент за Claude — алтернатива/резервен вариант на CLIProxyAPI за трафик във формат Claude Code; инжектираният ключ става `DARIO_ADMIN_TOKEN`, който ограничава достъпа до OAuth контролния панел `/admin/*` | +| Услуга | npm пакет | Порт по подразбиране | Предназначение | +| --------------- | ------------------------------------------- | :------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | AI маршрутизатор, който OmniRoute може да използва като поддоставчик. Моделите са достъпни като `9router/{sub}/{model}` | +| **CLIProxyAPI** | Двоичен файл от GitHub издание (`cliproxy`) | 8317 | Локален прокси адаптер за потоците за удостоверяване на Anthropic CLI. Осигурява резервно маршрутизиране при изтичане на OAuth токените | +| **Mux** | `mux` (без интерфейс `mux server`) | 8322 | Локален демон за оркестрация на агенти (coder/mux). Управлява се само жизненият му цикъл — не е цел за маршрутизиране (без LLM проксиране). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go сървърна система за препредаване през AI шлюз. Когато работи, се избира автоматично от маршрута за препредаване (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Прокси за абонамент за Claude — алтернатива/резервен вариант на CLIProxyAPI за трафик във формата на Claude Code; инжектираният ключ става `DARIO_ADMIN_TOKEN`, ограничаващ достъпа до неговия OAuth контролен слой `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Автоматизация на WhatsApp Web (Chromium без интерфейс чрез Puppeteer). Управлява се само жизненият му цикъл — не е цел за маршрутизиране. | -И петте следват един и същ модел на контрол: +И шестте следват един и същ модел на надзор: - OmniRoute ги инсталира в `DATA_DIR/services/{name}/` (изолирано от собствения `package.json` на OmniRoute) - OmniRoute ги стартира и наблюдава като дъщерни процеси -- OmniRoute инжектира временен API ключ в средата на дъщерния процес и го подменя без прекъсване на работата (когато е приложимо) -- Всички маршрути за управление (`/api/services/*`) са **LOCAL_ONLY** — достъпни са само през loopback интерфейса (твърдо правило №17) +- OmniRoute инжектира временен API ключ в средата на дъщерния процес и го сменя без прекъсване на работата (когато е приложимо) +- Всички маршрути за управление (`/api/services/*`) са **LOCAL_ONLY** — достъпни само от loopback интерфейса (строго правило №17) -### Ключови решения (от проектния план) +### Ключови решения (от плана за проектиране) -| Решение | Стойност | -| --------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| Достъп от таблото до вградения интерфейс на 9Router | Обратно прокси на `/dashboard/providers/services/9router/embed/*` | -| Механизъм за инсталиране | `npm install {package}` чрез `execFile` (без интерполация от обвивката) | -| Режим на използване | Доставчикът е регистриран като `9router/{sub}/{model}` в механизма за маршрутизиране | -| Управление на API ключове | OmniRoute ги генерира, криптира при съхранение (AES-256-GCM) и инжектира чрез променливи на средата | -| Местоположение в таблото | `/dashboard/providers/services` (три раздела) | -| Автоматично стартиране | Превключвател за всяка услуга, изключен по подразбиране | +| Решение | Стойност | +| --------------------------------------------- | ------------------------------------------------------------------------------------ | +| Достъп от таблото до собствения UI на 9Router | Обратно прокси на `/dashboard/providers/services/9router/embed/*` | +| Механизъм за инсталиране | `npm install {package}` чрез `execFile` (без интерполация от shell) | +| Режим на използване | Доставчикът е регистриран като `9router/{sub}/{model}` в системата за маршрутизиране | +| Управление на API ключове | OmniRoute генерира, криптира при съхранение (AES-256-GCM) и инжектира чрез средата | +| Местоположение в таблото | `/dashboard/providers/services` (три раздела) | +| Автоматично стартиране | Превключвател за всяка услуга, изключен по подразбиране | --- @@ -78,7 +79,7 @@ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (Next.js fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Слой 2 — API (LOCAL_ONLY — само loopback) │ +│ Слой 2 — API (LOCAL_ONLY — само през loopback) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -89,8 +90,8 @@ │ /dashboard/providers/services/9router/embed/[...path] │ │ (обратно HTTP + WebSocket прокси → 9Router upstream) │ │ │ -│ Ограничение: LOCAL_ONLY_API_PREFIXES включва "/api/services/" и │ -│ "/dashboard/providers/services/*/embed/" │ +│ Защита: LOCAL_ONLY_API_PREFIXES включва "/api/services/" и │ +│ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ извиквания в рамките на процеса ┌──────────────────────▼─────────────────────────────────────────────┐ @@ -98,11 +99,11 @@ │ │ │ ServiceSupervisor.ts Универсален надзорник (child_process.spawn)│ │ ├── инсталиране: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── стартиране: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── стартиране: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── порт: 20130 за 9Router (конфигурируем) │ -│ ├── дневници: stdio кръгов буфер 5 MB → SSE събития │ -│ ├── изправност: HTTP GET /health на всеки 2–5 s, отложено възстановяване│ +│ ├── дневници: stdio пръстеновиден буфер 5 MB → SSE събития │ +│ ├── състояние: HTTP GET /health на всеки 2–5 s, отложено възстановяване│ │ └── жизнен цикъл: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ @@ -110,8 +111,8 @@ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Периодично GET /v1/models → таблица service_models│ │ ringBuffer.ts Кръгов буфер за дневници (5 MB на услуга) │ -│ healthCheck.ts Периодична HTTP проверка на изправността │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ healthCheck.ts Периодична HTTP проверка на състоянието │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (адаптери за инсталиране) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-съвместим HTTP (loopback) @@ -119,41 +120,41 @@ │ Слой 4 — Доставчик / Маршрутизиране │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Извлича наново порта и API ключа при всяка заявка (без кеширане).│ -│ Премахва префикса "9router/" от ID на модела преди проксиране. │ -│ Връща 503 service_not_running, ако надзорникът не е в "running".│ +│ Извлича отново порта и API ключа при всяка заявка (без кеширане).│ +│ Премахва префикса "9router/" от идентификатора на модела преди проксиране.│ +│ Връща 503 service_not_running, ако надзорникът не е в състояние "running".│ │ │ │ src/shared/constants/providers.ts │ │ Запис за "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ Моделите се съхраняват като "9router/{sub}/{model}" (с префикс).│ -│ Синхронизират се на всеки 5 мин. от modelSync.ts. │ +│ Синхронизират се на всеки 5 min от modelSync.ts. │ │ │ -│ Mux се управлява САМО по отношение на жизнения цикъл (слоеве 1–3) —│ -│ това е демон за оркестрация на агенти, а не LLM прокси, затова │ -│ няма executor/provider запис в слой 4 и никога не е цел за │ -│ маршрутизиране. │ +│ Mux се управлява САМО по отношение на жизнения цикъл (слоеве 1–3) — той е демон│ +│ за оркестрация на агенти, а не LLM прокси, затова няма изпълнител/│ +│ запис за доставчик в слой 4 и никога не е цел за маршрутизиране. │ └────────────────────────────────────────────────────────────────────┘ ``` ### Ключови изходни файлове -| Файл | Роля | -| ------------------------------------------- | --------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Основен клас: жизнен цикъл, заключване, състояние, кръгов буфер | -| `src/lib/services/bootstrap.ts` | Регистрация на ниво процес и автоматично стартиране | -| `src/lib/services/registry.ts` | Singleton карта `инструмент → надзорник` | -| `src/lib/services/apiKey.ts` | Генериране на ключове, AES-256-GCM криптиране при съхранение | -| `src/lib/services/modelSync.ts` | Периодична синхронизация на модели (5 мин) + при заявка | -| `src/lib/services/ringBuffer.ts` | Кръгов буфер за логове от 5 MB с абониране чрез SSE | -| `src/lib/services/healthCheck.ts` | HTTP проверка на състоянието (конфигурируем интервал) | -| `src/lib/services/installers/ninerouter.ts` | npm инсталиране/актуализиране/деинсталиране за 9Router | -| `src/lib/services/installers/cliproxy.ts` | npm инсталиране/актуализиране/деинсталиране за CLIProxyAPI | -| `src/lib/services/installers/mux.ts` | npm инсталиране/актуализиране/деинсталиране за Mux | -| `src/app/api/services/9router/_lib.ts` | Помощна функция `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Споделена крайна точка за SSE логове | -| `open-sse/executors/ninerouter.ts` | Изпълнител за доставчик (слой 4) | +| Файл | Роля | +| ------------------------------------------- | ------------------------------------------------------------ | +| `src/lib/services/ServiceSupervisor.ts` | Основен клас: жизнен цикъл, заключване, статус, кръгов буфер | +| `src/lib/services/bootstrap.ts` | Регистрация на ниво процес и автоматично стартиране | +| `src/lib/services/registry.ts` | Singleton карта `инструмент → supervisor` | +| `src/lib/services/apiKey.ts` | Генериране на ключове, AES-256-GCM криптиране при съхранение | +| `src/lib/services/modelSync.ts` | Периодична синхронизация на модели (5 мин) + при поискване | +| `src/lib/services/ringBuffer.ts` | 5 MB кръгов буфер за логове с абонамент чрез SSE | +| `src/lib/services/healthCheck.ts` | HTTP проверка на състоянието (конфигурируем интервал) | +| `src/lib/services/installers/ninerouter.ts` | npm инсталиране/актуализиране/деинсталиране за 9Router | +| `src/lib/services/installers/cliproxy.ts` | npm инсталиране/актуализиране/деинсталиране за CLIProxyAPI | +| `src/lib/services/installers/mux.ts` | npm инсталиране/актуализиране/деинсталиране за Mux | +| `src/lib/services/installers/openwa.ts` | npm инсталиране/актуализиране/деинсталиране за open-wa | +| `src/app/api/services/9router/_lib.ts` | Помощна функция `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | Споделена SSE крайна точка за логове | +| `open-sse/executors/ninerouter.ts` | Изпълнител за доставчика (слой 4) | --- @@ -209,15 +210,15 @@ ## 4. Справочник за API -Всички маршрути под `/api/services/` са **LOCAL_ONLY** (само loopback, строго правило №17). +Всички маршрути под `/api/services/` са **LOCAL_ONLY** (само loopback, строго правило #17). Заявките, които не са от loopback, получават `403 LOCAL_ONLY` независимо от токена за удостоверяване. ### 4.1 Крайни точки на 9Router (11 маршрута) #### `POST /api/services/9router/install` -Инсталира 9Router от npm. Създава `DATA_DIR/services/9router/` със собствени -`package.json` и `node_modules/`. Не влиза в конфликт със собствените зависимости на OmniRoute. +Инсталирайте 9Router от npm. Създава `DATA_DIR/services/9router/` със собствени +`package.json` и `node_modules/`. Не влиза в конфликт със зависимостите на OmniRoute. **Тяло на заявката** (всички полета са незадължителни): @@ -231,32 +232,32 @@ **Отговори:** -| Състояние | Описание | -| --------- | -------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Невалидно тяло на заявката (неуспешна Zod валидация) | -| `409` | Вече се инсталира (заключването е заето) | -| `500` | npm install е неуспешна — вижте `message` за разбираема грешка | +| Статус | Описание | +| ------ | --------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Невалидно тяло на заявката (неуспешна Zod валидация) | +| `409` | Вече се извършва инсталиране (заключването е заето) | +| `500` | Неуспешна npm инсталация — вижте `message` за разбираема грешка | -**Бележки:** Използва `execFile('npm', [...])` — без shell, без интерполация (строго правило №13). +**Бележки:** Използва `execFile('npm', [...])` — без обвивка и без интерполация (строго правило #13). Грешките EACCES се представят като разбираеми съобщения. --- #### `POST /api/services/9router/start` -Стартира 9Router. Регистрира надзорен обект, ако още няма регистриран, след което извиква -`supervisor.start()`. Операцията е идемпотентна, когато услугата вече работи. +Стартирайте 9Router. Регистрира supervisor, ако все още не е регистриран, след което извиква +`supervisor.start()`. Идемпотентно, когато услугата вече работи. **Тяло на заявката:** няма **Отговори:** -| Състояние | Описание | -| --------- | ----------------------------------------------------------- | -| `200` | Обект `ServiceStatus` (вижте схемата по-долу) | -| `409` | 9Router не е инсталиран (`status: "not_installed"`) | -| `503` | Неуспешно стартиране (грешка в процеса — вижте `lastError`) | +| Статус | Описание | +| ------ | ----------------------------------------------------------- | +| `200` | Обект `ServiceStatus` (вижте схемата по-долу) | +| `409` | 9Router не е инсталиран (`status: "not_installed"`) | +| `503` | Неуспешно стартиране (грешка в процеса — вижте `lastError`) | **Схема на ServiceStatus:** @@ -276,23 +277,23 @@ #### `POST /api/services/9router/stop` -Спира 9Router по контролиран начин. Изпраща SIGTERM, изчаква 15 s, след което изпраща SIGKILL, ако процесът все още работи. -Операцията е идемпотентна, когато услугата вече е спряна. +Спрете 9Router по коректен начин. Изпраща SIGTERM, изчаква 15 s, след което изпраща SIGKILL, ако процесът все още работи. +Идемпотентно, когато услугата вече е спряна. **Тяло на заявката:** няма **Отговори:** -| Състояние | Описание | -| --------- | ---------------------------------- | -| `200` | `ServiceStatus` (state: "stopped") | -| `503` | Неочаквано неуспешно спиране | +| Статус | Описание | +| ------ | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Неочаквано неуспешно спиране | --- #### `POST /api/services/9router/restart` -Еквивалентно на `stop()`, последвано от `start()` в рамките на заключването на операциите. +Еквивалентно на `stop()`, последвано от `start()` при заключена операция. **Тяло на заявката:** няма @@ -302,9 +303,9 @@ #### `POST /api/services/9router/update` -Актуализира 9Router до по-нова npm версия. Ако услугата работи, първо -се спира, изпълнява се npm install (като по-новата версия се инсталира на място), а след това -услугата се стартира отново. +Актуализира 9Router до по-нова npm версия. Ако услугата работи, тя първо се спира, +изпълнява се npm инсталация (по-новата версия се инсталира на място), след което +услугата се рестартира. **Тяло на заявката** (всички полета са незадължителни): @@ -314,18 +315,18 @@ **Отговори:** -| Състояние | Описание | -| --------- | --------------------------------------------------------------- | -| `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | Невалидно тяло | -| `500` | Неуспешна npm актуализация | +| Статус | Описание | +| ------ | --------------------------------------------------------------- | +| `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | +| `400` | Невалидно тяло | +| `500` | Неуспешна npm актуализация | --- #### `POST /api/services/9router/rotate-key` Генерира нов API ключ за 9Router, криптира го при съхранение и рестартира услугата -(ако работи), за да зареди новия ключ от средата си. Старият ключ се +(ако работи), за да може тя да зареди новия ключ от средата си. Старият ключ се анулира незабавно. **Тяло на заявката:** няма @@ -337,21 +338,21 @@ | `200` | `{ keyRotated: true, restarted: boolean }` | | `500` | Неуспешна ротация | -**Сигурност:** Новият ключ никога не се връща в отговора (без изтичане на идентификационни данни). +**Сигурност:** Новият ключ никога не се връща в отговора (не се разкриват идентификационни данни). Той се съхранява криптиран (AES-256-GCM) в таблицата `version_manager`. --- #### `GET /api/services/9router/status` -Връща комбинирано текущо състояние + състояние от БД, включително метаданни за версията и визуализация на API ключа. +Връща комбинирано текущо състояние и състояние от БД, включително метаданни за версията и преглед на API ключа. **Отговори:** -| Статус | Описание | -| ------ | ------------------------------ | -| `200` | Вижте схемата по-долу | -| `500` | Неуспешно прочитане на статуса | +| Статус | Описание | +| ------ | ---------------------------------- | +| `200` | Вижте схемата по-долу | +| `500` | Неуспешно прочитане на състоянието | **Схема на отговора:** @@ -378,7 +379,7 @@ #### `POST /api/services/9router/auto-start` Превключва флага за автоматично стартиране. Когато `enabled: true`, услугата се стартира автоматично -при следващото зареждане на OmniRoute (ако услугата е инсталирана). +при следващото стартиране на OmniRoute (ако услугата е инсталирана). **Тяло на заявката:** @@ -397,21 +398,21 @@ #### `GET /api/services/9router/logs` -SSE поток от текущи журнали от цикличния буфер за stdout/stderr на 9Router. +SSE поток с текущи регистрационни съобщения от пръстеновидния буфер за stdout/stderr на 9Router. **Параметри на заявката:** | Параметър | Тип | По подразбиране | Описание | | --------- | --------- | --------------- | ------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Брой редове от хронологията, които да се изпратят първо (макс. 1000) | -| `filter` | `string` | няма | Филтър по подниз без значение на регистъра (без regex — защитен от ReDoS) | +| `tail` | `integer` | 200 | Колко реда от историята да бъдат изпратени първо (макс. 1000) | +| `filter` | `string` | няма | Филтър за подниз без значение на регистъра (без regex — защитен от ReDoS) | **SSE събития:** | Събитие | Данни | Описание | | ----------- | ----------- | ------------------------------------ | -| `snapshot` | `LogLine[]` | Първоначален край на хронологията | -| `log` | `LogLine` | Текущ ред от журнала | +| `snapshot` | `LogLine[]` | Първоначален край на историята | +| `log` | `LogLine` | Текущ ред от регистрационния файл | | `heartbeat` | `{}` | Поддържане на връзката на всеки 15 s | **Схема на LogLine:** @@ -426,91 +427,124 @@ SSE поток от текущи журнали от цикличния буфе **Отговори:** -| Статус | Описание | -| ------ | ------------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | Параметърът `filter` е твърде дълъг (> 200 знака) | -| `404` | Услугата не е намерена (супервайзорът не е регистриран) | +| Състояние | Описание | +| --------- | ------------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | Параметърът `filter` е твърде дълъг (> 200 знака) | +| `404` | Услугата не е намерена (супервайзорът не е регистриран) | --- ### 4.2 Крайни точки на CLIProxyAPI (10 маршрута) -CLIProxyAPI има същата структура на крайните точки като 9Router, но без `rotate-key`, плюс -`accounts`, `provider-expose` и `auto-restart-adopted`. Сега той получава +CLIProxyAPI има същата структура на крайните точки като 9Router, без `rotate-key`, плюс +`accounts`, `provider-expose` и `auto-restart-adopted`. Вече получава специален API ключ за равнината за данни, инжектиран при стартиране (`needsApiKey: true` в -`bootstrap.ts`, използван за синхронизация на моделите); `status` включва по-малко полета. +`bootstrap.ts`, използван за синхронизиране на моделите); `status` включва по-малко полета. -| Метод | Път | Описание | -| ------ | ----------------------------------- | ------------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Инсталиране на CLIProxyAPI от npm | -| `POST` | `/api/services/cliproxy/start` | Стартиране на CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Спиране на CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Рестартиране на CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Актуализиране до по-нова версия | -| `GET` | `/api/services/cliproxy/status` | Текущо състояние + състояние от БД (без `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Превключване на автоматичното стартиране | +| Метод | Път | Описание | +| ------ | ----------------------------------- | -------------------------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Инсталиране на CLIProxyAPI от npm | +| `POST` | `/api/services/cliproxy/start` | Стартиране на CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Спиране на CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Рестартиране на CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Актуализиране до по-нова версия | +| `GET` | `/api/services/cliproxy/status` | Състояние в реално време + състояние в БД (без `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Превключване на автоматичното стартиране | -Споделената крайна точка `GET /api/services/{name}/logs` (вижте §4.1) работи за всички -четири услуги чрез динамичния сегмент `[name]`. +Споделената крайна точка `GET /api/services/{name}/logs` (вж. §4.1) работи за всичките +четири услуги, като използва динамичния сегмент `[name]`. --- ### 4.3 Крайни точки на Mux (8 маршрута) -Mux има същата структура на крайните точки като CLIProxyAPI — няма маршрут `rotate-key` в API -интерфейса (bearer токенът се генерира по същия начин като този на 9Router чрез +Mux има същата структура на крайните точки като CLIProxyAPI — без маршрут `rotate-key` в API +интерфейса (токенът за приносител се генерира по същия начин като този на 9Router чрез `getOrCreateApiKey("mux")` и се инжектира чрез променливата на средата `MUX_SERVER_AUTH_TOKEN`, но все още няма специална крайна точка за ротация). Mux се управлява само на ниво жизнен цикъл: за разлика от 9Router, той няма изпълнител от слой 4 и никога не се регистрира като доставчик за маршрутизиране. -| Метод | Път | Описание | -| ------ | ------------------------------ | ---------------------------------------- | -| `POST` | `/api/services/mux/install` | Инсталиране на Mux от npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Стартиране на Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Спиране на Mux | -| `POST` | `/api/services/mux/restart` | Рестартиране на Mux | -| `POST` | `/api/services/mux/update` | Актуализиране до по-нова npm версия | -| `GET` | `/api/services/mux/status` | Текущо състояние + състояние от БД | -| `POST` | `/api/services/mux/auto-start` | Превключване на автоматичното стартиране | +| Метод | Път | Описание | +| ------ | ------------------------------ | ----------------------------------------- | +| `POST` | `/api/services/mux/install` | Инсталиране на Mux от npm (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Стартиране на Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Спиране на Mux | +| `POST` | `/api/services/mux/restart` | Рестартиране на Mux | +| `POST` | `/api/services/mux/update` | Актуализиране до по-нова npm версия | +| `GET` | `/api/services/mux/status` | Състояние в реално време + състояние в БД | +| `POST` | `/api/services/mux/auto-start` | Превключване на автоматичното стартиране | --- ### 4.4 Крайни точки на Bifrost (8 маршрута) -Bifrost е междинен backend за AI шлюз, написан на Go (`@maximhq/bifrost`). Той използва същата +Bifrost е релейна бекенд система за AI шлюз, написана на Go (`@maximhq/bifrost`). Тя използва същата структура на крайните точки като CLIProxyAPI (без `rotate-key` — Bifrost управлява собствените си ключове -за доставчици в `config.json` в своята директория `-app-dir`). +за доставчици в `config.json` в своята `-app-dir`). | Метод | Път | Описание | | ------ | ---------------------------------- | ------------------------------------------------------------------------------ | -| `POST` | `/api/services/bifrost/install` | Инсталира Bifrost от npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Стартира Bifrost на порт 8080 (по подразбиране) | -| `POST` | `/api/services/bifrost/stop` | Спира Bifrost | -| `POST` | `/api/services/bifrost/restart` | Рестартира Bifrost | -| `POST` | `/api/services/bifrost/update` | Актуализира до по-нова версия | +| `POST` | `/api/services/bifrost/install` | Инсталиране на Bifrost от npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Стартиране на Bifrost на порт 8080 (по подразбиране) | +| `POST` | `/api/services/bifrost/stop` | Спиране на Bifrost | +| `POST` | `/api/services/bifrost/restart` | Рестартиране на Bifrost | +| `POST` | `/api/services/bifrost/update` | Актуализиране до по-нова версия | | `GET` | `/api/services/bifrost/status` | Състояние в реално време + състояние в БД | -| `POST` | `/api/services/bifrost/auto-start` | Включва/изключва автоматичното стартиране | +| `POST` | `/api/services/bifrost/auto-start` | Превключване на автоматичното стартиране | | `GET` | `/api/services/bifrost/logs` | SSE поток от края на журнала (чрез споделения динамичен маршрут `[name]/logs`) | -**Конфигурация на маршрутизирането:** Когато `BIFROST_BASE_URL` не е зададена и управляваната инстанция на Bifrost +**Свързване за маршрутизиране:** Когато `BIFROST_BASE_URL` не е зададена и управляваната инстанция на Bifrost работи, `getBifrostRoutingConfig()` (в `routingBackend.ts`) автоматично -използва `http://127.0.0.1:{port}` като базов URL адрес на препредаващата услуга. Изрично зададената променлива на средата `BIFROST_BASE_URL` -винаги е с предимство. +използва `http://127.0.0.1:{port}` като базов URL адрес на релето. Изрично зададената променлива на средата +`BIFROST_BASE_URL` винаги е с приоритет. --- ### 4.5 Крайни точки на Dario (12 маршрута) -Същият модел на жизнения цикъл като при другите услуги (`install`, `start`, `stop`, `restart`, +Същата структура за управление на жизнения цикъл като при другите услуги (`install`, `start`, `stop`, `restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`), плюс защитена с токен OAuth равнина за управление под `admin/`: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (всички защитени чрез `DARIO_ADMIN_TOKEN`). -### 4.6 Обратен прокси сървър (вграждане на таблото за управление на 9Router) +### 4.6 Крайни точки на open-wa (7 маршрута) + +open-wa (`@open-wa/wa-automate`) управлява безглава инстанция на Chromium (чрез +Puppeteer), за да автоматизира WhatsApp Web. Използва същата структура на крайните точки като Mux (все още без +маршрут `rotate-key`). Управлява се само на ниво жизнен цикъл — не е цел за маршрутизиране, +няма изпълнител от слой 4 или запис за доставчик. + +| Метод | Път | Описание | +| ------ | --------------------------------- | ------------------------------------------------------------------------------ | +| `POST` | `/api/services/openwa/install` | Инсталира open-wa от npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Стартира open-wa на порт 8323 (по подразбиране) | +| `POST` | `/api/services/openwa/stop` | Спира open-wa | +| `POST` | `/api/services/openwa/restart` | Рестартира open-wa | +| `POST` | `/api/services/openwa/update` | Актуализира до по-нова версия | +| `GET` | `/api/services/openwa/status` | Състояние в реално време + състояние в БД | +| `POST` | `/api/services/openwa/auto-start` | Включва или изключва автоматичното стартиране | +| `GET` | `/api/services/openwa/logs` | SSE поток от края на журнала (чрез споделения динамичен маршрут `[name]/logs`) | + +**API ключ:** инжектира се като `WA_KEY` — общото заместване на променливи на средата с префикс `WA_*` в open-wa го съпоставя с CLI опцията `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, проверено спрямо инсталирания пакет с версия 4.76.0). Добавя се префикс `ow_`, когато се генерира от `generateServiceApiKey()`. open-wa +прочита ключа обратно от HTTP заглавка `key`/`api_key` (а не `Authorization: +Bearer`); `/api-docs*` е изрично освободен от проверката +(`setupAuthenticationLayer` в `dist/cli/server.js`), така че заявката за проверка на състоянието +не се нуждае от заглавка за удостоверяване. + +**Сдвояване:** open-wa е неофициален и не е свързан с WhatsApp — за +свързания номер съществува риск от блокиране от собственото откриване на автоматизация на WhatsApp. +При първото стартиране QR кодът за сдвояване се извежда в stdout и се показва чрез +съществуващия панел за журнали/SSE поток — в тази интеграция все още няма +специализиран endpoint за QR изображение. + +--- + +### 4.7 Обратен прокси сървър (вграждане на таблото за управление на 9Router) Таблото за управление вгражда уеб интерфейса на 9Router в iframe чрез вътрешен обратен -прокси сървър на адрес: +прокси сървър на: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -520,16 +554,16 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] - Препраща заявката към `http://127.0.0.1:{port}/{path}` (само през loopback) - Премахва входящите заглавки `cookie` и `authorization` (без изтичане на сесията на OmniRoute) -- Добавя `Authorization: Bearer {apiKey}` за удостоверяване пред 9Router +- Инжектира `Authorization: Bearer {apiKey}` за удостоверяване в 9Router - Премахва `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` от отговора -- Пренаписва HTML отговорите, за да добави `` и да нормализира абсолютните пътища (`/foo` → `/dashboard/.../embed/foo`) +- Пренаписва HTML отговорите, за да инжектира `` и да нормализира абсолютните пътища (`/foo` → `/dashboard/.../embed/foo`) -Надстройванията до WebSocket за вграденото табло за управление се обработват от съпътстващ сървър на -специален порт (вижте `src/lib/services/embedWsProxy.ts`). +WebSocket надгражданията за вграденото табло за управление се обработват от спомагателен сървър на +специализиран порт (вижте `src/lib/services/embedWsProxy.ts`). **Сигурност:** Маршрутите на прокси сървъра за вграждане са класифицирани в `LOCAL_ONLY_API_PREFIXES` и могат да бъдат достъпвани само през loopback. Нападател, който получи JWT чрез -тунел на Cloudflare/Ngrok, не може да използва прокси сървъра за достъп до вградените услуги. +тунел на Cloudflare/Ngrok, не може да използва прокси достъп до вградените услуги. --- diff --git a/docs/i18n/bg/docs/frameworks/MEMORY.md b/docs/i18n/bg/docs/frameworks/MEMORY.md index 52a73b431317..f26ffb4b86d4 100644 --- a/docs/i18n/bg/docs/frameworks/MEMORY.md +++ b/docs/i18n/bg/docs/frameworks/MEMORY.md @@ -171,21 +171,29 @@ RRF(d) = Σ 1 / (k + rank_i(d)) където k = 60 (конфигурир | ------------------------ | -------------------------------------------------- | --------------- | -------------------------------------------------------------------- | | `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Кой източник на вграждания да се използва | | `embeddingProviderModel` | `string \| null` | `null` | Доставчик/модел във формат `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | Базов URL на OpenAI-съвместима крайна точка само за Memory | +| `customBaseUrl` | `string \| null` | `null` | Базов URL адрес на OpenAI-съвместима крайна точка само за паметта | | `customModelId` | `string \| null` | `null` | Идентификатор на модела, изпращан към персонализираната крайна точка | | `transformersEnabled` | `boolean` | `false` | Изрично включване на Transformers.js (MiniLM, ~400MB) | | `staticEnabled` | `boolean` | `false` | Изрично включване на локалния статичен модел potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Активиране на стъпката за пренареждане (добавя +200–500 ms/заявка) | -| `rerankProviderModel` | `string \| null` | `null` | Доставчик/модел за пренареждане във формат `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Кое векторно хранилище да се използва | +| `rerankEnabled` | `boolean` | `false` | Активиране на стъпката за преподреждане (добавя +200-500ms/заявка) | +| `rerankProviderModel` | `string \| null` | `null` | Доставчик/модел за преподреждане във формат `provider/model` | -Те са достъпни чрез `GET /PUT /api/settings/memory` (схема `MemorySettingsExtendedSchema`). +`rerankProviderModel` се разрешава от `POST /v1/rerank` (извиквано през loopback), така че приема всичко, което приема този маршрут: подбран облачен модел за преподреждане (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) или възел на OpenAI-съвместим доставчик като `/` (напр. `skilled-mini/bge-reranker-v2-m3` за TEI/Infinity сървър). Loopback възлите винаги са допустими; възел на друг хост (LAN, Tailscale) допълнително изисква флага за функционалност `RERANK_REMOTE_PROVIDER_NODES` и трябва да премине политиката за изходящи URL адреси на доставчика — вижте [Флагове за функционалност](../reference/FEATURE_FLAGS.md). Селекторът в таблото за управление показва подбрани доставчици и локални възли; всеки валиден низ `provider/model` може да бъде зададен директно чрез `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Коя векторна бекенд система да се използва | -За източника `remote` Memory приема и незадължителните настройки `customBaseUrl` и `customModelId`. Заедно те избират OpenAI-съвместима крайна точка `/embeddings` и модел, без да променят глобалния регистър за вграждания. Крайната точка се нормализира преди употреба и се проверява от правилата на доставчика за изходящи URL адреси: изисква се HTTP(S), вградените идентификационни данни и низовете за заявка се отхвърлят, а адресите за облачни метаданни остават блокирани. Празните стойности запазват избрания доставчик от регистъра. Грешките, връщани към таблото за управление, се пречистват, а идентификационните данни за крайната точка никога не се записват в журналите. +Те са достъпни чрез `GET /PUT /api/settings/memory` (схема `MemorySettingsExtendedSchema`). -> **ЗА ИЗПЪЛНЕНИЕ (D20):** Обхватът `global` (споделяне на спомени между всички API ключове) не е -> реализиран в тази версия. Той изисква промени в схемата и глобален път за -> извличане. Да се проследява отделно. +За източника `remote` Memory приема също незадължителните настройки `customBaseUrl` и +`customModelId`. Заедно те избират OpenAI-съвместима крайна точка `/embeddings` +и модел, без да променят глобалния регистър за вграждания. Крайната точка се +нормализира преди употреба и се проверява от политиката за изходящи URL адреси на доставчика: изисква се +HTTP(S), вградените идентификационни данни и низовете на заявките се отхвърлят, а адресите +за облачни метаданни остават блокирани. Празните стойности запазват избрания доставчик от регистъра. Грешките, +връщани към таблото за управление, се пречистват, а идентификационните данни за крайната точка никога не се записват в журналите. + +> **TODO (D20):** Обхватът `global` (споделяне на спомени между всички API ключове) не е +> реализиран в тази версия. Той изисква промени в схемата и глобален път за извличане. +> Проследявайте го отделно. ## Слоеве за съхранение diff --git a/docs/i18n/bg/docs/guides/DOCKER_GUIDE.md b/docs/i18n/bg/docs/guides/DOCKER_GUIDE.md index f6f989f4747a..593737867e59 100644 --- a/docs/i18n/bg/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/bg/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Бързо стартиране +> **Самостоятелно хостване с една команда?** Вижте +> [Ръководството за самостоятелно хостване](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (публикуван образ + +> Redis, достъпен само през loopback, без избор на профил). Бързото стартиране по-долу е +> вариантът с един контейнер за потребители, които вече изпълняват Redis другаде. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/bg/docs/guides/TROUBLESHOOTING.md b/docs/i18n/bg/docs/guides/TROUBLESHOOTING.md index e136cfe85087..9ad6b86d41d6 100644 --- a/docs/i18n/bg/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/bg/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # по-дълго ограниче ## Предупреждения при npm install (ERESOLVE / peer / deprecated) -Когато изпълните `npm install -g omniroute`, може да видите множество предупреждения като `npm warn ERESOLVE`, известия за peer зависимости и съобщения `deprecated`. **Те са очаквани и безвредни.** Инсталацията е успешна, ако видите `added packages` в изхода. +Когато изпълните `npm install -g omniroute`, може да видите множество предупреждения, като `npm warn ERESOLVE`, известия за peer зависимости и съобщения `deprecated`. **Те са очаквани и безвредни.** Инсталацията е успешна, ако в изхода виждате `added packages`. + +За да потиснете предупрежденията при разрешаването на peer зависимости, използвайте поддържаната от OmniRoute команда за инсталиране: + +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` потиска само известията за `ERESOLVE` и peer зависимости. Известията за остарели пакети остават видими, тъй като идват от транзитивни пакети на трети страни; те не означават, че инсталацията е неуспешна. Предупрежденията идват от остарели диапазони за peer зависимости в пакети на трети страни, които OmniRoute не контролира: -1. **`marked-terminal` изисква `marked >=1 <16`, но е намерен `marked@18`** — на практика работи без проблеми; диапазонът за peer зависимост в upstream пакета просто е остарял. +1. **`marked-terminal` изисква `marked >=1 <16`, намерен е `marked@18`** — на практика работи безпроблемно; диапазонът за peer зависимост в първоначалния пакет просто е остарял. 2. **`deprecated prebuild-install@7.1.3`** — транзитивен помощен инструмент за изтегляне на нативни двоични файлове. Той не се - използва за инсталиране на фиксирания транспортен binding `wreq-js` и не означава, че настройването на транспорта - на доставчика за уеб бисквитки е неуспешно. + използва за инсталиране на фиксираното транспортно свързване `wreq-js` и не означава, че настройването на транспорта на доставчика за уеб бисквитки + е неуспешно. -**Не е необходимо действие** — предупрежденията не могат да бъдат напълно скрити без създаване на fork на upstream пакетите. +**Не са необходими действия** — предупрежденията не могат да бъдат напълно потиснати без създаване на разклонения на първоначалните пакети. --- diff --git a/docs/i18n/bg/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/bg/docs/providers/CURSOR-API-KEY-AND-CLI.md index 27c840c9b3af..a77495f39b49 100644 --- a/docs/i18n/bg/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/bg/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,37 +4,38 @@ --- -Два начина да поставите Cursor зад OmniRoute без IDE сесия: +Два начина да използвате Cursor зад OmniRoute без IDE сесия: 1. **Доставчик `cursor-api`** (карта „Cursor API“, псевдоним `cua`): доставчик - с API ключ, който съхранява потребителски API ключ на Cursor (`crsr_…`, + с API ключ, който съхранява потребителски API ключ за Cursor (`crsr_…`, генериран на `https://cursor.com/dashboard/api`). След това всеки клиент на - OmniRoute може да достъпва моделите на Cursor чрез `/v1/chat/completions` + OmniRoute получава достъп до моделите на Cursor чрез `/v1/chat/completions` като `cursor-api/` или `cua/`, с обичайните слоеве за квоти, - резервно превключване и логване. IDE доставчикът (`cursor`, OAuth/IDE сесия) - остава непроменен. + резервно превключване и регистриране. IDE доставчикът (`cursor`, OAuth/IDE + сесия) остава непроменен. 2. **Директно препредаване на Cursor CLI**: насочете Cursor CLI (`agent`) към OmniRoute, така че всяко RPC извикване от CLI да се удостоверява с API ключ - на OmniRoute, да се препраща към Cursor с идентификационните данни на връзка - `cursor-api` и да се записва в страницата Logs. + на OmniRoute, да се препраща към Cursor с идентификационните данни на + `cursor-api` връзка и да се записва на страницата Logs. ## Защо ключът се обменя `api2.cursor.sh` отхвърля необработен ключ `crsr_…` като Bearer токен (401). Cursor CLI първо изпраща ключа чрез POST към `/auth/exchange_user_api_key` и -получава JWT за сесия, който изтича след един час; върнатият `refreshToken` има -същата стойност на `exp`, затова опресняването означава повторна обмяна на -ключа. `open-sse/services/cursorApiKeyAuth.ts` извършва тази обмяна, кешира по -един токен за сесия за всеки ключ, извършва повторна обмяна пет минути преди -изтичането и премахва кеширания токен, когато Cursor отговори с 401. -`CursorExecutor` го извиква непосредствено преди отварянето на потока към -външната услуга за връзки `cursor-api`. +получава сесиен JWT, който изтича след един час; върнатият `refreshToken` съдържа +същата стойност за `exp`, така че опресняването означава повторна обмяна на +ключа. +`open-sse/services/cursorApiKeyAuth.ts` извършва тази обмяна, кешира по един +сесиен токен за всеки ключ, извършва повторна обмяна пет минути преди изтичането +и премахва кеширания токен, когато Cursor отговори с 401. `CursorExecutor` го +извиква непосредствено преди отварянето на потока към услугата нагоре по веригата +за `cursor-api` връзки. ## Доставчикът `cursor-api` Регистър: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, същите `format`, `baseUrl` и -`models` като при `cursor`). Карта в каталога: +(`cursor_apiProvider`, `authType: "apikey"`, със същите `format`, `baseUrl` и +`models` като `cursor`). Карта в каталога: `src/shared/constants/providers/apikey/specialty-media.ts`. Карта на изпълнителите: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). @@ -60,33 +61,45 @@ curl -sS http://localhost:20128/v1/chat/completions \ Бележки: -- Списъкът с модели за `cursor-api` идва от статичния регистър на Cursor - (същият списък, който IDE доставчикът използва като резервен вариант); не е - необходимо `cursor-agent` да бъде инсталиран на хоста на OmniRoute. -- `POST /api/providers/{id}/refresh-cursor` е само за IDE доставчика `cursor`; - връзките `cursor-api` нямат IDE сесия за подновяване. +- Списъкът с модели за `cursor-api` идва от статичния регистър на Cursor (същия + списък, който IDE доставчикът използва като резервен вариант); не е необходимо + `cursor-agent` да бъде инсталиран на хоста на OmniRoute. +- `POST /api/providers/{id}/refresh-cursor` е предназначен само за IDE доставчика + `cursor`; `cursor-api` връзките нямат IDE сесия за подновяване. -## Директно препредаване на Cursor CLI +## Собствени идентификатори на модели и ниво на усилие + +За `cursor` / `cu` и `cursor-api` / `cua` споделеният нормализатор за нивото на +усилие на Claude оставя заявения идентификатор на модела непроменен. Cursor може +да обяви суфикс като `-low` като част от действителен идентификатор на модел, а +не като псевдоним на OmniRoute за ниво на усилие. Изпълнителят на Cursor запазва +точното съвпадение с активния каталог; когато няма съвпадение, съществуващият му +механизъм за определяне на модели управлява резервното преобразуване на суфикса +към параметър. + +Това не променя нормализирането на нивото на усилие за директни маршрути към +Claude, съвместими с Claude маршрути или маршрути към Vertex. Наличността +продължава да зависи от каталога и правата на избрания акаунт в Cursor. + +## Препращане през Cursor CLI Маршрут: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Префиксът `/api/cursor-cli/` е -регистриран в `src/shared/constants/publicApiRoutes.ts`, защото обработчикът +регистриран в `src/shared/constants/publicApiRoutes.ts`, тъй като обработчикът налага собствено удостоверяване: -| Път | Удостоверяване, очаквано от CLI | Какво прави OmniRoute | -| -------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Валидира ключа, издава 1-часов HS256 JWT (подписан с `JWT_SECRET`) и го връща | -| всеки друг път (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Проверява издателя, аудиторията и срока на валидност, избира активна връзка `cursor-api`, заменя заглавката Authorization с обменения токен на Cursor и връща поточно отговора | +| Път | Удостоверяване, очаквано от CLI | Какво прави OmniRoute | +| -------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Валидира ключа, издава HS256 JWT с валидност 1 час (подписан с `JWT_SECRET`) и го връща | +| всеки друг път (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Проверява издателя, аудиторията и срока на валидност, избира активна връзка `cursor-api`, заменя заглавката Authorization с получения чрез обмен Cursor токен и предава поточно отговора обратно | CLI декодира `exp` от всеки получен токен, затова подаването на непрозрачен -токен го кара да извършва повторна обмяна преди почти всяка заявка; издаденият -JWT предотвратява това. Отговор 401 от OmniRoute кара CLI да извърши обмяната -отново. +токен го кара да извършва нов обмен преди почти всяка заявка; издаденият JWT +предотвратява това. Отговор 401 от OmniRoute кара CLI да извърши обмена отново. ### Настройка -1. Създайте API ключ на OmniRoute (Dashboard → API keys) и връзка - `cursor-api`. +1. Създайте OmniRoute API ключ (Табло → API ключове) и връзка `cursor-api`. 2. Укажете на CLI да използва HTTP/1.1 за потока на агента. В `~/.cursor/cli-config.json`: @@ -94,9 +107,9 @@ JWT предотвратява това. Отговор 401 от OmniRoute ка { "network": { "useHttp1ForAgent": true } } ``` - Без това CLI отваря заявката към агента през HTTP/2 към отделно конфигуриран - хост на агента и само RPC извикванията от контролната равнина преминават през - крайната точка. + Без тази настройка CLI отваря сесията на агента през HTTP/2 към отделно + конфигуриран хост на агента и само RPC извикванията на контролната равнина + минават през крайната точка. 3. Стартирайте CLI срещу OmniRoute: @@ -107,18 +120,18 @@ JWT предотвратява това. Отговор 401 от OmniRoute ка ``` Всяка стъпка се записва в Logs с доставчик `cursor-api`, тип на заявката -`cursor-cli`, път `/api/cursor-cli/`, и се приписва на API ключа на -OmniRoute и връзката, която я е обслужила. +`cursor-cli`, път `/api/cursor-cli/`, свързана с OmniRoute API ключа и +връзката, която я е обслужила. ### Режими на отказ -| Ситуация | Отговор към CLI | -| ----------------------------------------------------- | --------------------------------------------------- | -| Неизвестен ключ на OmniRoute и `REQUIRE_API_KEY=true` | 401 `unauthenticated` при обмен | -| `REQUIRE_API_KEY=false` | анонимна сесия (отразява поведението на `/v1/*`) | -| Изтекъл / чужд / манипулиран JWT на сесията | 401, CLI извършва повторен обмен | -| API ключът на OmniRoute е отменен след обмена | 401 при следващото RPC | -| Няма активна връзка с `cursor-api` | 503 `unavailable` | -| Cursor отхвърля ключа на връзката | 401 `unauthenticated`, кешираната сесия се премахва | -| Услугата нагоре по веригата е недостъпна | 502 `unavailable` (съобщението е пречистено) | -| `JWT_SECRET` не е зададена | 503 при обмен | +| Ситуация | Отговор към CLI | +| ------------------------------------------------ | --------------------------------------------------- | +| Непознат OmniRoute ключ и `REQUIRE_API_KEY=true` | 401 `unauthenticated` при обмена | +| `REQUIRE_API_KEY=false` | анонимна сесия (отразява поведението на `/v1/*`) | +| Изтекъл / чужд / подправен JWT на сесията | 401, CLI извършва обмена отново | +| OmniRoute API ключът е отнет след обмена | 401 при следващото RPC извикване | +| Няма активна връзка `cursor-api` | 503 `unavailable` | +| Cursor отхвърля ключа на връзката | 401 `unauthenticated`, кешираната сесия се премахва | +| Услугата нагоре по веригата е недостъпна | 502 `unavailable` (санитизирано съобщение) | +| `JWT_SECRET` не е зададена | 503 при обмена | diff --git a/docs/i18n/bg/docs/reference/API_REFERENCE.md b/docs/i18n/bg/docs/reference/API_REFERENCE.md index f77a513b6fdf..c3abdb28060d 100644 --- a/docs/i18n/bg/docs/reference/API_REFERENCE.md +++ b/docs/i18n/bg/docs/reference/API_REFERENCE.md @@ -408,49 +408,49 @@ GET /api/v1/provider-plugin-manifest ## Крайни точки за съвместимост -| Метод | Път | Формат | -| ----- | ----------------------------------------- | -------------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (редактиране/inpaint) | -| POST | `/v1/videos/generations` | Генериране на видео в стил OpenAI | -| POST | `/v1/music/generations` | Генериране на музика в стил OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (връща аудио тяло) | -| POST | `/v1/rerank` | Преподреждане в стил Cohere/Voyage | -| POST | `/v1/classify` | Класифициране чрез Jina (`api.jina.ai`) | -| POST | `/v1/segment` | Сегментатор Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Псевдоним на каталога на OpenAI | -| GET | `/api/v1/vscode/{token}/models` | Псевдоним на моделите на OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | Токенизиран псевдоним на OpenAI | -| POST | `/api/v1/vscode/{token}/responses` | Токенизиран псевдоним на OpenAI Responses | -| POST | `/api/v1/vscode/{token}/api/chat` | Токенизиран псевдоним на Ollama | -| GET | `/api/v1/vscode/{token}/api/tags` | Токенизиран псевдоним на етикетите на Ollama | - -Всички POST маршрути следват една и съща структура: `Bearer your-api-key` + валидирано чрез Zod JSON тяло (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` и др.; вижте `src/shared/validation/schemas.ts`). При неуспешна проверка на схемата се връща 4xx. - -За клиенти, които не могат да добавят `Authorization: Bearer ...`, OmniRoute приема също API ключове в URL чрез съвместими параметри на заявката (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) или чрез специализираните крайни точки `/api/v1/vscode/{token}/...`, документирани по-долу. +| Метод | Път | Формат | +| ----- | ----------------------------------------- | ----------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (редактиране/inpaint) | +| POST | `/v1/videos/generations` | Генериране на видео в стил OpenAI | +| POST | `/v1/music/generations` | Генериране на музика в стил OpenAI | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (връща аудио тяло) | +| POST | `/v1/rerank` | Пренареждане в стил Cohere/Voyage | +| POST | `/v1/classify` | Класифициране с Jina (`api.jina.ai`) | +| POST | `/v1/segment` | Сегментиране с Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | Псевдоним за каталог на OpenAI | +| GET | `/api/v1/vscode/{token}/models` | Псевдоним за модели на OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | Токенизиран псевдоним на OpenAI | +| POST | `/api/v1/vscode/{token}/responses` | Токенизиран псевдоним на OpenAI Responses | +| POST | `/api/v1/vscode/{token}/api/chat` | Токенизиран псевдоним на Ollama | +| GET | `/api/v1/vscode/{token}/api/tags` | Токенизиран псевдоним за тагове на Ollama | + +Всички POST маршрути следват една и съща структура: `Bearer your-api-key` + валидирано със Zod JSON тяло (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` и т.н.; вижте `src/shared/validation/schemas.ts`). При неуспешна валидация спрямо схемата се връща 4xx. + +За клиенти, които не могат да добавят `Authorization: Bearer ...`, OmniRoute също приема API ключове в URL чрез съвместими параметри на заявката (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) или чрез специализираните крайни точки `/api/v1/vscode/{token}/...`, документирани по-долу. ```bash -# Преподреждане +# Пренареждане (доставчик от облачния регистър или възел на доставчик, съвместим с OpenAI, във вид "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Класифициране чрез Jina (идентификационни данни за Foundation API) +# Класифициране с Jina (идентификационни данни за Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Сегментатор Jina +# Сегментиране с Jina POST /v1/segment { "content": "...", "return_chunks": true } -# Търсене чрез Jina (s.jina.ai; псевдоними на доставчика: jina-search, jina-ai, jina) +# Търсене с Jina (s.jina.ai; псевдоними на доставчика: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } # Модериране @@ -467,6 +467,28 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Възли на доставчици за пренареждане:** `POST /v1/rerank` също насочва заявки към възли на доставчици, +> съвместими с OpenAI (oMLX, vLLM, Infinity, TEI зад шлюз, …), адресирани като `/`. +> Loopback възлите (`localhost`, `127.0.0.1`, `172.16.0.0/12`) винаги са допустими. Възли на всеки друг +> хост — машина в LAN или Tailscale peer — са допустими само когато операторът активира флага за функционалност +> `RERANK_REMOTE_PROVIDER_NODES` **и** базовият URL адрес на възела преминава правилата за изходящи URL адреси на доставчика +> (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> заявките никога не се насочват към хостове за облачни метаданни. Стъпката за пренареждане на механизма за памет извиква този маршрут през +> loopback, така че същото правило се прилага за `rerankProviderModel` в настройките на паметта. +> +> **Формати на локалния сървър:** възелът се извиква на `/v1/rerank`, а при 404 — на `/rerank` +> (Infinity, TEI). Тялото към upstream услугата съдържа както изписването на Cohere/OpenAI (`documents`, +> `return_documents`), така и това на TEI (`texts`, `return_text`), а отговорът от upstream услугата се +> нормализира към обвивката на Cohere: самостоятелният масив на TEI `[{index, score, text}]`, `{results: [{index, score}]}` +> от олекотени шлюзове и форматът на Voyage `{data: [...]}` се връщат към клиента като +> `{results: [{index, relevance_score, document?}]}`, сортирани по оценка и ограничени до `top_n`. + +> **Откриване на възли на доставчици:** моделите на възел на доставчик, съвместим с OpenAI, се показват в `GET /v1/models` +> под префикса на възела. Редовете без метаданни за крайна точка (типично за локални списъци от `/v1/models`) +> наследяват `apiType` на възела, така че моделите на възел за `embeddings` са с `type: "embedding"`, а моделите +> на възел за `rerank` са с `type: "rerank"`, вместо по подразбиране да бъдат задавани като чат; изрично зададено +> `supportedEndpoints` в синхронизиран или ръчно добавен ред продължава да има предимство. + ### Специализирани маршрути за доставчици ```bash diff --git a/docs/i18n/bg/docs/reference/ENVIRONMENT.md b/docs/i18n/bg/docs/reference/ENVIRONMENT.md index 692d6c42c7af..37e61d9dbdd6 100644 --- a/docs/i18n/bg/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/bg/docs/reference/ENVIRONMENT.md @@ -79,72 +79,71 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. Съхранение и база данни -OmniRoute използва **SQLite** (чрез `better-sqlite3`) за цялото постоянно съхранение. Тези променливи управляват местоположението на данните, шифроването и жизнения им цикъл. - -| Променлива | По подразбиране | Файл източник | Описание | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Основна директория за базата данни на SQLite, резервните копия и файловете с данни. Задайте друга стойност за Docker томове или персонализирани пътища. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(не е зададено)_ | `src/lib/dataPaths.ts` | Авариен механизъм за защитата на DATA_DIR при тестове/оценяване (#10428). Тестовете и Node сондите за оценяване/извеждане (`-e`/`--eval`/`-p`/`--print`, включително формите `--eval=`/`--print=`) без `DATA_DIR` се пренасочват към временна директория за еднократна употреба, за да не могат да отворят реалната база данни на оператора; задайте стойност `1`, за да разрешите отново използването на реалната директория. | -| `OMNIROUTE_BUILD_SHA` | _(не е зададено)_ | `src/lib/monitoring/buildSha.ts` | Git SHA на изпълнявания артефакт. Записва се от `npm run build:release`; може да бъде подаден в контейнери, разпространявани без контролния файл `dist/BUILD_SHA`. Предоставя се като `system.buildSha` в `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Референция, спрямо която проверката за произход на пакетирания артефакт проверява SHA на компилацията (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(не е зададено)_ | `scripts/build/buildProvenance.ts` | Задайте стойност `1`, за да позволите пакетирането на компилация, чийто SHA не е в линията за издания, като я регистрирате като умишлена canary версия, вместо проверката да завърши с неуспех (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(не е зададено)_ | `scripts/ops/deploy-canary.mjs` | API ключ за smoke проверката при canary внедряване, изпращан като `Authorization: Bearer` към `/v1/chat/completions`. Използва се само от скрипта за внедряване (#10429), никога от сървъра. Не е свързан с променливите `OMNIROUTE_SMOKE_*` на активирания по желание CLI smoke механизъм (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` в `tests/integration/upstream-cli-smoke.int.test.ts`) — вижте [CLI интеграции → Реално цялостно smoke тестване](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(не е зададено)_ | `src/lib/buildPhase.ts` | Сигнал за фазата на компилиране (#10060): задава се на `1` от `scripts/build/build-next-isolated.mjs` и се наследява от всеки стартиран процес за компилиране, така че слоят за базата данни да връща нефункционална заглушка, вместо да зарежда нативната добавка better-sqlite3 (която прекратява аварийно процеса при изход). Никога не се задава за работещия сървър. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Задайте стойност `1`, за да пропуснете проверката преди компилиране на незадължителните нативни зависимости при необичайни включени дървета на зависимости. Това не позволява компилиране при липсваща зависимост; използвайте само когато нативните зависимости се предоставят по друг начин. | -| `OMNIROUTE_DATA_DIR` | _(не е зададено)_ | `open-sse/executors/promptql/threadSticky.ts` | **Резервен псевдоним** за `DATA_DIR`, който се проверява само когато `DATA_DIR` не е зададена. Използва се за намиране на дисковия кеш на PromptQL изпълнителя за сесии, прикрепени към нишки (`/promptql-thread-sessions.json`); ако нито една от променливите не е зададена, кешът остава само в паметта (и не се запазва между рестартиранията). | -| `OMNIROUTE_PLUGINS_DIR` | _(не е зададено)_ | `src/lib/plugins/scanner.ts` | Директорията, която се прочита от **скенера за приставки по време на изпълнение** — и кореновата директория, в която мениджърът на приставки ги инсталира — като заменя подразбиращата се стойност, извлечена от домашната директория (#11827). Насочете я към bind-mounted дървото с приставки в Docker/K8s, вместо да променяте HOME само за да преместите пътя за сканиране (HOME управлява и всяко друго поведение, зависещо от домашната директория). Незададена стойност = `~/.omniroute/plugins` или `/tmp/.omniroute/plugins`, когато процесът изобщо не експортира домашна директория — премахнатото от тази променлива безшумно неоткриване. Определената директория се записва еднократно при стартиране като `scanner.dir_resolved` заедно с входната стойност, която е надделяла. Само от страна на сървъра: приставките за CLI команди продължават да използват своя собствен `OMNIROUTE_PLUGIN_PATH` (раздел 9). | -| `STORAGE_ENCRYPTION_KEY` | _(празно = деактивирано)_ | `src/lib/db/encryption.ts` | AES ключ за пълно шифроване на SQLite базата данни при съхранение. Генерирайте с `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Етикет на версията на ключа за шифроване. Увеличавайте го при ротация на ключа, за да се поддържа дешифрирането на стари резервни копия. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Когато е `true`, пропуска рутинните резервни копия на SQLite файла и тези преди запис (запазване/изчистване на цените от models.dev, записване на настройки). Ръчните резервни копия и тези преди възстановяване продължават да се изпълняват. Това **не** деактивира задължителната постоянна защитна моментна снимка на механизма за миграции или предпазния механизъм за масови миграции на съществуваща постоянна БД. Неръчните резервни копия се ограничават до най-много едно на всеки 60 минути. От таблото **Настройки → Съхранение** рутинното автоматично архивиране може да се деактивира независимо. | -| `OMNIROUTE_CRYPT_KEY` | _(незададено)_ | `src/lib/db/encryption.ts` | **Остарял псевдоним** на `STORAGE_ENCRYPTION_KEY`. Приема се като резервен вариант, когато основната променлива липсва. | -| `OMNIROUTE_API_KEY_BASE64` | _(незададено)_ | `src/lib/db/encryption.ts` | **Остарял псевдоним** (форма, кодирана с Base64), приеман като резервен вариант. Декодира се автоматично преди употреба. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(незададено)_ | `src/lib/db/core.ts` | Задава друг интервал (в ms) за периодичната проверка на състоянието на SQLite. Когато не е зададен, стойностите по подразбиране се извеждат от `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 ч) | `src/lib/db/walMaintenance.ts` | Задава друг интервал (в ms) за периодичния `wal_checkpoint(TRUNCATE)`. Автоматичната контролна точка никога не свива самия WAL файл, а дълго работещ сървър никога не затваря своята БД. `0` деактивира. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 мин) | `src/lib/db/walMaintenance.ts` | Задава друг интервал (в ms) за честия `wal_checkpoint(PASSIVE)`. Поддържа малък броя на чакащите WAL кадри, така че периодичният TRUNCATE никога да не копира натрупани данни от няколко GB в основната нишка. `0` деактивира. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Когато при PASSIVE цикъл се установи, че WAL файлът надвишава този размер, незабавно се преминава към `wal_checkpoint(TRUNCATE)`, вместо да се изчаква бавният цикъл. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Задайте на `1`/`true`/`yes`/`on`, за да се прекрати процесът, след като критичното натоварване на ресурсите се задържи за `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, което позволява на надзорен процес (systemd `Restart=always`, политика за рестартиране на Docker) да стартира чист процес, вместо безкрайно да се връщат отговори 503. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 мин) | `open-sse/utils/resourcePressure.ts` | Колко дълго трябва да се задържи критичното натоварване, преди да се задейства прекратяването за саморестартиране. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(автоматично откриване)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Изричен път (абсолютен или относителен спрямо cwd) до `sql-wasm.wasm` при използване на резервния WASM адаптер `sql.js`. Когато не е зададен, се открива автоматично чрез зависимостите на пакетите и възможните структури. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 ч) | `src/lib/db/core.ts` | Задава друг интервал (в ms) за периодичния `wal_checkpoint(TRUNCATE)`. Автоматичната контролна точка никога не свива самия WAL файл, а дълго работещ сървър никога не затваря своята БД. `0` деактивира. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Броят дни, през които контролните точки, посочените входни/изходни файлове и файлове с грешки, както и редът на крайна (завършена/неуспешна/отменена/изтекла) задача на Batch API се запазват от автоматичното почистване преди изтриване. Влиза в сила само след включване на `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; съответства на собствения срок за съхранение на изходните данни от Batch API на OpenAI. Не засяга задействания от оператора маршрут `DELETE /api/v1/batches/delete-completed`, който по замисъл остава безусловен (без филтър по възраст). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Когато е `true`, позволява на автоматичния процес за почистване да изтрива приключилите задачи на Batch API (и техните контролни точки) след изтичането на `OMNIROUTE_BATCH_RETENTION_DAYS` и да изчиства BLOB съдържанието на качените файлове след тяхната собствена стойност `expires_at`. По подразбиране е изключено: всяка съществуваща инсталация запазва тези данни точно както преди, докато оператор не го включи. Това е и флаг за функционалност, който може да се редактира от таблото за управление — вижте `docs/reference/FEATURE_FLAGS.md` → Runtime. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Задайте на `1`, за да пропуснете изцяло проверката на състоянието на БД при стартиране. Полезно за краткотрайни задачи и интеграционни тестове. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Задайте на `1`, за да активирате принудително цикъла за проверка на състоянието на БД дори когато обикновено би бил пропуснат (напр. при краткотрайни задачи). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Задайте на `1`, за да пропуснете предварителното инициализиране на нативната среда за изпълнение по време на `npm install`. Полезно при CI/инсталации без графичен интерфейс, където sqlite вече е компилиран. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(автоматично откриване)_ | `src/lib/db/migrationRunner.ts` | Заменя директорията, която инструментът за изпълнение на миграции сканира. Полезно при предоставяне на пакетирани миграции в персонализирани компилации. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(не е зададено)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Допълнителни директории за миграции като записи `namespace=dir`, разделени с разделителя за пътища на платформата (напр. `ee=/opt/app/enterprise/db/migrations`). Намерените там файлове се записват като `-`, така че дистрибуция, която предоставя собствени миграции, никога да не влиза в конфликт с числовите позиции на основния проект. Неправилно форматиран запис, невалидно пространство от имена или липсваща директория предизвиква грешка при стартиране, вместо схемата да бъде тихомълком пропусната. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Предпазен праг за голям брой чакащи миграции (#3416). Стартирането се прекратява, ако в съществуваща БД чакат повече миграции от този брой (предпазва от изтрита таблица за проследяване). Увеличете стойността, за да възстановите по-старо резервно копие; задайте на `0`, за да деактивирате проверката. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Работна директория за контролната стъпка `check:install-upgrade` при издаване на версия. Необходими са приблизително 12 GB (две инсталационни дървета по ~3 GB плюс tarball архива), затова тя не трябва да се изпълнява върху малка tmpfs — на самостоятелно хоствания изпълнител `/tmp` е 12 GB tmpfs в RAM и контролната стъпка я запълни, което прекъсна пакета. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(по подразбиране в кода)_ | `src/lib/spend/batchWriter.ts` | Интервал за запис (ms) за пакетния процес за запис на разходи/стойности. По-ниските стойности намаляват обединяването на операциите за запис; по-високите стойности намаляват конкуренцията за достъп до БД. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(по подразбиране в кода)_ | `src/lib/spend/batchWriter.ts` | Максимален брой буферирани записи за разходи преди принудителен запис. Увеличете при внедрявания с висок QPS; намалете, когато ограниченото използване на паметта е по-важно. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(не е зададено)_ | `open-sse/utils/proxyFetch.ts` | Задайте на `"true"`, за да извеждате диагностични съобщения `[ProxyFetch]` по релейния маршрут на Vercel. По подразбиране е изключено, за да се избегне разкриването на информация за маршрутизирането. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Задайте на `"true"` или `"1"`, за да включите IP адресите на клиента/изходящата връзка и префикса на акаунта в подробния ред `[ProxyEgress]` на системния журнал. По подразбиране остава ИЗКЛЮЧЕНО, така че системният журнал да не разкрива IP адреси или префикса на акаунта. | -| `OMNIROUTE_DEBUG` | _(не е зададено)_ | `bin/cli/commands/quota.mjs` | Задайте на `1`, за да извеждате в stderr диагностична информация за времето на всяка заявка (`[omniroute] GET completed in Nms`) от CLI командите за квоти. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(автоматично)_ | `scripts/dev/healthcheck.mjs` | Изричен път, проверяван от проверката на състоянието на контейнера. Ако не е зададен, проверката го извежда от `OMNIROUTE_BASE_PATH`; задаването му отново активира крайната точка за задълбочено наблюдение. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(не е зададено)_ | `bin/cli/commands/completion.mjs` | Задайте произволна непразна стойност, за да извеждате диагностични съобщения `[omniroute completion]` от пътищата на кеша за автоматично допълване в обвивката на CLI (четене/обновяване/запис). По подразбиране е изключено — тези кешове се провалят безшумно, така че липсващ или повреден кеш никога да не нарушава допълването с Tab. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ч.) | `open-sse/services/batchProcessor.ts` | Максимален период за повторни опити за отделни елементи от партидата (мс). Елементите, надвишаващи този период, се отбелязват като неуспешни. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Базово забавяне (мс) за експоненциално изчакване при повторни опити за елементи от партидата. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ч.) | `open-sse/services/batchProcessor.ts` | Горна граница (мс) за експоненциалното изчакване между повторните опити за елементи от партидата. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Максимален брой партиди, обработвани едновременно. Увеличете стойността за по-висока пропускателна способност; поддържайте я ниска, за да избегнете лавинообразно достигане на ограниченията за честота. | +OmniRoute използва **SQLite** (чрез `better-sqlite3`) за цялото постоянно съхранение. Тези променливи управляват местоположението, криптирането и жизнения цикъл на данните. + +| Променлива | По подразбиране | Файл източник | Описание | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Основна директория за базата данни на SQLite, резервните копия и файловете с данни. Задайте друга стойност за Docker томове или персонализирани пътища. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(не е зададена)_ | `src/lib/dataPaths.ts` | Авариен механизъм за заобикаляне на защитата за DATA_DIR при тестове/оценяване (#10428). Тестовете и eval/print проверките на Node (`-e`/`--eval`/`-p`/`--print`, включително формите `--eval=`/`--print=`) без `DATA_DIR` се пренасочват към временна директория за еднократна употреба, за да не могат да отворят реалната база данни на оператора; задайте `1`, за да разрешите отново използването на реалната директория. | +| `OMNIROUTE_BUILD_SHA` | _(не е зададена)_ | `src/lib/monitoring/buildSha.ts` | Git SHA на изпълнявания артефакт. Добавя се от `npm run build:release`; може да бъде инжектиран в контейнери, които се доставят без маркера `dist/BUILD_SHA`. Предоставя се като `system.buildSha` в `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Референцията, спрямо която проверката за произход на пакетирания артефакт валидира SHA на компилацията (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(не е зададена)_ | `scripts/build/buildProvenance.ts` | Задайте `1`, за да разрешите пакетирането на компилация, чийто SHA не е в линията за издаване, като тя бъде регистрирана като умишлена canary компилация, вместо проверката да завърши неуспешно (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(не е зададена)_ | `scripts/ops/deploy-canary.mjs` | API ключ за smoke проверката при canary внедряване, изпращан като `Authorization: Bearer` към `/v1/chat/completions`. Използва се само от скрипта за внедряване (#10429), никога от сървъра. Не е свързан с променливите `OMNIROUTE_SMOKE_*` на CLI smoke механизма с изрично включване (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` в `tests/integration/upstream-cli-smoke.int.test.ts`) — вижте [CLI интеграции → Реална smoke проверка](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(не е зададена)_ | `src/lib/buildPhase.ts` | Сигнал за фазата на компилиране (#10060): задава се на `1` от `scripts/build/build-next-isolated.mjs` и се наследява от всеки стартиран работен процес за компилиране, така че слоят за базата данни да връща неоперативен заместител, вместо да зарежда нативната добавка better-sqlite3 (която прекратява аварийно работния процес при изход). Никога не се задава за работещия сървър. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Задайте `1`, за да пропуснете незадължителната предварителна проверка на нативните зависимости за нестандартни пакетирани дървета. Това не прави липсваща зависимост компилируема; използвайте го само когато нативните зависимости се предоставят по външен начин. | +| `OMNIROUTE_DATA_DIR` | _(не е зададена)_ | `open-sse/executors/promptql/threadSticky.ts` | **Резервен псевдоним** за `DATA_DIR`, проверяван само когато `DATA_DIR` не е зададена. Използва се за намиране на дисковия кеш за постоянни сесии по нишка на изпълнителя PromptQL (`/promptql-thread-sessions.json`); ако нито една от променливите не е зададена, кешът остава само в паметта (не се запазва между рестартиранията). | +| `OMNIROUTE_PLUGINS_DIR` | _(не е зададена)_ | `src/lib/plugins/scanner.ts` | Директорията, която се чете от **скенера за приставки по време на изпълнение** — и основната директория, в която мениджърът на приставки извършва инсталирането — като заменя стойността по подразбиране, извлечена от домашната директория (#11827). Насочете я към bind-mounted дървото с приставки в Docker/K8s, вместо да премествате HOME само за да промените пътя за сканиране (HOME управлява и всяко друго поведение, зависещо от домашната директория). Ако не е зададена = `~/.omniroute/plugins` или `/tmp/.omniroute/plugins`, когато процесът изобщо не експортира домашна директория — тази променлива предотвратява произтичащото от това безшумно неоткриване. Определената директория се записва веднъж при стартиране като `scanner.dir_resolved`, заедно с входната стойност, която е била избрана. Само от страната на сървъра: приставките за CLI команди продължават да използват собствената си `OMNIROUTE_PLUGIN_PATH` (раздел 9). | +| `STORAGE_ENCRYPTION_KEY` | _(празно = деактивирано)_ | `src/lib/db/encryption.ts` | AES ключ за пълно криптиране на SQLite базата данни при съхранение. Генерирайте с `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Етикет за версията на ключа за криптиране. Увеличавайте го при ротация на ключа, за да се поддържа декриптирането на стари резервни копия. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Когато е `true`, се пропускат рутинните резервни копия и тези преди запис на SQLite файла (запазване/изчистване на цените от models.dev, записи на настройки). Ръчните резервни копия и тези преди възстановяване продължават да се изпълняват. Това **не** деактивира задължителния траен защитен моментен образ на програмата за миграция или защитата при масова миграция на съществуваща постоянна БД. Неръчните резервни копия се ограничават до най-много едно на всеки 60 минути. **Settings → Storage** в таблото за управление може независимо да деактивира рутинното автоматично архивиране. | +| `OMNIROUTE_CRYPT_KEY` | _(не е зададено)_ | `src/lib/db/encryption.ts` | **Остарял псевдоним** за `STORAGE_ENCRYPTION_KEY`. Приема се като резервен вариант, когато основната променлива липсва. | +| `OMNIROUTE_API_KEY_BASE64` | _(не е зададено)_ | `src/lib/db/encryption.ts` | **Остарял псевдоним** (форма, кодирана с Base64), приеман като резервен вариант. Декодира се автоматично преди употреба. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(не е зададено)_ | `src/lib/db/core.ts` | Замества интервала за периодична проверка на състоянието на SQLite (ms). Когато не е зададен, стойностите по подразбиране се извеждат от `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(премахнато)_ | `src/lib/db/walMaintenance.ts` | **Премахнато.** Периодичното изпълнение на `wal_checkpoint(TRUNCATE)` в работеща система може да направи невалидно споделеното съпоставяне на wal-index и да срине процеса със SIGBUS (#13973), затова планировчикът вече не съществува. Променливата е неактивна: положителна стойност записва еднократно предупреждение за оттегляне, а `0` или липсваща стойност не генерира съобщение. WAL се поддържа чрез PASSIVE контролни точки (по-долу) и се съкращава от контролната точка при изключване. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 мин.) | `src/lib/db/walMaintenance.ts` | Замества интервала за често изпълнение на `wal_checkpoint(PASSIVE)` (ms). Поддържа малък брой изчакващи WAL кадри, така че контролните точки да останат бързи, а размерът на WAL файла да остане ограничен между съкращаванията при изключване. `0` деактивира функцията. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Когато при PASSIVE цикъл WAL файлът е над този размер, се изпълнява `wal_checkpoint(RESTART)`, така че WAL да започне отначало, без да се презаписва съпоставеният wal-index. Контролните точки в режим на съкращаване при работеща система са премахнати (вижте реда `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Задайте `1`/`true`/`yes`/`on`, за да прекратите процеса, след като критичното натоварване на ресурсите се задържи за `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, което позволява на надзорна система (systemd `Restart=always`, политика за рестартиране на Docker) да стартира отново чист процес, вместо безкрайно да се връщат отговори 503. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 мин.) | `open-sse/utils/resourcePressure.ts` | Колко дълго трябва да се задържи критичното натоварване, преди да се задейства прекратяването за самостоятелно рестартиране. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(автоматично откриване)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Изричен път (абсолютен или относителен спрямо cwd) до `sql-wasm.wasm` при използване на резервния WASM адаптер `sql.js`. Когато не е зададен, се открива автоматично чрез зависимостите на пакета и възможните оформления. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Брой дни, за които контролните точки, свързаните входни/изходни/грешкови файлове и редът на приключена (завършена/неуспешна/отменена/изтекла) задача на Batch API се запазват от автоматичното почистване преди изтриване. Влиза в сила само след включване на `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; съответства на собствения период за съхранение на изходните данни от Batch API на OpenAI. Не засяга задействания от оператор маршрут `DELETE /api/v1/batches/delete-completed`, който по проект остава безусловен (без филтър по възраст). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Когато е `true`, позволява на автоматичното почистване да изтрива приключени задачи на Batch API (и техните контролни точки) след изтичане на `OMNIROUTE_BATCH_RETENTION_DAYS` и да изчиства BLOB съдържанието на качените файлове след тяхната собствена стойност `expires_at`. По подразбиране е изключено: всяка съществуваща инсталация запазва тези данни точно както преди, докато оператор изрично не включи функцията. Това е и флаг за функционалност, който може да се редактира от таблото за управление — вижте `docs/reference/FEATURE_FLAGS.md` → Runtime. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Задайте на `1`, за да пропуснете изцяло проверката на състоянието на БД при стартиране. Полезно за краткотрайни задачи и интеграционни тестове. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Задайте на `1`, за да активирате принудително цикъла за проверка на състоянието на БД, дори когато обикновено би бил пропуснат (напр. при краткотрайни задачи). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Задайте на `1`, за да пропуснете предварителното стартиране на нативната среда по време на `npm install`. Полезно при CI/инсталации без графичен интерфейс, където sqlite вече е компилиран. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(автоматично откриване)_ | `src/lib/db/migrationRunner.ts` | Заменя директорията, която инструментът за изпълнение на миграции сканира. Полезно при предоставяне на пакетирани миграции в персонализирани компилации. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(не е зададено)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Допълнителни директории за миграции като записи `namespace=dir`, разделени със специфичния за платформата разделител на пътища (напр. `ee=/opt/app/enterprise/db/migrations`). Намерените там файлове се записват като `-`, така че дистрибуция, предоставяща собствени миграции, никога да не влиза в конфликт с числовите позиции от основния проект. Неправилно форматиран запис, невалидно пространство от имена или липсваща директория предизвиква грешка при стартиране, вместо схемата да бъде пропусната без предупреждение. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Предпазен праг за голям брой чакащи миграции (#3416). Стартирането се прекратява, ако в съществуваща БД чакат повече миграции от посочения брой (защита срещу изчистена таблица за проследяване). Увеличете го, за да възстановите по-старо резервно копие; задайте на `0`, за да деактивирате проверката. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Работна директория за контролната стъпка `check:install-upgrade` при издаване на версия. Необходими са приблизително 12 GB (две инсталационни дървета по ~3 GB плюс tarball архива), затова тя не трябва да се изпълнява върху малка tmpfs — при самостоятелно хоствания изпълнител `/tmp` е 12 GB tmpfs, поддържана в RAM, и контролната стъпка я запълни, което доведе до прекъсване на пакета. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(по подразбиране в кода)_ | `src/lib/spend/batchWriter.ts` | Интервал за запис (ms) за пакетния механизъм за запис на разходи/стойности. По-ниските стойности намаляват обединяването на записите; по-високите стойности намаляват конфликтите в БД. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(по подразбиране в кода)_ | `src/lib/spend/batchWriter.ts` | Максимален брой буферирани записи за разходи преди принудително записване. Увеличете при внедрявания с висок QPS; намалете, когато ограниченото потребление на памет е по-важно. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(не е зададено)_ | `open-sse/utils/proxyFetch.ts` | Задайте на `"true"`, за да извеждате диагностични регистрационни записи `[ProxyFetch]` по пътя за препредаване през Vercel. По подразбиране е изключено, за да се избегне изтичане на информация за маршрутизирането. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Задайте на `"true"` или `"1"`, за да включите клиентските/изходящите IP адреси и префикса на акаунта в подробния ред `[ProxyEgress]` от регистрационния файл на процеса. По подразбиране остава ИЗКЛЮЧЕНО, така че регистрационният файл на процеса да не разкрива IP адреси или префикса на акаунта. | +| `OMNIROUTE_DEBUG` | _(не е зададено)_ | `bin/cli/commands/quota.mjs` | Задайте на `1`, за да извеждате в stderr диагностична информация за времето на всяка заявка (`[omniroute] GET completed in Nms`) от CLI командите за квоти. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(автоматично)_ | `scripts/dev/healthcheck.mjs` | Изричен път, проверяван от контейнерната проверка на състоянието. Когато не е зададен, проверката го извежда от `OMNIROUTE_BASE_PATH`; задаването му активира отново крайната точка за задълбочен мониторинг. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(не е зададено)_ | `bin/cli/commands/completion.mjs` | Задайте каквато и да е непразна стойност, за да извеждате диагностична информация `[omniroute completion]` от пътищата на кеша за автоматично допълване в CLI обвивката (четене/опресняване/запис). По подразбиране е изключено — грешките в тези кешове се игнорират, така че липсващ или повреден кеш никога да не нарушава допълването с табулатор. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ч.) | `open-sse/services/batchProcessor.ts` | Максимален период за повторни опити за отделни елементи от пакета (ms). Елементите, които надвишават тази продължителност, се отбелязват като неуспешни. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Базово забавяне (ms) за експоненциално отлагане при повторни опити за елементи от партидата. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ч.) | `open-sse/services/batchProcessor.ts` | Горна граница (ms) за експоненциалното отлагане между повторните опити за елементи от партидата. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Максимален брой партиди, обработвани едновременно. Увеличете стойността за по-висока пропускателна способност; поддържайте я ниска, за да избегнете масово задействане на ограниченията на честотата. | > [!IMPORTANT] -> Преди промяна на съществуваща постоянна база данни инструментът за изпълнение на миграции публикува пълен -> моментен образ, адресиран по съдържание, в `DATA_DIR/db_backups/`. Публикуването изисква файлова система, -> която поддържа твърди връзки в рамките на същата файлова система без презаписване, както и надеждна синхронизация на файловете. POSIX хостовете също -> изискват синхронизация на директориите; под Windows Node може да отхвърли манипулаторите за директории, затова OmniRoute синхронизира -> публикувания файл и третира синхронизацията на записите в директорията като действие с максимално възможно старание. -> Ако монтираната `DATA_DIR` не може да осигури тези гаранции, стартирането се прекратява безопасно, преди да бъде приложена +> Преди промяна на съществуваща постоянна база данни изпълнителят на миграции публикува пълен, +> адресиран по съдържание моментен образ в `DATA_DIR/db_backups/`. Публикуването изисква файлова система, +> която поддържа твърди връзки в рамките на същата файлова система без презаписване, както и надеждно синхронизиране на файловете. POSIX хостовете също +> изискват синхронизиране на директориите; в Windows Node може да отхвърли манипулаторите на директории, затова OmniRoute синхронизира +> публикувания файл и третира синхронизирането на записите в директорията като операция, изпълнявана при възможност. +> Ако монтираната `DATA_DIR` не може да предостави тези гаранции, стартирането се прекратява безопасно, преди да бъде приложена > миграция. Преместете `DATA_DIR` на том, който поддържа тези примитиви; не използвайте -> `DISABLE_SQLITE_AUTO_BACKUP`, за да заобикаляте защитата при миграция. +> `DISABLE_SQLITE_AUTO_BACKUP`, за да заобикаляте защитите при миграция. ### Сценарии -| Сценарий | Конфигурация | -| ------------------------ | --------------------------------------------------------------------------------------------------------- | -| **Локална разработка** | Оставете всички стойности по подразбиране. Базата данни се намира в `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + монтирайте том в `/data`. | -| **Криптиране при покой** | Задайте `STORAGE_ENCRYPTION_KEY` + съхранявайте резервни копия на ключа! Загубата му = загуба на данните. | -| **CI/Тестване** | `DATA_DIR=/tmp/omniroute-test` — временно хранилище, не е необходимо криптиране. | +| Сценарий | Конфигурация | +| ----------------------- | --------------------------------------------------------------------------------------------------- | +| **Локална разработка** | Оставете всички стойности по подразбиране. Базата данни се намира в `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + монтирайте том в `/data`. | +| **Шифроване при покой** | Задайте `STORAGE_ENCRYPTION_KEY` + пазете резервни копия на ключа! Загубата му = загуба на данните. | +| **CI/Тестване** | `DATA_DIR=/tmp/omniroute-test` — временно хранилище, не е необходимо шифроване. | --- @@ -214,45 +213,46 @@ OmniRoute използва **SQLite** (чрез `better-sqlite3`) за цяло ## 4. Сигурност и удостоверяване -| Променлива | По подразбиране | Изходен файл | Описание | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Сол, комбинирана с хардуерни идентификатори за създаване на цифров отпечатък на машината. Променяйте я за всяко внедряване с цел изолация. | -| `OMNIROUTE_CLI_SALT` | _(незададена = произволна сол за всяка инсталация, съхранена в `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC сол за извеждане на локалния токен за удостоверяване на CLI. Задаването на тази стойност обновява всички CLI токени на машината и винаги има приоритет пред съхранената сол. Вижте `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Задава флага `Secure` на сесийните бисквитки. **Трябва да бъде `true`** при работа зад HTTPS. | -| `REQUIRE_API_KEY` | `false` | API междинен софтуер | Когато е `true`, всички прокси заявки към `/v1/*` трябва да включват валиден API ключ. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Позволява показването на пълните стойности на API ключовете в потребителския интерфейс на таблото за управление. Може да се конфигурира от флаговете за функционалност в таблото за управление; представлява риск за сигурността при споделени инстанции. | -| `NO_LOG_API_KEY_IDS` | _(празно)_ | `src/lib/compliance/index.ts` | Разделени със запетаи идентификатори на API ключове, за които не се регистрират заявки (съответствие с GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(незададено = неограничено)_ | `src/shared/utils/apiKeyPolicy.ts` | Резервен дневен бюджет от заявки, прилаган към API ключове, чиято колона `rate_limits` е null. Незададена или празна стойност: няма неявно ограничение (#2289, #11017). `0` означава същото (неограничено). Положително цяло число N разрешава N/ден, 5N/седмица, 20N/месец. Невалидните непразни стойности използват старите ограничения от 1000/ден, 5000/седмица и 20000/месец. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Максимално разрешеният размер на тялото на заявката. Отхвърля съдържание, надвишаващо това ограничение. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Действителните тела на заявки с размер, равен на или по-голям от този праг, получават атомарния, локален за процеса резерв за допускане на тежки заявки преди анализирането на JSON (път BYTE, включително `POST /v1/responses`). Същият механизъм за изключение при достатъчен свободен капацитет от [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437), както при структурно тежките заявки; все още е ограничен от `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), така че [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) да не се повтори. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Твърда горна граница за маршрутите за чат, налагана спрямо прочетените байтове по време на ограниченото приемане, включително за заявки с липсващ, невалиден или подвеждащ `Content-Length`; при превишаване се връща `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(не е зададено — няма ограничение за броя заявки)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** това наследено ограничение за БРОЯ заявки вече се прилага само когато е изрично зададено. Ако не е зададено (по подразбиране), допускането на тежки чат заявки вместо това се ограничава от `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — автоматично изведен бюджет в БАЙТОВЕ, оразмерен спрямо реалния лимит на паметта на процеса в **един процес** (една V8 heap памет). Две припокриващи се `/v1/responses` заявки с ~750k токена сриват heap памети от ~12 Gi (#7849) — това е предупреждение за **бюджета на паметта**, а не твърд продуктов максимум от 2. Изправен процес (heap памет под съотношението за разтоварване) МОЖЕ да допуска повече едновременни дълги `/v1/responses` чрез `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Десетки дълги SSE клиенти (40–50) зависят от heap паметта + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, а не от „максимум 2“. Безразборното увеличаване на тази стойност с цел „използване на хоста“ отново води до #7849. Умножете **heap паметите** чрез **N независими `DATA_DIR` директории** (#11024); никога не използвайте `replicas>1` върху един SQLite файл. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(автоматично изведено)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** замества автоматично изведения бюджет в байтове за приемане (25% от по-строгия лимит на V8/cgroup паметта, разделени на 8-кратното временно увеличение). Изведените и изрично зададените стойности се ограничават до диапазона 8 MiB–2 GiB. Тяло, по-голямо от ефективния бюджет, се отхвърля незабавно с `413 body_exceeds_budget`; конкуренцията между тела, всяко от които може да бъде обслужено самостоятелно, остава повторно опитваема чрез `503`. 40–50 едновременни дълги SSE клиенти зависят от този бюджет + heap паметта, а не от твърд „максимум 2“. Проверете `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` в `/api/monitoring/health`, преди да настройвате. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Съотношение за разтоварване при натиск върху heap паметта (`heapUsed / heap_size_limit`) за допускане на тежки заявки по БАЙТОВЕ и СТРУКТУРА (#10183, #10268, #10437). Едновременна тежка заявка над `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` се отхвърля с допускаща повторен опит грешка `503` само когато heap паметта СЪЩО е на или над това съотношение; при изправна heap памет заявката се допуска чрез допълнителния капацитет за изправно състояние. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (по подразбиране `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Ограничен допълнителен капацитет за бързия път при изправна heap памет (#10437) както за СТРУКТУРА, така и за БАЙТОВЕ (`admitChatRequest`, включително тела ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Без това ограничение всяка заявка при заета, но изправна heap памет заобикаляше контрола за допускане без горна граница. След като толкова на брой едновременни leases са активни през пътя за изправна heap памет, следващите заявки при заетост преминават към СЪЩИЯ път с ограничено изчакване/разтоварване, използван при реален натиск върху heap паметта. `0` изключва изцяло заобикалянето. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Брой съобщения, при който чат заявка се класифицира като тежка дори когато тялото ѝ е под прага в байтове. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Брой инструменти, при който чат заявка се класифицира като тежка дори когато тялото ѝ е под прага в байтове. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Консервативна оценка на броя токени въз основа на размера на низовете, при която заявката се класифицира като тежка; това е приблизителна стойност за разхода по допускането, а не токенизацията за таксуване от доставчика. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (изключено) | `src/shared/middleware/chatBodyAdmission.ts` | Незадължително ограничение на историята на чата, което се активира изрично. По подразбиране е изключено: броят съобщения е политика на внедряването, а не универсално свойство на заявката, и налагането на ограничение тук отхвърля разговорите с окончателна грешка `413`, преди компресиращият конвейер да може да ги направи обслужваеми. Нарастването на heap паметта се ограничава от `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` и разтоварването при натиск върху нея. Задайте положителна стойност при внедрявания с ограничена памет, които се нуждаят от твърда горна граница; при превишаването ѝ се връща структурирана грешка `413`, изискваща компактиране. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Твърдо ограничение за upstream отговор без поточно предаване, който се буферира изцяло в паметта. При превишаването му upstream четецът се отменя и заявката се прекратява незабавно с грешка, вместо низът да нараства без ограничение до изчерпване на heap паметта. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Максимален брой байтове по мрежата, препращани от заглавките на upstream отговора. Когато бюджетът бъде надвишен, заглавките с по-нисък приоритет (напр. персонализираните `x-codex-*`, `x-oai-request-id`) се премахват, за да се остане в рамките на обичайните ограничения за заглавки на reverse proxy. Задайте по-висока стойност, за да препращате повече upstream метаданни, за сметка на по-голям размер на заглавките на отговора. | -| `CORS_ORIGIN` | _(не е зададено)_ | `src/server/cors/origins.ts` | Остарял CORS списък с разрешен един източник. За нови внедрявания предпочитайте `CORS_ALLOWED_ORIGINS`. CORS се използва само за API клиенти в браузър от друг източник; удостоверените операции за запис от таблото за управление използват вместо това заявки от същия източник и обвързана със сесията CSRF защита. | -| `CORS_ALLOWED_ORIGINS` | _(не е зададено)_ | `src/server/cors/origins.ts` | Разделен със запетаи CORS списък с разрешени източници. Не се изпраща заместващ символ, освен ако `CORS_ALLOW_ALL=true` не е изрично конфигурирано. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Аварийна опция само за разработка, която връща всеки браузърен `Origin`. Не я активирайте в споделени или производствени внедрявания. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Блокирайте извикванията към доставчици, насочени към частни, loopback или link-local диапазони от IP адреси. Деактивирайте само в изолирани тестови среди. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Разрешава URL адреси на доставчици, сочещи към частни/локални мрежи (localhost, 192.168.x.x, 10.x.x.x и т.н.). **ИЗИСКВА СЕ за самостоятелно хоствани доставчици** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Когато е `false`, таблото за управление отхвърля валидирането на локални URL адреси. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Разрешава добавянето/валидирането на доставчици на локални/частни адреси (127.0.0.1, localhost, LAN, частни диапазони) — ограничено до пътя за валидиране на доставчика. **По подразбиране е `true`** (с приоритет на локалната среда); задайте `false`, за да наложите стриктно блокиране и да разрешите само публични адреси. Крайните точки за облачни метаданни (169.254.169.254, metadata.google.internal) остават блокирани независимо от настройката. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Позволява на маршрутите `/v1/audio/*` (транскрипции, синтез на реч, преводи) да използват съвместим с OpenAI възел на доставчик, хостван извън localhost. По подразбиране е изключено — маршрутизирането на аудио към отдалечен хост променя изходната идентичност и трябва да бъде изрично решение на оператора. Loopback/частните възли (localhost, 127.0.0.1, 172.16-31.x) винаги са разрешени и не се засягат. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Когато OIDC е активиран, деактивира влизането с парола, така че потребителите да могат да се удостоверяват само чрез OIDC Single Sign-On. Приема се и краткият псевдоним `OIDC_DISABLE_PASSWORD_LOGIN`; флагът за функционалност в таблото за управление със същия ключ е с предимство. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Кратък псевдоним на `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | - -### Контролен списък за повишаване на сигурността +| Променлива | Стойност по подразбиране | Файл източник | Описание | +| ------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Сол, комбинирана с хардуерни идентификатори за създаване на машинен отпечатък. Променяйте я за всяко внедряване с цел изолация. | +| `OMNIROUTE_CLI_SALT` | _(не е зададена = произволна сол за всяка инсталация, съхранена в `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC сол за извеждане на локалния токен за удостоверяване на CLI. Задаването на тази стойност подменя всички CLI токени на машината и винаги има предимство пред съхранената сол. Вижте `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Задава флага `Secure` на сесийните бисквитки. **Трябва да бъде `true`** при работа зад HTTPS. | +| `REQUIRE_API_KEY` | `false` | API междинен софтуер | Когато е `true`, всички прокси заявки към `/v1/*` трябва да включват валиден API ключ. **Този флаг не ограничава `GET /v1/models`**, който вместо това следва режима за вход в таблото за управление (`requireAuthForModels`) — следователно отговор `401` от `/v1/models` НЕ означава, че изводът е защитен. Вижте `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Позволява разкриването на пълните стойности на API ключовете в потребителския интерфейс на таблото за управление. Конфигурира се чрез флаговете за функционалност в таблото за управление; представлява риск за сигурността при споделени инстанции. | +| `NO_LOG_API_KEY_IDS` | _(празно)_ | `src/lib/compliance/index.ts` | Разделени със запетаи идентификатори на API ключове, за които не се записват журнали на заявките (съответствие с GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(не е зададена = неограничено)_ | `src/shared/utils/apiKeyPolicy.ts` | Резервен дневен бюджет за заявки, прилаган към API ключове, чиято колона `rate_limits` е null. Незададена или празна стойност: без неявно ограничение (#2289, #11017). `0` означава същото (неограничено). Положително цяло число N активира N/ден, 5N/седмица, 20N/месец. Неправилно форматираните непразни стойности използват предишните интервали от 1000/ден, 5000/седмица, 20000/месец. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Максимално допустим размер на тялото на заявката. Отхвърля полезни товари, надвишаващи това ограничение. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Реалните тела на заявки с размер, равен на или по-голям от този праг, придобиват атомарния локален за процеса достъп за тежки операции преди анализирането на JSON (път BYTE, включително `POST /v1/responses`). Използва същия механизъм за продължаване при достатъчен свободен ресурс от [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437), както при структурно тежките заявки; все пак е ограничено от `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), така че [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) да не се повтори. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Твърд лимит за маршрута за чат, прилаган спрямо байтовете, прочетени по време на ограниченото приемане, включително при заявки с липсващ, невалиден или неверен `Content-Length`; при превишаване се връща `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(не е зададено — няма лимит за броя заявки)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** този наследен лимит за БРОЯ заявки вече се прилага само когато е изрично зададен. Когато не е зададен (по подразбиране), приемането на тежки чат заявки вместо това се управлява от `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — автоматично изчислен бюджет в БАЙТОВЕ, оразмерен според действителния лимит на паметта на процеса в рамките на **един процес** (една V8 динамична памет). Две припокриващи се заявки към `/v1/responses` с ~750 хил. токена сриват динамични памети от ~12 GiB (#7849) — това е предупреждение за **бюджета на паметта**, а не твърд продуктов максимум от 2. Изправен процес (с динамична памет под коефициента за отхвърляне) МОЖЕ да допуска повече едновременни дълги заявки към `/v1/responses` чрез `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Десетки дълготрайни SSE клиенти (40–50) зависят от динамичната памет + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, а не от „максимум 2“. Безразборното увеличаване на тази стойност с цел „използване на хоста“ отново води до #7849. Умножавайте **динамичните памети** с **N независими `DATA_DIR`** (#11024); никога не използвайте `replicas>1` с един SQLite файл. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(автоматично изчислено)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** замества автоматично изчисления бюджет в байтове за приемане (25% от по-строгия лимит на паметта между V8 и cgroup, разделени на 8-кратното временно увеличаване). Изчислените и изрично зададените стойности се ограничават до диапазона 8 MiB–2 GiB. Тяло, по-голямо от ефективния бюджет, се отхвърля незабавно с `413 body_exceeds_budget`; конкуренцията между тела, всяко от които може да бъде обслужено самостоятелно, продължава да връща позволяваща повторен опит грешка `503`. 40–50 едновременни дълготрайни SSE клиенти зависят от този бюджет + динамичната памет, а не от твърд „максимум 2“. Проверете `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` в `/api/monitoring/health`, преди да настройвате. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Коефициент за отхвърляне при натоварване на динамичната памет (`heapUsed / heap_size_limit`) за приемане на тежки заявки по БАЙТОВЕ и СТРУКТУРА (#10183, #10268, #10437). Едновременна тежка заявка над `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` се отхвърля с позволяваща повторен опит грешка `503` само когато динамичната памет СЪЩО е достигнала или надвишила този коефициент; при нормално състояние на динамичната памет тя се допуска чрез допълнителния капацитет за нормално състояние. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (по подразбиране `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Ограничен допълнителен капацитет за бързия път при нормално състояние на динамичната памет (#10437) както за СТРУКТУРА, така и за БАЙТОВЕ (`admitChatRequest`, включително тела ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Без това ограничение всяка заявка при натоварена, но нормално функционираща динамична памет заобикаляше механизма за приемане без никакъв горен лимит. След като толкова едновременни разрешения станат активни чрез пътя за нормално състояние на динамичната памет, следващите заявки при натоварване преминават към СЪЩИЯ път с ограничено изчакване/отхвърляне, използван при действително натоварване на динамичната памет. `0` изключва напълно заобикалянето. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Брой съобщения, при който заявка за чат се класифицира като тежка дори когато тялото ѝ е под прага в байтове. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Брой инструменти, при който заявка за чат се класифицира като тежка дори когато тялото ѝ е под прага в байтове. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Консервативна оценка на броя токени въз основа на размера на низа, при която заявката се класифицира като тежка; това е приблизителна оценка на разхода за приемане, а не токенизацията за таксуване на доставчика. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (изключено) | `src/shared/middleware/chatBodyAdmission.ts` | Незадължителен лимит за историята на чата, който се включва изрично. По подразбиране е изключен: броят съобщения е политика на внедряването, а не универсално свойство на заявката, и налагането на лимит тук отхвърля разговорите с окончателен отговор `413`, преди конвейерът за компресиране да може да ги направи обслужваеми. Нарастването на динамичната памет се ограничава от `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` и отхвърлянето при натоварване на динамичната памет. Задайте положителна стойност при внедрявания с ограничена памет, които се нуждаят от твърда горна граница; тогава при превишаване се връща структуриран отговор `413`, изискващ свиване. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Твърд лимит за непоточно предаван отговор от системата нагоре по веригата, който се буферира изцяло в паметта. При превишаването му четецът от системата нагоре по веригата се отменя и заявката се прекратява незабавно с грешка, вместо да се разраства неограничен низ до изчерпване на динамичната памет. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Максимален брой байтове по мрежата, препращани от заглавките на отговора от източника. Когато бюджетът бъде надвишен, заглавките с по-нисък приоритет (напр. персонализирани `x-codex-*`, `x-oai-request-id`) се премахват, за да се спазят обичайните ограничения за размера на заглавките на обратните проксита. Задайте по-висока стойност, за да препращате повече метаданни от източника за сметка на по-голям размер на заглавките на отговора. | +| `CORS_ORIGIN` | _(не е зададено)_ | `src/server/cors/origins.ts` | Остарял списък с разрешени източници за CORS, поддържащ само един източник. За нови внедрявания предпочитайте `CORS_ALLOWED_ORIGINS`. CORS е предназначен само за браузърни API клиенти от различен източник; удостоверените операции за запис в таблото за управление вместо това използват заявки от същия източник и обвързана със сесията CSRF защита. | +| `CORS_ALLOWED_ORIGINS` | _(не е зададено)_ | `src/server/cors/origins.ts` | Разделен със запетаи списък с разрешени източници за CORS. Не се изпраща заместващ символ, освен ако `CORS_ALLOW_ALL=true` не е изрично конфигурирано. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Авариен механизъм само за среди за разработка, който отразява всеки браузърен `Origin`. Не го активирайте в споделени или продукционни внедрявания. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Блокирайте извикванията към доставчици, насочени към частни/loopback/link-local диапазони от IP адреси. Деактивирайте само в изолирани тестови среди. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Разрешава URL адреси на доставчици, сочещи към частни/локални мрежи (localhost, 192.168.x.x, 10.x.x.x и т.н.). **ИЗИСКВА СЕ за самостоятелно хоствани доставчици** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Когато е `false`, таблото за управление отхвърля валидирането на локални URL адреси. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Разрешава добавянето/валидирането на доставчици на локални/частни адреси (127.0.0.1, localhost, LAN, частни диапазони) — ограничено до пътя за валидиране на доставчика. **По подразбиране е `true`** (с приоритет на локалната среда); задайте `false`, за да наложите строго блокиране, допускащо само публични адреси. Крайните точки за облачни метаданни (169.254.169.254, metadata.google.internal) остават блокирани независимо от настройката. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Позволява на маршрутите `/v1/audio/*` (транскрипции, реч, преводи) да използват съвместим с OpenAI възел на доставчик, хостван извън localhost. Изключено по подразбиране — насочването на аудио към отдалечен хост променя изходящата идентичност и трябва да бъде изрично решение на оператора. Loopback/частните възли (localhost, 127.0.0.1, 172.16-31.x) винаги са разрешени и не се засягат. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Позволява на `POST /v1/rerank` (и loopback стъпката за пренареждане на машината за памет) да използва съвместим с OpenAI възел на доставчик, хостван извън localhost — машина в LAN или Tailscale партньор, изпълняващ TEI, Infinity, vLLM и т.н. Изключено по подразбиране — насочването към отдалечен хост променя изходящата идентичност и трябва да бъде изрично решение на оператора. Loopback възлите (localhost, 127.0.0.1, 172.16-31.x) винаги са разрешени и не се засягат. Отдалечените възли трябва също да отговарят на правилата за изходящи URL адреси на доставчика (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); към хостове за облачни метаданни никога не се маршрутизира. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Когато OIDC е активиран, деактивира влизането с парола, така че потребителите да могат да се удостоверяват само чрез OIDC Single Sign-On. Приема се и краткият псевдоним `OIDC_DISABLE_PASSWORD_LOGIN`; функционалният флаг със същия ключ в таблото за управление е с предимство. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Кратък псевдоним на `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | + +### Контролен списък за подсилване на сигурността ```bash -# Минимални изисквания за сигурност в производствена среда: +# Минимални изисквания за сигурност в продукционна среда: AUTH_COOKIE_SECURE=true # Изисква HTTPS REQUIRE_API_KEY=true # Удостоверяване на всички прокси извиквания -ALLOW_API_KEY_REVEAL=false # Никога не показвайте ключове в потребителския интерфейс +ALLOW_API_KEY_REVEAL=false # Никога не показвайте ключовете в потребителския интерфейс CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # Ограничение от 5 MB ``` @@ -302,59 +302,66 @@ OmniRoute осигурява двуслойна защита: сканиране ## 6. Политики за инструменти и маршрутизиране -| Променлива | По подразбиране | Файл източник | Описание | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Управлява достъпа на LLM до извикване на инструменти/функции. `allowlist` = само изброените инструменти, `denylist` = всички освен изброените, `disabled` = без ограничения. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Път до JSON файла с правила за манипулиране на полезния товар (специфични за модел/протокол корекции към доставчика нагоре по веригата). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Интервал за презареждане (ms) на файла с правила за полезния товар в движение. Минимум `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Опционална настройка: маршрутизира идентификатори на модели `claude-*` без префикс от клиенти на Claude Code през OAuth акаунта на Claude Code, вместо да изисква префикс на доставчик. Изричните префикси на доставчици продължават да имат предимство. Може да се конфигурира и чрез превключвател в таблото за управление на страницата на доставчика Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Ограничение на едновременните заявки за всеки модел при комбинации с циклично разпределение (#9100). Семафорът за комбинации с циклично разпределение беше твърдо ограничен до 3 едновременни заявки за модел без възможност за промяна, което поставяше трафика с по-висока паралелност на изчакване зад това ограничение. Валидира се да бъде `>= 1` и се ограничава до `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Опасна опционална настройка, която пропуска локалната проверка на OmniRoute за контекстния прозорец / максималния брой входни токени при директни заявки към единичен модел. Доставчиците нагоре по веригата продължават да налагат действителните си ограничения; компресирането на подканата и собственото ограничение на модела за изходни токени остават активни. Действащият приоритет е: замяна от БД за флагове на функции > променлива на средата > стойност по подразбиране; не се изисква рестартиране. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(не е зададено)_ | `open-sse/services/conversationTracker.ts` | Задайте `1`, за да спрете събирането на историята на разговорите. `resolveConversationId()` връща непроследяван резултат, преди да прочете SQLite или да анализира историята на съобщенията, като се обхващат и предоставените от клиента идентификатори на сесии. Обработката на сесиите за маршрутизиране остава непроменена и съществуващите записи не се изтриват. Предназначено е за внедрявания, които не използват изгледа за разговори в таблото за управление и искат таблицата с реплики да спре да нараства. | +| Променлива | По подразбиране | Файл източник | Описание | +| ----------------------------------------------------------- | ----------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Управлява достъпа на LLM до инструменти/извикване на функции. `allowlist` = само изброените инструменти, `denylist` = всички освен изброените, `disabled` = без ограничения. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Път до JSON файла с правила за манипулиране на полезния товар (специфични за модела/протокола корекции към доставчика нагоре по веригата). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Интервал за презареждане (ms) на файла с правила за полезния товар без прекъсване. Минимум `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Опционално: маршрутизира идентификаторите на модели `claude-*` без префикс от клиенти на Claude Code през OAuth акаунта на Claude Code, вместо да изисква префикс на доставчик. Изричните префикси на доставчици продължават да имат предимство. Може да се конфигурира и чрез превключвател в таблото на страницата на доставчика Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Ограничение на паралелността за всеки модел при циклично разпределяни комбинации (#9100). Семафорът за комбинации с циклично разпределение беше твърдо ограничен до 3 едновременни заявки на модел без възможност за промяна, което принуждаваше трафика с по-висока паралелност да се изпълнява последователно зад това ограничение. Валидира се да е `>= 1` и се ограничава до `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Опасна опционална настройка, която пропуска локалната проверка на OmniRoute за контекстния прозорец/максималния брой входни токени при директни заявки към един модел. Доставчиците нагоре по веригата продължават да налагат действителните си ограничения; компресирането на подканата и собственото ограничение на модела за изходни токени остават активни. Ефективният приоритет е замяна от базата данни за флагове на функционалности > променлива на средата > стойност по подразбиране; не се изисква рестартиране. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(не е зададено)_ | `open-sse/services/selfHostedEntry.ts` | Вграден YAML документ `providers:` (RIC-738, D4). Когато е зададен (със или без блок `strategy:`), `/v1/chat/completions` се пренасочва към унифицираната, самостоятелно хоствана и съвместима с OpenAI входна точка вместо към облачния конвейер. Когато не е зададен (по подразбиране), маршрутът преминава директно към съществуващия облачен конвейер. Вижте `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(не е зададено)_ | `open-sse/services/selfHostedEntry.ts` | Път до YAML файл, съдържащ същия документ `providers:` като `OMNIROUTE_SELF_HOSTED_PROVIDERS`, за внедрявания, които предпочитат файл пред вградена променлива на средата. Всеки от двата варианта активира самостоятелно хостваната входна точка. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(не е зададено — отворен маршрут)_ | `open-sse/services/selfHostedEntry.ts` | Незадължителен споделен API ключ за унифицираната самостоятелно хоствана входна точка (скеле D5, запазено за системата за квоти за отделните ключове). Когато е зададен, заявките трябва да включват `Authorization: Bearer `. Когато не е зададен, маршрутът е отворен, съгласно съществуващия модел за самостоятелно хостван локален доставчик (внедряване в loopback/доверена мрежа). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(не е зададено)_ | `open-sse/services/routingStrategies.ts` | Вграден YAML документ `strategy:` за детерминирания механизъм за маршрутизиране (M2/RIC-740, D3) — черен/бял списък, прекъсвач с период на изчакване, приоритет по цена, отчитане на закъснението, резервна верига. Заменя за всеки ключ вграден блок `strategy:`, вложен в `OMNIROUTE_SELF_HOSTED_PROVIDERS`. Вижте `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(не е зададено)_ | `open-sse/services/routingStrategies.ts` | Път до YAML файл, съдържащ същия документ `strategy:` като `OMNIROUTE_SELF_HOSTED_STRATEGY`, за внедрявания, които предпочитат файл пред вградена променлива на средата. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(не е зададено)_ | `open-sse/services/conversationTracker.ts` | Задайте `1`, за да спрете събирането на историята на разговорите. `resolveConversationId()` връща непроследяван резултат, преди да прочете SQLite или да анализира историята на съобщенията, като предоставените от клиента идентификатори на сесии също са обхванати. Обработката на сесиите за маршрутизиране остава непроменена и съществуващите записи не се изтриват. Предназначено е за внедрявания, които не използват изгледа за разговори в таблото и при които се цели спиране на нарастването на таблицата с реплики. | --- -## 7. URL адреси и синхронизация в облака - -| Променлива | По подразбиране | Изходен файл | Описание | -| ---------------------------------------- | ----------------------------------------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL от страна на сървъра, чрез който вътрешните задачи за синхронизиране извикват `/api/sync/cloud`. Запазете го като URL за loopback/контейнер дори когато приложението е публично достъпно чрез прокси. | -| `CLOUD_URL` | _(празно)_ | `src/lib/cloudSync.ts` | URL на крайната точка на облачното реле (премиум функция). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | HTTP време за изчакване при заявки за облачно синхронизиране. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Конфигурация за компилиране на Webpack | Профил по време на компилиране (задайте `minimal`, за да изключите физически привилегированите модули от пакета). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ самостоятелен изход_ | `scripts/build/colocate-standalone.mjs` | Замяна по време на компилиране за директорията със самостоятелния изход, използвана от стъпката за съвместно разполагане след компилирането. Това не е настройка по време на изпълнение. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(празно)_ | `src/lib/cloudSync.ts` | Споделена тайна, използвана за проверка на HMAC-SHA256 подписа на отговорите от Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Задайте `true`, за да позволите на крайната точка на Cloud Sync да презаписва локалните идентификационни данни. Стойността по подразбиране е `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Задайте `true`, за да отхвърляте неподписан отговор от Cloud Sync, когато не е конфигурирана локална тайна (#13679). Наличният подпис винаги се проверява — и винаги се отхвърля, когато `OMNIROUTE_CLOUD_SYNC_SECRET` не е зададена — независимо от този флаг. Във v3.9 стойността по подразбиране става задължителна проверка. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Задайте `true`, за да се върнете към едностъпковото поведение „импортирай всичко“ от v3.8.5 без потвърждение от потребителя. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, табло, синхронизиране | Публичен URL за OAuth redirect_uri, връзките в таблото и генерираните публични URL адреси. Задайте го на стабилния публичен URL, когато OAuth обратните извиквания или генерираните връзки за браузър трябва да използват каноничен хост на обратното прокси. | -| `NEXT_PUBLIC_CLOUD_URL` | _(празно)_ | От страна на клиента | Клиентско огледало на `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(незададено)_ | `src/shared/services/cloudSyncScheduler.ts` | Остарял резервен вариант за `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(незададено)_ | Резолвер на публичния произход, URL адреси на изображения | Произходът на OmniRoute с най-висок приоритет, видим за браузъра и използван за генериране на публични URL адреси и валидиране на произхода в браузъра извън таблото. Задайте го, когато OpenWebUI или друго реле достига до OmniRoute чрез вътрешен URL, но браузърът на потребителя трябва да извлича генерираната медия от LAN, тунел или публичен произход. **Не** включвайте `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(незададено)_ | `open-sse/config/providerPluginManifestUrl.ts` | Абсолютен URL на манифеста на приставката за доставчика, обявяван на страничните клиенти. Когато не е зададен, OmniRoute извежда `/api/v1/provider-plugin-manifest` от произхода на заявката или от HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Протокол, използван при извеждане на URL адреса на манифеста на приставката за доставчика от HOST/PORT без произход на заявката. Задайте `https` зад публично прокси, което прекратява TLS, когато няма изрично зададен `OMNIROUTE_PROVIDER_MANIFEST_URL`. | -| `OMNIROUTE_TRUST_PROXY` | _(незададено)_ | `src/server/origin/publicOrigin.ts` | Незадължителен режим на доверие за препратени заглавки за публичен произход. Незададено = да не се доверява на `Forwarded` / `X-Forwarded-*` при решения за сигурност. `true` / `loopback` се доверява на препратения хост/протокол само от loopback прокси с маркер. `private` / `lan` се доверява и на прокси възли в частната LAN. В продукционна среда предпочитайте изрично зададен `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(незададено)_ | `open-sse/utils/kieTask.ts` | Публичен URL за обратно извикване за асинхронни задачи на kie.ai. Замяна с най-висок приоритет преди `OMNIROUTE_KIE_CALLBACK_URL` и `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(незададено)_ | `open-sse/utils/kieTask.ts` | Алтернативно изписване на `KIE_CALLBACK_URL`. Използва се като резервен вариант, когато основната променлива не е зададена. | -| `OMNIROUTE_PUBLIC_URL` | _(незададено)_ | `open-sse/utils/kieTask.ts` | Публичен произход, използван за съставяне на URL адреси за асинхронно обратно извикване. Резервен вариант с най-нисък приоритет за обратните извиквания на kie.ai; използва се и като общ публичен URL за други релета. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Крайна точка за проверка на квотата на CrofAI, използвана от страницата за потребление. Може да се замени за релета/тестови конфигурации. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Официална крайна точка за потреблението на OpenCode Go с удостоверяване чрез API ключ, използвана от страницата за потребление. Може да се замени за релета/тестови конфигурации. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Синтезира заглавки за идентичност на OpenCode CLI (User-Agent, x-opencode-client/project, UUID на заявката/сесията) при заявки нагоре по веригата към opencode-go/zen, които клиентът не е изпратил, така че Cloudflare при изходящ трафик от VPS да ги приеме (#6210/#5997). Включено по подразбиране от #10571; деактивирайте с `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | User-Agent по подразбиране, използван, когато `OPENCODE_SYNTHESIZE_CLI_HEADERS` е включено и не е зададена замяна `_USER_AGENT` за конкретния доставчик. Прилага се само към изпълнителите на opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Стойност за синтезираната заглавка `x-opencode-client`, когато `OPENCODE_SYNTHESIZE_CLI_HEADERS` е включено. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Стойност за синтезираната заглавка `x-opencode-project`, когато `OPENCODE_SYNTHESIZE_CLI_HEADERS` е включено. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL на настройките на Ollama Cloud, използван за извличане на квотата. Може да се замени за релета/тестови конфигурации. | -| `OLLAMA_USAGE_COOKIE` | _(незададено)_ | `open-sse/services/usage.ts` | Бисквитка `__Secure-session` на Ollama Cloud, използвана за извличане на квотата от страницата с настройки. Чувствителна информация; предпочитайте полето за отделна връзка в таблото, когато са конфигурирани няколко акаунта. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(незададено)_ | `open-sse/services/usage.ts` | Алтернативна променлива на средата за бисквитката `__Secure-session` на Ollama Cloud. Чувствителна информация; предпочитайте полето за отделна връзка в таблото, когато са конфигурирани няколко акаунта. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(незададено)_ | `open-sse/services/usage.ts` | Алтернативна променлива на средата за бисквитката `__Secure-session` на Ollama Cloud, използвана преди по-кратките псевдоними. Чувствителна информация; предпочитайте полето за отделна връзка в таблото, когато са конфигурирани няколко акаунта. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Крайна точка за ограниченията на потреблението на CodeWhisperer (AWS Kiro). Може да се замени за релета/тестови конфигурации. | +## 7. URL адреси и облачна синхронизация + +| Променлива | Стойност по подразбиране | Файл източник | Описание | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL адрес от страна на сървъра, чрез който вътрешните задачи за синхронизиране извикват `/api/sync/cloud`. Запазете го като loopback URL адрес или URL адрес на контейнер дори когато приложението е публично достъпно чрез прокси. | +| `CLOUD_URL` | _(празно)_ | `src/lib/cloudSync.ts` | URL адрес на крайната точка за облачно препредаване (платена функционалност). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Време за изчакване на HTTP заявките за облачно синхронизиране. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Конфигурация за компилиране на Webpack | Профил при компилиране (задайте `minimal`, за да изключите физически привилегированите модули от пакета). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ самостоятелен изход_ | `scripts/build/colocate-standalone.mjs` | Заместваща стойност при компилиране за директорията със самостоятелния изход, използвана от стъпката за съвместно разполагане след компилирането. Това не е настройка по време на изпълнение. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(празно)_ | `src/lib/cloudSync.ts` | Споделена тайна, използвана за проверка на HMAC-SHA256 подписа на отговорите от Cloud Sync. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Задайте `true`, за да разрешите на крайната точка на Cloud Sync да презаписва локалните идентификационни данни. Стойността по подразбиране е `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Задайте `true`, за да отхвърлите неподписан отговор от Cloud Sync, когато не е конфигурирана локална тайна (#13679). Наличният подпис винаги се проверява — и винаги се отхвърля, когато `OMNIROUTE_CLOUD_SYNC_SECRET` не е зададена — независимо от този флаг. Във v3.9 стойността по подразбиране става задължително налагане. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Задайте `true`, за да се върнете към поведението от v3.8.5 за едностъпково „импортиране на всичко“ без потвърждение от потребителя. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, табло, синхронизиране | Публичен URL адрес за OAuth redirect_uri, връзките в таблото и генерираните публични URL адреси. Задайте го на стабилния публичен URL адрес, когато обратните извиквания на OAuth или генерираните връзки за браузър трябва да използват каноничен хост на обратен прокси сървър. | +| `NEXT_PUBLIC_CLOUD_URL` | _(празно)_ | От страна на клиента | Огледална стойност на `CLOUD_URL` от страна на клиента. | +| `NEXT_PUBLIC_APP_URL` | _(не е зададено)_ | `src/shared/services/cloudSyncScheduler.ts` | Остарял резервен вариант за `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(не е зададено)_ | Резолвер на публичния origin, URL адреси на изображения | Origin адресът на OmniRoute с най-висок приоритет, достъпен от браузъра и използван за генериране на публични URL адреси и валидиране на браузърния origin извън таблото за управление. Задайте това, когато OpenWebUI или друго реле достига до OmniRoute чрез вътрешен URL адрес, но браузърът на потребителя трябва да извлича генерираната мултимедия от LAN, тунел или публичен origin. **Не** включвайте `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(не е зададено)_ | `open-sse/config/providerPluginManifestUrl.ts` | Абсолютен URL адрес на манифеста на приставката за доставчика, обявяван на страничните клиенти. Когато не е зададен, OmniRoute извежда `/api/v1/provider-plugin-manifest` от origin адреса на заявката или от HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Протокол, използван при извеждане на URL адреса на манифеста на приставката за доставчика от HOST/PORT без origin адрес на заявката. Задайте на `https` зад публичен прокси сървър, прекратяващ TLS, когато не е зададен изрично `OMNIROUTE_PROVIDER_MANIFEST_URL`. | +| `OMNIROUTE_TRUST_PROXY` | _(не е зададено)_ | `src/server/origin/publicOrigin.ts` | Незадължителен режим на доверие за препратените заглавки на публичния origin. Незададено = да не се доверява на `Forwarded` / `X-Forwarded-*` при решения за сигурността. `true` / `loopback` се доверява на препратените хост/протокол само от loopback прокси с токен. `private` / `lan` се доверява и на прокси партньори в частна LAN мрежа. За продукционна среда предпочитайте изрично зададен `NEXT_PUBLIC_BASE_URL`. | +| `KIE_CALLBACK_URL` | _(не е зададено)_ | `open-sse/utils/kieTask.ts` | Публичен URL адрес за обратно извикване за асинхронни задачи на kie.ai. Заместваща стойност с най-висок приоритет преди `OMNIROUTE_KIE_CALLBACK_URL` и `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(не е зададено)_ | `open-sse/utils/kieTask.ts` | Алтернативно изписване на `KIE_CALLBACK_URL`. Използва се като резервен вариант, когато основната променлива не е зададена. | +| `OMNIROUTE_PUBLIC_URL` | _(не е зададено)_ | `open-sse/utils/kieTask.ts` | Публичен origin, използван за съставяне на URL адреси за асинхронно обратно извикване. Резервен вариант с най-нисък приоритет за обратни извиквания на kie.ai; използва се и като общ публичен URL адрес за други релета. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Крайна точка за проверка на квотата на CrofAI, използвана от страницата Usage. Заменете я за релета / тестови компоненти. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Официална крайна точка на OpenCode Go за използването, удостоверявана чрез API ключ и използвана от страницата Usage. Заменете я за релета / тестови компоненти. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Синтезира заглавки за идентичност на OpenCode CLI (User-Agent, x-opencode-client/project, UUID идентификатори на заявката/сесията) при upstream заявки на opencode-go/zen, които клиентът не е изпратил, така че Cloudflare да ги приема при изходящ трафик от VPS (#6210/#5997). Включено по подразбиране от #10571; изключете с `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Стойност на User-Agent по подразбиране, използвана, когато `OPENCODE_SYNTHESIZE_CLI_HEADERS` е включено и не е зададена заместваща стойност `_USER_AGENT` за отделния доставчик. Прилага се само към изпълнители на opencode. При заявка без ключ, която upstream системата ограничава, конфигурирана стойност, която не съдържа `opencode/= 1.17>`, се заменя с тази стойност по подразбиране, вместо заявката да бъде отказана. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Стойност за синтезираната заглавка `x-opencode-client`, когато `OPENCODE_SYNTHESIZE_CLI_HEADERS` е включено. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Стойност за синтезирания хедър `x-opencode-project`, когато `OPENCODE_SYNTHESIZE_CLI_HEADERS` е включена. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(не е зададена)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Задайте на `off`, за да спрете коригирането на тялото на OpenCode заявките без ключ (флага за поточно предаване и списъка с инструменти). Хедърите продължават да се прилагат. Стойността се прочита при всяка заявка, така че промяната влиза в сила незабавно. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(не е зададена)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Имена на инструменти, разделени със запетаи, които да се декларират в OpenCode заявка без ключ, която не съдържа такива, когато за този модел все още не са наблюдавани инструменти. При празна стойност се използва единичен заместващ инструмент, който моделът е инструктиран да не извиква. Най-много 32 записа, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; невалидните записи се игнорират. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL адрес на настройките на Ollama Cloud, използван за извличане на данни за квотата. Може да бъде заменен за ретранслатори / тестови конфигурации. | +| `OLLAMA_USAGE_COOKIE` | _(не е зададена)_ | `open-sse/services/usage.ts` | Бисквитка `__Secure-session` на Ollama Cloud, използвана за извличане на данни за квотата от страницата с настройки. Поверителна; когато са конфигурирани няколко акаунта, предпочитайте полето за всяка отделна връзка в таблото за управление. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(не е зададена)_ | `open-sse/services/usage.ts` | Алтернативна променлива на средата за бисквитката `__Secure-session` на Ollama Cloud. Поверителна; когато са конфигурирани няколко акаунта, предпочитайте полето за всяка отделна връзка в таблото за управление. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(не е зададена)_ | `open-sse/services/usage.ts` | Алтернативна променлива на средата за бисквитката `__Secure-session` на Ollama Cloud, използвана преди по-кратките псевдоними. Поверителна; когато са конфигурирани няколко акаунта, предпочитайте полето за всяка отделна връзка в таблото за управление. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Крайна точка за ограниченията на използването на CodeWhisperer (AWS Kiro). Може да бъде заменена за ретранслатори / тестови конфигурации. | > [!IMPORTANT] -> При внедряване зад обратен прокси (nginx, Caddy) задайте `NEXT_PUBLIC_BASE_URL` на вашия стабилен публичен URL адрес (напр. `https://omniroute.example.com`), когато OAuth обратните извиквания или генерираните публични връзки трябва да използват това име на хост. Без тази настройка OAuth обратните извиквания може да са неуспешни, защото redirect_uri няма да съвпада, а генерираните публични връзки може да сочат към вътрешния източник на контейнера. +> При внедряване зад обратен прокси сървър (nginx, Caddy) задайте `NEXT_PUBLIC_BASE_URL` на вашия стабилен публичен URL адрес (напр. `https://omniroute.example.com`), когато OAuth обратните извиквания или генерираните публични връзки трябва да използват това име на хост. Без това OAuth обратните извиквания могат да бъдат неуспешни, защото `redirect_uri` няма да съвпада, а генерираните публични връзки могат да сочат към вътрешния адрес на контейнера. > -> Запазете `BASE_URL` като вътрешен loopback URL адрес или URL адрес на контейнер за задачи от сървър към сървър. Не използвайте `Origin` от браузър или публично име на хост за вътрешни самостоятелни заявки, съдържащи идентификационни данни. +> Запазете `BASE_URL` като вътрешен URL адрес за loopback/контейнер за задачи от сървър към сървър. Не използвайте браузърен `Origin` или публично име на хост за вътрешни самозаявки, съдържащи идентификационни данни. > -> Удостоверените операции за запис в таблото за управление не изискват статичен публичен базов URL адрес: таблото изпраща към същия източник небезопасни заявки със CSRF токен, обвързан със сесията. OmniRoute все пак централизира валидирането на публичния източник за браузърни интеграции извън таблото за управление: първо се доверява на изрично зададените променливи на средата за публичен URL адрес; необработените заглавки `Forwarded` / `X-Forwarded-*` се игнорират, освен ако `OMNIROUTE_TRUST_PROXY` не е активирана и непосредственият прокси партньор не е маркиран с токен като доверен. Не използвайте настройките на CORS, за да коригирате заявките от таблото за управление към същия източник; CORS е предназначен само за браузърни клиенти от друг източник. +> Удостоверените операции за запис от таблото за управление не изискват статичен публичен базов URL адрес: таблото изпраща опасните заявки от същия произход със свързан със сесията CSRF токен. OmniRoute все пак централизира валидирането на публичния произход за браузърни интеграции извън таблото за управление: първо се доверява на изрично зададените променливи на средата за публичен URL адрес; необработените хедъри `Forwarded` / `X-Forwarded-*` се игнорират, освен ако `OMNIROUTE_TRUST_PROXY` е включена и непосредственият прокси сървър е маркиран с токен като доверен. Не използвайте настройките на CORS, за да коригирате заявки от същия произход на таблото за управление; CORS е само за браузърни клиенти от различен произход. --- @@ -587,48 +594,49 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude --- -## 11. Идентификационни данни за OAuth доставчик - -Вградени идентификационни данни за **разработка на localhost**. За отдалечени внедрявания регистрирайте свои собствени в конзолата за разработчици на всеки доставчик. - -| Променлива | Доставчик | Бележки | -| --------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Публичен клиент — не е необходима тайна. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Заменя URI адреса за пренасочване. По подразбиране: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Публичен клиент. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Изисква съответстваща променлива `_SECRET`. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Публичен клиент. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Изисква съответстваща променлива `_SECRET`. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Публичен клиент. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Незадължителна замяна на ID на OAuth клиента на GitHub Enterprise Copilot. Ако не е зададена, се използва публичната стойност по подразбиране на `GITHUB_OAUTH_CLIENT_ID`. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Резервен API ключ, използван от `open-sse/executors/devin-cli.ts`, когато няма налични идентификационни данни за конкретната връзка. Незадължителен. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Персонализиран път до изпълнимия файл на Devin CLI (`devin`). Разрешава се от `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID на OAuth клиента за GitLab Duo. Регистрирайте приложение на `https://gitlab.com/-/profile/applications` с URI за пренасочване `/callback` и обхвати `api, read_user, openid, profile, email`. Ако не е зададена, се използва `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Тайна на OAuth клиента за GitLab Duo. Незадължителна — потокът PKCE не изисква тайна. Ако не е зададена, се използва `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Заменя базовия URL адрес на GitLab (самостоятелно хостван GitLab). По подразбиране е `https://gitlab.com`. Ако не е зададена, се използва `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Остаряла резервна променлива за `GITLAB_DUO_BASE_URL`. Използва се, когато вариантът с `_DUO_` не е зададен. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Остаряла резервна променлива за `GITLAB_DUO_OAUTH_CLIENT_ID`, използвана от `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Остаряла резервна променлива за `GITLAB_DUO_OAUTH_CLIENT_SECRET`, използвана от `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Задайте я, за да активирате Qoder OAuth. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Резервен директен API ключ (заобикаля OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | ID на работното пространство за Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Псевдоним за `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Заменя директорията за конфигурация на Qoder CLI (изолирана PAT сесия, която предотвратява презаписването на данните за вход през браузър). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Фронтенд токен `tk`, който се изпраща като `validated` към `/api/chat`. Задължителен, когато Blackbox налага съвпадение на токените; в противен случай OmniRoute използва като резервен вариант произволен UUID. Вижте проблем #2252. | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | Съвместим с OpenAI базов URL адрес за извиквания към vision bridge, които не използват Anthropic. По подразбиране се използва остарялата променлива на средата за OpenAI URL или api.openai.com. Насочете го към собствения цикъл `/v1` на OmniRoute или към която и да е съвместима с OpenAI крайна точка (Gemini OpenAI-compat, OpenRouter). Проблем #2232. Когато URL адресът е собственият `/v1` на OmniRoute, подпроцесът за описание изпраща `x-omniroute-admission-bypass: internal` и се удостоверява с определените идентификационни данни за собствения цикъл (маркерът `sk_omniroute` в локален режим или `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), така че внедряванията с `REQUIRE_API_KEY=true` да работят. | -| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | API ключ за горния URL адрес. Заменя променливите на средата за OpenAI / Google за отделните доставчици при извиквания към vision bridge, които не използват Anthropic. Моделите на Anthropic запазват своя специализиран път за ключ на Anthropic. Проблем #2232. | +## 11. Идентификационни данни за OAuth доставчици + +Вградени идентификационни данни за **разработка на localhost**. За отдалечени внедрявания регистрирайте свои собствени във конзолата за разработчици на всеки доставчик. + +| Променлива | Доставчик | Бележки | +| --------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Публичен клиент — не е необходима тайна. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Заменя URI за пренасочване. По подразбиране: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Публичен клиент. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Изисква съответстваща променлива `_SECRET`. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Публичен клиент. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Изисква съответстваща променлива `_SECRET`. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Публичен клиент. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Незадължителна замяна на OAuth клиентския идентификатор за GitHub Enterprise Copilot. Ако не е зададена, се използва публичната стойност по подразбиране на `GITHUB_OAUTH_CLIENT_ID`. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Незадължителна замяна на идентификатора за клиентска интеграция на GitHub Copilot, изпращан в заглавките `Copilot-Integration-Id` и `Editor-Plugin-Version`. По подразбиране е `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Резервен API ключ, използван от `open-sse/executors/devin-cli.ts`, когато няма налични идентификационни данни за конкретната връзка. Незадължителен. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Персонализиран път до изпълнимия файл на Devin CLI (`devin`). Разпознава се от `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | OAuth клиентски идентификатор за GitLab Duo. Регистрирайте приложение на `https://gitlab.com/-/profile/applications` с URI за пренасочване `/callback` и обхвати `api, read_user, openid, profile, email`. Ако не е зададен, се използва `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth клиентска тайна за GitLab Duo. Незадължителна — потокът PKCE не изисква тайна. Ако не е зададена, се използва `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Заменя базовия URL адрес на GitLab (самостоятелно хостван GitLab). По подразбиране е `https://gitlab.com`. Ако не е зададен, се използва `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Остаряла резервна променлива за `GITLAB_DUO_BASE_URL`. Използва се, когато вариантът `_DUO_` не е зададен. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Остарял резервен вариант за `GITLAB_DUO_OAUTH_CLIENT_ID`, използван от `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Остарял резервен вариант за `GITLAB_DUO_OAUTH_CLIENT_SECRET`, използван от `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Задайте, за да активирате Qoder OAuth. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Резервен вариант с директен API ключ (заобикаля OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | Идентификатор на работното пространство за Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Псевдоним за `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Замества директорията за конфигурация на Qoder CLI (изолирана PAT сесия, която предотвратява презаписването на вход през браузър). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Токенът `tk` на клиентската част, който да бъде изпратен като `validated` към `/api/chat`. Задължителен е, когато Blackbox налага съвпадение на токените; в противен случай OmniRoute използва като резервен вариант произволен UUID. Вижте проблем #2252. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | Съвместим с OpenAI базов URL адрес за извиквания към vision bridge, които не използват Anthropic. По подразбиране се използва URL адресът от остарялата OpenAI променлива на средата или api.openai.com. Насочете го към собствения цикличен адрес `/v1` на OmniRoute или към произволна съвместима с OpenAI крайна точка (Gemini OpenAI-compat, OpenRouter). Проблем #2232. Когато URL адресът е собственият `/v1` на OmniRoute, подзаявката за описание изпраща `x-omniroute-admission-bypass: internal` и се удостоверява с определените идентификационни данни за цикличната връзка (маркерът `sk_omniroute` в локален режим или `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), така че внедряванията с `REQUIRE_API_KEY=true` да работят. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | API ключ за горния URL адрес. Замества OpenAI / Google променливите на средата за отделните доставчици при извиквания към vision bridge, които не използват Anthropic. Моделите на Anthropic продължават да използват своя специален път за ключове на Anthropic. Проблем #2232. | > [!WARNING] > -> 1. Отидете на [Google Cloud Console → Идентификационни данни](https://console.cloud.google.com/apis/credentials) -> 2. Създайте клиентски идентификатор за OAuth 2.0 (тип: „Уеб приложение“) -> 3. Добавете URL адреса на сървъра си като разрешен URI за пренасочване +> 1. Отворете [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) +> 2. Създайте OAuth 2.0 Client ID (тип: „Web application“) +> 3. Добавете URL адреса на сървъра си като упълномощен URI за пренасочване > 4. Заменете стойностите на идентификационните данни в `.env`. --- @@ -730,11 +738,11 @@ API ключове за доставчици, които използват ди --- -## 15. Настройки за изчакване +## 15. Настройки за изтичане на времето Всички стойности са в **милисекунди**. Централизирано определяне в `src/shared/utils/runtimeTimeouts.ts`. -### Йерархия на изчакванията +### Йерархия на времевите ограничения ``` REQUEST_TIMEOUT_MS (глобално заместване) @@ -747,115 +755,116 @@ REQUEST_TIMEOUT_MS (глобално заместване) │ ├── FETCH_CONNECT_TIMEOUT_MS (независимо, по подразбиране: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (независимо, по подразбиране: 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (наследява от REQUEST_TIMEOUT_MS, по подразбиране: 600000) -├─→ STREAM_ACTIVE_TIMEOUT_MS (независимо, по подразбиране: 1260000; 0 деактивира) +├─→ STREAM_ACTIVE_TIMEOUT_MS (независимо, по подразбиране: 1260000; 0 го деактивира) ├─→ STREAM_READINESS_TIMEOUT_MS (наследява от REQUEST_TIMEOUT_MS, по подразбиране: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (ограничава адаптивните удължавания на готовността, по подразбиране: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (наследява от REQUEST_TIMEOUT_MS, по подразбиране: 30000) - ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (изчислено, по подразбиране: 300000) + ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (изведено, по подразбиране: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (по подразбиране: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (по подразбиране: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (по подразбиране: 0 = деактивирано) ``` -| Променлива | По подразбиране | Описание | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(не е зададено)_ | Глобална съкратена настройка — заменя стойностите по подразбиране както на `FETCH_TIMEOUT_MS`, така и на `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Общото време за изчакване на HTTP заявките към външни доставчици. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Максималният период без постъпване на необработени байтове от външния доставчик, преди операцията да бъде прекратена. Моделите с разширено разсъждение рядко правят пауза >90s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Максималната обща продължителност на активен SSE поток; никога не се нулира при получаване на байтове от външния доставчик и не зависи от `REQUEST_TIMEOUT_MS`. Изведена е от най-голямата стойност `timeoutMs` за отделен модел в регистъра (1200000, Codex), плюс резерв от 60000, така че модел, на който е позволено да използва целия си бюджет, никога да не бъде прекратен по средата на отговора. Задайте `0`, за да я деактивирате. | -| `OMNIROUTE_SSE_COMMENTS` | _(деактивирано)_ | Дали OmniRoute може да изпраща редове за SSE коментари `:` (напр. периодичния сигнал `: keepalive` и завършващите редове с метаданни `x-omniroute-*`). Деактивирано по подразбиране (#10524), тъй като стриктните клиенти, съвместими с OpenAI, изпълняват JSON.parse върху всеки SSE ред и се сриват при коментари `:`; периодичните сигнали `data:` не са засегнати. Задайте `on`/`true`/`1`/`yes`, за да го активирате отново. Използва се от `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Времето за получаване на първото SSE събитие, което не е ping. Наследява `REQUEST_TIMEOUT_MS`, когато е зададена. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Максималният адаптивен интервал за изчакване на готовност до първото събитие при големи поточни заявки, заявки с интензивно използване на инструменти или с висока степен на разсъждение. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Авариен превключвател за евристиката `/goal`. Задайте `false`/`0`/`off`, за да деактивирате напълно откриването — времената за изчакване на готовност и възстановяването на потока никога не се увеличават въз основа на тялото/заглавките на заявката, което ограничава управляваното от клиента увеличаване на времето за изчакване. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Максималният интервал за изчакване на готовност до първото събитие за открити изпълнения на агент `/goal` или заявки, принудително обозначени с `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Автоматично активира ранното възстановяване на потока за открити изпълнения на агент `/goal`. Задайте `false`/`0`/`off`, за да деактивирате специфичното за целта включване. Това може само да ДОБАВИ възстановяване върху стойността по подразбиране на оператора — никога не отменя изричен отказ чрез настройките `STREAM_RECOVERY_ENABLED`/DB. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Премахва нестандартните SSE събития `codex.*` (напр. `codex.rate_limits`), които нарушават работата на `responses.stream()` от OpenAI SDK с грешка 502. По подразбиране е ВКЛЮЧЕНО (#11014). Задайте `0`/`false`/`no`/`off`, за да ги препращате. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(не е зададено)_ | Транспорт чрез Codex app-server с изрично включване. WebSocket крайна точка (`ws://`/`wss://`) на локален спомагателен процес `codex app-server`. Когато е зададена заедно с маркер, заявките към Codex се маршрутизират чрез JSON-RPC към спомагателния процес вместо към HTTP Responses API. Може да се задава и за отделна връзка чрез `providerSpecificData.codexAppServerUrl`. Използва се от `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(не е зададено)_ | Вграден маркер за права/удостоверяване, предоставян на app-server. Замяна за отделна връзка: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(не е зададено)_ | Път до файл, съдържащ маркера за права на app-server (от `codex app-server --ws-token-file`). Използва се, когато `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` не е зададена. Замяна за отделна връзка: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Работната директория, в която се изпълнява ходът на app-server. Замяна за отделна връзка: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(не е зададено)_ | Политиката за одобрение, предавана на хода на app-server (напр. `never`, `on-request`). Замяна за отделна връзка: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(не е зададено)_ | Политиката за изолирана среда, предавана на хода на app-server (напр. `read-only`, `workspace-write`, `danger-full-access`). Когато не е зададена, изпълнителят използва по подразбиране `workspace-write` (подсилена защита; преди `danger-full-access`). Замяна за отделна връзка: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Автоматично одобрява собствените подкани за одобрение на app-server (изпълнение на команди/файлове/права на хоста). Изключено по подразбиране — подканите се отказват автоматично; извикванията на инструменти от тестовата среда не са засегнати (те преминават през отделното директно препращане `item/tool/call`). Приема `true`/`1`/`yes`. Замяна за отделна връзка: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Времето за получаване на заглавките на отговора. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 сек.) | Максимално изчакване за начало на отговора (мс) за всеки директен опит без прокси. При изтичане на времето се прави един повторен опит с нов сокет; задайте `0`, за да деактивирате ограничението и да запазите предишното поведение. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Време за получаване на цялото тяло на отговора. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Време за изчакване за установяване на TCP връзка. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Време на неактивност на keep-alive сокета. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Време за изчакване на проксито за TLS отпечатък (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Ограничава времето до първия байт конкретно за тялото при транспорта с TLS отпечатък на wreq-js; само `TLS_CLIENT_TIMEOUT_MS` не може да засече блокирало тяло, тъй като приключва веднага щом заглавките пристигнат (#12656). При изтичане на времето четецът на wreq се отменя и се преминава към директния/прокси диспечера; `0` деактивира наблюдението. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Само за изпълнителя OpenCode и само когато функционалният флаг `OPENCODE_RESPONSES_STALL_ROTATION` е включен (по подразбиране е изключен): ограничава изчакването за първия байт от тялото на поточен отговор Responses след неговите заглавки (#13484). Потокът Responses започва с `response.created`, така че липсата на данни след този интервал се счита за блокиране: акаунтът временно се поставя в период на изчакване и заявката се пренасочва еднократно към следващия акаунт; при второ блокиране заявката се прекратява незабавно с грешка. `0` деактивира защитата дори когато флагът е включен. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Време за изчакване на прокси прехода за мостови заявки към `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Насочва изпълнителя на Firecrawl за извличане от уеб към самостоятелно хоствана инстанция (API ключът е незадължителен извън облачната услуга). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Време за изчакване за всяка заявка на изпълнителя на Firecrawl за извличане от уеб. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Общо време за изчакване на сървърна заявка за моста. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Време за изпращане на заглавките на отговора чрез моста. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Време на неактивност на keep-alive връзката на моста. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Време за изчакване на необработения сокет (0 = деактивирано). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Гратисен период при SIGTERM/SIGINT преди принудително прекратяване. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Резервна стойност, използвана от `src/shared/utils/fetchTimeout.ts`, когато `FETCH_TIMEOUT_MS` не е зададена. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Време за изчакване (мс) за предварително зададените конфигурации `validationRead` и `modelsProbe` в `src/shared/network/safeOutboundFetch.ts`. Увеличете го за бавни крайни точки (Cerebras, Cloudflare AI, Groq), за да предотвратите колебания между активно състояние и грешка в таблото за управление. При невалидни (<1000) или нечислови стойности се използва резервна стойност от 8000 мс. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Специфично за ретранслатора време за изчакване при извличане в `open-sse/utils/proxyFetch.ts` (#9158). Блокирал ретранслатор трябва да върне грешка преди изтичането на времето за изчакване на клиента/агента (~30 сек.), така че извикващите да видят специфична за ретранслатора грешка вместо общо изтичане на времето за изчакване от източника. Ограничено е до `29000`, за да се задейства винаги първо. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Споделено забавяне преди повторен опит за пътищата с еднократен повторен опит чрез директна връзка/ретранслатор/прокси в `open-sse/utils/proxyFetch.ts` (#9158). `0` = незабавен повторен опит. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Време за изчакване на нативна заявка на wreq-js (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Абсолютен допълнителен период за крайния срок в JS, добавен към нативното време за изчакване. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Време за изчакване на нативна заявка на wreq-js (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Абсолютен допълнителен период за крайния срок в JS, добавен към нативното време за изчакване. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (изключено) | Добавя „Имате вградено търсене в мрежата. Отговаряйте директно на въпросите, използвайки резултатите от търсенето.“ към системното съобщение на извикващата страна (`perplexity-web/protocol.ts`). Изключено по подразбиране — Perplexity така или иначе извършва търсене, а изречението се появява в отговорите като метакоментар за клиентите за програмиране. Задайте `1`/`true`/`yes`/`on`, за да го възстановите. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Време за изчакване на нативната заявка на wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Допълнителен толеранс към абсолютния краен срок в JS, добавен върху нативното време за изчакване. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Време за изчакване на нативната заявка на wreq-js (`notionTlsClient.ts`); `notion-web` го увеличава за всяка заявка до `180000` при продължителни генерирания. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Допълнителен толеранс към абсолютния краен срок в JS, добавен върху нативното време за изчакване. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Споделен пул от браузъри на Playwright за чат с уеб бисквитки, работещ чрез браузър (`browserPool.ts`); задайте `off`, за да го деактивирате. | -| `OBSCURA_BIN` | `auto-detect` | Път до двоичния файл `obscura`, използван като основен енджин от пула от браузъри и изпълнителя на Cloudflare Playground (`open-sse/services/obscura.ts`); автоматично се открива чрез системната PATH, когато не е зададен. | -| `OBSCURA_CDP_ENDPOINT` | _(незададено)_ | Насочва към вече работещ Obscura (`http://host:port`), вместо да стартира нов; модулът не управлява този процес (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | Изричен порт за стартирания `obscura serve`; когато не е зададен, автоматично се избира свободен порт (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Насочва заявка за чат с уеб бисквитки към изпълнение чрез браузър (`browserBackedChat.ts`); задайте `1`, за да го активирате. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Базов URL адрес за изпълнителя на Kimi Web (международния kimi.ai Connect-RPC) (`kimi-web.ts`); променяйте го само за огледални/прокси крайни точки. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Пълна крайна точка за чат за изпълнителя на Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(автоматично открит)_ | Път до системен изпълним файл на Chrome/Edge за интерактивното влизане през браузър в Adobe Firefly (`adobeFireflyBrowserLogin.ts`); заменя автоматичното откриване според операционната система. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ самостоятелен изход_ | Замяна по време на компилиране на директорията за самостоятелния изход, използвана от стъпката за съвместно разполагане след компилирането (`scripts/build/colocate-standalone.mjs`); настройка на инструментите за компилиране, а не за изпълнение. | - -Опитите към целите на комбинацията наследяват разрешеното време за изчакване на заявката към услугата нагоре по веригата (`FETCH_TIMEOUT_MS` или -`REQUEST_TIMEOUT_MS`, когато то задава стойността по подразбиране за извличането). Задавайте `targetTimeoutMs` в комбинация, -в стойностите по подразбиране на комбинацията или в замяната за доставчика само за да ускорите резервното превключване на комбинацията; стойностите над -текущото време за изчакване към услугата нагоре по веригата се ограничават до него. - -`comboTimeoutMs` е отделен общ времеви бюджет за цялата комбинация, обхващащ целите за резервно превключване. -Оставете го незададен или задайте `0`, за да запазите неограниченото обхождане (10-минутният -ограничител при блокиране `COMBO_LOOP_SAFETY_TIMEOUT_MS` продължава да се прилага). Положителна стойност заменя този -предпазен механизъм за комбинацията. Задайте `comboTimeoutMs` да е по-дълго от `targetTimeoutMs`, така че -да остане време за резервно превключване след бавна първа цел. +| Променлива | По подразбиране | Описание | +| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(не е зададено)_ | Глобална съкратена настройка — заменя стойностите по подразбиране както на `FETCH_TIMEOUT_MS`, така и на `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Общото време за изчакване на HTTP заявките към доставчици нагоре по веригата. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Максималният период без получени необработени байтове от източника нагоре по веригата, преди операцията да бъде прекратена. Моделите с разширено разсъждение рядко правят пауза >90 сек. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Максималната обща продължителност на активен SSE поток; никога не се нулира при получаване на байтове от източника нагоре по веригата и не зависи от `REQUEST_TIMEOUT_MS`. Изведена е от най-голямата стойност `timeoutMs` за отделен модел в регистъра (1200000, Codex), плюс резерв от 60000, така че модел, на който е позволено да използва пълния си времеви бюджет, никога да не бъде прекратен по средата на отговора. Задайте `0`, за да го деактивирате. | +| `OMNIROUTE_SSE_COMMENTS` | _(деактивирано)_ | Дали OmniRoute може да изпраща SSE редове за коментари с `:` (напр. периодичния сигнал `: keepalive` и завършващите метаданни `x-omniroute-*`). Деактивирано е по подразбиране (#10524), тъй като стриктните клиенти, съвместими с OpenAI, изпълняват JSON.parse за всеки SSE ред и се сриват при коментари с `:`; периодичните сигнали `data:` не са засегнати. Задайте `on`/`true`/`1`/`yes`, за да го включите отново. Използва се от `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Време за получаване на първото SSE събитие, което не е ping. Наследява `REQUEST_TIMEOUT_MS`, когато е зададено. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Максималният адаптивен времеви прозорец за готовност до първото събитие при големи поточни заявки, заявки с много инструменти или такива с високо ниво на разсъждение. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Аварийно изключване за евристиката `/goal`. Задайте `false`/`0`/`off`, за да деактивирате напълно откриването — времената за изчакване на готовност и възстановяването на потока никога не се увеличават въз основа на тялото/заглавките на заявката, което ограничава контролираното от клиента увеличаване на времето за изчакване. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Максималният времеви прозорец за готовност до първото събитие при открити изпълнения на агента `/goal` или заявки, принудително маркирани с `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Автоматично активира ранното възстановяване на потока при открити изпълнения на агента `/goal`. Задайте `false`/`0`/`off`, за да деактивирате специфичното за целта включване. Това може само да ДОБАВИ възстановяване към настройката по подразбиране на оператора — никога не отменя изрично отказване чрез `STREAM_RECOVERY_ENABLED`/настройките на БД. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Премахва нестандартните SSE събития `codex.*` (напр. `codex.rate_limits`), които водят до грешка 502 в `responses.stream()` на OpenAI SDK. Включено по подразбиране (#11014). Задайте `0`/`false`/`no`/`off`, за да ги препращате. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(не е зададено)_ | Транспорт чрез Codex app-server, включван по избор. WebSocket крайна точка (`ws://`/`wss://`) на локален придружаващ процес `codex app-server`. Когато е зададена заедно с токен, заявките към Codex се маршрутизират чрез JSON-RPC към придружаващия процес вместо чрез HTTP Responses API. Може да се задава и за всяка връзка чрез `providerSpecificData.codexAppServerUrl`. Използва се от `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(не е зададено)_ | Вграден токен за възможности/bearer токен, предоставян на app-server. Замяна за отделна връзка: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(не е зададено)_ | Път до файл, съдържащ токена за възможности на app-server (от `codex app-server --ws-token-file`). Използва се, когато `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` не е зададено. Замяна за отделна връзка: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Работната директория, в която се изпълнява ходът на app-server. Замяна за отделна връзка: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(не е зададено)_ | Политика за одобрение, предавана към хода на app-server (напр. `never`, `on-request`). Замяна за отделна връзка: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(не е зададено)_ | Политика за изолираната среда, предавана към хода на app-server (напр. `read-only`, `workspace-write`, `danger-full-access`). Когато не е зададена, изпълнителят използва по подразбиране `workspace-write` (с повишена сигурност; преди `danger-full-access`). Замяна за отделна връзка: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Автоматично одобрява собствените заявки за одобрение на app-server (изпълнение на команди/файлове/разрешения на хоста). Изключено по подразбиране — заявките се отказват автоматично; извикванията на инструменти от тестовата среда не са засегнати (те преминават през отделния канал `item/tool/call`). Приема `true`/`1`/`yes`. Замяна за отделна връзка: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Време за получаване на заглавките на отговора. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 сек) | Максимално изчакване (мс) до началото на отговора за всеки директен опит без прокси. При изтичане на времето се прави един повторен опит с нов сокет; задайте `0`, за да деактивирате ограничението и да запазите предишното поведение. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 мин) | Горна граница (мс) за ПОВТОРНИЯ опит с нов сокет след изтичане на времето за начало на отговора при опит с използване на сокет от пула по-горе (#13703). Прилага се само когато извикващата страна вече е прикачила собствен сигнал за краен срок (каскадата от определените връзка/модел/доставчик/`FETCH_TIMEOUT_MS`); този сигнал е действителното ограничение и се задейства първи в предвидения път, така че това е щедра предпазна мярка, а не фиксирана горна граница — без нея повторният опит използваше същия кратък прозорец `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` като опита с използване на сокет от пула и връщаше 504 за изправни модели за логически разсъждения с бавен TTFB. Никога не се допуска стойност под фиксирания минимум по-горе; когато извикващата страна изобщо не предоставя сигнал за краен срок, повторният опит запазва фиксирания минимум непроменен. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Време за получаване на цялото тяло на отговора. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Време за изчакване при установяване на TCP връзка. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Време за изчакване при неактивност на keep-alive сокета. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Време за изчакване на проксито за TLS отпечатъци (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Ограничава конкретно времето до първия байт от тялото при транспорта за TLS отпечатъци на wreq-js; само `TLS_CLIENT_TIMEOUT_MS` не може да открие блокирало тяло, тъй като приключва веднага след получаването на заглавките (#12656). При изтичане на времето четецът на wreq се отменя и се преминава към директния/прокси диспечера; `0` деактивира наблюдението. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Само за изпълнителя OpenCode и само докато флагът за функционалност `OPENCODE_RESPONSES_STALL_ROTATION` е включен (по подразбиране е изключен): ограничава изчакването за първия байт от тялото на поточен отговор Responses след заглавките му (#13484). Потокът Responses се отваря с `response.created`, така че липсата на данни след този прозорец означава блокиране: акаунтът временно се поставя в период на изчакване и заявката се пренасочва веднъж към следващия акаунт; при второ блокиране се прекратява незабавно с грешка. `0` деактивира защитата дори когато флагът е включен. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Време за изчакване на прокси прехода за заявки към `/v1` моста. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Насочва изпълнителя за уеб извличане Firecrawl към самостоятелно хоствана инстанция (API ключът не е задължителен извън облачната услуга). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Време за изчакване за всяка заявка на изпълнителя за уеб извличане Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Общо време за изчакване на сървърната заявка за моста. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Време за изпращане на заглавките на отговора чрез моста. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Време за изчакване при неактивност на keep-alive връзката на моста. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Време за изчакване на необработения сокет (0 = деактивирано). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Гратисен период при SIGTERM/SIGINT преди принудително прекратяване. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Резервна стойност, използвана от `src/shared/utils/fetchTimeout.ts`, когато `FETCH_TIMEOUT_MS` не е зададена. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Време за изчакване (мс) за предварително зададените конфигурации `validationRead` и `modelsProbe` в `src/shared/network/safeOutboundFetch.ts`. Увеличете го за бавни крайни точки (Cerebras, Cloudflare AI, Groq), за да предотвратите колебания между активно състояние и грешка в таблото за управление. При невалидни (<1000) или нечислови стойности се използват 8000 мс. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Специфично за препредаването време за изчакване при извличане в `open-sse/utils/proxyFetch.ts` (#9158). Блокирало препредаване трябва да завърши с грешка преди времето за изчакване на клиента/агента (~30 сек), така че извикващите страни да видят специфична за препредаването грешка вместо общо изтичане на времето към възходящата услуга. Ограничено е до `29000`, за да се задейства винаги първо. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Споделено забавяне преди повторен опит за директните/препредаващите/прокси пътища с еднократен повторен опит в `open-sse/utils/proxyFetch.ts` (#9158). `0` = незабавен повторен опит. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Време за изчакване на вградена wreq-js заявка (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Допълнителен толеранс към абсолютния краен срок на JS, добавен върху времето за изчакване на вградената заявка. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Време за изчакване на вградена wreq-js заявка (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Допълнителен толеранс към абсолютния краен срок на JS, добавен върху времето за изчакване на вградената заявка. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (изключено) | Добавя „Разполагате с вградено уеб търсене. Отговаряйте директно на въпросите, като използвате резултатите от търсенето.“ към системното съобщение на извикващия (`perplexity-web/protocol.ts`). Изключено е по подразбиране — Perplexity така или иначе извършва търсене, а изречението се появява в отговорите като метакоментар за клиентите за програмиране. Задайте `1`/`true`/`yes`/`on`, за да го възстановите. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Време за изчакване на вградена wreq-js заявка (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Допълнителен толеранс към абсолютния краен срок на JS, добавен върху времето за изчакване на вградената заявка. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Време за изчакване на вградена wreq-js заявка (`notionTlsClient.ts`); `notion-web` го увеличава до `180000` за всяка заявка при продължителни генерирания. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Допълнителен толеранс към абсолютния краен срок на JS, добавен върху времето за изчакване на вградената заявка. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Споделен пул от браузъри на Playwright за чат с уеб бисквитки, поддържан от браузър (`browserPool.ts`); задайте `off`, за да го деактивирате. | +| `OBSCURA_BIN` | `auto-detect` | Път до изпълнимия файл `obscura`, използван като основна машина от пула от браузъри и изпълнителя на Cloudflare Playground (`open-sse/services/obscura.ts`); когато не е зададен, се открива автоматично чрез системната PATH. | +| `OBSCURA_CDP_ENDPOINT` | _(не е зададено)_ | Насочва към вече работещ екземпляр на Obscura (`http://host:port`), вместо да стартира нов; модулът не управлява този процес (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `произволен свободен порт` | Изричен порт за стартирания `obscura serve`; когато не е зададен, автоматично се избира свободен порт (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Насочва заявка за чат с уеб бисквитки към пътя, поддържан от браузър (`browserBackedChat.ts`); задайте `1`, за да го активирате. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Базов URL адрес за изпълнителя Kimi Web (международен kimi.ai Connect-RPC) (`kimi-web.ts`); променяйте го само за огледални/прокси крайни точки. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Пълен адрес на крайната точка за чат за изпълнителя Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(открива се автоматично)_ | Път до системен изпълним файл на Chrome/Edge за интерактивното влизане през браузър в Adobe Firefly (`adobeFireflyBrowserLogin.ts`); заменя автоматичното откриване според операционната система. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ самостоятелен изход_ | Замяна по време на компилиране на директорията със самостоятелния изход, използвана от стъпката за съвместно разполагане след компилирането (`scripts/build/colocate-standalone.mjs`); отнася се за инструментите за компилиране, а не за времето на изпълнение. | + +Опитите за целите в комбинация наследяват разрешеното време за изчакване на заявката към външния доставчик (`FETCH_TIMEOUT_MS` или +`REQUEST_TIMEOUT_MS`, когато то задава стойността по подразбиране за извличане). Задайте `targetTimeoutMs` в комбинация, +в настройките по подразбиране на комбинацията или в замяната за доставчика само за да ускорите преминаването към резервна цел; стойностите над +текущото време за изчакване на външния доставчик се ограничават до него. + +`comboTimeoutMs` е отделен общ времеви бюджет по реалното време за цялата комбинация от резервни цели. +Оставете го незададен или задайте `0`, за да запазите неограниченото обхождане (10-минутното +ограничение срещу блокиране `COMBO_LOOP_SAFETY_TIMEOUT_MS` продължава да се прилага). Положителна стойност заменя тази +защитна мярка за комбинацията. Задайте `comboTimeoutMs` с по-голяма стойност от `targetTimeoutMs`, така че преминаването към резервна цел +все още да разполага с време след бавна първа цел. ### Прагове на прекъсвача на веригата -Настройка на прекъсвача на веригата на ниво доставчик. Стойностите по подразбиране отразяват мащабираните стойности, използвани от v3.6 насам за над 500 връзки. - -| Променлива | Стойност по подразбиране | Файл източник | Описание | -| ------------------------------------------------------------- | ------------------------ | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Праг на последователните неуспехи за OAuth доставчици, преди прекъсвачът да се задейства. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Интервал за нулиране (ms) на прекъсвача за OAuth доставчици. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Праг на последователните неуспехи за доставчици с API ключ. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Интервал за нулиране (ms) на прекъсвача за доставчици с API ключ. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Праг на последователните неуспехи за локални доставчици (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Интервал за нулиране (ms) на прекъсвача за локални доставчици. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: брой неуспехи в рамките на интервала, преди целият OAuth доставчик да премине в период на изчакване. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: плъзгащ се интервал за отчитане на неуспехите (ms) за OAuth доставчици. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: период на изчакване (ms), след като бъде достигнат прагът за OAuth доставчика. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth доставчикът преминава в състояние DEGRADED при достигането на този брой неуспехи. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Максимален множител за увеличаване на resetTimeout за OAuth доставчика. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Изчакването за OAuth доставчика се увеличава след този брой цикли в отворено състояние. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: брой неуспехи в рамките на интервала, преди целият доставчик с API ключ да премине в период на изчакване. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: плъзгащ се интервал за отчитане на неуспехите (ms) за доставчици с API ключ. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: период на изчакване (ms), след като бъде достигнат прагът за доставчика с API ключ. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Доставчикът с API ключ преминава в състояние DEGRADED при достигането на този брой неуспехи. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Максимален множител за увеличаване на resetTimeout за доставчика с API ключ. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Изчакването за доставчика с API ключ се увеличава след този брой цикли в отворено състояние. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: брой неуспехи, преди целият локален доставчик да премине в период на изчакване. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: плъзгащ се интервал за отчитане на неуспехите (ms) за локални доставчици. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: период на изчакване (ms), след като бъде достигнат прагът за локалния доставчик. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Ниво на изчакване, при което доставчикът на фиксирания запис в кеша на контекста се счита за трайно неизправен и фиксирането се премахва за превключване към резервен доставчик. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Интервал против колебания (ms), който допуска кратки преходни периоди на изчакване, преди да бъде премахнато фиксирането на запис в кеша на контекста. | +Настройване на прекъсвача на веригата на ниво доставчик. Стойностите по подразбиране отразяват мащабираните стойности, използвани от v3.6 насам за над 500 връзки. + +| Променлива | Стойност по подразбиране | Файл източник | Описание | +| ------------------------------------------------------------- | ------------------------ | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Праг на последователните неуспехи за доставчици с OAuth, преди прекъсвачът да се задейства. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Интервал за нулиране (ms) на прекъсвача за доставчици с OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Праг на последователните неуспехи за доставчици с API ключ. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Интервал за нулиране (ms) на прекъсвача за доставчици с API ключ. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Праг на последователните неуспехи за локални доставчици (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Интервал за нулиране (ms) на прекъсвача за локални доставчици. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: брой неуспехи в рамките на интервала, преди целият доставчик с OAuth да влезе в период на изчакване. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: плъзгащ се интервал за отчитане на неуспехите (ms) за доставчици с OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: период на изчакване (ms) след достигане на прага за доставчика с OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Доставчикът с OAuth преминава в състояние DEGRADED при достигане на този брой неуспехи. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Максимален множител за увеличаване на resetTimeout за доставчик с OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Времето за изчакване за доставчика с OAuth се увеличава след този брой цикли в отворено състояние. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: брой неуспехи в рамките на интервала, преди целият доставчик с API ключ да влезе в период на изчакване. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: плъзгащ се интервал за отчитане на неуспехите (ms) за доставчици с API ключ. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: период на изчакване (ms) след достигане на прага за доставчика с API ключ. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Доставчикът с API ключ преминава в състояние DEGRADED при достигане на този брой неуспехи. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Максимален множител за увеличаване на resetTimeout за доставчик с API ключ. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Времето за изчакване за доставчика с API ключ се увеличава след този брой цикли в отворено състояние. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: брой неуспехи, преди целият локален доставчик да влезе в период на изчакване. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: плъзгащ се интервал за отчитане на неуспехите (ms) за локални доставчици. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Прекъсвач на ниво доставчик: период на изчакване (ms) след достигане на прага за локалния доставчик. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Ниво на изчакване, при което доставчикът, фиксиран в контекстния кеш, се счита за трайно неработоспособен и фиксирането се премахва за превключване към резервен доставчик. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Интервал против често превключване (ms), който допуска кратки временни периоди на изчакване, преди да се премахне фиксирането в контекстния кеш. | ### Сценарии @@ -863,7 +872,7 @@ REQUEST_TIMEOUT_MS (глобално заместване) | ---------------------------------------------------- | --------------------------------------------------------- | | **Продължително генериране на код** | `REQUEST_TIMEOUT_MS=900000` (15 мин) | | **Ограничаване на общата продължителност на потока** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 мин) | -| **Бърз отказ за продукционен API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Бърз отказ за производствен API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **Модели с разширено разсъждение** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 мин между фрагментите) | --- @@ -1114,67 +1123,67 @@ Claude Code CLI или не сте сигурни какво представл --- -## 21. Състояние на проксито - -| Променлива | По подразбиране | Файл източник | Описание | -| ------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Време за изчакване при бързо прекратяване на проверката за изправност. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Времеви прозорец (в часове) за изчисляване на средната латентност на кандидат-прокситата при стратегията за пул, оптимизирана за латентност. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL на кеша за резултатите от проверките за изправност. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL на кеша за неуспешни проверки на изправността на прокситата. Поддържайте го по-кратък от `PROXY_HEALTH_CACHE_TTL_MS`, така че временните изчаквания на проксито при висока конкурентност да се опитват отново бързо, без да се деактивира бързото прекратяване за действително неработещи проксита. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Задайте `false`, за да деактивирате фоновия планировчик за изправност на прокситата, който периодично проверява регистрираните проксита. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Интервал в ms между обхожданията на фоновия планировчик за изправност (минимум `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Цел за проверка на достъпността, използвана от планировчика и крайната точка `/api/settings/proxies/auto-test`. Насочете я към вътрешен/самостоятелно хостван URL адрес, за да избегнете публичната стойност по подразбиране. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Брой проверки, стартирани едновременно за всяка партида, споделен от планировчика и крайната точка `/api/settings/proxies/auto-test`. Закръгля се надолу до цяло число, с минимум 1 и максимум 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Закъснение в ms между стартирането на две проверки в рамките на една партида. Без него цялата партида се изпраща едновременно и споделен изходящ IP адрес може да задейства ограничението на честотата на целта. Задайте `0`, за да деактивирате разпределянето във времето; максимумът е 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Задайте "false", за да спрете проверката на реалния хост на доставчика, присвоен на дадено прокси (`GET /models`, без API ключ), и вместо това винаги да използвате `PROXY_HEALTH_TEST_URL`. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Когато е `false` (по подразбиране), автоматизираните проверки за достъпност (планировчикът + бутонът "Test All" на `/api/settings/proxies/auto-test`) са **само за четене** и никога не променят състоянието на проксито — само операторът задава активно/неактивно състояние, така че нестабилна проверка да не може да остави присвоено прокси неизползваемо (#6246). Задайте `true`, за да възстановите предишното поведение за проверка и задаване на състоянието. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Флаг за функция с изрично включване (вижте [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); замяната от БД на таблото има предимство). `true` (или `1`, `yes`) показва наблюдението само за четене на изходящия трафик на пула под даден прокси пул в таблото (различни изходящи IP адреси, връзки и най-често срещания зад един IP адрес през последните 24 часа според регистрационния файл на проксито). Никога не се използва за маршрутизиране. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Задайте `true`, за да позволите на планировчика автоматично да премахва проксита след поредица от последователни неуспехи. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Брой последователни неуспехи, след които планировчикът автоматично премахва прокси (когато `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Задайте `true`, за да позволите на планировчика да деактивира обратимо (състояние `dead`, без изтриване) дадено прокси след поредица от последователни неуспехи, вместо да го премахва. Това е неразрушителна алтернатива на `PROXY_AUTO_REMOVE`: проксито незабавно отпада от разрешаването на пул/ротация (филтърът за активно състояние, използван при разрешаването на пул според обхвата, вече го изключва) и автоматично се активира отново, след като започне отново да преминава проверките. Споделя прага `PROXY_AUTO_REMOVE_AFTER`. Ако и двата флага са `true`, `PROXY_AUTO_REMOVE` има предимство. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Позволява на потоците за OAuth и валидиране на доставчик да заобикалят фиксирано прокси и да се свързват директно, когато предварителните проверки за достъпност на проксито са неуспешни. Ефективният ред на приоритет е: замяна от БД за флагове на функции > променлива на средата > стойност по подразбиране. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 сек.) | `open-sse/services/rateLimitManager.ts` | Максимално време за изчакване при отговор 429, преди заявката да бъде отчетена като неуспешна. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 мин.) | `open-sse/services/rateLimitManager.ts` | Горна граница за времето, през което допусната заявка може да остане в изпълнение, преди резервацията ѝ за ограничение на честотата да изтече — отделена от бюджета за изчакване на опашката, така че бавното начало на извличането при неинкрементални шлюзове да не води до изтичане на времето (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (деактивирано) | `open-sse/services/rateLimitManager.ts` | Ограничение за допускане в опашката: отхвърляне с 429 `queue_full`, когато толкова заявки вече са поставени на опашка. `0` = без ограничение (по подразбиране). | -| `RATE_LIMIT_AUTO_ENABLE` | _(незададено)_ | `open-sse/services/rateLimitManager.ts` | Принудително включване/изключване на защитния механизъм за автоматично активиране на ограничението на честотата независимо от запазената настройка в таблото. Приема `true`/`1`/`on` за принудително включване и `false`/`0`/`off` за принудително изключване. | -| `PROVIDER_COOLDOWN_ENABLED` | _(незададено → изкл.)_ | `open-sse/services/providerCooldownTracker.ts` | Глобално проследяване с изрично включване на периодите на изчакване между заявки за доставчик/връзка. По подразбиране е ИЗКЛЮЧЕНО (припокрива се с периода на изчакване за връзка/прекъсвача на веригата за доставчика). Приема `true`/`1`/`on` за активиране. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Минимален период на изчакване (ms), преди да се направи нов опит за неуспешен доставчик/връзка. Увеличава се експоненциално при последователни неуспехи. Използва се само когато е зададено `PROVIDER_COOLDOWN_ENABLED`. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 мин.) | `open-sse/services/providerCooldownTracker.ts` | Максимален период на изчакване (ms), след който независимо от обстоятелствата се прави нов опит за неуспешен доставчик/връзка. Използва се само когато е зададено `PROVIDER_COOLDOWN_ENABLED`. | -| `STREAM_RECOVERY_ENABLED` | _(незададено → изкл.)_ | `src/lib/resilience/settings.ts` (начална стойност) → `open-sse/services/streamRecovery.ts` (логика) | **Какво представлява:** прозрачно възстановяване на прекъснати потоци от източника (порт от free-claude-code). Задържа началния SSE прозорец до `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), така че прекъсване _преди потвърждаване_ — настъпило преди какъвто и да е байт да достигне до клиента — да бъде отворено отново и повторено незабележимо. **Кога да го активирате:** при нестабилни източници, които често прекъсват с 0 байта в началото на потока; оставете го ИЗКЛЮЧЕНО, ако не можете да си позволите до 750 ms допълнително време до първия токен за всеки поток. Приема `true`/`1`/`on`. Задава началната стойност на запазената настройка за устойчивост; след задаване настройката от таблото има предимство. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(незададено → изкл.)_ | `src/lib/resilience/settings.ts` (начална стойност) → `open-sse/services/streamRecovery.ts` (логика) | **Какво представлява:** продължаване по средата на потока (фаза 4.4) — след прекъсване _след потвърждаване_ (байтове вече са достигнали клиента) заявката се изпраща отново с частичния текст като предварително попълнен отговор на асистента и липсващият суфикс се съединява. Само за OpenAI-съвместими потоци с обикновен текст; никога не се задейства, докато се изпълнява извикване на инструмент. **Кога да го активирате:** при дълги генерирания, които се прекъсват по средата на отговора, ако приемате възстановеният край да пристигне наведнъж, а не токен по токен. Независимо е от `STREAM_RECOVERY_ENABLED` (различен рисков профил). Приема `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(незададено → изкл.)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Наблюдател с изрично включване за полезния изход на активния поток. Открива потоци, които продължават да изпращат фрагменти, но остават под конфигурираната скорост на изхода от асистента; сигналите за активност, събитията за употреба, празните делти и фазите на използване на инструменти/разсъждение не се приемат погрешно за напредък. Отделен е от времената за изчакване при бездействие и крайните срокове за принудително прекратяване. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Гратисен период преди оценяването на пропускателната способност, ограничен до 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Плъзгащ се прозорец за полезния изход, ограничен до 1000–600000 ms; преди прекратяване е необходим един пълен прозорец. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Минимална скорост в байтове за секунда на UTF-8 изхода от асистента (консервативен заместител за токени), ограничена до 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Минимален ненулев размер на извадката от полезния изход, считана за измерима, ограничен до 1–1000000 байта. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Интервал на разпределяне (ms) между проверките за изправност на токените на доставчиците при стартиране. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Минимално случайно отклонение (ms), добавено към `HEALTHCHECK_STAGGER_MS` между проверките за изправност на токените на доставчиците, за да се предотврати изпращане накуп (проблем #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Максимално случайно отклонение (ms), добавено към `HEALTHCHECK_STAGGER_MS` между проверките за изправност на токените на доставчиците, за да се предотврати изпращане накуп (проблем #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Размер на партидата от паралелни проверки при началното обхождане за проверка на изправността на токените; по-големите стойности проверяват повече връзки паралелно, а по-малките намаляват пиковото натоварване (проблем #7875, регресия на #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Брой автоматични повторни опити при отговори за период на изчакване в обхвата на модела, преди да се върне грешка на клиента. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Максимален интервал за изчакване (в секунди) между повторните опити през периода на изчакване. Ограничава се до тази стойност независимо от `Retry-After` от източника. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL адрес на проксито за пестене на токени Headroom. Жизненият цикъл от таблото (`api/headroom/*`) по подразбиране стартира локален CLI `headroom-ai` на loopback интерфейса; променяйте стойността само за да насочите към външно Docker sidecar прокси. | +## 21. Състояние на прокситата + +| Променлива | Стойност по подразбиране | Изходен файл | Описание | +| ------------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Време за изчакване при бърза проверка на състоянието. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Времеви прозорец (в часове) за изчисляване на средната латентност на прокситата кандидати при стратегия за пул, оптимизирана за латентност. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL на кеша за резултатите от проверките на състоянието. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL на кеша за неуспешни проверки на състоянието на прокситата. Поддържайте тази стойност по-кратка от `PROXY_HEALTH_CACHE_TTL_MS`, така че временните изчаквания на прокситата при висока конкурентност да се опитват отново бързо, без да се деактивира бързото прекратяване при действително неработещи проксита. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Задайте `false`, за да деактивирате фоновия планировчик за състоянието на прокситата, който периодично проверява регистрираните проксита. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Интервал в ms между циклите на фоновия планировчик за проверка на състоянието (минимум `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Цел за проверка на достъпността, използвана от планировчика и крайната точка `/api/settings/proxies/auto-test`. Насочете я към вътрешен/самостоятелно хостван URL адрес, за да избегнете публичната стойност по подразбиране. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Брой проверки, стартирани едновременно във всяка партида, споделен от планировчика и крайната точка `/api/settings/proxies/auto-test`. Минималната стойност е 1, а максималната — 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Забавяне в ms между стартирането на две проверки в рамките на една партида. Без него цялата партида се изпраща едновременно и споделен изходящ IP адрес може да задейства ограничение на честотата от целта. Задайте `0`, за да деактивирате интервала; максималната стойност е 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Задайте „false“, за да спрете проверките на реалния хост на доставчика, присвоен на прокси сървъра (`GET /models`, без API ключ), и вместо това винаги да използвате `PROXY_HEALTH_TEST_URL`. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Когато е `false` (по подразбиране), автоматизираните проверки за достъпност (планировчикът + бутонът „Тестване на всички“ на `/api/settings/proxies/auto-test`) са **само за четене** и никога не променят състоянието на прокси сървъра — само операторът го задава като активно/неактивно, така че ненадеждна проверка да не може да остави присвоен прокси сървър неизползваем (#6246). Задайте `true`, за да възстановите предишното поведение за проверка и задаване на състоянието. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Флаг за функция с изрично включване (вижте [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); заместващата стойност от БД на таблото има приоритет). `true` (или `1`, `yes`) показва наблюдението само за четене на изходящия трафик на пула под съответния прокси пул в таблото (уникални изходящи IP адреси, връзки и най-често срещания брой зад един IP адрес през последните 24 h според регистъра на прокси сървъра). Никога не се използва за маршрутизиране. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Задайте `true`, за да позволите на планировчика автоматично да премахва прокси сървъри след повтарящи се последователни неуспешни проверки. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Брой последователни неуспешни проверки, след които планировчикът автоматично премахва прокси сървър (когато `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Задайте `true`, за да позволите на планировчика да деактивира временно прокси (състояние `dead`, без да го изтрива) след поредица от последователни неуспехи, вместо да го премахва. Неразрушителна алтернатива на `PROXY_AUTO_REMOVE`: проксито незабавно се изключва от определянето на пула/ротацията (филтърът за активно състояние, използван при определянето на пула по обхват, вече го изключва) и се активира автоматично отново, след като започне отново да преминава проверките успешно. Използва същия праг `PROXY_AUTO_REMOVE_AFTER`. Ако и двата флага са `true`, `PROXY_AUTO_REMOVE` има предимство. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Позволява на потоците за OAuth и валидиране на доставчици да заобикалят фиксирано прокси и да се свързват директно, когато предварителните проверки за достъпност на проксито са неуспешни. Ефективният приоритет е заместване от базата данни за флагове на функции > променлива на средата > стойност по подразбиране. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 сек.) | `src/lib/resilience/settings.ts` | Бюджет по подразбиране за **изчакване на опашката**: колко дълго дадена заявка може да чака за слот на доставчик и да остане на опашката, преди да бъде отхвърлена, без изобщо да достигне до услугата нагоре по веригата. Таймерът се изчиства, след като задачата започне да се изпълнява — изпълнението се ограничава отделно чрез `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Променливата на средата задава само стойността по подразбиране: запазената настройка `resilienceSettings.requestQueue.maxWaitMs`, а след това и специфичната за всяка връзка `rateLimitOverrides.maxWaitMs`, имат предимство пред нея. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 мин.) | `open-sse/services/rateLimitManager.ts` | Горна граница за времето, през което допусната заявка може да остане в процес на изпълнение, преди резервацията ѝ за ограничение на честотата да изтече — отделена от бюджета за изчакване на опашката, така че бавното стартиране на извличането при неинкрементални шлюзове да не води до изтичане на времето (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (деактивирано) | `open-sse/services/rateLimitManager.ts` | Ограничение за приемане в опашката: отхвърляне с 429 `queue_full`, когато толкова заявки вече са поставени на опашката. `0` = без ограничение (по подразбиране). | +| `RATE_LIMIT_AUTO_ENABLE` | _(незададено)_ | `open-sse/services/rateLimitManager.ts` | Принудително включва или изключва защитния механизъм за автоматично активиране на ограничението на честотата независимо от запазената настройка в таблото за управление. Приема `true`/`1`/`on` за принудително включване и `false`/`0`/`off` за принудително изключване. | +| `PROVIDER_COOLDOWN_ENABLED` | _(незададено → изключено)_ | `open-sse/services/providerCooldownTracker.ts` | Глобално проследяване между заявки на периода на изчакване за доставчик/връзка, активирано по желание. По подразбиране е ИЗКЛЮЧЕНО (припокрива се с периода на изчакване за връзка/автоматичния прекъсвач на доставчика). Приема `true`/`1`/`on` за активиране. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Минимален период на изчакване (мс), преди да бъде направен повторен опит с неуспешен доставчик/връзка. Увеличава се експоненциално при последователни неуспехи. Използва се само когато `PROVIDER_COOLDOWN_ENABLED` е активирано. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 мин) | `open-sse/services/providerCooldownTracker.ts` | Максимален период на изчакване (ms), преди неуспешен доставчик/връзка да бъде изпробван повторно независимо от всичко. Използва се само когато `PROVIDER_COOLDOWN_ENABLED` е активирано. | +| `STREAM_RECOVERY_ENABLED` | _(не е зададено → изкл.)_ | `src/lib/resilience/settings.ts` (начална стойност) → `open-sse/services/streamRecovery.ts` (логика) | **Какво:** прозрачно възстановяване на прекъснати потоци от външни източници (порт от free-claude-code). Задържа началния SSE прозорец до `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), така че прекъсване _преди потвърждаване_ — настъпило, преди какъвто и да е байт да достигне клиента — да бъде отворено и изпробвано отново незабележимо. **Кога да се активира:** нестабилни външни източници, които често прекъсват с 0 байта в началото на потока; оставете ИЗКЛЮЧЕНО, ако не можете да си позволите до 750 ms допълнително време до първия токен за всеки поток. Приема `true`/`1`/`on`. Задава началната стойност на запазената настройка за устойчивост; след като бъде зададена, настройката от таблото за управление има предимство. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(не е зададено → изкл.)_ | `src/lib/resilience/settings.ts` (начална стойност) → `open-sse/services/streamRecovery.ts` (логика) | **Какво:** продължаване по средата на потока (Fase 4.4) — след прекъсване _след потвърждаване_ (байтове вече са достигнали клиента) заявката се изпраща отново с частичния текст като предварително попълнен отговор на асистента и липсващият суфикс се добавя. Само за OpenAI-съвместими потоци с обикновен текст; никога не се задейства, докато се изпълнява извикване на инструмент. **Кога да се активира:** дълги генерирания, които се прекъсват по средата на отговора, когато приемате възстановеният край да пристигне наведнъж, вместо токен по токен. Независимо от `STREAM_RECOVERY_ENABLED` (различен рисков профил). Приема `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(не е зададено → изкл.)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Незадължителен наблюдател на полезния изход от активния поток. Открива потоци, които продължават да изпращат фрагменти, но остават под конфигурираната скорост на изхода от асистента; сигналите за активност, събитията за употреба, празните делти и фазите на използване на инструменти/разсъждение не се отчитат погрешно като напредък. Отделен е от изчакванията при неактивност и твърдите крайни срокове. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Гратисен период преди оценяването на пропускателната способност, ограничен до 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Подвижен прозорец за полезния изход, ограничен до 1000–600000 ms; преди прекратяване е необходим един пълен прозорец. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Минимална скорост в байтове на UTF-8 изхода от асистента (консервативен заместител за токени), ограничена до 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Минимална ненулева извадка от полезния изход, считана за измерима, ограничена до 1–1000000 байта. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Интервал на разсрочване (ms) между проверките на състоянието на токените на доставчика при стартиране. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Минимално рандомизирано отклонение (ms), добавено към `HEALTHCHECK_STAGGER_MS` между проверките на състоянието на токените на доставчика, за да се предотврати изпълнението им накуп (проблем #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Максимално рандомизирано отклонение (ms), добавено към `HEALTHCHECK_STAGGER_MS` между проверките на състоянието на токените на доставчика, за да се предотврати изпълнението им накуп (проблем #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Размер на партидата за паралелни проверки при началното обхождане за проверка на състоянието на токените; по-големите стойности проверяват повече връзки паралелно, а по-малките намаляват пиковото натоварване (Проблем #7875, регресия на #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Брой автоматични повторни опити при отговори за период на изчакване, специфични за модела, преди да бъде върната грешка на клиента. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Максимален интервал на изчакване (в секунди) между повторните опити след период на изчакване. Ограничен е до тази стойност независимо от подаденото от източника `Retry-After`. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL адрес на проксито Headroom за пестене на токени. Жизненият цикъл на таблото за управление (`api/headroom/*`) по подразбиране стартира локален CLI `headroom-ai` на loopback интерфейса; заменяйте стойността само за насочване към външно странично Docker прокси. | ### Константи за настройване на възстановяването на потока -Поведението на задържането при възстановяване се настройва чрез твърдо зададени константи в +Поведението при задържане за възстановяване се настройва чрез твърдо кодирани константи в `open-sse/config/constants.ts` (`STREAM_RECOVERY`), показани тук за справка — -промяната им изисква редакция на кода, а не променлива на средата: +промяната им изисква редактиране на кода, а не променлива на средата: - `STREAM_RECOVERY.HOLDBACK_MS = 750` — колко дълго се задържа началният SSE прозорец, - така че при ранно прекъсване опитът да може да бъде повторен, преди към клиента да бъде изпратен дори един байт. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — твърда горна граница за задържания прозорец; той се изпраща - (изчистване + директно предаване), щом се натрупат толкова байтове, независимо от таймера. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — максимален брой прозрачни повторни отваряния на входящия - поток, докато задържаните данни все още не са изпратени. - -> **Ограничение на честотата по доставчик с плъзгащ се прозорец (без променлива на средата):** пренесеният от FCC -> резервен механизъм за ограничение на честотата по доставчик с плъзгащ се прозорец съществува в кода + така че при ранно прекъсване да може да се направи повторен опит, преди към клиента да бъде изпратен дори един байт. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — твърда горна граница на задържания прозорец; извършва се изпращане + (изчистване на буфера + директно предаване), веднага щом се натрупат толкова байтове, независимо от таймера. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — максимален брой прозрачни повторни отваряния на потока от източника, + докато задържаните данни все още не са изпратени. + +> **Ограничение на честотата с плъзгащ се прозорец за всеки доставчик (без променлива на средата):** пренесеният от FCC +> _резервен механизъм_ за ограничение на честотата с плъзгащ се прозорец за всеки доставчик съществува в кода > (`open-sse/services/providerDefaultRateLimit.ts`, свързан чрез > `open-sse/services/rateLimitManager.ts`), но се доставя с **празна карта по подразбиране** -> и към момента **няма променлива на средата за оператори** — активира се единствено чрез тестова кука / -> редакция на кода. Умишлено не е посочен в таблицата по-горе. Ограничителят на препредаването за всяка двойка `(token, IP)`, +> и към момента **няма променлива на средата за оператора** — активира се само чрез тестова кука / +> редактиране на кода. Умишлено не е посочен в таблицата по-горе. Ограничителят на препредаването за всяка двойка `(token, IP)`, > който _има_ настройка, е `RELAY_IP_PER_MINUTE` (§3 Мрежа и портове). --- @@ -1184,32 +1193,33 @@ Claude Code CLI или не сте сигурни какво представл > [!CAUTION] > Тези променливи генерират **подробен изход** и може да разкрият чувствителни данни. **Никога не ги активирайте в продукционна среда.** -| Променлива | Стойност по подразбиране | Файл с изходния код | Описание | -| ------------------------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(не е зададена)_ | `open-sse/executors/cursor.ts` | Задайте `1`, за да активирате подробните регистрационни съобщения на Cursor executor (декодирани SSE фрагменти и др.). | -| `CURSOR_STREAM_DEBUG` | _(не е зададена)_ | `open-sse/executors/cursor.ts` | Обратно съвместим псевдоним на `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(не е зададена)_ | `open-sse/executors/cursor.ts` | Незадължителен път до файл, в който се записват необработените декодирани фрагменти от Cursor, когато `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Време на изчакване при неактивност на потока (ms) за Cursor executor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Гратисен период (ms) след мек терминатор composer kv_after_text, когато все още има буферирани байтове — дава време на последващо извикване на инструмента exec_mcp да завърши своя кадър. | -| `CURSOR_TOOL_DIRECTIVE` | активирана (`!== "0"`) | `open-sse/executors/cursor.ts` | Директива за потвърждаване на инструмент, която кара composer-2.5 надеждно да извиква инструменти. Задайте `0`, за да я деактивирате. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(не е зададена)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Дефиниран от оператора текст за системната подкана, добавян към системното съобщение СЛЕД преобразуването (инжектиране след преобразуването), който достига до пътищата codex/Responses и `/v1/messages`. Използва се и като префикс на директива, премахван от повторените блокове на системния преамбюл. Оставете променливата незададена, за да деактивирате това. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Време на изчакване за всяко изображение (ms) при извличане на отдалечен визуален вход `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(открива се автоматично)_ | `open-sse/utils/cursorVersionDetector.ts` | Заменя местоположението за търсене на базата от данни за състоянието на Cursor IDE, използвана за откриване на версията на IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(откриване / фиксиране)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Идентификатор на компилацията на Agent CLI (`YYYY.MM.DD-`) за `x-cursor-client-version: cli-…` при Agent Run. | -| `CURSOR_AGENT_BIN` | _(не е зададена)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Път до изпълнимия файл на Cursor Agent, използван за генериране на изображения. Ако не е зададен, манипулаторът използва `providerSpecificData.agentBin`, а след това PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Максимално реално време за всяко изображение (ms) при задачите за изображения на Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ограничение за паралелно изпълнение в рамките на споделено работно място за задачите за изображения на Cursor. | -| `CURSOR_IMG_MODEL` | заявка / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Заменя стойността на `--model` за Cursor CLI при задачите за изображения. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Интервал за проверка на резултатите от генерирането на изображения чрез UC (uncensored.com) (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Максимално реално време за проверка на резултатите от генерирането на изображения чрез UC (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Интервал за проверка на резултатите от генерирането на видео чрез UC (uncensored.com) (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Максимално реално време за проверка на резултатите от генерирането на видео чрез UC (ms). | -| `CURSOR_DATA_DIR` | _(открива се автоматично)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Заменя директорията с данни на Cursor Agent CLI (`…/versions/`); това е същата променлива, която използва официалният агент. | -| `CURSOR_TOKEN` | _(не е зададена)_ | `scripts/ad-hoc/cursor-tap.cjs` | Директен bearer токен за Cursor, използван от инструментите за разработчици. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | деактивирано (активира се изрично чрез `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Регистрира маркери за типа и дължината на съдържанието при големи payload-и за чат, когато е зададено `"1"`. По подразбиране е изключено, за да се намали шумът в регистрационните файлове. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(не е зададена)_ | `open-sse/handlers/responseTranslator.ts` | Задайте `true`, за да регистрирате подробности за преобразуването SSE→JSON на Responses API. | -| `DEBUG_CLAUDE_NONSTREAM` | _(не е зададена)_ | `open-sse/handlers/responseTranslator.ts` | Задайте `true`, за да показвате празните фрагменти textContent в пътя за преобразуване на отговорите на Claude (само за отстраняване на грешки). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(не е зададена)_ | Инструментариум за E2E тестове | Задайте `true`, за да активирате режима за E2E тестове (облекчено удостоверяване, тестови механизми). | +| Променлива | Стойност по подразбиране | Файл източник | Описание | +| ------------------------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(не е зададена)_ | `open-sse/executors/cursor.ts` | Задайте `1`, за да активирате подробните регистрационни записи на Cursor executor (декодирани SSE фрагменти и др.). | +| `CURSOR_STREAM_DEBUG` | _(не е зададена)_ | `open-sse/executors/cursor.ts` | Обратно съвместим псевдоним на `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(не е зададена)_ | `open-sse/executors/cursor.ts` | Незадължителен файлов път, в който се записват необработените декодирани Cursor фрагменти, когато `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Време на изчакване при неактивност на потока (ms) за Cursor executor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Допълнителен период (ms) след мек терминатор composer kv_after_text, когато в буфера остават байтове — дава време на последващо извикване на инструмента exec_mcp да завърши своя кадър. | +| `CURSOR_TOOL_DIRECTIVE` | активирана (`!== "0"`) | `open-sse/executors/cursor.ts` | Директива за потвърждаване на инструмент, която кара composer-2.5 надеждно да изпълнява извиквания на инструменти. Задайте `0`, за да я деактивирате. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(не е зададена)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Дефиниран от оператора текст за системната подкана, който се добавя към системното съобщение СЛЕД превода (инжектиране след превода) и достига до пътищата codex/Responses и `/v1/messages`. Използва се също като префикс на директивата, премахван от повторените блокове на системния преамбюл. Оставете променливата незадана, за да деактивирате тази функция. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (изключено) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Задайте `1`, за да премахвате повторените блокове на преамбюла на системната подкана от началото на поток openai→claude. Изключено е по подразбиране — евристиките са съобразени с английска проза и променят полезния товар на отговора, така че отговор, който действително започва с такъв раздел, би го загубил. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Време на изчакване за извличане на всяко изображение (ms) за отдалечен визуален вход `image_url`. | +| `CURSOR_STATE_DB_PATH` | _(открива се автоматично)_ | `open-sse/utils/cursorVersionDetector.ts` | Заменя търсенето на базата данни за състоянието на Cursor IDE, използвана за откриване на версията на IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(откриване / фиксиране)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Идентификатор на компилацията на Agent CLI (`YYYY.MM.DD-`) за `x-cursor-client-version: cli-…` при Agent Run. | +| `CURSOR_AGENT_BIN` | _(не е зададена)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Път до изпълнимия файл на Cursor Agent, използван за генериране на изображения. Ако не е зададен, обработчикът използва `providerSpecificData.agentBin`, а след това PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Максимално реално време за всяко изображение (ms) за задачите на Cursor Agent за изображения. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ограничение на конкурентността за задачи за изображения на Cursor при споделено работно място. | +| `CURSOR_IMG_MODEL` | заявка / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Заменя `--model` на Cursor CLI за задачите за изображения. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Интервал за проверка на резултата от генерирането на изображения в UC (uncensored.com) (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Максимално реално време за проверка на резултата от генерирането на изображения в UC (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Интервал за проверка на резултата от генерирането на видео в UC (uncensored.com) (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Максимално реално време за проверка на резултата от генерирането на видео в UC (ms). | +| `CURSOR_DATA_DIR` | _(открива се автоматично)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Заменя директорията с данни на Cursor Agent CLI (`…/versions/`); същата променлива се използва от официалния агент. | +| `CURSOR_TOKEN` | _(не е зададена)_ | `scripts/ad-hoc/cursor-tap.cjs` | Директен bearer токен за Cursor, използван от инструментите за разработчици. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | деактивирана (активира се изрично чрез `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Регистрира маркери за типа и дължината на съдържанието при големи полезни товари за чат, когато е зададено `"1"`. Изключено е по подразбиране, за да се намали излишният шум в регистрационните записи. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(не е зададена)_ | `open-sse/handlers/responseTranslator.ts` | Задайте `true`, за да регистрирате подробности за преобразуването на Responses API от SSE→JSON. | +| `DEBUG_CLAUDE_NONSTREAM` | _(не е зададена)_ | `open-sse/handlers/responseTranslator.ts` | Задайте `true`, за да показвате празни фрагменти textContent в пътя за преобразуване на отговори от Claude (само за отстраняване на грешки). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(не е зададена)_ | Среда за E2E тестове | Задайте `true`, за да активирате режима за E2E тестове (облекчено удостоверяване, тестови механизми). | --- diff --git a/docs/i18n/bg/docs/reference/FEATURE_FLAGS.md b/docs/i18n/bg/docs/reference/FEATURE_FLAGS.md index fe1ad12c3ff2..9d38b22990b6 100644 --- a/docs/i18n/bg/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/bg/docs/reference/FEATURE_FLAGS.md @@ -44,123 +44,125 @@ ## Каталог на флаговете -72 флага в 6 категории. **По подразбиране** е стойността по подразбиране от дефиницията — стойността, -използвана, когато няма нито замяна от БД, нито променлива на средата. +74 флага в 6 категории. **По подразбиране** е стойността по подразбиране от дефиницията — стойността, +използвана, когато няма нито заместваща стойност от БД, нито променлива на средата. ### Сигурност (10) -| Ключ | Тип | По подразбиране | Описание | -| --------------------------------------- | ------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Изискване на API ключ за всички входящи заявки. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Активиране на пречистването на входните данни за всички заявки. | -| `INJECTION_GUARD_MODE` | enum | `off` | Режим за защита от инжектиране в подкани. Стойности: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Редактиране на лични данни в заявките (независимо от `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Пречистване на лични данни от отговорите на доставчика. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Режим за пречистване на лични данни в отговорите. Стойности: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Блокиране на изходящи заявки към частни/вътрешни диапазони от IP адреси. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Разрешаване на удостоверени потребители на таблото за управление да разкриват съхранените API ключове, вместо да виждат само маскирани стойности. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Включване на префикса на акаунта в редовете на AUTH регистрационния файл (напр. „Използва се акаунт на : abc12345...“). По подразбиране е деактивирано, така че идентификаторите на акаунти да бъдат редактирани в споделени/многоклиентски регистрационни файлове на процеса. Не зависи от режима за отстраняване на грешки; превключването на режима за отстраняване на грешки не разкрива тази информация. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Когато OIDC е активиран, влизането с парола се деактивира, така че потребителите да могат да се удостоверяват само чрез OIDC Single Sign-On. Когато е деактивирано (по подразбиране), са налични както влизане с парола, така и OIDC. | - -### Мрежа (15) +| Ключ | Тип | По подразбиране | Описание | +| --------------------------------------- | ------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Изискване на API ключ за всички входящи заявки. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Активиране на пречистването на входните данни за всички заявки. | +| `INJECTION_GUARD_MODE` | enum | `off` | Режим за защита срещу инжектиране в подкани. Стойности: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Редактиране на лични данни в заявките (независимо от `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Пречистване на лични данни от отговорите на доставчика. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Режим за пречистване на лични данни в отговорите. Стойности: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Блокиране на изходящите заявки към частни/вътрешни диапазони от IP адреси. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Позволяване на удостоверени потребители на таблото за управление да разкриват съхранените API ключове, вместо да виждат само маскирани стойности. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Включване на префикса на акаунта в редовете на AUTH журнала (напр. „Използва се акаунт на : abc12345...“). По подразбиране е деактивирано, така че идентификаторите на акаунти да бъдат редактирани в споделени/многонаемни процесни журнали. Не зависи от режима за отстраняване на грешки; включването му не разкрива тази информация. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Когато OIDC е активиран, деактивиране на влизането с парола, така че потребителите да могат да се удостоверяват само чрез OIDC Single Sign-On. Когато е деактивирано (по подразбиране), са налични както влизане с парола, така и OIDC. | + +### Мрежа (16) | Ключ | Тип | По подразбиране | Рестартиране | Описание | | ----------------------------------------------- | ------- | --------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Активира прикрит режим за TLS отпечатък. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Позволява на маршрутите /v1/audio/* да използват съвместими с OpenAI възли на доставчици, хоствани извън localhost. Изключено по подразбиране — насочването на аудио към отдалечен хост променя идентичността на изходящия трафик и трябва да бъде изрично решение на оператора. Възлите с loopback адрес са винаги разрешени и не се засягат. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Когато към дадена връзка не е присвоено прокси, автоматично избира първото работещо прокси от регистъра. Изключено по подразбиране (в противен случай всяко прокси в регистъра се превръща в глобална резервна опция — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Позволява на потоците за OAuth и валидиране на доставчици да заобикалят фиксирано прокси и да се свързват директно, когато предварителните проверки за достъпност на проксито са неуспешни. Изключено по подразбиране, защото това може да промени изходящия IP адрес. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | При мрежово изключение (изтичане на времето, отказана/нулирана връзка) за изпълнител с ротация между няколко акаунта, когато неуспешният акаунт няма специално предназначено прокси, прилага кратък период на изчакване и пропуска останалите акаунти без прокси до края на заявката, вместо да опитва всеки от тях. Включено по подразбиране (безопасно: няма промяна на изходящия IP адрес, а само се намалява рискът от забавяне/изчакване при акаунти със споделен изходящ трафик). Деактивирайте, за да възстановите незабавното разпространение при първото хвърлено изключение от акаунт без прокси. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Пуловете от проксита и ротацията по акаунти на opencode спират да предоставят повторно прокси, което току-що е било неуспешно (отказана TCP проба или получен чрез него отговор 429), за период в рамките на процеса, който се удвоява при всяко повторение до зададен максимум. Не се записва състояние на проксито; когато всеки кандидат е отделен, изборът остава непроменен. Изключено по подразбиране. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Показва под даден пул от проксита в таблото колко наблюдавани изходящи IP адреса са обслужвали членовете му през последните 24 часа и колко връзки са ги използвали. Само за четене, изчислява се от дневника на проксито и никога не се използва за маршрутизиране. Изключено по подразбиране. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | За изпълнителя OpenCode следи първия байт от тялото на поточно предаван отговор Responses (прозорец: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, по подразбиране `15000`). Поток Responses с код 2xx, който остане без данни след изтичането на прозореца, се счита за блокирал: акаунтът се поставя в период на изчакване и заявката се пренасочва еднократно към следващия акаунт; при второ блокиране операцията завършва незабавно с неуспех. Изключено по подразбиране: блокиралите потоци запазват текущото изчакване до изтичане на времето за готовност на потока. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Изпълнител OpenCode: при отговор 403/451, съдържащ отказ `user_blocked` (който не е географско ограничение или отхвърляне на отпечатък от Cloudflare), поставя отказания акаунт в период на изчакване и преминава към следващия акаунт най-много веднъж за заявка; вторият отказ се връща непроменен, без отбелязване на успех. Изключено по подразбиране: заобикалянето на блокиране на потребител от услуга нагоре по веригата може да изглежда като избягване на ограничението и да разпространи маркировката в целия набор от акаунти. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Ротация на OpenCode: след два последователни временни неуспеха на услуга нагоре по веригата (5xx или празен 400) изчаква преди следващия акаунт — 1,5 сек., като времето се удвоява при всеки следващ неуспех, с максимум 6 сек. на пауза и 10 сек. на заявка; пропуска се при прекъсване на връзката от клиента. Тялото на неуспешния отговор се освобождава преди изчакването. Изключено по подразбиране: превключването при отказ остава незабавно. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Ротация на OpenCode: спира вълната от акаунти при първия отговор 429, класифициран като реално ограничение на честотата (подлежащ на анализ `Retry-After` или тяло, посочващо ограничение на честотата/използването), и връща този отговор 429 от услугата нагоре по веригата непроменен. При некласифицирани отговори 429 ротацията продължава. Изключено по подразбиране: безплатното ниво е ограничено за всеки изходящ IP адрес (#9611), затова всеки отговор 429 задейства ротация, а изчерпаната вълна връща последния отговор 429 от услугата нагоре по веригата. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Деактивира проверката на TLS сертификата за MITM проксито. **Опасно.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Позволява URL адреси на доставчици, сочещи към частни/вътрешни мрежи. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Позволява добавянето/валидирането на доставчици на локални/частни адреси (127.0.0.1, localhost, LAN). Включено по подразбиране (с приоритет на локалните ресурси); деактивирайте за стриктно блокиране, разрешаващо само публични адреси. Достъпът до облачни метаданни остава блокиран. | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Активира стелт режима за TLS отпечатък. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Позволява на маршрутите /v1/audio/* да използват съвместими с OpenAI възли на доставчици, хоствани извън localhost. Изключено по подразбиране — маршрутизирането на аудио към отдалечен хост променя изходната идентичност и трябва да бъде изрично решение на оператора. Loopback възлите са винаги разрешени и не се засягат. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Позволява на POST /v1/rerank (и на loopback стъпката за пренареждане на механизма за памет) да използва съвместими с OpenAI възли на доставчици, хоствани извън localhost. Изключено по подразбиране — маршрутизирането към отдалечен хост променя изходната идентичност и трябва да бъде изрично решение на оператора. Loopback възлите са винаги разрешени; отдалечените възли трябва също да преминат проверката на политиката за изходящи URL адреси на доставчика. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Когато към дадена връзка не е зададен прокси сървър, автоматично избира първия работещ прокси сървър от регистъра. Изключено по подразбиране (в противен случай всеки прокси сървър в регистъра се превръща в глобален резервен вариант — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Позволява на потоците за OAuth и валидиране на доставчици да заобикалят фиксиран прокси сървър и да се свързват директно, когато предварителните проверки за достъпност на прокси сървъра са неуспешни. Изключено по подразбиране, тъй като това може да промени изходящия IP адрес. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | При мрежово изключение (изтичане на времето, отказана/нулирана връзка) за изпълнител с ротация между няколко акаунта, когато неуспешният акаунт няма специален прокси сървър, прилага кратък период на изчакване и пропуска другите акаунти без прокси сървър за остатъка от заявката, вместо да опитва отново с всеки от тях. Включено по подразбиране (безопасно: няма промяна на изходящия IP адрес, а само се намалява рискът от забавяне/изчакване при акаунти със споделен изход). Деактивирайте, за да възстановите незабавното разпространяване при първото изключение от акаунт без прокси сървър. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Пуловете от прокси сървъри и ротацията на opencode за всеки акаунт спират да предоставят повторно прокси сървър, който току-що е бил неуспешен (отказана TCP проба или получен през него отговор 429), за период в рамките на процеса, който се удвоява при всяко повторение до достигане на максимална стойност. Не се записва състояние на прокси сървъра; когато всеки кандидат е оставен настрана, изборът остава непроменен. Изключено по подразбиране. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Показва под даден пул от прокси сървъри в таблото за управление колко наблюдавани изходящи IP адреса са обслужвали неговите членове през последните 24 h и колко връзки са ги използвали. Само за четене, изчислява се от дневника на прокси сървъра и никога не се използва за маршрутизиране. Изключено по подразбиране. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | За изпълнителя OpenCode следи първия байт от тялото на поточно предаван отговор от Responses (прозорец: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, по подразбиране `15000`). Поток от Responses със статус 2xx, който остане без данни след този прозорец, се счита за блокирал: акаунтът се поставя в период на изчакване и заявката се прехвърля еднократно към следващия акаунт; при второ блокиране завършва незабавно с грешка. Изключено по подразбиране: блокиралите потоци продължават да изчакват както досега до изтичане на времето за готовност на потока. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Изпълнител OpenCode: при отговор 403/451, съдържащ отказ `user_blocked` (който не е свързан с географско ограничение или отхвърляне по цифров отпечатък от Cloudflare), поставя отказания акаунт в период на изчакване и преминава към следващия акаунт най-много веднъж на заявка; вторият отказ се връща непроменен, без отбелязване на успех. Изключено по подразбиране: заобикалянето на блокиране на потребител от доставчика може да изглежда като опит за избягване на ограничението и да разпространи флага сред всички акаунти. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Ротация на OpenCode: след два последователни временни отказа от доставчика (5xx или празен 400) се изчаква преди преминаване към следващия акаунт — 1,5 сек., като времето се удвоява при всеки следващ отказ, с максимум 6 сек. на пауза и 10 сек. на заявка; изчакването се пропуска при прекъсване на връзката от клиента. Тялото на неуспешния отговор се освобождава преди изчакването. Изключено по подразбиране: превключването при отказ остава незабавно. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Ротация на OpenCode: спира вълната от акаунти при първия отговор 429, класифициран като реално ограничение на честотата (подлежащ на анализ `Retry-After` или тяло, посочващо ограничение на честотата/използването), и връща този отговор 429 от доставчика непроменен. При некласифицирани отговори 429 ротацията продължава. Изключено по подразбиране: безплатното ниво е ограничено за всеки изходящ IP адрес (#9611), така че всеки отговор 429 задейства ротация, а при изчерпване на вълната се връща последният отговор 429 от доставчика. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Деактивира проверката на TLS сертификати за MITM проксито. **Опасно.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Разрешава URL адреси на доставчици, сочещи към частни/вътрешни мрежи. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Разрешава добавянето/проверката на доставчици на локални/частни адреси (127.0.0.1, localhost, LAN). Включено по подразбиране (с приоритет на локалните ресурси); деактивирайте за строго блокиране, допускащо само публични адреси. Метаданните на облачната среда остават блокирани. | | `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Активира режим на доставчик, съвместим с Claude Code. | ### Политики (5) -| Ключ | Тип | По подразбиране | Описание | -| ------------------------------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Режим за прилагане на правила за използване на инструменти. Стойности: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Автоматично активиране на ограничаването на честотата въз основа на моделите на използване. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Пропускане на локалната проверка на OmniRoute за контекстния прозорец / максималния брой входни токени при директни заявки към единичен модел. Ограниченията на доставчика продължават да се прилагат. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Отхвърляне на заявките преди изпращането им, когато целевият модел не притежава необходимите възможности (визуално възприемане, инструменти, структуриран изход, контекстен прозорец). Защитава директните заявки към един доставчик, които заобикалят филтъра за съвместимост на комбинирания слой. | -| `RADAR_ENABLED` | boolean | `false` | Активиране на модула OmniRoute Radar (екрани за каталожен поток и синхронизиране). По подразбиране е изключен; активирането отключва само потребителския интерфейс — синхронизирането на данни остава отделна опция, която трябва изрично да бъде включена. | - -### Среда за изпълнение (32) - -| Ключ | Тип | По подразбиране | Рестартиране | Описание | -| ------------------------------------------- | ------- | --------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Генерира и вмъква обобщения на разговорите, когато комбинираното маршрутизиране превключва между модели. Деактивирайте, за да третирате превключванията между модели независимо и да предотвратите фоновите заявки за предаване на контекст за всички съществуващи и бъдещи комбинации. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Премахва вътрешните изходни елементи от фазата за коментари от транзитните потоци на Responses API, преди да бъдат препратени към клиентите. Деактивирайте, за да получавате необработените коментари от източника. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Налага ограниченията на обхвата при достъпа до MCP инструменти. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Компресира описанията на MCP инструментите, за да намали използването на токени. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Активира обработката на фонови задачи по време на изпълнение. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Деактивира всички фонови услуги (обновяване на квотите, синхронизиране и др.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Доверява се на RTK филтрите на ниво проект без валидиране. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Стартира WebSocket сървъра на таблото за управление в реално време при импортиране (порт 20132 по подразбиране). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Позволява на Codex да използва транспорта Responses-over-WebSocket. Когато е изключено, Codex се връща към HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Позволява на Codex да използва локалния WebSocket JSON-RPC транспорт на app-server (codexTransport=app-server). Когато е изключено, връзките, конфигурирани за app-server, се връщат към другите транспорти на Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Маршрутизира заявките с изчерпан бюджет към аварийния безплатен резервен доставчик/модел. (Вижте [Аварийно резервиране при изчерпан бюджет](#emergency-budget-fallback) по-долу.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Активира прозрачен ранен повторен опит при прекъснати SSE потоци от източника, преди каквито и да било байтове от отговора да достигнат до клиента. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Позволява възстановяването на потока да изпрати заявката отново и да свърже отговора, след като байтове вече са достигнали до клиента. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Прави продължаването по средата на потока безопасно за извиквания на инструменти: никога не възобновява прекъснат поток, след като е излъчено извикване на инструмент (в процес на изпълнение или вече завършило с finish_reason tool_calls), и затваря след едно празно продължение, вместо да изразходва целия бюджет. Изключено: поведение на изданието. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Превключва еднократно към паралелна връзка, когато SSE поток се затвори, преди да излъчи полезен кадър, и ограниченият повторен опит със същата връзка е изчерпан; ако няма използваема паралелна връзка, се връща първоначалната грешка `STREAM_EARLY_EOF` 502. Изключено по подразбиране: ранният EOF остава окончателен след повторния опит със същата връзка. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Включва удобни за показване полета за имена в отговорите на `/v1/models`. Деактивирайте за клиенти, които очакват само идентификатори на модели. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Управлява начина, по който идентификаторите на модели получават префикс в /v1/models. 'dual' (по подразбиране) извежда както префиксите с псевдонима, така и тези с каноничния идентификатор на доставчика за обратна съвместимост. 'alias' извежда само краткия префикс с псевдонима (напр. ds-web/model, а не deepseek-web/model). 'canonical' извежда само пълния префикс с идентификатора на доставчика. Стойности: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Активира периодично синхронизиране на ELO класацията на Arena AI за подреждане според интелигентността на моделите. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Публикува огледалните идентификатори `claude//` в `/v1/models`, така че откриването на модели от шлюза на Claude Code да изброява модели, които не са на Claude. Глобалното ниво на тристепенния контрол (променливата на средата има предимство пред настройката в таблото). Вижте [Конфигуриране на Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Главен превключвател за псевдонимите no-think// на шлюза. Включено (по подразбиране): /v1/models публикува вариант без разсъждение за всеки допустим Claude модел с възможност за разсъждение, а идентификатор no-think/, изпратен в заявка, се преобразува обратно към действителния модел с потиснато разсъждение. Изключено: не се публикуват варианти и идентификатор no-think/ се третира като всеки друг неизвестен идентификатор на модел. Индивидуалното включване/изключване чрез ModelSpec.noThinkingAlias продължава да се прилага, докато това е включено. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Деактивира генерирането на варианти за ниво на разсъждение (напр. -low, -medium, -high) в каталога /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Активира адаптивни виртуални канали за приемане за всеки наемател при изпращане към доставчик (#9654): пикът на един наемател вече не причинява грешки 503 за друг. Променливата на средата OMNIROUTE_CHAT_VIRTUAL_LANES има предимство пред тази настройка в таблото; промените влизат в сила след рестартиране на сървъра. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Публикува огледалните идентификатори / в /v1/models за модели, чийто каноничен собственик няма активни идентификационни данни, но транзитен шлюз с активни идентификационни данни ги маршрутизира. Предупреждение: при глобално активиране добавя записи в каталога за всички клиенти. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Активира откриването на баланс за съвместими агрегаторни възли New-API / One-API / Sub2API. Когато е активирано, съвместимите възли със зададен флаг за агрегатор ще отчитат баланса си в таблото за управление и при предварителното маршрутизиране според квотата. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Продължава непрекъснатите извиквания на инструменти, управлявани от сървъра, докато моделът върне отговор, използваем от клиента. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Статистиката за търсене и последните търсения отчитат само доставчици, които все още имат активна връзка (доставчиците без ключ, като duckduckgo-free, винаги се отчитат). Когато е изключено, се запазва всеки съхранен ред за търсене с идентификатор на доставчик. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Страници на доставчици в таблото: показва значката „Безплатно“ само въз основа на сигнали, които доставчикът поддържа — премахва евристиката по показваното име, небулевите полета за безплатност и суфиксите :free за регистрирани доставчици без документирано безплатно ниво. Когато е изключено, се запазва историческото правило за значката. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | При агрегирани отговори 429/503 за недостъпност пропуска `Retry-After`, когато не е известно конкретно бъдещо време за повторен опит (вместо синтетична стойност 1s), добавя `error.retry_after_provenance` (`signal` \| `none`) и позволява на пътищата за изчерпване на комбинации да прочитат текстови указания за повторен опит от JSON и обикновени текстови тела от източника. Полето се появява само в отговори, създадени от `unavailableResponse()`; другите тела 429/503 остават непроменени. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Когато цел на комбинация с `priority`, маркирана за резервно превключване само при изчерпване на квотата, спре комбинацията по причина, която доказуемо не е свързана с квота (отворен прекъсвач на веригата на доставчика, пропускане поради прогнозирана латентност), отговаря с 502 вместо с изглеждащия като свързан с квота код 503. Спиранията поради блокиране, период на изчакване, недостъпност, изчерпване и ограничение на конкурентността запазват 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Самостоятелен отговор Mistral 401 (`{"detail":"Unauthorized"}`, без изричен сигнал за удостоверяване) е идентичен при отменен ключ и при изчерпана квота. Когато е включено, поставя връзката в период на изчакване, вместо да я маркира като `expired`, най-много 3 пъти на час за всяка връзка; следващият такъв отговор я маркира, така че отмененият ключ все пак да достигне крайно състояние. Изключено по подразбиране: всеки самостоятелен отговор Mistral 401 маркира връзката както преди. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Извлича актуалния каталог с модели на xAI за връзки `xai-oauth` от `https://api.x.ai/v1/models`, като използва OAuth bearer токена, вместо фиксирания статичен начален набор. Изключено по подразбиране: `xai-oauth` продължава да предоставя непроменения статичен начален набор. При всяка грешка при разрешаването откриването се връща към началния набор (не е потвърдено дали x.ai приема OAuth bearer на тази крайна точка). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Позволява на автоматичното почистване да изтрива приключили (completed/failed/cancelled/expired) задания на Batch API, по-стари от `OMNIROUTE_BATCH_RETENTION_DAYS`, заедно с контролните им точки за всеки ред, и да изчиства BLOB съдържанието на качени файлове след тяхната собствена стойност `expires_at`. Изключено по подразбиране: всяка съществуваща инсталация запазва тези данни точно както преди, докато оператор не го активира. Задействаният от оператора маршрут `DELETE /api/v1/batches/delete-completed` не се влияе и в двата случая — той е отделен, безусловен договор на публичния API. | +| Ключ | Тип | По подразбиране | Описание | +| ------------------------------- | ------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Режим за прилагане на политиката за използване на инструменти. Стойности: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Автоматично активира ограничаването на честотата въз основа на моделите на използване. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Пропуска локалната проверка на OmniRoute за контекстния прозорец/максималния брой входни токени при директни заявки към един модел. Ограниченията на доставчика продължават да се прилагат. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Отхвърля заявките преди изпращане, когато целевият модел не разполага с необходимите възможности (визуално разпознаване, инструменти, структуриран изход, контекстен прозорец). Защитава директните заявки към един доставчик, които заобикалят филтъра за съвместимост на комбинирания слой. | +| `RADAR_ENABLED` | boolean | `false` | Активира модула OmniRoute Radar (екрани за каталожния поток и синхронизация). Изключено по подразбиране; активирането отключва само потребителския интерфейс — синхронизирането на данни остава отделна опция, изискваща изрично включване. | + +### Среда за изпълнение (33) + +| Ключ | Тип | По подразбиране | Рестартиране | Описание | +| ------------------------------------------- | ------- | --------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Генерирайте и добавяйте резюмета на разговорите, когато комбинираното маршрутизиране превключва между модели. Деактивирайте, за да третирате превключванията между модели независимо и да предотвратите фонови заявки за предаване на контекст за всички съществуващи и бъдещи комбинации. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Премахвайте вътрешните изходни елементи от фазата за коментари от потоците за директно препредаване на Responses API, преди да бъдат препратени към клиентите. Деактивирайте, за да получавате необработените коментари от услугата нагоре по веригата. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Налагайте ограниченията на обхватите върху достъпа до MCP инструменти. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Компресирайте описанията на MCP инструментите, за да намалите използването на токени. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Активирайте обработката на фонови задачи по време на изпълнение. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Деактивирайте всички фонови услуги (обновяване на квотата, синхронизиране и др.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Доверяване на RTK филтрите на ниво проект без валидиране. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Стартиране на WebSocket сървъра за таблото за управление в реално време при импортиране (по подразбиране на порт 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Разрешаване на Codex да използва транспорта Responses-over-WebSocket. Когато е изключено, Codex се връща към HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Разрешаване на Codex да използва локалния app-server WebSocket JSON-RPC транспорт (codexTransport=app-server). Когато е изключено, връзките, конфигурирани да използват app-server, се връщат към другите транспорти на Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Пренасочване на заявките с изчерпан бюджет към аварийния безплатен резервен доставчик/модел. (Вижте [Аварийно резервно решение при изчерпан бюджет](#emergency-budget-fallback) по-долу.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Активиране на прозрачен ранен повторен опит при прекъснати входящи SSE потоци, преди каквито и да било байтове от отговора да достигнат до клиента. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Разрешаване на възстановяването на потока да изпрати заявката отново и да съедини отговора, след като байтове вече са достигнали до клиента. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Осигуряване на безопасно за извикванията на инструменти продължаване по средата на потока: прекъснат поток никога да не се възобновява, след като е изпратено извикване на инструмент (в процес на изпълнение или вече завършено с finish_reason tool_calls), и затваряне след едно празно продължение, вместо да се изразходва целият бюджет. Изключено: поведение на версията за разпространение. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Извършва еднократно превключване към сродна връзка, когато SSE поток се затвори, преди да излъчи полезен кадър, и ограниченият брой повторни опити със същата връзка е изчерпан; ако няма използваема сродна връзка, се връща първоначалната грешка `STREAM_EARLY_EOF` 502. Изключено по подразбиране: ранният EOF остава крайна грешка след повторния опит със същата връзка. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Включва удобни за показване полета за имена в отговорите от `/v1/models`. Деактивирайте за клиенти, които очакват само идентификатори на модели. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Определя как се добавят префикси към идентификаторите на модели в /v1/models. 'dual' (по подразбиране) връща както префикса на псевдонима, така и каноничния префикс на идентификатора на доставчика за обратна съвместимост. 'alias' връща само краткия префикс на псевдонима (напр. ds-web/model, а не deepseek-web/model). 'canonical' връща само пълния префикс на идентификатора на доставчика. Стойности: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Активира периодично синхронизиране на ELO от класацията на Arena AI за подреждане на моделите според интелигентността им. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Обявява огледалните идентификатори `claude//` в `/v1/models`, така че откриването на модели в шлюза на Claude Code да показва модели, различни от Claude. Глобално ниво на тристепенния механизъм (променливата на средата има приоритет пред настройката от таблото). Вижте [Конфигурация на Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Главен превключвател за псевдонимите на шлюза no-think//. Когато е включено (по подразбиране): /v1/models обявява вариант без разсъждение за всеки допустим модел Claude с възможност за разсъждение, а идентификатор no-think/, подаден в заявка, се преобразува обратно към действителния модел с потиснато разсъждение. Когато е изключено: не се обявяват варианти и идентификатор no-think/ се третира като всеки друг неизвестен идентификатор на модел. Индивидуалната настройка за включване/изключване ModelSpec.noThinkingAlias за всеки модел продължава да се прилага, докато това е включено. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Деактивира генерирането на варианти с различни нива на разсъждение (напр. -low, -medium, -high) в каталога /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Активира адаптивни виртуални ленти за приемане по наемател за изпращане към доставчика (#9654): пиковото натоварване на един наемател вече не причинява грешка 503 за друг. Променливата на средата OMNIROUTE_CHAT_VIRTUAL_LANES има приоритет пред тази настройка от таблото; промените влизат в сила при рестартиране на сървъра. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Публикува огледални идентификатори / в /v1/models за модели, чийто каноничен собственик няма активни идентификационни данни, но към които насочва passthrough шлюз с активни идентификационни данни. Предупреждение: при глобално активиране добавя записи в каталога за всички клиенти. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Активира откриването на баланс за възли, съвместими с агрегаторите New-API / One-API / Sub2API. Когато е активирано, съвместимите възли със зададен флаг за агрегатор ще показват баланса си в таблото за управление и при маршрутизирането с предварителна проверка на квотата. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Продължава непотоковите извиквания на инструменти, управлявани от сървъра, докато моделът не върне отговор, който може да се използва от клиента. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Статистиката за търсене и скорошните търсения отчитат само доставчици, които все още имат активна връзка (доставчиците без ключ, като duckduckgo-free, винаги се отчитат). Когато е изключено, се запазват всички съхранени редове за търсене с идентификатор на доставчик. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Страници на доставчиците в таблото за управление: показва значката „Безплатно“ само при сигнали, които доставчикът поддържа — премахва евристиката за показваното име, небулевите полета за безплатност и суфиксите :free при регистрирани доставчици без документирано безплатно ниво. Когато е изключено, се запазва досегашното правило за значката. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | При агрегирани отговори 429/503 за недостъпност пропуска `Retry-After`, когато не е известно конкретно бъдещо време за повторен опит (вместо синтетична стойност от 1 секунда), добавя `error.retry_after_provenance` (`signal` \| `none`) и позволява на пътищата за изчерпване на combo да четат текстови указания за повторен опит от JSON и обикновени текстови тела от upstream услугата. Полето се появява само в отговори, създадени от `unavailableResponse()`; останалите тела на отговори 429/503 не се променят. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Когато цел на combo с `priority`, маркирана за резервно използване само при изчерпване на квотата, спре combo по причина, за която доказуемо е установено, че не е свързана с квотата (отворен прекъсвач на веригата на доставчика, пропускане поради прогнозна латентност), връща 502 вместо изглеждащия като свързан с квота 503. Спиранията поради блокиране, период на изчакване, недостъпност, изчерпване и ограничение на едновременните заявки продължават да връщат 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Самостоятелен отговор 401 от Mistral (`{"detail":"Unauthorized"}`, без изричен сигнал за удостоверяване) е еднакъв при отнет ключ и при изчерпана квота. Когато е включено, връзката се поставя в период на изчакване, вместо да бъде паркирана като `expired`, най-много 3 пъти на час за всяка връзка; следващият такъв отговор я паркира, така че отнетият ключ все пак в крайна сметка се разпознава. По подразбиране е изключено: всеки самостоятелен отговор 401 от Mistral паркира връзката както досега. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Извличане на актуалния каталог с модели на xAI за връзки `xai-oauth` от `https://api.x.ai/v1/models` чрез OAuth bearer токена вместо фиксирания статичен начален набор. Изключено по подразбиране: `xai-oauth` продължава да предоставя статичния начален набор без промени. При всяка грешка при разрешаването откриването се връща към началния набор (не е потвърдено дали x.ai приема OAuth bearer токен в тази крайна точка). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Позволява на автоматичното почистване да изтрива по-стари от `OMNIROUTE_BATCH_RETENTION_DAYS` задачи на Batch API в крайно състояние (завършени/неуспешни/отменени/изтекли), заедно с контролните им точки за всеки ред, както и да изчиства BLOB съдържанието на качени файлове след собствената им стойност `expires_at`. Изключено по подразбиране: всяка съществуваща инсталация запазва тези данни точно както досега, докато оператор не включи функцията. Маршрутът `DELETE /api/v1/batches/delete-completed`, задействан от оператор, не се влияе и в двата случая — той е отделен, безусловен договор за публичен API. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Резервира избрания Antigravity акаунт за жизнения цикъл на поточното предаване на заявката, която го е избрала, така че паралелен повторен опит или предаването на идентификационни данни да не могат отново да изберат акаунт, който вече е ангажиран с активно поточно предаване. Резервацията е ограничена до (връзка, извикваем модел нагоре по веригата), така че един акаунт все още може да обслужва два различни модела едновременно. Когато всички допустими акаунти вече са резервирани за този модел, заявката връща структуриран отговор 503 `antigravity_pool_busy` с ограничена стойност `Retry-After`, вместо да натоварва допълнително зает акаунт. Изключено по подразбиране: изборът на акаунт остава точно както досега и не се прави резервация. | ### CLI (5) -| Ключ | Тип | По подразбиране | Рестартиране | Описание | -| ------------------------------------- | ------- | --------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Активира режима на съвместимост за всички CLI клиенти. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Активира слоя за съвместимост на псевдонимите на модели. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Активира автоматичното синхронизиране на данните за ценообразуване (изисква също променливата на средата `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | След синхронизиране на моделите на доставчик автоматично (пре)записва профилните файлове ~/.codex/*.config.toml от актуалния каталог. Никога не променя активната/подразбиращата се конфигурация на Codex. По подразбиране е изключено. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | След синхронизиране на моделите на доставчик автоматично (пре)записва профилите на Claude Code в ~/.claude/profiles//settings.json от актуалния каталог. Никога не променя активната/подразбиращата се конфигурация на Claude. По подразбиране е изключено. | +| Ключ | Тип | По подразбиране | Рестартиране | Описание | +| ------------------------------------- | ------- | --------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Активира режима на съвместимост за всички CLI клиенти. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Активира слоя за съвместимост с псевдоними на модели. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Активира автоматичното синхронизиране на данните за ценообразуване (изисква също променливата на средата `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | След синхронизиране на моделите на доставчик автоматично (пре)записва профилните файлове ~/.codex/*.config.toml от актуалния каталог. Никога не променя активната/стандартната конфигурация на Codex. Изключено по подразбиране. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | След синхронизиране на моделите на доставчик автоматично (пре)записва профилите на Claude Code в ~/.claude/profiles//settings.json от актуалния каталог. Никога не променя активната/стандартната конфигурация на Claude. Изключено по подразбиране. | ### Състояние (5) -| Ключ | Тип | По подразбиране | Описание | -| ----------------------------------------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Деактивира крайната точка за проверка на състоянието на локалната инстанция. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Деактивира проверката на състоянието при валидиране на токена. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Активира мрежовия достъп в изолираната среда за умения. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | При обхождането за проверка на състоянието на прокситата отказана от целта заявка за проверка (401/403/429) нулира поредицата от последователни неуспехи на проксито. По подразбиране е изключено: отказът остава неутрален (#10654). Отговор 5xx остава неубедителен и в двата случая; отказът никога не премахва, деактивира или активира отново прокси. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Изпълнява първоначалната проверка на целостта/състоянието на БД, след като сървърът започне да приема заявки (чрез `setImmediate`), вместо да блокира стартирането до нейното завършване (#13717). По подразбиране е изключено: стартирането се блокира точно както преди тази PR. | +| Ключ | Тип | По подразбиране | Описание | +| ----------------------------------------- | ------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Деактивира крайната точка за проверка на състоянието на локалната инстанция. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Деактивира проверката на състоянието за валидиране на токени. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Активира мрежовия достъп в изолираната среда за умения. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | При обхождането за проверка на състоянието на прокситата сонда, която целта е отказала (401/403/429), нулира поредицата от последователни неуспехи на проксито. По подразбиране е изключено: отказът остава неутрален (#10654). Отговор 5xx остава неопределен и в двата случая; отказът никога не премахва, деактивира или активира повторно прокси. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Изпълнява първоначалната проверка на целостта/състоянието на БД, след като сървърът започне да приема заявки (чрез `setImmediate`), вместо да блокира стартирането до нейното завършване (#13717). По подразбиране е изключено: стартирането се блокира точно както преди тази PR. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` и наследеният му псевдоним +> `INPUT_SANITIZER_BLOCK_THRESHOLD` и предишният му псевдоним > `INJECTION_GUARD_BLOCK_THRESHOLD` настройват режима `block` на -> `INJECTION_GUARD_MODE`, но представляват обикновени променливи на средата, прочитани от +> `INJECTION_GUARD_MODE`, но са обикновени променливи на средата, прочитани от > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> а не флагове за функционалност: те нямат заместваща стойност в БД, нито превключвател в таблото за управление. Вижте +> а не флагове за функционалност: те нямат заместваща стойност в БД и превключвател в таблото за управление. Вижте > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> Колоната `Рестартиране` отбелязва флаговете с `requiresRestart: true` — стойността се -> запазва незабавно, но влиза в сила едва след презареждане на процеса. Флаговете от тип enum -> отхвърлят всяка стойност извън разрешения им набор (валидира се от страна на сървъра +> Колоната `Restart` обозначава флагове с `requiresRestart: true` — стойността се +> съхранява незабавно, но влиза в сила едва след презареждане на процеса. Флаговете +> с изброими стойности отхвърлят всяка стойност извън разрешения им набор (валидира се от страна на сървъра > както в `setFeatureFlagOverride()`, така и в REST обработчика за `PUT`). --- @@ -174,11 +176,11 @@ (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) поддържа: -- **Търсене** по ключ или описание и **филтриране** по категория (плюс синтетичен изглед +- **Търсене** по ключ или описание и **филтриране** по категория (както и синтетичен изглед **Изисква рестартиране**). -- **Превключвател** за булеви флагове и **падащо меню** за enum флагове +- **Превключвател** за булеви флагове и **падащо меню** за изброими флагове (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- **Значка за източник** за всеки флаг — `DB`, `ENV` или `DEF` — показваща откъде +- **Значка за източник** за всеки флаг — `DB`, `ENV` или `DEF` — която показва откъде идва ефективната стойност. - Бутон **Нулиране** (показва се само за флагове с източник `DB`) за премахване на заместването и бутон **Нулиране на всички замествания** в долната част. @@ -188,7 +190,7 @@ Всички операции преминават през един маршрут: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Всеки метод изисква удостоверена сесия на таблото за управление (в противен случай `401`). +Всеки метод изисква удостоверена сесия в таблото за управление (в противен случай се връща `401`). #### `GET /api/settings/feature-flags` @@ -210,7 +212,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... всичките 72 флага + // ... всички 74 флага ], "summary": { "total": 56, @@ -225,7 +227,7 @@ #### `PUT /api/settings/feature-flags` Задава или премахва единично заместване. Тяло: `{ key: string; value?: string }`. -Пропускането на `value` премахва заместването (възстановявайки стойността от env / по подразбиране). +Пропускането на `value` премахва заместването (като възстановява стойността от env / по подразбиране). ```bash # Задаване на заместване в DB @@ -240,17 +242,17 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ ``` Отговорът връща новите `effectiveValue`/`source`, предишните `previousValue`/ -`previousSource` и `requiresRestart`. Непознати ключове и enum стойности извън допустимия -диапазон се отхвърлят с `400`. +`previousSource` и `requiresRestart`. Непознати ключове и стойности на изброим тип +извън допустимия диапазон се отхвърлят с `400`. #### `DELETE /api/settings/feature-flags` -Изчиства **всички** замествания в DB наведнъж, възстановявайки за всеки флаг стойността +Изчиства **всички** замествания в DB наведнъж, като възстановява за всеки флаг неговата стойност от env / по подразбиране. Връща `{ cleared: , message: "..." }`. > [!NOTE] > Флаговете с `requiresRestart: true` влизат в сила само след презареждане на процеса. -> Процесът за рестартиране от таблото за управление извиква `POST /api/restart`, след което периодично проверява +> Процесът за рестартиране от таблото за управление извиква `POST /api/restart`, след което периодично заявява > `GET /api/health/ping`, докато сървърът отново стане достъпен. --- diff --git a/docs/i18n/bg/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/bg/docs/reference/PROVIDER_REFERENCE.md index f29ab53d7e90..94b47129a64c 100644 --- a/docs/i18n/bg/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/bg/docs/reference/PROVIDER_REFERENCE.md @@ -6,7 +6,7 @@ > **Автоматично генерирано** от `src/shared/constants/providers.ts` — не редактирайте ръчно. > Генерирайте отново с: `npm run gen:provider-reference` -> **Последно генериране:** 2026-09-17 +> **Последно генериране:** 2026-09-18 Общ брой доставчици: **359**. Вижте разбивката по категории по-долу. @@ -34,47 +34,47 @@ ## Доставчици без удостоверяване (не се изисква ключ) (10) -| ID | Псевдоним | Име | Етикети | Уебсайт | Бележки | Извикване на инструменти | -| ----------------------- | ---------- | ------------------------- | ------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | -| `aihorde` | `horde` | AI Horde | Без удостоверяване | [връзка](https://aihorde.net) | Не се изисква API ключ — използва се документираният анонимен ключ на AI Horde. Добавянето на безплатен ключ от aihorde.net не е задължително и осигурява единствено по-висок приоритет в опашката (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Без удостоверяване | [връзка](https://augmentcode.com) | OmniRoute не съхранява API ключ. Инсталирайте Auggie CLI и изпълнете `auggie login` на тази машина, след което OmniRoute го стартира локално за всяка заявка. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Без удостоверяване | [връзка](https://playground.ai.cloudflare.com) | Не се изискват идентификационни данни — използват се анонимни браузърни сесии чрез обратно проектиран WebSocket протокол cf_agent (транспорт чрез Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Без удостоверяване | [връзка](https://developers.openai.com/codex/cli) | OmniRoute не съхранява токен. App-server на Codex CLI управлява собственото си влизане в ChatGPT (~/.codex/auth.json, автоматично обновяван). Използвайте „Вход с ChatGPT“, ако CLI все още не е удостоверен. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Без удостоверяване | [връзка](https://docs.devin.ai/work-with-devin/devin-cli) | Удостоверяването се управлява от официалния Devin CLI в неговия изолиран том на моста. | емулирано | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Без удостоверяване | [връзка](https://duckduckgo.com/duckchat) | Не се изискват идентификационни данни — DuckDuckGo AI Chat е анонимен и безплатен. | емулирано | -| `opencode` | `oc` | OpenCode Free | Без удостоверяване | [връзка](https://opencode.ai) | Не се изисква API ключ — използва се публичната безплатна крайна точка на OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Без удостоверяване | [връзка](https://uncloseai.com) | Не се изисква удостоверяване. API приема всеки непразен низ като ключ за идентификация. Ако по-старите вградени модели връщат 404, използвайте Налични модели → Импортиране от /models или Автоматична синхронизация; потвърден работещ модел: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Без удостоверяване, видео | [връзка](https://veoaifree.com) | Не се изисква удостоверяване. Ограничението е 6 заявки/час за IP адрес. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Без удостоверяване | [връзка](https://zcode.z.ai) | OmniRoute не съхранява API ключ. Локалният app-server на ZCode използва съществуващото влизане в builtin:zai-coding-plan. | — | +| ID | Псевдоним | Име | Етикети | Уебсайт | Бележки | Извикване на инструменти | +| ----------------------- | ---------- | ------------------------- | ------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | +| `aihorde` | `horde` | AI Horde | Без удостоверяване | [връзка](https://aihorde.net) | Не се изисква API ключ — използва документирания анонимен ключ на AI Horde. Добавянето на безплатен ключ от aihorde.net е по избор и осигурява само по-висок приоритет в опашката (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Без удостоверяване | [връзка](https://augmentcode.com) | OmniRoute не съхранява API ключ. Инсталирайте Auggie CLI и изпълнете `auggie login` на тази машина, след което OmniRoute го стартира локално за всяка заявка. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Без удостоверяване | [връзка](https://playground.ai.cloudflare.com) | Не се изискват идентификационни данни — анонимни сесии в браузър чрез обратно проектирания WebSocket протокол cf_agent (транспорт чрез Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Без удостоверяване | [връзка](https://developers.openai.com/codex/cli) | OmniRoute не съхранява токен. App-server на Codex CLI управлява собственото си влизане в ChatGPT (~/.codex/auth.json, с автоматично опресняване). Използвайте „Влизане с ChatGPT“, ако CLI все още не е удостоверен. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Без удостоверяване | [връзка](https://docs.devin.ai/work-with-devin/devin-cli) | Удостоверяването се управлява от официалния Devin CLI в неговия изолиран том на моста. | емулирано | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Без удостоверяване | [връзка](https://duckduckgo.com/duckchat) | Не се изискват идентификационни данни — DuckDuckGo AI Chat е анонимен и безплатен. | емулирано | +| `opencode` | `oc` | OpenCode Free | Без удостоверяване | [връзка](https://opencode.ai) | Не се изисква API ключ — използва публичната безплатна крайна точка на OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Без удостоверяване | [връзка](https://uncloseai.com) | Не се изисква удостоверяване. API приема всеки непразен низ като ключ за идентификация. Ако по-старите вградени модели връщат 404, използвайте „Налични модели“ → „Импортиране от /models“ или „Автоматична синхронизация“; проверен работещ модел: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Без удостоверяване, видео | [връзка](https://veoaifree.com) | Не се изисква удостоверяване. Ограничено до 6 заявки/час за IP адрес. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Без удостоверяване | [връзка](https://zcode.z.ai) | OmniRoute не съхранява API ключ. Локалният app-server на ZCode използва съществуващото влизане builtin:zai-coding-plan. | — | ## OAuth доставчици (24) -| ID | Псевдоним | Име | Етикети | Уебсайт | Бележки | -| --------------- | ------------- | ------------------------- | ------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [връзка](https://antigravity.google) | Импортирайте данните си за вход от Antigravity CLI (`agy`) (поставете/качете файла с токена), автоматично открийте локална CLI сесия или влезте с Google. Споделя backend инфраструктурата на Antigravity (вкл. моделите Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [връзка](https://aws.amazon.com/q/developer/) | Използва същия AWS Builder ID или същия процес с импортиран refresh token като Kiro, но съхранява връзките с Amazon Q отделно. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [връзка](https://cline.bot/cline-pass) | ClinePass е абонаментът на Cline за $9.99/месец, който включва 10 отворени модела за програмиране. Влезте с акаунта си в Cline (същите данни за вход като за Cline CLI/IDE) или поставете директен API ключ за ClinePass (app.cline.bot → Settings → API Keys). Абонаментът за ClinePass отключва моделите cline-pass/*. Използва повторно OAuth процеса на Cline WorkOS. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [връзка](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Влезте чрез официалния CLI процес с код за устройство или поставете директен API ключ (изпращан като Authorization: Bearer). Каталог: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [връзка](https://cli.devin.ai) | Изисква изпълнимия файл на Devin CLI. Изпълнете `devin auth login`, за да се удостоверите, или предоставете своя WINDSURF_API_KEY. Инсталиране: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [връзка](https://devin.ai) | Поставете съществуващ Devin API ключ от удостоверена Devin сесия. Наличността на експортирането на ключа и необходимите стъпки се различават според версията на Devin и акаунта. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Въведете URL адреса на своя GHE екземпляр (напр. https://ghe.company.com) в настройките на доставчика, след което се удостоверете чрез процеса с код за устройство. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [връзка](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth не е конфигуриран. Регистрирайте OAuth приложение на https://gitlab.com/-/profile/applications с URI за пренасочване http://localhost:20128/callback и обхвати "ai_features read_user", след което задайте GITLAB_DUO_OAUTH_CLIENT_ID (и по желание GITLAB_DUO_OAUTH_CLIENT_SECRET) и рестартирайте. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Влезте чрез браузъра си или поставете своя ~/.grok/auth.json (или JWT токена за достъп) от Grok Build CLI; refresh_token се подновява автоматично и в двата случая. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [връзка](https://www.kimi.com/code?aff=omniroute) | Влезте със същия Kimi акаунт, който използвате за Kimi Code CLI. OmniRoute използва CLI OAuth процеса и крайните точки на Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Безплатно ниво: 50 кредита/месец (~25K–100K токена). ⚠️ Условията за ползване на Kiro забраняват употребата чрез прокси/инструменти на трети страни. | -| `openference` | `of` | Openference | OAuth | [връзка](https://openference.com) | Влезте с акаунта си в Openference, за да маршрутизирате заявките през api.openference.com. За извеждане на резултати от моделите е необходим активен план — OAuth може да извърши удостоверяване, но без такъв план да върне 402. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [връзка](https://trae.ai) | Trae е AI-ориентирана IDE от ByteDance (отдалечен агент SOLO). Упълномощете чрез trae.ai в изскачащия прозорец или влезте в solo.trae.ai и поставете Cloud-IDE-JWT (изпращан като 'Authorization: Cloud-IDE-JWT ', с валидност ~14 дни) като токен за достъп; web_id/biz_user_id/user_unique_id/scope/tenant/region се предават чрез providerSpecificData. Няма фоново подновяване за поставени токени — поставете токена отново след изтичането му. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [връзка](https://x.ai) | Влезте с xAI, за да използвате модели от api.x.ai, като Grok 4.5. Това е отделно от Grok Build JWT сесиите, които използват cli-chat-proxy.grok.com и псевдоними на модели grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [връзка](https://zed.dev) | Zed съхранява идентификационните данни за LLM доставчиците (OpenAI, Anthropic, Google, Mistral, xAI) в хранилището за ключове на операционната система. Използвайте бутона Import по-долу, за да бъдат открити и импортирани автоматично. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [връзка](https://zed.dev) | Влезте с акаунта си в Zed (вход чрез собственото приложение). OmniRoute генерира RSA двойка ключове за еднократна употреба и отваря zed.dev, за да я упълномощите — при отдалечена инсталация/инсталация без графичен интерфейс копирайте получения URL адрес за обратно извикване към 127.0.0.1 от адресната лента на браузъра и го поставете обратно тук. Това е различно от записа за импортиране на идентификационни данни „Zed IDE“ по-горе: услугата проксира завършванията на чатове през собствения хостван агрегатор на модели на Zed (cloud.zed.dev), който предоставя достъп до модели на Anthropic/OpenAI/Google/xAI според вашия план за Zed. | +| ИД | Псевдоним | Име | Етикети | Уебсайт | Бележки | +| --------------- | ------------- | ------------------------- | ------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [връзка](https://antigravity.google) | Импортирайте данните си за вход от Antigravity CLI (`agy`) (поставете/качете неговия файл с токен), автоматично открийте локална CLI сесия или влезте с Google. Използва споделения бекенд на Antigravity (вкл. моделите Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [връзка](https://aws.amazon.com/q/developer/) | Използва същия AWS Builder ID или процес с импортиран токен за опресняване като Kiro, но съхранява връзките с Amazon Q отделно. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [връзка](https://cline.bot/cline-pass) | ClinePass е абонаментът на Cline за $9.99/месец, включващ 10 отворени модела за програмиране. Влезте с акаунта си в Cline (същите данни за вход като за Cline CLI/IDE) или поставете директен ClinePass API ключ (app.cline.bot → Settings → API Keys). Абонаментът за ClinePass отключва моделите cline-pass/*. Използва повторно OAuth процеса на Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [връзка](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Влезте чрез официалния CLI процес с код за устройство или поставете директен API ключ (изпраща се като Authorization: Bearer). Каталог: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [връзка](https://cli.devin.ai) | Изисква изпълнимия файл на Devin CLI. Изпълнете `devin auth login`, за да се удостоверите, или предоставете своя WINDSURF_API_KEY. Инсталиране: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [връзка](https://devin.ai) | Поставете съществуващ Devin API ключ от удостоверена Devin сесия. Наличността и стъпките за експортиране на ключа се различават според версията на Devin и акаунта. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Въведете URL адреса на своя GHE екземпляр (напр. https://ghe.company.com) в настройките на доставчика, след което се удостоверете чрез процеса за устройство. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [връзка](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth не е конфигуриран. Регистрирайте OAuth приложение на https://gitlab.com/-/profile/applications с URI за пренасочване http://localhost:20128/callback и обхвати "ai_features read_user", след което задайте GITLAB_DUO_OAUTH_CLIENT_ID (и по желание GITLAB_DUO_OAUTH_CLIENT_SECRET) и рестартирайте. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Влезте чрез браузъра си или поставете своя ~/.grok/auth.json (или JWT токена за достъп) от Grok Build CLI; refresh_token се завърта автоматично и в двата случая. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [връзка](https://www.kimi.com/code?aff=omniroute) | Влезте със същия Kimi акаунт, използван от Kimi Code CLI. OmniRoute използва CLI OAuth процеса и крайните точки на Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Безплатно ниво: 50 кредита/месец (~25K–100K токена). ⚠️ Условията за ползване на Kiro забраняват използването на прокси/инструментариум от трети страни. | +| `openference` | `of` | Openference | OAuth | [връзка](https://openference.com) | Влезте с акаунта си в Openference, за да маршрутизирате заявки през api.openference.com. Включва безплатен достъп до Qwen3.8 27b и Llama 3.2 3B — вижте openference.com/pricing за актуалните условия на плана. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [връзка](https://trae.ai) | Trae е IDE, изградено около ИИ, от ByteDance (отдалечен агент SOLO). Упълномощете чрез trae.ai в изскачащия прозорец или влезте в solo.trae.ai и поставете Cloud-IDE-JWT (изпраща се като 'Authorization: Cloud-IDE-JWT ', с валидност ~14 дни) като токен за достъп; web_id/biz_user_id/user_unique_id/scope/tenant/region се предават чрез providerSpecificData. Няма фоново опресняване за поставените токени — поставете ги отново след изтичане. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [връзка](https://x.ai) | Влезте с xAI, за да използвате модели от api.x.ai, като Grok 4.5. Това е отделно от JWT сесиите на Grok Build, които използват cli-chat-proxy.grok.com и псевдоними на модели grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [връзка](https://zed.dev) | Zed съхранява идентификационните данни за LLM доставчици (OpenAI, Anthropic, Google, Mistral, xAI) в хранилището за ключове на операционната система. Използвайте бутона „Импортиране“ по-долу, за да ги откриете и импортирате автоматично. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [връзка](https://zed.dev) | Влезте с акаунта си в Zed (вход чрез собственото приложение). OmniRoute генерира еднократна RSA двойка ключове и отваря zed.dev, за да я упълномощите — при отдалечена инсталация или инсталация без графичен интерфейс копирайте получения URL адрес за обратно извикване към 127.0.0.1 от адресната лента на браузъра и го поставете обратно тук. Това се различава от записа за импортиране на идентификационни данни „Zed IDE“ по-горе: тази опция препраща довършванията на чат през собствения хостван агрегатор на модели на Zed (cloud.zed.dev), който предоставя модели на Anthropic/OpenAI/Google/xAI в рамките на вашия план за Zed. | ## Доставчици на уеб бисквитки (34) @@ -117,250 +117,250 @@ ## Доставчици на API ключове (платени / платени с безплатни кредити) (242) -| ID | Псевдоним | Име | Етикети | Уебсайт | Бележки | -| ------------------------ | --------------- | ------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `360ai` | `360ai` | 360 AI | API ключ | [връзка](https://ai.360.cn) | Вземете API ключ от ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | API ключ, агрегатор | [връзка](https://agentrouter.org) | $200 безплатни кредити при регистрация — шлюз за маршрутизиране между множество модели | -| `agnes` | `agnes` | Agnes AI | API ключ, видео | [връзка](https://agnes-ai.com) | Вземете API ключ от agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Китай) | API ключ | [връзка](https://api.agnes-ai.cn) | Вземете API ключ от китайския сайт на Agnes. | -| `ai21` | `ai21` | AI21 Labs | API ключ | [връзка](https://www.ai21.com) | $10 пробни кредити при регистрация (валидни 3 месеца), не се изисква кредитна карта | -| `aimlapi` | `aiml` | AI/ML API | API ключ, агрегатор | [връзка](https://aimlapi.com) | Безплатният план е спрян (2026) — AI/ML API вече работи само на принципа „плащане според потреблението“ (минимално зареждане от $20); няма периодични безплатни кредити. | -| `ainative` | `ainative` | AINative Studio | API ключ | [връзка](https://ainative.studio) | Създайте безплатен API ключ в ainative.studio (без карта), след което го поставете тук като Bearer токен. | -| `aion` | `aion` | Aion Labs | API ключ | [връзка](https://www.aionlabs.ai) | Създайте безплатен API ключ в aionlabs.ai (без карта), след което го поставете тук като Bearer токен. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API ключ | [връзка](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Китай) | API ключ | [връзка](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API ключ | [връзка](https://developer.ant-ling.com/en/docs/) | Регистрирайте се и създайте API ключ в API конзолата на Ant Ling (https://chat.ant-ling.com/open), след което го поставете тук. OmniRoute маршрутизира трафика за чат към https://api.ant-ling.com/v1/chat/completions; доставчикът е съвместим с OpenAI и предлага също интерфейс, съвместим с Anthropic. | -| `anthropic` | `anthropic` | Anthropic | API ключ | [връзка](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API ключ, агрегатор | [връзка](https://anyapi.ai) | Безплатен план: 100 000 ANY токена/ден и 100 RPM за отговарящите на условията модели Free/Basic; не се изисква кредитна карта. | -| `api-airforce` | `af` | Api.airforce | API ключ | [връзка](https://api.airforce) | 55 модела в безплатния план, включително Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API ключ | [връзка](https://arcee.ai) | Вземете API ключ от arcee.ai | -| `auriko` | `auriko` | Auriko | API ключ, агрегатор | [връзка](https://www.auriko.ai) | Безплатният план предлага 1 000 RPM за платформата и 10 000 BYOK RPM. Извеждането през платформата продължава да включва разходите на доставчика; това не е безплатен набор от токени или неограничено безплатно извеждане. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API ключ, корпоративен | [връзка](https://learn.microsoft.com/azure/ai-foundry) | Използвайте своя ключ за Azure AI Foundry. Базовият URL може да бъде https://.services.ai.azure.com/openai/v1/ или https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | API ключ, корпоративен | [връзка](https://azure.microsoft.com/products/ai-services/openai-service) | Използвайте своя API ключ за Azure OpenAI. Базовият URL трябва да бъде крайната точка на вашия ресурс, например https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API ключ | [връзка](https://b.ai) | Bearer API ключ за съвместимия с OpenAI LLM шлюз на b.ai (различен от TheB.AI). Създайте ключ в https://docs.b.ai, след което използвайте https://api.b.ai/v1 като съвместим с OpenAI базов URL. | -| `baichuan` | `baichuan` | Baichuan | API ключ | [връзка](https://www.baichuan-ai.com/) | Вземете API ключ от platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | API ключ | [връзка](https://ernie.baidu.com/) | Вземете API ключ от console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API ключ | [връзка](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API ключ | [връзка](https://baseten.co) | $30 безплатни пробни кредити за извеждане чрез GPU | -| `bazaarlink` | `bzl` | BazaarLink | API ключ | [връзка](https://bazaarlink.ai) | Използвайте своя API ключ за BazaarLink (започва с sk-bl-) в Authorization: Bearer . OpenAI SDK работи с базов URL https://bazaarlink.ai/api/v1. Моделите използват формат provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | API ключ, корпоративен | [връзка](https://aws.amazon.com/bedrock) | Използвайте своя API ключ за Amazon Bedrock и конфигурирайте региона на AWS, в който са активирани моделите ви (например eu-west-2). OmniRoute извиква директно вградения Converse API на Bedrock. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API ключ, изображение | [връзка](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API ключ | [връзка](https://blackbox.ai) | ⚠️ **ОТТЕГЛЕНО ОТ УПОТРЕБА.** api.blackbox.ai връща HTTP 404 за всеки вариант на пътя (проверка от 2026-08-21); публичният интерфейс за извеждане е преместен към ограничената крайна точка enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | API ключ | [връзка](https://www.bluesminds.com) | Безплатни ежедневни pi кредити — поддържа над 200 модела, включително GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API ключ | [връзка](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API ключ | [връзка](https://bytez.com) | $1 безплатни кредити, подновявани на всеки 4 седмици | -| `cerebras` | `cerebras` | Cerebras | API ключ | [връзка](https://inference.cerebras.ai) | Еднократен кредит от $5 при регистрация (валиден 30 дни); изисква се начин на плащане. Това не е периодично подновяван безплатен план. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API ключ | [връзка](https://hyper.charm.land) | 100 безплатни Hypercredits месечно при регистрация | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API ключ, агрегатор | [връзка](https://api.oriper.com) | Официалните метаданни рекламират 2 млн. токена месечно, но публичният сайт и документацията бяха блокирани по време на проверката; считайте квотата и съответствието на марката за непотвърдени. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API ключ, агрегатор | [връзка](https://chatanywhere.tech) | Само за лична, образователна или изследователска употреба: публичната документация посочва 10 000 точки/ден и 200 заявки/ден за IP адрес/ключ; не използвайте за търговски трафик. | -| `cheaperinference` | `cinf` | Cheaper Inference | API ключ | [връзка](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API ключ | [връзка](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API ключ, агрегатор | [връзка](https://chutes.ai) | Bearer API ключ за съвместимия с OpenAI шлюз на Chutes. | -| `clarifai` | `clarifai` | Clarifai | API ключ, корпоративен | [връзка](https://docs.clarifai.com) | Използвайте своя Clarifai PAT или специфичен за приложението API ключ. OmniRoute използва съвместимата с OpenAI крайна точка на https://api.clarifai.com/v2/ext/openai/v1 и се удостоверява чрез Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API ключ, агрегатор | [връзка](https://cloudcode.one) | Публикуваните безплатни модели включват glm-4.7-flash и glm-4.6v-flash; не е публикувана числена квота, а създаването на ключ може да изисква кредит или купон. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API ключ | [връзка](https://developers.cloudflare.com/workers-ai) | Изисква API Token И Account ID (намира се на dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API ключ | [връзка](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API ключ | [връзка](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API ключ | [връзка](https://cohere.com) | Безплатен пробен период: 1 000 API извиквания/месец за тестване, без да се изисква кредитна карта | -| `command-code` | `cmd` | Command Code | API ключ | [връзка](https://commandcode.ai/) | Използвайте API ключ за Command Code. Заявките се изпращат към крайната точка /provider/v1/chat/completions на Command Code. | -| `coze` | `coze` | Coze | API ключ | [връзка](https://coze.com) | Вземете API ключ от coze.com/open/api | -| `crof` | `crof` | CrofAI | API ключ | [връзка](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API ключ | [връзка](https://cursor.com/dashboard/api) | Поставете потребителски API ключ за Cursor (crsr_...) от cursor.com/dashboard/api. При необходимост OmniRoute го заменя за сесиен токен; не е необходимо инсталирането на IDE или cursor-agent. Използването се таксува към плана Cursor, който притежава ключа. | -| `dahl` | `dahl` | Dahl | API ключ | [връзка](https://inference.dahl.global) | Щракнете върху „Add Account“ за автоматично генериране на токен или добавете ръчно API ключ. | -| `databricks` | `databricks` | Databricks | API ключ, корпоративен | [връзка](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API ключ, корпоративен | [връзка](https://docs.datarobot.com) | Използвайте своя DataRobot API токен. Незадължителният Base URL може да бъде кореновият адрес на акаунта (за LLM Gateway) или URL адрес за внедряване под /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | API ключ, изображение | [връзка](https://deepai.org) | Използвайте своя DeepAI API ключ. Вземете такъв от deepai.org — изисква се абонамент Pro ($9.99/месец). | -| `deepinfra` | `deepinfra` | DeepInfra | API ключ | [връзка](https://deepinfra.com) | Безплатни кредити при регистрация за тестване на API и проучване на модели | -| `deepseek` | `ds` | DeepSeek | API ключ | [връзка](https://platform.deepseek.com) | 5 млн. безплатни токена при регистрация — не се изисква кредитна карта | -| `dgrid` | `dgrid` | DGrid | API ключ | [връзка](https://dgrid.ai) | Маршрутизатор за безплатни модели на DGrid: 10 заявки/минута и 100 заявки/ден. Еднократно зареждане от $5 отключва до 20 заявки/минута и 1 000 заявки/ден. | -| `dify` | `dify` | Dify | API ключ | [връзка](https://dify.ai) | Вземете API ключ от своята Dify инстанция. | -| `digitalocean` | `digitalocean` | DigitalOcean | API ключ | [връзка](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API ключ | [връзка](https://dit.ai) | Използвайте своя dit.ai API ключ в Authorization: Bearer . Напълно съвместим с OpenAI — директен заместител, просто променете базовия URL адрес на https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API ключ | [връзка](https://doubao.com) | Вземете API ключ от console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | API ключ, агрегатор | [връзка](https://www.dxnt.com) | За безплатните акаунти са документирани 100 извиквания/ден; квотата може да се увеличи чрез покани и да варира според акаунта. | -| `electronhub` | `electronhub` | Electron Hub | API ключ, агрегатор | [връзка](https://www.electronhub.ai) | Безплатен план: 5 RPM, седмични кредити от $0.25 и 10 Neutrinos/ден за модели с :free; прилагат се и семейни бюджети. | -| `empower` | `empower` | Empower | API ключ, агрегатор | [връзка](https://docs.empower.dev) | Bearer API ключ за съвместимата с OpenAI крайна точка на Empower. | -| `eurouter` | `eurouter` | EURouter | API ключ, агрегатор | [връзка](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API ключ | [връзка](https://factory.ai) | Bearer API ключ за съвместимия с OpenAI шлюз на Factory. | -| `fal-ai` | `fal` | Fal.ai | API ключ, изображение | [връзка](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API ключ, агрегатор | [връзка](https://fastrouter.ai) | Моделите със суфикс :free позволяват 10 заявки/ден за организация и модел; наличността може да се променя. | -| `featherless-ai` | `featherless` | Featherless AI | API ключ | [връзка](https://featherless.ai) | Наличен е безплатен план — не се изисква кредитна карта | -| `fenayai` | `fenayai` | FenayAI | API ключ, агрегатор | [връзка](https://fenayai.com) | Bearer API ключ за съвместимия с OpenAI шлюз на FenayAI. | -| `fireworks` | `fireworks` | Fireworks AI | API ключ | [връзка](https://fireworks.ai) | $1 безплатни начални кредити при регистрация за тестване на API | -| `free-ai` | `free-ai` | Free.ai | API ключ, агрегатор | [връзка](https://free.ai) | 30 000 токена/ден покриват самостоятелно хоствани модели след потвърждение на имейл адреса. Използването над този обем може да се таксува по себестойност, а първокласните външни модели са платени. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API ключ | [връзка](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API ключ | [връзка](https://freebuff.com) | Въведете токен за удостоверяване на Freebuff / Codebuff (получен чрез влизане през CLI или автоматизиран инструмент за събиране). | -| `freeinference` | `freeinference` | FreeInference | API ключ, агрегатор | [връзка](https://freeinference.org) | Безплатен достъп за научни изследвания без карта; кандидатите извън Harvard се нуждаят от ръчно одобрение и няма публично гарантирана числова квота. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API ключ | [връзка](https://freemodel.dev) | $300 безплатни кредити при регистрация — не се изисква кредитна карта. Достъп до GPT-5.4 и GPT-5.5 (най-новите водещи модели на OpenAI) чрез API, съвместим с OpenAI. | -| `freetheai` | `fta` | FreeTheAi | API ключ, агрегатор | [връзка](https://freetheai.xyz) | Присъединете се към Discord сървъра на FreeTheAi, за да получите своя безплатен API ключ. | -| `friendliai` | `friendli` | FriendliAI | API ключ | [връзка](https://friendli.ai) | Безплатно ниво за безсървърен инференс — не се изисква кредитна карта | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте членски ключ за g4f.dev (създайте такъв в g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте членски ключ за g4f.dev (създайте такъв в g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте членски ключ за g4f.dev (създайте такъв в g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте членски ключ за g4f.dev (създайте такъв в g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте членски ключ за g4f.dev (създайте такъв в g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | API ключ | [връзка](https://galadriel.com) | ⚠️ **ОТТЕГЛЕН ОТ УПОТРЕБА.** api.galadriel.ai вече не се разрешава (проверка от 2026-06-19); изглежда, че API за инференс е преустановен. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API ключ | [връзка](https://aistudio.google.com) | Чрез Google AI Studio е налично безплатно ниво; прилагат се текущите квоти за отделните модели и регионалните ограничения | -| `getgoapi` | `ggo` | GoAPI | API ключ, агрегатор | [връзка](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API ключ | [връзка](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API ключ | [връзка](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Личен токен за достъп до GitLab за публичния API на Code Suggestions. Конфигурирайте собствено хостван базов URL адрес, когато не използвате gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API ключ | [връзка](https://opengateway.gitlawb.com) | Безплатният MiMo (xiaomi/mimo-v2.5) беше оттеглен през 2026-05 — Opengateway вече е кредитен портал с плащане според използването; няма повтарящ се безплатен модел. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API ключ | [връзка](https://opengateway.gitlawb.com) | Безплатната промоция за Nemotron приключи през 2026-06 — маршрутът през GMI Cloud вече е достъпен само с кредити при плащане според използването. | -| `glm` | `glm` | GLM Coding | API ключ | [връзка](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Китай) | API ключ | [връзка](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API ключ | [връзка](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API ключ | [връзка](https://greenpt.com) | Създаването на API абонамент е безплатно; инференсът се таксува на токен. Не е публикувана безплатна квота за инференс. | -| `groq` | `groq` | Groq | API ключ | [връзка](https://groq.com) | Безплатен план: ограничения за отделните модели (200K токена/ден за всеки чат модел; вижте console.groq.com/docs/rate-limits за RPM/RPD) — без регистриран метод на плащане. | -| `haiper` | `hp` | Haiper | API ключ, видео | [връзка](https://haiper.ai) | Вземете API ключ от haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | API ключ | [връзка](https://api.hcnsec.cn) | Вземете API ключ от api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | API ключ, агрегатор | [връзка](https://helixmind.online) | Разпространяваните по-рано твърдения за 3 RPM/50 RPD и липса на изискване за карта не бяха потвърдени по време на проверката от 2026-08-02; текущите квоти и таксуване изискват проверка на акаунта. | -| `helyxai` | `helyxai` | Helyx AI | API ключ, агрегатор | [връзка](https://helyxai.space) | Документацията за действащия безплатен план посочва 100 000 токена/ден; отделното маркетингово твърдение на сайта за над 2M токена противоречи на това и не се счита за гаранция за квота. | -| `heroku` | `heroku` | Heroku AI | API ключ, корпоративен | [връзка](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API ключ | [връзка](https://huggingface.co) | Безплатен API за инференс за хиляди модели (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API ключ | [връзка](https://hyperbolic.xyz) | $1-5 пробни кредити при регистрация за безсървърен инференс | -| `ideogram` | `ideo` | Ideogram | API ключ | [връзка](https://ideogram.ai) | Вземете API ключ от ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | API ключ | [връзка](https://xinghuo.xfyun.cn) | Вземете API ключ от console.xfyun.cn | -| `inception` | `inception` | Inception | API ключ | [връзка](https://docs.inceptionlabs.ai) | 10M безплатни токена при регистрация, без изискване за кредитна карта. | -| `inference-net` | `inet` | Inference.net | API ключ | [връзка](https://inference.net) | $25 безплатни кредити при регистрация, както и налични грантове за научни изследвания | -| `internlm` | `internlm` | InternLM (Intern-S1) | API ключ | [връзка](https://internlm.intern-ai.org.cn/) | Безплатна месечна квота от около 1M входни / 3M изходни токена (около 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API ключ, вграждане/пренареждане | [връзка](https://jina.ai) | Bearer API ключ за api.jina.ai — вграждане, пренареждане, класифициране, сегментиране и търсене. Ключовете от таблото за управление са с предимство пред JINA_AI_API_KEY. Това не е картата Reader / r.jina.ai и не извлича URL адреси. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API ключ | [връзка](https://jina.ai/reader) | Bearer API ключ за преобразуване на URL адреси в Markdown чрез r.jina.ai (само /v1/web/fetch). Не обслужва /v1/embeddings или /v1/rerank. Същият Jina токен като за Foundation API работи; OmniRoute използва повторно ключ от таблото за управление на jina-ai или JINA_AI_API_KEY, когато тази карта е празна. | -| `kenari` | `kenari` | Kenari | API ключ | [връзка](https://kenari.id) | Използвайте своя Kenari API ключ (kn-...) в Authorization: Bearer . Напълно съвместим с OpenAI. Основен URL адрес на API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API ключ | [връзка](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API ключ, агрегатор | [връзка](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (наследен Moonshot API) | API ключ | [връзка](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API ключ | [връзка](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API ключ | [връзка](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API ключ, агрегатор | [връзка](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API ключ, видео | [връзка](https://leonardo.ai) | Получете API ключ от leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | API ключ | [връзка](https://liquid.ai) | Получете API ключ от liquid.ai | -| `literouter` | `literouter` | LiteRouter | API ключ, агрегатор | [връзка](https://literouter.com) | Безплатните варианти на моделите използват суфикса :free; дневните лимити за кредити варират според модела, а безплатният вход е ограничен до 5 000 токена. | -| `llamagate` | `llamagate` | LlamaGate | API ключ | [връзка](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API ключ, агрегатор | [връзка](https://llm.kiwi) | Безплатният план предоставя auto и hrLLM; публикуваният лимит от 40 заявки/час се отнася за hrLLM. | -| `llm7` | `llm7` | LLM7.io | API ключ | [връзка](https://llm7.io) | Използвайте произволен непразен ключ (например 'unused'). Ако по-старите вградени модели връщат model_unavailable, използвайте Available Models → Import from /models или Auto-Sync; проверен работещ модел: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API ключ, агрегатор | [връзка](https://llmgateway.io) | Хостван план Free: моделите с безплатно ценообразуване са ограничени до 5 заявки на 10 минути, когато акаунтът няма кредити. | -| `logfare` | `logfare` | Logfare | API ключ, агрегатор | [връзка](https://logfare.ai) | Създайте безплатен акаунт на https://logfare.ai/register (потребителско име/парола, без потвърждение по имейл), за да получите незабавно API ключ, след което го поставете тук като Bearer токен. | -| `longcat` | `lc` | LongCat AI | API ключ | [връзка](https://longcat.chat/platform/docs) | Безплатно: еднократно предоставяне на 10 млн. токена след регистрация на акаунт и KYC проверка (LongCat-2.0). Само еднократно — не е повтарящ се дневен/месечен лимит. | -| `magnific` | `freepik` | Magnific | API ключ, изображение | [връзка](https://www.magnific.com) | Получете API ключ от magnific.com/user/api-keys (заглавка x-magnific-api-key). Наследените ключове за разработчици на Freepik продължават да работят. | -| `maritalk` | `maritalk` | Maritalk | API ключ | [връзка](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API ключ, агрегатор | [връзка](https://meganova.ai) | Безплатна регистрация без карта. Публикуваните квоти на Tier 1 за отделните модели са общо 550 заявки/ден; те не са споделен глобален пул и може да бъде начислено платено превишение, ако е активирано. | -| `meta-llama` | `meta` | Meta Llama API | API ключ | [връзка](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API ключ, видео | [връзка](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Китай) | API ключ | [връзка](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API ключ | [връзка](https://mistral.ai) | Безплатно ниво Experiment: достъп с ограничение на честотата до всички модели, без необходимост от кредитна карта | -| `mixedbread` | `mxbai` | Mixedbread AI | API ключ | [връзка](https://www.mixedbread.com) | Bearer API ключ за API за вграждане на Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | API ключ, агрегатор | [връзка](https://www.mixlayer.com) | Моделът qwen/qwen3.5-4b-free е безплатен за прототипиране и е с ограничение на честотата; няма потвърден фиксиран публичен лимит за RPM или дневна квота. | -| `mnn-ai` | `mnn-ai` | MNN AI | API ключ, агрегатор | [връзка](https://mnnai.ru) | Безплатен план: $1 месечни кредити, 10 RPM и достъп само до модели, отбелязани като Free. | -| `modal` | `mdl` | Modal | API ключ, корпоративен | [връзка](https://modal.com/docs) | Използвайте Bearer токена, който защитава вашето внедряване в Modal, ако е активиран. Основният URL адрес трябва да сочи към вашето съвместимо с OpenAI приложение в Modal, например https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API ключ | [връзка](https://modelscope.cn) | Безплатно ниво чрез ModelScope API-Inference — необходим е акаунт в Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | API ключ | [връзка](https://monsterapi.ai) | ⚠️ **ОТТЕГЛЕН.** Monster API прекрати дейността си на 2026-06-30. Използвайте алтернативни доставчици, съвместими с OpenAI. | -| `moonshot` | `moonshot` | Kimi | API ключ | [връзка](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API ключ | [връзка](https://morphllm.com) | Безплатно ниво: 250 хил. кредита/месец, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API ключ | [връзка](https://github.com/meta-llama/llama-stack) | Използвайте своята променлива на средата META_API_KEY като Bearer токен. Muse Code CLI използва мрежовия формат на OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API ключ, агрегатор | [връзка](https://naga.ac) | Получете API ключ от naga.ac — налична е регистрация чрез Google/GitHub/Discord. | -| `naga-ai` | `naga-ai` | Naga AI | API ключ, агрегатор | [връзка](https://naga.ac) | Моделите, отбелязани с :free, са публично изброени, но няма потвърдена числова квота. Политиката на Naga предупреждава, че заявките и отговорите от безплатното ниво може да бъдат събирани или използвани за обучение. | -| `nanogpt` | `nanogpt` | NanoGPT | API ключ | [връзка](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API ключ | [връзка](https://bynara.id) | Създайте безплатен акаунт в NaraRouter, свържете своя Telegram (задължително преди получаване на отговори от /v1), след което поставете ключа тук като Bearer токен. | -| `navy` | `navy` | NavyAI | API ключ | [връзка](https://api.navy) | Създайте безплатен API ключ от таблото за управление на NavyAI, след което го поставете тук като Bearer токен. | -| `nebius` | `nebius` | Nebius AI | API ключ | [връзка](https://nebius.com) | Пробни кредити на стойност ~$1 при регистрация за тестване на API | -| `nlpcloud` | `nlpc` | NLP Cloud | API ключ | [връзка](https://docs.nlpcloud.com) | Използвайте своя API ключ за NLP Cloud в Authorization: Token . По подразбиране OmniRoute използва крайната точка за чатбот на https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | API ключ | [връзка](https://nomic.ai) | Получете API ключ от atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | API ключ | [връзка](https://portal.nousresearch.com/help) | Използвайте своя API ключ за Nous Portal. OmniRoute използва официалната, съвместима с OpenAI крайна точка за инференция на https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API ключ, видео, агрегатор | [връзка](https://novita.ai) | Пробни кредити на стойност $0.50 при регистрация (валидни около 1 година) | -| `nscale` | `nscale` | nScale | API ключ | [връзка](https://nscale.com) | $5 безплатни кредити при регистрация за тестване на инференция | -| `nube` | `nube` | Nube.sh | API ключ | [връзка](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API ключ | [връзка](https://build.nvidia.com) | Безплатен достъп за разработчици: ~40 RPM, над 70 модела (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API ключ, корпоративен | [връзка](https://www.oracle.com/artificial-intelligence/generative-ai) | Използвайте своя API ключ за OCI Generative AI или IAM bearer токен. Базовият URL адрес може да бъде https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | API ключ, агрегатор | [връзка](https://ofox.ai) | Текущият каталог обявява над 10 безплатни модела без публично посочена числова квота; преди използване в продукционна среда прегледайте произхода от доставчиците нагоре по веригата и условията за съхранение и обучение. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API ключ | [връзка](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API ключ | [връзка](https://1min.ai) | Създайте API ключ на https://docs.1min.ai/docs/api/create-api-key, след което го поставете тук. | -| `openadapter` | `oad` | OpenAdapter | API ключ | [връзка](https://openadapter.dev) | Използвайте своя API ключ за OpenAdapter в Authorization: Bearer sk-cv-. Напълно съвместим с OpenAI. Базов URL адрес на API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API ключ | [връзка](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API ключ | [връзка](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API ключ | [връзка](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API ключ | [връзка](https://openference.com) | Безплатен план: 3-дневен пробен период с модели с отворен код — не се изисква кредитна карта | -| `openrouter` | `openrouter` | OpenRouter | API ключ, агрегатор | [връзка](https://openrouter.ai) | Безплатни модели при $0/токен със суфикс :free — 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API ключ | [връзка](https://openvecta.com) | Безплатни кредити при регистрация за съвместима с OpenAI инференция с LLM, вграждания и модели за логическо разсъждение | -| `opper` | `opper` | Opper | API ключ, агрегатор | [връзка](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API ключ | [връзка](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API ключ | [връзка](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API ключ | [връзка](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API ключ | [връзка](https://www.perplexity.ai) | Използвайте своя API ключ за Perplexity. OmniRoute насочва идентификаторите на моделите от Agent API през съвместимата с Responses крайна точка на Perplexity. | -| `piapi` | `pi` | PiAPI | API ключ, агрегатор | [връзка](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API ключ | [връзка](https://pioneer.ai) | $75 безплатни кредити за използване — не се изисква кредитна карта | -| `plamo` | `plamo` | PLaMo | API ключ | [връзка](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API ключ, агрегатор | [връзка](https://creator.poe.com/api-reference) | Bearer API ключ за съвместимия с OpenAI API на Poe. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API ключ, агрегатор | [връзка](https://poixe.com) | Текущите публични безплатни ограничения са ниски и специфични за всяка група модели: 2 RPM/5 RPD за модели от категория large-cup и 20 RPM/50 RPD за модели от категория small-cup. | -| `pollinations` | `pol` | Pollinations AI | API ключ, видео | [връзка](https://pollinations.ai) | Анонимният достъп или достъпът без ключ до документираните безплатни модели се предоставя без гаранция. Локална проверка с v3.8.50 (2026-07-31) върна 401 през OmniRoute и Cloudflare 1010 при директни заявки към доставчика от същата мрежа. Премиум моделите все още изискват API ключ за Pollinations от enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API ключ | [връзка](https://poolside.ai) | Laguna S 2.1 и XS 2.1 са безплатни по време на предварителния преглед; няма публикувана числова квота. | -| `predibase` | `predibase` | Predibase | API ключ | [връзка](https://predibase.com) | ⚠️ **ОТТЕГЛЕНО ОТ УПОТРЕБА.** serving.app.predibase.com вече не се разрешава (проверка 2026-06-19); управляваният API за обслужване изглежда е преустановен. | -| `publicai` | `publicai` | PublicAI | API ключ | [връзка](https://publicai.co) | Изисква API ключ — еднократен кредит при регистрация, след това услугата е платена | -| `qianfan` | `qianfan` | Baidu Qianfan | API ключ | [връзка](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API ключ | [връзка](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API ключ | [връзка](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API ключ | [връзка](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API ключ, изображение | [връзка](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API ключ | [връзка](https://regolo.ai) | Вземете своя Regolo API ключ от regolo.ai, след което го поставете тук като Bearer токен. | -| `reka` | `reka` | Reka | API ключ | [връзка](https://docs.reka.ai/chat/overview) | Използвайте своя Reka API ключ. OmniRoute поддържа съвместимия с OpenAI базов URL адрес https://api.reka.ai/v1 и изпраща както заглавката Authorization, така и X-Api-Key за съвместимост. | -| `requesty` | `requesty` | Requesty | API ключ | [връзка](https://requesty.ai) | Безплатно ниво с около 200 заявки на ден — шлюз за маршрутизиране между множество модели (над 300 модела) | -| `routeway` | `routeway` | Routeway | API ключ | [връзка](https://routeway.ai) | Създайте безплатен API ключ в routeway.ai, след което го поставете тук като Bearer токен. | -| `runwayml` | `runway` | Runway | API ключ, видео | [връзка](https://docs.dev.runwayml.com) | Използвайте своя Runway API ключ в Authorization: Bearer . OmniRoute използва текущия Runway API на https://api.dev.runwayml.com/v1 и автоматично изпраща задължителната заглавка X-Runway-Version. | -| `sambanova` | `samba` | SambaNova | API ключ | [връзка](https://sambanova.ai) | $5 безплатен кредит при регистрация (валиден 30 дни), без необходимост от кредитна карта | -| `sap` | `sap` | SAP Generative AI Hub | API ключ, корпоративен | [връзка](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Използвайте своя SAP AI Core bearer токен. Базовият URL адрес може да бъде коренът на вашия AI_API_URL или deploymentUrl от Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | API ключ | [връзка](https://docs.sarvam.ai) | ₹1,000 безплатен кредит при регистрация — без срок на валидност | -| `scaleway` | `scw` | Scaleway AI | API ключ | [връзка](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 млн. безплатни токена за нови акаунти — съответствие с изискванията на ЕС/GDPR (Париж), Qwen3 235B и Llama 70B | -| `sealion` | `sealion` | SEA-LION | API ключ | [връзка](https://sea-lion.ai) | Влезте в sea-lion.ai с Google (без карта и без регионални ограничения), създайте API ключ и след това го поставете тук. | -| `seekai` | `ska` | SeekAi | API ключ, агрегатор | [връзка](https://seekai.cc) | Създайте API ключ на https://seekai.cc, след което го поставете тук като Bearer токен. | -| `segmind` | `segmind` | Segmind | API ключ, изображение, видео | [връзка](https://segmind.com) | Използвайте своя Segmind API ключ в заглавката x-api-key. OmniRoute използва https://api.segmind.com/v1/ и връща директно байтовете на генерираното изображение/видео. | -| `sensenova` | `sensenova` | SenseNova | API ключ | [връзка](https://platform.sensenova.cn) | Вземете API ключ от platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | API ключ | [връзка](https://cloud.siliconflow.com) | $1 безплатен кредит плюс посочените в момента модели за $0 след потвърждаване на самоличността; наличността и ограниченията може да се променят | -| `snowflake` | `snowflake` | Snowflake Cortex | API ключ, корпоративен | [връзка](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API ключ | [връзка](https://xinghuo.xfyun.cn) | Вземете API ключ от console.xfyun.cn | -| `speka` | `speka` | Speka AI | API ключ, агрегатор | [връзка](https://speka.me) | Безплатен план: $1 месечно потребление, 10 RPM, един API ключ и достъп до отворени модели и тестовата среда; не се изисква карта. | -| `stability-ai` | `stability` | Stability AI | API ключ, изображение | [връзка](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API ключ | [връзка](https://stepfun.com) | Вземете API ключ от platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | API ключ | [връзка](https://ai.sumopod.com) | Използвайте своя SumoPod API ключ (sk-...) в Authorization: Bearer . Напълно съвместим с OpenAI. Базов URL адрес на API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API ключ | [връзка](https://suno.ai) | Поставете сесийната бисквитка от suno.ai (Clerk удостоверяване) | -| `synthetic` | `synthetic` | Synthetic | API ключ, агрегатор | [връзка](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API ключ, агрегатор | [връзка](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API ключ | [връзка](https://hunyuan.tencent.com) | Вземете API ключ от console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | API ключ, агрегатор | [връзка](https://theb.ai) | Bearer API ключ за съвместимия с OpenAI шлюз на TheB.AI. | -| `tinyfish` | `tf` | TinyFish Fetch | API ключ | [връзка](https://docs.tinyfish.ai/fetch-api) | X-API-Key от agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API ключ, видео | [връзка](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API ключ | [връзка](https://agent-router.gaib.ai) | Използвайте своя Token Kiosk API ключ в Authorization: Bearer . Напълно съвместим с OpenAI шлюз. Базов URL адрес на API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API ключ, агрегатор | [връзка](https://www.tokenreply.com) | Моделите с етикет „безплатни“ имат специфични за модела и кампанията дневни ограничения; не е публикувана фиксирана обща безплатна квота. | -| `tokenrouter` | `trk` | TokenRouter | API ключ | [връзка](https://tokenrouter.com) | Използвайте своя TokenRouter API ключ в Authorization: Bearer . Напълно съвместим с OpenAI. Базов URL адрес на API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API ключ, изображение | [връзка](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API ключ | [връзка](https://docs.opentyphoon.ai) | Безплатен API ключ с ограничение на скоростта от 5 заявки/сек. и 200 заявки/мин. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API ключ | [връзка](https://uncensored.com) | Използвайте своя API ключ за разработчици от uncensored.com (uai_sk_live_...). OmniRoute го изпраща като заглавката X-api-key към съвместимата с OpenAI крайна точка https://api.uncensored.com/api/v1. Ключът никога не изтича. Това е интерфейсът с таксуване според използването/кредитите; абонаментният чат без таксуване според използването е отделният доставчик 'uc'. | -| `udio` | `udio` | Udio | API ключ | [връзка](https://udio.com) | Поставете бисквитката за сесия от udio.com (удостоверяване чрез Supabase) | -| `unorouter` | `unorouter` | UnoRouter | API ключ, агрегатор | [връзка](https://unorouter.ai) | Моделите със суфикс :free не намаляват баланса; ограничението е 1 заявка/минута за всеки безплатен модел на потребител. | -| `upstage` | `upstage` | Upstage | API ключ | [връзка](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API ключ | [връзка](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API ключ | [връзка](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API ключ, агрегатор | [връзка](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API ключ, корпоративен | [връзка](https://cloud.google.com/vertex-ai) | Предоставете JSON за Service Account, OAuth токен за достъп, API ключ за Vertex Express или ключ за упълномощаване, обвързан със служебен акаунт. Режимът Express поддържа само Gemini; партньорските модели изискват идентификационни данни, обвързани с проект. | -| `vertex-partner` | `vp` | Vertex AI Partners | API ключ, корпоративен | [връзка](https://cloud.google.com/vertex-ai) | Предоставете JSON за Service Account или OAuth идентификационни данни. Ключ за упълномощаване, обвързан със служебен акаунт, също поддържа откриване, но изводът с партньорски модели допълнително изисква идентификатора на проекта в Google Cloud. Стандартните ключове за Express поддържат само Gemini. | -| `void-ai` | `void-ai` | Void AI | API ключ, агрегатор | [връзка](https://voidai.app) | Публичният каталог с модели отбелязва някои модели като изискващи безплатен план, но достъпът е условен и не е потвърдена числова квота. | -| `volcengine` | `volcengine` | Volcengine | API ключ | [връзка](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API ключ | [връзка](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Свържете своя акаунт във Volcano Engine или използвайте абонаментен API ключ за Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API ключ | [връзка](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Свържете своя акаунт във Volcano Engine или използвайте абонаментен API ключ за Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | API ключ, вграждане/преранжиране | [връзка](https://www.voyageai.com) | Bearer API ключ за API интерфейсите на Voyage AI за вграждания и преранжиране. | -| `wafer` | `wafer` | Wafer AI | API ключ | [връзка](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API ключ | [връзка](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API ключ, корпоративен | [връзка](https://www.ibm.com/products/watsonx-ai) | Използвайте своя watsonx bearer токен. Базовият URL адрес може да бъде https://.ml.cloud.ibm.com/ml/gateway/v1/ или самостоятелно управлявана крайна точка /ml/gateway/v1. | -| `writer` | `writer` | Writer | API ключ | [връзка](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API ключ | [връзка](https://x5lab.dev) | Използвайте своя X5Lab API ключ (x5-...) в Authorization: Bearer . Напълно съвместим с OpenAI. Базов URL адрес на API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API ключ | [връзка](https://x.ai) | Използвайте официален xAI API ключ или влезте чрез xAI OAuth. JWT сесиите на Grok Build остават отделен доставчик. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API ключ | [връзка](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API ключ | [връзка](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API ключ, агрегатор | [връзка](https://xkiro.com) | Създайте безплатен акаунт в xkiro.com и поставете ключа тук (Bearer; приема се и x-api-key). | -| `yi` | `yi` | Yi (01.AI) | API ключ | [връзка](https://01.ai) | Вземете API ключ от platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API ключ, агрегатор | [връзка](https://yolo-auto.com) | Безплатният API достъп е ограничен по брой заявки и е предназначен за тестване; не е публикувана числова дневна квота и не се обещава безплатният достъп да е безсрочен. | -| `zai` | `zai` | Z.AI | API ключ | [връзка](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API ключ | [връзка](https://zenmux.ai) | Използвайте своя ZenMux API ключ в Authorization: Bearer . ZenMux е напълно съвместим с OpenAI. Базов URL адрес: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API ключ, агрегатор | [връзка](https://www.zerolimitai.com) | Рекламира се временен безплатен пробен период, но официалните страници си противоречат дали е 3 или 7 дни; твърдението за 100 извиквания/ден не се приема за постоянно. | -| `zylo-api` | `zylo` | Zylo API | API ключ, агрегатор | [връзка](https://zyloai.net) | План Basic: 10 RPM, 7 200 заявки/ден и 200 000 токена/ден; ограничен до текстовите модели Basic. | +| ИД | Псевдоним | Име | Етикети | Уебсайт | Бележки | +| ------------------------ | --------------- | ------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API ключ | [връзка](https://ai.360.cn) | Получете API ключ от ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | API ключ, агрегатор | [връзка](https://agentrouter.org) | $200 безплатни кредита при регистрация — шлюз за маршрутизиране между множество модели | +| `agnes` | `agnes` | Agnes AI | API ключ, видео | [връзка](https://agnes-ai.com) | Получете API ключ от agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (Китай) | API ключ | [връзка](https://api.agnes-ai.cn) | Получете API ключ от китайския сайт на Agnes. | +| `ai21` | `ai21` | AI21 Labs | API ключ | [връзка](https://www.ai21.com) | $10 пробни кредита при регистрация (валидни 3 месеца), не се изисква кредитна карта | +| `aimlapi` | `aiml` | AI/ML API | API ключ, агрегатор | [връзка](https://aimlapi.com) | Безплатният план е спрян (2026) — AI/ML API вече работи само на принципа „плащане според потреблението“ (минимално зареждане от $20); няма периодично предоставяни безплатни кредити. | +| `ainative` | `ainative` | AINative Studio | API ключ | [връзка](https://ainative.studio) | Създайте безплатен API ключ в ainative.studio (без карта), след което го поставете тук като Bearer токен. | +| `aion` | `aion` | Aion Labs | API ключ | [връзка](https://www.aionlabs.ai) | Създайте безплатен API ключ в aionlabs.ai (без карта), след което го поставете тук като Bearer токен. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API ключ | [връзка](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Китай) | API ключ | [връзка](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API ключ | [връзка](https://developer.ant-ling.com/en/docs/) | Регистрирайте се и създайте API ключ в конзолата на Ant Ling API (https://chat.ant-ling.com/open), след което го поставете тук. OmniRoute маршрутизира трафика за чат към https://api.ant-ling.com/v1/chat/completions; доставчикът е съвместим с OpenAI и също предоставя интерфейс, съвместим с Anthropic. | +| `anthropic` | `anthropic` | Anthropic | API ключ | [връзка](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API ключ, агрегатор | [връзка](https://anyapi.ai) | Безплатен план: 100 000 ANY токена на ден и 100 RPM за отговарящите на условията модели Free/Basic; не се изисква кредитна карта. | +| `api-airforce` | `af` | Api.airforce | API ключ | [връзка](https://api.airforce) | 55 модела в безплатния план, включително Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | API ключ | [връзка](https://arcee.ai) | Получете API ключ от arcee.ai | +| `auriko` | `auriko` | Auriko | API ключ, агрегатор | [връзка](https://www.auriko.ai) | Безплатният план предлага 1 000 RPM за платформата и 10 000 RPM за BYOK. Изводът през платформата все пак включва разходите на доставчика; това не е набор от безплатни токени или неограничен безплатен извод. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API ключ, корпоративен | [връзка](https://learn.microsoft.com/azure/ai-foundry) | Използвайте своя ключ за Azure AI Foundry. Базовият URL адрес може да бъде https://.services.ai.azure.com/openai/v1/ или https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | API ключ, корпоративен | [връзка](https://azure.microsoft.com/products/ai-services/openai-service) | Използвайте своя API ключ за Azure OpenAI. Базовият URL адрес трябва да бъде крайната точка на вашия ресурс, например https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API ключ | [връзка](https://b.ai) | Bearer API ключ за съвместимия с OpenAI LLM шлюз на b.ai (различен от TheB.AI). Създайте ключ в https://docs.b.ai, след което използвайте https://api.b.ai/v1 като съвместим с OpenAI базов URL адрес. | +| `baichuan` | `baichuan` | Baichuan | API ключ | [връзка](https://www.baichuan-ai.com/) | Получете API ключ от platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | API ключ | [връзка](https://ernie.baidu.com/) | Получете API ключ от console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API ключ | [връзка](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API ключ | [връзка](https://baseten.co) | $30 безплатни пробни кредита за GPU извод | +| `bazaarlink` | `bzl` | BazaarLink | API ключ | [връзка](https://bazaarlink.ai) | Използвайте своя API ключ за BazaarLink (започва с sk-bl-) в Authorization: Bearer . OpenAI SDK работи с базов URL адрес https://bazaarlink.ai/api/v1. Моделите използват формат provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | API ключ, корпоративен | [връзка](https://aws.amazon.com/bedrock) | Използвайте своя API ключ за Amazon Bedrock и конфигурирайте AWS региона, в който са активирани моделите ви (например eu-west-2). OmniRoute извиква директно вградения Converse API на Bedrock. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API ключ, изображение | [връзка](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API ключ | [връзка](https://blackbox.ai) | ⚠️ **ОТТЕГЛЕН ОТ УПОТРЕБА.** api.blackbox.ai връща HTTP 404 при всеки вариант на пътя (проверка от 2026-08-21); публичният интерфейс за извод е преместен към защитената крайна точка enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | API ключ | [връзка](https://www.bluesminds.com) | Безплатни ежедневни pi кредити — поддържа над 200 модела, включително GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | API ключ | [връзка](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API ключ | [връзка](https://bytez.com) | $1 безплатни кредити, подновявани на всеки 4 седмици | +| `cerebras` | `cerebras` | Cerebras | API ключ | [връзка](https://inference.cerebras.ai) | Еднократен кредит от $5 при регистрация (валиден 30 дни); изисква се платежен метод. Това не е периодично подновяван безплатен план. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API ключ | [връзка](https://hyper.charm.land) | 100 безплатни месечни Hypercredits при регистрация | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API ключ, агрегатор | [връзка](https://api.oriper.com) | Официалните метаданни рекламират 2 млн. токена месечно, но публичният сайт и документацията бяха блокирани по време на одита; считайте квотата и съответствието с марката за непотвърдени. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API ключ, агрегатор | [връзка](https://chatanywhere.tech) | Само за лична, образователна или изследователска употреба: публичната документация посочва 10 000 точки/ден и 200 заявки/ден за IP/ключ; не използвайте за търговски трафик. | +| `cheaperinference` | `cinf` | Cheaper Inference | API ключ | [връзка](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API ключ | [връзка](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API ключ, агрегатор | [връзка](https://chutes.ai) | Bearer API ключ за съвместимия с OpenAI шлюз на Chutes. | +| `clarifai` | `clarifai` | Clarifai | API ключ, корпоративен | [връзка](https://docs.clarifai.com) | Използвайте своя Clarifai PAT или специфичен за приложението API ключ. OmniRoute използва съвместимата с OpenAI крайна точка на https://api.clarifai.com/v2/ext/openai/v1 и се удостоверява чрез Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API ключ, агрегатор | [връзка](https://cloudcode.one) | Публикуваните безплатни модели включват glm-4.7-flash и glm-4.6v-flash; не е публикувана числова квота и създаването на ключ може да изисква кредит или купон. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API ключ | [връзка](https://developers.cloudflare.com/workers-ai) | Изисква API токен И идентификатор на акаунта (намира се на dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API ключ | [връзка](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API ключ | [връзка](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API ключ | [връзка](https://cohere.com) | Безплатен пробен период: 1 000 API извиквания/месец за тестване, без да се изисква кредитна карта | +| `command-code` | `cmd` | Command Code | API ключ | [връзка](https://commandcode.ai/) | Използвайте API ключ на Command Code. Заявките се изпращат към крайната точка /provider/v1/chat/completions на Command Code. | +| `coze` | `coze` | Coze | API ключ | [връзка](https://coze.com) | Получете API ключ от coze.com/open/api | +| `crof` | `crof` | CrofAI | API ключ | [връзка](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API ключ | [връзка](https://cursor.com/dashboard/api) | Поставете потребителски API ключ за Cursor (crsr_...) от cursor.com/dashboard/api. OmniRoute го обменя при поискване за токен на сесията; не е необходимо да инсталирате IDE или cursor-agent. Използването се таксува към плана на Cursor, който притежава ключа. | +| `dahl` | `dahl` | Dahl | API ключ | [връзка](https://inference.dahl.global) | Щракнете върху „Add Account“, за да генерирате автоматично токен, или добавете ръчно API ключ. | +| `databricks` | `databricks` | Databricks | API ключ, корпоративен | [връзка](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API ключ, корпоративен | [връзка](https://docs.datarobot.com) | Използвайте своя DataRobot API токен. Незадължителният основен URL адрес може да бъде коренът на акаунта (за LLM Gateway) или URL адрес за внедряване под /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | API ключ, изображения | [връзка](https://deepai.org) | Използвайте своя DeepAI API ключ. Вземете такъв от deepai.org — изисква се абонамент Pro ($9.99/месец). | +| `deepinfra` | `deepinfra` | DeepInfra | API ключ | [връзка](https://deepinfra.com) | Безплатни кредити при регистрация за тестване на API и проучване на модели | +| `deepseek` | `ds` | DeepSeek | API ключ | [връзка](https://platform.deepseek.com) | 5 млн. безплатни токена при регистрация — не се изисква кредитна карта | +| `dgrid` | `dgrid` | DGrid | API ключ | [връзка](https://dgrid.ai) | Маршрутизатор за безплатни модели на DGrid: 10 заявки/минута и 100 заявки/ден. Еднократно зареждане на стойност $5 отключва до 20 заявки/минута и 1 000 заявки/ден. | +| `dify` | `dify` | Dify | API ключ | [връзка](https://dify.ai) | Получете API ключ от своята инстанция на Dify. | +| `digitalocean` | `digitalocean` | DigitalOcean | API ключ | [връзка](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API ключ | [връзка](https://dit.ai) | Използвайте своя dit.ai API ключ в Authorization: Bearer . Напълно съвместим с OpenAI — директен заместител, просто променете основния URL адрес на https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | API ключ | [връзка](https://doubao.com) | Получете API ключ от console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | API ключ, агрегатор | [връзка](https://www.dxnt.com) | Документираната квота за безплатни акаунти е 100 извиквания/ден; квотата може да се увеличи чрез покани и може да варира според акаунта. | +| `electronhub` | `electronhub` | Electron Hub | API ключ, агрегатор | [връзка](https://www.electronhub.ai) | Безплатен план: 5 RPM, $0.25 седмични кредити и 10 Neutrinos/ден за модели с :free; прилагат се и семейни бюджети. | +| `empower` | `empower` | Empower | API ключ, агрегатор | [връзка](https://docs.empower.dev) | Bearer API ключ за съвместимата с OpenAI крайна точка на Empower. | +| `eurouter` | `eurouter` | EURouter | API ключ, агрегатор | [връзка](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API ключ | [връзка](https://factory.ai) | Bearer API ключ за съвместимия с OpenAI шлюз на Factory. | +| `fal-ai` | `fal` | Fal.ai | API ключ, изображения | [връзка](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API ключ, агрегатор | [връзка](https://fastrouter.ai) | Моделите със суфикс :free позволяват 10 заявки/ден за организация и модел; наличността може да се променя. | +| `featherless-ai` | `featherless` | Featherless AI | API ключ | [връзка](https://featherless.ai) | Наличен е безплатен план — не се изисква кредитна карта | +| `fenayai` | `fenayai` | FenayAI | API ключ, агрегатор | [връзка](https://fenayai.com) | Bearer API ключ за съвместимия с OpenAI шлюз на FenayAI. | +| `fireworks` | `fireworks` | Fireworks AI | API ключ | [връзка](https://fireworks.ai) | $1 безплатни начални кредити при регистрация за тестване на API | +| `free-ai` | `free-ai` | Free.ai | API ключ, агрегатор | [връзка](https://free.ai) | 30 000 токена/ден покриват самостоятелно хоствани модели след потвърждение на имейл адреса. Използването над този лимит може да се таксува по себестойност, а премиум външните модели са платени. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API ключ | [връзка](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API ключ | [връзка](https://freebuff.com) | Въведете Freebuff / Codebuff Auth Token (получен чрез влизане през CLI или автоматизиран инструмент за извличане). | +| `freeinference` | `freeinference` | FreeInference | API ключ, агрегатор | [връзка](https://freeinference.org) | Безплатен достъп за изследователски цели без карта; кандидатите извън Harvard се нуждаят от ръчно одобрение и няма публично гарантирана числова квота. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API ключ | [връзка](https://freemodel.dev) | $300 безплатни кредити при регистрация — не се изисква кредитна карта. Достъп до GPT-5.4 и GPT-5.5 (най-новите водещи модели на OpenAI) чрез API, съвместим с OpenAI. | +| `freetheai` | `fta` | FreeTheAi | API ключ, агрегатор | [връзка](https://freetheai.xyz) | Присъединете се към Discord на FreeTheAi, за да получите своя безплатен API ключ. | +| `friendliai` | `friendli` | FriendliAI | API ключ | [връзка](https://friendli.ai) | Безплатно ниво за безсървърно изпълнение на изводи — не се изисква кредитна карта | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте ключ за член на g4f.dev (създайте такъв в g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте ключ за член на g4f.dev (създайте такъв в g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте ключ за член на g4f.dev (създайте такъв в g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте ключ за член на g4f.dev (създайте такъв в g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API ключ, агрегатор | [връзка](https://g4f.space) | Натрупайте анонимни cake кредити в g4f.dev/chat или използвайте ключ за член на g4f.dev (създайте такъв в g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API ключ | [връзка](https://galadriel.com) | ⚠️ **ОТТЕГЛЕНО ОТ УПОТРЕБА.** api.galadriel.ai вече не се разрешава (проверка от 2026-06-19); API за изпълнение на изводи изглежда е прекратен. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API ключ | [връзка](https://aistudio.google.com) | Чрез Google AI Studio се предлага безплатно ниво; прилагат се текущите квоти за отделните модели и регионалните ограничения | +| `getgoapi` | `ggo` | GoAPI | API ключ, агрегатор | [връзка](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API ключ | [връзка](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API ключ | [връзка](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Личен токен за достъп на GitLab за публичния API Code Suggestions. Конфигурирайте самостоятелно хостван базов URL, когато не използвате gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API ключ | [връзка](https://opengateway.gitlawb.com) | Безплатният MiMo (xiaomi/mimo-v2.5) е оттеглен през 2026-05 — Opengateway вече е кредитен портал с разплащане според потреблението; няма периодично достъпен безплатен модел. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API ключ | [връзка](https://opengateway.gitlawb.com) | Безплатната промоция за Nemotron приключи през 2026-06 — маршрутът през GMI Cloud вече е достъпен само с кредити и разплащане според потреблението. | +| `glm` | `glm` | GLM Coding | API ключ | [връзка](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Китай) | API ключ | [връзка](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API ключ | [връзка](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API ключ | [връзка](https://greenpt.com) | Създаването на API абонамент е безплатно; изпълнението на изводи се таксува на токен. Не е публикуван безплатен лимит за изпълнение на изводи. | +| `groq` | `groq` | Groq | API ключ | [връзка](https://groq.com) | Безплатен план: ограничения според модела (200K токена/ден за всеки чат модел; вижте console.groq.com/docs/rate-limits за RPM/RPD) — няма регистриран платежен метод. | +| `haiper` | `hp` | Haiper | API ключ, видео | [връзка](https://haiper.ai) | Получете API ключ от haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | API ключ | [връзка](https://api.hcnsec.cn) | Получете API ключ от api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | API ключ, агрегатор | [връзка](https://helixmind.online) | Разпространяваните по-рано твърдения за 3 RPM/50 RPD и липса на изискване за карта не бяха потвърдени при одита от 2026-08-02; текущата квота и таксуването изискват проверка на акаунта. | +| `helyxai` | `helyxai` | Helyx AI | API ключ, агрегатор | [връзка](https://helyxai.space) | Документацията за действащия безплатен план посочва 100 000 токена/ден; отделното маркетингово твърдение на сайта за над 2M си противоречи с това и не се счита за гаранция за квота. | +| `heroku` | `heroku` | Heroku AI | API ключ, корпоративен | [връзка](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API ключ | [връзка](https://huggingface.co) | Безплатен Inference API за хиляди модели (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API ключ | [връзка](https://hyperbolic.xyz) | $1-5 пробни кредити при регистрация за безсървърно изпълнение на изводи | +| `ideogram` | `ideo` | Ideogram | API ключ | [връзка](https://ideogram.ai) | Получете API ключ от ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | API ключ | [връзка](https://xinghuo.xfyun.cn) | Получете API ключ от console.xfyun.cn | +| `inception` | `inception` | Inception | API ключ | [връзка](https://docs.inceptionlabs.ai) | 10M безплатни токена при регистрация, без изискване за кредитна карта. | +| `inference-net` | `inet` | Inference.net | API ключ | [връзка](https://inference.net) | $25 безплатни кредити при регистрация, като са налични и грантове за изследователски цели | +| `internlm` | `internlm` | InternLM (Intern-S1) | API ключ | [връзка](https://internlm.intern-ai.org.cn/) | Безплатна месечна квота от около 1M входни / 3M изходни токена (около 10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API ключ, вграждане/преподреждане | [връзка](https://jina.ai) | Bearer API ключ за api.jina.ai — вграждане, преподреждане, класифициране, сегментиране и търсене. Ключовете от таблото за управление са с предимство пред JINA_AI_API_KEY. Това не е картата Reader / r.jina.ai и не извлича URL адреси. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API ключ | [връзка](https://jina.ai/reader) | Bearer API ключ за преобразуване на URL адреси в Markdown чрез r.jina.ai (само /v1/web/fetch). Не предоставя /v1/embeddings или /v1/rerank. Същият Jina токен като за Foundation API работи; OmniRoute използва повторно ключа за jina-ai от таблото за управление или JINA_AI_API_KEY, когато тази карта е празна. | +| `kenari` | `kenari` | Kenari | API ключ | [връзка](https://kenari.id) | Използвайте своя Kenari API ключ (kn-...) в Authorization: Bearer . Напълно съвместим с OpenAI. Основен URL адрес на API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API ключ | [връзка](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API ключ, агрегатор | [връзка](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (наследен Moonshot API) | API ключ | [връзка](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API ключ | [връзка](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API ключ | [връзка](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API ключ, агрегатор | [връзка](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API ключ, видео | [връзка](https://leonardo.ai) | Вземете API ключ от leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | API ключ | [връзка](https://liquid.ai) | Вземете API ключ от liquid.ai | +| `literouter` | `literouter` | LiteRouter | API ключ, агрегатор | [връзка](https://literouter.com) | Безплатните варианти на моделите използват суфикса :free; дневните кредитни лимити варират според модела, а безплатният вход е ограничен до 5 000 токена. | +| `llamagate` | `llamagate` | LlamaGate | API ключ | [връзка](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API ключ, агрегатор | [връзка](https://llm.kiwi) | Безплатният план предоставя auto и hrLLM; публикуваният лимит от 40 заявки/час се отнася за hrLLM. | +| `llm7` | `llm7` | LLM7.io | API ключ | [връзка](https://llm7.io) | Използвайте произволен непразен ключ (например 'unused'). Ако по-старите вградени модели връщат model_unavailable, използвайте Available Models → Import from /models или Auto-Sync; потвърден работещ модел: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API ключ, агрегатор | [връзка](https://llmgateway.io) | Хостван план Free: моделите с безплатна цена са ограничени до 5 заявки на 10 минути, когато акаунтът няма кредити. | +| `logfare` | `logfare` | Logfare | API ключ, агрегатор | [връзка](https://logfare.ai) | Създайте безплатен акаунт на https://logfare.ai/register (потребителско име/парола, без потвърждение по имейл), за да получите незабавно API ключ, след което го поставете тук като Bearer токен. | +| `longcat` | `lc` | LongCat AI | API ключ | [връзка](https://longcat.chat/platform/docs) | Безплатно: еднократно предоставяне на 10 млн. токена след регистрация на акаунт и KYC проверка (LongCat-2.0). Само еднократно — не е повтарящ се дневен/месечен лимит. | +| `magnific` | `freepik` | Magnific | API ключ, изображение | [връзка](https://www.magnific.com) | Вземете API ключ от magnific.com/user/api-keys (заглавка x-magnific-api-key). Наследените ключове за разработчици на Freepik продължават да работят. | +| `maritalk` | `maritalk` | Maritalk | API ключ | [връзка](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API ключ, агрегатор | [връзка](https://meganova.ai) | Безплатна регистрация без карта. Публикуваните квоти от ниво Tier 1 за отделните модели са общо 550 заявки/ден; те не са споделен глобален пул и може да се начислят такси за превишение, ако е активирано. | +| `meta-llama` | `meta` | Meta Llama API | API ключ | [връзка](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API ключ, видео | [връзка](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Китай) | API ключ | [връзка](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API ключ | [връзка](https://mistral.ai) | Безплатно ниво Experiment: достъп с ограничение на честотата до всички модели, без необходимост от кредитна карта | +| `mixedbread` | `mxbai` | Mixedbread AI | API ключ | [връзка](https://www.mixedbread.com) | Bearer API ключ за API за вграждане на Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | API ключ, агрегатор | [връзка](https://www.mixlayer.com) | Моделът qwen/qwen3.5-4b-free е безплатен за създаване на прототипи и е с ограничение на честотата; няма потвърден фиксиран публичен лимит за RPM или дневна квота. | +| `mnn-ai` | `mnn-ai` | MNN AI | API ключ, агрегатор | [връзка](https://mnnai.ru) | Безплатен план: месечни кредити от $1, 10 RPM и достъп само до модели, отбелязани като Free. | +| `modal` | `mdl` | Modal | API ключ, корпоративен | [връзка](https://modal.com/docs) | Използвайте Bearer токена, който защитава вашето внедряване в Modal, ако е активиран. Основният URL адрес трябва да сочи към вашето съвместимо с OpenAI приложение в Modal, например https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API ключ | [връзка](https://modelscope.cn) | Безплатно ниво чрез ModelScope API-Inference — изисква се акаунт в Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | API ключ | [връзка](https://monsterapi.ai) | ⚠️ **ОТТЕГЛЕНО.** Monster API прекрати дейността си на 2026-06-30. Използвайте алтернативни доставчици, съвместими с OpenAI. | +| `moonshot` | `moonshot` | Kimi | API ключ | [връзка](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API ключ | [връзка](https://morphllm.com) | Безплатно ниво: 250 хил. кредита/месец, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API ключ | [връзка](https://github.com/meta-llama/llama-stack) | Използвайте променливата на средата META_API_KEY като Bearer токен. Muse Code CLI използва формата за обмен на данни на OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API ключ, агрегатор | [връзка](https://naga.ac) | Вземете API ключ от naga.ac — налична е регистрация чрез Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | API ключ, агрегатор | [връзка](https://naga.ac) | Моделите, отбелязани с :free, са публично изброени, но няма потвърдена числова квота. Политиката на Naga предупреждава, че заявките и изходните данни от безплатното ниво може да бъдат събирани или използвани за обучение. | +| `nanogpt` | `nanogpt` | NanoGPT | API ключ | [връзка](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API ключ | [връзка](https://bynara.id) | Създайте безплатен акаунт в NaraRouter, свържете своя Telegram (задължително преди отговори от /v1), след което поставете ключа тук като Bearer токен. | +| `navy` | `navy` | NavyAI | API ключ | [връзка](https://api.navy) | Създайте безплатен API ключ от таблото за управление на NavyAI, след което го поставете тук като Bearer токен. | +| `nebius` | `nebius` | Nebius AI | API ключ | [връзка](https://nebius.com) | Пробни кредити на стойност ~$1 при регистрация за тестване на API | +| `nlpcloud` | `nlpc` | NLP Cloud | API ключ | [връзка](https://docs.nlpcloud.com) | Използвайте своя API ключ за NLP Cloud в Authorization: Token . По подразбиране OmniRoute използва крайната точка за чатбот на https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API ключ | [връзка](https://nomic.ai) | Вземете API ключ от atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | API ключ | [връзка](https://portal.nousresearch.com/help) | Използвайте своя API ключ за Nous Portal. OmniRoute използва официалната, съвместима с OpenAI крайна точка за инференция на https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API ключ, видео, агрегатор | [връзка](https://novita.ai) | Пробни кредити на стойност $0.50 при регистрация (валидни около 1 година) | +| `nscale` | `nscale` | nScale | API ключ | [връзка](https://nscale.com) | $5 безплатни кредити при регистрация за тестване на инференция | +| `nube` | `nube` | Nube.sh | API ключ | [връзка](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API ключ | [връзка](https://build.nvidia.com) | Безплатен достъп за разработчици: ~40 RPM, над 70 модела (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API ключ, корпоративен | [връзка](https://www.oracle.com/artificial-intelligence/generative-ai) | Използвайте своя API ключ за OCI Generative AI или IAM Bearer токен. Базовият URL може да бъде https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | API ключ, агрегатор | [връзка](https://ofox.ai) | Текущият каталог рекламира над 10 безплатни модела без публична числова квота; преди използване в продукционна среда прегледайте произхода от доставчиците нагоре по веригата, както и условията за съхранение и обучение. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API ключ | [връзка](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API ключ | [връзка](https://1min.ai) | Създайте API ключ на https://docs.1min.ai/docs/api/create-api-key, след което го поставете тук. | +| `openadapter` | `oad` | OpenAdapter | API ключ | [връзка](https://openadapter.dev) | Използвайте своя API ключ за OpenAdapter в Authorization: Bearer sk-cv-. Напълно съвместим с OpenAI. Базов URL на API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API ключ | [връзка](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API ключ | [връзка](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API ключ | [връзка](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API ключ | [връзка](https://openference.com) | Безплатно ниво: включва Qwen3.8 27b и Llama 3.2 3B — вижте openference.com/pricing за текущите условия | +| `openrouter` | `openrouter` | OpenRouter | API ключ, агрегатор | [връзка](https://openrouter.ai) | Безплатни модели на цена $0/токен със суфикс :free — 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API ключ | [връзка](https://openvecta.com) | Безплатни кредити при регистрация за съвместима с OpenAI инференция чрез LLM, вграждания и модели за разсъждение | +| `opper` | `opper` | Opper | API ключ, агрегатор | [връзка](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API ключ | [връзка](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API ключ | [връзка](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API ключ | [връзка](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API ключ | [връзка](https://www.perplexity.ai) | Използвайте своя API ключ за Perplexity. OmniRoute маршрутизира идентификаторите на моделите от Agent API през съвместимата с Responses крайна точка на Perplexity. | +| `piapi` | `pi` | PiAPI | API ключ, агрегатор | [връзка](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API ключ | [връзка](https://pioneer.ai) | $75 безплатни кредити за използване — не се изисква кредитна карта | +| `plamo` | `plamo` | PLaMo | API ключ | [връзка](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API ключ, агрегатор | [връзка](https://creator.poe.com/api-reference) | Bearer API ключ за съвместимия с OpenAI API на Poe. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API ключ, агрегатор | [връзка](https://poixe.com) | Текущите публични безплатни ограничения са малки и специфични за групата модели: 2 RPM/5 RPD за моделите large-cup и 20 RPM/50 RPD за моделите small-cup. | +| `pollinations` | `pol` | Pollinations AI | API ключ, видео | [връзка](https://pollinations.ai) | Анонимният достъп без ключ до документираните безплатни модели се предоставя без гаранция. Локалната проверка на v3.8.50 (2026-07-31) върна 401 през OmniRoute и Cloudflare 1010 при директни заявки към услугата нагоре по веригата от същата мрежа. Премиум моделите все още изискват API ключ за Pollinations от enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API ключ | [връзка](https://poolside.ai) | Laguna S 2.1 и XS 2.1 са безплатни по време на предварителния преглед; няма публикувана публична числова квота. | +| `predibase` | `predibase` | Predibase | API ключ | [връзка](https://predibase.com) | ⚠️ **ОТТЕГЛЕНО.** serving.app.predibase.com вече не се разрешава (проверка 2026-06-19); управляваният API за обслужване изглежда е преустановен. | +| `publicai` | `publicai` | PublicAI | API ключ | [връзка](https://publicai.co) | Изисква API ключ — еднократен кредит при регистрация, след което услугата е платена | +| `qianfan` | `qianfan` | Baidu Qianfan | API ключ | [връзка](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API ключ | [връзка](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API ключ | [връзка](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API ключ | [връзка](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API ключ, изображения | [връзка](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API ключ | [връзка](https://regolo.ai) | Вземете своя API ключ за Regolo от regolo.ai, след което го поставете тук като Bearer токен. | +| `reka` | `reka` | Reka | API ключ | [връзка](https://docs.reka.ai/chat/overview) | Използвайте своя API ключ за Reka. OmniRoute поддържа съвместимия с OpenAI базов URL https://api.reka.ai/v1 и изпраща както заглавката Authorization, така и X-Api-Key за съвместимост. | +| `requesty` | `requesty` | Requesty | API ключ | [връзка](https://requesty.ai) | Безплатен план с ~200 заявки на ден — шлюз за маршрутизиране между множество модели (над 300 модела) | +| `routeway` | `routeway` | Routeway | API ключ | [връзка](https://routeway.ai) | Създайте безплатен API ключ в routeway.ai, след което го поставете тук като Bearer токен. | +| `runwayml` | `runway` | Runway | API ключ, видео | [връзка](https://docs.dev.runwayml.com) | Използвайте своя API ключ за Runway в Authorization: Bearer . OmniRoute използва текущия API на Runway на адрес https://api.dev.runwayml.com/v1 и автоматично изпраща задължителната заглавка X-Runway-Version. | +| `sambanova` | `samba` | SambaNova | API ключ | [връзка](https://sambanova.ai) | $5 безплатни кредити при регистрация (валидни 30 дни), не се изисква кредитна карта | +| `sap` | `sap` | SAP Generative AI Hub | API ключ, корпоративна среда | [връзка](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Използвайте своя Bearer токен за SAP AI Core. Базовият URL може да бъде кореновият адрес на AI_API_URL или deploymentUrl от Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | API ключ | [връзка](https://docs.sarvam.ai) | ₹1 000 безплатни кредита при регистрация — никога не изтичат | +| `scaleway` | `scw` | Scaleway AI | API ключ | [връзка](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 млн. безплатни токена за нови акаунти — съвместимост с ЕС/GDPR (Париж), Qwen3 235B и Llama 70B | +| `sealion` | `sealion` | SEA-LION | API ключ | [връзка](https://sea-lion.ai) | Влезте в sea-lion.ai с Google (без карта и без регионални ограничения), създайте API ключ, след което го поставете тук. | +| `seekai` | `ska` | SeekAi | API ключ, агрегатор | [връзка](https://seekai.cc) | Създайте API ключ на https://seekai.cc, след което го поставете тук като Bearer токен. | +| `segmind` | `segmind` | Segmind | API ключ, изображения, видео | [връзка](https://segmind.com) | Използвайте своя API ключ за Segmind в заглавката x-api-key. OmniRoute използва https://api.segmind.com/v1/ и връща директно байтовете на генерираното изображение/видео. | +| `sensenova` | `sensenova` | SenseNova | API ключ | [връзка](https://platform.sensenova.cn) | Вземете API ключ от platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | API ключ | [връзка](https://cloud.siliconflow.com) | $1 безплатни кредити плюс посочените в момента модели за $0 след потвърждаване на самоличността; наличността и ограниченията може да се променят | +| `snowflake` | `snowflake` | Snowflake Cortex | API ключ, корпоративна среда | [връзка](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API ключ | [връзка](https://xinghuo.xfyun.cn) | Вземете API ключ от console.xfyun.cn | +| `speka` | `speka` | Speka AI | API ключ, агрегатор | [връзка](https://speka.me) | Безплатен план: $1 месечно потребление, 10 RPM, един API ключ и достъп до отворени модели и средата за експериментиране; не се изисква карта. | +| `stability-ai` | `stability` | Stability AI | API ключ, изображения | [връзка](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API ключ | [връзка](https://stepfun.com) | Вземете API ключ от platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | API ключ | [връзка](https://ai.sumopod.com) | Използвайте своя API ключ за SumoPod (sk-...) в Authorization: Bearer . Напълно съвместим с OpenAI. Базов URL на API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API ключ | [връзка](https://suno.ai) | Поставете бисквитката за сесия от suno.ai (Clerk удостоверяване) | +| `synthetic` | `synthetic` | Synthetic | API ключ, агрегатор | [връзка](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API ключ, агрегатор | [връзка](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API ключ | [връзка](https://hunyuan.tencent.com) | Вземете API ключ от console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | API ключ, агрегатор | [връзка](https://theb.ai) | Bearer API ключ за съвместимия с OpenAI шлюз на TheB.AI. | +| `tinyfish` | `tf` | TinyFish Fetch | API ключ | [връзка](https://docs.tinyfish.ai/fetch-api) | X-API-Key от agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API ключ, видео | [връзка](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API ключ | [връзка](https://agent-router.gaib.ai) | Използвайте своя API ключ за Token Kiosk в Authorization: Bearer . Напълно съвместим с OpenAI шлюз. Базов URL на API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API ключ, агрегатор | [връзка](https://www.tokenreply.com) | Моделите, обозначени като безплатни, имат специфични за модела и кампанията дневни ограничения; не е публикувана фиксирана обща безплатна квота. | +| `tokenrouter` | `trk` | TokenRouter | API ключ | [връзка](https://tokenrouter.com) | Използвайте своя API ключ за TokenRouter в Authorization: Bearer . Напълно съвместим с OpenAI. Базов URL на API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API ключ, изображения | [връзка](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API ключ | [връзка](https://docs.opentyphoon.ai) | Безплатен API ключ с ограничение на скоростта от 5 заявки/сек. и 200 заявки/мин. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API ключ | [връзка](https://uncensored.com) | Използвайте своя Developer API ключ от uncensored.com (uai_sk_live_...). OmniRoute го изпраща като заглавка X-api-key към съвместимата с OpenAI крайна точка https://api.uncensored.com/api/v1. Ключът никога не изтича. Това е интерфейсът с таксуване според използването/кредити; абонаментният чат без таксуване според използването е отделният доставчик 'uc'. | +| `udio` | `udio` | Udio | API ключ | [връзка](https://udio.com) | Поставете бисквитката за сесия от udio.com (Supabase удостоверяване) | +| `unorouter` | `unorouter` | UnoRouter | API ключ, агрегатор | [връзка](https://unorouter.ai) | Моделите със суфикс :free не намаляват баланса; ограничението е 1 заявка/минута за всеки безплатен модел на потребител. | +| `upstage` | `upstage` | Upstage | API ключ | [връзка](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API ключ | [връзка](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API ключ | [връзка](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API ключ, агрегатор | [връзка](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API ключ, корпоративен | [връзка](https://cloud.google.com/vertex-ai) | Предоставете JSON за служебен акаунт, OAuth токен за достъп, Vertex Express API ключ или ключ за оторизация, обвързан със служебен акаунт. Експресният режим поддържа само Gemini; партньорските модели изискват идентификационни данни, ограничени до проект. | +| `vertex-partner` | `vp` | Vertex AI Partners | API ключ, корпоративен | [връзка](https://cloud.google.com/vertex-ai) | Предоставете JSON за служебен акаунт или OAuth идентификационни данни. Ключ за оторизация, обвързан със служебен акаунт, също поддържа откриване, но извеждането чрез партньорски модели допълнително изисква идентификатора на съответния Google Cloud проект. Стандартните Express ключове поддържат само Gemini. | +| `void-ai` | `void-ai` | Void AI | API ключ, агрегатор | [връзка](https://voidai.app) | Публичният каталог с модели обозначава някои модели като изискващи безплатен план, но достъпът е условен и няма потвърдена числова квота. | +| `volcengine` | `volcengine` | Volcengine | API ключ | [връзка](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API ключ | [връзка](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Свържете своя акаунт във Volcano Engine или използвайте API ключ за абонамент за Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API ключ | [връзка](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Свържете своя акаунт във Volcano Engine или използвайте API ключ за абонамент за Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | API ключ, векторни представяния/преранжиране | [връзка](https://www.voyageai.com) | Bearer API ключ за API интерфейсите на Voyage AI за векторни представяния и преранжиране. | +| `wafer` | `wafer` | Wafer AI | API ключ | [връзка](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API ключ | [връзка](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API ключ, корпоративен | [връзка](https://www.ibm.com/products/watsonx-ai) | Използвайте своя watsonx bearer токен. Базовият URL може да бъде https://.ml.cloud.ibm.com/ml/gateway/v1/ или самостоятелно управлявана крайна точка /ml/gateway/v1. | +| `writer` | `writer` | Writer | API ключ | [връзка](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API ключ | [връзка](https://x5lab.dev) | Използвайте своя X5Lab API ключ (x5-...) в Authorization: Bearer . Напълно съвместим с OpenAI. Базов URL на API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API ключ | [връзка](https://x.ai) | Използвайте официален xAI API ключ или влезте чрез xAI OAuth. Grok Build JWT сесиите остават отделен доставчик. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API ключ | [връзка](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API ключ | [връзка](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API ключ, агрегатор | [връзка](https://xkiro.com) | Създайте безплатен акаунт в xkiro.com и поставете ключа тук (Bearer; приема се и x-api-key). | +| `yi` | `yi` | Yi (01.AI) | API ключ | [връзка](https://01.ai) | Получете API ключ от platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API ключ, агрегатор | [връзка](https://yolo-auto.com) | Безплатният API достъп е ограничен по брой заявки и е предназначен за тестване; не е публикувана числова дневна квота и не е обещано, че безплатният достъп ще бъде наличен за неопределено време. | +| `zai` | `zai` | Z.AI | API ключ | [връзка](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API ключ | [връзка](https://zenmux.ai) | Използвайте своя ZenMux API ключ в Authorization: Bearer . ZenMux е напълно съвместим с OpenAI. Базов URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API ключ, агрегатор | [връзка](https://www.zerolimitai.com) | Рекламира се временен безплатен пробен период, но официалните страници си противоречат дали той е 3, или 7 дни; твърдението за 100 извиквания/ден не се приема като постоянно. | +| `zylo-api` | `zylo` | Zylo API | API ключ, агрегатор | [връзка](https://zyloai.net) | Основен план: 10 RPM, 7 200 заявки/ден и 200 000 токена/ден; ограничен до основните текстови модели. | ## Локални доставчици (14) diff --git a/docs/i18n/bg/docs/routing/REASONING_REPLAY.md b/docs/i18n/bg/docs/routing/REASONING_REPLAY.md index 9057aec041d6..a5bd95967c15 100644 --- a/docs/i18n/bg/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/bg/docs/routing/REASONING_REPLAY.md @@ -25,19 +25,21 @@ OmniRoute прихваща `reasoning_content`, генерирано от аси Ход N (асистентът генерира): → отговорът съдържа reasoning_content + tool_calls → ако requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - записва (в паметта + БД), с ключ всяко tool_call.id - → препраща отговора към клиента (който може да запази или да не запази разсъжденията) + записва (в паметта + БД), индексирано по всеки tool_call.id + → препраща отговора към клиента (който може да запази или да не запази reasoning) Ход N+1 (клиентът изпраща последваща заявка): - → транслаторът открива: requiresReasoningReplay(provider, model) === true - → за всяко съобщение на асистента с tool_calls и без reasoning_content: + → преобразувателят открива: requiresReasoningReplay(provider, model) === true + → за всяко съобщение от асистента с tool_calls и без reasoning_content: lookupReasoning(toolCalls[0].id) → памет → БД - попадение → msg.reasoning_content = cached; recordReplay() - пропуск → msg.reasoning_content = "" (наследен резервен вариант за по-стари версии на DeepSeek) - → услугата нагоре по веригата получава съгласувана история → без 400 + намерено → msg.reasoning_content = cached; recordReplay() + не е намерено → msg.reasoning_content = "" (резервен вариант за съвместимост с по-стари версии на DeepSeek) + → услугата нагоре по веригата получава съгласувана хронология → няма грешка 400 ``` -Прихващането се извършва в `open-sse/handlers/chatCore.ts` (на две места, при двете извиквания на `cacheReasoningFromAssistantMessage`). Възпроизвеждането се извършва в `open-sse/translator/index.ts` след привеждането към схемата, но преди изпращането. +Прихващането се извършва в `open-sse/handlers/chatCore.ts` (на две места — при двете извиквания на `cacheReasoningFromAssistantMessage`). Повторното подаване се извършва в `open-sse/translator/index.ts` след привеждането към схемата, но преди изпращането. + +Обикновените ходове на асистента (без извиквания на инструменти) се индексират по различен начин: `buildAssistantMessageCacheKey()` изчислява дайджест от обхвата на сесията и нормализирания препис във формат OpenAI до съответния ход включително, тъй като DeepSeek изисква разсъжденията от _всеки_ предходен ход, щом присъства `tools`. При цели на Responses API (например `opencode-go/deepseek-v4-flash`, маршрутизирани към `/responses`) тялото на заявката към услугата нагоре по веригата съдържа `input`, а не `messages`, затова `translateRequest()` (`open-sse/translator/index.ts`) подава чрез опция за обратно извикване основния препис, от който е изчислил дайджест, а местата за прихващане изчисляват дайджест от същия препис. Етапът за повторно подаване на Responses се изпълнява върху основното представяне на OpenAI за всеки формат на източника, така че повторно се подават и клиентите на Anthropic Messages (Claude → OpenAI → Responses). ## Съхранение — хибридно в паметта + SQLite diff --git a/docs/i18n/bg/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/bg/docs/security/SOCKET_DEV_FINDINGS.md index b1db5c218858..de81babea9dc 100644 --- a/docs/i18n/bg/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/bg/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- -Този документ е декларацията, изготвена от поддържащия проекта, относно шестте -констатации за `AI-detected potential malware`, повдигнати срещу `omniroute@3.8.5`, и +> **Бележка за обхвата:** `socket.yml` конфигурира извършваното от Socket.dev сканиране от страна на регистъра след публикуване на npm артефакта (ignore-paths за съдържание, което не се разпространява, като `tests/`, `docs/` и отчети от компилации). Той не конфигурира блокираща проверка при сливане чрез CI/PR — нито работен процес в `.github/workflows`, нито скрипт в `package.json`, нито цел в `Makefile` извиква Socket.dev. + +Този документ представлява удостоверение от поддържащия проекта за шестте +констатации `AI-detected potential malware`, отчетени за `omniroute@3.8.5`, и мерките за ограничаване, приложени в `omniroute@3.8.6`. Той съществува, за да: -1. Операторите на конвейери за сигурност разполагат с единен източник, който да цитират, когато трябва +1. Операторите на процеси за сигурност разполагат с единен източник, който да цитират, когато трябва да оценят констатациите спрямо действителния изходен код. 2. Бъдещите AI скенери могат да разпознаят подписаното от поддържащия проекта твърдение, че всеки - маркиран път е преднамерен, активира се по избор и е документиран. -3. Разполагаме с писмен запис _защо_ всяко място на извикване е структурирано по този начин — - така че бъдещо рефакториране да не въведе отново по невнимание отпечатък, който + маркиран път е преднамерен, използва се само при изрично активиране и е документиран. +3. Разполагаме с писмен запис _защо_ всяко място на извикване е оформено по този начин — + така че бъдещо преработване да не въведе отново по невнимание характерен модел, който умишлено е бил премахнат. -Ако управлявате скенер, който отново маркира някое от местата на извикване по-долу, след като -мерките за ограничаване във v3.8.6 бъдат публикувани, моля, отворете issue с проследяването от сканирането и -ние ще разширим декларацията тук. +Ако използвате скенер, който отново маркира някое от местата на извикване по-долу след +публикуването на мерките за ограничаване във v3.8.6, моля, отворете issue с трасето от сканирането и +ние ще разширим удостоверението тук. --- diff --git a/docs/i18n/bn/README.md b/docs/i18n/bn/README.md index 190318594508..f116c6f8dfa5 100644 --- a/docs/i18n/bn/README.md +++ b/docs/i18n/bn/README.md @@ -23,13 +23,13 @@
-> হাতে হাতে ফ্রি টিয়ারগুলো একত্র করা কষ্টকর — ডজনখানেক SDK, ডজনখানেক রেট লিমিট, আর আসলে আপনার কাছে কতটা আছে সে সম্পর্কে কোনো ধারণাই থাকে না। OmniRoute **পুনরাবৃত্ত 35টি পুল কী জুড়ে 491টি ফ্রি-টিয়ার এন্ট্রি** তালিকাভুক্ত করে এবং **প্রকাশিত ধনাত্মক মাসিক বাজেটসহ 17টি পুল ও মডেলপ্রতি পাঁচটি Groq সীমা** থেকে টোকেনের প্রধান সংখ্যাটি গণনা করে, যেখানে শেয়ার করা পুল অনুযায়ী ডিডুপ্লিকেট করা হয়। যেসব কোটা শুধু আঞ্চলিক পরিচয় যাচাইয়ের পর পাওয়া যায় (বর্তমানে: ModelScope), সেগুলো আলাদাভাবে দেখানো হয়—আঞ্চলিক পরিচয় যাচাইয়ের পেছনে +~6M—এবং কখনোই প্রধান সংখ্যার সঙ্গে যোগ করা হয় না। ফলাফলটি ড্যাশবোর্ডে (`/dashboard/free-tiers`) দৃশ্যমান থাকে। +> হাতে হাতে ফ্রি টিয়ার একত্র করা কষ্টসাধ্য — ডজনখানেক SDK, ডজনখানেক রেট লিমিট, আর আপনার কাছে আসলে কতটা আছে সে সম্পর্কে কোনো ধারণাই থাকে না। OmniRoute **35টি পুনরাবৃত্ত পুল কী জুড়ে 489টি ফ্রি-টিয়ার এন্ট্রি** তালিকাভুক্ত করে এবং **প্রকাশিত ধনাত্মক মাসিক বাজেটসহ 17টি পুল ও প্রতি-মডেলে পাঁচটি Groq ক্যাপ** থেকে টোকেনের মূল সংখ্যাটি গণনা করে, যেখানে শেয়ার্ড পুল অনুযায়ী ডিডুপ্লিকেট করা হয়। যেসব কোটা কেবল আঞ্চলিক পরিচয় যাচাইয়ের পর চালু হয় (বর্তমানে: ModelScope), সেগুলো আলাদাভাবে দেখানো হয়—আঞ্চলিক পরিচয় যাচাইয়ের পেছনে +~6M—এবং কখনোই মূল সংখ্যার সঙ্গে যোগ করা হয় না। ফলাফলটি ড্যাশবোর্ডে (`/dashboard/free-tiers`) দৃশ্যমান থাকে। -OmniRoute ফ্রি-টিয়ার বাজেট কার্ড: নিয়মিত প্রতি মাসে ~1.62B বিনামূল্যের টোকেন, সাইনআপ ক্রেডিটসহ প্রথম মাসে সর্বোচ্চ ~2.22B, একটি এন্ডপয়েন্টের পেছনে 491টি তালিকাভুক্ত ফ্রি-টিয়ার এন্ট্রি কভার করা নথিভুক্ত 35টি পুনরাবৃত্ত পুল কী থেকে। স্বচ্ছ, পুল-ডিডুপ্লিকেট করা হিসাব — প্রতিটি শেয়ার করা পুল শুধু একবার গণনা করা হয়েছে, যার মধ্যে প্রকাশিত ধনাত্মক মাসিক টোকেন বাজেটসহ 17টি পুনরাবৃত্ত পুল এবং মডেলপ্রতি পাঁচটি Groq সীমা রয়েছে; শর্তাবলি-ঝুঁকি ক্যাটালগে 13টি প্রদানকারীকে এড়িয়ে চলার জন্য চিহ্নিত করা হয়েছে, যাতে সিদ্ধান্ত আপনি নিতে পারেন। বাজেট বারে রয়েছে Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (মডেলপ্রতি পাঁচটি সীমা) এবং আরও ছোট পুল; পাশাপাশি প্রথম মাসের সাইনআপ ক্রেডিট ও স্থায়ীভাবে বিনামূল্যের, টোকেন-সীমাবিহীন প্রদানকারীদের আলাদাভাবে দেখানো হয়েছে, যাতে সেগুলো কখনোই প্রধান সংখ্যাকে কৃত্রিমভাবে বাড়িয়ে না দেয়। /dashboard/free-tiers-এ ব্যবহৃত/অবশিষ্ট পরিমাণ লাইভ দেখুন। +OmniRoute ফ্রি-টিয়ার বাজেট কার্ড: নিয়মিতভাবে প্রতি মাসে ~1.62B বিনামূল্যের টোকেন, সাইনআপ ক্রেডিটসহ প্রথম মাসে সর্বোচ্চ ~2.22B, একটি এন্ডপয়েন্টের পেছনে 489টি তালিকাভুক্ত ফ্রি-টিয়ার এন্ট্রি কভার করা 35টি নথিভুক্ত পুনরাবৃত্ত পুল কী থেকে। স্বচ্ছ পুল-ডিডুপ্লিকেটেড হিসাব — প্রতিটি শেয়ার্ড পুল একবার গণনা করা হয়েছে, যার মধ্যে প্রকাশিত ধনাত্মক মাসিক টোকেন বাজেটসহ 17টি পুনরাবৃত্ত পুল এবং প্রতি-মডেলে পাঁচটি Groq ক্যাপ রয়েছে; শর্তাবলির ঝুঁকি-তালিকায় 13টি প্রদানকারীকে এড়িয়ে চলার জন্য চিহ্নিত করা হয়েছে, তাই সিদ্ধান্ত আপনার। বাজেট বারে রয়েছে Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (প্রতি-মডেলে পাঁচটি ক্যাপ) এবং ছোট পুলগুলো; পাশাপাশি প্রথম মাসের সাইনআপ ক্রেডিট ও স্থায়ীভাবে বিনামূল্যের টোকেন-ক্যাপবিহীন প্রদানকারীদের আলাদাভাবে দেখানো হয়েছে, যাতে তারা কখনোই মূল সংখ্যাকে বাড়িয়ে না দেখায়। /dashboard/free-tiers-এ ব্যবহৃত/অবশিষ্ট পরিমাণ সরাসরি দেখুন। -> লাইভ `/dashboard/free-tiers` পৃষ্ঠার অ্যানিমেটেড সারসংক্ষেপ। সম্পূর্ণ পদ্ধতি (পুল ডিডুপ্লিকেশন, ক্রেডিট টিয়ার, প্রদানকারীর শর্তাবলি): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**। +> সরাসরি `/dashboard/free-tiers` পৃষ্ঠার অ্যানিমেটেড সারসংক্ষেপ। সম্পূর্ণ পদ্ধতি (পুল ডিডুপ্লিকেশন, ক্রেডিট টিয়ার, প্রদানকারীর শর্তাবলি): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**। > -> লাইভ ক্যাটালগের সঙ্গে মিলিয়ে এই পরিসংখ্যানগুলো প্রতি দুই সপ্তাহে পুনরায় নিরীক্ষা করা হয় এবং এগুলো **দুই দিকেই পরিবর্তিত হয়** — কোনো প্রদানকারী একটি ফ্রি টিয়ার বন্ধ করলে সংখ্যাটি কমে যায়; নতুন কোনোটি যুক্ত হলে তা বাড়ে। ক্যাটালগ বাস্তবে যা গণনা করে, আমরা সেটিই প্রকাশ করি—কখনোই ঊর্ধ্বমুখী রাউন্ড করা সর্বোত্তম সম্ভাব্য সংখ্যা নয়। +> এই পরিসংখ্যানগুলো প্রতি দুই সপ্তাহে সরাসরি ক্যাটালগের সঙ্গে পুনরায় নিরীক্ষা করা হয় এবং **দুই দিকেই পরিবর্তিত হয়** — কোনো প্রদানকারী একটি ফ্রি টিয়ার বন্ধ করলে সংখ্যাটি কমে যায়; নতুন একটি যুক্ত হলে তা বাড়ে। ক্যাটালগ প্রকৃতপক্ষে যা গণনা করে, আমরা সেটিই প্রকাশ করি—কখনোই ঊর্ধ্বমুখী রাউন্ড করা সর্বোত্তম সম্ভাব্য সংখ্যা নয়।
@@ -37,7 +37,7 @@

-⭐ OMNIROUTE যদি আপনার অর্থ সাশ্রয় করতে এবং কাজ সহজ করতে সাহায্য করে থাকে, তাহলে রিপোজিটরিতে একটি স্টার দিন। +⭐ OMNIROUTE যদি আপনার অর্থ সাশ্রয় করতে এবং কাজ সহজ করতে সাহায্য করে থাকে, তাহলে রিপোজিটরিতে স্টার দিন।

@@ -55,11 +55,11 @@ [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![WhatsApp Global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) -[![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) +[![WhatsApp গ্লোবাল](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp ব্রাজিল](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![ওয়েবসাইট](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**প্রশ্ন, প্রদানকারী-সংক্রান্ত পরামর্শ, রোডম্যাপ ও সহায়তা → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [পোর্টাল](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**প্রশ্ন, প্রদানকারী-সংক্রান্ত পরামর্শ, রোডম্যাপ ও সহায়তা → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 গ্লোবাল](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 ব্রাজিল](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [পোর্টাল](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -592,7 +592,7 @@ Radar ব্যবহার ঐচ্ছিক এবং এটি কেবল ## 🤖 সামঞ্জস্যপূর্ণ CLI ও কোডিং এজেন্ট -> একটি কনফিগ — `http://localhost:20128/v1` — আর **প্রতিটি** AI IDE বা CLI বিনামূল্যের ও স্বল্পমূল্যের মডেলে চলে। +> একটি কনফিগ — `http://localhost:20128/v1` — এবং **প্রতিটি** AI IDE বা CLI বিনামূল্যের ও কম খরচের মডেলে চলে।
@@ -626,13 +626,13 @@ Radar ব্যবহার ঐচ্ছিক এবং এটি কেবল - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ এগুলোর সঙ্গেও কাজ করে · Kiro · Command Code · Antigravity · Windsurf · AMP · যেকোনো OpenAI-সামঞ্জস্যপূর্ণ টুল ++ এগুলোর সঙ্গেও কাজ করে · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · যেকোনো OpenAI-সামঞ্জস্যপূর্ণ টুল
📖 সব 36টি টুলের জন্য পৃথক সেটআপ (26টি CLI Code + 10টি CLI Agent) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode প্লাগইন → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) @@ -642,7 +642,7 @@ Radar ব্যবহার ঐচ্ছিক এবং এটি কেবল
**একটি কমান্ডেই OmniRoute-এর মাধ্যমে সমর্থিত যেকোনো CLI চালু করুন** — কোনো কনফিগ ফাইল লেখা হয় না, -প্রতিটি প্রসেসে আলাদাভাবে ক্রেডেনশিয়াল ইনজেক্ট করা হয়, আর Qwen/Gemini একটি অস্থায়ী বিচ্ছিন্ন হোম পায়: +প্রতিটি প্রসেসে আলাদাভাবে ক্রেডেনশিয়াল ইনজেক্ট করা হয়, Qwen/Gemini একটি অস্থায়ী বিচ্ছিন্ন হোম পায়: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,13 +653,13 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# অথবা ইন্টার্যাক্টিভভাবে প্রোভাইডার+মডেল বেছে নিয়ে টুলটির নিজস্ব কনফিগ লিখুন: -omniroute configure codex # আরও আছে: claude opencode qwen aider goose gemini cline continue kilo +# অথবা ইন্টার্যাক্টিভভাবে provider+model বেছে নিয়ে টুলটির নিজস্ব কনফিগ লিখুন: +omniroute configure codex # আরও রয়েছে: claude opencode qwen aider goose gemini cline continue kilo ``` প্রতিটি কমান্ড সক্রিয় রিমোট কনটেক্সট (`omniroute connect `) অনুসরণ করে, `--dry-run` -এক্সিকিউট না করেই সঠিক env/args-এর প্রিভিউ দেখায়, এবং `--api-key-env NAME` আপনার শেল হিস্ট্রি থেকে সিক্রেটগুলো -বাইরে রাখে। → [CLI ইন্টিগ্রেশন](docs/guides/CLI-INTEGRATIONS.md) +কার্যকর না করেই সঠিক env/args-এর প্রিভিউ দেখায়, এবং `--api-key-env NAME` আপনার shell history থেকে +গোপন তথ্য দূরে রাখে। → [CLI ইন্টিগ্রেশন](docs/guides/CLI-INTEGRATIONS.md)
@@ -669,7 +669,7 @@ omniroute configure codex # আরও আছে: claude opencode qwen a -> ক্যানোনিক্যাল চ্যাট, মিডিয়া, সার্চ, লোকাল, ক্লাউড-এজেন্ট ও সিস্টেম সংগ্রহজুড়ে **357টি নিবন্ধিত প্রদানকারী**, যার মধ্যে **152টির ডিসকভারি মেটাডেটায় `hasFree: true` রয়েছে**। চ্যাট মডেল রেজিস্ট্রিতে রয়েছে **229টি প্রদানকারী / 2,554টি স্বতন্ত্র প্রদানকারী-মডেল জোড়া / 1,283টি অপরিশোধিত মডেল ID**; পৃথক ফ্রি-বাজেট ক্যাটালগে রয়েছে **প্রতি-মডেলের 491টি সারি**, **35টি পুনরাবৃত্ত পুল** এবং **54টি পুনরাবৃত্ত/কীবিহীন চিরস্থায়ী বিনামূল্যের প্রদানকারী**। পরিকল্পিতভাবেই এগুলোর হর ভিন্ন; সংজ্ঞা এবং পুল-ডিডুপ্লিকেট করা গণনা [প্রদানকারী রেফারেন্স](docs/reference/PROVIDER_REFERENCE.md) ও [বিনামূল্যের স্তরসমূহ](docs/reference/FREE_TIERS.md)-এ রয়েছে। +> ক্যানোনিকাল চ্যাট, মিডিয়া, সার্চ, লোকাল, ক্লাউড-এজেন্ট ও সিস্টেম সংগ্রহজুড়ে **357টি নিবন্ধিত প্রদানকারী**, যার মধ্যে **152টির ডিসকভারি মেটাডেটায় `hasFree: true` রয়েছে**। চ্যাট মডেল রেজিস্ট্রিতে রয়েছে **229টি প্রদানকারী / 2,554টি স্বতন্ত্র প্রদানকারী-মডেল জোড়া / 1,283টি অপরিশোধিত মডেল ID**; পৃথক বিনামূল্যের বাজেট ক্যাটালগে রয়েছে **প্রতি-মডেলের 491টি সারি**, **35টি পুনরাবৃত্ত পুল** এবং **54টি পুনরাবৃত্ত/কীবিহীন চিরস্থায়ী-বিনামূল্যের প্রদানকারী**। নকশাগতভাবেই এগুলোর হর আলাদা; সংজ্ঞা ও পুল-ডিডুপ্লিকেটেড হিসাব [প্রদানকারী রেফারেন্স](docs/reference/PROVIDER_REFERENCE.md) এবং [বিনামূল্যের স্তরসমূহ](docs/reference/FREE_TIERS.md)-এ রয়েছে।
@@ -702,7 +702,7 @@ omniroute configure codex # আরও আছে: claude opencode qwen a -…এবং আরও 330টির বেশি — প্রতিটি আইকন ড্যাশবোর্ডের প্রদানকারী ক্যাটালগ থেকে লাইভ সমাধান হয়। 📖 [প্রদানকারী রেফারেন্স](docs/reference/PROVIDER_REFERENCE.md) +…এবং আরও 330+টি — প্রতিটি আইকন ড্যাশবোর্ডের প্রদানকারী ক্যাটালগ থেকে লাইভ সমাধান হয়। 📖 [প্রদানকারী রেফারেন্স](docs/reference/PROVIDER_REFERENCE.md)
@@ -710,7 +710,7 @@ omniroute configure codex # আরও আছে: claude opencode qwen a - + @@ -718,12 +718,12 @@ omniroute configure codex # আরও আছে: claude opencode qwen a - + - - - - + + + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
টোকেনের কোনো সীমা নেই
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
কোনো টোকেন সীমা নেই
Kilo Code
Kilo Code
অটো-রাউটার, Tencent Hy3
চিরকাল বিনামূল্যে
Requesty
Requesty
GPT-OSS 120B, Nemotron
চিরকাল বিনামূল্যে
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
বিনামূল্যের স্তর
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
চিরকাল বিনামূল্যে
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
সীমাহীন বিনামূল্যে
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
সীমাহীনভাবে বিনামূল্যে
Pollinations
Pollinations
GPT, Llama, Claude
কোনো কী প্রয়োজন নেই
Cloudflare AI
Cloudflare AI
৫০টির বেশি মডেল
প্রতিদিন ১০ হাজার নিউরন
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
বিনামূল্যে ~40 RPM
Cerebras
Cerebras
GLM 4.7, GPT-OSS
প্রতিদিন ১ মিলিয়ন টোকেন
OpenRouter
OpenRouter
:free মডেল
+$10 → উচ্চতর RPM
Cloudflare AI
Cloudflare AI
৫০টির বেশি মডেল
প্রতিদিন ১০K নিউরন
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
বিনামূল্যে ~৪০ RPM
Openference
Openference
Qwen3.8 27B, Llama 3.2
বিনামূল্যের স্তর
OpenRouter
OpenRouter
:free মডেলসমূহ
+$10 → আরও বেশি RPM
@@ -1265,19 +1265,19 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ রানটাইমNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27 ভাষাTypeScript 6.0 — src/ এবং open-sse/ জুড়ে 100% TypeScript (v2.0 থেকে কোরে একটিও any নেই) ফ্রেমওয়ার্কNext.js 16 + React 19 + Tailwind CSS 4 - ডেটাবেসbetter-sqlite3 (SQLite, WAL জার্নালিং) + LowDB (লিগ্যাসি JSON) — 122টি ডোমেইন মডিউল, 176টি মাইগ্রেশন - মেমোরিSQLite FTS5 পূর্ণ-পাঠ অনুসন্ধান + int8-কোয়ান্টাইজড ভেক্টর এম্বেডিং, টাইপড ডিকে + ডেটাবেসbetter-sqlite3 (SQLite, WAL জার্নালিং) + LowDB (JSON লিগ্যাসি) — 122টি ডোমেইন মডিউল, 178টি মাইগ্রেশন + মেমোরিSQLite FTS5 পূর্ণ-পাঠ্য + int8-কোয়ান্টাইজড ভেক্টর এমবেডিং, টাইপড ডিকে স্কিমাZod 4 — MCP টুলের ইনপুট/আউটপুট যাচাইকরণ + API চুক্তি প্রোটোকলMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE) স্ট্রিমিংServer-Sent Events (SSE) + WebSocket ব্রিজ (/v1/ws) কম্প্রেশন12-ইঞ্জিন পাইপলাইন — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph - প্রমাণীকরণ ও নিরাপত্তাOAuth 2.0 (PKCE) + JWT + API Keys + MCP স্কোপড প্রমাণীকরণ · সংরক্ষিত অবস্থায় AES-256-GCM এনক্রিপশন · DOMPurify - স্টেলথwreq-js — JA3 / JA4 TLS ফিঙ্গারপ্রিন্ট ছদ্মবেশ, 3-স্তরের প্রক্সি - স্থিতিস্থাপকতাসার্কিট ব্রেকার, এক্সপোনেনশিয়াল ব্যাকঅফ, অ্যান্টি-থান্ডারিং-হার্ড, স্বয়ংক্রিয়-কম্বো স্ব-মেরামত - লগিংpino — রিকোয়েস্ট কনটেক্সটসহ কাঠামোবদ্ধ JSON লগ - পরীক্ষণNode.js টেস্ট রানার + Vitest — 5,100টিরও বেশি ট্র্যাক করা টেস্ট ফাইলজুড়ে 39,000টিরও বেশি স্ট্যাটিক টেস্ট ডিক্লারেশন (ইউনিট, ইন্টিগ্রেশন, E2E, নিরাপত্তা, ইকোসিস্টেম) + প্রমাণীকরণ ও নিরাপত্তাOAuth 2.0 (PKCE) + JWT + API কী + MCP স্কোপড প্রমাণীকরণ · সংরক্ষিত অবস্থায় AES-256-GCM · DOMPurify + স্টেলথwreq-js — JA3 / JA4 TLS ফিঙ্গারপ্রিন্ট ছদ্মবেশ ধারণ, 3-স্তরবিশিষ্ট প্রক্সি + সহনশীলতাসার্কিট ব্রেকার, এক্সপোনেনশিয়াল ব্যাকঅফ, অ্যান্টি-থান্ডারিং-হার্ড, অটো-কম্বো স্বয়ংক্রিয় পুনরুদ্ধার + লগিংpino — রিকোয়েস্ট কনটেক্সটসহ স্ট্রাকচার্ড JSON লগ + পরীক্ষণNode.js টেস্ট রানার + Vitest — 5,100টির বেশি ট্র্যাক করা টেস্ট ফাইলজুড়ে 39,000টির বেশি স্ট্যাটিক টেস্ট ডিক্লারেশন (ইউনিট, ইন্টিগ্রেশন, E2E, নিরাপত্তা, ইকোসিস্টেম) প্ল্যাটফর্মডেস্কটপ (Electron) · Android (Termux) · PWA (যেকোনো ব্রাউজার) - CI/CDGitHub Actions — রিলিজের সময় স্বয়ংক্রিয়ভাবে npm প্রকাশনা + Docker Hub + CI/CDGitHub Actions — রিলিজের সময় স্বয়ংক্রিয়ভাবে npm-এ প্রকাশ + Docker Hub লিংকওয়েবসাইট · npm · Docker Hub @@ -1294,11 +1294,11 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ - - - - - + + + + +
ডকুমেন্টবিবরণ
ব্যবহারকারী নির্দেশিকাপ্রোভাইডার, কম্বো, CLI ইন্টিগ্রেশন, ডিপ্লয়মেন্ট
সেটআপ নির্দেশিকাসম্পূর্ণ ইনস্টল পদ্ধতি, CLI টুল কনফিগারেশন, প্রোটোকল সেটআপ, টাইমআউট টিউনিং
CLI টুল নির্দেশিকাClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot-এর জন্য প্রতিটি টুলের পৃথক সেটআপ
রিমোট মোডস্কোপড অ্যাক্সেস টোকেনের মাধ্যমে আপনার ল্যাপটপের CLI থেকে রিমোট OmniRoute (VPS) পরিচালনা করুন
Claude Code কনফিগারেশনlaunch + মডেলভিত্তিক প্রোফাইল দিয়ে Claude Code-কে OmniRoute-এর (লোকাল/রিমোট) দিকে নির্দেশ করুন
দ্রুত শুরু৩ ধাপে ইনস্টল → সংযোগ → কনফিগার
সেটআপ নির্দেশিকাসম্পূর্ণ ইনস্টলেশন পদ্ধতি, CLI টুল কনফিগারেশন, প্রোটোকল সেটআপ, টাইমআউট টিউনিং
CLI টুল নির্দেশিকাClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo ও Copilot-এর জন্য টুলভিত্তিক সেটআপ
রিমোট মোডস্কোপযুক্ত অ্যাক্সেস টোকেনের মাধ্যমে আপনার ল্যাপটপের CLI থেকে একটি রিমোট OmniRoute (VPS) পরিচালনা করুন
Claude Code কনফিগারেশনlaunch + মডেলভিত্তিক প্রোফাইল দিয়ে Claude Code-কে OmniRoute-এর (লোকাল/রিমোট) সঙ্গে সংযুক্ত করুন
দ্রুত শুরু৩ ধাপে ইনস্টল → সংযোগ → কনফিগারেশন
### 🔧 পরিচালনা ও ডিপ্লয়মেন্ট @@ -1308,11 +1308,11 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ Docker নির্দেশিকাDocker রান, Compose প্রোফাইল, Caddy HTTPS, টানেল, ইমেজ ট্যাগ Podman নির্দেশিকাQuadlet systemd ইন্টিগ্রেশন, podman-compose, SELinux VM ডিপ্লয়মেন্টসম্পূর্ণ নির্দেশিকা: VM + nginx + Cloudflare সেটআপ - Fly.io ডিপ্লয়মেন্টস্থায়ী স্টোরেজসহ Fly.io-তে ডিপ্লয় করুন + Fly.io ডিপ্লয়মেন্টপারসিস্টেন্ট স্টোরেজসহ Fly.io-তে ডিপ্লয় করুন Termux নির্দেশিকাTermux-এর মাধ্যমে Android-এ OmniRoute চালান - PWA নির্দেশিকাProgressive Web App ইনস্টল, ক্যাশিং, আর্কিটেকচার - আনইনস্টল নির্দেশিকাসব ইনস্টল পদ্ধতির জন্য পরিচ্ছন্ন অপসারণ - এনভায়রনমেন্ট কনফিগারেশনসম্পূর্ণ .env ভেরিয়েবল ও রেফারেন্স + PWA নির্দেশিকাProgressive Web App ইনস্টলেশন, ক্যাশিং, আর্কিটেকচার + আনইনস্টল নির্দেশিকাসব ইনস্টলেশন পদ্ধতির জন্য পরিচ্ছন্ন অপসারণ + এনভায়রনমেন্ট কনফিগারেশন.env-এর সম্পূর্ণ ভেরিয়েবল ও রেফারেন্স ### 🧠 ফিচার ও আর্কিটেকচার @@ -1320,17 +1320,17 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ - - - + + + - - + + - - - + + +
ডকুমেন্টবিবরণ
আর্কিটেকচারসিস্টেম আর্কিটেকচার, ডেটা প্রবাহ এবং অভ্যন্তরীণ কার্যপ্রণালি
কম্প্রেশন নির্দেশিকা৭-বিকল্পের পাইপলাইন: বন্ধ / হালকা / স্ট্যান্ডার্ড / আগ্রাসী / আল্ট্রা / RTK / স্ট্যাকড
RTK কম্প্রেশনকমান্ড-আউটপুট কম্প্রেশন, ফিল্টার, আস্থা, যাচাই, র’ আউটপুট পুনরুদ্ধার
কম্প্রেশন ইঞ্জিনCaveman, RTK, স্ট্যাকড পাইপলাইন, ড্যাশবোর্ড/API/MCP ইন্টারফেস
কম্প্রেশন নির্দেশিকা৭-বিকল্পের পাইপলাইন: off / lite / standard / aggressive / ultra / RTK / stacked
RTK কম্প্রেশনকমান্ড-আউটপুট কম্প্রেশন, ফিল্টার, আস্থা, যাচাই, কাঁচা আউটপুট পুনরুদ্ধার
কম্প্রেশন ইঞ্জিনCaveman, RTK, স্ট্যাকড পাইপলাইন, ড্যাশবোর্ড/API/MCP সারফেস
কম্প্রেশন নিয়মের ফরম্যাটCaveman ও RTK ফিল্টারের জন্য JSON রুল-প্যাক স্কিমা
কম্প্রেশন ল্যাঙ্গুয়েজ প্যাকভাষা শনাক্তকরণ এবং Caveman রুল-প্যাক রচনা
স্থিতিস্থাপকতা নির্দেশিকাসার্কিট ব্রেকার, কুলডাউন, কিউ, অ্যান্টি-থান্ডারিং হার্ড, TLS স্পুফিং
অটো-কম্বো ইঞ্জিন১৬-ফ্যাক্টর স্কোরিং, মোড প্যাক, স্বয়ংক্রিয় পুনরুদ্ধার
রেজিলিয়েন্স নির্দেশিকাসার্কিট ব্রেকার, কুলডাউন, কিউ, অ্যান্টি-থান্ডারিং হার্ড, TLS স্পুফিং
Auto-Combo ইঞ্জিন১৬-ফ্যাক্টর স্কোরিং, মোড প্যাক, স্বয়ংক্রিয় পুনরুদ্ধার
প্রক্সি নির্দেশিকা৩-স্তরের প্রক্সি সিস্টেম, 1proxy মার্কেটপ্লেস, রেজিস্ট্রি CRUD
বিনামূল্যের টিয়ারসমন্বিত ডিরেক্টরি: ৩৫টি নথিভুক্ত পুনরাবৃত্ত পুল / ৪৯১টি ক্যাটালগভুক্ত বিনামূল্যের টিয়ার এন্ট্রি
ফিচার গ্যালারিস্ক্রিনশটসহ ড্যাশবোর্ডের ভিজ্যুয়াল পরিক্রমা
কোডবেস ডকুমেন্টেশননতুনদের উপযোগী কোডবেসের ধাপে ধাপে পরিচিতি
ফ্রি টিয়ারএকত্রিত ডিরেক্টরি: নথিভুক্ত ৩৫টি পুনরাবৃত্ত পুল / ক্যাটালগভুক্ত ৪৮৯টি ফ্রি-টিয়ার এন্ট্রি
ফিচার গ্যালারিস্ক্রিনশটসহ ড্যাশবোর্ডের ভিজ্যুয়াল ভ্রমণ
কোডবেস ডকুমেন্টেশননতুনদের উপযোগী কোডবেস পরিভ্রমণ
### 🤖 প্রোটোকল ও API @@ -1340,9 +1340,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ API রেফারেন্সউদাহরণসহ সব এন্ডপয়েন্ট OpenAPI স্পেসিফিকেশনOpenAPI 3.0 স্পেসিফিকেশন MCP সার্ভার১১০টি MCP টুল, IDE কনফিগারেশন, Python/TS/Go ক্লায়েন্ট - MCP সার্ভার নির্দেশিকাMCP ইনস্টলেশন, ট্রান্সপোর্ট ও টুল রেফারেন্স + MCP সার্ভার নির্দেশিকাMCP ইনস্টলেশন, ট্রান্সপোর্ট এবং টুল রেফারেন্স A2A সার্ভারJSON-RPC 2.0 প্রোটোকল, দক্ষতা, স্ট্রিমিং, টাস্ক ব্যবস্থাপনা - A2A সার্ভার নির্দেশিকাA2A এজেন্ট কার্ড, টাস্ক, দক্ষতা ও স্ট্রিমিং + A2A সার্ভার নির্দেশিকাA2A এজেন্ট কার্ড, টাস্ক, দক্ষতা এবং স্ট্রিমিং ### 📋 প্রকল্প ও গুণমান @@ -1353,9 +1353,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ ব্রাঞ্চিং ও রিলিজ মডেলPR-গুলো কোথায় লক্ষ্য করে (release/*), এবং main ও ট্যাগগুলোর অর্থ কী পরিবর্তনলিপিপ্রতিটি সংস্করণের সম্পূর্ণ রিলিজ ইতিহাস নিরাপত্তা নীতিদুর্বলতা প্রতিবেদন ও নিরাপত্তা অনুশীলন - i18n নির্দেশিকা৪২টি ভাষার সমর্থন, অনুবাদ কর্মপ্রবাহ, RTL + i18n নির্দেশিকা42টি ভাষার সমর্থন, অনুবাদ কর্মপ্রবাহ, RTL রিলিজ যাচাইতালিকারিলিজ-পূর্ব যাচাইকরণ ধাপসমূহ - কভারেজ পরিকল্পনা৫,১০০টির বেশি ট্র্যাক করা টেস্ট ফাইলজুড়ে ৩৯,০০০টির বেশি স্ট্যাটিক টেস্ট ঘোষণার জন্য টেস্ট কভারেজ কৌশল + কভারেজ পরিকল্পনা5,100টির বেশি ট্র্যাক করা টেস্ট ফাইলজুড়ে 39,000টির বেশি স্ট্যাটিক টেস্ট ঘোষণার জন্য টেস্ট কভারেজ কৌশল
@@ -1364,9 +1364,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ # ⭐ শীর্ষ অবদানকারীরা -> OmniRoute একটি উৎসাহী ওপেন-সোর্স কমিউনিটির হাতে গড়ে উঠেছে। এই ব্যক্তিরা অসাধারণ অবদান রেখেছেন, যা প্রকল্পটির গুণমান, স্থিতিশীলতা ও বিস্তারে সরাসরি প্রভাব ফেলে। **আপনাদের ধন্যবাদ।** +> OmniRoute একটি নিবেদিতপ্রাণ ওপেন-সোর্স কমিউনিটির হাতে গড়ে উঠেছে। এই ব্যক্তিরা অসাধারণ অবদান রেখেছেন, যা প্রকল্পটির গুণমান, স্থিতিশীলতা ও প্রসারে সরাসরি প্রভাব ফেলেছে। **ধন্যবাদ।** -### মার্জ করা পুল রিকোয়েস্টের ভিত্তিতে বহিরাগত অবদানকারীরা +### মার্জ করা pull request অনুযায়ী বহিরাগত অবদানকারীরা @@ -1393,9 +1393,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ
স্থানঅবদানকারীমার্জ করা PR~পরিবর্তিত লাইন
20Prudhvivuda246,312
-লাইভ release/v3.8.50-এর সর্বশেষ dafb4ae808 অবস্থায় স্থিরীকৃত, যেখানে 2026-08-24 05:26:03 UTC পর্যন্ত মার্জ অন্তর্ভুক্ত রয়েছে। পৃষ্ঠাবিভক্ত GitHub GraphQL শুমারিতে ৫,৯১১টি মার্জ করা PR রয়েছে: রিপোজিটরি মালিকের ২,৭০৭টি, Dependabot-এর ১৭৯টি এবং ৫৩৫ জন স্বতন্ত্র অবদানকারীর ৩,০২৫টি বহিরাগত PR। “পরিবর্তিত লাইন” হলো GitHub-এর সংযোজন + অপসারণ এবং এতে জেনারেট করা ফাইল, লকফাইল, ক্যাটালগ, অনুবাদ ও ডকুমেন্টেশন অন্তর্ভুক্ত; এটি পরিবর্তনের পরিমাণ, রচিত LOC নয়। শেষ সীমায় সমান অবস্থানগুলো রাখা হয়েছে। +2026-08-24 05:26:03 UTC পর্যন্ত মার্জসহ সক্রিয় release/v3.8.50-এর সর্বশেষ অবস্থান dafb4ae808-এ তথ্য স্থির করা হয়েছে। পৃষ্ঠাবিন্যস্ত GitHub GraphQL গণনায় 5,911টি মার্জ করা PR রয়েছে: রিপোজিটরি মালিকের 2,707টি, Dependabot-এর 179টি এবং 535 জন স্বতন্ত্র অবদানকারীর 3,025টি বহিরাগত PR। “পরিবর্তিত লাইন” হলো GitHub-এর সংযোজন + অপসারণ এবং এতে জেনারেট করা ফাইল, lockfile, catalog, অনুবাদ ও নথিপত্র অন্তর্ভুক্ত রয়েছে; এটি পরিবর্তনের পরিমাণ, রচিত LOC নয়। সীমারেখায় সমান অবস্থানগুলো রাখা হয়েছে। -### GitHub-এ আরোপিত কমিটসমূহ +### GitHub-এ আরোপিত commitসমূহ @@ -1481,9 +1481,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ও এটি এ
-2026-08-24 06:14:31 UTC-তে পুনরায় যাচাই করা হয়েছে: ডিফল্ট শাখা release/v3.8.50-এর জন্য রিপোজিটরির Contributors API দ্বারা প্রতিবেদন করা GitHub-এ আরোপিত কমিট। API 525টি পরিচয় ফেরত দিয়েছে (415 জন ব্যবহারকারী, 2টি বট, 108 জন বেনামী); এই সারণি থেকে রক্ষণাবেক্ষণকারী, বট ও বেনামী পরিচয়গুলো বাদ দেওয়া হয়েছে এবং প্রতিযোগিতার যৌথ অবস্থানগুলো বজায় রাখা হয়েছে। এটি উপরের মার্জ করা PR-এর র্যাঙ্কিং এবং নিচের 639-জনের Git-মেটাডেটা শুমারি—উভয়টি থেকেই স্বতন্ত্র। +2026-08-24 06:14:31 UTC-এ পুনরায় যাচাই করা হয়েছে: ডিফল্ট শাখা release/v3.8.50-এর জন্য রিপোজিটরির Contributors API দ্বারা প্রতিবেদন করা GitHub-এ আরোপিত কমিট। API 525টি পরিচয় ফেরত দিয়েছে (415 জন ব্যবহারকারী, 2টি বট, 108টি বেনামী); এই সারণিতে রক্ষণাবেক্ষণকারী, বট ও বেনামী পরিচয়গুলো বাদ দেওয়া হয়েছে এবং যৌথ অবস্থান বজায় রাখা হয়েছে। এটি উপরের মার্জ করা PR-এর র্যাঙ্কিং এবং নিচের 639-ব্যক্তির Git-মেটাডেটা আদমশুমারি—উভয় থেকেই স্বতন্ত্র। -> 🙏 এই অবদানকারীদের ফিচার, বাগ সংশোধন এবং অবকাঠামোগত উন্নতিগুলো OmniRoute-কে নির্ভরযোগ্য ও ফিচারসমৃদ্ধ করে তোলার একটি **মূল অংশ**। প্রতিটি পুল রিকোয়েস্ট, প্রতিটি টেস্ট কেস এবং প্রতিটি i18n অনুবাদ ফাইল গুরুত্বপূর্ণ। তাঁদের মতো মানুষদের হাতেই ওপেন সোর্স গড়ে ওঠে। +> 🙏 এই অবদানকারীদের ফিচার, বাগ সংশোধন এবং অবকাঠামোগত উন্নতিগুলো OmniRoute-কে নির্ভরযোগ্য ও ফিচারসমৃদ্ধ করে তোলার একটি **মূল অংশ**। প্রতিটি পুল রিকোয়েস্ট, প্রতিটি টেস্ট কেস এবং প্রতিটি i18n অনুবাদ ফাইল গুরুত্বপূর্ণ। তাদের মতো মানুষদের হাতেই ওপেন সোর্স নির্মিত হয়।
diff --git a/docs/i18n/bn/SECURITY.md b/docs/i18n/bn/SECURITY.md index b5f07eb4020e..3265ffcc282a 100644 --- a/docs/i18n/bn/SECURITY.md +++ b/docs/i18n/bn/SECURITY.md @@ -222,35 +222,35 @@ docker run -d \ ## সাপ্লাই-চেইন স্ক্যানারের অনুসন্ধানসমূহ (Socket.dev / Snyk / অনুরূপ) +> **পরিধি-সংক্রান্ত নোট:** রিপোজিটরির রুটে থাকা `socket.yml` কেবল প্রকাশিত npm আর্টিফ্যাক্টের ওপর Socket.dev-এর রেজিস্ট্রি-পার্শ্বের প্রকাশনা-পরবর্তী স্ক্যানের জন্য `projectIgnorePaths` নির্ধারণ করে — এটি বাধ্যতামূলক CI/PR মার্জ গেট নয়। `.github/workflows`-এর কোনো ওয়ার্কফ্লো, কোনো `package.json` স্ক্রিপ্ট এবং কোনো `Makefile` টার্গেট Socket.dev আহ্বান করে না। + প্রকাশিত `omniroute` npm আর্টিফ্যাক্টটি Next.js-এর `output: "standalone"` -বিল্ডকে বান্ডেল করে, যার অর্থ হলো প্রতিটি রুট হ্যান্ডলার — নথিভুক্ত বিশেষাধিকারপ্রাপ্ত -ফিচারগুলোসহ (MITM, Zed import, Cloud Sync, এম্বেডেড সার্ভিস সুপারভাইজার) — শেষ পর্যন্ত -`.next/server/*.js` মিনিফাইড চাঙ্কে অন্তর্ভুক্ত হয়। হিউরিস্টিক সাপ্লাই-চেইন স্ক্যানারগুলো -প্রায়ই ম্যালওয়্যার সিগনেচারের বিপরীতে ওই চাঙ্কগুলোর প্যাটার্ন-ম্যাচ করে। +বিল্ড বান্ডল করে, যার অর্থ প্রতিটি রুট হ্যান্ডলার — নথিভুক্ত বিশেষাধিকারপ্রাপ্ত +ফিচারগুলোসহ (MITM, Zed import, Cloud Sync, এম্বেডেড সার্ভিস সুপারভাইজার) — শেষ +পর্যন্ত `.next/server/*.js` মিনিফাইড চাঙ্কে অন্তর্ভুক্ত হয়। হিউরিস্টিক সাপ্লাই-চেইন স্ক্যানারগুলো +প্রায়ই ম্যালওয়্যার সিগনেচারের সঙ্গে ওই চাঙ্কগুলোর প্যাটার্ন মেলায়। আমাদের ব্যবহৃত স্ক্যানার কনফিগারেশনটি রিপোজিটরির রুটে [`socket.yml`](socket.yml)-এ রয়েছে (Socket.dev GitHub App format v2 — দেখুন )। এটি স্পষ্টভাবে বিতরণ না করা ডিরেক্টরিগুলো (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/`, ইত্যাদি) বাদ দেয়, যাতে স্ক্যানারটি কেবল সেই কোড পাথগুলোই -রিপোর্ট করে যেগুলো বাস্তবে প্রকাশিত সংস্করণের ব্যবহারকারীদের কাছে পৌঁছায় — স্ক্যানটি -নিজেই এই ফাইলটি পড়ে Socket GitHub App দ্বারা পরিচালিত হয়, এই রিপোজিটরির কোনো -ওয়ার্কফ্লো দ্বারা নয়। +`_mono_repo/`, `docs/`, ইত্যাদি) বাদ দেয়, যাতে স্ক্যানার কেবল সেই কোড পাথগুলো সম্পর্কে +রিপোর্ট করে যা বাস্তবে প্রকাশিত ব্যবহারকারীদের কাছে পৌঁছায় — স্ক্যানটি এই রিপোজিটরির +কোনো ওয়ার্কফ্লো দ্বারা নয়, বরং Socket GitHub App-এর ওই ফাইলটি পড়ার মাধ্যমে চালিত হয়। -অনুসন্ধানের প্রতিটি বিভাগের জন্য আমরা প্রতিটি অনুসন্ধানভিত্তিক রক্ষণাবেক্ষণকারীর প্রত্যয়ন সংরক্ষণ করি: +প্রতিটি অনুসন্ধান বিভাগের জন্য আমরা অনুসন্ধানভিত্তিক রক্ষণাবেক্ষণকারী প্রত্যয়ন সংরক্ষণ করি: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - প্রতিটি অনুসন্ধানের ম্যাপ: সোর্স ফাইল ↔ ফ্ল্যাগ করা চাঙ্ক ↔ আচরণ ↔ v3.8.6-এ + অনুসন্ধানভিত্তিক মানচিত্র: সোর্স ফাইল ↔ চিহ্নিত চাঙ্ক ↔ আচরণ ↔ v3.8.6-এ প্রয়োগ করা প্রশমন। -- প্রতিটি ফ্ল্যাগ করা ফাংশনের স্থানে ইন-সোর্স `SECURITY-AUDITOR-NOTE:` ব্লকগুলো - একই ডকুমেন্টে ফিরে নির্দেশ করে। +- প্রতিটি চিহ্নিত ফাংশনে সোর্সের মধ্যে থাকা `SECURITY-AUDITOR-NOTE:` ব্লকগুলো + একই নথির দিকে নির্দেশ করে। যেসব ব্যবহারকারীর পাইপলাইনে সতর্কতাটি শিথিল করা সম্ভব নয়: তাঁরা `OMNIROUTE_BUILD_PROFILE=minimal npm run build` দিয়ে বিল্ড করুন। এটি চারটি -সংবেদনশীল মডিউলকে এমন স্টাব দিয়ে প্রতিস্থাপন করে, যেগুলো রানটাইমে HTTP 503 -`feature-disabled` ফেরত দেয়; ফলে বিশেষাধিকারপ্রাপ্ত কোড পাথগুলো বান্ডেলে ভৌতভাবে -অনুপস্থিত থাকে। প্রকাশনার প্রক্রিয়ার জন্য -[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) +সংবেদনশীল মডিউলকে এমন স্টাব দিয়ে প্রতিস্থাপন করে, যা রানটাইমে HTTP 503 +`feature-disabled` ফেরত দেয়; ফলে বিশেষাধিকারপ্রাপ্ত কোড পাথগুলো বান্ডলে বাস্তবিকভাবেই অনুপস্থিত থাকে। +প্রকাশনার পদ্ধতির জন্য [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) দেখুন। ## তথ্যসূত্র diff --git a/docs/i18n/bn/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/bn/docs/architecture/CODEBASE_DOCUMENTATION.md index 937faf1f1501..faf8b8a85c66 100644 --- a/docs/i18n/bn/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/bn/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,8 @@ server/ ## 4. `open-sse/` — স্ট্রিমিং ইঞ্জিন ওয়ার্কস্পেস -`@omniroute/open-sse` নামে প্রকাশিত পৃথক npm ওয়ার্কস্পেস। এটি অনুরোধ -প্রক্রিয়াকরণ, এক্সিকিউটর, অনুবাদক, সার্ভিস, ট্রান্সফর্মার এবং MCP সার্ভার পরিচালনা করে। +`@omniroute/open-sse` হিসেবে প্রকাশিত পৃথক npm ওয়ার্কস্পেস। এটি রিকোয়েস্ট +প্রসেসিং, এক্সিকিউটর, ট্রান্সলেটর, সার্ভিস, ট্রান্সফর্মার এবং MCP সার্ভার পরিচালনা করে। ``` open-sse/ @@ -445,13 +445,13 @@ open-sse/ ├── package.json ওয়ার্কস্পেস ম্যানিফেস্ট ├── tsconfig.json ├── types.d.ts -├── config/ প্রোভাইডার রেজিস্ট্রি, হেডার প্রোফাইল, পরিচয়, … -├── handlers/ অনুরোধ হ্যান্ডলার (চ্যাট, এমবেডিং, অডিও, ছবি, …) +├── config/ প্রোভাইডার রেজিস্ট্রি, হেডার প্রোফাইল, আইডেন্টিটি, … +├── handlers/ রিকোয়েস্ট হ্যান্ডলার (চ্যাট, এমবেডিং, অডিও, ছবি, …) ├── executors/ 108টি প্রোভাইডার-নির্দিষ্ট HTTP এক্সিকিউটর ├── translator/ ফরম্যাট রূপান্তর (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions স্ট্রিম ট্রান্সফর্মার -├── services/ 80টির বেশি সার্ভিস মডিউল (কম্বো, ফলব্যাক, কোটা, পরিচয়, …) -├── utils/ স্ট্রিমিং সহায়ক, TLS ক্লায়েন্ট, AWS SigV4, প্রক্সি ফেচ, … +├── services/ 80টির বেশি সার্ভিস মডিউল (কম্বো, ফলব্যাক, কোটা, আইডেন্টিটি, …) +├── utils/ স্ট্রিমিং হেল্পার, TLS ক্লায়েন্ট, AWS SigV4, প্রক্সি ফেচ, … └── mcp-server/ MCP সার্ভার (3টি ট্রান্সপোর্ট, 33টি স্কোপ, 110টি টুল) ``` @@ -471,9 +471,9 @@ open-sse/ | `moderations.ts` | মডারেশন | | `search.ts` | ওয়েব অনুসন্ধান | | `sseParser.ts` | SSE ইভেন্ট পার্সার | -| `usageExtractor.ts` | আপস্ট্রিম স্ট্রিম থেকে টোকেনের সংখ্যা বের করে | -| `responseSanitizer.ts` | প্রোভাইডার-নির্দিষ্ট অপ্রয়োজনীয় উপাদান বাদ দেয় | -| `responseTranslator.ts` | প্রোভাইডারের প্রতিক্রিয়া ও অনুবাদক স্তরের মধ্যকার সংযোগকারী | +| `usageExtractor.ts` | আপস্ট্রিম স্ট্রিম থেকে টোকেনের সংখ্যা বের করে আনা | +| `responseSanitizer.ts` | প্রোভাইডার-নির্দিষ্ট অপ্রয়োজনীয় তথ্য বাদ দেওয়া | +| `responseTranslator.ts` | প্রোভাইডার রেসপন্স ও ট্রান্সলেটর স্তরের মধ্যকার সংযোগ | ### 4.2 `open-sse/executors/` @@ -483,80 +483,80 @@ open-sse/ `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, পাশাপাশি `claudeIdentity.ts` -(শেয়ার্ড পরিচয় সহায়ক) এবং `index.ts` (রেজিস্ট্রি)। +(শেয়ার্ড আইডেন্টিটি হেল্পার) এবং `index.ts` (রেজিস্ট্রি)। -> নোট: এখানে তালিকাভুক্ত নয় এমন প্রোভাইডারগুলোকে জেনেরিক -> OpenAI-সামঞ্জস্যপূর্ণ এক্সিকিউটর ব্যবহার করে `default.ts` পরিবেশন করে। সম্পূর্ণ প্রোভাইডার ক্যাটালগটি (355টি প্রোভাইডার) -> `src/shared/constants/providers.ts`-এ রয়েছে। +> দ্রষ্টব্য: এখানে তালিকাভুক্ত নয় এমন প্রোভাইডারগুলোকে জেনেরিক +> OpenAI-সামঞ্জস্যপূর্ণ এক্সিকিউটর ব্যবহার করে `default.ts` পরিবেশন করে। সম্পূর্ণ প্রোভাইডার ক্যাটালগে (355টি প্রোভাইডার) +> রয়েছে `src/shared/constants/providers.ts`-এ। ### 4.3 `open-sse/translator/` -হাব-অ্যান্ড-স্পোক অনুবাদ (OpenAI হলো হাব)। +হাব-অ্যান্ড-স্পোক ট্রান্সলেশন (OpenAI হলো হাব)। -- **9টি অনুরোধ অনুবাদক** (`translator/request/`): +- **9টি রিকোয়েস্ট ট্রান্সলেটর** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`। -- **9টি প্রতিক্রিয়া অনুবাদক** (`translator/response/`): +- **9টি রেসপন্স ট্রান্সলেটর** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`। -- **9টি সহায়ক** (`translator/helpers/`): +- **9টি হেল্পার** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, এবং - সহায়ক টেস্ট। -- **ছবি-সংক্রান্ত সহায়ক** (`translator/image/sizeMapper.ts`)। + হেল্পার টেস্ট। +- **ইমেজ হেল্পার** (`translator/image/sizeMapper.ts`)। - শীর্ষ-স্তর: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`। ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-ভিত্তিক Responses API ↔ Chat - Completions কনভার্টার (`responses/` রুটের ক্যাচ-অল দ্বারা ব্যবহৃত)। + Completions কনভার্টার (`responses/` রুট ক্যাচ-অল দ্বারা ব্যবহৃত)। ### 4.5 `open-sse/services/` উল্লেখযোগ্য অংশসমূহ (সম্পূর্ণ তালিকা `open-sse/services/`-এর অধীনে): -| বিবেচ্য বিষয় | ফাইলসমূহ | -| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| কম্বো রাউটিং | `combo.ts` (19টি কৌশল), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| অটো কম্বো ইঞ্জিন | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| স্থিতিস্থাপকতা | `accountFallback.ts` (কুলডাউন + লকআউট), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| কোটা | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| ক্যাশিং | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| রাউটিং বুদ্ধিমত্তা | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| মডেল পরিচালনা | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| কম্প্রেশন | `compression/` — সম্পূর্ণ কম্প্রেশন ইঞ্জিনের ওয়্যারিং | -| টোকেন + সেশন | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| টিয়ার / ম্যানিফেস্ট | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / নেটওয়ার্ক | `ipFilter.ts`, `webSearchFallback.ts` | -| ব্যাচ | `batchProcessor.ts` | -| ব্যবহার | `usage.ts` | +| বিবেচ্য বিষয় | ফাইলসমূহ | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| কম্বো রাউটিং | `combo.ts` (19টি কৌশল), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| অটো কম্বো ইঞ্জিন | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| স্থিতিস্থাপকতা | `accountFallback.ts` (কুলডাউন + লকআউট), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| কোটা | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| ক্যাশিং | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| রাউটিং বুদ্ধিমত্তা | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| মডেল ব্যবস্থাপনা | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| কম্প্রেশন | `compression/` — সম্পূর্ণ কম্প্রেশন ইঞ্জিনের ওয়্যারিং | +| টোকেন + সেশন | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| টিয়ার / ম্যানিফেস্ট | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / নেটওয়ার্ক | `ipFilter.ts`, `webSearchFallback.ts` | +| ব্যাচসমূহ | `batchProcessor.ts` | +| ব্যবহার | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- `server.ts`-এ **110টি অনন্য টুল** সংযুক্ত (`schemas/tools.ts`-এ 45টি ক্যানোনিক + +- **110টি অনন্য টুল** `server.ts`-এ সংযুক্ত (`schemas/tools.ts`-এ 45টি ক্যানোনিক্যাল + মেমরি, স্কিল, GitHub-স্কিল, পুল, গেমিফিকেশন, প্লাগইন, Notion, Obsidian, লোকাল-কর্পাস এবং কম্প্রেশন মডিউল — ইউনিয়নটি `countUniqueMcpTools` দ্বারা গণনা করা হয়েছে)। - **3টি ট্রান্সপোর্ট**: stdio, HTTP Streamable, SSE। -- রানটাইমে **33টি স্কোপ** বলবৎ করা হয় — মূল তালিকাটি `src/shared/constants/mcpScopes.ts`-এ রয়েছে, আর সম্পূর্ণ সেটটি হলো প্রতিটি টুল মডিউল দ্বারা ঘোষিত স্কোপগুলোর ইউনিয়ন। +- রানটাইমে **33টি স্কোপ** প্রয়োগ করা হয় — মূল তালিকা `src/shared/constants/mcpScopes.ts`-এ রয়েছে, আর সম্পূর্ণ সেটটি হলো প্রতিটি টুল মডিউল দ্বারা ঘোষিত স্কোপগুলোর ইউনিয়ন। - অডিট টেবিল: `mcp_tool_audit` (`audit.ts` দ্বারা পূরণ করা হয়)। - ফাইলসমূহ: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - এবং `__tests__/`-এর অধীনে থাকা টেস্টসমূহ। + এবং `__tests__/`-এর অধীনস্থ টেস্টসমূহ। - সম্পূর্ণ টুল ক্যাটালগের জন্য [MCP-SERVER.md](../frameworks/MCP-SERVER.md) দেখুন। ### 4.7 `open-sse/config/` প্রোভাইডার রেজিস্ট্রিসমূহ (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), ফরম্যাটভিত্তিক মডেল রেজিস্ট্রিসমূহ (`audioRegistry.ts`, +`providerHeaderProfiles.ts`), ফরম্যাট-ভিত্তিক মডেল রেজিস্ট্রিসমূহ (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), -আইডেন্টিটি সহায়কসমূহ (`codexIdentity.ts`, `codexInstructions.ts`, +আইডেন্টিটি হেল্পারসমূহ (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), -ক্রেডেনশিয়াল সহায়কসমূহ (`credentialLoader.ts`, `codexClient.ts`), এবং ক্লাউড +ক্রেডেনশিয়াল হেল্পারসমূহ (`credentialLoader.ts`, `codexClient.ts`), এবং ক্লাউড অ্যাডাপ্টারসমূহ (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`)। @@ -571,7 +571,7 @@ open-sse/ `comfyuiClient.ts`, `kieTask.ts`, `bypassHandler.ts`, `aiSdkCompat.ts`, `thinkTagParser.ts`, `urlSanitize.ts`, `usageTracking.ts`, `requestLogger.ts`, `progressTracker.ts`, `cors.ts`, `error.ts`, `logger.ts`, `sleep.ts`, -`ollamaTransform.ts`। +`ollamaTransform.ts`. --- diff --git a/docs/i18n/bn/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/bn/docs/architecture/RESILIENCE_GUIDE.md index c4db8f706839..3b6bd3bf976c 100644 --- a/docs/i18n/bn/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/bn/docs/architecture/RESILIENCE_GUIDE.md @@ -69,94 +69,137 @@ OmniRoute-এ তিনটি স্বতন্ত্র কিন্তু স ## 2. সংযোগ কুলডাউন -**পরিধি:** একটি একক প্রোভাইডার সংযোগ/অ্যাকাউন্ট/কী। +**পরিধি:** একটি নির্দিষ্ট প্রোভাইডারের একক সংযোগ/অ্যাকাউন্ট/কী। -**উদ্দেশ্য:** একই প্রোভাইডারের অন্যান্য সংযোগ পরিষেবা চালু রাখার সময় একটি ত্রুটিপূর্ণ কী এড়িয়ে যাওয়া। +**উদ্দেশ্য:** একই প্রোভাইডারের অন্যান্য সংযোগ সেবা প্রদান চালিয়ে যাওয়ার সময় একটি ত্রুটিপূর্ণ কী এড়িয়ে যাওয়া। **বাস্তবায়ন:** -- অনুপলভ্য হিসেবে চিহ্নিতকরণ: `src/sse/services/auth.ts::markAccountUnavailable()` +- অনুপলভ্য হিসেবে চিহ্নিত করা: `src/sse/services/auth.ts::markAccountUnavailable()` - নির্বাচন: একই ফাইলে `getProviderCredentials*` - কুলডাউন গণনা: `open-sse/services/accountFallback.ts::checkFallbackError()` - সেটিংস: `src/lib/resilience/settings.ts` **প্রতি সংযোগের ফিল্ডসমূহ:** -- `rateLimitedUntil` — কুলডাউনের মেয়াদ শেষ হওয়া পর্যন্ত টাইমস্ট্যাম্প +- `rateLimitedUntil` — কুলডাউন শেষ হওয়া পর্যন্ত টাইমস্ট্যাম্প - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — এক্সপোনেনশিয়াল ব্যাকঅফ কাউন্টার +- `backoffLevel` — সূচকীয় ব্যাকঅফ কাউন্টার **ডিফল্ট কুলডাউনসমূহ:** - OAuth ভিত্তি: 5s - API-key ভিত্তি: 3s -- API-key 429: আপস্ট্রিম `Retry-After`/রিসেট হেডার/পার্সযোগ্য রিসেট টেক্সটকে অগ্রাধিকার দেয় +- API-key 429: আপস্ট্রিমের `Retry-After`/রিসেট হেডার/পার্সযোগ্য রিসেট টেক্সটকে অগ্রাধিকার দেয় - ব্যাকঅফ: `baseCooldownMs * 2 ** failureIndex` -**থান্ডারিং-হার্ড প্রতিরোধ ব্যবস্থা:** সমসাময়িক ব্যর্থতার কারণে কুলডাউন অতিরিক্ত বাড়ানো বা `backoffLevel` দুবার বৃদ্ধি করা প্রতিরোধ করে। +**থান্ডারিং-হার্ড প্রতিরোধ ব্যবস্থা:** সমসাময়িক ব্যর্থতার কারণে কুলডাউন অতিরিক্ত বাড়ানো বা `backoffLevel` দুইবার বৃদ্ধি করা প্রতিরোধ করে। -**চূড়ান্ত অবস্থা (কুলডাউন নয়):** +**টার্মিনাল অবস্থা (কুলডাউন নয়):** -- `banned` — নিষিদ্ধ-কীওয়ার্ড / অ্যাকাউন্ট-ব্যান শনাক্তকরণের মাধ্যমে সেট করা হয় ([BAN_DETECTION](../security/BAN_DETECTION.md) দেখুন), এবং আপস্ট্রিমের পরপর তিনটি প্রতি-অনুরোধ প্রত্যাখ্যানের মাধ্যমেও (`request_rejected`, যেমন Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); একটি একক প্রত্যাখ্যান কেবল সংযোগটিকে কুলডাউনে রাখে -- `expired` (সীমিত সংখ্যক পুনঃচেষ্টার পর চূড়ান্ত অবস্থায় রূপান্তরিত হয় — এক্সপোনেনশিয়াল ব্যাকঅফসহ `EXPIRED_RETRY_MAX = 3` — যাতে ক্ষণস্থায়ী OAuth ত্রুটিগুলো অ্যাকাউন্টটি স্থায়ীভাবে নিষ্ক্রিয় হওয়ার আগে নিজে থেকেই সেরে উঠতে পারে) +- `banned` — নিষিদ্ধ-কীওয়ার্ড / অ্যাকাউন্ট-ব্যান শনাক্তকরণ (দেখুন [BAN_DETECTION](../security/BAN_DETECTION.md)) এবং পরপর তিনটি আপস্ট্রিম প্রতি-অনুরোধ প্রত্যাখ্যানের (`request_rejected`, যেমন Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`) ক্ষেত্রে সেট করা হয়; একটি মাত্র প্রত্যাখ্যান শুধু সংযোগটিকে কুলডাউনে রাখে +- `expired` (সীমাবদ্ধ সংখ্যক পুনঃচেষ্টার পরে টার্মিনাল অবস্থায় রূপান্তরিত হয় — সূচকীয় ব্যাকঅফসহ `EXPIRED_RETRY_MAX = 3` — যাতে সাময়িক OAuth ত্রুটিগুলো অ্যাকাউন্ট স্থায়ীভাবে নিষ্ক্রিয় হওয়ার আগে নিজে থেকেই সেরে উঠতে পারে) - `credits_exhausted` -ক্রেডেনশিয়াল পরিবর্তন না হওয়া বা কোনো অপারেটর এগুলো রিসেট না করা পর্যন্ত এই অবস্থাগুলো বজায় থাকে। ক্ষণস্থায়ী কুলডাউন অবস্থা দিয়ে চূড়ান্ত অবস্থাগুলো ওভাররাইট করবেন না। +ক্রেডেনশিয়াল পরিবর্তিত না হওয়া বা কোনো অপারেটর এগুলো রিসেট না করা পর্যন্ত এসব অবস্থা বজায় থাকে। সাময়িক কুলডাউন অবস্থা দিয়ে টার্মিনাল অবস্থাগুলো ওভাররাইট করবেন না। -**লেজি পুনরুদ্ধার:** `rateLimitedUntil` অতীত হয়ে গেলে সংযোগটি আবার যোগ্য হয়ে ওঠে। সফলভাবে ব্যবহারের পর `clearAccountError()` সব ত্রুটি-সংক্রান্ত ফিল্ড মুছে দেয়। +**অলস পুনরুদ্ধার:** `rateLimitedUntil` অতিক্রান্ত হলে সংযোগটি আবার যোগ্য হয়ে ওঠে। সফলভাবে ব্যবহৃত হলে `clearAccountError()` সব ত্রুটি ফিল্ড মুছে দেয়। + +### Claude OAuth ব্যবহারসীমা: নিম্ন-অগ্রাধিকার লেন + সেশন-সীমা রিসেট + +**পরিধি:** একটি Claude সাবস্ক্রিপশন (OAuth) সংযোগ। উভয় বৈশিষ্ট্যই **প্রতি সংযোগে অপ্ট-ইন** +(Edit connection → Claude section → `providerSpecificData`-তে `lowPriorityMode` / +`autoLimitReset`, উভয়ই ডিফল্টভাবে বন্ধ) এবং Claude Code-এর `/low-priority` ও +`/limit-reset` কমান্ডের অনুরূপ (Claude Code 2.1.263 থেকে ওয়্যার কনট্র্যাক্ট ধারণ করা হয়েছে)। + +**বাস্তবায়ন:** + +- স্টেট মেশিন + রেসপন্স শ্রেণিবিন্যাস: `open-sse/services/claudeLowPriority.ts` +- রিসেট স্ট্যাটাস/ক্লেইম ক্লায়েন্ট: `open-sse/services/claudeLimitReset.ts` +- এক্সিকিউটর হুক (হেডার ইনজেকশন + একই-অ্যাকাউন্টে পুনঃচেষ্টা): `open-sse/executors/base.ts::execute()` +- অপ্ট-ইন স্থায়ীকরণ: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**ট্রিগার:** 5-ঘণ্টার ব্যবহারসীমা — এমন একটি `429`, যার হেডারগুলোতে +`anthropic-ratelimit-unified-status: rejected` এবং অ্যাকাউন্টটি যোগ্য হলে +`anthropic-ratelimit-unified-slow-offer: treatment` থাকে। ওই প্রথম সীমা-সংক্রান্ত +429-এর আগে কিছুই পাঠানো হয় না; ইউনিফায়েড হেডারবিহীন একটি আকস্মিক 429 স্বাভাবিক কুলডাউন পথে যায়। + +**নিম্ন-অগ্রাধিকার লেন** (`lowPriorityMode`): + +- সীমা-সংক্রান্ত 429 এলে এক্সিকিউটর অফারটি গ্রহণ করে এবং অবিলম্বে **একই** + অ্যাকাউন্টে `anthropic-usage-limit: slow` সহ পুনঃচেষ্টা করে; ঘোষিত + `anthropic-ratelimit-unified-reset` (+60s অতিরিক্ত সময়) পর্যন্ত লেনটি সক্রিয় থাকে এবং + ওই সময়সীমার প্রতিটি অনুরোধে হেডারটি থাকে। বাধাপ্রাপ্ত 429 কখনো `handleChatCore`-এ + পৌঁছায় না, তাই সংযোগটিকে কুলডাউনে রাখা হয় **না** এবং অন্য সংযোগে ঘোরানোও হয় না। +- পরবর্তী রেসপন্সগুলোতে `anthropic-ratelimit-unified-slow-status`: `active` / `not_needed` + লেনটি বজায় রাখে; `slot_busy` (429) বা একটি `529` হলে সার্ভারের + `anthropic-ratelimit-unified-slow-retry-after` পর্যন্ত অপেক্ষা করে (ডিফল্ট 20s, সীমা 5–600s, ±30% জিটার) + এবং পুনঃচেষ্টা করে, যা `anthropic-ratelimit-unified-slow-max-wait` দ্বারা সীমাবদ্ধ (ডিফল্ট 20 min, সীমা + 1 min–6 h) — এর বেশি হলে লেনটি শেষ হয় এবং 10-মিনিটের কুল-অফ পুনরায় গ্রহণ অবরুদ্ধ করে। + অপেক্ষার সময়টি অনুরোধটির নিজস্ব আপস্ট্রিম-শুরুর টাইমআউটের অবশিষ্ট সময় + (`resolveFetchStartTimeout`, ডিফল্টভাবে 10 min) থেকে 5 s মার্জিন বাদ দিয়েও সীমাবদ্ধ করা হয়: এই সীমা না থাকলে + ডিফল্ট 20-মিনিটের সর্বোচ্চ অপেক্ষা অনুরোধটির চেয়ে বেশি স্থায়ী হতো এবং অপেক্ষার মাঝপথে স্লিপ বাতিল হয়ে + মার্জিত `max_wait` সমাপ্তি + কুল-অফের পরিবর্তে একটি `TimeoutError` প্রকাশ করত। +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, 5h-উইন্ডোর রোলওভার, অথবা + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (যা যেকোনো স্ট্যাটাসে এটিকে + `extra_usage` হিসেবে শেষ করে, কারণ অর্থপ্রদত্ত অতিরিক্ত ব্যবহার এখন সীমাটি কভার করে) লেনটি শেষ করে; + এরপর রেসপন্সটি স্বাভাবিক কুলডাউন পথে প্রবাহিত হয়। ঘোষিত বাজেট রিসেট (≤ 8 days) পর্যন্ত + `budget_exhausted` মনে রাখা হয়। +- এক্সিকিউটরের নিজস্ব 400-চালিত একই-প্রচেষ্টার পুনঃচেষ্টাগুলোর (কনটেক্সট + সম্পাদনা, চিন্তা/প্রচেষ্টা সীমাবদ্ধকরণ, প্যারামিটার স্বয়ংক্রিয়-শেখা) পরে সীমা যাচাই চলে, তাই কেবল + ওই পুনঃচেষ্টাগুলোর কোনো একটিতে প্রকাশ পাওয়া সীমা-সংক্রান্ত 429-ও কুলডাউন পথে পৌঁছানোর পরিবর্তে বাধাপ্রাপ্ত হয়। +- স্টেটটি প্রতি সংযোগের জন্য ইন-মেমোরিতে থাকে (রিস্টার্টের ফলে পুনরায় গ্রহণ করতে একটি অতিরিক্ত সীমা-সংক্রান্ত 429 লাগে)। + +**সেশন-সীমা রিসেট** (`autoLimitReset`, উভয়টি চালু থাকলে লেনের আগে চেষ্টা করা হয়): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + ব্লক; যখন `arm: "reset"` এবং `available: true`, + তখন `{ "program": "juniper_tide" }` সহ + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` + (`providerSpecificData.organizationUUID` থেকে প্রতিষ্ঠানের UUID, বুটস্ট্র্যাপ ফলব্যাক)। +- `result: reset|not_limited` → অনুরোধটি পূর্ণ গতিতে পুনরায় চেষ্টা করা হয় (কোনো স্লো হেডার ছাড়া)। + `already_used` / `not_offered` `next_available_at` মনে রাখে (ডিফল্ট এক সপ্তাহ); যেকোনো + ব্যর্থতায় 15 মিনিট ব্যাকঅফ হয়। রিসেটটি সপ্তাহে একবার এবং তারপরও সাপ্তাহিক সীমার হিসাবে গণ্য হয়। + +রিগ্রেশন প্রতিরোধ পরীক্ষা: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`। ### সেশন অ্যাফিনিটি (#7274) -**পরিধি:** একটি সংযোগের সঙ্গে পিন করা একটি ক্লায়েন্ট সেশন (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` হেডার), **যেকোনো** প্রোভাইডারের জন্য। +**পরিধি:** **যেকোনো** প্রোভাইডারের ক্ষেত্রে একটি ক্লায়েন্ট সেশন (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` হেডার) একটি সংযোগে পিন করা থাকে। -**উদ্দেশ্য:** একটি মাল্টি-টার্ন এজেন্টকে (Claude Code, aider, কাস্টম এজেন্ট) বিভিন্ন অনুরোধজুড়ে একই অ্যাকাউন্টে রাখা, ফলে ক্রস-অ্যাকাউন্ট কনটেক্সট হারানো এবং প্রতি-অ্যাকাউন্ট সেশন স্টেটযুক্ত প্রোভাইডারগুলোতে বারবার কোল্ড-স্টার্ট 429 হওয়া কমে। +**উদ্দেশ্য:** অনুরোধগুলোর মধ্যে একটি মাল্টি-টার্ন এজেন্টকে (Claude Code, aider, কাস্টম এজেন্ট) একই অ্যাকাউন্টে রাখা, যাতে প্রতি-অ্যাকাউন্ট সেশন স্টেট থাকা প্রোভাইডারগুলোতে ক্রস-অ্যাকাউন্ট কনটেক্সট হারানো এবং বারবার কোল্ড-স্টার্ট 429 কমে। **বাস্তবায়ন:** - TTL নির্ধারণ: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - পিন নির্বাচন/তৈরি: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - হেডার নিষ্কাশন (সাধারণ, যেকোনো প্রোভাইডার): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- সংরক্ষিত পিন টেবিল: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- সেটিং: `sessionAffinityTtlMs` (ms-এ গ্লোবাল TTL, `0` নিষ্ক্রিয় করে) — `src/lib/db/settings.ts`। মাইগ্রেশন `124_generic_session_affinity_ttl.sql` দ্বারা কেবল Codex-এর জন্য ব্যবহৃত `codexSessionAffinityTtlMs` নামটি পরিবর্তন করা হয়েছে; এটি আগে কনফিগার করা যেকোনো Codex TTL-কে নতুন ডিফল্ট হিসেবে বহন করে। +- স্থায়ীভাবে সংরক্ষিত পিন টেবিল: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- সেটিং: `sessionAffinityTtlMs` (ms-এ গ্লোবাল TTL, `0` নিষ্ক্রিয় করে) — `src/lib/db/settings.ts`। মাইগ্রেশন `124_generic_session_affinity_ttl.sql`-এর মাধ্যমে শুধু Codex-এর জন্য ব্যবহৃত `codexSessionAffinityTtlMs` থেকে এর নাম পরিবর্তন করা হয়েছে; এটি আগে কনফিগার করা যেকোনো Codex TTL-কে নতুন ডিফল্ট হিসেবে বহন করে। -#7274-এর আগে, `resolveSessionAffinityTtlMs()` `codex` ছাড়া প্রতিটি প্রোভাইডারের জন্য সরাসরি `0` ফেরত দিত, ফলে পিনিং ব্যবস্থা ও হেডার নিষ্কাশন আগে থেকেই প্রোভাইডার-স্বাধীন হওয়া সত্ত্বেও TTL সেটিংটির (এবং সেশন হেডারগুলোর) অন্য কোথাও কোনো প্রভাব ছিল না। সংশোধনটি সেই আগাম রিটার্ন সরিয়ে দিয়েছে; এখন TTL গ্লোবালভাবে `0`-এর বেশি সেট করা হলে তা প্রতিটি প্রোভাইডারের ক্ষেত্রে সমানভাবে প্রযোজ্য হয়। +#7274-এর আগে, `codex` ছাড়া অন্য প্রতিটি প্রোভাইডারের জন্য `resolveSessionAffinityTtlMs()` সরাসরি `0` রিটার্ন করত, ফলে পিনিং ব্যবস্থা এবং হেডার নিষ্কাশন আগে থেকেই প্রোভাইডার-নিরপেক্ষ হওয়া সত্ত্বেও TTL সেটিং (এবং সেশন হেডারগুলো) অন্য কোথাও কোনো প্রভাব ফেলত না। সংশোধনটি সেই আগাম রিটার্ন সরিয়ে দিয়েছে; এখন TTL-কে গ্লোবালি `0`-এর বেশি সেট করা হলে এটি সব প্রোভাইডারের ক্ষেত্রে সমভাবে প্রযোজ্য হয়। -তিনটি সেশন-অ্যাফিনিটি হেডারের কোনোটিই কখনো আপস্ট্রিমে ফরোয়ার্ড করা হয় না — এক্সিকিউটরগুলো ক্লায়েন্ট হেডার পাস-থ্রু করার পরিবর্তে শুরু থেকে নিজেদের আপস্ট্রিম হেডার তৈরি করে, তাই এটি কেবল একটি অভ্যন্তরীণ কোরিলেশন আইডি হিসেবেই থাকে। +তিনটি সেশন-অ্যাফিনিটি হেডার কখনোই আপস্ট্রিমে ফরওয়ার্ড করা হয় না — এক্সিকিউটরগুলো ক্লায়েন্ট হেডার সরাসরি পাঠানোর পরিবর্তে শুরু থেকে নিজেদের আপস্ট্রিম হেডার তৈরি করে, তাই এটি শুধুই একটি অভ্যন্তরীণ কোরিলেশন আইডি হিসেবে থাকে। -### এক্সক্লুসিভ ম্যানেজড সেশন সংযোগ লিজ +### এক্সক্লুসিভ ম্যানেজড সেশন কানেকশন লিজ -**পরিধি:** একটি সক্রিয় ম্যানেজড HTTP ক্লায়েন্ট/সেশন একটি যোগ্য OmniRoute সংযোগের মালিক হয়। +**পরিধি:** একটি সক্রিয় ম্যানেজড HTTP ক্লায়েন্ট/সেশন একটি যোগ্য OmniRoute কানেকশনের মালিক হয়। -**উদ্দেশ্য:** যেসব ক্লায়েন্টের বিভিন্ন অনুরোধজুড়ে একটি কঠোর রাউটিং -সীমানা প্রয়োজন, তাদের জন্য টেকসই এক্সক্লুসিভ সংযোগ-মালিকানা প্রদান করা। এটি সেশন অ্যাফিনিটি থেকে আলাদা, যা একটি নমনীয় ধারাবাহিকতা-সংক্রান্ত অগ্রাধিকার: -একটি এক্সক্লুসিভ লিজ SQLite-এ লাইফসাইকেল স্টেট সংরক্ষণ করে, গ্লোবাল সক্রিয়-মালিক ও -সক্রিয়-সংযোগের অনন্যতা বলবৎ করে এবং প্রোভাইডারে ডিসপ্যাচের আগে একটি পুরোনো জেনারেশন প্রত্যাখ্যান করে। +**উদ্দেশ্য:** যেসব ক্লায়েন্টের অনুরোধগুলোর মধ্যে একটি কঠোর রাউটিং সীমা প্রয়োজন, তাদের জন্য টেকসই এক্সক্লুসিভ কানেকশন মালিকানা প্রদান করা। এটি সেশন অ্যাফিনিটি থেকে আলাদা, কারণ সেশন অ্যাফিনিটি হলো ধারাবাহিকতা বজায় রাখার একটি নমনীয় অগ্রাধিকার: একটি এক্সক্লুসিভ লিজ SQLite-এ লাইফসাইকেল স্টেট স্থায়ীভাবে সংরক্ষণ করে, গ্লোবাল সক্রিয়-মালিক ও সক্রিয়-কানেকশনের স্বতন্ত্রতা বলবৎ করে এবং প্রোভাইডারে পাঠানোর আগে একটি পুরোনো জেনারেশন প্রত্যাখ্যান করে। -ফিচারটি প্রতি API key-এর জন্য অপ্ট-ইন। একটি ম্যানেজড কী-এর অবশ্যই `lease:exclusive` স্কোপ এবং একটি -স্পষ্টভাবে নির্ধারিত অ-ফাঁকা `allowedConnections` তালিকা থাকতে হবে। যেকোনো HTTP ক্লায়েন্ট লাইফসাইকেল এন্ডপয়েন্ট ব্যবহার করতে পারে; কোনো -ক্লায়েন্টের নাম, user-agent, প্রোভাইডার, OAuth পদ্ধতি বা মডেলের প্রয়োজন নেই। লিজটি একটি সংযোগের মালিক, -কোনো মডেলের নয়; তাই সংযোগটি সাধারণভাবে -যোগ্য থাকা পর্যন্ত মডেল পরিবর্তন হলেও বাইন্ডিং বজায় থাকে। স্বাভাবিক মডেল, কোটা, স্বাস্থ্য, কুলডাউন ও অ্যালাওলিস্টের নিয়মগুলো কর্তৃত্বপূর্ণ থাকে এবং -একই জেনারেশনকে অন্য কোনো মুক্ত যোগ্য সংযোগে স্থানান্তর করতে পারে। +ফিচারটি প্রতিটি API কী-এর জন্য আলাদাভাবে অপ্ট-ইন করতে হয়। একটি ম্যানেজড কী-এর অবশ্যই `lease:exclusive` স্কোপ এবং একটি স্পষ্টভাবে নির্ধারিত, খালি নয় এমন `allowedConnections` তালিকা থাকতে হবে। যেকোনো HTTP ক্লায়েন্ট লাইফসাইকেল এন্ডপয়েন্ট ব্যবহার করতে পারে; কোনো ক্লায়েন্টের নাম, ইউজার-এজেন্ট, প্রোভাইডার, OAuth পদ্ধতি বা মডেলের প্রয়োজন নেই। লিজটি একটি কানেকশনের মালিক হয়, কোনো মডেলের নয়; তাই কানেকশনটি সাধারণভাবে যোগ্য থাকা অবস্থায় মডেল পরিবর্তন হলেও বাইন্ডিং বজায় থাকে। স্বাভাবিক মডেল, কোটা, স্বাস্থ্য, কুলডাউন এবং অ্যালাউলিস্টের নিয়মগুলোই চূড়ান্ত কর্তৃত্ব বজায় রাখে এবং একই জেনারেশনকে অন্য একটি মুক্ত ও যোগ্য কানেকশনে স্থানান্তর করতে পারে। -লাইফসাইকেলটি হলো `POST /api/v1/session-leases`, যেখানে JSON অ্যাকশন হিসেবে `acquire`, `renew` এবং `release` ব্যবহৃত হয়। -ম্যানেজড ইনফারেন্স অনুরোধগুলো অস্বচ্ছ `X-OmniRoute-Lease-Owner` মান এবং হুবহু -`X-OmniRoute-Lease-Generation` উপস্থাপন করে। মালিকের মানটি `vlo_` দিয়ে শুরু হয়, এরপর থাকে 43টি base64url অক্ষর; কেবল -এর SHA-256 হ্যাশ সংরক্ষণ করা হয়। প্রতিটি চূড়ান্ত ডিসপ্যাচ সীমানা প্রমাণীকৃত API key ID এবং -সক্রিয় connection ID-কেও আবদ্ধ করে। লিজ নিয়ন্ত্রণ হেডারগুলো লগ, সংরক্ষিত অনুরোধ স্ন্যাপশট এবং -আপস্ট্রিম এক্সিকিউটর হেডার থেকে সরিয়ে ফেলা হয়। +লাইফসাইকেলটি হলো JSON অ্যাকশন `acquire`, `renew` এবং `release`-সহ `POST /api/v1/session-leases`। ম্যানেজড ইনফারেন্স অনুরোধগুলো অস্বচ্ছ `X-OmniRoute-Lease-Owner` মান এবং হুবহু `X-OmniRoute-Lease-Generation` উপস্থাপন করে। মালিকের মানে `vlo_`-এর পরে 43টি base64url অক্ষর থাকে; কেবল এর SHA-256 হ্যাশ সংরক্ষণ করা হয়। প্রতিটি চূড়ান্ত ডিসপ্যাচ ফেন্স প্রমাণীকৃত API কী আইডি এবং সক্রিয় কানেকশন আইডিও আবদ্ধ করে। লিজ কন্ট্রোল হেডারগুলো লগ, সংরক্ষিত অনুরোধের স্ন্যাপশট এবং আপস্ট্রিম এক্সিকিউটর হেডার থেকে সরিয়ে ফেলা হয়। -সাধারণ রাউটিংয়ে যোগ্য ম্যানেজড প্রার্থী থাকলেও প্রতিটি মুক্ত প্রার্থী যদি -অন্য কোনো সক্রিয় লিজের দখলে থাকে, তবে OmniRoute HTTP `429`, লিজ-ক্যাপাসিটি-অনুপলভ্য কোড, একটি -ক্যাপাসিটির-জন্য-অপেক্ষমাণ অবস্থা এবং প্রাসঙ্গিক সবচেয়ে কাছের মেয়াদোত্তীর্ণ সময় থেকে নির্ধারিত সীমাবদ্ধ `Retry-After` ফেরত দেয়। -সাধারণভাবে কোনো যোগ্যতা না থাকা লিজ-দ্বন্দ্ব নয় এবং এর বিদ্যমান রাউটিং ত্রুটির অর্থ অপরিবর্তিত রাখে। +সাধারণ রাউটিংয়ে যোগ্য ম্যানেজড প্রার্থী থাকলেও যদি প্রতিটি মুক্ত প্রার্থী অন্য কোনো সক্রিয় লিজের দখলে থাকে, তাহলে OmniRoute HTTP `429`, লিজ-ক্যাপাসিটি-অনুপলভ্য কোড, ক্যাপাসিটির-জন্য-অপেক্ষমাণ স্টেট এবং প্রাসঙ্গিক নিকটতম মেয়াদ শেষ হওয়ার সময় থেকে নির্ধারিত একটি সীমাবদ্ধ `Retry-After` রিটার্ন করে। সাধারণভাবে কোনো যোগ্য প্রার্থী না থাকা লিজ বিরোধ নয় এবং সে ক্ষেত্রে বিদ্যমান রাউটিং ত্রুটির অর্থ অপরিবর্তিত থাকে। সংশ্লিষ্ট প্রক্রিয়াগুলো পৃথক থাকে: -- OAuth সেশন দখল হলো OAuth অ্যাকাউন্টগুলোর জন্য প্রসেস-লোকাল নমনীয় বণ্টন। -- অ্যাকাউন্ট সেমাফোর অনুরোধ-সমকালীনতার পারমিট দেয় এবং কোনো অনুরোধ সম্পন্ন হলে শেষ হয়। -- এক্সক্লুসিভ ম্যানেজড সেশন লিজ হলো একটি জেনারেশন সীমানাসহ টেকসই লাইফসাইকেল মালিকানা। +- OAuth সেশন অকুপেন্সি হলো OAuth অ্যাকাউন্টগুলোর জন্য প্রসেস-লোকাল নমনীয় বণ্টন। +- অ্যাকাউন্ট সেমাফোরগুলো অনুরোধের কনকারেন্সি পারমিট দেয় এবং একটি অনুরোধ সম্পন্ন হলে শেষ হয়। +- এক্সক্লুসিভ ম্যানেজড সেশন লিজ হলো একটি জেনারেশন ফেন্সসহ টেকসই লাইফসাইকেল মালিকানা। --- @@ -280,49 +323,77 @@ concurrency** (`resilienceSettings.quotaShareConcurrencyLimit.enabled`, ডি --- -## 5. অনুরোধ কিউয়ে প্রবেশ নিয়ন্ত্রণ (v3.8.49 · ইস্যু #6593) - -**পরিধি**: স্থানীয় প্রতি-প্রোভাইডার+সংযোগ রেট-লিমিট কিউ -(`open-sse/services/rateLimitManager.ts`, Bottleneck দ্বারা সমর্থিত), যা উপরের -তিনটি প্রক্রিয়ার এক স্তর নিচে অবস্থিত। - -**`maxWaitMs` এক্সিকিউশন মেয়াদোত্তীর্ণতার জন্য ব্যবহৃত একটি পুরোনো সংরক্ষিত নাম।** -`resilienceSettings.requestQueue.maxWaitMs`-কে Bottleneck-এর কাছে একটি জব -`expiration` হিসেবে পাঠানো হয়, যার টাইমার শুধু ডিসপ্যাচের পরে শুরু হয়। ফলে এটি -স্থানীয় কিউতে কাটানো সময় নয়, বরং লিমিটার-পরিচালিত এক্সিকিউশনের সীমা নির্ধারণ করে। -মেয়াদোত্তীর্ণতা বিশ্বস্ত স্থানীয় `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) -হিসেবে প্রকাশিত হয়; আগের কিউ-টাইমআউট কোডের নামটি শুধু বিশ্বস্ত অভ্যন্তরীণ -পশ্চাৎ-সামঞ্জস্যের জন্য গ্রহণ করা হয়। ডিফল্ট মান 15000ms; `RATE_LIMIT_MAX_WAIT_MS` -(env) অথবা ড্যাশবোর্ডের (**Settings → Resilience**, UI-তে সর্বোচ্চ 1–30000ms) -মাধ্যমে ওভাররাইড করুন। কিউতে অবস্থানের কোনো সময়সীমা নেই; কিউতে অপেক্ষমাণ -কলারের সংখ্যা সীমাবদ্ধ করতে নিচের `maxQueueDepth` ব্যবহার করুন। - -**`maxQueueDepth` — ঐচ্ছিক প্রবেশসীমা (নতুন)।** `resilienceSettings.requestQueue.maxQueueDepth` -একটি provider+connection-এর জন্য একসঙ্গে কতগুলো অনুরোধ কিউতে থাকতে পারবে -(এখনো ডিসপ্যাচ হয়নি), তার সীমা নির্ধারণ করে। যখন কিউতে ইতিমধ্যে `maxQueueDepth` -সংখ্যক অনুরোধ থাকে, তখন একটি নতুন অনুরোধ `limiter.schedule()`-এ পৌঁছানোর -**আগেই** টাইপযুক্ত `code: "RATE_LIMIT_QUEUE_FULL"` ত্রুটিসহ দ্রুত প্রত্যাখ্যাত হয় -— ফলে প্রত্যাখ্যানটি কম খরচে সম্পন্ন হয় এবং সেই অনুরোধের জন্য কোনো ডাউনস্ট্রিম -প্রম্পট-কম্প্রেশন / অনুবাদ কাজের আগেই ঘটে। ডিফল্ট `0` = নিষ্ক্রিয়, যা বিদ্যমান -সীমাহীন-কিউ আচরণ বজায় রাখে; সীমা 0–100000। `RATE_LIMIT_MAX_QUEUE_DEPTH` -(env) অথবা `resilienceSettings.requestQueue.maxQueueDepth` (ড্যাশবোর্ড/API প্যাচ)-এর +## 5. রিকোয়েস্ট কিউ অ্যাডমিশন কন্ট্রোল (v3.8.49 · issue #6593) + +**পরিধি**: স্থানীয় প্রতি-provider+connection রেট-লিমিট কিউ (`open-sse/services/rateLimitManager.ts`, +Bottleneck দ্বারা সমর্থিত), উপরের তিনটি ব্যবস্থার এক স্তর নিচে। + +**`maxWaitMs` কিউতে অপেক্ষার সীমা নির্ধারণ করে; `executionMaxWaitMs` এক্সিকিউশনের সীমা নির্ধারণ করে।** +দুটিকে ইচ্ছাকৃতভাবে আলাদা রাখা হয়েছে এবং কোনোটিই অন্যটিকে প্রভাবিত করে না। + +`resilienceSettings.requestQueue.maxWaitMs` হলো **কিউতে অপেক্ষার বাজেট**: এটি +provider স্লটের জন্য অপেক্ষা করা এবং তারপর QUEUED অবস্থায় থাকার সময়কে অন্তর্ভুক্ত +করে, এবং জবটি QUEUED অবস্থা ছেড়ে এক্সিকিউশন শুরু করার মুহূর্তেই এর টাইমার +মুছে ফেলা হয় (`rateLimitManager.ts`, `wrappedFn`)। কোনো রিকোয়েস্ট এটি অতিক্রম +করলে সেটি কখনোই আপস্ট্রিমে পৌঁছায় না। ডিফল্ট 30000ms, যা +`src/lib/resilience/settings.ts`-এর `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` দ্বারা +সরবরাহ করা হয় এবং `tests/unit/ratelimit-admission-control-6593.test.ts` দ্বারা +স্থির করা আছে, ফলে এটি পরিবর্তন করলে এই অনুচ্ছেদটি নীরবে পুরোনো হয়ে থাকার +পরিবর্তে ওই টেস্টটি ব্যর্থ হবে। + +`resilienceSettings.requestQueue.executionMaxWaitMs` হলো সেই মান, যা Bottleneck +জবের `expiration` হিসেবে গ্রহণ করে; এর টাইমার শুধু ডিসপ্যাচের পর শুরু হয়। যেসব +এক্সিকিউটরের নিজস্ব আপস্ট্রিম টাইমআউট নেই, তাদের জন্য এটি একটি সুরক্ষামূলক +শেষ ব্যবস্থা, এবং এক্সিকিউটরের নিজস্ব fetch-start টাইমআউট বেশি হলে এটিকে সেই +মান পর্যন্ত বাড়ানো হয়, যাতে এটি চলমান কোনো সুস্থ রেসপন্স বন্ধ করে দিতে না +পারে। ডিফল্ট 600000ms (10 মিনিট)। + +কিউ বাজেটকে `expiration`-এ দেওয়ার কারণেই আগে non-incremental গেটওয়েগুলো +চলমান অবস্থায় বন্ধ হয়ে যেত — প্রথম বাইট আসার আগে সেগুলো বৈধভাবেই কয়েক +মিনিট চলতে পারে — এবং এ কারণেই expiration-কে `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) হিসেবে প্রকাশ করা হয়, অন্যদিকে +কিউ বাজেটের ক্ষেত্রে কিউ-টাইমআউট কোড ব্যবহৃত হয়। `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) অথবা ড্যাশবোর্ডের +(**Settings → Resilience**) মাধ্যমে যেকোনোটি ওভাররাইড করুন। নরমালাইজ করার +সময় উভয় মানই 1ms–24h সীমার মধ্যে আবদ্ধ করা হয়। + +**উভয়ের ক্ষেত্রে অগ্রাধিকার:** env var শুধু _ডিফল্ট_ মান সরবরাহ করে। +`resilienceSettings.requestQueue`-তে সংরক্ষিত কোনো মান (ড্যাশবোর্ড / API patch, +`key_value`-তে সংরক্ষিত) এটিকে অগ্রাহ্য করে, এবং প্রতি-connection +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` সেটিকেও অগ্রাহ্য করে। +অতএব, আগে থেকেই সংরক্ষিত মান রয়েছে এমন কোনো ডিপ্লয়মেন্টে env var সেট করলে +কিছুই পরিবর্তিত হয় না — পরিবর্তে সংরক্ষিত সেটিংটি মুছুন বা আপডেট করুন। + +কিউতে অবস্থানের সময় `maxWaitMs` দ্বারা সীমাবদ্ধ; নিচের `maxQueueDepth` একই +সময়ে কতজন কলার কিউতে থাকতে পারবে তা সীমাবদ্ধ করে। + +**`maxQueueDepth` — ঐচ্ছিক অ্যাডমিশন ক্যাপ (নতুন)।** `resilienceSettings.requestQueue.maxQueueDepth` +একটি provider+connection-এর জন্য একই সময়ে কতটি রিকোয়েস্ট কিউতে (এখনও +ডিসপ্যাচ হয়নি) থাকতে পারবে তা সীমাবদ্ধ করে। কিউতে ইতোমধ্যে +`maxQueueDepth` সংখ্যক রিকোয়েস্ট থাকলে, নতুন রিকোয়েস্টটি টাইপযুক্ত +`code: "RATE_LIMIT_QUEUE_FULL"` এররসহ দ্রুত প্রত্যাখ্যাত হয়, সেটি কখনো +`limiter.schedule()`-এ পৌঁছানোর **আগেই** — ফলে প্রত্যাখ্যানটি কম ব্যয়সাপেক্ষ +এবং ওই রিকোয়েস্টের যেকোনো ডাউনস্ট্রিম prompt-compression / translation কাজের +আগেই ঘটে। ডিফল্ট `0` = নিষ্ক্রিয়, যা বিদ্যমান সীমাহীন-কিউ আচরণ বজায় রাখে; +সীমা 0–100000। `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) অথবা +`resilienceSettings.requestQueue.maxQueueDepth` (ড্যাশবোর্ড/API patch)-এর মাধ্যমে ওভাররাইড করুন। -প্রবেশ যাচাইটি নিজেই একটি পিওর ফাংশন +অ্যাডমিশন যাচাইটি নিজেই একটি pure function (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), তাই -প্রকৃত Bottleneck লিমিটার ছাড়াই এটিকে ইউনিট-টেস্ট করা যায়। - -> যে RFC থেকে #6593 শুরু হয়েছিল, সেটিতে একটি `bypassCompressionOnRateLimit` -> ফ্ল্যাগেরও প্রস্তাব ছিল। এই রিপোর `open-sse/services/compression/` পাইপলাইনটি -> আউটবাউন্ড LLM অনুরোধে প্রম্পট/কনটেক্সট কম্প্রেশনের জন্য (`chatCore.ts`, -> `resolveCompressionSettings`/`selectCompressionStrategy` ব্লকের আশেপাশে), -> সংশ্লেষিত 429 বডিতে HTTP রেসপন্স কম্প্রেশনের জন্য নয় — আক্ষরিক বাইপাস -> ফ্ল্যাগের জন্য কোনো সামঞ্জস্যপূর্ণ কোড পাথ নেই। সেই প্রম্পট-কম্প্রেশন ধাপটিও -> বর্তমানে অনুরোধ পাইপলাইনে `withRateLimit()`-এর _আগে_ চলে, তাই কিউ-পূর্ণ -> প্রত্যাখ্যানের ক্ষেত্রে এটি এড়াতে ধাপগুলোর ক্রম পরিবর্তন করা এই ইস্যুর -> পরিধির তুলনায় আলাদা ও বৃহত্তর পরিবর্তন; এখানে এটি ইচ্ছাকৃতভাবে -> বাস্তবায়ন **করা হয়নি** এবং CPU সাশ্রয়ের সুবিধা যদি পুনর্বিন্যাসের ঝুঁকির -> যোগ্য হয়, তবে ফলো-আপ হিসেবে রেখে দেওয়া হয়েছে। +বাস্তব Bottleneck limiter ছাড়াই এটিকে ইউনিট টেস্ট করা যায়। + +> #6593 শুরু করা RFC-এ একটি `bypassCompressionOnRateLimit` +> ফ্ল্যাগও প্রস্তাব করা হয়েছিল। এই repo-র `open-sse/services/compression/` +> পাইপলাইনটি আউটবাউন্ড LLM রিকোয়েস্টের prompt/context compression +> (`chatCore.ts`, `resolveCompressionSettings`/`selectCompressionStrategy` +> ব্লকের আশপাশে), synthesized 429 body-র HTTP response compression নয় — +> তাই আক্ষরিক bypass ফ্ল্যাগের জন্য কোনো মিলে যাওয়া কোড পাথ নেই। ওই +> prompt-compression ধাপটিও বর্তমানে রিকোয়েস্ট পাইপলাইনে `withRateLimit()`-এর +> _আগে_ চলে, তাই queue-full প্রত্যাখ্যানের ক্ষেত্রে এটি এড়াতে ধাপগুলোর ক্রম +> পরিবর্তন করা এই issue-এর পরিধির তুলনায় আলাদা ও বড় পরিবর্তন; এখানে এটি +> ইচ্ছাকৃতভাবে বাস্তবায়ন **করা হয়নি** এবং CPU সাশ্রয়ের সুবিধাটি যদি +> পুনর্বিন্যাসের ঝুঁকির উপযুক্ত হয়, তবে এটিকে follow-up হিসেবে রেখে দেওয়া হয়েছে। --- diff --git a/docs/i18n/bn/docs/architecture/admission-lanes.md b/docs/i18n/bn/docs/architecture/admission-lanes.md index 06995d05bbb2..d7e53cae73e6 100644 --- a/docs/i18n/bn/docs/architecture/admission-lanes.md +++ b/docs/i18n/bn/docs/architecture/admission-lanes.md @@ -7,48 +7,19 @@ OmniRoute-এ ভিন্ন পরিসরের **দুটি** প্রক্রিয়া-স্থানীয় লেন সিস্টেম রয়েছে। এগুলো পরস্পরের পরিপূরক; অপারেটরদের জানা উচিত তারা কোনটি দেখছেন। -## ১. বাইট-স্তরের প্রক্রিয়া-ব্যাপী অ্যাডমিশন (`chatBodyAdmission.ts`) - -- **পরিসর:** `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` এবং অন্যান্য চ্যাট-আকৃতির রুটের জন্য বাফার করা বডি/হিপ পাথ। বড় কোডিং-এজেন্ট বডি থেকে সৃষ্ট - হিপ অ্যামপ্লিফিকেশন প্রতিরোধ করে (#4380)। -- **প্রতি-কী লেন নয়, একটি প্রক্রিয়া-গ্লোবাল কন্ট্রোলার (#10110)।** প্রতিটি API কী - (হ্যাশ করা) বা `anonymous` সেশন **একই** শেয়ার করা বাজেটের বিপরীতে অ্যাডমিট হয় — - হ্যাশ করা সেশন আইডি শুধুমাত্র ন্যায্যতা-ভিত্তিক শিডিউলিং কী হিসেবে ব্যবহৃত হয় (অপেক্ষমাণদের মধ্যে রাউন্ড-রবিন - ডিসপ্যাচ), কখনোই ক্যাপাসিটি শার্ড হিসেবে নয়। এই ডকের আগের একটি সংস্করণে - স্বাধীন ক্যাপাসিটিসহ প্রতি-কী লেনের বর্ণনা ছিল; সেই মডেলটি - #10110-এ সরিয়ে দেওয়া হয়েছে, কারণ এটি অননুমোদিত ভুয়া ক্রেডেনশিয়ালকে - প্রক্রিয়া-ব্যাপী সীমা বহুগুণ বাড়ানোর সুযোগ দিত। -- **গেট (#503-fanout): স্বয়ংক্রিয়ভাবে নির্ধারিত ইনজেস্ট BYTE বাজেট, নির্দিষ্ট রিকোয়েস্ট - সংখ্যা নয়।** পুরোনো `CHAT_MAX_HEAVY_IN_FLIGHT` রিকোয়েস্ট-সংখ্যা সীমা (এই সংশোধনের - আগে ডিফল্ট `1`) কোডিং-এজেন্ট ফ্যান-আউটকে (একাধিক সাবএজেন্ট/CLI, - যেখানে বডি নিয়মিতভাবে > 256 KB) কার্যত ~1 সমসাময়িকতায় নামিয়ে আনত, যার ফলে - সম্পূর্ণ স্বাভাবিক লোডেও 503 ঘটত। এখন এটি কেবল তখনই প্রযোজ্য হয়, যখন কোনো অপারেটর স্পষ্টভাবে - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` সেট করেন। এটি সেট না করা থাকলে, অ্যাডমিশন পরিবর্তে - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` দ্বারা নিয়ন্ত্রিত হয় — এটি প্রক্রিয়াটির - প্রকৃত মেমরি সীমা (`src/shared/middleware/admissionBudget.ts`) থেকে স্বয়ংক্রিয়ভাবে নির্ধারিত একটি বাজেট: - V8 হিপ সীমা এবং যেকোনো cgroup/কনটেইনার সীমার মধ্যে যেটি কম, তার 25%, - একটি 8x অস্থায়ী-অ্যামপ্লিফিকেশন ফ্যাক্টর দিয়ে ভাগ করা হয় এবং 8 MiB থেকে - 2 GiB-এর মধ্যে সীমাবদ্ধ রাখা হয়। স্পষ্ট ওভাররাইডেও একই সীমা প্রয়োগ করা হয়। কোনো env টিউনিং ছাড়াই এটি - 512 MB কনটেইনার থেকে 32 GB ডেস্কটপ পর্যন্ত নিজেকে স্কেল করে। কার্যকর - বাজেটের মধ্যে ফিট না হওয়া বডি অবিলম্বে `413 body_exceeds_budget` সহ ব্যর্থ হয়; - কেবল স্বতন্ত্রভাবে পরিচালনাযোগ্য বডিগুলোর মধ্যকার প্রতিযোগিতাই সীমাবদ্ধ - ন্যায্যতা-কিউতে প্রবেশ করে। একটি লাইভ মাল্টি-সিগন্যাল রিসোর্স-প্রেশার ট্র্যাকার (V8 হিপ অনুপাত, - cgroup, PSI, OOM ইভেন্ট — `open-sse/utils/resourcePressurePolicy.ts`) `high` - চাপের সময় সীমাবদ্ধ অপেক্ষার সময় কমায় এবং `critical` চাপের সময়, - কোনো বাইট ইনজেস্ট হওয়ার আগেই `503 resource_pressure` দিয়ে তাৎক্ষণিকভাবে লোড ঝরিয়ে দেয়। +## 1. বাইট-স্তরের প্রক্রিয়াব্যাপী অ্যাডমিশন (`chatBodyAdmission.ts`) + +- **পরিধি:** `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` এবং অন্যান্য চ্যাট-আকৃতির রুটের buffered-body/heap পাথ। বড় coding-agent বডির কারণে heap amplification থেকে সুরক্ষা দেয় (#4380)। +- **প্রতি-key lane নয়, একটি process-global controller (#10110)।** প্রতিটি API key (hashed) বা `anonymous` session **একই** shared budget-এর বিপরীতে admit হয় — hashed session id কেবল fairness scheduling key হিসেবে ব্যবহৃত হয় (অপেক্ষমাণদের মধ্যে round-robin dispatch), কখনোই capacity shard হিসেবে নয়। এই নথির আগের একটি সংস্করণে স্বতন্ত্র capacity-সহ প্রতি-key lane-এর বর্ণনা ছিল; #10110-এ সেই মডেলটি সরিয়ে দেওয়া হয়েছে, কারণ এটি unauthenticated fake credential ব্যবহার করে process-wide bound বহুগুণ বাড়ানোর সুযোগ দিত। +- **Gate (#503-fanout): স্বয়ংক্রিয়ভাবে নির্ধারিত ingest BYTE budget, নির্দিষ্ট request count নয়।** পুরোনো `CHAT_MAX_HEAVY_IN_FLIGHT` request-count cap (এই সংশোধনের আগে default ছিল `1`) coding-agent fan-out-কে (একাধিক subagent/CLI, নিয়মিতভাবে > 256 KB বডি) কার্যকর concurrency ~1-এ নামিয়ে দিত, ফলে সম্পূর্ণ স্বাভাবিক load-এই 503 দেখা দিত। এখন এটি কেবল তখনই প্রযোজ্য হয়, যখন কোনো operator স্পষ্টভাবে `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` সেট করেন। এটি unset থাকলে admission-এর gate হিসেবে পরিবর্তে `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ব্যবহৃত হয় — একটি budget, যা process-এর প্রকৃত memory ceiling (`src/shared/middleware/admissionBudget.ts`) থেকে স্বয়ংক্রিয়ভাবে নির্ধারিত হয়: V8 heap limit এবং যেকোনো cgroup/container limit-এর মধ্যে যেটি বেশি সীমাবদ্ধ, তার 25%, তারপর 8x transient-amplification factor দিয়ে ভাগ করা হয় এবং 8 MiB থেকে 2 GiB-এর মধ্যে clamp করা হয়। স্পষ্ট override-গুলিতেও একই clamp ব্যবহৃত হয়। কোনো env tuning ছাড়াই এটি 512 MB container থেকে 32 GB desktop পর্যন্ত নিজে থেকেই scale করে। effective budget-এর মধ্যে fit করতে না-পারা কোনো body অবিলম্বে `413 body_exceeds_budget` দিয়ে ব্যর্থ হয়; কেবল স্বতন্ত্রভাবে serviceable body-গুলোর মধ্যে contention-ই bounded fairness queue-তে প্রবেশ করে। একটি live multi-signal resource-pressure tracker (V8 heap ratio, cgroup, PSI, OOM event — `open-sse/utils/resourcePressurePolicy.ts`) `high` pressure-এর সময় bounded wait কমিয়ে দেয় এবং কোনো byte ingest হওয়ার আগেই `critical` pressure-এর সময় `503 resource_pressure` দিয়ে অবিলম্বে load shed করে। উপস্থিত থাকলে PSI এই unit-এর cgroup `memory.pressure` থেকে পড়া হয় (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` host-wide এবং কেবল bare metal / cgroup v1-এ fallback হিসেবে ব্যবহৃত হয়, ফলে swapping host কোনো idle container-কে 503 করাতে পারে না। - **টিউনিং:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — স্বয়ংক্রিয়ভাবে নির্ধারিত বাইট বাজেটের ওভাররাইড - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — পুরোনো রিকোয়েস্ট-সংখ্যা সীমা, শুধুমাত্র অপ্ট-ইন - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503-এর আগে কিউতে অপেক্ষার সময় (ডিফল্ট 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — কিউ করা বাইটের হিপ ভালভ (ডিফল্ট 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110 থেকে অবচিত - নো-অপ (কনফিগ সামঞ্জস্যের জন্য গৃহীত, তবে উপেক্ষিত) -- **রিপোর্ট:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — যার মধ্যে রয়েছে - #503-fanout-এর সংযোজনসমূহ `inflightBytes`, `maxInflightBytes`, `budgetSource` - (`v8_heap` | `cgroup` | `override`), `pressureSeverity` এবং `countCapEnabled` - (ডিফল্ট ডিপ্লয়মেন্টে false — এটি নিশ্চিত করে যে পুরোনো - সংখ্যা সীমা নয়, বাইট বাজেটই প্রকৃতপক্ষে কার্যকর হচ্ছে)। + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — স্বয়ংক্রিয়ভাবে নির্ধারিত byte budget-এর override + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — পুরোনো request-count cap, শুধু opt-in + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503-এর আগে queue-তে অপেক্ষার সময় (default 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — queued-bytes heap valve (default 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110 থেকে deprecated + no-op (config compatibility-এর জন্য গৃহীত, তবে উপেক্ষিত) +- **রিপোর্ট:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — #503-fanout-এ যোগ হওয়া `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` এবং `countCapEnabled`-সহ (default deployment-এ false — এটি নিশ্চিত করে যে বাস্তবে পুরোনো count cap নয়, byte budget-ই সীমা আরোপ করছে)। ## 2. অভিযোজিত রানটাইম ভার্চুয়াল লেন (`open-sse/services/admission`) diff --git a/docs/i18n/bn/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/bn/docs/frameworks/EMBEDDED-SERVICES.md index ecfe9982c3ad..d6169bab0465 100644 --- a/docs/i18n/bn/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/bn/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **সংস্করণ:** v3.8.44 -> **সর্বশেষ হালনাগাদ:** 2026-07-03 -> **পাঠক:** এমবেডেড সার্ভিস (9Router, CLIProxyAPI, Mux, Bifrost) যোগ, রক্ষণাবেক্ষণ বা ডিবাগ করছেন এমন প্রকৌশলীরা। +> **সর্বশেষ হালনাগাদ:** 2026-09-09 +> **উদ্দিষ্ট পাঠক:** এমবেডেড পরিষেবা (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) যোগ, রক্ষণাবেক্ষণ বা ডিবাগ করছেন এমন প্রকৌশলীরা। -এমবেডেড সার্ভিস হলো স্থানীয়ভাবে ইনস্টল করা প্রসেস-সাইডকার টুল, যেগুলো OmniRoute ইনস্টল ও তত্ত্বাবধান করে এবং -প্রথম-শ্রেণির রাউটিং টার্গেট হিসেবে উন্মুক্ত করে। বহিরাগত প্রোভাইডারের বিপরীতে (যেগুলোতে ইন্টারনেটের মাধ্যমে -API key ব্যবহার করে পৌঁছানো হয়), এমবেডেড সার্ভিসগুলো OmniRoute-এর একই মেশিনে চলে এবং loopback-এর মাধ্যমে যোগাযোগ করে। +এমবেডেড পরিষেবা হলো স্থানীয়ভাবে ইনস্টল করা প্রসেস সাইডকার টুল, যেগুলো OmniRoute ইনস্টল ও তত্ত্বাবধান করে এবং +প্রথম-শ্রেণির রাউটিং লক্ষ্য হিসেবে উন্মুক্ত করে। বাহ্যিক প্রদানকারীদের বিপরীতে (যাদের কাছে ইন্টারনেটের মাধ্যমে +API কী ব্যবহার করে পৌঁছানো হয়), এমবেডেড পরিষেবাগুলো OmniRoute-এর একই মেশিনে চলে এবং লুপব্যাকের মাধ্যমে যোগাযোগ করে। --- @@ -27,37 +27,38 @@ API key ব্যবহার করে পৌঁছানো হয়), এম --- -## 1. সংক্ষিপ্ত বিবরণ +## 1. সারসংক্ষেপ -### এমবেডেড সার্ভিস কেন? +### এম্বেডেড সার্ভিস কেন? -পাঁচটি সার্ভিস এমবেড করা আছে: +ছয়টি সার্ভিস এম্বেড করা হয়েছে: -| সার্ভিস | npm প্যাকেজ | ডিফল্ট পোর্ট | উদ্দেশ্য | -| --------------- | --------------------------------- | :----------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI রাউটার, যা OmniRoute একটি সাব-প্রোভাইডার হিসেবে ব্যবহার করতে পারে। মডেলগুলো `9router/{sub}/{model}` হিসেবে উন্মুক্ত করা হয় | -| **CLIProxyAPI** | GitHub রিলিজ বাইনারি (`cliproxy`) | 8317 | Anthropic CLI auth flow-এর জন্য স্থানীয় প্রক্সি অ্যাডাপ্টার। OAuth token-এর মেয়াদ শেষ হলে ফলব্যাক রাউটিং প্রদান করে | -| **Mux** | `mux` (হেডলেস `mux server`) | 8322 | স্থানীয় এজেন্ট-অর্কেস্ট্রেশন ডেমন (coder/mux)। শুধু লাইফসাইকেল ব্যবস্থাপিত — রাউটিং টার্গেট নয় (কোনো LLM প্রক্সিং নেই)। | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-gateway রিলে ব্যাকএন্ড। চলমান থাকলে রিলে রুট (`/v1/relay/`) স্বয়ংক্রিয়ভাবে এটি নির্বাচন করে | -| **Dario** | `@askalf/dario` | 3456 | Claude-subscription প্রক্সি — Claude-Code-আকৃতির ট্রাফিকের জন্য CLIProxyAPI-এর বিকল্প/ফেইলওভার; ইনজেক্ট করা key-টি `DARIO_ADMIN_TOKEN` হয়ে এর `/admin/*` OAuth control plane-এ প্রবেশ নিয়ন্ত্রণ করে | +| সার্ভিস | npm প্যাকেজ | ডিফল্ট পোর্ট | উদ্দেশ্য | +| --------------- | --------------------------------- | :----------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI রাউটার, যা OmniRoute একটি সাব-প্রোভাইডার হিসেবে ব্যবহার করতে পারে। মডেলগুলো `9router/{sub}/{model}` হিসেবে প্রকাশ করা হয় | +| **CLIProxyAPI** | GitHub রিলিজ বাইনারি (`cliproxy`) | 8317 | Anthropic CLI অথেন্টিকেশন ফ্লোর জন্য স্থানীয় প্রক্সি অ্যাডাপ্টার। OAuth টোকেনের মেয়াদ শেষ হলে ফলব্যাক রাউটিং প্রদান করে | +| **Mux** | `mux` (হেডলেস `mux server`) | 8322 | স্থানীয় এজেন্ট-অর্কেস্ট্রেশন ডিমন (coder/mux)। শুধু লাইফসাইকেল পরিচালিত হয় — এটি কোনো রাউটিং টার্গেট নয় (কোনো LLM প্রক্সিং নেই)। | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-গেটওয়ে রিলে ব্যাকএন্ড। চলমান থাকলে রিলে রুট (`/v1/relay/`) দ্বারা স্বয়ংক্রিয়ভাবে নির্বাচিত হয় | +| **Dario** | `@askalf/dario` | 3456 | Claude-সাবস্ক্রিপশন প্রক্সি — Claude-Code-ধাঁচের ট্রাফিকের জন্য CLIProxyAPI-এর বিকল্প/ফেলওভার; ইনজেক্ট করা কীটি `DARIO_ADMIN_TOKEN` হয়ে এর `/admin/*` OAuth কন্ট্রোল প্লেনে প্রবেশ নিয়ন্ত্রণ করে | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web অটোমেশন (Puppeteer-এর মাধ্যমে হেডলেস Chromium)। শুধু লাইফসাইকেল পরিচালিত হয় — এটি কোনো রাউটিং টার্গেট নয়। | -পাঁচটিই একই তত্ত্বাবধান মডেল অনুসরণ করে: +ছয়টিই একই তত্ত্বাবধান মডেল অনুসরণ করে: -- OmniRoute এগুলোকে `DATA_DIR/services/{name}/`-এর অধীনে ইনস্টল করে (OmniRoute-এর নিজস্ব `package.json` থেকে বিচ্ছিন্ন) -- OmniRoute এগুলোকে child process হিসেবে চালু ও পর্যবেক্ষণ করে -- OmniRoute child process-এর environment-এ একটি অস্থায়ী API key ইনজেক্ট করে এবং ডাউনটাইম ছাড়াই সেটি পরিবর্তন করে (যেখানে প্রযোজ্য) -- সব ব্যবস্থাপনা রুট (`/api/services/*`) **LOCAL_ONLY** — শুধু loopback থেকে অ্যাক্সেসযোগ্য (কঠোর নিয়ম #17) +- OmniRoute এগুলোকে `DATA_DIR/services/{name}/`-এর অধীনে ইনস্টল করে (OmniRoute-এর নিজস্ব `package.json` থেকে বিচ্ছিন্নভাবে) +- OmniRoute এগুলোকে চাইল্ড প্রসেস হিসেবে চালু ও পর্যবেক্ষণ করে +- OmniRoute চাইল্ড প্রসেসের এনভায়রনমেন্টে একটি অস্থায়ী API কী ইনজেক্ট করে এবং ডাউনটাইম ছাড়াই সেটি রোটেট করে (যেখানে প্রযোজ্য) +- সব ম্যানেজমেন্ট রুট (`/api/services/*`) **LOCAL_ONLY** — শুধু লুপব্যাক থেকে অ্যাক্সেসযোগ্য (কঠোর নিয়ম #17) ### মূল সিদ্ধান্তসমূহ (ডিজাইন পরিকল্পনা থেকে) -| সিদ্ধান্ত | মান | -| ------------------------------------------------- | ------------------------------------------------------------------------------------------------ | -| 9Router-এর নিজস্ব UI-তে ড্যাশবোর্ডের প্রবেশাধিকার | `/dashboard/providers/services/9router/embed/*`-এ reverse proxy | -| ইনস্টলেশন পদ্ধতি | `execFile`-এর মাধ্যমে `npm install {package}` (কোনো shell interpolation নয়) | -| ব্যবহারের ধরন | রাউটিং ইঞ্জিনে `9router/{sub}/{model}` হিসেবে নিবন্ধিত প্রোভাইডার | -| API key ব্যবস্থাপনা | OmniRoute তৈরি করে, সংরক্ষিত অবস্থায় এনক্রিপ্ট করে (AES-256-GCM) এবং env-এর মাধ্যমে ইনজেক্ট করে | -| ড্যাশবোর্ডের অবস্থান | `/dashboard/providers/services` (তিনটি ট্যাব) | -| স্বয়ংক্রিয়ভাবে চালু হওয়া | প্রতিটি সার্ভিসের জন্য toggle, ডিফল্টভাবে OFF | +| সিদ্ধান্ত | মান | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| 9Router-এর নেটিভ UI-তে ড্যাশবোর্ড অ্যাক্সেস | `/dashboard/providers/services/9router/embed/*`-এ রিভার্স প্রক্সি | +| ইনস্টলেশন প্রক্রিয়া | `execFile`-এর মাধ্যমে `npm install {package}` (কোনো শেল ইন্টারপোলেশন নেই) | +| ব্যবহারের ধরন | রাউটিং ইঞ্জিনে `9router/{sub}/{model}` হিসেবে নিবন্ধিত প্রোভাইডার | +| API কী ব্যবস্থাপনা | OmniRoute তৈরি করে, সংরক্ষিত অবস্থায় এনক্রিপ্ট করে (AES-256-GCM), এবং env-এর মাধ্যমে ইনজেক্ট করে | +| ড্যাশবোর্ডের অবস্থান | `/dashboard/providers/services` (তিনটি ট্যাব) | +| স্বয়ংক্রিয় চালু হওয়া | প্রতিটি সার্ভিসের জন্য আলাদা টগল, ডিফল্টভাবে বন্ধ | --- @@ -67,10 +68,10 @@ API key ব্যবহার করে পৌঁছানো হয়), এম ┌────────────────────────────────────────────────────────────────────┐ │ স্তর 1 — UI │ │ /dashboard/providers/services (ট্যাব: CLIProxyAPI | 9Router | Mux)│ -│ লাইভ লগ (SSE), Start/Stop/Restart/Update, সেটিংস, ইনস্টলেশন │ +│ লাইভ লগ (SSE), চালু/বন্ধ/পুনরায় চালু/আপডেট, সেটিংস, ইনস্টল │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx শেল + ?tab= অনুযায়ী ট্যাব রাউটিং │ +│ ├── page.tsx শেল + ?tab= অনুযায়ী ট্যাব রাউটিং │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -87,72 +88,73 @@ API key ব্যবহার করে পৌঁছানো হয়), এম │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (রিভার্স HTTP + WebSocket প্রক্সি → 9Router আপস্ট্রিম) │ +│ (রিভার্স HTTP + WebSocket প্রক্সি → 9Router আপস্ট্রিম) │ │ │ -│ গেট: LOCAL_ONLY_API_PREFIXES-এর মধ্যে "/api/services/" এবং │ -│ "/dashboard/providers/services/*/embed/" অন্তর্ভুক্ত রয়েছে│ +│ গেট: LOCAL_ONLY_API_PREFIXES-এর মধ্যে "/api/services/" এবং │ +│ "/dashboard/providers/services/*/embed/" অন্তর্ভুক্ত │ └──────────────────────┬─────────────────────────────────────────────┘ │ ইন-প্রসেস কল ┌──────────────────────▼─────────────────────────────────────────────┐ │ স্তর 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts সাধারণ সুপারভাইজার (child_process.spawn) │ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── ইনস্টল: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── চালু: spawn(node, [entrypoint], {env, cwd}) │ │ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 9Router-এর জন্য 20130 (কনফিগারযোগ্য) │ -│ ├── logs: stdio রিং বাফার 5 MB → SSE ইভেন্ট │ -│ ├── health: প্রতি 2–5 সেকেন্ডে HTTP GET /health, অলস পুনরুদ্ধার│ -│ └── lifecycle: SIGTERM 15 s → SIGKILL │ +│ ├── পোর্ট: 9Router-এর জন্য 20130 (কনফিগারযোগ্য) │ +│ ├── লগ: stdio রিং বাফার 5 MB → SSE ইভেন্ট │ +│ ├── স্বাস্থ্য: প্রতি 2–5 সেকেন্ডে HTTP GET /health, অলস পুনরুদ্ধার│ +│ └── জীবনচক্র: SIGTERM 15 সেকেন্ড → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts প্রসেস চালুর সময় সব SERVICES[] বুটস্ট্র্যাপ করে│ +│ bootstrap.ts প্রসেস শুরুর সময় সব SERVICES[] বুটস্ট্র্যাপ করে│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts পর্যায়ক্রমিক GET /v1/models → service_models টেবিল│ -│ ringBuffer.ts বৃত্তাকার লগ বাফার (প্রতি সার্ভিসে 5 MB) │ -│ healthCheck.ts পোলিং HTTP হেলথ প্রোব │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (ইনস্টলার অ্যাডাপ্টার) │ +│ ringBuffer.ts বৃত্তাকার লগ বাফার (প্রতি সার্ভিসে 5 MB) │ +│ healthCheck.ts পোলিং HTTP স্বাস্থ্য প্রোব │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (ইনস্টলার অ্যাডাপ্টার) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-সামঞ্জস্যপূর্ণ HTTP (লুপব্যাক) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ স্তর 4 — প্রোভাইডার / রাউটিং │ +│ স্তর 4 — প্রোভাইডার / রাউটিং │ │ │ │ open-sse/executors/ninerouter.ts │ -│ প্রতি অনুরোধে পোর্ট ও API কী পুনরায় খোঁজে (ক্যাশিং নেই)। │ -│ প্রক্সি করার আগে মডেল আইডি থেকে "9router/" প্রিফিক্স সরিয়ে দেয়।│ +│ প্রতি অনুরোধে পোর্ট ও API কী পুনরায় খোঁজে (ক্যাশিং নেই)। │ +│ প্রক্সি করার আগে মডেল id থেকে "9router/" প্রিফিক্স সরিয়ে দেয়। │ │ সুপারভাইজার "running" অবস্থায় না থাকলে 503 service_not_running ফেরত দেয়।│ │ │ │ src/shared/constants/providers.ts │ │ "9router"-এর এন্ট্রি: isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ মডেলগুলো "9router/{sub}/{model}" হিসেবে সংরক্ষিত হয় (প্রিফিক্সযুক্ত)।│ +│ মডেলগুলো "9router/{sub}/{model}" (প্রিফিক্সযুক্ত) হিসেবে সংরক্ষিত।│ │ modelSync.ts দ্বারা প্রতি 5 মিনিটে সিঙ্ক করা হয়। │ │ │ -│ Mux শুধু লাইফসাইকেল-পরিচালিত (স্তর 1-3) — এটি একটি এজেন্ট- │ +│ Mux-এর শুধু জীবনচক্র পরিচালিত হয় (স্তর 1–3) — এটি একটি এজেন্ট- │ │ অর্কেস্ট্রেশন ডেমন, LLM প্রক্সি নয়; তাই এর কোনো স্তর 4 │ -│ executor/provider এন্ট্রি নেই এবং এটি কখনোই রাউটিং লক্ষ্য নয়। │ +│ এক্সিকিউটর/প্রোভাইডার এন্ট্রি নেই এবং এটি কখনো রাউটিং লক্ষ্য নয়।│ └────────────────────────────────────────────────────────────────────┘ ``` -### মূল সোর্স ফাইলসমূহ +### প্রধান সোর্স ফাইলসমূহ -| ফাইল | ভূমিকা | -| ------------------------------------------- | ----------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | মূল ক্লাস: লাইফসাইকেল, লক, স্বাস্থ্য, রিং বাফার | -| `src/lib/services/bootstrap.ts` | প্রসেস-স্তরের নিবন্ধন এবং স্বয়ংক্রিয় সূচনা | -| `src/lib/services/registry.ts` | সিঙ্গেলটন ম্যাপ `tool → supervisor` | -| `src/lib/services/apiKey.ts` | কী তৈরি, স্থিত অবস্থায় AES-256-GCM এনক্রিপশন | -| `src/lib/services/modelSync.ts` | পর্যায়ক্রমিক মডেল সিঙ্ক (৫ মিনিট) + চাহিদামতো | -| `src/lib/services/ringBuffer.ts` | SSE সাবস্ক্রাইবসহ ৫ MB সার্কুলার লগ বাফার | -| `src/lib/services/healthCheck.ts` | HTTP স্বাস্থ্য পরীক্ষা (কনফিগারযোগ্য ব্যবধান) | -| `src/lib/services/installers/ninerouter.ts` | 9Router-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | -| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | -| `src/lib/services/installers/mux.ts` | Mux-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | -| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` সহায়ক | -| `src/app/api/services/[name]/logs/route.ts` | শেয়ার করা SSE লগ এন্ডপয়েন্ট | -| `open-sse/executors/ninerouter.ts` | প্রোভাইডার এক্সিকিউটর (স্তর ৪) | +| ফাইল | ভূমিকা | +| ------------------------------------------- | ------------------------------------------------ | +| `src/lib/services/ServiceSupervisor.ts` | মূল ক্লাস: লাইফসাইকেল, লক, হেলথ, রিং বাফার | +| `src/lib/services/bootstrap.ts` | প্রসেস-স্তরের রেজিস্ট্রেশন এবং স্বয়ংক্রিয় শুরু | +| `src/lib/services/registry.ts` | সিঙ্গেলটন ম্যাপ `tool → supervisor` | +| `src/lib/services/apiKey.ts` | কী তৈরি, সংরক্ষিত অবস্থায় AES-256-GCM এনক্রিপশন | +| `src/lib/services/modelSync.ts` | পর্যায়ক্রমিক মডেল সিঙ্ক (৫ মিনিট) + চাহিদামতো | +| `src/lib/services/ringBuffer.ts` | SSE সাবস্ক্রাইব-সহ ৫ MB বৃত্তাকার লগ বাফার | +| `src/lib/services/healthCheck.ts` | HTTP হেলথ প্রোব (কনফিগারযোগ্য বিরতি) | +| `src/lib/services/installers/ninerouter.ts` | 9Router-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | +| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | +| `src/lib/services/installers/mux.ts` | Mux-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | +| `src/lib/services/installers/openwa.ts` | open-wa-এর জন্য npm ইনস্টল/আপডেট/আনইনস্টল | +| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` সহায়ক | +| `src/app/api/services/[name]/logs/route.ts` | শেয়ার্ড SSE লগ এন্ডপয়েন্ট | +| `open-sse/executors/ninerouter.ts` | প্রোভাইডার এক্সিকিউটর (স্তর ৪) | --- @@ -208,57 +210,56 @@ API key ব্যবহার করে পৌঁছানো হয়), এম ## 4. API রেফারেন্স -`/api/services/`-এর অধীন সব রুট **LOCAL_ONLY** (শুধু লুপব্যাক, কঠোর নিয়ম #17)। -অথ টোকেন নির্বিশেষে নন-লুপব্যাক রিকোয়েস্ট `403 LOCAL_ONLY` পায়। +`/api/services/`-এর অধীনে থাকা সব রুট **LOCAL_ONLY** (শুধু লুপব্যাক, কঠোর নিয়ম #17)। +প্রমাণীকরণ টোকেন নির্বিশেষে নন-লুপব্যাক অনুরোধগুলো `403 LOCAL_ONLY` পায়। ### 4.1 9Router এন্ডপয়েন্টসমূহ (11টি রুট) #### `POST /api/services/9router/install` npm থেকে 9Router ইনস্টল করে। নিজস্ব `package.json` এবং `node_modules/`-সহ -`DATA_DIR/services/9router/` তৈরি করে। এটি OmniRoute-এর নিজস্ব ডিপেন্ডেন্সির সঙ্গে -সংঘর্ষ সৃষ্টি করে না। +`DATA_DIR/services/9router/` তৈরি করে। OmniRoute-এর নিজস্ব ডিপেন্ডেন্সিগুলোর সঙ্গে সংঘাত সৃষ্টি করে না। -**রিকোয়েস্ট বডি** (সবগুলো ঐচ্ছিক): +**অনুরোধের বডি** (সবগুলো ঐচ্ছিক): ```json { "version": "latest" } ``` -| ফিল্ড | ধরন | ডিফল্ট | বিবরণ | -| --------- | -------- | ---------- | ------------------------------------------- | -| `version` | `string` | `"latest"` | ইনস্টল করার জন্য npm ভার্সন ট্যাগ বা semver | +| ফিল্ড | ধরন | ডিফল্ট | বিবরণ | +| --------- | -------- | ---------- | -------------------------------------------- | +| `version` | `string` | `"latest"` | ইনস্টল করার জন্য npm সংস্করণ ট্যাগ বা semver | -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** -| স্ট্যাটাস | বিবরণ | -| --------- | -------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | অবৈধ রিকোয়েস্ট বডি (Zod ভ্যালিডেশন ব্যর্থতা) | -| `409` | ইতোমধ্যে ইনস্টল করা হচ্ছে (লক অধিগৃহীত) | -| `500` | npm ইনস্টল ব্যর্থ — ব্যবহারবান্ধব ত্রুটির জন্য `message` দেখুন | +| স্ট্যাটাস | বিবরণ | +| --------- | ---------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | অবৈধ অনুরোধের বডি (Zod যাচাইকরণ ব্যর্থতা) | +| `409` | ইতিমধ্যেই ইনস্টল করা হচ্ছে (লক ধরে রাখা হয়েছে) | +| `500` | npm install ব্যর্থ হয়েছে — ব্যবহারবান্ধব ত্রুটির জন্য `message` দেখুন | -**নোট:** `execFile('npm', [...])` ব্যবহার করে — কোনো শেল বা ইন্টারপোলেশন নেই (কঠোর নিয়ম #13)। +**নোট:** `execFile('npm', [...])` ব্যবহার করে — কোনো shell বা interpolation নেই (কঠোর নিয়ম #13)। EACCES ত্রুটিগুলো ব্যবহারবান্ধব বার্তা হিসেবে দেখানো হয়। --- #### `POST /api/services/9router/start` -9Router চালু করে। আগে থেকে নিবন্ধিত না থাকলে একটি সুপারভাইজর নিবন্ধন করে, তারপর -`supervisor.start()` কল করে। আগে থেকেই চলমান থাকলে এটি আইডেমপোটেন্ট। +9Router চালু করে। আগে থেকেই নিবন্ধিত না থাকলে একটি supervisor নিবন্ধন করে, তারপর +`supervisor.start()` কল করে। আগে থেকেই চলমান থাকলে এটি idempotent। -**রিকোয়েস্ট বডি:** নেই +**অনুরোধের বডি:** নেই -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** | স্ট্যাটাস | বিবরণ | | --------- | ---------------------------------------------------------- | -| `200` | `ServiceStatus` অবজেক্ট (নিচের স্কিমা দেখুন) | +| `200` | `ServiceStatus` অবজেক্ট (নিচের schema দেখুন) | | `409` | 9Router ইনস্টল করা নেই (`status: "not_installed"`) | | `503` | চালু করা ব্যর্থ হয়েছে (প্রসেস ত্রুটি — `lastError` দেখুন) | -**ServiceStatus স্কিমা:** +**ServiceStatus schema:** ```json { @@ -276,16 +277,16 @@ EACCES ত্রুটিগুলো ব্যবহারবান্ধব #### `POST /api/services/9router/stop` -9Router স্বাভাবিকভাবে বন্ধ করে। SIGTERM পাঠায়, 15 s অপেক্ষা করে, তারপরও চালু থাকলে -SIGKILL পাঠায়। আগে থেকেই বন্ধ থাকলে এটি আইডেমপোটেন্ট। +9Router সুশৃঙ্খলভাবে বন্ধ করে। SIGTERM পাঠায়, 15 s অপেক্ষা করে, তারপরও চলমান থাকলে SIGKILL পাঠায়। +আগে থেকেই বন্ধ থাকলে এটি idempotent। -**রিকোয়েস্ট বডি:** নেই +**অনুরোধের বডি:** নেই -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** | স্ট্যাটাস | বিবরণ | | --------- | -------------------------------------- | -| `200` | `ServiceStatus` (`state: "stopped"`) | +| `200` | `ServiceStatus` (state: "stopped") | | `503` | অপ্রত্যাশিতভাবে বন্ধ করা ব্যর্থ হয়েছে | --- @@ -294,66 +295,66 @@ SIGKILL পাঠায়। আগে থেকেই বন্ধ থাক অপারেশন লকের অধীনে প্রথমে `stop()` এবং তারপর `start()` করার সমতুল্য। -**রিকোয়েস্ট বডি:** নেই +**অনুরোধের বডি:** নেই -**রেসপন্সসমূহ:** `start`-এর মতোই (চূড়ান্ত `ServiceStatus` ফেরত দেয়)। +**প্রতিক্রিয়াসমূহ:** `start`-এর মতোই (চূড়ান্ত `ServiceStatus` ফেরত দেয়)। --- #### `POST /api/services/9router/update` -9Router-কে আরও নতুন npm ভার্সনে আপডেট করে। সার্ভিসটি চলমান থাকলে প্রথমে সেটি বন্ধ করা হয়, -তারপর npm ইনস্টল চালানো হয় (নতুন ভার্সনটি একই স্থানে ইনস্টল করা হয়), এবং এরপর +9Router-কে npm-এর একটি নতুন সংস্করণে আপডেট করে। সার্ভিসটি চলমান থাকলে প্রথমে সেটি বন্ধ করা হয়, +npm install চালানো হয় (নতুন সংস্করণটি একই স্থানে ইনস্টল করে), এবং তারপর সার্ভিসটি পুনরায় চালু করা হয়। -**রিকোয়েস্ট বডি** (সবগুলো ঐচ্ছিক): +**অনুরোধের বডি** (সবগুলো ঐচ্ছিক): ```json { "version": "latest" } ``` -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** | স্ট্যাটাস | বিবরণ | | --------- | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | | `400` | অবৈধ বডি | -| `500` | npm আপডেট ব্যর্থ | +| `500` | npm update ব্যর্থ হয়েছে | --- #### `POST /api/services/9router/rotate-key` -9Router-এর জন্য একটি নতুন API কী তৈরি করে, সংরক্ষিত অবস্থায় সেটি এনক্রিপ্ট করে এবং সার্ভিসটি -চালু থাকলে পুনরায় চালু করে, যাতে এটি পরিবেশ থেকে নতুন কীটি গ্রহণ করে। পুরোনো কীটি -তাৎক্ষণিকভাবে অকার্যকর করা হয়। +9Router-এর জন্য একটি নতুন API key তৈরি করে, সংরক্ষণের সময় সেটি এনক্রিপ্ট করে এবং সার্ভিসটি +চলমান থাকলে পুনরায় চালু করে, যাতে এটি environment থেকে নতুন key গ্রহণ করে। পুরোনো key-টি +তাৎক্ষণিকভাবে অবৈধ করা হয়। -**রিকোয়েস্ট বডি:** নেই +**অনুরোধের বডি:** নেই -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** | স্ট্যাটাস | বিবরণ | | --------- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | কী রোটেশন ব্যর্থ হয়েছে | +| `500` | রোটেশন ব্যর্থ হয়েছে | -**নিরাপত্তা:** নতুন কীটি কখনোই রেসপন্সে ফেরত দেওয়া হয় না (ক্রেডেনশিয়াল ফাঁস হয় না)। -এটি `version_manager` টেবিলে এনক্রিপ্ট করা অবস্থায় (AES-256-GCM) সংরক্ষিত থাকে। +**নিরাপত্তা:** নতুন key কখনোই প্রতিক্রিয়ায় ফেরত দেওয়া হয় না (credential ফাঁস হয় না)। +এটি `version_manager` টেবিলে এনক্রিপ্ট করা অবস্থায় (AES-256-GCM) সংরক্ষণ করা হয়। --- #### `GET /api/services/9router/status` -ভার্সন মেটাডেটা এবং API কী প্রিভিউসহ সম্মিলিত লাইভ + DB স্ট্যাটাস ফেরত দেয়। +সংস্করণ metadata এবং API key-এর preview-সহ সম্মিলিত live + DB status ফেরত দেয়। -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** -| স্ট্যাটাস | বিবরণ | -| --------- | ---------------------------- | -| `200` | নিচের স্কিমা দেখুন | -| `500` | স্ট্যাটাস পড়া ব্যর্থ হয়েছে | +| স্ট্যাটাস | বিবরণ | +| --------- | ------------------------- | +| `200` | নিচের schema দেখুন | +| `500` | status পড়া ব্যর্থ হয়েছে | -**রেসপন্স স্কিমা:** +**প্রতিক্রিয়ার schema:** ```json { @@ -377,16 +378,16 @@ SIGKILL পাঠায়। আগে থেকেই বন্ধ থাক #### `POST /api/services/9router/auto-start` -স্বয়ংক্রিয়ভাবে চালু হওয়ার ফ্ল্যাগটি টগল করে। `enabled: true` হলে, পরেরবার OmniRoute চালু হওয়ার সময় -সার্ভিসটি স্বয়ংক্রিয়ভাবে চালু হবে (যদি সার্ভিসটি ইনস্টল করা থাকে)। +auto-start flag টগল করে। `enabled: true` হলে, পরবর্তীবার OmniRoute চালু হওয়ার সময় সার্ভিসটি +স্বয়ংক্রিয়ভাবে চালু হয় (যদি সার্ভিসটি ইনস্টল করা থাকে)। -**রিকোয়েস্ট বডি:** +**অনুরোধের বডি:** ```json { "enabled": true } ``` -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** | স্ট্যাটাস | বিবরণ | | --------- | --------------------- | @@ -397,24 +398,24 @@ SIGKILL পাঠায়। আগে থেকেই বন্ধ থাক #### `GET /api/services/9router/logs` -9Router-এর stdout/stderr রিং বাফার থেকে লাইভ লগের SSE স্ট্রিম। +9Router-এর stdout/stderr ring buffer থেকে live log-এর SSE stream। -**কোয়েরি প্যারামিটারসমূহ:** +**Query parameter-সমূহ:** -| প্যারামিটার | ধরন | ডিফল্ট | বিবরণ | -| ----------- | --------- | ------ | ------------------------------------------------------------ | -| `tail` | `integer` | 200 | প্রথমে কতটি ঐতিহাসিক লাইন পাঠানো হবে (সর্বোচ্চ 1000) | -| `filter` | `string` | নেই | কেস-ইনসেনসিটিভ সাবস্ট্রিং ফিল্টার (regex নয় — ReDoS-নিরাপদ) | +| প্যারামিটার | ধরন | ডিফল্ট | বিবরণ | +| ----------- | --------- | ------ | ----------------------------------------------------------------- | +| `tail` | `integer` | 200 | শুরুতে পাঠানোর historical line-এর সংখ্যা (সর্বোচ্চ 1000) | +| `filter` | `string` | নেই | Case-insensitive substring filter (কোনো regex নয় — ReDoS-নিরাপদ) | -**SSE ইভেন্টসমূহ:** +**SSE event-সমূহ:** -| ইভেন্ট | ডেটা | বিবরণ | -| ----------- | ----------- | ------------------------- | -| `snapshot` | `LogLine[]` | প্রাথমিক ঐতিহাসিক শেষাংশ | -| `log` | `LogLine` | লাইভ লগ লাইন | -| `heartbeat` | `{}` | প্রতি 15 s-এ কিপ-অ্যালাইভ | +| Event | Data | বিবরণ | +| ----------- | ----------- | ------------------------ | +| `snapshot` | `LogLine[]` | প্রাথমিক historical tail | +| `log` | `LogLine` | Live log line | +| `heartbeat` | `{}` | প্রতি 15 s-এ keep-alive | -**LogLine স্কিমা:** +**LogLine schema:** ```json { @@ -424,7 +425,7 @@ SIGKILL পাঠায়। আগে থেকেই বন্ধ থাক } ``` -**রেসপন্সসমূহ:** +**প্রতিক্রিয়াসমূহ:** | স্ট্যাটাস | বিবরণ | | --------- | -------------------------------------------------- | @@ -436,81 +437,117 @@ SIGKILL পাঠায়। আগে থেকেই বন্ধ থাক ### 4.2 CLIProxyAPI এন্ডপয়েন্টসমূহ (10টি রুট) -CLIProxyAPI-এর এন্ডপয়েন্ট কাঠামো 9Router-এর মতোই, তবে `rotate-key` নেই এবং এর সঙ্গে -`accounts`, `provider-expose` ও `auto-restart-adopted` রয়েছে। এটি এখন স্পন করার সময় -ইনজেক্ট করা একটি নিবেদিত ডেটা-প্লেন API কী পায় (`bootstrap.ts`-এ `needsApiKey: true`, -যা মডেল সিঙ্কের জন্য ব্যবহৃত হয়); `status`-এ তুলনামূলকভাবে কম ফিল্ড থাকে। +CLIProxyAPI-এর এন্ডপয়েন্ট কাঠামো 9Router-এর মতোই, তবে `rotate-key` নেই এবং +`accounts`, `provider-expose` ও `auto-restart-adopted` রয়েছে। এটি এখন চালুর সময় +ইনজেক্ট করা একটি নিবেদিত ডেটা-প্লেন API কী পায় (`bootstrap.ts`-এ +`needsApiKey: true`, মডেল সিঙ্কের জন্য ব্যবহৃত); `status`-এ কম ফিল্ড অন্তর্ভুক্ত থাকে। | মেথড | পাথ | বিবরণ | | ------ | ----------------------------------- | ------------------------------------------ | -| `POST` | `/api/services/cliproxy/install` | npm থেকে CLIProxyAPI ইনস্টল করে | -| `POST` | `/api/services/cliproxy/start` | CLIProxyAPI চালু করে | -| `POST` | `/api/services/cliproxy/stop` | CLIProxyAPI বন্ধ করে | -| `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI পুনরায় চালু করে | -| `POST` | `/api/services/cliproxy/update` | অপেক্ষাকৃত নতুন ভার্সনে আপডেট করে | +| `POST` | `/api/services/cliproxy/install` | npm থেকে CLIProxyAPI ইনস্টল করুন | +| `POST` | `/api/services/cliproxy/start` | CLIProxyAPI চালু করুন | +| `POST` | `/api/services/cliproxy/stop` | CLIProxyAPI বন্ধ করুন | +| `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI পুনরায় চালু করুন | +| `POST` | `/api/services/cliproxy/update` | নতুনতর সংস্করণে আপডেট করুন | | `GET` | `/api/services/cliproxy/status` | লাইভ + DB স্ট্যাটাস (`apiKeyMasked` ছাড়া) | -| `POST` | `/api/services/cliproxy/auto-start` | স্বয়ংক্রিয়ভাবে চালু হওয়া টগল করে | +| `POST` | `/api/services/cliproxy/auto-start` | স্বয়ংক্রিয়ভাবে চালু হওয়া টগল করুন | -শেয়ার করা `GET /api/services/{name}/logs` এন্ডপয়েন্টটি (§4.1 দেখুন) `[name]` -ডায়নামিক সেগমেন্ট ব্যবহার করে চারটি সার্ভিসের সবগুলোর জন্য কাজ করে। +শেয়ার্ড `GET /api/services/{name}/logs` এন্ডপয়েন্টটি (§4.1 দেখুন) `[name]` +ডায়নামিক সেগমেন্ট ব্যবহার করে চারটি সার্ভিসের জন্যই কাজ করে। --- ### 4.3 Mux এন্ডপয়েন্টসমূহ (8টি রুট) Mux-এর এন্ডপয়েন্ট কাঠামো CLIProxyAPI-এর মতোই — API সারফেসে কোনো `rotate-key` রুট নেই -(বেয়ারার টোকেনটি 9Router-এর মতো একইভাবে `getOrCreateApiKey("mux")`-এর মাধ্যমে তৈরি -এবং `MUX_SERVER_AUTH_TOKEN` এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে ইনজেক্ট করা হয়, তবে -এখনও কোনো নিবেদিত রোটেশন এন্ডপয়েন্ট নেই)। Mux কেবল লাইফসাইকেল-পরিচালিত: 9Router-এর +(বিয়ারার টোকেনটি `getOrCreateApiKey("mux")`-এর মাধ্যমে 9Router-এর মতো একইভাবে তৈরি হয় +এবং `MUX_SERVER_AUTH_TOKEN` এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে ইনজেক্ট করা হয়, কিন্তু +এখনও কোনো নিবেদিত রোটেশন এন্ডপয়েন্ট নেই)। Mux শুধু লাইফসাইকেল-পরিচালিত: 9Router-এর বিপরীতে, এর কোনো Layer 4 এক্সিকিউটর নেই এবং এটি কখনোই রাউটিং প্রোভাইডার হিসেবে নিবন্ধিত হয় না। -| মেথড | পাথ | বিবরণ | -| ------ | ------------------------------ | ------------------------------------- | -| `POST` | `/api/services/mux/install` | npm থেকে Mux ইনস্টল করে (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Mux চালু করে (`mux server`) | -| `POST` | `/api/services/mux/stop` | Mux বন্ধ করে | -| `POST` | `/api/services/mux/restart` | Mux পুনরায় চালু করে | -| `POST` | `/api/services/mux/update` | অপেক্ষাকৃত নতুন npm ভার্সনে আপডেট করে | -| `GET` | `/api/services/mux/status` | লাইভ + DB স্ট্যাটাস | -| `POST` | `/api/services/mux/auto-start` | স্বয়ংক্রিয়ভাবে চালু হওয়া টগল করে | +| মেথড | পাথ | বিবরণ | +| ------ | ------------------------------ | -------------------------------------- | +| `POST` | `/api/services/mux/install` | npm থেকে Mux ইনস্টল করুন (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Mux চালু করুন (`mux server`) | +| `POST` | `/api/services/mux/stop` | Mux বন্ধ করুন | +| `POST` | `/api/services/mux/restart` | Mux পুনরায় চালু করুন | +| `POST` | `/api/services/mux/update` | নতুনতর npm সংস্করণে আপডেট করুন | +| `GET` | `/api/services/mux/status` | লাইভ + DB স্ট্যাটাস | +| `POST` | `/api/services/mux/auto-start` | স্বয়ংক্রিয়ভাবে চালু হওয়া টগল করুন | --- ### 4.4 Bifrost এন্ডপয়েন্টসমূহ (8টি রুট) -Bifrost একটি Go AI-গেটওয়ে রিলে ব্যাকএন্ড (`@maximhq/bifrost`)। এটি CLIProxyAPI-এর মতো -একই এন্ডপয়েন্ট কাঠামো ব্যবহার করে (`rotate-key` নেই — Bifrost তার নিজস্ব প্রোভাইডার -কীগুলো `-app-dir`-এর অধীনে থাকা `config.json`-এ পরিচালনা করে)। +Bifrost হলো একটি Go AI-গেটওয়ে রিলে ব্যাকএন্ড (`@maximhq/bifrost`)। এটি CLIProxyAPI-এর +মতো একই এন্ডপয়েন্ট কাঠামো ব্যবহার করে (`rotate-key` নেই — Bifrost তার `-app-dir`-এর +অধীন `config.json`-এ নিজস্ব প্রোভাইডার কী পরিচালনা করে)। -| মেথড | পাথ | বিবরণ | -| ------ | ---------------------------------- | -------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | npm (`@maximhq/bifrost`) থেকে Bifrost ইনস্টল করে | -| `POST` | `/api/services/bifrost/start` | 8080 পোর্টে Bifrost চালু করে (ডিফল্ট) | -| `POST` | `/api/services/bifrost/stop` | Bifrost বন্ধ করে | -| `POST` | `/api/services/bifrost/restart` | Bifrost পুনরায় চালু করে | -| `POST` | `/api/services/bifrost/update` | নতুনতর সংস্করণে আপডেট করে | -| `GET` | `/api/services/bifrost/status` | লাইভ + DB স্ট্যাটাস | -| `POST` | `/api/services/bifrost/auto-start` | স্বয়ংক্রিয়ভাবে চালু করার সেটিং টগল করে | -| `GET` | `/api/services/bifrost/logs` | SSE লগ টেইল (শেয়ার করা `[name]/logs` ডায়নামিক রুটের মাধ্যমে) | +| মেথড | পাথ | বিবরণ | +| ------ | ---------------------------------- | ------------------------------------------------------------ | +| `POST` | `/api/services/bifrost/install` | npm থেকে Bifrost ইনস্টল করুন (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | 8080 পোর্টে Bifrost চালু করুন (ডিফল্ট) | +| `POST` | `/api/services/bifrost/stop` | Bifrost বন্ধ করুন | +| `POST` | `/api/services/bifrost/restart` | Bifrost পুনরায় চালু করুন | +| `POST` | `/api/services/bifrost/update` | নতুনতর সংস্করণে আপডেট করুন | +| `GET` | `/api/services/bifrost/status` | লাইভ + DB স্ট্যাটাস | +| `POST` | `/api/services/bifrost/auto-start` | স্বয়ংক্রিয়ভাবে চালু হওয়া টগল করুন | +| `GET` | `/api/services/bifrost/logs` | SSE লগ টেইল (শেয়ার্ড `[name]/logs` ডায়নামিক রুটের মাধ্যমে) | -**রাউটিং সংযোগ:** যখন `BIFROST_BASE_URL` সেট করা থাকে না এবং তত্ত্বাবধানে থাকা Bifrost -ইনস্ট্যান্সটি চালু থাকে, তখন `getBifrostRoutingConfig()` (`routingBackend.ts`-এ) স্বয়ংক্রিয়ভাবে -`http://127.0.0.1:{port}`-কে রিলে বেস URL হিসেবে ব্যবহার করে। স্পষ্টভাবে সেট করা `BIFROST_BASE_URL` env -সবসময় অগ্রাধিকার পায়। +**রাউটিং ওয়্যারিং:** যখন `BIFROST_BASE_URL` সেট করা থাকে না এবং সুপারভাইজড Bifrost +ইনস্ট্যান্সটি চলমান থাকে, তখন `getBifrostRoutingConfig()` (`routingBackend.ts`-এ) +স্বয়ংক্রিয়ভাবে `http://127.0.0.1:{port}`-কে রিলে বেস URL হিসেবে ব্যবহার করে। স্পষ্টভাবে +সেট করা `BIFROST_BASE_URL` এনভায়রনমেন্ট ভেরিয়েবল সবসময় অগ্রাধিকার পায়। --- ### 4.5 Dario এন্ডপয়েন্টসমূহ (12টি রুট) অন্যান্য সার্ভিসের মতো একই লাইফসাইকেল কাঠামো (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), পাশাপাশি `admin/`-এর অধীনে একটি টোকেন-নিয়ন্ত্রিত OAuth -কন্ট্রোল প্লেন রয়েছে: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (সবগুলোই `DARIO_ADMIN_TOKEN` দ্বারা সুরক্ষিত)। - -### 4.6 রিভার্স প্রক্সি (9Router ড্যাশবোর্ড এম্বেড) - -ড্যাশবোর্ডটি একটি অভ্যন্তরীণ রিভার্স প্রক্সির মাধ্যমে iframe-এর ভেতরে 9Router ওয়েব UI -এম্বেড করে: +`update`, `status`, `auto-start`, `auto-restart-adopted`), পাশাপাশি `admin/`-এর অধীনে +একটি টোকেন-নিয়ন্ত্রিত OAuth কন্ট্রোল প্লেন রয়েছে: `admin/accounts`, +`admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (সবগুলোই +`DARIO_ADMIN_TOKEN` দ্বারা সুরক্ষিত)। + +### 4.6 open-wa এন্ডপয়েন্টসমূহ (7টি রুট) + +open-wa (`@open-wa/wa-automate`) WhatsApp Web স্বয়ংক্রিয় করতে একটি হেডলেস Chromium +ইনস্ট্যান্স (Puppeteer-এর মাধ্যমে) পরিচালনা করে। এটি Mux-এর মতো একই এন্ডপয়েন্ট কাঠামো +ব্যবহার করে (এখনও কোনো `rotate-key` রুট নেই)। এটি শুধু লাইফসাইকেল-পরিচালিত — কোনো +রাউটিং টার্গেট নয় এবং এর কোনো Layer 4 এক্সিকিউটর/প্রোভাইডার এন্ট্রি নেই। + +| মেথড | পাথ | বিবরণ | +| ------ | --------------------------------- | -------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | npm থেকে open-wa (`@open-wa/wa-automate`) ইনস্টল করে | +| `POST` | `/api/services/openwa/start` | 8323 পোর্টে (ডিফল্ট) open-wa চালু করে | +| `POST` | `/api/services/openwa/stop` | open-wa বন্ধ করে | +| `POST` | `/api/services/openwa/restart` | open-wa পুনরায় চালু করে | +| `POST` | `/api/services/openwa/update` | নতুনতর সংস্করণে আপডেট করে | +| `GET` | `/api/services/openwa/status` | লাইভ + DB স্ট্যাটাস | +| `POST` | `/api/services/openwa/auto-start` | স্বয়ংক্রিয়ভাবে চালু হওয়া টগল করে | +| `GET` | `/api/services/openwa/logs` | SSE লগ টেইল (শেয়ার করা `[name]/logs` ডায়নামিক রুটের মাধ্যমে) | + +**API কী:** `WA_KEY` হিসেবে ইনজেক্ট করা হয় — open-wa-এর সাধারণ `WA_*`-প্রিফিক্সযুক্ত env +ওভাররাইড এটিকে `--key`/`-k` CLI অপশনে ম্যাপ করে +(`dist/cli/setup.js::envArgs()`, ইনস্টল করা 4.76.0 +প্যাকেজের সঙ্গে যাচাই করা হয়েছে)। `generateServiceApiKey()` দ্বারা তৈরি হলে `ow_` প্রিফিক্স যুক্ত হয়। open-wa +একটি `key`/`api_key` HTTP হেডার থেকে কীটি পুনরায় পড়ে (`Authorization: +Bearer` নয়); `/api-docs*`-কে স্পষ্টভাবে এই পরীক্ষা থেকে অব্যাহতি দেওয়া হয়েছে +(`dist/cli/server.js`-এ `setupAuthenticationLayer`), তাই হেলথ প্রোবে +কোনো auth হেডারের প্রয়োজন নেই। + +**পেয়ারিং:** open-wa অনানুষ্ঠানিক এবং WhatsApp-এর সঙ্গে অসম্পৃক্ত — সংযুক্ত +নম্বরটি WhatsApp-এর নিজস্ব অটোমেশন শনাক্তকরণের কারণে নিষিদ্ধ হওয়ার ঝুঁকি বহন করে। +প্রথমবার চালু করার সময়, পেয়ারিং QR কোডটি stdout-এ প্রিন্ট করা হয় এবং বিদ্যমান +লগ প্যানেল/SSE স্ট্রিমের মাধ্যমে দেখানো হয় — এই ইন্টিগ্রেশনে এখনও কোনো ডেডিকেটেড QR-ইমেজ এন্ডপয়েন্ট +নেই। + +--- + +### 4.7 রিভার্স প্রক্সি (9Router ড্যাশবোর্ড এম্বেড) + +ড্যাশবোর্ডটি একটি অভ্যন্তরীণ রিভার্স +প্রক্সির মাধ্যমে একটি iframe-এর ভেতরে 9Router ওয়েব UI এম্বেড করে: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -519,17 +556,17 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] এই প্রক্সি: - অনুরোধটি `http://127.0.0.1:{port}/{path}`-এ ফরোয়ার্ড করে (শুধু লুপব্যাক) -- ইনকামিং `cookie` এবং `authorization` হেডার বাদ দেয় (OmniRoute সেশন ফাঁস হয় না) +- ইনকামিং `cookie` এবং `authorization` হেডার সরিয়ে দেয় (OmniRoute সেশন ফাঁস হয় না) - 9Router প্রমাণীকরণের জন্য `Authorization: Bearer {apiKey}` ইনজেক্ট করে -- রেসপন্স থেকে `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` বাদ দেয় -- `` ইনজেক্ট করতে এবং অ্যাবসোলিউট পাথগুলো স্বাভাবিক করতে HTML রেসপন্স পুনর্লিখন করে (`/foo` → `/dashboard/.../embed/foo`) +- রেসপন্স থেকে `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` সরিয়ে দেয় +- `` ইনজেক্ট করতে এবং অ্যাবসলিউট পাথগুলো স্বাভাবিক করতে HTML রেসপন্স পুনর্লিখন করে (`/foo` → `/dashboard/.../embed/foo`) এম্বেড করা ড্যাশবোর্ডের WebSocket আপগ্রেডগুলো একটি -নির্ধারিত পোর্টে থাকা সহযোগী সার্ভার দ্বারা পরিচালিত হয় (`src/lib/services/embedWsProxy.ts` দেখুন)। +ডেডিকেটেড পোর্টে থাকা সহায়ক সার্ভার দ্বারা পরিচালিত হয় (`src/lib/services/embedWsProxy.ts` দেখুন)। **নিরাপত্তা:** এম্বেড প্রক্সি রুটগুলো `LOCAL_ONLY_API_PREFIXES`-এর অধীনে শ্রেণিবদ্ধ -এবং কেবল লুপব্যাক থেকে অ্যাক্সেস করা যায়। Cloudflare/Ngrok টানেলের মাধ্যমে JWT পাওয়া কোনো -আক্রমণকারী এম্বেড করা সার্ভিসগুলোতে প্রক্সি করতে পারবে না। +এবং কেবল লুপব্যাক থেকে অ্যাক্সেস করা যায়। Cloudflare/Ngrok টানেলের মাধ্যমে +JWT পাওয়া কোনো আক্রমণকারী এম্বেড করা সার্ভিসগুলোতে প্রক্সি করতে পারবে না। --- diff --git a/docs/i18n/bn/docs/frameworks/MEMORY.md b/docs/i18n/bn/docs/frameworks/MEMORY.md index 5a32193be6f1..7fa6bb395857 100644 --- a/docs/i18n/bn/docs/frameworks/MEMORY.md +++ b/docs/i18n/bn/docs/frameworks/MEMORY.md @@ -149,33 +149,36 @@ RRF(d) = Σ 1 / (k + rank_i(d)) যেখানে k = 60 (MEMORY_RRF_K- ## সেটিংস এক্সটেনশন -`src/shared/schemas/memory.ts`-এর `MemorySettingsExtended`-এ নয়টি embedding এবং vector field উপলভ্য রয়েছে, যা `src/lib/db/settings.ts`-এর মাধ্যমে সংরক্ষিত হয়: - -| ফিল্ড | টাইপ | ডিফল্ট | বিবরণ | -| ------------------------ | -------------------------------------------------- | -------- | ----------------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | কোন embedding source ব্যবহার করা হবে | -| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` ফরম্যাটে provider/model | -| `customBaseUrl` | `string \| null` | `null` | শুধু Memory-এর জন্য OpenAI-সামঞ্জস্যপূর্ণ endpoint-এর base URL | -| `customModelId` | `string \| null` | `null` | কাস্টম endpoint-এ পাঠানো model ID | -| `transformersEnabled` | `boolean` | `false` | Transformers.js-এর জন্য অপ্ট-ইন (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | স্ট্যাটিক potion-base-8M লোকাল model-এর জন্য অপ্ট-ইন | -| `rerankEnabled` | `boolean` | `false` | পুনরায় র্যাঙ্কিং ধাপ সক্রিয় করুন (প্রতি request-এ +200-500ms যোগ করে) | -| `rerankProviderModel` | `string \| null` | `null` | `provider/model` ফরম্যাটে পুনরায় র্যাঙ্ক করার provider/model | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | কোন vector backend ব্যবহার করা হবে | - -এগুলো `GET /PUT /api/settings/memory`-এর মাধ্যমে উন্মুক্ত করা হয়েছে (schema `MemorySettingsExtendedSchema`)। - -`remote` source-এর ক্ষেত্রে, Memory ঐচ্ছিক `customBaseUrl` এবং -`customModelId` সেটিংসও গ্রহণ করে। একসঙ্গে এগুলো গ্লোবাল embedding registry পরিবর্তন না করেই একটি OpenAI-সামঞ্জস্যপূর্ণ `/embeddings` -endpoint এবং model নির্বাচন করে। ব্যবহারের আগে endpoint-টি -normalize করা হয় এবং provider-এর outbound URL policy দ্বারা যাচাই করা হয়: HTTP(S) -আবশ্যক, এম্বেড করা credentials এবং query string প্রত্যাখ্যান করা হয়, এবং cloud-metadata -address ব্লক করা থাকে। খালি মানগুলো নির্বাচিত registry provider অপরিবর্তিত রাখে। dashboard-এ -ফেরত দেওয়া error sanitize করা হয় এবং endpoint credentials কখনোই log করা হয় না। - -> **TODO (D20):** `global` scope (সব API key জুড়ে memory শেয়ার করা) এই -> release-এ বাস্তবায়িত হয়নি। এর জন্য schema পরিবর্তন এবং একটি global retrieval -> path প্রয়োজন। আলাদাভাবে track করুন। +`src/shared/schemas/memory.ts`-এর `MemorySettingsExtended`-এ নয়টি এম্বেডিং ও ভেক্টর ফিল্ড উপলভ্য রয়েছে, +যেগুলো `src/lib/db/settings.ts`-এর মাধ্যমে সংরক্ষিত হয়: + +| ফিল্ড | ধরন | ডিফল্ট | বিবরণ | +| ------------------------ | -------------------------------------------------- | -------- | ----------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | কোন এম্বেডিং উৎস ব্যবহার করা হবে | +| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` ফরম্যাটে প্রোভাইডার/মডেল | +| `customBaseUrl` | `string \| null` | `null` | শুধু মেমরির জন্য OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের বেস URL | +| `customModelId` | `string \| null` | `null` | কাস্টম এন্ডপয়েন্টে পাঠানো মডেল ID | +| `transformersEnabled` | `boolean` | `false` | Transformers.js-এর জন্য অপ্ট-ইন (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | স্থানীয় static potion-base-8M মডেলের জন্য অপ্ট-ইন | +| `rerankEnabled` | `boolean` | `false` | পুনঃর্যাঙ্কিং ধাপ সক্রিয় করুন (প্রতি অনুরোধে +200-500ms যোগ করে) | +| `rerankProviderModel` | `string \| null` | `null` | `provider/model` ফরম্যাটে পুনঃর্যাঙ্ক প্রোভাইডার/মডেল | + +`rerankProviderModel`-কে `POST /v1/rerank` দ্বারা সমাধান করা হয় (লুপব্যাকের মাধ্যমে কল করা হয়), তাই ওই রুট যা কিছু গ্রহণ করে, এটিও সেগুলো গ্রহণ করে: একটি নির্বাচিত ক্লাউড পুনঃর্যাঙ্ক মডেল (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) অথবা `/` হিসেবে একটি OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড (যেমন, একটি TEI/Infinity বক্সের জন্য `skilled-mini/bge-reranker-v2-m3`)। লুপব্যাক নোডগুলো সর্বদা উপযুক্ত; অন্য কোনো হোস্টে থাকা একটি নোডের (LAN, Tailscale) জন্য অতিরিক্তভাবে `RERANK_REMOTE_PROVIDER_NODES` ফিচার ফ্ল্যাগ প্রয়োজন এবং সেটিকে প্রোভাইডারের আউটবাউন্ড URL নীতি পাস করতে হবে—[ফিচার ফ্ল্যাগ](../reference/FEATURE_FLAGS.md) দেখুন। ড্যাশবোর্ড নির্বাচকে নির্বাচিত প্রোভাইডারগুলোর পাশাপাশি স্থানীয় নোডগুলোও তালিকাভুক্ত থাকে; যেকোনো বৈধ `provider/model` স্ট্রিং `PUT /api/settings/memory`-এর মাধ্যমে সরাসরি সেট করা যায়। +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | কোন ভেক্টর ব্যাকএন্ড ব্যবহার করা হবে | + +এগুলো `GET /PUT /api/settings/memory`-এর মাধ্যমে উন্মুক্ত করা হয় (স্কিমা `MemorySettingsExtendedSchema`)। + +`remote` উৎসের জন্য, Memory ঐচ্ছিক `customBaseUrl` এবং +`customModelId` সেটিংসও গ্রহণ করে। একসঙ্গে এগুলো গ্লোবাল এম্বেডিং রেজিস্ট্রি পরিবর্তন না করেই একটি OpenAI-সামঞ্জস্যপূর্ণ `/embeddings` +এন্ডপয়েন্ট ও মডেল নির্বাচন করে। ব্যবহারের আগে এন্ডপয়েন্টটি +স্বাভাবিকীকরণ করা হয় এবং প্রোভাইডারের আউটবাউন্ড URL নীতি দ্বারা যাচাই করা হয়: HTTP(S) +আবশ্যক, এম্বেড করা পরিচয়পত্র এবং কোয়েরি স্ট্রিং প্রত্যাখ্যান করা হয় এবং ক্লাউড-মেটাডেটা +ঠিকানাগুলো অবরুদ্ধ থাকে। খালি মানগুলো নির্বাচিত রেজিস্ট্রি প্রোভাইডার অপরিবর্তিত রাখে। ড্যাশবোর্ডে +ফেরত দেওয়া ত্রুটিগুলো পরিশোধিত হয় এবং এন্ডপয়েন্টের পরিচয়পত্র কখনোই লগ করা হয় না। + +> **TODO (D20):** `global` স্কোপ (সব API কী-এর মধ্যে মেমরি শেয়ার করা) এই রিলিজে +> বাস্তবায়িত হয়নি। এর জন্য স্কিমা পরিবর্তন এবং একটি গ্লোবাল পুনরুদ্ধার +> পাথ প্রয়োজন। আলাদাভাবে ট্র্যাক করুন। ## স্টোরেজ স্তরসমূহ diff --git a/docs/i18n/bn/docs/guides/DOCKER_GUIDE.md b/docs/i18n/bn/docs/guides/DOCKER_GUIDE.md index 35340afdf0b8..37fd85a85298 100644 --- a/docs/i18n/bn/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/bn/docs/guides/DOCKER_GUIDE.md @@ -25,7 +25,13 @@ --- -## দ্রুত চালু করা +## দ্রুত চালু করুন + +> **একটি কমান্ডেই স্ব-হোস্ট করতে চান?** দেখুন +> [স্ব-হোস্ট নির্দেশিকা](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (প্রকাশিত ইমেজ + +> Redis, শুধুমাত্র লুপব্যাক, কোনো প্রোফাইল নির্বাচন নেই)। নিচের দ্রুত চালুর পদ্ধতিটি +> সেই ব্যবহারকারীদের জন্য একক-কনটেইনার পদ্ধতি, যাঁরা ইতিমধ্যেই অন্যত্র Redis চালান। ```bash docker run -d \ diff --git a/docs/i18n/bn/docs/guides/TROUBLESHOOTING.md b/docs/i18n/bn/docs/guides/TROUBLESHOOTING.md index ead49097684b..1433a9b98105 100644 --- a/docs/i18n/bn/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/bn/docs/guides/TROUBLESHOOTING.md @@ -68,15 +68,23 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # তাৎক্ষণিক retr ## npm install সতর্কতা (ERESOLVE / peer / deprecated) -আপনি `npm install -g omniroute` চালালে `npm warn ERESOLVE`, peer-dependency বিজ্ঞপ্তি এবং `deprecated` বার্তার মতো অসংখ্য সতর্কতা দেখতে পারেন। **এগুলো প্রত্যাশিত এবং ক্ষতিকর নয়।** আউটপুটে `added packages` দেখলে বুঝবেন আপনার ইনস্টলেশন সফল হয়েছে। +আপনি যখন `npm install -g omniroute` চালান, তখন `npm warn ERESOLVE`, peer-dependency বিজ্ঞপ্তি এবং `deprecated` বার্তার মতো অসংখ্য সতর্কতা দেখতে পারেন। **এগুলো প্রত্যাশিত এবং ক্ষতিকর নয়।** আউটপুটে `added packages` দেখলে বুঝবেন আপনার ইনস্টলেশন সফল হয়েছে। -OmniRoute-এর নিয়ন্ত্রণের বাইরে থাকা তৃতীয়-পক্ষের প্যাকেজগুলোর পুরোনো peer-dependency range থেকে এই সতর্কতাগুলো আসে: +peer-dependency resolution সংক্রান্ত সতর্কতাগুলো বন্ধ করতে OmniRoute-এর সমর্থিত ইনস্টল পদ্ধতি ব্যবহার করুন: -1. **`marked-terminal`-এর প্রয়োজন `marked >=1 <16`, কিন্তু পাওয়া গেছে `marked@18`** — বাস্তবে এটি ঠিকভাবেই কাজ করে; upstream peer range-টি শুধু পুরোনো। -2. **`deprecated prebuild-install@7.1.3`** — এটি একটি transitive native-binary fetch helper। এটি pinned `wreq-js` transport binding ইনস্টল করতে - ব্যবহৃত হয় না এবং web-cookie provider transport সেটআপ ব্যর্থ হয়েছে—এমনটিও নির্দেশ করে না। +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` শুধু `ERESOLVE` এবং peer-dependency বিজ্ঞপ্তিগুলো বন্ধ করে। Deprecation বিজ্ঞপ্তিগুলো দৃশ্যমান থাকে, কারণ সেগুলো পরোক্ষ third-party package থেকে আসে; এগুলো ইনস্টলেশন ব্যর্থ হওয়ার ইঙ্গিত দেয় না। + +সতর্কতাগুলো এমন third-party package-এর পুরোনো peer-dependency range থেকে আসে, যেগুলোর ওপর OmniRoute-এর নিয়ন্ত্রণ নেই: + +1. **`marked-terminal`-এর জন্য `marked >=1 <16` প্রয়োজন, কিন্তু `marked@18` পাওয়া গেছে** — বাস্তবে এটি ঠিকভাবেই কাজ করে; upstream peer range-টিই শুধু পুরোনো। +2. **`deprecated prebuild-install@7.1.3`** — একটি পরোক্ষ native-binary fetch helper। এটি pinned `wreq-js` transport binding ইনস্টল করতে + ব্যবহৃত হয় না এবং web-cookie provider transport setup ব্যর্থ হয়েছে—এমন ইঙ্গিতও দেয় না। -**কোনো পদক্ষেপের প্রয়োজন নেই** — upstream প্যাকেজগুলো fork না করে সতর্কতাগুলো সম্পূর্ণভাবে বন্ধ করা সম্ভব নয়। +**কোনো পদক্ষেপের প্রয়োজন নেই** — upstream package-গুলো fork না করে সতর্কতাগুলো সম্পূর্ণভাবে বন্ধ করা সম্ভব নয়। --- diff --git a/docs/i18n/bn/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/bn/docs/providers/CURSOR-API-KEY-AND-CLI.md index 861785521ff5..300fd4a7b4dd 100644 --- a/docs/i18n/bn/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/bn/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,41 +4,40 @@ --- -IDE সেশন ছাড়াই OmniRoute-এর পেছনে Cursor রাখার দুটি উপায়: - -1. **`cursor-api` প্রোভাইডার** (কার্ড "Cursor API", উপনাম `cua`): এটি একটি API-key - প্রোভাইডার, যা একটি Cursor ব্যবহারকারী API key (`crsr_…`, তৈরি করা হয় - `https://cursor.com/dashboard/api`-এ) ধারণ করে। এরপর যেকোনো OmniRoute ক্লায়েন্ট - `/v1/chat/completions`-এর মাধ্যমে `cursor-api/` বা - `cua/` হিসেবে Cursor মডেলগুলোতে পৌঁছাতে পারে, যেখানে স্বাভাবিক quota, - fallback এবং logging স্তরগুলো প্রযোজ্য থাকে। IDE প্রোভাইডার - (`cursor`, OAuth/IDE সেশন) অপরিবর্তিত রয়েছে। -2. **Cursor CLI passthrough**: Cursor CLI (`agent`)-কে OmniRoute-এর দিকে নির্দেশ করুন, - যাতে CLI-এর করা প্রতিটি RPC একটি OmniRoute API key দিয়ে authenticated হয়, - একটি `cursor-api` connection-এর credential দিয়ে Cursor-এ forward করা হয় - এবং Logs পৃষ্ঠায় record করা হয়। - -## কেন key exchange করা হয় - -`api2.cursor.sh` একটি কাঁচা `crsr_…` key-কে Bearer token হিসেবে প্রত্যাখ্যান করে (401)। Cursor -CLI প্রথমে key-টি `/auth/exchange_user_api_key`-এ POST করে এবং এক ঘণ্টা পর -মেয়াদোত্তীর্ণ হওয়া একটি session JWT পায়; ফিরে আসা `refreshToken`-এ একই -`exp` থাকে, তাই refresh করার অর্থ হলো key-টি আবার exchange করা। -`open-sse/services/cursorApiKeyAuth.ts` এই exchange সম্পন্ন করে, প্রতিটি key-এর জন্য একটি -session token cache করে, মেয়াদ শেষ হওয়ার পাঁচ মিনিট আগে পুনরায় exchange করে এবং Cursor -401 দিলে cached token বাদ দেয়। `CursorExecutor`, `cursor-api` connection-এর জন্য -upstream stream খোলার ঠিক আগে এটি call করে। +IDE সেশন ছাড়াই OmniRoute-এর পেছনে Cursor স্থাপনের দুটি উপায়: + +1. **`cursor-api` প্রোভাইডার** (কার্ড "Cursor API", উপনাম `cua`): একটি API-কী + প্রোভাইডার, যা Cursor ব্যবহারকারীর API কী (`crsr_…`, যা + `https://cursor.com/dashboard/api`-এ তৈরি করা হয়) সংরক্ষণ করে। এরপর যেকোনো OmniRoute ক্লায়েন্ট + `/v1/chat/completions`-এর মাধ্যমে `cursor-api/` অথবা + `cua/` হিসেবে Cursor মডেলগুলোতে পৌঁছাতে পারে, যেখানে স্বাভাবিক কোটা, ফলব্যাক ও লগিং স্তরগুলো প্রযোজ্য। IDE + প্রোভাইডারটি (`cursor`, OAuth/IDE সেশন) অপরিবর্তিত থাকে। +2. **Cursor CLI পাসথ্রু**: Cursor CLI (`agent`)-কে OmniRoute-এর দিকে নির্দেশ করুন, যাতে + CLI-এর করা প্রতিটি RPC একটি OmniRoute API কী দিয়ে প্রমাণীকৃত হয়, একটি + `cursor-api` সংযোগের ক্রেডেনশিয়াল দিয়ে Cursor-এ ফরওয়ার্ড করা হয় এবং + Logs পৃষ্ঠায় রেকর্ড করা হয়। + +## কেন কীটি বিনিময় করা হয় + +`api2.cursor.sh` একটি কাঁচা `crsr_…` কীকে Bearer টোকেন হিসেবে প্রত্যাখ্যান করে (401)। Cursor +CLI প্রথমে কীটি `/auth/exchange_user_api_key`-এ POST করে এবং এক ঘণ্টা পর মেয়াদ শেষ হয় এমন একটি সেশন +JWT পায়; ফেরত আসা `refreshToken`-এ একই +`exp` থাকে, তাই রিফ্রেশ করার অর্থ হলো কীটি পুনরায় বিনিময় করা। +`open-sse/services/cursorApiKeyAuth.ts` এই বিনিময় সম্পন্ন করে, প্রতিটি কীর জন্য একটি সেশন +টোকেন ক্যাশ করে, মেয়াদ শেষ হওয়ার পাঁচ মিনিট আগে পুনরায় বিনিময় করে এবং Cursor 401 উত্তর দিলে ক্যাশে থাকা +টোকেনটি সরিয়ে দেয়। `CursorExecutor`, `cursor-api` সংযোগের জন্য +আপস্ট্রিম স্ট্রিম খোলার ঠিক আগে এটিকে কল করে। ## `cursor-api` প্রোভাইডার -Registry: `open-sse/config/providers/registry/cursor/index.ts` +রেজিস্ট্রি: `open-sse/config/providers/registry/cursor/index.ts` (`cursor_apiProvider`, `authType: "apikey"`, `cursor`-এর মতো একই `format`, `baseUrl` এবং -`models`)। Catalog card: -`src/shared/constants/providers/apikey/specialty-media.ts`। Executor map: +`models`)। ক্যাটালগ কার্ড: +`src/shared/constants/providers/apikey/specialty-media.ts`। এক্সিকিউটর ম্যাপ: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`)। -Dashboard: Providers → Cursor API → API key যোগ করুন। +ড্যাশবোর্ড: Providers → Cursor API → Add API key। REST: @@ -48,7 +47,7 @@ curl -sS -X POST http://localhost:20128/api/providers \ -d '{"provider":"cursor-api","name":"cursor-api-key","apiKey":"crsr_…","priority":1}' ``` -তারপর: +এরপর: ```bash curl -sS http://localhost:20128/v1/chat/completions \ @@ -59,43 +58,55 @@ curl -sS http://localhost:20128/v1/chat/completions \ নোট: -- `cursor-api`-এর model listing স্থির Cursor registry থেকে আসে (IDE প্রোভাইডার - fallback হিসেবে যে একই তালিকা ব্যবহার করে); OmniRoute host-এ `cursor-agent` install করার - প্রয়োজন নেই। -- `POST /api/providers/{id}/refresh-cursor` শুধুমাত্র `cursor` IDE প্রোভাইডারের - জন্য; `cursor-api` connection-গুলোর renew করার মতো কোনো IDE session নেই। +- `cursor-api`-এর মডেল তালিকা স্ট্যাটিক Cursor রেজিস্ট্রি থেকে আসে ( + IDE প্রোভাইডার ফলব্যাক হিসেবে যে একই তালিকা ব্যবহার করে); OmniRoute হোস্টে + `cursor-agent` ইনস্টল করার প্রয়োজন নেই। +- `POST /api/providers/{id}/refresh-cursor` কেবল `cursor` IDE প্রোভাইডারের + জন্য; `cursor-api` সংযোগে নবায়ন করার মতো কোনো IDE সেশন নেই। -## Cursor CLI passthrough +## নেটিভ মডেল ID এবং প্রচেষ্টার মাত্রা -Route: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`। `/api/cursor-cli/` prefix-টি -`src/shared/constants/publicApiRoutes.ts`-এ registered আছে, কারণ handler -নিজস্ব authentication প্রয়োগ করে: +`cursor` / `cu` এবং `cursor-api` / `cua`-এর ক্ষেত্রে, শেয়ার করা Claude-effort নরমালাইজার +অনুরোধ করা মডেল ID অপরিবর্তিত রাখে। Cursor একটি প্রকৃত মডেল ID-এর অংশ হিসেবে +`-low`-এর মতো একটি সাফিক্স প্রকাশ করতে পারে, OmniRoute-এর প্রচেষ্টা-উপনাম হিসেবে নয়। +Cursor এক্সিকিউটর লাইভ ক্যাটালগের সঙ্গে হুবহু মিল সংরক্ষণ করে; যখন কোনো +মিল থাকে না, তখন এর বিদ্যমান মডেল রিজলভার সাফিক্স-টু-প্যারামিটার ফলব্যাক পরিচালনা করে। -| Path | CLI থেকে প্রত্যাশিত auth | OmniRoute যা করে | -| ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Key-টি validate করে, একটি 1h HS256 JWT (`JWT_SECRET` দিয়ে signed) তৈরি করে এবং সেটি ফেরত দেয় | -| অন্য প্রতিটি path (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Issuer/audience/expiry verify করে, একটি active `cursor-api` connection বেছে নেয়, exchanged Cursor token দিয়ে Authorization header বদলে দেয় এবং reply stream করে ফেরত পাঠায় | +এটি সরাসরি Claude, Claude-সামঞ্জস্যপূর্ণ, +অথবা Vertex রুটগুলোর প্রচেষ্টা নরমালাইজেশন পরিবর্তন করে না। উপলভ্যতা এখনও নির্বাচিত Cursor অ্যাকাউন্টের +ক্যাটালগ ও এনটাইটেলমেন্টের ওপর নির্ভর করে। -CLI তার পাওয়া যেকোনো token থেকে `exp` decode করে, তাই তাকে একটি opaque -token দিলে প্রায় প্রতিটি request-এর আগে সেটি পুনরায় exchange করে; তৈরি করা JWT এটি -এড়ায়। OmniRoute থেকে 401 এলে CLI আবার exchange করে। +## Cursor CLI পাসথ্রু + +রুট: `src/app/api/cursor-cli/[...path]/route.ts` → +`open-sse/handlers/cursorCliProxy.ts`। `/api/cursor-cli/` প্রিফিক্সটি +`src/shared/constants/publicApiRoutes.ts`-এ নিবন্ধিত, কারণ হ্যান্ডলারটি +নিজস্ব প্রমাণীকরণ প্রয়োগ করে: + +| পাথ | CLI থেকে প্রত্যাশিত প্রমাণীকরণ | OmniRoute যা করে | +| ----------------------------------------------------------------------------------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | কী যাচাই করে, ১ ঘণ্টার একটি HS256 JWT (`JWT_SECRET` দিয়ে স্বাক্ষরিত) তৈরি করে এবং সেটি ফেরত দেয় | +| অন্য সব পাথ (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | ইস্যুকারী/অডিয়েন্স/মেয়াদ যাচাই করে, একটি সক্রিয় `cursor-api` সংযোগ বেছে নেয়, Authorization হেডারটি এক্সচেঞ্জ করা Cursor টোকেন দিয়ে প্রতিস্থাপন করে এবং প্রতিক্রিয়াটি স্ট্রিম করে ফেরত পাঠায় | + +CLI প্রাপ্ত যেকোনো টোকেন থেকে `exp` ডিকোড করে, তাই এটিকে একটি অস্বচ্ছ +টোকেন দিলে প্রায় প্রতিটি অনুরোধের আগে এটি পুনরায় এক্সচেঞ্জ করে; তৈরি করা JWT +এটি এড়ায়। OmniRoute থেকে 401 পেলে CLI আবার এক্সচেঞ্জ করে। ### সেটআপ -1. একটি OmniRoute API key (Dashboard → API keys) এবং একটি `cursor-api` - connection তৈরি করুন। -2. Agent stream-এর জন্য CLI-কে HTTP/1.1 ব্যবহার করতে বলুন। +1. একটি OmniRoute API কী (Dashboard → API keys) এবং একটি `cursor-api` + সংযোগ তৈরি করুন। +2. এজেন্ট স্ট্রিমের জন্য CLI-কে HTTP/1.1 ব্যবহার করতে বলুন। `~/.cursor/cli-config.json`-এ: ```json { "network": { "useHttp1ForAgent": true } } ``` - এটি ছাড়া CLI আলাদাভাবে configured agent host-এ HTTP/2-এর মাধ্যমে agent turn - খোলে এবং কেবল control-plane RPC-গুলো endpoint-এর মধ্য দিয়ে যায়। + এটি ছাড়া CLI একটি আলাদাভাবে কনফিগার করা এজেন্ট হোস্টে HTTP/2-এর মাধ্যমে + এজেন্ট টার্ন খোলে এবং কেবল কন্ট্রোল-প্লেন RPC-গুলো এন্ডপয়েন্টের মধ্য দিয়ে যায়। -3. OmniRoute-এর বিরুদ্ধে CLI চালান: +3. OmniRoute-এর বিপরীতে CLI চালান: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -103,13 +114,13 @@ token দিলে প্রায় প্রতিটি request-এর আ agent -p --trust "Reply with exactly OK" ``` -প্রতিটি hop Logs-এ provider `cursor-api`, request type `cursor-cli`, -path `/api/cursor-cli/` হিসেবে জমা হয় এবং সংশ্লিষ্ট OmniRoute API key ও যে -connection সেটি serve করেছে, তার সঙ্গে attributed থাকে। +প্রতিটি হপ Logs-এ provider `cursor-api`, request type `cursor-cli`, +path `/api/cursor-cli/` হিসেবে পৌঁছায় এবং OmniRoute API কী ও +অনুরোধটি পরিবেশনকারী সংযোগের সঙ্গে সম্পর্কিত হিসেবে চিহ্নিত হয়। -### ব্যর্থতার ধরনসমূহ +### ব্যর্থতার ধরন -| পরিস্থিতি | CLI-এর প্রতিক্রিয়া | +| পরিস্থিতি | CLI-তে পাঠানো প্রতিক্রিয়া | | ------------------------------------------------------ | ---------------------------------------------------- | | অজানা OmniRoute কী এবং `REQUIRE_API_KEY=true` | এক্সচেঞ্জে 401 `unauthenticated` | | `REQUIRE_API_KEY=false` | বেনামী সেশন (`/v1/*`-এর আচরণের অনুরূপ) | diff --git a/docs/i18n/bn/docs/reference/API_REFERENCE.md b/docs/i18n/bn/docs/reference/API_REFERENCE.md index 5b00469bc473..6baff82bcd8a 100644 --- a/docs/i18n/bn/docs/reference/API_REFERENCE.md +++ b/docs/i18n/bn/docs/reference/API_REFERENCE.md @@ -455,10 +455,10 @@ Bifrost, CLIProxyAPI এবং ভবিষ্যতের সাইডকার | POST | `/v1/videos/generations` | OpenAI-ধাঁচের ভিডিও জেনারেশন | | POST | `/v1/music/generations` | OpenAI-ধাঁচের মিউজিক জেনারেশন | | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (অডিও বডি ফেরত দেয়) | +| POST | `/v1/audio/speech` | OpenAI TTS (অডিও বডি রিটার্ন করে) | | POST | `/v1/rerank` | Cohere/Voyage-ধাঁচের রির্যাঙ্ক | -| POST | `/v1/classify` | Jina ক্লাসিফাই (`api.jina.ai`) | -| POST | `/v1/segment` | Jina সেগমেন্টার (`segment.jina.ai`) | +| POST | `/v1/classify` | Jina classify (`api.jina.ai`) | +| POST | `/v1/segment` | Jina segmenter (`segment.jina.ai`) | | POST | `/v1/moderations` | OpenAI Moderations | | GET | `/v1/models` | OpenAI | | POST | `/v1/messages/count_tokens` | Anthropic | @@ -470,17 +470,17 @@ Bifrost, CLIProxyAPI এবং ভবিষ্যতের সাইডকার | POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI টোকেনযুক্ত অ্যালিয়াস | | POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses টোকেনযুক্ত অ্যালিয়াস | | POST | `/api/v1/vscode/{token}/api/chat` | Ollama টোকেনযুক্ত অ্যালিয়াস | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama ট্যাগের টোকেনযুক্ত অ্যালিয়াস | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama tags টোকেনযুক্ত অ্যালিয়াস | -সব POST রুট একই কাঠামো অনুসরণ করে: `Bearer your-api-key` + Zod-ভ্যালিডেটেড JSON বডি (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` ইত্যাদি; `src/shared/validation/schemas.ts` দেখুন)। স্কিমা যাচাই ব্যর্থ হলে 4xx ফেরত দেওয়া হয়। +সব POST রুট একই কাঠামো অনুসরণ করে: `Bearer your-api-key` + Zod-ভ্যালিডেটেড JSON বডি (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` ইত্যাদি; `src/shared/validation/schemas.ts` দেখুন)। স্কিমা যাচাই ব্যর্থ হলে 4xx রিটার্ন করা হয়। -যেসব ক্লায়েন্ট `Authorization: Bearer ...` সংযুক্ত করতে পারে না, তাদের জন্য OmniRoute URL-এর মধ্যেও API কী গ্রহণ করে—হয় কোয়েরি-স্ট্রিং সামঞ্জস্যের মাধ্যমে (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), অথবা নিচে নথিভুক্ত নির্দিষ্ট `/api/v1/vscode/{token}/...` এন্ডপয়েন্টগুলোর মাধ্যমে। +যেসব ক্লায়েন্ট `Authorization: Bearer ...` সংযুক্ত করতে পারে না, সেগুলোর জন্য OmniRoute ক্যোয়ারি-স্ট্রিং সামঞ্জস্য (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) অথবা নিচে নথিভুক্ত নিবেদিত `/api/v1/vscode/{token}/...` এন্ডপয়েন্টের মাধ্যমে URL-এ API key গ্রহণ করে। ```bash -# রির্যাঙ্ক +# রির্যাঙ্ক (ক্লাউড রেজিস্ট্রি প্রোভাইডার অথবা "/" হিসেবে একটি OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড) POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina ক্লাসিফাই (Foundation API ক্রেডেনশিয়াল) +# Jina classify (Foundation API ক্রেডেনশিয়াল) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Jina সেগমেন্টার @@ -492,7 +492,7 @@ POST /v1/search { "query": "...", "provider": "jina-search" } # মডারেশন POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — audio/mpeg (অথবা অনুরোধ করা ফরম্যাটের) বডি ফেরত দেয় +# TTS — audio/mpeg (অথবা অনুরোধকৃত ফরম্যাট) বডি রিটার্ন করে POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # ছবি সম্পাদনা (multipart) @@ -503,7 +503,29 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### নির্দিষ্ট প্রোভাইডার রুটসমূহ +> **রির্যাঙ্ক প্রোভাইডার নোড:** `POST /v1/rerank` OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোডেও রাউট করে +> (oMLX, vLLM, Infinity, কোনো গেটওয়ের পেছনে থাকা TEI, …), যেগুলোকে `/` হিসেবে সম্বোধন করা হয়। লুপব্যাক +> নোড (`localhost`, `127.0.0.1`, `172.16.0.0/12`) সবসময় যোগ্য। অন্য যেকোনো +> হোস্টের নোড—LAN বক্স বা Tailscale পিয়ার—কেবল তখনই যোগ্য, যখন অপারেটর +> `RERANK_REMOTE_PROVIDER_NODES` ফিচার ফ্ল্যাগ সক্রিয় করেন **এবং** নোডটির বেস URL প্রোভাইডারের +> আউটবাউন্ড URL নীতি (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) পাস করে; +> ক্লাউড-মেটাডেটা হোস্টে কখনো রাউট করা হয় না। মেমরি ইঞ্জিনের রির্যাঙ্ক ধাপটি লুপব্যাকের মাধ্যমে +> এই রুটকে কল করে, তাই Memory সেটিংসে `rerankProviderModel`-এর ক্ষেত্রেও একই নিয়ম প্রযোজ্য। +> +> **লোকাল সার্ভারের কাঠামো:** নোডটিকে `/v1/rerank`-এ এবং 404 হলে `/rerank`-এ কল করা হয় +> (Infinity, TEI)। আপস্ট্রিম বডিতে Cohere/OpenAI বানান (`documents`, +> `return_documents`) এবং TEI বানান (`texts`, `return_text`) উভয়ই থাকে এবং আপস্ট্রিম রেসপন্সকে +> Cohere এনভেলপে স্বাভাবিকীকরণ করা হয়: TEI-এর সরাসরি `[{index, score, text}]`, সরল গেটওয়ে থেকে +> `{results: [{index, score}]}` এবং Voyage-ধাঁচের `{data: [...]}`—সবই ক্লায়েন্টের কাছে +> `{results: [{index, relevance_score, document?}]}` হিসেবে ফিরে আসে, স্কোর অনুযায়ী সাজানো এবং `top_n`-এ সীমাবদ্ধ। + +> **প্রোভাইডার-নোড আবিষ্কার:** একটি OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোডের মডেলগুলো `GET /v1/models`-এ +> নোড প্রিফিক্সের অধীনে প্রদর্শিত হয়। যেসব রোতে কোনো এন্ডপয়েন্ট মেটাডেটা নেই (লোকাল `/v1/models` তালিকায় যা সাধারণ), +> সেগুলো নোডের `apiType` উত্তরাধিকারসূত্রে পায়; তাই একটি `embeddings` নোডের মডেলগুলো `type: "embedding"` এবং একটি +> `rerank` নোডের মডেলগুলো ডিফল্টভাবে chat হওয়ার পরিবর্তে `type: "rerank"` হয়; তবে সিঙ্ক করা বা ম্যানুয়ালি যোগ করা রোতে স্পষ্টভাবে দেওয়া +> `supportedEndpoints` এখনও অগ্রাধিকার পায়। + +### নিবেদিত প্রোভাইডার রুটসমূহ ```bash POST /v1/providers/{provider}/chat/completions @@ -511,7 +533,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -প্রোভাইডার প্রিফিক্স অনুপস্থিত থাকলে তা স্বয়ংক্রিয়ভাবে যোগ করা হয়। অসামঞ্জস্যপূর্ণ মডেলের ক্ষেত্রে `400` ফেরত দেওয়া হয়। +প্রোভাইডার প্রিফিক্স অনুপস্থিত থাকলে এটি স্বয়ংক্রিয়ভাবে যোগ করা হয়। অসামঞ্জস্যপূর্ণ মডেলগুলোর ক্ষেত্রে `400` রিটার্ন করা হয়। --- diff --git a/docs/i18n/bn/docs/reference/ENVIRONMENT.md b/docs/i18n/bn/docs/reference/ENVIRONMENT.md index 0f54f7e53dd3..f8ea84f1890e 100644 --- a/docs/i18n/bn/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/bn/docs/reference/ENVIRONMENT.md @@ -81,68 +81,67 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" OmniRoute সব ধরনের স্থায়ী ডেটা সংরক্ষণের জন্য **SQLite** (`better-sqlite3`-এর মাধ্যমে) ব্যবহার করে। এই ভেরিয়েবলগুলো ডেটার অবস্থান, এনক্রিপশন এবং জীবনচক্র নিয়ন্ত্রণ করে। -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite DB, ব্যাকআপ এবং ডেটা ফাইলের রুট ডিরেক্টরি। Docker ভলিউম বা কাস্টম পাথের জন্য এটি ওভাররাইড করুন। | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(সেট করা নেই)_ | `src/lib/dataPaths.ts` | টেস্ট/eval-এর DATA_DIR সুরক্ষাব্যবস্থার জন্য বিকল্প পথ (#10428)। `DATA_DIR` ছাড়া চালানো টেস্ট এবং Node eval/print প্রোবগুলোকে (`-e`/`--eval`/`-p`/`--print`, যার মধ্যে `--eval=`/`--print=` ফর্মও অন্তর্ভুক্ত) একটি অস্থায়ী পরিত্যাজ্য ডিরেক্টরিতে পুনর্নির্দেশ করা হয়, যাতে সেগুলো অপারেটরের প্রকৃত ডেটাবেস খুলতে না পারে; প্রকৃত ডিরেক্টরি ব্যবহারে আবার সম্মতি দিতে এটিকে `1`-এ সেট করুন। | -| `OMNIROUTE_BUILD_SHA` | _(সেট করা নেই)_ | `src/lib/monitoring/buildSha.ts` | চলমান আর্টিফ্যাক্টের Git SHA। `npm run build:release` দ্বারা স্ট্যাম্প করা হয়; `dist/BUILD_SHA` সেন্টিনেল ছাড়াই সরবরাহ করা কনটেইনারে এটি ইনজেক্ট করা যায়। `/api/monitoring/health`-এ `system.buildSha` হিসেবে প্রকাশ করা হয়। | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | pack-artifact provenance gate যে ref-এর বিপরীতে build SHA যাচাই করে (#10427)। | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(সেট করা নেই)_ | `scripts/build/buildProvenance.ts` | যে বিল্ডের SHA release line-এ নেই, সেটিকে প্যাক করার অনুমতি দিতে এটি `1`-এ সেট করুন; এতে gate ব্যর্থ হওয়ার পরিবর্তে বিল্ডটিকে ইচ্ছাকৃত canary হিসেবে রেকর্ড করা হবে (#10427)। | -| `OMNIROUTE_SMOKE_API_KEY` | _(সেট করা নেই)_ | `scripts/ops/deploy-canary.mjs` | canary-deploy smoke probe-এর API key, যা `/v1/chat/completions`-এ `Authorization: Bearer` হিসেবে পাঠানো হয়। এটি শুধু deploy script ব্যবহার করে (#10429), server কখনোই করে না। এটি opt-in CLI smoke harness-এর `OMNIROUTE_SMOKE_*` ভেরিয়েবলগুলোর সঙ্গে সম্পর্কিত নয় (`RUN_CLI_SMOKE=1`, `tests/integration/upstream-cli-smoke.int.test.ts`-এ `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`) — [CLI ইন্টিগ্রেশন → প্রকৃত smoke sweep](../guides/CLI-INTEGRATIONS.md) দেখুন। | -| `OMNIROUTE_BUILDING` | _(সেট করা নেই)_ | `src/lib/buildPhase.ts` | বিল্ড-পর্যায়ের সংকেত (#10060): `scripts/build/build-next-isolated.mjs` এটিকে `1`-এ সেট করে এবং উৎপন্ন প্রতিটি build worker এটি উত্তরাধিকারসূত্রে পায়, যাতে DB layer নেটিভ better-sqlite3 addon লোড করার পরিবর্তে একটি no-op stub ফেরত দেয় (যা প্রস্থানকালে worker-কে abort করে)। চলমান server-এর জন্য এটি কখনো সেট করা হয় না। | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | অস্বাভাবিক vendored tree-এর জন্য ঐচ্ছিক native-dependency prebuild check এড়িয়ে যেতে এটি `1`-এ সেট করুন। এটি কোনো অনুপস্থিত dependency-কে buildযোগ্য করে না; কেবল তখনই ব্যবহার করুন, যখন native dependency আলাদাভাবে সরবরাহ করা হয়। | -| `OMNIROUTE_DATA_DIR` | _(সেট করা নেই)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR`-এর **fallback alias**, যা কেবল `DATA_DIR` সেট করা না থাকলে পরীক্ষা করা হয়। PromptQL executor-এর on-disk thread-sticky session cache (`/promptql-thread-sessions.json`) খুঁজে পেতে ব্যবহৃত হয়; কোনো ভেরিয়েবলই সেট করা না থাকলে cache শুধু in-memory থাকে (restart-এর পর সংরক্ষিত থাকে না)। | -| `OMNIROUTE_PLUGINS_DIR` | _(সেট করা নেই)_ | `src/lib/plugins/scanner.ts` | **runtime plugin scanner** যে ডিরেক্টরি পড়ে—এবং plugin manager যে root-এ ইনস্টল করে—সেটি নির্ধারণ করে, ফলে home থেকে নির্ধারিত default ওভাররাইড হয় (#11827)। শুধু scan path সরানোর জন্য HOME পরিবর্তন না করে Docker/K8s-এ bind-mount করা plugin tree-এর দিকে এটি নির্দেশ করুন (HOME অন্যান্য সব home-relative আচরণও নিয়ন্ত্রণ করে)। সেট না থাকলে = `~/.omniroute/plugins`, অথবা process কোনো home export না করলে `/tmp/.omniroute/plugins`—এই ভেরিয়েবলটি এমন নীরব non-discovery দূর করে। নির্ধারিত ডিরেক্টরিটি startup-এর সময় একবার `scanner.dir_resolved` হিসেবে এবং যে input-টি নির্বাচিত হয়েছে সেটিসহ log করা হয়। শুধু server-side-এর জন্য: CLI command plugin নিজস্ব `OMNIROUTE_PLUGIN_PATH` ব্যবহার করে (অনুচ্ছেদ 9)। | -| `STORAGE_ENCRYPTION_KEY` | _(খালি = নিষ্ক্রিয়)_ | `src/lib/db/encryption.ts` | সংরক্ষিত অবস্থায় সম্পূর্ণ SQLite ডেটাবেস এনক্রিপশনের জন্য AES কী। `openssl rand -hex 32` দিয়ে তৈরি করুন। | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | এনক্রিপশন কী-এর সংস্করণ লেবেল। পুরোনো ব্যাকআপ ডিক্রিপ্ট করার সুবিধার্থে কী রোটেশন করার সময় এটি বৃদ্ধি করুন। | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` হলে, নিয়মিত/লেখার-পূর্ববর্তী SQLite ফাইল ব্যাকআপ (models.dev-এর মূল্য সংরক্ষণ/মুছে ফেলা, সেটিংস লেখা) এড়িয়ে যায়। ম্যানুয়াল এবং পুনরুদ্ধারের-পূর্ববর্তী ব্যাকআপ তারপরও চলে। এটি মাইগ্রেশন রানারের বাধ্যতামূলক টেকসই নিরাপত্তা স্ন্যাপশট বা বিদ্যমান স্থায়ী DB-এর জন্য গণ-মাইগ্রেশন সুরক্ষা **নিষ্ক্রিয় করে না**। অ-ম্যানুয়াল ব্যাকআপ সর্বোচ্চ প্রতি 60 মিনিটে একবারে সীমিত থাকে। ড্যাশবোর্ডের **Settings → Storage** থেকে নিয়মিত স্বয়ংক্রিয় ব্যাকআপ স্বাধীনভাবে নিষ্ক্রিয় করা যায়। | -| `OMNIROUTE_CRYPT_KEY` | _(সেট করা নেই)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY`-এর **লিগ্যাসি উপনাম**। প্রাথমিক ভেরিয়েবল অনুপস্থিত থাকলে ফলব্যাক হিসেবে গৃহীত হয়। | -| `OMNIROUTE_API_KEY_BASE64` | _(সেট করা নেই)_ | `src/lib/db/encryption.ts` | **লিগ্যাসি উপনাম** (Base64-এনকোড করা রূপ), যা ফলব্যাক হিসেবে গৃহীত হয়। ব্যবহারের আগে স্বয়ংক্রিয়ভাবে ডিকোড করা হয়। | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(সেট করা নেই)_ | `src/lib/db/core.ts` | পর্যায়ক্রমিক SQLite স্বাস্থ্য পরীক্ষার ব্যবধান (ms) ওভাররাইড করুন। সেট করা না থাকলে, `NODE_ENV` থেকে ডিফল্ট মান নির্ধারিত হয়। | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/walMaintenance.ts` | পর্যায়ক্রমিক `wal_checkpoint(TRUNCATE)` ব্যবধান (ms) ওভাররাইড করুন। স্বয়ংক্রিয় চেকপয়েন্ট কখনোই WAL ফাইলটিকে নিজে থেকে ছোট করে না এবং দীর্ঘ সময় ধরে চলা সার্ভার কখনোই তার DB বন্ধ করে না। `0` দিলে নিষ্ক্রিয় হয়। | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | ঘন ঘন হওয়া `wal_checkpoint(PASSIVE)`-এর ব্যবধান (ms) ওভাররাইড করুন। এটি অপেক্ষমাণ WAL ফ্রেমগুলো ছোট রাখে, যাতে পর্যায়ক্রমিক TRUNCATE কখনোই মূল থ্রেডে বহু-GB ব্যাকলগ কপি না করে। `0` দিলে নিষ্ক্রিয় হয়। | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | কোনো PASSIVE টিক WAL ফাইলটিকে এই আকারের বেশি পেলে, ধীরগতির টিকের জন্য অপেক্ষা না করে অবিলম্বে `wal_checkpoint(TRUNCATE)`-এ উন্নীত করে। | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | গুরুতর রিসোর্স চাপ `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` সময় ধরে অব্যাহত থাকার পর প্রক্রিয়াটি বন্ধ করতে `1`/`true`/`yes`/`on` সেট করুন; এতে অনির্দিষ্টকাল 503 পরিবেশনের বদলে কোনো সুপারভাইজার (systemd `Restart=always`, Docker পুনরারম্ভ নীতি) একটি পরিচ্ছন্ন প্রক্রিয়া পুনরায় চালু করতে পারে। | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | স্ব-পুনরারম্ভের জন্য প্রস্থান কার্যকর হওয়ার আগে গুরুতর চাপ কতক্ষণ স্থায়ী থাকতে হবে। | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ফলব্যাক অ্যাডাপ্টার ব্যবহারের সময় `sql-wasm.wasm`-এর সুস্পষ্ট পাথ (অ্যাবসোলিউট অথবা cwd-এর সাপেক্ষে)। সেট করা না থাকলে প্যাকেজ ডিপেন্ডেন্সি এবং সম্ভাব্য লেআউটের মাধ্যমে স্বয়ংক্রিয়ভাবে শনাক্ত করা হয়। | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/core.ts` | পর্যায়ক্রমিক `wal_checkpoint(TRUNCATE)` ব্যবধান (ms) ওভাররাইড করুন। স্বয়ংক্রিয় চেকপয়েন্ট কখনোই WAL ফাইলটিকে নিজে থেকে ছোট করে না এবং দীর্ঘ সময় ধরে চলা সার্ভার কখনোই তার DB বন্ধ করে না। `0` দিলে নিষ্ক্রিয় হয়। | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | কোনো চূড়ান্ত অবস্থায় থাকা (সম্পন্ন/ব্যর্থ/বাতিল/মেয়াদোত্তীর্ণ) Batch API কাজের চেকপয়েন্ট, উল্লেখিত ইনপুট/আউটপুট/ত্রুটি ফাইল এবং সারি মুছে ফেলার আগে স্বয়ংক্রিয় ক্লিনআপ সুইপ যত দিন সংরক্ষণ করে। এটি কেবল `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` চালু করার পর কার্যকর হয়; OpenAI-এর নিজস্ব Batch API আউটপুট সংরক্ষণ সময়সীমার সঙ্গে মেলে। অপারেটর-চালিত `DELETE /api/v1/batches/delete-completed` রুটকে প্রভাবিত করে না, যা নকশা অনুযায়ী শর্তহীন (কোনো বয়স ফিল্টার নেই) থাকে। | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` হলে, স্বয়ংক্রিয় ক্লিনআপ সুইপকে `OMNIROUTE_BATCH_RETENTION_DAYS`-এর চেয়ে পুরোনো চূড়ান্ত অবস্থায় পৌঁছানো Batch API জব (এবং তাদের চেকপয়েন্ট) মুছে ফেলতে এবং যেসব আপলোড করা ফাইলের নিজস্ব `expires_at` পেরিয়ে গেছে সেগুলোর BLOB কনটেন্ট পরিষ্কার করতে দিন। ডিফল্টভাবে বন্ধ: কোনো অপারেটর এটি চালু না করা পর্যন্ত প্রতিটি বিদ্যমান ইনস্টলেশন এই ডেটা ঠিক আগের মতোই রাখে। এটি ড্যাশবোর্ড থেকে সম্পাদনাযোগ্য একটি ফিচার ফ্ল্যাগও — `docs/reference/FEATURE_FLAGS.md` → Runtime দেখুন। | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | স্টার্টআপের সময় DB হেলথচেক সম্পূর্ণভাবে এড়িয়ে যেতে `1` সেট করুন। স্বল্পস্থায়ী টাস্ক এবং ইন্টিগ্রেশন টেস্টের জন্য উপযোগী। | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | DB হেলথচেক লুপটি সাধারণত এড়িয়ে যাওয়া হলেও (যেমন, স্বল্পস্থায়ী টাস্কে) জোর করে চালু করতে `1` সেট করুন। | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install`-এর সময় নেটিভ রানটাইম ওয়ার্ম-আপ এড়িয়ে যেতে `1` সেট করুন। sqlite ইতিমধ্যে বিল্ড করা আছে এমন CI/হেডলেস ইনস্টলেশনের জন্য উপযোগী। | -| `OMNIROUTE_MIGRATIONS_DIR` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/db/migrationRunner.ts` | মাইগ্রেশন রানার যে ডিরেক্টরি স্ক্যান করে সেটি ওভাররাইড করুন। কাস্টম বিল্ডে বান্ডেল করা মাইগ্রেশন সরবরাহের সময় এটি উপযোগী। | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(সেট করা নেই)_ | `src/lib/db/migrationRunner/extraDirs.ts` | প্ল্যাটফর্মের পাথ ডিলিমিটার দিয়ে পৃথক করা `namespace=dir` এন্ট্রি হিসেবে অতিরিক্ত মাইগ্রেশন ডিরেক্টরি (যেমন `ee=/opt/app/enterprise/db/migrations`)। সেখানে পাওয়া ফাইলগুলো `-` হিসেবে রেকর্ড করা হয়, ফলে নিজস্ব মাইগ্রেশনসহ কোনো ডিস্ট্রিবিউশন কখনোই আপস্ট্রিমের সংখ্যাভিত্তিক স্লটের সঙ্গে সংঘর্ষে পড়ে না। কোনো বিকৃত এন্ট্রি, অবৈধ নেমস্পেস বা অনুপস্থিত ডিরেক্টরির ক্ষেত্রে স্কিমাটি নীরবে এড়িয়ে যাওয়ার পরিবর্তে স্টার্টআপের সময় ত্রুটি নিক্ষেপ করা হয়। | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | বিপুলসংখ্যক অপেক্ষমাণ মাইগ্রেশনের নিরাপত্তা থ্রেশহোল্ড (#3416)। কোনো বিদ্যমান DB-তে এর চেয়ে বেশি মাইগ্রেশন অপেক্ষমাণ থাকলে স্টার্টআপ বাতিল হয় (মুছে ফেলা ট্র্যাকিং টেবিল থেকে সুরক্ষা দেয়)। পুরোনো ব্যাকআপ পুনরুদ্ধার করতে মানটি বাড়ান; পরীক্ষাটি নিষ্ক্রিয় করতে `0` সেট করুন। | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` রিলিজ গেটের কার্যকরী ডিরেক্টরি। এর জন্য প্রায় 12 GB প্রয়োজন (দুটি ~3 GB ইনস্টল ট্রি এবং tarball), তাই এটি ছোট tmpfs-এ চালানো যাবে না — স্ব-হোস্টেড রানারে `/tmp` হলো 12 GB RAM-সমর্থিত tmpfs এবং গেটটি এর সম্পূর্ণ স্থান ব্যবহার করে ফেলেছিল, ফলে প্যাকেজটি অসম্পূর্ণ হয়ে যায়। | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(কোডে ডিফল্ট)_ | `src/lib/spend/batchWriter.ts` | ব্যাচভিত্তিক ব্যয়/খরচ রাইটারের ফ্লাশ বিরতি (ms)। কম মান রাইট কোয়ালেসিং কমায়; বেশি মান DB কনটেনশন কমায়। | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(কোডে ডিফল্ট)_ | `src/lib/spend/batchWriter.ts` | জোরপূর্বক ফ্লাশের আগে সর্বোচ্চসংখ্যক বাফারকৃত ব্যয় এন্ট্রি। উচ্চ-QPS ডিপ্লয়মেন্টে বাড়ান; সীমাবদ্ধ মেমরি বেশি গুরুত্বপূর্ণ হলে কমান। | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(সেট করা নেই)_ | `open-sse/utils/proxyFetch.ts` | Vercel রিলে পাথে `[ProxyFetch]` ডিবাগ লগ নির্গত করতে `"true"` সেট করুন। রাউটিং-সংক্রান্ত ইঙ্গিত ফাঁস হওয়া এড়াতে ডিফল্টভাবে বন্ধ। | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | বিস্তারিত `[ProxyEgress]` প্রসেস-লগ লাইনে ক্লায়েন্ট/এগ্রেস IP এবং অ্যাকাউন্ট প্রিফিক্স অন্তর্ভুক্ত করতে `"true"` বা `"1"` সেট করুন। প্রসেস লগে যেন IP বা অ্যাকাউন্ট প্রিফিক্স ফাঁস না হয়, তাই এটি ডিফল্টভাবে বন্ধ রাখা হয়। | -| `OMNIROUTE_DEBUG` | _(সেট করা নেই)_ | `bin/cli/commands/quota.mjs` | CLI কোটা কমান্ড থেকে stderr-এ প্রতি-রিকোয়েস্টের সময়সংক্রান্ত ডায়াগনস্টিক (`[omniroute] GET completed in Nms`) প্রিন্ট করতে `1` সেট করুন। | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(স্বয়ংক্রিয়)_ | `scripts/dev/healthcheck.mjs` | কনটেইনার হেলথচেক যে সুস্পষ্ট পাথটি পরীক্ষা করে। সেট করা না থাকলে প্রোবটি `OMNIROUTE_BASE_PATH` থেকে পাথ নির্ধারণ করে; এটি সেট করলে গভীর মনিটরিং এন্ডপয়েন্টে আবার অপ্ট ইন করা হয়। | -| `OMNIROUTE_DEBUG_COMPLETION` | _(সেট করা নেই)_ | `bin/cli/commands/completion.mjs` | CLI শেল-কমপ্লিশন ক্যাশ পাথগুলো (রিড/রিফ্রেশ/রাইট) থেকে `[omniroute completion]` ডায়াগনস্টিক নির্গত করতে যেকোনো অ-খালি মান সেট করুন। ডিফল্টভাবে বন্ধ — ওই ক্যাশগুলো নীরবে ব্যর্থ হয়, যাতে কোনো অনুপস্থিত/ক্ষতিগ্রস্ত ক্যাশ কখনোই ট্যাব-কমপ্লিশন নষ্ট না করে। | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | পৃথক ব্যাচ আইটেমের জন্য সর্বোচ্চ পুনঃচেষ্টা সময়সীমা (ms)। এই সময়সীমা অতিক্রম করা আইটেমগুলোকে ব্যর্থ হিসেবে চিহ্নিত করা হয়। | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | ব্যাচ আইটেম পুনঃচেষ্টায় এক্সপোনেনশিয়াল ব্যাকঅফের প্রাথমিক বিলম্ব (ms)। | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | ব্যাচ আইটেম পুনঃচেষ্টার মধ্যবর্তী এক্সপোনেনশিয়াল ব্যাকঅফের সর্বোচ্চ সীমা (ms)। | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | একই সময়ে প্রক্রিয়াকৃত ব্যাচের সর্বোচ্চ সংখ্যা। থ্রুপুট বাড়াতে এটি বৃদ্ধি করুন; অতিরিক্ত রেট-লিমিট এড়াতে কম রাখুন। | +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite DB, ব্যাকআপ এবং ডেটা ফাইলের রুট ডিরেক্টরি। Docker ভলিউম বা কাস্টম পাথের জন্য এটি ওভাররাইড করুন। | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(সেট করা নেই)_ | `src/lib/dataPaths.ts` | টেস্ট/eval DATA_DIR গার্ডের (#10428) জন্য একটি বিকল্প ব্যবস্থা। `DATA_DIR` ছাড়া চালানো টেস্ট এবং Node eval/print প্রোবগুলোকে (`-e`/`--eval`/`-p`/`--print`, `--eval=`/`--print=` ফর্মসহ) একটি অস্থায়ী পরিত্যাজ্য ডিরেক্টরিতে পুনর্নির্দেশ করা হয়, যাতে সেগুলো অপারেটরের প্রকৃত ডেটাবেস খুলতে না পারে; প্রকৃত ডিরেক্টরি আবার ব্যবহার করতে চাইলে এটিকে `1`-এ সেট করুন। | +| `OMNIROUTE_BUILD_SHA` | _(সেট করা নেই)_ | `src/lib/monitoring/buildSha.ts` | চলমান আর্টিফ্যাক্টের Git SHA। `npm run build:release` দ্বারা স্ট্যাম্প করা হয়; যেসব কনটেইনারে `dist/BUILD_SHA` সেন্টিনেল থাকে না, সেগুলোতে ইনজেক্ট করা যায়। `/api/monitoring/health`-এ `system.buildSha` হিসেবে প্রকাশ করা হয়। | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | প্যাক-আর্টিফ্যাক্ট প্রোভেন্যান্স গেট যে ref-এর বিপরীতে বিল্ড SHA যাচাই করে (#10427)। | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(সেট করা নেই)_ | `scripts/build/buildProvenance.ts` | যে বিল্ডের SHA রিলিজ লাইনে নেই, সেটিকে প্যাক করার অনুমতি দিতে `1`-এ সেট করুন; এতে গেট ব্যর্থ হওয়ার পরিবর্তে বিল্ডটি ইচ্ছাকৃত canary হিসেবে রেকর্ড করা হবে (#10427)। | +| `OMNIROUTE_SMOKE_API_KEY` | _(সেট করা নেই)_ | `scripts/ops/deploy-canary.mjs` | canary-deploy স্মোক প্রোবের API কী, যা `/v1/chat/completions`-এ `Authorization: Bearer` হিসেবে পাঠানো হয়। এটি শুধু ডিপ্লয় স্ক্রিপ্ট দ্বারা ব্যবহৃত হয় (#10429), সার্ভার কখনো এটি ব্যবহার করে না। অপ্ট-ইন CLI স্মোক হারনেসের `OMNIROUTE_SMOKE_*` ভেরিয়েবলগুলোর (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`, যা `tests/integration/upstream-cli-smoke.int.test.ts`-এ রয়েছে) সঙ্গে এটি সম্পর্কিত নয় — দেখুন [CLI ইন্টিগ্রেশন → প্রকৃত স্মোক সুইপ](../guides/CLI-INTEGRATIONS.md)। | +| `OMNIROUTE_BUILDING` | _(সেট করা নেই)_ | `src/lib/buildPhase.ts` | বিল্ড-ফেজ সংকেত (#10060): `scripts/build/build-next-isolated.mjs` এটিকে `1`-এ সেট করে এবং প্রতিটি তৈরি করা বিল্ড ওয়ার্কার এটি উত্তরাধিকারসূত্রে পায়, যাতে DB স্তর নেটিভ better-sqlite3 অ্যাডঅন লোড করার পরিবর্তে কোনো কাজ না করা একটি স্টাব ফেরত দেয় (অ্যাডঅনটি প্রস্থানকালে ওয়ার্কারকে বন্ধ করে দেয়)। চলমান সার্ভারের জন্য এটি কখনো সেট করা হয় না। | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | অস্বাভাবিক ভেন্ডরড ট্রির ক্ষেত্রে ঐচ্ছিক নেটিভ-ডিপেন্ডেন্সি প্রিবিল্ড যাচাই এড়াতে এটিকে `1`-এ সেট করুন। এটি কোনো অনুপস্থিত ডিপেন্ডেন্সিকে বিল্ডযোগ্য করে না; কেবল তখনই ব্যবহার করুন, যখন নেটিভ ডিপেন্ডেন্সিগুলো অন্য কোনো উপায়ে সরবরাহ করা হয়। | +| `OMNIROUTE_DATA_DIR` | _(সেট করা নেই)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR`-এর **ফলব্যাক উপনাম**, যা কেবল `DATA_DIR` সেট করা না থাকলেই পরীক্ষা করা হয়। PromptQL এক্সিকিউটরের ডিস্কে থাকা থ্রেড-স্টিকি সেশন ক্যাশ (`/promptql-thread-sessions.json`) খুঁজে পেতে এটি ব্যবহৃত হয়; কোনো ভেরিয়েবলই সেট করা না থাকলে ক্যাশটি শুধু মেমরিতে থাকে (রিস্টার্টের পর সংরক্ষিত থাকে না)। | +| `OMNIROUTE_PLUGINS_DIR` | _(সেট করা নেই)_ | `src/lib/plugins/scanner.ts` | **রানটাইম প্লাগইন স্ক্যানার** যে ডিরেক্টরি পড়ে—এবং প্লাগইন ম্যানেজার যে রুটে ইনস্টল করে—এটি সেই ডিরেক্টরি নির্ধারণ করে এবং হোম থেকে উদ্ভূত ডিফল্টকে ওভাররাইড করে (#11827)। শুধু স্ক্যান পাথ স্থানান্তরের জন্য HOME সরানোর পরিবর্তে Docker/K8s-এ এটিকে bind-mounted প্লাগইন ট্রির দিকে নির্দেশ করুন (HOME অন্য সব হোম-আপেক্ষিক আচরণও নিয়ন্ত্রণ করে)। সেট করা না থাকলে = `~/.omniroute/plugins`; অথবা প্রসেস কোনো হোম এক্সপোর্ট না করলে `/tmp/.omniroute/plugins`—এই ভেরিয়েবলটি সেই নীরবভাবে প্লাগইন খুঁজে না পাওয়ার সমস্যাটি দূর করে। কার্যকর ডিরেক্টরিটি স্টার্টআপে একবার `scanner.dir_resolved` হিসেবে লগ করা হয়, সঙ্গে কোন ইনপুটটি প্রাধান্য পেয়েছে তাও উল্লেখ থাকে। শুধু সার্ভার-সাইডের জন্য: CLI কমান্ড প্লাগইনগুলো তাদের নিজস্ব `OMNIROUTE_PLUGIN_PATH` ব্যবহার করে (অনুচ্ছেদ 9)। | +| `STORAGE_ENCRYPTION_KEY` | _(খালি = নিষ্ক্রিয়)_ | `src/lib/db/encryption.ts` | সংরক্ষিত অবস্থায় সম্পূর্ণ SQLite ডেটাবেস এনক্রিপশনের জন্য AES কী। `openssl rand -hex 32` দিয়ে তৈরি করুন। | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | এনক্রিপশন কীর সংস্করণ লেবেল। পুরোনো ব্যাকআপ ডিক্রিপ্ট করার সুবিধার্থে কী রোটেশনের সময় এটি বৃদ্ধি করুন। | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` হলে নিয়মিত/লেখার-পূর্ববর্তী SQLite ফাইল ব্যাকআপ (models.dev-এর মূল্য সংরক্ষণ/মুছে ফেলা, সেটিংস লেখা) এড়িয়ে যায়। ম্যানুয়াল এবং পুনরুদ্ধারের-পূর্ববর্তী ব্যাকআপ তখনও চলে। এটি মাইগ্রেশন রানারের বাধ্যতামূলক টেকসই সুরক্ষা স্ন্যাপশট বা বিদ্যমান স্থায়ী DB-এর জন্য গণ-মাইগ্রেশন সুরক্ষা **নিষ্ক্রিয় করে না**। অ-ম্যানুয়াল ব্যাকআপ সর্বোচ্চ প্রতি 60 মিনিটে একবারে সীমিত থাকে। ড্যাশবোর্ডের **Settings → Storage** থেকে নিয়মিত স্বয়ংক্রিয় ব্যাকআপ আলাদাভাবে নিষ্ক্রিয় করা যায়। | +| `OMNIROUTE_CRYPT_KEY` | _(সেট করা নেই)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY`-এর **পুরোনো উপনাম**। প্রাথমিক ভেরিয়েবলটি অনুপস্থিত থাকলে ফলব্যাক হিসেবে গৃহীত হয়। | +| `OMNIROUTE_API_KEY_BASE64` | _(সেট করা নেই)_ | `src/lib/db/encryption.ts` | **পুরোনো উপনাম** (Base64-এনকোড করা রূপ), যা ফলব্যাক হিসেবে গৃহীত হয়। ব্যবহারের আগে স্বয়ংক্রিয়ভাবে ডিকোড করা হয়। | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(সেট করা নেই)_ | `src/lib/db/core.ts` | পর্যায়ক্রমিক SQLite স্বাস্থ্য পরীক্ষার ব্যবধান (ms) ওভাররাইড করুন। সেট করা না থাকলে, ডিফল্ট মানগুলো `NODE_ENV` থেকে নির্ধারিত হয়। | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(অপসারিত)_ | `src/lib/db/walMaintenance.ts` | **অপসারিত।** পর্যায়ক্রমিক লাইভ `wal_checkpoint(TRUNCATE)` শেয়ার করা wal-index ম্যাপিংকে অবৈধ করে SIGBUS (#13973) সহ প্রসেস ক্র্যাশ করাতে পারে, তাই শিডিউলারটি আর নেই। ভেরিয়েবলটি নিষ্ক্রিয়: ধনাত্মক মান দিলে একবারের একটি অবচয় সতর্কতা লগ হয়, আর `0` বা সেট না থাকলে নীরব থাকে। WAL নিচের PASSIVE চেকপয়েন্ট দ্বারা রক্ষণাবেক্ষিত এবং শাটডাউন চেকপয়েন্ট দ্বারা ট্রাঙ্কেট করা হয়। | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | ঘন ঘন `wal_checkpoint(PASSIVE)` চালানোর ব্যবধান (ms) ওভাররাইড করুন। মুলতুবি WAL ফ্রেমগুলো ছোট রাখে, ফলে চেকপয়েন্ট দ্রুত থাকে এবং শাটডাউনের সময় ট্রাঙ্কেশনের মধ্যবর্তী সময়ে WAL ফাইলের আকার সীমাবদ্ধ থাকে। `0` এটি নিষ্ক্রিয় করে। | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | কোনো PASSIVE টিক WAL ফাইলকে এই আকারের চেয়ে বড় পেলে `wal_checkpoint(RESTART)` চালায়, যাতে ম্যাপ করা wal-index পুনরায় না লিখেই WAL নতুন করে শুরু হয়। লাইভ ট্রাঙ্কেট-মোড চেকপয়েন্টগুলো অপসারণ করা হয়েছে (`OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` সারিটি দেখুন)। | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | গুরুতর রিসোর্স চাপ `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` সময় ধরে বজায় থাকলে প্রসেস থেকে বেরিয়ে যেতে এটি `1`/`true`/`yes`/`on`-এ সেট করুন; এতে অনির্দিষ্টকাল 503 পরিবেশন করার পরিবর্তে কোনো সুপারভাইজার (systemd `Restart=always`, Docker রিস্টার্ট নীতি) একটি পরিচ্ছন্ন প্রসেস পুনরায় চালু করতে পারবে। | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | স্ব-পুনরারম্ভের জন্য প্রসেস থেকে বেরিয়ে যাওয়ার আগে গুরুতর চাপ যতক্ষণ বজায় থাকতে হবে। | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ফলব্যাক অ্যাডাপ্টার ব্যবহারের সময় `sql-wasm.wasm`-এর সুস্পষ্ট পাথ (অ্যাবসোলিউট বা cwd-এর সাপেক্ষে)। সেট করা না থাকলে প্যাকেজ নির্ভরতা এবং সম্ভাব্য লেআউটের মাধ্যমে স্বয়ংক্রিয়ভাবে শনাক্ত করা হয়। | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | কোনো চূড়ান্ত (সম্পন্ন/ব্যর্থ/বাতিল/মেয়াদোত্তীর্ণ) Batch API জবের চেকপয়েন্ট, উল্লেখিত ইনপুট/আউটপুট/ত্রুটি ফাইল এবং সারি মুছে ফেলার আগে স্বয়ংক্রিয় ক্লিনআপ সুইপে যত দিন রাখা হয়। কেবল `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` চালু করার পর কার্যকর হয়; OpenAI-এর নিজস্ব Batch API আউটপুট সংরক্ষণ সময়সীমার সঙ্গে মেলে। অপারেটর-চালিত `DELETE /api/v1/batches/delete-completed` রুটকে প্রভাবিত করে না; নকশা অনুযায়ী এটি শর্তহীন (কোনো বয়স ফিল্টার নেই) থাকে। | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` হলে স্বয়ংক্রিয় ক্লিনআপ সুইপকে `OMNIROUTE_BATCH_RETENTION_DAYS` অতিক্রম করা চূড়ান্ত Batch API জব (এবং সেগুলোর চেকপয়েন্ট) মুছে ফেলতে এবং নিজস্ব `expires_at` অতিক্রম করা আপলোড করা ফাইলগুলোর BLOB বিষয়বস্তু পরিষ্কার করতে দেয়। ডিফল্টভাবে বন্ধ: কোনো অপারেটর সম্মতি না দেওয়া পর্যন্ত প্রতিটি বিদ্যমান ইনস্টলেশন এই ডেটা ঠিক আগের মতোই রাখে। এটি ড্যাশবোর্ডে সম্পাদনাযোগ্য একটি ফিচার ফ্ল্যাগও—`docs/reference/FEATURE_FLAGS.md` → Runtime দেখুন। | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | স্টার্টআপের সময় DB healthcheck সম্পূর্ণভাবে এড়িয়ে যেতে `1` সেট করুন। স্বল্পস্থায়ী task এবং integration test-এর জন্য উপযোগী। | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | সাধারণত এড়িয়ে যাওয়া হলেও (যেমন, স্বল্পস্থায়ী task) DB healthcheck loop জোরপূর্বক চালু করতে `1` সেট করুন। | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` চলাকালে native-runtime warm-up এড়িয়ে যেতে `1` সেট করুন। যেখানে sqlite ইতিমধ্যেই build করা আছে, এমন CI/headless install-এর জন্য উপযোগী। | +| `OMNIROUTE_MIGRATIONS_DIR` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/db/migrationRunner.ts` | migration runner যে directory scan করে, সেটি override করুন। custom build-এ bundled migration সরবরাহের সময় উপযোগী। | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(সেট করা নেই)_ | `src/lib/db/migrationRunner/extraDirs.ts` | platform path delimiter দিয়ে পৃথক করা `namespace=dir` entry হিসেবে অতিরিক্ত migration directory (যেমন `ee=/opt/app/enterprise/db/migrations`)। সেখানে পাওয়া file-গুলো `-` হিসেবে record করা হয়, ফলে নিজস্ব migration সরবরাহকারী কোনো distribution কখনো upstream numeric slot-এর সঙ্গে সংঘর্ষে পড়ে না। কোনো malformed entry, invalid namespace বা অনুপস্থিত directory থাকলে schema নীরবে এড়িয়ে যাওয়ার পরিবর্তে startup-এর সময় error throw হয়। | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | ব্যাপক সংখ্যক pending migration-এর safety threshold (#3416)। বিদ্যমান DB-তে এর চেয়ে বেশি migration pending থাকলে startup abort হয় (মুছে যাওয়া tracking table থেকে সুরক্ষার জন্য)। পুরোনো backup restore করতে এটি বাড়ান; check নিষ্ক্রিয় করতে `0` সেট করুন। | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` release gate-এর working directory। এর জন্য প্রায় 12 GB প্রয়োজন (দুটি ~3 GB install tree এবং tarball), তাই এটি ছোট tmpfs-এ চালানো যাবে না — self-hosted runner-এ `/tmp` হলো 12 GB RAM-backed tmpfs এবং gate সেটি নিঃশেষ করে package truncate করেছিল। | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(code-এ default)_ | `src/lib/spend/batchWriter.ts` | batched spend/cost writer-এর flush interval (ms)। কম value write coalescing কমায়; বেশি value DB contention কমায়। | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(code-এ default)_ | `src/lib/spend/batchWriter.ts` | forced flush-এর আগে buffered spend entry-এর সর্বোচ্চ সংখ্যা। high-QPS deployment-এ বাড়ান; bounded memory বেশি গুরুত্বপূর্ণ হলে কমান। | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(সেট করা নেই)_ | `open-sse/utils/proxyFetch.ts` | Vercel relay path-এ `[ProxyFetch]` debug log নির্গত করতে `"true"` সেট করুন। routing hint ফাঁস এড়াতে default হিসেবে বন্ধ থাকে। | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | verbose `[ProxyEgress]` process-log line-এ client/egress IP এবং account prefix অন্তর্ভুক্ত করতে `"true"` বা `"1"` সেট করুন। default হিসেবে এটি বন্ধ রাখা হয়, যাতে process log IP বা account prefix ফাঁস না করে। | +| `OMNIROUTE_DEBUG` | _(সেট করা নেই)_ | `bin/cli/commands/quota.mjs` | CLI quota command থেকে stderr-এ প্রতি request-এর timing diagnostic (`[omniroute] GET completed in Nms`) print করতে `1` সেট করুন। | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(স্বয়ংক্রিয়)_ | `scripts/dev/healthcheck.mjs` | container health check যে নির্দিষ্ট path probe করে। সেট করা না থাকলে probe `OMNIROUTE_BASE_PATH` থেকে path নির্ধারণ করে; এটি সেট করলে আবার deep monitoring endpoint ব্যবহার করা হয়। | +| `OMNIROUTE_DEBUG_COMPLETION` | _(সেট করা নেই)_ | `bin/cli/commands/completion.mjs` | CLI shell-completion cache path (read/refresh/write) থেকে `[omniroute completion]` diagnostic নির্গত করতে যেকোনো non-empty value সেট করুন। default হিসেবে বন্ধ থাকে — ওই cache-গুলো নীরবে fail করে, তাই কোনো cache অনুপস্থিত বা corrupt হলেও tab-completion কখনো নষ্ট হয় না। | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | পৃথক batch item-এর সর্বোচ্চ retry window (ms)। এই duration অতিক্রম করা item-গুলো failed হিসেবে চিহ্নিত হয়। | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | ব্যাচ আইটেম পুনঃচেষ্টায় এক্সপোনেনশিয়াল ব্যাকঅফের প্রাথমিক বিলম্ব (ms)। | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | ব্যাচ আইটেম পুনঃচেষ্টার মধ্যবর্তী এক্সপোনেনশিয়াল ব্যাকঅফের সর্বোচ্চ সীমা (ms)। | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | একই সময়ে প্রক্রিয়াকৃত ব্যাচের সর্বোচ্চ সংখ্যা। থ্রুপুট বাড়াতে এটি বৃদ্ধি করুন; রেট-লিমিটের আকস্মিক চাপ এড়াতে কম রাখুন। | > [!IMPORTANT] > বিদ্যমান কোনো স্থায়ী ডেটাবেস পরিবর্তনের আগে, মাইগ্রেশন রানার `DATA_DIR/db_backups/`-এর অধীনে একটি সম্পূর্ণ, -> কনটেন্ট-অ্যাড্রেসড স্ন্যাপশট প্রকাশ করে। প্রকাশনার জন্য এমন একটি ফাইল সিস্টেম প্রয়োজন, -> যা একই ফাইল সিস্টেমে ওভাররাইট-বিহীন হার্ড লিংক এবং টেকসই ফাইল সিঙ্ক সমর্থন করে। POSIX হোস্টগুলোর জন্য -> ডিরেক্টরি সিঙ্কও প্রয়োজন; Windows-এ Node ডিরেক্টরি হ্যান্ডেল প্রত্যাখ্যান করতে পারে, তাই OmniRoute -> প্রকাশিত ফাইলটি ফ্লাশ করে এবং ডিরেক্টরি-এন্ট্রি সিঙ্ককে সর্বোত্তম প্রচেষ্টা হিসেবে বিবেচনা করে। -> মাউন্ট করা `DATA_DIR` যদি এসব নিশ্চয়তা দিতে না পারে, তবে মাইগ্রেশন প্রয়োগের আগেই স্টার্টআপ নিরাপদভাবে ব্যর্থ হয়। -> `DATA_DIR`-কে এসব প্রিমিটিভ সমর্থনকারী ভলিউমে সরান; মাইগ্রেশনের নিরাপত্তা এড়িয়ে যেতে -> `DISABLE_SQLITE_AUTO_BACKUP` ব্যবহার করবেন না। +> কনটেন্ট-অ্যাড্রেসড স্ন্যাপশট প্রকাশ করে। প্রকাশের জন্য এমন একটি ফাইলসিস্টেম প্রয়োজন, যা একই ফাইলসিস্টেমের মধ্যে +> ওভাররাইট-বিহীন হার্ড লিংক এবং টেকসই ফাইল সিঙ্ক সমর্থন করে। POSIX হোস্টে ডিরেক্টরি সিঙ্কও +> প্রয়োজন; Windows-এ Node ডিরেক্টরি হ্যান্ডেল প্রত্যাখ্যান করতে পারে, তাই OmniRoute প্রকাশিত +> ফাইলটি ফ্লাশ করে এবং ডিরেক্টরি-এন্ট্রি সিঙ্ককে সর্বোত্তম প্রচেষ্টা হিসেবে বিবেচনা করে। +> মাউন্ট করা `DATA_DIR` যদি এসব নিশ্চয়তা দিতে না পারে, তাহলে কোনো মাইগ্রেশন প্রয়োগের আগেই +> স্টার্টআপ নিরাপদভাবে ব্যর্থ হয়। `DATA_DIR`-কে এসব প্রিমিটিভ-সমর্থিত কোনো ভলিউমে স্থানান্তর করুন; +> মাইগ্রেশন নিরাপত্তা এড়িয়ে যেতে `DISABLE_SQLITE_AUTO_BACKUP` ব্যবহার করবেন না। ### পরিস্থিতি | পরিস্থিতি | কনফিগারেশন | | --------------------------------- | ---------------------------------------------------------------------------------- | | **লোকাল ডেভেলপমেন্ট** | সব ডিফল্ট অপরিবর্তিত রাখুন। DB `~/.omniroute/omniroute.db`-এ থাকে। | -| **Docker** | `DATA_DIR=/data` সেট করুন + `/data`-এ একটি ভলিউম মাউন্ট করুন। | +| **Docker** | `DATA_DIR=/data` + `/data`-এ একটি ভলিউম মাউন্ট করুন। | | **সংরক্ষিত অবস্থায় এনক্রিপ্টেড** | `STORAGE_ENCRYPTION_KEY` সেট করুন + কীটির ব্যাকআপ রাখুন! এটি হারানো = ডেটা হারানো। | | **CI/টেস্টিং** | `DATA_DIR=/tmp/omniroute-test` — ক্ষণস্থায়ী, এনক্রিপশনের প্রয়োজন নেই। | @@ -213,37 +212,38 @@ OmniRoute সব ধরনের স্থায়ী ডেটা সংরক ## 4. নিরাপত্তা ও প্রমাণীকরণ -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | মেশিন ফিঙ্গারপ্রিন্টিংয়ের জন্য হার্ডওয়্যার শনাক্তকারীর সঙ্গে সম্মিলিত salt। বিচ্ছিন্নতা নিশ্চিত করতে প্রতিটি ডিপ্লয়মেন্টে এটি পরিবর্তন করুন। | -| `OMNIROUTE_CLI_SALT` | _(সেট করা নেই = প্রতি ইনস্টলে এলোমেলো salt, যা `/cli-token-salt.json`-এ সংরক্ষিত থাকে)_ | `src/lib/machineToken.ts` | স্থানীয় CLI auth token উদ্ভূত করার জন্য HMAC salt। এই মান সেট করলে মেশিনের সব CLI token ঘুরিয়ে দেওয়া হয় এবং এটি সর্বদা সংরক্ষিত salt-এর চেয়ে অগ্রাধিকার পায়। `docs/security/CLI_TOKEN.md` দেখুন। | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | session cookie-তে `Secure` flag সেট করে। HTTPS-এর পেছনে চলার সময় এটি **অবশ্যই `true` হতে হবে**। | -| `REQUIRE_API_KEY` | `false` | API middleware | `true` হলে, সব `/v1/*` proxy request-এ একটি বৈধ API key অন্তর্ভুক্ত থাকতে হবে। | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Dashboard UI-তে API key-এর সম্পূর্ণ মান প্রকাশের অনুমতি দেয়। Dashboard Feature Flags থেকে কনফিগার করা যায়; শেয়ার করা instance-এ এটি একটি নিরাপত্তা ঝুঁকি। | -| `NO_LOG_API_KEY_IDS` | _(খালি)_ | `src/lib/compliance/index.ts` | কমা দিয়ে পৃথক করা API key ID, যেগুলোর জন্য request logging এড়িয়ে যাওয়া হয় (GDPR সম্মতি)। | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(সেট করা নেই = সীমাহীন)_ | `src/shared/utils/apiKeyPolicy.ts` | যেসব API key-এর `rate_limits` column null, সেগুলোর ক্ষেত্রে প্রয়োগ করা দৈনিক fallback request budget। সেট করা না থাকলে বা খালি থাকলে: কোনো অন্তর্নিহিত সীমা নেই (#2289, #11017)। `0`-ও একই অর্থ বহন করে (সীমাহীন)। ধনাত্মক পূর্ণসংখ্যা N দিলে N/day, 5N/week, 20N/month সক্রিয় হয়। ত্রুটিপূর্ণ অখালি মানের ক্ষেত্রে পুরোনো 1000/day, 5000/week, 20000/month window ব্যবহৃত হয়। | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | অনুমোদিত request body-এর সর্বোচ্চ আকার। এই সীমা অতিক্রমকারী payload প্রত্যাখ্যান করে। | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | এই threshold-এর সমান বা তার বেশি আকারের প্রকৃত request body, JSON parsing-এর আগে atomic process-local heavyweight admission lease গ্রহণ করে (BYTE path, যার মধ্যে `POST /v1/responses` অন্তর্ভুক্ত)। structure-heavy-এর মতো একই [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) healthy-headroom escape; তবুও `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) দ্বারা সীমাবদ্ধ, যাতে [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) পুনরায় না ঘটে। | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | সীমাবদ্ধ ingestion-এর সময় পড়া byte-এর ভিত্তিতে chat-route-এর hard cap প্রয়োগ করা হয়; এর মধ্যে অনুপস্থিত, অবৈধ বা অসত্য `Content-Length`-সহ request-ও অন্তর্ভুক্ত। সীমা অতিক্রম করলে `413` ফেরত দেওয়া হয়। | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(সেট করা নেই — অনুরোধ-সংখ্যার কোনো সীমা নেই)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** এই লিগ্যাসি অনুরোধ-সংখ্যার সীমা এখন কেবল স্পষ্টভাবে সেট করলেই কার্যকর হয়। সেট না করা থাকলে (ডিফল্ট), ভারী চ্যাট গ্রহণের পরিবর্তে `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` দ্বারা নিয়ন্ত্রিত হয় — এটি **একটি প্রসেসের** (একটি V8 heap) প্রকৃত মেমরি-সীমা থেকে স্বয়ংক্রিয়ভাবে নির্ধারিত একটি বাইট বাজেট। একই সময়ে চলা প্রায় 750k-token-এর দুটি `/v1/responses` অনুরোধ প্রায় 12 Gi heap-কে অকার্যকর করে দেয় (#7849) — এটি একটি **মেমরি-বাজেট** সতর্কতা, পণ্যের সর্বোচ্চ 2-এর কোনো কঠোর সীমা নয়। একটি সুস্থ প্রসেস (shed ratio-এর নিচে heap) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`-এর মাধ্যমে একই সময়ে আরও দীর্ঘ `/v1/responses` গ্রহণ করতে পারে। দীর্ঘমেয়াদি SSE client-এর সংখ্যা কয়েক দশক (40–50) হওয়া heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110-এর বিষয়, “সর্বোচ্চ 2” নয়। “হোস্টের সম্পূর্ণ ক্ষমতা ব্যবহার” করার জন্য না বুঝে এটি বাড়ালে #7849 আবার দেখা দেবে। **Nটি স্বতন্ত্র `DATA_DIR`** (#11024) দিয়ে **heap**-এর সংখ্যা বাড়ান; একটি SQLite file-এর ক্ষেত্রে কখনোই `replicas>1` ব্যবহার করবেন না। | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(স্বয়ংক্রিয়ভাবে নির্ধারিত)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** স্বয়ংক্রিয়ভাবে নির্ধারিত ingest byte budget-এর override (V8/cgroup-এর মধ্যে কঠোরতর memory ceiling-এর 25%, যাকে 8x transient amplification দিয়ে ভাগ করা হয়)। নির্ধারিত ও স্পষ্টভাবে সেট করা মানগুলো 8 MiB–2 GiB-এর মধ্যে সীমাবদ্ধ থাকে। কার্যকর budget-এর চেয়ে বড় body অবিলম্বে `413 body_exceeds_budget` দিয়ে ব্যর্থ হয়; আলাদাভাবে পরিবেশনযোগ্য body-গুলোর মধ্যে contention হলে পুনরায় চেষ্টা করা যায় এমন `503` পাওয়া যায়। একই সময়ে 40–50টি দীর্ঘ SSE client চলা এই budget + heap-এর বিষয়, কঠোর “সর্বোচ্চ 2” সীমা নয়। সমন্বয় করার আগে `/api/monitoring/health`-এ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` দেখুন। | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | BYTE ও STRUCTURE-ভিত্তিক ভারী অনুরোধ গ্রহণের জন্য heap-pressure shed ratio (`heapUsed / heap_size_limit`) (#10183, #10268, #10437)। `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` অতিক্রম করা কোনো সমসাময়িক ভারী অনুরোধকে কেবল তখনই পুনরায় চেষ্টা করা যায় এমন `503` দিয়ে বাদ দেওয়া হয়, যখন heap-ও এই ratio-এর সমান বা বেশি থাকে; সুস্থ heap-এ healthy-headroom-এর মাধ্যমে সেটি গ্রহণ করা হয়। | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ডিফল্ট `1`) | `src/shared/middleware/chatBodyAdmission.ts` | STRUCTURE ও BYTE উভয়ের (`admitChatRequest`, যার মধ্যে ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` body-ও রয়েছে) **সুস্থ heap-এর** দ্রুতগতির পথের জন্য সীমাবদ্ধ অতিরিক্ত capacity (#10437)। এই সীমা না থাকলে, ব্যস্ত হলেও সুস্থ heap-এর প্রতিটি অনুরোধ কোনো সর্বোচ্চ সীমা ছাড়াই admission এড়িয়ে যেত। healthy-heap path-এর মাধ্যমে একসঙ্গে এতগুলো lease সক্রিয় হয়ে গেলে, পরবর্তী ব্যস্ত অনুরোধগুলো প্রকৃত heap pressure-এর সময় ব্যবহৃত একই সীমাবদ্ধ অপেক্ষা/বাদ দেওয়ার path-এ চলে যায়। `0` দিলে bypass সম্পূর্ণভাবে নিষ্ক্রিয় হয়। | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | যে message count-এ কোনো chat request-এর body byte threshold-এর নিচে থাকলেও সেটিকে heavyweight হিসেবে শ্রেণিবদ্ধ করা হয়। | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | যে tool count-এ কোনো chat request-এর body byte threshold-এর নিচে থাকলেও সেটিকে heavyweight হিসেবে শ্রেণিবদ্ধ করা হয়। | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | রক্ষণশীল string-size token estimate, যার ভিত্তিতে কোনো অনুরোধকে heavyweight হিসেবে শ্রেণিবদ্ধ করা হয়; এটি admission cost-এর proxy, provider billing tokenization নয়। | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (নিষ্ক্রিয়) | `src/shared/middleware/chatBodyAdmission.ts` | ঐচ্ছিক opt-in chat history cap। ডিফল্টভাবে নিষ্ক্রিয়: message count হলো deployment policy, কোনো request-এর সার্বজনীন বৈশিষ্ট্য নয়; এখানে সীমা আরোপ করলে compression pipeline কথোপকথনটিকে পরিবেশনযোগ্য করার আগেই terminal `413` দিয়ে প্রত্যাখ্যান করে। Heap-এর বৃদ্ধি `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` এবং heap-pressure shed দ্বারা সীমাবদ্ধ থাকে। কঠোর সর্বোচ্চ সীমা প্রয়োজন এমন memory-constrained deployment-এ একটি ধনাত্মক মান সেট করুন; সীমা অতিক্রম করলে structured compact-required `413` পাওয়া যাবে। | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | সম্পূর্ণভাবে memory-তে buffer করা non-streaming upstream response-এর কঠোর সীমা। এটি অতিক্রম করলে upstream reader বাতিল করা হয় এবং heap নিঃশেষ না হওয়া পর্যন্ত সীমাহীন string বাড়তে দেওয়ার পরিবর্তে request দ্রুত ব্যর্থ হয়। | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | upstream response header থেকে forward করা সর্বোচ্চ wire byte। Budget অতিক্রম করলে প্রচলিত reverse-proxy header limit-এর মধ্যে থাকতে কম অগ্রাধিকারের header (যেমন custom `x-codex-*`, `x-oai-request-id`) বাদ দেওয়া হয়। আরও বেশি upstream metadata forward করতে এটি বাড়ান, তবে এতে response header-এর আকারও বাড়বে। | -| `CORS_ORIGIN` | _(সেট করা নেই)_ | `src/server/cors/origins.ts` | পুরোনো একক-অরিজিন CORS অনুমোদন-তালিকা। নতুন ডিপ্লয়মেন্টের জন্য `CORS_ALLOWED_ORIGINS` ব্যবহার করুন। CORS কেবল ক্রস-অরিজিন ব্রাউজার API ক্লায়েন্টের জন্য; প্রমাণীকৃত ড্যাশবোর্ড রাইট অপারেশনগুলো এর পরিবর্তে একই-অরিজিন অনুরোধের সঙ্গে সেশন-সংযুক্ত CSRF সুরক্ষা ব্যবহার করে। | -| `CORS_ALLOWED_ORIGINS` | _(সেট করা নেই)_ | `src/server/cors/origins.ts` | কমা দিয়ে পৃথক করা CORS অনুমোদন-তালিকা। `CORS_ALLOW_ALL=true` স্পষ্টভাবে কনফিগার করা না হলে কোনো ওয়াইল্ডকার্ড পাঠানো হয় না। | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | যেকোনো ব্রাউজার `Origin` প্রতিফলিত করার জন্য কেবল ডেভেলপমেন্টে ব্যবহারের জরুরি বিকল্প। শেয়ার্ড বা প্রোডাকশন ডিপ্লয়মেন্টে এটি সক্রিয় করবেন না। | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | ব্যক্তিগত/লুপব্যাক/লিংক-লোকাল IP রেঞ্জ লক্ষ্যকারী প্রোভাইডার কল ব্লক করুন। শুধু বিচ্ছিন্ন টেস্ট এনভায়রনমেন্টে এটি নিষ্ক্রিয় করুন। | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | ব্যক্তিগত/লোকাল নেটওয়ার্কের দিকে নির্দেশ করা প্রোভাইডার URL অনুমোদন করুন (localhost, 192.168.x.x, 10.x.x.x ইত্যাদি)। **স্ব-হোস্টেড প্রোভাইডারের জন্য আবশ্যক** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG)। `false` হলে ড্যাশবোর্ড লোকাল URL-এর যাচাইকরণ প্রত্যাখ্যান করে। | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | লোকাল/ব্যক্তিগত ঠিকানায় (127.0.0.1, localhost, LAN, ব্যক্তিগত রেঞ্জ) প্রোভাইডার যোগ করা/যাচাই করা অনুমোদন করুন—এটি প্রোভাইডার যাচাইকরণ পাথে সীমাবদ্ধ। **ডিফল্ট `true`** (লোকাল-ফার্স্ট); শুধু পাবলিক ঠিকানা অনুমোদনের কঠোর নীতি প্রয়োগ করতে `false` সেট করুন। ক্লাউড-মেটাডেটা এন্ডপয়েন্ট (169.254.169.254, metadata.google.internal) সব অবস্থাতেই ব্লক থাকে। (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` রুটগুলোকে (ট্রান্সক্রিপশন, স্পিচ, অনুবাদ) localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করতে দিন। ডিফল্টভাবে বন্ধ—অডিওকে দূরবর্তী হোস্টে রাউট করলে বহির্গমন পরিচয় পরিবর্তিত হয় এবং এটি অবশ্যই অপারেটরের স্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক/ব্যক্তিগত নোড (localhost, 127.0.0.1, 172.16-31.x) সর্বদা অনুমোদিত এবং এতে প্রভাবিত হয় না। (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC সক্রিয় থাকলে পাসওয়ার্ড লগইন নিষ্ক্রিয় করুন, যাতে ব্যবহারকারীরা শুধু OIDC Single Sign-On-এর মাধ্যমে প্রমাণীকরণ করতে পারেন। সংক্ষিপ্ত অ্যালিয়াস `OIDC_DISABLE_PASSWORD_LOGIN`-ও গৃহীত হয়; একই কী-এর Dashboard Feature Flag অগ্রাধিকার পায়। (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN`-এর সংক্ষিপ্ত অ্যালিয়াস (#10889)। | +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | মেশিন ফিঙ্গারপ্রিন্টিংয়ের জন্য হার্ডওয়্যার শনাক্তকারীর সঙ্গে সমন্বিত সল্ট। বিচ্ছিন্নতা নিশ্চিত করতে প্রতিটি ডিপ্লয়মেন্টে এটি পরিবর্তন করুন। | +| `OMNIROUTE_CLI_SALT` | _(সেট করা নেই = প্রতিটি ইনস্টলে এলোমেলো সল্ট, যা `/cli-token-salt.json`-এ সংরক্ষিত থাকে)_ | `src/lib/machineToken.ts` | স্থানীয় CLI প্রমাণীকরণ টোকেন নির্ণয়ের জন্য HMAC সল্ট। এই মান সেট করলে মেশিনের সব CLI টোকেন রোটেট হয় এবং এটি সবসময় সংরক্ষিত সল্টের চেয়ে অগ্রাধিকার পায়। `docs/security/CLI_TOKEN.md` দেখুন। | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | সেশন কুকিতে `Secure` ফ্ল্যাগ সেট করে। HTTPS-এর পেছনে চালানোর সময় এটি **অবশ্যই `true` হতে হবে**। | +| `REQUIRE_API_KEY` | `false` | API মিডলওয়্যার | `true` হলে, সব `/v1/*` প্রক্সি অনুরোধে একটি বৈধ API কী অন্তর্ভুক্ত থাকতে হবে। **এই ফ্ল্যাগটি `GET /v1/models`-এর প্রবেশাধিকার নিয়ন্ত্রণ করে না**; বরং এটি ড্যাশবোর্ড লগইন নীতি (`requireAuthForModels`) অনুসরণ করে—তাই `/v1/models` থেকে একটি `401` পাওয়ার অর্থ এই নয় যে ইনফারেন্স সুরক্ষিত। `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695) দেখুন। | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | ড্যাশবোর্ড UI-তে সম্পূর্ণ API কী-এর মান প্রকাশের অনুমতি দেয়। ড্যাশবোর্ডের ফিচার ফ্ল্যাগ থেকে কনফিগার করা যায়; শেয়ার্ড ইনস্ট্যান্সে এটি একটি নিরাপত্তা ঝুঁকি। | +| `NO_LOG_API_KEY_IDS` | _(খালি)_ | `src/lib/compliance/index.ts` | কমা দিয়ে পৃথক করা API কী ID, যেগুলোর অনুরোধ লগ করা হয় না (GDPR সম্মতি)। | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(সেট করা নেই = সীমাহীন)_ | `src/shared/utils/apiKeyPolicy.ts` | যেসব API কী-এর `rate_limits` কলাম null, সেগুলোর ক্ষেত্রে প্রয়োগ করা দৈনিক অনুরোধ বাজেটের ফলব্যাক। সেট করা না থাকলে বা খালি থাকলে: কোনো অন্তর্নিহিত সীমা নেই (#2289, #11017)। `0`-এর অর্থও একই (সীমাহীন)। ধনাত্মক পূর্ণসংখ্যা N দিলে N/দিন, 5N/সপ্তাহ এবং 20N/মাস সক্রিয় হয়। ত্রুটিপূর্ণ অ-খালি মানের ক্ষেত্রে পুরোনো 1000/দিন, 5000/সপ্তাহ এবং 20000/মাস সীমা ব্যবহৃত হয়। | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | অনুরোধের বডির সর্বাধিক অনুমোদিত আকার। এই সীমা অতিক্রমকারী পেলোড প্রত্যাখ্যান করে। | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | এই থ্রেশহোল্ডের সমান বা বেশি আকারের প্রকৃত অনুরোধ বডি JSON পার্সিংয়ের আগে অ্যাটমিক, প্রসেস-লোকাল হেভিওয়েট অ্যাডমিশন লিজ গ্রহণ করে (BYTE পাথ, `POST /v1/responses`-সহ)। স্ট্রাকচার-হেভি পাথের মতো একই [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) স্বাস্থ্যকর-হেডরুম এস্কেপ; তবুও এটি `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) দ্বারা সীমাবদ্ধ, যাতে [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) পুনরায় দেখা না দেয়। | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | সীমাবদ্ধ ইনজেশনের সময় পড়া বাইটের ওপর প্রয়োগ করা চ্যাট-রুটের হার্ড সীমা; এর মধ্যে অনুপস্থিত, অবৈধ বা অসত্য `Content-Length`-সহ অনুরোধও অন্তর্ভুক্ত; সীমা অতিক্রম করলে `413` পাওয়া যায়। | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(সেট করা নেই — অনুরোধ-সংখ্যার কোনো সীমা নেই)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** এই লিগ্যাসি অনুরোধ-সংখ্যা সীমা এখন কেবল স্পষ্টভাবে সেট করা হলেই কার্যকর হয়। এটি সেট না থাকলে (ডিফল্ট), হেভিওয়েট চ্যাট অ্যাডমিশন পরিবর্তে `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` দ্বারা নিয়ন্ত্রিত হয় — **একটি প্রসেসে** (একটি V8 হিপ) প্রসেসের প্রকৃত মেমরি সীমা থেকে স্বয়ংক্রিয়ভাবে নির্ধারিত একটি বাইট বাজেট। পরস্পর ওভারল্যাপ করা প্রায় 750k-টোকেনের দুটি `/v1/responses` প্রায় 12 GiB হিপকে অ্যাবোর্ট করায় (#7849) — এটি একটি **মেমরি-বাজেট** সতর্কতা, 2-এর কোনো কঠোর পণ্যসীমা নয়। একটি সুস্থ প্রসেস (শেড অনুপাতের নিচে হিপ) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`-এর মাধ্যমে আরও বেশি সমবর্তী দীর্ঘ `/v1/responses` গ্রহণ করতে পারে। দশের ঘরে দীর্ঘ SSE ক্লায়েন্ট (40–50) হিপ + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110-এর বিষয়, “সর্বোচ্চ 2” নয়। “হোস্ট ব্যবহার করার” জন্য না বুঝে এটি বাড়ালে #7849 আবার দেখা দেবে। **Nটি স্বাধীন `DATA_DIR`** দিয়ে **হিপের** সংখ্যা বাড়ান (#11024); একটি SQLite ফাইলে কখনোই `replicas>1` ব্যবহার করবেন না। | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(স্বয়ংক্রিয়ভাবে নির্ধারিত)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** স্বয়ংক্রিয়ভাবে নির্ধারিত ইনজেস্ট বাইট বাজেটের ওভাররাইড (আরও সীমিত V8/cgroup মেমরি সীমার 25%, 8x ক্ষণস্থায়ী অ্যামপ্লিফিকেশন দিয়ে ভাগ করা)। নির্ধারিত এবং স্পষ্ট উভয় মানই 8 MiB–2 GiB-এর মধ্যে সীমাবদ্ধ থাকে। কার্যকর বাজেটের চেয়ে বড় বডি অবিলম্বে `413 body_exceeds_budget` দিয়ে ব্যর্থ হয়; পৃথকভাবে পরিবেশনযোগ্য বডিগুলোর মধ্যকার কনটেনশনে পুনরায় চেষ্টা-যোগ্য `503` পাওয়া যায়। 40–50টি সমবর্তী দীর্ঘ SSE ক্লায়েন্ট এই বাজেট + হিপের বিষয়, কোনো কঠোর “সর্বোচ্চ 2” নয়। টিউন করার আগে `/api/monitoring/health`-এ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` দেখুন। | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | বাইট ও স্ট্রাকচার হেভিওয়েট অ্যাডমিশনের জন্য হিপ-প্রেশার শেড অনুপাত (`heapUsed / heap_size_limit`) (#10183, #10268, #10437)। `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` অতিক্রম করা কোনো সমবর্তী হেভিওয়েট অনুরোধকে কেবল তখনই পুনরায় চেষ্টা-যোগ্য `503` দিয়ে শেড করা হয়, যখন হিপও এই অনুপাতের সমান বা বেশি থাকে; সুস্থ হিপে এটি পরিবর্তে হেলদি-হেডরুমের মাধ্যমে গ্রহণ করা হয়। | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ডিফল্ট `1`) | `src/shared/middleware/chatBodyAdmission.ts` | **STRUCTURE** এবং **BYTE** উভয়ের (`admitChatRequest`, `OMNIROUTE_CHAT_LARGE_BODY_BYTES`-এর সমান বা বড় বডিসহ) সুস্থ-হিপ ফাস্ট পাথের জন্য সীমাবদ্ধ অতিরিক্ত সক্ষমতা (#10437)। এই সীমা ছাড়া, প্রতিটি ব্যস্ত-কিন্তু-সুস্থ-হিপ অনুরোধ কোনো ঊর্ধ্বসীমা ছাড়াই অ্যাডমিশন বাইপাস করত। সুস্থ-হিপ পাথ দিয়ে এতগুলো সমবর্তী লিজ সক্রিয় হয়ে গেলে, পরবর্তী ব্যস্ত অনুরোধগুলো প্রকৃত হিপ চাপের সময় ব্যবহৃত একই সীমাবদ্ধ-অপেক্ষা/শেড পাথে চলে যায়। `0` বাইপাসটি সম্পূর্ণ নিষ্ক্রিয় করে। | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | যে বার্তা সংখ্যা কোনো চ্যাট অনুরোধের বডি বাইট থ্রেশহোল্ডের নিচে থাকলেও সেটিকে হেভিওয়েট হিসেবে শ্রেণিবদ্ধ করে। | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | যে টুল সংখ্যা কোনো চ্যাট অনুরোধের বডি বাইট থ্রেশহোল্ডের নিচে থাকলেও সেটিকে হেভিওয়েট হিসেবে শ্রেণিবদ্ধ করে। | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | রক্ষণশীল স্ট্রিং-আকারভিত্তিক টোকেন অনুমান, যা কোনো অনুরোধকে হেভিওয়েট হিসেবে শ্রেণিবদ্ধ করে; এটি অ্যাডমিশন-খরচের একটি প্রক্সি, প্রোভাইডারের বিলিং টোকেনাইজেশন নয়। | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (নিষ্ক্রিয়) | `src/shared/middleware/chatBodyAdmission.ts` | ঐচ্ছিক অপ্ট-ইন চ্যাট ইতিহাস সীমা। ডিফল্টভাবে নিষ্ক্রিয়: বার্তার সংখ্যা একটি ডিপ্লয়মেন্ট নীতি, কোনো অনুরোধের সার্বজনীন বৈশিষ্ট্য নয়; এখানে সীমা আরোপ করলে কম্প্রেশন পাইপলাইন কথোপকথনগুলোকে পরিবেশনযোগ্য করে তোলার আগেই টার্মিনাল `413` দিয়ে সেগুলো প্রত্যাখ্যান করা হয়। হিপের বৃদ্ধি `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` এবং হিপ-প্রেশার শেড দ্বারা সীমাবদ্ধ থাকে। যেসব মেমরি-সীমাবদ্ধ ডিপ্লয়মেন্টে কঠোর ঊর্ধ্বসীমা দরকার, সেখানে একটি ধনাত্মক মান সেট করুন; সীমা অতিক্রম করলে তখন কাঠামোবদ্ধ কম্প্যাক্ট-প্রয়োজনীয় `413` পাওয়া যায়। | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | সম্পূর্ণভাবে মেমরিতে বাফার করা একটি নন-স্ট্রিমিং আপস্ট্রিম রেসপন্সের হার্ড সীমা। এটি অতিক্রম করলে আপস্ট্রিম রিডার বাতিল করা হয় এবং হিপ নিঃশেষ না হওয়া পর্যন্ত সীমাহীন স্ট্রিং বাড়তে দেওয়ার পরিবর্তে অনুরোধটি দ্রুত ব্যর্থ হয়। | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | আপস্ট্রিম রেসপন্স হেডার থেকে ফরওয়ার্ড করা সর্বোচ্চ ওয়্যার বাইট। বাজেট অতিক্রম করলে, সাধারণ রিভার্স-প্রক্সি হেডার সীমার মধ্যে থাকতে নিম্ন-অগ্রাধিকারের হেডারগুলো (যেমন, কাস্টম `x-codex-*`, `x-oai-request-id`) বাদ দেওয়া হয়। রেসপন্স হেডারের আকার বৃদ্ধির বিনিময়ে আরও বেশি আপস্ট্রিম মেটাডেটা ফরওয়ার্ড করতে এটিকে উচ্চতর মানে সেট করুন। | +| `CORS_ORIGIN` | _(সেট করা নেই)_ | `src/server/cors/origins.ts` | পুরোনো একক-অরিজিন CORS অনুমোদন-তালিকা। নতুন ডিপ্লয়মেন্টের জন্য `CORS_ALLOWED_ORIGINS` ব্যবহার করুন। CORS কেবল ক্রস-অরিজিন ব্রাউজার API ক্লায়েন্টের জন্য; এর পরিবর্তে প্রমাণীকৃত ড্যাশবোর্ড রাইট অপারেশনগুলো একই-অরিজিন রিকোয়েস্ট এবং সেশন-সংযুক্ত CSRF সুরক্ষা ব্যবহার করে। | +| `CORS_ALLOWED_ORIGINS` | _(সেট করা নেই)_ | `src/server/cors/origins.ts` | কমা দিয়ে পৃথক করা CORS অনুমোদন-তালিকা। `CORS_ALLOW_ALL=true` স্পষ্টভাবে কনফিগার করা না হলে কোনো ওয়াইল্ডকার্ড পাঠানো হয় না। | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | যেকোনো ব্রাউজার `Origin` প্রতিধ্বনিত করার জন্য কেবল ডেভেলপমেন্টে ব্যবহারের জরুরি বিকল্প। শেয়ার্ড বা প্রোডাকশন ডিপ্লয়মেন্টে এটি সক্রিয় করবেন না। | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | প্রাইভেট/লুপব্যাক/লিংক-লোকাল IP রেঞ্জ লক্ষ্য করে করা প্রোভাইডার কল ব্লক করুন। কেবল বিচ্ছিন্ন টেস্ট এনভায়রনমেন্টে এটি নিষ্ক্রিয় করুন। | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | প্রাইভেট/লোকাল নেটওয়ার্কের দিকে নির্দেশ করা প্রোভাইডার URL অনুমোদন করুন (localhost, 192.168.x.x, 10.x.x.x, ইত্যাদি)। **স্ব-হোস্টেড প্রোভাইডারের জন্য আবশ্যক** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG)। `false` হলে, ড্যাশবোর্ড লোকাল URL-এর ভ্যালিডেশন প্রত্যাখ্যান করে। | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | লোকাল/প্রাইভেট ঠিকানায় (127.0.0.1, localhost, LAN, প্রাইভেট রেঞ্জ) প্রোভাইডার যোগ/ভ্যালিডেট করার অনুমতি দিন — এটি প্রোভাইডার ভ্যালিডেশন পাথের মধ্যে সীমাবদ্ধ। **ডিফল্ট `true`** (লোকাল-ফার্স্ট); কঠোরভাবে শুধু পাবলিক ঠিকানা অনুমোদন করতে `false` সেট করুন। ক্লাউড-মেটাডেটা এন্ডপয়েন্টগুলো (169.254.169.254, metadata.google.internal) যেকোনো অবস্থায় ব্লকই থাকে। (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` রুটগুলোকে (ট্রান্সক্রিপশন, স্পিচ, অনুবাদ) localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করতে দিন। ডিফল্টভাবে বন্ধ — অডিওকে রিমোট হোস্টে রাউট করলে ইগ্রেস পরিচয় বদলে যায় এবং এটি অপারেটরের স্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক/প্রাইভেট নোডগুলো (localhost, 127.0.0.1, 172.16-31.x) সর্বদা অনুমোদিত এবং প্রভাবিত হয় না। (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | `POST /v1/rerank`-কে (এবং মেমরি ইঞ্জিনের লুপব্যাক রির্যাঙ্ক ধাপকে) localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করতে দিন — যেমন TEI, Infinity, vLLM ইত্যাদি চালানো কোনো LAN বক্স বা Tailscale পিয়ার। ডিফল্টভাবে বন্ধ — রিমোট হোস্টে রাউট করলে ইগ্রেস পরিচয় বদলে যায় এবং এটি অপারেটরের স্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক নোডগুলো (localhost, 127.0.0.1, 172.16-31.x) সর্বদা অনুমোদিত এবং প্রভাবিত হয় না। রিমোট নোডগুলোকে প্রোভাইডারের আউটবাউন্ড URL নীতিও (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) পাস করতে হবে; ক্লাউড-মেটাডেটা হোস্টে কখনোই রাউট করা হয় না। | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC সক্রিয় থাকলে পাসওয়ার্ড লগইন নিষ্ক্রিয় করুন, যাতে ব্যবহারকারীরা কেবল OIDC Single Sign-On-এর মাধ্যমে প্রমাণীকরণ করতে পারেন। সংক্ষিপ্ত অ্যালিয়াস `OIDC_DISABLE_PASSWORD_LOGIN`-ও গ্রহণযোগ্য; একই কী-এর Dashboard Feature Flag অগ্রাধিকার পায়। (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN`-এর সংক্ষিপ্ত অ্যালিয়াস (#10889)। | ### নিরাপত্তা জোরদারকরণ চেকলিস্ট @@ -251,7 +251,7 @@ OmniRoute সব ধরনের স্থায়ী ডেটা সংরক # প্রোডাকশন নিরাপত্তার ন্যূনতম শর্ত: AUTH_COOKIE_SECURE=true # HTTPS আবশ্যক REQUIRE_API_KEY=true # সব প্রক্সি কল প্রমাণীকরণ করুন -ALLOW_API_KEY_REVEAL=false # UI-তে কখনো কী প্রকাশ করবেন না +ALLOW_API_KEY_REVEAL=false # UI-তে কখনোই কী প্রকাশ করবেন না CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # 5 MB সীমা ``` @@ -301,59 +301,66 @@ OmniRoute দুই-স্তরবিশিষ্ট প্রতিরক্ ## 6. টুল ও রাউটিং নীতিমালা -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM-এর টুল/ফাংশন-কলিং অ্যাক্সেস নিয়ন্ত্রণ করে। `allowlist` = শুধু তালিকাভুক্ত টুল, `denylist` = তালিকাভুক্তগুলো ছাড়া সব, `disabled` = কোনো বিধিনিষেধ নেই। | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | পেলোড পরিবর্তনের নিয়মসমূহের JSON ফাইলের পাথ (প্রতি-মডেল/প্রোটোকল অনুযায়ী আপস্ট্রিম সমন্বয়)। | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | পেলোড নিয়মের ফাইলটি হট-রিলোড করার বিরতি (ms)। সর্বনিম্ন `1000`। | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | অপ্ট-ইন: প্রোভাইডার প্রিফিক্স আবশ্যক না করে Claude Code ক্লায়েন্টের প্রিফিক্সবিহীন `claude-*` মডেল ID-গুলোকে Claude Code OAuth অ্যাকাউন্টের মাধ্যমে রাউট করে। স্পষ্ট প্রোভাইডার প্রিফিক্স এখনও অগ্রাধিকার পায়। Claude প্রোভাইডার পেজের একটি ড্যাশবোর্ড টগলের মাধ্যমেও কনফিগার করা যায়। | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | রাউন্ড-রবিন কম্বোর জন্য প্রতি-মডেলের সমবর্তী কার্যক্রমের সর্বোচ্চ সীমা (#9100)। রাউন্ড-রবিন কম্বো সেমাফোরে কোনো ওভাররাইড ছাড়াই প্রতি মডেলে সর্বোচ্চ 3টি সমবর্তী অনুরোধের হার্ড-ক্যাপ ছিল, ফলে বেশি সমবর্তী ট্রাফিক ওই সীমার পেছনে ধারাবাহিকভাবে প্রক্রিয়াকৃত হতো। `>= 1` হিসেবে যাচাই করা হয় এবং `<= 32`-এ সীমাবদ্ধ করা হয়। | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | বিপজ্জনক অপ্ট-ইন, যা সরাসরি একক-মডেল অনুরোধের জন্য OmniRoute-এর স্থানীয় কনটেক্সট-উইন্ডো / সর্বোচ্চ-ইনপুট-টোকেন যাচাই এড়িয়ে যায়। আপস্ট্রিম প্রোভাইডারগুলো এখনও তাদের প্রকৃত সীমা প্রয়োগ করে; প্রম্পট কম্প্রেশন এবং মডেলের নিজস্ব আউটপুট-টোকেন সীমা সক্রিয় থাকে। কার্যকর অগ্রাধিকারের ক্রম হলো Feature Flags DB ওভাররাইড > এনভায়রনমেন্ট ভেরিয়েবল > ডিফল্ট; রিস্টার্টের প্রয়োজন নেই। | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(সেট করা নেই)_ | `open-sse/services/conversationTracker.ts` | কথোপকথনের ইতিহাস সংগ্রহ বন্ধ করতে `1` সেট করুন। SQLite পড়া বা মেসেজের ইতিহাস পার্স করার আগেই `resolveConversationId()` একটি ট্র্যাক না করা ফলাফল ফেরত দেয়, এবং ক্লায়েন্ট-প্রদত্ত সেশন ID-ও এর আওতাভুক্ত। রাউটিং-সেশন পরিচালনা অপরিবর্তিত থাকে এবং বিদ্যমান রেকর্ড মুছে ফেলা হয় না। যেসব ডিপ্লয়মেন্ট ড্যাশবোর্ডের কথোপকথন ভিউ ব্যবহার করে না এবং টার্ন টেবিলের বৃদ্ধি বন্ধ করতে চায়, তাদের জন্য। | +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ----------------------------------------------------------- | ------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM-এর টুল/ফাংশন কলিং অ্যাক্সেস নিয়ন্ত্রণ করে। `allowlist` = কেবল তালিকাভুক্ত টুল, `denylist` = তালিকাভুক্তগুলো ছাড়া সব, `disabled` = কোনো বিধিনিষেধ নেই। | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | পেলোড পরিবর্তনের নিয়মসংবলিত JSON ফাইলের পাথ (প্রতি-মডেল/প্রোটোকলভিত্তিক আপস্ট্রিম সমন্বয়)। | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | পেলোড নিয়মের ফাইল হট-রিলোড করার বিরতি (ms)। সর্বনিম্ন `1000`। | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | অপ্ট-ইন: প্রোভাইডার প্রিফিক্স আবশ্যক করার পরিবর্তে Claude Code ক্লায়েন্টের প্রিফিক্সবিহীন `claude-*` মডেল ID-গুলো Claude Code OAuth অ্যাকাউন্টের মাধ্যমে রাউট করে। স্পষ্ট প্রোভাইডার প্রিফিক্স এখনও অগ্রাধিকার পায়। Claude প্রোভাইডার পৃষ্ঠার একটি ড্যাশবোর্ড টগলের মাধ্যমেও এটি কনফিগার করা যায়। | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | রাউন্ড-রবিন কম্বোর জন্য প্রতি-মডেল কনকারেন্সি সীমা (#9100)। রাউন্ড-রবিন কম্বো সেমাফোরে কোনো ওভাররাইড ছাড়াই প্রতি মডেলে 3টি সমসাময়িক অনুরোধের হার্ড-ক্যাপ ছিল, ফলে বেশি কনকারেন্সির ট্র্যাফিক ওই সীমার পেছনে সিরিয়ালাইজ হতো। `>= 1` হিসেবে যাচাই করা হয় এবং `<= 32`-এ সীমাবদ্ধ রাখা হয়। | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | বিপজ্জনক অপ্ট-ইন, যা সরাসরি একক-মডেল অনুরোধের ক্ষেত্রে OmniRoute-এর স্থানীয় কনটেক্সট-উইন্ডো / সর্বোচ্চ-ইনপুট-টোকেন যাচাই এড়িয়ে যায়। আপস্ট্রিম প্রোভাইডারগুলো এখনও তাদের প্রকৃত সীমা প্রয়োগ করে; প্রম্পট কম্প্রেশন এবং মডেলের নিজস্ব আউটপুট-টোকেন সীমা সক্রিয় থাকে। কার্যকর অগ্রাধিকার হলো Feature Flags DB ওভাররাইড > এনভায়রনমেন্ট ভেরিয়েবল > ডিফল্ট; রিস্টার্টের প্রয়োজন নেই। | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(সেট করা নেই)_ | `open-sse/services/selfHostedEntry.ts` | ইনলাইন YAML `providers:` ডকুমেন্ট (RIC-738, D4)। এটি সেট করা হলে (`strategy:` ব্লকসহ বা ছাড়া), `/v1/chat/completions` ক্লাউড পাইপলাইনের পরিবর্তে সেলফ-হোস্টেড সমন্বিত OpenAI-সামঞ্জস্যপূর্ণ এন্ট্রিতে পাঠানো হয়। সেট করা না থাকলে (ডিফল্ট), রুটটি সরাসরি বিদ্যমান ক্লাউড পাইপলাইনে চলে যায়। `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md` দেখুন। | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(সেট করা নেই)_ | `open-sse/services/selfHostedEntry.ts` | যেসব ডিপ্লয়মেন্ট ইনলাইন env var-এর পরিবর্তে ফাইল পছন্দ করে, তাদের জন্য `OMNIROUTE_SELF_HOSTED_PROVIDERS`-এর একই `providers:` ডকুমেন্ট ধারণকারী YAML ফাইলের পাথ। যেকোনো একটি সেলফ-হোস্টেড এন্ট্রি সক্রিয় করে। | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(সেট করা নেই — উন্মুক্ত রুট)_ | `open-sse/services/selfHostedEntry.ts` | সমন্বিত সেলফ-হোস্টেড এন্ট্রির জন্য ঐচ্ছিক শেয়ার্ড API কী (D5 স্ক্যাফোল্ড, প্রতি-কী কোটা সিস্টেমের জন্য সংরক্ষিত)। এটি সেট করা থাকলে অনুরোধে অবশ্যই `Authorization: Bearer ` অন্তর্ভুক্ত থাকতে হবে। সেট করা না থাকলে: বিদ্যমান সেলফ-হোস্টেড লোকাল-প্রোভাইডার প্যাটার্নের সঙ্গে সামঞ্জস্য রেখে রুটটি উন্মুক্ত থাকে (লুপব্যাক/বিশ্বস্ত-নেটওয়ার্ক ডিপ্লয়মেন্ট)। | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(সেট করা নেই)_ | `open-sse/services/routingStrategies.ts` | ডিটারমিনিস্টিক রাউটিং ইঞ্জিনের জন্য ইনলাইন YAML `strategy:` ডকুমেন্ট (M2/RIC-740, D3) — ব্ল্যাকলিস্ট/হোয়াইটলিস্ট, কুলডাউন ব্রেকার, খরচ-অগ্রাধিকার, লেটেন্সি-সচেতনতা, ফলব্যাক চেইন। প্রতি-কী ভিত্তিতে `OMNIROUTE_SELF_HOSTED_PROVIDERS`-এর ভেতরে নেস্ট করা ইনলাইন `strategy:` ব্লককে ওভাররাইড করে। `docs/routing/DETERMINISTIC_ROUTING.md` দেখুন। | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(সেট করা নেই)_ | `open-sse/services/routingStrategies.ts` | যেসব ডিপ্লয়মেন্ট ইনলাইন env var-এর পরিবর্তে ফাইল পছন্দ করে, তাদের জন্য `OMNIROUTE_SELF_HOSTED_STRATEGY`-এর একই `strategy:` ডকুমেন্ট ধারণকারী YAML ফাইলের পাথ। | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(সেট করা নেই)_ | `open-sse/services/conversationTracker.ts` | কথোপকথনের ইতিহাস সংগ্রহ বন্ধ করতে `1` সেট করুন। SQLite পড়া বা বার্তার ইতিহাস পার্স করার আগেই `resolveConversationId()` একটি ট্র্যাক না করা ফলাফল ফেরত দেয় এবং ক্লায়েন্ট-প্রদত্ত session ID-ও এর আওতায় পড়ে। routing-session পরিচালনা অপরিবর্তিত থাকে এবং বিদ্যমান রেকর্ড মুছে ফেলা হয় না। যেসব ডিপ্লয়মেন্ট dashboard-এর কথোপকথন ভিউ ব্যবহার করে না এবং turn table-এর বৃদ্ধি বন্ধ করতে চায়, তাদের জন্য। | --- -## ৭. URL ও ক্লাউড সিঙ্ক - -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | অভ্যন্তরীণ সিঙ্ক জব থেকে `/api/sync/cloud` কল করার জন্য সার্ভার-সাইড URL। অ্যাপটি প্রকাশ্যে প্রক্সি করা হলেও এটিকে লুপব্যাক/কন্টেইনার URL হিসেবে রাখুন। | -| `CLOUD_URL` | _(খালি)_ | `src/lib/cloudSync.ts` | ক্লাউড রিলে এন্ডপয়েন্ট URL (প্রিমিয়াম ফিচার)। | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ক্লাউড সিঙ্ক অনুরোধের জন্য HTTP টাইমআউট। | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack বিল্ড কনফিগ | বিল্ড-টাইম প্রোফাইল (বান্ডেল থেকে বিশেষাধিকারপ্রাপ্ত মডিউলগুলো বাস্তবে বাদ দিতে `minimal`-এ সেট করুন)। | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ স্বতন্ত্র আউটপুট_ | `scripts/build/colocate-standalone.mjs` | বিল্ড-পরবর্তী কো-লোকেশন ধাপে ব্যবহৃত স্বতন্ত্র আউটপুট ডিরেক্টরির জন্য বিল্ড-টাইম ওভাররাইড। এটি রানটাইম সেটিং নয়। | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(খালি)_ | `src/lib/cloudSync.ts` | Cloud Sync প্রতিক্রিয়ার HMAC-SHA256 স্বাক্ষর যাচাই করতে ব্যবহৃত শেয়ার্ড সিক্রেট। | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Cloud Sync এন্ডপয়েন্টকে স্থানীয় ক্রেডেনশিয়াল ওভাররাইট করার অনুমতি দিতে `true`-এ সেট করুন। ডিফল্ট হলো `false`। | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | কোনো স্থানীয় সিক্রেট কনফিগার করা না থাকলে স্বাক্ষরবিহীন Cloud Sync প্রতিক্রিয়া প্রত্যাখ্যান করতে `true`-এ সেট করুন (#13679)। এই ফ্ল্যাগ নির্বিশেষে, উপস্থিত স্বাক্ষর সবসময় যাচাই করা হয়—এবং `OMNIROUTE_CLOUD_SYNC_SECRET` সেট না থাকলে সবসময় প্রত্যাখ্যান করা হয়। v3.9 থেকে ডিফল্টভাবে এটি বলবৎ থাকবে। | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | ব্যবহারকারীর নিশ্চিতকরণ ছাড়াই v3.8.5-এর এক-ধাপের "সবকিছু ইমপোর্ট করুন" আচরণে ফিরে যেতে `true`-এ সেট করুন। | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, ড্যাশবোর্ড, সিঙ্ক | OAuth redirect_uri, ড্যাশবোর্ড লিংক এবং জেনারেট করা পাবলিক URL-এর জন্য প্রকাশ্য URL। OAuth কলব্যাক বা জেনারেট করা ব্রাউজার লিংকে একটি ক্যানোনিক্যাল রিভার্স-প্রক্সি হোস্ট ব্যবহার করা আবশ্যক হলে এটিকে স্থিতিশীল পাবলিক URL-এ সেট করুন। | -| `NEXT_PUBLIC_CLOUD_URL` | _(খালি)_ | ক্লায়েন্ট-সাইড | `CLOUD_URL`-এর ক্লায়েন্ট-সাইড মিরর। | -| `NEXT_PUBLIC_APP_URL` | _(সেট করা নেই)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL`-এর জন্য লিগ্যাসি ফলব্যাক। | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(সেট করা নেই)_ | পাবলিক-অরিজিন রিজলভার, ইমেজ URL | পাবলিক URL তৈরি এবং ড্যাশবোর্ড-বহির্ভূত ব্রাউজার-অরিজিন যাচাইয়ের জন্য ব্যবহৃত সর্বোচ্চ-অগ্রাধিকারের ব্রাউজারমুখী OmniRoute অরিজিন। OpenWebUI বা অন্য কোনো রিলে অভ্যন্তরীণ URL দিয়ে OmniRoute-এ পৌঁছালেও ব্যবহারকারীর ব্রাউজারকে LAN, টানেল বা পাবলিক অরিজিন থেকে জেনারেট করা মিডিয়া আনতে হলে এটি সেট করুন। `/v1` অন্তর্ভুক্ত করবেন **না**। | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(সেট করা নেই)_ | `open-sse/config/providerPluginManifestUrl.ts` | সাইডকার ক্লায়েন্টদের কাছে ঘোষিত অ্যাবসোলিউট প্রোভাইডার প্লাগইন ম্যানিফেস্ট URL। সেট না থাকলে OmniRoute অনুরোধের অরিজিন বা HOST/PORT থেকে `/api/v1/provider-plugin-manifest` নির্ণয় করে। | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | অনুরোধের অরিজিন ছাড়াই HOST/PORT থেকে প্রোভাইডার প্লাগইন ম্যানিফেস্ট URL নির্ণয়ের সময় ব্যবহৃত প্রোটোকল। স্পষ্ট `OMNIROUTE_PROVIDER_MANIFEST_URL` সেট করা না থাকলে TLS-টার্মিনেটিং পাবলিক প্রক্সির পেছনে এটিকে `https`-এ সেট করুন। | -| `OMNIROUTE_TRUST_PROXY` | _(সেট করা নেই)_ | `src/server/origin/publicOrigin.ts` | ফরোয়ার্ড করা পাবলিক-অরিজিন হেডারের জন্য ঐচ্ছিক ট্রাস্ট মোড। সেট না থাকা = নিরাপত্তাসংক্রান্ত সিদ্ধান্তের জন্য `Forwarded` / `X-Forwarded-*` বিশ্বাস করবেন না। `true` / `loopback` শুধু টোকেন-স্ট্যাম্পযুক্ত লুপব্যাক প্রক্সি থেকে ফরোয়ার্ড করা হোস্ট/প্রোটো বিশ্বাস করে। `private` / `lan` ব্যক্তিগত-LAN প্রক্সি পিয়ারকেও বিশ্বাস করে। প্রোডাকশনে স্পষ্ট `NEXT_PUBLIC_BASE_URL` ব্যবহার করাই শ্রেয়। | -| `KIE_CALLBACK_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | অ্যাসিঙ্ক্রোনাস kie.ai জবের জন্য পাবলিক কলব্যাক URL। `OMNIROUTE_KIE_CALLBACK_URL` এবং `OMNIROUTE_PUBLIC_URL`-এর আগে সর্বোচ্চ-অগ্রাধিকারের ওভাররাইড। | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL`-এর বিকল্প বানান। প্রাথমিক ভেরিয়েবল সেট না থাকলে এটিতে ফলব্যাক করা হয়। | -| `OMNIROUTE_PUBLIC_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | অ্যাসিঙ্ক কলব্যাক URL তৈরি করতে ব্যবহৃত পাবলিক অরিজিন। kie.ai কলব্যাকের জন্য সর্বনিম্ন-অগ্রাধিকারের ফলব্যাক; অন্যান্য রিলের জন্যও জেনেরিক পাবলিক URL হিসেবে ব্যবহৃত হয়। | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage পেজে ব্যবহৃত CrofAI কোটা লুকআপ এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage পেজে ব্যবহৃত অফিসিয়াল API-কী-প্রমাণীকৃত OpenCode Go ব্যবহার এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | ক্লায়েন্ট পাঠায়নি—এমন opencode-go/zen আপস্ট্রিম অনুরোধে OpenCode CLI পরিচয় হেডার (User-Agent, x-opencode-client/project, অনুরোধ/সেশন UUID) তৈরি করে, যাতে VPS ইগ্রেসে Cloudflare সেগুলো গ্রহণ করে (#6210/#5997)। #10571 থেকে ডিফল্টভাবে চালু; `false`/`0`/`no`/`off` দিয়ে নিষ্ক্রিয় করুন। | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে এবং প্রতি-প্রোভাইডার `_USER_AGENT` ওভাররাইড সেট না থাকলে ব্যবহৃত ডিফল্ট User-Agent। কেবল opencode এক্সিকিউটরে প্রয়োগ করা হয়। | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে তৈরি করা `x-opencode-client` হেডারের মান। | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে তৈরি করা `x-opencode-project` হেডারের মান। | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | কোটা স্ক্র্যাপিংয়ের জন্য ব্যবহৃত Ollama Cloud সেটিংস URL। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। | -| `OLLAMA_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | সেটিংস-পেজ থেকে কোটা স্ক্র্যাপিংয়ে ব্যবহৃত Ollama Cloud `__Secure-session` কুকি। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ ড্যাশবোর্ড ফিল্ড ব্যবহার করাই শ্রেয়। | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | বিকল্প Ollama Cloud `__Secure-session` কুকি এনভায়রনমেন্ট ভেরিয়েবল। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ ড্যাশবোর্ড ফিল্ড ব্যবহার করাই শ্রেয়। | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | সংক্ষিপ্ত অ্যালিয়াসগুলোর আগে ব্যবহৃত বিকল্প Ollama Cloud `__Secure-session` কুকি এনভায়রনমেন্ট ভেরিয়েবল। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ ড্যাশবোর্ড ফিল্ড ব্যবহার করাই শ্রেয়। | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) ব্যবহারসীমা এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। | +## 7. URL ও ক্লাউড সিঙ্ক + +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | অভ্যন্তরীণ সিঙ্ক জব থেকে `/api/sync/cloud` কল করার জন্য সার্ভার-সাইড URL। অ্যাপটি প্রকাশ্যে প্রক্সি করা হলেও এটিকে লুপব্যাক/কনটেইনার URL হিসেবে রাখুন। | +| `CLOUD_URL` | _(খালি)_ | `src/lib/cloudSync.ts` | ক্লাউড রিলে এন্ডপয়েন্ট URL (প্রিমিয়াম ফিচার)। | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ক্লাউড সিঙ্ক রিকোয়েস্টের জন্য HTTP টাইমআউট। | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack বিল্ড কনফিগ | বিল্ড-টাইম প্রোফাইল (বান্ডেল থেকে বিশেষাধিকারপ্রাপ্ত মডিউলগুলো বাস্তবে বাদ দিতে `minimal`-এ সেট করুন)। | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ স্বতন্ত্র আউটপুট_ | `scripts/build/colocate-standalone.mjs` | পোস্ট-বিল্ড সহাবস্থান ধাপে ব্যবহৃত স্বতন্ত্র আউটপুট ডিরেক্টরির জন্য বিল্ড-টাইম ওভাররাইড। এটি কোনো রানটাইম সেটিং নয়। | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(খালি)_ | `src/lib/cloudSync.ts` | Cloud Sync রেসপন্সের HMAC-SHA256 স্বাক্ষর যাচাই করতে ব্যবহৃত শেয়ার্ড সিক্রেট। | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Cloud Sync এন্ডপয়েন্টকে স্থানীয় ক্রেডেনশিয়াল ওভাররাইট করার অনুমতি দিতে `true`-এ সেট করুন। ডিফল্ট হলো `false`। | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | কোনো স্থানীয় সিক্রেট কনফিগার করা না থাকলে স্বাক্ষরবিহীন Cloud Sync রেসপন্স প্রত্যাখ্যান করতে `true`-এ সেট করুন (#13679)। উপস্থিত স্বাক্ষর সর্বদা যাচাই করা হয়—এবং `OMNIROUTE_CLOUD_SYNC_SECRET` সেট না থাকলে সর্বদা প্রত্যাখ্যান করা হয়—এই ফ্ল্যাগের মান নির্বিশেষে। v3.9 থেকে ডিফল্ট হিসেবে এটি কার্যকর হবে। | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | ব্যবহারকারীর নিশ্চিতকরণ ছাড়াই v3.8.5-এর এক-ধাপের "সবকিছু ইমপোর্ট করুন" আচরণে ফিরে যেতে `true`-এ সেট করুন। | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, ড্যাশবোর্ড, সিঙ্ক | OAuth redirect_uri, ড্যাশবোর্ড লিংক এবং তৈরি করা পাবলিক URL-এর জন্য প্রকাশ্য URL। OAuth কলব্যাক বা তৈরি করা ব্রাউজার লিংকে একটি ক্যানোনিক্যাল রিভার্স-প্রক্সি হোস্ট ব্যবহার করতে হলে এটিকে স্থিতিশীল পাবলিক URL-এ সেট করুন। | +| `NEXT_PUBLIC_CLOUD_URL` | _(খালি)_ | ক্লায়েন্ট-সাইড | `CLOUD_URL`-এর ক্লায়েন্ট-সাইড প্রতিরূপ। | +| `NEXT_PUBLIC_APP_URL` | _(সেট করা নেই)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL`-এর জন্য লিগ্যাসি ফলব্যাক। | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(সেট করা নেই)_ | পাবলিক-অরিজিন রিজলভার, ইমেজ URL | পাবলিক URL তৈরি এবং ড্যাশবোর্ড-বহির্ভূত ব্রাউজার-অরিজিন যাচাইয়ের জন্য ব্যবহৃত সর্বোচ্চ-অগ্রাধিকারের ব্রাউজার-মুখী OmniRoute অরিজিন। OpenWebUI বা অন্য কোনো রিলে অভ্যন্তরীণ URL দিয়ে OmniRoute-এ পৌঁছালেও ব্যবহারকারীর ব্রাউজারকে LAN, টানেল বা পাবলিক অরিজিন থেকে তৈরি করা মিডিয়া আনতে হলে এটি সেট করুন। `/v1` অন্তর্ভুক্ত করবেন **না**। | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(সেট করা নেই)_ | `open-sse/config/providerPluginManifestUrl.ts` | সাইডকার ক্লায়েন্টগুলোর কাছে প্রকাশিত অ্যাবসোলিউট প্রোভাইডার প্লাগইন ম্যানিফেস্ট URL। সেট করা না থাকলে OmniRoute অনুরোধের অরিজিন বা HOST/PORT থেকে `/api/v1/provider-plugin-manifest` নির্ণয় করে। | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | কোনো অনুরোধের অরিজিন ছাড়াই HOST/PORT থেকে প্রোভাইডার প্লাগইন ম্যানিফেস্ট URL নির্ণয়ের সময় ব্যবহৃত প্রোটোকল। স্পষ্টভাবে `OMNIROUTE_PROVIDER_MANIFEST_URL` সেট করা না থাকলে TLS-টার্মিনেটিং পাবলিক প্রক্সির পেছনে এটিকে `https` হিসেবে সেট করুন। | +| `OMNIROUTE_TRUST_PROXY` | _(সেট করা নেই)_ | `src/server/origin/publicOrigin.ts` | ফরোয়ার্ড করা পাবলিক-অরিজিন হেডারের জন্য ঐচ্ছিক ট্রাস্ট মোড। সেট করা নেই = নিরাপত্তাসংক্রান্ত সিদ্ধান্তে `Forwarded` / `X-Forwarded-*` বিশ্বাস করবেন না। `true` / `loopback` কেবল টোকেন-স্ট্যাম্পযুক্ত লুপব্যাক প্রক্সি থেকে ফরোয়ার্ড করা host/proto বিশ্বাস করে। `private` / `lan` প্রাইভেট-LAN প্রক্সি পিয়ারকেও বিশ্বাস করে। প্রোডাকশনে স্পষ্টভাবে `NEXT_PUBLIC_BASE_URL` নির্ধারণ করাই শ্রেয়। | +| `KIE_CALLBACK_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | অ্যাসিঙ্ক্রোনাস kie.ai কাজের জন্য পাবলিক কলব্যাক URL। `OMNIROUTE_KIE_CALLBACK_URL` এবং `OMNIROUTE_PUBLIC_URL`-এর আগে সর্বোচ্চ-অগ্রাধিকারের ওভাররাইড। | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL`-এর বিকল্প বানান। প্রাথমিক ভেরিয়েবলটি সেট করা না থাকলে এটি ফলব্যাক হিসেবে ব্যবহৃত হয়। | +| `OMNIROUTE_PUBLIC_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | অ্যাসিঙ্ক কলব্যাক URL গঠনে ব্যবহৃত পাবলিক অরিজিন। kie.ai কলব্যাকের জন্য সর্বনিম্ন-অগ্রাধিকারের ফলব্যাক; অন্যান্য রিলের জন্যও সাধারণ পাবলিক URL হিসেবে ব্যবহৃত হয়। | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage পেজে ব্যবহৃত CrofAI কোটা অনুসন্ধান এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage পেজে ব্যবহৃত অফিসিয়াল API-কী-প্রমাণীকৃত OpenCode Go ব্যবহারসংক্রান্ত এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | ক্লায়েন্ট পাঠায়নি—এমন OpenCode CLI পরিচয় হেডার (User-Agent, x-opencode-client/project, অনুরোধ/সেশন UUID) opencode-go/zen আপস্ট্রিম অনুরোধে তৈরি করে, যাতে VPS ইগ্রেসে Cloudflare সেগুলো গ্রহণ করে (#6210/#5997)। #10571 থেকে ডিফল্টভাবে চালু; `false`/`0`/`no`/`off` দিয়ে অপ্ট আউট করুন। | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে এবং প্রতি-প্রোভাইডারের জন্য কোনো `_USER_AGENT` ওভাররাইড সেট না থাকলে ব্যবহৃত ডিফল্ট User-Agent। কেবল opencode এক্সিকিউটরে প্রয়োগ করা হয়। আপস্ট্রিম দ্বারা গেট করা কী-বিহীন অনুরোধে, কনফিগার করা মানে `opencode/= 1.17>` না থাকলে অনুরোধ প্রত্যাখ্যান না করে সেটিকে এই ডিফল্ট দিয়ে প্রতিস্থাপন করা হয়। | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে তৈরি করা `x-opencode-client` হেডারের মান। | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে সংশ্লেষিত `x-opencode-project` হেডারের মান। | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(সেট করা নেই)_ | `open-sse/executors/opencodeFreeTierContract.ts` | কী-বিহীন OpenCode অনুরোধের বডি (স্ট্রিমিং ফ্ল্যাগ ও টুল তালিকা) সমন্বয় বন্ধ করতে `off` সেট করুন। হেডারগুলো তবুও প্রয়োগ করা হয়। প্রতিটি অনুরোধে এটি পড়া হয়, তাই পরিবর্তন অবিলম্বে কার্যকর হয়। | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(সেট করা নেই)_ | `open-sse/executors/opencodeFreeTierContract.ts` | কোনো কী-বিহীন OpenCode অনুরোধে কোনো টুল না থাকলে এবং সেই মডেলের জন্য এখনও কিছু পর্যবেক্ষণ করা না হয়ে থাকলে, সেখানে ঘোষণা করার জন্য কমা দিয়ে পৃথক করা টুলের নাম। খালি থাকলে একটি একক প্লেসহোল্ডার ব্যবহৃত হয়, যা মডেলকে কল না করতে বলা হয়। সর্বাধিক 32টি এন্ট্রি, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; অবৈধ এন্ট্রিগুলো উপেক্ষা করা হয়। | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | কোটা স্ক্র্যাপিংয়ের জন্য ব্যবহৃত Ollama Cloud সেটিংস URL। রিলে / পরীক্ষার ফিক্সচারের জন্য ওভাররাইড করুন। | +| `OLLAMA_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | সেটিংস-পৃষ্ঠার কোটা স্ক্র্যাপিংয়ের জন্য ব্যবহৃত Ollama Cloud `__Secure-session` কুকি। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ Dashboard ফিল্ডটি ব্যবহার করা শ্রেয়। | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | বিকল্প Ollama Cloud `__Secure-session` কুকি env var। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ Dashboard ফিল্ডটি ব্যবহার করা শ্রেয়। | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | সংক্ষিপ্ত উপনামগুলোর আগে ব্যবহৃত বিকল্প Ollama Cloud `__Secure-session` কুকি env var। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ Dashboard ফিল্ডটি ব্যবহার করা শ্রেয়। | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) ব্যবহারের সীমার এন্ডপয়েন্ট। রিলে / পরীক্ষার ফিক্সচারের জন্য ওভাররাইড করুন। | > [!IMPORTANT] -> রিভার্স প্রক্সির (nginx, Caddy) পেছনে ডিপ্লয় করার সময়, OAuth কলব্যাক বা তৈরি করা পাবলিক লিংকে ওই হোস্টনেম ব্যবহার করা আবশ্যক হলে `NEXT_PUBLIC_BASE_URL`-কে আপনার স্থিতিশীল পাবলিক URL-এ (যেমন, `https://omniroute.example.com`) সেট করুন। এটি না করলে OAuth কলব্যাক ব্যর্থ হতে পারে, কারণ `redirect_uri` মিলবে না এবং তৈরি করা পাবলিক লিংক অভ্যন্তরীণ কনটেইনার অরিজিনের দিকে নির্দেশ করতে পারে। +> কোনো রিভার্স প্রক্সির (nginx, Caddy) পেছনে ডিপ্লয় করার সময়, OAuth কলব্যাক বা জেনারেট করা পাবলিক লিঙ্কে সেই হোস্টনাম ব্যবহার করা আবশ্যক হলে `NEXT_PUBLIC_BASE_URL`-কে আপনার স্থিতিশীল পাবলিক URL-এ সেট করুন (যেমন, `https://omniroute.example.com`)। এটি না করলে OAuth কলব্যাক ব্যর্থ হতে পারে, কারণ `redirect_uri` মিলবে না এবং জেনারেট করা পাবলিক লিঙ্কগুলো অভ্যন্তরীণ কনটেইনার অরিজিনকে নির্দেশ করতে পারে। > -> সার্ভার-টু-সার্ভার জবের জন্য `BASE_URL`-কে একটি অভ্যন্তরীণ লুপব্যাক/কনটেইনার URL হিসেবেই রাখুন। ক্রেডেনশিয়াল-বহনকারী অভ্যন্তরীণ সেলফ-ফেচের জন্য ব্রাউজারের `Origin` বা পাবলিক হোস্টনেম ব্যবহার করবেন না। +> সার্ভার-টু-সার্ভার কাজের জন্য `BASE_URL`-কে একটি অভ্যন্তরীণ লুপব্যাক/কনটেইনার URL হিসেবেই রাখুন। ক্রেডেনশিয়াল-বহনকারী অভ্যন্তরীণ স্ব-ফেচের জন্য ব্রাউজারের `Origin` বা পাবলিক হোস্টনাম ব্যবহার করবেন না। > -> প্রমাণীকৃত ড্যাশবোর্ড রাইট অপারেশনের জন্য স্থির পাবলিক বেস URL প্রয়োজন হয় না: ড্যাশবোর্ড একটি সেশন-বাউন্ড CSRF টোকেনসহ একই-অরিজিনের অনিরাপদ রিকোয়েস্ট পাঠায়। নন-ড্যাশবোর্ড ব্রাউজার ইন্টিগ্রেশনের জন্য OmniRoute তবুও পাবলিক-অরিজিন যাচাইকরণকে কেন্দ্রীভূত রাখে: স্পষ্টভাবে নির্ধারিত পাবলিক URL এনভায়রনমেন্ট ভ্যারিয়েবলগুলোকে প্রথমে বিশ্বাস করা হয়; `OMNIROUTE_TRUST_PROXY` সক্রিয় না থাকলে এবং তাৎক্ষণিক প্রক্সি পিয়ারকে টোকেন দিয়ে বিশ্বস্ত হিসেবে চিহ্নিত না করা হলে অপরিবর্তিত `Forwarded` / `X-Forwarded-*` হেডারগুলো উপেক্ষা করা হয়। একই-অরিজিন ড্যাশবোর্ড রিকোয়েস্ট ঠিক করতে CORS সেটিংস ব্যবহার করবেন না; CORS কেবল ক্রস-অরিজিন ব্রাউজার ক্লায়েন্টের জন্য। +> প্রমাণীকৃত Dashboard রাইটের জন্য কোনো স্থির পাবলিক বেস URL প্রয়োজন হয় না: Dashboard একই-অরিজিনের অনিরাপদ অনুরোধগুলো একটি সেশন-বাউন্ড CSRF টোকেনসহ পাঠায়। OmniRoute তবুও Dashboard-বহির্ভূত ব্রাউজার ইন্টিগ্রেশনের জন্য পাবলিক-অরিজিন যাচাইকরণ কেন্দ্রীভূত করে: স্পষ্ট পাবলিক URL env var-গুলোকে প্রথমে বিশ্বাস করা হয়; `OMNIROUTE_TRUST_PROXY` সক্রিয় না থাকলে এবং তাৎক্ষণিক প্রক্সি পিয়ারকে টোকেন দিয়ে বিশ্বস্ত হিসেবে চিহ্নিত না করা হলে কাঁচা `Forwarded` / `X-Forwarded-*` হেডার উপেক্ষা করা হয়। একই-অরিজিন Dashboard অনুরোধ ঠিক করতে CORS সেটিংস ব্যবহার করবেন না; CORS শুধু ক্রস-অরিজিন ব্রাউজার ক্লায়েন্টের জন্য। --- @@ -588,47 +595,48 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude ## 11. OAuth প্রদানকারীর ক্রেডেনশিয়াল -**localhost ডেভেলপমেন্টের** জন্য বিল্ট-ইন ক্রেডেনশিয়াল। রিমোট ডিপ্লয়মেন্টের জন্য, প্রতিটি প্রদানকারীর ডেভেলপার কনসোলে আপনার নিজস্ব ক্রেডেনশিয়াল নিবন্ধন করুন। - -| ভেরিয়েবল | প্রদানকারী | নোট | -| --------------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | পাবলিক ক্লায়েন্ট — কোনো সিক্রেটের প্রয়োজন নেই। | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | রিডাইরেক্ট URI ওভাররাইড করে। ডিফল্ট: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | পাবলিক ক্লায়েন্ট। | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | সঙ্গতিপূর্ণ `_SECRET` প্রয়োজন। | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | পাবলিক ক্লায়েন্ট। | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | সঙ্গতিপূর্ণ `_SECRET` প্রয়োজন। | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | পাবলিক ক্লায়েন্ট। | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot-এর OAuth ক্লায়েন্ট ID-এর জন্য ঐচ্ছিক ওভাররাইড। সেট করা না থাকলে `GITHUB_OAUTH_CLIENT_ID`-এর পাবলিক ডিফল্ট ব্যবহার করে। | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | প্রতি-সংযোগের জন্য কোনো ক্রেডেনশিয়াল উপলভ্য না থাকলে `open-sse/executors/devin-cli.ts` দ্বারা ব্যবহৃত API কী ফলব্যাক। ঐচ্ছিক। | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI বাইনারির (`devin`) কাস্টম পাথ। `open-sse/executors/devin-cli.ts` দ্বারা নির্ধারিত হয়। | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo-এর জন্য OAuth ক্লায়েন্ট ID। `https://gitlab.com/-/profile/applications`-এ রিডাইরেক্ট URI `/callback` এবং স্কোপ `api, read_user, openid, profile, email` সহ একটি অ্যাপ নিবন্ধন করুন। `GITLAB_OAUTH_CLIENT_ID` ফলব্যাক হিসেবে ব্যবহৃত হয়। | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo-এর জন্য OAuth ক্লায়েন্ট সিক্রেট। ঐচ্ছিক — PKCE ফ্লোতে সিক্রেটের প্রয়োজন হয় না। `GITLAB_OAUTH_CLIENT_SECRET` ফলব্যাক হিসেবে ব্যবহৃত হয়। | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab বেস URL ওভাররাইড করে (স্ব-হোস্টেড GitLab)। ডিফল্ট হলো `https://gitlab.com`। `GITLAB_BASE_URL` ফলব্যাক হিসেবে ব্যবহৃত হয়। | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL`-এর লিগ্যাসি ফলব্যাক। `_DUO_` ভ্যারিয়েন্ট সেট করা না থাকলে ব্যবহৃত হয়। | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` দ্বারা ব্যবহৃত `GITLAB_DUO_OAUTH_CLIENT_ID`-এর লিগ্যাসি ফলব্যাক। | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` দ্বারা ব্যবহৃত `GITLAB_DUO_OAUTH_CLIENT_SECRET`-এর লিগ্যাসি ফলব্যাক। | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth সক্রিয় করতে সেট করুন। | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | সরাসরি API কী ফলব্যাক (OAuth বাইপাস করে)। | -| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI-এর জন্য ওয়ার্কস্পেস ID। | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE`-এর উপনাম। | -| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI কনফিগ ডিরেক্টরি ওভাররাইড করে (বিচ্ছিন্ন PAT সেশন, ব্রাউজার লগইন ওভাররাইট করা এড়ায়)। | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat`-এ `validated` হিসেবে পাঠানোর জন্য ফ্রন্টএন্ড `tk` টোকেন। Blackbox টোকেন মিলিয়ে দেখা বাধ্যতামূলক করলে এটি প্রয়োজন; অন্যথায় OmniRoute একটি র্যান্ডম UUID ফলব্যাক হিসেবে ব্যবহার করে। সমস্যা #2252 দেখুন। | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | নন-Anthropic vision-bridge কলের জন্য OpenAI-সামঞ্জস্যপূর্ণ বেস URL। ডিফল্ট হিসেবে লিগ্যাসি OpenAI URL env অথবা api.openai.com ব্যবহৃত হয়। এটিকে OmniRoute-এর `/v1` সেলফ-লুপ অথবা যেকোনো OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের (Gemini OpenAI-compat, OpenRouter) দিকে নির্দেশ করুন। সমস্যা #2232। URL-টি OmniRoute-এর নিজস্ব `/v1` হলে, describe সাব-রিকোয়েস্ট `x-omniroute-admission-bypass: internal` পাঠায় এবং নির্ধারিত সেলফ-লুপ ক্রেডেনশিয়াল (লোকাল মোডে `sk_omniroute` সেন্টিনেল, অথবা `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) দিয়ে প্রমাণীকরণ করে, যাতে `REQUIRE_API_KEY=true` ডিপ্লয়মেন্ট কাজ করে। | -| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | উপরের URL-এর জন্য API কী। নন-Anthropic vision-bridge কলের ক্ষেত্রে প্রতি-প্রদানকারীর OpenAI / Google env ভ্যারিয়েবল ওভাররাইড করে। Anthropic মডেলগুলো তাদের নিবেদিত Anthropic কী পাথ ব্যবহার করে। সমস্যা #2232। | +**localhost ডেভেলপমেন্টের** জন্য বিল্ট-ইন ক্রেডেনশিয়াল। রিমোট ডিপ্লয়মেন্টের জন্য প্রতিটি প্রদানকারীর ডেভেলপার কনসোলে আপনার নিজস্ব ক্রেডেনশিয়াল নিবন্ধন করুন। + +| ভেরিয়েবল | প্রদানকারী | নোট | +| --------------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | পাবলিক ক্লায়েন্ট — কোনো সিক্রেটের প্রয়োজন নেই। | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | রিডাইরেক্ট URI ওভাররাইড করে। ডিফল্ট: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | পাবলিক ক্লায়েন্ট। | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | সঙ্গতিপূর্ণ `_SECRET` প্রয়োজন। | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | পাবলিক ক্লায়েন্ট। | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | সঙ্গতিপূর্ণ `_SECRET` প্রয়োজন। | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | পাবলিক ক্লায়েন্ট। | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot-এর OAuth ক্লায়েন্ট ID-এর জন্য ঐচ্ছিক ওভাররাইড। সেট করা না থাকলে `GITHUB_OAUTH_CLIENT_ID`-এর পাবলিক ডিফল্ট ব্যবহার করা হয়। | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | `Copilot-Integration-Id` এবং `Editor-Plugin-Version` হেডারে পাঠানো GitHub Copilot ক্লায়েন্ট ইন্টিগ্রেশন ID-এর জন্য ঐচ্ছিক ওভাররাইড। ডিফল্ট হলো `copilot-developer-cli`। | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | প্রতি-সংযোগের কোনো ক্রেডেনশিয়াল উপলভ্য না থাকলে `open-sse/executors/devin-cli.ts` দ্বারা ব্যবহৃত API কী ফলব্যাক। ঐচ্ছিক। | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI বাইনারির (`devin`) কাস্টম পাথ। `open-sse/executors/devin-cli.ts` দ্বারা সমাধান করা হয়। | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo-এর OAuth ক্লায়েন্ট ID। রিডাইরেক্ট URI `/callback` এবং `api, read_user, openid, profile, email` স্কোপসহ `https://gitlab.com/-/profile/applications`-এ একটি অ্যাপ নিবন্ধন করুন। `GITLAB_OAUTH_CLIENT_ID` ফলব্যাক হিসেবে ব্যবহৃত হয়। | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo-এর OAuth ক্লায়েন্ট সিক্রেট। ঐচ্ছিক — PKCE ফ্লোতে কোনো সিক্রেটের প্রয়োজন হয় না। `GITLAB_OAUTH_CLIENT_SECRET` ফলব্যাক হিসেবে ব্যবহৃত হয়। | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab বেস URL (স্ব-হোস্টেড GitLab) ওভাররাইড করে। ডিফল্ট হলো `https://gitlab.com`। `GITLAB_BASE_URL` ফলব্যাক হিসেবে ব্যবহৃত হয়। | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL`-এর জন্য লিগ্যাসি ফলব্যাক। `_DUO_` ভ্যারিয়েন্ট সেট করা না থাকলে এটি ব্যবহৃত হয়। | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` দ্বারা ব্যবহৃত `GITLAB_DUO_OAUTH_CLIENT_ID`-এর জন্য লিগ্যাসি ফলব্যাক। | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` দ্বারা ব্যবহৃত `GITLAB_DUO_OAUTH_CLIENT_SECRET`-এর জন্য লিগ্যাসি ফলব্যাক। | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth সক্রিয় করতে সেট করুন। | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | সরাসরি API key ফলব্যাক (OAuth এড়িয়ে যায়)। | +| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI-এর জন্য Workspace ID। | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE`-এর উপনাম। | +| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI config dir ওভাররাইড করে (বিচ্ছিন্ন PAT সেশন, একটি browser login ওভাররাইট করা এড়ায়)। | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat`-এ `validated` হিসেবে পাঠানোর জন্য frontend `tk` token। Blackbox token মেলানো বাধ্যতামূলক করলে এটি প্রয়োজন; অন্যথায় OmniRoute একটি random UUID-তে ফলব্যাক করে। issue #2252 দেখুন। | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | non-Anthropic vision-bridge কলের জন্য OpenAI-compatible base URL। ডিফল্ট হিসেবে legacy OpenAI URL env বা api.openai.com ব্যবহৃত হয়। OmniRoute-এর `/v1` self-loop বা যেকোনো OpenAI-compat endpoint (Gemini OpenAI-compat, OpenRouter)-এর দিকে নির্দেশ করুন। issue #2232। URL-টি OmniRoute-এর নিজস্ব `/v1` হলে, describe sub-request-টি `x-omniroute-admission-bypass: internal` পাঠায় এবং resolved self-loop credential (local mode-এ `sk_omniroute` sentinel, অথবা `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) দিয়ে authentication করে, যাতে `REQUIRE_API_KEY=true` deployment কাজ করে। | +| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | উপরের URL-এর জন্য API key। non-Anthropic vision-bridge কলের ক্ষেত্রে per-provider OpenAI / Google env var-গুলোকে ওভাররাইড করে। Anthropic model-গুলো তাদের dedicated Anthropic key path ব্যবহার করে। issue #2232। | > [!WARNING] > > 1. [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials)-এ যান > 2. একটি OAuth 2.0 Client ID তৈরি করুন (ধরন: "Web application") -> 3. Authorized redirect URI হিসেবে আপনার সার্ভারের URL যোগ করুন -> 4. `.env`-এ থাকা ক্রেডেনশিয়ালের মানগুলো প্রতিস্থাপন করুন। +> 3. Authorized redirect URI হিসেবে আপনার server URL যোগ করুন +> 4. `.env`-এ credential value-গুলো প্রতিস্থাপন করুন। --- @@ -731,9 +739,9 @@ Docker বা হেডলেস ডিপ্লয়মেন্টের ব ## 15. টাইমআউট সেটিংস -সব মান **মিলিসেকেন্ডে**। কেন্দ্রীভূত রেজোলিউশন `src/shared/utils/runtimeTimeouts.ts`-এ রয়েছে। +সব মান **মিলিসেকেন্ডে**। কেন্দ্রীভূত সমাধান `src/shared/utils/runtimeTimeouts.ts`-এ রয়েছে। -### টাইমআউটের ক্রমাধিকার +### টাইমআউটের অনুক্রম ``` REQUEST_TIMEOUT_MS (গ্লোবাল ওভাররাইড) @@ -748,7 +756,7 @@ REQUEST_TIMEOUT_MS (গ্লোবাল ওভাররাইড) ├─→ STREAM_IDLE_TIMEOUT_MS (REQUEST_TIMEOUT_MS থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, ডিফল্ট: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (স্বতন্ত্র, ডিফল্ট: 1260000; 0 নিষ্ক্রিয় করে) ├─→ STREAM_READINESS_TIMEOUT_MS (REQUEST_TIMEOUT_MS থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, ডিফল্ট: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (অভিযোজিত প্রস্তুতি এক্সটেনশনের সীমা নির্ধারণ করে, ডিফল্ট: 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (অভিযোজিত প্রস্তুতির বর্ধিত সময়সীমা নির্ধারণ করে, ডিফল্ট: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (REQUEST_TIMEOUT_MS থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, ডিফল্ট: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (উদ্ভূত, ডিফল্ট: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (ডিফল্ট: 60000) @@ -756,105 +764,106 @@ REQUEST_TIMEOUT_MS (গ্লোবাল ওভাররাইড) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (ডিফল্ট: 0 = নিষ্ক্রিয়) ``` -| ভেরিয়েবল | ডিফল্ট | বিবরণ | -| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(সেট করা নেই)_ | গ্লোবাল শর্টকাট — `FETCH_TIMEOUT_MS` এবং `STREAM_IDLE_TIMEOUT_MS` উভয়ের ডিফল্ট মান ওভাররাইড করে। | -| `FETCH_TIMEOUT_MS` | `600000` | আপস্ট্রিম প্রোভাইডার কলে মোট HTTP অনুরোধের টাইমআউট। | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | বাতিল করার আগে কাঁচা আপস্ট্রিম বাইটগুলোর মধ্যবর্তী সর্বোচ্চ নীরবতার সময়। এক্সটেন্ডেড-থিংকিং মডেল খুব কম ক্ষেত্রেই >90s বিরতি নেয়। | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | সক্রিয় SSE স্ট্রিমের সর্বোচ্চ মোট আয়ুষ্কাল; আপস্ট্রিম বাইট এলে এটি কখনো রিসেট হয় না এবং `REQUEST_TIMEOUT_MS` থেকে স্বাধীন। রেজিস্ট্রিতে থাকা প্রতি-মডেলের সর্ববৃহৎ `timeoutMs` (1200000, Codex)-এর সঙ্গে 60000 মার্জিন যোগ করে এটি নির্ধারিত, যাতে সম্পূর্ণ বরাদ্দকৃত সময় ধরে চলার অনুমতিপ্রাপ্ত কোনো মডেলকে উত্তরের মাঝপথে বন্ধ করা না হয়। নিষ্ক্রিয় করতে `0` সেট করুন। | -| `OMNIROUTE_SSE_COMMENTS` | _(নিষ্ক্রিয়)_ | OmniRoute SSE `:` মন্তব্যের লাইন (যেমন `: keepalive` হার্টবিট এবং `x-omniroute-*` মেটাডেটা ট্রেলার) নির্গত করতে পারবে কি না। ডিফল্টভাবে নিষ্ক্রিয় (#10524), কারণ কঠোর OpenAI-সামঞ্জস্যপূর্ণ ক্লায়েন্টগুলো প্রতিটি SSE লাইনে JSON.parse প্রয়োগ করে এবং `:` মন্তব্যে ক্র্যাশ করে; `data:` হার্টবিট এতে প্রভাবিত হয় না। পুনরায় সক্রিয় করতে `on`/`true`/`1`/`yes` সেট করুন। `open-sse/utils/sseHeartbeat.ts` দ্বারা ব্যবহৃত। | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | প্রথম নন-পিং SSE ইভেন্ট পাওয়ার সময়সীমা। `REQUEST_TIMEOUT_MS` সেট করা থাকলে সেটির মান উত্তরাধিকারসূত্রে পায়। | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | বড়, টুল-নির্ভর বা উচ্চ-রিজনিং স্ট্রিমিং অনুরোধের জন্য সর্বোচ্চ অভিযোজিত প্রথম-ইভেন্ট প্রস্তুতি উইন্ডো। | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` হিউরিস্টিকের জন্য কিল-সুইচ। শনাক্তকরণ সম্পূর্ণরূপে নিষ্ক্রিয় করতে `false`/`0`/`off` সেট করুন — অনুরোধের বডি/হেডার দ্বারা প্রস্তুতি টাইমআউট এবং স্ট্রিম পুনরুদ্ধার কখনো বাড়ানো হবে না, ফলে ক্লায়েন্ট-নিয়ন্ত্রিত টাইমআউট বৃদ্ধির ঝুঁকি কমে। | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | শনাক্ত করা `/goal` এজেন্ট রান বা `x-omniroute-agent-goal` দিয়ে বাধ্যতামূলক করা অনুরোধের জন্য সর্বোচ্চ প্রথম-ইভেন্ট প্রস্তুতি উইন্ডো। | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | শনাক্ত করা `/goal` এজেন্ট রানের জন্য স্বয়ংক্রিয়ভাবে প্রাথমিক স্ট্রিম পুনরুদ্ধার সক্রিয় করুন। লক্ষ্য-নির্দিষ্ট অপ্ট-ইন নিষ্ক্রিয় করতে `false`/`0`/`off` সেট করুন। এটি কেবল অপারেটরের ডিফল্টের ওপর পুনরুদ্ধার যোগ করতে পারে — এটি কখনো স্পষ্ট `STREAM_RECOVERY_ENABLED`/DB সেটিংসের অপ্ট-আউট ওভাররাইড করে না। | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | যেসব অ-মানক `codex.*` SSE ইভেন্ট (যেমন `codex.rate_limits`) OpenAI SDK-এর `responses.stream()`-কে 502 ত্রুটিসহ ব্যর্থ করে, সেগুলো বাদ দিন। ডিফল্টভাবে চালু (#11014)। সেগুলো ফরওয়ার্ড করতে `0`/`false`/`no`/`off` সেট করুন। | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(সেট করা নেই)_ | অপ্ট-ইন Codex app-server ট্রান্সপোর্ট। স্থানীয় `codex app-server` সাইডকারের WebSocket এন্ডপয়েন্ট (`ws://`/`wss://`)। এটি একটি টোকেনের সঙ্গে সেট করা হলে Codex অনুরোধগুলো HTTP Responses API-এর পরিবর্তে JSON-RPC-এর মাধ্যমে সাইডকারে রাউট করা হয়। প্রতি সংযোগের জন্য `providerSpecificData.codexAppServerUrl` দিয়েও সেট করা যায়। `open-sse/executors/codex/appServerConfig.ts` দ্বারা ব্যবহৃত। | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(সেট করা নেই)_ | app-server-এর কাছে উপস্থাপিত ইনলাইন ক্যাপাবিলিটি/বেয়ারার টোকেন। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerToken`। | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(সেট করা নেই)_ | app-server ক্যাপাবিলিটি টোকেন ধারণকারী ফাইলের পাথ (`codex app-server --ws-token-file` থেকে)। `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` সেট করা না থাকলে ব্যবহৃত হয়। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerTokenFile`। | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | যে কার্যকরী ডিরেক্টরিতে app-server টার্নটি চলে। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerCwd`। | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(সেট করা নেই)_ | app-server টার্নে পাঠানো অনুমোদন নীতি (যেমন `never`, `on-request`)। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerApprovalPolicy`। | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(সেট করা নেই)_ | app-server টার্নে পাঠানো স্যান্ডবক্স নীতি (যেমন `read-only`, `workspace-write`, `danger-full-access`)। সেট করা না থাকলে এক্সিকিউটর ডিফল্ট হিসেবে `workspace-write` ব্যবহার করে (আরও সুরক্ষিত; আগে `danger-full-access` ছিল)। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerSandbox`। | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-server-এর নিজস্ব অনুমোদন প্রম্পটগুলো (হোস্টে কমান্ড/ফাইল/অনুমতি কার্যকর করা) স্বয়ংক্রিয়ভাবে অনুমোদন করুন। ডিফল্টভাবে বন্ধ — প্রম্পটগুলো স্বয়ংক্রিয়ভাবে প্রত্যাখ্যাত হয়; হারনেস টুল কলগুলো প্রভাবিত হয় না (সেগুলো পৃথক `item/tool/call` পাসথ্রুর মাধ্যমে যায়)। `true`/`1`/`yes` গ্রহণ করে। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerAutoApprove`। | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | রেসপন্স হেডার পাওয়ার সময়সীমা। | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | প্রতিটি সরাসরি নো-প্রক্সি প্রচেষ্টায় প্রতিক্রিয়া শুরু হওয়ার জন্য অপেক্ষার সর্বোচ্চ সময় (ms)। টাইমআউট হলে একটি নতুন সকেটে একবার পুনরায় চেষ্টা করা হয়; সীমাটি নিষ্ক্রিয় করে আগের আচরণ বজায় রাখতে `0` সেট করুন। | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | সম্পূর্ণ প্রতিক্রিয়া বডি পাওয়ার সময়সীমা। | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP সংযোগ স্থাপনের টাইমআউট। | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive সকেটের নিষ্ক্রিয়তার টাইমআউট। | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS ফিঙ্গারপ্রিন্ট প্রক্সির (wreq-js) টাইমআউট। | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | বিশেষভাবে wreq-js TLS-ফিঙ্গারপ্রিন্ট ট্রান্সপোর্টের বডির প্রথম বাইট পাওয়ার সময় সীমাবদ্ধ করে; শুধু `TLS_CLIENT_TIMEOUT_MS` স্থবির বডি শনাক্ত করতে পারে না, কারণ হেডার আসামাত্র এটি সমাধান হয়ে যায় (#12656)। টাইমআউট হলে wreq রিডার বাতিল করা হয় এবং সরাসরি/প্রক্সি ডিসপ্যাচারে ফিরে যাওয়া হয়; `0` ওয়াচডগ নিষ্ক্রিয় করে। | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | শুধু OpenCode এক্সিকিউটরের জন্য এবং কেবল `OPENCODE_RESPONSES_STALL_ROTATION` ফিচার ফ্ল্যাগ চালু থাকলে (ডিফল্টভাবে বন্ধ): হেডার আসার পর স্ট্রিম করা Responses উত্তরের বডির প্রথম বাইটের জন্য অপেক্ষার সময় সীমাবদ্ধ করে (#13484)। একটি Responses স্ট্রিম `response.created` দিয়ে শুরু হয়, তাই এই সময়সীমার পরও কোনো ডেটা না এলে সেটি স্থবিরতা হিসেবে গণ্য হয়: অ্যাকাউন্টটিকে কুলডাউন করা হয় এবং অনুরোধটি একবার পরবর্তী অ্যাকাউন্টে ঘোরানো হয়; দ্বিতীয়বার স্থবির হলে দ্রুত ব্যর্থ হয়। ফ্ল্যাগ চালু থাকলেও `0` সুরক্ষাটি নিষ্ক্রিয় করে। | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` ব্রিজ অনুরোধের জন্য প্রক্সি হপ টাইমআউট। | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl ওয়েব-ফেচ এক্সিকিউটরকে একটি স্ব-হোস্ট করা ইনস্ট্যান্সে নির্দেশ করুন (ক্লাউডের বাইরে API কী ঐচ্ছিক)। | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl ওয়েব-ফেচ এক্সিকিউটরের প্রতিটি অনুরোধের টাইমআউট। | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | ব্রিজের জন্য সার্বিক সার্ভার অনুরোধের টাইমআউট। | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | ব্রিজের মাধ্যমে প্রতিক্রিয়া হেডার পাঠানোর সময়সীমা। | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | ব্রিজের keep-alive নিষ্ক্রিয়তার টাইমআউট। | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | কাঁচা সকেটের টাইমআউট (0 = নিষ্ক্রিয়)। | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | জোরপূর্বক প্রস্থান করার আগে SIGTERM/SIGINT-এর পর অবকাশকাল। | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` সেট করা না থাকলে `src/shared/utils/fetchTimeout.ts` দ্বারা ব্যবহৃত ফলব্যাক। | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts`-এ `validationRead` এবং `modelsProbe` প্রিসেটগুলোর টাইমআউট (ms)। ড্যাশবোর্ডে সক্রিয়/ত্রুটি অবস্থার মধ্যে বারবার ওঠানামা ঠেকাতে ধীর এন্ডপয়েন্টের (Cerebras, Cloudflare AI, Groq) জন্য এটি বাড়ান। অবৈধ (<1000) বা অ-সাংখ্যিক মানের ক্ষেত্রে 8000ms-এ ফিরে যায়। | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts`-এ রিলে-নির্দিষ্ট ফেচ টাইমআউট (#9158)। আটকে থাকা রিলেকে ক্লায়েন্ট/এজেন্ট টাইমআউটের (~30s) আগেই ব্যর্থ হতে হবে, যাতে কলকারীরা সাধারণ আপস্ট্রিম টাইমআউটের পরিবর্তে রিলে-নির্দিষ্ট ব্যর্থতা দেখতে পান। এটি সর্বদা আগে কার্যকর হওয়া নিশ্চিত করতে সর্বোচ্চ `29000`-এ সীমাবদ্ধ। | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts`-এ সরাসরি/রিলে/প্রক্সির একবার-পুনঃচেষ্টা পাথগুলোর জন্য শেয়ার করা পুনঃচেষ্টা ব্যাকঅফ (#9158)। `0` = অবিলম্বে পুনরায় চেষ্টা। | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`claudeTlsClient.ts`)। | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা চূড়ান্ত JS হার্ড-ডেডলাইনের অতিরিক্ত সময়। | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`perplexityTlsClient.ts`)। | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা চূড়ান্ত JS হার্ড-ডেডলাইনের অতিরিক্ত সময়। | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (বন্ধ) | কলকারীর সিস্টেম বার্তায় "আপনার বিল্ট-ইন ওয়েব সার্চ রয়েছে। সার্চের ফলাফল ব্যবহার করে সরাসরি প্রশ্নের উত্তর দিন।" যোগ করে (`perplexity-web/protocol.ts`)। ডিফল্টভাবে বন্ধ — Perplexity এমনিতেই সার্চ করে, এবং বাক্যটি কোডিং ক্লায়েন্টের উত্তরে মেটা-মন্তব্য হিসেবে প্রকাশিত হয়ে যায়। পুনরুদ্ধার করতে `1`/`true`/`yes`/`on` সেট করুন। | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`grokTlsClient.ts`)। | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা পরম JS হার্ড-ডেডলাইনের অতিরিক্ত সময়। | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`notionTlsClient.ts`); দীর্ঘ জেনারেশনের জন্য `notion-web` প্রতি অনুরোধে এটিকে বাড়িয়ে `180000` করে। | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা পরম JS হার্ড-ডেডলাইনের অতিরিক্ত সময়। | -| `OMNIROUTE_BROWSER_POOL` | `on` | ব্রাউজার-সমর্থিত ওয়েব-কুকি চ্যাটের জন্য শেয়ার করা Playwright ব্রাউজার পুল (`browserPool.ts`); নিষ্ক্রিয় করতে `off` সেট করুন। | -| `OBSCURA_BIN` | `auto-detect` | ব্রাউজার পুল ও Cloudflare Playground এক্সিকিউটরের প্রাথমিক ইঞ্জিন হিসেবে ব্যবহৃত `obscura` বাইনারির পাথ (`open-sse/services/obscura.ts`); সেট করা না থাকলে সিস্টেম PATH থেকে স্বয়ংক্রিয়ভাবে শনাক্ত করা হয়। | -| `OBSCURA_CDP_ENDPOINT` | _(সেট করা নেই)_ | নতুন একটি চালু করার বদলে ইতিমধ্যে চলমান Obscura-কে (`http://host:port`) নির্দেশ করুন; মডিউলটি ওই প্রক্রিয়াটির মালিক নয় (`open-sse/services/obscura.ts`)। | -| `OBSCURA_PORT` | `random free port` | চালু করা `obscura serve`-এর জন্য নির্দিষ্ট পোর্ট; সেট করা না থাকলে একটি খালি পোর্ট স্বয়ংক্রিয়ভাবে বেছে নেওয়া হয় (`open-sse/services/obscura.ts`)। | -| `WEB_COOKIE_USE_BROWSER` | `0` | একটি ওয়েব-কুকি চ্যাট অনুরোধকে ব্রাউজার-সমর্থিত পাথ ব্যবহারের জন্য নির্বাচন করুন (`browserBackedChat.ts`); সক্রিয় করতে `1`। | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (আন্তর্জাতিক kimi.ai Connect-RPC) এক্সিকিউটরের বেস URL (`kimi-web.ts`); শুধু মিরর/প্রক্সি এন্ডপয়েন্টের জন্য ওভাররাইড করুন। | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web এক্সিকিউটরের সম্পূর্ণ চ্যাট এন্ডপয়েন্ট (`kimi-web.ts`)। | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | Adobe Firefly ইন্টার্যাক্টিভ ব্রাউজার সাইন-ইনের জন্য সিস্টেম Chrome/Edge এক্সিকিউটেবলের পাথ (`adobeFireflyBrowserLogin.ts`); প্রতি-OS স্বয়ংক্রিয় শনাক্তকরণকে ওভাররাইড করে। | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ স্ট্যান্ডঅ্যালোন আউটপুট_ | পোস্ট-বিল্ড কোলোকেশন ধাপে ব্যবহৃত স্ট্যান্ডঅ্যালোন আউটপুট ডিরেক্টরির জন্য বিল্ড-টাইম ওভাররাইড (`scripts/build/colocate-standalone.mjs`); এটি বিল্ড টুলিংয়ের জন্য, রানটাইমের জন্য নয়। | +| ভেরিয়েবল | ডিফল্ট | বিবরণ | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(সেট করা নেই)_ | গ্লোবাল শর্টকাট — `FETCH_TIMEOUT_MS` এবং `STREAM_IDLE_TIMEOUT_MS` উভয়ের ডিফল্ট মান ওভাররাইড করে। | +| `FETCH_TIMEOUT_MS` | `600000` | আপস্ট্রিম প্রদানকারীর কলে মোট HTTP অনুরোধের টাইমআউট। | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | বাতিল করার আগে কাঁচা আপস্ট্রিম বাইটগুলোর মধ্যবর্তী নীরবতার সর্বোচ্চ সময়। এক্সটেন্ডেড-থিঙ্কিং মডেলগুলো খুব কমই >90s বিরতি দেয়। | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | সক্রিয় SSE স্ট্রিমের সর্বোচ্চ মোট আয়ুষ্কাল; আপস্ট্রিম বাইট এলে এটি কখনো রিসেট হয় না এবং `REQUEST_TIMEOUT_MS` থেকে স্বাধীন। রেজিস্ট্রির মডেলভিত্তিক বৃহত্তম `timeoutMs` (1200000, Codex)-এর সঙ্গে 60000 মার্জিন যোগ করে এটি নির্ধারিত, ফলে কোনো মডেলকে তার সম্পূর্ণ বাজেট পর্যন্ত চলতে দেওয়া হলে উত্তরের মাঝপথে সেটি বন্ধ হয় না। নিষ্ক্রিয় করতে `0` সেট করুন। | +| `OMNIROUTE_SSE_COMMENTS` | _(নিষ্ক্রিয়)_ | OmniRoute SSE `:` মন্তব্যের লাইন (যেমন `: keepalive` হার্টবিট এবং `x-omniroute-*` মেটাডেটা ট্রেলার) নির্গত করতে পারবে কি না। ডিফল্টভাবে নিষ্ক্রিয় (#10524), কারণ কঠোর OpenAI-সামঞ্জস্যপূর্ণ ক্লায়েন্টগুলো প্রতিটি SSE লাইনে JSON.parse চালায় এবং `:` মন্তব্যে ক্র্যাশ করে; `data:` হার্টবিট এতে প্রভাবিত হয় না। পুনরায় সক্রিয় করতে `on`/`true`/`1`/`yes` সেট করুন। `open-sse/utils/sseHeartbeat.ts` এটি ব্যবহার করে। | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | প্রথম নন-পিং SSE ইভেন্ট পাওয়ার সময়সীমা। সেট করা থাকলে `REQUEST_TIMEOUT_MS` থেকে মান উত্তরাধিকারসূত্রে পায়। | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | বড়, টুল-নির্ভর বা উচ্চ-রিজনিং স্ট্রিমিং অনুরোধের জন্য অভিযোজিত প্রথম-ইভেন্ট প্রস্তুতি উইন্ডোর সর্বোচ্চ সীমা। | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` হিউরিস্টিকের কিল-সুইচ। শনাক্তকরণ সম্পূর্ণ নিষ্ক্রিয় করতে `false`/`0`/`off` সেট করুন — অনুরোধের বডি/হেডারের কারণে প্রস্তুতি টাইমআউট ও স্ট্রিম পুনরুদ্ধার কখনো বাড়ানো হয় না, যা ক্লায়েন্ট-নিয়ন্ত্রিত টাইমআউট বৃদ্ধির ঝুঁকি কমায়। | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | শনাক্ত করা `/goal` এজেন্ট রান অথবা `x-omniroute-agent-goal` দিয়ে বাধ্যতামূলক করা অনুরোধের জন্য প্রথম-ইভেন্ট প্রস্তুতি উইন্ডোর সর্বোচ্চ সীমা। | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | শনাক্ত করা `/goal` এজেন্ট রানের জন্য স্বয়ংক্রিয়ভাবে আগাম স্ট্রিম পুনরুদ্ধার সক্রিয় করে। লক্ষ্য-নির্দিষ্ট অপ্ট-ইন নিষ্ক্রিয় করতে `false`/`0`/`off` সেট করুন। এটি অপারেটরের ডিফল্টের ওপর কেবল পুনরুদ্ধার যোগ করতে পারে — স্পষ্ট `STREAM_RECOVERY_ENABLED`/DB সেটিংসের অপ্ট-আউট কখনো ওভাররাইড করে না। | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | যেসব অ-মানক `codex.*` SSE ইভেন্ট (যেমন `codex.rate_limits`) 502 সহ OpenAI SDK-এর `responses.stream()` নষ্ট করে, সেগুলো বাদ দেয়। ডিফল্টভাবে চালু (#11014)। সেগুলো ফরওয়ার্ড করতে `0`/`false`/`no`/`off` সেট করুন। | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(সেট করা নেই)_ | অপ্ট-ইন Codex app-server ট্রান্সপোর্ট। স্থানীয় `codex app-server` সাইডকারের WebSocket এন্ডপয়েন্ট (`ws://`/`wss://`)। একটি টোকেনের সঙ্গে এটি সেট করা হলে Codex অনুরোধগুলো HTTP Responses API-এর পরিবর্তে JSON-RPC-এর মাধ্যমে সাইডকারে রাউট করা হয়। `providerSpecificData.codexAppServerUrl` ব্যবহার করে প্রতি সংযোগের জন্যও সেট করা যায়। `open-sse/executors/codex/appServerConfig.ts` এটি ব্যবহার করে। | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(সেট করা নেই)_ | app-server-এ উপস্থাপিত ইনলাইন সক্ষমতা/বেয়ারার টোকেন। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerToken`। | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(সেট করা নেই)_ | app-server সক্ষমতা টোকেন ধারণকারী ফাইলের পাথ (`codex app-server --ws-token-file` থেকে)। `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` সেট করা না থাকলে ব্যবহৃত হয়। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerTokenFile`। | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | app-server টার্ন যে কার্যকরী ডিরেক্টরিতে চলে। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerCwd`। | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(সেট করা নেই)_ | app-server টার্নে পাঠানো অনুমোদন নীতি (যেমন `never`, `on-request`)। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerApprovalPolicy`। | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(সেট করা নেই)_ | app-server টার্নে পাঠানো স্যান্ডবক্স নীতি (যেমন `read-only`, `workspace-write`, `danger-full-access`)। সেট করা না থাকলে এক্সিকিউটর ডিফল্টভাবে `workspace-write` ব্যবহার করে (কঠোর করা হয়েছে; আগে `danger-full-access` ছিল)। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerSandbox`। | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-server-এর নিজস্ব অনুমোদন প্রম্পটগুলো (হোস্টে কমান্ড/ফাইল/অনুমতি কার্যকর করা) স্বয়ংক্রিয়ভাবে অনুমোদন করে। ডিফল্টভাবে বন্ধ — প্রম্পটগুলো স্বয়ংক্রিয়ভাবে প্রত্যাখ্যাত হয়; হার্নেস টুল কল এতে প্রভাবিত হয় না (সেগুলো পৃথক `item/tool/call` পাসথ্রুর মাধ্যমে যায়)। `true`/`1`/`yes` গ্রহণ করে। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerAutoApprove`। | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | প্রতিক্রিয়ার হেডার পাওয়ার সময়সীমা। | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | প্রতিটি সরাসরি, প্রক্সিবিহীন প্রচেষ্টার জন্য প্রতিক্রিয়া শুরু হওয়া পর্যন্ত অপেক্ষার সর্বোচ্চ সময় (ms)। টাইমআউট হলে একটি নতুন সকেটে একবার পুনরায় চেষ্টা করা হয়; সীমাটি নিষ্ক্রিয় করে আগের আচরণ বজায় রাখতে `0` সেট করুন। | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | উপরের পুলড-প্রচেষ্টার প্রতিক্রিয়া-শুরুর টাইমআউটের পরে নতুন সকেটের RETRY প্রচেষ্টার সর্বোচ্চ সীমা (ms) (#13703)। এটি কেবল তখনই প্রযোজ্য, যখন কলকারী ইতিমধ্যে নিজস্ব সময়সীমা সংকেত সংযুক্ত করেছে (সমাধানকৃত connection/model/provider/`FETCH_TIMEOUT_MS` ক্যাসকেড); সেই সংকেতটিই প্রকৃত সীমা এবং উদ্দিষ্ট পথে প্রথমে সক্রিয় হয়, তাই এটি একটি নির্দিষ্ট সর্বোচ্চ সীমার পরিবর্তে উদার ব্যাকস্টপ — এটি ছাড়া পুনঃপ্রচেষ্টা পুলড প্রচেষ্টার মতো একই স্বল্প `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` উইন্ডো পুনরায় ব্যবহার করত এবং সুস্থ কিন্তু ধীর-TTFB reasoning মডেলগুলোতে 504 ত্রুটি ঘটাত। উপরের নির্দিষ্ট নিম্নসীমার চেয়ে কম কখনোই অনুমোদিত নয়; কলকারী কোনো সময়সীমা সংকেতই না দিলে, পুনঃপ্রচেষ্টায় নির্দিষ্ট নিম্নসীমা অপরিবর্তিত থাকে। | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | সম্পূর্ণ প্রতিক্রিয়া বডি গ্রহণের সময়সীমা। | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP সংযোগ স্থাপনের টাইমআউট। | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive সকেটের নিষ্ক্রিয়তার টাইমআউট। | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS fingerprint প্রক্সির (wreq-js) টাইমআউট। | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | বিশেষভাবে wreq-js TLS-fingerprint পরিবহনের বডিতে প্রথম বাইট পৌঁছানোর সময় সীমাবদ্ধ করে; শুধু `TLS_CLIENT_TIMEOUT_MS` স্থবির বডি শনাক্ত করতে পারে না, কারণ হেডার আসার সঙ্গে সঙ্গেই এটি সমাধান হয়ে যায় (#12656)। টাইমআউট হলে wreq রিডার বাতিল করা হয় এবং direct/proxy dispatcher-এ ফলব্যাক করা হয়; `0` watchdog নিষ্ক্রিয় করে। | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | শুধু OpenCode executor-এর জন্য এবং কেবল `OPENCODE_RESPONSES_STALL_ROTATION` feature flag চালু থাকলে (ডিফল্টভাবে বন্ধ): হেডার আসার পর স্ট্রিম করা Responses উত্তরের প্রথম বডি বাইটের জন্য অপেক্ষা সীমাবদ্ধ করে (#13484)। একটি Responses স্ট্রিম `response.created` দিয়ে শুরু হয়, তাই এই উইন্ডোর পরও নীরবতা থাকলে সেটি stall হিসেবে গণ্য হয়: অ্যাকাউন্টটিকে cooldown-এ রাখা হয় এবং অনুরোধটি একবার পরবর্তী অ্যাকাউন্টে ঘোরানো হয়; দ্বিতীয়বার stall হলে দ্রুত ব্যর্থ হয়। flag চালু থাকলেও `0` guard নিষ্ক্রিয় করে। | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` bridge অনুরোধের জন্য proxy hop টাইমআউট। | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl web-fetch executor-কে একটি self-hosted instance-এর দিকে নির্দেশ করুন (off-cloud-এ API key ঐচ্ছিক)। | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl web-fetch executor-এর প্রতি-অনুরোধ টাইমআউট। | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | bridge-এর সার্বিক server request টাইমআউট। | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | bridge-এর মাধ্যমে response header পাঠানোর সময়সীমা। | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Bridge keep-alive নিষ্ক্রিয়তার টাইমআউট। | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Raw socket টাইমআউট (0 = নিষ্ক্রিয়)। | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | জোরপূর্বক প্রস্থান করার আগে SIGTERM/SIGINT-এর ক্ষেত্রে অবকাশকাল। | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` সেট না থাকলে `src/shared/utils/fetchTimeout.ts` দ্বারা ব্যবহৃত ফলব্যাক। | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts`-এর `validationRead` এবং `modelsProbe` preset-এর টাইমআউট (ms)। ধীর endpoint-গুলোর (Cerebras, Cloudflare AI, Groq) জন্য এটি বাড়ান, যাতে dashboard-এ active/error-এর মধ্যে বারবার পরিবর্তন না হয়। অবৈধ (<1000) বা অ-সাংখ্যিক মানের ক্ষেত্রে 8000ms-এ ফলব্যাক করে। | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts`-এ relay-নির্দিষ্ট fetch টাইমআউট (#9158)। আটকে থাকা relay-কে client/agent টাইমআউটের (~30s) আগেই ব্যর্থ হতে হবে, যাতে কলকারীরা সাধারণ upstream টাইমআউটের পরিবর্তে relay-নির্দিষ্ট ব্যর্থতা দেখতে পান। এটি সর্বদা আগে সক্রিয় হওয়া নিশ্চিত করতে সর্বোচ্চ `29000`-এ সীমাবদ্ধ। | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts`-এর direct/relay/proxy একবার-পুনঃপ্রচেষ্টা পথগুলোর জন্য অভিন্ন retry backoff (#9158)। `0` = অবিলম্বে পুনরায় চেষ্টা। | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`claudeTlsClient.ts`)। | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা চূড়ান্ত JS হার্ড-ডেডলাইন গ্রেস সময়। | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`perplexityTlsClient.ts`)। | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা চূড়ান্ত JS হার্ড-ডেডলাইন গ্রেস সময়। | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (বন্ধ) | কলকারীর সিস্টেম বার্তায় "আপনার বিল্ট-ইন ওয়েব সার্চ রয়েছে। সার্চ ফলাফল ব্যবহার করে সরাসরি প্রশ্নের উত্তর দিন।" যোগ করে (`perplexity-web/protocol.ts`)। ডিফল্টভাবে বন্ধ — Perplexity যেকোনোভাবেই সার্চ করে, এবং বাক্যটি কোডিং ক্লায়েন্টের উত্তরে মেটা-মন্তব্য হিসেবে প্রকাশ হয়ে যায়। পুনরুদ্ধার করতে `1`/`true`/`yes`/`on` সেট করুন। | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`grokTlsClient.ts`)। | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা চূড়ান্ত JS হার্ড-ডেডলাইন গ্রেস সময়। | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | নেটিভ wreq-js অনুরোধের টাইমআউট (`notionTlsClient.ts`); দীর্ঘ জেনারেশনের জন্য `notion-web` প্রতিটি অনুরোধে এটি বাড়িয়ে `180000` করে। | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | নেটিভ টাইমআউটের সঙ্গে যোগ করা চূড়ান্ত JS হার্ড-ডেডলাইন গ্রেস সময়। | +| `OMNIROUTE_BROWSER_POOL` | `on` | ব্রাউজার-সমর্থিত ওয়েব-কুকি চ্যাটের জন্য শেয়ার করা Playwright ব্রাউজার পুল (`browserPool.ts`); নিষ্ক্রিয় করতে `off` সেট করুন। | +| `OBSCURA_BIN` | `auto-detect` | ব্রাউজার পুল ও Cloudflare Playground এক্সিকিউটর প্রাথমিক ইঞ্জিন হিসেবে যে `obscura` বাইনারি ব্যবহার করে, তার পাথ (`open-sse/services/obscura.ts`); সেট না করা থাকলে সিস্টেম PATH থেকে স্বয়ংক্রিয়ভাবে শনাক্ত করা হয়। | +| `OBSCURA_CDP_ENDPOINT` | _(সেট করা নেই)_ | নতুন প্রসেস চালু করার পরিবর্তে ইতিমধ্যে চলমান Obscura-কে (`http://host:port`) নির্দেশ করুন; মডিউলটি ওই প্রসেসের মালিক নয় (`open-sse/services/obscura.ts`)। | +| `OBSCURA_PORT` | `random free port` | চালু করা `obscura serve`-এর জন্য নির্দিষ্ট পোর্ট; সেট না করা থাকলে একটি খালি পোর্ট স্বয়ংক্রিয়ভাবে বেছে নেওয়া হয় (`open-sse/services/obscura.ts`)। | +| `WEB_COOKIE_USE_BROWSER` | `0` | একটি ওয়েব-কুকি চ্যাট অনুরোধকে ব্রাউজার-সমর্থিত পাথ ব্যবহারের জন্য নির্বাচন করুন (`browserBackedChat.ts`); সক্রিয় করতে `1`। | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (আন্তর্জাতিক kimi.ai Connect-RPC) এক্সিকিউটরের বেস URL (`kimi-web.ts`); শুধুমাত্র মিরর/প্রক্সি এন্ডপয়েন্টের জন্য ওভাররাইড করুন। | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web এক্সিকিউটরের সম্পূর্ণ চ্যাট এন্ডপয়েন্ট (`kimi-web.ts`)। | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | Adobe Firefly ইন্টার্যাক্টিভ ব্রাউজার সাইন-ইনের জন্য সিস্টেমের Chrome/Edge এক্সিকিউটেবলের পাথ (`adobeFireflyBrowserLogin.ts`); প্রতি-OS স্বয়ংক্রিয় শনাক্তকরণকে ওভাররাইড করে। | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ স্বতন্ত্র আউটপুট_ | বিল্ড-পরবর্তী কোলোকেশন ধাপে ব্যবহৃত স্বতন্ত্র আউটপুট ডিরেক্টরির জন্য বিল্ড-টাইম ওভাররাইড (`scripts/build/colocate-standalone.mjs`); এটি বিল্ড টুলিংয়ের জন্য, রানটাইমের জন্য নয়। | কম্বো টার্গেটের প্রচেষ্টাগুলো নির্ধারিত আপস্ট্রিম অনুরোধের টাইমআউট (`FETCH_TIMEOUT_MS`, অথবা -যখন এটি fetch-এর ডিফল্ট সরবরাহ করে তখন `REQUEST_TIMEOUT_MS`) উত্তরাধিকারসূত্রে পায়। কম্বো ফলব্যাক দ্রুততর করতে শুধু একটি কম্বো, -কম্বোর ডিফল্ট, অথবা প্রোভাইডার ওভাররাইডে `targetTimeoutMs` সেট করুন; বর্তমান আপস্ট্রিম -টাইমআউটের চেয়ে বেশি মান আপস্ট্রিম টাইমআউটেই সীমাবদ্ধ করা হয়। +`REQUEST_TIMEOUT_MS` যখন এটি fetch-এর ডিফল্ট সরবরাহ করে) উত্তরাধিকারসূত্রে পায়। কম্বো ফলব্যাককে +দ্রুততর করার প্রয়োজন হলেই কেবল একটি কম্বো, কম্বোর ডিফল্ট বা প্রোভাইডার ওভাররাইডে `targetTimeoutMs` +সেট করুন; বর্তমান আপস্ট্রিম টাইমআউটের চেয়ে বেশি মান আপস্ট্রিম টাইমআউটে সীমাবদ্ধ করা হয়। -`comboTimeoutMs` হলো ফেইলওভার টার্গেটগুলো জুড়ে সম্পূর্ণ কম্বোর জন্য আলাদা একটি ওয়াল-ক্লক সময়সীমা। -সীমাহীন পুনরাবৃত্তি বজায় রাখতে এটিকে সেট না করে রাখুন অথবা `0` রাখুন (১০ মিনিটের +`comboTimeoutMs` হলো ফেইলওভার টার্গেটজুড়ে সম্পূর্ণ কম্বোর জন্য পৃথক ওয়াল-ক্লক সময়সীমা। +সীমাহীন পুনরাবৃত্তি বজায় রাখতে এটি সেট না করে রাখুন বা `0` সেট করুন (১০ মিনিটের `COMBO_LOOP_SAFETY_TIMEOUT_MS` হ্যাং-স্টপ তখনও প্রযোজ্য)। একটি ধনাত্মক মান কম্বোর জন্য ওই -নিরাপত্তা সীমাটি প্রতিস্থাপন করে। `comboTimeoutMs`-কে `targetTimeoutMs`-এর চেয়ে দীর্ঘ রাখুন, যাতে ধীরগতির -প্রথম টার্গেটের পরেও ফেইলওভারের জন্য সময় থাকে। +সুরক্ষা সীমাটি প্রতিস্থাপন করে। `comboTimeoutMs`-কে `targetTimeoutMs`-এর চেয়ে দীর্ঘ রাখুন, যাতে +ধীরগতির প্রথম টার্গেটের পরেও ফেইলওভারের জন্য সময় থাকে। -### সার্কিট ব্রেকারের থ্রেশহোল্ড +### সার্কিট ব্রেকার থ্রেশহোল্ড প্রোভাইডার-স্তরের সার্কিট ব্রেকার টিউনিং। ডিফল্টগুলো v3.6 থেকে 500+ সংযোগের জন্য ব্যবহৃত স্কেল করা মান প্রতিফলিত করে। -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ------------------------------------------------------------- | --------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ব্রেকার ট্রিপ করার আগে OAuth প্রদানকারীদের ধারাবাহিক ব্যর্থতার সীমা। | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth প্রদানকারী ব্রেকারের রিসেট উইন্ডো (ms)। | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-key প্রদানকারীদের ধারাবাহিক ব্যর্থতার সীমা। | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-key প্রদানকারী ব্রেকারের রিসেট উইন্ডো (ms)। | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | লোকাল প্রদানকারীদের (Ollama, LM Studio, ...) ধারাবাহিক ব্যর্থতার সীমা। | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | লোকাল প্রদানকারী ব্রেকারের রিসেট উইন্ডো (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: সম্পূর্ণ OAuth প্রদানকারী কুলডাউনে প্রবেশ করার আগে উইন্ডোর মধ্যে ব্যর্থতার সংখ্যা। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: OAuth প্রদানকারীদের জন্য রোলিং ব্যর্থতা-গণনা উইন্ডো (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: OAuth প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | এতগুলো ব্যর্থতায় OAuth প্রদানকারী DEGRADED অবস্থায় প্রবেশ করে। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth প্রদানকারীর সর্বোচ্চ resetTimeout বৃদ্ধির গুণক। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | এতগুলো ওপেন চক্রের পর OAuth প্রদানকারীর ব্যাকঅফ বৃদ্ধি পায়। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: সম্পূর্ণ API-key প্রদানকারী কুলডাউনে প্রবেশ করার আগে উইন্ডোর মধ্যে ব্যর্থতার সংখ্যা। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: API-key প্রদানকারীদের জন্য রোলিং ব্যর্থতা-গণনা উইন্ডো (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: API-key প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | এতগুলো ব্যর্থতায় API-key প্রদানকারী DEGRADED অবস্থায় প্রবেশ করে। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-key প্রদানকারীর সর্বোচ্চ resetTimeout বৃদ্ধির গুণক। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | এতগুলো ওপেন চক্রের পর API-key প্রদানকারীর ব্যাকঅফ বৃদ্ধি পায়। | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: সম্পূর্ণ লোকাল প্রদানকারী কুলডাউনে প্রবেশ করার আগে ব্যর্থতার সংখ্যা। | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: লোকাল প্রদানকারীদের জন্য রোলিং ব্যর্থতা-গণনা উইন্ডো (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: লোকাল প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | যে ব্যাকঅফ গভীরতায় একটি context-cache পিনের প্রদানকারীকে স্থায়ীভাবে অস্বাস্থ্যকর বলে গণ্য করা হয় এবং ফেইলওভারের জন্য পিনটি সরিয়ে দেওয়া হয়। | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | context-cache পিন সরানোর আগে স্বল্পস্থায়ী ক্ষণিকের কুলডাউন সহ্য করার অ্যান্টি-ফ্ল্যাপ উইন্ডো (ms)। | +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ------------------------------------------------------------- | --------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ব্রেকার ট্রিপ করার আগে OAuth প্রদানকারীদের জন্য ধারাবাহিক ব্যর্থতার সীমা। | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth প্রদানকারীর ব্রেকারের রিসেট উইন্ডো (ms)। | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-key প্রদানকারীদের জন্য ধারাবাহিক ব্যর্থতার সীমা। | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-key প্রদানকারীর ব্রেকারের রিসেট উইন্ডো (ms)। | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | স্থানীয় প্রদানকারীদের (Ollama, LM Studio, ...) জন্য ধারাবাহিক ব্যর্থতার সীমা। | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | স্থানীয় প্রদানকারীর ব্রেকারের রিসেট উইন্ডো (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: পুরো OAuth প্রদানকারী কুলডাউনে প্রবেশ করার আগে উইন্ডোর মধ্যে ব্যর্থতার সংখ্যা। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: OAuth প্রদানকারীদের জন্য চলমান ব্যর্থতা-গণনা উইন্ডো (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: OAuth প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | এতগুলো ব্যর্থতার পর OAuth প্রদানকারী DEGRADED অবস্থায় প্রবেশ করে। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth প্রদানকারীর সর্বোচ্চ resetTimeout বৃদ্ধির গুণক। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | এতগুলো ওপেন সাইকেলের পর OAuth প্রদানকারীর ব্যাকঅফ বৃদ্ধি পায়। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: পুরো API-key প্রদানকারী কুলডাউনে প্রবেশ করার আগে উইন্ডোর মধ্যে ব্যর্থতার সংখ্যা। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: API-key প্রদানকারীদের জন্য চলমান ব্যর্থতা-গণনা উইন্ডো (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: API-key প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | এতগুলো ব্যর্থতার পর API-key প্রদানকারী DEGRADED অবস্থায় প্রবেশ করে। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-key প্রদানকারীর সর্বোচ্চ resetTimeout বৃদ্ধির গুণক। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | এতগুলো ওপেন সাইকেলের পর API-key প্রদানকারীর ব্যাকঅফ বৃদ্ধি পায়। | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: পুরো স্থানীয় প্রদানকারী কুলডাউনে প্রবেশ করার আগে ব্যর্থতার সংখ্যা। | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: স্থানীয় প্রদানকারীদের জন্য চলমান ব্যর্থতা-গণনা উইন্ডো (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: স্থানীয় প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | যে ব্যাকঅফ গভীরতায় একটি context-cache পিনের প্রদানকারীকে স্থায়ীভাবে অস্বাস্থ্যকর বিবেচনা করা হয় এবং ফেইলওভারের জন্য পিনটি বাদ দেওয়া হয়। | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | context-cache পিন বাদ দেওয়ার আগে সংক্ষিপ্ত ক্ষণস্থায়ী কুলডাউন সহ্য করার অ্যান্টি-ফ্ল্যাপ উইন্ডো (ms)। | ### পরিস্থিতি @@ -1113,68 +1122,68 @@ Anthropic-সামঞ্জস্যপূর্ণ প্রোভাইডা --- -## ২১. প্রক্সির স্বাস্থ্য - -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | দ্রুত ব্যর্থতার স্বাস্থ্য পরীক্ষার টাইমআউট। | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | লেটেন্সি-অপ্টিমাইজড পুল কৌশলে প্রার্থী প্রক্সিগুলোর গড় লেটেন্সি গণনার সময়সীমা (ঘণ্টায়)। | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | স্বাস্থ্য পরীক্ষার ফলাফলের ক্যাশ TTL। | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | ব্যর্থ প্রক্সি স্বাস্থ্য প্রোবের ক্যাশ TTL। এটি `PROXY_HEALTH_CACHE_TTL_MS`-এর চেয়ে কম রাখুন, যাতে উচ্চ সমসাময়িকতার অধীনে সাময়িক প্রক্সি টাইমআউটগুলো দ্রুত পুনরায় চেষ্টা করতে পারে এবং সত্যিই অচল প্রক্সির জন্য দ্রুত ব্যর্থতা নিষ্ক্রিয় না হয়। | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | নিবন্ধিত প্রক্সিগুলোকে পর্যায়ক্রমে প্রোব করা ব্যাকগ্রাউন্ড প্রক্সি স্বাস্থ্য শিডিউলার নিষ্ক্রিয় করতে `false` সেট করুন। | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | ব্যাকগ্রাউন্ড স্বাস্থ্য-শিডিউলারের সুইপ ব্যবধান, ms-এ (সর্বনিম্ন `60000`)। | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | শিডিউলার এবং `/api/settings/proxies/auto-test` এন্ডপয়েন্ট দ্বারা ব্যবহৃত সংযোগযোগ্যতা প্রোবের লক্ষ্য। পাবলিক ডিফল্ট এড়াতে এটিকে একটি অভ্যন্তরীণ/স্ব-হোস্টেড URL-এ নির্দেশ করুন। | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | প্রতি ব্যাচে একসঙ্গে শুরু হওয়া প্রোবের সংখ্যা, যা শিডিউলার এবং `/api/settings/proxies/auto-test` এন্ডপয়েন্ট ভাগাভাগি করে। সর্বনিম্ন 1 এবং সর্বোচ্চ 50-এ সীমাবদ্ধ। | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | একটি ব্যাচের ভেতরে পরপর দুটি প্রোব পাঠানোর মধ্যবর্তী বিলম্ব, ms-এ। এটি না থাকলে পুরো ব্যাচ একই মুহূর্তে পাঠানো হয় এবং একটি শেয়ার করা বহির্গমন IP হার-সীমাবদ্ধ লক্ষ্যকে ট্রিগার করতে পারে। ব্যবধান নিষ্ক্রিয় করতে `0` সেট করুন; সর্বোচ্চ 5000। | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | প্রক্সির নির্ধারিত প্রোভাইডারের প্রকৃত হোস্ট (`GET /models`, কোনো API কী নয়) প্রোব করা বন্ধ করতে `"false"` সেট করুন এবং পরিবর্তে সর্বদা `PROXY_HEALTH_TEST_URL` ব্যবহার করুন। | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` (ডিফল্ট) হলে, স্বয়ংক্রিয় সংযোগযোগ্যতা প্রোবগুলো (শিডিউলার + `/api/settings/proxies/auto-test`-এর "সবগুলো পরীক্ষা করুন" বোতাম) **শুধু-পঠনযোগ্য** এবং কখনোই প্রক্সির স্ট্যাটাস লেখে না — শুধু অপারেটরই সক্রিয়/নিষ্ক্রিয় নির্ধারণ করেন, ফলে অনির্ভরযোগ্য কোনো প্রোব নির্ধারিত প্রক্সিকে আটকে দিতে পারে না (#6246)। পুরোনো পরীক্ষা-ও-সেট আচরণ পুনরুদ্ধার করতে `true` সেট করুন। | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | অপ্ট-ইন ফিচার ফ্ল্যাগ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) দেখুন; ড্যাশবোর্ড DB ওভাররাইড অগ্রাধিকার পায়)। `true` (অথবা `1`, `yes`) হলে ড্যাশবোর্ডে একটি প্রক্সি পুলের অধীনে শুধু-পঠনযোগ্য বহির্গমন পর্যবেক্ষণ দেখায় (পৃথক বহির্গমন IP, সংযোগ এবং গত 24 ঘণ্টায় একটি IP-এর পেছনে সর্বাধিক দেখা সংখ্যা, প্রক্সি লগ থেকে)। রাউটিংয়ের জন্য কখনো ব্যবহার করা হয় না। | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | বারবার ধারাবাহিক ব্যর্থতার পর শিডিউলারকে স্বয়ংক্রিয়ভাবে প্রক্সি অপসারণ করতে দিতে `true` সেট করুন। | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | শিডিউলার একটি প্রক্সি স্বয়ংক্রিয়ভাবে অপসারণ করার আগের ধারাবাহিক ব্যর্থতার সংখ্যা (`PROXY_AUTO_REMOVE=true` হলে)। | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | বারবার ধারাবাহিক ব্যর্থতার পর কোনো প্রক্সি অপসারণের পরিবর্তে শিডিউলারকে সেটি সফট-ডিজেবল (স্ট্যাটাস `dead`, কখনো মুছে ফেলা হয় না) করতে দিতে `true` সেট করুন। `PROXY_AUTO_REMOVE`-এর অ-ধ্বংসাত্মক বিকল্প: প্রক্সিটি অবিলম্বে পুল/রোটেশন রেজোলিউশন থেকে বাদ পড়ে (স্কোপ-পুল রেজোলিউশন দ্বারা ব্যবহৃত জীবিত-স্ট্যাটাস ফিল্টার ইতিমধ্যেই এটিকে বাদ দেয়) এবং আবার প্রোবে সফল হতে শুরু করলে স্বয়ংক্রিয়ভাবে পুনরায় সক্রিয় হয়। এটি `PROXY_AUTO_REMOVE_AFTER` থ্রেশহোল্ড ভাগ করে। উভয় ফ্ল্যাগ `true` হলে, `PROXY_AUTO_REMOVE` অগ্রাধিকার পায়। | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | প্রক্সি সংযোগযোগ্যতার প্রাক-পরীক্ষা ব্যর্থ হলে OAuth এবং প্রোভাইডার যাচাইকরণ প্রবাহকে পিন করা প্রক্সি এড়িয়ে সরাসরি সংযোগ করার অনুমতি দিন। কার্যকর অগ্রাধিকারের ক্রম হলো: ফিচার ফ্ল্যাগ DB ওভাররাইড > env var > ডিফল্ট। | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `open-sse/services/rateLimitManager.ts` | অনুরোধ ব্যর্থ করার আগে 429-এর ক্ষেত্রে অপেক্ষার সর্বোচ্চ সময়। | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 মিনিট) | `open-sse/services/rateLimitManager.ts` | একটি অনুমোদিত অনুরোধের রেট-লিমিট রিজার্ভেশন মেয়াদোত্তীর্ণ হওয়ার আগে সেটি কতক্ষণ এক্সিকিউশনে থাকতে পারে তার সর্বোচ্চ সীমা — কিউতে অপেক্ষার বাজেট থেকে পৃথক, যাতে নন-ইনক্রিমেন্টাল গেটওয়েতে ধীর fetch-start টাইম আউট না হয় (#12027)। | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (নিষ্ক্রিয়) | `open-sse/services/rateLimitManager.ts` | কিউতে ভর্তির সীমা: ইতিমধ্যে এই সংখ্যক অনুরোধ কিউতে থাকলে 429 `queue_full` দিয়ে প্রত্যাখ্যান করুন। `0` = সীমাহীন (ডিফল্ট)। | -| `RATE_LIMIT_AUTO_ENABLE` | _(সেট করা নেই)_ | `open-sse/services/rateLimitManager.ts` | সংরক্ষিত ড্যাশবোর্ড সেটিং নির্বিশেষে স্বয়ংক্রিয়-সক্রিয় রেট-লিমিট নিরাপত্তা ব্যবস্থা জোরপূর্বক চালু/বন্ধ করুন। জোরপূর্বক চালু করতে `true`/`1`/`on`, এবং জোরপূর্বক বন্ধ করতে `false`/`0`/`off` গ্রহণ করে। | -| `PROVIDER_COOLDOWN_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `open-sse/services/providerCooldownTracker.ts` | অপ্ট-ইন বৈশ্বিক ক্রস-রিকোয়েস্ট প্রোভাইডার/সংযোগ কুলডাউন ট্র্যাকিং। ডিফল্টভাবে বন্ধ (সংযোগ কুলডাউন / প্রোভাইডার সার্কিট ব্রেকারের সঙ্গে ওভারল্যাপ করে)। সক্রিয় করতে `true`/`1`/`on` গ্রহণ করে। | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | ব্যর্থ প্রোভাইডার/সংযোগ পুনরায় চেষ্টা করার আগের সর্বনিম্ন কুলডাউন (ms)। ধারাবাহিক ব্যর্থতার সঙ্গে সূচকীয়ভাবে স্কেল করা হয়। শুধু `PROVIDER_COOLDOWN_ENABLED` হলে ব্যবহৃত হয়। | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 মিনিট) | `open-sse/services/providerCooldownTracker.ts` | ব্যর্থ প্রোভাইডার/সংযোগ যেকোনো অবস্থায় পুনরায় চেষ্টা করার আগের সর্বোচ্চ কুলডাউন (ms) সীমা। শুধু `PROVIDER_COOLDOWN_ENABLED` হলে ব্যবহৃত হয়। | -| `STREAM_RECOVERY_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` (সিড) → `open-sse/services/streamRecovery.ts` (লজিক) | **কী:** অসম্পূর্ণভাবে কেটে যাওয়া আপস্ট্রিম স্ট্রিমের স্বচ্ছ পুনরুদ্ধার (free-claude-code পোর্ট)। প্রারম্ভিক SSE উইন্ডোকে `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) পর্যন্ত ধরে রাখে, যাতে কোনো _প্রি-কমিট_ বিচ্ছিন্নতা — ক্লায়েন্টের কাছে কোনো বাইট পৌঁছানোর আগে ঘটে এমন বিচ্ছিন্নতা — অদৃশ্যভাবে পুনরায় খোলা ও চেষ্টা করা যায়। **কখন সক্রিয় করবেন:** অনির্ভরযোগ্য/এমন আপস্ট্রিম যেগুলো স্ট্রিমের শুরুতে প্রায়ই 0-বাইটে কেটে যায়; প্রতিটি স্ট্রিমে প্রথম টোকেন পেতে সর্বোচ্চ 750 ms অতিরিক্ত সময় বহন করতে না পারলে বন্ধ রাখুন। `true`/`1`/`on` গ্রহণ করে। সংরক্ষিত রেজিলিয়েন্স সেটিংয়ের প্রাথমিক মান নির্ধারণ করে; একবার ড্যাশবোর্ড সেটিং নির্ধারিত হলে সেটিই অগ্রাধিকার পায়। | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` (সিড) → `open-sse/services/streamRecovery.ts` (লজিক) | **কী:** স্ট্রিমের মাঝপথে ধারাবাহিকতা (পর্যায় 4.4) — কোনো _পোস্ট-কমিট_ বিচ্ছিন্নতার পর (বাইট ইতিমধ্যে ক্লায়েন্টে পৌঁছেছে), আংশিক টেক্সটকে অ্যাসিস্ট্যান্ট প্রিফিল হিসেবে দিয়ে পুনরায় অনুরোধ করে এবং অনুপস্থিত সাফিক্স জুড়ে দেয়। শুধু প্লেইন-টেক্সট OpenAI-সামঞ্জস্যপূর্ণ স্ট্রিম; কোনো টুল কল চলমান থাকলে কখনো সক্রিয় হয় না। **কখন সক্রিয় করবেন:** দীর্ঘ জেনারেশন যা উত্তরের মাঝপথে কেটে যায় এবং আপনি পুনরুদ্ধার করা শেষাংশ টোকেন-বাই-টোকেনের পরিবর্তে একবারে পৌঁছানো মেনে নেন। `STREAM_RECOVERY_ENABLED` থেকে স্বাধীন (ভিন্ন ঝুঁকি প্রোফাইল)। `true`/`1`/`on` গ্রহণ করে। | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | অপ্ট-ইন সক্রিয়-স্ট্রিম কার্যকর-আউটপুট ওয়াচডগ। এমন স্ট্রিম শনাক্ত করে যেগুলো চাঙ্ক পাঠাতে থাকে কিন্তু কনফিগার করা অ্যাসিস্ট্যান্ট-আউটপুট হারের নিচে থাকে; হার্টবিট, ব্যবহার ইভেন্ট, খালি ডেল্টা এবং টুল/রিজনিং পর্যায় অগ্রগতি হিসেবে ছদ্মবেশ ধারণ করে না। নিষ্ক্রিয়তা এবং কঠোর-সময়সীমা টাইমআউট থেকে পৃথক। | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | থ্রুপুট মূল্যায়নের আগের গ্রেস পিরিয়ড, 0–600000 ms-এর মধ্যে সীমাবদ্ধ। | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | রোলিং কার্যকর-আউটপুট উইন্ডো, 1000–600000 ms-এর মধ্যে সীমাবদ্ধ; বাতিল করার আগে একটি সম্পূর্ণ উইন্ডো প্রয়োজন। | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | সর্বনিম্ন UTF-8 অ্যাসিস্ট্যান্ট-আউটপুট বাইট হার (রক্ষণশীল টোকেন প্রক্সি), 1–1000000-এর মধ্যে সীমাবদ্ধ। | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | পরিমাপযোগ্য বলে বিবেচিত সর্বনিম্ন শূন্যের অধিক কার্যকর-আউটপুট নমুনা, 1–1000000 বাইটের মধ্যে সীমাবদ্ধ। | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | স্টার্টআপে প্রোভাইডার টোকেন স্বাস্থ্য পরীক্ষাগুলোর মধ্যবর্তী পর্যায়ক্রমিক ব্যবধান (ms)। | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | বার্স্ট প্রতিরোধে প্রোভাইডার টোকেন স্বাস্থ্য পরীক্ষাগুলোর মধ্যে `HEALTHCHECK_STAGGER_MS`-এর সঙ্গে যোগ করা সর্বনিম্ন র্যান্ডমাইজড জিটার (ms) (ইস্যু #1220)। | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | বার্স্ট প্রতিরোধে প্রোভাইডার টোকেন স্বাস্থ্য পরীক্ষাগুলোর মধ্যে `HEALTHCHECK_STAGGER_MS`-এর সঙ্গে যোগ করা সর্বোচ্চ র্যান্ডমাইজড জিটার (ms) (ইস্যু #1220)। | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | স্টার্টআপ টোকেন-স্বাস্থ্য পরীক্ষা সুইপের সমসাময়িক-পরীক্ষা ব্যাচের আকার; বড় মান সমান্তরালে আরও বেশি সংযোগ পরীক্ষা করে, ছোট মান বার্স্ট লোড কমায় (ইস্যু #7875, #7719-এর রিগ্রেশন)। | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ক্লায়েন্টকে ত্রুটি ফেরত দেওয়ার আগে মডেল-স্কোপড কুলডাউন প্রতিক্রিয়ায় স্বয়ংক্রিয় পুনঃচেষ্টার সংখ্যা। | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | কুলডাউন পুনঃচেষ্টাগুলোর মধ্যবর্তী সর্বোচ্চ ব্যাকঅফ ব্যবধান (সেকেন্ড)। আপস্ট্রিম `Retry-After` নির্বিশেষে এই মানে সীমাবদ্ধ। | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom টোকেন-সেভার প্রক্সি URL। ড্যাশবোর্ড লাইফসাইকেল (`api/headroom/*`) ডিফল্টভাবে লুপব্যাকে একটি স্থানীয় `headroom-ai` CLI চালু করে; শুধু কোনো বাহ্যিক Docker সাইডকার প্রক্সির দিকে নির্দেশ করতে এটি ওভাররাইড করুন। | - -### স্ট্রিম-রিকভারি টিউনিং ধ্রুবক - -রিকভারি হোল্ডব্যাক আচরণটি `open-sse/config/constants.ts`-এর -`STREAM_RECOVERY`-তে হার্ডকোড করা ধ্রুবকগুলোর মাধ্যমে টিউন করা হয়, যা রেফারেন্সের জন্য এখানে দেখানো হয়েছে — -এগুলো পরিবর্তন করতে কোড সম্পাদনা করতে হবে, env var নয়: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — প্রারম্ভিক SSE উইন্ডোটি কতক্ষণ ধরে রাখা হবে, - যাতে ক্লায়েন্টের কাছে কোনো বাইট কমিট করার আগেই প্রাথমিক ট্রাঙ্কেশন হলে পুনরায় চেষ্টা করা যায়। -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — ধরে রাখা উইন্ডোর কঠোর সর্বোচ্চ সীমা; টাইমার নির্বিশেষে - এতগুলো বাইট জমা হওয়ার সঙ্গে সঙ্গেই কমিট (ফ্লাশ + পাসথ্রু) করা হয়। -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — হোল্ডব্যাকটি কমিট না হওয়া পর্যন্ত আপস্ট্রিম - স্ট্রিম স্বচ্ছভাবে পুনরায় খোলার সর্বোচ্চ সংখ্যা। - -> **প্রতি-প্রোভাইডার স্লাইডিং-উইন্ডো রেট লিমিট (কোনো env var নেই):** FCC থেকে পোর্ট করা -> প্রতি-প্রোভাইডার স্লাইডিং-উইন্ডো রেট-লিমিট _ফলব্যাক_ কোডে বিদ্যমান +## 21. প্রক্সি স্বাস্থ্য + +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | দ্রুত ব্যর্থতা শনাক্তকারী স্বাস্থ্য পরীক্ষার টাইমআউট। | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | ল্যাটেন্সি-অপ্টিমাইজড পুল কৌশলে সম্ভাব্য প্রক্সিগুলোর গড় ল্যাটেন্সি গণনার সময়সীমা (ঘণ্টায়)। | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | স্বাস্থ্য পরীক্ষার ফলাফলের ক্যাশ TTL। | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | ব্যর্থ প্রক্সি স্বাস্থ্য প্রোবের ক্যাশ TTL। এটি `PROXY_HEALTH_CACHE_TTL_MS`-এর চেয়ে কম রাখুন, যাতে উচ্চ সমকালীনতার অধীনে সাময়িক প্রক্সি টাইমআউট দ্রুত পুনরায় চেষ্টা করা যায় এবং প্রকৃতপক্ষে অচল প্রক্সিগুলোর জন্য দ্রুত ব্যর্থতা শনাক্তকরণ অক্ষম না হয়। | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | নিবন্ধিত প্রক্সিগুলোকে পর্যায়ক্রমে পরীক্ষা করা ব্যাকগ্রাউন্ড প্রক্সি স্বাস্থ্য শিডিউলার অক্ষম করতে `false` সেট করুন। | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | ব্যাকগ্রাউন্ড স্বাস্থ্য শিডিউলারের সুইপ ব্যবধান মিলিসেকেন্ডে (সর্বনিম্ন `60000`)। | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | শিডিউলার এবং `/api/settings/proxies/auto-test` এন্ডপয়েন্টে ব্যবহৃত পৌঁছনীয়তা পরীক্ষার লক্ষ্য। সর্বজনীন ডিফল্ট এড়াতে এটিকে কোনো অভ্যন্তরীণ/স্ব-হোস্টেড URL-এ নির্দেশ করুন। | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | প্রতি ব্যাচে একসঙ্গে শুরু হওয়া প্রোবের সংখ্যা, যা শিডিউলার এবং `/api/settings/proxies/auto-test` এন্ডপয়েন্ট উভয়েই ব্যবহৃত হয়। সর্বনিম্ন 1 এবং সর্বোচ্চ 50-এ সীমাবদ্ধ। | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | একটি ব্যাচের মধ্যে পরপর দুটি প্রোব পাঠানোর মধ্যবর্তী বিলম্ব, মিলিসেকেন্ডে। এটি ছাড়া পুরো ব্যাচ একই মুহূর্তে পাঠানো হয় এবং একটি শেয়ার করা এগ্রেস IP রেট-সীমিত লক্ষ্যকে সক্রিয় করতে পারে। ব্যবধান নিষ্ক্রিয় করতে `0` সেট করুন; সর্বোচ্চ 5000-এ সীমাবদ্ধ। | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | কোনো প্রক্সিকে নির্ধারিত প্রোভাইডারের প্রকৃত হোস্টে (`GET /models`, কোনো API কী ছাড়াই) প্রোব করা বন্ধ করতে এবং পরিবর্তে সবসময় `PROXY_HEALTH_TEST_URL` ব্যবহার করতে "false" সেট করুন। | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` (ডিফল্ট) হলে, স্বয়ংক্রিয় পৌঁছনীয়তা প্রোবগুলো (শিডিউলার + `/api/settings/proxies/auto-test`-এর "সবগুলো পরীক্ষা করুন" বোতাম) **শুধু-পঠনযোগ্য** থাকে এবং কখনোই কোনো প্রক্সির স্ট্যাটাস পরিবর্তন করে না—শুধু অপারেটরই সক্রিয়/নিষ্ক্রিয় অবস্থা নির্ধারণ করেন, ফলে অস্থিতিশীল কোনো প্রোব নির্ধারিত প্রক্সিকে আটকে দিতে পারে না (#6246)। পুরোনো পরীক্ষা-ও-সেট আচরণ পুনরুদ্ধার করতে `true` সেট করুন। | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | অপ্ট-ইন ফিচার ফ্ল্যাগ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) দেখুন; ড্যাশবোর্ডের DB ওভাররাইড অগ্রাধিকার পায়)। `true` (অথবা `1`, `yes`) ড্যাশবোর্ডে একটি প্রক্সি পুলের অধীনে শুধু-পঠনযোগ্য পুল এগ্রেস পর্যবেক্ষণ দেখায় (পৃথক এগ্রেস IP, সংযোগ এবং প্রক্সি লগ থেকে গত 24 ঘণ্টায় একটি IP-এর পেছনে দেখা সর্বোচ্চ সংখ্যা)। রাউটিংয়ের জন্য কখনোই ব্যবহৃত হয় না। | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | পরপর একাধিক ব্যর্থতার পর শিডিউলারকে স্বয়ংক্রিয়ভাবে প্রক্সি অপসারণ করতে দিতে `true` সেট করুন। | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | শিডিউলার কোনো প্রক্সিকে স্বয়ংক্রিয়ভাবে অপসারণ করার আগে পরপর ব্যর্থতার সংখ্যা (যখন `PROXY_AUTO_REMOVE=true`)। | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | বারবার ধারাবাহিক ব্যর্থতার পর কোনো প্রক্সিকে অপসারণ করার পরিবর্তে scheduler-কে সেটি soft-disable (স্ট্যাটাস `dead`, কখনো মুছে ফেলা হয় না) করতে দিতে `true` সেট করুন। `PROXY_AUTO_REMOVE`-এর একটি অ-ধ্বংসাত্মক বিকল্প: প্রক্সিটি অবিলম্বে pool/rotation resolution থেকে বাদ পড়ে (scope-pool resolution-এ ব্যবহৃত alive-status filter ইতিমধ্যেই এটিকে বাদ দেয়) এবং পুনরায় probe-এ উত্তীর্ণ হতে শুরু করলে স্বয়ংক্রিয়ভাবে আবার সক্রিয় হয়। এটি `PROXY_AUTO_REMOVE_AFTER` threshold শেয়ার করে। উভয় flag `true` হলে, `PROXY_AUTO_REMOVE` অগ্রাধিকার পায়। | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | প্রক্সির reachability pre-check ব্যর্থ হলে OAuth এবং provider validation flow-কে pinned proxy এড়িয়ে সরাসরি সংযোগ করার অনুমতি দিন। কার্যকর অগ্রাধিকারের ক্রম হলো Feature Flags DB override > env var > default। | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `src/lib/resilience/settings.ts` | ডিফল্ট **queue-wait** বাজেট: কোনো request প্রত্যাখ্যাত হওয়ার আগে provider slot-এর জন্য কতক্ষণ অপেক্ষা করতে এবং queue-তে থাকতে পারবে, যাতে সেটি কখনো upstream-এ না পৌঁছায়। job-এর execution শুরু হলে timer মুছে দেওয়া হয়—execution আলাদাভাবে `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` দ্বারা সীমাবদ্ধ। Env শুধু default সেট করে: persisted `resilienceSettings.requestQueue.maxWaitMs`, এবং এরপর per-connection `rateLimitOverrides.maxWaitMs`, প্রতিটিই এর ওপর অগ্রাধিকার পায়। | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 মিনিট) | `open-sse/services/rateLimitManager.ts` | অনুমোদিত কোনো request-এর rate-limit reservation-এর মেয়াদ শেষ হওয়ার আগে সেটি execution-এ সর্বোচ্চ কতক্ষণ থাকতে পারবে তার সীমা—queue-wait budget থেকে বিচ্ছিন্ন, যাতে non-incremental gateway-তে ধীর fetch-start-এর কারণে timeout না হয় (#12027)। | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (নিষ্ক্রিয়) | `open-sse/services/rateLimitManager.ts` | Queue admission cap: ইতিমধ্যে queue-তে এতগুলো request থাকলে 429 `queue_full` দিয়ে প্রত্যাখ্যান করুন। `0` = সীমাহীন (default)। | +| `RATE_LIMIT_AUTO_ENABLE` | _(সেট করা নেই)_ | `open-sse/services/rateLimitManager.ts` | persisted Dashboard setting নির্বিশেষে auto-enable rate limit safety net-কে চালু/বন্ধ করতে বাধ্য করুন। চালু করতে `true`/`1`/`on`, বন্ধ করতে `false`/`0`/`off` গ্রহণ করে। | +| `PROVIDER_COOLDOWN_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `open-sse/services/providerCooldownTracker.ts` | বৈশ্বিক cross-request provider/connection cooldown tracking-এর জন্য opt-in। ডিফল্টভাবে বন্ধ (Connection Cooldown / Provider Circuit Breaker-এর সঙ্গে overlap করে)। সক্রিয় করতে `true`/`1`/`on` গ্রহণ করে। | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | ব্যর্থ provider/connection পুনরায় চেষ্টা করার আগে ন্যূনতম cooldown (ms)। ধারাবাহিক ব্যর্থতার সঙ্গে exponentially scale করা হয়। কেবল `PROVIDER_COOLDOWN_ENABLED` থাকলেই ব্যবহৃত হয়। | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 মিনিট) | `open-sse/services/providerCooldownTracker.ts` | ব্যর্থ provider/connection-কে যেকোনো অবস্থায় পুনরায় চেষ্টা করার আগে সর্বোচ্চ cooldown সীমা (ms)। শুধুমাত্র `PROVIDER_COOLDOWN_ENABLED` সক্রিয় থাকলে ব্যবহৃত হয়। | +| `STREAM_RECOVERY_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` (প্রাথমিক মান) → `open-sse/services/streamRecovery.ts` (লজিক) | **কী:** অসম্পূর্ণ upstream stream-এর স্বচ্ছ recovery (free-claude-code port)। প্রাথমিক SSE window-টি `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) পর্যন্ত ধরে রাখে, যাতে কোনো _pre-commit_ cutoff — অর্থাৎ client-এর কাছে কোনো byte পৌঁছানোর আগেই যা ঘটে — অদৃশ্যভাবে পুনরায় খোলা ও চেষ্টা করা যায়। **কখন সক্রিয় করবেন:** অস্থিতিশীল/upstream-এ যেখানে stream শুরুর সময় প্রায়ই 0-byte truncation ঘটে; প্রতিটি stream-এ time-to-first-token সর্বোচ্চ 750 ms বেড়ে যাওয়া গ্রহণযোগ্য না হলে এটি বন্ধ রাখুন। `true`/`1`/`on` গ্রহণ করে। persisted Resilience setting-এর প্রাথমিক মান নির্ধারণ করে; Dashboard setting একবার সেট করা হলে সেটিই অগ্রাধিকার পায়। | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` (প্রাথমিক মান) → `open-sse/services/streamRecovery.ts` (লজিক) | **কী:** mid-stream continuation (Fase 4.4) — কোনো _post-commit_ truncation-এর পর (byte ইতিমধ্যেই client-এর কাছে পৌঁছেছে), আংশিক text-কে assistant prefill হিসেবে ব্যবহার করে পুনরায় request পাঠায় এবং অনুপস্থিত suffix জুড়ে দেয়। শুধুমাত্র plain-text OpenAI-compatible stream-এর জন্য; চলমান tool call থাকলে কখনো সক্রিয় হয় না। **কখন সক্রিয় করবেন:** দীর্ঘ generation-এর উত্তর মাঝপথে কেটে গেলে এবং recovered tail token-by-token-এর পরিবর্তে একবারে পৌঁছানো গ্রহণযোগ্য হলে। `STREAM_RECOVERY_ENABLED` থেকে স্বতন্ত্র (ঝুঁকির ধরন আলাদা)। `true`/`1`/`on` গ্রহণ করে। | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ঐচ্ছিক active-stream useful-output watchdog। যেসব stream chunk পাঠাতে থাকে কিন্তু configured assistant-output rate-এর নিচে থাকে, সেগুলো শনাক্ত করে; heartbeat, usage event, empty delta এবং tool/reasoning phase-কে ভুলভাবে অগ্রগতি হিসেবে গণ্য করা হয় না। idle ও hard-deadline timeout থেকে পৃথক। | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | throughput মূল্যায়ন শুরুর আগের grace period, 0–600000 ms-এর মধ্যে সীমাবদ্ধ। | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | চলমান useful-output window, 1000–600000 ms-এর মধ্যে সীমাবদ্ধ; abort করার আগে একটি সম্পূর্ণ window আবশ্যক। | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | ন্যূনতম UTF-8 assistant-output byte rate (রক্ষণশীল token proxy), 1–1000000-এর মধ্যে সীমাবদ্ধ। | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | পরিমাপযোগ্য হিসেবে বিবেচিত ন্যূনতম non-zero useful-output sample, 1–1000000 byte-এর মধ্যে সীমাবদ্ধ। | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | startup-এর সময় provider token healthcheck-গুলোর মধ্যবর্তী stagger interval (ms)। | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | burst প্রতিরোধে provider token healthcheck-গুলোর মধ্যে `HEALTHCHECK_STAGGER_MS`-এর সঙ্গে যোগ করা ন্যূনতম randomized jitter (ms) (Issue #1220)। | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | burst প্রতিরোধে provider token healthcheck-গুলোর মধ্যে `HEALTHCHECK_STAGGER_MS`-এর সঙ্গে যোগ করা সর্বোচ্চ randomized jitter (ms) (Issue #1220)। | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | স্টার্টআপ token-healthcheck sweep-এর জন্য সমসাময়িক চেকের ব্যাচ সাইজ; বড় মান সমান্তরালে আরও বেশি সংযোগ পরীক্ষা করে, ছোট মান আকস্মিক লোড কমায় (Issue #7875, #7719-এর regression)। | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ক্লায়েন্টকে ত্রুটি ফেরত দেওয়ার আগে model-scoped cooldown response-এর ক্ষেত্রে স্বয়ংক্রিয় retry-এর সংখ্যা। | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | cooldown retry-গুলোর মধ্যবর্তী সর্বোচ্চ backoff interval (সেকেন্ডে)। upstream `Retry-After` যা-ই হোক না কেন, এই মান দ্বারা সীমাবদ্ধ। | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom token-saver proxy URL। dashboard lifecycle (`api/headroom/*`) ডিফল্টভাবে loopback-এ একটি স্থানীয় `headroom-ai` CLI চালু করে; কেবল একটি বাহ্যিক Docker sidecar proxy নির্দেশ করতে এটি override করুন। | + +### Stream-recovery টিউনিং constants + +Recovery holdback-এর আচরণ +`open-sse/config/constants.ts`-এর (`STREAM_RECOVERY`) hardcoded constants দ্বারা টিউন করা হয়, রেফারেন্সের জন্য এখানে দেখানো হলো — +এগুলো পরিবর্তন করতে env var নয়, কোড সম্পাদনা করতে হবে: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — শুরুর SSE window কতক্ষণ ধরে রাখা হবে, + যাতে ক্লায়েন্টের কাছে কোনো byte commit করার আগেই প্রাথমিক truncation হলে retry করা যায়। +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — ধরে রাখা window-এর hard cap; timer নির্বিশেষে + এতগুলো byte জমা হওয়ার সঙ্গে সঙ্গেই commit (flush + passthrough) করা হয়। +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — holdback এখনও uncommitted থাকা অবস্থায় upstream + stream স্বচ্ছভাবে পুনরায় খোলার সর্বোচ্চ সংখ্যা। + +> **প্রতি-provider sliding-window rate limit (কোনো env var নেই):** FCC-ported +> প্রতি-provider sliding-window rate-limit _fallback_ কোডে রয়েছে > (`open-sse/services/providerDefaultRateLimit.ts`, যা -> `open-sse/services/rateLimitManager.ts`-এর মাধ্যমে সংযুক্ত), কিন্তু এটি একটি **খালি ডিফল্ট ম্যাপ** -> সহ সরবরাহ করা হয় এবং বর্তমানে এর জন্য **কোনো অপারেটর env var নেই** — এটি কেবল একটি টেস্ট হুক / -> কোড সম্পাদনার মাধ্যমে সক্রিয় করা যায়। ইচ্ছাকৃতভাবেই এটি উপরের টেবিলে তালিকাভুক্ত করা হয়নি। যে প্রতি-`(token, IP)` -> রিলে লিমিটারে সত্যিই একটি নিয়ন্ত্রণযোগ্য সেটিং রয়েছে, সেটি হলো `RELAY_IP_PER_MINUTE` (§3 নেটওয়ার্ক ও পোর্টসমূহ)। +> `open-sse/services/rateLimitManager.ts`-এর মাধ্যমে সংযুক্ত), তবে এটি একটি **খালি default map** +> সহ সরবরাহ করা হয় এবং বর্তমানে এর **কোনো operator env var নেই** — এটি কেবল একটি test hook / +> code edit-এর মাধ্যমে সক্রিয় করা যায়। ইচ্ছাকৃতভাবেই এটি উপরের table-এ তালিকাভুক্ত করা হয়নি। যে প্রতি-`(token, IP)` +> relay limiter-টির _বাস্তবেই_ একটি knob আছে, সেটি হলো `RELAY_IP_PER_MINUTE` (§3 Network & Ports)। --- @@ -1183,32 +1192,33 @@ Anthropic-সামঞ্জস্যপূর্ণ প্রোভাইডা > [!CAUTION] > এই ভেরিয়েবলগুলো **বিস্তারিত আউটপুট** তৈরি করে এবং সংবেদনশীল ডেটা ফাঁস করতে পারে। **প্রোডাকশনে কখনোই সক্রিয় করবেন না।** -| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | -| ------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | বিস্তারিত Cursor executor লগ (ডিকোড করা SSE chunk ইত্যাদি) সক্রিয় করতে `1` সেট করুন। | -| `CURSOR_STREAM_DEBUG` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG`-এর পশ্চাৎ-সামঞ্জস্যপূর্ণ alias। | -| `CURSOR_DUMP_FILE` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | ঐচ্ছিক ফাইল পাথ, যেখানে `CURSOR_DEBUG=1` হলে raw ডিকোড করা Cursor chunk লেখা হয়। | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor executor-এর stream নিষ্ক্রিয়তার timeout (ms)। | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | composer kv_after_text soft terminator-এর পরে byte buffer-এ থেকে গেলে grace window (ms)—এটি পরবর্তী exec_mcp tool call-কে তার frame সম্পূর্ণ করার সময় দেয়। | -| `CURSOR_TOOL_DIRECTIVE` | সক্রিয় (`!== "0"`) | `open-sse/executors/cursor.ts` | Tool-commit directive, যা composer-2.5-কে নির্ভরযোগ্যভাবে tool call করতে সহায়তা করে। নিষ্ক্রিয় করতে `0` সেট করুন। | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(সেট করা নেই)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | অপারেটর-নির্ধারিত system prompt text, যা অনুবাদের পরে system message-এ যুক্ত হয় (post-translation injection) এবং codex/Responses ও `/v1/messages` path-এ পৌঁছায়। প্রতিধ্বনিত system preamble block থেকে বাদ দেওয়া directive prefix হিসেবেও ব্যবহৃত হয়। নিষ্ক্রিয় রাখতে সেট না করে রাখুন। | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | remote `image_url` vision input-এর জন্য প্রতি-image fetch timeout (ms)। | -| `CURSOR_STATE_DB_PATH` | _(অনুসন্ধান করা হয়)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE version শনাক্তকরণে ব্যবহৃত Cursor IDE state DB lookup override করুন। | -| `CURSOR_AGENT_CLI_VERSION` | _(শনাক্ত / pin)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run-এ `x-cursor-client-version: cli-…`-এর জন্য Agent CLI build id (`YYYY.MM.DD-`)। | -| `CURSOR_AGENT_BIN` | _(সেট করা নেই)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | image generation-এর জন্য ব্যবহৃত Cursor Agent binary-র path। সেট না থাকলে handler প্রথমে `providerSpecificData.agentBin`, তারপর PATH ব্যবহার করে। | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent image job-এর জন্য প্রতি-image wall clock (ms)। | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor image job-এর জন্য shared-seat concurrency gate। | -| `CURSOR_IMG_MODEL` | request / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | image job-এর জন্য Cursor CLI `--model` override করুন। | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) image-gen ফলাফল poll করার cadence (ms)। | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC image-gen ফলাফল poll করার wall clock (ms)। | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) video-gen ফলাফল poll করার cadence (ms)। | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video-gen ফলাফল poll করার wall clock (ms)। | -| `CURSOR_DATA_DIR` | _(অনুসন্ধান করা হয়)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI data dir (`…/versions/`) override করুন; official agent-ও একই var ব্যবহার করে। | -| `CURSOR_TOKEN` | _(সেট করা নেই)_ | `scripts/ad-hoc/cursor-tap.cjs` | developer tooling-এ ব্যবহৃত সরাসরি Cursor bearer token। | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | নিষ্ক্রিয় (`"1"` দিয়ে opt-in) | `src/app/api/v1/chat/completions/route.ts` | `"1"` সেট করা হলে বড় chat payload-এর content-type/length marker লগ করুন। লগের অপ্রয়োজনীয় তথ্য কমাতে ডিফল্টরূপে বন্ধ থাকে। | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(সেট করা নেই)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON অনুবাদের বিবরণ লগ করতে `true` সেট করুন। | -| `DEBUG_CLAUDE_NONSTREAM` | _(সেট করা নেই)_ | `open-sse/handlers/responseTranslator.ts` | Claude response অনুবাদ path-এ খালি textContent chunk প্রকাশ করতে `true` সেট করুন (শুধু debugging-এর জন্য)। | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(সেট করা নেই)_ | E2E test harness | E2E test mode (শিথিল auth, test hook) সক্রিয় করতে `true` সেট করুন। | +| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ | +| ------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CURSOR_DEBUG` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | বিস্তারিত Cursor executor লগ (ডিকোড করা SSE chunk ইত্যাদি) সক্রিয় করতে `1` সেট করুন। | +| `CURSOR_STREAM_DEBUG` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG`-এর পশ্চাৎ-সামঞ্জস্যপূর্ণ alias। | +| `CURSOR_DUMP_FILE` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG=1` হলে raw ডিকোড করা Cursor chunk গ্রহণ করে এমন ঐচ্ছিক ফাইল path। | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor executor-এর জন্য stream নিষ্ক্রিয়তার timeout (ms)। | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | byte buffer-এ অবশিষ্ট থাকলে composer kv_after_text soft terminator-এর পর grace window (ms)—এটি পরবর্তী exec_mcp tool call-কে তার frame সম্পূর্ণ করার সময় দেয়। | +| `CURSOR_TOOL_DIRECTIVE` | সক্রিয় (`!== "0"`) | `open-sse/executors/cursor.ts` | tool-commit directive, যা composer-2.5-কে নির্ভরযোগ্যভাবে tool call ইস্যু করায়। নিষ্ক্রিয় করতে `0` সেট করুন। | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(সেট করা নেই)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | অপারেটর-নির্ধারিত system prompt-এর text, যা অনুবাদের পরে system message-এ যোগ করা হয় (post-translation injection) এবং codex/Responses ও `/v1/messages` path-এ পৌঁছায়। প্রতিধ্বনিত system preamble block থেকে বাদ দেওয়া directive prefix হিসেবেও এটি ব্যবহৃত হয়। নিষ্ক্রিয় রাখতে সেট না করে রাখুন। | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (বন্ধ) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | একটি openai→claude stream-এর শুরু থেকে প্রতিধ্বনিত system-prompt preamble block বাদ দিতে `1` সেট করুন। ডিফল্টভাবে বন্ধ—heuristic-গুলো ইংরেজি গদ্য-কেন্দ্রিক এবং response payload পরিবর্তন করে, তাই বৈধভাবে এমন section দিয়ে শুরু হওয়া reply-এর সেই অংশ হারিয়ে যাবে। | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | remote `image_url` vision input-এর জন্য প্রতি-image fetch timeout (ms)। | +| `CURSOR_STATE_DB_PATH` | _(অনুসন্ধান করা হয়)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE version শনাক্তকরণের জন্য ব্যবহৃত Cursor IDE state DB lookup override করে। | +| `CURSOR_AGENT_CLI_VERSION` | _(শনাক্ত / pin)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run-এ `x-cursor-client-version: cli-…`-এর জন্য Agent CLI build id (`YYYY.MM.DD-`)। | +| `CURSOR_AGENT_BIN` | _(সেট করা নেই)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | image generation-এর জন্য ব্যবহৃত Cursor Agent binary-এর path। সেট করা না থাকলে handler প্রথমে `providerSpecificData.agentBin`, তারপর PATH ব্যবহার করে। | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent image job-এর জন্য প্রতি-image wall-clock সময়সীমা (ms)। | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor image job-এর জন্য shared-seat concurrency gate। | +| `CURSOR_IMG_MODEL` | request / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | image job-এর জন্য Cursor CLI `--model` override করে। | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) image-gen ফলাফল poll করার বিরতি (ms)। | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC image-gen ফলাফল poll করার wall-clock সময়সীমা (ms)। | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) video-gen ফলাফল poll করার বিরতি (ms)। | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video-gen ফলাফল poll করার wall-clock সময়সীমা (ms)। | +| `CURSOR_DATA_DIR` | _(অনুসন্ধান করা হয়)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI data dir (`…/versions/`) override করে; official agent-ও একই var ব্যবহার করে। | +| `CURSOR_TOKEN` | _(সেট করা নেই)_ | `scripts/ad-hoc/cursor-tap.cjs` | developer tooling দ্বারা ব্যবহৃত সরাসরি Cursor bearer token। | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | নিষ্ক্রিয় (`"1"` দিয়ে opt-in) | `src/app/api/v1/chat/completions/route.ts` | `"1"` সেট করা হলে বড় chat payload-এর content-type/length marker log করে। log-এর অতিরিক্ত তথ্য কমাতে ডিফল্টভাবে বন্ধ। | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(সেট করা নেই)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON অনুবাদের বিস্তারিত log করতে `true` সেট করুন। | +| `DEBUG_CLAUDE_NONSTREAM` | _(সেট করা নেই)_ | `open-sse/handlers/responseTranslator.ts` | Claude response অনুবাদ path-এ খালি textContent chunk প্রকাশ করতে `true` সেট করুন (শুধু ডিবাগের জন্য)। | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(সেট করা নেই)_ | E2E test harness | E2E test mode (শিথিল auth, test hook) সক্রিয় করতে `true` সেট করুন। | --- @@ -1224,9 +1234,9 @@ Anthropic-সামঞ্জস্যপূর্ণ প্রোভাইডা --- -## ডিপ্লয়মেন্টের পরিস্থিতি +## ডিপ্লয়মেন্ট পরিস্থিতি -রিলে ব্যাকএন্ডের SRE নির্দেশনার জন্য (ts/bifrost/auto-এর আচরণ, 9router বনাম CLIProxyAPI-এর অবস্থান এবং উচ্চ-থ্রুপুট ফলব্যাক কৌশল), [রিলে ব্যাকএন্ড কৌশল](/docs/reference/RELAY_BACKEND_STRATEGY.md) দেখুন। +রিলে ব্যাকএন্ড SRE নির্দেশনার জন্য (ts/bifrost/auto-এর আচরণ, 9router বনাম CLIProxyAPI-এর অবস্থান এবং উচ্চ-থ্রুপুট ফলব্যাক কৌশল), [রিলে ব্যাকএন্ড কৌশল](/docs/reference/RELAY_BACKEND_STRATEGY.md) দেখুন। ### ন্যূনতম লোকাল ডেভেলপমেন্ট diff --git a/docs/i18n/bn/docs/reference/FEATURE_FLAGS.md b/docs/i18n/bn/docs/reference/FEATURE_FLAGS.md index 75717822dc43..77fdbe4c5d0f 100644 --- a/docs/i18n/bn/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/bn/docs/reference/FEATURE_FLAGS.md @@ -46,125 +46,125 @@ ## ফ্ল্যাগ ক্যাটালগ -6টি বিভাগে মোট 72টি ফ্ল্যাগ। **ডিফল্ট** হলো সংজ্ঞায় নির্ধারিত ডিফল্ট মান — -কোনো DB ওভাররাইড বা এনভায়রনমেন্ট ভেরিয়েবল উপস্থিত না থাকলে এই মানটি -ব্যবহৃত হয়। - -### নিরাপত্তা (10) - -| কী | ধরন | ডিফল্ট | বিবরণ | -| --------------------------------------- | ------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | সব ইনকামিং অনুরোধের জন্য একটি API কী আবশ্যক করুন। | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | সব অনুরোধের জন্য ইনপুট স্যানিটাইজেশন সক্রিয় করুন। | -| `INJECTION_GUARD_MODE` | enum | `off` | প্রম্পট ইনজেকশন গার্ড মোড। মান: `off`, `warn`, `block`, `redact`। | -| `PII_REDACTION_ENABLED` | boolean | `false` | অনুরোধ থেকে PII রিড্যাক্ট করুন (`INPUT_SANITIZER_MODE` থেকে স্বতন্ত্র)। | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | প্রোভাইডারের প্রতিক্রিয়া থেকে PII স্যানিটাইজ করুন। | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | PII প্রতিক্রিয়া স্যানিটাইজেশনের মোড। মান: `redact`, `warn`, `block`, `off`। | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | প্রাইভেট/অভ্যন্তরীণ IP রেঞ্জের উদ্দেশ্যে আউটবাউন্ড অনুরোধ ব্লক করুন। | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | প্রমাণীকৃত ড্যাশবোর্ড ব্যবহারকারীদের শুধু মাস্ক করা মান দেখার পরিবর্তে সংরক্ষিত API কী প্রকাশ করার অনুমতি দিন। | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | AUTH লগ লাইনে অ্যাকাউন্টের প্রিফিক্স অন্তর্ভুক্ত করুন (যেমন "Using account: abc12345...")। ডিফল্টভাবে নিষ্ক্রিয় থাকে, যাতে শেয়ার্ড/মাল্টি-টেন্যান্ট প্রসেস লগ থেকে অ্যাকাউন্ট শনাক্তকারী রিড্যাক্ট করা হয়। Debug Mode থেকে স্বতন্ত্র; Debug Mode পরিবর্তন করলেও এটি প্রকাশিত হয় না। | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | OIDC সক্রিয় থাকলে পাসওয়ার্ড লগইন নিষ্ক্রিয় করুন, যাতে ব্যবহারকারীরা শুধু OIDC Single Sign-On-এর মাধ্যমে প্রমাণীকরণ করতে পারেন। নিষ্ক্রিয় থাকলে (ডিফল্ট), পাসওয়ার্ড লগইন ও OIDC উভয়ই উপলভ্য থাকে। | - -### নেটওয়ার্ক (15) - -| কী | ধরন | ডিফল্ট | পুনরারম্ভ | বিবরণ | -| ----------------------------------------------- | ------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS ফিঙ্গারপ্রিন্ট স্টেলথ মোড সক্রিয় করুন। | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* রুটগুলোকে localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করার অনুমতি দিন। ডিফল্টভাবে বন্ধ—অডিওকে কোনো রিমোট হোস্টে রাউট করলে বহির্গমন পরিচয় পরিবর্তিত হয় এবং এটি অবশ্যই অপারেটরের একটি সুস্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক নোড সবসময় অনুমোদিত এবং এর দ্বারা প্রভাবিত হয় না। | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | কোনো সংযোগে প্রক্সি নির্ধারিত না থাকলে, রেজিস্ট্রি থেকে প্রথম কার্যকর প্রক্সিটি স্বয়ংক্রিয়ভাবে নির্বাচন করুন। ডিফল্টভাবে বন্ধ (অন্যথায় রেজিস্ট্রির যেকোনো প্রক্সি একটি গ্লোবাল ফলব্যাক হয়ে যায়—#3332)। | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | প্রক্সি রিচেবিলিটি প্রি-চেক ব্যর্থ হলে OAuth ও প্রোভাইডার যাচাইকরণ ফ্লোকে পিন করা প্রক্সি এড়িয়ে সরাসরি সংযোগ করার অনুমতি দিন। ডিফল্টভাবে বন্ধ, কারণ এটি বহির্গমন IP পরিবর্তন করতে পারে। | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | একাধিক-অ্যাকাউন্ট রোটেশন এক্সিকিউটরে নেটওয়ার্ক ব্যতিক্রম (টাইমআউট, সংযোগ প্রত্যাখ্যাত/রিসেট) ঘটলে, ব্যর্থ অ্যাকাউন্টটির কোনো নিবেদিত প্রক্সি না থাকলে, প্রতিটিতে পুনঃচেষ্টা করার পরিবর্তে একটি সংক্ষিপ্ত কুলডাউন প্রয়োগ করুন এবং অনুরোধের অবশিষ্ট সময়ে অন্য প্রক্সিবিহীন অ্যাকাউন্টগুলো এড়িয়ে যান। ডিফল্টভাবে চালু (নিরাপদ: বহির্গমন IP পরিবর্তন হয় না, কেবল শেয়ার্ড-এগ্রেস অ্যাকাউন্টে ল্যাটেন্সি/কুলডাউন ঝুঁকি কমায়)। প্রথম প্রক্সিবিহীন থ্রোতেই তাৎক্ষণিক প্রপাগেশন পুনরুদ্ধার করতে এটি নিষ্ক্রিয় করুন। | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | প্রক্সি পুল এবং opencode-এর প্রতি-অ্যাকাউন্ট রোটেশন সদ্য ব্যর্থ হওয়া প্রক্সি (প্রত্যাখ্যাত TCP প্রোব, অথবা এর মাধ্যমে প্রাপ্ত 429) একটি প্রতি-প্রসেস সময়কালের জন্য পুনরায় পরিবেশন করা বন্ধ করে; প্রতিবার পুনরাবৃত্তিতে সময়কাল দ্বিগুণ হয়, একটি সর্বোচ্চ সীমা পর্যন্ত। কোনো প্রক্সি স্ট্যাটাস লেখা হয় না; প্রতিটি প্রার্থী সরিয়ে রাখলেও নির্বাচন অপরিবর্তিত থাকে। ডিফল্টভাবে বন্ধ। | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | ড্যাশবোর্ডে কোনো প্রক্সি পুলের অধীনে দেখান যে গত 24 h-এ কতটি পর্যবেক্ষিত বহির্গমন IP তার সদস্যদের পরিষেবা দিয়েছে এবং কতটি সংযোগ সেগুলো ব্যবহার করেছে। শুধু-পঠনযোগ্য, প্রক্সি লগ থেকে গণনা করা হয়, রাউটিংয়ের জন্য কখনো ব্যবহৃত হয় না। ডিফল্টভাবে বন্ধ। | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode এক্সিকিউটরের জন্য, স্ট্রিম করা Responses জবাবের প্রথম বডি বাইট পর্যবেক্ষণ করুন (উইন্ডো: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, ডিফল্ট `15000`)। কোনো 2xx Responses স্ট্রিম উইন্ডোর পরও নীরব থাকলে সেটিকে স্টল হয়েছে বলে বিবেচনা করা হয়: অ্যাকাউন্টটিকে কুলডাউনে রাখা হয় এবং অনুরোধটি একবার পরবর্তী অ্যাকাউন্টে রোটেট করা হয়; দ্বিতীয়বার স্টল হলে দ্রুত ব্যর্থ হয়। ডিফল্টভাবে বন্ধ: স্ট্রিম প্রস্তুতি টাইমআউট পর্যন্ত স্টল হওয়া স্ট্রিমগুলো বর্তমান অপেক্ষা বজায় রাখে। | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode এক্সিকিউটর: `user_blocked` প্রত্যাখ্যান বহনকারী 403/451 পেলে (জিও নয়, Cloudflare ফিঙ্গারপ্রিন্ট প্রত্যাখ্যান নয়), প্রত্যাখ্যাত অ্যাকাউন্টটিকে কুলডাউনে রাখুন এবং প্রতি অনুরোধে সর্বোচ্চ একবার পরবর্তী অ্যাকাউন্টে রোটেট করুন; দ্বিতীয় প্রত্যাখ্যান কোনো সফলতার চিহ্ন ছাড়াই অপরিবর্তিতভাবে ফেরত দেওয়া হয়। ডিফল্টভাবে বন্ধ: কোনো আপস্ট্রিম ব্যবহারকারী ব্লক এড়িয়ে রাউট করা ফাঁকি দেওয়ার মতো দেখাতে পারে এবং পুরো ফ্লিটে ফ্ল্যাগটি ছড়িয়ে দিতে পারে। | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode রোটেশন: পরপর দুটি সাময়িক আপস্ট্রিম ব্যর্থতার (5xx অথবা খালি 400) পর, পরবর্তী অ্যাকাউন্টের আগে বিরতি দিন—1.5s থেকে শুরু করে প্রতিটি পরবর্তী ব্যর্থতায় দ্বিগুণ, প্রতি বিরতিতে সর্বোচ্চ 6s এবং প্রতি অনুরোধে 10s; ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হলে এড়িয়ে যাওয়া হয়; অপেক্ষা করার আগে ব্যর্থ বডিটি মুক্ত করা হয়। ডিফল্টভাবে বন্ধ: ফেইলওভার তাৎক্ষণিক থাকে। | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode রোটেশন: প্রকৃত রেট লিমিট হিসেবে শ্রেণিবদ্ধ প্রথম 429-এ অ্যাকাউন্ট ওয়েভ থামান (পার্সযোগ্য `Retry-After`, অথবা রেট/ব্যবহার সীমার উল্লেখ থাকা কোনো বডি) এবং সেই আপস্ট্রিম 429 অপরিবর্তিতভাবে ফেরত দিন। অশ্রেণিবদ্ধ 429-এর ক্ষেত্রে রোটেশন চলতে থাকে। ডিফল্টভাবে বন্ধ: ফ্রি টিয়ারটি প্রতি বহির্গমন IP অনুযায়ী সীমাবদ্ধ (#9611), তাই প্রতিটি 429-এ রোটেশন হয় এবং নিঃশেষিত ওয়েভ শেষ আপস্ট্রিম 429 ফেরত দেয়। | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM প্রক্সির জন্য TLS সার্টিফিকেট যাচাইকরণ নিষ্ক্রিয় করুন। **বিপজ্জনক।** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | প্রাইভেট/অভ্যন্তরীণ নেটওয়ার্কের দিকে নির্দেশকারী প্রোভাইডার URL অনুমোদন করুন। | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | লোকাল/প্রাইভেট ঠিকানায় (127.0.0.1, localhost, LAN) প্রোভাইডার যোগ/যাচাই করার অনুমতি দিন। ডিফল্টভাবে চালু (লোকাল-প্রথম); কঠোরভাবে শুধু-পাবলিক ব্লকিংয়ের জন্য নিষ্ক্রিয় করুন। ক্লাউড-মেটাডেটা ব্লক করা থাকে। | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code-সামঞ্জস্যপূর্ণ প্রোভাইডার মোড সক্রিয় করুন। | +৬টি বিভাগে ৭৪টি ফ্ল্যাগ। **ডিফল্ট** হলো সংজ্ঞায় নির্ধারিত ডিফল্ট মান — DB ওভাররাইড বা এনভায়রনমেন্ট ভেরিয়েবল কোনোটিই উপস্থিত না থাকলে যে মানটি ব্যবহৃত হয়। + +### নিরাপত্তা (১০) + +| কী | ধরন | ডিফল্ট | বিবরণ | +| --------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUIRE_API_KEY` | boolean | `false` | সব ইনকামিং অনুরোধের জন্য একটি API কী আবশ্যক করুন। | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | সব অনুরোধের জন্য ইনপুট স্যানিটাইজেশন সক্রিয় করুন। | +| `INJECTION_GUARD_MODE` | enum | `off` | প্রম্পট ইনজেকশন গার্ড মোড। মানসমূহ: `off`, `warn`, `block`, `redact`। | +| `PII_REDACTION_ENABLED` | boolean | `false` | অনুরোধ থেকে PII রিড্যাক্ট করুন (`INPUT_SANITIZER_MODE` থেকে স্বতন্ত্র)। | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | প্রোভাইডারের রেসপন্স থেকে PII স্যানিটাইজ করুন। | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | PII রেসপন্স স্যানিটাইজেশনের মোড। মানসমূহ: `redact`, `warn`, `block`, `off`। | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | প্রাইভেট/ইন্টারনাল IP রেঞ্জে আউটবাউন্ড অনুরোধ ব্লক করুন। | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | প্রমাণীকৃত ড্যাশবোর্ড ব্যবহারকারীদের শুধু মাস্ক করা মান দেখার পরিবর্তে সংরক্ষিত API কী প্রকাশ করার অনুমতি দিন। | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | AUTH লগ লাইনে অ্যাকাউন্ট প্রিফিক্স অন্তর্ভুক্ত করুন (যেমন, "Using account: abc12345...")। ডিফল্টভাবে নিষ্ক্রিয় থাকে, যাতে শেয়ার্ড/মাল্টি-টেন্যান্ট প্রসেস লগ থেকে অ্যাকাউন্ট শনাক্তকারী রিড্যাক্ট করা হয়। Debug Mode থেকে স্বতন্ত্র; Debug Mode পরিবর্তন করলেও এটি প্রকাশ পায় না। | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | OIDC সক্রিয় থাকলে পাসওয়ার্ড লগইন নিষ্ক্রিয় করুন, যাতে ব্যবহারকারীরা শুধু OIDC Single Sign-On-এর মাধ্যমে প্রমাণীকরণ করতে পারেন। নিষ্ক্রিয় থাকলে (ডিফল্ট), পাসওয়ার্ড লগইন ও OIDC—উভয়ই উপলভ্য থাকে। | + +### নেটওয়ার্ক (১৬) + +| কী | ধরন | ডিফল্ট | পুনরারম্ভ | বিবরণ | +| ----------------------------------------------- | ------- | ------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS ফিঙ্গারপ্রিন্ট স্টেলথ মোড সক্রিয় করুন। | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* রুটগুলোকে localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করার অনুমতি দিন। ডিফল্টভাবে বন্ধ — অডিওকে কোনো রিমোট হোস্টে রাউট করলে বহির্গমন পরিচয় পরিবর্তিত হয় এবং এটি অবশ্যই অপারেটরের সুস্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক নোডগুলো সবসময় অনুমোদিত এবং প্রভাবমুক্ত থাকে। | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | POST /v1/rerank-কে (এবং মেমরি ইঞ্জিনের লুপব্যাক রির্যাঙ্ক ধাপকে) localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করার অনুমতি দিন। ডিফল্টভাবে বন্ধ — কোনো রিমোট হোস্টে রাউট করলে বহির্গমন পরিচয় পরিবর্তিত হয় এবং এটি অবশ্যই অপারেটরের সুস্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক নোডগুলো সবসময় অনুমোদিত; রিমোট নোডগুলোকে প্রোভাইডারের আউটবাউন্ড URL নীতিও পাস করতে হবে। | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | কোনো সংযোগে প্রক্সি নির্ধারিত না থাকলে, রেজিস্ট্রি থেকে প্রথম কার্যকর প্রক্সিটি স্বয়ংক্রিয়ভাবে নির্বাচন করুন। ডিফল্টভাবে বন্ধ (অন্যথায় রেজিস্ট্রির যেকোনো প্রক্সি একটি গ্লোবাল ফলব্যাক হয়ে যায় — #3332)। | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | প্রক্সির নাগালযোগ্যতার প্রাথমিক পরীক্ষা ব্যর্থ হলে OAuth এবং প্রোভাইডার যাচাইকরণ প্রবাহগুলোকে পিন করা প্রক্সি এড়িয়ে সরাসরি সংযোগ করার অনুমতি দিন। ডিফল্টভাবে বন্ধ, কারণ এতে বহির্গমন IP পরিবর্তিত হতে পারে। | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | একাধিক অ্যাকাউন্টের রোটেশন এক্সিকিউটরে নেটওয়ার্ক ব্যতিক্রম (টাইমআউট, সংযোগ প্রত্যাখ্যাত/রিসেট) ঘটলে, ব্যর্থ অ্যাকাউন্টটির কোনো নিবেদিত প্রক্সি না থাকলে, প্রতিটিকে পুনরায় চেষ্টা করার পরিবর্তে স্বল্প সময়ের কুলডাউন প্রয়োগ করুন এবং অনুরোধের বাকি সময়ে প্রক্সিবিহীন অন্য অ্যাকাউন্টগুলো এড়িয়ে যান। ডিফল্টভাবে চালু (নিরাপদ: বহির্গমন IP পরিবর্তন হয় না, শুধু শেয়ার করা বহির্গমন অ্যাকাউন্টগুলোর ল্যাটেন্সি/কুলডাউন ঝুঁকি কমায়)। প্রথম প্রক্সিবিহীন থ্রোতেই তাৎক্ষণিক প্রোপাগেশন পুনরুদ্ধার করতে নিষ্ক্রিয় করুন। | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | প্রক্সি পুল এবং opencode-এর অ্যাকাউন্ট-প্রতি রোটেশন সদ্য ব্যর্থ হওয়া কোনো প্রক্সিকে (প্রত্যাখ্যাত TCP প্রোব, অথবা এর মাধ্যমে পাওয়া 429) প্রতি-প্রসেস সময়কালের জন্য পুনরায় সরবরাহ করা বন্ধ করে; প্রতিবার পুনরাবৃত্তিতে সময়কাল দ্বিগুণ হয়, একটি সর্বোচ্চ সীমা পর্যন্ত। কোনো প্রক্সি স্ট্যাটাস লেখা হয় না; প্রতিটি প্রার্থী সরিয়ে রাখলেও নির্বাচন অপরিবর্তিত থাকে। ডিফল্টভাবে বন্ধ। | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | ড্যাশবোর্ডে কোনো প্রক্সি পুলের অধীনে দেখান, গত 24 h-এ কতটি পর্যবেক্ষিত বহির্গমন IP এর সদস্যদের সেবা দিয়েছে এবং কতটি সংযোগ সেগুলো ব্যবহার করেছে। শুধু পাঠযোগ্য, প্রক্সি লগ থেকে গণনা করা হয়, রাউটিংয়ের জন্য কখনো ব্যবহৃত হয় না। ডিফল্টভাবে বন্ধ। | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode এক্সিকিউটরের জন্য, স্ট্রিম করা Responses উত্তরের প্রথম বডি বাইট পর্যবেক্ষণ করুন (উইন্ডো: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, ডিফল্ট `15000`)। যে 2xx Responses স্ট্রিম উইন্ডোর সময়সীমা পেরিয়েও নীরব থাকে সেটিকে স্থবির হিসেবে গণ্য করা হয়: অ্যাকাউন্টটি কুলডাউনে যায় এবং অনুরোধটি একবার পরবর্তী অ্যাকাউন্টে রোটেট হয়; দ্বিতীয়বার স্থবির হলে দ্রুত ব্যর্থ হয়। ডিফল্টভাবে বন্ধ: স্থবির স্ট্রিমগুলো বর্তমানে স্ট্রিম প্রস্তুতি টাইমআউট পর্যন্ত অপেক্ষা চালিয়ে যায়। | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode নির্বাহক: কোনো 403/451 প্রতিক্রিয়ায় `user_blocked` প্রত্যাখ্যান থাকলে (ভৌগোলিক কারণে নয় এবং Cloudflare ফিঙ্গারপ্রিন্ট প্রত্যাখ্যানও নয়), প্রত্যাখ্যাত অ্যাকাউন্টটিকে সাময়িক বিরতিতে রাখুন এবং প্রতি অনুরোধে সর্বোচ্চ একবার পরবর্তী অ্যাকাউন্টে ঘুরিয়ে দিন; দ্বিতীয় প্রত্যাখ্যানটি সফলতার চিহ্ন ছাড়াই অপরিবর্তিতভাবে ফেরত দেওয়া হয়। ডিফল্টভাবে বন্ধ: আপস্ট্রিম ব্যবহারকারী-ব্লক এড়িয়ে রাউটিং করাকে বিধিনিষেধ এড়ানোর চেষ্টা বলে মনে হতে পারে এবং পুরো ফ্লিটে ফ্ল্যাগটি ছড়িয়ে দিতে পারে। | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode রোটেশন: পরপর দুটি ক্ষণস্থায়ী আপস্ট্রিম ব্যর্থতার (5xx অথবা একটি খালি 400) পর, পরবর্তী অ্যাকাউন্টের আগে বিরতি দিন—1.5s থেকে শুরু করে প্রতিটি পরবর্তী ব্যর্থতায় দ্বিগুণ হবে, তবে প্রতি বিরতিতে সর্বোচ্চ 6s এবং প্রতি অনুরোধে মোট 10s; ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হলে এটি এড়িয়ে যাওয়া হবে; অপেক্ষার আগে ব্যর্থ প্রতিক্রিয়ার বডি মুক্ত করা হয়। ডিফল্টভাবে বন্ধ: ফেইলওভার তাৎক্ষণিক থাকে। | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode রোটেশন: বাস্তব রেট লিমিট হিসেবে শ্রেণিবদ্ধ প্রথম 429-এ অ্যাকাউন্টের ধারা থামিয়ে দিন (পার্সযোগ্য `Retry-After`, অথবা রেট/ব্যবহারের সীমা উল্লেখকারী বডি) এবং সেই আপস্ট্রিম 429 অপরিবর্তিতভাবে ফেরত দিন। অশ্রেণিবদ্ধ 429-এর ক্ষেত্রে রোটেশন চলতে থাকে। ডিফল্টভাবে বন্ধ: বিনামূল্যের স্তরটি প্রতি বহির্গামী IP অনুযায়ী সীমাবদ্ধ (#9611), তাই প্রতিটি 429-এ রোটেশন হয় এবং সব অ্যাকাউন্ট নিঃশেষ হয়ে গেলে সর্বশেষ আপস্ট্রিম 429 ফেরত দেওয়া হয়। | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM প্রক্সির জন্য TLS সার্টিফিকেট যাচাইকরণ নিষ্ক্রিয় করুন। **বিপজ্জনক।** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | ব্যক্তিগত/অভ্যন্তরীণ নেটওয়ার্ক নির্দেশকারী প্রোভাইডার URL অনুমোদন করুন। | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | স্থানীয়/ব্যক্তিগত ঠিকানায় (127.0.0.1, localhost, LAN) প্রোভাইডার যোগ/যাচাই করার অনুমতি দিন। ডিফল্টভাবে চালু (স্থানীয়-প্রথম); শুধুমাত্র পাবলিক ঠিকানা অনুমোদনের কঠোর নীতির জন্য নিষ্ক্রিয় করুন। ক্লাউড-মেটাডেটা অবরুদ্ধই থাকে। | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code-সামঞ্জস্যপূর্ণ প্রোভাইডার মোড সক্রিয় করুন। | ### নীতিমালা (5) -| কী | ধরন | ডিফল্ট | বিবরণ | -| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | টুল ব্যবহারের নীতি প্রয়োগের মোড। মানসমূহ: `disabled`, `warn`, `block`। | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | ব্যবহারের ধরন অনুযায়ী স্বয়ংক্রিয়ভাবে রেট লিমিটিং সক্রিয় করুন। | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | সরাসরি একক-মডেল অনুরোধের জন্য OmniRoute-এর স্থানীয় কনটেক্সট-উইন্ডো / সর্বোচ্চ-ইনপুট-টোকেন যাচাই এড়িয়ে যান। আপস্ট্রিম সীমা তবুও প্রযোজ্য থাকবে। | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | লক্ষ্য মডেলে প্রয়োজনীয় সক্ষমতা (ভিশন, টুল, স্ট্রাকচার্ড আউটপুট, কনটেক্সট উইন্ডো) না থাকলে ডিসপ্যাচের আগে অনুরোধ প্রত্যাখ্যান করুন। এটি কম্বো-লেয়ারের সামঞ্জস্যতা ফিল্টার এড়িয়ে যাওয়া সরাসরি একক-প্রোভাইডার অনুরোধগুলোকে সুরক্ষিত রাখে। | -| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar মডিউল (ক্যাটালগ ফিড স্ক্রিন এবং সিঙ্ক) সক্রিয় করুন। ডিফল্টভাবে বন্ধ; সক্রিয় করলে কেবল UI উন্মুক্ত হয়—ডেটা সিঙ্কের জন্য আলাদাভাবে সম্মতি দিতে হয়। | - -### রানটাইম (32) - -| কী | ধরন | ডিফল্ট | রিস্টার্ট | বিবরণ | -| ------------------------------------------- | -------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | বুলিয়ান | `true` | | কম্বো রাউটিং মডেল পরিবর্তন করলে কথোপকথনের সারাংশ তৈরি ও ইনজেক্ট করুন। মডেল পরিবর্তনগুলোকে স্বতন্ত্রভাবে বিবেচনা করতে এবং বিদ্যমান ও ভবিষ্যতের সব কম্বোর জন্য ব্যাকগ্রাউন্ড হ্যান্ডঅফ অনুরোধ প্রতিরোধ করতে এটি নিষ্ক্রিয় করুন। | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | বুলিয়ান | `true` | | ক্লায়েন্টদের কাছে ফরওয়ার্ড করার আগে Responses API পাসথ্রু স্ট্রিম থেকে অভ্যন্তরীণ commentary-পর্যায়ের আউটপুট আইটেম বাদ দিন। অপরিবর্তিত আপস্ট্রিম commentary পেতে এটি নিষ্ক্রিয় করুন। | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | বুলিয়ান | `true` | | MCP টুল অ্যাক্সেসে স্কোপ-সংক্রান্ত বিধিনিষেধ প্রয়োগ করুন। | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | বুলিয়ান | `false` | | টোকেনের ব্যবহার কমাতে MCP টুলের বিবরণ সংকুচিত করুন। | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | বুলিয়ান | `false` | | রানটাইমে ব্যাকগ্রাউন্ড টাস্ক প্রক্রিয়াকরণ সক্রিয় করুন। | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | বুলিয়ান | `false` | ✓ | সব ব্যাকগ্রাউন্ড পরিষেবা (কোটা রিফ্রেশ, সিঙ্ক ইত্যাদি) নিষ্ক্রিয় করুন। | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | বুলিয়ান | `false` | | যাচাই ছাড়াই প্রকল্প-স্তরের RTK ফিল্টারকে বিশ্বাস করুন। | -| `OMNIROUTE_ENABLE_LIVE_WS` | বুলিয়ান | `true` | ✓ | ইমপোর্টের সময় রিয়েল-টাইম ড্যাশবোর্ড WebSocket সার্ভার চালু করুন (ডিফল্ট পোর্ট 20132)। | -| `OMNIROUTE_CODEX_WS_ENABLED` | বুলিয়ান | `true` | | Codex-কে Responses-over-WebSocket ট্রান্সপোর্ট ব্যবহার করার অনুমতি দিন। বন্ধ থাকলে Codex HTTP Responses-এ ফিরে যায়। | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | বুলিয়ান | `true` | | Codex-কে স্থানীয় app-server WebSocket JSON-RPC ট্রান্সপোর্ট (`codexTransport=app-server`) ব্যবহার করার অনুমতি দিন। বন্ধ থাকলে app-server বেছে নেওয়া সংযোগগুলো Codex-এর অন্যান্য ট্রান্সপোর্টে ফিরে যায়। | -| `OMNIROUTE_EMERGENCY_FALLBACK` | বুলিয়ান | `true` | | বাজেট-শেষ-হওয়া অনুরোধগুলো জরুরি বিনামূল্যের ফলব্যাক প্রদানকারী/মডেলে রাউট করুন। (নিচে [জরুরি বাজেট ফলব্যাক](#emergency-budget-fallback) দেখুন।) | -| `STREAM_RECOVERY_ENABLED` | বুলিয়ান | `false` | | কোনো রেসপন্স বাইট ক্লায়েন্টের কাছে পৌঁছানোর আগে ছেঁটে যাওয়া আপস্ট্রিম SSE স্ট্রিমের জন্য স্বচ্ছ প্রাথমিক পুনঃচেষ্টা সক্রিয় করুন। | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | বুলিয়ান | `false` | | বাইট ইতিমধ্যে ক্লায়েন্টের কাছে পৌঁছে যাওয়ার পর স্ট্রিম পুনরুদ্ধারকে পুনরায় অনুরোধ করতে এবং রেসপন্স জোড়া লাগাতে দিন। | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | বুলিয়ান | `false` | | স্ট্রিমের মাঝপথের ধারাবাহিকতাকে টুল-কলের জন্য নিরাপদ করুন: কোনো টুল কল নির্গত হওয়ার পর (চলমান অবস্থায় বা `finish_reason` `tool_calls` দিয়ে ইতিমধ্যে শেষ হয়ে গেলে) কাটা স্ট্রিম কখনো পুনরায় শুরু করবেন না, এবং পুরো বাজেট খরচ করার বদলে একটি খালি ধারাবাহিকতার পর বন্ধ করুন। বন্ধ: রিলিজের আচরণ। | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | বুলিয়ান | `false` | | কোনো কার্যকর ফ্রেম নির্গত হওয়ার আগে SSE স্ট্রিম বন্ধ হয়ে গেলে এবং একই সংযোগে সীমাবদ্ধ পুনঃচেষ্টা শেষ হয়ে গেলে, একবার একটি সিবলিং সংযোগে ফেইলওভার করুন; ব্যবহারযোগ্য সিবলিং না থাকলে মূল `STREAM_EARLY_EOF` 502 ফেরত দেওয়া হয়। ডিফল্টভাবে বন্ধ: একই সংযোগে পুনঃচেষ্টার পর early-EOF চূড়ান্ত থাকে। | -| `MODEL_CATALOG_INCLUDE_NAMES` | বুলিয়ান | `true` | | `/v1/models` রেসপন্সে প্রদর্শন-বান্ধব নামের ফিল্ড অন্তর্ভুক্ত করুন। যেসব ক্লায়েন্ট শুধু মডেল ID প্রত্যাশা করে তাদের জন্য এটি নিষ্ক্রিয় করুন। | -| `MODELS_CATALOG_PREFIX_MODE` | এনাম | `dual` | | /v1/models-এ মডেল ID কীভাবে প্রিফিক্স করা হয় তা নিয়ন্ত্রণ করে। পশ্চাৎ-সামঞ্জস্যের জন্য 'dual' (ডিফল্ট) অ্যালিয়াস এবং ক্যানোনিক্যাল provider-id—উভয় প্রিফিক্স নির্গত করে। 'alias' শুধু সংক্ষিপ্ত অ্যালিয়াস প্রিফিক্স নির্গত করে (যেমন ds-web/model, deepseek-web/model নয়)। 'canonical' শুধু পূর্ণ provider-id প্রিফিক্স নির্গত করে। মান: `dual`, `alias`, `canonical`। | -| `ARENA_ELO_SYNC_ENABLED` | বুলিয়ান | `true` | | মডেল ইন্টেলিজেন্স র্যাঙ্কিংয়ের জন্য পর্যায়ক্রমিক Arena AI লিডারবোর্ড ELO সিঙ্ক সক্রিয় করুন। | -| `EXPOSE_CC_DISCOVERY_ALIASES` | বুলিয়ান | `false` | | `/v1/models`-এ `claude//` মিরর ID প্রচার করুন, যাতে Claude Code গেটওয়ে মডেল আবিষ্কার নন-Claude মডেলগুলো তালিকাভুক্ত করে। তিন-স্তরীয় গেটের গ্লোবাল স্তর (env ড্যাশবোর্ড ওভাররাইডের ওপর অগ্রাধিকার পায়)। [Claude Code কনফিগারেশন](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) দেখুন। | -| `NO_THINKING_ALIAS_ENABLED` | বুলিয়ান | `true` | | no-think// গেটওয়ে অ্যালিয়াসগুলোর মাস্টার সুইচ। চালু (ডিফল্ট): /v1/models প্রতিটি যোগ্য চিন্তন-সক্ষম Claude মডেলের জন্য একটি no-thinking ভ্যারিয়েন্ট প্রচার করে এবং কোনো অনুরোধে পাঠানো no-think/ ID-কে reasoning দমন করে প্রকৃত মডেলে পুনরায় সমাধান করে। বন্ধ: কোনো ভ্যারিয়েন্ট প্রচার করা হয় না এবং no-think/ ID-কে অন্য যেকোনো অজানা মডেল ID-এর মতো বিবেচনা করা হয়। এটি চালু থাকা অবস্থায়ও প্রতি-মডেলের ModelSpec.noThinkingAlias অপ্ট-ইন/অপ্ট-আউট প্রযোজ্য থাকে। | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | বুলিয়ান | `false` | | /v1/models ক্যাটালগে চিন্তন-স্তরের ভ্যারিয়েন্ট (যেমন -low, -medium, -high) তৈরি করা নিষ্ক্রিয় করুন। | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | বুলিয়ান | `false` | ✓ | প্রদানকারী ডিসপ্যাচের জন্য প্রতি-টেন্যান্ট অভিযোজিত ভার্চুয়াল অ্যাডমিশন লেন সক্রিয় করুন (#9654): একটি টেন্যান্টের আকস্মিক চাপ আর অন্যটির জন্য 503 ঘটায় না। `OMNIROUTE_CHAT_VIRTUAL_LANES` env var এই ড্যাশবোর্ড ওভাররাইডের ওপর অগ্রাধিকার পায়; পরিবর্তনগুলো সার্ভার রিস্টার্টে কার্যকর হয়। | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | বুলিয়ান | `false` | | যেসব মডেলের ক্যানোনিক্যাল মালিকের কোনো সক্রিয় ক্রেডেনশিয়াল নেই, কিন্তু সক্রিয় ক্রেডেনশিয়ালসহ একটি পাসথ্রু গেটওয়ে সেগুলো রাউট করে, তাদের জন্য /v1/models-এ / মিরর ID প্রচার করুন। সতর্কতা: গ্লোবালি সক্রিয় করলে সব ক্লায়েন্টের জন্য ক্যাটালগ এন্ট্রি যোগ হয়। | -| `NEWAPI_AGGREGATOR_BALANCE` | বুলিয়ান | `false` | | New-API / One-API / Sub2API অ্যাগ্রিগেটর-সামঞ্জস্যপূর্ণ নোডের জন্য ব্যালেন্স শনাক্তকরণ সক্রিয় করুন। সক্রিয় থাকলে অ্যাগ্রিগেটর ফ্ল্যাগ সেট করা সামঞ্জস্যপূর্ণ নোডগুলো ড্যাশবোর্ড এবং কোটা-প্রীফ্লাইট রাউটিংয়ে তাদের ব্যালেন্স রিপোর্ট করবে। | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | বুলিয়ান | `false` | | মডেল ক্লায়েন্টের ব্যবহারযোগ্য রেসপন্স না দেওয়া পর্যন্ত নন-স্ট্রিমিং সার্ভার-মালিকানাধীন টুল কল চালিয়ে যান। | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | বুলিয়ান | `false` | | অনুসন্ধান পরিসংখ্যান এবং সাম্প্রতিক অনুসন্ধানে শুধু সেই প্রদানকারীদের গণনা করুন যাদের এখনও সক্রিয় সংযোগ আছে (duckduckgo-free-এর মতো কী-বিহীন প্রদানকারীরা সব সময় গণনা হয়)। বন্ধ থাকলে provider ID-সহ সংরক্ষিত প্রতিটি অনুসন্ধান সারি রাখা হয়। | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | বুলিয়ান | `false` | | ড্যাশবোর্ডের প্রদানকারী পৃষ্ঠা: শুধু প্রদানকারী যে সংকেতগুলো মান্য করে সেগুলোর ভিত্তিতে Free ব্যাজ দেখান—নথিভুক্ত ফ্রি টিয়ারবিহীন নিবন্ধিত প্রদানকারীদের ক্ষেত্রে display-name হিউরিস্টিক, নন-বুলিয়ান free ফিল্ড এবং :free সাফিক্স বাদ দেওয়া হয়। বন্ধ থাকলে ঐতিহাসিক ব্যাজের নিয়ম বজায় থাকে। | -| `RETRY_AFTER_PROVENANCE_ENABLED` | বুলিয়ান | `false` | | সমন্বিত 429/503 অনুপলভ্য রেসপন্সে কোনো সুনির্দিষ্ট ভবিষ্যৎ পুনঃচেষ্টার সময় জানা না থাকলে কৃত্রিম 1s-এর বদলে `Retry-After` বাদ দিন, `error.retry_after_provenance` (`signal` \| `none`) যোগ করুন এবং কম্বো ড্রেইন পাথকে JSON ও প্লেইন-টেক্সট আপস্ট্রিম বডি থেকে গদ্যধর্মী পুনঃচেষ্টা ইঙ্গিত পড়তে দিন। ফিল্ডটি শুধু `unavailableResponse()` দ্বারা তৈরি রেসপন্সে দেখা যায়; অন্যান্য 429/503 বডি অপরিবর্তিত থাকে। | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | বুলিয়ান | `false` | | `priority` কম্বোর কোনো টার্গেট, যা শুধু কোটা শেষ হলে ফলব্যাক হিসেবে চিহ্নিত, প্রমাণযোগ্যভাবে কোটা-সংক্রান্ত নয় এমন কারণে (প্রদানকারীর সার্কিট ব্রেকার খোলা, পূর্বাভাসিত লেটেন্সির কারণে এড়িয়ে যাওয়া) কম্বো থামালে কোটা-সদৃশ 503-এর বদলে 502 দিয়ে উত্তর দিন। লকআউট, কুলডাউন, অনুপলভ্যতা, নিঃশেষ হওয়া এবং concurrency-cap-এর কারণে থামলে 503 বজায় থাকে। | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | বুলিয়ান | `false` | | একটি খালি Mistral 401 (`{"detail":"Unauthorized"}`, কোনো স্পষ্ট auth সংকেত নেই) বাতিল করা কী এবং নিঃশেষিত কোটা—উভয়ের ক্ষেত্রেই অভিন্ন। চালু থাকলে সংযোগটিকে `expired` হিসেবে পার্ক করার বদলে কুলডাউনে রাখে, প্রতি সংযোগে প্রতি ঘণ্টায় সর্বোচ্চ 3 বার; পরেরবার এটি পার্ক করে, ফলে বাতিল করা কী শেষ পর্যন্ত স্থিতিশীল অবস্থায় পৌঁছে যায়। ডিফল্টভাবে বন্ধ: আগের মতো প্রতিটি খালি Mistral 401 সংযোগটিকে পার্ক করে। | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | বুলিয়ান | `false` | | স্থির স্ট্যাটিক সিডের বদলে OAuth bearer token ব্যবহার করে `https://api.x.ai/v1/models` থেকে `xai-oauth` সংযোগের জন্য লাইভ xAI মডেল ক্যাটালগ আনুন। ডিফল্টভাবে বন্ধ: `xai-oauth` অপরিবর্তিত স্ট্যাটিক সিড পরিবেশন করতে থাকে। যেকোনো রেজোলিউশন ত্রুটিতে আবিষ্কার প্রক্রিয়া সিডে ফিরে যায় (এই এন্ডপয়েন্টে x.ai OAuth bearer গ্রহণ করে কি না তা যাচাই করা হয়নি)। | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | বুলিয়ান | `false` | | স্বয়ংক্রিয় ক্লিনআপ সুইপকে `OMNIROUTE_BATCH_RETENTION_DAYS`-এর চেয়ে পুরোনো চূড়ান্ত (সম্পন্ন/ব্যর্থ/বাতিল/মেয়াদোত্তীর্ণ) Batch API জব এবং তাদের প্রতি-লাইনের চেকপয়েন্ট মুছে ফেলতে দিন, পাশাপাশি নিজস্ব `expires_at` অতিক্রম করা আপলোড করা ফাইলগুলোর BLOB কনটেন্ট পরিষ্কার করতে দিন। ডিফল্টভাবে বন্ধ: কোনো অপারেটর অপ্ট-ইন না করা পর্যন্ত প্রতিটি বিদ্যমান ইনস্টল আগের মতোই এই ডেটা সংরক্ষণ করে। অপারেটর-ট্রিগার করা `DELETE /api/v1/batches/delete-completed` রুট উভয় অবস্থাতেই প্রভাবমুক্ত—এটি একটি পৃথক, শর্তহীন পাবলিক API চুক্তি। | +| কী | ধরন | ডিফল্ট | বিবরণ | +| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | টুল-ব্যবহারের নীতি প্রয়োগের মোড। মান: `disabled`, `warn`, `block`। | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | ব্যবহারের ধরন অনুযায়ী স্বয়ংক্রিয়ভাবে রেট লিমিটিং সক্রিয় করুন। | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | সরাসরি একক-মডেল অনুরোধের জন্য OmniRoute-এর স্থানীয় কনটেক্সট-উইন্ডো / সর্বোচ্চ-ইনপুট-টোকেন যাচাই এড়িয়ে যান। আপস্ট্রিম সীমা এখনও প্রযোজ্য। | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | লক্ষ্য মডেলে প্রয়োজনীয় সক্ষমতা (ভিশন, টুল, কাঠামোবদ্ধ আউটপুট, কনটেক্সট উইন্ডো) না থাকলে প্রেরণের আগে অনুরোধ প্রত্যাখ্যান করুন। এটি কম্বো-লেয়ারের সামঞ্জস্য ফিল্টার এড়িয়ে যাওয়া সরাসরি একক-প্রোভাইডার অনুরোধগুলোকে সুরক্ষিত রাখে। | +| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar মডিউল (ক্যাটালগ ফিড স্ক্রিন ও সিঙ্ক) সক্রিয় করুন। ডিফল্টভাবে বন্ধ; সক্রিয় করলে শুধু UI উন্মুক্ত হয়—ডেটা সিঙ্কের জন্য এখনও আলাদাভাবে সম্মতি দিতে হবে। | + +### রানটাইম (33) + +| কী | ধরন | ডিফল্ট | পুনরারম্ভ | বিবরণ | +| ------------------------------------------- | -------- | ------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | বুলিয়ান | `true` | | কম্বো রাউটিং মডেল পরিবর্তন করলে কথোপকথনের সারাংশ তৈরি ও ইনজেক্ট করুন। মডেল পরিবর্তনগুলোকে স্বতন্ত্রভাবে বিবেচনা করতে এবং বিদ্যমান ও ভবিষ্যতের সব কম্বোর জন্য ব্যাকগ্রাউন্ড হ্যান্ডঅফ অনুরোধ প্রতিরোধ করতে এটি নিষ্ক্রিয় করুন। | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | বুলিয়ান | `true` | | ক্লায়েন্টদের কাছে ফরওয়ার্ড করার আগে Responses API পাসথ্রু স্ট্রিম থেকে অভ্যন্তরীণ commentary-পর্যায়ের আউটপুট আইটেমগুলো বাদ দিন। অপরিবর্তিত আপস্ট্রিম commentary পেতে এটি নিষ্ক্রিয় করুন। | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | বুলিয়ান | `true` | | MCP টুল অ্যাক্সেসে স্কোপ-সংক্রান্ত বিধিনিষেধ প্রয়োগ করুন। | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | বুলিয়ান | `false` | | টোকেন ব্যবহার কমাতে MCP টুলের বিবরণগুলো সংকুচিত করুন। | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | বুলিয়ান | `false` | | রানটাইমে ব্যাকগ্রাউন্ড টাস্ক প্রক্রিয়াকরণ সক্রিয় করুন। | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | বুলিয়ান | `false` | ✓ | সব ব্যাকগ্রাউন্ড সার্ভিস (কোটা রিফ্রেশ, সিঙ্ক ইত্যাদি) নিষ্ক্রিয় করুন। | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | যাচাই ছাড়াই প্রকল্প-স্তরের RTK ফিল্টারগুলিকে বিশ্বাস করুন। | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | ইমপোর্টের সময় রিয়েল-টাইম ড্যাশবোর্ড WebSocket সার্ভার চালু করুন (ডিফল্টভাবে পোর্ট 20132)। | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex-কে Responses-over-WebSocket ট্রান্সপোর্ট ব্যবহার করার অনুমতি দিন। বন্ধ থাকলে, Codex HTTP Responses-এ ফিরে যায়। | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex-কে স্থানীয় app-server WebSocket JSON-RPC ট্রান্সপোর্ট (`codexTransport=app-server`) ব্যবহার করার অনুমতি দিন। বন্ধ থাকলে, app-server ব্যবহারের জন্য নির্বাচিত সংযোগগুলি Codex-এর অন্যান্য ট্রান্সপোর্টে ফিরে যায়। | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | বাজেট শেষ হয়ে যাওয়া অনুরোধগুলিকে জরুরি বিনামূল্যের ফলব্যাক প্রদানকারী/মডেলে রাউট করুন। (নিচে [জরুরি বাজেট ফলব্যাক](#emergency-budget-fallback) দেখুন।) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | কোনো রেসপন্স বাইট ক্লায়েন্টের কাছে পৌঁছানোর আগেই অসম্পূর্ণভাবে বিচ্ছিন্ন আপস্ট্রিম SSE স্ট্রিমের জন্য স্বচ্ছ প্রাথমিক পুনঃচেষ্টা সক্রিয় করুন। | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | বাইট ইতিমধ্যে ক্লায়েন্টের কাছে পৌঁছে যাওয়ার পরে পুনরায় অনুরোধ করে রেসপন্স জোড়া লাগানোর জন্য স্ট্রিম পুনরুদ্ধারের অনুমতি দিন। | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | মধ্য-স্ট্রিম ধারাবাহিকতাকে টুল-কল নিরাপদ করুন: কোনো টুল কল নির্গত হয়ে গেলে (চলমান অবস্থায় বা ইতিমধ্যে `finish_reason` `tool_calls` দিয়ে শেষ হয়ে থাকলে) কখনোই বিচ্ছিন্ন স্ট্রিম পুনরায় শুরু করবেন না, এবং সম্পূর্ণ বাজেট ব্যয় করার পরিবর্তে একটি খালি ধারাবাহিকতার পর বন্ধ করুন। বন্ধ: রিলিজ আচরণ। | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | কোনো SSE স্ট্রিম কোনো কার্যকর ফ্রেম নির্গত করার আগেই বন্ধ হয়ে গেলে এবং একই সংযোগে সীমিত পুনঃচেষ্টা শেষ হয়ে গেলে, একবার একটি সমজাতীয় সংযোগে ফেইলওভার করুন; ব্যবহারযোগ্য সমজাতীয় সংযোগ না থাকলে মূল `STREAM_EARLY_EOF` 502 ফেরত দেওয়া হয়। ডিফল্টভাবে বন্ধ: একই সংযোগে পুনঃচেষ্টার পর early-EOF চূড়ান্ত থাকে। | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` প্রতিক্রিয়ায় প্রদর্শনবান্ধব নামের ফিল্ড অন্তর্ভুক্ত করুন। যেসব ক্লায়েন্ট শুধু মডেল ID প্রত্যাশা করে, তাদের জন্য এটি নিষ্ক্রিয় করুন। | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | /v1/models-এ মডেল ID-গুলো কীভাবে প্রিফিক্স করা হবে তা নিয়ন্ত্রণ করে। পশ্চাৎমুখী সামঞ্জস্যের জন্য 'dual' (ডিফল্ট) উপনাম ও ক্যানোনিক্যাল provider-id—উভয় প্রিফিক্সই নির্গত করে। 'alias' শুধু সংক্ষিপ্ত উপনাম প্রিফিক্স নির্গত করে (যেমন ds-web/model, deepseek-web/model নয়)। 'canonical' শুধু পূর্ণ provider-id প্রিফিক্স নির্গত করে। মানসমূহ: `dual`, `alias`, `canonical`। | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | মডেলের বুদ্ধিমত্তা র্যাঙ্কিংয়ের জন্য পর্যায়ক্রমিক Arena AI লিডারবোর্ড ELO সিঙ্ক সক্রিয় করুন। | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `/v1/models`-এ `claude//` মিরর ID-গুলোর প্রচার করুন, যাতে Claude Code গেটওয়ের মডেল ডিসকভারিতে Claude-বহির্ভূত মডেলগুলো তালিকাভুক্ত হয়। তিন-স্তরীয় গেটের গ্লোবাল স্তর (env ড্যাশবোর্ড ওভাররাইডের ওপর অগ্রাধিকার পায়)। [Claude Code কনফিগারেশন](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) দেখুন। | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// গেটওয়ে উপনামগুলোর মাস্টার সুইচ। চালু (ডিফল্ট): /v1/models প্রতিটি উপযুক্ত চিন্তা-সক্ষম Claude মডেলের জন্য একটি no-thinking ভ্যারিয়েন্ট প্রচার করে, এবং কোনো অনুরোধে পাঠানো no-think/ ID-কে reasoning দমন করে প্রকৃত মডেলে পুনরায় সমাধান করা হয়। বন্ধ: কোনো ভ্যারিয়েন্ট প্রচার করা হয় না এবং একটি no-think/ ID-কে অন্য যেকোনো অজানা মডেল ID-এর মতো বিবেচনা করা হয়। এটি চালু থাকলেও প্রতি-মডেলের ModelSpec.noThinkingAlias অপ্ট-ইন/অপ্ট-আউট প্রযোজ্য থাকে। | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | /v1/models ক্যাটালগে thinking level ভ্যারিয়েন্ট (যেমন -low, -medium, -high) তৈরি করা নিষ্ক্রিয় করুন। | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | প্রোভাইডার ডিসপ্যাচের জন্য প্রতি-টেন্যান্ট অভিযোজিত ভার্চুয়াল অ্যাডমিশন লেন সক্রিয় করুন (#9654): এক টেন্যান্টের আকস্মিক ট্রাফিক বৃদ্ধি আর অন্য টেন্যান্টের জন্য 503 সৃষ্টি করবে না। `OMNIROUTE_CHAT_VIRTUAL_LANES` env var এই ড্যাশবোর্ড ওভাররাইডের ওপর অগ্রাধিকার পায়; পরিবর্তনগুলো সার্ভার পুনরায় চালু হলে কার্যকর হয়। | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | যেসব মডেলের ক্যানোনিক্যাল মালিকের কোনো সক্রিয় ক্রেডেনশিয়াল নেই, কিন্তু সক্রিয় ক্রেডেনশিয়ালসহ একটি পাসথ্রু গেটওয়ে সেগুলোকে রাউট করে, সেই মডেলগুলোর জন্য /v1/models-এ / মিরর আইডি প্রকাশ করুন। সতর্কতা: বিশ্বব্যাপী সক্রিয় করা হলে এটি সব ক্লায়েন্টের জন্য ক্যাটালগ এন্ট্রি যোগ করে। | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API অ্যাগ্রিগেটর-সামঞ্জস্যপূর্ণ নোডগুলোর জন্য ব্যালেন্স শনাক্তকরণ সক্রিয় করুন। সক্রিয় থাকলে, অ্যাগ্রিগেটর ফ্ল্যাগ সেট করা সামঞ্জস্যপূর্ণ নোডগুলো ড্যাশবোর্ড এবং কোটা-প্রীফ্লাইট রাউটিংয়ে তাদের ব্যালেন্স রিপোর্ট করবে। | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | মডেলটি ক্লায়েন্টের ব্যবহারযোগ্য প্রতিক্রিয়া না দেওয়া পর্যন্ত নন-স্ট্রিমিং সার্ভার-মালিকানাধীন টুল কল চালিয়ে যান। | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | সার্চ পরিসংখ্যান এবং সাম্প্রতিক সার্চগুলো কেবল সেইসব প্রোভাইডারকে গণনা করে, যাদের এখনও একটি সক্রিয় কানেকশন আছে (duckduckgo-free-এর মতো কী-বিহীন প্রোভাইডার সবসময় গণনা করা হয়)। বন্ধ থাকলে, প্রোভাইডার আইডিসহ সংরক্ষিত প্রতিটি সার্চ সারি রাখা হয়। | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | ড্যাশবোর্ডের প্রোভাইডার পৃষ্ঠা: কেবল প্রোভাইডার সমর্থন করে এমন সিগন্যালগুলোর ক্ষেত্রেই Free ব্যাজ দেখান—নথিভুক্ত ফ্রি টিয়ার ছাড়া নিবন্ধিত প্রোভাইডারগুলোর জন্য ডিসপ্লে-নেম হিউরিস্টিক, নন-বুলিয়ান ফ্রি ফিল্ড এবং :free সাফিক্স বাদ দেওয়া হয়। বন্ধ থাকলে ঐতিহাসিক ব্যাজের নিয়ম বজায় থাকে। | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | সমন্বিত 429/503 unavailable প্রতিক্রিয়ায়, নির্দিষ্ট কোনো ভবিষ্যৎ পুনঃচেষ্টার সময় জানা না থাকলে কৃত্রিম 1s-এর পরিবর্তে `Retry-After` বাদ দিন, `error.retry_after_provenance` (`signal` \| `none`) যোগ করুন এবং কম্বো ড্রেইন পাথগুলোকে JSON ও প্লেইন-টেক্সট আপস্ট্রিম বডি থেকে গদ্যে লেখা পুনঃচেষ্টার ইঙ্গিত পড়তে দিন। ফিল্ডটি শুধু `unavailableResponse()` দ্বারা তৈরি প্রতিক্রিয়ায় দেখা যায়; অন্যান্য 429/503 বডি অপরিবর্তিত থাকে। | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | কোটা নিঃশেষ হলেই শুধু ফলব্যাক হিসেবে চিহ্নিত কোনো `priority` কম্বো টার্গেট যখন এমন কোনো কারণে কম্বো থামায় যা নিশ্চিতভাবে কোটা-সম্পর্কিত নয় (প্রোভাইডার সার্কিট ব্রেকার খোলা, পূর্বাভাসভিত্তিক লেটেন্সি স্কিপ), তখন কোটা-সদৃশ 503-এর পরিবর্তে 502 দিয়ে উত্তর দিন। লকআউট, কুলডাউন, unavailable, নিঃশেষ হওয়া এবং কনকারেন্সি-ক্যাপজনিত বন্ধের ক্ষেত্রে 503 বজায় থাকে। | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | একটি সাধারণ Mistral 401 (`{"detail":"Unauthorized"}`, কোনো সুস্পষ্ট অথ সিগন্যাল নেই) বাতিল করা কী এবং নিঃশেষিত কোটার ক্ষেত্রে একই রকম। এটি চালু থাকলে, কানেকশনটিকে `expired` হিসেবে পার্ক করার পরিবর্তে কুলডাউনে রাখা হয়—প্রতি কানেকশনে প্রতি ঘণ্টায় সর্বোচ্চ 3 বার; পরেরবার এটিকে পার্ক করা হয়, ফলে বাতিল করা কী শেষ পর্যন্ত স্থায়ীভাবে পার্ক হয়। ডিফল্টভাবে বন্ধ: আগের মতো প্রতিটি সাধারণ Mistral 401 কানেকশনটিকে পার্ক করে। | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | স্থির স্ট্যাটিক সিডের পরিবর্তে OAuth bearer token ব্যবহার করে `https://api.x.ai/v1/models` থেকে `xai-oauth` সংযোগগুলোর জন্য লাইভ xAI মডেল ক্যাটালগ আনুন। ডিফল্টভাবে বন্ধ: `xai-oauth` অপরিবর্তিতভাবে স্ট্যাটিক সিড পরিবেশন করতে থাকে। রেজোলিউশনে কোনো ত্রুটি হলে, ডিসকভারি সিডে ফিরে যায় (এই এন্ডপয়েন্টে x.ai কোনো OAuth bearer গ্রহণ করে কি না তা যাচাই করা হয়নি)। | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | স্বয়ংক্রিয় ক্লিনআপ সুইপকে `OMNIROUTE_BATCH_RETENTION_DAYS`-এর চেয়ে পুরোনো টার্মিনাল (সম্পন্ন/ব্যর্থ/বাতিল/মেয়াদোত্তীর্ণ) Batch API জব এবং সেগুলোর প্রতি-লাইনের চেকপয়েন্ট মুছে ফেলতে দিন, পাশাপাশি নিজস্ব `expires_at` অতিক্রম করা আপলোড করা ফাইলগুলোর BLOB কনটেন্ট পরিষ্কার করতে দিন। ডিফল্টভাবে বন্ধ: কোনো অপারেটর চালু করার সিদ্ধান্ত না নেওয়া পর্যন্ত প্রতিটি বিদ্যমান ইনস্টলেশন এই ডেটা ঠিক আগের মতোই রাখে। অপারেটর-ট্রিগার করা `DELETE /api/v1/batches/delete-completed` রুট উভয় ক্ষেত্রেই অপরিবর্তিত থাকে — এটি একটি পৃথক, শর্তহীন পাবলিক API চুক্তি। | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | নির্বাচিত Antigravity অ্যাকাউন্টটিকে যে অনুরোধটি এটি বেছে নিয়েছে তার স্ট্রিমিং লাইফসাইকেলের জন্য সংরক্ষিত রাখুন, যাতে সমসাময়িক রিট্রাই বা ক্রেডেনশিয়াল হ্যান্ডঅফ ইতিমধ্যে চলমান কোনো স্ট্রিমে নিবেদিত অ্যাকাউন্টকে পুনরায় বেছে নিতে না পারে। সংরক্ষণটি (সংযোগ, কলযোগ্য আপস্ট্রিম মডেল)-এর পরিসরে সীমাবদ্ধ, তাই একটি অ্যাকাউন্ট একই সময়ে দুটি ভিন্ন মডেলকে সেবা দিতে পারে। সেই মডেলের জন্য প্রতিটি যোগ্য অ্যাকাউন্ট ইতিমধ্যে লিজ নেওয়া থাকলে, অনুরোধটি ব্যস্ত কোনো অ্যাকাউন্টে জমা হওয়ার পরিবর্তে সীমাবদ্ধ `Retry-After`-সহ একটি কাঠামোবদ্ধ 503 `antigravity_pool_busy` ফেরত দেয়। ডিফল্টভাবে বন্ধ: অ্যাকাউন্ট নির্বাচন ঠিক আগের মতোই থাকে এবং কোনো সংরক্ষণ নেওয়া হয় না। | ### CLI (5) -| কী | ধরন | ডিফল্ট | পুনরারম্ভ | বিবরণ | -| ------------------------------------- | ------- | ------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | সব CLI ক্লায়েন্টের জন্য সামঞ্জস্য মোড সক্রিয় করুন। | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | মডেল অ্যালিয়াস সামঞ্জস্য স্তর সক্রিয় করুন। | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | মূল্য-সংক্রান্ত ডেটার স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন সক্রিয় করুন (এর জন্য `PRICING_SYNC_ENABLED` এনভায়রনমেন্ট ভেরিয়েবলটিও প্রয়োজন)। | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | কোনো প্রোভাইডার মডেল সিঙ্কের পর, লাইভ ক্যাটালগ থেকে স্বয়ংক্রিয়ভাবে ~/.codex/*.config.toml প্রোফাইল ফাইল (পুনরায়) লিখুন। সক্রিয়/ডিফল্ট Codex কনফিগ কখনো পরিবর্তন করে না। ডিফল্টভাবে বন্ধ। | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | কোনো প্রোভাইডার মডেল সিঙ্কের পর, লাইভ ক্যাটালগ থেকে স্বয়ংক্রিয়ভাবে ~/.claude/profiles//settings.json Claude Code প্রোফাইল (পুনরায়) লিখুন। সক্রিয়/ডিফল্ট Claude কনফিগ কখনো পরিবর্তন করে না। ডিফল্টভাবে বন্ধ। | +| কী | ধরন | ডিফল্ট | রিস্টার্ট | বিবরণ | +| ------------------------------------- | ------- | ------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | সব CLI ক্লায়েন্টের জন্য সামঞ্জস্যতা মোড সক্রিয় করুন। | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | মডেল অ্যালিয়াস সামঞ্জস্যতা স্তর সক্রিয় করুন। | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | স্বয়ংক্রিয় মূল্য-সংক্রান্ত ডেটা সিঙ্ক্রোনাইজেশন সক্রিয় করুন (এটির জন্য `PRICING_SYNC_ENABLED` এনভায়রনমেন্ট ভেরিয়েবলও প্রয়োজন)। | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | কোনো প্রোভাইডার মডেল সিঙ্কের পরে, লাইভ ক্যাটালগ থেকে স্বয়ংক্রিয়ভাবে ~/.codex/*.config.toml প্রোফাইল ফাইল (পুনরায়) লিখুন। সক্রিয়/ডিফল্ট Codex কনফিগ কখনো পরিবর্তন করে না। ডিফল্টভাবে বন্ধ। | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | কোনো প্রোভাইডার মডেল সিঙ্কের পরে, লাইভ ক্যাটালগ থেকে স্বয়ংক্রিয়ভাবে ~/.claude/profiles//settings.json Claude Code প্রোফাইল (পুনরায়) লিখুন। সক্রিয়/ডিফল্ট Claude কনফিগ কখনো পরিবর্তন করে না। ডিফল্টভাবে বন্ধ। | ### স্বাস্থ্য (5) -| কী | ধরন | ডিফল্ট | বিবরণ | -| ----------------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | লোকাল ইনস্ট্যান্সের স্বাস্থ্য পরীক্ষা এন্ডপয়েন্ট নিষ্ক্রিয় করুন। | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | টোকেন যাচাইকরণের স্বাস্থ্য পরীক্ষা নিষ্ক্রিয় করুন। | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | স্কিলস স্যান্ডবক্স পরিবেশে নেটওয়ার্ক অ্যাক্সেস সক্রিয় করুন। | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | প্রক্সি স্বাস্থ্য পরীক্ষায়, টার্গেট প্রত্যাখ্যান করেছে এমন একটি প্রোব (401/403/429) প্রক্সির ধারাবাহিক ব্যর্থতার ধারা রিসেট করে। ডিফল্টভাবে বন্ধ: একটি প্রত্যাখ্যান নিরপেক্ষ থাকে (#10654)। উভয় ক্ষেত্রেই একটি 5xx অনির্ণীত থাকে; কোনো প্রত্যাখ্যান কখনো প্রক্সি অপসারণ, নিষ্ক্রিয় বা পুনরায় সক্রিয় করে না। | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | স্টার্টআপ সম্পূর্ণ না হওয়া পর্যন্ত সেটি ব্লক করার পরিবর্তে, সার্ভার অনুরোধ গ্রহণ শুরু করার পর (`setImmediate`-এর মাধ্যমে) স্টার্টআপ DB অখণ্ডতা/স্বাস্থ্য পরীক্ষা চালান (#13717)। ডিফল্টভাবে বন্ধ: স্টার্টআপ এই PR-এর আগের মতোই ব্লক করে। | +| কী | ধরন | ডিফল্ট | বিবরণ | +| ----------------------------------------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | বুলিয়ান | `false` | স্থানীয় ইনস্ট্যান্সের স্বাস্থ্য পরীক্ষা এন্ডপয়েন্ট নিষ্ক্রিয় করে। | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | বুলিয়ান | `false` | টোকেন যাচাইকরণের স্বাস্থ্য পরীক্ষা নিষ্ক্রিয় করে। | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | বুলিয়ান | `false` | স্কিলস স্যান্ডবক্স পরিবেশে নেটওয়ার্ক অ্যাক্সেস সক্রিয় করে। | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | বুলিয়ান | `false` | প্রক্সি স্বাস্থ্য পরীক্ষায়, লক্ষ্য দ্বারা প্রত্যাখ্যাত (401/403/429) প্রোবটি প্রক্সির ধারাবাহিক ব্যর্থতার ধারা রিসেট করে। ডিফল্টরূপে বন্ধ: প্রত্যাখ্যান নিরপেক্ষ থাকে (#10654)। উভয় ক্ষেত্রেই 5xx অনির্ণায়ক থাকে; কোনো প্রত্যাখ্যান কখনোই প্রক্সি অপসারণ, নিষ্ক্রিয় বা পুনরায় সক্রিয় করে না। | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | বুলিয়ান | `false` | স্টার্টআপ সম্পূর্ণ না হওয়া পর্যন্ত ব্লক করার পরিবর্তে সার্ভার অনুরোধ গ্রহণ শুরু করার পর (`setImmediate`-এর মাধ্যমে) স্টার্টআপ DB অখণ্ডতা/স্বাস্থ্য পরীক্ষা চালায় (#13717)। ডিফল্টরূপে বন্ধ: এই PR-এর আগের মতোই স্টার্টআপ ব্লক হয়। | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` এবং এর লিগ্যাসি অ্যালিয়াস +> `INPUT_SANITIZER_BLOCK_THRESHOLD` এবং এর লিগ্যাসি উপনাম > `INJECTION_GUARD_BLOCK_THRESHOLD`, `INJECTION_GUARD_MODE`-এর `block` মোড -> সমন্বয় করে, তবে এগুলো সাধারণ এনভায়রনমেন্ট ভেরিয়েবল, যা -> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> দ্বারা পড়া হয়, ফিচার ফ্ল্যাগ নয়: এগুলোর কোনো DB ওভাররাইড বা ড্যাশবোর্ড টগল নেই। দেখুন +> সামঞ্জস্য করে, তবে এগুলো +> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) দ্বারা পড়া সাধারণ পরিবেশ চলক, +> ফিচার ফ্ল্যাগ নয়: এগুলোর কোনো DB ওভাররাইড বা ড্যাশবোর্ড টগল নেই। দেখুন > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication)। > [!NOTE] -> `পুনরারম্ভ` কলামটি `requiresRestart: true`-সহ ফ্ল্যাগগুলো চিহ্নিত করে—মানটি -> তাৎক্ষণিকভাবে সংরক্ষিত হয়, তবে প্রসেস পুনরায় লোড হওয়ার পরেই কার্যকর হয়। Enum -> ফ্ল্যাগ তাদের অনুমোদিত সেটের বাইরের যেকোনো মান প্রত্যাখ্যান করে (সার্ভার-সাইডে -> `setFeatureFlagOverride()` এবং REST `PUT` হ্যান্ডলার—উভয় ক্ষেত্রেই যাচাই করা হয়)। +> `Restart` কলামটি `requiresRestart: true`-সহ ফ্ল্যাগগুলো চিহ্নিত করে—মানটি +> তাৎক্ষণিকভাবে সংরক্ষিত হয়, কিন্তু প্রক্রিয়াটি পুনরায় লোড হওয়ার পরেই কার্যকর হয়। Enum +> ফ্ল্যাগগুলো তাদের অনুমোদিত সেটের বাইরের যেকোনো মান প্রত্যাখ্যান করে (সার্ভার-সাইডে +> `setFeatureFlagOverride()` এবং REST `PUT` হ্যান্ডলার—উভয় স্থানেই যাচাই করা হয়)। --- @@ -172,26 +172,26 @@ ### ড্যাশবোর্ড -**Dashboard → Settings → Feature Flags** -(`/dashboard/settings/feature-flags`)-এ যান। গ্রিডটি +**ড্যাশবোর্ড → সেটিংস → ফিচার ফ্ল্যাগস**-এ যান +(`/dashboard/settings/feature-flags`)। গ্রিডটি (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) -নিম্নলিখিত সুবিধা দেয়: +নিম্নলিখিত সুবিধাগুলো সমর্থন করে: - কী বা বিবরণ অনুযায়ী **অনুসন্ধান**, এবং বিভাগ অনুযায়ী **ফিল্টার** (সঙ্গে একটি কৃত্রিম - **Requires Restart** ভিউ)। + **রিস্টার্ট প্রয়োজন** ভিউ)। - বুলিয়ান ফ্ল্যাগের জন্য একটি **টগল** এবং enum ফ্ল্যাগের জন্য একটি **ড্রপডাউন** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`)। -- প্রতিটি ফ্ল্যাগের জন্য একটি **উৎস ব্যাজ** — `DB`, `ENV`, অথবা `DEF` — যা কার্যকর +- প্রতিটি ফ্ল্যাগের জন্য একটি **সোর্স ব্যাজ** — `DB`, `ENV`, অথবা `DEF` — যা কার্যকর মানটি কোথা থেকে এসেছে তা দেখায়। -- ওভাররাইডটি বাদ দেওয়ার জন্য একটি **Reset** বোতাম (শুধু `DB`-উৎসের ফ্ল্যাগের ক্ষেত্রে দেখানো হয়), - এবং নিচে একটি **Reset All Overrides** বোতাম। -- কোনো `requiresRestart` ফ্ল্যাগ পরিবর্তন করা হলে একটি **Restart Server** ব্যানার। +- ওভাররাইড বাদ দেওয়ার জন্য একটি **রিসেট** বোতাম (শুধু `DB`-উৎসের ফ্ল্যাগের জন্য প্রদর্শিত), + এবং নিচে একটি **সমস্ত ওভাররাইড রিসেট করুন** বোতাম। +- কোনো `requiresRestart` ফ্ল্যাগ পরিবর্তন করা হলে একটি **সার্ভার রিস্টার্ট করুন** ব্যানার। ### REST API -সব কার্যক্রম একটি একক রুটের মাধ্যমে সম্পন্ন হয়: +সব অপারেশন একটি একক রুটের মাধ্যমে সম্পন্ন হয়: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts)। -প্রতিটি মেথডের জন্য একটি প্রমাণীকৃত ড্যাশবোর্ড সেশন আবশ্যক (অন্যথায় `401`)। +প্রতিটি মেথডের জন্য একটি প্রমাণীকৃত ড্যাশবোর্ড সেশন প্রয়োজন (অন্যথায় `401`)। #### `GET /api/settings/feature-flags` @@ -213,7 +213,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... মোট 72টি ফ্ল্যাগ + // ... মোট 74টি ফ্ল্যাগ ], "summary": { "total": 56, @@ -227,8 +227,8 @@ #### `PUT /api/settings/feature-flags` -একটি ওভাররাইড সেট বা অপসারণ করে। বডি: `{ key: string; value?: string }`। -`value` বাদ দিলে ওভাররাইডটি অপসারিত হয় (env / ডিফল্ট পুনরুদ্ধার করে)। +একটি ওভাররাইড সেট করুন বা সরিয়ে দিন। বডি: `{ key: string; value?: string }`। +`value` বাদ দিলে ওভাররাইডটি সরিয়ে দেওয়া হয় (env / ডিফল্ট পুনরুদ্ধার করা হয়)। ```bash # একটি DB ওভাররাইড সেট করুন @@ -236,23 +236,23 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# ওভাররাইডটি অপসারণ করুন ("value" ছাড়া) +# ওভাররাইডটি সরিয়ে দিন (কোনো "value" নেই) curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -রেসপন্সটি নতুন `effectiveValue`/`source`, `previousValue`/ -`previousSource`, এবং `requiresRestart` প্রতিধ্বনিত করে। অজানা কী এবং সীমার বাইরের enum -মান `400` দিয়ে প্রত্যাখ্যান করা হয়। +রেসপন্সে নতুন `effectiveValue`/`source`, `previousValue`/ +`previousSource`, এবং `requiresRestart` প্রতিধ্বনিত হয়। অজানা কী এবং অনুমোদিত সীমার বাইরে থাকা enum +মানগুলো `400` সহ প্রত্যাখ্যান করা হয়। #### `DELETE /api/settings/feature-flags` -একবারে **সব** DB ওভাররাইড মুছে দেয় এবং প্রতিটি ফ্ল্যাগকে তার env / ডিফল্ট +একবারেই **সব** DB ওভাররাইড মুছে দেয় এবং প্রতিটি ফ্ল্যাগকে তার env / ডিফল্ট মানে পুনরুদ্ধার করে। `{ cleared: , message: "..." }` ফেরত দেয়। > [!NOTE] -> `requiresRestart: true`-সহ ফ্ল্যাগগুলো শুধু প্রসেস পুনরায় লোড করার পর কার্যকর হয়। +> `requiresRestart: true` থাকা ফ্ল্যাগগুলো শুধুমাত্র প্রসেস পুনরায় লোড করার পর কার্যকর হয়। > ড্যাশবোর্ডের রিস্টার্ট প্রবাহটি `POST /api/restart` কল করে এবং তারপর সার্ভার পুনরায় চালু না হওয়া পর্যন্ত > `GET /api/health/ping` পোল করে। diff --git a/docs/i18n/bn/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/bn/docs/reference/PROVIDER_REFERENCE.md index a78b240bc8b4..409db10d8a8f 100644 --- a/docs/i18n/bn/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/bn/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > `src/shared/constants/providers.ts` থেকে **স্বয়ংক্রিয়ভাবে তৈরি** — হাতে সম্পাদনা করবেন না। > পুনরায় তৈরি করুন: `npm run gen:provider-reference` -> **সর্বশেষ তৈরি:** 2026-09-17 +> **সর্বশেষ তৈরি:** 2026-09-18 -মোট প্রোভাইডার: **359**। নিচে বিভাগভিত্তিক বিভাজন দেখুন। +মোট প্রোভাইডার: **359**। নিচে বিভাগভিত্তিক বিবরণ দেখুন। ## বিভাগসমূহ @@ -32,49 +32,49 @@ --- -## প্রমাণীকরণ-বিহীন প্রদানকারী (কী প্রয়োজন নেই) (10) - -| ID | উপনাম | নাম | ট্যাগ | ওয়েবসাইট | নোট | টুল কলিং | -| ----------------------- | ---------- | ------------------------- | ----------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | -| `aihorde` | `horde` | AI Horde | প্রমাণীকরণ-বিহীন | [লিংক](https://aihorde.net) | কোনো API কী প্রয়োজন নেই — AI Horde-এর নথিভুক্ত অজ্ঞাতনামা কী ব্যবহার করে। একটি বিনামূল্যের aihorde.net কী যোগ করা ঐচ্ছিক এবং এটি শুধু কিউতে উচ্চতর অগ্রাধিকার (kudos) প্রদান করে। | — | -| `auggie` | `aug` | Augment (Auggie CLI) | প্রমাণীকরণ-বিহীন | [লিংক](https://augmentcode.com) | OmniRoute কোনো API কী সংরক্ষণ করে না। Auggie CLI ইনস্টল করুন এবং এই মেশিনে `auggie login` চালান, এরপর OmniRoute প্রতিটি অনুরোধের জন্য স্থানীয়ভাবে এটি চালু করে। | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | প্রমাণীকরণ-বিহীন | [লিংক](https://playground.ai.cloudflare.com) | কোনো পরিচয়পত্র প্রয়োজন নেই — রিভার্স-ইঞ্জিনিয়ার করা cf_agent WebSocket প্রোটোকলের মাধ্যমে অজ্ঞাতনামা ব্রাউজার সেশন ব্যবহার করে (Playwright পরিবহন)। | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | প্রমাণীকরণ-বিহীন | [লিংক](https://developers.openai.com/codex/cli) | OmniRoute কোনো টোকেন সংরক্ষণ করে না। Codex CLI app-server নিজস্ব ChatGPT সাইন-ইন পরিচালনা করে (~/.codex/auth.json, স্বয়ংক্রিয়ভাবে রিফ্রেশ করা হয়)। CLI এখনো প্রমাণীকৃত না হলে “ChatGPT দিয়ে সাইন ইন করুন” ব্যবহার করুন। | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | প্রমাণীকরণ-বিহীন | [লিংক](https://docs.devin.ai/work-with-devin/devin-cli) | প্রমাণীকরণটি অফিসিয়াল Devin CLI তার বিচ্ছিন্ন ব্রিজ ভলিউমে পরিচালনা করে। | অনুকরণকৃত | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | প্রমাণীকরণ-বিহীন | [লিংক](https://duckduckgo.com/duckchat) | কোনো পরিচয়পত্র প্রয়োজন নেই — DuckDuckGo AI Chat অজ্ঞাতনামা ও বিনামূল্যের। | অনুকরণকৃত | -| `opencode` | `oc` | OpenCode Free | প্রমাণীকরণ-বিহীন | [লিংক](https://opencode.ai) | কোনো API কী প্রয়োজন নেই — OpenCode-এর সর্বজনীন বিনামূল্যের এন্ডপয়েন্ট ব্যবহার করে। | — | -| `uncloseai` | `unc` | UncloseAI | প্রমাণীকরণ-বিহীন | [লিংক](https://uncloseai.com) | কোনো প্রমাণীকরণ প্রয়োজন নেই। শনাক্তকরণের জন্য API যেকোনো অ-খালি স্ট্রিংকে কী হিসেবে গ্রহণ করে। পুরোনো বিল্ট-ইন মডেলগুলো 404 ফেরত দিলে, উপলভ্য মডেল → /models থেকে আমদানি অথবা স্বয়ংক্রিয়-সিঙ্ক ব্যবহার করুন; যাচাইকৃত সচল মডেল: solidrust/Hermes-3-Llama-3.1-8B-AWQ। | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | প্রমাণীকরণ-বিহীন, ভিডিও | [লিংক](https://veoaifree.com) | কোনো প্রমাণীকরণ প্রয়োজন নেই। প্রতি IP-তে প্রতি ঘণ্টায় 6টি অনুরোধে সীমাবদ্ধ। | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | প্রমাণীকরণ-বিহীন | [লিংক](https://zcode.z.ai) | OmniRoute কোনো API কী সংরক্ষণ করে না। স্থানীয় ZCode app-server বিদ্যমান builtin:zai-coding-plan লগইন ব্যবহার করে। | — | - -## OAuth প্রদানকারী (24) - -| ID | উপনাম | নাম | ট্যাগ | ওয়েবসাইট | নোট | -| --------------- | ------------- | ------------------------- | ----- | -------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [লিঙ্ক](https://antigravity.google) | আপনার Antigravity CLI (`agy`) লগইন ইম্পোর্ট করুন (এর টোকেন ফাইল পেস্ট/আপলোড করুন), স্থানীয় CLI লগইন স্বয়ংক্রিয়ভাবে শনাক্ত করুন, অথবা Google দিয়ে সাইন ইন করুন। Antigravity ব্যাকএন্ড শেয়ার করে (Claude মডেলসহ)। | -| `amazon-q` | `aq` | Amazon Q | OAuth | [লিঙ্ক](https://aws.amazon.com/q/developer/) | Kiro-এর মতো একই AWS Builder ID বা ইম্পোর্ট করা রিফ্রেশ-টোকেন প্রবাহ ব্যবহার করে, তবে Amazon Q সংযোগগুলো আলাদা রাখে। | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [লিঙ্ক](https://cline.bot/cline-pass) | ClinePass হলো Cline-এর $9.99/মাস সাবস্ক্রিপশন, যাতে 10টি উন্মুক্ত কোডিং মডেল একত্রে অন্তর্ভুক্ত। আপনার Cline অ্যাকাউন্ট দিয়ে সাইন ইন করুন (Cline CLI/IDE-এর একই লগইন), অথবা সরাসরি একটি ClinePass API key পেস্ট করুন (app.cline.bot → Settings → API Keys)। একটি ClinePass সাবস্ক্রিপশন cline-pass/* মডেলগুলো আনলক করে। Cline WorkOS OAuth প্রবাহ পুনরায় ব্যবহার করে। | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [লিঙ্ক](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com)। অফিসিয়াল CLI ডিভাইস-কোড প্রবাহের মাধ্যমে সাইন ইন করুন, অথবা সরাসরি একটি API key পেস্ট করুন (Authorization: Bearer হিসেবে পাঠানো হয়)। ক্যাটালগ: GLM / Kimi / MiniMax / DeepSeek / Hunyuan। | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [লিঙ্ক](https://cli.devin.ai) | Devin CLI বাইনারি প্রয়োজন। প্রমাণীকরণের জন্য `devin auth login` চালান, অথবা আপনার WINDSURF_API_KEY দিন। ইনস্টল করুন: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [লিঙ্ক](https://devin.ai) | প্রমাণীকৃত Devin সেশন থেকে বিদ্যমান Devin API key পেস্ট করুন। Devin-এর সংস্করণ ও অ্যাকাউন্টভেদে key এক্সপোর্টের প্রাপ্যতা ও ধাপগুলো ভিন্ন হতে পারে। | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | প্রদানকারী সেটিংসে আপনার GHE ইনস্ট্যান্সের URL (যেমন, https://ghe.company.com) লিখুন, তারপর ডিভাইস প্রবাহের মাধ্যমে প্রমাণীকরণ করুন। | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [লিঙ্ক](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth কনফিগার করা নেই। https://gitlab.com/-/profile/applications-এ redirect URI হিসেবে http://localhost:20128/callback এবং scope হিসেবে "ai_features read_user" দিয়ে একটি OAuth অ্যাপ্লিকেশন নিবন্ধন করুন, তারপর GITLAB_DUO_OAUTH_CLIENT_ID (এবং ঐচ্ছিকভাবে GITLAB_DUO_OAUTH_CLIENT_SECRET) সেট করে পুনরায় চালু করুন। | -| `grok-cli` | `gc` | Grok Build | OAuth | — | আপনার ব্রাউজার দিয়ে সাইন ইন করুন, অথবা Grok Build CLI থেকে আপনার ~/.grok/auth.json (বা JWT অ্যাক্সেস টোকেন) পেস্ট করুন; উভয় ক্ষেত্রেই refresh_token স্বয়ংক্রিয়ভাবে রোটেট করা হয়। | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [লিঙ্ক](https://www.kimi.com/code?aff=omniroute) | Kimi Code CLI-তে ব্যবহৃত একই Kimi অ্যাকাউন্ট দিয়ে সাইন ইন করুন। OmniRoute CLI OAuth প্রবাহ এবং Kimi Coding Plan এন্ডপয়েন্ট ব্যবহার করে। | -| `kiro` | `kr` | Kiro AI | OAuth | — | বিনামূল্যের স্তর: মাসে 50 ক্রেডিট (~25K–100K টোকেন)। ⚠️ Kiro ToS তৃতীয়-পক্ষের proxy/harness ব্যবহার নিষিদ্ধ করে। | -| `openference` | `of` | Openference | OAuth | [লিঙ্ক](https://openference.com) | api.openference.com-এর মাধ্যমে অনুরোধ রাউট করতে আপনার Openference অ্যাকাউন্ট দিয়ে সাইন ইন করুন। ইনফারেন্সের জন্য একটি সক্রিয় প্ল্যান প্রয়োজন—OAuth প্রমাণীকরণ করতে পারলেও প্ল্যান না থাকলে 402 ফেরত দিতে পারে। | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [লিঙ্ক](https://trae.ai) | Trae হলো ByteDance-এর একটি AI-নেটিভ IDE (SOLO রিমোট এজেন্ট)। পপআপে trae.ai-এর মাধ্যমে অনুমোদন দিন, অথবা solo.trae.ai-তে সাইন ইন করে Cloud-IDE-JWT-কে অ্যাক্সেস টোকেন হিসেবে পেস্ট করুন (`Authorization: Cloud-IDE-JWT ` হিসেবে পাঠানো হয়, মেয়াদ ~14 দিন); web_id/biz_user_id/user_unique_id/scope/tenant/region providerSpecificData-এর মাধ্যমে প্রবাহিত হয়। পেস্ট করা টোকেনের জন্য কোনো হেডলেস রিফ্রেশ নেই—মেয়াদ শেষ হলে আবার পেস্ট করুন। | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [লিঙ্ক](https://x.ai) | Grok 4.5-এর মতো api.x.ai মডেল ব্যবহার করতে xAI দিয়ে সাইন ইন করুন। এটি Grok Build JWT সেশন থেকে আলাদা, যেগুলো cli-chat-proxy.grok.com এবং grok-build মডেল উপনাম ব্যবহার করে। | -| `zed` | `zd` | Zed IDE | OAuth | [লিঙ্ক](https://zed.dev) | Zed অপারেটিং সিস্টেমের keychain-এ LLM প্রদানকারীর শংসাপত্র (OpenAI, Anthropic, Google, Mistral, xAI) সংরক্ষণ করে। সেগুলো স্বয়ংক্রিয়ভাবে খুঁজে পেতে ও ইম্পোর্ট করতে নিচের Import বোতামটি ব্যবহার করুন। | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [লিঙ্ক](https://zed.dev) | আপনার Zed অ্যাকাউন্ট দিয়ে সাইন ইন করুন (নেটিভ-অ্যাপ সাইন-ইন)। OmniRoute একটি একবার ব্যবহারযোগ্য RSA keypair তৈরি করে এবং সেটি অনুমোদনের জন্য zed.dev খোলে—রিমোট/হেডলেস ইনস্টলে আপনার ব্রাউজারের অ্যাড্রেস বার থেকে ফলস্বরূপ 127.0.0.1 callback URL কপি করে এখানে পেস্ট করুন। উপরের 'Zed IDE' শংসাপত্র-ইম্পোর্ট এন্ট্রি থেকে এটি আলাদা: এটি আপনার Zed প্ল্যানের অধীনে Anthropic/OpenAI/Google/xAI মডেলগুলোকে সামনে রেখে Zed-এর নিজস্ব হোস্টেড মডেল অ্যাগ্রিগেটর (cloud.zed.dev)-এর মাধ্যমে চ্যাট কমপ্লিশন প্রক্সি করে। | +## প্রমাণীকরণবিহীন প্রদানকারী (কোনো কী প্রয়োজন নেই) (10) + +| ID | উপনাম | নাম | ট্যাগ | ওয়েবসাইট | নোট | টুল কলিং | +| ----------------------- | ---------- | ------------------------- | ---------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | +| `aihorde` | `horde` | AI Horde | প্রমাণীকরণবিহীন | [লিংক](https://aihorde.net) | কোনো API কী প্রয়োজন নেই — AI Horde-এর নথিভুক্ত অজ্ঞাতনামা কী ব্যবহার করে। একটি বিনামূল্যের aihorde.net কী যোগ করা ঐচ্ছিক এবং এটি শুধু কিউতে উচ্চতর অগ্রাধিকার (kudos) দেয়। | — | +| `auggie` | `aug` | Augment (Auggie CLI) | প্রমাণীকরণবিহীন | [লিংক](https://augmentcode.com) | OmniRoute কোনো API কী সংরক্ষণ করে না। Auggie CLI ইনস্টল করুন এবং এই মেশিনে `auggie login` চালান; এরপর OmniRoute প্রতিটি অনুরোধের জন্য এটিকে স্থানীয়ভাবে চালু করে। | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | প্রমাণীকরণবিহীন | [লিংক](https://playground.ai.cloudflare.com) | কোনো শংসাপত্রের প্রয়োজন নেই — রিভার্স-ইঞ্জিনিয়ার করা cf_agent WebSocket প্রোটোকলের (Playwright ট্রান্সপোর্ট) মাধ্যমে অজ্ঞাতনামা ব্রাউজার সেশন ব্যবহার করে। | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | প্রমাণীকরণবিহীন | [লিংক](https://developers.openai.com/codex/cli) | OmniRoute কোনো টোকেন সংরক্ষণ করে না। Codex CLI app-server নিজস্ব ChatGPT সাইন-ইন পরিচালনা করে (~/.codex/auth.json, স্বয়ংক্রিয়ভাবে রিফ্রেশ করা হয়)। CLI এখনো প্রমাণীকৃত না হলে “ChatGPT দিয়ে সাইন ইন করুন” ব্যবহার করুন। | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | প্রমাণীকরণবিহীন | [লিংক](https://docs.devin.ai/work-with-devin/devin-cli) | প্রমাণীকরণটি তার বিচ্ছিন্ন ব্রিজ ভলিউমে অফিসিয়াল Devin CLI দ্বারা পরিচালিত হয়। | অনুকরণকৃত | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | প্রমাণীকরণবিহীন | [লিংক](https://duckduckgo.com/duckchat) | কোনো শংসাপত্রের প্রয়োজন নেই — DuckDuckGo AI Chat অজ্ঞাতনামা এবং বিনামূল্যের। | অনুকরণকৃত | +| `opencode` | `oc` | OpenCode Free | প্রমাণীকরণবিহীন | [লিংক](https://opencode.ai) | কোনো API কী প্রয়োজন নেই — OpenCode-এর সর্বজনীন বিনামূল্যের এন্ডপয়েন্ট ব্যবহার করে। | — | +| `uncloseai` | `unc` | UncloseAI | প্রমাণীকরণবিহীন | [লিংক](https://uncloseai.com) | কোনো প্রমাণীকরণের প্রয়োজন নেই। শনাক্তকরণের জন্য API যেকোনো খালি নয় এমন স্ট্রিংকে কী হিসেবে গ্রহণ করে। পুরোনো বিল্ট-ইন মডেলগুলো 404 ফেরত দিলে, উপলভ্য মডেল → /models থেকে আমদানি অথবা স্বয়ংক্রিয়-সিঙ্ক ব্যবহার করুন; যাচাইকৃত সচল মডেল: Lorbus/Qwen3.6-27B-int4-AutoRound। | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | প্রমাণীকরণবিহীন, ভিডিও | [লিংক](https://veoaifree.com) | কোনো প্রমাণীকরণের প্রয়োজন নেই। প্রতি IP-তে ঘণ্টায় 6টি অনুরোধে সীমাবদ্ধ। | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | প্রমাণীকরণবিহীন | [লিংক](https://zcode.z.ai) | OmniRoute কোনো API কী সংরক্ষণ করে না। স্থানীয় ZCode app-server বিদ্যমান builtin:zai-coding-plan লগইন ব্যবহার করে। | — | + +## OAuth প্রদানকারীসমূহ (24) + +| ID | উপনাম | নাম | ট্যাগ | ওয়েবসাইট | নোট | +| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [লিংক](https://antigravity.google) | আপনার Antigravity CLI (`agy`) লগইন ইমপোর্ট করুন (এর টোকেন ফাইল পেস্ট/আপলোড করে), স্থানীয় CLI লগইন স্বয়ংক্রিয়ভাবে শনাক্ত করুন, অথবা Google দিয়ে সাইন ইন করুন। এটি Antigravity ব্যাকএন্ড শেয়ার করে (Claude মডেলসহ)। | +| `amazon-q` | `aq` | Amazon Q | OAuth | [লিংক](https://aws.amazon.com/q/developer/) | Kiro-এর মতো একই AWS Builder ID বা ইমপোর্ট করা refresh-token প্রবাহ ব্যবহার করে, তবে Amazon Q সংযোগগুলো আলাদা রাখে। | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [লিংক](https://cline.bot/cline-pass) | ClinePass হলো Cline-এর $9.99/মাসের সাবস্ক্রিপশন, যাতে 10টি উন্মুক্ত কোডিং মডেল অন্তর্ভুক্ত রয়েছে। আপনার Cline অ্যাকাউন্ট দিয়ে সাইন ইন করুন (Cline CLI/IDE-এর একই লগইন), অথবা একটি সরাসরি ClinePass API কী পেস্ট করুন (app.cline.bot → Settings → API Keys)। একটি ClinePass সাবস্ক্রিপশন cline-pass/* মডেলগুলো আনলক করে। এটি Cline WorkOS OAuth প্রবাহ পুনরায় ব্যবহার করে। | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [লিংক](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com)। অফিসিয়াল CLI device-code প্রবাহের মাধ্যমে সাইন ইন করুন, অথবা একটি সরাসরি API কী পেস্ট করুন (Authorization: Bearer হিসেবে পাঠানো হয়)। ক্যাটালগ: GLM / Kimi / MiniMax / DeepSeek / Hunyuan। | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [লিংক](https://cli.devin.ai) | Devin CLI বাইনারি প্রয়োজন। প্রমাণীকরণের জন্য `devin auth login` চালান, অথবা আপনার WINDSURF_API_KEY দিন। ইনস্টল করুন: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [লিংক](https://devin.ai) | প্রমাণীকৃত Devin সেশন থেকে একটি বিদ্যমান Devin API কী পেস্ট করুন। কী এক্সপোর্টের প্রাপ্যতা ও ধাপগুলো Devin-এর সংস্করণ ও অ্যাকাউন্টভেদে পরিবর্তিত হয়। | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | প্রদানকারী সেটিংসে আপনার GHE ইনস্ট্যান্সের URL (যেমন, https://ghe.company.com) লিখুন, তারপর device flow-এর মাধ্যমে প্রমাণীকরণ করুন। | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [লিংক](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth কনফিগার করা নেই। https://gitlab.com/-/profile/applications-এ redirect URI http://localhost:20128/callback এবং scopes "ai_features read_user" দিয়ে একটি OAuth অ্যাপ্লিকেশন নিবন্ধন করুন, তারপর GITLAB_DUO_OAUTH_CLIENT_ID (এবং ঐচ্ছিকভাবে GITLAB_DUO_OAUTH_CLIENT_SECRET) সেট করে পুনরায় চালু করুন। | +| `grok-cli` | `gc` | Grok Build | OAuth | — | আপনার ব্রাউজার দিয়ে সাইন ইন করুন, অথবা Grok Build CLI থেকে আপনার ~/.grok/auth.json (অথবা JWT access token) পেস্ট করুন; উভয় ক্ষেত্রেই refresh_token স্বয়ংক্রিয়ভাবে রোটেট হয়। | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [লিংক](https://www.kimi.com/code?aff=omniroute) | Kimi Code CLI-তে ব্যবহৃত একই Kimi অ্যাকাউন্ট দিয়ে সাইন ইন করুন। OmniRoute CLI OAuth প্রবাহ এবং Kimi Coding Plan এন্ডপয়েন্ট ব্যবহার করে। | +| `kiro` | `kr` | Kiro AI | OAuth | — | বিনামূল্যের স্তর: 50 ক্রেডিট/মাস (~25K–100K টোকেন)। ⚠️ Kiro ToS তৃতীয়-পক্ষের proxy/harness ব্যবহার নিষিদ্ধ করে। | +| `openference` | `of` | Openference | OAuth | [লিংক](https://openference.com) | api.openference.com-এর মাধ্যমে অনুরোধ রাউট করতে আপনার Openference অ্যাকাউন্ট দিয়ে সাইন ইন করুন। Qwen3.8 27b এবং Llama 3.2 3B-তে বিনামূল্যের স্তরের অ্যাক্সেস অন্তর্ভুক্ত রয়েছে—বর্তমান প্ল্যানের শর্তাবলির জন্য openference.com/pricing দেখুন। | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [লিংক](https://trae.ai) | Trae হলো ByteDance-এর একটি AI-নেটিভ IDE (SOLO remote agent)। পপআপে trae.ai-এর মাধ্যমে অনুমোদন দিন, অথবা solo.trae.ai-এ সাইন ইন করে Cloud-IDE-JWT-টি (অ্যাক্সেস টোকেন হিসেবে 'Authorization: Cloud-IDE-JWT ' আকারে পাঠানো হয়, আয়ু ~14 দিন) পেস্ট করুন; web_id/biz_user_id/user_unique_id/scope/tenant/region providerSpecificData-এর মাধ্যমে প্রেরিত হয়। পেস্ট করা টোকেনের জন্য headless refresh নেই—মেয়াদ শেষ হলে আবার পেস্ট করুন। | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [লিংক](https://x.ai) | Grok 4.5-এর মতো api.x.ai মডেল ব্যবহার করতে xAI দিয়ে সাইন ইন করুন। এটি Grok Build JWT সেশন থেকে আলাদা, যেগুলো cli-chat-proxy.grok.com এবং grok-build মডেল উপনাম ব্যবহার করে। | +| `zed` | `zd` | Zed IDE | OAuth | [লিংক](https://zed.dev) | Zed OS keychain-এ LLM প্রদানকারীর শংসাপত্র (OpenAI, Anthropic, Google, Mistral, xAI) সংরক্ষণ করে। সেগুলো স্বয়ংক্রিয়ভাবে খুঁজে বের করে ইমপোর্ট করতে নিচের Import বোতামটি ব্যবহার করুন। | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [লিংক](https://zed.dev) | আপনার Zed অ্যাকাউন্ট দিয়ে সাইন ইন করুন (native-app sign-in)। OmniRoute একবার ব্যবহারযোগ্য একটি RSA keypair তৈরি করে এবং সেটি অনুমোদনের জন্য zed.dev খোলে—remote/headless ইনস্টলে আপনার ব্রাউজারের address bar থেকে ফলস্বরূপ 127.0.0.1 callback URL কপি করে এখানে পেস্ট করুন। উপরের 'Zed IDE' শংসাপত্র-ইমপোর্ট এন্ট্রি থেকে এটি স্বতন্ত্র: এটি Zed-এর নিজস্ব hosted model aggregator (cloud.zed.dev)-এর মাধ্যমে chat completion প্রক্সি করে, যা আপনার Zed প্ল্যানের অধীনে Anthropic/OpenAI/Google/xAI মডেলগুলো উপস্থাপন করে। | ## ওয়েব কুকি প্রোভাইডারসমূহ (34) @@ -115,252 +115,252 @@ | `zai-web` | `zw` | Z.ai Web | ওয়েব কুকি | [লিংক](https://chat.z.ai) | chat.z.ai → DevTools → Application → Local Storage থেকে "token"-এর মান কপি করুন। কুকি কপি করবেন না; OmniRoute তার ব্রাউজার ট্রান্সপোর্টের মাধ্যমে প্রতিটি রিকোয়েস্টের CAPTCHA পরিচালনা করে। | — | | `zenmux-free` | `zmf` | ZenMux Free (ওয়েব) | ওয়েব কুকি | [লিংক](https://zenmux.ai) | zenmux.ai-তে লগইন করুন, তারপর EditThisCookie অথবা Cookie-Editor ব্যবহার করে সব কুকি এক্সপোর্ট করুন এবং সম্পূর্ণ Cookie হেডার স্ট্রিংটি এখানে পেস্ট করুন। প্রতি ~30 দিনে রিফ্রেশ করুন। | — | -## API কী প্রদানকারী (পেইড / ফ্রি-ক্রেডিটসহ-পেইড) (242) - -| ID | উপনাম | নাম | ট্যাগ | ওয়েবসাইট | নোট | -| ------------------------ | --------------- | ------------------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API কী | [লিংক](https://ai.360.cn) | ai.360.cn থেকে API কী নিন | -| `agentrouter` | `agentrouter` | AgentRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://agentrouter.org) | সাইন আপ করলে $200-এর বিনামূল্যের ক্রেডিট — মাল্টি-মডেল রাউটিং গেটওয়ে | -| `agnes` | `agnes` | Agnes AI | API কী, ভিডিও | [লিংক](https://agnes-ai.com) | agnes-ai.com থেকে API কী নিন | -| `agnes-cn` | `agnescn` | Agnes AI (চীন) | API কী | [লিংক](https://api.agnes-ai.cn) | Agnes CN সাইট থেকে API কী নিন। | -| `ai21` | `ai21` | AI21 Labs | API কী | [লিংক](https://www.ai21.com) | সাইন আপ করলে $10-এর ট্রায়াল ক্রেডিট (৩ মাস বৈধ), কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `aimlapi` | `aiml` | AI/ML API | API কী, অ্যাগ্রিগেটর | [লিংক](https://aimlapi.com) | বিনামূল্যের স্তরটি স্থগিত (2026) — AI/ML API এখন শুধু ব্যবহার অনুযায়ী অর্থ প্রদানের ভিত্তিতে চলে (সর্বনিম্ন $20 টপ-আপ); পুনরাবৃত্ত বিনামূল্যের ক্রেডিট নেই। | -| `ainative` | `ainative` | AINative Studio | API কী | [লিংক](https://ainative.studio) | ainative.studio-তে একটি বিনামূল্যের API কী তৈরি করুন (কার্ডের প্রয়োজন নেই), তারপর Bearer টোকেন হিসেবে এখানে পেস্ট করুন। | -| `aion` | `aion` | Aion Labs | API কী | [লিংক](https://www.aionlabs.ai) | aionlabs.ai-তে একটি বিনামূল্যের API কী তৈরি করুন (কার্ডের প্রয়োজন নেই), তারপর Bearer টোকেন হিসেবে এখানে পেস্ট করুন। | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API কী | [লিংক](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (চীন) | API কী | [লিংক](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API কী | [লিংক](https://developer.ant-ling.com/en/docs/) | Ant Ling API কনসোলে (https://chat.ant-ling.com/open) নিবন্ধন করে একটি API কী তৈরি করুন, তারপর এখানে পেস্ট করুন। OmniRoute চ্যাট ট্রাফিক https://api.ant-ling.com/v1/chat/completions-এ রাউট করে; প্রোভাইডারটি OpenAI-সামঞ্জস্যপূর্ণ এবং একটি Anthropic-সামঞ্জস্যপূর্ণ ইন্টারফেসও প্রদান করে। | -| `anthropic` | `anthropic` | Anthropic | API কী | [লিংক](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://anyapi.ai) | বিনামূল্যের প্ল্যান: যোগ্য Free/Basic মডেলের জন্য প্রতিদিন 100,000 ANY Tokens এবং 100 RPM; কোনো ক্রেডিট কার্ডের প্রয়োজন নেই। | -| `api-airforce` | `af` | Api.airforce | API কী | [লিংক](https://api.airforce) | Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash ও DeepSeek-V3-সহ বিনামূল্যের স্তরে 55টি মডেল | -| `arcee-ai` | `arcee` | Arcee AI | API কী | [লিংক](https://arcee.ai) | arcee.ai থেকে API কী নিন | -| `auriko` | `auriko` | Auriko | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.auriko.ai) | বিনামূল্যের প্ল্যানে 1,000 Platform RPM এবং 10,000 BYOK RPM দেওয়ার কথা প্রকাশ করা হয়েছে। Platform ইনফারেন্সের ক্ষেত্রে এখনও প্রোভাইডারের খরচ প্রযোজ্য; এটি বিনামূল্যের টোকেন পুল বা সীমাহীন বিনামূল্যের ইনফারেন্স নয়। | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API কী, এন্টারপ্রাইজ | [লিংক](https://learn.microsoft.com/azure/ai-foundry) | আপনার Azure AI Foundry কী ব্যবহার করুন। বেস URL হতে পারে https://.services.ai.azure.com/openai/v1/ অথবা https://.openai.azure.com/openai/v1/। | -| `azure-openai` | `azure` | Azure OpenAI | API কী, এন্টারপ্রাইজ | [লিংক](https://azure.microsoft.com/products/ai-services/openai-service) | আপনার Azure OpenAI API কী ব্যবহার করুন। বেস URL আপনার রিসোর্স এন্ডপয়েন্ট হওয়া উচিত, যেমন https://my-resource.openai.azure.com। | -| `bai` | `bai` | b.ai | API কী | [লিংক](https://b.ai) | b.ai-এর OpenAI-সামঞ্জস্যপূর্ণ LLM গেটওয়ের জন্য Bearer API কী (TheB.AI থেকে স্বতন্ত্র)। https://docs.b.ai-এ একটি কী তৈরি করুন, তারপর OpenAI-সামঞ্জস্যপূর্ণ বেস URL হিসেবে https://api.b.ai/v1 ব্যবহার করুন। | -| `baichuan` | `baichuan` | Baichuan | API কী | [লিংক](https://www.baichuan-ai.com/) | platform.baichuan-ai.com থেকে API কী নিন | -| `baidu` | `baidu` | Baidu (ERNIE) | API কী | [লিংক](https://ernie.baidu.com/) | console.bce.baidu.com থেকে API কী নিন | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API কী | [লিংক](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API কী | [লিংক](https://baseten.co) | GPU ইনফারেন্সের জন্য $30-এর বিনামূল্যের ট্রায়াল ক্রেডিট | -| `bazaarlink` | `bzl` | BazaarLink | API কী | [লিংক](https://bazaarlink.ai) | Authorization: Bearer -এ আপনার BazaarLink API কী (যা sk-bl- দিয়ে শুরু হয়) ব্যবহার করুন। OpenAI SDK বেস URL https://bazaarlink.ai/api/v1-এর সঙ্গে কাজ করে। মডেলগুলো provider/model-name ফরম্যাট ব্যবহার করে। | -| `bedrock` | `bedrock` | Amazon Bedrock | API কী, এন্টারপ্রাইজ | [লিংক](https://aws.amazon.com/bedrock) | আপনার Amazon Bedrock API কী ব্যবহার করুন এবং আপনার মডেলগুলো যে AWS অঞ্চলে সক্রিয় রয়েছে সেটি কনফিগার করুন (যেমন eu-west-2)। OmniRoute সরাসরি Bedrock-এর নেটিভ Converse API কল করে। | -| `black-forest-labs` | `bfl` | Black Forest Labs | API কী, ছবি | [লিংক](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API কী | [লিংক](https://blackbox.ai) | ⚠️ **অবচিত।** প্রতিটি পাথ ভ্যারিয়েন্টে api.blackbox.ai HTTP 404 ফেরত দেয় (পরীক্ষা 2026-08-21); পাবলিক ইনফারেন্স ইন্টারফেসটি সীমাবদ্ধ enterprise.blackbox.ai/v1 এন্ডপয়েন্টে স্থানান্তরিত হয়েছে। | -| `bluesminds` | `bm` | BluesMinds | API কী | [লিংক](https://www.bluesminds.com) | প্রতিদিন বিনামূল্যের pi ক্রেডিট — GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen ও Kimi K2-সহ 200টির বেশি মডেল সমর্থন করে | -| `byteplus` | `bpm` | BytePlus ModelArk | API কী | [লিংক](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API কী | [লিংক](https://bytez.com) | $1-এর বিনামূল্যের ক্রেডিট, প্রতি ৪ সপ্তাহে রিফ্রেশ হয় | -| `cerebras` | `cerebras` | Cerebras | API কী | [লিংক](https://inference.cerebras.ai) | এককালীন $5 সাইন-আপ ক্রেডিট (৩০ দিন বৈধ); একটি পেমেন্ট পদ্ধতি প্রয়োজন। এটি পুনরাবৃত্ত বিনামূল্যের স্তর নয়। | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API কী | [লিংক](https://hyper.charm.land) | সাইন আপ করলে প্রতি মাসে 100টি বিনামূল্যের Hypercredits | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API কী, অ্যাগ্রিগেটর | [লিংক](https://api.oriper.com) | অফিসিয়াল মেটাডেটায় প্রতি মাসে 2M টোকেনের কথা বলা হয়েছে, কিন্তু নিরীক্ষার সময় পাবলিক সাইট ও ডকুমেন্টেশন ব্লক করা ছিল; কোটা ও ব্র্যান্ড ম্যাপিংকে অনিশ্চিত হিসেবে বিবেচনা করুন। | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API কী, অ্যাগ্রিগেটর | [লিংক](https://chatanywhere.tech) | শুধুমাত্র ব্যক্তিগত, শিক্ষামূলক বা গবেষণামূলক ব্যবহারের জন্য: প্রকাশ্য ডকুমেন্টেশনে প্রতিদিন 10,000 পয়েন্ট এবং প্রতি IP/কী-তে প্রতিদিন 200টি অনুরোধের কথা উল্লেখ রয়েছে; বাণিজ্যিক ট্রাফিকের জন্য ব্যবহার করবেন না। | -| `cheaperinference` | `cinf` | Cheaper Inference | API কী | [লিংক](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API কী | [লিংক](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API কী, অ্যাগ্রিগেটর | [লিংক](https://chutes.ai) | Chutes-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API কী। | -| `clarifai` | `clarifai` | Clarifai | API কী, এন্টারপ্রাইজ | [লিংক](https://docs.clarifai.com) | আপনার Clarifai PAT অথবা অ্যাপ-নির্দিষ্ট API কী ব্যবহার করুন। OmniRoute https://api.clarifai.com/v2/ext/openai/v1-এর OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টকে লক্ষ্য করে এবং Authorization: Key দিয়ে প্রমাণীকরণ করে। | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API কী, অ্যাগ্রিগেটর | [লিংক](https://cloudcode.one) | প্রকাশিত বিনামূল্যের মডেলগুলোর মধ্যে glm-4.7-flash এবং glm-4.6v-flash রয়েছে; কোনো সংখ্যাগত কোটা প্রকাশ করা হয়নি এবং কী তৈরি করতে ক্রেডিট বা কুপন প্রয়োজন হতে পারে। | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API কী | [লিংক](https://developers.cloudflare.com/workers-ai) | API Token এবং Account ID উভয়ই প্রয়োজন (dash.cloudflare.com-এ পাওয়া যাবে) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API কী | [লিংক](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API কী | [লিংক](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API কী | [লিংক](https://cohere.com) | বিনামূল্যের ট্রায়াল: পরীক্ষার জন্য প্রতি মাসে 1,000টি API কল, কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `command-code` | `cmd` | Command Code | API কী | [লিংক](https://commandcode.ai/) | একটি Command Code API কী ব্যবহার করুন। অনুরোধগুলো Command Code-এর /provider/v1/chat/completions এন্ডপয়েন্টে পাঠানো হয়। | -| `coze` | `coze` | Coze | API কী | [লিংক](https://coze.com) | coze.com/open/api থেকে API কী নিন | -| `crof` | `crof` | CrofAI | API কী | [লিংক](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API কী | [লিংক](https://cursor.com/dashboard/api) | cursor.com/dashboard/api থেকে একটি Cursor ব্যবহারকারী API কী (crsr_...) পেস্ট করুন। OmniRoute প্রয়োজন অনুযায়ী এটিকে একটি সেশন টোকেনে বিনিময় করে; কোনো IDE বা cursor-agent ইনস্টল করার প্রয়োজন নেই। কীটির মালিকানাধীন Cursor প্ল্যানে ব্যবহারের বিল যোগ হয়। | -| `dahl` | `dahl` | Dahl | API কী | [লিংক](https://inference.dahl.global) | স্বয়ংক্রিয়ভাবে একটি টোকেন তৈরি করতে 'Add Account'-এ ক্লিক করুন অথবা ম্যানুয়ালি একটি API কী যোগ করুন। | -| `databricks` | `databricks` | Databricks | API কী, এন্টারপ্রাইজ | [লিংক](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API কী, এন্টারপ্রাইজ | [লিংক](https://docs.datarobot.com) | আপনার DataRobot API টোকেন ব্যবহার করুন। ঐচ্ছিক Base URL অ্যাকাউন্টের রুট (LLM Gateway-এর জন্য) অথবা /api/v2/deployments/-এর অধীন একটি ডিপ্লয়মেন্ট URL হতে পারে। | -| `deepai` | `deepai` | DeepAI | API কী, ছবি | [লিংক](https://deepai.org) | আপনার DeepAI API কী ব্যবহার করুন। deepai.org থেকে একটি নিন — এর জন্য Pro সাবস্ক্রিপশন ($9.99/মাস) প্রয়োজন। | -| `deepinfra` | `deepinfra` | DeepInfra | API কী | [লিংক](https://deepinfra.com) | API পরীক্ষা এবং মডেল অন্বেষণের জন্য সাইনআপে বিনামূল্যের ক্রেডিট | -| `deepseek` | `ds` | DeepSeek | API কী | [লিংক](https://platform.deepseek.com) | সাইনআপে 5M বিনামূল্যের টোকেন — কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `dgrid` | `dgrid` | DGrid | API কী | [লিংক](https://dgrid.ai) | DGrid Free Models Router: প্রতি মিনিটে 10টি এবং প্রতিদিন 100টি অনুরোধ। এককালীন $5 টপ-আপ করলে প্রতি মিনিটে সর্বোচ্চ 20টি এবং প্রতিদিন 1,000টি অনুরোধের সুবিধা চালু হয়। | -| `dify` | `dify` | Dify | API কী | [লিংক](https://dify.ai) | আপনার Dify ইনস্ট্যান্স থেকে API কী নিন। | -| `digitalocean` | `digitalocean` | DigitalOcean | API কী | [লিংক](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API কী | [লিংক](https://dit.ai) | Authorization: Bearer -তে আপনার dit.ai API কী ব্যবহার করুন। সম্পূর্ণভাবে OpenAI-সামঞ্জস্যপূর্ণ — সরাসরি প্রতিস্থাপনযোগ্য, শুধু বেস URL পরিবর্তন করে https://api.dit.ai/v1 করুন। | -| `doubao` | `doubao` | Doubao | API কী | [লিংক](https://doubao.com) | console.volcengine.com থেকে API কী নিন | -| `dxnt` | `dxnt` | DXNT / DX Token | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.dxnt.com) | বিনামূল্যের অ্যাকাউন্টের জন্য প্রতিদিন 100টি কল নথিভুক্ত রয়েছে; আমন্ত্রণের মাধ্যমে কোটা বাড়তে পারে এবং অ্যাকাউন্টভেদে পরিবর্তিত হতে পারে। | -| `electronhub` | `electronhub` | Electron Hub | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.electronhub.ai) | বিনামূল্যের প্ল্যান: 5 RPM, সাপ্তাহিক $0.25 ক্রেডিট এবং :free মডেলের জন্য প্রতিদিন 10টি Neutrinos; পারিবারিক বাজেটও প্রযোজ্য। | -| `empower` | `empower` | Empower | API কী, অ্যাগ্রিগেটর | [লিংক](https://docs.empower.dev) | Empower-এর OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের জন্য Bearer API কী। | -| `eurouter` | `eurouter` | EURouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API কী | [লিংক](https://factory.ai) | Factory-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API কী। | -| `fal-ai` | `fal` | Fal.ai | API কী, ছবি | [লিংক](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://fastrouter.ai) | :free সাফিক্সযুক্ত মডেলগুলোতে প্রতি প্রতিষ্ঠান ও মডেলের জন্য প্রতিদিন 10টি অনুরোধের অনুমতি রয়েছে; প্রাপ্যতা পরিবর্তিত হতে পারে। | -| `featherless-ai` | `featherless` | Featherless AI | API কী | [লিংক](https://featherless.ai) | বিনামূল্যের স্তর উপলভ্য — কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `fenayai` | `fenayai` | FenayAI | API কী, অ্যাগ্রিগেটর | [লিংক](https://fenayai.com) | FenayAI-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API কী। | -| `fireworks` | `fireworks` | Fireworks AI | API কী | [লিংক](https://fireworks.ai) | API পরীক্ষার জন্য সাইনআপে $1 বিনামূল্যের প্রারম্ভিক ক্রেডিট | -| `free-ai` | `free-ai` | Free.ai | API কী, অ্যাগ্রিগেটর | [লিংক](https://free.ai) | ইমেইল যাচাইকরণের পর প্রতিদিন 30,000টি টোকেন স্ব-হোস্টেড মডেলগুলোর ব্যবহার অন্তর্ভুক্ত করে। পুলের অতিরিক্ত ব্যবহারের বিল প্রকৃত খরচে করা হতে পারে এবং প্রিমিয়াম বহিরাগত মডেলগুলো অর্থপ্রদত্ত। | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API কী | [লিংক](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API কী | [লিংক](https://freebuff.com) | Freebuff / Codebuff Auth Token লিখুন (CLI লগইন বা স্বয়ংক্রিয় হারভেস্টারের মাধ্যমে প্রাপ্ত)। | -| `freeinference` | `freeinference` | FreeInference | API কী, অ্যাগ্রিগেটর | [লিংক](https://freeinference.org) | কার্ড ছাড়াই বিনামূল্যে গবেষণা অ্যাক্সেস; Harvard-বহির্ভূত আবেদনকারীদের ম্যানুয়াল অনুমোদন প্রয়োজন এবং কোনো সাংখ্যিক কোটা প্রকাশ্যে নিশ্চিত করা হয়নি। | -| `freemodel-dev` | `fmd` | FreeModel.dev | API কী | [লিংক](https://freemodel.dev) | সাইন আপে $300 বিনামূল্যের ক্রেডিট — কোনো ক্রেডিট কার্ডের প্রয়োজন নেই। OpenAI-সামঞ্জস্যপূর্ণ API-এর মাধ্যমে GPT-5.4 এবং GPT-5.5 (OpenAI-এর সর্বশেষ ফ্ল্যাগশিপ মডেল) অ্যাক্সেস করুন। | -| `freetheai` | `fta` | FreeTheAi | API কী, অ্যাগ্রিগেটর | [লিংক](https://freetheai.xyz) | আপনার বিনামূল্যের API কী পেতে FreeTheAi Discord-এ যোগ দিন। | -| `friendliai` | `friendli` | FriendliAI | API কী | [লিংক](https://friendli.ai) | সার্ভারলেস ইনফারেন্সের জন্য বিনামূল্যের স্তর — কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা কেক ক্রেডিট বেক করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা কেক ক্রেডিট বেক করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা কেক ক্রেডিট বেক করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা কেক ক্রেডিট বেক করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা কেক ক্রেডিট বেক করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | -| `galadriel` | `galadriel` | Galadriel | API কী | [লিংক](https://galadriel.com) | ⚠️ **অবচিত।** api.galadriel.ai আর রিজলভ হয় না (2026-06-19-এর যাচাই); ইনফারেন্স API-টি বন্ধ হয়ে গেছে বলে মনে হচ্ছে। | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API কী | [লিংক](https://aistudio.google.com) | Google AI Studio-এর মাধ্যমে বিনামূল্যের স্তর উপলভ্য; বর্তমান মডেলভিত্তিক কোটা এবং আঞ্চলিক সীমা প্রযোজ্য | -| `getgoapi` | `ggo` | GoAPI | API কী, অ্যাগ্রিগেটর | [লিংক](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API কী | [লিংক](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API কী | [লিংক](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | সর্বজনীন Code Suggestions API-এর জন্য GitLab ব্যক্তিগত অ্যাক্সেস টোকেন। gitlab.com ব্যবহার না করলে একটি স্ব-হোস্টেড বেস URL কনফিগার করুন। | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API কী | [লিংক](https://opengateway.gitlawb.com) | বিনামূল্যের MiMo (xiaomi/mimo-v2.5) 2026-05-এ প্রত্যাহার করা হয়েছে — Opengateway এখন ব্যবহার অনুযায়ী মূল্য পরিশোধের ক্রেডিট গেটওয়ে; কোনো পুনরাবৃত্ত বিনামূল্যের মডেল নেই। | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API কী | [লিংক](https://opengateway.gitlawb.com) | বিনামূল্যের Nemotron প্রচার 2026-06-এ শেষ হয়েছে — GMI Cloud রুটটি এখন শুধুই ব্যবহার অনুযায়ী মূল্য পরিশোধের ক্রেডিটভিত্তিক। | -| `glm` | `glm` | GLM Coding | API কী | [লিংক](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | API কী | [লিংক](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API কী | [লিংক](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API কী | [লিংক](https://greenpt.com) | API সাবস্ক্রিপশন বিনামূল্যে তৈরি করা যায়; ইনফারেন্সের বিল প্রতি টোকেন অনুযায়ী করা হয়। বিনামূল্যের কোনো ইনফারেন্স বরাদ্দ প্রকাশ করা হয়নি। | -| `groq` | `groq` | Groq | API কী | [লিংক](https://groq.com) | বিনামূল্যের প্ল্যান: মডেলভিত্তিক সীমা (প্রতি চ্যাট মডেলে প্রতিদিন 200K টোকেন; RPM/RPD-এর জন্য console.groq.com/docs/rate-limits দেখুন) — অ্যাকাউন্টে কোনো পেমেন্ট পদ্ধতি সংরক্ষিত নেই। | -| `haiper` | `hp` | Haiper | API কী, ভিডিও | [লিংক](https://haiper.ai) | haiper.ai/haiper-api থেকে API কী নিন | -| `hcnsec` | `hcnsec` | Huancheng Public API | API কী | [লিংক](https://api.hcnsec.cn) | api.hcnsec.cn থেকে API কী নিন | -| `helixmind` | `helixmind` | HelixMind | API কী, অ্যাগ্রিগেটর | [লিংক](https://helixmind.online) | আগে প্রচারিত 3 RPM/50 RPD এবং কার্ডের প্রয়োজন নেই—এমন দাবিগুলো 2026-08-02-এর নিরীক্ষায় নিশ্চিত হয়নি; বর্তমান কোটা ও বিলিংয়ের জন্য অ্যাকাউন্ট যাচাইকরণ প্রয়োজন। | -| `helyxai` | `helyxai` | Helyx AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://helyxai.space) | কার্যকর Free প্ল্যানে প্রতিদিন 100,000 টোকেন নথিভুক্ত রয়েছে; সাইটটির পৃথক 2M+ বিপণন দাবি এর সঙ্গে সাংঘর্ষিক এবং এটিকে কোটার নিশ্চয়তা হিসেবে গণ্য করা হয় না। | -| `heroku` | `heroku` | Heroku AI | API কী, এন্টারপ্রাইজ | [লিংক](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API কী | [লিংক](https://huggingface.co) | হাজারো মডেলের জন্য বিনামূল্যের Inference API (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API কী | [লিংক](https://hyperbolic.xyz) | সার্ভারলেস ইনফারেন্সের জন্য সাইন আপে $1-5 ট্রায়াল ক্রেডিট | -| `ideogram` | `ideo` | Ideogram | API কী | [লিংক](https://ideogram.ai) | ideogram.ai/docs/api থেকে API কী নিন | -| `iflytek` | `iflytek` | iFlytek Spark | API কী | [লিংক](https://xinghuo.xfyun.cn) | console.xfyun.cn থেকে API কী নিন | -| `inception` | `inception` | Inception | API কী | [লিংক](https://docs.inceptionlabs.ai) | সাইন আপে 10M বিনামূল্যের টোকেন, কোনো ক্রেডিট কার্ডের প্রয়োজন নেই। | -| `inference-net` | `inet` | Inference.net | API কী | [লিংক](https://inference.net) | সাইন আপে $25 বিনামূল্যের ক্রেডিট, পাশাপাশি গবেষণা অনুদানও উপলভ্য | -| `internlm` | `internlm` | InternLM (Intern-S1) | API কী | [লিংক](https://internlm.intern-ai.org.cn/) | বিনামূল্যের মাসিক কোটা ~1M ইনপুট / 3M আউটপুট টোকেন (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API কী, embed/rerank | [লিংক](https://jina.ai) | api.jina.ai-এর জন্য Bearer API কী — embeddings, rerank, classify, segment এবং search। ড্যাশবোর্ডের কীগুলো JINA_AI_API_KEY-এর চেয়ে অগ্রাধিকার পায়। এটি Reader / r.jina.ai কার্ড নয় এবং URL নিয়ে আসে না। | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API কী | [লিংক](https://jina.ai/reader) | r.jina.ai URL-to-markdown-এর জন্য Bearer API কী (শুধু /v1/web/fetch)। /v1/embeddings বা /v1/rerank পরিবেশন করে না। Foundation API-এর একই Jina টোকেন কাজ করে; এই কার্ডটি খালি থাকলে OmniRoute একটি jina-ai ড্যাশবোর্ড কী বা JINA_AI_API_KEY পুনরায় ব্যবহার করে। | -| `kenari` | `kenari` | Kenari | API কী | [লিংক](https://kenari.id) | Authorization: Bearer -এ আপনার Kenari API কী (kn-...) ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://kenari.id/v1। | -| `kie` | `kie` | KIE.AI | API কী | [লিংক](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API কী, অ্যাগ্রিগেটর | [লিংক](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (লিগ্যাসি Moonshot API) | API কী | [লিংক](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API কী | [লিংক](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API কী | [লিংক](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API কী, ভিডিও | [লিংক](https://leonardo.ai) | leonardo.ai/developer থেকে API কী নিন | -| `liquid` | `liquid` | Liquid AI | API কী | [লিংক](https://liquid.ai) | liquid.ai থেকে API কী নিন | -| `literouter` | `literouter` | LiteRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://literouter.com) | বিনামূল্যের মডেল ভ্যারিয়েন্টগুলো :free সাফিক্স ব্যবহার করে; দৈনিক ক্রেডিট সীমা মডেলভেদে পরিবর্তিত হয় এবং বিনামূল্যের ইনপুট সর্বোচ্চ 5,000 টোকেনে সীমাবদ্ধ। | -| `llamagate` | `llamagate` | LlamaGate | API কী | [লিংক](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API কী, অ্যাগ্রিগেটর | [লিংক](https://llm.kiwi) | বিনামূল্যের প্ল্যানে auto এবং hrLLM পাওয়া যায়; প্রকাশিত প্রতি ঘণ্টায় 40টি অনুরোধের সীমা hrLLM-এর ক্ষেত্রে প্রযোজ্য। | -| `llm7` | `llm7` | LLM7.io | API কী | [লিংক](https://llm7.io) | যেকোনো অখালি কী ব্যবহার করুন (উদাহরণস্বরূপ 'unused')। পুরোনো বিল্ট-ইন মডেলগুলো model_unavailable ফেরত দিলে Available Models → Import from /models বা Auto-Sync ব্যবহার করুন; যাচাইকৃত সক্রিয় মডেল: gemini-3.1-flash-lite। | -| `llmgateway` | `llmgateway` | LLM Gateway | API কী, অ্যাগ্রিগেটর | [লিংক](https://llmgateway.io) | হোস্টেড Free প্ল্যান: অ্যাকাউন্টে কোনো ক্রেডিট না থাকলে বিনামূল্যের মডেলগুলো প্রতি 10 মিনিটে 5টি অনুরোধে সীমাবদ্ধ। | -| `logfare` | `logfare` | Logfare | API কী, অ্যাগ্রিগেটর | [লিংক](https://logfare.ai) | তাৎক্ষণিকভাবে একটি API কী পেতে https://logfare.ai/register-এ একটি বিনামূল্যের অ্যাকাউন্ট তৈরি করুন (ব্যবহারকারীর নাম/পাসওয়ার্ড, ইমেইল যাচাইয়ের প্রয়োজন নেই), তারপর সেটি এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | -| `longcat` | `lc` | LongCat AI | API কী | [লিংক](https://longcat.chat/platform/docs) | বিনামূল্যে: অ্যাকাউন্ট সাইনআপ + KYC যাচাইয়ের পর এককালীন 10M-টোকেন বরাদ্দ (LongCat-2.0)। শুধু একবারই — এটি পুনরাবৃত্ত দৈনিক/মাসিক বরাদ্দ নয়। | -| `magnific` | `freepik` | Magnific | API কী, ছবি | [লিংক](https://www.magnific.com) | magnific.com/user/api-keys থেকে একটি API কী নিন (হেডার x-magnific-api-key)। লিগ্যাসি Freepik ডেভেলপার কীগুলোও এখনও কাজ করে। | -| `maritalk` | `maritalk` | Maritalk | API কী | [লিংক](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://meganova.ai) | কার্ড ছাড়াই বিনামূল্যে সাইনআপ। প্রকাশিত Tier 1-এর প্রতি-মডেল কোটা মোট 550টি অনুরোধ/দিন; এগুলো কোনো অভিন্ন গ্লোবাল পুল নয় এবং সক্রিয় করা থাকলে অতিরিক্ত ব্যবহারের জন্য অর্থ প্রযোজ্য হতে পারে। | -| `meta-llama` | `meta` | Meta Llama API | API কী | [লিংক](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API কী, ভিডিও | [লিংক](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (চীন) | API কী | [লিংক](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API কী | [লিংক](https://mistral.ai) | বিনামূল্যের Experiment টিয়ার: সব মডেলে রেট-সীমিত অ্যাক্সেস, কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `mixedbread` | `mxbai` | Mixedbread AI | API কী | [লিংক](https://www.mixedbread.com) | Mixedbread embeddings API-এর জন্য Bearer API কী। | -| `mixlayer` | `mixlayer` | Mixlayer | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.mixlayer.com) | qwen/qwen3.5-4b-free মডেলটি প্রোটোটাইপিংয়ের জন্য বিনামূল্যে এবং রেট-সীমিত; কোনো নির্দিষ্ট প্রকাশ্য RPM বা দৈনিক কোটা নিশ্চিত করা হয়নি। | -| `mnn-ai` | `mnn-ai` | MNN AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://mnnai.ru) | বিনামূল্যের প্ল্যান: মাসিক $1 ক্রেডিট, 10 RPM এবং শুধু Free হিসেবে চিহ্নিত মডেলগুলোতে অ্যাক্সেস। | -| `modal` | `mdl` | Modal | API কী, এন্টারপ্রাইজ | [লিংক](https://modal.com/docs) | সক্রিয় করা থাকলে আপনার Modal ডিপ্লয়মেন্টকে সুরক্ষিত রাখা bearer টোকেনটি ব্যবহার করুন। বেস URL আপনার OpenAI-সামঞ্জস্যপূর্ণ Modal অ্যাপের দিকে নির্দেশ করা উচিত, উদাহরণস্বরূপ https://--.modal.run/v1। | -| `modelscope` | `ms` | ModelScope | API কী | [লিংক](https://modelscope.cn) | ModelScope API-Inference-এর মাধ্যমে বিনামূল্যের টিয়ার — Alibaba অ্যাকাউন্ট প্রয়োজন। | -| `monsterapi` | `monster` | MonsterAPI | API কী | [লিংক](https://monsterapi.ai) | ⚠️ **অবচিত।** Monster API 2026-06-30 তারিখে কার্যক্রম বন্ধ করেছে। বিকল্প OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার ব্যবহার করুন। | -| `moonshot` | `moonshot` | Kimi | API কী | [লিংক](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API কী | [লিংক](https://morphllm.com) | বিনামূল্যের টিয়ার: মাসে 250K ক্রেডিট, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API কী | [লিংক](https://github.com/meta-llama/llama-stack) | আপনার META_API_KEY env var-টি Bearer টোকেন হিসেবে ব্যবহার করুন। Muse Code CLI OpenAI Responses API ওয়্যার ফরম্যাট ব্যবহার করে (POST /responses)। | -| `naga-ac` | `naga` | Naga.ac | API কী, অ্যাগ্রিগেটর | [লিংক](https://naga.ac) | naga.ac থেকে API কী নিন — Google/GitHub/Discord দিয়ে সাইনআপ করা যায়। | -| `naga-ai` | `naga-ai` | Naga AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://naga.ac) | :free চিহ্নিত মডেলগুলো সর্বজনীনভাবে তালিকাভুক্ত, তবে কোনো সংখ্যাসূচক কোটা নিশ্চিত করা হয়নি। Naga-এর নীতিতে সতর্ক করা হয়েছে যে ফ্রি-টিয়ারের প্রম্পট ও আউটপুট সংগ্রহ করা হতে পারে বা প্রশিক্ষণের জন্য ব্যবহার করা হতে পারে। | -| `nanogpt` | `nanogpt` | NanoGPT | API কী | [লিংক](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API কী | [লিংক](https://bynara.id) | একটি বিনামূল্যের NaraRouter অ্যাকাউন্ট তৈরি করুন, আপনার Telegram লিঙ্ক করুন (/v1 উত্তর পাওয়ার আগে আবশ্যক), তারপর কীটি এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | -| `navy` | `navy` | NavyAI | API কী | [লিংক](https://api.navy) | NavyAI ড্যাশবোর্ড থেকে একটি বিনামূল্যের API কী তৈরি করুন, তারপর সেটি এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | -| `nebius` | `nebius` | Nebius AI | API কী | [লিংক](https://nebius.com) | API পরীক্ষার জন্য সাইনআপে ~$1 ট্রায়াল ক্রেডিট | -| `nlpcloud` | `nlpc` | NLP Cloud | API কী | [লিংক](https://docs.nlpcloud.com) | Authorization: Token -এ আপনার NLP Cloud API কী ব্যবহার করুন। ডিফল্টভাবে OmniRoute https://api.nlpcloud.io/v1/gpu//chatbot-এর চ্যাটবট এন্ডপয়েন্টকে লক্ষ্য করে। | -| `nomic` | `nomic` | Nomic | API কী | [লিংক](https://nomic.ai) | atlas.nomic.ai থেকে API কী নিন | -| `nous-research` | `nous` | Nous Research | API কী | [লিংক](https://portal.nousresearch.com/help) | আপনার Nous Portal API কী ব্যবহার করুন। OmniRoute https://inference-api.nousresearch.com/v1-এর অফিসিয়াল OpenAI-সামঞ্জস্যপূর্ণ ইনফারেন্স এন্ডপয়েন্টকে লক্ষ্য করে। | -| `novita` | `novita` | Novita AI | API কী, ভিডিও, অ্যাগ্রিগেটর | [লিংক](https://novita.ai) | সাইনআপে $0.50 ট্রায়াল ক্রেডিট (প্রায় 1 বছর বৈধ) | -| `nscale` | `nscale` | nScale | API কী | [লিংক](https://nscale.com) | ইনফারেন্স পরীক্ষার জন্য সাইনআপে $5 বিনামূল্যের ক্রেডিট | -| `nube` | `nube` | Nube.sh | API কী | [লিংক](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API কী | [লিংক](https://build.nvidia.com) | বিনামূল্যের ডেভ অ্যাক্সেস: ~40 RPM, 70+ মডেল (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API কী, এন্টারপ্রাইজ | [লিংক](https://www.oracle.com/artificial-intelligence/generative-ai) | আপনার OCI Generative AI API কী বা IAM bearer টোকেন ব্যবহার করুন। বেস URL হতে পারে https://inference.generativeai..oci.oraclecloud.com/openai/v1/। | -| `ofoxai` | `ofoxai` | OfoxAI | API কী, অ্যাগ্রিগেটর | [লিংক](https://ofox.ai) | বর্তমান ক্যাটালগে কোনো সর্বজনীন সংখ্যাসূচক কোটা ছাড়াই 10+ বিনামূল্যের মডেলের প্রচার করা হয়েছে; প্রোডাকশনে ব্যবহারের আগে আপস্ট্রিম উৎস, সংরক্ষণ এবং প্রশিক্ষণের শর্তাবলি পর্যালোচনা করুন। | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API কী | [লিংক](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API কী | [লিংক](https://1min.ai) | https://docs.1min.ai/docs/api/create-api-key-এ একটি API কী তৈরি করুন, তারপর সেটি এখানে পেস্ট করুন। | -| `openadapter` | `oad` | OpenAdapter | API কী | [লিংক](https://openadapter.dev) | Authorization: Bearer sk-cv--এ আপনার OpenAdapter API কী ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://api.openadapter.in/v1। | -| `openai` | `openai` | OpenAI | API কী | [লিংক](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API কী | [লিংক](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API কী | [লিংক](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API কী | [লিংক](https://openference.com) | বিনামূল্যের প্ল্যান: ওপেন-সোর্স মডেলসহ 3 দিনের ট্রায়াল — কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `openrouter` | `openrouter` | OpenRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://openrouter.ai) | :free সাফিক্সসহ $0/token মূল্যের বিনামূল্যের মডেল - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API কী | [লিংক](https://openvecta.com) | LLM, এমবেডিং এবং রিজনিং মডেলজুড়ে OpenAI-সামঞ্জস্যপূর্ণ ইনফারেন্সের জন্য সাইনআপে বিনামূল্যের ক্রেডিট | -| `opper` | `opper` | Opper | API কী, অ্যাগ্রিগেটর | [লিংক](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API কী | [লিংক](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API কী | [লিংক](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API কী | [লিংক](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API কী | [লিংক](https://www.perplexity.ai) | আপনার Perplexity API কী ব্যবহার করুন। OmniRoute, Agent API মডেল ID-গুলোকে Perplexity-এর Responses-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের মাধ্যমে রাউট করে। | -| `piapi` | `pi` | PiAPI | API কী, অ্যাগ্রিগেটর | [লিংক](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API কী | [লিংক](https://pioneer.ai) | $75 বিনামূল্যের ব্যবহার ক্রেডিট — কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `plamo` | `plamo` | PLaMo | API কী | [লিংক](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API কী, অ্যাগ্রিগেটর | [লিংক](https://creator.poe.com/api-reference) | Poe OpenAI-সামঞ্জস্যপূর্ণ API-এর জন্য Bearer API কী। | -| `poixe-ai` | `poixe-ai` | Poixe AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://poixe.com) | বর্তমান সর্বজনীন বিনামূল্যের সীমা কম এবং মডেল-গ্রুপভিত্তিক: large-cup মডেলের জন্য 2 RPM/5 RPD এবং small-cup মডেলের জন্য 20 RPM/50 RPD। | -| `pollinations` | `pol` | Pollinations AI | API কী, ভিডিও | [লিংক](https://pollinations.ai) | নথিভুক্ত বিনামূল্যের মডেলগুলোতে বেনামী/কীবিহীন অ্যাক্সেস যথাসাধ্য ভিত্তিতে প্রদান করা হয়। একই নেটওয়ার্ক থেকে স্থানীয় v3.8.50 যাচাইকরণে (2026-07-31) OmniRoute-এর মাধ্যমে 401 এবং সরাসরি আপস্ট্রিম প্রোবে Cloudflare 1010 পাওয়া গেছে। প্রিমিয়াম মডেলের জন্য এখনো enter.pollinations.ai থেকে একটি Pollinations API কী প্রয়োজন। | -| `poolside` | `poolside` | Poolside | API কী | [লিংক](https://poolside.ai) | Preview চলাকালে Laguna S 2.1 এবং XS 2.1 বিনামূল্যে; কোনো সর্বজনীন সংখ্যাসূচক কোটা প্রকাশিত হয়নি। | -| `predibase` | `predibase` | Predibase | API কী | [লিংক](https://predibase.com) | ⚠️ **অবচিত।** serving.app.predibase.com আর রিজলভ হয় না (সুইপ 2026-06-19); পরিচালিত সার্ভিং API-টি বন্ধ হয়ে গেছে বলে মনে হচ্ছে। | -| `publicai` | `publicai` | PublicAI | API কী | [লিংক](https://publicai.co) | একটি API কী প্রয়োজন — সাইনআপে এককালীন ক্রেডিট, এরপর অর্থপ্রদত্ত | -| `qianfan` | `qianfan` | Baidu Qianfan | API কী | [লিংক](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API কী | [লিংক](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API কী | [লিংক](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API কী | [লিংক](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API কী, ছবি | [লিংক](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API কী | [লিংক](https://regolo.ai) | regolo.ai থেকে আপনার Regolo API কী সংগ্রহ করুন, তারপর এটি এখানে একটি Bearer টোকেন হিসেবে পেস্ট করুন। | -| `reka` | `reka` | Reka | API কী | [লিংক](https://docs.reka.ai/chat/overview) | আপনার Reka API কী ব্যবহার করুন। OmniRoute OpenAI-সামঞ্জস্যপূর্ণ বেস URL https://api.reka.ai/v1 সমর্থন করে এবং সামঞ্জস্যের জন্য Authorization ও X-Api-Key—উভয় হেডারই পাঠায়। | -| `requesty` | `requesty` | Requesty | API কী | [লিংক](https://requesty.ai) | বিনামূল্যের স্তরে প্রতিদিন প্রায় 200টি অনুরোধ—মাল্টি-মডেল রাউটিং গেটওয়ে (300টির বেশি মডেল) | -| `routeway` | `routeway` | Routeway | API কী | [লিংক](https://routeway.ai) | routeway.ai-এ একটি বিনামূল্যের API কী তৈরি করুন, তারপর এটি এখানে একটি Bearer টোকেন হিসেবে পেস্ট করুন। | -| `runwayml` | `runway` | Runway | API কী, ভিডিও | [লিংক](https://docs.dev.runwayml.com) | Authorization: Bearer -এ আপনার Runway API কী ব্যবহার করুন। OmniRoute https://api.dev.runwayml.com/v1-এ বর্তমান Runway API ব্যবহার করে এবং প্রয়োজনীয় X-Runway-Version হেডার স্বয়ংক্রিয়ভাবে পাঠায়। | -| `sambanova` | `samba` | SambaNova | API কী | [লিংক](https://sambanova.ai) | সাইন আপে $5 বিনামূল্যের ক্রেডিট (30 দিনের মেয়াদ), কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | -| `sap` | `sap` | SAP Generative AI Hub | API কী, এন্টারপ্রাইজ | [লিংক](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | আপনার SAP AI Core Bearer টোকেন ব্যবহার করুন। বেস URL আপনার AI_API_URL রুট অথবা Generative AI Hub-এর একটি deploymentUrl হতে পারে। | -| `sarvam` | `sarvam` | Sarvam AI | API কী | [লিংক](https://docs.sarvam.ai) | সাইন আপে ₹1,000 বিনামূল্যের ক্রেডিট—কখনো মেয়াদোত্তীর্ণ হয় না | -| `scaleway` | `scw` | Scaleway AI | API কী | [লিংক](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | নতুন অ্যাকাউন্টের জন্য 1M বিনামূল্যের টোকেন—EU/GDPR-সম্মত (প্যারিস), Qwen3 235B ও Llama 70B | -| `sealion` | `sealion` | SEA-LION | API কী | [লিংক](https://sea-lion.ai) | Google দিয়ে sea-lion.ai-এ সাইন ইন করুন (কার্ড বা অঞ্চলগত বাধা নেই), একটি API কী তৈরি করুন, তারপর এটি এখানে পেস্ট করুন। | -| `seekai` | `ska` | SeekAi | API কী, অ্যাগ্রিগেটর | [লিংক](https://seekai.cc) | https://seekai.cc-এ একটি API কী তৈরি করুন, তারপর এটি এখানে একটি Bearer টোকেন হিসেবে পেস্ট করুন। | -| `segmind` | `segmind` | Segmind | API কী, ছবি, ভিডিও | [লিংক](https://segmind.com) | x-api-key হেডারে আপনার Segmind API কী ব্যবহার করুন। OmniRoute https://api.segmind.com/v1/ ব্যবহার করে এবং তৈরি করা ছবি/ভিডিওর বাইট সরাসরি ফেরত দেয়। | -| `sensenova` | `sensenova` | SenseNova | API কী | [লিংক](https://platform.sensenova.cn) | platform.sensenova.cn থেকে API কী সংগ্রহ করুন | -| `siliconflow` | `siliconflow` | SiliconFlow | API কী | [লিংক](https://cloud.siliconflow.com) | পরিচয় যাচাইয়ের পর $1 বিনামূল্যের ক্রেডিট এবং বর্তমানে তালিকাভুক্ত $0 মডেল; প্রাপ্যতা ও সীমা পরিবর্তিত হতে পারে | -| `snowflake` | `snowflake` | Snowflake Cortex | API কী, এন্টারপ্রাইজ | [লিংক](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API কী | [লিংক](https://xinghuo.xfyun.cn) | console.xfyun.cn থেকে API কী সংগ্রহ করুন | -| `speka` | `speka` | Speka AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://speka.me) | বিনামূল্যের প্ল্যান: মাসিক $1 ব্যবহার, 10 RPM, একটি API কী এবং ওপেন মডেল ও প্লেগ্রাউন্ডে অ্যাক্সেস; কোনো কার্ডের প্রয়োজন নেই। | -| `stability-ai` | `stability` | Stability AI | API কী, ছবি | [লিংক](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API কী | [লিংক](https://stepfun.com) | platform.stepfun.com থেকে API কী সংগ্রহ করুন | -| `sumopod` | `sumopod` | SumoPod | API কী | [লিংক](https://ai.sumopod.com) | Authorization: Bearer -এ আপনার SumoPod API কী (sk-...) ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://ai.sumopod.com/v1। | -| `suno` | `suno` | Suno | API কী | [লিংক](https://suno.ai) | suno.ai থেকে সেশন কুকি পেস্ট করুন (Clerk প্রমাণীকরণ) | -| `synthetic` | `synthetic` | Synthetic | API কী, অ্যাগ্রিগেটর | [লিংক](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API কী, অ্যাগ্রিগেটর | [লিংক](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API কী | [লিংক](https://hunyuan.tencent.com) | console.cloud.tencent.com থেকে API কী সংগ্রহ করুন | -| `thebai` | `thebai` | TheB.AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://theb.ai) | TheB.AI-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API কী। | -| `tinyfish` | `tf` | TinyFish Fetch | API কী | [লিংক](https://docs.tinyfish.ai/fetch-api) | agent.tinyfish.ai/api-keys থেকে X-API-Key | -| `together` | `together` | Together AI | API কী, ভিডিও | [লিংক](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API কী | [লিংক](https://agent-router.gaib.ai) | Authorization: Bearer -এ আপনার Token Kiosk API কী ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ে। API বেস URL: https://agent-router.gaib.ai/v1। | -| `tokenreply` | `tokenreply` | TokenReply | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.tokenreply.com) | বিনামূল্য হিসেবে চিহ্নিত মডেলগুলোর দৈনিক সীমা মডেল ও ক্যাম্পেইনভেদে আলাদা; নির্দিষ্ট কোনো সামগ্রিক বিনামূল্যের কোটা প্রকাশ করা হয়নি। | -| `tokenrouter` | `trk` | TokenRouter | API কী | [লিংক](https://tokenrouter.com) | Authorization: Bearer -এ আপনার TokenRouter API কী ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://api.tokenrouter.com/v1। | -| `topaz` | `topaz` | Topaz | API কী, ছবি | [লিংক](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API কী | [লিংক](https://docs.opentyphoon.ai) | 5 req/s এবং 200 req/m হারসীমাসহ বিনামূল্যের API কী। | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API কী | [লিংক](https://uncensored.com) | আপনার uncensored.com Developer API কী (uai_sk_live_...) ব্যবহার করুন। OmniRoute এটিকে X-api-key হেডার হিসেবে OpenAI-সামঞ্জস্যপূর্ণ https://api.uncensored.com/api/v1 এন্ডপয়েন্টে পাঠায়। কীটির কখনও মেয়াদ শেষ হয় না। এটি মিটারযুক্ত/ক্রেডিটভিত্তিক পরিষেবা; মিটারবিহীন সাবস্ক্রিপশন চ্যাটটি পৃথক 'uc' প্রোভাইডার। | -| `udio` | `udio` | Udio | API কী | [লিংক](https://udio.com) | udio.com থেকে সেশন কুকি (Supabase auth) পেস্ট করুন | -| `unorouter` | `unorouter` | UnoRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://unorouter.ai) | :free সাফিক্সযুক্ত মডেলগুলো ব্যালেন্স থেকে অর্থ কাটে না; প্রতি ব্যবহারকারীর জন্য প্রতিটি বিনামূল্যের মডেলে সীমা হলো প্রতি মিনিটে 1টি অনুরোধ। | -| `upstage` | `upstage` | Upstage | API কী | [লিংক](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API কী | [লিংক](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API কী | [লিংক](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API কী, অ্যাগ্রিগেটর | [লিংক](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API কী, এন্টারপ্রাইজ | [লিংক](https://cloud.google.com/vertex-ai) | Service Account JSON, একটি OAuth অ্যাক্সেস টোকেন, একটি Vertex Express API কী অথবা একটি সার্ভিস-অ্যাকাউন্ট-সংযুক্ত অথরাইজেশন কী প্রদান করুন। Express মোড শুধু Gemini সমর্থন করে; পার্টনার মডেলগুলোর জন্য প্রজেক্ট-স্কোপড ক্রেডেনশিয়াল প্রয়োজন। | -| `vertex-partner` | `vp` | Vertex AI Partners | API কী, এন্টারপ্রাইজ | [লিংক](https://cloud.google.com/vertex-ai) | Service Account JSON অথবা OAuth ক্রেডেনশিয়াল প্রদান করুন। একটি সার্ভিস-অ্যাকাউন্ট-সংযুক্ত অথরাইজেশন কী ডিসকভারিও সমর্থন করে, তবে পার্টনার ইনফারেন্সের জন্য অতিরিক্তভাবে এর Google Cloud প্রজেক্ট ID প্রয়োজন। স্ট্যান্ডার্ড Express কীগুলো শুধু Gemini সমর্থন করে। | -| `void-ai` | `void-ai` | Void AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://voidai.app) | পাবলিক মডেল ক্যাটালগে কিছু মডেলকে বিনামূল্যের প্ল্যানের প্রয়োজনীয়তাসহ চিহ্নিত করা হয়েছে, তবে অ্যাক্সেস শর্তসাপেক্ষ এবং কোনো সংখ্যাগত কোটা নিশ্চিত করা হয়নি। | -| `volcengine` | `volcengine` | Volcengine | API কী | [লিংক](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API কী | [লিংক](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | আপনার Volcano Engine অ্যাকাউন্ট সংযুক্ত করুন অথবা একটি Ark Agent Plan সাবস্ক্রিপশন API কী ব্যবহার করুন। | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API কী | [লিংক](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | আপনার Volcano Engine অ্যাকাউন্ট সংযুক্ত করুন অথবা একটি Ark Coding Plan সাবস্ক্রিপশন API কী ব্যবহার করুন। | -| `voyage-ai` | `voyage` | Voyage AI | API কী, এমবেড/রির্যাঙ্ক | [লিংক](https://www.voyageai.com) | Voyage AI এমবেডিং ও রির্যাঙ্ক API-গুলোর জন্য Bearer API কী। | -| `wafer` | `wafer` | Wafer AI | API কী | [লিংক](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API কী | [লিংক](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API কী, এন্টারপ্রাইজ | [লিংক](https://www.ibm.com/products/watsonx-ai) | আপনার watsonx bearer টোকেন ব্যবহার করুন। বেস URL হতে পারে https://.ml.cloud.ibm.com/ml/gateway/v1/ অথবা একটি স্ব-পরিচালিত /ml/gateway/v1 এন্ডপয়েন্ট। | -| `writer` | `writer` | Writer | API কী | [লিংক](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API কী | [লিংক](https://x5lab.dev) | Authorization: Bearer -এ আপনার X5Lab API কী (x5-...) ব্যবহার করুন। সম্পূর্ণভাবে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://api.x5lab.dev/v1। | -| `xai` | `xai` | xAI (Grok) | API কী | [লিংক](https://x.ai) | একটি অফিসিয়াল xAI API কী ব্যবহার করুন অথবা xAI OAuth দিয়ে সাইন ইন করুন। Grok Build JWT সেশনগুলো পৃথক প্রোভাইডার হিসেবেই থাকে। | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API কী | [লিংক](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API কী | [লিংক](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API কী, অ্যাগ্রিগেটর | [লিংক](https://xkiro.com) | xkiro.com-এ একটি বিনামূল্যের অ্যাকাউন্ট তৈরি করে এখানে কীটি পেস্ট করুন (Bearer; x-api-key-ও গ্রহণযোগ্য)। | -| `yi` | `yi` | Yi (01.AI) | API কী | [লিংক](https://01.ai) | platform.lingyiwanwu.com থেকে API কী নিন | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API কী, অ্যাগ্রিগেটর | [লিংক](https://yolo-auto.com) | বিনামূল্যের API অ্যাক্সেস অনুরোধ-সীমাবদ্ধ এবং পরীক্ষার উদ্দেশ্যে তৈরি; কোনো সংখ্যাগত দৈনিক কোটা প্রকাশ করা হয়নি এবং বিনামূল্যের অ্যাক্সেস অনির্দিষ্টকাল থাকবে—এমন প্রতিশ্রুতিও নেই। | -| `zai` | `zai` | Z.AI | API কী | [লিংক](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API কী | [লিংক](https://zenmux.ai) | Authorization: Bearer -এ আপনার ZenMux API কী ব্যবহার করুন। ZenMux সম্পূর্ণভাবে OpenAI-সামঞ্জস্যপূর্ণ। বেস URL: https://zenmux.ai/api/v1। | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.zerolimitai.com) | সাময়িক বিনামূল্যের ট্রায়ালের বিজ্ঞাপন দেওয়া হয়েছে, তবে অফিসিয়াল পেজগুলোতে 3 ও 7 দিনের মধ্যে অসংগতি রয়েছে; দৈনিক 100টি কলের দাবিকে স্থায়ী হিসেবে গণ্য করা হয় না। | -| `zylo-api` | `zylo` | Zylo API | API কী, অ্যাগ্রিগেটর | [লিংক](https://zyloai.net) | বেসিক প্ল্যান: 10 RPM, প্রতিদিন 7,200টি অনুরোধ এবং প্রতিদিন 200,000টি টোকেন; শুধু Basic টেক্সট মডেলে সীমাবদ্ধ। | +## API কী প্রদানকারী (পেইড / ফ্রি-ক্রেডিটসহ পেইড) (242) + +| ID | উপনাম | নাম | ট্যাগ | ওয়েবসাইট | নোট | +| ------------------------ | --------------- | ------------------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API কী | [লিংক](https://ai.360.cn) | ai.360.cn থেকে API কী সংগ্রহ করুন | +| `agentrouter` | `agentrouter` | AgentRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://agentrouter.org) | সাইন আপ করলে $200-এর বিনামূল্যের ক্রেডিট — মাল্টি-মডেল রাউটিং গেটওয়ে | +| `agnes` | `agnes` | Agnes AI | API কী, ভিডিও | [লিংক](https://agnes-ai.com) | agnes-ai.com থেকে API কী সংগ্রহ করুন | +| `agnes-cn` | `agnescn` | Agnes AI (চীন) | API কী | [লিংক](https://api.agnes-ai.cn) | Agnes CN সাইট থেকে API কী সংগ্রহ করুন। | +| `ai21` | `ai21` | AI21 Labs | API কী | [লিংক](https://www.ai21.com) | সাইন আপ করলে $10-এর ট্রায়াল ক্রেডিট (৩ মাস বৈধ), ক্রেডিট কার্ডের প্রয়োজন নেই | +| `aimlapi` | `aiml` | AI/ML API | API কী, অ্যাগ্রিগেটর | [লিংক](https://aimlapi.com) | বিনামূল্যের স্তর স্থগিত (2026) — AI/ML API এখন কেবল ব্যবহার অনুযায়ী অর্থপ্রদানের ভিত্তিতে চলে (ন্যূনতম $20 টপ-আপ); নিয়মিত কোনো বিনামূল্যের ক্রেডিট নেই। | +| `ainative` | `ainative` | AINative Studio | API কী | [লিংক](https://ainative.studio) | ainative.studio-তে একটি বিনামূল্যের API কী তৈরি করুন (কার্ডের প্রয়োজন নেই), তারপর সেটি এখানে Bearer token হিসেবে পেস্ট করুন। | +| `aion` | `aion` | Aion Labs | API কী | [লিংক](https://www.aionlabs.ai) | aionlabs.ai-তে একটি বিনামূল্যের API কী তৈরি করুন (কার্ডের প্রয়োজন নেই), তারপর সেটি এখানে Bearer token হিসেবে পেস্ট করুন। | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API কী | [লিংক](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (চীন) | API কী | [লিংক](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API কী | [লিংক](https://developer.ant-ling.com/en/docs/) | Ant Ling API কনসোলে (https://chat.ant-ling.com/open) নিবন্ধন করে একটি API কী তৈরি করুন, তারপর সেটি এখানে পেস্ট করুন। OmniRoute চ্যাট ট্রাফিককে https://api.ant-ling.com/v1/chat/completions-এ রাউট করে; প্রোভাইডারটি OpenAI-সামঞ্জস্যপূর্ণ এবং Anthropic-সামঞ্জস্যপূর্ণ ইন্টারফেসও প্রদান করে। | +| `anthropic` | `anthropic` | Anthropic | API কী | [লিংক](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://anyapi.ai) | বিনামূল্যের প্ল্যান: যোগ্য Free/Basic মডেলের জন্য দৈনিক 100,000 ANY Tokens এবং 100 RPM; ক্রেডিট কার্ডের প্রয়োজন নেই। | +| `api-airforce` | `af` | Api.airforce | API কী | [লিংক](https://api.airforce) | Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash ও DeepSeek-V3-সহ বিনামূল্যের স্তরে 55টি মডেল | +| `arcee-ai` | `arcee` | Arcee AI | API কী | [লিংক](https://arcee.ai) | arcee.ai থেকে API কী সংগ্রহ করুন | +| `auriko` | `auriko` | Auriko | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.auriko.ai) | বিনামূল্যের প্ল্যানে 1,000 Platform RPM এবং 10,000 BYOK RPM প্রকাশিত আছে। প্ল্যাটফর্ম ইনফারেন্সের ক্ষেত্রেও প্রোভাইডারের খরচ প্রযোজ্য হয়; এটি বিনামূল্যের টোকেন পুল বা সীমাহীন বিনামূল্যের ইনফারেন্স নয়। | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API কী, এন্টারপ্রাইজ | [লিংক](https://learn.microsoft.com/azure/ai-foundry) | আপনার Azure AI Foundry কী ব্যবহার করুন। বেস URL হতে পারে https://.services.ai.azure.com/openai/v1/ অথবা https://.openai.azure.com/openai/v1/। | +| `azure-openai` | `azure` | Azure OpenAI | API কী, এন্টারপ্রাইজ | [লিংক](https://azure.microsoft.com/products/ai-services/openai-service) | আপনার Azure OpenAI API কী ব্যবহার করুন। বেস URL হিসেবে আপনার রিসোর্স এন্ডপয়েন্ট ব্যবহার করা উচিত, যেমন https://my-resource.openai.azure.com। | +| `bai` | `bai` | b.ai | API কী | [লিংক](https://b.ai) | b.ai-এর OpenAI-সামঞ্জস্যপূর্ণ LLM গেটওয়ের জন্য Bearer API কী (TheB.AI থেকে পৃথক)। https://docs.b.ai-তে একটি কী তৈরি করুন, তারপর OpenAI-সামঞ্জস্যপূর্ণ বেস URL হিসেবে https://api.b.ai/v1 ব্যবহার করুন। | +| `baichuan` | `baichuan` | Baichuan | API কী | [লিংক](https://www.baichuan-ai.com/) | platform.baichuan-ai.com থেকে API কী সংগ্রহ করুন | +| `baidu` | `baidu` | Baidu (ERNIE) | API কী | [লিংক](https://ernie.baidu.com/) | console.bce.baidu.com থেকে API কী সংগ্রহ করুন | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API কী | [লিংক](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API কী | [লিংক](https://baseten.co) | GPU ইনফারেন্সের জন্য $30-এর বিনামূল্যের ট্রায়াল ক্রেডিট | +| `bazaarlink` | `bzl` | BazaarLink | API কী | [লিংক](https://bazaarlink.ai) | Authorization: Bearer -এ আপনার BazaarLink API কী (যা sk-bl- দিয়ে শুরু হয়) ব্যবহার করুন। OpenAI SDK, https://bazaarlink.ai/api/v1 বেস URL-এর সঙ্গে কাজ করে। মডেলগুলো provider/model-name ফরম্যাট ব্যবহার করে। | +| `bedrock` | `bedrock` | Amazon Bedrock | API কী, এন্টারপ্রাইজ | [লিংক](https://aws.amazon.com/bedrock) | আপনার Amazon Bedrock API কী ব্যবহার করুন এবং যে AWS অঞ্চলে আপনার মডেলগুলো সক্রিয় করা আছে সেটি কনফিগার করুন (যেমন eu-west-2)। OmniRoute সরাসরি Bedrock-এর নেটিভ Converse API কল করে। | +| `black-forest-labs` | `bfl` | Black Forest Labs | API কী, ছবি | [লিংক](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API কী | [লিংক](https://blackbox.ai) | ⚠️ **অবচিত।** প্রতিটি পাথ ভ্যারিয়েন্টে api.blackbox.ai HTTP 404 ফেরত দেয় (পরীক্ষা 2026-08-21); পাবলিক ইনফারেন্স ইন্টারফেসটি সীমাবদ্ধ enterprise.blackbox.ai/v1 এন্ডপয়েন্টে স্থানান্তরিত হয়েছে। | +| `bluesminds` | `bm` | BluesMinds | API কী | [লিংক](https://www.bluesminds.com) | দৈনিক বিনামূল্যের pi ক্রেডিট — GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen ও Kimi K2-সহ 200টির বেশি মডেল সমর্থন করে | +| `byteplus` | `bpm` | BytePlus ModelArk | API কী | [লিংক](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API কী | [লিংক](https://bytez.com) | $1-এর বিনামূল্যের ক্রেডিট, প্রতি ৪ সপ্তাহে নবায়ন হয় | +| `cerebras` | `cerebras` | Cerebras | API কী | [লিংক](https://inference.cerebras.ai) | একবারের জন্য $5 সাইন-আপ ক্রেডিট (৩০ দিন বৈধ); একটি পেমেন্ট পদ্ধতি প্রয়োজন। এটি নিয়মিত বিনামূল্যের স্তর নয়। | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API কী | [লিংক](https://hyper.charm.land) | সাইন আপ করলে মাসে 100টি বিনামূল্যের Hypercredits | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API কী, অ্যাগ্রিগেটর | [লিংক](https://api.oriper.com) | অফিসিয়াল মেটাডেটায় মাসে 2M টোকেনের কথা বলা হয়েছে, কিন্তু নিরীক্ষার সময় পাবলিক সাইট ও ডকুমেন্টেশন ব্লক করা ছিল; কোটা এবং ব্র্যান্ড ম্যাপিংকে অনিশ্চিত হিসেবে বিবেচনা করুন। | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API key, অ্যাগ্রিগেটর | [লিংক](https://chatanywhere.tech) | কেবল ব্যক্তিগত, শিক্ষামূলক বা গবেষণামূলক ব্যবহারের জন্য: প্রকাশ্য ডকুমেন্টেশনে প্রতিদিন 10,000 পয়েন্ট এবং প্রতি IP/key-এর জন্য প্রতিদিন 200টি অনুরোধের কথা উল্লেখ রয়েছে; বাণিজ্যিক ট্র্যাফিকের জন্য ব্যবহার করবেন না। | +| `cheaperinference` | `cinf` | Cheaper Inference | API key | [লিংক](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API key | [লিংক](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API key, অ্যাগ্রিগেটর | [লিংক](https://chutes.ai) | Chutes-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API key। | +| `clarifai` | `clarifai` | Clarifai | API key, এন্টারপ্রাইজ | [লিংক](https://docs.clarifai.com) | আপনার Clarifai PAT অথবা অ্যাপ-নির্দিষ্ট API key ব্যবহার করুন। OmniRoute https://api.clarifai.com/v2/ext/openai/v1-এ থাকা OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টকে লক্ষ্য করে এবং Authorization: Key দিয়ে প্রমাণীকরণ করে। | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API key, অ্যাগ্রিগেটর | [লিংক](https://cloudcode.one) | প্রকাশিত বিনামূল্যের মডেলগুলোর মধ্যে glm-4.7-flash এবং glm-4.6v-flash রয়েছে; কোনো সংখ্যাসূচক কোটা প্রকাশ করা হয়নি এবং key তৈরি করতে ক্রেডিট বা কুপন প্রয়োজন হতে পারে। | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API key | [লিংক](https://developers.cloudflare.com/workers-ai) | API Token এবং Account ID—উভয়ই প্রয়োজন (dash.cloudflare.com-এ পাওয়া যাবে) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API key | [লিংক](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API key | [লিংক](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API key | [লিংক](https://cohere.com) | বিনামূল্যের ট্রায়াল: পরীক্ষার জন্য প্রতি মাসে 1,000টি API কল, কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | +| `command-code` | `cmd` | Command Code | API key | [লিংক](https://commandcode.ai/) | একটি Command Code API key ব্যবহার করুন। অনুরোধগুলো Command Code-এর /provider/v1/chat/completions এন্ডপয়েন্টে পাঠানো হয়। | +| `coze` | `coze` | Coze | API key | [লিংক](https://coze.com) | coze.com/open/api থেকে API key নিন | +| `crof` | `crof` | CrofAI | API key | [লিংক](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API key | [লিংক](https://cursor.com/dashboard/api) | cursor.com/dashboard/api থেকে একটি Cursor ব্যবহারকারী API key (crsr_...) পেস্ট করুন। OmniRoute প্রয়োজন অনুযায়ী এটিকে একটি সেশন টোকেনের সঙ্গে বিনিময় করে; কোনো IDE বা cursor-agent ইনস্টল করার প্রয়োজন নেই। ব্যবহারের বিল key-টির মালিকানাধীন Cursor প্ল্যানে ধার্য হয়। | +| `dahl` | `dahl` | Dahl | API key | [লিংক](https://inference.dahl.global) | স্বয়ংক্রিয়ভাবে একটি টোকেন তৈরি করতে 'Add Account'-এ ক্লিক করুন, অথবা একটি ম্যানুয়াল API key যোগ করুন। | +| `databricks` | `databricks` | Databricks | API key, এন্টারপ্রাইজ | [লিংক](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API key, এন্টারপ্রাইজ | [লিংক](https://docs.datarobot.com) | আপনার DataRobot API টোকেন ব্যবহার করুন। ঐচ্ছিক Base URL হিসেবে অ্যাকাউন্টের রুট (LLM Gateway-এর জন্য) অথবা /api/v2/deployments/-এর অধীনে থাকা একটি ডিপ্লয়মেন্ট URL ব্যবহার করা যেতে পারে। | +| `deepai` | `deepai` | DeepAI | API key, ছবি | [লিংক](https://deepai.org) | আপনার DeepAI API key ব্যবহার করুন। deepai.org থেকে একটি নিন—এর জন্য Pro সাবস্ক্রিপশন ($9.99/মাস) প্রয়োজন। | +| `deepinfra` | `deepinfra` | DeepInfra | API key | [লিংক](https://deepinfra.com) | API পরীক্ষা ও মডেল অন্বেষণের জন্য সাইনআপে বিনামূল্যের ক্রেডিট | +| `deepseek` | `ds` | DeepSeek | API key | [লিংক](https://platform.deepseek.com) | সাইনআপে 5M বিনামূল্যের টোকেন—কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | +| `dgrid` | `dgrid` | DGrid | API key | [লিংক](https://dgrid.ai) | DGrid Free Models Router: প্রতি মিনিটে 10টি এবং প্রতিদিন 100টি অনুরোধ। এককালীন $5 টপ-আপ করলে প্রতি মিনিটে সর্বোচ্চ 20টি এবং প্রতিদিন 1,000টি অনুরোধের সুবিধা আনলক হয়। | +| `dify` | `dify` | Dify | API key | [লিংক](https://dify.ai) | আপনার Dify ইনস্ট্যান্স থেকে API key নিন। | +| `digitalocean` | `digitalocean` | DigitalOcean | API key | [লিংক](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API key | [লিংক](https://dit.ai) | Authorization: Bearer -এ আপনার dit.ai API key ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ—সরাসরি প্রতিস্থাপনযোগ্য; শুধু Base URL পরিবর্তন করে https://api.dit.ai/v1 করুন। | +| `doubao` | `doubao` | Doubao | API key | [লিংক](https://doubao.com) | console.volcengine.com থেকে API key নিন | +| `dxnt` | `dxnt` | DXNT / DX Token | API key, অ্যাগ্রিগেটর | [লিংক](https://www.dxnt.com) | বিনামূল্যের অ্যাকাউন্টের জন্য প্রতিদিন 100টি কল নথিভুক্ত রয়েছে; আমন্ত্রণের মাধ্যমে কোটা বাড়তে পারে এবং অ্যাকাউন্টভেদে এটি পরিবর্তিত হতে পারে। | +| `electronhub` | `electronhub` | Electron Hub | API key, অ্যাগ্রিগেটর | [লিংক](https://www.electronhub.ai) | বিনামূল্যের প্ল্যান: 5 RPM, সাপ্তাহিক $0.25 ক্রেডিট এবং :free মডেলের জন্য প্রতিদিন 10 Neutrinos; পারিবারিক বাজেটও প্রযোজ্য। | +| `empower` | `empower` | Empower | API key, অ্যাগ্রিগেটর | [লিংক](https://docs.empower.dev) | Empower-এর OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের জন্য Bearer API key। | +| `eurouter` | `eurouter` | EURouter | API key, অ্যাগ্রিগেটর | [লিংক](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API key | [লিংক](https://factory.ai) | Factory-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API key। | +| `fal-ai` | `fal` | Fal.ai | API key, ছবি | [লিংক](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API key, অ্যাগ্রিগেটর | [লিংক](https://fastrouter.ai) | :free সাফিক্সযুক্ত মডেলগুলো প্রতি প্রতিষ্ঠান ও মডেলের জন্য প্রতিদিন 10টি অনুরোধের অনুমতি দেয়; উপলভ্যতা পরিবর্তিত হতে পারে। | +| `featherless-ai` | `featherless` | Featherless AI | API key | [লিংক](https://featherless.ai) | বিনামূল্যের স্তর উপলভ্য—কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | +| `fenayai` | `fenayai` | FenayAI | API key, অ্যাগ্রিগেটর | [লিংক](https://fenayai.com) | FenayAI-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API key। | +| `fireworks` | `fireworks` | Fireworks AI | API key | [লিংক](https://fireworks.ai) | API পরীক্ষার জন্য সাইনআপে $1 বিনামূল্যের প্রারম্ভিক ক্রেডিট | +| `free-ai` | `free-ai` | Free.ai | API key, অ্যাগ্রিগেটর | [লিংক](https://free.ai) | ইমেইল যাচাইয়ের পর প্রতিদিন 30,000টি টোকেন স্ব-হোস্টেড মডেলের ব্যবহার কভার করে। এই পুলের অতিরিক্ত ব্যবহারের জন্য প্রকৃত খরচ অনুযায়ী বিল হতে পারে এবং প্রিমিয়াম বহিরাগত মডেলগুলো অর্থপ্রদত্ত। | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API key | [লিংক](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API কী | [লিংক](https://freebuff.com) | Freebuff / Codebuff Auth Token লিখুন (CLI লগইন বা স্বয়ংক্রিয় হারভেস্টারের মাধ্যমে প্রাপ্ত)। | +| `freeinference` | `freeinference` | FreeInference | API কী, অ্যাগ্রিগেটর | [লিংক](https://freeinference.org) | কার্ড ছাড়াই বিনামূল্যে গবেষণামূলক অ্যাক্সেস; Harvard-এর বাইরের আবেদনকারীদের জন্য ম্যানুয়াল অনুমোদন প্রয়োজন এবং কোনো সংখ্যাভিত্তিক কোটা প্রকাশ্যে নিশ্চিত করা হয়নি। | +| `freemodel-dev` | `fmd` | FreeModel.dev | API কী | [লিংক](https://freemodel.dev) | সাইন আপে $300 বিনামূল্যের ক্রেডিট — ক্রেডিট কার্ডের প্রয়োজন নেই। OpenAI-সামঞ্জস্যপূর্ণ API-এর মাধ্যমে GPT-5.4 এবং GPT-5.5 (OpenAI-এর সর্বশেষ ফ্ল্যাগশিপ মডেল) ব্যবহার করুন। | +| `freetheai` | `fta` | FreeTheAi | API কী, অ্যাগ্রিগেটর | [লিংক](https://freetheai.xyz) | আপনার বিনামূল্যের API কী পেতে FreeTheAi Discord-এ যোগ দিন। | +| `friendliai` | `friendli` | FriendliAI | API কী | [লিংক](https://friendli.ai) | সার্ভারলেস ইনফারেন্সের জন্য বিনামূল্যের স্তর — ক্রেডিট কার্ডের প্রয়োজন নেই | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা cake ক্রেডিট তৈরি করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা cake ক্রেডিট তৈরি করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা cake ক্রেডিট তৈরি করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা cake ক্রেডিট তৈরি করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API কী, অ্যাগ্রিগেটর | [লিংক](https://g4f.space) | g4f.dev/chat-এ অজ্ঞাতনামা cake ক্রেডিট তৈরি করুন, অথবা একটি g4f.dev সদস্য কী ব্যবহার করুন (g4f.dev/members.html-এ একটি তৈরি করুন)। | +| `galadriel` | `galadriel` | Galadriel | API কী | [লিংক](https://galadriel.com) | ⚠️ **অবচিত।** api.galadriel.ai আর রিজলভ হয় না (যাচাই 2026-06-19); ইনফারেন্স API বন্ধ করে দেওয়া হয়েছে বলে মনে হচ্ছে। | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API কী | [লিংক](https://aistudio.google.com) | Google AI Studio-এর মাধ্যমে বিনামূল্যের স্তর উপলভ্য; বর্তমান মডেলভিত্তিক কোটা ও আঞ্চলিক সীমা প্রযোজ্য | +| `getgoapi` | `ggo` | GoAPI | API কী, অ্যাগ্রিগেটর | [লিংক](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API কী | [লিংক](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API কী | [লিংক](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | সর্বজনীন Code Suggestions API-এর জন্য GitLab ব্যক্তিগত অ্যাক্সেস টোকেন। gitlab.com ব্যবহার না করলে একটি স্ব-হোস্টেড বেস URL কনফিগার করুন। | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API কী | [লিংক](https://opengateway.gitlawb.com) | বিনামূল্যের MiMo (xiaomi/mimo-v2.5) 2026-05-এ প্রত্যাহার করা হয়েছে — Opengateway এখন ব্যবহার অনুযায়ী মূল্য পরিশোধের ক্রেডিট গেটওয়ে; পুনরাবৃত্ত কোনো বিনামূল্যের মডেল নেই। | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API কী | [লিংক](https://opengateway.gitlawb.com) | বিনামূল্যের Nemotron প্রচার 2026-06-এ শেষ হয়েছে — GMI Cloud রুট এখন শুধু ব্যবহার অনুযায়ী মূল্য পরিশোধের ক্রেডিটে চলে। | +| `glm` | `glm` | GLM Coding | API কী | [লিংক](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (China) | API কী | [লিংক](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API কী | [লিংক](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API কী | [লিংক](https://greenpt.com) | API সাবস্ক্রিপশন বিনামূল্যে তৈরি করা যায়; ইনফারেন্সের মূল্য প্রতি টোকেন হিসেবে নেওয়া হয়। কোনো বিনামূল্যের ইনফারেন্স বরাদ্দ প্রকাশ করা হয়নি। | +| `groq` | `groq` | Groq | API কী | [লিংক](https://groq.com) | বিনামূল্যের প্ল্যান: মডেলভিত্তিক সীমা (প্রতি চ্যাট মডেলে 200K টোকেন/দিন; RPM/RPD-এর জন্য console.groq.com/docs/rate-limits দেখুন) — ফাইলে কোনো পেমেন্ট পদ্ধতি নেই। | +| `haiper` | `hp` | Haiper | API কী, ভিডিও | [লিংক](https://haiper.ai) | haiper.ai/haiper-api থেকে API কী নিন | +| `hcnsec` | `hcnsec` | Huancheng Public API | API কী | [লিংক](https://api.hcnsec.cn) | api.hcnsec.cn থেকে API কী নিন | +| `helixmind` | `helixmind` | HelixMind | API কী, অ্যাগ্রিগেটর | [লিংক](https://helixmind.online) | আগে প্রচারিত 3 RPM/50 RPD এবং কার্ড না লাগার দাবিগুলো 2026-08-02-এর নিরীক্ষায় নিশ্চিত করা যায়নি; বর্তমান কোটা ও বিলিং জানতে অ্যাকাউন্ট যাচাই করা প্রয়োজন। | +| `helyxai` | `helyxai` | Helyx AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://helyxai.space) | সচল বিনামূল্যের প্ল্যানের নথিতে 100,000 টোকেন/দিন উল্লেখ করা হয়েছে; সাইটের পৃথক 2M+ বিপণন দাবি এর সঙ্গে সাংঘর্ষিক এবং এটিকে নিশ্চিত কোটা হিসেবে ধরা হয় না। | +| `heroku` | `heroku` | Heroku AI | API কী, এন্টারপ্রাইজ | [লিংক](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API কী | [লিংক](https://huggingface.co) | হাজারো মডেলের জন্য বিনামূল্যের Inference API (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API কী | [লিংক](https://hyperbolic.xyz) | সার্ভারলেস ইনফারেন্সের জন্য সাইন আপে $1-5 ট্রায়াল ক্রেডিট | +| `ideogram` | `ideo` | Ideogram | API কী | [লিংক](https://ideogram.ai) | ideogram.ai/docs/api থেকে API কী নিন | +| `iflytek` | `iflytek` | iFlytek Spark | API কী | [লিংক](https://xinghuo.xfyun.cn) | console.xfyun.cn থেকে API কী নিন | +| `inception` | `inception` | Inception | API কী | [লিংক](https://docs.inceptionlabs.ai) | সাইন আপে 10M বিনামূল্যের টোকেন, ক্রেডিট কার্ডের প্রয়োজন নেই। | +| `inference-net` | `inet` | Inference.net | API কী | [লিংক](https://inference.net) | সাইন আপে $25 বিনামূল্যের ক্রেডিট, পাশাপাশি গবেষণা অনুদানও উপলভ্য | +| `internlm` | `internlm` | InternLM (Intern-S1) | API কী | [লিংক](https://internlm.intern-ai.org.cn/) | বিনামূল্যের মাসিক কোটা ~1M ইনপুট / 3M আউটপুট টোকেন (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API কী, embed/rerank | [লিংক](https://jina.ai) | api.jina.ai-এর জন্য Bearer API কী — embeddings, rerank, classify, segment এবং search। ড্যাশবোর্ডের কীগুলো JINA_AI_API_KEY-এর চেয়ে অগ্রাধিকার পায়। এটি Reader / r.jina.ai কার্ড নয় এবং URL fetch করে না। | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API কী | [লিংক](https://jina.ai/reader) | r.jina.ai URL-to-markdown-এর জন্য Bearer API কী (শুধু /v1/web/fetch)। /v1/embeddings বা /v1/rerank পরিবেশন করে না। Foundation API-এর একই Jina token কাজ করে; এই কার্ডটি খালি থাকলে OmniRoute একটি jina-ai ড্যাশবোর্ড কী বা JINA_AI_API_KEY পুনরায় ব্যবহার করে। | +| `kenari` | `kenari` | Kenari | API কী | [লিংক](https://kenari.id) | Authorization: Bearer -এ আপনার Kenari API কী (kn-...) ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API base URL: https://kenari.id/v1। | +| `kie` | `kie` | KIE.AI | API কী | [লিংক](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API কী, aggregator | [লিংক](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | API কী | [লিংক](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API কী | [লিংক](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API কী | [লিংক](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API কী, aggregator | [লিংক](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API কী, ভিডিও | [লিংক](https://leonardo.ai) | leonardo.ai/developer থেকে API কী নিন | +| `liquid` | `liquid` | Liquid AI | API কী | [লিংক](https://liquid.ai) | liquid.ai থেকে API কী নিন | +| `literouter` | `literouter` | LiteRouter | API কী, aggregator | [লিংক](https://literouter.com) | বিনামূল্যের model variant-গুলোতে :free suffix ব্যবহার করা হয়; দৈনিক credit limit model অনুযায়ী ভিন্ন হয় এবং বিনামূল্যের input সর্বোচ্চ 5,000 token-এ সীমাবদ্ধ। | +| `llamagate` | `llamagate` | LlamaGate | API কী | [লিংক](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API কী, aggregator | [লিংক](https://llm.kiwi) | বিনামূল্যের plan-এ auto এবং hrLLM পাওয়া যায়; প্রকাশিত ঘণ্টায় 40টি request-এর limit hrLLM-এর ক্ষেত্রে প্রযোজ্য। | +| `llm7` | `llm7` | LLM7.io | API কী | [লিংক](https://llm7.io) | যেকোনো খালি নয় এমন কী ব্যবহার করুন (যেমন 'unused')। পুরোনো built-in model-গুলো model_unavailable ফেরত দিলে Available Models → Import from /models অথবা Auto-Sync ব্যবহার করুন; যাচাইকৃত সচল model: gemini-3.1-flash-lite। | +| `llmgateway` | `llmgateway` | LLM Gateway | API কী, aggregator | [লিংক](https://llmgateway.io) | Hosted Free plan: account-এ কোনো credit না থাকলে বিনামূল্যের মূল্যের model-গুলো প্রতি 10 মিনিটে 5টি request-এ সীমাবদ্ধ। | +| `logfare` | `logfare` | Logfare | API কী, aggregator | [লিংক](https://logfare.ai) | তাৎক্ষণিকভাবে একটি API কী পেতে https://logfare.ai/register-এ একটি বিনামূল্যের account তৈরি করুন (username/password, email verification লাগবে না), এরপর সেটি এখানে Bearer token হিসেবে paste করুন। | +| `longcat` | `lc` | LongCat AI | API কী | [লিংক](https://longcat.chat/platform/docs) | বিনামূল্যে: account signup + KYC verification-এর পর একবারের জন্য 10M-token grant (LongCat-2.0)। কেবল একবারই — এটি পুনরাবৃত্ত দৈনিক/মাসিক allowance নয়। | +| `magnific` | `freepik` | Magnific | API কী, ছবি | [লিংক](https://www.magnific.com) | magnific.com/user/api-keys থেকে একটি API কী নিন (header x-magnific-api-key)। পুরোনো Freepik developer key-গুলোও এখনও কাজ করে। | +| `maritalk` | `maritalk` | Maritalk | API কী | [লিংক](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API কী, aggregator | [লিংক](https://meganova.ai) | card ছাড়াই বিনামূল্যে signup। প্রকাশিত Tier 1-এর প্রতি-model quota মিলিয়ে দৈনিক মোট 550টি request; এগুলো কোনো shared global pool নয় এবং সক্রিয় করা থাকলে অতিরিক্ত ব্যবহারের জন্য অর্থ প্রযোজ্য হতে পারে। | +| `meta-llama` | `meta` | Meta Llama API | API কী | [লিংক](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API কী, ভিডিও | [লিংক](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (China) | API কী | [লিংক](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API কী | [লিংক](https://mistral.ai) | বিনামূল্যের Experiment tier: সব model-এ rate-limited access, কোনো credit card প্রয়োজন নেই | +| `mixedbread` | `mxbai` | Mixedbread AI | API কী | [লিংক](https://www.mixedbread.com) | Mixedbread embeddings API-এর জন্য Bearer API কী। | +| `mixlayer` | `mixlayer` | Mixlayer | API কী, aggregator | [লিংক](https://www.mixlayer.com) | qwen/qwen3.5-4b-free model-টি prototyping-এর জন্য বিনামূল্যে এবং rate-limited; কোনো নির্দিষ্ট প্রকাশ্য RPM বা দৈনিক quota নিশ্চিত করা হয়নি। | +| `mnn-ai` | `mnn-ai` | MNN AI | API কী, aggregator | [লিংক](https://mnnai.ru) | বিনামূল্যের plan: মাসিক $1 credit, 10 RPM এবং শুধু Free হিসেবে চিহ্নিত model-গুলোতে access। | +| `modal` | `mdl` | Modal | API কী, enterprise | [লিংক](https://modal.com/docs) | সক্রিয় থাকলে আপনার Modal deployment-কে সুরক্ষিত রাখা bearer token-টি ব্যবহার করুন। Base URL আপনার OpenAI-সামঞ্জস্যপূর্ণ Modal app-এর দিকে নির্দেশ করা উচিত, যেমন https://--.modal.run/v1। | +| `modelscope` | `ms` | ModelScope | API কী | [লিংক](https://modelscope.cn) | ModelScope API-Inference-এর মাধ্যমে বিনামূল্যের tier — Alibaba account প্রয়োজন। | +| `monsterapi` | `monster` | MonsterAPI | API কী | [লিংক](https://monsterapi.ai) | ⚠️ **বাতিল।** Monster API 2026-06-30 তারিখে কার্যক্রম বন্ধ করেছে। বিকল্প OpenAI-সামঞ্জস্যপূর্ণ provider ব্যবহার করুন। | +| `moonshot` | `moonshot` | Kimi | API কী | [লিংক](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API কী | [লিংক](https://morphllm.com) | বিনামূল্যের tier: মাসে 250K credit, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API কী | [লিংক](https://github.com/meta-llama/llama-stack) | আপনার META_API_KEY env var-টি Bearer token হিসেবে ব্যবহার করুন। Muse Code CLI OpenAI Responses API wire format ব্যবহার করে (POST /responses)। | +| `naga-ac` | `naga` | Naga.ac | API কী, aggregator | [লিংক](https://naga.ac) | naga.ac থেকে API কী নিন — Google/GitHub/Discord signup উপলভ্য। | +| `naga-ai` | `naga-ai` | Naga AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://naga.ac) | :free চিহ্নিত মডেলগুলো সর্বজনীনভাবে তালিকাভুক্ত, তবে কোনো সংখ্যাগত কোটা নিশ্চিত করা হয়নি। Naga-এর নীতিতে সতর্ক করা হয়েছে যে ফ্রি-টিয়ারের প্রম্পট ও আউটপুট সংগ্রহ করা হতে পারে বা প্রশিক্ষণের জন্য ব্যবহার করা হতে পারে। | +| `nanogpt` | `nanogpt` | NanoGPT | API কী | [লিংক](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API কী | [লিংক](https://bynara.id) | একটি বিনামূল্যের NaraRouter অ্যাকাউন্ট তৈরি করুন, আপনার Telegram লিঙ্ক করুন (/v1 থেকে উত্তর পাওয়ার আগে এটি আবশ্যক), তারপর কীটি এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | +| `navy` | `navy` | NavyAI | API কী | [লিংক](https://api.navy) | NavyAI ড্যাশবোর্ড থেকে একটি বিনামূল্যের API কী তৈরি করুন, তারপর সেটি এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | +| `nebius` | `nebius` | Nebius AI | API কী | [লিংক](https://nebius.com) | API পরীক্ষার জন্য সাইনআপে ~$1 ট্রায়াল ক্রেডিট | +| `nlpcloud` | `nlpc` | NLP Cloud | API কী | [লিংক](https://docs.nlpcloud.com) | Authorization: Token -এ আপনার NLP Cloud API কী ব্যবহার করুন। ডিফল্টভাবে OmniRoute https://api.nlpcloud.io/v1/gpu//chatbot-এর চ্যাটবট এন্ডপয়েন্টকে লক্ষ্য করে। | +| `nomic` | `nomic` | Nomic | API কী | [লিংক](https://nomic.ai) | atlas.nomic.ai থেকে API কী নিন | +| `nous-research` | `nous` | Nous Research | API কী | [লিংক](https://portal.nousresearch.com/help) | আপনার Nous Portal API কী ব্যবহার করুন। OmniRoute https://inference-api.nousresearch.com/v1-এর অফিসিয়াল OpenAI-সামঞ্জস্যপূর্ণ ইনফারেন্স এন্ডপয়েন্টকে লক্ষ্য করে। | +| `novita` | `novita` | Novita AI | API কী, ভিডিও, অ্যাগ্রিগেটর | [লিংক](https://novita.ai) | সাইনআপে $0.50 ট্রায়াল ক্রেডিট (প্রায় 1 বছর বৈধ) | +| `nscale` | `nscale` | nScale | API কী | [লিংক](https://nscale.com) | ইনফারেন্স পরীক্ষার জন্য সাইনআপে $5 বিনামূল্যের ক্রেডিট | +| `nube` | `nube` | Nube.sh | API কী | [লিংক](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API কী | [লিংক](https://build.nvidia.com) | বিনামূল্যের ডেভেলপার অ্যাক্সেস: ~40 RPM, 70+ মডেল (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API কী, এন্টারপ্রাইজ | [লিংক](https://www.oracle.com/artificial-intelligence/generative-ai) | আপনার OCI Generative AI API কী বা IAM bearer টোকেন ব্যবহার করুন। বেস URL হতে পারে https://inference.generativeai..oci.oraclecloud.com/openai/v1/। | +| `ofoxai` | `ofoxai` | OfoxAI | API কী, অ্যাগ্রিগেটর | [লিংক](https://ofox.ai) | বর্তমান ক্যাটালগে কোনো সর্বজনীন সংখ্যাগত কোটা ছাড়াই 10+ বিনামূল্যের মডেলের বিজ্ঞাপন দেওয়া হয়েছে; প্রোডাকশনে ব্যবহারের আগে আপস্ট্রিম উৎস, ডেটা সংরক্ষণ এবং প্রশিক্ষণের শর্তাবলি পর্যালোচনা করুন। | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API কী | [লিংক](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API কী | [লিংক](https://1min.ai) | https://docs.1min.ai/docs/api/create-api-key-এ একটি API কী তৈরি করুন, তারপর সেটি এখানে পেস্ট করুন। | +| `openadapter` | `oad` | OpenAdapter | API কী | [লিংক](https://openadapter.dev) | Authorization: Bearer sk-cv--এ আপনার OpenAdapter API কী ব্যবহার করুন। সম্পূর্ণভাবে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://api.openadapter.in/v1। | +| `openai` | `openai` | OpenAI | API কী | [লিংক](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API কী | [লিংক](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API কী | [লিংক](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API কী | [লিংক](https://openference.com) | বিনামূল্যের টিয়ার: Qwen3.8 27b এবং Llama 3.2 3B অন্তর্ভুক্ত — বর্তমান শর্তাবলির জন্য openference.com/pricing দেখুন | +| `openrouter` | `openrouter` | OpenRouter | API কী, অ্যাগ্রিগেটর | [লিংক](https://openrouter.ai) | :free সাফিক্সযুক্ত $0/token-এর বিনামূল্যের মডেল—20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API কী | [লিংক](https://openvecta.com) | LLM, এমবেডিং এবং রিজনিং মডেলজুড়ে OpenAI-সামঞ্জস্যপূর্ণ ইনফারেন্সের জন্য সাইনআপে বিনামূল্যের ক্রেডিট | +| `opper` | `opper` | Opper | API কী, অ্যাগ্রিগেটর | [লিংক](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API কী | [লিংক](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API কী | [লিংক](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API কী | [লিংক](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API কী | [লিংক](https://www.perplexity.ai) | আপনার Perplexity API কী ব্যবহার করুন। OmniRoute, Agent API মডেল ID-গুলোকে Perplexity-এর Responses-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের মাধ্যমে রাউট করে। | +| `piapi` | `pi` | PiAPI | API কী, অ্যাগ্রিগেটর | [লিংক](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API কী | [লিংক](https://pioneer.ai) | $75 বিনামূল্যের ব্যবহার ক্রেডিট—কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | +| `plamo` | `plamo` | PLaMo | API কী | [লিংক](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API কী, অ্যাগ্রিগেটর | [লিংক](https://creator.poe.com/api-reference) | Poe-এর OpenAI-সামঞ্জস্যপূর্ণ API-এর জন্য Bearer API কী। | +| `poixe-ai` | `poixe-ai` | Poixe AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://poixe.com) | বর্তমান সর্বজনীন বিনামূল্যের সীমা কম এবং মডেল-গ্রুপভেদে নির্দিষ্ট: large-cup মডেলের জন্য 2 RPM/5 RPD এবং small-cup মডেলের জন্য 20 RPM/50 RPD। | +| `pollinations` | `pol` | Pollinations AI | API কী, ভিডিও | [লিংক](https://pollinations.ai) | নথিভুক্ত বিনামূল্যের মডেলগুলোতে বেনামী/কীবিহীন অ্যাক্সেস সর্বোচ্চ প্রচেষ্টাভিত্তিক। স্থানীয় v3.8.50 যাচাইকরণে (2026-07-31) একই নেটওয়ার্ক থেকে OmniRoute-এর মাধ্যমে 401 এবং সরাসরি আপস্ট্রিম অনুসন্ধানে Cloudflare 1010 পাওয়া গেছে। প্রিমিয়াম মডেলের জন্য এখনও enter.pollinations.ai থেকে একটি Pollinations API কী প্রয়োজন। | +| `poolside` | `poolside` | Poolside | API কী | [লিংক](https://poolside.ai) | Preview চলাকালে Laguna S 2.1 এবং XS 2.1 বিনামূল্যে; কোনো সর্বজনীন সংখ্যাগত কোটা প্রকাশিত হয়নি। | +| `predibase` | `predibase` | Predibase | API কী | [লিংক](https://predibase.com) | ⚠️ **অবচিত।** serving.app.predibase.com আর রিজলভ হয় না (পরীক্ষা 2026-06-19); পরিচালিত সার্ভিং API বন্ধ হয়ে গেছে বলে মনে হচ্ছে। | +| `publicai` | `publicai` | PublicAI | API কী | [লিংক](https://publicai.co) | একটি API কী আবশ্যক—সাইনআপে এককালীন ক্রেডিট, এরপর অর্থপ্রদত্ত | +| `qianfan` | `qianfan` | Baidu Qianfan | API কী | [লিংক](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API কী | [লিংক](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API কী | [লিংক](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API কী | [লিংক](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API কী, ছবি | [লিংক](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API কী | [লিংক](https://regolo.ai) | regolo.ai থেকে আপনার Regolo API কী নিন, তারপর এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | +| `reka` | `reka` | Reka | API কী | [লিংক](https://docs.reka.ai/chat/overview) | আপনার Reka API কী ব্যবহার করুন। সামঞ্জস্যের জন্য OmniRoute OpenAI-সামঞ্জস্যপূর্ণ বেস URL https://api.reka.ai/v1 সমর্থন করে এবং Authorization ও X-Api-Key—উভয় হেডারই পাঠায়। | +| `requesty` | `requesty` | Requesty | API কী | [লিংক](https://requesty.ai) | বিনামূল্যের স্তরে প্রতিদিন প্রায় 200টি অনুরোধ — মাল্টি-মডেল রাউটিং গেটওয়ে (300টির বেশি মডেল) | +| `routeway` | `routeway` | Routeway | API কী | [লিংক](https://routeway.ai) | routeway.ai-এ একটি বিনামূল্যের API কী তৈরি করুন, তারপর এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | +| `runwayml` | `runway` | Runway | API কী, ভিডিও | [লিংক](https://docs.dev.runwayml.com) | Authorization: Bearer -এ আপনার Runway API কী ব্যবহার করুন। OmniRoute https://api.dev.runwayml.com/v1-এর বর্তমান Runway API লক্ষ্য করে এবং প্রয়োজনীয় X-Runway-Version হেডার স্বয়ংক্রিয়ভাবে পাঠায়। | +| `sambanova` | `samba` | SambaNova | API কী | [লিংক](https://sambanova.ai) | সাইন আপে $5 বিনামূল্যের ক্রেডিট (30 দিনের মেয়াদ), কোনো ক্রেডিট কার্ডের প্রয়োজন নেই | +| `sap` | `sap` | SAP Generative AI Hub | API কী, এন্টারপ্রাইজ | [লিংক](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | আপনার SAP AI Core bearer টোকেন ব্যবহার করুন। বেস URL আপনার AI_API_URL রুট অথবা Generative AI Hub-এর একটি deploymentUrl হতে পারে। | +| `sarvam` | `sarvam` | Sarvam AI | API কী | [লিংক](https://docs.sarvam.ai) | সাইন আপে ₹1,000 বিনামূল্যের ক্রেডিট — কখনো মেয়াদ শেষ হয় না | +| `scaleway` | `scw` | Scaleway AI | API কী | [লিংক](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | নতুন অ্যাকাউন্টের জন্য 1M বিনামূল্যের টোকেন — EU/GDPR-সম্মত (Paris), Qwen3 235B ও Llama 70B | +| `sealion` | `sealion` | SEA-LION | API কী | [লিংক](https://sea-lion.ai) | Google দিয়ে sea-lion.ai-এ সাইন ইন করুন (কোনো কার্ড বা আঞ্চলিক বাধা নেই), একটি API কী তৈরি করুন, তারপর এখানে পেস্ট করুন। | +| `seekai` | `ska` | SeekAi | API কী, অ্যাগ্রিগেটর | [লিংক](https://seekai.cc) | https://seekai.cc-এ একটি API কী তৈরি করুন, তারপর এখানে Bearer টোকেন হিসেবে পেস্ট করুন। | +| `segmind` | `segmind` | Segmind | API কী, ছবি, ভিডিও | [লিংক](https://segmind.com) | x-api-key হেডারে আপনার Segmind API কী ব্যবহার করুন। OmniRoute https://api.segmind.com/v1/ লক্ষ্য করে এবং তৈরি হওয়া ছবি/ভিডিওর বাইট সরাসরি ফেরত দেয়। | +| `sensenova` | `sensenova` | SenseNova | API কী | [লিংক](https://platform.sensenova.cn) | platform.sensenova.cn থেকে API কী নিন | +| `siliconflow` | `siliconflow` | SiliconFlow | API কী | [লিংক](https://cloud.siliconflow.com) | পরিচয় যাচাইয়ের পর $1 বিনামূল্যের ক্রেডিট এবং বর্তমানে তালিকাভুক্ত $0 মডেল; প্রাপ্যতা ও সীমা পরিবর্তিত হতে পারে | +| `snowflake` | `snowflake` | Snowflake Cortex | API কী, এন্টারপ্রাইজ | [লিংক](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API কী | [লিংক](https://xinghuo.xfyun.cn) | console.xfyun.cn থেকে API কী নিন | +| `speka` | `speka` | Speka AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://speka.me) | বিনামূল্যের প্ল্যান: মাসিক $1 ব্যবহার, 10 RPM, একটি API কী এবং ওপেন মডেল ও প্লেগ্রাউন্ডে অ্যাক্সেস; কোনো কার্ডের প্রয়োজন নেই। | +| `stability-ai` | `stability` | Stability AI | API কী, ছবি | [লিংক](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API কী | [লিংক](https://stepfun.com) | platform.stepfun.com থেকে API কী নিন | +| `sumopod` | `sumopod` | SumoPod | API কী | [লিংক](https://ai.sumopod.com) | Authorization: Bearer -এ আপনার SumoPod API কী (sk-...) ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://ai.sumopod.com/v1। | +| `suno` | `suno` | Suno | API কী | [লিংক](https://suno.ai) | suno.ai থেকে সেশন কুকি পেস্ট করুন (Clerk প্রমাণীকরণ) | +| `synthetic` | `synthetic` | Synthetic | API কী, অ্যাগ্রিগেটর | [লিংক](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API কী, অ্যাগ্রিগেটর | [লিংক](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API কী | [লিংক](https://hunyuan.tencent.com) | console.cloud.tencent.com থেকে API কী নিন | +| `thebai` | `thebai` | TheB.AI | API কী, অ্যাগ্রিগেটর | [লিংক](https://theb.ai) | TheB.AI-এর OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ের জন্য Bearer API কী। | +| `tinyfish` | `tf` | TinyFish Fetch | API কী | [লিংক](https://docs.tinyfish.ai/fetch-api) | agent.tinyfish.ai/api-keys থেকে X-API-Key | +| `together` | `together` | Together AI | API কী, ভিডিও | [লিংক](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API কী | [লিংক](https://agent-router.gaib.ai) | Authorization: Bearer -এ আপনার Token Kiosk API কী ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ গেটওয়ে। API বেস URL: https://agent-router.gaib.ai/v1। | +| `tokenreply` | `tokenreply` | TokenReply | API কী, অ্যাগ্রিগেটর | [লিংক](https://www.tokenreply.com) | বিনামূল্য হিসেবে চিহ্নিত মডেলগুলোর মডেল- ও ক্যাম্পেইন-নির্দিষ্ট দৈনিক সীমা রয়েছে; কোনো নির্দিষ্ট বৈশ্বিক বিনামূল্যের কোটা প্রকাশ করা হয়নি। | +| `tokenrouter` | `trk` | TokenRouter | API কী | [লিংক](https://tokenrouter.com) | Authorization: Bearer -এ আপনার TokenRouter API কী ব্যবহার করুন। সম্পূর্ণরূপে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://api.tokenrouter.com/v1। | +| `topaz` | `topaz` | Topaz | API কী, ছবি | [লিংক](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API কী | [লিংক](https://docs.opentyphoon.ai) | 5 req/s ও 200 req/m হারসীমাসহ বিনামূল্যের API কী। | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API কী | [লিঙ্ক](https://uncensored.com) | আপনার uncensored.com Developer API কী (uai_sk_live_...) ব্যবহার করুন। OmniRoute এটিকে X-api-key হেডার হিসেবে OpenAI-সামঞ্জস্যপূর্ণ https://api.uncensored.com/api/v1 এন্ডপয়েন্টে পাঠায়। কীটির কখনো মেয়াদ শেষ হয় না। এটি ব্যবহারভিত্তিক মিটারিং/ক্রেডিট পরিষেবা; মিটারবিহীন সাবস্ক্রিপশন চ্যাটটি পৃথক 'uc' প্রোভাইডার। | +| `udio` | `udio` | Udio | API কী | [লিঙ্ক](https://udio.com) | udio.com থেকে সেশন কুকি (Supabase auth) পেস্ট করুন | +| `unorouter` | `unorouter` | UnoRouter | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://unorouter.ai) | :free সাফিক্সযুক্ত মডেলগুলো ব্যালেন্স থেকে অর্থ কাটে না; প্রতি ব্যবহারকারীর জন্য প্রতিটি বিনামূল্যের মডেলে সীমা হলো প্রতি মিনিটে ১টি অনুরোধ। | +| `upstage` | `upstage` | Upstage | API কী | [লিঙ্ক](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API কী | [লিঙ্ক](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API কী | [লিঙ্ক](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API কী, এন্টারপ্রাইজ | [লিঙ্ক](https://cloud.google.com/vertex-ai) | Service Account JSON, একটি OAuth অ্যাক্সেস টোকেন, একটি Vertex Express API কী, অথবা সার্ভিস-অ্যাকাউন্টের সঙ্গে আবদ্ধ অথরাইজেশন কী দিন। Express মোড শুধু Gemini সমর্থন করে; পার্টনার মডেলের জন্য প্রজেক্ট-স্কোপড ক্রেডেনশিয়াল প্রয়োজন। | +| `vertex-partner` | `vp` | Vertex AI Partners | API কী, এন্টারপ্রাইজ | [লিঙ্ক](https://cloud.google.com/vertex-ai) | Service Account JSON অথবা OAuth ক্রেডেনশিয়াল দিন। সার্ভিস-অ্যাকাউন্টের সঙ্গে আবদ্ধ অথরাইজেশন কী ডিসকভারিও সমর্থন করে, তবে পার্টনার ইনফারেন্সের জন্য অতিরিক্তভাবে এর Google Cloud প্রজেক্ট ID প্রয়োজন। স্ট্যান্ডার্ড Express কীগুলো শুধু Gemini সমর্থন করে। | +| `void-ai` | `void-ai` | Void AI | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://voidai.app) | পাবলিক মডেল ক্যাটালগে কিছু মডেলের জন্য বিনামূল্যের প্ল্যানের আবশ্যকতা চিহ্নিত করা আছে, তবে অ্যাক্সেস শর্তসাপেক্ষ এবং কোনো সংখ্যাগত কোটা নিশ্চিত নয়। | +| `volcengine` | `volcengine` | Volcengine | API কী | [লিঙ্ক](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API কী | [লিঙ্ক](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | আপনার Volcano Engine অ্যাকাউন্ট সংযুক্ত করুন অথবা একটি Ark Agent Plan সাবস্ক্রিপশন API কী ব্যবহার করুন। | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API কী | [লিঙ্ক](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | আপনার Volcano Engine অ্যাকাউন্ট সংযুক্ত করুন অথবা একটি Ark Coding Plan সাবস্ক্রিপশন API কী ব্যবহার করুন। | +| `voyage-ai` | `voyage` | Voyage AI | API কী, এমবেড/রির্যাঙ্ক | [লিঙ্ক](https://www.voyageai.com) | Voyage AI এমবেডিং ও রির্যাঙ্ক API-গুলোর জন্য Bearer API কী। | +| `wafer` | `wafer` | Wafer AI | API কী | [লিঙ্ক](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API কী | [লিঙ্ক](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API কী, এন্টারপ্রাইজ | [লিঙ্ক](https://www.ibm.com/products/watsonx-ai) | আপনার watsonx bearer টোকেন ব্যবহার করুন। বেস URL হতে পারে https://.ml.cloud.ibm.com/ml/gateway/v1/ অথবা একটি স্ব-পরিচালিত /ml/gateway/v1 এন্ডপয়েন্ট। | +| `writer` | `writer` | Writer | API কী | [লিঙ্ক](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API কী | [লিঙ্ক](https://x5lab.dev) | Authorization: Bearer -এ আপনার X5Lab API কী (x5-...) ব্যবহার করুন। সম্পূর্ণভাবে OpenAI-সামঞ্জস্যপূর্ণ। API বেস URL: https://api.x5lab.dev/v1। | +| `xai` | `xai` | xAI (Grok) | API কী | [লিঙ্ক](https://x.ai) | একটি অফিসিয়াল xAI API কী ব্যবহার করুন, অথবা xAI OAuth দিয়ে সাইন ইন করুন। Grok Build JWT সেশনগুলো পৃথক প্রোভাইডার হিসেবেই থাকে। | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API কী | [লিঙ্ক](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API কী | [লিঙ্ক](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://xkiro.com) | xkiro.com-এ একটি বিনামূল্যের অ্যাকাউন্ট তৈরি করে কীটি এখানে পেস্ট করুন (Bearer; x-api-key-ও গৃহীত হয়)। | +| `yi` | `yi` | Yi (01.AI) | API কী | [লিঙ্ক](https://01.ai) | platform.lingyiwanwu.com থেকে API কী নিন | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://yolo-auto.com) | বিনামূল্যের API অ্যাক্সেস অনুরোধ-সীমিত এবং পরীক্ষার উদ্দেশ্যে দেওয়া হয়; কোনো সংখ্যাগত দৈনিক কোটা প্রকাশিত হয়নি এবং বিনামূল্যের অ্যাক্সেস অনির্দিষ্টকাল থাকবে—এমন প্রতিশ্রুতিও নেই। | +| `zai` | `zai` | Z.AI | API কী | [লিঙ্ক](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API কী | [লিঙ্ক](https://zenmux.ai) | Authorization: Bearer -এ আপনার ZenMux API কী ব্যবহার করুন। ZenMux সম্পূর্ণভাবে OpenAI-সামঞ্জস্যপূর্ণ। বেস URL: https://zenmux.ai/api/v1। | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://www.zerolimitai.com) | সাময়িক বিনামূল্যের ট্রায়ালের বিজ্ঞাপন দেওয়া হয়, তবে অফিসিয়াল পৃষ্ঠাগুলোতে ৩ ও ৭ দিনের পরস্পরবিরোধী তথ্য রয়েছে; দৈনিক ১০০টি কলের দাবিকে স্থায়ী হিসেবে ধরা হয় না। | +| `zylo-api` | `zylo` | Zylo API | API কী, অ্যাগ্রিগেটর | [লিঙ্ক](https://zyloai.net) | Basic প্ল্যান: ১০ RPM, দৈনিক ৭,২০০টি অনুরোধ এবং দৈনিক ২০০,০০০ টোকেন; শুধু Basic টেক্সট মডেলে সীমাবদ্ধ। | ## লোকাল প্রোভাইডারসমূহ (14) diff --git a/docs/i18n/bn/docs/routing/REASONING_REPLAY.md b/docs/i18n/bn/docs/routing/REASONING_REPLAY.md index d0d32994c937..b33f93b8b140 100644 --- a/docs/i18n/bn/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/bn/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ OmniRoute চিন্তা-মোডের মডেলগুলো দ্ব ## আর্কিটেকচার ``` -টার্ন N (অ্যাসিস্ট্যান্ট তৈরি করে): +পর্ব N (অ্যাসিস্ট্যান্ট তৈরি করে): → প্রতিক্রিয়ায় reasoning_content + tool_calls থাকে → যদি requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - প্রতিটি tool_call.id দ্বারা কী করা অবস্থায় (মেমরি + DB)-তে লেখে - → ক্লায়েন্টে প্রতিক্রিয়া ফরওয়ার্ড করে (যা রিজনিং ধরে রাখতেও পারে, নাও পারে) + প্রতিটি tool_call.id দ্বারা কীকৃতভাবে (মেমরি + DB)-তে লেখে + → ক্লায়েন্টের কাছে প্রতিক্রিয়া পাঠায় (যা reasoning ধরে রাখতেও পারে, না-ও পারে) -টার্ন N+1 (ক্লায়েন্ট ফলো-আপ পাঠায়): +পর্ব N+1 (ক্লায়েন্ট ফলো-আপ পাঠায়): → অনুবাদক শনাক্ত করে: requiresReasoningReplay(provider, model) === true → tool_calls আছে কিন্তু reasoning_content নেই—এমন প্রতিটি অ্যাসিস্ট্যান্ট বার্তার জন্য: lookupReasoning(toolCalls[0].id) → মেমরি → DB - হিট → msg.reasoning_content = cached; recordReplay() - মিস → msg.reasoning_content = "" (পুরোনো DeepSeek-এর জন্য লিগ্যাসি ফলব্যাক) - → আপস্ট্রিম সঙ্গতিপূর্ণ ইতিহাস দেখে → কোনো 400 নেই + পাওয়া গেলে → msg.reasoning_content = cached; recordReplay() + না পাওয়া গেলে → msg.reasoning_content = "" (পুরোনো DeepSeek-এর জন্য লিগ্যাসি ফলব্যাক) + → আপস্ট্রিম সামঞ্জস্যপূর্ণ ইতিহাস পায় → কোনো 400 নয় ``` -ধারণের কাজটি `open-sse/handlers/chatCore.ts`-এ ঘটে (দুটি স্থানে, দুটি `cacheReasoningFromAssistantMessage` কল সাইটে)। স্কিমা কোয়ের্শনের পরে কিন্তু ডিসপ্যাচের আগে `open-sse/translator/index.ts`-এ রিপ্লে ঘটে। +ক্যাপচার `open-sse/handlers/chatCore.ts`-এ ঘটে (দুটি স্থানে, দুটি `cacheReasoningFromAssistantMessage` কল সাইটে)। স্কিমা কোয়ার্সনের পরে কিন্তু ডিসপ্যাচের আগে `open-sse/translator/index.ts`-এ রিপ্লে ঘটে। + +সাধারণ (টুল-কলবিহীন) অ্যাসিস্ট্যান্ট পর্বগুলো ভিন্নভাবে কীকৃত হয়: `buildAssistantMessageCacheKey()` সেশন স্কোপ এবং সেই পর্ব পর্যন্ত নর্মালাইজ করা OpenAI-ফরম্যাটের ট্রান্সক্রিপ্টের ডাইজেস্ট তৈরি করে, কারণ `tools` উপস্থিত থাকলে DeepSeek-এর _প্রতিটি_ পূর্ববর্তী পর্বের রিজনিং প্রয়োজন হয়। Responses-API টার্গেটগুলোর ক্ষেত্রে (উদাহরণস্বরূপ `opencode-go/deepseek-v4-flash`, যা `/responses`-এ রাউট করা হয়) আপস্ট্রিম বডিতে `messages` নয়, `input` থাকে; তাই `translateRequest()` (`open-sse/translator/index.ts`) একটি কলব্যাক অপশনের মাধ্যমে যে পিভট ট্রান্সক্রিপ্টের ডাইজেস্ট তৈরি করেছে সেটি রিপোর্ট করে এবং ক্যাপচার সাইটগুলোও একই ট্রান্সক্রিপ্টের ডাইজেস্ট তৈরি করে। প্রতিটি সোর্স ফরম্যাটের জন্য Responses রিপ্লে পাসটি OpenAI পিভটে চলে, ফলে Anthropic Messages ক্লায়েন্টগুলোরও (Claude → OpenAI → Responses) রিপ্লে করা হয়। ## স্টোরেজ — হাইব্রিড মেমরি + SQLite @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -ইনডেক্স: `expires_at`, `provider`, `model`, `created_at`। `expires_at` Unix epoch সেকেন্ড হিসেবে সংরক্ষণ করা হয়; SELECT স্তরটি `EXPIRES_AT_EPOCH_SQL`-এর মাধ্যমে লিগ্যাসি টেক্সট মানগুলো স্বাভাবিকীকরণ করে। +ইনডেক্সসমূহ: `expires_at`, `provider`, `model`, `created_at`। `expires_at` Unix epoch সেকেন্ড হিসেবে সংরক্ষণ করা হয়; SELECT স্তরটি `EXPIRES_AT_EPOCH_SQL`-এর মাধ্যমে পুরোনো টেক্সট মানগুলোকে স্বাভাবিকীকরণ করে। ## প্রোভাইডার / মডেল শনাক্তকরণ diff --git a/docs/i18n/bn/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/bn/docs/security/SOCKET_DEV_FINDINGS.md index bc6a5e11cc2d..af76b29aa7f4 100644 --- a/docs/i18n/bn/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/bn/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- +> **পরিধি-সংক্রান্ত নোট:** `socket.yml` npm আর্টিফ্যাক্টের ওপর Socket.dev-এর রেজিস্ট্রি-পক্ষীয় প্রকাশনা-পরবর্তী স্ক্যান কনফিগার করে (প্যাকেজে অন্তর্ভুক্ত নয় এমন কনটেন্টের জন্য উপেক্ষিত পাথ, যেমন `tests/`, `docs/`, এবং বিল্ড রিপোর্ট)। এটি কোনো CI/PR মার্জ গেট সংযুক্ত করে না — `.github/workflows`-এ কোনো ওয়ার্কফ্লো, কোনো `package.json` স্ক্রিপ্ট, এবং কোনো `Makefile` টার্গেট Socket.dev-কে আহ্বান করে না। + এই নথিটি `omniroute@3.8.5`-এর বিরুদ্ধে উত্থাপিত ছয়টি `AI-detected potential malware` শনাক্তকরণ এবং `omniroute@3.8.6`-এ প্রয়োগ করা -প্রশমনগুলোর জন্য রক্ষণাবেক্ষণকারীর রচিত প্রত্যয়ন। এটি থাকার উদ্দেশ্য হলো: - -1. নিরাপত্তা-পাইপলাইন অপারেটরদের কাছে একটি একক তথ্যসূত্র থাকবে, যা ব্যবহার করে - তারা প্রকৃত সোর্সের বিপরীতে শনাক্তকরণগুলো মূল্যায়ন করতে পারবেন। -2. ভবিষ্যতের AI স্ক্যানারগুলো রক্ষণাবেক্ষণকারীর স্বাক্ষরিত এই দাবিটি শনাক্ত করতে - পারবে যে প্রতিটি চিহ্নিত পাথ ইচ্ছাকৃত, অপ্ট-ইন এবং নথিভুক্ত। -3. প্রতিটি কল সাইটকে _কেন_ এভাবে গঠন করা হয়েছে, তার একটি লিখিত রেকর্ড আমাদের - কাছে থাকবে — যাতে ভবিষ্যতের কোনো রিফ্যাক্টর অনিচ্ছাকৃতভাবে এমন কোনো - ফিঙ্গারপ্রিন্ট পুনরায় প্রবর্তন না করে, যা ইচ্ছাকৃতভাবে সরানো হয়েছিল। - -আপনি যদি এমন কোনো স্ক্যানার পরিচালনা করেন, যা v3.8.6-এর প্রশমনগুলো প্রকাশের -পর নিচের কোনো কল সাইটকে পুনরায় চিহ্নিত করে, তাহলে অনুগ্রহ করে স্ক্যান ট্রেসসহ -একটি ইস্যু খুলুন; আমরা এখানে প্রত্যয়নটি সম্প্রসারিত করব। +প্রশমনগুলোর জন্য রক্ষণাবেক্ষণকারীর-প্রণীত প্রত্যয়ন। এটি রাখা হয়েছে যাতে: + +1. নিরাপত্তা-পাইপলাইন পরিচালনাকারীদের কাছে প্রকৃত সোর্সের বিপরীতে + শনাক্তকরণগুলো মূল্যায়নের প্রয়োজন হলে উদ্ধৃত করার জন্য একটি একক রেফারেন্স থাকে। +2. ভবিষ্যতের AI স্ক্যানারগুলো রক্ষণাবেক্ষণকারী-স্বাক্ষরিত এই দাবিটি শনাক্ত করতে পারে যে প্রতিটি + চিহ্নিত পাথ ইচ্ছাকৃত, অপ্ট-ইন এবং নথিভুক্ত। +3. প্রতিটি কল সাইট _কেন_ এভাবে গঠন করা হয়েছে, তার একটি লিখিত রেকর্ড আমাদের কাছে থাকে — + যাতে ভবিষ্যতের কোনো রিফ্যাক্টর অসাবধানতাবশত এমন কোনো ফিঙ্গারপ্রিন্ট পুনরায় প্রবর্তন না করে, + যা ইচ্ছাকৃতভাবে সরানো হয়েছিল। + +আপনি যদি এমন কোনো স্ক্যানার পরিচালনা করেন, যা v3.8.6-এর প্রশমনগুলো প্রকাশিত হওয়ার পর নিচের +কোনো কল সাইটকে পুনরায় চিহ্নিত করে, তাহলে অনুগ্রহ করে স্ক্যান ট্রেসসহ একটি ইস্যু খুলুন এবং +আমরা এখানে প্রত্যয়নটি সম্প্রসারিত করব। --- diff --git a/docs/i18n/cs/README.md b/docs/i18n/cs/README.md index db4a6345b071..f6071ef0f3e1 100644 --- a/docs/i18n/cs/README.md +++ b/docs/i18n/cs/README.md @@ -19,17 +19,17 @@
-## 💰 ~1.62B tokenů zdarma / měsíc +## 💰 ~1,62 mld. tokenů zdarma / měsíc
-> Ruční kombinování bezplatných úrovní je náročné — desítky SDK, desítky limitů požadavků a žádný přehled o tom, kolik toho ve skutečnosti máte k dispozici. OmniRoute eviduje **491 položek bezplatných úrovní napříč 35 klíči opakujících se fondů** a hlavní počet tokenů vypočítává ze **17 fondů se zveřejněným kladným měsíčním rozpočtem a pěti limitů Groq pro jednotlivé modely**, přičemž odstraňuje duplicity podle sdíleného fondu. Kvóty, které se zpřístupní až po regionálním ověření identity (aktuálně: ModelScope), jsou uvedeny samostatně jako +~6M za regionálním ověřením identity a nikdy se nezapočítávají do hlavního údaje. Výsledek zůstává viditelný na řídicím panelu (`/dashboard/free-tiers`). +> Ruční kombinování bezplatných tarifů je náročné — desítky SDK, desítky limitů požadavků a žádný přehled o tom, kolik toho skutečně máte k dispozici. OmniRoute eviduje **489 položek bezplatných tarifů v rámci 35 klíčů opakovaných fondů** a celkový počet tokenů vypočítává ze **17 fondů se zveřejněným kladným měsíčním rozpočtem a pěti limitů Groq pro jednotlivé modely**, přičemž odstraňuje duplicity sdílených fondů. Kvóty, které se zpřístupní až po regionálním ověření identity (aktuálně: ModelScope), jsou uvedeny samostatně jako dalších ~6 mil. za regionálním ověřením identity a nikdy se nezapočítávají do hlavního údaje. Výsledek zůstává viditelný na ovládacím panelu (`/dashboard/free-tiers`). -Karta rozpočtu bezplatných úrovní OmniRoute: stabilně ~1.62B tokenů zdarma měsíčně, až ~2.22B v prvním měsíci díky kreditům za registraci, z 35 zdokumentovaných klíčů opakujících se fondů pokrývajících 491 katalogizovaných položek bezplatných úrovní za jediným koncovým bodem. Poctivý výpočet s odstraněním duplicit fondů — každý sdílený fond se započítává pouze jednou, včetně 17 opakujících se fondů se zveřejněným kladným měsíčním rozpočtem tokenů a pěti limitů Groq pro jednotlivé modely; 13 poskytovatelů je v katalogu rizik smluvních podmínek označeno k vynechání, abyste se mohli rozhodnout sami. Pruh rozpočtu zahrnuje Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (pět limitů pro jednotlivé modely) a menší fondy; kredity za registraci dostupné v prvním měsíci a trvale bezplatní poskytovatelé bez limitu tokenů jsou navíc uvedeni samostatně, takže nikdy nenavyšují hlavní údaj. Aktuální využití a zbývající kapacita na /dashboard/free-tiers. +Karta rozpočtu bezplatných tarifů OmniRoute: stabilně ~1,62 mld. tokenů zdarma měsíčně, v prvním měsíci až ~2,22 mld. díky kreditům za registraci, z 35 zdokumentovaných klíčů opakovaných fondů pokrývajících 489 katalogizovaných položek bezplatných tarifů za jediným koncovým bodem. Poctivý výpočet s odstraněním duplicit fondů — každý sdílený fond se počítá pouze jednou, včetně 17 opakovaných fondů se zveřejněným kladným měsíčním rozpočtem tokenů a pěti limitů Groq pro jednotlivé modely; 13 poskytovatelů je v katalogu rizik smluvních podmínek označeno jako nevhodných, abyste se mohli rozhodnout sami. Ukazatel rozpočtu zahrnuje Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (pět limitů pro jednotlivé modely) a menší fondy; kredity za registraci v prvním měsíci a trvale bezplatní poskytovatelé bez limitu tokenů jsou navíc uvedeni samostatně, aby nikdy nenavyšovali hlavní údaj. Aktuální využití a zbývající množství na /dashboard/free-tiers. > Animovaný přehled živé stránky `/dashboard/free-tiers`. Kompletní metodika (odstranění duplicit fondů, úrovně kreditů, podmínky poskytovatelů): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Tyto údaje každé dva týdny znovu ověřujeme podle živého katalogu a **mění se oběma směry** — když poskytovatel ukončí bezplatnou úroveň, číslo klesne; když přibude nová, číslo vzroste. Zveřejňujeme to, co katalog skutečně vypočítá, nikdy zaokrouhlený nejlepší možný scénář. +> Tyto údaje jsou každé dva týdny znovu ověřovány podle aktuálního katalogu a **mění se oběma směry** — když poskytovatel ukončí bezplatný tarif, číslo klesne; když přibude nový, číslo vzroste. Zveřejňujeme to, co katalog skutečně vypočítá, nikdy optimisticky zaokrouhlený nejlepší možný výsledek.
@@ -37,18 +37,18 @@

-⭐ Dejte repozitáři hvězdičku, pokud vám OMNIROUTE pomohl ušetřit peníze a usnadnil práci. +⭐ Pokud vám OMNIROUTE pomohl ušetřit peníze a usnadnit práci, přidejte repozitáři hvězdičku.

[![Hvězdičky](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) -diegosouzapw%2FOmniRoute | Trendshift -[![Pořadí historie hvězdiček](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) +diegosouzapw%2FOmniRoute | Trendshift +[![Pořadí podle historie hvězdiček](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) [![olud.ai](https://olud.ai/badge.php?tool=diegosouzapw-omniroute)](https://olud.ai/project/diegosouzapw-omniroute.html) ### 💬 Připojte se ke komunitě -**👋 Sledujte správce projektu — získejte informace o nových poskytovatelích, vydáních a tipech jako první:** +**👋 Sledujte správce projektu — dozvíte se jako první o nových poskytovatelích, vydáních a tipech:** [![Sledujte Diega na LinkedInu](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Sledujte @diegosouzapw na GitHubu](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -57,7 +57,7 @@ [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) [![WhatsApp globálně](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) [![WhatsApp Brazílie](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) -[![Web](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) +[![Webové stránky](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) **Dotazy, tipy na poskytovatele, plán vývoje a podpora → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Globální](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brazílie](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portál](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** @@ -598,9 +598,9 @@ aktuálním katalogu najdete na **[radar.omniroute.online/planos](https://radar.
-## 🤖 Kompatibilní CLI a programovací agenti +## 🤖 Kompatibilní nástroje CLI a programovací agenti -> Jedna konfigurace — `http://localhost:20128/v1` — a **každé** AI IDE nebo CLI funguje s bezplatnými a nízkonákladovými modely. +> Jedna konfigurace — `http://localhost:20128/v1` — a **každé** AI IDE či CLI běží na bezplatných a nízkonákladových modelech.
@@ -634,23 +634,23 @@ aktuálním katalogu najdete na **[radar.omniroute.online/planos](https://radar. - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ funguje také s · Kiro · Command Code · Antigravity · Windsurf · AMP · jakýmkoli nástrojem kompatibilním s OpenAI ++ funguje také s · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · jakýmkoli nástrojem kompatibilním s OpenAI
-📖 Nastavení pro každý z 36 nástrojů (26 nástrojů CLI Code + 10 CLI agentů) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Nastavení jednotlivých nástrojů pro všech 36 nástrojů (26 nástrojů CLI Code + 10 agentů CLI) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Spusťte libovolné podporované CLI přes OmniRoute jediným příkazem** — bez zápisu konfiguračních souborů, -přihlašovací údaje se vloží pro každý proces a Qwen/Gemini získají dočasný izolovaný domovský adresář: +**Spusťte libovolné podporované CLI prostřednictvím OmniRoute jediným příkazem** — bez zápisu konfiguračních souborů, +přihlašovací údaje se předají pouze danému procesu a Qwen/Gemini získají dočasný izolovaný domovský adresář: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -666,8 +666,8 @@ omniroute configure codex # také: claude opencode qwen aider goose gem ``` Každý příkaz respektuje aktivní vzdálený kontext (`omniroute connect `), `--dry-run` -zobrazí přesné proměnné prostředí a argumenty bez spuštění a `--api-key-env NAME` uchová tajné údaje mimo -historii vašeho shellu. → [Integrace CLI](docs/guides/CLI-INTEGRATIONS.md) +zobrazí náhled přesného prostředí a argumentů bez spuštění a `--api-key-env NAME` zabrání +uložení tajných údajů do historie shellu. → [Integrace CLI](docs/guides/CLI-INTEGRATIONS.md)
@@ -677,7 +677,7 @@ historii vašeho shellu. → [Integrace CLI](docs/guides/CLI-INTEGRATIONS.md) -> **357 registrovaných poskytovatelů** napříč kanonickými kolekcemi pro chat, média, vyhledávání, lokální provoz, cloudové agenty a systémové služby, včetně **152 poskytovatelů s metadaty pro vyhledávání `hasFree: true`**. Registr chatovacích modelů zahrnuje **229 poskytovatelů / 2 554 různých dvojic poskytovatel–model / 1 283 nezpracovaných ID modelů**; samostatný katalog bezplatných rozpočtů obsahuje **491 řádků jednotlivých modelů**, **35 opakujících se fondů** a **54 opakujících se / bezklíčových poskytovatelů bezplatných navždy**. Tyto jmenovatele se záměrně liší; definice a výpočty s fondy zbavenými duplicit naleznete v dokumentech [Přehled poskytovatelů](docs/reference/PROVIDER_REFERENCE.md) a [Bezplatné úrovně](docs/reference/FREE_TIERS.md). +> **357 registrovaných poskytovatelů** napříč kanonickými kolekcemi pro chat, média, vyhledávání, místní služby, cloudové agenty a systémové služby, včetně **152 poskytovatelů s metadaty pro vyhledávání `hasFree: true`**. Registr chatovacích modelů zahrnuje **229 poskytovatelů / 2 554 různých dvojic poskytovatel–model / 1 283 nezpracovaných ID modelů**; samostatný katalog bezplatných rozpočtů obsahuje **491 řádků pro jednotlivé modely**, **35 opakovaně se obnovujících fondů** a **54 poskytovatelů s opakovaně se obnovujícím nebo trvale bezplatným přístupem bez klíče**. Tyto jmenovatele se záměrně liší; definice a výpočty s odstraněním duplicitních fondů najdete v dokumentech [Přehled poskytovatelů](docs/reference/PROVIDER_REFERENCE.md) a [Bezplatné úrovně](docs/reference/FREE_TIERS.md).
@@ -710,11 +710,11 @@ historii vašeho shellu. → [Integrace CLI](docs/guides/CLI-INTEGRATIONS.md) -…a více než 330 dalších — všechny ikony se načítají živě z katalogu poskytovatelů řídicího panelu. 📖 [Přehled poskytovatelů](docs/reference/PROVIDER_REFERENCE.md) +…a více než 330 dalších — každá ikona se načítá živě z katalogu poskytovatelů řídicího panelu. 📖 [Přehled poskytovatelů](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Navždy zdarma — 0 $, bez platební karty +### 🆓 Navždy zdarma — $0, bez karty @@ -730,7 +730,7 @@ historii vašeho shellu. → [Integrace CLI](docs/guides/CLI-INTEGRATIONS.md) - +
Pollinations
Pollinations
GPT, Llama, Claude
Není potřeba žádný klíč
Cloudflare AI
Cloudflare AI
Více než 50 modelů
10 tis. neuronů/den
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM zdarma
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1 mil. tokenů/den
Openference
Openference
Qwen3.8 27B, Llama 3.2
Bezplatná úroveň
OpenRouter
OpenRouter
Modely :free
+$10 → vyšší RPM
@@ -1271,21 +1271,21 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 - + - - - + + + - - - - + + + + - +
VrstvaTechnologie
Běhové prostředíNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
JazykTypeScript 6.0 — 100% TypeScript napříč src/ a open-sse/ (od verze v2.0 žádné any v jádře)
JazykTypeScript 6.0 — 100% TypeScript v src/ a open-sse/ (od v2.0 žádné any v jádře)
FrameworkNext.js 16 + React 19 + Tailwind CSS 4
Databázebetter-sqlite3 (SQLite, žurnálování WAL) + LowDB (starší formát JSON) — 122 doménových modulů, 176 migrací
PaměťPlnotextové vyhledávání SQLite FTS5 + vektorové reprezentace kvantované na int8, typovaný útlum
SchémataZod 4 — ověřování vstupů a výstupů nástrojů MCP + kontrakty API
Databázebetter-sqlite3 (SQLite, žurnálování WAL) + LowDB (starší formát JSON) — 122 doménových modulů, 178 migrací
PaměťFulltextové vyhledávání SQLite FTS5 + vektorová vnoření kvantizovaná na int8, typovaný útlum
SchémataZod 4 — validace vstupů/výstupů nástrojů MCP + kontrakty API
ProtokolyMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
StreamováníServer-Sent Events (SSE) + most WebSocket (/v1/ws)
KompreseŘetězec 12 enginů — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Ověřování a zabezpečeníOAuth 2.0 (PKCE) + JWT + klíče API + ověřování s omezeným rozsahem MCP · AES-256-GCM pro uložená data · DOMPurify
Maskováníwreq-js — napodobování otisků TLS JA3 / JA4, tříúrovňové proxy
OdolnostJistič, exponenciální prodleva, ochrana proti thundering herd, automatické samoopravné kombinace
Protokolovánípino — strukturované protokoly JSON s kontextem požadavků
Ověřování & zabezpečeníOAuth 2.0 (PKCE) + JWT + klíče API + ověřování MCP s omezenými rozsahy · šifrování AES-256-GCM uložených dat · DOMPurify
Utajeníwreq-js — napodobování otisků TLS JA3 / JA4, tříúrovňové proxy
OdolnostJistič, exponenciální prodleva, ochrana proti souběžnému náporu požadavků, samoopravné automatické kombinování
Protokolovánípino — strukturované protokoly JSON s kontextem požadavku
TestováníTestovací nástroj Node.js + Vitest — více než 39 000 statických deklarací testů ve více než 5 100 sledovaných testovacích souborech (jednotkové, integrační, E2E, bezpečnostní, ekosystémové)
PlatformyDesktop (Electron) · Android (Termux) · PWA (libovolný prohlížeč)
CI/CDGitHub Actions — automatické publikování na npm + Docker Hub při vydání
CI/CDGitHub Actions — automatické publikování na npm a Docker Hub při vydání
OdkazyWebové stránky · npm · Docker Hub
@@ -1302,9 +1302,9 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 - + - +
DokumentPopis
Uživatelská příručkaPoskytovatelé, kombinace, integrace CLI, nasazení
Průvodce nastavenímKompletní metody instalace, konfigurace nástrojů CLI, nastavení protokolů, ladění časových limitů
Průvodce nastavenímKompletní způsoby instalace, konfigurace nástrojů CLI, nastavení protokolů, ladění časových limitů
Průvodce nástroji CLINastavení jednotlivých nástrojů Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo a Copilot
Vzdálený režimOvládání vzdálené instance OmniRoute (VPS) z CLI vašeho notebooku pomocí přístupových tokenů s omezeným rozsahem
Vzdálený režimOvládání vzdáleného OmniRoute (VPS) z CLI na notebooku pomocí přístupových tokenů s omezeným rozsahem
Konfigurace Claude CodePřipojení Claude Code k OmniRoute (lokálně/vzdáleně) pomocí launch a profilů pro jednotlivé modely
Rychlý startInstalace ve 3 krocích → připojení → konfigurace
@@ -1315,28 +1315,28 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 DokumentPopis Průvodce DockeremDocker run, profily Compose, Caddy HTTPS, tunely, značky obrazů Průvodce PodmanemIntegrace Quadlet se systemd, podman-compose, SELinux - Nasazení na virtuální počítačKompletní průvodce: nastavení virtuálního počítače + nginx + Cloudflare + Nasazení na virtuálním počítačiKompletní průvodce: nastavení virtuálního počítače + nginx + Cloudflare Nasazení na Fly.ioNasazení na Fly.io s trvalým úložištěm - Průvodce TermuxemProvoz OmniRoute v systému Android prostřednictvím Termuxu + Průvodce TermuxemSpuštění OmniRoute v systému Android prostřednictvím Termuxu Průvodce PWAInstalace progresivní webové aplikace, ukládání do mezipaměti, architektura - Průvodce odinstalacíČisté odstranění pro všechny metody instalace - Konfigurace prostředíKompletní proměnné a odkazy souboru .env + Průvodce odinstalacíČisté odebrání pro všechny způsoby instalace + Konfigurace prostředíKompletní proměnné a reference souboru .env ### 🧠 Funkce a architektura - - - - + + + + - + - - + +
DokumentPopis
ArchitekturaArchitektura systému, datový tok a interní fungování
Průvodce kompresíProces se 7 možnostmi: vypnuto / lehká / standardní / agresivní / ultra / RTK / vrstvená
Komprese RTKKomprese výstupu příkazů, filtry, důvěryhodnost, ověřování, obnova nezpracovaného výstupu
Kompresní modulyCaveman, RTK, vrstvené procesy, rozhraní řídicího panelu/API/MCP
ArchitekturaArchitektura systému, tok dat a interní fungování
Průvodce kompresíKanál se 7 možnostmi: vypnuto / lehká / standardní / agresivní / ultra / RTK / vrstvená
Komprese RTKKomprese výstupu příkazů, filtry, důvěryhodnost, ověřování, obnovení nezpracovaného výstupu
Kompresní modulyCaveman, RTK, vrstvené kanály, rozhraní řídicího panelu/API/MCP
Formát pravidel kompreseSchémata balíčků pravidel JSON pro filtry Caveman a RTK
Jazykové balíčky kompreseDetekce jazyka a tvorba balíčků pravidel Caveman
Průvodce odolnostíJističe, intervaly ochlazení, fronta, ochrana proti lavinovému efektu, podvržení TLS
Průvodce odolnostíJističe, intervaly zklidnění, fronta, ochrana proti lavinovému efektu, podvržení TLS
Modul Auto-ComboVyhodnocování podle 16 faktorů, balíčky režimů, samooprava
Průvodce proxyTříúrovňový systém proxy, tržiště 1proxy, operace CRUD registru
Bezplatné úrovněKonsolidovaný adresář: 35 zdokumentovaných opakujících se fondů / 491 katalogizovaných položek bezplatných úrovní
Průvodce proxyTříúrovňový systém proxy, tržiště 1proxy, operace CRUD s registrem
Bezplatné úrovněKonsolidovaný adresář: 35 zdokumentovaných opakujících se fondů / 489 katalogizovaných položek bezplatné úrovně
Galerie funkcíVizuální prohlídka řídicího panelu se snímky obrazovky
Dokumentace zdrojového kóduPrůvodce zdrojovým kódem vhodný pro začátečníky
@@ -1347,7 +1347,7 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 DokumentPopis Referenční příručka APIVšechny koncové body s příklady Specifikace OpenAPISpecifikace OpenAPI 3.0 - Server MCP110 nástrojů MCP, konfigurace IDE, klienti Python/TS/Go + Server MCP110 nástrojů MCP, konfigurace IDE, klienti pro Python/TS/Go Průvodce serverem MCPInstalace MCP, přenosové mechanismy a referenční příručka nástrojů Server A2AProtokol JSON-RPC 2.0, dovednosti, streamování, správa úloh Průvodce serverem A2AKarta agenta A2A, úlohy, dovednosti a streamování @@ -1358,11 +1358,11 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 - - + + - +
DokumentPopis
PřispíváníNastavení vývojového prostředí a pokyny
Model větvení a vydáváníKam směřují PR (release/*) a co znamenají main a značky
Přehled změnÚplná historie vydání podle jednotlivých verzí
Model větvení a vydáváníDo kterých větví směřují PR (release/*) a co znamenají main a značky
Přehled změnKompletní historie vydání podle jednotlivých verzí
Bezpečnostní zásadyHlášení zranitelností a bezpečnostní postupy
Průvodce i18nPodpora 42 jazyků, pracovní postup překladu, RTL
Kontrolní seznam vydáníKroky ověření před vydáním
Kontrolní seznam pro vydáníKroky ověření před vydáním
Plán pokrytíStrategie pokrytí testy pro více než 39 000 statických deklarací testů ve více než 5 100 sledovaných testovacích souborech
@@ -1372,7 +1372,7 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 # ⭐ Nejvýznamnější přispěvatelé -> OmniRoute utváří zapálená open-source komunita. Tito lidé mimořádným způsobem přispěli a jejich práce má přímý dopad na kvalitu, stabilitu a dosah projektu. **Děkujeme.** +> OmniRoute utváří nadšená open-source komunita. Tito lidé mimořádně přispěli k projektu a jejich práce má přímý dopad na jeho kvalitu, stabilitu a dosah. **Děkujeme.** ### Externí přispěvatelé podle počtu sloučených pull requestů @@ -1401,9 +1401,9 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922 20Prudhvivuda246,312 -Stav byl zmrazen na aktuální špičce větve release/v3.8.50, revizi dafb4ae808, včetně sloučení do 2026-08-24 05:26:03 UTC. Stránkovaný přehled GitHub GraphQL obsahuje 5 911 sloučených PR: 2 707 od vlastníka repozitáře, 179 od nástroje Dependabot a 3 025 externích PR od 535 různých přispěvatelů. „Změněné řádky“ představují součet přidaných a odstraněných řádků podle GitHubu a zahrnují generované soubory, lockfiles, katalogy, překlady a dokumentaci; jde o objem změn, nikoli o počet autorsky vytvořených řádků kódu. Shody na hranici pořadí jsou zachovány. +Stav zmrazen na aktuální špičce větve release/v3.8.50, revize dafb4ae808, se sloučeními do 2026-08-24 05:26:03 UTC. Stránkovaný přehled GitHub GraphQL obsahuje 5 911 sloučených PR: 2 707 od vlastníka repozitáře, 179 od Dependabotu a 3 025 externích PR od 535 různých přispěvatelů. „Změněné řádky“ představují součet přidaných a odstraněných řádků podle GitHubu a zahrnují generované soubory, soubory zámků, katalogy, překlady a dokumentaci; jde o objem změn, nikoli o počet autorsky vytvořených řádků kódu. Shodná umístění na hranici výběru jsou zachována. -### Commity přiřazené službou GitHub +### Commity přiřazené GitHubem @@ -1489,9 +1489,9 @@ Kanonické metriky k 2026-08-24: **1.029 jedinečných videí** · **11.132.922
-Znovu ověřeno 2026-08-24 06:14:31 UTC: commity přiřazené službou GitHub podle rozhraní Contributors API repozitáře pro výchozí větev release/v3.8.50. API vrátilo 525 identit (415 uživatelů, 2 boty, 108 anonymních); tato tabulka nezahrnuje správce projektu, boty ani anonymní identity a zachovává dělená umístění. Liší se jak od výše uvedeného pořadí podle sloučených PR, tak od níže uvedeného soupisu 639 osob podle metadat systému Git. +Znovu ověřeno 2026-08-24 06:14:31 UTC: commity přiřazené službou GitHub, které rozhraní Contributors API repozitáře vykázalo pro výchozí větev release/v3.8.50. Rozhraní API vrátilo 525 identit (415 uživatelů, 2 boty, 108 anonymních); tato tabulka nezahrnuje správce, boty ani anonymní identity a zachovává dělená umístění. Liší se jak od výše uvedeného žebříčku sloučených PR, tak od níže uvedeného přehledu 639 osob založeného na metadatech Gitu. -> 🙏 Funkce, opravy chyb a vylepšení infrastruktury od těchto přispěvatelů jsou **zásadní součástí** toho, díky čemu je OmniRoute spolehlivý a nabitý funkcemi. Záleží na každém pull requestu, každém testovacím případu a každém souboru s překlady i18n. Open source tvoří lidé jako oni. +> 🙏 Funkce, opravy chyb a vylepšení infrastruktury od těchto přispěvatelů jsou **klíčovou součástí** toho, co činí OmniRoute spolehlivým a bohatým na funkce. Záleží na každém pull requestu, každém testovacím případu a každém překladovém souboru i18n. Open source tvoří lidé jako oni.
diff --git a/docs/i18n/cs/SECURITY.md b/docs/i18n/cs/SECURITY.md index 9d506be2e48f..6959a78f4cdf 100644 --- a/docs/i18n/cs/SECURITY.md +++ b/docs/i18n/cs/SECURITY.md @@ -222,17 +222,35 @@ Dodržování těchto pravidel vynucují nástroje a kontroloři: ## Nálezy skenerů dodavatelského řetězce (Socket.dev / Snyk / podobné) -Publikovaný npm artefakt `omniroute` obsahuje sestavení Next.js s nastavením `output: "standalone"`, což znamená, že každý obslužný program tras — včetně zdokumentovaných privilegovaných funkcí (MITM, import ze Zed, Cloud Sync, integrovaný správce služeb) — skončí v minifikovaných blocích `.next/server/*.js`. Heuristické skenery dodavatelského řetězce často porovnávají vzory v těchto blocích se signaturami malwaru. - -Konfigurace skeneru, kterou používáme, se nachází v souboru [`socket.yml`](socket.yml) v kořenovém adresáři repozitáře (formát Socket.dev GitHub App v2 — viz ). Výslovně vylučuje adresáře, které nejsou součástí distribuce (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` atd.), takže skener hlásí pouze cesty v kódu, které se skutečně dostanou k uživatelům publikovaného balíčku — samotné skenování provádí GitHub App služby Socket na základě tohoto souboru, nikoli workflow v tomto repozitáři. +> **Poznámka k rozsahu:** Soubor `socket.yml` v kořenovém adresáři repozitáře pouze nastavuje `projectIgnorePaths` pro kontrolu publikovaného npm artefaktu prováděnou službou Socket.dev na straně registru po jeho publikování — nejde o vynucovanou kontrolu slučování v CI/PR. Socket.dev nespouští žádný pracovní postup v `.github/workflows`, žádný skript v `package.json` ani žádný cíl v `Makefile`. + +Publikovaný npm artefakt `omniroute` obsahuje sestavení Next.js s nastavením `output: "standalone"`, +což znamená, že každý obslužný modul trasy — včetně zdokumentovaných privilegovaných +funkcí (MITM, import ze Zed, Cloud Sync, integrovaný správce služeb) — skončí +v minifikovaných částech `.next/server/*.js`. Heuristické skenery dodavatelského řetězce +tyto části často porovnávají se vzory signatur malwaru. + +Konfigurace skeneru, kterou používáme, se nachází v souboru [`socket.yml`](socket.yml) v +kořenovém adresáři repozitáře (formát v2 aplikace Socket.dev pro GitHub — viz +). Explicitně vylučuje +adresáře, které nejsou součástí distribuovaného artefaktu (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` atd.), takže skener hlásí pouze cesty kódu, které +se skutečně dostanou k uživatelům publikovaného balíčku — samotnou kontrolu spouští aplikace Socket +pro GitHub načtením tohoto souboru, nikoli pracovní postup v tomto repozitáři. Pro každou kategorii nálezů udržujeme potvrzení správce pro jednotlivé nálezy: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - mapa jednotlivých nálezů: zdrojový soubor ↔ označený blok ↔ chování ↔ zmírnění rizika použité ve verzi v3.8.6. -- Bloky `SECURITY-AUDITOR-NOTE:` ve zdrojovém kódu u každé označené funkce odkazují zpět na tentýž dokument. - -Uživatelé, jejichž pipeline neumožňuje zmírnit výstrahu, mohou sestavení vytvořit pomocí příkazu `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Tím se čtyři citlivé moduly nahradí zástupnými implementacemi, které za běhu vracejí HTTP 503 `feature-disabled`, takže privilegované cesty v kódu nejsou v balíčku fyzicky přítomny. Postup publikování najdete v dokumentu [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). + mapa jednotlivých nálezů: zdrojový soubor ↔ označená část ↔ chování ↔ zmírnění rizika + použité ve v3.8.6. +- Bloky `SECURITY-AUDITOR-NOTE:` ve zdrojovém kódu u každé označené funkce + odkazují zpět na tentýž dokument. + +Uživatelé, jejichž pipeline nemůže toto upozornění zmírnit, mohou sestavení provést pomocí +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Tím se čtyři +citlivé moduly nahradí zástupnými implementacemi, které za běhu vracejí HTTP 503 `feature-disabled`, +takže privilegované cesty kódu v balíčku fyzicky nejsou přítomny. +Postup publikování naleznete v souboru [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Odkazy diff --git a/docs/i18n/cs/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/cs/docs/architecture/CODEBASE_DOCUMENTATION.md index 37f0147e93c7..ae266c9a4802 100644 --- a/docs/i18n/cs/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/cs/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,10 +434,9 @@ Rozděleno do účelově zaměřených podadresářů: --- -## 4. `open-sse/` — Pracovní prostor streamovacího enginu +## 4. `open-sse/` — pracovní prostor streamovacího enginu -Samostatný pracovní prostor npm publikovaný jako `@omniroute/open-sse`. Zajišťuje zpracování -požadavků, executory, překladače, služby, transformer a server MCP. +Samostatný pracovní prostor npm publikovaný jako `@omniroute/open-sse`. Zajišťuje zpracování požadavků, exekutory, překladače, služby, transformátor a server MCP. ``` open-sse/ @@ -447,51 +446,51 @@ open-sse/ ├── types.d.ts ├── config/ Registry poskytovatelů, profily hlaviček, identita, … ├── handlers/ Obslužné rutiny požadavků (chat, embeddingy, zvuk, obrázky, …) -├── executors/ 108 HTTP executorů specifických pro jednotlivé poskytovatele +├── executors/ 108 HTTP exekutorů specifických pro poskytovatele ├── translator/ Převod formátů (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Transformer streamu Responses API ↔ Chat Completions -├── services/ Více než 80 modulů služeb (kombinace, záložní varianty, kvóty, identita, …) +├── transformer/ Transformátor streamů Responses API ↔ Chat Completions +├── services/ Více než 80 modulů služeb (kombinace, záložní zpracování, kvóty, identita, …) ├── utils/ Pomocné nástroje pro streamování, klient TLS, AWS SigV4, proxy fetch, … └── mcp-server/ Server MCP (3 transporty, 33 rozsahů, 110 nástrojů) ``` ### 4.1 `open-sse/handlers/` -| Obslužná rutina | Účel | -| ----------------------- | ------------------------------------------------------------------------------------------ | -| `chatCore.ts` | Hlavní pipeline chatu (cache, omezení frekvence, kombinované směrování, předání executoru) | -| `responsesHandler.ts` | Vstupní bod OpenAI Responses API | -| `embeddings.ts` | Embeddingy | -| `imageGeneration.ts` | Generování obrázků | -| `audioSpeech.ts` | Převod textu na řeč | -| `audioTranscription.ts` | Převod řeči na text | -| `videoGeneration.ts` | Generování videa | -| `musicGeneration.ts` | Generování hudby | -| `rerank.ts` | Změna pořadí výsledků | -| `moderations.ts` | Moderování | -| `search.ts` | Vyhledávání na webu | -| `sseParser.ts` | Parser událostí SSE | -| `usageExtractor.ts` | Získávání počtů tokenů z upstreamových streamů | -| `responseSanitizer.ts` | Odstranění šumu specifického pro poskytovatele | -| `responseTranslator.ts` | Propojení mezi odpovědí poskytovatele a překladovou vrstvou | +| Obslužná rutina | Účel | +| ----------------------- | ---------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Hlavní pipeline chatu (mezipaměť, omezení rychlosti, kombinované směrování, předání exekutoru) | +| `responsesHandler.ts` | Vstupní bod OpenAI Responses API | +| `embeddings.ts` | Embeddingy | +| `imageGeneration.ts` | Generování obrázků | +| `audioSpeech.ts` | Převod textu na řeč | +| `audioTranscription.ts` | Převod řeči na text | +| `videoGeneration.ts` | Generování videa | +| `musicGeneration.ts` | Generování hudby | +| `rerank.ts` | Změna pořadí | +| `moderations.ts` | Moderování | +| `search.ts` | Vyhledávání na webu | +| `sseParser.ts` | Parser událostí SSE | +| `usageExtractor.ts` | Extrakce počtů tokenů z upstream streamů | +| `responseSanitizer.ts` | Odstranění šumu specifického pro poskytovatele | +| `responseTranslator.ts` | Propojení mezi odpovědí poskytovatele a překladovou vrstvou | ### 4.2 `open-sse/executors/` -108 executorů poskytovatelů, z nichž každý rozšiřuje `BaseExecutor` (`base.ts`): +108 exekutorů poskytovatelů, z nichž každý rozšiřuje `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, dále `claudeIdentity.ts` -(sdílený pomocný nástroj pro identitu) a `index.ts` (registr). +(sdílená pomocná komponenta pro identitu) a `index.ts` (registr). -> Poznámka: poskytovatele, kteří zde nejsou uvedeni, obsluhuje `default.ts` pomocí obecného -> executoru kompatibilního s OpenAI. Úplný katalog poskytovatelů (355 poskytovatelů) se nachází v +> Poznámka: poskytovatelé, kteří zde nejsou uvedeni, jsou obsluhováni souborem `default.ts` pomocí obecného +> exekutoru kompatibilního s OpenAI. Úplný katalog poskytovatelů (355 poskytovatelů) se nachází v > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Překlad v architektuře hub-and-spoke (OpenAI je centrální uzel). +Překlad v modelu hub-and-spoke (OpenAI je centrálním uzlem). - **9 překladačů požadavků** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -501,56 +500,56 @@ Překlad v architektuře hub-and-spoke (OpenAI je centrální uzel). `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 pomocných nástrojů** (`translator/helpers/`): +- **9 pomocných komponent** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, - `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper` a také - testy pomocných nástrojů. -- **Pomocné nástroje pro obrázky** (`translator/image/sizeMapper.ts`). -- Nejvyšší úroveň: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. + `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper` a + testy pomocných komponent. +- **Pomocné komponenty pro obrázky** (`translator/image/sizeMapper.ts`). +- Na nejvyšší úrovni: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — převodník Responses API ↔ Chat Completions založený - na `TransformStream` (používaný záchytnou routou `responses/`). +- `responsesTransformer.ts` — převodník Responses API ↔ Chat Completions založený na `TransformStream` + (používaný univerzální routou `responses/`). ### 4.5 `open-sse/services/` -Nejdůležitější části (úplný seznam v `open-sse/services/`): - -| Oblast | Soubory | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Směrování Combo | `combo.ts` (19 strategií), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Engine Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Odolnost | `accountFallback.ts` (doba čekání + uzamčení), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kvóty | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Ukládání do mezipaměti | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Inteligentní směrování | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Zpracování modelů | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Komprese | `compression/` — kompletní propojení kompresního enginu | -| Tokeny + relace | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Úroveň / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / síť | `ipFilter.ts`, `webSearchFallback.ts` | -| Dávky | `batchProcessor.ts` | -| Využití | `usage.ts` | +Hlavní části (úplný seznam v `open-sse/services/`): + +| Oblast | Soubory | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Směrování Combo | `combo.ts` (19 strategií), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Engine Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Odolnost | `accountFallback.ts` (prodleva + uzamčení), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kvóty | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Ukládání do mezipaměti | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Inteligentní směrování | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Zpracování modelů | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Komprese | `compression/` — kompletní propojení kompresního enginu | +| Tokeny + relace | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Úroveň / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / síť | `ipFilter.ts`, `webSearchFallback.ts` | +| Dávky | `batchProcessor.ts` | +| Využití | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 jedinečných nástrojů** propojených v `server.ts` (45 kanonických v `schemas/tools.ts` + - moduly paměti, dovedností, GitHub-skills, fondu, gamifikace, pluginů, Notion, Obsidian, - lokálního korpusu a komprese — sjednocení spočítané funkcí `countUniqueMcpTools`). + moduly pro paměť, dovednosti, dovednosti GitHubu, fond, gamifikaci, pluginy, Notion, Obsidian, + lokální korpus a kompresi — sjednocení počítá `countUniqueMcpTools`). - **3 transporty**: stdio, HTTP Streamable, SSE. -- **33 rozsahů oprávnění** vynucovaných za běhu — základní seznam v `src/shared/constants/mcpScopes.ts`, úplná sada je sjednocením rozsahů deklarovaných jednotlivými moduly nástrojů. -- Auditní tabulka: `mcp_tool_audit` (naplňovaná souborem `audit.ts`). +- **33 rozsahů oprávnění** vynucovaných za běhu — základní seznam je v `src/shared/constants/mcpScopes.ts`, úplnou sadu tvoří sjednocení rozsahů deklarovaných jednotlivými moduly nástrojů. +- Tabulka auditu: `mcp_tool_audit` (plněná modulem `audit.ts`). - Soubory: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - a testy v `__tests__/`. -- Úplný katalog nástrojů najdete v dokumentu [MCP-SERVER.md](../frameworks/MCP-SERVER.md). + plus testy v `__tests__/`. +- Úplný katalog nástrojů najdete v [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### 4.7 `open-sse/config/` Registry poskytovatelů (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), registry modelů pro jednotlivé formáty (`audioRegistry.ts`, +`providerHeaderProfiles.ts`), registry modelů podle jednotlivých formátů (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), pomocné nástroje pro identitu (`codexIdentity.ts`, `codexInstructions.ts`, diff --git a/docs/i18n/cs/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/cs/docs/architecture/RESILIENCE_GUIDE.md index 6e005ca0efac..45f7c3ff946b 100644 --- a/docs/i18n/cs/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/cs/docs/architecture/RESILIENCE_GUIDE.md @@ -67,7 +67,7 @@ exponenciální prodlevu `minRetryCooldownMs → maxRetryCooldownMs`. Přepsán `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Ochrana proti regresím: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Cooldown připojení +## 2. Doba blokování připojení **Rozsah:** jedno připojení / účet / klíč poskytovatele. @@ -77,40 +77,103 @@ Ochrana proti regresím: `tests/unit/provider-cooldown-window-gate.test.ts`. - Označení jako nedostupné: `src/sse/services/auth.ts::markAccountUnavailable()` - Výběr: `getProviderCredentials*` ve stejném souboru -- Výpočet cooldownu: `open-sse/services/accountFallback.ts::checkFallbackError()` +- Výpočet doby blokování: `open-sse/services/accountFallback.ts::checkFallbackError()` - Nastavení: `src/lib/resilience/settings.ts` **Pole pro jednotlivá připojení:** -- `rateLimitedUntil` — časové razítko, do kterého cooldown platí +- `rateLimitedUntil` — časové razítko, do kterého trvá blokování - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — čítač exponenciálního prodlužování prodlevy -**Výchozí cooldowny:** +**Výchozí doby blokování:** - Základ pro OAuth: 5 s - Základ pro klíč API: 3 s -- Klíč API při 429: upřednostňuje hlavičku `Retry-After`, resetovací hlavičky nebo analyzovatelný text o resetování z nadřazené služby -- Prodlužování prodlevy: `baseCooldownMs * 2 ** failureIndex` +- 429 pro klíč API: upřednostňuje hlavičku `Retry-After`, hlavičky resetování nebo analyzovatelný text resetování od nadřazené služby +- Prodleva: `baseCooldownMs * 2 ** failureIndex` -**Ochrana proti souběžnému náporu:** zabraňuje tomu, aby souběžná selhání nadměrně prodlužovala cooldown nebo vícekrát inkrementovala `backoffLevel`. +**Ochrana proti lavinovému souběhu:** zabraňuje tomu, aby souběžná selhání nadměrně prodloužila dobu blokování nebo zvýšila `backoffLevel` vícekrát. -**Koncové stavy (NEJDE o cooldowny):** +**Koncové stavy (NEJDE o doby blokování):** -- `banned` — nastavuje se při detekci zakázaného klíčového slova / zablokování účtu (viz [BAN_DETECTION](../security/BAN_DETECTION.md)) a při třech po sobě jdoucích odmítnutích jednotlivých požadavků nadřazenou službou (`request_rejected`, např. Anthropic OAuth 403 „Request not allowed“ — `open-sse/services/requestRejectedStreak.ts`); jediné odmítnutí pouze aktivuje cooldown připojení -- `expired` (po omezeném počtu opakovaných pokusů přejde do koncového stavu — `EXPIRED_RETRY_MAX = 3` s exponenciálním prodlužováním prodlevy — takže se přechodné chyby OAuth mohou samy napravit, než bude účet trvale deaktivován) +- `banned` — nastaveno při detekci klíčového slova zákazu / zablokování účtu (viz [BAN_DETECTION](../security/BAN_DETECTION.md)) a při třech po sobě jdoucích odmítnutích jednotlivých požadavků nadřazenou službou (`request_rejected`, např. Anthropic OAuth 403 „Požadavek není povolen“ — `open-sse/services/requestRejectedStreak.ts`); jediné odmítnutí pouze dočasně zablokuje připojení +- `expired` (po omezeném počtu opakování přejde do koncového stavu — `EXPIRED_RETRY_MAX = 3` s exponenciální prodlevou — takže se přechodné chyby OAuth mohou samy opravit, než bude účet trvale deaktivován) - `credits_exhausted` -Tyto stavy přetrvávají, dokud se nezmění přihlašovací údaje nebo je operátor neresetuje. Nepřepisujte koncové stavy přechodným stavem cooldownu. +Tyto stavy přetrvávají, dokud se nezmění přihlašovací údaje nebo je operátor neresetuje. Nepřepisujte koncové stavy přechodným stavem blokování. -**Líné obnovení:** jakmile uplyne `rateLimitedUntil`, připojení se znovu stane způsobilým. Po úspěšném použití funkce `clearAccountError()` vymaže všechna chybová pole. +**Líné obnovení:** jakmile čas `rateLimitedUntil` uplyne, připojení lze znovu použít. Po úspěšném použití `clearAccountError()` vymaže všechna chybová pole. + +### Limit využití Claude OAuth: pruh s nižší prioritou + reset limitu relace + +**Rozsah:** jedno připojení k předplatnému Claude (OAuth). Obě funkce jsou **volitelné pro každé +připojení** (Upravit připojení → sekce Claude → `lowPriorityMode` / `autoLimitReset` v +`providerSpecificData`, obě jsou ve výchozím nastavení vypnuté) a odpovídají příkazům `/low-priority` a +`/limit-reset` nástroje Claude Code (komunikační kontrakt zachycen z Claude Code 2.1.263). + +**Implementace:** + +- Stavový automat + klasifikace odpovědí: `open-sse/services/claudeLowPriority.ts` +- Klient stavu resetu / jeho uplatnění: `open-sse/services/claudeLimitReset.ts` +- Napojení exekutoru (vložení hlavičky + opakování se stejným účtem): `open-sse/executors/base.ts::execute()` +- Perzistence volitelného nastavení: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Spouštěč:** limit využití za 5 hodin — odpověď `429`, jejíž hlavičky obsahují +`anthropic-ratelimit-unified-status: rejected`, a pokud je účet způsobilý, +`anthropic-ratelimit-unified-slow-offer: treatment`. Před první odpovědí 429 kvůli tomuto limitu se nic +neodesílá; série odpovědí 429 bez sjednocených hlaviček prochází běžnou cestou blokování. + +**Pruh s nižší prioritou** (`lowPriorityMode`): + +- Při odpovědi 429 kvůli limitu exekutor nabídku přijme a okamžitě opakuje požadavek se **stejným** + účtem a hlavičkou `anthropic-usage-limit: slow`; pruh zůstává aktivní do oznámeného času + `anthropic-ratelimit-unified-reset` (+60 s tolerance) a každý požadavek v tomto intervalu obsahuje + danou hlavičku. Zachycená odpověď 429 se nikdy nedostane k `handleChatCore`, takže připojení + **není** dočasně zablokováno ani nahrazeno jiným. +- `anthropic-ratelimit-unified-slow-status` v pozdějších odpovědích: `active` / `not_needed` + zachovávají pruh; při `slot_busy` (429) nebo `529` se čeká po dobu určenou serverem v + `anthropic-ratelimit-unified-slow-retry-after` (výchozí 20 s, omezeno na 5–600 s, odchylka ±30 %) + a požadavek se opakuje, s limitem podle `anthropic-ratelimit-unified-slow-max-wait` (výchozí 20 min, + omezeno na 1 min–6 h) — po překročení tohoto limitu pruh skončí a 10minutová ochranná lhůta zabrání + jeho opětovnému přijetí. Čekání je navíc omezeno zbývající dobou vlastního časového limitu požadavku + pro zahájení komunikace s nadřazenou službou (`resolveFetchStartTimeout`, ve výchozím nastavení 10 min) + zmenšenou o rezervu 5 s: bez tohoto omezení by výchozí maximální čekání 20 minut přežilo samotný + požadavek a uspání by bylo přerušeno uprostřed čekání, což by místo řádného ukončení `max_wait` + a ochranné lhůty vyvolalo `TimeoutError`. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, překlopení 5hodinového okna nebo + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (což jej při libovolném stavu + ukončí jako `extra_usage`, protože placené překročení nyní limit pokrývá) pruh ukončí; odpověď poté + pokračuje běžnou cestou blokování. Stav `budget_exhausted` se uchovává až do oznámeného resetu + rozpočtu (≤ 8 dní). +- Kontrola limitu se provádí po vlastních opakovaných pokusech exekutoru v rámci jednoho pokusu, + vyvolaných odpovědí 400 (úprava kontextu, omezení parametrů přemýšlení/úsilí, automatické učení + parametrů), takže odpověď 429 kvůli limitu, která se objeví až při jednom z těchto opakování, + bude stále zachycena a nedostane se do cesty blokování. +- Stav je uložen v paměti pro jednotlivá připojení (restart způsobí jednu dodatečnou odpověď 429 + kvůli limitu nutnou k opětovnému přijetí). + +**Reset limitu relace** (`autoLimitReset`, při zapnutí obou funkcí se zkouší před pruhem): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → blok `juniper_tide`; + pokud `arm: "reset"` a `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` s + `{ "program": "juniper_tide" }` (UUID organizace z + `providerSpecificData.organizationUUID`, se záložním načtením při inicializaci). +- `result: reset|not_limited` → požadavek se zopakuje plnou rychlostí (bez hlavičky pro pomalý režim). + `already_used` / `not_offered` uloží `next_available_at` (ve výchozím nastavení jeden týden); + při jakémkoli selhání se další pokus odloží o 15 minut. Reset lze provést jednou týdně a stále se + započítává do týdenního limitu. + +Ochrany proti regresím: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Afinita relace (#7274) **Rozsah:** jedna klientská relace (hlavička `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) připnutá k jednomu připojení pro **libovolného** poskytovatele. -**Účel:** zachovat vícetahového agenta (Claude Code, aider, vlastní agenty) na stejném účtu napříč požadavky, čímž se omezí ztráta kontextu při přechodu mezi účty a opakované chyby 429 při studeném startu u poskytovatelů se stavem relace vázaným na účet. +**Účel:** udržet vícekolového agenta (Claude Code, aider, vlastní agenty) mezi požadavky na stejném účtu, čímž se omezí ztráta kontextu při přechodu mezi účty a opakované chyby 429 při studeném startu u poskytovatelů se stavem relace vázaným na účet. **Implementace:** @@ -118,45 +181,29 @@ Tyto stavy přetrvávají, dokud se nezmění přihlašovací údaje nebo je ope - Výběr/vytvoření připnutí: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Extrakce hlavičky (obecná, pro libovolného poskytovatele): `src/sse/services/auth.ts::extractSessionAffinityKey()` - Tabulka trvale uložených připnutí: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Nastavení: `sessionAffinityTtlMs` (globální TTL v ms, `0` funkci vypne) — `src/lib/db/settings.ts`. Migrace `124_generic_session_affinity_ttl.sql` jej přejmenovala z nastavení `codexSessionAffinityTtlMs`, které bylo určeno pouze pro Codex, a přenáší jakoukoli dříve nakonfigurovanou hodnotu TTL pro Codex jako novou výchozí hodnotu. +- Nastavení: `sessionAffinityTtlMs` (globální TTL v ms, `0` funkci zakáže) — `src/lib/db/settings.ts`. Migrací `124_generic_session_affinity_ttl.sql` bylo přejmenováno z nastavení `codexSessionAffinityTtlMs`, které bylo určeno pouze pro Codex; migrace převede jakoukoli dříve nakonfigurovanou hodnotu TTL pro Codex na novou výchozí hodnotu. -Před #7274 se funkce `resolveSessionAffinityTtlMs()` pro každého poskytovatele kromě `codex` okamžitě ukončila s hodnotou `0`, takže nastavení TTL (ani hlavičky relace) nemělo nikde jinde žádný účinek, přestože mechanismus připnutí a extrakce hlaviček již byly nezávislé na poskytovateli. Oprava toto předčasné ukončení odstranila; jakmile je globální hodnota TTL nastavena nad `0`, používá se nyní jednotně pro každého poskytovatele. +Před #7274 funkce `resolveSessionAffinityTtlMs()` okamžitě vracela `0` pro každého poskytovatele kromě `codex`, takže nastavení TTL (ani hlavičky relace) nemělo nikde jinde žádný účinek, přestože mechanismus připnutí a extrakce hlaviček již byly nezávislé na poskytovateli. Oprava toto předčasné ukončení odstranila; jakmile je globální hodnota TTL nastavena nad `0`, uplatňuje se nyní jednotně na všechny poskytovatele. -Tři hlavičky afinity relace se nikdy nepředávají nadřazené službě — vykonavatelé vytvářejí vlastní hlavičky pro nadřazenou službu od začátku, místo aby předávali hlavičky klienta, takže zůstávají pouze interním korelačním ID. +Tyto tři hlavičky afinity relace se nikdy nepředávají nadřazenému poskytovateli — vykonavatelé sestavují vlastní hlavičky pro nadřazeného poskytovatele od základu, místo aby přeposílali hlavičky klienta, takže jde pouze o interní korelační ID. -### Výhradní pronájmy připojení spravovaných relací +### Výhradní pronájmy spravovaného připojení relace -**Rozsah:** jeden aktivní spravovaný klient / relace HTTP vlastní jedno způsobilé připojení OmniRoute. +**Rozsah:** jeden aktivní spravovaný HTTP klient/relace vlastní jedno způsobilé připojení OmniRoute. -**Účel:** poskytovat trvalé výhradní vlastnictví připojení klientům, kteří napříč požadavky potřebují pevnou -hranici směrování. Tím se liší od afinity relace, která představuje nezávaznou preferenci kontinuity: -výhradní pronájem uchovává stav životního cyklu v SQLite, vynucuje globální jedinečnost aktivního vlastníka a -aktivního připojení a před odesláním poskytovateli odmítne zastaralou generaci. +**Účel:** zajistit trvalé výhradní vlastnictví připojení pro klienty, kteří mezi požadavky potřebují pevnou směrovací bariéru. To se liší od afinity relace, která představuje pouze měkkou preferenci kontinuity: výhradní pronájem uchovává stav životního cyklu v SQLite, vynucuje globální jedinečnost aktivního vlastníka i aktivního připojení a před předáním požadavku poskytovateli odmítne zastaralou generaci. -Funkce se aktivuje samostatně pro každý klíč API. Spravovaný klíč musí mít rozsah `lease:exclusive` a -explicitní neprázdný seznam `allowedConnections`. Koncový bod životního cyklu může používat libovolný klient HTTP; není -vyžadován název klienta, user-agent, poskytovatel, metoda OAuth ani model. Pronájem vlastní připojení, -nikoli model, takže při změně modelu zůstane vazba zachována, dokud je připojení běžným způsobem -způsobilé. Běžná pravidla pro model, kvótu, stav, cooldown a seznam povolených položek zůstávají směrodatná a mohou -převést stejnou generaci na jiné volné způsobilé připojení. +Funkce se aktivuje samostatně pro každý API klíč. Spravovaný klíč musí mít oprávnění `lease:exclusive` a explicitní neprázdný seznam `allowedConnections`. Koncový bod životního cyklu může používat libovolný HTTP klient; není vyžadován název klienta, user-agent, poskytovatel, metoda OAuth ani model. Pronájem vlastní připojení, nikoli model, takže změna modelu zachová vazbu, dokud je připojení za běžných podmínek způsobilé. Běžná pravidla pro model, kvótu, stav, dobu cooldownu a seznam povolených připojení zůstávají rozhodující a mohou stejnou generaci převést na jiné volné způsobilé připojení. -Životní cyklus používá `POST /api/v1/session-leases` s akcemi JSON `acquire`, `renew` a `release`. -Spravované inferenční požadavky předkládají neprůhlednou hodnotu `X-OmniRoute-Lease-Owner` a přesnou -hodnotu `X-OmniRoute-Lease-Generation`. Identifikátor vlastníka používá předponu `vlo_`, za níž následuje 43 znaků base64url; ukládá se pouze -jeho hash SHA-256. Každá konečná kontrola před odesláním také váže ID ověřeného klíče API a -ID aktivního připojení. Řídicí hlavičky pronájmu jsou odstraňovány z protokolů, uchovávaných snímků požadavků a -hlaviček vykonavatele pro nadřazenou službu. +Životní cyklus používá `POST /api/v1/session-leases` s akcemi JSON `acquire`, `renew` a `release`. Spravované požadavky na inferenci předkládají neprůhlednou hodnotu `X-OmniRoute-Lease-Owner` a přesnou hodnotu `X-OmniRoute-Lease-Generation`. Identifikátor vlastníka začíná `vlo_`, po němž následuje 43 znaků base64url; ukládá se pouze jeho hash SHA-256. Každá závěrečná bariéra předání požadavku rovněž váže ID ověřeného API klíče a ID aktivního připojení. Řídicí hlavičky pronájmu jsou odstraněny z protokolů, uchovávaných snímků požadavků a hlaviček vykonavatelů pro nadřazeného poskytovatele. -Pokud má běžné směrování způsobilé spravované kandidáty, ale každý volný kandidát je obsazen -cizím aktivním pronájmem, OmniRoute vrátí HTTP `429`, kód nedostupné kapacity pronájmů, -stav čekání na kapacitu a omezenou hodnotu `Retry-After` odvozenou z nejbližšího relevantního vypršení platnosti. -Běžný prázdný soubor způsobilých kandidátů nepředstavuje konflikt pronájmů a zachovává stávající sémantiku chyb směrování. +Pokud má běžné směrování způsobilé spravované kandidáty, ale každý volný kandidát je obsazen cizím aktivním pronájmem, OmniRoute vrátí HTTP `429`, kód lease-capacity-unavailable, stav čekání na kapacitu a omezenou hodnotu `Retry-After` odvozenou od nejbližšího relevantního vypršení platnosti. Běžný případ bez způsobilých kandidátů nepředstavuje konflikt pronájmů a zachovává stávající sémantiku chyb směrování. Související mechanismy zůstávají oddělené: -- Obsazenost relací OAuth je lokální nezávazná distribuce v rámci procesu pro účty OAuth. -- Semafory účtů udělují povolení pro souběžné požadavky a končí po dokončení požadavku. -- Výhradní pronájmy připojení spravovaných relací představují trvalé vlastnictví v rámci životního cyklu s kontrolou generace. +- Obsazení relací OAuth představuje měkké rozdělování účtů OAuth v rámci procesu. +- Semafory účtů udělují oprávnění k souběžnému zpracování požadavků a končí po dokončení požadavku. +- Výhradní pronájmy spravovaných relací představují trvalé vlastnictví životního cyklu s generační bariérou. --- @@ -287,48 +334,76 @@ limit rychlosti pro jednotlivý model. Chování je omezeno nastavením `comboCo --- -## 5. Řízení přijímání požadavků do fronty (v3.8.49 · problém #6593) +## 5. Řízení přijímání požadavků do fronty (v3.8.49 · issue #6593) **Rozsah**: místní fronta omezení rychlosti pro jednotlivé kombinace poskytovatele a připojení (`open-sse/services/rateLimitManager.ts`, -založená na Bottleneck), tedy jedna vrstva pod třemi výše uvedenými mechanismy. - -**`maxWaitMs` je starší trvale uložený název pro vypršení doby provádění.** -`resilienceSettings.requestQueue.maxWaitMs` se předává do Bottleneck jako -`expiration` úlohy, jehož časovač se spustí až po odeslání. Omezuje tedy -provádění spravované limiterem, nikoli čas strávený v místní frontě. Vypršení doby -se hlásí jako důvěryhodný místní kód `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504); -dřívější název kódu časového limitu fronty je přijímán pouze kvůli důvěryhodné interní -zpětné kompatibilitě. Výchozí hodnota je 15000ms; lze ji přepsat pomocí -`RATE_LIMIT_MAX_WAIT_MS` (proměnná prostředí) nebo na ovládacím panelu (**Nastavení → Odolnost**, -limit uživatelského rozhraní 1–30000ms). Doba setrvání ve frontě nemá žádný časový limit; počet -čekajících volajících omezte níže uvedeným nastavením `maxQueueDepth`. +založená na Bottleneck), o jednu vrstvu níže než tři výše uvedené mechanismy. + +**`maxWaitMs` omezuje čekání ve frontě; `executionMaxWaitMs` omezuje provádění.** +Tyto dva limity jsou záměrně oddělené a ani jeden neovlivňuje druhý. + +`resilienceSettings.requestQueue.maxWaitMs` je **rozpočet čekání ve frontě**: +zahrnuje čekání na slot poskytovatele a následný pobyt ve stavu QUEUED, přičemž +jeho časovač se zruší v okamžiku, kdy úloha opustí stav QUEUED a začne se provádět +(`rateLimitManager.ts`, `wrappedFn`). Požadavek, který tento limit překročí, se +nikdy nedostane k upstreamu. Výchozí hodnota je 30000ms, poskytovaná konstantou +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` v `src/lib/resilience/settings.ts` a pevně +ověřovaná testem `tests/unit/ratelimit-admission-control-6593.test.ts`, takže +její změna způsobí selhání tohoto testu, místo aby tento odstavec potichu zastaral. + +`resilienceSettings.requestQueue.executionMaxWaitMs` je hodnota, kterou Bottleneck +obdrží jako `expiration` úlohy; její časovač se spustí až po odeslání ke zpracování. +Slouží jako pojistka pro exekutory bez vlastního timeoutu upstreamu a zvýší se na +vlastní timeout exekutoru od zahájení požadavku fetch, pokud je tento timeout delší, +takže nemůže přerušit zdravou právě probíhající odpověď. Výchozí hodnota je +600000ms (10 min). + +Předávání rozpočtu fronty do `expiration` dříve ukončovalo neinkrementální +brány uprostřed zpracování — ty mohou oprávněně běžet několik minut, než dorazí +první bajty — a proto je vypršení platnosti hlášeno jako `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), zatímco rozpočet fronty používá kód +timeoutu fronty. Obě hodnoty lze přepsat pomocí `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (proměnné prostředí) nebo na řídicím panelu +(**Nastavení → Odolnost**). Při normalizaci jsou obě omezeny na rozsah 1ms–24h. + +**Priorita pro obě hodnoty:** proměnná prostředí poskytuje pouze _výchozí_ +hodnotu. Hodnota uložená v `resilienceSettings.requestQueue` (řídicí panel / +API patch, uložená v `key_value`) má přednost a hodnota +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` pro konkrétní připojení +má přednost i před ní. Nastavení proměnné prostředí v nasazení, které již má +uloženou hodnotu, proto nic nezmění — místo toho uložené nastavení vymažte nebo +aktualizujte. + +Doba pobytu ve frontě je omezena hodnotou `maxWaitMs`; níže uvedená hodnota +`maxQueueDepth` omezuje, kolik volajících může být ve frontě současně. **`maxQueueDepth` — volitelný limit přijímání (novinka).** `resilienceSettings.requestQueue.maxQueueDepth` -omezuje počet požadavků, které mohou současně čekat ve frontě (dosud neodeslané) pro jednu -kombinaci poskytovatele a připojení. Pokud již fronta obsahuje `maxQueueDepth` -požadavků, nový požadavek je rychle odmítnut typovanou chybou -`code: "RATE_LIMIT_QUEUE_FULL"` **ještě předtím**, než se dostane k `limiter.schedule()` -— odmítnutí je proto nenákladné a nastane před jakoukoli navazující -kompresí / překladem promptu pro daný požadavek. Výchozí hodnota `0` = -vypnuto, čímž se zachovává stávající chování neomezené fronty; povolený rozsah je 0–100000. -Hodnotu lze přepsat pomocí `RATE_LIMIT_MAX_QUEUE_DEPTH` (proměnná prostředí) nebo -`resilienceSettings.requestQueue.maxQueueDepth` (oprava přes ovládací panel/API). +omezuje počet požadavků, které mohou současně čekat ve frontě (dosud nebyly +odeslány ke zpracování) pro jednu kombinaci poskytovatele a připojení. Pokud +fronta již obsahuje `maxQueueDepth` požadavků, nový požadavek je rychle odmítnut +typovanou chybou `code: "RATE_LIMIT_QUEUE_FULL"` **dříve**, než se vůbec dostane +k `limiter.schedule()` — odmítnutí je tedy levné a proběhne před jakoukoli +následnou kompresí / překladem promptu pro daný požadavek. Výchozí hodnota `0` = +vypnuto, čímž se zachovává dosavadní chování neomezené fronty; povolený rozsah +je 0–100000. Hodnotu lze přepsat pomocí `RATE_LIMIT_MAX_QUEUE_DEPTH` (proměnná +prostředí) nebo `resilienceSettings.requestQueue.maxQueueDepth` (řídicí +panel/API patch). Samotná kontrola přijetí je čistá funkce (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), takže ji lze jednotkově testovat bez skutečného limiteru Bottleneck. -> RFC, které otevřelo #6593, rovněž navrhlo příznak `bypassCompressionOnRateLimit`. -> Pipeline `open-sse/services/compression/` v tomto repozitáři provádí +> RFC, které otevřelo #6593, také navrhovalo příznak `bypassCompressionOnRateLimit`. +> Pipeline `open-sse/services/compression/` v tomto repozitáři zajišťuje > kompresi promptu/kontextu odchozího požadavku na LLM (`chatCore.ts`, > v okolí bloku `resolveCompressionSettings`/`selectCompressionStrategy`), -> nikoli kompresi HTTP odpovědí pro syntetizovaná těla odpovědí 429 — pro doslovný -> příznak obcházení neexistuje odpovídající cesta v kódu. Tento krok komprese promptu -> navíc v pipeline požadavků aktuálně probíhá _před_ `withRateLimit()`, takže -> změna pořadí za účelem jeho přeskočení při odmítnutí kvůli plné frontě představuje samostatnou a rozsáhlejší -> změnu, než je rozsah tohoto problému; zde **záměrně** nebyla implementována -> a zůstává jako následný úkol pro případ, že úspora CPU převáží nad -> rizikem změny pořadí. +> nikoli kompresi HTTP odpovědí pro syntetizovaná těla 429 — pro doslovný +> příznak obcházení neexistuje odpovídající cesta kódu. Tento krok komprese promptu +> navíc v pipeline požadavku aktuálně probíhá _před_ `withRateLimit()`, takže +> změna pořadí za účelem jeho přeskočení při odmítnutí kvůli plné frontě je +> samostatná, rozsáhlejší změna nad rámec tohoto issue; zde **záměrně nebyla** +> implementována a zůstává jako navazující úkol, pokud přínos úspory CPU převáží +> nad rizikem změny pořadí. --- diff --git a/docs/i18n/cs/docs/architecture/admission-lanes.md b/docs/i18n/cs/docs/architecture/admission-lanes.md index bc692b0c0ea6..77833fa35224 100644 --- a/docs/i18n/cs/docs/architecture/admission-lanes.md +++ b/docs/i18n/cs/docs/architecture/admission-lanes.md @@ -9,46 +9,50 @@ doplňují; provozovatelé by měli vědět, na který z nich se dívají. ## 1. Přijímání na úrovni bajtů pro celý proces (`chatBodyAdmission.ts`) -- **Rozsah působnosti:** cesta zpracování těla ukládaného do vyrovnávací paměti / haldy pro `POST /v1/chat/completions`, +- **Rozsah:** cesta využívající tělo požadavku uložené ve vyrovnávací paměti / haldu pro `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` a další trasy ve formátu chatu. Chrání - před znásobením využití haldy způsobeným velkými těly požadavků kódovacích agentů (#4380). -- **Jeden globální řadič pro celý proces, nikoli dráhy pro jednotlivé klíče (#10110).** Každý API klíč - (hashovaný) nebo relace `anonymous` se přijímá v rámci **stejného** sdíleného rozpočtu — - hashované ID relace se používá POUZE jako plánovací klíč pro spravedlivé rozdělování (odesílání - čekajících metodou round-robin), nikdy jako oddíl kapacity. Předchozí verze této - dokumentace popisovala dráhy pro jednotlivé klíče s nezávislou kapacitou; tento model byl - v #10110 odstraněn, protože umožňoval neověřeným falešným přihlašovacím údajům násobit - limit platný pro celý proces. + před nadměrným zatížením haldy způsobeným velkými těly požadavků programovacích agentů (#4380). +- **Jeden globální řadič pro celý proces, nikoli fronty pro jednotlivé klíče (#10110).** Každý klíč API + (hashovaný) nebo relace `anonymous` je přijímána v rámci **stejného** sdíleného rozpočtu — + hashované ID relace se používá POUZE jako klíč pro spravedlivé plánování (obsluha čekajících + metodou round-robin), nikdy jako oddělená kapacitní část. Předchozí verze tohoto + dokumentu popisovala fronty pro jednotlivé klíče s nezávislou kapacitou; tento model byl + v #10110 odstraněn, protože neověřené falešné přihlašovací údaje umožňovaly + znásobit limit pro celý proces. - **Brána (#503-fanout): automaticky odvozený BAJTOVÝ rozpočet pro příjem, nikoli pevný počet - požadavků.** Starší limit počtu požadavků `CHAT_MAX_HEAVY_IN_FLIGHT` (před touto opravou - ve výchozím nastavení `1`) omezoval větvení kódovacích agentů (více podřízených agentů / CLI, - těla běžně > 256 KB) na efektivní souběžnost ~1, což při zcela běžném zatížení - vedlo k odpovědím 503. Nyní se uplatní pouze tehdy, když provozovatel explicitně nastaví - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Pokud není nastavena, je přijímání místo toho - řízeno pomocí `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — rozpočtu automaticky odvozeného od + požadavků.** Původní limit počtu požadavků `CHAT_MAX_HEAVY_IN_FLIGHT` (před + touto opravou byla výchozí hodnota `1`) omezoval fan-out programovacích agentů (více subagentů/CLI, + těla běžně > 256 KB) na efektivní souběžnost ~1, což při zcela + běžném zatížení vedlo k odpovědím 503. Nyní se uplatní pouze tehdy, když operátor explicitně + nastaví `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Pokud není nastavena, řídí se přijímání + místo toho pomocí `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — rozpočtu automaticky odvozeného ze skutečného paměťového limitu procesu (`src/shared/middleware/admissionBudget.ts`): 25 % z přísnějšího limitu mezi limitem haldy V8 a případným limitem cgroup/kontejneru, - vydělených osminásobným faktorem přechodného znásobení, s omezením na rozsah od 8 MiB do - 2 GiB. Explicitní přepsání používají stejná omezení. Tím se rozpočet bez ladění - proměnných prostředí sám škáluje od kontejneru s 512 MB až po stolní počítač s 32 GB. Tělo, které se + vydělených faktorem 8 pro přechodné navýšení využití paměti, s omezením do rozsahu 8 MiB až + 2 GiB. Explicitní přepsání používají stejná omezení. Rozpočet se automaticky škáluje od + kontejneru s 512 MB až po stolní počítač s 32 GB bez nutnosti ladění proměnných prostředí. Tělo, které se nevejde do efektivního rozpočtu, okamžitě selže s `413 body_exceeds_budget`; - do omezené spravedlivé fronty vstupuje pouze soupeření mezi těly, z nichž každé lze samostatně - obsloužit. Průběžný nástroj pro sledování tlaku na prostředky pomocí více signálů (poměr haldy V8, + pouze soupeření mezi těly, která lze samostatně obsloužit, vstupuje do omezené + spravedlivé fronty. Živý nástroj pro sledování tlaku na prostředky využívající více signálů (poměr využití haldy V8, cgroup, PSI, události OOM — `open-sse/utils/resourcePressurePolicy.ts`) zkracuje - omezenou dobu čekání při tlaku `high` a při tlaku `critical` okamžitě odmítá požadavky pomocí - `503 resource_pressure`, ještě před přijetím jakýchkoli bajtů. + omezenou dobu čekání při `high` tlaku a při `critical` tlaku požadavky okamžitě odmítá + pomocí `503 resource_pressure`, ještě před přijetím jakýchkoli bajtů. + PSI se čte z `memory.pressure` cgroup této jednotky, pokud je k dispozici + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` platí + pro celý hostitelský systém a používá se pouze jako záložní zdroj na fyzickém serveru / cgroup v1, takže hostitelský + systém využívající swap nemůže způsobit odpověď 503 u nečinného kontejneru. - **Ladění:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — přepsání automaticky odvozeného bajtového rozpočtu - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — starší limit počtu požadavků, pouze po explicitním zapnutí - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — čekání ve frontě před odpovědí 503 (výchozí hodnota 2000) + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — původní limit počtu požadavků, pouze volitelný + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — doba čekání ve frontě před odpovědí 503 (výchozí hodnota 2000) - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — pojistka haldy podle počtu bajtů ve frontě (výchozí hodnota 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — zastaralé - volby bez účinku od #10110 (přijímané kvůli kompatibilitě konfigurace, ale ignorované) + volby bez účinku od #10110 (přijímají se kvůli kompatibilitě konfigurace, ale ignorují se) - **Hlášení:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — včetně doplnění z #503-fanout: `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` a `countCapEnabled` - (ve výchozím nasazení false — potvrzuje, že se skutečně uplatňuje bajtový rozpočet, - nikoli starší limit počtu požadavků). + (ve výchozím nasazení false — potvrzuje, že skutečně omezujícím prvkem je bajtový rozpočet, + nikoli původní limit počtu požadavků). ## 2. Adaptivní virtuální pruhy za běhu (`open-sse/services/admission`) diff --git a/docs/i18n/cs/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/cs/docs/frameworks/EMBEDDED-SERVICES.md index b06afd959f6e..e3decf73829d 100644 --- a/docs/i18n/cs/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/cs/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Verze:** v3.8.44 -> **Poslední aktualizace:** 2026-07-03 -> **Cílová skupina:** Vývojáři, kteří přidávají, udržují nebo ladí vestavěné služby (9Router, CLIProxyAPI, Mux, Bifrost). +> **Poslední aktualizace:** 2026-09-09 +> **Cílová skupina:** Technici, kteří přidávají, udržují nebo ladí vložené služby (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Vestavěné služby jsou lokálně nainstalované doprovodné procesní nástroje, které OmniRoute instaluje, spravuje a -zpřístupňuje jako plnohodnotné cíle směrování. Na rozdíl od externích poskytovatelů (ke kterým se přistupuje přes internet -pomocí klíčů API) běží vestavěné služby na stejném počítači jako OmniRoute a komunikují přes rozhraní loopback. +Vložené služby jsou lokálně instalované pomocné procesní nástroje, které OmniRoute instaluje, monitoruje a +zpřístupňuje jako plnohodnotné cíle směrování. Na rozdíl od externích poskytovatelů (kteří jsou dostupní přes internet +pomocí klíčů API) běží vložené služby na stejném počítači jako OmniRoute a komunikují přes rozhraní loopback. --- @@ -29,35 +29,36 @@ pomocí klíčů API) běží vestavěné služby na stejném počítači jako O ## 1. Přehled -### Proč vestavěné služby? +### Proč integrované služby? -Vestavěno je pět služeb: +Je integrováno šest služeb: -| Služba | Balíček npm | Výchozí port | Účel | -| --------------- | ----------------------------------------------- | :----------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | Směrovač AI, který může OmniRoute používat jako dílčího poskytovatele. Modely jsou zpřístupněny jako `9router/{sub}/{model}` | -| **CLIProxyAPI** | Binární soubor z vydání na GitHubu (`cliproxy`) | 8317 | Lokální proxy adaptér pro autentizační toky CLI Anthropic. Poskytuje záložní směrování po vypršení platnosti tokenů OAuth | -| **Mux** | `mux` (bezobslužný `mux server`) | 8322 | Lokální démon pro orchestraci agentů (coder/mux). Pouze správa životního cyklu — nejde o cíl směrování (bez proxy LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend přenosové brány AI v jazyce Go. Pokud je spuštěný, je automaticky vybrán trasou přenosu (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Proxy předplatného Claude — alternativa/záloha k CLIProxyAPI pro provoz ve formátu Claude Code; vložený klíč se stane `DARIO_ADMIN_TOKEN`, který řídí přístup k jeho řídicí vrstvě OAuth `/admin/*` | +| Služba | npm balíček | Výchozí port | Účel | +| --------------- | ----------------------------------------------- | :----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI router, který může OmniRoute používat jako dílčího poskytovatele. Modely jsou zpřístupněny ve tvaru `9router/{sub}/{model}` | +| **CLIProxyAPI** | Binární soubor z GitHub release (`cliproxy`) | 8317 | Lokální proxy adaptér pro ověřovací toky Anthropic CLI. Poskytuje záložní směrování po vypršení platnosti tokenů OAuth | +| **Mux** | `mux` (bez uživatelského rozhraní `mux server`) | 8322 | Lokální démon pro orchestraci agentů (coder/mux). Pouze správa životního cyklu — není cílem směrování (bez proxy přenosu LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend přenosové AI brány v jazyce Go. Je-li spuštěn, je automaticky vybrán přenosovou trasou (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Proxy pro předplatné Claude — alternativa/záloha ke CLIProxyAPI pro provoz ve formátu Claude Code; vložený klíč se stává `DARIO_ADMIN_TOKEN`, který chrání jeho řídicí rovinu OAuth `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Automatizace WhatsApp Web (bez uživatelského rozhraní, Chromium prostřednictvím Puppeteer). Pouze správa životního cyklu — není cílem směrování. | -Všech pět používá stejný model dohledu: +Všech šest používá stejný model dohledu: -- OmniRoute je instaluje do `DATA_DIR/services/{name}/` (odděleně od vlastního souboru `package.json` služby OmniRoute) +- OmniRoute je instaluje do `DATA_DIR/services/{name}/` (izolovaně od vlastního souboru `package.json` OmniRoute) - OmniRoute je spouští a monitoruje jako podřízené procesy -- OmniRoute vkládá do prostředí podřízeného procesu dočasný klíč API a obměňuje jej bez odstávky (kde je to možné) -- Všechny řídicí trasy (`/api/services/*`) jsou **LOCAL_ONLY** — přístupné pouze z rozhraní loopback (pevné pravidlo č. 17) +- OmniRoute vkládá do prostředí podřízeného procesu dočasný klíč API a obměňuje jej bez výpadku (kde je to relevantní) +- Všechny trasy pro správu (`/api/services/*`) jsou **LOCAL_ONLY** — přístupné pouze z loopback rozhraní (pevné pravidlo č. 17) ### Klíčová rozhodnutí (z návrhového plánu) -| Rozhodnutí | Hodnota | -| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | -| Přístup řídicího panelu k nativnímu uživatelskému rozhraní 9Router | Reverzní proxy na `/dashboard/providers/services/9router/embed/*` | -| Mechanismus instalace | `npm install {package}` prostřednictvím `execFile` (bez interpolace shellu) | -| Režim využití | Poskytovatel zaregistrovaný ve směrovacím modulu jako `9router/{sub}/{model}` | -| Správa klíčů API | OmniRoute je generuje, šifruje při uložení (AES-256-GCM) a vkládá prostřednictvím proměnných prostředí | -| Umístění v řídicím panelu | `/dashboard/providers/services` (tři karty) | -| Automatické spuštění | Přepínač pro každou službu, ve výchozím nastavení VYPNUTO | +| Rozhodnutí | Hodnota | +| ----------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| Přístup dashboardu k nativnímu UI 9Router | Reverzní proxy na `/dashboard/providers/services/9router/embed/*` | +| Mechanismus instalace | `npm install {package}` prostřednictvím `execFile` (bez interpolace shellu) | +| Režim použití | Poskytovatel registrován jako `9router/{sub}/{model}` ve směrovacím enginu | +| Správa klíčů API | OmniRoute je generuje, šifruje při uložení (AES-256-GCM) a vkládá prostřednictvím proměnných prostředí | +| Umístění dashboardu | `/dashboard/providers/services` (tři karty) | +| Automatické spuštění | Přepínač pro každou službu, ve výchozím nastavení VYPNUTO | --- @@ -67,10 +68,10 @@ Všech pět používá stejný model dohledu: ┌────────────────────────────────────────────────────────────────────┐ │ Vrstva 1 — UI │ │ /dashboard/providers/services (karty: CLIProxyAPI | 9Router | Mux)│ -│ Živé logy (SSE), Spustit/Zastavit/Restartovat/Aktualizovat, Nastavení, Instalace│ +│ Živé protokoly (SSE), Spustit/Zastavit/Restartovat/Aktualizovat, Nastavení, Instalace│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Obálka + směrování karet pomocí ?tab=│ +│ ├── page.tsx Rámec + směrování karet podle ?tab= │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -87,9 +88,9 @@ Všech pět používá stejný model dohledu: │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (reverzní proxy HTTP + WebSocket → upstream 9Router) │ +│ (reverzní HTTP + WebSocket proxy → upstream 9Router) │ │ │ -│ Brána: LOCAL_ONLY_API_PREFIXES obsahuje "/api/services/" a │ +│ Brána: LOCAL_ONLY_API_PREFIXES zahrnuje "/api/services/" a │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ volání v rámci procesu @@ -97,62 +98,63 @@ Všech pět používá stejný model dohledu: │ Vrstva 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Obecný správce (child_process.spawn) │ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 20130 pro 9Router (konfigurovatelný) │ -│ ├── logs: kruhový buffer stdio o velikosti 5 MB → události SSE│ -│ ├── health: HTTP GET /health každé 2–5 s, líné zotavení │ -│ └── lifecycle: SIGTERM 15 s → SIGKILL │ +│ ├── instalace: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── spuštění: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── klíč API: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── port: 20130 pro 9Router (konfigurovatelný) │ +│ ├── protokoly: kruhová vyrovnávací paměť stdio 5 MB → události SSE│ +│ ├── stav: HTTP GET /health každé 2–5 s, opožděné zotavení│ +│ └── životní cyklus: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Inicializuje všechny SERVICES[] při spuštění procesu│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts Pravidelné GET /v1/models → tabulka service_models│ -│ ringBuffer.ts Kruhový buffer logů (5 MB na službu) │ -│ healthCheck.ts Pravidelná HTTP kontrola stavu │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (adaptéry instalátorů) │ +│ modelSync.ts Pravidelný GET /v1/models → tabulka service_models│ +│ ringBuffer.ts Kruhová vyrovnávací paměť protokolů (5 MB na službu)│ +│ healthCheck.ts Pravidelná kontrola stavu přes HTTP │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (instalační adaptéry) │ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP kompatibilní s OpenAI (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Vrstva 4 — Poskytovatel / Směrování │ +│ Vrstva 4 — Poskytovatel / směrování │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Pro každý požadavek znovu načte port a klíč API (bez mezipaměti).│ -│ Před předáním požadavku odstraní z ID modelu předponu "9router/".│ +│ Pro každý požadavek znovu vyhledá port a klíč API (bez mezipaměti).│ +│ Před předáním proxy odstraní z ID modelu prefix "9router/". │ │ Vrátí 503 service_not_running, pokud správce není ve stavu "running".│ │ │ │ src/shared/constants/providers.ts │ │ Záznam pro "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ Modely jsou uloženy jako "9router/{sub}/{model}" (s předponou). │ -│ Synchronizace probíhá každých 5 min pomocí modelSync.ts. │ +│ Modely jsou uloženy jako "9router/{sub}/{model}" (s prefixem). │ +│ Synchronizace každých 5 min pomocí modelSync.ts. │ │ │ -│ Mux má spravovaný POUZE životní cyklus (vrstvy 1–3) — jde o démona│ -│ pro orchestraci agentů, nikoli proxy LLM, takže nemá exekutor ani │ -│ záznam poskytovatele ve vrstvě 4 a nikdy není cílem směrování. │ +│ Mux má spravován POUZE životní cyklus (vrstvy 1–3) — jde o démona │ +│ pro orchestraci agentů, nikoli LLM proxy, takže nemá executor ani │ +│ záznam poskytovatele ve vrstvě 4 a nikdy není cílem směrování. │ └────────────────────────────────────────────────────────────────────┘ ``` ### Klíčové zdrojové soubory -| Soubor | Role | -| ------------------------------------------- | ------------------------------------------------------------ | -| `src/lib/services/ServiceSupervisor.ts` | Základní třída: životní cyklus, zámek, stav, kruhový buffer | -| `src/lib/services/bootstrap.ts` | Registrace na úrovni procesu a automatické spuštění | -| `src/lib/services/registry.ts` | Singletonová mapa `nástroj → správce` | -| `src/lib/services/apiKey.ts` | Generování klíčů, šifrování AES-256-GCM pro uložená data | -| `src/lib/services/modelSync.ts` | Pravidelná synchronizace modelů (5 min) + na vyžádání | -| `src/lib/services/ringBuffer.ts` | Kruhový buffer protokolů o velikosti 5 MB s odběrem přes SSE | -| `src/lib/services/healthCheck.ts` | HTTP kontrola stavu (nastavitelný interval) | -| `src/lib/services/installers/ninerouter.ts` | Instalace/aktualizace/odinstalace 9Router přes npm | -| `src/lib/services/installers/cliproxy.ts` | Instalace/aktualizace/odinstalace CLIProxyAPI přes npm | -| `src/lib/services/installers/mux.ts` | Instalace/aktualizace/odinstalace Mux přes npm | -| `src/app/api/services/9router/_lib.ts` | Pomocná funkce `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Sdílený koncový bod SSE pro protokoly | -| `open-sse/executors/ninerouter.ts` | Vykonavatel poskytovatele (vrstva 4) | +| Soubor | Role | +| ------------------------------------------- | ---------------------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Základní třída: životní cyklus, zámek, stav, kruhová vyrovnávací paměť | +| `src/lib/services/bootstrap.ts` | Registrace na úrovni procesu a automatické spuštění | +| `src/lib/services/registry.ts` | Singleton mapa `nástroj → supervisor` | +| `src/lib/services/apiKey.ts` | Generování klíčů, šifrování AES-256-GCM pro data v úložišti | +| `src/lib/services/modelSync.ts` | Pravidelná synchronizace modelů (5 min) + na vyžádání | +| `src/lib/services/ringBuffer.ts` | Kruhová vyrovnávací paměť protokolů o velikosti 5 MB s odběrem SSE | +| `src/lib/services/healthCheck.ts` | HTTP kontrola stavu (konfigurovatelný interval) | +| `src/lib/services/installers/ninerouter.ts` | Instalace/aktualizace/odinstalace balíčku 9Router pomocí npm | +| `src/lib/services/installers/cliproxy.ts` | Instalace/aktualizace/odinstalace balíčku CLIProxyAPI pomocí npm | +| `src/lib/services/installers/mux.ts` | Instalace/aktualizace/odinstalace balíčku Mux pomocí npm | +| `src/lib/services/installers/openwa.ts` | Instalace/aktualizace/odinstalace balíčku open-wa pomocí npm | +| `src/app/api/services/9router/_lib.ts` | Pomocná funkce `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | Sdílený koncový bod SSE pro protokoly | +| `open-sse/executors/ninerouter.ts` | Exekutor poskytovatele (vrstva 4) | --- @@ -210,14 +212,14 @@ v uživatelském rozhraní aktivují současně. ## 4. Referenční dokumentace API Všechny trasy pod `/api/services/` jsou **LOCAL_ONLY** (pouze loopback, pevné pravidlo č. 17). -Požadavky mimo loopback obdrží `403 LOCAL_ONLY` bez ohledu na ověřovací token. +Požadavky, které nejsou z loopbacku, obdrží `403 LOCAL_ONLY` bez ohledu na ověřovací token. -### 4.1 Koncové body 9Router (11 tras) +### 4.1 Endpointy 9Routeru (11 tras) #### `POST /api/services/9router/install` -Nainstaluje 9Router z npm. Vytvoří `DATA_DIR/services/9router/` s vlastním -`package.json` a `node_modules/`. Nedochází ke konfliktu s vlastními závislostmi OmniRoute. +Nainstaluje 9Router z npm. Vytvoří `DATA_DIR/services/9router/` s vlastními soubory +`package.json` a `node_modules/`. Není v konfliktu s vlastními závislostmi OmniRoute. **Tělo požadavku** (vše volitelné): @@ -227,26 +229,26 @@ Nainstaluje 9Router z npm. Vytvoří `DATA_DIR/services/9router/` s vlastním | Pole | Typ | Výchozí | Popis | | --------- | -------- | ---------- | ---------------------------------------- | -| `version` | `string` | `"latest"` | značka verze npm nebo semver k instalaci | +| `version` | `string` | `"latest"` | Značka verze npm nebo semver k instalaci | **Odpovědi:** -| Stav | Popis | -| ----- | ------------------------------------------------------------------------ | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Neplatné tělo požadavku (selhání validace Zod) | -| `409` | Instalace již probíhá (zámek je držen) | -| `500` | Instalace npm selhala — uživatelsky přívětivou chybu najdete v `message` | +| Stav | Popis | +| ----- | -------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Neplatné tělo požadavku (selhání validace Zod) | +| `409` | Instalace již probíhá (zámek je držen) | +| `500` | Instalace npm selhala — uživatelsky přívětivou chybu naleznete v `message` | **Poznámky:** Používá `execFile('npm', [...])` — bez shellu a bez interpolace (pevné pravidlo č. 13). -Chyby EACCES se zobrazují jako uživatelsky přívětivé zprávy. +Chyby EACCES jsou prezentovány jako uživatelsky přívětivé zprávy. --- #### `POST /api/services/9router/start` -Spustí 9Router. Pokud supervisor ještě není zaregistrován, zaregistruje jej a poté -zavolá `supervisor.start()`. Pokud již služba běží, je operace idempotentní. +Spustí 9Router. Pokud ještě není zaregistrován správce, zaregistruje jej a poté zavolá +`supervisor.start()`. Pokud již služba běží, je operace idempotentní. **Tělo požadavku:** žádné @@ -276,23 +278,23 @@ zavolá `supervisor.start()`. Pokud již služba běží, je operace idempotentn #### `POST /api/services/9router/stop` -Řádně zastaví 9Router. Odešle SIGTERM, počká 15 s a poté odešle SIGKILL, pokud proces stále běží. +Korektně zastaví 9Router. Odešle SIGTERM, počká 15 s a poté odešle SIGKILL, pokud proces stále běží. Pokud je služba již zastavena, je operace idempotentní. **Tělo požadavku:** žádné **Odpovědi:** -| Stav | Popis | -| ----- | ----------------------------------- | -| `200` | `ServiceStatus` (stav: `"stopped"`) | -| `503` | Zastavení neočekávaně selhalo | +| Stav | Popis | +| ----- | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Zastavení neočekávaně selhalo | --- #### `POST /api/services/9router/restart` -Ekvivalent volání `stop()` následovaného `start()` pod zámkem operací. +Odpovídá volání `stop()` a následně `start()` pod zámkem operace. **Tělo požadavku:** žádné @@ -303,8 +305,8 @@ Ekvivalent volání `stop()` následovaného `start()` pod zámkem operací. #### `POST /api/services/9router/update` Aktualizuje 9Router na novější verzi npm. Pokud služba běží, nejprve se zastaví, -poté se spustí instalace npm (novější verze se nainstaluje na stejné místo) a následně -se služba restartuje. +poté se spustí instalace npm (novější verze se nainstaluje na stejné místo) +a služba se následně restartuje. **Tělo požadavku** (vše volitelné): @@ -324,8 +326,8 @@ se služba restartuje. #### `POST /api/services/9router/rotate-key` -Vygeneruje nový API klíč pro 9Router, zašifruje jej v úložišti a restartuje službu -(pokud je spuštěna), aby načetla nový klíč ze svého prostředí. Platnost starého klíče +Vygeneruje nový klíč API pro 9Router, zašifruje jej pro uložení a restartuje službu +(pokud běží), aby nový klíč načetla ze svého prostředí. Platnost starého klíče je okamžitě zrušena. **Tělo požadavku:** žádné @@ -335,23 +337,23 @@ je okamžitě zrušena. | Stav | Popis | | ----- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Rotace se nezdařila | +| `500` | Rotace selhala | -**Zabezpečení:** Nový klíč není nikdy vrácen v odpovědi (nedojde k úniku přihlašovacích údajů). +**Zabezpečení:** Nový klíč se v odpovědi nikdy nevrací (nedochází k úniku přihlašovacích údajů). Je uložen v zašifrované podobě (AES-256-GCM) v tabulce `version_manager`. --- #### `GET /api/services/9router/status` -Vrací kombinovaný aktuální stav a stav z DB, včetně metadat verze a náhledu API klíče. +Vrací kombinovaný aktuální stav a stav z DB, včetně metadat verze a náhledu klíče API. **Odpovědi:** -| Stav | Popis | -| ----- | -------------------------- | -| `200` | Viz schéma níže | -| `500` | Načtení stavu se nezdařilo | +| Stav | Popis | +| ----- | ------------------- | +| `200` | Viz schéma níže | +| `500` | Čtení stavu selhalo | **Schéma odpovědi:** @@ -377,8 +379,8 @@ Vrací kombinovaný aktuální stav a stav z DB, včetně metadat verze a náhle #### `POST /api/services/9router/auto-start` -Přepne příznak automatického spuštění. Když je `enabled: true`, služba se automaticky -spustí při příštím spuštění OmniRoute (pokud je služba nainstalována). +Přepne příznak automatického spuštění. Když je `enabled: true`, služba se automaticky spustí +při příštím spuštění OmniRoute (pokud je služba nainstalována). **Tělo požadavku:** @@ -397,22 +399,22 @@ spustí při příštím spuštění OmniRoute (pokud je služba nainstalována) #### `GET /api/services/9router/logs` -SSE stream aktuálních protokolů z kruhové vyrovnávací paměti stdout/stderr služby 9Router. +SSE stream živých protokolů z kruhové vyrovnávací paměti stdout/stderr služby 9Router. **Parametry dotazu:** -| Parametr | Typ | Výchozí hodnota | Popis | -| -------- | --------- | --------------- | ----------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Počet historických řádků, které se mají odeslat jako první (max. 1000) | -| `filter` | `string` | žádný | Filtr podřetězce bez rozlišení velikosti písmen (bez regexu — bezpečné proti ReDoS) | +| Parametr | Typ | Výchozí | Popis | +| -------- | --------- | ------- | -------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Počet historických řádků, které se mají odeslat jako první (max. 1000) | +| `filter` | `string` | žádný | Filtr podřetězce bez rozlišení velikosti písmen (bez regexu — odolný vůči ReDoS) | **Události SSE:** -| Událost | Data | Popis | -| ----------- | ----------- | ----------------------------------- | -| `snapshot` | `LogLine[]` | Počáteční konec historického výpisu | -| `log` | `LogLine` | Aktuální řádek protokolu | -| `heartbeat` | `{}` | Udržovací signál každých 15 s | +| Událost | Data | Popis | +| ----------- | ----------- | ------------------------------ | +| `snapshot` | `LogLine[]` | Počáteční konec historie | +| `log` | `LogLine` | Řádek živého protokolu | +| `heartbeat` | `{}` | Udržování spojení každých 15 s | **Schéma LogLine:** @@ -436,81 +438,119 @@ SSE stream aktuálních protokolů z kruhové vyrovnávací paměti stdout/stder ### 4.2 Koncové body CLIProxyAPI (10 tras) -CLIProxyAPI má stejnou strukturu koncových bodů jako 9Router, ale bez `rotate-key`; navíc má -`accounts`, `provider-expose` a `auto-restart-adopted`. Nyní dostává -vyhrazený API klíč datové vrstvy vložený při spuštění (`needsApiKey: true` v -`bootstrap.ts`, používá se k synchronizaci modelů); `status` obsahuje méně polí. - -| Metoda | Cesta | Popis | -| ------ | ----------------------------------- | ---------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Nainstaluje CLIProxyAPI z npm | -| `POST` | `/api/services/cliproxy/start` | Spustí CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Zastaví CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Restartuje CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Aktualizuje na novější verzi | -| `GET` | `/api/services/cliproxy/status` | Aktuální stav + stav z DB (bez `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Přepne automatické spuštění | +CLIProxyAPI má stejnou strukturu koncových bodů jako 9Router, avšak bez `rotate-key` +a navíc s `accounts`, `provider-expose` a `auto-restart-adopted`. Nyní při spuštění +dostává vyhrazený klíč API datové roviny (`needsApiKey: true` v +`bootstrap.ts`, používaný k synchronizaci modelů); `status` obsahuje méně polí. + +| Metoda | Cesta | Popis | +| ------ | ----------------------------------- | -------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Nainstalovat CLIProxyAPI z npm | +| `POST` | `/api/services/cliproxy/start` | Spustit CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Zastavit CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Restartovat CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Aktualizovat na novější verzi | +| `GET` | `/api/services/cliproxy/status` | Aktuální stav + stav DB (bez `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Přepnout automatické spouštění | Sdílený koncový bod `GET /api/services/{name}/logs` (viz §4.1) funguje pro všechny -čtyři služby a používá dynamický segment `[name]`. +čtyři služby pomocí dynamického segmentu `[name]`. --- ### 4.3 Koncové body Mux (8 tras) -Mux má stejnou strukturu koncových bodů jako CLIProxyAPI — v rozhraní API nemá trasu -`rotate-key` (nosný token se generuje stejným způsobem jako u 9Router prostřednictvím -`getOrCreateApiKey("mux")` a vkládá se pomocí proměnné prostředí `MUX_SERVER_AUTH_TOKEN`, ale -zatím pro něj neexistuje vyhrazený koncový bod pro rotaci). U Mux se spravuje pouze životní cyklus: -na rozdíl od 9Router nemá executor vrstvy 4 a nikdy není registrován jako poskytovatel směrování. +Mux má stejnou strukturu koncových bodů jako CLIProxyAPI — na povrchu API není trasa +`rotate-key` (bearer token se generuje stejným způsobem jako u 9Router prostřednictvím +`getOrCreateApiKey("mux")` a předává se pomocí proměnné prostředí `MUX_SERVER_AUTH_TOKEN`, +ale zatím neexistuje žádný vyhrazený koncový bod pro jeho rotaci). U Mux se spravuje +pouze životní cyklus: na rozdíl od 9Router nemá žádný executor vrstvy 4 a nikdy se +neregistruje jako poskytovatel směrování. -| Metoda | Cesta | Popis | -| ------ | ------------------------------ | ----------------------------------- | -| `POST` | `/api/services/mux/install` | Nainstaluje Mux z npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Spustí Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Zastaví Mux | -| `POST` | `/api/services/mux/restart` | Restartuje Mux | -| `POST` | `/api/services/mux/update` | Aktualizuje na novější verzi npm | -| `GET` | `/api/services/mux/status` | Aktuální stav + stav z DB | -| `POST` | `/api/services/mux/auto-start` | Přepne automatické spuštění | +| Metoda | Cesta | Popis | +| ------ | ------------------------------ | ------------------------------------ | +| `POST` | `/api/services/mux/install` | Nainstalovat Mux z npm (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Spustit Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Zastavit Mux | +| `POST` | `/api/services/mux/restart` | Restartovat Mux | +| `POST` | `/api/services/mux/update` | Aktualizovat na novější verzi npm | +| `GET` | `/api/services/mux/status` | Aktuální stav + stav DB | +| `POST` | `/api/services/mux/auto-start` | Přepnout automatické spouštění | --- ### 4.4 Koncové body Bifrost (8 tras) -Bifrost je backend přenosové brány AI napsaný v Go (`@maximhq/bifrost`). Používá stejnou -strukturu koncových bodů jako CLIProxyAPI (bez `rotate-key` — Bifrost spravuje vlastní klíče -poskytovatelů v souboru `config.json` ve svém adresáři `-app-dir`). +Bifrost je backend přenosové brány AI napsaný v Go (`@maximhq/bifrost`). Používá +stejnou strukturu koncových bodů jako CLIProxyAPI (bez `rotate-key` — Bifrost spravuje +vlastní klíče poskytovatelů v souboru `config.json` ve svém `-app-dir`). -| Metoda | Cesta | Popis | -| ------ | ---------------------------------- | -------------------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Instalace Bifrostu z npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Spuštění Bifrostu na portu 8080 (výchozí) | -| `POST` | `/api/services/bifrost/stop` | Zastavení Bifrostu | -| `POST` | `/api/services/bifrost/restart` | Restartování Bifrostu | -| `POST` | `/api/services/bifrost/update` | Aktualizace na novější verzi | -| `GET` | `/api/services/bifrost/status` | Aktuální stav + stav v DB | -| `POST` | `/api/services/bifrost/auto-start` | Přepnutí automatického spouštění | -| `GET` | `/api/services/bifrost/logs` | Průběžný výpis protokolu přes SSE (pomocí sdílené dynamické trasy `[name]/logs`) | +| Metoda | Cesta | Popis | +| ------ | ---------------------------------- | ----------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Nainstalovat Bifrost z npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Spustit Bifrost na portu 8080 (výchozí hodnota) | +| `POST` | `/api/services/bifrost/stop` | Zastavit Bifrost | +| `POST` | `/api/services/bifrost/restart` | Restartovat Bifrost | +| `POST` | `/api/services/bifrost/update` | Aktualizovat na novější verzi | +| `GET` | `/api/services/bifrost/status` | Aktuální stav + stav DB | +| `POST` | `/api/services/bifrost/auto-start` | Přepnout automatické spouštění | +| `GET` | `/api/services/bifrost/logs` | Konec protokolu přes SSE (pomocí sdílené dynamické trasy `[name]/logs`) | -**Nastavení směrování:** Pokud proměnná `BIFROST_BASE_URL` není nastavena a spravovaná -instance Bifrostu je spuštěná, funkce `getBifrostRoutingConfig()` (v souboru `routingBackend.ts`) automaticky -použije `http://127.0.0.1:{port}` jako základní URL přenosového serveru. Explicitně nastavená proměnná prostředí -`BIFROST_BASE_URL` má vždy přednost. +**Zapojení směrování:** Pokud není nastavena proměnná `BIFROST_BASE_URL` a +spravovaná instance Bifrost běží, funkce `getBifrostRoutingConfig()` (v souboru +`routingBackend.ts`) automaticky použije `http://127.0.0.1:{port}` jako základní URL +přenosové služby. Explicitně nastavená proměnná prostředí `BIFROST_BASE_URL` má vždy +přednost. --- ### 4.5 Koncové body Dario (12 tras) -Stejná struktura životního cyklu jako u ostatních služeb (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`) a navíc řídicí vrstva OAuth -chráněná tokenem pod `admin/`: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (všechny chráněné pomocí `DARIO_ADMIN_TOKEN`). +Stejná struktura životního cyklu jako u ostatních služeb (`install`, `start`, `stop`, +`restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`) plus řídicí +rovina OAuth chráněná tokenem pod `admin/`: `admin/accounts`, +`admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (všechny +chráněné pomocí `DARIO_ADMIN_TOKEN`). -### 4.6 Reverzní proxy (vložený ovládací panel 9Router) +### 4.6 Koncové body open-wa (7 tras) -Ovládací panel vkládá webové uživatelské rozhraní 9Router do prvku iframe prostřednictvím interní -reverzní proxy na adrese: +open-wa (`@open-wa/wa-automate`) ovládá bezhlavou instanci Chromia (prostřednictvím +Puppeteer) za účelem automatizace WhatsApp Web. Používá stejnou strukturu koncových +bodů jako Mux (zatím bez trasy `rotate-key`). Spravuje se pouze jeho životní cyklus +— není cílem směrování a nemá žádný executor vrstvy 4 ani záznam poskytovatele. + +| Metoda | Cesta | Popis | +| ------ | --------------------------------- | --------------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Nainstaluje open-wa z npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Spustí open-wa na portu 8323 (výchozí) | +| `POST` | `/api/services/openwa/stop` | Zastaví open-wa | +| `POST` | `/api/services/openwa/restart` | Restartuje open-wa | +| `POST` | `/api/services/openwa/update` | Aktualizuje na novější verzi | +| `GET` | `/api/services/openwa/status` | Aktuální stav + stav v DB | +| `POST` | `/api/services/openwa/auto-start` | Přepne automatické spouštění | +| `GET` | `/api/services/openwa/logs` | SSE výpis protokolu (prostřednictvím sdílené dynamické trasy `[name]/logs`) | + +**Klíč API:** je vložen jako `WA_KEY` — obecný mechanismus open-wa pro přepsání +pomocí proměnných prostředí s předponou `WA_*` jej mapuje na volbu CLI +`--key`/`-k` (`dist/cli/setup.js::envArgs()`, ověřeno vůči nainstalovanému balíčku +verze 4.76.0). Při vygenerování pomocí `generateServiceApiKey()` je opatřen předponou +`ow_`. open-wa načítá klíč z hlavičky HTTP `key`/`api_key` (nikoli +`Authorization: Bearer`); cesta `/api-docs*` je z kontroly explicitně vyňata +(`setupAuthenticationLayer` v `dist/cli/server.js`), takže kontrola stavu +nepotřebuje autentizační hlavičku. + +**Párování:** open-wa je neoficiální a není přidruženo ke službě WhatsApp — +u připojeného čísla hrozí riziko zablokování kvůli vlastní detekci automatizace +služby WhatsApp. Při prvním spuštění se párovací QR kód vypíše na stdout +a zpřístupní prostřednictvím stávajícího panelu Protokoly / streamu SSE — +v této integraci zatím neexistuje vyhrazený koncový bod pro obrázek QR kódu. + +--- + +### 4.7 Reverzní proxy (vložený dashboard 9Router) + +Dashboard vkládá webové uživatelské rozhraní 9Router do prvku iframe prostřednictvím +interní reverzní proxy na adrese: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -518,18 +558,18 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Tato proxy: -- Předává požadavek na `http://127.0.0.1:{port}/{path}` (pouze místní smyčka) -- Odstraňuje příchozí hlavičky `cookie` a `authorization` (zabrání úniku relace OmniRoute) -- Vkládá hlavičku `Authorization: Bearer {apiKey}` pro ověření 9Router -- Z odpovědi odstraňuje `set-cookie`, `content-security-policy`, `x-frame-options` a `cross-origin-*` +- Předává požadavek na `http://127.0.0.1:{port}/{path}` (pouze loopback) +- Odstraňuje příchozí hlavičky `cookie` a `authorization` (nedochází k úniku relace OmniRoute) +- Vkládá `Authorization: Bearer {apiKey}` pro autentizaci 9Router +- Z odpovědi odstraňuje `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` - Přepisuje odpovědi HTML tak, aby vložila `` a normalizovala absolutní cesty (`/foo` → `/dashboard/.../embed/foo`) -Přechody na protokol WebSocket pro vložený ovládací panel zpracovává doprovodný server na +Upgrady WebSocket pro vložený dashboard zpracovává doprovodný server na vyhrazeném portu (viz `src/lib/services/embedWsProxy.ts`). -**Zabezpečení:** Trasy vložené proxy jsou zařazeny pod `LOCAL_ONLY_API_PREFIXES` -a jsou přístupné pouze z místní smyčky. Útočník, který získá JWT prostřednictvím -tunelu Cloudflare/Ngrok, nemůže proxy využít pro přístup k vloženým službám. +**Zabezpečení:** Trasy vložené proxy jsou klasifikovány pod `LOCAL_ONLY_API_PREFIXES` +a lze k nim přistupovat pouze z loopbacku. Útočník, který získá JWT prostřednictvím +tunelu Cloudflare/Ngrok, nemůže využít proxy pro přístup k vloženým službám. --- diff --git a/docs/i18n/cs/docs/frameworks/MEMORY.md b/docs/i18n/cs/docs/frameworks/MEMORY.md index 47dd505f45ee..4caa504d6ded 100644 --- a/docs/i18n/cs/docs/frameworks/MEMORY.md +++ b/docs/i18n/cs/docs/frameworks/MEMORY.md @@ -167,34 +167,29 @@ Tabulka `memory_vec_meta` (migrace `083_memory_vec.sql`) ukládá: ## Rozšíření nastavení -V `MemorySettingsExtended` v souboru `src/shared/schemas/memory.ts` je k dispozici devět polí pro embeddingy a vektory, která jsou ukládána prostřednictvím `src/lib/db/settings.ts`: - -| Pole | Typ | Výchozí | Popis | -| ------------------------ | -------------------------------------------------- | -------- | --------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Který zdroj embeddingů se má použít | -| `embeddingProviderModel` | `string \| null` | `null` | Poskytovatel/model ve formátu `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | Základní URL endpointu kompatibilního s OpenAI pouze pro Memory | -| `customModelId` | `string \| null` | `null` | ID modelu odesílané vlastnímu endpointu | -| `transformersEnabled` | `boolean` | `false` | Výslovné povolení Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Výslovné povolení lokálního statického modelu potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Povolení kroku přerazení (přidá +200–500 ms/požadavek) | -| `rerankProviderModel` | `string \| null` | `null` | Poskytovatel/model přerazení ve formátu `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Které vektorové úložiště se má použít | - -Tato pole jsou dostupná prostřednictvím `GET /PUT /api/settings/memory` (schéma `MemorySettingsExtendedSchema`). - -Pro zdroj `remote` přijímá Memory také volitelná nastavení `customBaseUrl` a -`customModelId`. Společně vybírají endpoint `/embeddings` kompatibilní s OpenAI -a model, aniž by měnily globální registr embeddingů. Endpoint je před použitím -normalizován a kontrolován zásadami poskytovatele pro odchozí URL: je vyžadován -protokol HTTP(S), vložené přihlašovací údaje a řetězce dotazu jsou odmítnuty -a adresy cloudových metadat zůstávají blokované. Prázdné hodnoty zachovají -vybraného poskytovatele z registru. Chyby vrácené do řídicího panelu jsou -sanitizovány a přihlašovací údaje endpointu se nikdy nezaznamenávají do protokolu. +V `MemorySettingsExtended` v `src/shared/schemas/memory.ts` je k dispozici devět polí pro embeddingy a vektory, která se uchovávají prostřednictvím `src/lib/db/settings.ts`: + +| Pole | Typ | Výchozí hodnota | Popis | +| ------------------------ | -------------------------------------------------- | --------------- | ------------------------------------------------------------------------ | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Který zdroj embeddingů použít | +| `embeddingProviderModel` | `string \| null` | `null` | Poskytovatel/model ve formátu `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | Základní URL endpointu kompatibilního s OpenAI, určeného pouze pro paměť | +| `customModelId` | `string \| null` | `null` | ID modelu odesílané vlastnímu endpointu | +| `transformersEnabled` | `boolean` | `false` | Výslovné povolení Transformers.js (MiniLM, ~400 MB) | +| `staticEnabled` | `boolean` | `false` | Výslovné povolení lokálního statického modelu potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Povolit krok přehodnocení pořadí (přidá +200–500 ms/požadavek) | +| `rerankProviderModel` | `string \| null` | `null` | Poskytovatel/model pro přehodnocení pořadí ve formátu `provider/model` | + +`rerankProviderModel` je vyhodnocován prostřednictvím `POST /v1/rerank` (volaného přes loopback), takže přijímá cokoli, co přijímá tato trasa: vybraný cloudový model pro přehodnocení pořadí (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) nebo uzel poskytovatele kompatibilního s OpenAI ve formátu `/` (např. `skilled-mini/bge-reranker-v2-m3` pro server TEI/Infinity). Uzly na loopbacku jsou vždy způsobilé; uzel na jiném hostiteli (LAN, Tailscale) navíc vyžaduje příznak funkce `RERANK_REMOTE_PROVIDER_NODES` a musí splňovat zásady odchozích URL poskytovatele — viz [Příznaky funkcí](../reference/FEATURE_FLAGS.md). Selektor na řídicím panelu uvádí vybrané poskytovatele a místní uzly; jakýkoli platný řetězec `provider/model` lze nastavit přímo prostřednictvím `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Který vektorový backend použít | + +Tato nastavení jsou zpřístupněna prostřednictvím `GET /PUT /api/settings/memory` (schéma `MemorySettingsExtendedSchema`). + +Pro zdroj `remote` přijímá Memory také volitelná nastavení `customBaseUrl` a `customModelId`. Společně vybírají endpoint `/embeddings` kompatibilní s OpenAI a model, aniž by měnily globální registr embeddingů. Endpoint se před použitím normalizuje a kontroluje podle zásad odchozích URL poskytovatele: je vyžadováno HTTP(S), vložené přihlašovací údaje a řetězce dotazu jsou odmítnuty a adresy metadat cloudových služeb zůstávají blokovány. Prázdné hodnoty zachovají vybraného poskytovatele z registru. Chyby vrácené řídicímu panelu jsou očištěny a přihlašovací údaje endpointu se nikdy nezaznamenávají do protokolů. > **TODO (D20):** Rozsah `global` (sdílení pamětí napříč všemi klíči API) není -> v této verzi implementován. Vyžaduje změny schématu a globální cestu načítání. -> Sledujte jej samostatně. +> v této verzi implementován. Vyžaduje změny schématu a globální cestu +> načítání. Evidujte jej samostatně. ## Vrstvy úložiště diff --git a/docs/i18n/cs/docs/guides/DOCKER_GUIDE.md b/docs/i18n/cs/docs/guides/DOCKER_GUIDE.md index cac32538723c..bbfa30ec3f74 100644 --- a/docs/i18n/cs/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/cs/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Rychlé spuštění +> **Vlastní hostování jediným příkazem?** Viz +> [Průvodce vlastním hostováním](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (publikovaný obraz + +> Redis, pouze na loopback rozhraní, bez volby profilu). Níže uvedené rychlé spuštění +> představuje variantu s jedním kontejnerem pro uživatele, kteří již provozují Redis jinde. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/cs/docs/guides/TROUBLESHOOTING.md b/docs/i18n/cs/docs/guides/TROUBLESHOOTING.md index 0dbc63ca043d..9eeaec462d96 100644 --- a/docs/i18n/cs/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/cs/docs/guides/TROUBLESHOOTING.md @@ -70,14 +70,22 @@ Nastavte je v prostředí procesu OmniRoute (démona, například prostřednictv Při spuštění `npm install -g omniroute` se může zobrazit záplava varování, například `npm warn ERESOLVE`, upozornění na partnerské závislosti a zprávy `deprecated`. **Tato varování jsou očekávaná a neškodná.** Instalace proběhla úspěšně, pokud se ve výstupu zobrazí `added packages`. +Chcete-li potlačit varování při řešení partnerských závislostí, použijte podporovaný způsob instalace OmniRoute: + +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` potlačí pouze upozornění `ERESOLVE` a upozornění na partnerské závislosti. Upozornění na zastaralé balíčky zůstanou viditelná, protože pocházejí z tranzitivních balíčků třetích stran; neznamenají, že instalace selhala. + Varování pocházejí ze zastaralých rozsahů partnerských závislostí v balíčcích třetích stran, které OmniRoute nemůže ovlivnit: 1. **`marked-terminal` vyžaduje `marked >=1 <16`, ale byla nalezena verze `marked@18`** — v praxi funguje bez problémů; rozsah partnerské závislosti v upstream balíčku je pouze zastaralý. -2. **`deprecated prebuild-install@7.1.3`** — tranzitivní pomocný nástroj pro získávání nativních binárních souborů. Nepoužívá se - k instalaci připnutého transportního bindingu `wreq-js` a neznamená, že nastavení transportu - poskytovatele webových cookies selhalo. +2. **`deprecated prebuild-install@7.1.3`** — tranzitivní pomocný nástroj pro načítání nativních binárních souborů. Nepoužívá se + k instalaci připnuté transportní vazby `wreq-js` a neznamená, že nastavení transportu poskytovatele + webových cookies selhalo. -**Není potřeba nic dělat** — bez forknutí upstream balíčků nelze tato varování zcela potlačit. +**Není nutná žádná akce** — bez vytvoření vlastních forků upstream balíčků nelze tato varování zcela potlačit. --- diff --git a/docs/i18n/cs/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/cs/docs/providers/CURSOR-API-KEY-AND-CLI.md index 9c625efa2c5d..26279f802ec0 100644 --- a/docs/i18n/cs/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/cs/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -6,41 +6,38 @@ Dva způsoby, jak připojit Cursor za OmniRoute bez relace IDE: -1. **Poskytovatel `cursor-api`** (karta „Cursor API“, alias `cua`): poskytovatel - využívající API klíč, který uchovává uživatelský API klíč Cursoru (`crsr_…`, - vygenerovaný na `https://cursor.com/dashboard/api`). Libovolný klient - OmniRoute pak přistupuje k modelům Cursoru prostřednictvím - `/v1/chat/completions` jako `cursor-api/` nebo `cua/`, přičemž - se uplatní obvyklé vrstvy pro kvóty, záložní mechanismy a protokolování. - Poskytovatel IDE (`cursor`, relace OAuth/IDE) zůstává beze změny. -2. **Přímé předávání Cursor CLI**: nasměrujte Cursor CLI (`agent`) na OmniRoute, - aby každé RPC volání provedené CLI bylo ověřeno pomocí API klíče OmniRoute, - předáno Cursoru s přihlašovacími údaji připojení `cursor-api` a zaznamenáno - na stránce Protokoly. +1. **Provider `cursor-api`** (karta „Cursor API“, alias `cua`): provider + s API klíčem, který uchovává uživatelský API klíč Cursoru (`crsr_…`, vygenerovaný na + `https://cursor.com/dashboard/api`). Libovolný klient OmniRoute pak může přistupovat + k modelům Cursoru prostřednictvím `/v1/chat/completions` jako `cursor-api/` nebo + `cua/`, s obvyklými vrstvami pro kvóty, záložní směrování a protokolování. Provider + IDE (`cursor`, relace OAuth/IDE) zůstává beze změny. +2. **Průchozí režim Cursor CLI**: nasměrujte Cursor CLI (`agent`) na OmniRoute, aby + každé RPC volání provedené CLI bylo ověřeno pomocí API klíče OmniRoute, přeposláno + do Cursoru s přihlašovacím údajem připojení `cursor-api` a zaznamenáno na + stránce Protokoly. ## Proč se klíč vyměňuje -`api2.cursor.sh` odmítá nezpracovaný klíč `crsr_…` jako token Bearer (401). -Cursor CLI nejprve odešle klíč metodou POST na `/auth/exchange_user_api_key` -a obdrží relační JWT, jehož platnost vyprší po jedné hodině; vrácený -`refreshToken` obsahuje stejnou hodnotu `exp`, takže obnovení znamená opětovnou -výměnu klíče. -`open-sse/services/cursorApiKeyAuth.ts` tuto výměnu provádí, ukládá do mezipaměti -jeden relační token pro každý klíč, znovu jej vymění pět minut před vypršením -platnosti a odstraní token z mezipaměti, když Cursor odpoví stavem 401. -`CursorExecutor` jej volá těsně před otevřením nadřazeného streamu pro připojení -`cursor-api`. +`api2.cursor.sh` odmítá nezpracovaný klíč `crsr_…` jako Bearer token (401). Cursor +CLI nejprve odešle klíč metodou POST na `/auth/exchange_user_api_key` a obdrží relační +JWT, jehož platnost vyprší po jedné hodině; vrácený `refreshToken` obsahuje stejnou +hodnotu `exp`, takže obnovení znamená opětovnou výměnu klíče. +`open-sse/services/cursorApiKeyAuth.ts` tuto výměnu provádí, ukládá do mezipaměti jeden relační +token pro každý klíč, provádí opětovnou výměnu pět minut před vypršením platnosti a odstraní token +z mezipaměti, když Cursor odpoví stavem 401. `CursorExecutor` tuto službu volá těsně před otevřením +upstreamového streamu pro připojení `cursor-api`. -## Poskytovatel `cursor-api` +## Provider `cursor-api` Registr: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, stejné hodnoty `format`, `baseUrl` -a `models` jako u `cursor`). Karta katalogu: -`src/shared/constants/providers/apikey/specialty-media.ts`. Mapa vykonavatelů: +(`cursor_apiProvider`, `authType: "apikey"`, stejné `format`, `baseUrl` a +`models` jako `cursor`). Karta katalogu: +`src/shared/constants/providers/apikey/specialty-media.ts`. Mapa executorů: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Ovládací panel: Poskytovatelé → Cursor API → Přidat API klíč. +Řídicí panel: Provideři → Cursor API → Přidat API klíč. REST: @@ -61,34 +58,43 @@ curl -sS http://localhost:20128/v1/chat/completions \ Poznámky: -- Seznam modelů pro `cursor-api` pochází ze statického registru Cursoru - (stejného seznamu, který poskytovatel IDE používá jako záložní); na hostiteli - OmniRoute není nutné instalovat `cursor-agent`. -- `POST /api/providers/{id}/refresh-cursor` je určen pouze pro poskytovatele IDE - `cursor`; připojení `cursor-api` nemají žádnou relaci IDE, kterou by bylo - možné obnovit. +- Seznam modelů pro `cursor-api` pochází ze statického registru Cursoru (ze + stejného seznamu, který provider IDE používá jako záložní); na hostiteli OmniRoute není + potřeba instalovat `cursor-agent`. +- `POST /api/providers/{id}/refresh-cursor` je určen pouze pro provider IDE `cursor`; + připojení `cursor-api` nemají žádnou relaci IDE, kterou by bylo možné obnovit. -## Přímé předávání Cursor CLI +## Nativní ID modelů a úroveň úsilí + +Pro `cursor` / `cu` a `cursor-api` / `cua` ponechává sdílený normalizátor úsilí pro Claude +požadované ID modelu beze změny. Cursor může uvádět příponu, jako je +`-low`, jako součást skutečného ID modelu, nikoli jako alias úsilí OmniRoute. +Executor Cursoru zachová přesnou shodu s aktuálním katalogem; pokud žádná +shoda neexistuje, převezme jeho stávající resolver modelů záložní převod přípony na parametr. + +Tím se nemění normalizace úsilí pro přímé trasy Claude, trasy kompatibilní +s Claude ani trasy Vertex. Dostupnost nadále závisí na katalogu a oprávněních +vybraného účtu Cursoru. + +## Předávání požadavků Cursor CLI Trasa: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`. Prefix `/api/cursor-cli/` je zaregistrován -v `src/shared/constants/publicApiRoutes.ts`, protože obslužná rutina provádí -vlastní ověřování: +`open-sse/handlers/cursorCliProxy.ts`. Prefix `/api/cursor-cli/` je +zaregistrován v `src/shared/constants/publicApiRoutes.ts`, protože obslužná rutina +vynucuje vlastní ověřování: -| Cesta | Ověření očekávané od CLI | Co OmniRoute provede | -| ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Ověří klíč, vytvoří JWT HS256 s platností 1 hodinu (podepsané pomocí `JWT_SECRET`) a vrátí jej | -| každá další cesta (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Ověří vydavatele, cílovou skupinu a dobu platnosti, vybere aktivní připojení `cursor-api`, nahradí hlavičku Authorization vyměněným tokenem Cursoru a streamuje odpověď zpět | +| Cesta | Ověření očekávané od CLI | Co provádí OmniRoute | +| ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Ověří klíč, vystaví JWT HS256 s platností 1 hodiny (podepsaný pomocí `JWT_SECRET`) a vrátí jej | +| každá jiná cesta (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Ověří vydavatele, cílovou skupinu a dobu platnosti, vybere aktivní připojení `cursor-api`, nahradí hlavičku Authorization za vyměněný token Cursoru a odpověď odešle zpět jako stream | -CLI dekóduje `exp` z jakéhokoli přijatého tokenu, takže pokud mu předáte -neprůhledný token, provede opětovnou výměnu téměř před každým požadavkem; -vytvořený JWT tomu zabraňuje. Odpověď 401 od OmniRoute způsobí, že CLI provede -výměnu znovu. +CLI dekóduje `exp` z libovolného přijatého tokenu, takže pokud obdrží neprůhledný +token, provede novou výměnu téměř před každým požadavkem; vystavený JWT tomu +zabraňuje. Odpověď 401 z OmniRoute způsobí, že CLI provede výměnu znovu. ### Nastavení -1. Vytvořte API klíč OmniRoute (Ovládací panel → API klíče) a připojení - `cursor-api`. +1. Vytvořte API klíč OmniRoute (Dashboard → API keys) a připojení `cursor-api`. 2. Nastavte CLI tak, aby pro stream agenta používalo HTTP/1.1. V souboru `~/.cursor/cli-config.json`: @@ -96,9 +102,9 @@ výměnu znovu. { "network": { "useHttp1ForAgent": true } } ``` - Bez tohoto nastavení CLI otevře interakci agenta přes HTTP/2 vůči samostatně + Bez tohoto nastavení CLI otevře běh agenta přes HTTP/2 vůči samostatně nakonfigurovanému hostiteli agenta a přes koncový bod budou procházet pouze - RPC volání řídicí vrstvy. + RPC řídicí roviny. 3. Spusťte CLI proti OmniRoute: @@ -108,19 +114,19 @@ výměnu znovu. agent -p --trust "Reply with exactly OK" ``` -Každý přenos se objeví v Protokolech s poskytovatelem `cursor-api`, typem -požadavku `cursor-cli` a cestou `/api/cursor-cli/` a bude přiřazen -k API klíči OmniRoute a připojení, které jej obsloužilo. - -### Režimy selhání - -| Situace | Odpověď pro CLI | -| ----------------------------------------------- | -------------------------------------------------------- | -| Neznámý klíč OmniRoute a `REQUIRE_API_KEY=true` | 401 `unauthenticated` při výměně | -| `REQUIRE_API_KEY=false` | anonymní relace (odpovídá chování `/v1/*`) | -| Expirovaný / cizí / pozměněný JWT relace | 401, CLI provede výměnu znovu | -| Klíč API OmniRoute odvolaný po výměně | 401 při následujícím RPC | -| Žádné aktivní připojení `cursor-api` | 503 `unavailable` | -| Cursor odmítne klíč připojení | 401 `unauthenticated`, relace v mezipaměti je odstraněna | -| Nadřazená služba je nedostupná | 502 `unavailable` (sanitizovaná zpráva) | -| Proměnná `JWT_SECRET` není nastavena | 503 při výměně | +Každý krok se zaznamená v Logs s poskytovatelem `cursor-api`, typem požadavku +`cursor-cli` a cestou `/api/cursor-cli/` a je přiřazen API klíči OmniRoute +a připojení, které jej obsloužilo. + +### Chybové stavy + +| Situace | Odpověď pro CLI | +| ----------------------------------------------- | ----------------------------------------------------- | +| Neznámý klíč OmniRoute a `REQUIRE_API_KEY=true` | 401 `unauthenticated` při výměně | +| `REQUIRE_API_KEY=false` | anonymní relace (odpovídá chování `/v1/*`) | +| Expirovaný / cizí / pozměněný JWT relace | 401, CLI provede výměnu znovu | +| API klíč OmniRoute odvolaný po výměně | 401 při následujícím RPC | +| Žádné aktivní připojení `cursor-api` | 503 `unavailable` | +| Cursor odmítne klíč připojení | 401 `unauthenticated`, relace v mezipaměti odstraněna | +| Nadřazená služba není dostupná | 502 `unavailable` (sanitizovaná zpráva) | +| `JWT_SECRET` není nastaven | 503 při výměně | diff --git a/docs/i18n/cs/docs/reference/API_REFERENCE.md b/docs/i18n/cs/docs/reference/API_REFERENCE.md index 9da74b65a446..852b7fee3946 100644 --- a/docs/i18n/cs/docs/reference/API_REFERENCE.md +++ b/docs/i18n/cs/docs/reference/API_REFERENCE.md @@ -444,7 +444,7 @@ přímo importovat `open-sse/config/providerPluginManifestRegistry.ts`. --- -## Koncové body kompatibility +## Kompatibilní koncové body | Metoda | Cesta | Formát | | ------ | ----------------------------------------- | ------------------------------------ | @@ -457,8 +457,8 @@ přímo importovat `open-sse/config/providerPluginManifestRegistry.ts`. | POST | `/v1/videos/generations` | Generování videa ve stylu OpenAI | | POST | `/v1/music/generations` | Generování hudby ve stylu OpenAI | | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (vrací tělo se zvukem) | -| POST | `/v1/rerank` | Přeřazení ve stylu Cohere/Voyage | +| POST | `/v1/audio/speech` | OpenAI TTS (vrací zvukové tělo) | +| POST | `/v1/rerank` | Přerazení ve stylu Cohere/Voyage | | POST | `/v1/classify` | Klasifikace Jina (`api.jina.ai`) | | POST | `/v1/segment` | Segmentátor Jina (`segment.jina.ai`) | | POST | `/v1/moderations` | OpenAI Moderations | @@ -474,15 +474,15 @@ přímo importovat `open-sse/config/providerPluginManifestRegistry.ts`. | POST | `/api/v1/vscode/{token}/api/chat` | Tokenizovaný alias Ollama | | GET | `/api/v1/vscode/{token}/api/tags` | Tokenizovaný alias značek Ollama | -Všechny trasy POST mají stejnou strukturu: `Bearer your-api-key` + tělo JSON ověřené pomocí Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` atd., viz `src/shared/validation/schemas.ts`). Při selhání ověření schématu se vrátí stav 4xx. +Všechny trasy POST mají stejnou strukturu: `Bearer your-api-key` + tělo JSON ověřované pomocí Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` atd., viz `src/shared/validation/schemas.ts`). Při selhání validace schématu je vrácen stav 4xx. -Klientům, kteří nemohou připojit `Authorization: Bearer ...`, umožňuje OmniRoute předat klíče API také v URL, a to buď prostřednictvím kompatibilních parametrů řetězce dotazu (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), nebo pomocí vyhrazených koncových bodů `/api/v1/vscode/{token}/...` popsaných níže. +Pro klienty, kteří nemohou připojit `Authorization: Bearer ...`, přijímá OmniRoute klíče API také v adrese URL, a to buď prostřednictvím kompatibilních parametrů dotazu (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), nebo prostřednictvím vyhrazených koncových bodů `/api/v1/vscode/{token}/...` zdokumentovaných níže. ```bash -# Přeřazení +# Přerazení (poskytovatel z cloudového registru nebo uzel poskytovatele kompatibilní s OpenAI ve tvaru "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Klasifikace Jina (přihlašovací údaje Foundation API) +# Klasifikace Jina (přihlašovací údaje k Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Segmentátor Jina @@ -494,7 +494,7 @@ POST /v1/search { "query": "...", "provider": "jina-search" } # Moderování POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — vrací tělo audio/mpeg (nebo tělo v požadovaném formátu) +# TTS — vrací tělo audio/mpeg (nebo požadovaný formát) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Úprava obrázku (multipart) @@ -505,6 +505,29 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Uzly poskytovatelů přerazení:** `POST /v1/rerank` směruje požadavky také na uzly poskytovatelů +> kompatibilní s OpenAI (oMLX, vLLM, Infinity, TEI za bránou, …), adresované jako `/`. +> Uzly zpětné smyčky (`localhost`, `127.0.0.1`, `172.16.0.0/12`) jsou vždy způsobilé. Uzly na jakémkoli +> jiném hostiteli — zařízení v síti LAN nebo protějšek Tailscale — jsou způsobilé pouze tehdy, když +> provozovatel povolí příznak funkce `RERANK_REMOTE_PROVIDER_NODES` **a** základní adresa URL uzlu projde +> zásadami pro odchozí adresy URL poskytovatele (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / +> `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); na hostitele cloudových metadat se požadavky nikdy nesměrují. +> Krok přerazení paměťového enginu volá tuto trasu přes zpětnou smyčku, takže stejné pravidlo řídí +> `rerankProviderModel` v nastavení paměti. +> +> **Struktury místních serverů:** uzel je volán na `/v1/rerank` a při odpovědi 404 na `/rerank` +> (Infinity, TEI). Tělo odesílané nadřazené službě obsahuje jak pojmenování Cohere/OpenAI (`documents`, +> `return_documents`), tak pojmenování TEI (`texts`, `return_text`), a odpověď nadřazené služby je +> normalizována do obálky Cohere: holé pole TEI `[{index, score, text}]`, `{results: [{index, score}]}` +> z jednoduchých bran a struktura ve stylu Voyage `{data: [...]}` jsou klientovi vráceny jako +> `{results: [{index, relevance_score, document?}]}`, seřazené podle skóre a omezené hodnotou `top_n`. + +> **Zjišťování uzlů poskytovatelů:** modely v uzlu poskytovatele kompatibilním s OpenAI se zobrazují v `GET /v1/models` +> pod prefixem uzlu. Řádky, které neobsahují žádná metadata koncového bodu (typické pro místní výpisy `/v1/models`), +> dědí hodnotu `apiType` daného uzlu, takže modely uzlu `embeddings` mají `type: "embedding"` a modely +> uzlu `rerank` mají `type: "rerank"` namísto výchozího nastavení na chat; explicitní hodnota +> `supportedEndpoints` u synchronizovaného nebo ručně přidaného řádku má stále přednost. + ### Vyhrazené trasy poskytovatelů ```bash @@ -513,7 +536,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Pokud prefix poskytovatele chybí, přidá se automaticky. Při neshodě modelů se vrátí `400`. +Prefix poskytovatele se automaticky přidá, pokud chybí. Neshodující se modely vrátí stavový kód `400`. --- diff --git a/docs/i18n/cs/docs/reference/ENVIRONMENT.md b/docs/i18n/cs/docs/reference/ENVIRONMENT.md index 112c60b927bd..b7bde18aef07 100644 --- a/docs/i18n/cs/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/cs/docs/reference/ENVIRONMENT.md @@ -81,70 +81,69 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" OmniRoute používá pro veškerou perzistenci **SQLite** (prostřednictvím `better-sqlite3`). Tyto proměnné řídí umístění dat, šifrování a životní cyklus. -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Kořenový adresář pro databázi SQLite, zálohy a datové soubory. Lze jej přepsat pro svazky Dockeru nebo vlastní cesty. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(nenastaveno)_ | `src/lib/dataPaths.ts` | Nouzová možnost pro ochranu DATA_DIR při testování/vyhodnocování (#10428). Testy a sondy Node pro vyhodnocení/výpis (`-e`/`--eval`/`-p`/`--print`, včetně forem `--eval=`/`--print=`), které nemají nastavenou proměnnou `DATA_DIR`, jsou přesměrovány do dočasného adresáře určeného k odstranění, takže nemohou otevřít skutečnou databázi provozovatele; nastavením na `1` znovu povolíte použití skutečného adresáře. | -| `OMNIROUTE_BUILD_SHA` | _(nenastaveno)_ | `src/lib/monitoring/buildSha.ts` | Git SHA spuštěného artefaktu. Vkládá se pomocí `npm run build:release`; lze jej zadat v kontejnerech dodávaných bez kontrolního souboru `dist/BUILD_SHA`. Na `/api/monitoring/health` je zpřístupněn jako `system.buildSha`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Reference, vůči níž brána původu baleného artefaktu ověřuje SHA sestavení (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(nenastaveno)_ | `scripts/build/buildProvenance.ts` | Nastavením na `1` povolíte zabalení sestavení, jehož SHA se nenachází ve vydávací větvi; namísto selhání na bráně bude zaznamenáno jako záměrné canary sestavení (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(nenastaveno)_ | `scripts/ops/deploy-canary.mjs` | Klíč API pro smoke sondu nasazení canary, odesílaný jako `Authorization: Bearer` na `/v1/chat/completions`. Používá jej pouze skript nasazení (#10429), nikdy server. Nesouvisí s proměnnými `OMNIROUTE_SMOKE_*` volitelné smoke testovací sady CLI (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` v `tests/integration/upstream-cli-smoke.int.test.ts`) — viz [Integrace CLI → Skutečný průchod smoke testů](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(nenastaveno)_ | `src/lib/buildPhase.ts` | Signál fáze sestavení (#10060): skript `scripts/build/build-next-isolated.mjs` jej nastaví na `1` a zdědí jej každý spuštěný proces sestavení, takže databázová vrstva namísto načtení nativního doplňku better-sqlite3 (který při ukončení přeruší proces) vrátí nefunkční zástupný objekt. Pro běžící server se nikdy nenastavuje. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Nastavením na `1` přeskočíte volitelnou kontrolu před sestavením nativních závislostí pro neobvyklé dodávané adresářové stromy. Chybějící závislost se tím nestane sestavitelnou; používejte pouze tehdy, jsou-li nativní závislosti poskytovány externě. | -| `OMNIROUTE_DATA_DIR` | _(nenastaveno)_ | `open-sse/executors/promptql/threadSticky.ts` | **Záložní alias** pro `DATA_DIR`, který se kontroluje pouze v případě, že `DATA_DIR` není nastavena. Slouží k nalezení diskové mezipaměti relací PromptQL vázaných na vlákno (`/promptql-thread-sessions.json`); pokud není nastavena ani jedna z proměnných, mezipaměť zůstane pouze v paměti (mezi restarty se nezachová). | -| `OMNIROUTE_PLUGINS_DIR` | _(nenastaveno)_ | `src/lib/plugins/scanner.ts` | Adresář, který čte **runtime skener pluginů** a do jehož kořene správce pluginů provádí instalaci; přepisuje výchozí hodnotu odvozenou od domovského adresáře (#11827). V Dockeru/K8s jej nastavte na připojený adresářový strom pluginů, místo abyste kvůli přemístění prohledávané cesty měnili HOME (HOME řídí také veškeré ostatní chování využívající cesty relativní k domovskému adresáři). Nenastaveno = `~/.omniroute/plugins`, nebo `/tmp/.omniroute/plugins`, pokud proces vůbec neexportuje domovský adresář — tato proměnná odstraňuje tichý problém s nenalezením pluginů. Vyhodnocený adresář se při spuštění jednou zaprotokoluje jako `scanner.dir_resolved` spolu se vstupem, který získal přednost. Pouze na straně serveru: pluginy příkazů CLI nadále používají vlastní proměnnou `OMNIROUTE_PLUGIN_PATH` (část 9). | -| `STORAGE_ENCRYPTION_KEY` | _(prázdné = zakázáno)_ | `src/lib/db/encryption.ts` | Klíč AES pro úplné šifrování databáze SQLite v klidovém stavu. Vygenerujte jej pomocí `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Označení verze šifrovacího klíče. Při rotaci klíče jej zvyšte, aby byla podporována dešifrace starých záloh. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Pokud je nastaveno na `true`, přeskočí rutinní zálohy souboru SQLite a zálohy před zápisem (uložení/vymazání cen models.dev, zápisy nastavení). Ruční zálohy a zálohy před obnovením se nadále provádějí. **Nezakáže** povinný trvalý bezpečnostní snímek nástroje pro migraci ani ochranu před hromadnou migrací existující trvalé databáze. Zálohy, které nejsou ruční, jsou omezeny na nejvýše jednu za 60 minut. Rutinní automatické zálohování lze nezávisle zakázat v ovládacím panelu v části **Nastavení → Úložiště**. | -| `OMNIROUTE_CRYPT_KEY` | _(nenastaveno)_ | `src/lib/db/encryption.ts` | **Starší alias** pro `STORAGE_ENCRYPTION_KEY`. Je přijat jako záložní možnost, pokud primární proměnná není k dispozici. | -| `OMNIROUTE_API_KEY_BASE64` | _(nenastaveno)_ | `src/lib/db/encryption.ts` | **Starší alias** (ve formě kódované pomocí Base64), který je přijímán jako záložní možnost. Před použitím se automaticky dekóduje. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(nenastaveno)_ | `src/lib/db/core.ts` | Přepíše interval pravidelné kontroly stavu SQLite (ms). Pokud není nastaven, výchozí hodnoty se odvodí z `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/walMaintenance.ts` | Přepíše interval pravidelného provádění `wal_checkpoint(TRUNCATE)` (ms). Automatický kontrolní bod nikdy nezmenšuje samotný soubor WAL a dlouhodobě spuštěný server svou databázi nikdy neuzavírá. Hodnota `0` funkci zakáže. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Přepíše interval častého provádění `wal_checkpoint(PASSIVE)` (ms). Udržuje počet čekajících rámců WAL nízký, aby pravidelné provedení TRUNCATE nikdy nekopírovalo na hlavním vlákně nevyřízená data o velikosti několika GB. Hodnota `0` funkci zakáže. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Když cyklus PASSIVE zjistí, že soubor WAL překročil tuto velikost, okamžitě přejde na `wal_checkpoint(TRUNCATE)` namísto čekání na pomalý cyklus. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Nastavením na `1`/`true`/`yes`/`on` se proces ukončí poté, co kritické zatížení prostředků přetrvává po dobu `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, čímž se správci procesů (systemd `Restart=always`, zásady restartování Dockeru) umožní spustit čistý proces namísto neomezeného vracení odpovědí 503. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Doba, po kterou musí kritické zatížení přetrvávat, než se provede ukončení procesu za účelem samočinného restartu. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(automatická detekce)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Explicitní cesta (absolutní nebo relativní vůči cwd) k souboru `sql-wasm.wasm` při použití záložního adaptéru WASM `sql.js`. Pokud není nastavena, automaticky se zjistí z balíčkových závislostí a kandidátních rozvržení. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/core.ts` | Přepíše interval pravidelného provádění `wal_checkpoint(TRUNCATE)` (ms). Automatický kontrolní bod nikdy nezmenšuje samotný soubor WAL a dlouhodobě spuštěný server svou databázi nikdy neuzavírá. Hodnota `0` funkci zakáže. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Počet dnů, po které automatické čištění před odstraněním uchovává kontrolní body ukončené úlohy Batch API (dokončené/neúspěšné/zrušené/vypršené), odkazované vstupní/výstupní/chybové soubory a její řádek. Projeví se až po zapnutí `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; odpovídá vlastní době uchovávání výstupů Batch API služby OpenAI. Nemá vliv na trasu `DELETE /api/v1/batches/delete-completed` spouštěnou operátorem, která záměrně zůstává bezpodmínečná (bez filtru podle stáří). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Při nastavení na `true` umožní automatickému čištění odstranit dokončené úlohy Batch API (a jejich kontrolní body) starší než `OMNIROUTE_BATCH_RETENTION_DAYS` a vymazat obsah BLOB nahraných souborů po uplynutí jejich vlastního `expires_at`. Ve výchozím nastavení je vypnuto: každá stávající instalace uchovává tato data stejně jako dříve, dokud tuto funkci nepovolí operátor. Jde také o příznak funkce upravitelný v řídicím panelu — viz `docs/reference/FEATURE_FLAGS.md` → Runtime. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Nastavením na `1` zcela přeskočíte kontrolu stavu DB při spuštění. Užitečné pro krátkodobé úlohy a integrační testy. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Nastavením na `1` vynutíte smyčku kontroly stavu DB, i když by za normálních okolností byla přeskočena (např. u krátkodobých úloh). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Nastavením na `1` přeskočíte zahřátí nativního běhového prostředí během `npm install`. Užitečné v CI/bezobslužných instalacích, kde je sqlite již sestaven. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(automatická detekce)_ | `src/lib/db/migrationRunner.ts` | Přepíše adresář, který prohledává nástroj pro spouštění migrací. Užitečné při distribuci přibalených migrací ve vlastních sestaveních. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(nenastaveno)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Další adresáře migrací jako položky `namespace=dir` oddělené oddělovačem cest dané platformy (např. `ee=/opt/app/enterprise/db/migrations`). Soubory, které se v nich najdou, se zaznamenají jako `-`, takže distribuce obsahující vlastní migrace nikdy nekoliduje s číselnými pozicemi upstreamu. Chybný formát položky, neplatný jmenný prostor nebo chybějící adresář způsobí při spuštění chybu namísto tichého přeskočení schématu. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Bezpečnostní limit pro velký počet čekajících migrací (#3416). Spuštění se přeruší, pokud na existující DB čeká více migrací, než je tento počet (ochrana proti vymazané sledovací tabulce). Pro obnovení starší zálohy limit zvyšte; nastavením na `0` kontrolu vypnete. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Pracovní adresář pro kontrolní bránu vydání `check:install-upgrade`. Vyžaduje přibližně 12 GB (dva instalační stromy o velikosti ~3 GB plus archiv tarball), takže nesmí běžet na malém tmpfs — na vlastním runneru je `/tmp` 12GB tmpfs uložený v RAM a kontrolní brána jej vyčerpala, čímž došlo ke zkrácení balíčku. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(výchozí hodnota v kódu)_ | `src/lib/spend/batchWriter.ts` | Interval vyprázdnění (ms) pro dávkový zapisovač výdajů/nákladů. Nižší hodnoty omezují slučování zápisů; vyšší hodnoty snižují soupeření o DB. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(výchozí hodnota v kódu)_ | `src/lib/spend/batchWriter.ts` | Maximální počet položek výdajů ve vyrovnávací paměti před vynuceným vyprázdněním. Zvyšte u nasazení s vysokým QPS; snižte, pokud je důležitější omezená spotřeba paměti. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(nenastaveno)_ | `open-sse/utils/proxyFetch.ts` | Nastavením na `"true"` povolíte výpis ladicích protokolů `[ProxyFetch]` na cestě přenosu Vercel. Ve výchozím nastavení je vypnuto, aby nedocházelo k úniku informací o směrování. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Nastavením na `"true"` nebo `"1"` zahrnete IP adresy klienta/odchozího připojení a předponu účtu do podrobného řádku procesního protokolu `[ProxyEgress]`. Ve výchozím nastavení zůstává VYPNUTO, aby procesní protokol neodhaloval IP adresy ani předponu účtu. | -| `OMNIROUTE_DEBUG` | _(nenastaveno)_ | `bin/cli/commands/quota.mjs` | Nastavením na `1` budete z příkazů kvóty CLI vypisovat diagnostiku časování jednotlivých požadavků (`[omniroute] GET completed in Nms`) do stderr. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automaticky)_ | `scripts/dev/healthcheck.mjs` | Explicitní cesta testovaná kontrolou stavu kontejneru. Pokud není nastavena, kontrola ji odvodí z `OMNIROUTE_BASE_PATH`; jejím nastavením znovu zvolíte hloubkový monitorovací koncový bod. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(nenastaveno)_ | `bin/cli/commands/completion.mjs` | Nastavením na libovolnou neprázdnou hodnotu povolíte diagnostiku `[omniroute completion]` z cest mezipaměti dokončování příkazů shellu v CLI (čtení/obnovení/zápis). Ve výchozím nastavení je vypnuto — selhání těchto mezipamětí probíhá bez upozornění, takže chybějící nebo poškozená mezipaměť nikdy nenaruší dokončování tabulátorem. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Maximální časové okno pro opakované pokusy jednotlivých položek dávky (ms). Položky, které tuto dobu překročí, jsou označeny jako neúspěšné. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Základní prodleva (ms) pro exponenciální prodlužování intervalů mezi opakovanými pokusy položek dávky. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Maximální prodleva (ms) pro exponenciální prodlužování intervalů mezi opakovanými pokusy položek dávky. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Maximální počet souběžně zpracovávaných dávek. Zvýšením zvýšíte propustnost; ponechte nízkou hodnotu, abyste zabránili nárazovému překračování limitů požadavků. | +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Kořenový adresář pro databázi SQLite, zálohy a datové soubory. Lze přepsat pro svazky Dockeru nebo vlastní cesty. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(nenastaveno)_ | `src/lib/dataPaths.ts` | Nouzová výjimka z ochrany DATA_DIR pro testy/vyhodnocování (#10428). Testy a sondy Node pro vyhodnocení/výpis (`-e`/`--eval`/`-p`/`--print`, včetně forem `--eval=`/`--print=`), které nemají nastavenou proměnnou `DATA_DIR`, jsou přesměrovány do dočasného adresáře určeného k odstranění, takže nemohou otevřít skutečnou databázi provozovatele; nastavením na `1` znovu povolíte použití skutečného adresáře. | +| `OMNIROUTE_BUILD_SHA` | _(nenastaveno)_ | `src/lib/monitoring/buildSha.ts` | Git SHA spuštěného artefaktu. Vkládá se pomocí `npm run build:release`; lze jej zadat v kontejnerech distribuovaných bez kontrolního souboru `dist/BUILD_SHA`. Zobrazuje se jako `system.buildSha` na `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Reference, vůči níž kontrolní mechanismus původu baleného artefaktu ověřuje SHA sestavení (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(nenastaveno)_ | `scripts/build/buildProvenance.ts` | Nastavením na `1` povolíte zabalení sestavení, jehož SHA není ve vydávané větvi; namísto selhání kontroly bude zaznamenáno jako záměrné canary sestavení (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(nenastaveno)_ | `scripts/ops/deploy-canary.mjs` | Klíč API pro smoke sondu nasazení canary, odesílaný jako `Authorization: Bearer` na `/v1/chat/completions`. Používá jej pouze skript nasazení (#10429), nikdy server. Nesouvisí s proměnnými `OMNIROUTE_SMOKE_*` volitelné CLI smoke testovací sady (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` v `tests/integration/upstream-cli-smoke.int.test.ts`) — viz [Integrace CLI → Skutečný smoke průchod](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(nenastaveno)_ | `src/lib/buildPhase.ts` | Signál fáze sestavení (#10060): skript `scripts/build/build-next-isolated.mjs` jej nastavuje na `1` a dědí jej každý spuštěný pracovní proces sestavení, takže databázová vrstva namísto načtení nativního doplňku better-sqlite3 vrátí nečinnou zástupnou implementaci (doplněk při ukončení pracovní proces přeruší). Pro běžící server se nikdy nenastavuje. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Nastavením na `1` přeskočíte volitelnou kontrolu před sestavením nativních závislostí pro neobvyklé stromy dodávaných závislostí. Chybějící závislost tím nelze sestavit; používejte pouze tehdy, když jsou nativní závislosti poskytovány externě. | +| `OMNIROUTE_DATA_DIR` | _(nenastaveno)_ | `open-sse/executors/promptql/threadSticky.ts` | **Záložní alias** pro `DATA_DIR`, který se kontroluje pouze tehdy, když `DATA_DIR` není nastaveno. Slouží k vyhledání diskové mezipaměti trvale přiřazených relací vláken exekutoru PromptQL (`/promptql-thread-sessions.json`); pokud není nastavena ani jedna z proměnných, mezipaměť zůstává pouze v paměti (mezi restarty se neuchovává). | +| `OMNIROUTE_PLUGINS_DIR` | _(nenastaveno)_ | `src/lib/plugins/scanner.ts` | Adresář, který čte **runtime skener pluginů** a do jehož kořenového umístění správce pluginů instaluje; přepisuje výchozí hodnotu odvozenou z domovského adresáře (#11827). V Dockeru/K8s jej nasměrujte na připojený strom pluginů namísto změny HOME pouze kvůli přesunutí cesty pro skenování (HOME řídí také veškeré ostatní chování závislé na domovském adresáři). Nenastaveno = `~/.omniroute/plugins`, nebo `/tmp/.omniroute/plugins`, pokud proces vůbec neexportuje domovský adresář — tato proměnná odstraňuje problém s tichým nenalezením pluginů. Přeložený adresář se při spuštění jednou zapíše do protokolu jako `scanner.dir_resolved` spolu se vstupem, který byl použit. Pouze na straně serveru: pluginy příkazů CLI nadále používají vlastní `OMNIROUTE_PLUGIN_PATH` (část 9). | +| `STORAGE_ENCRYPTION_KEY` | _(prázdné = zakázáno)_ | `src/lib/db/encryption.ts` | Klíč AES pro úplné šifrování databáze SQLite v klidovém stavu. Vygenerujte jej pomocí `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Označení verze šifrovacího klíče. Při rotaci klíče jej zvyšte, aby bylo možné dešifrovat staré zálohy. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Při hodnotě `true` přeskočí běžné zálohy souboru SQLite a zálohy před zápisem (uložení/vymazání cen models.dev, zápisy nastavení). Ruční zálohy a zálohy před obnovením se nadále provádějí. **Nezakáže** povinný trvalý bezpečnostní snímek spouštěče migrací ani ochranu před hromadnou migrací existující perzistentní databáze. Frekvence jiných než ručních záloh je omezena na nejvýše jednu za 60 minut. Běžné automatické zálohování lze nezávisle zakázat na řídicím panelu v části **Nastavení → Úložiště**. | +| `OMNIROUTE_CRYPT_KEY` | _(nenastaveno)_ | `src/lib/db/encryption.ts` | **Starší alias** pro `STORAGE_ENCRYPTION_KEY`. Přijímá se jako záložní možnost, pokud primární proměnná není přítomna. | +| `OMNIROUTE_API_KEY_BASE64` | _(nenastaveno)_ | `src/lib/db/encryption.ts` | **Starší alias** (forma kódovaná pomocí Base64), který se přijímá jako záložní možnost. Před použitím se automaticky dekóduje. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(nenastaveno)_ | `src/lib/db/core.ts` | Přepíše interval pravidelné kontroly stavu SQLite (ms). Pokud není nastaven, výchozí hodnoty se odvozují od `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(odstraněno)_ | `src/lib/db/walMaintenance.ts` | **Odstraněno.** Pravidelné provádění `wal_checkpoint(TRUNCATE)` za běhu může zneplatnit sdílené mapování indexu WAL a způsobit pád procesu se signálem SIGBUS (#13973), proto již plánovač neexistuje. Proměnná je neaktivní: kladná hodnota jednorázově zapíše upozornění na zastarání, zatímco hodnota `0` nebo nenastavená proměnná zůstane bez odezvy. WAL je udržován pomocí kontrolních bodů PASSIVE (níže) a zkrácen kontrolním bodem při ukončení. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Přepíše interval častého provádění `wal_checkpoint(PASSIVE)` (ms). Udržuje počet nevyřízených rámců WAL nízký, takže kontrolní body zůstávají rychlé a velikost souboru WAL je mezi zkráceními při ukončení omezena. Hodnota `0` tuto funkci zakáže. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Když kontrola PASSIVE zjistí, že soubor WAL překročil tuto velikost, spustí `wal_checkpoint(RESTART)`, aby WAL začal znovu bez přepisování mapovaného indexu WAL. Kontrolní body v režimu zkrácení za běhu byly odstraněny (viz řádek `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Nastavte na `1`/`true`/`yes`/`on`, aby se proces ukončil poté, co kritické vytížení prostředků přetrvává po dobu `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`. Správce procesů (systemd `Restart=always`, zásady restartování Dockeru) pak může místo neomezeného vracení chyb 503 spustit nový proces. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Doba, po kterou musí kritické vytížení přetrvávat, než dojde k ukončení procesu za účelem automatického restartu. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(automatická detekce)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Explicitní cesta (absolutní nebo relativní vůči cwd) k souboru `sql-wasm.wasm` při použití záložního adaptéru WASM `sql.js`. Pokud není nastavena, automaticky se zjistí prostřednictvím závislostí balíčku a kandidátních rozvržení. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Počet dní, po který automatické čištění před odstraněním uchovává kontrolní body úlohy Batch API v konečném stavu (dokončená/neúspěšná/zrušená/vypršená), odkazované vstupní/výstupní/chybové soubory a její řádek. Projeví se až po zapnutí `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; odpovídá vlastní době uchovávání výstupů Batch API společnosti OpenAI. Nemá vliv na operátorem spouštěnou trasu `DELETE /api/v1/batches/delete-completed`, která záměrně zůstává bezpodmínečná (bez filtru podle stáří). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Při hodnotě `true` umožní automatickému čištění odstranit úlohy Batch API v konečném stavu (a jejich kontrolní body) starší než `OMNIROUTE_BATCH_RETENTION_DAYS` a vymazat obsah BLOB nahraných souborů po uplynutí jejich vlastního `expires_at`. Ve výchozím nastavení je vypnuto: každá stávající instalace uchovává tato data přesně jako dříve, dokud se operátor nerozhodne funkci zapnout. Jde také o příznak funkce upravitelný na řídicím panelu — viz `docs/reference/FEATURE_FLAGS.md` → Běh programu. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Nastavte na `1`, chcete-li při spuštění zcela přeskočit kontrolu stavu DB. Užitečné pro krátkodobé úlohy a integrační testy. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Nastavte na `1`, chcete-li vynutit spuštění smyčky kontroly stavu DB, i když by za normálních okolností byla přeskočena (např. u krátkodobých úloh). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Nastavte na `1`, chcete-li během `npm install` přeskočit počáteční zahřátí nativního běhového prostředí. Užitečné při instalacích v CI nebo bez grafického rozhraní, kde je sqlite již sestaven. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(automatická detekce)_ | `src/lib/db/migrationRunner.ts` | Přepíše adresář, který nástroj pro spouštění migrací prohledává. Užitečné při distribuci přibalených migrací ve vlastních sestaveních. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(nenastaveno)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Další adresáře migrací jako položky `namespace=dir` oddělené oddělovačem cest dané platformy (např. `ee=/opt/app/enterprise/db/migrations`). Soubory nalezené v těchto adresářích se zaznamenávají jako `-`, takže distribuce s vlastními migracemi nikdy nekoliduje s číselnými pozicemi upstreamu. Chybně vytvořená položka, neplatný jmenný prostor nebo chybějící adresář způsobí při spuštění chybu namísto tichého přeskočení schématu. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Bezpečnostní limit pro velké množství čekajících migrací (#3416). Spuštění se přeruší, pokud na existující DB čeká více než tento počet migrací (ochrana proti vymazané sledovací tabulce). Chcete-li obnovit starší zálohu, limit zvyšte; nastavením na `0` kontrolu zakážete. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Pracovní adresář pro kontrolní bránu vydání `check:install-upgrade`. Vyžaduje přibližně 12 GB (dva instalační stromy o velikosti ~3 GB a archiv tarball), takže nesmí běžet na malém tmpfs — na samostatně hostovaném runneru je `/tmp` 12GB tmpfs v paměti RAM a tato kontrola jej vyčerpala, čímž došlo ke zkrácení balíčku. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(výchozí hodnota v kódu)_ | `src/lib/spend/batchWriter.ts` | Interval zápisu (ms) pro dávkový zapisovač výdajů/nákladů. Nižší hodnoty omezují slučování zápisů; vyšší hodnoty snižují soupeření o DB. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(výchozí hodnota v kódu)_ | `src/lib/spend/batchWriter.ts` | Maximální počet položek výdajů ve vyrovnávací paměti před vynuceným zápisem. Zvyšte u nasazení s vysokým QPS; snižte, pokud je důležitější omezené využití paměti. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(nenastaveno)_ | `open-sse/utils/proxyFetch.ts` | Nastavte na `"true"`, chcete-li na trase přenosu Vercel generovat ladicí protokoly `[ProxyFetch]`. Ve výchozím nastavení je vypnuto, aby nedocházelo k úniku informací o směrování. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Nastavte na `"true"` nebo `"1"`, chcete-li do podrobného řádku procesního protokolu `[ProxyEgress]` zahrnout IP adresy klienta/odchozího připojení a prefix účtu. Ve výchozím nastavení je tato možnost VYPNUTA, aby procesní protokol nezveřejňoval IP adresy ani prefix účtu. | +| `OMNIROUTE_DEBUG` | _(nenastaveno)_ | `bin/cli/commands/quota.mjs` | Nastavte na `1`, chcete-li z příkazů kvóty CLI vypisovat diagnostiku časování jednotlivých požadavků (`[omniroute] GET dokončeno za Nms`) na stderr. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automaticky)_ | `scripts/dev/healthcheck.mjs` | Explicitní cesta kontrolovaná kontrolou stavu kontejneru. Pokud není nastavena, sonda ji odvodí z `OMNIROUTE_BASE_PATH`; jejím nastavením znovu aktivujete hloubkový monitorovací koncový bod. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(nenastaveno)_ | `bin/cli/commands/completion.mjs` | Nastavte na libovolnou neprázdnou hodnotu, chcete-li z cest mezipaměti dokončování příkazů shellu v CLI (čtení/obnovení/zápis) generovat diagnostiku `[omniroute completion]`. Ve výchozím nastavení je vypnuto — selhání těchto mezipamětí probíhá bez hlášení, takže chybějící nebo poškozená mezipaměť nikdy nenaruší dokončování pomocí tabulátoru. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Maximální časové okno pro opakování jednotlivých položek dávky (ms). Položky, které tuto dobu překročí, jsou označeny jako neúspěšné. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Základní prodleva (ms) pro exponenciální prodlužování čekání při opakovaných pokusech o zpracování položek dávky. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Maximální prodleva (ms) pro exponenciální prodlužování čekání mezi opakovanými pokusy o zpracování položek dávky. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Maximální počet souběžně zpracovávaných dávek. Zvýšením zvýšíte propustnost; ponechte nízkou hodnotu, abyste předešli nárazovému překračování limitů požadavků. | > [!IMPORTANT] -> Před změnou existující perzistentní databáze nástroj pro migraci zveřejní kompletní, +> Před změnou existující trvalé databáze nástroj pro migraci zveřejní úplný, > obsahově adresovaný snímek v `DATA_DIR/db_backups/`. Zveřejnění vyžaduje souborový systém, -> který podporuje pevné odkazy bez přepsání v rámci stejného souborového systému a trvalou synchronizaci souborů. Hostitelé POSIX také -> vyžadují synchronizaci adresářů; v systému Windows může Node odmítnout popisovače adresářů, takže OmniRoute synchronizuje -> zveřejněný soubor a synchronizaci položky adresáře provádí pouze v rámci dostupných možností. -> Pokud připojený `DATA_DIR` tyto záruky nemůže poskytnout, spuštění se bezpečně ukončí před provedením -> migrace. Přesuňte `DATA_DIR` na svazek, který tyto primitivní operace podporuje; nepoužívejte +> který podporuje pevné odkazy v rámci stejného souborového systému bez přepisování a trvalou synchronizaci souborů. Hostitelé POSIX také +> vyžadují synchronizaci adresářů; v systému Windows může Node odmítnout popisovače adresářů, proto OmniRoute vyprázdní +> zveřejněný soubor na disk a synchronizaci položky adresáře provede v režimu maximálního úsilí. +> Pokud připojený adresář `DATA_DIR` tyto záruky nedokáže poskytnout, spuštění bezpečně selže ještě před použitím +> migrace. Přesuňte `DATA_DIR` na svazek, který tyto mechanismy podporuje; nepoužívejte > `DISABLE_SQLITE_AUTO_BACKUP` k obcházení zabezpečení migrace. ### Scénáře -| Scénář | Konfigurace | -| ------------------------ | --------------------------------------------------------------------------------------- | -| **Lokální vývoj** | Ponechte všechny výchozí hodnoty. Databáze se nachází v `~/.omniroute/omniroute.db`. | -| **Docker** | Nastavte `DATA_DIR=/data` a připojte svazek k `/data`. | -| **Šifrování v úložišti** | Nastavte `STORAGE_ENCRYPTION_KEY` a uchovávejte zálohy klíče! Jeho ztráta = ztráta dat. | -| **CI/Testování** | `DATA_DIR=/tmp/omniroute-test` — dočasné úložiště, šifrování není potřeba. | +| Scénář | Konfigurace | +| ------------------------- | --------------------------------------------------------------------------------------- | +| **Místní vývoj** | Ponechte všechny výchozí hodnoty. Databáze se nachází v `~/.omniroute/omniroute.db`. | +| **Docker** | Nastavte `DATA_DIR=/data` a připojte svazek v `/data`. | +| **Šifrování dat v klidu** | Nastavte `STORAGE_ENCRYPTION_KEY` a uchovávejte zálohy klíče! Jeho ztráta = ztráta dat. | +| **CI/Testování** | `DATA_DIR=/tmp/omniroute-test` — dočasné úložiště, šifrování není potřeba. | --- @@ -213,37 +212,38 @@ OmniRoute používá pro veškerou perzistenci **SQLite** (prostřednictvím `be ## 4. Zabezpečení a ověřování -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sůl kombinovaná s hardwarovými identifikátory pro vytvoření otisku zařízení. Pro izolaci ji změňte pro každé nasazení. | -| `OMNIROUTE_CLI_SALT` | _(nenastaveno = náhodná sůl pro každou instalaci uložená v `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Sůl HMAC pro odvození místního ověřovacího tokenu CLI. Nastavení této hodnoty změní všechny tokeny CLI na zařízení a má vždy přednost před uloženou solí. Viz `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Nastavuje příznak `Secure` u souborů cookie relace. Při provozu za HTTPS **musí být nastavena na `true`**. | -| `REQUIRE_API_KEY` | `false` | Middleware API | Pokud je nastavena na `true`, musí všechny požadavky proxy na `/v1/*` obsahovat platný klíč API. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Umožňuje zobrazit úplné hodnoty klíčů API v uživatelském rozhraní řídicího panelu. Lze nakonfigurovat pomocí příznaků funkcí na řídicím panelu; ve sdílených instancích představuje bezpečnostní riziko. | -| `NO_LOG_API_KEY_IDS` | _(prázdné)_ | `src/lib/compliance/index.ts` | Čárkami oddělená ID klíčů API, pro která se neprovádí protokolování požadavků (soulad s GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(nenastaveno = bez omezení)_ | `src/shared/utils/apiKeyPolicy.ts` | Záložní denní limit požadavků použitý pro klíče API, jejichž sloupec `rate_limits` má hodnotu null. Nenastavená nebo prázdná hodnota: žádný implicitní limit (#2289, #11017). Hodnota `0` znamená totéž (bez omezení). Kladné celé číslo N povolí N/den, 5N/týden a 20N/měsíc. Neplatné neprázdné hodnoty způsobí použití původních limitů 1000/den, 5000/týden a 20000/měsíc. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Maximální povolená velikost těla požadavku. Datové části překračující tento limit budou odmítnuty. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Skutečná těla požadavků o velikosti rovné této prahové hodnotě nebo vyšší před parsováním JSON atomicky získají procesně lokální kapacitní slot pro náročné požadavky (cesta BYTE, včetně `POST /v1/responses`). Používá se stejná výjimka při dostatečné volné kapacitě jako u strukturálně náročných požadavků z [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437); velikost je nadále omezena proměnnou `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), aby se problém [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) nevrátil. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Pevný limit tras chatu vynucovaný podle počtu bajtů načtených během omezeného příjmu, a to i u požadavků s chybějící, neplatnou nebo nepravdivou hodnotou `Content-Length`; při překročení je vrácen stav `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(nenastaveno — bez limitu počtu požadavků)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** tento starší limit POČTU požadavků se nyní uplatní pouze tehdy, když je explicitně nastaven. Pokud zůstane nenastavený (výchozí stav), přijímání náročných chatových požadavků je místo toho řízeno pomocí `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaticky odvozeného BAJTOVÉHO rozpočtu stanoveného podle skutečného paměťového limitu procesu v **jednom procesu** (jedna halda V8). Dva překrývající se požadavky `/v1/responses` s ~750 tisíci tokeny způsobí pád haldy o velikosti ~12 GiB (#7849) — jde o varování týkající se **paměťového rozpočtu**, nikoli o pevné produktové maximum 2. Proces v dobrém stavu (halda pod poměrem pro odmítání) MŮŽE přijmout více souběžných dlouhých požadavků `/v1/responses` prostřednictvím `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Desítky dlouhých klientů SSE (40–50) jsou otázkou haldy + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, nikoli „maxima 2“. Slepé zvýšení této hodnoty za účelem „využití hostitele“ znovu zavádí problém #7849. Násobte **haldy** pomocí **N nezávislých adresářů `DATA_DIR`** (#11024); nikdy nepoužívejte `replicas>1` nad jedním souborem SQLite. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automaticky odvozeno)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** přepsání automaticky odvozeného bajtového rozpočtu pro příjem (25 % z přísnějšího paměťového limitu V8/cgroup vydělených 8násobnou přechodnou amplifikací). Odvozené i explicitní hodnoty jsou omezeny na rozsah 8 MiB–2 GiB. Tělo větší než efektivní rozpočet okamžitě selže s `413 body_exceeds_budget`; soupeření mezi těly, která lze jednotlivě obsloužit, zůstává opakovatelné s kódem `503`. 40–50 souběžných dlouhých klientů SSE je otázkou tohoto rozpočtu + haldy, nikoli pevného „maxima 2“. Před laděním zkontrolujte `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` na `/api/monitoring/health`. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Poměr pro odmítání při tlaku na haldu (`heapUsed / heap_size_limit`) pro přijímání náročných požadavků typu BYTE a STRUCTURE (#10183, #10268, #10437). Souběžný náročný požadavek nad `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` je odmítnut s opakovatelným kódem `503` pouze tehdy, když je halda SOUČASNĚ na úrovni tohoto poměru nebo nad ní; při zdravé haldě je přijat prostřednictvím rezervy pro zdravý stav. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (výchozí hodnota `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Omezená dodatečná kapacita pro rychlou cestu při zdravé haldě (#10437) pro STRUCTURE i BYTE (`admitChatRequest`, včetně těl ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Bez tohoto omezení by každý požadavek při vytížení, ale se zdravou haldou, obcházel řízení příjmu bez jakéhokoli stropu. Jakmile je touto cestou pro zdravou haldu aktivních tolik souběžných pronájmů, další požadavky při vytížení přejdou na STEJNOU cestu omezeného čekání/odmítnutí, která se používá při skutečném tlaku na haldu. Hodnota `0` toto obcházení zcela zakáže. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Počet zpráv, při kterém je chatový požadavek klasifikován jako náročný, i když je jeho tělo pod bajtovou prahovou hodnotou. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Počet nástrojů, při kterém je chatový požadavek klasifikován jako náročný, i když je jeho tělo pod bajtovou prahovou hodnotou. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konzervativní odhad počtu tokenů podle velikosti řetězců, při kterém je požadavek klasifikován jako náročný; jde o zástupnou metriku nákladů na přijetí, nikoli o tokenizaci poskytovatele používanou pro účtování. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (zakázáno) | `src/shared/middleware/chatBodyAdmission.ts` | Volitelný limit historie chatu, který je nutné výslovně zapnout. Ve výchozím nastavení je zakázán: počet zpráv je zásadou konkrétního nasazení, nikoli univerzální vlastností požadavku, a omezení na tomto místě odmítne konverzace konečným kódem `413` dříve, než je kompresní pipeline dokáže učinit obsloužitelnými. Růst haldy je omezen pomocí `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` a odmítání při tlaku na haldu. V nasazeních s omezenou pamětí, která potřebují pevný strop, nastavte kladnou hodnotu; nadlimitní požadavky poté obdrží strukturovanou odpověď `413` vyžadující zkomprimování. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Pevný limit pro nestreamovanou odpověď upstreamu, která se celá ukládá do paměti. Po jeho překročení je čtení upstreamu zrušeno a požadavek rychle selže, místo aby se neomezeně zvětšoval řetězec až do vyčerpání haldy. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maximální počet bajtů přenesených po síti pro hlavičky odpovědi předávané z upstreamu. Při překročení rozpočtu jsou hlavičky s nižší prioritou (např. vlastní `x-codex-*`, `x-oai-request-id`) zahozeny, aby byly dodrženy běžné limity hlaviček reverzních proxy serverů. Vyšší nastavení umožní předávat více metadat upstreamu za cenu větší velikosti hlaviček odpovědi. | -| `CORS_ORIGIN` | _(nenastaveno)_ | `src/server/cors/origins.ts` | Starší seznam povolených zdrojů CORS podporující jeden zdroj. Pro nová nasazení upřednostněte `CORS_ALLOWED_ORIGINS`. CORS slouží pouze pro klienty API v prohlížeči používající jiný zdroj; autentizované zápisy řídicího panelu místo toho používají požadavky ze stejného zdroje spolu s ochranou CSRF vázanou na relaci. | -| `CORS_ALLOWED_ORIGINS` | _(nenastaveno)_ | `src/server/cors/origins.ts` | Čárkami oddělený seznam povolených zdrojů CORS. Zástupný znak se neodesílá, pokud není výslovně nakonfigurováno `CORS_ALLOW_ALL=true`. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Nouzová možnost určená pouze pro vývoj, která vrací jakýkoli prohlížečový `Origin`. Nepovolujte ji ve sdílených ani produkčních nasazeních. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Blokuje volání poskytovatelů cílící na privátní, zpětné nebo lokální IP rozsahy. Vypínejte pouze v izolovaných testovacích prostředích. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Povoluje URL poskytovatelů směřující do privátních nebo lokálních sítí (localhost, 192.168.x.x, 10.x.x.x atd.). **VYŽADOVÁNO pro poskytovatele hostované ve vlastní infrastruktuře** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Při hodnotě `false` řídicí panel odmítne ověření lokálních URL. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Povoluje přidávání a ověřování poskytovatelů na lokálních nebo privátních adresách (127.0.0.1, localhost, LAN, privátní rozsahy) — vztahuje se pouze na cestu ověřování poskytovatele. **Výchozí hodnota je `true`** (priorita lokálního prostředí); nastavením na `false` vynutíte striktní blokování všeho kromě veřejných adres. Koncové body cloudových metadat (169.254.169.254, metadata.google.internal) zůstávají blokovány bez ohledu na toto nastavení. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Umožňuje trasám `/v1/audio/*` (přepisy, řeč, překlady) používat uzel poskytovatele kompatibilního s OpenAI, který je hostován mimo localhost. Ve výchozím nastavení je vypnuto — směrování zvuku na vzdáleného hostitele mění identitu odchozího připojení a musí být výslovným rozhodnutím provozovatele. Uzly na zpětných nebo privátních adresách (localhost, 127.0.0.1, 172.16-31.x) jsou vždy povoleny a toto nastavení se jich netýká. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Pokud je OIDC povoleno, zakáže přihlašování heslem, takže se uživatelé mohou ověřovat pouze prostřednictvím jednotného přihlašování OIDC. Je podporován také zkrácený alias `OIDC_DISABLE_PASSWORD_LOGIN`; přednost má příznak funkce řídicího panelu se stejným klíčem. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Zkrácený alias proměnné `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ------------------------------------------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sůl kombinovaná s hardwarovými identifikátory pro vytváření otisku zařízení. Pro izolaci ji změňte pro každé nasazení. | +| `OMNIROUTE_CLI_SALT` | _(nenastaveno = náhodná sůl pro každou instalaci, uložená v `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Sůl HMAC pro odvození místního ověřovacího tokenu CLI. Nastavení této hodnoty změní všechny tokeny CLI v zařízení a má vždy přednost před uloženou solí. Viz `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Nastavuje příznak `Secure` u relačních souborů cookie. Při provozu za HTTPS **musí být nastaveno na `true`**. | +| `REQUIRE_API_KEY` | `false` | Middleware API | Pokud je nastaveno na `true`, musí všechny proxy požadavky `/v1/*` obsahovat platný klíč API. **Tento příznak neomezuje přístup k `GET /v1/models`**, který se místo toho řídí nastavením přihlášení k řídicímu panelu (`requireAuthForModels`) — odpověď `401` z `/v1/models` proto NEZNAMENÁ, že je inference chráněna. Viz `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Umožňuje zobrazit úplné hodnoty klíčů API v uživatelském rozhraní řídicího panelu. Lze konfigurovat pomocí příznaků funkcí řídicího panelu; ve sdílených instancích představuje bezpečnostní riziko. | +| `NO_LOG_API_KEY_IDS` | _(prázdné)_ | `src/lib/compliance/index.ts` | Čárkami oddělené identifikátory klíčů API, pro které se neprovádí protokolování požadavků (soulad s GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(nenastaveno = bez omezení)_ | `src/shared/utils/apiKeyPolicy.ts` | Záložní denní limit požadavků použitý na klíče API, jejichž sloupec `rate_limits` má hodnotu null. Nenastavená nebo prázdná hodnota: žádný implicitní limit (#2289, #11017). Hodnota `0` má stejný význam (bez omezení). Kladné celé číslo N povolí N/den, 5N/týden a 20N/měsíc. Neplatné neprázdné hodnoty použijí původní limity 1000/den, 5000/týden a 20000/měsíc. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Maximální povolená velikost těla požadavku. Datové části překračující tento limit jsou odmítnuty. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Skutečná těla požadavků o velikosti rovné této prahové hodnotě nebo vyšší před parsováním JSON atomicky získají v rámci procesu oprávnění pro náročné zpracování (cesta BYTE, včetně `POST /v1/responses`). Platí stejná možnost pokračovat při dostatečné rezervě jako u strukturálně náročných požadavků [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437); stále je omezena hodnotou `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), aby se problém [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) nevrátil. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Pevný limit pro chatovací trasy vynucovaný vůči bajtům načteným během omezeného příjmu, včetně požadavků s chybějící, neplatnou nebo nepravdivou hlavičkou `Content-Length`; překročení obdrží `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(nenastaveno — bez limitu počtu požadavků)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** tento starší limit POČTU požadavků se nyní uplatní pouze tehdy, když je explicitně nastaven. Pokud zůstane nenastavený (výchozí stav), přijímání náročných chatovacích požadavků je místo toho řízeno proměnnou `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaticky odvozeným BAJTOVÝM rozpočtem dimenzovaným podle skutečného paměťového limitu procesu v **jednom procesu** (jedna halda V8). Dva překrývající se požadavky `/v1/responses` o přibližně 750 tisících tokenech způsobí pád hald o velikosti ~12 Gi (#7849) — jde o varování týkající se **paměťového rozpočtu**, nikoli o pevné produktové maximum 2. Proces v dobrém stavu (halda pod poměrem pro odmítání) SMÍ přijmout více souběžných dlouhých požadavků `/v1/responses` prostřednictvím `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Desítky dlouhých klientů SSE (40–50) jsou otázkou haldy + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, nikoli „maximálně 2“. Slepé zvýšení této hodnoty za účelem „využití hostitele“ znovu zavádí problém #7849. Násobte **haldy** pomocí **N nezávislých `DATA_DIR`** (#11024); nikdy nepoužívejte `replicas>1` nad jedním souborem SQLite. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automaticky odvozeno)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** přepsání automaticky odvozeného bajtového rozpočtu pro příjem (25 % z přísnějšího paměťového limitu V8/cgroup děleno osminásobným přechodným navýšením). Odvozené i explicitní hodnoty jsou omezeny na 8 MiB–2 GiB. Tělo větší než efektivní rozpočet okamžitě selže s `413 body_exceeds_budget`; soupeření mezi jednotlivě obsloužitelnými těly nadále vede k opakovatelnému `503`. 40–50 souběžných dlouhých klientů SSE je otázkou tohoto rozpočtu + haldy, nikoli pevného „maxima 2“. Před laděním si na `/api/monitoring/health` přečtěte `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity`. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Poměr tlaku na haldu (`heapUsed / heap_size_limit`) pro odmítání náročných požadavků podle BAJTŮ a STRUKTURY (#10183, #10268, #10437). Souběžný náročný požadavek překračující `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` je odmítnut opakovatelným `503` pouze tehdy, když je halda ZÁROVEŇ na tomto poměru nebo nad ním; při zdravé haldě je přijat prostřednictvím rezervy pro zdravý stav. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (výchozí `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Omezená dodatečná kapacita rychlé cesty pro zdravou haldu (#10437) pro STRUKTURU i BAJTY (`admitChatRequest`, včetně těl ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Bez tohoto omezení by každý požadavek při vytížení, ale se zdravou haldou, obcházel řízení přijímání bez jakéhokoli stropu. Jakmile je prostřednictvím cesty pro zdravou haldu aktivní tento počet souběžných pronájmů, další požadavky při vytížení přejdou na STEJNOU cestu omezeného čekání/odmítnutí, která se používá při skutečném tlaku na haldu. `0` toto obcházení zcela zakáže. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Počet zpráv, při kterém je chatovací požadavek klasifikován jako náročný, i když je jeho tělo pod bajtovým prahem. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Počet nástrojů, při kterém je chatovací požadavek klasifikován jako náročný, i když je jeho tělo pod bajtovým prahem. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konzervativní odhad počtu tokenů podle velikosti řetězců, při kterém je požadavek klasifikován jako náročný; jde o aproximaci nákladů pro řízení přijímání, nikoli o tokenizaci poskytovatele pro účely účtování. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (zakázáno) | `src/shared/middleware/chatBodyAdmission.ts` | Volitelný limit historie chatu, který je nutné explicitně zapnout. Ve výchozím nastavení je zakázán: počet zpráv je zásadou konkrétního nasazení, nikoli univerzální vlastností požadavku, a omezení na tomto místě odmítá konverzace konečným stavem `413` dříve, než je kompresní zpracování může učinit obsloužitelnými. Růst haldy je omezen prostřednictvím `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` a odmítání při tlaku na haldu. V nasazeních s omezenou pamětí, která potřebují pevný strop, nastavte kladnou hodnotu; překročení pak obdrží strukturovanou odpověď `413` vyžadující kompresi. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Pevný limit pro neproudovou odpověď nadřazené služby, která je celá ukládána do vyrovnávací paměti. Po jeho překročení je čtečka odpovědi nadřazené služby zrušena a požadavek rychle selže, místo aby neomezený řetězec rostl až do vyčerpání haldy. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maximální počet bajtů přenesených z hlaviček odpovědi upstreamu. Při překročení limitu jsou hlavičky s nižší prioritou (např. vlastní `x-codex-*`, `x-oai-request-id`) vynechány, aby byly dodrženy běžné limity hlaviček reverzních proxy serverů. Nastavením vyšší hodnoty lze přenášet více metadat upstreamu za cenu větší velikosti hlaviček odpovědi. | +| `CORS_ORIGIN` | _(nenastaveno)_ | `src/server/cors/origins.ts` | Zastaralý seznam povolených CORS zdrojů s jediným zdrojem. Pro nová nasazení upřednostněte `CORS_ALLOWED_ORIGINS`. CORS slouží pouze pro klienty API v prohlížeči komunikující napříč zdroji; ověřené zápisy v řídicím panelu místo toho používají požadavky ze stejného zdroje spolu s ochranou CSRF vázanou na relaci. | +| `CORS_ALLOWED_ORIGINS` | _(nenastaveno)_ | `src/server/cors/origins.ts` | Čárkami oddělený seznam povolených CORS zdrojů. Zástupný znak se neodesílá, pokud není explicitně nakonfigurováno `CORS_ALLOW_ALL=true`. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Nouzová možnost určená pouze pro vývoj, která vrací libovolnou hodnotu `Origin` prohlížeče. Nezapínejte ji ve sdílených ani produkčních nasazeních. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Blokuje volání poskytovatelů cílená na privátní, loopback nebo link-local rozsahy IP adres. Vypínejte pouze v izolovaných testovacích prostředích. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Povoluje URL poskytovatelů směřující do privátních či místních sítí (localhost, 192.168.x.x, 10.x.x.x atd.). **VYŽADOVÁNO pro poskytovatele s vlastním hostingem** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Pokud je nastaveno na `false`, řídicí panel odmítne ověření místních URL. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Povoluje přidávání a ověřování poskytovatelů na místních či privátních adresách (127.0.0.1, localhost, LAN, privátní rozsahy) — omezeno na cestu ověřování poskytovatele. **Výchozí hodnota je `true`** (upřednostnění místních prostředků); nastavením na `false` vynutíte striktní blokování všeho kromě veřejných adres. Koncové body cloudových metadat (169.254.169.254, metadata.google.internal) zůstávají blokovány bez ohledu na toto nastavení. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Umožňuje trasám `/v1/audio/*` (přepisy, syntéza řeči, překlady) používat uzel poskytovatele kompatibilní s OpenAI, který je hostován mimo localhost. Ve výchozím nastavení je vypnuto — směrování zvuku na vzdáleného hostitele mění identitu výstupního připojení a musí jít o explicitní rozhodnutí provozovatele. Loopback a privátní uzly (localhost, 127.0.0.1, 172.16-31.x) jsou vždy povoleny a toto nastavení je neovlivňuje. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Umožňuje požadavku `POST /v1/rerank` (a kroku přehodnocení pořadí přes loopback v paměťovém enginu) používat uzel poskytovatele kompatibilní s OpenAI, který je hostován mimo localhost — zařízení v síti LAN nebo partnerský uzel Tailscale provozující TEI, Infinity, vLLM atd. Ve výchozím nastavení je vypnuto — směrování na vzdáleného hostitele mění identitu výstupního připojení a musí jít o explicitní rozhodnutí provozovatele. Loopback uzly (localhost, 127.0.0.1, 172.16-31.x) jsou vždy povoleny a toto nastavení je neovlivňuje. Vzdálené uzly musí rovněž splňovat zásady pro odchozí URL poskytovatele (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); na hostitele cloudových metadat se požadavky nikdy nesměrují. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Pokud je povoleno OIDC, zakáže přihlašování pomocí hesla, takže se uživatelé mohou ověřovat pouze prostřednictvím jednotného přihlašování OIDC. Je podporován také nezkrášlený alias `OIDC_DISABLE_PASSWORD_LOGIN`; příznak funkce řídicího panelu se stejným klíčem má přednost. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Nezkrášlený alias proměnné `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### Kontrolní seznam zabezpečení @@ -301,59 +301,66 @@ OmniRoute poskytuje dvouvrstvou ochranu: kontrolu injekcí na straně požadavk ## 6. Zásady nástrojů a směrování -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Řídí přístup LLM k volání nástrojů/funkcí. `allowlist` = pouze uvedené nástroje, `denylist` = všechny kromě uvedených, `disabled` = bez omezení. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Cesta k souboru JSON s pravidly pro manipulaci s datovou částí požadavku (úpravy pro konkrétní model/protokol nadřazeného poskytovatele). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Interval opětovného načítání (ms) souboru s pravidly datové části za běhu. Minimum je `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Volitelná možnost: směruje ID modelů ve formátu `claude-*` bez prefixu od klientů Claude Code prostřednictvím účtu OAuth Claude Code namísto požadavku na prefix poskytovatele. Explicitní prefixy poskytovatelů mají stále přednost. Lze také nakonfigurovat přepínačem na řídicím panelu na stránce poskytovatele Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Limit souběžnosti pro jednotlivé modely u kombinací s kruhovým přidělováním (#9100). Semafor kombinací s kruhovým přidělováním byl pevně omezen na 3 souběžné požadavky na model bez možnosti změny, takže provoz s vyšší souběžností byl za tímto limitem zpracováván sériově. Hodnota se ověřuje jako `>= 1` a omezuje na `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Nebezpečná volitelná možnost, která u přímých požadavků na jeden model přeskakuje místní kontrolu kontextového okna / maximálního počtu vstupních tokenů OmniRoute. Nadřazení poskytovatelé nadále vynucují své skutečné limity; komprese výzvy a vlastní limit výstupních tokenů modelu zůstávají aktivní. Efektivní pořadí priorit je přepsání v databázi Feature Flags > proměnná prostředí > výchozí hodnota; restart není vyžadován. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(nenastaveno)_ | `open-sse/services/conversationTracker.ts` | Nastavením na `1` zastavíte shromažďování historie konverzací. `resolveConversationId()` vrátí nesledovaný výsledek ještě před čtením SQLite nebo analýzou historie zpráv; zahrnuta jsou také ID relací dodaná klientem. Zpracování směrovacích relací zůstává beze změny a existující záznamy se neodstraňují. Určeno pro nasazení, která nepoužívají zobrazení konverzací na řídicím panelu a chtějí zastavit růst tabulky tahů. | +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ----------------------------------------------------------- | -------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Řídí přístup LLM k volání nástrojů/funkcí. `allowlist` = pouze uvedené nástroje, `denylist` = všechny kromě uvedených, `disabled` = bez omezení. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Cesta k souboru JSON s pravidly pro úpravu datové části požadavku (úpravy upstreamu podle modelu/protokolu). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Interval opětovného načítání (ms) pro automatické načítání změn souboru s pravidly datové části. Minimum je `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Volitelné: směruje ID modelů ve tvaru `claude-*` bez prefixu z klientů Claude Code přes účet OAuth služby Claude Code namísto vyžadování prefixu poskytovatele. Explicitní prefixy poskytovatelů mají stále přednost. Lze také nastavit pomocí přepínače na stránce poskytovatele Claude v řídicím panelu. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Limit souběžnosti pro jednotlivé modely u kombinací typu round-robin (#9100). Semafor kombinace round-robin měl pevně nastavený limit 3 souběžných požadavků na model bez možnosti přepsání, takže provoz s vyšší souběžností se řadil do fronty za tímto limitem. Hodnota je ověřována na `>= 1` a omezena na `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Nebezpečná volitelná možnost, která u přímých požadavků na jeden model přeskakuje místní kontrolu kontextového okna / maximálního počtu vstupních tokenů v OmniRoute. Upstreamoví poskytovatelé nadále vynucují své skutečné limity; komprese výzvy a vlastní limit výstupních tokenů modelu zůstávají aktivní. Platné pořadí priorit je přepsání v databázi příznaků funkcí > proměnná prostředí > výchozí hodnota; restart není vyžadován. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(nenastaveno)_ | `open-sse/services/selfHostedEntry.ts` | Vložený dokument YAML `providers:` (RIC-738, D4). Pokud je nastaven (s blokem `strategy:` nebo bez něj), `/v1/chat/completions` se přesměruje do jednotného self-hosted vstupního bodu kompatibilního s OpenAI namísto cloudové pipeline. Pokud není nastaven (výchozí stav), trasa pokračuje přímo do stávající cloudové pipeline. Viz `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(nenastaveno)_ | `open-sse/services/selfHostedEntry.ts` | Cesta k souboru YAML obsahujícímu stejný dokument `providers:` jako `OMNIROUTE_SELF_HOSTED_PROVIDERS`, určená pro nasazení, která upřednostňují soubor před vloženou proměnnou prostředí. Self-hosted vstupní bod aktivuje kterákoli z těchto možností. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(nenastaveno — otevřená trasa)_ | `open-sse/services/selfHostedEntry.ts` | Volitelný sdílený klíč API pro jednotný self-hosted vstupní bod (základ D5, vyhrazený pro systém kvót podle jednotlivých klíčů). Pokud je nastaven, požadavky musí obsahovat `Authorization: Bearer `. Pokud není nastaven, trasa je otevřená, což odpovídá stávajícímu vzoru self-hosted místního poskytovatele (nasazení v loopbacku / důvěryhodné síti). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(nenastaveno)_ | `open-sse/services/routingStrategies.ts` | Vložený dokument YAML `strategy:` pro deterministický směrovací modul (M2/RIC-740, D3) — seznam zakázaných/povolených položek, jistič s dobou zklidnění, priorita podle nákladů, zohlednění latence a řetězec záložních možností. Přepisuje vložený blok `strategy:` vnořený do `OMNIROUTE_SELF_HOSTED_PROVIDERS` pro jednotlivé klíče. Viz `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(nenastaveno)_ | `open-sse/services/routingStrategies.ts` | Cesta k souboru YAML obsahujícímu stejný dokument `strategy:` jako `OMNIROUTE_SELF_HOSTED_STRATEGY`, určená pro nasazení, která upřednostňují soubor před vloženou proměnnou prostředí. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(nenastaveno)_ | `open-sse/services/conversationTracker.ts` | Nastavením na `1` zastavíte shromažďování historie konverzací. Funkce `resolveConversationId()` vrátí nesledovaný výsledek ještě před čtením SQLite nebo analýzou historie zpráv; vztahuje se to také na ID relací poskytnutá klientem. Zpracování směrovacích relací zůstává beze změny a existující záznamy se neodstraňují. Určeno pro nasazení, která nepoužívají zobrazení konverzací na řídicím panelu a chtějí zastavit růst tabulky tahů. | --- -## 7. URL adresy a cloudová synchronizace - -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Adresa URL na straně serveru, kterou interní synchronizační úlohy používají k volání `/api/sync/cloud`. Ponechte ji jako adresu URL zpětné smyčky nebo kontejneru, i když je aplikace veřejně zpřístupněna přes proxy. | -| `CLOUD_URL` | _(prázdné)_ | `src/lib/cloudSync.ts` | Adresa URL koncového bodu cloudového přenosu (prémiová funkce). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Časový limit HTTP pro požadavky cloudové synchronizace. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Konfigurace sestavení Webpack | Profil při sestavení (nastavením na `minimal` fyzicky vyloučíte privilegované moduly z balíčku). | -| `OMNIROUTE_STANDALONE_DIR` | _výstup samostatného sestavení .build/_ | `scripts/build/colocate-standalone.mjs` | Přepsání výstupního adresáře samostatného sestavení používaného krokem kolokace po sestavení. Nejedná se o nastavení za běhu. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(prázdné)_ | `src/lib/cloudSync.ts` | Sdílený tajný klíč používaný k ověření podpisu HMAC-SHA256 odpovědí Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Nastavením na `true` povolíte koncovému bodu Cloud Sync přepsat místní přihlašovací údaje. Výchozí hodnota je `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Nastavením na `true` odmítnete nepodepsanou odpověď Cloud Sync, pokud není nakonfigurován žádný místní tajný klíč (#13679). Přítomný podpis je vždy ověřen — a pokud proměnná `OMNIROUTE_CLOUD_SYNC_SECRET` není nastavena, vždy odmítnut — bez ohledu na tento příznak. Od verze v3.9 bude ověřování ve výchozím nastavení vynuceno. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Nastavením na `true` se bez potvrzení uživatele vrátíte k jednokrokovému chování „importovat vše“ z verze v3.8.5. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, řídicí panel, synchronizace | Veřejně přístupná adresa URL pro OAuth redirect_uri, odkazy řídicího panelu a generované veřejné adresy URL. Nastavte ji na stabilní veřejnou adresu URL, pokud zpětná volání OAuth nebo generované odkazy pro prohlížeč musí používat kanonického hostitele reverzní proxy. | -| `NEXT_PUBLIC_CLOUD_URL` | _(prázdné)_ | Strana klienta | Zrcadlo proměnné `CLOUD_URL` na straně klienta. | -| `NEXT_PUBLIC_APP_URL` | _(nenastaveno)_ | `src/shared/services/cloudSyncScheduler.ts` | Starší záložní možnost pro `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(nenastaveno)_ | Překladač veřejného původu, adresy URL obrázků | Původ OmniRoute pro prohlížeč s nejvyšší prioritou, používaný ke generování veřejných adres URL a ověřování původu v prohlížeči mimo řídicí panel. Nastavte jej, pokud OpenWebUI nebo jiný přenos přistupuje k OmniRoute přes interní adresu URL, ale prohlížeč uživatele musí načítat vygenerovaná média z LAN, tunelu nebo veřejného původu. **Nezahrnujte** `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(nenastaveno)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absolutní adresa URL manifestu pluginu poskytovatele oznamovaná klientům sidecar. Pokud není nastavena, OmniRoute odvodí `/api/v1/provider-plugin-manifest` z původu požadavku nebo HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokol používaný při odvozování adresy URL manifestu pluginu poskytovatele z HOST/PORT bez původu požadavku. Za veřejnou proxy ukončující TLS nastavte `https`, pokud není explicitně nastavena proměnná `OMNIROUTE_PROVIDER_MANIFEST_URL`. | -| `OMNIROUTE_TRUST_PROXY` | _(nenastaveno)_ | `src/server/origin/publicOrigin.ts` | Volitelný režim důvěry pro předávané hlavičky veřejného původu. Nenastaveno = při bezpečnostních rozhodnutích nedůvěřovat hlavičkám `Forwarded` / `X-Forwarded-*`. `true` / `loopback` důvěřuje předávanému hostiteli/protokolu pouze od proxy zpětné smyčky označené tokenem. `private` / `lan` důvěřuje také partnerům proxy v privátní síti LAN. V produkci upřednostněte explicitní `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(nenastaveno)_ | `open-sse/utils/kieTask.ts` | Veřejná adresa URL zpětného volání pro asynchronní úlohy kie.ai. Přepsání s nejvyšší prioritou před `OMNIROUTE_KIE_CALLBACK_URL` a `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(nenastaveno)_ | `open-sse/utils/kieTask.ts` | Alternativní zápis proměnné `KIE_CALLBACK_URL`. Použije se jako záložní možnost, pokud primární proměnná není nastavena. | -| `OMNIROUTE_PUBLIC_URL` | _(nenastaveno)_ | `open-sse/utils/kieTask.ts` | Veřejný původ používaný k sestavení adres URL asynchronních zpětných volání. Záložní možnost s nejnižší prioritou pro zpětná volání kie.ai; používá se také jako obecná veřejná adresa URL pro jiné přenosy. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Koncový bod pro zjišťování kvóty CrofAI používaný stránkou Využití. Lze přepsat pro přenosy / testovací data. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Oficiální koncový bod OpenCode Go pro využití, ověřovaný klíčem API a používaný stránkou Využití. Lze přepsat pro přenosy / testovací data. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Syntetizuje hlavičky identity CLI OpenCode (User-Agent, x-opencode-client/project, UUID požadavků/relací) pro upstreamové požadavky opencode-go/zen, které klient neodeslal, aby je Cloudflare při odchozím provozu z VPS přijala (#6210/#5997). Ve výchozím nastavení zapnuto od #10571; vypnutí pomocí `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Výchozí User-Agent používaný, když je zapnuta proměnná `OPENCODE_SYNTHESIZE_CLI_HEADERS` a není nastaveno přepsání `_USER_AGENT` pro konkrétního poskytovatele. Používá se pouze pro executory opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Hodnota syntetizované hlavičky `x-opencode-client`, když je zapnuta proměnná `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Hodnota syntetizované hlavičky `x-opencode-project`, když je zapnuta proměnná `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Adresa URL nastavení Ollama Cloud používaná k získávání údajů o kvótě. Lze přepsat pro přenosy / testovací data. | -| `OLLAMA_USAGE_COOKIE` | _(nenastaveno)_ | `open-sse/services/usage.ts` | Soubor cookie `__Secure-session` služby Ollama Cloud používaný k získávání údajů o kvótě ze stránky nastavení. Citlivý údaj; pokud je nakonfigurováno více účtů, upřednostněte pole řídicího panelu pro jednotlivá připojení. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(nenastaveno)_ | `open-sse/services/usage.ts` | Alternativní proměnná prostředí pro soubor cookie `__Secure-session` služby Ollama Cloud. Citlivý údaj; pokud je nakonfigurováno více účtů, upřednostněte pole řídicího panelu pro jednotlivá připojení. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(nenastaveno)_ | `open-sse/services/usage.ts` | Alternativní proměnná prostředí pro soubor cookie `__Secure-session` služby Ollama Cloud, použitá před kratšími aliasy. Citlivý údaj; pokud je nakonfigurováno více účtů, upřednostněte pole řídicího panelu pro jednotlivá připojení. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Koncový bod limitů využití CodeWhisperer (AWS Kiro). Lze přepsat pro přenosy / testovací data. | +## 7. URL a cloudová synchronizace + +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Adresa URL na straně serveru, kterou interní synchronizační úlohy používají k volání `/api/sync/cloud`. Ponechte ji jako adresu URL zpětné smyčky nebo kontejneru, i když je aplikace veřejně zpřístupněna přes proxy. | +| `CLOUD_URL` | _(prázdné)_ | `src/lib/cloudSync.ts` | Adresa URL koncového bodu cloudového přenosu (prémiová funkce). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Časový limit HTTP pro požadavky cloudové synchronizace. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Konfigurace sestavení Webpacku | Profil při sestavení (nastavením na `minimal` fyzicky vyloučíte privilegované moduly z balíčku). | +| `OMNIROUTE_STANDALONE_DIR` | _výstup samostatného sestavení .build/_ | `scripts/build/colocate-standalone.mjs` | Přepsání adresáře výstupu samostatného sestavení používaného krokem společného umístění po sestavení. Nejde o nastavení za běhu. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(prázdné)_ | `src/lib/cloudSync.ts` | Sdílený tajný klíč používaný k ověření podpisu HMAC-SHA256 odpovědí cloudové synchronizace. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Nastavením na `true` umožníte koncovému bodu cloudové synchronizace přepsat místní přihlašovací údaje. Výchozí hodnota je `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Nastavením na `true` odmítnete nepodepsanou odpověď cloudové synchronizace, pokud není nakonfigurován žádný místní tajný klíč (#13679). Přítomný podpis je ověřen vždy — a pokud není nastavena proměnná `OMNIROUTE_CLOUD_SYNC_SECRET`, je vždy odmítnut — bez ohledu na tento příznak. Od verze v3.9 bude ověřování ve výchozím nastavení vynuceno. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Nastavením na `true` se bez potvrzení uživatele použije jako záložní možnost jednokrokové chování „importovat vše“ z verze v3.8.5. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, řídicí panel, synchronizace | Veřejná adresa URL pro OAuth redirect_uri, odkazy řídicího panelu a generované veřejné adresy URL. Nastavte ji na stabilní veřejnou adresu URL, pokud musí zpětná volání OAuth nebo generované odkazy pro prohlížeč používat kanonického hostitele reverzní proxy. | +| `NEXT_PUBLIC_CLOUD_URL` | _(prázdné)_ | Na straně klienta | Klientská kopie proměnné `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(nenastaveno)_ | `src/shared/services/cloudSyncScheduler.ts` | Zpětná kompatibilita pro `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(nenastaveno)_ | Překladač veřejného původu, adresy URL obrázků | Původ OmniRoute s nejvyšší prioritou určený pro prohlížeče, který se používá ke generování veřejných adres URL a ověřování původu prohlížeče mimo dashboard. Nastavte jej, když OpenWebUI nebo jiný relay přistupuje k OmniRoute prostřednictvím interní adresy URL, ale prohlížeč uživatele musí načítat vygenerovaná média z LAN, tunelu nebo veřejného původu. **Nezahrnujte** `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(nenastaveno)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absolutní adresa URL manifestu pluginu poskytovatele oznamovaná klientům sidecaru. Není-li nastavena, OmniRoute odvodí `/api/v1/provider-plugin-manifest` z původu požadavku nebo HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokol použitý při odvozování adresy URL manifestu pluginu poskytovatele z HOST/PORT bez původu požadavku. Za veřejným proxy ukončujícím TLS nastavte `https`, pokud není explicitně nastaveno `OMNIROUTE_PROVIDER_MANIFEST_URL`. | +| `OMNIROUTE_TRUST_PROXY` | _(nenastaveno)_ | `src/server/origin/publicOrigin.ts` | Volitelný režim důvěryhodnosti pro předávané hlavičky veřejného původu. Nenastaveno = při bezpečnostním rozhodování nedůvěřovat `Forwarded` / `X-Forwarded-*`. `true` / `loopback` důvěřuje předanému hostiteli/protokolu pouze z loopback proxy označeného tokenem. `private` / `lan` důvěřuje také proxy protějškům v privátní LAN. V produkčním prostředí upřednostněte explicitní `NEXT_PUBLIC_BASE_URL`. | +| `KIE_CALLBACK_URL` | _(nenastaveno)_ | `open-sse/utils/kieTask.ts` | Veřejná adresa URL zpětného volání pro asynchronní úlohy kie.ai. Přepsání s nejvyšší prioritou před `OMNIROUTE_KIE_CALLBACK_URL` a `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(nenastaveno)_ | `open-sse/utils/kieTask.ts` | Alternativní zápis `KIE_CALLBACK_URL`. Použije se jako záložní možnost, když primární proměnná není nastavena. | +| `OMNIROUTE_PUBLIC_URL` | _(nenastaveno)_ | `open-sse/utils/kieTask.ts` | Veřejný původ používaný k sestavení adres URL asynchronního zpětného volání. Záložní možnost s nejnižší prioritou pro zpětná volání kie.ai; používá se také jako obecná veřejná adresa URL pro ostatní relay služby. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Koncový bod pro zjišťování kvóty CrofAI používaný stránkou Využití. Lze přepsat pro relay služby / testovací fixtures. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Oficiální koncový bod OpenCode Go pro využití, ověřovaný pomocí klíče API a používaný stránkou Využití. Lze přepsat pro relay služby / testovací fixtures. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Syntetizuje hlavičky identity OpenCode CLI (User-Agent, x-opencode-client/project, UUID požadavků/relací) pro upstream požadavky opencode-go/zen, které klient neodeslal, aby je Cloudflare při odchozím provozu z VPS přijal (#6210/#5997). Od #10571 je ve výchozím nastavení zapnuto; vypnout jej lze pomocí `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Výchozí User-Agent použitý, když je zapnuto `OPENCODE_SYNTHESIZE_CLI_HEADERS` a není nastaveno přepsání `_USER_AGENT` pro konkrétního poskytovatele. Používá se pouze pro executory opencode. U požadavku bez klíče, který upstream omezuje, je nakonfigurovaná hodnota neobsahující `opencode/= 1.17>` nahrazena touto výchozí hodnotou, namísto aby byl požadavek odmítnut. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Hodnota syntetizované hlavičky `x-opencode-client`, když je zapnuto `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Hodnota pro syntetizovanou hlavičku `x-opencode-project`, když je zapnuto `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(nenastaveno)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Nastavte na `off`, chcete-li přestat upravovat tělo bezklíčových požadavků OpenCode (příznak streamování a seznam nástrojů). Hlavičky se nadále používají. Hodnota se načítá pro každý požadavek, takže se změna projeví okamžitě. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(nenastaveno)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Čárkami oddělené názvy nástrojů, které se deklarují v bezklíčovém požadavku OpenCode, jenž žádné neobsahuje, pokud pro daný model ještě nebylo nic zaznamenáno. Prázdná hodnota použije jediný zástupný nástroj, o němž je model instruován, aby jej nevolal. Nejvýše 32 položek, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; neplatné položky jsou ignorovány. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL nastavení Ollama Cloud používaná pro získávání údajů o kvótách. Lze přepsat pro přenosové servery / testovací prostředky. | +| `OLLAMA_USAGE_COOKIE` | _(nenastaveno)_ | `open-sse/services/usage.ts` | Soubor cookie `__Secure-session` služby Ollama Cloud používaný k získávání údajů o kvótách ze stránky nastavení. Citlivý údaj; při konfiguraci více účtů upřednostněte pole pro jednotlivá připojení na řídicím panelu. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(nenastaveno)_ | `open-sse/services/usage.ts` | Alternativní proměnná prostředí pro soubor cookie `__Secure-session` služby Ollama Cloud. Citlivý údaj; při konfiguraci více účtů upřednostněte pole pro jednotlivá připojení na řídicím panelu. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(nenastaveno)_ | `open-sse/services/usage.ts` | Alternativní proměnná prostředí pro soubor cookie `__Secure-session` služby Ollama Cloud, která se použije před kratšími aliasy. Citlivý údaj; při konfiguraci více účtů upřednostněte pole pro jednotlivá připojení na řídicím panelu. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Koncový bod limitů využití služby CodeWhisperer (AWS Kiro). Lze přepsat pro přenosové servery / testovací prostředky. | > [!IMPORTANT] -> Při nasazení za reverzní proxy (nginx, Caddy) nastavte `NEXT_PUBLIC_BASE_URL` na svou stabilní veřejnou adresu URL (např. `https://omniroute.example.com`), pokud musí zpětná volání OAuth nebo generované veřejné odkazy používat tento název hostitele. Bez tohoto nastavení mohou zpětná volání OAuth selhat, protože se hodnota redirect_uri nebude shodovat, a generované veřejné odkazy mohou odkazovat na interní zdroj kontejneru. +> Při nasazení za reverzním proxy serverem (nginx, Caddy) nastavte `NEXT_PUBLIC_BASE_URL` na svou stabilní veřejnou URL (např. `https://omniroute.example.com`), pokud musí zpětná volání OAuth nebo generované veřejné odkazy používat tento název hostitele. Bez tohoto nastavení mohou zpětná volání OAuth selhat, protože se `redirect_uri` nebude shodovat, a generované veřejné odkazy mohou odkazovat na interní původ kontejneru. > -> Proměnnou `BASE_URL` ponechte jako interní adresu URL zpětné smyčky nebo kontejneru pro úlohy komunikující mezi servery. Pro interní požadavky na vlastní službu obsahující přihlašovací údaje nepoužívejte hodnotu `Origin` z prohlížeče ani veřejný název hostitele. +> Ponechte `BASE_URL` jako interní URL zpětné smyčky / kontejneru pro úlohy mezi servery. Pro interní požadavky na sebe sama obsahující přihlašovací údaje nepoužívejte hlavičku `Origin` z prohlížeče ani veřejný název hostitele. > -> Autentizované zápisy z řídicího panelu nevyžadují statickou veřejnou základní adresu URL: řídicí panel odesílá nebezpečné požadavky na stejný zdroj s tokenem CSRF svázaným s relací. OmniRoute nadále centralizuje ověřování veřejného zdroje pro integrace z prohlížečů mimo řídicí panel: explicitní proměnné prostředí s veřejnou adresou URL jsou považovány za důvěryhodné jako první; nezpracované hlavičky `Forwarded` / `X-Forwarded-*` jsou ignorovány, pokud není povolena proměnná `OMNIROUTE_TRUST_PROXY` a bezprostřední partnerský proxy server není pomocí tokenu označen jako důvěryhodný. Nepoužívejte nastavení CORS k opravě požadavků řídicího panelu na stejný zdroj; CORS je určeno pouze pro klienty prohlížeče komunikující napříč zdroji. +> Ověřené zápisy z řídicího panelu nevyžadují statickou veřejnou základní URL: řídicí panel odesílá nebezpečné požadavky stejného původu s tokenem CSRF svázaným s relací. OmniRoute nadále centralizuje ověřování veřejného původu pro integrace prohlížeče mimo řídicí panel: nejprve jsou důvěryhodné explicitní proměnné prostředí veřejné URL; nezpracované hlavičky `Forwarded` / `X-Forwarded-*` jsou ignorovány, pokud není povoleno `OMNIROUTE_TRUST_PROXY` a bezprostřední partnerský proxy server není tokenem označen jako důvěryhodný. Nepoužívejte nastavení CORS k opravě požadavků řídicího panelu stejného původu; CORS je určeno pouze pro klienty prohlížeče z jiného původu. --- @@ -586,49 +593,50 @@ detekci doprovodného procesu). --- -## 11. Přihlašovací údaje poskytovatele OAuth +## 11. Přihlašovací údaje poskytovatelů OAuth Vestavěné přihlašovací údaje pro **vývoj na localhostu**. Pro vzdálená nasazení si zaregistrujte vlastní údaje ve vývojářské konzoli každého poskytovatele. -| Proměnná | Poskytovatel | Poznámky | -| --------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Veřejný klient — není vyžadován žádný tajný klíč. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Přepíše URI přesměrování. Výchozí hodnota: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Veřejný klient. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Vyžaduje odpovídající proměnnou `_SECRET`. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Veřejný klient. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Vyžaduje odpovídající proměnnou `_SECRET`. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Veřejný klient. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Volitelné přepsání ID klienta OAuth pro GitHub Enterprise Copilot. Pokud není nastaveno, použije se veřejná výchozí hodnota proměnné `GITHUB_OAUTH_CLIENT_ID`. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Záložní klíč API používaný souborem `open-sse/executors/devin-cli.ts`, pokud nejsou k dispozici přihlašovací údaje pro konkrétní připojení. Volitelné. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Vlastní cesta k binárnímu souboru Devin CLI (`devin`). Zpracovává ji `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID klienta OAuth pro GitLab Duo. Zaregistrujte aplikaci na adrese `https://gitlab.com/-/profile/applications` s URI přesměrování `/callback` a rozsahy `api, read_user, openid, profile, email`. Jako záloha se použije `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Tajný klíč klienta OAuth pro GitLab Duo. Volitelné — tok PKCE tajný klíč nevyžaduje. Jako záloha se použije `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Přepíše základní URL GitLabu (GitLab provozovaný na vlastní infrastruktuře). Výchozí hodnota je `https://gitlab.com`. Jako záloha se použije `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Starší záložní proměnná pro `GITLAB_DUO_BASE_URL`. Použije se, pokud není nastavena varianta s `_DUO_`. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Starší záložní proměnná pro `GITLAB_DUO_OAUTH_CLIENT_ID`, kterou používá `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Starší záložní proměnná pro `GITLAB_DUO_OAUTH_CLIENT_SECRET`, kterou používá `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Nastavením povolíte OAuth pro Qoder. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Záložní přímý klíč API (obchází OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | ID pracovního prostoru pro Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias pro `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Přepíše adresář konfigurace Qoder CLI (izolovaná relace PAT, zabraňuje přepsání přihlášení v prohlížeči). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontendový token `tk`, který se odesílá jako `validated` na `/api/chat`. Je vyžadován, pokud Blackbox vynucuje shodu tokenů; jinak OmniRoute použije jako zálohu náhodné UUID. Viz problém #2252. | -| `VISION_BRIDGE_BASE_URL` | Ochranná vrstva Vision Bridge | Základní URL kompatibilní s OpenAI pro volání vision bridge mimo Anthropic. Výchozí hodnotou je URL ze starší proměnné prostředí OpenAI nebo api.openai.com. Nastavte ji na vlastní smyčku OmniRoute `/v1` nebo libovolný koncový bod kompatibilní s OpenAI (Gemini kompatibilní s OpenAI, OpenRouter). Problém #2232. Pokud je URL vlastní `/v1` služby OmniRoute, dílčí požadavek popisu odešle `x-omniroute-admission-bypass: internal` a ověří se pomocí přihlašovacího údaje vyřešeného pro vlastní smyčku (zástupná hodnota `sk_omniroute` v místním režimu nebo `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), aby fungovala nasazení s `REQUIRE_API_KEY=true`. | -| `VISION_BRIDGE_API_KEY` | Ochranná vrstva Vision Bridge | Klíč API pro výše uvedenou URL. Pro volání vision bridge mimo Anthropic přepisuje proměnné prostředí OpenAI / Google jednotlivých poskytovatelů. Modely Anthropic nadále používají svou vyhrazenou cestu ke klíči Anthropic. Problém #2232. | +| Proměnná | Poskytovatel | Poznámky | +| --------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Veřejný klient — není vyžadován žádný tajný klíč. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Přepsání URI pro přesměrování. Výchozí hodnota: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Veřejný klient. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Vyžaduje odpovídající `_SECRET`. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Veřejný klient. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Vyžaduje odpovídající `_SECRET`. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Veřejný klient. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Volitelné přepsání ID klienta OAuth pro GitHub Enterprise Copilot. Pokud není nastaveno, použije se veřejná výchozí hodnota `GITHUB_OAUTH_CLIENT_ID`. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Volitelné přepsání ID integrace klienta GitHub Copilot odesílaného v hlavičkách `Copilot-Integration-Id` a `Editor-Plugin-Version`. Výchozí hodnota je `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Záložní klíč API používaný souborem `open-sse/executors/devin-cli.ts`, pokud nejsou k dispozici přihlašovací údaje pro konkrétní připojení. Volitelné. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Vlastní cesta k binárnímu souboru Devin CLI (`devin`). Zpracovává ji `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID klienta OAuth pro GitLab Duo. Zaregistrujte aplikaci na adrese `https://gitlab.com/-/profile/applications` s URI pro přesměrování `/callback` a rozsahy `api, read_user, openid, profile, email`. Záložní hodnota je `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Tajný klíč klienta OAuth pro GitLab Duo. Volitelné — tok PKCE tajný klíč nevyžaduje. Záložní hodnota je `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Přepsání základní adresy URL GitLabu (GitLab provozovaný ve vlastní infrastruktuře). Výchozí hodnota je `https://gitlab.com`. Záložní hodnota je `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Starší záložní proměnná pro `GITLAB_DUO_BASE_URL`. Použije se, pokud není nastavena varianta `_DUO_`. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Starší záložní hodnota pro `GITLAB_DUO_OAUTH_CLIENT_ID`, kterou používá `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Starší záložní hodnota pro `GITLAB_DUO_OAUTH_CLIENT_SECRET`, kterou používá `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Nastavením povolíte Qoder OAuth. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Záložní přímý API klíč (obchází OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | ID pracovního prostoru pro Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias pro `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Přepíše adresář konfigurace Qoder CLI (izolovaná relace PAT, která nenarušuje přihlášení v prohlížeči). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontendový token `tk`, který se odesílá jako `validated` na `/api/chat`. Je vyžadován, když Blackbox vynucuje shodu tokenů; jinak OmniRoute použije jako záložní hodnotu náhodné UUID. Viz problém #2252. | +| `VISION_BRIDGE_BASE_URL` | Ochranný mechanismus Vision Bridge | Základní URL kompatibilní s OpenAI pro volání vision bridge mimo Anthropic. Výchozí hodnotou je starší proměnná prostředí s URL OpenAI nebo api.openai.com. Nastavte ji na vlastní smyčku OmniRoute `/v1` nebo libovolný koncový bod kompatibilní s OpenAI (Gemini OpenAI-compat, OpenRouter). Problém #2232. Když URL odkazuje na vlastní `/v1` služby OmniRoute, dílčí požadavek na popis odesílá `x-omniroute-admission-bypass: internal` a ověřuje se pomocí přihlašovacího údaje vyhodnoceného pro vlastní smyčku (sentinel `sk_omniroute` v místním režimu nebo `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), aby fungovala nasazení s `REQUIRE_API_KEY=true`. | +| `VISION_BRIDGE_API_KEY` | Ochranný mechanismus Vision Bridge | API klíč pro výše uvedenou URL. Přepisuje proměnné prostředí OpenAI / Google pro jednotlivé poskytovatele při voláních vision bridge mimo Anthropic. Modely Anthropic si zachovávají vlastní vyhrazený způsob předávání klíče Anthropic. Problém #2232. | > [!WARNING] > > 1. Přejděte do [Google Cloud Console → Přihlašovací údaje](https://console.cloud.google.com/apis/credentials) > 2. Vytvořte ID klienta OAuth 2.0 (typ: „Webová aplikace“) -> 3. Přidejte URL svého serveru jako autorizovaný identifikátor URI pro přesměrování -> 4. Nahraďte hodnoty přihlašovacích údajů v souboru `.env`. +> 3. Přidejte URL svého serveru jako autorizovaný identifikátor URI přesměrování +> 4. Nahraďte hodnoty přihlašovacích údajů v `.env`. --- @@ -731,13 +739,13 @@ Rozpoznávaný vzor: `{PROVIDER_ID}_API_KEY` ## 15. Nastavení časových limitů -Všechny hodnoty jsou uvedeny v **milisekundách**. Centralizované vyhodnocování v `src/shared/utils/runtimeTimeouts.ts`. +Všechny hodnoty jsou v **milisekundách**. Centralizované vyhodnocování v `src/shared/utils/runtimeTimeouts.ts`. ### Hierarchie časových limitů ``` REQUEST_TIMEOUT_MS (globální přepsání) -├─→ FETCH_TIMEOUT_MS (volání upstream poskytovatelů, výchozí hodnota: 600000) +├─→ FETCH_TIMEOUT_MS (volání externích poskytovatelů, výchozí hodnota: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (dědí z FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (dědí z FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (dědí z FETCH_TIMEOUT_MS) @@ -746,7 +754,7 @@ REQUEST_TIMEOUT_MS (globální přepsání) │ ├── FETCH_CONNECT_TIMEOUT_MS (nezávislý, výchozí hodnota: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (nezávislý, výchozí hodnota: 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (dědí z REQUEST_TIMEOUT_MS, výchozí hodnota: 600000) -├─→ STREAM_ACTIVE_TIMEOUT_MS (nezávislý, výchozí hodnota: 1260000; 0 jej deaktivuje) +├─→ STREAM_ACTIVE_TIMEOUT_MS (nezávislý, výchozí hodnota: 1260000; hodnota 0 jej deaktivuje) ├─→ STREAM_READINESS_TIMEOUT_MS (dědí z REQUEST_TIMEOUT_MS, výchozí hodnota: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (omezuje adaptivní prodlužování připravenosti, výchozí hodnota: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (dědí z REQUEST_TIMEOUT_MS, výchozí hodnota: 30000) @@ -756,114 +764,117 @@ REQUEST_TIMEOUT_MS (globální přepsání) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (výchozí hodnota: 0 = deaktivováno) ``` -| Proměnná | Výchozí hodnota | Popis | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(nenastaveno)_ | Globální zkratka — přepisuje výchozí hodnoty `FETCH_TIMEOUT_MS` i `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Celkový časový limit HTTP požadavku pro volání nadřazených poskytovatelů. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maximální doba nečinnosti mezi nezpracovanými bajty z nadřazeného serveru před přerušením. Modely s rozšířeným uvažováním se málokdy odmlčí na >90 s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Maximální celková doba trvání aktivního SSE streamu; nikdy se neresetuje při přijetí bajtů z nadřazeného serveru a je nezávislá na `REQUEST_TIMEOUT_MS`. Je odvozena od nejvyšší hodnoty `timeoutMs` pro jednotlivé modely v registru (1200000, Codex) s přidanou rezervou 60000, takže model, kterému je povoleno využít celý svůj časový rozpočet, nebude nikdy ukončen uprostřed odpovědi. Nastavením na `0` se deaktivuje. | -| `OMNIROUTE_SSE_COMMENTS` | _(deaktivováno)_ | Určuje, zda může OmniRoute vysílat řádky komentářů SSE `:` (např. prezenční signál `: keepalive` a koncová metadata `x-omniroute-*`). Ve výchozím nastavení je deaktivováno (#10524), protože striktní klienti kompatibilní s OpenAI zpracovávají každý řádek SSE pomocí JSON.parse a při komentářích `:` selžou; prezenční signály `data:` nejsou ovlivněny. Opětovné zapnutí provedete nastavením na `on`/`true`/`1`/`yes`. Používáno souborem `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Doba pro přijetí první události SSE, která není příkazem ping. Pokud je nastaveno `REQUEST_TIMEOUT_MS`, přebírá jeho hodnotu. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maximální adaptivní časové okno připravenosti na první událost pro velké streamované požadavky, požadavky intenzivně využívající nástroje nebo vyžadující rozsáhlé uvažování. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Nouzový vypínač heuristiky `/goal`. Nastavením na `false`/`0`/`off` se detekce zcela deaktivuje — časové limity připravenosti a obnova streamu se nikdy nezvýší na základě těla či hlaviček požadavku, což omezuje klientem řízené prodlužování časových limitů. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maximální časové okno připravenosti na první událost pro detekovaná spuštění agenta `/goal` nebo požadavky vynucené pomocí `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Automaticky aktivuje včasnou obnovu streamu pro detekovaná spuštění agenta `/goal`. Nastavením na `false`/`0`/`off` se přihlášení specifické pro cíl deaktivuje. Tato možnost může obnovu pouze PŘIDAT nad rámec výchozího nastavení operátora — nikdy nepřepíše explicitní odhlášení prostřednictvím nastavení `STREAM_RECOVERY_ENABLED`/DB. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Odstraní nestandardní události SSE `codex.*` (např. `codex.rate_limits`), které způsobují selhání `responses.stream()` sady OpenAI SDK s chybou 502. Ve výchozím nastavení ZAPNUTO (#11014). Nastavením na `0`/`false`/`no`/`off` se budou předávat dál. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(nenastaveno)_ | Volitelně aktivovaný transport app-serveru Codex. Koncový bod WebSocket (`ws://`/`wss://`) místního doprovodného procesu `codex app-server`. Pokud je nastaven společně s tokenem, požadavky Codex jsou směrovány přes JSON-RPC do doprovodného procesu namísto rozhraní HTTP Responses API. Lze také nastavit pro každé připojení prostřednictvím `providerSpecificData.codexAppServerUrl`. Používáno souborem `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(nenastaveno)_ | Přímo zadaný token schopností / nosný token předkládaný app-serveru. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(nenastaveno)_ | Cesta k souboru obsahujícímu token schopností app-serveru (z `codex app-server --ws-token-file`). Použije se, pokud není nastaveno `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN`. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Pracovní adresář, ve kterém běží iterace app-serveru. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(nenastaveno)_ | Zásady schvalování předávané iteraci app-serveru (např. `never`, `on-request`). Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(nenastaveno)_ | Zásady sandboxu předávané iteraci app-serveru (např. `read-only`, `workspace-write`, `danger-full-access`). Pokud nejsou nastaveny, executor ve výchozím nastavení použije `workspace-write` (zabezpečené; dříve `danger-full-access`). Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Automaticky schvaluje vlastní výzvy app-serveru ke schválení (spouštění příkazů, práce se soubory či oprávněními na hostiteli). Ve výchozím nastavení vypnuto — výzvy jsou automaticky zamítnuty; volání nástrojů testovacího prostředí nejsou ovlivněna (procházejí odděleným kanálem `item/tool/call`). Přijímá hodnoty `true`/`1`/`yes`. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Doba pro přijetí hlaviček odpovědi. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Maximální doba čekání na zahájení odpovědi (ms) pro každý přímý pokus bez proxy. Po vypršení časového limitu se pokus jednou zopakuje na novém socketu; nastavením na `0` limit zakážete a zachováte předchozí chování. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Doba pro přijetí celého těla odpovědi. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Časový limit pro navázání připojení TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Časový limit nečinnosti socketu keep-alive. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Časový limit proxy pro TLS fingerprint (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Omezuje dobu do přijetí prvního bajtu konkrétně u těla přenášeného přes transport TLS fingerprint wreq-js; samotný `TLS_CLIENT_TIMEOUT_MS` nedokáže zachytit zablokované tělo, protože se vyhodnotí ihned po přijetí hlaviček (#12656). Po vypršení časového limitu se čtečka wreq zruší a použije se přímý/proxy dispatcher; hodnota `0` watchdog zakáže. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Pouze pro executor OpenCode a pouze v případě, že je zapnutý příznak funkce `OPENCODE_RESPONSES_STALL_ROTATION` (ve výchozím nastavení vypnutý): omezuje dobu čekání na první bajt těla streamované odpovědi Responses po přijetí jejích hlaviček (#13484). Stream Responses se otevře událostí `response.created`, takže pokud ticho překročí toto časové okno, jde o zablokování: účet přejde do režimu cooldown a požadavek se jednou přesměruje na další účet; druhé zablokování okamžitě skončí chybou. Hodnota `0` ochranu zakáže, i když je příznak zapnutý. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Časový limit průchodu přes proxy pro požadavky bridge `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Nasměruje executor Firecrawl pro načítání webového obsahu na instanci hostovanou ve vlastní infrastruktuře (mimo cloud je klíč API volitelný). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Časový limit jednotlivého požadavku pro executor Firecrawl pro načítání webového obsahu. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Celkový časový limit serverového požadavku pro bridge. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Doba pro odeslání hlaviček odpovědi prostřednictvím bridge. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Časový limit nečinnosti keep-alive pro bridge. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Časový limit nezpracovaného socketu (0 = zakázáno). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Doba odkladu po SIGTERM/SIGINT před vynuceným ukončením. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Záložní hodnota používaná souborem `src/shared/utils/fetchTimeout.ts`, když není nastavena proměnná `FETCH_TIMEOUT_MS`. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Časový limit (ms) pro předvolby `validationRead` a `modelsProbe` v souboru `src/shared/network/safeOutboundFetch.ts`. U pomalých endpointů (Cerebras, Cloudflare AI, Groq) jej zvyšte, abyste v dashboardu zabránili kolísání mezi stavy active/error. Pro neplatné (<1000) nebo nečíselné hodnoty se použije záložní hodnota 8000ms. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Časový limit načítání specifický pro relay v souboru `open-sse/utils/proxyFetch.ts` (#9158). Zablokovaný relay musí selhat dříve než vyprší časový limit klienta/agenta (~30s), aby volající místo obecného časového limitu upstreamu obdrželi chybu specifickou pro relay. Maximální hodnota je omezena na `29000`, aby tento limit vždy vypršel jako první. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Sdílená prodleva mezi opakovanými pokusy pro cesty s jedním opakováním přes direct/relay/proxy v souboru `open-sse/utils/proxyFetch.ts` (#9158). `0` = opakovat okamžitě. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Nativní časový limit požadavku wreq-js (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absolutní dodatečná doba pevného limitu JS přidaná k nativnímu časovému limitu. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Nativní časový limit požadavku wreq-js (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absolutní dodatečná doba pevného limitu JS přidaná k nativnímu časovému limitu. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (vypnuto) | Připojí větu „You have built-in web search. Answer questions directly using search results.“ k systémové zprávě volajícího (`perplexity-web/protocol.ts`). Ve výchozím nastavení je vypnuto — Perplexity vyhledává i tak a tato věta se v odpovědích pro programovací klienty objevuje jako metakomentář. Nastavením na `1`/`true`/`yes`/`on` ji obnovíte. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Časový limit nativního požadavku wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Dodatečná rezerva absolutního pevného termínu v JS přidaná k nativnímu časovému limitu. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Časový limit nativního požadavku wreq-js (`notionTlsClient.ts`); `notion-web` jej pro každý požadavek zvyšuje na `180000` u dlouhých generování. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Dodatečná rezerva absolutního pevného termínu v JS přidaná k nativnímu časovému limitu. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Sdílený fond prohlížečů Playwright pro chat s webovými soubory cookie využívající prohlížeč (`browserPool.ts`); nastavením na `off` jej zakážete. | -| `OBSCURA_BIN` | `auto-detect` | Cesta k binárnímu souboru `obscura`, který fond prohlížečů a executor Cloudflare Playground používají jako primární engine (`open-sse/services/obscura.ts`); není-li nastavena, automaticky se zjistí ze systémové proměnné PATH. | -| `OBSCURA_CDP_ENDPOINT` | _(nenastaveno)_ | Umožňuje namísto spuštění nové instance použít již běžící Obscuru (`http://host:port`); modul tento proces nevlastní (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `náhodný volný port` | Explicitní port pro spuštěný příkaz `obscura serve`; není-li nastaven, automaticky se vybere volný port (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Přepne požadavek chatu s webovými soubory cookie na cestu využívající prohlížeč (`browserBackedChat.ts`); povolíte nastavením na `1`. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Základní URL executoru Kimi Web (mezinárodní kimi.ai Connect-RPC) (`kimi-web.ts`); měňte pouze pro koncové body zrcadla/proxy. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Úplný koncový bod chatu pro executor Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(zjištěno automaticky)_ | Cesta k systémovému spustitelnému souboru Chrome/Edge pro interaktivní přihlášení k Adobe Firefly v prohlížeči (`adobeFireflyBrowserLogin.ts`); přepíše automatické zjištění specifické pro daný OS. | -| `OMNIROUTE_STANDALONE_DIR` | _samostatný výstup .build/_ | Přepsání výstupního adresáře samostatného sestavení při sestavování, který používá krok kolokace po sestavení (`scripts/build/colocate-standalone.mjs`); jde o nástroj pro sestavení, nikoli o nastavení běhového prostředí. | +| Proměnná | Výchozí hodnota | Popis | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUEST_TIMEOUT_MS` | _(nenastaveno)_ | Globální zkratka — přepisuje výchozí hodnoty `FETCH_TIMEOUT_MS` i `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Celkový časový limit HTTP požadavku pro volání nadřazeného poskytovatele. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maximální doba nečinnosti mezi nezpracovanými bajty z nadřazeného zdroje před přerušením. Modely s rozšířeným uvažováním se zřídka pozastaví na >90 s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Maximální celková doba trvání aktivního streamu SSE; nikdy se neresetuje při příjmu bajtů z nadřazeného zdroje a je nezávislá na `REQUEST_TIMEOUT_MS`. Je odvozena z nejvyšší hodnoty `timeoutMs` pro jednotlivé modely v registru (1200000, Codex) s přidanou rezervou 60000, takže model, kterému je povoleno využít celý časový rozpočet, nebude nikdy ukončen uprostřed odpovědi. Nastavením na `0` ji zakážete. | +| `OMNIROUTE_SSE_COMMENTS` | _(zakázáno)_ | Určuje, zda může OmniRoute vysílat řádky komentářů SSE `:` (např. prezenční signál `: keepalive` a koncová metadata `x-omniroute-*`). Ve výchozím nastavení je tato možnost zakázána (#10524), protože striktní klienti kompatibilní s OpenAI zpracovávají každý řádek SSE pomocí JSON.parse a při komentářích `:` selžou; prezenčních signálů `data:` se to netýká. Opětovné zapnutí provedete nastavením `on`/`true`/`1`/`yes`. Používáno v `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Doba pro přijetí první události SSE, která není ping. Pokud je nastavena hodnota `REQUEST_TIMEOUT_MS`, převezme ji. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maximální adaptivní časové okno připravenosti na první událost pro velké streamované požadavky, požadavky intenzivně využívající nástroje nebo vyžadující rozsáhlé uvažování. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Nouzový vypínač heuristiky `/goal`. Nastavením `false`/`0`/`off` detekci zcela zakážete — časové limity připravenosti ani obnovení streamu se nikdy nezvýší na základě těla či hlaviček požadavku, čímž se zmírní klientem řízené prodlužování časových limitů. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maximální časové okno připravenosti na první událost pro detekovaná spuštění agenta `/goal` nebo požadavky vynucené pomocí `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Automaticky povolí včasné obnovení streamu pro detekovaná spuštění agenta `/goal`. Nastavením `false`/`0`/`off` zakážete volbu specifickou pro cíl. Tato možnost může obnovení pouze PŘIDAT nad rámec výchozího nastavení provozovatele — nikdy nepřepíše explicitní odhlášení prostřednictvím nastavení `STREAM_RECOVERY_ENABLED`/DB. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Odstraní nestandardní události SSE `codex.*` (např. `codex.rate_limits`), které způsobují selhání `responses.stream()` sady OpenAI SDK s chybou 502. Ve výchozím nastavení ZAPNUTO (#11014). Nastavením `0`/`false`/`no`/`off` je budete předávat dál. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(nenastaveno)_ | Volitelný transport přes app-server Codex. WebSocketový koncový bod (`ws://`/`wss://`) místního pomocného procesu `codex app-server`. Pokud je nastaven společně s tokenem, požadavky Codex jsou směrovány přes JSON-RPC do pomocného procesu namísto HTTP Responses API. Lze nastavit také pro jednotlivá připojení pomocí `providerSpecificData.codexAppServerUrl`. Používáno v `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(nenastaveno)_ | Vložený token oprávnění/bearer token předávaný app-serveru. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(nenastaveno)_ | Cesta k souboru obsahujícímu token oprávnění app-serveru (z `codex app-server --ws-token-file`). Použije se, pokud není nastaveno `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN`. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Pracovní adresář, ve kterém běží tah app-serveru. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(nenastaveno)_ | Zásady schvalování předávané tahu app-serveru (např. `never`, `on-request`). Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(nenastaveno)_ | Zásady sandboxu předávané tahu app-serveru (např. `read-only`, `workspace-write`, `danger-full-access`). Pokud nejsou nastaveny, výchozí hodnotou exekutoru je `workspace-write` (zabezpečená varianta; dříve `danger-full-access`). Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Automaticky schvaluje vlastní výzvy app-serveru ke schválení (spouštění příkazů/práce se soubory/udělování oprávnění na hostiteli). Ve výchozím nastavení je vypnuto — výzvy jsou automaticky zamítnuty; volání nástrojů řídicího prostředí nejsou ovlivněna (procházejí samostatným kanálem `item/tool/call`). Přijímá hodnoty `true`/`1`/`yes`. Přepsání pro jednotlivá připojení: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Doba pro přijetí hlaviček odpovědi. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Maximální doba čekání na zahájení odpovědi (ms) pro každý přímý pokus bez proxy. Po vypršení časového limitu se pokus jednou zopakuje na novém socketu; nastavením na `0` omezení zakážete a zachováte předchozí chování. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Horní mez (ms) pro OPAKOVANÝ pokus na novém socketu po výše uvedeném vypršení časového limitu pro zahájení odpovědi u pokusu ze sdíleného fondu (#13703). Platí pouze tehdy, když volající již připojil vlastní signál termínu (kaskáda vyřešeného připojení/modelu/poskytovatele/`FETCH_TIMEOUT_MS`); tento signál představuje skutečné omezení a v zamýšleném průběhu se aktivuje jako první, takže toto je velkorysé záložní omezení, nikoli pevný limit — bez něj opakovaný pokus znovu používal stejné krátké okno `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` jako pokus ze sdíleného fondu a u funkčních modelů s pomalým TTFB pro uvažování způsoboval chybu 504. Hodnota nikdy nesmí být nižší než výše uvedená pevná spodní mez; pokud volající neposkytne vůbec žádný signál termínu, opakovaný pokus zachová pevnou spodní mez beze změny. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Doba pro přijetí celého těla odpovědi. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Časový limit pro navázání připojení TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Časový limit nečinnosti socketu keep-alive. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Časový limit proxy s otiskem TLS (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Omezuje konkrétně dobu do přijetí prvního bajtu těla v přenosu s otiskem TLS přes wreq-js; samotný `TLS_CLIENT_TIMEOUT_MS` nedokáže zachytit zaseknuté tělo, protože se vyhodnotí jako dokončený ihned po přijetí hlaviček (#12656). Vypršení časového limitu zruší čtečku wreq a přepne na přímý/proxy dispatcher; hodnota `0` watchdog zakáže. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Pouze pro executor OpenCode a pouze tehdy, když je zapnutý příznak funkce `OPENCODE_RESPONSES_STALL_ROTATION` (ve výchozím nastavení vypnuto): omezuje čekání na první bajt těla streamované odpovědi Responses po přijetí jejích hlaviček (#13484). Stream Responses se otevře událostí `response.created`, takže nečinnost přesahující toto okno znamená zaseknutí: účet přejde do režimu dočasného pozastavení a požadavek se jednou přesměruje na další účet; druhé zaseknutí okamžitě skončí chybou. Hodnota `0` ochranu zakáže i při zapnutém příznaku. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Časový limit průchodu přes proxy pro požadavky mostu `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Nasměruje executor Firecrawl pro načítání webu na instanci provozovanou ve vlastní infrastruktuře (mimo cloud je klíč API volitelný). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Časový limit jednotlivého požadavku pro executor Firecrawl pro načítání webu. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Celkový časový limit požadavku serveru pro most. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Doba pro odeslání hlaviček odpovědi prostřednictvím mostu. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Časový limit nečinnosti keep-alive pro most. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Časový limit nezpracovaného socketu (0 = zakázáno). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Odklad po SIGTERM/SIGINT před vynuceným ukončením. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Záložní hodnota používaná souborem `src/shared/utils/fetchTimeout.ts`, pokud není nastavena proměnná `FETCH_TIMEOUT_MS`. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Časový limit (ms) pro předvolby `validationRead` a `modelsProbe` v souboru `src/shared/network/safeOutboundFetch.ts`. U pomalých koncových bodů (Cerebras, Cloudflare AI, Groq) jej zvyšte, abyste na řídicím panelu zabránili kolísání mezi stavy aktivní/chyba. U neplatných (<1000) nebo nečíselných hodnot se použije záložní hodnota 8000 ms. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Časový limit načítání specifický pro relay v souboru `open-sse/utils/proxyFetch.ts` (#9158). Zaseknutý relay musí selhat před vypršením časového limitu klienta/agenta (~30 s), aby volající místo obecného vypršení časového limitu upstreamu obdrželi chybu specifickou pro relay. Omezeno maximální hodnotou `29000`, aby se vždy aktivovalo jako první. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Sdílená prodleva opakování pro cesty přímého/relay/proxy jednorázového opakování v souboru `open-sse/utils/proxyFetch.ts` (#9158). `0` = opakovat okamžitě. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Nativní časový limit požadavku wreq-js (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Dodatečná doba k absolutnímu pevnému časovému limitu JS přidaná nad rámec nativního časového limitu. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Nativní časový limit požadavku wreq-js (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Dodatečná doba k absolutnímu pevnému časovému limitu JS přidaná nad rámec nativního časového limitu. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (vypnuto) | Připojí větu „Máte integrované webové vyhledávání. Odpovídejte na otázky přímo pomocí výsledků vyhledávání.“ k systémové zprávě volajícího (`perplexity-web/protocol.ts`). Ve výchozím nastavení vypnuto — Perplexity vyhledává i tak a tato věta proniká do odpovědí jako metakomentář pro programovací klienty. Nastavením na `1`/`true`/`yes`/`on` ji obnovíte. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Nativní časový limit požadavku wreq-js (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Dodatečná doba k absolutnímu pevnému časovému limitu JS přidaná nad rámec nativního časového limitu. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Nativní časový limit požadavku wreq-js (`notionTlsClient.ts`); `notion-web` jej u jednotlivých požadavků zvyšuje na `180000` pro dlouhá generování. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Dodatečná doba k absolutnímu pevnému časovému limitu JS přidaná nad rámec nativního časového limitu. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Sdílený fond prohlížečů Playwright pro chat využívající webové soubory cookie a prohlížeč (`browserPool.ts`); nastavením na `off` jej zakážete. | +| `OBSCURA_BIN` | `auto-detect` | Cesta k binárnímu souboru `obscura`, který fond prohlížečů a spouštěč Cloudflare Playground používají jako primární engine (`open-sse/services/obscura.ts`); pokud není nastavena, automaticky se zjistí ze systémové proměnné PATH. | +| `OBSCURA_CDP_ENDPOINT` | _(nenastaveno)_ | Umožňuje místo spuštění nové instance použít již běžící Obscuru (`http://host:port`); modul tento proces nespravuje (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `náhodný volný port` | Explicitní port pro spuštěný příkaz `obscura serve`; pokud není nastaven, automaticky se zvolí volný port (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Přepne požadavek chatu využívajícího webové soubory cookie na cestu podporovanou prohlížečem (`browserBackedChat.ts`); povolíte nastavením na `1`. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Základní URL pro spouštěč Kimi Web (mezinárodní kimi.ai Connect-RPC) (`kimi-web.ts`); přepište pouze pro zrcadlené/proxy endpointy. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Úplný endpoint chatu pro spouštěč Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(automaticky zjištěno)_ | Cesta k systémovému spustitelnému souboru Chrome/Edge pro interaktivní přihlášení k Adobe Firefly v prohlížeči (`adobeFireflyBrowserLogin.ts`); přepisuje automatickou detekci pro jednotlivé operační systémy. | +| `OMNIROUTE_STANDALONE_DIR` | _výstup samostatného sestavení .build/_ | Přepsání výstupního adresáře samostatného sestavení při sestavení, který používá krok kolokace po sestavení (`scripts/build/colocate-standalone.mjs`); týká se sestavovacích nástrojů, nikoli běhu aplikace. | Pokusy o cíle kombinace dědí vyřešený časový limit požadavku upstreamu (`FETCH_TIMEOUT_MS`, nebo -`REQUEST_TIMEOUT_MS`, pokud poskytuje výchozí hodnotu pro fetch). Nastavte `targetTimeoutMs` v kombinaci, -ve výchozích hodnotách kombinace nebo v přepsání poskytovatele pouze tehdy, chcete-li zrychlit přechod kombinace na záložní cíl; hodnoty vyšší než -aktuální časový limit upstreamu jsou omezeny na časový limit upstreamu. - -`comboTimeoutMs` je samostatný celkový časový rozpočet kombinace podle nástěnných hodin napříč cíli převzetí služeb při selhání. -Ponechte jej nenastavený nebo jej nastavte na `0`, chcete-li zachovat neomezené iterování (stále platí -10minutové ukončení při zamrznutí `COMBO_LOOP_SAFETY_TIMEOUT_MS`). Kladná hodnota tuto -bezpečnostní pojistku pro kombinaci nahradí. Nastavte `comboTimeoutMs` na delší dobu než `targetTimeoutMs`, aby po -pomalém prvním cíli stále zbýval čas na přechod na záložní cíl. +`REQUEST_TIMEOUT_MS`, pokud určuje výchozí hodnotu pro fetch). Nastavte `targetTimeoutMs` v kombinaci, +ve výchozích hodnotách kombinace nebo v přepsání poskytovatele pouze tehdy, chcete-li urychlit přechod +kombinace na záložní cíl; hodnoty vyšší než aktuální časový limit upstreamu jsou omezeny na časový limit +upstreamu. + +`comboTimeoutMs` představuje samostatný celkový časový rozpočet kombinace podle nástěnných hodin napříč +cíli převzetí služeb při selhání. Ponechte jej nenastavený nebo nastavte na `0`, chcete-li zachovat +neomezené opakování (stále platí desetiminutové nouzové ukončení při zamrznutí +`COMBO_LOOP_SAFETY_TIMEOUT_MS`). Kladná hodnota tuto bezpečnostní pojistku pro kombinaci nahrazuje. +Nastavte `comboTimeoutMs` na delší dobu než `targetTimeoutMs`, aby po pomalém prvním cíli stále zbýval +čas na přechod na záložní cíl. ### Prahové hodnoty jističe Ladění jističe na úrovni poskytovatele. Výchozí hodnoty odpovídají škálovaným hodnotám používaným od verze v3.6 pro více než 500 připojení. -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ------------------------------------------------------------- | --------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Práh počtu po sobě jdoucích selhání poskytovatelů OAuth, po jehož dosažení se jistič aktivuje. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Interval resetování (ms) jističe poskytovatele OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Práh počtu po sobě jdoucích selhání poskytovatelů používajících klíč API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Interval resetování (ms) jističe poskytovatele používajícího klíč API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Práh počtu po sobě jdoucích selhání lokálních poskytovatelů (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Interval resetování (ms) jističe lokálního poskytovatele. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: počet selhání v rámci intervalu, po kterém celý poskytovatel OAuth přejde do režimu čekání. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: klouzavý interval (ms) pro počítání selhání poskytovatelů OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: doba čekání (ms) po dosažení prahu poskytovatele OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Poskytovatel OAuth přejde po tomto počtu selhání do stavu DEGRADED. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Maximální násobitel zvyšování `resetTimeout` pro poskytovatele OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Poskytovatel OAuth zvýší úroveň zpětného čekání po tomto počtu cyklů otevření. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: počet selhání v rámci intervalu, po kterém celý poskytovatel používající klíč API přejde do režimu čekání. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: klouzavý interval (ms) pro počítání selhání poskytovatelů používajících klíč API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: doba čekání (ms) po dosažení prahu poskytovatele používajícího klíč API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Poskytovatel používající klíč API přejde po tomto počtu selhání do stavu DEGRADED. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Maximální násobitel zvyšování `resetTimeout` pro poskytovatele používajícího klíč API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Poskytovatel používající klíč API zvýší úroveň zpětného čekání po tomto počtu cyklů otevření. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: počet selhání, po kterém celý lokální poskytovatel přejde do režimu čekání. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: klouzavý interval (ms) pro počítání selhání lokálních poskytovatelů. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: doba čekání (ms) po dosažení prahu lokálního poskytovatele. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Úroveň zpětného čekání, při které je poskytovatel připnutí mezipaměti kontextu považován za trvale nedostupného a připnutí je zrušeno za účelem převzetí služeb při selhání. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Interval proti kolísání (ms), který toleruje krátká přechodná období čekání před zrušením připnutí mezipaměti kontextu. | +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ------------------------------------------------------------- | --------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Prahový počet po sobě jdoucích selhání poskytovatelů OAuth, po jehož dosažení se jistič aktivuje. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Interval resetování (ms) jističe poskytovatele OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Prahový počet po sobě jdoucích selhání poskytovatelů používajících klíč API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Interval resetování (ms) jističe poskytovatele používajícího klíč API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Prahový počet po sobě jdoucích selhání místních poskytovatelů (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Interval resetování (ms) jističe místního poskytovatele. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: počet selhání v rámci intervalu, po kterém celý poskytovatel OAuth přejde do režimu čekání. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: klouzavý interval (ms) pro počítání selhání poskytovatelů OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: doba čekání (ms) po dosažení prahové hodnoty poskytovatele OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Poskytovatel OAuth přejde do stavu DEGRADED při tomto počtu selhání. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Maximální násobitel prodlužování `resetTimeout` poskytovatele OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Poskytovatel OAuth zvýší úroveň prodlevy po tomto počtu cyklů otevření. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: počet selhání v rámci intervalu, po kterém celý poskytovatel používající klíč API přejde do režimu čekání. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: klouzavý interval (ms) pro počítání selhání poskytovatelů používajících klíč API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: doba čekání (ms) po dosažení prahové hodnoty poskytovatele používajícího klíč API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Poskytovatel používající klíč API přejde do stavu DEGRADED při tomto počtu selhání. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Maximální násobitel prodlužování `resetTimeout` poskytovatele používajícího klíč API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Poskytovatel používající klíč API zvýší úroveň prodlevy po tomto počtu cyklů otevření. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: počet selhání, po kterém celý místní poskytovatel přejde do režimu čekání. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: klouzavý interval (ms) pro počítání selhání místních poskytovatelů. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Jistič na úrovni poskytovatele: doba čekání (ms) po dosažení prahové hodnoty místního poskytovatele. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Úroveň exponenciální prodlevy, při které je poskytovatel připnutí mezipaměti kontextu považován za dlouhodobě nedostupného a připnutí je zrušeno, aby bylo možné přepnout na záložního poskytovatele. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Ochranný interval proti kolísání (ms), který toleruje krátká přechodná období čekání před zrušením připnutí mezipaměti kontextu. | ### Scénáře -| Scénář | Konfigurace | -| --------------------------------------- | -------------------------------------------------- | -| **Dlouhotrvající generování kódu** | `REQUEST_TIMEOUT_MS=900000` (15 min) | -| **Omezení celkové doby trvání streamu** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | -| **Rychlé selhání produkčního API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Modely s rozšířeným uvažováním** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min mezi bloky) | +| Scénář | Konfigurace | +| -------------------------------------- | ------------------------------------------------------ | +| **Dlouhotrvající generování kódu** | `REQUEST_TIMEOUT_MS=900000` (15 min) | +| **Omezení celkové životnosti streamu** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | +| **Rychlé selhání produkčního API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Modely s rozšířeným uvažováním** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min mezi bloky dat) | --- @@ -1110,66 +1121,66 @@ desktopovou instalaci. --- -## 21. Stav proxy serveru - -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ------------------------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Časový limit rychlé kontroly stavu při selhání. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Časové okno (v hodinách) pro výpočet průměrné latence kandidátních proxy ve strategii fondu optimalizované podle latence. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL mezipaměti výsledků kontroly stavu. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL mezipaměti pro neúspěšné sondy stavu proxy. Udržujte ji kratší než `PROXY_HEALTH_CACHE_TTL_MS`, aby se přechodná vypršení časového limitu proxy při vysoké souběžnosti rychle opakovala, aniž by se deaktivovalo rychlé selhání pro skutečně nefunkční proxy. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Nastavením na `false` zakážete plánovač kontrol stavu proxy na pozadí, který pravidelně testuje registrované proxy. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval průchodů plánovače kontrol stavu na pozadí v ms (minimálně `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Cíl sondy dostupnosti používaný plánovačem a koncovým bodem `/api/settings/proxies/auto-test`. Chcete-li se vyhnout výchozímu veřejnému cíli, nastavte interní URL nebo URL hostované ve vlastní infrastruktuře. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Počet sond spuštěných současně v jedné dávce, sdílený plánovačem a koncovým bodem `/api/settings/proxies/auto-test`. Minimální hodnota je 1 a maximální 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Prodleva v ms mezi odesláním dvou sond v rámci dávky. Bez ní se celá dávka odešle ve stejný okamžik a sdílená odchozí IP adresa může aktivovat omezení rychlosti cíle. Nastavením na `0` rozestupy zakážete; maximální hodnota je 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Nastavením na `false` ukončíte testování skutečného hostitele poskytovatele přiřazeného k proxy (`GET /models`, bez klíče API) a místo toho se vždy použije `PROXY_HEALTH_TEST_URL`. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Při hodnotě `false` (výchozí) jsou automatizované sondy dostupnosti (plánovač + tlačítko „Testovat vše“ koncového bodu `/api/settings/proxies/auto-test`) **pouze pro čtení** a nikdy nezapisují stav proxy — aktivní/neaktivní stav nastavuje pouze operátor, takže nespolehlivá sonda nemůže vyřadit přiřazenou proxy (#6246). Nastavením na `true` obnovíte původní chování testování a nastavení stavu. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Volitelný příznak funkce (viz [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); přepsání z DB řídicího panelu má přednost). Hodnota `true` (nebo `1`, `yes`) zobrazí na řídicím panelu pod fondem proxy pozorování odchozího provozu fondu pouze pro čtení (jedinečné odchozí IP adresy, připojení a nejvyšší počet zaznamenaný za jednou IP adresou za posledních 24 hodin, získaný z protokolu proxy). Nikdy se nepoužívá ke směrování. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Nastavením na `true` umožníte plánovači automaticky odebírat proxy po opakovaných po sobě jdoucích selháních. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Počet po sobě jdoucích selhání, po kterých plánovač automaticky odebere proxy (když je `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Nastavením na `true` umožníte plánovači po opakovaných po sobě jdoucích selháních proxy dočasně deaktivovat (stav `dead`, bez odstranění) namísto jejího odebrání. Jde o nedestruktivní alternativu k `PROXY_AUTO_REMOVE`: proxy je okamžitě vyřazena z rozlišení fondu/rotace (filtr živého stavu používaný rozlišením fondu rozsahu ji již vylučuje) a automaticky se znovu aktivuje, jakmile začne sondami opět procházet. Sdílí prahovou hodnotu `PROXY_AUTO_REMOVE_AFTER`. Pokud jsou oba příznaky `true`, má přednost `PROXY_AUTO_REMOVE`. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Umožní tokům OAuth a ověřování poskytovatele obejít připnutou proxy a připojit se přímo, pokud předběžné kontroly dostupnosti proxy selžou. Efektivní pořadí priorit je: přepsání z DB příznaků funkcí > proměnná prostředí > výchozí hodnota. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `open-sse/services/rateLimitManager.ts` | Maximální doba čekání při odpovědi 429 před ukončením požadavku jako neúspěšného. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Horní mez doby, po kterou smí přijatý požadavek zůstat ve zpracování, než vyprší jeho rezervace omezení rychlosti — je oddělena od rozpočtu čekání ve frontě, aby pomalé zahájení načítání na neinkrementálních branách nevedlo k vypršení časového limitu (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (zakázáno) | `open-sse/services/rateLimitManager.ts` | Limit přijímání do fronty: jakmile je ve frontě již tento počet požadavků, požadavek se odmítne odpovědí 429 `queue_full`. `0` = bez omezení (výchozí). | -| `RATE_LIMIT_AUTO_ENABLE` | _(nenastaveno)_ | `open-sse/services/rateLimitManager.ts` | Vynutí zapnutí nebo vypnutí automatické ochranné funkce omezení rychlosti bez ohledu na trvale uložené nastavení řídicího panelu. Hodnoty `true`/`1`/`on` vynutí zapnutí, hodnoty `false`/`0`/`off` vynutí vypnutí. | -| `PROVIDER_COOLDOWN_ENABLED` | _(nenastaveno → vypnuto)_ | `open-sse/services/providerCooldownTracker.ts` | Volitelné globální sledování doby pozastavení poskytovatele/připojení napříč požadavky. Ve výchozím nastavení je VYPNUTO (překrývá se s funkcemi Connection Cooldown / Provider Circuit Breaker). Zapnete je hodnotou `true`/`1`/`on`. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimální doba pozastavení (ms), než se neúspěšný poskytovatel nebo připojení znovu vyzkouší. S po sobě jdoucími selháními se exponenciálně prodlužuje. Používá se pouze tehdy, když je povoleno `PROVIDER_COOLDOWN_ENABLED`. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Maximální limit doby pozastavení (ms), po jehož uplynutí se neúspěšný poskytovatel nebo připojení znovu vyzkouší bez ohledu na okolnosti. Používá se pouze tehdy, když je povoleno `PROVIDER_COOLDOWN_ENABLED`. | -| `STREAM_RECOVERY_ENABLED` | _(nenastaveno → vypnuto)_ | `src/lib/resilience/settings.ts` (počáteční hodnota) → `open-sse/services/streamRecovery.ts` (logika) | **Co dělá:** transparentní obnovení zkrácených nadřazených streamů (port z free-claude-code). Pozdrží úvodní okno SSE až o `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), takže se přerušení _před potvrzením_ — tedy takové, k němuž dojde dříve, než ke klientovi dorazí jakýkoli bajt — neviditelně znovu otevře a zopakuje. **Kdy zapnout:** u nespolehlivých nadřazených služeb, které na začátku streamu často ukončí přenos po 0 bajtech; ponechte VYPNUTO, pokud si nemůžete dovolit až 750 ms navíc do prvního tokenu u každého streamu. Přijímá `true`/`1`/`on`. Nastavuje počáteční hodnotu trvale uloženého nastavení odolnosti; po nastavení má přednost hodnota z řídicího panelu. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(nenastaveno → vypnuto)_ | `src/lib/resilience/settings.ts` (počáteční hodnota) → `open-sse/services/streamRecovery.ts` (logika) | **Co dělá:** pokračování uprostřed streamu (Fáze 4.4) — po zkrácení _po potvrzení_ (bajty již dorazily ke klientovi) odešle požadavek znovu s částečným textem jako předvyplněnou odpovědí asistenta a připojí chybějící příponu. Pouze pro prosté textové streamy kompatibilní s OpenAI; nikdy se nespustí během probíhajícího volání nástroje. **Kdy zapnout:** u dlouhých generování, která se přeruší uprostřed odpovědi, pokud akceptujete, že obnovený zbytek dorazí najednou, nikoli token po tokenu. Nezávisí na `STREAM_RECOVERY_ENABLED` (odlišný rizikový profil). Přijímá `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(nenastaveno → vypnuto)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Volitelný hlídač užitečného výstupu aktivního streamu. Detekuje streamy, které nadále odesílají části dat, ale zůstávají pod nakonfigurovanou rychlostí výstupu asistenta; prezenční signály, události využití, prázdné rozdíly ani fáze nástrojů či uvažování se nevydávají za pokrok. Funguje odděleně od časových limitů nečinnosti a pevných termínů. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Doba odkladu před vyhodnocením propustnosti, omezená na 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Klouzavé okno užitečného výstupu, omezené na 1000–600000 ms; před přerušením musí uplynout jedno celé okno. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimální rychlost výstupu asistenta v bajtech UTF-8 (konzervativní aproximace tokenů), omezená na 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Minimální nenulový vzorek užitečného výstupu považovaný za měřitelný, omezený na 1–1000000 bajtů. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Interval rozložení (ms) mezi kontrolami stavu tokenů poskytovatele při spuštění. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimální náhodné kolísání (ms) přidané k `HEALTHCHECK_STAGGER_MS` mezi kontrolami stavu tokenů poskytovatele, aby se zabránilo nárazovému zatížení (problém #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maximální náhodné kolísání (ms) přidané k `HEALTHCHECK_STAGGER_MS` mezi kontrolami stavu tokenů poskytovatele, aby se zabránilo nárazovému zatížení (problém #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Velikost dávky souběžných kontrol při úvodním průchodu kontrol stavu tokenů; vyšší hodnoty kontrolují více připojení paralelně, nižší hodnoty snižují nárazové zatížení (problém #7875, regrese #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Počet automatických opakování při odpovědích s pozastavením omezeným na model před vrácením chyby klientovi. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maximální interval exponenciálního čekání (v sekundách) mezi opakováními po pozastavení. Bez ohledu na nadřazenou hodnotu `Retry-After` je omezen touto hodnotou. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL proxy Headroom pro úsporu tokenů. Životní cyklus řídicího panelu (`api/headroom/*`) ve výchozím nastavení spouští místní CLI `headroom-ai` na adrese zpětné smyčky; hodnotu přepište pouze tehdy, chcete-li použít externí doprovodnou proxy v Dockeru. | - -### Konstanty ladění obnovy streamu - -Chování zadržení při obnově je vyladěno pomocí konstant napevno zadaných v +## 21. Stav proxy serverů + +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ------------------------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Časový limit rychlé kontroly stavu při selhání. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Časové okno (v hodinách) pro výpočet průměrné latence kandidátních proxy serverů ve strategii fondu optimalizované podle latence. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL mezipaměti výsledků kontroly stavu. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL mezipaměti pro neúspěšné kontroly stavu proxy serverů. Nastavte ji kratší než `PROXY_HEALTH_CACHE_TTL_MS`, aby se při přechodných vypršeních časového limitu proxy serverů při vysoké souběžnosti pokusy rychle opakovaly, aniž by se deaktivovalo rychlé selhání pro skutečně nefunkční proxy servery. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Nastavením na `false` zakážete plánovač kontroly stavu proxy serverů na pozadí, který pravidelně testuje registrované proxy servery. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval cyklu plánovače kontroly stavu na pozadí v ms (minimálně `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Cíl kontroly dostupnosti používaný plánovačem a endpointem `/api/settings/proxies/auto-test`. Nastavte jej na interní / vlastní hostovanou URL, abyste se vyhnuli výchozí veřejné službě. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Počet kontrol spouštěných současně v každé dávce, sdílený plánovačem a endpointem `/api/settings/proxies/auto-test`. Zaokrouhluje se dolů, minimálně na 1, a je omezen na maximálně 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Prodleva v ms mezi zahájením dvou kontrol v rámci dávky. Bez ní se celá dávka odešle ve stejný okamžik a sdílená výstupní IP adresa může narazit na omezení frekvence požadavků cíle. Nastavením na `0` rozestupy zakážete; maximální hodnota je 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Nastavením na "false" se přestane kontrolovat skutečný hostitel poskytovatele přiřazeného proxy serveru (`GET /models`, bez API klíče) a místo něj se bude vždy používat `PROXY_HEALTH_TEST_URL`. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Při hodnotě `false` (výchozí) jsou automatizované kontroly dostupnosti (plánovač + tlačítko "Test All" endpointu `/api/settings/proxies/auto-test`) **pouze pro čtení** a nikdy nezapisují stav proxy serveru — aktivní či neaktivní stav nastavuje pouze operátor, takže nespolehlivá kontrola nemůže vyřadit přiřazený proxy server (#6246). Nastavením na `true` obnovíte původní chování, které stav testuje a nastavuje. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Volitelný příznak funkce (viz [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); přepsání hodnoty v databázi řídicího panelu má přednost). Hodnota `true` (nebo `1`, `yes`) zobrazí v řídicím panelu pod fondem proxy serverů pozorování výstupního provozu fondu pouze pro čtení (odlišné výstupní IP adresy, připojení a nejvyšší počet zaznamenaný za jednou IP adresou za posledních 24 h podle protokolu proxy serveru). Nikdy se nepoužívá pro směrování. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Nastavením na `true` umožníte plánovači automaticky odebírat proxy servery po opakovaných po sobě jdoucích selháních. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Počet po sobě jdoucích selhání, po kterých plánovač automaticky odebere proxy server (když je nastaveno `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Nastavením na `true` umožníte plánovači po opakovaných po sobě jdoucích selháních proxy server softwarově deaktivovat (stav `dead`, nikdy nebude odstraněn), namísto jeho odstranění. Nedestruktivní alternativa k `PROXY_AUTO_REMOVE`: proxy server je okamžitě vyřazen z vyhodnocování fondu/rotace (filtr aktivního stavu používaný při vyhodnocování fondu v rámci rozsahu jej již vylučuje) a je automaticky znovu aktivován, jakmile začne opět úspěšně procházet sondami. Sdílí prahovou hodnotu `PROXY_AUTO_REMOVE_AFTER`. Pokud jsou oba příznaky nastaveny na `true`, přednost má `PROXY_AUTO_REMOVE`. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Umožňuje tokům OAuth a ověřování poskytovatele obejít připnutý proxy server a připojit se přímo, když selžou předběžné kontroly dostupnosti proxy serveru. Platné pořadí priorit je: přepsání v databázi příznaků funkcí > proměnná prostředí > výchozí hodnota. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `src/lib/resilience/settings.ts` | Výchozí rozpočet **čekání ve frontě**: jak dlouho může požadavek čekat na slot poskytovatele a zůstat ve frontě, než bude odmítnut, aniž by se kdy dostal k nadřazené službě. Časovač se zruší, jakmile se úloha začne provádět — provádění je omezeno samostatně pomocí `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Proměnná prostředí nastavuje pouze výchozí hodnotu: uložené nastavení `resilienceSettings.requestQueue.maxWaitMs` a následně nastavení `rateLimitOverrides.maxWaitMs` pro jednotlivá připojení mají před touto hodnotou přednost. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Horní limit doby, po kterou může přijatý požadavek zůstat ve fázi provádění, než vyprší platnost jeho rezervace limitu rychlosti — je oddělen od rozpočtu čekání ve frontě, aby pomalé zahájení načítání na neinkrementálních branách nezpůsobilo vypršení časového limitu (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deaktivováno) | `open-sse/services/rateLimitManager.ts` | Limit přijímání do fronty: pokud je již ve frontě tento počet požadavků, odmítne další požadavek s odpovědí 429 `queue_full`. `0` = bez omezení (výchozí). | +| `RATE_LIMIT_AUTO_ENABLE` | _(nenastaveno)_ | `open-sse/services/rateLimitManager.ts` | Vynutí zapnutí nebo vypnutí bezpečnostní sítě automatického povolení limitu rychlosti bez ohledu na uložené nastavení na ovládacím panelu. Hodnoty `true`/`1`/`on` vynutí zapnutí, hodnoty `false`/`0`/`off` vynutí vypnutí. | +| `PROVIDER_COOLDOWN_ENABLED` | _(nenastaveno → vypnuto)_ | `open-sse/services/providerCooldownTracker.ts` | Volitelné globální sledování doby pozastavení poskytovatele/připojení napříč požadavky. Ve výchozím nastavení je VYPNUTO (překrývá se s funkcemi pozastavení připojení / jističe poskytovatele). Hodnotami `true`/`1`/`on` jej lze povolit. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimální doba pozastavení (ms), než se znovu zkusí připojit k poskytovateli / navázat připojení, u kterého došlo k selhání. S po sobě jdoucími selháními se exponenciálně prodlužuje. Používá se pouze při povolení `PROVIDER_COOLDOWN_ENABLED`. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Maximální limit doby cooldownu (ms), po jehož uplynutí se neúspěšný poskytovatel/připojení znovu vyzkouší bez ohledu na okolnosti. Používá se pouze při zapnutém `PROVIDER_COOLDOWN_ENABLED`. | +| `STREAM_RECOVERY_ENABLED` | _(nenastaveno → vypnuto)_ | `src/lib/resilience/settings.ts` (počáteční hodnota) → `open-sse/services/streamRecovery.ts` (logika) | **Co:** transparentní obnovení předčasně ukončených upstreamových streamů (port z free-claude-code). Pozdrží úvodní okno SSE až o `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), takže se přerušení _před potvrzením_ — k němuž dojde dříve, než se ke klientovi dostane jakýkoli bajt — neviditelně znovu otevře a zopakuje. **Kdy zapnout:** u nespolehlivých upstreamů, které často ukončují stream bez přenesení jediného bajtu hned na začátku; ponechte VYPNUTÉ, pokud si u každého streamu nemůžete dovolit prodloužení doby do prvního tokenu až o 750 ms. Přijímá `true`/`1`/`on`. Nastavuje počáteční hodnotu trvalého nastavení odolnosti; jakmile je nastavení v Dashboardu nakonfigurováno, má přednost. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(nenastaveno → vypnuto)_ | `src/lib/resilience/settings.ts` (počáteční hodnota) → `open-sse/services/streamRecovery.ts` (logika) | **Co:** pokračování uprostřed streamu (fáze 4.4) — po přerušení _po potvrzení_ (bajty se již dostaly ke klientovi) znovu odešle požadavek s částečným textem jako předvyplněnou odpovědí asistenta a připojí chybějící příponu. Pouze pro prosté textové streamy kompatibilní s OpenAI; nikdy se nespustí, pokud právě probíhá volání nástroje. **Kdy zapnout:** u dlouhých generování, která se přeruší uprostřed odpovědi, pokud akceptujete, že obnovená koncová část dorazí najednou namísto token po tokenu. Nezávislé na `STREAM_RECOVERY_ENABLED` (odlišný rizikový profil). Přijímá `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(nenastaveno → vypnuto)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Volitelný watchdog užitečného výstupu aktivního streamu. Detekuje streamy, které nadále odesílají bloky dat, ale zůstávají pod nakonfigurovanou rychlostí výstupu asistenta; heartbeat zprávy, události využití, prázdné delty ani fáze používání nástrojů či uvažování se nevydávají za průběh. Funguje odděleně od časových limitů nečinnosti a pevných konečných termínů. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Doba odkladu před vyhodnocením propustnosti, omezená na 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Klouzavé okno užitečného výstupu, omezené na 1000–600000 ms; před přerušením je vyžadováno jedno celé okno. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimální rychlost výstupu asistenta v bajtech UTF-8 (konzervativní aproximace tokenů), omezená na 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Minimální nenulový vzorek užitečného výstupu považovaný za měřitelný, omezený na 1–1000000 bajtů. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Interval rozložení (ms) mezi kontrolami stavu tokenů poskytovatelů při spuštění. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimální náhodné kolísání (ms) přidané k `HEALTHCHECK_STAGGER_MS` mezi kontrolami stavu tokenů poskytovatelů, aby se zabránilo nárazovému zatížení (problém #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maximální náhodné kolísání (ms) přidané k `HEALTHCHECK_STAGGER_MS` mezi kontrolami stavu tokenů poskytovatelů, aby se zabránilo nárazovému zatížení (problém #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Velikost dávky souběžných kontrol při úvodním ověřování stavu tokenů; vyšší hodnoty kontrolují více připojení paralelně, nižší hodnoty snižují nárazové zatížení (problém #7875, regrese #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Počet automatických opakování při odpovědích indikujících omezení na úrovni modelu před vrácením chyby klientovi. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maximální interval exponenciálního čekání (v sekundách) mezi opakovanými pokusy při omezení. Bez ohledu na upstreamovou hodnotu `Retry-After` je omezen touto hodnotou. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL proxy pro úsporu tokenů Headroom. Životní cyklus řídicího panelu (`api/headroom/*`) ve výchozím nastavení spouští místní CLI `headroom-ai` na loopback rozhraní; hodnotu přepište pouze tehdy, chcete-li odkazovat na externí proxy typu Docker sidecar. | + +### Konstanty pro ladění obnovy streamu + +Chování odloženého odesílání při obnově je vyladěno pomocí konstant napevno zadaných v `open-sse/config/constants.ts` (`STREAM_RECOVERY`), které jsou zde uvedeny pro referenci — jejich změna vyžaduje úpravu kódu, nikoli proměnné prostředí: -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — jak dlouho je počáteční okno SSE zadržováno, - aby bylo možné časné přerušení zopakovat dříve, než je klientovi odeslán jakýkoli bajt. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — pevný limit zadržovaného okna; potvrzení - (vyprázdnění + průchozí režim) proběhne, jakmile se nashromáždí tento počet bajtů, bez ohledu na časovač. +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — jak dlouho je úvodní okno SSE zadrženo, + aby bylo možné v případě předčasného ukončení pokus zopakovat dříve, než se klientovi odešle jakýkoli bajt. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — pevný limit zadrženého okna; jakmile se + nashromáždí tento počet bajtů, data se odešlou (vyprázdnění bufferu + přímé předávání) bez ohledu na časovač. - `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — maximální počet transparentních opětovných otevření upstreamového - streamu, dokud zadržení ještě nebylo potvrzeno. + streamu, dokud zadržená data ještě nebyla odeslána. -> **Limit frekvence s posuvným oknem pro jednotlivé poskytovatele (bez proměnné prostředí):** záložní -> limit frekvence s posuvným oknem pro jednotlivé poskytovatele, převzatý z FCC, existuje v kódu +> **Limit četnosti s posuvným oknem pro jednotlivé poskytovatele (bez proměnné prostředí):** záložní +> limit četnosti s posuvným oknem pro jednotlivé poskytovatele převzatý z FCC existuje v kódu > (`open-sse/services/providerDefaultRateLimit.ts`, zapojený prostřednictvím -> `open-sse/services/rateLimitManager.ts`), ale dodává se s **prázdnou výchozí mapou** -> a aktuálně **nemá žádnou provozní proměnnou prostředí** — povoluje se pouze prostřednictvím testovacího hooku / +> `open-sse/services/rateLimitManager.ts`), ale je dodáván s **prázdnou výchozí mapou** +> a v současnosti **nemá žádnou operátorskou proměnnou prostředí** — aktivuje se pouze prostřednictvím testovacího hooku / > úpravy kódu. Záměrně není uveden v tabulce výše. Omezovač relé pro jednotlivé dvojice `(token, IP)`, > který _má_ nastavovací parametr, je `RELAY_IP_PER_MINUTE` (§3 Síť a porty). @@ -1180,32 +1191,33 @@ jejich změna vyžaduje úpravu kódu, nikoli proměnné prostředí: > [!CAUTION] > Tyto proměnné vytvářejí **podrobný výstup** a mohou odhalit citlivá data. **Nikdy je nepovolujte v produkčním prostředí.** -| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | -| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CURSOR_DEBUG` | _(nenastaveno)_ | `open-sse/executors/cursor.ts` | Nastavením na `1` povolíte podrobné protokoly executoru Cursor (dekódované bloky SSE atd.). | -| `CURSOR_STREAM_DEBUG` | _(nenastaveno)_ | `open-sse/executors/cursor.ts` | Zpětně kompatibilní alias proměnné `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(nenastaveno)_ | `open-sse/executors/cursor.ts` | Volitelná cesta k souboru, do kterého se při `CURSOR_DEBUG=1` ukládají nezpracované dekódované bloky Cursor. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Časový limit nečinnosti streamu (ms) pro executor Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Doba odkladu (ms) po měkkém ukončovacím prvku `kv_after_text` nástroje composer, pokud ve vyrovnávací paměti zbývají bajty — poskytuje následnému volání nástroje `exec_mcp` čas na dokončení jeho rámce. | -| `CURSOR_TOOL_DIRECTIVE` | povoleno (`!== "0"`) | `open-sse/executors/cursor.ts` | Direktiva pro potvrzení nástroje, která zajišťuje, že composer-2.5 spolehlivě provádí volání nástrojů. Nastavením na `0` ji zakážete. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(nenastaveno)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Text systémové výzvy definovaný operátorem, který se připojí k systémové zprávě PO překladu (injektáž po překladu) a dostane se do cest codex/Responses a `/v1/messages`. Používá se také jako prefix direktivy odstraňovaný z opakovaných bloků systémní preambule. Chcete-li tuto funkci zakázat, ponechte proměnnou nenastavenou. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Časový limit načtení jednotlivého obrázku (ms) pro vzdálený vstup zpracování obrazu `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(zjišťováno)_ | `open-sse/utils/cursorVersionDetector.ts` | Přepíše umístění stavové databáze IDE Cursor používané ke zjištění verze IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(detekovat / připnout)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ID sestavení Agent CLI (`YYYY.MM.DD-`) pro `x-cursor-client-version: cli-…` při spuštění agenta. | -| `CURSOR_AGENT_BIN` | _(nenastaveno)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cesta k binárnímu souboru Cursor Agent používanému ke generování obrázků. Pokud není nastavena, handler použije `providerSpecificData.agentBin` a poté PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Celkový časový limit na jeden obrázek (ms) pro úlohy generování obrázků pomocí Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Omezení souběžnosti sdíleného účtu pro úlohy generování obrázků Cursor. | -| `CURSOR_IMG_MODEL` | požadavek / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Přepíše volbu `--model` rozhraní Cursor CLI pro úlohy generování obrázků. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Interval dotazování na výsledek generování obrázku UC (uncensored.com) (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Celkový časový limit dotazování na výsledek generování obrázku UC (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Interval dotazování na výsledek generování videa UC (uncensored.com) (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Celkový časový limit dotazování na výsledek generování videa UC (ms). | -| `CURSOR_DATA_DIR` | _(zjišťováno)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Přepíše datový adresář Cursor Agent CLI (`…/versions/`); stejnou proměnnou používá oficiální agent. | -| `CURSOR_TOKEN` | _(nenastaveno)_ | `scripts/ad-hoc/cursor-tap.cjs` | Přímý bearer token Cursor používaný vývojářskými nástroji. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | zakázáno (povoluje se pomocí `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Při nastavení na `"1"` protokoluje značky typu a délky obsahu velkých datových částí chatu. Ve výchozím nastavení je vypnuto, aby se omezil šum v protokolech. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(nenastaveno)_ | `open-sse/handlers/responseTranslator.ts` | Nastavením na `true` povolíte protokolování podrobností překladu SSE→JSON rozhraní Responses API. | -| `DEBUG_CLAUDE_NONSTREAM` | _(nenastaveno)_ | `open-sse/handlers/responseTranslator.ts` | Nastavením na `true` zobrazíte prázdné bloky `textContent` v cestě překladu odpovědi Claude (pouze pro ladění). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(nenastaveno)_ | Testovací prostředí E2E | Nastavením na `true` povolíte testovací režim E2E (zmírněné ověřování, testovací hooky). | +| Proměnná | Výchozí hodnota | Zdrojový soubor | Popis | +| ------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(nenastaveno)_ | `open-sse/executors/cursor.ts` | Nastavením na `1` povolíte podrobné protokoly exekutoru Cursor (dekódované bloky SSE atd.). | +| `CURSOR_STREAM_DEBUG` | _(nenastaveno)_ | `open-sse/executors/cursor.ts` | Zpětně kompatibilní alias proměnné `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(nenastaveno)_ | `open-sse/executors/cursor.ts` | Volitelná cesta k souboru, do kterého se při `CURSOR_DEBUG=1` zapisují nezpracované dekódované bloky Cursor. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Časový limit nečinnosti streamu (ms) pro exekutor Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Dodatečné časové okno (ms) po měkkém ukončovači `composer kv_after_text`, pokud ve vyrovnávací paměti zbývají bajty — poskytuje následnému volání nástroje `exec_mcp` čas na dokončení jeho rámce. | +| `CURSOR_TOOL_DIRECTIVE` | povoleno (`!== "0"`) | `open-sse/executors/cursor.ts` | Direktiva potvrzení nástroje, která zajišťuje, že composer-2.5 spolehlivě provádí volání nástrojů. Nastavením na `0` ji zakážete. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(nenastaveno)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Text systémového promptu definovaný operátorem, který se připojí k systémové zprávě PO překladu (injekce po překladu) a dostane se do cest codex/Responses a `/v1/messages`. Používá se také jako prefix direktivy odstraňovaný z bloků zopakované systémové preambule. Ponecháním bez nastavení tuto funkci zakážete. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (vypnuto) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Nastavením na `1` odstraníte bloky zopakované preambule systémového promptu ze začátku streamu openai→claude. Ve výchozím nastavení je tato funkce vypnutá — heuristiky jsou přizpůsobeny anglické próze a mění datový obsah odpovědi, takže odpověď, která legitimně začíná takovou sekcí, by o ni přišla. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Časový limit načtení jednoho obrázku (ms) pro vzdálený vizuální vstup `image_url`. | +| `CURSOR_STATE_DB_PATH` | _(zjišťováno)_ | `open-sse/utils/cursorVersionDetector.ts` | Přepíše vyhledávání stavové databáze IDE Cursor používané ke zjištění verze IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(zjistit / připnout)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ID sestavení Agent CLI (`YYYY.MM.DD-`) pro `x-cursor-client-version: cli-…` při spuštění agenta. | +| `CURSOR_AGENT_BIN` | _(nenastaveno)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cesta k binárnímu souboru Cursor Agent používanému ke generování obrázků. Pokud není nastavena, obslužná rutina použije `providerSpecificData.agentBin` a poté PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Maximální reálná doba na obrázek (ms) pro úlohy generování obrázků pomocí Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Omezení souběžnosti sdíleného slotu pro úlohy generování obrázků Cursor. | +| `CURSOR_IMG_MODEL` | požadavek / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Přepíše model Cursor CLI zadaný pomocí `--model` pro úlohy generování obrázků. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Interval dotazování na výsledek generování obrázků UC (uncensored.com) (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Maximální reálná doba dotazování na výsledek generování obrázků UC (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Interval dotazování na výsledek generování videí UC (uncensored.com) (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Maximální reálná doba dotazování na výsledek generování videí UC (ms). | +| `CURSOR_DATA_DIR` | _(zjišťováno)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Přepíše datový adresář Cursor Agent CLI (`…/versions/`); jde o stejnou proměnnou, jakou používá oficiální agent. | +| `CURSOR_TOKEN` | _(nenastaveno)_ | `scripts/ad-hoc/cursor-tap.cjs` | Přímý bearer token Cursor používaný vývojářskými nástroji. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | zakázáno (volitelně přes `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Pokud je nastavena hodnota `"1"`, zaznamenává značky typu a délky obsahu u velkých datových obsahů chatu. Ve výchozím nastavení je vypnuto, aby se omezil šum v protokolech. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(nenastaveno)_ | `open-sse/handlers/responseTranslator.ts` | Nastavením na `true` povolíte protokolování podrobností překladu SSE→JSON rozhraní Responses API. | +| `DEBUG_CLAUDE_NONSTREAM` | _(nenastaveno)_ | `open-sse/handlers/responseTranslator.ts` | Nastavením na `true` zobrazíte prázdné bloky `textContent` v cestě překladu odpovědi Claude (pouze pro ladění). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(nenastaveno)_ | Testovací infrastruktura E2E | Nastavením na `true` povolíte testovací režim E2E (zmírněné ověřování, testovací hooky). | --- diff --git a/docs/i18n/cs/docs/reference/FEATURE_FLAGS.md b/docs/i18n/cs/docs/reference/FEATURE_FLAGS.md index 6c891cf30131..4dd61b38ae8b 100644 --- a/docs/i18n/cs/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/cs/docs/reference/FEATURE_FLAGS.md @@ -44,163 +44,165 @@ Příznak typu boolean se považuje za **povolený**, pokud je jeho efektivní h ## Katalog příznaků -72 příznaků v 6 kategoriích. **Výchozí hodnota** je výchozí hodnota definice — hodnota -použitá, pokud není přítomno přepsání z DB ani proměnná prostředí. +74 příznaků v 6 kategoriích. **Výchozí hodnota** je hodnota uvedená v definici — použije se, +pokud není přítomno přepsání z DB ani proměnná prostředí. ### Zabezpečení (10) -| Klíč | Typ | Výchozí hodnota | Popis | -| --------------------------------------- | ------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Vyžadovat klíč API pro všechny příchozí požadavky. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Povolit sanitizaci vstupu pro všechny požadavky. | -| `INJECTION_GUARD_MODE` | enum | `off` | Režim ochrany před prompt injection. Hodnoty: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Redigovat osobní identifikační údaje v požadavcích (nezávisle na `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Sanitizovat osobní identifikační údaje v odpovědích poskytovatelů. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Režim sanitizace osobních identifikačních údajů v odpovědích. Hodnoty: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Blokovat odchozí požadavky na privátní/interní rozsahy IP adres. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Umožnit ověřeným uživatelům řídicího panelu zobrazit uložené klíče API namísto pouhého zobrazení maskovaných hodnot. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Zahrnout prefix účtu do řádků protokolu AUTH (např. „Používá se účet poskytovatele : abc12345...“). Ve výchozím nastavení je zakázáno, aby byly identifikátory účtů redigovány ve sdílených/víceklientských protokolech procesu. Nezávisí na režimu ladění; jeho přepnutí tuto informaci nezobrazí. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Když je povoleno OIDC, zakázat přihlašování heslem, aby se uživatelé mohli ověřovat pouze prostřednictvím jednotného přihlašování OIDC. Když je zakázáno (výchozí nastavení), je k dispozici přihlašování heslem i OIDC. | - -### Síť (15) - -| Klíč | Typ | Výchozí | Restart | Popis | -| ----------------------------------------------- | ------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Povolit režim maskování otisku TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Povolit trasám /v1/audio/* používat uzly poskytovatelů kompatibilní s OpenAI, které jsou hostovány mimo localhost. Ve výchozím nastavení vypnuto — směrování zvuku na vzdáleného hostitele mění identitu výstupního připojení a musí být výslovným rozhodnutím provozovatele. Uzly zpětné smyčky jsou vždy povoleny a toto nastavení je neovlivňuje. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Pokud připojení nemá přiřazenou proxy, automaticky vybrat první funkční proxy z registru. Ve výchozím nastavení vypnuto (jinak se libovolná proxy v registru stává globální záložní možností — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Povolit tokům OAuth a ověřování poskytovatelů obejít pevně nastavenou proxy a připojit se přímo, pokud selžou předběžné kontroly dostupnosti proxy. Ve výchozím nastavení vypnuto, protože to může změnit výstupní IP adresu. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Při síťové výjimce (vypršení časového limitu, odmítnutí/resetování připojení) u vykonavatele rotace více účtů, pokud účet, u něhož došlo k selhání, nemá vyhrazenou proxy, použít krátkou dobu čekání a po zbytek požadavku přeskočit ostatní účty bez proxy namísto opakování pokusu pro každý z nich. Ve výchozím nastavení zapnuto (bezpečné: nedochází ke změně výstupní IP adresy, pouze se snižuje riziko latence/doby čekání u účtů se sdíleným výstupem). Vypnutím obnovíte okamžité propagování při první výjimce účtu bez proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Fondy proxy a rotace opencode pro jednotlivé účty přestanou znovu nabízet proxy, která právě selhala (odmítnutý test TCP nebo odpověď 429 přijatá přes tuto proxy), na dobu v rámci procesu, která se při každém opakování zdvojnásobí až do stanoveného maxima. Stav proxy se nezapisuje; pokud jsou všichni kandidáti odloženi stranou, výběr se nezmění. Ve výchozím nastavení vypnuto. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Zobrazit na řídicím panelu u fondu proxy, kolik pozorovaných výstupních IP adres obsluhovalo jeho členy za posledních 24 h a kolik připojení je použilo. Pouze pro čtení, vypočítáváno z protokolu proxy a nikdy nepoužíváno pro směrování. Ve výchozím nastavení vypnuto. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | U vykonavatele OpenCode sledovat první bajt těla streamované odpovědi Responses (interval: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, výchozí hodnota `15000`). Stream Responses se stavem 2xx, který zůstane po uplynutí tohoto intervalu bez dat, je považován za zaseknutý: účet přejde do doby čekání a požadavek se jednou přesměruje na další účet; druhé zaseknutí okamžitě selže. Ve výchozím nastavení vypnuto: zaseknuté streamy nadále čekají jako dnes až do vypršení časového limitu připravenosti streamu. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Vykonavatel OpenCode: při odpovědi 403/451 obsahující odmítnutí `user_blocked` (nikoli kvůli zeměpisné poloze ani odmítnutí otisku Cloudflare) přepnout odmítnutý účet do doby čekání a nejvýše jednou za požadavek přejít na další účet; druhé odmítnutí se vrátí beze změny, bez označení úspěchu. Ve výchozím nastavení vypnuto: obcházení blokace uživatele na straně upstreamu směrováním může působit jako pokus o obcházení a rozšířit příznak napříč celou flotilou. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotace OpenCode: po dvou po sobě jdoucích přechodných selháních upstreamu (5xx nebo prázdná odpověď 400) pozastavit přechod na další účet — 1,5 s s dvojnásobným prodloužením při každém dalším selhání, maximálně 6 s na jedno pozastavení a 10 s na požadavek; při odpojení klienta se pozastavení přeskočí. Tělo neúspěšné odpovědi se před čekáním uvolní. Ve výchozím nastavení vypnuto: převzetí služeb při selhání zůstává okamžité. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotace OpenCode: zastavit vlnu účtů při první odpovědi 429 klasifikované jako skutečné omezení rychlosti (zpracovatelná hlavička `Retry-After` nebo tělo zmiňující limit rychlosti či využití) a vrátit tuto upstreamovou odpověď 429 beze změny. Neklasifikované odpovědi 429 pokračují v rotaci. Ve výchozím nastavení vypnuto: bezplatná úroveň je omezena podle výstupní IP adresy (#9611), takže každá odpověď 429 vyvolá rotaci a vyčerpaná vlna vrátí poslední upstreamovou odpověď 429. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Zakázat ověřování certifikátu TLS pro MITM proxy. **Nebezpečné.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Povolit adresy URL poskytovatelů odkazující na soukromé/interní sítě. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Povolit přidávání/ověřování poskytovatelů na místních/soukromých adresách (127.0.0.1, localhost, LAN). Ve výchozím nastavení zapnuto (přednostně místní); vypnutím aktivujete striktní blokování všeho kromě veřejných adres. Cloudová metadata zůstávají blokována. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Povolit režim poskytovatele kompatibilního s Claude Code. | +| Klíč | Typ | Výchozí hodnota | Popis | +| --------------------------------------- | ------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Vyžadovat klíč API pro všechny příchozí požadavky. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Povolit sanitizaci vstupu pro všechny požadavky. | +| `INJECTION_GUARD_MODE` | enum | `off` | Režim ochrany proti injektáži promptů. Hodnoty: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Redigovat PII z požadavků (nezávisle na `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Sanitizovat PII z odpovědí poskytovatele. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Režim sanitizace PII v odpovědích. Hodnoty: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Blokovat odchozí požadavky směřující do privátních/interních rozsahů IP adres. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Umožnit ověřeným uživatelům řídicího panelu zobrazit uložené klíče API namísto pouhého zobrazení maskovaných hodnot. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Zahrnout prefix účtu do řádků protokolu AUTH (např. „Using account: abc12345...“). Ve výchozím nastavení je tato možnost zakázána, takže identifikátory účtů jsou ve sdílených/víceklientských protokolech procesu redigovány. Je nezávislá na režimu ladění; přepnutí režimu ladění tyto údaje neodhalí. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Když je povoleno OIDC, zakázat přihlašování heslem, aby se uživatelé mohli ověřovat pouze prostřednictvím jednotného přihlašování OIDC. Když je tato možnost zakázána (výchozí stav), je k dispozici přihlašování heslem i OIDC. | + +### Síť (16) + +| Klíč | Typ | Výchozí hodnota | Restart | Popis | +| ----------------------------------------------- | ------- | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Povolí režim maskování otisku TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Umožní trasám /v1/audio/* používat uzly poskytovatelů kompatibilní s OpenAI hostované mimo localhost. Ve výchozím nastavení je vypnuto — směrování audia na vzdáleného hostitele mění identitu odchozího připojení a musí být výslovným rozhodnutím operátora. Uzly zpětné smyčky jsou vždy povoleny a toto nastavení je neovlivňuje. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Umožní požadavku POST /v1/rerank (a kroku opětovného řazení přes zpětnou smyčku v paměťovém enginu) používat uzly poskytovatelů kompatibilní s OpenAI hostované mimo localhost. Ve výchozím nastavení je vypnuto — směrování na vzdáleného hostitele mění identitu odchozího připojení a musí být výslovným rozhodnutím operátora. Uzly zpětné smyčky jsou vždy povoleny; vzdálené uzly musí také vyhovět zásadám poskytovatele pro odchozí URL. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Pokud připojení nemá přiřazenou žádnou proxy, automaticky vybere první funkční proxy z registru. Ve výchozím nastavení je vypnuto (jinak se jakákoli proxy v registru stane globální záložní možností — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Umožní tokům ověřování OAuth a validace poskytovatele obejít pevně přiřazenou proxy a připojit se přímo, když předběžné kontroly dostupnosti proxy selžou. Ve výchozím nastavení je vypnuto, protože to může změnit odchozí IP adresu. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Pokud u exekutoru s rotací více účtů dojde k síťové výjimce (vypršení časového limitu, odmítnutí/resetování připojení) a selhávající účet nemá vyhrazenou proxy, použije krátkou dobu pozastavení a po zbytek požadavku přeskočí ostatní účty bez proxy namísto opakování pokusu pro každý z nich. Ve výchozím nastavení je zapnuto (bezpečné: nedochází ke změně odchozí IP adresy, pouze se snižuje riziko latence/pozastavení u účtů se sdíleným odchozím připojením). Vypnutím obnovíte okamžité předání první výjimky účtu bez proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Fondy proxy a rotace opencode pro jednotlivé účty přestanou po dobu platnosti v rámci procesu znovu nabízet proxy, která právě selhala (odmítnutá sonda TCP nebo odpověď 429 přijatá jejím prostřednictvím). Tato doba se při každém opakování zdvojnásobí až do stanoveného maxima. Stav proxy se nezapisuje; pokud jsou všichni kandidáti odloženi stranou, volba zůstává beze změny. Ve výchozím nastavení je vypnuto. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Zobrazí na řídicím panelu u fondu proxy, kolik pozorovaných odchozích IP adres obsluhovalo jeho členy za posledních 24 h a kolik připojení je použilo. Pouze pro čtení, vypočítáváno z protokolu proxy a nikdy nepoužíváno ke směrování. Ve výchozím nastavení je vypnuto. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | U exekutoru OpenCode sleduje první bajt těla streamované odpovědi Responses (interval: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, výchozí hodnota `15000`). Stream Responses s kódem 2xx, který zůstane po uplynutí intervalu bez dat, je považován za zaseknutý: účet je dočasně pozastaven a požadavek se jednou přesměruje na další účet; při druhém zaseknutí okamžitě selže. Ve výchozím nastavení je vypnuto: zaseknuté streamy nadále čekají jako dnes až do vypršení časového limitu připravenosti streamu. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Executor OpenCode: při odmítnutí 403/451 obsahujícím `user_blocked` (nikoli kvůli geografickému omezení ani odmítnutí na základě otisku Cloudflare) pozastavit odmítnutý účet a nejvýše jednou za požadavek přejít na další účet; druhé odmítnutí se vrátí beze změny, aniž by bylo označeno jako úspěch. Ve výchozím nastavení vypnuto: obcházení blokace uživatele na straně upstreamu může působit jako vyhýbání se omezením a rozšířit příznak napříč celou skupinou účtů. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotace OpenCode: po dvou po sobě jdoucích přechodných selháních upstreamu (5xx nebo prázdná odpověď 400) počkat před přechodem na další účet — 1,5 s s dvojnásobným prodloužením při každém dalším selhání, maximálně 6 s na jednu prodlevu a 10 s na požadavek; při odpojení klienta se čekání přeskočí. Tělo chybné odpovědi se před čekáním uvolní. Ve výchozím nastavení vypnuto: převzetí při selhání zůstává okamžité. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotace OpenCode: zastavit vlnu účtů při první odpovědi 429 klasifikované jako skutečné omezení rychlosti (analyzovatelná hlavička `Retry-After` nebo tělo zmiňující omezení rychlosti či využití) a vrátit tuto upstreamovou odpověď 429 beze změny. U neklasifikovaných odpovědí 429 rotace pokračuje. Ve výchozím nastavení vypnuto: bezplatná úroveň je omezena podle výstupní IP adresy (#9611), takže každá odpověď 429 vyvolá rotaci a po vyčerpání vlny se vrátí poslední upstreamová odpověď 429. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Zakázat ověřování certifikátů TLS pro proxy MITM. **Nebezpečné.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Povolit adresy URL poskytovatelů směřující do privátních/interních sítí. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Povolit přidávání/ověřování poskytovatelů na lokálních/privátních adresách (127.0.0.1, localhost, LAN). Ve výchozím nastavení zapnuto (přednostně lokální); pro striktní blokování všeho kromě veřejných adres tuto možnost zakažte. Cloudová metadata zůstávají blokována. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Povolit režim poskytovatele kompatibilního s Claude Code. | ### Zásady (5) -| Klíč | Typ | Výchozí hodnota | Popis | -| ------------------------------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | výčet | `disabled` | Režim vynucování zásad používání nástrojů. Hodnoty: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Automaticky povolí omezování četnosti požadavků na základě vzorců používání. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Přeskočí místní kontrolu kontextového okna / maximálního počtu vstupních tokenů OmniRoute u přímých požadavků na jeden model. Omezení nadřazené služby zůstávají v platnosti. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Odmítne požadavky před odesláním, pokud cílový model postrádá požadované funkce (obrazový vstup, nástroje, strukturovaný výstup, kontextové okno). Chrání přímé požadavky na jednoho poskytovatele, které obcházejí filtr kompatibility kombinační vrstvy. | -| `RADAR_ENABLED` | boolean | `false` | Povolí modul OmniRoute Radar (obrazovky kanálu katalogu a synchronizace). Ve výchozím nastavení je vypnutý; povolením se pouze zpřístupní uživatelské rozhraní — synchronizace dat nadále vyžaduje samostatnou aktivaci. | - -### Běhové prostředí (32) - -| Klíč | Typ | Výchozí hodnota | Restart | Popis | -| ------------------------------------------- | ------- | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Generuje a vkládá souhrny konverzací, když kombinované směrování přepíná mezi modely. Vypnutím se přepnutí modelů budou zpracovávat nezávisle a zabrání se požadavkům na předání kontextu na pozadí pro všechny existující i budoucí kombinace. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Před předáním klientům odstraní z průchozích streamů Responses API interní výstupní položky fáze komentáře. Vypnutím lze přijímat nezpracované komentáře od nadřazené služby. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Vynucuje omezení rozsahů přístupu k nástrojům MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Komprimuje popisy nástrojů MCP za účelem snížení spotřeby tokenů. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Povoluje zpracování úloh na pozadí za běhu. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Zakazuje všechny služby na pozadí (obnovování kvót, synchronizaci atd.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Důvěřuje filtrům RTK na úrovni projektu bez ověření. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Při importu spustí WebSocket server řídicího panelu v reálném čase (ve výchozím nastavení na portu 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Umožňuje nástroji Codex používat přenos Responses-over-WebSocket. Je-li vypnuto, Codex použije HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Umožňuje nástroji Codex používat lokální přenos app-server WebSocket JSON-RPC (codexTransport=app-server). Je-li vypnuto, připojení nastavená na app-server použijí ostatní přenosy nástroje Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Směruje požadavky s vyčerpaným rozpočtem k nouzovému bezplatnému záložnímu poskytovateli/modelu. (Viz níže [Nouzový záložní mechanismus při vyčerpání rozpočtu](#emergency-budget-fallback).) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Povoluje transparentní včasné opakování požadavku u zkrácených nadřazených streamů SSE ještě předtím, než se ke klientovi dostanou jakékoli bajty odpovědi. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Umožňuje obnovení streamu prostřednictvím nového požadavku a spojení odpovědi poté, co se ke klientovi již dostaly bajty. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Zajišťuje bezpečnost volání nástrojů při pokračování uprostřed streamu: nikdy neobnoví přerušený stream poté, co bylo vysláno volání nástroje (probíhající nebo již dokončené s finish_reason tool_calls), a po jednom prázdném pokračování stream uzavře, místo aby vyčerpalo celý rozpočet. Vypnuto: chování vydané verze. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Po vyčerpání omezeného počtu opakování na stejném připojení jednou přepne na sesterské připojení, pokud se stream SSE uzavře před vysláním jakéhokoli užitečného rámce; není-li k dispozici použitelné sesterské připojení, vrátí se původní chyba `STREAM_EARLY_EOF` 502. Ve výchozím nastavení vypnuto: předčasný konec souboru zůstává po opakování na stejném připojení konečným stavem. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Zahrnuje do odpovědí `/v1/models` pole s názvy vhodnými pro zobrazení. Vypněte pro klienty, kteří očekávají pouze ID modelů. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Určuje způsob přidávání prefixů k ID modelů v /v1/models. 'dual' (výchozí) kvůli zpětné kompatibilitě vysílá prefix aliasu i kanonického ID poskytovatele. 'alias' vysílá pouze krátký prefix aliasu (např. ds-web/model, nikoli deepseek-web/model). 'canonical' vysílá pouze úplný prefix ID poskytovatele. Hodnoty: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Povoluje pravidelnou synchronizaci ELO žebříčku Arena AI pro hodnocení inteligence modelů. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Zveřejňuje zrcadlená ID `claude//` v `/v1/models`, aby vyhledávání modelů brány Claude Code uvádělo i jiné modely než Claude. Globální úroveň tříúrovňového přepínače (proměnná prostředí má přednost před nastavením v řídicím panelu). Viz [Konfigurace Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Hlavní přepínač aliasů brány no-think//. Zapnuto (výchozí): /v1/models zveřejňuje variantu bez uvažování pro každý způsobilý model Claude podporující uvažování a ID no-think/ odeslané v požadavku se přeloží zpět na skutečný model s potlačeným uvažováním. Vypnuto: žádné varianty se nezveřejňují a ID no-think/ se zpracovává jako jakékoli jiné neznámé ID modelu. Dokud je tato možnost zapnutá, nadále platí přihlášení/odhlášení jednotlivých modelů pomocí ModelSpec.noThinkingAlias. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Zakazuje generování variant úrovně uvažování (např. -low, -medium, -high) v katalogu /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Povoluje adaptivní virtuální fronty příjmu podle jednotlivých tenantů pro odesílání poskytovateli (#9654): nárazový provoz jednoho tenanta již nezpůsobí chybu 503 jinému. Proměnná prostředí OMNIROUTE_CHAT_VIRTUAL_LANES má přednost před tímto nastavením v řídicím panelu; změny se projeví po restartování serveru. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Zveřejňuje zrcadlená ID / v /v1/models pro modely, jejichž kanonický vlastník nemá aktivní přihlašovací údaje, ale směruje je průchozí brána s aktivními přihlašovacími údaji. Varování: při globálním povolení přidá položky katalogu pro všechny klienty. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Povoluje zjišťování zůstatku pro uzly kompatibilní s agregátory New-API / One-API / Sub2API. Je-li povoleno, kompatibilní uzly s nastaveným příznakem agregátoru budou hlásit svůj zůstatek v řídicím panelu a při směrování s předběžnou kontrolou kvóty. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Pokračuje v nestreamovaných voláních nástrojů řízených serverem, dokud model nevrátí odpověď použitelnou klientem. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Statistiky vyhledávání a nedávná hledání započítávají pouze poskytovatele, kteří stále mají aktivní připojení (poskytovatelé bez klíče, například duckduckgo-free, se započítávají vždy). Při vypnutí se zachová každý uložený řádek vyhledávání s ID poskytovatele. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Stránky poskytovatelů v řídicím panelu: zobrazí odznak Bezplatné pouze podle signálů, které poskytovatel respektuje — ignoruje heuristiku zobrazovaného názvu, nebooleanovská pole bezplatnosti a přípony :free u registrovaných poskytovatelů bez zdokumentované bezplatné úrovně. Při vypnutí se zachová dosavadní pravidlo odznaku. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | U agregovaných odpovědí 429/503 o nedostupnosti vynechá `Retry-After`, pokud není znám žádný konkrétní budoucí čas opakování (namísto syntetické 1 s), přidá `error.retry_after_provenance` (`signal` \| `none`) a umožní cestám vyčerpání kombinace číst textové pokyny k opakování z těl nadřazených odpovědí ve formátu JSON i prostého textu. Pole se zobrazuje pouze v odpovědích vytvořených funkcí `unavailableResponse()`; ostatní těla odpovědí 429/503 se nemění. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Když cíl kombinace `priority`, označený pro záložní použití pouze při vyčerpání kvóty, zastaví kombinaci z důvodu, který prokazatelně nesouvisí s kvótou (otevřený jistič poskytovatele, přeskočení kvůli predikované latenci), odpoví chybou 502 namísto chyby 503 vypadající jako vyčerpání kvóty. Zastavení kvůli uzamčení, době zklidnění, nedostupnosti, vyčerpání a limitu souběžnosti nadále vracejí 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Prostá chyba Mistral 401 (`{"detail":"Unauthorized"}`, bez explicitního signálu ověření) je stejná pro odvolaný klíč i vyčerpanou kvótu. Je-li zapnuto, přepne připojení do doby zklidnění namísto jeho odstavení jako `expired`, nejvýše třikrát za hodinu pro každé připojení; další chyba jej odstaví, takže odvolaný klíč nakonec stále přejde do správného stavu. Ve výchozím nastavení vypnuto: každá prostá chyba Mistral 401 odstaví připojení stejně jako dříve. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Načítá aktuální katalog modelů xAI pro připojení `xai-oauth` z `https://api.x.ai/v1/models` pomocí nosného tokenu OAuth namísto neměnného statického základu. Ve výchozím nastavení vypnuto: `xai-oauth` nadále beze změny poskytuje statický základ. Při jakékoli chybě rozlišení se zjišťování vrátí ke statickému základu (není ověřeno, zda x.ai na tomto koncovém bodu přijímá nosný token OAuth). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Umožňuje automatickému úklidu odstraňovat ukončené úlohy Batch API (completed/failed/cancelled/expired) starší než `OMNIROUTE_BATCH_RETENTION_DAYS` spolu s jejich kontrolními body pro jednotlivé řádky a mazat obsah BLOB nahraných souborů po uplynutí jejich vlastního `expires_at`. Ve výchozím nastavení vypnuto: každá existující instalace uchovává tato data přesně jako dříve, dokud správce tuto možnost nepovolí. Trasa `DELETE /api/v1/batches/delete-completed` spouštěná správcem není ovlivněna žádným nastavením — jde o samostatnou, bezpodmínečnou veřejnou smlouvu API. | +| Klíč | Typ | Výchozí | Popis | +| ------------------------------- | ------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Režim vynucování zásad používání nástrojů. Hodnoty: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Automaticky povolit omezování rychlosti na základě vzorců využití. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Přeskočit lokální kontrolu kontextového okna / maximálního počtu vstupních tokenů OmniRoute u přímých požadavků na jeden model. Omezení upstreamu nadále platí. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Odmítnout požadavky před odesláním, pokud cílový model postrádá požadované schopnosti (zpracování obrazu, nástroje, strukturovaný výstup, kontextové okno). Chrání přímé požadavky na jednoho poskytovatele, které obcházejí filtr kompatibility kombinační vrstvy. | +| `RADAR_ENABLED` | boolean | `false` | Povolit modul OmniRoute Radar (obrazovky katalogového kanálu a synchronizace). Ve výchozím nastavení vypnuto; povolením se pouze zpřístupní uživatelské rozhraní — synchronizace dat zůstává samostatnou volitelnou funkcí. | + +### Běhové prostředí (33) + +| Klíč | Typ | Výchozí hodnota | Restart | Popis | +| ------------------------------------------- | ------- | --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Generovat a vkládat souhrny konverzací, když kombinované směrování přepíná mezi modely. Vypněte, chcete-li přepnutí modelů zpracovávat nezávisle a zabránit požadavkům na předání kontextu na pozadí pro všechny stávající i budoucí kombinace. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Před předáním klientům odstraňovat interní výstupní položky z fáze komentáře z proudů přímého přenosu rozhraní Responses API. Vypněte, chcete-li přijímat nezpracované komentáře z upstreamu. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Vynucovat omezení rozsahů přístupu k nástrojům MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Komprimovat popisy nástrojů MCP za účelem snížení spotřeby tokenů. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Povolit zpracování úloh na pozadí za běhu. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Zakázat všechny služby na pozadí (obnovení kvót, synchronizace atd.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Důvěřovat filtrům RTK na úrovni projektu bez validace. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Při importu spustit WebSocket server řídicího panelu v reálném čase (ve výchozím nastavení na portu 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Povolit systému Codex používat přenos Responses-over-WebSocket. Je-li tato možnost vypnuta, Codex přejde na HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Povolit systému Codex používat lokální přenos WebSocket JSON-RPC serveru app-server (codexTransport=app-server). Je-li tato možnost vypnuta, připojení nastavená na app-server přejdou na jiné přenosy systému Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Směrovat požadavky s vyčerpaným rozpočtem na nouzového bezplatného záložního poskytovatele/model. (Viz níže [Nouzové záložní řešení při vyčerpání rozpočtu](#emergency-budget-fallback).) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Povolit transparentní včasné opakování požadavku u zkrácených upstreamových streamů SSE ještě předtím, než se ke klientovi dostanou jakékoli bajty odpovědi. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Povolit obnovení streamu opětovným odesláním požadavku a spojením odpovědi poté, co se již ke klientovi dostaly bajty. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Zajistit bezpečné pokračování volání nástrojů uprostřed streamu: nikdy neobnovovat přerušený stream, jakmile bylo emitováno volání nástroje (probíhající nebo již dokončené s finish_reason tool_calls), a po jednom prázdném pokračování spojení ukončit namísto vyčerpání celého rozpočtu. Vypnuto: chování vydané verze. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Po vyčerpání omezeného počtu opakovaných pokusů na stejném připojení jednou přepnout na sourozenecké připojení, pokud se stream SSE uzavře před odesláním jakéhokoli užitečného rámce; pokud není k dispozici žádné použitelné sourozenecké připojení, vrátí se původní chyba `STREAM_EARLY_EOF` 502. Ve výchozím nastavení vypnuto: po opakovaném pokusu na stejném připojení zůstává předčasný EOF konečným stavem. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Zahrnout do odpovědí `/v1/models` uživatelsky přívětivá pole s názvy. Vypněte pro klienty, kteří očekávají pouze ID modelů. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Určuje, jak se v /v1/models přidávají předpony k ID modelů. 'dual' (výchozí) kvůli zpětné kompatibilitě zveřejňuje jak předpony aliasů, tak předpony kanonických ID poskytovatelů. 'alias' zveřejňuje pouze krátkou předponu aliasu (např. ds-web/model, nikoli deepseek-web/model). 'canonical' zveřejňuje pouze úplnou předponu ID poskytovatele. Hodnoty: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Povolit pravidelnou synchronizaci ELO z žebříčku Arena AI pro hodnocení inteligence modelů. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Zveřejnit zrcadlová ID `claude//` v `/v1/models`, aby vyhledávání modelů brány Claude Code uvádělo i modely jiné než Claude. Globální úroveň tříúrovňového přepínače (proměnná prostředí má přednost před nastavením na řídicím panelu). Viz [konfigurace Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Hlavní přepínač pro aliasy brány no-think//. Zapnuto (výchozí): /v1/models zveřejňuje variantu bez přemýšlení pro každý způsobilý model Claude podporující přemýšlení a ID no-think/ odeslané v požadavku se přeloží zpět na skutečný model s potlačeným uvažováním. Vypnuto: nezveřejňují se žádné varianty a s ID no-think/ se zachází jako s jakýmkoli jiným neznámým ID modelu. Dokud je tato možnost zapnutá, stále platí nastavení ModelSpec.noThinkingAlias pro přihlášení či odhlášení jednotlivých modelů. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Zakázat generování variant úrovně přemýšlení (např. -low, -medium, -high) v katalogu /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Povolit adaptivní virtuální přijímací fronty pro jednotlivé tenanty při předávání požadavků poskytovateli (#9654): nárazový provoz jednoho tenanta již nezpůsobí chybu 503 jinému tenantovi. Proměnná prostředí OMNIROUTE_CHAT_VIRTUAL_LANES má přednost před tímto nastavením na řídicím panelu; změny se projeví po restartování serveru. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Inzerovat zrcadlová ID ve formátu / na /v1/models pro modely, jejichž kanonický vlastník nemá žádné aktivní přihlašovací údaje, ale směruje je průchozí brána s aktivními přihlašovacími údaji. Varování: při globálním povolení přidá položky katalogu pro všechny klienty. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Povolit zjišťování zůstatku pro uzly kompatibilní s agregátory New-API / One-API / Sub2API. Je-li tato možnost povolena, kompatibilní uzly s nastaveným příznakem agregátoru budou hlásit svůj zůstatek na řídicím panelu a při směrování s předběžnou kontrolou kvóty. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Pokračovat v nestreamovaných voláních nástrojů řízených serverem, dokud model nevrátí odpověď použitelnou klientem. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Statistiky vyhledávání a nedávná vyhledávání započítávají pouze poskytovatele, kteří mají stále aktivní připojení (poskytovatelé bez klíče, například duckduckgo-free, se započítávají vždy). Při vypnutí se zachová každý uchovávaný řádek vyhledávání s ID poskytovatele. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Stránky poskytovatelů na řídicím panelu: zobrazovat odznak Bezplatné pouze na základě signálů, které poskytovatel respektuje — ignoruje se heuristika zobrazovaného názvu, nepravdivostní pole označující bezplatnost a přípony :free u registrovaných poskytovatelů bez zdokumentované bezplatné úrovně. Při vypnutí zůstane zachováno historické pravidlo pro odznak. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | U agregovaných odpovědí 429/503 o nedostupnosti vynechat `Retry-After`, pokud není známa žádná konkrétní budoucí doba dalšího pokusu (namísto syntetické 1 s), přidat `error.retry_after_provenance` (`signal` \| `none`) a umožnit cestám pro vyčerpání kombinace číst textové pokyny k dalšímu pokusu z upstreamových těl ve formátu JSON i prostého textu. Pole se zobrazí pouze v odpovědích vytvořených funkcí `unavailableResponse()`; ostatní těla odpovědí 429/503 zůstanou beze změny. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Když cíl kombinace `priority` označený jako záložní pouze při vyčerpání kvóty zastaví kombinaci z důvodu, který prokazatelně nesouvisí s kvótou (otevřený jistič poskytovatele, přeskočení na základě predikované latence), odpovědět stavem 502 namísto stavu 503, který působí jako problém s kvótou. Zastavení kvůli uzamčení, době čekání, nedostupnosti, vyčerpání a limitu souběžnosti nadále vracejí stav 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Holá odpověď Mistral 401 (`{"detail":"Unauthorized"}` bez explicitního signálu ověření) je stejná jak pro zneplatněný klíč, tak pro vyčerpanou kvótu. Je-li tato možnost zapnuta, připojení se namísto jeho odstavení jako `expired` dočasně pozastaví, a to nejvýše třikrát za hodinu pro každé připojení; další výskyt jej odstaví, takže zneplatněný klíč nakonec přesto přejde do tohoto stavu. Ve výchozím nastavení je možnost vypnuta: každá holá odpověď Mistral 401 odstaví připojení jako dříve. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Načítat živý katalog modelů xAI pro připojení `xai-oauth` z `https://api.x.ai/v1/models` pomocí nosného tokenu OAuth namísto neměnné statické počáteční sady. Ve výchozím nastavení vypnuto: `xai-oauth` nadále poskytuje statickou počáteční sadu beze změny. Při jakékoli chybě rozlišení se zjišťování vrátí k počáteční sadě (není ověřeno, zda x.ai na tomto koncovém bodu přijímá nosný token OAuth). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Umožnit automatickému čištění odstranit koncové (dokončené/neúspěšné/zrušené/expirované) úlohy Batch API starší než `OMNIROUTE_BATCH_RETENTION_DAYS` spolu s jejich kontrolními body pro jednotlivé řádky a vymazat obsah BLOB nahraných souborů po uplynutí jejich vlastního `expires_at`. Ve výchozím nastavení vypnuto: každá stávající instalace uchovává tato data přesně jako dříve, dokud tuto možnost nepovolí operátor. Trasa `DELETE /api/v1/batches/delete-completed` spouštěná operátorem není nastavením nijak ovlivněna — jde o samostatný, bezpodmínečný kontrakt veřejného API. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Rezervovat vybraný účet Antigravity po dobu streamovacího životního cyklu požadavku, který jej vybral, aby souběžný opakovaný pokus nebo předání přihlašovacích údajů nemohly znovu vybrat účet, který je již přiřazen probíhajícímu streamu. Rezervace je omezena na dvojici (připojení, volatelný upstreamový model), takže jeden účet může i nadále obsluhovat dva různé modely současně. Pokud jsou pro daný model již rezervovány všechny způsobilé účty, požadavek vrátí strukturovanou odpověď 503 `antigravity_pool_busy` s omezenou hodnotou `Retry-After` namísto dalšího zatížení vytíženého účtu. Ve výchozím nastavení vypnuto: výběr účtu zůstává přesně jako dříve a žádná rezervace se nevytváří. | ### CLI (5) -| Klíč | Typ | Výchozí hodnota | Restart | Popis | -| ------------------------------------- | ------- | --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Povolí režim kompatibility pro všechny klienty CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Povolí vrstvu kompatibility aliasů modelů. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Povolí automatickou synchronizaci cenových dat (vyžaduje také proměnnou prostředí `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Po synchronizaci modelů poskytovatele automaticky (znovu) zapíše soubory profilů ~/.codex/*.config.toml z aktuálního katalogu. Nikdy nemění aktivní/výchozí konfiguraci Codex. Ve výchozím nastavení vypnuto. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Po synchronizaci modelů poskytovatele automaticky (znovu) zapíše profily Claude Code ~/.claude/profiles//settings.json z aktuálního katalogu. Nikdy nemění aktivní/výchozí konfiguraci Claude. Ve výchozím nastavení vypnuto. | +| Klíč | Typ | Výchozí | Restart | Popis | +| ------------------------------------- | ------- | ------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Povolit režim kompatibility pro všechny klienty CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Povolit vrstvu kompatibility aliasů modelů. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Povolit automatickou synchronizaci cenových dat (vyžaduje také proměnnou prostředí `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Po synchronizaci modelů poskytovatele automaticky (znovu) zapsat soubory profilů ~/.codex/*.config.toml ze živého katalogu. Aktivní/výchozí konfiguraci Codex nikdy nemění. Ve výchozím nastavení vypnuto. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Po synchronizaci modelů poskytovatele automaticky (znovu) zapsat profily Claude Code ~/.claude/profiles//settings.json ze živého katalogu. Aktivní/výchozí konfiguraci Claude nikdy nemění. Ve výchozím nastavení vypnuto. | -### Kontrola stavu (5) +### Stav (5) -| Klíč | Typ | Výchozí hodnota | Popis | -| ----------------------------------------- | ------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Zakáže koncový bod kontroly stavu místní instance. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Zakáže kontrolu stavu ověřování tokenů. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Povolí přístup k síti v izolovaném prostředí dovedností. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Při kontrole stavu proxy sonda odmítnutá cílem (401/403/429) vynuluje řadu po sobě jdoucích selhání proxy. Ve výchozím nastavení vypnuto: odmítnutí zůstává neutrální (#10654). Odpověď 5xx zůstává v obou případech neprůkazná; odmítnutí nikdy neodebere, nezakáže ani znovu neaktivuje proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Spustí při startu kontrolu integrity/stavu DB až poté, co server začne přijímat požadavky (prostřednictvím `setImmediate`), namísto blokování spuštění do jejího dokončení (#13717). Ve výchozím nastavení vypnuto: spuštění je blokováno přesně stejně jako před tímto PR. | +| Klíč | Typ | Výchozí | Popis | +| ----------------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Zakáže koncový bod kontroly stavu místní instance. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Zakáže kontrolu stavu ověřování tokenu. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Povolí síťový přístup v sandboxovém prostředí dovedností. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Při kontrole stavu proxy resetuje sonda odmítnutá cílem (401/403/429) sérii po sobě jdoucích selhání proxy. Ve výchozím nastavení vypnuto: odmítnutí zůstává neutrální (#10654). Odpověď 5xx zůstává v obou případech neprůkazná; odmítnutí nikdy proxy neodebere, nezakáže ani znovu neaktivuje. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Spustí kontrolu integrity/stavu DB při spuštění až poté, co server začne přijímat požadavky (prostřednictvím `setImmediate`), namísto blokování spuštění až do jejího dokončení (#13717). Ve výchozím nastavení vypnuto: spuštění je blokováno přesně stejně jako před tímto PR. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` a jeho starší alias -> `INJECTION_GUARD_BLOCK_THRESHOLD` upravují režim `block` příznaku -> `INJECTION_GUARD_MODE`, ale jde o běžné proměnné prostředí načítané souborem -> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> nikoli o příznaky funkcí: nemají přepsání v DB ani přepínač na řídicím panelu. Viz +> `INJECTION_GUARD_BLOCK_THRESHOLD` upravují režim `block` proměnné +> `INJECTION_GUARD_MODE`, ale jedná se o běžné proměnné prostředí načítané +> souborem [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), +> nikoli o příznaky funkcí: nelze je přepsat v DB ani přepínat na ovládacím panelu. Viz > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> Sloupec `Restart` označuje příznaky s `requiresRestart: true` — hodnota se -> uloží okamžitě, ale projeví se až po opětovném načtení procesu. Výčtové -> příznaky odmítnou jakoukoli hodnotu mimo jejich povolenou množinu (ověřuje se na straně serveru +> Sloupec `Restart` označuje příznaky s hodnotou `requiresRestart: true` — hodnota se +> uloží okamžitě, ale projeví se až po opětovném načtení procesu. Příznaky typu enum +> odmítnou jakoukoli hodnotu mimo povolenou množinu (ověřuje se na straně serveru > jak v `setFeatureFlagOverride()`, tak v obslužné rutině REST `PUT`). --- ## Přepínání příznaků -### Řídicí panel +### Ovládací panel -Přejděte na **Řídicí panel → Nastavení → Příznaky funkcí** +Přejděte na **Ovládací panel → Nastavení → Příznaky funkcí** (`/dashboard/settings/feature-flags`). Mřížka (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) podporuje: -- **Vyhledávání** podle klíče nebo popisu a **filtrování** podle kategorie (včetně syntetického zobrazení - **Vyžaduje restart**). -- **Přepínač** pro booleovské příznaky a **rozbalovací nabídku** pro výčtové příznaky +- **Vyhledávání** podle klíče nebo popisu a **filtrování** podle kategorie (včetně syntetického + zobrazení **Vyžaduje restart**). +- **Přepínač** pro booleovské příznaky a **rozevírací seznam** pro výčtové příznaky (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - **Odznak zdroje** u každého příznaku — `DB`, `ENV` nebo `DEF` — který ukazuje, odkud pochází výsledná hodnota. -- Tlačítko **Obnovit** (zobrazuje se pouze u příznaků se zdrojem `DB`) pro odstranění přepsání +- Tlačítko **Obnovit** (zobrazené pouze u příznaků pocházejících z `DB`) pro odstranění přepsání a tlačítko **Obnovit všechna přepsání** ve spodní části. -- Banner **Restartovat server**, když dojde ke změně příznaku `requiresRestart`. +- Banner **Restartovat server**, když dojde ke změně příznaku s `requiresRestart`. ### REST API Všechny operace probíhají prostřednictvím jediné trasy: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Každá metoda vyžaduje ověřenou relaci řídicího panelu (jinak vrací `401`). +Každá metoda vyžaduje ověřenou relaci ovládacího panelu (jinak vrátí `401`). #### `GET /api/settings/feature-flags` -Vrací všechny příznaky s jejich výslednou hodnotou, zdrojem a souhrnem. +Vrátí všechny příznaky s jejich výslednou hodnotou, zdrojem a souhrnem. ```jsonc { "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Require API Key", - "description": "Require an API key for all incoming requests", + "label": "Vyžadovat klíč API", + "description": "Vyžadovat klíč API pro všechny příchozí požadavky", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +212,7 @@ Vrací všechny příznaky s jejich výslednou hodnotou, zdrojem a souhrnem. "requiresRestart": false, "warningLevel": "caution", }, - // ... všech 72 příznaků + // ... všech 74 příznaků ], "summary": { "total": 56, @@ -239,19 +241,19 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Odpověď vrací novou hodnotu `effectiveValue`/`source`, předchozí hodnotu `previousValue`/ -`previousSource` a `requiresRestart`. Neznámé klíče a výčtové hodnoty mimo povolený rozsah -jsou odmítnuty se stavem `400`. +Odpověď zopakuje nové hodnoty `effectiveValue`/`source`, předchozí hodnoty `previousValue`/ +`previousSource` a `requiresRestart`. Neznámé klíče a hodnoty výčtu mimo povolený rozsah +jsou odmítnuty s kódem `400`. #### `DELETE /api/settings/feature-flags` -Najednou vymaže **všechna** přepsání v DB a obnoví u každého příznaku hodnotu z prostředí / výchozí -hodnotu. Vrací `{ cleared: , message: "..." }`. +Najednou odstraní **všechna** přepsání v DB a obnoví u každého příznaku jeho hodnotu z prostředí / +výchozí hodnotu. Vrátí `{ cleared: , message: "..." }`. > [!NOTE] > Příznaky s `requiresRestart: true` se projeví až po opětovném načtení procesu. -> Proces restartování z řídicího panelu volá `POST /api/restart` a poté opakovaně dotazuje -> `GET /api/health/ping`, dokud není server opět spuštěn. +> Proces restartování z ovládacího panelu volá `POST /api/restart` a poté opakovaně kontroluje +> `GET /api/health/ping`, dokud není server znovu spuštěn. --- diff --git a/docs/i18n/cs/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/cs/docs/reference/PROVIDER_REFERENCE.md index 4473c37eb21c..89481274a20d 100644 --- a/docs/i18n/cs/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/cs/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > **Automaticky vygenerováno** ze souboru `src/shared/constants/providers.ts` — neupravujte ručně. > Znovu vygenerujte pomocí: `npm run gen:provider-reference` -> **Naposledy vygenerováno:** 2026-09-17 +> **Naposledy vygenerováno:** 2026-09-18 -Celkový počet poskytovatelů: **359**. Níže naleznete rozdělení podle kategorií. +Celkový počet poskytovatelů: **359**. Rozdělení podle kategorií naleznete níže. ## Kategorie @@ -32,49 +32,49 @@ Jednotlivé poskytovatele můžete povolit, nakonfigurovat a otestovat na řídi --- -## Poskytovatelé bez ověřování (není vyžadován žádný klíč) (10) - -| ID | Alias | Název | Štítky | Web | Poznámky | Volání nástrojů | -| ----------------------- | ---------- | ------------------------- | -------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | -| `aihorde` | `horde` | AI Horde | Bez ověřování | [odkaz](https://aihorde.net) | Není vyžadován žádný API klíč — používá se zdokumentovaný anonymní klíč služby AI Horde. Přidání bezplatného klíče z aihorde.net je volitelné a zajistí pouze vyšší prioritu ve frontě (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Bez ověřování | [odkaz](https://augmentcode.com) | OmniRoute neukládá žádný API klíč. Nainstalujte Auggie CLI a spusťte na tomto počítači příkaz `auggie login`; OmniRoute jej poté spustí lokálně pro každý požadavek. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Bez ověřování | [odkaz](https://playground.ai.cloudflare.com) | Nejsou vyžadovány žádné přihlašovací údaje — používají se anonymní relace prohlížeče prostřednictvím reverzně analyzovaného protokolu cf_agent WebSocket (transport Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Bez ověřování | [odkaz](https://developers.openai.com/codex/cli) | OmniRoute neukládá žádný token. App-server nástroje Codex CLI spravuje vlastní přihlášení k ChatGPT (~/.codex/auth.json, automaticky obnovované). Pokud CLI ještě není ověřeno, použijte možnost „Přihlásit se pomocí ChatGPT“. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Bez ověřování | [odkaz](https://docs.devin.ai/work-with-devin/devin-cli) | Ověřování spravuje oficiální Devin CLI ve svém izolovaném svazku mostu. | emulované | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Bez ověřování | [odkaz](https://duckduckgo.com/duckchat) | Nejsou vyžadovány žádné přihlašovací údaje — DuckDuckGo AI Chat je anonymní a bezplatný. | emulované | -| `opencode` | `oc` | OpenCode Free | Bez ověřování | [odkaz](https://opencode.ai) | Není vyžadován žádný API klíč — používá se veřejný bezplatný koncový bod služby OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Bez ověřování | [odkaz](https://uncloseai.com) | Není vyžadováno žádné ověřování. API přijímá jako klíč pro identifikaci libovolný neprázdný řetězec. Pokud starší vestavěné modely vracejí chybu 404, použijte Dostupné modely → Importovat z /models nebo Automatická synchronizace; ověřený funkční model: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Bez ověřování, video | [odkaz](https://veoaifree.com) | Není vyžadováno žádné ověřování. Limit je 6 požadavků za hodinu na jednu IP adresu. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Bez ověřování | [odkaz](https://zcode.z.ai) | OmniRoute neukládá žádný API klíč. Lokální app-server ZCode používá existující přihlášení builtin:zai-coding-plan. | — | +## Poskytovatelé bez ověření (není vyžadován klíč) (10) + +| ID | Alias | Název | Štítky | Web | Poznámky | Volání nástrojů | +| ----------------------- | ---------- | ------------------------- | ------------------ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | +| `aihorde` | `horde` | AI Horde | Bez ověření | [odkaz](https://aihorde.net) | Není vyžadován žádný klíč API — používá se zdokumentovaný anonymní klíč služby AI Horde. Přidání bezplatného klíče z aihorde.net je volitelné a přináší pouze vyšší prioritu ve frontě (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Bez ověření | [odkaz](https://augmentcode.com) | OmniRoute neukládá žádný klíč API. Nainstalujte Auggie CLI a na tomto počítači spusťte `auggie login`; OmniRoute jej pak pro každý požadavek spustí lokálně. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Bez ověření | [odkaz](https://playground.ai.cloudflare.com) | Nejsou vyžadovány žádné přihlašovací údaje — používají se anonymní relace prohlížeče přes reverzně analyzovaný protokol WebSocket cf_agent (transport Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Bez ověření | [odkaz](https://developers.openai.com/codex/cli) | OmniRoute neukládá žádný token. App-server nástroje Codex CLI spravuje vlastní přihlášení k ChatGPT (~/.codex/auth.json, automaticky obnovované). Pokud CLI ještě není ověřeno, použijte „Přihlásit se pomocí ChatGPT“. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Bez ověření | [odkaz](https://docs.devin.ai/work-with-devin/devin-cli) | Ověřování spravuje oficiální Devin CLI ve svém izolovaném svazku mostu. | emulováno | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Bez ověření | [odkaz](https://duckduckgo.com/duckchat) | Nejsou vyžadovány žádné přihlašovací údaje — DuckDuckGo AI Chat je anonymní a bezplatný. | emulováno | +| `opencode` | `oc` | OpenCode Free | Bez ověření | [odkaz](https://opencode.ai) | Není vyžadován žádný klíč API — používá se veřejný bezplatný koncový bod služby OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Bez ověření | [odkaz](https://uncloseai.com) | Není vyžadováno žádné ověření. API přijímá jako identifikační klíč libovolný neprázdný řetězec. Pokud starší vestavěné modely vracejí chybu 404, použijte Dostupné modely → Importovat z /models nebo Automatická synchronizace; ověřený funkční model: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Bez ověření, video | [odkaz](https://veoaifree.com) | Není vyžadováno žádné ověření. Limit je 6 požadavků za hodinu na jednu IP adresu. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Bez ověření | [odkaz](https://zcode.z.ai) | OmniRoute neukládá žádný klíč API. Lokální app-server ZCode používá stávající přihlášení builtin:zai-coding-plan. | — | ## Poskytovatelé OAuth (24) -| ID | Alias | Název | Štítky | Web | Poznámky | -| --------------- | ------------- | ------------------------- | ------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [odkaz](https://antigravity.google) | Importujte své přihlášení z Antigravity CLI (`agy`) (vložením/nahráním souboru s tokenem), automaticky zjistěte místní přihlášení CLI nebo se přihlaste přes Google. Sdílí backend Antigravity (včetně modelů Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [odkaz](https://aws.amazon.com/q/developer/) | Používá stejné AWS Builder ID nebo postup s importovaným obnovovacím tokenem jako Kiro, ale připojení Amazon Q uchovává odděleně. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [odkaz](https://cline.bot/cline-pass) | ClinePass je předplatné služby Cline za 9,99 USD měsíčně, které zahrnuje 10 otevřených modelů pro programování. Přihlaste se pomocí svého účtu Cline (stejné přihlašovací údaje jako pro Cline CLI/IDE) nebo vložte přímý klíč API služby ClinePass (app.cline.bot → Nastavení → Klíče API). Předplatné ClinePass odemkne modely cline-pass/*. Opětovně využívá postup OAuth služby Cline WorkOS. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [odkaz](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Přihlaste se prostřednictvím oficiálního postupu CLI s kódem zařízení nebo vložte přímý klíč API (odesílá se jako Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [odkaz](https://cli.devin.ai) | Vyžaduje binární soubor Devin CLI. Pro ověření spusťte `devin auth login` nebo zadejte svůj WINDSURF_API_KEY. Instalace: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [odkaz](https://devin.ai) | Vložte existující klíč API služby Devin z ověřené relace Devin. Dostupnost exportu klíče a příslušné kroky se liší podle verze Devin a účtu. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | V nastavení poskytovatele zadejte URL své instance GHE (např. https://ghe.company.com) a poté proveďte ověření prostřednictvím postupu pro zařízení. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [odkaz](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | OAuth služby GitLab Duo není nakonfigurováno. Zaregistrujte aplikaci OAuth na adrese https://gitlab.com/-/profile/applications s identifikátorem URI přesměrování http://localhost:20128/callback a rozsahy „ai_features read_user“, poté nastavte GITLAB_DUO_OAUTH_CLIENT_ID (a volitelně GITLAB_DUO_OAUTH_CLIENT_SECRET) a restartujte aplikaci. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Přihlaste se pomocí prohlížeče nebo vložte soubor ~/.grok/auth.json (případně přístupový token JWT) z Grok Build CLI; refresh_token se v obou případech automaticky obměňuje. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [odkaz](https://www.kimi.com/code?aff=omniroute) | Přihlaste se pomocí stejného účtu Kimi, který používáte v Kimi Code CLI. OmniRoute používá postup OAuth rozhraní CLI a koncové body plánu Kimi Coding. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Bezplatná úroveň: 50 kreditů měsíčně (~25 000–100 000 tokenů). ⚠️ Smluvní podmínky Kiro zakazují používání proxy či řídicích nástrojů třetích stran. | -| `openference` | `of` | Openference | OAuth | [odkaz](https://openference.com) | Přihlaste se pomocí svého účtu Openference, aby byly požadavky směrovány přes api.openference.com. Pro inferenci je vyžadován aktivní tarif — OAuth může ověření dokončit, ale bez něj vrátí stav 402. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [odkaz](https://trae.ai) | Trae je IDE od ByteDance založené na AI (vzdálený agent SOLO). Udělte oprávnění prostřednictvím trae.ai ve vyskakovacím okně nebo se přihlaste na solo.trae.ai a vložte Cloud-IDE-JWT (odesílá se jako 'Authorization: Cloud-IDE-JWT ', platnost přibližně 14 dní) jako přístupový token; web_id/biz_user_id/user_unique_id/scope/tenant/region se předávají prostřednictvím providerSpecificData. Pro vložené tokeny není k dispozici bezobslužné obnovení — po vypršení platnosti je vložte znovu. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [odkaz](https://x.ai) | Přihlaste se pomocí xAI, abyste mohli používat modely api.x.ai, například Grok 4.5. Toto přihlášení je oddělené od relací JWT služby Grok Build, které používají cli-chat-proxy.grok.com a aliasy modelů grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [odkaz](https://zed.dev) | Zed ukládá přihlašovací údaje poskytovatelů LLM (OpenAI, Anthropic, Google, Mistral, xAI) do systémové klíčenky. Pomocí tlačítka Importovat níže je můžete automaticky vyhledat a importovat. | -| `zed-hosted` | — | Hostované modely Zed | OAuth | [odkaz](https://zed.dev) | Přihlaste se pomocí svého účtu Zed (přihlášení nativní aplikace). OmniRoute vygeneruje jednorázový pár klíčů RSA a otevře zed.dev pro jeho autorizaci — při vzdálené instalaci nebo instalaci bez grafického rozhraní zkopírujte výslednou adresu URL zpětného volání 127.0.0.1 z adresního řádku prohlížeče a vložte ji zpět sem. Tato položka se liší od výše uvedené položky pro import přihlašovacích údajů „Zed IDE“: zprostředkovává dokončování konverzací prostřednictvím vlastního agregátoru hostovaných modelů Zed (cloud.zed.dev), který v rámci vašeho tarifu Zed zpřístupňuje modely Anthropic/OpenAI/Google/xAI. | +| ID | Alias | Název | Štítky | Web | Poznámky | +| --------------- | ------------- | ------------------------- | ------ | -------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [odkaz](https://antigravity.google) | Importujte své přihlášení z Antigravity CLI (`agy`) (vložením/nahráním souboru s tokenem), automaticky detekujte místní přihlášení CLI nebo se přihlaste pomocí Googlu. Sdílí backend Antigravity (včetně modelů Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [odkaz](https://aws.amazon.com/q/developer/) | Používá stejné AWS Builder ID nebo stejný postup s importovaným obnovovacím tokenem jako Kiro, ale připojení Amazon Q uchovává odděleně. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [odkaz](https://cline.bot/cline-pass) | ClinePass je předplatné služby Cline za 9,99 $ měsíčně, které zahrnuje 10 otevřených modelů pro programování. Přihlaste se pomocí svého účtu Cline (stejné přihlašovací údaje jako pro Cline CLI/IDE) nebo vložte přímo klíč API služby ClinePass (app.cline.bot → Nastavení → Klíče API). Předplatné ClinePass zpřístupní modely cline-pass/*. Opětovně používá postup OAuth služby Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [odkaz](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Přihlaste se prostřednictvím oficiálního postupu CLI s kódem zařízení nebo vložte přímo klíč API (odesílá se jako Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [odkaz](https://cli.devin.ai) | Vyžaduje binární soubor Devin CLI. Pro ověření spusťte `devin auth login` nebo zadejte svůj WINDSURF_API_KEY. Instalace: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [odkaz](https://devin.ai) | Vložte existující klíč API služby Devin z ověřené relace Devin. Dostupnost a postup exportu klíče se liší podle verze Devin a účtu. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | V nastavení poskytovatele zadejte adresu URL své instance GHE (např. https://ghe.company.com) a poté proveďte ověření pomocí postupu pro zařízení. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [odkaz](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | OAuth pro GitLab Duo není nakonfigurován. Zaregistrujte aplikaci OAuth na adrese https://gitlab.com/-/profile/applications s identifikátorem URI pro přesměrování http://localhost:20128/callback a rozsahy „ai_features read_user“, poté nastavte GITLAB_DUO_OAUTH_CLIENT_ID (a volitelně GITLAB_DUO_OAUTH_CLIENT_SECRET) a aplikaci restartujte. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Přihlaste se pomocí prohlížeče nebo vložte svůj soubor ~/.grok/auth.json (případně přístupový token JWT) z Grok Build CLI; refresh_token se v obou případech automaticky obměňuje. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [odkaz](https://www.kimi.com/code?aff=omniroute) | Přihlaste se pomocí stejného účtu Kimi, který používá Kimi Code CLI. OmniRoute používá postup OAuth rozhraní CLI a koncové body plánu Kimi Coding. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Bezplatná úroveň: 50 kreditů měsíčně (~25–100 tisíc tokenů). ⚠️ Podmínky služby Kiro zakazují použití proxy třetích stran a testovacích prostředí. | +| `openference` | `of` | Openference | OAuth | [odkaz](https://openference.com) | Přihlaste se pomocí svého účtu Openference a směrujte požadavky přes api.openference.com. Zahrnuje bezplatný přístup k modelům Qwen3.8 27b a Llama 3.2 3B — aktuální podmínky plánu naleznete na openference.com/pricing. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [odkaz](https://trae.ai) | Trae je IDE zaměřené na AI od společnosti ByteDance (vzdálený agent SOLO). Autorizujte se prostřednictvím trae.ai ve vyskakovacím okně nebo se přihlaste na solo.trae.ai a vložte Cloud-IDE-JWT (odesílá se jako 'Authorization: Cloud-IDE-JWT ', platnost přibližně 14 dní) jako přístupový token; web_id/biz_user_id/user_unique_id/scope/tenant/region se předávají prostřednictvím providerSpecificData. Pro vložené tokeny není k dispozici obnova bez grafického rozhraní — po vypršení platnosti je vložte znovu. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [odkaz](https://x.ai) | Přihlaste se pomocí xAI, abyste mohli používat modely api.x.ai, například Grok 4.5. Toto přihlášení je oddělené od relací JWT služby Grok Build, které používají cli-chat-proxy.grok.com a aliasy modelů grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [odkaz](https://zed.dev) | Zed ukládá přihlašovací údaje poskytovatelů LLM (OpenAI, Anthropic, Google, Mistral, xAI) do systémové klíčenky. Pomocí tlačítka Importovat níže je automaticky vyhledejte a importujte. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [odkaz](https://zed.dev) | Přihlaste se pomocí svého účtu Zed (přihlášení v nativní aplikaci). OmniRoute vygeneruje jednorázový pár klíčů RSA a otevře zed.dev pro jeho autorizaci — při vzdálené instalaci nebo instalaci bez grafického rozhraní zkopírujte výslednou adresu URL zpětného volání 127.0.0.1 z adresního řádku prohlížeče a vložte ji sem. Tato položka se liší od výše uvedeného importu přihlašovacích údajů „Zed IDE“: zprostředkovává dokončování chatu prostřednictvím vlastního hostovaného agregátoru modelů služby Zed (cloud.zed.dev), který v rámci vašeho plánu Zed poskytuje přístup k modelům Anthropic/OpenAI/Google/xAI. | ## Poskytovatelé webových souborů cookie (34) @@ -115,252 +115,252 @@ Jednotlivé poskytovatele můžete povolit, nakonfigurovat a otestovat na řídi | `zai-web` | `zw` | Z.ai Web | Webový soubor cookie | [odkaz](https://chat.z.ai) | Zkopírujte hodnotu „token“ z chat.z.ai → DevTools → Application → Local Storage. Nekopírujte soubory cookie; OmniRoute zajišťuje CAPTCHA pro každý požadavek prostřednictvím svého prohlížečového transportu. | — | | `zenmux-free` | `zmf` | ZenMux zdarma (web) | Webový soubor cookie | [odkaz](https://zenmux.ai) | Přihlaste se na zenmux.ai, poté pomocí EditThisCookie nebo Cookie-Editor exportujte všechny soubory cookie a vložte sem celý řetězec hlavičky Cookie. Obnovujte přibližně každých 30 dní. | — | -## Poskytovatelé klíčů API (placení / placení s bezplatnými kredity) (242) - -| ID | Alias | Název | Štítky | Web | Poznámky | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | klíč API | [odkaz](https://ai.360.cn) | Klíč API získáte na ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | klíč API, agregátor | [odkaz](https://agentrouter.org) | Kredit 200 $ zdarma při registraci – brána pro směrování mezi více modely | -| `agnes` | `agnes` | Agnes AI | klíč API, video | [odkaz](https://agnes-ai.com) | Klíč API získáte na agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Čína) | klíč API | [odkaz](https://api.agnes-ai.cn) | Klíč API získáte na čínském webu Agnes. | -| `ai21` | `ai21` | AI21 Labs | klíč API | [odkaz](https://www.ai21.com) | Zkušební kredit 10 $ při registraci (platný 3 měsíce), platební karta není vyžadována | -| `aimlapi` | `aiml` | AI/ML API | klíč API, agregátor | [odkaz](https://aimlapi.com) | Bezplatná úroveň je pozastavena (2026) — AI/ML API nyní funguje pouze s průběžnými platbami podle využití (minimální dobití 20 $); žádný pravidelně obnovovaný bezplatný kredit. | -| `ainative` | `ainative` | AINative Studio | klíč API | [odkaz](https://ainative.studio) | Vytvořte si bezplatný klíč API na ainative.studio (bez karty) a poté jej sem vložte jako Bearer token. | -| `aion` | `aion` | Aion Labs | klíč API | [odkaz](https://www.aionlabs.ai) | Vytvořte si bezplatný klíč API na aionlabs.ai (bez karty) a poté jej sem vložte jako Bearer token. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | klíč API | [odkaz](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Čína) | klíč API | [odkaz](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | klíč API | [odkaz](https://developer.ant-ling.com/en/docs/) | Zaregistrujte se a vytvořte klíč API v konzoli Ant Ling API (https://chat.ant-ling.com/open), poté jej sem vložte. OmniRoute směruje provoz chatu na https://api.ant-ling.com/v1/chat/completions; poskytovatel je kompatibilní s OpenAI a nabízí také rozhraní kompatibilní s Anthropic. | -| `anthropic` | `anthropic` | Anthropic | klíč API | [odkaz](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | klíč API, agregátor | [odkaz](https://anyapi.ai) | Bezplatný tarif: 100 000 ANY tokenů denně a 100 RPM pro způsobilé modely Free/Basic; platební karta není vyžadována. | -| `api-airforce` | `af` | Api.airforce | klíč API | [odkaz](https://api.airforce) | 55 modelů v bezplatné úrovni, včetně Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash a DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | klíč API | [odkaz](https://arcee.ai) | Klíč API získáte na arcee.ai | -| `auriko` | `auriko` | Auriko | klíč API, agregátor | [odkaz](https://www.auriko.ai) | Bezplatný tarif nabízí 1 000 RPM platformy a 10 000 BYOK RPM. Inference platformy je nadále zpoplatněna podle nákladů poskytovatele; nejde o bezplatný fond tokenů ani neomezenou bezplatnou inferenci. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | klíč API, podnikové použití | [odkaz](https://learn.microsoft.com/azure/ai-foundry) | Použijte svůj klíč Azure AI Foundry. Základní URL může být https://.services.ai.azure.com/openai/v1/ nebo https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | klíč API, podnikové použití | [odkaz](https://azure.microsoft.com/products/ai-services/openai-service) | Použijte svůj klíč API pro Azure OpenAI. Základní URL by měla být koncovým bodem vašeho prostředku, například https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | klíč API | [odkaz](https://b.ai) | Bearer klíč API pro bránu LLM b.ai kompatibilní s OpenAI (odlišnou od TheB.AI). Vytvořte klíč na https://docs.b.ai a poté jako základní URL kompatibilní s OpenAI použijte https://api.b.ai/v1. | -| `baichuan` | `baichuan` | Baichuan | klíč API | [odkaz](https://www.baichuan-ai.com/) | Klíč API získáte na platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | klíč API | [odkaz](https://ernie.baidu.com/) | Klíč API získáte na console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | klíč API | [odkaz](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | klíč API | [odkaz](https://baseten.co) | Bezplatný zkušební kredit 30 $ na inferenci pomocí GPU | -| `bazaarlink` | `bzl` | BazaarLink | klíč API | [odkaz](https://bazaarlink.ai) | Použijte svůj klíč API BazaarLink (začíná na sk-bl-) v Authorization: Bearer . OpenAI SDK funguje se základní URL https://bazaarlink.ai/api/v1. Modely používají formát provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | klíč API, podnikové použití | [odkaz](https://aws.amazon.com/bedrock) | Použijte svůj klíč API Amazon Bedrock a nakonfigurujte oblast AWS, ve které jsou vaše modely povoleny (například eu-west-2). OmniRoute volá nativní Converse API služby Bedrock přímo. | -| `black-forest-labs` | `bfl` | Black Forest Labs | klíč API, obrázky | [odkaz](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | klíč API | [odkaz](https://blackbox.ai) | ⚠️ **ZASTARALÉ.** api.blackbox.ai vrací HTTP 404 pro každou variantu cesty (kontrola 2026-08-21); veřejné inferenční rozhraní bylo přesunuto na koncový bod enterprise.blackbox.ai/v1 s omezeným přístupem. | -| `bluesminds` | `bm` | BluesMinds | klíč API | [odkaz](https://www.bluesminds.com) | Bezplatné denní kredity pi — podporuje více než 200 modelů, včetně GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen a Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | klíč API | [odkaz](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | klíč API | [odkaz](https://bytez.com) | Bezplatný kredit 1 $, obnovuje se každé 4 týdny | -| `cerebras` | `cerebras` | Cerebras | klíč API | [odkaz](https://inference.cerebras.ai) | Jednorázový kredit 5 $ při registraci (platnost 30 dní); je vyžadována platební metoda. Nejde o pravidelně obnovovanou bezplatnou úroveň. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | klíč API | [odkaz](https://hyper.charm.land) | 100 bezplatných Hyperkreditů měsíčně při registraci | -| `chat-oripe` | `chat-oripe` | Chat Oripe | klíč API, agregátor | [odkaz](https://api.oriper.com) | Oficiální metadata uvádějí 2 miliony tokenů měsíčně, ale veřejný web a dokumentace byly během auditu zablokovány; kvótu a přiřazení značky proto považujte za nepotvrzené. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | klíč API, agregátor | [odkaz](https://chatanywhere.tech) | Pouze pro osobní, vzdělávací nebo výzkumné použití: veřejná dokumentace uvádí 10 000 bodů/den a 200 požadavků/den na IP/klíč; nepoužívejte pro komerční provoz. | -| `cheaperinference` | `cinf` | Cheaper Inference | klíč API | [odkaz](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | klíč API | [odkaz](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | klíč API, agregátor | [odkaz](https://chutes.ai) | Klíč API typu Bearer pro bránu Chutes kompatibilní s OpenAI. | -| `clarifai` | `clarifai` | Clarifai | klíč API, podnikové použití | [odkaz](https://docs.clarifai.com) | Použijte svůj Clarifai PAT nebo klíč API specifický pro aplikaci. OmniRoute používá koncový bod kompatibilní s OpenAI na adrese https://api.clarifai.com/v2/ext/openai/v1 a ověřuje se pomocí Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | klíč API, agregátor | [odkaz](https://cloudcode.one) | Mezi zveřejněné bezplatné modely patří glm-4.7-flash a glm-4.6v-flash; žádná číselná kvóta není zveřejněna a vytvoření klíče může vyžadovat kredit nebo kupón. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | klíč API | [odkaz](https://developers.cloudflare.com/workers-ai) | Vyžaduje API Token A Account ID (najdete na dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | klíč API | [odkaz](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | klíč API | [odkaz](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | klíč API | [odkaz](https://cohere.com) | Bezplatná zkušební verze: 1 000 volání API/měsíc pro testování, bez nutnosti platební karty | -| `command-code` | `cmd` | Command Code | klíč API | [odkaz](https://commandcode.ai/) | Použijte klíč API Command Code. Požadavky jsou odesílány na koncový bod Command Code /provider/v1/chat/completions. | -| `coze` | `coze` | Coze | klíč API | [odkaz](https://coze.com) | Klíč API získáte na coze.com/open/api | -| `crof` | `crof` | CrofAI | klíč API | [odkaz](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | klíč API | [odkaz](https://cursor.com/dashboard/api) | Vložte uživatelský klíč API Cursor (crsr_...) z cursor.com/dashboard/api. OmniRoute jej podle potřeby vymění za token relace; není nutná instalace IDE ani cursor-agent. Využití je účtováno tarifu Cursor, ke kterému klíč patří. | -| `dahl` | `dahl` | Dahl | klíč API | [odkaz](https://inference.dahl.global) | Kliknutím na „Add Account“ automaticky vygenerujte token nebo přidejte klíč API ručně. | -| `databricks` | `databricks` | Databricks | klíč API, podnikové použití | [odkaz](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | klíč API, podnikové použití | [odkaz](https://docs.datarobot.com) | Použijte svůj token API DataRobot. Volitelná základní URL může být kořenová adresa účtu (pro LLM Gateway) nebo URL nasazení pod /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | klíč API, obrázky | [odkaz](https://deepai.org) | Použijte svůj klíč API DeepAI. Získáte jej na deepai.org — vyžaduje předplatné Pro (9,99 USD/měsíc). | -| `deepinfra` | `deepinfra` | DeepInfra | klíč API | [odkaz](https://deepinfra.com) | Bezplatné kredity při registraci pro testování API a průzkum modelů | -| `deepseek` | `ds` | DeepSeek | klíč API | [odkaz](https://platform.deepseek.com) | 5M bezplatných tokenů při registraci – bez nutnosti platební karty | -| `dgrid` | `dgrid` | DGrid | klíč API | [odkaz](https://dgrid.ai) | Směrovač bezplatných modelů DGrid: 10 požadavků/minutu a 100 požadavků/den. Jednorázové dobití ve výši 5 USD odemkne až 20 požadavků/minutu a 1 000 požadavků/den. | -| `dify` | `dify` | Dify | klíč API | [odkaz](https://dify.ai) | Získejte klíč API ze své instance Dify. | -| `digitalocean` | `digitalocean` | DigitalOcean | klíč API | [odkaz](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | klíč API | [odkaz](https://dit.ai) | Použijte svůj klíč API dit.ai v Authorization: Bearer . Plně kompatibilní s OpenAI — přímá náhrada, stačí změnit základní URL na https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | klíč API | [odkaz](https://doubao.com) | Klíč API získáte na console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | klíč API, agregátor | [odkaz](https://www.dxnt.com) | U bezplatných účtů dokumentace uvádí 100 volání/den; kvóta se může zvýšit prostřednictvím pozvánek a může se u jednotlivých účtů lišit. | -| `electronhub` | `electronhub` | Electron Hub | klíč API, agregátor | [odkaz](https://www.electronhub.ai) | Bezplatný tarif: 5 RPM, týdenní kredit 0,25 USD a 10 Neutrinos/den pro modely :free; platí také rodinné rozpočty. | -| `empower` | `empower` | Empower | klíč API, agregátor | [odkaz](https://docs.empower.dev) | Klíč API typu Bearer pro koncový bod Empower kompatibilní s OpenAI. | -| `eurouter` | `eurouter` | EURouter | klíč API, agregátor | [odkaz](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | klíč API | [odkaz](https://factory.ai) | Klíč API typu Bearer pro bránu Factory kompatibilní s OpenAI. | -| `fal-ai` | `fal` | Fal.ai | klíč API, obrázky | [odkaz](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | klíč API, agregátor | [odkaz](https://fastrouter.ai) | Modely s příponou :free umožňují 10 požadavků/den na organizaci a model; dostupnost se může změnit. | -| `featherless-ai` | `featherless` | Featherless AI | klíč API | [odkaz](https://featherless.ai) | K dispozici je bezplatná úroveň — bez nutnosti platební karty | -| `fenayai` | `fenayai` | FenayAI | klíč API, agregátor | [odkaz](https://fenayai.com) | Klíč API typu Bearer pro bránu FenayAI kompatibilní s OpenAI. | -| `fireworks` | `fireworks` | Fireworks AI | klíč API | [odkaz](https://fireworks.ai) | Bezplatný počáteční kredit 1 USD při registraci pro testování API | -| `free-ai` | `free-ai` | Free.ai | klíč API, agregátor | [odkaz](https://free.ai) | 30 000 tokenů/den pokrývá modely provozované na vlastní infrastruktuře po ověření e-mailu. Využití nad rámec fondu může být účtováno za skutečné náklady a prémiové externí modely jsou placené. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | klíč API | [odkaz](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | Klíč API | [odkaz](https://freebuff.com) | Zadejte ověřovací token Freebuff / Codebuff (získaný přihlášením přes CLI nebo automatizovaným nástrojem pro sběr tokenů). | -| `freeinference` | `freeinference` | FreeInference | Klíč API, agregátor | [odkaz](https://freeinference.org) | Bezplatný přístup pro výzkumné účely bez platební karty; žadatelé mimo Harvard vyžadují ruční schválení a žádná číselná kvóta není veřejně garantována. | -| `freemodel-dev` | `fmd` | FreeModel.dev | Klíč API | [odkaz](https://freemodel.dev) | Bezplatný kredit $300 při registraci — bez nutnosti platební karty. Přístup k GPT-5.4 a GPT-5.5 (nejnovějším vlajkovým modelům OpenAI) prostřednictvím API kompatibilního s OpenAI. | -| `freetheai` | `fta` | FreeTheAi | Klíč API, agregátor | [odkaz](https://freetheai.xyz) | Připojte se k Discordu FreeTheAi a získejte bezplatný klíč API. | -| `friendliai` | `friendli` | FriendliAI | Klíč API | [odkaz](https://friendli.ai) | Bezplatná úroveň pro bezserverovou inferenci — bez nutnosti platební karty | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní kredity cake na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte jej na g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní kredity cake na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte jej na g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní kredity cake na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte jej na g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní kredity cake na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte jej na g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní kredity cake na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte jej na g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | Klíč API | [odkaz](https://galadriel.com) | ⚠️ **ZASTARALÉ.** api.galadriel.ai již nelze přeložit na IP adresu (kontrola 2026-06-19); zdá se, že inferenční API bylo ukončeno. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | Klíč API | [odkaz](https://aistudio.google.com) | Bezplatná úroveň dostupná prostřednictvím Google AI Studio; platí aktuální kvóty jednotlivých modelů a regionální omezení | -| `getgoapi` | `ggo` | GoAPI | Klíč API, agregátor | [odkaz](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | Klíč API | [odkaz](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | Klíč API | [odkaz](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Osobní přístupový token GitLab pro veřejné API Code Suggestions. Pokud nepoužíváte gitlab.com, nakonfigurujte základní adresu URL vlastní hostované instance. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Klíč API | [odkaz](https://opengateway.gitlawb.com) | Bezplatný MiMo (xiaomi/mimo-v2.5) byl zrušen v 2026-05 — Opengateway je nyní kreditní brána s průběžnými platbami; žádný pravidelně bezplatný model není k dispozici. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Klíč API | [odkaz](https://opengateway.gitlawb.com) | Bezplatná akce Nemotron skončila v 2026-06 — trasa GMI Cloud je nyní dostupná pouze s kredity a průběžnými platbami. | -| `glm` | `glm` | GLM Coding | Klíč API | [odkaz](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Čína) | Klíč API | [odkaz](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | Klíč API | [odkaz](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | Klíč API | [odkaz](https://greenpt.com) | Předplatné API lze vytvořit zdarma; inference je účtována za token. Žádný bezplatný limit inference není zveřejněn. | -| `groq` | `groq` | Groq | Klíč API | [odkaz](https://groq.com) | Bezplatný tarif: limity pro jednotlivé modely (200K tokenů/den na každý chatovací model; limity RPM/RPD viz console.groq.com/docs/rate-limits) — bez uložené platební metody. | -| `haiper` | `hp` | Haiper | Klíč API, video | [odkaz](https://haiper.ai) | Klíč API získáte na haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | Klíč API | [odkaz](https://api.hcnsec.cn) | Klíč API získáte na api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | Klíč API, agregátor | [odkaz](https://helixmind.online) | Dříve uváděné hodnoty 3 RPM/50 RPD a tvrzení, že není nutná platební karta, nebyly během auditu 2026-08-02 potvrzeny; aktuální kvóta a způsob účtování vyžadují ověření účtu. | -| `helyxai` | `helyxai` | Helyx AI | Klíč API, agregátor | [odkaz](https://helyxai.space) | Dokumentace funkčního bezplatného tarifu uvádí 100,000 tokenů/den; samostatné marketingové tvrzení webu o 2M+ je s tím v rozporu a nepovažuje se za garanci kvóty. | -| `heroku` | `heroku` | Heroku AI | Klíč API, podnikové použití | [odkaz](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | Klíč API | [odkaz](https://huggingface.co) | Bezplatné Inference API pro tisíce modelů (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | Klíč API | [odkaz](https://hyperbolic.xyz) | Zkušební kredit $1-5 při registraci pro bezserverovou inferenci | -| `ideogram` | `ideo` | Ideogram | Klíč API | [odkaz](https://ideogram.ai) | Klíč API získáte na ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | Klíč API | [odkaz](https://xinghuo.xfyun.cn) | Klíč API získáte na console.xfyun.cn | -| `inception` | `inception` | Inception | Klíč API | [odkaz](https://docs.inceptionlabs.ai) | 10M tokenů zdarma při registraci, bez nutnosti platební karty. | -| `inference-net` | `inet` | Inference.net | Klíč API | [odkaz](https://inference.net) | Kredit $25 zdarma při registraci a dostupné granty na výzkum | -| `internlm` | `internlm` | InternLM (Intern-S1) | Klíč API | [odkaz](https://internlm.intern-ai.org.cn/) | Bezplatná měsíční kvóta přibližně 1M vstupních / 3M výstupních tokenů (přibližně 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | Klíč API, vkládání/přeřazování | [odkaz](https://jina.ai) | Klíč API typu Bearer pro api.jina.ai — vkládání, přeřazování, klasifikace, segmentace a vyhledávání. Klíče z ovládacího panelu mají přednost před JINA_AI_API_KEY. Toto není karta Reader / r.jina.ai a nenačítá adresy URL. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Klíč API | [odkaz](https://jina.ai/reader) | Klíč API typu Bearer pro převod URL na markdown přes r.jina.ai (pouze /v1/web/fetch). Neposkytuje /v1/embeddings ani /v1/rerank. Funguje stejný token Jina jako pro Foundation API; když je tato karta prázdná, OmniRoute znovu použije klíč jina-ai z ovládacího panelu nebo JINA_AI_API_KEY. | -| `kenari` | `kenari` | Kenari | Klíč API | [odkaz](https://kenari.id) | Použijte svůj klíč API Kenari (kn-...) v Authorization: Bearer . Plně kompatibilní s OpenAI. Základní adresa URL API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | Klíč API | [odkaz](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | Klíč API, agregátor | [odkaz](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (starší Moonshot API) | Klíč API | [odkaz](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Klíč API Kimi Code | Klíč API | [odkaz](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | Klíč API | [odkaz](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | Klíč API, agregátor | [odkaz](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | Klíč API, video | [odkaz](https://leonardo.ai) | Klíč API získáte na leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | Klíč API | [odkaz](https://liquid.ai) | Klíč API získáte na liquid.ai | -| `literouter` | `literouter` | LiteRouter | Klíč API, agregátor | [odkaz](https://literouter.com) | Bezplatné varianty modelů používají příponu :free; denní limity kreditů se liší podle modelu a bezplatný vstup je omezen na 5 000 tokenů. | -| `llamagate` | `llamagate` | LlamaGate | Klíč API | [odkaz](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Klíč API, agregátor | [odkaz](https://llm.kiwi) | Bezplatný tarif zpřístupňuje auto a hrLLM; zveřejněný limit 40 požadavků za hodinu se vztahuje na hrLLM. | -| `llm7` | `llm7` | LLM7.io | Klíč API | [odkaz](https://llm7.io) | Použijte libovolný neprázdný klíč (například 'unused'). Pokud starší vestavěné modely vracejí model_unavailable, použijte Available Models → Import from /models nebo Auto-Sync; ověřený funkční model: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | Klíč API, agregátor | [odkaz](https://llmgateway.io) | Hostovaný bezplatný tarif: pokud účet nemá žádné kredity, jsou modely s nulovou cenou omezeny na 5 požadavků za 10 minut. | -| `logfare` | `logfare` | Logfare | Klíč API, agregátor | [odkaz](https://logfare.ai) | Vytvořte si bezplatný účet na https://logfare.ai/register (uživatelské jméno/heslo, bez ověření e-mailu), okamžitě získáte klíč API, který sem poté vložte jako token typu Bearer. | -| `longcat` | `lc` | LongCat AI | Klíč API | [odkaz](https://longcat.chat/platform/docs) | Zdarma: jednorázový příděl 10 milionů tokenů po registraci účtu a ověření KYC (LongCat-2.0). Pouze jednorázově — nejde o opakující se denní/měsíční příděl. | -| `magnific` | `freepik` | Magnific | Klíč API, obrázky | [odkaz](https://www.magnific.com) | Klíč API získáte na magnific.com/user/api-keys (hlavička x-magnific-api-key). Starší vývojářské klíče Freepik stále fungují. | -| `maritalk` | `maritalk` | Maritalk | Klíč API | [odkaz](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | Klíč API, agregátor | [odkaz](https://meganova.ai) | Bezplatná registrace bez platební karty. Zveřejněné kvóty úrovně Tier 1 pro jednotlivé modely činí dohromady 550 požadavků denně; nejde o sdílený globální fond a při povolení mohou být účtovány poplatky za překročení. | -| `meta-llama` | `meta` | Meta Llama API | Klíč API | [odkaz](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | Klíč API, video | [odkaz](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Čína) | Klíč API | [odkaz](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | Klíč API | [odkaz](https://mistral.ai) | Bezplatná úroveň Experiment: přístup ke všem modelům s omezením rychlosti, bez nutnosti platební karty | -| `mixedbread` | `mxbai` | Mixedbread AI | Klíč API | [odkaz](https://www.mixedbread.com) | Klíč API typu Bearer pro API vkládání Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | Klíč API, agregátor | [odkaz](https://www.mixlayer.com) | Model qwen/qwen3.5-4b-free je zdarma pro tvorbu prototypů a má omezenou rychlost; žádný pevný veřejný limit RPM ani denní kvóta nejsou potvrzeny. | -| `mnn-ai` | `mnn-ai` | MNN AI | Klíč API, agregátor | [odkaz](https://mnnai.ru) | Bezplatný tarif: měsíční kredity ve výši $1, 10 RPM a přístup pouze k modelům označeným jako Free. | -| `modal` | `mdl` | Modal | Klíč API, podnikové použití | [odkaz](https://modal.com/docs) | Pokud je povolen, použijte token typu Bearer chránící vaše nasazení Modal. Základní adresa URL by měla odkazovat na vaši aplikaci Modal kompatibilní s OpenAI, například https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | Klíč API | [odkaz](https://modelscope.cn) | Bezplatná úroveň prostřednictvím ModelScope API-Inference — je vyžadován účet Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | Klíč API | [odkaz](https://monsterapi.ai) | ⚠️ **ZASTARALÉ.** Monster API ukončilo provoz 2026-06-30. Použijte alternativní poskytovatele kompatibilní s OpenAI. | -| `moonshot` | `moonshot` | Kimi | Klíč API | [odkaz](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | Klíč API | [odkaz](https://morphllm.com) | Bezplatná úroveň: 250 tisíc kreditů měsíčně, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | Klíč API | [odkaz](https://github.com/meta-llama/llama-stack) | Použijte svou proměnnou prostředí META_API_KEY jako token typu Bearer. Muse Code CLI používá přenosový formát OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | Klíč API, agregátor | [odkaz](https://naga.ac) | Klíč API získáte na naga.ac — k dispozici je registrace přes Google/GitHub/Discord. | -| `naga-ai` | `naga-ai` | Naga AI | Klíč API, agregátor | [odkaz](https://naga.ac) | Modely označené :free jsou veřejně uvedeny, ale žádná číselná kvóta není potvrzena. Zásady společnosti Naga upozorňují, že výzvy a výstupy bezplatné úrovně mohou být shromažďovány nebo použity k trénování. | -| `nanogpt` | `nanogpt` | NanoGPT | Klíč API | [odkaz](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | Klíč API | [odkaz](https://bynara.id) | Vytvořte si bezplatný účet NaraRouter, propojte svůj Telegram (vyžadováno před odpověďmi z /v1) a poté sem vložte klíč jako token Bearer. | -| `navy` | `navy` | NavyAI | Klíč API | [odkaz](https://api.navy) | Vytvořte si bezplatný klíč API na řídicím panelu NavyAI a poté jej sem vložte jako token Bearer. | -| `nebius` | `nebius` | Nebius AI | Klíč API | [odkaz](https://nebius.com) | Zkušební kredit přibližně $1 při registraci pro testování API | -| `nlpcloud` | `nlpc` | NLP Cloud | Klíč API | [odkaz](https://docs.nlpcloud.com) | Použijte svůj klíč API NLP Cloud v Authorization: Token . OmniRoute ve výchozím nastavení používá endpoint chatbota na adrese https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | Klíč API | [odkaz](https://nomic.ai) | Klíč API získáte na atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | Klíč API | [odkaz](https://portal.nousresearch.com/help) | Použijte svůj klíč API portálu Nous. OmniRoute používá oficiální endpoint pro inferenci kompatibilní s OpenAI na adrese https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | Klíč API, video, agregátor | [odkaz](https://novita.ai) | Zkušební kredit $0.50 při registraci (platný přibližně 1 rok) | -| `nscale` | `nscale` | nScale | Klíč API | [odkaz](https://nscale.com) | Bezplatný kredit $5 při registraci pro testování inference | -| `nube` | `nube` | Nube.sh | Klíč API | [odkaz](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | Klíč API | [odkaz](https://build.nvidia.com) | Bezplatný přístup pro vývojáře: přibližně 40 RPM, více než 70 modelů (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | Klíč API, podnikové použití | [odkaz](https://www.oracle.com/artificial-intelligence/generative-ai) | Použijte svůj klíč API OCI Generative AI nebo nosný token IAM. Základní URL může být https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | Klíč API, agregátor | [odkaz](https://ofox.ai) | Aktuální katalog nabízí více než 10 bezplatných modelů bez veřejně uvedené číselné kvóty; před použitím v produkci zkontrolujte původ upstreamu a podmínky uchovávání dat a trénování. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Klíč API | [odkaz](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | Klíč API | [odkaz](https://1min.ai) | Vytvořte klíč API na adrese https://docs.1min.ai/docs/api/create-api-key a poté jej sem vložte. | -| `openadapter` | `oad` | OpenAdapter | Klíč API | [odkaz](https://openadapter.dev) | Použijte svůj klíč API OpenAdapter v Authorization: Bearer sk-cv-. Plně kompatibilní s OpenAI. Základní URL API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | Klíč API | [odkaz](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | Klíč API | [odkaz](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | Klíč API | [odkaz](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | Klíč API | [odkaz](https://openference.com) | Bezplatný tarif: třídenní zkušební období s open-source modely — bez nutnosti platební karty | -| `openrouter` | `openrouter` | OpenRouter | Klíč API, agregátor | [odkaz](https://openrouter.ai) | Bezplatné modely za $0/token s příponou :free – 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | Klíč API | [odkaz](https://openvecta.com) | Bezplatný kredit při registraci pro inferenci kompatibilní s OpenAI napříč LLM, embeddingy a modely uvažování | -| `opper` | `opper` | Opper | Klíč API, agregátor | [odkaz](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | Klíč API | [odkaz](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | Klíč API | [odkaz](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | Klíč API | [odkaz](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Klíč API | [odkaz](https://www.perplexity.ai) | Použijte svůj klíč API Perplexity. OmniRoute směruje ID modelů Agent API přes endpoint Perplexity kompatibilní s Responses. | -| `piapi` | `pi` | PiAPI | Klíč API, agregátor | [odkaz](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | Klíč API | [odkaz](https://pioneer.ai) | Bezplatný kredit na používání ve výši $75 — bez nutnosti platební karty | -| `plamo` | `plamo` | PLaMo | Klíč API | [odkaz](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | Klíč API, agregátor | [odkaz](https://creator.poe.com/api-reference) | Klíč API Bearer pro API Poe kompatibilní s OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | Klíč API, agregátor | [odkaz](https://poixe.com) | Aktuální veřejné bezplatné limity jsou nízké a specifické pro jednotlivé skupiny modelů: 2 RPM/5 RPD pro modely large-cup a 20 RPM/50 RPD pro modely small-cup. | -| `pollinations` | `pol` | Pollinations AI | Klíč API, video | [odkaz](https://pollinations.ai) | Anonymní přístup bez klíče k dokumentovaným bezplatným modelům je poskytován bez záruky. Místní ověření verze v3.8.50 (2026-07-31) vrátilo 401 prostřednictvím OmniRoute a Cloudflare 1010 při přímých upstream požadavcích ze stejné sítě. Prémiové modely stále vyžadují klíč API Pollinations z enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | Klíč API | [odkaz](https://poolside.ai) | Laguna S 2.1 a XS 2.1 jsou během fáze Preview zdarma; žádná veřejná číselná kvóta není zveřejněna. | -| `predibase` | `predibase` | Predibase | Klíč API | [odkaz](https://predibase.com) | ⚠️ **ZASTARALÉ.** serving.app.predibase.com již nelze přeložit na IP adresu (kontrola 2026-06-19); spravované API pro obsluhu modelů bylo zřejmě ukončeno. | -| `publicai` | `publicai` | PublicAI | Klíč API | [odkaz](https://publicai.co) | Vyžaduje klíč API — jednorázový kredit při registraci, poté placené použití | -| `qianfan` | `qianfan` | Baidu Qianfan | Klíč API | [odkaz](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | klíč API | [odkaz](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | klíč API | [odkaz](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | klíč API | [odkaz](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | klíč API, obrázky | [odkaz](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | klíč API | [odkaz](https://regolo.ai) | Získejte svůj klíč API Regolo na regolo.ai a poté jej sem vložte jako token Bearer. | -| `reka` | `reka` | Reka | klíč API | [odkaz](https://docs.reka.ai/chat/overview) | Použijte svůj klíč API Reka. OmniRoute podporuje základní URL kompatibilní s OpenAI https://api.reka.ai/v1 a kvůli kompatibilitě odesílá hlavičky Authorization i X-Api-Key. | -| `requesty` | `requesty` | Requesty | klíč API | [odkaz](https://requesty.ai) | Bezplatná úroveň nabízí přibližně 200 požadavků denně – směrovací brána pro více modelů (více než 300 modelů) | -| `routeway` | `routeway` | Routeway | klíč API | [odkaz](https://routeway.ai) | Vytvořte si bezplatný klíč API na routeway.ai a poté jej sem vložte jako token Bearer. | -| `runwayml` | `runway` | Runway | klíč API, video | [odkaz](https://docs.dev.runwayml.com) | Použijte svůj klíč API Runway v hlavičce Authorization: Bearer . OmniRoute používá aktuální API Runway na adrese https://api.dev.runwayml.com/v1 a automaticky odesílá požadovanou hlavičku X-Runway-Version. | -| `sambanova` | `samba` | SambaNova | klíč API | [odkaz](https://sambanova.ai) | Bezplatný kredit 5 $ při registraci (platnost 30 dní), platební karta není vyžadována | -| `sap` | `sap` | SAP Generative AI Hub | klíč API, podnikové použití | [odkaz](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Použijte svůj token Bearer pro SAP AI Core. Základní URL může být kořenová adresa AI_API_URL nebo deploymentUrl z Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | klíč API | [odkaz](https://docs.sarvam.ai) | Bezplatný kredit ₹1,000 za registraci — jeho platnost nikdy nevyprší | -| `scaleway` | `scw` | Scaleway AI | klíč API | [odkaz](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 milion bezplatných tokenů pro nové účty — soulad s předpisy EU/GDPR (Paříž), Qwen3 235B a Llama 70B | -| `sealion` | `sealion` | SEA-LION | klíč API | [odkaz](https://sea-lion.ai) | Přihlaste se na sea-lion.ai pomocí Googlu (bez karty a bez regionálního omezení), vytvořte klíč API a poté jej sem vložte. | -| `seekai` | `ska` | SeekAi | klíč API, agregátor | [odkaz](https://seekai.cc) | Vytvořte klíč API na https://seekai.cc a poté jej sem vložte jako token Bearer. | -| `segmind` | `segmind` | Segmind | klíč API, obrázky, video | [odkaz](https://segmind.com) | Použijte svůj klíč API Segmind v hlavičce x-api-key. OmniRoute používá adresu https://api.segmind.com/v1/ a vrací přímo bajty vygenerovaného obrázku či videa. | -| `sensenova` | `sensenova` | SenseNova | klíč API | [odkaz](https://platform.sensenova.cn) | Získejte klíč API na platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | klíč API | [odkaz](https://cloud.siliconflow.com) | Bezplatný kredit 1 $ a navíc aktuálně uvedené modely za 0 $ po ověření identity; dostupnost a limity se mohou změnit | -| `snowflake` | `snowflake` | Snowflake Cortex | klíč API, podnikové použití | [odkaz](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | klíč API | [odkaz](https://xinghuo.xfyun.cn) | Získejte klíč API na console.xfyun.cn | -| `speka` | `speka` | Speka AI | klíč API, agregátor | [odkaz](https://speka.me) | Bezplatný plán: měsíční využití v hodnotě 1 $, 10 RPM, jeden klíč API a přístup k otevřeným modelům a interaktivnímu prostředí; platební karta není vyžadována. | -| `stability-ai` | `stability` | Stability AI | klíč API, obrázky | [odkaz](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | klíč API | [odkaz](https://stepfun.com) | Získejte klíč API na platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | klíč API | [odkaz](https://ai.sumopod.com) | Použijte svůj klíč API SumoPod (sk-...) v hlavičce Authorization: Bearer . Plně kompatibilní s OpenAI. Základní URL API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | klíč API | [odkaz](https://suno.ai) | Vložte soubor cookie relace ze suno.ai (ověřování Clerk) | -| `synthetic` | `synthetic` | Synthetic | klíč API, agregátor | [odkaz](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | klíč API, agregátor | [odkaz](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | klíč API | [odkaz](https://hunyuan.tencent.com) | Získejte klíč API na console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | klíč API, agregátor | [odkaz](https://theb.ai) | Klíč API Bearer pro bránu TheB.AI kompatibilní s OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | klíč API | [odkaz](https://docs.tinyfish.ai/fetch-api) | X-API-Key z agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | klíč API, video | [odkaz](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | klíč API | [odkaz](https://agent-router.gaib.ai) | Použijte svůj klíč API Token Kiosk v hlavičce Authorization: Bearer . Brána plně kompatibilní s OpenAI. Základní URL API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | klíč API, agregátor | [odkaz](https://www.tokenreply.com) | Modely označené jako bezplatné mají denní limity specifické pro jednotlivé modely a kampaně; žádná pevná globální bezplatná kvóta není zveřejněna. | -| `tokenrouter` | `trk` | TokenRouter | klíč API | [odkaz](https://tokenrouter.com) | Použijte svůj klíč API TokenRouter v hlavičce Authorization: Bearer . Plně kompatibilní s OpenAI. Základní URL API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | klíč API, obrázky | [odkaz](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | klíč API | [odkaz](https://docs.opentyphoon.ai) | Bezplatný klíč API s limitem 5 požadavků/s a 200 požadavků/m. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Klíč API | [odkaz](https://uncensored.com) | Použijte svůj vývojářský klíč API z uncensored.com (uai_sk_live_...). OmniRoute jej odesílá jako hlavičku X-api-key do koncového bodu https://api.uncensored.com/api/v1 kompatibilního s OpenAI. Platnost klíče nikdy nevyprší. Toto je rozhraní účtované podle využití/kreditů; chat v rámci předplatného bez měření využití poskytuje samostatný poskytovatel 'uc'. | -| `udio` | `udio` | Udio | Klíč API | [odkaz](https://udio.com) | Vložte soubor cookie relace z udio.com (ověřování Supabase) | -| `unorouter` | `unorouter` | UnoRouter | Klíč API, agregátor | [odkaz](https://unorouter.ai) | Modely s příponou :free neodečítají kredit; limit je 1 požadavek za minutu na každý bezplatný model a uživatele. | -| `upstage` | `upstage` | Upstage | Klíč API | [odkaz](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | Klíč API | [odkaz](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | Klíč API | [odkaz](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Klíč API, agregátor | [odkaz](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | Klíč API, podnikové použití | [odkaz](https://cloud.google.com/vertex-ai) | Zadejte JSON účtu služby, přístupový token OAuth, klíč API služby Vertex Express nebo autorizační klíč svázaný s účtem služby. Režim Express podporuje pouze Gemini; partnerské modely vyžadují přihlašovací údaje vázané na projekt. | -| `vertex-partner` | `vp` | Vertex AI Partners | Klíč API, podnikové použití | [odkaz](https://cloud.google.com/vertex-ai) | Zadejte JSON účtu služby nebo přihlašovací údaje OAuth. Autorizační klíč svázaný s účtem služby také podporuje vyhledávání, ale inference partnerských modelů navíc vyžaduje ID příslušného projektu Google Cloud. Standardní klíče Express podporují pouze Gemini. | -| `void-ai` | `void-ai` | Void AI | Klíč API, agregátor | [odkaz](https://voidai.app) | Veřejný katalog modelů označuje některé modely jako modely vyžadující bezplatný tarif, přístup je však podmíněný a žádná číselná kvóta není potvrzena. | -| `volcengine` | `volcengine` | Volcengine | Klíč API | [odkaz](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Klíč API | [odkaz](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Připojte svůj účet Volcano Engine nebo použijte klíč API předplatného Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Klíč API | [odkaz](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Připojte svůj účet Volcano Engine nebo použijte klíč API předplatného Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | Klíč API, vektorové reprezentace/opětovné řazení | [odkaz](https://www.voyageai.com) | Klíč API typu Bearer pro rozhraní API služby Voyage AI určená pro vektorové reprezentace a opětovné řazení. | -| `wafer` | `wafer` | Wafer AI | Klíč API | [odkaz](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | Klíč API | [odkaz](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Klíč API, podnikové použití | [odkaz](https://www.ibm.com/products/watsonx-ai) | Použijte svůj token watsonx typu Bearer. Základní URL může být https://.ml.cloud.ibm.com/ml/gateway/v1/ nebo samostatně spravovaný koncový bod /ml/gateway/v1. | -| `writer` | `writer` | Writer | Klíč API | [odkaz](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | Klíč API | [odkaz](https://x5lab.dev) | Použijte svůj klíč API X5Lab (x5-...) v Authorization: Bearer . Plně kompatibilní s OpenAI. Základní URL rozhraní API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | Klíč API | [odkaz](https://x.ai) | Použijte oficiální klíč API xAI nebo se přihlaste pomocí xAI OAuth. Relace JWT služby Grok Build zůstávají samostatným poskytovatelem. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Klíč API | [odkaz](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Klíč API | [odkaz](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | Klíč API, agregátor | [odkaz](https://xkiro.com) | Vytvořte si bezplatný účet na xkiro.com a vložte sem klíč (Bearer; přijímá se také x-api-key). | -| `yi` | `yi` | Yi (01.AI) | Klíč API | [odkaz](https://01.ai) | Získejte klíč API na platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | Klíč API, agregátor | [odkaz](https://yolo-auto.com) | Bezplatný přístup k API má omezený počet požadavků a je určen k testování; žádná číselná denní kvóta není zveřejněna a bezplatný přístup není přislíben na neurčito. | -| `zai` | `zai` | Z.AI | Klíč API | [odkaz](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | Klíč API | [odkaz](https://zenmux.ai) | Použijte svůj klíč API ZenMux v Authorization: Bearer . ZenMux je plně kompatibilní s OpenAI. Základní URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Klíč API, agregátor | [odkaz](https://www.zerolimitai.com) | Je inzerována dočasná bezplatná zkušební verze, oficiální stránky si však odporují v tom, zda trvá 3, nebo 7 dní; tvrzení o 100 voláních denně se nepovažuje za trvalé. | -| `zylo-api` | `zylo` | Zylo API | Klíč API, agregátor | [odkaz](https://zyloai.net) | Tarif Basic: 10 RPM, 7 200 požadavků denně a 200 000 tokenů denně; omezeno na textové modely Basic. | +## Poskytovatelé API klíčů (placení / placení s bezplatnými kredity) (242) + +| ID | Alias | Název | Štítky | Web | Poznámky | +| ------------------------ | --------------- | ------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | Klíč API | [odkaz](https://ai.360.cn) | Klíč API získáte na ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | Klíč API, agregátor | [odkaz](https://agentrouter.org) | Kredit 200 $ zdarma při registraci – brána pro směrování mezi více modely | +| `agnes` | `agnes` | Agnes AI | Klíč API, video | [odkaz](https://agnes-ai.com) | Klíč API získáte na agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (Čína) | Klíč API | [odkaz](https://api.agnes-ai.cn) | Klíč API získáte na čínském webu Agnes. | +| `ai21` | `ai21` | AI21 Labs | Klíč API | [odkaz](https://www.ai21.com) | Zkušební kredit 10 $ při registraci (platný 3 měsíce), platební karta není vyžadována | +| `aimlapi` | `aiml` | AI/ML API | Klíč API, agregátor | [odkaz](https://aimlapi.com) | Bezplatná úroveň je pozastavena (2026) — AI/ML API nyní funguje pouze na principu průběžných plateb (minimální dobití 20 $); žádný pravidelně obnovovaný bezplatný kredit. | +| `ainative` | `ainative` | AINative Studio | Klíč API | [odkaz](https://ainative.studio) | Vytvořte si bezplatný klíč API na ainative.studio (bez karty) a poté jej sem vložte jako token Bearer. | +| `aion` | `aion` | Aion Labs | Klíč API | [odkaz](https://www.aionlabs.ai) | Vytvořte si bezplatný klíč API na aionlabs.ai (bez karty) a poté jej sem vložte jako token Bearer. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | Klíč API | [odkaz](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Čína) | Klíč API | [odkaz](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Klíč API | [odkaz](https://developer.ant-ling.com/en/docs/) | Zaregistrujte se a vytvořte klíč API v konzoli Ant Ling API (https://chat.ant-ling.com/open), poté jej sem vložte. OmniRoute směruje provoz chatu na https://api.ant-ling.com/v1/chat/completions; poskytovatel je kompatibilní s OpenAI a nabízí také rozhraní kompatibilní s Anthropic. | +| `anthropic` | `anthropic` | Anthropic | Klíč API | [odkaz](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | Klíč API, agregátor | [odkaz](https://anyapi.ai) | Bezplatný tarif: 100 000 tokenů ANY denně a 100 RPM pro způsobilé modely Free/Basic; platební karta není vyžadována. | +| `api-airforce` | `af` | Api.airforce | Klíč API | [odkaz](https://api.airforce) | 55 modelů v bezplatné úrovni, včetně Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash a DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | Klíč API | [odkaz](https://arcee.ai) | Klíč API získáte na arcee.ai | +| `auriko` | `auriko` | Auriko | Klíč API, agregátor | [odkaz](https://www.auriko.ai) | Bezplatný tarif nabízí 1 000 RPM platformy a 10 000 RPM pro BYOK. Inference platformy je stále zpoplatněna podle nákladů poskytovatele; nejde o bezplatný fond tokenů ani neomezenou bezplatnou inferenci. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | Klíč API, podnikové použití | [odkaz](https://learn.microsoft.com/azure/ai-foundry) | Použijte svůj klíč Azure AI Foundry. Základní URL může být https://.services.ai.azure.com/openai/v1/ nebo https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | Klíč API, podnikové použití | [odkaz](https://azure.microsoft.com/products/ai-services/openai-service) | Použijte svůj klíč API pro Azure OpenAI. Základní URL by měla být koncovým bodem vašeho prostředku, například https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | Klíč API | [odkaz](https://b.ai) | Klíč API Bearer pro bránu LLM b.ai kompatibilní s OpenAI (odlišnou od TheB.AI). Vytvořte klíč na https://docs.b.ai a poté použijte https://api.b.ai/v1 jako základní URL kompatibilní s OpenAI. | +| `baichuan` | `baichuan` | Baichuan | Klíč API | [odkaz](https://www.baichuan-ai.com/) | Klíč API získáte na platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | Klíč API | [odkaz](https://ernie.baidu.com/) | Klíč API získáte na console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Klíč API | [odkaz](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | Klíč API | [odkaz](https://baseten.co) | Bezplatný zkušební kredit 30 $ pro inferenci na GPU | +| `bazaarlink` | `bzl` | BazaarLink | Klíč API | [odkaz](https://bazaarlink.ai) | Použijte svůj klíč API BazaarLink (začíná na sk-bl-) v Authorization: Bearer . OpenAI SDK funguje se základní URL https://bazaarlink.ai/api/v1. Modely používají formát poskytovatel/název-modelu. | +| `bedrock` | `bedrock` | Amazon Bedrock | Klíč API, podnikové použití | [odkaz](https://aws.amazon.com/bedrock) | Použijte svůj klíč API pro Amazon Bedrock a nakonfigurujte oblast AWS, ve které jsou vaše modely povoleny (například eu-west-2). OmniRoute volá nativní Converse API služby Bedrock přímo. | +| `black-forest-labs` | `bfl` | Black Forest Labs | Klíč API, obrázky | [odkaz](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | Klíč API | [odkaz](https://blackbox.ai) | ⚠️ **ZASTARALÉ.** api.blackbox.ai vrací HTTP 404 pro každou variantu cesty (kontrola 2026-08-21); veřejné rozhraní pro inferenci bylo přesunuto na omezený koncový bod enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | Klíč API | [odkaz](https://www.bluesminds.com) | Denní kredit pi zdarma — podporuje více než 200 modelů, včetně GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen a Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | Klíč API | [odkaz](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | Klíč API | [odkaz](https://bytez.com) | Kredit 1 $ zdarma, obnovuje se každé 4 týdny | +| `cerebras` | `cerebras` | Cerebras | Klíč API | [odkaz](https://inference.cerebras.ai) | Jednorázový kredit 5 $ při registraci (platnost 30 dní); je vyžadována platební metoda. Nejde o pravidelně obnovovanou bezplatnou úroveň. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | Klíč API | [odkaz](https://hyper.charm.land) | 100 bezplatných Hypercredits měsíčně při registraci | +| `chat-oripe` | `chat-oripe` | Chat Oripe | Klíč API, agregátor | [odkaz](https://api.oriper.com) | Oficiální metadata uvádějí 2 miliony tokenů měsíčně, ale veřejný web a dokumentace byly během auditu zablokovány; kvótu a přiřazení značky proto považujte za nepotvrzené. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | Klíč API, agregátor | [odkaz](https://chatanywhere.tech) | Pouze pro osobní, vzdělávací nebo výzkumné použití: veřejná dokumentace uvádí 10 000 bodů/den a 200 požadavků/den na IP adresu/klíč; nepoužívejte pro komerční provoz. | +| `cheaperinference` | `cinf` | Cheaper Inference | Klíč API | [odkaz](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | Klíč API | [odkaz](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | Klíč API, agregátor | [odkaz](https://chutes.ai) | Klíč API typu Bearer pro bránu Chutes kompatibilní s OpenAI. | +| `clarifai` | `clarifai` | Clarifai | Klíč API, podnikové použití | [odkaz](https://docs.clarifai.com) | Použijte svůj Clarifai PAT nebo klíč API specifický pro aplikaci. OmniRoute používá koncový bod kompatibilní s OpenAI na adrese https://api.clarifai.com/v2/ext/openai/v1 a ověřuje se pomocí Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Klíč API, agregátor | [odkaz](https://cloudcode.one) | Mezi zveřejněné bezplatné modely patří glm-4.7-flash a glm-4.6v-flash; žádná číselná kvóta není zveřejněna a vytvoření klíče může vyžadovat kredit nebo kupón. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Klíč API | [odkaz](https://developers.cloudflare.com/workers-ai) | Vyžaduje API Token A Account ID (najdete na dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | Klíč API | [odkaz](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | Klíč API | [odkaz](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | Klíč API | [odkaz](https://cohere.com) | Bezplatná zkušební verze: 1 000 volání API/měsíc pro testování, bez nutnosti platební karty | +| `command-code` | `cmd` | Command Code | Klíč API | [odkaz](https://commandcode.ai/) | Použijte klíč API služby Command Code. Požadavky jsou odesílány do koncového bodu /provider/v1/chat/completions služby Command Code. | +| `coze` | `coze` | Coze | Klíč API | [odkaz](https://coze.com) | Klíč API získáte na coze.com/open/api | +| `crof` | `crof` | CrofAI | Klíč API | [odkaz](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | Klíč API | [odkaz](https://cursor.com/dashboard/api) | Vložte uživatelský klíč API služby Cursor (crsr_...) z cursor.com/dashboard/api. OmniRoute jej podle potřeby vymění za token relace; není nutná instalace IDE ani cursor-agent. Využití je účtováno v rámci tarifu Cursor, ke kterému klíč náleží. | +| `dahl` | `dahl` | Dahl | Klíč API | [odkaz](https://inference.dahl.global) | Kliknutím na „Add Account“ automaticky vygenerujte token, případně přidejte klíč API ručně. | +| `databricks` | `databricks` | Databricks | Klíč API, podnikové použití | [odkaz](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | Klíč API, podnikové použití | [odkaz](https://docs.datarobot.com) | Použijte svůj token API služby DataRobot. Volitelná základní adresa URL může být kořenová adresa účtu (pro LLM Gateway) nebo adresa URL nasazení pod /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | Klíč API, obrázky | [odkaz](https://deepai.org) | Použijte svůj klíč API služby DeepAI. Získáte jej na deepai.org — vyžaduje předplatné Pro (9,99 USD/měsíc). | +| `deepinfra` | `deepinfra` | DeepInfra | Klíč API | [odkaz](https://deepinfra.com) | Bezplatné kredity při registraci pro testování API a zkoumání modelů | +| `deepseek` | `ds` | DeepSeek | Klíč API | [odkaz](https://platform.deepseek.com) | 5 milionů tokenů zdarma při registraci – bez nutnosti platební karty | +| `dgrid` | `dgrid` | DGrid | Klíč API | [odkaz](https://dgrid.ai) | Směrovač bezplatných modelů DGrid: 10 požadavků/minutu a 100 požadavků/den. Jednorázové dobití ve výši 5 USD odemkne až 20 požadavků/minutu a 1 000 požadavků/den. | +| `dify` | `dify` | Dify | Klíč API | [odkaz](https://dify.ai) | Klíč API získáte ze své instance Dify. | +| `digitalocean` | `digitalocean` | DigitalOcean | Klíč API | [odkaz](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | Klíč API | [odkaz](https://dit.ai) | Použijte svůj klíč API služby dit.ai v Authorization: Bearer . Plně kompatibilní s OpenAI — přímá náhrada, stačí změnit základní adresu URL na https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | Klíč API | [odkaz](https://doubao.com) | Klíč API získáte na console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | Klíč API, agregátor | [odkaz](https://www.dxnt.com) | Pro bezplatné účty je zdokumentován limit 100 volání/den; kvóta se může zvýšit prostřednictvím pozvánek a může se u jednotlivých účtů lišit. | +| `electronhub` | `electronhub` | Electron Hub | Klíč API, agregátor | [odkaz](https://www.electronhub.ai) | Bezplatný tarif: 5 RPM, týdenní kredit 0,25 USD a 10 Neutrinos/den pro modely s příponou :free; platí také rodinné rozpočty. | +| `empower` | `empower` | Empower | Klíč API, agregátor | [odkaz](https://docs.empower.dev) | Klíč API typu Bearer pro koncový bod služby Empower kompatibilní s OpenAI. | +| `eurouter` | `eurouter` | EURouter | Klíč API, agregátor | [odkaz](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | Klíč API | [odkaz](https://factory.ai) | Klíč API typu Bearer pro bránu Factory kompatibilní s OpenAI. | +| `fal-ai` | `fal` | Fal.ai | Klíč API, obrázky | [odkaz](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | Klíč API, agregátor | [odkaz](https://fastrouter.ai) | Modely s příponou :free umožňují 10 požadavků/den na organizaci a model; dostupnost se může měnit. | +| `featherless-ai` | `featherless` | Featherless AI | Klíč API | [odkaz](https://featherless.ai) | K dispozici je bezplatná úroveň — bez nutnosti platební karty | +| `fenayai` | `fenayai` | FenayAI | Klíč API, agregátor | [odkaz](https://fenayai.com) | Klíč API typu Bearer pro bránu FenayAI kompatibilní s OpenAI. | +| `fireworks` | `fireworks` | Fireworks AI | Klíč API | [odkaz](https://fireworks.ai) | Po registraci získáte počáteční kredit 1 USD zdarma na testování API | +| `free-ai` | `free-ai` | Free.ai | Klíč API, agregátor | [odkaz](https://free.ai) | 30 000 tokenů/den pokrývá po ověření e-mailu modely provozované ve vlastní infrastruktuře. Využití nad rámec tohoto limitu může být účtováno za skutečné náklady a prémiové externí modely jsou placené. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | Klíč API | [odkaz](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | Klíč API | [odkaz](https://freebuff.com) | Zadejte autentizační token Freebuff / Codebuff (získaný přihlášením přes CLI nebo automatizovaným nástrojem pro sběr tokenů). | +| `freeinference` | `freeinference` | FreeInference | Klíč API, agregátor | [odkaz](https://freeinference.org) | Bezplatný přístup pro výzkumné účely bez platební karty; žadatelé mimo Harvard vyžadují ruční schválení a žádná číselná kvóta není veřejně zaručena. | +| `freemodel-dev` | `fmd` | FreeModel.dev | Klíč API | [odkaz](https://freemodel.dev) | Bezplatné kredity v hodnotě $300 při registraci — bez nutnosti platební karty. Přístup k modelům GPT-5.4 a GPT-5.5 (nejnovějším vlajkovým modelům OpenAI) prostřednictvím API kompatibilního s OpenAI. | +| `freetheai` | `fta` | FreeTheAi | Klíč API, agregátor | [odkaz](https://freetheai.xyz) | Připojte se k serveru FreeTheAi na Discordu a získejte bezplatný klíč API. | +| `friendliai` | `friendli` | FriendliAI | Klíč API | [odkaz](https://friendli.ai) | Bezplatná úroveň pro bezserverovou inferenci — bez nutnosti platební karty | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní „cake“ kredity na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte si jej na g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní „cake“ kredity na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte si jej na g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní „cake“ kredity na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte si jej na g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní „cake“ kredity na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte si jej na g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Klíč API, agregátor | [odkaz](https://g4f.space) | Získejte anonymní „cake“ kredity na g4f.dev/chat nebo použijte členský klíč g4f.dev (vytvořte si jej na g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | Klíč API | [odkaz](https://galadriel.com) | ⚠️ **ZASTARALÉ.** api.galadriel.ai již nelze přeložit na IP adresu (kontrola 2026-06-19); inferenční API bylo zřejmě ukončeno. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | Klíč API | [odkaz](https://aistudio.google.com) | Bezplatná úroveň je dostupná prostřednictvím Google AI Studio; platí aktuální kvóty jednotlivých modelů a regionální omezení | +| `getgoapi` | `ggo` | GoAPI | Klíč API, agregátor | [odkaz](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | Klíč API | [odkaz](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | Klíč API | [odkaz](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Osobní přístupový token GitLab pro veřejné API Code Suggestions. Pokud nepoužíváte gitlab.com, nakonfigurujte vlastní základní adresu URL. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Klíč API | [odkaz](https://opengateway.gitlawb.com) | Bezplatný model MiMo (xiaomi/mimo-v2.5) byl zrušen 2026-05 — Opengateway nyní funguje jako kreditní brána s průběžnými platbami; žádný opakovaně bezplatný model není k dispozici. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Klíč API | [odkaz](https://opengateway.gitlawb.com) | Bezplatná akce Nemotron skončila 2026-06 — trasa GMI Cloud je nyní dostupná pouze prostřednictvím kreditů s průběžnými platbami. | +| `glm` | `glm` | GLM Coding | Klíč API | [odkaz](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Čína) | Klíč API | [odkaz](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | Klíč API | [odkaz](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | Klíč API | [odkaz](https://greenpt.com) | Předplatné API lze vytvořit bezplatně; inference je účtována za token. Žádný bezplatný příděl pro inferenci není zveřejněn. | +| `groq` | `groq` | Groq | Klíč API | [odkaz](https://groq.com) | Bezplatný tarif: limity pro jednotlivé modely (200K tokenů/den pro každý chatovací model; limity RPM/RPD viz console.groq.com/docs/rate-limits) — bez uložené platební metody. | +| `haiper` | `hp` | Haiper | Klíč API, video | [odkaz](https://haiper.ai) | Klíč API získáte na haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | Klíč API | [odkaz](https://api.hcnsec.cn) | Klíč API získáte na api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | Klíč API, agregátor | [odkaz](https://helixmind.online) | Dříve uváděná tvrzení o limitech 3 RPM/50 RPD a absenci požadavku na platební kartu nebyla během auditu 2026-08-02 potvrzena; aktuální kvóta a fakturace vyžadují ověření účtu. | +| `helyxai` | `helyxai` | Helyx AI | Klíč API, agregátor | [odkaz](https://helyxai.space) | Dokumentace funkčního bezplatného tarifu uvádí 100,000 tokenů/den; samostatné marketingové tvrzení webu o 2M+ je s tím v rozporu a nepovažuje se za záruku kvóty. | +| `heroku` | `heroku` | Heroku AI | Klíč API, podnikové řešení | [odkaz](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | Klíč API | [odkaz](https://huggingface.co) | Bezplatné inferenční API pro tisíce modelů (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | Klíč API | [odkaz](https://hyperbolic.xyz) | Zkušební kredity v hodnotě $1-5 při registraci pro bezserverovou inferenci | +| `ideogram` | `ideo` | Ideogram | Klíč API | [odkaz](https://ideogram.ai) | Klíč API získáte na ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | Klíč API | [odkaz](https://xinghuo.xfyun.cn) | Klíč API získáte na console.xfyun.cn | +| `inception` | `inception` | Inception | Klíč API | [odkaz](https://docs.inceptionlabs.ai) | 10M bezplatných tokenů při registraci, bez nutnosti platební karty. | +| `inference-net` | `inet` | Inference.net | Klíč API | [odkaz](https://inference.net) | Bezplatné kredity v hodnotě $25 při registraci a dostupné granty pro výzkum | +| `internlm` | `internlm` | InternLM (Intern-S1) | Klíč API | [odkaz](https://internlm.intern-ai.org.cn/) | Bezplatná měsíční kvóta ~1M vstupních / 3M výstupních tokenů (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | Klíč API, vkládání/přeřazování | [odkaz](https://jina.ai) | Klíč API typu Bearer pro api.jina.ai — vkládání, přeřazování, klasifikaci, segmentaci a vyhledávání. Klíče z řídicího panelu mají přednost před JINA_AI_API_KEY. Toto není karta Reader / r.jina.ai a nenačítá adresy URL. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Klíč API | [odkaz](https://jina.ai/reader) | Klíč API typu Bearer pro převod adres URL na Markdown prostřednictvím r.jina.ai (pouze /v1/web/fetch). Neposkytuje /v1/embeddings ani /v1/rerank. Funguje stejný token Jina jako pro Foundation API; pokud je tato karta prázdná, OmniRoute znovu použije klíč jina-ai z řídicího panelu nebo JINA_AI_API_KEY. | +| `kenari` | `kenari` | Kenari | Klíč API | [odkaz](https://kenari.id) | Použijte svůj klíč API Kenari (kn-...) v Authorization: Bearer . Plně kompatibilní s OpenAI. Základní adresa URL API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | Klíč API | [odkaz](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | Klíč API, agregátor | [odkaz](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (starší Moonshot API) | Klíč API | [odkaz](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | Klíč API | [odkaz](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | Klíč API | [odkaz](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | Klíč API, agregátor | [odkaz](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | Klíč API, video | [odkaz](https://leonardo.ai) | Klíč API získáte na leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | Klíč API | [odkaz](https://liquid.ai) | Klíč API získáte na liquid.ai | +| `literouter` | `literouter` | LiteRouter | Klíč API, agregátor | [odkaz](https://literouter.com) | Bezplatné varianty modelů používají příponu :free; denní limity kreditů se liší podle modelu a bezplatný vstup je omezen na 5 000 tokenů. | +| `llamagate` | `llamagate` | LlamaGate | Klíč API | [odkaz](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Klíč API, agregátor | [odkaz](https://llm.kiwi) | Bezplatný tarif zpřístupňuje auto a hrLLM; zveřejněný limit 40 požadavků za hodinu platí pro hrLLM. | +| `llm7` | `llm7` | LLM7.io | Klíč API | [odkaz](https://llm7.io) | Použijte libovolný neprázdný klíč (například 'unused'). Pokud starší vestavěné modely vracejí model_unavailable, použijte Dostupné modely → Importovat z /models nebo Automatická synchronizace; ověřený funkční model: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | Klíč API, agregátor | [odkaz](https://llmgateway.io) | Hostovaný bezplatný tarif: pokud účet nemá žádné kredity, modely s nulovou cenou jsou omezeny na 5 požadavků za 10 minut. | +| `logfare` | `logfare` | Logfare | Klíč API, agregátor | [odkaz](https://logfare.ai) | Vytvořte si bezplatný účet na https://logfare.ai/register (uživatelské jméno/heslo, bez ověření e-mailu), okamžitě obdržíte klíč API a poté jej sem vložte jako token typu Bearer. | +| `longcat` | `lc` | LongCat AI | Klíč API | [odkaz](https://longcat.chat/platform/docs) | Zdarma: jednorázový příděl 10 milionů tokenů po registraci účtu a ověření KYC (LongCat-2.0). Pouze jednorázově — nejde o opakující se denní/měsíční příděl. | +| `magnific` | `freepik` | Magnific | Klíč API, obrázky | [odkaz](https://www.magnific.com) | Klíč API získáte na magnific.com/user/api-keys (hlavička x-magnific-api-key). Starší vývojářské klíče Freepik stále fungují. | +| `maritalk` | `maritalk` | Maritalk | Klíč API | [odkaz](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | Klíč API, agregátor | [odkaz](https://meganova.ai) | Bezplatná registrace bez platební karty. Zveřejněné kvóty úrovně Tier 1 pro jednotlivé modely činí celkem 550 požadavků denně; nejde o společný globální fond a při povolení mohou být účtovány placené požadavky nad limit. | +| `meta-llama` | `meta` | Meta Llama API | Klíč API | [odkaz](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | Klíč API, video | [odkaz](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Čína) | Klíč API | [odkaz](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | Klíč API | [odkaz](https://mistral.ai) | Bezplatná úroveň Experiment: přístup ke všem modelům s omezením rychlosti, platební karta není vyžadována | +| `mixedbread` | `mxbai` | Mixedbread AI | Klíč API | [odkaz](https://www.mixedbread.com) | Klíč API typu Bearer pro API vkládání Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | Klíč API, agregátor | [odkaz](https://www.mixlayer.com) | Model qwen/qwen3.5-4b-free je zdarma pro prototypování a má omezenou rychlost; žádný pevný veřejný limit RPM ani denní kvóta nejsou potvrzeny. | +| `mnn-ai` | `mnn-ai` | MNN AI | Klíč API, agregátor | [odkaz](https://mnnai.ru) | Bezplatný tarif: měsíční kredity v hodnotě $1, 10 RPM a přístup pouze k modelům označeným Free. | +| `modal` | `mdl` | Modal | Klíč API, podnikové použití | [odkaz](https://modal.com/docs) | Použijte token typu Bearer, který chrání vaše nasazení Modal, pokud je ochrana povolena. Základní adresa URL by měla odkazovat na vaši aplikaci Modal kompatibilní s OpenAI, například https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | Klíč API | [odkaz](https://modelscope.cn) | Bezplatná úroveň prostřednictvím ModelScope API-Inference — je vyžadován účet Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | Klíč API | [odkaz](https://monsterapi.ai) | ⚠️ **ZASTARALÉ.** Monster API ukončilo provoz dne 2026-06-30. Použijte alternativní poskytovatele kompatibilní s OpenAI. | +| `moonshot` | `moonshot` | Kimi | Klíč API | [odkaz](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | Klíč API | [odkaz](https://morphllm.com) | Bezplatná úroveň: 250 tisíc kreditů měsíčně, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | Klíč API | [odkaz](https://github.com/meta-llama/llama-stack) | Použijte svou proměnnou prostředí META_API_KEY jako token typu Bearer. Muse Code CLI používá přenosový formát OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | Klíč API, agregátor | [odkaz](https://naga.ac) | Klíč API získáte na naga.ac — k dispozici je registrace přes Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | API klíč, agregátor | [odkaz](https://naga.ac) | Modely označené :free jsou veřejně uvedeny, ale žádná číselná kvóta není potvrzena. Zásady služby Naga upozorňují, že výzvy a výstupy bezplatné úrovně mohou být shromažďovány nebo použity k trénování. | +| `nanogpt` | `nanogpt` | NanoGPT | API klíč | [odkaz](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API klíč | [odkaz](https://bynara.id) | Vytvořte si bezplatný účet NaraRouter, propojte svůj Telegram (vyžadováno před odpověďmi /v1) a poté sem vložte klíč jako Bearer token. | +| `navy` | `navy` | NavyAI | API klíč | [odkaz](https://api.navy) | Vytvořte si bezplatný API klíč na ovládacím panelu NavyAI a poté jej sem vložte jako Bearer token. | +| `nebius` | `nebius` | Nebius AI | API klíč | [odkaz](https://nebius.com) | Zkušební kredit přibližně $1 po registraci pro testování API | +| `nlpcloud` | `nlpc` | NLP Cloud | API klíč | [odkaz](https://docs.nlpcloud.com) | Použijte svůj API klíč NLP Cloud v Authorization: Token . OmniRoute ve výchozím nastavení cílí na koncový bod chatbota na adrese https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API klíč | [odkaz](https://nomic.ai) | API klíč získáte na atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | API klíč | [odkaz](https://portal.nousresearch.com/help) | Použijte svůj API klíč portálu Nous. OmniRoute cílí na oficiální inferenční koncový bod kompatibilní s OpenAI na adrese https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API klíč, video, agregátor | [odkaz](https://novita.ai) | Zkušební kredit $0.50 po registraci (platný přibližně 1 rok) | +| `nscale` | `nscale` | nScale | API klíč | [odkaz](https://nscale.com) | Bezplatný kredit $5 po registraci pro testování inference | +| `nube` | `nube` | Nube.sh | API klíč | [odkaz](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API klíč | [odkaz](https://build.nvidia.com) | Bezplatný přístup pro vývojáře: přibližně 40 RPM, více než 70 modelů (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API klíč, podnikové použití | [odkaz](https://www.oracle.com/artificial-intelligence/generative-ai) | Použijte svůj API klíč OCI Generative AI nebo IAM bearer token. Základní URL může být https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | API klíč, agregátor | [odkaz](https://ofox.ai) | Aktuální katalog nabízí více než 10 bezplatných modelů bez veřejně uvedené číselné kvóty; před produkčním použitím si ověřte původ, uchovávání dat a podmínky pro trénování u poskytovatelů. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API klíč | [odkaz](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API klíč | [odkaz](https://1min.ai) | Vytvořte si API klíč na https://docs.1min.ai/docs/api/create-api-key a poté jej sem vložte. | +| `openadapter` | `oad` | OpenAdapter | API klíč | [odkaz](https://openadapter.dev) | Použijte svůj API klíč OpenAdapter v Authorization: Bearer sk-cv-. Plně kompatibilní s OpenAI. Základní URL API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API klíč | [odkaz](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API klíč | [odkaz](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API klíč | [odkaz](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API klíč | [odkaz](https://openference.com) | Bezplatná úroveň: zahrnuje Qwen3.8 27b a Llama 3.2 3B — aktuální podmínky najdete na openference.com/pricing | +| `openrouter` | `openrouter` | OpenRouter | API klíč, agregátor | [odkaz](https://openrouter.ai) | Bezplatné modely za $0/token s příponou :free – 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API klíč | [odkaz](https://openvecta.com) | Bezplatný kredit po registraci pro inferenci kompatibilní s OpenAI napříč LLM, embeddingy a modely uvažování | +| `opper` | `opper` | Opper | API klíč, agregátor | [odkaz](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API klíč | [odkaz](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API klíč | [odkaz](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API klíč | [odkaz](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API klíč | [odkaz](https://www.perplexity.ai) | Použijte svůj API klíč Perplexity. OmniRoute směruje ID modelů Agent API přes koncový bod Perplexity kompatibilní s Responses. | +| `piapi` | `pi` | PiAPI | API klíč, agregátor | [odkaz](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API klíč | [odkaz](https://pioneer.ai) | Bezplatný kredit na používání v hodnotě $75 — bez nutnosti platební karty | +| `plamo` | `plamo` | PLaMo | API klíč | [odkaz](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API klíč, agregátor | [odkaz](https://creator.poe.com/api-reference) | Bearer API klíč pro API služby Poe kompatibilní s OpenAI. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API klíč, agregátor | [odkaz](https://poixe.com) | Aktuální veřejné bezplatné limity jsou nízké a liší se podle skupiny modelů: 2 RPM/5 RPD pro modely large-cup a 20 RPM/50 RPD pro modely small-cup. | +| `pollinations` | `pol` | Pollinations AI | API klíč, video | [odkaz](https://pollinations.ai) | Anonymní přístup nebo přístup bez klíče k dokumentovaným bezplatným modelům je poskytován bez záruky. Místní ověření verze v3.8.50 (2026-07-31) vrátilo 401 prostřednictvím OmniRoute a Cloudflare 1010 při přímých kontrolách upstreamu ze stejné sítě. Prémiové modely stále vyžadují API klíč Pollinations z enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API klíč | [odkaz](https://poolside.ai) | Laguna S 2.1 a XS 2.1 jsou během fáze Preview zdarma; žádná veřejná číselná kvóta není publikována. | +| `predibase` | `predibase` | Predibase | API klíč | [odkaz](https://predibase.com) | ⚠️ **ZASTARALÉ.** serving.app.predibase.com již nelze přeložit na IP adresu (kontrola 2026-06-19); spravované API pro poskytování modelů bylo zřejmě ukončeno. | +| `publicai` | `publicai` | PublicAI | API klíč | [odkaz](https://publicai.co) | Vyžaduje API klíč — jednorázový kredit po registraci, poté placené použití | +| `qianfan` | `qianfan` | Baidu Qianfan | API klíč | [odkaz](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | klíč API | [odkaz](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | klíč API | [odkaz](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | klíč API | [odkaz](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | klíč API, obrázky | [odkaz](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | klíč API | [odkaz](https://regolo.ai) | Získejte svůj klíč API Regolo na webu regolo.ai a poté jej sem vložte jako token Bearer. | +| `reka` | `reka` | Reka | klíč API | [odkaz](https://docs.reka.ai/chat/overview) | Použijte svůj klíč API Reka. OmniRoute podporuje základní adresu URL kompatibilní s OpenAI https://api.reka.ai/v1 a kvůli kompatibilitě odesílá hlavičky Authorization i X-Api-Key. | +| `requesty` | `requesty` | Requesty | klíč API | [odkaz](https://requesty.ai) | Bezplatná úroveň s přibližně 200 požadavky denně – brána pro směrování mezi více modely (více než 300 modelů) | +| `routeway` | `routeway` | Routeway | klíč API | [odkaz](https://routeway.ai) | Vytvořte si bezplatný klíč API na webu routeway.ai a poté jej sem vložte jako token Bearer. | +| `runwayml` | `runway` | Runway | klíč API, video | [odkaz](https://docs.dev.runwayml.com) | Použijte svůj klíč API Runway v hlavičce Authorization: Bearer . OmniRoute používá aktuální API Runway na adrese https://api.dev.runwayml.com/v1 a automaticky odesílá požadovanou hlavičku X-Runway-Version. | +| `sambanova` | `samba` | SambaNova | klíč API | [odkaz](https://sambanova.ai) | Bezplatný kredit 5 $ při registraci (platnost 30 dní), bez nutnosti zadávat platební kartu | +| `sap` | `sap` | SAP Generative AI Hub | klíč API, podnikové použití | [odkaz](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Použijte svůj token Bearer pro SAP AI Core. Základní adresou URL může být kořenová adresa AI_API_URL nebo deploymentUrl z Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | klíč API | [odkaz](https://docs.sarvam.ai) | Bezplatný kredit 1 000 ₹ za registraci – nikdy nevyprší | +| `scaleway` | `scw` | Scaleway AI | klíč API | [odkaz](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 milion bezplatných tokenů pro nové účty – v souladu s předpisy EU/GDPR (Paříž), Qwen3 235B a Llama 70B | +| `sealion` | `sealion` | SEA-LION | klíč API | [odkaz](https://sea-lion.ai) | Přihlaste se na webu sea-lion.ai pomocí Googlu (bez platební karty a regionálních omezení), vytvořte klíč API a poté jej sem vložte. | +| `seekai` | `ska` | SeekAi | klíč API, agregátor | [odkaz](https://seekai.cc) | Vytvořte klíč API na adrese https://seekai.cc a poté jej sem vložte jako token Bearer. | +| `segmind` | `segmind` | Segmind | klíč API, obrázky, video | [odkaz](https://segmind.com) | Použijte svůj klíč API Segmind v hlavičce x-api-key. OmniRoute používá adresu https://api.segmind.com/v1/ a vrací přímo bajty vygenerovaného obrázku nebo videa. | +| `sensenova` | `sensenova` | SenseNova | klíč API | [odkaz](https://platform.sensenova.cn) | Získejte klíč API na webu platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | klíč API | [odkaz](https://cloud.siliconflow.com) | Bezplatný kredit 1 $ a navíc aktuálně uvedené modely za 0 $ po ověření totožnosti; dostupnost a limity se mohou změnit | +| `snowflake` | `snowflake` | Snowflake Cortex | klíč API, podnikové použití | [odkaz](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | klíč API | [odkaz](https://xinghuo.xfyun.cn) | Získejte klíč API na webu console.xfyun.cn | +| `speka` | `speka` | Speka AI | klíč API, agregátor | [odkaz](https://speka.me) | Bezplatný tarif: měsíční využití v hodnotě 1 $, 10 RPM, jeden klíč API a přístup k otevřeným modelům a testovacímu prostředí; bez nutnosti zadávat platební kartu. | +| `stability-ai` | `stability` | Stability AI | klíč API, obrázky | [odkaz](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | klíč API | [odkaz](https://stepfun.com) | Získejte klíč API na webu platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | klíč API | [odkaz](https://ai.sumopod.com) | Použijte svůj klíč API SumoPod (sk-...) v hlavičce Authorization: Bearer . Plně kompatibilní s OpenAI. Základní adresa URL API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | klíč API | [odkaz](https://suno.ai) | Vložte soubor cookie relace z webu suno.ai (ověřování Clerk) | +| `synthetic` | `synthetic` | Synthetic | klíč API, agregátor | [odkaz](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | klíč API, agregátor | [odkaz](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | klíč API | [odkaz](https://hunyuan.tencent.com) | Získejte klíč API na webu console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | klíč API, agregátor | [odkaz](https://theb.ai) | Klíč API Bearer pro bránu TheB.AI kompatibilní s OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | klíč API | [odkaz](https://docs.tinyfish.ai/fetch-api) | X-API-Key z webu agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | klíč API, video | [odkaz](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | klíč API | [odkaz](https://agent-router.gaib.ai) | Použijte svůj klíč API Token Kiosk v hlavičce Authorization: Bearer . Brána plně kompatibilní s OpenAI. Základní adresa URL API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | klíč API, agregátor | [odkaz](https://www.tokenreply.com) | Modely označené jako bezplatné mají denní limity specifické pro daný model a kampaň; žádná pevná globální bezplatná kvóta není zveřejněna. | +| `tokenrouter` | `trk` | TokenRouter | klíč API | [odkaz](https://tokenrouter.com) | Použijte svůj klíč API TokenRouter v hlavičce Authorization: Bearer . Plně kompatibilní s OpenAI. Základní adresa URL API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | klíč API, obrázky | [odkaz](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | klíč API | [odkaz](https://docs.opentyphoon.ai) | Bezplatný klíč API s limitem 5 požadavků za sekundu a 200 požadavků za minutu. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | klíč API | [odkaz](https://uncensored.com) | Použijte svůj vývojářský klíč API z uncensored.com (uai_sk_live_...). OmniRoute jej odesílá jako hlavičku X-api-key do koncového bodu https://api.uncensored.com/api/v1 kompatibilního s OpenAI. Platnost klíče nikdy nevyprší. Toto je účtované rozhraní využívající kredity; chat bez měření v rámci předplatného je samostatný poskytovatel 'uc'. | +| `udio` | `udio` | Udio | klíč API | [odkaz](https://udio.com) | Vložte soubor cookie relace z udio.com (ověřování Supabase) | +| `unorouter` | `unorouter` | UnoRouter | klíč API, agregátor | [odkaz](https://unorouter.ai) | Modely s příponou :free neodečítají zůstatek; limit činí 1 požadavek za minutu na každý bezplatný model a uživatele. | +| `upstage` | `upstage` | Upstage | klíč API | [odkaz](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | klíč API | [odkaz](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | klíč API | [odkaz](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | klíč API, agregátor | [odkaz](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | klíč API, podnikové použití | [odkaz](https://cloud.google.com/vertex-ai) | Poskytněte JSON účtu služby, přístupový token OAuth, klíč API Vertex Express nebo autorizační klíč svázaný s účtem služby. Režim Express podporuje pouze Gemini; partnerské modely vyžadují přihlašovací údaje omezené na projekt. | +| `vertex-partner` | `vp` | Vertex AI Partners | klíč API, podnikové použití | [odkaz](https://cloud.google.com/vertex-ai) | Poskytněte JSON účtu služby nebo přihlašovací údaje OAuth. Autorizační klíč svázaný s účtem služby rovněž podporuje vyhledávání, ale partnerská inference navíc vyžaduje ID příslušného projektu Google Cloud. Standardní klíče Express podporují pouze Gemini. | +| `void-ai` | `void-ai` | Void AI | klíč API, agregátor | [odkaz](https://voidai.app) | Veřejný katalog modelů označuje některé modely jako vyžadující bezplatný tarif, přístup je však podmíněný a není potvrzena žádná číselná kvóta. | +| `volcengine` | `volcengine` | Volcengine | klíč API | [odkaz](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | klíč API | [odkaz](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Připojte svůj účet Volcano Engine nebo použijte klíč API předplatného Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | klíč API | [odkaz](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Připojte svůj účet Volcano Engine nebo použijte klíč API předplatného Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | klíč API, vkládání/přeřazování | [odkaz](https://www.voyageai.com) | Klíč API typu Bearer pro rozhraní API vkládání a přeřazování služby Voyage AI. | +| `wafer` | `wafer` | Wafer AI | klíč API | [odkaz](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | klíč API | [odkaz](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | klíč API, podnikové použití | [odkaz](https://www.ibm.com/products/watsonx-ai) | Použijte svůj token watsonx typu Bearer. Základní URL může být https://.ml.cloud.ibm.com/ml/gateway/v1/ nebo samostatně spravovaný koncový bod /ml/gateway/v1. | +| `writer` | `writer` | Writer | klíč API | [odkaz](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | klíč API | [odkaz](https://x5lab.dev) | Použijte svůj klíč API X5Lab (x5-...) v Authorization: Bearer . Plně kompatibilní s OpenAI. Základní URL rozhraní API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | klíč API | [odkaz](https://x.ai) | Použijte oficiální klíč API xAI nebo se přihlaste pomocí xAI OAuth. Relace Grok Build JWT zůstávají samostatným poskytovatelem. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | klíč API | [odkaz](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | klíč API | [odkaz](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | klíč API, agregátor | [odkaz](https://xkiro.com) | Vytvořte si bezplatný účet na xkiro.com a vložte sem klíč (Bearer; akceptován je také x-api-key). | +| `yi` | `yi` | Yi (01.AI) | klíč API | [odkaz](https://01.ai) | Získejte klíč API na platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | klíč API, agregátor | [odkaz](https://yolo-auto.com) | Bezplatný přístup k API je omezen počtem požadavků a určen k testování; žádná číselná denní kvóta není zveřejněna a není přislíbeno, že bezplatný přístup bude dostupný trvale. | +| `zai` | `zai` | Z.AI | klíč API | [odkaz](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | klíč API | [odkaz](https://zenmux.ai) | Použijte svůj klíč API ZenMux v Authorization: Bearer . ZenMux je plně kompatibilní s OpenAI. Základní URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | klíč API, agregátor | [odkaz](https://www.zerolimitai.com) | Je propagována dočasná bezplatná zkušební verze, oficiální stránky si však protiřečí, zda trvá 3, nebo 7 dní; tvrzení o 100 voláních denně se nepovažuje za trvalé. | +| `zylo-api` | `zylo` | Zylo API | klíč API, agregátor | [odkaz](https://zyloai.net) | Základní tarif: 10 RPM, 7 200 požadavků denně a 200 000 tokenů denně; omezeno na základní textové modely. | ## Místní poskytovatelé (14) diff --git a/docs/i18n/cs/docs/routing/REASONING_REPLAY.md b/docs/i18n/cs/docs/routing/REASONING_REPLAY.md index 21efb7f02c2e..e240423df98b 100644 --- a/docs/i18n/cs/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/cs/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ Běžní klienti (Cursor, Cline, Roo Code, OpenAI SDK) však `reasoning_content` ## Architektura ``` -Kolo N (asistent generuje): +Tah N (asistent generuje): → odpověď obsahuje reasoning_content + tool_calls → pokud requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - zapíše (paměť + DB), s klíčem podle každého tool_call.id - → předá odpověď klientovi (který může, ale nemusí uvažování zachovat) + zapíše (do paměti + DB), s klíčem podle každého tool_call.id + → předá odpověď klientovi (který může, ale nemusí zachovat reasoning) -Kolo N+1 (klient odešle navazující požadavek): +Tah N+1 (klient odešle navazující požadavek): → překladač zjistí: requiresReasoningReplay(provider, model) === true → pro každou zprávu asistenta s tool_calls a bez reasoning_content: lookupReasoning(toolCalls[0].id) → paměť → DB - shoda → msg.reasoning_content = cached; recordReplay() - bez shody → msg.reasoning_content = "" (zpětně kompatibilní náhradní řešení pro starší DeepSeek) - → upstream obdrží konzistentní historii → žádná chyba 400 + nalezeno → msg.reasoning_content = cached; recordReplay() + nenalezeno → msg.reasoning_content = "" (zpětně kompatibilní náhradní řešení pro starší DeepSeek) + → nadřazená služba obdrží konzistentní historii → žádná chyba 400 ``` -K zachycení dochází v `open-sse/handlers/chatCore.ts` (na dvou místech, ve dvou místech volání `cacheReasoningFromAssistantMessage`). K přehrání dochází v `open-sse/translator/index.ts` po převodu schématu, ale před odesláním. +Zachycení probíhá v `open-sse/handlers/chatCore.ts` (na dvou místech, ve dvou místech volání `cacheReasoningFromAssistantMessage`). Opětovné vložení probíhá v `open-sse/translator/index.ts` po vynucení schématu, ale před odesláním. + +Běžné tahy asistenta (bez volání nástrojů) používají odlišné klíče: `buildAssistantMessageCacheKey()` vytvoří otisk rozsahu relace spolu s normalizovaným přepisem ve formátu OpenAI až po daný tah, protože DeepSeek po přítomnosti `tools` vyžaduje reasoning z _každého_ předchozího tahu. U cílů rozhraní Responses API (například `opencode-go/deepseek-v4-flash`, směrovaného na `/responses`) obsahuje tělo nadřazeného požadavku `input`, nikoli `messages`, takže `translateRequest()` (`open-sse/translator/index.ts`) prostřednictvím možnosti zpětného volání předá pivotní přepis, z něhož vytvořil otisk, a místa zachycení vytvoří otisk téhož přepisu. Průchod pro opětovné vložení Responses se spouští nad pivotním formátem OpenAI pro každý zdrojový formát, takže se opětovné vložení provádí i pro klienty Anthropic Messages (Claude → OpenAI → Responses). ## Úložiště — hybridní paměť + SQLite @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -Indexy: `expires_at`, `provider`, `model`, `created_at`. Hodnota `expires_at` je uložena v sekundách unixového času; vrstva SELECT normalizuje starší textové hodnoty prostřednictvím `EXPIRES_AT_EPOCH_SQL`. +Indexy: `expires_at`, `provider`, `model`, `created_at`. `expires_at` je uloženo jako počet sekund unixového času; vrstva SELECT normalizuje starší textové hodnoty prostřednictvím `EXPIRES_AT_EPOCH_SQL`. ## Detekce poskytovatele / modelu diff --git a/docs/i18n/cs/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/cs/docs/security/SOCKET_DEV_FINDINGS.md index 7dc35d731ca6..95ede3f8394e 100644 --- a/docs/i18n/cs/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/cs/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,22 +4,23 @@ --- -Tento dokument je správcem vytvořené potvrzení k šesti nálezům -`AI-detected potential malware` nahlášeným u `omniroute@3.8.5` a k nápravným -opatřením použitým v `omniroute@3.8.6`. Existuje proto, aby: - -1. Provozovatelé bezpečnostních kontrol měli jediný referenční dokument, který - mohou citovat, když potřebují vyhodnotit nálezy ve vztahu ke skutečnému - zdrojovému kódu. -2. Budoucí AI skenery mohly zohlednit správcem podepsané prohlášení, že každá +> **Poznámka k rozsahu:** `socket.yml` konfiguruje kontrolu npm artefaktu po publikování na straně registru Socket.dev (ignorované cesty pro obsah, který není součástí distribuovaného balíčku, například `tests/`, `docs/` a sestavy z buildu). Nenastavuje kontrolní bránu pro sloučení v CI/PR — Socket.dev není volán žádným workflow v `.github/workflows`, žádným skriptem v `package.json` ani žádným cílem v `Makefile`. + +Tento dokument je potvrzení vytvořené správci projektu pro šest +nálezů `AI-detected potential malware` nahlášených u `omniroute@3.8.5` a +zmírňující opatření použitá v `omniroute@3.8.6`. Existuje proto, aby: + +1. Provozovatelé bezpečnostních procesů měli jediný referenční dokument, na který mohou odkazovat, když potřebují + vyhodnotit nálezy ve vztahu ke skutečnému zdrojovému kódu. +2. Budoucí AI skenery mohly zohlednit správci podepsané prohlášení, že každá označená cesta je záměrná, volitelná a zdokumentovaná. -3. Existoval písemný záznam o tom, _proč_ má každé místo volání právě tuto - podobu — aby budoucí refaktorizace omylem znovu nezavedla vzorec, který byl - záměrně odstraněn. +3. Existoval písemný záznam o tom, _proč_ má každé místo volání právě takovou podobu — + aby budoucí refaktoring nechtěně znovu nezavedl vzor, který + byl záměrně odstraněn. -Pokud provozujete skener, který po vydání nápravných opatření ve v3.8.6 znovu -označí kterékoli z níže uvedených míst volání, založte prosím issue se záznamem -kontroly a my zde toto potvrzení rozšíříme. +Pokud provozujete skener, který po vydání zmírňujících opatření ve +v3.8.6 znovu označí některé z níže uvedených míst volání, otevřete prosím hlášení problému se záznamem kontroly a +my zde toto potvrzení rozšíříme. --- diff --git a/docs/i18n/da/README.md b/docs/i18n/da/README.md index 0dfaa3215470..d64f01f34ff2 100644 --- a/docs/i18n/da/README.md +++ b/docs/i18n/da/README.md @@ -19,17 +19,17 @@
-## 💰 ~1,62 mia. gratis tokens/måned +## 💰 ~1,62 mia. gratis tokens / måned
-> Det er besværligt at stable gratisniveauer manuelt — dusinvis af SDK'er, dusinvis af hastighedsgrænser og ingen idé om, hvor meget du faktisk har. OmniRoute katalogiserer **491 poster med gratisniveauer fordelt på 35 tilbagevendende puljenøgler** og beregner det samlede antal tokens ud fra de **17 puljer med et offentliggjort positivt månedligt budget plus fem Groq-grænser pr. model**, deduplikeret efter delt pulje. Kvoter, der først bliver tilgængelige efter en regional identitetskontrol (i dag: ModelScope), vises separat som +~6 mio. bag regional identitetsbekræftelse og medregnes aldrig i hovedtallet. Resultatet forbliver synligt på kontrolpanelet (`/dashboard/free-tiers`). +> Det er besværligt at kombinere gratisniveauer manuelt — dusinvis af SDK'er, dusinvis af hastighedsgrænser og ingen idé om, hvor meget du faktisk har. OmniRoute katalogiserer **489 poster på gratisniveauer fordelt på 35 tilbagevendende puljenøgler** og beregner tokenoverskriften ud fra de **17 puljer med et offentliggjort positivt månedligt budget plus fem Groq-grænser pr. model**, deduplikeret efter delt pulje. Kvoter, der først bliver tilgængelige efter en regional identitetskontrol (i dag: ModelScope), vises separat som +~6M bag regional identitetsbekræftelse og medregnes aldrig i overskriften. Resultatet forbliver synligt på dashboardet (`/dashboard/free-tiers`). -OmniRoutes budgetkort for gratisniveauer: ~1,62 mia. gratis tokens pr. måned løbende, op til ~2,22 mia. i den første måned med oprettelseskreditter, fra 35 dokumenterede tilbagevendende puljenøgler, der dækker 491 katalogiserede gratisniveauposter bag ét slutpunkt. Ærlig matematik med deduplikering af puljer — hver delt pulje tælles én gang, herunder 17 tilbagevendende puljer med et offentliggjort positivt månedligt tokenbudget plus fem Groq-grænser pr. model; 13 udbydere er markeret som undgå i kataloget over vilkårsrisici, så du selv kan vælge. Budgetlinjen omfatter Mistral 1 mia., Nara 210 mio., LLM7 150 mio., xKiro 150 mio., Groq 30 mio. (fem grænser pr. model) og mindre puljer samt oprettelseskreditter for den første måned og permanent gratis udbydere uden tokenbegrænsning, som vises separat, så de aldrig puster hovedtallet op. Livevisning af brugt/resterende på /dashboard/free-tiers. +OmniRoutes budgetkort for gratisniveauer: stabilt ~1,62 mia. gratis tokens pr. måned, op til ~2,22 mia. i den første måned med tilmeldingskreditter, fra 35 dokumenterede tilbagevendende puljenøgler, der dækker 489 katalogiserede poster på gratisniveauer bag ét endpoint. Ærlig matematik med puljededuplikering — hver delt pulje tælles én gang, inklusive 17 tilbagevendende puljer med et offentliggjort positivt månedligt tokenbudget plus fem Groq-grænser pr. model; 13 udbydere er markeret som undgå i kataloget over vilkårsrisici, så du kan træffe beslutningen. Budgetbjælken omfatter Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (fem grænser pr. model) og mindre puljer samt tilmeldingskreditter for den første måned og permanent gratis udbydere uden tokengrænse, som vises separat, så de aldrig puster overskriften op. Aktuelt forbrug og resterende mængde på /dashboard/free-tiers. -> Animeret oversigt over live-siden `/dashboard/free-tiers`. Fuld metode (deduplikering af puljer, kreditniveauer, udbydervilkår): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Animeret oversigt over den aktuelle side `/dashboard/free-tiers`. Fuld metode (puljededuplikering, kreditniveauer, udbydervilkår): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Disse tal revideres hver anden uge i forhold til live-kataloget og **bevæger sig i begge retninger** — hvis en udbyder afslutter et gratisniveau, falder tallet; hvis en ny kommer til, stiger det. Vi offentliggør det, kataloget faktisk beregner, aldrig et oprundet bedste scenarie. +> Disse tal revideres igen hver anden uge i forhold til det aktuelle katalog og **bevæger sig i begge retninger** — afslutter en udbyder et gratisniveau, falder tallet; kommer et nyt til, stiger det. Vi offentliggør det, som kataloget faktisk beregner, aldrig et oprundet bedste scenarie.
@@ -37,7 +37,7 @@

-⭐ Giv repoet en stjerne, hvis OMNIROUTE har hjulpet dig med at spare penge og gøre dit arbejde lettere. +⭐ Giv repoet en stjerne, hvis OMNIROUTE har hjulpet dig med at spare penge og gjort dit arbejde lettere.

@@ -48,7 +48,7 @@ ### 💬 Bliv en del af fællesskabet -**👋 Følg vedligeholderen — få nyheder om nye udbydere, udgivelser og tips først:** +**👋 Følg vedligeholderen — få nye udbydere, udgivelser og tips først:** [![Følg Diego på LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Følg @diegosouzapw på GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -59,7 +59,7 @@ [![WhatsApp Brasilien](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Websted](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Spørgsmål, udbydertips, køreplan og support → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Globalt](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasilien](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Spørgsmål, tips om udbydere, roadmap og support → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Globalt](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasilien](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -599,9 +599,9 @@ adgangskrav og det aktuelle katalog på **[radar.omniroute.online/planos](https:
-## 🤖 Kompatible CLI'er og kodningsagenter +## 🤖 Kompatible CLI'er og kodeagenter -> Én konfiguration — `http://localhost:20128/v1` — og **alle** AI-IDE'er og CLI'er kører på gratis og billige modeller. +> Én konfiguration — `http://localhost:20128/v1` — og **alle** AI-IDE'er og CLI'er kører på gratis modeller og lavprismodeller.
@@ -635,23 +635,23 @@ adgangskrav og det aktuelle katalog på **[radar.omniroute.online/planos](https: - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ fungerer også med · Kiro · Command Code · Antigravity · Windsurf · AMP · ethvert OpenAI-kompatibelt værktøj ++ fungerer også med · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · ethvert OpenAI-kompatibelt værktøj
-📖 Værktøjsspecifik opsætning for alle 36 værktøjer (26 CLI-kodeværktøjer + 10 CLI-agenter) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode-plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Opsætning pr. værktøj for alle 36 værktøjer (26 CLI Code's + 10 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode-plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

**Start enhver understøttet CLI gennem OmniRoute med én kommando** — der skrives ingen konfigurationsfiler, -legitimationsoplysninger indsættes pr. proces, og Qwen/Gemini får en midlertidig, isoleret hjemmemappe: +legitimationsoplysninger indlæses pr. proces, og Qwen/Gemini får en midlertidig, isoleret hjemmemappe: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -666,9 +666,9 @@ omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" omniroute configure codex # også: claude opencode qwen aider goose gemini cline continue kilo ``` -Hver kommando respekterer den aktive fjernkontekst (`omniroute connect `), `--dry-run` -viser de præcise miljøvariabler/argumenter uden at udføre kommandoen, og `--api-key-env NAME` holder hemmeligheder ude -af din shellhistorik. → [CLI-integrationer](docs/guides/CLI-INTEGRATIONS.md) +Alle kommandoer respekterer den aktive fjernkontekst (`omniroute connect `), `--dry-run` +viser de præcise miljøvariabler/argumenter uden at køre noget, og `--api-key-env NAME` holder hemmeligheder ude +af din shell-historik. → [CLI-integrationer](docs/guides/CLI-INTEGRATIONS.md)
@@ -678,7 +678,7 @@ af din shellhistorik. → [CLI-integrationer](docs/guides/CLI-INTEGRATIONS.md) -> **357 registrerede udbydere** på tværs af de kanoniske samlinger for chat, medier, søgning, lokale tjenester, cloud-agenter og systemer, herunder **152 med registreringsmetadataene `hasFree: true`**. Chatmodelregistret omfatter **229 udbydere / 2.554 unikke udbyder-model-par / 1.283 rå model-id'er**; det separate katalog over gratis budgetter har **491 rækker pr. model**, **35 tilbagevendende puljer** og **54 tilbagevendende/nøglefri udbydere, der er gratis for altid**. Disse har forskellige nævnere efter hensigten; definitioner og beregninger med deduplikerede puljer findes i [Udbyderreferencen](docs/reference/PROVIDER_REFERENCE.md) og [Gratisniveauer](docs/reference/FREE_TIERS.md). +> **357 registrerede udbydere** på tværs af de kanoniske samlinger for chat, medier, søgning, lokale tjenester, cloud-agenter og systemer, herunder **152 med registreringsmetadataene `hasFree: true`**. Registeret over chatmodeller dækker **229 udbydere / 2.554 forskellige udbyder-model-par / 1.283 rå model-id'er**; det separate katalog over gratisbudgetter har **491 rækker pr. model**, **35 tilbagevendende puljer** og **54 tilbagevendende/nøglefri udbydere, der er gratis for altid**. Disse nævnere er forskellige med vilje; definitioner og beregninger med deduplikerede puljer findes i [Udbyderreferencen](docs/reference/PROVIDER_REFERENCE.md) og [Gratisniveauer](docs/reference/FREE_TIERS.md).
@@ -711,7 +711,7 @@ af din shellhistorik. → [CLI-integrationer](docs/guides/CLI-INTEGRATIONS.md) -…og 330+ flere — hvert ikon indlæses direkte fra dashboardets udbyderkatalog. 📖 [Udbyderreference](docs/reference/PROVIDER_REFERENCE.md) +…og 330+ yderligere — hvert ikon indlæses direkte fra dashboardets udbyderkatalog. 📖 [Udbyderreference](docs/reference/PROVIDER_REFERENCE.md)
@@ -727,11 +727,11 @@ af din shellhistorik. → [CLI-integrationer](docs/guides/CLI-INTEGRATIONS.md) Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Gratis for altid
- Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Ubegrænset GRATIS
+ Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Ubegrænset og GRATIS
Pollinations
Pollinations
GPT, Llama, Claude
Ingen nøgle nødvendig
- Cloudflare AI
Cloudflare AI
50+ modeller
10.000 neuroner/dag
+ Cloudflare AI
Cloudflare AI
50+ modeller
10K neuroner/dag
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM gratis
- Cerebras
Cerebras
GLM 4.7, GPT-OSS
1 mio. tokens/dag
+ Openference
Openference
Qwen3.8 27B, Llama 3.2
Gratis niveau
OpenRouter
OpenRouter
:free-modeller
+$10 → højere RPM
@@ -1274,19 +1274,19 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken KørselsmiljøNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27 SprogTypeScript 6.0 — 100 % TypeScript på tværs af src/ og open-sse/ (ingen any i kernen siden v2.0) FrameworkNext.js 16 + React 19 + Tailwind CSS 4 - Databasebetter-sqlite3 (SQLite, WAL-journalføring) + LowDB (ældre JSON-format) — 122 domænemoduler, 176 migreringer - HukommelseSQLite FTS5-fuldtekstsøgning + int8-kvantiserede vektorindlejringer, typet henfald + Databasebetter-sqlite3 (SQLite, WAL-journalføring) + LowDB (ældre JSON-format) — 122 domænemoduler, 178 migreringer + HukommelseSQLite FTS5-fuldtekstsøgning + int8-kvantiserede vektorindlejringer, typestyret henfald SkemaerZod 4 — validering af input/output for MCP-værktøjer + API-kontrakter ProtokollerMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE) StreamingServer-Sent Events (SSE) + WebSocket-bro (/v1/ws) KomprimeringPipeline med 12 motorer — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph - Godkendelse & sikkerhedOAuth 2.0 (PKCE) + JWT + API-nøgler + områdebegrænset MCP-godkendelse · AES-256-GCM for lagrede data · DOMPurify - Skjulthedwreq-js — efterligning af JA3-/JA4-TLS-fingeraftryk, proxy på 3 niveauer - RobusthedKredsløbsafbryder, eksponentiel ventetid, beskyttelse mod samtidige masseforespørgsler, selvreparation af automatiske kombinationer - Logningpino — strukturerede JSON-logfiler med forespørgselskontekst - TestNode.js-testrunner + Vitest — mere end 39.000 statiske testerklæringer på tværs af mere end 5.100 sporede testfiler (enheds-, integrations-, E2E-, sikkerheds- og økosystemtest) - PlatformeDesktop (Electron) · Android (Termux) · PWA (enhver browser) - CI/CDGitHub Actions — automatisk udgivelse til npm + Docker Hub ved udgivelse + Godkendelse & sikkerhedOAuth 2.0 (PKCE) + JWT + API-nøgler + omfangsbaseret MCP-godkendelse · AES-256-GCM for lagrede data · DOMPurify + Stealthwreq-js — efterligning af JA3-/JA4-TLS-fingeraftryk, proxy i 3 niveauer + RobusthedStrømafbryder, eksponentiel backoff, beskyttelse mod thundering herd, selvhelende automatisk kombination + Logningpino — strukturerede JSON-logfiler med anmodningskontekst + TestNode.js-testkørsel + Vitest — 39.000+ statiske testerklæringer fordelt på 5.100+ sporede testfiler (enheds-, integrations-, E2E-, sikkerheds- og økosystemtest) + PlatformeComputer (Electron) · Android (Termux) · PWA (enhver browser) + CI/CDGitHub Actions — automatisk udgivelse til npm + Docker Hub ved release LinksWebsted · npm · Docker Hub @@ -1303,10 +1303,10 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken - - - - + + + +
DokumentBeskrivelse
BrugervejledningUdbydere, kombinationer, CLI-integration, implementering
OpsætningsvejledningAlle installationsmetoder, konfiguration af CLI-værktøjer, protokolopsætning, justering af timeout
Vejledning til CLI-værktøjerVærktøjsspecifik opsætning for Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo og Copilot
FjerntilstandStyr en ekstern OmniRoute (VPS) fra din bærbares CLI via adgangstokens med begrænset omfang
Claude Code-konfigurationForbind Claude Code med OmniRoute (lokal/ekstern) ved hjælp af launch og profiler pr. model
OpsætningsvejledningAlle installationsmetoder, konfiguration af CLI-værktøjer, protokolopsætning, finjustering af timeouts
Vejledning til CLI-værktøjerVærktøjsspecifik opsætning til Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
FjerntilstandStyr en ekstern OmniRoute (VPS) fra din bærbare computers CLI via adgangstokens med begrænset omfang
Claude Code-konfigurationForbind Claude Code med OmniRoute (lokal/ekstern) ved hjælp af launch + profiler pr. model
Hurtig startInstallation i 3 trin → opret forbindelse → konfigurer
@@ -1314,9 +1314,9 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken - + - + @@ -1328,16 +1328,16 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken
DokumentBeskrivelse
Docker-vejledningDocker run, Compose-profiler, Caddy HTTPS, tunneler, image-tags
Docker-vejledningDocker-kørsel, Compose-profiler, Caddy HTTPS, tunneler, image-tags
Podman-vejledningQuadlet systemd-integration, podman-compose, SELinux
VM-implementeringKomplet vejledning: opsætning af VM + nginx + Cloudflare
VM-implementeringKomplet vejledning: Opsætning af VM + nginx + Cloudflare
Fly.io-implementeringImplementer på Fly.io med permanent lagerplads
Termux-vejledningKør OmniRoute på Android via Termux
PWA-vejledningInstallation, caching og arkitektur for Progressive Web App
- - + + - - - - - - + + + + + +
DokumentBeskrivelse
ArkitekturSystemarkitektur, dataflow og interne mekanismer
KomprimeringsvejledningPipeline med 7 valgmuligheder: fra / let / standard / aggressiv / ultra / RTK / stablet
ArkitekturSystemarkitektur, dataflow og interne komponenter
KomprimeringsvejledningPipeline med 7 indstillinger: fra / let / standard / aggressiv / ultra / RTK / stablet
RTK-komprimeringKomprimering af kommandooutput, filtre, tillid, verificering, gendannelse af råt output
KomprimeringsmotorerCaveman, RTK, stablede pipelines, dashboard-/API-/MCP-grænseflader
Format for komprimeringsreglerJSON-skemaer til regelpakker for Caveman- og RTK-filtre
Sprogpakker til komprimeringSprogregistrering og oprettelse af Caveman-regelpakker
Vejledning til robusthedCircuit breakers, afkølingsperioder, kø, beskyttelse mod thundering herd, TLS-spoofing
Auto-Combo-motorBedømmelse baseret på 16 faktorer, tilstandspakker, selvreparation
ProxyvejledningProxysystem med 3 niveauer, 1proxy-markedsplads, CRUD til registreringsdatabasen
Gratis niveauerSamlet oversigt: 35 dokumenterede tilbagevendende puljer / 491 katalogiserede poster på gratisniveauet
Format for komprimeringsreglerJSON-regelpakkeskemaer til Caveman- og RTK-filtre
Sprogpakker til komprimeringSproggenkendelse og oprettelse af Caveman-regelpakker
Vejledning til robusthedCircuit breakers, nedkølingsperioder, kø, beskyttelse mod samtidige masseforespørgsler, TLS-spoofing
Automatisk kombinationsmotorVurdering baseret på 16 faktorer, tilstandspakker, selvreparation
ProxyvejledningProxysystem med 3 niveauer, 1proxy-markedsplads, CRUD-handlinger for registreringsdatabasen
Gratis niveauerSamlet katalog: 35 dokumenterede tilbagevendende puljer / 489 katalogiserede poster på gratis niveauer
FunktionsgalleriVisuel rundvisning i dashboardet med skærmbilleder
Dokumentation af kodebasenBegyndervenlig gennemgang af kodebasen
@@ -1349,7 +1349,7 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken API-referenceAlle endpoints med eksempler OpenAPI-specifikationOpenAPI 3.0-specifikation MCP-server110 MCP-værktøjer, IDE-konfigurationer, Python-/TS-/Go-klienter - MCP-servervejledningMCP-installation, transportmekanismer og værktøjsreference + MCP-servervejledningMCP-installation, transporter og værktøjsreference A2A-serverJSON-RPC 2.0-protokol, færdigheder, streaming, opgavestyring A2A-servervejledningA2A-agentkort, opgaver, færdigheder og streaming @@ -1363,8 +1363,8 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken ÆndringslogKomplet udgivelseshistorik for hver version SikkerhedspolitikRapportering af sårbarheder og sikkerhedspraksis i18n-vejledningUnderstøttelse af 42 sprog, arbejdsgang for oversættelse og RTL - Tjekliste til udgivelseValideringstrin før udgivelse - Plan for testdækningStrategi for testdækning af mere end 39.000 statiske testerklæringer på tværs af mere end 5.100 sporede testfiler + Tjekliste for udgivelseValideringstrin før udgivelse + Plan for testdækningStrategi for testdækning af mere end 39.000 statiske testdeklarationer fordelt på mere end 5.100 registrerede testfiler
@@ -1373,12 +1373,12 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken # ⭐ Vigtigste bidragydere -> OmniRoute formes af et passioneret open source-fællesskab. Disse personer har ydet enestående bidrag, der direkte påvirker projektets kvalitet, stabilitet og udbredelse. **Tak.** +> OmniRoute er formet af et passioneret open source-fællesskab. Disse personer har ydet enestående bidrag, som har direkte indvirkning på projektets kvalitet, stabilitet og rækkevidde. **Tak.** -### Eksterne bidragydere efter antal mergede pull requests +### Eksterne bidragydere efter antal flettede pull requests - + @@ -1402,7 +1402,7 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken
PlaceringBidragyderMergede PR'er~Ændrede linjer
PlaceringBidragyderFlettede PR'er~Ændrede linjer
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Fastfrosset ved spidsen af den aktive release/v3.8.50, dafb4ae808, med merges til og med 2026-08-24 05:26:03 UTC. Den sideinddelte GitHub GraphQL-optælling indeholder 5.911 mergede PR'er: 2.707 fra repositoryets ejer, 179 fra Dependabot og 3.025 eksterne PR'er fra 535 forskellige bidragydere. »Ændrede linjer« er GitHubs tilføjelser + sletninger og omfatter genererede filer, låsefiler, kataloger, oversættelser og dokumentation; det er ændringsomfang, ikke forfattede kodelinjer. Ved delte placeringer omkring grænsen medtages alle. +Fastfrosset ved spidsen af den aktive release/v3.8.50, dafb4ae808, med fletninger til og med 2026-08-24 05:26:03 UTC. Den sideinddelte GitHub GraphQL-optælling indeholder 5.911 flettede PR'er: 2.707 fra repositoryets ejer, 179 fra Dependabot og 3.025 eksterne PR'er fra 535 forskellige bidragydere. »Ændrede linjer« er GitHub-tilføjelser + -sletninger og omfatter genererede filer, låsefiler, kataloger, oversættelser og dokumentation; det er ændringsomfang, ikke egenforfattede kodelinjer. Delte placeringer ved grænsen er medtaget. ### Commits tilskrevet af GitHub @@ -1490,9 +1490,9 @@ Kanoniske målinger den 2026-08-24: **1.029 unikke videoer** · **11.132.922 ken -Kontrolleret igen 2026-08-24 06:14:31 UTC: GitHub-tilskrevne commits rapporteret af repositoryets Contributors API for standardbranchen release/v3.8.50. API'et returnerede 525 identiteter (415 brugere, 2 bots, 108 anonyme); denne tabel udelader vedligeholderen, bots og anonyme identiteter og bevarer delte placeringer. Den adskiller sig både fra rangeringen efter flettede pull requests ovenfor og optællingen af 639 personer baseret på Git-metadata nedenfor. +Kontrolleret igen 2026-08-24 06:14:31 UTC: GitHub-tilskrevne commits rapporteret af repositoryets Contributors API for standardgrenen release/v3.8.50. API'et returnerede 525 identiteter (415 brugere, 2 bots, 108 anonyme); denne tabel udelader vedligeholderen, bots og anonyme identiteter og bevarer delte placeringer. Den adskiller sig både fra rangeringen efter flettede PR'er ovenfor og optællingen af 639 personer baseret på Git-metadata nedenfor. -> 🙏 Disse bidragyderes funktioner, fejlrettelser og forbedringer af infrastrukturen er en **central del** af det, der gør OmniRoute pålidelig og funktionsrig. Hver pull request, hver testcase og hver i18n-oversættelsesfil har betydning. Open source skabes af mennesker som dem. +> 🙏 Disse bidragyderes funktioner, fejlrettelser og infrastrukturforbedringer er en **central del** af det, der gør OmniRoute pålideligt og funktionsrigt. Hver pull request, hver testcase og hver i18n-oversættelsesfil betyder noget. Open source bygges af mennesker som dem.
diff --git a/docs/i18n/da/SECURITY.md b/docs/i18n/da/SECURITY.md index 479cfcac8024..a45b95b80efe 100644 --- a/docs/i18n/da/SECURITY.md +++ b/docs/i18n/da/SECURITY.md @@ -222,34 +222,26 @@ Disse regler håndhæves af værktøjer og reviewere: ## Resultater fra forsyningskædescannere (Socket.dev / Snyk / lignende) -Den publicerede `omniroute`-npm-artefakt inkluderer Next.js-buildet med `output: "standalone"`, -hvilket betyder, at hver route-handler — inklusive dokumenterede privilegerede -funktioner (MITM, Zed-import, Cloud Sync, indlejret tjenesteovervågning) — ender -i minificerede chunks under `.next/server/*.js`. Heuristiske forsyningskædescannere -matcher ofte mønstre i disse chunks med malwaresignaturer. - -Den scannerkonfiguration, vi bruger, findes i [`socket.yml`](socket.yml) i -repositoryets rod (Socket.dev GitHub App-format v2 — se -). Den udelukker eksplicit -mapper, der ikke distribueres (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/` osv.), så scanneren kun rapporterer om kodestier, der -rent faktisk når ud til brugerne af den publicerede pakke — selve scanningen udføres ved, at Socket -GitHub App læser denne fil, ikke af et workflow i dette repository. - -For hver kategori af fund vedligeholder vi en attestering fra vedligeholderne for hvert enkelt fund: +> **Bemærkning om omfang:** `socket.yml` i repositoryets rod konfigurerer kun `projectIgnorePaths` for Socket.devs post-publish-scanning på registreringssiden af den publicerede npm-artefakt — den fungerer ikke som en obligatorisk CI/PR-fletningskontrol. Ingen workflow i `.github/workflows`, intet `package.json`-script og intet `Makefile`-target kalder Socket.dev. + +Den publicerede `omniroute`-npm-artefakt indeholder Next.js-buildet med `output: "standalone"`, hvilket betyder, at alle route handlers — herunder dokumenterede privilegerede funktioner (MITM, Zed-import, Cloud Sync og integreret tjeneste-supervisor) — ender i minificerede chunks i `.next/server/*.js`. Heuristiske forsyningskædescannere matcher ofte mønstre i disse chunks med malwaresignaturer. + +Den scannerkonfiguration, vi bruger, findes i [`socket.yml`](socket.yml) i repositoryets rod (Socket.dev GitHub App-format v2 — se ). Den udelukker eksplicit mapper, som ikke distribueres (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` osv.), så scanneren kun rapporterer kodeveje, der rent faktisk når ud til brugere af den publicerede pakke — selve scanningen udføres af Socket GitHub App, som læser denne fil, ikke af et workflow i dette repository. + +For hver resultatkategori vedligeholder vi en attestering fra vedligeholderne for hvert enkelt resultat: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - oversigt pr. fund: kildefil ↔ markeret chunk ↔ adfærd ↔ afhjælpning + kortlægning pr. resultat: kildefil ↔ markeret chunk ↔ adfærd ↔ afhjælpning anvendt i v3.8.6. - `SECURITY-AUDITOR-NOTE:`-blokke i kildekoden ved hver markeret funktion henviser til det samme dokument. -For brugere, hvis pipeline ikke kan lempe advarslen: byg med +Brugere, hvis pipeline ikke kan lempe advarslen, kan bygge med `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Dette erstatter de fire følsomme moduler med stubs, der returnerer HTTP 503 `feature-disabled` under -kørsel, så de privilegerede kodestier fysisk ikke findes i bundtet. +kørsel, så de privilegerede kodeveje fysisk ikke findes i bundtet. Se [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) -for publiceringsproceduren. +for publiceringsopskriften. ## Referencer diff --git a/docs/i18n/da/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/da/docs/architecture/CODEBASE_DOCUMENTATION.md index 9d5cbe1ede49..c71e0d70184f 100644 --- a/docs/i18n/da/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/da/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,45 +434,46 @@ Opdelt i fokuserede undermapper: --- -## 4. `open-sse/` — arbejdsområde til streamingmotoren +## 4. `open-sse/` — Workspace til streamingmotor -Separat npm-arbejdsområde udgivet som `@omniroute/open-sse`. Håndterer forespørgselsbehandling, eksekutorer, oversættere, tjenester, transformer og MCP-serveren. +Separat npm-workspace udgivet som `@omniroute/open-sse`. Håndterer behandling af +anmodninger, eksekutorer, oversættere, tjenester, transformer og MCP-serveren. ``` open-sse/ ├── index.ts Offentlige eksporter -├── package.json Arbejdsområdets manifest +├── package.json Workspace-manifest ├── tsconfig.json ├── types.d.ts ├── config/ Udbyderregistre, headerprofiler, identitet, … -├── handlers/ Forespørgselshåndterere (chat, embeddings, lyd, billeder, …) +├── handlers/ Anmodningshåndterere (chat, embeddings, lyd, billeder, …) ├── executors/ 108 udbyderspecifikke HTTP-eksekutorer ├── translator/ Formatkonvertering (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Streamtransformer til Responses API ↔ Chat Completions -├── services/ 80+ tjenestemoduler (kombinationer, fallback, kvoter, identitet, …) +├── transformer/ Responses API ↔ Chat Completions-streamtransformer +├── services/ Mere end 80 tjenestemoduler (kombinationer, fallback, kvoter, identitet, …) ├── utils/ Streaminghjælpere, TLS-klient, AWS SigV4, proxy-fetch, … └── mcp-server/ MCP-server (3 transporter, 33 scopes, 110 værktøjer) ``` ### 4.1 `open-sse/handlers/` -| Håndterer | Formål | -| ----------------------- | ------------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Primær chatpipeline (cache, hastighedsbegrænsning, kombinationsrouting, afsendelse til eksekutor) | -| `responsesHandler.ts` | Indgangspunkt for OpenAI Responses API | -| `embeddings.ts` | Embeddings | -| `imageGeneration.ts` | Billedgenerering | -| `audioSpeech.ts` | Tekst-til-tale | -| `audioTranscription.ts` | Tale-til-tekst | -| `videoGeneration.ts` | Videogenerering | -| `musicGeneration.ts` | Musikgenerering | -| `rerank.ts` | Genrangering | -| `moderations.ts` | Moderation | -| `search.ts` | Websøgning | -| `sseParser.ts` | SSE-hændelsesparser | -| `usageExtractor.ts` | Udtrækker antal tokens fra opstrøms-streams | -| `responseSanitizer.ts` | Fjerner udbyderspecifik støj | -| `responseTranslator.ts` | Forbindelsesled mellem udbydersvar og oversætterlaget | +| Håndterer | Formål | +| ----------------------- | ------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Primær chatpipeline (cache, hastighedsbegrænsning, kombinationsrouting, eksekutor-dispatch) | +| `responsesHandler.ts` | Indgangspunkt for OpenAI Responses API | +| `embeddings.ts` | Embeddings | +| `imageGeneration.ts` | Billedgenerering | +| `audioSpeech.ts` | Tekst-til-tale | +| `audioTranscription.ts` | Tale-til-tekst | +| `videoGeneration.ts` | Videogenerering | +| `musicGeneration.ts` | Musikgenerering | +| `rerank.ts` | Genrangering | +| `moderations.ts` | Moderation | +| `search.ts` | Websøgning | +| `sseParser.ts` | SSE-hændelsesparser | +| `usageExtractor.ts` | Udtrækker tokenantal fra upstream-streams | +| `responseSanitizer.ts` | Fjerner udbyderspecifik støj | +| `responseTranslator.ts` | Bindelag mellem udbydersvar og oversætterlaget | ### 4.2 `open-sse/executors/` @@ -485,14 +486,14 @@ open-sse/ (delt identitetshjælper) og `index.ts` (register). > Bemærk: Udbydere, der ikke er angivet her, betjenes af `default.ts` ved hjælp af den generiske -> OpenAI-kompatible eksekutor. Det komplette udbyderkatalog (355 udbydere) findes i +> OpenAI-kompatible eksekutor. Det fulde udbyderkatalog (355 udbydere) findes i > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Hub-and-spoke-oversættelse (OpenAI er hubben). +Hub-and-spoke-oversættelse (OpenAI er knudepunktet). -- **9 forespørgselsoversættere** (`translator/request/`): +- **9 anmodningsoversættere** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. @@ -503,42 +504,42 @@ Hub-and-spoke-oversættelse (OpenAI er hubben). - **9 hjælpere** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, samt - tests af hjælpere. + hjælpertests. - **Billedhjælpere** (`translator/image/sizeMapper.ts`). -- Øverste niveau: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. +- På øverste niveau: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — `TransformStream`-baseret konverter til Responses API ↔ Chat +- `responsesTransformer.ts` — `TransformStream`-baseret konverter mellem Responses API ↔ Chat Completions (bruges af catch-all-ruten `responses/`). ### 4.5 `open-sse/services/` -Højdepunkter (den komplette liste findes under `open-sse/services/`): - -| Område | Filer | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Combo-routing | `combo.ts` (19 strategier), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Auto Combo-motor | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Robusthed | `accountFallback.ts` (nedkølingsperiode + spærring), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kvoter | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Caching | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Routingintelligens | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Modelhåndtering | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Komprimering | `compression/` — komplet integration af komprimeringsmotoren | -| Token + session | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Niveau/manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP/netværk | `ipFilter.ts`, `webSearchFallback.ts` | -| Batchbehandlinger | `batchProcessor.ts` | -| Forbrug | `usage.ts` | +Højdepunkter (den fulde liste findes under `open-sse/services/`): + +| Område | Filer | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Combo-routing | `combo.ts` (19 strategier), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Auto Combo-motor | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Robusthed | `accountFallback.ts` (nedkøling + spærring), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kvoter | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Cachelagring | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Routingintelligens | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Modelhåndtering | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Komprimering | `compression/` — komplet konfiguration af komprimeringsmotoren | +| Token + session | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Niveau / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / netværk | `ipFilter.ts`, `webSearchFallback.ts` | +| Batchkørsler | `batchProcessor.ts` | +| Forbrug | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 unikke værktøjer** integreret i `server.ts` (45 kanoniske i `schemas/tools.ts` + +- **110 unikke værktøjer** konfigureret i `server.ts` (45 kanoniske i `schemas/tools.ts` + hukommelses-, færdigheds-, GitHub-færdigheds-, pulje-, gamification-, plugin-, Notion-, Obsidian-, lokalkorpus- og komprimeringsmoduler — unionen optælles af `countUniqueMcpTools`). - **3 transporter**: stdio, HTTP Streamable, SSE. -- **33 scopes** håndhæves under kørsel — grundlisten findes i `src/shared/constants/mcpScopes.ts`, og det fulde sæt er unionen af de scopes, som hvert værktøjsmodul deklarerer. +- **33 scopes** håndhæves under kørsel — basislisten findes i `src/shared/constants/mcpScopes.ts`, og det fulde sæt er unionen af de scopes, der er deklareret af hvert værktøjsmodul. - Revisionstabel: `mcp_tool_audit` (udfyldes af `audit.ts`). - Filer: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, @@ -549,7 +550,7 @@ Højdepunkter (den komplette liste findes under `open-sse/services/`): ### 4.7 `open-sse/config/` Udbyderregistre (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), modelregistre pr. format (`audioRegistry.ts`, +`providerHeaderProfiles.ts`), modelspecifikke registre for hvert format (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), identitetshjælpere (`codexIdentity.ts`, `codexInstructions.ts`, diff --git a/docs/i18n/da/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/da/docs/architecture/RESILIENCE_GUIDE.md index 78ccd99a882c..4d647198be41 100644 --- a/docs/i18n/da/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/da/docs/architecture/RESILIENCE_GUIDE.md @@ -67,11 +67,11 @@ eksponentielle backoff fra `minRetryCooldownMs → maxRetryCooldownMs`. Tilsides `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Regressionsbeskyttelse: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Forbindelsesnedkøling +## 2. Nedkøling af forbindelser -**Omfang:** én enkelt udbyderforbindelse/konto/nøgle. +**Omfang:** en enkelt udbyderforbindelse/konto/nøgle. -**Formål:** springe én defekt nøgle over, mens andre forbindelser til samme udbyder fortsat betjener anmodninger. +**Formål:** spring én dårlig nøgle over, mens andre forbindelser til samme udbyder fortsat betjener forespørgsler. **Implementering:** @@ -89,58 +89,122 @@ Regressionsbeskyttelse: `tests/unit/provider-cooldown-window-gate.test.ts`. **Standardnedkølinger:** -- OAuth-basis: 5s -- API-nøglebasis: 3s -- API-nøgle 429: foretrækker upstream-`Retry-After`-/nulstillingsheadere eller tekst med nulstillingstidspunkt, der kan parses +- OAuth-basisværdi: 5s +- API-nøgle-basisværdi: 3s +- API-nøgle 429: foretrækker upstream-`Retry-After`/nulstillingsheadere/fortolkelig nulstillingstekst - Backoff: `baseCooldownMs * 2 ** failureIndex` -**Beskyttelse mod stampede-effekt:** forhindrer samtidige fejl i at forlænge nedkølingen for meget eller øge `backoffLevel` to gange. +**Beskyttelse mod stampede-effekt:** forhindrer samtidige fejl i at forlænge nedkølingen for meget eller forøge `backoffLevel` to gange. **Terminaltilstande (IKKE nedkølinger):** -- `banned` — angives ved registrering af forbudte nøgleord/kontoblokering (se [BAN_DETECTION](../security/BAN_DETECTION.md)) og efter tre på hinanden følgende afvisninger pr. anmodning fra upstream (`request_rejected`, f.eks. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); en enkelt afvisning nedkøler kun forbindelsen -- `expired` (overgår til terminaltilstand efter et begrænset antal genforsøg — `EXPIRED_RETRY_MAX = 3` med eksponentiel backoff — så midlertidige OAuth-fejl kan rette sig selv, før kontoen deaktiveres permanent) +- `banned` — angives ved registrering af forbudte nøgleord/kontoudelukkelse (se [BAN_DETECTION](../security/BAN_DETECTION.md)) og ved tre på hinanden følgende upstream-afvisninger pr. forespørgsel (`request_rejected`, f.eks. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); en enkelt afvisning nedkøler kun forbindelsen +- `expired` (overgår til en terminaltilstand efter et begrænset antal genforsøg — `EXPIRED_RETRY_MAX = 3` med eksponentiel backoff — så midlertidige OAuth-fejl kan rette sig selv, før kontoen deaktiveres permanent) - `credits_exhausted` Disse bevares, indtil legitimationsoplysningerne ændres, eller en operatør nulstiller dem. Overskriv ikke terminaltilstande med en midlertidig nedkølingstilstand. -**Doven genoprettelse:** Når `rateLimitedUntil` er passeret, bliver forbindelsen kvalificeret igen. Ved vellykket brug rydder `clearAccountError()` alle fejlfelter. +**Doven genoprettelse:** Når `rateLimitedUntil` er passeret, kan forbindelsen vælges igen. Efter vellykket brug rydder `clearAccountError()` alle fejlfelter. + +### Claude OAuth-forbrugsgrænse: bane med lavere prioritet + nulstilling af sessionsgrænse + +**Omfang:** én Claude-abonnementsforbindelse (OAuth). Begge funktioner er **tilvalg pr. +forbindelse** (Redigér forbindelse → Claude-sektionen → `lowPriorityMode` / `autoLimitReset` i +`providerSpecificData`, begge deaktiveret som standard) og afspejler Claude Codes kommandoer +`/low-priority` og `/limit-reset` (wire-kontrakten er registreret fra Claude Code 2.1.263). + +**Implementering:** + +- Tilstandsmaskine + klassificering af svar: `open-sse/services/claudeLowPriority.ts` +- Klient til nulstillingsstatus/-anmodning: `open-sse/services/claudeLimitReset.ts` +- Executor-hook (headerindsættelse + genforsøg med samme konto): `open-sse/executors/base.ts::execute()` +- Lagring af tilvalg: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Udløser:** 5-timers-forbrugsgrænsen — et `429`, hvis headere indeholder +`anthropic-ratelimit-unified-status: rejected` og, når kontoen er kvalificeret, +`anthropic-ratelimit-unified-slow-offer: treatment`. Intet sendes før det første +429-svar ved grænsen; et pludseligt 429-svar uden unified-headere går gennem den normale +nedkølingssti. + +**Bane med lavere prioritet** (`lowPriorityMode`): + +- Ved 429-svaret fra grænsen accepterer executoren tilbuddet og forsøger straks igen med + den **samme** konto med `anthropic-usage-limit: slow`; banen forbliver aktiv indtil den + annoncerede `anthropic-ratelimit-unified-reset` (+60s margen), og alle forespørgsler i + dette tidsrum indeholder headeren. Det opfangede 429-svar når aldrig `handleChatCore`, + så forbindelsen sættes **ikke** i nedkøling og erstattes ikke via rotation. +- `anthropic-ratelimit-unified-slow-status` i senere svar: `active` / `not_needed` + bevarer banen; `slot_busy` (429) eller et `529` afventer serverens + `anthropic-ratelimit-unified-slow-retry-after` (standard 20s, begrænset til 5–600s, ±30% jitter) + og forsøger igen, begrænset af `anthropic-ratelimit-unified-slow-max-wait` (standard 20 min., + begrænset til 1 min.–6 t.) — derefter afsluttes banen, og en 10-minutters pause blokerer + genaccept. Ventetiden begrænses desuden af den resterende tid af forespørgslens egen + timeout for upstream-start (`resolveFetchStartTimeout`, som standard 10 min.) minus en + margen på 5 s: Uden denne grænse ville standardventetiden på maksimalt 20 minutter + overleve forespørgslen, og pausen ville blive afbrudt undervejs, hvilket ville eksponere + en `TimeoutError` i stedet for den kontrollerede `max_wait`-afslutning + pause. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, overgang til et nyt + 5-timersvindue eller `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` + (hvilket afslutter den som `extra_usage` ved enhver status, da betalt merforbrug nu + dækker grænsen) afslutter banen; svaret fortsætter derefter til den normale nedkølingssti. + `budget_exhausted` huskes indtil den annoncerede budgetnulstilling (≤ 8 dage). +- Kontrollen af grænsen kører efter executorens egne 400-udløste genforsøg inden for samme + forsøg (kontekstredigering, begrænsning af tænkning/indsats, automatisk indlæring af + parametre), så et 429-svar fra grænsen, der først viser sig under et af disse genforsøg, + stadig opfanges i stedet for at nå nedkølingsstien. +- Tilstanden opbevares i hukommelsen pr. forbindelse (en genstart koster ét ekstra + 429-svar fra grænsen for at acceptere igen). + +**Nulstilling af sessionsgrænse** (`autoLimitReset`, forsøges før banen, når begge er aktiveret): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide`- + blok; når `arm: "reset"` og `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` med + `{ "program": "juniper_tide" }` (organisations-UUID fra + `providerSpecificData.organizationUUID`, bootstrap-reserveløsning). +- `result: reset|not_limited` → forespørgslen forsøges igen ved fuld hastighed (ingen + slow-header). `already_used` / `not_offered` gemmer `next_available_at` (standard én uge); + enhver fejl medfører 15 minutters backoff. Nulstillingen kan bruges én gang om ugen og + tæller stadig med i den ugentlige grænse. + +Regressionsbeskyttelse: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Sessionstilknytning (#7274) -**Omfang:** én klientsession (`X-Session-Id`- / `x-codex-session-id`- / `x-omniroute-session`-header) fastgjort til én forbindelse for **enhver** udbyder. +**Omfang:** én klientsession (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`-header), som er knyttet til én forbindelse for **enhver** udbyder. -**Formål:** holde en agent med flere ture (Claude Code, aider, brugerdefinerede agenter) på samme konto på tværs af anmodninger, hvilket reducerer konteksttab på tværs af konti og gentagne 429-fejl ved koldstart hos udbydere med sessionsstatus pr. konto. +**Formål:** Hold en agent med flere interaktioner (Claude Code, aider, brugerdefinerede agenter) på den samme konto på tværs af anmodninger, hvilket reducerer konteksttab ved kontoskift og gentagne 429-fejl ved koldstart hos udbydere med sessionsstatus pr. konto. **Implementering:** -- TTL-bestemmelse: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Valg/oprettelse af fastgørelse: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- TTL-resolvering: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- Valg/oprettelse af binding: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Headerudtrækning (generisk, enhver udbyder): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Permanent fastgørelsestabel: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Indstilling: `sessionAffinityTtlMs` (global TTL i ms, `0` deaktiverer) — `src/lib/db/settings.ts`. Omdøbt fra den Codex-specifikke `codexSessionAffinityTtlMs` via migreringen `124_generic_session_affinity_ttl.sql`, som overfører en eventuelt tidligere konfigureret Codex-TTL som den nye standard. +- Persisteret bindingstabel: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Indstilling: `sessionAffinityTtlMs` (global TTL i ms, `0` deaktiverer) — `src/lib/db/settings.ts`. Omdøbt fra den Codex-specifikke `codexSessionAffinityTtlMs` via migreringen `124_generic_session_affinity_ttl.sql`, som overfører enhver tidligere konfigureret Codex-TTL som den nye standardværdi. -Før #7274 afsluttede `resolveSessionAffinityTtlMs()` straks med `0` for alle andre udbydere end `codex`, så TTL-indstillingen (og sessionsheaderne) ikke havde nogen effekt andre steder, selvom fastgørelsesmekanismen og headerudtrækningen allerede var udbyderagnostiske. Rettelsen fjernede denne tidlige returnering; TTL'en gælder nu ensartet for alle udbydere, når den globalt er indstillet til mere end `0`. +Før #7274 returnerede `resolveSessionAffinityTtlMs()` straks `0` for alle udbydere undtagen `codex`, så TTL-indstillingen (og sessionsheaderne) ikke havde nogen effekt andre steder, selvom bindingsmekanismen og headerudtrækningen allerede var udbyderuafhængige. Rettelsen fjernede denne tidlige returnering; TTL'en gælder nu ensartet for alle udbydere, når den er indstillet globalt til en værdi over `0`. -De tre sessionstilknytningsheadere videresendes aldrig til upstream — eksekveringskomponenterne bygger deres egne upstream-headere fra bunden i stedet for at videresende klientheadere, så dette forbliver et rent internt korrelations-id. +De tre sessionsaffinitetsheadere videresendes aldrig upstream — eksekveringskomponenterne opbygger deres egne upstream-headere fra bunden i stedet for at videresende klientheadere, så dette forbliver et rent internt korrelations-id. ### Eksklusive leases for administrerede sessionsforbindelser -**Omfang:** én aktiv administreret HTTP-klient/session ejer én kvalificeret OmniRoute-forbindelse. +**Omfang:** Én aktiv administreret HTTP-klient/session ejer én kvalificeret OmniRoute-forbindelse. -**Formål:** levere varigt, eksklusivt ejerskab over en forbindelse til klienter, der har brug for en fast routinggrænse på tværs af anmodninger. Dette adskiller sig fra sessionstilknytning, som er en blød kontinuitetspræference: En eksklusiv lease bevarer livscyklustilstanden i SQLite, håndhæver global entydighed for aktive ejere og aktive forbindelser og afviser en forældet generation før afsendelse til udbyderen. +**Formål:** At levere vedvarende, eksklusivt ejerskab af forbindelser til klienter, der har brug for en hård routingafgrænsning på tværs af anmodninger. Dette adskiller sig fra sessionsaffinitet, som er en blød præference for kontinuitet: En eksklusiv lease persisterer livscyklustilstand i SQLite, håndhæver global entydighed for aktive ejere og aktive forbindelser og afviser en forældet generation før afsendelse til udbyderen. -Funktionen er valgfri pr. API-nøgle. En administreret nøgle skal have rettigheden `lease:exclusive` og en eksplicit, ikke-tom `allowedConnections`-liste. Enhver HTTP-klient kan bruge livscyklusendpointet; der kræves intet klientnavn, ingen user-agent, ingen udbyder, ingen OAuth-metode og ingen model. Leasen ejer en forbindelse, ikke en model, så et modelskift bevarer tilknytningen, så længe forbindelsen fortsat er kvalificeret efter de almindelige regler. De normale regler for model, kvote, tilstand, nedkøling og tilladelsesliste forbliver autoritative og kan flytte den samme generation til en anden ledig, kvalificeret forbindelse. +Funktionen tilvælges pr. API-nøgle. En administreret nøgle skal have scopet `lease:exclusive` og en eksplicit, ikke-tom `allowedConnections`-liste. Enhver HTTP-klient kan bruge livscyklusendepunktet; der kræves intet klientnavn, ingen user-agent, ingen udbyder, ingen OAuth-metode og ingen model. Leasen ejer en forbindelse, ikke en model, så et modelskift bevarer bindingen, så længe forbindelsen fortsat er kvalificeret efter de almindelige regler. De normale regler for model, kvote, tilstand, nedkøling og tilladelseslister er fortsat autoritative og kan flytte den samme generation til en anden ledig, kvalificeret forbindelse. -Livscyklussen er `POST /api/v1/session-leases` med JSON-handlingerne `acquire`, `renew` og `release`. Administrerede inferensanmodninger medsender den uigennemsigtige `X-OmniRoute-Lease-Owner`-værdi og den præcise `X-OmniRoute-Lease-Generation`. Ejeren bruger `vlo_` efterfulgt af 43 base64url-tegn; kun dens SHA-256-hash gemmes. Hvert afsluttende afsendelseshegn binder også det godkendte API-nøgle-id og det aktive forbindelses-id. Kontrolheadere for leases fjernes fra logfiler, bevarede snapshots af anmodninger og upstream-headere til eksekveringskomponenter. +Livscyklussen er `POST /api/v1/session-leases` med JSON-handlingerne `acquire`, `renew` og `release`. Administrerede inferensanmodninger angiver den uigennemsigtige `X-OmniRoute-Lease-Owner`-værdi og den nøjagtige `X-OmniRoute-Lease-Generation`. Ejeren bruger `vlo_` efterfulgt af 43 base64url-tegn; kun dens SHA-256-hash gemmes. Hver endelig afsendelsesafgrænsning bindes også til det autentificerede API-nøgle-id og det aktive forbindelses-id. Lease-kontrolheadere fjernes fra logfiler, gemte øjebliksbilleder af anmodninger og upstream-headere til eksekveringskomponenter. -Hvis almindelig routing har kvalificerede administrerede kandidater, men alle ledige kandidater er optaget af en fremmed aktiv lease, returnerer OmniRoute HTTP `429`, en kode for utilgængelig leasekapacitet, en tilstand, der afventer kapacitet, og en begrænset `Retry-After`, som udledes af det tidligste relevante udløbstidspunkt. Almindelig tom kvalificering er ikke leasekonflikt og bevarer den eksisterende semantik for routingfejl. +Hvis almindelig routing har kvalificerede administrerede kandidater, men alle ledige kandidater er optaget af en fremmed aktiv lease, returnerer OmniRoute HTTP `429`, koden lease-capacity-unavailable, en tilstand, der venter på kapacitet, og en afgrænset `Retry-After`, som er afledt af det tidligste relevante udløbstidspunkt. Almindelig tom kvalificering er ikke lease-konkurrence og beholder den eksisterende semantik for routingfejl. -Relaterede mekanismer forbliver adskilte: +Relaterede mekanismer forbliver separate: -- OAuth-sessionsoptagelse er en blød proceslokal fordeling for OAuth-konti. -- Kontosemaforer tildeler tilladelser til samtidige anmodninger og afsluttes, når en anmodning fuldføres. -- Eksklusive leases for administrerede sessionsforbindelser er varigt livscyklusejerskab med et generationshegn. +- OAuth-sessionsbelægning er blød, proceslokal distribution for OAuth-konti. +- Kontosemaforer tildeler tilladelser til samtidige anmodninger og ophører, når en anmodning er fuldført. +- Eksklusive leases for administrerede sessionsforbindelser er vedvarende livscyklusejerskab med en generationsafgrænsning. --- @@ -270,48 +334,77 @@ pr. model. Begrænset af `comboCooldownWait` (`enabled`, `maxWaitMs`, `maxAttemp --- -## 5. Adgangskontrol for anmodningskøen (v3.8.49 · issue #6593) +## 5. Adgangskontrol til anmodningskøen (v3.8.49 · issue #6593) **Omfang**: den lokale hastighedsbegrænsningskø pr. udbyder+forbindelse (`open-sse/services/rateLimitManager.ts`, understøttet af Bottleneck), ét lag under de tre mekanismer ovenfor. -**`maxWaitMs` er et ældre, persistent navn for udløb af udførelse.** -`resilienceSettings.requestQueue.maxWaitMs` videregives til Bottleneck som et jobs -`expiration`, hvis timer først starter efter dispatch. Den begrænser derfor -limiter-styret udførelse, ikke tiden i den lokale kø. Udløb -vises som den betroede lokale `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504); -det tidligere kodenavn for kø-timeout accepteres kun af hensyn til betroet intern -bagudkompatibilitet. Standardværdien er 15000ms; tilsidesæt den via -`RATE_LIMIT_MAX_WAIT_MS` (miljøvariabel) eller kontrolpanelet (**Indstillinger → Robusthed**, -UI-grænse på 1–30000ms). Ophold i køen har ingen tidsfrist; brug -`maxQueueDepth` nedenfor til at begrænse antallet af anmodninger i kø. - -**`maxQueueDepth` — valgfri adgangsgrænse (ny).** `resilienceSettings.requestQueue.maxQueueDepth` -begrænser, hvor mange anmodninger der må vente i kø (endnu ikke dispatcheret) for én +**`maxWaitMs` begrænser ventetiden i køen; `executionMaxWaitMs` begrænser udførelsen.** +De to er bevidst adskilt, og ingen af dem påvirker den anden. + +`resilienceSettings.requestQueue.maxWaitMs` er **budgettet for køventetid**: Det +dækker ventetiden på en udbyderplads og derefter tiden i tilstanden QUEUED, og +dets timer ryddes i det øjeblik, jobbet forlader QUEUED og begynder at køre +(`rateLimitManager.ts`, `wrappedFn`). En anmodning, der overskrider det, når +aldrig upstream-tjenesten. Standardværdien er 30000ms, leveret af +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` i `src/lib/resilience/settings.ts` og +fastholdt af `tests/unit/ratelimit-admission-control-6593.test.ts`, så en +ændring af den får testen til at fejle i stedet for ubemærket at gøre dette +afsnit forældet. + +`resilienceSettings.requestQueue.executionMaxWaitMs` er det, Bottleneck +modtager som jobbets `expiration`, hvis timer først starter efter afsendelse. +Det fungerer som en sikkerhedsgrænse for eksekveringskomponenter uden deres +egen upstream-timeout, og det hæves til eksekveringskomponentens egen timeout +for start af hentning, når denne er længere, så det ikke kan afbryde et sundt +igangværende svar. Standardværdien er 600000ms (10 min.). + +At lade købudgettet indgå i `expiration` var det, der tidligere afbrød +ikke-inkrementelle gateways midt under behandlingen — de kan legitimt køre i +flere minutter, før de første bytes ankommer — og derfor vises en udløbstid +som `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), mens købudgettet bruger +køtimeout-koden. Tilsidesæt en af dem via `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (miljøvariabel) eller kontrolpanelet +(**Indstillinger → Robusthed**). Begge begrænses til 1ms–24h ved normalisering. + +**Prioritet for begge:** Miljøvariablen angiver kun _standardværdien_. En værdi, +der er gemt i `resilienceSettings.requestQueue` (kontrolpanel/API-patch, lagret +i `key_value`), har forrang, og en forbindelsesspecifik +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` har forrang over denne. +Indstilling af miljøvariablen i en installation, der allerede har en gemt +værdi, ændrer derfor intet — ryd eller opdater i stedet den gemte indstilling. + +Opholdet i køen begrænses af `maxWaitMs`; `maxQueueDepth` nedenfor begrænser, +hvor mange kaldere der må være i kø på én gang. + +**`maxQueueDepth` — valgfrit adgangsloft (nyt).** `resilienceSettings.requestQueue.maxQueueDepth` +begrænser, hvor mange anmodninger der må stå i kø (endnu ikke afsendt) for én udbyder+forbindelse ad gangen. Når køen allerede indeholder `maxQueueDepth` anmodninger, afvises en ny anmodning straks med en typet `code: "RATE_LIMIT_QUEUE_FULL"`-fejl, **før** den nogensinde når `limiter.schedule()` — så afvisningen er billig og sker før eventuelt efterfølgende arbejde med -promptkomprimering/oversættelse for den pågældende anmodning. Standardværdien `0` = -deaktiveret, hvilket bevarer den eksisterende adfærd med en ubegrænset kø; begrænset til 0–100000. -Tilsidesæt via `RATE_LIMIT_MAX_QUEUE_DEPTH` (miljøvariabel) eller -`resilienceSettings.requestQueue.maxQueueDepth` (kontrolpanel/API-patch). +promptkomprimering/oversættelse for den pågældende anmodning. Standardværdien +`0` = deaktiveret, hvilket bevarer den eksisterende adfærd med en ubegrænset +kø; begrænset til 0–100000. Tilsidesæt via `RATE_LIMIT_MAX_QUEUE_DEPTH` +(miljøvariabel) eller `resilienceSettings.requestQueue.maxQueueDepth` +(kontrolpanel/API-patch). Selve adgangskontrollen er en ren funktion (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), så -den kan enhedstestes uden en rigtig Bottleneck-limiter. - -> RFC'en, der åbnede #6593, foreslog også et `bypassCompressionOnRateLimit`- -> flag. Dette repositoriums `open-sse/services/compression/`-pipeline er -> prompt-/kontekstkomprimering af den udgående LLM-anmodning (`chatCore.ts`, -> omkring `resolveCompressionSettings`/`selectCompressionStrategy`-blokken), -> ikke HTTP-svarkomprimering af syntetiserede 429-svar — der findes ingen -> tilsvarende kodesti for et bogstaveligt bypass-flag. Dette promptkomprimeringstrin -> kører desuden i øjeblikket _før_ `withRateLimit()` i anmodningspipelinen, så -> omstrukturering for at springe det over ved en afvisning på grund af en fuld kø er en separat og større -> ændring end omfanget af dette issue; den blev bevidst **ikke** implementeret -> her og er overladt til en opfølgning, hvis CPU-besparelsen er risikoen ved -> omstruktureringen værd. +den kan enhedstestes uden en rigtig Bottleneck-begrænser. + +> RFC'en, der oprettede #6593, foreslog også et +> `bypassCompressionOnRateLimit`-flag. Dette repos +> `open-sse/services/compression/`-pipeline udfører prompt-/kontekstkomprimering +> på den udgående LLM-anmodning (`chatCore.ts`, omkring +> `resolveCompressionSettings`/`selectCompressionStrategy`-blokken), ikke +> HTTP-svarkomprimering af genererede 429-svar — der findes ingen tilsvarende +> kodesti for et bogstaveligt bypass-flag. Dette promptkomprimeringstrin kører +> desuden i øjeblikket _før_ `withRateLimit()` i anmodningspipelinen, så en +> omstrukturering med henblik på at springe det over ved afvisning på grund af +> en fuld kø er en separat og større ændring end omfanget af dette issue; det +> blev bevidst **ikke** implementeret her og er overladt til en opfølgning, +> hvis CPU-besparelsen er risikoen ved omstruktureringen værd. --- diff --git a/docs/i18n/da/docs/architecture/admission-lanes.md b/docs/i18n/da/docs/architecture/admission-lanes.md index d027ca641b47..77f48fcf5f86 100644 --- a/docs/i18n/da/docs/architecture/admission-lanes.md +++ b/docs/i18n/da/docs/architecture/admission-lanes.md @@ -7,49 +7,52 @@ OmniRoute har **to** proceslokale banesystemer med forskellige anvendelsesområder. De er komplementære; operatører bør vide, hvilket af dem de ser på. -## 1. Bytebaseret adgangskontrol for hele processen (`chatBodyAdmission.ts`) - -- **Omfang:** stien for bufferlagret body/heap for `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` og de øvrige chat-lignende ruter. Beskytter - mod heap-amplifikation fra store bodies fra kodeagenter (#4380). -- **Én global controller pr. proces, ikke baner pr. nøgle (#10110).** Hver API-nøgle - (hashet) eller `anonymous`-session får adgang i forhold til det **samme** delte budget — - det hashede sessions-id bruges KUN som planlægningsnøgle for rimelighed (round-robin- - tildeling blandt ventende), aldrig som en kapacitetsshard. En tidligere version af dette - dokument beskrev baner pr. nøgle med uafhængig kapacitet; den model blev - fjernet i #10110, fordi den gjorde det muligt for uautoriserede, falske legitimationsoplysninger at - multiplicere grænsen for hele processen. -- **Adgangskontrol (#503-fanout): et automatisk afledt BYTE-budget til indlæsning, ikke et fast antal - requests.** Den ældre requestbaserede grænse `CHAT_MAX_HEAVY_IN_FLIGHT` (standardværdi `1` +## 1. Bytebaseret adgangskontrol på procesniveau (`chatBodyAdmission.ts`) + +- **Omfang:** stien for bufferlagrede bodies/heap for `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` og de øvrige chatlignende ruter. Beskytter + mod heap-forstærkning fra store bodies fra kodeagenter (#4380). +- **Én procesglobal controller, ikke baner pr. nøgle (#10110).** Hver API-nøgle + (hashed) eller `anonymous`-session får adgang ud fra det **samme** delte budget — + det hashede sessions-id bruges KUN som en planlægningsnøgle til fairness + (round-robin-fordeling blandt ventende), aldrig som en kapacitetsshard. En tidligere + version af dette dokument beskrev baner pr. nøgle med uafhængig kapacitet; den model + blev fjernet i #10110, fordi den gjorde det muligt for falske, ikke-godkendte + legitimationsoplysninger at multiplicere den procesomfattende grænse. +- **Gate (#503-fanout): et automatisk afledt BYTE-budget til indlæsning, ikke et fast + antal requests.** Det ældre request-antalsloft `CHAT_MAX_HEAVY_IN_FLIGHT` (standard `1` før denne rettelse) reducerede fan-out for kodeagenter (flere underagenter/CLI'er, - bodies rutinemæssigt > 256 KB) til en effektiv samtidighed på ~1, hvilket gav 503-fejl - under helt normal belastning. Den er nu kun bindende, når en operatør eksplicit - angiver `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Hvis den ikke er angivet, styres adgangen i stedet - af `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — et budget, der automatisk afledes af + bodies rutinemæssigt > 256 KB) til en effektiv samtidighed på ~1, hvilket gav + 503-fejl under helt normal belastning. Det er nu kun bindende, når en operatør eksplicit + angiver `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Hvis det ikke er angivet, styres adgangen + i stedet af `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — et budget, der automatisk afledes af processens reelle hukommelsesgrænse (`src/shared/middleware/admissionBudget.ts`): - 25 % af den laveste grænse blandt V8-heapgrænsen og enhver cgroup-/containergrænse, - divideret med en faktor på 8 for midlertidig amplifikation og begrænset til mellem 8 MiB og + 25 % af den laveste grænse mellem V8-heapgrænsen og en eventuel cgroup-/containergrænse, + divideret med en faktor på 8x for midlertidig forstærkning og begrænset til mellem 8 MiB og 2 GiB. Eksplicitte tilsidesættelser bruger de samme grænser. Dette skalerer automatisk fra en - container på 512 MB til en desktopcomputer med 32 GB uden justering af miljøvariabler. En body, der ikke kan - rummes inden for det effektive budget, afvises straks med `413 body_exceeds_budget`; - kun samtidighedskonflikter mellem bodies, der hver især kan håndteres, placeres i den begrænsede - rimelighedskø. En aktiv ressourcepresmåler med flere signaler (V8-heapforhold, + container på 512 MB til en desktop med 32 GB uden tilpasning af miljøvariabler. En body, der + ikke kan rummes inden for det effektive budget, afvises straks med `413 body_exceeds_budget`; + kun konkurrence mellem bodies, der hver især kan håndteres, placeres i den begrænsede + fairness-kø. En aktiv ressourcepres-tracker med flere signaler (V8-heapforhold, cgroup, PSI, OOM-hændelser — `open-sse/utils/resourcePressurePolicy.ts`) forkorter den begrænsede ventetid under `high` pres og afviser straks med `503 resource_pressure` under `critical` pres, før nogen bytes overhovedet - indlæses. + indlæses. PSI læses fra denne enheds cgroup `memory.pressure`, når den findes + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` gælder + for hele værten og bruges kun som fallback på bare metal / cgroup v1, så en vært, + der swapper, ikke kan udløse en 503-fejl i en inaktiv container. - **Justering:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — tilsidesættelse af det automatisk afledte bytebudget - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — ældre requestbaseret grænse, kun ved aktiv tilvalg - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — køventetid før 503 (standardværdi 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — heapventil for bytes i kø (standardværdi 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — udfasede - no-ops siden #10110 (accepteres af hensyn til konfigurationskompatibilitet, men ignoreres) + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — ældre request-antalsloft, kun ved tilvalg + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — køventetid før 503 (standard 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — heap-ventil for bytes i kø (standard 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — forældede + no-ops siden #10110 (accepteres af hensyn til konfigurationskompatibilitet, ignoreres) - **Rapporter:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — inklusive tilføjelserne fra #503-fanout: `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` og `countCapEnabled` - (false i en standardinstallation — bekræfter, at det er bytebudgettet og ikke den ældre - antalsgrænse, der faktisk er bindende). + (false i en standardinstallation — bekræfter, at bytebudgettet, og ikke det ældre + antalsloft, er det, der faktisk er bindende). ## 2. Adaptive virtuelle lanes ved kørsel (`open-sse/services/admission`) diff --git a/docs/i18n/da/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/da/docs/frameworks/EMBEDDED-SERVICES.md index ccf8b4300636..b95744f43ce1 100644 --- a/docs/i18n/da/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/da/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Version:** v3.8.44 -> **Senest opdateret:** 2026-07-03 -> **Målgruppe:** Udviklere, der tilføjer, vedligeholder eller fejlsøger indlejrede tjenester (9Router, CLIProxyAPI, Mux, Bifrost). +> **Senest opdateret:** 2026-09-09 +> **Målgruppe:** Ingeniører, der tilføjer, vedligeholder eller fejlsøger indlejrede tjenester (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Indlejrede tjenester er lokalt installerede sidecar-værktøjer til processer, som OmniRoute installerer, overvåger og +Indlejrede tjenester er lokalt installerede sidecar-procesværktøjer, som OmniRoute installerer, overvåger og eksponerer som fuldgyldige routingmål. I modsætning til eksterne udbydere (som tilgås via internettet -med API-nøgler) kører indlejrede tjenester på samme maskine som OmniRoute og kommunikerer via loopback. +ved hjælp af API-nøgler) kører indlejrede tjenester på samme maskine som OmniRoute og kommunikerer via loopback. --- @@ -31,33 +31,34 @@ med API-nøgler) kører indlejrede tjenester på samme maskine som OmniRoute og ### Hvorfor indlejrede tjenester? -Fem tjenester er indlejret: +Seks tjenester er indlejret: -| Tjeneste | npm-pakke | Standardport | Formål | -| --------------- | ----------------------------------- | :----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI-router, som OmniRoute kan bruge som underudbyder. Modeller eksponeres som `9router/{sub}/{model}` | -| **CLIProxyAPI** | Binær GitHub-udgivelse (`cliproxy`) | 8317 | Lokal proxyadapter til Anthropic CLI-godkendelsesflows. Leverer fallback-routing, når OAuth-tokens udløber | -| **Mux** | `mux` (headless `mux server`) | 8322 | Lokal daemon til agentorkestrering (coder/mux). Kun livscyklushåndteret — ikke et routingmål (ingen LLM-proxying). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-baseret AI-gateway-relæbackend. Når den kører, vælges den automatisk af relæruten (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Claude-abonnementsproxy — alternativ/failover til CLIProxyAPI for Claude-Code-formet trafik; den injicerede nøgle bliver til `DARIO_ADMIN_TOKEN`, som beskytter dens `/admin/*`-OAuth-kontrolplan | +| Tjeneste | npm-pakke | Standardport | Formål | +| --------------- | ----------------------------------- | :----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI-router, som OmniRoute kan bruge som underudbyder. Modeller eksponeres som `9router/{sub}/{model}` | +| **CLIProxyAPI** | Binær GitHub-udgivelse (`cliproxy`) | 8317 | Lokal proxyadapter til Anthropic CLI-godkendelsesflows. Leverer reserverouting, når OAuth-tokens udløber | +| **Mux** | `mux` (headless `mux server`) | 8322 | Lokal daemon til agentorkestrering (coder/mux). Kun livscyklusstyret — ikke et routingmål (ingen LLM-proxying). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-baseret AI-gateway-relaybackend. Når den kører, vælges den automatisk af relayruten (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Claude-abonnementsproxy — alternativ/failover til CLIProxyAPI for trafik udformet som Claude Code; den injicerede nøgle bliver til `DARIO_ADMIN_TOKEN`, som beskytter dens `/admin/*`-OAuth-kontrolplan | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web-automatisering (headless Chromium via Puppeteer). Kun livscyklusstyret — ikke et routingmål. | -Alle fem følger den samme overvågningsmodel: +Alle seks følger den samme overvågningsmodel: - OmniRoute installerer dem under `DATA_DIR/services/{name}/` (isoleret fra OmniRoutes egen `package.json`) -- OmniRoute starter og overvåger dem som underprocesser -- OmniRoute injicerer en midlertidig API-nøgle i underprocessens miljø og roterer den uden nedetid (hvor det er relevant) -- Alle administrationsruter (`/api/services/*`) er **LOCAL_ONLY** — kun tilgængelige via loopback (ufravigelig regel nr. 17) +- OmniRoute starter og overvåger dem som underordnede processer +- OmniRoute injicerer en midlertidig API-nøgle i den underordnede proces' miljø og roterer den uden nedetid (hvor det er relevant) +- Alle administrationsruter (`/api/services/*`) er **LOCAL_ONLY** — kun tilgængelige fra loopback (ufravigelig regel nr. 17) ### Vigtige beslutninger (fra designplanen) | Beslutning | Værdi | | ----------------------------------------------------- | ---------------------------------------------------------------------------------------- | | Dashboardadgang til 9Routers native brugergrænseflade | Reverse proxy på `/dashboard/providers/services/9router/embed/*` | -| Installationsmekanisme | `npm install {package}` via `execFile` (ingen shellinterpolation) | +| Installationsmekanisme | `npm install {package}` via `execFile` (ingen shell-interpolation) | | Anvendelsestilstand | Udbyder registreret som `9router/{sub}/{model}` i routingmotoren | | Administration af API-nøgler | OmniRoute genererer, krypterer ved lagring (AES-256-GCM) og injicerer via miljøvariabler | -| Dashboardplacering | `/dashboard/providers/services` (tre faner) | -| Automatisk start | Kan slås til og fra pr. tjeneste, som standard FRA | +| Placering i dashboardet | `/dashboard/providers/services` (tre faner) | +| Automatisk start | Til/fra-indstilling pr. tjeneste, deaktiveret som standard | --- @@ -67,10 +68,11 @@ Alle fem følger den samme overvågningsmodel: ┌────────────────────────────────────────────────────────────────────┐ │ Lag 1 — Brugergrænseflade │ │ /dashboard/providers/services (faner: CLIProxyAPI | 9Router | Mux)│ -│ Live-logfiler (SSE), Start/Stop/Genstart/Opdater, Indstillinger, Installation│ +│ Livestreamede logfiler (SSE), Start/Stop/Genstart/Opdater, │ +│ Indstillinger, Installer │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Skal + fanerouting via ?tab= │ +│ ├── page.tsx Skal + fanerouting via ?tab= │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -89,54 +91,56 @@ Alle fem følger den samme overvågningsmodel: │ /dashboard/providers/services/9router/embed/[...path] │ │ (omvendt HTTP- + WebSocket-proxy → 9Router-upstream) │ │ │ -│ Adgangskontrol: LOCAL_ONLY_API_PREFIXES inkluderer "/api/services/" og│ +│ Adgangskontrol: LOCAL_ONLY_API_PREFIXES inkluderer │ +│ "/api/services/" og │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ - │ kald i samme proces + │ kald i processen ┌──────────────────────▼─────────────────────────────────────────────┐ │ Lag 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Generisk supervisor (child_process.spawn) │ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 20130 for 9Router (konfigurerbar) │ -│ ├── logs: stdio-ringbuffer på 5 MB → SSE-hændelser │ -│ ├── health: HTTP GET /health hvert 2.–5. sek., doven genoprettelse│ -│ └── lifecycle: SIGTERM 15 sek. → SIGKILL │ +│ ├── installer: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── starter: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── API-nøgle: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ +│ ├── port: 20130 for 9Router (kan konfigureres) │ +│ ├── logfiler: stdio-ringbuffer på 5 MB → SSE-hændelser │ +│ ├── helbred: HTTP GET /health hvert 2.–5. sek., træg genopretning│ +│ └── livscyklus: SIGTERM 15 sek. → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Initialiserer alle SERVICES[] ved processtart │ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts Periodisk GET /v1/models → tabellen service_models│ +│ modelSync.ts Periodisk GET /v1/models → service_models-tabel│ │ ringBuffer.ts Cirkulær logbuffer (5 MB pr. tjeneste) │ -│ healthCheck.ts Periodisk HTTP-sundhedskontrol │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ healthCheck.ts Regelmæssig HTTP-helbredskontrol │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (installationsadaptere) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-kompatibel HTTP (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Lag 4 — Udbyder / Routing │ +│ Lag 4 — Udbyder/routing │ │ │ │ open-sse/executors/ninerouter.ts │ │ Slår port og API-nøgle op igen for hver anmodning (ingen cache).│ -│ Fjerner præfikset "9router/" fra model-id'et før proxying. │ -│ Returnerer 503 service_not_running, hvis supervisoren ikke er i "running".│ +│ Fjerner præfikset "9router/" fra model-id'et før proxying. │ +│ Returnerer 503 service_not_running, hvis supervisoren ikke er │ +│ i tilstanden "running". │ │ │ │ src/shared/constants/providers.ts │ │ Post for "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ Modeller gemmes som "9router/{sub}/{model}" (med præfiks). │ -│ Synkroniseres hvert 5. minut af modelSync.ts. │ +│ Modeller gemmes som "9router/{sub}/{model}" (med præfiks). │ +│ Synkroniseres hvert 5. minut af modelSync.ts. │ │ │ -│ Mux er KUN livscyklusadministreret (lag 1-3) — det er en daemon til│ -│ agentorkestrering, ikke en LLM-proxy, så den har ingen executor-/ │ -│ udbyderpost i lag 4 og er aldrig et routingmål. │ +│ Mux administreres KUN med hensyn til livscyklus (lag 1-3) — det │ +│ er en daemon til agentorkestrering, ikke en LLM-proxy, så den har │ +│ ingen executor-/udbyderpost i lag 4 og er aldrig et routingmål. │ └────────────────────────────────────────────────────────────────────┘ ``` -### Centrale kildefiler +### Vigtige kildefiler | Fil | Rolle | | ------------------------------------------- | ----------------------------------------------------------- | @@ -150,9 +154,10 @@ Alle fem følger den samme overvågningsmodel: | `src/lib/services/installers/ninerouter.ts` | npm-installation/-opdatering/-afinstallation af 9Router | | `src/lib/services/installers/cliproxy.ts` | npm-installation/-opdatering/-afinstallation af CLIProxyAPI | | `src/lib/services/installers/mux.ts` | npm-installation/-opdatering/-afinstallation af Mux | +| `src/lib/services/installers/openwa.ts` | npm-installation/-opdatering/-afinstallation af open-wa | | `src/app/api/services/9router/_lib.ts` | Hjælpefunktionen `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Delt slutpunkt til SSE-logfiler | -| `open-sse/executors/ninerouter.ts` | Provider-eksekveringskomponent (lag 4) | +| `src/app/api/services/[name]/logs/route.ts` | Fælles SSE-slutpunkt til logfiler | +| `open-sse/executors/ninerouter.ts` | Leverandøreksekveringskomponent (lag 4) | --- @@ -208,25 +213,25 @@ race conditions, når f.eks. automatisk start og en UI-knap udløses samtidigt. ## 4. API-reference -Alle ruter under `/api/services/` er **LOCAL_ONLY** (kun loopback, ufravigelig regel nr. 17). -Anmodninger, der ikke kommer fra loopback, modtager `403 LOCAL_ONLY` uanset auth-token. +Alle ruter under `/api/services/` er **LOCAL_ONLY** (kun loopback, fast regel #17). +Anmodninger, der ikke kommer fra loopback, modtager `403 LOCAL_ONLY` uanset godkendelsestoken. -### 4.1 9Router-slutpunkter (11 ruter) +### 4.1 9Router-endpoints (11 ruter) #### `POST /api/services/9router/install` Installer 9Router fra npm. Opretter `DATA_DIR/services/9router/` med sin egen `package.json` og `node_modules/`. Er ikke i konflikt med OmniRoutes egne afhængigheder. -**Anmodningstekst** (alle valgfrie): +**Anmodningstekst** (alle felter er valgfrie): ```json { "version": "latest" } ``` -| Felt | Type | Standard | Beskrivelse | -| --------- | -------- | ---------- | -------------------------------------------------- | -| `version` | `string` | `"latest"` | npm-versionstag eller semver, der skal installeres | +| Felt | Type | Standardværdi | Beskrivelse | +| --------- | -------- | ------------- | -------------------------------------------------- | +| `version` | `string` | `"latest"` | npm-versionstag eller semver, der skal installeres | **Svar:** @@ -234,18 +239,18 @@ Installer 9Router fra npm. Opretter `DATA_DIR/services/9router/` med sin egen | ------ | ---------------------------------------------------------------------------- | | `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | | `400` | Ugyldig anmodningstekst (Zod-valideringsfejl) | -| `409` | Installation er allerede i gang (låsen er taget) | +| `409` | Installation er allerede i gang (lås fastholdt) | | `500` | npm-installation mislykkedes — se `message` for en forståelig fejlmeddelelse | -**Bemærkninger:** Bruger `execFile('npm', [...])` — ingen shell, ingen interpolation (ufravigelig regel nr. 13). +**Bemærkninger:** Bruger `execFile('npm', [...])` — ingen shell, ingen interpolation (fast regel #13). EACCES-fejl vises som forståelige meddelelser. --- #### `POST /api/services/9router/start` -Start 9Router. Registrerer en supervisor, hvis der ikke allerede er registreret en, og kalder -derefter `supervisor.start()`. Idempotent, når tjenesten allerede kører. +Start 9Router. Registrerer en supervisor, hvis en sådan ikke allerede er registreret, og kalder derefter +`supervisor.start()`. Idempotent, når tjenesten allerede kører. **Anmodningstekst:** ingen @@ -275,23 +280,23 @@ derefter `supervisor.start()`. Idempotent, når tjenesten allerede kører. #### `POST /api/services/9router/stop` -Stop 9Router kontrolleret. Sender SIGTERM, venter 15 s og sender derefter SIGKILL, -hvis processen stadig kører. Idempotent, når tjenesten allerede er stoppet. +Stop 9Router kontrolleret. Sender SIGTERM, venter 15 sek., og sender derefter SIGKILL, hvis processen stadig kører. +Idempotent, når tjenesten allerede er stoppet. **Anmodningstekst:** ingen **Svar:** -| Status | Beskrivelse | -| ------ | ------------------------------------- | -| `200` | `ServiceStatus` (tilstand: "stopped") | -| `503` | Stop mislykkedes uventet | +| Status | Beskrivelse | +| ------ | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Stop mislykkedes uventet | --- #### `POST /api/services/9router/restart` -Svarer til `stop()` efterfulgt af `start()` under operationslåsen. +Svarer til `stop()` efterfulgt af `start()` under handlingslåsen. **Anmodningstekst:** ingen @@ -302,10 +307,10 @@ Svarer til `stop()` efterfulgt af `start()` under operationslåsen. #### `POST /api/services/9router/update` Opdaterer 9Router til en nyere npm-version. Hvis tjenesten kører, stoppes den -først, npm-installationen køres (hvorved den nyere version installeres på samme sted), -og derefter genstartes tjenesten. +først, npm-installationen køres (den nyere version installeres på stedet), og derefter +genstartes tjenesten. -**Anmodningstekst** (alle valgfrie): +**Anmodningstekst** (alle felter er valgfrie): ```json { "version": "latest" } @@ -343,14 +348,14 @@ Den gemmes krypteret (AES-256-GCM) i tabellen `version_manager`. #### `GET /api/services/9router/status` -Returnerer kombineret live- og DB-status, inklusive versionsmetadata og forhåndsvisning af API-nøglen. +Returnerer kombineret live- og DB-status, herunder versionsmetadata og en forhåndsvisning af API-nøglen. **Svar:** -| Status | Beskrivelse | -| ------ | ------------------------- | -| `200` | Se skemaet nedenfor | -| `500` | Læsning af status fejlede | +| Status | Beskrivelse | +| ------ | ----------------------------- | +| `200` | Se skemaet nedenfor | +| `500` | Læsning af status mislykkedes | **Svarskema:** @@ -376,8 +381,8 @@ Returnerer kombineret live- og DB-status, inklusive versionsmetadata og forhånd #### `POST /api/services/9router/auto-start` -Slår flaget for automatisk start til eller fra. Når `enabled: true`, starter tjenesten automatisk, -næste gang OmniRoute starter op (hvis tjenesten er installeret). +Slå automatisk start til eller fra. Når `enabled: true`, starter tjenesten automatisk, +næste gang OmniRoute starter (hvis tjenesten er installeret). **Anmodningstekst:** @@ -396,14 +401,14 @@ næste gang OmniRoute starter op (hvis tjenesten er installeret). #### `GET /api/services/9router/logs` -SSE-stream med live-logfiler fra 9Routers ringbuffer til stdout/stderr. +SSE-stream med live-logfiler fra 9Routers ringbuffer for stdout/stderr. **Forespørgselsparametre:** -| Parameter | Type | Standardværdi | Beskrivelse | -| --------- | --------- | ------------- | -------------------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Antal historiske linjer, der sendes først (maks. 1000) | -| `filter` | `string` | ingen | Filter for understrenge uden forskel på store og små bogstaver (ingen regex — ReDoS-sikkert) | +| Parameter | Type | Standardværdi | Beskrivelse | +| --------- | --------- | ------------- | ------------------------------------------------------------------------------------------ | +| `tail` | `integer` | 200 | Antal historiske linjer, der først skal sendes (maks. 1000) | +| `filter` | `string` | ingen | Filter for delstrenge uden forskel på store og små bogstaver (ingen regex — ReDoS-sikkert) | **SSE-hændelser:** @@ -411,7 +416,7 @@ SSE-stream med live-logfiler fra 9Routers ringbuffer til stdout/stderr. | ----------- | ----------- | ------------------------------- | | `snapshot` | `LogLine[]` | Indledende historisk afslutning | | `log` | `LogLine` | Live-loglinje | -| `heartbeat` | `{}` | Keep-alive hvert 15. sekund | +| `heartbeat` | `{}` | Keep-alive hvert 15. sek. | **LogLine-skema:** @@ -425,30 +430,30 @@ SSE-stream med live-logfiler fra 9Routers ringbuffer til stdout/stderr. **Svar:** -| Status | Beskrivelse | -| ------ | -------------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | Parameteren `filter` er for lang (> 200 tegn) | -| `404` | Tjenesten blev ikke fundet (supervisor ikke registreret) | +| Status | Beskrivelse | +| ------ | ------------------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | Parameteren `filter` er for lang (> 200 tegn) | +| `404` | Tjenesten blev ikke fundet (supervisoren er ikke registreret) | --- ### 4.2 CLIProxyAPI-slutpunkter (10 ruter) -CLIProxyAPI har samme slutpunktsstruktur som 9Router bortset fra `rotate-key` samt +CLIProxyAPI har samme slutpunktsstruktur som 9Router, bortset fra `rotate-key`, plus `accounts`, `provider-expose` og `auto-restart-adopted`. Den modtager nu en dedikeret API-nøgle til dataplanet, som injiceres ved opstart (`needsApiKey: true` i `bootstrap.ts`, bruges til modelsynkronisering); `status` indeholder færre felter. -| Metode | Sti | Beskrivelse | -| ------ | ----------------------------------- | ---------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Installer CLIProxyAPI fra npm | -| `POST` | `/api/services/cliproxy/start` | Start CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Stop CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Genstart CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Opdater til en nyere version | -| `GET` | `/api/services/cliproxy/status` | Live- og DB-status (uden `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Slå automatisk start til eller fra | +| Metode | Sti | Beskrivelse | +| ------ | ----------------------------------- | --------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Installer CLIProxyAPI fra npm | +| `POST` | `/api/services/cliproxy/start` | Start CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Stop CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Genstart CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Opdater til en nyere version | +| `GET` | `/api/services/cliproxy/status` | Live- + DB-status (uden `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Slå automatisk start til eller fra | Det fælles slutpunkt `GET /api/services/{name}/logs` (se §4.1) fungerer for alle fire tjenester ved hjælp af det dynamiske segment `[name]`. @@ -458,10 +463,11 @@ fire tjenester ved hjælp af det dynamiske segment `[name]`. ### 4.3 Mux-slutpunkter (8 ruter) Mux har samme slutpunktsstruktur som CLIProxyAPI — ingen `rotate-key`-rute i API- -grænsefladen (bearer-tokenet genereres på samme måde som 9Routers via +overfladen (bearer-tokenet genereres på samme måde som 9Routers via `getOrCreateApiKey("mux")` og injiceres via miljøvariablen `MUX_SERVER_AUTH_TOKEN`, men -der findes endnu ikke noget dedikeret slutpunkt til rotation). Mux er kun livscyklusadministreret: -I modsætning til 9Router har den ingen Layer 4-eksekveringskomponent og registreres aldrig som routingudbyder. +der findes endnu ikke et dedikeret slutpunkt til rotation). Mux administreres kun gennem +sin livscyklus: I modsætning til 9Router har den ingen Layer 4-eksekutor og registreres +aldrig som routingudbyder. | Metode | Sti | Beskrivelse | | ------ | ------------------------------ | ----------------------------------- | @@ -470,45 +476,80 @@ I modsætning til 9Router har den ingen Layer 4-eksekveringskomponent og registr | `POST` | `/api/services/mux/stop` | Stop Mux | | `POST` | `/api/services/mux/restart` | Genstart Mux | | `POST` | `/api/services/mux/update` | Opdater til en nyere npm-version | -| `GET` | `/api/services/mux/status` | Live- og DB-status | +| `GET` | `/api/services/mux/status` | Live- + DB-status | | `POST` | `/api/services/mux/auto-start` | Slå automatisk start til eller fra | --- ### 4.4 Bifrost-slutpunkter (8 ruter) -Bifrost er en Go-baseret relay-backend til AI-gateways (`@maximhq/bifrost`). Den bruger samme -slutpunktsstruktur som CLIProxyAPI (ingen `rotate-key` — Bifrost administrerer sine egne udbydernøgler -i `config.json` under sin `-app-dir`). +Bifrost er en Go-baseret relay-backend til AI-gateways (`@maximhq/bifrost`). Den bruger +samme slutpunktsstruktur som CLIProxyAPI (ingen `rotate-key` — Bifrost administrerer +sine egne udbydernøgler i `config.json` under sin `-app-dir`). -| Metode | Sti | Beskrivelse | -| ------ | ---------------------------------- | -------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Installer Bifrost fra npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Start Bifrost på port 8080 (standard) | -| `POST` | `/api/services/bifrost/stop` | Stop Bifrost | -| `POST` | `/api/services/bifrost/restart` | Genstart Bifrost | -| `POST` | `/api/services/bifrost/update` | Opdater til en nyere version | -| `GET` | `/api/services/bifrost/status` | Live- + DB-status | -| `POST` | `/api/services/bifrost/auto-start` | Slå automatisk start til eller fra | -| `GET` | `/api/services/bifrost/logs` | SSE-loghale (via den delte dynamiske `[name]/logs`-rute) | +| Metode | Sti | Beskrivelse | +| ------ | ---------------------------------- | --------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Installer Bifrost fra npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Start Bifrost på port 8080 (standard) | +| `POST` | `/api/services/bifrost/stop` | Stop Bifrost | +| `POST` | `/api/services/bifrost/restart` | Genstart Bifrost | +| `POST` | `/api/services/bifrost/update` | Opdater til en nyere version | +| `GET` | `/api/services/bifrost/status` | Live- + DB-status | +| `POST` | `/api/services/bifrost/auto-start` | Slå automatisk start til eller fra | +| `GET` | `/api/services/bifrost/logs` | SSE-loghale (via den fælles dynamiske rute `[name]/logs`) | -**Routingkonfiguration:** Når `BIFROST_BASE_URL` ikke er angivet, og den overvågede Bifrost- -instans kører, bruger `getBifrostRoutingConfig()` (i `routingBackend.ts`) automatisk -`http://127.0.0.1:{port}` som relæets basis-URL. En eksplicit `BIFROST_BASE_URL`-miljøvariabel -har altid forrang. +**Routingforbindelse:** Når `BIFROST_BASE_URL` ikke er angivet, og den overvågede +Bifrost-instans kører, bruger `getBifrostRoutingConfig()` (i `routingBackend.ts`) +automatisk `http://127.0.0.1:{port}` som relay-basis-URL. En eksplicit +miljøvariabel `BIFROST_BASE_URL` har altid forrang. --- ### 4.5 Dario-slutpunkter (12 ruter) -Samme livscyklusstruktur som de øvrige tjenester (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`) samt et tokenbeskyttet OAuth- +Samme livscyklusstruktur som de andre tjenester (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`) plus et tokenbeskyttet OAuth- kontrolplan under `admin/`: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (alle beskyttet af `DARIO_ADMIN_TOKEN`). -### 4.6 Omvendt proxy (indlejring af 9Router-dashboard) +### 4.6 open-wa-slutpunkter (7 ruter) -Dashboardet indlejrer 9Routers webgrænseflade i en iframe via en intern omvendt +open-wa (`@open-wa/wa-automate`) styrer en headless Chromium-instans (via +Puppeteer) for at automatisere WhatsApp Web. Den bruger samme slutpunktsstruktur som +Mux (ingen `rotate-key`-rute endnu). Den administreres kun gennem sin livscyklus — +den er ikke et routingmål og har ingen Layer 4-eksekutor-/udbyderpost. + +| Metode | Sti | Beskrivelse | +| ------ | --------------------------------- | -------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Installer open-wa fra npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Start open-wa på port 8323 (standard) | +| `POST` | `/api/services/openwa/stop` | Stop open-wa | +| `POST` | `/api/services/openwa/restart` | Genstart open-wa | +| `POST` | `/api/services/openwa/update` | Opdater til en nyere version | +| `GET` | `/api/services/openwa/status` | Live- og DB-status | +| `POST` | `/api/services/openwa/auto-start` | Slå automatisk start til eller fra | +| `GET` | `/api/services/openwa/logs` | SSE-logafslutning (via den delte dynamiske `[name]/logs`-rute) | + +**API-nøgle:** injiceres som `WA_KEY` — open-wa's generiske miljøvariabeltilsidesættelse +med præfikset `WA_*` knytter den til CLI-indstillingen `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, verificeret mod den installerede pakkeversion +4.76.0). Præfikset `ow_` tilføjes, når den genereres af `generateServiceApiKey()`. open-wa +læser nøglen fra en `key`/`api_key`-HTTP-header (ikke `Authorization: +Bearer`); `/api-docs*` er udtrykkeligt undtaget fra kontrollen +(`setupAuthenticationLayer` i `dist/cli/server.js`), så tilstandskontrollen +kræver ingen godkendelsesheader. + +**Parring:** open-wa er uofficiel og ikke tilknyttet WhatsApp — det +tilsluttede nummer risikerer at blive udelukket som følge af WhatsApps egen registrering af automatisering. +Ved første start udskrives QR-koden til parring til stdout og vises via +det eksisterende logpanel/den eksisterende SSE-stream — der findes endnu ikke et dedikeret slutpunkt +til QR-billeder i denne integration. + +--- + +### 4.7 Omvendt proxy (indlejring af 9Router-dashboard) + +Dashboardet indlejrer 9Router-webbrugerfladen i en iframe via en intern omvendt proxy på: ``` @@ -519,16 +560,16 @@ Denne proxy: - Videresender anmodningen til `http://127.0.0.1:{port}/{path}` (kun loopback) - Fjerner indgående `cookie`- og `authorization`-headere (ingen lækage af OmniRoute-sessionen) -- Indsætter `Authorization: Bearer {apiKey}` til 9Router-godkendelse +- Injicerer `Authorization: Bearer {apiKey}` til 9Router-godkendelse - Fjerner `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` fra svaret -- Omskriver HTML-svar for at indsætte `` og normalisere absolutte stier (`/foo` → `/dashboard/.../embed/foo`) +- Omskriver HTML-svar for at injicere `` og normalisere absolutte stier (`/foo` → `/dashboard/.../embed/foo`) -WebSocket-opgraderinger for det indlejrede dashboard håndteres af en ledsagende server på en +WebSocket-opgraderinger til det indlejrede dashboard håndteres af en ledsagende server på en dedikeret port (se `src/lib/services/embedWsProxy.ts`). **Sikkerhed:** Embed-proxyruterne er klassificeret under `LOCAL_ONLY_API_PREFIXES` og kan kun tilgås fra loopback. En angriber, der får fat i en JWT via en -Cloudflare-/Ngrok-tunnel, kan ikke bruge proxyen til at få adgang til indlejrede tjenester. +Cloudflare-/Ngrok-tunnel, kan ikke oprette en proxyforbindelse til indlejrede tjenester. --- diff --git a/docs/i18n/da/docs/frameworks/MEMORY.md b/docs/i18n/da/docs/frameworks/MEMORY.md index b932923f9cd1..4612661804de 100644 --- a/docs/i18n/da/docs/frameworks/MEMORY.md +++ b/docs/i18n/da/docs/frameworks/MEMORY.md @@ -161,36 +161,39 @@ Tabellen `memory_vec_meta` (migrering `083_memory_vec.sql`) gemmer: - `last_reset_at` — tidsstempel for seneste fulde nulstilling. - `vec_loaded` — 0/1-flag, der angiver, om sqlite-vec blev indlæst korrekt. -## Indstillingsudvidelse - -Ni felter til embeddings og vektorer er tilgængelige i `MemorySettingsExtended` i -`src/shared/schemas/memory.ts` og persisteres via `src/lib/db/settings.ts`: - -| Felt | Type | Standardværdi | Beskrivelse | -| ------------------------ | -------------------------------------------------- | ------------- | ------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Hvilken embedding-kilde der skal bruges | -| `embeddingProviderModel` | `string \| null` | `null` | Udbyder/model i formatet `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | OpenAI-kompatibel base-URL kun til hukommelse | -| `customModelId` | `string \| null` | `null` | Model-id, der sendes til det brugerdefinerede endpoint | -| `transformersEnabled` | `boolean` | `false` | Aktivér Transformers.js (MiniLM, ~400 MB) | -| `staticEnabled` | `boolean` | `false` | Aktivér den lokale statiske potion-base-8M-model | -| `rerankEnabled` | `boolean` | `false` | Aktivér genrangeringstrinnet (tilføjer +200-500 ms/anmodning) | -| `rerankProviderModel` | `string \| null` | `null` | Udbyder/model til genrangering i formatet `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Hvilken vektorbackend der skal bruges | +## Udvidelse af indstillinger + +Ni integrerings- og vektorfelter er tilgængelige i `MemorySettingsExtended` i +`src/shared/schemas/memory.ts` og gemmes via `src/lib/db/settings.ts`: + +| Felt | Type | Standard | Beskrivelse | +| ------------------------ | -------------------------------------------------- | -------- | ----------------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Hvilken integreringskilde der skal bruges | +| `embeddingProviderModel` | `string \| null` | `null` | Udbyder/model i formatet `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | Basis-URL til et OpenAI-kompatibelt slutpunkt, som kun bruges af Memory | +| `customModelId` | `string \| null` | `null` | Model-id, der sendes til det brugerdefinerede slutpunkt | +| `transformersEnabled` | `boolean` | `false` | Aktivt tilvalg af Transformers.js (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Aktivt tilvalg af den lokale statiske potion-base-8M-model | +| `rerankEnabled` | `boolean` | `false` | Aktivér genrangeringstrinnet (tilføjer +200-500ms/anmodning) | +| `rerankProviderModel` | `string \| null` | `null` | Genrangeringsudbyder/model i formatet `provider/model` | + +`rerankProviderModel` fortolkes af `POST /v1/rerank` (kaldt via loopback), så det accepterer alt, som denne rute accepterer: en kurateret cloudbaseret genrangeringsmodel (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) eller en OpenAI-kompatibel udbydernode som `/` (f.eks. `skilled-mini/bge-reranker-v2-m3` for en TEI/Infinity-maskine). Loopback-noder er altid kvalificerede; en node på en anden vært (LAN, Tailscale) kræver desuden funktionsflaget `RERANK_REMOTE_PROVIDER_NODES` og skal overholde udbyderens politik for udgående URL'er — se [Funktionsflag](../reference/FEATURE_FLAGS.md). Dashboardvælgeren viser kuraterede udbydere samt lokale noder; enhver gyldig `provider/model`-streng kan angives direkte via `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Hvilken vektorbackend der skal bruges | Disse eksponeres via `GET /PUT /api/settings/memory` (skemaet `MemorySettingsExtendedSchema`). For kilden `remote` accepterer Memory også de valgfrie indstillinger `customBaseUrl` og -`customModelId`. Sammen vælger de et OpenAI-kompatibelt `/embeddings`-endpoint og en -model uden at ændre det globale embedding-register. Endpointet normaliseres før brug og -kontrolleres af udbyderens politik for udgående URL'er: HTTP(S) er påkrævet, indlejrede -legitimationsoplysninger og forespørgselsstrenge afvises, og cloudmetadataadresser forbliver -blokeret. Tomme værdier bevarer den valgte registerudbyder. Fejl, der returneres til -dashboardet, renses, og endpointets legitimationsoplysninger logges aldrig. - -> **TODO (D20):** Omfanget `global` (deling af hukommelser på tværs af alle API-nøgler) er ikke -> implementeret i denne udgivelse. Det kræver skemaændringer og en global hentningssti. -> Spor dette separat. +`customModelId`. Sammen vælger de et OpenAI-kompatibelt `/embeddings`-slutpunkt og en +model uden at ændre det globale integreringsregister. Slutpunktet normaliseres før brug +og kontrolleres af udbyderens politik for udgående URL'er: HTTP(S) er påkrævet, +indlejrede legitimationsoplysninger og forespørgselsstrenge afvises, og adresser til +cloudmetadata forbliver blokeret. Tomme værdier bevarer den valgte registerudbyder. Fejl, +der returneres til dashboardet, renses, og legitimationsoplysninger til slutpunkter +logføres aldrig. + +> **TODO (D20):** Omfanget `global` (deling af hukommelser på tværs af alle API-nøgler) er +> ikke implementeret i denne version. Det kræver skemaændringer og en global +> hentningssti. Spor dette separat. ## Lagerlag diff --git a/docs/i18n/da/docs/guides/DOCKER_GUIDE.md b/docs/i18n/da/docs/guides/DOCKER_GUIDE.md index 914ecff4abb2..56cd0673bfcc 100644 --- a/docs/i18n/da/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/da/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Hurtig kørsel +> **Selvhost med én kommando?** Se +> [vejledningen til selvhosting](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (offentliggjort image + +> Redis, kun loopback, intet profilvalg). Hurtig kørsel nedenfor er +> løsningen med en enkelt container til brugere, der allerede kører Redis et andet sted. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/da/docs/guides/TROUBLESHOOTING.md b/docs/i18n/da/docs/guides/TROUBLESHOOTING.md index bd090f76978d..02ab9351a9a0 100644 --- a/docs/i18n/da/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/da/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ Angiv disse i OmniRoute-processens miljø (daemonen, f.eks. via LaunchAgent-plis --- -## Advarsler ved npm install (ERESOLVE / peer / deprecated) +## npm install-advarsler (ERESOLVE / peer / deprecated) -Når du kører `npm install -g omniroute`, ser du muligvis en mur af advarsler såsom `npm warn ERESOLVE`, meddelelser om peer-afhængigheder og `deprecated`-meddelelser. **Disse er forventede og harmløse.** Installationen lykkedes, hvis du ser `added packages` i outputtet. +Når du kører `npm install -g omniroute`, kan du se en lang række advarsler såsom `npm warn ERESOLVE`, meddelelser om peer-afhængigheder og `deprecated`-meddelelser. **Disse er forventede og harmløse.** Installationen lykkedes, hvis du ser `added packages` i outputtet. -Advarslerne skyldes forældede intervaller for peer-afhængigheder i tredjepartspakker, som OmniRoute ikke har kontrol over: +Brug OmniRoutes understøttede installationsform for at undertrykke advarsler om løsning af peer-afhængigheder: -1. **`marked-terminal` kræver `marked >=1 <16`, men fandt `marked@18`** — fungerer fint i praksis; upstream-intervallet for peer-afhængigheden er blot forældet. -2. **`deprecated prebuild-install@7.1.3`** — et transitivt hjælpeværktøj til hentning af platformspecifikke binære filer. Det bruges ikke - til at installere den fastlåste `wreq-js`-transportbinding og betyder ikke, at opsætningen af transporten - for webcookie-udbyderen mislykkedes. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` undertrykker kun `ERESOLVE` og meddelelser om peer-afhængigheder. Meddelelser om udfasede pakker forbliver synlige, fordi de kommer fra transitive tredjepartspakker. De betyder ikke, at installationen mislykkedes. + +Advarslerne skyldes forældede versionsintervaller for peer-afhængigheder i tredjepartspakker, som OmniRoute ikke har kontrol over: + +1. **`marked-terminal` kræver `marked >=1 <16`, men fandt `marked@18`** — fungerer fint i praksis; upstream-projektets peer-versionsinterval er blot forældet. +2. **`deprecated prebuild-install@7.1.3`** — et transitivt hjælpeværktøj til hentning af platformsafhængige binære filer. Det bruges ikke + til at installere den fastlåste `wreq-js`-transportbinding og betyder ikke, at konfigurationen af + web-cookie-udbyderens transport mislykkedes. -**Ingen handling nødvendig** — advarslerne kan ikke fjernes helt uden at forke upstream-pakkerne. +**Ingen handling er nødvendig** — advarslerne kan ikke undertrykkes fuldstændigt uden at forke upstream-pakkerne. --- diff --git a/docs/i18n/da/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/da/docs/providers/CURSOR-API-KEY-AND-CLI.md index 955e177903aa..19ae1c5e8c0e 100644 --- a/docs/i18n/da/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/da/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -6,26 +6,26 @@ To måder at placere Cursor bag OmniRoute uden en IDE-session: -1. **`cursor-api`-udbyder** (kortet "Cursor API", alias `cua`): en API-nøglebaseret - udbyder, der indeholder en Cursor-bruger-API-nøgle (`crsr_…`, genereret på +1. **`cursor-api`-udbyder** (kortet "Cursor API", alias `cua`): en API-nøgleudbyder, + der indeholder en Cursor-bruger-API-nøgle (`crsr_…`, genereret på `https://cursor.com/dashboard/api`). Enhver OmniRoute-klient kan derefter tilgå - Cursor-modeller via `/v1/chat/completions` som `cursor-api/` eller - `cua/` med de sædvanlige lag til kvoter, fallback og logning. IDE- - udbyderen (`cursor`, OAuth/IDE-session) er uændret. -2. **Videresendelse af Cursor CLI**: konfigurer Cursor CLI (`agent`) til at bruge OmniRoute, så - hvert RPC-kald fra CLI'en godkendes med en OmniRoute API-nøgle, videresendes + Cursor-modeller gennem `/v1/chat/completions` som `cursor-api/` eller + `cua/` med de sædvanlige lag til kvoter, fallback og logning. IDE-udbyderen + (`cursor`, OAuth/IDE-session) er uændret. +2. **Cursor CLI-videresendelse**: Peg Cursor CLI (`agent`) mod OmniRoute, så + hvert RPC-kald, som CLI'en foretager, godkendes med en OmniRoute-API-nøgle, videresendes til Cursor med legitimationsoplysningerne fra en `cursor-api`-forbindelse og registreres på siden Logs. ## Hvorfor nøglen udveksles `api2.cursor.sh` afviser en rå `crsr_…`-nøgle som Bearer-token (401). Cursor -CLI sender først nøglen via POST til `/auth/exchange_user_api_key` og modtager et sessions- -JWT, der udløber efter én time; den returnerede `refreshToken` har samme +CLI sender først nøglen via POST til `/auth/exchange_user_api_key` og modtager en sessions-JWT, +der udløber efter en time; den returnerede `refreshToken` har samme `exp`, så en opdatering kræver, at nøglen udveksles igen. -`open-sse/services/cursorApiKeyAuth.ts` udfører denne udveksling, cacher ét sessions- -token pr. nøgle, udveksler igen fem minutter før udløb og fjerner det cachede -token, når Cursor svarer med 401. `CursorExecutor` kalder det umiddelbart før åbning +`open-sse/services/cursorApiKeyAuth.ts` udfører denne udveksling, cacher ét sessionstoken +pr. nøgle, udveksler igen fem minutter før udløb og fjerner det cachede +token, når Cursor svarer med 401. `CursorExecutor` kalder den umiddelbart før åbning af upstream-streamen for `cursor-api`-forbindelser. ## `cursor-api`-udbyderen @@ -37,7 +37,7 @@ Register: `open-sse/config/providers/registry/cursor/index.ts` `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Kontrolpanel: Providers → Cursor API → Add API key. +Dashboard: Providers → Cursor API → Add API key. REST: @@ -59,40 +59,52 @@ curl -sS http://localhost:20128/v1/chat/completions \ Bemærkninger: - Modellisten for `cursor-api` kommer fra det statiske Cursor-register (den - samme liste, som IDE-udbyderen falder tilbage til); det er ikke nødvendigt at - installere `cursor-agent` på OmniRoute-værten. -- `POST /api/providers/{id}/refresh-cursor` er kun beregnet til `cursor`-IDE-udbyderen; - `cursor-api`-forbindelser har ingen IDE-session, der skal fornyes. + samme liste, som IDE-udbyderen falder tilbage til); ingen installation af `cursor-agent` + er nødvendig på OmniRoute-værten. +- `POST /api/providers/{id}/refresh-cursor` er kun til `cursor`-IDE-udbyderen; + `cursor-api`-forbindelser har ingen IDE-session, der skal fornys. -## Videresendelse af Cursor CLI +## Oprindelige model-id'er og indsats + +For `cursor` / `cu` og `cursor-api` / `cua` lader den fælles normalisering af Claude-indsats +det anmodede model-id forblive intakt. Cursor kan annoncere et suffiks som +`-low` som en del af et reelt model-id i stedet for som et OmniRoute-indsatsalias. +Cursor-executoren bevarer et nøjagtigt match i livekataloget; når der ikke findes +et match, håndterer dens eksisterende modelresolver fallback fra suffiks til parameter. + +Dette ændrer ikke normaliseringen af indsats for direkte Claude-, Claude-kompatible +eller Vertex-ruter. Tilgængeligheden afhænger stadig af den valgte Cursor-kontos +katalog og rettigheder. + +## Videresendelse for Cursor CLI Rute: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Præfikset `/api/cursor-cli/` er registreret i `src/shared/constants/publicApiRoutes.ts`, fordi handleren håndhæver sin egen godkendelse: -| Sti | Godkendelse forventet fra CLI'en | Hvad OmniRoute gør | -| ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Validerer nøglen, genererer et 1-times HS256-JWT (signeret med `JWT_SECRET`) og returnerer det | -| alle andre stier (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Verificerer udsteder/målgruppe/udløb, vælger en aktiv `cursor-api`-forbindelse, erstatter Authorization-headeren med det udvekslede Cursor-token og streamer svaret tilbage | +| Sti | Godkendelse forventet fra CLI'en | Hvad OmniRoute gør | +| ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Validerer nøglen, udsteder en HS256-JWT med 1 times gyldighed (signeret med `JWT_SECRET`) og returnerer den | +| alle andre stier (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Verificerer udsteder, målgruppe og udløbstid, vælger en aktiv `cursor-api`-forbindelse, erstatter Authorization-headeren med det udvekslede Cursor-token og streamer svaret tilbage | -CLI'en afkoder `exp` fra det token, den modtager, så hvis den får udleveret et uigennemsigtigt -token, får det den til at udveksle igen før næsten hver anmodning; det genererede JWT undgår +CLI'en afkoder `exp` fra det token, den modtager, så hvis den får et uigennemsigtigt +token, udveksler den igen før næsten hver anmodning; den udstedte JWT undgår dette. Et 401-svar fra OmniRoute får CLI'en til at udveksle igen. ### Opsætning -1. Opret en OmniRoute API-nøgle (Dashboard → API keys) og en `cursor-api`- +1. Opret en OmniRoute API-nøgle (Dashboard → API-nøgler) og en `cursor-api`- forbindelse. -2. Bed CLI'en om at bruge HTTP/1.1 til agent-streamen. I +2. Indstil CLI'en til at bruge HTTP/1.1 til agentstreamen. I `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Uden dette åbner CLI'en agent-interaktionen via HTTP/2 mod en separat - konfigureret agentvært, og kun RPC-kaldene på kontrolplanet går gennem + Uden dette åbner CLI'en agentkørslen over HTTP/2 til en separat + konfigureret agentvært, og kun kontrolplans-RPC'erne går gennem slutpunktet. 3. Kør CLI'en mod OmniRoute: @@ -103,19 +115,19 @@ dette. Et 401-svar fra OmniRoute får CLI'en til at udveksle igen. agent -p --trust "Reply with exactly OK" ``` -Hvert trin registreres i Logs med udbyderen `cursor-api`, anmodningstypen `cursor-cli`, -stien `/api/cursor-cli/` og tilskrives den OmniRoute API-nøgle og den -forbindelse, der håndterede det. +Hvert hop vises i logfilerne med udbyderen `cursor-api`, anmodningstypen `cursor-cli` +og stien `/api/cursor-cli/`, tilskrevet den OmniRoute API-nøgle og den +forbindelse, der betjente anmodningen. ### Fejltilstande -| Situation | Svar til CLI'en | -| ------------------------------------------------- | -------------------------------------------------- | -| Ukendt OmniRoute-nøgle og `REQUIRE_API_KEY=true` | 401 `unauthenticated` ved udveksling | -| `REQUIRE_API_KEY=false` | anonym session (afspejler `/v1/*`-adfærd) | -| Udløbet / fremmed / manipuleret sessions-JWT | 401, CLI'en foretager udveksling igen | -| OmniRoute-API-nøgle tilbagekaldt efter udveksling | 401 ved næste RPC | -| Ingen aktiv `cursor-api`-forbindelse | 503 `unavailable` | -| Cursor afviser forbindelsens nøgle | 401 `unauthenticated`, cachelagret session slettes | -| Upstream kan ikke nås | 502 `unavailable` (renset meddelelse) | -| `JWT_SECRET` ikke angivet | 503 ved udveksling | +| Situation | Svar til CLI'en | +| ------------------------------------------------- | --------------------------------------------- | +| Ukendt OmniRoute-nøgle og `REQUIRE_API_KEY=true` | 401 `unauthenticated` ved udveksling | +| `REQUIRE_API_KEY=false` | anonym session (afspejler `/v1/*`-adfærd) | +| Udløbet / fremmed / manipuleret sessions-JWT | 401, CLI'en udveksler igen | +| OmniRoute API-nøgle tilbagekaldt efter udveksling | 401 ved næste RPC | +| Ingen aktiv `cursor-api`-forbindelse | 503 `unavailable` | +| Cursor afviser forbindelsens nøgle | 401 `unauthenticated`, cachet session fjernes | +| Upstream kan ikke nås | 502 `unavailable` (renset meddelelse) | +| `JWT_SECRET` er ikke angivet | 503 ved udveksling | diff --git a/docs/i18n/da/docs/reference/API_REFERENCE.md b/docs/i18n/da/docs/reference/API_REFERENCE.md index 563e823d25c8..897df5d469f3 100644 --- a/docs/i18n/da/docs/reference/API_REFERENCE.md +++ b/docs/i18n/da/docs/reference/API_REFERENCE.md @@ -445,7 +445,7 @@ Brug dette endpoint, når en sidecar kører uden for processen og ikke kan impor --- -## Kompatibilitetsendpoints +## Kompatibilitetsendepunkter | Metode | Sti | Format | | ------ | ----------------------------------------- | ------------------------------------- | @@ -468,19 +468,19 @@ Brug dette endpoint, når en sidecar kører uden for processen og ikke kan impor | GET | `/v1beta/models` | Gemini | | POST | `/v1beta/models/{...path}` | Gemini generateContent | | POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Alias for OpenAI-katalog | -| GET | `/api/v1/vscode/{token}/models` | Alias for OpenAI-modeller | -| POST | `/api/v1/vscode/{token}/chat/completions` | Tokenbaseret OpenAI-alias | -| POST | `/api/v1/vscode/{token}/responses` | Tokenbaseret OpenAI Responses-alias | -| POST | `/api/v1/vscode/{token}/api/chat` | Tokenbaseret Ollama-alias | -| GET | `/api/v1/vscode/{token}/api/tags` | Tokenbaseret alias for Ollama-tags | +| GET | `/api/v1/vscode/{token}/` | OpenAI-katalogalias | +| GET | `/api/v1/vscode/{token}/models` | OpenAI-modelalias | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI-alias med token | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses-alias med token | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama-alias med token | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama-tagsalias med token | Alle POST-ruter følger samme struktur: `Bearer your-api-key` + Zod-valideret JSON-indhold (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` osv.; se `src/shared/validation/schemas.ts`). 4xx returneres ved skemafejl. -For klienter, der ikke kan tilføje `Authorization: Bearer ...`, accepterer OmniRoute også API-nøgler i URL'en via enten kompatibilitet med query-strenge (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) eller de dedikerede `/api/v1/vscode/{token}/...`-endpoints, der er dokumenteret nedenfor. +For klienter, der ikke kan vedhæfte `Authorization: Bearer ...`, accepterer OmniRoute også API-nøgler i URL'en via enten kompatibilitet med forespørgselsstrenge (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) eller de dedikerede `/api/v1/vscode/{token}/...`-endepunkter, der er dokumenteret nedenfor. ```bash -# Rerank +# Rerank (udbyder i cloudregistret eller en OpenAI-kompatibel udbydernode som "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # Jina-klassificering (legitimationsoplysninger til Foundation API) @@ -506,6 +506,28 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Rerank-udbydernoder:** `POST /v1/rerank` dirigerer også til OpenAI-kompatible udbydernoder +> (oMLX, vLLM, Infinity, TEI bag en gateway, …), der adresseres som `/`. Loopback- +> noder (`localhost`, `127.0.0.1`, `172.16.0.0/12`) er altid kvalificerede. Noder på enhver anden +> vært — en maskine på LAN'et eller en Tailscale-peer — er kun kvalificerede, når operatøren aktiverer +> funktionsflaget `RERANK_REMOTE_PROVIDER_NODES`, **og** nodens basis-URL overholder udbyderens +> politik for udgående URL'er (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> cloud-metadata-værter dirigeres der aldrig til. Hukommelsesmotorens rerank-trin kalder denne rute via +> loopback, så den samme regel gælder for `rerankProviderModel` i hukommelsesindstillingerne. +> +> **Lokale serverstrukturer:** Noden kaldes på `/v1/rerank` og, ved 404, på `/rerank` +> (Infinity, TEI). Det opstrøms indhold medtager både Cohere/OpenAI-stavemåden (`documents`, +> `return_documents`) og TEI-stavemåden (`texts`, `return_text`), og svaret fra den opstrøms tjeneste +> normaliseres til Cohere-konvolutten: TEI's rene `[{index, score, text}]`, `{results: [{index, score}]}` +> fra simple gateways og Voyage-formatet `{data: [...]}` returneres alle til klienten som +> `{results: [{index, relevance_score, document?}]}`, sorteret efter score og begrænset til `top_n`. + +> **Registrering af udbydernoder:** Modeller på en OpenAI-kompatibel udbydernode vises i `GET /v1/models` +> under nodepræfikset. Rækker uden endpointmetadata (typisk for lokale `/v1/models`-lister) +> arver nodens `apiType`, så modellerne for en `embeddings`-node er `type: "embedding"`, og modellerne +> for en `rerank`-node er `type: "rerank"` i stedet for som standard at være chat; et eksplicit +> `supportedEndpoints` på en synkroniseret eller manuelt tilføjet række har stadig forrang. + ### Dedikerede udbyderruter ```bash diff --git a/docs/i18n/da/docs/reference/ENVIRONMENT.md b/docs/i18n/da/docs/reference/ENVIRONMENT.md index 134771a48a35..2dcd25a3067c 100644 --- a/docs/i18n/da/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/da/docs/reference/ENVIRONMENT.md @@ -77,74 +77,73 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" --- -## 2. Lager & database +## 2. Lager og database OmniRoute bruger **SQLite** (via `better-sqlite3`) til al persistens. Disse variabler styrer dataplacering, kryptering og livscyklus. -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Rodmappe til SQLite-databasen, sikkerhedskopier og datafiler. Tilsidesæt den for Docker-diskenheder eller brugerdefinerede stier. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(ikke angivet)_ | `src/lib/dataPaths.ts` | Nødudgang for test-/evalueringsbeskyttelsen for DATA_DIR (#10428). Tests og Node-evaluerings-/udskrivningssonder (`-e`/`--eval`/`-p`/`--print`, inklusive formerne `--eval=`/`--print=`) uden `DATA_DIR` omdirigeres til en midlertidig engangsmappe, så de ikke kan åbne operatørens rigtige database; angiv værdien `1` for igen at bruge den rigtige mappe. | -| `OMNIROUTE_BUILD_SHA` | _(ikke angivet)_ | `src/lib/monitoring/buildSha.ts` | Git-SHA for den kørende artefakt. Stemples af `npm run build:release`; kan injiceres i containere, der leveres uden `dist/BUILD_SHA`-markøren. Eksponeres som `system.buildSha` på `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Den reference, som pack-artifact-proveniensporten kontrollerer build-SHA'en imod (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(ikke angivet)_ | `scripts/build/buildProvenance.ts` | Angiv værdien `1` for at tillade pakning af et build, hvis SHA ikke findes på udgivelseslinjen, og registrere det som en tilsigtet canary i stedet for at afvise det ved porten (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(ikke angivet)_ | `scripts/ops/deploy-canary.mjs` | API-nøgle til canary-udrulningens smoke-sonde, som sendes som `Authorization: Bearer` til `/v1/chat/completions`. Bruges kun af udrulningsscriptet (#10429), aldrig af serveren. Ikke relateret til `OMNIROUTE_SMOKE_*`-variablerne i CLI-smoke-testværktøjet, der skal tilvælges (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` i `tests/integration/upstream-cli-smoke.int.test.ts`) — se [CLI-integrationer → Reel smoke-gennemgang](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(ikke angivet)_ | `src/lib/buildPhase.ts` | Buildfasesignal (#10060): angives som `1` af `scripts/build/build-next-isolated.mjs` og nedarves af hver startet build-worker, så databaselaget returnerer en stub uden funktionalitet i stedet for at indlæse det native better-sqlite3-tilføjelsesmodul (som afbryder workeren ved afslutning). Angives aldrig for den kørende server. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Angiv værdien `1` for at springe prebuild-kontrollen af valgfrie native afhængigheder over for eksotiske vendorerede træer. Dette gør ikke en manglende afhængighed buildbar; brug det kun, når native afhængigheder leveres separat. | -| `OMNIROUTE_DATA_DIR` | _(ikke angivet)_ | `open-sse/executors/promptql/threadSticky.ts` | **Reservealias** for `DATA_DIR`, som kun kontrolleres, når `DATA_DIR` ikke er angivet. Bruges til at finde PromptQL-eksekveringens trådfaste sessionscache på disken (`/promptql-thread-sessions.json`); hvis ingen af variablerne er angivet, forbliver cachen kun i hukommelsen (den bevares ikke på tværs af genstarter). | -| `OMNIROUTE_PLUGINS_DIR` | _(ikke angivet)_ | `src/lib/plugins/scanner.ts` | Den mappe, som **runtime-plugin-scanneren** læser — og den rodmappe, som plugin-manageren installerer i — og som tilsidesætter standardværdien afledt af hjemmemappen (#11827). Peg den mod det bind-monterede plugin-træ i Docker/K8s i stedet for at flytte HOME blot for at ændre scannerstien (HOME styrer også al anden adfærd, der er relativ til hjemmemappen). Ikke angivet = `~/.omniroute/plugins` eller `/tmp/.omniroute/plugins`, når processen slet ikke eksporterer nogen hjemmemappe — den tavse manglende registrering, som denne variabel eliminerer. Den fundne mappe logges én gang ved opstart som `scanner.dir_resolved` sammen med det input, der fik forrang. Kun på serversiden: CLI-kommandoplugins beholder deres egen `OMNIROUTE_PLUGIN_PATH` (afsnit 9). | -| `STORAGE_ENCRYPTION_KEY` | _(tom = deaktiveret)_ | `src/lib/db/encryption.ts` | AES-nøgle til fuld kryptering af SQLite-databasen i hvile. Generér med `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Versionsetiket for krypteringsnøglen. Forøg den ved nøglerotation for at understøtte dekryptering af gamle sikkerhedskopier. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Når værdien er `true`, springes rutinemæssige SQLite-filsikkerhedskopier og sikkerhedskopier før skrivning over (lagring/rydning af models.dev-priser samt skrivning af indstillinger). Manuelle sikkerhedskopier og sikkerhedskopier før gendannelse udføres stadig. Den deaktiverer **ikke** migreringskørslens obligatoriske, permanente sikkerhedssnapshot eller beskyttelsen mod massemigrering for en eksisterende permanent database. Ikke-manuelle sikkerhedskopier begrænses til højst én gang pr. 60 minutter. **Indstillinger → Lager** i kontrolpanelet kan deaktivere rutinemæssig automatisk sikkerhedskopiering uafhængigt. | -| `OMNIROUTE_CRYPT_KEY` | _(ikke angivet)_ | `src/lib/db/encryption.ts` | **Forældet alias** for `STORAGE_ENCRYPTION_KEY`. Accepteres som reserve, når den primære variabel mangler. | -| `OMNIROUTE_API_KEY_BASE64` | _(ikke angivet)_ | `src/lib/db/encryption.ts` | **Forældet alias** (Base64-kodet form), der accepteres som reserve. Afkodes automatisk før brug. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ikke angivet)_ | `src/lib/db/core.ts` | Tilsidesæt intervallet (ms) for den periodiske SQLite-sundhedskontrol. Når værdien ikke er angivet, udledes standardværdierne af `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 t.) | `src/lib/db/walMaintenance.ts` | Tilsidesæt intervallet (ms) for den periodiske `wal_checkpoint(TRUNCATE)`. Automatisk kontrolpunktbehandling formindsker aldrig selve WAL-filen, og en server, der kører i lang tid, lukker aldrig sin database. `0` deaktiverer funktionen. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min.) | `src/lib/db/walMaintenance.ts` | Tilsidesæt intervallet (ms) for den hyppige `wal_checkpoint(PASSIVE)`. Holder ventende WAL-rammer små, så den periodiske TRUNCATE-handling aldrig kopierer et efterslæb på flere GB i hovedtråden. `0` deaktiverer funktionen. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Når en PASSIVE-kørsel registrerer, at WAL-filen overstiger denne størrelse, eskaleres der straks til `wal_checkpoint(TRUNCATE)` i stedet for at vente på den langsomme kørsel. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Angiv `1`/`true`/`yes`/`on` for at afslutte processen, når kritisk ressourcepres har varet i `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, så en supervisor (systemd `Restart=always`, Dockers genstartspolitik) kan starte en ren proces i stedet for at levere 503-svar på ubestemt tid. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min.) | `open-sse/utils/resourcePressure.ts` | Hvor længe det kritiske pres skal vare, før afslutningen til selvgenstart udløses. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(automatisk registrering)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Eksplicit sti (absolut eller relativ til cwd) til `sql-wasm.wasm`, når reserveadapteren `sql.js` WASM bruges. Registreres automatisk via pakkeafhængigheder og mulige layout, når værdien ikke er angivet. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 t.) | `src/lib/db/core.ts` | Tilsidesæt intervallet (ms) for den periodiske `wal_checkpoint(TRUNCATE)`. Automatisk kontrolpunktbehandling formindsker aldrig selve WAL-filen, og en server, der kører i lang tid, lukker aldrig sin database. `0` deaktiverer funktionen. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Det antal dage, som kontrolpunkter, refererede input-/output-/fejlfiler og rækken for et afsluttet (fuldført/mislykket/annulleret/udløbet) Batch API-job beholdes af den automatiske oprydningskørsel før sletning. Træder først i kraft, når `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` er slået til; svarer til OpenAI's egen opbevaringsperiode for output fra Batch API. Påvirker ikke den operatørudløste `DELETE /api/v1/batches/delete-completed`-rute, som tilsigtet forbliver ubetinget (uden aldersfilter). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Når den er `true`, må den automatiske oprydningskørsel slette afsluttede Batch API-job (og deres kontrolpunkter), som er ældre end `OMNIROUTE_BATCH_RETENTION_DAYS`, og rydde BLOB-indholdet i uploadede filer efter deres egen `expires_at`. Deaktiveret som standard: Alle eksisterende installationer beholder disse data nøjagtigt som før, indtil en operatør aktivt tilvælger funktionen. Også et funktionsflag, der kan redigeres i dashboardet — se `docs/reference/FEATURE_FLAGS.md` → Kørselstid. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Indstil til `1` for helt at springe databasens sundhedskontrol over ved opstart. Nyttigt til kortvarige opgaver og integrationstest. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Indstil til `1` for at gennemtvinge databasens sundhedskontrolsløkke, selv når den normalt ville blive sprunget over (f.eks. ved kortvarige opgaver). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Indstil til `1` for at springe opvarmningen af den platformsafhængige runtime over under `npm install`. Nyttigt i CI-installationer eller installationer uden brugergrænseflade, hvor sqlite allerede er bygget. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(automatisk registrering)_ | `src/lib/db/migrationRunner.ts` | Tilsidesæt den mappe, som migreringskørslen scanner. Nyttigt ved levering af bundtede migreringer i specialtilpassede builds. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ikke angivet)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Yderligere migreringsmapper som `namespace=dir`-poster adskilt af platformens stiafgrænser (f.eks. `ee=/opt/app/enterprise/db/migrations`). Filer, der findes dér, registreres som `-`, så en distribution, der leverer sine egne migreringer, aldrig kolliderer med de numeriske pladser fra upstream. En forkert udformet post, et ugyldigt navneområde eller en manglende mappe udløser en fejl ved opstart i stedet for lydløst at springe skemaet over. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Sikkerhedsgrænse for et stort antal afventende migreringer (#3416). Opstarten afbrydes, hvis mere end dette antal migreringer afventer på en eksisterende database (beskytter mod en slettet sporingstabel). Hæv værdien for at gendanne en ældre sikkerhedskopi; indstil til `0` for at deaktivere kontrollen. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Arbejdsmappe til `check:install-upgrade`-udgivelsesporten. Den kræver cirka 12 GB (to installationstræer på ~3 GB plus tarballen), så den må ikke køre på en lille tmpfs — på den selvhostede runner er `/tmp` en RAM-baseret tmpfs på 12 GB, og udgivelsesporten opbrugte pladsen, hvilket afkortede pakken. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(standardværdi i koden)_ | `src/lib/spend/batchWriter.ts` | Tømningsinterval (ms) for den batchbehandlede forbrugs-/omkostningsskriver. Lavere værdier reducerer sammenlægningen af skrivninger; højere værdier reducerer konflikter i databasen. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(standardværdi i koden)_ | `src/lib/spend/batchWriter.ts` | Maksimalt antal bufferlagrede forbrugsposter før en tvungen tømning. Hæv værdien i installationer med høj QPS; sænk den, når begrænset hukommelsesforbrug er vigtigere. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ikke angivet)_ | `open-sse/utils/proxyFetch.ts` | Indstil til `"true"` for at udsende `[ProxyFetch]`-fejlfindingslogge på Vercel-relæstien. Deaktiveret som standard for at undgå at lække oplysninger om routingen. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Indstil til `"true"` eller `"1"` for at inkludere klient-/udgående IP-adresser og kontopræfikset i den detaljerede `[ProxyEgress]`-procesloglinje. Holdes DEAKTIVERET som standard, så procesloggen ikke lækker IP-adresser eller kontopræfikset. | -| `OMNIROUTE_DEBUG` | _(ikke angivet)_ | `bin/cli/commands/quota.mjs` | Indstil til `1` for at udskrive tidsdiagnosticering pr. anmodning (`[omniroute] GET completed in Nms`) fra CLI-kvotekommandoerne til stderr. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automatisk)_ | `scripts/dev/healthcheck.mjs` | Eksplicit sti, som containerens sundhedskontrol undersøger. Når den ikke er angivet, udleder kontrollen stien fra `OMNIROUTE_BASE_PATH`; ved at angive den tilvælges det dybdegående overvågningsslutpunkt igen. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(ikke angivet)_ | `bin/cli/commands/completion.mjs` | Indstil til en vilkårlig ikke-tom værdi for at udsende `[omniroute completion]`-diagnosticering fra cachestierne til CLI-skalfærdiggørelse (læsning/opdatering/skrivning). Deaktiveret som standard — disse caches fejler lydløst, så en manglende eller beskadiget cache aldrig ødelægger tabulatorfuldførelse. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 t.) | `open-sse/services/batchProcessor.ts` | Maksimalt tidsvindue for genforsøg på individuelle batch-elementer (ms). Elementer, der overskrider denne varighed, markeres som mislykkede. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Basisforsinkelse (ms) for eksponentiel backoff ved genforsøg på batch-elementer. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 t.) | `open-sse/services/batchProcessor.ts` | Øvre grænse (ms) for eksponentiel backoff mellem genforsøg på batch-elementer. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Maksimalt antal batches, der behandles samtidigt. Hæv værdien for at øge gennemløbet; hold den lav for at undgå bølger af ratebegrænsninger. | +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Rodmappe til SQLite-databasen, sikkerhedskopier og datafiler. Tilsidesæt den for Docker-diskenheder eller brugerdefinerede stier. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(ikke angivet)_ | `src/lib/dataPaths.ts` | Nødudgang for DATA_DIR-beskyttelsen ved test/evaluering (#10428). Tests og Nodes evaluerings-/udskrivningsprober (`-e`/`--eval`/`-p`/`--print`, inklusive formerne `--eval=`/`--print=`), hvor `DATA_DIR` ikke er angivet, omdirigeres til en midlertidig engangsmappe, så de ikke kan åbne operatørens rigtige database. Angiv den til `1` for igen at tilvælge den rigtige mappe. | +| `OMNIROUTE_BUILD_SHA` | _(ikke angivet)_ | `src/lib/monitoring/buildSha.ts` | Git-SHA for den kørende artefakt. Stemples af `npm run build:release`; kan injiceres i containere, der leveres uden `dist/BUILD_SHA`-markøren. Eksponeres som `system.buildSha` på `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Den ref, som herkomstkontrollen ved pakning af artefakten kontrollerer buildets SHA imod (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(ikke angivet)_ | `scripts/build/buildProvenance.ts` | Angiv den til `1` for at tillade pakning af et build, hvis SHA ikke findes på udgivelseslinjen, og registrere det som en bevidst canary i stedet for at lade kontrollen mislykkes (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(ikke angivet)_ | `scripts/ops/deploy-canary.mjs` | API-nøgle til smoke-proben ved canary-udrulning, sendt som `Authorization: Bearer` til `/v1/chat/completions`. Bruges kun af udrulningsscriptet (#10429), aldrig af serveren. Har ingen relation til `OMNIROUTE_SMOKE_*`-variablerne i CLI-smoke-testværktøjet, der skal tilvælges (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` i `tests/integration/upstream-cli-smoke.int.test.ts`) — se [CLI-integrationer → Ægte smoke-gennemgang](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(ikke angivet)_ | `src/lib/buildPhase.ts` | Signal for buildfasen (#10060): angives til `1` af `scripts/build/build-next-isolated.mjs` og nedarves af hver startet build-worker, så databaselaget returnerer en no-op-stub i stedet for at indlæse den native better-sqlite3-tilføjelse (som afbryder workeren ved afslutning). Angives aldrig for den kørende server. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Angiv den til `1` for at springe prebuild-kontrollen af valgfrie native afhængigheder over for eksotiske, medleverede træer. Dette gør ikke en manglende afhængighed buildbar; brug den kun, når native afhængigheder leveres separat. | +| `OMNIROUTE_DATA_DIR` | _(ikke angivet)_ | `open-sse/executors/promptql/threadSticky.ts` | **Fallback-alias** for `DATA_DIR`, som kun kontrolleres, når `DATA_DIR` ikke er angivet. Bruges til at lokalisere PromptQL-eksekveringens trådklæbrige sessionscache på disken (`/promptql-thread-sessions.json`). Hvis ingen af variablerne er angivet, opbevares cachen kun i hukommelsen (den bevares ikke på tværs af genstarter). | +| `OMNIROUTE_PLUGINS_DIR` | _(ikke angivet)_ | `src/lib/plugins/scanner.ts` | Den mappe, som **runtime-plugin-scanneren** læser — og den rodmappe, som pluginadministratoren installerer i — hvilket tilsidesætter standardværdien, der er afledt af hjemmemappen (#11827). Peg den på det bind-monterede plugin-træ i Docker/K8s i stedet for at flytte HOME blot for at omplacere scanningsstien (HOME styrer også al anden adfærd, der er relativ til hjemmemappen). Ikke angivet = `~/.omniroute/plugins`, eller `/tmp/.omniroute/plugins`, når processen slet ikke eksporterer nogen hjemmemappe — den tavse manglende registrering, som denne variabel afhjælper. Den opløste mappe logges én gang ved opstart som `scanner.dir_resolved` sammen med det input, der blev anvendt. Kun på serversiden: CLI-kommando-plugins beholder deres egen `OMNIROUTE_PLUGIN_PATH` (afsnit 9). | +| `STORAGE_ENCRYPTION_KEY` | _(tom = deaktiveret)_ | `src/lib/db/encryption.ts` | AES-nøgle til fuld kryptering af SQLite-databasen, når den er lagret. Generér med `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Versionsetiket for krypteringsnøglen. Forøg den ved nøglerotation for at understøtte dekryptering af gamle sikkerhedskopier. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Når værdien er `true`, springes rutinemæssige SQLite-filsikkerhedskopieringer og sikkerhedskopieringer før skrivning over (lagring/rydning af models.dev-priser og skrivning af indstillinger). Manuelle sikkerhedskopieringer og sikkerhedskopieringer før gendannelse udføres stadig. Dette deaktiverer **ikke** migreringsværktøjets obligatoriske, varige sikkerhedssnapshot eller beskyttelsen mod massemigrering for en eksisterende permanent database. Ikke-manuelle sikkerhedskopieringer begrænses til højst én gang pr. 60 minutter. **Indstillinger → Lager** i dashboardet kan deaktivere rutinemæssig automatisk sikkerhedskopiering uafhængigt. | +| `OMNIROUTE_CRYPT_KEY` | _(ikke angivet)_ | `src/lib/db/encryption.ts` | **Ældre alias** for `STORAGE_ENCRYPTION_KEY`. Accepteres som reserve, når den primære variabel ikke findes. | +| `OMNIROUTE_API_KEY_BASE64` | _(ikke angivet)_ | `src/lib/db/encryption.ts` | **Ældre alias** (Base64-kodet form), der accepteres som reserve. Afkodes automatisk før brug. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ikke angivet)_ | `src/lib/db/core.ts` | Tilsidesæt intervallet for den periodiske SQLite-sundhedskontrol (ms). Når værdien ikke er angivet, afledes standardværdierne af `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(fjernet)_ | `src/lib/db/walMaintenance.ts` | **Fjernet.** En periodisk aktiv `wal_checkpoint(TRUNCATE)` kan ugyldiggøre den delte wal-index-tilknytning og få processen til at gå ned med SIGBUS (#13973), så planlæggeren findes ikke længere. Variablen er inaktiv: En positiv værdi logger en engangsadvarsel om udfasning, mens `0` eller en ikke-angivet værdi forbliver tavs. WAL'en vedligeholdes af PASSIVE-kontrolpunkter (nedenfor) og trunkeres af kontrolpunktet ved nedlukning. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min.) | `src/lib/db/walMaintenance.ts` | Tilsidesæt intervallet for hyppige `wal_checkpoint(PASSIVE)`-kørsler (ms). Holder antallet af ventende WAL-frames lavt, så kontrolpunkter forbliver hurtige, og WAL-filen forbliver begrænset mellem trunkeringer ved nedlukning. `0` deaktiverer. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Når en PASSIVE-kørsel finder, at WAL-filen overstiger denne størrelse, køres `wal_checkpoint(RESTART)`, så WAL'en starter forfra uden at omskrive det tilknyttede wal-index. Aktive kontrolpunkter i trunkeringstilstand blev fjernet (se rækken `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Indstil til `1`/`true`/`yes`/`on` for at afslutte processen, når kritisk ressourcepres har varet i `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, så en supervisor (systemd `Restart=always`, Dockers genstartspolitik) kan starte en ren proces igen i stedet for at returnere 503-svar på ubestemt tid. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min.) | `open-sse/utils/resourcePressure.ts` | Hvor længe kritisk pres skal vare, før afslutningen til selvgenstart udløses. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(automatisk registrering)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Eksplicit sti (absolut eller relativ til den aktuelle arbejdsmappe) til `sql-wasm.wasm`, når `sql.js`-WASM-reserveadapteren bruges. Registreres automatisk via pakkeafhængigheder og mulige layouts, når værdien ikke er angivet. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Antal dage, som kontrolpunkter, refererede input-/output-/fejlfiler og rækken for et afsluttet (fuldført/mislykket/annulleret/udløbet) Batch API-job beholdes af den automatiske oprydningskørsel før sletning. Træder først i kraft, når `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` aktiveres; svarer til OpenAI's egen opbevaringsperiode for output fra Batch API. Påvirker ikke den operatørudløste rute `DELETE /api/v1/batches/delete-completed`, som efter hensigten forbliver ubetinget (intet aldersfilter). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Når værdien er `true`, kan den automatiske oprydningskørsel slette afsluttede Batch API-job (og deres kontrolpunkter), der er ældre end `OMNIROUTE_BATCH_RETENTION_DAYS`, og rydde BLOB-indholdet i uploadede filer, der har overskredet deres egen `expires_at`. Deaktiveret som standard: Alle eksisterende installationer beholder disse data præcis som før, indtil en operatør aktivt tilvælger funktionen. Dette er også et funktionsflag, der kan redigeres i dashboardet — se `docs/reference/FEATURE_FLAGS.md` → Kørselstid. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Sæt til `1` for helt at springe databasens sundhedstjek over ved opstart. Nyttigt til kortvarige opgaver og integrationstest. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Sæt til `1` for at gennemtvinge løkken for databasens sundhedstjek, selv når den normalt ville blive sprunget over (f.eks. ved kortvarige opgaver). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Sæt til `1` for at springe opvarmningen af det native runtime-miljø over under `npm install`. Nyttigt i CI-installationer eller headless-installationer, hvor sqlite allerede er bygget. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(automatisk registrering)_ | `src/lib/db/migrationRunner.ts` | Tilsidesæt den mappe, som migreringskørslen scanner. Nyttigt, når medfølgende migreringer leveres i tilpassede builds. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ikke angivet)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Yderligere migreringsmapper som `namespace=dir`-poster adskilt af platformens stiadskiller (f.eks. `ee=/opt/app/enterprise/db/migrations`). Filer, der findes dér, registreres som `-`, så en distribution, der leverer sine egne migreringer, aldrig kolliderer med upstreams numeriske pladser. En forkert udformet post, et ugyldigt namespace eller en manglende mappe udløser en fejl ved opstart i stedet for lydløst at springe skemaet over. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Sikkerhedsgrænse for et stort antal afventende migreringer (#3416). Opstarten afbrydes, hvis mere end dette antal migreringer afventer på en eksisterende database (beskytter mod en slettet sporingstabel). Hæv værdien for at gendanne en ældre sikkerhedskopi; sæt den til `0` for at deaktivere kontrollen. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Arbejdsmappe for `check:install-upgrade`-udgivelsesporten. Den kræver cirka 12 GB (to installationstræer på ~3 GB samt tarball-filen), så den må ikke køre på en lille tmpfs — på den selvhostede runner er `/tmp` en 12 GB RAM-baseret tmpfs, og porten opbrugte den, hvilket afkortede pakken. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(standardværdi i koden)_ | `src/lib/spend/batchWriter.ts` | Tømningsinterval (ms) for den batchbehandlede skrivefunktion til forbrug/omkostninger. Lavere værdier reducerer sammenlægningen af skrivninger; højere værdier reducerer konflikter i databasen. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(standardværdi i koden)_ | `src/lib/spend/batchWriter.ts` | Maksimalt antal bufferlagrede forbrugsposter før en tvungen tømning. Hæv værdien ved installationer med høj QPS; sænk den, når begrænset hukommelsesforbrug er vigtigere. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ikke angivet)_ | `open-sse/utils/proxyFetch.ts` | Sæt til `"true"` for at generere `[ProxyFetch]`-fejlfindingslogfiler på Vercel-relæstien. Deaktiveret som standard for at undgå at lække routingoplysninger. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Sæt til `"true"` eller `"1"` for at inkludere klient-/udgående IP-adresser og kontopræfikset i den detaljerede `[ProxyEgress]`-procesloglinje. Holdes DEAKTIVERET som standard, så procesloggen ikke lækker IP-adresser eller kontopræfikset. | +| `OMNIROUTE_DEBUG` | _(ikke angivet)_ | `bin/cli/commands/quota.mjs` | Sæt til `1` for at udskrive tidsdiagnostik pr. anmodning (`[omniroute] GET completed in Nms`) fra CLI-kvotekommandoerne til stderr. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automatisk)_ | `scripts/dev/healthcheck.mjs` | Eksplicit sti, der kontrolleres af containerens sundhedstjek. Når den ikke er angivet, udleder kontrollen den fra `OMNIROUTE_BASE_PATH`; ved at angive den tilvælges det dybdegående overvågningsslutpunkt igen. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(ikke angivet)_ | `bin/cli/commands/completion.mjs` | Sæt til en vilkårlig ikke-tom værdi for at generere `[omniroute completion]`-diagnostik fra cachestierne til CLI-shellfuldførelse (læsning/opdatering/skrivning). Deaktiveret som standard — disse cacher fejler lydløst, så en manglende eller beskadiget cache aldrig ødelægger tabulatorfuldførelse. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 t.) | `open-sse/services/batchProcessor.ts` | Maksimalt vindue for nye forsøg på individuelle batchposter (ms). Poster, der overskrider denne varighed, markeres som mislykkede. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Basisforsinkelse (ms) for eksponentiel backoff ved genforsøg på batch-elementer. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 t.) | `open-sse/services/batchProcessor.ts` | Maksimum (ms) for eksponentiel backoff mellem genforsøg på batch-elementer. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Maksimalt antal batches, der behandles samtidigt. Hæv værdien for at øge kapaciteten; hold den lav for at undgå en bølge af hastighedsbegrænsninger. | > [!IMPORTANT] -> Før en eksisterende persistent database ændres, udgiver migreringsprogrammet et komplet, +> Før en eksisterende persistent database ændres, udgiver migreringskørslen et komplet, > indholdsadresseret snapshot under `DATA_DIR/db_backups/`. Udgivelsen kræver et filsystem, -> der understøtter hårde links på samme filsystem uden overskrivning samt varig filsynkronisering. POSIX-værter kræver også -> mappesynkronisering; på Windows kan Node afvise mappehandles, så OmniRoute flusher den -> udgivne fil og behandler synkronisering af mappeposter efter bedste evne. -> Hvis den monterede `DATA_DIR` ikke kan stille disse garantier, afbrydes opstarten sikkert, før -> en migrering anvendes. Flyt `DATA_DIR` til en diskenhed med disse funktioner; brug ikke +> der understøtter hårde links på samme filsystem uden overskrivning samt holdbar filsynkronisering. POSIX-værter kræver også +> mappesynkronisering; på Windows kan Node afvise mappehandles, så OmniRoute tømmer bufferen for den +> udgivne fil og behandler synkronisering af mappeposter som en bedste indsats. +> Hvis den monterede `DATA_DIR` ikke kan levere disse garantier, afbrydes opstarten sikkert, før +> en migrering anvendes. Flyt `DATA_DIR` til en diskenhed med disse primitiver; brug ikke > `DISABLE_SQLITE_AUTO_BACKUP` til at omgå migreringssikkerheden. ### Scenarier -| Scenarie | Konfiguration | -| --------------------- | ------------------------------------------------------------------------------------------------ | -| **Lokal udvikling** | Behold alle standardværdier. Databasen findes i `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + montér en diskenhed på `/data`. | -| **Krypteret lagring** | Indstil `STORAGE_ENCRYPTION_KEY` + opbevar sikkerhedskopier af nøglen! Tab af den = tab af data. | -| **CI/test** | `DATA_DIR=/tmp/omniroute-test` — midlertidig, ingen kryptering nødvendig. | +| Scenarie | Konfiguration | +| ------------------------- | ----------------------------------------------------------------------------------------------------- | +| **Lokal udvikling** | Behold alle standardværdier. Databasen ligger i `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + montér en diskenhed på `/data`. | +| **Krypteret ved lagring** | Angiv `STORAGE_ENCRYPTION_KEY` + behold sikkerhedskopier af nøglen! Mister du den, mister du dataene. | +| **CI/test** | `DATA_DIR=/tmp/omniroute-test` — midlertidig, ingen kryptering nødvendig. | --- @@ -213,37 +212,38 @@ OmniRoute bruger **SQLite** (via `better-sqlite3`) til al persistens. Disse vari ## 4. Sikkerhed og godkendelse -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt, der kombineres med hardwareidentifikatorer for at danne et maskinfingeraftryk. Skift den for hver installation for at sikre isolation. | -| `OMNIROUTE_CLI_SALT` | _(ikke angivet = tilfældig salt pr. installation, gemt i `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-salt til afledning af det lokale CLI-godkendelsestoken. Angivelse af denne værdi roterer alle CLI-tokens på maskinen og har altid prioritet over den gemte salt. Se `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Angiver flaget `Secure` på sessionscookies. **Skal være `true`**, når systemet kører bag HTTPS. | -| `REQUIRE_API_KEY` | `false` | API-middleware | Når værdien er `true`, skal alle proxyanmodninger til `/v1/*` indeholde en gyldig API-nøgle. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Tillader visning af komplette API-nøgleværdier i Dashboard-brugergrænsefladen. Kan konfigureres via Dashboard Feature Flags; udgør en sikkerhedsrisiko på delte instanser. | -| `NO_LOG_API_KEY_IDS` | _(tom)_ | `src/lib/compliance/index.ts` | Kommaseparerede API-nøgle-id'er, som omgår logning af anmodninger (overholdelse af GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(ikke angivet = ubegrænset)_ | `src/shared/utils/apiKeyPolicy.ts` | Standardbudget for anmodninger pr. dag, der anvendes på API-nøgler, hvis kolonne `rate_limits` er null. Ikke angivet eller tom: ingen implicit grænse (#2289, #11017). `0` er det samme (ubegrænset). Et positivt heltal N aktiverer N/dag, 5N/uge, 20N/måned. Ugyldige ikke-tomme værdier falder tilbage til de ældre grænser på 1000/dag, 5000/uge og 20000/måned. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Maksimal tilladt størrelse på anmodningens body. Afviser payloads, der overskrider denne grænse. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Faktiske anmodningsbodies på eller over denne tærskel optager den atomiske, procestunge adgangsreservation, der er lokal for processen, før JSON-parsing (BYTE-stien, inklusive `POST /v1/responses`). Samme [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437)-undtagelse ved tilstrækkeligt råderum som for strukturtunge anmodninger; stadig begrænset af `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), så [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ikke vender tilbage. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Absolut grænse for chatruter, der håndhæves ud fra antallet af bytes læst under begrænset indlæsning, herunder anmodninger med manglende, ugyldig eller misvisende `Content-Length`; overskridelser modtager `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(ikke angivet — ingen grænse for antal anmodninger)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** Denne ældre grænse for ANTAL anmodninger gælder nu kun, når den er angivet eksplicit. Hvis den ikke er angivet (standarden), styres adgang for ressourcekrævende chat i stedet af `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — et automatisk afledt BYTE-budget, der dimensioneres ud fra processens reelle hukommelsesgrænse i **én proces** (én V8-heap). To overlappende `/v1/responses` med ~750.000 tokens får heaps på ~12 GiB til at afbryde (#7849) — en advarsel om **hukommelsesbudgettet**, ikke en fast produktgrænse på 2. En sund proces (heap under afvisningsforholdet) KAN tillade flere samtidige lange `/v1/responses` via `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Dusinvis af lange SSE-klienter (40–50) afhænger af heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ikke »maks. 2«. En blind forhøjelse af denne for at »bruge værten« genindfører #7849. Multiplicér **heaps** med **N uafhængige `DATA_DIR`-mapper** (#11024); brug aldrig `replicas>1` med én SQLite-fil. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automatisk afledt)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** Tilsidesættelse af det automatisk afledte bytebudget for indlæsning (25 % af den laveste V8-/cgroup-hukommelsesgrænse divideret med 8x midlertidig forstærkning). Afledte og eksplicitte værdier begrænses til 8 MiB–2 GiB. En body, der er større end det effektive budget, fejler straks med `413 body_exceeds_budget`; konkurrence mellem bodies, der hver især kan behandles, forbliver genforsøgbar med `503`. 40–50 samtidige lange SSE-klienter afhænger af dette budget + heap, ikke en fast grænse på »maks. 2«. Kontrollér `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` på `/api/monitoring/health` før justering. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Afvisningsforhold for heaptryk (`heapUsed / heap_size_limit`) ved BYTE- og STRUCTURE-adgang for ressourcekrævende anmodninger (#10183, #10268, #10437). En samtidig ressourcekrævende anmodning ud over `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` afvises kun med den genforsøgbare `503`, når heapen OGSÅ er på eller over dette forhold; på en sund heap tillades den i stedet via ekstra kapacitet for en sund heap. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (standard `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Begrænset ekstra kapacitet til den hurtige sti for en sund heap (#10437) for **både** STRUCTURE og BYTE (`admitChatRequest`, inklusive bodies ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Uden denne grænse omgår enhver anmodning med en travl, men sund heap adgangskontrollen uden noget loft. Når så mange samtidige leases er aktive via stien for en sund heap, fortsætter yderligere anmodninger under belastning til den SAMME sti med begrænset ventetid/afvisning, som bruges under reelt heaptryk. `0` deaktiverer omgåelsen helt. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Antal beskeder, der klassificerer en chatanmodning som ressourcekrævende, selv når dens body er under bytegrænsen. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Antal værktøjer, der klassificerer en chatanmodning som ressourcekrævende, selv når dens body er under bytegrænsen. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservativt tokenestimat baseret på strengstørrelse, der klassificerer en anmodning som ressourcekrævende; dette er en indikator for adgangsomkostningen, ikke udbyderens tokenisering til fakturering. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (deaktiveret) | `src/shared/middleware/chatBodyAdmission.ts` | Valgfrit loft for chathistorik, der aktivt kan tilvælges. Deaktiveret som standard: Et antal beskeder er implementeringspolitik, ikke en universel egenskab ved en anmodning, og et loft her afviser samtaler med en endelig `413`, før komprimeringspipelinen kan gøre dem mulige at behandle. Heapvækst begrænses af `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` og afvisningen ved heaptryk. Angiv en positiv værdi i hukommelsesbegrænsede installationer, der har brug for et fast loft; overskridelse modtager derefter en struktureret `413`, der kræver komprimering. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Fast loft for en ikke-streamet upstream-respons, der bufferlagres fuldt ud i hukommelsen. Over denne grænse annulleres upstream-læseren, og anmodningen fejler hurtigt i stedet for at lade en ubegrænset streng vokse, indtil heapen er opbrugt. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maksimalt antal wire-bytes, der videresendes fra upstream-responsheadere. Når budgettet overskrides, fjernes headere med lavere prioritet (f.eks. brugerdefinerede `x-codex-*`, `x-oai-request-id`) for at holde sig inden for almindelige reverse proxy-grænser for headere. Angiv en højere værdi for at videresende flere upstream-metadata på bekostning af en større responsheaderstørrelse. | -| `CORS_ORIGIN` | _(ikke angivet)_ | `src/server/cors/origins.ts` | Ældre CORS-tilladelsesliste med én oprindelse. Foretræk `CORS_ALLOWED_ORIGINS` til nye installationer. CORS er kun beregnet til browserbaserede API-klienter på tværs af oprindelser; godkendte skrivehandlinger i kontrolpanelet bruger i stedet anmodninger fra samme oprindelse samt sessionsbundet CSRF-beskyttelse. | -| `CORS_ALLOWED_ORIGINS` | _(ikke angivet)_ | `src/server/cors/origins.ts` | Kommasepareret CORS-tilladelsesliste. Der sendes ikke et jokertegn, medmindre `CORS_ALLOW_ALL=true` er eksplicit konfigureret. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Nødudgang kun til udvikling, som returnerer enhver browser-`Origin`. Aktivér ikke denne i delte installationer eller produktionsinstallationer. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Bloker udbyderkald, der er rettet mod private IP-intervaller, loopback-intervaller eller link-local-intervaller. Deaktivér kun i isolerede testmiljøer. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Tillad udbyder-URL'er, der peger på private/lokale netværk (localhost, 192.168.x.x, 10.x.x.x osv.). **PÅKRÆVET for selvhostede udbydere** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Når værdien er `false`, afviser kontrolpanelet validering af lokale URL'er. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Tillad tilføjelse/validering af udbydere på lokale/private adresser (127.0.0.1, localhost, LAN, private intervaller) — begrænset til udbydervalideringsstien. **Standardværdien er `true`** (lokal først); angiv `false` for at håndhæve streng blokering, der kun tillader offentlige adresser. Cloudmetadata-slutpunkter (169.254.169.254, metadata.google.internal) forbliver blokeret uanset indstillingen. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Lad `/v1/audio/*`-ruterne (transskriptioner, tale, oversættelser) bruge en OpenAI-kompatibel udbydernode, der hostes uden for localhost. Deaktiveret som standard — routing af lyd til en fjernvært ændrer identiteten for udgående trafik og skal være en eksplicit operatørbeslutning. Loopback/private noder (localhost, 127.0.0.1, 172.16-31.x) er altid tilladt og påvirkes ikke. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Når OIDC er aktiveret, deaktiveres login med adgangskode, så brugere kun kan godkende sig via OIDC Single Sign-On. Det korte alias `OIDC_DISABLE_PASSWORD_LOGIN` accepteres også; kontrolpanelets funktionsflag med samme nøgle har forrang. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kort alias for `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt, der kombineres med hardwareidentifikatorer til maskinfingeraftryk. Skift den for hver installation for at sikre isolation. | +| `OMNIROUTE_CLI_SALT` | _(ikke angivet = tilfældigt salt pr. installation, som gemmes i `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-salt til afledning af det lokale CLI-godkendelsestoken. Hvis denne værdi angives, roteres alle CLI-tokens på maskinen, og værdien har altid forrang for det gemte salt. Se `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Angiver flaget `Secure` på sessionscookies. **Skal være `true`**, når der køres bag HTTPS. | +| `REQUIRE_API_KEY` | `false` | API-middleware | Når værdien er `true`, skal alle proxyanmodninger til `/v1/*` indeholde en gyldig API-nøgle. **Dette flag beskytter ikke `GET /v1/models`**, som i stedet følger dashboardets loginindstilling (`requireAuthForModels`) — derfor betyder et `401`-svar fra `/v1/models` IKKE, at inferens er beskyttet. Se `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Tillader visning af komplette API-nøgleværdier i dashboardets brugergrænseflade. Kan konfigureres via dashboardets funktionsflag; udgør en sikkerhedsrisiko på delte instanser. | +| `NO_LOG_API_KEY_IDS` | _(tom)_ | `src/lib/compliance/index.ts` | Kommaseparerede API-nøgle-id'er, som ikke omfattes af logning af anmodninger (overholdelse af GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(ikke angivet = ubegrænset)_ | `src/shared/utils/apiKeyPolicy.ts` | Reservebudget for anmodninger pr. dag, der anvendes på API-nøgler, hvis kolonne `rate_limits` er null. Ikke angivet eller tom: ingen implicit grænse (#2289, #11017). `0` betyder det samme (ubegrænset). Et positivt heltal N aktiverer N/dag, 5N/uge og 20N/måned. Ugyldige ikke-tomme værdier falder tilbage til de ældre grænser på 1000/dag, 5000/uge og 20000/måned. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Maksimal tilladt størrelse på anmodningens brødtekst. Afviser nyttelaster, der overskrider denne grænse. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Faktiske anmodningsbrødtekster på eller over denne tærskel optager den atomiske, proceslokale adgangslås for tunge anmodninger før JSON-fortolkning (BYTE-stien, inklusive `POST /v1/responses`). Samme [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437)-undtagelse ved tilstrækkelig ledig kapacitet som for strukturtunge anmodninger; stadig begrænset af `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), så [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ikke vender tilbage. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Hård grænse for chatruter, som håndhæves på baggrund af bytes læst under begrænset indlæsning, herunder forespørgsler med manglende, ugyldig eller misvisende `Content-Length`; overskridelse medfører `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(ikke angivet — ingen grænse for antal forespørgsler)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** Denne ældre grænse for ANTAL forespørgsler er nu kun gældende, når den angives eksplicit. Når den ikke er angivet (standardindstillingen), styres adgang for tunge chatforespørgsler i stedet af `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — et automatisk afledt BYTE-budget, som dimensioneres ud fra processens reelle hukommelsesgrænse i **én proces** (én V8-heap). To overlappende `/v1/responses` med ~750.000 tokens får heaps på ~12 Gi til at afbryde (#7849) — en advarsel om **hukommelsesbudgettet**, ikke en fast produktgrænse på 2. En sund proces (heap under aflastningsforholdet) KAN tillade flere samtidige, lange `/v1/responses` via `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Titusindvis af lange SSE-klienter (40–50) afhænger af heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ikke »maks. 2«. Hvis denne værdi hæves blindt for at »udnytte værten«, genintroduceres #7849. Multiplicer **heaps** med **N uafhængige `DATA_DIR`-mapper** (#11024); brug aldrig `replicas>1` på én SQLite-fil. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automatisk afledt)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** Tilsidesættelse af det automatisk afledte bytebudget for indlæsning (25 % af den laveste V8-/cgroup-hukommelsesgrænse divideret med 8x midlertidig forstærkning). Afledte og eksplicitte værdier begrænses til 8 MiB–2 GiB. En body, der er større end det effektive budget, afvises straks med `413 body_exceeds_budget`; konkurrence mellem bodies, der hver især kan behandles, forbliver en `503`, som kan forsøges igen. 40–50 samtidige, langvarige SSE-klienter afhænger af dette budget + heap, ikke en fast grænse på »maks. 2«. Se `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` på `/api/monitoring/health` før justering. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Aflastningsforhold ved heappres (`heapUsed / heap_size_limit`) for adgang til tunge forespørgsler af typen BYTE og STRUCTURE (#10183, #10268, #10437). En samtidig tung forespørgsel ud over `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` afvises kun med en `503`, der kan forsøges igen, når heapen OGSÅ er på eller over dette forhold; på en sund heap tillades den i stedet via sund ekstrakapacitet. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (standard `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Begrænset ekstrakapacitet til den hurtige sti ved en sund heap (#10437) for **både** STRUCTURE og BYTE (`admitChatRequest`, inklusive bodies ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Uden denne grænse ville enhver forespørgsel med en travl, men sund heap omgå adgangskontrollen uden nogen øvre grænse. Når så mange samtidige leases er aktive via stien for en sund heap, fortsætter yderligere forespørgsler under belastning til den SAMME begrænsede vente-/aflastningssti, som bruges under reelt heappres. `0` deaktiverer omgåelsen helt. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Det antal beskeder, der klassificerer en chatforespørgsel som tung, selv når dens body ligger under bytegrænsen. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Det antal værktøjer, der klassificerer en chatforespørgsel som tung, selv når dens body ligger under bytegrænsen. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservativt tokenestimat baseret på strengstørrelse, som klassificerer en forespørgsel som tung; dette er en proxy for adgangsomkostninger, ikke udbyderens tokenisering til fakturering. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (deaktiveret) | `src/shared/middleware/chatBodyAdmission.ts` | Valgfri, eksplicit aktiveret grænse for chathistorik. Deaktiveret som standard: Et antal beskeder er en implementeringspolitik, ikke en universel egenskab ved en forespørgsel, og en grænse her afviser samtaler med en endelig `413`, før komprimeringspipelinen kan gøre dem håndterbare. Heapvækst begrænses af `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` og aflastning ved heappres. Angiv en positiv værdi i implementeringer med begrænset hukommelse, som kræver en fast øvre grænse; overskridelse medfører derefter en struktureret `413`, der angiver, at komprimering er påkrævet. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Hård grænse for et ikke-streamet upstream-svar, der bufferlagres fuldt ud i hukommelsen. Ved overskridelse annulleres upstream-læseren, og forespørgslen fejler hurtigt i stedet for at lade en ubegrænset streng vokse, indtil heapen er opbrugt. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maksimalt antal wire-bytes, der videresendes fra upstream-svarheadere. Når budgettet overskrides, fjernes headere med lavere prioritet (f.eks. brugerdefinerede `x-codex-*`, `x-oai-request-id`) for at holde sig inden for almindelige reverse proxy-grænser for headere. Angiv en højere værdi for at videresende flere upstream-metadata på bekostning af større svarheadere. | +| `CORS_ORIGIN` | _(ikke angivet)_ | `src/server/cors/origins.ts` | Ældre CORS-tilladelsesliste for én origin. Foretræk `CORS_ALLOWED_ORIGINS` til nye installationer. CORS er kun beregnet til browserbaserede API-klienter på tværs af origins; godkendte skrivehandlinger i kontrolpanelet bruger i stedet forespørgsler fra samme origin samt sessionsbundet CSRF-beskyttelse. | +| `CORS_ALLOWED_ORIGINS` | _(ikke angivet)_ | `src/server/cors/origins.ts` | Kommasepareret CORS-tilladelsesliste. Der sendes intet jokertegn, medmindre `CORS_ALLOW_ALL=true` er eksplicit konfigureret. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Nødudvej, der kun er beregnet til udvikling, og som gengiver enhver browser-`Origin`. Aktivér den ikke i delte installationer eller produktionsinstallationer. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Bloker udbyderkald, der er rettet mod private IP-intervaller, loopback-intervaller eller link-local-intervaller. Deaktivér kun i isolerede testmiljøer. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Tillad udbyder-URL'er, der peger på private/lokale netværk (localhost, 192.168.x.x, 10.x.x.x osv.). **PÅKRÆVET for selvhostede udbydere** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Når værdien er `false`, afviser kontrolpanelet validering af lokale URL'er. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Tillad tilføjelse/validering af udbydere på lokale/private adresser (127.0.0.1, localhost, LAN, private intervaller) — begrænset til valideringsstien for udbydere. **Standardværdien er `true`** (lokalt først); angiv `false` for at håndhæve streng blokering, så kun offentlige adresser tillades. Cloud-metadataendpoints (169.254.169.254, metadata.google.internal) forbliver blokeret uanset indstillingen. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Lad `/v1/audio/*`-ruterne (transskriptioner, tale, oversættelser) bruge en OpenAI-kompatibel udbydernode, der hostes uden for localhost. Deaktiveret som standard — routing af lyd til en ekstern vært ændrer udgående identitet og skal være en eksplicit operatørbeslutning. Loopback-/private noder (localhost, 127.0.0.1, 172.16-31.x) er altid tilladt og påvirkes ikke. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Lad `POST /v1/rerank` (og loopback-trinnet til omrangering i hukommelsesmotoren) bruge en OpenAI-kompatibel udbydernode, der hostes uden for localhost — en LAN-maskine eller Tailscale-peer, som kører TEI, Infinity, vLLM osv. Deaktiveret som standard — routing til en ekstern vært ændrer udgående identitet og skal være en eksplicit operatørbeslutning. Loopback-noder (localhost, 127.0.0.1, 172.16-31.x) er altid tilladt og påvirkes ikke. Eksterne noder skal også overholde politikken for udbyderes udgående URL'er (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); der routes aldrig til cloud-metadatahosts. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Når OIDC er aktiveret, deaktiveres adgangskodelogin, så brugere kun kan godkende sig via OIDC Single Sign-On. Det korte alias `OIDC_DISABLE_PASSWORD_LOGIN` accepteres også; kontrolpanelets funktionsflag med samme nøgle har forrang. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kort alias for `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### Tjekliste til sikkerhedshærdning @@ -299,61 +299,68 @@ OmniRoute leverer et forsvar i to lag: scanning efter injektioner på anmodnings --- -## 6. Værktøjs- og routingpolitikker - -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Styrer LLM-adgang til værktøjs-/funktionskald. `allowlist` = kun angivne værktøjer, `denylist` = alle undtagen angivne værktøjer, `disabled` = ingen begrænsninger. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Sti til JSON-filen med regler for manipulering af payloads (upstream-justeringer pr. model/protokol). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Genindlæsningsinterval (ms) for automatisk genindlæsning af filen med payloadregler. Minimum `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Tilvalg: Route nøgne `claude-*`-model-id'er fra Claude Code-klienter via Claude Code OAuth-kontoen i stedet for at kræve et udbyderpræfiks. Eksplicitte udbyderpræfikser har stadig forrang. Kan også konfigureres via en kontakt på Claude-udbydersiden i dashboardet. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Samtidighedsgrænse pr. model for round-robin-kombinationer (#9100). Semaforen for round-robin-kombinationer havde en fast grænse på 3 samtidige anmodninger pr. model uden mulighed for tilsidesættelse, hvilket serialiserede trafik med højere samtidighed bag denne grænse. Valideres til `>= 1` og begrænses til `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Farligt tilvalg, der springer OmniRoutes lokale kontrol af kontekstvindue/maksimalt antal inputtokens over for direkte anmodninger til en enkelt model. Upstream-udbydere håndhæver stadig deres faktiske grænser; promptkomprimering og modellens egen grænse for outputtokens forbliver aktive. Den gældende prioritet er tilsidesættelse i Feature Flags-databasen > miljøvariabel > standardværdi; genstart er ikke nødvendig. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(ikke angivet)_ | `open-sse/services/conversationTracker.ts` | Angiv `1` for at stoppe indsamlingen af samtalehistorik. `resolveConversationId()` returnerer et ikke-sporet resultat, før den læser SQLite eller analyserer beskedhistorikken, og session-id'er leveret af klienten er også omfattet. Håndteringen af routingsessioner er uændret, og eksisterende poster slettes ikke. Beregnet til installationer, der ikke bruger dashboardets samtalevisning, og som ønsker at forhindre, at turtabellen fortsætter med at vokse. | +## 6. Politikker for værktøjer og routing + +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Styrer LLM-adgang til værktøjs-/funktionskald. `allowlist` = kun angivne værktøjer, `denylist` = alle undtagen de angivne, `disabled` = ingen begrænsninger. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Sti til JSON-filen med regler for manipulation af nyttelasten (upstream-justeringer pr. model/protokol). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Genindlæsningsinterval (ms) for dynamisk genindlæsning af filen med nyttelastregler. Minimum `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Tilvalg: Rout bare `claude-*`-model-id'er fra Claude Code-klienter gennem Claude Code OAuth-kontoen i stedet for at kræve et udbyderpræfiks. Eksplicitte udbyderpræfikser har stadig forrang. Kan også konfigureres via en kontakt på dashboardsiden for Claude-udbyderen. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Samtidighedsgrænse pr. model for round-robin-kombinationer (#9100). Semaforen for round-robin-kombinationer var fast begrænset til 3 samtidige anmodninger pr. model uden mulighed for tilsidesættelse, hvilket serialiserede trafik med højere samtidighed bag denne grænse. Valideres til `>= 1` og begrænses til `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Farligt tilvalg, der springer OmniRoutes lokale kontrol af kontekstvindue/maksimalt antal inputtokens over for direkte anmodninger til en enkelt model. Upstream-udbydere håndhæver stadig deres faktiske grænser; promptkomprimering og modellens egen grænse for outputtokens forbliver aktive. Den gældende præcedens er tilsidesættelse via Feature Flags-databasen > miljøvariabel > standardværdi; genstart er ikke nødvendig. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(ikke angivet)_ | `open-sse/services/selfHostedEntry.ts` | Indlejret YAML-`providers:`-dokument (RIC-738, D4). Når det er angivet (med eller uden en `strategy:`-blok), omdirigeres `/v1/chat/completions` til det selvhostede, samlede OpenAI-kompatible indgangspunkt i stedet for cloud-pipelinen. Ikke angivet (standardværdien): Ruten fortsætter direkte til den eksisterende cloud-pipeline. Se `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(ikke angivet)_ | `open-sse/services/selfHostedEntry.ts` | Sti til en YAML-fil, der indeholder det samme `providers:`-dokument som `OMNIROUTE_SELF_HOSTED_PROVIDERS`, til installationer, der foretrækker en fil frem for en indlejret miljøvariabel. Begge muligheder aktiverer det selvhostede indgangspunkt. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(ikke angivet — åben rute)_ | `open-sse/services/selfHostedEntry.ts` | Valgfri delt API-nøgle til det samlede selvhostede indgangspunkt (D5-skelet, reserveret til kvotesystemet pr. nøgle). Når den er angivet, skal anmodninger indeholde `Authorization: Bearer `. Ikke angivet: Ruten er åben, hvilket svarer til det eksisterende mønster for selvhostede lokale udbydere (installation på loopback-/betroet netværk). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(ikke angivet)_ | `open-sse/services/routingStrategies.ts` | Indlejret YAML-`strategy:`-dokument til den deterministiske routingmotor (M2/RIC-740, D3) — sortliste/hvidliste, cooldown-afbryder, omkostningsprioritet, latensbevidst routing, fallback-kæde. Tilsidesætter pr. nøgle en indlejret `strategy:`-blok, der er indlejret i `OMNIROUTE_SELF_HOSTED_PROVIDERS`. Se `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(ikke angivet)_ | `open-sse/services/routingStrategies.ts` | Sti til en YAML-fil, der indeholder det samme `strategy:`-dokument som `OMNIROUTE_SELF_HOSTED_STRATEGY`, til installationer, der foretrækker en fil frem for en indlejret miljøvariabel. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(ikke angivet)_ | `open-sse/services/conversationTracker.ts` | Angiv `1` for at stoppe indsamlingen af samtalehistorik. `resolveConversationId()` returnerer et ikke-sporet resultat, før funktionen læser SQLite eller fortolker meddelelseshistorikken, og sessions-id'er leveret af klienten er også omfattet. Håndteringen af routingsessioner er uændret, og eksisterende poster slettes ikke. Til installationer, der ikke bruger dashboardets samtalevisning, og hvor man ønsker at forhindre, at tabellen over samtaletråde fortsætter med at vokse. | --- ## 7. URL'er og cloudsynkronisering -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Serverside-URL, som interne synkroniseringsjob bruger til at kalde `/api/sync/cloud`. Behold denne som en loopback-/container-URL, selv når appen er offentligt tilgængelig via en proxy. | -| `CLOUD_URL` | _(tom)_ | `src/lib/cloudSync.ts` | URL til cloud-relæets slutpunkt (premiumfunktion). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | HTTP-timeout for cloud-synkroniseringsanmodninger. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack-buildkonfiguration | Profil ved build (angiv `minimal` for fysisk at udelukke privilegerede moduler fra bundtet). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ selvstændigt output_ | `scripts/build/colocate-standalone.mjs` | Tilsidesættelse ved build af den selvstændige outputmappe, som bruges af samlokaliseringstrinnet efter build. Dette er ikke en runtime-indstilling. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(tom)_ | `src/lib/cloudSync.ts` | Delt hemmelighed, der bruges til at verificere HMAC-SHA256-signaturen i Cloud Sync-svar. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Angiv `true` for at tillade, at Cloud Sync-slutpunktet overskriver lokale legitimationsoplysninger. Standardværdien er `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Angiv `true` for at afvise et usigneret Cloud Sync-svar, når der ikke er konfigureret en lokal hemmelighed (#13679). En eksisterende signatur verificeres altid — og afvises altid, når `OMNIROUTE_CLOUD_SYNC_SECRET` ikke er angivet — uanset dette flag. Standardværdien ændres til håndhævet i v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Angiv `true` for at falde tilbage til v3.8.5's ettrinsadfærd, hvor "alt importeres", uden brugerbekræftelse. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, synkronisering | Offentligt tilgængelig URL til OAuth-redirect_uri, Dashboard-links og genererede offentlige URL'er. Angiv denne som den stabile offentlige URL, når OAuth-callbacks eller genererede browserlinks skal bruge en kanonisk reverse proxy-vært. | -| `NEXT_PUBLIC_CLOUD_URL` | _(tom)_ | Klientside | Klientsidespejling af `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(ikke angivet)_ | `src/shared/services/cloudSyncScheduler.ts` | Ældre reserveværdi for `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(ikke angivet)_ | Offentlig origin-resolver, billed-URL'er | Den højest prioriterede browserrettede OmniRoute-origin, der bruges til generering af offentlige URL'er og validering af browser-origin uden for Dashboard. Angiv denne, når OpenWebUI eller et andet relæ tilgår OmniRoute via en intern URL, men brugerens browser skal hente genererede medier fra en LAN-, tunnel- eller offentlig origin. Medtag **ikke** `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(ikke angivet)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absolut URL til provider-pluginmanifestet, der annonceres til sidecar-klienter. Når den ikke er angivet, afleder OmniRoute `/api/v1/provider-plugin-manifest` fra anmodningens origin eller HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokol, der bruges, når URL'en til provider-pluginmanifestet afledes fra HOST/PORT uden en anmodnings-origin. Angiv `https` bag en offentlig proxy, der terminerer TLS, når der ikke er angivet en eksplicit `OMNIROUTE_PROVIDER_MANIFEST_URL`. | -| `OMNIROUTE_TRUST_PROXY` | _(ikke angivet)_ | `src/server/origin/publicOrigin.ts` | Valgfri tillidstilstand for videresendte offentlige origin-headere. Ikke angivet = stol ikke på `Forwarded` / `X-Forwarded-*` ved sikkerhedsbeslutninger. `true` / `loopback` stoler kun på videresendt vært/protokol fra en tokenstemplet loopback-proxy. `private` / `lan` stoler også på proxy-peers på private LAN-netværk. Foretræk eksplicit `NEXT_PUBLIC_BASE_URL` i produktion. | -| `KIE_CALLBACK_URL` | _(ikke angivet)_ | `open-sse/utils/kieTask.ts` | Offentlig callback-URL til asynkrone kie.ai-job. Tilsidesættelse med højeste prioritet før `OMNIROUTE_KIE_CALLBACK_URL` og `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(ikke angivet)_ | `open-sse/utils/kieTask.ts` | Alternativ stavemåde for `KIE_CALLBACK_URL`. Bruges som reserve, når den primære variabel ikke er angivet. | -| `OMNIROUTE_PUBLIC_URL` | _(ikke angivet)_ | `open-sse/utils/kieTask.ts` | Offentlig origin, der bruges til at sammensætte asynkrone callback-URL'er. Reserveværdi med laveste prioritet for kie.ai-callbacks; bruges også som en generisk offentlig URL til andre relæer. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Slutpunkt til opslag af CrofAI-kvote, som bruges af siden Forbrug. Tilsidesæt for relæer/test-fixtures. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Officielt OpenCode Go-forbrugsslutpunkt med API-nøglegodkendelse, som bruges af siden Forbrug. Tilsidesæt for relæer/test-fixtures. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Generér OpenCode CLI-identitetsheadere (User-Agent, x-opencode-client/project samt UUID'er for anmodning/session) ved opencode-go/zen-upstreamanmodninger, hvor klienten ikke sendte dem, så Cloudflare accepterer dem ved udgående VPS-trafik (#6210/#5997). Aktiveret som standard siden #10571; fravælg med `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Standard-User-Agent, der bruges, når `OPENCODE_SYNTHESIZE_CLI_HEADERS` er aktiveret, og der ikke er angivet en providerspecifik `_USER_AGENT`-tilsidesættelse. Anvendes kun på opencode-executors. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Værdi for den genererede `x-opencode-client`-header, når `OPENCODE_SYNTHESIZE_CLI_HEADERS` er aktiveret. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Værdi for den genererede `x-opencode-project`-header, når `OPENCODE_SYNTHESIZE_CLI_HEADERS` er aktiveret. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL til Ollama Cloud-indstillinger, der bruges til scraping af kvoter. Tilsidesæt for relæer/test-fixtures. | -| `OLLAMA_USAGE_COOKIE` | _(ikke angivet)_ | `open-sse/services/usage.ts` | Ollama Cloud-`__Secure-session`-cookie, der bruges til scraping af kvoter fra indstillingssiden. Følsom; foretræk feltet pr. forbindelse i Dashboard, når flere konti er konfigureret. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(ikke angivet)_ | `open-sse/services/usage.ts` | Alternativ miljøvariabel til Ollama Cloud-`__Secure-session`-cookien. Følsom; foretræk feltet pr. forbindelse i Dashboard, når flere konti er konfigureret. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(ikke angivet)_ | `open-sse/services/usage.ts` | Alternativ miljøvariabel til Ollama Cloud-`__Secure-session`-cookien, som bruges før de kortere aliaser. Følsom; foretræk feltet pr. forbindelse i Dashboard, når flere konti er konfigureret. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Slutpunkt for CodeWhisperer-forbrugsgrænser (AWS Kiro). Tilsidesæt for relæer/test-fixtures. | +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL på serversiden, som interne synkroniseringsjob bruger til at kalde `/api/sync/cloud`. Behold denne som en loopback-/container-URL, selv når appen er offentligt tilgængelig via en proxy. | +| `CLOUD_URL` | _(tom)_ | `src/lib/cloudSync.ts` | URL til cloud-relayslutpunktet (premiumfunktion). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | HTTP-timeout for cloudsynkroniseringsanmodninger. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack-buildkonfiguration | Profil ved build (angiv `minimal` for fysisk at udelukke privilegerede moduler fra bundtet). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ selvstændigt output_ | `scripts/build/colocate-standalone.mjs` | Tilsidesættelse ved build af outputmappen til selvstændig kørsel, som bruges af samplaceringssteppet efter build. Dette er ikke en runtime-indstilling. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(tom)_ | `src/lib/cloudSync.ts` | Delt hemmelighed, der bruges til at verificere HMAC-SHA256-signaturen i svar fra cloudsynkronisering. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Angiv til `true` for at tillade, at cloudsynkroniseringsslutpunktet overskriver lokale legitimationsoplysninger. Standardværdien er `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Angiv til `true` for at afvise et usigneret svar fra cloudsynkronisering, når der ikke er konfigureret en lokal hemmelighed (#13679). En signatur, der er til stede, verificeres altid — og afvises altid, når `OMNIROUTE_CLOUD_SYNC_SECRET` ikke er angivet — uanset dette flag. Standarden ændres til håndhævet i v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Angiv til `true` for at falde tilbage til ettrinsadfærden "importér alt" fra v3.8.5 uden brugerbekræftelse. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, kontrolpanel, synkronisering | Offentligt tilgængelig URL til OAuth redirect_uri, links i kontrolpanelet og genererede offentlige URL'er. Angiv denne til den stabile offentlige URL, når OAuth-callbacks eller genererede browserlinks skal bruge en kanonisk reverse proxy-vært. | +| `NEXT_PUBLIC_CLOUD_URL` | _(tom)_ | Klientsiden | Klientsidespejl af `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(ikke angivet)_ | `src/shared/services/cloudSyncScheduler.ts` | Ældre reserveværdi for `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(ikke angivet)_ | Resolver for offentlig oprindelse, billed-URL'er | OmniRoute-oprindelsen med højeste prioritet, som er synlig for browseren og bruges til generering af offentlige URL'er samt validering af browseroprindelse uden for dashboardet. Angiv denne, når OpenWebUI eller et andet relæ tilgår OmniRoute via en intern URL, men brugerens browser skal hente genererede medier fra et LAN, en tunnel eller en offentlig oprindelse. Medtag **ikke** `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(ikke angivet)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absolut URL til udbyderpluginmanifestet, som annonceres til sidecar-klienter. Når den ikke er angivet, udleder OmniRoute `/api/v1/provider-plugin-manifest` fra anmodningens oprindelse eller HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokol, der bruges ved udledning af URL'en til udbyderpluginmanifestet fra HOST/PORT uden en anmodningsoprindelse. Angiv `https` bag en offentlig proxy, der terminerer TLS, når der ikke er angivet en eksplicit `OMNIROUTE_PROVIDER_MANIFEST_URL`. | +| `OMNIROUTE_TRUST_PROXY` | _(ikke angivet)_ | `src/server/origin/publicOrigin.ts` | Valgfri tillidstilstand for videresendte headere med offentlig oprindelse. Ikke angivet = hav ikke tillid til `Forwarded` / `X-Forwarded-*` ved sikkerhedsbeslutninger. `true` / `loopback` har kun tillid til videresendt vært/protokol fra en tokenstemplet loopback-proxy. `private` / `lan` har også tillid til proxy-peers på private LAN-netværk. Foretræk eksplicit `NEXT_PUBLIC_BASE_URL` i produktion. | +| `KIE_CALLBACK_URL` | _(ikke angivet)_ | `open-sse/utils/kieTask.ts` | Offentlig callback-URL til asynkrone kie.ai-job. Tilsidesættelse med højeste prioritet før `OMNIROUTE_KIE_CALLBACK_URL` og `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(ikke angivet)_ | `open-sse/utils/kieTask.ts` | Alternativ stavemåde for `KIE_CALLBACK_URL`. Bruges som reserveværdi, når den primære variabel ikke er angivet. | +| `OMNIROUTE_PUBLIC_URL` | _(ikke angivet)_ | `open-sse/utils/kieTask.ts` | Offentlig oprindelse, der bruges til at danne asynkrone callback-URL'er. Reserveværdi med laveste prioritet for kie.ai-callbacks; bruges også som en generisk offentlig URL til andre relæer. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Slutpunkt til opslag af CrofAI-kvote, som bruges af siden Forbrug. Tilsidesæt for relæer/test-fixtures. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Officielt API-nøglegodkendt OpenCode Go-forbrugsslutpunkt, som bruges af siden Forbrug. Tilsidesæt for relæer/test-fixtures. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Syntetisér OpenCode CLI-identitetsheadere (User-Agent, x-opencode-client/project, anmodnings-/sessions-UUID'er) på opencode-go/zen-upstreamanmodninger, som klienten ikke sendte, så Cloudflare accepterer dem ved udgående trafik fra VPS'er (#6210/#5997). Aktiveret som standard siden #10571; fravælg med `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Standard-User-Agent, der bruges, når `OPENCODE_SYNTHESIZE_CLI_HEADERS` er aktiveret, og der ikke er angivet en udbyderspecifik `_USER_AGENT`-tilsidesættelse. Anvendes kun på opencode-eksekveringsmoduler. Ved en nøglefri anmodning, som upstream-tjenesten begrænser, erstattes en konfigureret værdi, der ikke indeholder `opencode/= 1.17>`, med denne standardværdi i stedet for at blive afvist. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Værdi for den syntetiserede `x-opencode-client`-header, når `OPENCODE_SYNTHESIZE_CLI_HEADERS` er aktiveret. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Værdi for den genererede `x-opencode-project`-header, når `OPENCODE_SYNTHESIZE_CLI_HEADERS` er aktiveret. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(ikke angivet)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Indstil til `off` for at stoppe tilpasningen af brødteksten i OpenCode-anmodninger uden nøgle (streamingflag og værktøjsliste). Headere anvendes stadig. Læses for hver anmodning, så en ændring træder i kraft med det samme. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(ikke angivet)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Kommaseparerede værktøjsnavne, der skal deklareres i en OpenCode-anmodning uden nøgle, som ikke indeholder nogen, når der endnu ikke er observeret noget for den pågældende model. En tom værdi falder tilbage til en enkelt pladsholder, som modellen instrueres i ikke at kalde. Højst 32 poster, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; ugyldige poster ignoreres. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL til Ollama Cloud-indstillinger, der bruges til at hente kvoteoplysninger. Tilsidesæt den for relæer/test-fixtures. | +| `OLLAMA_USAGE_COOKIE` | _(ikke angivet)_ | `open-sse/services/usage.ts` | Ollama Cloud-`__Secure-session`-cookie, der bruges til at hente kvoteoplysninger fra indstillingssiden. Følsom; foretræk feltet for hver forbindelse i kontrolpanelet, når flere konti er konfigureret. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(ikke angivet)_ | `open-sse/services/usage.ts` | Alternativ miljøvariabel til Ollama Cloud-`__Secure-session`-cookien. Følsom; foretræk feltet for hver forbindelse i kontrolpanelet, når flere konti er konfigureret. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(ikke angivet)_ | `open-sse/services/usage.ts` | Alternativ miljøvariabel til Ollama Cloud-`__Secure-session`-cookien, som anvendes før de kortere aliaser. Følsom; foretræk feltet for hver forbindelse i kontrolpanelet, når flere konti er konfigureret. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Slutpunkt for forbrugsgrænser i CodeWhisperer (AWS Kiro). Tilsidesæt det for relæer/test-fixtures. | > [!IMPORTANT] -> Ved implementering bag en reverse proxy (nginx, Caddy) skal `NEXT_PUBLIC_BASE_URL` angives som din stabile offentlige URL (f.eks. `https://omniroute.example.com`), når OAuth-callbacks eller genererede offentlige links skal bruge dette værtsnavn. Uden dette kan OAuth-callbacks mislykkes, fordi redirect_uri ikke matcher, og genererede offentlige links kan pege på den interne container-oprindelse. +> Når du implementerer bag en reverse proxy (nginx, Caddy), skal du indstille `NEXT_PUBLIC_BASE_URL` til din stabile offentlige URL (f.eks. `https://omniroute.example.com`), når OAuth-callbacks eller genererede offentlige links skal bruge dette værtsnavn. Uden dette kan OAuth-callbacks mislykkes, fordi `redirect_uri` ikke matcher, og genererede offentlige links kan pege på den interne containeroprindelse. > -> Behold `BASE_URL` som en intern loopback-/container-URL til server-til-server-job. Brug ikke en browser-`Origin` eller et offentligt værtsnavn til interne self-fetches med legitimationsoplysninger. +> Behold `BASE_URL` som en intern loopback-/container-URL til server-til-server-job. Brug ikke en browser-`Origin` eller et offentligt værtsnavn til interne selvhentninger, der medsender legitimationsoplysninger. > -> Godkendte skrivehandlinger i dashboardet kræver ikke en statisk offentlig basis-URL: Dashboardet sender usikre forespørgsler med samme oprindelse og et sessionsbundet CSRF-token. OmniRoute centraliserer stadig validering af offentlig oprindelse for browserintegrationer uden for dashboardet: Eksplicitte miljøvariabler for offentlige URL'er betragtes først som pålidelige; rå `Forwarded`- og `X-Forwarded-*`-headere ignoreres, medmindre `OMNIROUTE_TRUST_PROXY` er aktiveret, og den umiddelbare proxy-peer er tokenmærket som pålidelig. Brug ikke CORS-indstillinger til at rette forespørgsler fra dashboardet med samme oprindelse; CORS er kun beregnet til browserklienter med anden oprindelse. +> Godkendte skrivehandlinger i kontrolpanelet kræver ikke en statisk offentlig basis-URL: Kontrolpanelet sender usikre anmodninger til samme oprindelse med et sessionsbundet CSRF-token. OmniRoute centraliserer stadig valideringen af offentlig oprindelse for browserintegrationer uden for kontrolpanelet: Eksplicitte miljøvariabler for offentlige URL'er betros først; rå `Forwarded`- / `X-Forwarded-*`-headere ignoreres, medmindre `OMNIROUTE_TRUST_PROXY` er aktiveret, og den umiddelbare proxy-peer er tokenmærket som betroet. Brug ikke CORS-indstillinger til at løse anmodninger fra kontrolpanelet til samme oprindelse; CORS er kun til browserklienter på tværs af oprindelser. --- @@ -586,42 +593,43 @@ sidecar-registreringen ovenfor). --- -## 11. OAuth-udbyderoplysninger - -Indbyggede legitimationsoplysninger til **udvikling på localhost**. Ved fjernimplementeringer skal du registrere dine egne i hver udbyders udviklerkonsol. - -| Variabel | Udbyder | Bemærkninger | -| --------------------------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Offentlig klient — ingen hemmelighed påkrævet. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Tilsidesæt omdirigerings-URI'en. Standard: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Offentlig klient. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Kræver en tilsvarende `_SECRET`. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Offentlig klient. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Kræver en tilsvarende `_SECRET`. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Offentlig klient. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Valgfri tilsidesættelse af OAuth-klient-id'et for GitHub Enterprise Copilot. Falder tilbage til den offentlige standardværdi for `GITHUB_OAUTH_CLIENT_ID`, når den ikke er angivet. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Reserve-API-nøgle, der bruges af `open-sse/executors/devin-cli.ts`, når der ikke er nogen legitimationsoplysninger tilgængelige for den enkelte forbindelse. Valgfri. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Brugerdefineret sti til den binære Devin CLI-fil (`devin`). Findes af `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | OAuth-klient-id til GitLab Duo. Registrer en app på `https://gitlab.com/-/profile/applications` med omdirigerings-URI'en `/callback` og omfangene `api, read_user, openid, profile, email`. Falder tilbage til `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth-klienthemmelighed til GitLab Duo. Valgfri — PKCE-flowet kræver ikke en hemmelighed. Falder tilbage til `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Tilsidesæt GitLabs basis-URL (egenhostet GitLab). Standardværdien er `https://gitlab.com`. Falder tilbage til `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Ældre reserveværdi for `GITLAB_DUO_BASE_URL`. Bruges, når `_DUO_`-varianten ikke er angivet. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Ældre reserveværdi for `GITLAB_DUO_OAUTH_CLIENT_ID`, som bruges af `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Ældre reserveværdi for `GITLAB_DUO_OAUTH_CLIENT_SECRET`, som bruges af `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Angiv for at aktivere Qoder OAuth. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Direkte reserve-API-nøgle (omgår OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | Arbejdsområde-id til Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias for `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Tilsidesæt Qoder CLI-konfigurationsmappen (isoleret PAT-session, undgår at overskrive et browserlogin). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend-`tk`-token, der skal sendes som `validated` til `/api/chat`. Påkrævet, når Blackbox gennemtvinger tokenmatchning; ellers falder OmniRoute tilbage til et tilfældigt UUID. Se problem #2252. | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge-sikkerhedsregel | OpenAI-kompatibel basis-URL til ikke-Anthropic Vision Bridge-kald. Standardværdien er URL'en fra det ældre OpenAI-miljø eller api.openai.com. Peg på OmniRoutes eget `/v1`-loop eller et vilkårligt OpenAI-kompatibelt slutpunkt (Gemini OpenAI-kompatibilitet, OpenRouter). Problem #2232. Når URL'en er OmniRoutes egen `/v1`, sender describe-underanmodningen `x-omniroute-admission-bypass: internal` og godkendes med de fundne legitimationsoplysninger til det interne loop (`sk_omniroute`-markør i lokal tilstand eller `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), så udrulninger med `REQUIRE_API_KEY=true` fungerer. | -| `VISION_BRIDGE_API_KEY` | Vision Bridge-sikkerhedsregel | API-nøgle til ovenstående URL. Tilsidesætter OpenAI-/Google-miljøvariabler for hver udbyder ved ikke-Anthropic Vision Bridge-kald. Anthropic-modeller beholder deres dedikerede sti til Anthropic-nøglen. Problem #2232. | +## 11. OAuth-udbyderlegitimationsoplysninger + +Indbyggede legitimationsoplysninger til **lokal udvikling på localhost**. Ved fjerninstallationer skal du registrere dine egne i hver udbyders udviklerkonsol. + +| Variabel | Udbyder | Bemærkninger | +| --------------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Offentlig klient — ingen hemmelighed påkrævet. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Tilsidesæt omdirigerings-URI'en. Standard: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Offentlig klient. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Kræver en tilsvarende `_SECRET`. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Offentlig klient. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Kræver en tilsvarende `_SECRET`. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Offentlig klient. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Valgfri tilsidesættelse af OAuth-klient-id'et til GitHub Enterprise Copilot. Bruger som reserve den offentlige standardværdi for `GITHUB_OAUTH_CLIENT_ID`, når den ikke er angivet. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Valgfri tilsidesættelse af GitHub Copilot-klientintegrations-id'et, der sendes i headerne `Copilot-Integration-Id` og `Editor-Plugin-Version`. Standardværdien er `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Reserve-API-nøgle, der bruges af `open-sse/executors/devin-cli.ts`, når der ikke er nogen legitimationsoplysninger tilgængelige for den enkelte forbindelse. Valgfri. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Brugerdefineret sti til den binære Devin CLI-fil (`devin`). Fortolkes af `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | OAuth-klient-id til GitLab Duo. Registrer en app på `https://gitlab.com/-/profile/applications` med omdirigerings-URI'en `/callback` og omfangene `api, read_user, openid, profile, email`. Bruger `GITLAB_OAUTH_CLIENT_ID` som reserve. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth-klienthemmelighed til GitLab Duo. Valgfri — PKCE-flowet kræver ikke en hemmelighed. Bruger `GITLAB_OAUTH_CLIENT_SECRET` som reserve. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Tilsidesæt GitLabs basis-URL (GitLab med egen hosting). Standardværdien er `https://gitlab.com`. Bruger `GITLAB_BASE_URL` som reserve. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Ældre reserveværdi for `GITLAB_DUO_BASE_URL`. Bruges, når `_DUO_`-varianten ikke er angivet. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Ældre reserveværdi for `GITLAB_DUO_OAUTH_CLIENT_ID`, som bruges af `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Ældre reserveværdi for `GITLAB_DUO_OAUTH_CLIENT_SECRET`, som bruges af `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Angiv denne for at aktivere Qoder OAuth. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Direkte API-nøgle som reserve (omgår OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | Arbejdsområde-id til Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias for `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Tilsidesæt Qoder CLI-konfigurationsmappen (isoleret PAT-session, undgår at overskrive et browserlogin). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend-`tk`-token, der skal sendes som `validated` på `/api/chat`. Påkrævet, når Blackbox håndhæver tokenmatchning; ellers falder OmniRoute tilbage til et tilfældigt UUID. Se problem #2252. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge-sikkerhedsforanstaltning | OpenAI-kompatibel basis-URL til ikke-Anthropic Vision Bridge-kald. Bruger som standard den ældre OpenAI-URL fra miljøet eller api.openai.com. Peg på OmniRoutes eget `/v1`-loop eller et vilkårligt OpenAI-kompatibelt slutpunkt (Gemini OpenAI-kompatibilitet, OpenRouter). Problem #2232. Når URL'en er OmniRoutes eget `/v1`, sender describe-underanmodningen `x-omniroute-admission-bypass: internal` og godkendes med den fundne legitimationsoplysning til det interne loop (`sk_omniroute`-sentinel i lokal tilstand eller `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), så installationer med `REQUIRE_API_KEY=true` fungerer. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge-sikkerhedsforanstaltning | API-nøgle til URL'en ovenfor. Tilsidesætter OpenAI-/Google-miljøvariabler for hver udbyder ved ikke-Anthropic Vision Bridge-kald. Anthropic-modeller beholder deres dedikerede Anthropic-nøglesti. Problem #2232. | > [!WARNING] > @@ -733,7 +741,7 @@ Genkendt mønster: `{PROVIDER_ID}_API_KEY` Alle værdier er angivet i **millisekunder**. Centraliseret fortolkning i `src/shared/utils/runtimeTimeouts.ts`. -### Timeouthierarki +### Timeout-hierarki ``` REQUEST_TIMEOUT_MS (global tilsidesættelse) @@ -748,7 +756,7 @@ REQUEST_TIMEOUT_MS (global tilsidesættelse) ├─→ STREAM_IDLE_TIMEOUT_MS (arver fra REQUEST_TIMEOUT_MS, standard: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (uafhængig, standard: 1260000; 0 deaktiverer) ├─→ STREAM_READINESS_TIMEOUT_MS (arver fra REQUEST_TIMEOUT_MS, standard: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (begrænser adaptive udvidelser af parathedstimeout, standard: 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (begrænser adaptive udvidelser af klarhedsperioden, standard: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (arver fra REQUEST_TIMEOUT_MS, standard: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (afledt, standard: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (standard: 60000) @@ -756,114 +764,115 @@ REQUEST_TIMEOUT_MS (global tilsidesættelse) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (standard: 0 = deaktiveret) ``` -| Variabel | Standardværdi | Beskrivelse | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `REQUEST_TIMEOUT_MS` | _(ikke angivet)_ | Global genvej — tilsidesætter standardværdierne for både `FETCH_TIMEOUT_MS` og `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Samlet timeout for HTTP-anmodninger til kald af upstream-udbydere. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maksimal stilhed mellem rå upstream-bytes, før der afbrydes. Modeller med udvidet ræsonnering holder sjældent pause i >90 s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Maksimal samlet levetid for en aktiv SSE-stream; nulstilles aldrig af upstream-bytes og er uafhængig af `REQUEST_TIMEOUT_MS`. Afledt af den største modelspecifikke `timeoutMs` i registreringsdatabasen (1200000, Codex) plus en margen på 60000, så en model, der har tilladelse til at bruge hele sin tidsramme, aldrig stoppes midt i et svar. Indstil til `0` for at deaktivere. | -| `OMNIROUTE_SSE_COMMENTS` | _(deaktiveret)_ | Angiver, om OmniRoute må udsende SSE-kommentarlinjer med `:` (f.eks. `: keepalive`-heartbeatet og `x-omniroute-*`-metadatatrailere). Deaktiveret som standard (#10524), fordi strikse OpenAI-kompatible klienter anvender JSON.parse på hver SSE-linje og går ned ved `:`-kommentarer; `data:`-heartbeats påvirkes ikke. Indstil til `on`/`true`/`1`/`yes` for at tilvælge funktionen igen. Bruges af `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Tid til modtagelse af den første SSE-hændelse, som ikke er et ping. Arver `REQUEST_TIMEOUT_MS`, når den er angivet. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maksimalt adaptivt parathedsvindue for den første hændelse ved store streaminganmodninger, anmodninger med omfattende brug af værktøjer eller anmodninger med et højt ræsonneringsniveau. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Nødafbryder for `/goal`-heuristikken. Indstil til `false`/`0`/`off` for at deaktivere registrering fuldstændigt — parathedstimeouts og streamgenoprettelse forhøjes aldrig ud fra anmodningstekst/headere, hvilket begrænser klientstyret forstærkning af timeouts. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maksimalt parathedsvindue for den første hændelse for registrerede `/goal`-agentkørsler eller anmodninger, der gennemtvinges med `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aktivér automatisk tidlig streamgenoprettelse for registrerede `/goal`-agentkørsler. Indstil til `false`/`0`/`off` for at deaktivere den målspecifikke tilvælgelse. Dette kan kun TILFØJE genoprettelse oven i operatørens standardindstilling — det tilsidesætter aldrig et eksplicit fravalg via `STREAM_RECOVERY_ENABLED`/databaseindstillinger. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Fjern ikke-standardiserede `codex.*`-SSE-hændelser (f.eks. `codex.rate_limits`), som får OpenAI SDK'ets `responses.stream()` til at fejle med en 502. Aktiveret som standard (#11014). Indstil til `0`/`false`/`no`/`off` for at videresende dem. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(ikke angivet)_ | Tilvalg af Codex app-server-transport. WebSocket-endepunkt (`ws://`/`wss://`) for en lokal `codex app-server`-sidecar. Når den angives sammen med et token, dirigeres Codex-anmodninger via JSON-RPC til sidecaren i stedet for HTTP Responses API. Kan også angives pr. forbindelse via `providerSpecificData.codexAppServerUrl`. Bruges af `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(ikke angivet)_ | Indlejret kapabilitets-/bearer-token, der præsenteres for app-serveren. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(ikke angivet)_ | Sti til en fil, der indeholder app-serverens kapabilitetstoken (fra `codex app-server --ws-token-file`). Bruges, når `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ikke er angivet. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Arbejdsmappe, som app-serverens kørsel afvikles i. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(ikke angivet)_ | Godkendelsespolitik, der videregives til app-serverens kørsel (f.eks. `never`, `on-request`). Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(ikke angivet)_ | Sandboxpolitik, der videregives til app-serverens kørsel (f.eks. `read-only`, `workspace-write`, `danger-full-access`). Når den ikke er angivet, bruger eksekveringskomponenten som standard `workspace-write` (sikkerhedshærdet; tidligere `danger-full-access`). Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Godkend automatisk app-serverens egne godkendelsesprompter (udførelse af kommandoer/filer/tilladelser på værten). Deaktiveret som standard — prompter afvises automatisk; kald af harness-værktøjer påvirkes ikke (de sendes via den separate `item/tool/call`-pass-through). Accepterer `true`/`1`/`yes`. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tid til modtagelse af svarheadere. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Maksimal ventetid på responsstart (ms) for hvert direkte forsøg uden proxy. Ved timeout forsøges der én gang til med en ny socket; angiv `0` for at deaktivere grænsen og bevare den tidligere adfærd. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tid til at modtage hele responsindholdet. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Timeout for oprettelse af TCP-forbindelse. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Timeout for inaktiv keep-alive-socket. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Timeout for TLS-fingeraftryksproxy (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Begrænser specifikt tiden til første byte i indholdet fra wreq-js-transporten med TLS-fingeraftryk; `TLS_CLIENT_TIMEOUT_MS` kan ikke alene registrere indhold, der er gået i stå, da den afsluttes, så snart headere ankommer (#12656). En timeout annullerer wreq-læseren og falder tilbage til direct/proxy-dispatcheren; `0` deaktiverer overvågningen. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Kun OpenCode-eksekveringsenheden, og kun mens funktionsflaget `OPENCODE_RESPONSES_STALL_ROTATION` er aktiveret (deaktiveret som standard): begrænser ventetiden på den første byte i indholdet af et streamet Responses-svar, efter at dets headere er ankommet (#13484). En Responses-stream åbnes med `response.created`, så stilhed efter dette tidsrum betyder, at den er gået i stå: Kontoen sættes på pause, og anmodningen roteres én gang til den næste konto; hvis den går i stå igen, fejler den straks. `0` deaktiverer beskyttelsen, selv når flaget er aktiveret. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Timeout for proxyhop ved `/v1`-bridgeanmodninger. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Lad Firecrawl-eksekveringsenheden til webhentning bruge en selvhostet instans (API-nøgle er valgfri uden for cloudmiljøet). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Timeout pr. anmodning for Firecrawl-eksekveringsenheden til webhentning. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Samlet timeout for serveranmodninger via bridgen. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Tid til at sende responsheadere via bridgen. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Timeout for inaktiv keep-alive-forbindelse i bridgen. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Timeout for rå socket (0 = deaktiveret). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Respittid ved SIGTERM/SIGINT før tvungen afslutning. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Reserveværdi, der bruges af `src/shared/utils/fetchTimeout.ts`, når `FETCH_TIMEOUT_MS` ikke er angivet. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Timeout (ms) for forudindstillingerne `validationRead` og `modelsProbe` i `src/shared/network/safeOutboundFetch.ts`. Forøg værdien for langsomme slutpunkter (Cerebras, Cloudflare AI, Groq) for at forhindre skift mellem aktiv/fejl i kontrolpanelet. Falder tilbage til 8000 ms ved ugyldige (<1000) eller ikke-numeriske værdier. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Relæspecifik hentningstimeout i `open-sse/utils/proxyFetch.ts` (#9158). Et relæ, der er gået i stå, skal fejle før klientens/agentens timeout (~30 s), så kalderne ser en relæspecifik fejl i stedet for en generisk upstream-timeout. Begrænset til `29000`, så den altid udløses først. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Fælles forsinkelse mellem genforsøg for direct/relay/proxy-stierne med ét genforsøg i `open-sse/utils/proxyFetch.ts` (#9158). `0` = prøv igen med det samme. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Timeout for oprindelig wreq-js-anmodning (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absolut fast JS-tidsfrist som tillæg til den oprindelige timeout. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Timeout for oprindelig wreq-js-anmodning (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absolut fast JS-tidsfrist som tillæg til den oprindelige timeout. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (fra) | Føjer "Du har indbygget websøgning. Besvar spørgsmål direkte ved hjælp af søgeresultater." til kalderens systemmeddelelse (`perplexity-web/protocol.ts`). Deaktiveret som standard — Perplexity søger alligevel, og sætningen lækker ind i svar som metakommentarer til kodningsklienter. Angiv `1`/`true`/`yes`/`on` for at gendanne den. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Timeout for oprindelige wreq-js-anmodninger (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absolut JS-respitperiode for hård deadline, som lægges oven i den oprindelige timeout. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Timeout for oprindelige wreq-js-anmodninger (`notionTlsClient.ts`); `notion-web` hæver den pr. anmodning til `180000` for lange genereringer. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absolut JS-respitperiode for hård deadline, som lægges oven i den oprindelige timeout. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Delt Playwright-browserpulje til webcookie-chat, der understøttes af en browser (`browserPool.ts`); angiv `off` for at deaktivere den. | -| `OBSCURA_BIN` | `auto-detect` | Sti til den binære `obscura`-fil, der bruges som primær motor af browserpuljen og Cloudflare Playground-eksekveringskomponenten (`open-sse/services/obscura.ts`); registreres automatisk fra systemets PATH, når den ikke er angivet. | -| `OBSCURA_CDP_ENDPOINT` | _(ikke angivet)_ | Peg på en allerede kørende Obscura (`http://host:port`) i stedet for at starte en; modulet ejer ikke denne proces (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | Eksplicit port til den startede `obscura serve`; en ledig port vælges automatisk, når den ikke er angivet (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Vælg den browserbaserede sti til en webcookie-chat-anmodning (`browserBackedChat.ts`); `1` for at aktivere den. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Basis-URL til Kimi Web-eksekveringskomponenten (international kimi.ai Connect-RPC) (`kimi-web.ts`); tilsidesæt kun for spejl-/proxyendepunkter. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Fuldt chatendepunkt til Kimi Web-eksekveringskomponenten (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(registreres automatisk)_ | Sti til en Chrome-/Edge-eksekverbar fil på systemet til Adobe Fireflys interaktive browserlogin (`adobeFireflyBrowserLogin.ts`); tilsidesætter automatisk registrering for hvert operativsystem. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ separat output_ | Tilsidesættelse på byggetidspunktet af mappen til separat output, som bruges af samplaceringstrinnet efter buildet (`scripts/build/colocate-standalone.mjs`); byggeværktøjer, ikke kørselstid. | - -Forsøg på kombinationsmål arver den fastlagte timeout for upstream-anmodninger (`FETCH_TIMEOUT_MS` eller -`REQUEST_TIMEOUT_MS`, når den leverer standardværdien for hentning). Angiv kun `targetTimeoutMs` i en kombination, -kombinationsstandarder eller en udbydertilsidesættelse for at gøre kombinationsfallback hurtigere; værdier over den +| Variabel | Standardværdi | Beskrivelse | +| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(ikke angivet)_ | Global genvej — tilsidesætter standardværdierne for både `FETCH_TIMEOUT_MS` og `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Samlet timeout for HTTP-anmodninger til upstream-udbydere. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maksimal stilhed mellem rå upstream-bytes, før forbindelsen afbrydes. Modeller med udvidet ræsonnering holder sjældent pause i >90 s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Maksimal samlet levetid for en aktiv SSE-stream; nulstilles aldrig af upstream-bytes og er uafhængig af `REQUEST_TIMEOUT_MS`. Afledt af den største modelspecifikke `timeoutMs` i registret (1200000, Codex) plus en margen på 60000, så en model, der har tilladelse til at bruge hele sit budget, aldrig afbrydes midt i et svar. Angiv `0` for at deaktivere. | +| `OMNIROUTE_SSE_COMMENTS` | _(deaktiveret)_ | Om OmniRoute må udsende SSE-kommentarlinjer med `:` (f.eks. `: keepalive`-hjerteslaget og `x-omniroute-*`-metadatatrailere). Deaktiveret som standard (#10524), fordi strikse OpenAI-kompatible klienter anvender JSON.parse på hver SSE-linje og går ned ved `:`-kommentarer; `data:`-hjerteslag påvirkes ikke. Angiv `on`/`true`/`1`/`yes` for at tilvælge funktionen igen. Bruges af `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Tid til modtagelse af den første SSE-hændelse, der ikke er et ping. Arver `REQUEST_TIMEOUT_MS`, når den er angivet. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maksimalt adaptivt parathedsvindue for den første hændelse ved store streaminganmodninger, anmodninger med omfattende værktøjsbrug eller anmodninger med meget ræsonnering. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Nødafbryder for `/goal`-heuristikken. Angiv `false`/`0`/`off` for at deaktivere registreringen fuldstændigt — parathedstimeouts og streamgenoprettelse forhøjes aldrig ud fra anmodningens body/headers, hvilket begrænser klientstyret timeoutforstærkning. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maksimalt parathedsvindue for den første hændelse ved registrerede `/goal`-agentkørsler eller anmodninger, der er gennemtvunget med `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aktivér automatisk tidlig streamgenoprettelse for registrerede `/goal`-agentkørsler. Angiv `false`/`0`/`off` for at deaktivere det målspecifikke tilvalg. Dette kan kun TILFØJE genoprettelse oven i operatørens standardindstilling — det tilsidesætter aldrig et eksplicit fravalg via `STREAM_RECOVERY_ENABLED`/databaseindstillinger. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Fjern ikke-standardiserede `codex.*`-SSE-hændelser (f.eks. `codex.rate_limits`), der får OpenAI SDK'ets `responses.stream()` til at fejle med en 502-fejl. Aktiveret som standard (#11014). Angiv `0`/`false`/`no`/`off` for at videresende dem. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(ikke angivet)_ | Tilvalg af Codex app-server-transport. WebSocket-slutpunkt (`ws://`/`wss://`) for en lokal `codex app-server`-sidecar. Når dette angives sammen med en token, dirigeres Codex-anmodninger via JSON-RPC til sidecar-processen i stedet for HTTP Responses API'en. Kan også angives pr. forbindelse via `providerSpecificData.codexAppServerUrl`. Bruges af `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(ikke angivet)_ | Integreret capability-/bearer-token, der præsenteres for app-serveren. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(ikke angivet)_ | Sti til en fil, der indeholder app-serverens capability-token (fra `codex app-server --ws-token-file`). Bruges, når `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ikke er angivet. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Arbejdsmappe, som app-serverens kørsel afvikles i. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(ikke angivet)_ | Godkendelsespolitik, der overføres til app-serverens kørsel (f.eks. `never`, `on-request`). Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(ikke angivet)_ | Sandboxpolitik, der overføres til app-serverens kørsel (f.eks. `read-only`, `workspace-write`, `danger-full-access`). Når den ikke er angivet, bruger eksekveringskomponenten som standard `workspace-write` (sikkerhedshærdet; tidligere `danger-full-access`). Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Godkend automatisk app-serverens egne godkendelsesprompter (udførelse af kommandoer/filer/tilladelser på værten). Deaktiveret som standard — prompter afvises automatisk; kald til harness-værktøjer påvirkes ikke (de sendes via den separate `item/tool/call`-videresendelse). Accepterer `true`/`1`/`yes`. Tilsidesættelse pr. forbindelse: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tid til modtagelse af svarheaders. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Maksimal ventetid (ms) på svarstart for hvert direkte forsøg uden proxy. Ved timeout forsøges der igen én gang på en ny socket; angiv `0` for at deaktivere grænsen og bevare den tidligere adfærd. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min.) | Øvre grænse (ms) for RETRY-forsøget på en ny socket efter en timeout ved svarstart i et forsøg fra puljen ovenfor (#13703). Gælder kun, når kalderen allerede har tilknyttet sit eget deadlinesignal (kaskaden for den fundne forbindelse/model/udbyder/`FETCH_TIMEOUT_MS`); dette signal er den reelle grænse og udløses først i det tilsigtede forløb, så dette er en generøs sikkerhedsgrænse snarere end et fast loft — uden den genbrugte det nye forsøg det samme korte `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`-vindue som forsøget fra puljen og medførte 504-fejl for velfungerende ræsonneringsmodeller med langsom TTFB. Må aldrig være lavere end den faste minimumsgrænse ovenfor; når kalderen slet ikke angiver noget deadlinesignal, bevarer det nye forsøg den faste minimumsgrænse uændret. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tid til at modtage hele svarindholdet. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Timeout for oprettelse af TCP-forbindelse. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Timeout for inaktiv keep-alive-socket. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Timeout for TLS-fingeraftryksproxyen (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Begrænser specifikt tiden til den første byte i brødteksten fra wreq-js-transporten med TLS-fingeraftryk; `TLS_CLIENT_TIMEOUT_MS` kan ikke alene registrere en brødtekst, der er gået i stå, da den afsluttes, så snart headerne ankommer (#12656). En timeout annullerer wreq-læseren og falder tilbage til den direkte dispatcher/proxydispatcheren; `0` deaktiverer overvågningen. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Kun OpenCode-eksekveringsmotoren, og kun mens funktionsflaget `OPENCODE_RESPONSES_STALL_ROTATION` er aktiveret (deaktiveret som standard): begrænser ventetiden på den første byte i brødteksten fra et streamet Responses-svar, efter at dets headere er modtaget (#13484). En Responses-stream åbnes med `response.created`, så stilhed ud over dette tidsrum betragtes som stilstand: Kontoen sættes på pause, og anmodningen roteres én gang til den næste konto; endnu en stilstand medfører øjeblikkelig fejl. `0` deaktiverer beskyttelsen, selv når flaget er aktiveret. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Timeout for proxy-hop ved `/v1`-bridgeanmodninger. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Ret Firecrawl-eksekveringsmotoren til webhentning mod en selvhostet instans (API-nøgle er valgfri uden for cloudmiljøet). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Timeout pr. anmodning for Firecrawl-eksekveringsmotoren til webhentning. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Samlet timeout for serveranmodninger via bridgen. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Tid til at sende svarheadere via bridgen. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Timeout for inaktiv keep-alive-forbindelse i bridgen. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Timeout for rå socket (0 = deaktiveret). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Frist ved SIGTERM/SIGINT, før processen gennemtvinger afslutning. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Reserveværdi, som bruges af `src/shared/utils/fetchTimeout.ts`, når `FETCH_TIMEOUT_MS` ikke er angivet. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Timeout (ms) for forudindstillingerne `validationRead` og `modelsProbe` i `src/shared/network/safeOutboundFetch.ts`. Forøg værdien for langsomme slutpunkter (Cerebras, Cloudflare AI, Groq) for at forhindre, at de skifter ustabilt mellem aktiv/fejl i kontrolpanelet. Falder tilbage til 8000 ms ved ugyldige (<1000) eller ikke-numeriske værdier. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Relæspecifik hentningstimeout i `open-sse/utils/proxyFetch.ts` (#9158). Et relæ, der er gået i stå, skal fejle før klient-/agenttimeouten (~30 s), så kalderne ser en relæspecifik fejl i stedet for en generisk upstream-timeout. Begrænset til `29000`, så den altid udløses først. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Fælles ventetid før nyt forsøg for forløbene med ét nyt forsøg via direkte forbindelse/relæ/proxy i `open-sse/utils/proxyFetch.ts` (#9158). `0` = prøv igen med det samme. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Timeout for native wreq-js-anmodninger (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absolut fristmargin for JS, der lægges oven i den native timeout. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Timeout for native wreq-js-anmodninger (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absolut fristmargin for JS, der lægges oven i den native timeout. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (fra) | Føjer "Du har indbygget websøgning. Besvar spørgsmål direkte ved hjælp af søgeresultater." til kalderens systemmeddelelse (`perplexity-web/protocol.ts`). Deaktiveret som standard — Perplexity søger alligevel, og sætningen lækker ind i svar som metakommentarer for kodningsklienter. Indstil til `1`/`true`/`yes`/`on` for at gendanne funktionen. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Timeout for native wreq-js-anmodninger (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absolut fristmargin for JS, der lægges oven i den native timeout. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Timeout for native wreq-js-anmodninger (`notionTlsClient.ts`); `notion-web` hæver den pr. anmodning til `180000` ved lange genereringer. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absolut fristmargin for JS, der lægges oven i den native timeout. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Delt Playwright-browserpulje til webcookie-chat understøttet af en browser (`browserPool.ts`); indstil til `off` for at deaktivere. | +| `OBSCURA_BIN` | `auto-detect` | Sti til den binære `obscura`-fil, der bruges som den primære motor af browserpuljen og Cloudflare Playground-eksekveringskomponenten (`open-sse/services/obscura.ts`); registreres automatisk via systemets PATH, når den ikke er angivet. | +| `OBSCURA_CDP_ENDPOINT` | _(ikke angivet)_ | Peg på en allerede kørende Obscura (`http://host:port`) i stedet for at starte en; modulet ejer ikke denne proces (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `tilfældig ledig port` | Eksplicit port til den startede `obscura serve`; en ledig port vælges automatisk, når den ikke er angivet (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Vælg den browserbaserede sti til for en webcookie-chat-anmodning (`browserBackedChat.ts`); `1` for at aktivere. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Basis-URL til Kimi Web-eksekveringskomponenten (international kimi.ai Connect-RPC) (`kimi-web.ts`); tilsidesæt kun for spejl-/proxyendpoints. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Fuldt chatendpoint til Kimi Web-eksekveringskomponenten (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(registreres automatisk)_ | Sti til en Chrome-/Edge-eksekverbar fil på systemet til Adobe Fireflys interaktive browserlogin (`adobeFireflyBrowserLogin.ts`); tilsidesætter automatisk registrering for hvert operativsystem. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ selvstændigt output_ | Tilsidesættelse på byggetidspunktet af outputmappen til den selvstændige version, som bruges af samlokaliseringstrinnet efter buildet (`scripts/build/colocate-standalone.mjs`); byggeværktøj, ikke kørselstid. | + +Forsøg på kombinationsmål arver den fortolkede timeout for upstream-anmodningen (`FETCH_TIMEOUT_MS` eller +`REQUEST_TIMEOUT_MS`, når den leverer standardværdien for fetch). Indstil kun `targetTimeoutMs` i en kombination, +kombinationsstandarder eller en udbydertilsidesættelse for at gøre fallback for kombinationer hurtigere; værdier over den aktuelle upstream-timeout begrænses til upstream-timeouten. -`comboTimeoutMs` er et separat vægursbudget for hele kombinationen på tværs af failover-mål. -Lad det være udefineret, eller angiv `0`, for at bevare ubegrænset iteration (det 10-minutters -`COMBO_LOOP_SAFETY_TIMEOUT_MS`-stop ved fastlåsning gælder stadig). En positiv værdi erstatter dette -sikkerhedsnet for kombinationen. Hold `comboTimeoutMs` længere end `targetTimeoutMs`, så failover +`comboTimeoutMs` er et separat vægurstidsbudget for hele kombinationen på tværs af failover-mål. +Lad det være udefineret eller `0` for at bevare ubegrænset iteration (sikkerhedsstop ved fastlåsning på 10 minutter via +`COMBO_LOOP_SAFETY_TIMEOUT_MS` gælder stadig). En positiv værdi erstatter dette +sikkerhedsnet for kombinationen. Sørg for, at `comboTimeoutMs` er længere end `targetTimeoutMs`, så failover stadig har tid efter et langsomt første mål. -### Tærskler for kredsløbsafbryder - -Konfiguration af kredsløbsafbryderen på udbyderniveau. Standardværdierne afspejler de skalerede værdier, der er brugt siden v3.6 til mere end 500 forbindelser. - -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ------------------------------------------------------------- | ------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Tærskel for antal på hinanden følgende fejl hos OAuth-udbydere, før kredsløbsafbryderen udløses. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Nulstillingsvindue (ms) for OAuth-udbyderens kredsløbsafbryder. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Tærskel for antal på hinanden følgende fejl hos API-nøgleudbydere. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Nulstillingsvindue (ms) for API-nøgleudbyderens kredsløbsafbryder. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Tærskel for antal på hinanden følgende fejl hos lokale udbydere (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Nulstillingsvindue (ms) for den lokale udbyders kredsløbsafbryder. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: antal fejl inden for vinduet, før hele OAuth-udbyderen går i nedkøling. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: rullende vindue (ms) for optælling af fejl hos OAuth-udbydere. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: nedkøling (ms), når tærsklen for OAuth-udbyderen er nået. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth-udbyderen går i DEGRADED ved dette antal fejl. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Maksimal multiplikator for eskalering af resetTimeout for OAuth-udbyderen. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth-udbyderen eskalerer efter dette antal åbne cyklusser. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: antal fejl inden for vinduet, før hele API-nøgleudbyderen går i nedkøling. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: rullende vindue (ms) for optælling af fejl hos API-nøgleudbydere. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: nedkøling (ms), når tærsklen for API-nøgleudbyderen er nået. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-nøgleudbyderen går i DEGRADED ved dette antal fejl. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Maksimal multiplikator for eskalering af resetTimeout for API-nøgleudbyderen. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-nøgleudbyderen eskalerer efter dette antal åbne cyklusser. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: antal fejl, før hele den lokale udbyder går i nedkøling. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: rullende vindue (ms) for optælling af fejl hos lokale udbydere. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Kredsløbsafbryder på udbyderniveau: nedkøling (ms), når tærsklen for den lokale udbyder er nået. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Backoff-niveau, hvor udbyderen for en fastgørelse i kontekstcachen anses for at være vedvarende utilgængelig, og fastgørelsen fjernes for at muliggøre failover. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Anti-flap-vindue (ms), der tolererer korte, midlertidige nedkølingsperioder, før en fastgørelse i kontekstcachen fjernes. | +### Tærskler for kredsløbsafbryderen + +Justering af kredsløbsafbryderen på udbyderniveau. Standardværdierne afspejler de skalerede værdier, der er anvendt siden v3.6 til mere end 500 forbindelser. + +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ------------------------------------------------------------- | ------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Tærskel for antal på hinanden følgende fejl hos OAuth-udbydere, før afbryderen udløses. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Nulstillingsvindue (ms) for OAuth-udbyderens afbryder. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Tærskel for antal på hinanden følgende fejl hos API-nøgleudbydere. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Nulstillingsvindue (ms) for API-nøgleudbyderens afbryder. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Tærskel for antal på hinanden følgende fejl hos lokale udbydere (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Nulstillingsvindue (ms) for den lokale udbyders afbryder. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: antal fejl inden for vinduet, før hele OAuth-udbyderen går i nedkøling. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: rullende vindue (ms) til optælling af fejl for OAuth-udbydere. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: nedkøling (ms), når tærsklen for OAuth-udbyderen er nået. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth-udbyderen går i DEGRADED-tilstand ved dette antal fejl. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Maksimal multiplikator for eskalering af resetTimeout for OAuth-udbyderen. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth-udbyderen eskalerer efter dette antal åbne cyklusser. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: antal fejl inden for vinduet, før hele API-nøgleudbyderen går i nedkøling. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: rullende vindue (ms) til optælling af fejl for API-nøgleudbydere. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: nedkøling (ms), når tærsklen for API-nøgleudbyderen er nået. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-nøgleudbyderen går i DEGRADED-tilstand ved dette antal fejl. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Maksimal multiplikator for eskalering af resetTimeout for API-nøgleudbyderen. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-nøgleudbyderen eskalerer efter dette antal åbne cyklusser. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: antal fejl, før hele den lokale udbyder går i nedkøling. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: rullende vindue (ms) til optælling af fejl for lokale udbydere. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Afbryder på udbyderniveau: nedkøling (ms), når tærsklen for den lokale udbyder er nået. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Backoff-niveau, hvor udbyderen for en kontekstcache-fastgørelse anses for at være vedvarende ustabil, og fastgørelsen fjernes for at muliggøre failover. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Anti-flap-vindue (ms), der tolererer korte, midlertidige nedkølinger, før en kontekstcache-fastgørelse fjernes. | ### Scenarier -| Scenarie | Konfiguration | -| ----------------------------------------------- | ------------------------------------------------------ | -| **Langvarig kodegenerering** | `REQUEST_TIMEOUT_MS=900000` (15 min.) | -| **Begræns streamens samlede levetid** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min.) | -| **Hurtig fejlregistrering for produktions-API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Modeller med udvidet tænkning** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min. mellem chunks) | +| Scenarie | Konfiguration | +| ------------------------------------------ | ------------------------------------------------------ | +| **Langvarig kodegenerering** | `REQUEST_TIMEOUT_MS=900000` (15 min.) | +| **Begræns samlet streamlevetid** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min.) | +| **Hurtig fejlmelding for produktions-API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Modeller med udvidet tænkning** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min. mellem bidder) | --- @@ -1112,64 +1121,64 @@ desktopinstallation. ## 21. Proxytilstand -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Timeout for hurtigt fejlslagende sundhedstjek. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Tidsvindue (timer) til beregning af den gennemsnitlige latenstid for kandidatproxyer i den latensoptimerede puljestrategi. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Cache-TTL for resultater af sundhedstjek. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Cache-TTL for mislykkede proxy-sundhedsprober. Hold denne kortere end `PROXY_HEALTH_CACHE_TTL_MS`, så midlertidige proxy-timeouts under høj samtidighed hurtigt prøves igen uden at deaktivere hurtig fejlregistrering for proxyer, der reelt er utilgængelige. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Indstil til `false` for at deaktivere proxy-sundhedsplanlæggeren i baggrunden, som regelmæssigt tester registrerede proxyer. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval i ms mellem baggrundssundhedsplanlæggerens gennemløb (minimum `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Mål for tilgængelighedsprober, som bruges af planlæggeren og slutpunktet `/api/settings/proxies/auto-test`. Peg den mod en intern/selvhostet URL for at undgå den offentlige standardværdi. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Antal prober, der startes samtidigt pr. batch, delt mellem planlæggeren og slutpunktet `/api/settings/proxies/auto-test`. Afrundes nedad til mindst 1 og begrænses til højst 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Forsinkelse i ms mellem afsendelsen af to prober i en batch. Uden denne afsendes hele batchen på samme tidspunkt, og en delt udgående IP kan udløse hastighedsbegrænsning hos målet. Indstil til `0` for at deaktivere mellemrum; begrænset til 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Indstil til "false" for at stoppe test af den faktiske vært hos en proxys tildelte udbyder (`GET /models`, ingen API-nøgle) og altid bruge `PROXY_HEALTH_TEST_URL` i stedet. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Når værdien er `false` (standard), er automatiserede tilgængelighedsprober (planlæggeren + knappen "Test alle" for `/api/settings/proxies/auto-test`) **skrivebeskyttede** og ændrer aldrig en proxys status — kun operatøren angiver aktiv/inaktiv, så en ustabil probe ikke kan blokere en tildelt proxy (#6246). Indstil til `true` for at gendanne den tidligere test-og-indstil-adfærd. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Funktionsflag, der kræver aktivt tilvalg (se [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); en tilsidesættelse i kontrolpanelets database har forrang). `true` (eller `1`, `yes`) viser den skrivebeskyttede observation af udgående trafik under en proxypulje i kontrolpanelet (unikke udgående IP'er, forbindelser og det højeste antal observeret bag én IP i løbet af de seneste 24 timer, baseret på proxyloggen). Bruges aldrig til routing. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Indstil til `true` for at lade planlæggeren fjerne proxyer automatisk efter gentagne på hinanden følgende fejl. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Antal på hinanden følgende fejl, før planlæggeren automatisk fjerner en proxy (når `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Indstil til `true` for at lade planlæggeren blødt deaktivere (status `dead`, aldrig slettet) en proxy efter gentagne på hinanden følgende fejl i stedet for at fjerne den. Et ikke-destruktivt alternativ til `PROXY_AUTO_REMOVE`: Proxyen fjernes straks fra pulje-/rotationsopløsningen (filteret for aktiv status, som bruges af scope-puljeopløsningen, udelukker den allerede) og genaktiveres automatisk, når den igen består proberne. Deler tærsklen `PROXY_AUTO_REMOVE_AFTER`. Hvis begge flag er `true`, har `PROXY_AUTO_REMOVE` forrang. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Tillad, at OAuth- og udbydervalideringsflows omgår en fastlåst proxy og opretter direkte forbindelse, når forudgående kontrol af proxyens tilgængelighed mislykkes. Den gældende prioritetsrækkefølge er tilsidesættelse i funktionsflagdatabasen > miljøvariabel > standardværdi. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 sek.) | `open-sse/services/rateLimitManager.ts` | Maksimal ventetid ved en 429-fejl, før anmodningen mislykkes. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min.) | `open-sse/services/rateLimitManager.ts` | Øvre grænse for, hvor længe en accepteret anmodning må forblive under udførelse, før dens hastighedsbegrænsningsreservation udløber — afkoblet fra ventetidsbudgettet for køen, så en langsom hentestart på ikke-inkrementelle gateways ikke udløber (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deaktiveret) | `open-sse/services/rateLimitManager.ts` | Grænse for adgang til køen: Afvis med en 429 `queue_full`, når dette antal anmodninger allerede er i kø. `0` = ubegrænset (standard). | -| `RATE_LIMIT_AUTO_ENABLE` | _(ikke angivet)_ | `open-sse/services/rateLimitManager.ts` | Gennemtving aktivering/deaktivering af sikkerhedsnettet for automatisk hastighedsbegrænsning uanset den gemte indstilling i kontrolpanelet. Accepterer `true`/`1`/`on` for at gennemtvinge aktivering og `false`/`0`/`off` for at gennemtvinge deaktivering. | -| `PROVIDER_COOLDOWN_ENABLED` | _(ikke angivet → fra)_ | `open-sse/services/providerCooldownTracker.ts` | Global sporing af nedkøling på tværs af anmodninger for udbydere/forbindelser, som kræver aktivt tilvalg. FRA som standard (overlapper nedkøling af forbindelser/udbyderafbryder). Accepterer `true`/`1`/`on` for at aktivere. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimumsnedkøling (ms), før en mislykket udbyder/forbindelse prøves igen. Skaleres eksponentielt ved på hinanden følgende fejl. Bruges kun, når `PROVIDER_COOLDOWN_ENABLED` er aktiveret. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min.) | `open-sse/services/providerCooldownTracker.ts` | Maksimal grænse for nedkøling (ms), før en mislykket udbyder/forbindelse prøves igen uanset omstændighederne. Bruges kun, når `PROVIDER_COOLDOWN_ENABLED` er aktiveret. | -| `STREAM_RECOVERY_ENABLED` | _(ikke angivet → fra)_ | `src/lib/resilience/settings.ts` (startværdi) → `open-sse/services/streamRecovery.ts` (logik) | **Hvad:** transparent genoprettelse af afbrudte upstream-streams (port fra free-claude-code). Tilbageholder det indledende SSE-vindue i op til `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), så en afbrydelse _før commit_ — en afbrydelse, der sker, før nogen bytes når klienten — genåbnes og prøves igen usynligt. **Hvornår bør den aktiveres:** ustabile/upstreams, der ofte afbrydes med 0 bytes ved streamstart; lad den være FRA, hvis du ikke kan acceptere op til 750 ms ekstra tid til første token for hver stream. Accepterer `true`/`1`/`on`. Angiver startværdien for den gemte robusthedsindstilling; indstillingen i kontrolpanelet har forrang, når den først er angivet. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(ikke angivet → fra)_ | `src/lib/resilience/settings.ts` (startværdi) → `open-sse/services/streamRecovery.ts` (logik) | **Hvad:** fortsættelse midt i streamen (fase 4.4) — efter en afbrydelse _efter commit_ (bytes er allerede nået frem til klienten) foretages en ny anmodning med den delvise tekst som assistent-prefill, hvorefter det manglende suffiks sammenføjes. Kun OpenAI-kompatible streams med ren tekst; aktiveres aldrig, mens et værktøjskald er i gang. **Hvornår bør den aktiveres:** lange genereringer, der afbrydes midt i et svar, og hvor du accepterer, at den gendannede slutning ankommer samlet i stedet for token for token. Uafhængig af `STREAM_RECOVERY_ENABLED` (anden risikoprofil). Accepterer `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(ikke angivet → fra)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Overvågning af nyttigt output for aktive streams, som kræver aktivt tilvalg. Registrerer streams, der fortsætter med at sende fragmenter, men forbliver under den konfigurerede hastighed for assistentoutput; heartbeats, forbrugshændelser, tomme deltaer samt værktøjs-/ræsonneringsfaser giver sig ikke ud for at være fremskridt. Adskilt fra timeouts for inaktivitet og absolutte deadlines. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Respitperiode før evaluering af gennemløb, begrænset til 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Rullende vindue for nyttigt output, begrænset til 1000–600000 ms; der kræves ét komplet vindue før afbrydelse. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimal bytehastighed for UTF-8-assistentoutput (konservativ tokenindikator), begrænset til 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Mindste nyttige outputprøve større end nul, der anses for målbar, begrænset til 1–1000000 bytes. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Forskydningsinterval (ms) mellem sundhedstjek af udbydertokens ved opstart. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimal randomiseret variation (ms), der føjes oven i `HEALTHCHECK_STAGGER_MS` mellem sundhedstjek af udbydertokens for at forhindre spidsbelastning (problem #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maksimal randomiseret variation (ms), der føjes oven i `HEALTHCHECK_STAGGER_MS` mellem sundhedstjek af udbydertokens for at forhindre spidsbelastning (problem #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Batchstørrelse for samtidige tjek under gennemløbet af token-sundhedstjek ved opstart; større værdier kontrollerer flere forbindelser parallelt, mens mindre værdier reducerer spidsbelastningen (problem #7875, regression af #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Antal automatiske genforsøg ved modelspecifikke nedkølingssvar, før en fejl returneres til klienten. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maksimalt backoff-interval (sekunder) mellem genforsøg efter nedkøling. Begrænses til denne værdi uanset upstream-værdien `Retry-After`. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Proxy-URL til Headroom-tokenbesparelse. Kontrolpanelets livscyklus (`api/headroom/*`) starter som standard en lokal `headroom-ai` CLI på loopback; tilsidesæt kun for at pege på en ekstern Docker-sidecarproxy. | - -### Konstanter til finjustering af stream-genoprettelse - -Adfærden for tilbageholdelse under genoprettelse finjusteres med hardcodede konstanter i -`open-sse/config/constants.ts` (`STREAM_RECOVERY`), som vises her til orientering — +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ------------------------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Timeout for fast-fail-tilstandskontrol. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Tidsvindue (i timer) til beregning af den gennemsnitlige latenstid for proxykandidater i den latensoptimerede puljestrategi. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Cache-TTL for resultatet af tilstandskontrollen. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Cache-TTL for mislykkede proxytilstandskontroller. Hold denne kortere end `PROXY_HEALTH_CACHE_TTL_MS`, så midlertidige proxy-timeouts ved høj samtidighed hurtigt forsøges igen, uden at fast-fail deaktiveres for proxyer, der reelt er utilgængelige. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Angiv `false` for at deaktivere den baggrundskørende planlægger for proxytilstand, som regelmæssigt kontrollerer registrerede proxyer. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval i ms mellem gennemløb af den baggrundskørende tilstandsplanlægger (minimum `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Mål for tilgængelighedstest, der bruges af planlæggeren og endpointet `/api/settings/proxies/auto-test`. Angiv en intern/selvhostet URL for at undgå den offentlige standardadresse. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Antal tests, der startes samtidigt pr. batch og deles af planlæggeren og endpointet `/api/settings/proxies/auto-test`. Afrundes nedad til mindst 1 og begrænses til højst 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Forsinkelse i ms mellem afsendelsen af to tests i en batch. Uden denne forsinkelse afsendes hele batchen samtidigt, og en delt udgående IP-adresse kan udløse hastighedsbegrænsning hos målet. Angiv `0` for at deaktivere intervallet; begrænset til højst 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Angiv "false" for at stoppe test af den faktiske vært hos den udbyder, som en proxy er tildelt (`GET /models`, ingen API-nøgle), og brug altid `PROXY_HEALTH_TEST_URL` i stedet. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Når værdien er `false` (standard), er automatiserede tilgængelighedstests (planlæggeren + knappen "Test alle" for `/api/settings/proxies/auto-test`) **skrivebeskyttede** og ændrer aldrig en proxys status — kun operatøren angiver aktiv/inaktiv, så en ustabil test ikke kan efterlade en tildelt proxy ubrugelig (#6246). Angiv `true` for at gendanne den tidligere funktionalitet med test og statusændring. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Funktionsflag, der skal tilvælges (se [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); en tilsidesættelse i dashboardets database har forrang). `true` (eller `1`, `yes`) viser den skrivebeskyttede observation af puljens udgående trafik under en proxypulje i dashboardet (forskellige udgående IP-adresser, forbindelser og det højeste antal observeret bag én IP-adresse inden for de seneste 24 timer baseret på proxyloggen). Bruges aldrig til routing. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Angiv `true` for at lade planlæggeren automatisk fjerne proxyer efter gentagne fejl i træk. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Antal fejl i træk, før planlæggeren automatisk fjerner en proxy (når `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Angiv `true` for at lade planlæggeren deaktivere en proxy midlertidigt (status `dead`, slettes aldrig) efter gentagne fejl i træk i stedet for at fjerne den. Et ikke-destruktivt alternativ til `PROXY_AUTO_REMOVE`: Proxyen udgår straks af pulje-/rotationsopløsningen (filteret for aktiv status, der bruges af opløsningen af omfangspuljer, udelukker den allerede) og genaktiveres automatisk, når den igen består sonderinger. Deler tærsklen `PROXY_AUTO_REMOVE_AFTER`. Hvis begge flag er `true`, har `PROXY_AUTO_REMOVE` forrang. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Tillad OAuth- og udbydervalideringsflows at omgå en fastgjort proxy og oprette direkte forbindelse, når indledende kontroller af proxyens tilgængelighed mislykkes. Den gældende prioritetsrækkefølge er tilsidesættelse i funktionsflagdatabasen > miljøvariabel > standardværdi. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 sek.) | `src/lib/resilience/settings.ts` | Standardbudget for **køventetid**: Hvor længe en anmodning må vente på en udbyderplads og stå i kø, før den afvises uden nogensinde at nå den overordnede tjeneste. Timeren ryddes, når jobbet begynder at køre — udførelsen begrænses separat af `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Miljøvariablen angiver kun standardværdien: En permanent `resilienceSettings.requestQueue.maxWaitMs` og derefter en forbindelsesspecifik `rateLimitOverrides.maxWaitMs` har hver især forrang. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min.) | `open-sse/services/rateLimitManager.ts` | Øvre grænse for, hvor længe en godkendt anmodning må være under udførelse, før dens hastighedsbegrænsningsreservation udløber — adskilt fra køventetidsbudgettet, så en langsom start på hentning fra ikke-inkrementelle gateways ikke medfører timeout (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deaktiveret) | `open-sse/services/rateLimitManager.ts` | Grænse for adgang til køen: Afvis med en 429 `queue_full`, når så mange anmodninger allerede står i kø. `0` = ubegrænset (standard). | +| `RATE_LIMIT_AUTO_ENABLE` | _(ikke angivet)_ | `open-sse/services/rateLimitManager.ts` | Gennemtving aktivering/deaktivering af sikkerhedsnettet til automatisk aktivering af hastighedsbegrænsning uanset den permanente Dashboard-indstilling. Accepterer `true`/`1`/`on` for at gennemtvinge aktivering og `false`/`0`/`off` for at gennemtvinge deaktivering. | +| `PROVIDER_COOLDOWN_ENABLED` | _(ikke angivet → deaktiveret)_ | `open-sse/services/providerCooldownTracker.ts` | Global sporing af nedkøling for udbydere/forbindelser på tværs af anmodninger, som aktivt skal tilvælges. Deaktiveret som standard (overlapper med forbindelsesnedkøling/udbyderafbryder). Accepterer `true`/`1`/`on` for at aktivere. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimumsnedkøling (ms), før en mislykket udbyder/forbindelse forsøges igen. Skaleres eksponentielt med antallet af fejl i træk. Bruges kun, når `PROVIDER_COOLDOWN_ENABLED` er aktiveret. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min.) | `open-sse/services/providerCooldownTracker.ts` | Maksimalt loft for nedkølingsperiode (ms), før en mislykket udbyder/forbindelse forsøges igen uanset hvad. Bruges kun, når `PROVIDER_COOLDOWN_ENABLED` er aktiveret. | +| `STREAM_RECOVERY_ENABLED` | _(ikke angivet → fra)_ | `src/lib/resilience/settings.ts` (startværdi) → `open-sse/services/streamRecovery.ts` (logik) | **Hvad:** transparent genoprettelse af afbrudte upstream-streams (portering fra free-claude-code). Tilbageholder det indledende SSE-vindue i op til `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), så en afbrydelse _før commit_ — som sker, før nogen bytes når klienten — genåbnes og forsøges igen usynligt. **Hvornår bør det aktiveres:** ustabile upstreams, der ofte afbrydes med 0 bytes ved streamens start; lad funktionen være FRA, hvis du ikke kan acceptere op til 750 ms ekstra tid til første token for hver stream. Accepterer `true`/`1`/`on`. Angiver startværdien for den gemte robusthedsindstilling; indstillingen i dashboardet har forrang, når den først er angivet. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(ikke angivet → fra)_ | `src/lib/resilience/settings.ts` (startværdi) → `open-sse/services/streamRecovery.ts` (logik) | **Hvad:** fortsættelse midt i streamen (fase 4.4) — efter en afbrydelse _efter commit_ (bytes er allerede nået frem til klienten) foretages en ny anmodning med den delvise tekst som assistant-prefill, hvorefter det manglende suffiks sammenføjes. Kun OpenAI-kompatible streams med almindelig tekst; aktiveres aldrig, mens et værktøjskald er i gang. **Hvornår bør det aktiveres:** lange genereringer, der afbrydes midt i et svar, og hvor du accepterer, at den genoprettede afslutning ankommer samlet i stedet for token for token. Uafhængig af `STREAM_RECOVERY_ENABLED` (anden risikoprofil). Accepterer `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(ikke angivet → fra)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Valgfri overvågning af nyttigt output fra aktive streams. Registrerer streams, som fortsat sender chunks, men forbliver under den konfigurerede outputhastighed for assistenten; heartbeats, forbrugshændelser, tomme deltaer samt værktøjs- og ræsonneringsfaser fremstår ikke fejlagtigt som fremskridt. Adskilt fra timeouts for inaktivitet og absolutte tidsfrister. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Henstandsperiode før evaluering af gennemløb, begrænset til 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Rullende vindue for nyttigt output, begrænset til 1000–600000 ms; ét komplet vindue kræves før afbrydelse. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimumshastighed i UTF-8-bytes for assistentoutput (konservativ tokenindikator), begrænset til 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Mindste nyttige outputprøve større end nul, der betragtes som målbar, begrænset til 1–1000000 bytes. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Forskydningsinterval (ms) mellem sundhedstjek af udbydertokens ved opstart. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimum for tilfældig jitter (ms), der lægges oven i `HEALTHCHECK_STAGGER_MS` mellem sundhedstjek af udbydertokens for at forhindre pludselige belastningsspidser (Issue #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maksimum for tilfældig jitter (ms), der lægges oven i `HEALTHCHECK_STAGGER_MS` mellem sundhedstjek af udbydertokens for at forhindre pludselige belastningsspidser (Issue #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Batchstørrelse for samtidige kontroller under gennemgangen af tokensundhed ved opstart; større værdier kontrollerer flere forbindelser parallelt, mens mindre værdier reducerer spidsbelastningen (Issue #7875, regression af #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Antal automatiske genforsøg ved modelspecifikke nedkølingssvar, før en fejl returneres til klienten. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maksimalt backoff-interval (sekunder) mellem genforsøg efter nedkøling. Begrænses af denne værdi uanset den overordnede `Retry-After`. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL til Headroom-proxyen til tokenbesparelse. Dashboardets livscyklus (`api/headroom/*`) starter som standard en lokal `headroom-ai`-CLI på loopback; tilsidesæt kun for at pege på en ekstern Docker-sidecarproxy. | + +### Konstanter til finjustering af streamgenoprettelse + +Tilbageholdelsesadfærden ved genoprettelse finjusteres med hardcodede konstanter i +`open-sse/config/constants.ts` (`STREAM_RECOVERY`), som vises her som reference — ændring af dem kræver en kodeændring, ikke en miljøvariabel: - `STREAM_RECOVERY.HOLDBACK_MS = 750` — hvor længe det indledende SSE-vindue tilbageholdes, - så en tidlig afbrydelse kan forsøges igen, før nogen bytes sendes til klienten. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — fast maksimum for det tilbageholdte vindue; send - (tømning + direkte videresendelse), så snart så mange bytes er akkumuleret, uanset timeren. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — maksimalt antal transparente genåbninger af upstream- - streamen, mens tilbageholdelsen endnu ikke er sendt. - -> **Hastighedsgrænse pr. udbyder med glidende vindue (ingen miljøvariabel):** fallback- -> funktionen til hastighedsbegrænsning pr. udbyder med glidende vindue, som er porteret fra FCC, findes i koden + så en tidlig afbrydelse kan forsøges igen, før nogen byte overføres til klienten. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — fast øvre grænse for det tilbageholdte vindue; overfør + (tøm buffer + videresend), så snart så mange bytes er akkumuleret, uanset timeren. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — maksimalt antal transparente genåbninger af den overordnede + stream, mens tilbageholdelsen endnu ikke er overført. + +> **Glidende vindueshastighedsgrænse pr. udbyder (ingen miljøvariabel):** den FCC-porterede +> _fallback_ for glidende vindueshastighedsgrænse pr. udbyder findes i koden > (`open-sse/services/providerDefaultRateLimit.ts`, forbundet via -> `open-sse/services/rateLimitManager.ts`), men leveres med et **tomt standard-map** -> og har **ingen miljøvariabel for operatører** i dag — den aktiveres kun via en test-hook / +> `open-sse/services/rateLimitManager.ts`), men leveres med et **tomt standardmap** +> og har **ingen miljøvariabel til operatører** i dag — den aktiveres kun via en test-hook / > kodeændring. Den er med vilje ikke angivet i tabellen ovenfor. Relæbegrænseren pr. `(token, IP)`, > som _har_ en indstilling, er `RELAY_IP_PER_MINUTE` (§3 Netværk og porte). @@ -1180,32 +1189,33 @@ Adfærden for tilbageholdelse under genoprettelse finjusteres med hardcodede kon > [!CAUTION] > Disse variabler genererer **detaljeret output** og kan lække følsomme data. **Aktivér dem aldrig i produktion.** -| Variabel | Standardværdi | Kildefil | Beskrivelse | -| ------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(ikke angivet)_ | `open-sse/executors/cursor.ts` | Angiv `1` for at aktivere detaljerede logfiler fra Cursor-eksekveringsenheden (afkodede SSE-fragmenter osv.). | -| `CURSOR_STREAM_DEBUG` | _(ikke angivet)_ | `open-sse/executors/cursor.ts` | Bagudkompatibelt alias for `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(ikke angivet)_ | `open-sse/executors/cursor.ts` | Valgfri filsti, som modtager rå, afkodede Cursor-fragmenter, når `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Timeout for inaktiv stream (ms) for Cursor-eksekveringsenheden. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Respitperiode (ms) efter en blød composer kv_after_text-terminator, når der stadig er bufferlagrede bytes — giver et efterfølgende exec_mcp-værktøjskald tid til at færdiggøre sin frame. | -| `CURSOR_TOOL_DIRECTIVE` | aktiveret (`!== "0"`) | `open-sse/executors/cursor.ts` | Værktøjsbekræftelsesdirektiv, der får composer-2.5 til pålideligt at foretage værktøjskald. Angiv `0` for at deaktivere det. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(ikke angivet)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Operatørdefineret systemprompttekst, der føjes til systemmeddelelsen EFTER oversættelsen (injektion efter oversættelse), og som når codex/Responses- og `/v1/messages`-stierne. Bruges også som direktivpræfiks, der fjernes fra gentagne systempræambelblokke. Lad variablen være udefineret for at deaktivere funktionen. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Timeout pr. billede (ms) ved hentning af eksternt `image_url`-visionsinput. | -| `CURSOR_STATE_DB_PATH` | _(automatisk fundet)_ | `open-sse/utils/cursorVersionDetector.ts` | Tilsidesæt opslaget i Cursor IDE-tilstandsdatabasen, der bruges til registrering af IDE-versionen. | -| `CURSOR_AGENT_CLI_VERSION` | _(registrér / fastlås)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI-build-id (`YYYY.MM.DD-`) for `x-cursor-client-version: cli-…` ved Agent Run. | -| `CURSOR_AGENT_BIN` | _(ikke angivet)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sti til Cursor Agent-binærfilen, der bruges til billedgenerering. Hvis den ikke er angivet, bruger handleren `providerSpecificData.agentBin` og derefter PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Maksimal samlet tid pr. billede (ms) for Cursor Agent-billedjob. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Begrænsning af samtidighed for delte pladser til Cursor-billedjob. | -| `CURSOR_IMG_MODEL` | anmodning / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Tilsidesæt Cursor CLI-parameteren `--model` for billedjob. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Interval (ms) for kontrol af resultater fra UC-billedgenerering (uncensored.com). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Maksimal samlet tid (ms) for kontrol af resultater fra UC-billedgenerering. | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Interval (ms) for kontrol af resultater fra UC-videogenerering (uncensored.com). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Maksimal samlet tid (ms) for kontrol af resultater fra UC-videogenerering. | -| `CURSOR_DATA_DIR` | _(automatisk fundet)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Tilsidesæt Cursor Agent CLI-datamappen (`…/versions/`); samme variabel, som den officielle agent bruger. | -| `CURSOR_TOKEN` | _(ikke angivet)_ | `scripts/ad-hoc/cursor-tap.cjs` | Direkte Cursor-bearer-token, der bruges af udviklerværktøjer. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | deaktiveret (tilvælges via `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Log markører for indholdstype og -længde for store chatpayloads, når `"1"` er angivet. Deaktiveret som standard for at reducere støj i logfilerne. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(ikke angivet)_ | `open-sse/handlers/responseTranslator.ts` | Angiv `true` for at logge detaljer om Responses API SSE→JSON-oversættelsen. | -| `DEBUG_CLAUDE_NONSTREAM` | _(ikke angivet)_ | `open-sse/handlers/responseTranslator.ts` | Angiv `true` for at synliggøre tomme textContent-fragmenter i oversættelsesstien for Claude-svar (kun til fejlfinding). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(ikke angivet)_ | E2E-testmiljø | Angiv `true` for at aktivere E2E-testtilstand (lempet godkendelse, testhooks). | +| Variabel | Standardværdi | Kildefil | Beskrivelse | +| ------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(ikke angivet)_ | `open-sse/executors/cursor.ts` | Angiv `1` for at aktivere detaljerede logfiler fra Cursor-eksekveringskomponenten (afkodede SSE-fragmenter osv.). | +| `CURSOR_STREAM_DEBUG` | _(ikke angivet)_ | `open-sse/executors/cursor.ts` | Bagudkompatibelt alias for `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(ikke angivet)_ | `open-sse/executors/cursor.ts` | Valgfri filsti, som modtager rå, afkodede Cursor-fragmenter, når `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Timeout for inaktiv stream (ms) for Cursor-eksekveringskomponenten. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Frist (ms) efter en blød composer-terminator af typen kv_after_text, når der fortsat er bufferlagrede bytes — giver et efterfølgende exec_mcp-værktøjskald tid til at færdiggøre sin frame. | +| `CURSOR_TOOL_DIRECTIVE` | aktiveret (`!== "0"`) | `open-sse/executors/cursor.ts` | Værktøjsbekræftelsesdirektiv, som får composer-2.5 til pålideligt at udføre værktøjskald. Angiv `0` for at deaktivere det. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(ikke angivet)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Operatørdefineret systemprompttekst, der føjes til systemmeddelelsen EFTER oversættelse (injektion efter oversættelse), og som når codex/Responses- og `/v1/messages`-stierne. Bruges også som direktivpræfikset, der fjernes fra gentagne systempræambelblokke. Lad den være udefineret for at deaktivere funktionen. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (fra) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Angiv `1` for at fjerne gentagne systemprompt-præambelblokke fra starten af en openai→claude-stream. Slået fra som standard — heuristikkerne er udformet efter engelsk prosa og ændrer responsens payload, så et svar, der legitimt begynder med et sådant afsnit, ville miste det. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Timeout pr. billede (ms) ved hentning af eksternt `image_url`-vision-input. | +| `CURSOR_STATE_DB_PATH` | _(registreres automatisk)_ | `open-sse/utils/cursorVersionDetector.ts` | Tilsidesæt opslaget i Cursor IDE-tilstandsdatabasen, der bruges til registrering af IDE-versionen. | +| `CURSOR_AGENT_CLI_VERSION` | _(registrér/fastlås)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI-build-id (`YYYY.MM.DD-`) for `x-cursor-client-version: cli-…` ved Agent Run. | +| `CURSOR_AGENT_BIN` | _(ikke angivet)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sti til Cursor Agent-binærfilen, der bruges til billedgenerering. Hvis den ikke er angivet, bruger handleren `providerSpecificData.agentBin` og derefter PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Maksimal kørselstid pr. billede (ms) for Cursor Agent-billedjobs. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Begrænsning af samtidighed for delte brugerpladser til Cursor-billedjobs. | +| `CURSOR_IMG_MODEL` | anmodning / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Tilsidesæt Cursor CLI `--model` for billedjobs. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Interval for resultatpolling (ms) ved UC-billedgenerering (uncensored.com). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Maksimal kørselstid (ms) for resultatpolling ved UC-billedgenerering. | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Interval for resultatpolling (ms) ved UC-videogenerering (uncensored.com). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Maksimal kørselstid (ms) for resultatpolling ved UC-videogenerering. | +| `CURSOR_DATA_DIR` | _(registreres automatisk)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Tilsidesæt Cursor Agent CLI-datamappen (`…/versions/`); samme variabel, som den officielle agent bruger. | +| `CURSOR_TOKEN` | _(ikke angivet)_ | `scripts/ad-hoc/cursor-tap.cjs` | Direkte Cursor-bærertoken, der bruges af udviklerværktøjer. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | deaktiveret (tilvælges via `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Log markører for indholdstype og længde for store chat-payloads, når `"1"` er angivet. Slået fra som standard for at reducere støj i logfilerne. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(ikke angivet)_ | `open-sse/handlers/responseTranslator.ts` | Angiv `true` for at logge oplysninger om Responses API SSE→JSON-oversættelse. | +| `DEBUG_CLAUDE_NONSTREAM` | _(ikke angivet)_ | `open-sse/handlers/responseTranslator.ts` | Angiv `true` for at vise tomme textContent-fragmenter i Claude-responsoversættelsesstien (kun til fejlfinding). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(ikke angivet)_ | E2E-testmiljø | Angiv `true` for at aktivere E2E-testtilstand (lempet godkendelse, test-hooks). | --- diff --git a/docs/i18n/da/docs/reference/FEATURE_FLAGS.md b/docs/i18n/da/docs/reference/FEATURE_FLAGS.md index 89e8642abd34..839459da5073 100644 --- a/docs/i18n/da/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/da/docs/reference/FEATURE_FLAGS.md @@ -44,122 +44,124 @@ Et boolean-flag betragtes som **aktiveret**, når dets effektive værdi er `"tru ## Flagkatalog -72 flag fordelt på 6 kategorier. **Standard** er definitionens standardværdi — den værdi, -der bruges, når der hverken findes en DB-tilsidesættelse eller en miljøvariabel. +74 flag fordelt på 6 kategorier. **Standardværdi** er definitionens standardværdi — den værdi, +der bruges, når hverken en DB-tilsidesættelse eller en miljøvariabel er angivet. ### Sikkerhed (10) -| Nøgle | Type | Standard | Beskrivelse | -| --------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Kræv en API-nøgle til alle indgående anmodninger. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Aktivér rensning af input for alle anmodninger. | -| `INJECTION_GUARD_MODE` | enum | `off` | Tilstand for beskyttelse mod prompt-injektion. Værdier: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Maskér PII i anmodninger (uafhængigt af `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Rens PII fra udbydersvar. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Tilstand for rensning af PII i svar. Værdier: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Bloker udgående anmodninger til private/interne IP-intervaller. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Tillad godkendte dashboardbrugere at få vist gemte API-nøgler i stedet for kun at se maskerede værdier. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Medtag kontopræfikset i AUTH-loglinjer (f.eks. "Bruger -konto: abc12345..."). Deaktiveret som standard, så kontoidentifikatorer maskeres i delte/multitenant-proceslogfiler. Uafhængigt af fejlfindingstilstand; aktivering af fejlfindingstilstand viser ikke dette. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Når OIDC er aktiveret, deaktiveres login med adgangskode, så brugere kun kan godkendes via OIDC Single Sign-On. Når det er deaktiveret (standard), er både login med adgangskode og OIDC tilgængelige. | - -### Netværk (15) - -| Nøgle | Type | Standard | Genstart | Beskrivelse | -| ----------------------------------------------- | ------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `ENABLE_TLS_FINGERPRINT` | boolesk | `false` | ✓ | Aktivér skjult tilstand for TLS-fingeraftryk. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolesk | `false` | | Tillad, at ruterne /v1/audio/* bruger OpenAI-kompatible udbydernoder, der hostes uden for localhost. Deaktiveret som standard — dirigering af lyd til en fjernvært ændrer udgående identitet og skal være en udtrykkelig operatørbeslutning. Loopback-noder er altid tilladt og påvirkes ikke. | -| `PROXY_AUTO_SELECT_ENABLED` | boolesk | `false` | | Når der ikke er tildelt en proxy til en forbindelse, vælges den første fungerende proxy fra registreringsdatabasen automatisk. Deaktiveret som standard (ellers bliver enhver proxy i registreringsdatabasen en global reserveløsning — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolesk | `false` | | Tillad OAuth- og udbydervalideringsforløb at omgå en fastgjort proxy og oprette direkte forbindelse, når forhåndskontroller af proxyens tilgængelighed mislykkes. Deaktiveret som standard, fordi dette kan ændre den udgående IP-adresse. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolesk | `true` | | Ved en netværksundtagelse (timeout, afvist/nulstillet forbindelse) for en rotationsudfører med flere konti: Hvis den fejlramte konto ikke har en dedikeret proxy, anvendes en kort nedkølingsperiode, og andre konti uden proxy springes over i resten af anmodningen i stedet for at forsøge hver enkelt igen. Aktiveret som standard (sikkert: ingen ændring af udgående IP-adresse, reducerer kun risikoen for forsinkelse/nedkøling på konti med delt udgående trafik). Deaktivér for at gendanne øjeblikkelig videresendelse ved den første undtagelse fra en konto uden proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolesk | `false` | | Proxypuljer og opencodes rotation pr. konto stopper med at genbruge en proxy, der netop har fejlet (afvist TCP-kontrol eller en 429 modtaget gennem den), i en periode pr. proces, som fordobles ved hver gentagelse op til en maksimumsgrænse. Der skrives ingen proxystatus; når alle kandidater er sat til side, forbliver valget uændret. Deaktiveret som standard. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolesk | `false` | | Vis under en proxypulje i kontrolpanelet, hvor mange observerede udgående IP-adresser der har betjent dens medlemmer i løbet af de seneste 24 timer, og hvor mange forbindelser der brugte dem. Skrivebeskyttet, beregnet ud fra proxyloggen og aldrig brugt til dirigering. Deaktiveret som standard. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolesk | `false` | | For OpenCode-udføreren overvåges den første byte i brødteksten fra et streamet Responses-svar (vindue: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, standard `15000`). En 2xx Responses-stream, der forbliver tavs efter vinduets udløb, behandles som gået i stå: Kontoen sættes på nedkøling, og anmodningen roteres én gang til den næste konto; endnu et stop medfører øjeblikkelig fejl. Deaktiveret som standard: Streams, der går i stå, fortsætter med den nuværende ventetid indtil timeout for streamparathed. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolesk | `false` | | OpenCode-udfører: Ved en 403/451 med et `user_blocked`-afslag (ikke geografisk og ikke en Cloudflare-afvisning af fingeraftryk) sættes den afviste konto på nedkøling, og der roteres til den næste konto højst én gang pr. anmodning; endnu et afslag returneres uændret og uden markering som vellykket. Deaktiveret som standard: Omdirigering uden om en upstream-brugerblokering kan ligne omgåelse og sprede markeringen til hele flåden. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolesk | `false` | | OpenCode-rotation: Efter to på hinanden følgende midlertidige upstream-fejl (5xx eller en tom 400) sættes der en pause ind før den næste konto — 1,5 sek., som fordobles for hver yderligere fejl, begrænset til 6 sek. pr. pause og 10 sek. pr. anmodning; pausen springes over, hvis klienten afbryder forbindelsen. Brødteksten fra fejlen frigives før ventetiden. Deaktiveret som standard: Failover sker fortsat øjeblikkeligt. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolesk | `false` | | OpenCode-rotation: Stop kontobølgen ved den første 429, der klassificeres som en reel hastighedsbegrænsning (`Retry-After`, der kan fortolkes, eller en brødtekst, der nævner en hastigheds-/forbrugsgrænse), og returnér denne upstream-429 uændret. Uklassificerede 429-svar fortsætter rotationen. Deaktiveret som standard: Gratisniveauet er begrænset pr. udgående IP-adresse (#9611), så enhver 429 medfører rotation, og en udtømt bølge returnerer den sidste upstream-429. | -| `MITM_DISABLE_TLS_VERIFY` | boolesk | `false` | ✓ | Deaktivér verificering af TLS-certifikater for MITM-proxyen. **Fare.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolesk | `false` | | Tillad udbyder-URL'er, der peger på private/interne netværk. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolesk | `true` | | Tillad tilføjelse/validering af udbydere på lokale/private adresser (127.0.0.1, localhost, LAN). Aktiveret som standard (lokalt først); deaktivér for streng blokering, der kun tillader offentlige adresser. Cloud-metadata forbliver blokeret. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolesk | `false` | ✓ | Aktivér Claude Code-kompatibel udbydertilstand. | +| Nøgle | Type | Standardværdi | Beskrivelse | +| --------------------------------------- | ------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolesk | `false` | Kræv en API-nøgle til alle indgående anmodninger. | +| `INPUT_SANITIZER_ENABLED` | boolesk | `true` | Aktivér rensning af input for alle anmodninger. | +| `INJECTION_GUARD_MODE` | enum | `off` | Tilstand for beskyttelse mod promptinjektion. Værdier: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolesk | `false` | Maskér personhenførbare oplysninger i anmodninger (uafhængigt af `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolesk | `false` | Fjern personhenførbare oplysninger fra udbydersvar. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Tilstand for rensning af personhenførbare oplysninger i svar. Værdier: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolesk | `true` | Bloker udgående anmodninger til private/interne IP-intervaller. | +| `ALLOW_API_KEY_REVEAL` | boolesk | `false` | Tillad godkendte dashboardbrugere at få vist gemte API-nøgler i stedet for kun at se maskerede værdier. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolesk | `false` | Medtag kontopræfikset i AUTH-loglinjer (f.eks. "Bruger -konto: abc12345..."). Deaktiveret som standard, så konto-id'er maskeres i delte processlogfiler og processlogfiler med flere lejere. Uafhængigt af fejlfindingstilstand; aktivering af fejlfindingstilstand viser ikke disse oplysninger. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolesk | `false` | Når OIDC er aktiveret, deaktiveres adgangskodelogin, så brugere kun kan godkende sig via OIDC Single Sign-On. Når indstillingen er deaktiveret (standard), er både adgangskodelogin og OIDC tilgængelige. | + +### Netværk (16) + +| Nøgle | Type | Standard | Genstart | Beskrivelse | +| ----------------------------------------------- | ------- | -------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Aktivér stealth-tilstand for TLS-fingeraftryk. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Tillad, at /v1/audio/*-ruterne bruger OpenAI-kompatible udbydernoder, der hostes uden for localhost. Deaktiveret som standard — dirigering af lyd til en fjernvært ændrer udgående identitet og skal være en udtrykkelig operatørbeslutning. Loopback-noder er altid tilladt og påvirkes ikke. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Tillad, at POST /v1/rerank (og hukommelsesmotorens loopback-trin til omrangering) bruger OpenAI-kompatible udbydernoder, der hostes uden for localhost. Deaktiveret som standard — dirigering til en fjernvært ændrer udgående identitet og skal være en udtrykkelig operatørbeslutning. Loopback-noder er altid tilladt; fjernnoder skal også overholde udbyderens politik for udgående URL'er. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Når der ikke er tildelt en proxy til en forbindelse, vælges den første fungerende proxy fra registreringsdatabasen automatisk. Deaktiveret som standard (ellers bliver enhver proxy i registreringsdatabasen en global reserve — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Tillad, at OAuth- og udbydervalideringsflows omgår en fastgjort proxy og opretter direkte forbindelse, når forhåndskontroller af proxyens tilgængelighed mislykkes. Deaktiveret som standard, fordi dette kan ændre den udgående IP-adresse. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Ved en netværksfejl (timeout, forbindelse afvist/nulstillet) for en rotationsudfører med flere konti anvendes en kort nedkølingsperiode, når den fejlende konto ikke har en dedikeret proxy, og andre konti uden proxy springes over i resten af anmodningen i stedet for at forsøge hver enkelt igen. Aktiveret som standard (sikkert: ingen ændring af udgående IP-adresse; reducerer kun risikoen for latenstid/nedkøling for konti med delt udgående trafik). Deaktivér for at gendanne øjeblikkelig videreformidling ved den første fejl fra en konto uden proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proxypuljer og opencodes rotation pr. konto stopper med at tilbyde en proxy igen, hvis den netop er fejlet (afvist TCP-sondering eller et 429-svar modtaget gennem den), i en periode pr. proces, der fordobles ved hver gentagelse op til en maksimumgrænse. Der skrives ingen proxystatus; hvis alle kandidater sættes til side, forbliver valget uændret. Deaktiveret som standard. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Vis under en proxypulje i dashboardet, hvor mange observerede udgående IP-adresser der betjente dens medlemmer i løbet af de seneste 24 timer, og hvor mange forbindelser der brugte dem. Skrivebeskyttet, beregnet ud fra proxyloggen og aldrig brugt til dirigering. Deaktiveret som standard. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | For OpenCode-udføreren overvåges den første byte i svarindholdet fra et streamet Responses-svar (vindue: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, standard `15000`). En 2xx Responses-stream, der forbliver tavs efter vinduets udløb, behandles som fastlåst: Kontoen sættes i nedkøling, og anmodningen roteres én gang til den næste konto; endnu en fastlåsning medfører øjeblikkelig fejl. Deaktiveret som standard: Fastlåste streams bevarer den aktuelle ventetid indtil timeout for streamens klargøring. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode-eksekutor: Ved et 403/451-svar med en `user_blocked`-afvisning (ikke geografisk betinget og ikke en Cloudflare-fingeraftryksafvisning) sættes den afviste konto på pause, og der roteres højst én gang pr. anmodning til den næste konto. En anden afvisning returneres uændret uden markering som vellykket. Deaktiveret som standard: Omdirigering uden om en upstream-brugerblokering kan ligne omgåelse og sprede markeringen på tværs af hele kontoflåden. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode-rotation: Efter to på hinanden følgende midlertidige upstream-fejl (5xx eller et tomt 400-svar) ventes der, før den næste konto forsøges — 1,5 s, som fordobles for hver yderligere fejl, begrænset til 6 s pr. pause og 10 s pr. anmodning; springes over, hvis klienten afbryder forbindelsen. Svaret med fejlen frigives før ventetiden. Deaktiveret som standard: Failover forbliver øjeblikkelig. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode-rotation: Stop kontobølgen ved det første 429-svar, der klassificeres som en reel hastighedsbegrænsning (en fortolkbar `Retry-After` eller en svartekst, der nævner en hastigheds- eller forbrugsgrænse), og returnér dette upstream-429-svar uændret. Ved uklassificerede 429-svar fortsætter rotationen. Deaktiveret som standard: Gratisniveauet er begrænset pr. udgående IP-adresse (#9611), så hvert 429-svar udløser rotation, og en udtømt bølge returnerer det seneste upstream-429-svar. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Deaktivér verificering af TLS-certifikater for MITM-proxyen. **Fare.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Tillad udbyder-URL'er, der peger på private/interne netværk. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Tillad tilføjelse/validering af udbydere på lokale/private adresser (127.0.0.1, localhost, LAN). Aktiveret som standard (lokalt først); deaktiver for streng blokering, der kun tillader offentlige adresser. Cloudmetadata forbliver blokeret. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Aktivér Claude Code-kompatibel udbydertilstand. | ### Politikker (5) -| Nøgle | Type | Standard | Beskrivelse | -| ------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Håndhævelsestilstand for politikken for brug af værktøjer. Værdier: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Aktivér automatisk hastighedsbegrænsning baseret på brugsmønstre. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Spring OmniRoutes lokale kontrol af kontekstvindue/maksimalt antal inputtokens over for direkte anmodninger til en enkelt model. Opstrømsgrænser gælder stadig. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Afvis anmodninger før videresendelse, når målmodellen mangler påkrævede funktioner (vision, værktøjer, struktureret output, kontekstvindue). Beskytter direkte anmodninger til en enkelt udbyder, som omgår kombinationslagets kompatibilitetsfilter. | -| `RADAR_ENABLED` | boolean | `false` | Aktivér OmniRoute Radar-modulet (skærmbilleder med katalogfeed og synkronisering). Deaktiveret som standard; aktivering låser kun brugergrænsefladen op — datasynkronisering kræver stadig særskilt tilvalg. | - -### Kørselstid (32) - -| Nøgle | Type | Standardværdi | Genstart | Beskrivelse | -| ------------------------------------------- | ------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Generér og indsæt samtaleresuméer, når kombinationsrouting skifter model. Deaktivér for at behandle modelskift uafhængigt og forhindre baggrundsanmodninger om overdragelse for alle eksisterende og fremtidige kombinationer. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Fjern interne outputelementer fra kommentarfasen i passthrough-streams fra Responses API, før de videresendes til klienter. Deaktivér for at modtage rå kommentarer fra upstream. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Håndhæv omfangsbegrænsninger for adgang til MCP-værktøjer. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Komprimer beskrivelser af MCP-værktøjer for at reducere tokenforbruget. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Aktivér behandling af baggrundsopgaver under kørsel. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Deaktivér alle baggrundstjenester (opdatering af kvoter, synkronisering osv.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Hav tillid til RTK-filtre på projektniveau uden validering. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Start WebSocket-serveren til realtidsdashboardet ved import (port 20132 som standard). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Tillad Codex at bruge Responses-over-WebSocket-transporten. Når den er slået fra, falder Codex tilbage til HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Tillad Codex at bruge den lokale app-server WebSocket JSON-RPC-transport (codexTransport=app-server). Når den er slået fra, falder forbindelser, der har tilvalgt app-server, tilbage til Codex' øvrige transporter. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Route anmodninger med opbrugt budget til nødudbyderen/-modellen med gratis fallback. (Se [Fallback ved nødbudget](#emergency-budget-fallback) nedenfor.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Aktivér transparent tidlig gentagelse for afkortede upstream-SSE-streams, før nogen svarbytes når klienten. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Tillad streamgenoprettelse at genanmode om og sammenføje et svar, efter at bytes allerede er nået frem til klienten. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Gør fortsættelse midt i en stream sikker for værktøjskald: Genoptag aldrig en afbrudt stream, når et værktøjskald er blevet udsendt (igangværende eller allerede afsluttet med finish_reason tool_calls), og luk efter én tom fortsættelse i stedet for at bruge hele budgettet. Slået fra: udgivelsesadfærd. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Skift én gang til en søskendeforbindelse, når en SSE-stream lukkes, før den har udsendt en brugbar frame, og den begrænsede gentagelse på samme forbindelse er opbrugt. Hvis der ikke findes en brugbar søskendeforbindelse, returneres den oprindelige `STREAM_EARLY_EOF` 502. Slået fra som standard: Tidlig EOF forbliver terminal efter gentagelsen på samme forbindelse. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Inkludér visningsvenlige navnefelter i svar fra `/v1/models`. Deaktivér for klienter, der kun forventer model-id'er. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Styrer, hvordan model-id'er får præfiks i /v1/models. 'dual' (standard) udsender både aliaspræfikser og kanoniske udbyder-id-præfikser af hensyn til bagudkompatibilitet. 'alias' udsender kun det korte aliaspræfiks (f.eks. ds-web/model, ikke deepseek-web/model). 'canonical' udsender kun det fulde udbyder-id-præfiks. Værdier: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Aktivér periodisk ELO-synkronisering af Arena AI-ranglisten til rangering af modelintelligens. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Annoncér spejl-id'erne `claude//` på `/v1/models`, så Claude Code-gatewayens modelregistrering viser ikke-Claude-modeller. Det globale niveau i styringen med tre niveauer (miljøvariablen har forrang over dashboardtilsidesættelsen). Se [Konfiguration af Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Hovedafbryder for gatewayaliaserne no-think//. Slået til (standard): /v1/models annoncerer en variant uden tænkning for alle kvalificerede Claude-modeller med tænkefunktion, og et no-think/-id sendt i en anmodning fortolkes som den rigtige model med ræsonnering undertrykt. Slået fra: Ingen varianter annonceres, og et no-think/-id behandles som ethvert andet ukendt model-id. Til-/fravalget ModelSpec.noThinkingAlias for hver model gælder stadig, mens dette er slået til. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Deaktivér genereringen af varianter med forskellige tænkeniveauer (f.eks. -low, -medium, -high) i /v1/models-kataloget. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Aktivér adaptive virtuelle adgangsbaner pr. tenant til udbyder-dispatch (#9654): Én tenants belastningsspids medfører ikke længere 503-fejl for en anden. Miljøvariablen OMNIROUTE_CHAT_VIRTUAL_LANES har forrang over denne dashboardtilsidesættelse. Ændringer træder i kraft ved genstart af serveren. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Annoncér spejl-id'erne / på /v1/models for modeller, hvis kanoniske ejer ikke har aktive legitimationsoplysninger, men som routes af en passthrough-gateway med aktive legitimationsoplysninger. Advarsel: Tilføjer katalogposter for alle klienter, når funktionen aktiveres globalt. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Aktivér saldoregistrering for New-API / One-API / Sub2API-aggregatorkompatible noder. Når dette er aktiveret, rapporterer kompatible noder med aggregatorflaget angivet deres saldo i dashboardet og ved kvoteprækontrol af routing. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Fortsæt ikke-streamende, serverejede værktøjskald, indtil modellen returnerer et svar, som klienten kan bruge. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Søgestatistik og seneste søgninger tæller kun udbydere, der stadig har en aktiv forbindelse (udbydere uden nøgle såsom duckduckgo-free tæller altid). Når funktionen er slået fra, beholdes alle gemte søgerækker med et udbyder-id. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Dashboardets udbydersider: Vis kun mærket Gratis ved signaler, som udbyderen respekterer — ignorer heuristikken for visningsnavne, ikke-booleske gratisfelter og :free-suffikser hos registrerede udbydere uden et dokumenteret gratis niveau. Når funktionen er slået fra, bevares den historiske regel for mærket. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Ved aggregerede utilgængelighedssvar med 429/503 skal `Retry-After` udelades, når der ikke kendes et konkret fremtidigt tidspunkt for et nyt forsøg (i stedet for et syntetisk 1s), `error.retry_after_provenance` (`signal` \| `none`) skal tilføjes, og kombinationens dræningsstier skal kunne læse tekstbaserede hints om nye forsøg fra JSON- og klartekst-upstream-svartekster. Feltet vises kun i svar oprettet af `unavailableResponse()`; andre 429/503-svartekster er uændrede. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Når et `priority`-kombinationsmål, der er markeret til kun at falde tilbage ved opbrugt kvote, stopper kombinationen af en årsag, som beviseligt ikke er kvoterelateret (udbyderens effektafbryder er åben, prædiktiv forsinkelsesudeladelse), skal der svares med 502 i stedet for den kvotelignende 503. Stop som følge af spærring, nedkøling, utilgængelighed, opbrugte ressourcer og samtidighedsgrænser beholder 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Et rent Mistral 401-svar (`{"detail":"Unauthorized"}`, uden et eksplicit godkendelsessignal) er identisk for en tilbagekaldt nøgle og for en opbrugt kvote. Når funktionen er slået til, nedkøles forbindelsen i stedet for at blive parkeret som `expired`, højst 3 gange i timen pr. forbindelse. Den næste hændelse parkerer den, så en tilbagekaldt nøgle stadig konvergerer. Slået fra som standard: Hvert rent Mistral 401-svar parkerer forbindelsen som før. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Hent det aktive xAI-modelkatalog for `xai-oauth`-forbindelser fra `https://api.x.ai/v1/models` ved hjælp af OAuth-bearer-tokenet i stedet for den fastlåste statiske startliste. Slået fra som standard: `xai-oauth` fortsætter med at levere den statiske startliste uændret. Ved enhver fortolkningsfejl falder registreringen tilbage til startlisten (det er ikke verificeret, om x.ai accepterer en OAuth-bearer på dette endpoint). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Lad den automatiske oprydning slette afsluttede (completed/failed/cancelled/expired) Batch API-job, der er ældre end `OMNIROUTE_BATCH_RETENTION_DAYS`, sammen med deres kontrolpunkter pr. linje, og ryd BLOB-indholdet i uploadede filer efter deres egen `expires_at`. Slået fra som standard: Alle eksisterende installationer beholder disse data præcis som før, indtil en operatør tilvælger funktionen. Den operatørudløste rute `DELETE /api/v1/batches/delete-completed` påvirkes ikke i nogen af tilfældene — den er en separat, ubetinget offentlig API-kontrakt. | +| Nøgle | Type | Standard | Beskrivelse | +| ------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Håndhævelsestilstand for politikker om brug af værktøjer. Værdier: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Aktivér automatisk hastighedsbegrænsning baseret på brugsmønstre. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Spring OmniRoutes lokale kontrol af kontekstvindue/maksimalt antal inputtokens over for direkte anmodninger til en enkelt model. Upstream-grænser gælder stadig. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Afvis anmodninger før afsendelse, når målmodellen mangler påkrævede funktioner (billedforståelse, værktøjer, struktureret output, kontekstvindue). Beskytter direkte anmodninger til en enkelt udbyder, som omgår kombinationslagets kompatibilitetsfilter. | +| `RADAR_ENABLED` | boolean | `false` | Aktivér OmniRoute Radar-modulet (skærmbilleder med katalogfeed og synkronisering). Deaktiveret som standard; aktivering låser kun brugergrænsefladen op — datasynkronisering kræver fortsat særskilt tilmelding. | + +### Kørselstid (33) + +| Nøgle | Type | Standardværdi | Genstart | Beskrivelse | +| ------------------------------------------- | ------- | ------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolesk | `true` | | Generér og indsæt samtaleresuméer, når kombinationsrouting skifter model. Deaktivér for at behandle modelskift uafhængigt og forhindre handoff-anmodninger i baggrunden for alle eksisterende og fremtidige kombinationer. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolesk | `true` | | Fjern interne outputelementer fra kommentarfasen i Responses API-passthrough-streams, før de videresendes til klienter. Deaktivér for at modtage rå upstream-kommentarer. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolesk | `true` | | Håndhæv omfangsbegrænsninger for adgang til MCP-værktøjer. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolesk | `false` | | Komprimer beskrivelser af MCP-værktøjer for at reducere tokenforbruget. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolesk | `false` | | Aktivér behandling af baggrundsopgaver under kørsel. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolesk | `false` | ✓ | Deaktivér alle baggrundstjenester (opdatering af kvoter, synkronisering osv.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Stol på RTK-filtre på projektniveau uden validering. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Start WebSocket-serveren til dashboardet i realtid ved import (port 20132 som standard). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Tillad Codex at bruge Responses-over-WebSocket-transporten. Når den er slået fra, falder Codex tilbage til HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Tillad Codex at bruge den lokale app-server-WebSocket-JSON-RPC-transport (codexTransport=app-server). Når den er slået fra, falder forbindelser, der er konfigureret til app-server, tilbage til Codex' øvrige transportmetoder. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Send anmodninger, der har opbrugt budgettet, til den gratis nødreserveudbyder/-model. (Se [Nødreserve ved opbrugt budget](#emergency-budget-fallback) nedenfor.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Aktivér transparent tidligt genforsøg for afkortede opstrøms-SSE-streams, før nogen svarbytes når klienten. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Tillad streamgenoprettelse at anmode om et svar igen og sammenføje det, efter at bytes allerede er nået frem til klienten. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Gør fortsættelse midt i en stream sikker for værktøjskald: Genoptag aldrig en afbrudt stream, når et værktøjskald er blevet udsendt (igangværende eller allerede afsluttet med finish_reason tool_calls), og luk efter én tom fortsættelse i stedet for at bruge hele budgettet. Slået fra: release-adfærd. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Skift én gang til en søskendeforbindelse, når en SSE-stream lukkes, før den har udsendt en brugbar frame, og det begrænsede antal genforsøg på samme forbindelse er opbrugt; hvis der ikke findes en brugbar søskendeforbindelse, returneres den oprindelige `STREAM_EARLY_EOF` 502. Deaktiveret som standard: tidlig EOF forbliver terminal efter genforsøget på samme forbindelse. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Medtag visningsvenlige navnefelter i svar fra `/v1/models`. Deaktiver dette for klienter, der kun forventer model-id'er. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Styrer, hvordan model-id'er får præfiks i /v1/models. 'dual' (standard) udsender både aliaspræfikser og kanoniske udbyder-id-præfikser af hensyn til bagudkompatibilitet. 'alias' udsender kun det korte aliaspræfiks (f.eks. ds-web/model, ikke deepseek-web/model). 'canonical' udsender kun det fulde udbyder-id-præfiks. Værdier: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Aktivér periodisk ELO-synkronisering af Arena AI-resultattavlen til rangering af modellers intelligens. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Annoncér spejl-id'er af typen `claude//` på `/v1/models`, så Claude Code-gatewayens modelregistrering viser ikke-Claude-modeller. Globalt niveau i kontrollen med tre niveauer (miljøvariablen tilsidesætter kontrolpanelets indstilling). Se [Claude Code-konfiguration](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Hovedafbryder for gatewayaliaserne no-think//. Aktiveret (standard): /v1/models annoncerer en variant uden tænkning for hver kvalificeret Claude-model med tænkefunktionalitet, og et no-think/-id, der sendes i en anmodning, fortolkes som den faktiske model med ræsonnering deaktiveret. Deaktiveret: Ingen varianter annonceres, og et no-think/-id behandles som ethvert andet ukendt model-id. Til- eller fravalget pr. model via ModelSpec.noThinkingAlias gælder stadig, mens dette er aktiveret. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Deaktivér generering af varianter for tænkeniveauer (f.eks. -low, -medium, -high) i /v1/models-kataloget. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Aktivér adaptive virtuelle adgangsbaner pr. lejer til afsendelse til udbydere (#9654): Én lejers trafikspids medfører ikke længere 503-fejl for en anden. Miljøvariablen OMNIROUTE_CHAT_VIRTUAL_LANES tilsidesætter denne indstilling i kontrolpanelet; ændringer træder i kraft ved genstart af serveren. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Annoncér spejl-id'er af typen / på /v1/models for modeller, hvis kanoniske ejer ikke har aktive legitimationsoplysninger, men som dirigeres af en passthrough-gateway med aktive legitimationsoplysninger. Advarsel: Tilføjer katalogposter for alle klienter, når funktionen aktiveres globalt. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Aktivér saldoregistrering for noder, der er kompatible med New-API-/One-API-/Sub2API-aggregatorer. Når funktionen er aktiveret, rapporterer kompatible noder med aggregatorflaget angivet deres saldo i kontrolpanelet og ved kvoteforhåndskontrol af routing. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Fortsæt ikke-streamende, serverejede værktøjskald, indtil modellen returnerer et svar, som klienten kan bruge. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Søgestatistik og seneste søgninger medregner kun udbydere, der stadig har en aktiv forbindelse (udbydere uden nøgle, såsom duckduckgo-free, medregnes altid). Deaktiveret bevarer funktionen alle gemte søgerækker med et udbyder-id. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Udbydersider i kontrolpanelet: Vis kun mærket Gratis på baggrund af signaler, som udbyderen understøtter — udelader heuristikken for visningsnavne, ikke-booleske gratisfelter og :free-suffikser for registrerede udbydere uden et dokumenteret gratis niveau. Deaktiveret bevarer funktionen den hidtidige regel for mærket. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Ved aggregerede 429/503-svar om utilgængelighed udelades `Retry-After`, når der ikke kendes et konkret fremtidigt tidspunkt for et nyt forsøg (i stedet for et syntetisk tidsrum på 1 sek.), `error.retry_after_provenance` (`signal` \| `none`) tilføjes, og kombinationens dræningsstier kan læse tekstbaserede anvisninger om nye forsøg fra JSON- og klartekst-svartekster fra upstream. Feltet vises kun i svar, der er oprettet af `unavailableResponse()`; andre 429/503-svartekster forbliver uændrede. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Når et `priority`-kombinationsmål, der er markeret som reserve kun ved opbrugt kvote, stopper kombinationen af en årsag, som beviseligt ikke skyldes kvoten (udbyderens kredsløbsafbryder er åben, eller målet springes over på grund af forventet latenstid), returneres 502 i stedet for den kvotelignende 503. Stop på grund af spærring, nedkøling, utilgængelighed, opbrugte ressourcer og samtidighedsgrænser returnerer fortsat 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Et simpelt Mistral 401-svar (`{"detail":"Unauthorized"}` uden et eksplicit godkendelsessignal) er identisk for en tilbagekaldt nøgle og en opbrugt kvote. Når funktionen er aktiveret, sættes forbindelsen på pause i stedet for at blive parkeret som `expired`, højst 3 gange i timen pr. forbindelse; næste gang parkeres den, så en tilbagekaldt nøgle stadig ender i den korrekte tilstand. Deaktiveret som standard: Alle simple Mistral 401-svar parkerer forbindelsen som hidtil. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Hent det aktuelle xAI-modelkatalog for `xai-oauth`-forbindelser fra `https://api.x.ai/v1/models` ved hjælp af OAuth-bearer-tokenet i stedet for det fastlåste statiske udgangspunkt. Deaktiveret som standard: `xai-oauth` fortsætter med at levere det statiske udgangspunkt uændret. Ved enhver fortolkningsfejl falder registreringen tilbage til udgangspunktet (det er ikke verificeret, om x.ai accepterer en OAuth-bearer på dette endpoint). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Lad den automatiske oprydningskørsel slette afsluttede (fuldførte/mislykkede/annullerede/udløbne) Batch API-jobs, der er ældre end `OMNIROUTE_BATCH_RETENTION_DAYS`, sammen med deres kontrolpunkter pr. linje, og rydde BLOB-indholdet i uploadede filer, hvis deres egen `expires_at` er overskredet. Deaktiveret som standard: Alle eksisterende installationer beholder disse data præcis som før, indtil en operatør aktivt vælger funktionen til. Den operatørudløste rute `DELETE /api/v1/batches/delete-completed` påvirkes ikke i nogen af tilfældene — den er en separat, ubetinget offentlig API-kontrakt. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Reservér den valgte Antigravity-konto i hele streaminglivscyklussen for den anmodning, der valgte den, så et samtidigt nyt forsøg eller overdragelsen af legitimationsoplysninger ikke kan vælge en konto igen, som allerede er knyttet til en igangværende stream. Reservationen er afgrænset til (forbindelse, kaldbar upstream-model), så én konto stadig kan betjene to forskellige modeller på samme tid. Når alle kvalificerede konti allerede er reserveret til den pågældende model, returnerer anmodningen en struktureret 503-fejl, `antigravity_pool_busy`, med en afgrænset `Retry-After` i stedet for at føje belastning til en optaget konto. Deaktiveret som standard: Kontovalget fungerer præcis som før, og der foretages ingen reservation. | ### CLI (5) -| Nøgle | Type | Standardværdi | Genstart | Beskrivelse | -| ------------------------------------- | ------- | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Aktivér kompatibilitetstilstand for alle CLI-klienter. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Aktivér kompatibilitetslaget for modelaliasser. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Aktivér automatisk synkronisering af prisdata (kræver også miljøvariablen `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Efter synkronisering af en udbydermodel skal ~/.codex/*.config.toml-profilfiler automatisk (gen)skrives ud fra livekataloget. Den aktive Codex-standardkonfiguration ændres aldrig. Deaktiveret som standard. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Efter synkronisering af en udbydermodel skal Claude Code-profilerne ~/.claude/profiles//settings.json automatisk (gen)skrives ud fra livekataloget. Den aktive Claude-standardkonfiguration ændres aldrig. Deaktiveret som standard. | +| Nøgle | Type | Standard | Genstart | Beskrivelse | +| ------------------------------------- | ------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Aktivér kompatibilitetstilstand for alle CLI-klienter. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Aktivér kompatibilitetslaget for modelaliasser. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Aktivér automatisk synkronisering af prisdata (kræver også miljøvariablen `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Efter synkronisering af en udbydermodel skal ~/.codex/*.config.toml-profilfiler automatisk (gen)skrives ud fra det aktuelle katalog. Ændrer aldrig den aktive Codex-standardkonfiguration. Deaktiveret som standard. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Efter synkronisering af en udbydermodel skal Claude Code-profilerne ~/.claude/profiles//settings.json automatisk (gen)skrives ud fra det aktuelle katalog. Ændrer aldrig den aktive Claude-standardkonfiguration. Deaktiveret som standard. | -### Tilstand (5) +### Sundhed (5) -| Nøgle | Type | Standardværdi | Beskrivelse | -| ----------------------------------------- | ------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Deaktivér tilstandskontrolslutpunktet for den lokale instans. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Deaktivér tilstandskontrollen for tokenvalidering. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Aktivér netværksadgang i færdighedssandkassemiljøet. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Under proxytilstandskontrollen nulstiller en forespørgsel, som målet afviste (401/403/429), proxyens række af på hinanden følgende fejl. Deaktiveret som standard: En afvisning forbliver neutral (#10654). En 5xx forbliver uafklaret i begge tilfælde; en afvisning fjerner, deaktiverer eller genaktiverer aldrig en proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Kør integritets-/tilstandskontrollen af databasen ved opstart, efter at serveren er begyndt at acceptere anmodninger (via `setImmediate`), i stedet for at blokere opstarten, indtil den er fuldført (#13717). Deaktiveret som standard: Opstarten blokeres præcis som før denne PR. | +| Nøgle | Type | Standardværdi | Beskrivelse | +| ----------------------------------------- | ------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Deaktivér sundhedstjek-endpointet for den lokale instans. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Deaktivér sundhedstjekket for tokenvalidering. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Aktivér netværksadgang i skills-sandboxmiljøet. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | I proxyens sundhedsgennemgang nulstiller en probe, som målet afviste (401/403/429), proxyens række af på hinanden følgende fejl. Deaktiveret som standard: En afvisning forbliver neutral (#10654). En 5xx forbliver uafklaret uanset indstillingen; en afvisning fjerner, deaktiverer eller genaktiverer aldrig en proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Kør integritets-/sundhedstjekket af databasen ved opstart, efter at serveren begynder at acceptere anmodninger (via `setImmediate`), i stedet for at blokere opstarten, indtil det er fuldført (#13717). Deaktiveret som standard: Opstarten blokeres præcis som før denne PR. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` og dets ældre alias > `INJECTION_GUARD_BLOCK_THRESHOLD` justerer tilstanden `block` for > `INJECTION_GUARD_MODE`, men de er almindelige miljøvariabler, der læses af > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> og ikke funktionsflag: De kan ikke tilsidesættes via databasen og har ingen kontakt i kontrolpanelet. Se +> og ikke funktionsflag: De har ingen tilsidesættelse i databasen og ingen indstilling i dashboardet. Se > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] > Kolonnen `Genstart` markerer flag med `requiresRestart: true` — værdien -> gemmes øjeblikkeligt, men træder først i kraft, efter at processen er genindlæst. Enum- +> gemmes med det samme, men træder først i kraft, når processen genindlæses. Enum- > flag afviser enhver værdi uden for deres tilladte mængde (valideret på serversiden i > både `setFeatureFlagOverride()` og REST-`PUT`-handleren). @@ -176,9 +178,9 @@ understøtter: - **Søgning** efter nøgle eller beskrivelse og **filtrering** efter kategori (samt en syntetisk visning for **Kræver genstart**). -- En **til/fra-knap** til booleske flag og en **rullemenu** til enum-flag +- En **til/fra-knap** til booleske flag og en **rulleliste** til enum-flag (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- Et **kildemærke** for hvert flag — `DB`, `ENV` eller `DEF` — som viser, hvor den +- Et **kildebadge** for hvert flag — `DB`, `ENV` eller `DEF` — som viser, hvor den effektive værdi stammer fra. - En **Nulstil**-knap (vises kun for flag med `DB` som kilde), der fjerner tilsidesættelsen, og en **Nulstil alle tilsidesættelser**-knap nederst. @@ -188,11 +190,11 @@ understøtter: Alle handlinger går gennem en enkelt rute: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Hver metode kræver en godkendt dashboardsession (ellers `401`). +Alle metoder kræver en godkendt dashboardsession (ellers returneres `401`). #### `GET /api/settings/feature-flags` -Returnerer hvert flag med dets effektive værdi, kilde og en oversigt. +Returnerer alle flag med deres effektive værdi, kilde og en oversigt. ```jsonc { @@ -210,7 +212,7 @@ Returnerer hvert flag med dets effektive værdi, kilde og en oversigt. "requiresRestart": false, "warningLevel": "caution", }, - // ... alle 72 flag + // ... alle 74 flag ], "summary": { "total": 56, @@ -225,7 +227,7 @@ Returnerer hvert flag med dets effektive værdi, kilde og en oversigt. #### `PUT /api/settings/feature-flags` Angiv eller fjern en enkelt tilsidesættelse. Brødtekst: `{ key: string; value?: string }`. -Hvis `value` udelades, fjernes tilsidesættelsen (og env/standardværdien gendannes). +Hvis `value` udelades, fjernes tilsidesættelsen (så env-/standardværdien gendannes). ```bash # Angiv en DB-tilsidesættelse @@ -240,18 +242,18 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ ``` Svaret returnerer den nye `effectiveValue`/`source`, den tidligere `previousValue`/ -`previousSource` samt `requiresRestart`. Ukendte nøgler og enum-værdier uden for det tilladte -interval afvises med `400`. +`previousSource` samt `requiresRestart`. Ukendte nøgler og enum-værdier uden for det +gyldige interval afvises med `400`. #### `DELETE /api/settings/feature-flags` -Rydder **alle** DB-tilsidesættelser på én gang og gendanner hvert flag til dets env-/standardværdi. -Returnerer `{ cleared: , message: "..." }`. +Rydder **alle** DB-tilsidesættelser på én gang og gendanner hvert flag til dets env-/ +standardværdi. Returnerer `{ cleared: , message: "..." }`. > [!NOTE] > Flag med `requiresRestart: true` træder først i kraft efter en genindlæsning af processen. -> Dashboardets genstartsforløb kalder `POST /api/restart` og forespørger derefter gentagne gange -> på `GET /api/health/ping`, indtil serveren er oppe igen. +> Dashboardets genstartsflow kalder `POST /api/restart` og forespørger derefter løbende +> `GET /api/health/ping`, indtil serveren er tilgængelig igen. --- diff --git a/docs/i18n/da/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/da/docs/reference/PROVIDER_REFERENCE.md index 1a7035c0960a..b8e269f4deb6 100644 --- a/docs/i18n/da/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/da/docs/reference/PROVIDER_REFERENCE.md @@ -5,8 +5,8 @@ --- > **Automatisk genereret** fra `src/shared/constants/providers.ts` — rediger ikke manuelt. -> Generer igen med: `npm run gen:provider-reference` -> **Senest genereret:** 2026-09-17 +> Generér igen med: `npm run gen:provider-reference` +> **Senest genereret:** 2026-09-18 Samlet antal udbydere: **359**. Se kategorioversigten nedenfor. @@ -34,47 +34,47 @@ Brug kontrolpanelet på `/dashboard/providers` til at aktivere, konfigurere og t ## Udbydere uden godkendelse (ingen nøgle påkrævet) (10) -| ID | Alias | Navn | Tags | Websted | Bemærkninger | Værktøjskald | -| ----------------------- | ---------- | ------------------------- | ------------------------ | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | -| `aihorde` | `horde` | AI Horde | Ingen godkendelse | [link](https://aihorde.net) | Ingen API-nøgle påkrævet — bruger AI Hordes dokumenterede anonyme nøgle. Det er valgfrit at tilføje en gratis nøgle fra aihorde.net, og det giver kun højere prioritet i køen (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Ingen godkendelse | [link](https://augmentcode.com) | Ingen API-nøgle gemmes af OmniRoute. Installer Auggie CLI, og kør `auggie login` på denne maskine. Derefter starter OmniRoute den lokalt for hver anmodning. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Ingen godkendelse | [link](https://playground.ai.cloudflare.com) | Ingen legitimationsoplysninger påkrævet — anonyme browsersessioner via en reverse-engineeret cf_agent WebSocket-protokol (Playwright-transport). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Ingen godkendelse | [link](https://developers.openai.com/codex/cli) | Intet token gemmes af OmniRoute. Codex CLI-appserveren administrerer sit eget ChatGPT-login (~/.codex/auth.json, opdateres automatisk). Brug “Log ind med ChatGPT”, hvis CLI'en endnu ikke er godkendt. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Ingen godkendelse | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Godkendelsen håndteres af den officielle Devin CLI i dens isolerede bridge-diskenhed. | emuleret | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Ingen godkendelse | [link](https://duckduckgo.com/duckchat) | Ingen legitimationsoplysninger påkrævet — DuckDuckGo AI Chat er anonym og gratis. | emuleret | -| `opencode` | `oc` | OpenCode Free | Ingen godkendelse | [link](https://opencode.ai) | Ingen API-nøgle påkrævet — bruger OpenCodes offentlige gratis slutpunkt. | — | -| `uncloseai` | `unc` | UncloseAI | Ingen godkendelse | [link](https://uncloseai.com) | Ingen godkendelse påkrævet. API'et accepterer enhver ikke-tom streng som nøgle til identifikation. Hvis ældre indbyggede modeller returnerer 404, skal du bruge Tilgængelige modeller → Importér fra /models eller Automatisk synkronisering; verificeret aktiv model: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Ingen godkendelse, video | [link](https://veoaifree.com) | Ingen godkendelse påkrævet. Begrænset til 6 anmodninger i timen pr. IP-adresse. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Ingen godkendelse | [link](https://zcode.z.ai) | Ingen API-nøgle gemmes af OmniRoute. Den lokale ZCode-appserver bruger det eksisterende builtin:zai-coding-plan-login. | — | +| ID | Alias | Navn | Tags | Websted | Bemærkninger | Værktøjskald | +| ----------------------- | ---------- | ------------------------- | ------------------------ | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | +| `aihorde` | `horde` | AI Horde | Ingen godkendelse | [link](https://aihorde.net) | Ingen API-nøgle påkrævet — bruger AI Hordes dokumenterede anonyme nøgle. Det er valgfrit at tilføje en gratis nøgle fra aihorde.net, og det giver kun højere prioritet i køen (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Ingen godkendelse | [link](https://augmentcode.com) | OmniRoute gemmer ingen API-nøgle. Installer Auggie CLI, og kør `auggie login` på denne maskine. Derefter starter OmniRoute den lokalt for hver anmodning. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Ingen godkendelse | [link](https://playground.ai.cloudflare.com) | Ingen legitimationsoplysninger påkrævet — anonyme browsersessioner via en reverse-engineeret cf_agent-WebSocket-protokol (Playwright-transport). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Ingen godkendelse | [link](https://developers.openai.com/codex/cli) | OmniRoute gemmer ingen token. Codex CLI-app-serveren administrerer sit eget ChatGPT-login (~/.codex/auth.json, opdateres automatisk). Brug “Log ind med ChatGPT”, hvis CLI'en endnu ikke er godkendt. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Ingen godkendelse | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Godkendelsen administreres af den officielle Devin CLI i dens isolerede bridge-diskenhed. | emuleret | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Ingen godkendelse | [link](https://duckduckgo.com/duckchat) | Ingen legitimationsoplysninger påkrævet — DuckDuckGo AI Chat er anonym og gratis. | emuleret | +| `opencode` | `oc` | OpenCode Free | Ingen godkendelse | [link](https://opencode.ai) | Ingen API-nøgle påkrævet — bruger OpenCodes offentlige gratis slutpunkt. | — | +| `uncloseai` | `unc` | UncloseAI | Ingen godkendelse | [link](https://uncloseai.com) | Ingen godkendelse påkrævet. API'et accepterer enhver ikke-tom streng som nøgle til identifikation. Hvis ældre indbyggede modeller returnerer 404, skal du bruge Available Models → Import from /models eller Auto-Sync; verificeret aktiv model: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Ingen godkendelse, video | [link](https://veoaifree.com) | Ingen godkendelse påkrævet. Begrænset til 6 anmodninger/time pr. IP-adresse. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Ingen godkendelse | [link](https://zcode.z.ai) | OmniRoute gemmer ingen API-nøgle. Den lokale ZCode-app-server bruger det eksisterende builtin:zai-coding-plan-login. | — | ## OAuth-udbydere (24) -| ID | Alias | Navn | Tags | Websted | Bemærkninger | -| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [link](https://antigravity.google) | Importér dit login fra Antigravity CLI (`agy`) (indsæt/upload dens tokenfil), registrer automatisk et lokalt CLI-login, eller log ind med Google. Deler Antigravity-backenden (inkl. Claude-modeller). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [link](https://aws.amazon.com/q/developer/) | Bruger samme AWS Builder ID eller importerede refresh-token-flow som Kiro, men holder Amazon Q-forbindelser adskilt. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [link](https://cline.bot/cline-pass) | ClinePass er Clines abonnement til $9.99/md., som samler 10 åbne kodningsmodeller. Log ind med din Cline-konto (samme login som til Cline CLI/IDE), eller indsæt en direkte ClinePass API-nøgle (app.cline.bot → Indstillinger → API-nøgler). Et ClinePass-abonnement låser op for cline-pass/*-modellerne. Genbruger Cline WorkOS OAuth-flowet. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Log ind via det officielle CLI-enhedskodeflow, eller indsæt en direkte API-nøgle (sendes som Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [link](https://cli.devin.ai) | Kræver den binære Devin CLI-fil. Kør `devin auth login` for at godkende, eller angiv din WINDSURF_API_KEY. Installation: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [link](https://devin.ai) | Indsæt en eksisterende Devin API-nøgle fra en godkendt Devin-session. Tilgængeligheden af nøgleeksport og de nødvendige trin varierer afhængigt af Devin-version og konto. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Angiv URL'en til din GHE-instans (f.eks. https://ghe.company.com) i udbyderindstillingerne, og godkend derefter via enhedsflowet. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth er ikke konfigureret. Registrer en OAuth-applikation på https://gitlab.com/-/profile/applications med omdirigerings-URI'en http://localhost:20128/callback og scopes "ai_features read_user", angiv derefter GITLAB_DUO_OAUTH_CLIENT_ID (og valgfrit GITLAB_DUO_OAUTH_CLIENT_SECRET), og genstart. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Log ind med din browser, eller indsæt din ~/.grok/auth.json (eller JWT-adgangstokenet) fra Grok Build CLI; refresh_token roteres automatisk i begge tilfælde. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [link](https://www.kimi.com/code?aff=omniroute) | Log ind med den samme Kimi-konto, som bruges af Kimi Code CLI. OmniRoute bruger CLI OAuth-flowet og Kimi Coding Plan-slutpunkterne. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Gratis niveau: 50 kreditter/måned (~25K–100K tokens). ⚠️ Kiروs servicevilkår forbyder brug af tredjepartsproxyer/-harnesses. | -| `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Log ind med din Openference-konto for at dirigere anmodninger gennem api.openference.com. Et aktivt abonnement er påkrævet til inferens — OAuth kan muligvis godkende, men returnerer 402 uden et abonnement. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [link](https://trae.ai) | Trae er et AI-nativt IDE fra ByteDance (SOLO-fjernagent). Godkend via trae.ai i pop op-vinduet, eller log ind på solo.trae.ai, og indsæt Cloud-IDE-JWT'et (sendes som 'Authorization: Cloud-IDE-JWT ', levetid på ~14 dage) som adgangstoken; web_id/biz_user_id/user_unique_id/scope/tenant/region overføres via providerSpecificData. Ingen headless-opdatering for indsatte tokens — indsæt igen ved udløb. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [link](https://x.ai) | Log ind med xAI for at bruge api.x.ai-modeller såsom Grok 4.5. Dette er adskilt fra Grok Build JWT-sessioner, som bruger cli-chat-proxy.grok.com og grok-build-modelaliasser. | -| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed gemmer legitimationsoplysninger til LLM-udbydere (OpenAI, Anthropic, Google, Mistral, xAI) i operativsystemets nøglering. Brug knappen Importér nedenfor til automatisk at finde og importere dem. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Log ind med din Zed-konto (login via native app). OmniRoute genererer et RSA-nøglepar til engangsbrug og åbner zed.dev for at godkende det — ved en fjerninstallation/headless-installation skal du kopiere den resulterende 127.0.0.1-callback-URL fra browserens adresselinje og indsætte den her. Adskiller sig fra posten 'Zed IDE' til import af legitimationsoplysninger ovenfor: Denne fungerer som proxy for chatfuldførelser gennem Zeds egen hostede modelaggregator (cloud.zed.dev), der leverer Anthropic/OpenAI/Google/xAI-modeller under dit Zed-abonnement. | +| ID | Alias | Navn | Tags | Websted | Bemærkninger | +| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [link](https://antigravity.google) | Importér dit login fra Antigravity CLI (`agy`) (indsæt/upload dens tokenfil), find automatisk et lokalt CLI-login, eller log ind med Google. Deler Antigravity-backendmiljøet (inkl. Claude-modeller). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [link](https://aws.amazon.com/q/developer/) | Bruger det samme AWS Builder ID eller den samme importerede refresh-token-proces som Kiro, men holder Amazon Q-forbindelser adskilt. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [link](https://cline.bot/cline-pass) | ClinePass er Clines abonnement til $9.99/md., som samler 10 åbne kodningsmodeller. Log ind med din Cline-konto (samme login som til Cline CLI/IDE), eller indsæt en direkte ClinePass API-nøgle (app.cline.bot → Indstillinger → API-nøgler). Et ClinePass-abonnement låser op for cline-pass/*-modellerne. Genbruger Cline WorkOS OAuth-processen. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Log ind via den officielle CLI-enhedskodeproces, eller indsæt en direkte API-nøgle (sendes som Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [link](https://cli.devin.ai) | Kræver den binære Devin CLI-fil. Kør `devin auth login` for at godkende, eller angiv din WINDSURF_API_KEY. Installation: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [link](https://devin.ai) | Indsæt en eksisterende Devin API-nøgle fra en godkendt Devin-session. Tilgængeligheden af nøgleeksport og de nødvendige trin varierer afhængigt af Devin-version og konto. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Angiv URL'en til din GHE-instans (f.eks. https://ghe.company.com) i udbyderindstillingerne, og godkend derefter via enhedsprocessen. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth er ikke konfigureret. Registrér en OAuth-applikation på https://gitlab.com/-/profile/applications med omdirigerings-URI'en http://localhost:20128/callback og adgangsområderne "ai_features read_user", angiv derefter GITLAB_DUO_OAUTH_CLIENT_ID (og eventuelt GITLAB_DUO_OAUTH_CLIENT_SECRET), og genstart. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Log ind med din browser, eller indsæt din ~/.grok/auth.json (eller JWT-adgangstokenet) fra Grok Build CLI; refresh_token roteres automatisk i begge tilfælde. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [link](https://www.kimi.com/code?aff=omniroute) | Log ind med den samme Kimi-konto, som bruges af Kimi Code CLI. OmniRoute bruger CLI OAuth-processen og Kimi Coding Plan-slutpunkterne. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Gratis niveau: 50 kreditter/måned (~25K–100K tokens). ⚠️ Kiros brugsvilkår forbyder brug af tredjepartsproxyer/-harnesses. | +| `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Log ind med din Openference-konto for at dirigere anmodninger gennem api.openference.com. Omfatter gratis adgang til Qwen3.8 27b og Llama 3.2 3B — se openference.com/pricing for de aktuelle abonnementsvilkår. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [link](https://trae.ai) | Trae er et AI-native IDE fra ByteDance (SOLO-fjernagent). Godkend via trae.ai i pop op-vinduet, eller log ind på solo.trae.ai, og indsæt Cloud-IDE-JWT (sendes som 'Authorization: Cloud-IDE-JWT ', levetid på ~14 dage) som adgangstoken; web_id/biz_user_id/user_unique_id/scope/tenant/region videresendes via providerSpecificData. Ingen headless-opdatering for indsatte tokens — indsæt igen ved udløb. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [link](https://x.ai) | Log ind med xAI for at bruge api.x.ai-modeller såsom Grok 4.5. Dette er adskilt fra Grok Build JWT-sessioner, som bruger cli-chat-proxy.grok.com og grok-build-modelaliaser. | +| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed gemmer legitimationsoplysninger til LLM-udbydere (OpenAI, Anthropic, Google, Mistral, xAI) i operativsystemets nøglering. Brug knappen Importér nedenfor til automatisk at finde og importere dem. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Log ind med din Zed-konto (login via native app). OmniRoute genererer et RSA-nøglepar til engangsbrug og åbner zed.dev for at godkende det — på en ekstern/headless-installation skal du kopiere den resulterende 127.0.0.1-callback-URL fra din browsers adresselinje og indsætte den her. Adskiller sig fra posten til import af legitimationsoplysninger for 'Zed IDE' ovenfor: Denne sender chatfuldførelser gennem Zeds egen hostede modelaggregator (cloud.zed.dev), der fungerer som frontend for Anthropic/OpenAI/Google/xAI-modeller under dit Zed-abonnement. | ## Webcookieudbydere (34) @@ -117,250 +117,250 @@ Brug kontrolpanelet på `/dashboard/providers` til at aktivere, konfigurere og t ## API-nøgleudbydere (betalte / betalte med gratis kreditter) (242) -| ID | Alias | Navn | Tags | Websted | Noter | -| ------------------------ | --------------- | ------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API-nøgle | [link](https://ai.360.cn) | Hent API-nøgle på ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | API-nøgle, aggregator | [link](https://agentrouter.org) | $200 i gratis kredit ved tilmelding – gateway til routing mellem flere modeller | -| `agnes` | `agnes` | Agnes AI | API-nøgle, video | [link](https://agnes-ai.com) | Hent API-nøgle på agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Kina) | API-nøgle | [link](https://api.agnes-ai.cn) | Hent API-nøglen fra Agnes' kinesiske websted. | -| `ai21` | `ai21` | AI21 Labs | API-nøgle | [link](https://www.ai21.com) | $10 i prøvekredit ved tilmelding (gyldig i 3 måneder), intet kreditkort påkrævet | -| `aimlapi` | `aiml` | AI/ML API | API-nøgle, aggregator | [link](https://aimlapi.com) | Gratisniveauet er sat på pause (2026) — AI/ML API afregnes nu udelukkende efter forbrug (mindst $20 i optankning); ingen tilbagevendende gratis kredit. | -| `ainative` | `ainative` | AINative Studio | API-nøgle | [link](https://ainative.studio) | Opret en gratis API-nøgle på ainative.studio (intet kort), og indsæt den derefter her som et Bearer-token. | -| `aion` | `aion` | Aion Labs | API-nøgle | [link](https://www.aionlabs.ai) | Opret en gratis API-nøgle på aionlabs.ai (intet kort), og indsæt den derefter her som et Bearer-token. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API-nøgle | [link](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Kina) | API-nøgle | [link](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API-nøgle | [link](https://developer.ant-ling.com/en/docs/) | Registrer dig, og opret en API-nøgle i Ant Ling API-konsollen (https://chat.ant-ling.com/open), og indsæt den derefter her. OmniRoute dirigerer chattrafik til https://api.ant-ling.com/v1/chat/completions; udbyderen er kompatibel med OpenAI og tilbyder også en Anthropic-kompatibel grænseflade. | -| `anthropic` | `anthropic` | Anthropic | API-nøgle | [link](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API-nøgle, aggregator | [link](https://anyapi.ai) | Gratis abonnement: 100.000 ANY-tokens pr. dag og 100 RPM for kvalificerede Free/Basic-modeller; intet kreditkort påkrævet. | -| `api-airforce` | `af` | Api.airforce | API-nøgle | [link](https://api.airforce) | 55 modeller på gratisniveauet, herunder Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash og DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API-nøgle | [link](https://arcee.ai) | Hent API-nøgle på arcee.ai | -| `auriko` | `auriko` | Auriko | API-nøgle, aggregator | [link](https://www.auriko.ai) | Det gratis abonnement tilbyder 1.000 Platform-RPM og 10.000 BYOK-RPM. Platformsinferens medfører stadig omkostninger hos udbyderen; dette er ikke en pulje med gratis tokens eller ubegrænset gratis inferens. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API-nøgle, virksomhed | [link](https://learn.microsoft.com/azure/ai-foundry) | Brug din Azure AI Foundry-nøgle. Basis-URL'en kan være https://.services.ai.azure.com/openai/v1/ eller https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | API-nøgle, virksomhed | [link](https://azure.microsoft.com/products/ai-services/openai-service) | Brug din Azure OpenAI API-nøgle. Basis-URL'en skal være slutpunktet for din ressource, f.eks. https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API-nøgle | [link](https://b.ai) | Bearer-API-nøgle til b.ai's OpenAI-kompatible LLM-gateway (ikke det samme som TheB.AI). Opret en nøgle på https://docs.b.ai, og brug derefter https://api.b.ai/v1 som den OpenAI-kompatible basis-URL. Modeller bruger formatet udbyder/modelnavn. | -| `baichuan` | `baichuan` | Baichuan | API-nøgle | [link](https://www.baichuan-ai.com/) | Hent API-nøgle på platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | API-nøgle | [link](https://ernie.baidu.com/) | Hent API-nøgle på console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API-nøgle | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API-nøgle | [link](https://baseten.co) | $30 i gratis prøvekredit til GPU-inferens | -| `bazaarlink` | `bzl` | BazaarLink | API-nøgle | [link](https://bazaarlink.ai) | Brug din BazaarLink API-nøgle (begynder med sk-bl-) i Authorization: Bearer . OpenAI SDK fungerer med basis-URL'en https://bazaarlink.ai/api/v1. Modeller bruger formatet udbyder/modelnavn. | -| `bedrock` | `bedrock` | Amazon Bedrock | API-nøgle, virksomhed | [link](https://aws.amazon.com/bedrock) | Brug din Amazon Bedrock API-nøgle, og konfigurer den AWS-region, hvor dine modeller er aktiveret (f.eks. eu-west-2). OmniRoute kalder Bedrocks oprindelige Converse API direkte. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API-nøgle, billede | [link](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API-nøgle | [link](https://blackbox.ai) | ⚠️ **FORÆLDET.** api.blackbox.ai returnerer HTTP 404 for hver variant af stien (gennemgang 2026-08-21); den offentlige inferensgrænseflade er flyttet til det adgangsbegrænsede enterprise.blackbox.ai/v1-slutpunkt. | -| `bluesminds` | `bm` | BluesMinds | API-nøgle | [link](https://www.bluesminds.com) | Gratis daglige pi-kreditter — understøtter over 200 modeller, herunder GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen og Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API-nøgle | [link](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API-nøgle | [link](https://bytez.com) | $1 i gratis kredit, som fornys hver 4. uge | -| `cerebras` | `cerebras` | Cerebras | API-nøgle | [link](https://inference.cerebras.ai) | Engangskredit på $5 ved tilmelding (gyldig i 30 dage); en betalingsmetode er påkrævet. Dette er ikke et tilbagevendende gratisniveau. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API-nøgle | [link](https://hyper.charm.land) | 100 gratis Hypercredits om måneden ved tilmelding | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API-nøgle, aggregator | [link](https://api.oriper.com) | Officielle metadata annoncerer 2 mio. tokens pr. måned, men det offentlige websted og dokumentationen var blokeret under gennemgangen; betragt kvoten og brandtilknytningen som ubekræftede. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-nøgle, aggregator | [link](https://chatanywhere.tech) | Kun til personlig brug, uddannelse eller forskning: Den offentlige dokumentation angiver 10.000 point/dag og 200 anmodninger/dag pr. IP/nøgle; må ikke bruges til kommerciel trafik. | -| `cheaperinference` | `cinf` | Cheaper Inference | API-nøgle | [link](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API-nøgle | [link](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API-nøgle, aggregator | [link](https://chutes.ai) | Bearer-API-nøgle til Chutes' OpenAI-kompatible gateway. | -| `clarifai` | `clarifai` | Clarifai | API-nøgle, virksomhed | [link](https://docs.clarifai.com) | Brug din Clarifai PAT eller appspecifikke API-nøgle. OmniRoute bruger det OpenAI-kompatible slutpunkt på https://api.clarifai.com/v2/ext/openai/v1 og godkender med Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-nøgle, aggregator | [link](https://cloudcode.one) | Offentliggjorte gratis modeller omfatter glm-4.7-flash og glm-4.6v-flash; der er ikke offentliggjort nogen numerisk kvote, og oprettelse af en nøgle kan kræve kredit eller en kupon. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-nøgle | [link](https://developers.cloudflare.com/workers-ai) | Kræver API-token OG konto-id (findes på dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API-nøgle | [link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API-nøgle | [link](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API-nøgle | [link](https://cohere.com) | Gratis prøveperiode: 1.000 API-kald/måned til test, intet kreditkort påkrævet | -| `command-code` | `cmd` | Command Code | API-nøgle | [link](https://commandcode.ai/) | Brug en Command Code-API-nøgle. Anmodninger sendes til Command Codes /provider/v1/chat/completions-slutpunkt. | -| `coze` | `coze` | Coze | API-nøgle | [link](https://coze.com) | Hent API-nøglen på coze.com/open/api | -| `crof` | `crof` | CrofAI | API-nøgle | [link](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API-nøgle | [link](https://cursor.com/dashboard/api) | Indsæt en Cursor-bruger-API-nøgle (crsr_...) fra cursor.com/dashboard/api. OmniRoute udveksler den efter behov med et sessionstoken; det er ikke nødvendigt at installere et IDE eller cursor-agent. Forbruget faktureres til det Cursor-abonnement, som ejer nøglen. | -| `dahl` | `dahl` | Dahl | API-nøgle | [link](https://inference.dahl.global) | Klik på 'Tilføj konto' for automatisk at generere et token, eller tilføj en API-nøgle manuelt. | -| `databricks` | `databricks` | Databricks | API-nøgle, virksomhed | [link](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API-nøgle, virksomhed | [link](https://docs.datarobot.com) | Brug dit DataRobot-API-token. Den valgfrie basis-URL kan være kontoens rod-URL (til LLM Gateway) eller en implementerings-URL under /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | API-nøgle, billede | [link](https://deepai.org) | Brug din DeepAI-API-nøgle. Hent en på deepai.org — kræver et Pro-abonnement ($9.99/måned). | -| `deepinfra` | `deepinfra` | DeepInfra | API-nøgle | [link](https://deepinfra.com) | Gratis tilmeldingskredit til API-test og udforskning af modeller | -| `deepseek` | `ds` | DeepSeek | API-nøgle | [link](https://platform.deepseek.com) | 5 mio. gratis tokens ved tilmelding – intet kreditkort påkrævet | -| `dgrid` | `dgrid` | DGrid | API-nøgle | [link](https://dgrid.ai) | DGrid Free Models Router: 10 anmodninger/minut og 100 anmodninger/dag. En livstidsoptankning på $5 låser op for op til 20 anmodninger/minut og 1.000 anmodninger/dag. | -| `dify` | `dify` | Dify | API-nøgle | [link](https://dify.ai) | Hent API-nøglen fra din Dify-instans. | -| `digitalocean` | `digitalocean` | DigitalOcean | API-nøgle | [link](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API-nøgle | [link](https://dit.ai) | Brug din dit.ai-API-nøgle i Authorization: Bearer . Fuldt OpenAI-kompatibel — en direkte erstatning; skift blot basis-URL'en til https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API-nøgle | [link](https://doubao.com) | Hent API-nøglen på console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | API-nøgle, aggregator | [link](https://www.dxnt.com) | Gratis konti er dokumenteret med 100 kald/dag; kvoten kan øges gennem invitationer og kan variere fra konto til konto. | -| `electronhub` | `electronhub` | Electron Hub | API-nøgle, aggregator | [link](https://www.electronhub.ai) | Gratis abonnement: 5 RPM, $0.25 i ugentlig kredit og 10 Neutrinos/dag til :free-modeller; familiebudgetter gælder også. | -| `empower` | `empower` | Empower | API-nøgle, aggregator | [link](https://docs.empower.dev) | Bearer-API-nøgle til Empowers OpenAI-kompatible slutpunkt. | -| `eurouter` | `eurouter` | EURouter | API-nøgle, aggregator | [link](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API-nøgle | [link](https://factory.ai) | Bearer-API-nøgle til Factorys OpenAI-kompatible gateway. | -| `fal-ai` | `fal` | Fal.ai | API-nøgle, billede | [link](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API-nøgle, aggregator | [link](https://fastrouter.ai) | Modeller med suffikset :free tillader 10 anmodninger/dag pr. organisation og model; tilgængeligheden kan ændre sig. | -| `featherless-ai` | `featherless` | Featherless AI | API-nøgle | [link](https://featherless.ai) | Gratis niveau tilgængeligt — intet kreditkort påkrævet | -| `fenayai` | `fenayai` | FenayAI | API-nøgle, aggregator | [link](https://fenayai.com) | Bearer-API-nøgle til FenayAIs OpenAI-kompatible gateway. | -| `fireworks` | `fireworks` | Fireworks AI | API-nøgle | [link](https://fireworks.ai) | $1 i gratis startkredit ved tilmelding til API-test | -| `free-ai` | `free-ai` | Free.ai | API-nøgle, aggregator | [link](https://free.ai) | 30.000 tokens/dag dækker selvhostede modeller efter e-mailbekræftelse. Forbrug ud over puljen kan faktureres til kostpris, og eksterne premiummodeller er betalingsmodeller. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API-nøgle | [link](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API-nøgle | [link](https://freebuff.com) | Indtast Freebuff-/Codebuff-godkendelsestokenet (hentes via CLI-login eller automatiseret indsamler). | -| `freeinference` | `freeinference` | FreeInference | API-nøgle, aggregator | [link](https://freeinference.org) | Gratis forskningsadgang uden betalingskort; ansøgere uden tilknytning til Harvard kræver manuel godkendelse, og der garanteres ikke offentligt nogen numerisk kvote. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API-nøgle | [link](https://freemodel.dev) | $300 i gratis kreditter ved tilmelding — intet betalingskort påkrævet. Få adgang til GPT-5.4 og GPT-5.5 (OpenAI's nyeste flagskibsmodeller) via en OpenAI-kompatibel API. | -| `freetheai` | `fta` | FreeTheAi | API-nøgle, aggregator | [link](https://freetheai.xyz) | Tilmeld dig FreeTheAi Discord for at få din gratis API-nøgle. | -| `friendliai` | `friendli` | FriendliAI | API-nøgle | [link](https://friendli.ai) | Gratis niveau til serverløs inferens — intet betalingskort påkrævet | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | API-nøgle | [link](https://galadriel.com) | ⚠️ **UDFaset.** api.galadriel.ai kan ikke længere slås op (kontrol 2026-06-19); inferens-API'en ser ud til at være nedlagt. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API-nøgle | [link](https://aistudio.google.com) | Gratis niveau tilgængeligt via Google AI Studio; gældende kvoter pr. model og regionale begrænsninger er gældende | -| `getgoapi` | `ggo` | GoAPI | API-nøgle, aggregator | [link](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API-nøgle | [link](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API-nøgle | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab-token til personlig adgang til den offentlige Code Suggestions-API. Konfigurer en selvhostet basis-URL, når gitlab.com ikke bruges. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-nøgle | [link](https://opengateway.gitlawb.com) | Gratis MiMo (xiaomi/mimo-v2.5) blev trukket tilbage 2026-05 — Opengateway er nu en forbrugsafregnet kreditgateway uden en tilbagevendende gratis model. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-nøgle | [link](https://opengateway.gitlawb.com) | Den gratis Nemotron-kampagne sluttede 2026-06 — GMI Cloud-ruten er nu udelukkende forbrugsafregnet via kreditter. | -| `glm` | `glm` | GLM Coding | API-nøgle | [link](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Kina) | API-nøgle | [link](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API-nøgle | [link](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API-nøgle | [link](https://greenpt.com) | Det er gratis at oprette et API-abonnement; inferens faktureres pr. token. Der er ikke offentliggjort nogen gratis inferenskvote. | -| `groq` | `groq` | Groq | API-nøgle | [link](https://groq.com) | Gratis abonnement: grænser pr. model (200K tokens/dag pr. chatmodel; se console.groq.com/docs/rate-limits for RPM/RPD) — ingen betalingsmetode registreret. | -| `haiper` | `hp` | Haiper | API-nøgle, video | [link](https://haiper.ai) | Hent API-nøglen på haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | API-nøgle | [link](https://api.hcnsec.cn) | Hent API-nøglen på api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | API-nøgle, aggregator | [link](https://helixmind.online) | Tidligere udbredte påstande om 3 RPM/50 RPD og intet krav om betalingskort blev ikke bekræftet under kontrollen 2026-08-02; den aktuelle kvote og fakturering kræver kontobekræftelse. | -| `helyxai` | `helyxai` | Helyx AI | API-nøgle, aggregator | [link](https://helyxai.space) | Dokumentationen for det aktive gratis abonnement angiver 100.000 tokens/dag; webstedets separate markedsføringspåstand om 2M+ er modstridende og betragtes ikke som en kvotegaranti. | -| `heroku` | `heroku` | Heroku AI | API-nøgle, virksomhed | [link](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API-nøgle | [link](https://huggingface.co) | Gratis inferens-API til tusindvis af modeller (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API-nøgle | [link](https://hyperbolic.xyz) | $1-5 i prøvekreditter ved tilmelding til serverløs inferens | -| `ideogram` | `ideo` | Ideogram | API-nøgle | [link](https://ideogram.ai) | Hent API-nøglen på ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | API-nøgle | [link](https://xinghuo.xfyun.cn) | Hent API-nøglen på console.xfyun.cn | -| `inception` | `inception` | Inception | API-nøgle | [link](https://docs.inceptionlabs.ai) | 10M gratis tokens ved tilmelding, intet betalingskort påkrævet. | -| `inference-net` | `inet` | Inference.net | API-nøgle | [link](https://inference.net) | $25 i gratis kreditter ved tilmelding samt mulighed for forskningstilskud | -| `internlm` | `internlm` | InternLM (Intern-S1) | API-nøgle | [link](https://internlm.intern-ai.org.cn/) | Gratis månedlig kvote på ca. 1M input-/3M outputtokens (ca. 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API-nøgle, integrering/genrangering | [link](https://jina.ai) | Bearer-API-nøgle til api.jina.ai — integreringer, genrangering, klassificering, segmentering og søgning. Nøgler fra kontrolpanelet har forrang over JINA_AI_API_KEY. Dette er ikke kortet Reader / r.jina.ai og henter ikke URL'er. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-nøgle | [link](https://jina.ai/reader) | Bearer-API-nøgle til konvertering af URL'er til markdown via r.jina.ai (kun /v1/web/fetch). Understøtter ikke /v1/embeddings eller /v1/rerank. Det samme Jina-token som til Foundation API fungerer; OmniRoute genbruger en jina-ai-nøgle fra kontrolpanelet eller JINA_AI_API_KEY, når dette kort er tomt. | -| `kenari` | `kenari` | Kenari | API-nøgle | [link](https://kenari.id) | Brug din Kenari-API-nøgle (kn-...) i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API-nøgle | [link](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API-nøgle, aggregator | [link](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (ældre Moonshot-API) | API-nøgle | [link](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-nøgle | [link](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API-nøgle | [link](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API-nøgle, aggregator | [link](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API-nøgle, video | [link](https://leonardo.ai) | Hent en API-nøgle på leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | API-nøgle | [link](https://liquid.ai) | Hent en API-nøgle på liquid.ai | -| `literouter` | `literouter` | LiteRouter | API-nøgle, aggregator | [link](https://literouter.com) | Gratis modelvarianter bruger suffikset :free; daglige kreditgrænser varierer efter model, og gratis input er begrænset til 5.000 tokens. | -| `llamagate` | `llamagate` | LlamaGate | API-nøgle | [link](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-nøgle, aggregator | [link](https://llm.kiwi) | Gratisabonnementet giver adgang til auto og hrLLM; den offentliggjorte grænse på 40 anmodninger/time gælder for hrLLM. | -| `llm7` | `llm7` | LLM7.io | API-nøgle | [link](https://llm7.io) | Brug en vilkårlig ikke-tom nøgle (f.eks. 'unused'). Hvis ældre indbyggede modeller returnerer model_unavailable, skal du bruge Available Models → Import from /models eller Auto-Sync; verificeret aktiv model: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API-nøgle, aggregator | [link](https://llmgateway.io) | Hostet gratisabonnement: Modeller med gratis pris er begrænset til 5 anmodninger pr. 10 minutter, når kontoen ikke har nogen kreditter. | -| `logfare` | `logfare` | Logfare | API-nøgle, aggregator | [link](https://logfare.ai) | Opret en gratis konto på https://logfare.ai/register (brugernavn/adgangskode, ingen e-mailbekræftelse) for straks at få en API-nøgle, og indsæt den derefter her som et Bearer-token. | -| `longcat` | `lc` | LongCat AI | API-nøgle | [link](https://longcat.chat/platform/docs) | Gratis: engangstildeling på 10 mio. tokens efter kontotilmelding og KYC-verificering (LongCat-2.0). Kun én gang — ikke en tilbagevendende daglig/månedlig kvote. | -| `magnific` | `freepik` | Magnific | API-nøgle, billede | [link](https://www.magnific.com) | Hent en API-nøgle på magnific.com/user/api-keys (headeren x-magnific-api-key). Ældre Freepik-udviklernøgler fungerer stadig. | -| `maritalk` | `maritalk` | Maritalk | API-nøgle | [link](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API-nøgle, aggregator | [link](https://meganova.ai) | Gratis tilmelding uden betalingskort. De offentliggjorte Tier 1-kvoter pr. model udgør i alt 550 anmodninger/dag; de er ikke en delt global pulje, og betalt overforbrug kan forekomme, hvis det er aktiveret. | -| `meta-llama` | `meta` | Meta Llama API | API-nøgle | [link](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API-nøgle, video | [link](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Kina) | API-nøgle | [link](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API-nøgle | [link](https://mistral.ai) | Gratis Experiment-niveau: hastighedsbegrænset adgang til alle modeller, intet betalingskort påkrævet | -| `mixedbread` | `mxbai` | Mixedbread AI | API-nøgle | [link](https://www.mixedbread.com) | Bearer-API-nøgle til Mixedbreads integrerings-API. | -| `mixlayer` | `mixlayer` | Mixlayer | API-nøgle, aggregator | [link](https://www.mixlayer.com) | Modellen qwen/qwen3.5-4b-free er gratis til prototypeudvikling og hastighedsbegrænset; ingen fast offentlig RPM eller daglig kvote er bekræftet. | -| `mnn-ai` | `mnn-ai` | MNN AI | API-nøgle, aggregator | [link](https://mnnai.ru) | Gratisabonnement: $1 i månedlige kreditter, 10 RPM og kun adgang til modeller markeret som Free. | -| `modal` | `mdl` | Modal | API-nøgle, virksomhed | [link](https://modal.com/docs) | Brug det Bearer-token, der beskytter din Modal-udrulning, hvis det er aktiveret. Basis-URL'en skal pege på din OpenAI-kompatible Modal-app, f.eks. https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API-nøgle | [link](https://modelscope.cn) | Gratis niveau via ModelScope API-Inference — Alibaba-konto påkrævet. | -| `monsterapi` | `monster` | MonsterAPI | API-nøgle | [link](https://monsterapi.ai) | ⚠️ **UDFASSET.** Monster API indstillede driften den 2026-06-30. Brug alternative OpenAI-kompatible udbydere. | -| `moonshot` | `moonshot` | Kimi | API-nøgle | [link](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API-nøgle | [link](https://morphllm.com) | Gratis niveau: 250.000 kreditter/måned, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API-nøgle | [link](https://github.com/meta-llama/llama-stack) | Brug din META_API_KEY-miljøvariabel som et Bearer-token. Muse Code CLI bruger wire-formatet fra OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API-nøgle, aggregator | [link](https://naga.ac) | Hent en API-nøgle på naga.ac — tilmelding via Google/GitHub/Discord er tilgængelig. | -| `naga-ai` | `naga-ai` | Naga AI | API-nøgle, aggregator | [link](https://naga.ac) | Modeller markeret med :free er offentligt listet, men der er ikke bekræftet nogen numerisk kvote. Nagas politik advarer om, at prompts og output fra gratisniveauet kan blive indsamlet eller brugt til træning. | -| `nanogpt` | `nanogpt` | NanoGPT | API-nøgle | [link](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API-nøgle | [link](https://bynara.id) | Opret en gratis NaraRouter-konto, tilknyt din Telegram-konto (påkrævet før /v1-svar), og indsæt derefter nøglen her som et Bearer-token. | -| `navy` | `navy` | NavyAI | API-nøgle | [link](https://api.navy) | Opret en gratis API-nøgle i NavyAI-dashboardet, og indsæt den derefter her som et Bearer-token. | -| `nebius` | `nebius` | Nebius AI | API-nøgle | [link](https://nebius.com) | Prøvekreditter på ~$1 ved tilmelding til API-test | -| `nlpcloud` | `nlpc` | NLP Cloud | API-nøgle | [link](https://docs.nlpcloud.com) | Brug din NLP Cloud API-nøgle i Authorization: Token . OmniRoute bruger som standard chatbot-slutpunktet på https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | API-nøgle | [link](https://nomic.ai) | Hent en API-nøgle på atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | API-nøgle | [link](https://portal.nousresearch.com/help) | Brug din Nous Portal API-nøgle. OmniRoute bruger det officielle OpenAI-kompatible inferensslutpunkt på https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API-nøgle, video, aggregator | [link](https://novita.ai) | Prøvekreditter på $0.50 ved tilmelding (gyldige i ca. 1 år) | -| `nscale` | `nscale` | nScale | API-nøgle | [link](https://nscale.com) | $5 i gratis kreditter ved tilmelding til inferenstest | -| `nube` | `nube` | Nube.sh | API-nøgle | [link](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API-nøgle | [link](https://build.nvidia.com) | Gratis udvikleradgang: ~40 RPM, 70+ modeller (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API-nøgle, virksomhed | [link](https://www.oracle.com/artificial-intelligence/generative-ai) | Brug din OCI Generative AI API-nøgle eller dit IAM Bearer-token. Basis-URL'en kan være https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | API-nøgle, aggregator | [link](https://ofox.ai) | Det aktuelle katalog annoncerer mere end 10 gratis modeller uden en offentlig numerisk kvote; gennemgå den underliggende oprindelse samt vilkårene for opbevaring og træning før brug i produktion. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-nøgle | [link](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API-nøgle | [link](https://1min.ai) | Opret en API-nøgle på https://docs.1min.ai/docs/api/create-api-key, og indsæt den derefter her. | -| `openadapter` | `oad` | OpenAdapter | API-nøgle | [link](https://openadapter.dev) | Brug din OpenAdapter API-nøgle i Authorization: Bearer sk-cv-. Fuldt OpenAI-kompatibel. API-basis-URL: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API-nøgle | [link](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API-nøgle | [link](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-nøgle | [link](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API-nøgle | [link](https://openference.com) | Gratis abonnement: 3-dages prøveperiode med open source-modeller — intet kreditkort påkrævet | -| `openrouter` | `openrouter` | OpenRouter | API-nøgle, aggregator | [link](https://openrouter.ai) | Gratis modeller til $0/token med suffikset :free - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API-nøgle | [link](https://openvecta.com) | Gratis kreditter ved tilmelding til OpenAI-kompatibel inferens på tværs af LLM'er, embeddings og ræsonneringsmodeller | -| `opper` | `opper` | Opper | API-nøgle, aggregator | [link](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API-nøgle | [link](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API-nøgle | [link](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API-nøgle | [link](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-nøgle | [link](https://www.perplexity.ai) | Brug din Perplexity API-nøgle. OmniRoute dirigerer Agent API-model-id'er gennem Perplexitys Responses-kompatible slutpunkt. | -| `piapi` | `pi` | PiAPI | API-nøgle, aggregator | [link](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API-nøgle | [link](https://pioneer.ai) | $75 i gratis brugskreditter — intet kreditkort påkrævet | -| `plamo` | `plamo` | PLaMo | API-nøgle | [link](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API-nøgle, aggregator | [link](https://creator.poe.com/api-reference) | Bearer API-nøgle til Poes OpenAI-kompatible API. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API-nøgle, aggregator | [link](https://poixe.com) | De aktuelle offentlige gratisgrænser er lave og specifikke for modelgruppen: 2 RPM/5 RPD for large-cup-modeller og 20 RPM/50 RPD for small-cup-modeller. | -| `pollinations` | `pol` | Pollinations AI | API-nøgle, video | [link](https://pollinations.ai) | Anonym/nøglefri adgang til de dokumenterede gratis modeller leveres efter bedste evne. Lokal v3.8.50-verifikation (2026-07-31) returnerede 401 via OmniRoute og Cloudflare 1010 ved direkte upstream-forespørgsler fra det samme netværk. Premium-modeller kræver stadig en Pollinations API-nøgle fra enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API-nøgle | [link](https://poolside.ai) | Laguna S 2.1 og XS 2.1 er gratis under Preview; der er ikke offentliggjort nogen numerisk kvote. | -| `predibase` | `predibase` | Predibase | API-nøgle | [link](https://predibase.com) | ⚠️ **FORÆLDET.** serving.app.predibase.com kan ikke længere slås op (gennemgang 2026-06-19); API'en til administreret servering ser ud til at være udfaset. | -| `publicai` | `publicai` | PublicAI | API-nøgle | [link](https://publicai.co) | Kræver en API-nøgle — engangskredit ved tilmelding, derefter betaling | -| `qianfan` | `qianfan` | Baidu Qianfan | API-nøgle | [link](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API-nøgle | [link](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API-nøgle | [link](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-nøgle | [link](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API-nøgle, billede | [link](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API-nøgle | [link](https://regolo.ai) | Hent din Regolo API-nøgle fra regolo.ai, og indsæt den derefter her som et Bearer-token. | -| `reka` | `reka` | Reka | API-nøgle | [link](https://docs.reka.ai/chat/overview) | Brug din Reka API-nøgle. OmniRoute understøtter den OpenAI-kompatible basis-URL https://api.reka.ai/v1 og sender både Authorization- og X-Api-Key-headere af hensyn til kompatibilitet. | -| `requesty` | `requesty` | Requesty | API-nøgle | [link](https://requesty.ai) | Gratis niveau med ca. 200 anmodninger/dag – gateway til routing mellem flere modeller (300+ modeller) | -| `routeway` | `routeway` | Routeway | API-nøgle | [link](https://routeway.ai) | Opret en gratis API-nøgle på routeway.ai, og indsæt den derefter her som et Bearer-token. | -| `runwayml` | `runway` | Runway | API-nøgle, video | [link](https://docs.dev.runwayml.com) | Brug din Runway API-nøgle i Authorization: Bearer . OmniRoute bruger den aktuelle Runway API på https://api.dev.runwayml.com/v1 og sender automatisk den påkrævede X-Runway-Version-header. | -| `sambanova` | `samba` | SambaNova | API-nøgle | [link](https://sambanova.ai) | $5 i gratis kredit ved tilmelding (gyldig i 30 dage), intet kreditkort påkrævet | -| `sap` | `sap` | SAP Generative AI Hub | API-nøgle, virksomhed | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Brug dit SAP AI Core bearer-token. Basis-URL'en kan være din AI_API_URL-rod eller en deploymentUrl fra Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | API-nøgle | [link](https://docs.sarvam.ai) | ₹1,000 i gratis kredit ved tilmelding – udløber aldrig | -| `scaleway` | `scw` | Scaleway AI | API-nøgle | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M gratis tokens til nye konti – EU/GDPR-kompatibel (Paris), Qwen3 235B og Llama 70B | -| `sealion` | `sealion` | SEA-LION | API-nøgle | [link](https://sea-lion.ai) | Log ind på sea-lion.ai med Google (intet kort, ingen regionsbegrænsning), opret en API-nøgle, og indsæt den derefter her. | -| `seekai` | `ska` | SeekAi | API-nøgle, aggregator | [link](https://seekai.cc) | Opret en API-nøgle på https://seekai.cc, og indsæt den derefter her som et Bearer-token. | -| `segmind` | `segmind` | Segmind | API-nøgle, billede, video | [link](https://segmind.com) | Brug din Segmind API-nøgle i x-api-key-headeren. OmniRoute bruger https://api.segmind.com/v1/ og returnerer de genererede billed-/videobytes direkte. | -| `sensenova` | `sensenova` | SenseNova | API-nøgle | [link](https://platform.sensenova.cn) | Hent en API-nøgle på platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | API-nøgle | [link](https://cloud.siliconflow.com) | $1 i gratis kredit samt aktuelt angivne $0-modeller efter identitetsbekræftelse; tilgængelighed og grænser kan ændre sig | -| `snowflake` | `snowflake` | Snowflake Cortex | API-nøgle, virksomhed | [link](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API-nøgle | [link](https://xinghuo.xfyun.cn) | Hent en API-nøgle på console.xfyun.cn | -| `speka` | `speka` | Speka AI | API-nøgle, aggregator | [link](https://speka.me) | Gratis abonnement: $1 i månedligt forbrug, 10 RPM, én API-nøgle og adgang til åbne modeller og legepladsen; intet kort påkrævet. | -| `stability-ai` | `stability` | Stability AI | API-nøgle, billede | [link](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API-nøgle | [link](https://stepfun.com) | Hent en API-nøgle på platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | API-nøgle | [link](https://ai.sumopod.com) | Brug din SumoPod API-nøgle (sk-...) i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API-nøgle | [link](https://suno.ai) | Indsæt sessionscookien fra suno.ai (Clerk-godkendelse) | -| `synthetic` | `synthetic` | Synthetic | API-nøgle, aggregator | [link](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API-nøgle, aggregator | [link](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API-nøgle | [link](https://hunyuan.tencent.com) | Hent en API-nøgle på console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | API-nøgle, aggregator | [link](https://theb.ai) | Bearer API-nøgle til den OpenAI-kompatible TheB.AI-gateway. | -| `tinyfish` | `tf` | TinyFish Fetch | API-nøgle | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key fra agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API-nøgle, video | [link](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API-nøgle | [link](https://agent-router.gaib.ai) | Brug din Token Kiosk API-nøgle i Authorization: Bearer . Fuldt OpenAI-kompatibel gateway. API-basis-URL: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API-nøgle, aggregator | [link](https://www.tokenreply.com) | Modeller markeret som gratis har model- og kampagnespecifikke daglige grænser; der er ikke offentliggjort nogen fast global gratiskvote. | -| `tokenrouter` | `trk` | TokenRouter | API-nøgle | [link](https://tokenrouter.com) | Brug din TokenRouter API-nøgle i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API-nøgle, billede | [link](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API-nøgle | [link](https://docs.opentyphoon.ai) | Gratis API-nøgle med en hastighedsgrænse på 5 anmodninger/s og 200 anmodninger/min. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API-nøgle | [link](https://uncensored.com) | Brug din Developer API-nøgle fra uncensored.com (uai_sk_live_...). OmniRoute sender den som X-api-key-headeren til det OpenAI-kompatible https://api.uncensored.com/api/v1-slutpunkt. Nøglen udløber aldrig. Dette er den forbrugsafregnede kreditbaserede tjeneste; den ubegrænsede abonnementschat er den separate 'uc'-udbyder. | -| `udio` | `udio` | Udio | API-nøgle | [link](https://udio.com) | Indsæt sessionscookien fra udio.com (Supabase-godkendelse) | -| `unorouter` | `unorouter` | UnoRouter | API-nøgle, aggregator | [link](https://unorouter.ai) | Modeller med suffikset :free trækker ikke fra saldoen; grænsen er 1 anmodning/minut pr. gratis model pr. bruger. | -| `upstage` | `upstage` | Upstage | API-nøgle | [link](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API-nøgle | [link](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API-nøgle | [link](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API-nøgle, aggregator | [link](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API-nøgle, virksomhed | [link](https://cloud.google.com/vertex-ai) | Angiv Service Account-JSON, et OAuth-adgangstoken, en Vertex Express API-nøgle eller en godkendelsesnøgle, der er knyttet til en tjenestekonto. Express-tilstand understøtter kun Gemini; partnermodeller kræver projektbaserede legitimationsoplysninger. | -| `vertex-partner` | `vp` | Vertex AI Partners | API-nøgle, virksomhed | [link](https://cloud.google.com/vertex-ai) | Angiv Service Account-JSON eller OAuth-legitimationsoplysninger. En godkendelsesnøgle, der er knyttet til en tjenestekonto, understøtter også registrering, men partnerinferens kræver desuden det tilhørende Google Cloud-projekt-id. Standard-Express-nøgler understøtter kun Gemini. | -| `void-ai` | `void-ai` | Void AI | API-nøgle, aggregator | [link](https://voidai.app) | Det offentlige modelkatalog markerer nogle modeller med et krav om et gratis abonnement, men adgang er betinget, og ingen numerisk kvote er bekræftet. | -| `volcengine` | `volcengine` | Volcengine | API-nøgle | [link](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API-nøgle | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Tilknyt din Volcano Engine-konto, eller brug en API-nøgle til et Ark Agent Plan-abonnement. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API-nøgle | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Tilknyt din Volcano Engine-konto, eller brug en API-nøgle til et Ark Coding Plan-abonnement. | -| `voyage-ai` | `voyage` | Voyage AI | API-nøgle, embedding/omrangering | [link](https://www.voyageai.com) | Bearer-API-nøgle til Voyage AI's API'er til embeddings og omrangering. | -| `wafer` | `wafer` | Wafer AI | API-nøgle | [link](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API-nøgle | [link](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API-nøgle, virksomhed | [link](https://www.ibm.com/products/watsonx-ai) | Brug dit watsonx-bearer-token. Basis-URL'en kan være https://.ml.cloud.ibm.com/ml/gateway/v1/ eller et selvadministreret /ml/gateway/v1-slutpunkt. | -| `writer` | `writer` | Writer | API-nøgle | [link](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API-nøgle | [link](https://x5lab.dev) | Brug din X5Lab API-nøgle (x5-...) i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API-nøgle | [link](https://x.ai) | Brug en officiel xAI API-nøgle, eller log ind med xAI OAuth. Grok Build JWT-sessioner forbliver en separat udbyder. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API-nøgle | [link](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API-nøgle | [link](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API-nøgle, aggregator | [link](https://xkiro.com) | Opret en gratis konto på xkiro.com, og indsæt nøglen her (Bearer; x-api-key accepteres også). | -| `yi` | `yi` | Yi (01.AI) | API-nøgle | [link](https://01.ai) | Hent en API-nøgle på platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API-nøgle, aggregator | [link](https://yolo-auto.com) | Gratis API-adgang er begrænset efter antal anmodninger og beregnet til test; der er ikke offentliggjort nogen numerisk daglig kvote, og gratis adgang garanteres ikke på ubestemt tid. | -| `zai` | `zai` | Z.AI | API-nøgle | [link](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API-nøgle | [link](https://zenmux.ai) | Brug din ZenMux API-nøgle i Authorization: Bearer . ZenMux er fuldt OpenAI-kompatibel. Basis-URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API-nøgle, aggregator | [link](https://www.zerolimitai.com) | Der reklameres med en midlertidig gratis prøveperiode, men de officielle sider angiver modstridende oplysninger om 3 eller 7 dage; en påstand om 100 kald/dag betragtes ikke som permanent. | -| `zylo-api` | `zylo` | Zylo API | API-nøgle, aggregator | [link](https://zyloai.net) | Basic-abonnement: 10 RPM, 7.200 anmodninger/dag og 200.000 tokens/dag; begrænset til Basic-tekstmodeller. | +| ID | Alias | Navn | Tags | Websted | Noter | +| ------------------------ | --------------- | ------------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API-nøgle | [link](https://ai.360.cn) | Hent API-nøglen på ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | API-nøgle, aggregator | [link](https://agentrouter.org) | $200 i gratis kreditter ved tilmelding – gateway til routing mellem flere modeller | +| `agnes` | `agnes` | Agnes AI | API-nøgle, video | [link](https://agnes-ai.com) | Hent API-nøglen på agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (Kina) | API-nøgle | [link](https://api.agnes-ai.cn) | Hent API-nøglen fra Agnes CN-webstedet. | +| `ai21` | `ai21` | AI21 Labs | API-nøgle | [link](https://www.ai21.com) | $10 i prøvekreditter ved tilmelding (gyldige i 3 måneder), intet kreditkort påkrævet | +| `aimlapi` | `aiml` | AI/ML API | API-nøgle, aggregator | [link](https://aimlapi.com) | Gratisniveauet er sat på pause (2026) — AI/ML API afregnes nu kun efter forbrug (min. $20 i optankning); ingen tilbagevendende gratis kreditter. | +| `ainative` | `ainative` | AINative Studio | API-nøgle | [link](https://ainative.studio) | Opret en gratis API-nøgle på ainative.studio (intet kort), og indsæt den derefter her som et Bearer-token. | +| `aion` | `aion` | Aion Labs | API-nøgle | [link](https://www.aionlabs.ai) | Opret en gratis API-nøgle på aionlabs.ai (intet kort), og indsæt den derefter her som et Bearer-token. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API-nøgle | [link](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Kina) | API-nøgle | [link](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API-nøgle | [link](https://developer.ant-ling.com/en/docs/) | Registrer dig, og opret en API-nøgle i Ant Ling API-konsollen (https://chat.ant-ling.com/open), og indsæt den derefter her. OmniRoute sender chattrafik til https://api.ant-ling.com/v1/chat/completions; udbyderen er OpenAI-kompatibel og tilbyder også en Anthropic-kompatibel grænseflade. | +| `anthropic` | `anthropic` | Anthropic | API-nøgle | [link](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API-nøgle, aggregator | [link](https://anyapi.ai) | Gratis abonnement: 100.000 ANY-tokens/dag og 100 RPM for kvalificerede Free/Basic-modeller; intet kreditkort påkrævet. | +| `api-airforce` | `af` | Api.airforce | API-nøgle | [link](https://api.airforce) | 55 modeller på gratisniveauet, herunder Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash og DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | API-nøgle | [link](https://arcee.ai) | Hent API-nøglen på arcee.ai | +| `auriko` | `auriko` | Auriko | API-nøgle, aggregator | [link](https://www.auriko.ai) | Det gratis abonnement tilbyder 1.000 RPM på platformen og 10.000 BYOK-RPM. Inferens på platformen medfører stadig udbyderomkostninger; dette er ikke en pulje med gratis tokens eller ubegrænset gratis inferens. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API-nøgle, erhverv | [link](https://learn.microsoft.com/azure/ai-foundry) | Brug din Azure AI Foundry-nøgle. Basis-URL'en kan være https://.services.ai.azure.com/openai/v1/ eller https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | API-nøgle, erhverv | [link](https://azure.microsoft.com/products/ai-services/openai-service) | Brug din Azure OpenAI API-nøgle. Basis-URL'en skal være dit ressourceslutpunkt, f.eks. https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API-nøgle | [link](https://b.ai) | Bearer-API-nøgle til b.ai's OpenAI-kompatible LLM-gateway (ikke det samme som TheB.AI). Opret en nøgle på https://docs.b.ai, og brug derefter https://api.b.ai/v1 som den OpenAI-kompatible basis-URL. Modeller bruger formatet udbyder/modelnavn. | +| `baichuan` | `baichuan` | Baichuan | API-nøgle | [link](https://www.baichuan-ai.com/) | Hent API-nøglen på platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | API-nøgle | [link](https://ernie.baidu.com/) | Hent API-nøglen på console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API-nøgle | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API-nøgle | [link](https://baseten.co) | $30 i gratis prøvekreditter til GPU-inferens | +| `bazaarlink` | `bzl` | BazaarLink | API-nøgle | [link](https://bazaarlink.ai) | Brug din BazaarLink API-nøgle (starter med sk-bl-) i Authorization: Bearer . OpenAI SDK fungerer med basis-URL'en https://bazaarlink.ai/api/v1. Modeller bruger formatet udbyder/modelnavn. | +| `bedrock` | `bedrock` | Amazon Bedrock | API-nøgle, erhverv | [link](https://aws.amazon.com/bedrock) | Brug din Amazon Bedrock API-nøgle, og konfigurer den AWS-region, hvor dine modeller er aktiveret (f.eks. eu-west-2). OmniRoute kalder Bedrocks oprindelige Converse API direkte. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API-nøgle, billede | [link](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API-nøgle | [link](https://blackbox.ai) | ⚠️ **FORÆLDET.** api.blackbox.ai returnerer HTTP 404 for alle stivarianter (gennemgang 2026-08-21); den offentlige inferensgrænseflade er flyttet til det adgangsbegrænsede enterprise.blackbox.ai/v1-slutpunkt. | +| `bluesminds` | `bm` | BluesMinds | API-nøgle | [link](https://www.bluesminds.com) | Gratis daglige pi-kreditter — understøtter mere end 200 modeller, herunder GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen og Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | API-nøgle | [link](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API-nøgle | [link](https://bytez.com) | $1 i gratis kreditter, som fornyes hver 4. uge | +| `cerebras` | `cerebras` | Cerebras | API-nøgle | [link](https://inference.cerebras.ai) | Engangskredit på $5 ved tilmelding (gyldig i 30 dage); en betalingsmetode er påkrævet. Ikke et tilbagevendende gratisniveau. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API-nøgle | [link](https://hyper.charm.land) | 100 gratis månedlige Hypercredits ved tilmelding | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API-nøgle, aggregator | [link](https://api.oriper.com) | De officielle metadata reklamerer med 2 mio. tokens/måned, men det offentlige websted og dokumentationen var blokeret under gennemgangen; betragt kvoten og tilknytningen til brandet som ubekræftede. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-nøgle, aggregator | [link](https://chatanywhere.tech) | Kun til personlig brug, uddannelsesbrug eller forskning: Den offentlige dokumentation angiver 10.000 point/dag og 200 anmodninger/dag pr. IP/nøgle; må ikke bruges til kommerciel trafik. | +| `cheaperinference` | `cinf` | Cheaper Inference | API-nøgle | [link](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API-nøgle | [link](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API-nøgle, aggregator | [link](https://chutes.ai) | Bearer-API-nøgle til Chutes' OpenAI-kompatible gateway. | +| `clarifai` | `clarifai` | Clarifai | API-nøgle, virksomhed | [link](https://docs.clarifai.com) | Brug din Clarifai-PAT eller appspecifikke API-nøgle. OmniRoute bruger det OpenAI-kompatible slutpunkt på https://api.clarifai.com/v2/ext/openai/v1 og godkender med Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-nøgle, aggregator | [link](https://cloudcode.one) | Offentliggjorte gratis modeller omfatter glm-4.7-flash og glm-4.6v-flash; der er ikke offentliggjort nogen numerisk kvote, og oprettelse af nøgler kan kræve kredit eller en kupon. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-nøgle | [link](https://developers.cloudflare.com/workers-ai) | Kræver API Token OG Account ID (findes på dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API-nøgle | [link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API-nøgle | [link](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API-nøgle | [link](https://cohere.com) | Gratis prøveperiode: 1.000 API-kald/måned til test, intet kreditkort påkrævet | +| `command-code` | `cmd` | Command Code | API-nøgle | [link](https://commandcode.ai/) | Brug en Command Code-API-nøgle. Anmodninger sendes til Command Codes /provider/v1/chat/completions-slutpunkt. | +| `coze` | `coze` | Coze | API-nøgle | [link](https://coze.com) | Hent en API-nøgle på coze.com/open/api | +| `crof` | `crof` | CrofAI | API-nøgle | [link](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API-nøgle | [link](https://cursor.com/dashboard/api) | Indsæt en Cursor-bruger-API-nøgle (crsr_...) fra cursor.com/dashboard/api. OmniRoute udveksler den efter behov med et sessionstoken; det er ikke nødvendigt at installere en IDE eller cursor-agent. Forbruget faktureres til det Cursor-abonnement, som ejer nøglen. | +| `dahl` | `dahl` | Dahl | API-nøgle | [link](https://inference.dahl.global) | Klik på 'Add Account' for automatisk at generere et token, eller tilføj en API-nøgle manuelt. | +| `databricks` | `databricks` | Databricks | API-nøgle, virksomhed | [link](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API-nøgle, virksomhed | [link](https://docs.datarobot.com) | Brug dit DataRobot-API-token. Den valgfrie basis-URL kan være kontoroden (til LLM Gateway) eller en implementerings-URL under /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | API-nøgle, billede | [link](https://deepai.org) | Brug din DeepAI-API-nøgle. Hent en på deepai.org — kræver et Pro-abonnement ($9.99/md.). | +| `deepinfra` | `deepinfra` | DeepInfra | API-nøgle | [link](https://deepinfra.com) | Gratis tilmeldingskredit til API-test og udforskning af modeller | +| `deepseek` | `ds` | DeepSeek | API-nøgle | [link](https://platform.deepseek.com) | 5 mio. gratis tokens ved tilmelding – intet kreditkort påkrævet | +| `dgrid` | `dgrid` | DGrid | API-nøgle | [link](https://dgrid.ai) | DGrid Free Models Router: 10 anmodninger/minut og 100 anmodninger/dag. En engangsoptankning på $5 giver adgang til op til 20 anmodninger/minut og 1.000 anmodninger/dag. | +| `dify` | `dify` | Dify | API-nøgle | [link](https://dify.ai) | Hent API-nøglen fra din Dify-instans. | +| `digitalocean` | `digitalocean` | DigitalOcean | API-nøgle | [link](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API-nøgle | [link](https://dit.ai) | Brug din dit.ai-API-nøgle i Authorization: Bearer . Fuldt OpenAI-kompatibel — en direkte erstatning; skift blot basis-URL'en til https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | API-nøgle | [link](https://doubao.com) | Hent en API-nøgle på console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | API-nøgle, aggregator | [link](https://www.dxnt.com) | Gratis konti er dokumenteret til 100 kald/dag; kvoten kan øges gennem invitationer og kan variere fra konto til konto. | +| `electronhub` | `electronhub` | Electron Hub | API-nøgle, aggregator | [link](https://www.electronhub.ai) | Gratis abonnement: 5 RPM, $0.25 i ugentlig kredit og 10 Neutrinos/dag til :free-modeller; familiebudgetter gælder også. | +| `empower` | `empower` | Empower | API-nøgle, aggregator | [link](https://docs.empower.dev) | Bearer-API-nøgle til Empowers OpenAI-kompatible slutpunkt. | +| `eurouter` | `eurouter` | EURouter | API-nøgle, aggregator | [link](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API-nøgle | [link](https://factory.ai) | Bearer-API-nøgle til Factorys OpenAI-kompatible gateway. | +| `fal-ai` | `fal` | Fal.ai | API-nøgle, billede | [link](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API-nøgle, aggregator | [link](https://fastrouter.ai) | Modeller med suffikset :free tillader 10 anmodninger/dag pr. organisation og model; tilgængeligheden kan ændre sig. | +| `featherless-ai` | `featherless` | Featherless AI | API-nøgle | [link](https://featherless.ai) | Gratis niveau tilgængeligt — intet kreditkort påkrævet | +| `fenayai` | `fenayai` | FenayAI | API-nøgle, aggregator | [link](https://fenayai.com) | Bearer-API-nøgle til FenayAIs OpenAI-kompatible gateway. | +| `fireworks` | `fireworks` | Fireworks AI | API-nøgle | [link](https://fireworks.ai) | $1 i gratis startkredit ved tilmelding til API-test | +| `free-ai` | `free-ai` | Free.ai | API-nøgle, aggregator | [link](https://free.ai) | 30.000 tokens/dag dækker selvhostede modeller efter e-mailbekræftelse. Forbrug ud over puljen kan faktureres til kostpris, og eksterne premiummodeller er betalte. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API-nøgle | [link](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API-nøgle | [link](https://freebuff.com) | Indtast Freebuff-/Codebuff-godkendelsestokenet (hentes via CLI-login eller en automatiseret indsamler). | +| `freeinference` | `freeinference` | FreeInference | API-nøgle, aggregator | [link](https://freeinference.org) | Gratis forskningsadgang uden betalingskort; ansøgere uden tilknytning til Harvard kræver manuel godkendelse, og der garanteres ikke offentligt nogen numerisk kvote. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API-nøgle | [link](https://freemodel.dev) | $300 i gratis kreditter ved tilmelding — intet betalingskort påkrævet. Få adgang til GPT-5.4 og GPT-5.5 (OpenAI's nyeste flagskibsmodeller) via en OpenAI-kompatibel API. | +| `freetheai` | `fta` | FreeTheAi | API-nøgle, aggregator | [link](https://freetheai.xyz) | Deltag i FreeTheAi Discord for at få din gratis API-nøgle. | +| `friendliai` | `friendli` | FriendliAI | API-nøgle | [link](https://friendli.ai) | Gratis niveau til serverløs inferens — intet betalingskort påkrævet | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-nøgle, aggregator | [link](https://g4f.space) | Optjen anonyme cake-kreditter på g4f.dev/chat, eller brug en g4f.dev-medlemsnøgle (opret en på g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API-nøgle | [link](https://galadriel.com) | ⚠️ **FORÆLDET.** api.galadriel.ai kan ikke længere slås op (kontrol 2026-06-19); inferens-API'en ser ud til at være nedlagt. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API-nøgle | [link](https://aistudio.google.com) | Gratis niveau tilgængeligt via Google AI Studio; de aktuelle kvoter pr. model og regionale begrænsninger gælder | +| `getgoapi` | `ggo` | GoAPI | API-nøgle, aggregator | [link](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API-nøgle | [link](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API-nøgle | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Personligt GitLab-adgangstoken til den offentlige Code Suggestions-API. Konfigurer en selvhostet basis-URL, når gitlab.com ikke bruges. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-nøgle | [link](https://opengateway.gitlawb.com) | Gratis MiMo (xiaomi/mimo-v2.5) blev trukket tilbage 2026-05 — Opengateway er nu en forbrugsafregnet kreditgateway uden en tilbagevendende gratis model. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-nøgle | [link](https://opengateway.gitlawb.com) | Den gratis Nemotron-kampagne sluttede 2026-06 — GMI Cloud-ruten er nu kun tilgængelig med forbrugsafregnede kreditter. | +| `glm` | `glm` | GLM Coding | API-nøgle | [link](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Kina) | API-nøgle | [link](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API-nøgle | [link](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API-nøgle | [link](https://greenpt.com) | Det er gratis at oprette et API-abonnement; inferens faktureres pr. token. Der er ikke offentliggjort nogen gratis inferenskvote. | +| `groq` | `groq` | Groq | API-nøgle | [link](https://groq.com) | Gratis abonnement: grænser pr. model (200K tokens/dag pr. chatmodel; se console.groq.com/docs/rate-limits for RPM/RPD) — ingen betalingsmetode er registreret. | +| `haiper` | `hp` | Haiper | API-nøgle, video | [link](https://haiper.ai) | Hent API-nøglen på haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | API-nøgle | [link](https://api.hcnsec.cn) | Hent API-nøglen på api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | API-nøgle, aggregator | [link](https://helixmind.online) | Tidligere udbredte påstande om 3 RPM/50 RPD og intet krav om betalingskort blev ikke bekræftet under revisionen 2026-08-02; den aktuelle kvote og fakturering kræver kontobekræftelse. | +| `helyxai` | `helyxai` | Helyx AI | API-nøgle, aggregator | [link](https://helyxai.space) | Dokumentationen for det aktive gratis abonnement angiver 100,000 tokens/dag; webstedets separate markedsføringspåstand om 2M+ er modstridende og betragtes ikke som en kvotegaranti. | +| `heroku` | `heroku` | Heroku AI | API-nøgle, erhverv | [link](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API-nøgle | [link](https://huggingface.co) | Gratis inferens-API til tusindvis af modeller (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API-nøgle | [link](https://hyperbolic.xyz) | $1-5 i prøvekreditter ved tilmelding til serverløs inferens | +| `ideogram` | `ideo` | Ideogram | API-nøgle | [link](https://ideogram.ai) | Hent API-nøglen på ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | API-nøgle | [link](https://xinghuo.xfyun.cn) | Hent API-nøglen på console.xfyun.cn | +| `inception` | `inception` | Inception | API-nøgle | [link](https://docs.inceptionlabs.ai) | 10M gratis tokens ved tilmelding, intet betalingskort påkrævet. | +| `inference-net` | `inet` | Inference.net | API-nøgle | [link](https://inference.net) | $25 i gratis kreditter ved tilmelding samt mulighed for forskningslegater | +| `internlm` | `internlm` | InternLM (Intern-S1) | API-nøgle | [link](https://internlm.intern-ai.org.cn/) | Gratis månedlig kvote på ~1M input-/3M outputtokens (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API-nøgle, embed/rerank | [link](https://jina.ai) | Bearer-API-nøgle til api.jina.ai — embeddings, rerank, classify, segment og search. Nøgler fra kontrolpanelet har forrang for JINA_AI_API_KEY. Dette er ikke Reader-/r.jina.ai-kortet og henter ikke URL'er. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-nøgle | [link](https://jina.ai/reader) | Bearer-API-nøgle til URL-til-Markdown via r.jina.ai (kun /v1/web/fetch). Understøtter ikke /v1/embeddings eller /v1/rerank. Det samme Jina-token som til Foundation API virker; OmniRoute genbruger en jina-ai-nøgle fra kontrolpanelet eller JINA_AI_API_KEY, når dette kort er tomt. | +| `kenari` | `kenari` | Kenari | API-nøgle | [link](https://kenari.id) | Brug din Kenari-API-nøgle (kn-...) i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API-nøgle | [link](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API-nøgle, aggregator | [link](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (ældre Moonshot API) | API-nøgle | [link](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-nøgle | [link](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API-nøgle | [link](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API-nøgle, aggregator | [link](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API-nøgle, video | [link](https://leonardo.ai) | Hent en API-nøgle på leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | API-nøgle | [link](https://liquid.ai) | Hent en API-nøgle på liquid.ai | +| `literouter` | `literouter` | LiteRouter | API-nøgle, aggregator | [link](https://literouter.com) | Gratis modelvarianter bruger suffikset :free; de daglige kreditgrænser varierer efter model, og gratis input er begrænset til 5.000 tokens. | +| `llamagate` | `llamagate` | LlamaGate | API-nøgle | [link](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-nøgle, aggregator | [link](https://llm.kiwi) | Gratisabonnementet giver adgang til auto og hrLLM; den offentliggjorte grænse på 40 anmodninger/time gælder for hrLLM. | +| `llm7` | `llm7` | LLM7.io | API-nøgle | [link](https://llm7.io) | Brug en vilkårlig ikke-tom nøgle (f.eks. 'unused'). Hvis ældre indbyggede modeller returnerer model_unavailable, skal du bruge Tilgængelige modeller → Importér fra /models eller Automatisk synkronisering; verificeret aktiv model: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API-nøgle, aggregator | [link](https://llmgateway.io) | Hostet gratisabonnement: Modeller med gratis pris er begrænset til 5 anmodninger pr. 10 minutter, når kontoen ikke har nogen kreditter. | +| `logfare` | `logfare` | Logfare | API-nøgle, aggregator | [link](https://logfare.ai) | Opret en gratis konto på https://logfare.ai/register (brugernavn/adgangskode, ingen e-mailbekræftelse) for straks at få en API-nøgle, og indsæt den derefter her som et Bearer-token. | +| `longcat` | `lc` | LongCat AI | API-nøgle | [link](https://longcat.chat/platform/docs) | Gratis: engangstildeling på 10 mio. tokens efter kontotilmelding og KYC-verificering (LongCat-2.0). Kun én gang — ikke en tilbagevendende daglig/månedlig kvote. | +| `magnific` | `freepik` | Magnific | API-nøgle, billede | [link](https://www.magnific.com) | Hent en API-nøgle på magnific.com/user/api-keys (headeren x-magnific-api-key). Ældre Freepik-udviklernøgler virker stadig. | +| `maritalk` | `maritalk` | Maritalk | API-nøgle | [link](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API-nøgle, aggregator | [link](https://meganova.ai) | Gratis tilmelding uden betalingskort. De offentliggjorte Tier 1-kvoter pr. model udgør i alt 550 anmodninger/dag; de er ikke en fælles global pulje, og betalt overforbrug kan forekomme, hvis det er aktiveret. | +| `meta-llama` | `meta` | Meta Llama API | API-nøgle | [link](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API-nøgle, video | [link](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Kina) | API-nøgle | [link](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API-nøgle | [link](https://mistral.ai) | Gratis Experiment-niveau: hastighedsbegrænset adgang til alle modeller, intet kreditkort påkrævet | +| `mixedbread` | `mxbai` | Mixedbread AI | API-nøgle | [link](https://www.mixedbread.com) | Bearer-API-nøgle til Mixedbread-API'et til embeddings. | +| `mixlayer` | `mixlayer` | Mixlayer | API-nøgle, aggregator | [link](https://www.mixlayer.com) | Modellen qwen/qwen3.5-4b-free er gratis til prototyper og hastighedsbegrænset; ingen fast offentlig RPM eller daglig kvote er bekræftet. | +| `mnn-ai` | `mnn-ai` | MNN AI | API-nøgle, aggregator | [link](https://mnnai.ru) | Gratisabonnement: $1 i månedlige kreditter, 10 RPM og kun adgang til modeller markeret som Gratis. | +| `modal` | `mdl` | Modal | API-nøgle, virksomhed | [link](https://modal.com/docs) | Brug det Bearer-token, der beskytter din Modal-implementering, hvis det er aktiveret. Basis-URL'en skal pege på din OpenAI-kompatible Modal-app, f.eks. https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API-nøgle | [link](https://modelscope.cn) | Gratis niveau via ModelScope API-Inference — Alibaba-konto påkrævet. | +| `monsterapi` | `monster` | MonsterAPI | API-nøgle | [link](https://monsterapi.ai) | ⚠️ **UDFASERET.** Monster API indstillede driften den 2026-06-30. Brug alternative OpenAI-kompatible udbydere. | +| `moonshot` | `moonshot` | Kimi | API-nøgle | [link](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API-nøgle | [link](https://morphllm.com) | Gratis niveau: 250.000 kreditter/måned, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API-nøgle | [link](https://github.com/meta-llama/llama-stack) | Brug din META_API_KEY-miljøvariabel som et Bearer-token. Muse Code CLI bruger OpenAI Responses API's wire-format (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API-nøgle, aggregator | [link](https://naga.ac) | Hent en API-nøgle på naga.ac — tilmelding via Google/GitHub/Discord er tilgængelig. | +| `naga-ai` | `naga-ai` | Naga AI | API-nøgle, aggregator | [link](https://naga.ac) | Modeller markeret med :free er offentligt angivet, men ingen numerisk kvote er bekræftet. Nagas politik advarer om, at prompts og output på gratisniveauet kan blive indsamlet eller brugt til træning. | +| `nanogpt` | `nanogpt` | NanoGPT | API-nøgle | [link](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API-nøgle | [link](https://bynara.id) | Opret en gratis NaraRouter-konto, tilknyt din Telegram-konto (påkrævet før /v1-svar), og indsæt derefter nøglen her som et Bearer-token. | +| `navy` | `navy` | NavyAI | API-nøgle | [link](https://api.navy) | Opret en gratis API-nøgle fra NavyAI-kontrolpanelet, og indsæt den derefter her som et Bearer-token. | +| `nebius` | `nebius` | Nebius AI | API-nøgle | [link](https://nebius.com) | Ca. $1 i prøvekreditter ved tilmelding til API-test | +| `nlpcloud` | `nlpc` | NLP Cloud | API-nøgle | [link](https://docs.nlpcloud.com) | Brug din NLP Cloud-API-nøgle i Authorization: Token . OmniRoute bruger som standard chatbot-slutpunktet på https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API-nøgle | [link](https://nomic.ai) | Hent en API-nøgle på atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | API-nøgle | [link](https://portal.nousresearch.com/help) | Brug din Nous Portal-API-nøgle. OmniRoute bruger det officielle OpenAI-kompatible inferensslutpunkt på https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API-nøgle, video, aggregator | [link](https://novita.ai) | $0.50 i prøvekreditter ved tilmelding (gyldige i ca. 1 år) | +| `nscale` | `nscale` | nScale | API-nøgle | [link](https://nscale.com) | $5 i gratis kreditter ved tilmelding til inferenstest | +| `nube` | `nube` | Nube.sh | API-nøgle | [link](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API-nøgle | [link](https://build.nvidia.com) | Gratis udvikleradgang: ca. 40 RPM, mere end 70 modeller (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API-nøgle, virksomhed | [link](https://www.oracle.com/artificial-intelligence/generative-ai) | Brug din OCI Generative AI-API-nøgle eller dit IAM-bearer-token. Basis-URL'en kan være https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | API-nøgle, aggregator | [link](https://ofox.ai) | Det aktuelle katalog annoncerer mere end 10 gratis modeller uden en offentlig numerisk kvote; gennemgå den underliggende leverandørs oprindelse samt vilkår for opbevaring og træning før brug i produktion. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-nøgle | [link](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API-nøgle | [link](https://1min.ai) | Opret en API-nøgle på https://docs.1min.ai/docs/api/create-api-key, og indsæt den derefter her. | +| `openadapter` | `oad` | OpenAdapter | API-nøgle | [link](https://openadapter.dev) | Brug din OpenAdapter-API-nøgle i Authorization: Bearer sk-cv-. Fuldt OpenAI-kompatibel. API-basis-URL: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API-nøgle | [link](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API-nøgle | [link](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-nøgle | [link](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API-nøgle | [link](https://openference.com) | Gratisniveau: omfatter Qwen3.8 27b og Llama 3.2 3B — se openference.com/pricing for de aktuelle vilkår | +| `openrouter` | `openrouter` | OpenRouter | API-nøgle, aggregator | [link](https://openrouter.ai) | Gratis modeller til $0/token med suffikset :free – 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API-nøgle | [link](https://openvecta.com) | Gratis kreditter ved tilmelding til OpenAI-kompatibel inferens på tværs af LLM'er, embeddings og ræsonneringsmodeller | +| `opper` | `opper` | Opper | API-nøgle, aggregator | [link](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API-nøgle | [link](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API-nøgle | [link](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API-nøgle | [link](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-nøgle | [link](https://www.perplexity.ai) | Brug din Perplexity-API-nøgle. OmniRoute sender Agent API-model-id'er gennem Perplexitys Responses-kompatible slutpunkt. | +| `piapi` | `pi` | PiAPI | API-nøgle, aggregator | [link](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API-nøgle | [link](https://pioneer.ai) | $75 i gratis brugskreditter — intet kreditkort påkrævet | +| `plamo` | `plamo` | PLaMo | API-nøgle | [link](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API-nøgle, aggregator | [link](https://creator.poe.com/api-reference) | Bearer-API-nøgle til Poes OpenAI-kompatible API. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API-nøgle, aggregator | [link](https://poixe.com) | De aktuelle offentlige gratisgrænser er lave og specifikke for modelgrupper: 2 RPM/5 RPD for large-cup-modeller og 20 RPM/50 RPD for small-cup-modeller. | +| `pollinations` | `pol` | Pollinations AI | API-nøgle, video | [link](https://pollinations.ai) | Anonym/nøglefri adgang til de dokumenterede gratis modeller leveres efter bedste evne. Lokal verifikation med v3.8.50 (2026-07-31) returnerede 401 via OmniRoute og Cloudflare 1010 ved direkte forespørgsler til den underliggende tjeneste fra det samme netværk. Premium-modeller kræver stadig en Pollinations-API-nøgle fra enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API-nøgle | [link](https://poolside.ai) | Laguna S 2.1 og XS 2.1 er gratis under Preview; der er ikke offentliggjort nogen numerisk kvote. | +| `predibase` | `predibase` | Predibase | API-nøgle | [link](https://predibase.com) | ⚠️ **UDFaset.** serving.app.predibase.com kan ikke længere slås op (gennemgang 2026-06-19); API'en til administreret serving ser ud til at være lukket. | +| `publicai` | `publicai` | PublicAI | API-nøgle | [link](https://publicai.co) | Kræver en API-nøgle — engangskredit ved tilmelding, derefter betaling | +| `qianfan` | `qianfan` | Baidu Qianfan | API-nøgle | [link](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API-nøgle | [link](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API-nøgle | [link](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-nøgle | [link](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API-nøgle, billede | [link](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API-nøgle | [link](https://regolo.ai) | Hent din Regolo API-nøgle fra regolo.ai, og indsæt den derefter her som et Bearer-token. | +| `reka` | `reka` | Reka | API-nøgle | [link](https://docs.reka.ai/chat/overview) | Brug din Reka API-nøgle. OmniRoute understøtter den OpenAI-kompatible basis-URL https://api.reka.ai/v1 og sender både Authorization- og X-Api-Key-headere af hensyn til kompatibilitet. | +| `requesty` | `requesty` | Requesty | API-nøgle | [link](https://requesty.ai) | Gratis niveau med ca. 200 anmodninger pr. dag – routinggateway til flere modeller (300+ modeller) | +| `routeway` | `routeway` | Routeway | API-nøgle | [link](https://routeway.ai) | Opret en gratis API-nøgle på routeway.ai, og indsæt den derefter her som et Bearer-token. | +| `runwayml` | `runway` | Runway | API-nøgle, video | [link](https://docs.dev.runwayml.com) | Brug din Runway API-nøgle i Authorization: Bearer . OmniRoute bruger den aktuelle Runway API på https://api.dev.runwayml.com/v1 og sender automatisk den påkrævede X-Runway-Version-header. | +| `sambanova` | `samba` | SambaNova | API-nøgle | [link](https://sambanova.ai) | $5 i gratis kredit ved tilmelding (gyldig i 30 dage), intet kreditkort påkrævet | +| `sap` | `sap` | SAP Generative AI Hub | API-nøgle, virksomhed | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Brug dit SAP AI Core bearer-token. Basis-URL'en kan være din AI_API_URL-rod eller en deploymentUrl fra Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | API-nøgle | [link](https://docs.sarvam.ai) | ₹1,000 i gratis kredit ved tilmelding – udløber aldrig | +| `scaleway` | `scw` | Scaleway AI | API-nøgle | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M gratis tokens til nye konti – EU-/GDPR-kompatibel (Paris), Qwen3 235B og Llama 70B | +| `sealion` | `sealion` | SEA-LION | API-nøgle | [link](https://sea-lion.ai) | Log ind på sea-lion.ai med Google (intet kort, ingen regionsbegrænsning), opret en API-nøgle, og indsæt den derefter her. | +| `seekai` | `ska` | SeekAi | API-nøgle, aggregator | [link](https://seekai.cc) | Opret en API-nøgle på https://seekai.cc, og indsæt den derefter her som et Bearer-token. | +| `segmind` | `segmind` | Segmind | API-nøgle, billede, video | [link](https://segmind.com) | Brug din Segmind API-nøgle i x-api-key-headeren. OmniRoute bruger https://api.segmind.com/v1/ og returnerer de genererede billed-/videobytes direkte. | +| `sensenova` | `sensenova` | SenseNova | API-nøgle | [link](https://platform.sensenova.cn) | Hent en API-nøgle på platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | API-nøgle | [link](https://cloud.siliconflow.com) | $1 i gratis kredit samt aktuelt angivne $0-modeller efter identitetsbekræftelse; tilgængelighed og grænser kan ændres | +| `snowflake` | `snowflake` | Snowflake Cortex | API-nøgle, virksomhed | [link](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API-nøgle | [link](https://xinghuo.xfyun.cn) | Hent en API-nøgle på console.xfyun.cn | +| `speka` | `speka` | Speka AI | API-nøgle, aggregator | [link](https://speka.me) | Gratis abonnement: $1 i månedligt forbrug, 10 RPM, én API-nøgle og adgang til åbne modeller og playground; intet kort påkrævet. | +| `stability-ai` | `stability` | Stability AI | API-nøgle, billede | [link](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API-nøgle | [link](https://stepfun.com) | Hent en API-nøgle på platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | API-nøgle | [link](https://ai.sumopod.com) | Brug din SumoPod API-nøgle (sk-...) i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API-nøgle | [link](https://suno.ai) | Indsæt sessionscookien fra suno.ai (Clerk-godkendelse) | +| `synthetic` | `synthetic` | Synthetic | API-nøgle, aggregator | [link](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API-nøgle, aggregator | [link](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API-nøgle | [link](https://hunyuan.tencent.com) | Hent en API-nøgle på console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | API-nøgle, aggregator | [link](https://theb.ai) | Bearer API-nøgle til den OpenAI-kompatible TheB.AI-gateway. | +| `tinyfish` | `tf` | TinyFish Fetch | API-nøgle | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key fra agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API-nøgle, video | [link](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API-nøgle | [link](https://agent-router.gaib.ai) | Brug din Token Kiosk API-nøgle i Authorization: Bearer . Fuldt OpenAI-kompatibel gateway. API-basis-URL: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API-nøgle, aggregator | [link](https://www.tokenreply.com) | Modeller mærket som gratis har model- og kampagnespecifikke daglige grænser; der er ikke offentliggjort nogen fast global gratiskvote. | +| `tokenrouter` | `trk` | TokenRouter | API-nøgle | [link](https://tokenrouter.com) | Brug din TokenRouter API-nøgle i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API-nøgle, billede | [link](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API-nøgle | [link](https://docs.opentyphoon.ai) | Gratis API-nøgle med en hastighedsgrænse på 5 anmodninger/s og 200 anmodninger/min. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API-nøgle | [link](https://uncensored.com) | Brug din uncensored.com Developer API-nøgle (uai_sk_live_...). OmniRoute sender den som X-api-key-headeren til det OpenAI-kompatible https://api.uncensored.com/api/v1-slutpunkt. Nøglen udløber aldrig. Dette er den forbrugsafregnede kreditbaserede grænseflade; abonnementchatten uden forbrugsafregning er den separate 'uc'-udbyder. | +| `udio` | `udio` | Udio | API-nøgle | [link](https://udio.com) | Indsæt sessionscookien fra udio.com (Supabase-godkendelse) | +| `unorouter` | `unorouter` | UnoRouter | API-nøgle, aggregator | [link](https://unorouter.ai) | Modeller med suffikset :free trækker ikke fra saldoen; grænsen er 1 anmodning/minut pr. gratis model pr. bruger. | +| `upstage` | `upstage` | Upstage | API-nøgle | [link](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API-nøgle | [link](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API-nøgle | [link](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API-nøgle, aggregator | [link](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API-nøgle, virksomhed | [link](https://cloud.google.com/vertex-ai) | Angiv Service Account JSON, et OAuth-adgangstoken, en Vertex Express API-nøgle eller en godkendelsesnøgle, der er knyttet til en tjenestekonto. Express-tilstand understøtter kun Gemini; partnermodeller kræver legitimationsoplysninger, der er knyttet til et projekt. | +| `vertex-partner` | `vp` | Vertex AI Partners | API-nøgle, virksomhed | [link](https://cloud.google.com/vertex-ai) | Angiv Service Account JSON eller OAuth-legitimationsoplysninger. En godkendelsesnøgle, der er knyttet til en tjenestekonto, understøtter også registrering, men partnerinferens kræver desuden dens Google Cloud-projekt-id. Standard-Express-nøgler understøtter kun Gemini. | +| `void-ai` | `void-ai` | Void AI | API-nøgle, aggregator | [link](https://voidai.app) | Det offentlige modelkatalog markerer nogle modeller med et krav om et gratis abonnement, men adgangen er betinget, og ingen numerisk kvote er bekræftet. | +| `volcengine` | `volcengine` | Volcengine | API-nøgle | [link](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API-nøgle | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Tilslut din Volcano Engine-konto, eller brug en abonnements-API-nøgle til Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API-nøgle | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Tilslut din Volcano Engine-konto, eller brug en abonnements-API-nøgle til Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | API-nøgle, indlejring/omrangering | [link](https://www.voyageai.com) | Bearer-API-nøgle til Voyage AI's API'er til indlejringer og omrangering. | +| `wafer` | `wafer` | Wafer AI | API-nøgle | [link](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API-nøgle | [link](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API-nøgle, virksomhed | [link](https://www.ibm.com/products/watsonx-ai) | Brug dit watsonx-bearertoken. Basis-URL'en kan være https://.ml.cloud.ibm.com/ml/gateway/v1/ eller et selvadministreret /ml/gateway/v1-slutpunkt. | +| `writer` | `writer` | Writer | API-nøgle | [link](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API-nøgle | [link](https://x5lab.dev) | Brug din X5Lab API-nøgle (x5-...) i Authorization: Bearer . Fuldt OpenAI-kompatibel. API-basis-URL: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API-nøgle | [link](https://x.ai) | Brug en officiel xAI API-nøgle, eller log ind med xAI OAuth. Grok Build JWT-sessioner forbliver en separat udbyder. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API-nøgle | [link](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API-nøgle | [link](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API-nøgle, aggregator | [link](https://xkiro.com) | Opret en gratis konto på xkiro.com, og indsæt nøglen her (Bearer; x-api-key accepteres også). | +| `yi` | `yi` | Yi (01.AI) | API-nøgle | [link](https://01.ai) | Hent en API-nøgle på platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API-nøgle, aggregator | [link](https://yolo-auto.com) | Gratis API-adgang er begrænset efter antal anmodninger og beregnet til test; der er ikke offentliggjort nogen numerisk daglig kvote, og gratis adgang loves ikke på ubestemt tid. | +| `zai` | `zai` | Z.AI | API-nøgle | [link](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API-nøgle | [link](https://zenmux.ai) | Brug din ZenMux API-nøgle i Authorization: Bearer . ZenMux er fuldt OpenAI-kompatibel. Basis-URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API-nøgle, aggregator | [link](https://www.zerolimitai.com) | Der annonceres med en midlertidig gratis prøveperiode, men de officielle sider er uenige om, hvorvidt den varer 3 eller 7 dage; en påstand om 100 kald/dag betragtes ikke som permanent. | +| `zylo-api` | `zylo` | Zylo API | API-nøgle, aggregator | [link](https://zyloai.net) | Basic-abonnement: 10 RPM, 7.200 anmodninger/dag og 200.000 tokens/dag; begrænset til Basic-tekstmodeller. | ## Lokale udbydere (14) diff --git a/docs/i18n/da/docs/routing/REASONING_REPLAY.md b/docs/i18n/da/docs/routing/REASONING_REPLAY.md index 85ccfad29f34..0c677fe68436 100644 --- a/docs/i18n/da/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/da/docs/routing/REASONING_REPLAY.md @@ -25,19 +25,21 @@ Men typiske klienter (Cursor, Cline, Roo Code, OpenAI SDK) fjerner `reasoning_co Tur N (assistenten genererer): → svaret indeholder reasoning_content + tool_calls → hvis requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - skriver (hukommelse + DB), med hver tool_call.id som nøgle - → videresend svaret til klienten (som muligvis bevarer ræsonnementet) + skriver (hukommelse + DB), nøglebaseret på hvert tool_call.id + → videresend svaret til klienten (som muligvis gemmer reasoning eller ej) -Tur N+1 (klienten sender en opfølgning): +Tur N+1 (klienten sender opfølgning): → oversætteren registrerer: requiresReasoningReplay(provider, model) === true - → for hver assistentbesked med tool_calls og uden reasoning_content: + → for hver assistentmeddelelse med tool_calls og uden reasoning_content: lookupReasoning(toolCalls[0].id) → hukommelse → DB fundet → msg.reasoning_content = cached; recordReplay() - ikke fundet → msg.reasoning_content = "" (ældre reserveadfærd for ældre DeepSeek) - → upstream-tjenesten modtager konsistent historik → ingen 400 + ikke fundet → msg.reasoning_content = "" (ældre fallback for tidligere DeepSeek) + → upstream ser konsistent historik → ingen 400 ``` -Registrering sker i `open-sse/handlers/chatCore.ts` (to steder ved de to kald til `cacheReasoningFromAssistantMessage`). Afspilning sker i `open-sse/translator/index.ts` efter skemakonvertering, men før videresendelse. +Registrering sker i `open-sse/handlers/chatCore.ts` (to steder, ved de to kald til `cacheReasoningFromAssistantMessage`). Genafspilning sker i `open-sse/translator/index.ts` efter skemakonvertering, men før videresendelse. + +Almindelige assistentture (uden værktøjskald) nøglebaseres anderledes: `buildAssistantMessageCacheKey()` beregner et digest af sessionskonteksten samt transskriptionen i normaliseret OpenAI-format frem til den pågældende tur, fordi DeepSeek kræver reasoning fra _hver_ tidligere tur, når `tools` er til stede. For Responses-API-mål (for eksempel `opencode-go/deepseek-v4-flash`, dirigeret til `/responses`) indeholder upstream-brødteksten `input`, ikke `messages`, så rapporterer `translateRequest()` (`open-sse/translator/index.ts`) den pivottransskription, som den beregnede et digest af, via en callback-indstilling, og registreringsstederne beregner et digest af den samme transskription. Responses-genafspilningspasset kører på OpenAI-pivoten for alle kildeformater, så Anthropic Messages-klienter (Claude → OpenAI → Responses) genafspilles også. ## Lagring — hybrid hukommelse + SQLite @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -Indekser: `expires_at`, `provider`, `model`, `created_at`. `expires_at` gemmes som Unix-epokesekunder; SELECT-laget normaliserer ældre tekstværdier via `EXPIRES_AT_EPOCH_SQL`. +Indekser: `expires_at`, `provider`, `model`, `created_at`. `expires_at` gemmes som sekunder siden Unix-epoken; SELECT-laget normaliserer ældre tekstværdier via `EXPIRES_AT_EPOCH_SQL`. ## Registrering af udbyder/model diff --git a/docs/i18n/da/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/da/docs/security/SOCKET_DEV_FINDINGS.md index a9c6e3e9fff4..4a552b7c4d0c 100644 --- a/docs/i18n/da/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/da/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- -Dette dokument er den vedligeholderforfattede attestering for de seks -`AI-detected potential malware`-fund, der blev rejst mod `omniroute@3.8.5`, og -de afhjælpninger, der blev implementeret i `omniroute@3.8.6`. Det findes, så: +> **Bemærkning om omfang:** `socket.yml` konfigurerer Socket.devs scanning af npm-artefaktet i registreringsdatabasen efter udgivelse (ignorerede stier for indhold, der ikke udgives, såsom `tests/`, `docs/` og buildrapporter). Den opsætter ikke en CI-/PR-fletningskontrol — ingen workflowfil i `.github/workflows`, intet script i `package.json` og intet mål i `Makefile` kalder Socket.dev. + +Dette dokument er vedligeholderens attestering af de seks +`AI-detected potential malware`-fund, der blev rapporteret for `omniroute@3.8.5`, og +de afhjælpninger, der er implementeret i `omniroute@3.8.6`. Det findes, så: 1. Operatører af sikkerhedspipelines har én samlet reference at henvise til, når de skal - evaluere fundene i forhold til den faktiske kildekode. -2. Fremtidige AI-scannere kan registrere den vedligeholderunderskrevne erklæring om, at hver - markeret sti er tilsigtet, tilvalgsbaseret og dokumenteret. -3. Vi har en skriftlig registrering af, _hvorfor_ hvert kaldested er udformet, som det er — + vurdere fundene i forhold til den faktiske kildekode. +2. Fremtidige AI-scannere kan opfange vedligeholderens underskrevne erklæring om, at hver + markeret sti er tilsigtet, kræver aktivt tilvalg og er dokumenteret. +3. Vi har en skriftlig dokumentation for, _hvorfor_ hvert kaldested er udformet, som det er — så en fremtidig refaktorering ikke ved et uheld genindfører et fingeraftryk, der bevidst blev fjernet. Hvis du driver en scanner, der igen markerer et af kaldestederne nedenfor, efter at -v3.8.6-afhjælpningerne er blevet udgivet, bedes du oprette en issue med scanningssporet, så -udvider vi attesteringen her. +afhjælpningerne i v3.8.6 er blevet udgivet, bedes du oprette en issue med scanningsloggen, +så udvider vi attesteringen her. --- diff --git a/docs/i18n/de/README.md b/docs/i18n/de/README.md index bcc515049488..acd9c2c7b8a4 100644 --- a/docs/i18n/de/README.md +++ b/docs/i18n/de/README.md @@ -19,17 +19,17 @@
-## 💰 ~1.62B kostenlose Tokens / Monat +## 💰 ~1,62 Mrd. kostenlose Tokens / Monat
-> Kostenlose Kontingente manuell zu bündeln ist mühsam — Dutzende SDKs, Dutzende Ratenbegrenzungen und keine Ahnung, wie viel tatsächlich verfügbar ist. OmniRoute katalogisiert **491 Einträge mit kostenlosem Kontingent über 35 wiederkehrende Pool-Schlüssel hinweg** und berechnet die angegebene Token-Gesamtsumme anhand der **17 Pools mit einem veröffentlichten positiven monatlichen Budget sowie fünf modellspezifischen Groq-Limits**, wobei gemeinsam genutzte Pools dedupliziert werden. Kontingente, die erst nach einer regionalen Identitätsprüfung freigeschaltet werden (derzeit: ModelScope), werden separat ausgewiesen: +~6M hinter einer regionalen Identitätsprüfung. Sie werden niemals in die Gesamtsumme eingerechnet. Das Ergebnis bleibt im Dashboard sichtbar (`/dashboard/free-tiers`). +> Kostenlose Kontingente manuell zu kombinieren ist mühsam — Dutzende SDKs, Dutzende Ratenbegrenzungen und keine Ahnung, wie viel tatsächlich verfügbar ist. OmniRoute katalogisiert **489 Einträge mit kostenlosen Kontingenten über 35 wiederkehrende Pool-Schlüssel hinweg** und berechnet die angegebene Token-Gesamtmenge aus den **17 Pools mit einem veröffentlichten positiven monatlichen Budget sowie fünf modellspezifischen Groq-Obergrenzen**, wobei gemeinsam genutzte Pools dedupliziert werden. Kontingente, die erst nach einer regionalen Identitätsprüfung verfügbar werden (derzeit: ModelScope), werden separat ausgewiesen — +~6 Mio. hinter einer regionalen Identitätsprüfung — und niemals in die Gesamtangabe einbezogen. Das Ergebnis bleibt im Dashboard (`/dashboard/free-tiers`) sichtbar. -OmniRoute-Karte für kostenlose Kontingente: dauerhaft ~1.62B kostenlose Tokens pro Monat, im ersten Monat mit Registrierungsguthaben bis zu ~2.22B, aus 35 dokumentierten wiederkehrenden Pool-Schlüsseln, die 491 katalogisierte Einträge mit kostenlosem Kontingent hinter einem einzigen Endpunkt abdecken. Ehrliche, nach Pools deduplizierte Berechnung — jeder gemeinsam genutzte Pool wird nur einmal gezählt, darunter 17 wiederkehrende Pools mit einem veröffentlichten positiven monatlichen Token-Budget sowie fünf modellspezifische Groq-Limits; 13 Anbieter sind im Katalog für AGB-Risiken mit „vermeiden“ gekennzeichnet, sodass du selbst entscheiden kannst. Der Budgetbalken umfasst Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (fünf modellspezifische Limits) sowie kleinere Pools. Registrierungsguthaben für den ersten Monat und dauerhaft kostenlose Anbieter ohne Token-Limit werden separat angezeigt, damit sie die Gesamtsumme niemals künstlich erhöhen. Live-Anzeige von verbrauchten und verbleibenden Tokens unter /dashboard/free-tiers. +OmniRoute-Karte für kostenlose Kontingente: dauerhaft ~1,62 Mrd. kostenlose Tokens pro Monat, im ersten Monat mit Registrierungsguthaben bis zu ~2,22 Mrd., aus 35 dokumentierten wiederkehrenden Pool-Schlüsseln, die 489 katalogisierte Einträge mit kostenlosen Kontingenten hinter einem einzigen Endpunkt abdecken. Ehrliche, nach Pools deduplizierte Berechnung — jeder gemeinsam genutzte Pool wird nur einmal gezählt, einschließlich 17 wiederkehrender Pools mit einem veröffentlichten positiven monatlichen Token-Budget sowie fünf modellspezifischen Groq-Obergrenzen; 13 Anbieter sind im Katalog für Nutzungsbedingungen-Risiken als zu vermeiden gekennzeichnet, damit du selbst entscheiden kannst. Der Budgetbalken umfasst Mistral 1 Mrd., Nara 210 Mio., LLM7 150 Mio., xKiro 150 Mio., Groq 30 Mio. (fünf modellspezifische Obergrenzen) und kleinere Pools sowie Registrierungsguthaben für den ersten Monat; dauerhaft kostenlose Anbieter ohne Token-Obergrenze werden separat angezeigt, damit sie die Gesamtangabe niemals künstlich erhöhen. Live-Anzeige von verbrauchten/verbleibenden Tokens unter /dashboard/free-tiers. -> Animierte Zusammenfassung der Live-Seite `/dashboard/free-tiers`. Vollständige Methodik (Pool-Deduplizierung, Guthabenstufen, Anbieterbedingungen): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Animierte Zusammenfassung der Live-Seite `/dashboard/free-tiers`. Vollständige Methodik (Pool-Deduplizierung, Guthabenstufen, Nutzungsbedingungen der Anbieter): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Diese Zahlen werden alle zwei Wochen anhand des Live-Katalogs erneut geprüft und **können sich in beide Richtungen bewegen** — beendet ein Anbieter sein kostenloses Kontingent, sinkt die Zahl; kommt ein neues hinzu, steigt sie. Wir veröffentlichen, was der Katalog tatsächlich berechnet, niemals einen aufgerundeten Bestfall. +> Diese Zahlen werden alle zwei Wochen anhand des Live-Katalogs erneut geprüft und **können in beide Richtungen schwanken** — beendet ein Anbieter sein kostenloses Kontingent, sinkt die Zahl; kommt ein neues hinzu, steigt sie. Wir veröffentlichen, was der Katalog tatsächlich berechnet, niemals einen aufgerundeten Bestfall.
@@ -50,8 +50,8 @@ **👋 Folge dem Maintainer — erfahre als Erstes von neuen Anbietern, Releases und Tipps:** -[![Folge Diego auf LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) -[![Folge @diegosouzapw auf GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) +[![Diego auf LinkedIn folgen](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) +[![@diegosouzapw auf GitHub folgen](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) @@ -59,7 +59,7 @@ [![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Website](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Fragen, Anbietertipps, Roadmap und Support → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Fragen, Anbietertipps, Roadmap und Support → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasilien](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -635,23 +635,23 @@ zum aktuellen Katalog finden Sie unter **[radar.omniroute.online/planos](https:/ Goose
Goose
                            Open Interpreter
Open Interpreter
                            Warp AI
Warp AI
                            - Agent Deck
Agent Deck
                            + deyin.ai
deyin.ai
                           
-+ funktioniert auch mit · Kiro · Command Code · Antigravity · Windsurf · AMP · jedem OpenAI-kompatiblen Tool ++ funktioniert auch mit · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · jedem OpenAI-kompatiblen Tool
-📖 Einrichtung pro Tool für alle 36 Tools (26 CLI-Code-Tools + 10 CLI-Agenten) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode-Plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Einrichtung aller 36 Tools (26 CLI-Codes + 10 CLI-Agenten) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode-Plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)
-**Starte jede unterstützte CLI mit einem einzigen Befehl über OmniRoute** — es werden keine Konfigurationsdateien geschrieben, -Anmeldedaten werden pro Prozess injiziert und Qwen/Gemini erhalten ein temporäres, isoliertes Home-Verzeichnis: +**Starten Sie jede unterstützte CLI mit nur einem Befehl über OmniRoute** — ohne dass Konfigurationsdateien geschrieben werden, +Anmeldedaten werden pro Prozess injiziert, und Qwen/Gemini erhalten ein temporäres, isoliertes Home-Verzeichnis: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -662,13 +662,13 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Oder Anbieter und Modell interaktiv auswählen und die eigene Konfiguration des Tools schreiben: -omniroute configure codex # außerdem: claude opencode qwen aider goose gemini cline continue kilo +# Oder wählen Sie Anbieter und Modell interaktiv aus und schreiben Sie die eigene Konfiguration des Tools: +omniroute configure codex # ebenfalls: claude opencode qwen aider goose gemini cline continue kilo ``` Jeder Befehl berücksichtigt den aktiven Remote-Kontext (`omniroute connect `), `--dry-run` -zeigt die exakten Umgebungsvariablen/Argumente in einer Vorschau an, ohne sie auszuführen, und `--api-key-env NAME` hält Geheimnisse -aus deinem Shell-Verlauf fern. → [CLI-Integrationen](docs/guides/CLI-INTEGRATIONS.md) +zeigt die exakten Umgebungsvariablen/Argumente als Vorschau an, ohne sie auszuführen, und `--api-key-env NAME` hält Geheimnisse +aus Ihrem Shell-Verlauf heraus. → [CLI-Integrationen](docs/guides/CLI-INTEGRATIONS.md)
@@ -678,11 +678,11 @@ aus deinem Shell-Verlauf fern. → [CLI-Integrationen](docs/guides/CLI-INTEGRATI -> **357 registrierte Anbieter** in den kanonischen Sammlungen für Chat, Medien, Suche, lokale Dienste, Cloud-Agenten und Systemdienste, darunter **152 mit `hasFree: true` als Discovery-Metadatum**. Das Register für Chatmodelle umfasst **229 Anbieter / 2.554 unterschiedliche Anbieter-Modell-Paare / 1.283 ursprüngliche Modell-IDs**; der separate Katalog für kostenlose Kontingente enthält **491 modellspezifische Einträge**, **35 wiederkehrende Pools** und **54 wiederkehrende/schlüssellose, dauerhaft kostenlose Anbieter**. Diese Nenner unterscheiden sich absichtlich; Definitionen und nach Pools deduplizierte Berechnungen finden Sie in der [Anbieterreferenz](docs/reference/PROVIDER_REFERENCE.md) und unter [Kostenlose Tarife](docs/reference/FREE_TIERS.md). +> **357 registrierte Anbieter** in den kanonischen Sammlungen für Chat, Medien, Suche, lokale Dienste, Cloud-Agenten und Systeme, darunter **152 mit den Discovery-Metadaten `hasFree: true`**. Das Chat-Modellregister umfasst **229 Anbieter / 2.554 eindeutige Anbieter-Modell-Paare / 1.283 ursprüngliche Modell-IDs**; der separate Katalog für kostenlose Kontingente enthält **491 modellspezifische Einträge**, **35 wiederkehrende Pools** und **54 wiederkehrende/schlüssellose, dauerhaft kostenlose Anbieter**. Diese Nenner unterscheiden sich bewusst; Definitionen und poolbereinigte Berechnungen finden Sie in der [Anbieterreferenz](docs/reference/PROVIDER_REFERENCE.md) und unter [Kostenlose Kontingente](docs/reference/FREE_TIERS.md).
-### 🏢 Jedes große KI-Labor — über einen einzigen Endpunkt +### 🏢 Jedes große Forschungslabor — über einen einzigen Endpunkt @@ -696,7 +696,7 @@ aus deinem Shell-Verlauf fern. → [CLI-Integrationen](docs/guides/CLI-INTEGRATI - + @@ -711,7 +711,7 @@ aus deinem Shell-Verlauf fern. → [CLI-Integrationen](docs/guides/CLI-INTEGRATI
Qwen
Qwen
                           
Meta Llama
Meta Llama
                           
Groq
Groq
                           
Groq
Groq
                           
NVIDIA
NVIDIA
                           
MiniMax
MiniMax
                           
Cohere
Cohere
                           
-…und über 330 weitere — jedes Symbol wird live aus dem Anbieterkatalog des Dashboards geladen. 📖 [Anbieterreferenz](docs/reference/PROVIDER_REFERENCE.md) +…und mehr als 330 weitere — jedes Symbol wird live aus dem Anbieterkatalog des Dashboards geladen. 📖 [Anbieterreferenz](docs/reference/PROVIDER_REFERENCE.md)
@@ -719,10 +719,10 @@ aus deinem Shell-Verlauf fern. → [CLI-Integrationen](docs/guides/CLI-INTEGRATI - + - + @@ -731,7 +731,7 @@ aus deinem Shell-Verlauf fern. → [CLI-Integrationen](docs/guides/CLI-INTEGRATI - +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Kein Token-Limit
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Keine Token-Begrenzung
Kilo Code
Kilo Code
Auto-Router, Tencent Hy3
Für immer kostenlos
Requesty
Requesty
GPT-OSS 120B, Nemotron
Für immer kostenlos
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Kostenloser Tarif
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Kostenloses Kontingent
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Für immer kostenlos
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Für immer kostenlos
Pollinations
Pollinations
GPT, Llama, Claude
Kein Schlüssel erforderlich
Cloudflare AI
Cloudflare AI
Über 50 Modelle
10.000 Neuronen/Tag
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM kostenlos
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1 Mio. Token/Tag
Openference
Openference
Qwen3.8 27B, Llama 3.2
Kostenloses Kontingent
OpenRouter
OpenRouter
:free-Modelle
+$10 → höhere RPM
@@ -1270,23 +1270,23 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132.
- + - - + + - + - - - + + + - - - + + +
SchichtTechnologie
EbeneTechnologie
LaufzeitumgebungNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
SpracheTypeScript 6.0 — 100 % TypeScript in src/ und open-sse/ (seit v2.0 kein any im Kern)
FrameworkNext.js 16 + React 19 + Tailwind CSS 4
Datenbankbetter-sqlite3 (SQLite, WAL-Journaling) + LowDB (JSON-Altsystem) — 122 Domänenmodule, 176 Migrationen
SpeicherSQLite-FTS5-Volltextsuche + int8-quantisierte Vektoreinbettungen, typisierter Verfall
Datenbankbetter-sqlite3 (SQLite, WAL-Journaling) + LowDB (JSON-Altsystem) — 122 Domänenmodule, 178 Migrationen
SpeicherSQLite-FTS5-Volltextsuche + int8-quantisierte Vektoreinbettungen, typisierter Zerfall
SchemataZod 4 — Validierung der Ein- und Ausgaben von MCP-Tools + API-Verträge
ProtokolleMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
StreamingServer-Sent Events (SSE) + WebSocket-Bridge (/v1/ws)
StreamingServer-Sent Events (SSE) + WebSocket-Brücke (/v1/ws)
KomprimierungPipeline mit 12 Engines — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Authentifizierung & SicherheitOAuth 2.0 (PKCE) + JWT + API-Schlüssel + bereichsgebundene MCP-Authentifizierung · AES-256-GCM für ruhende Daten · DOMPurify
Tarnungwreq-js — Nachahmung von JA3-/JA4-TLS-Fingerabdrücken, dreistufiger Proxy
AusfallsicherheitSchutzschalter, exponentieller Backoff, Schutz vor Anfragelawinen, selbstheilende automatische Kombinationen
Authentifizierung & SicherheitOAuth 2.0 (PKCE) + JWT + API-Schlüssel + bereichsbezogene MCP-Authentifizierung · AES-256-GCM für ruhende Daten · DOMPurify
Verschleierungwreq-js — Nachahmung von JA3- / JA4-TLS-Fingerabdrücken, dreistufiger Proxy
AusfallsicherheitLeistungsschutzschalter, exponentieller Backoff, Schutz vor Überlastung durch gleichzeitige Anfragen, selbstheilende automatische Kombination
Protokollierungpino — strukturierte JSON-Protokolle mit Anfragekontext
TestsNode.js-Test-Runner + Vitest — mehr als 39.000 statische Testdeklarationen in mehr als 5.100 nachverfolgten Testdateien (Unit-, Integrations-, E2E-, Sicherheits- und Ökosystemtests)
PlattformenDesktop (Electron) · Android (Termux) · PWA (beliebiger Browser)
CI/CDGitHub Actions — automatische Veröffentlichung auf npm und Docker Hub bei Releases
TestsNode.js-Test-Runner + Vitest — mehr als 39.000 statische Testdeklarationen in über 5.100 nachverfolgten Testdateien (Unit-, Integrations-, E2E-, Sicherheits- und Ökosystemtests)
PlattformenDesktop (Electron) · Android (Termux) · PWA (jeder Browser)
CI/CDGitHub Actions — automatische Veröffentlichung auf npm und Docker Hub bei einem Release
LinksWebsite · npm · Docker Hub
@@ -1303,24 +1303,24 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132. - - - - - + + + + +
DokumentBeschreibung
BenutzerhandbuchAnbieter, Kombinationen, CLI-Integration, Bereitstellung
EinrichtungshandbuchAlle Installationsmethoden, Konfigurationen für CLI-Tools, Protokolleinrichtung, Zeitüberschreitungsoptimierung
Handbuch für CLI-ToolsToolspezifische Einrichtung für Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo und Copilot
Remote-ModusEine entfernte OmniRoute-Instanz (VPS) über die Laptop-CLI mithilfe bereichsbeschränkter Zugriffstoken steuern
Claude-Code-KonfigurationClaude Code mit launch und modellspezifischen Profilen auf OmniRoute (lokal/remote) ausrichten
SchnellstartIn 3 Schritten installieren → verbinden → konfigurieren
EinrichtungsanleitungAlle Installationsmethoden, Konfigurationen für CLI-Tools, Protokolleinrichtung, Zeitüberschreitungsoptimierung
Leitfaden für CLI-ToolsToolspezifische Einrichtung für Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo und Copilot
Remote-ModusEine entfernte OmniRoute-Instanz (VPS) über die Laptop-CLI mithilfe von Zugriffstokens mit begrenztem Gültigkeitsbereich steuern
Claude-Code-KonfigurationClaude Code über launch und modellspezifische Profile mit OmniRoute (lokal/remote) verbinden
SchnellstartInstallation in 3 Schritten → verbinden → konfigurieren
### 🔧 Betrieb & Bereitstellung - - - + + + - - - + + +
DokumentBeschreibung
Docker-HandbuchDocker-Ausführung, Compose-Profile, Caddy HTTPS, Tunnel, Image-Tags
Podman-HandbuchQuadlet-systemd-Integration, podman-compose, SELinux
VM-BereitstellungVollständiges Handbuch: Einrichtung von VM + nginx + Cloudflare
Docker-LeitfadenDocker-Ausführung, Compose-Profile, Caddy-HTTPS, Tunnel, Image-Tags
Podman-LeitfadenQuadlet-systemd-Integration, podman-compose, SELinux
VM-BereitstellungVollständiger Leitfaden: Einrichtung von VM + nginx + Cloudflare
Fly.io-BereitstellungBereitstellung auf Fly.io mit persistentem Speicher
Termux-HandbuchOmniRoute über Termux unter Android ausführen
PWA-HandbuchInstallation, Caching und Architektur der Progressive Web App
DeinstallationshandbuchSaubere Entfernung für alle Installationsmethoden
Termux-LeitfadenOmniRoute über Termux unter Android ausführen
PWA-LeitfadenInstallation, Caching und Architektur der Progressive Web App
DeinstallationsanleitungSaubere Entfernung für alle Installationsmethoden
UmgebungskonfigurationVollständige .env-Variablen und Referenzen
@@ -1329,17 +1329,17 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132. - - - - + + + + - + - - + + - +
DokumentBeschreibung
ArchitekturSystemarchitektur, Datenfluss und interne Abläufe
KomprimierungshandbuchPipeline mit 7 Optionen: aus / leicht / standard / aggressiv / ultra / RTK / gestapelt
RTK-KomprimierungKomprimierung von Befehlsausgaben, Filter, Vertrauensprüfung, Verifizierung, Wiederherstellung der Rohausgabe
Komprimierungs-EnginesCaveman, RTK, gestapelte Pipelines, Dashboard-/API-/MCP-Schnittstellen
Format der KomprimierungsregelnJSON-Schemas für Regelpakete von Caveman- und RTK-Filtern
KomprimierungsleitfadenPipeline mit 7 Optionen: aus / leicht / Standard / aggressiv / ultra / RTK / gestapelt
RTK-KomprimierungKomprimierung von Befehlsausgaben, Filter, Vertrauen, Verifizierung, Wiederherstellung der Rohausgabe
Komprimierungs-EnginesCaveman, RTK, gestapelte Pipelines, Dashboard-/API-/MCP-Oberflächen
Format der KomprimierungsregelnJSON-Schemata für Regelpakete von Caveman- und RTK-Filtern
Komprimierungs-SprachpaketeSpracherkennung und Erstellung von Caveman-Regelpaketen
AusfallsicherheitshandbuchLeistungsschalter, Abklingzeiten, Warteschlange, Schutz vor Anfragestürmen, TLS-Spoofing
ResilienzleitfadenLeistungsschalter, Abkühlzeiten, Warteschlange, Schutz vor Anfragestürmen, TLS-Spoofing
Auto-Combo-EngineBewertung anhand von 16 Faktoren, Moduspakete, Selbstheilung
Proxy-HandbuchDreistufiges Proxy-System, 1proxy-Marktplatz, CRUD für die Registrierung
Kostenlose KontingenteKonsolidiertes Verzeichnis: 35 dokumentierte wiederkehrende Pools / 491 katalogisierte Einträge mit kostenlosem Kontingent
Proxy-Leitfaden3-stufiges Proxy-System, 1proxy-Marktplatz, CRUD für die Registry
Kostenlose TarifeKonsolidiertes Verzeichnis: 35 dokumentierte wiederkehrende Pools / 489 katalogisierte Gratis-Tarif-Einträge
FunktionsgalerieVisuelle Dashboard-Tour mit Screenshots
Codebasis-DokumentationEinsteigerfreundlicher Rundgang durch die Codebasis
Codebasis-DokumentationEinsteigerfreundliche Einführung in die Codebasis
### 🤖 Protokolle & APIs @@ -1349,9 +1349,9 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132. API-ReferenzAlle Endpunkte mit Beispielen OpenAPI-SpezifikationOpenAPI-3.0-Spezifikation MCP-Server110 MCP-Tools, IDE-Konfigurationen, Python-/TS-/Go-Clients - MCP-Server-HandbuchMCP-Installation, Übertragungsarten und Tool-Referenz + MCP-Server-LeitfadenMCP-Installation, Übertragungsarten und Tool-Referenz A2A-ServerJSON-RPC-2.0-Protokoll, Fähigkeiten, Streaming, Aufgabenverwaltung - A2A-Server-HandbuchA2A-Agentenkarte, Aufgaben, Fähigkeiten und Streaming + A2A-Server-LeitfadenA2A-Agentenkarte, Aufgaben, Fähigkeiten und Streaming ### 📋 Projekt & Qualität @@ -1359,19 +1359,19 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132. - + - +
DokumentBeschreibung
MitwirkenEinrichtung der Entwicklungsumgebung und Richtlinien
Branch- und Release-ModellAuf welche Branches PRs abzielen (release/*) und was main sowie Tags bedeuten
Branching- und Release-ModellAuf welche Branches PRs abzielen (release/*) und welche Bedeutung main und Tags haben
ÄnderungsprotokollVollständiger Release-Verlauf nach Version
SicherheitsrichtlinieMeldung von Schwachstellen und Sicherheitspraktiken
i18n-LeitfadenUnterstützung für 42 Sprachen, Übersetzungsworkflow, RTL
Release-ChecklisteValidierungsschritte vor dem Release
TestabdeckungsplanStrategie zur Testabdeckung für mehr als 39.000 statische Testdeklarationen in mehr als 5.100 erfassten Testdateien
TestabdeckungsplanTestabdeckungsstrategie für mehr als 39.000 statische Testdeklarationen in mehr als 5.100 erfassten Testdateien

-# ⭐ Top-Mitwirkende +# ⭐ Wichtigste Mitwirkende > OmniRoute wird von einer engagierten Open-Source-Community geprägt. Diese Personen haben außergewöhnliche Beiträge geleistet, die sich direkt auf die Qualität, Stabilität und Reichweite des Projekts auswirken. **Vielen Dank.** @@ -1402,7 +1402,7 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132. 20Prudhvivuda246,312 -Eingefroren beim aktuellen Stand von release/v3.8.50 mit dem Commit dafb4ae808, einschließlich Zusammenführungen bis 2026-08-24 05:26:03 UTC. Die paginierte GitHub-GraphQL-Erhebung umfasst 5.911 zusammengeführte PRs: 2.707 vom Repository-Eigentümer, 179 von Dependabot und 3.025 externe PRs von 535 verschiedenen Mitwirkenden. „Geänderte Zeilen“ entspricht den GitHub-Ergänzungen plus -Löschungen und umfasst generierte Dateien, Lockfiles, Kataloge, Übersetzungen und Dokumentation; dies misst den Änderungsumfang, nicht die selbst verfassten Codezeilen. Gleichstände an der Grenze werden beibehalten. +Eingefroren beim aktuellen Stand von release/v3.8.50 mit dafb4ae808, einschließlich Zusammenführungen bis 2026-08-24 05:26:03 UTC. Die paginierte GitHub-GraphQL-Erhebung enthält 5.911 zusammengeführte PRs: 2.707 vom Repository-Eigentümer, 179 von Dependabot und 3.025 externe PRs von 535 verschiedenen Mitwirkenden. „Geänderte Zeilen“ entspricht den GitHub-Hinzufügungen und -Löschungen und umfasst generierte Dateien, Lockfiles, Kataloge, Übersetzungen und Dokumentation; es handelt sich um Änderungsvolumen, nicht um selbst verfasste LOC. Gleichstände an der Auswahlgrenze werden beibehalten. ### GitHub-zugeordnete Commits @@ -1490,7 +1490,7 @@ Kanonische Kennzahlen vom 2026-08-24: **1.029 einzigartige Videos** · **11.132. -Erneut geprüft am 2026-08-24 um 06:14:31 UTC: GitHub-zugeordnete Commits, die von der Contributors API des Repositorys für den Standardbranch release/v3.8.50 gemeldet wurden. Die API gab 525 Identitäten zurück (415 Benutzer, 2 Bots, 108 anonyme Identitäten); diese Tabelle schließt den Maintainer, Bots und anonyme Identitäten aus und behält Platzgleichheiten bei. Sie unterscheidet sich sowohl von der obigen Rangliste der zusammengeführten PRs als auch von der unten aufgeführten, 639 Personen umfassenden Zählung der Git-Metadaten. +Erneut überprüft am 2026-08-24 um 06:14:31 UTC: GitHub-zugeordnete Commits, die von der Contributors API des Repositorys für den Standard-Branch release/v3.8.50 gemeldet wurden. Die API gab 525 Identitäten zurück (415 Benutzer, 2 Bots, 108 anonyme Identitäten); diese Tabelle schließt den Maintainer, Bots und anonyme Identitäten aus und berücksichtigt Gleichstände. Sie unterscheidet sich sowohl von der obigen Rangliste zusammengeführter PRs als auch von der unten stehenden, 639 Personen umfassenden Zählung auf Basis von Git-Metadaten. > 🙏 Die Funktionen, Fehlerbehebungen und Infrastrukturverbesserungen dieser Mitwirkenden sind ein **zentraler Bestandteil** dessen, was OmniRoute zuverlässig und funktionsreich macht. Jeder Pull Request, jeder Testfall und jede i18n-Übersetzungsdatei zählt. Open Source wird von Menschen wie ihnen geschaffen. diff --git a/docs/i18n/de/SECURITY.md b/docs/i18n/de/SECURITY.md index 09fd8083b071..d80b5dced128 100644 --- a/docs/i18n/de/SECURITY.md +++ b/docs/i18n/de/SECURITY.md @@ -222,34 +222,19 @@ Diese Regeln werden durch Werkzeuge und Reviewer durchgesetzt: ## Ergebnisse von Supply-Chain-Scannern (Socket.dev / Snyk / ähnliche) -Das veröffentlichte npm-Artefakt `omniroute` enthält den Next.js-Build mit `output: "standalone"`. -Das bedeutet, dass jeder Route-Handler — einschließlich dokumentierter privilegierter -Funktionen (MITM, Zed-Import, Cloud Sync, eingebetteter Service-Supervisor) — in -minifizierten Chunks unter `.next/server/*.js` landet. Heuristische Supply-Chain-Scanner -gleichen diese Chunks häufig mit Malware-Signaturen ab. - -Die von uns verwendete Scanner-Konfiguration befindet sich in [`socket.yml`](socket.yml) im -Root-Verzeichnis des Repositorys (Socket.dev-GitHub-App-Format v2 — siehe -). Sie schließt -nicht ausgelieferte Verzeichnisse (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/` usw.) ausdrücklich aus, sodass der Scanner nur Codepfade meldet, die -tatsächlich veröffentlichte Benutzer erreichen — der Scan selbst wird dadurch ausgelöst, -dass die Socket-GitHub-App diese Datei liest, und nicht durch einen Workflow in diesem Repository. - -Für jede Ergebniskategorie pflegen wir eine Maintainer-Bestätigung pro Einzelfund: +> **Hinweis zum Geltungsbereich:** `socket.yml` im Repository-Stammverzeichnis legt lediglich `projectIgnorePaths` für den Registry-seitigen Post-Publish-Scan des veröffentlichten npm-Artefakts durch Socket.dev fest — sie ist kein erzwungenes CI-/PR-Merge-Gate. Weder ein Workflow in `.github/workflows` noch ein `package.json`-Skript oder ein `Makefile`-Target ruft Socket.dev auf. + +Das veröffentlichte npm-Artefakt `omniroute` enthält den Next.js-Build mit `output: "standalone"`. Das bedeutet, dass jeder Route-Handler — einschließlich dokumentierter privilegierter Funktionen (MITM, Zed-Import, Cloud Sync, eingebetteter Service-Supervisor) — in minimierten Chunks unter `.next/server/*.js` landet. Heuristische Supply-Chain-Scanner gleichen diese Chunks häufig anhand von Mustern mit Malware-Signaturen ab. + +Die von uns verwendete Scanner-Konfiguration befindet sich in [`socket.yml`](socket.yml) im Repository-Stammverzeichnis (Socket.dev-GitHub-App-Format v2 — siehe ). Sie schließt nicht ausgelieferte Verzeichnisse (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` usw.) explizit aus, sodass der Scanner nur Codepfade meldet, die tatsächlich veröffentlichte Benutzer erreichen — der Scan selbst wird dadurch angestoßen, dass die Socket-GitHub-App diese Datei liest, und nicht durch einen Workflow in diesem Repository. + +Für jede Ergebniskategorie pflegen wir eine individuelle Bestätigung durch die Maintainer: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - Zuordnung pro Einzelfund: Quelldatei ↔ markierter Chunk ↔ Verhalten ↔ in v3.8.6 - angewandte Abhilfemaßnahme. -- `SECURITY-AUDITOR-NOTE:`-Blöcke im Quellcode verweisen an jeder markierten Funktion - auf dasselbe Dokument. - -Für Benutzer, deren Pipeline die Warnung nicht lockern kann: Erstellen Sie den Build mit -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Dadurch werden die vier -sensiblen Module durch Stubs ersetzt, die zur Laufzeit HTTP 503 `feature-disabled` -zurückgeben, sodass die privilegierten Codepfade physisch nicht im Bundle enthalten sind. -Das Veröffentlichungsverfahren finden Sie unter -[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). + Zuordnung pro Ergebnis: Quelldatei ↔ markierter Chunk ↔ Verhalten ↔ in v3.8.6 angewandte Abhilfemaßnahme. +- `SECURITY-AUDITOR-NOTE:`-Blöcke im Quellcode an jeder markierten Funktion verweisen auf dasselbe Dokument. + +Benutzer, deren Pipeline die Warnmeldung nicht lockern kann, können den Build mit `OMNIROUTE_BUILD_PROFILE=minimal npm run build` erstellen. Dadurch werden die vier sensiblen Module durch Stubs ersetzt, die zur Laufzeit HTTP 503 `feature-disabled` zurückgeben, sodass die privilegierten Codepfade physisch nicht im Bundle enthalten sind. Das Veröffentlichungsrezept finden Sie unter [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Referenzen diff --git a/docs/i18n/de/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/de/docs/architecture/CODEBASE_DOCUMENTATION.md index 8bab3c1c54cc..c3ac410d8607 100644 --- a/docs/i18n/de/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/de/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -437,7 +437,7 @@ In zweckgebundene Unterverzeichnisse aufgeteilt: ## 4. `open-sse/` — Workspace für die Streaming-Engine -Separater npm-Workspace, der als `@omniroute/open-sse` veröffentlicht wird. Zuständig für die Verarbeitung von Anfragen, Executors, Übersetzer, Dienste, Transformer und den MCP-Server. +Separater npm-Workspace, der als `@omniroute/open-sse` veröffentlicht wird. Zuständig für die Verarbeitung von Anfragen, Executoren, Übersetzer, Dienste, den Transformer und den MCP-Server. ``` open-sse/ @@ -447,12 +447,12 @@ open-sse/ ├── types.d.ts ├── config/ Anbieterregister, Header-Profile, Identität, … ├── handlers/ Anfrage-Handler (Chat, Embeddings, Audio, Bilder, …) -├── executors/ 108 anbieterspezifische HTTP-Executors +├── executors/ 108 anbieterspezifische HTTP-Executoren ├── translator/ Formatkonvertierung (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Stream-Transformer für Responses API ↔ Chat Completions ├── services/ Über 80 Dienstmodule (Kombinationen, Fallback, Kontingente, Identität, …) ├── utils/ Streaming-Hilfsfunktionen, TLS-Client, AWS SigV4, Proxy-Fetch, … -└── mcp-server/ MCP-Server (3 Transporte, 33 Geltungsbereiche, 110 Tools) +└── mcp-server/ MCP-Server (3 Transportarten, 33 Bereiche, 110 Tools) ``` ### 4.1 `open-sse/handlers/` @@ -472,17 +472,17 @@ open-sse/ | `search.ts` | Websuche | | `sseParser.ts` | SSE-Ereignisparser | | `usageExtractor.ts` | Extrahiert Token-Anzahlen aus Upstream-Streams | -| `responseSanitizer.ts` | Entfernt anbieterspezifische Störeinträge | +| `responseSanitizer.ts` | Entfernt anbieterspezifisches Rauschen | | `responseTranslator.ts` | Bindeglied zwischen Anbieterantwort und Übersetzungsschicht | ### 4.2 `open-sse/executors/` -108 Anbieter-Executors, die jeweils `BaseExecutor` (`base.ts`) erweitern: +108 Anbieter-Executoren, die jeweils `BaseExecutor` (`base.ts`) erweitern: `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, -`pollinations`, `qoder`, `vertex`, `devin-desktop`, außerdem `claudeIdentity.ts` +`pollinations`, `qoder`, `vertex`, `devin-desktop` sowie `claudeIdentity.ts` (gemeinsame Identitäts-Hilfsfunktion) und `index.ts` (Register). > Hinweis: Hier nicht aufgeführte Anbieter werden von `default.ts` über den generischen @@ -511,46 +511,46 @@ Hub-and-Spoke-Übersetzung (OpenAI ist der Hub). ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — Auf `TransformStream` basierender Konverter für Responses API ↔ Chat - Completions (wird vom Catch-all der Route `responses/` verwendet). + Completions (wird von der Catch-all-Route `responses/` verwendet). ### 4.5 `open-sse/services/` Highlights (vollständige Liste unter `open-sse/services/`): -| Aspekt | Dateien | -| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Combo-Routing | `combo.ts` (19 Strategien), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Auto-Combo-Engine | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Ausfallsicherheit | `accountFallback.ts` (Abklingzeit + Sperrung), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kontingente | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Caching | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Routing-Intelligenz | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Modellverarbeitung | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Komprimierung | `compression/` — vollständige Verdrahtung der Komprimierungs-Engine | -| Token + Sitzung | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Stufe / Manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / Netzwerk | `ipFilter.ts`, `webSearchFallback.ts` | -| Stapelverarbeitung | `batchProcessor.ts` | -| Nutzung | `usage.ts` | +| Aspekt | Dateien | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Combo-Routing | `combo.ts` (19 Strategien), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Auto-Combo-Engine | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Ausfallsicherheit | `accountFallback.ts` (Abklingzeit + Sperrung), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kontingente | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Caching | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Routing-Intelligenz | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Modellverarbeitung | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Komprimierung | `compression/` — vollständige Verdrahtung der Komprimierungs-Engine | +| Token + Sitzung | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Stufe / Manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / Netzwerk | `ipFilter.ts`, `webSearchFallback.ts` | +| Batches | `batchProcessor.ts` | +| Nutzung | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 eindeutige Tools**, eingebunden in `server.ts` (45 kanonische in `schemas/tools.ts` + - Module für Speicher, Skills, GitHub-Skills, Pool, Gamification, Plugins, Notion, Obsidian, - lokalen Korpus und Komprimierung — die Vereinigungsmenge wird von `countUniqueMcpTools` gezählt). -- **3 Transportarten**: stdio, HTTP Streamable, SSE. -- **33 Geltungsbereiche**, die zur Laufzeit durchgesetzt werden — die Basisliste befindet sich in `src/shared/constants/mcpScopes.ts`; die vollständige Menge ist die Vereinigungsmenge der von den einzelnen Tool-Modulen deklarierten Geltungsbereiche. +- **110 eindeutige Tools**, verdrahtet in `server.ts` (45 kanonische in `schemas/tools.ts` + + Speicher-, Skills-, GitHub-Skills-, Pool-, Gamification-, Plugin-, Notion-, Obsidian-, + lokale Korpus- und Komprimierungsmodule — die Vereinigungsmenge wird von `countUniqueMcpTools` gezählt). +- **3 Transporte**: stdio, HTTP Streamable, SSE. +- **33 Scopes**, die zur Laufzeit erzwungen werden — die Basisliste befindet sich in `src/shared/constants/mcpScopes.ts`; der vollständige Satz ist die Vereinigungsmenge der von jedem Tool-Modul deklarierten Scopes. - Audit-Tabelle: `mcp_tool_audit` (befüllt durch `audit.ts`). - Dateien: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, - `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts` + `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, sowie Tests unter `__tests__/`. - Den vollständigen Tool-Katalog finden Sie unter [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### 4.7 `open-sse/config/` -Provider-Registries (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), formatspezifische Modell-Registries (`audioRegistry.ts`, +Provider-Registrierungen (`providerRegistry.ts`, `providerModels.ts`, +`providerHeaderProfiles.ts`), modellspezifische Registrierungen je Format (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), Identitäts-Hilfsfunktionen (`codexIdentity.ts`, `codexInstructions.ts`, @@ -563,7 +563,7 @@ Adapter (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, ### 4.8 `open-sse/utils/` -Streaming-Primitive und Provider-Hilfsprogramme: `stream.ts`, `streamHandler.ts`, +Streaming-Grundelemente und Anbieter-Hilfsfunktionen: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/de/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/de/docs/architecture/RESILIENCE_GUIDE.md index f8c7d71b1d37..90bf9523c353 100644 --- a/docs/i18n/de/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/de/docs/architecture/RESILIENCE_GUIDE.md @@ -70,7 +70,7 @@ Regressionsschutz: `tests/unit/provider-cooldown-window-gate.test.ts`. **Geltungsbereich:** einzelne Provider-Verbindung/einzelnes Konto/einzelner Schlüssel. -**Zweck:** einen fehlerhaften Schlüssel überspringen, während andere Verbindungen desselben Providers weiterhin Anfragen bedienen. +**Zweck:** einen fehlerhaften Schlüssel überspringen, während andere Verbindungen desselben Providers weiterhin Anfragen verarbeiten. **Implementierung:** @@ -81,65 +81,125 @@ Regressionsschutz: `tests/unit/provider-cooldown-window-gate.test.ts`. **Felder pro Verbindung:** -- `rateLimitedUntil` — Zeitstempel, bis zu dem der Cooldown gilt +- `rateLimitedUntil` — Zeitstempel, bis zu dem der Cooldown läuft - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — Zähler für exponentiellen Backoff +- `backoffLevel` — Zähler für exponentielles Backoff **Standard-Cooldowns:** - OAuth-Basiswert: 5 s - API-Schlüssel-Basiswert: 3 s -- API-Schlüssel bei 429: bevorzugt vorgelagerte `Retry-After`-/Reset-Header bzw. auswertbaren Reset-Text +- API-Schlüssel bei 429: bevorzugt vorgelagerte `Retry-After`-/Reset-Header bzw. analysierbaren Reset-Text - Backoff: `baseCooldownMs * 2 ** failureIndex` -**Schutz vor Stampede-Effekten:** verhindert, dass gleichzeitige Fehler den Cooldown übermäßig verlängern oder `backoffLevel` doppelt erhöhen. +**Schutz vor einer Anfragelawine:** verhindert, dass gleichzeitige Fehler den Cooldown übermäßig verlängern oder `backoffLevel` doppelt erhöhen. **Endzustände (KEINE Cooldowns):** -- `banned` — wird durch die Erkennung gesperrter Schlüsselwörter/Kontensperren (siehe [BAN_DETECTION](../security/BAN_DETECTION.md)) sowie durch drei aufeinanderfolgende vorgelagerte Ablehnungen einzelner Anfragen (`request_rejected`, z. B. Anthropic OAuth 403 „Request not allowed“ — `open-sse/services/requestRejectedStreak.ts`) gesetzt; eine einzelne Ablehnung versetzt die Verbindung lediglich in den Cooldown +- `banned` — wird durch die Erkennung gesperrter Schlüsselwörter/Kontensperren (siehe [BAN_DETECTION](../security/BAN_DETECTION.md)) sowie durch drei aufeinanderfolgende vorgelagerte Ablehnungen pro Anfrage gesetzt (`request_rejected`, z. B. Anthropic OAuth 403 „Request not allowed“ — `open-sse/services/requestRejectedStreak.ts`); eine einzelne Ablehnung versetzt die Verbindung lediglich in den Cooldown - `expired` (wechselt nach einer begrenzten Anzahl von Wiederholungsversuchen in den Endzustand — `EXPIRED_RETRY_MAX = 3` mit exponentiellem Backoff —, sodass vorübergehende OAuth-Fehler sich selbst beheben können, bevor das Konto dauerhaft deaktiviert wird) - `credits_exhausted` -Diese Zustände bleiben bestehen, bis sich die Anmeldedaten ändern oder sie von einem Operator zurückgesetzt werden. Endzustände dürfen nicht durch vorübergehende Cooldown-Zustände überschrieben werden. +Diese Zustände bleiben bestehen, bis sich die Anmeldedaten ändern oder sie von einem Operator zurückgesetzt werden. Endzustände dürfen nicht mit einem vorübergehenden Cooldown-Zustand überschrieben werden. -**Verzögerte Wiederherstellung:** Sobald `rateLimitedUntil` in der Vergangenheit liegt, ist die Verbindung wieder auswählbar. Nach erfolgreicher Verwendung löscht `clearAccountError()` alle Fehlerfelder. +**Lazy Recovery:** Sobald `rateLimitedUntil` in der Vergangenheit liegt, kann die Verbindung wieder ausgewählt werden. Nach erfolgreicher Nutzung löscht `clearAccountError()` alle Fehlerfelder. + +### Claude-OAuth-Nutzungslimit: Lane mit niedrigerer Priorität + Zurücksetzen des Sitzungslimits + +**Geltungsbereich:** eine Claude-Abonnementverbindung (OAuth). Beide Funktionen müssen **pro +Verbindung explizit aktiviert werden** (Verbindung bearbeiten → Claude-Bereich → `lowPriorityMode` / `autoLimitReset` in +`providerSpecificData`; beide sind standardmäßig deaktiviert) und entsprechen den Claude-Code-Befehlen `/low-priority` und +`/limit-reset` (Wire-Protokoll aus Claude Code 2.1.263 erfasst). + +**Implementierung:** + +- Zustandsautomat + Antwortklassifizierung: `open-sse/services/claudeLowPriority.ts` +- Client für Reset-Status/-Anforderung: `open-sse/services/claudeLimitReset.ts` +- Executor-Hook (Header-Injektion + Wiederholungsversuch mit demselben Konto): `open-sse/executors/base.ts::execute()` +- Persistenz der expliziten Aktivierung: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Auslöser:** das 5-Stunden-Nutzungslimit — eine `429`, deren Header +`anthropic-ratelimit-unified-status: rejected` und, sofern das Konto berechtigt ist, +`anthropic-ratelimit-unified-slow-offer: treatment` enthalten. Vor dieser ersten +429-Limitantwort wird nichts gesendet; eine Serie von 429-Antworten ohne Unified-Header wird über den normalen Cooldown-Pfad verarbeitet. + +**Lane mit niedrigerer Priorität** (`lowPriorityMode`): + +- Bei der 429-Limitantwort akzeptiert der Executor das Angebot und wiederholt die Anfrage sofort mit **demselben** + Konto und `anthropic-usage-limit: slow`; die Lane bleibt bis zum angekündigten + `anthropic-ratelimit-unified-reset` (+60 s Toleranz) aktiv, und jede Anfrage in diesem Zeitraum enthält + den Header. Die abgefangene 429-Antwort erreicht `handleChatCore` nie, sodass die Verbindung + **nicht** in den Cooldown versetzt und nicht durch Rotation ersetzt wird. +- `anthropic-ratelimit-unified-slow-status` bei späteren Antworten: `active` / `not_needed` + behalten die Lane bei; bei `slot_busy` (429) oder einer `529` wird die durch + `anthropic-ratelimit-unified-slow-retry-after` vorgegebene Zeit gewartet (Standardwert 20 s, begrenzt auf 5–600 s, ±30 % Jitter) + und die Anfrage wiederholt, begrenzt durch `anthropic-ratelimit-unified-slow-max-wait` (Standardwert 20 min, begrenzt + auf 1 min–6 h) — wird dieser Wert überschritten, endet die Lane, und eine 10-minütige Abkühlphase verhindert die erneute Annahme. Die + Wartezeit wird zusätzlich auf die verbleibende Zeit des eigenen Timeouts der Anfrage für den Start der vorgelagerten Verarbeitung + (`resolveFetchStartTimeout`, standardmäßig 10 min) abzüglich eines Spielraums von 5 s begrenzt: Ohne diese Begrenzung würde die + standardmäßige maximale Wartezeit von 20 Minuten die Anfrage überdauern, und der Wartevorgang würde + mittendrin abgebrochen, wodurch ein `TimeoutError` anstelle des ordnungsgemäßen `max_wait`-Endes mit anschließender Abkühlphase ausgegeben würde. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, der Beginn eines neuen 5-Stunden-Zeitfensters oder + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (wodurch die Lane bei + jedem Status als `extra_usage` beendet wird, da die kostenpflichtige Mehrnutzung nun das Limit abdeckt) beenden die Lane; die + Antwort wird anschließend über den normalen Cooldown-Pfad verarbeitet. `budget_exhausted` wird bis zum + angekündigten Budget-Reset (≤ 8 Tage) gespeichert. +- Die Prüfung auf das Nutzungslimit erfolgt nach den eigenen, durch 400-Antworten ausgelösten Wiederholungsversuchen innerhalb eines Versuchs des Executors (Kontextbearbeitung, + Begrenzung von Thinking/Effort, automatisches Erlernen von Parametern), sodass eine 429-Limitantwort, die erst bei + einem dieser Wiederholungsversuche auftritt, weiterhin abgefangen wird, statt den Cooldown-Pfad zu erreichen. +- Der Zustand wird pro Verbindung im Arbeitsspeicher gehalten (ein Neustart führt dazu, dass eine zusätzliche 429-Limitantwort erforderlich ist, um die Lane erneut zu akzeptieren). + +**Zurücksetzen des Sitzungslimits** (`autoLimitReset`, wird vor der Lane versucht, wenn beide aktiviert sind): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide`- + Block; wenn `arm: "reset"` und `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` mit + `{ "program": "juniper_tide" }` (Organisations-UUID aus + `providerSpecificData.organizationUUID`, Bootstrap-Fallback). +- Bei `result: reset|not_limited` wird die Anfrage mit voller Geschwindigkeit wiederholt (ohne Slow-Header). + `already_used` / `not_offered` speichern `next_available_at` zwischen (Standardwert: eine Woche); bei jedem + Fehler erfolgt ein Backoff von 15 Minuten. Das Zurücksetzen ist einmal pro Woche möglich und wird weiterhin auf das + Wochenlimit angerechnet. + +Regressionsprüfungen: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Sitzungsaffinität (#7274) -**Geltungsbereich:** eine Clientsitzung (Header `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`), die für **jeden** Provider an eine Verbindung gebunden ist. +**Geltungsbereich:** eine Client-Sitzung (Header `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`), die für **jeden** Provider an eine Verbindung gebunden ist. -**Zweck:** einen Agenten mit mehreren Interaktionsrunden (Claude Code, aider, benutzerdefinierte Agenten) über mehrere Anfragen hinweg auf demselben Konto zu halten, um Kontextverluste beim Wechsel zwischen Konten sowie wiederholte 429-Fehler bei Kaltstarts auf Providern mit sitzungsbezogenem Zustand pro Konto zu reduzieren. +**Zweck:** Einen Multi-Turn-Agenten (Claude Code, aider, benutzerdefinierte Agenten) über mehrere Anfragen hinweg demselben Konto zuzuordnen, wodurch Kontextverluste durch Kontowechsel und wiederholte Cold-Start-429-Fehler bei Anbietern mit kontobezogenem Sitzungsstatus reduziert werden. **Implementierung:** - TTL-Auflösung: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Auswahl/Erstellung der Bindung: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Header-Extraktion (generisch, für jeden Provider): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Persistierte Bindungstabelle: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Einstellung: `sessionAffinityTtlMs` (globale TTL in ms, `0` deaktiviert) — `src/lib/db/settings.ts`. Durch die Migration `124_generic_session_affinity_ttl.sql` vom ausschließlich für Codex geltenden `codexSessionAffinityTtlMs` umbenannt; diese übernimmt jede zuvor konfigurierte Codex-TTL als neuen Standardwert. +- Pin-Auswahl/-Erstellung: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Header-Extraktion (generisch, für jeden Anbieter): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Persistierte Pin-Tabelle: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Einstellung: `sessionAffinityTtlMs` (globale TTL in ms, `0` deaktiviert) — `src/lib/db/settings.ts`. Durch die Migration `124_generic_session_affinity_ttl.sql` von der ausschließlich für Codex geltenden Einstellung `codexSessionAffinityTtlMs` umbenannt; dabei wird eine zuvor konfigurierte Codex-TTL als neuer Standardwert übernommen. -Vor #7274 brach `resolveSessionAffinityTtlMs()` für jeden Provider außer `codex` sofort mit `0` ab. Daher hatten die TTL-Einstellung und die Sitzungsheader andernorts keine Wirkung, obwohl sowohl der Bindungsmechanismus als auch die Header-Extraktion bereits providerunabhängig waren. Mit der Korrektur wurde diese vorzeitige Rückgabe entfernt; die TTL gilt nun einheitlich für jeden Provider, sobald sie global auf einen Wert größer als `0` gesetzt wurde. +Vor #7274 gab `resolveSessionAffinityTtlMs()` für jeden Anbieter außer `codex` vorzeitig `0` zurück, sodass die TTL-Einstellung (und die Sitzungs-Header) anderswo wirkungslos blieben, obwohl der Pinning-Mechanismus und die Header-Extraktion bereits anbieterunabhängig waren. Mit der Korrektur wurde diese vorzeitige Rückgabe entfernt; die TTL gilt nun einheitlich für jeden Anbieter, sobald sie global auf einen Wert größer als `0` gesetzt ist. -Die drei Sitzungsaffinitätsheader werden niemals an den vorgelagerten Dienst weitergeleitet — Executoren erstellen ihre eigenen vorgelagerten Header von Grund auf neu, anstatt Client-Header durchzureichen. Dadurch bleiben sie ausschließlich interne Korrelations-IDs. +Die drei Sitzungsaffinitäts-Header werden niemals an den Upstream weitergeleitet — Executors erstellen ihre eigenen Upstream-Header von Grund auf, anstatt Client-Header durchzureichen. Daher bleibt dies ausschließlich eine interne Korrelations-ID. -### Exklusive Leases für Verbindungen verwalteter Sitzungen +### Exklusive Leases für verwaltete Sitzungsverbindungen -**Geltungsbereich:** Ein aktiver verwalteter HTTP-Client/eine aktive verwaltete Sitzung besitzt eine geeignete OmniRoute-Verbindung. +**Geltungsbereich:** Ein aktiver verwalteter HTTP-Client bzw. eine aktive verwaltete Sitzung besitzt eine geeignete OmniRoute-Verbindung. -**Zweck:** dauerhaften exklusiven Besitz einer Verbindung für Clients bereitzustellen, die über mehrere Anfragen hinweg eine harte Routing-Grenze benötigen. Dies unterscheidet sich von der Sitzungsaffinität, die lediglich eine weiche Kontinuitätspräferenz darstellt: Eine exklusive Lease persistiert den Lebenszyklusstatus in SQLite, erzwingt die globale Eindeutigkeit des aktiven Besitzers und der aktiven Verbindung und weist eine veraltete Generation vor der Weiterleitung an den Provider zurück. +**Zweck:** Dauerhafte exklusive Verbindungsinhaberschaft für Clients bereitzustellen, die über mehrere Anfragen hinweg eine strikte Routing-Grenze benötigen. Dies unterscheidet sich von Sitzungsaffinität, die lediglich eine weiche Kontinuitätspräferenz darstellt: Eine exklusive Lease persistiert den Lebenszyklusstatus in SQLite, erzwingt die globale Eindeutigkeit aktiver Inhaber und aktiver Verbindungen und weist eine veraltete Generation vor der Weiterleitung an den Anbieter zurück. -Die Funktion muss für jeden API-Schlüssel explizit aktiviert werden. Ein verwalteter Schlüssel muss den Geltungsbereich `lease:exclusive` und eine explizite, nicht leere `allowedConnections`-Liste besitzen. Jeder HTTP-Client kann den Lebenszyklus-Endpunkt verwenden; weder Clientname, User-Agent, Provider, OAuth-Methode noch Modell sind erforderlich. Die Lease besitzt eine Verbindung und kein Modell. Daher bleibt die Bindung bei einem Modellwechsel bestehen, solange die Verbindung regulär geeignet bleibt. Die normalen Regeln für Modell, Kontingent, Integrität, Cooldown und Positivliste bleiben maßgeblich und können dieselbe Generation auf eine andere freie, geeignete Verbindung umstellen. +Die Funktion muss pro API-Schlüssel explizit aktiviert werden. Ein verwalteter Schlüssel muss den Scope `lease:exclusive` und eine explizite, nicht leere `allowedConnections`-Liste besitzen. Jeder HTTP-Client kann den Lebenszyklus-Endpunkt verwenden; weder Clientname, User-Agent, Anbieter, OAuth-Methode noch Modell sind erforderlich. Die Lease gilt für eine Verbindung, nicht für ein Modell. Daher bleibt die Bindung bei einem Modellwechsel bestehen, solange die Verbindung weiterhin regulär geeignet ist. Die normalen Regeln für Modell, Kontingent, Zustand, Abklingzeit und Positivliste bleiben maßgeblich und können dieselbe Generation auf eine andere freie, geeignete Verbindung umstellen. -Der Lebenszyklus wird über `POST /api/v1/session-leases` mit den JSON-Aktionen `acquire`, `renew` und `release` verwaltet. Verwaltete Inferenzanfragen übermitteln den nicht transparenten Wert `X-OmniRoute-Lease-Owner` und den exakten Wert `X-OmniRoute-Lease-Generation`. Der Besitzerwert besteht aus `vlo_`, gefolgt von 43 Base64url-Zeichen; gespeichert wird ausschließlich sein SHA-256-Hash. Jede abschließende Weiterleitungsprüfung bindet außerdem die ID des authentifizierten API-Schlüssels und die ID der aktiven Verbindung. Lease-Steuerungsheader werden aus Protokollen, gespeicherten Anfrage-Snapshots und Headern vorgelagerter Executoren entfernt. +Der Lebenszyklus wird über `POST /api/v1/session-leases` mit den JSON-Aktionen `acquire`, `renew` und `release` gesteuert. Verwaltete Inferenzanfragen übermitteln den opaken Wert `X-OmniRoute-Lease-Owner` und die exakte `X-OmniRoute-Lease-Generation`. Der Inhaberwert beginnt mit `vlo_`, gefolgt von 43 base64url-Zeichen; gespeichert wird ausschließlich sein SHA-256-Hash. Jede abschließende Dispatch-Schranke bindet außerdem die ID des authentifizierten API-Schlüssels und die ID der aktiven Verbindung ein. Lease-Steuerungs-Header werden aus Protokollen, gespeicherten Anfrage-Snapshots und den Upstream-Headern der Executors entfernt. -Wenn das reguläre Routing geeignete verwaltete Kandidaten ermittelt hat, aber jeder freie Kandidat durch eine fremde aktive Lease belegt ist, gibt OmniRoute HTTP `429`, den Code für nicht verfügbare Lease-Kapazität, einen Status „Warten auf Kapazität“ und einen begrenzten `Retry-After`-Wert zurück, der aus dem frühesten relevanten Ablaufzeitpunkt abgeleitet wird. Eine regulär leere Eignismenge stellt keinen Lease-Konflikt dar und behält ihre bestehende Routing-Fehlersemantik bei. +Wenn das reguläre Routing geeignete verwaltete Kandidaten findet, aber jeder freie Kandidat durch eine fremde aktive Lease belegt ist, gibt OmniRoute HTTP `429`, den Code für nicht verfügbare Lease-Kapazität, einen Status des Wartens auf Kapazität sowie einen begrenzten, aus dem frühesten relevanten Ablaufzeitpunkt abgeleiteten `Retry-After`-Wert zurück. Eine regulär leere Eignungsmenge ist kein Lease-Konflikt und behält die bestehende Routing-Fehlersemantik bei. Verwandte Mechanismen bleiben voneinander getrennt: -- Die OAuth-Sitzungsbelegung ist eine prozesslokale, weiche Verteilung für OAuth-Konten. -- Kontosemaphore gewähren Berechtigungen für parallele Anfragen und enden, sobald eine Anfrage abgeschlossen ist. -- Exklusive Leases für Verbindungen verwalteter Sitzungen stellen dauerhaften Lebenszyklusbesitz mit einer Generationsgrenze bereit. +- Die OAuth-Sitzungsbelegung dient der prozesslokalen weichen Verteilung auf OAuth-Konten. +- Konto-Semaphoren gewähren Berechtigungen für parallele Anfragen, die mit Abschluss einer Anfrage enden. +- Exklusive Leases für verwaltete Sitzungsverbindungen bieten dauerhafte Lebenszyklus-Inhaberschaft mit einer Generationsschranke. --- @@ -269,47 +329,72 @@ ein modellspezifisches Ratenlimit erreichen. Begrenzt durch `comboCooldownWait` --- -## 5. Zugangssteuerung für die Anfragewarteschlange (v3.8.49 · Issue #6593) - -**Geltungsbereich**: die lokale Ratenbegrenzungswarteschlange pro Provider und Verbindung (`open-sse/services/rateLimitManager.ts`, -basierend auf Bottleneck), eine Ebene unterhalb der drei oben beschriebenen Mechanismen. - -**`maxWaitMs` ist eine persistierte Legacy-Bezeichnung für den Ausführungsablauf.** -`resilienceSettings.requestQueue.maxWaitMs` wird als Job- -`expiration` an Bottleneck übergeben; dessen Timer startet erst nach dem Dispatch. Daher begrenzt die Einstellung -die vom Limiter verwaltete Ausführung, nicht die in der lokalen Warteschlange verbrachte Zeit. Ein Ablauf wird -als vertrauenswürdiger lokaler Fehler mit `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) ausgegeben; -die frühere Bezeichnung des Warteschlangen-Zeitüberschreitungscodes wird nur für die vertrauenswürdige interne -Abwärtskompatibilität akzeptiert. Der Standardwert beträgt 15000ms; überschreibbar über -`RATE_LIMIT_MAX_WAIT_MS` (Umgebungsvariable) oder das Dashboard (**Einstellungen → Resilienz**, -UI-Obergrenze von 1–30000ms). Für die Verweildauer in der Warteschlange gilt keine zeitliche Frist; verwenden Sie -`maxQueueDepth` wie unten beschrieben, um die Anzahl wartender Aufrufer zu begrenzen. - -**`maxQueueDepth` — optionale Zugangsobergrenze (neu).** `resilienceSettings.requestQueue.maxQueueDepth` -begrenzt, wie viele Anfragen gleichzeitig für einen Provider und eine Verbindung in der Warteschlange stehen dürfen -(noch nicht weitergeleitet). Wenn die Warteschlange bereits `maxQueueDepth` -Anfragen enthält, wird eine neue Anfrage mit einem typisierten -Fehler `code: "RATE_LIMIT_QUEUE_FULL"` **sofort abgelehnt**, bevor sie überhaupt `limiter.schedule()` -erreicht — dadurch ist die Ablehnung ressourcenschonend und erfolgt vor jeglicher nachgelagerter -Prompt-Komprimierungs-/Übersetzungsarbeit für diese Anfrage. Standardwert `0` = -deaktiviert, wodurch das bestehende Verhalten mit unbegrenzter Warteschlange erhalten bleibt; begrenzt auf 0–100000. -Überschreibbar über `RATE_LIMIT_MAX_QUEUE_DEPTH` (Umgebungsvariable) oder -`resilienceSettings.requestQueue.maxQueueDepth` (Dashboard/API-Patch). - -Die Zugangsprüfung selbst ist eine reine Funktion +## 5. Zulassungssteuerung für die Anfragewarteschlange (v3.8.49 · Issue #6593) + +**Geltungsbereich**: die lokale Ratenbegrenzungswarteschlange pro Anbieter+Verbindung (`open-sse/services/rateLimitManager.ts`, +basierend auf Bottleneck), eine Ebene unterhalb der drei oben genannten Mechanismen. + +**`maxWaitMs` begrenzt die Wartezeit in der Warteschlange; `executionMaxWaitMs` begrenzt die Ausführungszeit.** +Beide sind bewusst voneinander getrennt, und keiner der Werte beeinflusst den anderen. + +`resilienceSettings.requestQueue.maxWaitMs` ist das **Wartezeitbudget der Warteschlange**: Es +deckt das Warten auf einen Anbieter-Slot und den anschließenden Aufenthalt im Zustand QUEUED ab. Der zugehörige Timer wird +in dem Moment gelöscht, in dem der Job den Zustand QUEUED verlässt und mit der Ausführung beginnt +(`rateLimitManager.ts`, `wrappedFn`). Eine Anfrage, die dieses Budget überschreitet, erreicht +den Upstream nie. Der Standardwert beträgt 30000ms, bereitgestellt durch `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +in `src/lib/resilience/settings.ts` und festgeschrieben durch +`tests/unit/ratelimit-admission-control-6593.test.ts`, sodass eine Änderung daran +diesen Test fehlschlagen lässt, anstatt diesen Absatz unbemerkt veralten zu lassen. + +`resilienceSettings.requestQueue.executionMaxWaitMs` ist der Wert, den Bottleneck +als `expiration` des Jobs erhält; dessen Timer startet erst nach der Übergabe zur Ausführung. Er dient +als Absicherung für Executors ohne eigenes Upstream-Timeout und wird +auf das eigene Timeout des Executors für den Beginn des Abrufs angehoben, wenn dieses länger ist, damit +eine intakte, laufende Antwort nicht abgebrochen werden kann. Der Standardwert beträgt 600000ms (10 min). + +Die Übergabe des Warteschlangenbudgets an `expiration` führte früher dazu, dass nicht inkrementelle +Gateways während der Verarbeitung abgebrochen wurden — sie laufen berechtigterweise minutenlang, bevor die ersten Bytes eintreffen — +und deshalb wird ein Ablauf als `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) ausgegeben, während das Warteschlangenbudget den +Warteschlangen-Timeout-Code verwendet. Beide Werte können über `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (Umgebungsvariablen) oder im Dashboard +(**Settings → Resilience**) überschrieben werden. Bei der Normalisierung werden beide auf 1ms–24h begrenzt. + +**Rangfolge für beide:** Die Umgebungsvariable stellt lediglich den _Standardwert_ bereit. Ein in +`resilienceSettings.requestQueue` persistierter Wert (Dashboard / API-Patch, gespeichert +in `key_value`) hat Vorrang; ein verbindungsspezifischer Wert unter +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` hat wiederum Vorrang davor. Das Setzen +der Umgebungsvariable für eine Bereitstellung, die bereits einen persistierten Wert enthält, +ändert daher nichts — löschen oder aktualisieren Sie stattdessen die persistierte Einstellung. + +Die Verweildauer in der Warteschlange wird durch `maxWaitMs` begrenzt; das unten beschriebene `maxQueueDepth` begrenzt, wie +viele Aufrufer gleichzeitig eingereiht sein dürfen. + +**`maxQueueDepth` — optionale Zulassungsobergrenze (neu).** `resilienceSettings.requestQueue.maxQueueDepth` +begrenzt, wie viele Anfragen gleichzeitig für eine bestimmte +Anbieter+Verbindung-Kombination in der Warteschlange auf ihre Ausführung warten dürfen. Wenn die Warteschlange bereits `maxQueueDepth` +Anfragen enthält, wird eine neue Anfrage frühzeitig mit einem typisierten +`code: "RATE_LIMIT_QUEUE_FULL"`-Fehler abgelehnt, **bevor** sie jemals `limiter.schedule()` +erreicht — dadurch ist die Ablehnung kostengünstig und erfolgt vor jeglicher nachgelagerter +Prompt-Komprimierungs-/Übersetzungsarbeit für diese Anfrage. Der Standardwert `0` = +deaktiviert; dadurch bleibt das bestehende Verhalten einer unbegrenzten Warteschlange erhalten. Der zulässige Bereich ist 0–100000. +Der Wert kann über `RATE_LIMIT_MAX_QUEUE_DEPTH` (Umgebungsvariable) oder +`resilienceSettings.requestQueue.maxQueueDepth` (Dashboard/API-Patch) überschrieben werden. + +Die Zulassungsprüfung selbst ist eine reine Funktion (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), sodass -sie ohne einen echten Bottleneck-Limiter durch Unit-Tests geprüft werden kann. +sie ohne einen echten Bottleneck-Limiter mit Unit-Tests geprüft werden kann. > Der RFC, mit dem #6593 eröffnet wurde, schlug außerdem ein -> `bypassCompressionOnRateLimit`-Flag vor. Die Pipeline `open-sse/services/compression/` -> dieses Repositories dient der Prompt-/Kontextkomprimierung für die ausgehende LLM-Anfrage (`chatCore.ts`, +> `bypassCompressionOnRateLimit`-Flag vor. Die Pipeline dieses Repositorys unter `open-sse/services/compression/` +> dient der Prompt-/Kontextkomprimierung für die ausgehende LLM-Anfrage (`chatCore.ts`, > im Bereich des Blocks `resolveCompressionSettings`/`selectCompressionStrategy`), -> nicht der HTTP-Antwortkomprimierung synthetisch erzeugter 429-Antworttexte — für ein wörtlich verstandenes Bypass-Flag -> existiert kein entsprechender Codepfad. Dieser Prompt-Komprimierungsschritt +> nicht der HTTP-Antwortkomprimierung für erzeugte 429-Antworttexte — es gibt keinen +> entsprechenden Codepfad für ein wörtlich verstandenes Bypass-Flag. Dieser Schritt zur Prompt-Komprimierung > wird derzeit außerdem _vor_ `withRateLimit()` in der Anfragepipeline ausgeführt. Eine -> Umordnung, um ihn bei einer Ablehnung wegen einer vollen Warteschlange zu überspringen, wäre daher eine separate, umfangreichere -> Änderung, die über den Umfang dieses Issues hinausgeht; sie wurde hier absichtlich **nicht** implementiert -> und bleibt einer Folgeänderung vorbehalten, falls die CPU-Einsparung das +> Umordnung, um ihn bei einer Ablehnung aufgrund einer vollen Warteschlange zu überspringen, stellt daher eine separate, größere +> Änderung dar, die über den Geltungsbereich dieses Issues hinausgeht; sie wurde hier bewusst **nicht** implementiert +> und bleibt einer späteren Folgeänderung vorbehalten, falls die CPU-Einsparung das > Risiko der Umordnung rechtfertigt. --- diff --git a/docs/i18n/de/docs/architecture/admission-lanes.md b/docs/i18n/de/docs/architecture/admission-lanes.md index 709a600f61d1..941eed0964e8 100644 --- a/docs/i18n/de/docs/architecture/admission-lanes.md +++ b/docs/i18n/de/docs/architecture/admission-lanes.md @@ -8,54 +8,50 @@ OmniRoute verfügt über **zwei** prozesslokale Lane-Systeme mit unterschiedlich ## 1. Prozessweite Zulassungssteuerung auf Byte-Ebene (`chatBodyAdmission.ts`) -- **Geltungsbereich:** der Pfad für gepufferte Bodys/Heap bei `POST /v1/chat/completions`, +- **Geltungsbereich:** der Pfad für gepufferte Bodies/Heap bei `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` und den anderen Chat-ähnlichen Routen. Schützt - vor einer Heap-Vervielfachung durch große Bodys von Coding-Agents (#4380). + vor Heap-Verstärkung durch große Bodies von Coding-Agenten (#4380). - **Ein einziger prozessglobaler Controller, keine Lanes pro Schlüssel (#10110).** Jeder API-Schlüssel (gehasht) bzw. jede `anonymous`-Sitzung wird gegen dasselbe gemeinsame Budget - zugelassen — die gehashte Sitzungs-ID wird NUR als Scheduling-Schlüssel für - Fairness verwendet (Round-Robin-Zuteilung unter Wartenden), niemals als - Kapazitäts-Shard. Eine frühere Version dieser Dokumentation beschrieb Lanes - pro Schlüssel mit unabhängiger Kapazität; dieses Modell wurde in #10110 - entfernt, weil nicht authentifizierte gefälschte Anmeldedaten damit die - prozessweite Grenze vervielfachen konnten. -- **Gate (#503-fanout): ein automatisch abgeleitetes BYTE-Budget für die Aufnahme, - keine feste Anzahl von Anfragen.** Die bisherige Begrenzung der Anfrageanzahl - durch `CHAT_MAX_HEAVY_IN_FLIGHT` (vor dieser Korrektur standardmäßig `1`) - reduzierte den Fan-out von Coding-Agents (mehrere Sub-Agents/CLIs, Bodys - routinemäßig > 256 KB) auf eine effektive Nebenläufigkeit von ~1, was selbst - unter völlig normaler Last zu 503-Antworten führte. Sie greift jetzt nur noch, - wenn ein Betreiber `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` explizit festlegt. - Bleibt die Variable ungesetzt, wird die Zulassung stattdessen durch - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` gesteuert — ein Budget, das automatisch - aus der tatsächlichen Speicherobergrenze des Prozesses abgeleitet wird - (`src/shared/middleware/admissionBudget.ts`): 25 % des niedrigeren Werts aus - dem V8-Heap-Limit und einem etwaigen cgroup-/Container-Limit, geteilt durch - einen Faktor von 8 für die vorübergehende Vervielfachung, begrenzt auf - mindestens 8 MiB und höchstens 2 GiB. Explizite Überschreibungen verwenden - dieselben Grenzwerte. Dadurch skaliert es sich ohne Anpassung der - Umgebungsvariablen selbstständig von einem 512-MB-Container bis zu einem - 32-GB-Desktop. Ein Body, der nicht in das effektive Budget passt, schlägt - sofort mit `413 body_exceeds_budget` fehl; nur bei Konkurrenz zwischen - einzeln verarbeitbaren Bodys wird die begrenzte Fairness-Warteschlange - verwendet. Ein aktiver Multi-Signal-Tracker für Ressourcendruck - (V8-Heap-Verhältnis, cgroup, PSI, OOM-Ereignisse — - `open-sse/utils/resourcePressurePolicy.ts`) verkürzt bei `high`-Druck die - begrenzte Wartezeit und weist Anfragen bei `critical`-Druck sofort mit - `503 resource_pressure` ab, noch bevor irgendwelche Bytes aufgenommen werden. + zugelassen — die gehashte Sitzungs-ID wird AUSSCHLIESSLICH als Fairness-Schlüssel für die Planung verwendet + (Round-Robin-Verteilung unter den Wartenden), niemals als Kapazitäts-Shard. Eine frühere Version dieser + Dokumentation beschrieb Lanes pro Schlüssel mit unabhängiger Kapazität; dieses Modell wurde + in #10110 entfernt, weil nicht authentifizierte, gefälschte Anmeldedaten damit + die prozessweite Grenze vervielfachen konnten. +- **Gate (#503-fanout): ein automatisch abgeleitetes BYTE-Budget für die Aufnahme, keine feste Anzahl von + Anfragen.** Die veraltete Begrenzung `CHAT_MAX_HEAVY_IN_FLIGHT` für die Anzahl von Anfragen (vor + dieser Korrektur standardmäßig `1`) reduzierte den Fan-out von Coding-Agenten (mehrere Subagenten/CLIs, + Bodies regelmäßig > 256 KB) auf eine effektive Parallelität von ~1, was + unter völlig normaler Last zu 503-Fehlern führte. Sie greift jetzt nur, wenn ein Betreiber + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ausdrücklich festlegt. Bleibt die Variable ungesetzt, wird die Zulassung stattdessen + durch `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` gesteuert — ein Budget, das automatisch aus der + tatsächlichen Speicherobergrenze des Prozesses abgeleitet wird (`src/shared/middleware/admissionBudget.ts`): + 25 % des kleineren Werts aus dem V8-Heap-Limit und einem etwaigen cgroup-/Container-Limit, + geteilt durch einen Faktor von 8 für die vorübergehende Verstärkung und begrenzt auf einen Bereich zwischen 8 MiB und + 2 GiB. Explizite Überschreibungen verwenden dieselben Grenzen. Dadurch skaliert es sich ohne + Anpassung von Umgebungsvariablen selbstständig von einem 512-MB-Container bis zu einem 32-GB-Desktop. Ein Body, der nicht + in das effektive Budget passt, wird sofort mit `413 body_exceeds_budget` abgelehnt; + nur Konkurrenz zwischen einzeln verarbeitbaren Bodies gelangt in die begrenzte + Fairness-Warteschlange. Ein aktiver, mehrere Signale auswertender Ressourcenbelastungs-Tracker (V8-Heap-Verhältnis, + cgroup, PSI, OOM-Ereignisse — `open-sse/utils/resourcePressurePolicy.ts`) verkürzt + unter `high`-Belastung die begrenzte Wartezeit und verwirft unter + `critical`-Belastung Anfragen sofort mit `503 resource_pressure`, noch bevor überhaupt Bytes + aufgenommen werden. PSI wird, sofern vorhanden, aus `memory.pressure` der cgroup dieser Einheit gelesen + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` gilt + hostweit und dient nur auf Bare-Metal-Systemen bzw. unter cgroup v1 als Rückfalloption, sodass ein auslagernder + Host nicht zu 503-Fehlern in einem inaktiven Container führen kann. - **Konfiguration:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — Überschreibung für das automatisch abgeleitete Byte-Budget - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — bisherige Begrenzung der Anfrageanzahl, nur bei expliziter Aktivierung - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — Wartezeit in der Warteschlange vor einer 503-Antwort (Standardwert 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — Heap-Sicherheitsventil für Bytes in der Warteschlange (Standardwert 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — seit - #10110 veraltet und ohne Funktion (werden zur Konfigurationskompatibilität akzeptiert, aber ignoriert) + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — veraltete Begrenzung der Anfrageanzahl, nur bei expliziter Aktivierung + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — Wartezeit in der Warteschlange vor einem 503-Fehler (Standardwert: 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — Heap-Ventil für Bytes in der Warteschlange (Standardwert: 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — seit #10110 veraltete + No-ops (aus Gründen der Konfigurationskompatibilität akzeptiert, aber ignoriert) - **Berichte:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — einschließlich - der durch #503-fanout hinzugefügten Felder `inflightBytes`, `maxInflightBytes`, - `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` und - `countCapEnabled` (bei einer Standardbereitstellung false — bestätigt, dass - tatsächlich das Byte-Budget und nicht die bisherige Begrenzung der - Anfrageanzahl greift). + der Ergänzungen aus #503-fanout: `inflightBytes`, `maxInflightBytes`, `budgetSource` + (`v8_heap` | `cgroup` | `override`), `pressureSeverity` und `countCapEnabled` + (bei einer Standardbereitstellung false — bestätigt, dass tatsächlich das Byte-Budget und nicht die veraltete + Anzahlbegrenzung greift). ## 2. Adaptive virtuelle Laufzeit-Lanes (`open-sse/services/admission`) diff --git a/docs/i18n/de/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/de/docs/frameworks/EMBEDDED-SERVICES.md index a7e585f9c449..239e382355e4 100644 --- a/docs/i18n/de/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/de/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Version:** v3.8.44 -> **Zuletzt aktualisiert:** 2026-07-03 -> **Zielgruppe:** Entwickler, die eingebettete Dienste (9Router, CLIProxyAPI, Mux, Bifrost) hinzufügen, warten oder debuggen. +> **Zuletzt aktualisiert:** 2026-09-09 +> **Zielgruppe:** Entwickler, die eingebettete Dienste (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) hinzufügen, warten oder debuggen. Eingebettete Dienste sind lokal installierte Sidecar-Prozesstools, die OmniRoute installiert, überwacht und als vollwertige Routing-Ziele bereitstellt. Im Gegensatz zu externen Anbietern (die über das Internet -mittels API-Schlüsseln erreicht werden) laufen eingebettete Dienste auf demselben Rechner wie OmniRoute und kommunizieren über die Loopback-Schnittstelle. +mithilfe von API-Schlüsseln erreicht werden) laufen eingebettete Dienste auf demselben Rechner wie OmniRoute und kommunizieren über die Loopback-Schnittstelle. --- @@ -31,47 +31,48 @@ mittels API-Schlüsseln erreicht werden) laufen eingebettete Dienste auf demselb ### Warum eingebettete Dienste? -Fünf Dienste sind eingebettet: +Sechs Dienste sind eingebettet: -| Dienst | npm-Paket | Standardport | Zweck | -| --------------- | -------------------------------------- | :----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | KI-Router, den OmniRoute als Unteranbieter verwenden kann. Modelle werden als `9router/{sub}/{model}` bereitgestellt | -| **CLIProxyAPI** | GitHub-Release-Binärdatei (`cliproxy`) | 8317 | Lokaler Proxy-Adapter für Anthropic-CLI-Authentifizierungsabläufe. Stellt Ausweich-Routing bereit, wenn OAuth-Token ablaufen | -| **Mux** | `mux` (headless `mux server`) | 8322 | Lokaler Agent-Orchestrierungs-Daemon (coder/mux). Wird nur hinsichtlich seines Lebenszyklus verwaltet — kein Routing-Ziel (kein LLM-Proxying). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-Backend für das AI-Gateway-Relay. Wird im laufenden Zustand automatisch von der Relay-Route (`/v1/relay/`) ausgewählt | -| **Dario** | `@askalf/dario` | 3456 | Claude-Abonnement-Proxy — Alternative/Ausweichlösung zu CLIProxyAPI für Claude-Code-kompatiblen Datenverkehr; der injizierte Schlüssel wird zu `DARIO_ADMIN_TOKEN`, das dessen OAuth-Steuerungsebene `/admin/*` absichert | +| Dienst | npm-Paket | Standardport | Zweck | +| --------------- | -------------------------------------- | :----------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | KI-Router, den OmniRoute als Unteranbieter verwenden kann. Modelle werden als `9router/{sub}/{model}` bereitgestellt | +| **CLIProxyAPI** | GitHub-Release-Binärdatei (`cliproxy`) | 8317 | Lokaler Proxy-Adapter für Anthropic-CLI-Authentifizierungsabläufe. Bietet Fallback-Routing, wenn OAuth-Token ablaufen | +| **Mux** | `mux` (headless `mux server`) | 8322 | Lokaler Agenten-Orchestrierungs-Daemon (coder/mux). Wird ausschließlich hinsichtlich seines Lebenszyklus verwaltet — kein Routing-Ziel (kein LLM-Proxying). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-KI-Gateway-Relay-Backend. Wird bei laufendem Betrieb automatisch von der Relay-Route (`/v1/relay/`) ausgewählt | +| **Dario** | `@askalf/dario` | 3456 | Claude-Abonnement-Proxy — Alternative/Fallback zu CLIProxyAPI für Claude-Code-kompatiblen Datenverkehr; der injizierte Schlüssel wird zu `DARIO_ADMIN_TOKEN`, der den Zugriff auf die OAuth-Steuerungsebene unter `/admin/*` absichert | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp-Web-Automatisierung (headless Chromium über Puppeteer). Wird ausschließlich hinsichtlich seines Lebenszyklus verwaltet — kein Routing-Ziel. | -Alle fünf folgen demselben Überwachungsmodell: +Alle sechs folgen demselben Überwachungsmodell: - OmniRoute installiert sie unter `DATA_DIR/services/{name}/` (isoliert von OmniRoutes eigener `package.json`) - OmniRoute startet und überwacht sie als Kindprozesse -- OmniRoute injiziert einen kurzlebigen API-Schlüssel in die Umgebung des Kindprozesses und rotiert ihn ohne Ausfallzeit (sofern anwendbar) -- Alle Verwaltungsrouten (`/api/services/*`) sind **LOCAL_ONLY** — nur über die Loopback-Schnittstelle erreichbar (verbindliche Regel Nr. 17) +- OmniRoute injiziert einen flüchtigen API-Schlüssel in die Umgebung des Kindprozesses und rotiert ihn ohne Ausfallzeit (sofern anwendbar) +- Alle Verwaltungsrouten (`/api/services/*`) sind **LOCAL_ONLY** — ausschließlich über die Loopback-Schnittstelle zugänglich (verbindliche Regel Nr. 17) ### Wichtige Entscheidungen (aus dem Entwurfsplan) -| Entscheidung | Wert | -| --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -| Dashboard-Zugriff auf die native Benutzeroberfläche von 9Router | Reverse-Proxy unter `/dashboard/providers/services/9router/embed/*` | -| Installationsmechanismus | `npm install {package}` über `execFile` (keine Shell-Interpolation) | -| Nutzungsmodus | Anbieter wird als `9router/{sub}/{model}` in der Routing-Engine registriert | -| API-Schlüsselverwaltung | OmniRoute generiert den Schlüssel, verschlüsselt ihn im Ruhezustand (AES-256-GCM) und injiziert ihn über die Umgebung | -| Dashboard-Speicherort | `/dashboard/providers/services` (drei Registerkarten) | -| Automatischer Start | Umschalter pro Dienst, standardmäßig AUS | +| Entscheidung | Wert | +| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| Dashboard-Zugriff auf die native 9Router-Benutzeroberfläche | Reverse-Proxy unter `/dashboard/providers/services/9router/embed/*` | +| Installationsmechanismus | `npm install {package}` über `execFile` (keine Shell-Interpolation) | +| Nutzungsmodus | Anbieter wird als `9router/{sub}/{model}` in der Routing-Engine registriert | +| API-Schlüsselverwaltung | OmniRoute generiert den Schlüssel, verschlüsselt ihn im Ruhezustand (AES-256-GCM) und injiziert ihn über die Umgebung | +| Dashboard-Speicherort | `/dashboard/providers/services` (drei Registerkarten) | +| Automatischer Start | Umschalter pro Dienst, standardmäßig AUS | --- -## 2. Architektur — 4 Ebenen +## 2. Architektur — 4 Schichten ``` ┌────────────────────────────────────────────────────────────────────┐ -│ Ebene 1 — UI │ +│ Schicht 1 — Benutzeroberfläche │ │ /dashboard/providers/services (Tabs: CLIProxyAPI | 9Router | Mux)│ │ Live-Protokolle (SSE), Start/Stopp/Neustart/Update, Einstellungen,│ │ Installation │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Grundgerüst + Tab-Routing über ?tab= │ +│ ├── page.tsx Oberfläche + Tab-Routing über ?tab= │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -79,7 +80,7 @@ Alle fünf folgen demselben Überwachungsmodell: └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (Next.js fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Ebene 2 — API (LOCAL_ONLY — nur Loopback) │ +│ Schicht 2 — API (LOCAL_ONLY — nur Loopback) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -90,40 +91,40 @@ Alle fünf folgen demselben Überwachungsmodell: │ /dashboard/providers/services/9router/embed/[...path] │ │ (Reverse-HTTP- + WebSocket-Proxy → 9Router-Upstream) │ │ │ -│ Schutz: LOCAL_ONLY_API_PREFIXES enthält "/api/services/" und │ -│ "/dashboard/providers/services/*/embed/" │ +│ Zugriffsschutz: LOCAL_ONLY_API_PREFIXES enthält "/api/services/" │ +│ und "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ prozessinterne Aufrufe ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Ebene 3 — ServiceSupervisor (src/lib/services/) │ +│ Schicht 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Generischer Supervisor (child_process.spawn)│ │ ├── Installation: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── Start: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── Start: spawn(node, [entrypoint], {env, cwd}) │ │ ├── API-Schlüssel: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ -│ ├── Port: 20130 für 9Router (konfigurierbar) │ -│ ├── Protokolle: stdio-Ringpuffer 5 MB → SSE-Ereignisse │ -│ ├── Zustand: HTTP GET /health alle 2–5 s, verzögerte Wiederherstellung│ -│ └── Lebenszyklus: SIGTERM 15 s → SIGKILL │ +│ ├── Port: 20130 für 9Router (konfigurierbar) │ +│ ├── Protokolle: stdio-Ringpuffer mit 5 MB → SSE-Ereignisse │ +│ ├── Zustand: HTTP GET /health alle 2–5 s, verzögerte Wiederherstellung│ +│ └── Lebenszyklus: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Initialisiert alle SERVICES[] beim Prozessstart│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts Periodisches GET /v1/models → service_models-Tabelle│ +│ modelSync.ts Regelmäßiges GET /v1/models → Tabelle service_models│ │ ringBuffer.ts Zirkulärer Protokollpuffer (5 MB pro Dienst) │ -│ healthCheck.ts Regelmäßige HTTP-Zustandsprüfung │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (Installationsadapter) │ +│ healthCheck.ts Periodische HTTP-Zustandsprüfung │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (Installationsadapter) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-kompatibles HTTP (Loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Ebene 4 — Provider / Routing │ +│ Schicht 4 — Anbieter / Routing │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Ruft Port und API-Schlüssel pro Anfrage neu ab (kein Caching). │ -│ Entfernt vor dem Proxying das Präfix "9router/" aus der Modell-ID.│ +│ Ruft Port und API-Schlüssel pro Anfrage erneut ab (kein Cache). │ +│ Entfernt das Präfix "9router/" vor dem Proxying aus der Modell-ID.│ │ Gibt 503 service_not_running zurück, wenn der Supervisor nicht │ -│ den Status "running" hat. │ +│ im Zustand "running" ist. │ │ │ │ src/shared/constants/providers.ts │ │ Eintrag für "9router": isEmbeddedService: true │ @@ -133,9 +134,9 @@ Alle fünf folgen demselben Überwachungsmodell: │ Synchronisierung alle 5 Min. durch modelSync.ts. │ │ │ │ Mux wird NUR hinsichtlich seines Lebenszyklus verwaltet │ -│ (Ebenen 1–3) — es ist ein Agenten-Orchestrierungs-Daemon und kein │ -│ LLM-Proxy. Daher besitzt es keinen Executor-/Provider-Eintrag in │ -│ Ebene 4 und ist niemals ein Routing-Ziel. │ +│ (Schichten 1–3) — es ist ein Agenten-Orchestrierungs-Daemon und │ +│ kein LLM-Proxy. Daher hat es keinen Executor-/Anbietereintrag in │ +│ Schicht 4 und ist niemals ein Routing-Ziel. │ └────────────────────────────────────────────────────────────────────┘ ``` @@ -143,18 +144,19 @@ Alle fünf folgen demselben Überwachungsmodell: | Datei | Rolle | | ------------------------------------------- | ---------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Kernklasse: Lebenszyklus, Sperre, Zustand, Ringpuffer | -| `src/lib/services/bootstrap.ts` | Prozessweite Registrierung und automatischer Start | +| `src/lib/services/ServiceSupervisor.ts` | Kernklasse: Lebenszyklus, Sperre, Integrität, Ringpuffer | +| `src/lib/services/bootstrap.ts` | Registrierung auf Prozessebene und automatischer Start | | `src/lib/services/registry.ts` | Singleton-Map `tool → supervisor` | | `src/lib/services/apiKey.ts` | Schlüsselerzeugung, AES-256-GCM-Verschlüsselung im Ruhezustand | | `src/lib/services/modelSync.ts` | Regelmäßige Modellsynchronisierung (5 Min.) + bei Bedarf | -| `src/lib/services/ringBuffer.ts` | 5-MB-Ringpuffer für Protokolle mit SSE-Abonnement | -| `src/lib/services/healthCheck.ts` | HTTP-Zustandsprüfung (konfigurierbares Intervall) | +| `src/lib/services/ringBuffer.ts` | Zirkulärer 5-MB-Protokollpuffer mit SSE-Abonnement | +| `src/lib/services/healthCheck.ts` | HTTP-Integritätsprüfung (konfigurierbares Intervall) | | `src/lib/services/installers/ninerouter.ts` | npm-Installation/-Aktualisierung/-Deinstallation für 9Router | | `src/lib/services/installers/cliproxy.ts` | npm-Installation/-Aktualisierung/-Deinstallation für CLIProxyAPI | | `src/lib/services/installers/mux.ts` | npm-Installation/-Aktualisierung/-Deinstallation für Mux | +| `src/lib/services/installers/openwa.ts` | npm-Installation/-Aktualisierung/-Deinstallation für open-wa | | `src/app/api/services/9router/_lib.ts` | Hilfsfunktion `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Gemeinsamer SSE-Endpunkt für Protokolle | +| `src/app/api/services/[name]/logs/route.ts` | Gemeinsamer SSE-Protokollendpunkt | | `open-sse/executors/ninerouter.ts` | Provider-Executor (Schicht 4) | --- @@ -212,33 +214,33 @@ Race Conditions, wenn beispielsweise der automatische Start und eine UI-Schaltfl ## 4. API-Referenz Alle Routen unter `/api/services/` sind **LOCAL_ONLY** (nur Loopback, feste Regel Nr. 17). -Nicht vom Loopback stammende Anfragen erhalten unabhängig vom Authentifizierungstoken `403 LOCAL_ONLY`. +Nicht über Loopback eingehende Anfragen erhalten unabhängig vom Authentifizierungstoken `403 LOCAL_ONLY`. ### 4.1 9Router-Endpunkte (11 Routen) #### `POST /api/services/9router/install` -Installiert 9Router aus npm. Erstellt `DATA_DIR/services/9router/` mit einer eigenen -`package.json` und eigenen `node_modules/`. Es entstehen keine Konflikte mit den Abhängigkeiten von OmniRoute. +Installiert 9Router von npm. Erstellt `DATA_DIR/services/9router/` mit einer eigenen +`package.json` und eigenen `node_modules/`. Verursacht keine Konflikte mit den Abhängigkeiten von OmniRoute. -**Anfragekörper** (alles optional): +**Anfragetext** (alles optional): ```json { "version": "latest" } ``` -| Feld | Typ | Standardwert | Beschreibung | -| --------- | -------- | ------------ | ----------------------------------------------- | -| `version` | `string` | `"latest"` | Zu installierendes npm-Versions-Tag oder Semver | +| Feld | Typ | Standardwert | Beschreibung | +| --------- | -------- | ------------ | ---------------------------------------------- | +| `version` | `string` | `"latest"` | Zu installierendes npm-Versionstag oder Semver | **Antworten:** -| Status | Beschreibung | -| ------ | ----------------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Ungültiger Anfragekörper (Zod-Validierung fehlgeschlagen) | -| `409` | Installation läuft bereits (Sperre aktiv) | -| `500` | npm-Installation fehlgeschlagen — verständliche Fehlermeldung unter `message` | +| Status | Beschreibung | +| ------ | -------------------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Ungültiger Anfragetext (Zod-Validierung fehlgeschlagen) | +| `409` | Installation läuft bereits (Sperre aktiv) | +| `500` | npm-Installation fehlgeschlagen — siehe `message` für eine verständliche Fehlermeldung | **Hinweise:** Verwendet `execFile('npm', [...])` — keine Shell, keine Interpolation (feste Regel Nr. 13). EACCES-Fehler werden als verständliche Meldungen ausgegeben. @@ -247,10 +249,10 @@ EACCES-Fehler werden als verständliche Meldungen ausgegeben. #### `POST /api/services/9router/start` -Startet 9Router. Registriert einen Supervisor, falls noch keiner registriert ist, und ruft dann -`supervisor.start()` auf. Ist bereits ein Prozess aktiv, ist der Vorgang idempotent. +Startet 9Router. Registriert einen Supervisor, sofern noch keiner registriert ist, und ruft anschließend +`supervisor.start()` auf. Ist idempotent, wenn der Dienst bereits ausgeführt wird. -**Anfragekörper:** keiner +**Anfragetext:** keiner **Antworten:** @@ -278,17 +280,17 @@ Startet 9Router. Registriert einen Supervisor, falls noch keiner registriert ist #### `POST /api/services/9router/stop` -Beendet 9Router ordnungsgemäß. Sendet SIGTERM, wartet 15 s und sendet anschließend SIGKILL, -falls der Prozess noch aktiv ist. Ist der Prozess bereits beendet, ist der Vorgang idempotent. +Beendet 9Router ordnungsgemäß. Sendet SIGTERM, wartet 15 s und sendet anschließend SIGKILL, falls der Prozess noch aktiv ist. +Ist idempotent, wenn der Dienst bereits beendet ist. -**Anfragekörper:** keiner +**Anfragetext:** keiner **Antworten:** -| Status | Beschreibung | -| ------ | ------------------------------------ | -| `200` | `ServiceStatus` (`state: "stopped"`) | -| `503` | Beenden unerwartet fehlgeschlagen | +| Status | Beschreibung | +| ------ | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Beenden unerwartet fehlgeschlagen | --- @@ -296,7 +298,7 @@ falls der Prozess noch aktiv ist. Ist der Prozess bereits beendet, ist der Vorga Entspricht `stop()` gefolgt von `start()` unter der Operationssperre. -**Anfragekörper:** keiner +**Anfragetext:** keiner **Antworten:** wie bei `start` (gibt den endgültigen `ServiceStatus` zurück). @@ -306,9 +308,9 @@ Entspricht `stop()` gefolgt von `start()` unter der Operationssperre. Aktualisiert 9Router auf eine neuere npm-Version. Wenn der Dienst ausgeführt wird, wird er zuerst beendet, anschließend wird npm install ausgeführt (wobei die neuere Version direkt -am vorhandenen Ort installiert wird) und danach wird der Dienst neu gestartet. +über die vorhandene installiert wird) und danach wird der Dienst neu gestartet. -**Anfragekörper** (alles optional): +**Anfragetext** (alles optional): ```json { "version": "latest" } @@ -319,15 +321,15 @@ am vorhandenen Ort installiert wird) und danach wird der Dienst neu gestartet. | Status | Beschreibung | | ------ | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | Ungültiger Anfragekörper | +| `400` | Ungültiger Anfragetext | | `500` | npm-Aktualisierung fehlgeschlagen | --- #### `POST /api/services/9router/rotate-key` -Generiert einen neuen API-Schlüssel für 9Router, verschlüsselt ihn im Ruhezustand und startet den Dienst -neu (falls er ausgeführt wird), damit er den neuen Schlüssel aus seiner Umgebung übernimmt. Der alte Schlüssel wird +Erzeugt einen neuen API-Schlüssel für 9Router, verschlüsselt ihn im Ruhezustand und startet den Dienst +(falls er ausgeführt wird) neu, damit der neue Schlüssel aus seiner Umgebung übernommen wird. Der alte Schlüssel wird sofort ungültig gemacht. **Anfragetext:** keiner @@ -337,22 +339,22 @@ sofort ungültig gemacht. | Status | Beschreibung | | ------ | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Rotation fehlgeschlagen | +| `500` | Schlüsselrotation fehlgeschlagen | -**Sicherheit:** Der neue Schlüssel wird niemals in der Antwort zurückgegeben (keine Offenlegung von Zugangsdaten). +**Sicherheit:** Der neue Schlüssel wird niemals in der Antwort zurückgegeben (kein Offenlegen von Anmeldedaten). Er wird verschlüsselt (AES-256-GCM) in der Tabelle `version_manager` gespeichert. --- #### `GET /api/services/9router/status` -Gibt den kombinierten Live- und DB-Status einschließlich Versionsmetadaten und API-Schlüsselvorschau zurück. +Gibt den kombinierten Live- und Datenbankstatus einschließlich Versionsmetadaten und API-Schlüsselvorschau zurück. **Antworten:** | Status | Beschreibung | | ------ | ------------------------------- | -| `200` | Siehe nachfolgendes Schema | +| `200` | Siehe Schema unten | | `500` | Lesen des Status fehlgeschlagen | **Antwortschema:** @@ -379,7 +381,7 @@ Gibt den kombinierten Live- und DB-Status einschließlich Versionsmetadaten und #### `POST /api/services/9router/auto-start` -Schaltet die Autostart-Option um. Wenn `enabled: true` gesetzt ist, wird der Dienst beim +Schaltet das Autostart-Flag um. Wenn `enabled: true` gesetzt ist, wird der Dienst beim nächsten Start von OmniRoute automatisch gestartet (sofern der Dienst installiert ist). **Anfragetext:** @@ -399,22 +401,22 @@ nächsten Start von OmniRoute automatisch gestartet (sofern der Dienst installie #### `GET /api/services/9router/logs` -SSE-Stream mit Live-Protokollen aus dem Ringpuffer für stdout/stderr von 9Router. +SSE-Stream mit Live-Protokollen aus dem stdout/stderr-Ringpuffer von 9Router. **Abfrageparameter:** -| Parameter | Typ | Standardwert | Beschreibung | -| --------- | --------- | ------------ | --------------------------------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Anzahl der zuerst zu sendenden historischen Zeilen (maximal 1000) | -| `filter` | `string` | keiner | Teilzeichenfolgenfilter ohne Beachtung der Groß-/Kleinschreibung (kein regulärer Ausdruck — ReDoS-sicher) | +| Parameter | Typ | Standardwert | Beschreibung | +| --------- | --------- | ------------ | -------------------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Anzahl der zuerst zu sendenden historischen Zeilen (maximal 1000) | +| `filter` | `string` | keiner | Teilzeichenfolgenfilter ohne Beachtung der Groß-/Kleinschreibung (kein Regex — ReDoS-sicher) | **SSE-Ereignisse:** -| Ereignis | Daten | Beschreibung | -| ----------- | ----------- | ------------------------------------ | -| `snapshot` | `LogLine[]` | Anfänglicher historischer Ausschnitt | -| `log` | `LogLine` | Live-Protokollzeile | -| `heartbeat` | `{}` | Keep-alive alle 15 s | +| Ereignis | Daten | Beschreibung | +| ----------- | ----------- | -------------------------------- | +| `snapshot` | `LogLine[]` | Anfänglicher historischer Auszug | +| `log` | `LogLine` | Live-Protokollzeile | +| `heartbeat` | `{}` | Keep-Alive alle 15 s | **LogLine-Schema:** @@ -438,81 +440,120 @@ SSE-Stream mit Live-Protokollen aus dem Ringpuffer für stdout/stderr von 9Route ### 4.2 CLIProxyAPI-Endpunkte (10 Routen) -CLIProxyAPI besitzt dieselbe Endpunktstruktur wie 9Router, jedoch ohne `rotate-key` und zusätzlich mit -`accounts`, `provider-expose` und `auto-restart-adopted`. Es erhält nun einen -dedizierten API-Schlüssel für die Datenebene, der beim Start injiziert wird (`needsApiKey: true` in -`bootstrap.ts`, verwendet für die Modellsynchronisierung); `status` enthält weniger Felder. +CLIProxyAPI hat dieselbe Endpunktstruktur wie 9Router, jedoch ohne `rotate-key` und +zusätzlich mit `accounts`, `provider-expose` und `auto-restart-adopted`. Es erhält nun +einen dedizierten Data-Plane-API-Schlüssel, der beim Start injiziert wird (`needsApiKey: true` +in `bootstrap.ts`, für die Modellsynchronisierung verwendet); `status` enthält weniger Felder. | Methode | Pfad | Beschreibung | | ------- | ----------------------------------- | ----------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | CLIProxyAPI über npm installieren | +| `POST` | `/api/services/cliproxy/install` | CLIProxyAPI von npm installieren | | `POST` | `/api/services/cliproxy/start` | CLIProxyAPI starten | | `POST` | `/api/services/cliproxy/stop` | CLIProxyAPI stoppen | | `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI neu starten | | `POST` | `/api/services/cliproxy/update` | Auf eine neuere Version aktualisieren | | `GET` | `/api/services/cliproxy/status` | Live- und DB-Status (ohne `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Autostart umschalten | +| `POST` | `/api/services/cliproxy/auto-start` | Automatischen Start umschalten | -Der gemeinsame Endpunkt `GET /api/services/{name}/logs` (siehe §4.1) funktioniert für alle -vier Dienste unter Verwendung des dynamischen Segments `[name]`. +Der gemeinsam genutzte Endpunkt `GET /api/services/{name}/logs` (siehe §4.1) funktioniert +für alle vier Dienste über das dynamische Segment `[name]`. --- ### 4.3 Mux-Endpunkte (8 Routen) -Mux besitzt dieselbe Endpunktstruktur wie CLIProxyAPI — keine `rotate-key`-Route in der API- -Oberfläche (das Bearer-Token wird auf dieselbe Weise wie bei 9Router über -`getOrCreateApiKey("mux")` generiert und über die Umgebungsvariable `MUX_SERVER_AUTH_TOKEN` injiziert, -es gibt jedoch noch keinen dedizierten Rotationsendpunkt). Für Mux wird nur der Lebenszyklus verwaltet: -Im Gegensatz zu 9Router besitzt es keinen Layer-4-Executor und wird niemals als Routing-Provider registriert. +Mux hat dieselbe Endpunktstruktur wie CLIProxyAPI – keine `rotate-key`-Route in der +API-Oberfläche (das Bearer-Token wird auf dieselbe Weise wie bei 9Router über +`getOrCreateApiKey("mux")` generiert und über die Umgebungsvariable `MUX_SERVER_AUTH_TOKEN` +injiziert, aber es gibt noch keinen dedizierten Rotationsendpunkt). Mux wird ausschließlich +über seinen Lebenszyklus verwaltet: Anders als 9Router verfügt es über keinen Layer-4-Executor +und wird niemals als Routing-Provider registriert. | Methode | Pfad | Beschreibung | | ------- | ------------------------------ | ----------------------------------------- | -| `POST` | `/api/services/mux/install` | Mux über npm installieren (`npm i mux`) | +| `POST` | `/api/services/mux/install` | Mux von npm installieren (`npm i mux`) | | `POST` | `/api/services/mux/start` | Mux starten (`mux server`) | | `POST` | `/api/services/mux/stop` | Mux stoppen | | `POST` | `/api/services/mux/restart` | Mux neu starten | | `POST` | `/api/services/mux/update` | Auf eine neuere npm-Version aktualisieren | | `GET` | `/api/services/mux/status` | Live- und DB-Status | -| `POST` | `/api/services/mux/auto-start` | Autostart umschalten | +| `POST` | `/api/services/mux/auto-start` | Automatischen Start umschalten | --- ### 4.4 Bifrost-Endpunkte (8 Routen) -Bifrost ist ein in Go implementiertes KI-Gateway-Relay-Backend (`@maximhq/bifrost`). Es verwendet dieselbe -Endpunktstruktur wie CLIProxyAPI (kein `rotate-key` — Bifrost verwaltet seine eigenen Provider- -Schlüssel in `config.json` unter seinem `-app-dir`). +Bifrost ist ein in Go implementiertes AI-Gateway-Relay-Backend (`@maximhq/bifrost`). Es +verwendet dieselbe Endpunktstruktur wie CLIProxyAPI (kein `rotate-key` – Bifrost verwaltet +seine eigenen Provider-Schlüssel in `config.json` unter seinem `-app-dir`). -| Methode | Pfad | Beschreibung | -| ------- | ---------------------------------- | -------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Bifrost aus npm (`@maximhq/bifrost`) installieren | -| `POST` | `/api/services/bifrost/start` | Bifrost auf Port 8080 starten (Standard) | -| `POST` | `/api/services/bifrost/stop` | Bifrost stoppen | -| `POST` | `/api/services/bifrost/restart` | Bifrost neu starten | -| `POST` | `/api/services/bifrost/update` | Auf eine neuere Version aktualisieren | -| `GET` | `/api/services/bifrost/status` | Live- und DB-Status | -| `POST` | `/api/services/bifrost/auto-start` | Automatischen Start umschalten | -| `GET` | `/api/services/bifrost/logs` | SSE-Log-Ausgabe (über die gemeinsame dynamische Route `[name]/logs`) | +| Methode | Pfad | Beschreibung | +| ------- | ---------------------------------- | ----------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Bifrost von npm installieren (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Bifrost auf Port 8080 starten (Standard) | +| `POST` | `/api/services/bifrost/stop` | Bifrost stoppen | +| `POST` | `/api/services/bifrost/restart` | Bifrost neu starten | +| `POST` | `/api/services/bifrost/update` | Auf eine neuere Version aktualisieren | +| `GET` | `/api/services/bifrost/status` | Live- und DB-Status | +| `POST` | `/api/services/bifrost/auto-start` | Automatischen Start umschalten | +| `GET` | `/api/services/bifrost/logs` | SSE-Log-Tail (über die gemeinsame dynamische Route `[name]/logs`) | -**Routing-Anbindung:** Wenn `BIFROST_BASE_URL` nicht gesetzt ist und die überwachte Bifrost- -Instanz ausgeführt wird, verwendet `getBifrostRoutingConfig()` (in `routingBackend.ts`) automatisch -`http://127.0.0.1:{port}` als Relay-Basis-URL. Eine explizit gesetzte Umgebungsvariable `BIFROST_BASE_URL` -hat immer Vorrang. +**Routing-Verknüpfung:** Wenn `BIFROST_BASE_URL` nicht gesetzt ist und die überwachte +Bifrost-Instanz ausgeführt wird, verwendet `getBifrostRoutingConfig()` (in `routingBackend.ts`) +automatisch `http://127.0.0.1:{port}` als Basis-URL des Relays. Eine explizit gesetzte +Umgebungsvariable `BIFROST_BASE_URL` hat stets Vorrang. --- ### 4.5 Dario-Endpunkte (12 Routen) -Dieselbe Lebenszyklusstruktur wie bei den anderen Diensten (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`) sowie eine Token-geschützte OAuth- -Steuerungsebene unter `admin/`: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (alle durch `DARIO_ADMIN_TOKEN` geschützt). - -### 4.6 Reverse-Proxy (Einbettung des 9Router-Dashboards) - -Das Dashboard bettet die 9Router-Weboberfläche über einen internen Reverse- -Proxy in einem iframe ein: +Dieselbe Lebenszyklusstruktur wie bei den anderen Diensten (`install`, `start`, `stop`, +`restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`) sowie eine +token-geschützte OAuth-Steuerungsebene unter `admin/`: `admin/accounts`, +`admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (alle durch +`DARIO_ADMIN_TOKEN` geschützt). + +### 4.6 open-wa-Endpunkte (7 Routen) + +open-wa (`@open-wa/wa-automate`) steuert eine Headless-Chromium-Instanz (über +Puppeteer), um WhatsApp Web zu automatisieren. Es verwendet dieselbe Endpunktstruktur +wie Mux (noch keine `rotate-key`-Route). Es wird ausschließlich über seinen Lebenszyklus +verwaltet – es ist kein Routing-Ziel und besitzt keinen Layer-4-Executor/Provider-Eintrag. + +| Methode | Pfad | Beschreibung | +| ------- | --------------------------------- | ----------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | open-wa über npm (`@open-wa/wa-automate`) installieren | +| `POST` | `/api/services/openwa/start` | open-wa auf Port 8323 starten (Standard) | +| `POST` | `/api/services/openwa/stop` | open-wa stoppen | +| `POST` | `/api/services/openwa/restart` | open-wa neu starten | +| `POST` | `/api/services/openwa/update` | Auf eine neuere Version aktualisieren | +| `GET` | `/api/services/openwa/status` | Live- und DB-Status | +| `POST` | `/api/services/openwa/auto-start` | Automatischen Start umschalten | +| `GET` | `/api/services/openwa/logs` | SSE-Log-Tail (über die gemeinsame dynamische Route `[name]/logs`) | + +**API-Schlüssel:** Wird als `WA_KEY` injiziert — die generische, mit `WA_*` +präfixierte Umgebungsvariablenüberschreibung von open-wa ordnet ihn der +CLI-Option `--key`/`-k` zu (`dist/cli/setup.js::envArgs()`, anhand des +installierten Pakets in Version 4.76.0 verifiziert). Bei der Generierung durch +`generateServiceApiKey()` wird `ow_` vorangestellt. open-wa liest den Schlüssel +aus einem `key`/`api_key`-HTTP-Header aus (nicht aus `Authorization: Bearer`); +`/api-docs*` ist ausdrücklich von der Prüfung ausgenommen +(`setupAuthenticationLayer` in `dist/cli/server.js`), sodass der +Integritätscheck keinen Authentifizierungs-Header benötigt. + +**Kopplung:** open-wa ist inoffiziell und steht in keiner Verbindung zu +WhatsApp — für die verbundene Nummer besteht aufgrund der WhatsApp-eigenen +Automatisierungserkennung das Risiko einer Sperrung. Beim ersten Start wird der +QR-Code zur Kopplung auf stdout ausgegeben und über das vorhandene +Protokollfenster bzw. den SSE-Stream bereitgestellt — diese Integration verfügt +noch über keinen eigenen QR-Bild-Endpunkt. + +--- + +### 4.7 Reverse-Proxy (Einbettung des 9Router-Dashboards) + +Das Dashboard bettet die 9Router-Weboberfläche über einen internen +Reverse-Proxy in einen iframe ein: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -522,16 +563,18 @@ Dieser Proxy: - Leitet die Anfrage an `http://127.0.0.1:{port}/{path}` weiter (nur Loopback) - Entfernt eingehende `cookie`- und `authorization`-Header (keine Offenlegung der OmniRoute-Sitzung) -- Fügt `Authorization: Bearer {apiKey}` für die 9Router-Authentifizierung ein -- Entfernt `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` aus der Antwort -- Schreibt HTML-Antworten um, um `` einzufügen und absolute Pfade zu normalisieren (`/foo` → `/dashboard/.../embed/foo`) +- Injiziert `Authorization: Bearer {apiKey}` für die 9Router-Authentifizierung +- Entfernt `set-cookie`, `content-security-policy`, `x-frame-options` und `cross-origin-*` aus der Antwort +- Schreibt HTML-Antworten um, um `` zu injizieren und absolute Pfade zu normalisieren (`/foo` → `/dashboard/.../embed/foo`) -WebSocket-Upgrades für das eingebettete Dashboard werden von einem begleitenden Server auf einem -dedizierten Port verarbeitet (siehe `src/lib/services/embedWsProxy.ts`). +WebSocket-Upgrades für das eingebettete Dashboard werden von einem begleitenden +Server auf einem dedizierten Port verarbeitet (siehe +`src/lib/services/embedWsProxy.ts`). **Sicherheit:** Die Embed-Proxy-Routen sind unter `LOCAL_ONLY_API_PREFIXES` -klassifiziert und können nur über Loopback erreicht werden. Ein Angreifer, der über einen -Cloudflare-/Ngrok-Tunnel ein JWT erhält, kann keine Proxy-Verbindung zu eingebetteten Diensten herstellen. +klassifiziert und können nur über Loopback erreicht werden. Ein Angreifer, der +über einen Cloudflare-/Ngrok-Tunnel ein JWT erlangt, kann keine Anfragen per +Proxy an eingebettete Dienste weiterleiten. --- diff --git a/docs/i18n/de/docs/frameworks/MEMORY.md b/docs/i18n/de/docs/frameworks/MEMORY.md index 1fd4b847449d..f6b2911c57e4 100644 --- a/docs/i18n/de/docs/frameworks/MEMORY.md +++ b/docs/i18n/de/docs/frameworks/MEMORY.md @@ -176,31 +176,33 @@ Die Tabelle `memory_vec_meta` (Migration `083_memory_vec.sql`) speichert: Neun Einbettungs- und Vektorfelder sind in `MemorySettingsExtended` in `src/shared/schemas/memory.ts` verfügbar und werden über `src/lib/db/settings.ts` persistiert: -| Feld | Typ | Standardwert | Beschreibung | -| ------------------------ | -------------------------------------------------- | ------------ | ------------------------------------------------------------ | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Zu verwendende Einbettungsquelle | -| `embeddingProviderModel` | `string \| null` | `null` | Anbieter/Modell im Format `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | OpenAI-kompatible Basis-URL des Endpunkts nur für Memory | -| `customModelId` | `string \| null` | `null` | An den benutzerdefinierten Endpunkt gesendete Modell-ID | -| `transformersEnabled` | `boolean` | `false` | Opt-in für Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Opt-in für das lokale statische Modell potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Neusortierungsschritt aktivieren (+200–500 ms/Anfrage) | -| `rerankProviderModel` | `string \| null` | `null` | Anbieter/Modell für Neusortierung im Format `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Zu verwendendes Vektor-Backend | +| Feld | Typ | Standard | Beschreibung | +| ------------------------ | -------------------------------------------------- | -------- | -------------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Zu verwendende Einbettungsquelle | +| `embeddingProviderModel` | `string \| null` | `null` | Anbieter/Modell im Format `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | Nur für Memory verwendete, OpenAI-kompatible Basis-URL des Endpunkts | +| `customModelId` | `string \| null` | `null` | An den benutzerdefinierten Endpunkt gesendete Modell-ID | +| `transformersEnabled` | `boolean` | `false` | Opt-in für Transformers.js (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Opt-in für das lokale statische Modell potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Reranking-Schritt aktivieren (zusätzlich +200-500ms/Anfrage) | +| `rerankProviderModel` | `string \| null` | `null` | Reranking-Anbieter/Modell im Format `provider/model` | + +`rerankProviderModel` wird durch `POST /v1/rerank` aufgelöst (Aufruf über Loopback) und akzeptiert daher alles, was diese Route akzeptiert: ein kuratiertes Cloud-Reranking-Modell (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) oder einen OpenAI-kompatiblen Anbieterknoten als `/` (z. B. `skilled-mini/bge-reranker-v2-m3` für eine TEI/Infinity-Instanz). Loopback-Knoten sind immer zulässig; ein Knoten auf einem anderen Host (LAN, Tailscale) erfordert zusätzlich den Feature-Flag `RERANK_REMOTE_PROVIDER_NODES` und muss die Richtlinie für ausgehende Anbieter-URLs erfüllen — siehe [Feature-Flags](../reference/FEATURE_FLAGS.md). Der Dashboard-Selektor listet kuratierte Anbieter sowie lokale Knoten auf; jede gültige Zeichenfolge im Format `provider/model` kann direkt über `PUT /api/settings/memory` festgelegt werden. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Zu verwendendes Vektor-Backend | Diese werden über `GET /PUT /api/settings/memory` bereitgestellt (Schema `MemorySettingsExtendedSchema`). Für die Quelle `remote` akzeptiert Memory außerdem die optionalen Einstellungen `customBaseUrl` und -`customModelId`. Gemeinsam wählen sie einen OpenAI-kompatiblen `/embeddings`-Endpunkt +`customModelId`. Zusammen wählen sie einen OpenAI-kompatiblen `/embeddings`-Endpunkt und ein Modell aus, ohne die globale Einbettungsregistrierung zu ändern. Der Endpunkt wird vor der Verwendung normalisiert und anhand der Richtlinie für ausgehende Anbieter-URLs geprüft: HTTP(S) ist -erforderlich, eingebettete Zugangsdaten und Abfragezeichenfolgen werden abgelehnt und Adressen -für Cloud-Metadaten bleiben gesperrt. Leere Werte behalten den ausgewählten registrierten Anbieter bei. An das -Dashboard zurückgegebene Fehler werden bereinigt, und Endpunkt-Zugangsdaten werden niemals protokolliert. +erforderlich, eingebettete Anmeldedaten und Abfragezeichenfolgen werden abgelehnt und Cloud-Metadaten- +Adressen bleiben blockiert. Leere Werte behalten den ausgewählten Registrierungsanbieter bei. An +das Dashboard zurückgegebene Fehler werden bereinigt, und Endpunkt-Anmeldedaten werden niemals protokolliert. -> **TODO (D20):** Der Gültigkeitsbereich `global` (gemeinsame Nutzung von Erinnerungen über alle API-Schlüssel hinweg) ist in dieser Version -> nicht implementiert. Dafür sind Schemaänderungen und ein globaler Abrufpfad -> erforderlich. Separat nachverfolgen. +> **TODO (D20):** Der Geltungsbereich `global` (Freigabe von Erinnerungen für alle API-Schlüssel) ist in +> dieser Version nicht implementiert. Er erfordert Schemaänderungen und einen globalen Abruf- +> pfad. Separat nachverfolgen. ## Speicherschichten diff --git a/docs/i18n/de/docs/guides/DOCKER_GUIDE.md b/docs/i18n/de/docs/guides/DOCKER_GUIDE.md index b7b3aafcc3f8..3d1e47b8770d 100644 --- a/docs/i18n/de/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/de/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Schnellstart +> **Selbst hosten mit einem einzigen Befehl?** Siehe +> [Anleitung zum Selbsthosten](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (veröffentlichtes Image + +> Redis, nur Loopback, keine Profilauswahl). Der folgende Schnellstart beschreibt +> die Ausführung als einzelnen Container für Benutzer, die Redis bereits an anderer Stelle betreiben. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/de/docs/guides/TROUBLESHOOTING.md b/docs/i18n/de/docs/guides/TROUBLESHOOTING.md index 691851b3ae0d..067b4a942d75 100644 --- a/docs/i18n/de/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/de/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ Legen Sie diese Variablen in der Prozessumgebung von OmniRoute fest (für den Da ## Warnungen bei npm install (ERESOLVE / Peer-Abhängigkeiten / veraltet) -Wenn Sie `npm install -g omniroute` ausführen, sehen Sie möglicherweise eine Vielzahl von Warnungen wie `npm warn ERESOLVE`, Hinweise zu Peer-Abhängigkeiten und `deprecated`-Meldungen. **Diese sind zu erwarten und harmlos.** Ihre Installation war erfolgreich, wenn in der Ausgabe `added packages` angezeigt wird. +Wenn Sie `npm install -g omniroute` ausführen, sehen Sie möglicherweise eine Vielzahl von Warnungen wie `npm warn ERESOLVE`, Hinweise zu Peer-Abhängigkeiten und `deprecated`-Meldungen. **Diese sind zu erwarten und unbedenklich.** Ihre Installation war erfolgreich, wenn in der Ausgabe `added packages` angezeigt wird. + +Um die Warnungen zur Auflösung von Peer-Abhängigkeiten zu unterdrücken, verwenden Sie die von OmniRoute unterstützte Installationsform: + +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` unterdrückt nur `ERESOLVE`- und Peer-Abhängigkeitshinweise. Hinweise zu veralteten Paketen bleiben sichtbar, da sie von transitiven Drittanbieterpaketen stammen; sie bedeuten nicht, dass die Installation fehlgeschlagen ist. Die Warnungen stammen von veralteten Peer-Abhängigkeitsbereichen in Drittanbieterpaketen, auf die OmniRoute keinen Einfluss hat: -1. **`marked-terminal` erwartet `marked >=1 <16`, gefunden wurde `marked@18`** — funktioniert in der Praxis problemlos; der Peer-Abhängigkeitsbereich des Upstream-Pakets ist lediglich veraltet. +1. **`marked-terminal` erfordert `marked >=1 <16`, gefunden wurde `marked@18`** — funktioniert in der Praxis problemlos; der Peer-Abhängigkeitsbereich des Upstream-Pakets ist lediglich veraltet. 2. **`deprecated prebuild-install@7.1.3`** — ein transitives Hilfsprogramm zum Abrufen nativer Binärdateien. Es wird nicht - zur Installation der fest vorgegebenen `wreq-js`-Transportanbindung verwendet und bedeutet nicht, dass die Einrichtung - des Transports für den Web-Cookie-Anbieter fehlgeschlagen ist. + zur Installation der festgelegten `wreq-js`-Transportanbindung verwendet und bedeutet nicht, dass die Einrichtung des Transports + für den Web-Cookie-Anbieter fehlgeschlagen ist. -**Keine Maßnahme erforderlich** — die Warnungen können nicht vollständig unterdrückt werden, ohne die Upstream-Pakete zu forken. +**Keine Maßnahmen erforderlich** — die Warnungen können nicht vollständig unterdrückt werden, ohne die Upstream-Pakete zu forken. --- diff --git a/docs/i18n/de/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/de/docs/providers/CURSOR-API-KEY-AND-CLI.md index 0a2d00e02a4c..fc9d8f251563 100644 --- a/docs/i18n/de/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/de/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,38 +4,36 @@ --- -Zwei Möglichkeiten, Cursor ohne IDE-Sitzung hinter OmniRoute zu betreiben: +Zwei Möglichkeiten, Cursor ohne IDE-Sitzung hinter OmniRoute zu verwenden: 1. **`cursor-api`-Provider** (Karte „Cursor API“, Alias `cua`): ein API-Schlüssel- - Provider, der einen Cursor-Benutzer-API-Schlüssel (`crsr_…`, generiert unter - `https://cursor.com/dashboard/api`) verwaltet. Jeder OmniRoute-Client kann - Cursor-Modelle dann über `/v1/chat/completions` als `cursor-api/` oder - `cua/` erreichen, einschließlich der üblichen Kontingent-, Fallback- - und Protokollierungsebenen. Der IDE-Provider (`cursor`, OAuth/IDE-Sitzung) - bleibt unverändert. -2. **Cursor-CLI-Passthrough**: Richten Sie die Cursor CLI (`agent`) auf OmniRoute, - sodass jeder RPC der CLI mit einem OmniRoute-API-Schlüssel authentifiziert, - mit den Anmeldedaten einer `cursor-api`-Verbindung an Cursor weitergeleitet - und auf der Seite „Logs“ aufgezeichnet wird. + Provider, der einen Cursor-Benutzer-API-Schlüssel enthält (`crsr_…`, generiert unter + `https://cursor.com/dashboard/api`). Jeder OmniRoute-Client kann dann + über `/v1/chat/completions` als `cursor-api/` oder + `cua/` auf Cursor-Modelle zugreifen, einschließlich der üblichen Kontingent-, + Fallback- und Protokollierungsebenen. Der IDE-Provider + (`cursor`, OAuth-/IDE-Sitzung) bleibt unverändert. +2. **Cursor-CLI-Passthrough**: Richten Sie die Cursor-CLI (`agent`) auf OmniRoute, + sodass jeder RPC-Aufruf der CLI mit einem OmniRoute-API-Schlüssel authentifiziert, + mit den Anmeldedaten einer `cursor-api`-Verbindung an Cursor weitergeleitet und auf + der Protokollseite aufgezeichnet wird. ## Warum der Schlüssel ausgetauscht wird -`api2.cursor.sh` lehnt einen unverarbeiteten `crsr_…`-Schlüssel als Bearer-Token -ab (401). Die Cursor CLI sendet den Schlüssel zunächst per POST an -`/auth/exchange_user_api_key` und erhält ein Sitzungs-JWT, das nach einer Stunde -abläuft; das zurückgegebene `refreshToken` enthält denselben `exp`-Wert, daher -bedeutet eine Aktualisierung, dass der Schlüssel erneut ausgetauscht wird. -`open-sse/services/cursorApiKeyAuth.ts` führt diesen Austausch durch, speichert -ein Sitzungstoken pro Schlüssel zwischen, tauscht es fünf Minuten vor Ablauf -erneut aus und verwirft das zwischengespeicherte Token, wenn Cursor mit 401 -antwortet. `CursorExecutor` ruft dies unmittelbar vor dem Öffnen des -Upstream-Streams für `cursor-api`-Verbindungen auf. +`api2.cursor.sh` lehnt einen unverarbeiteten `crsr_…`-Schlüssel als Bearer-Token ab (401). Die Cursor- +CLI sendet den Schlüssel zunächst per POST an `/auth/exchange_user_api_key` und erhält ein Sitzungs- +JWT, das nach einer Stunde abläuft; das zurückgegebene `refreshToken` enthält denselben +`exp`-Wert, weshalb eine Aktualisierung einen erneuten Schlüsselaustausch erfordert. +`open-sse/services/cursorApiKeyAuth.ts` führt diesen Austausch durch, speichert pro Schlüssel ein Sitzungs- +Token im Cache, tauscht es fünf Minuten vor Ablauf erneut aus und verwirft das zwischengespeicherte +Token, wenn Cursor mit 401 antwortet. `CursorExecutor` ruft dies unmittelbar vor dem Öffnen +des Upstream-Streams für `cursor-api`-Verbindungen auf. ## Der `cursor-api`-Provider -Registrierung: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, dieselben Werte für `format`, -`baseUrl` und `models` wie bei `cursor`). Katalogkarte: +Registry: `open-sse/config/providers/registry/cursor/index.ts` +(`cursor_apiProvider`, `authType: "apikey"`, dieselben Werte für `format`, `baseUrl` und +`models` wie bei `cursor`). Katalogkarte: `src/shared/constants/providers/apikey/specialty-media.ts`. Executor-Zuordnung: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). @@ -50,7 +48,7 @@ curl -sS -X POST http://localhost:20128/api/providers \ -d '{"provider":"cursor-api","name":"cursor-api-key","apiKey":"crsr_…","priority":1}' ``` -Danach: +Anschließend: ```bash curl -sS http://localhost:20128/v1/chat/completions \ @@ -61,12 +59,24 @@ curl -sS http://localhost:20128/v1/chat/completions \ Hinweise: -- Die Modellliste für `cursor-api` stammt aus der statischen Cursor-Registrierung - (dieselbe Liste, auf die der IDE-Provider als Fallback zurückgreift); auf dem - OmniRoute-Host muss kein `cursor-agent` installiert sein. -- `POST /api/providers/{id}/refresh-cursor` ist ausschließlich für den - `cursor`-IDE-Provider vorgesehen; `cursor-api`-Verbindungen verfügen über - keine IDE-Sitzung, die erneuert werden müsste. +- Die Modellauflistung für `cursor-api` stammt aus der statischen Cursor-Registry (derselben + Liste, auf die der IDE-Provider als Fallback zurückgreift); auf dem OmniRoute-Host muss + kein `cursor-agent` installiert sein. +- `POST /api/providers/{id}/refresh-cursor` ist ausschließlich für den `cursor`-IDE-Provider + vorgesehen; `cursor-api`-Verbindungen verfügen über keine zu erneuernde IDE-Sitzung. + +## Native Modell-IDs und Aufwand + +Für `cursor` / `cu` und `cursor-api` / `cua` lässt der gemeinsam verwendete Claude-Aufwandsnormalisierer +die angeforderte Modell-ID unverändert. Cursor kann ein Suffix wie +`-low` als Teil einer tatsächlichen Modell-ID veröffentlichen, statt als OmniRoute-Aufwandsalias. +Der Cursor-Executor behält eine exakte Übereinstimmung mit dem Live-Katalog bei; wenn keine +Übereinstimmung vorliegt, übernimmt sein bestehender Modell-Resolver den Fallback vom Suffix +zum Parameter. + +Dies ändert nicht die Aufwandsnormalisierung für direkte Claude-, Claude-kompatible +oder Vertex-Routen. Die Verfügbarkeit hängt weiterhin vom Katalog und der Berechtigung +des ausgewählten Cursor-Kontos ab. ## Cursor-CLI-Passthrough @@ -75,13 +85,13 @@ Route: `src/app/api/cursor-cli/[...path]/route.ts` → `src/shared/constants/publicApiRoutes.ts` registriert, da der Handler seine eigene Authentifizierung durchsetzt: -| Pfad | Von der CLI erwartete Authentifizierung | Was OmniRoute tut | -| ----------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Validiert den Schlüssel, stellt ein 1 Stunde gültiges HS256-JWT aus (signiert mit `JWT_SECRET`) und gibt es zurück | -| jeder andere Pfad (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Prüft Aussteller/Zielgruppe/Ablauf, wählt eine aktive `cursor-api`-Verbindung aus, ersetzt den Authorization-Header durch das ausgetauschte Cursor-Token und streamt die Antwort zurück | +| Pfad | Von der CLI erwartete Authentifizierung | Verhalten von OmniRoute | +| ----------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Validiert den Schlüssel, stellt ein 1 Stunde gültiges HS256-JWT aus (signiert mit `JWT_SECRET`) und gibt es zurück | +| jeder andere Pfad (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Überprüft Aussteller, Zielgruppe und Ablaufzeit, wählt eine aktive `cursor-api`-Verbindung aus, ersetzt den Authorization-Header durch das ausgetauschte Cursor-Token und streamt die Antwort zurück | -Die CLI dekodiert `exp` aus jedem empfangenen Token. Wird ihr daher ein opakes -Token übergeben, führt sie vor nahezu jeder Anfrage einen erneuten Austausch +Die CLI dekodiert `exp` aus jedem empfangenen Token. Wird ihr ein opakes +Token übergeben, führt sie daher vor fast jeder Anfrage einen erneuten Austausch durch; das ausgestellte JWT verhindert dies. Bei einer 401-Antwort von OmniRoute führt die CLI den Austausch erneut durch. @@ -89,16 +99,16 @@ OmniRoute führt die CLI den Austausch erneut durch. 1. Erstellen Sie einen OmniRoute-API-Schlüssel (Dashboard → API-Schlüssel) und eine `cursor-api`-Verbindung. -2. Weisen Sie die CLI an, HTTP/1.1 für den Agenten-Stream zu verwenden. In - `~/.cursor/cli-config.json`: +2. Konfigurieren Sie die CLI so, dass sie HTTP/1.1 für den Agenten-Stream + verwendet. In `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Ohne diese Einstellung öffnet die CLI den Agenten-Durchlauf über HTTP/2 zu - einem separat konfigurierten Agenten-Host, und nur die RPCs der Steuerungsebene - laufen über den Endpunkt. + Ohne diese Einstellung öffnet die CLI den Agentendurchlauf über HTTP/2 zu + einem separat konfigurierten Agentenhost, und nur die RPCs der + Steuerungsebene werden über den Endpunkt geleitet. 3. Führen Sie die CLI gegen OmniRoute aus: @@ -108,19 +118,20 @@ OmniRoute führt die CLI den Austausch erneut durch. agent -p --trust "Reply with exactly OK" ``` -Jeder Hop erscheint in „Logs“ mit dem Provider `cursor-api`, dem Anfragetyp -`cursor-cli` und dem Pfad `/api/cursor-cli/` und wird dem OmniRoute- -API-Schlüssel sowie der Verbindung zugeordnet, die ihn verarbeitet hat. - -### Fehlermodi - -| Situation | Antwort an die CLI | -| ---------------------------------------------------------- | ------------------------------------------------------------- | -| Unbekannter OmniRoute-Schlüssel und `REQUIRE_API_KEY=true` | 401 `unauthenticated` beim Austausch | -| `REQUIRE_API_KEY=false` | anonyme Sitzung (entspricht dem Verhalten von `/v1/*`) | -| Abgelaufenes / fremdes / manipuliertes Sitzungs-JWT | 401, die CLI führt den Austausch erneut durch | -| OmniRoute-API-Schlüssel nach dem Austausch widerrufen | 401 beim nächsten RPC | -| Keine aktive `cursor-api`-Verbindung | 503 `unavailable` | -| Cursor lehnt den Schlüssel der Verbindung ab | 401 `unauthenticated`, zwischengespeicherte Sitzung verworfen | -| Upstream nicht erreichbar | 502 `unavailable` (bereinigte Meldung) | -| `JWT_SECRET` nicht gesetzt | 503 beim Austausch | +Jeder Hop erscheint in den Protokollen mit dem Anbieter `cursor-api`, dem +Anfragetyp `cursor-cli` und dem Pfad `/api/cursor-cli/` und wird dem +OmniRoute-API-Schlüssel sowie der Verbindung zugeordnet, die ihn verarbeitet +hat. + +### Fehlerszenarien + +| Situation | Antwort an die CLI | +| ---------------------------------------------------------- | ------------------------------------------------------------------ | +| Unbekannter OmniRoute-Schlüssel und `REQUIRE_API_KEY=true` | 401 `unauthenticated` beim Austausch | +| `REQUIRE_API_KEY=false` | anonyme Sitzung (entspricht dem Verhalten von `/v1/*`) | +| Abgelaufenes / fremdes / manipuliertes Sitzungs-JWT | 401, die CLI führt den Austausch erneut durch | +| OmniRoute-API-Schlüssel nach dem Austausch widerrufen | 401 beim nächsten RPC | +| Keine aktive `cursor-api`-Verbindung | 503 `unavailable` | +| Cursor lehnt den Schlüssel der Verbindung ab | 401 `unauthenticated`, zwischengespeicherte Sitzung wird verworfen | +| Upstream nicht erreichbar | 502 `unavailable` (bereinigte Meldung) | +| `JWT_SECRET` nicht gesetzt | 503 beim Austausch | diff --git a/docs/i18n/de/docs/reference/API_REFERENCE.md b/docs/i18n/de/docs/reference/API_REFERENCE.md index d8f62cf437a9..27c7f1577704 100644 --- a/docs/i18n/de/docs/reference/API_REFERENCE.md +++ b/docs/i18n/de/docs/reference/API_REFERENCE.md @@ -438,43 +438,43 @@ Verwenden Sie diesen Endpunkt, wenn ein Sidecar außerhalb des Prozesses ausgef ## Kompatibilitätsendpunkte -| Methode | Pfad | Format | -| ------- | ----------------------------------------- | ------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (Bearbeiten/Inpainting) | -| POST | `/v1/videos/generations` | Videoerzeugung im OpenAI-Stil | -| POST | `/v1/music/generations` | Musikerzeugung im OpenAI-Stil | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (gibt Audiodaten zurück) | -| POST | `/v1/rerank` | Neusortierung im Cohere-/Voyage-Stil | -| POST | `/v1/classify` | Jina-Klassifizierung (`api.jina.ai`) | -| POST | `/v1/segment` | Jina-Segmentierer (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | OpenAI-Katalogalias | -| GET | `/api/v1/vscode/{token}/models` | OpenAI-Modellalias | -| POST | `/api/v1/vscode/{token}/chat/completions` | Tokenisierter OpenAI-Alias | -| POST | `/api/v1/vscode/{token}/responses` | Tokenisierter OpenAI-Responses-Alias | -| POST | `/api/v1/vscode/{token}/api/chat` | Tokenisierter Ollama-Alias | -| GET | `/api/v1/vscode/{token}/api/tags` | Tokenisierter Ollama-Tags-Alias | - -Alle POST-Routen folgen demselben Schema: `Bearer your-api-key` + ein durch Zod validierter JSON-Body (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` usw.; siehe `src/shared/validation/schemas.ts`). Bei einem Schemafehler wird ein 4xx-Statuscode zurückgegeben. - -Für Clients, die `Authorization: Bearer ...` nicht anhängen können, akzeptiert OmniRoute API-Schlüssel auch in der URL, entweder über kompatible Abfrageparameter (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) oder über die unten dokumentierten dedizierten `/api/v1/vscode/{token}/...`-Endpunkte. +| Methode | Pfad | Format | +| ------- | ----------------------------------------- | -------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (Bearbeitung/Inpainting) | +| POST | `/v1/videos/generations` | Videoerzeugung im OpenAI-Stil | +| POST | `/v1/music/generations` | Musikerzeugung im OpenAI-Stil | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (gibt Audiodaten zurück) | +| POST | `/v1/rerank` | Reranking im Cohere-/Voyage-Stil | +| POST | `/v1/classify` | Jina-Klassifizierung (`api.jina.ai`) | +| POST | `/v1/segment` | Jina-Segmentierer (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | OpenAI-Katalogalias | +| GET | `/api/v1/vscode/{token}/models` | OpenAI-Modellalias | +| POST | `/api/v1/vscode/{token}/chat/completions` | Tokenisierter OpenAI-Alias | +| POST | `/api/v1/vscode/{token}/responses` | Tokenisierter OpenAI-Responses-Alias | +| POST | `/api/v1/vscode/{token}/api/chat` | Tokenisierter Ollama-Alias | +| GET | `/api/v1/vscode/{token}/api/tags` | Tokenisierter Ollama-Tags-Alias | + +Alle POST-Routen folgen demselben Schema: `Bearer your-api-key` + Zod-validierter JSON-Body (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` usw., siehe `src/shared/validation/schemas.ts`). Bei einer Schema-Validierungsfehlermeldung wird 4xx zurückgegeben. + +Für Clients, die `Authorization: Bearer ...` nicht mitsenden können, akzeptiert OmniRoute API-Schlüssel auch in der URL – entweder über kompatible Abfrageparameter (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) oder über die unten dokumentierten dedizierten `/api/v1/vscode/{token}/...`-Endpunkte. ```bash -# Neusortierung +# Reranking (Cloud-Registry-Anbieter oder OpenAI-kompatibler Anbieter-Knoten als "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina-Klassifizierung (Foundation-API-Anmeldedaten) +# Jina-Klassifizierung (Foundation-API-Zugangsdaten) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Jina-Segmentierer @@ -483,7 +483,7 @@ POST /v1/segment { "content": "...", "return_chunks": true } # Jina-Suche (s.jina.ai; Anbieter-Aliasse: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Moderation +# Moderationen POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } # TTS — gibt einen audio/mpeg-Body (oder das angeforderte Format) zurück @@ -497,6 +497,28 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Reranking-Anbieter-Knoten:** `POST /v1/rerank` leitet Anfragen auch an OpenAI-kompatible Anbieter-Knoten +> (oMLX, vLLM, Infinity, TEI hinter einem Gateway, …) weiter, die als `/` adressiert werden. Loopback- +> Knoten (`localhost`, `127.0.0.1`, `172.16.0.0/12`) sind immer zulässig. Knoten auf jedem anderen +> Host – einem Rechner im LAN oder einem Tailscale-Peer – sind nur zulässig, wenn der Betreiber das +> Feature-Flag `RERANK_REMOTE_PROVIDER_NODES` aktiviert **und** die Basis-URL des Knotens die Richtlinie für +> ausgehende Anbieter-URLs erfüllt (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> Cloud-Metadaten-Hosts werden niemals als Routing-Ziel verwendet. Der Reranking-Schritt der Memory-Engine ruft diese Route über +> Loopback auf, daher gilt dieselbe Regel für `rerankProviderModel` in den Memory-Einstellungen. +> +> **Formate lokaler Server:** Der Knoten wird unter `/v1/rerank` und bei einem 404-Fehler unter `/rerank` +> (Infinity, TEI) aufgerufen. Der Upstream-Body enthält sowohl die Cohere-/OpenAI-Schreibweise (`documents`, +> `return_documents`) als auch die TEI-Schreibweise (`texts`, `return_text`), und die Upstream-Antwort wird +> auf den Cohere-Umschlag normalisiert: TEIs reines `[{index, score, text}]`, `{results: [{index, score}]}` +> von schlanken Gateways und Voyages `{data: [...]}` werden alle als +> `{results: [{index, relevance_score, document?}]}` an den Client zurückgegeben, nach Punktzahl sortiert und auf `top_n` begrenzt. + +> **Erkennung von Anbieter-Knoten:** Modelle auf einem OpenAI-kompatiblen Anbieter-Knoten erscheinen in `GET /v1/models` +> unter dem Präfix des Knotens. Zeilen ohne Endpunktmetadaten (typisch für lokale `/v1/models`-Auflistungen) +> erben den `apiType` des Knotens, sodass die Modelle eines `embeddings`-Knotens `type: "embedding"` und die +> Modelle eines `rerank`-Knotens `type: "rerank"` erhalten, anstatt standardmäßig als Chat zu gelten; explizite +> `supportedEndpoints` in einer synchronisierten oder manuell hinzugefügten Zeile haben weiterhin Vorrang. + ### Dedizierte Anbieterrouten ```bash diff --git a/docs/i18n/de/docs/reference/ENVIRONMENT.md b/docs/i18n/de/docs/reference/ENVIRONMENT.md index f64a26d7eed6..d79b82a1ddb1 100644 --- a/docs/i18n/de/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/de/docs/reference/ENVIRONMENT.md @@ -79,73 +79,72 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. Speicher & Datenbank -OmniRoute verwendet **SQLite** (über `better-sqlite3`) für die gesamte Persistenz. Diese Variablen steuern den Speicherort, die Verschlüsselung und den Lebenszyklus der Daten. +OmniRoute verwendet **SQLite** (über `better-sqlite3`) für die gesamte Persistenz. Diese Variablen steuern Datenspeicherort, Verschlüsselung und Lebenszyklus. | Variable | Standardwert | Quelldatei | Beschreibung | | ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Stammverzeichnis für die SQLite-Datenbank, Sicherungen und Datendateien. Kann für Docker-Volumes oder benutzerdefinierte Pfade überschrieben werden. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(nicht gesetzt)_ | `src/lib/dataPaths.ts` | Ausweichoption für die DATA_DIR-Schutzvorrichtung bei Tests/Auswertungen (#10428). Tests und Node-Auswertungs-/Ausgabe-Probes (`-e`/`--eval`/`-p`/`--print`, einschließlich der Formen `--eval=`/`--print=`) ohne `DATA_DIR` werden in ein temporäres Wegwerfverzeichnis umgeleitet, sodass sie nicht die echte Datenbank des Betreibers öffnen können; auf `1` setzen, um wieder ausdrücklich das echte Verzeichnis zu verwenden. | -| `OMNIROUTE_BUILD_SHA` | _(nicht gesetzt)_ | `src/lib/monitoring/buildSha.ts` | Git-SHA des laufenden Artefakts. Wird durch `npm run build:release` eingetragen; kann in Containern injiziert werden, die ohne den Sentinel `dist/BUILD_SHA` ausgeliefert werden. Wird unter `/api/monitoring/health` als `system.buildSha` bereitgestellt. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Referenz, mit der die Provenienzprüfung beim Packen des Artefakts die Build-SHA vergleicht (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(nicht gesetzt)_ | `scripts/build/buildProvenance.ts` | Auf `1` setzen, um das Packen eines Builds zuzulassen, dessen SHA nicht in der Release-Linie enthalten ist. Der Build wird dann als absichtlicher Canary-Build aufgezeichnet, statt die Prüfung fehlschlagen zu lassen (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(nicht gesetzt)_ | `scripts/ops/deploy-canary.mjs` | API-Schlüssel für die Smoke-Probe der Canary-Bereitstellung, der bei `/v1/chat/completions` als `Authorization: Bearer` gesendet wird. Wird ausschließlich vom Bereitstellungsskript (#10429) und niemals vom Server verwendet. Steht nicht im Zusammenhang mit den `OMNIROUTE_SMOKE_*`-Variablen des optionalen CLI-Smoke-Testsystems (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` in `tests/integration/upstream-cli-smoke.int.test.ts`) — siehe [CLI-Integrationen → Echter Smoke-Testlauf](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(nicht gesetzt)_ | `src/lib/buildPhase.ts` | Signal für die Build-Phase (#10060): wird von `scripts/build/build-next-isolated.mjs` auf `1` gesetzt und von jedem gestarteten Build-Worker geerbt, sodass die Datenbankschicht einen funktionslosen Stub zurückgibt, anstatt das native Add-on better-sqlite3 zu laden (das den Worker beim Beenden zum Absturz bringt). Wird für den laufenden Server niemals gesetzt. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Auf `1` setzen, um die optionale Prebuild-Prüfung nativer Abhängigkeiten für exotische eingebundene Verzeichnisbäume zu überspringen. Dadurch wird eine fehlende Abhängigkeit nicht buildfähig; nur verwenden, wenn native Abhängigkeiten separat bereitgestellt werden. | -| `OMNIROUTE_DATA_DIR` | _(nicht gesetzt)_ | `open-sse/executors/promptql/threadSticky.ts` | **Fallback-Alias** für `DATA_DIR`, der nur geprüft wird, wenn `DATA_DIR` nicht gesetzt ist. Dient zum Auffinden des persistenten Thread-Sticky-Sitzungscaches des PromptQL-Executors (`/promptql-thread-sessions.json`); wenn keine der beiden Variablen gesetzt ist, verbleibt der Cache ausschließlich im Arbeitsspeicher (keine Persistenz über Neustarts hinweg). | -| `OMNIROUTE_PLUGINS_DIR` | _(nicht gesetzt)_ | `src/lib/plugins/scanner.ts` | Verzeichnis, das der **Laufzeit-Plugin-Scanner** liest und in dem der Plugin-Manager Installationen vornimmt; überschreibt den aus dem Home-Verzeichnis abgeleiteten Standardwert (#11827). Legen Sie als Wert den per Bind-Mount eingebundenen Plugin-Verzeichnisbaum in Docker/K8s fest, anstatt HOME nur zur Verlagerung des Scanpfads zu ändern (HOME steuert auch jedes andere auf das Home-Verzeichnis bezogene Verhalten). Nicht gesetzt = `~/.omniroute/plugins` oder `/tmp/.omniroute/plugins`, wenn der Prozess überhaupt kein Home-Verzeichnis exportiert — dadurch wird die bisherige unbemerkte Nichterkennung verhindert. Das aufgelöste Verzeichnis wird beim Start einmal als `scanner.dir_resolved` zusammen mit der maßgeblichen Eingabe protokolliert. Nur serverseitig: CLI-Befehls-Plugins verwenden weiterhin ihren eigenen `OMNIROUTE_PLUGIN_PATH` (Abschnitt 9). | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(nicht gesetzt)_ | `src/lib/dataPaths.ts` | Ausweichoption für die DATA_DIR-Schutzvorrichtung für Tests/Evaluierungen (#10428). Tests und Node-Evaluierungs-/Ausgabeprüfungen (`-e`/`--eval`/`-p`/`--print`, einschließlich der Formen `--eval=`/`--print=`) ohne `DATA_DIR` werden in ein temporäres Wegwerfverzeichnis umgeleitet, damit sie nicht die echte Datenbank des Betreibers öffnen können; auf `1` setzen, um wieder das echte Verzeichnis zu verwenden. | +| `OMNIROUTE_BUILD_SHA` | _(nicht gesetzt)_ | `src/lib/monitoring/buildSha.ts` | Git-SHA des ausgeführten Artefakts. Wird durch `npm run build:release` eingetragen; kann in Container injiziert werden, die ohne die Sentinel-Datei `dist/BUILD_SHA` ausgeliefert werden. Wird unter `/api/monitoring/health` als `system.buildSha` ausgegeben. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Referenz, gegen die die Provenienzprüfung für Paketartefakte die Build-SHA prüft (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(nicht gesetzt)_ | `scripts/build/buildProvenance.ts` | Auf `1` setzen, um das Paketieren eines Builds zuzulassen, dessen SHA nicht zur Release-Linie gehört, und ihn als absichtlichen Canary-Build zu erfassen, anstatt die Prüfung fehlschlagen zu lassen (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(nicht gesetzt)_ | `scripts/ops/deploy-canary.mjs` | API-Schlüssel für die Smoke-Prüfung der Canary-Bereitstellung, der auf `/v1/chat/completions` als `Authorization: Bearer` gesendet wird. Wird nur vom Bereitstellungsskript (#10429) und niemals vom Server verwendet. Steht nicht im Zusammenhang mit den `OMNIROUTE_SMOKE_*`-Variablen des optionalen CLI-Smoke-Testsystems (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` in `tests/integration/upstream-cli-smoke.int.test.ts`) — siehe [CLI-Integrationen → Echter Smoke-Testlauf](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(nicht gesetzt)_ | `src/lib/buildPhase.ts` | Build-Phasen-Signal (#10060): Wird von `scripts/build/build-next-isolated.mjs` auf `1` gesetzt und von jedem gestarteten Build-Worker übernommen, sodass die Datenbankschicht einen wirkungslosen Stub zurückgibt, anstatt das native `better-sqlite3`-Add-on zu laden (das den Worker beim Beenden abbricht). Wird niemals für den laufenden Server gesetzt. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Auf `1` setzen, um die optionale Prebuild-Prüfung nativer Abhängigkeiten für exotische eingebundene Verzeichnisstrukturen zu überspringen. Dadurch wird eine fehlende Abhängigkeit nicht buildbar; nur verwenden, wenn native Abhängigkeiten extern bereitgestellt werden. | +| `OMNIROUTE_DATA_DIR` | _(nicht gesetzt)_ | `open-sse/executors/promptql/threadSticky.ts` | **Fallback-Alias** für `DATA_DIR`, der nur geprüft wird, wenn `DATA_DIR` nicht gesetzt ist. Wird verwendet, um den sitzungsgebundenen Thread-Cache des PromptQL-Executors auf dem Datenträger zu finden (`/promptql-thread-sessions.json`); wenn keine der beiden Variablen gesetzt ist, verbleibt der Cache ausschließlich im Arbeitsspeicher (keine Persistenz über Neustarts hinweg). | +| `OMNIROUTE_PLUGINS_DIR` | _(nicht gesetzt)_ | `src/lib/plugins/scanner.ts` | Verzeichnis, das der **Laufzeit-Plugin-Scanner** liest und in das der Plugin-Manager installiert; überschreibt den vom Benutzerverzeichnis abgeleiteten Standardwert (#11827). Verweisen Sie damit auf den per Bind-Mount eingebundenen Plugin-Verzeichnisbaum in Docker/K8s, anstatt HOME zu verschieben, nur um den Scanpfad zu ändern (HOME steuert auch jedes andere auf das Benutzerverzeichnis bezogene Verhalten). Nicht gesetzt = `~/.omniroute/plugins` oder `/tmp/.omniroute/plugins`, wenn der Prozess überhaupt kein Benutzerverzeichnis exportiert — dadurch wird verhindert, dass Plugins unbemerkt nicht erkannt werden. Das aufgelöste Verzeichnis wird beim Start einmal als `scanner.dir_resolved` zusammen mit der maßgeblichen Eingabe protokolliert. Nur serverseitig: CLI-Befehls-Plugins verwenden weiterhin ihren eigenen `OMNIROUTE_PLUGIN_PATH` (Abschnitt 9). | | `STORAGE_ENCRYPTION_KEY` | _(leer = deaktiviert)_ | `src/lib/db/encryption.ts` | AES-Schlüssel für die vollständige Verschlüsselung der SQLite-Datenbank im Ruhezustand. Mit `openssl rand -hex 32` generieren. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Versionsbezeichnung für den Verschlüsselungsschlüssel. Bei einer Schlüsselrotation erhöhen, um die Entschlüsselung alter Sicherungen zu unterstützen. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Wenn `true`, werden routinemäßige bzw. vor Schreibvorgängen erstellte Sicherungen der SQLite-Datei übersprungen (Speichern/Löschen der models.dev-Preise, Schreiben von Einstellungen). Manuelle Sicherungen und Sicherungen vor einer Wiederherstellung werden weiterhin ausgeführt. Die obligatorische dauerhafte Sicherheitsmomentaufnahme des Migrationsprogramms oder dessen Schutzmechanismus gegen Massenmigrationen für eine bestehende persistente Datenbank wird dadurch **nicht** deaktiviert. Nicht manuelle Sicherungen werden auf höchstens einmal pro 60 Minuten begrenzt. Unter **Einstellungen → Speicher** im Dashboard kann die routinemäßige automatische Sicherung unabhängig davon deaktiviert werden. | -| `OMNIROUTE_CRYPT_KEY` | _(nicht gesetzt)_ | `src/lib/db/encryption.ts` | **Veralteter Alias** für `STORAGE_ENCRYPTION_KEY`. Wird als Rückfalloption akzeptiert, wenn die primäre Variable nicht vorhanden ist. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Versionsbezeichnung für den Verschlüsselungsschlüssel. Bei einer Schlüsselrotation erhöhen, um die Entschlüsselung alter Sicherungen zu ermöglichen. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Wenn `true`, werden routinemäßige bzw. vor Schreibvorgängen ausgeführte Sicherungen der SQLite-Datei übersprungen (Speichern/Löschen von models.dev-Preisdaten, Schreiben von Einstellungen). Manuelle Sicherungen und Sicherungen vor Wiederherstellungen werden weiterhin ausgeführt. Dies deaktiviert **nicht** den obligatorischen dauerhaften Sicherheitssnapshot des Migrationsprogramms oder den Schutz vor Massenmigrationen für eine bestehende persistente Datenbank. Nicht manuelle Sicherungen werden auf höchstens einmal alle 60 Minuten begrenzt. Unter **Einstellungen → Speicher** im Dashboard kann die routinemäßige automatische Sicherung unabhängig davon deaktiviert werden. | +| `OMNIROUTE_CRYPT_KEY` | _(nicht gesetzt)_ | `src/lib/db/encryption.ts` | **Veralteter Alias** für `STORAGE_ENCRYPTION_KEY`. Wird als Rückfalloption akzeptiert, wenn die primäre Variable fehlt. | | `OMNIROUTE_API_KEY_BASE64` | _(nicht gesetzt)_ | `src/lib/db/encryption.ts` | **Veralteter Alias** (Base64-kodierte Form), der als Rückfalloption akzeptiert wird. Wird vor der Verwendung automatisch dekodiert. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(nicht gesetzt)_ | `src/lib/db/core.ts` | Überschreibt das Intervall der regelmäßigen SQLite-Zustandsprüfung (ms). Wenn nicht gesetzt, werden die Standardwerte aus `NODE_ENV` abgeleitet. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/walMaintenance.ts` | Überschreibt das Intervall für die regelmäßige Ausführung von `wal_checkpoint(TRUNCATE)` (ms). Die automatische Checkpoint-Erstellung verkleinert die WAL-Datei selbst nie, und ein dauerhaft laufender Server schließt seine Datenbank nie. `0` deaktiviert diese Funktion. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | Überschreibt das Intervall für die häufige Ausführung von `wal_checkpoint(PASSIVE)` (ms). Hält ausstehende WAL-Frames klein, damit die regelmäßige TRUNCATE-Ausführung nie einen mehrere GB großen Rückstand im Hauptthread kopiert. `0` deaktiviert diese Funktion. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Wenn eine PASSIVE-Ausführung feststellt, dass die WAL-Datei diese Größe überschreitet, wird sofort zu `wal_checkpoint(TRUNCATE)` gewechselt, anstatt auf die langsame Ausführung zu warten. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Auf `1`/`true`/`yes`/`on` setzen, damit der Prozess beendet wird, nachdem eine kritische Ressourcenbelastung für `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` angehalten hat. So kann ein Supervisor (systemd `Restart=always`, Docker-Neustartrichtlinie) einen sauberen Prozess starten, anstatt dauerhaft 503-Fehler auszuliefern. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | Gibt an, wie lange die kritische Belastung anhalten muss, bevor der Prozess für einen Selbstneustart beendet wird. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(automatisch erkannt)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Expliziter Pfad (absolut oder relativ zu cwd) zu `sql-wasm.wasm`, wenn der WASM-Rückfalladapter `sql.js` verwendet wird. Wenn nicht gesetzt, erfolgt die automatische Erkennung anhand von Paketabhängigkeiten und infrage kommenden Verzeichnisstrukturen. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/core.ts` | Überschreibt das Intervall für die regelmäßige Ausführung von `wal_checkpoint(TRUNCATE)` (ms). Die automatische Checkpoint-Erstellung verkleinert die WAL-Datei selbst nie, und ein dauerhaft laufender Server schließt seine Datenbank nie. `0` deaktiviert diese Funktion. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Anzahl der Tage, für die Checkpoints, referenzierte Eingabe-/Ausgabe-/Fehlerdateien und die Datenbankzeile eines abgeschlossenen (erfolgreich/fehlgeschlagen/abgebrochen/abgelaufen) Batch-API-Auftrags durch die automatische Bereinigung aufbewahrt werden, bevor sie gelöscht werden. Wird erst wirksam, wenn `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` aktiviert ist; entspricht dem Aufbewahrungszeitraum der Batch-API-Ausgaben von OpenAI. Hat keinen Einfluss auf die vom Betreiber ausgelöste Route `DELETE /api/v1/batches/delete-completed`, die absichtlich bedingungslos bleibt (kein Altersfilter). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Wenn `true`, darf der automatische Bereinigungslauf abgeschlossene Batch-API-Aufträge (und deren Checkpoints) löschen, deren Alter `OMNIROUTE_BATCH_RETENTION_DAYS` überschreitet, sowie den BLOB-Inhalt hochgeladener Dateien entfernen, deren eigenes `expires_at` überschritten ist. Standardmäßig deaktiviert: Jede bestehende Installation behält diese Daten genau wie bisher, bis ein Betreiber die Funktion aktiviert. Außerdem ein über das Dashboard bearbeitbares Feature-Flag — siehe `docs/reference/FEATURE_FLAGS.md` → Laufzeit. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Auf `1` setzen, um den DB-Healthcheck beim Start vollständig zu überspringen. Nützlich für kurzlebige Aufgaben und Integrationstests. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Auf `1` setzen, um die DB-Healthcheck-Schleife zu erzwingen, selbst wenn sie normalerweise übersprungen würde (z. B. bei kurzlebigen Aufgaben). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Auf `1` setzen, um das Aufwärmen der nativen Laufzeit während `npm install` zu überspringen. Nützlich bei CI-/Headless-Installationen, bei denen sqlite bereits gebaut ist. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(automatisch erkannt)_ | `src/lib/db/migrationRunner.ts` | Überschreibt das vom Migrations-Runner durchsuchte Verzeichnis. Nützlich, wenn gebündelte Migrationen in benutzerdefinierten Builds ausgeliefert werden. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(nicht gesetzt)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Zusätzliche Migrationsverzeichnisse als durch das plattformspezifische Pfadtrennzeichen getrennte `namespace=dir`-Einträge (z. B. `ee=/opt/app/enterprise/db/migrations`). Dort gefundene Dateien werden als `-` erfasst, sodass eine Distribution mit eigenen Migrationen nie mit den numerischen Slots des Upstream-Projekts kollidiert. Ein fehlerhafter Eintrag, ein ungültiger Namespace oder ein fehlendes Verzeichnis führt beim Start zu einem Fehler, anstatt das Schema stillschweigend zu überspringen. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Sicherheitsschwellenwert für eine große Anzahl ausstehender Migrationen (#3416). Der Start wird abgebrochen, wenn bei einer bestehenden DB mehr Migrationen als dieser Wert ausstehen (schützt vor einer gelöschten Tracking-Tabelle). Erhöhen, um ein älteres Backup wiederherzustellen; auf `0` setzen, um die Prüfung zu deaktivieren. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Arbeitsverzeichnis für das `check:install-upgrade`-Release-Gate. Es benötigt ungefähr 12 GB (zwei Installationsbäume mit jeweils ~3 GB plus Tarball) und darf daher nicht auf einem kleinen tmpfs ausgeführt werden — auf dem selbst gehosteten Runner ist `/tmp` ein 12-GB-RAM-basiertes tmpfs, das vom Gate ausgeschöpft wurde, wodurch das Paket abgeschnitten wurde. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(Standardwert im Code)_ | `src/lib/spend/batchWriter.ts` | Flush-Intervall (ms) für den gebündelten Ausgaben-/Kosten-Writer. Niedrigere Werte reduzieren die Zusammenfassung von Schreibvorgängen; höhere Werte verringern DB-Konflikte. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(Standardwert im Code)_ | `src/lib/spend/batchWriter.ts` | Maximale Anzahl gepufferter Ausgabeneinträge vor einem erzwungenen Flush. Bei Bereitstellungen mit hoher QPS erhöhen; verringern, wenn begrenzter Speicher wichtiger ist. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(nicht gesetzt)_ | `open-sse/utils/proxyFetch.ts` | Auf `"true"` setzen, um `[ProxyFetch]`-Debug-Protokolle auf dem Vercel-Relay-Pfad auszugeben. Standardmäßig deaktiviert, um keine Routing-Hinweise offenzulegen. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(nicht gesetzt)_ | `src/lib/db/core.ts` | Überschreibt das Intervall der regelmäßigen SQLite-Integritätsprüfung (ms). Wenn nicht gesetzt, werden die Standardwerte aus `NODE_ENV` abgeleitet. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(entfernt)_ | `src/lib/db/walMaintenance.ts` | **Entfernt.** Ein regelmäßiges `wal_checkpoint(TRUNCATE)` im laufenden Betrieb kann die gemeinsam genutzte wal-index-Zuordnung ungültig machen und den Prozess mit SIGBUS (#13973) zum Absturz bringen; daher existiert der Scheduler nicht mehr. Die Variable ist wirkungslos: Ein positiver Wert protokolliert einmalig eine Veraltungswarnung, während `0` oder ein nicht gesetzter Wert keine Meldung erzeugt. Das WAL wird durch PASSIVE-Prüfpunkte (siehe unten) verwaltet und beim Herunterfahren durch den Prüfpunkt gekürzt. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 Min.) | `src/lib/db/walMaintenance.ts` | Überschreibt das Intervall (ms) für häufige `wal_checkpoint(PASSIVE)`-Ausführungen. Hält ausstehende WAL-Frames klein, damit Prüfpunkte schnell bleiben und die WAL-Datei zwischen den Kürzungen beim Herunterfahren eine begrenzte Größe behält. `0` deaktiviert dies. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Wenn bei einer PASSIVE-Ausführung festgestellt wird, dass die WAL-Datei diese Größe überschreitet, wird `wal_checkpoint(RESTART)` ausgeführt, damit das WAL von vorn beginnt, ohne den zugeordneten wal-index neu zu schreiben. Prüfpunkte im Kürzungsmodus während des laufenden Betriebs wurden entfernt (siehe Zeile `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Auf `1`/`true`/`yes`/`on` setzen, um den Prozess zu beenden, nachdem eine kritische Ressourcenbelastung für die Dauer von `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` angehalten hat. Dadurch kann ein Supervisor (systemd `Restart=always`, Docker-Neustartrichtlinie) einen sauberen Prozess starten, anstatt unbegrenzt 503-Fehler auszugeben. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 Min.) | `open-sse/utils/resourcePressure.ts` | Gibt an, wie lange eine kritische Ressourcenbelastung anhalten muss, bevor der Selbstneustart durch Beenden ausgelöst wird. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(automatische Erkennung)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Expliziter Pfad (absolut oder relativ zu cwd) zu `sql-wasm.wasm` bei Verwendung des `sql.js`-WASM-Fallback-Adapters. Wenn nicht gesetzt, erfolgt die automatische Erkennung anhand von Paketabhängigkeiten und möglichen Verzeichnisstrukturen. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Anzahl der Tage, für die Prüfpunkte, referenzierte Eingabe-/Ausgabe-/Fehlerdateien und der Datensatz eines abgeschlossenen (erfolgreich/fehlgeschlagen/abgebrochen/abgelaufen) Batch-API-Auftrags bei der automatischen Bereinigung vor dem Löschen aufbewahrt werden. Wird erst wirksam, wenn `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` aktiviert ist; entspricht dem Aufbewahrungszeitraum von OpenAI für Ausgaben der Batch API. Hat keine Auswirkungen auf die vom Betreiber ausgelöste Route `DELETE /api/v1/batches/delete-completed`, die absichtlich bedingungslos bleibt (kein Altersfilter). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Wenn `true`, darf die automatische Bereinigung abgeschlossene Batch-API-Aufträge (und deren Prüfpunkte) nach Ablauf von `OMNIROUTE_BATCH_RETENTION_DAYS` löschen und den BLOB-Inhalt hochgeladener Dateien nach deren jeweiligem `expires_at` leeren. Standardmäßig deaktiviert: Jede bestehende Installation behält diese Daten unverändert bei, bis ein Betreiber die Funktion ausdrücklich aktiviert. Auch ein im Dashboard bearbeitbares Feature-Flag — siehe `docs/reference/FEATURE_FLAGS.md` → Laufzeit. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Auf `1` setzen, um die DB-Zustandsprüfung beim Start vollständig zu überspringen. Nützlich für kurzlebige Aufgaben und Integrationstests. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Auf `1` setzen, um die Schleife zur DB-Zustandsprüfung zu erzwingen, selbst wenn sie normalerweise übersprungen würde (z. B. bei kurzlebigen Aufgaben). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Auf `1` setzen, um das Aufwärmen der nativen Laufzeitumgebung während `npm install` zu überspringen. Nützlich bei CI-/Headless-Installationen, bei denen sqlite bereits kompiliert ist. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(automatisch erkannt)_ | `src/lib/db/migrationRunner.ts` | Überschreibt das Verzeichnis, das vom Migrations-Runner durchsucht wird. Nützlich, wenn gebündelte Migrationen in benutzerdefinierten Builds ausgeliefert werden. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(nicht gesetzt)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Zusätzliche Migrationsverzeichnisse als `namespace=dir`-Einträge, getrennt durch das plattformspezifische Pfadtrennzeichen (z. B. `ee=/opt/app/enterprise/db/migrations`). Dort gefundene Dateien werden als `-` erfasst, sodass eine Distribution mit eigenen Migrationen nie mit den numerischen Slots des Upstream-Projekts kollidiert. Ein fehlerhafter Eintrag, ein ungültiger Namespace oder ein fehlendes Verzeichnis führt beim Start zu einem Fehler, anstatt das Schema stillschweigend zu überspringen. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Sicherheitsschwellenwert für eine große Anzahl ausstehender Migrationen (#3416). Der Start wird abgebrochen, wenn bei einer bestehenden DB mehr als diese Anzahl an Migrationen aussteht (schützt vor einer gelöschten Tracking-Tabelle). Erhöhen, um ein älteres Backup wiederherzustellen; auf `0` setzen, um die Prüfung zu deaktivieren. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Arbeitsverzeichnis für das Release-Gate `check:install-upgrade`. Es benötigt ungefähr 12 GB (zwei Installationsverzeichnisbäume mit jeweils etwa 3 GB plus Tarball) und darf daher nicht auf einem kleinen tmpfs ausgeführt werden — auf dem selbst gehosteten Runner ist `/tmp` ein 12 GB großes, RAM-basiertes tmpfs, das durch das Gate erschöpft wurde, wodurch das Paket abgeschnitten wurde. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(Standardwert im Code)_ | `src/lib/spend/batchWriter.ts` | Leerungsintervall (ms) für den gebündelten Ausgaben-/Kosten-Writer. Niedrigere Werte reduzieren die Zusammenfassung von Schreibvorgängen; höhere Werte verringern DB-Konflikte. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(Standardwert im Code)_ | `src/lib/spend/batchWriter.ts` | Maximale Anzahl gepufferter Ausgabeneinträge vor einer erzwungenen Leerung. Bei Deployments mit hoher QPS erhöhen; verringern, wenn begrenzter Speicher wichtiger ist. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(nicht gesetzt)_ | `open-sse/utils/proxyFetch.ts` | Auf `"true"` setzen, um `[ProxyFetch]`-Debug-Protokolle für den Vercel-Relay-Pfad auszugeben. Standardmäßig deaktiviert, um die Offenlegung von Routing-Hinweisen zu vermeiden. | | `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Auf `"true"` oder `"1"` setzen, um Client-/Egress-IPs und das Kontopräfix in die ausführliche `[ProxyEgress]`-Prozessprotokollzeile aufzunehmen. Standardmäßig DEAKTIVIERT, damit das Prozessprotokoll keine IPs oder das Kontopräfix offenlegt. | | `OMNIROUTE_DEBUG` | _(nicht gesetzt)_ | `bin/cli/commands/quota.mjs` | Auf `1` setzen, um über die CLI-Kontingentbefehle Zeitdiagnosen pro Anfrage (`[omniroute] GET completed in Nms`) auf stderr auszugeben. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automatisch)_ | `scripts/dev/healthcheck.mjs` | Expliziter Pfad, der von der Container-Zustandsprüfung abgefragt wird. Ist die Variable nicht gesetzt, wird der Pfad aus `OMNIROUTE_BASE_PATH` abgeleitet; durch das Setzen wird wieder der umfassende Monitoring-Endpunkt verwendet. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(nicht gesetzt)_ | `bin/cli/commands/completion.mjs` | Auf einen beliebigen nicht leeren Wert setzen, um `[omniroute completion]`-Diagnosen für die Cache-Pfade der CLI-Shell-Vervollständigung (Lesen/Aktualisieren/Schreiben) auszugeben. Standardmäßig deaktiviert — Fehler dieser Caches werden stillschweigend ignoriert, damit ein fehlender/beschädigter Cache die Tab-Vervollständigung niemals beeinträchtigt. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 Std.) | `open-sse/services/batchProcessor.ts` | Maximales Zeitfenster für Wiederholungsversuche einzelner Batch-Elemente (ms). Elemente, die diese Dauer überschreiten, werden als fehlgeschlagen markiert. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Basisverzögerung (ms) für exponentielles Backoff bei Wiederholungsversuchen von Batch-Elementen. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 Std.) | `open-sse/services/batchProcessor.ts` | Obergrenze (ms) für exponentielles Backoff zwischen Wiederholungsversuchen von Batch-Elementen. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Maximale Anzahl gleichzeitig verarbeiteter Batches. Erhöhen Sie den Wert, um den Durchsatz zu steigern; halten Sie ihn niedrig, um eine Flut von Ratenbegrenzungen zu vermeiden. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automatisch)_ | `scripts/dev/healthcheck.mjs` | Expliziter Pfad, der von der Container-Zustandsprüfung abgefragt wird. Wenn nicht gesetzt, wird der Pfad von der Prüfung aus `OMNIROUTE_BASE_PATH` abgeleitet; durch das Setzen wird wieder der ausführliche Überwachungsendpunkt verwendet. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(nicht gesetzt)_ | `bin/cli/commands/completion.mjs` | Auf einen beliebigen nicht leeren Wert setzen, um `[omniroute completion]`-Diagnosen aus den Cache-Pfaden für die Shell-Vervollständigung der CLI auszugeben (Lesen/Aktualisieren/Schreiben). Standardmäßig deaktiviert — Fehler dieser Caches werden stillschweigend ignoriert, sodass ein fehlender/beschädigter Cache die Tab-Vervollständigung nie beeinträchtigt. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Maximales Wiederholungszeitfenster für einzelne Batch-Elemente (ms). Elemente, die diese Dauer überschreiten, werden als fehlgeschlagen markiert. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Basisverzögerung (ms) für exponentielles Backoff bei Wiederholungsversuchen für Batch-Elemente. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 Std.) | `open-sse/services/batchProcessor.ts` | Obergrenze (ms) für exponentielles Backoff zwischen Wiederholungsversuchen für Batch-Elemente. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Maximale Anzahl gleichzeitig verarbeiteter Batches. Erhöhen Sie den Wert, um den Durchsatz zu steigern; halten Sie ihn niedrig, um eine Häufung von Ratenbegrenzungen zu vermeiden. | > [!IMPORTANT] -> Vor der Änderung einer bestehenden persistenten Datenbank veröffentlicht der Migrations-Runner einen vollständigen, +> Bevor eine bestehende persistente Datenbank geändert wird, veröffentlicht der Migrations-Runner einen vollständigen, > inhaltsadressierten Snapshot unter `DATA_DIR/db_backups/`. Die Veröffentlichung erfordert ein Dateisystem, > das nicht überschreibende Hardlinks innerhalb desselben Dateisystems sowie eine dauerhafte Dateisynchronisierung -> unterstützt. POSIX-Hosts erfordern außerdem eine Verzeichnissynchronisierung; unter Windows kann Node -> Verzeichnis-Handles ablehnen, weshalb OmniRoute die veröffentlichte Datei synchronisiert und die Synchronisierung -> des Verzeichniseintrags nach bestem Bemühen durchführt. -> Wenn das eingebundene `DATA_DIR` diese Garantien nicht bieten kann, wird der Start sicher abgebrochen, bevor -> eine Migration angewendet wird. Verschieben Sie `DATA_DIR` auf ein Volume, das diese Mechanismen unterstützt; +> unterstützt. POSIX-Hosts erfordern außerdem eine Verzeichnissynchronisierung; unter Windows lehnt Node möglicherweise +> Verzeichnis-Handles ab, weshalb OmniRoute die veröffentlichte Datei auf den Datenträger schreibt und die +> Synchronisierung des Verzeichniseintrags nach Möglichkeit durchführt. +> Wenn das eingebundene `DATA_DIR` diese Garantien nicht bieten kann, wird der Start vor der Anwendung +> einer Migration sicher abgebrochen. Verschieben Sie `DATA_DIR` auf ein Volume, das diese Funktionen unterstützt; > verwenden Sie nicht `DISABLE_SQLITE_AUTO_BACKUP`, um die Migrationssicherheit zu umgehen. ### Szenarien -| Szenario | Konfiguration | -| -------------------------------- | -------------------------------------------------------------------------------------------------- | -| **Lokale Entwicklung** | Behalten Sie alle Standardwerte bei. Die DB befindet sich unter `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + ein Volume unter `/data` einbinden. | -| **Im Ruhezustand verschlüsselt** | `STORAGE_ENCRYPTION_KEY` festlegen + den Schlüssel sichern! Verlust des Schlüssels = Datenverlust. | -| **CI/Tests** | `DATA_DIR=/tmp/omniroute-test` — flüchtig, keine Verschlüsselung erforderlich. | +| Szenario | Konfiguration | +| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| **Lokale Entwicklung** | Behalten Sie alle Standardwerte bei. Die DB befindet sich unter `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + binden Sie ein Volume unter `/data` ein. | +| **Im Ruhezustand verschlüsselt** | Legen Sie `STORAGE_ENCRYPTION_KEY` fest + bewahren Sie Sicherungskopien des Schlüssels auf! Verlust des Schlüssels = Verlust der Daten. | +| **CI/Tests** | `DATA_DIR=/tmp/omniroute-test` — flüchtig, keine Verschlüsselung erforderlich. | --- @@ -215,37 +214,38 @@ OmniRoute verwendet **SQLite** (über `better-sqlite3`) für die gesamte Persist ## 4. Sicherheit & Authentifizierung -| Variable | Standardwert | Quelldatei | Beschreibung | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt, das zur Erstellung eines Maschinenfingerabdrucks mit Hardwarekennungen kombiniert wird. Zur Isolierung für jede Bereitstellung ändern. | -| `OMNIROUTE_CLI_SALT` | _(nicht gesetzt = zufälliges, installationsspezifisches Salt, gespeichert unter `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-Salt zur Ableitung des lokalen CLI-Authentifizierungstokens. Das Festlegen dieses Werts rotiert alle CLI-Tokens auf dem Computer und hat stets Vorrang vor dem gespeicherten Salt. Siehe `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Setzt das `Secure`-Flag für Sitzungscookies. Beim Betrieb hinter HTTPS **muss dieser Wert `true` sein**. | -| `REQUIRE_API_KEY` | `false` | API-Middleware | Wenn `true`, müssen alle Proxy-Anfragen an `/v1/*` einen gültigen API-Schlüssel enthalten. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ermöglicht die Anzeige vollständiger API-Schlüsselwerte in der Dashboard-Benutzeroberfläche. Über die Dashboard-Feature-Flags konfigurierbar; stellt bei gemeinsam genutzten Instanzen ein Sicherheitsrisiko dar. | -| `NO_LOG_API_KEY_IDS` | _(leer)_ | `src/lib/compliance/index.ts` | Durch Kommas getrennte API-Schlüssel-IDs, für die keine Anfragen protokolliert werden (DSGVO-Konformität). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(nicht gesetzt = unbegrenzt)_ | `src/shared/utils/apiKeyPolicy.ts` | Ersatzwert für das tägliche Anfragebudget, der auf API-Schlüssel angewendet wird, deren Spalte `rate_limits` null ist. Nicht gesetzt oder leer: keine implizite Begrenzung (#2289, #11017). `0` hat dieselbe Bedeutung (unbegrenzt). Eine positive Ganzzahl N aktiviert N/Tag, 5N/Woche und 20N/Monat. Fehlerhafte, nicht leere Werte führen zur Verwendung der bisherigen Zeitfenster von 1000/Tag, 5000/Woche und 20000/Monat. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Maximal zulässige Größe des Anfragekörpers. Nutzdaten, die diesen Grenzwert überschreiten, werden abgelehnt. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Tatsächliche Anfragekörper ab diesem Schwellenwert belegen vor dem JSON-Parsen atomar die prozesslokale Zulassungs-Lease für ressourcenintensive Anfragen (BYTE-Pfad, einschließlich `POST /v1/responses`). Dieselbe Ausweichregel bei ausreichenden freien Kapazitäten aus [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) wie bei strukturell komplexen Anfragen; weiterhin durch `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) begrenzt, damit [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) nicht erneut auftritt. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Feste Obergrenze für Chat-Routen, die während der begrenzten Aufnahme anhand der gelesenen Bytes durchgesetzt wird, einschließlich Anfragen mit fehlendem, ungültigem oder falschem `Content-Length`; bei Überschreitung wird `413` zurückgegeben. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(nicht gesetzt — keine Begrenzung der Anfrageanzahl)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-Fan-out:** Diese ältere Begrenzung der AnfrageANZAHL greift jetzt nur, wenn sie ausdrücklich festgelegt ist. Bleibt sie nicht gesetzt (Standardeinstellung), wird die Zulassung schwergewichtiger Chatanfragen stattdessen durch `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` geregelt — ein automatisch abgeleitetes BYTE-Budget, das anhand der tatsächlichen Speicherobergrenze des Prozesses in **einem Prozess** (einem V8-Heap) bemessen wird. Zwei sich überschneidende `/v1/responses`-Anfragen mit jeweils ~750.000 Token bringen ~12-GiB-Heaps zum Absturz (#7849) — eine **Speicherbudget**-Warnung, keine feste produktseitige Höchstgrenze von 2. Ein gesunder Prozess (Heap unterhalb des Abweisungsverhältnisses) KANN über `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` mehr gleichzeitige lange `/v1/responses` zulassen. Dutzende langlebige SSE-Clients (40–50) sind eine Frage von Heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, nicht „maximal 2“. Dies blind zu erhöhen, um „den Host auszunutzen“, führt #7849 erneut ein. Vervielfachen Sie **Heaps** mit **N unabhängigen `DATA_DIR`s** (#11024); verwenden Sie niemals `replicas>1` für eine einzelne SQLite-Datei. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automatisch abgeleitet)_ | `src/shared/middleware/admissionBudget.ts` | **#503-Fan-out:** Überschreibung für das automatisch abgeleitete Byte-Budget der Eingabe (25 % der kleineren V8-/cgroup-Speicherobergrenze, geteilt durch eine 8-fache vorübergehende Verstärkung). Abgeleitete und explizite Werte werden auf 8 MiB–2 GiB begrenzt. Ein Body, der größer als das effektive Budget ist, schlägt sofort mit `413 body_exceeds_budget` fehl; Konkurrenz zwischen einzeln verarbeitbaren Bodys bleibt mit `503` wiederholbar. 40–50 gleichzeitige langlebige SSE-Clients sind eine Frage dieses Budgets + Heap, keine feste Grenze von „maximal 2“. Prüfen Sie vor der Feinabstimmung `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` unter `/api/monitoring/health`. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Abweisungsverhältnis bei Heap-Druck (`heapUsed / heap_size_limit`) für die BYTE- und STRUCTURE-Zulassung schwergewichtiger Anfragen (#10183, #10268, #10437). Eine gleichzeitige schwergewichtige Anfrage über `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` hinaus wird nur mit dem wiederholbaren `503` abgewiesen, wenn der Heap AUCH mindestens dieses Verhältnis erreicht hat; bei einem gesunden Heap wird sie stattdessen über den Spielraum für einen gesunden Heap zugelassen. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (Standardwert `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Begrenzte Zusatzkapazität für den Schnellpfad bei gesundem Heap (#10437), und zwar sowohl für STRUCTURE als auch BYTE (`admitChatRequest`, einschließlich Bodys ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ohne diese Begrenzung würde jede Anfrage bei ausgelastetem, aber gesundem Heap die Zulassungsprüfung ohne Obergrenze umgehen. Sobald so viele gleichzeitige Leases über den Pfad für einen gesunden Heap aktiv sind, greifen weitere Anfragen bei Auslastung auf DENSELBEN Pfad mit begrenzter Wartezeit/Abweisung zurück, der auch bei tatsächlichem Heap-Druck verwendet wird. `0` deaktiviert die Umgehung vollständig. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Anzahl der Nachrichten, ab der eine Chatanfrage als schwergewichtig eingestuft wird, selbst wenn ihr Body unter dem Byte-Schwellenwert liegt. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Anzahl der Tools, ab der eine Chatanfrage als schwergewichtig eingestuft wird, selbst wenn ihr Body unter dem Byte-Schwellenwert liegt. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservative Token-Schätzung anhand der String-Größe, ab der eine Anfrage als schwergewichtig eingestuft wird; dies ist ein Näherungswert für die Zulassungskosten, nicht die Tokenisierung für die Abrechnung durch den Anbieter. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (deaktiviert) | `src/shared/middleware/chatBodyAdmission.ts` | Optionale, ausdrücklich zu aktivierende Obergrenze für den Chatverlauf. Standardmäßig deaktiviert: Eine Nachrichtenanzahl ist eine Bereitstellungsrichtlinie, keine universelle Eigenschaft einer Anfrage, und eine Begrenzung an dieser Stelle weist Unterhaltungen mit einem endgültigen `413` zurück, bevor sie durch die Komprimierungspipeline verarbeitbar gemacht werden können. Das Heap-Wachstum wird durch `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` und die Abweisung bei Heap-Druck begrenzt. Legen Sie bei speicherbeschränkten Bereitstellungen, die eine feste Obergrenze benötigen, einen positiven Wert fest; Überschreitungen erhalten dann ein strukturiertes `413`, das eine Komprimierung anfordert. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Feste Obergrenze für eine nicht gestreamte Upstream-Antwort, die vollständig im Arbeitsspeicher gepuffert wird. Bei Überschreitung wird der Upstream-Reader abgebrochen und die Anfrage schlägt schnell fehl, statt einen unbegrenzt wachsenden String zu erzeugen, bis der Heap erschöpft ist. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maximale Anzahl an Wire-Bytes, die aus Upstream-Antwort-Headern weitergeleitet werden. Wenn das Budget überschritten wird, werden Header mit niedrigerer Priorität (z. B. benutzerdefinierte `x-codex-*`, `x-oai-request-id`) verworfen, um innerhalb üblicher Header-Grenzwerte von Reverse-Proxys zu bleiben. Legen Sie einen höheren Wert fest, um auf Kosten größerer Antwort-Header mehr Upstream-Metadaten weiterzuleiten. | -| `CORS_ORIGIN` | _(nicht gesetzt)_ | `src/server/cors/origins.ts` | Veraltete CORS-Zulassungsliste für einen einzelnen Ursprung. Verwenden Sie für neue Bereitstellungen vorzugsweise `CORS_ALLOWED_ORIGINS`. CORS ist nur für ursprungsübergreifende Browser-API-Clients vorgesehen; authentifizierte Schreibvorgänge im Dashboard verwenden stattdessen Anfragen vom selben Ursprung sowie sitzungsgebundenen CSRF-Schutz. | -| `CORS_ALLOWED_ORIGINS` | _(nicht gesetzt)_ | `src/server/cors/origins.ts` | Kommagetrennte CORS-Zulassungsliste. Es wird kein Platzhalter gesendet, sofern nicht ausdrücklich `CORS_ALLOW_ALL=true` konfiguriert ist. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Nur für die Entwicklung vorgesehene Ausweichoption, um jeden Browser-`Origin` zurückzugeben. Nicht in gemeinsam genutzten oder Produktionsbereitstellungen aktivieren. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Anbieteraufrufe blockieren, die auf private, Loopback- oder Link-Local-IP-Bereiche abzielen. Nur in isolierten Testumgebungen deaktivieren. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Anbieter-URLs zulassen, die auf private/lokale Netzwerke verweisen (localhost, 192.168.x.x, 10.x.x.x usw.). **ERFORDERLICH für selbst gehostete Anbieter** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Bei `false` lehnt das Dashboard die Validierung lokaler URLs ab. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Das Hinzufügen/Validieren von Anbietern unter lokalen/privaten Adressen (127.0.0.1, localhost, LAN, private Bereiche) zulassen — beschränkt auf den Validierungspfad für Anbieter. **Standardmäßig `true`** (lokal bevorzugt); auf `false` setzen, um eine strikte Blockierung ausschließlich zugunsten öffentlicher Adressen durchzusetzen. Cloud-Metadaten-Endpunkte (169.254.169.254, metadata.google.internal) bleiben unabhängig davon blockiert. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Den `/v1/audio/*`-Routen (Transkriptionen, Sprachausgabe, Übersetzungen) erlauben, einen außerhalb von localhost gehosteten, OpenAI-kompatiblen Anbieterknoten zu verwenden. Standardmäßig deaktiviert — das Routing von Audio an einen entfernten Host ändert die ausgehende Identität und muss eine ausdrückliche Entscheidung des Betreibers sein. Loopback-/private Knoten (localhost, 127.0.0.1, 172.16-31.x) sind immer zulässig und davon nicht betroffen. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Wenn OIDC aktiviert ist, die Passwortanmeldung deaktivieren, sodass sich Benutzer nur über OIDC Single Sign-On authentifizieren können. Der einfache Alias `OIDC_DISABLE_PASSWORD_LOGIN` wird ebenfalls akzeptiert; das Dashboard-Feature-Flag mit demselben Schlüssel hat Vorrang. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Einfacher Alias von `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +| Variable | Standardwert | Quelldatei | Beschreibung | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt, das zur Erzeugung eines Maschinenfingerabdrucks mit Hardwarekennungen kombiniert wird. Für jede Bereitstellung ändern, um eine Isolation zu gewährleisten. | +| `OMNIROUTE_CLI_SALT` | _(nicht gesetzt = zufälliges Salt pro Installation, gespeichert unter `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-Salt zur Ableitung des lokalen CLI-Authentifizierungstokens. Das Setzen dieses Werts rotiert alle CLI-Tokens auf dem Computer und hat immer Vorrang vor dem gespeicherten Salt. Siehe `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Setzt das `Secure`-Flag für Sitzungscookies. **Muss `true` sein**, wenn die Anwendung hinter HTTPS ausgeführt wird. | +| `REQUIRE_API_KEY` | `false` | API-Middleware | Wenn `true`, müssen alle `/v1/*`-Proxy-Anfragen einen gültigen API-Schlüssel enthalten. **Dieses Flag schützt `GET /v1/models` nicht**; dieser Endpunkt richtet sich stattdessen nach der Dashboard-Anmeldekonfiguration (`requireAuthForModels`) – daher bedeutet eine `401`-Antwort von `/v1/models` NICHT, dass Inferenz geschützt ist. Siehe `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ermöglicht die Anzeige vollständiger API-Schlüsselwerte in der Dashboard-Benutzeroberfläche. Über die Dashboard-Feature-Flags konfigurierbar; Sicherheitsrisiko bei gemeinsam genutzten Instanzen. | +| `NO_LOG_API_KEY_IDS` | _(leer)_ | `src/lib/compliance/index.ts` | Durch Kommas getrennte API-Schlüssel-IDs, für die keine Anfrageprotokollierung erfolgt (DSGVO-Konformität). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(nicht gesetzt = unbegrenzt)_ | `src/shared/utils/apiKeyPolicy.ts` | Ersatzmäßiges tägliches Anfragebudget für API-Schlüssel, deren Spalte `rate_limits` null ist. Nicht gesetzt oder leer: keine implizite Begrenzung (#2289, #11017). `0` bedeutet ebenfalls unbegrenzt. Eine positive Ganzzahl N aktiviert N/Tag, 5N/Woche und 20N/Monat. Fehlerhafte, nicht leere Werte greifen auf die bisherigen Zeitfenster von 1000/Tag, 5000/Woche und 20000/Monat zurück. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Maximal zulässige Größe des Anfragekörpers. Nutzdaten, die diesen Grenzwert überschreiten, werden abgelehnt. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Tatsächliche Anfragekörper ab diesem Schwellenwert belegen vor dem JSON-Parsing atomar die prozesslokale Zulassungslease für ressourcenintensive Anfragen (BYTE-Pfad, einschließlich `POST /v1/responses`). Es gilt dieselbe Ausnahmeregelung für ausreichend freie Kapazitäten aus [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) wie bei strukturintensiven Anfragen; weiterhin begrenzt durch `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), damit [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) nicht erneut auftritt. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Harte Obergrenze für Chat-Routen, die anhand der während der begrenzten Aufnahme gelesenen Bytes durchgesetzt wird, einschließlich Anfragen mit fehlendem, ungültigem oder falschem `Content-Length`; bei Überschreitung wird `413` zurückgegeben. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(nicht gesetzt — keine Begrenzung der Anfrageanzahl)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-Fan-out:** Diese veraltete Begrenzung der AnfrageANZAHL greift jetzt nur noch, wenn sie explizit gesetzt ist. Bleibt sie ungesetzt (Standardeinstellung), wird die Zulassung ressourcenintensiver Chat-Anfragen stattdessen durch `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` gesteuert — ein automatisch abgeleitetes BYTE-Budget, das anhand der tatsächlichen Speicherobergrenze des Prozesses in **einem Prozess** (einem V8-Heap) bemessen wird. Zwei sich überschneidende `/v1/responses`-Anfragen mit jeweils etwa 750.000 Token führen bei Heaps von etwa 12 GiB zu einem Abbruch (#7849) — eine Warnung zum **Speicherbudget**, keine harte produktseitige Obergrenze von 2. Ein gesunder Prozess (Heap unterhalb des Abweisungsverhältnisses) KANN über `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` mehr gleichzeitige lange `/v1/responses` zulassen. Mehrere Dutzend langlebige SSE-Clients (40–50) sind eine Frage von Heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, nicht „maximal 2“. Eine blinde Erhöhung, um „den Host auszunutzen“, führt #7849 wieder ein. Vervielfachen Sie **Heaps** mit **N unabhängigen `DATA_DIR`s** (#11024); verwenden Sie niemals `replicas>1` für eine einzelne SQLite-Datei. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automatisch abgeleitet)_ | `src/shared/middleware/admissionBudget.ts` | **#503-Fan-out:** Überschreibung für das automatisch abgeleitete Byte-Budget zur Aufnahme (25 % der strengeren V8-/cgroup-Speicherobergrenze, geteilt durch eine 8-fache vorübergehende Verstärkung). Abgeleitete und explizite Werte werden auf 8 MiB–2 GiB begrenzt. Ein Body, der größer als das effektive Budget ist, schlägt sofort mit `413 body_exceeds_budget` fehl; Konkurrenz zwischen einzeln verarbeitbaren Bodys bleibt mit `503` wiederholbar. 40–50 gleichzeitige langlebige SSE-Clients sind eine Frage dieses Budgets + Heap, keine harte Grenze von „maximal 2“. Prüfen Sie vor der Feinabstimmung `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` unter `/api/monitoring/health`. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Abweisungsverhältnis bei Heap-Druck (`heapUsed / heap_size_limit`) für die Zulassung ressourcenintensiver Anfragen nach BYTE und STRUCTURE (#10183, #10268, #10437). Eine gleichzeitige ressourcenintensive Anfrage oberhalb von `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` wird nur dann mit dem wiederholbaren `503` abgewiesen, wenn der Heap EBENFALLS dieses Verhältnis erreicht oder überschritten hat; bei einem gesunden Heap wird sie stattdessen über den Spielraum für einen gesunden Heap zugelassen. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (Standardwert `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Begrenzte zusätzliche Kapazität für den schnellen Pfad bei gesundem Heap (#10437), sowohl für STRUCTURE als auch für BYTE (`admitChatRequest`, einschließlich Bodys ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ohne diese Begrenzung würde jede Anfrage bei hoher Auslastung, aber gesundem Heap die Zulassungsprüfung ohne Obergrenze umgehen. Sobald so viele gleichzeitige Leases über den Pfad für einen gesunden Heap aktiv sind, wechseln weitere Anfragen bei hoher Auslastung auf DENSELBEN Pfad mit begrenzter Wartezeit bzw. Abweisung, der bei tatsächlichem Heap-Druck verwendet wird. `0` deaktiviert die Umgehung vollständig. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Nachrichtenanzahl, ab der eine Chat-Anfrage als ressourcenintensiv eingestuft wird, selbst wenn ihr Body unterhalb des Byte-Schwellenwerts liegt. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Anzahl der Tools, ab der eine Chat-Anfrage als ressourcenintensiv eingestuft wird, selbst wenn ihr Body unterhalb des Byte-Schwellenwerts liegt. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservative, auf der String-Größe basierende Token-Schätzung, ab der eine Anfrage als ressourcenintensiv eingestuft wird; dies ist ein Näherungswert für die Zulassungskosten, keine Tokenisierung für die Abrechnung durch den Anbieter. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (deaktiviert) | `src/shared/middleware/chatBodyAdmission.ts` | Optionale, ausdrücklich zu aktivierende Obergrenze für den Chatverlauf. Standardmäßig deaktiviert: Eine Nachrichtenanzahl ist eine Bereitstellungsrichtlinie und keine universelle Eigenschaft einer Anfrage; eine Begrenzung an dieser Stelle weist Unterhaltungen mit einem endgültigen `413` zurück, bevor die Komprimierungspipeline sie verarbeitbar machen kann. Das Heap-Wachstum wird durch `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` und die Abweisung bei Heap-Druck begrenzt. Legen Sie bei speicherbeschränkten Bereitstellungen, die eine harte Obergrenze benötigen, einen positiven Wert fest; bei Überschreitung wird dann ein strukturiertes `413` zurückgegeben, das eine Komprimierung verlangt. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Harte Obergrenze für eine nicht gestreamte Upstream-Antwort, die vollständig im Arbeitsspeicher gepuffert wird. Bei Überschreitung wird der Upstream-Reader abgebrochen, und die Anfrage schlägt frühzeitig fehl, statt einen unbegrenzten String wachsen zu lassen, bis der Heap erschöpft ist. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maximal weitergeleitetes Datenvolumen der Upstream-Antwort-Header in Bytes. Wird das Budget überschritten, werden Header mit niedrigerer Priorität (z. B. benutzerdefinierte `x-codex-*`, `x-oai-request-id`) verworfen, um die üblichen Header-Limits von Reverse-Proxys einzuhalten. Legen Sie einen höheren Wert fest, um mehr Upstream-Metadaten weiterzuleiten, was jedoch die Größe der Antwort-Header erhöht. | +| `CORS_ORIGIN` | _(nicht festgelegt)_ | `src/server/cors/origins.ts` | Veraltete CORS-Zulassungsliste für einen einzelnen Ursprung. Bevorzugen Sie für neue Bereitstellungen `CORS_ALLOWED_ORIGINS`. CORS ist nur für ursprungsübergreifende Browser-API-Clients vorgesehen; authentifizierte Schreibvorgänge im Dashboard verwenden stattdessen Anfragen desselben Ursprungs sowie sitzungsgebundenen CSRF-Schutz. | +| `CORS_ALLOWED_ORIGINS` | _(nicht festgelegt)_ | `src/server/cors/origins.ts` | Kommagetrennte CORS-Zulassungsliste. Es wird kein Platzhalter gesendet, sofern `CORS_ALLOW_ALL=true` nicht ausdrücklich konfiguriert ist. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Nur für die Entwicklung vorgesehene Ausweichoption, um jeden Browser-`Origin` zurückzugeben. Nicht in gemeinsam genutzten oder Produktionsbereitstellungen aktivieren. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Blockiert Anbieteraufrufe, die auf private, Loopback- oder Link-Local-IP-Bereiche abzielen. Nur in isolierten Testumgebungen deaktivieren. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Erlaubt Anbieter-URLs, die auf private/lokale Netzwerke verweisen (localhost, 192.168.x.x, 10.x.x.x usw.). **ERFORDERLICH für selbst gehostete Anbieter** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Bei `false` lehnt das Dashboard die Validierung lokaler URLs ab. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Erlaubt das Hinzufügen/Validieren von Anbietern unter lokalen/privaten Adressen (127.0.0.1, localhost, LAN, private Bereiche) — beschränkt auf den Validierungspfad für Anbieter. **Standardmäßig `true`** (Local-First); auf `false` setzen, um eine strikte Blockierung aller nicht öffentlichen Adressen durchzusetzen. Cloud-Metadaten-Endpunkte (169.254.169.254, metadata.google.internal) bleiben unabhängig davon blockiert. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Ermöglicht den `/v1/audio/*`-Routen (Transkriptionen, Sprachausgabe, Übersetzungen), einen außerhalb von localhost gehosteten OpenAI-kompatiblen Anbieterknoten zu verwenden. Standardmäßig deaktiviert — die Weiterleitung von Audio an einen entfernten Host ändert die Egress-Identität und muss ausdrücklich vom Betreiber festgelegt werden. Loopback-/private Knoten (localhost, 127.0.0.1, 172.16-31.x) sind immer zulässig und nicht betroffen. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Ermöglicht `POST /v1/rerank` (und dem Loopback-Reranking-Schritt der Memory-Engine), einen außerhalb von localhost gehosteten OpenAI-kompatiblen Anbieterknoten zu verwenden — etwa einen LAN-Rechner oder Tailscale-Peer, auf dem TEI, Infinity, vLLM usw. ausgeführt wird. Standardmäßig deaktiviert — die Weiterleitung an einen entfernten Host ändert die Egress-Identität und muss ausdrücklich vom Betreiber festgelegt werden. Loopback-Knoten (localhost, 127.0.0.1, 172.16-31.x) sind immer zulässig und nicht betroffen. Entfernte Knoten müssen außerdem die Richtlinie für ausgehende Anbieter-URLs erfüllen (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); Cloud-Metadaten-Hosts werden niemals angesteuert. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Wenn OIDC aktiviert ist, wird die Anmeldung mit Passwort deaktiviert, sodass sich Benutzer nur über OIDC Single Sign-On authentifizieren können. Der einfache Alias `OIDC_DISABLE_PASSWORD_LOGIN` wird ebenfalls akzeptiert; das Dashboard-Feature-Flag mit demselben Schlüssel hat Vorrang. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Einfacher Alias für `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### Checkliste zur Absicherung @@ -255,7 +255,7 @@ AUTH_COOKIE_SECURE=true # Erfordert HTTPS REQUIRE_API_KEY=true # Alle Proxy-Aufrufe authentifizieren ALLOW_API_KEY_REVEAL=false # Schlüssel niemals in der Benutzeroberfläche offenlegen CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # Begrenzung auf 5 MB +MAX_BODY_SIZE_BYTES=5242880 # Limit von 5 MB ``` --- @@ -301,61 +301,68 @@ OmniRoute bietet einen zweistufigen Schutz: eingabeseitige Prüfung auf Prompt-I --- -## 6. Tool- & Routing-Richtlinien - -| Variable | Standardwert | Quelldatei | Beschreibung | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Steuert den Zugriff des LLM auf Tools/Funktionsaufrufe. `allowlist` = nur aufgeführte Tools, `denylist` = alle außer den aufgeführten, `disabled` = keine Einschränkungen. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Pfad zur JSON-Datei mit Regeln zur Payload-Manipulation (upstream-spezifische Anpassungen pro Modell/Protokoll). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Intervall (ms) für das dynamische Neuladen der Payload-Regeldatei. Minimum: `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Opt-in: Leitet nicht präfixierte `claude-*`-Modell-IDs von Claude-Code-Clients über das OAuth-Konto von Claude Code weiter, anstatt ein Anbieterpräfix zu erfordern. Explizite Anbieterpräfixe haben weiterhin Vorrang. Kann auch über einen Schalter auf der Claude-Anbieterseite im Dashboard konfiguriert werden. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Obergrenze der Parallelität pro Modell für Round-Robin-Kombinationen (#9100). Der Semaphore für Round-Robin-Kombinationen war fest auf 3 gleichzeitige Anfragen pro Modell begrenzt, ohne Überschreibungsmöglichkeit, wodurch Datenverkehr mit höherer Parallelität hinter dieser Grenze serialisiert wurde. Wird auf `>= 1` validiert und auf `<= 32` begrenzt. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Gefährliches Opt-in, das OmniRoutes lokale Prüfung des Kontextfensters bzw. der maximalen Eingabe-Token für direkte Einzelmodellanfragen überspringt. Upstream-Anbieter setzen ihre tatsächlichen Limits weiterhin durch; die Prompt-Komprimierung und die eigene Obergrenze des Modells für Ausgabe-Token bleiben aktiv. Die effektive Prioritätsreihenfolge lautet: Überschreibung durch die Feature-Flags-Datenbank > Umgebungsvariable > Standardwert; ein Neustart ist nicht erforderlich. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(nicht gesetzt)_ | `open-sse/services/conversationTracker.ts` | Auf `1` setzen, um die Erfassung des Konversationsverlaufs zu stoppen. `resolveConversationId()` gibt ein nicht nachverfolgtes Ergebnis zurück, bevor SQLite gelesen oder der Nachrichtenverlauf analysiert wird; auch vom Client bereitgestellte Sitzungs-IDs werden berücksichtigt. Die Verarbeitung von Routing-Sitzungen bleibt unverändert, und vorhandene Datensätze werden nicht gelöscht. Für Bereitstellungen, die die Konversationsansicht des Dashboards nicht verwenden und verhindern möchten, dass die Turn-Tabelle weiter wächst. | +## 6. Tool- und Routing-Richtlinien + +| Variable | Standardwert | Quelldatei | Beschreibung | +| ----------------------------------------------------------- | -------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Steuert den Zugriff des LLM auf Tools/Funktionsaufrufe. `allowlist` = nur aufgeführte Tools, `denylist` = alle außer den aufgeführten, `disabled` = keine Einschränkungen. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Pfad zur JSON-Datei mit Regeln zur Payload-Manipulation (Upstream-Anpassungen je Modell/Protokoll). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Neuladeintervall (ms) für das dynamische Neuladen der Datei mit den Payload-Regeln. Minimum: `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Optional: Leitet nicht präfixierte `claude-*`-Modell-IDs von Claude-Code-Clients über das OAuth-Konto von Claude Code, statt ein Anbieterpräfix zu verlangen. Explizite Anbieterpräfixe haben weiterhin Vorrang. Kann außerdem über einen Schalter auf der Claude-Anbieterseite des Dashboards konfiguriert werden. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Parallelitätsgrenze pro Modell für Round-Robin-Kombinationen (#9100). Der Round-Robin-Kombinations-Semaphor war ohne Überschreibungsmöglichkeit fest auf 3 gleichzeitige Anfragen pro Modell begrenzt, wodurch Datenverkehr mit höherer Parallelität hinter dieser Grenze serialisiert wurde. Wird auf `>= 1` validiert und auf `<= 32` begrenzt. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Gefährliche optionale Einstellung, die OmniRoutes lokale Prüfung des Kontextfensters bzw. der maximalen Eingabe-Tokenzahl für direkte Einzelmodellanfragen überspringt. Upstream-Anbieter erzwingen weiterhin ihre tatsächlichen Grenzen; die Prompt-Komprimierung und die modellspezifische Begrenzung der Ausgabe-Token bleiben aktiv. Die effektive Priorität lautet: Überschreibung durch die Feature-Flags-Datenbank > Umgebungsvariable > Standardwert; ein Neustart ist nicht erforderlich. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(nicht gesetzt)_ | `open-sse/services/selfHostedEntry.ts` | Eingebettetes YAML-Dokument `providers:` (RIC-738, D4). Wenn es gesetzt ist (mit oder ohne `strategy:`-Block), wird `/v1/chat/completions` an den einheitlichen selbstgehosteten, OpenAI-kompatiblen Einstieg statt an die Cloud-Pipeline weitergeleitet. Nicht gesetzt (Standard): Die Route wird direkt an die bestehende Cloud-Pipeline durchgereicht. Siehe `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(nicht gesetzt)_ | `open-sse/services/selfHostedEntry.ts` | Pfad zu einer YAML-Datei, die dasselbe `providers:`-Dokument wie `OMNIROUTE_SELF_HOSTED_PROVIDERS` enthält, für Bereitstellungen, die eine Datei gegenüber einer eingebetteten Umgebungsvariable bevorzugen. Beide Varianten aktivieren den selbstgehosteten Einstieg. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(nicht gesetzt — offene Route)_ | `open-sse/services/selfHostedEntry.ts` | Optionaler gemeinsamer API-Schlüssel für den einheitlichen selbstgehosteten Einstieg (D5-Grundgerüst, für das Kontingentsystem pro Schlüssel reserviert). Wenn er gesetzt ist, müssen Anfragen `Authorization: Bearer ` enthalten. Nicht gesetzt: Die Route ist offen, entsprechend dem bestehenden Muster für selbstgehostete lokale Anbieter (Bereitstellung über Loopback bzw. in einem vertrauenswürdigen Netzwerk). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(nicht gesetzt)_ | `open-sse/services/routingStrategies.ts` | Eingebettetes YAML-Dokument `strategy:` für die deterministische Routing-Engine (M2/RIC-740, D3) — Blacklist/Whitelist, Cooldown-Schutzschalter, Kostenpriorität, latenzabhängige Auswahl, Fallback-Kette. Überschreibt pro Schlüssel einen eingebetteten `strategy:`-Block, der in `OMNIROUTE_SELF_HOSTED_PROVIDERS` verschachtelt ist. Siehe `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(nicht gesetzt)_ | `open-sse/services/routingStrategies.ts` | Pfad zu einer YAML-Datei, die dasselbe `strategy:`-Dokument wie `OMNIROUTE_SELF_HOSTED_STRATEGY` enthält, für Bereitstellungen, die eine Datei gegenüber einer eingebetteten Umgebungsvariable bevorzugen. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(nicht gesetzt)_ | `open-sse/services/conversationTracker.ts` | Auf `1` setzen, um die Erfassung des Konversationsverlaufs zu beenden. `resolveConversationId()` gibt ein nicht nachverfolgtes Ergebnis zurück, bevor SQLite gelesen oder der Nachrichtenverlauf analysiert wird; auch vom Client bereitgestellte Sitzungs-IDs sind davon abgedeckt. Die Verarbeitung von Routing-Sitzungen bleibt unverändert, und bestehende Datensätze werden nicht gelöscht. Für Bereitstellungen, die die Konversationsansicht des Dashboards nicht verwenden und verhindern möchten, dass die Turn-Tabelle weiter wächst. | --- ## 7. URLs & Cloud-Synchronisierung -| Variable | Standardwert | Quelldatei | Beschreibung | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Serverseitige URL, über die interne Synchronisierungsaufträge `/api/sync/cloud` aufrufen. Behalten Sie hierfür eine Loopback-/Container-URL bei, auch wenn die App öffentlich über einen Proxy bereitgestellt wird. | -| `CLOUD_URL` | _(leer)_ | `src/lib/cloudSync.ts` | URL des Cloud-Relay-Endpunkts (Premiumfunktion). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | HTTP-Zeitüberschreitung für Cloud-Synchronisierungsanfragen. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack-Buildkonfiguration | Buildzeitprofil (auf `minimal` setzen, um privilegierte Module physisch aus dem Bundle auszuschließen). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/-Standalone-Ausgabe_ | `scripts/build/colocate-standalone.mjs` | Buildzeitüberschreibung für das Standalone-Ausgabeverzeichnis, das vom Colocation-Schritt nach dem Build verwendet wird. Keine Laufzeiteinstellung. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(leer)_ | `src/lib/cloudSync.ts` | Gemeinsames Geheimnis zur Verifizierung der HMAC-SHA256-Signatur von Cloud-Sync-Antworten. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Auf `true` setzen, damit der Cloud-Sync-Endpunkt lokale Anmeldedaten überschreiben darf. Der Standardwert ist `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Auf `true` setzen, um eine unsignierte Cloud-Sync-Antwort abzulehnen, wenn kein lokales Geheimnis konfiguriert ist (#13679). Eine vorhandene Signatur wird immer verifiziert — und immer abgelehnt, wenn `OMNIROUTE_CLOUD_SYNC_SECRET` nicht gesetzt ist — unabhängig von diesem Flag. Ab v3.9 ist die Erzwingung standardmäßig aktiviert. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Auf `true` setzen, um ohne Benutzerbestätigung auf das einstufige „Alles importieren“-Verhalten von v3.8.5 zurückzugreifen. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, Synchronisierung | Öffentlich erreichbare URL für OAuth-`redirect_uri`, Dashboard-Links und generierte öffentliche URLs. Legen Sie hierfür die stabile öffentliche URL fest, wenn OAuth-Callbacks oder generierte Browserlinks einen kanonischen Reverse-Proxy-Host verwenden müssen. | -| `NEXT_PUBLIC_CLOUD_URL` | _(leer)_ | Clientseitig | Clientseitige Spiegelung von `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(nicht gesetzt)_ | `src/shared/services/cloudSyncScheduler.ts` | Veraltete Fallback-Option für `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(nicht gesetzt)_ | Resolver für öffentliche Ursprünge, Bild-URLs | Browserseitiger OmniRoute-Ursprung mit höchster Priorität, der zur Generierung öffentlicher URLs und zur Validierung von Browserursprüngen außerhalb des Dashboards verwendet wird. Legen Sie diesen Wert fest, wenn OpenWebUI oder ein anderes Relay OmniRoute über eine interne URL erreicht, der Browser des Benutzers generierte Medien jedoch von einem LAN-, Tunnel- oder öffentlichen Ursprung abrufen muss. Fügen Sie **nicht** `/v1` hinzu. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(nicht gesetzt)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absolute URL des Provider-Plugin-Manifests, die Sidecar-Clients mitgeteilt wird. Wenn sie nicht gesetzt ist, leitet OmniRoute `/api/v1/provider-plugin-manifest` aus dem Anfrageursprung oder HOST/PORT ab. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokoll, das beim Ableiten der URL des Provider-Plugin-Manifests aus HOST/PORT ohne Anfrageursprung verwendet wird. Hinter einem öffentlichen TLS-terminierenden Proxy auf `https` setzen, wenn keine explizite `OMNIROUTE_PROVIDER_MANIFEST_URL` festgelegt ist. | -| `OMNIROUTE_TRUST_PROXY` | _(nicht gesetzt)_ | `src/server/origin/publicOrigin.ts` | Optionaler Vertrauensmodus für weitergeleitete Header des öffentlichen Ursprungs. Nicht gesetzt = `Forwarded` / `X-Forwarded-*` bei Sicherheitsentscheidungen nicht vertrauen. `true` / `loopback` vertraut weitergeleitetem Host/Protokoll nur von einem mit Token gekennzeichneten Loopback-Proxy. `private` / `lan` vertraut zusätzlich Proxy-Peers im privaten LAN. Verwenden Sie in der Produktion vorzugsweise ein explizites `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(nicht gesetzt)_ | `open-sse/utils/kieTask.ts` | Öffentliche Callback-URL für asynchrone kie.ai-Aufträge. Überschreibung mit höchster Priorität vor `OMNIROUTE_KIE_CALLBACK_URL` und `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(nicht gesetzt)_ | `open-sse/utils/kieTask.ts` | Alternative Schreibweise von `KIE_CALLBACK_URL`. Wird als Fallback verwendet, wenn die primäre Variable nicht gesetzt ist. | -| `OMNIROUTE_PUBLIC_URL` | _(nicht gesetzt)_ | `open-sse/utils/kieTask.ts` | Öffentlicher Ursprung, der zum Erstellen asynchroner Callback-URLs verwendet wird. Fallback mit niedrigster Priorität für kie.ai-Callbacks; wird außerdem als generische öffentliche URL für andere Relays verwendet. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | CrofAI-Endpunkt zur Kontingentabfrage, der von der Nutzungsseite verwendet wird. Für Relays/Test-Fixtures überschreiben. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Offizieller, per API-Schlüssel authentifizierter OpenCode-Go-Nutzungsendpunkt, der von der Nutzungsseite verwendet wird. Für Relays/Test-Fixtures überschreiben. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Synthetisiert OpenCode-CLI-Identitätsheader (User-Agent, x-opencode-client/project, Anfrage-/Sitzungs-UUIDs) für opencode-go/zen-Upstream-Anfragen, wenn der Client diese nicht gesendet hat, damit Cloudflare sie beim VPS-Egress akzeptiert (#6210/#5997). Seit #10571 standardmäßig aktiviert; mit `false`/`0`/`no`/`off` deaktivieren. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Standardmäßiger User-Agent, der verwendet wird, wenn `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiviert und keine providerspezifische Überschreibung über `_USER_AGENT` festgelegt ist. Wird nur auf opencode-Executors angewendet. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Wert für den synthetisierten Header `x-opencode-client`, wenn `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiviert ist. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Wert für den synthetisierten Header `x-opencode-project`, wenn `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiviert ist. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL der Ollama-Cloud-Einstellungen, die zum Scraping des Kontingents verwendet wird. Für Relays/Test-Fixtures überschreiben. | -| `OLLAMA_USAGE_COOKIE` | _(nicht gesetzt)_ | `open-sse/services/usage.ts` | Ollama-Cloud-Cookie `__Secure-session`, der zum Scraping des Kontingents auf der Einstellungsseite verwendet wird. Vertraulich; bevorzugen Sie das verbindungsspezifische Dashboard-Feld, wenn mehrere Konten konfiguriert sind. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(nicht gesetzt)_ | `open-sse/services/usage.ts` | Alternative Umgebungsvariable für das Ollama-Cloud-Cookie `__Secure-session`. Vertraulich; bevorzugen Sie das verbindungsspezifische Dashboard-Feld, wenn mehrere Konten konfiguriert sind. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(nicht gesetzt)_ | `open-sse/services/usage.ts` | Alternative Umgebungsvariable für das Ollama-Cloud-Cookie `__Secure-session`, die vor den kürzeren Aliasen verwendet wird. Vertraulich; bevorzugen Sie das verbindungsspezifische Dashboard-Feld, wenn mehrere Konten konfiguriert sind. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpunkt für die Nutzungslimits von CodeWhisperer (AWS Kiro). Für Relays/Test-Fixtures überschreiben. | +| Variable | Standardwert | Quelldatei | Beschreibung | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Serverseitige URL, über die interne Synchronisierungsaufträge `/api/sync/cloud` aufrufen. Behalten Sie hierfür eine Loopback-/Container-URL bei, selbst wenn die App öffentlich über einen Proxy bereitgestellt wird. | +| `CLOUD_URL` | _(leer)_ | `src/lib/cloudSync.ts` | URL des Cloud-Relay-Endpunkts (Premiumfunktion). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | HTTP-Zeitüberschreitung für Cloud-Synchronisierungsanfragen. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack-Build-Konfiguration | Profil zur Build-Zeit (auf `minimal` setzen, um privilegierte Module physisch aus dem Bundle auszuschließen). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/-Standalone-Ausgabe_ | `scripts/build/colocate-standalone.mjs` | Überschreibung des Standalone-Ausgabeverzeichnisses zur Build-Zeit, das vom nachgelagerten Kolokalisierungsschritt verwendet wird. Keine Laufzeiteinstellung. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(leer)_ | `src/lib/cloudSync.ts` | Gemeinsames Geheimnis zur Überprüfung der HMAC-SHA256-Signatur von Cloud-Sync-Antworten. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Auf `true` setzen, damit der Cloud-Sync-Endpunkt lokale Anmeldedaten überschreiben darf. Der Standardwert ist `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Auf `true` setzen, um eine unsignierte Cloud-Sync-Antwort abzulehnen, wenn kein lokales Geheimnis konfiguriert ist (#13679). Eine vorhandene Signatur wird immer überprüft – und immer abgelehnt, wenn `OMNIROUTE_CLOUD_SYNC_SECRET` nicht gesetzt ist – unabhängig von diesem Flag. Ab v3.9 ist die Erzwingung standardmäßig aktiviert. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Auf `true` setzen, um ohne Benutzerbestätigung auf das einstufige Verhalten „Alles importieren“ aus v3.8.5 zurückzugreifen. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, Synchronisierung | Öffentlich zugängliche URL für OAuth-`redirect_uri`, Dashboard-Links und generierte öffentliche URLs. Legen Sie hierfür die stabile öffentliche URL fest, wenn OAuth-Callbacks oder generierte Browserlinks einen kanonischen Reverse-Proxy-Host verwenden müssen. | +| `NEXT_PUBLIC_CLOUD_URL` | _(leer)_ | Clientseitig | Clientseitige Entsprechung von `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(nicht gesetzt)_ | `src/shared/services/cloudSyncScheduler.ts` | Veraltete Ausweichoption für `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(nicht gesetzt)_ | Resolver für öffentliche Ursprünge, Bild-URLs | OmniRoute-Ursprung mit höchster Priorität für Browser, der zur Generierung öffentlicher URLs und zur Validierung von Browser-Ursprüngen außerhalb des Dashboards verwendet wird. Legen Sie diesen Wert fest, wenn OpenWebUI oder ein anderes Relay OmniRoute über eine interne URL erreicht, der Browser des Benutzers generierte Medien jedoch von einem LAN-, Tunnel- oder öffentlichen Ursprung abrufen muss. Schließen Sie `/v1` **nicht** ein. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(nicht gesetzt)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absolute URL des Anbieter-Plugin-Manifests, die Sidecar-Clients mitgeteilt wird. Wenn nicht gesetzt, leitet OmniRoute `/api/v1/provider-plugin-manifest` aus dem Ursprung der Anfrage oder aus HOST/PORT ab. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokoll, das verwendet wird, wenn die URL des Anbieter-Plugin-Manifests ohne Anfrageursprung aus HOST/PORT abgeleitet wird. Setzen Sie den Wert hinter einem öffentlichen Proxy mit TLS-Terminierung auf `https`, wenn keine explizite `OMNIROUTE_PROVIDER_MANIFEST_URL` festgelegt ist. | +| `OMNIROUTE_TRUST_PROXY` | _(nicht gesetzt)_ | `src/server/origin/publicOrigin.ts` | Optionaler Vertrauensmodus für weitergeleitete Header des öffentlichen Ursprungs. Nicht gesetzt = `Forwarded` / `X-Forwarded-*` bei Sicherheitsentscheidungen nicht vertrauen. `true` / `loopback` vertraut weitergeleitetem Host/Protokoll nur bei einem mit einem Token gekennzeichneten Loopback-Proxy. `private` / `lan` vertraut zusätzlich Proxy-Peers im privaten LAN. Bevorzugen Sie in der Produktion ein explizites `NEXT_PUBLIC_BASE_URL`. | +| `KIE_CALLBACK_URL` | _(nicht gesetzt)_ | `open-sse/utils/kieTask.ts` | Öffentliche Callback-URL für asynchrone kie.ai-Aufträge. Überschreibung mit höchster Priorität vor `OMNIROUTE_KIE_CALLBACK_URL` und `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(nicht gesetzt)_ | `open-sse/utils/kieTask.ts` | Alternative Schreibweise von `KIE_CALLBACK_URL`. Wird als Ausweichoption verwendet, wenn die primäre Variable nicht gesetzt ist. | +| `OMNIROUTE_PUBLIC_URL` | _(nicht gesetzt)_ | `open-sse/utils/kieTask.ts` | Öffentlicher Ursprung, der zum Erstellen asynchroner Callback-URLs verwendet wird. Ausweichoption mit niedrigster Priorität für kie.ai-Callbacks; wird außerdem als generische öffentliche URL für andere Relays verwendet. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpunkt zur Abfrage des CrofAI-Kontingents, der von der Nutzungsseite verwendet wird. Kann für Relays / Test-Fixtures überschrieben werden. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Offizieller, per API-Schlüssel authentifizierter OpenCode-Go-Nutzungsendpunkt, der von der Nutzungsseite verwendet wird. Kann für Relays / Test-Fixtures überschrieben werden. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Synthetisiert OpenCode-CLI-Identitätsheader (User-Agent, x-opencode-client/project, Anfrage-/Sitzungs-UUIDs) für opencode-go/zen-Upstream-Anfragen, die der Client nicht gesendet hat, damit Cloudflare sie bei VPS-Egress akzeptiert (#6210/#5997). Seit #10571 standardmäßig aktiviert; mit `false`/`0`/`no`/`off` deaktivierbar. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Standardmäßiger User-Agent, der verwendet wird, wenn `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiviert und keine anbieterspezifische Überschreibung durch `_USER_AGENT` festgelegt ist. Wird nur auf opencode-Executors angewendet. Bei einer schlüssellosen Anfrage, die vom Upstream beschränkt wird, wird ein konfigurierter Wert, der kein `opencode/= 1.17>` enthält, durch diesen Standardwert ersetzt, anstatt abgelehnt zu werden. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Wert für den synthetisierten Header `x-opencode-client`, wenn `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiviert ist. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Wert für den synthetisierten Header `x-opencode-project`, wenn `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktiviert ist. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(nicht gesetzt)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Auf `off` setzen, um die Anpassung des Bodys schlüsselloser OpenCode-Anfragen (Streaming-Flag und Werkzeugliste) zu deaktivieren. Header werden weiterhin angewendet. Wird pro Anfrage gelesen, sodass eine Änderung sofort wirksam wird. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(nicht gesetzt)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Durch Kommas getrennte Werkzeugnamen, die für eine schlüssellose OpenCode-Anfrage ohne Werkzeuge deklariert werden, wenn für dieses Modell noch keine beobachtet wurden. Ein leerer Wert führt zur Verwendung eines einzelnen Platzhalters, den das Modell laut Anweisung nicht aufrufen soll. Höchstens 32 Einträge, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; ungültige Einträge werden ignoriert. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL der Ollama-Cloud-Einstellungen zum Auslesen des Kontingents. Für Relays/Test-Fixtures überschreiben. | +| `OLLAMA_USAGE_COOKIE` | _(nicht gesetzt)_ | `open-sse/services/usage.ts` | Ollama-Cloud-Cookie `__Secure-session`, der zum Auslesen des Kontingents von der Einstellungsseite verwendet wird. Vertraulich; wenn mehrere Konten konfiguriert sind, sollte bevorzugt das verbindungsspezifische Dashboard-Feld verwendet werden. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(nicht gesetzt)_ | `open-sse/services/usage.ts` | Alternative Umgebungsvariable für das Ollama-Cloud-Cookie `__Secure-session`. Vertraulich; wenn mehrere Konten konfiguriert sind, sollte bevorzugt das verbindungsspezifische Dashboard-Feld verwendet werden. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(nicht gesetzt)_ | `open-sse/services/usage.ts` | Alternative Umgebungsvariable für das Ollama-Cloud-Cookie `__Secure-session`, die vor den kürzeren Aliasnamen verwendet wird. Vertraulich; wenn mehrere Konten konfiguriert sind, sollte bevorzugt das verbindungsspezifische Dashboard-Feld verwendet werden. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpunkt für Nutzungslimits von CodeWhisperer (AWS Kiro). Für Relays/Test-Fixtures überschreiben. | > [!IMPORTANT] -> Wenn die Bereitstellung hinter einem Reverse-Proxy (nginx, Caddy) erfolgt, setzen Sie `NEXT_PUBLIC_BASE_URL` auf Ihre stabile öffentliche URL (z. B. `https://omniroute.example.com`), wenn OAuth-Callbacks oder generierte öffentliche Links diesen Hostnamen verwenden müssen. Andernfalls können OAuth-Callbacks fehlschlagen, weil die redirect_uri nicht übereinstimmt, und generierte öffentliche Links können auf den internen Container-Ursprung verweisen. +> Legen Sie bei einer Bereitstellung hinter einem Reverse-Proxy (nginx, Caddy) `NEXT_PUBLIC_BASE_URL` auf Ihre stabile öffentliche URL fest (z. B. `https://omniroute.example.com`), wenn OAuth-Callbacks oder generierte öffentliche Links diesen Hostnamen verwenden müssen. Andernfalls können OAuth-Callbacks fehlschlagen, weil `redirect_uri` nicht übereinstimmt, und generierte öffentliche Links können auf den internen Container-Ursprung verweisen. > -> Behalten Sie `BASE_URL` als interne Loopback-/Container-URL für Server-zu-Server-Aufgaben bei. Verwenden Sie für interne Selbstabrufe mit Anmeldedaten weder einen Browser-`Origin` noch einen öffentlichen Hostnamen. +> Behalten Sie `BASE_URL` als interne Loopback-/Container-URL für Server-zu-Server-Aufgaben bei. Verwenden Sie für interne Self-Fetches mit Anmeldedaten weder einen Browser-`Origin` noch einen öffentlichen Hostnamen. > -> Authentifizierte Schreibvorgänge im Dashboard erfordern keine statische öffentliche Basis-URL: Das Dashboard sendet unsichere Same-Origin-Anfragen mit einem sitzungsgebundenen CSRF-Token. OmniRoute zentralisiert weiterhin die Validierung öffentlicher Ursprünge für Browserintegrationen außerhalb des Dashboards: Explizite Umgebungsvariablen für öffentliche URLs werden zuerst als vertrauenswürdig eingestuft; unverarbeitete `Forwarded`- bzw. `X-Forwarded-*`-Header werden ignoriert, sofern `OMNIROUTE_TRUST_PROXY` nicht aktiviert und der unmittelbar vorgeschaltete Proxy nicht durch ein Token als vertrauenswürdig gekennzeichnet ist. Verwenden Sie keine CORS-Einstellungen, um Same-Origin-Anfragen des Dashboards zu korrigieren; CORS ist ausschließlich für ursprungsübergreifende Browserclients vorgesehen. +> Authentifizierte Schreibvorgänge im Dashboard erfordern keine statische öffentliche Basis-URL: Das Dashboard sendet unsichere Same-Origin-Anfragen mit einem sitzungsgebundenen CSRF-Token. OmniRoute zentralisiert weiterhin die Validierung öffentlicher Ursprünge für Browser-Integrationen außerhalb des Dashboards: Explizite Umgebungsvariablen für öffentliche URLs werden zuerst als vertrauenswürdig behandelt; unverarbeitete Header vom Typ `Forwarded` / `X-Forwarded-*` werden ignoriert, sofern `OMNIROUTE_TRUST_PROXY` nicht aktiviert ist und der unmittelbar vorgeschaltete Proxy nicht durch ein Token als vertrauenswürdig gekennzeichnet wurde. Verwenden Sie keine CORS-Einstellungen, um Same-Origin-Anfragen des Dashboards zu korrigieren; CORS ist ausschließlich für Cross-Origin-Browserclients vorgesehen. --- @@ -588,49 +595,50 @@ beschriebene Sidecar-Erkennung). --- -## 11. Anmeldedaten für OAuth-Anbieter - -Integrierte Anmeldedaten für die **localhost-Entwicklung**. Registrieren Sie für Remote-Bereitstellungen Ihre eigenen Anmeldedaten in der Entwicklerkonsole des jeweiligen Anbieters. - -| Variable | Anbieter | Hinweise | -| --------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Öffentlicher Client — kein Secret erforderlich. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Überschreibt die Redirect-URI. Standard: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Öffentlicher Client. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Erfordert das zugehörige `_SECRET`. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Öffentlicher Client. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Erfordert das zugehörige `_SECRET`. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Öffentlicher Client. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Optionale Überschreibung der OAuth-Client-ID von GitHub Enterprise Copilot. Falls nicht gesetzt, wird der öffentliche Standardwert von `GITHUB_OAUTH_CLIENT_ID` verwendet. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API-Key-Fallback, der von `open-sse/executors/devin-cli.ts` verwendet wird, wenn keine verbindungsspezifischen Zugangsdaten verfügbar sind. Optional. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Benutzerdefinierter Pfad zur Devin-CLI-Binärdatei (`devin`). Wird von `open-sse/executors/devin-cli.ts` aufgelöst. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | OAuth-Client-ID für GitLab Duo. Registrieren Sie unter `https://gitlab.com/-/profile/applications` eine App mit der Redirect-URI `/callback` und den Scopes `api, read_user, openid, profile, email`. Fällt auf `GITLAB_OAUTH_CLIENT_ID` zurück. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth-Client-Secret für GitLab Duo. Optional — der PKCE-Flow erfordert kein Secret. Fällt auf `GITLAB_OAUTH_CLIENT_SECRET` zurück. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Überschreibt die GitLab-Basis-URL (selbst gehostetes GitLab). Standardwert: `https://gitlab.com`. Fällt auf `GITLAB_BASE_URL` zurück. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Legacy-Fallback für `GITLAB_DUO_BASE_URL`. Wird verwendet, wenn die `_DUO_`-Variante nicht gesetzt ist. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Legacy-Fallback für `GITLAB_DUO_OAUTH_CLIENT_ID`, der von `src/lib/oauth/constants/oauth.ts` verwendet wird. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Legacy-Fallback für `GITLAB_DUO_OAUTH_CLIENT_SECRET`, der von `src/lib/oauth/constants/oauth.ts` verwendet wird. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Festlegen, um Qoder OAuth zu aktivieren. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Direkter API-Key-Fallback (umgeht OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | Workspace-ID für die Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias für `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Überschreibt das Konfigurationsverzeichnis der Qoder CLI (isolierte PAT-Sitzung, verhindert das Überschreiben einer Browser-Anmeldung). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend-`tk`-Token, der als `validated` an `/api/chat` gesendet wird. Erforderlich, wenn Blackbox die Token-Übereinstimmung erzwingt; andernfalls fällt OmniRoute auf eine zufällige UUID zurück. Siehe Issue #2252. | -| `VISION_BRIDGE_BASE_URL` | Vision-Bridge-Guardrail | OpenAI-kompatible Basis-URL für Nicht-Anthropic-Vision-Bridge-Aufrufe. Standardmäßig wird die Legacy-OpenAI-URL-Umgebungsvariable oder api.openai.com verwendet. Verweisen Sie auf OmniRoutes `/v1`-Selbstschleife oder einen beliebigen OpenAI-kompatiblen Endpunkt (Gemini OpenAI-compat, OpenRouter). Issue #2232. Wenn die URL OmniRoutes eigenes `/v1` ist, sendet die Beschreibungs-Unteranfrage `x-omniroute-admission-bypass: internal` und authentifiziert sich mit den aufgelösten Zugangsdaten der Selbstschleife (`sk_omniroute`-Sentinel im lokalen Modus oder `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), damit Bereitstellungen mit `REQUIRE_API_KEY=true` funktionieren. | -| `VISION_BRIDGE_API_KEY` | Vision-Bridge-Guardrail | API-Key für die obige URL. Überschreibt anbieterspezifische OpenAI-/Google-Umgebungsvariablen für Nicht-Anthropic-Vision-Bridge-Aufrufe. Anthropic-Modelle behalten ihren dedizierten Anthropic-Key-Pfad. Issue #2232. | +## 11. OAuth-Anbieter-Anmeldedaten + +Integrierte Anmeldedaten für die **Entwicklung auf localhost**. Registrieren Sie für Remote-Bereitstellungen bei jedem Anbieter in der jeweiligen Entwicklerkonsole eigene Anmeldedaten. + +| Variable | Anbieter | Hinweise | +| --------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Öffentlicher Client — kein Geheimnis erforderlich. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Überschreibt die Weiterleitungs-URI. Standard: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Öffentlicher Client. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Erfordert ein passendes `_SECRET`. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Öffentlicher Client. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Erfordert ein passendes `_SECRET`. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Öffentlicher Client. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Optionale Überschreibung der OAuth-Client-ID von GitHub Enterprise Copilot. Falls nicht festgelegt, wird standardmäßig der öffentliche Wert von `GITHUB_OAUTH_CLIENT_ID` verwendet. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Optionale Überschreibung der GitHub-Copilot-Client-Integrations-ID, die in den Headern `Copilot-Integration-Id` und `Editor-Plugin-Version` gesendet wird. Standardmäßig `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API-Schlüssel als Ausweichwert, der von `open-sse/executors/devin-cli.ts` verwendet wird, wenn keine verbindungsspezifischen Anmeldedaten verfügbar sind. Optional. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Benutzerdefinierter Pfad zur Devin-CLI-Binärdatei (`devin`). Wird von `open-sse/executors/devin-cli.ts` aufgelöst. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | OAuth-Client-ID für GitLab Duo. Registrieren Sie unter `https://gitlab.com/-/profile/applications` eine App mit der Weiterleitungs-URI `/callback` und den Geltungsbereichen `api, read_user, openid, profile, email`. Verwendet ersatzweise `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth-Client-Geheimnis für GitLab Duo. Optional — der PKCE-Ablauf erfordert kein Geheimnis. Verwendet ersatzweise `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Überschreibt die GitLab-Basis-URL (selbst gehostetes GitLab). Standardmäßig `https://gitlab.com`. Verwendet ersatzweise `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Veralteter Ausweichwert für `GITLAB_DUO_BASE_URL`. Wird verwendet, wenn die `_DUO_`-Variante nicht festgelegt ist. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Legacy-Fallback für `GITLAB_DUO_OAUTH_CLIENT_ID`, verwendet von `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Legacy-Fallback für `GITLAB_DUO_OAUTH_CLIENT_SECRET`, verwendet von `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Festlegen, um Qoder OAuth zu aktivieren. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Direkter API-Key als Fallback (umgeht OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | Workspace-ID für Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias für `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Überschreibt das Konfigurationsverzeichnis von Qoder CLI (isolierte PAT-Sitzung, verhindert das Überschreiben einer Browser-Anmeldung). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend-Token `tk`, der als `validated` an `/api/chat` gesendet wird. Erforderlich, wenn Blackbox den Token-Abgleich erzwingt; andernfalls verwendet OmniRoute als Fallback eine zufällige UUID. Siehe Issue #2252. | +| `VISION_BRIDGE_BASE_URL` | Vision-Bridge-Guardrail | OpenAI-kompatible Basis-URL für Vision-Bridge-Aufrufe außerhalb von Anthropic. Standardmäßig wird die URL aus der bisherigen OpenAI-Umgebungsvariable oder api.openai.com verwendet. Auf den `/v1`-Self-Loop von OmniRoute oder einen beliebigen OpenAI-kompatiblen Endpunkt (Gemini OpenAI-Compat, OpenRouter) festlegen. Issue #2232. Wenn die URL auf OmniRoutes eigenen `/v1`-Endpunkt verweist, sendet die Beschreibungs-Unteranfrage `x-omniroute-admission-bypass: internal` und authentifiziert sich mit den aufgelösten Self-Loop-Anmeldedaten (`sk_omniroute`-Sentinel im lokalen Modus oder `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), damit Bereitstellungen mit `REQUIRE_API_KEY=true` funktionieren. | +| `VISION_BRIDGE_API_KEY` | Vision-Bridge-Guardrail | API-Key für die obige URL. Überschreibt anbieterspezifische OpenAI-/Google-Umgebungsvariablen für Vision-Bridge-Aufrufe außerhalb von Anthropic. Anthropic-Modelle verwenden weiterhin ihren dedizierten Anthropic-Schlüsselpfad. Issue #2232. | > [!WARNING] > -> 1. Öffnen Sie [Google Cloud Console → Anmeldedaten](https://console.cloud.google.com/apis/credentials) -> 2. Erstellen Sie eine OAuth-2.0-Client-ID (Typ: „Webanwendung“) -> 3. Fügen Sie Ihre Server-URL als autorisierten Weiterleitungs-URI hinzu -> 4. Ersetzen Sie die Anmeldedaten in `.env`. +> 1. Rufen Sie [Google Cloud Console → Anmeldedaten](https://console.cloud.google.com/apis/credentials) auf. +> 2. Erstellen Sie eine OAuth-2.0-Client-ID (Typ: „Webanwendung“). +> 3. Fügen Sie Ihre Server-URL als autorisierten Weiterleitungs-URI hinzu. +> 4. Ersetzen Sie die Werte der Anmeldedaten in `.env`. --- @@ -739,7 +747,7 @@ Alle Werte sind in **Millisekunden** angegeben. Zentrale Auflösung in `src/shar ``` REQUEST_TIMEOUT_MS (globale Überschreibung) -├─→ FETCH_TIMEOUT_MS (Aufrufe vorgelagerter Anbieter, Standardwert: 600000) +├─→ FETCH_TIMEOUT_MS (Aufrufe von Upstream-Anbietern, Standardwert: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (übernimmt den Wert von FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (übernimmt den Wert von FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (übernimmt den Wert von FETCH_TIMEOUT_MS) @@ -758,105 +766,106 @@ REQUEST_TIMEOUT_MS (globale Überschreibung) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (Standardwert: 0 = deaktiviert) ``` -| Variable | Standardwert | Beschreibung | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(nicht gesetzt)_ | Globale Kurzform — überschreibt die Standardwerte von `FETCH_TIMEOUT_MS` und `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Gesamtzeitlimit für HTTP-Anfragen bei Aufrufen von Upstream-Anbietern. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maximale Inaktivitätsdauer zwischen unbearbeiteten Upstream-Bytes, bevor abgebrochen wird. Modelle mit erweitertem Reasoning pausieren selten länger als 90 s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Maximale Gesamtlaufzeit eines aktiven SSE-Streams; wird durch Upstream-Bytes niemals zurückgesetzt und ist unabhängig von `REQUEST_TIMEOUT_MS`. Abgeleitet vom größten modellspezifischen `timeoutMs` in der Registry (1200000, Codex) zuzüglich eines Puffers von 60000, sodass ein Modell, das sein vollständiges Zeitbudget nutzen darf, niemals mitten in der Antwort beendet wird. Zum Deaktivieren auf `0` setzen. | -| `OMNIROUTE_SSE_COMMENTS` | _(deaktiviert)_ | Legt fest, ob OmniRoute SSE-Kommentarzeilen mit `:` ausgeben darf (z. B. den `: keepalive`-Heartbeat und `x-omniroute-*`-Metadaten-Trailer). Standardmäßig deaktiviert (#10524), da strikt OpenAI-kompatible Clients jede SSE-Zeile mit JSON.parse verarbeiten und bei `:`-Kommentaren abstürzen; `data:`-Heartbeats sind davon nicht betroffen. Auf `on`/`true`/`1`/`yes` setzen, um sie wieder zu aktivieren. Verwendet von `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Zeitspanne bis zum Empfang des ersten SSE-Ereignisses, das kein Ping ist. Übernimmt `REQUEST_TIMEOUT_MS`, wenn diese Variable gesetzt ist. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maximales adaptives Bereitschaftszeitfenster bis zum ersten Ereignis für große, werkzeugintensive oder Streaming-Anfragen mit hohem Reasoning-Anteil. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Notausschalter für die `/goal`-Heuristik. Auf `false`/`0`/`off` setzen, um die Erkennung vollständig zu deaktivieren — Bereitschaftszeitlimits und Stream-Wiederherstellung werden dann niemals anhand des Anfragekörpers oder der Header erhöht, wodurch eine clientgesteuerte Verstärkung von Zeitlimits verhindert wird. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maximales Bereitschaftszeitfenster bis zum ersten Ereignis für erkannte `/goal`-Agentenausführungen oder mit `x-omniroute-agent-goal` erzwungene Anfragen. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aktiviert die frühzeitige Stream-Wiederherstellung automatisch für erkannte `/goal`-Agentenausführungen. Auf `false`/`0`/`off` setzen, um die zielspezifische Aktivierung zu deaktivieren. Dadurch kann die Wiederherstellung zusätzlich zur Standardeinstellung des Betreibers nur HINZUGEFÜGT werden — eine explizite Deaktivierung über `STREAM_RECOVERY_ENABLED` oder die Datenbankeinstellungen wird niemals überschrieben. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Entfernt nicht standardisierte `codex.*`-SSE-Ereignisse (z. B. `codex.rate_limits`), durch die `responses.stream()` des OpenAI SDK mit einem 502-Fehler abbricht. Standardmäßig AKTIVIERT (#11014). Auf `0`/`false`/`no`/`off` setzen, um sie weiterzuleiten. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(nicht gesetzt)_ | Optionaler Codex-App-Server-Transport. WebSocket-Endpunkt (`ws://`/`wss://`) eines lokalen `codex app-server`-Sidecars. Wenn diese Variable zusammen mit einem Token gesetzt ist, werden Codex-Anfragen statt über die HTTP Responses API mittels JSON-RPC an das Sidecar weitergeleitet. Kann außerdem pro Verbindung über `providerSpecificData.codexAppServerUrl` festgelegt werden. Verwendet von `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(nicht gesetzt)_ | Inline übergebenes Capability-/Bearer-Token für den App-Server. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(nicht gesetzt)_ | Pfad zu einer Datei, die das Capability-Token des App-Servers enthält (aus `codex app-server --ws-token-file`). Wird verwendet, wenn `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` nicht gesetzt ist. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Arbeitsverzeichnis, in dem der App-Server-Durchlauf ausgeführt wird. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(nicht gesetzt)_ | Genehmigungsrichtlinie, die an den App-Server-Durchlauf übergeben wird (z. B. `never`, `on-request`). Überschreibung pro Verbindung: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(nicht gesetzt)_ | Sandbox-Richtlinie, die an den App-Server-Durchlauf übergeben wird (z. B. `read-only`, `workspace-write`, `danger-full-access`). Wenn nicht gesetzt, verwendet der Executor standardmäßig `workspace-write` (abgesichert; zuvor `danger-full-access`). Überschreibung pro Verbindung: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Genehmigt die eigenen Genehmigungsaufforderungen des App-Servers automatisch (Ausführung von Befehlen/Dateien/Berechtigungen auf dem Host). Standardmäßig deaktiviert — Aufforderungen werden automatisch abgelehnt; Harness-Tool-Aufrufe sind nicht betroffen (sie werden über die separate `item/tool/call`-Durchleitung übertragen). Akzeptiert `true`/`1`/`yes`. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Zeitspanne bis zum Empfang der Antwort-Header. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Maximale Wartezeit bis zum Beginn der Antwort (ms) für jeden direkten Versuch ohne Proxy. Bei einer Zeitüberschreitung erfolgt ein erneuter Versuch über einen neuen Socket; auf `0` setzen, um die Begrenzung zu deaktivieren und das bisherige Verhalten beizubehalten. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Zeit zum Empfangen des vollständigen Antworttexts. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Zeitüberschreitung für den Aufbau der TCP-Verbindung. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Leerlaufzeitüberschreitung für Keep-Alive-Sockets. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Zeitüberschreitung für den TLS-Fingerprint-Proxy (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Begrenzt speziell die Zeit bis zum ersten Byte des Antworttexts beim wreq-js-TLS-Fingerprint-Transport; `TLS_CLIENT_TIMEOUT_MS` allein kann einen festgefahrenen Antworttext nicht erkennen, da die Auflösung bereits beim Eintreffen der Header erfolgt (#12656). Bei einer Zeitüberschreitung wird der wreq-Reader abgebrochen und auf den direkten/Proxy-Dispatcher zurückgegriffen; `0` deaktiviert den Watchdog. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Nur für den OpenCode-Executor und nur, wenn das Feature-Flag `OPENCODE_RESPONSES_STALL_ROTATION` aktiviert ist (standardmäßig deaktiviert): Begrenzt die Wartezeit auf das erste Byte des Antworttexts einer gestreamten Responses-Antwort nach deren Headern (#13484). Ein Responses-Stream beginnt mit `response.created`; daher gilt das Ausbleiben weiterer Daten über dieses Zeitfenster hinaus als Stillstand: Das Konto wird vorübergehend gesperrt und die Anfrage einmalig zum nächsten Konto weitergeleitet; ein zweiter Stillstand führt sofort zu einem Fehler. `0` deaktiviert die Schutzfunktion selbst bei aktiviertem Flag. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Zeitüberschreitung für den Proxy-Hop bei `/v1`-Bridge-Anfragen. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Richtet den Firecrawl-Web-Fetch-Executor auf eine selbst gehostete Instanz aus (außerhalb der Cloud ist der API-Schlüssel optional). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Zeitüberschreitung pro Anfrage für den Firecrawl-Web-Fetch-Executor. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Gesamtzeitüberschreitung für Serveranfragen an die Bridge. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Zeit zum Senden der Antwort-Header über die Bridge. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Keep-Alive-Leerlaufzeitüberschreitung der Bridge. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Zeitüberschreitung für den Raw-Socket (0 = deaktiviert). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Karenzzeit nach SIGTERM/SIGINT vor dem erzwungenen Beenden. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Fallback, der von `src/shared/utils/fetchTimeout.ts` verwendet wird, wenn `FETCH_TIMEOUT_MS` nicht gesetzt ist. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Zeitüberschreitung (ms) für die Voreinstellungen `validationRead` und `modelsProbe` in `src/shared/network/safeOutboundFetch.ts`. Für langsame Endpunkte (Cerebras, Cloudflare AI, Groq) erhöhen, um ein ständiges Wechseln zwischen „aktiv“ und „Fehler“ im Dashboard zu verhindern. Bei ungültigen (<1000) oder nicht numerischen Werten wird auf 8000 ms zurückgegriffen. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Relay-spezifische Fetch-Zeitüberschreitung in `open-sse/utils/proxyFetch.ts` (#9158). Ein hängendes Relay muss vor der Zeitüberschreitung des Clients/Agents (~30s) fehlschlagen, damit Aufrufer einen Relay-spezifischen Fehler statt einer allgemeinen Upstream-Zeitüberschreitung erhalten. Auf `29000` begrenzt, damit sie immer zuerst ausgelöst wird. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Gemeinsame Wiederholungsverzögerung für die Pfade mit einmaligem Wiederholungsversuch über Direktverbindung/Relay/Proxy in `open-sse/utils/proxyFetch.ts` (#9158). `0` = sofort erneut versuchen. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Native Zeitüberschreitung für wreq-js-Anfragen (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absolute JS-Karenzzeit für die harte Frist, die zur nativen Zeitüberschreitung addiert wird. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Native Zeitüberschreitung für wreq-js-Anfragen (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absolute JS-Karenzzeit für die harte Frist, die zur nativen Zeitüberschreitung addiert wird. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (aus) | Hängt „You have built-in web search. Answer questions directly using search results.“ an die Systemnachricht des Aufrufers an (`perplexity-web/protocol.ts`). Standardmäßig deaktiviert — Perplexity führt ohnehin Suchen durch, und der Satz erscheint bei Coding-Clients als Meta-Kommentar in den Antworten. Auf `1`/`true`/`yes`/`on` setzen, um dies wiederherzustellen. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Zeitüberschreitung für native wreq-js-Anfragen (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Zusätzliche Kulanzzeit für die absolute harte JS-Frist, die zur nativen Zeitüberschreitung addiert wird. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Zeitüberschreitung für native wreq-js-Anfragen (`notionTlsClient.ts`); `notion-web` erhöht sie bei langen Generierungen pro Anfrage auf `180000`. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Zusätzliche Kulanzzeit für die absolute harte JS-Frist, die zur nativen Zeitüberschreitung addiert wird. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Gemeinsam genutzter Playwright-Browser-Pool für Web-Cookie-Chats mit Browser-Unterstützung (`browserPool.ts`); zum Deaktivieren auf `off` setzen. | -| `OBSCURA_BIN` | `auto-detect` | Pfad zur Binärdatei `obscura`, die vom Browser-Pool und vom Cloudflare-Playground-Executor als primäre Engine verwendet wird (`open-sse/services/obscura.ts`); wird bei nicht gesetztem Wert automatisch über den System-PATH erkannt. | -| `OBSCURA_CDP_ENDPOINT` | _(nicht gesetzt)_ | Verwendet eine bereits laufende Obscura-Instanz (`http://host:port`), anstatt eine neue zu starten; das Modul verwaltet diesen Prozess nicht (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | Expliziter Port für den gestarteten `obscura serve`; bei nicht gesetztem Wert wird automatisch ein freier Port ausgewählt (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Leitet eine Web-Cookie-Chat-Anfrage über den browsergestützten Pfad (`browserBackedChat.ts`); zum Aktivieren auf `1` setzen. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Basis-URL für den Kimi-Web-Executor (internationales kimi.ai Connect-RPC) (`kimi-web.ts`); nur für Spiegel-/Proxy-Endpunkte überschreiben. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Vollständiger Chat-Endpunkt für den Kimi-Web-Executor (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(automatisch erkannt)_ | Pfad zu einer Chrome-/Edge-Programmdatei des Systems für die interaktive Browser-Anmeldung bei Adobe Firefly (`adobeFireflyBrowserLogin.ts`); überschreibt die betriebssystemspezifische automatische Erkennung. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/-Standalone-Ausgabe_ | Buildzeit-Überschreibung für das Standalone-Ausgabeverzeichnis, das vom Post-Build-Kolokationsschritt verwendet wird (`scripts/build/colocate-standalone.mjs`); betrifft die Build-Werkzeuge, nicht die Laufzeit. | - -Versuche für Combo-Ziele übernehmen die aufgelöste Zeitüberschreitung der Upstream-Anfrage (`FETCH_TIMEOUT_MS` oder -`REQUEST_TIMEOUT_MS`, wenn diese den Fetch-Standardwert bereitstellt). Legen Sie `targetTimeoutMs` in einer Combo, -in Combo-Standardwerten oder in einer Provider-Überschreibung nur fest, um den Combo-Fallback zu beschleunigen; Werte oberhalb der -aktuellen Upstream-Zeitüberschreitung werden auf die Upstream-Zeitüberschreitung begrenzt. +| Variable | Standardwert | Beschreibung | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUEST_TIMEOUT_MS` | _(nicht gesetzt)_ | Globale Kurzform — überschreibt die Standardwerte von `FETCH_TIMEOUT_MS` und `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Gesamtzeitüberschreitung für HTTP-Anfragen bei Aufrufen von Upstream-Anbietern. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maximale Pause zwischen rohen Upstream-Bytes, bevor abgebrochen wird. Modelle mit erweitertem Denken pausieren selten länger als 90 Sekunden. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Maximale aktive Gesamtlaufzeit eines SSE-Streams; wird durch Upstream-Bytes nie zurückgesetzt und ist unabhängig von `REQUEST_TIMEOUT_MS`. Abgeleitet vom größten modellspezifischen `timeoutMs` in der Registry (1200000, Codex) zuzüglich eines Puffers von 60000, sodass ein Modell, das sein vollständiges Zeitbudget ausschöpfen darf, nie mitten in der Antwort beendet wird. Zum Deaktivieren auf `0` setzen. | +| `OMNIROUTE_SSE_COMMENTS` | _(deaktiviert)_ | Legt fest, ob OmniRoute SSE-Kommentarzeilen mit `:` ausgeben darf (z. B. den `: keepalive`-Heartbeat und `x-omniroute-*`-Metadaten-Trailer). Standardmäßig deaktiviert (#10524), da strikt OpenAI-kompatible Clients jede SSE-Zeile mit JSON.parse verarbeiten und bei `:`-Kommentaren abstürzen; `data:`-Heartbeats sind davon nicht betroffen. Auf `on`/`true`/`1`/`yes` setzen, um sie wieder zu aktivieren. Verwendet von `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Zeitspanne bis zum Empfang des ersten SSE-Ereignisses, das kein Ping ist. Übernimmt `REQUEST_TIMEOUT_MS`, wenn gesetzt. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maximales adaptives Bereitschaftszeitfenster bis zum ersten Ereignis für große Streaming-Anfragen, Anfragen mit intensiver Tool-Nutzung oder hohem Reasoning-Anteil. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Notausschalter für die `/goal`-Heuristik. Auf `false`/`0`/`off` setzen, um die Erkennung vollständig zu deaktivieren — Bereitschaftszeitüberschreitungen und Stream-Wiederherstellung werden niemals aufgrund des Anfragekörpers oder der Header erhöht, wodurch eine clientgesteuerte Verstärkung der Zeitüberschreitung verhindert wird. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maximales Bereitschaftszeitfenster bis zum ersten Ereignis für erkannte `/goal`-Agentenausführungen oder mit `x-omniroute-agent-goal` erzwungene Anfragen. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aktiviert die frühzeitige Stream-Wiederherstellung automatisch für erkannte `/goal`-Agentenausführungen. Auf `false`/`0`/`off` setzen, um die zielspezifische Aktivierung zu deaktivieren. Dies kann die Wiederherstellung nur zusätzlich zur Standardeinstellung des Betreibers AKTIVIEREN — eine explizite Deaktivierung über `STREAM_RECOVERY_ENABLED` oder Datenbankeinstellungen wird niemals überschrieben. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Entfernt nicht standardmäßige `codex.*`-SSE-Ereignisse (z. B. `codex.rate_limits`), die `responses.stream()` des OpenAI SDK mit einem 502-Fehler unterbrechen. Standardmäßig AKTIVIERT (#11014). Auf `0`/`false`/`no`/`off` setzen, um sie weiterzuleiten. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(nicht gesetzt)_ | Optionale Codex-App-Server-Übertragung. WebSocket-Endpunkt (`ws://`/`wss://`) eines lokalen `codex app-server`-Sidecars. Wenn zusammen mit einem Token gesetzt, werden Codex-Anfragen über JSON-RPC an das Sidecar geleitet, anstatt die HTTP Responses API zu verwenden. Kann außerdem pro Verbindung über `providerSpecificData.codexAppServerUrl` festgelegt werden. Verwendet von `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(nicht gesetzt)_ | Inline bereitgestelltes Capability-/Bearer-Token, das dem App-Server vorgelegt wird. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(nicht gesetzt)_ | Pfad zu einer Datei, die das Capability-Token des App-Servers enthält (aus `codex app-server --ws-token-file`). Wird verwendet, wenn `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` nicht gesetzt ist. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Arbeitsverzeichnis, in dem der App-Server-Durchlauf ausgeführt wird. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(nicht gesetzt)_ | Genehmigungsrichtlinie, die an den App-Server-Durchlauf übergeben wird (z. B. `never`, `on-request`). Überschreibung pro Verbindung: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(nicht gesetzt)_ | Sandbox-Richtlinie, die an den App-Server-Durchlauf übergeben wird (z. B. `read-only`, `workspace-write`, `danger-full-access`). Wenn nicht gesetzt, verwendet der Executor standardmäßig `workspace-write` (gehärtet; zuvor `danger-full-access`). Überschreibung pro Verbindung: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Genehmigt die eigenen Genehmigungsaufforderungen des App-Servers automatisch (Befehls-/Datei-/Berechtigungsausführung auf dem Host). Standardmäßig deaktiviert — Aufforderungen werden automatisch abgelehnt; Harness-Tool-Aufrufe sind davon nicht betroffen (sie werden über den separaten `item/tool/call`-Passthrough übertragen). Akzeptiert `true`/`1`/`yes`. Überschreibung pro Verbindung: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Zeitspanne bis zum Empfang der Antwort-Header. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Maximale Wartezeit auf den Antwortbeginn (ms) für jeden direkten Versuch ohne Proxy. Bei einem Timeout wird der Versuch einmal über einen neuen Socket wiederholt; setzen Sie den Wert auf `0`, um die Begrenzung zu deaktivieren und das bisherige Verhalten beizubehalten. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Obergrenze (ms) für den RETRY-Versuch über einen neuen Socket nach einem oben beschriebenen Timeout beim Antwortbeginn eines Versuchs mit einem Socket aus dem Pool (#13703). Gilt nur, wenn der Aufrufer bereits ein eigenes Deadline-Signal angefügt hat (die Kaskade aus aufgelöster Verbindung/Modell/Anbieter/`FETCH_TIMEOUT_MS`); dieses Signal ist die tatsächliche Begrenzung und wird im vorgesehenen Ablauf zuerst ausgelöst, sodass dies eher eine großzügige Rückfallebene als eine pauschale Obergrenze ist — ohne sie verwendete der Wiederholungsversuch dasselbe kurze `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`-Zeitfenster wie der Pool-Versuch erneut, wodurch fehlerfreie Reasoning-Modelle mit langsamer TTFB einen 504-Fehler zurückgaben. Darf niemals unter dem oben angegebenen pauschalen Mindestwert liegen; wenn der Aufrufer überhaupt kein Deadline-Signal bereitstellt, behält der Wiederholungsversuch den pauschalen Mindestwert unverändert bei. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Zeit zum Empfangen des vollständigen Antworttexts. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Timeout für den Aufbau der TCP-Verbindung. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Leerlauf-Timeout für Keep-alive-Sockets. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Timeout für den TLS-Fingerprint-Proxy (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Begrenzt speziell die Zeit bis zum ersten Byte des Antworttexts beim wreq-js-TLS-Fingerprint-Transport; `TLS_CLIENT_TIMEOUT_MS` allein kann einen blockierten Antworttext nicht erkennen, da es bereits beim Eintreffen der Header aufgelöst wird (#12656). Bei einem Timeout wird der wreq-Reader abgebrochen und auf den direkten/Proxy-Dispatcher zurückgegriffen; `0` deaktiviert den Watchdog. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Nur für den OpenCode-Executor und nur, wenn das Feature-Flag `OPENCODE_RESPONSES_STALL_ROTATION` aktiviert ist (standardmäßig deaktiviert): Begrenzt die Wartezeit auf das erste Byte des Antworttexts einer gestreamten Responses-Antwort nach dem Eintreffen ihrer Header (#13484). Ein Responses-Stream beginnt mit `response.created`; bleibt er über dieses Zeitfenster hinaus stumm, gilt dies als Blockierung: Das Konto wird vorübergehend gesperrt und die Anfrage einmal an das nächste Konto weitergeleitet; bei einer zweiten Blockierung schlägt die Anfrage sofort fehl. `0` deaktiviert den Schutzmechanismus selbst bei aktiviertem Flag. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Timeout für den Proxy-Hop bei `/v1`-Bridge-Anfragen. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Richtet den Firecrawl-Web-Fetch-Executor auf eine selbst gehostete Instanz aus (außerhalb der Cloud ist der API-Schlüssel optional). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Timeout pro Anfrage für den Firecrawl-Web-Fetch-Executor. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Gesamt-Timeout für Serveranfragen an die Bridge. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Zeit zum Senden der Antwort-Header über die Bridge. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Keep-alive-Leerlauf-Timeout der Bridge. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Timeout für den Raw-Socket (0 = deaktiviert). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Karenzzeit bei SIGTERM/SIGINT vor dem erzwungenen Beenden. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Rückfallwert, der von `src/shared/utils/fetchTimeout.ts` verwendet wird, wenn `FETCH_TIMEOUT_MS` nicht gesetzt ist. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Timeout (ms) für die Voreinstellungen `validationRead` und `modelsProbe` in `src/shared/network/safeOutboundFetch.ts`. Für langsame Endpunkte (Cerebras, Cloudflare AI, Groq) erhöhen, um ein ständiges Wechseln zwischen aktiv/Fehler im Dashboard zu verhindern. Fällt bei ungültigen (<1000) oder nicht numerischen Werten auf 8000 ms zurück. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Relay-spezifischer Fetch-Timeout in `open-sse/utils/proxyFetch.ts` (#9158). Ein hängendes Relay muss vor dem Client-/Agent-Timeout (~30 s) fehlschlagen, damit Aufrufer einen Relay-spezifischen Fehler anstelle eines generischen Upstream-Timeouts erhalten. Auf `29000` begrenzt, damit es immer zuerst ausgelöst wird. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Gemeinsamer Retry-Backoff für die Pfade „einmalige Wiederholung bei Fehler“ für direkte Verbindungen, Relays und Proxys in `open-sse/utils/proxyFetch.ts` (#9158). `0` = sofort wiederholen. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Natives wreq-js-Anfrage-Timeout (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Zusätzliche Karenzzeit für die absolute harte JS-Deadline, die auf das native Timeout aufgeschlagen wird. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Natives wreq-js-Anfrage-Timeout (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Zusätzliche Karenzzeit für die absolute harte JS-Deadline, die auf das native Timeout aufgeschlagen wird. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (aus) | Hängt „You have built-in web search. Answer questions directly using search results.“ an die Systemnachricht des Aufrufers an (`perplexity-web/protocol.ts`). Standardmäßig deaktiviert — Perplexity sucht ohnehin, und der Satz erscheint bei Coding-Clients als Metakommentar in den Antworten. Auf `1`/`true`/`yes`/`on` setzen, um dies wiederherzustellen. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Natives wreq-js-Anfrage-Timeout (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Zusätzliche Karenzzeit für die absolute harte JS-Deadline, die auf das native Timeout aufgeschlagen wird. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Natives wreq-js-Anfrage-Timeout (`notionTlsClient.ts`); `notion-web` erhöht es für lange Generierungen pro Anfrage auf `180000`. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Zusätzliche Karenzzeit für die absolute harte JS-Deadline, die auf das native Timeout aufgeschlagen wird. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Gemeinsam genutzter Playwright-Browser-Pool für Web-Cookie-Chats mit Browser-Unterstützung (`browserPool.ts`); zum Deaktivieren auf `off` setzen. | +| `OBSCURA_BIN` | `auto-detect` | Pfad zur Binärdatei `obscura`, die vom Browser-Pool und vom Cloudflare-Playground-Executor als primäre Engine verwendet wird (`open-sse/services/obscura.ts`); wird bei fehlender Angabe automatisch über den System-PATH erkannt. | +| `OBSCURA_CDP_ENDPOINT` | _(nicht gesetzt)_ | Auf eine bereits laufende Obscura-Instanz (`http://host:port`) verweisen, anstatt eine zu starten; das Modul ist nicht für diesen Prozess verantwortlich (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `zufälliger freier Port` | Expliziter Port für den gestarteten Befehl `obscura serve`; bei fehlender Angabe wird automatisch ein freier Port ausgewählt (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Eine Web-Cookie-Chat-Anfrage für den browsergestützten Pfad aktivieren (`browserBackedChat.ts`); zum Aktivieren `1` verwenden. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Basis-URL für den Kimi-Web-Executor (internationales kimi.ai Connect-RPC) (`kimi-web.ts`); nur für Mirror-/Proxy-Endpunkte überschreiben. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Vollständiger Chat-Endpunkt für den Kimi-Web-Executor (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(automatisch erkannt)_ | Pfad zu einer ausführbaren Chrome-/Edge-Systemdatei für die interaktive Browser-Anmeldung bei Adobe Firefly (`adobeFireflyBrowserLogin.ts`); überschreibt die betriebssystemspezifische automatische Erkennung. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/-Standalone-Ausgabe_ | Buildzeit-Überschreibung für das Standalone-Ausgabeverzeichnis, das vom Kolokationsschritt nach dem Build verwendet wird (`scripts/build/colocate-standalone.mjs`); betrifft die Build-Werkzeuge, nicht die Laufzeit. | + +Versuche für Combo-Ziele übernehmen das ermittelte Timeout der vorgelagerten Anfrage (`FETCH_TIMEOUT_MS` oder +`REQUEST_TIMEOUT_MS`, wenn es den Fetch-Standardwert bereitstellt). Legen Sie `targetTimeoutMs` in einer Combo, +in den Combo-Standardwerten oder in einer Provider-Überschreibung nur dann fest, wenn der Combo-Fallback schneller +erfolgen soll; Werte oberhalb des aktuellen vorgelagerten Timeouts werden auf dieses Timeout begrenzt. `comboTimeoutMs` ist ein separates Gesamtzeitbudget für die gesamte Combo über alle Failover-Ziele hinweg. -Lassen Sie den Wert nicht gesetzt oder setzen Sie ihn auf `0`, um eine unbegrenzte Iteration beizubehalten (der 10-minütige -Hang-Stopp `COMBO_LOOP_SAFETY_TIMEOUT_MS` gilt weiterhin). Ein positiver Wert ersetzt dieses -Sicherheitsnetz für die Combo. Legen Sie `comboTimeoutMs` länger als `targetTimeoutMs` fest, damit nach einem langsamen ersten Ziel -weiterhin Zeit für das Failover bleibt. +Lassen Sie es nicht gesetzt oder auf `0`, um die Iteration unbegrenzt fortzusetzen (der 10-minütige +Abbruchschutz `COMBO_LOOP_SAFETY_TIMEOUT_MS` gegen Hängenbleiben gilt weiterhin). Ein positiver Wert ersetzt +diesen Schutzmechanismus für die Combo. Legen Sie `comboTimeoutMs` auf einen längeren Wert als `targetTimeoutMs` +fest, damit nach einem langsamen ersten Ziel noch Zeit für das Failover bleibt. -### Schwellenwerte des Circuit Breakers +### Schwellenwerte des Leistungsschalters -Abstimmung des Circuit Breakers auf Provider-Ebene. Die Standardwerte entsprechen den seit v3.6 verwendeten skalierten Werten für mehr als 500 Verbindungen. +Konfiguration des Leistungsschalters auf Provider-Ebene. Die Standardwerte entsprechen den seit v3.6 für mehr als 500 Verbindungen verwendeten skalierten Werten. | Variable | Standardwert | Quelldatei | Beschreibung | | ------------------------------------------------------------- | ------------ | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Schwellenwert aufeinanderfolgender Fehler für OAuth-Anbieter, bevor der Circuit Breaker auslöst. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Schwellenwert aufeinanderfolgender Fehler bei OAuth-Anbietern, bevor der Circuit Breaker ausgelöst wird. | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Rücksetzzeitfenster (ms) für den Circuit Breaker von OAuth-Anbietern. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Schwellenwert aufeinanderfolgender Fehler für API-Key-Anbieter. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Schwellenwert aufeinanderfolgender Fehler bei API-Key-Anbietern. | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Rücksetzzeitfenster (ms) für den Circuit Breaker von API-Key-Anbietern. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Schwellenwert aufeinanderfolgender Fehler für lokale Anbieter (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Schwellenwert aufeinanderfolgender Fehler bei lokalen Anbietern (Ollama, LM Studio, ...). | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Rücksetzzeitfenster (ms) für den Circuit Breaker lokaler Anbieter. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: Fehler innerhalb des Zeitfensters, bevor der gesamte OAuth-Anbieter in die Abkühlphase wechselt. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: rollierendes Zeitfenster für die Fehlerzählung (ms) bei OAuth-Anbietern. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: gleitendes Zeitfenster für die Fehlerzählung (ms) bei OAuth-Anbietern. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: Abkühlphase (ms), sobald der Schwellenwert des OAuth-Anbieters erreicht ist. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Der OAuth-Anbieter wechselt bei dieser Fehleranzahl in den Zustand DEGRADED. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Der OAuth-Anbieter wechselt bei dieser Anzahl von Fehlern in den Zustand DEGRADED. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Maximaler Multiplikator für die Eskalation von resetTimeout bei OAuth-Anbietern. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Der OAuth-Anbieter eskaliert nach dieser Anzahl offener Zyklen. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: Fehler innerhalb des Zeitfensters, bevor der gesamte API-Key-Anbieter in die Abkühlphase wechselt. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: rollierendes Zeitfenster für die Fehlerzählung (ms) bei API-Key-Anbietern. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: gleitendes Zeitfenster für die Fehlerzählung (ms) bei API-Key-Anbietern. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: Abkühlphase (ms), sobald der Schwellenwert des API-Key-Anbieters erreicht ist. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Der API-Key-Anbieter wechselt bei dieser Fehleranzahl in den Zustand DEGRADED. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Der API-Key-Anbieter wechselt bei dieser Anzahl von Fehlern in den Zustand DEGRADED. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Maximaler Multiplikator für die Eskalation von resetTimeout bei API-Key-Anbietern. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Der API-Key-Anbieter eskaliert nach dieser Anzahl offener Zyklen. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: Fehler, bevor der gesamte lokale Anbieter in die Abkühlphase wechselt. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: rollierendes Zeitfenster für die Fehlerzählung (ms) bei lokalen Anbietern. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: gleitendes Zeitfenster für die Fehlerzählung (ms) bei lokalen Anbietern. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Circuit Breaker auf Anbieterebene: Abkühlphase (ms), sobald der Schwellenwert des lokalen Anbieters erreicht ist. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Backoff-Tiefe, ab der der Anbieter eines Kontext-Cache-Pins als dauerhaft fehlerhaft gilt und der Pin für das Failover verworfen wird. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Anti-Flapping-Zeitfenster (ms), in dem kurze vorübergehende Abkühlphasen toleriert werden, bevor ein Kontext-Cache-Pin verworfen wird. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Backoff-Stufe, ab der der Anbieter eines Kontext-Cache-Pins als dauerhaft fehlerhaft gilt und der Pin für das Failover verworfen wird. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Anti-Flapping-Zeitfenster (ms), das kurze vorübergehende Abkühlphasen toleriert, bevor ein Kontext-Cache-Pin verworfen wird. | ### Szenarien @@ -865,7 +874,7 @@ Abstimmung des Circuit Breakers auf Provider-Ebene. Die Standardwerte entspreche | **Lang andauernde Codegenerierung** | `REQUEST_TIMEOUT_MS=900000` (15 Min.) | | **Gesamtlaufzeit des Streams begrenzen** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 Min.) | | **Schnelles Fehlschlagen für Produktions-API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Modelle mit erweitertem Denken** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 Min. zwischen Chunks) | +| **Modelle mit erweitertem Denkprozess** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 Min. zwischen Chunks) | --- @@ -1114,97 +1123,98 @@ Desktopinstallation optimiert. ## 21. Proxy-Zustand -| Variable | Standardwert | Quelldatei | Beschreibung | -| ------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Zeitlimit für Fast-Fail-Zustandsprüfungen. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Zeitfenster (in Stunden) zur Berechnung der durchschnittlichen Latenz von Proxy-Kandidaten bei der latenzoptimierten Pool-Strategie. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Cache-TTL für Ergebnisse von Zustandsprüfungen. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Cache-TTL für fehlgeschlagene Proxy-Zustandsprüfungen. Dieser Wert sollte kürzer als `PROXY_HEALTH_CACHE_TTL_MS` sein, damit vorübergehende Proxy-Zeitüberschreitungen bei hoher Nebenläufigkeit schnell erneut geprüft werden, ohne Fast-Fail für tatsächlich ausgefallene Proxys zu deaktivieren. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Auf `false` setzen, um den im Hintergrund ausgeführten Proxy-Zustandsplaner zu deaktivieren, der registrierte Proxys regelmäßig prüft. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Durchlaufintervall des Hintergrund-Zustandsplaners in ms (mindestens `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ziel für Erreichbarkeitsprüfungen, das vom Planer und vom Endpunkt `/api/settings/proxies/auto-test` verwendet wird. Auf eine interne/selbst gehostete URL verweisen, um die öffentliche Standardeinstellung zu vermeiden. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Anzahl der Prüfungen, die pro Batch gleichzeitig gestartet werden; wird vom Planer und vom Endpunkt `/api/settings/proxies/auto-test` gemeinsam verwendet. Der Mindestwert ist 1, der Höchstwert 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Verzögerung in ms zwischen zwei Prüfungsstarts innerhalb eines Batches. Ohne sie wird der gesamte Batch gleichzeitig gesendet, und eine gemeinsam genutzte ausgehende IP-Adresse kann bei einem Ziel mit Ratenbegrenzung ein Limit auslösen. Auf `0` setzen, um den zeitlichen Abstand zu deaktivieren; der Höchstwert beträgt 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Auf `false` setzen, damit nicht mehr der tatsächliche Host des einem Proxy zugewiesenen Anbieters geprüft wird (`GET /models`, kein API-Schlüssel), sondern stattdessen immer `PROXY_HEALTH_TEST_URL` verwendet wird. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Bei `false` (Standard) sind automatisierte Erreichbarkeitsprüfungen (der Planer und die Schaltfläche „Alle testen“ von `/api/settings/proxies/auto-test`) **schreibgeschützt** und ändern niemals den Status eines Proxys – nur der Betreiber legt aktiv/inaktiv fest, sodass eine unzuverlässige Prüfung einen zugewiesenen Proxy nicht unbrauchbar machen kann (#6246). Auf `true` setzen, um das frühere Prüf-und-Setz-Verhalten wiederherzustellen. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in-Feature-Flag (siehe [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); eine DB-Überschreibung im Dashboard hat Vorrang). `true` (oder `1`, `yes`) zeigt im Dashboard unter einem Proxy-Pool die schreibgeschützte Beobachtung des Pool-Ausgangs an (unterschiedliche ausgehende IP-Adressen, Verbindungen und die größte Anzahl, die während der letzten 24 Stunden hinter einer einzelnen IP-Adresse beobachtet wurde, basierend auf dem Proxy-Protokoll). Wird niemals für das Routing verwendet. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Auf `true` setzen, damit der Planer Proxys nach wiederholten aufeinanderfolgenden Fehlschlägen automatisch entfernt. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Anzahl aufeinanderfolgender Fehlschläge, nach denen der Planer einen Proxy automatisch entfernt (wenn `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Auf `true` setzen, damit der Planer einen Proxy nach wiederholten aufeinanderfolgenden Fehlschlägen sanft deaktiviert (Status `dead`, niemals gelöscht), anstatt ihn zu entfernen. Nicht destruktive Alternative zu `PROXY_AUTO_REMOVE`: Der Proxy scheidet sofort aus der Pool-/Rotationsauflösung aus (der von der Scope-Pool-Auflösung verwendete Filter für aktive Statuswerte schließt ihn bereits aus) und wird automatisch reaktiviert, sobald seine Prüfungen wieder erfolgreich sind. Verwendet denselben Schwellenwert `PROXY_AUTO_REMOVE_AFTER`. Wenn beide Flags `true` sind, hat `PROXY_AUTO_REMOVE` Vorrang. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ermöglicht OAuth- und Anbieter-Validierungsabläufen, einen fest zugewiesenen Proxy zu umgehen und eine direkte Verbindung herzustellen, wenn Vorabprüfungen der Proxy-Erreichbarkeit fehlschlagen. Die wirksame Priorität lautet: DB-Überschreibung der Feature-Flags > Umgebungsvariable > Standardwert. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `open-sse/services/rateLimitManager.ts` | Maximale Wartezeit bei einer 429-Antwort, bevor die Anfrage fehlschlägt. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Obergrenze dafür, wie lange eine zugelassene Anfrage in Ausführung bleiben darf, bevor ihre Ratenbegrenzungsreservierung abläuft – unabhängig vom Wartezeitbudget der Warteschlange, damit ein langsamer Abrufstart bei nicht inkrementellen Gateways nicht zu einer Zeitüberschreitung führt (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deaktiviert) | `open-sse/services/rateLimitManager.ts` | Obergrenze für die Aufnahme in die Warteschlange: Mit einer 429-Antwort vom Typ `queue_full` ablehnen, sobald bereits so viele Anfragen in der Warteschlange stehen. `0` = unbegrenzt (Standard). | -| `RATE_LIMIT_AUTO_ENABLE` | _(nicht gesetzt)_ | `open-sse/services/rateLimitManager.ts` | Erzwingt das Ein- oder Ausschalten des Sicherheitsnetzes zur automatischen Aktivierung der Ratenbegrenzung, unabhängig von der gespeicherten Dashboard-Einstellung. Akzeptiert `true`/`1`/`on`, um es einzuschalten, und `false`/`0`/`off`, um es auszuschalten. | -| `PROVIDER_COOLDOWN_ENABLED` | _(nicht gesetzt → aus)_ | `open-sse/services/providerCooldownTracker.ts` | Optionale globale, anfragenübergreifende Nachverfolgung der Abklingzeit von Anbietern/Verbindungen. Standardmäßig AUS (überschneidet sich mit Verbindungs-Abklingzeit/Anbieter-Leistungsschalter). Zum Aktivieren werden `true`/`1`/`on` akzeptiert. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimale Abklingzeit (ms), bevor ein fehlgeschlagener Anbieter bzw. eine fehlgeschlagene Verbindung erneut versucht wird. Wird bei aufeinanderfolgenden Fehlschlägen exponentiell skaliert. Wird nur verwendet, wenn `PROVIDER_COOLDOWN_ENABLED` aktiviert ist. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Maximale Abklingzeit (ms), nach der ein fehlgeschlagener Anbieter bzw. eine fehlgeschlagene Verbindung in jedem Fall erneut versucht wird. Wird nur verwendet, wenn `PROVIDER_COOLDOWN_ENABLED` aktiviert ist. | -| `STREAM_RECOVERY_ENABLED` | _(nicht gesetzt → aus)_ | `src/lib/resilience/settings.ts` (Initialwert) → `open-sse/services/streamRecovery.ts` (Logik) | **Was:** transparente Wiederherstellung abgeschnittener Upstream-Streams (Portierung von free-claude-code). Hält das anfängliche SSE-Fenster bis zu `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) zurück, sodass ein Abbruch _vor dem Commit_ – also bevor ein Byte den Client erreicht – unsichtbar neu geöffnet und erneut versucht wird. **Wann aktivieren:** bei unzuverlässigen Upstreams, die Streams zu Beginn häufig bei 0 Byte abschneiden; AUS lassen, wenn Sie sich bei jedem Stream keine zusätzliche Zeit von bis zu 750 ms bis zum ersten Token leisten können. Akzeptiert `true`/`1`/`on`. Legt den Initialwert für die gespeicherte Resilienz-Einstellung fest; sobald die Dashboard-Einstellung festgelegt wurde, hat sie Vorrang. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(nicht gesetzt → aus)_ | `src/lib/resilience/settings.ts` (Initialwert) → `open-sse/services/streamRecovery.ts` (Logik) | **Was:** Fortsetzung mitten im Stream (Phase 4.4) – nach einem Abbruch _nach dem Commit_ (Bytes haben den Client bereits erreicht) wird eine neue Anfrage mit dem Teiltext als Assistant-Prefill gestellt und das fehlende Suffix angefügt. Nur für OpenAI-kompatible Klartext-Streams; wird niemals ausgelöst, solange ein Tool-Aufruf läuft. **Wann aktivieren:** bei langen Generierungen, die mitten in der Antwort abgeschnitten werden, sofern Sie akzeptieren, dass der wiederhergestellte Rest in einem Schub statt Token für Token eintrifft. Unabhängig von `STREAM_RECOVERY_ENABLED` (anderes Risikoprofil). Akzeptiert `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(nicht gesetzt → aus)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Optionaler Wächter für die Nutzdatenausgabe aktiver Streams. Erkennt Streams, die weiterhin Chunks senden, aber unter der konfigurierten Ausgaberate des Assistenten bleiben; Heartbeats, Nutzungsereignisse, leere Deltas sowie Tool-/Reasoning-Phasen werden nicht fälschlich als Fortschritt gewertet. Unabhängig von Leerlauf- und festen Deadline-Zeitüberschreitungen. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Schonfrist vor der Durchsatzbewertung, begrenzt auf 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Gleitendes Zeitfenster für Nutzdaten, begrenzt auf 1000–600000 ms; vor einem Abbruch muss ein vollständiges Fenster vorliegen. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimale Rate der Assistentenausgabe in UTF-8-Bytes (konservative Token-Näherung), begrenzt auf 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Kleinste von null verschiedene Nutzdatenausgabe, die als messbar gilt, begrenzt auf 1–1000000 Bytes. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Staffelungsintervall (ms) zwischen Zustandsprüfungen von Anbieter-Tokens beim Start. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimale zufällige Abweichung (ms), die zusätzlich zu `HEALTHCHECK_STAGGER_MS` zwischen Zustandsprüfungen von Anbieter-Tokens angewendet wird, um Lastspitzen zu vermeiden (Issue #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maximale zufällige Abweichung (ms), die zusätzlich zu `HEALTHCHECK_STAGGER_MS` zwischen Zustandsprüfungen von Anbieter-Tokens angewendet wird, um Lastspitzen zu vermeiden (Issue #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Batch-Größe für parallele Prüfungen beim Durchlauf der Token-Zustandsprüfungen während des Starts; größere Werte prüfen mehr Verbindungen parallel, kleinere Werte reduzieren Lastspitzen (Issue #7875, Regression von #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Anzahl automatischer Wiederholungsversuche bei modellbezogenen Abklingzeit-Antworten, bevor ein Fehler an den Client zurückgegeben wird. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maximales Backoff-Intervall (Sekunden) zwischen Wiederholungsversuchen nach Abklingzeiten. Unabhängig vom Upstream-Wert `Retry-After` auf diesen Wert begrenzt. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL des Headroom-Proxys zur Token-Einsparung. Der Dashboard-Lebenszyklus (`api/headroom/*`) startet standardmäßig eine lokale `headroom-ai`-CLI auf der Loopback-Schnittstelle; nur überschreiben, um auf einen externen Docker-Sidecar-Proxy zu verweisen. | +| Variable | Standardwert | Quelldatei | Beschreibung | +| ------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Zeitüberschreitung für Fast-Fail-Zustandsprüfungen. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Zeitfenster (in Stunden) zur Berechnung der durchschnittlichen Latenz von Proxy-Kandidaten bei der latenzoptimierten Pool-Strategie. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Cache-TTL für Ergebnisse von Zustandsprüfungen. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Cache-TTL für fehlgeschlagene Proxy-Zustandsprüfungen. Dieser Wert sollte kürzer als `PROXY_HEALTH_CACHE_TTL_MS` sein, damit vorübergehende Proxy-Zeitüberschreitungen bei hoher Parallelität schnell erneut geprüft werden, ohne Fast-Fail für tatsächlich ausgefallene Proxys zu deaktivieren. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Auf `false` setzen, um den im Hintergrund ausgeführten Proxy-Zustandsplaner zu deaktivieren, der registrierte Proxys regelmäßig prüft. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Prüfintervall des im Hintergrund ausgeführten Zustandsplaners in ms (mindestens `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ziel für Erreichbarkeitsprüfungen, das vom Scheduler und vom Endpunkt `/api/settings/proxies/auto-test` verwendet wird. Legen Sie eine interne/selbst gehostete URL fest, um die öffentliche Standardeinstellung zu vermeiden. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Anzahl der gleichzeitig pro Batch gestarteten Prüfungen, gemeinsam verwendet vom Scheduler und vom Endpunkt `/api/settings/proxies/auto-test`. Der Wert wird auf mindestens 1 und höchstens 50 begrenzt. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Verzögerung in ms zwischen dem Start zweier Prüfungen innerhalb eines Batches. Ohne diese Verzögerung startet der gesamte Batch gleichzeitig, wodurch eine gemeinsam genutzte Egress-IP bei einem Ziel mit Ratenbegrenzung eine Sperre auslösen kann. Setzen Sie den Wert auf `0`, um die zeitliche Staffelung zu deaktivieren; der Höchstwert beträgt 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Setzen Sie den Wert auf „false“, um die Prüfung des tatsächlichen Hosts des einem Proxy zugewiesenen Anbieters (`GET /models`, kein API-Schlüssel) zu deaktivieren und stattdessen immer `PROXY_HEALTH_TEST_URL` zu verwenden. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Bei `false` (Standardwert) sind automatisierte Erreichbarkeitsprüfungen (der Scheduler und die Schaltfläche „Alle testen“ von `/api/settings/proxies/auto-test`) **schreibgeschützt** und ändern niemals den Status eines Proxys – nur der Betreiber setzt ihn auf aktiv/inaktiv, sodass eine unzuverlässige Prüfung einen zugewiesenen Proxy nicht unbrauchbar machen kann (#6246). Setzen Sie den Wert auf `true`, um das bisherige Verhalten „testen und setzen“ wiederherzustellen. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Optionales Feature-Flag (siehe [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); eine DB-Überschreibung im Dashboard hat Vorrang). `true` (oder `1`, `yes`) zeigt im Dashboard unter einem Proxy-Pool die schreibgeschützte Beobachtung des Pool-Egress an (unterschiedliche Egress-IPs, Verbindungen und die höchste Anzahl hinter einer einzelnen IP innerhalb der letzten 24 Stunden, basierend auf dem Proxy-Protokoll). Wird niemals für das Routing verwendet. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Setzen Sie den Wert auf `true`, damit der Scheduler Proxys nach wiederholten aufeinanderfolgenden Fehlschlägen automatisch entfernt. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Anzahl aufeinanderfolgender Fehlschläge, nach denen der Scheduler einen Proxy automatisch entfernt (wenn `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Auf `true` setzen, damit der Scheduler einen Proxy nach wiederholten aufeinanderfolgenden Fehlern vorübergehend deaktiviert (Status `dead`, niemals gelöscht), anstatt ihn zu entfernen. Nicht destruktive Alternative zu `PROXY_AUTO_REMOVE`: Der Proxy wird sofort von der Pool-/Rotationsauflösung ausgeschlossen (der von der Scope-Pool-Auflösung verwendete Alive-Statusfilter schließt ihn bereits aus) und automatisch reaktiviert, sobald seine Tests wieder erfolgreich sind. Verwendet denselben Schwellenwert `PROXY_AUTO_REMOVE_AFTER`. Wenn beide Flags `true` sind, hat `PROXY_AUTO_REMOVE` Vorrang. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ermöglicht OAuth- und Provider-Validierungsabläufen, einen fest zugewiesenen Proxy zu umgehen und eine direkte Verbindung herzustellen, wenn die Vorabprüfungen der Proxy-Erreichbarkeit fehlschlagen. Die effektive Priorität lautet: Überschreibung durch die Feature-Flags-Datenbank > Umgebungsvariable > Standardwert. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `src/lib/resilience/settings.ts` | Standardmäßiges **Warteschlangen-Wartezeitbudget**: wie lange eine Anfrage auf einen Provider-Slot warten und in der Warteschlange verbleiben darf, bevor sie abgelehnt wird, ohne jemals den Upstream zu erreichen. Der Timer wird zurückgesetzt, sobald die Ausführung des Jobs beginnt – die Ausführung wird separat durch `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` begrenzt. Die Umgebungsvariable legt nur den Standardwert fest: Ein persistiertes `resilienceSettings.requestQueue.maxWaitMs` und anschließend ein verbindungsspezifisches `rateLimitOverrides.maxWaitMs` haben jeweils Vorrang. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 Min.) | `open-sse/services/rateLimitManager.ts` | Obergrenze dafür, wie lange eine zugelassene Anfrage ausgeführt werden darf, bevor ihre Ratenbegrenzungsreservierung abläuft – entkoppelt vom Warteschlangen-Wartezeitbudget, damit ein langsamer Abrufstart bei nicht inkrementellen Gateways nicht zu einem Timeout führt (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deaktiviert) | `open-sse/services/rateLimitManager.ts` | Obergrenze für die Aufnahme in die Warteschlange: Ablehnung mit 429 `queue_full`, sobald bereits entsprechend viele Anfragen in der Warteschlange stehen. `0` = unbegrenzt (Standard). | +| `RATE_LIMIT_AUTO_ENABLE` | _(nicht gesetzt)_ | `open-sse/services/rateLimitManager.ts` | Erzwingt unabhängig von der persistierten Dashboard-Einstellung das Ein- oder Ausschalten des Sicherheitsnetzes zur automatischen Aktivierung der Ratenbegrenzung. Akzeptiert `true`/`1`/`on` zum Erzwingen der Aktivierung und `false`/`0`/`off` zum Erzwingen der Deaktivierung. | +| `PROVIDER_COOLDOWN_ENABLED` | _(nicht gesetzt → aus)_ | `open-sse/services/providerCooldownTracker.ts` | Optional aktivierbare globale, anfrageübergreifende Nachverfolgung der Abklingzeit von Providern/Verbindungen. Standardmäßig AUS (überschneidet sich mit „Connection Cooldown“ / „Provider Circuit Breaker“). Akzeptiert `true`/`1`/`on` zur Aktivierung. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimale Abklingzeit (ms), bevor ein fehlgeschlagener Provider bzw. eine fehlgeschlagene Verbindung erneut versucht wird. Wird mit aufeinanderfolgenden Fehlern exponentiell skaliert. Wird nur verwendet, wenn `PROVIDER_COOLDOWN_ENABLED` aktiviert ist. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 Min.) | `open-sse/services/providerCooldownTracker.ts` | Maximale Obergrenze für die Abklingzeit (ms), nach der ein fehlgeschlagener Provider/eine fehlgeschlagene Verbindung in jedem Fall erneut versucht wird. Wird nur verwendet, wenn `PROVIDER_COOLDOWN_ENABLED` aktiviert ist. | +| `STREAM_RECOVERY_ENABLED` | _(nicht gesetzt → aus)_ | `src/lib/resilience/settings.ts` (Initialwert) → `open-sse/services/streamRecovery.ts` (Logik) | **Was:** transparente Wiederherstellung abgeschnittener Upstream-Streams (Portierung aus free-claude-code). Hält das anfängliche SSE-Fenster bis zu `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) zurück, sodass ein _Abbruch vor dem Commit_ — also bevor ein Byte den Client erreicht — erneut geöffnet und unsichtbar wiederholt wird. **Wann aktivieren:** bei unzuverlässigen Upstreams, die häufig direkt zu Streambeginn nach 0 Byte abbrechen; deaktiviert lassen, wenn Sie sich bei jedem Stream keine Verlängerung der Zeit bis zum ersten Token um bis zu 750 ms leisten können. Akzeptiert `true`/`1`/`on`. Setzt den Initialwert für die persistierte Resilience-Einstellung; sobald die Dashboard-Einstellung festgelegt wurde, hat diese Vorrang. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(nicht gesetzt → aus)_ | `src/lib/resilience/settings.ts` (Initialwert) → `open-sse/services/streamRecovery.ts` (Logik) | **Was:** Fortsetzung innerhalb eines Streams (Phase 4.4) — nach einem _Abbruch nach dem Commit_ (Bytes haben den Client bereits erreicht) wird eine neue Anfrage mit dem Teiltext als Assistant-Prefill gestellt und das fehlende Suffix angefügt. Nur für OpenAI-kompatible Streams mit reinem Text; wird nie ausgelöst, während ein Tool-Aufruf läuft. **Wann aktivieren:** bei langen Generierungen, die mitten in der Antwort abgeschnitten werden, wenn Sie akzeptieren, dass der wiederhergestellte Rest gesammelt statt Token für Token eintrifft. Unabhängig von `STREAM_RECOVERY_ENABLED` (anderes Risikoprofil). Akzeptiert `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(nicht gesetzt → aus)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Optionaler Watchdog für die nutzbare Ausgabe aktiver Streams. Erkennt Streams, die weiterhin Chunks senden, aber unter der konfigurierten Ausgaberate des Assistants bleiben; Heartbeats, Nutzungsereignisse, leere Deltas sowie Tool- und Reasoning-Phasen werden nicht fälschlich als Fortschritt gewertet. Unabhängig von Leerlauf- und harten Zeitüberschreitungen. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Karenzzeit vor der Durchsatzprüfung, begrenzt auf 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Gleitendes Zeitfenster für nutzbare Ausgaben, begrenzt auf 1000–600000 ms; vor einem Abbruch muss ein vollständiges Zeitfenster verstrichen sein. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimale Byte-Rate der UTF-8-Ausgabe des Assistants (konservativer Token-Proxy), begrenzt auf 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Kleinste von null verschiedene Stichprobe nutzbarer Ausgabedaten, die als messbar gilt, begrenzt auf 1–1000000 Byte. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Staffelungsintervall (ms) zwischen den Zustandsprüfungen der Provider-Token beim Start. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimale zufällige Streuung (ms), die zwischen den Zustandsprüfungen der Provider-Token zusätzlich zu `HEALTHCHECK_STAGGER_MS` angewendet wird, um Lastspitzen zu verhindern (Issue #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maximale zufällige Streuung (ms), die zwischen den Zustandsprüfungen der Provider-Token zusätzlich zu `HEALTHCHECK_STAGGER_MS` angewendet wird, um Lastspitzen zu verhindern (Issue #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Batchgröße für gleichzeitige Prüfungen beim Token-Zustandscheck während des Starts; größere Werte prüfen mehr Verbindungen parallel, kleinere Werte reduzieren Lastspitzen (Issue #7875, Regression von #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Anzahl automatischer Wiederholungsversuche bei modellbezogenen Cooldown-Antworten, bevor ein Fehler an den Client zurückgegeben wird. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maximales Backoff-Intervall (Sekunden) zwischen Cooldown-Wiederholungsversuchen. Unabhängig vom vorgelagerten `Retry-After` auf diesen Wert begrenzt. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL des Headroom-Proxys zur Token-Einsparung. Der Dashboard-Lebenszyklus (`api/headroom/*`) startet standardmäßig eine lokale `headroom-ai`-CLI auf der Loopback-Schnittstelle; nur überschreiben, um auf einen externen Docker-Sidecar-Proxy zu verweisen. | ### Konstanten zur Optimierung der Stream-Wiederherstellung Das Holdback-Verhalten bei der Wiederherstellung wird durch fest codierte Konstanten in -`open-sse/config/constants.ts` (`STREAM_RECOVERY`) abgestimmt, die hier als Referenz aufgeführt sind — -ihre Änderung erfordert eine Codeänderung und keine Umgebungsvariable: +`open-sse/config/constants.ts` (`STREAM_RECOVERY`) abgestimmt, die hier als Referenz +aufgeführt sind — ihre Änderung erfordert eine Codeänderung, keine Umgebungsvariable: -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — wie lange das anfängliche SSE-Fenster zurückgehalten wird, +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — gibt an, wie lange das anfängliche SSE-Fenster zurückgehalten wird, damit bei einem frühzeitigen Abbruch ein erneuter Versuch erfolgen kann, bevor ein Byte an den Client übertragen wird. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — feste Obergrenze für das zurückgehaltene Fenster; die Übertragung - (Flush + Passthrough) beginnt, sobald sich so viele Bytes angesammelt haben, unabhängig vom Timer. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — maximale Anzahl transparenter Wiederöffnungen des Upstream- - Streams, solange der Holdback noch nicht übertragen wurde. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — feste Obergrenze für das zurückgehaltene Fenster; Commit + (Flush + Passthrough), sobald sich so viele Bytes angesammelt haben, unabhängig vom Timer. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — maximale Anzahl transparenter erneuter Öffnungen des vorgelagerten + Streams, solange das Holdback-Fenster noch nicht committet wurde. -> **Gleitendes Ratenlimit pro Anbieter (keine Umgebungsvariable):** Der vom FCC portierte -> _Fallback_ für das gleitende Ratenlimit pro Anbieter ist im Code vorhanden +> **Anbieterbezogene Sliding-Window-Ratenbegrenzung (keine Umgebungsvariable):** Der aus FCC portierte +> _Fallback_ für die anbieterbezogene Sliding-Window-Ratenbegrenzung ist im Code vorhanden > (`open-sse/services/providerDefaultRateLimit.ts`, eingebunden über > `open-sse/services/rateLimitManager.ts`), wird jedoch mit einer **leeren Standardzuordnung** > ausgeliefert und verfügt derzeit über **keine Umgebungsvariable für Betreiber** — er wird nur über einen Test-Hook / -> eine Codeänderung aktiviert. Er ist absichtlich nicht in der obigen Tabelle aufgeführt. Der Relay-Limiter pro `(token, IP)`, -> der _tatsächlich_ eine Konfigurationsoption besitzt, ist `RELAY_IP_PER_MINUTE` (§3 Netzwerk & Ports). +> eine Codeänderung aktiviert. Er ist daher absichtlich nicht in der obigen Tabelle aufgeführt. Der Relay-Limiter pro `(Token, IP)`, +> der _tatsächlich_ eine Konfigurationsoption besitzt, ist `RELAY_IP_PER_MINUTE` (§3 Netzwerk und Ports). --- ## 22. Debugging > [!CAUTION] -> Diese Variablen erzeugen **ausführliche Ausgaben** und können sensible Daten preisgeben. **Niemals in der Produktion aktivieren.** +> Diese Variablen erzeugen **ausführliche Ausgaben** und können sensible Daten offenlegen. **Niemals in der Produktion aktivieren.** | Variable | Standardwert | Quelldatei | Beschreibung | | ------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CURSOR_DEBUG` | _(nicht gesetzt)_ | `open-sse/executors/cursor.ts` | Auf `1` setzen, um ausführliche Protokolle des Cursor-Executors zu aktivieren (dekodierte SSE-Blöcke usw.). | | `CURSOR_STREAM_DEBUG` | _(nicht gesetzt)_ | `open-sse/executors/cursor.ts` | Abwärtskompatibler Alias für `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(nicht gesetzt)_ | `open-sse/executors/cursor.ts` | Optionaler Dateipfad, in den rohe dekodierte Cursor-Blöcke geschrieben werden, wenn `CURSOR_DEBUG=1` gilt. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Inaktivitäts-Timeout des Streams (ms) für den Cursor-Executor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Karenzzeit (ms) nach einem weichen composer-Abschluss durch kv_after_text, wenn noch Bytes gepuffert sind – gibt einem nachfolgenden exec_mcp-Tool-Aufruf Zeit, seinen Frame abzuschließen. | -| `CURSOR_TOOL_DIRECTIVE` | aktiviert (`!== "0"`) | `open-sse/executors/cursor.ts` | Tool-Commit-Direktive, durch die composer-2.5 zuverlässig Tool-Aufrufe ausführt. Zum Deaktivieren auf `0` setzen. | +| `CURSOR_DUMP_FILE` | _(nicht gesetzt)_ | `open-sse/executors/cursor.ts` | Optionaler Dateipfad, in den bei `CURSOR_DEBUG=1` rohe dekodierte Cursor-Blöcke geschrieben werden. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Zeitüberschreitung bei Inaktivität des Streams (ms) für den Cursor-Executor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Karenzzeit (ms) nach einem weichen composer-`kv_after_text`-Abschluss, wenn noch Bytes gepuffert sind — gibt einem nachfolgenden `exec_mcp`-Tool-Aufruf Zeit, seinen Frame abzuschließen. | +| `CURSOR_TOOL_DIRECTIVE` | aktiviert (`!== "0"`) | `open-sse/executors/cursor.ts` | Tool-Commit-Direktive, die composer-2.5 zuverlässig Tool-Aufrufe ausführen lässt. Zum Deaktivieren auf `0` setzen. | | `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(nicht gesetzt)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Vom Betreiber definierter System-Prompt-Text, der NACH der Übersetzung an die Systemnachricht angehängt wird (Injektion nach der Übersetzung) und die codex/Responses- sowie `/v1/messages`-Pfade erreicht. Wird außerdem als Direktivenpräfix verwendet, das aus zurückgegebenen Systempräambel-Blöcken entfernt wird. Zum Deaktivieren nicht setzen. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Abruf-Timeout pro Bild (ms) für entfernte `image_url`-Vision-Eingaben. | -| `CURSOR_STATE_DB_PATH` | _(automatisch ermittelt)_ | `open-sse/utils/cursorVersionDetector.ts` | Überschreibt die Suche nach der Zustandsdatenbank der Cursor-IDE, die zur Erkennung der IDE-Version verwendet wird. | -| `CURSOR_AGENT_CLI_VERSION` | _(erkennen / festlegen)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Build-ID der Agent-CLI (`YYYY.MM.DD-`) für `x-cursor-client-version: cli-…` bei Agent Run. | -| `CURSOR_AGENT_BIN` | _(nicht gesetzt)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Pfad zur Binärdatei des Cursor Agent, die für die Bilderzeugung verwendet wird. Ist die Variable nicht gesetzt, verwendet der Handler zunächst `providerSpecificData.agentBin` und dann PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Maximale Gesamtlaufzeit pro Bild (ms) für Bildaufträge des Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Parallelitätsbegrenzung für Bildaufträge von Cursor bei gemeinsam genutztem Zugang. | -| `CURSOR_IMG_MODEL` | Anfrage / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Überschreibt `--model` der Cursor-CLI für Bildaufträge. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (aus) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Auf `1` setzen, um zurückgegebene System-Prompt-Präambelblöcke vom Anfang eines openai→claude-Streams zu entfernen. Standardmäßig deaktiviert — die Heuristiken sind auf englische Prosa zugeschnitten und verändern die Antwortnutzlast, sodass eine Antwort, die berechtigterweise mit einem solchen Abschnitt beginnt, diesen verlieren würde. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Zeitüberschreitung pro Bildabruf (ms) für entfernte `image_url`-Vision-Eingaben. | +| `CURSOR_STATE_DB_PATH` | _(ermittelt)_ | `open-sse/utils/cursorVersionDetector.ts` | Überschreibt die Suche nach der Zustandsdatenbank der Cursor-IDE, die zur Erkennung der IDE-Version verwendet wird. | +| `CURSOR_AGENT_CLI_VERSION` | _(erkennen / festlegen)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Build-ID der Agent CLI (`YYYY.MM.DD-`) für `x-cursor-client-version: cli-…` bei Agent Run. | +| `CURSOR_AGENT_BIN` | _(nicht gesetzt)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Pfad zur Cursor-Agent-Binärdatei, die für die Bilderzeugung verwendet wird. Ist die Variable nicht gesetzt, verwendet der Handler `providerSpecificData.agentBin` und anschließend PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Maximale Gesamtlaufzeit pro Bild (ms) für Cursor-Agent-Bildaufträge. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Nebenläufigkeitsbegrenzung für gemeinsam genutzte Lizenzen bei Cursor-Bildaufträgen. | +| `CURSOR_IMG_MODEL` | Anfrage / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Überschreibt Cursor CLI `--model` für Bildaufträge. | | `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Abfrageintervall (ms) für Ergebnisse der UC-Bilderzeugung (uncensored.com). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Maximale Gesamtdauer (ms) für die Ergebnisabfrage der UC-Bilderzeugung. | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Maximale Gesamtlaufzeit (ms) für die Ergebnisabfrage der UC-Bilderzeugung. | | `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Abfrageintervall (ms) für Ergebnisse der UC-Videoerzeugung (uncensored.com). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Maximale Gesamtdauer (ms) für die Ergebnisabfrage der UC-Videoerzeugung. | -| `CURSOR_DATA_DIR` | _(automatisch ermittelt)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Überschreibt das Datenverzeichnis der Cursor Agent CLI (`…/versions/`); dieselbe Variable wird vom offiziellen Agent verwendet. | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Maximale Gesamtlaufzeit (ms) für die Ergebnisabfrage der UC-Videoerzeugung. | +| `CURSOR_DATA_DIR` | _(ermittelt)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Überschreibt das Datenverzeichnis der Cursor Agent CLI (`…/versions/`); dieselbe Variable, die der offizielle Agent verwendet. | | `CURSOR_TOKEN` | _(nicht gesetzt)_ | `scripts/ad-hoc/cursor-tap.cjs` | Direktes Cursor-Bearer-Token, das von Entwicklerwerkzeugen verwendet wird. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | deaktiviert (Opt-in über `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Protokolliert Content-Type-/Längenmarkierungen für große Chat-Nutzdaten, wenn `"1"` gesetzt ist. Standardmäßig deaktiviert, um Protokollrauschen zu reduzieren. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | deaktiviert (Opt-in über `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Protokolliert Content-Type-/Längenmarkierungen für große Chat-Nutzlasten, wenn `"1"` gesetzt ist. Standardmäßig deaktiviert, um unnötige Protokollausgaben zu reduzieren. | | `DEBUG_RESPONSES_SSE_TO_JSON` | _(nicht gesetzt)_ | `open-sse/handlers/responseTranslator.ts` | Auf `true` setzen, um Details zur SSE→JSON-Übersetzung der Responses API zu protokollieren. | | `DEBUG_CLAUDE_NONSTREAM` | _(nicht gesetzt)_ | `open-sse/handlers/responseTranslator.ts` | Auf `true` setzen, um leere textContent-Blöcke im Übersetzungspfad für Claude-Antworten sichtbar zu machen (nur zum Debuggen). | | `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(nicht gesetzt)_ | E2E-Testumgebung | Auf `true` setzen, um den E2E-Testmodus zu aktivieren (gelockerte Authentifizierung, Test-Hooks). | @@ -1225,7 +1235,7 @@ Ermöglicht Benutzern, Probleme direkt über das Dashboard zu melden. ## Bereitstellungsszenarien -Hinweise für SRE zum Relay-Backend (Verhalten von ts/bifrost/auto, Platzierung von 9router gegenüber CLIProxyAPI und Fallback-Strategie für hohen Durchsatz) finden Sie unter [Relay-Backend-Strategie](/docs/reference/RELAY_BACKEND_STRATEGY.md). +Anleitungen für SREs zum Relay-Backend (Verhalten von ts/bifrost/auto, Platzierung von 9router gegenüber CLIProxyAPI und Fallback-Strategie für hohen Durchsatz) finden Sie unter [Relay-Backend-Strategie](/docs/reference/RELAY_BACKEND_STRATEGY.md). ### Minimale lokale Entwicklung @@ -1240,10 +1250,10 @@ NODE_ENV=development ### Docker-Produktion ```bash -JWT_SECRET= -API_KEY_SECRET= -INITIAL_PASSWORD= -STORAGE_ENCRYPTION_KEY= +JWT_SECRET= +API_KEY_SECRET= +INITIAL_PASSWORD= +STORAGE_ENCRYPTION_KEY= DATA_DIR=/data PORT=20128 API_PORT=20129 @@ -1256,7 +1266,7 @@ OMNIROUTE_MEMORY_MB=8192 CORS_ORIGIN=https://your-frontend.example.com ``` -### Air-Gapped / CI +### Abgeschottete Umgebung / CI ```bash JWT_SECRET=test-jwt-secret-for-ci @@ -1270,9 +1280,9 @@ APP_LOG_TO_FILE=false ### VPS mit Reverse-Proxy (nginx + Cloudflare) ```bash -JWT_SECRET= -API_KEY_SECRET= -STORAGE_ENCRYPTION_KEY= +JWT_SECRET= +API_KEY_SECRET= +STORAGE_ENCRYPTION_KEY= PORT=20128 AUTH_COOKIE_SECURE=true REQUIRE_API_KEY=true diff --git a/docs/i18n/de/docs/reference/FEATURE_FLAGS.md b/docs/i18n/de/docs/reference/FEATURE_FLAGS.md index 4247033efa50..d42102e7ee19 100644 --- a/docs/i18n/de/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/de/docs/reference/FEATURE_FLAGS.md @@ -42,125 +42,127 @@ Ein boolescher Schalter gilt als **aktiviert**, wenn sein effektiver Wert `"true --- -## Schalterkatalog +## Flag-Katalog -72 Schalter in 6 Kategorien. **Standardwert** ist der Definitionsstandardwert — der Wert, +74 Flags in 6 Kategorien. **Standardwert** ist der in der Definition festgelegte Standardwert — der Wert, der verwendet wird, wenn weder eine DB-Überschreibung noch eine Umgebungsvariable vorhanden ist. ### Sicherheit (10) -| Schlüssel | Typ | Standardwert | Beschreibung | -| --------------------------------------- | ------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Einen API-Schlüssel für alle eingehenden Anfragen verlangen. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Eingabebereinigung für alle Anfragen aktivieren. | -| `INJECTION_GUARD_MODE` | enum | `off` | Schutzmodus gegen Prompt-Injection. Werte: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Personenbezogene Daten aus Anfragen entfernen (unabhängig von `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Personenbezogene Daten aus Antworten von Anbietern bereinigen. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Modus für die Bereinigung personenbezogener Daten in Antworten. Werte: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Ausgehende Anfragen an private/interne IP-Bereiche blockieren. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Authentifizierten Dashboard-Benutzern erlauben, gespeicherte API-Schlüssel anzuzeigen, anstatt nur maskierte Werte zu sehen. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Das Konto-Präfix in AUTH-Protokollzeilen aufnehmen (z. B. „Verwendetes -Konto: abc12345...“). Standardmäßig deaktiviert, damit Kontokennungen in gemeinsam genutzten bzw. mandantenfähigen Prozessprotokollen unkenntlich gemacht werden. Unabhängig vom Debug-Modus; das Umschalten des Debug-Modus legt diese Informationen nicht offen. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Wenn OIDC aktiviert ist, die Anmeldung per Passwort deaktivieren, sodass sich Benutzer nur über OIDC Single Sign-On authentifizieren können. Wenn dies deaktiviert ist (Standard), sind sowohl die Anmeldung per Passwort als auch OIDC verfügbar. | - -### Netzwerk (15) - -| Schlüssel | Typ | Standardwert | Neustart | Beschreibung | -| ----------------------------------------------- | ------- | ------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS-Fingerprint-Tarnmodus aktivieren. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Den Routen /v1/audio/* erlauben, OpenAI-kompatible Provider-Knoten zu verwenden, die außerhalb von localhost gehostet werden. Standardmäßig deaktiviert — das Weiterleiten von Audio an einen Remote-Host ändert die Egress-Identität und muss eine ausdrückliche Entscheidung des Betreibers sein. Loopback-Knoten sind immer erlaubt und davon nicht betroffen. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Wenn einer Verbindung kein Proxy zugewiesen ist, automatisch den ersten funktionsfähigen Proxy aus der Registry auswählen. Standardmäßig deaktiviert (andernfalls wird jeder Registry-Proxy zu einem globalen Fallback — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | OAuth- und Provider-Validierungsabläufen erlauben, einen festgelegten Proxy zu umgehen und eine direkte Verbindung herzustellen, wenn Vorabprüfungen der Proxy-Erreichbarkeit fehlschlagen. Standardmäßig deaktiviert, da dies die Egress-IP ändern kann. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Bei einer Netzwerkausnahme (Zeitüberschreitung, Verbindung abgelehnt/zurückgesetzt) eines Rotations-Executors für mehrere Konten eine kurze Abkühlzeit anwenden und andere Konten ohne Proxy für den Rest der Anfrage überspringen, anstatt jedes erneut zu versuchen, sofern das fehlerhafte Konto keinen dedizierten Proxy hat. Standardmäßig aktiviert (sicher: keine Änderung der Egress-IP, reduziert lediglich das Latenz-/Abkühlrisiko bei Konten mit gemeinsamem Egress). Deaktivieren, um beim ersten Fehler ohne Proxy die sofortige Weitergabe wiederherzustellen. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proxy-Pools und die kontospezifische Rotation von opencode stellen einen Proxy, der gerade fehlgeschlagen ist (abgelehnte TCP-Prüfung oder darüber empfangener 429-Status), für einen prozessspezifischen Zeitraum nicht erneut bereit. Dieser Zeitraum verdoppelt sich bei jeder Wiederholung bis zu einer Obergrenze. Es wird kein Proxy-Status geschrieben; wenn alle Kandidaten zurückgestellt sind, bleibt die Auswahl unverändert. Standardmäßig deaktiviert. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Im Dashboard unter einem Proxy-Pool anzeigen, wie viele beobachtete Egress-IPs dessen Mitglieder in den letzten 24 h bedient haben und wie viele Verbindungen sie verwendet haben. Schreibgeschützt, aus dem Proxy-Protokoll berechnet und niemals für das Routing verwendet. Standardmäßig deaktiviert. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Beim OpenCode-Executor das erste Body-Byte einer gestreamten Responses-Antwort überwachen (Zeitfenster: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, Standardwert `15000`). Ein 2xx-Responses-Stream, der über das Zeitfenster hinaus keine Daten liefert, gilt als blockiert: Für das Konto wird eine Abkühlzeit festgelegt und die Anfrage wird einmal zum nächsten Konto weiterrotiert; ein zweiter Stillstand führt zum sofortigen Fehlschlag. Standardmäßig deaktiviert: Bei blockierten Streams gilt weiterhin die aktuelle Wartezeit bis zum Timeout der Stream-Bereitschaft. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode-Executor: Bei einem 403/451-Status mit einer `user_blocked`-Ablehnung (nicht geografisch bedingt und keine Ablehnung des Cloudflare-Fingerprints) für das abgelehnte Konto eine Abkühlzeit festlegen und höchstens einmal pro Anfrage zum nächsten Konto rotieren; eine zweite Ablehnung wird unverändert und ohne Erfolgsmarkierung zurückgegeben. Standardmäßig deaktiviert: Das Umgehen einer Upstream-Benutzersperre durch Routing kann wie Umgehung wirken und die Markierung auf die gesamte Flotte ausweiten. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode-Rotation: Nach zwei aufeinanderfolgenden vorübergehenden Upstream-Fehlern (5xx oder eine leere 400-Antwort) vor dem nächsten Konto pausieren — 1,5 s, mit Verdopplung bei jedem weiteren Fehler, begrenzt auf 6 s pro Pause und 10 s pro Anfrage; bei einem Verbindungsabbruch durch den Client wird die Pause übersprungen. Der fehlerhafte Body wird vor dem Warten freigegeben. Standardmäßig deaktiviert: Das Failover erfolgt weiterhin sofort. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode-Rotation: Die Kontenwelle beim ersten 429-Status stoppen, der als echtes Ratenlimit klassifiziert wurde (parsbares `Retry-After` oder ein Body, der ein Raten-/Nutzungslimit nennt), und diesen Upstream-429-Status unverändert zurückgeben. Bei nicht klassifizierten 429-Statuscodes wird die Rotation fortgesetzt. Standardmäßig deaktiviert: Der kostenlose Tarif ist pro Egress-IP begrenzt (#9611), daher führt jeder 429-Status zu einer Rotation und eine erschöpfte Welle gibt den letzten Upstream-429-Status zurück. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Die Überprüfung von TLS-Zertifikaten für den MITM-Proxy deaktivieren. **Gefahr.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Provider-URLs zulassen, die auf private/interne Netzwerke verweisen. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Das Hinzufügen/Validieren von Providern unter lokalen/privaten Adressen (127.0.0.1, localhost, LAN) erlauben. Standardmäßig aktiviert (Local-first); für eine strikte Beschränkung auf öffentliche Adressen deaktivieren. Cloud-Metadaten bleiben blockiert. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Den mit Claude Code kompatiblen Provider-Modus aktivieren. | +| Schlüssel | Typ | Standardwert | Beschreibung | +| --------------------------------------- | ------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Für alle eingehenden Anfragen einen API-Schlüssel verlangen. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Eingabebereinigung für alle Anfragen aktivieren. | +| `INJECTION_GUARD_MODE` | enum | `off` | Schutzmodus gegen Prompt-Injection. Werte: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Personenbezogene Daten aus Anfragen entfernen (unabhängig von `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Personenbezogene Daten aus Anbieterantworten entfernen. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Modus für die Bereinigung personenbezogener Daten in Antworten. Werte: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Ausgehende Anfragen an private/interne IP-Adressbereiche blockieren. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Authentifizierten Dashboard-Benutzern erlauben, gespeicherte API-Schlüssel anzuzeigen, anstatt nur maskierte Werte zu sehen. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Kontopräfix in AUTH-Protokollzeilen aufnehmen (z. B. „-Konto wird verwendet: abc12345...“). Standardmäßig deaktiviert, damit Kontokennungen in gemeinsam genutzten bzw. mandantenfähigen Prozessprotokollen unkenntlich gemacht werden. Unabhängig vom Debug-Modus; dessen Umschaltung legt diese Informationen nicht offen. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Wenn OIDC aktiviert ist, die Anmeldung per Passwort deaktivieren, sodass sich Benutzer nur über OIDC Single Sign-On authentifizieren können. Wenn deaktiviert (Standardwert), sind sowohl die Anmeldung per Passwort als auch OIDC verfügbar. | + +### Netzwerk (16) + +| Schlüssel | Typ | Standardwert | Neustart | Beschreibung | +| ----------------------------------------------- | ------- | ------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Aktiviert den Tarnmodus für TLS-Fingerprints. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Erlaubt den Routen /v1/audio/*, OpenAI-kompatible Provider-Knoten zu verwenden, die außerhalb von localhost gehostet werden. Standardmäßig deaktiviert — die Weiterleitung von Audio an einen Remote-Host ändert die Egress-Identität und muss eine ausdrückliche Entscheidung des Betreibers sein. Loopback-Knoten sind immer zulässig und davon nicht betroffen. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Erlaubt POST /v1/rerank (und dem Loopback-Reranking-Schritt der Memory-Engine), OpenAI-kompatible Provider-Knoten zu verwenden, die außerhalb von localhost gehostet werden. Standardmäßig deaktiviert — die Weiterleitung an einen Remote-Host ändert die Egress-Identität und muss eine ausdrückliche Entscheidung des Betreibers sein. Loopback-Knoten sind immer zulässig; Remote-Knoten müssen außerdem die Richtlinie für ausgehende Provider-URLs erfüllen. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Wählt automatisch den ersten funktionsfähigen Proxy aus der Registry aus, wenn einer Verbindung kein Proxy zugewiesen ist. Standardmäßig deaktiviert (andernfalls wird jeder Registry-Proxy zu einem globalen Fallback — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Erlaubt OAuth- und Provider-Validierungsabläufen, einen fest zugewiesenen Proxy zu umgehen und eine direkte Verbindung herzustellen, wenn die Vorabprüfungen der Proxy-Erreichbarkeit fehlschlagen. Standardmäßig deaktiviert, da sich dadurch die Egress-IP ändern kann. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Wendet bei einer Netzwerkausnahme (Zeitüberschreitung, Verbindung abgelehnt/zurückgesetzt) für einen Rotations-Executor mit mehreren Konten eine kurze Abkühlzeit an und überspringt für den Rest der Anfrage andere Konten ohne Proxy, anstatt jedes erneut zu versuchen, sofern das fehlgeschlagene Konto keinen dedizierten Proxy besitzt. Standardmäßig aktiviert (sicher: keine Änderung der Egress-IP; verringert lediglich das Risiko von Latenzen und Abkühlzeiten bei Konten mit gemeinsamem Egress). Deaktivieren Sie diese Option, um die sofortige Weitergabe beim ersten Fehler eines Kontos ohne Proxy wiederherzustellen. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proxy-Pools und die kontobezogene Rotation von opencode stellen einen gerade fehlgeschlagenen Proxy (abgelehnte TCP-Prüfung oder darüber empfangene 429-Antwort) für einen prozessbezogenen Zeitraum nicht erneut bereit. Dieser Zeitraum verdoppelt sich bei jeder Wiederholung bis zu einer Obergrenze. Es wird kein Proxy-Status geschrieben; wenn alle Kandidaten zurückgestellt sind, bleibt die Auswahl unverändert. Standardmäßig deaktiviert. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Zeigt im Dashboard unter einem Proxy-Pool an, wie viele beobachtete Egress-IPs dessen Mitglieder in den letzten 24 h bedient haben und wie viele Verbindungen sie verwendet haben. Schreibgeschützt, aus dem Proxy-Protokoll berechnet und niemals für das Routing verwendet. Standardmäßig deaktiviert. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Überwacht beim OpenCode-Executor das erste Body-Byte einer gestreamten Responses-Antwort (Zeitfenster: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, Standardwert `15000`). Ein 2xx-Responses-Stream, der über das Zeitfenster hinaus keine Daten liefert, gilt als blockiert: Für das Konto wird eine Abkühlzeit aktiviert und die Anfrage wird einmal an das nächste Konto weitergeleitet; bei einer zweiten Blockierung schlägt sie sofort fehl. Standardmäßig deaktiviert: Blockierte Streams behalten das aktuelle Warteverhalten bis zum Zeitlimit für die Stream-Bereitschaft bei. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode-Ausführung: Bei einer 403/451-Antwort mit einer `user_blocked`-Ablehnung (weder geografisch bedingt noch eine Ablehnung aufgrund eines Cloudflare-Fingerabdrucks) wird für das abgelehnte Konto eine Abkühlzeit festgelegt und höchstens einmal pro Anfrage zum nächsten Konto gewechselt; eine zweite Ablehnung wird unverändert zurückgegeben, ohne eine erfolgreiche Ausführung zu vermerken. Standardmäßig deaktiviert: Das Umgehen einer benutzerbezogenen Sperre des Upstream-Dienstes kann wie ein Umgehungsversuch wirken und die Markierung auf die gesamte Flotte ausweiten. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode-Rotation: Nach zwei aufeinanderfolgenden vorübergehenden Upstream-Fehlern (5xx oder einer leeren 400-Antwort) wird vor dem nächsten Konto pausiert — beginnend mit 1,5 s und sich bei jedem weiteren Fehler verdoppelnd, begrenzt auf 6 s pro Pause und 10 s pro Anfrage; bei einer Trennung durch den Client wird die Pause übersprungen. Der fehlgeschlagene Antworttext wird vor dem Warten freigegeben. Standardmäßig deaktiviert: Das Failover erfolgt weiterhin sofort. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode-Rotation: Die Kontowelle wird bei der ersten 429-Antwort gestoppt, die als echte Ratenbegrenzung klassifiziert wurde (ein auswertbarer `Retry-After`-Wert oder ein Antworttext, der ein Raten- oder Nutzungslimit nennt), und diese Upstream-429-Antwort wird unverändert zurückgegeben. Bei nicht klassifizierten 429-Antworten wird die Rotation fortgesetzt. Standardmäßig deaktiviert: Der kostenlose Tarif ist pro Egress-IP begrenzt (#9611), daher führt jede 429-Antwort zu einer Rotation, und bei einer ausgeschöpften Welle wird die letzte Upstream-429-Antwort zurückgegeben. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Deaktiviert die Überprüfung von TLS-Zertifikaten für den MITM-Proxy. **Gefahr.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Erlaubt Anbieter-URLs, die auf private/interne Netzwerke verweisen. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Erlaubt das Hinzufügen/Validieren von Anbietern unter lokalen/privaten Adressen (127.0.0.1, localhost, LAN). Standardmäßig aktiviert (Local-first); für eine strikte Beschränkung auf öffentliche Adressen deaktivieren. Cloud-Metadaten bleiben gesperrt. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Aktiviert den mit Claude Code kompatiblen Anbietermodus. | ### Richtlinien (5) -| Schlüssel | Typ | Standardwert | Beschreibung | -| ------------------------------- | ------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Modus zur Durchsetzung der Richtlinie für die Werkzeugnutzung. Werte: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Aktiviert die Ratenbegrenzung automatisch auf Grundlage von Nutzungsmustern. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Überspringt die lokale Prüfung des Kontextfensters bzw. der maximalen Eingabe-Token von OmniRoute für direkte Einzelmodellanfragen. Vorgelagerte Beschränkungen gelten weiterhin. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Lehnt Anfragen vor der Weiterleitung ab, wenn das Zielmodell nicht über die erforderlichen Fähigkeiten verfügt (Bildverarbeitung, Werkzeuge, strukturierte Ausgabe, Kontextfenster). Schützt direkte Einzelanbieteranfragen, die den Kompatibilitätsfilter der Kombinationsschicht umgehen. | -| `RADAR_ENABLED` | boolean | `false` | Aktiviert das OmniRoute-Radar-Modul (Katalog-Feed-Ansichten und Synchronisierung). Standardmäßig deaktiviert; die Aktivierung schaltet lediglich die Benutzeroberfläche frei — die Datensynchronisierung erfordert weiterhin eine separate Zustimmung. | - -### Laufzeit (32) - -| Schlüssel | Typ | Standardwert | Neustart | Beschreibung | -| ------------------------------------------- | ------- | ------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Generiert Gesprächszusammenfassungen und fügt sie ein, wenn das Combo-Routing zwischen Modellen wechselt. Deaktivieren Sie diese Option, um Modellwechsel unabhängig voneinander zu behandeln und Hintergrundanfragen zur Übergabe für alle bestehenden und zukünftigen Combos zu verhindern. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Entfernt interne Ausgabeelemente der Kommentarphase aus Passthrough-Streams der Responses API, bevor sie an Clients weitergeleitet werden. Deaktivieren Sie diese Option, um unverarbeitete Upstream-Kommentare zu empfangen. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Erzwingt Bereichsbeschränkungen für den Zugriff auf MCP-Tools. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Komprimiert Beschreibungen von MCP-Tools, um den Tokenverbrauch zu reduzieren. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Aktiviert die Verarbeitung von Hintergrundaufgaben zur Laufzeit. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Deaktiviert alle Hintergrunddienste (Kontingentaktualisierung, Synchronisierung usw.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Vertraut RTK-Filtern auf Projektebene ohne Validierung. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Startet beim Import den WebSocket-Server des Echtzeit-Dashboards (standardmäßig auf Port 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Erlaubt Codex, den Responses-over-WebSocket-Transport zu verwenden. Wenn diese Option deaktiviert ist, greift Codex auf HTTP Responses zurück. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Erlaubt Codex, den lokalen app-server-WebSocket-JSON-RPC-Transport zu verwenden (codexTransport=app-server). Wenn diese Option deaktiviert ist, greifen Verbindungen, die app-server verwenden sollen, auf die anderen Transporte von Codex zurück. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Leitet Anfragen mit ausgeschöpftem Budget an den kostenlosen Notfall-Fallback-Anbieter bzw. das entsprechende Modell weiter. (Siehe [Notfall-Fallback bei ausgeschöpftem Budget](#emergency-budget-fallback) weiter unten.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Aktiviert transparente frühe Wiederholungsversuche für abgeschnittene Upstream-SSE-Streams, bevor Antwortbytes den Client erreichen. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Erlaubt der Stream-Wiederherstellung, eine Antwort erneut anzufordern und zusammenzufügen, nachdem bereits Bytes den Client erreicht haben. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Macht die Fortsetzung mitten im Stream sicher für Tool-Aufrufe: Ein unterbrochener Stream wird nie fortgesetzt, nachdem ein Tool-Aufruf ausgegeben wurde (noch aktiv oder bereits mit finish_reason tool_calls abgeschlossen), und nach einer leeren Fortsetzung wird beendet, anstatt das gesamte Budget aufzubrauchen. Deaktiviert: Release-Verhalten. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Wechselt einmalig zu einer gleichgeordneten Verbindung, wenn ein SSE-Stream geschlossen wird, bevor ein verwertbarer Frame ausgegeben wurde, und der begrenzte Wiederholungsversuch über dieselbe Verbindung aufgebraucht ist; ist keine verwendbare gleichgeordnete Verbindung vorhanden, wird der ursprüngliche `STREAM_EARLY_EOF`-Fehler 502 zurückgegeben. Standardmäßig deaktiviert: Early-EOF bleibt nach dem Wiederholungsversuch über dieselbe Verbindung endgültig. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Nimmt anzeigefreundliche Namensfelder in Antworten von `/v1/models` auf. Deaktivieren Sie diese Option für Clients, die ausschließlich Modell-IDs erwarten. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Steuert, wie Modell-IDs in /v1/models Präfixe erhalten. 'dual' (Standardwert) gibt zur Abwärtskompatibilität sowohl Alias- als auch kanonische Anbieter-ID-Präfixe aus. 'alias' gibt ausschließlich das kurze Aliaspräfix aus (z. B. ds-web/model, nicht deepseek-web/model). 'canonical' gibt ausschließlich das vollständige Anbieter-ID-Präfix aus. Werte: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Aktiviert die regelmäßige ELO-Synchronisierung der Arena-AI-Bestenliste für Modellintelligenz-Ranglisten. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Veröffentlicht gespiegelte IDs im Format `claude//` unter `/v1/models`, damit die Modellerkennung des Claude-Code-Gateways auch Nicht-Claude-Modelle auflistet. Globale Ebene der dreistufigen Steuerung (die Umgebungsvariable hat Vorrang vor der Dashboard-Überschreibung). Siehe [Claude-Code-Konfiguration](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Hauptschalter für die Gateway-Aliasse no-think//. Aktiviert (Standardwert): /v1/models veröffentlicht für jedes geeignete denkfähige Claude-Modell eine Variante ohne Denkmodus, und eine in einer Anfrage gesendete no-think/-ID wird wieder zum tatsächlichen Modell aufgelöst, wobei die Schlussfolgerung unterdrückt wird. Deaktiviert: Es werden keine Varianten veröffentlicht, und eine no-think/-ID wird wie jede andere unbekannte Modell-ID behandelt. Die modellspezifische Aktivierung/Deaktivierung über ModelSpec.noThinkingAlias gilt weiterhin, solange diese Option aktiviert ist. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Deaktiviert die Erzeugung von Varianten der Denkstufe (z. B. -low, -medium, -high) im /v1/models-Katalog. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Aktiviert mandantenspezifische adaptive virtuelle Zulassungsspuren für die Anbieterweiterleitung (#9654): Die Lastspitze eines Mandanten verursacht dann keine 503-Fehler mehr bei einem anderen. Die Umgebungsvariable OMNIROUTE_CHAT_VIRTUAL_LANES hat Vorrang vor dieser Dashboard-Überschreibung; Änderungen werden beim Neustart des Servers wirksam. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Veröffentlicht gespiegelte IDs im Format / unter /v1/models für Modelle, deren kanonischer Eigentümer keine aktiven Anmeldedaten besitzt, die jedoch durch ein Passthrough-Gateway mit aktiven Anmeldedaten weitergeleitet werden. Warnung: Fügt bei globaler Aktivierung Katalogeinträge für alle Clients hinzu. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Aktiviert die Guthabenerkennung für Aggregator-kompatible Knoten von New-API / One-API / Sub2API. Wenn diese Option aktiviert ist, melden kompatible Knoten mit gesetztem Aggregator-Flag ihr Guthaben im Dashboard und beim Kontingent-Preflight-Routing. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Setzt nicht streamende, serverseitig gesteuerte Tool-Aufrufe fort, bis das Modell eine für den Client nutzbare Antwort zurückgibt. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | In Suchstatistiken und kürzlich ausgeführten Suchen werden nur Anbieter gezählt, die noch über eine aktive Verbindung verfügen (schlüssellose Anbieter wie duckduckgo-free werden immer gezählt). Bei deaktivierter Option werden alle gespeicherten Suchzeilen mit einer Anbieter-ID beibehalten. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Anbieter-Seiten des Dashboards: Zeigt das Kostenlos-Abzeichen nur bei Signalen an, die der Anbieter berücksichtigt — die Heuristik für Anzeigenamen, nicht boolesche Kostenlos-Felder und :free-Suffixe bei registrierten Anbietern ohne dokumentierte kostenlose Stufe werden verworfen. Bei deaktivierter Option bleibt die bisherige Abzeichenregel bestehen. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Lässt bei aggregierten 429/503-Antworten wegen Nichtverfügbarkeit `Retry-After` weg, wenn kein konkreter zukünftiger Wiederholungszeitpunkt bekannt ist (anstelle eines synthetischen Werts von 1 s), fügt `error.retry_after_provenance` (`signal` \| `none`) hinzu und erlaubt Combo-Drain-Pfaden, Wiederholungshinweise in Prosa aus JSON- und Klartext-Upstream-Antwortkörpern zu lesen. Das Feld erscheint nur in Antworten, die von `unavailableResponse()` erstellt wurden; andere 429/503-Antwortkörper bleiben unverändert. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Wenn ein `priority`-Combo-Ziel, das nur bei ausgeschöpftem Kontingent als Fallback markiert ist, die Combo aus einem nachweislich nicht kontingentbedingten Grund stoppt (offener Leistungsschalter des Anbieters, prädiktives Überspringen aufgrund der Latenz), wird mit 502 statt mit der wie ein Kontingentfehler wirkenden 503 geantwortet. Stopps aufgrund von Sperrung, Abklingzeit, Nichtverfügbarkeit, Ausschöpfung und Parallelitätsgrenze behalten 503 bei. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Eine einfache Mistral-401-Antwort (`{"detail":"Unauthorized"}`, kein explizites Authentifizierungssignal) ist bei einem widerrufenen Schlüssel und bei ausgeschöpftem Kontingent identisch. Wenn diese Option aktiviert ist, wird die Verbindung in eine Abklingzeit versetzt, anstatt sie als `expired` zu parken, und zwar höchstens dreimal pro Stunde und Verbindung; beim nächsten Mal wird sie geparkt, sodass ein widerrufener Schlüssel weiterhin zuverlässig erkannt wird. Standardmäßig deaktiviert: Jede einfache Mistral-401-Antwort parkt die Verbindung wie zuvor. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ruft für `xai-oauth`-Verbindungen den aktuellen xAI-Modellkatalog von `https://api.x.ai/v1/models` unter Verwendung des OAuth-Bearer-Tokens ab, anstatt den unveränderlichen statischen Ausgangsbestand zu verwenden. Standardmäßig deaktiviert: `xai-oauth` stellt weiterhin unverändert den statischen Ausgangsbestand bereit. Bei jedem Auflösungsfehler greift die Erkennung auf den Ausgangsbestand zurück (es ist nicht verifiziert, ob x.ai an diesem Endpunkt ein OAuth-Bearer-Token akzeptiert). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Erlaubt der automatischen Bereinigung, abgeschlossene (completed/failed/cancelled/expired) Batch-API-Aufträge zu löschen, die älter als `OMNIROUTE_BATCH_RETENTION_DAYS` sind, einschließlich ihrer zeilenbezogenen Prüfpunkte, und den BLOB-Inhalt hochgeladener Dateien nach Ablauf ihres jeweiligen `expires_at` zu leeren. Standardmäßig deaktiviert: Jede bestehende Installation behält diese Daten genau wie zuvor, bis ein Betreiber die Funktion aktiviert. Die vom Betreiber ausgelöste Route `DELETE /api/v1/batches/delete-completed` bleibt in beiden Fällen unberührt — sie stellt einen separaten, bedingungslosen öffentlichen API-Vertrag dar. | +| Schlüssel | Typ | Standard | Beschreibung | +| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Modus zur Durchsetzung der Richtlinie für die Werkzeugnutzung. Werte: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Aktiviert die Ratenbegrenzung automatisch anhand von Nutzungsmustern. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Überspringt die lokale Kontextfenster-/Maximale-Eingabetoken-Prüfung von OmniRoute für direkte Einzelmodellanfragen. Die Upstream-Limits gelten weiterhin. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Lehnt Anfragen vor der Weiterleitung ab, wenn dem Zielmodell erforderliche Fähigkeiten fehlen (Bildverarbeitung, Werkzeuge, strukturierte Ausgabe, Kontextfenster). Schützt direkte Anfragen an einen einzelnen Anbieter, die den Kompatibilitätsfilter der Kombinationsebene umgehen. | +| `RADAR_ENABLED` | boolean | `false` | Aktiviert das OmniRoute-Radar-Modul (Katalog-Feed-Ansichten und Synchronisierung). Standardmäßig deaktiviert; die Aktivierung schaltet lediglich die Benutzeroberfläche frei — die Datensynchronisierung muss weiterhin separat aktiviert werden. | + +### Laufzeit (33) + +| Schlüssel | Typ | Standardwert | Neustart | Beschreibung | +| ------------------------------------------- | ------- | ------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Gesprächszusammenfassungen generieren und einfügen, wenn das Combo-Routing zwischen Modellen wechselt. Deaktivieren, um Modellwechsel unabhängig voneinander zu behandeln und Hintergrundanfragen zur Kontextübergabe für alle vorhandenen und zukünftigen Combos zu verhindern. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Interne Ausgabeelemente der Kommentarphase aus Passthrough-Streams der Responses API entfernen, bevor sie an Clients weitergeleitet werden. Deaktivieren, um die unbearbeiteten Upstream-Kommentare zu empfangen. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Bereichsbeschränkungen für den Zugriff auf MCP-Tools erzwingen. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Beschreibungen von MCP-Tools komprimieren, um die Token-Nutzung zu reduzieren. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Verarbeitung von Hintergrundaufgaben zur Laufzeit aktivieren. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Alle Hintergrunddienste deaktivieren (Kontingentaktualisierung, Synchronisierung usw.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | RTK-Filter auf Projektebene ohne Validierung vertrauen. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Den WebSocket-Server für das Echtzeit-Dashboard beim Import starten (standardmäßig Port 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex die Verwendung des Responses-over-WebSocket-Transports erlauben. Wenn deaktiviert, greift Codex auf HTTP Responses zurück. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex die Verwendung des lokalen app-server-WebSocket-JSON-RPC-Transports (`codexTransport=app-server`) erlauben. Wenn deaktiviert, greifen für app-server konfigurierte Verbindungen auf die anderen Transporte von Codex zurück. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Anfragen mit ausgeschöpftem Budget an den kostenlosen Notfall-Fallback-Anbieter bzw. das kostenlose Notfall-Fallback-Modell weiterleiten. (Siehe unten [Notfall-Fallback bei ausgeschöpftem Budget](#emergency-budget-fallback).) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Transparente frühzeitige Wiederholungsversuche für abgeschnittene vorgelagerte SSE-Streams aktivieren, bevor Antwortbytes den Client erreichen. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Der Stream-Wiederherstellung erlauben, eine Antwort erneut anzufordern und zusammenzufügen, nachdem bereits Bytes den Client erreicht haben. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Die Fortsetzung während des Streams für Tool-Aufrufe absichern: Einen unterbrochenen Stream niemals fortsetzen, sobald ein Tool-Aufruf ausgegeben wurde (noch aktiv oder bereits mit `finish_reason` `tool_calls` beendet), und nach einer leeren Fortsetzung schließen, anstatt das gesamte Budget aufzubrauchen. Deaktiviert: Release-Verhalten. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Einmaliges Failover zu einer Geschwisterverbindung, wenn ein SSE-Stream geschlossen wird, bevor ein verwertbarer Frame ausgegeben wurde, und der begrenzte Wiederholungsversuch über dieselbe Verbindung ausgeschöpft ist; ist keine nutzbare Geschwisterverbindung vorhanden, wird der ursprüngliche `STREAM_EARLY_EOF`-Fehler 502 zurückgegeben. Standardmäßig deaktiviert: Ein vorzeitiges EOF bleibt nach dem Wiederholungsversuch über dieselbe Verbindung endgültig. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Anzeigenfreundliche Namensfelder in Antworten von `/v1/models` einbeziehen. Für Clients deaktivieren, die ausschließlich Modell-IDs erwarten. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Steuert, wie Modell-IDs in /v1/models mit Präfixen versehen werden. 'dual' (Standard) gibt aus Gründen der Abwärtskompatibilität sowohl Alias- als auch kanonische Anbieter-ID-Präfixe aus. 'alias' gibt nur das kurze Aliaspräfix aus (z. B. ds-web/model, nicht deepseek-web/model). 'canonical' gibt nur das vollständige Anbieter-ID-Präfix aus. Werte: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Regelmäßige Synchronisierung der ELO-Werte der Arena-AI-Bestenliste für Modellintelligenz-Ranglisten aktivieren. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `claude//`-Spiegel-IDs unter `/v1/models` veröffentlichen, damit die Modellerkennung des Claude-Code-Gateways auch Nicht-Claude-Modelle auflistet. Globale Ebene der dreistufigen Steuerung (die Umgebungsvariable hat Vorrang vor der Dashboard-Überschreibung). Siehe [Claude-Code-Konfiguration](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Hauptschalter für die no-think//-Gateway-Aliasse. Aktiviert (Standard): /v1/models veröffentlicht für jedes geeignete, denkfähige Claude-Modell eine Variante ohne Denken, und eine in einer Anfrage gesendete no-think/-ID wird wieder zum tatsächlichen Modell aufgelöst, wobei das Schlussfolgern unterdrückt wird. Deaktiviert: Es werden keine Varianten veröffentlicht, und eine no-think/-ID wird wie jede andere unbekannte Modell-ID behandelt. Die modellspezifische Opt-in-/Opt-out-Einstellung ModelSpec.noThinkingAlias gilt weiterhin, solange dies aktiviert ist. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Die Erzeugung von Denkstufenvarianten (z. B. -low, -medium, -high) im /v1/models-Katalog deaktivieren. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Adaptive virtuelle Zulassungsspuren pro Mandant für die Anbieterweiterleitung aktivieren (#9654): Eine Lastspitze eines Mandanten führt dann nicht mehr zu 503-Fehlern bei einem anderen. Die Umgebungsvariable OMNIROUTE_CHAT_VIRTUAL_LANES hat Vorrang vor dieser Dashboard-Überschreibung; Änderungen werden beim Neustart des Servers wirksam. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | /-Spiegel-IDs unter /v1/models für Modelle veröffentlichen, deren kanonischer Eigentümer keine aktiven Zugangsdaten hat, die jedoch über ein Passthrough-Gateway mit aktiven Zugangsdaten weitergeleitet werden. Warnung: Fügt bei globaler Aktivierung Katalogeinträge für alle Clients hinzu. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Guthabenerkennung für mit New-API / One-API / Sub2API-Aggregatoren kompatible Knoten aktivieren. Wenn diese Option aktiviert ist, melden kompatible Knoten mit gesetztem Aggregator-Flag ihr Guthaben im Dashboard und beim Quota-Preflight-Routing. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Nicht streamende, serverseitig verwaltete Tool-Aufrufe fortsetzen, bis das Modell eine für den Client nutzbare Antwort zurückgibt. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Suchstatistiken und kürzlich durchgeführte Suchen berücksichtigen nur Anbieter, die noch über eine aktive Verbindung verfügen (Anbieter ohne Schlüssel wie duckduckgo-free werden immer berücksichtigt). Bei deaktivierter Option wird jede beibehaltene Suchzeile mit einer Anbieter-ID berücksichtigt. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Anbieter-Seiten im Dashboard: Das „Kostenlos“-Badge nur bei Signalen anzeigen, die der Anbieter berücksichtigt — die Heuristik für Anzeigenamen, nicht boolesche Kostenlos-Felder und :free-Suffixe bei registrierten Anbietern ohne dokumentierte kostenlose Tarifstufe werden verworfen. Bei deaktivierter Option bleibt die bisherige Badge-Regel erhalten. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Bei aggregierten 429/503-Antworten wegen Nichtverfügbarkeit `Retry-After` weglassen, wenn kein konkreter zukünftiger Wiederholungszeitpunkt bekannt ist (anstelle eines synthetischen Werts von 1 s), `error.retry_after_provenance` (`signal` \| `none`) hinzufügen und Combo-Drain-Pfaden ermöglichen, ausformulierte Wiederholungshinweise aus JSON- und Klartext-Upstream-Bodys zu lesen. Das Feld erscheint nur in Antworten, die von `unavailableResponse()` erstellt werden; andere 429/503-Bodys bleiben unverändert. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Wenn ein `priority`-Combo-Ziel, das als Fallback nur bei ausgeschöpftem Kontingent markiert ist, die Combo aus einem nachweislich nicht kontingentbedingten Grund beendet (offener Anbieter-Leistungsschalter, Überspringen aufgrund prognostizierter Latenz), mit 502 statt mit dem nach Kontingentüberschreitung aussehenden 503 antworten. Stopps aufgrund von Sperre, Abklingzeit, Nichtverfügbarkeit, Erschöpfung und Parallelitätslimit behalten 503 bei. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Ein reiner Mistral-401-Fehler (`{"detail":"Unauthorized"}`, ohne explizites Authentifizierungssignal) ist bei einem widerrufenen Schlüssel und einem ausgeschöpften Kontingent identisch. Wenn diese Option aktiviert ist, wird für die Verbindung eine Abklingzeit festgelegt, statt sie als `expired` zu sperren, höchstens dreimal pro Stunde und Verbindung; beim nächsten Mal wird sie gesperrt, sodass auch ein widerrufener Schlüssel letztlich dauerhaft gesperrt wird. Standardmäßig deaktiviert: Jeder reine Mistral-401-Fehler sperrt die Verbindung wie bisher. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ruft für `xai-oauth`-Verbindungen den aktuellen xAI-Modellkatalog unter `https://api.x.ai/v1/models` mithilfe des OAuth-Bearer-Tokens ab, anstatt den unveränderlichen statischen Ausgangsbestand zu verwenden. Standardmäßig deaktiviert: `xai-oauth` stellt weiterhin unverändert den statischen Ausgangsbestand bereit. Bei jedem Auflösungsfehler greift die Erkennung auf den Ausgangsbestand zurück (es ist nicht verifiziert, ob x.ai an diesem Endpunkt einen OAuth-Bearer-Token akzeptiert). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Ermöglicht dem automatischen Bereinigungsdurchlauf, abgeschlossene (erfolgreich/fehlgeschlagen/abgebrochen/abgelaufen) Batch-API-Aufträge zu löschen, die älter als `OMNIROUTE_BATCH_RETENTION_DAYS` sind, einschließlich ihrer Checkpoints pro Zeile, und den BLOB-Inhalt hochgeladener Dateien zu löschen, deren jeweiliger `expires_at`-Zeitpunkt überschritten wurde. Standardmäßig deaktiviert: Bei jeder bestehenden Installation bleiben diese Daten genau wie bisher erhalten, bis ein Betreiber die Funktion aktiviert. Die vom Betreiber ausgelöste Route `DELETE /api/v1/batches/delete-completed` ist in beiden Fällen nicht betroffen — sie stellt einen separaten, bedingungslosen öffentlichen API-Vertrag dar. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Reserviert das ausgewählte Antigravity-Konto für den Streaming-Lebenszyklus der Anfrage, die es ausgewählt hat, sodass ein paralleler Wiederholungsversuch oder die Übergabe der Anmeldedaten kein Konto erneut auswählen kann, das bereits einem laufenden Stream zugewiesen ist. Die Reservierung gilt für die Kombination aus Verbindung und aufrufbarem Upstream-Modell, sodass ein Konto weiterhin zwei verschiedene Modelle gleichzeitig bedienen kann. Wenn alle infrage kommenden Konten für dieses Modell bereits reserviert sind, gibt die Anfrage eine strukturierte 503-Antwort mit `antigravity_pool_busy` und einem begrenzten `Retry-After` zurück, anstatt ein ausgelastetes Konto zusätzlich zu belasten. Standardmäßig deaktiviert: Die Kontoauswahl bleibt genau wie bisher, und es erfolgt keine Reservierung. | ### CLI (5) -| Schlüssel | Typ | Standardwert | Neustart | Beschreibung | -| ------------------------------------- | ------- | ------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Aktiviert den Kompatibilitätsmodus für alle CLI-Clients. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Aktiviert die Kompatibilitätsschicht für Modellaliase. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Aktiviert die automatische Synchronisierung von Preisdaten (erfordert außerdem die Umgebungsvariable `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Schreibt nach der Synchronisierung der Anbietermodelle automatisch die Profildateien ~/.codex/*.config.toml aus dem aktuellen Katalog (neu). Ändert niemals die aktive/standardmäßige Codex-Konfiguration. Standardmäßig deaktiviert. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Schreibt nach der Synchronisierung der Anbietermodelle automatisch die Claude-Code-Profile ~/.claude/profiles//settings.json aus dem aktuellen Katalog (neu). Ändert niemals die aktive/standardmäßige Claude-Konfiguration. Standardmäßig deaktiviert. | +| Schlüssel | Typ | Standardwert | Neustart | Beschreibung | +| ------------------------------------- | ------- | ------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Aktiviert den Kompatibilitätsmodus für alle CLI-Clients. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Aktiviert die Kompatibilitätsschicht für Modellaliase. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Aktiviert die automatische Synchronisierung von Preisdaten (erfordert außerdem die Umgebungsvariable `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Schreibt nach einer Synchronisierung der Anbietermodelle automatisch die Profildateien unter ~/.codex/*.config.toml anhand des aktuellen Katalogs neu bzw. aktualisiert sie. Ändert niemals die aktive Codex-Standardkonfiguration. Standardmäßig deaktiviert. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Schreibt nach einer Synchronisierung der Anbietermodelle automatisch die Claude-Code-Profile unter ~/.claude/profiles//settings.json anhand des aktuellen Katalogs neu bzw. aktualisiert sie. Ändert niemals die aktive Claude-Standardkonfiguration. Standardmäßig deaktiviert. | ### Systemzustand (5) -| Schlüssel | Typ | Standardwert | Beschreibung | -| ----------------------------------------- | ------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Deaktiviert den Endpunkt zur Zustandsprüfung der lokalen Instanz. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Deaktiviert die Zustandsprüfung zur Tokenvalidierung. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Aktiviert den Netzwerkzugriff in der Skills-Sandbox-Umgebung. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Bei der Proxy-Zustandsprüfung setzt eine vom Ziel abgelehnte Anfrage (401/403/429) die Serie aufeinanderfolgender Proxy-Fehler zurück. Standardmäßig deaktiviert: Eine Ablehnung bleibt neutral (#10654). Ein 5xx-Fehler bleibt in beiden Fällen uneindeutig; eine Ablehnung entfernt, deaktiviert oder reaktiviert niemals einen Proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Führt die Datenbankintegritäts-/Zustandsprüfung beim Start erst aus, nachdem der Server begonnen hat, Anfragen zu akzeptieren (über `setImmediate`), anstatt den Start bis zum Abschluss zu blockieren (#13717). Standardmäßig deaktiviert: Der Start wird genau wie vor diesem PR blockiert. | +| Schlüssel | Typ | Standardwert | Beschreibung | +| ----------------------------------------- | ------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Deaktiviert den Endpunkt zur Zustandsprüfung der lokalen Instanz. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Deaktiviert die Zustandsprüfung der Token-Validierung. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Aktiviert den Netzwerkzugriff in der Skills-Sandbox-Umgebung. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Bei der Proxy-Zustandsprüfung setzt eine vom Ziel abgelehnte Anfrage (401/403/429) die Serie aufeinanderfolgender Proxy-Fehlschläge zurück. Standardmäßig deaktiviert: Eine Ablehnung bleibt neutral (#10654). Ein 5xx-Fehler bleibt in beiden Fällen ergebnislos; eine Ablehnung entfernt, deaktiviert oder reaktiviert niemals einen Proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Führt die Integritäts-/Zustandsprüfung der DB beim Start erst aus, nachdem der Server Anfragen akzeptiert (über `setImmediate`), anstatt den Start bis zum Abschluss der Prüfung zu blockieren (#13717). Standardmäßig deaktiviert: Der Start wird genau wie vor diesem PR blockiert. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` und sein Legacy-Alias +> `INPUT_SANITIZER_BLOCK_THRESHOLD` und dessen Legacy-Alias > `INJECTION_GUARD_BLOCK_THRESHOLD` konfigurieren den Modus `block` von > `INJECTION_GUARD_MODE`, sind jedoch einfache Umgebungsvariablen, die von > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> gelesen werden, und keine Feature-Flags: Sie besitzen weder eine DB-Überschreibung noch einen Dashboard-Schalter. Siehe +> gelesen werden, und keine Feature-Flags: Sie verfügen weder über eine DB-Überschreibung noch über einen Schalter im Dashboard. Siehe > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> Die Spalte `Neustart` kennzeichnet Flags mit `requiresRestart: true` — der Wert wird -> sofort gespeichert, tritt jedoch erst nach dem Neuladen des Prozesses in Kraft. Enum- -> Flags lehnen jeden Wert außerhalb ihrer zulässigen Menge ab (serverseitig sowohl in +> Die Spalte `Restart` kennzeichnet Flags mit `requiresRestart: true` — der Wert wird +> sofort gespeichert, tritt aber erst nach einem Neustart des Prozesses in Kraft. Enum- +> Flags lehnen jeden Wert außerhalb ihrer zulässigen Wertemenge ab (serverseitig sowohl in > `setFeatureFlagOverride()` als auch im REST-Handler `PUT` validiert). --- @@ -174,15 +176,15 @@ Navigieren Sie zu **Dashboard → Einstellungen → Feature-Flags** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) unterstützt: -- **Suche** nach Schlüssel oder Beschreibung und **Filterung** nach Kategorie (zuzüglich einer synthetischen Ansicht - **Neustart erforderlich**). -- Einen **Umschalter** für boolesche Flags und eine **Dropdown-Liste** für Enum-Flags +- **Suche** nach Schlüssel oder Beschreibung und **Filterung** nach Kategorie (einschließlich einer synthetischen + Ansicht **Neustart erforderlich**). +- Einen **Umschalter** für boolesche Flags und ein **Dropdown-Menü** für Enum-Flags (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - Ein **Quellen-Badge** pro Flag — `DB`, `ENV` oder `DEF` —, das anzeigt, woher der effektive Wert stammt. -- Eine Schaltfläche **Zurücksetzen** (wird nur für aus `DB` stammende Flags angezeigt), um die Überschreibung zu entfernen, - sowie unten eine Schaltfläche **Alle Überschreibungen zurücksetzen**. -- Ein Banner **Server neu starten**, wenn ein Flag mit `requiresRestart` geändert wird. +- Eine Schaltfläche **Zurücksetzen** (wird nur für Flags mit der Quelle `DB` angezeigt), um die Überschreibung zu + entfernen, sowie unten eine Schaltfläche **Alle Überschreibungen zurücksetzen**. +- Ein Banner **Server neu starten**, wenn ein `requiresRestart`-Flag geändert wird. ### REST-API @@ -210,7 +212,7 @@ Gibt jedes Flag mit seinem effektiven Wert, seiner Quelle und einer Zusammenfass "requiresRestart": false, "warningLevel": "caution", }, - // ... alle 72 Flags + // ... alle 74 Flags ], "summary": { "total": 56, @@ -224,24 +226,24 @@ Gibt jedes Flag mit seinem effektiven Wert, seiner Quelle und einer Zusammenfass #### `PUT /api/settings/feature-flags` -Legt eine einzelne Überschreibung fest oder entfernt sie. Body: `{ key: string; value?: string }`. -Wird `value` weggelassen, wird die Überschreibung entfernt (und der Umgebungs- bzw. Standardwert wiederhergestellt). +Legt eine einzelne Überschreibung fest oder entfernt sie. Anforderungstext: `{ key: string; value?: string }`. +Wird `value` weggelassen, wird die Überschreibung entfernt (wodurch der Umgebungs- bzw. Standardwert wiederhergestellt wird). ```bash -# DB-Überschreibung festlegen +# Eine DB-Überschreibung festlegen curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Überschreibung entfernen (kein "value") +# Die Überschreibung entfernen (ohne "value") curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Die Antwort gibt den neuen `effectiveValue`/`source`, den `previousValue`/ -`previousSource` sowie `requiresRestart` zurück. Unbekannte Schlüssel und Enum-Werte -außerhalb des zulässigen Bereichs werden mit `400` abgelehnt. +Die Antwort gibt den neuen `effectiveValue`/die neue `source`, den `previousValue`/ +die `previousSource` sowie `requiresRestart` zurück. Unbekannte Schlüssel und Enum-Werte +außerhalb des gültigen Bereichs werden mit `400` abgelehnt. #### `DELETE /api/settings/feature-flags` diff --git a/docs/i18n/de/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/de/docs/reference/PROVIDER_REFERENCE.md index 1f602dc9dec6..89dd01117b34 100644 --- a/docs/i18n/de/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/de/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > **Automatisch generiert** aus `src/shared/constants/providers.ts` — nicht manuell bearbeiten. > Neu generieren mit: `npm run gen:provider-reference` -> **Zuletzt generiert:** 2026-09-17 +> **Zuletzt generiert:** 2026-09-18 -Anbieter insgesamt: **359**. Siehe Aufschlüsselung nach Kategorien unten. +Anzahl der Anbieter: **359**. Siehe Aufschlüsselung nach Kategorien unten. ## Kategorien @@ -34,47 +34,47 @@ Verwenden Sie das Dashboard unter `/dashboard/providers`, um die einzelnen Anbie ## Anbieter ohne Authentifizierung (kein Schlüssel erforderlich) (10) -| ID | Alias | Name | Tags | Website | Hinweise | Tool-Aufrufe | -| ----------------------- | ---------- | ------------------------- | ------------------------------ | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | -| `aihorde` | `horde` | AI Horde | Keine Authentifizierung | [Link](https://aihorde.net) | Kein API-Schlüssel erforderlich — verwendet den dokumentierten anonymen Schlüssel von AI Horde. Das Hinzufügen eines kostenlosen Schlüssels von aihorde.net ist optional und sorgt lediglich für eine höhere Warteschlangenpriorität (Kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Keine Authentifizierung | [Link](https://augmentcode.com) | OmniRoute speichert keinen API-Schlüssel. Installieren Sie die Auggie CLI und führen Sie auf diesem Rechner `auggie login` aus. Anschließend startet OmniRoute sie für jede Anfrage lokal. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Keine Authentifizierung | [Link](https://playground.ai.cloudflare.com) | Keine Zugangsdaten erforderlich — anonyme Browsersitzungen über ein durch Reverse Engineering erschlossenes cf_agent-WebSocket-Protokoll (Playwright-Transport). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Keine Authentifizierung | [Link](https://developers.openai.com/codex/cli) | OmniRoute speichert kein Token. Der App-Server der Codex CLI verwaltet seine eigene ChatGPT-Anmeldung (~/.codex/auth.json, automatische Aktualisierung). Verwenden Sie „Mit ChatGPT anmelden“, falls die CLI noch nicht authentifiziert ist. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Keine Authentifizierung | [Link](https://docs.devin.ai/work-with-devin/devin-cli) | Die Authentifizierung wird von der offiziellen Devin CLI in ihrem isolierten Bridge-Volume verwaltet. | simuliert | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Keine Authentifizierung | [Link](https://duckduckgo.com/duckchat) | Keine Zugangsdaten erforderlich — DuckDuckGo AI Chat ist anonym und kostenlos. | simuliert | -| `opencode` | `oc` | OpenCode Free | Keine Authentifizierung | [Link](https://opencode.ai) | Kein API-Schlüssel erforderlich — verwendet den öffentlichen kostenlosen Endpunkt von OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Keine Authentifizierung | [Link](https://uncloseai.com) | Keine Authentifizierung erforderlich. Die API akzeptiert jede nicht leere Zeichenfolge als Schlüssel zur Identifizierung. Falls ältere integrierte Modelle den Fehler 404 zurückgeben, verwenden Sie „Verfügbare Modelle“ → „Von /models importieren“ oder „Automatisch synchronisieren“; verifiziertes aktives Modell: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Keine Authentifizierung, Video | [Link](https://veoaifree.com) | Keine Authentifizierung erforderlich. Auf 6 Anfragen pro Stunde und IP-Adresse begrenzt. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Keine Authentifizierung | [Link](https://zcode.z.ai) | OmniRoute speichert keinen API-Schlüssel. Der lokale ZCode-App-Server verwendet die vorhandene builtin:zai-coding-plan-Anmeldung. | — | +| ID | Alias | Name | Tags | Website | Hinweise | Tool-Aufrufe | +| ----------------------- | ---------- | ------------------------- | ------------------------------ | ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | +| `aihorde` | `horde` | AI Horde | Keine Authentifizierung | [Link](https://aihorde.net) | Kein API-Schlüssel erforderlich — verwendet den dokumentierten anonymen Schlüssel von AI Horde. Das Hinzufügen eines kostenlosen Schlüssels von aihorde.net ist optional und bietet lediglich eine höhere Priorität in der Warteschlange (Kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Keine Authentifizierung | [Link](https://augmentcode.com) | OmniRoute speichert keinen API-Schlüssel. Installieren Sie die Auggie CLI und führen Sie auf diesem Rechner `auggie login` aus. Anschließend startet OmniRoute sie lokal für jede Anfrage. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Keine Authentifizierung | [Link](https://playground.ai.cloudflare.com) | Keine Zugangsdaten erforderlich — anonyme Browsersitzungen über ein zurückentwickeltes cf_agent-WebSocket-Protokoll (Playwright-Transport). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Keine Authentifizierung | [Link](https://developers.openai.com/codex/cli) | OmniRoute speichert kein Token. Der App-Server der Codex CLI verwaltet seine eigene ChatGPT-Anmeldung (~/.codex/auth.json, automatische Aktualisierung). Verwenden Sie „Mit ChatGPT anmelden“, wenn die CLI noch nicht authentifiziert ist. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Keine Authentifizierung | [Link](https://docs.devin.ai/work-with-devin/devin-cli) | Die Authentifizierung wird von der offiziellen Devin CLI in ihrem isolierten Bridge-Volume verwaltet. | emuliert | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Keine Authentifizierung | [Link](https://duckduckgo.com/duckchat) | Keine Zugangsdaten erforderlich — DuckDuckGo AI Chat ist anonym und kostenlos. | emuliert | +| `opencode` | `oc` | OpenCode Free | Keine Authentifizierung | [Link](https://opencode.ai) | Kein API-Schlüssel erforderlich — verwendet den öffentlichen kostenlosen Endpunkt von OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Keine Authentifizierung | [Link](https://uncloseai.com) | Keine Authentifizierung erforderlich. Die API akzeptiert jede nicht leere Zeichenfolge als Schlüssel zur Identifikation. Wenn ältere integrierte Modelle den Fehler 404 zurückgeben, verwenden Sie Verfügbare Modelle → Aus /models importieren oder Automatisch synchronisieren; verifiziertes aktives Modell: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Keine Authentifizierung, Video | [Link](https://veoaifree.com) | Keine Authentifizierung erforderlich. Begrenzt auf 6 Anfragen pro Stunde und IP-Adresse. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Keine Authentifizierung | [Link](https://zcode.z.ai) | OmniRoute speichert keinen API-Schlüssel. Der lokale ZCode-App-Server verwendet die bestehende Anmeldung für builtin:zai-coding-plan. | — | ## OAuth-Anbieter (24) -| ID | Alias | Name | Tags | Website | Hinweise | -| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [Link](https://antigravity.google) | Importieren Sie Ihre Anmeldung der Antigravity CLI (`agy`), indem Sie deren Token-Datei einfügen/hochladen, erkennen Sie automatisch eine lokale CLI-Anmeldung oder melden Sie sich mit Google an. Verwendet dasselbe Antigravity-Backend (einschließlich Claude-Modellen). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [Link](https://aws.amazon.com/q/developer/) | Verwendet dieselbe AWS Builder ID bzw. denselben Ablauf für importierte Aktualisierungstoken wie Kiro, verwaltet Amazon-Q-Verbindungen jedoch separat. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [Link](https://cline.bot/cline-pass) | ClinePass ist Clines Abonnement für 9,99 $/Monat, das 10 offene Coding-Modelle bündelt. Melden Sie sich mit Ihrem Cline-Konto an (dieselbe Anmeldung wie für die Cline CLI/IDE) oder fügen Sie einen direkten ClinePass-API-Schlüssel ein (app.cline.bot → Einstellungen → API-Schlüssel). Ein ClinePass-Abonnement schaltet die cline-pass/*-Modelle frei. Verwendet den Cline-WorkOS-OAuth-Ablauf erneut. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [Link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Melden Sie sich über den offiziellen CLI-Gerätecode-Ablauf an oder fügen Sie einen direkten API-Schlüssel ein (wird als Authorization: Bearer gesendet). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [Link](https://cli.devin.ai) | Erfordert die Devin-CLI-Binärdatei. Führen Sie zur Authentifizierung `devin auth login` aus oder geben Sie Ihren WINDSURF_API_KEY an. Installation: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [Link](https://devin.ai) | Fügen Sie einen vorhandenen Devin-API-Schlüssel aus einer authentifizierten Devin-Sitzung ein. Verfügbarkeit und Schritte zum Exportieren des Schlüssels variieren je nach Devin-Version und Konto. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Geben Sie in den Anbietereinstellungen die URL Ihrer GHE-Instanz ein (z. B. https://ghe.company.com) und authentifizieren Sie sich anschließend über den Geräteablauf. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [Link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth ist nicht konfiguriert. Registrieren Sie unter https://gitlab.com/-/profile/applications eine OAuth-Anwendung mit der Weiterleitungs-URI http://localhost:20128/callback und den Berechtigungsbereichen "ai_features read_user", legen Sie anschließend GITLAB_DUO_OAUTH_CLIENT_ID (und optional GITLAB_DUO_OAUTH_CLIENT_SECRET) fest und starten Sie neu. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Melden Sie sich über Ihren Browser an oder fügen Sie Ihre ~/.grok/auth.json (oder das JWT-Zugriffstoken) aus der Grok Build CLI ein; refresh_token wird in beiden Fällen automatisch rotiert. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [Link](https://www.kimi.com/code?aff=omniroute) | Melden Sie sich mit demselben Kimi-Konto an, das von der Kimi Code CLI verwendet wird. OmniRoute verwendet den CLI-OAuth-Ablauf und die Endpunkte des Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Kostenloser Tarif: 50 Credits/Monat (~25.000–100.000 Token). ⚠️ Die Nutzungsbedingungen von Kiro untersagen die Verwendung mit Proxys/Harnesses von Drittanbietern. | -| `openference` | `of` | Openference | OAuth | [Link](https://openference.com) | Melden Sie sich mit Ihrem Openference-Konto an, um Anfragen über api.openference.com weiterzuleiten. Für die Inferenz ist ein aktiver Tarif erforderlich — OAuth kann die Authentifizierung erfolgreich durchführen, ohne aktiven Tarif jedoch den Statuscode 402 zurückgeben. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [Link](https://trae.ai) | Trae ist eine KI-native IDE von ByteDance (SOLO-Remote-Agent). Autorisieren Sie den Zugriff im Pop-up über trae.ai oder melden Sie sich bei solo.trae.ai an und fügen Sie das Cloud-IDE-JWT (wird als 'Authorization: Cloud-IDE-JWT ' gesendet, Gültigkeitsdauer ca. 14 Tage) als Zugriffstoken ein; web_id/biz_user_id/user_unique_id/scope/tenant/region werden über providerSpecificData weitergegeben. Für eingefügte Token gibt es keine Aktualisierung im Headless-Betrieb — fügen Sie das Token nach Ablauf erneut ein. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [Link](https://x.ai) | Melden Sie sich mit xAI an, um Modelle von api.x.ai wie Grok 4.5 zu verwenden. Dies ist von Grok-Build-JWT-Sitzungen getrennt, die cli-chat-proxy.grok.com und grok-build-Modellaliase verwenden. | -| `zed` | `zd` | Zed IDE | OAuth | [Link](https://zed.dev) | Zed speichert die Zugangsdaten von LLM-Anbietern (OpenAI, Anthropic, Google, Mistral, xAI) im Schlüsselbund des Betriebssystems. Verwenden Sie die Schaltfläche „Importieren“ unten, um sie automatisch zu erkennen und zu importieren. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [Link](https://zed.dev) | Melden Sie sich mit Ihrem Zed-Konto an (Anmeldung über die native App). OmniRoute generiert ein einmaliges RSA-Schlüsselpaar und öffnet zed.dev, um es zu autorisieren — kopieren Sie bei einer Remote-/Headless-Installation die resultierende 127.0.0.1-Callback-URL aus der Adressleiste Ihres Browsers und fügen Sie sie hier ein. Dieser Eintrag unterscheidet sich vom oben aufgeführten Zugangsdatenimport „Zed IDE“: Er leitet Chat-Vervollständigungen über Zeds eigenen gehosteten Modellaggregator (cloud.zed.dev) weiter, der Anthropic-/OpenAI-/Google-/xAI-Modelle im Rahmen Ihres Zed-Tarifs bereitstellt. | +| ID | Alias | Name | Tags | Website | Hinweise | +| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `agy` | `agy` | Antigravity CLI | OAuth | [Link](https://antigravity.google) | Importieren Sie Ihre Anmeldung bei Antigravity CLI (`agy`) (fügen Sie die Token-Datei ein oder laden Sie sie hoch), lassen Sie eine lokale CLI-Anmeldung automatisch erkennen oder melden Sie sich mit Google an. Nutzt dasselbe Antigravity-Backend (einschließlich Claude-Modelle). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [Link](https://aws.amazon.com/q/developer/) | Verwendet dieselbe AWS Builder ID bzw. denselben Ablauf für importierte Aktualisierungs-Token wie Kiro, hält Amazon-Q-Verbindungen jedoch getrennt. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [Link](https://cline.bot/cline-pass) | ClinePass ist Clines Abonnement für 9,99 $/Monat, das 10 offene Programmiermodelle bündelt. Melden Sie sich mit Ihrem Cline-Konto an (dieselben Anmeldedaten wie für die Cline CLI/IDE) oder fügen Sie einen direkten ClinePass-API-Schlüssel ein (app.cline.bot → Einstellungen → API-Schlüssel). Ein ClinePass-Abonnement schaltet die cline-pass/*-Modelle frei. Verwendet den Cline-WorkOS-OAuth-Ablauf erneut. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [Link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Melden Sie sich über den offiziellen CLI-Gerätecode-Ablauf an oder fügen Sie einen direkten API-Schlüssel ein (wird als Authorization: Bearer gesendet). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [Link](https://cli.devin.ai) | Erfordert die Devin-CLI-Binärdatei. Führen Sie zur Authentifizierung `devin auth login` aus oder geben Sie Ihren WINDSURF_API_KEY an. Installation: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [Link](https://devin.ai) | Fügen Sie einen vorhandenen Devin-API-Schlüssel aus einer authentifizierten Devin-Sitzung ein. Verfügbarkeit und Schritte für den Schlüsselexport variieren je nach Devin-Version und Konto. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Geben Sie die URL Ihrer GHE-Instanz (z. B. https://ghe.company.com) in den Anbietereinstellungen ein und authentifizieren Sie sich anschließend über den Geräteablauf. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [Link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth ist nicht konfiguriert. Registrieren Sie unter https://gitlab.com/-/profile/applications eine OAuth-Anwendung mit der Weiterleitungs-URI http://localhost:20128/callback und den Berechtigungsbereichen "ai_features read_user". Legen Sie anschließend GITLAB_DUO_OAUTH_CLIENT_ID (und optional GITLAB_DUO_OAUTH_CLIENT_SECRET) fest und starten Sie neu. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Melden Sie sich über Ihren Browser an oder fügen Sie Ihre ~/.grok/auth.json-Datei (oder das JWT-Zugriffs-Token) aus der Grok Build CLI ein; refresh_token wird in beiden Fällen automatisch rotiert. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [Link](https://www.kimi.com/code?aff=omniroute) | Melden Sie sich mit demselben Kimi-Konto an, das von Kimi Code CLI verwendet wird. OmniRoute verwendet den CLI-OAuth-Ablauf und die Endpunkte des Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Kostenloser Tarif: 50 Credits/Monat (~25.000–100.000 Token). ⚠️ Die Nutzungsbedingungen von Kiro untersagen die Verwendung von Drittanbieter-Proxys/-Frameworks. | +| `openference` | `of` | Openference | OAuth | [Link](https://openference.com) | Melden Sie sich mit Ihrem Openference-Konto an, um Anfragen über api.openference.com weiterzuleiten. Beinhaltet kostenlosen Zugriff auf Qwen3.8 27b und Llama 3.2 3B — die aktuellen Tarifbedingungen finden Sie unter openference.com/pricing. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [Link](https://trae.ai) | Trae ist eine KI-native IDE von ByteDance (SOLO-Remote-Agent). Autorisieren Sie den Zugriff über trae.ai im Pop-up oder melden Sie sich unter solo.trae.ai an und fügen Sie das Cloud-IDE-JWT als Zugriffs-Token ein (wird als 'Authorization: Cloud-IDE-JWT ' gesendet, Lebensdauer ca. 14 Tage); web_id/biz_user_id/user_unique_id/scope/tenant/region werden über providerSpecificData weitergegeben. Für eingefügte Token ist keine Headless-Aktualisierung verfügbar — fügen Sie sie nach Ablauf erneut ein. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [Link](https://x.ai) | Melden Sie sich bei xAI an, um api.x.ai-Modelle wie Grok 4.5 zu verwenden. Dies ist von Grok-Build-JWT-Sitzungen getrennt, die cli-chat-proxy.grok.com und grok-build-Modellaliase verwenden. | +| `zed` | `zd` | Zed IDE | OAuth | [Link](https://zed.dev) | Zed speichert die Zugangsdaten für LLM-Anbieter (OpenAI, Anthropic, Google, Mistral, xAI) im Schlüsselbund des Betriebssystems. Verwenden Sie die Schaltfläche „Importieren“ unten, um sie automatisch zu erkennen und zu importieren. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [Link](https://zed.dev) | Melden Sie sich mit Ihrem Zed-Konto an (Anmeldung über die native App). OmniRoute generiert ein einmaliges RSA-Schlüsselpaar und öffnet zed.dev, um es zu autorisieren — kopieren Sie bei einer Remote-/Headless-Installation die resultierende 127.0.0.1-Callback-URL aus der Adressleiste Ihres Browsers und fügen Sie sie hier wieder ein. Dieser Eintrag unterscheidet sich vom oben aufgeführten Eintrag „Zed IDE“ zum Importieren von Zugangsdaten: Er leitet Chat-Vervollständigungen über Zeds eigenen gehosteten Modellaggregator (cloud.zed.dev) weiter, der im Rahmen Ihres Zed-Tarifs Anthropic-/OpenAI-/Google-/xAI-Modelle bereitstellt. | ## Web-Cookie-Anbieter (34) @@ -117,250 +117,250 @@ Verwenden Sie das Dashboard unter `/dashboard/providers`, um die einzelnen Anbie ## API-Schlüssel-Anbieter (kostenpflichtig / kostenpflichtig mit Gratisguthaben) (242) -| ID | Alias | Name | Tags | Website | Hinweise | -| ------------------------ | --------------- | ------------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `360ai` | `360ai` | 360 AI | API-Schlüssel | [Link](https://ai.360.cn) | API-Schlüssel unter ai.360.cn abrufen | -| `agentrouter` | `agentrouter` | AgentRouter | API-Schlüssel, Aggregator | [Link](https://agentrouter.org) | 200 $ kostenloses Guthaben bei der Registrierung – Gateway für Multi-Modell-Routing | -| `agnes` | `agnes` | Agnes AI | API-Schlüssel, Video | [Link](https://agnes-ai.com) | API-Schlüssel unter agnes-ai.com abrufen | -| `agnes-cn` | `agnescn` | Agnes AI (China) | API-Schlüssel | [Link](https://api.agnes-ai.cn) | API-Schlüssel von der chinesischen Agnes-Website abrufen. | -| `ai21` | `ai21` | AI21 Labs | API-Schlüssel | [Link](https://www.ai21.com) | 10 $ Testguthaben bei der Registrierung (3 Monate gültig), keine Kreditkarte erforderlich | -| `aimlapi` | `aiml` | AI/ML API | API-Schlüssel, Aggregator | [Link](https://aimlapi.com) | Kostenloser Tarif pausiert (2026) — AI/ML API ist jetzt ausschließlich nutzungsbasiert (Mindestaufladung 20 $); kein wiederkehrendes kostenloses Guthaben. | -| `ainative` | `ainative` | AINative Studio | API-Schlüssel | [Link](https://ainative.studio) | Unter ainative.studio einen kostenlosen API-Schlüssel erstellen (keine Kreditkarte) und ihn anschließend hier als Bearer-Token einfügen. | -| `aion` | `aion` | Aion Labs | API-Schlüssel | [Link](https://www.aionlabs.ai) | Unter aionlabs.ai einen kostenlosen API-Schlüssel erstellen (keine Kreditkarte) und ihn anschließend hier als Bearer-Token einfügen. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API-Schlüssel | [Link](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (China) | API-Schlüssel | [Link](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API-Schlüssel | [Link](https://developer.ant-ling.com/en/docs/) | Registrieren und in der Ant Ling API-Konsole (https://chat.ant-ling.com/open) einen API-Schlüssel erstellen, dann diesen hier einfügen. OmniRoute leitet Chat-Datenverkehr an https://api.ant-ling.com/v1/chat/completions weiter; der Anbieter ist OpenAI-kompatibel und stellt außerdem eine Anthropic-kompatible Schnittstelle bereit. | -| `anthropic` | `anthropic` | Anthropic | API-Schlüssel | [Link](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API-Schlüssel, Aggregator | [Link](https://anyapi.ai) | Kostenloser Tarif: 100.000 ANY-Tokens/Tag und 100 RPM für berechtigte Free-/Basic-Modelle; keine Kreditkarte erforderlich. | -| `api-airforce` | `af` | Api.airforce | API-Schlüssel | [Link](https://api.airforce) | 55 Modelle im kostenlosen Tarif, darunter Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash und DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API-Schlüssel | [Link](https://arcee.ai) | API-Schlüssel unter arcee.ai abrufen | -| `auriko` | `auriko` | Auriko | API-Schlüssel, Aggregator | [Link](https://www.auriko.ai) | Der kostenlose Tarif bietet 1.000 Plattform-RPM und 10.000 BYOK-RPM. Für Plattform-Inferenz fallen weiterhin Anbieterkosten an; es handelt sich weder um einen kostenlosen Token-Pool noch um unbegrenzte kostenlose Inferenz. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API-Schlüssel, Unternehmen | [Link](https://learn.microsoft.com/azure/ai-foundry) | Verwenden Sie Ihren Azure AI Foundry-Schlüssel. Die Basis-URL kann https://.services.ai.azure.com/openai/v1/ oder https://.openai.azure.com/openai/v1/ lauten. | -| `azure-openai` | `azure` | Azure OpenAI | API-Schlüssel, Unternehmen | [Link](https://azure.microsoft.com/products/ai-services/openai-service) | Verwenden Sie Ihren Azure OpenAI-API-Schlüssel. Als Basis-URL sollte der Endpunkt Ihrer Ressource verwendet werden, beispielsweise https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API-Schlüssel | [Link](https://b.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible LLM-Gateway von b.ai (nicht zu verwechseln mit TheB.AI). Erstellen Sie einen Schlüssel unter https://docs.b.ai und verwenden Sie anschließend https://api.b.ai/v1 als OpenAI-kompatible Basis-URL. | -| `baichuan` | `baichuan` | Baichuan | API-Schlüssel | [Link](https://www.baichuan-ai.com/) | API-Schlüssel unter platform.baichuan-ai.com abrufen | -| `baidu` | `baidu` | Baidu (ERNIE) | API-Schlüssel | [Link](https://ernie.baidu.com/) | API-Schlüssel unter console.bce.baidu.com abrufen | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API-Schlüssel | [Link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API-Schlüssel | [Link](https://baseten.co) | 30 $ kostenloses Testguthaben für GPU-Inferenz | -| `bazaarlink` | `bzl` | BazaarLink | API-Schlüssel | [Link](https://bazaarlink.ai) | Verwenden Sie Ihren BazaarLink-API-Schlüssel (beginnt mit sk-bl-) in Authorization: Bearer . Das OpenAI SDK funktioniert mit der Basis-URL https://bazaarlink.ai/api/v1. Modelle verwenden das Format Anbieter/Modellname. | -| `bedrock` | `bedrock` | Amazon Bedrock | API-Schlüssel, Unternehmen | [Link](https://aws.amazon.com/bedrock) | Verwenden Sie Ihren Amazon Bedrock-API-Schlüssel und konfigurieren Sie die AWS-Region, in der Ihre Modelle aktiviert sind (beispielsweise eu-west-2). OmniRoute ruft die native Converse API von Bedrock direkt auf. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API-Schlüssel, Bild | [Link](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API-Schlüssel | [Link](https://blackbox.ai) | ⚠️ **VERALTET.** api.blackbox.ai gibt für jede Pfadvariante HTTP 404 zurück (Prüfung vom 2026-08-21); die öffentliche Inferenzschnittstelle wurde auf den zugriffsbeschränkten Endpunkt enterprise.blackbox.ai/v1 verschoben. | -| `bluesminds` | `bm` | BluesMinds | API-Schlüssel | [Link](https://www.bluesminds.com) | Tägliches kostenloses Pi-Guthaben — unterstützt mehr als 200 Modelle, darunter GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen und Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API-Schlüssel | [Link](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API-Schlüssel | [Link](https://bytez.com) | 1 $ kostenloses Guthaben, das alle 4 Wochen erneuert wird | -| `cerebras` | `cerebras` | Cerebras | API-Schlüssel | [Link](https://inference.cerebras.ai) | Einmaliges Registrierungsguthaben von 5 $ (30 Tage gültig); eine Zahlungsmethode ist erforderlich. Kein wiederkehrender kostenloser Tarif. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API-Schlüssel | [Link](https://hyper.charm.land) | 100 kostenlose Hypercredits pro Monat bei der Registrierung | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API-Schlüssel, Aggregator | [Link](https://api.oriper.com) | Offizielle Metadaten werben mit 2 Mio. Tokens/Monat, aber die öffentliche Website und die Dokumentation waren während der Prüfung gesperrt; das Kontingent und die Markenzuordnung sind daher als unbestätigt zu betrachten. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-Schlüssel, Aggregator | [Link](https://chatanywhere.tech) | Nur für persönliche, Bildungs- oder Forschungszwecke: Die öffentliche Dokumentation nennt 10.000 Punkte/Tag und 200 Anfragen/Tag pro IP/Schlüssel; nicht für kommerziellen Datenverkehr verwenden. | -| `cheaperinference` | `cinf` | Cheaper Inference | API-Schlüssel | [Link](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API-Schlüssel | [Link](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API-Schlüssel, Aggregator | [Link](https://chutes.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von Chutes. | -| `clarifai` | `clarifai` | Clarifai | API-Schlüssel, Unternehmen | [Link](https://docs.clarifai.com) | Verwenden Sie Ihr Clarifai-PAT oder einen anwendungsspezifischen API-Schlüssel. OmniRoute verwendet den OpenAI-kompatiblen Endpunkt unter https://api.clarifai.com/v2/ext/openai/v1 und authentifiziert sich mit Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-Schlüssel, Aggregator | [Link](https://cloudcode.one) | Zu den veröffentlichten kostenlosen Modellen gehören glm-4.7-flash und glm-4.6v-flash; es wird kein numerisches Kontingent angegeben, und die Schlüsselerstellung kann Guthaben oder einen Gutschein erfordern. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-Schlüssel | [Link](https://developers.cloudflare.com/workers-ai) | Erfordert API-Token UND Konto-ID (zu finden unter dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API-Schlüssel | [Link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API-Schlüssel | [Link](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API-Schlüssel | [Link](https://cohere.com) | Kostenlose Testversion: 1.000 API-Aufrufe/Monat zum Testen, keine Kreditkarte erforderlich | -| `command-code` | `cmd` | Command Code | API-Schlüssel | [Link](https://commandcode.ai/) | Verwenden Sie einen Command Code-API-Schlüssel. Anfragen werden an den Endpunkt /provider/v1/chat/completions von Command Code gesendet. | -| `coze` | `coze` | Coze | API-Schlüssel | [Link](https://coze.com) | API-Schlüssel unter coze.com/open/api abrufen | -| `crof` | `crof` | CrofAI | API-Schlüssel | [Link](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API-Schlüssel | [Link](https://cursor.com/dashboard/api) | Fügen Sie einen Cursor-Benutzer-API-Schlüssel (crsr_...) von cursor.com/dashboard/api ein. OmniRoute tauscht ihn bei Bedarf gegen ein Sitzungstoken aus; eine IDE oder eine cursor-agent-Installation ist nicht erforderlich. Die Nutzung wird dem Cursor-Tarif in Rechnung gestellt, dem der Schlüssel zugeordnet ist. | -| `dahl` | `dahl` | Dahl | API-Schlüssel | [Link](https://inference.dahl.global) | Klicken Sie auf „Konto hinzufügen“, um automatisch ein Token zu generieren, oder fügen Sie einen manuellen API-Schlüssel hinzu. | -| `databricks` | `databricks` | Databricks | API-Schlüssel, Unternehmen | [Link](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API-Schlüssel, Unternehmen | [Link](https://docs.datarobot.com) | Verwenden Sie Ihr DataRobot-API-Token. Die optionale Basis-URL kann der Kontostamm (für LLM Gateway) oder eine Bereitstellungs-URL unter /api/v2/deployments/ sein. | -| `deepai` | `deepai` | DeepAI | API-Schlüssel, Bild | [Link](https://deepai.org) | Verwenden Sie Ihren DeepAI-API-Schlüssel. Sie erhalten ihn unter deepai.org — ein Pro-Abonnement (9,99 $/Monat) ist erforderlich. | -| `deepinfra` | `deepinfra` | DeepInfra | API-Schlüssel | [Link](https://deepinfra.com) | Kostenloses Startguthaben nach der Registrierung für API-Tests und die Erkundung von Modellen | -| `deepseek` | `ds` | DeepSeek | API-Schlüssel | [Link](https://platform.deepseek.com) | 5 Mio. kostenlose Token bei der Registrierung – keine Kreditkarte erforderlich | -| `dgrid` | `dgrid` | DGrid | API-Schlüssel | [Link](https://dgrid.ai) | DGrid Free Models Router: 10 Anfragen/Minute und 100 Anfragen/Tag. Eine einmalige Aufladung von 5 $ schaltet bis zu 20 Anfragen/Minute und 1.000 Anfragen/Tag frei. | -| `dify` | `dify` | Dify | API-Schlüssel | [Link](https://dify.ai) | Rufen Sie den API-Schlüssel von Ihrer Dify-Instanz ab. | -| `digitalocean` | `digitalocean` | DigitalOcean | API-Schlüssel | [Link](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API-Schlüssel | [Link](https://dit.ai) | Verwenden Sie Ihren dit.ai-API-Schlüssel in Authorization: Bearer . Vollständig OpenAI-kompatibel — als direkter Ersatz verwendbar; ändern Sie lediglich die Basis-URL in https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API-Schlüssel | [Link](https://doubao.com) | API-Schlüssel unter console.volcengine.com abrufen | -| `dxnt` | `dxnt` | DXNT / DX Token | API-Schlüssel, Aggregator | [Link](https://www.dxnt.com) | Für kostenlose Konten sind 100 Aufrufe/Tag dokumentiert; das Kontingent kann durch Einladungen erhöht werden und je nach Konto variieren. | -| `electronhub` | `electronhub` | Electron Hub | API-Schlüssel, Aggregator | [Link](https://www.electronhub.ai) | Kostenloser Tarif: 5 RPM, wöchentlich 0,25 $ Guthaben und 10 Neutrinos/Tag für :free-Modelle; zusätzlich gelten Familienbudgets. | -| `empower` | `empower` | Empower | API-Schlüssel, Aggregator | [Link](https://docs.empower.dev) | Bearer-API-Schlüssel für den OpenAI-kompatiblen Endpunkt von Empower. | -| `eurouter` | `eurouter` | EURouter | API-Schlüssel, Aggregator | [Link](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API-Schlüssel | [Link](https://factory.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von Factory. | -| `fal-ai` | `fal` | Fal.ai | API-Schlüssel, Bild | [Link](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API-Schlüssel, Aggregator | [Link](https://fastrouter.ai) | Modelle mit dem Suffix :free ermöglichen 10 Anfragen/Tag pro Organisation und Modell; die Verfügbarkeit kann sich ändern. | -| `featherless-ai` | `featherless` | Featherless AI | API-Schlüssel | [Link](https://featherless.ai) | Kostenloser Tarif verfügbar — keine Kreditkarte erforderlich | -| `fenayai` | `fenayai` | FenayAI | API-Schlüssel, Aggregator | [Link](https://fenayai.com) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von FenayAI. | -| `fireworks` | `fireworks` | Fireworks AI | API-Schlüssel | [Link](https://fireworks.ai) | 1 $ kostenloses Startguthaben bei der Registrierung für API-Tests | -| `free-ai` | `free-ai` | Free.ai | API-Schlüssel, Aggregator | [Link](https://free.ai) | 30.000 Token/Tag decken nach der E-Mail-Verifizierung selbst gehostete Modelle ab. Eine Nutzung über dieses Kontingent hinaus kann zu Rohkosten abgerechnet werden, und externe Premium-Modelle sind kostenpflichtig. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API-Schlüssel | [Link](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API-Schlüssel | [Link](https://freebuff.com) | Freebuff-/Codebuff-Authentifizierungstoken eingeben (über die CLI-Anmeldung oder einen automatisierten Harvester bezogen). | -| `freeinference` | `freeinference` | FreeInference | API-Schlüssel, Aggregator | [Link](https://freeinference.org) | Kostenloser Forschungszugang ohne Kreditkarte; Bewerber, die nicht von Harvard kommen, benötigen eine manuelle Genehmigung, und es wird kein numerisches Kontingent öffentlich garantiert. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API-Schlüssel | [Link](https://freemodel.dev) | $300 kostenloses Guthaben bei der Registrierung — keine Kreditkarte erforderlich. Zugriff auf GPT-5.4 und GPT-5.5 (die neuesten Flaggschiffmodelle von OpenAI) über eine OpenAI-kompatible API. | -| `freetheai` | `fta` | FreeTheAi | API-Schlüssel, Aggregator | [Link](https://freetheai.xyz) | Tritt dem FreeTheAi-Discord bei, um deinen kostenlosen API-Schlüssel zu erhalten. | -| `friendliai` | `friendli` | FriendliAI | API-Schlüssel | [Link](https://friendli.ai) | Kostenloser Tarif für serverlose Inferenz — keine Kreditkarte erforderlich | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Credits unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Credits unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Credits unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Credits unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Credits unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | API-Schlüssel | [Link](https://galadriel.com) | ⚠️ **VERALTET.** api.galadriel.ai wird nicht mehr aufgelöst (Überprüfung am 2026-06-19); die Inferenz-API scheint eingestellt worden zu sein. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API-Schlüssel | [Link](https://aistudio.google.com) | Kostenloser Tarif über Google AI Studio verfügbar; es gelten die aktuellen modellspezifischen Kontingente und regionalen Beschränkungen | -| `getgoapi` | `ggo` | GoAPI | API-Schlüssel, Aggregator | [Link](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API-Schlüssel | [Link](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API-Schlüssel | [Link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Persönliches GitLab-Zugriffstoken für die öffentliche Code Suggestions API. Bei Nichtverwendung von gitlab.com muss eine selbst gehostete Basis-URL konfiguriert werden. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-Schlüssel | [Link](https://opengateway.gitlawb.com) | Kostenloses MiMo (xiaomi/mimo-v2.5) wurde 2026-05 eingestellt — Opengateway ist jetzt ein nutzungsabhängig abgerechnetes Guthaben-Gateway; es gibt kein dauerhaft kostenloses Modell. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-Schlüssel | [Link](https://opengateway.gitlawb.com) | Die kostenlose Nemotron-Aktion endete 2026-06 — die GMI-Cloud-Route ist jetzt nur noch mit nutzungsabhängig abgerechnetem Guthaben verfügbar. | -| `glm` | `glm` | GLM Coding | API-Schlüssel | [Link](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | API-Schlüssel | [Link](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API-Schlüssel | [Link](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API-Schlüssel | [Link](https://greenpt.com) | Das API-Abonnement kann kostenlos erstellt werden; die Inferenz wird pro Token abgerechnet. Es wird kein kostenloses Inferenzkontingent veröffentlicht. | -| `groq` | `groq` | Groq | API-Schlüssel | [Link](https://groq.com) | Kostenloser Tarif: modellspezifische Obergrenzen (200K Token/Tag pro Chatmodell; RPM/RPD siehe console.groq.com/docs/rate-limits) — keine Zahlungsmethode hinterlegt. | -| `haiper` | `hp` | Haiper | API-Schlüssel, Video | [Link](https://haiper.ai) | API-Schlüssel unter haiper.ai/haiper-api abrufen | -| `hcnsec` | `hcnsec` | Huancheng Public API | API-Schlüssel | [Link](https://api.hcnsec.cn) | API-Schlüssel unter api.hcnsec.cn abrufen | -| `helixmind` | `helixmind` | HelixMind | API-Schlüssel, Aggregator | [Link](https://helixmind.online) | Zuvor verbreitete Angaben zu 3 RPM/50 RPD und zur Nutzung ohne Kreditkarte konnten bei der Prüfung am 2026-08-02 nicht bestätigt werden; aktuelle Kontingente und Abrechnung erfordern eine Kontoverifizierung. | -| `helyxai` | `helyxai` | Helyx AI | API-Schlüssel, Aggregator | [Link](https://helyxai.space) | Der aktive kostenlose Tarif dokumentiert 100,000 Token/Tag; die separate Werbeaussage der Website von 2M+ steht dazu im Widerspruch und wird nicht als Kontingentgarantie betrachtet. | -| `heroku` | `heroku` | Heroku AI | API-Schlüssel, Unternehmen | [Link](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API-Schlüssel | [Link](https://huggingface.co) | Kostenlose Inference API für Tausende Modelle (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API-Schlüssel | [Link](https://hyperbolic.xyz) | $1-5 Testguthaben bei der Registrierung für serverlose Inferenz | -| `ideogram` | `ideo` | Ideogram | API-Schlüssel | [Link](https://ideogram.ai) | API-Schlüssel unter ideogram.ai/docs/api abrufen | -| `iflytek` | `iflytek` | iFlytek Spark | API-Schlüssel | [Link](https://xinghuo.xfyun.cn) | API-Schlüssel unter console.xfyun.cn abrufen | -| `inception` | `inception` | Inception | API-Schlüssel | [Link](https://docs.inceptionlabs.ai) | 10M kostenlose Token bei der Registrierung, keine Kreditkarte erforderlich. | -| `inference-net` | `inet` | Inference.net | API-Schlüssel | [Link](https://inference.net) | $25 kostenloses Guthaben bei der Registrierung sowie verfügbare Forschungsförderungen | -| `internlm` | `internlm` | InternLM (Intern-S1) | API-Schlüssel | [Link](https://internlm.intern-ai.org.cn/) | Kostenloses monatliches Kontingent von ca. 1M Eingabe-/3M Ausgabe-Token (ca. 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API-Schlüssel, Einbettung/Neusortierung | [Link](https://jina.ai) | Bearer-API-Schlüssel für api.jina.ai — Einbettungen, Neusortierung, Klassifizierung, Segmentierung und Suche. Dashboard-Schlüssel haben Vorrang vor JINA_AI_API_KEY. Dies ist nicht die Karte für Reader / r.jina.ai und ruft keine URLs ab. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-Schlüssel | [Link](https://jina.ai/reader) | Bearer-API-Schlüssel für die URL-zu-Markdown-Konvertierung über r.jina.ai (nur /v1/web/fetch). Stellt weder /v1/embeddings noch /v1/rerank bereit. Derselbe Jina-Token wie für die Foundation API funktioniert; OmniRoute verwendet einen `jina-ai`-Dashboard-Schlüssel oder JINA_AI_API_KEY erneut, wenn diese Karte leer ist. | -| `kenari` | `kenari` | Kenari | API-Schlüssel | [Link](https://kenari.id) | Verwenden Sie Ihren Kenari-API-Schlüssel (kn-...) in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API-Schlüssel | [Link](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API-Schlüssel, Aggregator | [Link](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (veraltete Moonshot API) | API-Schlüssel | [Link](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-Schlüssel | [Link](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API-Schlüssel | [Link](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API-Schlüssel, Aggregator | [Link](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API-Schlüssel, Video | [Link](https://leonardo.ai) | API-Schlüssel unter leonardo.ai/developer abrufen | -| `liquid` | `liquid` | Liquid AI | API-Schlüssel | [Link](https://liquid.ai) | API-Schlüssel unter liquid.ai abrufen | -| `literouter` | `literouter` | LiteRouter | API-Schlüssel, Aggregator | [Link](https://literouter.com) | Kostenlose Modellvarianten verwenden das Suffix :free; die täglichen Guthabenlimits variieren je nach Modell, und kostenlose Eingaben sind auf 5.000 Token begrenzt. | -| `llamagate` | `llamagate` | LlamaGate | API-Schlüssel | [Link](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-Schlüssel, Aggregator | [Link](https://llm.kiwi) | Der kostenlose Tarif bietet auto und hrLLM; das veröffentlichte Limit von 40 Anfragen pro Stunde gilt für hrLLM. | -| `llm7` | `llm7` | LLM7.io | API-Schlüssel | [Link](https://llm7.io) | Verwenden Sie einen beliebigen nicht leeren Schlüssel (zum Beispiel 'unused'). Wenn ältere integrierte Modelle model_unavailable zurückgeben, verwenden Sie Available Models → Import from /models oder Auto-Sync; verifiziertes aktives Modell: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API-Schlüssel, Aggregator | [Link](https://llmgateway.io) | Gehosteter kostenloser Tarif: Kostenlos angebotene Modelle sind auf 5 Anfragen pro 10 Minuten begrenzt, wenn das Konto kein Guthaben aufweist. | -| `logfare` | `logfare` | Logfare | API-Schlüssel, Aggregator | [Link](https://logfare.ai) | Erstellen Sie unter https://logfare.ai/register ein kostenloses Konto (Benutzername/Passwort, keine E-Mail-Verifizierung), um sofort einen API-Schlüssel zu erhalten, und fügen Sie ihn anschließend hier als Bearer-Token ein. | -| `longcat` | `lc` | LongCat AI | API-Schlüssel | [Link](https://longcat.chat/platform/docs) | Kostenlos: einmaliges Kontingent von 10 Mio. Token nach Kontoregistrierung und KYC-Verifizierung (LongCat-2.0). Nur einmalig — kein wiederkehrendes tägliches/monatliches Kontingent. | -| `magnific` | `freepik` | Magnific | API-Schlüssel, Bild | [Link](https://www.magnific.com) | API-Schlüssel unter magnific.com/user/api-keys abrufen (Header x-magnific-api-key). Ältere Freepik-Entwicklerschlüssel funktionieren weiterhin. | -| `maritalk` | `maritalk` | Maritalk | API-Schlüssel | [Link](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API-Schlüssel, Aggregator | [Link](https://meganova.ai) | Kostenlose Registrierung ohne Karte. Die veröffentlichten modellbezogenen Tier-1-Kontingente belaufen sich insgesamt auf 550 Anfragen pro Tag; sie bilden keinen gemeinsamen globalen Pool, und bei entsprechender Aktivierung können kostenpflichtige Überschreitungen anfallen. | -| `meta-llama` | `meta` | Meta Llama API | API-Schlüssel | [Link](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API-Schlüssel, Video | [Link](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (China) | API-Schlüssel | [Link](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API-Schlüssel | [Link](https://mistral.ai) | Kostenlose Experiment-Stufe: ratenbegrenzter Zugriff auf alle Modelle, keine Kreditkarte erforderlich | -| `mixedbread` | `mxbai` | Mixedbread AI | API-Schlüssel | [Link](https://www.mixedbread.com) | Bearer-API-Schlüssel für die Mixedbread-Einbettungs-API. | -| `mixlayer` | `mixlayer` | Mixlayer | API-Schlüssel, Aggregator | [Link](https://www.mixlayer.com) | Das Modell qwen/qwen3.5-4b-free ist für die Prototypenerstellung kostenlos und ratenbegrenzt; es wurde kein festes öffentliches RPM- oder Tageskontingent bestätigt. | -| `mnn-ai` | `mnn-ai` | MNN AI | API-Schlüssel, Aggregator | [Link](https://mnnai.ru) | Kostenloser Tarif: monatliches Guthaben von $1, 10 RPM und Zugriff nur auf als Free gekennzeichnete Modelle. | -| `modal` | `mdl` | Modal | API-Schlüssel, Unternehmen | [Link](https://modal.com/docs) | Verwenden Sie, sofern aktiviert, den Bearer-Token, der Ihre Modal-Bereitstellung schützt. Die Basis-URL sollte auf Ihre OpenAI-kompatible Modal-App verweisen, zum Beispiel https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API-Schlüssel | [Link](https://modelscope.cn) | Kostenloser Tarif über ModelScope API-Inference — Alibaba-Konto erforderlich. | -| `monsterapi` | `monster` | MonsterAPI | API-Schlüssel | [Link](https://monsterapi.ai) | ⚠️ **VERALTET.** Monster API hat den Betrieb am 2026-06-30 eingestellt. Verwenden Sie alternative OpenAI-kompatible Anbieter. | -| `moonshot` | `moonshot` | Kimi | API-Schlüssel | [Link](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API-Schlüssel | [Link](https://morphllm.com) | Kostenloser Tarif: 250.000 Credits/Monat, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API-Schlüssel | [Link](https://github.com/meta-llama/llama-stack) | Verwenden Sie Ihre Umgebungsvariable META_API_KEY als Bearer-Token. Muse Code CLI verwendet das Wire-Format der OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API-Schlüssel, Aggregator | [Link](https://naga.ac) | API-Schlüssel unter naga.ac abrufen — Registrierung über Google/GitHub/Discord verfügbar. | -| `naga-ai` | `naga-ai` | Naga AI | API-Schlüssel, Aggregator | [Link](https://naga.ac) | Mit :free gekennzeichnete Modelle sind öffentlich aufgeführt, es ist jedoch kein numerisches Kontingent bestätigt. Die Richtlinie von Naga weist darauf hin, dass Prompts und Ausgaben im kostenlosen Tarif erfasst oder für das Training verwendet werden können. | -| `nanogpt` | `nanogpt` | NanoGPT | API-Schlüssel | [Link](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API-Schlüssel | [Link](https://bynara.id) | Erstellen Sie ein kostenloses NaraRouter-Konto, verknüpfen Sie Ihr Telegram-Konto (vor Antworten von /v1 erforderlich) und fügen Sie den Schlüssel anschließend hier als Bearer-Token ein. | -| `navy` | `navy` | NavyAI | API-Schlüssel | [Link](https://api.navy) | Erstellen Sie im NavyAI-Dashboard einen kostenlosen API-Schlüssel und fügen Sie ihn anschließend hier als Bearer-Token ein. | -| `nebius` | `nebius` | Nebius AI | API-Schlüssel | [Link](https://nebius.com) | Bei der Registrierung etwa 1 $ Testguthaben für API-Tests | -| `nlpcloud` | `nlpc` | NLP Cloud | API-Schlüssel | [Link](https://docs.nlpcloud.com) | Verwenden Sie Ihren NLP-Cloud-API-Schlüssel in Authorization: Token . OmniRoute verwendet standardmäßig den Chatbot-Endpunkt unter https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | API-Schlüssel | [Link](https://nomic.ai) | API-Schlüssel unter atlas.nomic.ai abrufen | -| `nous-research` | `nous` | Nous Research | API-Schlüssel | [Link](https://portal.nousresearch.com/help) | Verwenden Sie Ihren Nous-Portal-API-Schlüssel. OmniRoute verwendet den offiziellen OpenAI-kompatiblen Inferenzendpunkt unter https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API-Schlüssel, Video, Aggregator | [Link](https://novita.ai) | Bei der Registrierung 0,50 $ Testguthaben (etwa 1 Jahr gültig) | -| `nscale` | `nscale` | nScale | API-Schlüssel | [Link](https://nscale.com) | Bei der Registrierung 5 $ kostenloses Guthaben für Inferenztests | -| `nube` | `nube` | Nube.sh | API-Schlüssel | [Link](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API-Schlüssel | [Link](https://build.nvidia.com) | Kostenloser Entwicklerzugang: ~40 RPM, über 70 Modelle (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API-Schlüssel, Unternehmen | [Link](https://www.oracle.com/artificial-intelligence/generative-ai) | Verwenden Sie Ihren OCI-Generative-AI-API-Schlüssel oder IAM-Bearer-Token. Die Basis-URL kann https://inference.generativeai..oci.oraclecloud.com/openai/v1/ lauten. | -| `ofoxai` | `ofoxai` | OfoxAI | API-Schlüssel, Aggregator | [Link](https://ofox.ai) | Der aktuelle Katalog bewirbt über 10 kostenlose Modelle ohne öffentliches numerisches Kontingent; prüfen Sie vor dem produktiven Einsatz die Herkunft der Upstream-Anbieter sowie deren Aufbewahrungs- und Trainingsbedingungen. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-Schlüssel | [Link](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API-Schlüssel | [Link](https://1min.ai) | Erstellen Sie unter https://docs.1min.ai/docs/api/create-api-key einen API-Schlüssel und fügen Sie ihn anschließend hier ein. | -| `openadapter` | `oad` | OpenAdapter | API-Schlüssel | [Link](https://openadapter.dev) | Verwenden Sie Ihren OpenAdapter-API-Schlüssel in Authorization: Bearer sk-cv-. Vollständig OpenAI-kompatibel. API-Basis-URL: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API-Schlüssel | [Link](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API-Schlüssel | [Link](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-Schlüssel | [Link](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API-Schlüssel | [Link](https://openference.com) | Kostenloser Tarif: 3-tägiger Test mit Open-Source-Modellen — keine Kreditkarte erforderlich | -| `openrouter` | `openrouter` | OpenRouter | API-Schlüssel, Aggregator | [Link](https://openrouter.ai) | Kostenlose Modelle für 0 $/Token mit dem Suffix :free – 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API-Schlüssel | [Link](https://openvecta.com) | Kostenloses Guthaben bei der Registrierung für OpenAI-kompatible Inferenz mit LLMs, Embeddings und Reasoning-Modellen | -| `opper` | `opper` | Opper | API-Schlüssel, Aggregator | [Link](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API-Schlüssel | [Link](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API-Schlüssel | [Link](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API-Schlüssel | [Link](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-Schlüssel | [Link](https://www.perplexity.ai) | Verwenden Sie Ihren Perplexity-API-Schlüssel. OmniRoute leitet Modell-IDs der Agent API über den Responses-kompatiblen Endpunkt von Perplexity weiter. | -| `piapi` | `pi` | PiAPI | API-Schlüssel, Aggregator | [Link](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API-Schlüssel | [Link](https://pioneer.ai) | 75 $ kostenloses Nutzungsguthaben — keine Kreditkarte erforderlich | -| `plamo` | `plamo` | PLaMo | API-Schlüssel | [Link](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API-Schlüssel, Aggregator | [Link](https://creator.poe.com/api-reference) | Bearer-API-Schlüssel für die OpenAI-kompatible API von Poe. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API-Schlüssel, Aggregator | [Link](https://poixe.com) | Die aktuellen öffentlichen kostenlosen Limits sind niedrig und hängen von der Modellgruppe ab: 2 RPM/5 RPD für Large-Cup-Modelle und 20 RPM/50 RPD für Small-Cup-Modelle. | -| `pollinations` | `pol` | Pollinations AI | API-Schlüssel, Video | [Link](https://pollinations.ai) | Der anonyme/schlüssellose Zugriff auf die dokumentierten kostenlosen Modelle erfolgt nach bestem Bemühen. Die lokale Überprüfung mit v3.8.50 (2026-07-31) ergab über OmniRoute den Status 401 und bei direkten Upstream-Abfragen aus demselben Netzwerk Cloudflare 1010. Premium-Modelle erfordern weiterhin einen Pollinations-API-Schlüssel von enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API-Schlüssel | [Link](https://poolside.ai) | Laguna S 2.1 und XS 2.1 sind während der Vorschauphase kostenlos; es wird kein öffentliches numerisches Kontingent angegeben. | -| `predibase` | `predibase` | Predibase | API-Schlüssel | [Link](https://predibase.com) | ⚠️ **VERALTET.** serving.app.predibase.com wird nicht mehr aufgelöst (Überprüfung 2026-06-19); die verwaltete Serving-API scheint eingestellt worden zu sein. | -| `publicai` | `publicai` | PublicAI | API-Schlüssel | [Link](https://publicai.co) | Erfordert einen API-Schlüssel — einmaliges Guthaben bei der Registrierung, danach kostenpflichtig | -| `qianfan` | `qianfan` | Baidu Qianfan | API-Schlüssel | [Link](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API-Schlüssel | [Link](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API-Schlüssel | [Link](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-Schlüssel | [Link](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API-Schlüssel, Bild | [Link](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API-Schlüssel | [Link](https://regolo.ai) | Rufen Sie Ihren Regolo-API-Schlüssel von regolo.ai ab und fügen Sie ihn dann hier als Bearer-Token ein. | -| `reka` | `reka` | Reka | API-Schlüssel | [Link](https://docs.reka.ai/chat/overview) | Verwenden Sie Ihren Reka-API-Schlüssel. OmniRoute unterstützt die OpenAI-kompatible Basis-URL https://api.reka.ai/v1 und sendet aus Kompatibilitätsgründen sowohl den Authorization- als auch den X-Api-Key-Header. | -| `requesty` | `requesty` | Requesty | API-Schlüssel | [Link](https://requesty.ai) | Kostenloses Kontingent mit ca. 200 Anfragen/Tag – Routing-Gateway für mehrere Modelle (über 300 Modelle) | -| `routeway` | `routeway` | Routeway | API-Schlüssel | [Link](https://routeway.ai) | Erstellen Sie unter routeway.ai einen kostenlosen API-Schlüssel und fügen Sie ihn dann hier als Bearer-Token ein. | -| `runwayml` | `runway` | Runway | API-Schlüssel, Video | [Link](https://docs.dev.runwayml.com) | Verwenden Sie Ihren Runway-API-Schlüssel in Authorization: Bearer . OmniRoute verwendet die aktuelle Runway-API unter https://api.dev.runwayml.com/v1 und sendet den erforderlichen X-Runway-Version-Header automatisch. | -| `sambanova` | `samba` | SambaNova | API-Schlüssel | [Link](https://sambanova.ai) | 5 $ kostenloses Guthaben bei der Registrierung (30 Tage gültig), keine Kreditkarte erforderlich | -| `sap` | `sap` | SAP Generative AI Hub | API-Schlüssel, Unternehmen | [Link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Verwenden Sie Ihr SAP-AI-Core-Bearer-Token. Als Basis-URL kann Ihr AI_API_URL-Stamm oder eine deploymentUrl aus Generative AI Hub verwendet werden. | -| `sarvam` | `sarvam` | Sarvam AI | API-Schlüssel | [Link](https://docs.sarvam.ai) | 1.000 ₹ kostenloses Startguthaben – verfällt nie | -| `scaleway` | `scw` | Scaleway AI | API-Schlüssel | [Link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 Mio. kostenlose Token für neue Konten – EU-/DSGVO-konform (Paris), Qwen3 235B und Llama 70B | -| `sealion` | `sealion` | SEA-LION | API-Schlüssel | [Link](https://sea-lion.ai) | Melden Sie sich unter sea-lion.ai mit Google an (keine Kreditkarte, keine Regionssperre), erstellen Sie einen API-Schlüssel und fügen Sie ihn dann hier ein. | -| `seekai` | `ska` | SeekAi | API-Schlüssel, Aggregator | [Link](https://seekai.cc) | Erstellen Sie unter https://seekai.cc einen API-Schlüssel und fügen Sie ihn dann hier als Bearer-Token ein. | -| `segmind` | `segmind` | Segmind | API-Schlüssel, Bild, Video | [Link](https://segmind.com) | Verwenden Sie Ihren Segmind-API-Schlüssel im x-api-key-Header. OmniRoute verwendet https://api.segmind.com/v1/ und gibt die erzeugten Bild-/Videobytes direkt zurück. | -| `sensenova` | `sensenova` | SenseNova | API-Schlüssel | [Link](https://platform.sensenova.cn) | API-Schlüssel unter platform.sensenova.cn abrufen | -| `siliconflow` | `siliconflow` | SiliconFlow | API-Schlüssel | [Link](https://cloud.siliconflow.com) | 1 $ kostenloses Guthaben sowie derzeit aufgeführte 0-$-Modelle nach Identitätsprüfung; Verfügbarkeit und Limits können sich ändern | -| `snowflake` | `snowflake` | Snowflake Cortex | API-Schlüssel, Unternehmen | [Link](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API-Schlüssel | [Link](https://xinghuo.xfyun.cn) | API-Schlüssel unter console.xfyun.cn abrufen | -| `speka` | `speka` | Speka AI | API-Schlüssel, Aggregator | [Link](https://speka.me) | Kostenloser Tarif: monatliche Nutzung im Wert von 1 $, 10 RPM, ein API-Schlüssel sowie Zugriff auf offene Modelle und den Playground; keine Kreditkarte erforderlich. | -| `stability-ai` | `stability` | Stability AI | API-Schlüssel, Bild | [Link](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API-Schlüssel | [Link](https://stepfun.com) | API-Schlüssel unter platform.stepfun.com abrufen | -| `sumopod` | `sumopod` | SumoPod | API-Schlüssel | [Link](https://ai.sumopod.com) | Verwenden Sie Ihren SumoPod-API-Schlüssel (sk-...) in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API-Schlüssel | [Link](https://suno.ai) | Sitzungscookie von suno.ai einfügen (Clerk-Authentifizierung) | -| `synthetic` | `synthetic` | Synthetic | API-Schlüssel, Aggregator | [Link](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API-Schlüssel, Aggregator | [Link](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API-Schlüssel | [Link](https://hunyuan.tencent.com) | API-Schlüssel unter console.cloud.tencent.com abrufen | -| `thebai` | `thebai` | TheB.AI | API-Schlüssel, Aggregator | [Link](https://theb.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von TheB.AI. | -| `tinyfish` | `tf` | TinyFish Fetch | API-Schlüssel | [Link](https://docs.tinyfish.ai/fetch-api) | X-API-Key von agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API-Schlüssel, Video | [Link](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API-Schlüssel | [Link](https://agent-router.gaib.ai) | Verwenden Sie Ihren Token-Kiosk-API-Schlüssel in Authorization: Bearer . Vollständig OpenAI-kompatibles Gateway. API-Basis-URL: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API-Schlüssel, Aggregator | [Link](https://www.tokenreply.com) | Als kostenlos gekennzeichnete Modelle haben modell- und kampagnenspezifische Tageslimits; es wird kein festes globales Freikontingent veröffentlicht. | -| `tokenrouter` | `trk` | TokenRouter | API-Schlüssel | [Link](https://tokenrouter.com) | Verwenden Sie Ihren TokenRouter-API-Schlüssel in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API-Schlüssel, Bild | [Link](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API-Schlüssel | [Link](https://docs.opentyphoon.ai) | Kostenloser API-Schlüssel mit einem Ratenlimit von 5 Anfragen/s und 200 Anfragen/min. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API-Schlüssel | [Link](https://uncensored.com) | Verwenden Sie Ihren uncensored.com-Developer-API-Schlüssel (uai_sk_live_...). OmniRoute sendet ihn als X-api-key-Header an den OpenAI-kompatiblen Endpunkt https://api.uncensored.com/api/v1. Der Schlüssel läuft nie ab. Dies ist die nutzungsabhängig abgerechnete Oberfläche mit Guthaben; der Chat mit unbegrenztem Abonnement ist der separate Anbieter „uc“. | -| `udio` | `udio` | Udio | API-Schlüssel | [Link](https://udio.com) | Fügen Sie das Sitzungscookie von udio.com (Supabase-Authentifizierung) ein. | -| `unorouter` | `unorouter` | UnoRouter | API-Schlüssel, Aggregator | [Link](https://unorouter.ai) | Modelle mit dem Suffix :free belasten das Guthaben nicht; das Limit beträgt 1 Anfrage/Minute pro kostenlosem Modell und Benutzer. | -| `upstage` | `upstage` | Upstage | API-Schlüssel | [Link](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API-Schlüssel | [Link](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API-Schlüssel | [Link](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API-Schlüssel, Aggregator | [Link](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API-Schlüssel, Unternehmen | [Link](https://cloud.google.com/vertex-ai) | Geben Sie Service-Account-JSON, ein OAuth-Zugriffstoken, einen Vertex-Express-API-Schlüssel oder einen an ein Dienstkonto gebundenen Autorisierungsschlüssel an. Der Express-Modus unterstützt nur Gemini; Partnermodelle erfordern projektbezogene Anmeldedaten. | -| `vertex-partner` | `vp` | Vertex AI Partners | API-Schlüssel, Unternehmen | [Link](https://cloud.google.com/vertex-ai) | Geben Sie Service-Account-JSON oder OAuth-Anmeldedaten an. Ein an ein Dienstkonto gebundener Autorisierungsschlüssel unterstützt ebenfalls die Erkennung, für Partner-Inferenz ist jedoch zusätzlich die zugehörige Google-Cloud-Projekt-ID erforderlich. Standardmäßige Express-Schlüssel unterstützen nur Gemini. | -| `void-ai` | `void-ai` | Void AI | API-Schlüssel, Aggregator | [Link](https://voidai.app) | Im öffentlichen Modellkatalog sind einige Modelle als Modelle gekennzeichnet, für die ein kostenloser Tarif erforderlich ist; der Zugriff ist jedoch an Bedingungen geknüpft, und es wurde kein numerisches Kontingent bestätigt. | -| `volcengine` | `volcengine` | Volcengine | API-Schlüssel | [Link](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API-Schlüssel | [Link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Verbinden Sie Ihr Volcano-Engine-Konto oder verwenden Sie einen Abonnement-API-Schlüssel für den Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API-Schlüssel | [Link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Verbinden Sie Ihr Volcano-Engine-Konto oder verwenden Sie einen Abonnement-API-Schlüssel für den Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | API-Schlüssel, Einbettung/Neusortierung | [Link](https://www.voyageai.com) | Bearer-API-Schlüssel für die Einbettungs- und Neusortierungs-APIs von Voyage AI. | -| `wafer` | `wafer` | Wafer AI | API-Schlüssel | [Link](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API-Schlüssel | [Link](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API-Schlüssel, Unternehmen | [Link](https://www.ibm.com/products/watsonx-ai) | Verwenden Sie Ihr watsonx-Bearer-Token. Die Basis-URL kann https://.ml.cloud.ibm.com/ml/gateway/v1/ oder ein selbstverwalteter /ml/gateway/v1-Endpunkt sein. | -| `writer` | `writer` | Writer | API-Schlüssel | [Link](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API-Schlüssel | [Link](https://x5lab.dev) | Verwenden Sie Ihren X5Lab-API-Schlüssel (x5-...) in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API-Schlüssel | [Link](https://x.ai) | Verwenden Sie einen offiziellen xAI-API-Schlüssel oder melden Sie sich mit xAI OAuth an. Grok-Build-JWT-Sitzungen bleiben ein separater Anbieter. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API-Schlüssel | [Link](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API-Schlüssel | [Link](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API-Schlüssel, Aggregator | [Link](https://xkiro.com) | Erstellen Sie unter xkiro.com ein kostenloses Konto und fügen Sie den Schlüssel hier ein (Bearer; x-api-key wird ebenfalls akzeptiert). | -| `yi` | `yi` | Yi (01.AI) | API-Schlüssel | [Link](https://01.ai) | Beziehen Sie den API-Schlüssel unter platform.lingyiwanwu.com. | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API-Schlüssel, Aggregator | [Link](https://yolo-auto.com) | Der kostenlose API-Zugriff ist hinsichtlich der Anzahl der Anfragen begrenzt und für Tests vorgesehen; es wird kein numerisches tägliches Kontingent veröffentlicht, und ein dauerhaft kostenloser Zugriff wird nicht zugesichert. | -| `zai` | `zai` | Z.AI | API-Schlüssel | [Link](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API-Schlüssel | [Link](https://zenmux.ai) | Verwenden Sie Ihren ZenMux-API-Schlüssel in Authorization: Bearer . ZenMux ist vollständig OpenAI-kompatibel. Basis-URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API-Schlüssel, Aggregator | [Link](https://www.zerolimitai.com) | Es wird eine vorübergehende kostenlose Testphase beworben, die offiziellen Seiten widersprechen sich jedoch hinsichtlich einer Dauer von 3 oder 7 Tagen; eine Angabe von 100 Aufrufen/Tag wird nicht als dauerhaft betrachtet. | -| `zylo-api` | `zylo` | Zylo API | API-Schlüssel, Aggregator | [Link](https://zyloai.net) | Basic-Tarif: 10 RPM, 7.200 Anfragen/Tag und 200.000 Token/Tag; beschränkt auf Basic-Textmodelle. | +| ID | Alias | Name | Tags | Website | Hinweise | +| ------------------------ | --------------- | ------------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API-Schlüssel | [Link](https://ai.360.cn) | API-Schlüssel unter ai.360.cn abrufen | +| `agentrouter` | `agentrouter` | AgentRouter | API-Schlüssel, Aggregator | [Link](https://agentrouter.org) | 200 $ kostenloses Guthaben bei der Registrierung – Routing-Gateway für mehrere Modelle | +| `agnes` | `agnes` | Agnes AI | API-Schlüssel, Video | [Link](https://agnes-ai.com) | API-Schlüssel unter agnes-ai.com abrufen | +| `agnes-cn` | `agnescn` | Agnes AI (China) | API-Schlüssel | [Link](https://api.agnes-ai.cn) | API-Schlüssel über die Agnes-CN-Website abrufen. | +| `ai21` | `ai21` | AI21 Labs | API-Schlüssel | [Link](https://www.ai21.com) | 10 $ Testguthaben bei der Registrierung (3 Monate gültig), keine Kreditkarte erforderlich | +| `aimlapi` | `aiml` | AI/ML API | API-Schlüssel, Aggregator | [Link](https://aimlapi.com) | Kostenloses Kontingent pausiert (2026) — AI/ML API ist jetzt ausschließlich nutzungsbasiert kostenpflichtig (Mindestaufladung 20 $); kein wiederkehrendes kostenloses Guthaben. | +| `ainative` | `ainative` | AINative Studio | API-Schlüssel | [Link](https://ainative.studio) | Erstellen Sie unter ainative.studio einen kostenlosen API-Schlüssel (keine Karte erforderlich) und fügen Sie ihn anschließend hier als Bearer-Token ein. | +| `aion` | `aion` | Aion Labs | API-Schlüssel | [Link](https://www.aionlabs.ai) | Erstellen Sie unter aionlabs.ai einen kostenlosen API-Schlüssel (keine Karte erforderlich) und fügen Sie ihn anschließend hier als Bearer-Token ein. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API-Schlüssel | [Link](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (China) | API-Schlüssel | [Link](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API-Schlüssel | [Link](https://developer.ant-ling.com/en/docs/) | Registrieren Sie sich in der Ant-Ling-API-Konsole (https://chat.ant-ling.com/open), erstellen Sie einen API-Schlüssel und fügen Sie ihn anschließend hier ein. OmniRoute leitet Chat-Datenverkehr an https://api.ant-ling.com/v1/chat/completions weiter; der Anbieter ist OpenAI-kompatibel und stellt außerdem eine Anthropic-kompatible Schnittstelle bereit. | +| `anthropic` | `anthropic` | Anthropic | API-Schlüssel | [Link](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API-Schlüssel, Aggregator | [Link](https://anyapi.ai) | Kostenloser Tarif: 100.000 ANY-Tokens/Tag und 100 RPM für berechtigte Free-/Basic-Modelle; keine Kreditkarte erforderlich. | +| `api-airforce` | `af` | Api.airforce | API-Schlüssel | [Link](https://api.airforce) | 55 Modelle im kostenlosen Kontingent, darunter Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash und DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | API-Schlüssel | [Link](https://arcee.ai) | API-Schlüssel unter arcee.ai abrufen | +| `auriko` | `auriko` | Auriko | API-Schlüssel, Aggregator | [Link](https://www.auriko.ai) | Der kostenlose Tarif bietet 1.000 Plattform-RPM und 10.000 BYOK-RPM. Bei der Plattform-Inferenz fallen weiterhin Anbieterkosten an; es handelt sich weder um ein kostenloses Token-Kontingent noch um unbegrenzte kostenlose Inferenz. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API-Schlüssel, Unternehmen | [Link](https://learn.microsoft.com/azure/ai-foundry) | Verwenden Sie Ihren Azure-AI-Foundry-Schlüssel. Die Basis-URL kann https://.services.ai.azure.com/openai/v1/ oder https://.openai.azure.com/openai/v1/ lauten. | +| `azure-openai` | `azure` | Azure OpenAI | API-Schlüssel, Unternehmen | [Link](https://azure.microsoft.com/products/ai-services/openai-service) | Verwenden Sie Ihren Azure-OpenAI-API-Schlüssel. Als Basis-URL sollte der Endpunkt Ihrer Ressource verwendet werden, zum Beispiel https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API-Schlüssel | [Link](https://b.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible LLM-Gateway von b.ai (nicht zu verwechseln mit TheB.AI). Erstellen Sie unter https://docs.b.ai einen Schlüssel und verwenden Sie anschließend https://api.b.ai/v1 als OpenAI-kompatible Basis-URL. | +| `baichuan` | `baichuan` | Baichuan | API-Schlüssel | [Link](https://www.baichuan-ai.com/) | API-Schlüssel unter platform.baichuan-ai.com abrufen | +| `baidu` | `baidu` | Baidu (ERNIE) | API-Schlüssel | [Link](https://ernie.baidu.com/) | API-Schlüssel unter console.bce.baidu.com abrufen | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API-Schlüssel | [Link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API-Schlüssel | [Link](https://baseten.co) | 30 $ kostenloses Testguthaben für GPU-Inferenz | +| `bazaarlink` | `bzl` | BazaarLink | API-Schlüssel | [Link](https://bazaarlink.ai) | Verwenden Sie Ihren BazaarLink-API-Schlüssel (beginnt mit sk-bl-) in Authorization: Bearer . Das OpenAI SDK funktioniert mit der Basis-URL https://bazaarlink.ai/api/v1. Modelle verwenden das Format Anbieter/Modellname. | +| `bedrock` | `bedrock` | Amazon Bedrock | API-Schlüssel, Unternehmen | [Link](https://aws.amazon.com/bedrock) | Verwenden Sie Ihren Amazon-Bedrock-API-Schlüssel und konfigurieren Sie die AWS-Region, in der Ihre Modelle aktiviert sind (zum Beispiel eu-west-2). OmniRoute ruft die native Converse API von Bedrock direkt auf. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API-Schlüssel, Bild | [Link](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API-Schlüssel | [Link](https://blackbox.ai) | ⚠️ **VERALTET.** api.blackbox.ai gibt für jede Pfadvariante HTTP 404 zurück (Überprüfung am 2026-08-21); die öffentliche Inferenzschnittstelle wurde zum zugangsbeschränkten Endpunkt enterprise.blackbox.ai/v1 verschoben. | +| `bluesminds` | `bm` | BluesMinds | API-Schlüssel | [Link](https://www.bluesminds.com) | Täglich kostenloses Pi-Guthaben — unterstützt über 200 Modelle, darunter GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen und Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | API-Schlüssel | [Link](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API-Schlüssel | [Link](https://bytez.com) | 1 $ kostenloses Guthaben, das alle 4 Wochen erneuert wird | +| `cerebras` | `cerebras` | Cerebras | API-Schlüssel | [Link](https://inference.cerebras.ai) | Einmaliges Registrierungsguthaben von 5 $ (30 Tage gültig); eine Zahlungsmethode ist erforderlich. Kein wiederkehrendes kostenloses Kontingent. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API-Schlüssel | [Link](https://hyper.charm.land) | 100 kostenlose Hypercredits pro Monat bei der Registrierung | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API-Schlüssel, Aggregator | [Link](https://api.oriper.com) | Die offiziellen Metadaten werben mit 2 Mio. Tokens/Monat, die öffentliche Website und die Dokumentation waren während der Prüfung jedoch gesperrt; das Kontingent und die Zuordnung zur Marke sind daher als unbestätigt zu betrachten. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-Schlüssel, Aggregator | [Link](https://chatanywhere.tech) | Nur für persönliche, Bildungs- oder Forschungszwecke: Die öffentliche Dokumentation nennt 10.000 Punkte/Tag und 200 Anfragen/Tag pro IP/Schlüssel; nicht für kommerziellen Datenverkehr verwenden. | +| `cheaperinference` | `cinf` | Cheaper Inference | API-Schlüssel | [Link](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API-Schlüssel | [Link](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API-Schlüssel, Aggregator | [Link](https://chutes.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von Chutes. | +| `clarifai` | `clarifai` | Clarifai | API-Schlüssel, Unternehmen | [Link](https://docs.clarifai.com) | Verwenden Sie Ihr Clarifai-PAT oder einen anwendungsspezifischen API-Schlüssel. OmniRoute verwendet den OpenAI-kompatiblen Endpunkt unter https://api.clarifai.com/v2/ext/openai/v1 und authentifiziert sich mit Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-Schlüssel, Aggregator | [Link](https://cloudcode.one) | Zu den veröffentlichten kostenlosen Modellen gehören glm-4.7-flash und glm-4.6v-flash; es wird kein numerisches Kontingent veröffentlicht, und die Schlüsselerstellung kann ein Guthaben oder einen Gutschein erfordern. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-Schlüssel | [Link](https://developers.cloudflare.com/workers-ai) | Erfordert API-Token UND Konto-ID (zu finden unter dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API-Schlüssel | [Link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API-Schlüssel | [Link](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API-Schlüssel | [Link](https://cohere.com) | Kostenlose Testversion: 1.000 API-Aufrufe/Monat zum Testen, keine Kreditkarte erforderlich | +| `command-code` | `cmd` | Command Code | API-Schlüssel | [Link](https://commandcode.ai/) | Verwenden Sie einen Command Code-API-Schlüssel. Anfragen werden an den Endpunkt /provider/v1/chat/completions von Command Code gesendet. | +| `coze` | `coze` | Coze | API-Schlüssel | [Link](https://coze.com) | API-Schlüssel unter coze.com/open/api abrufen | +| `crof` | `crof` | CrofAI | API-Schlüssel | [Link](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API-Schlüssel | [Link](https://cursor.com/dashboard/api) | Fügen Sie einen Cursor-Benutzer-API-Schlüssel (crsr_...) von cursor.com/dashboard/api ein. OmniRoute tauscht ihn bei Bedarf gegen ein Sitzungstoken aus; weder eine IDE noch eine cursor-agent-Installation ist erforderlich. Die Nutzung wird über den Cursor-Tarif abgerechnet, zu dem der Schlüssel gehört. | +| `dahl` | `dahl` | Dahl | API-Schlüssel | [Link](https://inference.dahl.global) | Klicken Sie auf „Konto hinzufügen“, um automatisch ein Token zu generieren, oder fügen Sie einen manuellen API-Schlüssel hinzu. | +| `databricks` | `databricks` | Databricks | API-Schlüssel, Unternehmen | [Link](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API-Schlüssel, Unternehmen | [Link](https://docs.datarobot.com) | Verwenden Sie Ihr DataRobot-API-Token. Die optionale Basis-URL kann die Stamm-URL des Kontos (für LLM Gateway) oder eine Bereitstellungs-URL unter /api/v2/deployments/ sein. | +| `deepai` | `deepai` | DeepAI | API-Schlüssel, Bild | [Link](https://deepai.org) | Verwenden Sie Ihren DeepAI-API-Schlüssel. Sie erhalten einen unter deepai.org — ein Pro-Abonnement (9,99 $/Monat) ist erforderlich. | +| `deepinfra` | `deepinfra` | DeepInfra | API-Schlüssel | [Link](https://deepinfra.com) | Kostenloses Startguthaben für API-Tests und die Erkundung von Modellen | +| `deepseek` | `ds` | DeepSeek | API-Schlüssel | [Link](https://platform.deepseek.com) | 5 Mio. kostenlose Token bei der Registrierung – keine Kreditkarte erforderlich | +| `dgrid` | `dgrid` | DGrid | API-Schlüssel | [Link](https://dgrid.ai) | DGrid Free Models Router: 10 Anfragen/Minute und 100 Anfragen/Tag. Eine einmalige Aufladung von 5 $ schaltet bis zu 20 Anfragen/Minute und 1.000 Anfragen/Tag frei. | +| `dify` | `dify` | Dify | API-Schlüssel | [Link](https://dify.ai) | Rufen Sie den API-Schlüssel von Ihrer Dify-Instanz ab. | +| `digitalocean` | `digitalocean` | DigitalOcean | API-Schlüssel | [Link](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API-Schlüssel | [Link](https://dit.ai) | Verwenden Sie Ihren dit.ai-API-Schlüssel in Authorization: Bearer . Vollständig OpenAI-kompatibel — als direkter Ersatz verwendbar; ändern Sie lediglich die Basis-URL in https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | API-Schlüssel | [Link](https://doubao.com) | API-Schlüssel unter console.volcengine.com abrufen | +| `dxnt` | `dxnt` | DXNT / DX Token | API-Schlüssel, Aggregator | [Link](https://www.dxnt.com) | Kostenlose Konten sind mit 100 Aufrufen/Tag dokumentiert; das Kontingent kann durch Einladungen erhöht werden und je nach Konto variieren. | +| `electronhub` | `electronhub` | Electron Hub | API-Schlüssel, Aggregator | [Link](https://www.electronhub.ai) | Kostenloser Tarif: 5 RPM, wöchentliches Guthaben von 0,25 $ und 10 Neutrinos/Tag für :free-Modelle; außerdem gelten Familienbudgets. | +| `empower` | `empower` | Empower | API-Schlüssel, Aggregator | [Link](https://docs.empower.dev) | Bearer-API-Schlüssel für den OpenAI-kompatiblen Endpunkt von Empower. | +| `eurouter` | `eurouter` | EURouter | API-Schlüssel, Aggregator | [Link](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API-Schlüssel | [Link](https://factory.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von Factory. | +| `fal-ai` | `fal` | Fal.ai | API-Schlüssel, Bild | [Link](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API-Schlüssel, Aggregator | [Link](https://fastrouter.ai) | Modelle mit dem Suffix :free erlauben 10 Anfragen/Tag pro Organisation und Modell; die Verfügbarkeit kann sich ändern. | +| `featherless-ai` | `featherless` | Featherless AI | API-Schlüssel | [Link](https://featherless.ai) | Kostenloser Tarif verfügbar — keine Kreditkarte erforderlich | +| `fenayai` | `fenayai` | FenayAI | API-Schlüssel, Aggregator | [Link](https://fenayai.com) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von FenayAI. | +| `fireworks` | `fireworks` | Fireworks AI | API-Schlüssel | [Link](https://fireworks.ai) | 1 $ kostenloses Startguthaben bei der Registrierung für API-Tests | +| `free-ai` | `free-ai` | Free.ai | API-Schlüssel, Aggregator | [Link](https://free.ai) | 30.000 Token/Tag decken nach der E-Mail-Verifizierung selbst gehostete Modelle ab. Eine Nutzung über diesen Pool hinaus kann zu Rohkosten abgerechnet werden, und externe Premium-Modelle sind kostenpflichtig. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API-Schlüssel | [Link](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API-Schlüssel | [Link](https://freebuff.com) | Freebuff-/Codebuff-Authentifizierungstoken eingeben (über die CLI-Anmeldung oder einen automatisierten Harvester erhalten). | +| `freeinference` | `freeinference` | FreeInference | API-Schlüssel, Aggregator | [Link](https://freeinference.org) | Kostenloser Forschungszugang ohne Kreditkarte; Bewerber außerhalb Harvards benötigen eine manuelle Genehmigung, und es wird kein numerisches Kontingent öffentlich garantiert. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API-Schlüssel | [Link](https://freemodel.dev) | $300 kostenloses Guthaben bei der Registrierung — keine Kreditkarte erforderlich. Zugriff auf GPT-5.4 und GPT-5.5 (die neuesten Flaggschiffmodelle von OpenAI) über eine OpenAI-kompatible API. | +| `freetheai` | `fta` | FreeTheAi | API-Schlüssel, Aggregator | [Link](https://freetheai.xyz) | Tritt dem FreeTheAi-Discord bei, um deinen kostenlosen API-Schlüssel zu erhalten. | +| `friendliai` | `friendli` | FriendliAI | API-Schlüssel | [Link](https://friendli.ai) | Kostenloser Tarif für serverlose Inferenz — keine Kreditkarte erforderlich | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Guthaben unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Guthaben unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Guthaben unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Guthaben unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-Schlüssel, Aggregator | [Link](https://g4f.space) | Erzeuge anonyme Cake-Guthaben unter g4f.dev/chat oder verwende einen Mitgliedsschlüssel von g4f.dev (erstelle einen unter g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API-Schlüssel | [Link](https://galadriel.com) | ⚠️ **VERALTET.** api.galadriel.ai wird nicht mehr aufgelöst (Überprüfung am 2026-06-19); die Inferenz-API scheint eingestellt worden zu sein. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API-Schlüssel | [Link](https://aistudio.google.com) | Kostenloser Tarif über Google AI Studio verfügbar; es gelten die aktuellen modellspezifischen Kontingente und regionalen Beschränkungen | +| `getgoapi` | `ggo` | GoAPI | API-Schlüssel, Aggregator | [Link](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API-Schlüssel | [Link](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API-Schlüssel | [Link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Persönliches GitLab-Zugriffstoken für die öffentliche Code-Suggestions-API. Bei Nichtverwendung von gitlab.com muss eine selbst gehostete Basis-URL konfiguriert werden. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-Schlüssel | [Link](https://opengateway.gitlawb.com) | Kostenloses MiMo (xiaomi/mimo-v2.5) wurde 2026-05 eingestellt — Opengateway ist jetzt ein nutzungsabhängig abgerechnetes Guthaben-Gateway; kein wiederkehrendes kostenloses Modell. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-Schlüssel | [Link](https://opengateway.gitlawb.com) | Die kostenlose Nemotron-Aktion endete 2026-06 — die GMI-Cloud-Route ist jetzt ausschließlich mit nutzungsabhängig abgerechnetem Guthaben verfügbar. | +| `glm` | `glm` | GLM Coding | API-Schlüssel | [Link](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (China) | API-Schlüssel | [Link](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API-Schlüssel | [Link](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API-Schlüssel | [Link](https://greenpt.com) | Das API-Abonnement kann kostenlos erstellt werden; die Inferenz wird pro Token abgerechnet. Es wird kein kostenloses Inferenzkontingent veröffentlicht. | +| `groq` | `groq` | Groq | API-Schlüssel | [Link](https://groq.com) | Kostenloser Tarif: modellspezifische Obergrenzen (200.000 Token/Tag pro Chatmodell; siehe console.groq.com/docs/rate-limits für RPM/RPD) — keine Zahlungsmethode hinterlegt. | +| `haiper` | `hp` | Haiper | API-Schlüssel, Video | [Link](https://haiper.ai) | API-Schlüssel unter haiper.ai/haiper-api abrufen | +| `hcnsec` | `hcnsec` | Huancheng Public API | API-Schlüssel | [Link](https://api.hcnsec.cn) | API-Schlüssel unter api.hcnsec.cn abrufen | +| `helixmind` | `helixmind` | HelixMind | API-Schlüssel, Aggregator | [Link](https://helixmind.online) | Zuvor verbreitete Angaben zu 3 RPM/50 RPD und zur Nutzung ohne Kreditkarte konnten bei der Prüfung am 2026-08-02 nicht bestätigt werden; das aktuelle Kontingent und die Abrechnung erfordern eine Kontoverifizierung. | +| `helyxai` | `helyxai` | Helyx AI | API-Schlüssel, Aggregator | [Link](https://helyxai.space) | Der aktive kostenlose Tarif weist 100.000 Token/Tag aus; die separate Marketingangabe der Website von mehr als 2 Mio. steht dazu im Widerspruch und wird nicht als Kontingentgarantie betrachtet. | +| `heroku` | `heroku` | Heroku AI | API-Schlüssel, Unternehmen | [Link](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API-Schlüssel | [Link](https://huggingface.co) | Kostenlose Inference API für Tausende von Modellen (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API-Schlüssel | [Link](https://hyperbolic.xyz) | $1–5 Testguthaben bei der Registrierung für serverlose Inferenz | +| `ideogram` | `ideo` | Ideogram | API-Schlüssel | [Link](https://ideogram.ai) | API-Schlüssel unter ideogram.ai/docs/api abrufen | +| `iflytek` | `iflytek` | iFlytek Spark | API-Schlüssel | [Link](https://xinghuo.xfyun.cn) | API-Schlüssel unter console.xfyun.cn abrufen | +| `inception` | `inception` | Inception | API-Schlüssel | [Link](https://docs.inceptionlabs.ai) | 10 Mio. kostenlose Token bei der Registrierung, keine Kreditkarte erforderlich. | +| `inference-net` | `inet` | Inference.net | API-Schlüssel | [Link](https://inference.net) | $25 kostenloses Guthaben bei der Registrierung sowie verfügbare Forschungsförderungen | +| `internlm` | `internlm` | InternLM (Intern-S1) | API-Schlüssel | [Link](https://internlm.intern-ai.org.cn/) | Kostenloses monatliches Kontingent von ca. 1 Mio. Eingabe-/3 Mio. Ausgabe-Token (ca. 10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API-Schlüssel, Einbettung/Neugewichtung | [Link](https://jina.ai) | Bearer-API-Schlüssel für api.jina.ai — Einbettungen, Neugewichtung, Klassifizierung, Segmentierung und Suche. Dashboard-Schlüssel haben Vorrang vor JINA_AI_API_KEY. Dies ist nicht die Karte für Reader / r.jina.ai und sie ruft keine URLs ab. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-Schlüssel | [Link](https://jina.ai/reader) | Bearer-API-Schlüssel für die Umwandlung von URLs in Markdown über r.jina.ai (nur /v1/web/fetch). Stellt weder /v1/embeddings noch /v1/rerank bereit. Dasselbe Jina-Token wie für die Foundation API funktioniert; OmniRoute verwendet einen `jina-ai`-Dashboard-Schlüssel oder JINA_AI_API_KEY erneut, wenn diese Karte leer ist. | +| `kenari` | `kenari` | Kenari | API-Schlüssel | [Link](https://kenari.id) | Verwenden Sie Ihren Kenari-API-Schlüssel (kn-...) in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API-Schlüssel | [Link](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API-Schlüssel, Aggregator | [Link](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (veraltete Moonshot API) | API-Schlüssel | [Link](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-Schlüssel | [Link](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API-Schlüssel | [Link](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API-Schlüssel, Aggregator | [Link](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API-Schlüssel, Video | [Link](https://leonardo.ai) | API-Schlüssel unter leonardo.ai/developer abrufen | +| `liquid` | `liquid` | Liquid AI | API-Schlüssel | [Link](https://liquid.ai) | API-Schlüssel unter liquid.ai abrufen | +| `literouter` | `literouter` | LiteRouter | API-Schlüssel, Aggregator | [Link](https://literouter.com) | Kostenlose Modellvarianten verwenden das Suffix :free; die täglichen Guthabenlimits variieren je nach Modell, und kostenlose Eingaben sind auf 5.000 Token begrenzt. | +| `llamagate` | `llamagate` | LlamaGate | API-Schlüssel | [Link](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-Schlüssel, Aggregator | [Link](https://llm.kiwi) | Der kostenlose Tarif bietet auto und hrLLM; das veröffentlichte Limit von 40 Anfragen pro Stunde gilt für hrLLM. | +| `llm7` | `llm7` | LLM7.io | API-Schlüssel | [Link](https://llm7.io) | Verwenden Sie einen beliebigen nicht leeren Schlüssel (zum Beispiel 'unused'). Falls ältere integrierte Modelle model_unavailable zurückgeben, verwenden Sie Available Models → Import from /models oder Auto-Sync; verifiziertes aktives Modell: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API-Schlüssel, Aggregator | [Link](https://llmgateway.io) | Gehosteter kostenloser Tarif: Modelle mit kostenlosem Preis sind auf 5 Anfragen pro 10 Minuten begrenzt, wenn das Konto über kein Guthaben verfügt. | +| `logfare` | `logfare` | Logfare | API-Schlüssel, Aggregator | [Link](https://logfare.ai) | Erstellen Sie unter https://logfare.ai/register ein kostenloses Konto (Benutzername/Passwort, keine E-Mail-Verifizierung), um sofort einen API-Schlüssel zu erhalten, und fügen Sie ihn dann hier als Bearer-Token ein. | +| `longcat` | `lc` | LongCat AI | API-Schlüssel | [Link](https://longcat.chat/platform/docs) | Kostenlos: einmalige Zuteilung von 10 Mio. Token nach Kontoregistrierung und KYC-Verifizierung (LongCat-2.0). Nur einmalig — kein wiederkehrendes tägliches/monatliches Kontingent. | +| `magnific` | `freepik` | Magnific | API-Schlüssel, Bild | [Link](https://www.magnific.com) | API-Schlüssel unter magnific.com/user/api-keys abrufen (Header x-magnific-api-key). Veraltete Freepik-Entwicklerschlüssel funktionieren weiterhin. | +| `maritalk` | `maritalk` | Maritalk | API-Schlüssel | [Link](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API-Schlüssel, Aggregator | [Link](https://meganova.ai) | Kostenlose Registrierung ohne Kreditkarte. Die veröffentlichten modellspezifischen Tier-1-Kontingente belaufen sich insgesamt auf 550 Anfragen pro Tag; sie bilden keinen gemeinsamen globalen Pool, und bei entsprechender Aktivierung können kostenpflichtige Überschreitungen anfallen. | +| `meta-llama` | `meta` | Meta Llama API | API-Schlüssel | [Link](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API-Schlüssel, Video | [Link](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (China) | API-Schlüssel | [Link](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API-Schlüssel | [Link](https://mistral.ai) | Kostenloser Experiment-Tarif: ratenbegrenzter Zugriff auf alle Modelle, keine Kreditkarte erforderlich | +| `mixedbread` | `mxbai` | Mixedbread AI | API-Schlüssel | [Link](https://www.mixedbread.com) | Bearer-API-Schlüssel für die Mixedbread-Einbettungs-API. | +| `mixlayer` | `mixlayer` | Mixlayer | API-Schlüssel, Aggregator | [Link](https://www.mixlayer.com) | Das Modell qwen/qwen3.5-4b-free ist für die Prototypenerstellung kostenlos und ratenbegrenzt; es ist kein festes öffentliches RPM- oder Tageskontingent bestätigt. | +| `mnn-ai` | `mnn-ai` | MNN AI | API-Schlüssel, Aggregator | [Link](https://mnnai.ru) | Kostenloser Tarif: monatlich 1 $ Guthaben, 10 RPM und Zugriff ausschließlich auf als Free gekennzeichnete Modelle. | +| `modal` | `mdl` | Modal | API-Schlüssel, Unternehmen | [Link](https://modal.com/docs) | Verwenden Sie das Bearer-Token, das Ihre Modal-Bereitstellung schützt, sofern aktiviert. Die Basis-URL sollte auf Ihre OpenAI-kompatible Modal-App verweisen, zum Beispiel https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API-Schlüssel | [Link](https://modelscope.cn) | Kostenloser Tarif über ModelScope API-Inference — Alibaba-Konto erforderlich. | +| `monsterapi` | `monster` | MonsterAPI | API-Schlüssel | [Link](https://monsterapi.ai) | ⚠️ **VERALTET.** Monster API hat den Betrieb am 2026-06-30 eingestellt. Verwenden Sie alternative OpenAI-kompatible Anbieter. | +| `moonshot` | `moonshot` | Kimi | API-Schlüssel | [Link](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API-Schlüssel | [Link](https://morphllm.com) | Kostenloser Tarif: 250.000 Guthabenpunkte/Monat, 0 $ | +| `muse-code` | `mc` | Muse Code (Meta) | API-Schlüssel | [Link](https://github.com/meta-llama/llama-stack) | Verwenden Sie Ihre Umgebungsvariable META_API_KEY als Bearer-Token. Muse Code CLI verwendet das Wire-Format der OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API-Schlüssel, Aggregator | [Link](https://naga.ac) | API-Schlüssel unter naga.ac abrufen — Registrierung über Google/GitHub/Discord verfügbar. | +| `naga-ai` | `naga-ai` | Naga AI | API-Schlüssel, Aggregator | [Link](https://naga.ac) | Mit :free gekennzeichnete Modelle sind öffentlich aufgeführt, es ist jedoch kein numerisches Kontingent bestätigt. Die Richtlinie von Naga weist darauf hin, dass Prompts und Ausgaben der kostenlosen Stufe erfasst oder für das Training verwendet werden können. | +| `nanogpt` | `nanogpt` | NanoGPT | API-Schlüssel | [Link](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API-Schlüssel | [Link](https://bynara.id) | Erstellen Sie ein kostenloses NaraRouter-Konto, verknüpfen Sie Ihr Telegram-Konto (vor /v1-Antworten erforderlich) und fügen Sie den Schlüssel anschließend hier als Bearer-Token ein. | +| `navy` | `navy` | NavyAI | API-Schlüssel | [Link](https://api.navy) | Erstellen Sie im NavyAI-Dashboard einen kostenlosen API-Schlüssel und fügen Sie ihn anschließend hier als Bearer-Token ein. | +| `nebius` | `nebius` | Nebius AI | API-Schlüssel | [Link](https://nebius.com) | Etwa $1 Testguthaben bei der Registrierung für API-Tests | +| `nlpcloud` | `nlpc` | NLP Cloud | API-Schlüssel | [Link](https://docs.nlpcloud.com) | Verwenden Sie Ihren NLP-Cloud-API-Schlüssel in Authorization: Token . OmniRoute verwendet standardmäßig den Chatbot-Endpunkt unter https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API-Schlüssel | [Link](https://nomic.ai) | API-Schlüssel unter atlas.nomic.ai abrufen | +| `nous-research` | `nous` | Nous Research | API-Schlüssel | [Link](https://portal.nousresearch.com/help) | Verwenden Sie Ihren Nous-Portal-API-Schlüssel. OmniRoute verwendet den offiziellen, mit OpenAI kompatiblen Inferenz-Endpunkt unter https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API-Schlüssel, Video, Aggregator | [Link](https://novita.ai) | $0.50 Testguthaben bei der Registrierung (etwa 1 Jahr gültig) | +| `nscale` | `nscale` | nScale | API-Schlüssel | [Link](https://nscale.com) | $5 kostenloses Guthaben bei der Registrierung für Inferenztests | +| `nube` | `nube` | Nube.sh | API-Schlüssel | [Link](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API-Schlüssel | [Link](https://build.nvidia.com) | Kostenloser Entwicklerzugang: etwa 40 RPM, mehr als 70 Modelle (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API-Schlüssel, Unternehmen | [Link](https://www.oracle.com/artificial-intelligence/generative-ai) | Verwenden Sie Ihren OCI-Generative-AI-API-Schlüssel oder IAM-Bearer-Token. Die Basis-URL kann https://inference.generativeai..oci.oraclecloud.com/openai/v1/ lauten. | +| `ofoxai` | `ofoxai` | OfoxAI | API-Schlüssel, Aggregator | [Link](https://ofox.ai) | Der aktuelle Katalog bewirbt mehr als 10 kostenlose Modelle ohne öffentliches numerisches Kontingent; prüfen Sie vor dem Produktionseinsatz die Herkunft der vorgelagerten Modelle sowie die Bedingungen zu Aufbewahrung und Training. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-Schlüssel | [Link](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API-Schlüssel | [Link](https://1min.ai) | Erstellen Sie unter https://docs.1min.ai/docs/api/create-api-key einen API-Schlüssel und fügen Sie ihn anschließend hier ein. | +| `openadapter` | `oad` | OpenAdapter | API-Schlüssel | [Link](https://openadapter.dev) | Verwenden Sie Ihren OpenAdapter-API-Schlüssel in Authorization: Bearer sk-cv-. Vollständig OpenAI-kompatibel. API-Basis-URL: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API-Schlüssel | [Link](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API-Schlüssel | [Link](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-Schlüssel | [Link](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API-Schlüssel | [Link](https://openference.com) | Kostenlose Stufe: umfasst Qwen3.8 27b und Llama 3.2 3B — aktuelle Bedingungen finden Sie unter openference.com/pricing | +| `openrouter` | `openrouter` | OpenRouter | API-Schlüssel, Aggregator | [Link](https://openrouter.ai) | Kostenlose Modelle zu $0/Token mit dem Suffix :free – 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API-Schlüssel | [Link](https://openvecta.com) | Kostenloses Guthaben bei der Registrierung für OpenAI-kompatible Inferenz mit LLMs, Einbettungen und Reasoning-Modellen | +| `opper` | `opper` | Opper | API-Schlüssel, Aggregator | [Link](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API-Schlüssel | [Link](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API-Schlüssel | [Link](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API-Schlüssel | [Link](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-Schlüssel | [Link](https://www.perplexity.ai) | Verwenden Sie Ihren Perplexity-API-Schlüssel. OmniRoute leitet Modell-IDs der Agent API über den Responses-kompatiblen Endpunkt von Perplexity weiter. | +| `piapi` | `pi` | PiAPI | API-Schlüssel, Aggregator | [Link](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API-Schlüssel | [Link](https://pioneer.ai) | $75 kostenloses Nutzungsguthaben — keine Kreditkarte erforderlich | +| `plamo` | `plamo` | PLaMo | API-Schlüssel | [Link](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API-Schlüssel, Aggregator | [Link](https://creator.poe.com/api-reference) | Bearer-API-Schlüssel für die OpenAI-kompatible API von Poe. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API-Schlüssel, Aggregator | [Link](https://poixe.com) | Die aktuellen öffentlichen kostenlosen Limits sind niedrig und hängen von der Modellgruppe ab: 2 RPM/5 RPD für Large-Cup-Modelle und 20 RPM/50 RPD für Small-Cup-Modelle. | +| `pollinations` | `pol` | Pollinations AI | API-Schlüssel, Video | [Link](https://pollinations.ai) | Der anonyme/schlüssellose Zugriff auf die dokumentierten kostenlosen Modelle erfolgt nach dem Best-Effort-Prinzip. Die lokale Überprüfung mit v3.8.50 (2026-07-31) ergab 401 über OmniRoute und Cloudflare 1010 bei direkten Prüfungen des vorgelagerten Dienstes aus demselben Netzwerk. Premium-Modelle erfordern weiterhin einen Pollinations-API-Schlüssel von enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API-Schlüssel | [Link](https://poolside.ai) | Laguna S 2.1 und XS 2.1 sind während der Vorschau kostenlos; es wird kein öffentliches numerisches Kontingent angegeben. | +| `predibase` | `predibase` | Predibase | API-Schlüssel | [Link](https://predibase.com) | ⚠️ **VERALTET.** serving.app.predibase.com wird nicht mehr aufgelöst (Überprüfung 2026-06-19); die verwaltete Serving-API scheint eingestellt worden zu sein. | +| `publicai` | `publicai` | PublicAI | API-Schlüssel | [Link](https://publicai.co) | Erfordert einen API-Schlüssel — einmaliges Registrierungsguthaben, danach kostenpflichtig | +| `qianfan` | `qianfan` | Baidu Qianfan | API-Schlüssel | [Link](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API-Schlüssel | [Link](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API-Schlüssel | [Link](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-Schlüssel | [Link](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API-Schlüssel, Bild | [Link](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API-Schlüssel | [Link](https://regolo.ai) | Rufen Sie Ihren Regolo-API-Schlüssel von regolo.ai ab und fügen Sie ihn dann hier als Bearer-Token ein. | +| `reka` | `reka` | Reka | API-Schlüssel | [Link](https://docs.reka.ai/chat/overview) | Verwenden Sie Ihren Reka-API-Schlüssel. OmniRoute unterstützt die OpenAI-kompatible Basis-URL https://api.reka.ai/v1 und sendet aus Kompatibilitätsgründen sowohl den Authorization- als auch den X-Api-Key-Header. | +| `requesty` | `requesty` | Requesty | API-Schlüssel | [Link](https://requesty.ai) | Kostenloses Kontingent mit ca. 200 Anfragen/Tag – Routing-Gateway für mehrere Modelle (über 300 Modelle) | +| `routeway` | `routeway` | Routeway | API-Schlüssel | [Link](https://routeway.ai) | Erstellen Sie unter routeway.ai einen kostenlosen API-Schlüssel und fügen Sie ihn dann hier als Bearer-Token ein. | +| `runwayml` | `runway` | Runway | API-Schlüssel, Video | [Link](https://docs.dev.runwayml.com) | Verwenden Sie Ihren Runway-API-Schlüssel in Authorization: Bearer . OmniRoute verwendet die aktuelle Runway-API unter https://api.dev.runwayml.com/v1 und sendet den erforderlichen X-Runway-Version-Header automatisch. | +| `sambanova` | `samba` | SambaNova | API-Schlüssel | [Link](https://sambanova.ai) | 5 $ kostenloses Startguthaben bei der Registrierung (30 Tage gültig), keine Kreditkarte erforderlich | +| `sap` | `sap` | SAP Generative AI Hub | API-Schlüssel, Unternehmen | [Link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Verwenden Sie Ihr SAP-AI-Core-Bearer-Token. Als Basis-URL kann Ihr AI_API_URL-Stamm oder eine deploymentUrl aus dem Generative AI Hub verwendet werden. | +| `sarvam` | `sarvam` | Sarvam AI | API-Schlüssel | [Link](https://docs.sarvam.ai) | 1.000 ₹ kostenloses Startguthaben – verfällt nie | +| `scaleway` | `scw` | Scaleway AI | API-Schlüssel | [Link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 Mio. kostenlose Token für neue Konten – EU-/DSGVO-konform (Paris), Qwen3 235B und Llama 70B | +| `sealion` | `sealion` | SEA-LION | API-Schlüssel | [Link](https://sea-lion.ai) | Melden Sie sich unter sea-lion.ai mit Google an (keine Karte, keine Regionsbeschränkung), erstellen Sie einen API-Schlüssel und fügen Sie ihn dann hier ein. | +| `seekai` | `ska` | SeekAi | API-Schlüssel, Aggregator | [Link](https://seekai.cc) | Erstellen Sie unter https://seekai.cc einen API-Schlüssel und fügen Sie ihn dann hier als Bearer-Token ein. | +| `segmind` | `segmind` | Segmind | API-Schlüssel, Bild, Video | [Link](https://segmind.com) | Verwenden Sie Ihren Segmind-API-Schlüssel im x-api-key-Header. OmniRoute verwendet https://api.segmind.com/v1/ und gibt die generierten Bild-/Videobytes direkt zurück. | +| `sensenova` | `sensenova` | SenseNova | API-Schlüssel | [Link](https://platform.sensenova.cn) | Rufen Sie den API-Schlüssel unter platform.sensenova.cn ab | +| `siliconflow` | `siliconflow` | SiliconFlow | API-Schlüssel | [Link](https://cloud.siliconflow.com) | 1 $ kostenloses Guthaben sowie derzeit aufgeführte 0-$-Modelle nach Identitätsprüfung; Verfügbarkeit und Limits können sich ändern | +| `snowflake` | `snowflake` | Snowflake Cortex | API-Schlüssel, Unternehmen | [Link](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API-Schlüssel | [Link](https://xinghuo.xfyun.cn) | Rufen Sie den API-Schlüssel unter console.xfyun.cn ab | +| `speka` | `speka` | Speka AI | API-Schlüssel, Aggregator | [Link](https://speka.me) | Kostenloser Tarif: 1 $ monatliche Nutzung, 10 RPM, ein API-Schlüssel sowie Zugriff auf offene Modelle und den Playground; keine Karte erforderlich. | +| `stability-ai` | `stability` | Stability AI | API-Schlüssel, Bild | [Link](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API-Schlüssel | [Link](https://stepfun.com) | Rufen Sie den API-Schlüssel unter platform.stepfun.com ab | +| `sumopod` | `sumopod` | SumoPod | API-Schlüssel | [Link](https://ai.sumopod.com) | Verwenden Sie Ihren SumoPod-API-Schlüssel (sk-...) in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API-Schlüssel | [Link](https://suno.ai) | Fügen Sie das Sitzungscookie von suno.ai ein (Clerk-Authentifizierung) | +| `synthetic` | `synthetic` | Synthetic | API-Schlüssel, Aggregator | [Link](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API-Schlüssel, Aggregator | [Link](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API-Schlüssel | [Link](https://hunyuan.tencent.com) | Rufen Sie den API-Schlüssel unter console.cloud.tencent.com ab | +| `thebai` | `thebai` | TheB.AI | API-Schlüssel, Aggregator | [Link](https://theb.ai) | Bearer-API-Schlüssel für das OpenAI-kompatible Gateway von TheB.AI. | +| `tinyfish` | `tf` | TinyFish Fetch | API-Schlüssel | [Link](https://docs.tinyfish.ai/fetch-api) | X-API-Key von agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API-Schlüssel, Video | [Link](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API-Schlüssel | [Link](https://agent-router.gaib.ai) | Verwenden Sie Ihren Token-Kiosk-API-Schlüssel in Authorization: Bearer . Vollständig OpenAI-kompatibles Gateway. API-Basis-URL: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API-Schlüssel, Aggregator | [Link](https://www.tokenreply.com) | Als kostenlos gekennzeichnete Modelle haben modell- und kampagnenspezifische Tageslimits; es wird kein festes globales Gratiskontingent veröffentlicht. | +| `tokenrouter` | `trk` | TokenRouter | API-Schlüssel | [Link](https://tokenrouter.com) | Verwenden Sie Ihren TokenRouter-API-Schlüssel in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API-Schlüssel, Bild | [Link](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API-Schlüssel | [Link](https://docs.opentyphoon.ai) | Kostenloser API-Schlüssel mit einem Ratenlimit von 5 Anfragen/s und 200 Anfragen/min. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API-Schlüssel | [Link](https://uncensored.com) | Verwenden Sie Ihren uncensored.com-Developer-API-Schlüssel (uai_sk_live_...). OmniRoute sendet ihn als X-api-key-Header an den OpenAI-kompatiblen Endpunkt https://api.uncensored.com/api/v1. Der Schlüssel läuft nie ab. Dies ist die nutzungsbasierte Oberfläche mit Credits; der Chat mit Abonnement ohne nutzungsabhängige Abrechnung ist der separate Anbieter 'uc'. | +| `udio` | `udio` | Udio | API-Schlüssel | [Link](https://udio.com) | Fügen Sie das Sitzungscookie von udio.com (Supabase-Authentifizierung) ein. | +| `unorouter` | `unorouter` | UnoRouter | API-Schlüssel, Aggregator | [Link](https://unorouter.ai) | Modelle mit dem Suffix :free belasten das Guthaben nicht; das Limit beträgt 1 Anfrage/Minute pro kostenlosem Modell und Benutzer. | +| `upstage` | `upstage` | Upstage | API-Schlüssel | [Link](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API-Schlüssel | [Link](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API-Schlüssel | [Link](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API-Schlüssel, Aggregator | [Link](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API-Schlüssel, Unternehmen | [Link](https://cloud.google.com/vertex-ai) | Geben Sie Service Account JSON, ein OAuth-Zugriffstoken, einen Vertex Express-API-Schlüssel oder einen an ein Dienstkonto gebundenen Autorisierungsschlüssel an. Der Express-Modus unterstützt nur Gemini; Partnermodelle erfordern projektbezogene Anmeldedaten. | +| `vertex-partner` | `vp` | Vertex AI Partners | API-Schlüssel, Unternehmen | [Link](https://cloud.google.com/vertex-ai) | Geben Sie Service Account JSON oder OAuth-Anmeldedaten an. Ein an ein Dienstkonto gebundener Autorisierungsschlüssel unterstützt ebenfalls die Erkennung, für die Partner-Inferenz ist jedoch zusätzlich die zugehörige Google Cloud-Projekt-ID erforderlich. Standardmäßige Express-Schlüssel unterstützen nur Gemini. | +| `void-ai` | `void-ai` | Void AI | API-Schlüssel, Aggregator | [Link](https://voidai.app) | Der öffentliche Modellkatalog kennzeichnet einige Modelle als Modelle, die einen kostenlosen Tarif voraussetzen; der Zugriff ist jedoch an Bedingungen geknüpft und es wurde kein numerisches Kontingent bestätigt. | +| `volcengine` | `volcengine` | Volcengine | API-Schlüssel | [Link](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API-Schlüssel | [Link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Verbinden Sie Ihr Volcano Engine-Konto oder verwenden Sie einen Abonnement-API-Schlüssel für den Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API-Schlüssel | [Link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Verbinden Sie Ihr Volcano Engine-Konto oder verwenden Sie einen Abonnement-API-Schlüssel für den Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | API-Schlüssel, Einbettung/Neusortierung | [Link](https://www.voyageai.com) | Bearer-API-Schlüssel für die Einbettungs- und Neusortierungs-APIs von Voyage AI. | +| `wafer` | `wafer` | Wafer AI | API-Schlüssel | [Link](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API-Schlüssel | [Link](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API-Schlüssel, Unternehmen | [Link](https://www.ibm.com/products/watsonx-ai) | Verwenden Sie Ihr watsonx-Bearer-Token. Die Basis-URL kann https://.ml.cloud.ibm.com/ml/gateway/v1/ oder ein selbstverwalteter /ml/gateway/v1-Endpunkt sein. | +| `writer` | `writer` | Writer | API-Schlüssel | [Link](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API-Schlüssel | [Link](https://x5lab.dev) | Verwenden Sie Ihren X5Lab-API-Schlüssel (x5-...) in Authorization: Bearer . Vollständig OpenAI-kompatibel. API-Basis-URL: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API-Schlüssel | [Link](https://x.ai) | Verwenden Sie einen offiziellen xAI-API-Schlüssel oder melden Sie sich mit xAI OAuth an. Grok Build-JWT-Sitzungen bleiben ein separater Anbieter. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API-Schlüssel | [Link](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API-Schlüssel | [Link](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API-Schlüssel, Aggregator | [Link](https://xkiro.com) | Erstellen Sie ein kostenloses Konto bei xkiro.com und fügen Sie den Schlüssel hier ein (Bearer; x-api-key wird ebenfalls akzeptiert). | +| `yi` | `yi` | Yi (01.AI) | API-Schlüssel | [Link](https://01.ai) | Beziehen Sie den API-Schlüssel über platform.lingyiwanwu.com. | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API-Schlüssel, Aggregator | [Link](https://yolo-auto.com) | Der kostenlose API-Zugriff ist hinsichtlich der Anfragen begrenzt und für Tests vorgesehen; es ist kein numerisches Tageskontingent veröffentlicht, und ein dauerhaft kostenloser Zugriff wird nicht zugesichert. | +| `zai` | `zai` | Z.AI | API-Schlüssel | [Link](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API-Schlüssel | [Link](https://zenmux.ai) | Verwenden Sie Ihren ZenMux-API-Schlüssel in Authorization: Bearer . ZenMux ist vollständig OpenAI-kompatibel. Basis-URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API-Schlüssel, Aggregator | [Link](https://www.zerolimitai.com) | Es wird mit einer vorübergehenden kostenlosen Testphase geworben, die offiziellen Seiten widersprechen sich jedoch hinsichtlich einer Dauer von 3 oder 7 Tagen; die Angabe von 100 Aufrufen/Tag wird nicht als dauerhaft betrachtet. | +| `zylo-api` | `zylo` | Zylo API | API-Schlüssel, Aggregator | [Link](https://zyloai.net) | Basic-Tarif: 10 RPM, 7.200 Anfragen/Tag und 200.000 Token/Tag; beschränkt auf Basic-Textmodelle. | ## Lokale Anbieter (14) diff --git a/docs/i18n/de/docs/routing/REASONING_REPLAY.md b/docs/i18n/de/docs/routing/REASONING_REPLAY.md index 8be0e927c6a7..9727b40eb2b2 100644 --- a/docs/i18n/de/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/de/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ Typische Clients (Cursor, Cline, Roo Code, OpenAI SDK) entfernen jedoch `reasoni ## Architektur ``` -Dialogrunde N (Assistent generiert): +Runde N (Assistent generiert): → Antwort enthält reasoning_content + tool_calls - → falls requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - schreibt (Arbeitsspeicher + DB), indiziert nach jeder tool_call.id - → Antwort an den Client weiterleiten (der die Begründung möglicherweise beibehält) + → wenn requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() + schreibt (Arbeitsspeicher + DB), indiziert über jede tool_call.id + → Antwort an den Client weiterleiten (der die Reasoning-Daten möglicherweise speichert oder auch nicht) -Dialogrunde N+1 (Client sendet Folgeanfrage): +Runde N+1 (Client sendet Folgeanfrage): → Übersetzer erkennt: requiresReasoningReplay(provider, model) === true → für jede Assistentennachricht mit tool_calls und ohne reasoning_content: lookupReasoning(toolCalls[0].id) → Arbeitsspeicher → DB - Treffer → msg.reasoning_content = cached; recordReplay() - Fehlschlag → msg.reasoning_content = "" (Legacy-Fallback für ältere DeepSeek-Versionen) - → Upstream sieht einen konsistenten Verlauf → kein 400-Fehler + Treffer → msg.reasoning_content = cached; recordReplay() + kein Treffer → msg.reasoning_content = "" (Legacy-Fallback für ältere DeepSeek-Versionen) + → Upstream erhält einen konsistenten Verlauf → kein 400 ``` -Die Erfassung erfolgt in `open-sse/handlers/chatCore.ts` (an zwei Stellen, nämlich den beiden Aufrufstellen von `cacheReasoningFromAssistantMessage`). Die Wiedergabe erfolgt in `open-sse/translator/index.ts` nach der Schema-Koerzierung, jedoch vor der Weiterleitung. +Die Erfassung erfolgt in `open-sse/handlers/chatCore.ts` (an zwei Stellen, nämlich den beiden Aufrufstellen von `cacheReasoningFromAssistantMessage`). Die Wiedergabe erfolgt in `open-sse/translator/index.ts` nach der Schema-Koersion, aber vor der Weiterleitung. + +Gewöhnliche Assistentenrunden (ohne Tool-Aufruf) werden anders indiziert: `buildAssistantMessageCacheKey()` bildet einen Digest aus dem Sitzungskontext und dem normalisierten Transkript im OpenAI-Format bis zu dieser Runde, da DeepSeek das Reasoning _jeder_ vorherigen Runde benötigt, sobald `tools` vorhanden ist. Bei Responses-API-Zielen (zum Beispiel `opencode-go/deepseek-v4-flash`, weitergeleitet an `/responses`) enthält der Upstream-Body `input` statt `messages`. Daher meldet `translateRequest()` (`open-sse/translator/index.ts`) das von ihm verarbeitete Pivot-Transkript über eine Callback-Option, und die Erfassungsstellen bilden einen Digest desselben Transkripts. Der Responses-Wiedergabedurchlauf erfolgt für jedes Quellformat auf dem OpenAI-Pivot, sodass auch Anthropic-Messages-Clients (Claude → OpenAI → Responses) wiedergegeben werden. ## Speicherung — Hybrider Arbeitsspeicher + SQLite diff --git a/docs/i18n/de/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/de/docs/security/SOCKET_DEV_FINDINGS.md index eeb71e0f1c51..39392e07827e 100644 --- a/docs/i18n/de/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/de/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,26 +4,24 @@ --- -Dieses Dokument ist die vom Maintainer verfasste Attestierung für die sechs -Befunde vom Typ `AI-detected potential malware`, die für `omniroute@3.8.5` -gemeldet wurden, sowie für die in `omniroute@3.8.6` umgesetzten -Abhilfemaßnahmen. Es dient folgenden Zwecken: +> **Hinweis zum Geltungsbereich:** `socket.yml` konfiguriert den Registry-seitigen Post-Publish-Scan des npm-Artefakts durch Socket.dev (Ignorierpfade für nicht ausgelieferte Inhalte wie `tests/`, `docs/` und Build-Berichte). Die Datei richtet keine CI-/PR-Merge-Sperre ein — weder ein Workflow in `.github/workflows` noch ein `package.json`-Skript oder ein `Makefile`-Target ruft Socket.dev auf. + +Dieses Dokument ist die von den Maintainern verfasste Bestätigung zu den sechs +für `omniroute@3.8.5` gemeldeten Funden der Kategorie `KI-erkanntes potenzielles Schadprogramm` +und zu den in `omniroute@3.8.6` angewandten Abhilfemaßnahmen. Es dient folgenden Zwecken: 1. Betreiber von Sicherheitspipelines erhalten eine zentrale Referenz, auf die - sie sich berufen können, wenn sie die Befunde anhand des tatsächlichen - Quellcodes bewerten müssen. -2. Zukünftige KI-Scanner können die vom Maintainer signierte Erklärung - erkennen, dass jeder markierte Pfad beabsichtigt, optional und dokumentiert - ist. -3. Wir verfügen über eine schriftliche Aufzeichnung darüber, _warum_ jede - Aufrufstelle in dieser Form gestaltet ist — damit ein zukünftiges - Refactoring nicht versehentlich einen Fingerabdruck wieder einführt, der - bewusst entfernt wurde. - -Wenn Sie einen Scanner betreiben, der nach Auslieferung der -v3.8.6-Abhilfemaßnahmen eine der nachfolgend aufgeführten Aufrufstellen erneut -markiert, öffnen Sie bitte ein Issue mit dem Scan-Trace; wir werden die -Attestierung hier entsprechend ergänzen. + sie sich bei der Bewertung der Funde anhand des tatsächlichen Quellcodes berufen können. +2. Zukünftige KI-Scanner können die von den Maintainern unterzeichnete Erklärung erfassen, + dass jeder markierte Pfad beabsichtigt, optional und dokumentiert ist. +3. Es gibt eine schriftliche Aufzeichnung darüber, _warum_ jede Aufrufstelle so gestaltet ist — + damit bei einem zukünftigen Refactoring nicht versehentlich ein Fingerabdruck wieder + eingeführt wird, der bewusst entfernt wurde. + +Wenn Sie einen Scanner betreiben, der nach der Veröffentlichung der +Abhilfemaßnahmen in v3.8.6 eine der unten aufgeführten Aufrufstellen erneut markiert, +öffnen Sie bitte ein Issue mit dem Scan-Trace; wir werden die Bestätigung hier entsprechend +erweitern. --- diff --git a/docs/i18n/el/README.md b/docs/i18n/el/README.md index 3d83d6260061..19cf6874d52d 100644 --- a/docs/i18n/el/README.md +++ b/docs/i18n/el/README.md @@ -19,17 +19,17 @@
-## 💰 ~1,62 δισ. δωρεάν tokens / μήνα +## 💰 ~1.62B Δωρεάν Tokens / Μήνα
-> Η χειροκίνητη συγκέντρωση δωρεάν βαθμίδων είναι επίπονη — δεκάδες SDK, δεκάδες όρια ρυθμού και καμία σαφής εικόνα για το πόσα διαθέτετε πραγματικά. Το OmniRoute καταγράφει **491 καταχωρίσεις δωρεάν βαθμίδων σε 35 επαναλαμβανόμενα κλειδιά pool** και υπολογίζει τον συνολικό αριθμό tokens από τα **17 pools με δημοσιευμένο θετικό μηνιαίο προϋπολογισμό συν πέντε όρια Groq ανά μοντέλο**, εξαλείφοντας τις διπλοεγγραφές ανά κοινόχρηστο pool. Τα quotas που ενεργοποιούνται μόνο μετά από περιφερειακό έλεγχο ταυτότητας (σήμερα: ModelScope) εμφανίζονται ξεχωριστά, +~6M πίσω από περιφερειακή επαλήθευση ταυτότητας, και δεν προστίθενται ποτέ στο συνολικό ποσό. Το αποτέλεσμα παραμένει ορατό στον πίνακα ελέγχου (`/dashboard/free-tiers`). +> Η χειροκίνητη στοίβαξη δωρεάν βαθμίδων είναι επίπονη — δεκάδες SDK, δεκάδες όρια ρυθμού και καμία σαφής εικόνα για το πόσο διαθέτετε πραγματικά. Το OmniRoute καταγράφει **489 καταχωρίσεις δωρεάν βαθμίδων σε 35 επαναλαμβανόμενα κλειδιά pool** και υπολογίζει τον συνολικό αριθμό των token από τα **17 pool με δημοσιευμένο θετικό μηνιαίο προϋπολογισμό, συν πέντε όρια Groq ανά μοντέλο**, εξαλείφοντας τις διπλοεγγραφές ανά κοινόχρηστο pool. Τα quota που ενεργοποιούνται μόνο μετά από περιφερειακό έλεγχο ταυτότητας (σήμερα: ModelScope) εμφανίζονται ξεχωριστά, +~6M πίσω από περιφερειακή επαλήθευση ταυτότητας, και δεν προστίθενται ποτέ στον συνολικό αριθμό. Το αποτέλεσμα παραμένει ορατό στον πίνακα ελέγχου (`/dashboard/free-tiers`). -Κάρτα προϋπολογισμού δωρεάν βαθμίδων του OmniRoute: ~1,62 δισ. δωρεάν tokens ανά μήνα σταθερά, έως ~2,22 δισ. τον πρώτο μήνα με πιστώσεις εγγραφής, από 35 τεκμηριωμένα επαναλαμβανόμενα κλειδιά pool που καλύπτουν 491 καταγεγραμμένες καταχωρίσεις δωρεάν βαθμίδων πίσω από ένα endpoint. Ειλικρινής υπολογισμός με εξάλειψη διπλοεγγραφών ανά pool — κάθε κοινόχρηστο pool υπολογίζεται μία φορά, συμπεριλαμβανομένων 17 επαναλαμβανόμενων pools με δημοσιευμένο θετικό μηνιαίο προϋπολογισμό tokens συν πέντε όρια Groq ανά μοντέλο· 13 πάροχοι επισημαίνονται ως προς αποφυγή στον κατάλογο κινδύνων όρων χρήσης, ώστε να αποφασίσετε εσείς. Η γραμμή προϋπολογισμού περιλαμβάνει Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (πέντε όρια ανά μοντέλο) και μικρότερα pools, καθώς και πιστώσεις εγγραφής για τον πρώτο μήνα και μόνιμα δωρεάν παρόχους χωρίς όριο tokens, οι οποίοι εμφανίζονται ξεχωριστά ώστε να μην αυξάνουν ποτέ τεχνητά το συνολικό ποσό. Ζωντανή προβολή χρησιμοποιημένων/υπολειπόμενων στο /dashboard/free-tiers. +Κάρτα προϋπολογισμού δωρεάν βαθμίδων του OmniRoute: ~1.62B δωρεάν token ανά μήνα σε σταθερή βάση, έως ~2.22B τον πρώτο μήνα με πιστώσεις εγγραφής, από 35 τεκμηριωμένα επαναλαμβανόμενα κλειδιά pool που καλύπτουν 489 καταγεγραμμένες καταχωρίσεις δωρεάν βαθμίδων πίσω από ένα endpoint. Ειλικρινής υπολογισμός με εξάλειψη διπλοεγγραφών ανά pool — κάθε κοινόχρηστο pool υπολογίζεται μία φορά, συμπεριλαμβανομένων 17 επαναλαμβανόμενων pool με δημοσιευμένο θετικό μηνιαίο προϋπολογισμό token, συν πέντε όρια Groq ανά μοντέλο· 13 πάροχοι επισημαίνονται προς αποφυγή στον κατάλογο κινδύνων όρων χρήσης, ώστε να αποφασίσετε εσείς. Η μπάρα προϋπολογισμού περιλαμβάνει Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (πέντε όρια ανά μοντέλο) και μικρότερα pool, καθώς και πιστώσεις εγγραφής του πρώτου μήνα και μόνιμα δωρεάν παρόχους χωρίς όριο token, οι οποίοι εμφανίζονται ξεχωριστά ώστε να μην αυξάνουν ποτέ τεχνητά τον συνολικό αριθμό. Ζωντανή προβολή χρησιμοποιημένων/υπολειπόμενων στο /dashboard/free-tiers. > Κινούμενη σύνοψη της ζωντανής σελίδας `/dashboard/free-tiers`. Πλήρης μεθοδολογία (εξάλειψη διπλοεγγραφών pool, βαθμίδες πιστώσεων, όροι παρόχων): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Αυτά τα στοιχεία επανελέγχονται κάθε δύο εβδομάδες σε σύγκριση με τον ζωντανό κατάλογο και **μεταβάλλονται και προς τις δύο κατευθύνσεις** — αν ένας πάροχος τερματίσει μια δωρεάν βαθμίδα, ο αριθμός μειώνεται· αν προστεθεί μια νέα, αυξάνεται. Δημοσιεύουμε ό,τι υπολογίζει πραγματικά ο κατάλογος, ποτέ μια στρογγυλοποιημένη προς τα πάνω βέλτιστη περίπτωση. +> Αυτά τα στοιχεία επανελέγχονται κάθε δύο εβδομάδες βάσει του ζωντανού καταλόγου και **μεταβάλλονται και προς τις δύο κατευθύνσεις** — όταν ένας πάροχος τερματίζει μια δωρεάν βαθμίδα, ο αριθμός μειώνεται· όταν προστίθεται μια νέα, αυξάνεται. Δημοσιεύουμε ό,τι υπολογίζει πραγματικά ο κατάλογος, ποτέ μια στρογγυλοποιημένη προς τα πάνω ιδανική εκδοχή.
@@ -37,7 +37,7 @@

-⭐ Προσθέστε αστέρι στο αποθετήριο αν το OMNIROUTE σάς βοήθησε να εξοικονομήσετε χρήματα και να διευκολύνετε την εργασία σας. +⭐ Βάλτε αστέρι στο αποθετήριο αν το OMNIROUTE σάς βοήθησε να εξοικονομήσετε χρήματα και να κάνετε τη δουλειά σας ευκολότερη.

@@ -48,7 +48,7 @@ ### 💬 Γίνετε μέλος της κοινότητας -**👋 Ακολουθήστε τον συντηρητή — ενημερωθείτε πρώτοι για νέους παρόχους, εκδόσεις και συμβουλές:** +**👋 Ακολουθήστε τον συντηρητή — μάθετε πρώτοι για νέους παρόχους, εκδόσεις και συμβουλές:** [![Ακολουθήστε τον Diego στο LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Ακολουθήστε τον @diegosouzapw στο GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -59,7 +59,7 @@ [![WhatsApp Βραζιλία](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Ιστότοπος](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Ερωτήσεις, συμβουλές για παρόχους, οδικός χάρτης και υποστήριξη → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Παγκόσμιο](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Βραζιλία](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Πύλη](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Ερωτήσεις, συμβουλές για παρόχους, χάρτης πορείας και υποστήριξη → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Παγκόσμιο](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Βραζιλία](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Πύλη](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -599,59 +599,59 @@ Pix copia-e-cola:
-## 🤖 Συμβατά CLIs & Κωδικοί Πράκτορες +## 🤖 Συμβατά CLI & Agents Προγραμματισμού -> Μία ρύθμιση — `http://localhost:20128/v1` — και **κάθε** AI IDE ή CLI τρέχει με δωρεάν και χαμηλού κόστους μοντέλα. +> Μία ρύθμιση — `http://localhost:20128/v1` — και **κάθε** AI IDE ή CLI λειτουργεί με δωρεάν μοντέλα και μοντέλα χαμηλού κόστους.
- - - + + + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + +
Claude Code
Claude Code
Codex CLI
Codex CLI
Cline
Cline
Claude Code
Claude Code
                           
Codex CLI
Codex CLI
                           
Cline
Cline
                           
Kilo Code
Kilo Code
Zoo Code
Zoo Code
Continue
Continue
Continue
Continue
                           
Aider
Aider
ForgeCode
ForgeCode
jcode
jcode
DeepSeek TUI
DeepSeek TUI
CodeWhale
CodeWhale
OpenCode
OpenCode
Aider
Aider
                           
ForgeCode
ForgeCode
                           
jcode
jcode
                           
DeepSeek TUI
DeepSeek TUI
                           
CodeWhale
CodeWhale
                           
OpenCode
OpenCode
                           
Factory Droid
Factory Droid
GitHub Copilot CLI
Copilot CLI
Cursor CLI
Cursor CLI
Smelt
Smelt
Pi (pi-coding-agent)
Pi
Grok Build (xAI)
Grok Build
Factory Droid
Factory Droid
                           
GitHub Copilot CLI
Copilot CLI
                           
Cursor CLI
Cursor CLI
                           
Smelt
Smelt
                           
Pi (pi-coding-agent)
Pi
                           
Grok Build (xAI)
Grok Build
                           
Hermes Agent (Nous Research)
Hermes Agent
OpenClaw
OpenClaw
Goose
Goose
Open Interpreter
Open Interpreter
Warp AI
Warp AI
Agent Deck
Agent Deck
Hermes Agent (Nous Research)
Hermes Agent
                           
OpenClaw
OpenClaw
                           
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
deyin.ai
deyin.ai
                           
-+ λειτουργεί επίσης με · Kiro · Command Code · Antigravity · Windsurf · AMP · οποιοδήποτε εργαλείο συμβατό με OpenAI ++ λειτουργεί επίσης με · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · οποιοδήποτε εργαλείο συμβατό με το OpenAI
-📖 Ρύθμιση ανά εργαλείο για όλα τα 36 εργαλεία (26 CLI Code + 10 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Πρόσθετο OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Ρύθμιση ανά εργαλείο και για τα 36 εργαλεία (26 CLI Code + 10 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Πρόσθετο OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Εκκινήστε οποιοδήποτε υποστηριζόμενο CLI μέσω του OmniRoute με μία εντολή** — χωρίς αρχεία ρυθμίσεων, -τα διαπιστευτήρια εισάγονται ανά διεργασία, τα Qwen/Gemini αποκτούν μια μεμονωμένη απομονωμένη αρχική κατάλογο: +**Εκκινήστε οποιοδήποτε υποστηριζόμενο CLI μέσω του OmniRoute με μία εντολή** — χωρίς εγγραφή αρχείων ρυθμίσεων, +με διαπιστευτήρια που εισάγονται ανά διεργασία και με προσωρινό, απομονωμένο αρχικό κατάλογο για Qwen/Gemini: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -662,27 +662,27 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Ή επιλέξτε παρόχο+μοντέλο διαδραστικά και γράψτε τη δική του ρύθμιση του εργαλείου: +# Εναλλακτικά, επιλέξτε διαδραστικά πάροχο+μοντέλο και εγγράψτε τις ρυθμίσεις του ίδιου του εργαλείου: omniroute configure codex # επίσης: claude opencode qwen aider goose gemini cline continue kilo ``` -Κάθε εντολή τιμά το ενεργό απομακρυσμένο πλαίσιο (`omniroute connect `), η `--dry-run` -προεπισκοπεί ακριβώς το περιβάλλον/ορίσματα χωρίς εκτέλεση, και η `--api-key-env NAME` κρατά τα μυστικά εκτός -του ιστορικού του κελύφους. → [Ενσωματώσεις CLI](docs/guides/CLI-INTEGRATIONS.md) +Κάθε εντολή χρησιμοποιεί το ενεργό απομακρυσμένο περιβάλλον (`omniroute connect `), η επιλογή `--dry-run` +προβάλλει τις ακριβείς μεταβλητές περιβάλλοντος/ορίσματα χωρίς εκτέλεση, ενώ η επιλογή `--api-key-env NAME` διατηρεί τα μυστικά εκτός +του ιστορικού του κελύφους σας. → [Ενσωματώσεις CLI](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 Πάροχοι AI — 152 Επισημασμένοι στον Κατάλογο ως Δωρεάν +## 🌐 357 πάροχοι AI — 152 επισημασμένοι στον κατάλογο ως δωρεάν
-> **357 καταχωρισμένοι πάροχοι** στις κανονικές συλλογές συνομιλίας, πολυμέσων, αναζήτησης, τοπικών υπηρεσιών, πρακτόρων cloud και συστήματος, συμπεριλαμβανομένων **152 που διαθέτουν μεταδεδομένα εντοπισμού `hasFree: true`**. Το μητρώο μοντέλων συνομιλίας καλύπτει **229 παρόχους / 2.554 διακριτά ζεύγη παρόχου-μοντέλου / 1.283 ανεπεξέργαστα αναγνωριστικά μοντέλων**· ο ξεχωριστός κατάλογος δωρεάν ορίων χρήσης περιλαμβάνει **491 εγγραφές ανά μοντέλο**, **35 επαναλαμβανόμενες κοινές δεξαμενές** και **54 επαναλαμβανόμενους/χωρίς κλειδί παρόχους που παραμένουν δωρεάν για πάντα**. Πρόκειται εκ σχεδιασμού για διαφορετικούς παρονομαστές· οι ορισμοί και οι υπολογισμοί με κατάργηση διπλοτύπων ανά κοινή δεξαμενή βρίσκονται στην [Αναφορά Παρόχων](docs/reference/PROVIDER_REFERENCE.md) και στα [Δωρεάν Επίπεδα](docs/reference/FREE_TIERS.md). +> **357 καταχωρισμένοι πάροχοι** στις κανονικές συλλογές συνομιλίας, πολυμέσων, αναζήτησης, τοπικών υπηρεσιών, πρακτόρων cloud και συστήματος, συμπεριλαμβανομένων **152 που φέρουν μεταδεδομένα εντοπισμού `hasFree: true`**. Το μητρώο μοντέλων συνομιλίας καλύπτει **229 παρόχους / 2.554 διακριτά ζεύγη παρόχου-μοντέλου / 1.283 ακατέργαστα αναγνωριστικά μοντέλων**· ο ξεχωριστός κατάλογος δωρεάν ορίων διαθέτει **491 εγγραφές ανά μοντέλο**, **35 επαναλαμβανόμενες κοινές δεξαμενές** και **54 επαναλαμβανόμενους/χωρίς κλειδί, μόνιμα δωρεάν παρόχους**. Αυτοί οι παρονομαστές διαφέρουν εκ σχεδιασμού· οι ορισμοί και οι υπολογισμοί με απαλοιφή διπλοτύπων ανά κοινή δεξαμενή βρίσκονται στην [Αναφορά παρόχων](docs/reference/PROVIDER_REFERENCE.md) και στα [Δωρεάν επίπεδα](docs/reference/FREE_TIERS.md).
-### 🏢 Κάθε μεγάλο εργαστήριο — μέσω ενός τελικού σημείου +### 🏢 Κάθε σημαντικό εργαστήριο — μέσω ενός endpoint @@ -711,18 +711,18 @@ omniroute configure codex # επίσης: claude opencode qwen aider go
-…και 330+ ακόμη — κάθε εικονίδιο ανακτάται ζωντανά από τον κατάλογο παρόχων του πίνακα ελέγχου. 📖 [Αναφορά Παρόχων](docs/reference/PROVIDER_REFERENCE.md) +…και 330+ ακόμη — κάθε εικονίδιο φορτώνεται δυναμικά από τον κατάλογο παρόχων του πίνακα ελέγχου. 📖 [Αναφορά παρόχων](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Δωρεάν για Πάντα — $0, χωρίς κάρτα +### 🆓 Δωρεάν για πάντα — $0, χωρίς κάρτα - + @@ -731,12 +731,12 @@ omniroute configure codex # επίσης: claude opencode qwen aider go - - + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Χωρίς όριο token
Kilo Code
Kilo Code
Αυτόματη δρομολόγηση, Tencent Hy3
Δωρεάν για πάντα
Requesty
Requesty
GPT-OSS 120B, Nemotron
Δωρεάν για πάντα
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Δωρεάν βαθμίδα
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Δωρεάν πακέτο
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Δωρεάν για πάντα
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Δωρεάν για πάντα
Pollinations
Pollinations
GPT, Llama, Claude
Δεν απαιτείται κλειδί
Cloudflare AI
Cloudflare AI
50+ μοντέλα
10K νευρώνες/ημέρα
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM δωρεάν
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M token/ημέρα
OpenRouter
OpenRouter
:δωρεάν μοντέλα
+$10 → υψηλότερο RPM
Openference
Openference
Qwen3.8 27B, Llama 3.2
Δωρεάν πακέτο
OpenRouter
OpenRouter
:free μοντέλα
+$10 → υψηλότερο RPM
-📖 Πλήρης κατάλογος αναγνώσιμος από μηχανές → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 Πλήρης κατάλογος σε μηχαναγνώσιμη μορφή → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1272,19 +1272,19 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη - - - + + + - - - - - + + + + + @@ -1303,25 +1303,25 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη
ΕπίπεδοΤεχνολογία
Περιβάλλον εκτέλεσηςNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
ΓλώσσαTypeScript 6.0 — 100% TypeScript σε όλο το src/ και το open-sse/ (μηδενική χρήση του any στον πυρήνα από την έκδοση v2.0)
ΠλαίσιοNext.js 16 + React 19 + Tailwind CSS 4
Βάση δεδομένωνbetter-sqlite3 (SQLite, καταγραφή WAL) + LowDB (παλαιού τύπου JSON) — 122 λειτουργικές μονάδες τομέα, 176 μετεγκαταστάσεις
ΓλώσσαTypeScript 6.0 — 100% TypeScript σε όλο το src/ και το open-sse/ (μηδενική χρήση any στον πυρήνα από την έκδοση v2.0)
FrameworkNext.js 16 + React 19 + Tailwind CSS 4
Βάση δεδομένωνbetter-sqlite3 (SQLite, καταγραφή WAL) + LowDB (παλαιού τύπου JSON) — 122 λειτουργικές μονάδες τομέα, 178 μετεγκαταστάσεις
ΜνήμηΑναζήτηση πλήρους κειμένου SQLite FTS5 + διανυσματικές ενσωματώσεις κβαντισμένες σε int8, τυποποιημένη εξασθένηση
ΣχήματαZod 4 — επικύρωση εισόδου/εξόδου εργαλείων MCP + συμβάσεις API
ΠρωτόκολλαMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
Ροή δεδομένωνServer-Sent Events (SSE) + γέφυρα WebSocket (/v1/ws)
ΣυμπίεσηΔιοχέτευση 12 μηχανών — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Έλεγχος ταυτότητας & ασφάλειαOAuth 2.0 (PKCE) + JWT + κλειδιά API + έλεγχος ταυτότητας βάσει εμβέλειας MCP · AES-256-GCM για δεδομένα σε αδράνεια · DOMPurify
Απόκρυψηwreq-js — μίμηση αποτυπώματος TLS JA3 / JA4, διακομιστής μεσολάβησης 3 επιπέδων
ΑνθεκτικότηταΑυτόματος διακόπτης κυκλώματος, εκθετική οπισθοχώρηση, αποτροπή ταυτόχρονων αιτημάτων μεγάλης κλίμακας, αυτοΐαση αυτόματων συνδυασμών
Καταγραφήpino — δομημένα αρχεία καταγραφής JSON με περιεχόμενο αιτήματος
ΔοκιμέςΠρόγραμμα εκτέλεσης δοκιμών Node.js + Vitest — 39.000+ στατικές δηλώσεις δοκιμών σε 5.100+ παρακολουθούμενα αρχεία δοκιμών (μονάδων, ενοποίησης, E2E, ασφάλειας, οικοσυστήματος)
Έλεγχος ταυτότητας & ασφάλειαOAuth 2.0 (PKCE) + JWT + κλειδιά API + έλεγχος ταυτότητας MCP βάσει πεδίου εφαρμογής · AES-256-GCM για αποθηκευμένα δεδομένα · DOMPurify
Απόκρυψηwreq-js — πλαστοπροσωπία αποτυπώματος JA3 / JA4 TLS, διακομιστής μεσολάβησης 3 επιπέδων
ΑνθεκτικότηταΑυτόματος διακόπτης κυκλώματος, εκθετική υπαναχώρηση, αποτροπή ταυτόχρονης μαζικής επανάληψης, αυτοΐαση auto-combo
Καταγραφήpino — δομημένα αρχεία καταγραφής JSON με περιβάλλον αιτήματος
ΔοκιμέςΠρόγραμμα εκτέλεσης δοκιμών Node.js + Vitest — 39.000+ στατικές δηλώσεις δοκιμών σε 5.100+ παρακολουθούμενα αρχεία δοκιμών (μονάδας, ενσωμάτωσης, E2E, ασφάλειας, οικοσυστήματος)
ΠλατφόρμεςΕπιτραπέζιοι υπολογιστές (Electron) · Android (Termux) · PWA (οποιοδήποτε πρόγραμμα περιήγησης)
CI/CDGitHub Actions — αυτόματη δημοσίευση στο npm + Docker Hub κατά την κυκλοφορία έκδοσης
ΣύνδεσμοιΙστότοπος · npm · Docker Hub
- + - - - + + +
ΈγγραφοΠεριγραφή
Οδηγός ΧρήστηΠάροχοι, συνδυασμοί, ενσωμάτωση CLI, ανάπτυξη
Οδηγός ΡύθμισηςΠλήρεις μέθοδοι εγκατάστασης, ρυθμίσεις εργαλείων CLI, ρύθμιση πρωτοκόλλων, προσαρμογή χρονικών ορίων
Οδηγός ΡύθμισηςΌλες οι μέθοδοι εγκατάστασης, διαμορφώσεις εργαλείων CLI, ρύθμιση πρωτοκόλλων, προσαρμογή χρονικών ορίων
Οδηγός Εργαλείων CLIΡύθμιση ανά εργαλείο για Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Απομακρυσμένη ΛειτουργίαΧειριστείτε ένα απομακρυσμένο OmniRoute (VPS) από το CLI του φορητού υπολογιστή σας μέσω διακριτικών πρόσβασης περιορισμένου εύρους
Ρύθμιση Claude CodeΣυνδέστε το Claude Code με το OmniRoute (τοπικό/απομακρυσμένο) χρησιμοποιώντας launch + προφίλ ανά μοντέλο
Γρήγορη ΕκκίνησηΕγκατάσταση 3 βημάτων → σύνδεση → ρύθμιση
Απομακρυσμένη ΛειτουργίαΧειριστείτε ένα απομακρυσμένο OmniRoute (VPS) από το CLI του φορητού υπολογιστή σας μέσω διακριτικών πρόσβασης περιορισμένης εμβέλειας
Διαμόρφωση Claude CodeΣυνδέστε το Claude Code με το OmniRoute (τοπικό/απομακρυσμένο) μέσω launch + προφίλ ανά μοντέλο
Γρήγορη ΕκκίνησηΕγκατάσταση 3 βημάτων → σύνδεση → διαμόρφωση
-### 🔧 Λειτουργία & Ανάπτυξη +### 🔧 Λειτουργίες & Ανάπτυξη - + - - - - + + + +
ΈγγραφοΠεριγραφή
Οδηγός DockerΕκτέλεση Docker, προφίλ Compose, Caddy HTTPS, σήραγγες, ετικέτες εικόνων
Οδηγός DockerDocker run, προφίλ Compose, Caddy HTTPS, σήραγγες, ετικέτες εικόνων
Οδηγός PodmanΕνσωμάτωση Quadlet systemd, podman-compose, SELinux
Ανάπτυξη σε VMΠλήρης οδηγός: ρύθμιση VM + nginx + Cloudflare
Ανάπτυξη στο Fly.ioΑνάπτυξη στο Fly.io με μόνιμο χώρο αποθήκευσης
Οδηγός TermuxΕκτέλεση του OmniRoute σε Android μέσω Termux
Οδηγός PWAΕγκατάσταση προοδευτικής διαδικτυακής εφαρμογής, προσωρινή αποθήκευση, αρχιτεκτονική
Οδηγός ΑπεγκατάστασηςΠλήρης αφαίρεση για όλες τις μεθόδους εγκατάστασης
Ρύθμιση ΠεριβάλλοντοςΠλήρης κατάλογος μεταβλητών και αναφορών του .env
Οδηγός TermuxΕκτελέστε το OmniRoute σε Android μέσω Termux
Οδηγός PWAΕγκατάσταση Progressive Web App, προσωρινή αποθήκευση, αρχιτεκτονική
Οδηγός ΑπεγκατάστασηςΚαθαρή αφαίρεση για όλες τις μεθόδους εγκατάστασης
Διαμόρφωση ΠεριβάλλοντοςΠλήρης κατάλογος μεταβλητών και αναφορών .env
### 🧠 Δυνατότητες & Αρχιτεκτονική @@ -1329,17 +1329,17 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη - + - + - + - + - +
ΈγγραφοΠεριγραφή
ΑρχιτεκτονικήΑρχιτεκτονική συστήματος, ροή δεδομένων και εσωτερική λειτουργία
Οδηγός ΣυμπίεσηςΡοή επεξεργασίας 7 επιλογών: απενεργοποιημένη / ελαφριά / τυπική / επιθετική / υπερεντατική / RTK / στοιβαγμένη
Οδηγός ΣυμπίεσηςΔιοχέτευση 7 επιλογών: ανενεργή / ελαφριά / τυπική / επιθετική / υπερβολική / RTK / στοιβαγμένη
Συμπίεση RTKΣυμπίεση εξόδου εντολών, φίλτρα, αξιοπιστία, επαλήθευση, ανάκτηση ανεπεξέργαστης εξόδου
Μηχανές ΣυμπίεσηςCaveman, RTK, στοιβαγμένες ροές επεξεργασίας, επιφάνειες πίνακα ελέγχου/API/MCP
Μηχανές ΣυμπίεσηςCaveman, RTK, στοιβαγμένες διοχετεύσεις, διεπαφές πίνακα ελέγχου/API/MCP
Μορφή Κανόνων ΣυμπίεσηςΣχήματα πακέτων κανόνων JSON για φίλτρα Caveman και RTK
Πακέτα Γλωσσών ΣυμπίεσηςΑνίχνευση γλώσσας και δημιουργία πακέτων κανόνων Caveman
Οδηγός ΑνθεκτικότηταςΔιακόπτες κυκλώματος, περίοδοι αναμονής, ουρά, αποτροπή ταυτόχρονων μαζικών αιτημάτων, παραποίηση TLS
Οδηγός ΑνθεκτικότηταςΔιακόπτες κυκλώματος, χρόνοι αναμονής, ουρά, αποτροπή ταυτόχρονων αιτημάτων, πλαστογράφηση TLS
Μηχανή Αυτόματων ΣυνδυασμώνΒαθμολόγηση 16 παραγόντων, πακέτα λειτουργιών, αυτοΐαση
Οδηγός Διακομιστή ΜεσολάβησηςΣύστημα διακομιστών μεσολάβησης 3 επιπέδων, αγορά 1proxy, λειτουργίες CRUD μητρώου
Δωρεάν ΒαθμίδεςΕνοποιημένος κατάλογος: 35 τεκμηριωμένα επαναλαμβανόμενα σύνολα πόρων / 491 καταχωρισμένες εγγραφές δωρεάν βαθμίδων
Δωρεάν ΒαθμίδεςΕνοποιημένος κατάλογος: 35 τεκμηριωμένα επαναλαμβανόμενα σύνολα / 489 καταχωρισμένες εγγραφές δωρεάν βαθμίδων
Συλλογή ΔυνατοτήτωνΟπτική περιήγηση στον πίνακα ελέγχου με στιγμιότυπα οθόνης
Τεκμηρίωση Βάσης ΚώδικαΠεριήγηση στη βάση κώδικα, κατάλληλη για αρχάριους
Τεκμηρίωση Βάσης ΚώδικαΠεριήγηση στη βάση κώδικα, φιλική προς αρχάριους
### 🤖 Πρωτόκολλα & API @@ -1348,7 +1348,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη ΈγγραφοΠεριγραφή Αναφορά APIΌλα τα τελικά σημεία με παραδείγματα Προδιαγραφή OpenAPIΠροδιαγραφή OpenAPI 3.0 - Διακομιστής MCP110 εργαλεία MCP, ρυθμίσεις IDE, πελάτες Python/TS/Go + Διακομιστής MCP110 εργαλεία MCP, διαμορφώσεις IDE, προγράμματα-πελάτες Python/TS/Go Οδηγός Διακομιστή MCPΕγκατάσταση MCP, τρόποι μεταφοράς και αναφορά εργαλείων Διακομιστής A2AΠρωτόκολλο JSON-RPC 2.0, δεξιότητες, ροή δεδομένων, διαχείριση εργασιών Οδηγός Διακομιστή A2AΚάρτα πράκτορα A2A, εργασίες, δεξιότητες και ροή δεδομένων @@ -1358,13 +1358,13 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη - - - + + + - - + +
ΈγγραφοΠεριγραφή
ΣυνεισφοράΡύθμιση περιβάλλοντος ανάπτυξης και οδηγίες
Μοντέλο διακλαδώσεων και εκδόσεωνΣε ποιους κλάδους στοχεύουν τα PR (release/*) και τι σημαίνουν το main και οι ετικέτες
Αρχείο αλλαγώνΠλήρες ιστορικό κυκλοφοριών ανά έκδοση
ΣυνεισφοράΡύθμιση περιβάλλοντος ανάπτυξης και κατευθυντήριες γραμμές
Μοντέλο κλάδων & εκδόσεωνΣε ποιους κλάδους στοχεύουν τα PR (release/*) και τι σημαίνουν το main και οι ετικέτες
Αρχείο αλλαγώνΠλήρες ιστορικό εκδόσεων ανά έκδοση
Πολιτική ασφαλείαςΑναφορά ευπαθειών και πρακτικές ασφαλείας
Οδηγός i18nΥποστήριξη 42 γλωσσών, ροή εργασίας μετάφρασης, RTL
Λίστα ελέγχου κυκλοφορίαςΒήματα επικύρωσης πριν από την κυκλοφορία
Σχέδιο κάλυψηςΣτρατηγική κάλυψης δοκιμών για περισσότερες από 39.000 στατικές δηλώσεις δοκιμών σε περισσότερα από 5.100 παρακολουθούμενα αρχεία δοκιμών
Λίστα ελέγχου έκδοσηςΒήματα επικύρωσης πριν από την έκδοση
Σχέδιο κάλυψηςΣτρατηγική κάλυψης δοκιμών για 39.000+ στατικές δηλώσεις δοκιμών σε 5.100+ παρακολουθούμενα αρχεία δοκιμών

@@ -1373,9 +1373,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη # ⭐ Κορυφαίοι συνεισφέροντες -> Το OmniRoute διαμορφώνεται από μια παθιασμένη κοινότητα ανοιχτού κώδικα. Αυτά τα άτομα έχουν προσφέρει εξαιρετικές συνεισφορές που επηρεάζουν άμεσα την ποιότητα, τη σταθερότητα και την εμβέλεια του έργου. **Σας ευχαριστούμε.** +> Το OmniRoute διαμορφώνεται από μια παθιασμένη κοινότητα ανοικτού κώδικα. Αυτά τα άτομα έχουν προσφέρει εξαιρετικές συνεισφορές που επηρεάζουν άμεσα την ποιότητα, τη σταθερότητα και την απήχηση του έργου. **Σας ευχαριστούμε.** -### Εξωτερικοί συνεισφέροντες κατά συγχωνευμένα pull requests +### Εξωτερικοί συνεισφέροντες βάσει συγχωνευμένων pull requests @@ -1402,7 +1402,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη
ΚατάταξηΣυνεισφέρωνΣυγχωνευμένα PR~Γραμμές που άλλαξαν
20Prudhvivuda246,312
-Τα δεδομένα παγώθηκαν στην ενεργή κορυφή του release/v3.8.50, dafb4ae808, με συγχωνεύσεις έως τις 2026-08-24 05:26:03 UTC. Η σελιδοποιημένη απογραφή μέσω GitHub GraphQL περιέχει 5.911 συγχωνευμένα PR: 2.707 από τον κάτοχο του αποθετηρίου, 179 από το Dependabot και 3.025 εξωτερικά PR από 535 διαφορετικούς συνεισφέροντες. Οι «γραμμές που άλλαξαν» είναι το άθροισμα προσθηκών και διαγραφών του GitHub και περιλαμβάνουν παραγόμενα αρχεία, αρχεία κλειδώματος, καταλόγους, μεταφράσεις και τεκμηρίωση· εκφράζουν τον όγκο αλλαγών και όχι γραμμές κώδικα που γράφτηκαν. Οι ισοβαθμίες στο όριο διατηρούνται. +Παγωμένο στην κορυφή του ενεργού release/v3.8.50, dafb4ae808, με συγχωνεύσεις έως τις 2026-08-24 05:26:03 UTC. Η απογραφή μέσω του σελιδοποιημένου GitHub GraphQL περιλαμβάνει 5.911 συγχωνευμένα PR: 2.707 από τον κάτοχο του αποθετηρίου, 179 από το Dependabot και 3.025 εξωτερικά PR από 535 διαφορετικούς συνεισφέροντες. Οι «Γραμμές που άλλαξαν» είναι το άθροισμα προσθηκών και διαγραφών στο GitHub και περιλαμβάνουν δημιουργημένα αρχεία, lockfiles, καταλόγους, μεταφράσεις και τεκμηρίωση· πρόκειται για τον όγκο αλλαγών και όχι για γραμμές κώδικα που συντάχθηκαν. Οι ισοβαθμίες στο όριο διατηρούνται. ### Commits που αποδίδονται από το GitHub @@ -1413,42 +1413,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη backryun
backryun
- 🥇 220 συνεισφορές που αποδίδονται από το GitHub + 🥇 220 commits που αποδίδονται από το GitHub Paijo
Paijo

- 🥈 219 συνεισφορές που αποδίδονται από το GitHub + 🥈 219 commits που αποδίδονται από το GitHub Randi
Randi

- 🥉 108 συνεισφορές που αποδίδονται από το GitHub + 🥉 108 commits που αποδίδονται από το GitHub Ravi Tharuma
Ravi Tharuma

- 🏅 81 συνεισφορές που αποδίδονται από το GitHub + 🏅 81 commits που αποδίδονται από το GitHub Chris
Chris

- 🏅 70 συνεισφορές που αποδίδονται από το GitHub + 🏅 70 commits που αποδίδονται από το GitHub Markus Hartung
Markus Hartung

- 🏅 69 συνεισφορές που αποδίδονται από το GitHub · ισοβαθμία στη θέση #6 + 🏅 69 commits που αποδίδονται από το GitHub · ισοβαθμία στη θέση #6 @@ -1457,42 +1457,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 επίσης τη Dizzle
Dizzle
- 🏅 69 συνεισφορές που αποδίδονται από το GitHub · ισοβαθμία στη θέση #6 + 🏅 69 commits που αποδίδονται από το GitHub · ισοβαθμία στη θέση #6 Jan Leon
Jan Leon

- 🏅 64 συνεισφορές που αποδίδονται από το GitHub + 🏅 64 commits που αποδίδονται από το GitHub zenobit
zenobit

- 🏅 62 συνεισφορές που αποδίδονται από το GitHub + 🏅 62 commits που αποδίδονται από το GitHub Bob.Hou
Bob.Hou

- 🏅 51 συνεισφορές που αποδίδονται από το GitHub · ισοβαθμία στη θέση #10 + 🏅 51 commits που αποδίδονται από το GitHub · ισοβαθμία στη θέση #10 Xiangzhe
Xiangzhe

- 🏅 51 συνεισφορές που αποδίδονται από το GitHub · ισοβαθμία στη θέση #10 + 🏅 51 commits που αποδίδονται από το GitHub · ισοβαθμία στη θέση #10 -Επανελέγχθηκε στις 2026-08-24 06:14:31 UTC: συνεισφορές που αποδίδονται από το GitHub, όπως αναφέρθηκαν από το Contributors API του αποθετηρίου για τον προεπιλεγμένο κλάδο release/v3.8.50. Το API επέστρεψε 525 ταυτότητες (415 χρήστες, 2 bot, 108 ανώνυμες)· αυτός ο πίνακας εξαιρεί τον συντηρητή, τα bot και τις ανώνυμες ταυτότητες και διατηρεί τις ισοβαθμίες. Διαφέρει τόσο από την παραπάνω κατάταξη των συγχωνευμένων PR όσο και από την παρακάτω απογραφή μεταδεδομένων Git, η οποία περιλαμβάνει 639 άτομα. +Επανελέγχθηκε στις 2026-08-24 06:14:31 UTC: commits που αποδίδονται από το GitHub, όπως αναφέρθηκαν από το Contributors API του αποθετηρίου για τον προεπιλεγμένο κλάδο release/v3.8.50. Το API επέστρεψε 525 ταυτότητες (415 χρήστες, 2 bots, 108 ανώνυμες)· αυτός ο πίνακας εξαιρεί τον συντηρητή, τα bots και τις ανώνυμες ταυτότητες και διατηρεί τις ισοβαθμίες της κατάταξης. Διαφέρει τόσο από την παραπάνω κατάταξη συγχωνευμένων PR όσο και από την παρακάτω απογραφή 639 ατόμων βάσει μεταδεδομένων Git. -> 🙏 Οι λειτουργίες, οι διορθώσεις σφαλμάτων και οι βελτιώσεις υποδομής αυτών των συνεισφερόντων αποτελούν **βασικό μέρος** όσων καθιστούν το OmniRoute αξιόπιστο και πλούσιο σε δυνατότητες. Κάθε pull request, κάθε περίπτωση δοκιμής και κάθε αρχείο μετάφρασης i18n έχει σημασία. Το λογισμικό ανοικτού κώδικα δημιουργείται από ανθρώπους σαν κι αυτούς. +> 🙏 Οι λειτουργίες, οι διορθώσεις σφαλμάτων και οι βελτιώσεις υποδομής αυτών των συνεισφερόντων αποτελούν **βασικό μέρος** όσων καθιστούν το OmniRoute αξιόπιστο και πλούσιο σε λειτουργίες. Κάθε pull request, κάθε περίπτωση δοκιμής και κάθε αρχείο μετάφρασης i18n έχει σημασία. Το λογισμικό ανοικτού κώδικα δημιουργείται από ανθρώπους σαν κι αυτούς.
diff --git a/docs/i18n/el/SECURITY.md b/docs/i18n/el/SECURITY.md index a2113fc0ae51..3b666286cc64 100644 --- a/docs/i18n/el/SECURITY.md +++ b/docs/i18n/el/SECURITY.md @@ -222,21 +222,35 @@ docker run -d \ ## Ευρήματα σαρωτή εφοδιαστικής αλυσίδας (Socket.dev / Snyk / παρόμοια εργαλεία) -Το δημοσιευμένο npm artifact `omniroute` περιλαμβάνει το build του Next.js με `output: "standalone"`, πράγμα που σημαίνει ότι κάθε route handler — συμπεριλαμβανομένων των τεκμηριωμένων προνομιακών λειτουργιών (MITM, εισαγωγή Zed, Cloud Sync, ενσωματωμένος επόπτης υπηρεσιών) — καταλήγει σε ελαχιστοποιημένα chunks `.next/server/*.js`. Οι ευρετικοί σαρωτές εφοδιαστικής αλυσίδας συχνά αντιστοιχίζουν τα μοτίβα αυτών των chunks με υπογραφές κακόβουλου λογισμικού. +> **Σημείωση πεδίου εφαρμογής:** Το `socket.yml` στη ρίζα του αποθετηρίου διαμορφώνει μόνο το `projectIgnorePaths` για τη σάρωση μετά τη δημοσίευση, στην πλευρά του μητρώου του Socket.dev, του δημοσιευμένου τεχνουργήματος npm — δεν αποτελεί υποχρεωτική πύλη συγχώνευσης CI/PR. Καμία ροή εργασίας στο `.github/workflows`, κανένα script του `package.json` και κανένας στόχος του `Makefile` δεν καλεί το Socket.dev. -Η διαμόρφωση του σαρωτή που χρησιμοποιούμε βρίσκεται στο [`socket.yml`](socket.yml) στη ρίζα του αποθετηρίου (μορφή v2 του Socket.dev GitHub App — βλ. -). Εξαιρεί ρητά καταλόγους που δεν αποστέλλονται (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/` κ.λπ.), ώστε ο σαρωτής να αναφέρει μόνο διαδρομές κώδικα που φτάνουν πράγματι στους χρήστες της δημοσιευμένης έκδοσης — η ίδια η σάρωση εκτελείται από το Socket GitHub App, το οποίο διαβάζει αυτό το αρχείο, και όχι από κάποιο workflow σε αυτό το αποθετήριο. +Το δημοσιευμένο τεχνούργημα npm `omniroute` περιλαμβάνει το build του Next.js με `output: "standalone"`, +κάτι που σημαίνει ότι κάθε χειριστής διαδρομής — συμπεριλαμβανομένων των τεκμηριωμένων προνομιακών +λειτουργιών (MITM, εισαγωγή Zed, Cloud Sync, ενσωματωμένος επόπτης υπηρεσιών) — καταλήγει +σε ελαχιστοποιημένα τμήματα `.next/server/*.js`. Οι ευρετικοί σαρωτές εφοδιαστικής αλυσίδας +συχνά αντιστοιχίζουν μοτίβα αυτών των τμημάτων με υπογραφές κακόβουλου λογισμικού. -Για κάθε κατηγορία ευρημάτων διατηρούμε μια βεβαίωση από τους συντηρητές ανά εύρημα: +Η ρύθμιση παραμέτρων του σαρωτή που χρησιμοποιούμε βρίσκεται στο [`socket.yml`](socket.yml) στη +ρίζα του αποθετηρίου (μορφή v2 του Socket.dev GitHub App — δείτε +). Εξαιρεί ρητά +καταλόγους που δεν διανέμονται (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` κ.λπ.), ώστε ο σαρωτής να αναφέρει μόνο διαδρομές κώδικα που +φτάνουν πράγματι στους χρήστες της δημοσιευμένης έκδοσης — η ίδια η σάρωση εκτελείται από το Socket +GitHub App που διαβάζει αυτό το αρχείο και όχι από κάποια ροή εργασίας σε αυτό το αποθετήριο. -- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - αντιστοίχιση ανά εύρημα: αρχείο προέλευσης ↔ επισημασμένο chunk ↔ συμπεριφορά ↔ μέτρο περιορισμού που εφαρμόστηκε στην v3.8.6. -- Μπλοκ `SECURITY-AUDITOR-NOTE:` μέσα στον πηγαίο κώδικα, σε κάθε επισημασμένο σημείο συνάρτησης, παραπέμπουν στο ίδιο έγγραφο. +Για κάθε κατηγορία ευρημάτων διατηρούμε μια επιβεβαίωση από τους συντηρητές ανά εύρημα: -Για χρήστες των οποίων το pipeline δεν επιτρέπει τη χαλάρωση της ειδοποίησης: εκτελέστε build με -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Αυτό αντικαθιστά τα τέσσερα ευαίσθητα modules με stubs που επιστρέφουν HTTP 503 `feature-disabled` κατά την εκτέλεση, ώστε οι προνομιακές διαδρομές κώδικα να απουσιάζουν φυσικά από το bundle. -Ανατρέξτε στο [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) +- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — + αντιστοίχιση ανά εύρημα: αρχείο προέλευσης ↔ επισημασμένο τμήμα ↔ συμπεριφορά ↔ μετριασμός + που εφαρμόστηκε στην v3.8.6. +- Μπλοκ `SECURITY-AUDITOR-NOTE:` στον πηγαίο κώδικα, σε κάθε επισημασμένη συνάρτηση, παραπέμπουν + στο ίδιο έγγραφο. + +Για χρήστες των οποίων η διοχέτευση δεν μπορεί να χαλαρώσει την ειδοποίηση: δημιουργήστε το build με +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Αυτό αντικαθιστά τις τέσσερις +ευαίσθητες μονάδες με υποκατάστατα που επιστρέφουν HTTP 503 `feature-disabled` κατά +την εκτέλεση, ώστε οι προνομιακές διαδρομές κώδικα να απουσιάζουν φυσικά από το πακέτο. +Δείτε το [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) για τη διαδικασία δημοσίευσης. ## Αναφορές diff --git a/docs/i18n/el/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/el/docs/architecture/CODEBASE_DOCUMENTATION.md index f5671d79bf97..d0825057672d 100644 --- a/docs/i18n/el/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/el/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,44 +434,43 @@ server/ --- -## 4. `open-sse/` — Χώρος εργασίας μηχανής ροής +## 4. `open-sse/` — Χώρος εργασίας μηχανής streaming -Ξεχωριστός χώρος εργασίας npm που δημοσιεύεται ως `@omniroute/open-sse`. Περιλαμβάνει την επεξεργασία -αιτημάτων, τους εκτελεστές, τους μεταφραστές, τις υπηρεσίες, τον μετασχηματιστή και τον διακομιστή MCP. +Ξεχωριστός χώρος εργασίας npm που δημοσιεύεται ως `@omniroute/open-sse`. Διαχειρίζεται την επεξεργασία αιτημάτων, τους εκτελεστές, τους μεταφραστές, τις υπηρεσίες, τον μετασχηματιστή και τον διακομιστή MCP. ``` open-sse/ ├── index.ts Δημόσιες εξαγωγές -├── package.json Δηλωτικό χώρου εργασίας +├── package.json Μανιφέστο χώρου εργασίας ├── tsconfig.json ├── types.d.ts ├── config/ Μητρώα παρόχων, προφίλ κεφαλίδων, ταυτότητα, … -├── handlers/ Χειριστές αιτημάτων (συνομιλία, ενσωματώσεις, ήχος, εικόνα, …) +├── handlers/ Χειριστές αιτημάτων (συνομιλία, embeddings, ήχος, εικόνα, …) ├── executors/ 108 εκτελεστές HTTP ειδικοί για παρόχους -├── translator/ Μετατροπή μορφής (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) +├── translator/ Μετατροπή μορφών (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Μετασχηματιστής ροής Responses API ↔ Chat Completions -├── services/ 80+ αρθρώματα υπηρεσιών (συνδυασμοί, εφεδρική δρομολόγηση, ποσοστώσεις, ταυτότητα, …) -├── utils/ Βοηθητικά εργαλεία ροής, πελάτης TLS, AWS SigV4, ανάκτηση μέσω διακομιστή μεσολάβησης, … -└── mcp-server/ Διακομιστής MCP (3 μεταφορές, 33 πεδία, 110 εργαλεία) +├── services/ 80+ αρθρώματα υπηρεσιών (συνδυασμοί, εναλλακτικές, ποσοστώσεις, ταυτότητα, …) +├── utils/ Βοηθητικά streaming, πελάτης TLS, AWS SigV4, λήψη μέσω διακομιστή μεσολάβησης, … +└── mcp-server/ Διακομιστής MCP (3 μέσα μεταφοράς, 33 πεδία, 110 εργαλεία) ``` ### 4.1 `open-sse/handlers/` | Χειριστής | Σκοπός | | ----------------------- | ----------------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Κύρια διοχέτευση συνομιλίας (κρυφή μνήμη, όριο ρυθμού, δρομολόγηση συνδυασμών, αποστολή σε εκτελεστή) | +| `chatCore.ts` | Κύρια ροή επεξεργασίας συνομιλίας (cache, όριο ρυθμού, δρομολόγηση συνδυασμών, αποστολή σε εκτελεστή) | | `responsesHandler.ts` | Σημείο εισόδου του OpenAI Responses API | -| `embeddings.ts` | Ενσωματώσεις | +| `embeddings.ts` | Embeddings | | `imageGeneration.ts` | Δημιουργία εικόνων | | `audioSpeech.ts` | Μετατροπή κειμένου σε ομιλία | | `audioTranscription.ts` | Μετατροπή ομιλίας σε κείμενο | | `videoGeneration.ts` | Δημιουργία βίντεο | | `musicGeneration.ts` | Δημιουργία μουσικής | | `rerank.ts` | Ανακατάταξη | -| `moderations.ts` | Εποπτεία περιεχομένου | +| `moderations.ts` | Έλεγχος περιεχομένου | | `search.ts` | Αναζήτηση στον ιστό | | `sseParser.ts` | Αναλυτής συμβάντων SSE | -| `usageExtractor.ts` | Εξαγωγή πλήθους διακριτικών από ροές ανάντη | +| `usageExtractor.ts` | Εξαγωγή πλήθους token από upstream ροές | | `responseSanitizer.ts` | Αφαίρεση θορύβου που αφορά συγκεκριμένους παρόχους | | `responseTranslator.ts` | Συνδετικό επίπεδο μεταξύ της απόκρισης παρόχου και του επιπέδου μετάφρασης | @@ -482,11 +481,11 @@ open-sse/ `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, -`pollinations`, `qoder`, `vertex`, `devin-desktop`, καθώς και το `claudeIdentity.ts` -(κοινόχρηστο βοηθητικό εργαλείο ταυτότητας) και το `index.ts` (μητρώο). +`pollinations`, `qoder`, `vertex`, `devin-desktop`, καθώς και `claudeIdentity.ts` +(κοινόχρηστο βοηθητικό ταυτότητας) και `index.ts` (μητρώο). -> Σημείωση: οι πάροχοι που δεν παρατίθενται εδώ εξυπηρετούνται από το `default.ts` μέσω του γενικού -> εκτελεστή που είναι συμβατός με το OpenAI. Ο πλήρης κατάλογος παρόχων (355 πάροχοι) βρίσκεται στο +> Σημείωση: οι πάροχοι που δεν αναφέρονται εδώ εξυπηρετούνται από το `default.ts` μέσω του γενικού +> εκτελεστή που είναι συμβατός με OpenAI. Ο πλήρης κατάλογος παρόχων (355 πάροχοι) βρίσκεται στο > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` @@ -501,51 +500,51 @@ open-sse/ `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 βοηθητικά εργαλεία** (`translator/helpers/`): +- **9 βοηθητικά** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, καθώς και - δοκιμές βοηθητικών εργαλείων. -- **Βοηθητικά εργαλεία εικόνων** (`translator/image/sizeMapper.ts`). + δοκιμές βοηθητικών. +- **Βοηθητικά εικόνων** (`translator/image/sizeMapper.ts`). - Ανώτατο επίπεδο: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — Μετατροπέας Responses API ↔ Chat Completions βασισμένος στο - `TransformStream` (χρησιμοποιείται από την καθολική διαδρομή `responses/`). +- `responsesTransformer.ts` — Μετατροπέας Responses API ↔ Chat + Completions βασισμένος σε `TransformStream` (χρησιμοποιείται από την καθολική διαδρομή `responses/`). ### 4.5 `open-sse/services/` -Κύρια σημεία (πλήρης λίστα στο `open-sse/services/`): - -| Τομέας | Αρχεία | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Δρομολόγηση Combo | `combo.ts` (19 στρατηγικές), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Μηχανή Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Ανθεκτικότητα | `accountFallback.ts` (περίοδος αναμονής + κλείδωμα), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Ποσοστώσεις | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Προσωρινή αποθήκευση | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Ευφυΐα δρομολόγησης | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Χειρισμός μοντέλων | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Συμπίεση | `compression/` — πλήρης διασύνδεση της μηχανής συμπίεσης | -| Διακριτικά + συνεδρία | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Βαθμίδα / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / δίκτυο | `ipFilter.ts`, `webSearchFallback.ts` | -| Παρτίδες | `batchProcessor.ts` | -| Χρήση | `usage.ts` | +Κυριότερα σημεία (πλήρης λίστα στο `open-sse/services/`): + +| Τομέας | Αρχεία | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Δρομολόγηση Combo | `combo.ts` (19 στρατηγικές), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Μηχανή Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Ανθεκτικότητα | `accountFallback.ts` (περίοδος αναμονής + κλείδωμα), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Ποσοστώσεις | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Προσωρινή αποθήκευση | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Ευφυΐα δρομολόγησης | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Διαχείριση μοντέλων | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Συμπίεση | `compression/` — πλήρης διασύνδεση της μηχανής συμπίεσης | +| Token + συνεδρία | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Βαθμίδα / μανιφέστο | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / δίκτυο | `ipFilter.ts`, `webSearchFallback.ts` | +| Δέσμες | `batchProcessor.ts` | +| Χρήση | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 μοναδικά εργαλεία** διασυνδεδεμένα στο `server.ts` (45 κανονικά στο `schemas/tools.ts` + - μονάδες μνήμης, δεξιοτήτων, δεξιοτήτων GitHub, συγκέντρωσης πόρων, παιχνιδοποίησης, προσθέτων, Notion, Obsidian, + αρθρώματα μνήμης, δεξιοτήτων, δεξιοτήτων GitHub, pool, παιχνιδοποίησης, προσθέτων, Notion, Obsidian, τοπικού corpus και συμπίεσης — η ένωση καταμετράται από το `countUniqueMcpTools`). -- **3 μεταφορές**: stdio, HTTP Streamable, SSE. -- **33 πεδία πρόσβασης** επιβάλλονται κατά την εκτέλεση — η βασική λίστα βρίσκεται στο `src/shared/constants/mcpScopes.ts`, ενώ το πλήρες σύνολο είναι η ένωση των πεδίων πρόσβασης που δηλώνονται από κάθε μονάδα εργαλείων. +- **3 τρόποι μεταφοράς**: stdio, HTTP Streamable, SSE. +- **33 πεδία πρόσβασης** επιβάλλονται κατά την εκτέλεση — η βασική λίστα βρίσκεται στο `src/shared/constants/mcpScopes.ts`, ενώ το πλήρες σύνολο είναι η ένωση των πεδίων πρόσβασης που δηλώνονται από κάθε άρθρωμα εργαλείων. - Πίνακας ελέγχου: `mcp_tool_audit` (συμπληρώνεται από το `audit.ts`). - Αρχεία: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, καθώς και δοκιμές στον κατάλογο `__tests__/`. -- Ανατρέξτε στο [MCP-SERVER.md](../frameworks/MCP-SERVER.md) για τον πλήρη κατάλογο εργαλείων. +- Δείτε το [MCP-SERVER.md](../frameworks/MCP-SERVER.md) για τον πλήρη κατάλογο εργαλείων. ### 4.7 `open-sse/config/` @@ -553,17 +552,17 @@ open-sse/ `providerHeaderProfiles.ts`), μητρώα μοντέλων ανά μορφή (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), -βοηθητικά στοιχεία ταυτότητας (`codexIdentity.ts`, `codexInstructions.ts`, +βοηθητικά εργαλεία ταυτότητας (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), -βοηθητικά στοιχεία διαπιστευτηρίων (`credentialLoader.ts`, `codexClient.ts`) και προσαρμογείς +βοηθητικά εργαλεία διαπιστευτηρίων (`credentialLoader.ts`, `codexClient.ts`) και προσαρμογείς cloud (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). ### 4.8 `open-sse/utils/` -Πρωτόγονα ροής και βοηθητικά παρόχων: `stream.ts`, `streamHandler.ts`, +Πρωτογενείς λειτουργίες ροής και βοηθητικά εργαλεία παρόχων: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/el/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/el/docs/architecture/RESILIENCE_GUIDE.md index cdd0e684cf4e..1dcef1068075 100644 --- a/docs/i18n/el/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/el/docs/architecture/RESILIENCE_GUIDE.md @@ -67,7 +67,7 @@ `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Προστασία από παλινδρόμηση: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Χρόνος αναμονής σύνδεσης +## 2. Περίοδος αναμονής σύνδεσης **Πεδίο εφαρμογής:** μία σύνδεση/ένας λογαριασμός/ένα κλειδί παρόχου. @@ -77,86 +77,130 @@ - Επισήμανση ως μη διαθέσιμου: `src/sse/services/auth.ts::markAccountUnavailable()` - Επιλογή: `getProviderCredentials*` στο ίδιο αρχείο -- Υπολογισμός χρόνου αναμονής: `open-sse/services/accountFallback.ts::checkFallbackError()` +- Υπολογισμός περιόδου αναμονής: `open-sse/services/accountFallback.ts::checkFallbackError()` - Ρυθμίσεις: `src/lib/resilience/settings.ts` **Πεδία ανά σύνδεση:** -- `rateLimitedUntil` — χρονική σήμανση έως τη λήξη του χρόνου αναμονής +- `rateLimitedUntil` — χρονική σήμανση μέχρι τη λήξη της περιόδου αναμονής - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — μετρητής εκθετικής οπισθοχώρησης +- `backoffLevel` — μετρητής εκθετικής υποχώρησης -**Προεπιλεγμένοι χρόνοι αναμονής:** +**Προεπιλεγμένες περίοδοι αναμονής:** - Βάση OAuth: 5s - Βάση κλειδιού API: 3s -- 429 κλειδιού API: προτιμώνται οι κεφαλίδες `Retry-After`/επαναφοράς της ανάντη υπηρεσίας ή αναλύσιμο κείμενο επαναφοράς -- Οπισθοχώρηση: `baseCooldownMs * 2 ** failureIndex` +- Κλειδί API με 429: προτιμά τις κεφαλίδες `Retry-After`/επαναφοράς της ανάντη υπηρεσίας ή κείμενο επαναφοράς που μπορεί να αναλυθεί +- Υποχώρηση: `baseCooldownMs * 2 ** failureIndex` -**Προστασία από ταυτόχρονες μαζικές επαναλήψεις:** αποτρέπει τις ταυτόχρονες αποτυχίες από το να παρατείνουν υπερβολικά τον χρόνο αναμονής ή να αυξήσουν δύο φορές το `backoffLevel`. +**Προστασία κατά του φαινομένου thundering herd:** αποτρέπει τις ταυτόχρονες αποτυχίες από το να παρατείνουν υπερβολικά την περίοδο αναμονής ή να αυξήσουν δύο φορές το `backoffLevel`. -**Τερματικές καταστάσεις (ΟΧΙ χρόνοι αναμονής):** +**Τερματικές καταστάσεις (ΟΧΙ περίοδοι αναμονής):** -- `banned` — ορίζεται από την ανίχνευση απαγορευμένης λέξης-κλειδιού / αποκλεισμού λογαριασμού (βλ. [BAN_DETECTION](../security/BAN_DETECTION.md)) και από τρεις διαδοχικές ανάντη απορρίψεις ανά αίτημα (`request_rejected`, π.χ. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`)· μία μόνο απόρριψη απλώς θέτει τη σύνδεση σε χρόνο αναμονής -- `expired` (μεταβαίνει σε τερματική κατάσταση μετά από περιορισμένο αριθμό επαναλήψεων — `EXPIRED_RETRY_MAX = 3` με εκθετική οπισθοχώρηση — ώστε τα παροδικά σφάλματα OAuth να μπορούν να αποκατασταθούν αυτόματα προτού ο λογαριασμός απενεργοποιηθεί οριστικά) +- `banned` — ορίζεται από τον εντοπισμό απαγορευμένης λέξης-κλειδιού / αποκλεισμού λογαριασμού (βλ. [BAN_DETECTION](../security/BAN_DETECTION.md)) και από τρεις διαδοχικές ανάντη απορρίψεις ανά αίτημα (`request_rejected`, π.χ. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`)· μία μόνο απόρριψη απλώς θέτει τη σύνδεση σε περίοδο αναμονής +- `expired` (μεταβαίνει σε τερματική κατάσταση μετά από περιορισμένο αριθμό επαναλήψεων — `EXPIRED_RETRY_MAX = 3` με εκθετική υποχώρηση — ώστε τα παροδικά σφάλματα OAuth να μπορούν να διορθωθούν αυτόματα πριν απενεργοποιηθεί μόνιμα ο λογαριασμός) - `credits_exhausted` -Αυτές παραμένουν μέχρι να αλλάξουν τα διαπιστευτήρια ή να τις επαναφέρει ένας χειριστής. Μην αντικαθιστάτε τις τερματικές καταστάσεις με κατάσταση παροδικού χρόνου αναμονής. +Αυτές παραμένουν μέχρι να αλλάξουν τα διαπιστευτήρια ή να επαναφερθούν από έναν διαχειριστή. Μην αντικαθιστάτε τις τερματικές καταστάσεις με κατάσταση παροδικής περιόδου αναμονής. -**Οκνηρή ανάκτηση:** όταν παρέλθει το `rateLimitedUntil`, η σύνδεση καθίσταται ξανά επιλέξιμη. Μετά από επιτυχή χρήση, το `clearAccountError()` εκκαθαρίζει όλα τα πεδία σφάλματος. +**Οκνηρή ανάκαμψη:** όταν παρέλθει το `rateLimitedUntil`, η σύνδεση καθίσταται ξανά επιλέξιμη. Μετά από επιτυχή χρήση, το `clearAccountError()` διαγράφει όλα τα πεδία σφάλματος. + +### Όριο χρήσης Claude OAuth: λωρίδα χαμηλότερης προτεραιότητας + επαναφορά ορίου συνεδρίας + +**Πεδίο εφαρμογής:** μία σύνδεση συνδρομής Claude (OAuth). Και οι δύο δυνατότητες είναι **προαιρετικές ανά +σύνδεση** (Επεξεργασία σύνδεσης → ενότητα Claude → `lowPriorityMode` / `autoLimitReset` στο +`providerSpecificData`, και οι δύο απενεργοποιημένες από προεπιλογή) και αντιστοιχούν στις εντολές `/low-priority` και +`/limit-reset` του Claude Code (σύμβαση πρωτοκόλλου καταγεγραμμένη από το Claude Code 2.1.263). + +**Υλοποίηση:** + +- Μηχανή καταστάσεων + ταξινόμηση απόκρισης: `open-sse/services/claudeLowPriority.ts` +- Πρόγραμμα-πελάτης κατάστασης/διεκδίκησης επαναφοράς: `open-sse/services/claudeLimitReset.ts` +- Άγκιστρο εκτελεστή (εισαγωγή κεφαλίδας + επανάληψη στον ίδιο λογαριασμό): `open-sse/executors/base.ts::execute()` +- Διατήρηση προαιρετικής ενεργοποίησης: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Έναυσμα:** το όριο χρήσης των 5 ωρών — μια απόκριση `429` της οποίας οι κεφαλίδες περιέχουν +`anthropic-ratelimit-unified-status: rejected` και, όταν ο λογαριασμός είναι επιλέξιμος, +`anthropic-ratelimit-unified-slow-offer: treatment`. Δεν αποστέλλεται τίποτα πριν από την πρώτη απόκριση +429 του ορίου· μια αιφνίδια σειρά αποκρίσεων 429 χωρίς ενοποιημένες κεφαλίδες ακολουθεί την κανονική διαδρομή περιόδου αναμονής. + +**Λωρίδα χαμηλότερης προτεραιότητας** (`lowPriorityMode`): + +- Κατά την απόκριση 429 του ορίου, ο εκτελεστής αποδέχεται την προσφορά και επαναλαμβάνει αμέσως στον **ίδιο** + λογαριασμό με `anthropic-usage-limit: slow`· η λωρίδα παραμένει ενεργή μέχρι το ανακοινωθέν + `anthropic-ratelimit-unified-reset` (+60s περιθώριο) και κάθε αίτημα εντός αυτού του παραθύρου φέρει + την κεφαλίδα. Η αναχαιτισμένη απόκριση 429 δεν φτάνει ποτέ στο `handleChatCore`, επομένως η σύνδεση + **δεν** τίθεται σε περίοδο αναμονής ούτε αντικαθίσταται μέσω εναλλαγής. +- Το `anthropic-ratelimit-unified-slow-status` σε μεταγενέστερες αποκρίσεις: τα `active` / `not_needed` + διατηρούν τη λωρίδα· το `slot_busy` (429) ή μια απόκριση `529` περιμένουν για το διάστημα που ορίζεται από το + `anthropic-ratelimit-unified-slow-retry-after` του διακομιστή (προεπιλογή 20s, περιορισμός σε 5–600s, τυχαία απόκλιση ±30%) + και επαναλαμβάνουν, με ανώτατο όριο το `anthropic-ratelimit-unified-slow-max-wait` (προεπιλογή 20 min, περιορισμός + σε 1 min–6 h) — μετά την παρέλευσή του η λωρίδα τερματίζεται και μια δεκάλεπτη περίοδος αναμονής εμποδίζει την εκ νέου αποδοχή. Η + αναμονή περιορίζεται επιπλέον από τον χρόνο που απομένει μέχρι τη λήξη του χρονικού ορίου έναρξης στην ανάντη υπηρεσία για το ίδιο το αίτημα + (`resolveFetchStartTimeout`, προεπιλογή 10 min), μείον ένα περιθώριο 5 s: χωρίς αυτό το όριο, η + προεπιλεγμένη μέγιστη αναμονή των 20 λεπτών θα ξεπερνούσε τη διάρκεια ζωής του αιτήματος και η αναμονή θα διακοπτόταν + στη μέση, εμφανίζοντας ένα `TimeoutError` αντί για τον ομαλό τερματισμό `max_wait` + περίοδο αναμονής. +- Τα `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, η μετάβαση σε νέο παράθυρο 5 ωρών ή + το `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (που τερματίζει τη λωρίδα ως + `extra_usage` σε οποιαδήποτε κατάσταση, καθώς η πρόσθετη χρήση επί πληρωμή καλύπτει πλέον το όριο) τερματίζουν τη λωρίδα· η + απόκριση ακολουθεί κατόπιν την κανονική διαδρομή περιόδου αναμονής. Το `budget_exhausted` απομνημονεύεται μέχρι + την ανακοινωθείσα επαναφορά του προϋπολογισμού (≤ 8 ημέρες). +- Ο έλεγχος ορίου εκτελείται μετά τις επαναλήψεις εντός της ίδιας προσπάθειας που ενεργοποιούνται από απόκριση 400 στον εκτελεστή (επεξεργασία + περιβάλλοντος, περιορισμοί σκέψης/προσπάθειας, αυτόματη εκμάθηση παραμέτρων), επομένως μια απόκριση 429 του ορίου που εμφανίζεται μόνο σε + μία από αυτές τις επαναλήψεις εξακολουθεί να αναχαιτίζεται αντί να φτάσει στη διαδρομή περιόδου αναμονής. +- Η κατάσταση διατηρείται στη μνήμη ανά σύνδεση (μια επανεκκίνηση προκαλεί μία επιπλέον απόκριση 429 του ορίου για εκ νέου αποδοχή). + +**Επαναφορά ορίου συνεδρίας** (`autoLimitReset`, δοκιμάζεται πριν από τη λωρίδα όταν είναι ενεργοποιημένα και τα δύο): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → μπλοκ `juniper_tide`· όταν + `arm: "reset"` και `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` με + `{ "program": "juniper_tide" }` (UUID οργανισμού από το + `providerSpecificData.organizationUUID`, εφεδρική αρχικοποίηση). +- `result: reset|not_limited` → το αίτημα επαναλαμβάνεται με πλήρη ταχύτητα (χωρίς κεφαλίδα αργής λειτουργίας). + Τα `already_used` / `not_offered` απομνημονεύουν το `next_available_at` (προεπιλογή μία εβδομάδα)· οποιαδήποτε + αποτυχία εφαρμόζει υποχώρηση 15 λεπτών. Η επαναφορά διατίθεται μία φορά την εβδομάδα και εξακολουθεί να προσμετράται στο + εβδομαδιαίο όριο. + +Δικλίδες προστασίας από παλινδρομήσεις: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Συνάφεια συνεδρίας (#7274) -**Πεδίο εφαρμογής:** μία συνεδρία πελάτη (κεφαλίδα `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) καρφιτσωμένη σε μία σύνδεση, για **οποιονδήποτε** πάροχο. +**Πεδίο εφαρμογής:** μία συνεδρία προγράμματος-πελάτη (κεφαλίδα `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) καρφιτσωμένη σε μία σύνδεση, για **οποιονδήποτε** πάροχο. -**Σκοπός:** διατήρηση ενός πράκτορα πολλαπλών γύρων (Claude Code, aider, προσαρμοσμένοι πράκτορες) στον ίδιο λογαριασμό μεταξύ αιτημάτων, μειώνοντας την απώλεια περιβάλλοντος μεταξύ λογαριασμών και τα επαναλαμβανόμενα 429 ψυχρής εκκίνησης σε παρόχους με κατάσταση συνεδρίας ανά λογαριασμό. +**Σκοπός:** διατήρηση ενός πράκτορα πολλαπλών γύρων (Claude Code, aider, προσαρμοσμένοι πράκτορες) στον ίδιο λογαριασμό μεταξύ αιτημάτων, μειώνοντας την απώλεια περιβάλλοντος μεταξύ λογαριασμών και τα επαναλαμβανόμενα σφάλματα 429 ψυχρής εκκίνησης σε παρόχους με κατάσταση συνεδρίας ανά λογαριασμό. **Υλοποίηση:** - Επίλυση TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Επιλογή/δημιουργία καρφιτσώματος: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Επιλογή/δημιουργία καρφίτσωσης: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Εξαγωγή κεφαλίδας (γενική, για οποιονδήποτε πάροχο): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Μόνιμος πίνακας καρφιτσωμάτων: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Ρύθμιση: `sessionAffinityTtlMs` (καθολικό TTL σε ms, το `0` το απενεργοποιεί) — `src/lib/db/settings.ts`. Μετονομάστηκε από το αποκλειστικό για το Codex `codexSessionAffinityTtlMs` μέσω της μετεγκατάστασης `124_generic_session_affinity_ttl.sql`, η οποία μεταφέρει οποιοδήποτε προηγουμένως διαμορφωμένο TTL του Codex ως τη νέα προεπιλογή. +- Πίνακας μόνιμης αποθήκευσης καρφιτσώσεων: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Ρύθμιση: `sessionAffinityTtlMs` (καθολικό TTL σε ms, το `0` το απενεργοποιεί) — `src/lib/db/settings.ts`. Μετονομάστηκε από το αποκλειστικό για το Codex `codexSessionAffinityTtlMs` μέσω της μετεγκατάστασης `124_generic_session_affinity_ttl.sql`, η οποία μεταφέρει οποιοδήποτε TTL του Codex είχε διαμορφωθεί προηγουμένως ως τη νέα προεπιλογή. -Πριν από το #7274, το `resolveSessionAffinityTtlMs()` επέστρεφε αμέσως `0` για κάθε πάροχο εκτός του `codex`, επομένως η ρύθμιση TTL (και οι κεφαλίδες συνεδρίας) δεν είχαν καμία επίδραση οπουδήποτε αλλού, παρόλο που ο μηχανισμός καρφιτσώματος και η εξαγωγή κεφαλίδων ήταν ήδη ανεξάρτητα από τον πάροχο. Η διόρθωση αφαίρεσε αυτήν την πρόωρη επιστροφή· το TTL εφαρμόζεται πλέον ομοιόμορφα σε κάθε πάροχο, μόλις οριστεί καθολικά σε τιμή μεγαλύτερη από `0`. +Πριν από το #7274, η `resolveSessionAffinityTtlMs()` επέστρεφε άμεσα `0` για κάθε πάροχο εκτός από το `codex`, επομένως η ρύθμιση TTL (και οι κεφαλίδες συνεδρίας) δεν είχαν καμία επίδραση οπουδήποτε αλλού, παρόλο που ο μηχανισμός καρφιτσώματος και η εξαγωγή κεφαλίδων ήταν ήδη ανεξάρτητα από τον πάροχο. Η διόρθωση αφαίρεσε αυτήν την πρόωρη επιστροφή· το TTL εφαρμόζεται πλέον ομοιόμορφα σε κάθε πάροχο, μόλις οριστεί καθολικά σε τιμή μεγαλύτερη από `0`. -Οι τρεις κεφαλίδες συνάφειας συνεδρίας δεν προωθούνται ποτέ στην ανάντη υπηρεσία — οι εκτελεστές δημιουργούν τις δικές τους ανάντη κεφαλίδες από την αρχή αντί να διαβιβάζουν τις κεφαλίδες του πελάτη, επομένως αυτό παραμένει μόνο ένα εσωτερικό αναγνωριστικό συσχέτισης. +Οι τρεις κεφαλίδες συσχέτισης συνεδρίας δεν προωθούνται ποτέ προς τα ανάντη — οι εκτελεστές δημιουργούν τις δικές τους ανάντη κεφαλίδες από την αρχή αντί να προωθούν αυτούσιες τις κεφαλίδες του πελάτη, επομένως αυτό παραμένει μόνο ένα εσωτερικό αναγνωριστικό συσχέτισης. -### Αποκλειστικές μισθώσεις συνδέσεων διαχειριζόμενων συνεδριών +### Αποκλειστικές μισθώσεις διαχειριζόμενων συνδέσεων συνεδρίας **Πεδίο εφαρμογής:** ένας ενεργός διαχειριζόμενος πελάτης/μία ενεργή διαχειριζόμενη συνεδρία HTTP κατέχει μία επιλέξιμη σύνδεση OmniRoute. -**Σκοπός:** παροχή ανθεκτικής αποκλειστικής κατοχής σύνδεσης για πελάτες που χρειάζονται έναν αυστηρό -φραγμό δρομολόγησης μεταξύ αιτημάτων. Αυτό διαφέρει από τη συνάφεια συνεδρίας, η οποία αποτελεί ήπια προτίμηση συνέχειας: -μια αποκλειστική μίσθωση διατηρεί την κατάσταση κύκλου ζωής στο SQLite, επιβάλλει καθολική μοναδικότητα ενεργού κατόχου και -ενεργής σύνδεσης και απορρίπτει μια παρωχημένη γενιά πριν από την αποστολή προς τον πάροχο. - -Η δυνατότητα ενεργοποιείται προαιρετικά ανά κλειδί API. Ένα διαχειριζόμενο κλειδί πρέπει να διαθέτει το πεδίο εφαρμογής `lease:exclusive` και μια -ρητή, μη κενή λίστα `allowedConnections`. Οποιοσδήποτε πελάτης HTTP μπορεί να χρησιμοποιήσει το τελικό σημείο κύκλου ζωής· δεν -απαιτείται όνομα πελάτη, user-agent, πάροχος, μέθοδος OAuth ή μοντέλο. Η μίσθωση κατέχει μια σύνδεση, -όχι ένα μοντέλο, επομένως μια αλλαγή μοντέλου διατηρεί τη δέσμευση όσο η σύνδεση παραμένει κανονικά -επιλέξιμη. Οι συνήθεις κανόνες μοντέλου, ποσόστωσης, εύρυθμης λειτουργίας, χρόνου αναμονής και λίστας επιτρεπόμενων συνδέσεων παραμένουν δεσμευτικοί και μπορούν -να μεταφέρουν την ίδια γενιά σε άλλη ελεύθερη επιλέξιμη σύνδεση. - -Ο κύκλος ζωής είναι `POST /api/v1/session-leases` με ενέργειες JSON `acquire`, `renew` και `release`. -Τα διαχειριζόμενα αιτήματα εξαγωγής συμπερασμάτων παρέχουν την αδιαφανή τιμή `X-OmniRoute-Lease-Owner` και την ακριβή -`X-OmniRoute-Lease-Generation`. Ο κάτοχος χρησιμοποιεί το πρόθεμα `vlo_` ακολουθούμενο από 43 χαρακτήρες base64url· αποθηκεύεται μόνο -ο κατακερματισμός SHA-256. Κάθε τελικός φραγμός αποστολής δεσμεύει επίσης το αναγνωριστικό του επαληθευμένου κλειδιού API και -το αναγνωριστικό της ενεργής σύνδεσης. Οι κεφαλίδες ελέγχου μίσθωσης αφαιρούνται από τα αρχεία καταγραφής, τα διατηρούμενα στιγμιότυπα αιτημάτων και -τις κεφαλίδες των ανάντη εκτελεστών. - -Εάν η συνήθης δρομολόγηση διαθέτει επιλέξιμες διαχειριζόμενες υποψήφιες συνδέσεις, αλλά κάθε ελεύθερη υποψήφια σύνδεση καταλαμβάνεται από μια -ξένη ενεργή μίσθωση, το OmniRoute επιστρέφει HTTP `429`, κωδικό μη διαθεσιμότητας χωρητικότητας μίσθωσης, μια -κατάσταση αναμονής χωρητικότητας και ένα περιορισμένο `Retry-After` που προκύπτει από την ενωρίτερη σχετική λήξη. -Η συνήθης απουσία επιλέξιμων συνδέσεων δεν αποτελεί διένεξη μίσθωσης και διατηρεί την υπάρχουσα σημασιολογία σφαλμάτων δρομολόγησης. +**Σκοπός:** παροχή ανθεκτικής αποκλειστικής κυριότητας σύνδεσης για πελάτες που χρειάζονται ένα αυστηρό όριο δρομολόγησης μεταξύ αιτημάτων. Αυτό διαφέρει από τη συσχέτιση συνεδρίας, η οποία αποτελεί μια ήπια προτίμηση συνέχειας: μια αποκλειστική μίσθωση διατηρεί την κατάσταση κύκλου ζωής στο SQLite, επιβάλλει καθολική μοναδικότητα ενεργού κατόχου και ενεργής σύνδεσης και απορρίπτει μια παρωχημένη γενιά πριν από την αποστολή στον πάροχο. + +Η δυνατότητα ενεργοποιείται προαιρετικά ανά κλειδί API. Ένα διαχειριζόμενο κλειδί πρέπει να διαθέτει το πεδίο εφαρμογής `lease:exclusive` και μια ρητή, μη κενή λίστα `allowedConnections`. Οποιοσδήποτε πελάτης HTTP μπορεί να χρησιμοποιήσει το τελικό σημείο κύκλου ζωής· δεν απαιτείται όνομα πελάτη, user-agent, πάροχος, μέθοδος OAuth ή μοντέλο. Η μίσθωση κατέχει μια σύνδεση, όχι ένα μοντέλο, επομένως μια αλλαγή μοντέλου διατηρεί τη δέσμευση όσο η σύνδεση παραμένει κανονικά επιλέξιμη. Οι συνήθεις κανόνες μοντέλου, ποσόστωσης, υγείας, περιόδου αναμονής και λίστας επιτρεπόμενων παραμένουν καθοριστικοί και μπορούν να μεταφέρουν την ίδια γενιά σε άλλη ελεύθερη επιλέξιμη σύνδεση. + +Ο κύκλος ζωής είναι `POST /api/v1/session-leases` με ενέργειες JSON `acquire`, `renew` και `release`. Τα διαχειριζόμενα αιτήματα συμπερασματολογίας παρέχουν την αδιαφανή τιμή `X-OmniRoute-Lease-Owner` και την ακριβή τιμή `X-OmniRoute-Lease-Generation`. Ο κάτοχος χρησιμοποιεί το πρόθεμα `vlo_`, ακολουθούμενο από 43 χαρακτήρες base64url· αποθηκεύεται μόνο ο κατακερματισμός SHA-256 του. Κάθε τελικός περιορισμός αποστολής δεσμεύει επίσης το αναγνωριστικό του πιστοποιημένου κλειδιού API και το αναγνωριστικό της ενεργής σύνδεσης. Οι κεφαλίδες ελέγχου μίσθωσης αφαιρούνται από τα αρχεία καταγραφής, τα διατηρούμενα στιγμιότυπα αιτημάτων και τις κεφαλίδες των ανάντη εκτελεστών. + +Εάν η συνήθης δρομολόγηση διαθέτει επιλέξιμους διαχειριζόμενους υποψηφίους, αλλά κάθε ελεύθερος υποψήφιος καταλαμβάνεται από μια ξένη ενεργή μίσθωση, το OmniRoute επιστρέφει HTTP `429`, κωδικό μη διαθέσιμης χωρητικότητας μίσθωσης, κατάσταση αναμονής για χωρητικότητα και μια φραγμένη τιμή `Retry-After` που προκύπτει από την ενωρίτερη σχετική λήξη. Η συνήθης κενή επιλεξιμότητα δεν αποτελεί διένεξη μίσθωσης και διατηρεί την υπάρχουσα σημασιολογία σφαλμάτων δρομολόγησης. Οι σχετικοί μηχανισμοί παραμένουν διακριτοί: -- Η κατάληψη συνεδρίας OAuth είναι μια ήπια κατανομή εντός της διεργασίας για λογαριασμούς OAuth. -- Οι σημαφόροι λογαριασμών χορηγούν άδειες ταυτόχρονων αιτημάτων και τερματίζονται όταν ολοκληρωθεί ένα αίτημα. -- Οι αποκλειστικές μισθώσεις διαχειριζόμενων συνεδριών συνιστούν ανθεκτική κατοχή κύκλου ζωής με φραγμό γενιάς. +- Η κατάληψη συνεδρίας OAuth αποτελεί τοπική για τη διεργασία ήπια κατανομή για λογαριασμούς OAuth. +- Οι σημαφόροι λογαριασμών εκχωρούν άδειες ταυτόχρονων αιτημάτων και τερματίζονται όταν ολοκληρωθεί ένα αίτημα. +- Οι αποκλειστικές μισθώσεις διαχειριζόμενων συνεδριών αποτελούν ανθεκτική κυριότητα κύκλου ζωής με περιορισμό γενιάς. --- @@ -286,47 +330,72 @@ quota-share** (`resilienceSettings.quotaShareConcurrencyLimit.enabled`, ενερ --- -## 5. Έλεγχος αποδοχής στην ουρά αιτημάτων (v3.8.49 · ζήτημα #6593) +## 5. Έλεγχος εισαγωγής στην ουρά αιτημάτων (v3.8.49 · issue #6593) **Πεδίο εφαρμογής**: η τοπική ουρά περιορισμού ρυθμού ανά πάροχο+σύνδεση (`open-sse/services/rateLimitManager.ts`, -η οποία υποστηρίζεται από το Bottleneck), ένα επίπεδο κάτω από τους τρεις παραπάνω μηχανισμούς. - -**Το `maxWaitMs` είναι μια παλαιότερη, διατηρούμενη ονομασία για τη λήξη εκτέλεσης.** -Το `resilienceSettings.requestQueue.maxWaitMs` μεταβιβάζεται στο Bottleneck ως `expiration` -εργασίας, του οποίου ο χρονομετρητής ξεκινά μόνο μετά τη δρομολόγηση. Επομένως, περιορίζει -την εκτέλεση που διαχειρίζεται ο περιοριστής και όχι τον χρόνο παραμονής στην τοπική ουρά. Η λήξη -εμφανίζεται ως αξιόπιστο τοπικό `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504)· -η προηγούμενη ονομασία κωδικού χρονικού ορίου ουράς γίνεται αποδεκτή μόνο για αξιόπιστη εσωτερική -συμβατότητα προς τα πίσω. Η προεπιλογή είναι 15000ms· παρακάμψτε την μέσω -`RATE_LIMIT_MAX_WAIT_MS` (μεταβλητή περιβάλλοντος) ή από τον πίνακα ελέγχου (**Ρυθμίσεις → Ανθεκτικότητα**, -ανώτατο όριο UI 1–30000ms). Η παραμονή στην ουρά δεν έχει χρονική προθεσμία· χρησιμοποιήστε το -`maxQueueDepth` παρακάτω για να περιορίσετε τους αιτούντες που βρίσκονται στην ουρά. - -**`maxQueueDepth` — προαιρετικό όριο αποδοχής (νέο).** Το `resilienceSettings.requestQueue.maxQueueDepth` -περιορίζει πόσα αιτήματα μπορούν να βρίσκονται ταυτόχρονα στην ουρά (χωρίς να έχουν ακόμη δρομολογηθεί) για έναν +με υποστήριξη από το Bottleneck), ένα επίπεδο κάτω από τους τρεις παραπάνω μηχανισμούς. + +**Το `maxWaitMs` οριοθετεί την αναμονή στην ουρά· το `executionMaxWaitMs` οριοθετεί την εκτέλεση.** +Τα δύο είναι σκόπιμα διαχωρισμένα και κανένα δεν επηρεάζει το άλλο. + +Το `resilienceSettings.requestQueue.maxWaitMs` είναι ο **προϋπολογισμός αναμονής στην ουρά**: +καλύπτει την αναμονή για μια διαθέσιμη θέση στον πάροχο και, στη συνέχεια, την παραμονή σε κατάσταση QUEUED, ενώ ο χρονομετρητής του +μηδενίζεται τη στιγμή που η εργασία εξέρχεται από την κατάσταση QUEUED και αρχίζει να εκτελείται +(`rateLimitManager.ts`, `wrappedFn`). Ένα αίτημα που τον υπερβαίνει δεν φτάνει ποτέ +στο upstream. Η προεπιλογή είναι 30000ms, παρέχεται από το `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +στο `src/lib/resilience/settings.ts` και κατοχυρώνεται από το +`tests/unit/ratelimit-admission-control-6593.test.ts`, ώστε μια αλλαγή της +να κάνει εκείνο το τεστ να αποτύχει, αντί να αφήσει αυτήν την παράγραφο να καταστεί αθόρυβα παρωχημένη. + +Το `resilienceSettings.requestQueue.executionMaxWaitMs` είναι αυτό που λαμβάνει το Bottleneck +ως `expiration` της εργασίας, του οποίου ο χρονομετρητής ξεκινά μόνο μετά την αποστολή. Αποτελεί +δικλείδα ασφαλείας για εκτελεστές που δεν διαθέτουν δικό τους upstream timeout και +αυξάνεται ώστε να αντιστοιχεί στο timeout έναρξης του fetch του ίδιου του εκτελεστή όταν αυτό είναι μεγαλύτερο, έτσι ώστε +να μην μπορεί να διακόψει μια υγιή απόκριση που βρίσκεται σε εξέλιξη. Η προεπιλογή είναι 600000ms (10 λεπτά). + +Η διοχέτευση του προϋπολογισμού της ουράς στο `expiration` ήταν αυτή που παλαιότερα τερμάτιζε τις μη αυξητικές +πύλες κατά τη διάρκεια της εκτέλεσης — δικαιολογημένα εκτελούνται για αρκετά λεπτά πριν από τα πρώτα byte — +και γι’ αυτό μια λήξη εμφανίζεται ως `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), ενώ ο προϋπολογισμός ουράς φέρει τον +κωδικό timeout της ουράς. Παρακάμψτε οποιοδήποτε από τα δύο μέσω των `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) ή του πίνακα ελέγχου +(**Ρυθμίσεις → Ανθεκτικότητα**). Και τα δύο περιορίζονται στο εύρος 1ms–24h κατά την κανονικοποίηση. + +**Προτεραιότητα, και για τα δύο:** η μεταβλητή env παρέχει μόνο την _προεπιλογή_. Μια τιμή +που είναι αποθηκευμένη μόνιμα στο `resilienceSettings.requestQueue` (πίνακας ελέγχου / ενημέρωση μέσω API, αποθηκευμένη +στο `key_value`) υπερισχύει αυτής, ενώ μια τιμή ανά σύνδεση +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` υπερισχύει και εκείνης. Επομένως, ο ορισμός +της μεταβλητής env σε μια εγκατάσταση που διαθέτει ήδη μόνιμα αποθηκευμένη τιμή +δεν αλλάζει τίποτα — διαγράψτε ή ενημερώστε την αποθηκευμένη ρύθμιση αντ’ αυτού. + +Η παραμονή στην ουρά οριοθετείται από το `maxWaitMs`· το παρακάτω `maxQueueDepth` οριοθετεί πόσοι +καλούντες μπορούν να βρίσκονται ταυτόχρονα στην ουρά. + +**`maxQueueDepth` — προαιρετικό όριο εισαγωγής (νέο).** Το `resilienceSettings.requestQueue.maxQueueDepth` +οριοθετεί πόσα αιτήματα μπορούν να βρίσκονται στην ουρά (χωρίς να έχουν ακόμη αποσταλεί) ταυτόχρονα για έναν πάροχο+σύνδεση. Όταν η ουρά περιέχει ήδη `maxQueueDepth` -αιτήματα, ένα νέο αίτημα απορρίπτεται άμεσα με ένα τυποποιημένο σφάλμα +αιτήματα, ένα νέο αίτημα απορρίπτεται αμέσως με ένα τυποποιημένο σφάλμα `code: "RATE_LIMIT_QUEUE_FULL"` **πριν** φτάσει ποτέ στο `limiter.schedule()` -— επομένως, η απόρριψη έχει χαμηλό κόστος και πραγματοποιείται πριν από οποιαδήποτε μεταγενέστερη -συμπίεση / μετάφραση προτροπής για το συγκεκριμένο αίτημα. Προεπιλογή `0` = -απενεργοποιημένο, διατηρώντας την υπάρχουσα συμπεριφορά ουράς χωρίς όριο· επιτρεπόμενο εύρος 0–100000. -Παρακάμψτε το μέσω `RATE_LIMIT_MAX_QUEUE_DEPTH` (μεταβλητή περιβάλλοντος) ή -`resilienceSettings.requestQueue.maxQueueDepth` (τροποποίηση μέσω πίνακα ελέγχου/API). +— επομένως, η απόρριψη έχει χαμηλό κόστος και συμβαίνει πριν από οποιαδήποτε μεταγενέστερη εργασία +συμπίεσης prompt / μετάφρασης για το συγκεκριμένο αίτημα. Προεπιλογή `0` = +απενεργοποιημένο, διατηρώντας την υπάρχουσα συμπεριφορά ουράς χωρίς όριο· εύρος 0–100000. +Παράκαμψη μέσω του `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) ή του +`resilienceSettings.requestQueue.maxQueueDepth` (πίνακας ελέγχου/ενημέρωση μέσω API). -Ο ίδιος ο έλεγχος αποδοχής είναι μια αμιγής συνάρτηση +Ο ίδιος ο έλεγχος εισαγωγής είναι μια αμιγής συνάρτηση (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), ώστε -να μπορεί να ελεγχθεί με δοκιμές μονάδας χωρίς πραγματικό περιοριστή Bottleneck. - -> Το RFC που άνοιξε το #6593 πρότεινε επίσης μια σημαία `bypassCompressionOnRateLimit`. -> Η διοχέτευση `open-sse/services/compression/` αυτού του αποθετηρίου αφορά τη -> συμπίεση προτροπής/περιβάλλοντος στο εξερχόμενο αίτημα LLM (`chatCore.ts`, -> γύρω από το τμήμα `resolveCompressionSettings`/`selectCompressionStrategy`) -> και όχι τη συμπίεση απόκρισης HTTP σε παραγόμενα σώματα 429 — δεν υπάρχει -> αντίστοιχη διαδρομή κώδικα για μια κυριολεκτική σημαία παράκαμψης. Αυτό το βήμα συμπίεσης προτροπής -> εκτελείται επίσης επί του παρόντος _πριν_ από το `withRateLimit()` στη διοχέτευση αιτημάτων, επομένως -> η αναδιάταξη ώστε να παραλείπεται σε περίπτωση απόρριψης λόγω πλήρους ουράς αποτελεί μια ξεχωριστή και μεγαλύτερη -> αλλαγή από το πεδίο εφαρμογής αυτού του ζητήματος· **δεν** υλοποιήθηκε σκόπιμα -> εδώ και παραμένει ως μελλοντική εργασία, εφόσον το όφελος εξοικονόμησης CPU αξίζει τον +να μπορεί να υποβληθεί σε unit test χωρίς πραγματικό limiter του Bottleneck. + +> Το RFC που άνοιξε το #6593 πρότεινε επίσης ένα flag `bypassCompressionOnRateLimit`. +> Το pipeline `open-sse/services/compression/` αυτού του repo αφορά +> τη συμπίεση prompt/context στο εξερχόμενο αίτημα LLM (`chatCore.ts`, +> γύρω από το block `resolveCompressionSettings`/`selectCompressionStrategy`), +> όχι τη συμπίεση απόκρισης HTTP σε παραγόμενα σώματα 429 — δεν υπάρχει +> αντίστοιχη διαδρομή κώδικα για ένα κυριολεκτικό flag παράκαμψης. Αυτό το βήμα συμπίεσης prompt +> εκτελείται επίσης επί του παρόντος _πριν_ από το `withRateLimit()` στο pipeline αιτημάτων, οπότε +> η αναδιάταξη ώστε να παραλείπεται σε περίπτωση απόρριψης λόγω πλήρους ουράς αποτελεί ξεχωριστή, μεγαλύτερη +> αλλαγή από το πεδίο εφαρμογής αυτού του issue· σκόπιμα **δεν** υλοποιήθηκε +> εδώ και παραμένει ως επόμενη ενέργεια, εάν το όφελος εξοικονόμησης CPU αξίζει τον > κίνδυνο της αναδιάταξης. --- diff --git a/docs/i18n/el/docs/architecture/admission-lanes.md b/docs/i18n/el/docs/architecture/admission-lanes.md index 7aabcf8b9804..7c3e4498a734 100644 --- a/docs/i18n/el/docs/architecture/admission-lanes.md +++ b/docs/i18n/el/docs/architecture/admission-lanes.md @@ -7,48 +7,55 @@ Το OmniRoute διαθέτει **δύο** τοπικά ανά διεργασία συστήματα λωρίδων με διαφορετικά πεδία εφαρμογής. Είναι συμπληρωματικά· οι διαχειριστές θα πρέπει να γνωρίζουν ποιο από τα δύο εξετάζουν. -## 1. Καθολικός ανά διεργασία έλεγχος εισδοχής σε επίπεδο byte (`chatBodyAdmission.ts`) +## 1. Καθολικός έλεγχος αποδοχής σε επίπεδο διεργασίας βάσει byte (`chatBodyAdmission.ts`) - **Πεδίο εφαρμογής:** η διαδρομή προσωρινά αποθηκευμένου σώματος/σωρού για `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` και τις άλλες διαδρομές τύπου συνομιλίας. Προστατεύει - από τη διόγκωση του σωρού λόγω μεγάλων σωμάτων από coding agents (#4380). + από τη διόγκωση του σωρού εξαιτίας μεγάλων σωμάτων από πράκτορες προγραμματισμού (#4380). - **Ένας καθολικός ελεγκτής ανά διεργασία, όχι λωρίδες ανά κλειδί (#10110).** Κάθε κλειδί API - (κατακερματισμένο) ή συνεδρία `anonymous` διεκδικεί εισδοχή από τον **ίδιο** κοινόχρηστο προϋπολογισμό — - το κατακερματισμένο αναγνωριστικό συνεδρίας χρησιμοποιείται ΜΟΝΟ ως κλειδί δίκαιου προγραμματισμού (κυκλική - κατανομή μεταξύ αιτημάτων σε αναμονή), ποτέ ως διαμέρισμα χωρητικότητας. Μια προηγούμενη έκδοση αυτού του - εγγράφου περιέγραφε λωρίδες ανά κλειδί με ανεξάρτητη χωρητικότητα· αυτό το μοντέλο - καταργήθηκε στο #10110, επειδή επέτρεπε σε πλαστά, μη αυθεντικοποιημένα διαπιστευτήρια να πολλαπλασιάζουν - το καθολικό όριο της διεργασίας. -- **Πύλη (#503-fanout): ένας αυτόματα υπολογιζόμενος προϋπολογισμός εισαγωγής σε BYTE, όχι ένα σταθερό πλήθος - αιτημάτων.** Το παλαιό ανώτατο όριο πλήθους αιτημάτων `CHAT_MAX_HEAVY_IN_FLIGHT` (προεπιλογή `1` - πριν από αυτήν τη διόρθωση) περιόριζε το fan-out των coding agents (πολλαπλοί subagents/CLI, - με σώματα συνήθως > 256 KB) σε πραγματική παραλληλία περίπου 1, προκαλώντας αποκρίσεις 503 - υπό απολύτως φυσιολογικό φόρτο. Πλέον εφαρμόζεται μόνο όταν ένας διαχειριστής ορίζει ρητά - το `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Αν παραμείνει μη ορισμένο, η εισδοχή ελέγχεται αντ’ αυτού - από το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — έναν προϋπολογισμό που υπολογίζεται αυτόματα από το - πραγματικό όριο μνήμης της διεργασίας (`src/shared/middleware/admissionBudget.ts`): + (κατακερματισμένο) ή συνεδρία `anonymous` γίνεται αποδεκτή με βάση τον **ίδιο** κοινόχρηστο + προϋπολογισμό — το κατακερματισμένο αναγνωριστικό συνεδρίας χρησιμοποιείται ΜΟΝΟ ως κλειδί + προγραμματισμού δίκαιης κατανομής (κυκλική διεκπεραίωση μεταξύ αιτημάτων σε αναμονή), ποτέ ως + τμήμα χωρητικότητας. Μια προηγούμενη έκδοση αυτού του εγγράφου περιέγραφε λωρίδες ανά κλειδί + με ανεξάρτητη χωρητικότητα· αυτό το μοντέλο καταργήθηκε στο #10110, επειδή επέτρεπε σε πλαστά + διαπιστευτήρια χωρίς έλεγχο ταυτότητας να πολλαπλασιάζουν το όριο ολόκληρης της διεργασίας. +- **Πύλη (#503-fanout): ένας αυτόματα παραγόμενος προϋπολογισμός εισαγωγής σε BYTE, όχι ένα + σταθερό πλήθος αιτημάτων.** Το παλαιό όριο πλήθους αιτημάτων `CHAT_MAX_HEAVY_IN_FLIGHT` + (προεπιλογή `1` πριν από αυτήν τη διόρθωση) περιόριζε τη διακλάδωση των πρακτόρων + προγραμματισμού (πολλαπλοί υποπράκτορες/CLI, σώματα συνήθως > 256 KB) σε πραγματική + ταυτόχρονη εκτέλεση περίπου 1, με αποτέλεσμα αποκρίσεις 503 υπό απολύτως φυσιολογικό + φόρτο. Πλέον εφαρμόζεται μόνο όταν ένας διαχειριστής ορίζει ρητά το + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Όταν παραμένει μη ορισμένο, η αποδοχή ελέγχεται + αντ’ αυτού από το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — έναν προϋπολογισμό που παράγεται + αυτόματα από το πραγματικό όριο μνήμης της διεργασίας (`src/shared/middleware/admissionBudget.ts`): 25% του αυστηρότερου μεταξύ του ορίου σωρού V8 και οποιουδήποτε ορίου cgroup/container, διαιρεμένο με συντελεστή παροδικής διόγκωσης 8x και περιορισμένο μεταξύ 8 MiB και - 2 GiB. Οι ρητές παρακάμψεις χρησιμοποιούν τα ίδια όρια. Αυτό προσαρμόζεται αυτόματα από ένα - container 512 MB έως έναν επιτραπέζιο υπολογιστή 32 GB, χωρίς ρύθμιση μεταβλητών περιβάλλοντος. Ένα σώμα που δεν μπορεί - να χωρέσει εντός του πραγματικού προϋπολογισμού απορρίπτεται αμέσως με `413 body_exceeds_budget`· - μόνο ο ανταγωνισμός μεταξύ σωμάτων που μπορούν να εξυπηρετηθούν μεμονωμένα εισέρχεται στην οριοθετημένη - ουρά δίκαιης εξυπηρέτησης. Ένας ενεργός ανιχνευτής πίεσης πόρων πολλαπλών σημάτων (αναλογία σωρού V8, + 2 GiB. Οι ρητές παρακάμψεις χρησιμοποιούν τα ίδια όρια. Έτσι, προσαρμόζεται αυτόματα + από ένα container 512 MB έως έναν επιτραπέζιο υπολογιστή 32 GB χωρίς ρύθμιση μεταβλητών + περιβάλλοντος. Ένα σώμα που δεν χωρά στον πραγματικό προϋπολογισμό αποτυγχάνει αμέσως + με `413 body_exceeds_budget`· μόνο η διεκδίκηση πόρων μεταξύ σωμάτων που μπορούν + μεμονωμένα να εξυπηρετηθούν εισέρχεται στην οριοθετημένη ουρά δίκαιης κατανομής. + Ένας ενεργός ιχνηλάτης πίεσης πόρων πολλαπλών σημάτων (αναλογία σωρού V8, cgroup, PSI, συμβάντα OOM — `open-sse/utils/resourcePressurePolicy.ts`) συντομεύει - τον οριοθετημένο χρόνο αναμονής υπό `high` πίεση και απορρίπτει αμέσως με - `503 resource_pressure` υπό `critical` πίεση, πριν ακόμη εισαχθεί οποιοδήποτε byte. + την οριοθετημένη αναμονή υπό πίεση `high` και απορρίπτει αμέσως με + `503 resource_pressure` υπό πίεση `critical`, πριν καν εισαχθούν byte. + Το PSI διαβάζεται από το `memory.pressure` του cgroup αυτής της μονάδας, όταν υπάρχει + (`open-sse/utils/resourcePressureSampler.ts`)· το `/proc/pressure/memory` αφορά + ολόκληρο τον κεντρικό υπολογιστή και χρησιμοποιείται μόνο ως εναλλακτική λύση σε + φυσικό υλικό / cgroup v1, ώστε ένας κεντρικός υπολογιστής που χρησιμοποιεί swap να + μην μπορεί να προκαλέσει απόκριση 503 σε ένα αδρανές container. - **Ρύθμιση:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — παράκαμψη του αυτόματα υπολογιζόμενου προϋπολογισμού byte - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — παλαιό ανώτατο όριο πλήθους αιτημάτων, μόνο κατόπιν ρητής ενεργοποίησης + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — παράκαμψη για τον αυτόματα παραγόμενο προϋπολογισμό byte + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — παλαιό όριο πλήθους αιτημάτων, μόνο κατόπιν ρητής ενεργοποίησης - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — αναμονή στην ουρά πριν από απόκριση 503 (προεπιλογή 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — βαλβίδα σωρού για τα byte σε αναμονή (προεπιλογή 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — καταργημένες - λειτουργίες χωρίς αποτέλεσμα από το #10110 και μετά (γίνονται δεκτές για συμβατότητα ρυθμίσεων, αλλά αγνοούνται) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — βαλβίδα σωρού για τα byte στην ουρά (προεπιλογή 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — παρωχημένες + επιλογές χωρίς λειτουργική επίδραση από το #10110 (γίνονται δεκτές για συμβατότητα ρυθμίσεων, αλλά αγνοούνται) - **Αναφορές:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — συμπεριλαμβανομένων των προσθηκών του #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` και `countCapEnabled` - (false σε μια προεπιλεγμένη ανάπτυξη — επιβεβαιώνει ότι αυτό που εφαρμόζεται στην πράξη είναι ο προϋπολογισμός byte και όχι το παλαιό - ανώτατο όριο πλήθους). + (false σε μια προεπιλεγμένη ανάπτυξη — επιβεβαιώνει ότι αυτό που εφαρμόζεται στην + πράξη είναι ο προϋπολογισμός byte και όχι το παλαιό όριο πλήθους). ## 2. Προσαρμοστικές εικονικές λωρίδες κατά την εκτέλεση (`open-sse/services/admission`) diff --git a/docs/i18n/el/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/el/docs/frameworks/EMBEDDED-SERVICES.md index da2235c96e0e..9ec69cdd2953 100644 --- a/docs/i18n/el/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/el/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Έκδοση:** v3.8.44 -> **Τελευταία ενημέρωση:** 2026-07-03 -> **Απευθύνεται σε:** Μηχανικούς που προσθέτουν, συντηρούν ή αποσφαλματώνουν ενσωματωμένες υπηρεσίες (9Router, CLIProxyAPI, Mux, Bifrost). +> **Τελευταία ενημέρωση:** 2026-09-09 +> **Απευθύνεται σε:** Μηχανικούς που προσθέτουν, συντηρούν ή αποσφαλματώνουν ενσωματωμένες υπηρεσίες (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Οι ενσωματωμένες υπηρεσίες είναι τοπικά εγκατεστημένα βοηθητικά εργαλεία διεργασιών, τα οποία το OmniRoute εγκαθιστά, επιβλέπει και +Οι ενσωματωμένες υπηρεσίες είναι τοπικά εγκατεστημένα βοηθητικά εργαλεία διεργασιών, τα οποία το OmniRoute εγκαθιστά, εποπτεύει και εκθέτει ως πλήρως υποστηριζόμενους προορισμούς δρομολόγησης. Σε αντίθεση με τους εξωτερικούς παρόχους (στους οποίους η πρόσβαση γίνεται μέσω διαδικτύου -με κλειδιά API), οι ενσωματωμένες υπηρεσίες εκτελούνται στον ίδιο υπολογιστή με το OmniRoute και επικοινωνούν μέσω loopback. +με κλειδιά API), οι ενσωματωμένες υπηρεσίες εκτελούνται στον ίδιο υπολογιστή με το OmniRoute και επικοινωνούν μέσω της διεπαφής loopback. --- @@ -31,21 +31,22 @@ ### Γιατί ενσωματωμένες υπηρεσίες; -Υπάρχουν πέντε ενσωματωμένες υπηρεσίες: +Έχουν ενσωματωθεί έξι υπηρεσίες: | Υπηρεσία | Πακέτο npm | Προεπιλεγμένη θύρα | Σκοπός | | --------------- | --------------------------------------------- | :----------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **9Router** | `9router` | 20130 | Δρομολογητής AI τον οποίο το OmniRoute μπορεί να χρησιμοποιεί ως υποπάροχο. Τα μοντέλα εκτίθενται ως `9router/{sub}/{model}` | -| **CLIProxyAPI** | Εκτελέσιμο από έκδοση GitHub (`cliproxy`) | 8317 | Τοπικός προσαρμογέας διακομιστή μεσολάβησης για ροές ελέγχου ταυτότητας του Anthropic CLI. Παρέχει εναλλακτική δρομολόγηση όταν λήγουν τα διακριτικά OAuth | -| **Mux** | `mux` (`mux server` χωρίς γραφικό περιβάλλον) | 8322 | Τοπικός δαίμονας ενορχήστρωσης agent (coder/mux). Υπόκειται μόνο σε διαχείριση κύκλου ζωής — δεν αποτελεί προορισμό δρομολόγησης (δεν πραγματοποιεί διαμεσολάβηση LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Σύστημα υποστήριξης αναμετάδοσης πύλης AI σε Go. Όταν εκτελείται, επιλέγεται αυτόματα από τη διαδρομή αναμετάδοσης (`/v1/relay/`) | +| **9Router** | `9router` | 20130 | Δρομολογητής AI που το OmniRoute μπορεί να χρησιμοποιήσει ως δευτερεύοντα πάροχο. Τα μοντέλα εκτίθενται ως `9router/{sub}/{model}` | +| **CLIProxyAPI** | Δυαδικό αρχείο έκδοσης GitHub (`cliproxy`) | 8317 | Τοπικός προσαρμογέας διακομιστή μεσολάβησης για ροές ελέγχου ταυτότητας του Anthropic CLI. Παρέχει εφεδρική δρομολόγηση όταν λήγουν τα διακριτικά OAuth | +| **Mux** | `mux` (`mux server` χωρίς γραφικό περιβάλλον) | 8322 | Τοπικός δαίμονας ενορχήστρωσης πρακτόρων (coder/mux). Γίνεται μόνο διαχείριση του κύκλου ζωής — δεν αποτελεί προορισμό δρομολόγησης (δεν μεσολαβεί αιτήματα LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend αναμετάδοσης πύλης AI σε Go. Όταν εκτελείται, επιλέγεται αυτόματα από τη διαδρομή αναμετάδοσης (`/v1/relay/`) | | **Dario** | `@askalf/dario` | 3456 | Διακομιστής μεσολάβησης συνδρομής Claude — εναλλακτική/εφεδρική λύση του CLIProxyAPI για κίνηση με μορφή Claude Code· το εισαγόμενο κλειδί γίνεται `DARIO_ADMIN_TOKEN` και ελέγχει την πρόσβαση στο επίπεδο ελέγχου OAuth `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Αυτοματοποίηση WhatsApp Web (Chromium χωρίς γραφικό περιβάλλον μέσω Puppeteer). Γίνεται μόνο διαχείριση του κύκλου ζωής — δεν αποτελεί προορισμό δρομολόγησης. | -Και οι πέντε ακολουθούν το ίδιο μοντέλο εποπτείας: +Και οι έξι ακολουθούν το ίδιο μοντέλο εποπτείας: -- Το OmniRoute τις εγκαθιστά στον κατάλογο `DATA_DIR/services/{name}/` (απομονωμένες από το `package.json` του ίδιου του OmniRoute) -- Το OmniRoute τις εκκινεί και τις παρακολουθεί ως θυγατρικές διεργασίες -- Το OmniRoute εισάγει ένα προσωρινό κλειδί API στο περιβάλλον της θυγατρικής διεργασίας και το ανανεώνει χωρίς χρόνο διακοπής λειτουργίας (όπου εφαρμόζεται) +- Το OmniRoute τις εγκαθιστά στον κατάλογο `DATA_DIR/services/{name}/` (απομονωμένες από το `package.json` του OmniRoute) +- Το OmniRoute τις εκκινεί ως θυγατρικές διεργασίες και τις παρακολουθεί +- Το OmniRoute εισάγει ένα προσωρινό κλειδί API στο περιβάλλον της θυγατρικής διεργασίας και το ανανεώνει χωρίς διακοπή λειτουργίας (όπου εφαρμόζεται) - Όλες οι διαδρομές διαχείρισης (`/api/services/*`) είναι **LOCAL_ONLY** — προσβάσιμες μόνο μέσω loopback (αυστηρός κανόνας #17) ### Βασικές αποφάσεις (από το σχέδιο σχεδιασμού) @@ -55,9 +56,9 @@ | Πρόσβαση του πίνακα ελέγχου στο εγγενές UI του 9Router | Αντίστροφος διακομιστής μεσολάβησης στη διαδρομή `/dashboard/providers/services/9router/embed/*` | | Μηχανισμός εγκατάστασης | `npm install {package}` μέσω `execFile` (χωρίς παρεμβολή κελύφους) | | Τρόπος χρήσης | Ο πάροχος καταχωρίζεται ως `9router/{sub}/{model}` στη μηχανή δρομολόγησης | -| Διαχείριση κλειδιών API | Το OmniRoute τα δημιουργεί, τα κρυπτογραφεί κατά την αποθήκευση (AES-256-GCM) και τα εισάγει μέσω μεταβλητών περιβάλλοντος | +| Διαχείριση κλειδιού API | Το OmniRoute το δημιουργεί, το κρυπτογραφεί κατά την αποθήκευση (AES-256-GCM) και το εισάγει μέσω μεταβλητής περιβάλλοντος | | Θέση στον πίνακα ελέγχου | `/dashboard/providers/services` (τρεις καρτέλες) | -| Αυτόματη εκκίνηση | Διακόπτης ανά υπηρεσία, προεπιλεγμένα ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟΣ | +| Αυτόματη εκκίνηση | Διακόπτης ανά υπηρεσία, προεπιλεγμένα ΑΝΕΝΕΡΓΟΣ | --- @@ -97,31 +98,31 @@ │ Επίπεδο 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Γενικός επόπτης (child_process.spawn) │ -│ ├── εγκατάσταση: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── έναρξη: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── θύρα: 20130 για το 9Router (παραμετροποιήσιμη) │ -│ ├── καταγραφές: κυκλική ενδιάμεση μνήμη stdio 5 MB → συμβάντα SSE│ -│ ├── υγεία: HTTP GET /health κάθε 2–5 s, οκνηρή ανάκαμψη │ +│ ├── εγκατάσταση: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── έναρξη: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ +│ ├── θύρα: 20130 για το 9Router (διαμορφώσιμη) │ +│ ├── καταγραφές: κυκλική μνήμη stdio 5 MB → συμβάντα SSE │ +│ ├── υγεία: HTTP GET /health κάθε 2–5 s, ανάκτηση κατ’ απαίτηση│ │ └── κύκλος ζωής: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Εκκινεί όλα τα SERVICES[] κατά την έναρξη της διεργασίας│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Περιοδικό GET /v1/models → πίνακας service_models│ -│ ringBuffer.ts Κυκλική ενδιάμεση μνήμη καταγραφών (5 MB ανά υπηρεσία)│ +│ ringBuffer.ts Κυκλική μνήμη καταγραφής (5 MB ανά υπηρεσία) │ │ healthCheck.ts Περιοδικός έλεγχος υγείας μέσω HTTP │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (προσαρμογείς εγκατάστασης) │ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP συμβατό με OpenAI (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Επίπεδο 4 — Πάροχος / Δρομολόγηση │ +│ Επίπεδο 4 — Πάροχος / Δρομολόγηση │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Αναζητά εκ νέου τη θύρα και το κλειδί API ανά αίτημα (χωρίς προσωρινή αποθήκευση).│ -│ Αφαιρεί το πρόθεμα "9router/" από το αναγνωριστικό μοντέλου πριν από τη διαμεσολάβηση.│ -│ Επιστρέφει 503 service_not_running αν ο επόπτης δεν είναι σε κατάσταση "running".│ +│ Αναζητά ξανά τη θύρα και το κλειδί API ανά αίτημα (χωρίς προσωρινή αποθήκευση).│ +│ Αφαιρεί το πρόθεμα "9router/" από το αναγνωριστικό μοντέλου πριν από τη μεσολάβηση.│ +│ Επιστρέφει 503 service_not_running αν ο επόπτης δεν βρίσκεται σε κατάσταση "running".│ │ │ │ src/shared/constants/providers.ts │ │ Καταχώριση για το "9router": isEmbeddedService: true │ @@ -131,8 +132,8 @@ │ Συγχρονίζονται κάθε 5 λεπτά από το modelSync.ts. │ │ │ │ Το Mux διαθέτει ΜΟΝΟ διαχείριση κύκλου ζωής (Επίπεδα 1-3) — είναι │ -│ δαίμονας ενορχήστρωσης πρακτόρων και όχι διακομιστής μεσολάβησης LLM,│ -│ επομένως δεν έχει executor/καταχώριση παρόχου στο Επίπεδο 4 και │ +│ daemon ενορχήστρωσης agent και όχι διακομιστής μεσολάβησης LLM, │ +│ επομένως δεν έχει εκτελεστή/καταχώριση παρόχου στο Επίπεδο 4 και │ │ δεν αποτελεί ποτέ στόχο δρομολόγησης. │ └────────────────────────────────────────────────────────────────────┘ ``` @@ -141,18 +142,19 @@ | Αρχείο | Ρόλος | | ------------------------------------------- | --------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Βασική κλάση: κύκλος ζωής, κλείδωμα, υγεία, κυκλική μνήμη | +| `src/lib/services/ServiceSupervisor.ts` | Βασική κλάση: κύκλος ζωής, κλείδωμα, υγεία, δακτυλιοειδής μνήμη | | `src/lib/services/bootstrap.ts` | Καταχώριση σε επίπεδο διεργασίας και αυτόματη εκκίνηση | -| `src/lib/services/registry.ts` | Μοναδικός χάρτης `εργαλείο → επόπτης` | +| `src/lib/services/registry.ts` | Μοναδικός χάρτης `tool → supervisor` | | `src/lib/services/apiKey.ts` | Δημιουργία κλειδιών, κρυπτογράφηση AES-256-GCM σε αδράνεια | | `src/lib/services/modelSync.ts` | Περιοδικός συγχρονισμός μοντέλων (5 λεπτά) + κατ’ απαίτηση | -| `src/lib/services/ringBuffer.ts` | Κυκλική ενδιάμεση μνήμη αρχείων καταγραφής 5 MB με εγγραφή SSE | -| `src/lib/services/healthCheck.ts` | Έλεγχος υγείας HTTP (διαμορφώσιμο διάστημα) | +| `src/lib/services/ringBuffer.ts` | Κυκλική ενδιάμεση μνήμη καταγραφών 5 MB με συνδρομή SSE | +| `src/lib/services/healthCheck.ts` | Έλεγχος υγείας HTTP (διαμορφώσιμο χρονικό διάστημα) | | `src/lib/services/installers/ninerouter.ts` | Εγκατάσταση/ενημέρωση/απεγκατάσταση μέσω npm για το 9Router | | `src/lib/services/installers/cliproxy.ts` | Εγκατάσταση/ενημέρωση/απεγκατάσταση μέσω npm για το CLIProxyAPI | | `src/lib/services/installers/mux.ts` | Εγκατάσταση/ενημέρωση/απεγκατάσταση μέσω npm για το Mux | +| `src/lib/services/installers/openwa.ts` | Εγκατάσταση/ενημέρωση/απεγκατάσταση μέσω npm για το open-wa | | `src/app/api/services/9router/_lib.ts` | Βοηθητική συνάρτηση `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Κοινόχρηστο τελικό σημείο αρχείων καταγραφής SSE | +| `src/app/api/services/[name]/logs/route.ts` | Κοινόχρηστο τελικό σημείο καταγραφών SSE | | `open-sse/executors/ninerouter.ts` | Εκτελεστής παρόχου (Επίπεδο 4) | --- @@ -213,17 +215,15 @@ ## 4. Αναφορά API -Όλες οι διαδρομές κάτω από το `/api/services/` είναι **LOCAL_ONLY** (μόνο loopback, -απαράβατος κανόνας #17). Τα αιτήματα που δεν προέρχονται από loopback λαμβάνουν -`403 LOCAL_ONLY` ανεξάρτητα από το διακριτικό ελέγχου ταυτότητας. +Όλες οι διαδρομές κάτω από το `/api/services/` είναι **LOCAL_ONLY** (μόνο loopback, αυστηρός κανόνας #17). +Τα αιτήματα που δεν προέρχονται από loopback λαμβάνουν `403 LOCAL_ONLY` ανεξάρτητα από το διακριτικό ελέγχου ταυτότητας. -### 4.1 Τελικά σημεία 9Router (11 διαδρομές) +### 4.1 Τελικά σημεία του 9Router (11 διαδρομές) #### `POST /api/services/9router/install` -Εγκαθιστά το 9Router από το npm. Δημιουργεί το `DATA_DIR/services/9router/` με τα -δικά του `package.json` και `node_modules/`. Δεν συγκρούεται με τις εξαρτήσεις -του ίδιου του OmniRoute. +Εγκαθιστά το 9Router από το npm. Δημιουργεί το `DATA_DIR/services/9router/` με δικά του +`package.json` και `node_modules/`. Δεν έρχεται σε διένεξη με τις εξαρτήσεις του OmniRoute. **Σώμα αιτήματος** (όλα προαιρετικά): @@ -233,28 +233,26 @@ | Πεδίο | Τύπος | Προεπιλογή | Περιγραφή | | --------- | -------- | ---------- | --------------------------------------------- | -| `version` | `string` | `"latest"` | ετικέτα έκδοσης npm ή semver προς εγκατάσταση | +| `version` | `string` | `"latest"` | Ετικέτα έκδοσης npm ή semver προς εγκατάσταση | **Αποκρίσεις:** -| Κατάσταση | Περιγραφή | -| --------- | ----------------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Μη έγκυρο σώμα αιτήματος (αποτυχία επικύρωσης Zod) | -| `409` | Η εγκατάσταση βρίσκεται ήδη σε εξέλιξη (το κλείδωμα είναι δεσμευμένο) | -| `500` | Η εγκατάσταση npm απέτυχε — δείτε το `message` για κατανοητό μήνυμα σφάλματος | +| Κατάσταση | Περιγραφή | +| --------- | ---------------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Μη έγκυρο σώμα αιτήματος (αποτυχία επικύρωσης Zod) | +| `409` | Η εγκατάσταση βρίσκεται ήδη σε εξέλιξη (το κλείδωμα διατηρείται) | +| `500` | Η εγκατάσταση μέσω npm απέτυχε — δείτε το `message` για κατανοητό μήνυμα σφάλματος | -**Σημειώσεις:** Χρησιμοποιεί `execFile('npm', [...])` — χωρίς κέλυφος, χωρίς -παρεμβολή (απαράβατος κανόνας #13). Τα σφάλματα EACCES εμφανίζονται ως -κατανοητά μηνύματα. +**Σημειώσεις:** Χρησιμοποιεί `execFile('npm', [...])` — χωρίς shell και χωρίς παρεμβολή (αυστηρός κανόνας #13). +Τα σφάλματα EACCES εμφανίζονται ως κατανοητά μηνύματα. --- #### `POST /api/services/9router/start` -Εκκινεί το 9Router. Καταχωρίζει έναν επόπτη, εάν δεν είναι ήδη καταχωρισμένος, -και κατόπιν καλεί το `supervisor.start()`. Είναι ιδιοδύναμο όταν η υπηρεσία -εκτελείται ήδη. +Εκκινεί το 9Router. Καταχωρίζει έναν επόπτη, αν δεν έχει ήδη καταχωριστεί, και έπειτα καλεί +τη `supervisor.start()`. Είναι ιδιοδύναμο όταν εκτελείται ήδη. **Σώμα αιτήματος:** κανένα @@ -262,7 +260,7 @@ | Κατάσταση | Περιγραφή | | --------- | -------------------------------------------------------------- | -| `200` | Αντικείμενο `ServiceStatus` (δείτε το παρακάτω σχήμα) | +| `200` | Αντικείμενο `ServiceStatus` (δείτε το σχήμα παρακάτω) | | `409` | Το 9Router δεν είναι εγκατεστημένο (`status: "not_installed"`) | | `503` | Η εκκίνηση απέτυχε (σφάλμα διεργασίας — δείτε το `lastError`) | @@ -284,23 +282,23 @@ #### `POST /api/services/9router/stop` -Τερματίζει ομαλά το 9Router. Στέλνει SIGTERM, περιμένει 15 s και κατόπιν στέλνει -SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδιοδύναμο όταν έχει ήδη τερματιστεί. +Τερματίζει ομαλά το 9Router. Στέλνει SIGTERM, περιμένει 15 s και έπειτα στέλνει SIGKILL, αν εξακολουθεί να εκτελείται. +Είναι ιδιοδύναμο όταν έχει ήδη τερματιστεί. **Σώμα αιτήματος:** κανένα **Αποκρίσεις:** -| Κατάσταση | Περιγραφή | -| --------- | -------------------------------------- | -| `200` | `ServiceStatus` (κατάσταση: "stopped") | -| `503` | Ο τερματισμός απέτυχε απροσδόκητα | +| Κατάσταση | Περιγραφή | +| --------- | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Ο τερματισμός απέτυχε απροσδόκητα | --- #### `POST /api/services/9router/restart` -Ισοδύναμο με `stop()` και έπειτα `start()` υπό το κλείδωμα λειτουργίας. +Ισοδυναμεί με `stop()` και έπειτα `start()` υπό το κλείδωμα λειτουργίας. **Σώμα αιτήματος:** κανένα @@ -310,9 +308,9 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ #### `POST /api/services/9router/update` -Ενημερώνει το 9Router σε νεότερη έκδοση npm. Εάν η υπηρεσία εκτελείται, -τερματίζεται πρώτα, εκτελείται η εγκατάσταση npm (εγκαθιστώντας τη νεότερη έκδοση -επιτόπου) και κατόπιν γίνεται επανεκκίνηση της υπηρεσίας. +Ενημερώνει το 9Router σε νεότερη έκδοση npm. Αν η υπηρεσία εκτελείται, τερματίζεται +πρώτα, εκτελείται η εγκατάσταση μέσω npm (εγκαθιστώντας τη νεότερη έκδοση επί τόπου) και έπειτα +η υπηρεσία επανεκκινείται. **Σώμα αιτήματος** (όλα προαιρετικά): @@ -326,14 +324,14 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ | --------- | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | | `400` | Μη έγκυρο σώμα | -| `500` | Η ενημέρωση npm απέτυχε | +| `500` | Η ενημέρωση μέσω npm απέτυχε | --- #### `POST /api/services/9router/rotate-key` Δημιουργεί ένα νέο κλειδί API για το 9Router, το κρυπτογραφεί κατά την αποθήκευση και επανεκκινεί την υπηρεσία -(εφόσον εκτελείται), ώστε να φορτώσει το νέο κλειδί από το περιβάλλον της. Το παλιό κλειδί +(αν εκτελείται), ώστε να λάβει το νέο κλειδί από το περιβάλλον της. Το παλιό κλειδί ακυρώνεται αμέσως. **Σώμα αιτήματος:** κανένα @@ -343,7 +341,7 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ | Κατάσταση | Περιγραφή | | --------- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Η εναλλαγή απέτυχε | +| `500` | Η εναλλαγή κλειδιού απέτυχε | **Ασφάλεια:** Το νέο κλειδί δεν επιστρέφεται ποτέ στην απόκριση (καμία διαρροή διαπιστευτηρίων). Αποθηκεύεται κρυπτογραφημένο (AES-256-GCM) στον πίνακα `version_manager`. @@ -352,14 +350,14 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ #### `GET /api/services/9router/status` -Επιστρέφει συνδυασμένη κατάσταση σε πραγματικό χρόνο + από τη βάση δεδομένων, συμπεριλαμβανομένων μεταδεδομένων έκδοσης και προεπισκόπησης του κλειδιού API. +Επιστρέφει συνδυασμένη κατάσταση σε πραγματικό χρόνο και από τη βάση δεδομένων, συμπεριλαμβανομένων των μεταδεδομένων έκδοσης και μιας προεπισκόπησης του κλειδιού API. **Αποκρίσεις:** -| Κατάσταση | Περιγραφή | -| --------- | --------------------------------- | -| `200` | Δείτε το παρακάτω σχήμα | -| `500` | Η ανάγνωση της κατάστασης απέτυχε | +| Κατάσταση | Περιγραφή | +| --------- | ----------------------------- | +| `200` | Δείτε το σχήμα παρακάτω | +| `500` | Η ανάγνωση κατάστασης απέτυχε | **Σχήμα απόκρισης:** @@ -386,7 +384,7 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ #### `POST /api/services/9router/auto-start` Εναλλάσσει τη σημαία αυτόματης εκκίνησης. Όταν `enabled: true`, η υπηρεσία εκκινείται αυτόματα -την επόμενη φορά που θα εκκινηθεί το OmniRoute (εφόσον η υπηρεσία είναι εγκατεστημένη). +την επόμενη φορά που εκκινείται το OmniRoute (αν η υπηρεσία είναι εγκατεστημένη). **Σώμα αιτήματος:** @@ -396,10 +394,10 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ **Αποκρίσεις:** -| Κατάσταση | Περιγραφή | -| --------- | ------------------------ | -| `200` | `{ autoStart: true }` | -| `400` | Μη έγκυρο σώμα αιτήματος | +| Κατάσταση | Περιγραφή | +| --------- | --------------------- | +| `200` | `{ autoStart: true }` | +| `400` | Μη έγκυρο σώμα | --- @@ -416,11 +414,11 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ **Συμβάντα SSE:** -| Συμβάν | Δεδομένα | Περιγραφή | -| ----------- | ----------- | --------------------------------- | -| `snapshot` | `LogLine[]` | Αρχικό ιστορικό τμήμα | -| `log` | `LogLine` | Ζωντανή γραμμή αρχείου καταγραφής | -| `heartbeat` | `{}` | Διατήρηση σύνδεσης κάθε 15 s | +| Συμβάν | Δεδομένα | Περιγραφή | +| ----------- | ----------- | ---------------------------- | +| `snapshot` | `LogLine[]` | Αρχικό ιστορικό τμήμα | +| `log` | `LogLine` | Ζωντανή γραμμή καταγραφής | +| `heartbeat` | `{}` | Διατήρηση σύνδεσης κάθε 15 s | **Σχήμα LogLine:** @@ -434,90 +432,133 @@ SIGKILL εάν εξακολουθεί να εκτελείται. Είναι ιδ **Αποκρίσεις:** -| Κατάσταση | Περιγραφή | -| --------- | ---------------------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | Η παράμετρος `filter` είναι υπερβολικά μεγάλη (> 200 χαρακτήρες) | -| `404` | Η υπηρεσία δεν βρέθηκε (ο επόπτης δεν έχει καταχωριστεί) | +| Κατάσταση | Περιγραφή | +| --------- | ---------------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | Η παράμετρος `filter` είναι πολύ μεγάλη (> 200 χαρακτήρες) | +| `404` | Η υπηρεσία δεν βρέθηκε (ο επόπτης δεν έχει καταχωριστεί) | --- -### 4.2 Τελικά σημεία CLIProxyAPI (10 διαδρομές) +### 4.2 Τερματικά σημεία του CLIProxyAPI (10 διαδρομές) -Το CLIProxyAPI έχει την ίδια μορφή τελικών σημείων με το 9Router, χωρίς το `rotate-key`, και επιπλέον -τα `accounts`, `provider-expose` και `auto-restart-adopted`. Πλέον λαμβάνει ένα -αποκλειστικό κλειδί API επιπέδου δεδομένων, το οποίο εισάγεται κατά τη δημιουργία της διεργασίας (`needsApiKey: true` στο -`bootstrap.ts`, χρησιμοποιείται για τον συγχρονισμό μοντέλων)· το `status` περιλαμβάνει λιγότερα πεδία. +Το CLIProxyAPI έχει την ίδια δομή τερματικών σημείων με το 9Router, χωρίς το +`rotate-key`, και επιπλέον τα `accounts`, `provider-expose` και +`auto-restart-adopted`. Πλέον λαμβάνει ένα αποκλειστικό κλειδί API επιπέδου δεδομένων, +το οποίο εισάγεται κατά την εκκίνηση (`needsApiKey: true` στο +`bootstrap.ts`, χρησιμοποιείται για τον συγχρονισμό μοντέλων)· το `status` +περιλαμβάνει λιγότερα πεδία. -| Μέθοδος | Διαδρομή | Περιγραφή | -| ------- | ----------------------------------- | ---------------------------------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Εγκατάσταση του CLIProxyAPI από το npm | -| `POST` | `/api/services/cliproxy/start` | Εκκίνηση του CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Διακοπή του CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Επανεκκίνηση του CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Ενημέρωση σε νεότερη έκδοση | -| `GET` | `/api/services/cliproxy/status` | Κατάσταση σε πραγματικό χρόνο + από τη βάση δεδομένων (χωρίς `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Εναλλαγή αυτόματης εκκίνησης | +| Μέθοδος | Διαδρομή | Περιγραφή | +| ------- | ----------------------------------- | --------------------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Εγκατάσταση του CLIProxyAPI από το npm | +| `POST` | `/api/services/cliproxy/start` | Εκκίνηση του CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Διακοπή του CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Επανεκκίνηση του CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Ενημέρωση σε νεότερη έκδοση | +| `GET` | `/api/services/cliproxy/status` | Κατάσταση σε πραγματικό χρόνο + ΒΔ (χωρίς `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Εναλλαγή αυτόματης εκκίνησης | -Το κοινό τελικό σημείο `GET /api/services/{name}/logs` (δείτε §4.1) λειτουργεί και για τις -τέσσερις υπηρεσίες, χρησιμοποιώντας το δυναμικό τμήμα `[name]`. +Το κοινόχρηστο τερματικό σημείο `GET /api/services/{name}/logs` (βλ. §4.1) λειτουργεί +και για τις τέσσερις υπηρεσίες, χρησιμοποιώντας το δυναμικό τμήμα `[name]`. --- -### 4.3 Τελικά σημεία Mux (8 διαδρομές) +### 4.3 Τερματικά σημεία του Mux (8 διαδρομές) -Το Mux έχει την ίδια μορφή τελικών σημείων με το CLIProxyAPI — δεν υπάρχει διαδρομή `rotate-key` στην επιφάνεια -API (το διακριτικό bearer δημιουργείται με τον ίδιο τρόπο όπως του 9Router, μέσω -`getOrCreateApiKey("mux")`, και εισάγεται μέσω της μεταβλητής περιβάλλοντος `MUX_SERVER_AUTH_TOKEN`, αλλά -δεν υπάρχει ακόμη αποκλειστικό τελικό σημείο εναλλαγής). Το Mux υπόκειται μόνο σε διαχείριση κύκλου ζωής: σε αντίθεση με -το 9Router, δεν διαθέτει εκτελεστή Επιπέδου 4 και δεν καταχωρίζεται ποτέ ως πάροχος δρομολόγησης. +Το Mux έχει την ίδια δομή τερματικών σημείων με το CLIProxyAPI — δεν υπάρχει διαδρομή +`rotate-key` στην επιφάνεια του API (το διακριτικό bearer δημιουργείται με τον ίδιο +τρόπο όπως στο 9Router, μέσω του `getOrCreateApiKey("mux")`, και εισάγεται μέσω της +μεταβλητής περιβάλλοντος `MUX_SERVER_AUTH_TOKEN`, αλλά δεν υπάρχει ακόμη αποκλειστικό +τερματικό σημείο εναλλαγής). Το Mux υπόκειται μόνο σε διαχείριση κύκλου ζωής: σε +αντίθεση με το 9Router, δεν διαθέτει εκτελεστή Επιπέδου 4 και δεν καταχωρίζεται ποτέ +ως πάροχος δρομολόγησης. -| Μέθοδος | Διαδρομή | Περιγραφή | -| ------- | ------------------------------ | ----------------------------------------------------- | -| `POST` | `/api/services/mux/install` | Εγκατάσταση του Mux από το npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Εκκίνηση του Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Διακοπή του Mux | -| `POST` | `/api/services/mux/restart` | Επανεκκίνηση του Mux | -| `POST` | `/api/services/mux/update` | Ενημέρωση σε νεότερη έκδοση npm | -| `GET` | `/api/services/mux/status` | Κατάσταση σε πραγματικό χρόνο + από τη βάση δεδομένων | -| `POST` | `/api/services/mux/auto-start` | Εναλλαγή αυτόματης εκκίνησης | +| Μέθοδος | Διαδρομή | Περιγραφή | +| ------- | ------------------------------ | -------------------------------------------- | +| `POST` | `/api/services/mux/install` | Εγκατάσταση του Mux από το npm (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Εκκίνηση του Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Διακοπή του Mux | +| `POST` | `/api/services/mux/restart` | Επανεκκίνηση του Mux | +| `POST` | `/api/services/mux/update` | Ενημέρωση σε νεότερη έκδοση npm | +| `GET` | `/api/services/mux/status` | Κατάσταση σε πραγματικό χρόνο + ΒΔ | +| `POST` | `/api/services/mux/auto-start` | Εναλλαγή αυτόματης εκκίνησης | --- -### 4.4 Τελικά σημεία Bifrost (8 διαδρομές) +### 4.4 Τερματικά σημεία του Bifrost (8 διαδρομές) -Το Bifrost είναι ένα backend αναμετάδοσης πύλης AI σε Go (`@maximhq/bifrost`). Χρησιμοποιεί την ίδια -μορφή τελικών σημείων με το CLIProxyAPI (χωρίς `rotate-key` — το Bifrost διαχειρίζεται τα δικά του κλειδιά -παρόχων στο `config.json`, στον κατάλογο `-app-dir`). +Το Bifrost είναι ένα backend αναμετάδοσης πύλης AI σε Go (`@maximhq/bifrost`). +Χρησιμοποιεί την ίδια δομή τερματικών σημείων με το CLIProxyAPI (χωρίς `rotate-key` — +το Bifrost διαχειρίζεται τα δικά του κλειδιά παρόχων στο `config.json`, κάτω από το +`-app-dir`). -| Μέθοδος | Διαδρομή | Περιγραφή | -| ------- | ---------------------------------- | ---------------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Εγκατάσταση του Bifrost από το npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Εκκίνηση του Bifrost στη θύρα 8080 (προεπιλογή) | -| `POST` | `/api/services/bifrost/stop` | Διακοπή του Bifrost | -| `POST` | `/api/services/bifrost/restart` | Επανεκκίνηση του Bifrost | -| `POST` | `/api/services/bifrost/update` | Ενημέρωση σε νεότερη έκδοση | -| `GET` | `/api/services/bifrost/status` | Κατάσταση σε πραγματικό χρόνο + κατάσταση DB | -| `POST` | `/api/services/bifrost/auto-start` | Εναλλαγή αυτόματης εκκίνησης | -| `GET` | `/api/services/bifrost/logs` | Ροή καταγραφών SSE (μέσω της κοινόχρηστης δυναμικής διαδρομής `[name]/logs`) | +| Μέθοδος | Διαδρομή | Περιγραφή | +| ------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Εγκατάσταση του Bifrost από το npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Εκκίνηση του Bifrost στη θύρα 8080 (προεπιλογή) | +| `POST` | `/api/services/bifrost/stop` | Διακοπή του Bifrost | +| `POST` | `/api/services/bifrost/restart` | Επανεκκίνηση του Bifrost | +| `POST` | `/api/services/bifrost/update` | Ενημέρωση σε νεότερη έκδοση | +| `GET` | `/api/services/bifrost/status` | Κατάσταση σε πραγματικό χρόνο + ΒΔ | +| `POST` | `/api/services/bifrost/auto-start` | Εναλλαγή αυτόματης εκκίνησης | +| `GET` | `/api/services/bifrost/logs` | Παρακολούθηση ουράς αρχείου καταγραφής μέσω SSE (μέσω της κοινόχρηστης δυναμικής διαδρομής `[name]/logs`) | -**Σύνδεση δρομολόγησης:** Όταν το `BIFROST_BASE_URL` δεν έχει οριστεί και η εποπτευόμενη -διεργασία του Bifrost εκτελείται, η `getBifrostRoutingConfig()` (στο `routingBackend.ts`) χρησιμοποιεί αυτόματα -το `http://127.0.0.1:{port}` ως βασικό URL αναμετάδοσης. Η ρητά ορισμένη μεταβλητή περιβάλλοντος `BIFROST_BASE_URL` -έχει πάντα προτεραιότητα. +**Σύνδεση δρομολόγησης:** Όταν το `BIFROST_BASE_URL` δεν έχει οριστεί και η +εποπτευόμενη διεργασία του Bifrost εκτελείται, το `getBifrostRoutingConfig()` (στο +`routingBackend.ts`) χρησιμοποιεί αυτόματα το `http://127.0.0.1:{port}` ως βασικό URL +αναμετάδοσης. Η ρητά ορισμένη μεταβλητή περιβάλλοντος `BIFROST_BASE_URL` έχει πάντα +προτεραιότητα. --- -### 4.5 Τελικά σημεία Dario (12 διαδρομές) +### 4.5 Τερματικά σημεία του Dario (12 διαδρομές) Ίδια δομή κύκλου ζωής με τις άλλες υπηρεσίες (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), καθώς και ένα επίπεδο ελέγχου OAuth -με προστασία μέσω token κάτω από το `admin/`: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (όλα προστατεύονται από το `DARIO_ADMIN_TOKEN`). - -### 4.6 Αντίστροφος διακομιστής μεσολάβησης (ενσωμάτωση πίνακα ελέγχου 9Router) - -Ο πίνακας ελέγχου ενσωματώνει το web UI του 9Router μέσα σε ένα iframe μέσω ενός εσωτερικού αντίστροφου +`update`, `status`, `auto-start`, `auto-restart-adopted`), συν ένα επίπεδο ελέγχου +OAuth με προστασία μέσω διακριτικού, κάτω από το `admin/`: `admin/accounts`, +`admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (όλα +προστατεύονται από το `DARIO_ADMIN_TOKEN`). + +### 4.6 Τερματικά σημεία του open-wa (7 διαδρομές) + +Το open-wa (`@open-wa/wa-automate`) ελέγχει μια ακέφαλη διεργασία Chromium (μέσω +Puppeteer) για την αυτοματοποίηση του WhatsApp Web. Χρησιμοποιεί την ίδια δομή +τερματικών σημείων με το Mux (δεν υπάρχει ακόμη διαδρομή `rotate-key`). Υπόκειται +μόνο σε διαχείριση κύκλου ζωής — δεν αποτελεί προορισμό δρομολόγησης και δεν διαθέτει +εκτελεστή Επιπέδου 4 ούτε καταχώριση παρόχου. + +| Μέθοδος | Διαδρομή | Περιγραφή | +| ------- | --------------------------------- | ------------------------------------------------------------------------------------------ | +| `POST` | `/api/services/openwa/install` | Εγκατάσταση του open-wa από το npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Εκκίνηση του open-wa στη θύρα 8323 (προεπιλογή) | +| `POST` | `/api/services/openwa/stop` | Διακοπή του open-wa | +| `POST` | `/api/services/openwa/restart` | Επανεκκίνηση του open-wa | +| `POST` | `/api/services/openwa/update` | Ενημέρωση σε νεότερη έκδοση | +| `GET` | `/api/services/openwa/status` | Κατάσταση σε πραγματικό χρόνο + κατάσταση στη βάση δεδομένων | +| `POST` | `/api/services/openwa/auto-start` | Ενεργοποίηση/απενεργοποίηση αυτόματης εκκίνησης | +| `GET` | `/api/services/openwa/logs` | Ροή SSE των πρόσφατων καταγραφών (μέσω της κοινόχρηστης δυναμικής διαδρομής `[name]/logs`) | + +**Κλειδί API:** εισάγεται ως `WA_KEY` — η γενική παράκαμψη μέσω μεταβλητών περιβάλλοντος του open-wa με πρόθεμα `WA_*` +το αντιστοιχίζει στην επιλογή CLI `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, επαληθευμένο με βάση το εγκατεστημένο πακέτο 4.76.0). +Προστίθεται το πρόθεμα `ow_` όταν δημιουργείται από τη `generateServiceApiKey()`. Το open-wa +διαβάζει ξανά το κλειδί από μια κεφαλίδα HTTP `key`/`api_key` (όχι από +`Authorization: Bearer`)· το `/api-docs*` εξαιρείται ρητά από τον έλεγχο +(`setupAuthenticationLayer` στο `dist/cli/server.js`), επομένως ο έλεγχος εύρυθμης λειτουργίας +δεν χρειάζεται κεφαλίδα ελέγχου ταυτότητας. + +**Σύζευξη:** το open-wa είναι ανεπίσημο και δεν συνδέεται με το WhatsApp — ο +συνδεδεμένος αριθμός διατρέχει κίνδυνο αποκλεισμού από τον μηχανισμό ανίχνευσης αυτοματισμών του ίδιου του WhatsApp. +Κατά την πρώτη εκκίνηση, ο κωδικός QR σύζευξης εκτυπώνεται στο stdout και προβάλλεται μέσω +του υπάρχοντος πίνακα καταγραφών/της ροής SSE — δεν υπάρχει ακόμη ειδικό endpoint εικόνας QR +σε αυτήν την ενσωμάτωση. + +--- + +### 4.7 Αντίστροφος διακομιστής μεσολάβησης (ενσωμάτωση πίνακα ελέγχου 9Router) + +Ο πίνακας ελέγχου ενσωματώνει το περιβάλλον web του 9Router μέσα σε ένα iframe μέσω ενός εσωτερικού αντίστροφου διακομιστή μεσολάβησης στη διεύθυνση: ``` @@ -527,17 +568,17 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Αυτός ο διακομιστής μεσολάβησης: - Προωθεί το αίτημα στο `http://127.0.0.1:{port}/{path}` (μόνο μέσω loopback) -- Αφαιρεί τις εισερχόμενες κεφαλίδες `cookie` και `authorization` (χωρίς διαρροή της συνεδρίας OmniRoute) -- Εισάγει την κεφαλίδα `Authorization: Bearer {apiKey}` για τον έλεγχο ταυτότητας στο 9Router +- Αφαιρεί τις εισερχόμενες κεφαλίδες `cookie` και `authorization` (καμία διαρροή της συνεδρίας OmniRoute) +- Εισάγει `Authorization: Bearer {apiKey}` για τον έλεγχο ταυτότητας του 9Router - Αφαιρεί τα `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` από την απόκριση -- Επανεγγράφει τις αποκρίσεις HTML για να εισαγάγει το `` και να κανονικοποιήσει τις απόλυτες διαδρομές (`/foo` → `/dashboard/.../embed/foo`) +- Επανεγγράφει τις αποκρίσεις HTML ώστε να εισάγει το `` και να κανονικοποιεί τις απόλυτες διαδρομές (`/foo` → `/dashboard/.../embed/foo`) -Οι αναβαθμίσεις WebSocket για τον ενσωματωμένο πίνακα ελέγχου διεκπεραιώνονται από έναν συνοδευτικό διακομιστή σε μια -αποκλειστική θύρα (δείτε το `src/lib/services/embedWsProxy.ts`). +Οι αναβαθμίσεις WebSocket για τον ενσωματωμένο πίνακα ελέγχου διεκπεραιώνονται από έναν συνοδευτικό διακομιστή σε +μια αποκλειστική θύρα (βλ. `src/lib/services/embedWsProxy.ts`). **Ασφάλεια:** Οι διαδρομές του διακομιστή μεσολάβησης ενσωμάτωσης ταξινομούνται στο `LOCAL_ONLY_API_PREFIXES` και είναι προσβάσιμες μόνο μέσω loopback. Ένας εισβολέας που αποκτά ένα JWT μέσω μιας -σήραγγας Cloudflare/Ngrok δεν μπορεί να χρησιμοποιήσει τον διακομιστή μεσολάβησης για πρόσβαση σε ενσωματωμένες υπηρεσίες. +σήραγγας Cloudflare/Ngrok δεν μπορεί να χρησιμοποιήσει τον διακομιστή μεσολάβησης για πρόσβαση στις ενσωματωμένες υπηρεσίες. --- diff --git a/docs/i18n/el/docs/frameworks/MEMORY.md b/docs/i18n/el/docs/frameworks/MEMORY.md index 2a4ce2070895..74af811401fb 100644 --- a/docs/i18n/el/docs/frameworks/MEMORY.md +++ b/docs/i18n/el/docs/frameworks/MEMORY.md @@ -167,31 +167,33 @@ RRF(d) = Σ 1 / (k + rank_i(d)) όπου k = 60 (ρυθμιζόμενο μ ## Επέκταση ρυθμίσεων Εννέα πεδία ενσωματώσεων και διανυσμάτων είναι διαθέσιμα στο `MemorySettingsExtended` στο -`src/shared/schemas/memory.ts` και αποθηκεύονται μέσω του `src/lib/db/settings.ts`: +`src/shared/schemas/memory.ts` και διατηρούνται μέσω του `src/lib/db/settings.ts`: | Πεδίο | Τύπος | Προεπιλογή | Περιγραφή | | ------------------------ | -------------------------------------------------- | ---------- | ----------------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Ποια πηγή ενσωματώσεων θα χρησιμοποιηθεί | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Ποια πηγή ενσωματώσεων θα χρησιμοποιείται | | `embeddingProviderModel` | `string \| null` | `null` | Πάροχος/μοντέλο σε μορφή `provider/model` | | `customBaseUrl` | `string \| null` | `null` | Βασικό URL τελικού σημείου συμβατού με OpenAI μόνο για τη Μνήμη | | `customModelId` | `string \| null` | `null` | Αναγνωριστικό μοντέλου που αποστέλλεται στο προσαρμοσμένο τελικό σημείο | -| `transformersEnabled` | `boolean` | `false` | Προαιρετική ενεργοποίηση του Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Προαιρετική ενεργοποίηση του τοπικού στατικού μοντέλου potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Ενεργοποίηση του βήματος επανακατάταξης (προσθέτει +200-500ms/αίτημα) | -| `rerankProviderModel` | `string \| null` | `null` | Πάροχος/μοντέλο επανακατάταξης σε μορφή `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Ποιο σύστημα υποστήριξης διανυσμάτων θα χρησιμοποιηθεί | +| `transformersEnabled` | `boolean` | `false` | Ρητή ενεργοποίηση του Transformers.js (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Ρητή ενεργοποίηση του τοπικού στατικού μοντέλου potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Ενεργοποίηση του βήματος ανακατάταξης (προσθέτει +200-500ms/αίτημα) | +| `rerankProviderModel` | `string \| null` | `null` | Πάροχος/μοντέλο ανακατάταξης σε μορφή `provider/model` | -Αυτά εκτίθενται μέσω του `GET /PUT /api/settings/memory` (σχήμα `MemorySettingsExtendedSchema`). +Το `rerankProviderModel` επιλύεται από το `POST /v1/rerank` (καλείται μέσω loopback), επομένως αποδέχεται οτιδήποτε αποδέχεται αυτή η διαδρομή: ένα επιμελημένο μοντέλο ανακατάταξης στο cloud (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) ή έναν κόμβο παρόχου συμβατού με OpenAI ως `/` (π.χ. `skilled-mini/bge-reranker-v2-m3` για ένα σύστημα TEI/Infinity). Οι κόμβοι loopback είναι πάντα επιλέξιμοι· ένας κόμβος σε άλλον κεντρικό υπολογιστή (LAN, Tailscale) απαιτεί επιπλέον τη σημαία δυνατότητας `RERANK_REMOTE_PROVIDER_NODES` και πρέπει να πληροί την πολιτική εξερχόμενων URL παρόχου — δείτε τις [Σημαίες δυνατοτήτων](../reference/FEATURE_FLAGS.md). Ο επιλογέας του πίνακα ελέγχου παραθέτει επιμελημένους παρόχους μαζί με τοπικούς κόμβους· οποιαδήποτε έγκυρη συμβολοσειρά `provider/model` μπορεί να οριστεί απευθείας μέσω του `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Ποιο διανυσματικό backend θα χρησιμοποιείται | + +Αυτά διατίθενται μέσω του `GET /PUT /api/settings/memory` (σχήμα `MemorySettingsExtendedSchema`). Για την πηγή `remote`, η Μνήμη αποδέχεται επίσης τις προαιρετικές ρυθμίσεις `customBaseUrl` και `customModelId`. Μαζί επιλέγουν ένα τελικό σημείο `/embeddings` συμβατό με OpenAI και ένα μοντέλο, χωρίς να αλλάζουν το καθολικό μητρώο ενσωματώσεων. Το τελικό σημείο -κανονικοποιείται πριν από τη χρήση και ελέγχεται από την πολιτική εξερχόμενων URL του παρόχου: απαιτείται -HTTP(S), απορρίπτονται τα ενσωματωμένα διαπιστευτήρια και οι συμβολοσειρές ερωτήματος, ενώ οι διευθύνσεις +κανονικοποιείται πριν από τη χρήση και ελέγχεται από την πολιτική εξερχόμενων URL παρόχου: απαιτείται +HTTP(S), τα ενσωματωμένα διαπιστευτήρια και οι συμβολοσειρές ερωτήματος απορρίπτονται, ενώ οι διευθύνσεις μεταδεδομένων cloud παραμένουν αποκλεισμένες. Οι κενές τιμές διατηρούν τον επιλεγμένο πάροχο μητρώου. Τα σφάλματα που επιστρέφονται στον πίνακα ελέγχου εξυγιαίνονται και τα διαπιστευτήρια του τελικού σημείου δεν καταγράφονται ποτέ. -> **TODO (D20):** Η εμβέλεια `global` (κοινή χρήση μνημών μεταξύ όλων των κλειδιών API) δεν +> **TODO (D20):** Το εύρος `global` (κοινή χρήση αναμνήσεων μεταξύ όλων των κλειδιών API) δεν > υλοποιείται σε αυτήν την έκδοση. Απαιτεί αλλαγές στο σχήμα και μια καθολική διαδρομή > ανάκτησης. Να παρακολουθείται ξεχωριστά. diff --git a/docs/i18n/el/docs/guides/DOCKER_GUIDE.md b/docs/i18n/el/docs/guides/DOCKER_GUIDE.md index 0ce6d17bb843..b609d797c462 100644 --- a/docs/i18n/el/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/el/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Γρήγορη εκτέλεση +> **Αυτοφιλοξενία με μία εντολή;** Δείτε τον +> [Οδηγό αυτοφιλοξενίας](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (δημοσιευμένη εικόνα + +> Redis, μόνο μέσω loopback, χωρίς επιλογή προφίλ). Η παρακάτω Γρήγορη εκτέλεση είναι η +> διαδρομή ενός container για χρήστες που εκτελούν ήδη το Redis αλλού. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/el/docs/guides/TROUBLESHOOTING.md b/docs/i18n/el/docs/guides/TROUBLESHOOTING.md index 15e837961489..7225c9472ede 100644 --- a/docs/i18n/el/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/el/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # μεγαλύτερη οριοθ --- -## Προειδοποιήσεις του npm install (ERESOLVE / peer / deprecated) +## Προειδοποιήσεις npm install (ERESOLVE / peer / deprecated) -Όταν εκτελείτε `npm install -g omniroute`, ενδέχεται να δείτε πλήθος προειδοποιήσεων όπως `npm warn ERESOLVE`, ειδοποιήσεις για peer dependencies και μηνύματα `deprecated`. **Αυτά είναι αναμενόμενα και ακίνδυνα.** Η εγκατάσταση ολοκληρώθηκε με επιτυχία εάν βλέπετε `added packages` στην έξοδο. +Όταν εκτελείτε `npm install -g omniroute`, ενδέχεται να δείτε πολλές προειδοποιήσεις, όπως `npm warn ERESOLVE`, ειδοποιήσεις για εξαρτήσεις peer και μηνύματα `deprecated`. **Αυτές είναι αναμενόμενες και ακίνδυνες.** Η εγκατάστασή σας ολοκληρώθηκε επιτυχώς εάν δείτε `added packages` στην έξοδο. -Οι προειδοποιήσεις προέρχονται από παρωχημένα εύρη peer dependencies σε πακέτα τρίτων που δεν ελέγχονται από το OmniRoute: +Για να αποκρύψετε τις προειδοποιήσεις επίλυσης εξαρτήσεων peer, χρησιμοποιήστε την υποστηριζόμενη μορφή εγκατάστασης του OmniRoute: -1. **Το `marked-terminal` απαιτεί `marked >=1 <16`, αλλά βρέθηκε το `marked@18`** — στην πράξη λειτουργεί κανονικά· απλώς το εύρος peer dependency του upstream πακέτου είναι παρωχημένο. -2. **`deprecated prebuild-install@7.1.3`** — ένα μεταβατικό βοηθητικό εργαλείο λήψης εγγενών εκτελέσιμων αρχείων. Δεν - χρησιμοποιείται για την εγκατάσταση του καρφιτσωμένου transport binding `wreq-js` και δεν υποδεικνύει ότι απέτυχε - η ρύθμιση του transport για τον πάροχο web-cookie. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +Η επιλογή `--legacy-peer-deps` αποκρύπτει μόνο τις ειδοποιήσεις `ERESOLVE` και τις ειδοποιήσεις για εξαρτήσεις peer. Οι ειδοποιήσεις κατάργησης παραμένουν ορατές, επειδή προέρχονται από μεταβατικές εξαρτήσεις τρίτων· δεν υποδεικνύουν ότι η εγκατάσταση απέτυχε. + +Οι προειδοποιήσεις προέρχονται από παρωχημένα εύρη εξαρτήσεων peer σε πακέτα τρίτων που δεν ελέγχει το OmniRoute: + +1. **Το `marked-terminal` απαιτεί `marked >=1 <16`, αλλά βρέθηκε `marked@18`** — στην πράξη λειτουργεί κανονικά· απλώς το εύρος peer του upstream πακέτου είναι παρωχημένο. +2. **`deprecated prebuild-install@7.1.3`** — ένα μεταβατικό βοηθητικό εργαλείο λήψης εγγενών δυαδικών αρχείων. Δεν + χρησιμοποιείται για την εγκατάσταση του καρφιτσωμένου binding μεταφοράς `wreq-js` και δεν υποδεικνύει ότι η ρύθμιση + της μεταφοράς του παρόχου web-cookie απέτυχε. -**Δεν απαιτείται καμία ενέργεια** — οι προειδοποιήσεις δεν μπορούν να κατασταλούν πλήρως χωρίς fork των upstream πακέτων. +**Δεν απαιτείται καμία ενέργεια** — οι προειδοποιήσεις δεν μπορούν να αποσιωπηθούν πλήρως χωρίς τη δημιουργία fork των upstream πακέτων. --- diff --git a/docs/i18n/el/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/el/docs/providers/CURSOR-API-KEY-AND-CLI.md index 536fd0e978de..6a14a5421c97 100644 --- a/docs/i18n/el/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/el/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -7,33 +7,33 @@ Δύο τρόποι για να τοποθετήσετε το Cursor πίσω από το OmniRoute χωρίς συνεδρία IDE: 1. **Πάροχος `cursor-api`** (κάρτα "Cursor API", ψευδώνυμο `cua`): ένας πάροχος - με κλειδί API που διατηρεί ένα κλειδί API χρήστη του Cursor (`crsr_…`, το οποίο δημιουργείται στη διεύθυνση - `https://cursor.com/dashboard/api`). Στη συνέχεια, οποιοσδήποτε πελάτης OmniRoute αποκτά πρόσβαση - στα μοντέλα Cursor μέσω του `/v1/chat/completions` ως `cursor-api/` ή + API key που διατηρεί ένα Cursor user API key (`crsr_…`, το οποίο δημιουργείται στη + διεύθυνση `https://cursor.com/dashboard/api`). Οποιοσδήποτε πελάτης OmniRoute μπορεί στη συνέχεια να προσπελάσει + μοντέλα Cursor μέσω του `/v1/chat/completions` ως `cursor-api/` ή `cua/`, με τα συνήθη επίπεδα ορίων χρήσης, εναλλακτικής δρομολόγησης και καταγραφής. Ο πάροχος IDE - (`cursor`, συνεδρία OAuth/IDE) παραμένει αμετάβλητος. -2. **Άμεση προώθηση του Cursor CLI**: κατευθύνετε το Cursor CLI (`agent`) προς το OmniRoute, ώστε - κάθε RPC που πραγματοποιεί το CLI να πιστοποιείται με ένα κλειδί API του OmniRoute, να προωθείται + (`cursor`, OAuth/συνεδρία IDE) παραμένει αμετάβλητος. +2. **Διέλευση Cursor CLI**: κατευθύνετε το Cursor CLI (`agent`) προς το OmniRoute, ώστε + κάθε RPC που πραγματοποιεί το CLI να επαληθεύεται με ένα OmniRoute API key, να προωθείται στο Cursor με τα διαπιστευτήρια μιας σύνδεσης `cursor-api` και να καταγράφεται στη σελίδα Logs. ## Γιατί γίνεται ανταλλαγή του κλειδιού -Το `api2.cursor.sh` απορρίπτει ένα ακατέργαστο κλειδί `crsr_…` ως διακριτικό Bearer (401). Το Cursor -CLI αρχικά στέλνει το κλειδί μέσω POST στο `/auth/exchange_user_api_key` και λαμβάνει ένα JWT -συνεδρίας που λήγει μετά από μία ώρα· το επιστρεφόμενο `refreshToken` έχει την ίδια -τιμή `exp`, επομένως η ανανέωση απαιτεί εκ νέου ανταλλαγή του κλειδιού. -Το `open-sse/services/cursorApiKeyAuth.ts` πραγματοποιεί αυτή την ανταλλαγή, αποθηκεύει προσωρινά ένα διακριτικό -συνεδρίας ανά κλειδί, πραγματοποιεί εκ νέου την ανταλλαγή πέντε λεπτά πριν από τη λήξη και διαγράφει το προσωρινά αποθηκευμένο -διακριτικό όταν το Cursor απαντήσει με 401. Το `CursorExecutor` το καλεί ακριβώς πριν ανοίξει -τη ροή προς την υπηρεσία προέλευσης για συνδέσεις `cursor-api`. +Το `api2.cursor.sh` απορρίπτει ένα ακατέργαστο κλειδί `crsr_…` ως Bearer token (401). Το Cursor +CLI στέλνει πρώτα μέσω POST το κλειδί στο `/auth/exchange_user_api_key` και λαμβάνει ένα JWT +συνεδρίας που λήγει μετά από μία ώρα· το επιστρεφόμενο `refreshToken` φέρει το ίδιο +`exp`, επομένως η ανανέωση σημαίνει εκ νέου ανταλλαγή του κλειδιού. +Το `open-sse/services/cursorApiKeyAuth.ts` εκτελεί αυτή την ανταλλαγή, αποθηκεύει προσωρινά ένα token συνεδρίας +ανά κλειδί, πραγματοποιεί εκ νέου ανταλλαγή πέντε λεπτά πριν από τη λήξη και αφαιρεί το αποθηκευμένο +token όταν το Cursor απαντήσει με 401. Το `CursorExecutor` το καλεί αμέσως πριν ανοίξει +τη ροή προς την upstream υπηρεσία για συνδέσεις `cursor-api`. ## Ο πάροχος `cursor-api` Μητρώο: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, ίδια `format`, `baseUrl` και +(`cursor_apiProvider`, `authType: "apikey"`, ίδιο `format`, `baseUrl` και `models` με το `cursor`). Κάρτα καταλόγου: -`src/shared/constants/providers/apikey/specialty-media.ts`. Αντιστοίχιση εκτελεστών: +`src/shared/constants/providers/apikey/specialty-media.ts`. Αντιστοίχιση executor: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). @@ -64,36 +64,50 @@ curl -sS http://localhost:20128/v1/chat/completions \ - Το `POST /api/providers/{id}/refresh-cursor` προορίζεται μόνο για τον πάροχο IDE `cursor`· οι συνδέσεις `cursor-api` δεν διαθέτουν συνεδρία IDE προς ανανέωση. -## Άμεση προώθηση του Cursor CLI +## Εγγενή αναγνωριστικά μοντέλων και επίπεδο προσπάθειας + +Για τα `cursor` / `cu` και `cursor-api` / `cua`, ο κοινόχρηστος κανονικοποιητής προσπάθειας Claude +αφήνει ανέπαφο το αναγνωριστικό του ζητούμενου μοντέλου. Το Cursor μπορεί να δημοσιεύσει ένα επίθημα όπως +το `-low` ως μέρος ενός πραγματικού αναγνωριστικού μοντέλου και όχι ως ψευδώνυμο προσπάθειας του OmniRoute. +Ο executor του Cursor διατηρεί μια ακριβή αντιστοίχιση με τον ενεργό κατάλογο· όταν δεν υπάρχει +αντιστοίχιση, ο υπάρχων επιλυτής μοντέλων αναλαμβάνει την εναλλακτική μετατροπή του επιθήματος σε παράμετρο. + +Αυτό δεν αλλάζει την κανονικοποίηση της προσπάθειας για άμεσες διαδρομές Claude, συμβατές με Claude +ή Vertex. Η διαθεσιμότητα εξακολουθεί να εξαρτάται από τον κατάλογο και τα δικαιώματα του επιλεγμένου +λογαριασμού Cursor. + +## Διέλευση Cursor CLI Διαδρομή: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Το πρόθεμα `/api/cursor-cli/` είναι καταχωρισμένο στο `src/shared/constants/publicApiRoutes.ts`, επειδή ο χειριστής επιβάλλει τον δικό του έλεγχο ταυτότητας: -| Διαδρομή | Αναμενόμενος έλεγχος ταυτότητας από το CLI | Τι κάνει το OmniRoute | -| ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Επικυρώνει το κλειδί, δημιουργεί ένα JWT HS256 διάρκειας 1 ώρας (υπογεγραμμένο με `JWT_SECRET`) και το επιστρέφει | -| κάθε άλλη διαδρομή (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Επαληθεύει εκδότη/κοινό/λήξη, επιλέγει μια ενεργή σύνδεση `cursor-api`, αντικαθιστά την κεφαλίδα Authorization με το διακριτικό Cursor που προέκυψε από την ανταλλαγή και μεταδίδει την απάντηση πίσω | +| Διαδρομή | Αναμενόμενος έλεγχος ταυτότητας από το CLI | Τι κάνει το OmniRoute | +| ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Επικυρώνει το κλειδί, εκδίδει ένα HS256 JWT διάρκειας 1 ώρας (υπογεγραμμένο με `JWT_SECRET`) και το επιστρέφει | +| κάθε άλλη διαδρομή (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Επαληθεύει εκδότη/κοινό/λήξη, επιλέγει μια ενεργή σύνδεση `cursor-api`, αντικαθιστά την κεφαλίδα Authorization με το ανταλλαγμένο διακριτικό Cursor και μεταδίδει την απόκριση πίσω σε συνεχή ροή | -Το CLI αποκωδικοποιεί το `exp` από οποιοδήποτε διακριτικό λαμβάνει, επομένως η παροχή ενός αδιαφανούς -διακριτικού το αναγκάζει να πραγματοποιεί εκ νέου την ανταλλαγή πριν από σχεδόν κάθε αίτημα· το JWT που δημιουργείται αποφεύγει -αυτό το πρόβλημα. Μια απόκριση 401 από το OmniRoute αναγκάζει το CLI να πραγματοποιήσει ξανά την ανταλλαγή. +Το CLI αποκωδικοποιεί το `exp` από οποιοδήποτε διακριτικό λαμβάνει, επομένως η +παροχή ενός αδιαφανούς διακριτικού το αναγκάζει να πραγματοποιεί εκ νέου +ανταλλαγή πριν από σχεδόν κάθε αίτημα· το εκδοθέν JWT το αποτρέπει αυτό. Μια +απόκριση 401 από το OmniRoute αναγκάζει το CLI να πραγματοποιήσει ξανά την +ανταλλαγή. ### Ρύθμιση -1. Δημιουργήστε ένα κλειδί API του OmniRoute (Dashboard → API keys) και μια σύνδεση - `cursor-api`. -2. Ρυθμίστε το CLI ώστε να χρησιμοποιεί HTTP/1.1 για τη ροή του agent. Στο +1. Δημιουργήστε ένα κλειδί API του OmniRoute (Πίνακας ελέγχου → Κλειδιά API) και + μια σύνδεση `cursor-api`. +2. Ρυθμίστε το CLI ώστε να χρησιμοποιεί HTTP/1.1 για τη ροή του πράκτορα. Στο `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Χωρίς αυτή τη ρύθμιση, το CLI ανοίγει τον κύκλο αλληλεπίδρασης του agent μέσω HTTP/2 προς έναν ξεχωριστά - διαμορφωμένο κεντρικό υπολογιστή agent και μόνο τα RPC του επιπέδου ελέγχου περνούν μέσω του - τελικού σημείου. + Χωρίς αυτό, το CLI ανοίγει τη σειρά αλληλεπίδρασης του πράκτορα μέσω HTTP/2 + σε έναν ξεχωριστά διαμορφωμένο κεντρικό υπολογιστή πράκτορα και μόνο οι RPC + του επιπέδου ελέγχου διέρχονται από το τελικό σημείο. 3. Εκτελέστε το CLI μέσω του OmniRoute: @@ -103,19 +117,20 @@ curl -sS http://localhost:20128/v1/chat/completions \ agent -p --trust "Reply with exactly OK" ``` -Κάθε βήμα καταγράφεται στο Logs με πάροχο `cursor-api`, τύπο αιτήματος `cursor-cli`, -διαδρομή `/api/cursor-cli/`, και αποδίδεται στο κλειδί API του OmniRoute και στη +Κάθε ενδιάμεσο αίτημα καταγράφεται στα Αρχεία καταγραφής με πάροχο +`cursor-api`, τύπο αιτήματος `cursor-cli`, διαδρομή +`/api/cursor-cli/` και αποδίδεται στο κλειδί API του OmniRoute και στη σύνδεση που το εξυπηρέτησε. -### Τρόποι αποτυχίας - -| Κατάσταση | Απόκριση στο CLI | -| --------------------------------------------------------- | ------------------------------------------------------------- | -| Άγνωστο κλειδί OmniRoute και `REQUIRE_API_KEY=true` | 401 `unauthenticated` κατά την ανταλλαγή | -| `REQUIRE_API_KEY=false` | ανώνυμη συνεδρία (αντικατοπτρίζει τη συμπεριφορά του `/v1/*`) | -| Ληγμένο / ξένο / παραποιημένο JWT συνεδρίας | 401, το CLI εκτελεί ξανά την ανταλλαγή | -| Το κλειδί API του OmniRoute ανακλήθηκε μετά την ανταλλαγή | 401 στο επόμενο RPC | -| Καμία ενεργή σύνδεση `cursor-api` | 503 `unavailable` | -| Το Cursor απορρίπτει το κλειδί της σύνδεσης | 401 `unauthenticated`, η αποθηκευμένη συνεδρία διαγράφεται | -| Η upstream υπηρεσία δεν είναι προσβάσιμη | 502 `unavailable` (εξυγιασμένο μήνυμα) | -| Το `JWT_SECRET` δεν έχει οριστεί | 503 κατά την ανταλλαγή | +### Καταστάσεις αποτυχίας + +| Κατάσταση | Απόκριση προς το CLI | +| ------------------------------------------------------ | ------------------------------------------------------------- | +| Άγνωστο κλειδί OmniRoute και `REQUIRE_API_KEY=true` | 401 `unauthenticated` κατά την ανταλλαγή | +| `REQUIRE_API_KEY=false` | ανώνυμη συνεδρία (αντικατοπτρίζει τη συμπεριφορά του `/v1/*`) | +| Ληγμένο / ξένο / αλλοιωμένο JWT συνεδρίας | 401, το CLI πραγματοποιεί ξανά την ανταλλαγή | +| Κλειδί API του OmniRoute ανακλήθηκε μετά την ανταλλαγή | 401 στο επόμενο RPC | +| Καμία ενεργή σύνδεση `cursor-api` | 503 `unavailable` | +| Το Cursor απορρίπτει το κλειδί της σύνδεσης | 401 `unauthenticated`, η αποθηκευμένη συνεδρία διαγράφεται | +| Η ανάντη υπηρεσία δεν είναι προσβάσιμη | 502 `unavailable` (εξυγιασμένο μήνυμα) | +| Το `JWT_SECRET` δεν έχει οριστεί | 503 κατά την ανταλλαγή | diff --git a/docs/i18n/el/docs/reference/API_REFERENCE.md b/docs/i18n/el/docs/reference/API_REFERENCE.md index af63c54faf4f..f07f21272e5f 100644 --- a/docs/i18n/el/docs/reference/API_REFERENCE.md +++ b/docs/i18n/el/docs/reference/API_REFERENCE.md @@ -387,57 +387,57 @@ GET /api/v1/provider-plugin-manifest --- -## Endpoints Συμβατότητας - -| Μέθοδος | Διαδρομή | Μορφή | -| ------- | ----------------------------------------- | ------------------------------------ | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (edit/inpaint) | -| POST | `/v1/videos/generations` | Δημιουργία βίντεο τύπου OpenAI | -| POST | `/v1/music/generations` | Δημιουργία μουσικής τύπου OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (επιστρέφει σώμα ήχου) | -| POST | `/v1/rerank` | Rerank τύπου Cohere/Voyage | -| POST | `/v1/classify` | Jina classify (`api.jina.ai`) | -| POST | `/v1/segment` | Jina segmenter (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Ψευδώνυμο καταλόγου OpenAI | -| GET | `/api/v1/vscode/{token}/models` | Ψευδώνυμο μοντέλων OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | Tokenized ψευδώνυμο OpenAI | -| POST | `/api/v1/vscode/{token}/responses` | Tokenized ψευδώνυμο OpenAI Responses | -| POST | `/api/v1/vscode/{token}/api/chat` | Tokenized ψευδώνυμο Ollama | -| GET | `/api/v1/vscode/{token}/api/tags` | Tokenized ψευδώνυμο ετικετών Ollama | - -Όλες οι διαδρομές POST ακολουθούν το ίδιο σχήμα: `Bearer your-api-key` + σώμα JSON επικυρωμένο από Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, κ.λπ., βλ. `src/shared/validation/schemas.ts`). Επιστρέφεται 4xx σε αποτυχία σχήματος. - -Για clients που δεν μπορούν να επισυνάψουν `Authorization: Bearer ...`, το OmniRoute δέχεται επίσης κλειδιά API στο URL είτε μέσω συμβατότητας query-string (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) είτε μέσω των αφιερωμένων endpoints `/api/v1/vscode/{token}/...` που τεκμηριώνονται παρακάτω. +## Τελικά σημεία συμβατότητας + +| Μέθοδος | Διαδρομή | Μορφή | +| ------- | ----------------------------------------- | ---------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (επεξεργασία/inpaint) | +| POST | `/v1/videos/generations` | Δημιουργία βίντεο τύπου OpenAI | +| POST | `/v1/music/generations` | Δημιουργία μουσικής τύπου OpenAI | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (επιστρέφει σώμα ήχου) | +| POST | `/v1/rerank` | Επανακατάταξη τύπου Cohere/Voyage | +| POST | `/v1/classify` | Ταξινόμηση Jina (`api.jina.ai`) | +| POST | `/v1/segment` | Τμηματοποιητής Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | Ψευδώνυμο καταλόγου OpenAI | +| GET | `/api/v1/vscode/{token}/models` | Ψευδώνυμο μοντέλων OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | Ψευδώνυμο OpenAI με διακριτικό | +| POST | `/api/v1/vscode/{token}/responses` | Ψευδώνυμο OpenAI Responses με διακριτικό | +| POST | `/api/v1/vscode/{token}/api/chat` | Ψευδώνυμο Ollama με διακριτικό | +| GET | `/api/v1/vscode/{token}/api/tags` | Ψευδώνυμο ετικετών Ollama με διακριτικό | + +Όλες οι διαδρομές POST ακολουθούν την ίδια δομή: `Bearer your-api-key` + σώμα JSON επικυρωμένο μέσω Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` κ.λπ., δείτε το `src/shared/validation/schemas.ts`). Σε αποτυχία του σχήματος επιστρέφεται 4xx. + +Για προγράμματα-πελάτες που δεν μπορούν να επισυνάψουν `Authorization: Bearer ...`, το OmniRoute δέχεται επίσης κλειδιά API στη διεύθυνση URL είτε μέσω συμβατότητας με συμβολοσειρά ερωτήματος (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) είτε μέσω των αποκλειστικών τελικών σημείων `/api/v1/vscode/{token}/...` που τεκμηριώνονται παρακάτω. ```bash -# Rerank +# Επανακατάταξη (πάροχος μητρώου cloud ή κόμβος παρόχου συμβατού με OpenAI ως "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina classify (διαπιστευτήρια Foundation API) +# Ταξινόμηση Jina (διαπιστευτήρια Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Jina segmenter +# Τμηματοποιητής Jina POST /v1/segment { "content": "...", "return_chunks": true } -# Jina search (s.jina.ai; ψευδώνυμα παρόχου: jina-search, jina-ai, jina) +# Αναζήτηση Jina (s.jina.ai· ψευδώνυμα παρόχου: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Moderations +# Έλεγχοι περιεχομένου POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — επιστρέφει σώμα audio/mpeg (ή ζητούμενη μορφή) +# TTS — επιστρέφει σώμα audio/mpeg (ή σώμα στην αιτούμενη μορφή) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Επεξεργασία εικόνας (multipart) @@ -448,7 +448,29 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Αφιερωμένες Διαδρομές Παρόχου +> **Κόμβοι παρόχων επανακατάταξης:** Το `POST /v1/rerank` δρομολογεί επίσης σε κόμβους παρόχων συμβατούς με OpenAI +> (oMLX, vLLM, Infinity, TEI πίσω από πύλη, …), οι οποίοι προσδιορίζονται ως `/`. Οι κόμβοι +> loopback (`localhost`, `127.0.0.1`, `172.16.0.0/12`) είναι πάντοτε επιλέξιμοι. Οι κόμβοι σε οποιονδήποτε άλλο +> κεντρικό υπολογιστή —ένα μηχάνημα LAN ή ένας ομότιμος κόμβος Tailscale— είναι επιλέξιμοι μόνο όταν ο διαχειριστής ενεργοποιήσει τη +> σημαία δυνατότητας `RERANK_REMOTE_PROVIDER_NODES` **και** η βασική διεύθυνση URL του κόμβου συμμορφώνεται με την πολιτική εξερχόμενων +> URL παρόχου (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`)· +> οι κεντρικοί υπολογιστές μεταδεδομένων cloud δεν αποτελούν ποτέ προορισμό δρομολόγησης. Το βήμα επανακατάταξης της μηχανής μνήμης καλεί αυτήν τη διαδρομή μέσω +> loopback, επομένως ο ίδιος κανόνας διέπει το `rerankProviderModel` στις ρυθμίσεις Μνήμης. +> +> **Δομές τοπικού διακομιστή:** Ο κόμβος καλείται στο `/v1/rerank` και, σε περίπτωση 404, στο `/rerank` +> (Infinity, TEI). Το σώμα που αποστέλλεται προς τα ανάντη περιλαμβάνει τόσο την ορθογραφία Cohere/OpenAI (`documents`, +> `return_documents`) όσο και την ορθογραφία TEI (`texts`, `return_text`), ενώ η απόκριση από τα ανάντη +> κανονικοποιείται στο περίβλημα Cohere: ο γυμνός πίνακας `[{index, score, text}]` του TEI, το `{results: [{index, score}]}` +> από ελαφριές πύλες και το τύπου Voyage `{data: [...]}` επιστρέφονται όλα στον πελάτη ως +> `{results: [{index, relevance_score, document?}]}`, ταξινομημένα κατά βαθμολογία και περιορισμένα στο `top_n`. + +> **Εντοπισμός κόμβων παρόχων:** Τα μοντέλα σε έναν κόμβο παρόχου συμβατό με OpenAI εμφανίζονται στο `GET /v1/models` +> κάτω από το πρόθεμα του κόμβου. Οι γραμμές που δεν περιέχουν μεταδεδομένα τελικού σημείου (σύνηθες για τοπικές καταχωρίσεις `/v1/models`) +> κληρονομούν το `apiType` του κόμβου, επομένως τα μοντέλα ενός κόμβου `embeddings` έχουν `type: "embedding"` και τα +> μοντέλα ενός κόμβου `rerank` έχουν `type: "rerank"` αντί να χρησιμοποιούν από προεπιλογή τη συνομιλία· ένα ρητό +> `supportedEndpoints` σε μια συγχρονισμένη ή μη αυτόματα προστεθειμένη γραμμή εξακολουθεί να έχει προτεραιότητα. + +### Αποκλειστικές διαδρομές παρόχων ```bash POST /v1/providers/{provider}/chat/completions @@ -456,7 +478,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Το πρόθεμα παρόχου προστίθεται αυτόματα αν λείπει. Μη αντιστοιχισμένα μοντέλα επιστρέφουν `400`. +Το πρόθεμα του παρόχου προστίθεται αυτόματα εάν λείπει. Τα μη αντιστοιχισμένα μοντέλα επιστρέφουν `400`. --- diff --git a/docs/i18n/el/docs/reference/ENVIRONMENT.md b/docs/i18n/el/docs/reference/ENVIRONMENT.md index 8dfe310ffbde..0ab48849f12a 100644 --- a/docs/i18n/el/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/el/docs/reference/ENVIRONMENT.md @@ -77,74 +77,73 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" --- -## 2. Αποθήκευση & Βάση Δεδομένων - -Το OmniRoute χρησιμοποιεί **SQLite** (μέσω του `better-sqlite3`) για κάθε μόνιμη αποθήκευση. Αυτές οι μεταβλητές ελέγχουν την τοποθεσία, την κρυπτογράφηση και τον κύκλο ζωής των δεδομένων. - -| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Ριζικός κατάλογος για τη βάση δεδομένων SQLite, τα αντίγραφα ασφαλείας και τα αρχεία δεδομένων. Παρακάμψτε τον για τόμους Docker ή προσαρμοσμένες διαδρομές. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(δεν έχει οριστεί)_ | `src/lib/dataPaths.ts` | Δικλείδα διαφυγής για τον μηχανισμό προστασίας του DATA_DIR κατά τις δοκιμές/αξιολογήσεις (#10428). Οι δοκιμές και οι έλεγχοι eval/print του Node (`-e`/`--eval`/`-p`/`--print`, συμπεριλαμβανομένων των μορφών `--eval=`/`--print=`) χωρίς `DATA_DIR` ανακατευθύνονται σε έναν προσωρινό κατάλογο μίας χρήσης, ώστε να μην μπορούν να ανοίξουν την πραγματική βάση δεδομένων του διαχειριστή· ορίστε την τιμή σε `1` για να επιλέξετε ξανά τον πραγματικό κατάλογο. | -| `OMNIROUTE_BUILD_SHA` | _(δεν έχει οριστεί)_ | `src/lib/monitoring/buildSha.ts` | Το Git SHA του εκτελούμενου τεχνουργήματος. Ενσωματώνεται από το `npm run build:release`· μπορεί να εισαχθεί σε κοντέινερ που διανέμονται χωρίς τον δείκτη `dist/BUILD_SHA`. Εκτίθεται ως `system.buildSha` στο `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Η αναφορά βάσει της οποίας η πύλη προέλευσης του πακεταρισμένου τεχνουργήματος ελέγχει το SHA της έκδοσης (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(δεν έχει οριστεί)_ | `scripts/build/buildProvenance.ts` | Ορίστε την τιμή σε `1` για να επιτρέψετε την πακετοποίηση μιας έκδοσης της οποίας το SHA δεν βρίσκεται στη γραμμή έκδοσης, καταγράφοντάς την ως σκόπιμη έκδοση canary αντί να αποτύχει η πύλη (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(δεν έχει οριστεί)_ | `scripts/ops/deploy-canary.mjs` | Κλειδί API για τον smoke έλεγχο της ανάπτυξης canary, το οποίο αποστέλλεται ως `Authorization: Bearer` στο `/v1/chat/completions`. Χρησιμοποιείται μόνο από το script ανάπτυξης (#10429), ποτέ από τον διακομιστή. Δεν σχετίζεται με τις μεταβλητές `OMNIROUTE_SMOKE_*` του προαιρετικού μηχανισμού smoke ελέγχων του CLI (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` στο `tests/integration/upstream-cli-smoke.int.test.ts`) — δείτε [Ενσωματώσεις CLI → Πραγματική σάρωση smoke](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(δεν έχει οριστεί)_ | `src/lib/buildPhase.ts` | Σήμα φάσης δημιουργίας (#10060): ορίζεται σε `1` από το `scripts/build/build-next-isolated.mjs` και κληρονομείται από κάθε διεργασία εργασίας δημιουργίας που εκκινείται, ώστε το επίπεδο της βάσης δεδομένων να επιστρέφει ένα ανενεργό υποκατάστατο αντί να φορτώνει το εγγενές πρόσθετο better-sqlite3 (το οποίο τερματίζει τη διεργασία εργασίας κατά την έξοδο). Δεν ορίζεται ποτέ για τον εκτελούμενο διακομιστή. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Ορίστε την τιμή σε `1` για να παραλείψετε τον προαιρετικό έλεγχο προκατασκευής εγγενών εξαρτήσεων για ασυνήθιστα ενσωματωμένα δέντρα. Αυτό δεν καθιστά δυνατή τη δημιουργία όταν λείπει μια εξάρτηση· χρησιμοποιήστε το μόνο όταν οι εγγενείς εξαρτήσεις παρέχονται εκτός της τυπικής διαδικασίας. | -| `OMNIROUTE_DATA_DIR` | _(δεν έχει οριστεί)_ | `open-sse/executors/promptql/threadSticky.ts` | **Εναλλακτικό ψευδώνυμο** για το `DATA_DIR`, το οποίο ελέγχεται μόνο όταν το `DATA_DIR` δεν έχει οριστεί. Χρησιμοποιείται για τον εντοπισμό της αποθηκευμένης στον δίσκο μνήμης cache συνεδριών με σταθερή συσχέτιση νημάτων του εκτελεστή PromptQL (`/promptql-thread-sessions.json`)· αν δεν έχει οριστεί καμία από τις δύο μεταβλητές, η μνήμη cache παραμένει μόνο στη μνήμη (δεν διατηρείται μεταξύ επανεκκινήσεων). | -| `OMNIROUTE_PLUGINS_DIR` | _(δεν έχει οριστεί)_ | `src/lib/plugins/scanner.ts` | Ο κατάλογος που διαβάζει ο **σαρωτής προσθέτων κατά τον χρόνο εκτέλεσης** — και η ρίζα στην οποία πραγματοποιεί εγκαταστάσεις ο διαχειριστής προσθέτων — παρακάμπτοντας την προεπιλογή που προκύπτει από τον προσωπικό κατάλογο (#11827). Κατευθύνετέ τον στο δέντρο προσθέτων που έχει προσαρτηθεί μέσω bind mount στο Docker/K8s, αντί να μετακινείτε το HOME μόνο και μόνο για να αλλάξετε τη διαδρομή σάρωσης (το HOME διέπει και κάθε άλλη συμπεριφορά που σχετίζεται με τον προσωπικό κατάλογο). Χωρίς ορισμό = `~/.omniroute/plugins`, ή `/tmp/.omniroute/plugins` όταν η διεργασία δεν εξάγει κανέναν προσωπικό κατάλογο — τη σιωπηρή αποτυχία εντοπισμού που εξαλείφει αυτή η μεταβλητή. Ο επιλυμένος κατάλογος καταγράφεται μία φορά κατά την εκκίνηση ως `scanner.dir_resolved`, μαζί με την είσοδο που επικράτησε. Μόνο για την πλευρά του διακομιστή: τα πρόσθετα εντολών CLI διατηρούν το δικό τους `OMNIROUTE_PLUGIN_PATH` (ενότητα 9). | -| `STORAGE_ENCRYPTION_KEY` | _(κενό = απενεργοποιημένο)_ | `src/lib/db/encryption.ts` | Κλειδί AES για πλήρη κρυπτογράφηση της βάσης δεδομένων SQLite σε κατάσταση αδράνειας. Δημιουργήστε το με `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Ετικέτα έκδοσης για το κλειδί κρυπτογράφησης. Αυξήστε την κατά την εναλλαγή κλειδιών, ώστε να υποστηρίζεται η αποκρυπτογράφηση παλιών αντιγράφων ασφαλείας. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Όταν είναι `true`, παραλείπει τα τακτικά αντίγραφα ασφαλείας/αντίγραφα πριν από εγγραφή του αρχείου SQLite (αποθήκευση/εκκαθάριση τιμολόγησης models.dev, εγγραφές ρυθμίσεων). Τα χειροκίνητα αντίγραφα ασφαλείας και εκείνα πριν από επαναφορά εξακολουθούν να εκτελούνται. **Δεν** απενεργοποιεί το υποχρεωτικό, ανθεκτικό στιγμιότυπο ασφαλείας του εκτελεστή μετεγκατάστασης ή τον μηχανισμό προστασίας μαζικής μετεγκατάστασης για μια υπάρχουσα μόνιμη βάση δεδομένων. Τα μη χειροκίνητα αντίγραφα ασφαλείας περιορίζονται σε ένα το πολύ ανά 60 λεπτά. Η επιλογή **Ρυθμίσεις → Αποθήκευση** στον πίνακα ελέγχου μπορεί να απενεργοποιήσει ανεξάρτητα την τακτική αυτόματη δημιουργία αντιγράφων ασφαλείας. | -| `OMNIROUTE_CRYPT_KEY` | _(δεν έχει οριστεί)_ | `src/lib/db/encryption.ts` | **Παρωχημένο ψευδώνυμο** για το `STORAGE_ENCRYPTION_KEY`. Γίνεται αποδεκτό ως εφεδρική επιλογή όταν απουσιάζει η κύρια μεταβλητή. | -| `OMNIROUTE_API_KEY_BASE64` | _(δεν έχει οριστεί)_ | `src/lib/db/encryption.ts` | **Παρωχημένο ψευδώνυμο** (μορφή κωδικοποιημένη σε Base64) που γίνεται αποδεκτό ως εφεδρική επιλογή. Αποκωδικοποιείται αυτόματα πριν από τη χρήση. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(δεν έχει οριστεί)_ | `src/lib/db/core.ts` | Παρακάμπτει το διάστημα του περιοδικού ελέγχου εύρυθμης λειτουργίας του SQLite (ms). Όταν δεν έχει οριστεί, οι προεπιλογές προκύπτουν από το `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6ω) | `src/lib/db/walMaintenance.ts` | Παρακάμπτει το διάστημα της περιοδικής εκτέλεσης του `wal_checkpoint(TRUNCATE)` (ms). Το αυτόματο checkpoint δεν συρρικνώνει ποτέ το ίδιο το αρχείο WAL και ένας διακομιστής μακράς διάρκειας λειτουργίας δεν κλείνει ποτέ τη βάση δεδομένων του. Το `0` απενεργοποιεί τη λειτουργία. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5λ) | `src/lib/db/walMaintenance.ts` | Παρακάμπτει το διάστημα της συχνής εκτέλεσης του `wal_checkpoint(PASSIVE)` (ms). Διατηρεί τα εκκρεμή πλαίσια WAL σε μικρό μέγεθος, ώστε η περιοδική λειτουργία TRUNCATE να μην αντιγράφει ποτέ ένα συσσωρευμένο σύνολο πολλών GB στο κύριο νήμα. Το `0` απενεργοποιεί τη λειτουργία. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Όταν ένας κύκλος PASSIVE εντοπίσει ότι το αρχείο WAL υπερβαίνει αυτό το μέγεθος, πραγματοποιεί αμέσως αναβάθμιση σε `wal_checkpoint(TRUNCATE)` αντί να περιμένει τον αργό κύκλο. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Ορίστε το σε `1`/`true`/`yes`/`on`, ώστε η διεργασία να τερματίζεται αφού η κρίσιμη πίεση πόρων διατηρηθεί για `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, επιτρέποντας σε έναν επόπτη (systemd `Restart=always`, πολιτική επανεκκίνησης Docker) να επαναφέρει μια καθαρή διεργασία αντί να παρέχει επ’ αόριστον αποκρίσεις 503. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2λ) | `open-sse/utils/resourcePressure.ts` | Το χρονικό διάστημα για το οποίο πρέπει να επιμένει η κρίσιμη πίεση πριν ενεργοποιηθεί ο τερματισμός αυτοεπανεκκίνησης. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(αυτόματος εντοπισμός)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Ρητή διαδρομή (απόλυτη ή σχετική προς τον τρέχοντα κατάλογο εργασίας) προς το `sql-wasm.wasm` κατά τη χρήση του εφεδρικού προσαρμογέα WASM `sql.js`. Όταν δεν έχει οριστεί, εντοπίζεται αυτόματα μέσω των εξαρτήσεων πακέτων και των υποψήφιων διατάξεων. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6ω) | `src/lib/db/core.ts` | Παρακάμπτει το διάστημα της περιοδικής εκτέλεσης του `wal_checkpoint(TRUNCATE)` (ms). Το αυτόματο checkpoint δεν συρρικνώνει ποτέ το ίδιο το αρχείο WAL και ένας διακομιστής μακράς διάρκειας λειτουργίας δεν κλείνει ποτέ τη βάση δεδομένων του. Το `0` απενεργοποιεί τη λειτουργία. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Ο αριθμός ημερών για τον οποίο διατηρούνται, από την αυτόματη διαδικασία εκκαθάρισης πριν από τη διαγραφή, τα checkpoint, τα αναφερόμενα αρχεία εισόδου/εξόδου/σφαλμάτων και η γραμμή μιας εργασίας Batch API σε τελική κατάσταση (ολοκληρωμένη/αποτυχημένη/ακυρωμένη/ληγμένη). Ισχύει μόνο όταν ενεργοποιηθεί το `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`· αντιστοιχεί στο χρονικό παράθυρο διατήρησης εξόδου του Batch API της OpenAI. Δεν επηρεάζει τη διαδρομή `DELETE /api/v1/batches/delete-completed` που ενεργοποιείται από τον χειριστή και η οποία, βάσει σχεδιασμού, παραμένει άνευ όρων (χωρίς φίλτρο ηλικίας). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Όταν είναι `true`, επιτρέπει στην αυτόματη εκκαθάριση να διαγράφει ολοκληρωμένες εργασίες του Batch API (και τα σημεία ελέγχου τους) που έχουν υπερβεί το `OMNIROUTE_BATCH_RETENTION_DAYS` και να καθαρίζει το περιεχόμενο BLOB των μεταφορτωμένων αρχείων που έχουν υπερβεί το δικό τους `expires_at`. Απενεργοποιημένο από προεπιλογή: κάθε υπάρχουσα εγκατάσταση διατηρεί αυτά τα δεδομένα ακριβώς όπως πριν, έως ότου ένας διαχειριστής επιλέξει να το ενεργοποιήσει. Αποτελεί επίσης σημαία λειτουργίας που μπορεί να τροποποιηθεί από τον πίνακα ελέγχου — δείτε `docs/reference/FEATURE_FLAGS.md` → Χρόνος εκτέλεσης. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Ορίστε το σε `1` για να παραλείψετε πλήρως τον έλεγχο εύρυθμης λειτουργίας της βάσης δεδομένων κατά την εκκίνηση. Χρήσιμο για βραχύβιες εργασίες και δοκιμές ενοποίησης. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Ορίστε το σε `1` για να επιβάλετε την ενεργοποίηση του βρόχου ελέγχου εύρυθμης λειτουργίας της βάσης δεδομένων, ακόμη και όταν κανονικά θα παραλειπόταν (π.χ. σε βραχύβιες εργασίες). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Ορίστε το σε `1` για να παραλείψετε την προθέρμανση του εγγενούς περιβάλλοντος εκτέλεσης κατά το `npm install`. Χρήσιμο σε εγκαταστάσεις CI/χωρίς γραφικό περιβάλλον, όπου το sqlite έχει ήδη μεταγλωττιστεί. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(αυτόματος εντοπισμός)_ | `src/lib/db/migrationRunner.ts` | Παρακάμψτε τον κατάλογο που σαρώνει το πρόγραμμα εκτέλεσης μεταναστεύσεων. Χρήσιμο κατά τη διάθεση ενσωματωμένων μεταναστεύσεων σε προσαρμοσμένες εκδόσεις. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(δεν έχει οριστεί)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Πρόσθετοι κατάλογοι μεταναστεύσεων ως καταχωρίσεις `namespace=dir`, διαχωρισμένες με τον οριοθέτη διαδρομών της πλατφόρμας (π.χ. `ee=/opt/app/enterprise/db/migrations`). Τα αρχεία που εντοπίζονται εκεί καταγράφονται ως `-`, ώστε μια διανομή που διαθέτει τις δικές της μεταναστεύσεις να μην έρχεται ποτέ σε διένεξη με τις αριθμητικές θέσεις του upstream. Μια εσφαλμένα διαμορφωμένη καταχώριση, ένας μη έγκυρος χώρος ονομάτων ή ένας κατάλογος που λείπει προκαλεί σφάλμα κατά την εκκίνηση, αντί να παραλείπεται σιωπηρά το σχήμα. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Όριο ασφαλείας για μαζικά εκκρεμείς μεταναστεύσεις (#3416). Η εκκίνηση ματαιώνεται εάν εκκρεμούν περισσότερες από τόσες μεταναστεύσεις σε μια υπάρχουσα βάση δεδομένων (προστατεύει από τη διαγραφή του πίνακα παρακολούθησης). Αυξήστε το για να επαναφέρετε ένα παλαιότερο αντίγραφο ασφαλείας· ορίστε το σε `0` για να απενεργοποιήσετε τον έλεγχο. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Κατάλογος εργασίας για την πύλη έκδοσης `check:install-upgrade`. Χρειάζεται περίπου 12 GB (δύο δέντρα εγκατάστασης των ~3 GB συν το tarball), επομένως δεν πρέπει να εκτελείται σε μικρό tmpfs — στον αυτοδιαχειριζόμενο runner το `/tmp` είναι ένα tmpfs 12 GB που υποστηρίζεται από RAM και η πύλη το εξάντλησε, με αποτέλεσμα την περικοπή του πακέτου. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(προεπιλογή στον κώδικα)_ | `src/lib/spend/batchWriter.ts` | Διάστημα εκκαθάρισης (ms) για την ομαδοποιημένη εγγραφή δαπανών/κόστους. Οι χαμηλότερες τιμές μειώνουν τη συνένωση εγγραφών· οι υψηλότερες τιμές μειώνουν τις διενέξεις στη βάση δεδομένων. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(προεπιλογή στον κώδικα)_ | `src/lib/spend/batchWriter.ts` | Μέγιστος αριθμός καταχωρίσεων δαπανών στην ενδιάμεση μνήμη πριν από αναγκαστική εκκαθάριση. Αυξήστε τον σε αναπτύξεις με υψηλό QPS· μειώστε τον όταν η περιορισμένη χρήση μνήμης είναι σημαντικότερη. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(δεν έχει οριστεί)_ | `open-sse/utils/proxyFetch.ts` | Ορίστε το σε `"true"` για να εκπέμπονται αρχεία καταγραφής εντοπισμού σφαλμάτων `[ProxyFetch]` στη διαδρομή αναμετάδοσης του Vercel. Απενεργοποιημένο από προεπιλογή, ώστε να αποφεύγεται η διαρροή υποδείξεων δρομολόγησης. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Ορίστε το σε `"true"` ή `"1"` για να συμπεριλαμβάνονται οι διευθύνσεις IP πελάτη/εξόδου και το πρόθεμα λογαριασμού στην αναλυτική γραμμή καταγραφής διεργασίας `[ProxyEgress]`. Παραμένει ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ από προεπιλογή, ώστε το αρχείο καταγραφής διεργασίας να μην διαρρέει διευθύνσεις IP ή το πρόθεμα λογαριασμού. | -| `OMNIROUTE_DEBUG` | _(δεν έχει οριστεί)_ | `bin/cli/commands/quota.mjs` | Ορίστε το σε `1` για να εκτυπώνονται στο stderr διαγνωστικά χρονισμού ανά αίτημα (`[omniroute] GET completed in Nms`) από τις εντολές ποσοστώσεων του CLI. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(αυτόματο)_ | `scripts/dev/healthcheck.mjs` | Ρητή διαδρομή που ελέγχεται από τον έλεγχο εύρυθμης λειτουργίας του κοντέινερ. Όταν δεν έχει οριστεί, ο έλεγχος την εξάγει από το `OMNIROUTE_BASE_PATH`· ο ορισμός της ενεργοποιεί ξανά το endpoint διεξοδικής παρακολούθησης. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(δεν έχει οριστεί)_ | `bin/cli/commands/completion.mjs` | Ορίστε το σε οποιαδήποτε μη κενή τιμή για να εκπέμπονται διαγνωστικά `[omniroute completion]` από τις διαδρομές προσωρινής μνήμης αυτόματης συμπλήρωσης κελύφους του CLI (ανάγνωση/ανανέωση/εγγραφή). Απενεργοποιημένο από προεπιλογή — αυτές οι προσωρινές μνήμες αποτυγχάνουν σιωπηρά, ώστε μια απούσα ή κατεστραμμένη προσωρινή μνήμη να μην διακόπτει ποτέ την αυτόματη συμπλήρωση με το πλήκτρο Tab. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ώρες) | `open-sse/services/batchProcessor.ts` | Μέγιστο χρονικό περιθώριο επαναλήψεων για μεμονωμένα στοιχεία δέσμης (ms). Τα στοιχεία που υπερβαίνουν αυτή τη διάρκεια επισημαίνονται ως αποτυχημένα. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Βασική καθυστέρηση (ms) για εκθετική αναμονή μεταξύ επαναλήψεων στοιχείων δέσμης. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ώρα) | `open-sse/services/batchProcessor.ts` | Ανώτατο όριο (ms) για την εκθετική αναμονή μεταξύ επαναλήψεων στοιχείων δέσμης. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Μέγιστος αριθμός δεσμών που υποβάλλονται σε επεξεργασία ταυτόχρονα. Αυξήστε τον για μεγαλύτερη διεκπεραιωτική ικανότητα· διατηρήστε τον χαμηλό για να αποφύγετε καταιγισμό υπερβάσεων ορίων ρυθμού. | +## 2. Αποθήκευση & Βάση δεδομένων + +Το OmniRoute χρησιμοποιεί **SQLite** (μέσω του `better-sqlite3`) για κάθε μόνιμη αποθήκευση. Αυτές οι μεταβλητές ελέγχουν τη θέση, την κρυπτογράφηση και τον κύκλο ζωής των δεδομένων. + +| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Ριζικός κατάλογος για τη βάση δεδομένων SQLite, τα αντίγραφα ασφαλείας και τα αρχεία δεδομένων. Παρακάμψτε την τιμή για τόμους Docker ή προσαρμοσμένες διαδρομές. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(δεν έχει οριστεί)_ | `src/lib/dataPaths.ts` | Δικλείδα διαφυγής για τον περιορισμό του DATA_DIR σε δοκιμές/αξιολογήσεις (#10428). Οι δοκιμές και οι διερευνητικές εντολές eval/print του Node (`-e`/`--eval`/`-p`/`--print`, συμπεριλαμβανομένων των μορφών `--eval=`/`--print=`) χωρίς `DATA_DIR` ανακατευθύνονται σε έναν προσωρινό κατάλογο μίας χρήσης, ώστε να μην μπορούν να ανοίξουν την πραγματική βάση δεδομένων του διαχειριστή· ορίστε την τιμή σε `1` για να επιλέξετε ξανά τον πραγματικό κατάλογο. | +| `OMNIROUTE_BUILD_SHA` | _(δεν έχει οριστεί)_ | `src/lib/monitoring/buildSha.ts` | Το Git SHA του εκτελούμενου τεχνουργήματος. Ενσωματώνεται από την εντολή `npm run build:release`· μπορεί να εισαχθεί σε κοντέινερ που διανέμονται χωρίς το αρχείο-δείκτη `dist/BUILD_SHA`. Εμφανίζεται ως `system.buildSha` στο `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Η αναφορά με την οποία η πύλη προέλευσης του τεχνουργήματος πακέτου ελέγχει το SHA της δόμησης (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(δεν έχει οριστεί)_ | `scripts/build/buildProvenance.ts` | Ορίστε την τιμή σε `1` για να επιτρέψετε τη δημιουργία πακέτου από μια δόμηση της οποίας το SHA δεν βρίσκεται στη γραμμή έκδοσης, καταγράφοντάς την ως σκόπιμη έκδοση canary αντί να αποτύχει η πύλη (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(δεν έχει οριστεί)_ | `scripts/ops/deploy-canary.mjs` | Κλειδί API για τον έλεγχο smoke της ανάπτυξης canary, το οποίο αποστέλλεται ως `Authorization: Bearer` στο `/v1/chat/completions`. Χρησιμοποιείται μόνο από το script ανάπτυξης (#10429), ποτέ από τον διακομιστή. Δεν σχετίζεται με τις μεταβλητές `OMNIROUTE_SMOKE_*` του προαιρετικού πλαισίου ελέγχων smoke του CLI (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` στο `tests/integration/upstream-cli-smoke.int.test.ts`) — δείτε [Ενσωματώσεις CLI → Πραγματική σάρωση smoke](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(δεν έχει οριστεί)_ | `src/lib/buildPhase.ts` | Σήμα φάσης δόμησης (#10060): ορίζεται σε `1` από το `scripts/build/build-next-isolated.mjs` και κληρονομείται από κάθε διεργασία εργασίας δόμησης που εκκινείται, ώστε το επίπεδο της βάσης δεδομένων να επιστρέφει ένα αδρανές υποκατάστατο αντί να φορτώνει το εγγενές πρόσθετο better-sqlite3 (το οποίο τερματίζει απότομα τη διεργασία εργασίας κατά την έξοδο). Δεν ορίζεται ποτέ για τον εκτελούμενο διακομιστή. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Ορίστε την τιμή σε `1` για να παραλείψετε τον προαιρετικό έλεγχο προκατασκευής εγγενών εξαρτήσεων για ασυνήθιστα ενσωματωμένα δέντρα. Αυτό δεν καθιστά δυνατή τη δόμηση όταν λείπει κάποια εξάρτηση· χρησιμοποιήστε το μόνο όταν οι εγγενείς εξαρτήσεις παρέχονται εκτός της συνήθους διαδικασίας. | +| `OMNIROUTE_DATA_DIR` | _(δεν έχει οριστεί)_ | `open-sse/executors/promptql/threadSticky.ts` | **Εναλλακτικό ψευδώνυμο** για το `DATA_DIR`, το οποίο ελέγχεται μόνο όταν το `DATA_DIR` δεν έχει οριστεί. Χρησιμοποιείται για τον εντοπισμό της προσωρινής μνήμης συνεδριών thread-sticky του εκτελεστή PromptQL στον δίσκο (`/promptql-thread-sessions.json`)· αν δεν έχει οριστεί καμία από τις δύο μεταβλητές, η προσωρινή μνήμη παραμένει μόνο στη μνήμη (δεν διατηρείται μεταξύ επανεκκινήσεων). | +| `OMNIROUTE_PLUGINS_DIR` | _(δεν έχει οριστεί)_ | `src/lib/plugins/scanner.ts` | Ο κατάλογος που διαβάζει ο **σαρωτής προσθέτων κατά τον χρόνο εκτέλεσης** — και η ρίζα στην οποία πραγματοποιεί εγκαταστάσεις ο διαχειριστής προσθέτων — παρακάμπτοντας την προεπιλογή που προκύπτει από τον προσωπικό κατάλογο (#11827). Ορίστε τον στο προσαρτημένο μέσω bind δέντρο προσθέτων στο Docker/K8s, αντί να μετακινείτε το HOME μόνο και μόνο για να αλλάξετε τη θέση της διαδρομής σάρωσης (το HOME διέπει επίσης κάθε άλλη συμπεριφορά που σχετίζεται με τον προσωπικό κατάλογο). Χωρίς ορισμένη τιμή = `~/.omniroute/plugins`, ή `/tmp/.omniroute/plugins` όταν η διεργασία δεν εξάγει κανέναν προσωπικό κατάλογο — τη σιωπηρή αποτυχία εντοπισμού την οποία εξαλείφει αυτή η μεταβλητή. Ο επιλυμένος κατάλογος καταγράφεται μία φορά κατά την εκκίνηση ως `scanner.dir_resolved`, μαζί με την είσοδο που υπερίσχυσε. Μόνο στην πλευρά του διακομιστή: τα πρόσθετα εντολών CLI διατηρούν το δικό τους `OMNIROUTE_PLUGIN_PATH` (ενότητα 9). | +| `STORAGE_ENCRYPTION_KEY` | _(κενό = απενεργοποιημένο)_ | `src/lib/db/encryption.ts` | Κλειδί AES για πλήρη κρυπτογράφηση της βάσης δεδομένων SQLite σε κατάσταση αδράνειας. Δημιουργήστε το με `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Ετικέτα έκδοσης για το κλειδί κρυπτογράφησης. Αυξήστε την κατά την εναλλαγή κλειδιών, ώστε να υποστηρίζεται η αποκρυπτογράφηση παλαιών αντιγράφων ασφαλείας. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Όταν είναι `true`, παραλείπονται τα συνήθη αντίγραφα ασφαλείας/αντίγραφα πριν από εγγραφή του αρχείου SQLite (αποθήκευση/εκκαθάριση τιμολόγησης models.dev, εγγραφές ρυθμίσεων). Τα χειροκίνητα αντίγραφα ασφαλείας και εκείνα πριν από επαναφορά εξακολουθούν να εκτελούνται. **Δεν** απενεργοποιεί το υποχρεωτικό μόνιμο στιγμιότυπο ασφαλείας του μηχανισμού εκτέλεσης μετεγκαταστάσεων ούτε την προστασία μαζικής μετεγκατάστασης για μια υπάρχουσα μόνιμη βάση δεδομένων. Τα μη χειροκίνητα αντίγραφα ασφαλείας περιορίζονται σε ένα το πολύ ανά 60 λεπτά. Η επιλογή **Ρυθμίσεις → Αποθήκευση** του πίνακα ελέγχου μπορεί να απενεργοποιήσει ανεξάρτητα τη συνήθη αυτόματη δημιουργία αντιγράφων ασφαλείας. | +| `OMNIROUTE_CRYPT_KEY` | _(δεν έχει οριστεί)_ | `src/lib/db/encryption.ts` | **Παρωχημένο ψευδώνυμο** για το `STORAGE_ENCRYPTION_KEY`. Γίνεται αποδεκτό ως εναλλακτική όταν απουσιάζει η κύρια μεταβλητή. | +| `OMNIROUTE_API_KEY_BASE64` | _(δεν έχει οριστεί)_ | `src/lib/db/encryption.ts` | **Παρωχημένο ψευδώνυμο** (μορφή κωδικοποιημένη σε Base64) που γίνεται αποδεκτό ως εναλλακτική. Αποκωδικοποιείται αυτόματα πριν από τη χρήση. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(δεν έχει οριστεί)_ | `src/lib/db/core.ts` | Παρακάμπτει το διάστημα περιοδικού ελέγχου εύρυθμης λειτουργίας του SQLite (ms). Όταν δεν έχει οριστεί, οι προεπιλογές προκύπτουν από το `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(καταργήθηκε)_ | `src/lib/db/walMaintenance.ts` | **Καταργήθηκε.** Ένα περιοδικό `wal_checkpoint(TRUNCATE)` σε ενεργή βάση μπορεί να ακυρώσει την κοινόχρηστη αντιστοίχιση wal-index και να προκαλέσει κατάρρευση της διεργασίας με SIGBUS (#13973), επομένως ο χρονοπρογραμματιστής δεν υπάρχει πλέον. Η μεταβλητή είναι ανενεργή: μια θετική τιμή καταγράφει μία εφάπαξ προειδοποίηση κατάργησης, ενώ η τιμή `0` ή η απουσία τιμής δεν παράγει μήνυμα. Το WAL συντηρείται από σημεία ελέγχου PASSIVE (παρακάτω) και περικόπτεται από το σημείο ελέγχου κατά τον τερματισμό. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 λεπτά) | `src/lib/db/walMaintenance.ts` | Παρακάμπτει το συχνό διάστημα εκτέλεσης του `wal_checkpoint(PASSIVE)` (ms). Διατηρεί μικρό τον αριθμό των εκκρεμών πλαισίων WAL, ώστε τα σημεία ελέγχου να παραμένουν γρήγορα και το μέγεθος του αρχείου WAL να παραμένει περιορισμένο μεταξύ των περικοπών κατά τον τερματισμό. Η τιμή `0` το απενεργοποιεί. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Όταν ένας κύκλος PASSIVE εντοπίσει ότι το αρχείο WAL υπερβαίνει αυτό το μέγεθος, εκτελείται το `wal_checkpoint(RESTART)`, ώστε το WAL να ξεκινήσει από την αρχή χωρίς επανεγγραφή του αντιστοιχισμένου wal-index. Τα σημεία ελέγχου λειτουργίας περικοπής σε ενεργή βάση καταργήθηκαν (δείτε τη γραμμή `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Ορίστε το σε `1`/`true`/`yes`/`on`, ώστε η διεργασία να τερματίζεται αφού η κρίσιμη πίεση πόρων διατηρηθεί για `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, επιτρέποντας σε έναν επόπτη (systemd `Restart=always`, πολιτική επανεκκίνησης Docker) να επαναφέρει μια καθαρή διεργασία αντί να εξυπηρετούνται αποκρίσεις 503 επ’ αόριστον. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 λεπτά) | `open-sse/utils/resourcePressure.ts` | Το χρονικό διάστημα για το οποίο πρέπει να διατηρηθεί η κρίσιμη πίεση προτού ενεργοποιηθεί ο τερματισμός αυτοεπανεκκίνησης. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(αυτόματος εντοπισμός)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Ρητή διαδρομή (απόλυτη ή σχετική προς το cwd) προς το `sql-wasm.wasm` κατά τη χρήση του εφεδρικού προσαρμογέα WASM `sql.js`. Όταν δεν έχει οριστεί, εντοπίζεται αυτόματα μέσω των εξαρτήσεων του πακέτου και υποψήφιων διατάξεων. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Αριθμός ημερών για τις οποίες διατηρούνται, πριν από τη διαγραφή από την αυτόματη διαδικασία εκκαθάρισης, τα σημεία ελέγχου, τα αναφερόμενα αρχεία εισόδου/εξόδου/σφαλμάτων και η εγγραφή μιας εργασίας Batch API σε τελική κατάσταση (ολοκληρωμένη/αποτυχημένη/ακυρωμένη/ληγμένη). Εφαρμόζεται μόνο όταν ενεργοποιηθεί το `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`· αντιστοιχεί στο χρονικό περιθώριο διατήρησης εξόδου του Batch API της OpenAI. Δεν επηρεάζει τη διαδρομή `DELETE /api/v1/batches/delete-completed` που ενεργοποιείται από τον χειριστή και, βάσει σχεδιασμού, παραμένει χωρίς προϋποθέσεις (χωρίς φίλτρο ηλικίας). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Όταν είναι `true`, επιτρέπει στην αυτόματη διαδικασία εκκαθάρισης να διαγράφει εργασίες Batch API σε τελική κατάσταση (και τα σημεία ελέγχου τους) που έχουν υπερβεί το `OMNIROUTE_BATCH_RETENTION_DAYS` και να εκκαθαρίζει το περιεχόμενο BLOB των μεταφορτωμένων αρχείων που έχουν υπερβεί το δικό τους `expires_at`. Είναι απενεργοποιημένο από προεπιλογή: κάθε υπάρχουσα εγκατάσταση διατηρεί αυτά τα δεδομένα ακριβώς όπως πριν, έως ότου ένας χειριστής επιλέξει να συμμετάσχει. Αποτελεί επίσης σημαία δυνατότητας που μπορεί να τροποποιηθεί από τον πίνακα ελέγχου — δείτε `docs/reference/FEATURE_FLAGS.md` → Χρόνος εκτέλεσης. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Ορίστε το σε `1` για να παραλείψετε πλήρως τον έλεγχο εύρυθμης λειτουργίας της βάσης δεδομένων κατά την εκκίνηση. Χρήσιμο για βραχύβιες εργασίες και δοκιμές ενοποίησης. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Ορίστε το σε `1` για να επιβάλετε την εκτέλεση του βρόχου ελέγχου εύρυθμης λειτουργίας της βάσης δεδομένων, ακόμη και όταν κανονικά θα παραλειπόταν (π.χ. σε βραχύβιες εργασίες). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Ορίστε το σε `1` για να παραλείψετε την προθέρμανση του εγγενούς περιβάλλοντος εκτέλεσης κατά το `npm install`. Χρήσιμο σε εγκαταστάσεις CI/χωρίς γραφικό περιβάλλον, όπου το sqlite έχει ήδη μεταγλωττιστεί. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(αυτόματος εντοπισμός)_ | `src/lib/db/migrationRunner.ts` | Παρακάμψτε τον κατάλογο που σαρώνει ο εκτελεστής μετεγκαταστάσεων. Χρήσιμο κατά τη διανομή ενσωματωμένων μετεγκαταστάσεων σε προσαρμοσμένες εκδόσεις. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(δεν έχει οριστεί)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Πρόσθετοι κατάλογοι μετεγκαταστάσεων ως καταχωρίσεις `namespace=dir`, διαχωρισμένες με τον οριοθέτη διαδρομών της πλατφόρμας (π.χ. `ee=/opt/app/enterprise/db/migrations`). Τα αρχεία που εντοπίζονται εκεί καταγράφονται ως `-`, ώστε μια διανομή που περιλαμβάνει τις δικές της μετεγκαταστάσεις να μην συγκρούεται ποτέ με τις αριθμητικές θέσεις του upstream. Μια εσφαλμένη καταχώριση, ένας μη έγκυρος χώρος ονομάτων ή ένας κατάλογος που λείπει προκαλεί σφάλμα κατά την εκκίνηση αντί να παραλείπεται σιωπηρά το σχήμα. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Όριο ασφαλείας για μαζικές εκκρεμείς μετεγκαταστάσεις (#3416). Η εκκίνηση διακόπτεται εάν εκκρεμούν περισσότερες μετεγκαταστάσεις από αυτό το όριο σε μια υπάρχουσα βάση δεδομένων (προστασία από διαγραμμένο πίνακα παρακολούθησης). Αυξήστε το για να επαναφέρετε ένα παλαιότερο αντίγραφο ασφαλείας· ορίστε το σε `0` για να απενεργοποιήσετε τον έλεγχο. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Κατάλογος εργασίας για την πύλη έκδοσης `check:install-upgrade`. Χρειάζεται περίπου 12 GB (δύο δέντρα εγκατάστασης ~3 GB συν το tarball), επομένως δεν πρέπει να εκτελείται σε μικρό tmpfs — στον αυτοφιλοξενούμενο runner το `/tmp` είναι ένα tmpfs 12 GB που υποστηρίζεται από RAM και η πύλη το εξάντλησε, με αποτέλεσμα την περικοπή του πακέτου. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(προεπιλογή στον κώδικα)_ | `src/lib/spend/batchWriter.ts` | Διάστημα εκκαθάρισης (ms) για τον ομαδοποιημένο εγγραφέα δαπανών/κόστους. Οι χαμηλότερες τιμές μειώνουν τη συνένωση εγγραφών· οι υψηλότερες τιμές μειώνουν τη διεκδίκηση πόρων στη βάση δεδομένων. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(προεπιλογή στον κώδικα)_ | `src/lib/spend/batchWriter.ts` | Μέγιστος αριθμός καταχωρίσεων δαπανών στην προσωρινή μνήμη πριν από αναγκαστική εκκαθάριση. Αυξήστε τον σε αναπτύξεις υψηλού QPS· μειώστε τον όταν η περιορισμένη χρήση μνήμης έχει μεγαλύτερη σημασία. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(δεν έχει οριστεί)_ | `open-sse/utils/proxyFetch.ts` | Ορίστε το σε `"true"` για την εκπομπή αρχείων καταγραφής αποσφαλμάτωσης `[ProxyFetch]` στη διαδρομή αναμετάδοσης του Vercel. Είναι απενεργοποιημένο από προεπιλογή, ώστε να αποφεύγεται η διαρροή υποδείξεων δρομολόγησης. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Ορίστε το σε `"true"` ή `"1"` για να συμπεριλάβετε τις IP πελάτη/εξόδου και το πρόθεμα λογαριασμού στην αναλυτική γραμμή καταγραφής διεργασίας `[ProxyEgress]`. Διατηρείται ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ από προεπιλογή, ώστε η καταγραφή διεργασίας να μη διαρρέει IP ή το πρόθεμα λογαριασμού. | +| `OMNIROUTE_DEBUG` | _(δεν έχει οριστεί)_ | `bin/cli/commands/quota.mjs` | Ορίστε το σε `1` για να εκτυπώνονται διαγνωστικά χρονισμού ανά αίτημα (`[omniroute] GET completed in Nms`) από τις εντολές ποσόστωσης του CLI στο stderr. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(αυτόματα)_ | `scripts/dev/healthcheck.mjs` | Ρητή διαδρομή που ελέγχεται από τον έλεγχο εύρυθμης λειτουργίας του container. Όταν δεν έχει οριστεί, ο έλεγχος την παράγει από το `OMNIROUTE_BASE_PATH`· ο ορισμός της ενεργοποιεί ξανά το endpoint διεξοδικής παρακολούθησης. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(δεν έχει οριστεί)_ | `bin/cli/commands/completion.mjs` | Ορίστε το σε οποιαδήποτε μη κενή τιμή για την εκπομπή διαγνωστικών `[omniroute completion]` από τις διαδρομές cache αυτόματης συμπλήρωσης κελύφους του CLI (ανάγνωση/ανανέωση/εγγραφή). Είναι απενεργοποιημένο από προεπιλογή — οι αστοχίες αυτών των cache αποσιωπώνται, ώστε μια απούσα/κατεστραμμένη cache να μη διακόπτει ποτέ την αυτόματη συμπλήρωση με tab. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ώρες) | `open-sse/services/batchProcessor.ts` | Μέγιστο χρονικό παράθυρο επαναλήψεων για μεμονωμένα στοιχεία παρτίδας (ms). Τα στοιχεία που υπερβαίνουν αυτή τη διάρκεια επισημαίνονται ως αποτυχημένα. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Βασική καθυστέρηση (ms) για εκθετική υποχώρηση στις επαναλήψεις στοιχείων παρτίδας. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ώρα) | `open-sse/services/batchProcessor.ts` | Ανώτατο όριο (ms) για την εκθετική υποχώρηση μεταξύ επαναλήψεων στοιχείων παρτίδας. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Μέγιστος αριθμός παρτίδων που υποβάλλονται σε ταυτόχρονη επεξεργασία. Αυξήστε τον για μεγαλύτερη διεκπεραιωτική ικανότητα· διατηρήστε τον χαμηλό για να αποφύγετε καταιγισμό περιορισμών ρυθμού. | > [!IMPORTANT] -> Πριν από την τροποποίηση μιας υπάρχουσας μόνιμης βάσης δεδομένων, το πρόγραμμα εκτέλεσης μετεγκαταστάσεων δημοσιεύει ένα πλήρες, -> στιγμιότυπο με διευθυνσιοδότηση βάσει περιεχομένου στον κατάλογο `DATA_DIR/db_backups/`. Η δημοσίευση απαιτεί ένα σύστημα αρχείων -> που υποστηρίζει σκληρούς συνδέσμους στο ίδιο σύστημα αρχείων χωρίς αντικατάσταση, καθώς και ανθεκτικό συγχρονισμό αρχείων. Τα συστήματα POSIX απαιτούν επίσης -> συγχρονισμό καταλόγων· στα Windows, το Node ενδέχεται να απορρίψει χειριστές καταλόγων, οπότε το OmniRoute αποθηκεύει οριστικά το +> Πριν από την αλλαγή μιας υπάρχουσας μόνιμης βάσης δεδομένων, το πρόγραμμα εκτέλεσης μετεγκαταστάσεων δημοσιεύει ένα πλήρες, +> στιγμιότυπο με διεύθυνση βάσει περιεχομένου στον κατάλογο `DATA_DIR/db_backups/`. Η δημοσίευση απαιτεί ένα σύστημα αρχείων +> που υποστηρίζει συνδέσμους hard link στο ίδιο σύστημα αρχείων χωρίς αντικατάσταση, καθώς και ανθεκτικό συγχρονισμό αρχείων. Τα συστήματα POSIX απαιτούν επίσης +> συγχρονισμό καταλόγων· στα Windows, το Node ενδέχεται να απορρίψει χειριστές καταλόγων, επομένως το OmniRoute αποθηκεύει οριστικά το > δημοσιευμένο αρχείο και αντιμετωπίζει τον συγχρονισμό της καταχώρισης καταλόγου ως ενέργεια βέλτιστης προσπάθειας. -> Εάν το προσαρτημένο `DATA_DIR` δεν μπορεί να παρέχει αυτές τις εγγυήσεις, η εκκίνηση τερματίζεται με ασφάλεια πριν από την εφαρμογή -> μιας μετεγκατάστασης. Μετακινήστε το `DATA_DIR` σε έναν τόμο που υποστηρίζει αυτές τις λειτουργίες· μη χρησιμοποιείτε το +> Εάν το προσαρτημένο `DATA_DIR` δεν μπορεί να παρέχει αυτές τις εγγυήσεις, η εκκίνηση αποτυγχάνει με ασφαλή τρόπο πριν από την εφαρμογή +> μιας μετεγκατάστασης. Μετακινήστε το `DATA_DIR` σε έναν τόμο που διαθέτει αυτές τις λειτουργίες· μην χρησιμοποιείτε το > `DISABLE_SQLITE_AUTO_BACKUP` για να παρακάμψετε την ασφάλεια των μετεγκαταστάσεων. ### Σενάρια -| Σενάριο | Διαμόρφωση | -| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| **Τοπική ανάπτυξη** | Διατηρήστε όλες τις προεπιλεγμένες ρυθμίσεις. Η βάση δεδομένων βρίσκεται στο `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + προσαρτήστε έναν τόμο στο `/data`. | -| **Κρυπτογράφηση σε κατάσταση αδράνειας** | Ορίστε το `STORAGE_ENCRYPTION_KEY` + διατηρήστε αντίγραφα ασφαλείας του κλειδιού! Η απώλειά του = απώλεια δεδομένων. | -| **CI/Δοκιμές** | `DATA_DIR=/tmp/omniroute-test` — προσωρινό, δεν απαιτείται κρυπτογράφηση. | +| Σενάριο | Διαμόρφωση | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| **Τοπική ανάπτυξη** | Διατηρήστε όλες τις προεπιλογές. Η βάση δεδομένων βρίσκεται στο `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + προσαρτήστε έναν τόμο στο `/data`. | +| **Κρυπτογράφηση σε ηρεμία** | Ορίστε το `STORAGE_ENCRYPTION_KEY` + διατηρήστε αντίγραφα ασφαλείας του κλειδιού! Απώλειά του = απώλεια δεδομένων. | +| **CI/Δοκιμές** | `DATA_DIR=/tmp/omniroute-test` — προσωρινό, δεν απαιτείται κρυπτογράφηση. | --- @@ -215,45 +214,46 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 4. Ασφάλεια & Έλεγχος ταυτότητας -| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt που συνδυάζεται με αναγνωριστικά υλικού για τη δημιουργία αποτυπώματος μηχανήματος. Αλλάξτε το ανά εγκατάσταση για απομόνωση. | -| `OMNIROUTE_CLI_SALT` | _(μη ορισμένο = τυχαίο salt ανά εγκατάσταση, αποθηκευμένο μόνιμα στο `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Salt HMAC για την παραγωγή του τοπικού διακριτικού ελέγχου ταυτότητας CLI. Ο ορισμός αυτής της τιμής ανανεώνει όλα τα διακριτικά CLI στο μηχάνημα και έχει πάντα προτεραιότητα έναντι του αποθηκευμένου salt. Δείτε το `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Ορίζει τη σημαία `Secure` στα cookie συνεδρίας. **Πρέπει να είναι `true`** όταν εκτελείται πίσω από HTTPS. | -| `REQUIRE_API_KEY` | `false` | Ενδιάμεσο λογισμικό API | Όταν είναι `true`, όλα τα αιτήματα διαμεσολάβησης `/v1/*` πρέπει να περιλαμβάνουν ένα έγκυρο κλειδί API. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Επιτρέπει την αποκάλυψη των πλήρων τιμών των κλειδιών API στο περιβάλλον χρήστη του Πίνακα ελέγχου. Μπορεί να ρυθμιστεί από τις Σημαίες λειτουργιών του Πίνακα ελέγχου· αποτελεί κίνδυνο ασφαλείας σε κοινόχρηστες εγκαταστάσεις. | -| `NO_LOG_API_KEY_IDS` | _(κενό)_ | `src/lib/compliance/index.ts` | Αναγνωριστικά κλειδιών API διαχωρισμένα με κόμματα, τα οποία παρακάμπτουν την καταγραφή αιτημάτων (συμμόρφωση με τον GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(μη ορισμένο = απεριόριστο)_ | `src/shared/utils/apiKeyPolicy.ts` | Εφεδρικό ημερήσιο όριο αιτημάτων που εφαρμόζεται σε κλειδιά API των οποίων η στήλη `rate_limits` είναι null. Μη ορισμένη ή κενή τιμή: κανένα έμμεσο όριο (#2289, #11017). Το `0` σημαίνει το ίδιο (απεριόριστο). Ένας θετικός ακέραιος N ενεργοποιεί N/ημέρα, 5N/εβδομάδα, 20N/μήνα. Οι μη έγκυρες μη κενές τιμές χρησιμοποιούν ως εφεδρικά τα παλαιού τύπου χρονικά παράθυρα των 1000/ημέρα, 5000/εβδομάδα και 20000/μήνα. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Μέγιστο επιτρεπόμενο μέγεθος σώματος αιτήματος. Απορρίπτει ωφέλιμα φορτία που υπερβαίνουν αυτό το όριο. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Τα πραγματικά σώματα αιτημάτων που έχουν μέγεθος ίσο ή μεγαλύτερο από αυτό το όριο λαμβάνουν την ατομική, τοπική στη διεργασία άδεια εισαγωγής βαρέος φόρτου πριν από την ανάλυση JSON (διαδρομή BYTE, συμπεριλαμβανομένου του `POST /v1/responses`). Ισχύει η ίδια διαφυγή υγιούς διαθέσιμου περιθωρίου του [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) όπως και για αιτήματα με βαριά δομή· εξακολουθεί να περιορίζεται από το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), ώστε να μην επανεμφανιστεί το [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Απόλυτο όριο για τις διαδρομές συνομιλίας, το οποίο επιβάλλεται βάσει των byte που διαβάζονται κατά την περιορισμένη εισαγωγή, συμπεριλαμβανομένων αιτημάτων με ελλιπές, μη έγκυρο ή παραπλανητικό `Content-Length`· η υπέρβαση επιστρέφει `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(μη ορισμένο — χωρίς όριο πλήθους αιτημάτων)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** αυτό το παλαιού τύπου όριο ΠΛΗΘΟΥΣ αιτημάτων εφαρμόζεται πλέον μόνο όταν ορίζεται ρητά. Όταν παραμένει μη ορισμένο (η προεπιλογή), η αποδοχή βαρέων αιτημάτων συνομιλίας ελέγχεται αντ’ αυτού από το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — έναν αυτόματα παραγόμενο προϋπολογισμό BYTE, διαστασιολογημένο βάσει του πραγματικού ορίου μνήμης της διεργασίας σε **μία διεργασία** (ένα heap της V8). Δύο επικαλυπτόμενα αιτήματα `/v1/responses` περίπου 750k token προκαλούν τερματισμό heap περίπου 12 Gi (#7849) — πρόκειται για προειδοποίηση σχετικά με τον **προϋπολογισμό μνήμης**, όχι για ένα αυστηρό μέγιστο προϊόντος ίσο με 2. Μια υγιής διεργασία (με το heap κάτω από την αναλογία απόρριψης) ΜΠΟΡΕΙ να αποδεχτεί περισσότερα ταυτόχρονα μακροχρόνια αιτήματα `/v1/responses` μέσω του `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Δεκάδες μακροχρόνιοι πελάτες SSE (40–50) εξαρτώνται από το heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, όχι από «μέγιστο 2». Η τυφλή αύξηση αυτής της τιμής για «χρήση του host» επαναφέρει το #7849. Πολλαπλασιάστε τα **heap** με **N ανεξάρτητα `DATA_DIR`** (#11024)· ποτέ `replicas>1` σε ένα αρχείο SQLite. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(αυτόματα παραγόμενο)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** παράκαμψη του αυτόματα παραγόμενου προϋπολογισμού byte εισόδου (25% του αυστηρότερου ορίου μνήμης V8/cgroup, διαιρεμένο με παροδικό συντελεστή ενίσχυσης 8x). Τόσο οι παραγόμενες όσο και οι ρητές τιμές περιορίζονται μεταξύ 8 MiB–2 GiB. Ένα σώμα μεγαλύτερο από τον πραγματικό προϋπολογισμό αποτυγχάνει αμέσως με `413 body_exceeds_budget`· η διεκδίκηση πόρων μεταξύ σωμάτων που μπορούν να εξυπηρετηθούν μεμονωμένα παραμένει επαναλήψιμη με `503`. Οι 40–50 ταυτόχρονοι μακροχρόνιοι πελάτες SSE εξαρτώνται από αυτόν τον προϋπολογισμό + το heap, όχι από ένα αυστηρό «μέγιστο 2». Ελέγξτε τα `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` στο `/api/monitoring/health` πριν από τη ρύθμιση. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Αναλογία απόρριψης λόγω πίεσης του heap (`heapUsed / heap_size_limit`) για την αποδοχή βαρέων αιτημάτων BYTE και STRUCTURE (#10183, #10268, #10437). Ένα ταυτόχρονο βαρύ αίτημα που υπερβαίνει το `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` απορρίπτεται με το επαναλήψιμο `503` μόνο όταν το heap βρίσκεται ΕΠΙΣΗΣ σε αυτήν την αναλογία ή υψηλότερα· σε ένα υγιές heap γίνεται αποδεκτό μέσω του διαθέσιμου περιθωρίου υγιούς λειτουργίας. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (προεπιλογή `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Οριοθετημένη επιπλέον χωρητικότητα για τη γρήγορη διαδρομή υγιούς heap (#10437), τόσο για STRUCTURE όσο και για BYTE (`admitChatRequest`, συμπεριλαμβανομένων σωμάτων ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Χωρίς αυτό το όριο, κάθε αίτημα σε συνθήκες φόρτου αλλά με υγιές heap παρέκαμπτε την αποδοχή χωρίς ανώτατο όριο. Μόλις ενεργοποιηθούν τόσες ταυτόχρονες δεσμεύσεις μέσω της διαδρομής υγιούς heap, τα επιπλέον αιτήματα υπό φόρτο μεταπίπτουν στην ΙΔΙΑ διαδρομή οριοθετημένης αναμονής/απόρριψης που χρησιμοποιείται υπό πραγματική πίεση του heap. Η τιμή `0` απενεργοποιεί πλήρως την παράκαμψη. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Πλήθος μηνυμάτων που ταξινομεί ένα αίτημα συνομιλίας ως βαρύ, ακόμη και όταν το σώμα του βρίσκεται κάτω από το όριο byte. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Πλήθος εργαλείων που ταξινομεί ένα αίτημα συνομιλίας ως βαρύ, ακόμη και όταν το σώμα του βρίσκεται κάτω από το όριο byte. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Συντηρητική εκτίμηση token βάσει του μεγέθους συμβολοσειρών, η οποία ταξινομεί ένα αίτημα ως βαρύ· πρόκειται για προσεγγιστική τιμή κόστους αποδοχής και όχι για την παραγωγή token που χρησιμοποιεί ο πάροχος για τη χρέωση. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (απενεργοποιημένο) | `src/shared/middleware/chatBodyAdmission.ts` | Προαιρετικό, ρητά ενεργοποιούμενο όριο ιστορικού συνομιλίας. Είναι απενεργοποιημένο από προεπιλογή: το πλήθος μηνυμάτων αποτελεί πολιτική της εκάστοτε εγκατάστασης, όχι καθολική ιδιότητα ενός αιτήματος, και η επιβολή ορίου εδώ απορρίπτει συνομιλίες με οριστικό `413` πριν μπορέσει να τις καταστήσει εξυπηρετήσιμες η αλυσίδα συμπίεσης. Η αύξηση του heap περιορίζεται από το `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` και την απόρριψη λόγω πίεσης του heap. Ορίστε μια θετική τιμή σε εγκαταστάσεις με περιορισμένη μνήμη που χρειάζονται αυστηρό ανώτατο όριο· τα αιτήματα που το υπερβαίνουν λαμβάνουν τότε δομημένη απόκριση `413` που υποδεικνύει ότι απαιτείται συμπίεση. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Αυστηρό όριο για μια μη μεταδιδόμενη σε ροή απόκριση ανάντη, η οποία αποθηκεύεται πλήρως στη μνήμη. Πέρα από αυτό το όριο, η ανάγνωση της ανάντη απόκρισης ακυρώνεται και το αίτημα αποτυγχάνει άμεσα, αντί να αυξάνεται μια απεριόριστη συμβολοσειρά μέχρι να εξαντληθεί το heap. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Μέγιστος αριθμός byte στο δίκτυο που προωθείται από τις κεφαλίδες ανάντη απόκρισης. Όταν γίνεται υπέρβαση του προϋπολογισμού, οι κεφαλίδες χαμηλότερης προτεραιότητας (π.χ. προσαρμοσμένες `x-codex-*`, `x-oai-request-id`) παραλείπονται ώστε να τηρούνται τα συνήθη όρια κεφαλίδων των reverse proxy. Ορίστε υψηλότερη τιμή για να προωθούνται περισσότερα ανάντη μεταδεδομένα, με κόστος το μεγαλύτερο μέγεθος των κεφαλίδων απόκρισης. | -| `CORS_ORIGIN` | _(δεν έχει οριστεί)_ | `src/server/cors/origins.ts` | Παρωχημένη λίστα επιτρεπόμενων προελεύσεων CORS για μία μόνο προέλευση. Προτιμήστε το `CORS_ALLOWED_ORIGINS` για νέες αναπτύξεις. Το CORS προορίζεται μόνο για πελάτες API προγράμματος περιήγησης από διαφορετική προέλευση· οι πιστοποιημένες εγγραφές του πίνακα ελέγχου χρησιμοποιούν αντ’ αυτού αιτήματα ίδιας προέλευσης μαζί με προστασία CSRF που συνδέεται με τη συνεδρία. | -| `CORS_ALLOWED_ORIGINS` | _(δεν έχει οριστεί)_ | `src/server/cors/origins.ts` | Λίστα επιτρεπόμενων προελεύσεων CORS, διαχωρισμένων με κόμματα. Δεν αποστέλλεται χαρακτήρας μπαλαντέρ, εκτός εάν έχει ρυθμιστεί ρητά το `CORS_ALLOW_ALL=true`. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Δικλείδα διαφυγής μόνο για περιβάλλον ανάπτυξης, η οποία επιστρέφει αυτούσια οποιαδήποτε τιμή `Origin` του προγράμματος περιήγησης. Μην την ενεργοποιείτε σε κοινόχρηστες αναπτύξεις ή αναπτύξεις παραγωγής. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Αποκλεισμός κλήσεων προς παρόχους που στοχεύουν ιδιωτικά εύρη IP ή εύρη IP βρόχου επιστροφής/τοπικής σύνδεσης. Απενεργοποιήστε το μόνο σε απομονωμένα περιβάλλοντα δοκιμών. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Επιτρέπει URL παρόχων που παραπέμπουν σε ιδιωτικά/τοπικά δίκτυα (localhost, 192.168.x.x, 10.x.x.x κ.λπ.). **ΑΠΑΙΤΕΙΤΑΙ για αυτοφιλοξενούμενους παρόχους** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Όταν είναι `false`, ο πίνακας ελέγχου απορρίπτει την επικύρωση τοπικών URL. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Επιτρέπει την προσθήκη/επικύρωση παρόχων σε τοπικές/ιδιωτικές διευθύνσεις (127.0.0.1, localhost, LAN, ιδιωτικά εύρη) — με πεδίο εφαρμογής περιορισμένο στη διαδρομή επικύρωσης παρόχου. **Προεπιλογή `true`** (προτεραιότητα στην τοπική χρήση)· ορίστε το σε `false` για να επιβάλετε αυστηρό αποκλεισμό όλων των μη δημόσιων διευθύνσεων. Τα τελικά σημεία μεταδεδομένων cloud (169.254.169.254, metadata.google.internal) παραμένουν αποκλεισμένα ανεξαρτήτως ρύθμισης. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Επιτρέπει στις διαδρομές `/v1/audio/*` (μεταγραφές, ομιλία, μεταφράσεις) να χρησιμοποιούν έναν κόμβο παρόχου συμβατό με το OpenAI, ο οποίος φιλοξενείται εκτός του localhost. Είναι απενεργοποιημένο από προεπιλογή — η δρομολόγηση ήχου σε απομακρυσμένο κεντρικό υπολογιστή αλλάζει την ταυτότητα εξόδου και πρέπει να αποτελεί ρητή απόφαση του διαχειριστή. Οι κόμβοι βρόχου επιστροφής/ιδιωτικού δικτύου (localhost, 127.0.0.1, 172.16-31.x) επιτρέπονται πάντα και δεν επηρεάζονται. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Όταν είναι ενεργοποιημένο το OIDC, απενεργοποιεί τη σύνδεση με κωδικό πρόσβασης, ώστε οι χρήστες να μπορούν να πιστοποιούνται μόνο μέσω της καθολικής σύνδεσης OIDC. Γίνεται επίσης αποδεκτό το απλό ψευδώνυμο `OIDC_DISABLE_PASSWORD_LOGIN`· η σημαία δυνατότητας του πίνακα ελέγχου με το ίδιο κλειδί έχει προτεραιότητα. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Απλό ψευδώνυμο του `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Τιμή salt που συνδυάζεται με αναγνωριστικά υλικού για τη δημιουργία αποτυπώματος του μηχανήματος. Αλλάξτε την ανά εγκατάσταση για λόγους απομόνωσης. | +| `OMNIROUTE_CLI_SALT` | _(μη ορισμένο = τυχαίο salt ανά εγκατάσταση, αποθηκευμένο μόνιμα στο `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Τιμή salt HMAC για την παραγωγή του τοπικού διακριτικού ελέγχου ταυτότητας CLI. Ο ορισμός αυτής της τιμής ανανεώνει όλα τα διακριτικά CLI στο μηχάνημα και έχει πάντα προτεραιότητα έναντι του αποθηκευμένου salt. Δείτε το `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Ορίζει τη σημαία `Secure` στα cookies συνεδρίας. **Πρέπει να είναι `true`** όταν εκτελείται πίσω από HTTPS. | +| `REQUIRE_API_KEY` | `false` | Ενδιάμεσο λογισμικό API | Όταν είναι `true`, όλα τα αιτήματα διαμεσολάβησης `/v1/*` πρέπει να περιλαμβάνουν έγκυρο κλειδί API. **Αυτή η σημαία δεν περιορίζει το `GET /v1/models`**, το οποίο ακολουθεί τη ρύθμιση σύνδεσης του πίνακα ελέγχου (`requireAuthForModels`) — επομένως, μια απόκριση `401` από το `/v1/models` ΔΕΝ σημαίνει ότι η εξαγωγή συμπερασμάτων προστατεύεται. Δείτε το `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Επιτρέπει την αποκάλυψη των πλήρων τιμών των κλειδιών API στο περιβάλλον χρήστη του Πίνακα ελέγχου. Μπορεί να ρυθμιστεί από τις Σημαίες δυνατοτήτων του Πίνακα ελέγχου· αποτελεί κίνδυνο ασφαλείας σε κοινόχρηστες εγκαταστάσεις. | +| `NO_LOG_API_KEY_IDS` | _(κενό)_ | `src/lib/compliance/index.ts` | Αναγνωριστικά κλειδιών API διαχωρισμένα με κόμματα, για τα οποία παρακάμπτεται η καταγραφή αιτημάτων (συμμόρφωση με τον GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(μη ορισμένο = απεριόριστο)_ | `src/shared/utils/apiKeyPolicy.ts` | Εφεδρικό ημερήσιο όριο αιτημάτων που εφαρμόζεται σε κλειδιά API των οποίων η στήλη `rate_limits` είναι null. Μη ορισμένη ή κενή τιμή: κανένα έμμεσο όριο (#2289, #11017). Το `0` έχει την ίδια σημασία (απεριόριστο). Ένας θετικός ακέραιος N ενεργοποιεί N/ημέρα, 5N/εβδομάδα, 20N/μήνα. Οι μη έγκυρες μη κενές τιμές χρησιμοποιούν ως εφεδρεία τα παλαιά χρονικά παράθυρα των 1000/ημέρα, 5000/εβδομάδα και 20000/μήνα. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Μέγιστο επιτρεπόμενο μέγεθος σώματος αιτήματος. Απορρίπτει ωφέλιμα φορτία που υπερβαίνουν αυτό το όριο. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Τα πραγματικά σώματα αιτημάτων που έχουν μέγεθος ίσο ή μεγαλύτερο από αυτό το όριο αποκτούν την ατομική, τοπική στη διεργασία άδεια εισαγωγής βαρέος φόρτου πριν από την ανάλυση JSON (διαδρομή BYTE, συμπεριλαμβανομένου του `POST /v1/responses`). Ισχύει η ίδια δυνατότητα διαφυγής όταν υπάρχει επαρκές διαθέσιμο περιθώριο του [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) όπως και για αιτήματα με βαριά δομή· εξακολουθεί να περιορίζεται από το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), ώστε να μην επανεμφανιστεί το [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Ανώτατο όριο για διαδρομές συνομιλίας, το οποίο επιβάλλεται στα byte που διαβάζονται κατά την οριοθετημένη εισαγωγή, συμπεριλαμβανομένων αιτημάτων με ελλιπές, μη έγκυρο ή αναληθές `Content-Length`· η υπέρβαση λαμβάνει `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(δεν έχει οριστεί — χωρίς όριο πλήθους αιτημάτων)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** αυτό το παλαιό όριο ΠΛΗΘΟΥΣ αιτημάτων ισχύει πλέον μόνο όταν ορίζεται ρητά. Όταν δεν έχει οριστεί (η προεπιλογή), η αποδοχή βαρέων αιτημάτων συνομιλίας ελέγχεται αντ' αυτού από το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — έναν αυτόματα παραγόμενο προϋπολογισμό BYTE, διαστασιολογημένο βάσει του πραγματικού ορίου μνήμης της διεργασίας σε **μία διεργασία** (ένας σωρός V8). Δύο επικαλυπτόμενα `/v1/responses` περίπου 750k token καταρρίπτουν σωρούς περίπου 12 GiB (#7849) — προειδοποίηση για τον **προϋπολογισμό μνήμης**, όχι αυστηρό μέγιστο προϊόντος ίσο με 2. Μια υγιής διεργασία (σωρός κάτω από την αναλογία απόρριψης) ΕΝΔΕΧΕΤΑΙ να αποδεχτεί περισσότερα ταυτόχρονα μεγάλα `/v1/responses` μέσω του `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Δεκάδες μακρόβιοι πελάτες SSE (40–50) εξαρτώνται από τον σωρό + το `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, όχι από «μέγιστο 2». Η τυφλή αύξηση αυτής της τιμής για «χρήση του host» επαναφέρει το #7849. Πολλαπλασιάστε τους **σωρούς** με **N ανεξάρτητα `DATA_DIR`** (#11024)· ποτέ `replicas>1` σε ένα αρχείο SQLite. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(αυτόματα παραγόμενο)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** παράκαμψη του αυτόματα παραγόμενου προϋπολογισμού byte εισαγωγής (25% του αυστηρότερου ορίου μνήμης V8/cgroup, διαιρεμένο με την παροδική ενίσχυση 8x). Τόσο οι παραγόμενες όσο και οι ρητές τιμές περιορίζονται στο εύρος 8 MiB–2 GiB. Ένα σώμα μεγαλύτερο από τον ισχύοντα προϋπολογισμό αποτυγχάνει αμέσως με `413 body_exceeds_budget`· ο ανταγωνισμός μεταξύ σωμάτων που μπορούν να εξυπηρετηθούν μεμονωμένα παραμένει επαναλήψιμος με `503`. Οι 40–50 ταυτόχρονοι μακρόβιοι πελάτες SSE εξαρτώνται από αυτόν τον προϋπολογισμό + τον σωρό, όχι από αυστηρό «μέγιστο 2». Διαβάστε τα `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` στο `/api/monitoring/health` πριν από τη ρύθμιση. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Αναλογία απόρριψης λόγω πίεσης σωρού (`heapUsed / heap_size_limit`) για την αποδοχή βαρέων αιτημάτων BYTE και STRUCTURE (#10183, #10268, #10437). Ένα ταυτόχρονο βαρύ αίτημα πέρα από το `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` απορρίπτεται με το επαναλήψιμο `503` μόνο όταν ο σωρός βρίσκεται ΕΠΙΣΗΣ σε αυτήν την αναλογία ή υψηλότερα· σε υγιή σωρό γίνεται αποδεκτό μέσω του επιπλέον περιθωρίου υγιούς κατάστασης. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (προεπιλογή `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Οριοθετημένη επιπλέον χωρητικότητα για τη γρήγορη διαδρομή υγιούς σωρού (#10437), τόσο για STRUCTURE όσο και για BYTE (`admitChatRequest`, συμπεριλαμβανομένων σωμάτων ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Χωρίς αυτό το όριο, κάθε αίτημα με απασχολημένο αλλά υγιή σωρό παρέκαμπτε την αποδοχή χωρίς κανένα ανώτατο όριο. Μόλις ενεργοποιηθούν τόσες ταυτόχρονες μισθώσεις μέσω της διαδρομής υγιούς σωρού, τα επόμενα αιτήματα υπό φόρτο μεταπίπτουν στην ΙΔΙΑ διαδρομή οριοθετημένης αναμονής/απόρριψης που χρησιμοποιείται υπό πραγματική πίεση σωρού. Το `0` απενεργοποιεί πλήρως την παράκαμψη. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Πλήθος μηνυμάτων που ταξινομεί ένα αίτημα συνομιλίας ως βαρύ, ακόμη και όταν το σώμα του βρίσκεται κάτω από το όριο byte. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Πλήθος εργαλείων που ταξινομεί ένα αίτημα συνομιλίας ως βαρύ, ακόμη και όταν το σώμα του βρίσκεται κάτω από το όριο byte. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Συντηρητική εκτίμηση token βάσει του μεγέθους συμβολοσειράς, η οποία ταξινομεί ένα αίτημα ως βαρύ· αποτελεί προσέγγιση του κόστους αποδοχής και όχι tokenization χρέωσης του παρόχου. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (απενεργοποιημένο) | `src/shared/middleware/chatBodyAdmission.ts` | Προαιρετικό όριο ιστορικού συνομιλίας με ρητή ενεργοποίηση. Απενεργοποιημένο από προεπιλογή: το πλήθος μηνυμάτων αποτελεί πολιτική ανάπτυξης και όχι καθολική ιδιότητα ενός αιτήματος, ενώ η επιβολή ορίου εδώ απορρίπτει συνομιλίες με οριστικό `413` προτού η διοχέτευση συμπίεσης μπορέσει να τις καταστήσει εξυπηρετήσιμες. Η αύξηση του σωρού περιορίζεται από το `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` και την απόρριψη λόγω πίεσης σωρού. Ορίστε μια θετική τιμή σε αναπτύξεις με περιορισμένη μνήμη που χρειάζονται αυστηρό ανώτατο όριο· τότε η υπέρβαση λαμβάνει δομημένο `413` που απαιτεί συμπίεση. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Ανώτατο όριο για μια απόκριση upstream χωρίς ροή, η οποία αποθηκεύεται προσωρινά εξ ολοκλήρου στη μνήμη. Μετά την υπέρβασή του, ο αναγνώστης upstream ακυρώνεται και το αίτημα αποτυγχάνει άμεσα, αντί να αυξάνεται μια μη οριοθετημένη συμβολοσειρά μέχρι την εξάντληση του σωρού. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Μέγιστος αριθμός byte που προωθούνται μέσω δικτύου από τις κεφαλίδες της απόκρισης ανάντη. Όταν γίνεται υπέρβαση του ορίου, οι κεφαλίδες χαμηλότερης προτεραιότητας (π.χ. προσαρμοσμένες `x-codex-*`, `x-oai-request-id`) απορρίπτονται, ώστε να τηρούνται τα συνήθη όρια κεφαλίδων των reverse proxy. Ορίστε υψηλότερη τιμή για να προωθούνται περισσότερα μεταδεδομένα ανάντη, με κόστος το μεγαλύτερο μέγεθος των κεφαλίδων απόκρισης. | +| `CORS_ORIGIN` | _(δεν έχει οριστεί)_ | `src/server/cors/origins.ts` | Παλαιού τύπου λίστα επιτρεπόμενων προελεύσεων CORS για μία μόνο προέλευση. Προτιμήστε το `CORS_ALLOWED_ORIGINS` για νέες εγκαταστάσεις. Το CORS προορίζεται μόνο για πελάτες API προγράμματος περιήγησης διαφορετικής προέλευσης· οι πιστοποιημένες εγγραφές του πίνακα ελέγχου χρησιμοποιούν αιτήματα ίδιας προέλευσης μαζί με προστασία CSRF δεσμευμένη στη συνεδρία. | +| `CORS_ALLOWED_ORIGINS` | _(δεν έχει οριστεί)_ | `src/server/cors/origins.ts` | Λίστα επιτρεπόμενων προελεύσεων CORS διαχωρισμένων με κόμματα. Δεν αποστέλλεται χαρακτήρας μπαλαντέρ, εκτός εάν έχει ρυθμιστεί ρητά το `CORS_ALLOW_ALL=true`. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Δικλείδα διαφυγής αποκλειστικά για ανάπτυξη, η οποία επιστρέφει οποιαδήποτε τιμή `Origin` του προγράμματος περιήγησης. Μην την ενεργοποιείτε σε κοινόχρηστες εγκαταστάσεις ή εγκαταστάσεις παραγωγής. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Αποκλεισμός κλήσεων προς παρόχους που στοχεύουν ιδιωτικές περιοχές διευθύνσεων IP, περιοχές loopback ή link-local. Απενεργοποιήστε το μόνο σε απομονωμένα περιβάλλοντα δοκιμών. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Επιτρέπει URL παρόχων που παραπέμπουν σε ιδιωτικά/τοπικά δίκτυα (localhost, 192.168.x.x, 10.x.x.x κ.λπ.). **ΑΠΑΙΤΕΙΤΑΙ για αυτοφιλοξενούμενους παρόχους** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Όταν είναι `false`, ο πίνακας ελέγχου απορρίπτει την επικύρωση τοπικών URL. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Επιτρέπει την προσθήκη/επικύρωση παρόχων σε τοπικές/ιδιωτικές διευθύνσεις (127.0.0.1, localhost, LAN, ιδιωτικές περιοχές) — με πεδίο εφαρμογής περιορισμένο στη διαδρομή επικύρωσης παρόχου. **Προεπιλογή `true`** (προτεραιότητα στο τοπικό περιβάλλον)· ορίστε `false` για να επιβάλετε αυστηρό αποκλεισμό που επιτρέπει μόνο δημόσιες διευθύνσεις. Τα τελικά σημεία μεταδεδομένων cloud (169.254.169.254, metadata.google.internal) παραμένουν αποκλεισμένα ανεξαρτήτως ρύθμισης. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Επιτρέπει στις διαδρομές `/v1/audio/*` (μεταγραφές, ομιλία, μεταφράσεις) να χρησιμοποιούν έναν κόμβο παρόχου συμβατό με OpenAI, ο οποίος φιλοξενείται εκτός localhost. Είναι απενεργοποιημένο από προεπιλογή — η δρομολόγηση ήχου σε απομακρυσμένο κεντρικό υπολογιστή αλλάζει την ταυτότητα εξερχόμενης κίνησης και πρέπει να αποτελεί ρητή απόφαση του διαχειριστή. Οι κόμβοι loopback/ιδιωτικού δικτύου (localhost, 127.0.0.1, 172.16-31.x) επιτρέπονται πάντα και δεν επηρεάζονται. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Επιτρέπει στο `POST /v1/rerank` (και στο βήμα επανακατάταξης loopback της μηχανής μνήμης) να χρησιμοποιεί έναν κόμβο παρόχου συμβατό με OpenAI, ο οποίος φιλοξενείται εκτός localhost — έναν υπολογιστή LAN ή έναν ομότιμο κόμβο Tailscale που εκτελεί TEI, Infinity, vLLM κ.λπ. Είναι απενεργοποιημένο από προεπιλογή — η δρομολόγηση προς απομακρυσμένο κεντρικό υπολογιστή αλλάζει την ταυτότητα εξερχόμενης κίνησης και πρέπει να αποτελεί ρητή απόφαση του διαχειριστή. Οι κόμβοι loopback (localhost, 127.0.0.1, 172.16-31.x) επιτρέπονται πάντα και δεν επηρεάζονται. Οι απομακρυσμένοι κόμβοι πρέπει επίσης να συμμορφώνονται με την πολιτική εξερχόμενων URL παρόχων (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`)· η κίνηση δεν δρομολογείται ποτέ προς κεντρικούς υπολογιστές μεταδεδομένων cloud. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Όταν είναι ενεργοποιημένο το OIDC, απενεργοποιεί τη σύνδεση με κωδικό πρόσβασης, ώστε οι χρήστες να μπορούν να πιστοποιούνται μόνο μέσω καθολικής σύνδεσης OIDC. Γίνεται επίσης αποδεκτό το απλό ψευδώνυμο `OIDC_DISABLE_PASSWORD_LOGIN`· η σημαία λειτουργίας του πίνακα ελέγχου με το ίδιο κλειδί έχει προτεραιότητα. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Απλό ψευδώνυμο του `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### Λίστα ελέγχου ενίσχυσης ασφάλειας ```bash # Ελάχιστες απαιτήσεις ασφάλειας για παραγωγή: AUTH_COOKIE_SECURE=true # Απαιτεί HTTPS -REQUIRE_API_KEY=true # Πιστοποίηση όλων των κλήσεων διαμεσολάβησης -ALLOW_API_KEY_REVEAL=false # Ποτέ μην εκθέτετε κλειδιά στη διεπαφή χρήστη +REQUIRE_API_KEY=true # Πιστοποίηση όλων των κλήσεων προς τον proxy +ALLOW_API_KEY_REVEAL=false # Να μην εμφανίζονται ποτέ κλειδιά στο περιβάλλον εργασίας χρήστη CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # Όριο 5 MB ``` @@ -303,59 +303,66 @@ MAX_BODY_SIZE_BYTES=5242880 # Όριο 5 MB ## 6. Πολιτικές εργαλείων και δρομολόγησης -| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Ελέγχει την πρόσβαση του LLM σε κλήσεις εργαλείων/συναρτήσεων. `allowlist` = μόνο τα εργαλεία που περιλαμβάνονται στη λίστα, `denylist` = όλα εκτός από όσα περιλαμβάνονται στη λίστα, `disabled` = χωρίς περιορισμούς. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Διαδρομή προς το αρχείο JSON με τους κανόνες χειρισμού του ωφέλιμου φορτίου (προσαρμογές upstream ανά μοντέλο/πρωτόκολλο). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Χρονικό διάστημα επαναφόρτωσης (ms) για τη δυναμική επαναφόρτωση του αρχείου κανόνων ωφέλιμου φορτίου. Ελάχιστη τιμή `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Προαιρετική ενεργοποίηση: δρομολογεί τα αναγνωριστικά μοντέλων χωρίς πρόθεμα `claude-*` από πελάτες Claude Code μέσω του λογαριασμού OAuth του Claude Code, αντί να απαιτεί πρόθεμα παρόχου. Τα ρητά προθέματα παρόχου εξακολουθούν να υπερισχύουν. Μπορεί επίσης να ρυθμιστεί μέσω διακόπτη στον πίνακα ελέγχου, στη σελίδα του παρόχου Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Όριο ταυτόχρονων αιτημάτων ανά μοντέλο για συνδυασμούς round-robin (#9100). Ο σηματοφόρος συνδυασμών round-robin είχε σταθερό ανώτατο όριο 3 ταυτόχρονων αιτημάτων ανά μοντέλο χωρίς δυνατότητα παράκαμψης, με αποτέλεσμα η κίνηση υψηλότερης ταυτόχρονης εκτέλεσης να εκτελείται σειριακά πίσω από αυτό το όριο. Επικυρώνεται ως `>= 1` και περιορίζεται σε `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Επικίνδυνη προαιρετική ρύθμιση που παραλείπει τον τοπικό έλεγχο του OmniRoute για το παράθυρο συμφραζομένων / τον μέγιστο αριθμό διακριτικών εισόδου για άμεσα αιτήματα προς ένα μόνο μοντέλο. Οι upstream πάροχοι εξακολουθούν να επιβάλλουν τα πραγματικά τους όρια· η συμπίεση προτροπών και το όριο διακριτικών εξόδου του ίδιου του μοντέλου παραμένουν ενεργά. Η σειρά προτεραιότητας είναι: παράκαμψη στη βάση δεδομένων των Feature Flags > μεταβλητή περιβάλλοντος > προεπιλογή· δεν απαιτείται επανεκκίνηση. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(δεν έχει οριστεί)_ | `open-sse/services/conversationTracker.ts` | Ορίστε την τιμή σε `1` για να διακοπεί η συλλογή ιστορικού συνομιλιών. Η `resolveConversationId()` επιστρέφει ένα μη παρακολουθούμενο αποτέλεσμα προτού διαβάσει τη SQLite ή αναλύσει το ιστορικό μηνυμάτων, ενώ καλύπτονται και τα αναγνωριστικά συνεδρίας που παρέχονται από τον πελάτη. Ο χειρισμός των συνεδριών δρομολόγησης παραμένει αμετάβλητος και οι υπάρχουσες εγγραφές δεν διαγράφονται. Προορίζεται για εγκαταστάσεις που δεν χρησιμοποιούν την προβολή συνομιλιών του πίνακα ελέγχου και θέλουν να σταματήσει η αύξηση του πίνακα εναλλαγών. | +| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | +| ----------------------------------------------------------- | --------------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Ελέγχει την πρόσβαση του LLM σε εργαλεία/κλήσεις συναρτήσεων. `allowlist` = μόνο τα αναφερόμενα εργαλεία, `denylist` = όλα εκτός από τα αναφερόμενα, `disabled` = χωρίς περιορισμούς. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Διαδρομή προς το αρχείο JSON κανόνων χειρισμού ωφέλιμου φορτίου (προσαρμογές ανάντη ανά μοντέλο/πρωτόκολλο). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Διάστημα επαναφόρτωσης (ms) για τη δυναμική επαναφόρτωση του αρχείου κανόνων ωφέλιμου φορτίου. Ελάχιστο `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Προαιρετική ενεργοποίηση: δρομολογεί τα αναγνωριστικά μοντέλων `claude-*` χωρίς πρόθεμα από πελάτες Claude Code μέσω του λογαριασμού OAuth του Claude Code, αντί να απαιτεί πρόθεμα παρόχου. Τα ρητά προθέματα παρόχων εξακολουθούν να υπερισχύουν. Μπορεί επίσης να διαμορφωθεί μέσω διακόπτη στον πίνακα ελέγχου, στη σελίδα του παρόχου Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Ανώτατο όριο ταυτόχρονων λειτουργιών ανά μοντέλο για συνδυασμούς κυκλικής εναλλαγής (#9100). Ο σημαφόρος συνδυασμού κυκλικής εναλλαγής είχε σταθερό ανώτατο όριο 3 ταυτόχρονων αιτημάτων ανά μοντέλο χωρίς δυνατότητα παράκαμψης, με αποτέλεσμα η κίνηση υψηλότερου παραλληλισμού να σειριοποιείται πίσω από αυτό το όριο. Επικυρώνεται ως `>= 1` και περιορίζεται σε `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Επικίνδυνη προαιρετική ρύθμιση που παρακάμπτει τον τοπικό έλεγχο παραθύρου περιβάλλοντος / μέγιστου αριθμού token εισόδου του OmniRoute για άμεσα αιτήματα προς ένα μόνο μοντέλο. Οι ανάντη πάροχοι εξακολουθούν να επιβάλλουν τα πραγματικά τους όρια· η συμπίεση προτροπής και το όριο token εξόδου του ίδιου του μοντέλου παραμένουν ενεργά. Η πραγματική σειρά προτεραιότητας είναι: παράκαμψη στη βάση δεδομένων Feature Flags > μεταβλητή περιβάλλοντος > προεπιλογή· δεν απαιτείται επανεκκίνηση. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(δεν έχει οριστεί)_ | `open-sse/services/selfHostedEntry.ts` | Ενσωματωμένο έγγραφο YAML `providers:` (RIC-738, D4). Όταν ορίζεται (με ή χωρίς μπλοκ `strategy:`), το `/v1/chat/completions` εκτρέπεται προς την αυτοφιλοξενούμενη, ενοποιημένη καταχώριση που είναι συμβατή με το OpenAI, αντί για τη διοχέτευση cloud. Όταν δεν έχει οριστεί (η προεπιλογή), η διαδρομή συνεχίζει απευθείας στην υπάρχουσα διοχέτευση cloud. Δείτε το `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(δεν έχει οριστεί)_ | `open-sse/services/selfHostedEntry.ts` | Διαδρομή προς ένα αρχείο YAML που περιέχει το ίδιο έγγραφο `providers:` με το `OMNIROUTE_SELF_HOSTED_PROVIDERS`, για αναπτύξεις που προτιμούν αρχείο αντί για ενσωματωμένη μεταβλητή περιβάλλοντος. Οποιοδήποτε από τα δύο ενεργοποιεί την αυτοφιλοξενούμενη καταχώριση. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(δεν έχει οριστεί — ανοικτή διαδρομή)_ | `open-sse/services/selfHostedEntry.ts` | Προαιρετικό κοινόχρηστο κλειδί API για την ενοποιημένη αυτοφιλοξενούμενη καταχώριση (σκελετός D5, δεσμευμένος για το σύστημα ορίων ανά κλειδί). Όταν ορίζεται, τα αιτήματα πρέπει να περιλαμβάνουν `Authorization: Bearer `. Όταν δεν έχει οριστεί, η διαδρομή είναι ανοικτή, σύμφωνα με το υπάρχον μοτίβο αυτοφιλοξενούμενου τοπικού παρόχου (ανάπτυξη σε loopback/αξιόπιστο δίκτυο). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(δεν έχει οριστεί)_ | `open-sse/services/routingStrategies.ts` | Ενσωματωμένο έγγραφο YAML `strategy:` για τη ντετερμινιστική μηχανή δρομολόγησης (M2/RIC-740, D3) — μαύρη λίστα/λευκή λίστα, διακόπτης περιόδου αναμονής, προτεραιότητα κόστους, επίγνωση καθυστέρησης, αλυσίδα εναλλακτικών επιλογών. Παρακάμπτει, ανά κλειδί, ένα ενσωματωμένο μπλοκ `strategy:` που είναι ένθετο μέσα στο `OMNIROUTE_SELF_HOSTED_PROVIDERS`. Δείτε το `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(δεν έχει οριστεί)_ | `open-sse/services/routingStrategies.ts` | Διαδρομή προς ένα αρχείο YAML που περιέχει το ίδιο έγγραφο `strategy:` με το `OMNIROUTE_SELF_HOSTED_STRATEGY`, για αναπτύξεις που προτιμούν αρχείο αντί για ενσωματωμένη μεταβλητή περιβάλλοντος. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(δεν έχει οριστεί)_ | `open-sse/services/conversationTracker.ts` | Ορίστε την τιμή σε `1` για να διακοπεί η συλλογή του ιστορικού συνομιλιών. Η `resolveConversationId()` επιστρέφει ένα μη παρακολουθούμενο αποτέλεσμα προτού διαβάσει το SQLite ή αναλύσει το ιστορικό μηνυμάτων, ενώ καλύπτονται επίσης τα αναγνωριστικά συνεδρίας που παρέχονται από τον πελάτη. Ο χειρισμός των συνεδριών δρομολόγησης παραμένει αμετάβλητος και οι υπάρχουσες εγγραφές δεν διαγράφονται. Προορίζεται για αναπτύξεις που δεν χρησιμοποιούν την προβολή συνομιλιών του πίνακα εργαλείων και θέλουν να σταματήσει η αύξηση του πίνακα εναλλαγών. | --- -## 7. Διευθύνσεις URL & Συγχρονισμός στο Cloud - -| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL διακομιστή για να καλούν οι εσωτερικές εργασίες συγχρονισμού το `/api/sync/cloud`. Διατηρήστε το ως URL loopback/container ακόμη και όταν η εφαρμογή διατίθεται δημόσια μέσω proxy. | -| `CLOUD_URL` | _(κενό)_ | `src/lib/cloudSync.ts` | URL τελικού σημείου αναμετάδοσης στο cloud (λειτουργία premium). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Χρονικό όριο HTTP για αιτήματα συγχρονισμού με το cloud. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Ρύθμιση build του Webpack | Προφίλ κατά το build (ορίστε το σε `minimal` για να εξαιρέσετε φυσικά τα προνομιακά modules από το bundle). | -| `OMNIROUTE_STANDALONE_DIR` | _έξοδος standalone του .build/_ | `scripts/build/colocate-standalone.mjs` | Παράκαμψη κατά το build για τον κατάλογο εξόδου standalone που χρησιμοποιείται από το βήμα συντοποθέτησης μετά το build. Δεν αποτελεί ρύθμιση χρόνου εκτέλεσης. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(κενό)_ | `src/lib/cloudSync.ts` | Κοινόχρηστο μυστικό που χρησιμοποιείται για την επαλήθευση της υπογραφής HMAC-SHA256 των αποκρίσεων του Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Ορίστε το σε `true` για να επιτρέψετε στο τελικό σημείο Cloud Sync να αντικαθιστά τα τοπικά διαπιστευτήρια. Η προεπιλογή είναι `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Ορίστε το σε `true` για να απορρίπτεται μια ανυπόγραφη απόκριση Cloud Sync όταν δεν έχει διαμορφωθεί τοπικό μυστικό (#13679). Μια υπογραφή που υπάρχει επαληθεύεται πάντα — και απορρίπτεται πάντα όταν το `OMNIROUTE_CLOUD_SYNC_SECRET` δεν έχει οριστεί — ανεξάρτητα από αυτήν τη σημαία. Η προεπιλογή αλλάζει σε υποχρεωτική επιβολή στην v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Ορίστε το σε `true` για επιστροφή στη συμπεριφορά ενός βήματος «εισαγωγή όλων» της v3.8.5 χωρίς επιβεβαίωση από τον χρήστη. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Πίνακας ελέγχου, συγχρονισμός | Δημόσια προσβάσιμο URL για το redirect_uri του OAuth, τους συνδέσμους του Πίνακα ελέγχου και τα δημόσια URL που δημιουργούνται. Ορίστε το στο σταθερό δημόσιο URL όταν οι επιστροφές κλήσης OAuth ή οι σύνδεσμοι προγράμματος περιήγησης που δημιουργούνται πρέπει να χρησιμοποιούν έναν κανονικό host αντίστροφου proxy. | -| `NEXT_PUBLIC_CLOUD_URL` | _(κενό)_ | Πλευρά προγράμματος-πελάτη | Αντίγραφο του `CLOUD_URL` στην πλευρά του προγράμματος-πελάτη. | -| `NEXT_PUBLIC_APP_URL` | _(δεν έχει οριστεί)_ | `src/shared/services/cloudSyncScheduler.ts` | Παλαιός εναλλακτικός μηχανισμός για το `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(δεν έχει οριστεί)_ | Επίλυση δημόσιας προέλευσης, URL εικόνων | Προέλευση του OmniRoute με την υψηλότερη προτεραιότητα, ορατή από το πρόγραμμα περιήγησης, η οποία χρησιμοποιείται για τη δημιουργία δημόσιων URL και την επικύρωση προέλευσης προγράμματος περιήγησης εκτός του Πίνακα ελέγχου. Ορίστε την όταν το OpenWebUI ή κάποια άλλη υπηρεσία αναμετάδοσης προσπελαύνει το OmniRoute μέσω εσωτερικού URL, αλλά το πρόγραμμα περιήγησης του χρήστη πρέπει να ανακτά τα παραγόμενα πολυμέσα από προέλευση LAN, tunnel ή δημόσια προέλευση. **Μην** συμπεριλάβετε το `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(δεν έχει οριστεί)_ | `open-sse/config/providerPluginManifestUrl.ts` | Απόλυτο URL του manifest plugin παρόχου που γνωστοποιείται στους sidecar clients. Όταν δεν έχει οριστεί, το OmniRoute παράγει το `/api/v1/provider-plugin-manifest` από την προέλευση του αιτήματος ή τα HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Πρωτόκολλο που χρησιμοποιείται κατά την παραγωγή του URL του manifest plugin παρόχου από τα HOST/PORT χωρίς προέλευση αιτήματος. Ορίστε το σε `https` πίσω από δημόσιο proxy που τερματίζει το TLS, όταν δεν έχει οριστεί ρητά το `OMNIROUTE_PROVIDER_MANIFEST_URL`. | -| `OMNIROUTE_TRUST_PROXY` | _(δεν έχει οριστεί)_ | `src/server/origin/publicOrigin.ts` | Προαιρετική λειτουργία εμπιστοσύνης για τις προωθημένες κεφαλίδες δημόσιας προέλευσης. Χωρίς ορισμό = να μην θεωρούνται αξιόπιστα τα `Forwarded` / `X-Forwarded-*` για αποφάσεις ασφαλείας. Το `true` / `loopback` θεωρεί αξιόπιστα τα προωθημένα host/proto μόνο από proxy loopback με αποτύπωση token. Το `private` / `lan` θεωρεί επίσης αξιόπιστα τα ομότιμα proxy ιδιωτικού LAN. Στην παραγωγή, προτιμήστε το ρητό `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(δεν έχει οριστεί)_ | `open-sse/utils/kieTask.ts` | Δημόσιο URL επιστροφής κλήσης για ασύγχρονες εργασίες kie.ai. Παράκαμψη υψηλότερης προτεραιότητας πριν από τα `OMNIROUTE_KIE_CALLBACK_URL` και `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(δεν έχει οριστεί)_ | `open-sse/utils/kieTask.ts` | Εναλλακτική ονομασία του `KIE_CALLBACK_URL`. Χρησιμοποιείται ως εναλλακτική όταν η κύρια μεταβλητή δεν έχει οριστεί. | -| `OMNIROUTE_PUBLIC_URL` | _(δεν έχει οριστεί)_ | `open-sse/utils/kieTask.ts` | Δημόσια προέλευση που χρησιμοποιείται για τη σύνθεση URL ασύγχρονης επιστροφής κλήσης. Εναλλακτική λύση χαμηλότερης προτεραιότητας για επιστροφές κλήσης του kie.ai· χρησιμοποιείται επίσης ως γενικό δημόσιο URL για άλλες υπηρεσίες αναμετάδοσης. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Τελικό σημείο αναζήτησης ορίου CrofAI που χρησιμοποιείται από τη σελίδα Χρήσης. Παρακάμψτε το για υπηρεσίες αναμετάδοσης / δοκιμαστικά fixtures. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Επίσημο τελικό σημείο χρήσης OpenCode Go με έλεγχο ταυτότητας μέσω κλειδιού API, το οποίο χρησιμοποιείται από τη σελίδα Χρήσης. Παρακάμψτε το για υπηρεσίες αναμετάδοσης / δοκιμαστικά fixtures. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Συνθέτει κεφαλίδες ταυτότητας OpenCode CLI (User-Agent, x-opencode-client/project, UUID αιτήματος/συνεδρίας) σε upstream αιτήματα opencode-go/zen που δεν στάλθηκαν από τον client, ώστε το Cloudflare σε έξοδο VPS να τα αποδέχεται (#6210/#5997). Ενεργό από προεπιλογή από το #10571· απενεργοποιήστε το με `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Προεπιλεγμένο User-Agent που χρησιμοποιείται όταν το `OPENCODE_SYNTHESIZE_CLI_HEADERS` είναι ενεργό και δεν έχει οριστεί παράκαμψη `_USER_AGENT` ανά πάροχο. Εφαρμόζεται μόνο σε executors του opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Τιμή για τη συντεθειμένη κεφαλίδα `x-opencode-client` όταν το `OPENCODE_SYNTHESIZE_CLI_HEADERS` είναι ενεργό. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Τιμή για τη συντεθειμένη κεφαλίδα `x-opencode-project` όταν το `OPENCODE_SYNTHESIZE_CLI_HEADERS` είναι ενεργό. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL ρυθμίσεων του Ollama Cloud που χρησιμοποιείται για τη συλλογή δεδομένων ορίου. Παρακάμψτε το για υπηρεσίες αναμετάδοσης / δοκιμαστικά fixtures. | -| `OLLAMA_USAGE_COOKIE` | _(δεν έχει οριστεί)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` του Ollama Cloud που χρησιμοποιείται για τη συλλογή δεδομένων ορίου από τη σελίδα ρυθμίσεων. Ευαίσθητο· προτιμήστε το πεδίο ανά σύνδεση στον Πίνακα ελέγχου όταν έχουν διαμορφωθεί πολλοί λογαριασμοί. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(δεν έχει οριστεί)_ | `open-sse/services/usage.ts` | Εναλλακτική μεταβλητή περιβάλλοντος για το cookie `__Secure-session` του Ollama Cloud. Ευαίσθητη· προτιμήστε το πεδίο ανά σύνδεση στον Πίνακα ελέγχου όταν έχουν διαμορφωθεί πολλοί λογαριασμοί. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(δεν έχει οριστεί)_ | `open-sse/services/usage.ts` | Εναλλακτική μεταβλητή περιβάλλοντος για το cookie `__Secure-session` του Ollama Cloud, η οποία χρησιμοποιείται πριν από τα συντομότερα aliases. Ευαίσθητη· προτιμήστε το πεδίο ανά σύνδεση στον Πίνακα ελέγχου όταν έχουν διαμορφωθεί πολλοί λογαριασμοί. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Τελικό σημείο ορίων χρήσης του CodeWhisperer (AWS Kiro). Παρακάμψτε το για υπηρεσίες αναμετάδοσης / δοκιμαστικά fixtures. | +## 7. URLs & Συγχρονισμός Cloud + +| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL διακομιστή για κλήσεις από εσωτερικές εργασίες συγχρονισμού προς το `/api/sync/cloud`. Διατηρήστε το ως URL loopback/container, ακόμη και όταν η εφαρμογή είναι δημόσια προσβάσιμη μέσω proxy. | +| `CLOUD_URL` | _(κενό)_ | `src/lib/cloudSync.ts` | URL τελικού σημείου αναμετάδοσης cloud (λειτουργία επί πληρωμή). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Χρονικό όριο HTTP για αιτήματα συγχρονισμού cloud. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Ρύθμιση build του Webpack | Προφίλ κατά το build (ορίστε το σε `minimal` για να εξαιρέσετε φυσικά τα προνομιακά modules από το bundle). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ αυτόνομη έξοδος_ | `scripts/build/colocate-standalone.mjs` | Παράκαμψη κατά το build για τον κατάλογο αυτόνομης εξόδου που χρησιμοποιείται από το βήμα συντοποθέτησης μετά το build. Δεν αποτελεί ρύθμιση χρόνου εκτέλεσης. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(κενό)_ | `src/lib/cloudSync.ts` | Κοινόχρηστο μυστικό που χρησιμοποιείται για την επαλήθευση της υπογραφής HMAC-SHA256 των αποκρίσεων του Συγχρονισμού Cloud. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Ορίστε το σε `true` για να επιτρέψετε στο τελικό σημείο Συγχρονισμού Cloud να αντικαθιστά τα τοπικά διαπιστευτήρια. Η προεπιλογή είναι `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Ορίστε το σε `true` για να απορρίπτεται μια ανυπόγραφη απόκριση Συγχρονισμού Cloud όταν δεν έχει διαμορφωθεί τοπικό μυστικό (#13679). Μια υπογραφή που υπάρχει επαληθεύεται πάντα — και απορρίπτεται πάντα όταν το `OMNIROUTE_CLOUD_SYNC_SECRET` δεν έχει οριστεί — ανεξάρτητα από αυτήν τη σημαία. Η προεπιλογή αλλάζει σε υποχρεωτική επιβολή στην v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Ορίστε το σε `true` για επιστροφή στη συμπεριφορά ενός βήματος «εισαγωγή όλων» της v3.8.5 χωρίς επιβεβαίωση από τον χρήστη. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Πίνακας ελέγχου, συγχρονισμός | URL δημόσιας πρόσβασης για το redirect_uri του OAuth, τους συνδέσμους του Πίνακα ελέγχου και τα δημιουργούμενα δημόσια URLs. Ορίστε το στο σταθερό δημόσιο URL όταν οι επανακλήσεις OAuth ή οι δημιουργούμενοι σύνδεσμοι προγράμματος περιήγησης πρέπει να χρησιμοποιούν έναν κανονικό host αντίστροφου proxy. | +| `NEXT_PUBLIC_CLOUD_URL` | _(κενό)_ | Πλευρά προγράμματος-πελάτη | Αντίγραφο του `CLOUD_URL` στην πλευρά του προγράμματος-πελάτη. | +| `NEXT_PUBLIC_APP_URL` | _(δεν έχει οριστεί)_ | `src/shared/services/cloudSyncScheduler.ts` | Παλαιότερη εφεδρική επιλογή για το `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(δεν έχει οριστεί)_ | Επίλυση δημόσιας προέλευσης, URL εικόνων | Προέλευση OmniRoute που είναι ορατή από το πρόγραμμα περιήγησης και έχει την υψηλότερη προτεραιότητα για τη δημιουργία δημόσιων URL και την επικύρωση προέλευσης προγράμματος περιήγησης εκτός του πίνακα ελέγχου. Ορίστε την όταν το OpenWebUI ή κάποιος άλλος αναμεταδότης προσπελαύνει το OmniRoute μέσω εσωτερικού URL, αλλά το πρόγραμμα περιήγησης του χρήστη πρέπει να ανακτά τα παραγόμενα πολυμέσα από προέλευση LAN, σήραγγας ή δημόσια προέλευση. **Μην** συμπεριλάβετε το `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(δεν έχει οριστεί)_ | `open-sse/config/providerPluginManifestUrl.ts` | Απόλυτο URL δηλωτικού προσθήκης παρόχου που γνωστοποιείται στους πελάτες sidecar. Όταν δεν έχει οριστεί, το OmniRoute παράγει το `/api/v1/provider-plugin-manifest` από την προέλευση του αιτήματος ή τα HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Πρωτόκολλο που χρησιμοποιείται κατά την παραγωγή του URL δηλωτικού προσθήκης παρόχου από τα HOST/PORT χωρίς προέλευση αιτήματος. Ορίστε το σε `https` πίσω από δημόσιο διακομιστή μεσολάβησης που τερματίζει TLS, όταν δεν έχει οριστεί ρητά το `OMNIROUTE_PROVIDER_MANIFEST_URL`. | +| `OMNIROUTE_TRUST_PROXY` | _(δεν έχει οριστεί)_ | `src/server/origin/publicOrigin.ts` | Προαιρετική λειτουργία εμπιστοσύνης για τις προωθημένες κεφαλίδες δημόσιας προέλευσης. Χωρίς ορισμό = οι `Forwarded` / `X-Forwarded-*` δεν θεωρούνται έμπιστες για αποφάσεις ασφαλείας. Οι τιμές `true` / `loopback` θεωρούν έμπιστα τον προωθημένο κεντρικό υπολογιστή/πρωτόκολλο μόνο από διακομιστή μεσολάβησης loopback με σφραγίδα διακριτικού. Οι τιμές `private` / `lan` θεωρούν επίσης έμπιστους ομότιμους διακομιστές μεσολάβησης ιδιωτικού LAN. Προτιμήστε ρητό `NEXT_PUBLIC_BASE_URL` στην παραγωγή. | +| `KIE_CALLBACK_URL` | _(δεν έχει οριστεί)_ | `open-sse/utils/kieTask.ts` | Δημόσιο URL επανάκλησης για ασύγχρονες εργασίες kie.ai. Παράκαμψη υψηλότερης προτεραιότητας πριν από τα `OMNIROUTE_KIE_CALLBACK_URL` και `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(δεν έχει οριστεί)_ | `open-sse/utils/kieTask.ts` | Εναλλακτική γραφή του `KIE_CALLBACK_URL`. Χρησιμοποιείται ως εφεδρική επιλογή όταν δεν έχει οριστεί η κύρια μεταβλητή. | +| `OMNIROUTE_PUBLIC_URL` | _(δεν έχει οριστεί)_ | `open-sse/utils/kieTask.ts` | Δημόσια προέλευση που χρησιμοποιείται για τη σύνθεση URL ασύγχρονων επανακλήσεων. Εφεδρική επιλογή χαμηλότερης προτεραιότητας για επανακλήσεις kie.ai· χρησιμοποιείται επίσης ως γενικό δημόσιο URL για άλλους αναμεταδότες. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Τελικό σημείο αναζήτησης ορίου CrofAI που χρησιμοποιείται από τη σελίδα Χρήσης. Παρακάμψτε το για αναμεταδότες / δοκιμαστικά fixtures. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Επίσημο τελικό σημείο χρήσης OpenCode Go με έλεγχο ταυτότητας μέσω κλειδιού API, το οποίο χρησιμοποιείται από τη σελίδα Χρήσης. Παρακάμψτε το για αναμεταδότες / δοκιμαστικά fixtures. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Συνθέτει κεφαλίδες ταυτότητας OpenCode CLI (User-Agent, x-opencode-client/project, UUID αιτήματος/συνεδρίας) σε αιτήματα opencode-go/zen προς ανάντη υπηρεσίες, όταν ο πελάτης δεν τις έστειλε, ώστε το Cloudflare να τα αποδέχεται κατά την έξοδο από VPS (#6210/#5997). Ενεργοποιημένο από προεπιλογή από το #10571· απενεργοποιήστε το με `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Προεπιλεγμένο User-Agent που χρησιμοποιείται όταν το `OPENCODE_SYNTHESIZE_CLI_HEADERS` είναι ενεργοποιημένο και δεν έχει οριστεί παράκαμψη `_USER_AGENT` ανά πάροχο. Εφαρμόζεται μόνο σε εκτελεστές opencode. Σε αίτημα χωρίς κλειδί που φιλτράρεται από την ανάντη υπηρεσία, μια ρυθμισμένη τιμή που δεν περιέχει `opencode/= 1.17>` αντικαθίσταται από αυτήν την προεπιλογή αντί να απορρίπτεται. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Τιμή για τη συντιθέμενη κεφαλίδα `x-opencode-client` όταν το `OPENCODE_SYNTHESIZE_CLI_HEADERS` είναι ενεργοποιημένο. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Τιμή για τη συντεθειμένη κεφαλίδα `x-opencode-project` όταν είναι ενεργό το `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(δεν έχει οριστεί)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Ορίστε το σε `off` για να σταματήσει η προσαρμογή του σώματος των αιτημάτων OpenCode χωρίς κλειδί (σημαία ροής και λίστα εργαλείων). Οι κεφαλίδες εξακολουθούν να εφαρμόζονται. Διαβάζεται ανά αίτημα, επομένως μια αλλαγή τίθεται σε ισχύ αμέσως. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(δεν έχει οριστεί)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Ονόματα εργαλείων διαχωρισμένα με κόμματα, τα οποία δηλώνονται σε ένα αίτημα OpenCode χωρίς κλειδί που δεν περιλαμβάνει κανένα, όταν δεν έχει παρατηρηθεί ακόμη τίποτα για το συγκεκριμένο μοντέλο. Η κενή τιμή χρησιμοποιεί εναλλακτικά ένα μοναδικό σύμβολο κράτησης θέσης, για το οποίο δίνεται εντολή στο μοντέλο να μην το καλέσει. Έως 32 καταχωρίσεις, `[A-Za-z_][A-Za-z0-9_-]{0,63}`· οι μη έγκυρες καταχωρίσεις αγνοούνται. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL ρυθμίσεων του Ollama Cloud που χρησιμοποιείται για την εξαγωγή δεδομένων ορίου χρήσης. Παρακάμψτε το για αναμεταδότες / δοκιμαστικά δεδομένα. | +| `OLLAMA_USAGE_COOKIE` | _(δεν έχει οριστεί)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` του Ollama Cloud που χρησιμοποιείται για την εξαγωγή δεδομένων ορίου χρήσης από τη σελίδα ρυθμίσεων. Ευαίσθητο· όταν έχουν διαμορφωθεί πολλοί λογαριασμοί, προτιμήστε το πεδίο ανά σύνδεση στον Πίνακα ελέγχου. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(δεν έχει οριστεί)_ | `open-sse/services/usage.ts` | Εναλλακτική μεταβλητή περιβάλλοντος για το cookie `__Secure-session` του Ollama Cloud. Ευαίσθητη· όταν έχουν διαμορφωθεί πολλοί λογαριασμοί, προτιμήστε το πεδίο ανά σύνδεση στον Πίνακα ελέγχου. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(δεν έχει οριστεί)_ | `open-sse/services/usage.ts` | Εναλλακτική μεταβλητή περιβάλλοντος για το cookie `__Secure-session` του Ollama Cloud, η οποία χρησιμοποιείται πριν από τα συντομότερα ψευδώνυμα. Ευαίσθητη· όταν έχουν διαμορφωθεί πολλοί λογαριασμοί, προτιμήστε το πεδίο ανά σύνδεση στον Πίνακα ελέγχου. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Τελικό σημείο ορίων χρήσης του CodeWhisperer (AWS Kiro). Παρακάμψτε το για αναμεταδότες / δοκιμαστικά δεδομένα. | > [!IMPORTANT] -> Κατά την ανάπτυξη πίσω από reverse proxy (nginx, Caddy), ορίστε το `NEXT_PUBLIC_BASE_URL` στη σταθερή δημόσια διεύθυνση URL σας (π.χ. `https://omniroute.example.com`) όταν οι επανακλήσεις OAuth ή οι δημιουργούμενοι δημόσιοι σύνδεσμοι πρέπει να χρησιμοποιούν αυτό το όνομα κεντρικού υπολογιστή. Χωρίς αυτήν τη ρύθμιση, οι επανακλήσεις OAuth μπορεί να αποτύχουν επειδή το redirect_uri δεν θα αντιστοιχεί και οι δημιουργούμενοι δημόσιοι σύνδεσμοι μπορεί να παραπέμπουν στην εσωτερική προέλευση του container. +> Κατά την ανάπτυξη πίσω από αντίστροφο διακομιστή μεσολάβησης (nginx, Caddy), ορίστε το `NEXT_PUBLIC_BASE_URL` στη σταθερή δημόσια διεύθυνση URL σας (π.χ. `https://omniroute.example.com`) όταν οι επανακλήσεις OAuth ή οι δημιουργούμενοι δημόσιοι σύνδεσμοι πρέπει να χρησιμοποιούν αυτό το όνομα κεντρικού υπολογιστή. Χωρίς αυτό, οι επανακλήσεις OAuth μπορεί να αποτύχουν επειδή το redirect_uri δεν θα αντιστοιχεί και οι δημιουργούμενοι δημόσιοι σύνδεσμοι μπορεί να παραπέμπουν στην εσωτερική προέλευση του κοντέινερ. > -> Διατηρήστε το `BASE_URL` ως εσωτερική διεύθυνση URL loopback/container για εργασίες μεταξύ διακομιστών. Μην χρησιμοποιείτε ένα `Origin` του browser ή ένα δημόσιο όνομα κεντρικού υπολογιστή για εσωτερικές αυτο-ανακτήσεις που περιλαμβάνουν διαπιστευτήρια. +> Διατηρήστε το `BASE_URL` ως εσωτερική διεύθυνση URL βρόχου επιστροφής/κοντέινερ για εργασίες μεταξύ διακομιστών. Μη χρησιμοποιείτε το `Origin` ενός προγράμματος περιήγησης ή ένα δημόσιο όνομα κεντρικού υπολογιστή για εσωτερικές αυτο-ανακτήσεις που περιλαμβάνουν διαπιστευτήρια. > -> Οι εγγραφές στον πιστοποιημένο πίνακα ελέγχου δεν απαιτούν στατική δημόσια βασική διεύθυνση URL: ο πίνακας ελέγχου αποστέλλει μη ασφαλή αιτήματα ίδιας προέλευσης με ένα διακριτικό CSRF συνδεδεμένο με τη συνεδρία. Το OmniRoute εξακολουθεί να συγκεντρώνει την επικύρωση δημόσιας προέλευσης για ενσωματώσεις browser εκτός του πίνακα ελέγχου: οι ρητές μεταβλητές περιβάλλοντος δημόσιας διεύθυνσης URL θεωρούνται πρώτες αξιόπιστες· οι ανεπεξέργαστες κεφαλίδες `Forwarded` / `X-Forwarded-*` αγνοούνται, εκτός εάν είναι ενεργοποιημένο το `OMNIROUTE_TRUST_PROXY` και ο άμεσος ομότιμος proxy έχει επισημανθεί με διακριτικό ως αξιόπιστος. Μην χρησιμοποιείτε ρυθμίσεις CORS για να διορθώσετε αιτήματα ίδιας προέλευσης του πίνακα ελέγχου· το CORS προορίζεται μόνο για clients browser διαφορετικής προέλευσης. +> Οι πιστοποιημένες εγγραφές του πίνακα ελέγχου δεν απαιτούν στατική δημόσια βασική διεύθυνση URL: ο πίνακας ελέγχου στέλνει μη ασφαλή αιτήματα ίδιας προέλευσης με ένα συνδεδεμένο στη συνεδρία διακριτικό CSRF. Το OmniRoute εξακολουθεί να συγκεντρώνει κεντρικά την επικύρωση δημόσιας προέλευσης για ενσωματώσεις προγράμματος περιήγησης εκτός του πίνακα ελέγχου: οι ρητές μεταβλητές περιβάλλοντος δημόσιας διεύθυνσης URL θεωρούνται πρώτες αξιόπιστες· οι ανεπεξέργαστες κεφαλίδες `Forwarded` / `X-Forwarded-*` αγνοούνται, εκτός εάν το `OMNIROUTE_TRUST_PROXY` είναι ενεργοποιημένο και ο άμεσος ομότιμος διακομιστής μεσολάβησης έχει επισημανθεί ως αξιόπιστος με διακριτικό. Μη χρησιμοποιείτε ρυθμίσεις CORS για να διορθώσετε αιτήματα ίδιας προέλευσης του πίνακα ελέγχου· το CORS προορίζεται μόνο για πελάτες προγράμματος περιήγησης διαφορετικής προέλευσης. --- @@ -588,48 +595,49 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude --- -## 11. Διαπιστευτήρια παρόχου OAuth - -Ενσωματωμένα διαπιστευτήρια για **ανάπτυξη σε localhost**. Για απομακρυσμένες αναπτύξεις, καταχωρίστε τα δικά σας στην κονσόλα προγραμματιστών κάθε παρόχου. - -| Μεταβλητή | Πάροχος | Σημειώσεις | -| --------------------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Δημόσιος πελάτης — δεν απαιτείται μυστικό. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Παράκαμψη του URI ανακατεύθυνσης. Προεπιλογή: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Δημόσιος πελάτης. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Απαιτεί αντίστοιχο `_SECRET`. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Δημόσιος πελάτης. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Απαιτεί αντίστοιχο `_SECRET`. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Δημόσιος πελάτης. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Προαιρετική παράκαμψη για το αναγνωριστικό πελάτη OAuth του GitHub Enterprise Copilot. Όταν δεν έχει οριστεί, χρησιμοποιείται η δημόσια προεπιλογή του `GITHUB_OAUTH_CLIENT_ID`. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Εφεδρικό κλειδί API που χρησιμοποιείται από το `open-sse/executors/devin-cli.ts` όταν δεν υπάρχουν διαθέσιμα διαπιστευτήρια ανά σύνδεση. Προαιρετικό. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Προσαρμοσμένη διαδρομή προς το εκτελέσιμο αρχείο του Devin CLI (`devin`). Επιλύεται από το `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Αναγνωριστικό πελάτη OAuth για το GitLab Duo. Καταχωρίστε μια εφαρμογή στη διεύθυνση `https://gitlab.com/-/profile/applications` με URI ανακατεύθυνσης `/callback` και πεδία πρόσβασης `api, read_user, openid, profile, email`. Εναλλακτικά χρησιμοποιείται το `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Μυστικό πελάτη OAuth για το GitLab Duo. Προαιρετικό — η ροή PKCE δεν απαιτεί μυστικό. Εναλλακτικά χρησιμοποιείται το `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Παράκαμψη του βασικού URL του GitLab (αυτοφιλοξενούμενο GitLab). Η προεπιλογή είναι `https://gitlab.com`. Εναλλακτικά χρησιμοποιείται το `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Εφεδρική επιλογή παλαιού τύπου για το `GITLAB_DUO_BASE_URL`. Χρησιμοποιείται όταν δεν έχει οριστεί η παραλλαγή `_DUO_`. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Εφεδρική επιλογή παλαιού τύπου για το `GITLAB_DUO_OAUTH_CLIENT_ID`, η οποία καταναλώνεται από το `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Εφεδρική επιλογή παλαιού τύπου για το `GITLAB_DUO_OAUTH_CLIENT_SECRET`, η οποία καταναλώνεται από το `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Ορίστε τη για να ενεργοποιήσετε το OAuth του Qoder. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Εφεδρικό άμεσο κλειδί API (παρακάμπτει το OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | Αναγνωριστικό χώρου εργασίας για το Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Ψευδώνυμο για το `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Παράκαμψη του καταλόγου ρυθμίσεων του Qoder CLI (απομονωμένη συνεδρία PAT, αποτρέπει την αντικατάσταση μιας σύνδεσης μέσω προγράμματος περιήγησης). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Διακριτικό `tk` της διεπαφής χρήστη που αποστέλλεται ως `validated` στο `/api/chat`. Απαιτείται όταν το Blackbox επιβάλλει αντιστοίχιση διακριτικών· διαφορετικά, το OmniRoute χρησιμοποιεί εναλλακτικά ένα τυχαίο UUID. Δείτε το ζήτημα #2252. | -| `VISION_BRIDGE_BASE_URL` | Μηχανισμός προστασίας Vision Bridge | Βασικό URL συμβατό με OpenAI για κλήσεις του vision bridge που δεν αφορούν το Anthropic. Από προεπιλογή χρησιμοποιείται η μεταβλητή περιβάλλοντος URL παλαιού τύπου του OpenAI ή το api.openai.com. Κατευθύνετέ το στον αυτοβρόχο `/v1` του OmniRoute ή σε οποιοδήποτε τελικό σημείο συμβατό με OpenAI (Gemini OpenAI-compat, OpenRouter). Ζήτημα #2232. Όταν το URL είναι το ίδιο το `/v1` του OmniRoute, το δευτερεύον αίτημα περιγραφής αποστέλλει `x-omniroute-admission-bypass: internal` και πραγματοποιεί έλεγχο ταυτότητας με το επιλυμένο διαπιστευτήριο αυτοβρόχου (τιμή-δείκτη `sk_omniroute` σε τοπική λειτουργία ή `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), ώστε να λειτουργούν οι αναπτύξεις με `REQUIRE_API_KEY=true`. | -| `VISION_BRIDGE_API_KEY` | Μηχανισμός προστασίας Vision Bridge | Κλειδί API για το παραπάνω URL. Παρακάμπτει τις μεταβλητές περιβάλλοντος OpenAI / Google ανά πάροχο για κλήσεις του vision bridge που δεν αφορούν το Anthropic. Τα μοντέλα Anthropic διατηρούν την αποκλειστική διαδρομή κλειδιού Anthropic. Ζήτημα #2232. | +## 11. Διαπιστευτήρια παρόχων OAuth + +Ενσωματωμένα διαπιστευτήρια για **ανάπτυξη σε localhost**. Για απομακρυσμένες εγκαταστάσεις, καταχωρίστε τα δικά σας στην κονσόλα προγραμματιστών κάθε παρόχου. + +| Μεταβλητή | Πάροχος | Σημειώσεις | +| --------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Δημόσιος πελάτης — δεν απαιτείται μυστικό. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Παράκαμψη του URI ανακατεύθυνσης. Προεπιλογή: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Δημόσιος πελάτης. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Απαιτεί αντίστοιχο `_SECRET`. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Δημόσιος πελάτης. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Απαιτεί αντίστοιχο `_SECRET`. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Δημόσιος πελάτης. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Προαιρετική παράκαμψη του αναγνωριστικού πελάτη OAuth του GitHub Enterprise Copilot. Όταν δεν έχει οριστεί, χρησιμοποιείται η δημόσια προεπιλογή του `GITHUB_OAUTH_CLIENT_ID`. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Προαιρετική παράκαμψη του αναγνωριστικού ενσωμάτωσης πελάτη GitHub Copilot που αποστέλλεται στις κεφαλίδες `Copilot-Integration-Id` και `Editor-Plugin-Version`. Η προεπιλογή είναι `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Εφεδρικό κλειδί API που χρησιμοποιείται από το `open-sse/executors/devin-cli.ts` όταν δεν υπάρχουν διαθέσιμα διαπιστευτήρια ανά σύνδεση. Προαιρετικό. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Προσαρμοσμένη διαδρομή προς το εκτελέσιμο αρχείο του Devin CLI (`devin`). Επιλύεται από το `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Αναγνωριστικό πελάτη OAuth για το GitLab Duo. Καταχωρίστε μια εφαρμογή στη διεύθυνση `https://gitlab.com/-/profile/applications` με URI ανακατεύθυνσης `/callback` και πεδία πρόσβασης `api, read_user, openid, profile, email`. Ως εφεδρική επιλογή χρησιμοποιείται το `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Μυστικό πελάτη OAuth για το GitLab Duo. Προαιρετικό — η ροή PKCE δεν απαιτεί μυστικό. Ως εφεδρική επιλογή χρησιμοποιείται το `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Παράκαμψη του βασικού URL του GitLab (αυτοφιλοξενούμενο GitLab). Η προεπιλογή είναι `https://gitlab.com`. Ως εφεδρική επιλογή χρησιμοποιείται το `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Παλαιού τύπου εφεδρική επιλογή για το `GITLAB_DUO_BASE_URL`. Χρησιμοποιείται όταν δεν έχει οριστεί η παραλλαγή `_DUO_`. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Παλαιότερη εφεδρική επιλογή για το `GITLAB_DUO_OAUTH_CLIENT_ID`, η οποία χρησιμοποιείται από το `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Παλαιότερη εφεδρική επιλογή για το `GITLAB_DUO_OAUTH_CLIENT_SECRET`, η οποία χρησιμοποιείται από το `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Ορίστε το για να ενεργοποιήσετε το OAuth του Qoder. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Εφεδρικό άμεσο κλειδί API (παρακάμπτει το OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | Αναγνωριστικό χώρου εργασίας για το Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Ψευδώνυμο για το `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Παρακάμπτει τον κατάλογο ρυθμίσεων του Qoder CLI (απομονωμένη περίοδος λειτουργίας PAT, αποφεύγοντας την αντικατάσταση μιας σύνδεσης μέσω προγράμματος περιήγησης). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Διακριτικό `tk` του frontend που αποστέλλεται ως `validated` στο `/api/chat`. Απαιτείται όταν το Blackbox επιβάλλει αντιστοίχιση διακριτικών· διαφορετικά, το OmniRoute χρησιμοποιεί ως εφεδρική επιλογή ένα τυχαίο UUID. Δείτε το ζήτημα #2252. | +| `VISION_BRIDGE_BASE_URL` | Προστατευτικός μηχανισμός Vision Bridge | Βασικό URL συμβατό με OpenAI για κλήσεις vision-bridge που δεν αφορούν το Anthropic. Από προεπιλογή χρησιμοποιείται η παλαιότερη μεταβλητή περιβάλλοντος URL του OpenAI ή το api.openai.com. Ρυθμίστε το στον αυτοβρόχο `/v1` του OmniRoute ή σε οποιοδήποτε τελικό σημείο συμβατό με OpenAI (Gemini OpenAI-compat, OpenRouter). Ζήτημα #2232. Όταν το URL είναι το ίδιο το `/v1` του OmniRoute, το δευτερεύον αίτημα περιγραφής αποστέλλει `x-omniroute-admission-bypass: internal` και πραγματοποιεί έλεγχο ταυτότητας με το επιλυμένο διαπιστευτήριο αυτοβρόχου (δείκτης `sk_omniroute` σε τοπική λειτουργία ή `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), ώστε να λειτουργούν οι αναπτύξεις με `REQUIRE_API_KEY=true`. | +| `VISION_BRIDGE_API_KEY` | Προστατευτικός μηχανισμός Vision Bridge | Κλειδί API για το παραπάνω URL. Παρακάμπτει τις μεταβλητές περιβάλλοντος OpenAI / Google ανά πάροχο για κλήσεις vision-bridge που δεν αφορούν το Anthropic. Τα μοντέλα Anthropic διατηρούν τη δική τους αποκλειστική διαδρομή κλειδιού Anthropic. Ζήτημα #2232. | > [!WARNING] > > 1. Μεταβείτε στο [Google Cloud Console → Διαπιστευτήρια](https://console.cloud.google.com/apis/credentials) -> 2. Δημιουργήστε ένα αναγνωριστικό πελάτη OAuth 2.0 (τύπος: «Εφαρμογή ιστού») -> 3. Προσθέστε τη διεύθυνση URL του διακομιστή σας ως εξουσιοδοτημένο URI ανακατεύθυνσης +> 2. Δημιουργήστε ένα αναγνωριστικό πελάτη OAuth 2.0 (τύπος: "Εφαρμογή ιστού") +> 3. Προσθέστε το URL του διακομιστή σας ως εξουσιοδοτημένο URI ανακατεύθυνσης > 4. Αντικαταστήστε τις τιμές των διαπιστευτηρίων στο `.env`. --- @@ -739,133 +747,134 @@ process.env[`${PROVIDER_ID}_USER_AGENT`] ``` REQUEST_TIMEOUT_MS (καθολική παράκαμψη) -├─→ FETCH_TIMEOUT_MS (κλήσεις προς εξωτερικούς παρόχους, προεπιλογή: 600000) -│ ├─→ FETCH_HEADERS_TIMEOUT_MS (κληρονομείται από το FETCH_TIMEOUT_MS) -│ ├─→ FETCH_BODY_TIMEOUT_MS (κληρονομείται από το FETCH_TIMEOUT_MS) -│ ├─→ TLS_CLIENT_TIMEOUT_MS (κληρονομείται από το FETCH_TIMEOUT_MS) +├─→ FETCH_TIMEOUT_MS (κλήσεις προς ανάντη παρόχους, προεπιλογή: 600000) +│ ├─→ FETCH_HEADERS_TIMEOUT_MS (κληρονομεί από το FETCH_TIMEOUT_MS) +│ ├─→ FETCH_BODY_TIMEOUT_MS (κληρονομεί από το FETCH_TIMEOUT_MS) +│ ├─→ TLS_CLIENT_TIMEOUT_MS (κληρονομεί από το FETCH_TIMEOUT_MS) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (ανεξάρτητο, προεπιλογή: 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (ανεξάρτητο, προεπιλογή: 15000) │ ├── FETCH_CONNECT_TIMEOUT_MS (ανεξάρτητο, προεπιλογή: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (ανεξάρτητο, προεπιλογή: 4000) -├─→ STREAM_IDLE_TIMEOUT_MS (κληρονομείται από το REQUEST_TIMEOUT_MS, προεπιλογή: 600000) +├─→ STREAM_IDLE_TIMEOUT_MS (κληρονομεί από το REQUEST_TIMEOUT_MS, προεπιλογή: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (ανεξάρτητο, προεπιλογή: 1260000· η τιμή 0 το απενεργοποιεί) -├─→ STREAM_READINESS_TIMEOUT_MS (κληρονομείται από το REQUEST_TIMEOUT_MS, προεπιλογή: 80000) +├─→ STREAM_READINESS_TIMEOUT_MS (κληρονομεί από το REQUEST_TIMEOUT_MS, προεπιλογή: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (περιορίζει τις προσαρμοστικές επεκτάσεις ετοιμότητας, προεπιλογή: 180000) -└─→ API_BRIDGE_PROXY_TIMEOUT_MS (κληρονομείται από το REQUEST_TIMEOUT_MS, προεπιλογή: 30000) +└─→ API_BRIDGE_PROXY_TIMEOUT_MS (κληρονομεί από το REQUEST_TIMEOUT_MS, προεπιλογή: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (παράγωγο, προεπιλογή: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (προεπιλογή: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (προεπιλογή: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (προεπιλογή: 0 = απενεργοποιημένο) ``` -| Μεταβλητή | Προεπιλογή | Περιγραφή | -| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(δεν έχει οριστεί)_ | Καθολική συντόμευση — παρακάμπτει τις προεπιλογές των `FETCH_TIMEOUT_MS` και `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Συνολικό χρονικό όριο αιτήματος HTTP για κλήσεις προς ανάντη παρόχους. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Μέγιστο διάστημα σιωπής μεταξύ ανεπεξέργαστων ανάντη byte πριν από τη διακοπή. Τα μοντέλα εκτεταμένης συλλογιστικής σπάνια κάνουν παύση >90s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Μέγιστη συνολική διάρκεια ζωής ενεργής ροής SSE· δεν μηδενίζεται ποτέ από ανάντη byte και είναι ανεξάρτητη από το `REQUEST_TIMEOUT_MS`. Προκύπτει από το μεγαλύτερο `timeoutMs` ανά μοντέλο στο μητρώο (1200000, Codex), συν ένα περιθώριο 60000, ώστε ένα μοντέλο που επιτρέπεται να εξαντλήσει ολόκληρο τον προϋπολογισμό του να μη διακόπτεται ποτέ στη μέση της απάντησης. Ορίστε το σε `0` για απενεργοποίηση. | -| `OMNIROUTE_SSE_COMMENTS` | _(απενεργοποιημένο)_ | Καθορίζει αν το OmniRoute μπορεί να εκπέμπει γραμμές σχολίων SSE `:` (π.χ. τον παλμό `: keepalive` και τα μεταδεδομένα τέλους `x-omniroute-*`). Είναι απενεργοποιημένο από προεπιλογή (#10524), επειδή οι αυστηροί πελάτες που είναι συμβατοί με το OpenAI εκτελούν JSON.parse σε κάθε γραμμή SSE και καταρρέουν στα σχόλια `:`· οι παλμοί `data:` δεν επηρεάζονται. Ορίστε `on`/`true`/`1`/`yes` για να το ενεργοποιήσετε ξανά. Χρησιμοποιείται από το `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Χρόνος αναμονής για τη λήψη του πρώτου συμβάντος SSE που δεν είναι ping. Κληρονομεί το `REQUEST_TIMEOUT_MS` όταν αυτό έχει οριστεί. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Μέγιστο προσαρμοστικό χρονικό παράθυρο ετοιμότητας πρώτου συμβάντος για μεγάλα αιτήματα ροής, αιτήματα με έντονη χρήση εργαλείων ή αιτήματα υψηλού συλλογισμού. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Διακόπτης άμεσης απενεργοποίησης για την ευρετική μέθοδο `/goal`. Ορίστε `false`/`0`/`off` για να απενεργοποιήσετε πλήρως την ανίχνευση — τα χρονικά όρια ετοιμότητας και η ανάκτηση ροής δεν αυξάνονται ποτέ από το σώμα/τις κεφαλίδες του αιτήματος, περιορίζοντας την ελεγχόμενη από τον πελάτη ενίσχυση των χρονικών ορίων. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Μέγιστο χρονικό παράθυρο ετοιμότητας πρώτου συμβάντος για εκτελέσεις πράκτορα `/goal` που έχουν ανιχνευθεί ή για αιτήματα που έχουν επιβληθεί μέσω `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Ενεργοποιεί αυτόματα την πρώιμη ανάκτηση ροής για εκτελέσεις πράκτορα `/goal` που έχουν ανιχνευθεί. Ορίστε `false`/`0`/`off` για να απενεργοποιήσετε την ειδική συγκατάθεση για στόχους. Αυτό μπορεί μόνο να ΠΡΟΣΘΕΣΕΙ ανάκτηση επιπλέον της προεπιλογής του διαχειριστή — δεν παρακάμπτει ποτέ μια ρητή εξαίρεση μέσω των ρυθμίσεων `STREAM_RECOVERY_ENABLED`/DB. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Αφαιρεί τα μη τυπικά συμβάντα SSE `codex.*` (π.χ. `codex.rate_limits`) που προκαλούν αστοχία με 502 στο `responses.stream()` του OpenAI SDK. ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ από προεπιλογή (#11014). Ορίστε `0`/`false`/`no`/`off` για να τα προωθήσετε. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(δεν έχει οριστεί)_ | Προαιρετική μεταφορά μέσω Codex app-server. Τελικό σημείο WebSocket (`ws://`/`wss://`) ενός τοπικού βοηθητικού `codex app-server`. Όταν οριστεί μαζί με ένα διακριτικό, τα αιτήματα Codex δρομολογούνται μέσω JSON-RPC προς το βοηθητικό αντί για το HTTP Responses API. Μπορεί επίσης να οριστεί ανά σύνδεση μέσω του `providerSpecificData.codexAppServerUrl`. Χρησιμοποιείται από το `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(δεν έχει οριστεί)_ | Ενσωματωμένο διακριτικό δυνατότητας/φορέα που παρουσιάζεται στο app-server. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(δεν έχει οριστεί)_ | Διαδρομή προς ένα αρχείο που περιέχει το διακριτικό δυνατότητας του app-server (από το `codex app-server --ws-token-file`). Χρησιμοποιείται όταν το `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` δεν έχει οριστεί. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Κατάλογος εργασίας στον οποίο εκτελείται ο κύκλος του app-server. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(δεν έχει οριστεί)_ | Πολιτική έγκρισης που διαβιβάζεται στον κύκλο του app-server (π.χ. `never`, `on-request`). Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(δεν έχει οριστεί)_ | Πολιτική απομονωμένου περιβάλλοντος που διαβιβάζεται στον κύκλο του app-server (π.χ. `read-only`, `workspace-write`, `danger-full-access`). Όταν δεν έχει οριστεί, ο εκτελεστής χρησιμοποιεί από προεπιλογή το `workspace-write` (ενισχυμένη ασφάλεια· προηγουμένως `danger-full-access`). Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Εγκρίνει αυτόματα τα αιτήματα έγκρισης του ίδιου του app-server (εκτέλεση εντολών/αρχείων/δικαιωμάτων στον κεντρικό υπολογιστή). Απενεργοποιημένο από προεπιλογή — τα αιτήματα απορρίπτονται αυτόματα· οι κλήσεις εργαλείων του πλαισίου δοκιμών δεν επηρεάζονται (μεταφέρονται μέσω της ξεχωριστής διέλευσης `item/tool/call`). Δέχεται `true`/`1`/`yes`. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Χρόνος αναμονής για τη λήψη των κεφαλίδων απόκρισης. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Μέγιστος χρόνος αναμονής για την έναρξη της απόκρισης (ms) για κάθε απευθείας προσπάθεια χωρίς διακομιστή μεσολάβησης. Σε περίπτωση λήξης χρονικού ορίου, γίνεται μία νέα προσπάθεια σε νέα υποδοχή· ορίστε `0` για να απενεργοποιήσετε το όριο και να διατηρήσετε την προηγούμενη συμπεριφορά. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Χρόνος για τη λήψη ολόκληρου του σώματος της απόκρισης. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Χρονικό όριο δημιουργίας σύνδεσης TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Χρονικό όριο αδράνειας υποδοχής keep-alive. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Χρονικό όριο διακομιστή μεσολάβησης δακτυλικού αποτυπώματος TLS (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Περιορίζει ειδικά τον χρόνο έως το πρώτο byte στο σώμα της μεταφοράς δακτυλικού αποτυπώματος TLS μέσω wreq-js· το `TLS_CLIENT_TIMEOUT_MS` από μόνο του δεν μπορεί να εντοπίσει ένα σώμα που έχει κολλήσει, καθώς ολοκληρώνεται μόλις φτάσουν οι κεφαλίδες (#12656). Σε περίπτωση λήξης χρονικού ορίου, ακυρώνεται ο αναγνώστης wreq και γίνεται μετάπτωση στον δρομολογητή απευθείας σύνδεσης/διακομιστή μεσολάβησης· το `0` απενεργοποιεί τον επόπτη. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Μόνο για τον εκτελεστή OpenCode και μόνο όταν είναι ενεργή η σημαία δυνατότητας `OPENCODE_RESPONSES_STALL_ROTATION` (απενεργοποιημένη από προεπιλογή): περιορίζει την αναμονή για το πρώτο byte του σώματος μιας απόκρισης Responses μέσω ροής μετά τις κεφαλίδες της (#13484). Μια ροή Responses ανοίγει με `response.created`, επομένως η σιωπή πέρα από αυτό το χρονικό διάστημα θεωρείται κόλλημα: ο λογαριασμός τίθεται σε περίοδο αναμονής και το αίτημα μεταφέρεται μία φορά στον επόμενο λογαριασμό· ένα δεύτερο κόλλημα προκαλεί άμεση αποτυχία. Το `0` απενεργοποιεί την προστασία ακόμη και όταν η σημαία είναι ενεργή. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Χρονικό όριο άλματος διακομιστή μεσολάβησης για αιτήματα γέφυρας `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Κατευθύνει τον εκτελεστή ανάκτησης ιστού Firecrawl σε μια αυτοφιλοξενούμενη παρουσία (το κλειδί API είναι προαιρετικό εκτός cloud). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Χρονικό όριο ανά αίτημα για τον εκτελεστή ανάκτησης ιστού Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Συνολικό χρονικό όριο αιτήματος διακομιστή για τη γέφυρα. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Χρόνος για την αποστολή κεφαλίδων απόκρισης μέσω της γέφυρας. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Χρονικό όριο αδράνειας keep-alive της γέφυρας. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Χρονικό όριο ανεπεξέργαστης υποδοχής (0 = απενεργοποιημένο). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Περίοδος χάριτος μετά από SIGTERM/SIGINT πριν από την εξαναγκασμένη έξοδο. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Εφεδρική τιμή που χρησιμοποιείται από το `src/shared/utils/fetchTimeout.ts` όταν δεν έχει οριστεί το `FETCH_TIMEOUT_MS`. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Χρονικό όριο (ms) για τις προκαθορισμένες ρυθμίσεις `validationRead` και `modelsProbe` στο `src/shared/network/safeOutboundFetch.ts`. Αυξήστε το για αργά τελικά σημεία (Cerebras, Cloudflare AI, Groq), ώστε να αποτρέψετε τις συνεχείς εναλλαγές μεταξύ ενεργής κατάστασης/σφάλματος στον πίνακα ελέγχου. Επανέρχεται στα 8000ms για μη έγκυρες (<1000) ή μη αριθμητικές τιμές. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Χρονικό όριο ανάκτησης ειδικά για τον αναμεταδότη στο `open-sse/utils/proxyFetch.ts` (#9158). Ένας αναμεταδότης που έχει κολλήσει πρέπει να αποτύχει πριν από το χρονικό όριο του πελάτη/πράκτορα (~30s), ώστε οι καλούντες να βλέπουν μια αποτυχία ειδική για τον αναμεταδότη αντί για ένα γενικό χρονικό όριο ανάντη. Περιορίζεται στα `29000`, ώστε να ενεργοποιείται πάντα πρώτο. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Κοινή καθυστέρηση πριν από την επανάληψη για τις διαδρομές μίας επανάληψης μέσω απευθείας σύνδεσης/αναμεταδότη/διακομιστή μεσολάβησης στο `open-sse/utils/proxyFetch.ts` (#9158). `0` = άμεση επανάληψη. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Εγγενές χρονικό όριο αιτήματος wreq-js (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Απόλυτη περίοδος χάριτος για την αυστηρή προθεσμία JS, η οποία προστίθεται πάνω από το εγγενές χρονικό όριο. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Εγγενές χρονικό όριο αιτήματος wreq-js (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Απόλυτη περίοδος χάριτος για την αυστηρή προθεσμία JS, η οποία προστίθεται πάνω από το εγγενές χρονικό όριο. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (ανενεργό) | Προσθέτει το "You have built-in web search. Answer questions directly using search results." στο μήνυμα συστήματος του καλούντος (`perplexity-web/protocol.ts`). Ανενεργό από προεπιλογή — το Perplexity πραγματοποιεί αναζητήσεις ούτως ή άλλως και η πρόταση διαρρέει στις απαντήσεις ως μετασχολιασμός για πελάτες προγραμματισμού. Ορίστε `1`/`true`/`yes`/`on` για επαναφορά. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Χρονικό όριο εγγενούς αιτήματος wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Περίοδος χάριτος για την απόλυτη αυστηρή προθεσμία της JS, η οποία προστίθεται στο εγγενές χρονικό όριο. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Χρονικό όριο εγγενούς αιτήματος wreq-js (`notionTlsClient.ts`)· το `notion-web` το αυξάνει ανά αίτημα σε `180000` για δημιουργίες μεγάλης διάρκειας. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Περίοδος χάριτος για την απόλυτη αυστηρή προθεσμία της JS, η οποία προστίθεται στο εγγενές χρονικό όριο. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Κοινόχρηστο σύνολο προγραμμάτων περιήγησης Playwright για συνομιλία με web-cookie που υποστηρίζεται από πρόγραμμα περιήγησης (`browserPool.ts`)· ορίστε `off` για απενεργοποίηση. | -| `OBSCURA_BIN` | `auto-detect` | Διαδρομή προς το εκτελέσιμο `obscura` που χρησιμοποιείται ως κύρια μηχανή από το σύνολο προγραμμάτων περιήγησης και τον εκτελεστή Cloudflare Playground (`open-sse/services/obscura.ts`)· ανιχνεύεται αυτόματα από το PATH του συστήματος όταν δεν έχει οριστεί. | -| `OBSCURA_CDP_ENDPOINT` | _(δεν έχει οριστεί)_ | Χρήση ενός ήδη εκτελούμενου Obscura (`http://host:port`) αντί για εκκίνηση νέου· η διεργασία αυτή δεν ανήκει στη μονάδα (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `τυχαία ελεύθερη θύρα` | Ρητή θύρα για το εκκινούμενο `obscura serve`· επιλέγεται αυτόματα μια ελεύθερη θύρα όταν δεν έχει οριστεί (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Δρομολογεί μια αίτηση συνομιλίας με web-cookie στη διαδρομή που υποστηρίζεται από πρόγραμμα περιήγησης (`browserBackedChat.ts`)· `1` για ενεργοποίηση. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Βασικό URL για τον εκτελεστή Kimi Web (διεθνές Connect-RPC του kimi.ai) (`kimi-web.ts`)· παρακάμψτε το μόνο για τελικά σημεία mirror/proxy. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Πλήρες τελικό σημείο συνομιλίας για τον εκτελεστή Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(εντοπίζεται αυτόματα)_ | Διαδρομή προς ένα εκτελέσιμο αρχείο Chrome/Edge του συστήματος για τη διαδραστική σύνδεση μέσω προγράμματος περιήγησης στο Adobe Firefly (`adobeFireflyBrowserLogin.ts`)· παρακάμπτει την αυτόματη ανίχνευση ανά λειτουργικό σύστημα. | -| `OMNIROUTE_STANDALONE_DIR` | _έξοδος αυτόνομης έκδοσης .build/_ | Παράκαμψη κατά τη μεταγλώττιση για τον κατάλογο εξόδου της αυτόνομης έκδοσης που χρησιμοποιείται από το βήμα συστέγασης μετά τη μεταγλώττιση (`scripts/build/colocate-standalone.mjs`)· αφορά τα εργαλεία μεταγλώττισης και όχι τον χρόνο εκτέλεσης. | - -Οι προσπάθειες σε προορισμούς combo κληρονομούν το επιλυμένο χρονικό όριο της ανάντη αίτησης (`FETCH_TIMEOUT_MS` ή -`REQUEST_TIMEOUT_MS` όταν αυτό παρέχει την προεπιλεγμένη τιμή για τη λήψη). Ορίστε το `targetTimeoutMs` σε ένα combo, -στις προεπιλογές combo ή σε παράκαμψη παρόχου μόνο για να επιταχύνετε την εναλλακτική μετάβαση του combo· οι τιμές πάνω από το -τρέχον χρονικό όριο της ανάντη αίτησης περιορίζονται σε αυτό. - -Το `comboTimeoutMs` είναι ένας ξεχωριστός συνολικός χρονομετρικός προϋπολογισμός για ολόκληρο το combo σε όλους τους προορισμούς εναλλακτικής μετάβασης. -Αφήστε το χωρίς τιμή ή ορίστε το σε `0` για απεριόριστη επανάληψη (εξακολουθεί να ισχύει η διακοπή λόγω εμπλοκής στα 10 λεπτά του -`COMBO_LOOP_SAFETY_TIMEOUT_MS`). Μια θετική τιμή αντικαθιστά αυτόν τον -μηχανισμό ασφαλείας για το combo. Διατηρήστε το `comboTimeoutMs` μεγαλύτερο από το `targetTimeoutMs`, ώστε η εναλλακτική μετάβαση -να εξακολουθεί να έχει χρόνο μετά από έναν αργό πρώτο προορισμό. +| Μεταβλητή | Προεπιλογή | Περιγραφή | +| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(δεν έχει οριστεί)_ | Καθολική συντόμευση — παρακάμπτει τις προεπιλογές τόσο του `FETCH_TIMEOUT_MS` όσο και του `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Συνολικό χρονικό όριο αιτήματος HTTP για κλήσεις προς ανάντη παρόχους. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Μέγιστος χρόνος σιωπής μεταξύ ακατέργαστων ανάντη byte πριν από τη διακοπή. Τα μοντέλα εκτεταμένης συλλογιστικής σπάνια κάνουν παύση >90s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Μέγιστη συνολική διάρκεια ζωής ενεργής ροής SSE· δεν επαναφέρεται ποτέ από ανάντη byte και είναι ανεξάρτητη από το `REQUEST_TIMEOUT_MS`. Προκύπτει από τη μεγαλύτερη ανά μοντέλο τιμή `timeoutMs` στο μητρώο (1200000, Codex), συν ένα περιθώριο 60000, ώστε ένα μοντέλο που επιτρέπεται να εξαντλήσει ολόκληρο το διαθέσιμο χρονικό του όριο να μη διακόπτεται ποτέ στη μέση της απάντησης. Ορίστε το σε `0` για απενεργοποίηση. | +| `OMNIROUTE_SSE_COMMENTS` | _(απενεργοποιημένο)_ | Καθορίζει εάν το OmniRoute μπορεί να εκπέμπει γραμμές σχολίων SSE `:` (π.χ. τον παλμό `: keepalive` και τα μεταδεδομένα τέλους `x-omniroute-*`). Είναι απενεργοποιημένο από προεπιλογή (#10524), επειδή οι αυστηρά συμβατοί με OpenAI πελάτες εφαρμόζουν JSON.parse σε κάθε γραμμή SSE και καταρρέουν στα σχόλια `:`· οι παλμοί `data:` δεν επηρεάζονται. Ορίστε `on`/`true`/`1`/`yes` για εκ νέου ενεργοποίηση. Χρησιμοποιείται από το `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Χρόνος αναμονής για τη λήψη του πρώτου συμβάντος SSE που δεν είναι ping. Κληρονομεί το `REQUEST_TIMEOUT_MS` όταν αυτό έχει οριστεί. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Μέγιστο προσαρμοστικό χρονικό παράθυρο ετοιμότητας πρώτου συμβάντος για μεγάλα αιτήματα ροής, αιτήματα με έντονη χρήση εργαλείων ή αιτήματα υψηλής συλλογιστικής. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Διακόπτης έκτακτης απενεργοποίησης για την ευρετική `/goal`. Ορίστε `false`/`0`/`off` για πλήρη απενεργοποίηση της ανίχνευσης — τα χρονικά όρια ετοιμότητας και η ανάκτηση ροής δεν αυξάνονται ποτέ από το σώμα/τις κεφαλίδες του αιτήματος, περιορίζοντας την ελεγχόμενη από τον πελάτη ενίσχυση των χρονικών ορίων. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Μέγιστο χρονικό παράθυρο ετοιμότητας πρώτου συμβάντος για ανιχνευμένες εκτελέσεις πράκτορα `/goal` ή αιτήματα που επιβάλλονται με `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Ενεργοποιεί αυτόματα την πρώιμη ανάκτηση ροής για ανιχνευμένες εκτελέσεις πράκτορα `/goal`. Ορίστε `false`/`0`/`off` για να απενεργοποιήσετε την ειδική επιλογή συμμετοχής για στόχους. Αυτό μπορεί μόνο να ΠΡΟΣΘΕΣΕΙ ανάκτηση πάνω από την προεπιλογή του διαχειριστή — δεν παρακάμπτει ποτέ ρητή εξαίρεση μέσω των ρυθμίσεων `STREAM_RECOVERY_ENABLED`/DB. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Αφαιρεί τα μη τυπικά συμβάντα SSE `codex.*` (π.χ. `codex.rate_limits`) που προκαλούν αποτυχία του `responses.stream()` του OpenAI SDK με 502. Ενεργοποιημένο από προεπιλογή (#11014). Ορίστε `0`/`false`/`no`/`off` για την προώθησή τους. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(δεν έχει οριστεί)_ | Προαιρετική μεταφορά μέσω του app-server του Codex. Τερματικό σημείο WebSocket (`ws://`/`wss://`) ενός τοπικού βοηθητικού `codex app-server`. Όταν ορίζεται μαζί με διακριτικό, τα αιτήματα Codex δρομολογούνται μέσω JSON-RPC προς το βοηθητικό πρόγραμμα αντί για το HTTP Responses API. Μπορεί επίσης να οριστεί ανά σύνδεση μέσω του `providerSpecificData.codexAppServerUrl`. Χρησιμοποιείται από το `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(δεν έχει οριστεί)_ | Ενσωματωμένο διακριτικό δυνατότητας/bearer που παρουσιάζεται στον app-server. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(δεν έχει οριστεί)_ | Διαδρομή προς αρχείο που περιέχει το διακριτικό δυνατότητας του app-server (από `codex app-server --ws-token-file`). Χρησιμοποιείται όταν το `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` δεν έχει οριστεί. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Κατάλογος εργασίας στον οποίο εκτελείται ο γύρος του app-server. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(δεν έχει οριστεί)_ | Πολιτική έγκρισης που μεταβιβάζεται στον γύρο του app-server (π.χ. `never`, `on-request`). Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(δεν έχει οριστεί)_ | Πολιτική sandbox που μεταβιβάζεται στον γύρο του app-server (π.χ. `read-only`, `workspace-write`, `danger-full-access`). Όταν δεν έχει οριστεί, ο executor χρησιμοποιεί από προεπιλογή το `workspace-write` (ενισχυμένη ασφάλεια· προηγουμένως `danger-full-access`). Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Εγκρίνει αυτόματα τα αιτήματα έγκρισης του ίδιου του app-server (εκτέλεση εντολών/αρχείων/δικαιωμάτων στον κεντρικό υπολογιστή). Απενεργοποιημένο από προεπιλογή — τα αιτήματα απορρίπτονται αυτόματα· οι κλήσεις εργαλείων του harness δεν επηρεάζονται (μεταφέρονται μέσω της ξεχωριστής διέλευσης `item/tool/call`). Δέχεται `true`/`1`/`yes`. Παράκαμψη ανά σύνδεση: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Χρόνος αναμονής για τη λήψη των κεφαλίδων απόκρισης. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Μέγιστος χρόνος αναμονής (ms) για την έναρξη της απόκρισης σε κάθε απευθείας προσπάθεια χωρίς διαμεσολαβητή. Σε περίπτωση λήξης χρονικού ορίου, γίνεται μία επανάληψη σε νέα υποδοχή· ορίστε `0` για να απενεργοποιήσετε το όριο και να διατηρήσετε την προηγούμενη συμπεριφορά. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Ανώτατο όριο (ms) για την προσπάθεια RETRY σε νέα υποδοχή, μετά από λήξη του χρονικού ορίου έναρξης απόκρισης μιας προσπάθειας μέσω συγκεντρωτικής σύνδεσης παραπάνω (#13703). Εφαρμόζεται μόνο όταν ο καλών έχει ήδη επισυνάψει το δικό του σήμα προθεσμίας (την ακολουθία επίλυσης σύνδεσης/μοντέλου/παρόχου/`FETCH_TIMEOUT_MS`)· αυτό το σήμα αποτελεί το πραγματικό όριο και ενεργοποιείται πρώτο στην προβλεπόμενη διαδρομή, επομένως πρόκειται για ένα γενναιόδωρο εφεδρικό όριο και όχι για ένα σταθερό ανώτατο όριο — χωρίς αυτό, η επανάληψη χρησιμοποιούσε ξανά το ίδιο σύντομο χρονικό παράθυρο `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` με την προσπάθεια μέσω συγκεντρωτικής σύνδεσης και προκαλούσε σφάλμα 504 σε υγιή μοντέλα συλλογισμού με αργό TTFB. Δεν επιτρέπεται ποτέ να είναι χαμηλότερο από το παραπάνω σταθερό κατώτατο όριο· όταν ο καλών δεν παρέχει κανένα σήμα προθεσμίας, η επανάληψη διατηρεί αμετάβλητο το σταθερό κατώτατο όριο. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Χρόνος για τη λήψη ολόκληρου του σώματος της απόκρισης. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Χρονικό όριο δημιουργίας σύνδεσης TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Χρονικό όριο αδράνειας υποδοχής keep-alive. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Χρονικό όριο διαμεσολαβητή αποτυπώματος TLS (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Περιορίζει ειδικά τον χρόνο έως το πρώτο byte στο σώμα της μεταφοράς αποτυπώματος TLS του wreq-js· το `TLS_CLIENT_TIMEOUT_MS` από μόνο του δεν μπορεί να εντοπίσει ένα σώμα που έχει κολλήσει, καθώς ολοκληρώνεται μόλις φτάσουν οι κεφαλίδες (#12656). Η λήξη χρονικού ορίου ακυρώνει τον αναγνώστη wreq και πραγματοποιεί εφεδρική μετάβαση στον απευθείας αποστολέα ή στον αποστολέα μέσω διαμεσολαβητή· το `0` απενεργοποιεί τον επόπτη. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Μόνο για τον εκτελεστή OpenCode και μόνο όταν είναι ενεργοποιημένη η σημαία λειτουργίας `OPENCODE_RESPONSES_STALL_ROTATION` (απενεργοποιημένη από προεπιλογή): περιορίζει την αναμονή για το πρώτο byte του σώματος μιας απόκρισης Responses με ροή μετά τις κεφαλίδες της (#13484). Μια ροή Responses ανοίγει με `response.created`, επομένως η σιωπή πέρα από αυτό το χρονικό παράθυρο θεωρείται κόλλημα: ο λογαριασμός τίθεται σε περίοδο αναμονής και το αίτημα μεταβαίνει μία φορά στον επόμενο λογαριασμό· ένα δεύτερο κόλλημα αποτυγχάνει άμεσα. Το `0` απενεργοποιεί την προστασία ακόμη και όταν η σημαία είναι ενεργοποιημένη. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Χρονικό όριο μετάβασης μέσω διαμεσολαβητή για αιτήματα της γέφυρας `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Κατευθύνει τον εκτελεστή ανάκτησης ιστού Firecrawl σε μια αυτοφιλοξενούμενη παρουσία (το κλειδί API είναι προαιρετικό εκτός cloud). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Χρονικό όριο ανά αίτημα για τον εκτελεστή ανάκτησης ιστού Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Συνολικό χρονικό όριο αιτήματος διακομιστή για τη γέφυρα. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Χρόνος για την αποστολή κεφαλίδων απόκρισης μέσω της γέφυρας. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Χρονικό όριο αδράνειας keep-alive της γέφυρας. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Χρονικό όριο ανεπεξέργαστης υποδοχής (0 = απενεργοποιημένο). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Περίοδος χάριτος μετά από SIGTERM/SIGINT πριν από την αναγκαστική έξοδο. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Εφεδρική τιμή που χρησιμοποιείται από το `src/shared/utils/fetchTimeout.ts` όταν δεν έχει οριστεί το `FETCH_TIMEOUT_MS`. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Χρονικό όριο (ms) για τις προκαθορισμένες ρυθμίσεις `validationRead` και `modelsProbe` στο `src/shared/network/safeOutboundFetch.ts`. Αυξήστε το για αργά τελικά σημεία (Cerebras, Cloudflare AI, Groq), ώστε να αποτρέψετε τις συνεχείς εναλλαγές μεταξύ ενεργής κατάστασης και σφάλματος στον πίνακα ελέγχου. Επανέρχεται στα 8000ms για μη έγκυρες (<1000) ή μη αριθμητικές τιμές. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Χρονικό όριο ανάκτησης ειδικά για αναμετάδοση στο `open-sse/utils/proxyFetch.ts` (#9158). Μια αναμετάδοση που έχει κολλήσει πρέπει να αποτυγχάνει πριν από το χρονικό όριο του προγράμματος-πελάτη/πράκτορα (~30s), ώστε οι καλούντες να βλέπουν μια αποτυχία ειδική για την αναμετάδοση αντί για ένα γενικό χρονικό όριο ανάντη. Περιορίζεται σε `29000`, ώστε να ενεργοποιείται πάντα πρώτο. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Κοινή καθυστέρηση πριν από την επανάληψη για τις διαδρομές μίας επανάληψης μέσω απευθείας σύνδεσης/αναμετάδοσης/διαμεσολαβητή στο `open-sse/utils/proxyFetch.ts` (#9158). `0` = άμεση επανάληψη. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Χρονικό όριο εγγενούς αιτήματος wreq-js (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Περίοδος χάριτος για την απόλυτη αυστηρή προθεσμία της JS, η οποία προστίθεται πάνω από το εγγενές χρονικό όριο. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Χρονικό όριο εγγενούς αιτήματος wreq-js (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Περίοδος χάριτος για την απόλυτη αυστηρή προθεσμία της JS, η οποία προστίθεται πάνω από το εγγενές χρονικό όριο. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (ανενεργό) | Προσθέτει το "Έχεις ενσωματωμένη αναζήτηση στον ιστό. Απάντησε στις ερωτήσεις απευθείας χρησιμοποιώντας αποτελέσματα αναζήτησης." στο μήνυμα συστήματος του καλούντος (`perplexity-web/protocol.ts`). Ανενεργό από προεπιλογή — το Perplexity πραγματοποιεί ούτως ή άλλως αναζητήσεις και η πρόταση διαρρέει στις απαντήσεις ως μετασχολιασμός για πελάτες προγραμματισμού. Ορίστε `1`/`true`/`yes`/`on` για επαναφορά. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Χρονικό όριο εγγενούς αιτήματος wreq-js (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Περίοδος χάριτος για την απόλυτη αυστηρή προθεσμία της JS, η οποία προστίθεται πάνω από το εγγενές χρονικό όριο. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Χρονικό όριο εγγενούς αιτήματος wreq-js (`notionTlsClient.ts`)· το `notion-web` το αυξάνει ανά αίτημα σε `180000` για χρονοβόρες δημιουργίες. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Περίοδος χάριτος για την απόλυτη αυστηρή προθεσμία της JS, η οποία προστίθεται πάνω από το εγγενές χρονικό όριο. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Κοινόχρηστη δεξαμενή προγραμμάτων περιήγησης Playwright για συνομιλίες με web-cookie που υποστηρίζονται από πρόγραμμα περιήγησης (`browserPool.ts`)· ορίστε `off` για απενεργοποίηση. | +| `OBSCURA_BIN` | `auto-detect` | Διαδρομή προς το εκτελέσιμο αρχείο `obscura` που χρησιμοποιείται ως κύρια μηχανή από τη δεξαμενή προγραμμάτων περιήγησης και τον εκτελεστή Cloudflare Playground (`open-sse/services/obscura.ts`)· όταν δεν έχει οριστεί, εντοπίζεται αυτόματα από το PATH του συστήματος. | +| `OBSCURA_CDP_ENDPOINT` | _(δεν έχει οριστεί)_ | Σύνδεση σε ένα ήδη εκτελούμενο Obscura (`http://host:port`) αντί για την εκκίνηση ενός νέου· η μονάδα δεν έχει την κυριότητα αυτής της διεργασίας (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `τυχαία ελεύθερη θύρα` | Ρητή θύρα για το `obscura serve` που εκκινείται· όταν δεν έχει οριστεί, επιλέγεται αυτόματα μια ελεύθερη θύρα (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Επιλέγει τη διαδρομή που υποστηρίζεται από πρόγραμμα περιήγησης για ένα αίτημα συνομιλίας με web-cookie (`browserBackedChat.ts`)· `1` για ενεργοποίηση. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Βασικό URL για τον εκτελεστή Kimi Web (διεθνές kimi.ai Connect-RPC) (`kimi-web.ts`)· παρακάμψτε το μόνο για τελικά σημεία mirror/proxy. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Πλήρες τελικό σημείο συνομιλίας για τον εκτελεστή Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(εντοπίζεται αυτόματα)_ | Διαδρομή προς ένα εκτελέσιμο αρχείο Chrome/Edge του συστήματος για τη διαδραστική σύνδεση μέσω προγράμματος περιήγησης στο Adobe Firefly (`adobeFireflyBrowserLogin.ts`)· παρακάμπτει τον αυτόματο εντοπισμό ανά λειτουργικό σύστημα. | +| `OMNIROUTE_STANDALONE_DIR` | _έξοδος standalone στο .build/_ | Παράκαμψη κατά τη μεταγλώττιση για τον κατάλογο εξόδου standalone που χρησιμοποιείται από το βήμα συνεγκατάστασης μετά τη μεταγλώττιση (`scripts/build/colocate-standalone.mjs`)· αφορά τα εργαλεία μεταγλώττισης και όχι τον χρόνο εκτέλεσης. | + +Οι απόπειρες στόχων combo κληρονομούν το επιλυμένο χρονικό όριο αιτήματος της upstream υπηρεσίας (`FETCH_TIMEOUT_MS` ή +`REQUEST_TIMEOUT_MS` όταν αυτό παρέχει την προεπιλογή ανάκτησης). Ορίστε το `targetTimeoutMs` σε ένα combo, +στις προεπιλογές του combo ή στην παράκαμψη του παρόχου μόνο για να επιταχύνετε την εναλλακτική μετάβαση του combo· οι τιμές πάνω από το +τρέχον χρονικό όριο της upstream υπηρεσίας περιορίζονται σε αυτό το όριο. + +Το `comboTimeoutMs` είναι ένας ξεχωριστός συνολικός χρονικός προϋπολογισμός πραγματικού χρόνου για ολόκληρο το combo σε όλους τους στόχους εναλλακτικής μετάβασης. +Αφήστε το χωρίς τιμή ή ορίστε το σε `0` για να διατηρήσετε την επανάληψη χωρίς όριο (ο μηχανισμός διακοπής κολλήματος των 10 λεπτών +`COMBO_LOOP_SAFETY_TIMEOUT_MS` εξακολουθεί να ισχύει). Μια θετική τιμή αντικαθιστά αυτό το +δίχτυ ασφαλείας για το combo. Διατηρήστε το `comboTimeoutMs` μεγαλύτερο από το `targetTimeoutMs`, ώστε να υπάρχει ακόμη χρόνος για εναλλακτική μετάβαση +μετά από έναν αργό πρώτο στόχο. ### Κατώφλια διακόπτη κυκλώματος -Ρύθμιση του διακόπτη κυκλώματος σε επίπεδο παρόχου. Οι προεπιλογές αντικατοπτρίζουν τις κλιμακωμένες τιμές που χρησιμοποιούνται από την έκδοση v3.6 για περισσότερες από 500 συνδέσεις. - -| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | -| ------------------------------------------------------------- | ---------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Όριο διαδοχικών αποτυχιών για παρόχους OAuth πριν ενεργοποιηθεί ο διακόπτης κυκλώματος. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Παράθυρο επαναφοράς (ms) για τον διακόπτη παρόχων OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Όριο διαδοχικών αποτυχιών για παρόχους με κλειδί API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Παράθυρο επαναφοράς (ms) για τον διακόπτη παρόχων με κλειδί API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Όριο διαδοχικών αποτυχιών για τοπικούς παρόχους (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Παράθυρο επαναφοράς (ms) για τον διακόπτη τοπικών παρόχων. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: αριθμός αποτυχιών εντός του παραθύρου πριν ολόκληρος ο πάροχος OAuth εισέλθει σε περίοδο αναμονής. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: κυλιόμενο παράθυρο καταμέτρησης αποτυχιών (ms) για παρόχους OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: περίοδος αναμονής (ms) μόλις συμπληρωθεί το όριο του παρόχου OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Ο πάροχος OAuth εισέρχεται σε κατάσταση DEGRADED σε αυτόν τον αριθμό αποτυχιών. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Μέγιστος πολλαπλασιαστής κλιμάκωσης του resetTimeout για τον πάροχο OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Ο πάροχος OAuth κλιμακώνει την καθυστέρηση μετά από αυτόν τον αριθμό κύκλων ανοίγματος. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: αριθμός αποτυχιών εντός του παραθύρου πριν ολόκληρος ο πάροχος με κλειδί API εισέλθει σε περίοδο αναμονής. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: κυλιόμενο παράθυρο καταμέτρησης αποτυχιών (ms) για παρόχους με κλειδί API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: περίοδος αναμονής (ms) μόλις συμπληρωθεί το όριο του παρόχου με κλειδί API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Ο πάροχος με κλειδί API εισέρχεται σε κατάσταση DEGRADED σε αυτόν τον αριθμό αποτυχιών. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Μέγιστος πολλαπλασιαστής κλιμάκωσης του resetTimeout για τον πάροχο με κλειδί API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Ο πάροχος με κλειδί API κλιμακώνει την καθυστέρηση μετά από αυτόν τον αριθμό κύκλων ανοίγματος. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: αριθμός αποτυχιών πριν ολόκληρος ο τοπικός πάροχος εισέλθει σε περίοδο αναμονής. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: κυλιόμενο παράθυρο καταμέτρησης αποτυχιών (ms) για τοπικούς παρόχους. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Διακόπτης σε επίπεδο παρόχου: περίοδος αναμονής (ms) μόλις συμπληρωθεί το όριο του τοπικού παρόχου. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Βάθος εκθετικής καθυστέρησης στο οποίο ο πάροχος μιας καρφίτσωσης της κρυφής μνήμης περιβάλλοντος θεωρείται μόνιμα μη υγιής και η καρφίτσωσή του καταργείται για εναλλαγή σε εφεδρικό πάροχο. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Παράθυρο αποτροπής ταλαντώσεων (ms) που ανέχεται σύντομες παροδικές περιόδους αναμονής πριν καταργηθεί μια καρφίτσωσης της κρυφής μνήμης περιβάλλοντος. | +Ρύθμιση του διακόπτη κυκλώματος σε επίπεδο παρόχου. Οι προεπιλογές αντικατοπτρίζουν τις κλιμακωμένες τιμές που χρησιμοποιούνται από την v3.6 για 500+ συνδέσεις. + +| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | +| ------------------------------------------------------------- | ---------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Όριο διαδοχικών αποτυχιών για παρόχους OAuth, πριν ενεργοποιηθεί ο διακόπτης κυκλώματος. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Χρονικό παράθυρο επαναφοράς (ms) για τον διακόπτη κυκλώματος παρόχων OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Όριο διαδοχικών αποτυχιών για παρόχους με κλειδί API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Χρονικό παράθυρο επαναφοράς (ms) για τον διακόπτη κυκλώματος παρόχων με κλειδί API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Όριο διαδοχικών αποτυχιών για τοπικούς παρόχους (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Χρονικό παράθυρο επαναφοράς (ms) για τον διακόπτη κυκλώματος τοπικών παρόχων. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: αποτυχίες εντός του χρονικού παραθύρου, πριν ολόκληρος ο πάροχος OAuth εισέλθει σε περίοδο αναμονής. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: κυλιόμενο χρονικό παράθυρο καταμέτρησης αποτυχιών (ms) για παρόχους OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: περίοδος αναμονής (ms) μόλις συμπληρωθεί το όριο του παρόχου OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Ο πάροχος OAuth εισέρχεται σε κατάσταση DEGRADED σε αυτόν τον αριθμό αποτυχιών. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Μέγιστος πολλαπλασιαστής κλιμάκωσης του resetTimeout για παρόχους OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Ο πάροχος OAuth κλιμακώνει την καθυστέρηση μετά από αυτόν τον αριθμό κύκλων ανοίγματος. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: αποτυχίες εντός του χρονικού παραθύρου, πριν ολόκληρος ο πάροχος με κλειδί API εισέλθει σε περίοδο αναμονής. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: κυλιόμενο χρονικό παράθυρο καταμέτρησης αποτυχιών (ms) για παρόχους με κλειδί API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: περίοδος αναμονής (ms) μόλις συμπληρωθεί το όριο του παρόχου με κλειδί API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Ο πάροχος με κλειδί API εισέρχεται σε κατάσταση DEGRADED σε αυτόν τον αριθμό αποτυχιών. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Μέγιστος πολλαπλασιαστής κλιμάκωσης του resetTimeout για παρόχους με κλειδί API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Ο πάροχος με κλειδί API κλιμακώνει την καθυστέρηση μετά από αυτόν τον αριθμό κύκλων ανοίγματος. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: αποτυχίες πριν ολόκληρος ο τοπικός πάροχος εισέλθει σε περίοδο αναμονής. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: κυλιόμενο χρονικό παράθυρο καταμέτρησης αποτυχιών (ms) για τοπικούς παρόχους. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Διακόπτης κυκλώματος σε επίπεδο παρόχου: περίοδος αναμονής (ms) μόλις συμπληρωθεί το όριο του τοπικού παρόχου. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Βάθος εκθετικής καθυστέρησης στο οποίο ο πάροχος μιας καρφίτσωσης της κρυφής μνήμης περιβάλλοντος θεωρείται μόνιμα μη υγιής και η καρφίτσωσή του καταργείται, ώστε να γίνει μετάπτωση σε εναλλακτικό πάροχο. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Χρονικό παράθυρο αποφυγής ταλαντώσεων (ms), το οποίο ανέχεται σύντομες προσωρινές περιόδους αναμονής πριν καταργηθεί μια καρφίτσωσή της κρυφής μνήμης περιβάλλοντος. | ### Σενάρια -| Σενάριο | Ρύθμιση παραμέτρων | -| ------------------------------------------------- | --------------------------------------------------------- | -| **Παραγωγή κώδικα μεγάλης διάρκειας** | `REQUEST_TIMEOUT_MS=900000` (15 λεπτά) | -| **Περιορισμός συνολικής διάρκειας ζωής της ροής** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 λεπτά) | -| **Ταχεία αποτυχία για API παραγωγής** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Μοντέλα εκτεταμένης συλλογιστικής** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 λεπτά μεταξύ τμημάτων) | +| Σενάριο | Διαμόρφωση | +| ------------------------------------------------ | --------------------------------------------------------- | +| **Παραγωγή κώδικα μεγάλης διάρκειας** | `REQUEST_TIMEOUT_MS=900000` (15 λεπτά) | +| **Περιορισμός της συνολικής διάρκειας της ροής** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 λεπτά) | +| **Ταχεία αποτυχία για API παραγωγής** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Μοντέλα εκτεταμένης συλλογιστικής** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 λεπτά μεταξύ τμημάτων) | --- @@ -1112,101 +1121,102 @@ STREAM_HISTORY_MAX=10 --- -## 21. Υγεία διακομιστή μεσολάβησης - -| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | -| ------------------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Χρονικό όριο ελέγχου υγείας για ταχεία αποτυχία. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Χρονικό παράθυρο (ώρες) για τον υπολογισμό της μέσης καθυστέρησης των υποψήφιων proxy στη στρατηγική pool που είναι βελτιστοποιημένη ως προς την καθυστέρηση. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL της cache αποτελεσμάτων ελέγχου υγείας. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL της cache για αποτυχημένες δοκιμές υγείας proxy. Διατηρήστε το μικρότερο από το `PROXY_HEALTH_CACHE_TTL_MS`, ώστε τα παροδικά χρονικά όρια των proxy υπό υψηλή ταυτόχρονη κίνηση να επαναλαμβάνονται γρήγορα, χωρίς να απενεργοποιείται η ταχεία αποτυχία για proxy που είναι πραγματικά εκτός λειτουργίας. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Ορίστε `false` για να απενεργοποιήσετε τον χρονοπρογραμματιστή υγείας proxy στο παρασκήνιο, ο οποίος ελέγχει περιοδικά τους καταχωρισμένους proxy. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Διάστημα σάρωσης του χρονοπρογραμματιστή υγείας στο παρασκήνιο, σε ms (ελάχιστο `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Προορισμός δοκιμής προσβασιμότητας που χρησιμοποιείται από τον χρονοπρογραμματιστή και το endpoint `/api/settings/proxies/auto-test`. Κατευθύνετέ τον σε ένα εσωτερικό/αυτοφιλοξενούμενο URL για να αποφύγετε τη δημόσια προεπιλογή. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Δοκιμές που ξεκινούν ταυτόχρονα ανά παρτίδα, κοινές για τον χρονοπρογραμματιστή και το endpoint `/api/settings/proxies/auto-test`. Στρογγυλοποιείται προς τα κάτω με ελάχιστο το 1 και περιορίζεται στο 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Καθυστέρηση σε ms μεταξύ της εκκίνησης δύο δοκιμών μέσα σε μια παρτίδα. Χωρίς αυτήν, ολόκληρη η παρτίδα ξεκινά την ίδια στιγμή και μια κοινόχρηστη IP εξόδου μπορεί να ενεργοποιήσει τον περιορισμό ρυθμού ενός προορισμού. Ορίστε `0` για να απενεργοποιήσετε την απόσταση μεταξύ των δοκιμών· περιορίζεται στα 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Ορίστε "false" για να σταματήσει η δοκιμή του πραγματικού host του παρόχου που έχει αντιστοιχιστεί σε έναν proxy (`GET /models`, χωρίς κλειδί API) και να χρησιμοποιείται πάντοτε το `PROXY_HEALTH_TEST_URL`. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Όταν είναι `false` (προεπιλογή), οι αυτοματοποιημένες δοκιμές προσβασιμότητας (ο χρονοπρογραμματιστής + το κουμπί "Δοκιμή όλων" του `/api/settings/proxies/auto-test`) είναι **μόνο για ανάγνωση** και δεν τροποποιούν ποτέ την κατάσταση ενός proxy — μόνο ο χειριστής ορίζει αν είναι ενεργός/ανενεργός, ώστε μια ασταθής δοκιμή να μην αφήσει έναν αντιστοιχισμένο proxy αποκομμένο (#6246). Ορίστε `true` για να επαναφέρετε την παλαιότερη συμπεριφορά δοκιμής και ορισμού. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Προαιρετική σημαία δυνατότητας (δείτε [FEATURE_FLAGS.md](./FEATURE_FLAGS.md)· μια παράκαμψη από τη DB του πίνακα ελέγχου υπερισχύει). Η τιμή `true` (ή `1`, `yes`) εμφανίζει την παρατήρηση εξόδου του pool μόνο για ανάγνωση κάτω από ένα pool proxy στον πίνακα ελέγχου (διακριτές IP εξόδου, συνδέσεις και τη συχνότερα εμφανιζόμενη πίσω από μία IP κατά τις τελευταίες 24 ώρες, από το αρχείο καταγραφής proxy). Δεν χρησιμοποιείται ποτέ για δρομολόγηση. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Ορίστε `true` ώστε ο χρονοπρογραμματιστής να αφαιρεί αυτόματα proxy μετά από επανειλημμένες διαδοχικές αποτυχίες. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Αριθμός διαδοχικών αποτυχιών πριν ο χρονοπρογραμματιστής αφαιρέσει αυτόματα έναν proxy (όταν `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Ορίστε `true` ώστε ο χρονοπρογραμματιστής να απενεργοποιεί ήπια (κατάσταση `dead`, χωρίς διαγραφή) έναν proxy μετά από επανειλημμένες διαδοχικές αποτυχίες, αντί να τον αφαιρεί. Μη καταστροφική εναλλακτική του `PROXY_AUTO_REMOVE`: ο proxy εξαιρείται αμέσως από την επίλυση pool/εναλλαγής (το φίλτρο ενεργής κατάστασης που χρησιμοποιείται από την επίλυση pool βάσει εμβέλειας ήδη τον εξαιρεί) και επανενεργοποιείται αυτόματα μόλις αρχίσει να περνά ξανά τις δοκιμές. Χρησιμοποιεί το ίδιο όριο `PROXY_AUTO_REMOVE_AFTER`. Αν και οι δύο σημαίες είναι `true`, υπερισχύει το `PROXY_AUTO_REMOVE`. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Επιτρέπει στις ροές επικύρωσης OAuth και παρόχου να παρακάμπτουν έναν καρφιτσωμένο proxy και να συνδέονται απευθείας όταν αποτυγχάνουν οι προκαταρκτικοί έλεγχοι προσβασιμότητας του proxy. Η σειρά προτεραιότητας είναι: παράκαμψη από τη DB των Feature Flags > μεταβλητή περιβάλλοντος > προεπιλογή. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 δευτ.) | `open-sse/services/rateLimitManager.ts` | Μέγιστος χρόνος αναμονής σε απόκριση 429 πριν αποτύχει το αίτημα. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 λεπτά) | `open-sse/services/rateLimitManager.ts` | Ανώτατο όριο για το χρονικό διάστημα κατά το οποίο ένα αποδεκτό αίτημα μπορεί να παραμείνει σε εκτέλεση πριν λήξει η δέσμευση περιορισμού ρυθμού — αποσυνδεδεμένο από τον προϋπολογισμό αναμονής στην ουρά, ώστε η αργή έναρξη ανάκτησης σε μη επαυξητικές πύλες να μη λήγει λόγω χρονικού ορίου (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (απενεργοποιημένο) | `open-sse/services/rateLimitManager.ts` | Όριο εισαγωγής στην ουρά: απόρριψη με 429 `queue_full` όταν υπάρχουν ήδη στην ουρά τόσα αιτήματα. `0` = χωρίς όριο (προεπιλογή). | -| `RATE_LIMIT_AUTO_ENABLE` | _(δεν έχει οριστεί)_ | `open-sse/services/rateLimitManager.ts` | Επιβάλλει την ενεργοποίηση/απενεργοποίηση του δικτύου ασφαλείας αυτόματης ενεργοποίησης του περιορισμού ρυθμού, ανεξάρτητα από την αποθηκευμένη ρύθμιση του πίνακα ελέγχου. Δέχεται `true`/`1`/`on` για εξαναγκασμένη ενεργοποίηση και `false`/`0`/`off` για εξαναγκασμένη απενεργοποίηση. | -| `PROVIDER_COOLDOWN_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `open-sse/services/providerCooldownTracker.ts` | Προαιρετική καθολική παρακολούθηση cooldown παρόχου/σύνδεσης μεταξύ αιτημάτων. ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ από προεπιλογή (επικαλύπτεται με τα Connection Cooldown / Provider Circuit Breaker). Δέχεται `true`/`1`/`on` για ενεργοποίηση. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Ελάχιστο cooldown (ms) πριν επαναληφθεί η προσπάθεια για έναν αποτυχημένο πάροχο/σύνδεση. Κλιμακώνεται εκθετικά με τις διαδοχικές αποτυχίες. Χρησιμοποιείται μόνο όταν είναι ενεργό το `PROVIDER_COOLDOWN_ENABLED`. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 λεπτά) | `open-sse/services/providerCooldownTracker.ts` | Μέγιστο όριο cooldown (ms) πριν επαναληφθεί οπωσδήποτε η προσπάθεια για έναν αποτυχημένο πάροχο/σύνδεση. Χρησιμοποιείται μόνο όταν είναι ενεργό το `PROVIDER_COOLDOWN_ENABLED`. | -| `STREAM_RECOVERY_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `src/lib/resilience/settings.ts` (αρχική τιμή) → `open-sse/services/streamRecovery.ts` (λογική) | **Τι:** διαφανής ανάκτηση περικομμένων ροών από upstream (θύρα free-claude-code). Διατηρεί το αρχικό παράθυρο SSE για έως `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), ώστε μια διακοπή _πριν από το commit_ —η οποία συμβαίνει πριν φτάσει οποιοδήποτε byte στον client— να ανοίγει ξανά και να επαναλαμβάνεται χωρίς να γίνεται αντιληπτή. **Πότε να ενεργοποιηθεί:** για ασταθή upstream που συχνά περικόπτονται με 0 byte στην αρχή της ροής· αφήστε το ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ αν δεν μπορείτε να ανεχτείτε έως 750 ms πρόσθετου χρόνου μέχρι το πρώτο token σε κάθε ροή. Δέχεται `true`/`1`/`on`. Καθορίζει την αρχική τιμή της αποθηκευμένης ρύθμισης Ανθεκτικότητας· αφού οριστεί, υπερισχύει η ρύθμιση του πίνακα ελέγχου. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `src/lib/resilience/settings.ts` (αρχική τιμή) → `open-sse/services/streamRecovery.ts` (λογική) | **Τι:** συνέχιση στο μέσο της ροής (Φάση 4.4) — μετά από περικοπή _μετά το commit_ (έχουν ήδη φτάσει byte στον client), εκτελεί ξανά το αίτημα με το μερικό κείμενο ως προκαταρκτική συμπλήρωση assistant και συρράπτει το τμήμα που λείπει. Μόνο για ροές απλού κειμένου συμβατές με OpenAI· δεν ενεργοποιείται ποτέ όταν βρίσκεται σε εξέλιξη μια κλήση εργαλείου. **Πότε να ενεργοποιηθεί:** για μεγάλες παραγωγές που διακόπτονται στη μέση της απάντησης και όταν αποδέχεστε το ανακτημένο τέλος να φτάσει ως μία ριπή αντί token προς token. Ανεξάρτητο από το `STREAM_RECOVERY_ENABLED` (διαφορετικό προφίλ κινδύνου). Δέχεται `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Προαιρετικός επόπτης χρήσιμης εξόδου ενεργής ροής. Εντοπίζει ροές που συνεχίζουν να στέλνουν τμήματα, αλλά παραμένουν κάτω από τον διαμορφωμένο ρυθμό εξόδου του assistant· οι παλμοί διατήρησης σύνδεσης, τα συμβάντα χρήσης, τα κενά delta και οι φάσεις εργαλείων/συλλογισμού δεν εκλαμβάνονται εσφαλμένα ως πρόοδος. Ξεχωριστός από τα χρονικά όρια αδράνειας και αυστηρής προθεσμίας. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Περίοδος χάριτος πριν από την αξιολόγηση της διεκπεραιωτικής ικανότητας, με όρια 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Κυλιόμενο παράθυρο χρήσιμης εξόδου, με όρια 1000–600000 ms· απαιτείται ένα πλήρες παράθυρο πριν από τη διακοπή. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Ελάχιστος ρυθμός byte εξόδου UTF-8 του assistant (συντηρητική προσέγγιση για token), με όρια 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Ελάχιστο μη μηδενικό δείγμα χρήσιμης εξόδου που θεωρείται μετρήσιμο, με όρια 1–1000000 byte. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Κλιμακωτό διάστημα (ms) μεταξύ των ελέγχων υγείας token παρόχου κατά την εκκίνηση. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Ελάχιστη τυχαιοποιημένη διακύμανση (ms) που προστίθεται πάνω από το `HEALTHCHECK_STAGGER_MS` μεταξύ των ελέγχων υγείας token παρόχου, για την αποτροπή ριπών (Ζήτημα #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Μέγιστη τυχαιοποιημένη διακύμανση (ms) που προστίθεται πάνω από το `HEALTHCHECK_STAGGER_MS` μεταξύ των ελέγχων υγείας token παρόχου, για την αποτροπή ριπών (Ζήτημα #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Μέγεθος παρτίδας ταυτόχρονων ελέγχων για τη σάρωση ελέγχου υγείας token κατά την εκκίνηση· οι μεγαλύτερες τιμές ελέγχουν περισσότερες συνδέσεις παράλληλα, ενώ οι μικρότερες τιμές μειώνουν το φορτίο αιχμής (Ζήτημα #7875, παλινδρόμηση του #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Αριθμός αυτόματων επαναλήψεων σε αποκρίσεις cooldown που αφορούν συγκεκριμένο μοντέλο, πριν επιστραφεί σφάλμα στον client. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Μέγιστο διάστημα υποχώρησης (δευτερόλεπτα) μεταξύ επαναλήψεων cooldown. Περιορίζεται από αυτήν την τιμή ανεξάρτητα από το upstream `Retry-After`. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL του proxy εξοικονόμησης token Headroom. Ο κύκλος ζωής του πίνακα ελέγχου (`api/headroom/*`) εκκινεί από προεπιλογή ένα τοπικό CLI `headroom-ai` στο loopback· παρακάμψτε το μόνο για να κατευθύνετε σε έναν εξωτερικό sidecar proxy Docker. | +## 21. Υγεία διακομιστών μεσολάβησης + +| Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | +| ------------------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Χρονικό όριο ελέγχου υγείας για γρήγορη αποτυχία. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Χρονικό παράθυρο (σε ώρες) για τον υπολογισμό της μέσης καθυστέρησης των υποψήφιων διακομιστών μεσολάβησης στη στρατηγική ομάδας που είναι βελτιστοποιημένη ως προς την καθυστέρηση. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL της κρυφής μνήμης αποτελεσμάτων ελέγχου υγείας. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL κρυφής μνήμης για αποτυχημένες δοκιμές υγείας διακομιστών μεσολάβησης. Διατηρήστε το μικρότερο από το `PROXY_HEALTH_CACHE_TTL_MS`, ώστε τα παροδικά χρονικά όρια των διακομιστών μεσολάβησης υπό υψηλή ταυτόχρονη χρήση να επαναλαμβάνονται γρήγορα, χωρίς να απενεργοποιείται η γρήγορη αποτυχία για διακομιστές μεσολάβησης που είναι πραγματικά εκτός λειτουργίας. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Ορίστε το σε `false` για να απενεργοποιήσετε τον χρονοπρογραμματιστή υγείας διακομιστών μεσολάβησης στο παρασκήνιο, ο οποίος πραγματοποιεί περιοδικά δοκιμές στους καταχωρισμένους διακομιστές μεσολάβησης. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Χρονικό διάστημα σάρωσης του χρονοπρογραμματιστή υγείας στο παρασκήνιο, σε ms (ελάχιστο `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Στόχος ελέγχου προσβασιμότητας που χρησιμοποιείται από τον χρονοπρογραμματιστή και το endpoint `/api/settings/proxies/auto-test`. Ορίστε το σε ένα εσωτερικό/αυτοφιλοξενούμενο URL για να αποφύγετε την προεπιλεγμένη δημόσια διεύθυνση. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Έλεγχοι που ξεκινούν ταυτόχρονα ανά παρτίδα, από κοινού για τον χρονοπρογραμματιστή και το endpoint `/api/settings/proxies/auto-test`. Η τιμή στρογγυλοποιείται προς τα κάτω με ελάχιστο το 1 και περιορίζεται το πολύ σε 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Καθυστέρηση σε ms μεταξύ της εκκίνησης δύο ελέγχων μέσα σε μια παρτίδα. Χωρίς αυτήν, ολόκληρη η παρτίδα ξεκινά την ίδια στιγμή και μια κοινόχρηστη IP εξόδου μπορεί να ενεργοποιήσει τον περιορισμό ρυθμού του στόχου. Ορίστε την σε `0` για να απενεργοποιήσετε τη χρονική απόσταση· περιορίζεται το πολύ σε 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Ορίστε την σε "false" για να σταματήσει ο έλεγχος του πραγματικού κεντρικού υπολογιστή του παρόχου που έχει εκχωρηθεί σε έναν διακομιστή μεσολάβησης (`GET /models`, χωρίς κλειδί API) και να χρησιμοποιείται πάντα το `PROXY_HEALTH_TEST_URL`. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Όταν είναι `false` (προεπιλογή), οι αυτοματοποιημένοι έλεγχοι προσβασιμότητας (ο χρονοπρογραμματιστής + το κουμπί "Test All" του `/api/settings/proxies/auto-test`) είναι **μόνο για ανάγνωση** και δεν αλλάζουν ποτέ την κατάσταση ενός διακομιστή μεσολάβησης — μόνο ο χειριστής τον ορίζει ως ενεργό/ανενεργό, ώστε ένας ασταθής έλεγχος να μην μπορεί να αφήσει εκτός λειτουργίας έναν εκχωρημένο διακομιστή μεσολάβησης (#6246). Ορίστε την σε `true` για να επαναφέρετε την παλαιότερη συμπεριφορά ελέγχου και ενημέρωσης κατάστασης. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Προαιρετική σημαία λειτουργίας (δείτε το [FEATURE_FLAGS.md](./FEATURE_FLAGS.md)· μια παράκαμψη από τη βάση δεδομένων του πίνακα ελέγχου υπερισχύει). Η τιμή `true` (ή `1`, `yes`) εμφανίζει την παρατήρηση εξόδου της δεξαμενής μόνο για ανάγνωση κάτω από μια δεξαμενή διακομιστών μεσολάβησης στον πίνακα ελέγχου (διακριτές IP εξόδου, συνδέσεις και τις περισσότερες συνδέσεις που παρατηρήθηκαν πίσω από μία IP κατά τις τελευταίες 24 ώρες, από το αρχείο καταγραφής διακομιστών μεσολάβησης). Δεν χρησιμοποιείται ποτέ για δρομολόγηση. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Ορίστε την σε `true` για να επιτρέψετε στον χρονοπρογραμματιστή να αφαιρεί αυτόματα διακομιστές μεσολάβησης έπειτα από επαναλαμβανόμενες διαδοχικές αποτυχίες. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Αριθμός διαδοχικών αποτυχιών προτού ο χρονοπρογραμματιστής αφαιρέσει αυτόματα έναν διακομιστή μεσολάβησης (όταν `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Ορίστε το σε `true` ώστε ο χρονοπρογραμματιστής να απενεργοποιεί ήπια (κατάσταση `dead`, χωρίς ποτέ να διαγράφεται) έναν διακομιστή μεσολάβησης έπειτα από επανειλημμένες διαδοχικές αποτυχίες, αντί να τον καταργεί. Μη καταστροφική εναλλακτική του `PROXY_AUTO_REMOVE`: ο διακομιστής μεσολάβησης εξαιρείται αμέσως από την επίλυση δεξαμενής/εναλλαγής (το φίλτρο κατάστασης ενεργών διακομιστών που χρησιμοποιείται από την επίλυση δεξαμενής εμβέλειας τον εξαιρεί ήδη) και επανενεργοποιείται αυτόματα μόλις αρχίσει να περνά ξανά τους ελέγχους. Χρησιμοποιεί από κοινού το όριο `PROXY_AUTO_REMOVE_AFTER`. Αν και οι δύο σημαίες είναι `true`, υπερισχύει το `PROXY_AUTO_REMOVE`. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Επιτρέπει στις ροές OAuth και επικύρωσης παρόχου να παρακάμπτουν έναν καρφιτσωμένο διακομιστή μεσολάβησης και να συνδέονται απευθείας όταν αποτυγχάνουν οι προκαταρκτικοί έλεγχοι προσβασιμότητας του διακομιστή μεσολάβησης. Η πραγματική σειρά προτεραιότητας είναι: παράκαμψη από τη βάση δεδομένων σημαιών λειτουργιών > μεταβλητή περιβάλλοντος > προεπιλογή. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 δευτ.) | `src/lib/resilience/settings.ts` | Προεπιλεγμένο χρονικό περιθώριο **αναμονής στην ουρά**: το χρονικό διάστημα για το οποίο ένα αίτημα μπορεί να περιμένει μια θέση παρόχου και να παραμένει στην ουρά προτού απορριφθεί, χωρίς να φτάσει ποτέ στην υπηρεσία ανώτερου επιπέδου. Το χρονόμετρο ακυρώνεται μόλις αρχίσει η εκτέλεση της εργασίας — η εκτέλεση περιορίζεται ξεχωριστά από το `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Η μεταβλητή περιβάλλοντος ορίζει μόνο την προεπιλογή: μια αποθηκευμένη ρύθμιση `resilienceSettings.requestQueue.maxWaitMs` και, στη συνέχεια, μια ρύθμιση ανά σύνδεση `rateLimitOverrides.maxWaitMs` υπερισχύουν διαδοχικά αυτής. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 λεπτά) | `open-sse/services/rateLimitManager.ts` | Ανώτατο όριο για το χρονικό διάστημα κατά το οποίο ένα αποδεκτό αίτημα μπορεί να παραμένει σε εκτέλεση προτού λήξει η δέσμευση ορίου ρυθμού του — αποσυνδεδεμένο από το χρονικό περιθώριο αναμονής στην ουρά, ώστε η αργή έναρξη ανάκτησης σε μη επαυξητικές πύλες να μη λήγει λόγω χρονικού ορίου (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (απενεργοποιημένο) | `open-sse/services/rateLimitManager.ts` | Ανώτατο όριο εισαγωγής στην ουρά: απόρριψη με 429 `queue_full` όταν τόσα αιτήματα βρίσκονται ήδη στην ουρά. `0` = χωρίς όριο (προεπιλογή). | +| `RATE_LIMIT_AUTO_ENABLE` | _(μη ορισμένο)_ | `open-sse/services/rateLimitManager.ts` | Επιβάλλει την ενεργοποίηση/απενεργοποίηση του μηχανισμού ασφαλείας αυτόματης ενεργοποίησης του ορίου ρυθμού, ανεξάρτητα από την αποθηκευμένη ρύθμιση του Πίνακα ελέγχου. Δέχεται `true`/`1`/`on` για εξαναγκασμένη ενεργοποίηση και `false`/`0`/`off` για εξαναγκασμένη απενεργοποίηση. | +| `PROVIDER_COOLDOWN_ENABLED` | _(μη ορισμένο → ανενεργό)_ | `open-sse/services/providerCooldownTracker.ts` | Προαιρετική καθολική παρακολούθηση περιόδου αναμονής παρόχου/σύνδεσης μεταξύ αιτημάτων. ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ από προεπιλογή (επικαλύπτεται με την Περίοδο αναμονής σύνδεσης / τον Αυτόματο διακόπτη παρόχου). Δέχεται `true`/`1`/`on` για ενεργοποίηση. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Ελάχιστη περίοδος αναμονής (ms) προτού επιχειρηθεί ξανά ένας πάροχος/μια σύνδεση που απέτυχε. Αυξάνεται εκθετικά με τις διαδοχικές αποτυχίες. Χρησιμοποιείται μόνο όταν είναι ενεργοποιημένο το `PROVIDER_COOLDOWN_ENABLED`. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 λεπτά) | `open-sse/services/providerCooldownTracker.ts` | Μέγιστο όριο περιόδου αναμονής (ms) πριν από την εκ νέου δοκιμή ενός παρόχου/μιας σύνδεσης που απέτυχε, ανεξαρτήτως άλλων συνθηκών. Χρησιμοποιείται μόνο όταν είναι ενεργοποιημένο το `PROVIDER_COOLDOWN_ENABLED`. | +| `STREAM_RECOVERY_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `src/lib/resilience/settings.ts` (αρχική τιμή) → `open-sse/services/streamRecovery.ts` (λογική) | **Τι κάνει:** διαφανής ανάκτηση περικομμένων ροών ανάντη (θύρα του free-claude-code). Διατηρεί το αρχικό παράθυρο SSE για έως `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), ώστε μια διακοπή _πριν από την οριστικοποίηση_ —η οποία συμβαίνει πριν φτάσει οποιοδήποτε byte στον πελάτη— να ανοίγει ξανά και να επαναλαμβάνεται χωρίς να γίνεται αντιληπτή. **Πότε να ενεργοποιείται:** για ασταθείς ανάντη υπηρεσίες/ροές που συχνά περικόπτονται στα 0 byte κατά την έναρξη της ροής· αφήστε το ΑΝΕΝΕΡΓΟ εάν δεν μπορείτε να επιβαρυνθείτε με έως και 750 ms πρόσθετου χρόνου μέχρι το πρώτο token σε κάθε ροή. Δέχεται `true`/`1`/`on`. Αρχικοποιεί την αποθηκευμένη ρύθμιση Ανθεκτικότητας· μόλις οριστεί η ρύθμιση στον Πίνακα ελέγχου, αυτή υπερισχύει. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `src/lib/resilience/settings.ts` (αρχική τιμή) → `open-sse/services/streamRecovery.ts` (λογική) | **Τι κάνει:** συνέχιση στο μέσο της ροής (Φάση 4.4) — μετά από περικοπή _μετά την οριστικοποίηση_ (έχουν ήδη φτάσει byte στον πελάτη), υποβάλλεται νέο αίτημα με το μερικό κείμενο ως προσυμπλήρωση βοηθού και συνενώνεται το επίθημα που λείπει. Μόνο για ροές απλού κειμένου συμβατές με το OpenAI· δεν ενεργοποιείται ποτέ όταν βρίσκεται σε εξέλιξη κλήση εργαλείου. **Πότε να ενεργοποιείται:** για μακροσκελείς δημιουργίες που διακόπτονται στη μέση της απάντησης, εφόσον αποδέχεστε ότι το ανακτημένο τμήμα θα φτάσει ως μία ενιαία ριπή αντί για token προς token. Είναι ανεξάρτητο από το `STREAM_RECOVERY_ENABLED` (διαφορετικό προφίλ κινδύνου). Δέχεται `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(δεν έχει οριστεί → ανενεργό)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Προαιρετικός επόπτης χρήσιμης εξόδου για ενεργές ροές. Εντοπίζει ροές που συνεχίζουν να στέλνουν τμήματα, αλλά παραμένουν κάτω από τον διαμορφωμένο ρυθμό εξόδου του βοηθού· οι παλμοί διατήρησης σύνδεσης, τα συμβάντα χρήσης, οι κενές μεταβολές και οι φάσεις εργαλείων/συλλογισμού δεν εκλαμβάνονται ως πρόοδος. Είναι ξεχωριστός από τα χρονικά όρια αδράνειας και τις απόλυτες προθεσμίες. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Περίοδος χάριτος πριν από την αξιολόγηση της διεκπεραιωτικής ικανότητας, περιορισμένη σε 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Κυλιόμενο παράθυρο χρήσιμης εξόδου, περιορισμένο σε 1000–600000 ms· απαιτείται ένα πλήρες παράθυρο πριν από τη διακοπή. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Ελάχιστος ρυθμός byte εξόδου βοηθού σε UTF-8 (συντηρητική προσέγγιση των token), περιορισμένος σε 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Ελάχιστο μη μηδενικό δείγμα χρήσιμης εξόδου που θεωρείται μετρήσιμο, περιορισμένο σε 1–1000000 byte. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Κλιμακωτό διάστημα (ms) μεταξύ των ελέγχων εύρυθμης λειτουργίας των token παρόχων κατά την εκκίνηση. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Ελάχιστη τυχαιοποιημένη διακύμανση (ms) που προστίθεται επιπλέον του `HEALTHCHECK_STAGGER_MS` μεταξύ των ελέγχων εύρυθμης λειτουργίας των token παρόχων, για την αποτροπή αιφνίδιας μαζικής εκτέλεσης (Ζήτημα #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Μέγιστη τυχαιοποιημένη διακύμανση (ms) που προστίθεται επιπλέον του `HEALTHCHECK_STAGGER_MS` μεταξύ των ελέγχων εύρυθμης λειτουργίας των token παρόχων, για την αποτροπή αιφνίδιας μαζικής εκτέλεσης (Ζήτημα #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Μέγεθος δέσμης ταυτόχρονων ελέγχων για τη σάρωση ελέγχου υγείας των token κατά την εκκίνηση· οι μεγαλύτερες τιμές ελέγχουν περισσότερες συνδέσεις παράλληλα, ενώ οι μικρότερες τιμές μειώνουν τον αιφνίδιο φόρτο (Issue #7875, παλινδρόμηση του #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Αριθμός αυτόματων επαναλήψεων σε αποκρίσεις cooldown που αφορούν συγκεκριμένο μοντέλο, πριν επιστραφεί σφάλμα στον πελάτη. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Μέγιστο διάστημα backoff (δευτερόλεπτα) μεταξύ επαναλήψεων λόγω cooldown. Περιορίζεται σε αυτήν την τιμή ανεξάρτητα από το upstream `Retry-After`. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL του διακομιστή μεσολάβησης εξοικονόμησης token Headroom. Ο κύκλος ζωής του dashboard (`api/headroom/*`) εκκινεί από προεπιλογή ένα τοπικό CLI `headroom-ai` στη διεπαφή loopback· παρακάμψτε τη ρύθμιση μόνο για να υποδείξετε έναν εξωτερικό διακομιστή μεσολάβησης Docker sidecar. | ### Σταθερές ρύθμισης ανάκτησης ροής -Η συμπεριφορά συγκράτησης κατά την ανάκτηση ρυθμίζεται μέσω σταθερών που είναι ενσωματωμένες στον κώδικα στο +Η συμπεριφορά καθυστέρησης της ανάκτησης ρυθμίζεται μέσω σταθερών ενσωματωμένων στον κώδικα στο `open-sse/config/constants.ts` (`STREAM_RECOVERY`), οι οποίες παρατίθενται εδώ για αναφορά — -η αλλαγή τους απαιτεί επεξεργασία του κώδικα και όχι μεταβλητή περιβάλλοντος: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — το χρονικό διάστημα για το οποίο συγκρατείται το αρχικό παράθυρο SSE, - ώστε μια πρόωρη περικοπή να μπορεί να επαναληφθεί προτού οριστικοποιηθεί οποιοδήποτε byte προς τον πελάτη. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — απόλυτο ανώτατο όριο για το συγκρατούμενο παράθυρο· γίνεται οριστικοποίηση - (εκκαθάριση + απευθείας προώθηση) μόλις συγκεντρωθούν τόσα byte, ανεξάρτητα από τον χρονοδιακόπτη. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — μέγιστος αριθμός διαφανών επανανοίξεων της ανάντη - ροής όσο η συγκράτηση δεν έχει ακόμη οριστικοποιηθεί. - -> **Όριο ρυθμού κυλιόμενου παραθύρου ανά πάροχο (χωρίς μεταβλητή περιβάλλοντος):** ο μεταφερμένος από το FCC -> _εφεδρικός_ μηχανισμός ορίου ρυθμού κυλιόμενου παραθύρου ανά πάροχο υπάρχει στον κώδικα -> (`open-sse/services/providerDefaultRateLimit.ts`, συνδεδεμένος μέσω του -> `open-sse/services/rateLimitManager.ts`), αλλά διανέμεται με έναν **κενό προεπιλεγμένο χάρτη** -> και προς το παρόν **δεν διαθέτει μεταβλητή περιβάλλοντος για τον διαχειριστή** — ενεργοποιείται μόνο μέσω ενός hook δοκιμών / -> επεξεργασίας του κώδικα. Σκόπιμα δεν παρατίθεται στον παραπάνω πίνακα. Ο περιοριστής αναμετάδοσης ανά `(token, IP)` -> που _διαθέτει_ ρύθμιση είναι ο `RELAY_IP_PER_MINUTE` (§3 Δίκτυο και θύρες). +η αλλαγή τους απαιτεί τροποποίηση κώδικα και όχι μεταβλητή περιβάλλοντος: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — για πόσο διάστημα διατηρείται σε αναμονή το αρχικό παράθυρο SSE, + ώστε μια πρόωρη περικοπή να μπορεί να επαναληφθεί πριν δεσμευτεί οποιοδήποτε byte προς τον πελάτη. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — απόλυτο ανώτατο όριο για το παράθυρο που διατηρείται· πραγματοποιείται δέσμευση + (εκκένωση + απευθείας διέλευση) μόλις συγκεντρωθούν τόσα byte, ανεξάρτητα από τον χρονομετρητή. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — μέγιστος αριθμός διαφανών επανανοιγμάτων της upstream + ροής όσο η περιοχή αναμονής παραμένει μη δεσμευμένη. + +> **Όριο ρυθμού κυλιόμενου παραθύρου ανά πάροχο (χωρίς μεταβλητή περιβάλλοντος):** η εφεδρική υλοποίηση +> ορίου ρυθμού κυλιόμενου παραθύρου ανά πάροχο, η οποία μεταφέρθηκε από το FCC, υπάρχει στον κώδικα +> (`open-sse/services/providerDefaultRateLimit.ts`, συνδεδεμένη μέσω του +> `open-sse/services/rateLimitManager.ts`), αλλά διατίθεται με έναν **κενό προεπιλεγμένο χάρτη** +> και επί του παρόντος **δεν διαθέτει μεταβλητή περιβάλλοντος για τον διαχειριστή** — ενεργοποιείται μόνο μέσω hook δοκιμών / +> τροποποίησης κώδικα. Σκόπιμα δεν παρατίθεται στον παραπάνω πίνακα. Ο περιοριστής αναμετάδοσης ανά `(token, IP)` +> που _διαθέτει_ παράμετρο ρύθμισης είναι ο `RELAY_IP_PER_MINUTE` (§3 Δίκτυο και θύρες). --- ## 22. Αποσφαλμάτωση > [!CAUTION] -> Αυτές οι μεταβλητές παράγουν **αναλυτική έξοδο** και ενδέχεται να διαρρεύσουν ευαίσθητα δεδομένα. **Μην τις ενεργοποιείτε ποτέ σε περιβάλλον παραγωγής.** +> Αυτές οι μεταβλητές παράγουν **λεπτομερή έξοδο** και ενδέχεται να διαρρεύσουν ευαίσθητα δεδομένα. **Μην τις ενεργοποιείτε ποτέ σε περιβάλλον παραγωγής.** | Μεταβλητή | Προεπιλογή | Αρχείο προέλευσης | Περιγραφή | | ------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(δεν έχει οριστεί)_ | `open-sse/executors/cursor.ts` | Ορίστε την τιμή `1` για να ενεργοποιήσετε τα αναλυτικά αρχεία καταγραφής του εκτελεστή Cursor (αποκωδικοποιημένα τμήματα SSE κ.λπ.). | -| `CURSOR_STREAM_DEBUG` | _(δεν έχει οριστεί)_ | `open-sse/executors/cursor.ts` | Ψευδώνυμο του `CURSOR_DEBUG` συμβατό προς τα πίσω. | -| `CURSOR_DUMP_FILE` | _(δεν έχει οριστεί)_ | `open-sse/executors/cursor.ts` | Προαιρετική διαδρομή αρχείου στην οποία εγγράφονται τα ακατέργαστα αποκωδικοποιημένα τμήματα Cursor όταν `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Χρονικό όριο αδράνειας ροής (ms) για τον εκτελεστή Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Παράθυρο χάριτος (ms) μετά από έναν ήπιο τερματιστή composer kv_after_text, όταν παραμένουν byte στην ενδιάμεση μνήμη — παρέχει σε μια τελική κλήση εργαλείου exec_mcp χρόνο για να ολοκληρώσει το πλαίσιό της. | -| `CURSOR_TOOL_DIRECTIVE` | ενεργοποιημένο (`!== "0"`) | `open-sse/executors/cursor.ts` | Οδηγία υποβολής εργαλείου που κάνει το composer-2.5 να εκδίδει αξιόπιστα κλήσεις εργαλείων. Ορίστε την τιμή `0` για απενεργοποίηση. | +| `CURSOR_DEBUG` | _(δεν έχει οριστεί)_ | `open-sse/executors/cursor.ts` | Ορίστε την τιμή `1` για να ενεργοποιήσετε τα λεπτομερή αρχεία καταγραφής του εκτελεστή Cursor (αποκωδικοποιημένα τμήματα SSE κ.λπ.). | +| `CURSOR_STREAM_DEBUG` | _(δεν έχει οριστεί)_ | `open-sse/executors/cursor.ts` | Ψευδώνυμο του `CURSOR_DEBUG` με συμβατότητα προς τα πίσω. | +| `CURSOR_DUMP_FILE` | _(δεν έχει οριστεί)_ | `open-sse/executors/cursor.ts` | Προαιρετική διαδρομή αρχείου στην οποία εγγράφονται τα ανεπεξέργαστα αποκωδικοποιημένα τμήματα του Cursor όταν ισχύει `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Χρονικό όριο αδράνειας της ροής (ms) για τον εκτελεστή Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Περίοδος χάριτος (ms) μετά από έναν ήπιο τερματιστή composer kv_after_text, όταν παραμένουν byte στην προσωρινή μνήμη — παρέχει χρόνο σε μια τελική κλήση εργαλείου exec_mcp για να ολοκληρώσει το πλαίσιό της. | +| `CURSOR_TOOL_DIRECTIVE` | ενεργοποιημένο (`!== "0"`) | `open-sse/executors/cursor.ts` | Οδηγία δέσμευσης εργαλείου που κάνει το composer-2.5 να εκδίδει αξιόπιστα κλήσεις εργαλείων. Ορίστε την τιμή `0` για απενεργοποίηση. | | `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(δεν έχει οριστεί)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Κείμενο προτροπής συστήματος που ορίζεται από τον διαχειριστή και προσαρτάται στο μήνυμα συστήματος ΜΕΤΑ τη μετάφραση (εισαγωγή μετά τη μετάφραση), φτάνοντας στις διαδρομές codex/Responses και `/v1/messages`. Χρησιμοποιείται επίσης ως πρόθεμα οδηγίας που αφαιρείται από επαναλαμβανόμενα μπλοκ προοιμίου συστήματος. Αφήστε το χωρίς τιμή για απενεργοποίηση. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (ανενεργό) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Ορίστε την τιμή `1` για να αφαιρούνται τα επαναλαμβανόμενα μπλοκ προοιμίου της προτροπής συστήματος από την αρχή μιας ροής openai→claude. Ανενεργό από προεπιλογή — οι ευρετικές μέθοδοι είναι προσαρμοσμένες σε αγγλικό πεζό λόγο και τροποποιούν το ωφέλιμο φορτίο της απόκρισης, επομένως μια απάντηση που ξεκινά θεμιτά με μια τέτοια ενότητα θα την έχανε. | | `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Χρονικό όριο ανάκτησης ανά εικόνα (ms) για απομακρυσμένη είσοδο όρασης `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(ανιχνεύεται)_ | `open-sse/utils/cursorVersionDetector.ts` | Παρακάμπτει την αναζήτηση της βάσης δεδομένων κατάστασης του Cursor IDE που χρησιμοποιείται για τον εντοπισμό της έκδοσης IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(εντοπισμός / καθορισμός)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Αναγνωριστικό έκδοσης του Agent CLI (`YYYY.MM.DD-`) για το `x-cursor-client-version: cli-…` στο Agent Run. | -| `CURSOR_AGENT_BIN` | _(δεν έχει οριστεί)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Διαδρομή προς το εκτελέσιμο αρχείο Cursor Agent που χρησιμοποιείται για τη δημιουργία εικόνων. Αν δεν έχει οριστεί, ο χειριστής χρησιμοποιεί πρώτα το `providerSpecificData.agentBin` και κατόπιν το PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Συνολικό χρονικό όριο ανά εικόνα (ms) για εργασίες εικόνων του Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Όριο ταυτόχρονης εκτέλεσης κοινόχρηστης θέσης για εργασίες εικόνων Cursor. | +| `CURSOR_STATE_DB_PATH` | _(ανιχνεύεται)_ | `open-sse/utils/cursorVersionDetector.ts` | Παρακάμπτει την αναζήτηση της βάσης δεδομένων κατάστασης του Cursor που χρησιμοποιείται για την ανίχνευση της έκδοσης του IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(ανίχνευση / καρφίτσωμα)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Αναγνωριστικό έκδοσης του Agent CLI (`YYYY.MM.DD-`) για το `x-cursor-client-version: cli-…` κατά την εκτέλεση του Agent. | +| `CURSOR_AGENT_BIN` | _(δεν έχει οριστεί)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Διαδρομή προς το εκτελέσιμο αρχείο του Cursor Agent που χρησιμοποιείται για τη δημιουργία εικόνων. Αν δεν έχει οριστεί, ο χειριστής χρησιμοποιεί πρώτα το `providerSpecificData.agentBin` και έπειτα το PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Μέγιστος πραγματικός χρόνος ανά εικόνα (ms) για εργασίες εικόνων του Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Όριο ταυτόχρονης εκτέλεσης κοινόχρηστης θέσης για εργασίες εικόνων του Cursor. | | `CURSOR_IMG_MODEL` | αίτημα / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Παρακάμπτει το `--model` του Cursor CLI για εργασίες εικόνων. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Ρυθμός ελέγχου αποτελέσματος δημιουργίας εικόνων UC (uncensored.com) (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Συνολικό χρονικό όριο ελέγχου αποτελέσματος δημιουργίας εικόνων UC (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Ρυθμός ελέγχου αποτελέσματος δημιουργίας βίντεο UC (uncensored.com) (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Συνολικό χρονικό όριο ελέγχου αποτελέσματος δημιουργίας βίντεο UC (ms). | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Ρυθμός σταθμοσκόπησης αποτελεσμάτων δημιουργίας εικόνων του UC (uncensored.com) (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Μέγιστος πραγματικός χρόνος σταθμοσκόπησης αποτελεσμάτων δημιουργίας εικόνων του UC (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Ρυθμός σταθμοσκόπησης αποτελεσμάτων δημιουργίας βίντεο του UC (uncensored.com) (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Μέγιστος πραγματικός χρόνος σταθμοσκόπησης αποτελεσμάτων δημιουργίας βίντεο του UC (ms). | | `CURSOR_DATA_DIR` | _(ανιχνεύεται)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Παρακάμπτει τον κατάλογο δεδομένων του Cursor Agent CLI (`…/versions/`)· είναι η ίδια μεταβλητή που χρησιμοποιεί ο επίσημος agent. | | `CURSOR_TOKEN` | _(δεν έχει οριστεί)_ | `scripts/ad-hoc/cursor-tap.cjs` | Άμεσο διακριτικό bearer του Cursor που χρησιμοποιείται από τα εργαλεία προγραμματιστών. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | απενεργοποιημένο (προαιρετική ενεργοποίηση μέσω `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Καταγράφει ενδείξεις τύπου και μήκους περιεχομένου για μεγάλα ωφέλιμα φορτία συνομιλίας όταν έχει οριστεί η τιμή `"1"`. Είναι απενεργοποιημένο από προεπιλογή για τη μείωση του θορύβου στα αρχεία καταγραφής. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | απενεργοποιημένο (προαιρετική ενεργοποίηση μέσω `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Καταγράφει ενδείξεις τύπου/μήκους περιεχομένου για μεγάλα ωφέλιμα φορτία συνομιλίας όταν έχει οριστεί η τιμή `"1"`. Ανενεργό από προεπιλογή για τη μείωση του θορύβου στα αρχεία καταγραφής. | | `DEBUG_RESPONSES_SSE_TO_JSON` | _(δεν έχει οριστεί)_ | `open-sse/handlers/responseTranslator.ts` | Ορίστε την τιμή `true` για να καταγράφονται λεπτομέρειες της μετάφρασης SSE→JSON του Responses API. | -| `DEBUG_CLAUDE_NONSTREAM` | _(δεν έχει οριστεί)_ | `open-sse/handlers/responseTranslator.ts` | Ορίστε την τιμή `true` για να εμφανίζονται κενά τμήματα textContent στη διαδρομή μετάφρασης απόκρισης Claude (μόνο για αποσφαλμάτωση). | +| `DEBUG_CLAUDE_NONSTREAM` | _(δεν έχει οριστεί)_ | `open-sse/handlers/responseTranslator.ts` | Ορίστε την τιμή `true` για να εμφανίζονται κενά τμήματα textContent στη διαδρομή μετάφρασης αποκρίσεων του Claude (μόνο για αποσφαλμάτωση). | | `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(δεν έχει οριστεί)_ | Υποδομή δοκιμών E2E | Ορίστε την τιμή `true` για να ενεργοποιήσετε τη λειτουργία δοκιμών E2E (χαλαρότερος έλεγχος ταυτότητας, άγκιστρα δοκιμών). | --- @@ -1225,7 +1235,7 @@ STREAM_HISTORY_MAX=10 ## Σενάρια Ανάπτυξης -Για οδηγίες SRE σχετικά με το backend αναμετάδοσης (συμπεριφορά ts/bifrost/auto, τοποθέτηση 9router έναντι CLIProxyAPI και στρατηγική εφεδρείας για υψηλή διεκπεραιωτική ικανότητα), ανατρέξτε στη [Στρατηγική Backend Αναμετάδοσης](/docs/reference/RELAY_BACKEND_STRATEGY.md). +Για οδηγίες SRE σχετικά με το backend αναμετάδοσης (συμπεριφορά ts/bifrost/auto, τοποθέτηση 9router έναντι CLIProxyAPI και στρατηγική εφεδρείας για υψηλό φόρτο), ανατρέξτε στη [Στρατηγική Backend Αναμετάδοσης](/docs/reference/RELAY_BACKEND_STRATEGY.md). ### Ελάχιστη Τοπική Ανάπτυξη diff --git a/docs/i18n/el/docs/reference/FEATURE_FLAGS.md b/docs/i18n/el/docs/reference/FEATURE_FLAGS.md index 7ee73cd258d9..094710645432 100644 --- a/docs/i18n/el/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/el/docs/reference/FEATURE_FLAGS.md @@ -42,126 +42,128 @@ --- -## Κατάλογος Σημαιών +## Κατάλογος σημαιών -72 σημαίες σε 6 κατηγορίες. Η **Προεπιλογή** είναι η προεπιλεγμένη τιμή του ορισμού — η τιμή +74 σημαίες σε 6 κατηγορίες. Η **Προεπιλογή** είναι η προεπιλογή του ορισμού — η τιμή που χρησιμοποιείται όταν δεν υπάρχει ούτε παράκαμψη στη βάση δεδομένων ούτε μεταβλητή περιβάλλοντος. ### Ασφάλεια (10) -| Κλειδί | Τύπος | Προεπιλογή | Περιγραφή | -| --------------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Απαίτηση κλειδιού API για όλα τα εισερχόμενα αιτήματα. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Ενεργοποίηση εξυγίανσης εισόδου για όλα τα αιτήματα. | -| `INJECTION_GUARD_MODE` | enum | `off` | Λειτουργία προστασίας από έγχυση προτροπών. Τιμές: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Απόκρυψη PII από τα αιτήματα (ανεξάρτητα από το `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Εξυγίανση PII από τις αποκρίσεις των παρόχων. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Λειτουργία εξυγίανσης PII στις αποκρίσεις. Τιμές: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Αποκλεισμός εξερχόμενων αιτημάτων προς ιδιωτικά/εσωτερικά εύρη διευθύνσεων IP. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Να επιτρέπεται στους πιστοποιημένους χρήστες του πίνακα ελέγχου να αποκαλύπτουν αποθηκευμένα κλειδιά API αντί να βλέπουν μόνο καλυμμένες τιμές. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Συμπερίληψη του προθέματος λογαριασμού στις γραμμές καταγραφής AUTH (π.χ. "Χρήση λογαριασμού : abc12345..."). Είναι απενεργοποιημένο από προεπιλογή, ώστε τα αναγνωριστικά λογαριασμών να αποκρύπτονται από κοινόχρηστα αρχεία καταγραφής διεργασιών ή αρχεία καταγραφής περιβαλλόντων πολλαπλών μισθωτών. Είναι ανεξάρτητο από τη Λειτουργία Εντοπισμού Σφαλμάτων· η αλλαγή της Λειτουργίας Εντοπισμού Σφαλμάτων δεν τα αποκαλύπτει. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Όταν το OIDC είναι ενεργοποιημένο, απενεργοποιείται η σύνδεση με κωδικό πρόσβασης, ώστε οι χρήστες να μπορούν να πιστοποιούνται μόνο μέσω της Ενιαίας Σύνδεσης OIDC. Όταν είναι απενεργοποιημένο (προεπιλογή), είναι διαθέσιμες τόσο η σύνδεση με κωδικό πρόσβασης όσο και η σύνδεση μέσω OIDC. | - -### Δίκτυο (15) - -| Κλειδί | Τύπος | Προεπιλογή | Επανεκκίνηση | Περιγραφή | -| ----------------------------------------------- | ------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Ενεργοποίηση λειτουργίας απόκρυψης αποτυπώματος TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Επιτρέπει στις διαδρομές /v1/audio/* να χρησιμοποιούν κόμβους παρόχων συμβατούς με το OpenAI που φιλοξενούνται εκτός localhost. Απενεργοποιημένο από προεπιλογή — η δρομολόγηση ήχου σε απομακρυσμένο κεντρικό υπολογιστή αλλάζει την ταυτότητα εξερχόμενης κίνησης και πρέπει να αποτελεί ρητή απόφαση του διαχειριστή. Οι κόμβοι loopback επιτρέπονται πάντα και δεν επηρεάζονται. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Όταν δεν έχει εκχωρηθεί proxy σε μια σύνδεση, επιλέγει αυτόματα το πρώτο λειτουργικό proxy από το μητρώο. Απενεργοποιημένο από προεπιλογή (διαφορετικά οποιοδήποτε proxy του μητρώου γίνεται καθολική εφεδρική επιλογή — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Επιτρέπει στις ροές OAuth και επικύρωσης παρόχων να παρακάμπτουν ένα καρφιτσωμένο proxy και να συνδέονται απευθείας όταν αποτυγχάνουν οι προκαταρκτικοί έλεγχοι προσβασιμότητας του proxy. Απενεργοποιημένο από προεπιλογή, επειδή αυτό μπορεί να αλλάξει τη διεύθυνση IP εξερχόμενης κίνησης. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Σε περίπτωση εξαίρεσης δικτύου (λήξη χρονικού ορίου, άρνηση/επαναφορά σύνδεσης) για έναν εκτελεστή εναλλαγής πολλών λογαριασμών, όταν ο λογαριασμός που αποτυγχάνει δεν διαθέτει αποκλειστικό proxy, εφαρμόζει σύντομο χρόνο αναμονής και παραλείπει άλλους λογαριασμούς χωρίς proxy για το υπόλοιπο αίτημα, αντί να επαναλαμβάνει την προσπάθεια για τον καθένα. Ενεργοποιημένο από προεπιλογή (ασφαλές: δεν αλλάζει η διεύθυνση IP εξερχόμενης κίνησης, μειώνεται μόνο ο κίνδυνος καθυστέρησης/χρόνου αναμονής σε λογαριασμούς με κοινή εξερχόμενη κίνηση). Απενεργοποιήστε το για να επαναφέρετε την άμεση διάδοση κατά την πρώτη εξαίρεση από λογαριασμό χωρίς proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Οι ομάδες proxy και η εναλλαγή ανά λογαριασμό του opencode παύουν να διαθέτουν εκ νέου ένα proxy που μόλις απέτυχε (απορριφθείσα δοκιμή TCP ή λήψη 429 μέσω αυτού) για ένα χρονικό διάστημα ανά διεργασία, το οποίο διπλασιάζεται σε κάθε επανάληψη έως ένα ανώτατο όριο. Δεν καταγράφεται καμία κατάσταση proxy· όταν όλοι οι υποψήφιοι παραμερίζονται, η επιλογή παραμένει αμετάβλητη. Απενεργοποιημένο από προεπιλογή. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Εμφανίζει, κάτω από μια ομάδα proxy στον πίνακα ελέγχου, πόσες παρατηρηθείσες διευθύνσεις IP εξερχόμενης κίνησης εξυπηρέτησαν τα μέλη της κατά τις τελευταίες 24 ώρες και πόσες συνδέσεις τις χρησιμοποίησαν. Μόνο για ανάγνωση, υπολογίζεται από το αρχείο καταγραφής του proxy και δεν χρησιμοποιείται ποτέ για δρομολόγηση. Απενεργοποιημένο από προεπιλογή. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Για τον εκτελεστή OpenCode, παρακολουθεί το πρώτο byte του σώματος μιας απόκρισης Responses σε ροή (παράθυρο: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, προεπιλογή `15000`). Μια ροή Responses 2xx που παραμένει σιωπηλή πέρα από το παράθυρο θεωρείται κολλημένη: ο λογαριασμός τίθεται σε χρόνο αναμονής και το αίτημα μεταφέρεται στον επόμενο λογαριασμό μία φορά· ένα δεύτερο κόλλημα αποτυγχάνει αμέσως. Απενεργοποιημένο από προεπιλογή: οι κολλημένες ροές διατηρούν τη σημερινή αναμονή μέχρι τη λήξη χρονικού ορίου ετοιμότητας της ροής. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Εκτελεστής OpenCode: σε 403/451 που περιέχει άρνηση `user_blocked` (όχι γεωγραφικό περιορισμό ούτε απόρριψη αποτυπώματος από το Cloudflare), θέτει τον λογαριασμό που απορρίφθηκε σε χρόνο αναμονής και μεταφέρει το αίτημα στον επόμενο λογαριασμό το πολύ μία φορά ανά αίτημα· μια δεύτερη άρνηση επιστρέφεται ως έχει, χωρίς επισήμανση επιτυχίας. Απενεργοποιημένο από προεπιλογή: η παράκαμψη ενός αποκλεισμού χρήστη από ανάντη υπηρεσία μπορεί να μοιάζει με αποφυγή και να διαδώσει τη σήμανση σε ολόκληρο τον στόλο. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Εναλλαγή OpenCode: μετά από δύο διαδοχικές παροδικές αποτυχίες ανάντη υπηρεσίας (5xx ή κενό 400), πραγματοποιεί παύση πριν από τον επόμενο λογαριασμό — 1,5 δευτ. με διπλασιασμό για κάθε επόμενη αποτυχία, με ανώτατο όριο 6 δευτ. ανά παύση και 10 δευτ. ανά αίτημα· παραλείπεται σε αποσύνδεση πελάτη. Το σώμα της αποτυχημένης απόκρισης αποδεσμεύεται πριν από την αναμονή. Απενεργοποιημένο από προεπιλογή: η μετάπτωση παραμένει άμεση. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Εναλλαγή OpenCode: σταματά το κύμα λογαριασμών στο πρώτο 429 που ταξινομείται ως πραγματικό όριο ρυθμού (αναλύσιμο `Retry-After` ή σώμα που αναφέρει όριο ρυθμού/χρήσης) και επιστρέφει αμετάβλητο αυτό το ανάντη 429. Τα μη ταξινομημένα 429 συνεχίζουν την εναλλαγή. Απενεργοποιημένο από προεπιλογή: το δωρεάν επίπεδο περιορίζεται ανά διεύθυνση IP εξερχόμενης κίνησης (#9611), επομένως κάθε 429 προκαλεί εναλλαγή και ένα εξαντλημένο κύμα επιστρέφει το τελευταίο ανάντη 429. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Απενεργοποίηση της επαλήθευσης πιστοποιητικού TLS για το proxy MITM. **Κίνδυνος.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Επιτρέπει URL παρόχων που παραπέμπουν σε ιδιωτικά/εσωτερικά δίκτυα. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Επιτρέπει την προσθήκη/επικύρωση παρόχων σε τοπικές/ιδιωτικές διευθύνσεις (127.0.0.1, localhost, LAN). Ενεργοποιημένο από προεπιλογή (προτεραιότητα στα τοπικά)· απενεργοποιήστε το για αυστηρό αποκλεισμό όλων εκτός των δημόσιων διευθύνσεων. Τα μεταδεδομένα cloud παραμένουν αποκλεισμένα. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Ενεργοποίηση λειτουργίας παρόχου συμβατού με το Claude Code. | +| Κλειδί | Τύπος | Προεπιλογή | Περιγραφή | +| --------------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Απαίτηση κλειδιού API για όλα τα εισερχόμενα αιτήματα. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Ενεργοποίηση εξυγίανσης εισόδου για όλα τα αιτήματα. | +| `INJECTION_GUARD_MODE` | enum | `off` | Λειτουργία προστασίας από έγχυση προτροπών. Τιμές: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Απόκρυψη PII από τα αιτήματα (ανεξάρτητα από το `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Εξυγίανση PII από τις αποκρίσεις του παρόχου. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Λειτουργία εξυγίανσης PII στις αποκρίσεις. Τιμές: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Αποκλεισμός εξερχόμενων αιτημάτων προς ιδιωτικά/εσωτερικά εύρη διευθύνσεων IP. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Να επιτρέπεται στους πιστοποιημένους χρήστες του πίνακα ελέγχου να αποκαλύπτουν αποθηκευμένα κλειδιά API αντί να βλέπουν μόνο καλυμμένες τιμές. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Συμπερίληψη του προθέματος λογαριασμού στις γραμμές καταγραφής AUTH (π.χ. «Χρήση λογαριασμού : abc12345...»). Είναι απενεργοποιημένο από προεπιλογή, ώστε τα αναγνωριστικά λογαριασμών να αποκρύπτονται από κοινόχρηστα αρχεία καταγραφής διεργασιών ή αρχεία καταγραφής διεργασιών πολλαπλών μισθωτών. Είναι ανεξάρτητο από τη λειτουργία εντοπισμού σφαλμάτων· η εναλλαγή της λειτουργίας εντοπισμού σφαλμάτων δεν τα αποκαλύπτει. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Όταν είναι ενεργοποιημένο το OIDC, απενεργοποίηση της σύνδεσης με κωδικό πρόσβασης, ώστε οι χρήστες να μπορούν να πιστοποιούνται μόνο μέσω καθολικής σύνδεσης OIDC. Όταν είναι απενεργοποιημένο (προεπιλογή), είναι διαθέσιμες τόσο η σύνδεση με κωδικό πρόσβασης όσο και η σύνδεση μέσω OIDC. | + +### Δίκτυο (16) + +| Κλειδί | Τύπος | Προεπιλογή | Επανεκκίνηση | Περιγραφή | +| ----------------------------------------------- | ------- | ---------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Ενεργοποιεί τη λειτουργία απόκρυψης αποτυπώματος TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Επιτρέπει στις διαδρομές /v1/audio/* να χρησιμοποιούν κόμβους παρόχων συμβατούς με το OpenAI, οι οποίοι φιλοξενούνται εκτός localhost. Είναι απενεργοποιημένο από προεπιλογή — η δρομολόγηση ήχου προς απομακρυσμένο κεντρικό υπολογιστή αλλάζει την ταυτότητα εξερχόμενης κίνησης και πρέπει να αποτελεί ρητή απόφαση του διαχειριστή. Οι κόμβοι loopback επιτρέπονται πάντα και δεν επηρεάζονται. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Επιτρέπει στο POST /v1/rerank (και στο βήμα επανακατάταξης loopback της μηχανής μνήμης) να χρησιμοποιεί κόμβους παρόχων συμβατούς με το OpenAI, οι οποίοι φιλοξενούνται εκτός localhost. Είναι απενεργοποιημένο από προεπιλογή — η δρομολόγηση προς απομακρυσμένο κεντρικό υπολογιστή αλλάζει την ταυτότητα εξερχόμενης κίνησης και πρέπει να αποτελεί ρητή απόφαση του διαχειριστή. Οι κόμβοι loopback επιτρέπονται πάντα· οι απομακρυσμένοι κόμβοι πρέπει επίσης να συμμορφώνονται με την πολιτική εξερχόμενων URL του παρόχου. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Όταν δεν έχει εκχωρηθεί proxy σε μια σύνδεση, επιλέγει αυτόματα το πρώτο λειτουργικό proxy από το μητρώο. Είναι απενεργοποιημένο από προεπιλογή (διαφορετικά οποιοδήποτε proxy του μητρώου γίνεται καθολική εφεδρική επιλογή — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Επιτρέπει στις ροές OAuth και επικύρωσης παρόχου να παρακάμπτουν ένα καρφιτσωμένο proxy και να συνδέονται απευθείας όταν αποτυγχάνουν οι προκαταρκτικοί έλεγχοι προσβασιμότητας του proxy. Είναι απενεργοποιημένο από προεπιλογή, επειδή αυτό μπορεί να αλλάξει την IP εξερχόμενης κίνησης. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Σε περίπτωση εξαίρεσης δικτύου (λήξη χρονικού ορίου, άρνηση/επαναφορά σύνδεσης) για έναν εκτελεστή εναλλαγής πολλαπλών λογαριασμών, όταν ο λογαριασμός που αποτυγχάνει δεν διαθέτει αποκλειστικό proxy, εφαρμόζει σύντομη περίοδο αναμονής και παραλείπει άλλους λογαριασμούς χωρίς proxy για το υπόλοιπο αίτημα, αντί να επαναλαμβάνει την προσπάθεια για καθέναν. Είναι ενεργοποιημένο από προεπιλογή (ασφαλές: δεν αλλάζει η IP εξερχόμενης κίνησης, απλώς μειώνεται ο κίνδυνος καθυστέρησης/περιόδου αναμονής σε λογαριασμούς με κοινή εξερχόμενη κίνηση). Απενεργοποιήστε το για να επαναφέρετε την άμεση διάδοση στην πρώτη εξαίρεση από λογαριασμό χωρίς proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Οι ομάδες proxy και η εναλλαγή ανά λογαριασμό του opencode παύουν να επαναχρησιμοποιούν ένα proxy που μόλις απέτυχε (απόρριψη διερεύνησης TCP ή λήψη απόκρισης 429 μέσω αυτού) για μια περίοδο ανά διεργασία, η οποία διπλασιάζεται σε κάθε επανάληψη έως ένα ανώτατο όριο. Δεν καταγράφεται κατάσταση proxy· όταν όλοι οι υποψήφιοι παραμερίζονται, η επιλογή παραμένει αμετάβλητη. Είναι απενεργοποιημένο από προεπιλογή. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Εμφανίζει, κάτω από μια ομάδα proxy στον πίνακα ελέγχου, πόσες παρατηρηθείσες IP εξερχόμενης κίνησης εξυπηρέτησαν τα μέλη της κατά τις τελευταίες 24 h και πόσες συνδέσεις τις χρησιμοποίησαν. Είναι μόνο για ανάγνωση, υπολογίζεται από το αρχείο καταγραφής proxy και δεν χρησιμοποιείται ποτέ για δρομολόγηση. Είναι απενεργοποιημένο από προεπιλογή. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Για τον εκτελεστή OpenCode, παρακολουθεί το πρώτο byte του σώματος μιας απάντησης Responses με ροή (παράθυρο: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, προεπιλογή `15000`). Μια ροή Responses με 2xx που παραμένει σιωπηλή πέρα από το παράθυρο θεωρείται ότι έχει κολλήσει: ο λογαριασμός τίθεται σε περίοδο αναμονής και το αίτημα μεταβαίνει μία φορά στον επόμενο λογαριασμό· μια δεύτερη εμπλοκή προκαλεί άμεση αποτυχία. Είναι απενεργοποιημένο από προεπιλογή: οι κολλημένες ροές διατηρούν την τρέχουσα αναμονή μέχρι τη λήξη του χρονικού ορίου ετοιμότητας της ροής. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Εκτελεστής OpenCode: σε απόκριση 403/451 που περιέχει άρνηση `user_blocked` (όχι γεωγραφικό περιορισμό ούτε απόρριψη δακτυλικού αποτυπώματος από το Cloudflare), θέτει προσωρινά σε αναμονή τον λογαριασμό που απορρίφθηκε και μεταβαίνει στον επόμενο λογαριασμό το πολύ μία φορά ανά αίτημα· μια δεύτερη άρνηση επιστρέφεται ως έχει, χωρίς επισήμανση επιτυχίας. Απενεργοποιημένο από προεπιλογή: η παράκαμψη ενός αποκλεισμού χρήστη από την upstream υπηρεσία μπορεί να εκληφθεί ως αποφυγή περιορισμών και να διαδώσει τη σχετική επισήμανση σε ολόκληρο τον στόλο. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Εναλλαγή OpenCode: μετά από δύο διαδοχικές παροδικές αποτυχίες της upstream υπηρεσίας (5xx ή κενή απόκριση 400), γίνεται παύση πριν από τον επόμενο λογαριασμό — 1,5 δευτ. με διπλασιασμό για κάθε επιπλέον αποτυχία, με ανώτατο όριο 6 δευτ. ανά παύση και 10 δευτ. ανά αίτημα, ενώ παραλείπεται σε περίπτωση αποσύνδεσης του πελάτη· το σώμα της αποτυχημένης απόκρισης αποδεσμεύεται πριν από την αναμονή. Απενεργοποιημένο από προεπιλογή: η εναλλαγή μετά από αποτυχία παραμένει άμεση. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Εναλλαγή OpenCode: διακοπή του κύματος λογαριασμών στην πρώτη απόκριση 429 που ταξινομείται ως πραγματικός περιορισμός ρυθμού (τιμή `Retry-After` που μπορεί να αναλυθεί ή σώμα που αναφέρει όριο ρυθμού/χρήσης) και επιστροφή αυτής της upstream απόκρισης 429 χωρίς αλλαγές. Οι μη ταξινομημένες αποκρίσεις 429 συνεχίζουν την εναλλαγή. Απενεργοποιημένο από προεπιλογή: το δωρεάν επίπεδο περιορίζεται ανά διεύθυνση IP εξόδου (#9611), επομένως κάθε απόκριση 429 προκαλεί εναλλαγή και ένα εξαντλημένο κύμα επιστρέφει την τελευταία upstream απόκριση 429. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Απενεργοποίηση της επαλήθευσης πιστοποιητικού TLS για τον διακομιστή μεσολάβησης MITM. **Κίνδυνος.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Να επιτρέπονται URL παρόχων που παραπέμπουν σε ιδιωτικά/εσωτερικά δίκτυα. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Να επιτρέπεται η προσθήκη/επικύρωση παρόχων σε τοπικές/ιδιωτικές διευθύνσεις (127.0.0.1, localhost, LAN). Ενεργοποιημένο από προεπιλογή (προτεραιότητα στα τοπικά)· απενεργοποιήστε το για αυστηρό αποκλεισμό όλων των μη δημόσιων διευθύνσεων. Τα μεταδεδομένα cloud παραμένουν αποκλεισμένα. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Ενεργοποίηση λειτουργίας παρόχου συμβατού με το Claude Code. | ### Πολιτικές (5) | Κλειδί | Τύπος | Προεπιλογή | Περιγραφή | | ------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `TOOL_POLICY_MODE` | enum | `disabled` | Λειτουργία επιβολής πολιτικής χρήσης εργαλείων. Τιμές: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Αυτόματη ενεργοποίηση περιορισμού ρυθμού βάσει μοτίβων χρήσης. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Παράλειψη του τοπικού ελέγχου παραθύρου συμφραζομένων / μέγιστου αριθμού διακριτικών εισόδου του OmniRoute για απευθείας αιτήματα προς ένα μόνο μοντέλο. Τα όρια των ανάντη υπηρεσιών εξακολουθούν να ισχύουν. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Απόρριψη αιτημάτων πριν από την αποστολή, όταν το μοντέλο-στόχος δεν διαθέτει τις απαιτούμενες δυνατότητες (όραση, εργαλεία, δομημένη έξοδο, παράθυρο συμφραζομένων). Προστατεύει τα απευθείας αιτήματα προς έναν μόνο πάροχο που παρακάμπτουν το φίλτρο συμβατότητας του επιπέδου συνδυασμών. | -| `RADAR_ENABLED` | boolean | `false` | Ενεργοποίηση της μονάδας OmniRoute Radar (οθόνες ροής καταλόγου και συγχρονισμός). Είναι απενεργοποιημένη από προεπιλογή· η ενεργοποίηση ξεκλειδώνει μόνο το περιβάλλον χρήστη — ο συγχρονισμός δεδομένων παραμένει ξεχωριστή προαιρετική επιλογή. | - -### Χρόνος εκτέλεσης (32) - -| Κλειδί | Τύπος | Προεπιλογή | Επανεκκίνηση | Περιγραφή | -| ------------------------------------------- | ------- | ---------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Δημιουργία και εισαγωγή συνόψεων συνομιλίας όταν η δρομολόγηση combo αλλάζει μοντέλα. Απενεργοποιήστε το για να αντιμετωπίζονται ανεξάρτητα οι αλλαγές μοντέλων και να αποτρέπονται τα αιτήματα παράδοσης στο παρασκήνιο για όλα τα υπάρχοντα και μελλοντικά combo. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Απόρριψη των εσωτερικών στοιχείων εξόδου της φάσης σχολιασμού από τις ροές διέλευσης του Responses API πριν προωθηθούν στους πελάτες. Απενεργοποιήστε το για να λαμβάνετε τον ακατέργαστο σχολιασμό από την ανάντη υπηρεσία. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Επιβολή περιορισμών εμβέλειας στην πρόσβαση στα εργαλεία MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Συμπίεση των περιγραφών εργαλείων MCP για μείωση της χρήσης token. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Ενεργοποίηση της επεξεργασίας εργασιών παρασκηνίου κατά τον χρόνο εκτέλεσης. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Απενεργοποίηση όλων των υπηρεσιών παρασκηνίου (ανανέωση ορίων χρήσης, συγχρονισμός κ.λπ.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Αποδοχή των φίλτρων RTK σε επίπεδο έργου ως έμπιστων χωρίς επικύρωση. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Εκκίνηση του διακομιστή WebSocket του πίνακα εργαλείων πραγματικού χρόνου κατά την εισαγωγή (θύρα 20132 από προεπιλογή). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Να επιτρέπεται στο Codex να χρησιμοποιεί τη μεταφορά Responses-over-WebSocket. Όταν είναι απενεργοποιημένο, το Codex επιστρέφει στο HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Να επιτρέπεται στο Codex να χρησιμοποιεί την τοπική μεταφορά WebSocket JSON-RPC του app-server (codexTransport=app-server). Όταν είναι απενεργοποιημένο, οι συνδέσεις που έχουν επιλέξει το app-server επιστρέφουν στις άλλες μεταφορές του Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Δρομολόγηση αιτημάτων των οποίων ο προϋπολογισμός έχει εξαντληθεί στον δωρεάν πάροχο/μοντέλο εφεδρείας έκτακτης ανάγκης. (Δείτε παρακάτω την ενότητα [Εφεδρεία έκτακτης ανάγκης για τον προϋπολογισμό](#emergency-budget-fallback).) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Ενεργοποίηση διαφανούς πρώιμης επανάληψης για περικομμένες ανάντη ροές SSE, προτού φτάσει οποιοδήποτε byte απόκρισης στον πελάτη. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Να επιτρέπεται στην ανάκτηση ροής να ζητά ξανά και να συρράπτει μια απόκριση αφού έχουν ήδη φτάσει byte στον πελάτη. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Διασφάλιση ότι η συνέχιση στο μέσο της ροής είναι ασφαλής για κλήσεις εργαλείων: να μη συνεχίζεται ποτέ μια διακοπείσα ροή αφού έχει εκπεμφθεί κλήση εργαλείου (σε εξέλιξη ή ήδη ολοκληρωμένη με finish_reason tool_calls) και να κλείνει μετά από μία κενή συνέχεια αντί να εξαντλείται ολόκληρος ο προϋπολογισμός. Απενεργοποιημένο: συμπεριφορά έκδοσης. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Εφεδρική μετάβαση μία φορά σε αδελφή σύνδεση όταν μια ροή SSE κλείνει προτού εκπέμψει οποιοδήποτε χρήσιμο πλαίσιο και έχει εξαντληθεί η περιορισμένη επανάληψη στην ίδια σύνδεση· αν δεν υπάρχει αξιοποιήσιμη αδελφή σύνδεση, επιστρέφεται το αρχικό `STREAM_EARLY_EOF` 502. Απενεργοποιημένο από προεπιλογή: το πρώιμο EOF παραμένει τερματικό μετά την επανάληψη στην ίδια σύνδεση. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Συμπερίληψη πεδίων ονόματος κατάλληλων για εμφάνιση στις αποκρίσεις `/v1/models`. Απενεργοποιήστε το για πελάτες που αναμένουν μόνο αναγνωριστικά μοντέλων. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Ελέγχει τον τρόπο προσθήκης προθεμάτων στα αναγνωριστικά μοντέλων στο /v1/models. Το 'dual' (προεπιλογή) εκπέμπει τόσο το ψευδώνυμο όσο και τα κανονικά προθέματα αναγνωριστικού παρόχου για συμβατότητα προς τα πίσω. Το 'alias' εκπέμπει μόνο το σύντομο πρόθεμα ψευδωνύμου (π.χ. ds-web/model, όχι deepseek-web/model). Το 'canonical' εκπέμπει μόνο το πλήρες πρόθεμα αναγνωριστικού παρόχου. Τιμές: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Ενεργοποίηση περιοδικού συγχρονισμού ELO του πίνακα κατάταξης Arena AI για τις κατατάξεις ευφυΐας μοντέλων. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Δημοσίευση κατοπτρικών αναγνωριστικών `claude//` στο `/v1/models`, ώστε η ανακάλυψη μοντέλων της πύλης Claude Code να παραθέτει μοντέλα εκτός Claude. Καθολικό επίπεδο της πύλης τριών επιπέδων (η μεταβλητή περιβάλλοντος υπερισχύει της παράκαμψης του πίνακα εργαλείων). Δείτε τη [διαμόρφωση του Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Κύριος διακόπτης για τα ψευδώνυμα πύλης no-think//. Ενεργοποιημένο (προεπιλογή): το /v1/models δημοσιεύει μια παραλλαγή χωρίς συλλογισμό για κάθε επιλέξιμο μοντέλο Claude με δυνατότητα συλλογισμού και ένα αναγνωριστικό no-think/ που αποστέλλεται σε ένα αίτημα αναλύεται ξανά στο πραγματικό μοντέλο με καταστολή του συλλογισμού. Απενεργοποιημένο: δεν δημοσιεύονται παραλλαγές και ένα αναγνωριστικό no-think/ αντιμετωπίζεται όπως οποιοδήποτε άλλο άγνωστο αναγνωριστικό μοντέλου. Η επιλογή συμμετοχής/εξαίρεσης ModelSpec.noThinkingAlias ανά μοντέλο εξακολουθεί να ισχύει όταν αυτό είναι ενεργοποιημένο. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Απενεργοποίηση της δημιουργίας παραλλαγών επιπέδου συλλογισμού (π.χ. -low, -medium, -high) στον κατάλογο /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Ενεργοποίηση προσαρμοστικών εικονικών λωρίδων αποδοχής ανά μισθωτή για την αποστολή σε παρόχους (#9654): η αιχμή κίνησης ενός μισθωτή δεν προκαλεί πλέον σφάλματα 503 σε άλλον. Η μεταβλητή περιβάλλοντος OMNIROUTE_CHAT_VIRTUAL_LANES υπερισχύει αυτής της παράκαμψης του πίνακα εργαλείων· οι αλλαγές τίθενται σε ισχύ με την επανεκκίνηση του διακομιστή. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Δημοσίευση κατοπτρικών αναγνωριστικών / στο /v1/models για μοντέλα των οποίων ο κανονικός κάτοχος δεν διαθέτει ενεργό διαπιστευτήριο, αλλά μια πύλη διέλευσης με ενεργό διαπιστευτήριο τα δρομολογεί. Προειδοποίηση: όταν ενεργοποιείται καθολικά, προσθέτει καταχωρίσεις καταλόγου για όλους τους πελάτες. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Ενεργοποίηση ανίχνευσης υπολοίπου για συμβατούς κόμβους συναθροιστών New-API / One-API / Sub2API. Όταν είναι ενεργοποιημένο, οι συμβατοί κόμβοι που έχουν ορισμένη τη σημαία συναθροιστή αναφέρουν το υπόλοιπό τους στον πίνακα εργαλείων και στη δρομολόγηση προελέγχου ορίων χρήσης. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Συνέχιση των μη ροϊκών κλήσεων εργαλείων που ανήκουν στον διακομιστή έως ότου το μοντέλο επιστρέψει απόκριση αξιοποιήσιμη από τον πελάτη. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Τα στατιστικά αναζήτησης και οι πρόσφατες αναζητήσεις προσμετρούν μόνο παρόχους που εξακολουθούν να έχουν ενεργή σύνδεση (οι πάροχοι χωρίς κλειδί, όπως το duckduckgo-free, προσμετρώνται πάντα). Όταν είναι απενεργοποιημένο, διατηρείται κάθε αποθηκευμένη γραμμή αναζήτησης με αναγνωριστικό παρόχου. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Σελίδες παρόχων του πίνακα εργαλείων: εμφάνιση του σήματος «Δωρεάν» μόνο βάσει ενδείξεων που αναγνωρίζει ο πάροχος — παραλείπονται ο ευρετικός κανόνας ονόματος εμφάνισης, τα μη δυαδικά πεδία δωρεάν χρήσης και οι καταλήξεις :free σε καταχωρισμένους παρόχους χωρίς τεκμηριωμένο δωρεάν επίπεδο. Όταν είναι απενεργοποιημένο, διατηρείται ο ιστορικός κανόνας του σήματος. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Σε συγκεντρωτικές αποκρίσεις μη διαθεσιμότητας 429/503, παράλειψη του `Retry-After` όταν δεν είναι γνωστός συγκεκριμένος μελλοντικός χρόνος επανάληψης (αντί για συνθετικό 1s), προσθήκη του `error.retry_after_provenance` (`signal` \| `none`) και δυνατότητα στις διαδρομές εξάντλησης combo να διαβάζουν περιγραφικές υποδείξεις επανάληψης από σώματα JSON και απλού κειμένου της ανάντη υπηρεσίας. Το πεδίο εμφανίζεται μόνο σε αποκρίσεις που δημιουργούνται από την `unavailableResponse()`· τα άλλα σώματα 429/503 παραμένουν αμετάβλητα. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Όταν ένας στόχος combo `priority`, ο οποίος έχει επισημανθεί για εφεδρεία μόνο σε περίπτωση εξάντλησης ορίου χρήσης, διακόπτει το combo για αιτία που αποδεδειγμένα δεν σχετίζεται με το όριο χρήσης (ανοικτός ασφαλειοδιακόπτης παρόχου, παράλειψη λόγω προβλεπόμενης καθυστέρησης), απόκριση με 502 αντί για το 503 που μοιάζει να σχετίζεται με όριο χρήσης. Οι διακοπές λόγω κλειδώματος, χρόνου αναμονής, μη διαθεσιμότητας, εξάντλησης και ορίου ταυτόχρονης εκτέλεσης εξακολουθούν να επιστρέφουν 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Ένα απλό Mistral 401 (`{"detail":"Unauthorized"}`, χωρίς ρητή ένδειξη ελέγχου ταυτότητας) είναι πανομοιότυπο για ένα ανακληθέν κλειδί και για εξαντλημένο όριο χρήσης. Όταν είναι ενεργοποιημένο, θέτει τη σύνδεση σε χρόνο αναμονής αντί να τη σταθμεύει ως `expired`, έως 3 φορές ανά ώρα και ανά σύνδεση· το επόμενο συμβάν τη σταθμεύει, ώστε ένα ανακληθέν κλειδί να εξακολουθεί τελικά να εντοπίζεται. Απενεργοποιημένο από προεπιλογή: κάθε απλό Mistral 401 σταθμεύει τη σύνδεση όπως προηγουμένως. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ανάκτηση του ζωντανού καταλόγου μοντέλων xAI για συνδέσεις `xai-oauth` από το `https://api.x.ai/v1/models` με χρήση του διακριτικού κομιστή OAuth, αντί για το παγωμένο στατικό αρχικό σύνολο. Απενεργοποιημένο από προεπιλογή: το `xai-oauth` συνεχίζει να εξυπηρετεί το στατικό αρχικό σύνολο χωρίς αλλαγές. Σε οποιοδήποτε σφάλμα επίλυσης, η ανακάλυψη επιστρέφει στο αρχικό σύνολο (δεν έχει επαληθευτεί αν το x.ai δέχεται διακριτικό κομιστή OAuth σε αυτό το τελικό σημείο). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Να επιτρέπεται στην αυτόματη εκκαθάριση να διαγράφει τερματισμένες εργασίες Batch API (completed/failed/cancelled/expired) παλαιότερες από `OMNIROUTE_BATCH_RETENTION_DAYS`, μαζί με τα σημεία ελέγχου ανά γραμμή, και να εκκαθαρίζει το περιεχόμενο BLOB μεταφορτωμένων αρχείων που έχουν υπερβεί το δικό τους `expires_at`. Απενεργοποιημένο από προεπιλογή: κάθε υπάρχουσα εγκατάσταση διατηρεί αυτά τα δεδομένα ακριβώς όπως πριν, μέχρι να το ενεργοποιήσει ένας χειριστής. Η διαδρομή `DELETE /api/v1/batches/delete-completed` που ενεργοποιείται από χειριστή δεν επηρεάζεται σε καμία από τις δύο περιπτώσεις — αποτελεί ξεχωριστή, άνευ όρων δημόσια σύμβαση API. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Αυτόματη ενεργοποίηση του περιορισμού ρυθμού βάσει μοτίβων χρήσης. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Παράλειψη του τοπικού ελέγχου του OmniRoute για το παράθυρο περιβάλλοντος / τον μέγιστο αριθμό διακριτικών εισόδου σε άμεσα αιτήματα προς ένα μόνο μοντέλο. Τα όρια της upstream υπηρεσίας εξακολουθούν να ισχύουν. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Απόρριψη αιτημάτων πριν από την αποστολή, όταν το μοντέλο προορισμού δεν διαθέτει τις απαιτούμενες δυνατότητες (όραση, εργαλεία, δομημένη έξοδο, παράθυρο περιβάλλοντος). Προστατεύει τα άμεσα αιτήματα προς έναν μόνο πάροχο που παρακάμπτουν το φίλτρο συμβατότητας του επιπέδου συνδυασμών. | +| `RADAR_ENABLED` | boolean | `false` | Ενεργοποίηση της λειτουργικής μονάδας OmniRoute Radar (οθόνες ροής καταλόγου και συγχρονισμού). Απενεργοποιημένη από προεπιλογή· η ενεργοποίηση ξεκλειδώνει μόνο το περιβάλλον χρήστη — ο συγχρονισμός δεδομένων παραμένει ξεχωριστή δυνατότητα προαιρετικής συμμετοχής. | + +### Χρόνος εκτέλεσης (33) + +| Κλειδί | Τύπος | Προεπιλογή | Επανεκκίνηση | Περιγραφή | +| ------------------------------------------- | ------- | ---------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Δημιουργεί και εισάγει συνόψεις συνομιλιών όταν η συνδυαστική δρομολόγηση αλλάζει μοντέλα. Απενεργοποιήστε το για να αντιμετωπίζονται ανεξάρτητα οι αλλαγές μοντέλων και να αποτρέπονται τα αιτήματα μεταβίβασης στο παρασκήνιο για όλους τους υπάρχοντες και μελλοντικούς συνδυασμούς. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Απορρίπτει τα στοιχεία εξόδου της εσωτερικής φάσης σχολιασμού από τις ροές διέλευσης του Responses API προτού προωθηθούν στους πελάτες. Απενεργοποιήστε το για να λαμβάνετε τον ανεπεξέργαστο σχολιασμό από την ανάντη υπηρεσία. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Επιβάλλει περιορισμούς εμβέλειας στην πρόσβαση στα εργαλεία MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Συμπιέζει τις περιγραφές των εργαλείων MCP για να μειώσει τη χρήση διακριτικών. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Ενεργοποιεί την επεξεργασία εργασιών παρασκηνίου κατά τον χρόνο εκτέλεσης. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Απενεργοποιεί όλες τις υπηρεσίες παρασκηνίου (ανανέωση ορίων χρήσης, συγχρονισμός κ.λπ.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Εμπιστοσύνη στα φίλτρα RTK σε επίπεδο έργου χωρίς επικύρωση. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Εκκίνηση του διακομιστή WebSocket του πίνακα εργαλείων πραγματικού χρόνου κατά την εισαγωγή (θύρα 20132 από προεπιλογή). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Να επιτρέπεται στο Codex να χρησιμοποιεί τη μεταφορά Responses-over-WebSocket. Όταν είναι απενεργοποιημένο, το Codex επιστρέφει στη χρήση HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Να επιτρέπεται στο Codex να χρησιμοποιεί την τοπική μεταφορά WebSocket JSON-RPC του app-server (codexTransport=app-server). Όταν είναι απενεργοποιημένο, οι συνδέσεις που έχουν επιλέξει το app-server επιστρέφουν στις άλλες μεταφορές του Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Δρομολόγηση αιτημάτων που έχουν εξαντλήσει τον προϋπολογισμό στον δωρεάν πάροχο/μοντέλο έκτακτης εφεδρείας. (Δείτε παρακάτω την ενότητα [Εφεδρεία έκτακτης ανάγκης λόγω εξάντλησης προϋπολογισμού](#emergency-budget-fallback).) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Ενεργοποίηση διαφανούς πρώιμης επανάληψης για περικομμένες ανοδικές ροές SSE, προτού φτάσουν στον πελάτη οποιαδήποτε byte απόκρισης. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Να επιτρέπεται στην ανάκτηση ροής να υποβάλλει ξανά το αίτημα και να συνενώνει μια απόκριση αφού έχουν ήδη φτάσει byte στον πελάτη. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Η συνέχιση στο μέσο της ροής γίνεται ασφαλής για κλήσεις εργαλείων: να μη συνεχίζεται ποτέ μια διακοπείσα ροή αφού έχει εκπεμφθεί κλήση εργαλείου (είτε βρίσκεται σε εξέλιξη είτε έχει ήδη ολοκληρωθεί με finish_reason tool_calls) και να κλείνει μετά από μία κενή συνέχεια αντί να εξαντλείται ολόκληρος ο προϋπολογισμός. Απενεργοποιημένο: συμπεριφορά έκδοσης. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Πραγματοποίηση μίας μεταγωγής σε συγγενική σύνδεση όταν μια ροή SSE κλείνει πριν εκπέμψει οποιοδήποτε χρήσιμο πλαίσιο και έχει εξαντληθεί η περιορισμένη επανάληψη στην ίδια σύνδεση· αν δεν υπάρχει χρησιμοποιήσιμη συγγενική σύνδεση, επιστρέφεται το αρχικό σφάλμα 502 `STREAM_EARLY_EOF`. Απενεργοποιημένο από προεπιλογή: το πρόωρο EOF παραμένει τερματικό μετά την επανάληψη στην ίδια σύνδεση. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Συμπερίληψη πεδίων ονόματος κατάλληλων για εμφάνιση στις αποκρίσεις του `/v1/models`. Απενεργοποιήστε το για πελάτες που αναμένουν μόνο αναγνωριστικά μοντέλων. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Ελέγχει τον τρόπο προσθήκης προθεμάτων στα αναγνωριστικά μοντέλων στο /v1/models. Η τιμή 'dual' (προεπιλογή) εκπέμπει τόσο το ψευδώνυμο όσο και τα κανονικά προθέματα αναγνωριστικού παρόχου για συμβατότητα προς τα πίσω. Η τιμή 'alias' εκπέμπει μόνο το σύντομο πρόθεμα ψευδωνύμου (π.χ. ds-web/model, όχι deepseek-web/model). Η τιμή 'canonical' εκπέμπει μόνο το πλήρες πρόθεμα αναγνωριστικού παρόχου. Τιμές: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Ενεργοποίηση περιοδικού συγχρονισμού ELO του πίνακα κατάταξης Arena AI για τις κατατάξεις ευφυΐας των μοντέλων. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Δημοσιοποίηση κατοπτρικών αναγνωριστικών `claude//` στο `/v1/models`, ώστε η ανακάλυψη μοντέλων της πύλης Claude Code να παραθέτει μοντέλα που δεν είναι Claude. Καθολικό επίπεδο της πύλης τριών επιπέδων (η μεταβλητή περιβάλλοντος υπερισχύει της παράκαμψης του πίνακα ελέγχου). Δείτε τη [διαμόρφωση του Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Κύριος διακόπτης για τα ψευδώνυμα πύλης no-think//. Ενεργοποιημένο (προεπιλογή): το /v1/models δημοσιοποιεί μια παραλλαγή χωρίς συλλογισμό για κάθε επιλέξιμο μοντέλο Claude με δυνατότητα συλλογισμού και ένα αναγνωριστικό no-think/ που αποστέλλεται σε αίτημα αντιστοιχίζεται ξανά στο πραγματικό μοντέλο με καταστολή του συλλογισμού. Απενεργοποιημένο: δεν δημοσιοποιούνται παραλλαγές και ένα αναγνωριστικό no-think/ αντιμετωπίζεται όπως οποιοδήποτε άλλο άγνωστο αναγνωριστικό μοντέλου. Η επιλογή συμμετοχής/εξαίρεσης ανά μοντέλο μέσω του ModelSpec.noThinkingAlias εξακολουθεί να ισχύει όσο αυτό είναι ενεργοποιημένο. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Απενεργοποίηση της δημιουργίας παραλλαγών επιπέδου συλλογισμού (π.χ. -low, -medium, -high) στον κατάλογο /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Ενεργοποίηση προσαρμοζόμενων εικονικών λωρίδων αποδοχής ανά μισθωτή για την αποστολή προς παρόχους (#9654): η αιχμή κίνησης ενός μισθωτή δεν προκαλεί πλέον σφάλματα 503 σε άλλον. Η μεταβλητή περιβάλλοντος OMNIROUTE_CHAT_VIRTUAL_LANES υπερισχύει αυτής της παράκαμψης του πίνακα ελέγχου· οι αλλαγές τίθενται σε ισχύ κατά την επανεκκίνηση του διακομιστή. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Δημοσιοποιεί αναγνωριστικά κατοπτρισμού / στο /v1/models για μοντέλα των οποίων ο κανονικός κάτοχος δεν διαθέτει ενεργό διαπιστευτήριο, αλλά δρομολογούνται μέσω μιας πύλης διέλευσης με ενεργό διαπιστευτήριο. Προειδοποίηση: όταν ενεργοποιείται καθολικά, προσθέτει καταχωρίσεις καταλόγου για όλους τους πελάτες. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Ενεργοποιεί την ανίχνευση υπολοίπου για κόμβους συμβατούς με συσσωρευτές New-API / One-API / Sub2API. Όταν είναι ενεργοποιημένη, οι συμβατοί κόμβοι στους οποίους έχει οριστεί η σημαία συσσωρευτή αναφέρουν το υπόλοιπό τους στον πίνακα ελέγχου και στη δρομολόγηση προκαταρκτικού ελέγχου ορίου χρήσης. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Συνεχίζει τις κλήσεις εργαλείων που ανήκουν στον διακομιστή χωρίς ροή, έως ότου το μοντέλο επιστρέψει μια απόκριση αξιοποιήσιμη από τον πελάτη. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Τα στατιστικά αναζήτησης και οι πρόσφατες αναζητήσεις προσμετρούν μόνο παρόχους που εξακολουθούν να διαθέτουν ενεργή σύνδεση (οι πάροχοι χωρίς κλειδί, όπως ο duckduckgo-free, προσμετρώνται πάντα). Όταν είναι απενεργοποιημένη, διατηρείται κάθε αποθηκευμένη γραμμή αναζήτησης που διαθέτει αναγνωριστικό παρόχου. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Σελίδες παρόχων στον πίνακα ελέγχου: εμφανίζει το σήμα «Δωρεάν» μόνο βάσει ενδείξεων που αναγνωρίζει ο πάροχος — παραλείπει τον ευρετικό κανόνα του εμφανιζόμενου ονόματος, τα μη boolean πεδία δωρεάν χρήσης και τις καταλήξεις :free για καταχωρισμένους παρόχους χωρίς τεκμηριωμένο δωρεάν επίπεδο. Όταν είναι απενεργοποιημένη, διατηρείται ο ιστορικός κανόνας εμφάνισης του σήματος. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Σε συγκεντρωτικές αποκρίσεις μη διαθεσιμότητας 429/503, παραλείπει το `Retry-After` όταν δεν είναι γνωστός συγκεκριμένος μελλοντικός χρόνος επανάληψης (αντί για μια συνθετική τιμή 1s), προσθέτει το `error.retry_after_provenance` (`signal` \| `none`) και επιτρέπει στις διαδρομές εξάντλησης συνδυασμών να διαβάζουν ενδείξεις επανάληψης σε φυσική γλώσσα από σώματα αποκρίσεων προέλευσης σε JSON και απλό κείμενο. Το πεδίο εμφανίζεται μόνο σε αποκρίσεις που δημιουργούνται από τη `unavailableResponse()`· τα άλλα σώματα 429/503 παραμένουν αμετάβλητα. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Όταν ένας στόχος συνδυασμού `priority`, ο οποίος έχει επισημανθεί για εναλλακτική χρήση μόνο σε περίπτωση εξάντλησης του ορίου χρήσης, διακόπτει τον συνδυασμό για μια αιτία που αποδεδειγμένα δεν σχετίζεται με το όριο χρήσης (ανοικτός διακόπτης κυκλώματος παρόχου, παράλειψη λόγω προβλεπόμενης καθυστέρησης), επιστρέφει 502 αντί για το 503 που υποδηλώνει εξάντληση ορίου χρήσης. Οι διακοπές λόγω αποκλεισμού, περιόδου αναμονής, μη διαθεσιμότητας, εξάντλησης και ορίου ταυτόχρονων αιτημάτων εξακολουθούν να επιστρέφουν 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Μια σκέτη απόκριση Mistral 401 (`{"detail":"Unauthorized"}`, χωρίς ρητή ένδειξη ελέγχου ταυτότητας) είναι πανομοιότυπη τόσο για ένα ανακληθέν κλειδί όσο και για εξαντλημένο όριο χρήσης. Όταν είναι ενεργοποιημένη, θέτει τη σύνδεση σε περίοδο αναμονής αντί να τη σταθμεύει ως `expired`, το πολύ 3 φορές ανά ώρα και ανά σύνδεση· η επόμενη φορά τη σταθμεύει, ώστε ένα ανακληθέν κλειδί να εξακολουθεί τελικά να καταλήγει σε αυτήν την κατάσταση. Απενεργοποιημένη από προεπιλογή: κάθε σκέτη απόκριση Mistral 401 σταθμεύει τη σύνδεση όπως προηγουμένως. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ανάκτηση του ενεργού καταλόγου μοντέλων xAI για συνδέσεις `xai-oauth` από το `https://api.x.ai/v1/models` με χρήση του διακριτικού φορέα OAuth, αντί για το παγωμένο στατικό αρχικό σύνολο. Απενεργοποιημένο από προεπιλογή: το `xai-oauth` συνεχίζει να παρέχει το στατικό αρχικό σύνολο χωρίς αλλαγές. Σε οποιοδήποτε σφάλμα επίλυσης, η ανακάλυψη επιστρέφει στο αρχικό σύνολο (δεν έχει επαληθευτεί εάν το x.ai δέχεται διακριτικό φορέα OAuth σε αυτό το τελικό σημείο). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Επιτρέπει στην αυτόματη εκκαθάριση να διαγράφει οριστικά (ολοκληρωμένες/αποτυχημένες/ακυρωμένες/ληγμένες) εργασίες του Batch API που είναι παλαιότερες από `OMNIROUTE_BATCH_RETENTION_DAYS`, μαζί με τα σημεία ελέγχου ανά γραμμή, και να εκκαθαρίζει το περιεχόμενο BLOB των μεταφορτωμένων αρχείων μετά το δικό τους `expires_at`. Απενεργοποιημένο από προεπιλογή: κάθε υπάρχουσα εγκατάσταση διατηρεί αυτά τα δεδομένα ακριβώς όπως πριν, έως ότου ένας διαχειριστής επιλέξει να το ενεργοποιήσει. Η διαδρομή `DELETE /api/v1/batches/delete-completed`, που ενεργοποιείται από τον διαχειριστή, δεν επηρεάζεται σε καμία περίπτωση — αποτελεί ξεχωριστή, άνευ όρων δημόσια σύμβαση API. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Δεσμεύει τον επιλεγμένο λογαριασμό Antigravity για τον κύκλο ζωής ροής του αιτήματος που τον επέλεξε, ώστε μια ταυτόχρονη επανάληψη ή η μεταβίβαση διαπιστευτηρίων να μην μπορεί να επιλέξει ξανά έναν λογαριασμό που έχει ήδη δεσμευτεί σε μια ροή υπό εκτέλεση. Η δέσμευση περιορίζεται στο ζεύγος (σύνδεση, καλούμενο μοντέλο ανάντη υπηρεσίας), επομένως ένας λογαριασμός μπορεί να εξυπηρετεί ταυτόχρονα δύο διαφορετικά μοντέλα. Όταν κάθε επιλέξιμος λογαριασμός είναι ήδη δεσμευμένος για αυτό το μοντέλο, το αίτημα επιστρέφει ένα δομημένο 503 `antigravity_pool_busy` με οριοθετημένο `Retry-After`, αντί να επιβαρύνει έναν απασχολημένο λογαριασμό. Απενεργοποιημένο από προεπιλογή: η επιλογή λογαριασμού παραμένει ακριβώς όπως πριν και δεν πραγματοποιείται καμία δέσμευση. | ### CLI (5) -| Κλειδί | Τύπος | Προεπιλογή | Επανεκκίνηση | Περιγραφή | -| ------------------------------------- | ------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Ενεργοποιεί τη λειτουργία συμβατότητας για όλους τους πελάτες CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Ενεργοποιεί το επίπεδο συμβατότητας ψευδωνύμων μοντέλων. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Ενεργοποιεί τον αυτόματο συγχρονισμό δεδομένων τιμολόγησης (απαιτεί επίσης τη μεταβλητή περιβάλλοντος `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Μετά από συγχρονισμό μοντέλων παρόχου, (επαν)εγγράφει αυτόματα τα αρχεία προφίλ ~/.codex/*.config.toml από τον ενεργό κατάλογο. Δεν αλλάζει ποτέ την ενεργή/προεπιλεγμένη διαμόρφωση του Codex. Απενεργοποιημένο από προεπιλογή. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Μετά από συγχρονισμό μοντέλων παρόχου, (επαν)εγγράφει αυτόματα τα προφίλ Claude Code ~/.claude/profiles//settings.json από τον ενεργό κατάλογο. Δεν αλλάζει ποτέ την ενεργή/προεπιλεγμένη διαμόρφωση του Claude. Απενεργοποιημένο από προεπιλογή. | +| Κλειδί | Τύπος | Προεπιλογή | Επανεκκίνηση | Περιγραφή | +| ------------------------------------- | ------- | ---------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Ενεργοποίηση της λειτουργίας συμβατότητας για όλους τους πελάτες CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Ενεργοποίηση του επιπέδου συμβατότητας ψευδωνύμων μοντέλων. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Ενεργοποίηση του αυτόματου συγχρονισμού δεδομένων τιμολόγησης (απαιτείται επίσης η μεταβλητή περιβάλλοντος `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Μετά από έναν συγχρονισμό μοντέλων παρόχου, αυτόματη (επαν)εγγραφή των αρχείων προφίλ ~/.codex/*.config.toml από τον ενεργό κατάλογο. Δεν αλλάζει ποτέ την ενεργή/προεπιλεγμένη διαμόρφωση Codex. Απενεργοποιημένο από προεπιλογή. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Μετά από έναν συγχρονισμό μοντέλων παρόχου, αυτόματη (επαν)εγγραφή των προφίλ Claude Code ~/.claude/profiles//settings.json από τον ενεργό κατάλογο. Δεν αλλάζει ποτέ την ενεργή/προεπιλεγμένη διαμόρφωση Claude. Απενεργοποιημένο από προεπιλογή. | ### Υγεία (5) -| Κλειδί | Τύπος | Προεπιλογή | Περιγραφή | -| ----------------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Απενεργοποιεί το τελικό σημείο ελέγχου υγείας της τοπικής παρουσίας. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Απενεργοποιεί τον έλεγχο υγείας επικύρωσης token. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Ενεργοποιεί την πρόσβαση δικτύου στο περιβάλλον sandbox δεξιοτήτων. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Κατά τη σάρωση υγείας των proxy, μια δοκιμή που απορρίφθηκε από τον στόχο (401/403/429) μηδενίζει το σερί διαδοχικών αποτυχιών του proxy. Απενεργοποιημένο από προεπιλογή: μια απόρριψη παραμένει ουδέτερη (#10654). Μια απόκριση 5xx παραμένει ασαφής σε κάθε περίπτωση· μια απόρριψη δεν αφαιρεί, δεν απενεργοποιεί και δεν επανενεργοποιεί ποτέ έναν proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Εκτελεί τον έλεγχο ακεραιότητας/υγείας της DB κατά την εκκίνηση αφού ο διακομιστής αρχίσει να δέχεται αιτήματα (μέσω `setImmediate`), αντί να αποκλείει την εκκίνηση μέχρι να ολοκληρωθεί (#13717). Απενεργοποιημένο από προεπιλογή: η εκκίνηση αποκλείεται ακριβώς όπως πριν από αυτό το PR. | +| Κλειδί | Τύπος | Προεπιλογή | Περιγραφή | +| ----------------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Απενεργοποιεί το endpoint ελέγχου εύρυθμης λειτουργίας του τοπικού instance. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Απενεργοποιεί τον έλεγχο εύρυθμης λειτουργίας για την επικύρωση token. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Ενεργοποιεί την πρόσβαση στο δίκτυο στο περιβάλλον sandbox των skills. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Κατά τη σάρωση εύρυθμης λειτουργίας των proxy, μια δοκιμή που απορρίφθηκε από τον στόχο (401/403/429) μηδενίζει την ακολουθία διαδοχικών αποτυχιών του proxy. Απενεργοποιημένο από προεπιλογή: μια απόρριψη παραμένει ουδέτερη (#10654). Μια απόκριση 5xx παραμένει ασαφής σε κάθε περίπτωση· μια απόρριψη δεν αφαιρεί, δεν απενεργοποιεί και δεν επανενεργοποιεί ποτέ έναν proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Εκτελεί τον έλεγχο ακεραιότητας/εύρυθμης λειτουργίας της DB κατά την εκκίνηση αφού ο server αρχίσει να δέχεται αιτήματα (μέσω `setImmediate`), αντί να μπλοκάρει την εκκίνηση μέχρι να ολοκληρωθεί (#13717). Απενεργοποιημένο από προεπιλογή: η εκκίνηση μπλοκάρεται ακριβώς όπως πριν από αυτό το PR. | > [!NOTE] -> Τα `INPUT_SANITIZER_BLOCK_THRESHOLD` και το παλαιό ψευδώνυμό του +> Τα `INPUT_SANITIZER_BLOCK_THRESHOLD` και το παλαιότερο alias του > `INJECTION_GUARD_BLOCK_THRESHOLD` ρυθμίζουν τη λειτουργία `block` του > `INJECTION_GUARD_MODE`, αλλά είναι απλές μεταβλητές περιβάλλοντος που διαβάζονται από το > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> και όχι σημαίες δυνατοτήτων: δεν διαθέτουν παράκαμψη μέσω DB ούτε διακόπτη στον πίνακα ελέγχου. Δείτε το +> και όχι feature flags: δεν διαθέτουν παράκαμψη μέσω DB ούτε επιλογή εναλλαγής στον πίνακα ελέγχου. Δείτε το > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> Η στήλη `Επανεκκίνηση` επισημαίνει τις σημαίες με `requiresRestart: true` — η τιμή -> αποθηκεύεται αμέσως, αλλά τίθεται σε ισχύ μόνο μετά την επαναφόρτωση της διεργασίας. Οι σημαίες -> enum απορρίπτουν οποιαδήποτε τιμή εκτός του επιτρεπόμενου συνόλου τους (με επικύρωση στην πλευρά του διακομιστή -> τόσο στο `setFeatureFlagOverride()` όσο και στον χειριστή REST `PUT`). +> Η στήλη `Restart` επισημαίνει τα flags με `requiresRestart: true` — η τιμή +> αποθηκεύεται αμέσως, αλλά τίθεται σε ισχύ μόνο μετά την επανεκκίνηση της διεργασίας. Τα enum +> flags απορρίπτουν οποιαδήποτε τιμή εκτός του επιτρεπόμενου συνόλου τους (επικυρώνεται στην πλευρά του server +> τόσο στο `setFeatureFlagOverride()` όσο και στον handler `PUT` του REST). --- @@ -174,25 +176,25 @@ (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) υποστηρίζει: -- **Αναζήτηση** κατά κλειδί ή περιγραφή και **φιλτράρισμα** κατά κατηγορία (καθώς και μια συνθετική προβολή - **Απαιτεί επανεκκίνηση**). +- **Αναζήτηση** βάσει κλειδιού ή περιγραφής και **φιλτράρισμα** βάσει κατηγορίας (καθώς και μια συνθετική + προβολή **Απαιτεί επανεκκίνηση**). - Έναν **διακόπτη** για σημαίες boolean και μια **αναπτυσσόμενη λίστα** για σημαίες enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - Ένα **σήμα προέλευσης** ανά σημαία — `DB`, `ENV` ή `DEF` — που δείχνει από πού - προήλθε η ενεργή τιμή. -- Ένα κουμπί **Επαναφορά** (εμφανίζεται μόνο για σημαίες με προέλευση `DB`) για την κατάργηση της παράκαμψης + προήλθε η ισχύουσα τιμή. +- Ένα κουμπί **Επαναφορά** (εμφανίζεται μόνο για σημαίες που προέρχονται από `DB`) για την κατάργηση της παράκαμψης, και ένα κουμπί **Επαναφορά όλων των παρακάμψεων** στο κάτω μέρος. -- Ένα πλαίσιο ειδοποίησης **Επανεκκίνηση διακομιστή** όταν αλλάζει μια σημαία `requiresRestart`. +- Ένα banner **Επανεκκίνηση διακομιστή** όταν αλλάζει μια σημαία `requiresRestart`. ### REST API -Όλες οι λειτουργίες εκτελούνται μέσω μίας διαδρομής: +Όλες οι λειτουργίες εκτελούνται μέσω μίας ενιαίας διαδρομής: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Κάθε μέθοδος απαιτεί πιστοποιημένη συνεδρία πίνακα ελέγχου (διαφορετικά επιστρέφεται `401`). +Κάθε μέθοδος απαιτεί μια πιστοποιημένη συνεδρία πίνακα ελέγχου (διαφορετικά επιστρέφεται `401`). #### `GET /api/settings/feature-flags` -Επιστρέφει κάθε σημαία μαζί με την ενεργή τιμή, την προέλευση και μια σύνοψη. +Επιστρέφει κάθε σημαία μαζί με την ισχύουσα τιμή της, την προέλευση και μια σύνοψη. ```jsonc { @@ -210,7 +212,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... και οι 72 σημαίες + // ... και οι 74 σημαίες ], "summary": { "total": 56, @@ -224,8 +226,8 @@ #### `PUT /api/settings/feature-flags` -Ορίζει ή καταργεί μία παράκαμψη. Σώμα: `{ key: string; value?: string }`. -Η παράλειψη του `value` καταργεί την παράκαμψη (επαναφέροντας την τιμή από το env / την προεπιλογή). +Ορίζει ή καταργεί μία μεμονωμένη παράκαμψη. Σώμα: `{ key: string; value?: string }`. +Η παράλειψη του `value` καταργεί την παράκαμψη (επαναφέροντας την τιμή env / προεπιλογής). ```bash # Ορισμός παράκαμψης DB @@ -239,19 +241,19 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Η απόκριση επιστρέφει τις νέες τιμές `effectiveValue`/`source`, τις `previousValue`/ +Η απόκριση επαναλαμβάνει τα νέα `effectiveValue`/`source`, τα `previousValue`/ `previousSource` και το `requiresRestart`. Άγνωστα κλειδιά και τιμές enum εκτός επιτρεπόμενου εύρους απορρίπτονται με `400`. #### `DELETE /api/settings/feature-flags` -Διαγράφει **όλες** τις παρακάμψεις DB ταυτόχρονα, επαναφέροντας κάθε σημαία στην τιμή -env / προεπιλογής της. Επιστρέφει `{ cleared: , message: "..." }`. +Καταργεί **όλες** τις παρακάμψεις DB ταυτόχρονα, επαναφέροντας κάθε σημαία στην τιμή env / προεπιλογής +της. Επιστρέφει `{ cleared: , message: "..." }`. > [!NOTE] -> Οι σημαίες με `requiresRestart: true` τίθενται σε ισχύ μόνο μετά την επαναφόρτωση της διεργασίας. -> Η ροή επανεκκίνησης του πίνακα ελέγχου καλεί το `POST /api/restart` και στη συνέχεια ελέγχει επανειλημμένα το -> `GET /api/health/ping` μέχρι να επανέλθει ο διακομιστής. +> Οι σημαίες με `requiresRestart: true` τίθενται σε ισχύ μόνο μετά από επαναφόρτωση της διεργασίας. +> Η ροή επανεκκίνησης του πίνακα ελέγχου καλεί το `POST /api/restart` και, στη συνέχεια, πραγματοποιεί επαναλαμβανόμενα αιτήματα στο +> `GET /api/health/ping` μέχρι να επανέλθει σε λειτουργία ο διακομιστής. --- diff --git a/docs/i18n/el/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/el/docs/reference/PROVIDER_REFERENCE.md index 84e40504a008..d40e17f4323b 100644 --- a/docs/i18n/el/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/el/docs/reference/PROVIDER_REFERENCE.md @@ -4,9 +4,9 @@ --- -> **Αυτόματα δημιουργημένο** από το `src/shared/constants/providers.ts` — μην το επεξεργάζεστε χειροκίνητα. -> Αναδημιουργία με: `npm run gen:provider-reference` -> **Τελευταία δημιουργία:** 2026-09-17 +> **Αυτόματη δημιουργία** από το `src/shared/constants/providers.ts` — μην το επεξεργάζεστε χειροκίνητα. +> Αναδημιουργήστε το με: `npm run gen:provider-reference` +> **Τελευταία δημιουργία:** 2026-09-18 Σύνολο παρόχων: **359**. Δείτε παρακάτω την ανάλυση ανά κατηγορία. @@ -34,47 +34,47 @@ ## Πάροχοι χωρίς έλεγχο ταυτότητας (δεν απαιτείται κλειδί) (10) -| ID | Ψευδώνυμο | Όνομα | Ετικέτες | Ιστότοπος | Σημειώσεις | Κλήση εργαλείων | -| ----------------------- | ---------- | ------------------------- | ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | -| `aihorde` | `horde` | AI Horde | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://aihorde.net) | Δεν απαιτείται κλειδί API — χρησιμοποιείται το τεκμηριωμένο ανώνυμο κλειδί του AI Horde. Η προσθήκη ενός δωρεάν κλειδιού από το aihorde.net είναι προαιρετική και παρέχει μόνο υψηλότερη προτεραιότητα στην ουρά (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://augmentcode.com) | Δεν αποθηκεύεται κλειδί API από το OmniRoute. Εγκαταστήστε το Auggie CLI και εκτελέστε `auggie login` σε αυτό το μηχάνημα· κατόπιν, το OmniRoute το εκκινεί τοπικά για κάθε αίτημα. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://playground.ai.cloudflare.com) | Δεν απαιτούνται διαπιστευτήρια — χρησιμοποιούνται ανώνυμες συνεδρίες προγράμματος περιήγησης μέσω ενός πρωτοκόλλου WebSocket cf_agent που έχει ανακατασκευαστεί με αντίστροφη μηχανική (μεταφορά Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://developers.openai.com/codex/cli) | Δεν αποθηκεύεται διακριτικό από το OmniRoute. Ο app-server του Codex CLI διαχειρίζεται τη δική του σύνδεση στο ChatGPT (~/.codex/auth.json, με αυτόματη ανανέωση). Χρησιμοποιήστε την επιλογή «Σύνδεση με ChatGPT» εάν το CLI δεν έχει ακόμη πιστοποιηθεί. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://docs.devin.ai/work-with-devin/devin-cli) | Ο έλεγχος ταυτότητας διαχειρίζεται από το επίσημο Devin CLI στον απομονωμένο τόμο της γέφυράς του. | εξομοιωμένη | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://duckduckgo.com/duckchat) | Δεν απαιτούνται διαπιστευτήρια — το DuckDuckGo AI Chat είναι ανώνυμο και δωρεάν. | εξομοιωμένη | -| `opencode` | `oc` | OpenCode Free | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://opencode.ai) | Δεν απαιτείται κλειδί API — χρησιμοποιείται το δημόσιο δωρεάν τελικό σημείο του OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://uncloseai.com) | Δεν απαιτείται έλεγχος ταυτότητας. Το API δέχεται οποιαδήποτε μη κενή συμβολοσειρά ως κλειδί αναγνώρισης. Εάν τα παλαιότερα ενσωματωμένα μοντέλα επιστρέφουν 404, χρησιμοποιήστε Διαθέσιμα μοντέλα → Εισαγωγή από /models ή Αυτόματο συγχρονισμό· επαληθευμένο ενεργό μοντέλο: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Χωρίς έλεγχο ταυτότητας, βίντεο | [σύνδεσμος](https://veoaifree.com) | Δεν απαιτείται έλεγχος ταυτότητας. Υπάρχει περιορισμός ρυθμού σε 6 αιτήματα/ώρα ανά IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://zcode.z.ai) | Δεν αποθηκεύεται κλειδί API από το OmniRoute. Ο τοπικός app-server του ZCode χρησιμοποιεί την υπάρχουσα σύνδεση builtin:zai-coding-plan. | — | +| ID | Ψευδώνυμο | Όνομα | Ετικέτες | Ιστότοπος | Σημειώσεις | Κλήση εργαλείων | +| ----------------------- | ---------- | ------------------------- | ------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | +| `aihorde` | `horde` | AI Horde | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://aihorde.net) | Δεν απαιτείται κλειδί API — χρησιμοποιείται το τεκμηριωμένο ανώνυμο κλειδί του AI Horde. Η προσθήκη ενός δωρεάν κλειδιού από το aihorde.net είναι προαιρετική και προσφέρει μόνο υψηλότερη προτεραιότητα στην ουρά (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://augmentcode.com) | Δεν αποθηκεύεται κλειδί API από το OmniRoute. Εγκαταστήστε το Auggie CLI και εκτελέστε `auggie login` σε αυτό το μηχάνημα· στη συνέχεια, το OmniRoute το εκκινεί τοπικά για κάθε αίτημα. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://playground.ai.cloudflare.com) | Δεν απαιτούνται διαπιστευτήρια — χρησιμοποιούνται ανώνυμες συνεδρίες προγράμματος περιήγησης μέσω ενός πρωτοκόλλου cf_agent WebSocket που έχει ανακατασκευαστεί μέσω αντίστροφης μηχανικής (μεταφορά Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://developers.openai.com/codex/cli) | Δεν αποθηκεύεται διακριτικό από το OmniRoute. Ο app-server του Codex CLI διαχειρίζεται τη δική του σύνδεση στο ChatGPT (~/.codex/auth.json, με αυτόματη ανανέωση). Χρησιμοποιήστε «Σύνδεση με το ChatGPT» εάν δεν έχει πραγματοποιηθεί ακόμη έλεγχος ταυτότητας στο CLI. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://docs.devin.ai/work-with-devin/devin-cli) | Ο έλεγχος ταυτότητας ανήκει στο επίσημο Devin CLI, στον απομονωμένο τόμο της γέφυράς του. | εξομοιωμένη | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://duckduckgo.com/duckchat) | Δεν απαιτούνται διαπιστευτήρια — το DuckDuckGo AI Chat είναι ανώνυμο και δωρεάν. | εξομοιωμένη | +| `opencode` | `oc` | OpenCode Free | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://opencode.ai) | Δεν απαιτείται κλειδί API — χρησιμοποιείται το δημόσιο δωρεάν τελικό σημείο του OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://uncloseai.com) | Δεν απαιτείται έλεγχος ταυτότητας. Το API δέχεται οποιαδήποτε μη κενή συμβολοσειρά ως κλειδί αναγνώρισης. Εάν παλαιότερα ενσωματωμένα μοντέλα επιστρέφουν 404, χρησιμοποιήστε Διαθέσιμα μοντέλα → Εισαγωγή από /models ή Αυτόματος συγχρονισμός· επαληθευμένο ενεργό μοντέλο: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Χωρίς έλεγχο ταυτότητας, βίντεο | [σύνδεσμος](https://veoaifree.com) | Δεν απαιτείται έλεγχος ταυτότητας. Υπάρχει περιορισμός ρυθμού στα 6 αιτήματα/ώρα ανά IP. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Χωρίς έλεγχο ταυτότητας | [σύνδεσμος](https://zcode.z.ai) | Δεν αποθηκεύεται κλειδί API από το OmniRoute. Ο τοπικός app-server του ZCode χρησιμοποιεί την υπάρχουσα σύνδεση builtin:zai-coding-plan. | — | ## Πάροχοι OAuth (24) -| ID | Ψευδώνυμο | Όνομα | Ετικέτες | Ιστότοπος | Σημειώσεις | -| --------------- | ------------- | ------------------------- | -------- | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [σύνδεσμος](https://antigravity.google) | Εισαγάγετε τη σύνδεσή σας από το Antigravity CLI (`agy`) (επικολλήστε/μεταφορτώστε το αρχείο διακριτικού του), εντοπίστε αυτόματα μια τοπική σύνδεση CLI ή συνδεθείτε μέσω Google. Χρησιμοποιεί από κοινού το backend του Antigravity (συμπερ. των μοντέλων Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [σύνδεσμος](https://aws.amazon.com/q/developer/) | Χρησιμοποιεί το ίδιο AWS Builder ID ή την ίδια ροή εισαγόμενου διακριτικού ανανέωσης με το Kiro, αλλά διατηρεί τις συνδέσεις του Amazon Q ξεχωριστές. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [σύνδεσμος](https://cline.bot/cline-pass) | Το ClinePass είναι η συνδρομή του Cline με κόστος $9.99/μήνα, η οποία περιλαμβάνει 10 ανοικτά μοντέλα προγραμματισμού. Συνδεθείτε με τον λογαριασμό σας στο Cline (ίδια στοιχεία σύνδεσης με το Cline CLI/IDE) ή επικολλήστε απευθείας ένα κλειδί API του ClinePass (app.cline.bot → Ρυθμίσεις → Κλειδιά API). Μια συνδρομή ClinePass ξεκλειδώνει τα μοντέλα cline-pass/*. Επαναχρησιμοποιεί τη ροή OAuth του Cline WorkOS. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [σύνδεσμος](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Συνδεθείτε μέσω της επίσημης ροής κωδικού συσκευής του CLI ή επικολλήστε απευθείας ένα κλειδί API (αποστέλλεται ως Authorization: Bearer). Κατάλογος: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [σύνδεσμος](https://cli.devin.ai) | Απαιτεί το εκτελέσιμο αρχείο του Devin CLI. Εκτελέστε `devin auth login` για έλεγχο ταυτότητας ή δώστε το WINDSURF_API_KEY σας. Εγκατάσταση: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [σύνδεσμος](https://devin.ai) | Επικολλήστε ένα υπάρχον κλειδί API του Devin από μια πιστοποιημένη περίοδο λειτουργίας Devin. Η διαθεσιμότητα και τα βήματα εξαγωγής του κλειδιού διαφέρουν ανάλογα με την έκδοση του Devin και τον λογαριασμό. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Εισαγάγετε τη διεύθυνση URL της εγκατάστασης GHE (π.χ. https://ghe.company.com) στις ρυθμίσεις του παρόχου και, στη συνέχεια, πραγματοποιήστε έλεγχο ταυτότητας μέσω της ροής συσκευής. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [σύνδεσμος](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Το OAuth του GitLab Duo δεν έχει διαμορφωθεί. Καταχωρίστε μια εφαρμογή OAuth στη διεύθυνση https://gitlab.com/-/profile/applications με URI ανακατεύθυνσης http://localhost:20128/callback και πεδία πρόσβασης "ai_features read_user" και, στη συνέχεια, ορίστε το GITLAB_DUO_OAUTH_CLIENT_ID (και προαιρετικά το GITLAB_DUO_OAUTH_CLIENT_SECRET) και πραγματοποιήστε επανεκκίνηση. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Συνδεθείτε μέσω του προγράμματος περιήγησής σας ή επικολλήστε το ~/.grok/auth.json (ή το διακριτικό πρόσβασης JWT) από το Grok Build CLI· το refresh_token εναλλάσσεται αυτόματα και στις δύο περιπτώσεις. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [σύνδεσμος](https://www.kimi.com/code?aff=omniroute) | Συνδεθείτε με τον ίδιο λογαριασμό Kimi που χρησιμοποιείται από το Kimi Code CLI. Το OmniRoute χρησιμοποιεί τη ροή OAuth του CLI και τα τελικά σημεία του Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Δωρεάν βαθμίδα: 50 πιστώσεις/μήνα (~25K–100K διακριτικά). ⚠️ Οι όροι χρήσης του Kiro απαγορεύουν τη χρήση proxy/harness τρίτων. | -| `openference` | `of` | Openference | OAuth | [σύνδεσμος](https://openference.com) | Συνδεθείτε με τον λογαριασμό σας στο Openference για να δρομολογείτε αιτήματα μέσω του api.openference.com. Απαιτείται ενεργό πρόγραμμα για εξαγωγή συμπερασμάτων — το OAuth μπορεί να πραγματοποιήσει έλεγχο ταυτότητας, αλλά χωρίς ενεργό πρόγραμμα να επιστρέψει 402. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [σύνδεσμος](https://trae.ai) | Το Trae είναι ένα εγγενές στην ΤΝ IDE της ByteDance (απομακρυσμένος πράκτορας SOLO). Εξουσιοδοτήστε μέσω του trae.ai στο αναδυόμενο παράθυρο ή συνδεθείτε στο solo.trae.ai και επικολλήστε το Cloud-IDE-JWT (αποστέλλεται ως 'Authorization: Cloud-IDE-JWT ', διάρκεια ζωής ~14 ημερών) ως διακριτικό πρόσβασης· τα web_id/biz_user_id/user_unique_id/scope/tenant/region μεταδίδονται μέσω του providerSpecificData. Δεν υπάρχει ανανέωση χωρίς γραφικό περιβάλλον για επικολλημένα διακριτικά — επικολλήστε τα ξανά όταν λήξουν. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [σύνδεσμος](https://x.ai) | Συνδεθείτε μέσω xAI για να χρησιμοποιήσετε μοντέλα του api.x.ai, όπως το Grok 4.5. Αυτό είναι ξεχωριστό από τις περιόδους λειτουργίας JWT του Grok Build, οι οποίες χρησιμοποιούν το cli-chat-proxy.grok.com και ψευδώνυμα μοντέλων grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [σύνδεσμος](https://zed.dev) | Το Zed αποθηκεύει τα διαπιστευτήρια παρόχων LLM (OpenAI, Anthropic, Google, Mistral, xAI) στην κλειδοθήκη του λειτουργικού συστήματος. Χρησιμοποιήστε το παρακάτω κουμπί Εισαγωγή για αυτόματο εντοπισμό και εισαγωγή τους. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [σύνδεσμος](https://zed.dev) | Συνδεθείτε με τον λογαριασμό σας στο Zed (σύνδεση εγγενούς εφαρμογής). Το OmniRoute δημιουργεί ένα ζεύγος κλειδιών RSA μίας χρήσης και ανοίγει το zed.dev για να το εξουσιοδοτήσετε — σε απομακρυσμένη εγκατάσταση ή εγκατάσταση χωρίς γραφικό περιβάλλον, αντιγράψτε τη διεύθυνση URL επιστροφής κλήσης 127.0.0.1 που προκύπτει από τη γραμμή διευθύνσεων του προγράμματος περιήγησής σας και επικολλήστε την ξανά εδώ. Είναι ξεχωριστό από την παραπάνω καταχώριση εισαγωγής διαπιστευτηρίων 'Zed IDE': προωθεί τις ολοκληρώσεις συνομιλίας μέσω του συσσωρευτή φιλοξενούμενων μοντέλων του ίδιου του Zed (cloud.zed.dev), παρέχοντας μοντέλα Anthropic/OpenAI/Google/xAI στο πλαίσιο του προγράμματός σας στο Zed. | +| ID | Ψευδώνυμο | Όνομα | Ετικέτες | Ιστότοπος | Σημειώσεις | +| --------------- | ------------- | ------------------------- | -------- | ------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [σύνδεσμος](https://antigravity.google) | Εισαγάγετε τα στοιχεία σύνδεσής σας από το Antigravity CLI (`agy`) (επικολλήστε/μεταφορτώστε το αρχείο διακριτικού του), ανιχνεύστε αυτόματα μια τοπική σύνδεση CLI ή συνδεθείτε με τη Google. Χρησιμοποιεί από κοινού το backend του Antigravity (συμπερ. των μοντέλων Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [σύνδεσμος](https://aws.amazon.com/q/developer/) | Χρησιμοποιεί το ίδιο AWS Builder ID ή την ίδια ροή εισαγόμενου διακριτικού ανανέωσης με το Kiro, αλλά διατηρεί τις συνδέσεις Amazon Q ξεχωριστές. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [σύνδεσμος](https://cline.bot/cline-pass) | Το ClinePass είναι η συνδρομή των $9.99/μήνα του Cline, η οποία περιλαμβάνει 10 ανοικτά μοντέλα προγραμματισμού. Συνδεθείτε με τον λογαριασμό σας στο Cline (τα ίδια στοιχεία σύνδεσης με το Cline CLI/IDE) ή επικολλήστε ένα άμεσο κλειδί API του ClinePass (app.cline.bot → Ρυθμίσεις → Κλειδιά API). Μια συνδρομή ClinePass ξεκλειδώνει τα μοντέλα cline-pass/*. Επαναχρησιμοποιεί τη ροή OAuth του Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [σύνδεσμος](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Συνδεθείτε μέσω της επίσημης ροής κωδικού συσκευής του CLI ή επικολλήστε ένα άμεσο κλειδί API (αποστέλλεται ως Authorization: Bearer). Κατάλογος: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [σύνδεσμος](https://cli.devin.ai) | Απαιτεί το εκτελέσιμο αρχείο του Devin CLI. Εκτελέστε `devin auth login` για έλεγχο ταυτότητας ή καταχωρίστε το WINDSURF_API_KEY σας. Εγκατάσταση: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [σύνδεσμος](https://devin.ai) | Επικολλήστε ένα υπάρχον κλειδί API του Devin από μια πιστοποιημένη περίοδο λειτουργίας Devin. Η διαθεσιμότητα και τα βήματα εξαγωγής του κλειδιού διαφέρουν ανάλογα με την έκδοση του Devin και τον λογαριασμό. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Εισαγάγετε το URL της παρουσίας GHE σας (π.χ., https://ghe.company.com) στις ρυθμίσεις παρόχου και, στη συνέχεια, πραγματοποιήστε έλεγχο ταυτότητας μέσω της ροής συσκευής. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [σύνδεσμος](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Το GitLab Duo OAuth δεν έχει ρυθμιστεί. Καταχωρίστε μια εφαρμογή OAuth στη διεύθυνση https://gitlab.com/-/profile/applications με URI ανακατεύθυνσης http://localhost:20128/callback και εμβέλειες "ai_features read_user", έπειτα ορίστε το GITLAB_DUO_OAUTH_CLIENT_ID (και προαιρετικά το GITLAB_DUO_OAUTH_CLIENT_SECRET) και εκτελέστε επανεκκίνηση. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Συνδεθείτε μέσω του προγράμματος περιήγησής σας ή επικολλήστε το ~/.grok/auth.json σας (ή το διακριτικό πρόσβασης JWT) από το Grok Build CLI· το refresh_token εναλλάσσεται αυτόματα και στις δύο περιπτώσεις. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [σύνδεσμος](https://www.kimi.com/code?aff=omniroute) | Συνδεθείτε με τον ίδιο λογαριασμό Kimi που χρησιμοποιείται από το Kimi Code CLI. Το OmniRoute χρησιμοποιεί τη ροή OAuth του CLI και τα τελικά σημεία του Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Δωρεάν βαθμίδα: 50 πιστώσεις/μήνα (~25K–100K διακριτικά). ⚠️ Οι Όροι Χρήσης του Kiro απαγορεύουν τη χρήση proxy/harness τρίτων. | +| `openference` | `of` | Openference | OAuth | [σύνδεσμος](https://openference.com) | Συνδεθείτε με τον λογαριασμό σας στο Openference για να δρομολογείτε αιτήματα μέσω του api.openference.com. Περιλαμβάνει πρόσβαση δωρεάν βαθμίδας στα Qwen3.8 27b και Llama 3.2 3B — ανατρέξτε στο openference.com/pricing για τους ισχύοντες όρους του προγράμματος. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [σύνδεσμος](https://trae.ai) | Το Trae είναι ένα IDE εγγενές στην ΤΝ από την ByteDance (απομακρυσμένος πράκτορας SOLO). Εξουσιοδοτήστε μέσω του trae.ai στο αναδυόμενο παράθυρο ή συνδεθείτε στο solo.trae.ai και επικολλήστε το Cloud-IDE-JWT (αποστέλλεται ως 'Authorization: Cloud-IDE-JWT ', διάρκεια ζωής ~14 ημερών) ως διακριτικό πρόσβασης· τα web_id/biz_user_id/user_unique_id/scope/tenant/region μεταδίδονται μέσω του providerSpecificData. Δεν υπάρχει ανανέωση χωρίς γραφικό περιβάλλον για επικολλημένα διακριτικά — επικολλήστε τα ξανά όταν λήξουν. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [σύνδεσμος](https://x.ai) | Συνδεθείτε με το xAI για να χρησιμοποιήσετε μοντέλα του api.x.ai, όπως το Grok 4.5. Αυτό είναι ξεχωριστό από τις περιόδους λειτουργίας JWT του Grok Build, οι οποίες χρησιμοποιούν το cli-chat-proxy.grok.com και ψευδώνυμα μοντέλων grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [σύνδεσμος](https://zed.dev) | Το Zed αποθηκεύει τα διαπιστευτήρια παρόχων LLM (OpenAI, Anthropic, Google, Mistral, xAI) στην κλειδοθήκη του λειτουργικού συστήματος. Χρησιμοποιήστε το παρακάτω κουμπί Εισαγωγή για να τα εντοπίσετε και να τα εισαγάγετε αυτόματα. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [σύνδεσμος](https://zed.dev) | Συνδεθείτε με τον λογαριασμό σας στο Zed (σύνδεση μέσω εγγενούς εφαρμογής). Το OmniRoute δημιουργεί ένα εφάπαξ ζεύγος κλειδιών RSA και ανοίγει το zed.dev για να το εξουσιοδοτήσετε — σε μια απομακρυσμένη εγκατάσταση/εγκατάσταση χωρίς γραφικό περιβάλλον, αντιγράψτε το URL επιστροφής κλήσης 127.0.0.1 που προκύπτει από τη γραμμή διευθύνσεων του προγράμματος περιήγησής σας και επικολλήστε το ξανά εδώ. Διαφέρει από την παραπάνω καταχώριση εισαγωγής διαπιστευτηρίων 'Zed IDE': η συγκεκριμένη λειτουργία προωθεί μέσω proxy τις ολοκληρώσεις συνομιλίας από τον φιλοξενούμενο συναθροιστή μοντέλων του ίδιου του Zed (cloud.zed.dev), παρέχοντας πρόσβαση σε μοντέλα Anthropic/OpenAI/Google/xAI στο πλαίσιο του προγράμματός σας στο Zed. | ## Πάροχοι Web Cookie (34) @@ -117,250 +117,250 @@ ## Πάροχοι κλειδιών API (επί πληρωμή / επί πληρωμή με δωρεάν πιστώσεις) (242) -| ID | Ψευδώνυμο | Όνομα | Ετικέτες | Ιστότοπος | Σημειώσεις | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | Κλειδί API | [σύνδεσμος](https://ai.360.cn) | Αποκτήστε κλειδί API στο ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://agentrouter.org) | $200 δωρεάν πιστώσεις κατά την εγγραφή — πύλη δρομολόγησης πολλαπλών μοντέλων | -| `agnes` | `agnes` | Agnes AI | Κλειδί API, βίντεο | [σύνδεσμος](https://agnes-ai.com) | Αποκτήστε κλειδί API στο agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Κίνα) | Κλειδί API | [σύνδεσμος](https://api.agnes-ai.cn) | Αποκτήστε κλειδί API από τον ιστότοπο Agnes CN. | -| `ai21` | `ai21` | AI21 Labs | Κλειδί API | [σύνδεσμος](https://www.ai21.com) | $10 δοκιμαστικές πιστώσεις κατά την εγγραφή (ισχύουν για 3 μήνες), χωρίς να απαιτείται πιστωτική κάρτα | -| `aimlapi` | `aiml` | AI/ML API | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://aimlapi.com) | Το δωρεάν επίπεδο έχει ανασταλεί (2026) — το AI/ML API λειτουργεί πλέον μόνο με χρέωση ανάλογα με τη χρήση (ελάχιστη ανανέωση υπολοίπου $20)· δεν παρέχονται επαναλαμβανόμενες δωρεάν πιστώσεις. | -| `ainative` | `ainative` | AINative Studio | Κλειδί API | [σύνδεσμος](https://ainative.studio) | Δημιουργήστε ένα δωρεάν κλειδί API στο ainative.studio (χωρίς κάρτα) και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `aion` | `aion` | Aion Labs | Κλειδί API | [σύνδεσμος](https://www.aionlabs.ai) | Δημιουργήστε ένα δωρεάν κλειδί API στο aionlabs.ai (χωρίς κάρτα) και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | Κλειδί API | [σύνδεσμος](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Κίνα) | Κλειδί API | [σύνδεσμος](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Κλειδί API | [σύνδεσμος](https://developer.ant-ling.com/en/docs/) | Εγγραφείτε και δημιουργήστε ένα κλειδί API στην κονσόλα API του Ant Ling (https://chat.ant-ling.com/open) και, στη συνέχεια, επικολλήστε το εδώ. Το OmniRoute δρομολογεί την κίνηση συνομιλιών προς το https://api.ant-ling.com/v1/chat/completions· ο πάροχος είναι συμβατός με το OpenAI και προσφέρει επίσης μια διεπαφή συμβατή με το Anthropic. | -| `anthropic` | `anthropic` | Anthropic | Κλειδί API | [σύνδεσμος](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://anyapi.ai) | Δωρεάν πρόγραμμα: 100.000 διακριτικά ANY/ημέρα και 100 RPM για τα επιλέξιμα μοντέλα Free/Basic· δεν απαιτείται πιστωτική κάρτα. | -| `api-airforce` | `af` | Api.airforce | Κλειδί API | [σύνδεσμος](https://api.airforce) | 55 μοντέλα δωρεάν επιπέδου, συμπεριλαμβανομένων των Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | Κλειδί API | [σύνδεσμος](https://arcee.ai) | Αποκτήστε κλειδί API στο arcee.ai | -| `auriko` | `auriko` | Auriko | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://www.auriko.ai) | Το δωρεάν πρόγραμμα παρέχει 1.000 RPM πλατφόρμας και 10.000 RPM BYOK. Η εξαγωγή συμπερασμάτων μέσω της πλατφόρμας εξακολουθεί να επιβαρύνεται με το κόστος του παρόχου· δεν πρόκειται για σύνολο δωρεάν διακριτικών ή απεριόριστη δωρεάν εξαγωγή συμπερασμάτων. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | Κλειδί API, επιχειρησιακό | [σύνδεσμος](https://learn.microsoft.com/azure/ai-foundry) | Χρησιμοποιήστε το κλειδί σας για το Azure AI Foundry. Η βασική διεύθυνση URL μπορεί να είναι https://.services.ai.azure.com/openai/v1/ ή https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | Κλειδί API, επιχειρησιακό | [σύνδεσμος](https://azure.microsoft.com/products/ai-services/openai-service) | Χρησιμοποιήστε το κλειδί API σας για το Azure OpenAI. Η βασική διεύθυνση URL πρέπει να είναι το τελικό σημείο του πόρου σας, για παράδειγμα https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | Κλειδί API | [σύνδεσμος](https://b.ai) | Κλειδί API Bearer για την πύλη LLM του b.ai που είναι συμβατή με το OpenAI (διαφορετική από το TheB.AI). Δημιουργήστε ένα κλειδί στο https://docs.b.ai και, στη συνέχεια, χρησιμοποιήστε το https://api.b.ai/v1 ως βασική διεύθυνση URL συμβατή με το OpenAI. | -| `baichuan` | `baichuan` | Baichuan | Κλειδί API | [σύνδεσμος](https://www.baichuan-ai.com/) | Αποκτήστε κλειδί API στο platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | Κλειδί API | [σύνδεσμος](https://ernie.baidu.com/) | Αποκτήστε κλειδί API στο console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Κλειδί API | [σύνδεσμος](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | Κλειδί API | [σύνδεσμος](https://baseten.co) | $30 δωρεάν δοκιμαστικές πιστώσεις για εξαγωγή συμπερασμάτων μέσω GPU | -| `bazaarlink` | `bzl` | BazaarLink | Κλειδί API | [σύνδεσμος](https://bazaarlink.ai) | Χρησιμοποιήστε το κλειδί API σας για το BazaarLink (αρχίζει με sk-bl-) στο Authorization: Bearer . Το OpenAI SDK λειτουργεί με βασική διεύθυνση URL το https://bazaarlink.ai/api/v1. Τα μοντέλα χρησιμοποιούν τη μορφή provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | Κλειδί API, επιχειρησιακό | [σύνδεσμος](https://aws.amazon.com/bedrock) | Χρησιμοποιήστε το κλειδί API σας για το Amazon Bedrock και διαμορφώστε την περιοχή AWS στην οποία είναι ενεργοποιημένα τα μοντέλα σας (για παράδειγμα eu-west-2). Το OmniRoute καλεί απευθείας το εγγενές Converse API του Bedrock. | -| `black-forest-labs` | `bfl` | Black Forest Labs | Κλειδί API, εικόνα | [σύνδεσμος](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | Κλειδί API | [σύνδεσμος](https://blackbox.ai) | ⚠️ **ΠΑΡΩΧΗΜΕΝΟ.** Το api.blackbox.ai επιστρέφει HTTP 404 σε κάθε παραλλαγή διαδρομής (έλεγχος 2026-08-21)· η δημόσια διεπαφή εξαγωγής συμπερασμάτων έχει μεταφερθεί στο περιορισμένης πρόσβασης τελικό σημείο enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | Κλειδί API | [σύνδεσμος](https://www.bluesminds.com) | Δωρεάν ημερήσιες πιστώσεις pi — υποστηρίζει περισσότερα από 200 μοντέλα, συμπεριλαμβανομένων των GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | Κλειδί API | [σύνδεσμος](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | Κλειδί API | [σύνδεσμος](https://bytez.com) | $1 δωρεάν πιστώσεις, οι οποίες ανανεώνονται κάθε 4 εβδομάδες | -| `cerebras` | `cerebras` | Cerebras | Κλειδί API | [σύνδεσμος](https://inference.cerebras.ai) | Εφάπαξ πίστωση εγγραφής $5 (ισχύς 30 ημερών)· απαιτείται μέθοδος πληρωμής. Δεν πρόκειται για επαναλαμβανόμενο δωρεάν επίπεδο. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | Κλειδί API | [σύνδεσμος](https://hyper.charm.land) | 100 δωρεάν μηνιαίες Hypercredits κατά την εγγραφή | -| `chat-oripe` | `chat-oripe` | Chat Oripe | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://api.oriper.com) | Τα επίσημα μεταδεδομένα διαφημίζουν 2 εκατ. διακριτικά/μήνα, αλλά ο δημόσιος ιστότοπος και η τεκμηρίωση ήταν αποκλεισμένα κατά τον έλεγχο· θεωρήστε το όριο χρήσης και την αντιστοίχιση της επωνυμίας ως μη επιβεβαιωμένα. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://chatanywhere.tech) | Μόνο για προσωπική, εκπαιδευτική ή ερευνητική χρήση: η δημόσια τεκμηρίωση αναφέρει 10.000 πόντους/ημέρα και 200 αιτήματα/ημέρα ανά IP/κλειδί· μην το χρησιμοποιείτε για εμπορική κίνηση. | -| `cheaperinference` | `cinf` | Cheaper Inference | κλειδί API | [σύνδεσμος](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | κλειδί API | [σύνδεσμος](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://chutes.ai) | Κλειδί Bearer API για την πύλη του Chutes που είναι συμβατή με το OpenAI. | -| `clarifai` | `clarifai` | Clarifai | κλειδί API, εταιρικό | [σύνδεσμος](https://docs.clarifai.com) | Χρησιμοποιήστε το Clarifai PAT σας ή ένα κλειδί API ειδικό για την εφαρμογή. Το OmniRoute στοχεύει το τελικό σημείο που είναι συμβατό με το OpenAI στη διεύθυνση https://api.clarifai.com/v2/ext/openai/v1 και πραγματοποιεί έλεγχο ταυτότητας με Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://cloudcode.one) | Τα δημοσιευμένα δωρεάν μοντέλα περιλαμβάνουν τα glm-4.7-flash και glm-4.6v-flash· δεν έχει δημοσιευτεί αριθμητικό όριο χρήσης και η δημιουργία κλειδιού ενδέχεται να απαιτεί πίστωση ή κουπόνι. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | κλειδί API | [σύνδεσμος](https://developers.cloudflare.com/workers-ai) | Απαιτεί API Token ΚΑΙ Account ID (βρίσκεται στο dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | κλειδί API | [σύνδεσμος](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | κλειδί API | [σύνδεσμος](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | κλειδί API | [σύνδεσμος](https://cohere.com) | Δωρεάν δοκιμή: 1.000 κλήσεις API/μήνα για δοκιμές, χωρίς να απαιτείται πιστωτική κάρτα | -| `command-code` | `cmd` | Command Code | κλειδί API | [σύνδεσμος](https://commandcode.ai/) | Χρησιμοποιήστε ένα κλειδί API του Command Code. Τα αιτήματα αποστέλλονται στο τελικό σημείο /provider/v1/chat/completions του Command Code. | -| `coze` | `coze` | Coze | κλειδί API | [σύνδεσμος](https://coze.com) | Αποκτήστε κλειδί API στο coze.com/open/api | -| `crof` | `crof` | CrofAI | κλειδί API | [σύνδεσμος](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | κλειδί API | [σύνδεσμος](https://cursor.com/dashboard/api) | Επικολλήστε ένα κλειδί API χρήστη του Cursor (crsr_...) από το cursor.com/dashboard/api. Το OmniRoute το ανταλλάσσει με ένα διακριτικό συνεδρίας όταν απαιτείται· δεν χρειάζεται εγκατάσταση IDE ή cursor-agent. Η χρήση χρεώνεται στο πρόγραμμα Cursor στο οποίο ανήκει το κλειδί. | -| `dahl` | `dahl` | Dahl | κλειδί API | [σύνδεσμος](https://inference.dahl.global) | Κάντε κλικ στο «Add Account» για να δημιουργηθεί αυτόματα ένα διακριτικό ή προσθέστε ένα κλειδί API χειροκίνητα. | -| `databricks` | `databricks` | Databricks | κλειδί API, εταιρικό | [σύνδεσμος](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | κλειδί API, εταιρικό | [σύνδεσμος](https://docs.datarobot.com) | Χρησιμοποιήστε το διακριτικό API του DataRobot. Το προαιρετικό Base URL μπορεί να είναι η ρίζα του λογαριασμού (για το LLM Gateway) ή μια διεύθυνση URL ανάπτυξης κάτω από το /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | κλειδί API, εικόνα | [σύνδεσμος](https://deepai.org) | Χρησιμοποιήστε το κλειδί API του DeepAI. Αποκτήστε ένα στο deepai.org — απαιτεί συνδρομή Pro ($9.99/μήνα). | -| `deepinfra` | `deepinfra` | DeepInfra | κλειδί API | [σύνδεσμος](https://deepinfra.com) | Δωρεάν πιστώσεις εγγραφής για δοκιμές API και εξερεύνηση μοντέλων | -| `deepseek` | `ds` | DeepSeek | κλειδί API | [σύνδεσμος](https://platform.deepseek.com) | 5M δωρεάν διακριτικά κατά την εγγραφή — χωρίς να απαιτείται πιστωτική κάρτα | -| `dgrid` | `dgrid` | DGrid | κλειδί API | [σύνδεσμος](https://dgrid.ai) | Δρομολογητής δωρεάν μοντέλων του DGrid: 10 αιτήματα/λεπτό και 100 αιτήματα/ημέρα. Μια εφάπαξ ανανέωση υπολοίπου ύψους $5 ξεκλειδώνει έως και 20 αιτήματα/λεπτό και 1.000 αιτήματα/ημέρα. | -| `dify` | `dify` | Dify | κλειδί API | [σύνδεσμος](https://dify.ai) | Αποκτήστε το κλειδί API από την εγκατάσταση Dify σας. | -| `digitalocean` | `digitalocean` | DigitalOcean | κλειδί API | [σύνδεσμος](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | κλειδί API | [σύνδεσμος](https://dit.ai) | Χρησιμοποιήστε το κλειδί API του dit.ai στο Authorization: Bearer . Πλήρως συμβατό με το OpenAI — άμεση αντικατάσταση, απλώς αλλάξτε το βασικό URL σε https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | κλειδί API | [σύνδεσμος](https://doubao.com) | Αποκτήστε κλειδί API στο console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://www.dxnt.com) | Οι δωρεάν λογαριασμοί τεκμηριώνονται με όριο 100 κλήσεων/ημέρα· το όριο χρήσης ενδέχεται να αυξηθεί μέσω προσκλήσεων και μπορεί να διαφέρει ανά λογαριασμό. | -| `electronhub` | `electronhub` | Electron Hub | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://www.electronhub.ai) | Δωρεάν πρόγραμμα: 5 RPM, εβδομαδιαίες πιστώσεις $0.25 και 10 Neutrinos/ημέρα για μοντέλα :free· ισχύουν επίσης οικογενειακοί προϋπολογισμοί. | -| `empower` | `empower` | Empower | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://docs.empower.dev) | Κλειδί Bearer API για το τελικό σημείο του Empower που είναι συμβατό με το OpenAI. | -| `eurouter` | `eurouter` | EURouter | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | κλειδί API | [σύνδεσμος](https://factory.ai) | Κλειδί Bearer API για την πύλη του Factory που είναι συμβατή με το OpenAI. | -| `fal-ai` | `fal` | Fal.ai | κλειδί API, εικόνα | [σύνδεσμος](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://fastrouter.ai) | Τα μοντέλα με την κατάληξη :free επιτρέπουν 10 αιτήματα/ημέρα ανά οργανισμό και μοντέλο· η διαθεσιμότητα ενδέχεται να αλλάξει. | -| `featherless-ai` | `featherless` | Featherless AI | κλειδί API | [σύνδεσμος](https://featherless.ai) | Διατίθεται δωρεάν επίπεδο — χωρίς να απαιτείται πιστωτική κάρτα | -| `fenayai` | `fenayai` | FenayAI | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://fenayai.com) | Κλειδί Bearer API για την πύλη του FenayAI που είναι συμβατή με το OpenAI. | -| `fireworks` | `fireworks` | Fireworks AI | κλειδί API | [σύνδεσμος](https://fireworks.ai) | $1 σε δωρεάν αρχικές πιστώσεις κατά την εγγραφή για δοκιμές API | -| `free-ai` | `free-ai` | Free.ai | κλειδί API, συγκεντρωτής | [σύνδεσμος](https://free.ai) | 30.000 διακριτικά/ημέρα καλύπτουν αυτοφιλοξενούμενα μοντέλα μετά την επαλήθευση email. Η χρήση πέραν του διαθέσιμου ορίου μπορεί να χρεωθεί στο πραγματικό κόστος, ενώ τα premium εξωτερικά μοντέλα είναι επί πληρωμή. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | κλειδί API | [σύνδεσμος](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | Κλειδί API | [σύνδεσμος](https://freebuff.com) | Εισαγάγετε το διακριτικό ελέγχου ταυτότητας Freebuff / Codebuff (αποκτάται μέσω σύνδεσης από το CLI ή αυτοματοποιημένου συλλέκτη). | -| `freeinference` | `freeinference` | FreeInference | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://freeinference.org) | Δωρεάν ερευνητική πρόσβαση χωρίς κάρτα· οι αιτούντες εκτός Harvard χρειάζονται μη αυτόματη έγκριση και δεν παρέχεται δημόσια εγγύηση αριθμητικού ορίου χρήσης. | -| `freemodel-dev` | `fmd` | FreeModel.dev | Κλειδί API | [σύνδεσμος](https://freemodel.dev) | Δωρεάν πιστώσεις $300 κατά την εγγραφή — δεν απαιτείται πιστωτική κάρτα. Πρόσβαση στα GPT-5.4 και GPT-5.5 (τα πιο πρόσφατα κορυφαία μοντέλα της OpenAI) μέσω API συμβατού με OpenAI. | -| `freetheai` | `fta` | FreeTheAi | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://freetheai.xyz) | Εγγραφείτε στο Discord του FreeTheAi για να λάβετε το δωρεάν κλειδί API σας. | -| `friendliai` | `friendli` | FriendliAI | Κλειδί API | [σύνδεσμος](https://friendli.ai) | Δωρεάν βαθμίδα για serverless inference — δεν απαιτείται πιστωτική κάρτα | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | Κλειδί API | [σύνδεσμος](https://galadriel.com) | ⚠️ **ΚΑΤΑΡΓΗΘΗΚΕ.** Το api.galadriel.ai δεν επιλύεται πλέον (έλεγχος 2026-06-19)· το API inference φαίνεται να έχει διακοπεί. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | Κλειδί API | [σύνδεσμος](https://aistudio.google.com) | Διατίθεται δωρεάν βαθμίδα μέσω του Google AI Studio· ισχύουν τα τρέχοντα όρια χρήσης ανά μοντέλο και οι περιφερειακοί περιορισμοί | -| `getgoapi` | `ggo` | GoAPI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | Κλειδί API | [σύνδεσμος](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | Κλειδί API | [σύνδεσμος](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Προσωπικό διακριτικό πρόσβασης GitLab για το δημόσιο API Code Suggestions. Διαμορφώστε ένα αυτοφιλοξενούμενο βασικό URL όταν δεν χρησιμοποιείτε το gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Κλειδί API | [σύνδεσμος](https://opengateway.gitlawb.com) | Η δωρεάν πρόσβαση στο MiMo (xiaomi/mimo-v2.5) ανακλήθηκε τον 2026-05 — το Opengateway είναι πλέον πύλη πιστώσεων με χρέωση βάσει χρήσης· δεν υπάρχει επαναλαμβανόμενα δωρεάν μοντέλο. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Κλειδί API | [σύνδεσμος](https://opengateway.gitlawb.com) | Η δωρεάν προωθητική ενέργεια Nemotron έληξε τον 2026-06 — η διαδρομή GMI Cloud λειτουργεί πλέον μόνο με πιστώσεις βάσει χρήσης. | -| `glm` | `glm` | GLM Coding | Κλειδί API | [σύνδεσμος](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Κίνα) | Κλειδί API | [σύνδεσμος](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | Κλειδί API | [σύνδεσμος](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | Κλειδί API | [σύνδεσμος](https://greenpt.com) | Η δημιουργία συνδρομής API είναι δωρεάν· το inference χρεώνεται ανά token. Δεν δημοσιεύεται δωρεάν όριο χρήσης για inference. | -| `groq` | `groq` | Groq | Κλειδί API | [σύνδεσμος](https://groq.com) | Δωρεάν πρόγραμμα: όρια ανά μοντέλο (200K tokens/ημέρα ανά μοντέλο συνομιλίας· ανατρέξτε στο console.groq.com/docs/rate-limits για RPM/RPD) — χωρίς καταχωρισμένο τρόπο πληρωμής. | -| `haiper` | `hp` | Haiper | Κλειδί API, βίντεο | [σύνδεσμος](https://haiper.ai) | Αποκτήστε κλειδί API στο haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | Κλειδί API | [σύνδεσμος](https://api.hcnsec.cn) | Αποκτήστε κλειδί API στο api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://helixmind.online) | Οι ισχυρισμοί που κυκλοφορούσαν προηγουμένως περί 3 RPM/50 RPD και μη απαίτησης κάρτας δεν επιβεβαιώθηκαν κατά τον έλεγχο της 2026-08-02· το τρέχον όριο χρήσης και η χρέωση απαιτούν επαλήθευση λογαριασμού. | -| `helyxai` | `helyxai` | Helyx AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://helyxai.space) | Η τεκμηρίωση του λειτουργικού δωρεάν προγράμματος αναφέρει 100,000 tokens/ημέρα· ο ξεχωριστός διαφημιστικός ισχυρισμός του ιστοτόπου για 2M+ έρχεται σε αντίθεση με αυτό και δεν θεωρείται εγγύηση ορίου χρήσης. | -| `heroku` | `heroku` | Heroku AI | Κλειδί API, εταιρική χρήση | [σύνδεσμος](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | Κλειδί API | [σύνδεσμος](https://huggingface.co) | Δωρεάν Inference API για χιλιάδες μοντέλα (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | Κλειδί API | [σύνδεσμος](https://hyperbolic.xyz) | Δοκιμαστικές πιστώσεις $1-5 κατά την εγγραφή για serverless inference | -| `ideogram` | `ideo` | Ideogram | Κλειδί API | [σύνδεσμος](https://ideogram.ai) | Αποκτήστε κλειδί API στο ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | Κλειδί API | [σύνδεσμος](https://xinghuo.xfyun.cn) | Αποκτήστε κλειδί API στο console.xfyun.cn | -| `inception` | `inception` | Inception | Κλειδί API | [σύνδεσμος](https://docs.inceptionlabs.ai) | 10M δωρεάν tokens κατά την εγγραφή, χωρίς να απαιτείται πιστωτική κάρτα. | -| `inference-net` | `inet` | Inference.net | Κλειδί API | [σύνδεσμος](https://inference.net) | Δωρεάν πιστώσεις $25 κατά την εγγραφή, καθώς και διαθέσιμες ερευνητικές επιχορηγήσεις | -| `internlm` | `internlm` | InternLM (Intern-S1) | Κλειδί API | [σύνδεσμος](https://internlm.intern-ai.org.cn/) | Δωρεάν μηνιαίο όριο χρήσης ~1M tokens εισόδου / 3M tokens εξόδου (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (API Foundation) | Κλειδί API, ενσωματώσεις/ανακατάταξη | [σύνδεσμος](https://jina.ai) | Κλειδί API Bearer για το api.jina.ai — ενσωματώσεις, ανακατάταξη, ταξινόμηση, τμηματοποίηση και αναζήτηση. Τα κλειδιά του πίνακα ελέγχου έχουν προτεραιότητα έναντι του JINA_AI_API_KEY. Αυτή δεν είναι η κάρτα Reader / r.jina.ai και δεν ανακτά URL. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Κλειδί API | [σύνδεσμος](https://jina.ai/reader) | Κλειδί API Bearer για μετατροπή URL σε markdown μέσω του r.jina.ai (μόνο /v1/web/fetch). Δεν παρέχει τα /v1/embeddings ή /v1/rerank. Λειτουργεί το ίδιο διακριτικό Jina με το API Foundation· το OmniRoute επαναχρησιμοποιεί ένα κλειδί jina-ai από τον πίνακα ελέγχου ή το JINA_AI_API_KEY όταν αυτή η κάρτα είναι κενή. | -| `kenari` | `kenari` | Kenari | Κλειδί API | [σύνδεσμος](https://kenari.id) | Χρησιμοποιήστε το κλειδί API του Kenari (kn-...) στο Authorization: Bearer . Πλήρως συμβατό με το OpenAI. Βασικό URL του API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | Κλειδί API | [σύνδεσμος](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (παλαιό API Moonshot) | Κλειδί API | [σύνδεσμος](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | Κλειδί API | [σύνδεσμος](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | Κλειδί API | [σύνδεσμος](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | Κλειδί API, βίντεο | [σύνδεσμος](https://leonardo.ai) | Αποκτήστε κλειδί API στο leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | Κλειδί API | [σύνδεσμος](https://liquid.ai) | Αποκτήστε κλειδί API στο liquid.ai | -| `literouter` | `literouter` | LiteRouter | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://literouter.com) | Οι δωρεάν παραλλαγές μοντέλων χρησιμοποιούν την κατάληξη :free· τα ημερήσια όρια πιστώσεων διαφέρουν ανά μοντέλο και η δωρεάν είσοδος περιορίζεται στα 5.000 διακριτικά. | -| `llamagate` | `llamagate` | LlamaGate | Κλειδί API | [σύνδεσμος](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://llm.kiwi) | Το δωρεάν πρόγραμμα παρέχει τα auto και hrLLM· το δημοσιευμένο όριο των 40 αιτημάτων/ώρα ισχύει για το hrLLM. | -| `llm7` | `llm7` | LLM7.io | Κλειδί API | [σύνδεσμος](https://llm7.io) | Χρησιμοποιήστε οποιοδήποτε μη κενό κλειδί (για παράδειγμα 'unused'). Εάν παλαιότερα ενσωματωμένα μοντέλα επιστρέφουν model_unavailable, χρησιμοποιήστε Διαθέσιμα μοντέλα → Εισαγωγή από /models ή Αυτόματος συγχρονισμός· επαληθευμένο ενεργό μοντέλο: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://llmgateway.io) | Φιλοξενούμενο δωρεάν πρόγραμμα: τα μοντέλα χωρίς χρέωση περιορίζονται σε 5 αιτήματα ανά 10 λεπτά όταν ο λογαριασμός δεν διαθέτει πιστώσεις. | -| `logfare` | `logfare` | Logfare | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://logfare.ai) | Δημιουργήστε έναν δωρεάν λογαριασμό στο https://logfare.ai/register (όνομα χρήστη/κωδικός πρόσβασης, χωρίς επαλήθευση email) για να λάβετε άμεσα ένα κλειδί API και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `longcat` | `lc` | LongCat AI | Κλειδί API | [σύνδεσμος](https://longcat.chat/platform/docs) | Δωρεάν: εφάπαξ παροχή 10 εκατ. διακριτικών μετά την εγγραφή λογαριασμού και την επαλήθευση KYC (LongCat-2.0). Μόνο μία φορά — δεν αποτελεί επαναλαμβανόμενη ημερήσια/μηνιαία παροχή. | -| `magnific` | `freepik` | Magnific | Κλειδί API, εικόνα | [σύνδεσμος](https://www.magnific.com) | Αποκτήστε κλειδί API στο magnific.com/user/api-keys (κεφαλίδα x-magnific-api-key). Τα παλαιά κλειδιά προγραμματιστή Freepik εξακολουθούν να λειτουργούν. | -| `maritalk` | `maritalk` | Maritalk | Κλειδί API | [σύνδεσμος](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://meganova.ai) | Δωρεάν εγγραφή χωρίς κάρτα. Τα δημοσιευμένα όρια Tier 1 ανά μοντέλο ανέρχονται συνολικά σε 550 αιτήματα/ημέρα· δεν αποτελούν κοινό καθολικό απόθεμα και ενδέχεται να ισχύσει χρέωση υπέρβασης, εάν έχει ενεργοποιηθεί. | -| `meta-llama` | `meta` | Meta Llama API | Κλειδί API | [σύνδεσμος](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | Κλειδί API, βίντεο | [σύνδεσμος](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Κίνα) | Κλειδί API | [σύνδεσμος](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | Κλειδί API | [σύνδεσμος](https://mistral.ai) | Δωρεάν βαθμίδα Experiment: πρόσβαση με περιορισμό ρυθμού σε όλα τα μοντέλα, χωρίς να απαιτείται πιστωτική κάρτα | -| `mixedbread` | `mxbai` | Mixedbread AI | Κλειδί API | [σύνδεσμος](https://www.mixedbread.com) | Κλειδί API Bearer για το API ενσωματώσεων του Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://www.mixlayer.com) | Το μοντέλο qwen/qwen3.5-4b-free είναι δωρεάν για δημιουργία πρωτοτύπων και υπόκειται σε περιορισμό ρυθμού· δεν έχει επιβεβαιωθεί σταθερό δημόσιο όριο RPM ή ημερήσιο όριο. | -| `mnn-ai` | `mnn-ai` | MNN AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://mnnai.ru) | Δωρεάν πρόγραμμα: μηνιαίες πιστώσεις $1, 10 RPM και πρόσβαση μόνο σε μοντέλα με την ένδειξη Free. | -| `modal` | `mdl` | Modal | Κλειδί API, εταιρική χρήση | [σύνδεσμος](https://modal.com/docs) | Χρησιμοποιήστε το διακριτικό Bearer που προστατεύει την ανάπτυξη Modal, εάν είναι ενεργοποιημένο. Το βασικό URL πρέπει να παραπέμπει στη συμβατή με OpenAI εφαρμογή Modal, για παράδειγμα https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | Κλειδί API | [σύνδεσμος](https://modelscope.cn) | Δωρεάν βαθμίδα μέσω του ModelScope API-Inference — απαιτείται λογαριασμός Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | Κλειδί API | [σύνδεσμος](https://monsterapi.ai) | ⚠️ **ΚΑΤΑΡΓΗΘΗΚΕ.** Το Monster API διέκοψε τη λειτουργία του στις 2026-06-30. Χρησιμοποιήστε εναλλακτικούς παρόχους συμβατούς με OpenAI. | -| `moonshot` | `moonshot` | Kimi | Κλειδί API | [σύνδεσμος](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | Κλειδί API | [σύνδεσμος](https://morphllm.com) | Δωρεάν βαθμίδα: 250 χιλ. πιστώσεις/μήνα, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | Κλειδί API | [σύνδεσμος](https://github.com/meta-llama/llama-stack) | Χρησιμοποιήστε τη μεταβλητή περιβάλλοντος META_API_KEY ως διακριτικό Bearer. Το Muse Code CLI χρησιμοποιεί τη μορφή πρωτοκόλλου του OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://naga.ac) | Αποκτήστε κλειδί API στο naga.ac — διατίθεται εγγραφή μέσω Google/GitHub/Discord. | -| `naga-ai` | `naga-ai` | Naga AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://naga.ac) | Τα μοντέλα με την ένδειξη :free αναφέρονται δημόσια, αλλά δεν έχει επιβεβαιωθεί αριθμητικό όριο χρήσης. Η πολιτική της Naga προειδοποιεί ότι οι προτροπές και οι έξοδοι του δωρεάν επιπέδου ενδέχεται να συλλέγονται ή να χρησιμοποιούνται για εκπαίδευση. | -| `nanogpt` | `nanogpt` | NanoGPT | Κλειδί API | [σύνδεσμος](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | Κλειδί API | [σύνδεσμος](https://bynara.id) | Δημιουργήστε έναν δωρεάν λογαριασμό NaraRouter, συνδέστε το Telegram σας (απαιτείται πριν από τις αποκρίσεις του /v1) και, στη συνέχεια, επικολλήστε εδώ το κλειδί ως διακριτικό Bearer. | -| `navy` | `navy` | NavyAI | Κλειδί API | [σύνδεσμος](https://api.navy) | Δημιουργήστε ένα δωρεάν κλειδί API από τον πίνακα ελέγχου του NavyAI και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `nebius` | `nebius` | Nebius AI | Κλειδί API | [σύνδεσμος](https://nebius.com) | Πιστώσεις δοκιμής αξίας περίπου $1 κατά την εγγραφή, για δοκιμές API | -| `nlpcloud` | `nlpc` | NLP Cloud | Κλειδί API | [σύνδεσμος](https://docs.nlpcloud.com) | Χρησιμοποιήστε το κλειδί API του NLP Cloud στο Authorization: Token . Από προεπιλογή, το OmniRoute στοχεύει το τελικό σημείο chatbot στη διεύθυνση https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | Κλειδί API | [σύνδεσμος](https://nomic.ai) | Αποκτήστε κλειδί API στο atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | Κλειδί API | [σύνδεσμος](https://portal.nousresearch.com/help) | Χρησιμοποιήστε το κλειδί API του Nous Portal. Το OmniRoute στοχεύει το επίσημο, συμβατό με OpenAI τελικό σημείο εξαγωγής συμπερασμάτων στη διεύθυνση https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | Κλειδί API, βίντεο, συσσωρευτής | [σύνδεσμος](https://novita.ai) | Πιστώσεις δοκιμής αξίας $0.50 κατά την εγγραφή (ισχύουν για περίπου 1 έτος) | -| `nscale` | `nscale` | nScale | Κλειδί API | [σύνδεσμος](https://nscale.com) | Δωρεάν πιστώσεις αξίας $5 κατά την εγγραφή, για δοκιμές εξαγωγής συμπερασμάτων | -| `nube` | `nube` | Nube.sh | Κλειδί API | [σύνδεσμος](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | Κλειδί API | [σύνδεσμος](https://build.nvidia.com) | Δωρεάν πρόσβαση για ανάπτυξη: ~40 RPM, 70+ μοντέλα (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | Κλειδί API, εταιρικό | [σύνδεσμος](https://www.oracle.com/artificial-intelligence/generative-ai) | Χρησιμοποιήστε το κλειδί API του OCI Generative AI ή το διακριτικό φορέα IAM. Η βασική διεύθυνση URL μπορεί να είναι https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://ofox.ai) | Ο τρέχων κατάλογος διαφημίζει 10+ δωρεάν μοντέλα χωρίς δημόσιο αριθμητικό όριο χρήσης· εξετάστε την προέλευση από ανάντη παρόχους, καθώς και τους όρους διατήρησης και εκπαίδευσης, πριν από τη χρήση σε περιβάλλον παραγωγής. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Κλειδί API | [σύνδεσμος](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | Κλειδί API | [σύνδεσμος](https://1min.ai) | Δημιουργήστε ένα κλειδί API στη διεύθυνση https://docs.1min.ai/docs/api/create-api-key και, στη συνέχεια, επικολλήστε το εδώ. | -| `openadapter` | `oad` | OpenAdapter | Κλειδί API | [σύνδεσμος](https://openadapter.dev) | Χρησιμοποιήστε το κλειδί API του OpenAdapter στο Authorization: Bearer sk-cv-. Πλήρως συμβατό με OpenAI. Βασική διεύθυνση URL του API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | Κλειδί API | [σύνδεσμος](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | Κλειδί API | [σύνδεσμος](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | Κλειδί API | [σύνδεσμος](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | Κλειδί API | [σύνδεσμος](https://openference.com) | Δωρεάν πρόγραμμα: δοκιμή 3 ημερών με μοντέλα ανοιχτού κώδικα — δεν απαιτείται πιστωτική κάρτα | -| `openrouter` | `openrouter` | OpenRouter | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://openrouter.ai) | Δωρεάν μοντέλα με $0/token και κατάληξη :free - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | Κλειδί API | [σύνδεσμος](https://openvecta.com) | Δωρεάν πιστώσεις κατά την εγγραφή, για εξαγωγή συμπερασμάτων συμβατή με OpenAI σε LLM, ενσωματώσεις και μοντέλα συλλογισμού | -| `opper` | `opper` | Opper | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | Κλειδί API | [σύνδεσμος](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | Κλειδί API | [σύνδεσμος](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | Κλειδί API | [σύνδεσμος](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Κλειδί API | [σύνδεσμος](https://www.perplexity.ai) | Χρησιμοποιήστε το κλειδί API του Perplexity. Το OmniRoute δρομολογεί τα αναγνωριστικά μοντέλων του Agent API μέσω του συμβατού με Responses τελικού σημείου της Perplexity. | -| `piapi` | `pi` | PiAPI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | Κλειδί API | [σύνδεσμος](https://pioneer.ai) | Δωρεάν πιστώσεις χρήσης αξίας $75 — δεν απαιτείται πιστωτική κάρτα | -| `plamo` | `plamo` | PLaMo | Κλειδί API | [σύνδεσμος](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://creator.poe.com/api-reference) | Κλειδί API Bearer για το συμβατό με OpenAI API του Poe. | -| `poixe-ai` | `poixe-ai` | Poixe AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://poixe.com) | Τα τρέχοντα δημόσια δωρεάν όρια είναι μικρά και διαφέρουν ανά ομάδα μοντέλων: 2 RPM/5 RPD για μοντέλα large-cup και 20 RPM/50 RPD για μοντέλα small-cup. | -| `pollinations` | `pol` | Pollinations AI | Κλειδί API, βίντεο | [σύνδεσμος](https://pollinations.ai) | Η ανώνυμη πρόσβαση ή η πρόσβαση χωρίς κλειδί στα τεκμηριωμένα δωρεάν μοντέλα παρέχεται κατά το δυνατόν. Η τοπική επαλήθευση της v3.8.50 (2026-07-31) επέστρεψε 401 μέσω του OmniRoute και Cloudflare 1010 σε άμεσες δοκιμές προς τον ανάντη πάροχο από το ίδιο δίκτυο. Τα premium μοντέλα εξακολουθούν να απαιτούν κλειδί API του Pollinations από το enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | Κλειδί API | [σύνδεσμος](https://poolside.ai) | Τα Laguna S 2.1 και XS 2.1 είναι δωρεάν κατά την περίοδο προεπισκόπησης· δεν δημοσιεύεται αριθμητικό όριο χρήσης. | -| `predibase` | `predibase` | Predibase | Κλειδί API | [σύνδεσμος](https://predibase.com) | ⚠️ **ΚΑΤΑΡΓΗΜΕΝΟ.** Το serving.app.predibase.com δεν επιλύεται πλέον (έλεγχος 2026-06-19)· το διαχειριζόμενο API εξυπηρέτησης φαίνεται να έχει διακοπεί. | -| `publicai` | `publicai` | PublicAI | Κλειδί API | [σύνδεσμος](https://publicai.co) | Απαιτεί κλειδί API — εφάπαξ πίστωση κατά την εγγραφή και, στη συνέχεια, επί πληρωμή | -| `qianfan` | `qianfan` | Baidu Qianfan | Κλειδί API | [σύνδεσμος](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | Κλειδί API | [σύνδεσμος](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | Κλειδί API | [σύνδεσμος](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Κλειδί API | [σύνδεσμος](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | Κλειδί API, εικόνα | [σύνδεσμος](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | Κλειδί API | [σύνδεσμος](https://regolo.ai) | Αποκτήστε το κλειδί API του Regolo από το regolo.ai και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `reka` | `reka` | Reka | Κλειδί API | [σύνδεσμος](https://docs.reka.ai/chat/overview) | Χρησιμοποιήστε το κλειδί API του Reka. Το OmniRoute υποστηρίζει το συμβατό με το OpenAI βασικό URL https://api.reka.ai/v1 και στέλνει τόσο την κεφαλίδα Authorization όσο και την X-Api-Key για λόγους συμβατότητας. | -| `requesty` | `requesty` | Requesty | Κλειδί API | [σύνδεσμος](https://requesty.ai) | Δωρεάν βαθμίδα ~200 αιτήματα/ημέρα - πύλη δρομολόγησης πολλαπλών μοντέλων (300+ μοντέλα) | -| `routeway` | `routeway` | Routeway | Κλειδί API | [σύνδεσμος](https://routeway.ai) | Δημιουργήστε ένα δωρεάν κλειδί API στο routeway.ai και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `runwayml` | `runway` | Runway | Κλειδί API, βίντεο | [σύνδεσμος](https://docs.dev.runwayml.com) | Χρησιμοποιήστε το κλειδί API του Runway στην κεφαλίδα Authorization: Bearer . Το OmniRoute χρησιμοποιεί το τρέχον API του Runway στη διεύθυνση https://api.dev.runwayml.com/v1 και στέλνει αυτόματα την απαιτούμενη κεφαλίδα X-Runway-Version. | -| `sambanova` | `samba` | SambaNova | Κλειδί API | [σύνδεσμος](https://sambanova.ai) | $5 δωρεάν πιστώσεις κατά την εγγραφή (ισχύς 30 ημερών), δεν απαιτείται πιστωτική κάρτα | -| `sap` | `sap` | SAP Generative AI Hub | Κλειδί API, εταιρικό | [σύνδεσμος](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Χρησιμοποιήστε το διακριτικό bearer του SAP AI Core. Το βασικό URL μπορεί να είναι η ρίζα AI_API_URL ή ένα deploymentUrl από το Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | Κλειδί API | [σύνδεσμος](https://docs.sarvam.ai) | ₹1,000 σε δωρεάν πιστώσεις εγγραφής — δεν λήγουν ποτέ | -| `scaleway` | `scw` | Scaleway AI | Κλειδί API | [σύνδεσμος](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M δωρεάν διακριτικά για νέους λογαριασμούς — συμμόρφωση με ΕΕ/GDPR (Παρίσι), Qwen3 235B & Llama 70B | -| `sealion` | `sealion` | SEA-LION | Κλειδί API | [σύνδεσμος](https://sea-lion.ai) | Συνδεθείτε στο sea-lion.ai μέσω Google (χωρίς κάρτα, χωρίς γεωγραφικό περιορισμό), δημιουργήστε ένα κλειδί API και, στη συνέχεια, επικολλήστε το εδώ. | -| `seekai` | `ska` | SeekAi | Κλειδί API, συναθροιστής | [σύνδεσμος](https://seekai.cc) | Δημιουργήστε ένα κλειδί API στο https://seekai.cc και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | -| `segmind` | `segmind` | Segmind | Κλειδί API, εικόνα, βίντεο | [σύνδεσμος](https://segmind.com) | Χρησιμοποιήστε το κλειδί API του Segmind στην κεφαλίδα x-api-key. Το OmniRoute χρησιμοποιεί τη διεύθυνση https://api.segmind.com/v1/ και επιστρέφει απευθείας τα byte της εικόνας/του βίντεο που δημιουργήθηκε. | -| `sensenova` | `sensenova` | SenseNova | Κλειδί API | [σύνδεσμος](https://platform.sensenova.cn) | Αποκτήστε κλειδί API στο platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | Κλειδί API | [σύνδεσμος](https://cloud.siliconflow.com) | $1 σε δωρεάν πιστώσεις, καθώς και μοντέλα $0 που παρατίθενται αυτήν τη στιγμή μετά την επαλήθευση ταυτότητας· η διαθεσιμότητα και τα όρια ενδέχεται να αλλάξουν | -| `snowflake` | `snowflake` | Snowflake Cortex | Κλειδί API, εταιρικό | [σύνδεσμος](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | Κλειδί API | [σύνδεσμος](https://xinghuo.xfyun.cn) | Αποκτήστε κλειδί API στο console.xfyun.cn | -| `speka` | `speka` | Speka AI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://speka.me) | Δωρεάν πρόγραμμα: $1 μηνιαία χρήση, 10 RPM, ένα κλειδί API και πρόσβαση σε ανοικτά μοντέλα και στο περιβάλλον δοκιμών· δεν απαιτείται κάρτα. | -| `stability-ai` | `stability` | Stability AI | Κλειδί API, εικόνα | [σύνδεσμος](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | Κλειδί API | [σύνδεσμος](https://stepfun.com) | Αποκτήστε κλειδί API στο platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | Κλειδί API | [σύνδεσμος](https://ai.sumopod.com) | Χρησιμοποιήστε το κλειδί API του SumoPod (sk-...) στην κεφαλίδα Authorization: Bearer . Πλήρως συμβατό με το OpenAI. Βασικό URL του API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | Κλειδί API | [σύνδεσμος](https://suno.ai) | Επικολλήστε το cookie συνεδρίας από το suno.ai (έλεγχος ταυτότητας Clerk) | -| `synthetic` | `synthetic` | Synthetic | Κλειδί API, συναθροιστής | [σύνδεσμος](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | Κλειδί API, συναθροιστής | [σύνδεσμος](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | Κλειδί API | [σύνδεσμος](https://hunyuan.tencent.com) | Αποκτήστε κλειδί API στο console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://theb.ai) | Κλειδί API Bearer για την πύλη του TheB.AI που είναι συμβατή με το OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | Κλειδί API | [σύνδεσμος](https://docs.tinyfish.ai/fetch-api) | X-API-Key από το agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | Κλειδί API, βίντεο | [σύνδεσμος](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | Κλειδί API | [σύνδεσμος](https://agent-router.gaib.ai) | Χρησιμοποιήστε το κλειδί API του Token Kiosk στην κεφαλίδα Authorization: Bearer . Πλήρως συμβατή πύλη με το OpenAI. Βασικό URL του API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | Κλειδί API, συναθροιστής | [σύνδεσμος](https://www.tokenreply.com) | Τα μοντέλα με επισήμανση δωρεάν έχουν ημερήσια όρια ειδικά για κάθε μοντέλο και καμπάνια· δεν δημοσιεύεται σταθερό συνολικό δωρεάν όριο. | -| `tokenrouter` | `trk` | TokenRouter | Κλειδί API | [σύνδεσμος](https://tokenrouter.com) | Χρησιμοποιήστε το κλειδί API του TokenRouter στην κεφαλίδα Authorization: Bearer . Πλήρως συμβατό με το OpenAI. Βασικό URL του API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | Κλειδί API, εικόνα | [σύνδεσμος](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | Κλειδί API | [σύνδεσμος](https://docs.opentyphoon.ai) | Δωρεάν κλειδί API με όριο ρυθμού 5 req/s και 200 req/m. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Κλειδί API | [σύνδεσμος](https://uncensored.com) | Χρησιμοποιήστε το κλειδί Developer API του uncensored.com (uai_sk_live_...). Το OmniRoute το αποστέλλει ως κεφαλίδα X-api-key στο συμβατό με OpenAI endpoint https://api.uncensored.com/api/v1. Το κλειδί δεν λήγει ποτέ. Αυτή είναι η διεπαφή με χρέωση βάσει χρήσης/πιστώσεων· η συνομιλία συνδρομής χωρίς χρέωση βάσει χρήσης παρέχεται από τον ξεχωριστό πάροχο 'uc'. | -| `udio` | `udio` | Udio | Κλειδί API | [σύνδεσμος](https://udio.com) | Επικολλήστε το cookie συνεδρίας από το udio.com (έλεγχος ταυτότητας Supabase) | -| `unorouter` | `unorouter` | UnoRouter | Κλειδί API, συναθροιστής | [σύνδεσμος](https://unorouter.ai) | Τα μοντέλα με το επίθημα :free δεν αφαιρούν υπόλοιπο· το όριο είναι 1 αίτημα/λεπτό ανά δωρεάν μοντέλο και ανά χρήστη. | -| `upstage` | `upstage` | Upstage | Κλειδί API | [σύνδεσμος](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | Κλειδί API | [σύνδεσμος](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | Κλειδί API | [σύνδεσμος](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Κλειδί API, συναθροιστής | [σύνδεσμος](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | Κλειδί API, για επιχειρήσεις | [σύνδεσμος](https://cloud.google.com/vertex-ai) | Παρέχετε JSON λογαριασμού υπηρεσίας, διακριτικό πρόσβασης OAuth, κλειδί Vertex Express API ή κλειδί εξουσιοδότησης συνδεδεμένο με λογαριασμό υπηρεσίας. Η λειτουργία Express υποστηρίζει μόνο Gemini· τα μοντέλα συνεργατών απαιτούν διαπιστευτήρια περιορισμένα σε συγκεκριμένο έργο. | -| `vertex-partner` | `vp` | Vertex AI Partners | Κλειδί API, για επιχειρήσεις | [σύνδεσμος](https://cloud.google.com/vertex-ai) | Παρέχετε JSON λογαριασμού υπηρεσίας ή διαπιστευτήρια OAuth. Ένα κλειδί εξουσιοδότησης συνδεδεμένο με λογαριασμό υπηρεσίας υποστηρίζει επίσης την ανακάλυψη, αλλά η εκτέλεση συμπερασμού από μοντέλα συνεργατών απαιτεί επιπλέον το αναγνωριστικό έργου Google Cloud. Τα τυπικά κλειδιά Express υποστηρίζουν μόνο Gemini. | -| `void-ai` | `void-ai` | Void AI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://voidai.app) | Ο δημόσιος κατάλογος μοντέλων επισημαίνει ορισμένα μοντέλα ως απαιτούντα δωρεάν πρόγραμμα, αλλά η πρόσβαση παρέχεται υπό προϋποθέσεις και δεν έχει επιβεβαιωθεί αριθμητικό όριο. | -| `volcengine` | `volcengine` | Volcengine | Κλειδί API | [σύνδεσμος](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Κλειδί API | [σύνδεσμος](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Συνδέστε τον λογαριασμό σας στο Volcano Engine ή χρησιμοποιήστε ένα κλειδί API συνδρομής Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Κλειδί API | [σύνδεσμος](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Συνδέστε τον λογαριασμό σας στο Volcano Engine ή χρησιμοποιήστε ένα κλειδί API συνδρομής Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | Κλειδί API, ενσωμάτωση/ανακατάταξη | [σύνδεσμος](https://www.voyageai.com) | Κλειδί Bearer API για τα API ενσωματώσεων και ανακατάταξης του Voyage AI. | -| `wafer` | `wafer` | Wafer AI | Κλειδί API | [σύνδεσμος](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | Κλειδί API | [σύνδεσμος](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Κλειδί API, για επιχειρήσεις | [σύνδεσμος](https://www.ibm.com/products/watsonx-ai) | Χρησιμοποιήστε το διακριτικό bearer του watsonx. Η βασική διεύθυνση URL μπορεί να είναι https://.ml.cloud.ibm.com/ml/gateway/v1/ ή ένα αυτοδιαχειριζόμενο endpoint /ml/gateway/v1. | -| `writer` | `writer` | Writer | Κλειδί API | [σύνδεσμος](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | Κλειδί API | [σύνδεσμος](https://x5lab.dev) | Χρησιμοποιήστε το κλειδί X5Lab API (x5-...) στο Authorization: Bearer . Πλήρως συμβατό με OpenAI. Βασική διεύθυνση URL του API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | Κλειδί API | [σύνδεσμος](https://x.ai) | Χρησιμοποιήστε ένα επίσημο κλειδί xAI API ή συνδεθείτε με xAI OAuth. Οι συνεδρίες Grok Build JWT παραμένουν ξεχωριστός πάροχος. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Κλειδί API | [σύνδεσμος](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Κλειδί API | [σύνδεσμος](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | Κλειδί API, συναθροιστής | [σύνδεσμος](https://xkiro.com) | Δημιουργήστε έναν δωρεάν λογαριασμό στο xkiro.com και επικολλήστε το κλειδί εδώ (Bearer· γίνεται επίσης αποδεκτό το x-api-key). | -| `yi` | `yi` | Yi (01.AI) | Κλειδί API | [σύνδεσμος](https://01.ai) | Αποκτήστε κλειδί API στο platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | Κλειδί API, συναθροιστής | [σύνδεσμος](https://yolo-auto.com) | Η δωρεάν πρόσβαση API υπόκειται σε όρια αιτημάτων και προορίζεται για δοκιμές· δεν δημοσιεύεται αριθμητικό ημερήσιο όριο και δεν υπάρχει υπόσχεση ότι η δωρεάν πρόσβαση θα παρέχεται επ’ αόριστον. | -| `zai` | `zai` | Z.AI | Κλειδί API | [σύνδεσμος](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | Κλειδί API | [σύνδεσμος](https://zenmux.ai) | Χρησιμοποιήστε το κλειδί ZenMux API στο Authorization: Bearer . Το ZenMux είναι πλήρως συμβατό με OpenAI. Βασική διεύθυνση URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://www.zerolimitai.com) | Διαφημίζεται προσωρινή δωρεάν δοκιμή, αλλά οι επίσημες σελίδες αναφέρουν αντικρουόμενες διάρκειες 3 και 7 ημερών· ο ισχυρισμός για 100 κλήσεις/ημέρα δεν θεωρείται μόνιμος. | -| `zylo-api` | `zylo` | Zylo API | Κλειδί API, συναθροιστής | [σύνδεσμος](https://zyloai.net) | Βασικό πρόγραμμα: 10 RPM, 7.200 αιτήματα/ημέρα και 200.000 διακριτικά/ημέρα· περιορίζεται στα βασικά μοντέλα κειμένου. | +| ID | Ψευδώνυμο | Όνομα | Ετικέτες | Ιστότοπος | Σημειώσεις | +| ------------------------ | --------------- | ------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | Κλειδί API | [σύνδεσμος](https://ai.360.cn) | Αποκτήστε κλειδί API στο ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://agentrouter.org) | $200 δωρεάν πιστώσεις κατά την εγγραφή — πύλη δρομολόγησης πολλαπλών μοντέλων | +| `agnes` | `agnes` | Agnes AI | Κλειδί API, βίντεο | [σύνδεσμος](https://agnes-ai.com) | Αποκτήστε κλειδί API στο agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (Κίνα) | Κλειδί API | [σύνδεσμος](https://api.agnes-ai.cn) | Αποκτήστε κλειδί API από τον κινεζικό ιστότοπο της Agnes. | +| `ai21` | `ai21` | AI21 Labs | Κλειδί API | [σύνδεσμος](https://www.ai21.com) | $10 σε δοκιμαστικές πιστώσεις κατά την εγγραφή (ισχύουν για 3 μήνες), χωρίς να απαιτείται πιστωτική κάρτα | +| `aimlapi` | `aiml` | AI/ML API | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://aimlapi.com) | Η δωρεάν βαθμίδα έχει ανασταλεί (2026) — το AI/ML API λειτουργεί πλέον μόνο με χρέωση ανάλογα με τη χρήση (ελάχιστη ανανέωση υπολοίπου $20)· δεν παρέχονται επαναλαμβανόμενες δωρεάν πιστώσεις. | +| `ainative` | `ainative` | AINative Studio | Κλειδί API | [σύνδεσμος](https://ainative.studio) | Δημιουργήστε ένα δωρεάν κλειδί API στο ainative.studio (χωρίς κάρτα) και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `aion` | `aion` | Aion Labs | Κλειδί API | [σύνδεσμος](https://www.aionlabs.ai) | Δημιουργήστε ένα δωρεάν κλειδί API στο aionlabs.ai (χωρίς κάρτα) και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | Κλειδί API | [σύνδεσμος](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Κίνα) | Κλειδί API | [σύνδεσμος](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Κλειδί API | [σύνδεσμος](https://developer.ant-ling.com/en/docs/) | Εγγραφείτε και δημιουργήστε ένα κλειδί API στην κονσόλα API του Ant Ling (https://chat.ant-ling.com/open) και, στη συνέχεια, επικολλήστε το εδώ. Το OmniRoute δρομολογεί την κίνηση συνομιλιών προς το https://api.ant-ling.com/v1/chat/completions· ο πάροχος είναι συμβατός με το OpenAI και παρέχει επίσης διεπαφή συμβατή με το Anthropic. | +| `anthropic` | `anthropic` | Anthropic | Κλειδί API | [σύνδεσμος](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://anyapi.ai) | Δωρεάν πρόγραμμα: 100.000 ANY Tokens/ημέρα και 100 RPM για επιλέξιμα μοντέλα Free/Basic· δεν απαιτείται πιστωτική κάρτα. | +| `api-airforce` | `af` | Api.airforce | Κλειδί API | [σύνδεσμος](https://api.airforce) | 55 μοντέλα δωρεάν βαθμίδας, συμπεριλαμβανομένων των Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | Κλειδί API | [σύνδεσμος](https://arcee.ai) | Αποκτήστε κλειδί API στο arcee.ai | +| `auriko` | `auriko` | Auriko | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://www.auriko.ai) | Το δωρεάν πρόγραμμα παρέχει 1.000 RPM πλατφόρμας και 10.000 BYOK RPM. Η εξαγωγή συμπερασμάτων μέσω της πλατφόρμας εξακολουθεί να επιβαρύνεται με το κόστος του παρόχου· δεν πρόκειται για δωρεάν απόθεμα διακριτικών ούτε για απεριόριστη δωρεάν εξαγωγή συμπερασμάτων. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | Κλειδί API, επιχειρησιακό | [σύνδεσμος](https://learn.microsoft.com/azure/ai-foundry) | Χρησιμοποιήστε το κλειδί σας για το Azure AI Foundry. Το βασικό URL μπορεί να είναι https://.services.ai.azure.com/openai/v1/ ή https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | Κλειδί API, επιχειρησιακό | [σύνδεσμος](https://azure.microsoft.com/products/ai-services/openai-service) | Χρησιμοποιήστε το κλειδί API σας για το Azure OpenAI. Το βασικό URL πρέπει να είναι το τελικό σημείο του πόρου σας, για παράδειγμα https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | Κλειδί API | [σύνδεσμος](https://b.ai) | Κλειδί API Bearer για την πύλη LLM του b.ai που είναι συμβατή με το OpenAI (διαφορετική από το TheB.AI). Δημιουργήστε ένα κλειδί στο https://docs.b.ai και, στη συνέχεια, χρησιμοποιήστε το https://api.b.ai/v1 ως βασικό URL συμβατό με το OpenAI. | +| `baichuan` | `baichuan` | Baichuan | Κλειδί API | [σύνδεσμος](https://www.baichuan-ai.com/) | Αποκτήστε κλειδί API στο platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | Κλειδί API | [σύνδεσμος](https://ernie.baidu.com/) | Αποκτήστε κλειδί API στο console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Κλειδί API | [σύνδεσμος](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | Κλειδί API | [σύνδεσμος](https://baseten.co) | $30 σε δωρεάν δοκιμαστικές πιστώσεις για εξαγωγή συμπερασμάτων μέσω GPU | +| `bazaarlink` | `bzl` | BazaarLink | Κλειδί API | [σύνδεσμος](https://bazaarlink.ai) | Χρησιμοποιήστε το κλειδί API σας για το BazaarLink (ξεκινά με sk-bl-) στο Authorization: Bearer . Το OpenAI SDK λειτουργεί με το βασικό URL https://bazaarlink.ai/api/v1. Τα μοντέλα χρησιμοποιούν τη μορφή provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | Κλειδί API, επιχειρησιακό | [σύνδεσμος](https://aws.amazon.com/bedrock) | Χρησιμοποιήστε το κλειδί API σας για το Amazon Bedrock και διαμορφώστε την περιοχή AWS όπου είναι ενεργοποιημένα τα μοντέλα σας (για παράδειγμα eu-west-2). Το OmniRoute καλεί απευθείας το εγγενές Converse API του Bedrock. | +| `black-forest-labs` | `bfl` | Black Forest Labs | Κλειδί API, εικόνα | [σύνδεσμος](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | Κλειδί API | [σύνδεσμος](https://blackbox.ai) | ⚠️ **ΠΑΡΩΧΗΜΕΝΟ.** Το api.blackbox.ai επιστρέφει HTTP 404 σε κάθε παραλλαγή διαδρομής (σάρωση 2026-08-21)· η δημόσια διεπαφή εξαγωγής συμπερασμάτων έχει μεταφερθεί στο τελικό σημείο enterprise.blackbox.ai/v1 με περιορισμένη πρόσβαση. | +| `bluesminds` | `bm` | BluesMinds | Κλειδί API | [σύνδεσμος](https://www.bluesminds.com) | Δωρεάν ημερήσιες πιστώσεις pi — υποστηρίζει περισσότερα από 200 μοντέλα, συμπεριλαμβανομένων των GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | Κλειδί API | [σύνδεσμος](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | Κλειδί API | [σύνδεσμος](https://bytez.com) | $1 σε δωρεάν πιστώσεις, οι οποίες ανανεώνονται κάθε 4 εβδομάδες | +| `cerebras` | `cerebras` | Cerebras | Κλειδί API | [σύνδεσμος](https://inference.cerebras.ai) | Εφάπαξ πίστωση εγγραφής $5 (ισχύς 30 ημερών)· απαιτείται μέθοδος πληρωμής. Δεν αποτελεί επαναλαμβανόμενη δωρεάν βαθμίδα. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | Κλειδί API | [σύνδεσμος](https://hyper.charm.land) | 100 δωρεάν Hypercredits κάθε μήνα με την εγγραφή | +| `chat-oripe` | `chat-oripe` | Chat Oripe | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://api.oriper.com) | Τα επίσημα μεταδεδομένα διαφημίζουν 2 εκατομμύρια διακριτικά/μήνα, αλλά ο δημόσιος ιστότοπος και η τεκμηρίωση ήταν αποκλεισμένα κατά τον έλεγχο· θεωρήστε το όριο χρήσης και την αντιστοίχιση της επωνυμίας ως μη επιβεβαιωμένα. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | Κλειδί API, aggregator | [σύνδεσμος](https://chatanywhere.tech) | Μόνο για προσωπική, εκπαιδευτική ή ερευνητική χρήση: η δημόσια τεκμηρίωση αναφέρει 10.000 πόντους/ημέρα και 200 αιτήματα/ημέρα ανά IP/κλειδί· μην το χρησιμοποιείτε για εμπορική κίνηση. | +| `cheaperinference` | `cinf` | Cheaper Inference | Κλειδί API | [σύνδεσμος](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | Κλειδί API | [σύνδεσμος](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | Κλειδί API, aggregator | [σύνδεσμος](https://chutes.ai) | Κλειδί Bearer API για την πύλη του Chutes που είναι συμβατή με το OpenAI. | +| `clarifai` | `clarifai` | Clarifai | Κλειδί API, εταιρικό | [σύνδεσμος](https://docs.clarifai.com) | Χρησιμοποιήστε το Clarifai PAT σας ή ένα κλειδί API ειδικό για την εφαρμογή. Το OmniRoute χρησιμοποιεί το συμβατό με OpenAI endpoint στη διεύθυνση https://api.clarifai.com/v2/ext/openai/v1 και πραγματοποιεί έλεγχο ταυτότητας με Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Κλειδί API, aggregator | [σύνδεσμος](https://cloudcode.one) | Τα δημοσιευμένα δωρεάν μοντέλα περιλαμβάνουν τα glm-4.7-flash και glm-4.6v-flash· δεν δημοσιεύεται αριθμητικό όριο και η δημιουργία κλειδιού ενδέχεται να απαιτεί πίστωση ή κουπόνι. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Κλειδί API | [σύνδεσμος](https://developers.cloudflare.com/workers-ai) | Απαιτεί API Token ΚΑΙ Account ID (βρίσκεται στο dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | Κλειδί API | [σύνδεσμος](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | Κλειδί API | [σύνδεσμος](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | Κλειδί API | [σύνδεσμος](https://cohere.com) | Δωρεάν δοκιμή: 1.000 κλήσεις API/μήνα για δοκιμές, χωρίς να απαιτείται πιστωτική κάρτα | +| `command-code` | `cmd` | Command Code | Κλειδί API | [σύνδεσμος](https://commandcode.ai/) | Χρησιμοποιήστε ένα κλειδί API του Command Code. Τα αιτήματα αποστέλλονται στο endpoint /provider/v1/chat/completions του Command Code. | +| `coze` | `coze` | Coze | Κλειδί API | [σύνδεσμος](https://coze.com) | Αποκτήστε κλειδί API στο coze.com/open/api | +| `crof` | `crof` | CrofAI | Κλειδί API | [σύνδεσμος](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | Κλειδί API | [σύνδεσμος](https://cursor.com/dashboard/api) | Επικολλήστε ένα κλειδί API χρήστη του Cursor (crsr_...) από το cursor.com/dashboard/api. Το OmniRoute το ανταλλάσσει με ένα token συνεδρίας κατόπιν αιτήματος· δεν απαιτείται IDE ή εγκατάσταση του cursor-agent. Η χρήση χρεώνεται στο πρόγραμμα Cursor στο οποίο ανήκει το κλειδί. | +| `dahl` | `dahl` | Dahl | Κλειδί API | [σύνδεσμος](https://inference.dahl.global) | Κάντε κλικ στο «Add Account» για την αυτόματη δημιουργία ενός token ή προσθέστε χειροκίνητα ένα κλειδί API. | +| `databricks` | `databricks` | Databricks | Κλειδί API, εταιρικό | [σύνδεσμος](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | Κλειδί API, εταιρικό | [σύνδεσμος](https://docs.datarobot.com) | Χρησιμοποιήστε το API token του DataRobot. Το προαιρετικό Base URL μπορεί να είναι η ρίζα του λογαριασμού (για το LLM Gateway) ή ένα URL ανάπτυξης κάτω από το /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | Κλειδί API, εικόνα | [σύνδεσμος](https://deepai.org) | Χρησιμοποιήστε το κλειδί API του DeepAI. Αποκτήστε ένα στο deepai.org — απαιτείται συνδρομή Pro ($9.99/μήνα). | +| `deepinfra` | `deepinfra` | DeepInfra | Κλειδί API | [σύνδεσμος](https://deepinfra.com) | Δωρεάν πιστώσεις εγγραφής για δοκιμές API και εξερεύνηση μοντέλων | +| `deepseek` | `ds` | DeepSeek | Κλειδί API | [σύνδεσμος](https://platform.deepseek.com) | 5 εκατ. δωρεάν tokens κατά την εγγραφή — χωρίς να απαιτείται πιστωτική κάρτα | +| `dgrid` | `dgrid` | DGrid | Κλειδί API | [σύνδεσμος](https://dgrid.ai) | DGrid Free Models Router: 10 αιτήματα/λεπτό και 100 αιτήματα/ημέρα. Μια εφάπαξ προσθήκη υπολοίπου $5 ξεκλειδώνει έως 20 αιτήματα/λεπτό και 1.000 αιτήματα/ημέρα. | +| `dify` | `dify` | Dify | Κλειδί API | [σύνδεσμος](https://dify.ai) | Αποκτήστε το κλειδί API από το instance του Dify σας. | +| `digitalocean` | `digitalocean` | DigitalOcean | Κλειδί API | [σύνδεσμος](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | Κλειδί API | [σύνδεσμος](https://dit.ai) | Χρησιμοποιήστε το κλειδί API του dit.ai στο Authorization: Bearer . Πλήρως συμβατό με OpenAI — αντικαθιστά άμεσα την υπάρχουσα λύση· απλώς αλλάξτε το βασικό URL σε https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | Κλειδί API | [σύνδεσμος](https://doubao.com) | Αποκτήστε κλειδί API στο console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | Κλειδί API, aggregator | [σύνδεσμος](https://www.dxnt.com) | Οι δωρεάν λογαριασμοί τεκμηριώνονται με όριο 100 κλήσεων/ημέρα· το όριο ενδέχεται να αυξηθεί μέσω προσκλήσεων και μπορεί να διαφέρει ανά λογαριασμό. | +| `electronhub` | `electronhub` | Electron Hub | Κλειδί API, aggregator | [σύνδεσμος](https://www.electronhub.ai) | Δωρεάν πρόγραμμα: 5 RPM, εβδομαδιαίες πιστώσεις $0.25 και 10 Neutrinos/ημέρα για μοντέλα :free· ισχύουν επίσης οικογενειακοί προϋπολογισμοί. | +| `empower` | `empower` | Empower | Κλειδί API, aggregator | [σύνδεσμος](https://docs.empower.dev) | Κλειδί Bearer API για το συμβατό με OpenAI endpoint του Empower. | +| `eurouter` | `eurouter` | EURouter | Κλειδί API, aggregator | [σύνδεσμος](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | Κλειδί API | [σύνδεσμος](https://factory.ai) | Κλειδί Bearer API για την πύλη του Factory που είναι συμβατή με το OpenAI. | +| `fal-ai` | `fal` | Fal.ai | Κλειδί API, εικόνα | [σύνδεσμος](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | Κλειδί API, aggregator | [σύνδεσμος](https://fastrouter.ai) | Τα μοντέλα με την κατάληξη :free επιτρέπουν 10 αιτήματα/ημέρα ανά οργανισμό και μοντέλο· η διαθεσιμότητα ενδέχεται να αλλάξει. | +| `featherless-ai` | `featherless` | Featherless AI | Κλειδί API | [σύνδεσμος](https://featherless.ai) | Διατίθεται δωρεάν βαθμίδα — χωρίς να απαιτείται πιστωτική κάρτα | +| `fenayai` | `fenayai` | FenayAI | Κλειδί API, aggregator | [σύνδεσμος](https://fenayai.com) | Κλειδί Bearer API για την πύλη του FenayAI που είναι συμβατή με το OpenAI. | +| `fireworks` | `fireworks` | Fireworks AI | Κλειδί API | [σύνδεσμος](https://fireworks.ai) | $1 δωρεάν αρχική πίστωση κατά την εγγραφή για δοκιμές API | +| `free-ai` | `free-ai` | Free.ai | Κλειδί API, aggregator | [σύνδεσμος](https://free.ai) | 30.000 tokens/ημέρα καλύπτουν αυτοφιλοξενούμενα μοντέλα μετά την επαλήθευση email. Η χρήση πέρα από το διαθέσιμο όριο μπορεί να χρεωθεί στο πραγματικό κόστος, ενώ τα premium εξωτερικά μοντέλα είναι επί πληρωμή. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | Κλειδί API | [σύνδεσμος](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | Κλειδί API | [σύνδεσμος](https://freebuff.com) | Εισαγάγετε το διακριτικό ελέγχου ταυτότητας Freebuff / Codebuff (λαμβάνεται μέσω σύνδεσης από το CLI ή αυτοματοποιημένου συλλέκτη). | +| `freeinference` | `freeinference` | FreeInference | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://freeinference.org) | Δωρεάν πρόσβαση για ερευνητικούς σκοπούς χωρίς κάρτα· οι αιτούντες που δεν προέρχονται από το Harvard χρειάζονται χειροκίνητη έγκριση και δεν παρέχεται δημόσια εγγύηση αριθμητικού ορίου χρήσης. | +| `freemodel-dev` | `fmd` | FreeModel.dev | Κλειδί API | [σύνδεσμος](https://freemodel.dev) | Δωρεάν πιστώσεις αξίας $300 κατά την εγγραφή — δεν απαιτείται πιστωτική κάρτα. Πρόσβαση στα GPT-5.4 και GPT-5.5 (τα πιο πρόσφατα κορυφαία μοντέλα της OpenAI) μέσω API συμβατού με το OpenAI. | +| `freetheai` | `fta` | FreeTheAi | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://freetheai.xyz) | Εγγραφείτε στο Discord του FreeTheAi για να λάβετε το δωρεάν κλειδί API σας. | +| `friendliai` | `friendli` | FriendliAI | Κλειδί API | [σύνδεσμος](https://friendli.ai) | Δωρεάν βαθμίδα για εξαγωγή συμπερασμάτων χωρίς διακομιστή — δεν απαιτείται πιστωτική κάρτα | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://g4f.space) | Δημιουργήστε ανώνυμες πιστώσεις cake στο g4f.dev/chat ή χρησιμοποιήστε ένα κλειδί μέλους του g4f.dev (δημιουργήστε ένα στο g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | Κλειδί API | [σύνδεσμος](https://galadriel.com) | ⚠️ **ΚΑΤΑΡΓΗΜΕΝΟ.** Το api.galadriel.ai δεν επιλύεται πλέον (έλεγχος 2026-06-19)· το API εξαγωγής συμπερασμάτων φαίνεται να έχει διακοπεί. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | Κλειδί API | [σύνδεσμος](https://aistudio.google.com) | Διατίθεται δωρεάν βαθμίδα μέσω του Google AI Studio· ισχύουν τα τρέχοντα όρια χρήσης ανά μοντέλο και οι περιφερειακοί περιορισμοί | +| `getgoapi` | `ggo` | GoAPI | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | Κλειδί API | [σύνδεσμος](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | Κλειδί API | [σύνδεσμος](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Προσωπικό διακριτικό πρόσβασης GitLab για το δημόσιο API Code Suggestions. Διαμορφώστε μια αυτοφιλοξενούμενη βασική διεύθυνση URL όταν δεν χρησιμοποιείτε το gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Κλειδί API | [σύνδεσμος](https://opengateway.gitlawb.com) | Η δωρεάν πρόσβαση στο MiMo (xiaomi/mimo-v2.5) ανακλήθηκε τον 2026-05 — το Opengateway είναι πλέον πύλη πιστώσεων με χρέωση ανάλογα με τη χρήση· δεν υπάρχει επαναλαμβανόμενο δωρεάν μοντέλο. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Κλειδί API | [σύνδεσμος](https://opengateway.gitlawb.com) | Η δωρεάν προωθητική ενέργεια Nemotron έληξε τον 2026-06 — η διαδρομή GMI Cloud παρέχεται πλέον μόνο με πιστώσεις και χρέωση ανάλογα με τη χρήση. | +| `glm` | `glm` | GLM Coding | Κλειδί API | [σύνδεσμος](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Κίνα) | Κλειδί API | [σύνδεσμος](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | Κλειδί API | [σύνδεσμος](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | Κλειδί API | [σύνδεσμος](https://greenpt.com) | Η δημιουργία συνδρομής API είναι δωρεάν· η εξαγωγή συμπερασμάτων χρεώνεται ανά διακριτικό. Δεν δημοσιεύεται δωρεάν όριο εξαγωγής συμπερασμάτων. | +| `groq` | `groq` | Groq | Κλειδί API | [σύνδεσμος](https://groq.com) | Δωρεάν πρόγραμμα: όρια ανά μοντέλο (200K διακριτικά/ημέρα ανά μοντέλο συνομιλίας· δείτε το console.groq.com/docs/rate-limits για RPM/RPD) — δεν υπάρχει καταχωρισμένη μέθοδος πληρωμής. | +| `haiper` | `hp` | Haiper | Κλειδί API, βίντεο | [σύνδεσμος](https://haiper.ai) | Αποκτήστε κλειδί API στο haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | Κλειδί API | [σύνδεσμος](https://api.hcnsec.cn) | Αποκτήστε κλειδί API στο api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://helixmind.online) | Οι ισχυρισμοί που κυκλοφορούσαν προηγουμένως περί 3 RPM/50 RPD και μη απαίτησης κάρτας δεν επιβεβαιώθηκαν κατά τον έλεγχο της 2026-08-02· το τρέχον όριο χρήσης και η χρέωση απαιτούν επαλήθευση λογαριασμού. | +| `helyxai` | `helyxai` | Helyx AI | Κλειδί API, συγκεντρωτής | [σύνδεσμος](https://helyxai.space) | Η τεκμηρίωση του λειτουργικού δωρεάν προγράμματος αναφέρει 100.000 διακριτικά/ημέρα· ο ξεχωριστός διαφημιστικός ισχυρισμός του ιστοτόπου για 2M+ είναι αντιφατικός και δεν θεωρείται εγγύηση ορίου χρήσης. | +| `heroku` | `heroku` | Heroku AI | Κλειδί API, επιχειρηματική χρήση | [σύνδεσμος](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | Κλειδί API | [σύνδεσμος](https://huggingface.co) | Δωρεάν API εξαγωγής συμπερασμάτων για χιλιάδες μοντέλα (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | Κλειδί API | [σύνδεσμος](https://hyperbolic.xyz) | Δοκιμαστικές πιστώσεις αξίας $1-5 κατά την εγγραφή για εξαγωγή συμπερασμάτων χωρίς διακομιστή | +| `ideogram` | `ideo` | Ideogram | Κλειδί API | [σύνδεσμος](https://ideogram.ai) | Αποκτήστε κλειδί API στο ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | Κλειδί API | [σύνδεσμος](https://xinghuo.xfyun.cn) | Αποκτήστε κλειδί API στο console.xfyun.cn | +| `inception` | `inception` | Inception | Κλειδί API | [σύνδεσμος](https://docs.inceptionlabs.ai) | 10M δωρεάν διακριτικά κατά την εγγραφή, χωρίς να απαιτείται πιστωτική κάρτα. | +| `inference-net` | `inet` | Inference.net | Κλειδί API | [σύνδεσμος](https://inference.net) | Δωρεάν πιστώσεις αξίας $25 κατά την εγγραφή, ενώ διατίθενται επίσης ερευνητικές επιχορηγήσεις | +| `internlm` | `internlm` | InternLM (Intern-S1) | Κλειδί API | [σύνδεσμος](https://internlm.intern-ai.org.cn/) | Δωρεάν μηνιαίο όριο ~1M διακριτικά εισόδου / 3M διακριτικά εξόδου (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | Κλειδί API, ενσωμάτωση/ανακατάταξη | [σύνδεσμος](https://jina.ai) | Κλειδί API Bearer για το api.jina.ai — ενσωματώσεις, ανακατάταξη, ταξινόμηση, τμηματοποίηση και αναζήτηση. Τα κλειδιά του πίνακα ελέγχου υπερισχύουν του JINA_AI_API_KEY. Αυτή δεν είναι η κάρτα Reader / r.jina.ai και δεν ανακτά URL. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Κλειδί API | [σύνδεσμος](https://jina.ai/reader) | Κλειδί API Bearer για μετατροπή URL σε markdown μέσω του r.jina.ai (μόνο /v1/web/fetch). Δεν παρέχει τα /v1/embeddings ή /v1/rerank. Λειτουργεί το ίδιο διακριτικό Jina με το Foundation API· το OmniRoute επαναχρησιμοποιεί ένα κλειδί πίνακα ελέγχου jina-ai ή το JINA_AI_API_KEY όταν αυτή η κάρτα είναι κενή. | +| `kenari` | `kenari` | Kenari | Κλειδί API | [σύνδεσμος](https://kenari.id) | Χρησιμοποιήστε το κλειδί API του Kenari (kn-...) στο Authorization: Bearer . Πλήρως συμβατό με το OpenAI. Βασικό URL του API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | Κλειδί API | [σύνδεσμος](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (παλαιό Moonshot API) | Κλειδί API | [σύνδεσμος](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | Κλειδί API | [σύνδεσμος](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | Κλειδί API | [σύνδεσμος](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | Κλειδί API, βίντεο | [σύνδεσμος](https://leonardo.ai) | Αποκτήστε κλειδί API στη διεύθυνση leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | Κλειδί API | [σύνδεσμος](https://liquid.ai) | Αποκτήστε κλειδί API στη διεύθυνση liquid.ai | +| `literouter` | `literouter` | LiteRouter | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://literouter.com) | Οι δωρεάν παραλλαγές μοντέλων χρησιμοποιούν το επίθημα :free· τα ημερήσια όρια πιστώσεων διαφέρουν ανά μοντέλο και η δωρεάν είσοδος περιορίζεται σε 5.000 token. | +| `llamagate` | `llamagate` | LlamaGate | Κλειδί API | [σύνδεσμος](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://llm.kiwi) | Το δωρεάν πρόγραμμα παρέχει τα auto και hrLLM· το δημοσιευμένο όριο των 40 αιτημάτων/ώρα ισχύει για το hrLLM. | +| `llm7` | `llm7` | LLM7.io | Κλειδί API | [σύνδεσμος](https://llm7.io) | Χρησιμοποιήστε οποιοδήποτε μη κενό κλειδί (για παράδειγμα 'unused'). Εάν παλαιότερα ενσωματωμένα μοντέλα επιστρέφουν model_unavailable, χρησιμοποιήστε Available Models → Import from /models ή Auto-Sync· επαληθευμένο ενεργό μοντέλο: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://llmgateway.io) | Φιλοξενούμενο δωρεάν πρόγραμμα: τα μοντέλα δωρεάν τιμολόγησης περιορίζονται σε 5 αιτήματα ανά 10 λεπτά όταν ο λογαριασμός δεν διαθέτει πιστώσεις. | +| `logfare` | `logfare` | Logfare | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://logfare.ai) | Δημιουργήστε έναν δωρεάν λογαριασμό στη διεύθυνση https://logfare.ai/register (όνομα χρήστη/κωδικός πρόσβασης, χωρίς επαλήθευση email) για να λάβετε άμεσα ένα κλειδί API και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `longcat` | `lc` | LongCat AI | Κλειδί API | [σύνδεσμος](https://longcat.chat/platform/docs) | Δωρεάν: εφάπαξ παροχή 10 εκατομμυρίων token μετά την εγγραφή λογαριασμού και την επαλήθευση KYC (LongCat-2.0). Μόνο μία φορά — δεν αποτελεί επαναλαμβανόμενη ημερήσια/μηνιαία παροχή. | +| `magnific` | `freepik` | Magnific | Κλειδί API, εικόνα | [σύνδεσμος](https://www.magnific.com) | Αποκτήστε ένα κλειδί API στη διεύθυνση magnific.com/user/api-keys (κεφαλίδα x-magnific-api-key). Τα παλαιά κλειδιά προγραμματιστών του Freepik εξακολουθούν να λειτουργούν. | +| `maritalk` | `maritalk` | Maritalk | Κλειδί API | [σύνδεσμος](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://meganova.ai) | Δωρεάν εγγραφή χωρίς κάρτα. Τα δημοσιευμένα όρια ανά μοντέλο της Βαθμίδας 1 ανέρχονται συνολικά σε 550 αιτήματα/ημέρα· δεν αποτελούν κοινό καθολικό απόθεμα και ενδέχεται να ισχύσουν χρεώσεις υπέρβασης εάν είναι ενεργοποιημένες. | +| `meta-llama` | `meta` | Meta Llama API | Κλειδί API | [σύνδεσμος](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | Κλειδί API, βίντεο | [σύνδεσμος](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Κίνα) | Κλειδί API | [σύνδεσμος](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | Κλειδί API | [σύνδεσμος](https://mistral.ai) | Δωρεάν βαθμίδα Experiment: πρόσβαση με περιορισμό ρυθμού σε όλα τα μοντέλα, χωρίς να απαιτείται πιστωτική κάρτα | +| `mixedbread` | `mxbai` | Mixedbread AI | Κλειδί API | [σύνδεσμος](https://www.mixedbread.com) | Κλειδί API Bearer για το API ενσωματώσεων του Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://www.mixlayer.com) | Το μοντέλο qwen/qwen3.5-4b-free είναι δωρεάν για δημιουργία πρωτοτύπων και υπόκειται σε περιορισμό ρυθμού· δεν έχει επιβεβαιωθεί σταθερό δημόσιο όριο RPM ή ημερήσιο όριο. | +| `mnn-ai` | `mnn-ai` | MNN AI | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://mnnai.ru) | Δωρεάν πρόγραμμα: μηνιαίες πιστώσεις $1, 10 RPM και πρόσβαση μόνο σε μοντέλα με την ένδειξη Free. | +| `modal` | `mdl` | Modal | Κλειδί API, εταιρικό | [σύνδεσμος](https://modal.com/docs) | Χρησιμοποιήστε το διακριτικό Bearer που προστατεύει την ανάπτυξη Modal, εφόσον είναι ενεργοποιημένο. Το βασικό URL θα πρέπει να παραπέμπει στη συμβατή με το OpenAI εφαρμογή Modal, για παράδειγμα https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | Κλειδί API | [σύνδεσμος](https://modelscope.cn) | Δωρεάν βαθμίδα μέσω του ModelScope API-Inference — απαιτείται λογαριασμός Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | Κλειδί API | [σύνδεσμος](https://monsterapi.ai) | ⚠️ **ΚΑΤΑΡΓΗΜΕΝΟ.** Το Monster API διέκοψε τη λειτουργία του στις 2026-06-30. Χρησιμοποιήστε εναλλακτικούς παρόχους συμβατούς με το OpenAI. | +| `moonshot` | `moonshot` | Kimi | Κλειδί API | [σύνδεσμος](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | Κλειδί API | [σύνδεσμος](https://morphllm.com) | Δωρεάν βαθμίδα: 250K πιστώσεις/μήνα, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | Κλειδί API | [σύνδεσμος](https://github.com/meta-llama/llama-stack) | Χρησιμοποιήστε τη μεταβλητή περιβάλλοντος META_API_KEY ως διακριτικό Bearer. Το Muse Code CLI χρησιμοποιεί τη μορφή πρωτοκόλλου του OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | Κλειδί API, συσσωρευτής | [σύνδεσμος](https://naga.ac) | Αποκτήστε κλειδί API στο naga.ac — διατίθεται εγγραφή μέσω Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://naga.ac) | Τα μοντέλα με την ένδειξη :free παρατίθενται δημόσια, αλλά δεν έχει επιβεβαιωθεί αριθμητικό όριο χρήσης. Η πολιτική της Naga προειδοποιεί ότι οι προτροπές και οι έξοδοι του δωρεάν επιπέδου ενδέχεται να συλλέγονται ή να χρησιμοποιούνται για εκπαίδευση. | +| `nanogpt` | `nanogpt` | NanoGPT | Κλειδί API | [σύνδεσμος](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | Κλειδί API | [σύνδεσμος](https://bynara.id) | Δημιουργήστε έναν δωρεάν λογαριασμό NaraRouter, συνδέστε το Telegram σας (απαιτείται πριν από τις απαντήσεις του /v1) και, στη συνέχεια, επικολλήστε εδώ το κλειδί ως διακριτικό Bearer. | +| `navy` | `navy` | NavyAI | Κλειδί API | [σύνδεσμος](https://api.navy) | Δημιουργήστε ένα δωρεάν κλειδί API από τον πίνακα ελέγχου του NavyAI και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `nebius` | `nebius` | Nebius AI | Κλειδί API | [σύνδεσμος](https://nebius.com) | Πιστώσεις δοκιμής αξίας ~$1 κατά την εγγραφή για δοκιμές API | +| `nlpcloud` | `nlpc` | NLP Cloud | Κλειδί API | [σύνδεσμος](https://docs.nlpcloud.com) | Χρησιμοποιήστε το κλειδί API του NLP Cloud στο Authorization: Token . Από προεπιλογή, το OmniRoute χρησιμοποιεί το τελικό σημείο chatbot στη διεύθυνση https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | Κλειδί API | [σύνδεσμος](https://nomic.ai) | Αποκτήστε κλειδί API στο atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | Κλειδί API | [σύνδεσμος](https://portal.nousresearch.com/help) | Χρησιμοποιήστε το κλειδί API του Nous Portal. Το OmniRoute χρησιμοποιεί το επίσημο, συμβατό με το OpenAI τελικό σημείο εξαγωγής συμπερασμάτων στη διεύθυνση https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | Κλειδί API, βίντεο, συναθροιστής | [σύνδεσμος](https://novita.ai) | Πιστώσεις δοκιμής αξίας $0.50 κατά την εγγραφή (ισχύουν για περίπου 1 έτος) | +| `nscale` | `nscale` | nScale | Κλειδί API | [σύνδεσμος](https://nscale.com) | Δωρεάν πιστώσεις αξίας $5 κατά την εγγραφή για δοκιμές εξαγωγής συμπερασμάτων | +| `nube` | `nube` | Nube.sh | Κλειδί API | [σύνδεσμος](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | Κλειδί API | [σύνδεσμος](https://build.nvidia.com) | Δωρεάν πρόσβαση ανάπτυξης: ~40 RPM, 70+ μοντέλα (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | Κλειδί API, εταιρικό | [σύνδεσμος](https://www.oracle.com/artificial-intelligence/generative-ai) | Χρησιμοποιήστε το κλειδί API του OCI Generative AI ή το διακριτικό IAM bearer. Η βασική διεύθυνση URL μπορεί να είναι https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://ofox.ai) | Ο τρέχων κατάλογος διαφημίζει 10+ δωρεάν μοντέλα χωρίς δημόσιο αριθμητικό όριο χρήσης· ελέγξτε την προέλευση, τη διατήρηση δεδομένων και τους όρους εκπαίδευσης των ανάντη υπηρεσιών πριν από τη χρήση σε περιβάλλον παραγωγής. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Κλειδί API | [σύνδεσμος](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | Κλειδί API | [σύνδεσμος](https://1min.ai) | Δημιουργήστε ένα κλειδί API στη διεύθυνση https://docs.1min.ai/docs/api/create-api-key και, στη συνέχεια, επικολλήστε το εδώ. | +| `openadapter` | `oad` | OpenAdapter | Κλειδί API | [σύνδεσμος](https://openadapter.dev) | Χρησιμοποιήστε το κλειδί API του OpenAdapter στο Authorization: Bearer sk-cv-. Πλήρως συμβατό με το OpenAI. Βασική διεύθυνση URL του API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | Κλειδί API | [σύνδεσμος](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | Κλειδί API | [σύνδεσμος](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | Κλειδί API | [σύνδεσμος](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | Κλειδί API | [σύνδεσμος](https://openference.com) | Δωρεάν επίπεδο: περιλαμβάνει τα Qwen3.8 27b και Llama 3.2 3B — δείτε το openference.com/pricing για τους τρέχοντες όρους | +| `openrouter` | `openrouter` | OpenRouter | Κλειδί API, συναθροιστής | [σύνδεσμος](https://openrouter.ai) | Δωρεάν μοντέλα με $0/token και επίθημα :free - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | Κλειδί API | [σύνδεσμος](https://openvecta.com) | Δωρεάν πιστώσεις κατά την εγγραφή για εξαγωγή συμπερασμάτων συμβατή με το OpenAI σε LLM, ενσωματώσεις και μοντέλα συλλογισμού | +| `opper` | `opper` | Opper | Κλειδί API, συναθροιστής | [σύνδεσμος](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | Κλειδί API | [σύνδεσμος](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | Κλειδί API | [σύνδεσμος](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | Κλειδί API | [σύνδεσμος](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Κλειδί API | [σύνδεσμος](https://www.perplexity.ai) | Χρησιμοποιήστε το κλειδί API του Perplexity. Το OmniRoute δρομολογεί τα αναγνωριστικά μοντέλων του Agent API μέσω του τελικού σημείου του Perplexity που είναι συμβατό με το Responses. | +| `piapi` | `pi` | PiAPI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | Κλειδί API | [σύνδεσμος](https://pioneer.ai) | Δωρεάν πιστώσεις χρήσης αξίας $75 — δεν απαιτείται πιστωτική κάρτα | +| `plamo` | `plamo` | PLaMo | Κλειδί API | [σύνδεσμος](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | Κλειδί API, συναθροιστής | [σύνδεσμος](https://creator.poe.com/api-reference) | Κλειδί API Bearer για το συμβατό με το OpenAI API του Poe. | +| `poixe-ai` | `poixe-ai` | Poixe AI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://poixe.com) | Τα τρέχοντα δημόσια δωρεάν όρια είναι χαμηλά και διαφέρουν ανά ομάδα μοντέλων: 2 RPM/5 RPD για μοντέλα large-cup και 20 RPM/50 RPD για μοντέλα small-cup. | +| `pollinations` | `pol` | Pollinations AI | Κλειδί API, βίντεο | [σύνδεσμος](https://pollinations.ai) | Η ανώνυμη πρόσβαση χωρίς κλειδί στα τεκμηριωμένα δωρεάν μοντέλα παρέχεται χωρίς εγγύηση. Η τοπική επαλήθευση της v3.8.50 (2026-07-31) επέστρεψε 401 μέσω του OmniRoute και Cloudflare 1010 σε άμεσες δοκιμές της ανάντη υπηρεσίας από το ίδιο δίκτυο. Τα premium μοντέλα εξακολουθούν να απαιτούν κλειδί API του Pollinations από το enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | Κλειδί API | [σύνδεσμος](https://poolside.ai) | Τα Laguna S 2.1 και XS 2.1 είναι δωρεάν κατά την περίοδο Preview· δεν δημοσιεύεται αριθμητικό όριο χρήσης. | +| `predibase` | `predibase` | Predibase | Κλειδί API | [σύνδεσμος](https://predibase.com) | ⚠️ **ΚΑΤΑΡΓΗΘΗΚΕ.** Το serving.app.predibase.com δεν επιλύεται πλέον (έλεγχος 2026-06-19)· το διαχειριζόμενο API εξυπηρέτησης φαίνεται να έχει διακοπεί. | +| `publicai` | `publicai` | PublicAI | Κλειδί API | [σύνδεσμος](https://publicai.co) | Απαιτεί κλειδί API — εφάπαξ πίστωση κατά την εγγραφή και, στη συνέχεια, επί πληρωμή | +| `qianfan` | `qianfan` | Baidu Qianfan | Κλειδί API | [σύνδεσμος](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | κλειδί API | [σύνδεσμος](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | κλειδί API | [σύνδεσμος](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | κλειδί API | [σύνδεσμος](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | κλειδί API, εικόνα | [σύνδεσμος](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | κλειδί API | [σύνδεσμος](https://regolo.ai) | Αποκτήστε το κλειδί API του Regolo από το regolo.ai και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `reka` | `reka` | Reka | κλειδί API | [σύνδεσμος](https://docs.reka.ai/chat/overview) | Χρησιμοποιήστε το κλειδί API του Reka. Το OmniRoute υποστηρίζει τη βασική διεύθυνση URL https://api.reka.ai/v1 που είναι συμβατή με το OpenAI και αποστέλλει τόσο την κεφαλίδα Authorization όσο και την X-Api-Key για λόγους συμβατότητας. | +| `requesty` | `requesty` | Requesty | κλειδί API | [σύνδεσμος](https://requesty.ai) | Δωρεάν βαθμίδα ~200 αιτήματα/ημέρα - πύλη δρομολόγησης πολλαπλών μοντέλων (300+ μοντέλα) | +| `routeway` | `routeway` | Routeway | κλειδί API | [σύνδεσμος](https://routeway.ai) | Δημιουργήστε ένα δωρεάν κλειδί API στο routeway.ai και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `runwayml` | `runway` | Runway | κλειδί API, βίντεο | [σύνδεσμος](https://docs.dev.runwayml.com) | Χρησιμοποιήστε το κλειδί API του Runway στην κεφαλίδα Authorization: Bearer . Το OmniRoute χρησιμοποιεί το τρέχον API του Runway στη διεύθυνση https://api.dev.runwayml.com/v1 και αποστέλλει αυτόματα την απαιτούμενη κεφαλίδα X-Runway-Version. | +| `sambanova` | `samba` | SambaNova | κλειδί API | [σύνδεσμος](https://sambanova.ai) | $5 δωρεάν πιστώσεις κατά την εγγραφή (ισχύς 30 ημερών), χωρίς να απαιτείται πιστωτική κάρτα | +| `sap` | `sap` | SAP Generative AI Hub | κλειδί API, επιχειρησιακό | [σύνδεσμος](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Χρησιμοποιήστε το διακριτικό Bearer του SAP AI Core. Η βασική διεύθυνση URL μπορεί να είναι η ρίζα AI_API_URL ή ένα deploymentUrl από το Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | κλειδί API | [σύνδεσμος](https://docs.sarvam.ai) | ₹1.000 σε δωρεάν πιστώσεις εγγραφής — δεν λήγουν ποτέ | +| `scaleway` | `scw` | Scaleway AI | κλειδί API | [σύνδεσμος](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 εκατ. δωρεάν διακριτικά για νέους λογαριασμούς — συμμόρφωση με ΕΕ/GDPR (Παρίσι), Qwen3 235B και Llama 70B | +| `sealion` | `sealion` | SEA-LION | κλειδί API | [σύνδεσμος](https://sea-lion.ai) | Συνδεθείτε στο sea-lion.ai μέσω Google (χωρίς κάρτα, χωρίς γεωγραφικό περιορισμό), δημιουργήστε ένα κλειδί API και, στη συνέχεια, επικολλήστε το εδώ. | +| `seekai` | `ska` | SeekAi | κλειδί API, συναθροιστής | [σύνδεσμος](https://seekai.cc) | Δημιουργήστε ένα κλειδί API στο https://seekai.cc και, στη συνέχεια, επικολλήστε το εδώ ως διακριτικό Bearer. | +| `segmind` | `segmind` | Segmind | κλειδί API, εικόνα, βίντεο | [σύνδεσμος](https://segmind.com) | Χρησιμοποιήστε το κλειδί API του Segmind στην κεφαλίδα x-api-key. Το OmniRoute χρησιμοποιεί τη διεύθυνση https://api.segmind.com/v1/ και επιστρέφει απευθείας τα byte της δημιουργημένης εικόνας/του δημιουργημένου βίντεο. | +| `sensenova` | `sensenova` | SenseNova | κλειδί API | [σύνδεσμος](https://platform.sensenova.cn) | Αποκτήστε κλειδί API στο platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | κλειδί API | [σύνδεσμος](https://cloud.siliconflow.com) | $1 σε δωρεάν πιστώσεις, καθώς και μοντέλα $0 που αναφέρονται επί του παρόντος, μετά την επαλήθευση ταυτότητας· η διαθεσιμότητα και τα όρια ενδέχεται να αλλάξουν | +| `snowflake` | `snowflake` | Snowflake Cortex | κλειδί API, επιχειρησιακό | [σύνδεσμος](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | κλειδί API | [σύνδεσμος](https://xinghuo.xfyun.cn) | Αποκτήστε κλειδί API στο console.xfyun.cn | +| `speka` | `speka` | Speka AI | κλειδί API, συναθροιστής | [σύνδεσμος](https://speka.me) | Δωρεάν πρόγραμμα: $1 μηνιαίας χρήσης, 10 RPM, ένα κλειδί API και πρόσβαση σε ανοικτά μοντέλα και στο περιβάλλον δοκιμών· δεν απαιτείται κάρτα. | +| `stability-ai` | `stability` | Stability AI | κλειδί API, εικόνα | [σύνδεσμος](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | κλειδί API | [σύνδεσμος](https://stepfun.com) | Αποκτήστε κλειδί API στο platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | κλειδί API | [σύνδεσμος](https://ai.sumopod.com) | Χρησιμοποιήστε το κλειδί API του SumoPod (sk-...) στην κεφαλίδα Authorization: Bearer . Πλήρως συμβατό με το OpenAI. Βασική διεύθυνση URL του API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | κλειδί API | [σύνδεσμος](https://suno.ai) | Επικολλήστε το cookie συνεδρίας από το suno.ai (έλεγχος ταυτότητας Clerk) | +| `synthetic` | `synthetic` | Synthetic | κλειδί API, συναθροιστής | [σύνδεσμος](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | κλειδί API, συναθροιστής | [σύνδεσμος](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | κλειδί API | [σύνδεσμος](https://hunyuan.tencent.com) | Αποκτήστε κλειδί API στο console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | κλειδί API, συναθροιστής | [σύνδεσμος](https://theb.ai) | Κλειδί API Bearer για την πύλη του TheB.AI που είναι συμβατή με το OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | κλειδί API | [σύνδεσμος](https://docs.tinyfish.ai/fetch-api) | X-API-Key από το agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | κλειδί API, βίντεο | [σύνδεσμος](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | κλειδί API | [σύνδεσμος](https://agent-router.gaib.ai) | Χρησιμοποιήστε το κλειδί API του Token Kiosk στην κεφαλίδα Authorization: Bearer . Πλήρως συμβατή πύλη με το OpenAI. Βασική διεύθυνση URL του API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | κλειδί API, συναθροιστής | [σύνδεσμος](https://www.tokenreply.com) | Τα μοντέλα με την ένδειξη δωρεάν έχουν ημερήσια όρια που διαφέρουν ανά μοντέλο και καμπάνια· δεν δημοσιεύεται σταθερό συνολικό δωρεάν όριο. | +| `tokenrouter` | `trk` | TokenRouter | κλειδί API | [σύνδεσμος](https://tokenrouter.com) | Χρησιμοποιήστε το κλειδί API του TokenRouter στην κεφαλίδα Authorization: Bearer . Πλήρως συμβατό με το OpenAI. Βασική διεύθυνση URL του API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | κλειδί API, εικόνα | [σύνδεσμος](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | κλειδί API | [σύνδεσμος](https://docs.opentyphoon.ai) | Δωρεάν κλειδί API με όριο ρυθμού 5 αιτημάτων/δευτ. και 200 αιτημάτων/λεπτό. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Κλειδί API | [σύνδεσμος](https://uncensored.com) | Χρησιμοποιήστε το κλειδί Developer API του uncensored.com (uai_sk_live_...). Το OmniRoute το αποστέλλει ως κεφαλίδα X-api-key στο συμβατό με OpenAI τελικό σημείο https://api.uncensored.com/api/v1. Το κλειδί δεν λήγει ποτέ. Αυτή είναι η υπηρεσία με χρέωση βάσει χρήσης/πιστώσεων· η συνομιλία συνδρομής χωρίς μέτρηση χρήσης παρέχεται από τον ξεχωριστό πάροχο 'uc'. | +| `udio` | `udio` | Udio | Κλειδί API | [σύνδεσμος](https://udio.com) | Επικολλήστε το cookie συνεδρίας από το udio.com (έλεγχος ταυτότητας Supabase) | +| `unorouter` | `unorouter` | UnoRouter | Κλειδί API, συναθροιστής | [σύνδεσμος](https://unorouter.ai) | Τα μοντέλα με το επίθημα :free δεν αφαιρούν υπόλοιπο· το όριο είναι 1 αίτημα/λεπτό ανά δωρεάν μοντέλο και ανά χρήστη. | +| `upstage` | `upstage` | Upstage | Κλειδί API | [σύνδεσμος](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | Κλειδί API | [σύνδεσμος](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | Κλειδί API | [σύνδεσμος](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Κλειδί API, συναθροιστής | [σύνδεσμος](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | Κλειδί API, εταιρικό | [σύνδεσμος](https://cloud.google.com/vertex-ai) | Παρέχετε JSON λογαριασμού υπηρεσίας, διακριτικό πρόσβασης OAuth, κλειδί API Vertex Express ή κλειδί εξουσιοδότησης συνδεδεμένο με λογαριασμό υπηρεσίας. Η λειτουργία Express υποστηρίζει μόνο Gemini· τα μοντέλα συνεργατών απαιτούν διαπιστευτήρια με εμβέλεια έργου. | +| `vertex-partner` | `vp` | Vertex AI Partners | Κλειδί API, εταιρικό | [σύνδεσμος](https://cloud.google.com/vertex-ai) | Παρέχετε JSON λογαριασμού υπηρεσίας ή διαπιστευτήρια OAuth. Ένα κλειδί εξουσιοδότησης συνδεδεμένο με λογαριασμό υπηρεσίας υποστηρίζει επίσης τον εντοπισμό, αλλά η εξαγωγή συμπερασμάτων από μοντέλα συνεργατών απαιτεί επιπλέον το αναγνωριστικό έργου Google Cloud. Τα τυπικά κλειδιά Express υποστηρίζουν μόνο Gemini. | +| `void-ai` | `void-ai` | Void AI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://voidai.app) | Ο δημόσιος κατάλογος μοντέλων επισημαίνει ορισμένα μοντέλα ως απαιτούντα δωρεάν πρόγραμμα, αλλά η πρόσβαση παρέχεται υπό προϋποθέσεις και δεν έχει επιβεβαιωθεί αριθμητικό όριο χρήσης. | +| `volcengine` | `volcengine` | Volcengine | Κλειδί API | [σύνδεσμος](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Κλειδί API | [σύνδεσμος](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Συνδέστε τον λογαριασμό σας στο Volcano Engine ή χρησιμοποιήστε ένα κλειδί API συνδρομής Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Κλειδί API | [σύνδεσμος](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Συνδέστε τον λογαριασμό σας στο Volcano Engine ή χρησιμοποιήστε ένα κλειδί API συνδρομής Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | Κλειδί API, ενσωματώσεις/ανακατάταξη | [σύνδεσμος](https://www.voyageai.com) | Κλειδί API Bearer για τα API ενσωματώσεων και ανακατάταξης του Voyage AI. | +| `wafer` | `wafer` | Wafer AI | Κλειδί API | [σύνδεσμος](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | Κλειδί API | [σύνδεσμος](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Κλειδί API, εταιρικό | [σύνδεσμος](https://www.ibm.com/products/watsonx-ai) | Χρησιμοποιήστε το διακριτικό bearer του watsonx. Η βασική διεύθυνση URL μπορεί να είναι https://.ml.cloud.ibm.com/ml/gateway/v1/ ή ένα αυτοδιαχειριζόμενο τελικό σημείο /ml/gateway/v1. | +| `writer` | `writer` | Writer | Κλειδί API | [σύνδεσμος](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | Κλειδί API | [σύνδεσμος](https://x5lab.dev) | Χρησιμοποιήστε το κλειδί API του X5Lab (x5-...) στο Authorization: Bearer . Πλήρως συμβατό με OpenAI. Βασική διεύθυνση URL του API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | Κλειδί API | [σύνδεσμος](https://x.ai) | Χρησιμοποιήστε ένα επίσημο κλειδί API του xAI ή συνδεθείτε μέσω xAI OAuth. Οι συνεδρίες Grok Build JWT παραμένουν ξεχωριστός πάροχος. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Κλειδί API | [σύνδεσμος](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Κλειδί API | [σύνδεσμος](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | Κλειδί API, συναθροιστής | [σύνδεσμος](https://xkiro.com) | Δημιουργήστε έναν δωρεάν λογαριασμό στο xkiro.com και επικολλήστε το κλειδί εδώ (Bearer· γίνεται επίσης αποδεκτό το x-api-key). | +| `yi` | `yi` | Yi (01.AI) | Κλειδί API | [σύνδεσμος](https://01.ai) | Αποκτήστε κλειδί API στο platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | Κλειδί API, συναθροιστής | [σύνδεσμος](https://yolo-auto.com) | Η δωρεάν πρόσβαση στο API υπόκειται σε όριο αιτημάτων και προορίζεται για δοκιμές· δεν δημοσιεύεται αριθμητικό ημερήσιο όριο χρήσης και δεν παρέχεται υπόσχεση ότι η δωρεάν πρόσβαση θα διατίθεται επ’ αόριστον. | +| `zai` | `zai` | Z.AI | Κλειδί API | [σύνδεσμος](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | Κλειδί API | [σύνδεσμος](https://zenmux.ai) | Χρησιμοποιήστε το κλειδί API του ZenMux στο Authorization: Bearer . Το ZenMux είναι πλήρως συμβατό με OpenAI. Βασική διεύθυνση URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Κλειδί API, συναθροιστής | [σύνδεσμος](https://www.zerolimitai.com) | Διαφημίζεται μια προσωρινή δωρεάν δοκιμή, αλλά οι επίσημες σελίδες δίνουν αντικρουόμενες πληροφορίες μεταξύ 3 και 7 ημερών· ο ισχυρισμός για 100 κλήσεις/ημέρα δεν θεωρείται μόνιμος. | +| `zylo-api` | `zylo` | Zylo API | Κλειδί API, συναθροιστής | [σύνδεσμος](https://zyloai.net) | Βασικό πρόγραμμα: 10 RPM, 7.200 αιτήματα/ημέρα και 200.000 διακριτικά/ημέρα· περιορίζεται στα βασικά μοντέλα κειμένου. | ## Τοπικοί πάροχοι (14) diff --git a/docs/i18n/el/docs/routing/REASONING_REPLAY.md b/docs/i18n/el/docs/routing/REASONING_REPLAY.md index 4ac84bf6fbd7..c18819649db3 100644 --- a/docs/i18n/el/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/el/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ ## Αρχιτεκτονική ``` -Γύρος N (ο βοηθός παράγει): +Γύρος N (το assistant δημιουργεί): → η απόκριση περιέχει reasoning_content + tool_calls → εάν requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() εγγράφει (μνήμη + DB), με κλειδί κάθε tool_call.id - → προωθεί την απόκριση στον πελάτη (ο οποίος μπορεί να διατηρεί ή να μη διατηρεί τον συλλογισμό) + → προώθηση της απόκρισης στον client (ο οποίος μπορεί να διατηρήσει ή να μη διατηρήσει το reasoning) -Γύρος N+1 (ο πελάτης στέλνει επόμενο αίτημα): - → ο μεταφραστής εντοπίζει: requiresReasoningReplay(provider, model) === true - → για κάθε μήνυμα βοηθού με tool_calls και χωρίς reasoning_content: +Γύρος N+1 (ο client στέλνει συνέχεια): + → ο translator ανιχνεύει: requiresReasoningReplay(provider, model) === true + → για κάθε μήνυμα assistant με tool_calls και χωρίς reasoning_content: lookupReasoning(toolCalls[0].id) → μνήμη → DB επιτυχία → msg.reasoning_content = cached; recordReplay() - αποτυχία → msg.reasoning_content = "" (παλαιός εναλλακτικός μηχανισμός για παλαιότερο DeepSeek) - → ο ανάντη πάροχος βλέπει συνεπές ιστορικό → κανένα 400 + αποτυχία → msg.reasoning_content = "" (εφεδρική συμπεριφορά παλαιού τύπου για παλαιότερο DeepSeek) + → το upstream βλέπει συνεπές ιστορικό → χωρίς 400 ``` -Η καταγραφή πραγματοποιείται στο `open-sse/handlers/chatCore.ts` (σε δύο σημεία, στις δύο θέσεις κλήσης του `cacheReasoningFromAssistantMessage`). Η αναπαραγωγή πραγματοποιείται στο `open-sse/translator/index.ts` μετά την προσαρμογή στο σχήμα, αλλά πριν από την αποστολή. +Η καταγραφή πραγματοποιείται στο `open-sse/handlers/chatCore.ts` (σε δύο σημεία, στις δύο θέσεις κλήσης του `cacheReasoningFromAssistantMessage`). Η επανάληψη πραγματοποιείται στο `open-sse/translator/index.ts` μετά την προσαρμογή του σχήματος, αλλά πριν από την αποστολή. + +Οι απλοί γύροι του assistant (χωρίς κλήση εργαλείου) χρησιμοποιούν διαφορετικό κλειδί: το `buildAssistantMessageCacheKey()` δημιουργεί μια σύνοψη του εύρους της συνεδρίας μαζί με το κανονικοποιημένο transcript σε μορφή OpenAI έως εκείνον τον γύρο, επειδή το DeepSeek απαιτεί το reasoning _κάθε_ προηγούμενου γύρου μόλις υπάρχει το `tools`. Για προορισμούς Responses-API (για παράδειγμα `opencode-go/deepseek-v4-flash`, που δρομολογείται στο `/responses`), το σώμα του upstream περιέχει `input` και όχι `messages`, επομένως το `translateRequest()` (`open-sse/translator/index.ts`) αναφέρει μέσω μιας επιλογής callback το ενδιάμεσο transcript που συνόψισε και τα σημεία καταγραφής συνοψίζουν το ίδιο transcript. Το πέρασμα επανάληψης του Responses εκτελείται στο ενδιάμεσο OpenAI για κάθε μορφή προέλευσης, επομένως επαναλαμβάνονται και οι clients Anthropic Messages (Claude → OpenAI → Responses). ## Αποθήκευση — Υβριδική μνήμη + SQLite diff --git a/docs/i18n/el/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/el/docs/security/SOCKET_DEV_FINDINGS.md index 70acca0d16d4..2cad62d4426b 100644 --- a/docs/i18n/el/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/el/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,24 +4,23 @@ --- -Το παρόν έγγραφο αποτελεί τη βεβαίωση του συντηρητή για τα έξι ευρήματα -`AI-detected potential malware` που αναφέρθηκαν για το `omniroute@3.8.5` και +> **Σημείωση πεδίου εφαρμογής:** Το `socket.yml` ρυθμίζει τη σάρωση μετά τη δημοσίευση από την πλευρά του registry του Socket.dev για το τεχνούργημα npm (διαδρομές προς παράβλεψη για περιεχόμενο που δεν διανέμεται, όπως `tests/`, `docs/` και αναφορές build). Δεν συνδέει κάποια πύλη συγχώνευσης CI/PR — κανένα workflow στο `.github/workflows`, κανένα script στο `package.json` και κανένας στόχος `Makefile` δεν καλεί το Socket.dev. + +Αυτό το έγγραφο αποτελεί τη βεβαίωση που συντάχθηκε από τον συντηρητή για τα έξι +ευρήματα `AI-detected potential malware` που επισημάνθηκαν για το `omniroute@3.8.5` και τα μέτρα μετριασμού που εφαρμόστηκαν στο `omniroute@3.8.6`. Υπάρχει ώστε: -1. Οι διαχειριστές αγωγών ασφαλείας να διαθέτουν μία ενιαία αναφορά την οποία - μπορούν να επικαλούνται όταν χρειάζεται να αξιολογήσουν τα ευρήματα σε - σχέση με τον πραγματικό πηγαίο κώδικα. -2. Οι μελλοντικοί σαρωτές AI να μπορούν να εντοπίζουν τον υπογεγραμμένο από - τον συντηρητή ισχυρισμό ότι κάθε επισημασμένη διαδρομή είναι σκόπιμη, - προαιρετική και τεκμηριωμένη. -3. Να διαθέτουμε ένα γραπτό αρχείο του _γιατί_ κάθε σημείο κλήσης έχει - διαμορφωθεί με τον συγκεκριμένο τρόπο — ώστε μια μελλοντική αναδόμηση να - μην επαναφέρει κατά λάθος ένα αποτύπωμα που αφαιρέθηκε σκόπιμα. - -Αν διαχειρίζεστε έναν σαρωτή που επισημαίνει εκ νέου οποιοδήποτε από τα -παρακάτω σημεία κλήσης μετά τη διάθεση των μέτρων μετριασμού της v3.8.6, -ανοίξτε ένα ζήτημα με το ίχνος της σάρωσης και θα επεκτείνουμε τη βεβαίωση -εδώ. +1. Οι διαχειριστές των αγωγών ασφαλείας να έχουν μία ενιαία αναφορά την οποία μπορούν να παραθέτουν όταν χρειάζεται + να αξιολογήσουν τα ευρήματα σε σχέση με τον πραγματικό πηγαίο κώδικα. +2. Οι μελλοντικοί σαρωτές AI να μπορούν να εντοπίσουν τον υπογεγραμμένο από τον συντηρητή ισχυρισμό ότι κάθε + επισημασμένη διαδρομή είναι σκόπιμη, προαιρετική και τεκμηριωμένη. +3. Να διαθέτουμε ένα γραπτό αρχείο του _γιατί_ κάθε σημείο κλήσης έχει διαμορφωθεί με τον συγκεκριμένο τρόπο — + ώστε μια μελλοντική αναδιάρθρωση κώδικα να μην επαναφέρει κατά λάθος ένα αποτύπωμα που + αφαιρέθηκε σκόπιμα. + +Αν διαχειρίζεστε έναν σαρωτή που επισημαίνει ξανά οποιοδήποτε από τα παρακάτω σημεία κλήσης αφού +κυκλοφορήσουν τα μέτρα μετριασμού της v3.8.6, ανοίξτε ένα issue με το ίχνος της σάρωσης και +θα επεκτείνουμε τη βεβαίωση εδώ. --- diff --git a/docs/i18n/es/README.md b/docs/i18n/es/README.md index 3e42bc02302a..d8e68e872a4d 100644 --- a/docs/i18n/es/README.md +++ b/docs/i18n/es/README.md @@ -19,17 +19,17 @@
-## 💰 ~1.62B de tokens gratuitos / mes +## 💰 ~1.62B de tokens gratuitos al mes
-> Combinar manualmente los niveles gratuitos es complicado: decenas de SDK, decenas de límites de uso y ninguna forma de saber cuánto tienes realmente. OmniRoute cataloga **491 entradas de niveles gratuitos distribuidas en 35 claves de grupos recurrentes** y calcula la cifra destacada de tokens a partir de **los 17 grupos con un presupuesto mensual positivo publicado, más cinco límites de Groq por modelo**, eliminando duplicados por grupo compartido. Las cuotas que solo se habilitan después de una verificación de identidad regional (actualmente: ModelScope) se muestran por separado, +~6M sujetos a verificación de identidad regional, y nunca se suman a la cifra destacada. El resultado permanece visible en el panel (`/dashboard/free-tiers`). +> Combinar manualmente los niveles gratuitos es tedioso: docenas de SDK, docenas de límites de uso y ninguna idea de cuánto tienes realmente. OmniRoute cataloga **489 entradas de niveles gratuitos distribuidas entre 35 claves de pools recurrentes** y calcula la cifra principal de tokens a partir de los **17 pools con un presupuesto mensual positivo publicado, más cinco límites de Groq por modelo**, eliminando duplicados por pool compartido. Las cuotas que solo se habilitan después de una verificación de identidad regional (actualmente: ModelScope) se muestran por separado, +~6M sujetos a verificación de identidad regional, y nunca se suman a la cifra principal. El resultado permanece visible en el panel (`/dashboard/free-tiers`). -Tarjeta de presupuesto de niveles gratuitos de OmniRoute: ~1.62B de tokens gratuitos al mes de forma estable, hasta ~2.22B durante el primer mes con créditos de registro, procedentes de 35 claves documentadas de grupos recurrentes que abarcan 491 entradas de niveles gratuitos catalogadas detrás de un único endpoint. Cálculo transparente con eliminación de duplicados por grupo: cada grupo compartido se cuenta una sola vez, incluidos 17 grupos recurrentes con un presupuesto mensual positivo de tokens publicado, más cinco límites de Groq por modelo; 13 proveedores están marcados como no recomendados en el catálogo de riesgos de términos para que tú decidas. La barra de presupuesto incluye Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (cinco límites por modelo) y grupos más pequeños, además de créditos de registro para el primer mes y proveedores permanentemente gratuitos sin límite de tokens, mostrados por separado para que nunca inflen la cifra destacada. Uso y saldo restantes en tiempo real en /dashboard/free-tiers. +Tarjeta de presupuesto del nivel gratuito de OmniRoute: ~1.62B de tokens gratuitos al mes de forma sostenida, hasta ~2.22B durante el primer mes con créditos de registro, provenientes de 35 claves de pools recurrentes documentadas que abarcan 489 entradas de niveles gratuitos catalogadas detrás de un único endpoint. Cálculo transparente con deduplicación por pool: cada pool compartido se cuenta una sola vez, incluidos 17 pools recurrentes con un presupuesto mensual positivo de tokens publicado, más cinco límites de Groq por modelo; 13 proveedores están marcados como evitar en el catálogo de riesgos de términos para que tú decidas. La barra de presupuesto incluye Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (cinco límites por modelo) y pools más pequeños, además de créditos de registro para el primer mes y proveedores permanentemente gratuitos sin límite de tokens mostrados por separado para que nunca inflen la cifra principal. Uso y saldo restantes en tiempo real en /dashboard/free-tiers. -> Resumen animado de la página activa `/dashboard/free-tiers`. Metodología completa (eliminación de duplicados por grupo, niveles de crédito, términos de los proveedores): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Resumen animado de la página activa `/dashboard/free-tiers`. Metodología completa (deduplicación de pools, niveles de crédito y términos de los proveedores): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Estas cifras se vuelven a auditar cada dos semanas comparándolas con el catálogo activo y **pueden variar en ambas direcciones**: si un proveedor finaliza un nivel gratuito, la cifra disminuye; si se incorpora uno nuevo, aumenta. Publicamos lo que el catálogo calcula realmente, nunca el mejor caso redondeado al alza. +> Estas cifras se vuelven a auditar cada dos semanas comparándolas con el catálogo activo y **pueden moverse en ambas direcciones**: si un proveedor termina un nivel gratuito, la cifra baja; si aparece uno nuevo, sube. Publicamos lo que el catálogo calcula realmente, nunca el mejor escenario redondeado al alza.
@@ -48,18 +48,18 @@ ### 💬 Únete a la comunidad -**👋 Sigue al mantenedor y entérate antes que nadie de nuevos proveedores, versiones y consejos:** +**👋 Sigue al mantenedor y entérate primero de nuevos proveedores, versiones y consejos:** [![Sigue a Diego en LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Sigue a @diegosouzapw en GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![WhatsApp global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp Global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) [![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Sitio web](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Preguntas, consejos sobre proveedores, hoja de ruta y soporte → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Preguntas, recomendaciones de proveedores, hoja de ruta y soporte → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -592,7 +592,7 @@ Radar es opcional y solo utiliza GET. El cliente de OmniRoute no carga prompts, ## 🤖 CLI y agentes de programación compatibles -> Una sola configuración — `http://localhost:20128/v1` — y **todos** los IDE y CLI de IA funcionan con modelos gratuitos y de bajo coste. +> Una sola configuración — `http://localhost:20128/v1` — y **todos** los IDE o CLI con IA funcionan con modelos gratuitos y de bajo coste.
@@ -626,13 +626,13 @@ Radar es opcional y solo utiliza GET. El cliente de OmniRoute no carga prompts, - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ también funciona con · Kiro · Command Code · Antigravity · Windsurf · AMP · cualquier herramienta compatible con OpenAI ++ también funciona con · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · cualquier herramienta compatible con OpenAI
📖 Configuración por herramienta para las 36 herramientas (26 CLI de código + 10 agentes CLI) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin de OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) @@ -642,24 +642,24 @@ Radar es opcional y solo utiliza GET. El cliente de OmniRoute no carga prompts,
**Ejecuta cualquier CLI compatible mediante OmniRoute con un solo comando**: no se escriben archivos de configuración, -las credenciales se inyectan por proceso y Qwen/Gemini reciben un directorio de inicio aislado y desechable: +las credenciales se inyectan por proceso y Qwen/Gemini obtienen un directorio personal aislado y desechable: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code -omniroute run codex --model glm/glm-5.2 # OpenAI Codex CLI +omniroute run codex --model glm/glm-5.2 # CLI de OpenAI Codex omniroute run aider --model glm/glm-5.2 -- --message "reply OK" omniroute run goose --model glm/glm-5.2 omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# O elige el proveedor y el modelo de forma interactiva y escribe la configuración propia de la herramienta: +# O selecciona el proveedor y el modelo de forma interactiva y escribe la configuración propia de la herramienta: omniroute configure codex # también: claude opencode qwen aider goose gemini cline continue kilo ``` Cada comando respeta el contexto remoto activo (`omniroute connect `), `--dry-run` -muestra una vista previa de las variables de entorno y los argumentos exactos sin ejecutar nada, y `--api-key-env NAME` mantiene los secretos fuera -del historial de tu shell. → [Integraciones de CLI](docs/guides/CLI-INTEGRATIONS.md) +muestra una vista previa de las variables de entorno y los argumentos exactos sin ejecutarlos, y `--api-key-env NAME` evita que los secretos +queden registrados en el historial de tu shell. → [Integraciones con CLI](docs/guides/CLI-INTEGRATIONS.md)
@@ -669,7 +669,7 @@ del historial de tu shell. → [Integraciones de CLI](docs/guides/CLI-INTEGRATIO -> **357 proveedores registrados** en las colecciones canónicas de chat, medios, búsqueda, local, agentes en la nube y sistema, incluidos **152 con metadatos de descubrimiento `hasFree: true`**. El registro de modelos de chat abarca **229 proveedores / 2.554 pares distintos de proveedor-modelo / 1.283 identificadores de modelo sin procesar**; el catálogo independiente de presupuestos gratuitos contiene **491 filas por modelo**, **35 fondos recurrentes** y **54 proveedores gratuitos para siempre, recurrentes o sin clave**. Estos denominadores son diferentes por diseño; las definiciones y los cálculos con fondos deduplicados se encuentran en la [Referencia de proveedores](docs/reference/PROVIDER_REFERENCE.md) y los [Niveles gratuitos](docs/reference/FREE_TIERS.md). +> **357 proveedores registrados** en las colecciones canónicas de chat, medios, búsqueda, local, agentes en la nube y sistema, incluidos **152 que incluyen metadatos de descubrimiento `hasFree: true`**. El registro de modelos de chat abarca **229 proveedores / 2.554 pares distintos de proveedor-modelo / 1.283 IDs de modelo sin procesar**; el catálogo independiente de presupuestos gratuitos contiene **491 filas por modelo**, **35 fondos recurrentes** y **54 proveedores recurrentes/sin clave gratuitos para siempre**. Estos denominadores son diferentes por diseño; las definiciones y los cálculos con fondos sin duplicados se encuentran en la [Referencia de proveedores](docs/reference/PROVIDER_REFERENCE.md) y los [Niveles gratuitos](docs/reference/FREE_TIERS.md).
@@ -702,7 +702,7 @@ del historial de tu shell. → [Integraciones de CLI](docs/guides/CLI-INTEGRATIO -…y más de 330 adicionales — todos los iconos se obtienen en tiempo real desde el catálogo de proveedores del panel. 📖 [Referencia de proveedores](docs/reference/PROVIDER_REFERENCE.md) +…y más de 330 adicionales — cada icono se obtiene en tiempo real del catálogo de proveedores del panel. 📖 [Referencia de proveedores](docs/reference/PROVIDER_REFERENCE.md)
@@ -718,12 +718,12 @@ del historial de tu shell. → [Integraciones de CLI](docs/guides/CLI-INTEGRATIO Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Gratis para siempre
- Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
GRATIS e ilimitado
- Pollinations
Pollinations
GPT, Llama, Claude
No se necesita clave
+ Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
GRATIS sin límites
+ Pollinations
Pollinations
GPT, Llama, Claude
No requiere clave
Cloudflare AI
Cloudflare AI
Más de 50 modelos
10K neuronas/día
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM gratis
- Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M de tokens/día
- OpenRouter
OpenRouter
Modelos :free
+$10 → más RPM
+ Openference
Openference
Qwen3.8 27B, Llama 3.2
Nivel gratuito
+ OpenRouter
OpenRouter
Modelos :free
+$10 → mayor RPM
@@ -1263,21 +1263,21 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 - + - - + + - + - - + + - + - +
CapaTecnología
Entorno de ejecuciónNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
LenguajeTypeScript 6.0 — 100 % TypeScript en src/ y open-sse/ (cero any en el núcleo desde v2.0)
LenguajeTypeScript 6.0 — 100 % TypeScript en src/ y open-sse/ (cero usos de any en el núcleo desde v2.0)
FrameworkNext.js 16 + React 19 + Tailwind CSS 4
Base de datosbetter-sqlite3 (SQLite, registro WAL) + LowDB (JSON heredado) — 122 módulos de dominio, 176 migraciones
MemoriaTexto completo FTS5 de SQLite + embeddings vectoriales cuantizados a int8, decaimiento tipado
Base de datosbetter-sqlite3 (SQLite, registro WAL) + LowDB (JSON heredado) — 122 módulos de dominio, 178 migraciones
MemoriaTexto completo con SQLite FTS5 + representaciones vectoriales cuantizadas a int8, decaimiento tipado
EsquemasZod 4 — validación de E/S de herramientas MCP + contratos de API
ProtocolosMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
TransmisiónEventos enviados por el servidor (SSE) + puente WebSocket (/v1/ws)
TransmisiónServer-Sent Events (SSE) + puente WebSocket (/v1/ws)
CompresiónCanalización de 12 motores — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autenticación y seguridadOAuth 2.0 (PKCE) + JWT + claves de API + autenticación MCP con ámbitos · AES-256-GCM para datos en reposo · DOMPurify
Sigilowreq-js — suplantación de huellas TLS JA3 / JA4, proxy de 3 niveles
ResilienciaDisyuntor, retroceso exponencial, prevención de avalanchas de solicitudes, autorreparación mediante combinación automática
Sigilowreq-js — suplantación de huellas digitales TLS JA3 / JA4, proxy de 3 niveles
ResilienciaDisyuntor, retroceso exponencial, prevención de avalanchas de solicitudes, autorrecuperación mediante combinaciones automáticas
Registropino — registros JSON estructurados con contexto de solicitud
PruebasEjecutor de pruebas de Node.js + Vitest — más de 39 000 declaraciones de pruebas estáticas en más de 5100 archivos de pruebas monitorizados (unitarias, integración, E2E, seguridad, ecosistema)
PruebasEjecutor de pruebas de Node.js + Vitest — más de 39.000 declaraciones de pruebas estáticas en más de 5.100 archivos de prueba monitorizados (unitarias, de integración, E2E, de seguridad y del ecosistema)
PlataformasEscritorio (Electron) · Android (Termux) · PWA (cualquier navegador)
CI/CDGitHub Actions — publicación automática en npm + Docker Hub al lanzar una versión
CI/CDGitHub Actions — publicación automática en npm + Docker Hub al crear una versión
EnlacesSitio web · npm · Docker Hub
@@ -1293,20 +1293,20 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 - - + + - +
DocumentoDescripción
Guía del usuarioProveedores, combinaciones, integración con CLI y despliegue
Guía de configuraciónMétodos completos de instalación, configuraciones de herramientas CLI, configuración de protocolos y ajuste de tiempos de espera
Guía del usuarioProveedores, combinaciones, integración con CLI, despliegue
Guía de configuraciónMétodos completos de instalación, configuraciones de herramientas CLI, configuración de protocolos, ajuste de tiempos de espera
Guía de herramientas CLIConfiguración específica para Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo y Copilot
Modo remotoControla una instancia remota de OmniRoute (VPS) desde la CLI de tu portátil mediante tokens de acceso con alcance limitado
Configuración de Claude CodeConecta Claude Code con OmniRoute (local/remoto) mediante launch y perfiles por modelo
Inicio rápidoInstalar → conectar → configurar en 3 pasos
Inicio rápido3 pasos: instalar → conectar → configurar
### 🔧 Operaciones y despliegue - - + + @@ -1315,22 +1315,22 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132
DocumentoDescripción
Guía de DockerDocker run, perfiles de Compose, HTTPS con Caddy, túneles y etiquetas de imágenes
Guía de PodmanIntegración de Quadlet con systemd, podman-compose y SELinux
Guía de DockerDocker run, perfiles de Compose, HTTPS con Caddy, túneles, etiquetas de imágenes
Guía de PodmanIntegración de Quadlet con systemd, podman-compose, SELinux
Despliegue en VMGuía completa: configuración de VM + nginx + Cloudflare
Despliegue en Fly.ioDespliegue en Fly.io con almacenamiento persistente
Guía de TermuxEjecuta OmniRoute en Android mediante Termux
Configuración del entornoVariables y referencias completas de .env
-### 🧠 Funcionalidades y arquitectura +### 🧠 Funciones y arquitectura - - - - - - - - - + + + + + + + + +
DocumentoDescripción
ArquitecturaArquitectura del sistema, flujo de datos y funcionamiento interno
Guía de compresiónCanalización con 7 opciones: desactivada / ligera / estándar / agresiva / ultra / RTK / apilada
Compresión RTKCompresión de la salida de comandos, filtros, confianza, verificación y recuperación de la salida sin procesar
Motores de compresiónCaveman, RTK, canalizaciones apiladas e interfaces de panel/API/MCP
Formato de las reglas de compresiónEsquemas JSON de paquetes de reglas para filtros de Caveman y RTK
Paquetes de idiomas para compresiónDetección de idiomas y creación de paquetes de reglas de Caveman
Guía de resilienciaDisyuntores, periodos de espera, cola, prevención de avalanchas de solicitudes y suplantación de TLS
Motor Auto-ComboPuntuación basada en 16 factores, paquetes de modos y autorrecuperación
Guía de proxySistema proxy de 3 niveles, mercado de 1proxy y CRUD del registro
Niveles gratuitosDirectorio consolidado: 35 grupos recurrentes documentados / 491 entradas de niveles gratuitos catalogadas
Galería de funcionalidadesRecorrido visual por el panel con capturas de pantalla
Documentación del código fuenteRecorrido por el código fuente apto para principiantes
Motores de compresiónCaveman, RTK, canalizaciones apiladas, interfaces de panel/API/MCP
Formato de reglas de compresiónEsquemas de paquetes de reglas JSON para filtros de Caveman y RTK
Paquetes de idiomas para compresiónDetección de idiomas y creación de paquetes de reglas para Caveman
Guía de resilienciaDisyuntores, periodos de enfriamiento, cola, prevención de avalanchas y suplantación de TLS
Motor Auto-ComboPuntuación de 16 factores, paquetes de modos y autorreparación
Guía de proxiesSistema de proxies de 3 niveles, mercado de 1proxy y operaciones CRUD del registro
Niveles gratuitosDirectorio consolidado: 35 grupos recurrentes documentados / 489 entradas de nivel gratuito catalogadas
Galería de funcionesRecorrido visual por el panel con capturas de pantalla
Documentación del código baseRecorrido por el código base accesible para principiantes
### 🤖 Protocolos y API @@ -1339,10 +1339,10 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 DocumentoDescripción Referencia de la APITodos los endpoints con ejemplos Especificación OpenAPIEspecificación OpenAPI 3.0 - Servidor MCP110 herramientas MCP, configuraciones de IDE y clientes para Python/TS/Go + Servidor MCP110 herramientas MCP, configuraciones de IDE, clientes de Python/TS/Go Guía del servidor MCPInstalación de MCP, transportes y referencia de herramientas - Servidor A2AProtocolo JSON-RPC 2.0, habilidades, transmisión y gestión de tareas - Guía del servidor A2ATarjeta de agente A2A, tareas, habilidades y transmisión + Servidor A2AProtocolo JSON-RPC 2.0, capacidades, transmisión y gestión de tareas + Guía del servidor A2ATarjeta de agente A2A, tareas, capacidades y transmisión ### 📋 Proyecto y calidad @@ -1350,12 +1350,12 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 - - + + - - + +
DocumentoDescripción
ContribuciónConfiguración y directrices de desarrollo
Modelo de ramas y versionesA qué ramas se dirigen los PR (release/*) y qué significan main y las etiquetas
Registro de cambiosHistorial completo de versiones
Modelo de ramificación y publicaciónA qué ramas se dirigen las PR (release/*) y qué significan main y las etiquetas
Registro de cambiosHistorial completo de publicaciones por versión
Política de seguridadNotificación de vulnerabilidades y prácticas de seguridad
Guía de i18nCompatibilidad con 42 idiomas, flujo de trabajo de traducción y RTL
Lista de comprobación para versionesPasos de validación previos al lanzamiento
Plan de coberturaEstrategia de cobertura de pruebas para más de 39 000 declaraciones de pruebas estáticas en más de 5 100 archivos de pruebas con seguimiento
Lista de comprobación de publicaciónPasos de validación previos a la publicación
Plan de coberturaEstrategia de cobertura de pruebas para más de 39,000 declaraciones de pruebas estáticas en más de 5,100 archivos de pruebas rastreados

@@ -1364,12 +1364,12 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 # ⭐ Principales colaboradores -> OmniRoute está moldeado por una apasionada comunidad de código abierto. Estas personas han realizado contribuciones excepcionales que repercuten directamente en la calidad, la estabilidad y el alcance del proyecto. **Gracias.** +> OmniRoute está formado por una apasionada comunidad de código abierto. Estas personas han realizado contribuciones excepcionales que afectan directamente a la calidad, la estabilidad y el alcance del proyecto. **Gracias.** ### Colaboradores externos por solicitudes de incorporación de cambios fusionadas - + @@ -1393,9 +1393,9 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132
PuestoColaboradorPR fusionados~Líneas modificadas
PuestoColaboradorPR fusionadas~Líneas modificadas
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Datos fijados en la punta activa de release/v3.8.50, dafb4ae808, con fusiones hasta 2026-08-24 05:26:03 UTC. El censo paginado de GitHub GraphQL contiene 5,911 PR fusionados: 2,707 del propietario del repositorio, 179 de Dependabot y 3,025 PR externos de 535 colaboradores distintos. «Líneas modificadas» es la suma de adiciones y eliminaciones de GitHub e incluye archivos generados, archivos de bloqueo, catálogos, traducciones y documentación; mide la rotación de código, no las líneas de código creadas. Se conservan los empates en el punto de corte. +Datos fijados en la punta activa de release/v3.8.50, dafb4ae808, con fusiones hasta 2026-08-24 05:26:03 UTC. El censo paginado de GitHub GraphQL contiene 5,911 PR fusionadas: 2,707 del propietario del repositorio, 179 de Dependabot y 3,025 PR externas de 535 colaboradores distintos. «Líneas modificadas» corresponde a las adiciones + eliminaciones de GitHub e incluye archivos generados, archivos de bloqueo, catálogos, traducciones y documentación; mide la rotación de código, no las líneas de código de autoría propia. Se conservan los empates en el límite de la clasificación. -### Commits atribuidos por GitHub +### Confirmaciones atribuidas por GitHub @@ -1439,7 +1439,7 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 Markus Hartung
Markus Hartung
- 🏅 69 commits atribuidos por GitHub · empate en el puesto n.º 6 + 🏅 69 commits atribuidos por GitHub · empatado en el puesto n.º 6 @@ -1448,7 +1448,7 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 Dizzle
Dizzle
- 🏅 69 commits atribuidos por GitHub · empate en el puesto n.º 6 + 🏅 69 commits atribuidos por GitHub · empatado en el puesto n.º 6
@@ -1469,21 +1469,21 @@ Métricas canónicas a fecha de 2026-08-24: **1.029 videos únicos** · **11.132 Bob.Hou
Bob.Hou

- 🏅 51 commits atribuidos por GitHub · empate en el puesto n.º 10 + 🏅 51 commits atribuidos por GitHub · empatado en el puesto n.º 10
Xiangzhe
Xiangzhe

- 🏅 51 commits atribuidos por GitHub · empate en el puesto n.º 10 + 🏅 51 commits atribuidos por GitHub · empatado en el puesto n.º 10
-Verificado de nuevo el 2026-08-24 06:14:31 UTC: commits atribuidos por GitHub, según la API de colaboradores del repositorio, para la rama predeterminada release/v3.8.50. La API devolvió 525 identidades (415 usuarios, 2 bots y 108 anónimas); esta tabla excluye al mantenedor, los bots y las identidades anónimas, y conserva los empates de la clasificación. Es distinta tanto de la clasificación anterior de PR fusionadas como del censo inferior de 639 personas basado en metadatos de Git. +Revisado de nuevo el 2026-08-24 06:14:31 UTC: commits atribuidos por GitHub según la API de colaboradores del repositorio para la rama predeterminada release/v3.8.50. La API devolvió 525 identidades (415 usuarios, 2 bots y 108 anónimas); esta tabla excluye al responsable del mantenimiento, los bots y las identidades anónimas, y conserva los empates de la clasificación. Es distinta tanto de la clasificación anterior de PR fusionadas como del censo de metadatos de Git de 639 personas que aparece a continuación. -> 🙏 Las funcionalidades, correcciones de errores y mejoras de infraestructura aportadas por estos colaboradores son una **parte fundamental** de lo que hace que OmniRoute sea fiable y tenga tantas funcionalidades. Cada pull request, cada caso de prueba y cada archivo de traducción i18n cuenta. El código abierto lo construyen personas como ellos. +> 🙏 Las funcionalidades, las correcciones de errores y las mejoras de infraestructura de estos colaboradores son una **parte fundamental** de lo que hace que OmniRoute sea fiable y tenga tantas funcionalidades. Cada solicitud de incorporación de cambios, cada caso de prueba y cada archivo de traducción i18n son importantes. El código abierto lo construyen personas como ellos.
diff --git a/docs/i18n/es/SECURITY.md b/docs/i18n/es/SECURITY.md index 4a103ff792ed..8563d81e8a1c 100644 --- a/docs/i18n/es/SECURITY.md +++ b/docs/i18n/es/SECURITY.md @@ -220,24 +220,26 @@ Estas reglas son aplicadas por las herramientas y los revisores: 10. **Valores de ejecución de `exec()` / `spawn()` mediante la opción `env`** — nunca interpole rutas externas ni valores no confiables en scripts enviados al shell. Referencia: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Prefiera bibliotecas seguras de forma predeterminada** — consulte [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Recurra a ellas antes de implementar una solución propia. -## Hallazgos de escáneres de la cadena de suministro (Socket.dev / Snyk / similares) +## Hallazgos del escáner de la cadena de suministro (Socket.dev / Snyk / similares) -El artefacto npm publicado de `omniroute` incluye la compilación de Next.js con `output: "standalone"`, lo que significa que cada gestor de rutas —incluidas las funcionalidades privilegiadas documentadas (MITM, importación de Zed, Cloud Sync y supervisor de servicios integrado)— termina en fragmentos minificados `.next/server/*.js`. Los escáneres heurísticos de la cadena de suministro suelen comparar esos fragmentos con patrones de firmas de malware. +> **Nota sobre el alcance:** `socket.yml`, ubicado en la raíz del repositorio, solo configura `projectIgnorePaths` para el análisis posterior a la publicación que Socket.dev realiza en su registro sobre el artefacto npm publicado; no constituye una comprobación obligatoria para la integración continua ni para la fusión de solicitudes de incorporación de cambios. Ningún flujo de trabajo de `.github/workflows`, ningún script de `package.json` ni ningún objetivo de `Makefile` invoca Socket.dev. -La configuración del escáner que utilizamos se encuentra en [`socket.yml`](socket.yml), en la raíz del repositorio (formato v2 de la aplicación de GitHub de Socket.dev; consulte ). Excluye explícitamente directorios no distribuidos (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/`, etc.), de modo que el escáner solo informa sobre rutas de código que realmente llegan a los usuarios del paquete publicado. El análisis en sí lo realiza la aplicación de GitHub de Socket leyendo ese archivo, no un flujo de trabajo de este repositorio. +El artefacto npm publicado de `omniroute` incluye la compilación de Next.js con `output: "standalone"`, lo que significa que todos los controladores de rutas —incluidas las funcionalidades privilegiadas documentadas (MITM, importación de Zed, Cloud Sync y supervisor de servicios integrado)— terminan en fragmentos minificados `.next/server/*.js`. Los escáneres heurísticos de la cadena de suministro suelen comparar esos fragmentos con patrones de firmas de malware. -Para cada categoría de hallazgo, mantenemos una declaración del responsable de mantenimiento específica para cada hallazgo: +La configuración del escáner que utilizamos se encuentra en [`socket.yml`](socket.yml), en la raíz del repositorio (formato v2 de la aplicación de GitHub de Socket.dev; consulte ). Excluye explícitamente los directorios que no se distribuyen (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/`, etc.), de modo que el escáner solo informa sobre las rutas de código que realmente llegan a los usuarios del paquete publicado; el análisis lo realiza la aplicación de GitHub de Socket leyendo ese archivo, no un flujo de trabajo de este repositorio. + +Para cada categoría de hallazgos, mantenemos una declaración del responsable de mantenimiento específica para cada hallazgo: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - mapa por hallazgo: archivo fuente ↔ fragmento marcado ↔ comportamiento ↔ mitigación + mapa por hallazgo: archivo fuente ↔ fragmento señalado ↔ comportamiento ↔ mitigación aplicada en v3.8.6. -- Bloques `SECURITY-AUDITOR-NOTE:` en el código fuente, en cada función marcada, - que remiten al mismo documento. +- Los bloques `SECURITY-AUDITOR-NOTE:` incluidos en el código fuente junto a cada función señalada + remiten al mismo documento. -Para los usuarios cuya canalización no permita flexibilizar la alerta: compile con -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Esto sustituye los cuatro -módulos sensibles por stubs que devuelven HTTP 503 `feature-disabled` en -tiempo de ejecución, por lo que las rutas de código privilegiadas quedan físicamente ausentes del paquete. +Para los usuarios cuyas canalizaciones no puedan omitir la alerta: compilen con +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Esto reemplaza los cuatro +módulos sensibles por stubs que devuelven HTTP 503 `feature-disabled` durante +la ejecución, de modo que las rutas de código privilegiadas quedan físicamente ausentes del paquete. Consulte [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) para ver el procedimiento de publicación. diff --git a/docs/i18n/es/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/es/docs/architecture/CODEBASE_DOCUMENTATION.md index d8a7ee6b7e75..610288f0d45b 100644 --- a/docs/i18n/es/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/es/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,7 @@ Dividido en subdirectorios específicos: ## 4. `open-sse/` — Espacio de trabajo del motor de streaming -Espacio de trabajo npm independiente publicado como `@omniroute/open-sse`. Gestiona el procesamiento -de solicitudes, los ejecutores, los traductores, los servicios, el transformador y el servidor MCP. +Espacio de trabajo npm independiente publicado como `@omniroute/open-sse`. Se encarga del procesamiento de solicitudes, los ejecutores, los traductores, los servicios, el transformador y el servidor MCP. ``` open-sse/ @@ -445,11 +444,11 @@ open-sse/ ├── package.json Manifiesto del espacio de trabajo ├── tsconfig.json ├── types.d.ts -├── config/ Registros de proveedores, perfiles de cabeceras, identidad, … +├── config/ Registros de proveedores, perfiles de encabezados, identidad, … ├── handlers/ Manejadores de solicitudes (chat, embeddings, audio, imagen, …) ├── executors/ 108 ejecutores HTTP específicos de proveedores ├── translator/ Conversión de formatos (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Transformador de streams de Responses API ↔ Chat Completions +├── transformer/ Transformador de flujos de Responses API ↔ Chat Completions ├── services/ Más de 80 módulos de servicio (combinaciones, respaldo, cuotas, identidad, …) ├── utils/ Utilidades de streaming, cliente TLS, AWS SigV4, obtención mediante proxy, … └── mcp-server/ Servidor MCP (3 transportes, 33 ámbitos, 110 herramientas) @@ -457,23 +456,23 @@ open-sse/ ### 4.1 `open-sse/handlers/` -| Manejador | Propósito | -| ----------------------- | ----------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Flujo principal de chat (caché, límite de tasa, enrutamiento combinado, despacho de ejecutores) | -| `responsesHandler.ts` | Punto de entrada de OpenAI Responses API | -| `embeddings.ts` | Embeddings | -| `imageGeneration.ts` | Generación de imágenes | -| `audioSpeech.ts` | Conversión de texto a voz | -| `audioTranscription.ts` | Conversión de voz a texto | -| `videoGeneration.ts` | Generación de vídeo | -| `musicGeneration.ts` | Generación de música | -| `rerank.ts` | Reordenamiento | -| `moderations.ts` | Moderación | -| `search.ts` | Búsqueda web | -| `sseParser.ts` | Analizador de eventos SSE | -| `usageExtractor.ts` | Extrae el recuento de tokens de los streams ascendentes | -| `responseSanitizer.ts` | Elimina el ruido específico del proveedor | -| `responseTranslator.ts` | Conexión entre la respuesta del proveedor y la capa de traducción | +| Manejador | Propósito | +| ----------------------- | -------------------------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Canalización principal del chat (caché, límite de tasa, enrutamiento de combinaciones, despacho de ejecutores) | +| `responsesHandler.ts` | Punto de entrada de OpenAI Responses API | +| `embeddings.ts` | Embeddings | +| `imageGeneration.ts` | Generación de imágenes | +| `audioSpeech.ts` | Texto a voz | +| `audioTranscription.ts` | Voz a texto | +| `videoGeneration.ts` | Generación de vídeo | +| `musicGeneration.ts` | Generación de música | +| `rerank.ts` | Reordenación | +| `moderations.ts` | Moderación | +| `search.ts` | Búsqueda web | +| `sseParser.ts` | Analizador de eventos SSE | +| `usageExtractor.ts` | Extrae los recuentos de tokens de los flujos ascendentes | +| `responseSanitizer.ts` | Elimina el ruido específico del proveedor | +| `responseTranslator.ts` | Conexión entre la respuesta del proveedor y la capa de traducción | ### 4.2 `open-sse/executors/` @@ -485,13 +484,13 @@ open-sse/ `pollinations`, `qoder`, `vertex`, `devin-desktop`, además de `claudeIdentity.ts` (utilidad de identidad compartida) e `index.ts` (registro). -> Nota: los proveedores que no aparecen aquí son atendidos por `default.ts` mediante el ejecutor -> genérico compatible con OpenAI. El catálogo completo de proveedores (355 proveedores) se encuentra en +> Nota: los proveedores que no aparecen aquí son atendidos por `default.ts` mediante el ejecutor genérico +> compatible con OpenAI. El catálogo completo de proveedores (355 proveedores) se encuentra en > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Traducción con arquitectura de concentrador y radios (OpenAI es el concentrador). +Traducción con arquitectura radial (OpenAI es el núcleo). - **9 traductores de solicitudes** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -501,37 +500,37 @@ Traducción con arquitectura de concentrador y radios (OpenAI es el concentrador `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 utilidades auxiliares** (`translator/helpers/`): +- **9 utilidades** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, además de - las pruebas de las utilidades auxiliares. -- **Utilidades auxiliares de imágenes** (`translator/image/sizeMapper.ts`). + pruebas de utilidades. +- **Utilidades de imagen** (`translator/image/sizeMapper.ts`). - Nivel superior: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — Conversor basado en `TransformStream` de Responses API ↔ Chat +- `responsesTransformer.ts` — Convertidor basado en `TransformStream` entre Responses API y Chat Completions (utilizado por la ruta comodín `responses/`). ### 4.5 `open-sse/services/` -Aspectos destacados (lista completa en `open-sse/services/`): - -| Aspecto | Archivos | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Enrutamiento combinado | `combo.ts` (19 estrategias), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Motor Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Resiliencia | `accountFallback.ts` (enfriamiento + bloqueo), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Cuotas | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Almacenamiento en caché | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Inteligencia de enrutamiento | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Gestión de modelos | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Compresión | `compression/` — integración completa del motor de compresión | -| Tokens + sesión | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Nivel / manifiesto | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / red | `ipFilter.ts`, `webSearchFallback.ts` | -| Lotes | `batchProcessor.ts` | -| Uso | `usage.ts` | +Elementos destacados (la lista completa se encuentra en `open-sse/services/`): + +| Área | Archivos | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Enrutamiento combinado | `combo.ts` (19 estrategias), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Motor Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Resiliencia | `accountFallback.ts` (enfriamiento + bloqueo), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Cuotas | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Caché | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Inteligencia de enrutamiento | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Gestión de modelos | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Compresión | `compression/` — integración completa del motor de compresión | +| Tokens + sesiones | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Nivel / manifiesto | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / red | `ipFilter.ts`, `webSearchFallback.ts` | +| Lotes | `batchProcessor.ts` | +| Uso | `usage.ts` | ### 4.6 `open-sse/mcp-server/` @@ -539,13 +538,13 @@ Aspectos destacados (lista completa en `open-sse/services/`): módulos de memoria, habilidades, habilidades de GitHub, pool, gamificación, plugins, Notion, Obsidian, corpus local y compresión; la unión se contabiliza mediante `countUniqueMcpTools`). - **3 transportes**: stdio, HTTP Streamable, SSE. -- **33 ámbitos** aplicados en tiempo de ejecución — la lista base se encuentra en `src/shared/constants/mcpScopes.ts` y el conjunto completo es la unión de los ámbitos declarados por cada módulo de herramientas. +- **33 ámbitos** aplicados en tiempo de ejecución; la lista base está en `src/shared/constants/mcpScopes.ts` y el conjunto completo es la unión de los ámbitos declarados por cada módulo de herramientas. - Tabla de auditoría: `mcp_tool_audit` (rellenada por `audit.ts`). - Archivos: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, además de las pruebas en `__tests__/`. -- Consulte [MCP-SERVER.md](../frameworks/MCP-SERVER.md) para ver el catálogo completo de herramientas. +- Consulta [MCP-SERVER.md](../frameworks/MCP-SERVER.md) para ver el catálogo completo de herramientas. ### 4.7 `open-sse/config/` @@ -563,7 +562,7 @@ de nube (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, ### 4.8 `open-sse/utils/` -Primitivas de streaming y utilidades de proveedores: `stream.ts`, `streamHandler.ts`, +Primitivas de streaming y utilidades auxiliares de proveedores: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/es/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/es/docs/architecture/RESILIENCE_GUIDE.md index 82eb85f32d64..6fd909b09eb4 100644 --- a/docs/i18n/es/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/es/docs/architecture/RESILIENCE_GUIDE.md @@ -67,96 +67,140 @@ retroceso exponencial `minRetryCooldownMs → maxRetryCooldownMs`. Anulaciones: `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Protección contra regresiones: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Enfriamiento de conexión +## 2. Tiempo de espera de la conexión -**Ámbito:** una sola conexión/cuenta/clave de proveedor. +**Ámbito:** una única conexión/cuenta/clave del proveedor. -**Propósito:** omitir una clave defectuosa mientras las demás conexiones del mismo proveedor siguen prestando servicio. +**Propósito:** omitir una clave defectuosa mientras otras conexiones del mismo proveedor siguen atendiendo solicitudes. **Implementación:** - Marcar como no disponible: `src/sse/services/auth.ts::markAccountUnavailable()` - Selección: `getProviderCredentials*` en el mismo archivo -- Cálculo del enfriamiento: `open-sse/services/accountFallback.ts::checkFallbackError()` +- Cálculo del tiempo de espera: `open-sse/services/accountFallback.ts::checkFallbackError()` - Configuración: `src/lib/resilience/settings.ts` **Campos por conexión:** -- `rateLimitedUntil` — marca de tiempo hasta que vence el enfriamiento +- `rateLimitedUntil` — marca de tiempo hasta que finaliza el tiempo de espera - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — contador de espera exponencial +- `backoffLevel` — contador de retroceso exponencial -**Enfriamientos predeterminados:** +**Tiempos de espera predeterminados:** -- Base de OAuth: 5s -- Base de clave de API: 3s -- 429 de clave de API: prioriza los encabezados `Retry-After`/de restablecimiento del servicio ascendente o el texto de restablecimiento que pueda analizarse -- Espera: `baseCooldownMs * 2 ** failureIndex` +- Base de OAuth: 5 s +- Base de clave de API: 3 s +- 429 de clave de API: da preferencia a `Retry-After`, a las cabeceras de restablecimiento del servicio ascendente o al texto de restablecimiento que se pueda analizar +- Retroceso: `baseCooldownMs * 2 ** failureIndex` -**Protección contra avalanchas:** evita que los fallos simultáneos prolonguen excesivamente el enfriamiento o incrementen dos veces `backoffLevel`. +**Protección contra avalanchas de solicitudes:** evita que los fallos simultáneos prolonguen en exceso el tiempo de espera o incrementen dos veces `backoffLevel`. -**Estados terminales (NO son enfriamientos):** +**Estados terminales (NO son tiempos de espera):** -- `banned` — establecido por la detección de palabras clave de prohibición/bloqueo de cuenta (consulte [BAN_DETECTION](../security/BAN_DETECTION.md)) y por tres rechazos consecutivos del servicio ascendente por solicitud (`request_rejected`, p. ej., el error 403 de OAuth de Anthropic "Solicitud no permitida" — `open-sse/services/requestRejectedStreak.ts`); un solo rechazo únicamente pone la conexión en enfriamiento -- `expired` (pasa al estado terminal después de un número limitado de reintentos — `EXPIRED_RETRY_MAX = 3` con espera exponencial —, de modo que los errores transitorios de OAuth puedan resolverse por sí solos antes de que la cuenta se desactive permanentemente) +- `banned` — establecido por la detección de palabras clave de bloqueo o de cuentas bloqueadas (consulte [BAN_DETECTION](../security/BAN_DETECTION.md)), así como por tres rechazos consecutivos por solicitud del servicio ascendente (`request_rejected`, p. ej., el error 403 de OAuth de Anthropic «Request not allowed» — `open-sse/services/requestRejectedStreak.ts`); un único rechazo solo pone la conexión en tiempo de espera +- `expired` (pasa al estado terminal tras una cantidad limitada de reintentos — `EXPIRED_RETRY_MAX = 3` con retroceso exponencial — para que los errores transitorios de OAuth puedan corregirse por sí solos antes de que la cuenta se desactive permanentemente) - `credits_exhausted` -Estos persisten hasta que cambien las credenciales o un operador los restablezca. No sobrescriba los estados terminales con un estado de enfriamiento transitorio. +Estos estados persisten hasta que cambien las credenciales o un operador los restablezca. No sobrescriba los estados terminales con un estado de tiempo de espera transitorio. **Recuperación diferida:** cuando `rateLimitedUntil` queda en el pasado, la conexión vuelve a ser apta. Tras un uso correcto, `clearAccountError()` borra todos los campos de error. +### Límite de uso de OAuth de Claude: canal de menor prioridad + restablecimiento del límite de sesión + +**Ámbito:** una conexión de suscripción de Claude (OAuth). Ambas funciones son de **activación opcional por +conexión** (Editar conexión → sección de Claude → `lowPriorityMode` / `autoLimitReset` en +`providerSpecificData`, ambas desactivadas de forma predeterminada) y replican los comandos `/low-priority` y +`/limit-reset` de Claude Code (contrato de protocolo capturado de Claude Code 2.1.263). + +**Implementación:** + +- Máquina de estados + clasificación de respuestas: `open-sse/services/claudeLowPriority.ts` +- Cliente de estado/solicitud de restablecimiento: `open-sse/services/claudeLimitReset.ts` +- Enlace del ejecutor (inyección de cabecera + reintento en la misma cuenta): `open-sse/executors/base.ts::execute()` +- Persistencia de la activación opcional: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Activador:** el límite de uso de 5 horas — un `429` cuyas cabeceras contienen +`anthropic-ratelimit-unified-status: rejected` y, cuando la cuenta es apta, +`anthropic-ratelimit-unified-slow-offer: treatment`. No se envía nada antes de ese primer +429 del límite; un 429 en ráfaga sin cabeceras unificadas sigue la ruta normal de tiempo de espera. + +**Canal de menor prioridad** (`lowPriorityMode`): + +- Al recibir el 429 del límite, el ejecutor acepta la oferta y reintenta inmediatamente con la **misma** + cuenta y `anthropic-usage-limit: slow`; el canal permanece activo hasta el + `anthropic-ratelimit-unified-reset` anunciado (+60 s de margen), y todas las solicitudes dentro de ese período incluyen + la cabecera. El 429 interceptado nunca llega a `handleChatCore`, por lo que la conexión + **no** entra en tiempo de espera ni se sustituye por otra. +- `anthropic-ratelimit-unified-slow-status` en respuestas posteriores: `active` / `not_needed` + mantienen el canal; `slot_busy` (429) o un `529` esperan durante el valor de + `anthropic-ratelimit-unified-slow-retry-after` del servidor (20 s de forma predeterminada, limitado a 5–600 s, con una variación aleatoria de ±30 %) + y reintentan, con el límite de `anthropic-ratelimit-unified-slow-max-wait` (20 min de forma predeterminada, limitado a + 1 min–6 h); una vez superado, el canal finaliza y un período de espera de 10 minutos impide volver a aceptarlo. La + espera también queda limitada por el tiempo restante del propio tiempo de espera de inicio de comunicación con el servicio ascendente + de la solicitud (`resolveFetchStartTimeout`, 10 min de forma predeterminada), menos un margen de 5 s: sin ese límite, el + máximo de espera predeterminado de 20 minutos sobreviviría a la solicitud y la espera se cancelaría + a mitad de camino, mostrando un `TimeoutError` en lugar de la finalización controlada por `max_wait` y el período de espera. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, el reinicio de una ventana de 5 h o + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (que lo finaliza como + `extra_usage` con cualquier estado, ya que el exceso de uso de pago pasa a cubrir el límite) finalizan el canal; la + respuesta sigue entonces la ruta normal de tiempo de espera. `budget_exhausted` se recuerda hasta + el restablecimiento de presupuesto anunciado (≤ 8 días). +- La comprobación del límite se ejecuta después de los reintentos internos del propio ejecutor provocados por errores 400 (edición de + contexto, límites de razonamiento/esfuerzo, aprendizaje automático de parámetros), de modo que un 429 del límite que solo aparezca en + uno de esos reintentos siga interceptándose en lugar de llegar a la ruta de tiempo de espera. +- El estado se conserva en memoria por conexión (un reinicio implica un 429 del límite adicional para volver a aceptar). + +**Restablecimiento del límite de sesión** (`autoLimitReset`, se intenta antes que el canal cuando ambos están activados): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → bloque `juniper_tide`; + cuando `arm: "reset"` y `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` con + `{ "program": "juniper_tide" }` (UUID de la organización obtenido de + `providerSpecificData.organizationUUID`, con alternativa de inicialización). +- `result: reset|not_limited` → la solicitud se reintenta a velocidad completa (sin cabecera de baja velocidad). + `already_used` / `not_offered` memorizan `next_available_at` (una semana de forma predeterminada); cualquier + fallo aplica un retroceso de 15 minutos. El restablecimiento solo puede realizarse una vez por semana y sigue contando para el + límite semanal. + +Pruebas de regresión: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + ### Afinidad de sesión (#7274) -**Ámbito:** una sesión de cliente (`X-Session-Id` / `x-codex-session-id` / encabezado `x-omniroute-session`) fijada a una conexión para **cualquier** proveedor. +**Ámbito:** una sesión de cliente (`X-Session-Id` / `x-codex-session-id` / cabecera `x-omniroute-session`) fijada a una conexión, para **cualquier** proveedor. -**Propósito:** mantener un agente de varios turnos (Claude Code, aider, agentes personalizados) en la misma cuenta entre solicitudes, lo que reduce la pérdida de contexto entre cuentas y los errores 429 repetidos de arranque en frío en proveedores con estado de sesión por cuenta. +**Propósito:** mantener un agente multiturно (Claude Code, aider, agentes personalizados) en la misma cuenta entre solicitudes, reduciendo la pérdida de contexto entre cuentas y los repetidos errores 429 de arranque en frío en proveedores con estado de sesión por cuenta. **Implementación:** - Resolución del TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Selección/creación de la fijación: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Extracción del encabezado (genérica, para cualquier proveedor): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Tabla de fijaciones persistentes: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Configuración: `sessionAffinityTtlMs` (TTL global en ms, `0` lo desactiva) — `src/lib/db/settings.ts`. Se cambió el nombre del parámetro exclusivo de Codex `codexSessionAffinityTtlMs` mediante la migración `124_generic_session_affinity_ttl.sql`, que conserva cualquier TTL de Codex configurado previamente como nuevo valor predeterminado. +- Selección/creación del anclaje: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Extracción de cabeceras (genérica, para cualquier proveedor): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Tabla de anclajes persistentes: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Configuración: `sessionAffinityTtlMs` (TTL global en ms, `0` lo desactiva) — `src/lib/db/settings.ts`. Se cambió el nombre del anterior `codexSessionAffinityTtlMs`, exclusivo de Codex, mediante la migración `124_generic_session_affinity_ttl.sql`, que transfiere cualquier TTL de Codex configurado previamente como el nuevo valor predeterminado. -Antes de #7274, `resolveSessionAffinityTtlMs()` devolvía inmediatamente `0` para todos los proveedores excepto `codex`, por lo que la configuración del TTL (y los encabezados de sesión) no tenía efecto en ningún otro lugar, aunque el mecanismo de fijación y la extracción de encabezados ya eran independientes del proveedor. La corrección eliminó ese retorno anticipado; ahora el TTL se aplica uniformemente a todos los proveedores una vez establecido globalmente por encima de `0`. +Antes de #7274, `resolveSessionAffinityTtlMs()` devolvía inmediatamente `0` para todos los proveedores excepto `codex`, por lo que la configuración del TTL (y las cabeceras de sesión) no tenía efecto en ningún otro proveedor, aunque el mecanismo de anclaje y la extracción de cabeceras ya eran independientes del proveedor. La corrección eliminó ese retorno anticipado; ahora el TTL se aplica uniformemente a todos los proveedores una vez que se configura globalmente con un valor superior a `0`. -Los tres encabezados de afinidad de sesión nunca se reenvían al servicio ascendente: los ejecutores construyen desde cero sus propios encabezados para el servicio ascendente en lugar de transmitir los encabezados del cliente, por lo que esto sigue siendo únicamente un identificador interno de correlación. +Las tres cabeceras de afinidad de sesión nunca se reenvían al servidor ascendente: los ejecutores construyen sus propias cabeceras ascendentes desde cero en lugar de transmitir las cabeceras del cliente, por lo que esto sigue siendo únicamente un identificador de correlación interno. -### Arrendamientos exclusivos de conexiones para sesiones administradas +### Arrendamientos exclusivos de conexiones de sesión administradas -**Ámbito:** un cliente/sesión HTTP administrado activo posee una conexión apta de OmniRoute. +**Ámbito:** un cliente/sesión HTTP administrado activo posee una conexión elegible de OmniRoute. -**Propósito:** proporcionar la propiedad exclusiva y duradera de una conexión a los clientes que necesiten una barrera estricta de enrutamiento -entre solicitudes. Esto difiere de la afinidad de sesión, que es una preferencia flexible de continuidad: -un arrendamiento exclusivo conserva el estado del ciclo de vida en SQLite, exige la unicidad global del propietario activo y de la -conexión activa, y rechaza una generación obsoleta antes de despachar al proveedor. +**Propósito:** proporcionar la propiedad exclusiva y duradera de una conexión a los clientes que necesitan una barrera de enrutamiento estricta entre solicitudes. Esto difiere de la afinidad de sesión, que es una preferencia de continuidad flexible: un arrendamiento exclusivo conserva el estado del ciclo de vida en SQLite, impone la unicidad global del propietario activo y de la conexión activa, y rechaza una generación obsoleta antes del envío al proveedor. -La función es opcional para cada clave de API. Una clave administrada debe tener el ámbito `lease:exclusive` y una -lista `allowedConnections` explícita y no vacía. Cualquier cliente HTTP puede usar el extremo del ciclo de vida; no se -requiere ningún nombre de cliente, agente de usuario, proveedor, método OAuth ni modelo. El arrendamiento posee una conexión, -no un modelo, por lo que un cambio de modelo conserva la vinculación mientras la conexión siga siendo -apta según los criterios habituales. Las reglas normales de modelo, cuota, estado, enfriamiento y lista de permitidos siguen siendo vinculantes y pueden -transferir la misma generación a otra conexión apta que esté libre. +La función es opcional para cada clave de API. Una clave administrada debe tener el ámbito `lease:exclusive` y una lista `allowedConnections` explícita y no vacía. Cualquier cliente HTTP puede utilizar el endpoint del ciclo de vida; no se requiere ningún nombre de cliente, agente de usuario, proveedor, método OAuth ni modelo. El arrendamiento posee una conexión, no un modelo, por lo que un cambio de modelo conserva la vinculación mientras la conexión siga siendo normalmente elegible. Las reglas normales de modelo, cuota, estado, período de enfriamiento y lista de permitidos siguen teniendo autoridad y pueden trasladar la misma generación a otra conexión elegible y libre. -El ciclo de vida es `POST /api/v1/session-leases` con las acciones JSON `acquire`, `renew` y `release`. -Las solicitudes de inferencia administradas presentan el valor opaco `X-OmniRoute-Lease-Owner` y el valor exacto -`X-OmniRoute-Lease-Generation`. El propietario usa `vlo_` seguido de 43 caracteres base64url; solo -se almacena su hash SHA-256. Cada barrera final de despacho también vincula el ID de la clave de API autenticada y -el ID de la conexión activa. Los encabezados de control del arrendamiento se eliminan de los registros, de las instantáneas conservadas de las solicitudes y de -los encabezados de los ejecutores del servicio ascendente. +El ciclo de vida utiliza `POST /api/v1/session-leases` con las acciones JSON `acquire`, `renew` y `release`. Las solicitudes de inferencia administradas presentan el valor opaco `X-OmniRoute-Lease-Owner` y el valor exacto `X-OmniRoute-Lease-Generation`. El propietario utiliza `vlo_` seguido de 43 caracteres base64url; solo se almacena su hash SHA-256. Cada barrera final de envío también vincula el ID de la clave de API autenticada y el ID de la conexión activa. Las cabeceras de control del arrendamiento se eliminan de los registros, de las instantáneas de solicitudes conservadas y de las cabeceras de los ejecutores ascendentes. -Si el enrutamiento ordinario tiene candidatos administrados aptos, pero todos los candidatos libres están ocupados por un -arrendamiento activo ajeno, OmniRoute devuelve el estado HTTP `429`, un código de capacidad de arrendamiento no disponible, un -estado de espera de capacidad y un valor `Retry-After` acotado y derivado del vencimiento pertinente más próximo. -La ausencia ordinaria de conexiones aptas no constituye una contención de arrendamientos y conserva la semántica existente de los errores de enrutamiento. +Si el enrutamiento ordinario tiene candidatos administrados elegibles, pero todos los candidatos libres están ocupados por un arrendamiento activo ajeno, OmniRoute devuelve HTTP `429`, el código de capacidad de arrendamiento no disponible, un estado de espera de capacidad y un `Retry-After` acotado, derivado del vencimiento relevante más próximo. La ausencia ordinaria de elegibilidad no constituye una contención de arrendamiento y conserva la semántica de errores de enrutamiento existente. -Los mecanismos relacionados siguen siendo independientes: +Los mecanismos relacionados permanecen separados: -- La ocupación de sesiones OAuth es una distribución flexible de cuentas OAuth local al proceso. -- Los semáforos de cuenta conceden permisos de concurrencia de solicitudes y terminan cuando finaliza una solicitud. -- Los arrendamientos exclusivos de conexiones para sesiones administradas constituyen una propiedad duradera durante el ciclo de vida con una barrera de generación. +- La ocupación de sesiones OAuth es una distribución flexible y local al proceso para las cuentas OAuth. +- Los semáforos de cuenta conceden permisos de concurrencia de solicitudes y finalizan cuando se completa una solicitud. +- Los arrendamientos exclusivos de sesiones administradas proporcionan una propiedad duradera durante el ciclo de vida con una barrera de generación. --- @@ -286,48 +330,73 @@ de frecuencia por modelo. Está acotado por `comboCooldownWait` (`enabled`, `max --- -## 5. Control de admisión de la cola de solicitudes (v3.8.49 · incidencia #6593) - -**Ámbito**: la cola local de límites de frecuencia por proveedor+conexión (`open-sse/services/rateLimitManager.ts`, -respaldada por Bottleneck), una capa por debajo de los tres mecanismos anteriores. - -**`maxWaitMs` es un nombre persistente heredado para la expiración de la ejecución.** -`resilienceSettings.requestQueue.maxWaitMs` se pasa a Bottleneck como la propiedad -`expiration` de un trabajo, cuyo temporizador solo se inicia después del envío. Por lo tanto, limita -la ejecución administrada por el limitador, no el tiempo empleado en la cola local. La expiración se -expone como el `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` local de confianza (HTTP 504); -el nombre anterior del código de tiempo de espera de la cola solo se acepta para mantener la compatibilidad -interna retroactiva de confianza. El valor predeterminado es 15000ms; puede sobrescribirse mediante -`RATE_LIMIT_MAX_WAIT_MS` (variable de entorno) o el panel (**Configuración → Resiliencia**, -límite de la interfaz de usuario de 1–30000ms). La permanencia en la cola no tiene un límite de tiempo; utilice -`maxQueueDepth` a continuación para limitar las solicitudes en cola. - -**`maxQueueDepth`: límite de admisión opcional (nuevo).** `resilienceSettings.requestQueue.maxQueueDepth` -limita cuántas solicitudes pueden permanecer en cola (todavía sin enviar) simultáneamente para una +## 5. Control de admisión de la cola de solicitudes (v3.8.49 · issue #6593) + +**Ámbito**: la cola local de limitación de tasa por proveedor+conexión (`open-sse/services/rateLimitManager.ts`, +respaldada por Bottleneck), un nivel por debajo de los tres mecanismos anteriores. + +**`maxWaitMs` limita la espera en cola; `executionMaxWaitMs` limita la ejecución.** +Ambos límites están separados deliberadamente y ninguno influye en el otro. + +`resilienceSettings.requestQueue.maxWaitMs` es el **presupuesto de espera en cola**: +abarca la espera de una ranura del proveedor y la posterior permanencia en estado QUEUED, y su temporizador se +cancela en el momento en que el trabajo deja el estado QUEUED y comienza a ejecutarse +(`rateLimitManager.ts`, `wrappedFn`). Una solicitud que lo supere nunca llega +al servicio upstream. El valor predeterminado es 30000ms, proporcionado por `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +en `src/lib/resilience/settings.ts` y fijado por +`tests/unit/ratelimit-admission-control-6593.test.ts`, de modo que cualquier cambio +hará que esa prueba falle, en lugar de dejar que este párrafo quede silenciosamente desactualizado. + +`resilienceSettings.requestQueue.executionMaxWaitMs` es lo que Bottleneck +recibe como `expiration` del trabajo, cuyo temporizador comienza solo después del despacho. Sirve +como protección de último recurso para ejecutores que no tienen su propio tiempo de espera del upstream y se +aumenta hasta el tiempo de espera de inicio de fetch del propio ejecutor cuando este es mayor, por lo que +no puede interrumpir una respuesta en curso que funciona correctamente. El valor predeterminado es 600000ms (10 min). + +Usar el presupuesto de cola como `expiration` era lo que antes interrumpía en mitad de la ejecución +las puertas de enlace no incrementales — legítimamente pueden ejecutarse durante minutos antes de enviar los primeros bytes —, +y por eso una expiración se expone como `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), mientras que el presupuesto de cola utiliza el +código de tiempo de espera de la cola. Sobrescriba cualquiera de ellos mediante `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (variable de entorno) o desde el panel +(**Configuración → Resiliencia**). Ambos se limitan al intervalo de 1ms–24h al normalizarse. + +**Precedencia, para ambos:** la variable de entorno solo proporciona el valor _predeterminado_. Un valor +persistido en `resilienceSettings.requestQueue` (panel / parche de API, almacenado +en `key_value`) tiene prioridad, y un valor por conexión de +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` tiene prioridad sobre este último. Por tanto, establecer +la variable de entorno en un despliegue que ya tenga un valor persistido +no cambia nada; en su lugar, borre o actualice el ajuste persistido. + +La permanencia en la cola está limitada por `maxWaitMs`; `maxQueueDepth`, descrito a continuación, limita cuántos +solicitantes pueden estar en cola simultáneamente. + +**`maxQueueDepth` — límite de admisión opcional (nuevo).** `resilienceSettings.requestQueue.maxQueueDepth` +limita cuántas solicitudes pueden permanecer en cola (aún sin despachar) simultáneamente para una combinación de proveedor+conexión. Cuando la cola ya contiene `maxQueueDepth` solicitudes, una nueva solicitud se rechaza inmediatamente con un error tipado -`code: "RATE_LIMIT_QUEUE_FULL"` **antes** de que llegue a `limiter.schedule()`; -por lo tanto, el rechazo tiene un coste bajo y ocurre antes de cualquier trabajo posterior de -compresión o traducción del prompt para esa solicitud. El valor predeterminado `0` = -desactivado, lo que conserva el comportamiento existente de cola sin límites; intervalo permitido: 0–100000. -Puede sobrescribirse mediante `RATE_LIMIT_MAX_QUEUE_DEPTH` (variable de entorno) o -`resilienceSettings.requestQueue.maxQueueDepth` (parche del panel o la API). +`code: "RATE_LIMIT_QUEUE_FULL"` **antes** de llegar a `limiter.schedule()` +— por lo que el rechazo es barato y ocurre antes de cualquier trabajo posterior de +compresión / traducción del prompt para esa solicitud. El valor predeterminado es `0` = +desactivado, lo que conserva el comportamiento existente de cola sin límites; limitado a 0–100000. +Sobrescríbalo mediante `RATE_LIMIT_MAX_QUEUE_DEPTH` (variable de entorno) o +`resilienceSettings.requestQueue.maxQueueDepth` (panel/parche de API). La propia comprobación de admisión es una función pura (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), por lo que puede someterse a pruebas unitarias sin un limitador Bottleneck real. -> El RFC que abrió la incidencia #6593 también propuso una marca `bypassCompressionOnRateLimit`. +> El RFC que dio origen a #6593 también propuso un indicador `bypassCompressionOnRateLimit`. > La canalización `open-sse/services/compression/` de este repositorio realiza -> la compresión del prompt/contexto en la solicitud saliente al LLM (`chatCore.ts`, +> compresión del prompt/contexto en la solicitud saliente al LLM (`chatCore.ts`, > alrededor del bloque `resolveCompressionSettings`/`selectCompressionStrategy`), -> no la compresión de respuestas HTTP en cuerpos 429 sintetizados; no existe una -> ruta de código correspondiente para una marca de omisión literal. Ese paso de compresión del prompt +> no compresión de respuestas HTTP en cuerpos 429 sintetizados; no existe una +> ruta de código correspondiente para un indicador de omisión literal. Ese paso de compresión del prompt > también se ejecuta actualmente _antes_ de `withRateLimit()` en la canalización de solicitudes, por lo que -> cambiar el orden para omitirlo ante un rechazo por cola llena constituye un cambio independiente y de mayor -> alcance que el de esta incidencia; **no** se implementó aquí intencionadamente -> y se dejó como tarea posterior por si el ahorro de CPU compensa el -> riesgo de cambiar el orden. +> reordenarlo para omitirlo ante un rechazo por cola llena constituye un cambio independiente y de mayor +> alcance que el de este issue; intencionadamente **no** se implementó +> aquí y se deja como tarea de seguimiento si el ahorro de CPU compensa el +> riesgo de reordenación. --- diff --git a/docs/i18n/es/docs/architecture/admission-lanes.md b/docs/i18n/es/docs/architecture/admission-lanes.md index ea19ec7856ec..3b559c1563fe 100644 --- a/docs/i18n/es/docs/architecture/admission-lanes.md +++ b/docs/i18n/es/docs/architecture/admission-lanes.md @@ -9,47 +9,50 @@ complementarios; los operadores deben saber cuál están observando. ## 1. Admisión a nivel de bytes para todo el proceso (`chatBodyAdmission.ts`) -- **Ámbito:** la ruta de cuerpos almacenados en búfer/memoria heap para `POST /v1/chat/completions`, +- **Ámbito:** la ruta de cuerpo almacenado en búfer/montículo para `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` y las demás rutas con formato de chat. Protege - frente a la amplificación del heap causada por cuerpos grandes de agentes de programación (#4380). + contra la amplificación del montículo provocada por cuerpos grandes de agentes de programación (#4380). - **Un controlador global por proceso, no carriles por clave (#10110).** Cada clave de API - (con hash) o sesión `anonymous` se admite con cargo al **mismo** presupuesto compartido; - el identificador de sesión con hash se usa ÚNICAMENTE como clave de planificación equitativa (despacho - por turnos entre solicitudes en espera), nunca como partición de capacidad. Una versión anterior de este + (con hash) o sesión `anonymous` se admite en función del **mismo** presupuesto compartido; + el id de sesión con hash se utiliza ÚNICAMENTE como clave de planificación equitativa (despacho + por turnos entre quienes esperan), nunca como partición de capacidad. Una versión anterior de este documento describía carriles por clave con capacidad independiente; ese modelo se eliminó en #10110 porque permitía que credenciales falsas no autenticadas multiplicaran el límite para todo el proceso. -- **Puerta de admisión (#503-fanout): un presupuesto de BYTES de ingesta derivado automáticamente, no un recuento fijo de - solicitudes.** El límite heredado por número de solicitudes `CHAT_MAX_HEAVY_IN_FLIGHT` (valor predeterminado `1` +- **Control (#503-fanout): un presupuesto de ingestión en BYTES derivado automáticamente, no un recuento fijo de + solicitudes.** El límite heredado por recuento de solicitudes `CHAT_MAX_HEAVY_IN_FLIGHT` (valor predeterminado `1` antes de esta corrección) reducía el fan-out de los agentes de programación (varios subagentes/CLI, - con cuerpos habitualmente > 256 KB) a una concurrencia efectiva de ~1, lo que provocaba respuestas - 503 bajo una carga completamente normal. Ahora solo impone límites cuando un operador establece explícitamente - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Si no se establece, la admisión queda limitada - por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`: un presupuesto derivado automáticamente del + con cuerpos habitualmente > 256 KB) a una concurrencia efectiva de ~1, lo que provocaba respuestas 503 + bajo una carga completamente normal. Ahora solo se aplica cuando un operador establece explícitamente + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Si no se establece, la admisión queda + controlada por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`: un presupuesto derivado automáticamente del límite real de memoria del proceso (`src/shared/middleware/admissionBudget.ts`): - el 25 % del menor valor entre el límite del heap de V8 y cualquier límite de cgroup/contenedor, - dividido por un factor de amplificación transitoria de 8x, acotado entre 8 MiB y - 2 GiB. Las anulaciones explícitas usan los mismos límites. Esto se ajusta automáticamente desde un - contenedor de 512 MB hasta un equipo de escritorio de 32 GB sin configurar variables de entorno. Un cuerpo que no pueda - caber dentro del presupuesto efectivo falla inmediatamente con `413 body_exceeds_budget`; + el 25 % del menor valor entre el límite del montículo de V8 y cualquier límite de cgroup/contenedor, + dividido por un factor de amplificación transitoria de 8x y restringido a un intervalo de entre 8 MiB y + 2 GiB. Las anulaciones explícitas utilizan los mismos límites. Esto se ajusta automáticamente desde un + contenedor de 512 MB hasta un equipo de escritorio de 32 GB sin configurar variables de entorno. Un cuerpo que no + pueda caber dentro del presupuesto efectivo falla inmediatamente con `413 body_exceeds_budget`; solo la contención entre cuerpos que pueden procesarse individualmente entra en la cola acotada - de equidad. Un monitor activo de presión de recursos basado en varias señales (proporción del heap de V8, - cgroup, PSI, eventos OOM — `open-sse/utils/resourcePressurePolicy.ts`) reduce - la espera acotada cuando la presión es `high` y descarta la solicitud inmediatamente con - `503 resource_pressure` cuando la presión es `critical`, antes incluso de ingerir - ningún byte. -- **Ajuste:** + de equidad. Un monitor activo de presión de recursos basado en múltiples señales (proporción del montículo de V8, + cgroup, PSI, eventos OOM: `open-sse/utils/resourcePressurePolicy.ts`) reduce + la espera acotada bajo presión `high` y rechaza inmediatamente con + `503 resource_pressure` bajo presión `critical`, antes incluso de ingerir + ningún byte. PSI se lee del archivo `memory.pressure` del cgroup de esta unidad cuando está presente + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` abarca + todo el host y solo se utiliza como alternativa en hardware físico/cgroup v1, de modo que un + host que utilice intercambio de memoria no pueda provocar un 503 en un contenedor inactivo. +- **Ajustes:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — anulación del presupuesto de bytes derivado automáticamente - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — límite heredado por número de solicitudes, solo mediante activación explícita - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — tiempo de espera en cola antes de devolver 503 (valor predeterminado: 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — válvula del heap para bytes en cola (valor predeterminado: 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — obsoletas + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — límite heredado por recuento de solicitudes, solo mediante activación explícita + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — espera en cola antes de un 503 (valor predeterminado: 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — válvula del montículo para bytes en cola (valor predeterminado: 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — obsoletos y sin efecto desde #10110 (se aceptan por compatibilidad de configuración, pero se ignoran) - **Informes:** `GET /api/monitoring/health` → `chatAdmission` (#11244), incluidas las adiciones de #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` y `countCapEnabled` - (false en un despliegue predeterminado; confirma que el presupuesto de bytes, y no el límite heredado - por recuento, es el que realmente está imponiendo el límite). + (false en una implementación predeterminada; confirma que el presupuesto de bytes, y no el límite heredado + por recuento, es el que realmente se está aplicando). ## 2. Carriles virtuales adaptativos en tiempo de ejecución (`open-sse/services/admission`) diff --git a/docs/i18n/es/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/es/docs/frameworks/EMBEDDED-SERVICES.md index 53c899bfdcaf..0a157a73ab8e 100644 --- a/docs/i18n/es/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/es/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Versión:** v3.8.44 -> **Última actualización:** 2026-07-03 -> **Audiencia:** Ingenieros que añaden, mantienen o depuran servicios integrados (9Router, CLIProxyAPI, Mux, Bifrost). +> **Última actualización:** 2026-09-09 +> **Audiencia:** Ingenieros que añaden, mantienen o depuran servicios integrados (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Los servicios integrados son herramientas auxiliares de procesos instaladas localmente que OmniRoute instala, supervisa y -expone como destinos de enrutamiento de primera clase. A diferencia de los proveedores externos (a los que se accede por internet -mediante claves de API), los servicios integrados se ejecutan en la misma máquina que OmniRoute y se comunican a través de la interfaz de bucle invertido. +Los servicios integrados son herramientas de procesos auxiliares instaladas localmente que OmniRoute instala, supervisa y +expone como destinos de enrutamiento de primera clase. A diferencia de los proveedores externos (a los que se accede a través de Internet +mediante claves de API), los servicios integrados se ejecutan en el mismo equipo que OmniRoute y se comunican a través de la interfaz de bucle invertido. --- @@ -31,22 +31,23 @@ mediante claves de API), los servicios integrados se ejecutan en la misma máqui ### ¿Por qué servicios integrados? -Hay cinco servicios integrados: +Se integran seis servicios: -| Servicio | Paquete npm | Puerto predeterminado | Propósito | -| --------------- | --------------------------------------------- | :-------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | Enrutador de IA que OmniRoute puede usar como subproveedor. Los modelos se exponen como `9router/{sub}/{model}` | -| **CLIProxyAPI** | Binario de una versión de GitHub (`cliproxy`) | 8317 | Adaptador de proxy local para los flujos de autenticación de la CLI de Anthropic. Proporciona enrutamiento alternativo cuando caducan los tokens de OAuth | -| **Mux** | `mux` (`mux server` sin interfaz gráfica) | 8322 | Demonio local de orquestación de agentes (coder/mux). Solo se gestiona su ciclo de vida; no es un destino de enrutamiento (sin proxy de LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend de retransmisión de puerta de enlace de IA en Go. Cuando está en ejecución, la ruta de retransmisión (`/v1/relay/`) lo selecciona automáticamente | -| **Dario** | `@askalf/dario` | 3456 | Proxy de suscripción de Claude: alternativa o conmutación por error a CLIProxyAPI para tráfico con el formato de Claude Code; la clave inyectada se convierte en `DARIO_ADMIN_TOKEN`, que protege su plano de control OAuth `/admin/*` | +| Servicio | Paquete npm | Puerto predeterminado | Propósito | +| --------------- | --------------------------------------------- | :-------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | Enrutador de IA que OmniRoute puede utilizar como subproveedor. Los modelos se exponen como `9router/{sub}/{model}` | +| **CLIProxyAPI** | Binario de una versión de GitHub (`cliproxy`) | 8317 | Adaptador de proxy local para los flujos de autenticación de la CLI de Anthropic. Proporciona enrutamiento de respaldo cuando caducan los tokens de OAuth | +| **Mux** | `mux` (`mux server` sin interfaz gráfica) | 8322 | Demonio local de orquestación de agentes (coder/mux). Solo se gestiona su ciclo de vida; no es un destino de enrutamiento (no actúa como proxy de LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend de retransmisión de la puerta de enlace de IA en Go. Cuando está en ejecución, la ruta de retransmisión (`/v1/relay/`) lo selecciona automáticamente | +| **Dario** | `@askalf/dario` | 3456 | Proxy de suscripción de Claude: alternativa o conmutación por error de CLIProxyAPI para el tráfico con formato de Claude Code; la clave inyectada se convierte en `DARIO_ADMIN_TOKEN`, que protege su plano de control de OAuth `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Automatización de WhatsApp Web (Chromium sin interfaz gráfica mediante Puppeteer). Solo se gestiona su ciclo de vida; no es un destino de enrutamiento. | -Los cinco siguen el mismo modelo de supervisión: +Los seis siguen el mismo modelo de supervisión: - OmniRoute los instala en `DATA_DIR/services/{name}/` (aislados del propio `package.json` de OmniRoute) - OmniRoute los inicia y supervisa como procesos secundarios - OmniRoute inyecta una clave de API efímera en el entorno del proceso secundario y la rota sin tiempo de inactividad (cuando corresponde) -- Todas las rutas de administración (`/api/services/*`) son **LOCAL_ONLY** — solo se puede acceder a ellas desde la interfaz de bucle invertido (regla estricta n.º 17) +- Todas las rutas de administración (`/api/services/*`) son **SOLO_LOCALES** — accesibles únicamente desde la interfaz de bucle invertido (regla estricta n.º 17) ### Decisiones clave (del plan de diseño) @@ -55,9 +56,9 @@ Los cinco siguen el mismo modelo de supervisión: | Acceso del panel a la interfaz nativa de 9Router | Proxy inverso en `/dashboard/providers/services/9router/embed/*` | | Mecanismo de instalación | `npm install {package}` mediante `execFile` (sin interpolación del shell) | | Modo de consumo | Proveedor registrado como `9router/{sub}/{model}` en el motor de enrutamiento | -| Administración de claves de API | OmniRoute las genera, las cifra en reposo (AES-256-GCM) y las inyecta mediante variables de entorno | +| Gestión de claves de API | OmniRoute las genera, las cifra en reposo (AES-256-GCM) y las inyecta mediante variables de entorno | | Ubicación en el panel | `/dashboard/providers/services` (tres pestañas) | -| Inicio automático | Opción conmutable por servicio, desactivada de forma predeterminada | +| Inicio automático | Opción por servicio, desactivada de forma predeterminada | --- @@ -67,8 +68,7 @@ Los cinco siguen el mismo modelo de supervisión: ┌────────────────────────────────────────────────────────────────────┐ │ Capa 1 — IU │ │ /dashboard/providers/services (pestañas: CLIProxyAPI | 9Router | Mux)│ -│ Registros en vivo (SSE), Iniciar/Detener/Reiniciar/Actualizar, │ -│ Configuración, Instalar │ +│ Registros en vivo (SSE), Iniciar/Detener/Reiniciar/Actualizar, Configuración, Instalar│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx Contenedor + enrutamiento de pestañas mediante ?tab=│ @@ -88,22 +88,22 @@ Los cinco siguen el mismo modelo de supervisión: │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (proxy inverso HTTP + WebSocket → servidor de origen 9Router) │ +│ (proxy HTTP inverso + WebSocket → servidor de origen 9Router) │ │ │ │ Control: LOCAL_ONLY_API_PREFIXES incluye "/api/services/" y │ -│ "/dashboard/providers/services/*/embed/" │ +│ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ llamadas dentro del proceso ┌──────────────────────▼─────────────────────────────────────────────┐ │ Capa 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Supervisor genérico (child_process.spawn) │ -│ ├── instalación: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── inicio: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── clave API: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ -│ ├── puerto: 20130 para 9Router (configurable) │ -│ ├── registros: búfer circular stdio de 5 MB → eventos SSE │ -│ ├── salud: HTTP GET /health cada 2–5 s, recuperación diferida│ +│ ├── instalar: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── iniciar: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── puerto: 20130 para 9Router (configurable) │ +│ ├── registros: búfer circular de stdio de 5 MB → eventos SSE │ +│ ├── salud: HTTP GET /health cada 2–5 s, recuperación diferida│ │ └── ciclo de vida: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ @@ -112,7 +112,7 @@ Los cinco siguen el mismo modelo de supervisión: │ modelSync.ts GET /v1/models periódico → tabla service_models│ │ ringBuffer.ts Búfer circular de registros (5 MB por servicio)│ │ healthCheck.ts Sondeo HTTP periódico del estado │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (adaptadores de instalación) │ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP compatible con OpenAI (loopback) @@ -120,43 +120,42 @@ Los cinco siguen el mismo modelo de supervisión: │ Capa 4 — Proveedor / Enrutamiento │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Vuelve a consultar el puerto y la clave API en cada solicitud │ -│ (sin caché). Elimina el prefijo "9router/" del identificador del│ -│ modelo antes de enviarlo mediante proxy. │ -│ Devuelve 503 service_not_running si el supervisor no está en │ -│ estado "running". │ +│ Vuelve a consultar el puerto y la clave API en cada solicitud (sin caché).│ +│ Elimina el prefijo "9router/" del id. del modelo antes de redirigir.│ +│ Devuelve 503 service_not_running si el supervisor no está en "running".│ │ │ │ src/shared/constants/providers.ts │ │ Entrada para "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ Modelos almacenados como "9router/{sub}/{model}" (con prefijo). │ -│ Sincronizados cada 5 min mediante modelSync.ts. │ +│ Sincronizados cada 5 min por modelSync.ts. │ │ │ -│ Mux SOLO se gestiona durante su ciclo de vida (capas 1-3): es un │ -│ daemon de orquestación de agentes, no un proxy de LLM, por lo que │ -│ no tiene ejecutor ni entrada de proveedor en la capa 4 y nunca es │ -│ un destino de enrutamiento. │ +│ Mux SOLO gestiona el ciclo de vida (capas 1-3): es un demonio de │ +│ orquestación de agentes, no un proxy de LLM, por lo que no tiene │ +│ ejecutor ni entrada de proveedor en la capa 4 y nunca es un │ +│ destino de enrutamiento. │ └────────────────────────────────────────────────────────────────────┘ ``` -### Archivos fuente clave +### Archivos de código fuente clave -| Archivo | Función | -| ------------------------------------------- | -------------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Clase principal: ciclo de vida, bloqueo, salud, búfer circular | -| `src/lib/services/bootstrap.ts` | Registro a nivel de proceso e inicio automático | -| `src/lib/services/registry.ts` | Mapa singleton `tool → supervisor` | -| `src/lib/services/apiKey.ts` | Generación de claves, cifrado AES-256-GCM en reposo | -| `src/lib/services/modelSync.ts` | Sincronización periódica de modelos (5 min) y bajo demanda | -| `src/lib/services/ringBuffer.ts` | Búfer circular de registros de 5 MB con suscripción SSE | -| `src/lib/services/healthCheck.ts` | Sonda de salud HTTP (intervalo configurable) | -| `src/lib/services/installers/ninerouter.ts` | Instalación/actualización/desinstalación mediante npm de 9Router | -| `src/lib/services/installers/cliproxy.ts` | Instalación/actualización/desinstalación mediante npm de CLIProxyAPI | -| `src/lib/services/installers/mux.ts` | Instalación/actualización/desinstalación mediante npm de Mux | -| `src/app/api/services/9router/_lib.ts` | Función auxiliar `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Endpoint compartido de registros SSE | -| `open-sse/executors/ninerouter.ts` | Ejecutor del proveedor (capa 4) | +| Archivo | Función | +| ------------------------------------------- | ---------------------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Clase principal: ciclo de vida, bloqueo, estado, búfer circular | +| `src/lib/services/bootstrap.ts` | Registro a nivel de proceso e inicio automático | +| `src/lib/services/registry.ts` | Mapa singleton `tool → supervisor` | +| `src/lib/services/apiKey.ts` | Generación de claves y cifrado AES-256-GCM en reposo | +| `src/lib/services/modelSync.ts` | Sincronización periódica de modelos (5 min) y bajo demanda | +| `src/lib/services/ringBuffer.ts` | Búfer circular de registros de 5 MB con suscripción SSE | +| `src/lib/services/healthCheck.ts` | Sondeo de estado HTTP (intervalo configurable) | +| `src/lib/services/installers/ninerouter.ts` | Instalación/actualización/desinstalación mediante npm para 9Router | +| `src/lib/services/installers/cliproxy.ts` | Instalación/actualización/desinstalación mediante npm para CLIProxyAPI | +| `src/lib/services/installers/mux.ts` | Instalación/actualización/desinstalación mediante npm para Mux | +| `src/lib/services/installers/openwa.ts` | Instalación/actualización/desinstalación mediante npm para open-wa | +| `src/app/api/services/9router/_lib.ts` | Función auxiliar `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | Endpoint compartido de registros SSE | +| `open-sse/executors/ninerouter.ts` | Ejecutor del proveedor (capa 4) | --- @@ -212,8 +211,8 @@ condiciones de carrera cuando, por ejemplo, el inicio automático y un botón de ## 4. Referencia de la API -Todas las rutas bajo `/api/services/` son **LOCAL_ONLY** (solo bucle local, regla estricta n.º 17). -Las solicitudes que no procedan del bucle local reciben `403 LOCAL_ONLY`, independientemente del token de autenticación. +Todas las rutas bajo `/api/services/` son **LOCAL_ONLY** (solo loopback, regla estricta n.º 17). +Las solicitudes que no provengan de loopback reciben `403 LOCAL_ONLY`, independientemente del token de autenticación. ### 4.1 Endpoints de 9Router (11 rutas) @@ -222,44 +221,44 @@ Las solicitudes que no procedan del bucle local reciben `403 LOCAL_ONLY`, indepe Instala 9Router desde npm. Crea `DATA_DIR/services/9router/` con sus propios `package.json` y `node_modules/`. No entra en conflicto con las dependencias de OmniRoute. -**Cuerpo de la solicitud** (todos los campos son opcionales): +**Cuerpo de la solicitud** (todo opcional): ```json { "version": "latest" } ``` -| Campo | Tipo | Valor predeterminado | Descripción | -| --------- | -------- | -------------------- | --------------------------------------------- | -| `version` | `string` | `"latest"` | Etiqueta de versión npm o semver que instalar | +| Campo | Tipo | Valor predeterminado | Descripción | +| --------- | -------- | -------------------- | ------------------------------------------------ | +| `version` | `string` | `"latest"` | Etiqueta de versión de npm o semver que instalar | **Respuestas:** -| Estado | Descripción | -| ------ | ------------------------------------------------------------------------------ | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Cuerpo de solicitud no válido (fallo de validación de Zod) | -| `409` | Ya se está instalando (bloqueo retenido) | -| `500` | La instalación de npm falló; consulte `message` para ver un error comprensible | +| Estado | Descripción | +| ------ | --------------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Cuerpo de solicitud no válido (fallo de validación de Zod) | +| `409` | Instalación ya en curso (bloqueo adquirido) | +| `500` | Falló la instalación de npm; consulte `message` para obtener un error descriptivo | -**Notas:** Utiliza `execFile('npm', [...])`: sin shell ni interpolación (regla estricta n.º 13). -Los errores EACCES se presentan mediante mensajes comprensibles. +**Notas:** Usa `execFile('npm', [...])`: sin shell ni interpolación (regla estricta n.º 13). +Los errores EACCES se presentan como mensajes descriptivos. --- #### `POST /api/services/9router/start` -Inicia 9Router. Registra un supervisor si aún no está registrado y, después, llama a +Inicia 9Router. Registra un supervisor si aún no está registrado y, a continuación, llama a `supervisor.start()`. Es idempotente si ya está en ejecución. **Cuerpo de la solicitud:** ninguno **Respuestas:** -| Estado | Descripción | -| ------ | ----------------------------------------------------------- | -| `200` | Objeto `ServiceStatus` (consulte el esquema a continuación) | -| `409` | 9Router no está instalado (`status: "not_installed"`) | -| `503` | El inicio falló (error del proceso; consulte `lastError`) | +| Estado | Descripción | +| ------ | --------------------------------------------------------- | +| `200` | Objeto `ServiceStatus` (consulte el esquema siguiente) | +| `409` | 9Router no está instalado (`status: "not_installed"`) | +| `503` | Falló el inicio (error del proceso; consulte `lastError`) | **Esquema de ServiceStatus:** @@ -279,23 +278,23 @@ Inicia 9Router. Registra un supervisor si aún no está registrado y, después, #### `POST /api/services/9router/stop` -Detiene 9Router de forma controlada. Envía SIGTERM, espera 15 s y, si aún sigue activo, +Detiene 9Router de forma controlada. Envía SIGTERM, espera 15 s y, si sigue activo, envía SIGKILL. Es idempotente si ya está detenido. **Cuerpo de la solicitud:** ninguno **Respuestas:** -| Estado | Descripción | -| ------ | ----------------------------------- | -| `200` | `ServiceStatus` (estado: "stopped") | -| `503` | La detención falló inesperadamente | +| Estado | Descripción | +| ------ | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | La detención falló inesperadamente | --- #### `POST /api/services/9router/restart` -Equivale a ejecutar `stop()` y después `start()` bajo el bloqueo de operaciones. +Equivale a ejecutar `stop()` y luego `start()` bajo el bloqueo de operación. **Cuerpo de la solicitud:** ninguno @@ -305,11 +304,11 @@ Equivale a ejecutar `stop()` y después `start()` bajo el bloqueo de operaciones #### `POST /api/services/9router/update` -Actualiza 9Router a una versión más reciente de npm. Si el servicio está en ejecución, primero -se detiene, se ejecuta la instalación de npm (instalando la versión más reciente en la misma ubicación) -y, después, se reinicia el servicio. +Actualiza 9Router a una versión más reciente de npm. Si el servicio está en ejecución, +primero se detiene, se ejecuta la instalación de npm (instalando la versión más reciente +en la misma ubicación) y, a continuación, se reinicia el servicio. -**Cuerpo de la solicitud** (todos los campos son opcionales): +**Cuerpo de la solicitud** (todo opcional): ```json { "version": "latest" } @@ -321,7 +320,7 @@ y, después, se reinicia el servicio. | ------ | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | | `400` | Cuerpo no válido | -| `500` | La actualización de npm falló | +| `500` | Falló la actualización de npm | --- @@ -338,23 +337,24 @@ se invalida inmediatamente. | Estado | Descripción | | ------ | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Error al rotar la clave | +| `500` | Falló la rotación | -**Seguridad:** La nueva clave nunca se devuelve en la respuesta (no hay filtración de credenciales). +**Seguridad:** La nueva clave nunca se devuelve en la respuesta (no se filtran credenciales). Se almacena cifrada (AES-256-GCM) en la tabla `version_manager`. --- #### `GET /api/services/9router/status` -Devuelve el estado combinado en vivo y de la base de datos, incluidos los metadatos de versión y una vista previa de la clave de API. +Devuelve el estado combinado en vivo y de la base de datos, incluidos los metadatos de +versión y una vista previa de la clave de API. **Respuestas:** -| Estado | Descripción | -| ------ | ---------------------------------- | -| `200` | Consulte el esquema a continuación | -| `500` | Error al leer el estado | +| Estado | Descripción | +| ------ | ----------------------------- | +| `200` | Consulte el esquema siguiente | +| `500` | Falló la lectura del estado | **Esquema de respuesta:** @@ -380,8 +380,8 @@ Devuelve el estado combinado en vivo y de la base de datos, incluidos los metada #### `POST /api/services/9router/auto-start` -Activa o desactiva la opción de inicio automático. Cuando `enabled: true`, el servicio se inicia automáticamente -la próxima vez que OmniRoute arranque (si el servicio está instalado). +Alterna el indicador de inicio automático. Cuando `enabled: true`, el servicio se inicia +automáticamente la próxima vez que OmniRoute arranque (si el servicio está instalado). **Cuerpo de la solicitud:** @@ -404,18 +404,18 @@ Flujo SSE de registros en vivo procedentes del búfer circular de stdout/stderr **Parámetros de consulta:** -| Parámetro | Tipo | Predeterminado | Descripción | -| --------- | --------- | -------------- | ---------------------------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Número de líneas históricas que se enviarán primero (máximo 1000) | -| `filter` | `string` | ninguno | Filtro de subcadena sin distinción entre mayúsculas y minúsculas (sin regex; protegido contra ReDoS) | +| Parámetro | Tipo | Valor predeterminado | Descripción | +| --------- | --------- | -------------------- | ------------------------------------------------------------------------------------------------ | +| `tail` | `integer` | 200 | Número de líneas históricas que enviar primero (máximo de 1000) | +| `filter` | `string` | ninguno | Filtro de subcadena que no distingue mayúsculas de minúsculas (sin regex; seguro frente a ReDoS) | **Eventos SSE:** -| Evento | Datos | Descripción | -| ----------- | ----------- | ----------------------------------- | -| `snapshot` | `LogLine[]` | Últimas líneas históricas iniciales | -| `log` | `LogLine` | Línea de registro en vivo | -| `heartbeat` | `{}` | Señal de actividad cada 15 s | +| Evento | Datos | Descripción | +| ----------- | ----------- | ---------------------------- | +| `snapshot` | `LogLine[]` | Segmento histórico inicial | +| `log` | `LogLine` | Línea de registro en vivo | +| `heartbeat` | `{}` | Señal de actividad cada 15 s | **Esquema de LogLine:** @@ -429,91 +429,127 @@ Flujo SSE de registros en vivo procedentes del búfer circular de stdout/stderr **Respuestas:** -| Estado | Descripción | -| ------ | ----------------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | El parámetro `filter` es demasiado largo (> 200 caracteres) | -| `404` | Servicio no encontrado (supervisor no registrado) | +| Estado | Descripción | +| ------ | ----------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | Parámetro `filter` demasiado largo (> 200 caracteres) | +| `404` | Servicio no encontrado (supervisor no registrado) | --- ### 4.2 Endpoints de CLIProxyAPI (10 rutas) -CLIProxyAPI tiene la misma estructura de endpoints que 9Router, excepto `rotate-key`, y además -incluye `accounts`, `provider-expose` y `auto-restart-adopted`. Ahora recibe una -clave de API dedicada para el plano de datos, inyectada al iniciar el proceso (`needsApiKey: true` en +CLIProxyAPI tiene la misma estructura de endpoints que 9Router, excepto `rotate-key`, e incluye además +`accounts`, `provider-expose` y `auto-restart-adopted`. Ahora recibe una +clave de API dedicada para el plano de datos, inyectada al iniciarse (`needsApiKey: true` en `bootstrap.ts`, utilizada para la sincronización de modelos); `status` incluye menos campos. -| Método | Ruta | Descripción | -| ------ | ----------------------------------- | ---------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Instala CLIProxyAPI desde npm | -| `POST` | `/api/services/cliproxy/start` | Inicia CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Detiene CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Reinicia CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Actualiza a una versión más reciente | -| `GET` | `/api/services/cliproxy/status` | Estado en vivo y de la BD (sin `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Activa o desactiva el inicio automático | - -El endpoint compartido `GET /api/services/{name}/logs` (consulte §4.1) funciona para los +| Método | Ruta | Descripción | +| ------ | ----------------------------------- | ----------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Instalar CLIProxyAPI desde npm | +| `POST` | `/api/services/cliproxy/start` | Iniciar CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Detener CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Reiniciar CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Actualizar a una versión más reciente | +| `GET` | `/api/services/cliproxy/status` | Estado en vivo + BD (sin `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Activar o desactivar el inicio automático | + +El endpoint compartido `GET /api/services/{name}/logs` (véase §4.1) funciona para los cuatro servicios mediante el segmento dinámico `[name]`. --- ### 4.3 Endpoints de Mux (8 rutas) -Mux tiene la misma estructura de endpoints que CLIProxyAPI: no hay ninguna ruta `rotate-key` en la +Mux tiene la misma estructura de endpoints que CLIProxyAPI: no hay una ruta `rotate-key` en la superficie de la API (el token de portador se genera de la misma forma que el de 9Router mediante `getOrCreateApiKey("mux")` y se inyecta mediante la variable de entorno `MUX_SERVER_AUTH_TOKEN`, pero -todavía no existe un endpoint dedicado para rotarlo). Mux solo está gestionado en cuanto a su ciclo de vida: a diferencia de +todavía no hay un endpoint dedicado para su rotación). Mux solo está gestionado a nivel de ciclo de vida: a diferencia de 9Router, no tiene un ejecutor de capa 4 y nunca se registra como proveedor de enrutamiento. -| Método | Ruta | Descripción | -| ------ | ------------------------------ | ------------------------------------------- | -| `POST` | `/api/services/mux/install` | Instala Mux desde npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Inicia Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Detiene Mux | -| `POST` | `/api/services/mux/restart` | Reinicia Mux | -| `POST` | `/api/services/mux/update` | Actualiza a una versión de npm más reciente | -| `GET` | `/api/services/mux/status` | Estado en vivo y de la BD | -| `POST` | `/api/services/mux/auto-start` | Activa o desactiva el inicio automático | +| Método | Ruta | Descripción | +| ------ | ------------------------------ | -------------------------------------------- | +| `POST` | `/api/services/mux/install` | Instalar Mux desde npm (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Iniciar Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Detener Mux | +| `POST` | `/api/services/mux/restart` | Reiniciar Mux | +| `POST` | `/api/services/mux/update` | Actualizar a una versión más reciente de npm | +| `GET` | `/api/services/mux/status` | Estado en vivo + BD | +| `POST` | `/api/services/mux/auto-start` | Activar o desactivar el inicio automático | --- ### 4.4 Endpoints de Bifrost (8 rutas) -Bifrost es un backend de retransmisión de puerta de enlace de IA escrito en Go (`@maximhq/bifrost`). Utiliza la misma -estructura de endpoints que CLIProxyAPI (sin `rotate-key`: Bifrost gestiona sus propias claves de +Bifrost es un backend de retransmisión de puerta de enlace de IA en Go (`@maximhq/bifrost`). Utiliza la misma +estructura de endpoints que CLIProxyAPI (sin `rotate-key`: Bifrost administra sus propias claves de proveedores en `config.json`, dentro de su `-app-dir`). -| Método | Ruta | Descripción | -| ------ | ---------------------------------- | --------------------------------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Instala Bifrost desde npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Inicia Bifrost en el puerto 8080 (predeterminado) | -| `POST` | `/api/services/bifrost/stop` | Detiene Bifrost | -| `POST` | `/api/services/bifrost/restart` | Reinicia Bifrost | -| `POST` | `/api/services/bifrost/update` | Actualiza a una versión más reciente | -| `GET` | `/api/services/bifrost/status` | Estado en tiempo real + BD | -| `POST` | `/api/services/bifrost/auto-start` | Activa o desactiva el inicio automático | -| `GET` | `/api/services/bifrost/logs` | Seguimiento de registros mediante SSE (a través de la ruta dinámica compartida `[name]/logs`) | +| Método | Ruta | Descripción | +| ------ | ---------------------------------- | -------------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Instalar Bifrost desde npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Iniciar Bifrost en el puerto 8080 (predeterminado) | +| `POST` | `/api/services/bifrost/stop` | Detener Bifrost | +| `POST` | `/api/services/bifrost/restart` | Reiniciar Bifrost | +| `POST` | `/api/services/bifrost/update` | Actualizar a una versión más reciente | +| `GET` | `/api/services/bifrost/status` | Estado en vivo + BD | +| `POST` | `/api/services/bifrost/auto-start` | Activar o desactivar el inicio automático | +| `GET` | `/api/services/bifrost/logs` | Cola de registros SSE (mediante la ruta dinámica compartida `[name]/logs`) | -**Configuración del enrutamiento:** Cuando `BIFROST_BASE_URL` no está definida y la instancia -supervisada de Bifrost está en ejecución, `getBifrostRoutingConfig()` (en `routingBackend.ts`) utiliza -automáticamente `http://127.0.0.1:{port}` como URL base del relé. La variable de entorno -`BIFROST_BASE_URL` definida explícitamente siempre tiene prioridad. +**Configuración del enrutamiento:** Cuando `BIFROST_BASE_URL` no está definida y la instancia supervisada de Bifrost +está en ejecución, `getBifrostRoutingConfig()` (en `routingBackend.ts`) utiliza automáticamente +`http://127.0.0.1:{port}` como URL base de retransmisión. La variable de entorno `BIFROST_BASE_URL` explícita +siempre tiene prioridad. --- ### 4.5 Endpoints de Dario (12 rutas) -Tiene la misma estructura de ciclo de vida que los demás servicios (`install`, `start`, `stop`, `restart`, +La misma estructura de ciclo de vida que los demás servicios (`install`, `start`, `stop`, `restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`), además de un plano de control OAuth -protegido por token bajo `admin/`: `admin/accounts`, `admin/import-from-omniroute`, +protegido mediante token bajo `admin/`: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (todos protegidos mediante `DARIO_ADMIN_TOKEN`). -### 4.6 Proxy inverso (integración del panel de 9Router) +### 4.6 Endpoints de open-wa (7 rutas) + +open-wa (`@open-wa/wa-automate`) controla una instancia de Chromium sin interfaz gráfica (mediante +Puppeteer) para automatizar WhatsApp Web. Utiliza la misma estructura de endpoints que Mux (todavía sin +una ruta `rotate-key`). Solo está gestionado a nivel de ciclo de vida: no es un destino de enrutamiento +y no tiene ningún ejecutor de capa 4 ni entrada de proveedor. + +| Método | Ruta | Descripción | +| ------ | --------------------------------- | --------------------------------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Instala open-wa desde npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Inicia open-wa en el puerto 8323 (predeterminado) | +| `POST` | `/api/services/openwa/stop` | Detiene open-wa | +| `POST` | `/api/services/openwa/restart` | Reinicia open-wa | +| `POST` | `/api/services/openwa/update` | Actualiza a una versión más reciente | +| `GET` | `/api/services/openwa/status` | Estado en vivo + BD | +| `POST` | `/api/services/openwa/auto-start` | Activa o desactiva el inicio automático | +| `GET` | `/api/services/openwa/logs` | Seguimiento de registros mediante SSE (a través de la ruta dinámica compartida `[name]/logs`) | + +**Clave de API:** se inyecta como `WA_KEY`; la sobrescritura genérica de variables +de entorno de open-wa con el prefijo `WA_*` la asigna a la opción de CLI +`--key`/`-k` (`dist/cli/setup.js::envArgs()`, verificado con el paquete 4.76.0 +instalado). Se añade el prefijo `ow_` cuando la genera `generateServiceApiKey()`. +open-wa vuelve a leer la clave desde un encabezado HTTP `key`/`api_key` (no desde +`Authorization: Bearer`); `/api-docs*` está explícitamente exento de la +comprobación (`setupAuthenticationLayer` en `dist/cli/server.js`), por lo que la +sonda de estado no necesita ningún encabezado de autenticación. + +**Vinculación:** open-wa no es oficial ni está afiliado a WhatsApp; el número +conectado corre el riesgo de ser bloqueado por los propios mecanismos de +detección de automatización de WhatsApp. En el primer inicio, el código QR de +vinculación se imprime en stdout y se muestra mediante el panel de registros y +el flujo SSE existentes; esta integración aún no dispone de un endpoint +dedicado para la imagen del código QR. + +--- + +### 4.7 Proxy inverso (dashboard integrado de 9Router) -El panel integra la interfaz web de 9Router dentro de un iframe mediante un proxy -inverso interno en: +El dashboard integra la interfaz web de 9Router dentro de un iframe mediante un +proxy inverso interno en: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -524,15 +560,16 @@ Este proxy: - Reenvía la solicitud a `http://127.0.0.1:{port}/{path}` (solo loopback) - Elimina los encabezados entrantes `cookie` y `authorization` (sin filtración de la sesión de OmniRoute) - Inyecta `Authorization: Bearer {apiKey}` para la autenticación de 9Router -- Elimina `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` de la respuesta +- Elimina `set-cookie`, `content-security-policy`, `x-frame-options` y `cross-origin-*` de la respuesta - Reescribe las respuestas HTML para inyectar `` y normalizar las rutas absolutas (`/foo` → `/dashboard/.../embed/foo`) -Las actualizaciones de WebSocket para el panel integrado se gestionan mediante un servidor complementario en un -puerto dedicado (consulta `src/lib/services/embedWsProxy.ts`). +Las actualizaciones de WebSocket para el dashboard integrado las gestiona un servidor +complementario en un puerto dedicado (consulta `src/lib/services/embedWsProxy.ts`). -**Seguridad:** Las rutas del proxy de integración se clasifican bajo `LOCAL_ONLY_API_PREFIXES` -y solo son accesibles desde loopback. Un atacante que obtenga un JWT mediante un -túnel de Cloudflare/Ngrok no puede usar el proxy para acceder a los servicios integrados. +**Seguridad:** Las rutas del proxy de integración están clasificadas bajo +`LOCAL_ONLY_API_PREFIXES` y solo son accesibles desde loopback. Un atacante que +obtenga un JWT mediante un túnel de Cloudflare/Ngrok no puede usar el proxy para +acceder a los servicios integrados. --- diff --git a/docs/i18n/es/docs/frameworks/MEMORY.md b/docs/i18n/es/docs/frameworks/MEMORY.md index abd0d5e817d3..bbc07f1381ec 100644 --- a/docs/i18n/es/docs/frameworks/MEMORY.md +++ b/docs/i18n/es/docs/frameworks/MEMORY.md @@ -168,30 +168,31 @@ La tabla `memory_vec_meta` (migración `083_memory_vec.sql`) almacena: Hay nueve campos de embeddings y vectores disponibles en `MemorySettingsExtended` en `src/shared/schemas/memory.ts`, que se persisten mediante `src/lib/db/settings.ts`: -| Campo | Tipo | Valor predeterminado | Descripción | -| ------------------------ | -------------------------------------------------- | -------------------- | ------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Fuente de embeddings que se utilizará | -| `embeddingProviderModel` | `string \| null` | `null` | Proveedor/modelo en formato `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | URL base de endpoint compatible con OpenAI solo para Memory | -| `customModelId` | `string \| null` | `null` | ID del modelo enviado al endpoint personalizado | -| `transformersEnabled` | `boolean` | `false` | Activación opcional de Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Activación opcional del modelo local estático potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Habilita el paso de reordenación (añade +200-500ms/solicitud) | -| `rerankProviderModel` | `string \| null` | `null` | Proveedor/modelo de reordenación en formato `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend vectorial que se utilizará | - -Estos se exponen mediante `GET /PUT /api/settings/memory` (esquema `MemorySettingsExtendedSchema`). - -Para la fuente `remote`, Memory también acepta las opciones `customBaseUrl` y -`customModelId`. Juntas, seleccionan un endpoint `/embeddings` compatible con OpenAI -y un modelo sin cambiar el registro global de embeddings. El endpoint se +| Campo | Tipo | Valor predeterminado | Descripción | +| ------------------------ | -------------------------------------------------- | -------------------- | ---------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Fuente de embeddings que se utilizará | +| `embeddingProviderModel` | `string \| null` | `null` | Proveedor/modelo con el formato `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | URL base del endpoint compatible con OpenAI solo para Memory | +| `customModelId` | `string \| null` | `null` | ID de modelo enviado al endpoint personalizado | +| `transformersEnabled` | `boolean` | `false` | Habilitación voluntaria de Transformers.js (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Habilitación voluntaria del modelo local estático potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Habilitar el paso de reranking (añade +200-500ms/solicitud) | +| `rerankProviderModel` | `string \| null` | `null` | Proveedor/modelo de reranking con el formato `provider/model` | + +`rerankProviderModel` se resuelve mediante `POST /v1/rerank` (invocado a través de loopback), por lo que acepta cualquier valor admitido por esa ruta: un modelo de reranking seleccionado para la nube (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) o un nodo proveedor compatible con OpenAI con el formato `/` (p. ej., `skilled-mini/bge-reranker-v2-m3` para una instancia de TEI/Infinity). Los nodos de loopback siempre son aptos; un nodo ubicado en otro host (LAN, Tailscale) requiere además la marca de funcionalidad `RERANK_REMOTE_PROVIDER_NODES` y debe cumplir la política de URL salientes del proveedor; consulte [Marcas de funcionalidad](../reference/FEATURE_FLAGS.md). El selector del panel muestra los proveedores seleccionados y los nodos locales; cualquier cadena `provider/model` válida puede configurarse directamente mediante `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend vectorial que se utilizará | + +Estos campos se exponen mediante `GET /PUT /api/settings/memory` (esquema `MemorySettingsExtendedSchema`). + +Para la fuente `remote`, Memory también acepta las opciones de configuración `customBaseUrl` y +`customModelId`. Juntas permiten seleccionar un endpoint `/embeddings` +compatible con OpenAI y un modelo sin modificar el registro global de embeddings. El endpoint se normaliza antes de usarlo y se comprueba mediante la política de URL salientes del proveedor: se -requiere HTTP(S), se rechazan las credenciales incrustadas y las cadenas de consulta, -y las direcciones de metadatos de la nube permanecen bloqueadas. Los valores vacíos -conservan el proveedor del registro seleccionado. Los errores devueltos al panel -se depuran y las credenciales del endpoint nunca se registran. +requiere HTTP(S), se rechazan las credenciales incrustadas y las cadenas de consulta, y las direcciones +de metadatos de la nube siguen bloqueadas. Los valores vacíos conservan el proveedor seleccionado en el registro. Los errores +devueltos al panel se sanean y las credenciales del endpoint nunca se registran. -> **PENDIENTE (D20):** El ámbito `global` (compartir memorias entre todas las claves de API) no está +> **TODO (D20):** El ámbito `global` (compartir memorias entre todas las claves de API) no está > implementado en esta versión. Requiere cambios en el esquema y una ruta de recuperación > global. Realizar su seguimiento por separado. diff --git a/docs/i18n/es/docs/guides/DOCKER_GUIDE.md b/docs/i18n/es/docs/guides/DOCKER_GUIDE.md index dee5b1202ed0..8e64a5642a9b 100644 --- a/docs/i18n/es/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/es/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Ejecución rápida +> **¿Autoalojar con un solo comando?** Consulta la +> [Guía de autoalojamiento](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (imagen publicada + +> Redis, solo en la interfaz de bucle invertido, sin elección de perfil). La ejecución rápida que aparece a continuación es la +> opción de contenedor único para usuarios que ya ejecutan Redis en otro lugar. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/es/docs/guides/TROUBLESHOOTING.md b/docs/i18n/es/docs/guides/TROUBLESHOOTING.md index 0966f6fd4644..3ec20459a2ee 100644 --- a/docs/i18n/es/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/es/docs/guides/TROUBLESHOOTING.md @@ -66,15 +66,23 @@ Establezca estas variables en el entorno del proceso de OmniRoute (el demonio, p --- -## Advertencias de npm install (ERESOLVE / peer / deprecated) +## Advertencias de npm install (ERESOLVE / dependencias peer / paquetes obsoletos) -Cuando ejecutas `npm install -g omniroute`, puede aparecer una gran cantidad de advertencias como `npm warn ERESOLVE`, avisos sobre dependencias entre pares y mensajes `deprecated`. **Son esperados e inofensivos.** La instalación se completó correctamente si ves `added packages` en la salida. +Cuando ejecutas `npm install -g omniroute`, es posible que veas una gran cantidad de advertencias como `npm warn ERESOLVE`, avisos sobre dependencias peer y mensajes de paquetes `deprecated`. **Estas advertencias son esperadas e inofensivas.** La instalación se realizó correctamente si ves `added packages` en la salida. -Las advertencias provienen de intervalos obsoletos de dependencias entre pares en paquetes de terceros que OmniRoute no controla: +Para suprimir las advertencias de resolución de dependencias peer, utiliza la forma de instalación compatible con OmniRoute: -1. **`marked-terminal` requiere `marked >=1 <16`, pero se encontró `marked@18`** — en la práctica funciona correctamente; el intervalo de pares del proyecto original simplemente está obsoleto. -2. **`deprecated prebuild-install@7.1.3`** — un asistente transitivo para obtener binarios nativos. No se - utiliza para instalar el enlace de transporte `wreq-js` fijado y no indica que haya fallado la +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` solo suprime los avisos de `ERESOLVE` y de dependencias peer. Los avisos de obsolescencia siguen siendo visibles porque provienen de paquetes transitivos de terceros; no indican que la instalación haya fallado. + +Las advertencias proceden de rangos de dependencias peer desactualizados en paquetes de terceros que OmniRoute no controla: + +1. **`marked-terminal` requiere `marked >=1 <16`, pero se encontró `marked@18`** — en la práctica funciona correctamente; el rango peer del proyecto original simplemente está desactualizado. +2. **`deprecated prebuild-install@7.1.3`** — una utilidad transitiva para obtener binarios nativos. No se + utiliza para instalar el binding de transporte fijado de `wreq-js` y no indica que haya fallado la configuración del transporte del proveedor de cookies web. **No es necesario realizar ninguna acción** — las advertencias no pueden silenciarse por completo sin crear bifurcaciones de los paquetes originales. diff --git a/docs/i18n/es/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/es/docs/providers/CURSOR-API-KEY-AND-CLI.md index 51dc202c1309..b9b2328865da 100644 --- a/docs/i18n/es/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/es/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,20 +4,19 @@ --- -Dos formas de situar Cursor detrás de OmniRoute sin una sesión del IDE: +Dos formas de usar Cursor detrás de OmniRoute sin una sesión del IDE: -1. **Proveedor `cursor-api`** (tarjeta «Cursor API», alias `cua`): un proveedor +1. **Proveedor `cursor-api`** (tarjeta "Cursor API", alias `cua`): un proveedor de clave de API que almacena una clave de API de usuario de Cursor (`crsr_…`, generada en `https://cursor.com/dashboard/api`). Cualquier cliente de OmniRoute puede acceder a los modelos de Cursor mediante `/v1/chat/completions` como `cursor-api/` o `cua/`, con las capas habituales de cuota, respaldo y registro. El proveedor del IDE - (`cursor`, sesión OAuth/IDE) no cambia. -2. **Transferencia directa de Cursor CLI**: configura Cursor CLI (`agent`) para - que apunte a OmniRoute, de modo que cada RPC realizada por la CLI se - autentique con una clave de API de OmniRoute, se reenvíe a Cursor con la - credencial de una conexión `cursor-api` y se registre en la página de - registros. + (`cursor`, sesión de OAuth/IDE) no cambia. +2. **Acceso directo de Cursor CLI**: configura Cursor CLI (`agent`) para que + apunte a OmniRoute, de modo que cada RPC que realice la CLI se autentique con + una clave de API de OmniRoute, se reenvíe a Cursor con las credenciales de + una conexión `cursor-api` y quede registrado en la página Registros. ## Por qué se intercambia la clave @@ -25,12 +24,12 @@ Dos formas de situar Cursor detrás de OmniRoute sin una sesión del IDE: Cursor CLI primero envía la clave mediante POST a `/auth/exchange_user_api_key` y recibe un JWT de sesión que caduca al cabo de una hora; el `refreshToken` devuelto contiene el mismo `exp`, por lo que -actualizarlo significa volver a intercambiar la clave. +actualizarlo implica volver a intercambiar la clave. `open-sse/services/cursorApiKeyAuth.ts` realiza ese intercambio, almacena en -caché un token de sesión por clave, vuelve a intercambiarlo cinco minutos antes -de que caduque y elimina el token almacenado en caché cuando Cursor responde -con 401. `CursorExecutor` lo invoca justo antes de abrir el flujo ascendente -para las conexiones `cursor-api`. +caché un token de sesión por clave, vuelve a realizar el intercambio cinco +minutos antes de que caduque y elimina el token almacenado en caché cuando +Cursor responde con 401. `CursorExecutor` lo invoca justo antes de abrir el +flujo ascendente para las conexiones `cursor-api`. ## El proveedor `cursor-api` @@ -41,7 +40,7 @@ Registro: `open-sse/config/providers/registry/cursor/index.ts` `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Panel: Proveedores → Cursor API → Añadir clave de API. +Panel de control: Proveedores → Cursor API → Añadir clave de API. REST: @@ -51,7 +50,7 @@ curl -sS -X POST http://localhost:20128/api/providers \ -d '{"provider":"cursor-api","name":"cursor-api-key","apiKey":"crsr_…","priority":1}' ``` -Después: +A continuación: ```bash curl -sS http://localhost:20128/v1/chat/completions \ @@ -65,48 +64,62 @@ Notas: - La lista de modelos de `cursor-api` procede del registro estático de Cursor (la misma lista que utiliza el proveedor del IDE como alternativa); no es necesario instalar `cursor-agent` en el host de OmniRoute. -- `POST /api/providers/{id}/refresh-cursor` es solo para el proveedor del IDE - `cursor`; las conexiones `cursor-api` no tienen una sesión del IDE que - renovar. +- `POST /api/providers/{id}/refresh-cursor` es únicamente para el proveedor + `cursor` del IDE; las conexiones `cursor-api` no tienen ninguna sesión del + IDE que renovar. -## Transferencia directa de Cursor CLI +## Identificadores nativos de modelos y nivel de esfuerzo + +Para `cursor` / `cu` y `cursor-api` / `cua`, el normalizador compartido del +nivel de esfuerzo de Claude deja intacto el identificador del modelo solicitado. +Cursor puede anunciar un sufijo como `-low` como parte de un identificador real +de modelo, en lugar de como un alias de nivel de esfuerzo de OmniRoute. +El ejecutor de Cursor conserva una coincidencia exacta con el catálogo activo; +cuando no hay coincidencia, su mecanismo actual de resolución de modelos se +encarga de convertir el sufijo en un parámetro como alternativa. + +Esto no modifica la normalización del nivel de esfuerzo para las rutas directas +de Claude, las compatibles con Claude ni las de Vertex. La disponibilidad sigue +dependiendo del catálogo y de los permisos de la cuenta de Cursor seleccionada. + +## Transferencia de Cursor CLI Ruta: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. El prefijo `/api/cursor-cli/` está registrado en `src/shared/constants/publicApiRoutes.ts` porque el controlador aplica su propia autenticación: -| Ruta | Autenticación esperada de la CLI | Qué hace OmniRoute | -| ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Valida la clave, genera un JWT HS256 de 1 h (firmado con `JWT_SECRET`) y lo devuelve | -| cualquier otra ruta (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Verifica el emisor, la audiencia y la caducidad, elige una conexión `cursor-api` activa, sustituye el encabezado Authorization por el token intercambiado de Cursor y retransmite la respuesta al cliente | +| Ruta | Autenticación esperada del CLI | Qué hace OmniRoute | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Valida la clave, genera un JWT HS256 de 1 h (firmado con `JWT_SECRET`) y lo devuelve | +| cualquier otra ruta (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Verifica el emisor, la audiencia y la caducidad, selecciona una conexión `cursor-api` activa, sustituye el encabezado Authorization por el token de Cursor intercambiado y retransmite la respuesta al cliente | -La CLI descodifica `exp` de cualquier token que recibe, por lo que, si se le -entrega un token opaco, vuelve a realizar el intercambio antes de casi todas -las solicitudes; el JWT generado evita esto. Una respuesta 401 de OmniRoute -hace que la CLI vuelva a realizar el intercambio. +El CLI decodifica `exp` de cualquier token que reciba, por lo que proporcionarle +un token opaco hace que vuelva a realizar el intercambio antes de casi cada +solicitud; el JWT generado evita esto. Una respuesta 401 de OmniRoute hace que +el CLI vuelva a realizar el intercambio. ### Configuración -1. Crea una clave de API de OmniRoute (Panel → Claves de API) y una conexión - `cursor-api`. -2. Indica a la CLI que use HTTP/1.1 para el flujo del agente. En +1. Crea una clave de API de OmniRoute (Panel de control → Claves de API) y una + conexión `cursor-api`. +2. Indica al CLI que use HTTP/1.1 para el flujo del agente. En `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Sin esto, la CLI abre el turno del agente mediante HTTP/2 en un host de + Sin esto, el CLI abre el turno del agente mediante HTTP/2 hacia un host de agente configurado por separado y solo las RPC del plano de control pasan por el endpoint. -3. Ejecuta la CLI contra OmniRoute: +3. Ejecuta el CLI contra OmniRoute: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli - export CURSOR_API_KEY= - agent -p --trust "Reply with exactly OK" + export CURSOR_API_KEY= + agent -p --trust "Responde exactamente OK" ``` Cada salto aparece en Registros con el proveedor `cursor-api`, el tipo de @@ -115,13 +128,13 @@ de API de OmniRoute y a la conexión que lo atendió. ### Modos de fallo -| Situación | Respuesta a la CLI | -| ------------------------------------------------------- | ---------------------------------------------------------------- | -| Clave de OmniRoute desconocida y `REQUIRE_API_KEY=true` | 401 `unauthenticated` durante el intercambio | -| `REQUIRE_API_KEY=false` | sesión anónima (refleja el comportamiento de `/v1/*`) | -| JWT de sesión caducado, externo o manipulado | 401, la CLI vuelve a realizar el intercambio | -| Clave de API de OmniRoute revocada tras el intercambio | 401 en la siguiente RPC | -| Sin conexión `cursor-api` activa | 503 `unavailable` | -| Cursor rechaza la clave de la conexión | 401 `unauthenticated`, se descarta la sesión almacenada en caché | -| Servicio ascendente inaccesible | 502 `unavailable` (mensaje depurado) | -| `JWT_SECRET` sin configurar | 503 durante el intercambio | +| Situación | Respuesta al CLI | +| ------------------------------------------------------- | --------------------------------------------------------------- | +| Clave de OmniRoute desconocida y `REQUIRE_API_KEY=true` | 401 `unauthenticated` durante el intercambio | +| `REQUIRE_API_KEY=false` | sesión anónima (refleja el comportamiento de `/v1/*`) | +| JWT de sesión caducado, externo o manipulado | 401, el CLI vuelve a realizar el intercambio | +| Clave de API de OmniRoute revocada tras el intercambio | 401 en la siguiente RPC | +| No hay ninguna conexión `cursor-api` activa | 503 `unavailable` | +| Cursor rechaza la clave de la conexión | 401 `unauthenticated`, se elimina la sesión almacenada en caché | +| No se puede acceder al servicio ascendente | 502 `unavailable` (mensaje saneado) | +| `JWT_SECRET` no está definido | 503 durante el intercambio | diff --git a/docs/i18n/es/docs/reference/API_REFERENCE.md b/docs/i18n/es/docs/reference/API_REFERENCE.md index 0392e487f551..8db4ce7da835 100644 --- a/docs/i18n/es/docs/reference/API_REFERENCE.md +++ b/docs/i18n/es/docs/reference/API_REFERENCE.md @@ -403,40 +403,40 @@ Utilice este endpoint cuando un sidecar se ejecute fuera de proceso y no pueda i ## Endpoints de compatibilidad -| Método | Ruta | Formato | -| ------ | ----------------------------------------- | --------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (edición/inpainting) | -| POST | `/v1/videos/generations` | Generación de vídeo estilo OpenAI | -| POST | `/v1/music/generations` | Generación de música estilo OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (devuelve audio) | -| POST | `/v1/rerank` | Reordenamiento estilo Cohere/Voyage | -| POST | `/v1/classify` | Clasificación de Jina (`api.jina.ai`) | -| POST | `/v1/segment` | Segmentador de Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Alias del catálogo de OpenAI | -| GET | `/api/v1/vscode/{token}/models` | Alias de modelos de OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | Alias con token de OpenAI | -| POST | `/api/v1/vscode/{token}/responses` | Alias con token de OpenAI Responses | -| POST | `/api/v1/vscode/{token}/api/chat` | Alias con token de Ollama | -| GET | `/api/v1/vscode/{token}/api/tags` | Alias con token de etiquetas de Ollama | - -Todas las rutas POST siguen la misma estructura: `Bearer your-api-key` + cuerpo JSON validado por Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, etc.; consulte `src/shared/validation/schemas.ts`). Se devuelve un error 4xx cuando falla la validación del esquema. - -Para los clientes que no puedan adjuntar `Authorization: Bearer ...`, OmniRoute también acepta claves de API en la URL mediante parámetros de consulta compatibles (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) o los endpoints específicos `/api/v1/vscode/{token}/...` documentados a continuación. +| Método | Ruta | Formato | +| ------ | ----------------------------------------- | ---------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (edición/inpainting) | +| POST | `/v1/videos/generations` | Generación de vídeo al estilo de OpenAI | +| POST | `/v1/music/generations` | Generación de música al estilo de OpenAI | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (devuelve el cuerpo de audio) | +| POST | `/v1/rerank` | Reordenación al estilo de Cohere/Voyage | +| POST | `/v1/classify` | Clasificación de Jina (`api.jina.ai`) | +| POST | `/v1/segment` | Segmentador de Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | Alias del catálogo de OpenAI | +| GET | `/api/v1/vscode/{token}/models` | Alias de modelos de OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | Alias de OpenAI con token | +| POST | `/api/v1/vscode/{token}/responses` | Alias de OpenAI Responses con token | +| POST | `/api/v1/vscode/{token}/api/chat` | Alias de Ollama con token | +| GET | `/api/v1/vscode/{token}/api/tags` | Alias de etiquetas de Ollama con token | + +Todas las rutas POST siguen la misma estructura: `Bearer your-api-key` + cuerpo JSON validado con Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, etc.; consulte `src/shared/validation/schemas.ts`). Se devuelve un error 4xx cuando falla la validación del esquema. + +Para los clientes que no pueden adjuntar `Authorization: Bearer ...`, OmniRoute también acepta claves de API en la URL, ya sea mediante compatibilidad con parámetros de consulta (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) o mediante los endpoints específicos `/api/v1/vscode/{token}/...` documentados a continuación. ```bash -# Reordenamiento +# Reordenación (proveedor del registro en la nube o nodo de proveedor compatible con OpenAI como "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # Clasificación de Jina (credenciales de Foundation API) @@ -451,17 +451,39 @@ POST /v1/search { "query": "...", "provider": "jina-search" } # Moderaciones POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — devuelve un cuerpo audio/mpeg (o en el formato solicitado) +# TTS — devuelve un cuerpo audio/mpeg (o el formato solicitado) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } -# Edición de imágenes (multipart) +# Edición de imagen (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Generación de vídeo/música (identificador de modelo con prefijo de proveedor) +# Generación de vídeo/música (id. de modelo con prefijo de proveedor) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Nodos de proveedor para reordenación:** `POST /v1/rerank` también enruta hacia nodos de proveedores compatibles con OpenAI +> (oMLX, vLLM, Infinity, TEI detrás de una puerta de enlace, etc.) identificados como `/`. Los nodos de bucle invertido +> (`localhost`, `127.0.0.1`, `172.16.0.0/12`) siempre son aptos. Los nodos en cualquier otro +> host —un equipo de la LAN o un par de Tailscale— solo son aptos cuando el operador habilita la +> marca de funcionalidad `RERANK_REMOTE_PROVIDER_NODES` **y** la URL base del nodo cumple la política de +> URL salientes del proveedor (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> nunca se enruta hacia hosts de metadatos de la nube. El paso de reordenación del motor de memoria llama a esta ruta mediante +> bucle invertido, por lo que la misma regla controla `rerankProviderModel` en la configuración de Memoria. +> +> **Estructuras de servidores locales:** se llama al nodo en `/v1/rerank` y, en caso de 404, en `/rerank` +> (Infinity, TEI). El cuerpo enviado al servidor ascendente contiene tanto la nomenclatura de Cohere/OpenAI (`documents`, +> `return_documents`) como la de TEI (`texts`, `return_text`), y la respuesta del servidor ascendente se +> normaliza al contenedor de Cohere: el formato directo de TEI `[{index, score, text}]`, `{results: [{index, score}]}` +> de puertas de enlace ligeras y el formato de Voyage `{data: [...]}` se devuelven al cliente como +> `{results: [{index, relevance_score, document?}]}`, ordenados por puntuación y limitados a `top_n`. + +> **Detección de nodos de proveedor:** los modelos de un nodo de proveedor compatible con OpenAI aparecen en `GET /v1/models` +> bajo el prefijo del nodo. Las filas que no contienen metadatos de endpoint (algo habitual en los listados locales de `/v1/models`) +> heredan el `apiType` del nodo, por lo que los modelos de un nodo de `embeddings` tienen `type: "embedding"` y los modelos de un +> nodo de `rerank` tienen `type: "rerank"` en lugar de usar chat de forma predeterminada; un valor explícito de +> `supportedEndpoints` en una fila sincronizada o añadida manualmente sigue teniendo prioridad. + ### Rutas específicas de proveedores ```bash @@ -470,7 +492,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -El prefijo del proveedor se añade automáticamente si falta. Los modelos que no coincidan devuelven `400`. +El prefijo del proveedor se añade automáticamente si falta. Los modelos que no coinciden devuelven `400`. --- diff --git a/docs/i18n/es/docs/reference/ENVIRONMENT.md b/docs/i18n/es/docs/reference/ENVIRONMENT.md index ce844bf9f6b4..a7f7bed8d4c7 100644 --- a/docs/i18n/es/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/es/docs/reference/ENVIRONMENT.md @@ -79,72 +79,71 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. Almacenamiento y base de datos -OmniRoute utiliza **SQLite** (mediante `better-sqlite3`) para toda la persistencia. Estas variables controlan la ubicación, el cifrado y el ciclo de vida de los datos. - -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ------------------------------------------ | ------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Directorio raíz para la base de datos SQLite, las copias de seguridad y los archivos de datos. Sobrescríbalo para volúmenes de Docker o rutas personalizadas. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(sin definir)_ | `src/lib/dataPaths.ts` | Vía de escape para la protección de DATA_DIR en pruebas/evaluaciones (#10428). Las pruebas y las sondas de evaluación/impresión de Node (`-e`/`--eval`/`-p`/`--print`, incluidas las formas `--eval=`/`--print=`) sin `DATA_DIR` se redirigen a un directorio temporal desechable para que no puedan abrir la base de datos real del operador; establézcalo en `1` para volver a utilizar el directorio real. | -| `OMNIROUTE_BUILD_SHA` | _(sin definir)_ | `src/lib/monitoring/buildSha.ts` | SHA de Git del artefacto en ejecución. Se incorpora mediante `npm run build:release`; puede inyectarse en contenedores distribuidos sin el archivo centinela `dist/BUILD_SHA`. Se expone como `system.buildSha` en `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Referencia con la que la comprobación de procedencia del empaquetado del artefacto verifica el SHA de compilación (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(sin definir)_ | `scripts/build/buildProvenance.ts` | Establézcalo en `1` para permitir el empaquetado de una compilación cuyo SHA no se encuentre en la línea de publicación, registrándola como una versión canary deliberada en lugar de hacer que falle la comprobación (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(sin definir)_ | `scripts/ops/deploy-canary.mjs` | Clave de API para la sonda de humo del despliegue canary, enviada como `Authorization: Bearer` a `/v1/chat/completions`. Solo la utiliza el script de despliegue (#10429), nunca el servidor. No está relacionada con las variables `OMNIROUTE_SMOKE_*` del conjunto opcional de pruebas de humo de la CLI (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` en `tests/integration/upstream-cli-smoke.int.test.ts`); consulte [Integraciones de la CLI → Prueba de humo real](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(sin definir)_ | `src/lib/buildPhase.ts` | Señal de la fase de compilación (#10060): `scripts/build/build-next-isolated.mjs` la establece en `1` y cada proceso de trabajo de compilación generado la hereda, de modo que la capa de la base de datos devuelve un stub sin operaciones en lugar de cargar el complemento nativo better-sqlite3 (que interrumpe el proceso de trabajo al salir). Nunca se establece para el servidor en ejecución. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Establézcalo en `1` para omitir la comprobación previa a la compilación de dependencias nativas opcionales en árboles de dependencias empaquetadas poco habituales. Esto no permite compilar cuando falta una dependencia; utilícelo únicamente cuando las dependencias nativas se proporcionen por otros medios. | -| `OMNIROUTE_DATA_DIR` | _(sin definir)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias alternativo** de `DATA_DIR`, que solo se comprueba cuando `DATA_DIR` no está definida. Se utiliza para localizar la caché en disco de sesiones persistentes por hilo del ejecutor PromptQL (`/promptql-thread-sessions.json`); si ninguna de las variables está definida, la caché se mantiene únicamente en memoria (no persiste entre reinicios). | -| `OMNIROUTE_PLUGINS_DIR` | _(sin definir)_ | `src/lib/plugins/scanner.ts` | Directorio que lee el **escáner de plugins en tiempo de ejecución** y raíz donde instala el gestor de plugins, lo que sustituye el valor predeterminado derivado del directorio personal (#11827). Apúntelo al árbol de plugins montado mediante bind mount en Docker/K8s, en lugar de cambiar HOME únicamente para reubicar la ruta de exploración (HOME también rige todos los demás comportamientos relativos al directorio personal). Sin definir = `~/.omniroute/plugins`, o `/tmp/.omniroute/plugins` cuando el proceso no exporta ningún directorio personal; esta variable elimina la falta de detección silenciosa resultante. El directorio resuelto se registra una vez durante el inicio como `scanner.dir_resolved`, junto con la entrada que prevaleció. Solo para el servidor: los plugins de comandos de la CLI mantienen su propia variable `OMNIROUTE_PLUGIN_PATH` (sección 9). | -| `STORAGE_ENCRYPTION_KEY` | _(vacío = deshabilitado)_ | `src/lib/db/encryption.ts` | Clave AES para el cifrado completo en reposo de la base de datos SQLite. Genérela con `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Etiqueta de versión de la clave de cifrado. Increméntela al rotar la clave para permitir el descifrado de copias de seguridad antiguas. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Cuando es `true`, omite las copias de seguridad rutinarias/previas a la escritura del archivo SQLite (al guardar/borrar precios de models.dev y al escribir ajustes). Las copias de seguridad manuales y previas a la restauración siguen ejecutándose. **No** deshabilita la instantánea de seguridad duradera obligatoria del ejecutor de migraciones ni la protección contra migraciones masivas de una base de datos persistente existente. Las copias de seguridad no manuales se limitan a una como máximo cada 60 minutos. **Ajustes → Almacenamiento** en el panel permite deshabilitar de forma independiente las copias de seguridad automáticas rutinarias. | -| `OMNIROUTE_CRYPT_KEY` | _(no establecida)_ | `src/lib/db/encryption.ts` | **Alias heredado** de `STORAGE_ENCRYPTION_KEY`. Se acepta como alternativa cuando la variable principal no está presente. | -| `OMNIROUTE_API_KEY_BASE64` | _(no establecida)_ | `src/lib/db/encryption.ts` | **Alias heredado** (formato codificado en Base64) aceptado como alternativa. Se descodifica automáticamente antes de usarlo. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(no establecida)_ | `src/lib/db/core.ts` | Sobrescribe el intervalo de comprobación periódica del estado de SQLite (ms). Cuando no se establece, los valores predeterminados se derivan de `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/walMaintenance.ts` | Sobrescribe el intervalo periódico de `wal_checkpoint(TRUNCATE)` (ms). El punto de control automático nunca reduce el propio archivo WAL y un servidor de larga duración nunca cierra su base de datos. `0` lo deshabilita. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Sobrescribe el intervalo frecuente de `wal_checkpoint(PASSIVE)` (ms). Mantiene una cantidad reducida de tramas WAL pendientes para que el TRUNCATE periódico nunca copie una acumulación de varios GB en el hilo principal. `0` lo deshabilita. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Cuando una ejecución de PASSIVE detecta que el archivo WAL supera este tamaño, escala inmediatamente a `wal_checkpoint(TRUNCATE)` en lugar de esperar a la ejecución lenta. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Establézcalo en `1`/`true`/`yes`/`on` para finalizar el proceso cuando la presión crítica sobre los recursos se mantenga durante `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, lo que permite que un supervisor (systemd `Restart=always`, política de reinicio de Docker) restablezca un proceso limpio en lugar de responder indefinidamente con errores 503. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Tiempo durante el que debe persistir la presión crítica antes de que se active la salida para el reinicio automático. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(detección automática)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Ruta explícita (absoluta o relativa al directorio de trabajo actual) a `sql-wasm.wasm` cuando se utiliza el adaptador alternativo WASM de `sql.js`. Cuando no se establece, se detecta automáticamente mediante las dependencias del paquete y las disposiciones de archivos candidatas. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/core.ts` | Sobrescribe el intervalo periódico de `wal_checkpoint(TRUNCATE)` (ms). El punto de control automático nunca reduce el propio archivo WAL y un servidor de larga duración nunca cierra su base de datos. `0` lo deshabilita. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Número de días durante los que el proceso automático de limpieza conserva, antes de eliminarlos, los puntos de control, los archivos de entrada/salida/error referenciados y la fila de un trabajo terminal (completado/fallido/cancelado/caducado) de Batch API. Solo surte efecto una vez que se activa `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; coincide con el período de retención de resultados de la propia Batch API de OpenAI. No afecta a la ruta `DELETE /api/v1/batches/delete-completed` activada por el operador, que permanece incondicional (sin filtro de antigüedad) por diseño. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Cuando es `true`, permite que el proceso de limpieza automática elimine los trabajos finalizados de la Batch API (y sus puntos de control) que hayan superado `OMNIROUTE_BATCH_RETENTION_DAYS`, y borre el contenido BLOB de los archivos subidos que hayan superado su propio `expires_at`. Desactivado de forma predeterminada: todas las instalaciones existentes conservan estos datos exactamente como antes hasta que un operador lo habilite. También es una marca de funcionalidad editable desde el panel; consulta `docs/reference/FEATURE_FLAGS.md` → Tiempo de ejecución. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Establécelo en `1` para omitir por completo la comprobación de estado de la base de datos durante el inicio. Resulta útil para tareas de corta duración y pruebas de integración. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Establécelo en `1` para forzar la activación del bucle de comprobación de estado de la base de datos, incluso cuando normalmente se omitiría (p. ej., en tareas de corta duración). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Establécelo en `1` para omitir el calentamiento del entorno de ejecución nativo durante `npm install`. Resulta útil en instalaciones de CI/sin interfaz donde sqlite ya está compilado. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(detección automática)_ | `src/lib/db/migrationRunner.ts` | Sobrescribe el directorio que examina el ejecutor de migraciones. Resulta útil al distribuir migraciones empaquetadas en compilaciones personalizadas. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(sin establecer)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Directorios de migraciones adicionales como entradas `namespace=dir` separadas por el delimitador de rutas de la plataforma (p. ej., `ee=/opt/app/enterprise/db/migrations`). Los archivos encontrados allí se registran como `-`, de modo que una distribución que incluya sus propias migraciones nunca entre en conflicto con los espacios numéricos del proyecto principal. Una entrada mal formada, un espacio de nombres no válido o un directorio inexistente provocan un error durante el inicio, en lugar de omitir silenciosamente el esquema. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Umbral de seguridad para migraciones pendientes en masa (#3416). El inicio se interrumpe si hay más migraciones pendientes que este valor en una base de datos existente (protege contra el borrado de la tabla de seguimiento). Auméntalo para restaurar una copia de seguridad antigua; establécelo en `0` para desactivar la comprobación. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Directorio de trabajo para la comprobación de lanzamiento `check:install-upgrade`. Necesita aproximadamente 12 GB (dos árboles de instalación de ~3 GB más el archivo tar), por lo que no debe ejecutarse en un tmpfs pequeño; en el ejecutor autohospedado, `/tmp` es un tmpfs de 12 GB respaldado por RAM y la comprobación lo agotó, truncando el paquete. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(valor predeterminado en el código)_ | `src/lib/spend/batchWriter.ts` | Intervalo de vaciado (ms) para el escritor de gastos/costes por lotes. Los valores más bajos reducen la agrupación de escrituras; los valores más altos reducen la contención de la base de datos. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(valor predeterminado en el código)_ | `src/lib/spend/batchWriter.ts` | Número máximo de entradas de gasto almacenadas en búfer antes de forzar un vaciado. Auméntalo en despliegues con muchas consultas por segundo; redúcelo cuando limitar la memoria sea más importante. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(sin establecer)_ | `open-sse/utils/proxyFetch.ts` | Establécelo en `"true"` para emitir registros de depuración `[ProxyFetch]` en la ruta de retransmisión de Vercel. Está desactivado de forma predeterminada para evitar filtrar indicios sobre el enrutamiento. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Establécelo en `"true"` o `"1"` para incluir las IP del cliente y de salida, así como el prefijo de la cuenta, en la línea detallada del registro del proceso `[ProxyEgress]`. Se mantiene DESACTIVADO de forma predeterminada para que el registro del proceso no filtre direcciones IP ni el prefijo de la cuenta. | -| `OMNIROUTE_DEBUG` | _(sin establecer)_ | `bin/cli/commands/quota.mjs` | Establécelo en `1` para imprimir en stderr diagnósticos de tiempo por solicitud (`[omniroute] GET completed in Nms`) desde los comandos de cuota de la CLI. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automático)_ | `scripts/dev/healthcheck.mjs` | Ruta explícita que comprueba la verificación de estado del contenedor. Si no se establece, la sonda la deriva de `OMNIROUTE_BASE_PATH`; al establecerla, se vuelve a utilizar el endpoint de supervisión profunda. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(sin establecer)_ | `bin/cli/commands/completion.mjs` | Establécelo en cualquier valor no vacío para emitir diagnósticos `[omniroute completion]` desde las rutas de la caché de autocompletado del shell de la CLI (lectura/actualización/escritura). Está desactivado de forma predeterminada: los errores de esas cachés se ignoran silenciosamente para que una caché ausente o dañada nunca interrumpa el autocompletado con tabulador. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Ventana máxima de reintento para elementos individuales de un lote (ms). Los elementos que superen esta duración se marcan como fallidos. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Retraso base (ms) para el retroceso exponencial en los reintentos de elementos de un lote. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Límite máximo (ms) del retroceso exponencial entre reintentos de elementos de un lote. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Número máximo de lotes procesados simultáneamente. Auméntelo para incrementar el rendimiento; manténgalo bajo para evitar ráfagas que excedan los límites de solicitudes. | +OmniRoute usa **SQLite** (mediante `better-sqlite3`) para toda la persistencia. Estas variables controlan la ubicación, el cifrado y el ciclo de vida de los datos. + +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ------------------------------------------ | ------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Directorio raíz para la base de datos SQLite, las copias de seguridad y los archivos de datos. Sobrescríbalo para volúmenes de Docker o rutas personalizadas. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(sin definir)_ | `src/lib/dataPaths.ts` | Vía de escape para la protección de DATA_DIR en pruebas/evaluaciones (#10428). Las pruebas y las sondas de evaluación/impresión de Node (`-e`/`--eval`/`-p`/`--print`, incluidas las formas `--eval=`/`--print=`) sin `DATA_DIR` se redirigen a un directorio temporal desechable para impedir que abran la base de datos real del operador; establézcala en `1` para volver a habilitar el uso del directorio real. | +| `OMNIROUTE_BUILD_SHA` | _(sin definir)_ | `src/lib/monitoring/buildSha.ts` | SHA de Git del artefacto en ejecución. Lo registra `npm run build:release`; puede inyectarse en contenedores distribuidos sin el archivo centinela `dist/BUILD_SHA`. Se expone como `system.buildSha` en `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Referencia con la que la comprobación de procedencia del empaquetado del artefacto contrasta el SHA de la compilación (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(sin definir)_ | `scripts/build/buildProvenance.ts` | Establézcala en `1` para permitir el empaquetado de una compilación cuyo SHA no esté en la línea de publicación, registrándola como una versión canary deliberada en lugar de hacer que falle la comprobación (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(sin definir)_ | `scripts/ops/deploy-canary.mjs` | Clave de API para la sonda de humo del despliegue canary, enviada como `Authorization: Bearer` a `/v1/chat/completions`. Solo la usa el script de despliegue (#10429), nunca el servidor. No está relacionada con las variables `OMNIROUTE_SMOKE_*` del conjunto de pruebas de humo opcional de la CLI (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` en `tests/integration/upstream-cli-smoke.int.test.ts`); consulte [Integraciones de la CLI → Barrido de humo real](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(sin definir)_ | `src/lib/buildPhase.ts` | Señal de fase de compilación (#10060): `scripts/build/build-next-isolated.mjs` la establece en `1` y cada proceso de trabajo de compilación generado la hereda, de modo que la capa de la base de datos devuelve un stub sin operaciones en lugar de cargar el complemento nativo better-sqlite3 (que interrumpe el proceso de trabajo al salir). Nunca se establece para el servidor en ejecución. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Establézcala en `1` para omitir la comprobación opcional previa a la compilación de dependencias nativas en árboles de dependencias integradas poco habituales. Esto no permite compilar si falta una dependencia; úsela únicamente cuando las dependencias nativas se proporcionen por separado. | +| `OMNIROUTE_DATA_DIR` | _(sin definir)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias alternativo** de `DATA_DIR`, que solo se comprueba cuando `DATA_DIR` no está definida. Se usa para localizar la caché persistente en disco de sesiones con afinidad de hilo del ejecutor de PromptQL (`/promptql-thread-sessions.json`); si no se define ninguna de las dos variables, la caché permanece únicamente en memoria (no persiste entre reinicios). | +| `OMNIROUTE_PLUGINS_DIR` | _(sin definir)_ | `src/lib/plugins/scanner.ts` | Directorio que lee el **escáner de complementos en tiempo de ejecución** y raíz en la que instala el administrador de complementos; sustituye el valor predeterminado derivado del directorio personal (#11827). En Docker/K8s, apúntelo al árbol de complementos montado mediante bind en lugar de cambiar HOME únicamente para reubicar la ruta de exploración (HOME también rige todos los demás comportamientos relativos al directorio personal). Sin definir = `~/.omniroute/plugins`, o `/tmp/.omniroute/plugins` cuando el proceso no exporta ningún directorio personal; esta variable elimina la falta de detección silenciosa resultante. El directorio resuelto se registra una vez durante el inicio como `scanner.dir_resolved`, junto con la entrada que prevaleció. Solo del lado del servidor: los complementos de comandos de la CLI conservan su propio `OMNIROUTE_PLUGIN_PATH` (sección 9). | +| `STORAGE_ENCRYPTION_KEY` | _(vacío = deshabilitado)_ | `src/lib/db/encryption.ts` | Clave AES para el cifrado completo en reposo de la base de datos SQLite. Genérela con `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Etiqueta de versión de la clave de cifrado. Increméntela al rotar la clave para permitir el descifrado de copias de seguridad antiguas. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Cuando es `true`, omite las copias de seguridad rutinarias/previas a la escritura del archivo SQLite (guardar/borrar precios de models.dev, escrituras de configuración). Las copias de seguridad manuales y previas a una restauración se siguen ejecutando. **No** deshabilita la instantánea de seguridad duradera obligatoria del ejecutor de migraciones ni la protección contra migraciones masivas para una base de datos persistente existente. Las copias de seguridad no manuales se limitan a una como máximo cada 60 minutos. En el panel, **Configuración → Almacenamiento** puede deshabilitarse de forma independiente la copia de seguridad automática rutinaria. | +| `OMNIROUTE_CRYPT_KEY` | _(sin definir)_ | `src/lib/db/encryption.ts` | **Alias heredado** de `STORAGE_ENCRYPTION_KEY`. Se acepta como alternativa cuando la variable principal no está presente. | +| `OMNIROUTE_API_KEY_BASE64` | _(sin definir)_ | `src/lib/db/encryption.ts` | **Alias heredado** (formato codificado en Base64) aceptado como alternativa. Se decodifica automáticamente antes de usarse. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(sin definir)_ | `src/lib/db/core.ts` | Sobrescribe el intervalo de comprobación periódica del estado de SQLite (ms). Cuando no está definido, los valores predeterminados se derivan de `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(eliminado)_ | `src/lib/db/walMaintenance.ts` | **Eliminado.** Un `wal_checkpoint(TRUNCATE)` periódico en vivo puede invalidar el mapeo wal-index compartido y provocar que el proceso falle con SIGBUS (#13973), por lo que el planificador ya no existe. La variable no tiene efecto: un valor positivo registra una advertencia de obsolescencia una sola vez, mientras que `0` o un valor sin definir no genera ningún mensaje. El WAL se mantiene mediante puntos de control PASSIVE (abajo) y se trunca mediante el punto de control del apagado. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Sobrescribe el intervalo frecuente de `wal_checkpoint(PASSIVE)` (ms). Mantiene pequeños los marcos WAL pendientes para que los puntos de control sigan siendo rápidos y el archivo WAL permanezca acotado entre los truncamientos del apagado. `0` lo deshabilita. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Cuando una ejecución periódica PASSIVE detecta que el archivo WAL supera este tamaño, ejecuta `wal_checkpoint(RESTART)` para que el WAL comience de nuevo sin reescribir el wal-index mapeado. Se eliminaron los puntos de control en modo de truncamiento en vivo (consulte la fila `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Establézcalo en `1`/`true`/`yes`/`on` para salir del proceso después de que la presión crítica sobre los recursos se mantenga durante `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, permitiendo que un supervisor (systemd `Restart=always`, política de reinicio de Docker) restaure un proceso limpio en lugar de responder con errores 503 indefinidamente. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Tiempo durante el cual debe persistir la presión crítica antes de que se active la salida para el autorreinicio. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(detección automática)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Ruta explícita (absoluta o relativa al directorio de trabajo actual) a `sql-wasm.wasm` al utilizar el adaptador alternativo WASM de `sql.js`. Cuando no está definida, se detecta automáticamente mediante las dependencias del paquete y las posibles estructuras de directorios. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Días durante los cuales el proceso de limpieza automática conserva, antes de eliminarlos, los puntos de control, los archivos de entrada/salida/error referenciados y la fila de un trabajo terminal (completado/fallido/cancelado/expirado) de la API de lotes. Solo surte efecto una vez habilitado `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; coincide con el periodo de retención de resultados de la API de lotes de OpenAI. No afecta a la ruta `DELETE /api/v1/batches/delete-completed` activada por el operador, que, por diseño, permanece incondicional (sin filtro por antigüedad). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Cuando es `true`, permite que el proceso de limpieza automática elimine los trabajos terminales de la API de lotes (y sus puntos de control) que superen `OMNIROUTE_BATCH_RETENTION_DAYS`, y borre el contenido BLOB de los archivos cargados después de su propio `expires_at`. Está deshabilitado de forma predeterminada: todas las instalaciones existentes conservan estos datos exactamente como antes hasta que un operador lo habilite. También es un indicador de funcionalidad editable desde el panel; consulte `docs/reference/FEATURE_FLAGS.md` → Tiempo de ejecución. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Establécelo en `1` para omitir por completo la comprobación de estado de la base de datos durante el inicio. Resulta útil para tareas de corta duración y pruebas de integración. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Establécelo en `1` para forzar la activación del bucle de comprobación de estado de la base de datos, incluso cuando normalmente se omitiría (p. ej., en tareas de corta duración). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Establécelo en `1` para omitir la preparación del entorno de ejecución nativo durante `npm install`. Resulta útil en instalaciones de CI/sin interfaz gráfica donde sqlite ya está compilado. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(detección automática)_ | `src/lib/db/migrationRunner.ts` | Reemplaza el directorio que analiza el ejecutor de migraciones. Resulta útil al distribuir migraciones empaquetadas en compilaciones personalizadas. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(no establecido)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Directorios de migración adicionales en forma de entradas `namespace=dir` separadas por el delimitador de rutas de la plataforma (p. ej., `ee=/opt/app/enterprise/db/migrations`). Los archivos encontrados allí se registran como `-`, por lo que una distribución que incluya sus propias migraciones nunca entra en conflicto con los espacios numéricos del proyecto original. Una entrada con formato incorrecto, un espacio de nombres no válido o un directorio inexistente provocan un error durante el inicio en lugar de omitir silenciosamente el esquema. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Umbral de seguridad para migraciones pendientes en masa (#3416). El inicio se interrumpe si hay más migraciones pendientes que este límite en una base de datos existente (protege frente al borrado de la tabla de seguimiento). Auméntalo para restaurar una copia de seguridad antigua; establécelo en `0` para desactivar la comprobación. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Directorio de trabajo para la puerta de validación de versiones `check:install-upgrade`. Necesita aproximadamente 12 GB (dos árboles de instalación de ~3 GB más el archivo tar), por lo que no debe ejecutarse en un tmpfs pequeño; en el ejecutor autohospedado, `/tmp` es un tmpfs de 12 GB respaldado por RAM y la puerta de validación lo agotó, truncando el paquete. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(valor predeterminado en el código)_ | `src/lib/spend/batchWriter.ts` | Intervalo de vaciado (ms) para el escritor de gastos/costes por lotes. Los valores más bajos reducen la agrupación de escrituras; los valores más altos reducen la contención en la base de datos. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(valor predeterminado en el código)_ | `src/lib/spend/batchWriter.ts` | Número máximo de entradas de gasto almacenadas en el búfer antes de forzar su vaciado. Auméntalo en despliegues con muchas consultas por segundo; redúcelo cuando limitar el uso de memoria sea más importante. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(no establecido)_ | `open-sse/utils/proxyFetch.ts` | Establécelo en `"true"` para emitir registros de depuración `[ProxyFetch]` en la ruta de retransmisión de Vercel. Está desactivado de forma predeterminada para evitar revelar indicios sobre el enrutamiento. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Establécelo en `"true"` o `"1"` para incluir las IP del cliente y de salida, así como el prefijo de la cuenta, en la línea detallada del registro del proceso `[ProxyEgress]`. Se mantiene DESACTIVADO de forma predeterminada para que el registro del proceso no revele las IP ni el prefijo de la cuenta. | +| `OMNIROUTE_DEBUG` | _(no establecido)_ | `bin/cli/commands/quota.mjs` | Establécelo en `1` para imprimir en stderr diagnósticos de tiempo por solicitud (`[omniroute] GET completed in Nms`) desde los comandos de cuota de la CLI. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automático)_ | `scripts/dev/healthcheck.mjs` | Ruta explícita que sondea la comprobación de estado del contenedor. Si no se establece, la sonda la deriva de `OMNIROUTE_BASE_PATH`; al establecerla, se vuelve a utilizar el endpoint de monitorización profunda. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(no establecido)_ | `bin/cli/commands/completion.mjs` | Establécelo en cualquier valor no vacío para emitir diagnósticos `[omniroute completion]` desde las rutas de la caché de autocompletado del shell de la CLI (lectura/actualización/escritura). Está desactivado de forma predeterminada: los fallos de estas cachés se omiten silenciosamente para que una caché ausente o dañada nunca interrumpa el autocompletado mediante tabulación. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Ventana máxima de reintentos para elementos individuales del lote (ms). Los elementos que superen esta duración se marcan como fallidos. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Retraso base (ms) para el retroceso exponencial en los reintentos de elementos por lotes. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Límite (ms) del retroceso exponencial entre reintentos de elementos por lotes. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Número máximo de lotes procesados simultáneamente. Auméntelo para incrementar el rendimiento; manténgalo bajo para evitar avalanchas de límites de tasa. | > [!IMPORTANT] > Antes de modificar una base de datos persistente existente, el ejecutor de migraciones publica una instantánea completa, > direccionada por contenido, en `DATA_DIR/db_backups/`. La publicación requiere un sistema de archivos > que admita enlaces físicos sin sobrescritura dentro del mismo sistema de archivos, además de sincronización duradera de archivos. Los hosts POSIX también -> requieren la sincronización de directorios; en Windows, Node puede rechazar los identificadores de directorio, por lo que OmniRoute vacía el -> archivo publicado y trata la sincronización de la entrada de directorio como una operación de mejor esfuerzo. -> Si el `DATA_DIR` montado no puede proporcionar esas garantías, el inicio se interrumpe de forma segura antes de aplicar +> requieren sincronización de directorios; en Windows, Node puede rechazar los identificadores de directorio, por lo que OmniRoute vacía el +> archivo publicado y trata la sincronización de entradas de directorio como una operación de mejor esfuerzo. +> Si el `DATA_DIR` montado no puede proporcionar esas garantías, el inicio falla de forma segura antes de aplicar > una migración. Mueva `DATA_DIR` a un volumen que admita esas primitivas; no utilice > `DISABLE_SQLITE_AUTO_BACKUP` para eludir la seguridad de las migraciones. ### Escenarios -| Escenario | Configuración | -| --------------------- | ------------------------------------------------------------------------------------------------------------ | -| **Desarrollo local** | Mantenga todos los valores predeterminados. La base de datos reside en `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + monte un volumen en `/data`. | -| **Cifrado en reposo** | Configure `STORAGE_ENCRYPTION_KEY` + ¡conserve copias de seguridad de la clave! Perderla = perder los datos. | -| **CI/Pruebas** | `DATA_DIR=/tmp/omniroute-test` — efímero, no se necesita cifrado. | +| Escenario | Configuración | +| --------------------- | ----------------------------------------------------------------------------------------------------------- | +| **Desarrollo local** | Mantenga todos los valores predeterminados. La base de datos se encuentra en `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + monte un volumen en `/data`. | +| **Cifrado en reposo** | Establezca `STORAGE_ENCRYPTION_KEY` + ¡guarde copias de seguridad de la clave! Perderla = perder los datos. | +| **CI/Pruebas** | `DATA_DIR=/tmp/omniroute-test` — efímero, no se necesita cifrado. | --- @@ -213,45 +212,46 @@ OmniRoute utiliza **SQLite** (mediante `better-sqlite3`) para toda la persistenc ## 4. Seguridad y autenticación -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ------------------------------------------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sal combinada con identificadores de hardware para generar la huella digital de la máquina. Cámbiela en cada despliegue para garantizar el aislamiento. | -| `OMNIROUTE_CLI_SALT` | _(sin definir = sal aleatoria por instalación almacenada en `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Sal HMAC para derivar el token de autenticación de la CLI local. Establecer este valor rota todos los tokens de la CLI en la máquina y siempre tiene prioridad sobre la sal almacenada. Consulte `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Establece el atributo `Secure` en las cookies de sesión. **Debe ser `true`** cuando se ejecuta detrás de HTTPS. | -| `REQUIRE_API_KEY` | `false` | Middleware de la API | Cuando es `true`, todas las solicitudes del proxy a `/v1/*` deben incluir una clave de API válida. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Permite revelar los valores completos de las claves de API en la interfaz del panel. Se puede configurar desde las opciones de funcionalidad del panel; supone un riesgo de seguridad en instancias compartidas. | -| `NO_LOG_API_KEY_IDS` | _(vacío)_ | `src/lib/compliance/index.ts` | Identificadores de claves de API separados por comas que omiten el registro de solicitudes (cumplimiento del RGPD). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(sin definir = ilimitado)_ | `src/shared/utils/apiKeyPolicy.ts` | Presupuesto alternativo de solicitudes diarias que se aplica a las claves de API cuya columna `rate_limits` es nula. Sin definir o vacío: sin límite implícito (#2289, #11017). `0` equivale a ilimitado. Un entero positivo N habilita N/día, 5N/semana y 20N/mes. Los valores no vacíos con formato incorrecto recurren a los límites heredados de 1000/día, 5000/semana y 20000/mes. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Tamaño máximo permitido para el cuerpo de una solicitud. Rechaza las cargas útiles que superen este límite. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Los cuerpos reales de las solicitudes que alcancen o superen este umbral adquieren, antes del análisis de JSON, la concesión atómica de admisión de carga pesada local al proceso (ruta BYTE, incluido `POST /v1/responses`). Cuenta con la misma vía de escape por margen saludable de [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) que las solicitudes con estructuras pesadas; sigue estando limitada por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), para que [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) no vuelva a producirse. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Límite máximo estricto de las rutas de chat, aplicado a los bytes leídos durante la ingesta acotada, incluidas las solicitudes con `Content-Length` ausente, no válido o falseado; las solicitudes que lo superan reciben `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(sin establecer — sin límite de número de solicitudes)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** este límite heredado de NÚMERO de solicitudes ahora solo se aplica cuando se establece explícitamente. Si se deja sin establecer (valor predeterminado), la admisión de chats pesados queda limitada por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`: un presupuesto de BYTES derivado automáticamente y dimensionado a partir del límite real de memoria del proceso en **un solo proceso** (un heap de V8). Dos solicitudes `/v1/responses` superpuestas de ~750 000 tokens hacen fallar heaps de ~12 GiB (#7849): se trata de una advertencia de **presupuesto de memoria**, no de un máximo estricto de producto de 2. Un proceso en buen estado (con el heap por debajo de la proporción de rechazo) PUEDE admitir más solicitudes `/v1/responses` largas simultáneas mediante `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Decenas de clientes SSE de larga duración (40–50) dependen del heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, no de un «máximo de 2». Aumentar este valor a ciegas para «usar el host» vuelve a introducir #7849. Multiplique los **heaps** con **N `DATA_DIR` independientes** (#11024); nunca use `replicas>1` con un único archivo SQLite. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(derivado automáticamente)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** sobrescritura del presupuesto de bytes de ingesta derivado automáticamente (el 25 % del límite más restrictivo de memoria de V8/cgroup, dividido por una amplificación transitoria de 8x). Los valores derivados y explícitos se restringen al intervalo de 8 MiB–2 GiB. Un cuerpo mayor que el presupuesto efectivo falla inmediatamente con `413 body_exceeds_budget`; la contención entre cuerpos que pueden procesarse individualmente sigue siendo reintentable con `503`. Tener 40–50 clientes SSE largos simultáneos depende de este presupuesto + el heap, no de un «máximo de 2» estricto. Consulte `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` en `/api/monitoring/health` antes de realizar ajustes. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Proporción de rechazo por presión del heap (`heapUsed / heap_size_limit`) para la admisión pesada por BYTES y ESTRUCTURA (#10183, #10268, #10437). Una solicitud pesada simultánea que supere `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` solo se rechaza con el `503` reintentable cuando el heap TAMBIÉN se encuentra en esta proporción o por encima de ella; con un heap en buen estado, se admite mediante el margen de capacidad saludable. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (valor predeterminado: `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Capacidad adicional limitada para la ruta rápida con un heap en buen estado (#10437), tanto para ESTRUCTURA como para BYTES (`admitChatRequest`, incluidos los cuerpos ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Sin este límite, cada solicitud recibida mientras el sistema estaba ocupado pero el heap se encontraba en buen estado eludía la admisión sin ningún límite máximo. Cuando este número de concesiones simultáneas está activo a través de la ruta de heap en buen estado, las solicitudes ocupadas posteriores pasan a la MISMA ruta de espera limitada/rechazo utilizada cuando existe una presión real sobre el heap. `0` deshabilita por completo esta vía alternativa. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Número de mensajes que clasifica una solicitud de chat como pesada incluso cuando su cuerpo se encuentra por debajo del umbral de bytes. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Número de herramientas que clasifica una solicitud de chat como pesada incluso cuando su cuerpo se encuentra por debajo del umbral de bytes. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Estimación conservadora de tokens basada en el tamaño de las cadenas que clasifica una solicitud como pesada; se trata de una aproximación del coste de admisión, no de la tokenización de facturación del proveedor. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (deshabilitado) | `src/shared/middleware/chatBodyAdmission.ts` | Límite opcional y voluntario del historial del chat. Está deshabilitado de forma predeterminada: el número de mensajes es una política de implementación, no una propiedad universal de una solicitud, y establecer el límite aquí rechaza conversaciones con un `413` terminal antes de que el proceso de compresión pueda hacerlas procesables. El crecimiento del heap está limitado por `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` y el rechazo por presión del heap. Establezca un valor positivo en implementaciones con memoria limitada que necesiten un límite estricto; el exceso recibirá entonces un `413` estructurado que indica que se requiere compactación. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Límite estricto para una respuesta ascendente sin streaming almacenada por completo en memoria. Cuando se supera, se cancela el lector ascendente y la solicitud falla inmediatamente, en lugar de hacer crecer una cadena sin límites hasta agotar el heap. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Máximo de bytes transmitidos que se reenvían desde los encabezados de respuesta ascendentes. Cuando se supera el presupuesto, se descartan los encabezados de menor prioridad (p. ej., los encabezados personalizados `x-codex-*`, `x-oai-request-id`) para mantenerse dentro de los límites habituales de encabezados de los proxies inversos. Establezca un valor mayor para reenviar más metadatos ascendentes, a costa de aumentar el tamaño de los encabezados de respuesta. | -| `CORS_ORIGIN` | _(sin establecer)_ | `src/server/cors/origins.ts` | Lista de permitidos CORS heredada de un único origen. Para nuevas implementaciones, es preferible usar `CORS_ALLOWED_ORIGINS`. CORS solo se aplica a clientes de API de navegador entre orígenes; en cambio, las escrituras autenticadas del panel usan solicitudes del mismo origen junto con protección CSRF vinculada a la sesión. | -| `CORS_ALLOWED_ORIGINS` | _(sin establecer)_ | `src/server/cors/origins.ts` | Lista de permitidos CORS separada por comas. No se envía ningún comodín a menos que `CORS_ALLOW_ALL=true` se configure explícitamente. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Vía de escape exclusiva para desarrollo que refleja cualquier `Origin` del navegador. No la habilite en implementaciones compartidas ni de producción. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Bloquea las llamadas a proveedores dirigidas a rangos de IP privados, de bucle invertido o de enlace local. Deshabilítelo únicamente en entornos de prueba aislados. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Permite URL de proveedores que apunten a redes privadas/locales (localhost, 192.168.x.x, 10.x.x.x, etc.). **OBLIGATORIO para proveedores autoalojados** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Cuando es `false`, el panel rechaza la validación de URL locales. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Permite añadir/validar proveedores en direcciones locales/privadas (127.0.0.1, localhost, LAN, rangos privados), limitado a la ruta de validación de proveedores. **Valor predeterminado: `true`** (prioridad local); establézcalo en `false` para imponer un bloqueo estricto que solo permita direcciones públicas. Los endpoints de metadatos de la nube (169.254.169.254, metadata.google.internal) permanecen bloqueados independientemente de esta configuración. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Permite que las rutas `/v1/audio/*` (transcripciones, voz, traducciones) usen un nodo proveedor compatible con OpenAI alojado fuera de localhost. Está desactivado de forma predeterminada: enrutar audio a un host remoto cambia la identidad de salida y debe ser una decisión explícita del operador. Los nodos de bucle invertido/privados (localhost, 127.0.0.1, 172.16-31.x) siempre están permitidos y no se ven afectados. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Cuando OIDC está habilitado, deshabilita el inicio de sesión con contraseña para que los usuarios solo puedan autenticarse mediante el inicio de sesión único OIDC. También se acepta el alias simple `OIDC_DISABLE_PASSWORD_LOGIN`; la marca de función del panel con la misma clave tiene prioridad. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias simple de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | - -### Lista de comprobación de seguridad +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sal combinada con identificadores de hardware para generar la huella digital de la máquina. Cámbiela en cada despliegue para garantizar el aislamiento. | +| `OMNIROUTE_CLI_SALT` | _(sin establecer = sal aleatoria por instalación, almacenada de forma persistente en `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Sal HMAC para derivar el token de autenticación de la CLI local. Establecer este valor rota todos los tokens de la CLI en la máquina y siempre tiene prioridad sobre la sal almacenada. Consulte `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Establece el atributo `Secure` en las cookies de sesión. **Debe ser `true`** cuando se ejecute detrás de HTTPS. | +| `REQUIRE_API_KEY` | `false` | Middleware de la API | Cuando es `true`, todas las solicitudes del proxy a `/v1/*` deben incluir una clave de API válida. **Este indicador no controla `GET /v1/models`**, que sigue la configuración de inicio de sesión del panel (`requireAuthForModels`); por lo tanto, un `401` de `/v1/models` NO significa que la inferencia esté protegida. Consulte `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Permite revelar los valores completos de las claves de API en la interfaz del panel. Se puede configurar desde los indicadores de funcionalidades del panel; supone un riesgo de seguridad en instancias compartidas. | +| `NO_LOG_API_KEY_IDS` | _(vacío)_ | `src/lib/compliance/index.ts` | IDs de claves de API separados por comas que omiten el registro de solicitudes (cumplimiento del RGPD). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(sin establecer = ilimitado)_ | `src/shared/utils/apiKeyPolicy.ts` | Presupuesto alternativo de solicitudes por día aplicado a las claves de API cuya columna `rate_limits` es nula. Sin establecer o vacío: sin límite implícito (#2289, #11017). `0` equivale a ilimitado. Un entero positivo N habilita N/día, 5N/semana y 20N/mes. Los valores no vacíos con formato incorrecto recurren a los límites heredados de 1000/día, 5000/semana y 20000/mes. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Tamaño máximo permitido del cuerpo de la solicitud. Rechaza las cargas útiles que superen este límite. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Los cuerpos reales de las solicitudes que alcancen o superen este umbral adquieren, antes del análisis de JSON, la concesión atómica local al proceso para operaciones pesadas (ruta BYTE, incluido `POST /v1/responses`). Usa la misma vía de escape por margen saludable de [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) que las solicitudes estructuralmente pesadas; sigue estando limitada por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), para que [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) no vuelva a producirse. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Límite estricto de las rutas de chat aplicado a los bytes leídos durante la ingesta acotada, incluidas las solicitudes con `Content-Length` ausente, no válido o falseado; el exceso recibe `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(sin establecer — sin límite por número de solicitudes)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** este límite heredado de NÚMERO de solicitudes ahora solo se aplica cuando se establece explícitamente. Si se deja sin establecer (el valor predeterminado), la admisión de solicitudes de chat pesadas queda controlada por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`: un presupuesto de BYTES derivado automáticamente y dimensionado según el límite real de memoria del proceso en **un proceso** (un heap de V8). Dos solicitudes `/v1/responses` solapadas de ~750 000 tokens hacen abortar heaps de ~12 GiB (#7849): una advertencia sobre el **presupuesto de memoria**, no un máximo estricto de producto de 2. Un proceso saludable (con el heap por debajo de la proporción de descarte) PUEDE admitir más solicitudes `/v1/responses` largas simultáneas mediante `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Decenas de clientes SSE de larga duración (40–50) dependen del heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, no de un «máximo de 2». Aumentar esto a ciegas para «usar el host» vuelve a introducir #7849. Multiplique los **heaps** con **N `DATA_DIR` independientes** (#11024); nunca use `replicas>1` sobre un único archivo SQLite. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(derivado automáticamente)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** sobrescritura del presupuesto de bytes de ingesta derivado automáticamente (el 25 % del límite más restrictivo de memoria de V8/cgroup, dividido por una amplificación transitoria de 8x). Los valores derivados y explícitos se restringen al intervalo de 8 MiB a 2 GiB. Un cuerpo mayor que el presupuesto efectivo falla inmediatamente con `413 body_exceeds_budget`; la contención entre cuerpos que podrían procesarse individualmente sigue siendo reintentable mediante `503`. La concurrencia de 40–50 clientes SSE de larga duración depende de este presupuesto + el heap, no de un «máximo de 2» estricto. Consulte `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` en `/api/monitoring/health` antes de ajustar la configuración. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Proporción de descarte por presión del heap (`heapUsed / heap_size_limit`) para la admisión de solicitudes pesadas por BYTES y ESTRUCTURA (#10183, #10268, #10437). Una solicitud pesada simultánea que supere `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` solo se descarta con el `503` reintentable cuando el heap TAMBIÉN se encuentra en esta proporción o por encima de ella; con un heap saludable, se admite mediante el margen de capacidad saludable. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (valor predeterminado `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Capacidad adicional acotada para la ruta rápida con un heap saludable (#10437), tanto para ESTRUCTURA como para BYTES (`admitChatRequest`, incluidos los cuerpos ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Sin este límite, todas las solicitudes con el sistema ocupado pero con un heap saludable eludían la admisión sin tope alguno. Cuando hay tantas concesiones simultáneas activas mediante la ruta de heap saludable, las siguientes solicitudes realizadas mientras el sistema está ocupado pasan a la MISMA ruta de espera acotada/descarte utilizada bajo una presión real del heap. `0` desactiva por completo esta omisión. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Número de mensajes que clasifica una solicitud de chat como pesada, incluso cuando su cuerpo está por debajo del umbral de bytes. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Número de herramientas que clasifica una solicitud de chat como pesada, incluso cuando su cuerpo está por debajo del umbral de bytes. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Estimación conservadora de tokens basada en el tamaño de las cadenas que clasifica una solicitud como pesada; se trata de una aproximación del coste de admisión, no de la tokenización de facturación del proveedor. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (desactivado) | `src/shared/middleware/chatBodyAdmission.ts` | Límite opcional y voluntario del historial de chat. Está desactivado de forma predeterminada: el número de mensajes es una política de implementación, no una propiedad universal de una solicitud, y establecer aquí un límite rechaza las conversaciones con un `413` definitivo antes de que el proceso de compresión pueda hacerlas procesables. El crecimiento del heap está limitado por `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` y el descarte por presión del heap. Establezca un valor positivo en implementaciones con memoria limitada que necesiten un límite estricto; el exceso recibirá entonces un `413` estructurado que indica que se requiere compactación. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Límite estricto para una respuesta ascendente sin streaming almacenada íntegramente en memoria. Al superarlo, se cancela el lector ascendente y la solicitud falla de inmediato, en lugar de hacer crecer una cadena sin límites hasta agotar el heap. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Máximo de bytes transmitidos que se reenvían desde las cabeceras de respuesta del servidor de origen. Cuando se supera el límite, se descartan las cabeceras de menor prioridad (p. ej., las personalizadas `x-codex-*`, `x-oai-request-id`) para mantenerse dentro de los límites habituales de cabeceras de los proxies inversos. Establézcalo en un valor más alto para reenviar más metadatos del servidor de origen a costa de aumentar el tamaño de las cabeceras de respuesta. | +| `CORS_ORIGIN` | _(sin definir)_ | `src/server/cors/origins.ts` | Lista de orígenes permitidos de CORS heredada para un único origen. Para nuevos despliegues, se recomienda usar `CORS_ALLOWED_ORIGINS`. CORS solo se utiliza para clientes de API de navegador entre orígenes; en su lugar, las operaciones de escritura autenticadas del panel usan solicitudes del mismo origen junto con protección CSRF vinculada a la sesión. | +| `CORS_ALLOWED_ORIGINS` | _(sin definir)_ | `src/server/cors/origins.ts` | Lista de orígenes permitidos de CORS separados por comas. No se envía ningún comodín a menos que se configure explícitamente `CORS_ALLOW_ALL=true`. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Mecanismo de escape exclusivo para desarrollo que permite reflejar cualquier `Origin` del navegador. No lo habilite en despliegues compartidos ni de producción. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Bloquea las llamadas a proveedores dirigidas a rangos de IP privados, de bucle invertido o locales de enlace. Deshabilítelo únicamente en entornos de prueba aislados. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Permite URLs de proveedores que apunten a redes privadas/locales (localhost, 192.168.x.x, 10.x.x.x, etc.). **REQUERIDO para proveedores autoalojados** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Cuando es `false`, el panel rechaza la validación de URLs locales. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Permite añadir/validar proveedores en direcciones locales/privadas (127.0.0.1, localhost, LAN, rangos privados); se limita a la ruta de validación del proveedor. **Valor predeterminado: `true`** (prioridad local); establézcalo en `false` para imponer un bloqueo estricto que solo permita direcciones públicas. Los endpoints de metadatos de la nube (169.254.169.254, metadata.google.internal) permanecen bloqueados en todos los casos. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Permite que las rutas `/v1/audio/*` (transcripciones, voz, traducciones) utilicen un nodo proveedor compatible con OpenAI alojado fuera de localhost. Está desactivado de forma predeterminada: enrutar el audio a un host remoto cambia la identidad de salida y debe ser una decisión explícita del operador. Los nodos de bucle invertido/privados (localhost, 127.0.0.1, 172.16-31.x) siempre están permitidos y no se ven afectados. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Permite que `POST /v1/rerank` (y el paso de reclasificación mediante bucle invertido del motor de memoria) utilice un nodo proveedor compatible con OpenAI alojado fuera de localhost: un equipo en la LAN o un par de Tailscale que ejecute TEI, Infinity, vLLM, etc. Está desactivado de forma predeterminada: enrutar a un host remoto cambia la identidad de salida y debe ser una decisión explícita del operador. Los nodos de bucle invertido (localhost, 127.0.0.1, 172.16-31.x) siempre están permitidos y no se ven afectados. Los nodos remotos también deben cumplir la política de URLs salientes del proveedor (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); nunca se enruta a hosts de metadatos de la nube. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Cuando OIDC está habilitado, deshabilita el inicio de sesión mediante contraseña para que los usuarios solo puedan autenticarse mediante el inicio de sesión único de OIDC. También se acepta el alias simple `OIDC_DISABLE_PASSWORD_LOGIN`; la marca de funcionalidad del panel con la misma clave tiene prioridad. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias simple de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | + +### Lista de comprobación de refuerzo de seguridad ```bash # Requisitos mínimos de seguridad para producción: AUTH_COOKIE_SECURE=true # Requiere HTTPS REQUIRE_API_KEY=true # Autentica todas las llamadas al proxy -ALLOW_API_KEY_REVEAL=false # Nunca expone las claves en la interfaz de usuario +ALLOW_API_KEY_REVEAL=false # Nunca expone las claves en la interfaz CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # Límite de 5 MB ``` @@ -301,59 +301,66 @@ OmniRoute proporciona una defensa de dos capas: análisis de inyecciones en las ## 6. Políticas de herramientas y enrutamiento -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Controla el acceso del LLM a herramientas/llamadas de funciones. `allowlist` = solo las herramientas enumeradas, `denylist` = todas excepto las enumeradas, `disabled` = sin restricciones. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Ruta al archivo JSON de reglas de manipulación de la carga útil (ajustes específicos por modelo/protocolo para el proveedor ascendente). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Intervalo de recarga (ms) para la recarga en caliente del archivo de reglas de carga útil. Mínimo `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Opción voluntaria: enruta los ID de modelos `claude-*` sin prefijo de clientes de Claude Code mediante la cuenta OAuth de Claude Code, en lugar de requerir un prefijo de proveedor. Los prefijos explícitos de proveedor siguen teniendo prioridad. También puede configurarse mediante un interruptor del panel en la página del proveedor Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Límite de concurrencia por modelo para combinaciones round-robin (#9100). El semáforo de combinaciones round-robin tenía un límite fijo de 3 solicitudes simultáneas por modelo, sin posibilidad de anularlo, lo que serializaba detrás de ese límite el tráfico con mayor concurrencia. Se valida como `>= 1` y se limita a `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Opción voluntaria peligrosa que omite la comprobación local de OmniRoute sobre la ventana de contexto o el máximo de tokens de entrada para solicitudes directas a un único modelo. Los proveedores ascendentes siguen aplicando sus límites reales; la compresión del prompt y el límite de tokens de salida propio del modelo permanecen activos. La precedencia efectiva es: anulación de la base de datos de indicadores de funcionalidades > variable de entorno > valor predeterminado; no es necesario reiniciar. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(sin establecer)_ | `open-sse/services/conversationTracker.ts` | Establézcalo en `1` para dejar de recopilar el historial de conversaciones. `resolveConversationId()` devuelve un resultado sin seguimiento antes de leer SQLite o analizar el historial de mensajes, y también abarca los ID de sesión proporcionados por el cliente. La gestión de sesiones de enrutamiento no cambia y los registros existentes no se eliminan. Para implementaciones que no utilizan la vista de conversaciones del panel y desean que la tabla de turnos deje de crecer. | +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ----------------------------------------------------------- | ------------------------------ | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Controla el acceso del LLM a herramientas/llamadas de funciones. `allowlist` = solo las herramientas enumeradas, `denylist` = todas excepto las enumeradas, `disabled` = sin restricciones. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Ruta al archivo JSON de reglas de manipulación de la carga útil (ajustes del servicio ascendente por modelo/protocolo). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Intervalo de recarga (ms) para la recarga en caliente del archivo de reglas de carga útil. Mínimo: `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Activación opcional: enruta los ID de modelos `claude-*` sin prefijo desde clientes de Claude Code mediante la cuenta OAuth de Claude Code, en lugar de requerir un prefijo de proveedor. Los prefijos de proveedor explícitos siguen teniendo prioridad. También puede configurarse mediante un interruptor del panel en la página del proveedor Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Límite de concurrencia por modelo para combinaciones de turno rotativo (#9100). El semáforo de combinaciones de turno rotativo tenía un límite fijo de 3 solicitudes simultáneas por modelo sin posibilidad de anulación, lo que serializaba el tráfico de mayor concurrencia tras ese límite. Se valida como `>= 1` y se limita a `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Activación opcional peligrosa que omite la comprobación local de OmniRoute de la ventana de contexto o del máximo de tokens de entrada para solicitudes directas a un único modelo. Los proveedores ascendentes siguen aplicando sus límites reales; la compresión del prompt y el límite de tokens de salida propio del modelo permanecen activos. La precedencia efectiva es: anulación de la base de datos de indicadores de funciones > variable de entorno > valor predeterminado; no se requiere reiniciar. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(sin definir)_ | `open-sse/services/selfHostedEntry.ts` | Documento YAML `providers:` insertado directamente (RIC-738, D4). Cuando se establece (con o sin un bloque `strategy:`), `/v1/chat/completions` se desvía a la entrada unificada autohospedada compatible con OpenAI, en lugar de usar la canalización en la nube. Sin definir (valor predeterminado): la ruta pasa directamente a la canalización en la nube existente. Consulta `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(sin definir)_ | `open-sse/services/selfHostedEntry.ts` | Ruta a un archivo YAML que contiene el mismo documento `providers:` que `OMNIROUTE_SELF_HOSTED_PROVIDERS`, para implementaciones que prefieren un archivo en lugar de una variable de entorno insertada directamente. Cualquiera de las dos opciones activa la entrada autohospedada. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(sin definir — ruta abierta)_ | `open-sse/services/selfHostedEntry.ts` | Clave de API compartida opcional para la entrada unificada autohospedada (estructura D5, reservada para el sistema de cuotas por clave). Cuando se establece, las solicitudes deben incluir `Authorization: Bearer `. Sin definir: la ruta está abierta, de acuerdo con el patrón existente de proveedores locales autohospedados (implementación en bucle invertido/red de confianza). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(sin definir)_ | `open-sse/services/routingStrategies.ts` | Documento YAML `strategy:` insertado directamente para el motor de enrutamiento determinista (M2/RIC-740, D3): lista negra/lista blanca, disyuntor con tiempo de espera, prioridad de costes, reconocimiento de latencia y cadena de reserva. Anula, por clave, un bloque `strategy:` insertado directamente y anidado dentro de `OMNIROUTE_SELF_HOSTED_PROVIDERS`. Consulta `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(sin definir)_ | `open-sse/services/routingStrategies.ts` | Ruta a un archivo YAML que contiene el mismo documento `strategy:` que `OMNIROUTE_SELF_HOSTED_STRATEGY`, para implementaciones que prefieren un archivo en lugar de una variable de entorno insertada directamente. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(sin definir)_ | `open-sse/services/conversationTracker.ts` | Establézcalo en `1` para dejar de recopilar el historial de conversaciones. `resolveConversationId()` devuelve un resultado sin seguimiento antes de leer SQLite o analizar el historial de mensajes, y también se incluyen los ID de sesión proporcionados por el cliente. La gestión de sesiones de enrutamiento no cambia y los registros existentes no se eliminan. Para implementaciones que no utilizan la vista de conversaciones del panel y desean evitar que la tabla de turnos siga creciendo. | --- -## 7. URL y sincronización en la nube - -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL del lado del servidor para que las tareas internas de sincronización llamen a `/api/sync/cloud`. Manténgala como una URL de bucle local/contenedor incluso cuando la aplicación se publique mediante un proxy. | -| `CLOUD_URL` | _(vacío)_ | `src/lib/cloudSync.ts` | URL del endpoint de retransmisión en la nube (función prémium). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Tiempo de espera HTTP para las solicitudes de sincronización con la nube. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Configuración de compilación de Webpack | Perfil de compilación (establezca `minimal` para excluir físicamente del paquete los módulos privilegiados). | -| `OMNIROUTE_STANDALONE_DIR` | _salida independiente de .build/_ | `scripts/build/colocate-standalone.mjs` | Anulación en tiempo de compilación del directorio de salida independiente utilizado por el paso de coubicación posterior a la compilación. No es una configuración de tiempo de ejecución. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(vacío)_ | `src/lib/cloudSync.ts` | Secreto compartido utilizado para verificar la firma HMAC-SHA256 de las respuestas de Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Establézcalo en `true` para permitir que el endpoint de Cloud Sync sobrescriba las credenciales locales. El valor predeterminado es `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Establézcalo en `true` para rechazar una respuesta de Cloud Sync sin firma cuando no haya ningún secreto local configurado (#13679). Una firma presente siempre se verifica —y siempre se rechaza cuando `OMNIROUTE_CLOUD_SYNC_SECRET` no está definida—, independientemente de esta opción. En v3.9, el valor predeterminado cambia para exigirla. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Establézcalo en `true` para recurrir al comportamiento de un solo paso «importar todo» de v3.8.5 sin confirmación del usuario. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, panel de control, sincronización | URL pública para `redirect_uri` de OAuth, los enlaces del panel de control y las URL públicas generadas. Establézcala en la URL pública estable cuando las devoluciones de llamada de OAuth o los enlaces generados para el navegador deban utilizar un host canónico de proxy inverso. | -| `NEXT_PUBLIC_CLOUD_URL` | _(vacío)_ | Lado del cliente | Reflejo del lado del cliente de `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(sin definir)_ | `src/shared/services/cloudSyncScheduler.ts` | Alternativa heredada para `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(sin definir)_ | Resolutor de origen público, URL de imágenes | Origen de OmniRoute visible para el navegador con la máxima prioridad, utilizado para generar URL públicas y validar el origen del navegador fuera del panel de control. Establézcalo cuando OpenWebUI u otro retransmisor acceda a OmniRoute mediante una URL interna, pero el navegador del usuario deba obtener el contenido multimedia generado desde una LAN, un túnel o un origen público. **No** incluya `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(sin definir)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL absoluta del manifiesto de complementos de proveedores anunciada a los clientes sidecar. Cuando no está definida, OmniRoute deriva `/api/v1/provider-plugin-manifest` del origen de la solicitud o de HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocolo utilizado al derivar la URL del manifiesto de complementos de proveedores a partir de HOST/PORT sin un origen de solicitud. Establézcalo en `https` detrás de un proxy público que termine TLS cuando no se haya establecido explícitamente `OMNIROUTE_PROVIDER_MANIFEST_URL`. | -| `OMNIROUTE_TRUST_PROXY` | _(sin definir)_ | `src/server/origin/publicOrigin.ts` | Modo de confianza opcional para las cabeceras reenviadas de origen público. Sin definir = no confiar en `Forwarded` / `X-Forwarded-*` para decisiones de seguridad. `true` / `loopback` confía en el host/protocolo reenviado solo desde un proxy de bucle local marcado con un token. `private` / `lan` también confía en pares de proxy de una LAN privada. En producción, prefiera definir explícitamente `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(sin definir)_ | `open-sse/utils/kieTask.ts` | URL pública de devolución de llamada para tareas asíncronas de kie.ai. Anulación de máxima prioridad antes de `OMNIROUTE_KIE_CALLBACK_URL` y `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(sin definir)_ | `open-sse/utils/kieTask.ts` | Nombre alternativo de `KIE_CALLBACK_URL`. Se utiliza como alternativa cuando la variable principal no está definida. | -| `OMNIROUTE_PUBLIC_URL` | _(sin definir)_ | `open-sse/utils/kieTask.ts` | Origen público utilizado para crear URL de devolución de llamada asíncronas. Alternativa de menor prioridad para las devoluciones de llamada de kie.ai; también se utiliza como URL pública genérica para otros retransmisores. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpoint de consulta de cuota de CrofAI utilizado por la página de uso. Puede anularse para retransmisores o dispositivos de prueba. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Endpoint oficial de uso de OpenCode Go autenticado mediante clave de API y utilizado por la página de uso. Puede anularse para retransmisores o dispositivos de prueba. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintetiza las cabeceras de identidad de la CLI de OpenCode (User-Agent, x-opencode-client/project y UUID de solicitud/sesión) en las solicitudes ascendentes de opencode-go/zen que el cliente no haya enviado, para que Cloudflare las acepte en el tráfico saliente de VPS (#6210/#5997). Activado de forma predeterminada desde #10571; desactívelo con `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | User-Agent predeterminado utilizado cuando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está activado y no se ha establecido ninguna anulación `_USER_AGENT` por proveedor. Solo se aplica a los ejecutores de opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Valor de la cabecera `x-opencode-client` sintetizada cuando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está activado. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Valor de la cabecera `x-opencode-project` sintetizada cuando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está activado. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL de configuración de Ollama Cloud utilizada para extraer la cuota. Puede anularse para retransmisores o dispositivos de prueba. | -| `OLLAMA_USAGE_COOKIE` | _(sin definir)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` de Ollama Cloud utilizada para extraer la cuota de la página de configuración. Es confidencial; cuando haya varias cuentas configuradas, prefiera el campo por conexión del panel de control. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(sin definir)_ | `open-sse/services/usage.ts` | Variable de entorno alternativa para la cookie `__Secure-session` de Ollama Cloud. Es confidencial; cuando haya varias cuentas configuradas, prefiera el campo por conexión del panel de control. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(sin definir)_ | `open-sse/services/usage.ts` | Variable de entorno alternativa para la cookie `__Secure-session` de Ollama Cloud, utilizada antes que los alias más cortos. Es confidencial; cuando haya varias cuentas configuradas, prefiera el campo por conexión del panel de control. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpoint de límites de uso de CodeWhisperer (AWS Kiro). Puede anularse para retransmisores o dispositivos de prueba. | +## 7. URLs y sincronización en la nube + +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL del servidor que los trabajos internos de sincronización utilizan para llamar a `/api/sync/cloud`. Manténgala como una URL de bucle invertido/contenedor incluso cuando la aplicación esté expuesta públicamente mediante un proxy. | +| `CLOUD_URL` | _(vacío)_ | `src/lib/cloudSync.ts` | URL del punto de conexión de retransmisión en la nube (función prémium). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Tiempo de espera HTTP para las solicitudes de sincronización en la nube. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Configuración de compilación de Webpack | Perfil de compilación (establézcalo en `minimal` para excluir físicamente del paquete los módulos con privilegios). | +| `OMNIROUTE_STANDALONE_DIR` | _salida independiente en .build/_ | `scripts/build/colocate-standalone.mjs` | Anulación en tiempo de compilación del directorio de salida independiente utilizado por el paso de coubicación posterior a la compilación. No es una configuración de tiempo de ejecución. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(vacío)_ | `src/lib/cloudSync.ts` | Secreto compartido utilizado para verificar la firma HMAC-SHA256 de las respuestas de sincronización en la nube. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Establézcalo en `true` para permitir que el punto de conexión de sincronización en la nube sobrescriba las credenciales locales. El valor predeterminado es `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Establézcalo en `true` para rechazar una respuesta de sincronización en la nube sin firmar cuando no haya ningún secreto local configurado (#13679). Si hay una firma, siempre se verifica —y siempre se rechaza cuando `OMNIROUTE_CLOUD_SYNC_SECRET` no está definida— independientemente de esta marca. El valor predeterminado pasa a aplicar esta restricción en v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Establézcalo en `true` para volver al comportamiento de un solo paso «importar todo» de v3.8.5 sin confirmación del usuario. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, panel de control, sincronización | URL pública para redirect_uri de OAuth, los enlaces del panel de control y las URLs públicas generadas. Establézcala en la URL pública estable cuando las devoluciones de llamada de OAuth o los enlaces generados para el navegador deban utilizar un host canónico de proxy inverso. | +| `NEXT_PUBLIC_CLOUD_URL` | _(vacío)_ | Lado del cliente | Reflejo del lado del cliente de `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(sin definir)_ | `src/shared/services/cloudSyncScheduler.ts` | Alternativa heredada para `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(sin definir)_ | Resolución del origen público, URLs de imágenes | Origen de OmniRoute orientado al navegador con la máxima prioridad, utilizado para generar URLs públicas y validar el origen del navegador fuera del panel. Establézcalo cuando OpenWebUI u otro relé acceda a OmniRoute mediante una URL interna, pero el navegador del usuario deba obtener los medios generados desde una LAN, un túnel o un origen público. **No** incluya `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(sin definir)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL absoluta del manifiesto de complementos de proveedores anunciada a los clientes sidecar. Si no está definida, OmniRoute deriva `/api/v1/provider-plugin-manifest` del origen de la solicitud o de HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocolo utilizado al derivar la URL del manifiesto de complementos de proveedores a partir de HOST/PORT sin un origen de solicitud. Establézcalo en `https` detrás de un proxy público que termine TLS cuando no se haya definido explícitamente `OMNIROUTE_PROVIDER_MANIFEST_URL`. | +| `OMNIROUTE_TRUST_PROXY` | _(sin definir)_ | `src/server/origin/publicOrigin.ts` | Modo de confianza opcional para las cabeceras reenviadas del origen público. Sin definir = no confiar en `Forwarded` / `X-Forwarded-*` para las decisiones de seguridad. `true` / `loopback` confía en el host/protocolo reenviado únicamente desde un proxy de bucle local marcado con un token. `private` / `lan` también confía en pares proxy de la LAN privada. En producción, se recomienda usar explícitamente `NEXT_PUBLIC_BASE_URL`. | +| `KIE_CALLBACK_URL` | _(sin definir)_ | `open-sse/utils/kieTask.ts` | URL pública de devolución de llamada para trabajos asíncronos de kie.ai. Sustitución de máxima prioridad antes de `OMNIROUTE_KIE_CALLBACK_URL` y `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(sin definir)_ | `open-sse/utils/kieTask.ts` | Nombre alternativo de `KIE_CALLBACK_URL`. Se utiliza como alternativa cuando la variable principal no está definida. | +| `OMNIROUTE_PUBLIC_URL` | _(sin definir)_ | `open-sse/utils/kieTask.ts` | Origen público utilizado para componer las URLs de devolución de llamada asíncronas. Alternativa de menor prioridad para las devoluciones de llamada de kie.ai; también se utiliza como URL pública genérica para otros relés. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpoint de consulta de la cuota de CrofAI utilizado por la página Uso. Sobrescríbalo para relés / fixtures de prueba. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Endpoint oficial de uso de OpenCode Go autenticado mediante clave de API y utilizado por la página Uso. Sobrescríbalo para relés / fixtures de prueba. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintetiza las cabeceras de identidad de OpenCode CLI (User-Agent, x-opencode-client/project, UUID de solicitud/sesión) en las solicitudes ascendentes de opencode-go/zen que el cliente no haya enviado, para que Cloudflare las acepte en el tráfico de salida de VPS (#6210/#5997). Activado de forma predeterminada desde #10571; desactívelo con `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent predeterminado utilizado cuando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está activado y no se ha definido ninguna sustitución `_USER_AGENT` específica del proveedor. Solo se aplica a los ejecutores de opencode. En una solicitud sin clave que el servicio ascendente restrinja, un valor configurado que no incluya `opencode/= 1.17>` se sustituye por este valor predeterminado en lugar de rechazarse. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Valor de la cabecera sintetizada `x-opencode-client` cuando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está activado. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Valor del encabezado `x-opencode-project` sintetizado cuando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está activado. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(sin establecer)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Establézcalo en `off` para dejar de ajustar el cuerpo de las solicitudes de OpenCode sin clave (el indicador de streaming y la lista de herramientas). Los encabezados se siguen aplicando. Se lee en cada solicitud, por lo que los cambios surten efecto inmediatamente. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(sin establecer)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Nombres de herramientas separados por comas que se declararán en una solicitud de OpenCode sin clave que no incluya ninguna, cuando todavía no se haya observado ninguna para ese modelo. Si está vacío, se recurre a un único marcador de posición que se indica al modelo que no debe invocar. Como máximo 32 entradas, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; las entradas no válidas se ignoran. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL de configuración de Ollama Cloud utilizada para extraer la cuota. Se puede sobrescribir para relés o datos de prueba. | +| `OLLAMA_USAGE_COOKIE` | _(sin establecer)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` de Ollama Cloud utilizada para extraer la cuota de la página de configuración. Es confidencial; cuando haya varias cuentas configuradas, es preferible usar el campo correspondiente a cada conexión en el panel de control. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(sin establecer)_ | `open-sse/services/usage.ts` | Variable de entorno alternativa para la cookie `__Secure-session` de Ollama Cloud. Es confidencial; cuando haya varias cuentas configuradas, es preferible usar el campo correspondiente a cada conexión en el panel de control. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(sin establecer)_ | `open-sse/services/usage.ts` | Variable de entorno alternativa para la cookie `__Secure-session` de Ollama Cloud, utilizada antes que los alias más cortos. Es confidencial; cuando haya varias cuentas configuradas, es preferible usar el campo correspondiente a cada conexión en el panel de control. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpoint de límites de uso de CodeWhisperer (AWS Kiro). Se puede sobrescribir para relés o datos de prueba. | > [!IMPORTANT] -> Al desplegar detrás de un proxy inverso (nginx, Caddy), establece `NEXT_PUBLIC_BASE_URL` en tu URL pública estable (p. ej., `https://omniroute.example.com`) cuando las devoluciones de llamada de OAuth o los enlaces públicos generados deban usar ese nombre de host. Sin esto, las devoluciones de llamada de OAuth pueden fallar porque `redirect_uri` no coincidirá y los enlaces públicos generados pueden apuntar al origen interno del contenedor. +> Al implementar detrás de un proxy inverso (nginx, Caddy), establezca `NEXT_PUBLIC_BASE_URL` en su URL pública estable (p. ej., `https://omniroute.example.com`) cuando las devoluciones de llamada de OAuth o los enlaces públicos generados deban utilizar ese nombre de host. Sin esto, las devoluciones de llamada de OAuth pueden fallar porque el redirect_uri no coincidirá, y los enlaces públicos generados pueden apuntar al origen interno del contenedor. > -> Mantén `BASE_URL` como una URL interna de loopback/contenedor para tareas de servidor a servidor. No uses un `Origin` del navegador ni un nombre de host público para solicitudes internas a sí mismo que incluyan credenciales. +> Mantenga `BASE_URL` como una URL interna de bucle invertido o del contenedor para los trabajos de servidor a servidor. No utilice un `Origin` del navegador ni un nombre de host público para las solicitudes internas autorreferenciales que incluyan credenciales. > -> Las escrituras autenticadas del panel no requieren una URL base pública estática: el panel envía solicitudes no seguras al mismo origen con un token CSRF vinculado a la sesión. OmniRoute sigue centralizando la validación del origen público para integraciones de navegador ajenas al panel: primero se confía en las variables de entorno de URL pública explícitas; las cabeceras `Forwarded` / `X-Forwarded-*` sin procesar se ignoran, salvo que `OMNIROUTE_TRUST_PROXY` esté habilitado y el par proxy inmediato esté marcado mediante un token como de confianza. No uses la configuración de CORS para corregir las solicitudes del panel al mismo origen; CORS solo se utiliza para clientes de navegador de origen cruzado. +> Las escrituras autenticadas del panel de control no requieren una URL base pública estática: el panel envía solicitudes no seguras del mismo origen con un token CSRF vinculado a la sesión. OmniRoute sigue centralizando la validación del origen público para las integraciones de navegador ajenas al panel de control: primero se confía en las variables de entorno de URL pública explícitas; los encabezados `Forwarded` / `X-Forwarded-*` sin procesar se ignoran, salvo que `OMNIROUTE_TRUST_PROXY` esté habilitado y el proxy inmediatamente anterior esté marcado como de confianza mediante un token. No utilice la configuración de CORS para corregir solicitudes del panel de control del mismo origen; CORS solo se aplica a clientes de navegador de origen cruzado. --- @@ -586,49 +593,50 @@ del sidecar indicada anteriormente). --- -## 11. Credenciales de proveedores de OAuth - -Credenciales integradas para el **desarrollo en localhost**. Para implementaciones remotas, registre las suyas propias en la consola para desarrolladores de cada proveedor. - -| Variable | Proveedor | Notas | -| --------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Cliente público; no se necesita ningún secreto. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Sobrescribe el URI de redirección. Valor predeterminado: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Cliente público. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Requiere el `_SECRET` correspondiente. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Cliente público. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Requiere el `_SECRET` correspondiente. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Cliente público. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Sobrescritura opcional del id de cliente OAuth de GitHub Enterprise Copilot. Si no se establece, utiliza el valor público predeterminado de `GITHUB_OAUTH_CLIENT_ID`. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Clave de API alternativa utilizada por `open-sse/executors/devin-cli.ts` cuando no hay credenciales disponibles por conexión. Opcional. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Ruta personalizada al binario de Devin CLI (`devin`). La resuelve `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID de cliente OAuth para GitLab Duo. Registra una aplicación en `https://gitlab.com/-/profile/applications` con el URI de redirección `/callback` y los ámbitos `api, read_user, openid, profile, email`. Utiliza `GITLAB_OAUTH_CLIENT_ID` como alternativa. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Secreto de cliente OAuth para GitLab Duo. Opcional; el flujo PKCE no requiere ningún secreto. Utiliza `GITLAB_OAUTH_CLIENT_SECRET` como alternativa. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Sobrescribe la URL base de GitLab (GitLab autoalojado). El valor predeterminado es `https://gitlab.com`. Utiliza `GITLAB_BASE_URL` como alternativa. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Alternativa heredada para `GITLAB_DUO_BASE_URL`. Se utiliza cuando la variante `_DUO_` no está establecida. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Alternativa heredada para `GITLAB_DUO_OAUTH_CLIENT_ID`, utilizada por `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Alternativa heredada para `GITLAB_DUO_OAUTH_CLIENT_SECRET`, utilizada por `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Establécela para habilitar OAuth de Qoder. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Clave de API directa alternativa (omite OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | ID del espacio de trabajo para Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias de `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Sobrescribe el directorio de configuración de Qoder CLI (sesión PAT aislada; evita sobrescribir un inicio de sesión del navegador). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Token `tk` del frontend que se envía como `validated` a `/api/chat`. Es obligatorio cuando Blackbox exige que los tokens coincidan; de lo contrario, OmniRoute utiliza un UUID aleatorio como alternativa. Consulta la incidencia #2252. | -| `VISION_BRIDGE_BASE_URL` | Mecanismo de protección Vision Bridge | URL base compatible con OpenAI para llamadas de Vision Bridge que no sean de Anthropic. De forma predeterminada, usa la variable de entorno heredada de la URL de OpenAI o api.openai.com. Apunta al bucle interno `/v1` de OmniRoute o a cualquier endpoint compatible con OpenAI (compatibilidad de Gemini con OpenAI, OpenRouter). Incidencia #2232. Cuando la URL es el propio `/v1` de OmniRoute, la subsolicitud de descripción envía `x-omniroute-admission-bypass: internal` y se autentica con la credencial resuelta del bucle interno (valor centinela `sk_omniroute` en modo local, u `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), para que funcionen las implementaciones con `REQUIRE_API_KEY=true`. | -| `VISION_BRIDGE_API_KEY` | Mecanismo de protección Vision Bridge | Clave de API para la URL anterior. Sobrescribe las variables de entorno de OpenAI/Google específicas del proveedor para las llamadas de Vision Bridge que no sean de Anthropic. Los modelos de Anthropic conservan su ruta de clave dedicada de Anthropic. Incidencia #2232. | +## 11. Credenciales de proveedores OAuth + +Credenciales integradas para el **desarrollo en localhost**. Para implementaciones remotas, registre sus propias credenciales en la consola para desarrolladores de cada proveedor. + +| Variable | Proveedor | Notas | +| --------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Cliente público; no se necesita ningún secreto. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Permite sustituir el URI de redirección. Valor predeterminado: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Cliente público. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Requiere el `_SECRET` correspondiente. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Cliente público. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Requiere el `_SECRET` correspondiente. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Cliente público. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Sustitución opcional del ID de cliente OAuth de GitHub Enterprise Copilot. Si no está definido, se utiliza el valor público predeterminado de `GITHUB_OAUTH_CLIENT_ID`. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Sustitución opcional del ID de integración del cliente de GitHub Copilot enviado en los encabezados `Copilot-Integration-Id` y `Editor-Plugin-Version`. El valor predeterminado es `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Clave de API alternativa utilizada por `open-sse/executors/devin-cli.ts` cuando no hay credenciales disponibles para la conexión. Opcional. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Ruta personalizada al binario de Devin CLI (`devin`). La resuelve `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID de cliente OAuth para GitLab Duo. Registre una aplicación en `https://gitlab.com/-/profile/applications` con el URI de redirección `/callback` y los ámbitos `api, read_user, openid, profile, email`. Si no está definido, se utiliza `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Secreto de cliente OAuth para GitLab Duo. Opcional; el flujo PKCE no requiere ningún secreto. Si no está definido, se utiliza `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Permite sustituir la URL base de GitLab (GitLab autoalojado). El valor predeterminado es `https://gitlab.com`. Si no está definido, se utiliza `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Alternativa heredada para `GITLAB_DUO_BASE_URL`. Se utiliza cuando la variante `_DUO_` no está definida. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Alternativa heredada para `GITLAB_DUO_OAUTH_CLIENT_ID` utilizada por `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Alternativa heredada para `GITLAB_DUO_OAUTH_CLIENT_SECRET` utilizada por `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Configúrela para habilitar OAuth de Qoder. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Clave de API directa alternativa (omite OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | ID del espacio de trabajo para la CLI de Qoder. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias de `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Sobrescribe el directorio de configuración de la CLI de Qoder (sesión PAT aislada; evita sobrescribir un inicio de sesión del navegador). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Token `tk` del frontend que se enviará como `validated` en `/api/chat`. Es obligatorio cuando Blackbox exige que los tokens coincidan; de lo contrario, OmniRoute utiliza un UUID aleatorio como alternativa. Consulte la incidencia #2252. | +| `VISION_BRIDGE_BASE_URL` | Protección Vision Bridge | URL base compatible con OpenAI para llamadas de Vision Bridge que no sean de Anthropic. De forma predeterminada, utiliza la variable de entorno de la URL heredada de OpenAI o api.openai.com. Apunte al bucle local `/v1` de OmniRoute o a cualquier endpoint compatible con OpenAI (compatibilidad con OpenAI de Gemini, OpenRouter). Incidencia #2232. Cuando la URL es el propio `/v1` de OmniRoute, la subsolicitud de descripción envía `x-omniroute-admission-bypass: internal` y se autentica con la credencial resuelta del bucle local (centinela `sk_omniroute` en modo local, u `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), de modo que funcionen las implementaciones con `REQUIRE_API_KEY=true`. | +| `VISION_BRIDGE_API_KEY` | Protección Vision Bridge | Clave de API para la URL anterior. Sobrescribe las variables de entorno de OpenAI/Google específicas de cada proveedor para las llamadas de Vision Bridge que no sean de Anthropic. Los modelos de Anthropic conservan su ruta de clave de Anthropic específica. Incidencia #2232. | > [!WARNING] > -> 1. Ve a [Google Cloud Console → Credenciales](https://console.cloud.google.com/apis/credentials) -> 2. Crea un ID de cliente de OAuth 2.0 (tipo: "Aplicación web") -> 3. Añade la URL de tu servidor como URI de redireccionamiento autorizado -> 4. Reemplaza los valores de las credenciales en `.env`. +> 1. Vaya a [Google Cloud Console → Credenciales](https://console.cloud.google.com/apis/credentials) +> 2. Cree un ID de cliente OAuth 2.0 (tipo: "Aplicación web") +> 3. Añada la URL de su servidor como URI de redireccionamiento autorizado +> 4. Sustituya los valores de las credenciales en `.env`. --- @@ -737,7 +745,7 @@ Todos los valores se expresan en **milisegundos**. La resolución está centrali ``` REQUEST_TIMEOUT_MS (anulación global) -├─→ FETCH_TIMEOUT_MS (llamadas a proveedores ascendentes, valor predeterminado: 600000) +├─→ FETCH_TIMEOUT_MS (llamadas a proveedores externos, valor predeterminado: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (hereda de FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (hereda de FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (hereda de FETCH_TIMEOUT_MS) @@ -756,114 +764,115 @@ REQUEST_TIMEOUT_MS (anulación global) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (valor predeterminado: 0 = deshabilitado) ``` -| Variable | Valor predeterminado | Descripción | -| ----------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(sin definir)_ | Atajo global: sobrescribe los valores predeterminados de `FETCH_TIMEOUT_MS` y `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Tiempo de espera total de las solicitudes HTTP para las llamadas a proveedores ascendentes. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Silencio máximo entre bytes sin procesar del proveedor ascendente antes de cancelar. Los modelos de razonamiento extendido rara vez se detienen durante más de 90 s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Duración activa total máxima del flujo SSE; nunca se reinicia al recibir bytes del proveedor ascendente y es independiente de `REQUEST_TIMEOUT_MS`. Se deriva del mayor `timeoutMs` por modelo del registro (1200000, Codex), más un margen de 60000, por lo que un modelo al que se permite consumir todo su presupuesto nunca se interrumpe a mitad de una respuesta. Establézcalo en `0` para deshabilitarlo. | -| `OMNIROUTE_SSE_COMMENTS` | _(deshabilitado)_ | Indica si OmniRoute puede emitir líneas de comentarios SSE `:` (por ejemplo, el latido `: keepalive` y los tráileres de metadatos `x-omniroute-*`). Está deshabilitado de forma predeterminada (#10524), ya que los clientes estrictamente compatibles con OpenAI ejecutan JSON.parse en cada línea SSE y fallan con los comentarios `:`; los latidos `data:` no se ven afectados. Establézcalo en `on`/`true`/`1`/`yes` para volver a habilitarlo. Utilizado por `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Tiempo para recibir el primer evento SSE que no sea de ping. Hereda `REQUEST_TIMEOUT_MS` cuando está definido. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Ventana adaptativa máxima de preparación para el primer evento en solicitudes de streaming grandes, con uso intensivo de herramientas o con un alto nivel de razonamiento. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Interruptor de desactivación para la heurística `/goal`. Establézcalo en `false`/`0`/`off` para deshabilitar por completo la detección; los tiempos de espera de preparación y la recuperación del flujo nunca se amplían en función del cuerpo o los encabezados de la solicitud, lo que mitiga la amplificación de tiempos de espera controlada por el cliente. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Ventana máxima de preparación para el primer evento en ejecuciones de agentes `/goal` detectadas o solicitudes forzadas mediante `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Habilita automáticamente la recuperación temprana del flujo para las ejecuciones de agentes `/goal` detectadas. Establézcalo en `false`/`0`/`off` para deshabilitar la activación específica de objetivos. Esto solo puede AÑADIR recuperación sobre el valor predeterminado del operador; nunca sobrescribe una exclusión explícita mediante `STREAM_RECOVERY_ENABLED` o la configuración de la base de datos. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Elimina los eventos SSE no estándar `codex.*` (por ejemplo, `codex.rate_limits`) que provocan un error 502 en `responses.stream()` del SDK de OpenAI. Activado de forma predeterminada (#11014). Establézcalo en `0`/`false`/`no`/`off` para reenviarlos. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(sin definir)_ | Transporte del servidor de aplicaciones Codex de activación opcional. Punto de conexión WebSocket (`ws://`/`wss://`) de un sidecar local `codex app-server`. Cuando se configura junto con un token, las solicitudes de Codex se enrutan mediante JSON-RPC al sidecar en lugar de usar la API HTTP Responses. También se puede configurar por conexión mediante `providerSpecificData.codexAppServerUrl`. Utilizado por `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(sin definir)_ | Token de capacidad o de portador proporcionado en línea al servidor de aplicaciones. Sobrescritura por conexión: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(sin definir)_ | Ruta a un archivo que contiene el token de capacidad del servidor de aplicaciones (procedente de `codex app-server --ws-token-file`). Se utiliza cuando `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` no está definido. Sobrescritura por conexión: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Directorio de trabajo en el que se ejecuta el turno del servidor de aplicaciones. Sobrescritura por conexión: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(sin definir)_ | Política de aprobación enviada al turno del servidor de aplicaciones (por ejemplo, `never`, `on-request`). Sobrescritura por conexión: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(sin definir)_ | Política de entorno aislado enviada al turno del servidor de aplicaciones (por ejemplo, `read-only`, `workspace-write`, `danger-full-access`). Cuando no se define, el ejecutor utiliza `workspace-write` de forma predeterminada (reforzado; anteriormente era `danger-full-access`). Sobrescritura por conexión: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Aprueba automáticamente las solicitudes de aprobación del propio servidor de aplicaciones (ejecución de comandos, archivos o permisos en el host). Está desactivado de forma predeterminada: las solicitudes se rechazan automáticamente; las llamadas a herramientas del entorno de ejecución no se ven afectadas (viajan por el canal de paso independiente `item/tool/call`). Acepta `true`/`1`/`yes`. Sobrescritura por conexión: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tiempo para recibir los encabezados de respuesta. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Tiempo máximo de espera (ms) hasta el inicio de la respuesta para cada intento directo sin proxy. Si se agota el tiempo de espera, se reintenta una vez con un socket nuevo; establézcalo en `0` para deshabilitar el límite y conservar el comportamiento anterior. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tiempo para recibir el cuerpo completo de la respuesta. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Tiempo de espera para establecer la conexión TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Tiempo de espera de inactividad del socket keep-alive. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tiempo de espera del proxy de huella digital TLS (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Limita específicamente el tiempo hasta el primer byte del cuerpo en el transporte de huella digital TLS de wreq-js; `TLS_CLIENT_TIMEOUT_MS` por sí solo no puede detectar un cuerpo bloqueado, ya que se resuelve en cuanto llegan los encabezados (#12656). Si se agota el tiempo de espera, se cancela el lector de wreq y se recurre al despachador directo/proxy; `0` deshabilita el mecanismo de vigilancia. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Solo para el ejecutor de OpenCode y únicamente mientras esté activada la marca de funcionalidad `OPENCODE_RESPONSES_STALL_ROTATION` (desactivada de forma predeterminada): limita la espera del primer byte del cuerpo de una respuesta transmitida de Responses después de recibir sus encabezados (#13484). Un flujo de Responses se abre con `response.created`, por lo que la ausencia de datos más allá de este intervalo se considera un bloqueo: la cuenta entra en período de espera y la solicitud rota una vez a la cuenta siguiente; un segundo bloqueo provoca un fallo inmediato. `0` deshabilita la protección incluso con la marca activada. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Tiempo de espera del salto de proxy para las solicitudes del puente `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Dirige el ejecutor de obtención web de Firecrawl a una instancia autoalojada (la clave de API es opcional fuera de la nube). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Tiempo de espera por solicitud para el ejecutor de obtención web de Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Tiempo de espera total de la solicitud del servidor para el puente. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Tiempo para enviar los encabezados de respuesta a través del puente. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Tiempo de espera de inactividad de keep-alive del puente. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Tiempo de espera del socket sin procesar (0 = deshabilitado). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Período de gracia tras SIGTERM/SIGINT antes de forzar la salida. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Valor de respaldo utilizado por `src/shared/utils/fetchTimeout.ts` cuando `FETCH_TIMEOUT_MS` no está definido. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Tiempo de espera (ms) para los ajustes preestablecidos `validationRead` y `modelsProbe` en `src/shared/network/safeOutboundFetch.ts`. Auméntelo para endpoints lentos (Cerebras, Cloudflare AI, Groq) a fin de evitar fluctuaciones entre los estados activo/error en el panel. Para valores no válidos (<1000) o no numéricos, se usa 8000 ms como valor de respaldo. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Tiempo de espera de obtención específico del relé en `open-sse/utils/proxyFetch.ts` (#9158). Un relé bloqueado debe fallar antes que el tiempo de espera del cliente/agente (~30 s), para que quienes realizan la llamada vean un fallo específico del relé en lugar de un tiempo de espera genérico del servidor de origen. Se limita a `29000` para garantizar que siempre se active primero. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Espera exponencial compartida para las rutas de reintento único directo/relé/proxy en `open-sse/utils/proxyFetch.ts` (#9158). `0` = reintentar inmediatamente. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Tiempo de espera de solicitudes nativas de wreq-js (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Margen adicional del límite absoluto de JS añadido al tiempo de espera nativo. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Tiempo de espera de solicitudes nativas de wreq-js (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Margen adicional del límite absoluto de JS añadido al tiempo de espera nativo. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (desactivado) | Añade «Tienes búsqueda web integrada. Responde las preguntas directamente utilizando los resultados de búsqueda.» al mensaje del sistema del invocador (`perplexity-web/protocol.ts`). Desactivado de forma predeterminada: Perplexity realiza búsquedas de todos modos y la frase se filtra en las respuestas como metacomentario para los clientes de programación. Establece `1`/`true`/`yes`/`on` para restaurarlo. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Tiempo de espera de las solicitudes nativas de wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Margen para el plazo límite absoluto de JS añadido al tiempo de espera nativo. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Tiempo de espera de las solicitudes nativas de wreq-js (`notionTlsClient.ts`); `notion-web` lo aumenta por solicitud a `180000` para generaciones largas. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Margen para el plazo límite absoluto de JS añadido al tiempo de espera nativo. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Grupo compartido de navegadores Playwright para el chat con cookies web respaldado por navegador (`browserPool.ts`); establece `off` para desactivarlo. | -| `OBSCURA_BIN` | `auto-detect` | Ruta al binario `obscura` utilizado como motor principal por el grupo de navegadores y el ejecutor de Cloudflare Playground (`open-sse/services/obscura.ts`); si no se establece, se detecta automáticamente desde el PATH del sistema. | -| `OBSCURA_CDP_ENDPOINT` | _(sin establecer)_ | Apunta a una instancia de Obscura ya en ejecución (`http://host:port`) en lugar de iniciar una; el módulo no es propietario de ese proceso (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `puerto libre aleatorio` | Puerto explícito para el proceso `obscura serve` iniciado; si no se establece, se elige automáticamente un puerto libre (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Hace que una solicitud de chat con cookies web utilice la ruta respaldada por navegador (`browserBackedChat.ts`); establece `1` para activarla. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL base para el ejecutor de Kimi Web (Connect-RPC internacional de kimi.ai) (`kimi-web.ts`); sobrescríbela únicamente para endpoints de réplica/proxy. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Endpoint de chat completo para el ejecutor de Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(detectada automáticamente)_ | Ruta a un ejecutable de Chrome/Edge del sistema para el inicio de sesión interactivo mediante navegador de Adobe Firefly (`adobeFireflyBrowserLogin.ts`); sobrescribe la detección automática específica de cada SO. | -| `OMNIROUTE_STANDALONE_DIR` | _salida independiente de .build/_ | Sobrescritura en tiempo de compilación para el directorio de salida independiente utilizado por el paso de colocación posterior a la compilación (`scripts/build/colocate-standalone.mjs`); corresponde a las herramientas de compilación, no al entorno de ejecución. | - -Los intentos de destinos combinados heredan el tiempo de espera resuelto de la solicitud ascendente (`FETCH_TIMEOUT_MS`, o -`REQUEST_TIMEOUT_MS` cuando proporciona el valor predeterminado de recuperación). Establece `targetTimeoutMs` en una combinación, -en los valores predeterminados de una combinación o en la sobrescritura de un proveedor únicamente para agilizar la conmutación por error de la combinación; los valores superiores al -tiempo de espera ascendente actual se limitan a dicho tiempo de espera. - -`comboTimeoutMs` es un presupuesto de tiempo de reloj independiente para toda la combinación y todos los destinos de conmutación por error. -Déjalo sin establecer o en `0` para mantener una iteración ilimitada (el mecanismo de detención de bloqueos de 10 minutos -`COMBO_LOOP_SAFETY_TIMEOUT_MS` sigue siendo aplicable). Un valor positivo sustituye esa -red de seguridad para la combinación. Mantén `comboTimeoutMs` por encima de `targetTimeoutMs` para que la conmutación por error -siga disponiendo de tiempo después de un primer destino lento. +| Variable | Valor predeterminado | Descripción | +| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(sin definir)_ | Atajo global: sobrescribe los valores predeterminados de `FETCH_TIMEOUT_MS` y `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Tiempo de espera total de la solicitud HTTP para las llamadas al proveedor ascendente. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Silencio máximo entre bytes sin procesar del proveedor ascendente antes de cancelar. Los modelos de razonamiento extendido rara vez hacen pausas >90s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Duración activa total máxima del flujo SSE; nunca se reinicia al recibir bytes del proveedor ascendente y es independiente de `REQUEST_TIMEOUT_MS`. Se deriva del mayor `timeoutMs` por modelo del registro (1200000, Codex), más un margen de 60000, de modo que un modelo al que se le permita agotar todo su presupuesto nunca sea interrumpido a mitad de la respuesta. Establézcalo en `0` para desactivarlo. | +| `OMNIROUTE_SSE_COMMENTS` | _(desactivado)_ | Indica si OmniRoute puede emitir líneas de comentario SSE `:` (p. ej., el latido `: keepalive` y los metadatos finales `x-omniroute-*`). Está desactivado de forma predeterminada (#10524), ya que los clientes con compatibilidad estricta con OpenAI aplican JSON.parse a cada línea SSE y fallan con los comentarios `:`; los latidos `data:` no se ven afectados. Establezca `on`/`true`/`1`/`yes` para volver a habilitarlo. Utilizado por `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Tiempo para recibir el primer evento SSE que no sea un ping. Hereda `REQUEST_TIMEOUT_MS` cuando está definido. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Ventana adaptativa máxima de preparación para el primer evento en solicitudes de streaming grandes, con uso intensivo de herramientas o razonamiento elevado. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Interruptor de desactivación para la heurística `/goal`. Establezca `false`/`0`/`off` para desactivar por completo la detección: los tiempos de espera de preparación y la recuperación del flujo nunca se incrementan a partir del cuerpo o los encabezados de la solicitud, lo que mitiga la amplificación de tiempos de espera controlada por el cliente. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Ventana máxima de preparación para el primer evento en ejecuciones de agente `/goal` detectadas o solicitudes forzadas mediante `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Habilita automáticamente la recuperación temprana del flujo para ejecuciones de agente `/goal` detectadas. Establezca `false`/`0`/`off` para desactivar la activación específica de objetivos. Esto solo puede AÑADIR recuperación sobre el valor predeterminado del operador; nunca anula una desactivación explícita mediante `STREAM_RECOVERY_ENABLED` o la configuración de la base de datos. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Elimina los eventos SSE no estándar `codex.*` (p. ej., `codex.rate_limits`) que hacen que `responses.stream()` del SDK de OpenAI falle con un error 502. Activado de forma predeterminada (#11014). Establezca `0`/`false`/`no`/`off` para reenviarlos. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(sin definir)_ | Transporte de app-server de Codex de activación opcional. Endpoint WebSocket (`ws://`/`wss://`) de un sidecar local `codex app-server`. Cuando se define junto con un token, las solicitudes de Codex se enrutan mediante JSON-RPC al sidecar en lugar de usar la API HTTP Responses. También se puede definir por conexión mediante `providerSpecificData.codexAppServerUrl`. Utilizado por `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(sin definir)_ | Token de capacidad/bearer en línea presentado al app-server. Sobrescritura por conexión: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(sin definir)_ | Ruta a un archivo que contiene el token de capacidad del app-server (de `codex app-server --ws-token-file`). Se utiliza cuando `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` no está definido. Sobrescritura por conexión: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Directorio de trabajo en el que se ejecuta el turno del app-server. Sobrescritura por conexión: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(sin definir)_ | Política de aprobación transferida al turno del app-server (p. ej., `never`, `on-request`). Sobrescritura por conexión: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(sin definir)_ | Política de sandbox transferida al turno del app-server (p. ej., `read-only`, `workspace-write`, `danger-full-access`). Cuando no está definida, el ejecutor usa `workspace-write` de forma predeterminada (reforzado; anteriormente `danger-full-access`). Sobrescritura por conexión: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Aprueba automáticamente las solicitudes de aprobación propias del app-server (ejecución de comandos/archivos/permisos en el host). Desactivado de forma predeterminada: las solicitudes se rechazan automáticamente; las llamadas a herramientas del arnés no se ven afectadas (se transmiten mediante el canal independiente `item/tool/call`). Acepta `true`/`1`/`yes`. Sobrescritura por conexión: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tiempo para recibir los encabezados de respuesta. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Espera máxima (ms) para el inicio de la respuesta en cada intento directo sin proxy. Cuando se agota el tiempo, se reintenta una vez con un socket nuevo; establece `0` para desactivar el límite y conservar el comportamiento anterior. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Límite máximo (ms) para el intento RETRY con un socket nuevo después de que se agote el tiempo de espera del inicio de la respuesta en un intento con conexión agrupada, como se indicó anteriormente (#13703). Solo se aplica cuando el llamador ya ha adjuntado su propia señal de plazo límite (la cascada resuelta de conexión/modelo/proveedor/`FETCH_TIMEOUT_MS`); esa señal es el límite real y se activa primero en la ruta prevista, por lo que este es un respaldo generoso en lugar de un límite fijo. Sin él, el reintento reutilizaba la misma ventana breve de `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` que el intento agrupado y devolvía un error 504 para modelos de razonamiento en buen estado con un TTFB lento. Nunca puede establecerse por debajo del límite mínimo fijo anterior; cuando el llamador no proporciona ninguna señal de plazo límite, el reintento mantiene sin cambios el límite mínimo fijo. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tiempo para recibir el cuerpo completo de la respuesta. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Tiempo de espera para establecer la conexión TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Tiempo de espera de inactividad del socket keep-alive. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tiempo de espera del proxy de huella TLS (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Limita específicamente el tiempo hasta el primer byte del cuerpo en el transporte de huella TLS de wreq-js; `TLS_CLIENT_TIMEOUT_MS` por sí solo no puede detectar un cuerpo bloqueado, ya que se resuelve en cuanto llegan las cabeceras (#12656). Cuando se agota el tiempo, se cancela el lector de wreq y se recurre al despachador directo/proxy; `0` desactiva el monitor. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Solo para el ejecutor de OpenCode y únicamente mientras esté activado el indicador de funcionalidad `OPENCODE_RESPONSES_STALL_ROTATION` (desactivado de forma predeterminada): limita la espera del primer byte del cuerpo de una respuesta de Responses transmitida en streaming después de sus cabeceras (#13484). Un flujo de Responses se abre con `response.created`, por lo que el silencio más allá de esta ventana indica un bloqueo: la cuenta entra en período de enfriamiento y la solicitud rota una vez a la siguiente cuenta; un segundo bloqueo falla de inmediato. `0` desactiva la protección incluso con el indicador activado. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Tiempo de espera del salto de proxy para las solicitudes del puente `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Dirige el ejecutor de obtención web de Firecrawl a una instancia autoalojada (la clave de API es opcional fuera de la nube). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Tiempo de espera por solicitud para el ejecutor de obtención web de Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Tiempo de espera total de la solicitud del servidor para el puente. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Tiempo para enviar las cabeceras de respuesta mediante el puente. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Tiempo de espera de inactividad keep-alive del puente. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Tiempo de espera del socket sin procesar (0 = desactivado). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Período de gracia tras SIGTERM/SIGINT antes de forzar la salida. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Valor de respaldo utilizado por `src/shared/utils/fetchTimeout.ts` cuando `FETCH_TIMEOUT_MS` no está definido. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Tiempo de espera (ms) para los ajustes preestablecidos `validationRead` y `modelsProbe` en `src/shared/network/safeOutboundFetch.ts`. Auméntalo para endpoints lentos (Cerebras, Cloudflare AI, Groq) a fin de evitar oscilaciones entre los estados activo/error en el panel. Vuelve a 8000 ms para valores no válidos (<1000) o no numéricos. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Tiempo de espera de obtención específico del relé en `open-sse/utils/proxyFetch.ts` (#9158). Un relé bloqueado debe fallar antes que el tiempo de espera del cliente/agente (~30 s), para que los llamadores vean un fallo específico del relé en lugar de un tiempo de espera genérico del servicio ascendente. Está limitado a `29000` para que siempre se active primero. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Retardo compartido entre reintentos para las rutas directas/de relé/de proxy que reintentan una vez en `open-sse/utils/proxyFetch.ts` (#9158). `0` = reintentar inmediatamente. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Tiempo de espera de solicitud nativo de wreq-js (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Margen de gracia para el plazo límite absoluto de JS añadido al tiempo de espera nativo. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Tiempo de espera de solicitud nativo de wreq-js (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Margen de gracia para el plazo límite absoluto de JS añadido al tiempo de espera nativo. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (desactivado) | Añade "Tienes búsqueda web integrada. Responde directamente a las preguntas utilizando los resultados de búsqueda." al mensaje del sistema del llamador (`perplexity-web/protocol.ts`). Desactivado de forma predeterminada: Perplexity realiza búsquedas de todos modos y la frase se filtra en las respuestas como metacomentario para clientes de programación. Establece `1`/`true`/`yes`/`on` para restaurarlo. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Tiempo de espera de solicitud nativo de wreq-js (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Margen de gracia para el plazo límite absoluto de JS añadido al tiempo de espera nativo. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Tiempo de espera de solicitud nativo de wreq-js (`notionTlsClient.ts`); `notion-web` lo aumenta por solicitud a `180000` para generaciones largas. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Margen de gracia para el plazo límite absoluto de JS añadido al tiempo de espera nativo. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Grupo compartido de navegadores Playwright para chats con cookies web respaldados por navegador (`browserPool.ts`); establece `off` para desactivarlo. | +| `OBSCURA_BIN` | `auto-detect` | Ruta al binario `obscura` utilizado como motor principal por el grupo de navegadores y el ejecutor de Cloudflare Playground (`open-sse/services/obscura.ts`); cuando no se establece, se detecta automáticamente desde el PATH del sistema. | +| `OBSCURA_CDP_ENDPOINT` | _(sin establecer)_ | Apunta a una instancia de Obscura que ya esté en ejecución (`http://host:port`) en lugar de iniciar una; el módulo no es propietario de ese proceso (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `random free port` | Puerto explícito para el proceso `obscura serve` iniciado; cuando no se establece, se elige automáticamente un puerto libre (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Hace que una solicitud de chat con cookies web utilice la ruta respaldada por navegador (`browserBackedChat.ts`); usa `1` para habilitarla. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL base para el ejecutor de Kimi Web (Connect-RPC internacional de kimi.ai) (`kimi-web.ts`); modifícala únicamente para endpoints de espejo/proxy. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Endpoint de chat completo para el ejecutor de Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(detectado automáticamente)_ | Ruta a un ejecutable de Chrome/Edge del sistema para el inicio de sesión interactivo de Adobe Firefly en el navegador (`adobeFireflyBrowserLogin.ts`); sustituye la detección automática específica de cada SO. | +| `OMNIROUTE_STANDALONE_DIR` | _salida standalone de .build/_ | Sustitución en tiempo de compilación para el directorio de salida standalone utilizado por el paso de colocación posterior a la compilación (`scripts/build/colocate-standalone.mjs`); herramientas de compilación, no de tiempo de ejecución. | + +Los intentos de destinos combinados heredan el tiempo de espera resuelto de la solicitud upstream (`FETCH_TIMEOUT_MS`, o +`REQUEST_TIMEOUT_MS` cuando proporciona el valor predeterminado de fetch). Establece `targetTimeoutMs` en un combo, +en los valores predeterminados del combo o en una sustitución del proveedor únicamente para acelerar el fallback del combo; los valores superiores al +tiempo de espera upstream actual se limitan al tiempo de espera upstream. + +`comboTimeoutMs` es un presupuesto de tiempo de reloj independiente para todo el combo y todos sus destinos de failover. +Déjalo sin establecer o con el valor `0` para mantener una iteración ilimitada (el mecanismo de detención de bloqueos de 10 minutos +`COMBO_LOOP_SAFETY_TIMEOUT_MS` seguirá aplicándose). Un valor positivo sustituye esa +medida de seguridad para el combo. Mantén `comboTimeoutMs` por encima de `targetTimeoutMs` para que el failover +siga teniendo tiempo después de un primer destino lento. ### Umbrales del disyuntor Ajuste del disyuntor a nivel de proveedor. Los valores predeterminados reflejan los valores escalados utilizados desde v3.6 para más de 500 conexiones. -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ------------------------------------------------------------- | -------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Umbral de fallos consecutivos para proveedores OAuth antes de que se active el disyuntor. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Ventana de restablecimiento (ms) para el disyuntor de proveedores OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Umbral de fallos consecutivos para proveedores con clave de API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Ventana de restablecimiento (ms) para el disyuntor de proveedores con clave de API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Umbral de fallos consecutivos para proveedores locales (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Ventana de restablecimiento (ms) para el disyuntor de proveedores locales. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: número de fallos dentro de la ventana antes de que todo el proveedor OAuth entre en período de espera. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: ventana móvil de recuento de fallos (ms) para proveedores OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: período de espera (ms) una vez alcanzado el umbral del proveedor OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | El proveedor OAuth entra en el estado DEGRADED al alcanzar esta cantidad de fallos. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Multiplicador máximo de escalado de resetTimeout para el proveedor OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | El proveedor OAuth escala después de esta cantidad de ciclos abiertos. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: número de fallos dentro de la ventana antes de que todo el proveedor con clave de API entre en período de espera. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: ventana móvil de recuento de fallos (ms) para proveedores con clave de API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: período de espera (ms) una vez alcanzado el umbral del proveedor con clave de API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | El proveedor con clave de API entra en el estado DEGRADED al alcanzar esta cantidad de fallos. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Multiplicador máximo de escalado de resetTimeout para el proveedor con clave de API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | El proveedor con clave de API escala después de esta cantidad de ciclos abiertos. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: número de fallos antes de que todo el proveedor local entre en período de espera. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: ventana móvil de recuento de fallos (ms) para proveedores locales. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: período de espera (ms) una vez alcanzado el umbral del proveedor local. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Nivel de espera exponencial en el que el proveedor asociado a una fijación de la caché de contexto se considera persistentemente inoperativo y se descarta la fijación para permitir la conmutación por error. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Ventana antioscilación (ms) que tolera períodos de espera transitorios breves antes de descartar una fijación de la caché de contexto. | +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ------------------------------------------------------------- | -------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Umbral de fallos consecutivos para proveedores OAuth antes de que se active el disyuntor. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Ventana de restablecimiento (ms) para el disyuntor de proveedores OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Umbral de fallos consecutivos para proveedores con clave de API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Ventana de restablecimiento (ms) para el disyuntor de proveedores con clave de API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Umbral de fallos consecutivos para proveedores locales (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Ventana de restablecimiento (ms) para el disyuntor de proveedores locales. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: fallos dentro de la ventana antes de que todo el proveedor OAuth entre en periodo de espera. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: ventana móvil de recuento de fallos (ms) para proveedores OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: periodo de espera (ms) una vez alcanzado el umbral del proveedor OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | El proveedor OAuth entra en estado DEGRADED al alcanzar esta cantidad de fallos. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Multiplicador máximo de escalamiento de resetTimeout para el proveedor OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | El proveedor OAuth aumenta el escalamiento después de esta cantidad de ciclos abiertos. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: fallos dentro de la ventana antes de que todo el proveedor con clave de API entre en periodo de espera. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: ventana móvil de recuento de fallos (ms) para proveedores con clave de API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: periodo de espera (ms) una vez alcanzado el umbral del proveedor con clave de API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | El proveedor con clave de API entra en estado DEGRADED al alcanzar esta cantidad de fallos. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Multiplicador máximo de escalamiento de resetTimeout para el proveedor con clave de API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | El proveedor con clave de API aumenta el escalamiento después de esta cantidad de ciclos abiertos. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: fallos antes de que todo el proveedor local entre en periodo de espera. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: ventana móvil de recuento de fallos (ms) para proveedores locales. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Disyuntor a nivel de proveedor: periodo de espera (ms) una vez alcanzado el umbral del proveedor local. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Profundidad de espera exponencial en la que el proveedor de una fijación de la caché de contexto se considera persistentemente inactivo y la fijación se descarta para permitir la conmutación por error. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Ventana antioscilación (ms) que tolera breves periodos de espera transitorios antes de descartar una fijación de la caché de contexto. | ### Escenarios -| Escenario | Configuración | -| ------------------------------------------ | -------------------------------------------------------- | -| **Generación de código de larga duración** | `REQUEST_TIMEOUT_MS=900000` (15 min) | -| **Limitar la duración total del flujo** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | -| **Fallo rápido para la API de producción** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Modelos de razonamiento extendido** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min entre fragmentos) | +| Escenario | Configuración | +| --------------------------------------- | -------------------------------------------------------- | +| **Generación de código prolongada** | `REQUEST_TIMEOUT_MS=900000` (15 min) | +| **Limitar la duración total del flujo** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | +| **Fallo rápido para API de producción** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Modelos con razonamiento extendido** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min entre fragmentos) | --- @@ -1110,102 +1119,103 @@ normal de escritorio. --- -## 21. Estado del proxy - -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Tiempo de espera de la comprobación de estado con fallo rápido. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Ventana de tiempo (horas) para calcular la latencia media de los proxies candidatos en la estrategia de grupo optimizada para la latencia. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL de la caché de resultados de la comprobación de estado. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL de la caché para sondeos fallidos del estado del proxy. Manténgalo más corto que `PROXY_HEALTH_CACHE_TTL_MS` para que los tiempos de espera transitorios del proxy bajo alta concurrencia se vuelvan a intentar rápidamente sin deshabilitar el fallo rápido para proxies realmente inactivos. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Establézcalo en `false` para deshabilitar el programador de comprobación de estado de proxies en segundo plano que sondea periódicamente los proxies registrados. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Intervalo de barrido del programador de comprobación de estado en segundo plano, en ms (mínimo `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Destino del sondeo de accesibilidad utilizado por el programador y el endpoint `/api/settings/proxies/auto-test`. Apúntelo a una URL interna o autoalojada para evitar el destino público predeterminado. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Sondeos iniciados simultáneamente por lote, compartidos por el programador y el endpoint `/api/settings/proxies/auto-test`. Se redondea hacia abajo a un mínimo de 1 y se limita a 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Retraso en ms entre dos salidas de sondeo dentro de un lote. Sin él, todo el lote sale al mismo tiempo y una IP de salida compartida puede activar la limitación de frecuencia del destino. Establézcalo en `0` para deshabilitar el espaciado; limitado a 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Establézcalo en "false" para dejar de sondear el host real del proveedor asignado a un proxy (`GET /models`, sin clave de API) y utilizar siempre `PROXY_HEALTH_TEST_URL` en su lugar. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Cuando es `false` (valor predeterminado), los sondeos automatizados de accesibilidad (el programador + el botón "Probar todos" de `/api/settings/proxies/auto-test`) son **de solo lectura** y nunca modifican el estado de un proxy: solo el operador lo establece como activo/inactivo, por lo que un sondeo inestable no puede dejar inutilizable un proxy asignado (#6246). Establézcalo en `true` para restaurar el comportamiento heredado de probar y establecer. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Indicador de funcionalidad opcional (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); una sobrescritura de la base de datos del panel tiene prioridad). `true` (o `1`, `yes`) muestra en el panel la observación de salida de solo lectura bajo un grupo de proxies (IP de salida distintas, conexiones y la cantidad máxima observada detrás de una IP durante las últimas 24 h, a partir del registro del proxy). Nunca se utiliza para el enrutamiento. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Establézcalo en `true` para permitir que el programador elimine automáticamente los proxies tras varios fallos consecutivos. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Número de fallos consecutivos antes de que el programador elimine automáticamente un proxy (cuando `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Establézcalo en `true` para permitir que el programador deshabilite de forma reversible (estado `dead`, sin eliminarlo nunca) un proxy tras varios fallos consecutivos, en lugar de eliminarlo. Alternativa no destructiva a `PROXY_AUTO_REMOVE`: el proxy se excluye inmediatamente de la resolución de grupos/rotación (el filtro de estado activo utilizado por la resolución de grupos de ámbito ya lo excluye) y se reactiva automáticamente cuando vuelve a superar los sondeos. Comparte el umbral `PROXY_AUTO_REMOVE_AFTER`. Si ambos indicadores son `true`, `PROXY_AUTO_REMOVE` tiene prioridad. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Permite que los flujos de OAuth y de validación de proveedores omitan un proxy fijado y se conecten directamente cuando fallen las comprobaciones previas de accesibilidad del proxy. La precedencia efectiva es: sobrescritura de la base de datos de indicadores de funcionalidad > variable de entorno > valor predeterminado. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `open-sse/services/rateLimitManager.ts` | Tiempo máximo de espera ante un 429 antes de que la solicitud falle. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Límite de tiempo durante el que una solicitud admitida puede permanecer en ejecución antes de que caduque su reserva de límite de frecuencia; está desacoplado del margen de espera en cola para que un inicio de obtención lento en pasarelas no incrementales no agote el tiempo de espera (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deshabilitado) | `open-sse/services/rateLimitManager.ts` | Límite de admisión a la cola: rechaza con un 429 `queue_full` cuando ya haya esta cantidad de solicitudes en cola. `0` = sin límite (valor predeterminado). | -| `RATE_LIMIT_AUTO_ENABLE` | _(sin establecer)_ | `open-sse/services/rateLimitManager.ts` | Fuerza la activación o desactivación de la red de seguridad de habilitación automática del límite de frecuencia, independientemente de la configuración persistida del panel. Acepta `true`/`1`/`on` para forzar la activación y `false`/`0`/`off` para forzar la desactivación. | -| `PROVIDER_COOLDOWN_ENABLED` | _(sin establecer → desactivado)_ | `open-sse/services/providerCooldownTracker.ts` | Seguimiento global opcional, entre solicitudes, del período de espera de proveedores/conexiones. DESACTIVADO de forma predeterminada (se solapa con el período de espera de conexiones/el disyuntor de proveedores). Acepta `true`/`1`/`on` para habilitarlo. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Período de espera mínimo (ms) antes de volver a intentar un proveedor o una conexión que haya fallado. Se escala exponencialmente con los fallos consecutivos. Solo se utiliza cuando `PROVIDER_COOLDOWN_ENABLED` está habilitado. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Límite máximo del período de espera (ms) antes de volver a intentar un proveedor o una conexión que haya fallado, independientemente de otras condiciones. Solo se utiliza cuando `PROVIDER_COOLDOWN_ENABLED` está habilitado. | -| `STREAM_RECOVERY_ENABLED` | _(sin establecer → desactivado)_ | `src/lib/resilience/settings.ts` (inicialización) → `open-sse/services/streamRecovery.ts` (lógica) | **Qué:** recuperación transparente de flujos ascendentes truncados (adaptación de free-claude-code). Retiene la ventana SSE inicial hasta `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), de modo que un corte _previo a la confirmación_ —que se produce antes de que cualquier byte llegue al cliente— se vuelva a abrir y se reintente de forma invisible. **Cuándo habilitarlo:** servicios ascendentes inestables que truncan frecuentemente a 0 bytes al inicio del flujo; déjelo DESACTIVADO si no puede permitirse hasta 750 ms adicionales en el tiempo hasta el primer token de cada flujo. Acepta `true`/`1`/`on`. Inicializa la configuración persistida de resiliencia; una vez establecida, la configuración del panel tiene prioridad. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(sin establecer → desactivado)_ | `src/lib/resilience/settings.ts` (inicialización) → `open-sse/services/streamRecovery.ts` (lógica) | **Qué:** continuación a mitad del flujo (Fase 4.4): tras un truncamiento _posterior a la confirmación_ (los bytes ya llegaron al cliente), vuelve a realizar la solicitud con el texto parcial como contenido previo del asistente y concatena el sufijo que falta. Solo para flujos compatibles con OpenAI de texto sin formato; nunca se activa mientras hay una llamada a herramienta en curso. **Cuándo habilitarlo:** generaciones largas que se interrumpen a mitad de la respuesta y en las que se acepta que la parte final recuperada llegue como una sola ráfaga en lugar de token por token. Es independiente de `STREAM_RECOVERY_ENABLED` (perfil de riesgo diferente). Acepta `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(sin establecer → desactivado)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Supervisor opcional de salida útil del flujo activo. Detecta los flujos que siguen enviando fragmentos, pero permanecen por debajo de la tasa configurada de salida del asistente; los latidos, los eventos de uso, los deltas vacíos y las fases de herramientas/razonamiento no se consideran progreso. Es independiente de los tiempos de espera por inactividad y de los plazos máximos. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Período de gracia antes de evaluar el rendimiento, limitado a 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Ventana móvil de salida útil, limitada a 1000–600000 ms; se requiere una ventana completa antes de cancelar. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Tasa mínima de bytes UTF-8 de salida del asistente (aproximación conservadora de tokens), limitada a 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Muestra mínima distinta de cero de salida útil que se considera medible, limitada a 1–1000000 bytes. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Intervalo escalonado (ms) entre las comprobaciones de estado de los tokens de proveedores al inicio. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Fluctuación aleatoria mínima (ms) añadida a `HEALTHCHECK_STAGGER_MS` entre las comprobaciones de estado de los tokens de proveedores para evitar ráfagas (incidencia #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Fluctuación aleatoria máxima (ms) añadida a `HEALTHCHECK_STAGGER_MS` entre las comprobaciones de estado de los tokens de proveedores para evitar ráfagas (incidencia #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Tamaño del lote de comprobaciones simultáneas para el barrido de comprobación de estado de tokens al inicio; los valores mayores comprueban más conexiones en paralelo y los valores menores reducen la carga en ráfagas (incidencia #7875, regresión de #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Número de reintentos automáticos ante respuestas de período de espera específicas del modelo antes de devolver un error al cliente. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Intervalo máximo de espera exponencial (segundos) entre reintentos por período de espera. Limitado por este valor independientemente de `Retry-After` del servicio ascendente. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL del proxy de ahorro de tokens Headroom. El ciclo de vida del panel (`api/headroom/*`) inicia de forma predeterminada una CLI `headroom-ai` local en la interfaz de bucle invertido; sobrescríbala únicamente para apuntar a un proxy sidecar externo de Docker. | - -### Constantes de ajuste de recuperación de streams - -El comportamiento de retención durante la recuperación se ajusta mediante constantes codificadas directamente en -`open-sse/config/constants.ts` (`STREAM_RECOVERY`), que se muestran aquí como referencia — -modificarlas requiere editar el código, no una variable de entorno: +## 21. Estado de los proxies + +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Tiempo de espera de la comprobación de estado con fallo rápido. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Ventana temporal (en horas) para calcular la latencia media de los proxies candidatos en la estrategia de grupo optimizada para la latencia. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL de la caché de resultados de las comprobaciones de estado. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL de la caché para las comprobaciones de estado de proxies fallidas. Manténgalo más corto que `PROXY_HEALTH_CACHE_TTL_MS` para que los tiempos de espera transitorios de los proxies bajo alta concurrencia se reintenten rápidamente sin deshabilitar el fallo rápido para los proxies realmente inactivos. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Establézcalo en `false` para deshabilitar el programador de comprobaciones de estado de proxies en segundo plano que comprueba periódicamente los proxies registrados. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Intervalo de barrido del programador de comprobaciones de estado en segundo plano, en ms (mínimo: `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Destino de la sonda de conectividad utilizado por el planificador y el endpoint `/api/settings/proxies/auto-test`. Configúrelo con una URL interna o autoalojada para evitar el valor público predeterminado. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Número de sondas iniciadas simultáneamente por lote, compartido por el planificador y el endpoint `/api/settings/proxies/auto-test`. Se establece un mínimo de 1 y un máximo de 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Retraso en ms entre dos salidas de sondas dentro de un lote. Sin él, todo el lote sale al mismo tiempo y una IP de salida compartida puede activar el límite de solicitudes del destino. Establézcalo en `0` para desactivar el espaciado; el máximo es 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Establézcalo en "false" para dejar de sondear el host real del proveedor asignado a un proxy (`GET /models`, sin clave de API) y utilizar siempre `PROXY_HEALTH_TEST_URL` en su lugar. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Cuando es `false` (valor predeterminado), las sondas automatizadas de conectividad (el planificador y el botón "Probar todo" de `/api/settings/proxies/auto-test`) son **de solo lectura** y nunca modifican el estado de un proxy: solo el operador lo establece como activo o inactivo, por lo que una sonda inestable no puede dejar inutilizable un proxy asignado (#6246). Establézcalo en `true` para restaurar el comportamiento anterior de probar y establecer el estado. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Indicador de funcionalidad opcional (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); una configuración de la base de datos del panel tiene prioridad). `true` (o `1`, `yes`) muestra en el panel la observación de salida de solo lectura bajo un grupo de proxies (IP de salida distintas, conexiones y el mayor número observado detrás de una sola IP durante las últimas 24 h, a partir del registro del proxy). Nunca se utiliza para el enrutamiento. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Establézcalo en `true` para permitir que el planificador elimine automáticamente los proxies después de varios fallos consecutivos. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Número de fallos consecutivos antes de que el planificador elimine automáticamente un proxy (cuando `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Establézcalo en `true` para permitir que el planificador deshabilite de forma no definitiva (estado `dead`, sin eliminarlo nunca) un proxy tras varios fallos consecutivos, en lugar de eliminarlo. Es una alternativa no destructiva a `PROXY_AUTO_REMOVE`: el proxy deja de participar inmediatamente en la resolución de grupos/rotación (el filtro por estado activo que utiliza la resolución de grupos por ámbito ya lo excluye) y se reactiva automáticamente cuando vuelve a superar las comprobaciones. Comparte el umbral `PROXY_AUTO_REMOVE_AFTER`. Si ambos indicadores son `true`, prevalece `PROXY_AUTO_REMOVE`. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Permite que los flujos de OAuth y de validación de proveedores omitan un proxy fijado y se conecten directamente cuando fallen las comprobaciones previas de accesibilidad del proxy. La precedencia efectiva es: anulación de la base de datos de indicadores de funciones > variable de entorno > valor predeterminado. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `src/lib/resilience/settings.ts` | Presupuesto predeterminado de **espera en cola**: cuánto tiempo puede esperar una solicitud para obtener una ranura del proveedor y permanecer en cola antes de ser rechazada, sin llegar nunca al servicio ascendente. El temporizador se borra una vez que el trabajo comienza a ejecutarse; la ejecución está limitada por separado mediante `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. La variable de entorno solo establece el valor predeterminado: un valor persistente `resilienceSettings.requestQueue.maxWaitMs` y, después, un valor por conexión `rateLimitOverrides.maxWaitMs` tienen prioridad sobre él, en ese orden. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Límite máximo del tiempo que una solicitud admitida puede permanecer en ejecución antes de que caduque su reserva del límite de tasa; está desacoplado del presupuesto de espera en cola para que un inicio lento de la recuperación en puertas de enlace no incrementales no agote el tiempo de espera (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (deshabilitado) | `open-sse/services/rateLimitManager.ts` | Límite de admisión de la cola: rechaza con un error 429 `queue_full` cuando ya hay esta cantidad de solicitudes en cola. `0` = sin límite (valor predeterminado). | +| `RATE_LIMIT_AUTO_ENABLE` | _(sin establecer)_ | `open-sse/services/rateLimitManager.ts` | Fuerza la activación o desactivación de la red de seguridad de activación automática del límite de tasa, independientemente de la configuración persistida del panel de control. Acepta `true`/`1`/`on` para forzar la activación y `false`/`0`/`off` para forzar la desactivación. | +| `PROVIDER_COOLDOWN_ENABLED` | _(sin establecer → desactivado)_ | `open-sse/services/providerCooldownTracker.ts` | Seguimiento global y opcional del período de espera de proveedores/conexiones entre solicitudes. Está DESACTIVADO de forma predeterminada (se solapa con el período de espera de conexión y el disyuntor del proveedor). Acepta `true`/`1`/`on` para activarlo. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Período de espera mínimo (ms) antes de volver a intentar usar un proveedor o una conexión que haya fallado. Aumenta exponencialmente con los fallos consecutivos. Solo se utiliza cuando `PROVIDER_COOLDOWN_ENABLED` está activado. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Límite máximo del periodo de espera (ms) antes de volver a intentar usar un proveedor o una conexión que haya fallado. Solo se utiliza cuando `PROVIDER_COOLDOWN_ENABLED` está habilitado. | +| `STREAM_RECOVERY_ENABLED` | _(sin establecer → desactivado)_ | `src/lib/resilience/settings.ts` (valor inicial) → `open-sse/services/streamRecovery.ts` (lógica) | **Qué hace:** recuperación transparente de flujos ascendentes truncados (adaptación de free-claude-code). Retiene la ventana SSE inicial durante un máximo de `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), de modo que un corte _previo a la confirmación_ —uno que ocurre antes de que cualquier byte llegue al cliente— se vuelva a abrir y se reintente de forma invisible. **Cuándo habilitarlo:** servicios ascendentes inestables que suelen truncar el flujo con 0 bytes al inicio; déjelo DESACTIVADO si no puede permitirse hasta 750 ms adicionales de tiempo hasta el primer token en cada flujo. Acepta `true`/`1`/`on`. Inicializa el ajuste persistente de Resiliencia; una vez configurado, prevalece el ajuste del Dashboard. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(sin establecer → desactivado)_ | `src/lib/resilience/settings.ts` (valor inicial) → `open-sse/services/streamRecovery.ts` (lógica) | **Qué hace:** continuación a mitad del flujo (Fase 4.4): tras un truncamiento _posterior a la confirmación_ (los bytes ya llegaron al cliente), vuelve a realizar la solicitud usando el texto parcial como prellenado del asistente y concatena el sufijo que falta. Solo para flujos de texto sin formato compatibles con OpenAI; nunca se activa si hay una llamada a una herramienta en curso. **Cuándo habilitarlo:** generaciones largas que se interrumpen a mitad de la respuesta, si acepta que la parte final recuperada llegue en una sola ráfaga en lugar de token por token. Es independiente de `STREAM_RECOVERY_ENABLED` (perfil de riesgo diferente). Acepta `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(sin establecer → desactivado)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Supervisor opcional de salida útil para flujos activos. Detecta flujos que continúan enviando fragmentos, pero permanecen por debajo de la tasa configurada de salida del asistente; las señales de actividad, los eventos de uso, los deltas vacíos y las fases de herramientas o razonamiento no se interpretan erróneamente como progreso. Es independiente de los tiempos de espera por inactividad y de los plazos máximos. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Periodo de gracia antes de evaluar el rendimiento, limitado a 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Ventana móvil de salida útil, limitada a 1000–600000 ms; debe completarse una ventana antes de cancelar. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Tasa mínima de bytes UTF-8 de salida del asistente (aproximación conservadora de tokens), limitada a 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Muestra mínima distinta de cero de salida útil que se considera medible, limitada a 1–1000000 bytes. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Intervalo escalonado (ms) entre las comprobaciones de estado de los tokens de los proveedores al iniciar. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Variación aleatoria mínima (ms) añadida a `HEALTHCHECK_STAGGER_MS` entre las comprobaciones de estado de los tokens de los proveedores para evitar ráfagas (Incidencia #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Variación aleatoria máxima (ms) añadida a `HEALTHCHECK_STAGGER_MS` entre las comprobaciones de estado de los tokens de los proveedores para evitar ráfagas (Incidencia #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Tamaño del lote de comprobaciones simultáneas para el barrido de comprobación del estado de los tokens al iniciar; los valores más altos comprueban más conexiones en paralelo, mientras que los valores más bajos reducen los picos de carga (incidencia #7875, regresión de #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Número de reintentos automáticos ante respuestas de tiempo de espera específicas del modelo antes de devolver un error al cliente. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Intervalo máximo de espera exponencial (segundos) entre reintentos tras un tiempo de espera. Se limita a este valor independientemente del valor de `Retry-After` del servicio de origen. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL del proxy de ahorro de tokens Headroom. El ciclo de vida del panel (`api/headroom/*`) inicia de forma predeterminada una CLI local `headroom-ai` en la interfaz de bucle invertido; sobrescríbala únicamente para apuntar a un proxy sidecar externo de Docker. | + +### Constantes de ajuste de la recuperación de flujos + +El comportamiento de retención para la recuperación se ajusta mediante constantes fijas en +`open-sse/config/constants.ts` (`STREAM_RECOVERY`), que se muestran aquí como referencia; +cambiarlas requiere modificar el código, no una variable de entorno: - `STREAM_RECOVERY.HOLDBACK_MS = 750` — cuánto tiempo se retiene la ventana SSE inicial - para que un truncamiento temprano pueda volver a intentarse antes de enviar cualquier byte al cliente. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — límite máximo estricto de la ventana retenida; se confirma - (vaciado + transferencia directa) en cuanto se acumula esta cantidad de bytes, independientemente del temporizador. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — número máximo de reaperturas transparentes del stream ascendente - mientras la retención aún no se haya confirmado. - -> **Límite de tasa por ventana deslizante y proveedor (sin variable de entorno):** el mecanismo de _respaldo_ del límite de tasa -> por ventana deslizante y proveedor, portado desde FCC, existe en el código + para que un truncamiento prematuro pueda volver a intentarse antes de enviar cualquier byte al cliente. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — límite estricto de la ventana retenida; se confirma + (vaciado + transmisión directa) en cuanto se acumula esta cantidad de bytes, independientemente del temporizador. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — número máximo de reaperturas transparentes del flujo + de origen mientras la retención aún no se haya confirmado. + +> **Límite de tasa por proveedor con ventana deslizante (sin variable de entorno):** el mecanismo +> de respaldo del límite de tasa por proveedor con ventana deslizante, portado de FCC, existe en el código > (`open-sse/services/providerDefaultRateLimit.ts`, conectado mediante > `open-sse/services/rateLimitManager.ts`), pero se distribuye con un **mapa predeterminado vacío** -> y actualmente **no tiene ninguna variable de entorno para el operador** — solo se habilita mediante un hook de pruebas / -> una modificación del código. Intencionadamente, no figura en la tabla anterior. El limitador de retransmisión por `(token, IP)` -> que _sí_ dispone de un parámetro de configuración es `RELAY_IP_PER_MINUTE` (§3 Red y puertos). +> y actualmente **no tiene ninguna variable de entorno para operadores**; solo se habilita mediante un enlace de prueba / +> una modificación del código. Intencionadamente, no figura en la tabla anterior. El limitador de retransmisión por +> `(token, IP)` que _sí_ dispone de un parámetro de configuración es `RELAY_IP_PER_MINUTE` (§3 Red y puertos). --- ## 22. Depuración > [!CAUTION] -> Estas variables producen una **salida detallada** y pueden filtrar datos sensibles. **Nunca las habilite en producción.** - -| Variable | Valor predeterminado | Archivo de origen | Descripción | -| ------------------------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(sin definir)_ | `open-sse/executors/cursor.ts` | Establezca `1` para habilitar los registros detallados del ejecutor de Cursor (fragmentos SSE decodificados, etc.). | -| `CURSOR_STREAM_DEBUG` | _(sin definir)_ | `open-sse/executors/cursor.ts` | Alias de `CURSOR_DEBUG` compatible con versiones anteriores. | -| `CURSOR_DUMP_FILE` | _(sin definir)_ | `open-sse/executors/cursor.ts` | Ruta de archivo opcional que recibe los fragmentos sin procesar y decodificados de Cursor cuando `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Tiempo de espera por inactividad del flujo (ms) para el ejecutor de Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Período de gracia (ms) después de un terminador flexible composer kv_after_text cuando quedan bytes en el búfer; permite que una llamada final a la herramienta exec_mcp tenga tiempo para completar su trama. | -| `CURSOR_TOOL_DIRECTIVE` | habilitada (`!== "0"`) | `open-sse/executors/cursor.ts` | Directiva de confirmación de herramientas que hace que composer-2.5 emita llamadas a herramientas de forma fiable. Establezca `0` para deshabilitarla. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(sin definir)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Texto del prompt del sistema definido por el operador que se añade al mensaje del sistema DESPUÉS de la traducción (inyección posterior a la traducción), llegando a las rutas codex/Responses y `/v1/messages`. También se utiliza como prefijo de directiva que se elimina de los bloques de preámbulo del sistema repetidos. Déjelo sin definir para deshabilitarlo. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Tiempo de espera de obtención por imagen (ms) para la entrada de visión remota `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(detectado)_ | `open-sse/utils/cursorVersionDetector.ts` | Sobrescribe la búsqueda de la base de datos de estado del IDE Cursor utilizada para detectar la versión del IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(detectar / fijar)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ID de compilación de la CLI del agente (`YYYY.MM.DD-`) para `x-cursor-client-version: cli-…` en Agent Run. | -| `CURSOR_AGENT_BIN` | _(sin definir)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ruta al binario de Cursor Agent utilizado para generar imágenes. Si no se define, el controlador utiliza `providerSpecificData.agentBin` y, después, PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Tiempo total por imagen (ms) para los trabajos de imagen de Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Límite de concurrencia de puestos compartidos para los trabajos de imagen de Cursor. | -| `CURSOR_IMG_MODEL` | solicitud / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sobrescribe `--model` de la CLI de Cursor para los trabajos de imagen. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Intervalo de consulta de resultados (ms) de generación de imágenes de UC (uncensored.com). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Tiempo total de espera de consulta de resultados (ms) para la generación de imágenes de UC. | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Intervalo de consulta de resultados (ms) de generación de vídeos de UC (uncensored.com). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Tiempo total de espera de consulta de resultados (ms) para la generación de vídeos de UC. | -| `CURSOR_DATA_DIR` | _(detectado)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Sobrescribe el directorio de datos de la CLI de Cursor Agent (`…/versions/`); es la misma variable que utiliza el agente oficial. | -| `CURSOR_TOKEN` | _(sin definir)_ | `scripts/ad-hoc/cursor-tap.cjs` | Token bearer directo de Cursor utilizado por las herramientas de desarrollo. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | deshabilitado (activación mediante `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Registra indicadores de tipo y longitud del contenido para cargas útiles de chat grandes cuando se establece `"1"`. Está desactivado de forma predeterminada para reducir el ruido de los registros. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(sin definir)_ | `open-sse/handlers/responseTranslator.ts` | Establezca `true` para registrar los detalles de traducción de SSE→JSON de la API Responses. | -| `DEBUG_CLAUDE_NONSTREAM` | _(sin definir)_ | `open-sse/handlers/responseTranslator.ts` | Establezca `true` para mostrar fragmentos textContent vacíos en la ruta de traducción de respuestas de Claude (solo para depuración). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(sin definir)_ | Infraestructura de pruebas E2E | Establezca `true` para habilitar el modo de prueba E2E (autenticación menos restrictiva, enlaces de prueba). | +> Estas variables producen una **salida detallada** y pueden filtrar datos confidenciales. **Nunca las habilite en producción.** + +| Variable | Valor predeterminado | Archivo de origen | Descripción | +| ------------------------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(sin definir)_ | `open-sse/executors/cursor.ts` | Establezca `1` para habilitar los registros detallados del ejecutor de Cursor (fragmentos SSE decodificados, etc.). | +| `CURSOR_STREAM_DEBUG` | _(sin definir)_ | `open-sse/executors/cursor.ts` | Alias de `CURSOR_DEBUG` compatible con versiones anteriores. | +| `CURSOR_DUMP_FILE` | _(sin definir)_ | `open-sse/executors/cursor.ts` | Ruta de archivo opcional que recibe los fragmentos sin procesar y decodificados de Cursor cuando `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Tiempo de espera por inactividad del flujo (ms) para el ejecutor de Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Período de gracia (ms) después de un terminador flexible `kv_after_text` del compositor cuando quedan bytes en el búfer; permite que una llamada de herramienta `exec_mcp` posterior tenga tiempo para completar su trama. | +| `CURSOR_TOOL_DIRECTIVE` | habilitada (`!== "0"`) | `open-sse/executors/cursor.ts` | Directiva de confirmación de herramientas que hace que composer-2.5 emita llamadas de herramientas de forma fiable. Establezca `0` para deshabilitarla. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(sin definir)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Texto del mensaje del sistema definido por el operador que se añade al mensaje del sistema DESPUÉS de la traducción (inyección posterior a la traducción), llegando a las rutas de codex/Responses y `/v1/messages`. También se utiliza como prefijo de directiva que se elimina de los bloques de preámbulo del sistema repetidos. Déjelo sin definir para deshabilitarlo. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (desactivado) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Establezca `1` para eliminar los bloques de preámbulo del mensaje del sistema repetidos al inicio de un flujo openai→claude. Está desactivado de forma predeterminada: las heurísticas están diseñadas para prosa en inglés y modifican la carga útil de la respuesta, por lo que se perdería una respuesta que comenzara legítimamente con una sección de ese tipo. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Tiempo de espera por imagen (ms) para obtener entradas visuales remotas de `image_url`. | +| `CURSOR_STATE_DB_PATH` | _(detectado)_ | `open-sse/utils/cursorVersionDetector.ts` | Sustituye la búsqueda de la base de datos de estado del IDE Cursor utilizada para detectar la versión del IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(detectar / fijar)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Id. de compilación de Agent CLI (`YYYY.MM.DD-`) para `x-cursor-client-version: cli-…` en Agent Run. | +| `CURSOR_AGENT_BIN` | _(sin definir)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ruta al binario de Cursor Agent utilizado para generar imágenes. Si no se define, el controlador utiliza `providerSpecificData.agentBin` y después PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Tiempo máximo por imagen (ms) para los trabajos de imágenes de Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Límite de concurrencia del puesto compartido para los trabajos de imágenes de Cursor. | +| `CURSOR_IMG_MODEL` | solicitud / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sustituye el valor `--model` de la CLI de Cursor para los trabajos de imágenes. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Frecuencia de consulta de resultados (ms) de generación de imágenes de UC (uncensored.com). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Tiempo máximo de consulta de resultados (ms) de generación de imágenes de UC. | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Frecuencia de consulta de resultados (ms) de generación de vídeos de UC (uncensored.com). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Tiempo máximo de consulta de resultados (ms) de generación de vídeos de UC. | +| `CURSOR_DATA_DIR` | _(detectado)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Sustituye el directorio de datos de Cursor Agent CLI (`…/versions/`); es la misma variable que utiliza el agente oficial. | +| `CURSOR_TOKEN` | _(sin definir)_ | `scripts/ad-hoc/cursor-tap.cjs` | Token de portador directo de Cursor utilizado por las herramientas de desarrollo. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | deshabilitado (activación mediante `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Registra marcadores de tipo y longitud del contenido para cargas útiles de chat grandes cuando se establece `"1"`. Está desactivado de forma predeterminada para reducir el ruido de los registros. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(sin definir)_ | `open-sse/handlers/responseTranslator.ts` | Establezca `true` para registrar los detalles de la traducción SSE→JSON de Responses API. | +| `DEBUG_CLAUDE_NONSTREAM` | _(sin definir)_ | `open-sse/handlers/responseTranslator.ts` | Establezca `true` para mostrar fragmentos `textContent` vacíos en la ruta de traducción de respuestas de Claude (solo para depuración). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(sin definir)_ | Infraestructura de pruebas E2E | Establezca `true` para habilitar el modo de pruebas E2E (autenticación relajada, enlaces de prueba). | --- @@ -1223,7 +1233,7 @@ Permite a los usuarios informar de problemas directamente desde el panel de cont ## Escenarios de despliegue -Para obtener orientación de SRE sobre el backend de retransmisión (comportamiento de ts/bifrost/auto, ubicación de 9router frente a CLIProxyAPI y estrategia de respaldo para alto rendimiento), consulta [Estrategia del backend de retransmisión](/docs/reference/RELAY_BACKEND_STRATEGY.md). +Para obtener orientación de SRE sobre el backend de retransmisión (comportamiento de ts/bifrost/auto, ubicación de 9router frente a CLIProxyAPI y estrategia de respaldo para alto rendimiento), consulte [Estrategia del backend de retransmisión](/docs/reference/RELAY_BACKEND_STRATEGY.md). ### Desarrollo local mínimo diff --git a/docs/i18n/es/docs/reference/FEATURE_FLAGS.md b/docs/i18n/es/docs/reference/FEATURE_FLAGS.md index ba95ef677374..ee71e9720533 100644 --- a/docs/i18n/es/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/es/docs/reference/FEATURE_FLAGS.md @@ -44,124 +44,126 @@ Un indicador booleano se considera **habilitado** cuando su valor efectivo es `" ## Catálogo de indicadores -72 indicadores distribuidos en 6 categorías. **Predeterminado** es el valor predeterminado de la definición, es decir, el valor -utilizado cuando no existe ninguna anulación en la BD ni ninguna variable de entorno. +74 indicadores en 6 categorías. **Predeterminado** es el valor predeterminado de la definición, es decir, el valor +utilizado cuando no existe una anulación en la base de datos ni una variable de entorno. ### Seguridad (10) -| Clave | Tipo | Predeterminado | Descripción | -| --------------------------------------- | ----------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | booleano | `false` | Exige una clave de API para todas las solicitudes entrantes. | -| `INPUT_SANITIZER_ENABLED` | booleano | `true` | Habilita la sanitización de las entradas para todas las solicitudes. | -| `INJECTION_GUARD_MODE` | enumeración | `off` | Modo de protección contra la inyección de instrucciones. Valores: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | booleano | `false` | Censura la PII de las solicitudes (independientemente de `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | booleano | `false` | Sanitiza la PII de las respuestas del proveedor. | -| `PII_RESPONSE_SANITIZATION_MODE` | enumeración | `redact` | Modo de sanitización de PII en las respuestas. Valores: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | booleano | `true` | Bloquea las solicitudes salientes dirigidas a rangos de IP privados o internos. | -| `ALLOW_API_KEY_REVEAL` | booleano | `false` | Permite que los usuarios autenticados del panel revelen las claves de API almacenadas, en lugar de ver únicamente valores enmascarados. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | booleano | `false` | Incluye el prefijo de la cuenta en las líneas del registro AUTH (p. ej., "Usando la cuenta de : abc12345..."). Está deshabilitado de forma predeterminada para que los identificadores de cuenta se censuren en los registros de procesos compartidos o multiinquilino. Es independiente del modo de depuración; cambiar dicho modo no revela esta información. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | booleano | `false` | Cuando OIDC está habilitado, deshabilita el inicio de sesión con contraseña para que los usuarios solo puedan autenticarse mediante el inicio de sesión único de OIDC. Cuando está deshabilitado (valor predeterminado), están disponibles tanto el inicio de sesión con contraseña como OIDC. | - -### Red (15) - -| Clave | Tipo | Predeterminado | Reinicio | Descripción | -| ----------------------------------------------- | ------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Habilita el modo de ocultación de la huella digital TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Permite que las rutas /v1/audio/* utilicen nodos de proveedores compatibles con OpenAI alojados fuera de localhost. Desactivado de forma predeterminada: enrutar el audio a un host remoto cambia la identidad de salida y debe ser una decisión explícita del operador. Los nodos de loopback siempre están permitidos y no se ven afectados. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Cuando no hay ningún proxy asignado a una conexión, selecciona automáticamente el primer proxy operativo del registro. Desactivado de forma predeterminada (de lo contrario, cualquier proxy del registro se convierte en una alternativa global — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Permite que los flujos de OAuth y de validación de proveedores omitan un proxy fijado y se conecten directamente cuando fallen las comprobaciones previas de accesibilidad del proxy. Desactivado de forma predeterminada porque esto puede cambiar la IP de salida. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Ante una excepción de red (tiempo de espera agotado, conexión rechazada/restablecida) en un ejecutor de rotación multicuenta, cuando la cuenta que falla no tiene un proxy dedicado, aplica un breve período de espera y omite las demás cuentas sin proxy durante el resto de la solicitud, en lugar de reintentar cada una. Activado de forma predeterminada (seguro: no cambia la IP de salida; solo reduce el riesgo de latencia/período de espera en cuentas con salida compartida). Desactívelo para restaurar la propagación inmediata tras la primera excepción de una cuenta sin proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Los grupos de proxies y la rotación por cuenta de opencode dejan de volver a proporcionar un proxy que acaba de fallar (sondeo TCP rechazado o un 429 recibido a través de él) durante un período por proceso que se duplica con cada repetición, hasta alcanzar un límite. No se escribe ningún estado del proxy; si se apartan todos los candidatos, la elección no cambia. Desactivado de forma predeterminada. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Muestra, bajo un grupo de proxies en el panel, cuántas IP de salida observadas atendieron a sus miembros durante las últimas 24 h y cuántas conexiones las utilizaron. Es de solo lectura, se calcula a partir del registro del proxy y nunca se utiliza para el enrutamiento. Desactivado de forma predeterminada. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Para el ejecutor de OpenCode, supervisa el primer byte del cuerpo de una respuesta transmitida de Responses (ventana: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, valor predeterminado `15000`). Un flujo de Responses 2xx que permanezca en silencio más allá de la ventana se considera bloqueado: la cuenta entra en período de espera y la solicitud rota una vez a la siguiente cuenta; un segundo bloqueo falla de inmediato. Desactivado de forma predeterminada: los flujos bloqueados mantienen la espera actual hasta que se agota el tiempo de espera de disponibilidad del flujo. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Ejecutor de OpenCode: ante un 403/451 que contenga un rechazo `user_blocked` (no geográfico ni un rechazo de huella digital de Cloudflare), pone la cuenta rechazada en período de espera y rota a la siguiente cuenta como máximo una vez por solicitud; un segundo rechazo se devuelve tal cual, sin una marca de éxito. Desactivado de forma predeterminada: eludir un bloqueo de usuario del servicio ascendente puede parecer evasión y propagar la marca por toda la flota. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotación de OpenCode: después de dos fallos transitorios consecutivos del servicio ascendente (5xx o un 400 vacío), hace una pausa antes de pasar a la siguiente cuenta: 1,5 s, duplicándose con cada fallo adicional, con un límite de 6 s por pausa y 10 s por solicitud; se omite si el cliente se desconecta. El cuerpo fallido se libera antes de esperar. Desactivado de forma predeterminada: la conmutación por error sigue siendo inmediata. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotación de OpenCode: detiene la ronda de cuentas ante el primer 429 clasificado como un límite de tasa real (`Retry-After` analizable o un cuerpo que mencione un límite de tasa/uso) y devuelve ese 429 del servicio ascendente sin cambios. Los 429 no clasificados continúan rotando. Desactivado de forma predeterminada: el nivel gratuito está limitado por IP de salida (#9611), por lo que cada 429 provoca una rotación y una ronda agotada devuelve el último 429 del servicio ascendente. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Deshabilita la verificación del certificado TLS para el proxy MITM. **Peligro.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Permite URL de proveedores que apunten a redes privadas/internas. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Permite añadir/validar proveedores en direcciones locales/privadas (127.0.0.1, localhost, LAN). Activado de forma predeterminada (prioridad local); desactívelo para aplicar un bloqueo estricto que solo permita direcciones públicas. Los metadatos de la nube siguen bloqueados. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Habilita el modo de proveedor compatible con Claude Code. | +| Clave | Tipo | Predeterminado | Descripción | +| --------------------------------------- | ------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Exige una clave de API para todas las solicitudes entrantes. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Habilita la sanitización de las entradas para todas las solicitudes. | +| `INJECTION_GUARD_MODE` | enum | `off` | Modo de protección contra la inyección de prompts. Valores: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Oculta la PII de las solicitudes (independientemente de `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Sanitiza la PII de las respuestas del proveedor. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Modo de sanitización de PII en las respuestas. Valores: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Bloquea las solicitudes salientes dirigidas a rangos de direcciones IP privadas o internas. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Permite que los usuarios autenticados del panel revelen las claves de API almacenadas en lugar de ver únicamente valores enmascarados. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Incluye el prefijo de la cuenta en las líneas del registro AUTH (por ejemplo, «Usando la cuenta de : abc12345...»). Está deshabilitado de forma predeterminada para que los identificadores de cuenta se oculten en los registros de procesos compartidos o multiinquilino. Es independiente del modo de depuración; activar o desactivar dicho modo no los revela. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Cuando OIDC está habilitado, deshabilita el inicio de sesión mediante contraseña para que los usuarios solo puedan autenticarse a través del inicio de sesión único de OIDC. Cuando está deshabilitado (valor predeterminado), están disponibles tanto el inicio de sesión mediante contraseña como OIDC. | + +### Red (16) + +| Clave | Tipo | Predeterminado | Reinicio | Descripción | +| ----------------------------------------------- | ------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Habilita el modo sigiloso de huella digital TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Permite que las rutas /v1/audio/* utilicen nodos de proveedores compatibles con OpenAI alojados fuera de localhost. Desactivado de forma predeterminada: enrutar el audio a un host remoto cambia la identidad de salida y debe ser una decisión explícita del operador. Los nodos de bucle invertido siempre están permitidos y no se ven afectados. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Permite que POST /v1/rerank (y el paso de reclasificación mediante bucle invertido del motor de memoria) utilice nodos de proveedores compatibles con OpenAI alojados fuera de localhost. Desactivado de forma predeterminada: el enrutamiento a un host remoto cambia la identidad de salida y debe ser una decisión explícita del operador. Los nodos de bucle invertido siempre están permitidos; los nodos remotos también deben cumplir la política de URL salientes del proveedor. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Cuando no se asigna ningún proxy a una conexión, selecciona automáticamente el primer proxy operativo del registro. Desactivado de forma predeterminada (de lo contrario, cualquier proxy del registro se convierte en una alternativa global — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Permite que los flujos de OAuth y de validación de proveedores omitan un proxy fijado y se conecten directamente cuando fallen las comprobaciones previas de accesibilidad del proxy. Desactivado de forma predeterminada porque esto puede cambiar la IP de salida. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Ante una excepción de red (tiempo de espera agotado, conexión rechazada/restablecida) en un ejecutor de rotación con varias cuentas, cuando la cuenta que falla no tiene un proxy dedicado, aplica un breve período de espera y omite las demás cuentas sin proxy durante el resto de la solicitud, en lugar de volver a intentar cada una. Activado de forma predeterminada (seguro: no cambia la IP de salida; solo reduce el riesgo de latencia/período de espera en cuentas con salida compartida). Desactívelo para restaurar la propagación inmediata al producirse la primera excepción en una cuenta sin proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Los grupos de proxies y la rotación por cuenta de opencode dejan de volver a ofrecer un proxy que acaba de fallar (sondeo TCP rechazado o respuesta 429 recibida a través de él) durante un período por proceso que se duplica con cada repetición, hasta alcanzar un límite. No se registra ningún estado del proxy; si todos los candidatos se dejan de lado, la elección no cambia. Desactivado de forma predeterminada. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Muestra, bajo un grupo de proxies en el panel, cuántas IP de salida observadas prestaron servicio a sus miembros durante las últimas 24 h y cuántas conexiones las utilizaron. Es de solo lectura, se calcula a partir del registro del proxy y nunca se utiliza para el enrutamiento. Desactivado de forma predeterminada. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Para el ejecutor OpenCode, supervisa el primer byte del cuerpo de una respuesta Responses transmitida en streaming (ventana: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, valor predeterminado `15000`). Un flujo Responses 2xx que permanezca inactivo después de esa ventana se considera bloqueado: la cuenta entra en período de espera y la solicitud rota una vez a la cuenta siguiente; un segundo bloqueo provoca un fallo inmediato. Desactivado de forma predeterminada: los flujos bloqueados mantienen la espera actual hasta que se agota el tiempo de espera de disponibilidad del flujo. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Ejecutor de OpenCode: ante un error 403/451 que incluya un rechazo `user_blocked` (no geográfico ni un rechazo por huella digital de Cloudflare), pone temporalmente en espera la cuenta rechazada y rota a la siguiente cuenta como máximo una vez por solicitud; un segundo rechazo se devuelve sin cambios y sin marcarlo como éxito. Desactivado de forma predeterminada: eludir un bloqueo de usuario del proveedor ascendente puede parecer una evasión y propagar la marca por toda la flota. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotación de OpenCode: después de dos fallos transitorios consecutivos del proveedor ascendente (5xx o un 400 vacío), espera antes de pasar a la siguiente cuenta: 1,5 s, duplicándose con cada fallo adicional, con un máximo de 6 s por pausa y 10 s por solicitud; se omite si el cliente se desconecta. El cuerpo de la respuesta fallida se libera antes de esperar. Desactivado de forma predeterminada: la conmutación por error sigue siendo inmediata. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotación de OpenCode: detiene la ronda de cuentas en el primer 429 clasificado como un límite de tasa real (un `Retry-After` analizable o un cuerpo que mencione un límite de tasa/uso) y devuelve ese 429 del proveedor ascendente sin cambios. Los 429 sin clasificar siguen provocando la rotación. Desactivado de forma predeterminada: el nivel gratuito está limitado por IP de salida (#9611), por lo que cada 429 provoca una rotación y una ronda agotada devuelve el último 429 del proveedor ascendente. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Deshabilita la verificación de certificados TLS para el proxy MITM. **Peligro.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Permite URL de proveedores que apunten a redes privadas/internas. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Permite añadir/validar proveedores en direcciones locales/privadas (127.0.0.1, localhost, LAN). Activado de forma predeterminada (prioridad local); deshabilítelo para aplicar un bloqueo estricto que solo permita direcciones públicas. Los metadatos de la nube permanecen bloqueados. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Habilita el modo de proveedor compatible con Claude Code. | ### Políticas (5) | Clave | Tipo | Valor predeterminado | Descripción | | ------------------------------- | ------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `TOOL_POLICY_MODE` | enum | `disabled` | Modo de aplicación de políticas de uso de herramientas. Valores: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Habilita automáticamente la limitación de frecuencia en función de los patrones de uso. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Omite la comprobación local de OmniRoute sobre la ventana de contexto o el máximo de tokens de entrada para solicitudes directas de un único modelo. Los límites del proveedor ascendente siguen siendo aplicables. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Habilita automáticamente la limitación de tasa en función de los patrones de uso. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Omite la comprobación local de OmniRoute sobre la ventana de contexto o el número máximo de tokens de entrada para solicitudes directas de un único modelo. Los límites del proveedor ascendente siguen aplicándose. | | `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Rechaza las solicitudes antes de enviarlas cuando el modelo de destino carece de las capacidades necesarias (visión, herramientas, salida estructurada, ventana de contexto). Protege las solicitudes directas a un único proveedor que omiten el filtro de compatibilidad de la capa de combinaciones. | -| `RADAR_ENABLED` | boolean | `false` | Habilita el módulo Radar de OmniRoute (pantallas de fuentes de catálogos y sincronización). Está desactivado de forma predeterminada; habilitarlo solo desbloquea la interfaz de usuario, ya que la sincronización de datos requiere una activación independiente. | - -### Tiempo de ejecución (32) - -| Clave | Tipo | Predeterminado | Reinicio | Descripción | -| ------------------------------------------- | ------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Genera e inyecta resúmenes de conversación cuando el enrutamiento combinado cambia de modelo. Desactívelo para tratar los cambios de modelo de forma independiente y evitar solicitudes de traspaso en segundo plano para todas las combinaciones existentes y futuras. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Descarta los elementos internos de salida de la fase de comentarios de los flujos de paso directo de la API Responses antes de reenviarlos a los clientes. Desactívelo para recibir los comentarios originales del servicio ascendente. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Aplica restricciones de ámbito al acceso a herramientas MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Comprime las descripciones de las herramientas MCP para reducir el uso de tokens. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Habilita el procesamiento de tareas en segundo plano durante la ejecución. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Deshabilita todos los servicios en segundo plano (actualización de cuotas, sincronización, etc.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Confía en los filtros RTK del proyecto sin validarlos. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Inicia el servidor WebSocket del panel en tiempo real al importar (puerto 20132 de forma predeterminada). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Permite que Codex utilice el transporte de Responses mediante WebSocket. Cuando está desactivado, Codex recurre a Responses mediante HTTP. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Permite que Codex utilice el transporte JSON-RPC por WebSocket del servidor de aplicaciones local (codexTransport=app-server). Cuando está desactivado, las conexiones configuradas para usar app-server recurren a los demás transportes de Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Enruta las solicitudes cuyo presupuesto se haya agotado al proveedor/modelo alternativo gratuito de emergencia. (Consulte [Alternativa de emergencia por agotamiento del presupuesto](#emergency-budget-fallback) más adelante). | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Habilita el reintento temprano y transparente de flujos SSE ascendentes truncados antes de que algún byte de la respuesta llegue al cliente. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Permite que la recuperación del flujo vuelva a realizar la solicitud y ensamble una respuesta después de que algunos bytes ya hayan llegado al cliente. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Hace que la continuación a mitad del flujo sea segura para las llamadas a herramientas: nunca reanuda un flujo interrumpido una vez emitida una llamada a una herramienta (en curso o ya finalizada con finish_reason tool_calls) y lo cierra después de una continuación vacía en lugar de consumir todo el presupuesto. Desactivado: comportamiento de la versión publicada. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Realiza una conmutación por error una vez a una conexión hermana cuando un flujo SSE se cierra antes de emitir un fotograma útil y se ha agotado el reintento limitado en la misma conexión; si no hay una conexión hermana utilizable, se devuelve el error 502 `STREAM_EARLY_EOF` original. Desactivado de forma predeterminada: un EOF temprano sigue siendo terminal después del reintento en la misma conexión. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Incluye campos de nombre aptos para mostrar en las respuestas de `/v1/models`. Desactívelo para clientes que solo esperan identificadores de modelos. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Controla cómo se añaden prefijos a los identificadores de modelos en /v1/models. 'dual' (predeterminado) emite tanto el alias como los prefijos canónicos de identificador del proveedor para mantener la compatibilidad con versiones anteriores. 'alias' emite únicamente el prefijo corto del alias (p. ej., ds-web/model, no deepseek-web/model). 'canonical' emite únicamente el prefijo completo del identificador del proveedor. Valores: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Habilita la sincronización periódica del ELO de la clasificación de Arena AI para las clasificaciones de inteligencia de los modelos. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Publicita identificadores espejo `claude//` en `/v1/models` para que el descubrimiento de modelos de la puerta de enlace de Claude Code enumere modelos que no sean de Claude. Nivel global del control de tres niveles (la variable de entorno prevalece sobre la configuración del panel). Consulte [Configuración de Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Interruptor principal para los alias de puerta de enlace no-think//. Activado (predeterminado): /v1/models publicita una variante sin razonamiento para cada modelo de Claude apto y capaz de razonar, y un identificador no-think/ enviado en una solicitud se resuelve de nuevo al modelo real con el razonamiento suprimido. Desactivado: no se publicita ninguna variante y un identificador no-think/ se trata como cualquier otro identificador de modelo desconocido. La inclusión/exclusión por modelo mediante ModelSpec.noThinkingAlias sigue aplicándose mientras esté activado. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Deshabilita la generación de variantes de nivel de razonamiento (p. ej., -low, -medium, -high) en el catálogo de /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Habilita carriles virtuales adaptativos de admisión por inquilino para el envío al proveedor (#9654): una ráfaga de un inquilino ya no provoca errores 503 a otro. La variable de entorno OMNIROUTE_CHAT_VIRTUAL_LANES prevalece sobre esta configuración del panel; los cambios surten efecto al reiniciar el servidor. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Publicita identificadores espejo / en /v1/models para los modelos cuyo propietario canónico no tiene credenciales activas, pero que son enrutados por una puerta de enlace de paso directo con credenciales activas. Advertencia: cuando se habilita globalmente, añade entradas al catálogo para todos los clientes. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Habilita la detección de saldo para nodos agregadores compatibles con New-API / One-API / Sub2API. Cuando se habilita, los nodos compatibles que tengan establecida la marca de agregador informarán de su saldo en el panel y durante el enrutamiento de comprobación previa de cuotas. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Continúa las llamadas no transmitidas a herramientas controladas por el servidor hasta que el modelo devuelva una respuesta utilizable por el cliente. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Las estadísticas de búsqueda y las búsquedas recientes solo contabilizan los proveedores que aún tienen una conexión activa (los proveedores sin clave, como duckduckgo-free, siempre cuentan). Si está desactivado, conserva todas las filas de búsqueda retenidas que tengan un identificador de proveedor. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Páginas de proveedores del panel: muestra la insignia Gratis únicamente según las señales que respete el proveedor; descarta la heurística basada en el nombre para mostrar, los campos de gratuidad que no sean booleanos y los sufijos :free de los proveedores registrados sin un nivel gratuito documentado. Si está desactivado, conserva la regla histórica de la insignia. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | En respuestas agregadas de indisponibilidad 429/503, omite `Retry-After` cuando no se conoce un momento futuro concreto para el reintento (en lugar de usar un valor sintético de 1 s), añade `error.retry_after_provenance` (`signal` \| `none`) y permite que las rutas de vaciado de combinaciones lean indicaciones textuales de reintento de cuerpos ascendentes JSON y de texto sin formato. El campo solo aparece en respuestas creadas por `unavailableResponse()`; los demás cuerpos 429/503 no cambian. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Cuando un destino de combinación `priority`, marcado para usarse como alternativa únicamente al agotarse la cuota, detiene la combinación por una causa que se puede demostrar que no está relacionada con la cuota (disyuntor del proveedor abierto, omisión por latencia predictiva), responde con 502 en lugar del 503 que parece indicar un problema de cuota. Los bloqueos, periodos de espera, estados de indisponibilidad, agotamientos y detenciones por límite de concurrencia mantienen el código 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Una respuesta 401 simple de Mistral (`{"detail":"Unauthorized"}`, sin una señal explícita de autenticación) es idéntica tanto para una clave revocada como para una cuota agotada. Cuando está activado, pone la conexión en periodo de espera en lugar de aparcarla como `expired`, hasta 3 veces por hora y conexión; la siguiente vez la aparca, de modo que una clave revocada sigue convergiendo. Desactivado de forma predeterminada: cada respuesta 401 simple de Mistral aparca la conexión como antes. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Obtiene el catálogo activo de modelos de xAI para las conexiones `xai-oauth` desde `https://api.x.ai/v1/models` mediante el token OAuth bearer, en lugar de la semilla estática congelada. Desactivado de forma predeterminada: `xai-oauth` continúa sirviendo la semilla estática sin cambios. Ante cualquier error de resolución, el descubrimiento recurre a la semilla (no se ha verificado si x.ai acepta un token OAuth bearer en este endpoint). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Permite que el barrido de limpieza automática elimine los trabajos terminales (completados/fallidos/cancelados/caducados) de la API Batch con una antigüedad superior a `OMNIROUTE_BATCH_RETENTION_DAYS`, junto con sus puntos de control por línea, y borre el contenido BLOB de los archivos subidos que hayan superado su propio `expires_at`. Desactivado de forma predeterminada: cada instalación existente conserva estos datos exactamente como antes hasta que un operador lo habilite. La ruta `DELETE /api/v1/batches/delete-completed`, activada por el operador, no se ve afectada en ningún caso: constituye un contrato de API pública independiente e incondicional. | +| `RADAR_ENABLED` | boolean | `false` | Habilita el módulo Radar de OmniRoute (pantallas del canal del catálogo y sincronización). Desactivado de forma predeterminada; habilitarlo solo desbloquea la interfaz de usuario, ya que la sincronización de datos requiere una activación independiente. | + +### Tiempo de ejecución (33) + +| Clave | Tipo | Predeterminado | Reinicio | Descripción | +| ------------------------------------------- | -------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Genera e inyecta resúmenes de conversaciones cuando el enrutamiento combinado cambia de modelo. Desactívalo para tratar los cambios de modelo de forma independiente y evitar solicitudes de transferencia en segundo plano para todas las combinaciones existentes y futuras. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Descarta los elementos de salida internos de la fase de comentarios de los flujos de transferencia directa de la API Responses antes de reenviarlos a los clientes. Desactívalo para recibir los comentarios sin procesar del servicio de origen. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Aplica restricciones de ámbito al acceso a las herramientas MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Comprime las descripciones de las herramientas MCP para reducir el uso de tokens. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Habilita el procesamiento de tareas en segundo plano durante la ejecución. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Deshabilita todos los servicios en segundo plano (actualización de cuotas, sincronización, etc.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | booleano | `false` | | Confiar en los filtros RTK a nivel de proyecto sin validación. | +| `OMNIROUTE_ENABLE_LIVE_WS` | booleano | `true` | ✓ | Iniciar el servidor WebSocket del panel en tiempo real al importar (puerto 20132 de forma predeterminada). | +| `OMNIROUTE_CODEX_WS_ENABLED` | booleano | `true` | | Permitir que Codex utilice el transporte Responses sobre WebSocket. Cuando está desactivado, Codex recurre a Responses mediante HTTP. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | booleano | `true` | | Permitir que Codex utilice el transporte JSON-RPC por WebSocket del servidor de aplicaciones local (codexTransport=app-server). Cuando está desactivado, las conexiones configuradas para usar el servidor de aplicaciones recurren a los demás transportes de Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | booleano | `true` | | Enrutar las solicitudes que hayan agotado el presupuesto al proveedor/modelo alternativo gratuito de emergencia. (Consulte [Alternativa de emergencia por presupuesto](#emergency-budget-fallback) a continuación). | +| `STREAM_RECOVERY_ENABLED` | booleano | `false` | | Habilitar el reintento anticipado y transparente de flujos SSE ascendentes truncados antes de que ningún byte de la respuesta llegue al cliente. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | booleano | `false` | | Permitir que la recuperación de flujos vuelva a solicitar y ensamble una respuesta después de que los bytes ya hayan llegado al cliente. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | booleano | `false` | | Hacer que la continuación a mitad del flujo sea segura para las llamadas a herramientas: no reanudar nunca un flujo interrumpido una vez emitida una llamada a una herramienta (en curso o ya finalizada con `finish_reason` `tool_calls`) y cerrar después de una continuación vacía en lugar de consumir todo el presupuesto. Desactivado: comportamiento de la versión publicada. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Realizar una conmutación por error una vez a una conexión hermana cuando un flujo SSE se cierre antes de emitir algún frame útil y se haya agotado el reintento limitado en la misma conexión; si no hay ninguna conexión hermana utilizable, se devuelve el error 502 `STREAM_EARLY_EOF` original. Desactivado de forma predeterminada: un EOF anticipado sigue siendo terminal después del reintento en la misma conexión. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Incluir campos de nombre descriptivos en las respuestas de `/v1/models`. Desactivar para clientes que solo esperan IDs de modelos. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Controla cómo se anteponen prefijos a los IDs de modelos en /v1/models. 'dual' (valor predeterminado) emite tanto los prefijos de alias como los de ID canónico del proveedor para mantener la compatibilidad con versiones anteriores. 'alias' emite únicamente el prefijo de alias corto (p. ej., ds-web/model, no deepseek-web/model). 'canonical' emite únicamente el prefijo completo del ID del proveedor. Valores: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Habilitar la sincronización periódica del ELO de la tabla de clasificación de Arena AI para las clasificaciones de inteligencia de los modelos. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Publicar los IDs espejo `claude//` en `/v1/models` para que el descubrimiento de modelos de la puerta de enlace de Claude Code muestre modelos que no sean de Claude. Nivel global del control de tres niveles (la variable de entorno tiene prioridad sobre la configuración del panel). Consulte la [configuración de Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Interruptor principal para los alias `no-think//` de la puerta de enlace. Activado (valor predeterminado): /v1/models publica una variante sin razonamiento para cada modelo Claude apto con capacidad de razonamiento, y un ID `no-think/` enviado en una solicitud se resuelve al modelo real con el razonamiento suprimido. Desactivado: no se publica ninguna variante y un ID `no-think/` se trata como cualquier otro ID de modelo desconocido. La activación o desactivación por modelo mediante `ModelSpec.noThinkingAlias` sigue aplicándose mientras esta opción esté activada. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Deshabilitar la generación de variantes de nivel de razonamiento (p. ej., -low, -medium, -high) en el catálogo de /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Habilitar carriles virtuales adaptativos de admisión por inquilino para el envío al proveedor (#9654): la ráfaga de un inquilino ya no provoca errores 503 para otro. La variable de entorno `OMNIROUTE_CHAT_VIRTUAL_LANES` tiene prioridad sobre esta configuración del panel; los cambios surten efecto al reiniciar el servidor. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Anuncia los identificadores espejo / en /v1/models para los modelos cuyo propietario canónico no tenga credenciales activas, pero que sean enrutados por una puerta de enlace de paso con credenciales activas. Advertencia: cuando se habilita globalmente, añade entradas al catálogo para todos los clientes. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Habilita la detección de saldo para nodos compatibles con los agregadores New-API / One-API / Sub2API. Cuando se habilita, los nodos compatibles que tengan configurado el indicador de agregador mostrarán su saldo en el panel y en el enrutamiento de comprobación previa de cuota. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Continúa las llamadas no transmitidas a herramientas gestionadas por el servidor hasta que el modelo devuelva una respuesta utilizable por el cliente. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Las estadísticas de búsqueda y las búsquedas recientes solo cuentan los proveedores que aún tengan una conexión activa (los proveedores sin clave, como duckduckgo-free, siempre cuentan). Si está desactivado, conserva todas las filas de búsqueda retenidas que tengan un identificador de proveedor. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Páginas de proveedores del panel: muestra la insignia Gratis solo con señales que el proveedor respete; descarta la heurística del nombre para mostrar, los campos de gratuidad no booleanos y los sufijos :free en proveedores registrados sin un nivel gratuito documentado. Si está desactivado, conserva la regla histórica de la insignia. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | En respuestas agregadas 429/503 de indisponibilidad, omite `Retry-After` cuando no se conozca un momento futuro concreto para reintentar (en lugar de usar un valor sintético de 1 s), añade `error.retry_after_provenance` (`signal` \| `none`) y permite que las rutas de agotamiento de combinaciones lean indicaciones textuales de reintento desde cuerpos JSON y de texto sin formato del servicio ascendente. El campo solo aparece en respuestas creadas por `unavailableResponse()`; los demás cuerpos 429/503 no cambian. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Cuando un destino de combinación `priority` marcado como alternativo solo al agotarse la cuota detenga la combinación por una causa que se pueda demostrar que no está relacionada con la cuota (disyuntor del proveedor abierto, omisión por latencia predictiva), responde con 502 en lugar del 503 que aparenta estar relacionado con la cuota. Las detenciones por bloqueo, periodo de enfriamiento, indisponibilidad, agotamiento y límite de concurrencia siguen usando 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Un 401 básico de Mistral (`{"detail":"Unauthorized"}`, sin una señal explícita de autenticación) es idéntico tanto para una clave revocada como para una cuota agotada. Cuando está activado, aplica un periodo de enfriamiento a la conexión en lugar de marcarla como `expired`, como máximo 3 veces por hora y por conexión; la siguiente vez la marca, por lo que una clave revocada acaba convergiendo. Desactivado de forma predeterminada: cada 401 básico de Mistral marca la conexión como antes. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Obtiene el catálogo activo de modelos de xAI para las conexiones `xai-oauth` desde `https://api.x.ai/v1/models` utilizando el token OAuth de portador, en lugar de la semilla estática congelada. Desactivado de forma predeterminada: `xai-oauth` continúa sirviendo la semilla estática sin cambios. Ante cualquier error de resolución, el descubrimiento recurre a la semilla (no se ha verificado si x.ai acepta un token OAuth de portador en este endpoint). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Permite que el proceso de limpieza automática elimine los trabajos terminales (completados/fallidos/cancelados/caducados) de la API por lotes que tengan más de `OMNIROUTE_BATCH_RETENTION_DAYS`, junto con sus puntos de control por línea, y borre el contenido BLOB de los archivos cargados después de su propio `expires_at`. Desactivado de forma predeterminada: todas las instalaciones existentes conservan estos datos exactamente como antes hasta que un operador active esta opción. La ruta `DELETE /api/v1/batches/delete-completed`, activada por el operador, no se ve afectada en ningún caso: constituye un contrato de API pública independiente e incondicional. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Reserva la cuenta de Antigravity seleccionada durante el ciclo de vida de streaming de la solicitud que la eligió, de modo que un reintento simultáneo o la transferencia de credenciales no puedan volver a elegir una cuenta que ya esté asignada a un stream en curso. La reserva se limita a (conexión, modelo invocable del proveedor), por lo que una cuenta puede seguir atendiendo dos modelos diferentes a la vez. Cuando todas las cuentas aptas ya están reservadas para ese modelo, la solicitud devuelve un error 503 estructurado `antigravity_pool_busy` con un valor `Retry-After` acotado, en lugar de acumular solicitudes en una cuenta ocupada. Desactivado de forma predeterminada: la selección de cuentas permanece exactamente igual que antes y no se realiza ninguna reserva. | ### CLI (5) -| Clave | Tipo | Predeterminado | Reinicio | Descripción | -| ------------------------------------- | ------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Habilita el modo de compatibilidad para todos los clientes de CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Habilita la capa de compatibilidad de alias de modelos. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Habilita la sincronización automática de datos de precios (también requiere la variable de entorno `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Después de sincronizar los modelos de un proveedor, (re)escribe automáticamente los archivos de perfil ~/.codex/*.config.toml a partir del catálogo activo. Nunca cambia la configuración activa/predeterminada de Codex. Deshabilitado de forma predeterminada. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Después de sincronizar los modelos de un proveedor, (re)escribe automáticamente los perfiles de Claude Code ~/.claude/profiles//settings.json a partir del catálogo activo. Nunca cambia la configuración activa/predeterminada de Claude. Deshabilitado de forma predeterminada. | +| Clave | Tipo | Valor predeterminado | Reinicio | Descripción | +| ------------------------------------- | ------- | -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Activa el modo de compatibilidad para todos los clientes de CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Activa la capa de compatibilidad de alias de modelos. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Activa la sincronización automática de datos de precios (también requiere la variable de entorno `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Después de sincronizar los modelos de un proveedor, (re)escribe automáticamente los archivos de perfil ~/.codex/*.config.toml a partir del catálogo activo. Nunca modifica la configuración activa/predeterminada de Codex. Desactivado de forma predeterminada. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Después de sincronizar los modelos de un proveedor, (re)escribe automáticamente los perfiles de Claude Code ~/.claude/profiles//settings.json a partir del catálogo activo. Nunca modifica la configuración activa/predeterminada de Claude. Desactivado de forma predeterminada. | ### Estado (5) -| Clave | Tipo | Predeterminado | Descripción | -| ----------------------------------------- | ------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Deshabilita el endpoint de comprobación de estado de la instancia local. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Deshabilita la comprobación de estado de validación de tokens. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Habilita el acceso a la red en el entorno aislado de habilidades. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | En el barrido de estado de los proxies, una sonda rechazada por el destino (401/403/429) reinicia la racha de fallos consecutivos del proxy. Deshabilitado de forma predeterminada: un rechazo permanece neutral (#10654). Un error 5xx sigue siendo inconcluyente en cualquier caso; un rechazo nunca elimina, deshabilita ni reactiva un proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Ejecuta la comprobación de integridad/estado de la base de datos al inicio después de que el servidor comience a aceptar solicitudes (mediante `setImmediate`), en lugar de bloquear el inicio hasta que finalice (#13717). Deshabilitado de forma predeterminada: el inicio se bloquea exactamente igual que antes de este PR. | +| Clave | Tipo | Valor predeterminado | Descripción | +| ----------------------------------------- | ------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Deshabilita el endpoint de comprobación de estado de la instancia local. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Deshabilita la comprobación de estado de validación de tokens. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Habilita el acceso a la red en el entorno aislado de habilidades. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | En el barrido de estado de los proxies, una sonda rechazada por el destino (401/403/429) reinicia la racha de fallos consecutivos del proxy. Deshabilitado de forma predeterminada: un rechazo permanece neutral (#10654). Un error 5xx sigue siendo no concluyente en cualquier caso; un rechazo nunca elimina, deshabilita ni reactiva un proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Ejecuta la comprobación de integridad/estado de la base de datos al inicio después de que el servidor comience a aceptar solicitudes (mediante `setImmediate`), en lugar de bloquear el inicio hasta que finalice (#13717). Deshabilitado de forma predeterminada: el inicio se bloquea exactamente igual que antes de este PR. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` y su alias heredado > `INJECTION_GUARD_BLOCK_THRESHOLD` ajustan el modo `block` de > `INJECTION_GUARD_MODE`, pero son variables de entorno normales que lee > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> no indicadores de funcionalidad: no tienen sobrescritura en la base de datos ni opción de alternancia en el panel. Consulte +> no indicadores de funcionalidades: no admiten sobrescritura desde la base de datos ni tienen un control en el panel. Consulta > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] > La columna `Reinicio` marca los indicadores con `requiresRestart: true`: el valor se -> conserva al instante, pero solo surte efecto después de que se recarga el proceso. Los indicadores de enumeración -> rechazan cualquier valor fuera de su conjunto permitido (validado en el servidor tanto en -> `setFeatureFlagOverride()` como en el controlador REST `PUT`). +> conserva instantáneamente, pero solo surte efecto después de que se recarga el proceso. Los indicadores +> de enumeración rechazan cualquier valor que no pertenezca a su conjunto permitido (validado en el servidor +> tanto en `setFeatureFlagOverride()` como en el controlador REST `PUT`). --- @@ -169,20 +171,20 @@ utilizado cuando no existe ninguna anulación en la BD ni ninguna variable de en ### Panel de control -Ve a **Panel de control → Configuración → Indicadores de funcionalidades** +Vaya a **Panel de control → Configuración → Indicadores de funcionalidades** (`/dashboard/settings/feature-flags`). La cuadrícula (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) permite: - **Buscar** por clave o descripción y **filtrar** por categoría (además de una vista - sintética de **Requiere reinicio**). -- Un **interruptor** para los indicadores booleanos y un **menú desplegable** para los indicadores de enumeración + sintética **Requiere reinicio**). +- Un **interruptor** para los indicadores booleanos y una **lista desplegable** para los indicadores de enumeración (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - Una **insignia de origen** por indicador —`DB`, `ENV` o `DEF`— que muestra de dónde procede el valor efectivo. -- Un botón **Restablecer** (que se muestra únicamente para los indicadores cuyo origen es `DB`) para eliminar la sobrescritura, +- Un botón **Restablecer** (que solo se muestra para los indicadores cuyo origen es `DB`) para eliminar la sobrescritura, y un botón **Restablecer todas las sobrescrituras** en la parte inferior. -- Un aviso de **Reiniciar servidor** cuando se modifica un indicador `requiresRestart`. +- Un aviso **Reiniciar servidor** cuando se modifica un indicador con `requiresRestart`. ### API REST @@ -210,7 +212,7 @@ Devuelve todos los indicadores con su valor efectivo, origen y un resumen. "requiresRestart": false, "warningLevel": "caution", }, - // ... los 72 indicadores + // ... los 74 indicadores ], "summary": { "total": 56, @@ -224,8 +226,8 @@ Devuelve todos los indicadores con su valor efectivo, origen y un resumen. #### `PUT /api/settings/feature-flags` -Establece o elimina una sobrescritura individual. Cuerpo: `{ key: string; value?: string }`. -Omitir `value` elimina la sobrescritura (restaurando el valor de entorno o predeterminado). +Establece o elimina una única sobrescritura. Cuerpo: `{ key: string; value?: string }`. +Omitir `value` elimina la sobrescritura (restaurando el valor de env / predeterminado). ```bash # Establecer una sobrescritura de DB @@ -239,18 +241,18 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -La respuesta devuelve los nuevos valores `effectiveValue`/`source`, los valores `previousValue`/ +La respuesta devuelve el nuevo `effectiveValue`/`source`, el `previousValue`/ `previousSource` y `requiresRestart`. Las claves desconocidas y los valores de enumeración -fuera de rango se rechazan con `400`. +fuera del intervalo se rechazan con `400`. #### `DELETE /api/settings/feature-flags` -Borra **todas** las sobrescrituras de DB a la vez y restaura cada indicador a su valor de entorno o -predeterminado. Devuelve `{ cleared: , message: "..." }`. +Elimina **todas** las sobrescrituras de DB de una vez, restaurando cada indicador a su valor +de env / predeterminado. Devuelve `{ cleared: , message: "..." }`. > [!NOTE] -> Los indicadores con `requiresRestart: true` solo surten efecto después de reiniciar el proceso. -> El flujo de reinicio del panel de control llama a `POST /api/restart` y, a continuación, consulta periódicamente +> Los indicadores con `requiresRestart: true` solo surten efecto después de recargar el proceso. +> El flujo de reinicio del panel de control llama a `POST /api/restart` y luego consulta periódicamente > `GET /api/health/ping` hasta que el servidor vuelve a estar disponible. --- diff --git a/docs/i18n/es/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/es/docs/reference/PROVIDER_REFERENCE.md index 314a34cb82fe..c52c978a583a 100644 --- a/docs/i18n/es/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/es/docs/reference/PROVIDER_REFERENCE.md @@ -4,9 +4,9 @@ --- -> **Generado automáticamente** a partir de `src/shared/constants/providers.ts` — no editar manualmente. +> **Generado automáticamente** desde `src/shared/constants/providers.ts` — no editar manualmente. > Volver a generar con: `npm run gen:provider-reference` -> **Última generación:** 2026-09-17 +> **Última generación:** 2026-09-18 Total de proveedores: **359**. Consulte el desglose por categorías a continuación. @@ -32,49 +32,49 @@ Use el panel en `/dashboard/providers` para habilitar, configurar y probar cada --- -## Proveedores sin autenticación (no se requiere clave) (10) - -| ID | Alias | Nombre | Etiquetas | Sitio web | Notas | Llamadas a herramientas | -| ----------------------- | ---------- | ------------------------- | ------------------------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------- | -| `aihorde` | `horde` | AI Horde | Sin autenticación | [enlace](https://aihorde.net) | No se requiere una clave de API; utiliza la clave anónima documentada de AI Horde. Añadir una clave gratuita de aihorde.net es opcional y solo proporciona una mayor prioridad en la cola (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Sin autenticación | [enlace](https://augmentcode.com) | OmniRoute no almacena ninguna clave de API. Instala Auggie CLI y ejecuta `auggie login` en esta máquina; después, OmniRoute lo inicia localmente para cada solicitud. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Sin autenticación | [enlace](https://playground.ai.cloudflare.com) | No se requieren credenciales; utiliza sesiones anónimas del navegador mediante un protocolo WebSocket cf_agent obtenido por ingeniería inversa (transporte Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Sin autenticación | [enlace](https://developers.openai.com/codex/cli) | OmniRoute no almacena ningún token. El app-server de Codex CLI gestiona su propio inicio de sesión de ChatGPT (~/.codex/auth.json, actualizado automáticamente). Usa «Iniciar sesión con ChatGPT» si la CLI aún no está autenticada. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Sin autenticación | [enlace](https://docs.devin.ai/work-with-devin/devin-cli) | La autenticación está gestionada por la CLI oficial de Devin en su volumen de puente aislado. | emuladas | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Sin autenticación | [enlace](https://duckduckgo.com/duckchat) | No se requieren credenciales; DuckDuckGo AI Chat es anónimo y gratuito. | emuladas | -| `opencode` | `oc` | OpenCode Free | Sin autenticación | [enlace](https://opencode.ai) | No se requiere una clave de API; utiliza el endpoint público y gratuito de OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Sin autenticación | [enlace](https://uncloseai.com) | No se requiere autenticación. La API acepta cualquier cadena no vacía como clave de identificación. Si los modelos integrados más antiguos devuelven 404, usa Modelos disponibles → Importar desde /models o Sincronización automática; modelo activo verificado: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Sin autenticación, vídeo | [enlace](https://veoaifree.com) | No se requiere autenticación. El límite de frecuencia es de 6 solicitudes por hora y por IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Sin autenticación | [enlace](https://zcode.z.ai) | OmniRoute no almacena ninguna clave de API. El app-server local de ZCode utiliza el inicio de sesión existente de builtin:zai-coding-plan. | — | +## Proveedores sin autenticación (no requieren clave) (10) + +| ID | Alias | Nombre | Etiquetas | Sitio web | Notas | Llamada a herramientas | +| ----------------------- | ---------- | ------------------------- | ------------------------ | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | +| `aihorde` | `horde` | AI Horde | Sin autenticación | [enlace](https://aihorde.net) | No se requiere ninguna clave de API: utiliza la clave anónima documentada de AI Horde. Añadir una clave gratuita de aihorde.net es opcional y solo proporciona mayor prioridad en la cola (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Sin autenticación | [enlace](https://augmentcode.com) | OmniRoute no almacena ninguna clave de API. Instale Auggie CLI y ejecute `auggie login` en esta máquina; después, OmniRoute lo inicia localmente para cada solicitud. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Sin autenticación | [enlace](https://playground.ai.cloudflare.com) | No se requieren credenciales: utiliza sesiones anónimas del navegador mediante un protocolo WebSocket cf_agent obtenido por ingeniería inversa (transporte Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Sin autenticación | [enlace](https://developers.openai.com/codex/cli) | OmniRoute no almacena ningún token. El app-server de Codex CLI gestiona su propio inicio de sesión de ChatGPT (~/.codex/auth.json, actualizado automáticamente). Utilice “Iniciar sesión con ChatGPT” si la CLI aún no está autenticada. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Sin autenticación | [enlace](https://docs.devin.ai/work-with-devin/devin-cli) | La autenticación la gestiona la CLI oficial de Devin en su volumen aislado del puente. | emulada | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Sin autenticación | [enlace](https://duckduckgo.com/duckchat) | No se requieren credenciales: DuckDuckGo AI Chat es anónimo y gratuito. | emulada | +| `opencode` | `oc` | OpenCode Free | Sin autenticación | [enlace](https://opencode.ai) | No se requiere ninguna clave de API: utiliza el endpoint público y gratuito de OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Sin autenticación | [enlace](https://uncloseai.com) | No se requiere autenticación. La API acepta cualquier cadena no vacía como clave de identificación. Si los modelos integrados más antiguos devuelven 404, utilice Modelos disponibles → Importar desde /models o Sincronización automática; modelo activo verificado: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Sin autenticación, vídeo | [enlace](https://veoaifree.com) | No se requiere autenticación. El límite es de 6 solicitudes por hora y por IP. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Sin autenticación | [enlace](https://zcode.z.ai) | OmniRoute no almacena ninguna clave de API. El app-server local de ZCode utiliza el inicio de sesión existente de builtin:zai-coding-plan. | — | ## Proveedores OAuth (24) -| ID | Alias | Nombre | Etiquetas | Sitio web | Notas | -| --------------- | ------------- | ------------------------- | --------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [enlace](https://antigravity.google) | Importa tu inicio de sesión de Antigravity CLI (`agy`) (pegando o cargando su archivo de token), detecta automáticamente un inicio de sesión local de la CLI o inicia sesión con Google. Comparte el backend de Antigravity (incluidos los modelos de Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [enlace](https://aws.amazon.com/q/developer/) | Utiliza el mismo AWS Builder ID o flujo de token de actualización importado que Kiro, pero mantiene separadas las conexiones de Amazon Q. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [enlace](https://cline.bot/cline-pass) | ClinePass es la suscripción de Cline de 9,99 USD al mes que incluye 10 modelos abiertos de programación. Inicia sesión con tu cuenta de Cline (el mismo inicio de sesión que en la CLI/IDE de Cline) o pega una clave de API directa de ClinePass (app.cline.bot → Configuración → Claves de API). Una suscripción a ClinePass desbloquea los modelos cline-pass/*. Reutiliza el flujo OAuth de Cline WorkOS. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [enlace](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Inicia sesión mediante el flujo oficial de código de dispositivo de la CLI o pega una clave de API directa (enviada como Authorization: Bearer). Catálogo: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [enlace](https://cli.devin.ai) | Requiere el binario de Devin CLI. Ejecuta `devin auth login` para autenticarte o proporciona tu WINDSURF_API_KEY. Instalación: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [enlace](https://devin.ai) | Pega una clave de API existente de Devin procedente de una sesión autenticada de Devin. La disponibilidad y los pasos para exportar la clave varían según la versión de Devin y la cuenta. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Introduce la URL de tu instancia de GHE (p. ej., https://ghe.company.com) en la configuración del proveedor y, después, autentícate mediante el flujo de dispositivo. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [enlace](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth no está configurado. Registra una aplicación OAuth en https://gitlab.com/-/profile/applications con el URI de redirección http://localhost:20128/callback y los ámbitos "ai_features read_user"; después, configura GITLAB_DUO_OAUTH_CLIENT_ID (y, opcionalmente, GITLAB_DUO_OAUTH_CLIENT_SECRET) y reinicia. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Inicia sesión con tu navegador o pega tu ~/.grok/auth.json (o el token de acceso JWT) de Grok Build CLI; refresh_token se rota automáticamente en ambos casos. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [enlace](https://www.kimi.com/code?aff=omniroute) | Inicia sesión con la misma cuenta de Kimi utilizada por Kimi Code CLI. OmniRoute utiliza el flujo OAuth de la CLI y los endpoints de Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Nivel gratuito: 50 créditos al mes (~25K–100K tokens). ⚠️ Los términos de servicio de Kiro prohíben el uso mediante proxies o infraestructuras de terceros. | -| `openference` | `of` | Openference | OAuth | [enlace](https://openference.com) | Inicia sesión con tu cuenta de Openference para enrutar las solicitudes a través de api.openference.com. Se requiere un plan activo para la inferencia; OAuth puede autenticarte, pero devolver un error 402 si no dispones de uno. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [enlace](https://trae.ai) | Trae es un IDE nativo de IA de ByteDance (agente remoto SOLO). Autoriza mediante trae.ai en la ventana emergente, o inicia sesión en solo.trae.ai y pega el Cloud-IDE-JWT (enviado como 'Authorization: Cloud-IDE-JWT ', con una duración aproximada de 14 días) como token de acceso; web_id/biz_user_id/user_unique_id/scope/tenant/region se propagan mediante providerSpecificData. No hay actualización sin interfaz gráfica para los tokens pegados: vuelve a pegarlos cuando caduquen. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [enlace](https://x.ai) | Inicia sesión con xAI para utilizar modelos de api.x.ai como Grok 4.5. Esto es independiente de las sesiones JWT de Grok Build, que utilizan cli-chat-proxy.grok.com y alias de modelos grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [enlace](https://zed.dev) | Zed almacena las credenciales de los proveedores de LLM (OpenAI, Anthropic, Google, Mistral, xAI) en el llavero del sistema operativo. Utiliza el botón Importar de abajo para detectarlas e importarlas automáticamente. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [enlace](https://zed.dev) | Inicia sesión con tu cuenta de Zed (inicio de sesión de la aplicación nativa). OmniRoute genera un par de claves RSA de un solo uso y abre zed.dev para autorizarlo; en una instalación remota o sin interfaz gráfica, copia la URL de callback 127.0.0.1 resultante desde la barra de direcciones de tu navegador y pégala aquí. Es diferente de la entrada anterior de importación de credenciales 'Zed IDE': esta redirige las finalizaciones de chat mediante el propio agregador de modelos alojado de Zed (cloud.zed.dev), que ofrece acceso a modelos de Anthropic/OpenAI/Google/xAI bajo tu plan de Zed. | +| ID | Alias | Nombre | Etiquetas | Sitio web | Notas | +| --------------- | ------------- | ------------------------- | --------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `agy` | `agy` | Antigravity CLI | OAuth | [enlace](https://antigravity.google) | Importa el inicio de sesión de Antigravity CLI (`agy`) (pegando/subiendo su archivo de token), detecta automáticamente un inicio de sesión local de la CLI o inicia sesión con Google. Comparte el backend de Antigravity (incluidos los modelos de Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [enlace](https://aws.amazon.com/q/developer/) | Utiliza el mismo AWS Builder ID o flujo de token de actualización importado que Kiro, pero mantiene separadas las conexiones de Amazon Q. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [enlace](https://cline.bot/cline-pass) | ClinePass es la suscripción de Cline de $9.99/mes que incluye 10 modelos abiertos de programación. Inicia sesión con tu cuenta de Cline (el mismo inicio de sesión que en la CLI/IDE de Cline) o pega directamente una clave de API de ClinePass (app.cline.bot → Configuración → Claves de API). Una suscripción a ClinePass desbloquea los modelos cline-pass/*. Reutiliza el flujo OAuth de Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [enlace](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Inicia sesión mediante el flujo oficial de código de dispositivo de la CLI o pega directamente una clave de API (enviada como Authorization: Bearer). Catálogo: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [enlace](https://cli.devin.ai) | Requiere el binario de Devin CLI. Ejecuta `devin auth login` para autenticarte o proporciona tu WINDSURF_API_KEY. Instalación: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [enlace](https://devin.ai) | Pega una clave de API de Devin existente procedente de una sesión autenticada de Devin. La disponibilidad y los pasos para exportar la clave varían según la versión de Devin y la cuenta. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Introduce la URL de tu instancia de GHE (p. ej., https://ghe.company.com) en la configuración del proveedor y, a continuación, autentícate mediante el flujo de dispositivo. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [enlace](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth no está configurado. Registra una aplicación OAuth en https://gitlab.com/-/profile/applications con el URI de redirección http://localhost:20128/callback y los ámbitos "ai_features read_user"; después, configura GITLAB_DUO_OAUTH_CLIENT_ID (y, opcionalmente, GITLAB_DUO_OAUTH_CLIENT_SECRET) y reinicia. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Inicia sesión con tu navegador o pega tu ~/.grok/auth.json (o el token de acceso JWT) de Grok Build CLI; refresh_token se rota automáticamente en ambos casos. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [enlace](https://www.kimi.com/code?aff=omniroute) | Inicia sesión con la misma cuenta de Kimi que utilizas en Kimi Code CLI. OmniRoute utiliza el flujo OAuth de la CLI y los endpoints de Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Nivel gratuito: 50 créditos/mes (~25K–100K tokens). ⚠️ Los términos de servicio de Kiro prohíben el uso de proxies o arneses de terceros. | +| `openference` | `of` | Openference | OAuth | [enlace](https://openference.com) | Inicia sesión con tu cuenta de Openference para enrutar solicitudes a través de api.openference.com. Incluye acceso gratuito a Qwen3.8 27b y Llama 3.2 3B; consulta openference.com/pricing para conocer las condiciones actuales del plan. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [enlace](https://trae.ai) | Trae es un IDE nativo de IA de ByteDance (agente remoto SOLO). Autoriza mediante trae.ai en la ventana emergente o inicia sesión en solo.trae.ai y pega el Cloud-IDE-JWT (enviado como 'Authorization: Cloud-IDE-JWT ', con una validez de unos 14 días) como token de acceso; web_id/biz_user_id/user_unique_id/scope/tenant/region se propagan mediante providerSpecificData. Los tokens pegados no se actualizan en modo sin interfaz gráfica: vuelve a pegarlos cuando caduquen. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [enlace](https://x.ai) | Inicia sesión con xAI para utilizar modelos de api.x.ai como Grok 4.5. Esto es independiente de las sesiones JWT de Grok Build, que utilizan cli-chat-proxy.grok.com y alias de modelos de grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [enlace](https://zed.dev) | Zed almacena las credenciales de los proveedores de LLM (OpenAI, Anthropic, Google, Mistral, xAI) en el llavero del sistema operativo. Utiliza el botón Importar que aparece a continuación para detectarlas e importarlas automáticamente. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [enlace](https://zed.dev) | Inicia sesión con tu cuenta de Zed (inicio de sesión de aplicación nativa). OmniRoute genera un par de claves RSA de un solo uso y abre zed.dev para autorizarlo; en una instalación remota/sin interfaz gráfica, copia la URL de callback 127.0.0.1 resultante desde la barra de direcciones de tu navegador y pégala aquí. Es distinto de la entrada de importación de credenciales 'Zed IDE' anterior: este servicio canaliza las finalizaciones de chat mediante el propio agregador de modelos alojado de Zed (cloud.zed.dev), que proporciona acceso a modelos de Anthropic/OpenAI/Google/xAI bajo tu plan de Zed. | ## Proveedores de cookies web (34) @@ -117,250 +117,250 @@ Use el panel en `/dashboard/providers` para habilitar, configurar y probar cada ## Proveedores de claves de API (de pago / de pago con créditos gratuitos) (242) -| ID | Alias | Nombre | Etiquetas | Sitio web | Notas | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | Clave de API | [enlace](https://ai.360.cn) | Obtén una clave de API en ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | Clave de API, agregador | [enlace](https://agentrouter.org) | $200 en créditos gratuitos al registrarse: puerta de enlace de enrutamiento multimodelo | -| `agnes` | `agnes` | Agnes AI | Clave de API, vídeo | [enlace](https://agnes-ai.com) | Obtén una clave de API en agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (China) | Clave de API | [enlace](https://api.agnes-ai.cn) | Obtén una clave de API en el sitio de Agnes CN. | -| `ai21` | `ai21` | AI21 Labs | Clave de API | [enlace](https://www.ai21.com) | $10 en créditos de prueba al registrarse (válidos durante 3 meses); no se requiere tarjeta de crédito | -| `aimlapi` | `aiml` | AI/ML API | Clave de API, agregador | [enlace](https://aimlapi.com) | Nivel gratuito suspendido (2026): AI/ML API ahora solo ofrece pago por uso (recarga mínima de $20); no hay créditos gratuitos recurrentes. | -| `ainative` | `ainative` | AINative Studio | Clave de API | [enlace](https://ainative.studio) | Crea una clave de API gratuita en ainative.studio (sin tarjeta) y, a continuación, pégala aquí como token Bearer. | -| `aion` | `aion` | Aion Labs | Clave de API | [enlace](https://www.aionlabs.ai) | Crea una clave de API gratuita en aionlabs.ai (sin tarjeta) y, a continuación, pégala aquí como token Bearer. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | Clave de API | [enlace](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (China) | Clave de API | [enlace](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Clave de API | [enlace](https://developer.ant-ling.com/en/docs/) | Regístrate y crea una clave de API en la consola de API de Ant Ling (https://chat.ant-ling.com/open); después, pégala aquí. OmniRoute enruta el tráfico de chat a https://api.ant-ling.com/v1/chat/completions; el proveedor es compatible con OpenAI y también ofrece una interfaz compatible con Anthropic. | -| `anthropic` | `anthropic` | Anthropic | Clave de API | [enlace](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | Clave de API, agregador | [enlace](https://anyapi.ai) | Plan gratuito: 100 000 tokens ANY al día y 100 RPM para los modelos Free/Basic elegibles; no se requiere tarjeta de crédito. | -| `api-airforce` | `af` | Api.airforce | Clave de API | [enlace](https://api.airforce) | 55 modelos del nivel gratuito, incluidos Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash y DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | Clave de API | [enlace](https://arcee.ai) | Obtén una clave de API en arcee.ai | -| `auriko` | `auriko` | Auriko | Clave de API, agregador | [enlace](https://www.auriko.ai) | El plan gratuito ofrece 1000 RPM de plataforma y 10 000 RPM de BYOK. La inferencia de la plataforma sigue teniendo el coste del proveedor; no se trata de un fondo de tokens gratuitos ni de inferencia gratuita ilimitada. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | Clave de API, empresarial | [enlace](https://learn.microsoft.com/azure/ai-foundry) | Usa tu clave de Azure AI Foundry. La URL base puede ser https://.services.ai.azure.com/openai/v1/ o https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | Clave de API, empresarial | [enlace](https://azure.microsoft.com/products/ai-services/openai-service) | Usa tu clave de API de Azure OpenAI. La URL base debe ser el punto de conexión de tu recurso; por ejemplo, https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | Clave de API | [enlace](https://b.ai) | Clave de API Bearer para la puerta de enlace de LLM de b.ai compatible con OpenAI (distinta de TheB.AI). Crea una clave en https://docs.b.ai y, a continuación, usa https://api.b.ai/v1 como URL base compatible con OpenAI. | -| `baichuan` | `baichuan` | Baichuan | Clave de API | [enlace](https://www.baichuan-ai.com/) | Obtén una clave de API en platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | Clave de API | [enlace](https://ernie.baidu.com/) | Obtén una clave de API en console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Clave de API | [enlace](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | Clave de API | [enlace](https://baseten.co) | $30 en créditos de prueba gratuitos para inferencia con GPU | -| `bazaarlink` | `bzl` | BazaarLink | Clave de API | [enlace](https://bazaarlink.ai) | Usa tu clave de API de BazaarLink (empieza por sk-bl-) en Authorization: Bearer . El SDK de OpenAI funciona con la URL base https://bazaarlink.ai/api/v1. Los modelos utilizan el formato proveedor/nombre-del-modelo. | -| `bedrock` | `bedrock` | Amazon Bedrock | Clave de API, empresarial | [enlace](https://aws.amazon.com/bedrock) | Usa tu clave de API de Amazon Bedrock y configura la región de AWS en la que estén habilitados tus modelos (por ejemplo, eu-west-2). OmniRoute llama directamente a la API nativa Converse de Bedrock. | -| `black-forest-labs` | `bfl` | Black Forest Labs | Clave de API, imagen | [enlace](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | Clave de API | [enlace](https://blackbox.ai) | ⚠️ **OBSOLETO.** api.blackbox.ai devuelve HTTP 404 en todas las variantes de ruta (comprobación del 2026-08-21); la interfaz pública de inferencia se ha trasladado al punto de conexión restringido enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | Clave de API | [enlace](https://www.bluesminds.com) | Créditos pi diarios gratuitos; admite más de 200 modelos, incluidos GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen y Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | Clave de API | [enlace](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | Clave de API | [enlace](https://bytez.com) | $1 en créditos gratuitos, renovados cada 4 semanas | -| `cerebras` | `cerebras` | Cerebras | Clave de API | [enlace](https://inference.cerebras.ai) | Crédito único de $5 al registrarse (válido durante 30 días); se requiere un método de pago. No es un nivel gratuito recurrente. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | Clave de API | [enlace](https://hyper.charm.land) | 100 Hypercredits mensuales gratuitos al registrarse | -| `chat-oripe` | `chat-oripe` | Chat Oripe | Clave de API, agregador | [enlace](https://api.oriper.com) | Los metadatos oficiales anuncian 2 millones de tokens al mes, pero el sitio público y la documentación estaban bloqueados durante la auditoría; considera que la cuota y la correspondencia de la marca no están confirmadas. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | Clave de API, agregador | [enlace](https://chatanywhere.tech) | Solo para uso personal, educativo o de investigación: la documentación pública indica 10 000 puntos/día y 200 solicitudes/día por IP/clave; no debe utilizarse para tráfico comercial. | -| `cheaperinference` | `cinf` | Cheaper Inference | Clave de API | [enlace](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | Clave de API | [enlace](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | Clave de API, agregador | [enlace](https://chutes.ai) | Clave de API de tipo Bearer para la puerta de enlace de Chutes compatible con OpenAI. | -| `clarifai` | `clarifai` | Clarifai | Clave de API, empresarial | [enlace](https://docs.clarifai.com) | Utilice su PAT de Clarifai o una clave de API específica de la aplicación. OmniRoute utiliza el endpoint compatible con OpenAI en https://api.clarifai.com/v2/ext/openai/v1 y se autentica mediante Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Clave de API, agregador | [enlace](https://cloudcode.one) | Los modelos gratuitos publicados incluyen glm-4.7-flash y glm-4.6v-flash; no se publica ninguna cuota numérica y la creación de claves puede requerir crédito o un cupón. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Clave de API | [enlace](https://developers.cloudflare.com/workers-ai) | Requiere un token de API Y un ID de cuenta (disponible en dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | Clave de API | [enlace](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | Clave de API | [enlace](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | Clave de API | [enlace](https://cohere.com) | Prueba gratuita: 1000 llamadas a la API/mes para realizar pruebas, sin necesidad de tarjeta de crédito | -| `command-code` | `cmd` | Command Code | Clave de API | [enlace](https://commandcode.ai/) | Utilice una clave de API de Command Code. Las solicitudes se envían al endpoint /provider/v1/chat/completions de Command Code. | -| `coze` | `coze` | Coze | Clave de API | [enlace](https://coze.com) | Obtenga una clave de API en coze.com/open/api | -| `crof` | `crof` | CrofAI | Clave de API | [enlace](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | Clave de API | [enlace](https://cursor.com/dashboard/api) | Pegue una clave de API de usuario de Cursor (crsr_...) de cursor.com/dashboard/api. OmniRoute la intercambia por un token de sesión cuando sea necesario; no es necesario instalar el IDE ni cursor-agent. El uso se factura al plan de Cursor al que pertenece la clave. | -| `dahl` | `dahl` | Dahl | Clave de API | [enlace](https://inference.dahl.global) | Haga clic en «Add Account» para generar automáticamente un token o añada una clave de API manual. | -| `databricks` | `databricks` | Databricks | Clave de API, empresarial | [enlace](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | Clave de API, empresarial | [enlace](https://docs.datarobot.com) | Utilice su token de API de DataRobot. La URL base opcional puede ser la raíz de la cuenta (para LLM Gateway) o una URL de implementación bajo /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | Clave de API, imagen | [enlace](https://deepai.org) | Utilice su clave de API de DeepAI. Obtenga una en deepai.org; requiere una suscripción Pro (9,99 USD/mes). | -| `deepinfra` | `deepinfra` | DeepInfra | Clave de API | [enlace](https://deepinfra.com) | Créditos gratuitos al registrarse para probar la API y explorar modelos | -| `deepseek` | `ds` | DeepSeek | Clave de API | [enlace](https://platform.deepseek.com) | 5 millones de tokens gratuitos al registrarse, sin necesidad de tarjeta de crédito | -| `dgrid` | `dgrid` | DGrid | Clave de API | [enlace](https://dgrid.ai) | Enrutador de modelos gratuitos de DGrid: 10 solicitudes/minuto y 100 solicitudes/día. Una recarga única de 5 USD desbloquea hasta 20 solicitudes/minuto y 1000 solicitudes/día. | -| `dify` | `dify` | Dify | Clave de API | [enlace](https://dify.ai) | Obtenga la clave de API de su instancia de Dify. | -| `digitalocean` | `digitalocean` | DigitalOcean | Clave de API | [enlace](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | Clave de API | [enlace](https://dit.ai) | Utilice su clave de API de dit.ai en Authorization: Bearer . Totalmente compatible con OpenAI: sirve como sustituto directo; solo debe cambiar la URL base a https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | Clave de API | [enlace](https://doubao.com) | Obtenga una clave de API en console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | Clave de API, agregador | [enlace](https://www.dxnt.com) | Las cuentas gratuitas tienen un límite documentado de 100 llamadas/día; la cuota puede aumentar mediante invitaciones y variar según la cuenta. | -| `electronhub` | `electronhub` | Electron Hub | Clave de API, agregador | [enlace](https://www.electronhub.ai) | Plan gratuito: 5 RPM, 0,25 USD en créditos semanales y 10 neutrinos/día para los modelos con el sufijo :free; también se aplican presupuestos por familia. | -| `empower` | `empower` | Empower | Clave de API, agregador | [enlace](https://docs.empower.dev) | Clave de API de tipo Bearer para el endpoint de Empower compatible con OpenAI. | -| `eurouter` | `eurouter` | EURouter | Clave de API, agregador | [enlace](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | Clave de API | [enlace](https://factory.ai) | Clave de API de tipo Bearer para la puerta de enlace de Factory compatible con OpenAI. | -| `fal-ai` | `fal` | Fal.ai | Clave de API, imagen | [enlace](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | Clave de API, agregador | [enlace](https://fastrouter.ai) | Los modelos con el sufijo :free permiten 10 solicitudes/día por organización y modelo; la disponibilidad puede cambiar. | -| `featherless-ai` | `featherless` | Featherless AI | Clave de API | [enlace](https://featherless.ai) | Nivel gratuito disponible, sin necesidad de tarjeta de crédito | -| `fenayai` | `fenayai` | FenayAI | Clave de API, agregador | [enlace](https://fenayai.com) | Clave de API de tipo Bearer para la puerta de enlace de FenayAI compatible con OpenAI. | -| `fireworks` | `fireworks` | Fireworks AI | Clave de API | [enlace](https://fireworks.ai) | 1 USD en créditos iniciales gratuitos al registrarse para probar la API | -| `free-ai` | `free-ai` | Free.ai | Clave de API, agregador | [enlace](https://free.ai) | 30 000 tokens/día cubren los modelos autoalojados tras verificar el correo electrónico. El uso que supere este límite puede facturarse al coste real y los modelos externos prémium son de pago. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | Clave de API | [enlace](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | Clave de API | [enlace](https://freebuff.com) | Introduce el token de autenticación de Freebuff / Codebuff (obtenido mediante el inicio de sesión en la CLI o un recolector automatizado). | -| `freeinference` | `freeinference` | FreeInference | Clave de API, agregador | [enlace](https://freeinference.org) | Acceso gratuito para investigación sin tarjeta; los solicitantes que no pertenezcan a Harvard requieren aprobación manual y no se garantiza públicamente ninguna cuota numérica. | -| `freemodel-dev` | `fmd` | FreeModel.dev | Clave de API | [enlace](https://freemodel.dev) | $300 en créditos gratuitos al registrarse, sin necesidad de tarjeta de crédito. Acceso a GPT-5.4 y GPT-5.5 (los modelos insignia más recientes de OpenAI) mediante una API compatible con OpenAI. | -| `freetheai` | `fta` | FreeTheAi | Clave de API, agregador | [enlace](https://freetheai.xyz) | Únete al Discord de FreeTheAi para obtener tu clave de API gratuita. | -| `friendliai` | `friendli` | FriendliAI | Clave de API | [enlace](https://friendli.ai) | Nivel gratuito para inferencia sin servidor, sin necesidad de tarjeta de crédito | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o utiliza una clave de miembro de g4f.dev (crea una en g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o utiliza una clave de miembro de g4f.dev (crea una en g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o utiliza una clave de miembro de g4f.dev (crea una en g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o utiliza una clave de miembro de g4f.dev (crea una en g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o utiliza una clave de miembro de g4f.dev (crea una en g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | Clave de API | [enlace](https://galadriel.com) | ⚠️ **OBSOLETO.** api.galadriel.ai ya no se resuelve (comprobación del 2026-06-19); la API de inferencia parece haber sido descontinuada. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | Clave de API | [enlace](https://aistudio.google.com) | Nivel gratuito disponible mediante Google AI Studio; se aplican las cuotas actuales de cada modelo y los límites regionales | -| `getgoapi` | `ggo` | GoAPI | Clave de API, agregador | [enlace](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | Clave de API | [enlace](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | Clave de API | [enlace](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Token de acceso personal de GitLab para la API pública de Code Suggestions. Configura una URL base autoalojada cuando no utilices gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Clave de API | [enlace](https://opengateway.gitlawb.com) | El acceso gratuito a MiMo (xiaomi/mimo-v2.5) fue revocado en 2026-05; Opengateway es ahora una pasarela de créditos de pago por uso, sin ningún modelo gratuito recurrente. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Clave de API | [enlace](https://opengateway.gitlawb.com) | La promoción gratuita de Nemotron terminó en 2026-06; la ruta de GMI Cloud ahora solo admite créditos de pago por uso. | -| `glm` | `glm` | GLM Coding | Clave de API | [enlace](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | Clave de API | [enlace](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | Clave de API | [enlace](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | Clave de API | [enlace](https://greenpt.com) | La suscripción a la API puede crearse gratuitamente; la inferencia se factura por token. No se publica ninguna asignación de inferencia gratuita. | -| `groq` | `groq` | Groq | Clave de API | [enlace](https://groq.com) | Plan gratuito: límites por modelo (200K tokens/día por modelo de chat; consulta console.groq.com/docs/rate-limits para conocer los valores de RPM/RPD), sin ningún método de pago registrado. | -| `haiper` | `hp` | Haiper | Clave de API, vídeo | [enlace](https://haiper.ai) | Obtén la clave de API en haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | Clave de API | [enlace](https://api.hcnsec.cn) | Obtén la clave de API en api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | Clave de API, agregador | [enlace](https://helixmind.online) | Las afirmaciones difundidas anteriormente sobre 3 RPM/50 RPD y la ausencia de tarjeta no se confirmaron durante la auditoría del 2026-08-02; la cuota y la facturación actuales requieren verificar la cuenta. | -| `helyxai` | `helyxai` | Helyx AI | Clave de API, agregador | [enlace](https://helyxai.space) | El plan gratuito operativo documenta 100,000 tokens/día; la afirmación publicitaria independiente del sitio de más de 2M entra en conflicto y no se considera una garantía de cuota. | -| `heroku` | `heroku` | Heroku AI | Clave de API, empresarial | [enlace](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | Clave de API | [enlace](https://huggingface.co) | API de inferencia gratuita para miles de modelos (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | Clave de API | [enlace](https://hyperbolic.xyz) | Entre $1 y $5 en créditos de prueba al registrarse para inferencia sin servidor | -| `ideogram` | `ideo` | Ideogram | Clave de API | [enlace](https://ideogram.ai) | Obtén la clave de API en ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | Clave de API | [enlace](https://xinghuo.xfyun.cn) | Obtén la clave de API en console.xfyun.cn | -| `inception` | `inception` | Inception | Clave de API | [enlace](https://docs.inceptionlabs.ai) | 10M de tokens gratuitos al registrarse, sin necesidad de tarjeta de crédito. | -| `inference-net` | `inet` | Inference.net | Clave de API | [enlace](https://inference.net) | $25 en créditos gratuitos al registrarse, además de subvenciones disponibles para investigación | -| `internlm` | `internlm` | InternLM (Intern-S1) | Clave de API | [enlace](https://internlm.intern-ai.org.cn/) | Cuota mensual gratuita de ~1M de tokens de entrada / 3M de tokens de salida (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (API de Foundation) | Clave de API, embedding/reranking | [enlace](https://jina.ai) | Clave de API Bearer para api.jina.ai: embeddings, reranking, clasificación, segmentación y búsqueda. Las claves del panel tienen prioridad sobre JINA_AI_API_KEY. Esta no es la tarjeta de Reader / r.jina.ai y no obtiene URLs. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Clave de API | [enlace](https://jina.ai/reader) | Clave de API Bearer para la conversión de URL a Markdown de r.jina.ai (solo /v1/web/fetch). No ofrece /v1/embeddings ni /v1/rerank. Funciona el mismo token de Jina que para la API de Foundation; OmniRoute reutiliza una clave del panel de jina-ai o JINA_AI_API_KEY cuando esta tarjeta está vacía. | -| `kenari` | `kenari` | Kenari | Clave de API | [enlace](https://kenari.id) | Usa tu clave de API de Kenari (kn-...) en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | Clave de API | [enlace](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | Clave de API, agregador | [enlace](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (API heredada de Moonshot) | Clave de API | [enlace](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Clave de API de Kimi Code | Clave de API | [enlace](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | Clave de API | [enlace](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | Clave de API, agregador | [enlace](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | Clave de API, vídeo | [enlace](https://leonardo.ai) | Obtén una clave de API en leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | Clave de API | [enlace](https://liquid.ai) | Obtén una clave de API en liquid.ai | -| `literouter` | `literouter` | LiteRouter | Clave de API, agregador | [enlace](https://literouter.com) | Las variantes gratuitas de los modelos usan el sufijo :free; los límites de crédito diarios varían según el modelo y la entrada gratuita está limitada a 5,000 tokens. | -| `llamagate` | `llamagate` | LlamaGate | Clave de API | [enlace](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Clave de API, agregador | [enlace](https://llm.kiwi) | El plan gratuito ofrece auto y hrLLM; el límite publicado de 40 solicitudes/hora se aplica a hrLLM. | -| `llm7` | `llm7` | LLM7.io | Clave de API | [enlace](https://llm7.io) | Usa cualquier clave que no esté vacía (por ejemplo, 'unused'). Si los modelos integrados más antiguos devuelven model_unavailable, usa Available Models → Import from /models o Auto-Sync; modelo activo verificado: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | Clave de API, agregador | [enlace](https://llmgateway.io) | Plan gratuito alojado: los modelos con precio gratuito están limitados a 5 solicitudes cada 10 minutos cuando la cuenta no tiene créditos. | -| `logfare` | `logfare` | Logfare | Clave de API, agregador | [enlace](https://logfare.ai) | Crea una cuenta gratuita en https://logfare.ai/register (nombre de usuario/contraseña, sin verificación de correo electrónico) para obtener una clave de API al instante y, a continuación, pégala aquí como token Bearer. | -| `longcat` | `lc` | LongCat AI | Clave de API | [enlace](https://longcat.chat/platform/docs) | Gratis: asignación única de 10M tokens después de registrar la cuenta y completar la verificación KYC (LongCat-2.0). Solo una vez; no es una asignación diaria/mensual recurrente. | -| `magnific` | `freepik` | Magnific | Clave de API, imagen | [enlace](https://www.magnific.com) | Obtén una clave de API en magnific.com/user/api-keys (encabezado x-magnific-api-key). Las claves heredadas para desarrolladores de Freepik siguen funcionando. | -| `maritalk` | `maritalk` | Maritalk | Clave de API | [enlace](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | Clave de API, agregador | [enlace](https://meganova.ai) | Registro gratuito sin tarjeta. Las cuotas publicadas de nivel 1 por modelo suman 550 solicitudes/día; no forman un fondo global compartido y pueden aplicarse cargos por exceso si están habilitados. | -| `meta-llama` | `meta` | API de Meta Llama | Clave de API | [enlace](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | Clave de API, vídeo | [enlace](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (China) | Clave de API | [enlace](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | Clave de API | [enlace](https://mistral.ai) | Nivel gratuito Experiment: acceso con límites de frecuencia a todos los modelos, sin necesidad de tarjeta de crédito | -| `mixedbread` | `mxbai` | Mixedbread AI | Clave de API | [enlace](https://www.mixedbread.com) | Clave de API Bearer para la API de embeddings de Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | Clave de API, agregador | [enlace](https://www.mixlayer.com) | El modelo qwen/qwen3.5-4b-free es gratuito para la creación de prototipos y tiene límites de frecuencia; no se ha confirmado un límite público fijo de RPM ni una cuota diaria. | -| `mnn-ai` | `mnn-ai` | MNN AI | Clave de API, agregador | [enlace](https://mnnai.ru) | Plan gratuito: $1 en créditos mensuales, 10 RPM y acceso únicamente a los modelos marcados como Free. | -| `modal` | `mdl` | Modal | Clave de API, empresarial | [enlace](https://modal.com/docs) | Usa el token Bearer que protege tu implementación de Modal, si está habilitado. La URL base debe apuntar a tu aplicación de Modal compatible con OpenAI, por ejemplo, https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | Clave de API | [enlace](https://modelscope.cn) | Nivel gratuito mediante ModelScope API-Inference; se requiere una cuenta de Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | Clave de API | [enlace](https://monsterapi.ai) | ⚠️ **OBSOLETO.** Monster API cesó sus operaciones el 2026-06-30. Usa proveedores alternativos compatibles con OpenAI. | -| `moonshot` | `moonshot` | Kimi | Clave de API | [enlace](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | Clave de API | [enlace](https://morphllm.com) | Nivel gratuito: 250K créditos/mes, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | Clave de API | [enlace](https://github.com/meta-llama/llama-stack) | Usa tu variable de entorno META_API_KEY como token Bearer. La CLI de Muse Code usa el formato de transmisión de la API Responses de OpenAI (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | Clave de API, agregador | [enlace](https://naga.ac) | Obtén una clave de API en naga.ac; puedes registrarte con Google/GitHub/Discord. | -| `naga-ai` | `naga-ai` | Naga AI | Clave API, agregador | [enlace](https://naga.ac) | Los modelos marcados con :free aparecen públicamente, pero no se confirma ninguna cuota numérica. La política de Naga advierte que los prompts y las respuestas del nivel gratuito pueden recopilarse o utilizarse para entrenamiento. | -| `nanogpt` | `nanogpt` | NanoGPT | Clave API | [enlace](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | Clave API | [enlace](https://bynara.id) | Crea una cuenta gratuita de NaraRouter, vincula tu Telegram (obligatorio antes de recibir respuestas de /v1) y, a continuación, pega aquí la clave como token Bearer. | -| `navy` | `navy` | NavyAI | Clave API | [enlace](https://api.navy) | Crea una clave API gratuita desde el panel de NavyAI y, a continuación, pégala aquí como token Bearer. | -| `nebius` | `nebius` | Nebius AI | Clave API | [enlace](https://nebius.com) | Aproximadamente $1 en créditos de prueba al registrarte para probar la API | -| `nlpcloud` | `nlpc` | NLP Cloud | Clave API | [enlace](https://docs.nlpcloud.com) | Usa tu clave API de NLP Cloud en Authorization: Token . De forma predeterminada, OmniRoute utiliza el endpoint de chatbot en https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | Clave API | [enlace](https://nomic.ai) | Obtén una clave API en atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | Clave API | [enlace](https://portal.nousresearch.com/help) | Usa tu clave API de Nous Portal. OmniRoute utiliza el endpoint oficial de inferencia compatible con OpenAI en https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | Clave API, vídeo, agregador | [enlace](https://novita.ai) | $0.50 en créditos de prueba al registrarte (válidos durante aproximadamente 1 año) | -| `nscale` | `nscale` | nScale | Clave API | [enlace](https://nscale.com) | $5 en créditos gratuitos al registrarte para realizar pruebas de inferencia | -| `nube` | `nube` | Nube.sh | Clave API | [enlace](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | Clave API | [enlace](https://build.nvidia.com) | Acceso gratuito para desarrollo: ~40 RPM, más de 70 modelos (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | Clave API, empresarial | [enlace](https://www.oracle.com/artificial-intelligence/generative-ai) | Usa tu clave API de OCI Generative AI o un token Bearer de IAM. La URL base puede ser https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | Clave API, agregador | [enlace](https://ofox.ai) | El catálogo actual anuncia más de 10 modelos gratuitos sin una cuota numérica pública; revisa la procedencia ascendente y las condiciones de retención y entrenamiento antes de usarlo en producción. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Clave API | [enlace](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | Clave API | [enlace](https://1min.ai) | Crea una clave API en https://docs.1min.ai/docs/api/create-api-key y, a continuación, pégala aquí. | -| `openadapter` | `oad` | OpenAdapter | Clave API | [enlace](https://openadapter.dev) | Usa tu clave API de OpenAdapter en Authorization: Bearer sk-cv-. Totalmente compatible con OpenAI. URL base de la API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | Clave API | [enlace](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | Clave API | [enlace](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | Clave API | [enlace](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | Clave API | [enlace](https://openference.com) | Plan gratuito: prueba de 3 días con modelos de código abierto, sin necesidad de tarjeta de crédito | -| `openrouter` | `openrouter` | OpenRouter | Clave API, agregador | [enlace](https://openrouter.ai) | Modelos gratuitos a $0/token con el sufijo :free: 20 RPM/200 RPD | -| `openvecta` | `openvecta` | OpenVecta | Clave API | [enlace](https://openvecta.com) | Créditos gratuitos al registrarte para realizar inferencias compatibles con OpenAI en LLM, embeddings y modelos de razonamiento | -| `opper` | `opper` | Opper | Clave API, agregador | [enlace](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | Clave API | [enlace](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | Clave API | [enlace](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | Clave API | [enlace](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Clave API | [enlace](https://www.perplexity.ai) | Usa tu clave API de Perplexity. OmniRoute dirige los ID de modelo de Agent API a través del endpoint de Perplexity compatible con Responses. | -| `piapi` | `pi` | PiAPI | Clave API, agregador | [enlace](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | Clave API | [enlace](https://pioneer.ai) | $75 en créditos de uso gratuitos, sin necesidad de tarjeta de crédito | -| `plamo` | `plamo` | PLaMo | Clave API | [enlace](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | Clave API, agregador | [enlace](https://creator.poe.com/api-reference) | Clave API Bearer para la API de Poe compatible con OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | Clave API, agregador | [enlace](https://poixe.com) | Los límites gratuitos públicos actuales son reducidos y específicos para cada grupo de modelos: 2 RPM/5 RPD para modelos large-cup y 20 RPM/50 RPD para modelos small-cup. | -| `pollinations` | `pol` | Pollinations AI | Clave API, vídeo | [enlace](https://pollinations.ai) | El acceso anónimo/sin clave a los modelos gratuitos documentados se ofrece sin garantías. La verificación local de v3.8.50 (2026-07-31) devolvió 401 mediante OmniRoute y Cloudflare 1010 en las solicitudes directas al proveedor ascendente desde la misma red. Los modelos prémium siguen requiriendo una clave API de Pollinations obtenida en enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | Clave API | [enlace](https://poolside.ai) | Laguna S 2.1 y XS 2.1 son gratuitos durante la vista previa; no se publica ninguna cuota numérica. | -| `predibase` | `predibase` | Predibase | Clave API | [enlace](https://predibase.com) | ⚠️ **OBSOLETO.** serving.app.predibase.com ya no se resuelve (comprobación de 2026-06-19); la API de servicio gestionado parece haberse descontinuado. | -| `publicai` | `publicai` | PublicAI | Clave API | [enlace](https://publicai.co) | Requiere una clave API: crédito único al registrarte y, después, es de pago | -| `qianfan` | `qianfan` | Baidu Qianfan | Clave API | [enlace](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | Clave de API | [enlace](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | Clave de API | [enlace](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Clave de API | [enlace](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | Clave de API, imagen | [enlace](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | Clave de API | [enlace](https://regolo.ai) | Obtén tu clave de API de Regolo en regolo.ai y pégala aquí como token Bearer. | -| `reka` | `reka` | Reka | Clave de API | [enlace](https://docs.reka.ai/chat/overview) | Usa tu clave de API de Reka. OmniRoute admite la URL base compatible con OpenAI https://api.reka.ai/v1 y envía tanto el encabezado Authorization como X-Api-Key para garantizar la compatibilidad. | -| `requesty` | `requesty` | Requesty | Clave de API | [enlace](https://requesty.ai) | Nivel gratuito de unas 200 solicitudes al día: puerta de enlace de enrutamiento multimodelo (más de 300 modelos) | -| `routeway` | `routeway` | Routeway | Clave de API | [enlace](https://routeway.ai) | Crea una clave de API gratuita en routeway.ai y pégala aquí como token Bearer. | -| `runwayml` | `runway` | Runway | Clave de API, vídeo | [enlace](https://docs.dev.runwayml.com) | Usa tu clave de API de Runway en Authorization: Bearer . OmniRoute utiliza la API actual de Runway en https://api.dev.runwayml.com/v1 y envía automáticamente el encabezado X-Runway-Version requerido. | -| `sambanova` | `samba` | SambaNova | Clave de API | [enlace](https://sambanova.ai) | $5 en créditos gratuitos al registrarte (válidos durante 30 días), sin necesidad de tarjeta de crédito | -| `sap` | `sap` | SAP Generative AI Hub | Clave de API, empresarial | [enlace](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Usa tu token Bearer de SAP AI Core. La URL base puede ser la raíz de tu AI_API_URL o una deploymentUrl de Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | Clave de API | [enlace](https://docs.sarvam.ai) | ₹1,000 en créditos gratuitos al registrarte, que nunca caducan | -| `scaleway` | `scw` | Scaleway AI | Clave de API | [enlace](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 millón de tokens gratuitos para cuentas nuevas; conforme con la UE y el RGPD (París), Qwen3 235B y Llama 70B | -| `sealion` | `sealion` | SEA-LION | Clave de API | [enlace](https://sea-lion.ai) | Inicia sesión en sea-lion.ai con Google (sin tarjeta ni restricciones regionales), crea una clave de API y pégala aquí. | -| `seekai` | `ska` | SeekAi | Clave de API, agregador | [enlace](https://seekai.cc) | Crea una clave de API en https://seekai.cc y pégala aquí como token Bearer. | -| `segmind` | `segmind` | Segmind | Clave de API, imagen, vídeo | [enlace](https://segmind.com) | Usa tu clave de API de Segmind en el encabezado x-api-key. OmniRoute utiliza https://api.segmind.com/v1/ y devuelve directamente los bytes de la imagen o el vídeo generados. | -| `sensenova` | `sensenova` | SenseNova | Clave de API | [enlace](https://platform.sensenova.cn) | Obtén una clave de API en platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | Clave de API | [enlace](https://cloud.siliconflow.com) | $1 en créditos gratuitos, además de los modelos de $0 incluidos actualmente tras verificar la identidad; la disponibilidad y los límites pueden cambiar | -| `snowflake` | `snowflake` | Snowflake Cortex | Clave de API, empresarial | [enlace](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | Clave de API | [enlace](https://xinghuo.xfyun.cn) | Obtén una clave de API en console.xfyun.cn | -| `speka` | `speka` | Speka AI | Clave de API, agregador | [enlace](https://speka.me) | Plan gratuito: $1 de uso mensual, 10 RPM, una clave de API y acceso a modelos abiertos y al entorno de pruebas; no se requiere tarjeta. | -| `stability-ai` | `stability` | Stability AI | Clave de API, imagen | [enlace](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | Clave de API | [enlace](https://stepfun.com) | Obtén una clave de API en platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | Clave de API | [enlace](https://ai.sumopod.com) | Usa tu clave de API de SumoPod (sk-...) en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | Clave de API | [enlace](https://suno.ai) | Pega la cookie de sesión de suno.ai (autenticación de Clerk) | -| `synthetic` | `synthetic` | Synthetic | Clave de API, agregador | [enlace](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | Clave de API, agregador | [enlace](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | Clave de API | [enlace](https://hunyuan.tencent.com) | Obtén una clave de API en console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | Clave de API, agregador | [enlace](https://theb.ai) | Clave de API Bearer para la puerta de enlace de TheB.AI compatible con OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | Clave de API | [enlace](https://docs.tinyfish.ai/fetch-api) | X-API-Key de agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | Clave de API, vídeo | [enlace](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | Clave de API | [enlace](https://agent-router.gaib.ai) | Usa tu clave de API de Token Kiosk en Authorization: Bearer . Puerta de enlace totalmente compatible con OpenAI. URL base de la API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | Clave de API, agregador | [enlace](https://www.tokenreply.com) | Los modelos etiquetados como gratuitos tienen límites diarios específicos según el modelo y la campaña; no se publica una cuota gratuita global fija. | -| `tokenrouter` | `trk` | TokenRouter | Clave de API | [enlace](https://tokenrouter.com) | Usa tu clave de API de TokenRouter en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | Clave de API, imagen | [enlace](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | Clave de API | [enlace](https://docs.opentyphoon.ai) | Clave de API gratuita con un límite de velocidad de 5 solicitudes/s y 200 solicitudes/min. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Clave de API | [enlace](https://uncensored.com) | Usa tu clave de la API para desarrolladores de uncensored.com (uai_sk_live_...). OmniRoute la envía como el encabezado X-api-key al endpoint compatible con OpenAI https://api.uncensored.com/api/v1. La clave nunca caduca. Esta es la modalidad con medición/créditos; el chat de suscripción sin medición corresponde al proveedor independiente 'uc'. | -| `udio` | `udio` | Udio | Clave de API | [enlace](https://udio.com) | Pega la cookie de sesión de udio.com (autenticación de Supabase) | -| `unorouter` | `unorouter` | UnoRouter | Clave de API, agregador | [enlace](https://unorouter.ai) | Los modelos con el sufijo :free no consumen saldo; el límite es de 1 solicitud/minuto por modelo gratuito y usuario. | -| `upstage` | `upstage` | Upstage | Clave de API | [enlace](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | Clave de API | [enlace](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | Clave de API | [enlace](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Clave de API, agregador | [enlace](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | Clave de API, empresarial | [enlace](https://cloud.google.com/vertex-ai) | Proporciona el JSON de una cuenta de servicio, un token de acceso OAuth, una clave de API de Vertex Express o una clave de autorización vinculada a una cuenta de servicio. El modo Express solo admite Gemini; los modelos de socios requieren credenciales asociadas a un proyecto. | -| `vertex-partner` | `vp` | Vertex AI Partners | Clave de API, empresarial | [enlace](https://cloud.google.com/vertex-ai) | Proporciona el JSON de una cuenta de servicio o credenciales OAuth. Una clave de autorización vinculada a una cuenta de servicio también permite la detección, pero la inferencia con modelos de socios requiere además el ID de su proyecto de Google Cloud. Las claves estándar de Express solo admiten Gemini. | -| `void-ai` | `void-ai` | Void AI | Clave de API, agregador | [enlace](https://voidai.app) | El catálogo público de modelos marca algunos modelos con el requisito de un plan gratuito, pero el acceso es condicional y no se ha confirmado ninguna cuota numérica. | -| `volcengine` | `volcengine` | Volcengine | Clave de API | [enlace](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Clave de API | [enlace](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Conecta tu cuenta de Volcano Engine o usa una clave de API de una suscripción a Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Clave de API | [enlace](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Conecta tu cuenta de Volcano Engine o usa una clave de API de una suscripción a Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | Clave de API, embeddings/reordenación | [enlace](https://www.voyageai.com) | Clave de API Bearer para las API de embeddings y reordenación de Voyage AI. | -| `wafer` | `wafer` | Wafer AI | Clave de API | [enlace](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | Clave de API | [enlace](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Clave de API, empresarial | [enlace](https://www.ibm.com/products/watsonx-ai) | Usa tu token Bearer de watsonx. La URL base puede ser https://.ml.cloud.ibm.com/ml/gateway/v1/ o un endpoint autogestionado /ml/gateway/v1. | -| `writer` | `writer` | Writer | Clave de API | [enlace](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | Clave de API | [enlace](https://x5lab.dev) | Usa tu clave de API de X5Lab (x5-...) en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | Clave de API | [enlace](https://x.ai) | Usa una clave oficial de la API de xAI o inicia sesión con OAuth de xAI. Las sesiones JWT de Grok Build siguen siendo un proveedor independiente. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Clave de API | [enlace](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Clave de API | [enlace](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | Clave de API, agregador | [enlace](https://xkiro.com) | Crea una cuenta gratuita en xkiro.com y pega aquí la clave (Bearer; también se acepta x-api-key). | -| `yi` | `yi` | Yi (01.AI) | Clave de API | [enlace](https://01.ai) | Obtén una clave de API en platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | Clave de API, agregador | [enlace](https://yolo-auto.com) | El acceso gratuito a la API tiene un límite de solicitudes y está destinado a pruebas; no se publica ninguna cuota diaria numérica ni se garantiza que el acceso gratuito vaya a mantenerse indefinidamente. | -| `zai` | `zai` | Z.AI | Clave de API | [enlace](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | Clave de API | [enlace](https://zenmux.ai) | Usa tu clave de API de ZenMux en Authorization: Bearer . ZenMux es totalmente compatible con OpenAI. URL base: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Clave de API, agregador | [enlace](https://www.zerolimitai.com) | Se anuncia una prueba gratuita temporal, pero las páginas oficiales se contradicen entre 3 y 7 días; la afirmación de 100 llamadas/día no se considera permanente. | -| `zylo-api` | `zylo` | Zylo API | Clave de API, agregador | [enlace](https://zyloai.net) | Plan Basic: 10 RPM, 7.200 solicitudes/día y 200.000 tokens/día; limitado a modelos de texto Basic. | +| ID | Alias | Nombre | Etiquetas | Sitio web | Notas | +| ------------------------ | --------------- | ------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | Clave de API | [enlace](https://ai.360.cn) | Obtén una clave de API en ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | Clave de API, agregador | [enlace](https://agentrouter.org) | $200 en créditos gratuitos al registrarte: puerta de enlace de enrutamiento multimodelo | +| `agnes` | `agnes` | Agnes AI | Clave de API, vídeo | [enlace](https://agnes-ai.com) | Obtén una clave de API en agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (China) | Clave de API | [enlace](https://api.agnes-ai.cn) | Obtén una clave de API en el sitio de Agnes CN. | +| `ai21` | `ai21` | AI21 Labs | Clave de API | [enlace](https://www.ai21.com) | $10 en créditos de prueba al registrarte (válidos durante 3 meses); no se requiere tarjeta de crédito | +| `aimlapi` | `aiml` | AI/ML API | Clave de API, agregador | [enlace](https://aimlapi.com) | Nivel gratuito suspendido (2026): AI/ML API ahora solo ofrece pago por uso (recarga mínima de $20); no hay créditos gratuitos recurrentes. | +| `ainative` | `ainative` | AINative Studio | Clave de API | [enlace](https://ainative.studio) | Crea una clave de API gratuita en ainative.studio (sin tarjeta) y pégala aquí como token Bearer. | +| `aion` | `aion` | Aion Labs | Clave de API | [enlace](https://www.aionlabs.ai) | Crea una clave de API gratuita en aionlabs.ai (sin tarjeta) y pégala aquí como token Bearer. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | Clave de API | [enlace](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (China) | Clave de API | [enlace](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Clave de API | [enlace](https://developer.ant-ling.com/en/docs/) | Regístrate y crea una clave de API en la consola de API de Ant Ling (https://chat.ant-ling.com/open) y pégala aquí. OmniRoute dirige el tráfico de chat a https://api.ant-ling.com/v1/chat/completions; el proveedor es compatible con OpenAI y también ofrece una interfaz compatible con Anthropic. | +| `anthropic` | `anthropic` | Anthropic | Clave de API | [enlace](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | Clave de API, agregador | [enlace](https://anyapi.ai) | Plan gratuito: 100 000 tokens ANY al día y 100 RPM para los modelos gratuitos/básicos elegibles; no se requiere tarjeta de crédito. | +| `api-airforce` | `af` | Api.airforce | Clave de API | [enlace](https://api.airforce) | 55 modelos de nivel gratuito, incluidos Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash y DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | Clave de API | [enlace](https://arcee.ai) | Obtén una clave de API en arcee.ai | +| `auriko` | `auriko` | Auriko | Clave de API, agregador | [enlace](https://www.auriko.ai) | El plan gratuito ofrece 1000 RPM de plataforma y 10 000 RPM de BYOK. La inferencia de la plataforma sigue repercutiendo el coste del proveedor; no se trata de una reserva de tokens gratuitos ni de inferencia gratuita ilimitada. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | Clave de API, empresarial | [enlace](https://learn.microsoft.com/azure/ai-foundry) | Usa tu clave de Azure AI Foundry. La URL base puede ser https://.services.ai.azure.com/openai/v1/ o https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | Clave de API, empresarial | [enlace](https://azure.microsoft.com/products/ai-services/openai-service) | Usa tu clave de API de Azure OpenAI. La URL base debe ser el punto de conexión de tu recurso, por ejemplo, https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | Clave de API | [enlace](https://b.ai) | Clave de API Bearer para la puerta de enlace LLM de b.ai compatible con OpenAI (distinta de TheB.AI). Crea una clave en https://docs.b.ai y usa https://api.b.ai/v1 como URL base compatible con OpenAI. Los modelos utilizan el formato proveedor/nombre-del-modelo. | +| `baichuan` | `baichuan` | Baichuan | Clave de API | [enlace](https://www.baichuan-ai.com/) | Obtén una clave de API en platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | Clave de API | [enlace](https://ernie.baidu.com/) | Obtén una clave de API en console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Clave de API | [enlace](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | Clave de API | [enlace](https://baseten.co) | $30 en créditos de prueba gratuitos para inferencia con GPU | +| `bazaarlink` | `bzl` | BazaarLink | Clave de API | [enlace](https://bazaarlink.ai) | Usa tu clave de API de BazaarLink (comienza por sk-bl-) en Authorization: Bearer . El SDK de OpenAI funciona con la URL base https://bazaarlink.ai/api/v1. Los modelos utilizan el formato proveedor/nombre-del-modelo. | +| `bedrock` | `bedrock` | Amazon Bedrock | Clave de API, empresarial | [enlace](https://aws.amazon.com/bedrock) | Usa tu clave de API de Amazon Bedrock y configura la región de AWS donde están habilitados tus modelos (por ejemplo, eu-west-2). OmniRoute llama directamente a la API Converse nativa de Bedrock. | +| `black-forest-labs` | `bfl` | Black Forest Labs | Clave de API, imagen | [enlace](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | Clave de API | [enlace](https://blackbox.ai) | ⚠️ **OBSOLETO.** api.blackbox.ai devuelve HTTP 404 en todas las variantes de ruta (comprobación del 2026-08-21); la interfaz pública de inferencia se ha trasladado al punto de conexión restringido enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | Clave de API | [enlace](https://www.bluesminds.com) | Créditos pi diarios gratuitos; admite más de 200 modelos, incluidos GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen y Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | Clave de API | [enlace](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | Clave de API | [enlace](https://bytez.com) | $1 en créditos gratuitos, renovados cada 4 semanas | +| `cerebras` | `cerebras` | Cerebras | Clave de API | [enlace](https://inference.cerebras.ai) | Crédito único de $5 al registrarte (válido durante 30 días); se requiere un método de pago. No es un nivel gratuito recurrente. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | Clave de API | [enlace](https://hyper.charm.land) | 100 Hypercredits mensuales gratuitos al registrarte | +| `chat-oripe` | `chat-oripe` | Chat Oripe | Clave de API, agregador | [enlace](https://api.oriper.com) | Los metadatos oficiales anuncian 2 millones de tokens al mes, pero el sitio público y la documentación estaban bloqueados durante la auditoría; considera la cuota y la correspondencia de la marca como no confirmadas. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | Clave de API, agregador | [enlace](https://chatanywhere.tech) | Solo para uso personal, educativo o de investigación: la documentación pública indica 10 000 puntos/día y 200 solicitudes/día por IP/clave; no lo utilice para tráfico comercial. | +| `cheaperinference` | `cinf` | Cheaper Inference | Clave de API | [enlace](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | Clave de API | [enlace](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | Clave de API, agregador | [enlace](https://chutes.ai) | Clave de API Bearer para la pasarela compatible con OpenAI de Chutes. | +| `clarifai` | `clarifai` | Clarifai | Clave de API, empresarial | [enlace](https://docs.clarifai.com) | Utilice su PAT de Clarifai o una clave de API específica de la aplicación. OmniRoute se dirige al endpoint compatible con OpenAI en https://api.clarifai.com/v2/ext/openai/v1 y se autentica con Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Clave de API, agregador | [enlace](https://cloudcode.one) | Los modelos gratuitos publicados incluyen glm-4.7-flash y glm-4.6v-flash; no se publica ninguna cuota numérica y la creación de claves puede requerir crédito o un cupón. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Clave de API | [enlace](https://developers.cloudflare.com/workers-ai) | Requiere un token de API Y un ID de cuenta (disponible en dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | Clave de API | [enlace](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | Clave de API | [enlace](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | Clave de API | [enlace](https://cohere.com) | Prueba gratuita: 1000 llamadas a la API/mes para pruebas, sin necesidad de tarjeta de crédito | +| `command-code` | `cmd` | Command Code | Clave de API | [enlace](https://commandcode.ai/) | Utilice una clave de API de Command Code. Las solicitudes se envían al endpoint /provider/v1/chat/completions de Command Code. | +| `coze` | `coze` | Coze | Clave de API | [enlace](https://coze.com) | Obtenga la clave de API en coze.com/open/api | +| `crof` | `crof` | CrofAI | Clave de API | [enlace](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | Clave de API | [enlace](https://cursor.com/dashboard/api) | Pegue una clave de API de usuario de Cursor (crsr_...) de cursor.com/dashboard/api. OmniRoute la intercambia por un token de sesión cuando es necesario; no es preciso instalar ningún IDE ni cursor-agent. El uso se factura al plan de Cursor al que pertenece la clave. | +| `dahl` | `dahl` | Dahl | Clave de API | [enlace](https://inference.dahl.global) | Haga clic en «Add Account» para generar automáticamente un token, o añada manualmente una clave de API. | +| `databricks` | `databricks` | Databricks | Clave de API, empresarial | [enlace](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | Clave de API, empresarial | [enlace](https://docs.datarobot.com) | Utilice su token de API de DataRobot. La URL base opcional puede ser la raíz de la cuenta (para LLM Gateway) o una URL de implementación bajo /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | Clave de API, imagen | [enlace](https://deepai.org) | Utilice su clave de API de DeepAI. Obtenga una en deepai.org; requiere una suscripción Pro (9,99 USD/mes). | +| `deepinfra` | `deepinfra` | DeepInfra | Clave de API | [enlace](https://deepinfra.com) | Créditos gratuitos al registrarse para probar la API y explorar modelos | +| `deepseek` | `ds` | DeepSeek | Clave de API | [enlace](https://platform.deepseek.com) | 5 millones de tokens gratuitos al registrarse, sin necesidad de tarjeta de crédito | +| `dgrid` | `dgrid` | DGrid | Clave de API | [enlace](https://dgrid.ai) | Enrutador de modelos gratuitos de DGrid: 10 solicitudes/minuto y 100 solicitudes/día. Una recarga única de 5 USD desbloquea hasta 20 solicitudes/minuto y 1000 solicitudes/día. | +| `dify` | `dify` | Dify | Clave de API | [enlace](https://dify.ai) | Obtenga la clave de API de su instancia de Dify. | +| `digitalocean` | `digitalocean` | DigitalOcean | Clave de API | [enlace](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | Clave de API | [enlace](https://dit.ai) | Utilice su clave de API de dit.ai en Authorization: Bearer . Totalmente compatible con OpenAI: sirve como sustituto directo; solo tiene que cambiar la URL base a https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | Clave de API | [enlace](https://doubao.com) | Obtenga la clave de API en console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | Clave de API, agregador | [enlace](https://www.dxnt.com) | Las cuentas gratuitas están documentadas con 100 llamadas/día; la cuota puede aumentar mediante invitaciones y puede variar según la cuenta. | +| `electronhub` | `electronhub` | Electron Hub | Clave de API, agregador | [enlace](https://www.electronhub.ai) | Plan gratuito: 5 RPM, 0,25 USD de créditos semanales y 10 Neutrinos/día para modelos :free; también se aplican presupuestos familiares. | +| `empower` | `empower` | Empower | Clave de API, agregador | [enlace](https://docs.empower.dev) | Clave de API Bearer para el endpoint compatible con OpenAI de Empower. | +| `eurouter` | `eurouter` | EURouter | Clave de API, agregador | [enlace](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | Clave de API | [enlace](https://factory.ai) | Clave de API Bearer para la pasarela compatible con OpenAI de Factory. | +| `fal-ai` | `fal` | Fal.ai | Clave de API, imagen | [enlace](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | Clave de API, agregador | [enlace](https://fastrouter.ai) | Los modelos con el sufijo :free permiten 10 solicitudes/día por organización y modelo; la disponibilidad puede cambiar. | +| `featherless-ai` | `featherless` | Featherless AI | Clave de API | [enlace](https://featherless.ai) | Nivel gratuito disponible, sin necesidad de tarjeta de crédito | +| `fenayai` | `fenayai` | FenayAI | Clave de API, agregador | [enlace](https://fenayai.com) | Clave de API Bearer para la pasarela compatible con OpenAI de FenayAI. | +| `fireworks` | `fireworks` | Fireworks AI | Clave de API | [enlace](https://fireworks.ai) | 1 USD en créditos iniciales gratuitos al registrarse para probar la API | +| `free-ai` | `free-ai` | Free.ai | Clave de API, agregador | [enlace](https://free.ai) | 30 000 tokens/día cubren los modelos autoalojados tras verificar el correo electrónico. El uso que supere este límite puede facturarse al coste real y los modelos externos prémium son de pago. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | Clave de API | [enlace](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | Clave de API | [enlace](https://freebuff.com) | Introduce el token de autenticación de Freebuff / Codebuff (obtenido mediante el inicio de sesión en la CLI o un recolector automatizado). | +| `freeinference` | `freeinference` | FreeInference | Clave de API, agregador | [enlace](https://freeinference.org) | Acceso gratuito para investigación sin tarjeta; los solicitantes que no pertenezcan a Harvard requieren aprobación manual y no se garantiza públicamente ninguna cuota numérica. | +| `freemodel-dev` | `fmd` | FreeModel.dev | Clave de API | [enlace](https://freemodel.dev) | $300 en créditos gratuitos al registrarse, sin necesidad de tarjeta de crédito. Accede a GPT-5.4 y GPT-5.5 (los modelos insignia más recientes de OpenAI) mediante una API compatible con OpenAI. | +| `freetheai` | `fta` | FreeTheAi | Clave de API, agregador | [enlace](https://freetheai.xyz) | Únete al Discord de FreeTheAi para obtener tu clave de API gratuita. | +| `friendliai` | `friendli` | FriendliAI | Clave de API | [enlace](https://friendli.ai) | Nivel gratuito para inferencia sin servidor, sin necesidad de tarjeta de crédito | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o usa una clave de miembro de g4f.dev (créala en g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o usa una clave de miembro de g4f.dev (créala en g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o usa una clave de miembro de g4f.dev (créala en g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o usa una clave de miembro de g4f.dev (créala en g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Clave de API, agregador | [enlace](https://g4f.space) | Genera créditos cake anónimos en g4f.dev/chat o usa una clave de miembro de g4f.dev (créala en g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | Clave de API | [enlace](https://galadriel.com) | ⚠️ **OBSOLETO.** api.galadriel.ai ya no resuelve (comprobación del 2026-06-19); la API de inferencia parece haber sido descontinuada. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | Clave de API | [enlace](https://aistudio.google.com) | Nivel gratuito disponible mediante Google AI Studio; se aplican las cuotas actuales por modelo y los límites regionales | +| `getgoapi` | `ggo` | GoAPI | Clave de API, agregador | [enlace](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | Clave de API | [enlace](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | Clave de API | [enlace](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Token de acceso personal de GitLab para la API pública de Code Suggestions. Configura una URL base autoalojada cuando no uses gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Clave de API | [enlace](https://opengateway.gitlawb.com) | El acceso gratuito a MiMo (xiaomi/mimo-v2.5) fue revocado en 2026-05; Opengateway es ahora una pasarela de créditos de pago por uso, sin ningún modelo gratuito recurrente. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Clave de API | [enlace](https://opengateway.gitlawb.com) | La promoción gratuita de Nemotron terminó en 2026-06; la ruta de GMI Cloud ahora solo admite créditos de pago por uso. | +| `glm` | `glm` | GLM Coding | Clave de API | [enlace](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (China) | Clave de API | [enlace](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | Clave de API | [enlace](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | Clave de API | [enlace](https://greenpt.com) | La suscripción a la API se puede crear gratuitamente; la inferencia se factura por token. No se publica ninguna asignación de inferencia gratuita. | +| `groq` | `groq` | Groq | Clave de API | [enlace](https://groq.com) | Plan gratuito: límites por modelo (200K tokens/día por modelo de chat; consulta console.groq.com/docs/rate-limits para conocer los RPM/RPD), sin método de pago registrado. | +| `haiper` | `hp` | Haiper | Clave de API, vídeo | [enlace](https://haiper.ai) | Obtén la clave de API en haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | Clave de API | [enlace](https://api.hcnsec.cn) | Obtén la clave de API en api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | Clave de API, agregador | [enlace](https://helixmind.online) | Las afirmaciones difundidas anteriormente sobre 3 RPM/50 RPD y la ausencia de tarjeta no se confirmaron durante la auditoría del 2026-08-02; la cuota y facturación actuales requieren la verificación de la cuenta. | +| `helyxai` | `helyxai` | Helyx AI | Clave de API, agregador | [enlace](https://helyxai.space) | El plan gratuito operativo documenta 100,000 tokens/día; la afirmación publicitaria independiente del sitio de más de 2M entra en conflicto y no se considera una garantía de cuota. | +| `heroku` | `heroku` | Heroku AI | Clave de API, empresarial | [enlace](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | Clave de API | [enlace](https://huggingface.co) | API de inferencia gratuita para miles de modelos (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | Clave de API | [enlace](https://hyperbolic.xyz) | $1-5 en créditos de prueba al registrarse para inferencia sin servidor | +| `ideogram` | `ideo` | Ideogram | Clave de API | [enlace](https://ideogram.ai) | Obtén la clave de API en ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | Clave de API | [enlace](https://xinghuo.xfyun.cn) | Obtén la clave de API en console.xfyun.cn | +| `inception` | `inception` | Inception | Clave de API | [enlace](https://docs.inceptionlabs.ai) | 10M de tokens gratuitos al registrarse, sin necesidad de tarjeta de crédito. | +| `inference-net` | `inet` | Inference.net | Clave de API | [enlace](https://inference.net) | $25 en créditos gratuitos al registrarse, además de subvenciones disponibles para investigación | +| `internlm` | `internlm` | InternLM (Intern-S1) | Clave de API | [enlace](https://internlm.intern-ai.org.cn/) | Cuota mensual gratuita de ~1M de tokens de entrada / 3M de tokens de salida (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (API Foundation) | Clave de API, embed/rerank | [enlace](https://jina.ai) | Clave de API Bearer para api.jina.ai: embeddings, rerank, clasificación, segmentación y búsqueda. Las claves del panel tienen prioridad sobre JINA_AI_API_KEY. Esta no es la tarjeta de Reader / r.jina.ai y no obtiene URLs. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Clave de API | [enlace](https://jina.ai/reader) | Clave de API Bearer para la conversión de URL a Markdown de r.jina.ai (solo /v1/web/fetch). No ofrece /v1/embeddings ni /v1/rerank. El mismo token de Jina que se usa para la API Foundation funciona aquí; OmniRoute reutiliza una clave del panel de jina-ai o JINA_AI_API_KEY cuando esta tarjeta está vacía. | +| `kenari` | `kenari` | Kenari | Clave de API | [enlace](https://kenari.id) | Usa tu clave de API de Kenari (kn-...) en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | Clave de API | [enlace](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | Clave de API, agregador | [enlace](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (API heredada de Moonshot) | Clave de API | [enlace](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Clave de API de Kimi Code | Clave de API | [enlace](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | Clave de API | [enlace](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | Clave de API, agregador | [enlace](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | Clave de API, vídeo | [enlace](https://leonardo.ai) | Obtén una clave de API en leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | Clave de API | [enlace](https://liquid.ai) | Obtén una clave de API en liquid.ai | +| `literouter` | `literouter` | LiteRouter | Clave de API, agregador | [enlace](https://literouter.com) | Las variantes gratuitas de los modelos usan el sufijo :free; los límites diarios de crédito varían según el modelo y la entrada gratuita está limitada a 5,000 tokens. | +| `llamagate` | `llamagate` | LlamaGate | Clave de API | [enlace](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Clave de API, agregador | [enlace](https://llm.kiwi) | El plan gratuito ofrece auto y hrLLM; el límite publicado de 40 solicitudes/hora se aplica a hrLLM. | +| `llm7` | `llm7` | LLM7.io | Clave de API | [enlace](https://llm7.io) | Usa cualquier clave que no esté vacía (por ejemplo, 'unused'). Si los modelos integrados más antiguos devuelven model_unavailable, usa Modelos disponibles → Importar desde /models o Sincronización automática; modelo activo verificado: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | Clave de API, agregador | [enlace](https://llmgateway.io) | Plan gratuito alojado: los modelos con precio gratuito están limitados a 5 solicitudes cada 10 minutos cuando la cuenta no tiene créditos. | +| `logfare` | `logfare` | Logfare | Clave de API, agregador | [enlace](https://logfare.ai) | Crea una cuenta gratuita en https://logfare.ai/register (nombre de usuario/contraseña, sin verificación de correo electrónico) para obtener una clave de API al instante y, a continuación, pégala aquí como token Bearer. | +| `longcat` | `lc` | LongCat AI | Clave de API | [enlace](https://longcat.chat/platform/docs) | Gratuito: asignación única de 10 millones de tokens tras registrar la cuenta y completar la verificación KYC (LongCat-2.0). Es una asignación única, no una cuota diaria/mensual recurrente. | +| `magnific` | `freepik` | Magnific | Clave de API, imagen | [enlace](https://www.magnific.com) | Obtén una clave de API en magnific.com/user/api-keys (cabecera x-magnific-api-key). Las claves heredadas para desarrolladores de Freepik siguen funcionando. | +| `maritalk` | `maritalk` | Maritalk | Clave de API | [enlace](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | Clave de API, agregador | [enlace](https://meganova.ai) | Registro gratuito sin tarjeta. Las cuotas publicadas de nivel 1 por modelo suman 550 solicitudes/día; no forman un fondo global compartido y pueden aplicarse cargos por exceso si están habilitados. | +| `meta-llama` | `meta` | API de Meta Llama | Clave de API | [enlace](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | Clave de API, vídeo | [enlace](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (China) | Clave de API | [enlace](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | Clave de API | [enlace](https://mistral.ai) | Nivel Experiment gratuito: acceso con límite de frecuencia a todos los modelos, sin necesidad de tarjeta de crédito | +| `mixedbread` | `mxbai` | Mixedbread AI | Clave de API | [enlace](https://www.mixedbread.com) | Clave de API Bearer para la API de embeddings de Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | Clave de API, agregador | [enlace](https://www.mixlayer.com) | El modelo qwen/qwen3.5-4b-free es gratuito para crear prototipos y tiene un límite de frecuencia; no se ha confirmado ningún límite público fijo de RPM ni cuota diaria. | +| `mnn-ai` | `mnn-ai` | MNN AI | Clave de API, agregador | [enlace](https://mnnai.ru) | Plan gratuito: $1 en créditos mensuales, 10 RPM y acceso únicamente a los modelos marcados como Free. | +| `modal` | `mdl` | Modal | Clave de API, empresarial | [enlace](https://modal.com/docs) | Usa el token Bearer que protege tu despliegue de Modal, si está habilitado. La URL base debe apuntar a tu aplicación Modal compatible con OpenAI, por ejemplo https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | Clave de API | [enlace](https://modelscope.cn) | Nivel gratuito mediante ModelScope API-Inference; se requiere una cuenta de Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | Clave de API | [enlace](https://monsterapi.ai) | ⚠️ **OBSOLETO.** Monster API cesó sus operaciones el 2026-06-30. Usa proveedores alternativos compatibles con OpenAI. | +| `moonshot` | `moonshot` | Kimi | Clave de API | [enlace](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | Clave de API | [enlace](https://morphllm.com) | Nivel gratuito: 250K créditos/mes, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | Clave de API | [enlace](https://github.com/meta-llama/llama-stack) | Usa tu variable de entorno META_API_KEY como token Bearer. La CLI de Muse Code usa el formato de transferencia de la API Responses de OpenAI (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | Clave de API, agregador | [enlace](https://naga.ac) | Obtén una clave de API en naga.ac; puedes registrarte con Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | Clave de API, agregador | [enlace](https://naga.ac) | Los modelos marcados con :free aparecen publicados, pero no se confirma ninguna cuota numérica. La política de Naga advierte que los prompts y las respuestas del nivel gratuito pueden recopilarse o utilizarse para entrenamiento. | +| `nanogpt` | `nanogpt` | NanoGPT | Clave de API | [enlace](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | Clave de API | [enlace](https://bynara.id) | Crea una cuenta gratuita de NaraRouter, vincula tu cuenta de Telegram (obligatorio antes de obtener respuestas de /v1) y, a continuación, pega aquí la clave como token Bearer. | +| `navy` | `navy` | NavyAI | Clave de API | [enlace](https://api.navy) | Crea una clave de API gratuita desde el panel de NavyAI y, a continuación, pégala aquí como token Bearer. | +| `nebius` | `nebius` | Nebius AI | Clave de API | [enlace](https://nebius.com) | Aproximadamente $1 en créditos de prueba al registrarse para realizar pruebas de la API | +| `nlpcloud` | `nlpc` | NLP Cloud | Clave de API | [enlace](https://docs.nlpcloud.com) | Usa tu clave de API de NLP Cloud en Authorization: Token . De forma predeterminada, OmniRoute utiliza el endpoint de chatbot en https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | Clave de API | [enlace](https://nomic.ai) | Obtén una clave de API en atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | Clave de API | [enlace](https://portal.nousresearch.com/help) | Usa tu clave de API de Nous Portal. OmniRoute utiliza el endpoint oficial de inferencia compatible con OpenAI en https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | Clave de API, vídeo, agregador | [enlace](https://novita.ai) | $0.50 en créditos de prueba al registrarse (válidos durante aproximadamente 1 año) | +| `nscale` | `nscale` | nScale | Clave de API | [enlace](https://nscale.com) | $5 en créditos gratuitos al registrarse para realizar pruebas de inferencia | +| `nube` | `nube` | Nube.sh | Clave de API | [enlace](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | Clave de API | [enlace](https://build.nvidia.com) | Acceso gratuito para desarrollo: ~40 RPM, más de 70 modelos (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | Clave de API, empresarial | [enlace](https://www.oracle.com/artificial-intelligence/generative-ai) | Usa tu clave de API de OCI Generative AI o un token Bearer de IAM. La URL base puede ser https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | Clave de API, agregador | [enlace](https://ofox.ai) | El catálogo actual anuncia más de 10 modelos gratuitos sin una cuota numérica pública; revisa la procedencia del proveedor, así como las condiciones de retención y entrenamiento, antes de usarlo en producción. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Clave de API | [enlace](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | Clave de API | [enlace](https://1min.ai) | Crea una clave de API en https://docs.1min.ai/docs/api/create-api-key y, a continuación, pégala aquí. | +| `openadapter` | `oad` | OpenAdapter | Clave de API | [enlace](https://openadapter.dev) | Usa tu clave de API de OpenAdapter en Authorization: Bearer sk-cv-. Totalmente compatible con OpenAI. URL base de la API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | Clave de API | [enlace](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | Clave de API | [enlace](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | Clave de API | [enlace](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | Clave de API | [enlace](https://openference.com) | Nivel gratuito: incluye Qwen3.8 27b y Llama 3.2 3B; consulta openference.com/pricing para conocer las condiciones actuales | +| `openrouter` | `openrouter` | OpenRouter | Clave de API, agregador | [enlace](https://openrouter.ai) | Modelos gratuitos a $0/token con el sufijo :free: 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | Clave de API | [enlace](https://openvecta.com) | Créditos gratuitos al registrarse para realizar inferencias compatibles con OpenAI mediante LLM, embeddings y modelos de razonamiento | +| `opper` | `opper` | Opper | Clave de API, agregador | [enlace](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | Clave de API | [enlace](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | Clave de API | [enlace](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | Clave de API | [enlace](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Clave de API | [enlace](https://www.perplexity.ai) | Usa tu clave de API de Perplexity. OmniRoute enruta los identificadores de modelos de Agent API mediante el endpoint de Perplexity compatible con Responses. | +| `piapi` | `pi` | PiAPI | Clave de API, agregador | [enlace](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | Clave de API | [enlace](https://pioneer.ai) | $75 en créditos de uso gratuitos; no se requiere tarjeta de crédito | +| `plamo` | `plamo` | PLaMo | Clave de API | [enlace](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | Clave de API, agregador | [enlace](https://creator.poe.com/api-reference) | Clave de API Bearer para la API de Poe compatible con OpenAI. | +| `poixe-ai` | `poixe-ai` | Poixe AI | Clave de API, agregador | [enlace](https://poixe.com) | Los límites gratuitos públicos actuales son reducidos y específicos para cada grupo de modelos: 2 RPM/5 RPD para los modelos large-cup y 20 RPM/50 RPD para los modelos small-cup. | +| `pollinations` | `pol` | Pollinations AI | Clave de API, vídeo | [enlace](https://pollinations.ai) | El acceso anónimo/sin clave a los modelos gratuitos documentados se ofrece sin garantías. La verificación local de v3.8.50 (2026-07-31) devolvió 401 mediante OmniRoute y Cloudflare 1010 en consultas directas al proveedor desde la misma red. Los modelos prémium siguen requiriendo una clave de API de Pollinations obtenida en enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | Clave de API | [enlace](https://poolside.ai) | Laguna S 2.1 y XS 2.1 son gratuitos durante la vista previa; no se publica ninguna cuota numérica. | +| `predibase` | `predibase` | Predibase | Clave de API | [enlace](https://predibase.com) | ⚠️ **OBSOLETO.** serving.app.predibase.com ya no se resuelve (comprobación de 2026-06-19); la API administrada de servicio parece haber sido discontinuada. | +| `publicai` | `publicai` | PublicAI | Clave de API | [enlace](https://publicai.co) | Requiere una clave de API: crédito único al registrarse y, después, servicio de pago | +| `qianfan` | `qianfan` | Baidu Qianfan | Clave de API | [enlace](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | Clave de API | [enlace](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | Clave de API | [enlace](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Clave de API | [enlace](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | Clave de API, imagen | [enlace](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | Clave de API | [enlace](https://regolo.ai) | Obtén tu clave de API de Regolo en regolo.ai y pégala aquí como token Bearer. | +| `reka` | `reka` | Reka | Clave de API | [enlace](https://docs.reka.ai/chat/overview) | Usa tu clave de API de Reka. OmniRoute admite la URL base compatible con OpenAI https://api.reka.ai/v1 y envía tanto el encabezado Authorization como X-Api-Key para garantizar la compatibilidad. | +| `requesty` | `requesty` | Requesty | Clave de API | [enlace](https://requesty.ai) | Nivel gratuito de ~200 solicitudes/día: puerta de enlace de enrutamiento multimodelo (más de 300 modelos) | +| `routeway` | `routeway` | Routeway | Clave de API | [enlace](https://routeway.ai) | Crea una clave de API gratuita en routeway.ai y pégala aquí como token Bearer. | +| `runwayml` | `runway` | Runway | Clave de API, vídeo | [enlace](https://docs.dev.runwayml.com) | Usa tu clave de API de Runway en Authorization: Bearer . OmniRoute utiliza la API actual de Runway en https://api.dev.runwayml.com/v1 y envía automáticamente el encabezado X-Runway-Version requerido. | +| `sambanova` | `samba` | SambaNova | Clave de API | [enlace](https://sambanova.ai) | $5 en créditos gratuitos al registrarte (válidos durante 30 días), sin necesidad de tarjeta de crédito | +| `sap` | `sap` | SAP Generative AI Hub | Clave de API, empresarial | [enlace](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Usa tu token Bearer de SAP AI Core. La URL base puede ser la raíz de AI_API_URL o una deploymentUrl de Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | Clave de API | [enlace](https://docs.sarvam.ai) | ₹1,000 en créditos gratuitos al registrarte; nunca caducan | +| `scaleway` | `scw` | Scaleway AI | Clave de API | [enlace](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 millón de tokens gratuitos para cuentas nuevas; compatible con la normativa de la UE/RGPD (París), Qwen3 235B y Llama 70B | +| `sealion` | `sealion` | SEA-LION | Clave de API | [enlace](https://sea-lion.ai) | Inicia sesión en sea-lion.ai con Google (sin tarjeta ni restricciones regionales), crea una clave de API y pégala aquí. | +| `seekai` | `ska` | SeekAi | Clave de API, agregador | [enlace](https://seekai.cc) | Crea una clave de API en https://seekai.cc y pégala aquí como token Bearer. | +| `segmind` | `segmind` | Segmind | Clave de API, imagen, vídeo | [enlace](https://segmind.com) | Usa tu clave de API de Segmind en el encabezado x-api-key. OmniRoute utiliza https://api.segmind.com/v1/ y devuelve directamente los bytes de la imagen o el vídeo generados. | +| `sensenova` | `sensenova` | SenseNova | Clave de API | [enlace](https://platform.sensenova.cn) | Obtén la clave de API en platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | Clave de API | [enlace](https://cloud.siliconflow.com) | $1 en créditos gratuitos, además de los modelos de $0 que figuran actualmente tras verificar la identidad; la disponibilidad y los límites pueden cambiar | +| `snowflake` | `snowflake` | Snowflake Cortex | Clave de API, empresarial | [enlace](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | Clave de API | [enlace](https://xinghuo.xfyun.cn) | Obtén la clave de API en console.xfyun.cn | +| `speka` | `speka` | Speka AI | Clave de API, agregador | [enlace](https://speka.me) | Plan gratuito: $1 de uso mensual, 10 RPM, una clave de API y acceso a modelos abiertos y al área de pruebas; no se requiere tarjeta. | +| `stability-ai` | `stability` | Stability AI | Clave de API, imagen | [enlace](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | Clave de API | [enlace](https://stepfun.com) | Obtén la clave de API en platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | Clave de API | [enlace](https://ai.sumopod.com) | Usa tu clave de API de SumoPod (sk-...) en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | Clave de API | [enlace](https://suno.ai) | Pega la cookie de sesión de suno.ai (autenticación de Clerk) | +| `synthetic` | `synthetic` | Synthetic | Clave de API, agregador | [enlace](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | Clave de API, agregador | [enlace](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | Clave de API | [enlace](https://hunyuan.tencent.com) | Obtén la clave de API en console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | Clave de API, agregador | [enlace](https://theb.ai) | Clave de API Bearer para la puerta de enlace de TheB.AI compatible con OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | Clave de API | [enlace](https://docs.tinyfish.ai/fetch-api) | X-API-Key de agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | Clave de API, vídeo | [enlace](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | Clave de API | [enlace](https://agent-router.gaib.ai) | Usa tu clave de API de Token Kiosk en Authorization: Bearer . Puerta de enlace totalmente compatible con OpenAI. URL base de la API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | Clave de API, agregador | [enlace](https://www.tokenreply.com) | Los modelos etiquetados como gratuitos tienen límites diarios específicos de cada modelo y campaña; no se publica ninguna cuota gratuita global fija. | +| `tokenrouter` | `trk` | TokenRouter | Clave de API | [enlace](https://tokenrouter.com) | Usa tu clave de API de TokenRouter en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | Clave de API, imagen | [enlace](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | Clave de API | [enlace](https://docs.opentyphoon.ai) | Clave de API gratuita con un límite de velocidad de 5 solicitudes/s y 200 solicitudes/min. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Clave de API | [enlace](https://uncensored.com) | Usa tu clave de API para desarrolladores de uncensored.com (uai_sk_live_...). OmniRoute la envía como encabezado X-api-key al endpoint compatible con OpenAI https://api.uncensored.com/api/v1. La clave nunca caduca. Esta es la modalidad con medición/créditos; el chat de suscripción sin medición corresponde al proveedor independiente 'uc'. | +| `udio` | `udio` | Udio | Clave de API | [enlace](https://udio.com) | Pega la cookie de sesión de udio.com (autenticación de Supabase) | +| `unorouter` | `unorouter` | UnoRouter | Clave de API, agregador | [enlace](https://unorouter.ai) | Los modelos con el sufijo :free no descuentan saldo; el límite es de 1 solicitud/minuto por modelo gratuito y usuario. | +| `upstage` | `upstage` | Upstage | Clave de API | [enlace](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | Clave de API | [enlace](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | Clave de API | [enlace](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Clave de API, agregador | [enlace](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | Clave de API, empresarial | [enlace](https://cloud.google.com/vertex-ai) | Proporciona el JSON de la cuenta de servicio, un token de acceso OAuth, una clave de API de Vertex Express o una clave de autorización vinculada a una cuenta de servicio. El modo Express solo admite Gemini; los modelos de socios requieren credenciales específicas del proyecto. | +| `vertex-partner` | `vp` | Vertex AI Partners | Clave de API, empresarial | [enlace](https://cloud.google.com/vertex-ai) | Proporciona el JSON de la cuenta de servicio o credenciales OAuth. Una clave de autorización vinculada a una cuenta de servicio también permite la detección, pero la inferencia de socios requiere además el ID de su proyecto de Google Cloud. Las claves estándar de Express solo admiten Gemini. | +| `void-ai` | `void-ai` | Void AI | Clave de API, agregador | [enlace](https://voidai.app) | El catálogo público de modelos marca algunos modelos con el requisito de un plan gratuito, pero el acceso es condicional y no se confirma ninguna cuota numérica. | +| `volcengine` | `volcengine` | Volcengine | Clave de API | [enlace](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Clave de API | [enlace](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Conecta tu cuenta de Volcano Engine o usa una clave de API de suscripción a Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Clave de API | [enlace](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Conecta tu cuenta de Volcano Engine o usa una clave de API de suscripción a Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | Clave de API, embeddings/reordenación | [enlace](https://www.voyageai.com) | Clave de API Bearer para las API de embeddings y reordenación de Voyage AI. | +| `wafer` | `wafer` | Wafer AI | Clave de API | [enlace](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | Clave de API | [enlace](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Clave de API, empresarial | [enlace](https://www.ibm.com/products/watsonx-ai) | Usa tu token Bearer de watsonx. La URL base puede ser https://.ml.cloud.ibm.com/ml/gateway/v1/ o un endpoint /ml/gateway/v1 autogestionado. | +| `writer` | `writer` | Writer | Clave de API | [enlace](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | Clave de API | [enlace](https://x5lab.dev) | Usa tu clave de API de X5Lab (x5-...) en Authorization: Bearer . Totalmente compatible con OpenAI. URL base de la API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | Clave de API | [enlace](https://x.ai) | Usa una clave de API oficial de xAI o inicia sesión con OAuth de xAI. Las sesiones JWT de Grok Build siguen siendo un proveedor independiente. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Clave de API | [enlace](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Clave de API | [enlace](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | Clave de API, agregador | [enlace](https://xkiro.com) | Crea una cuenta gratuita en xkiro.com y pega aquí la clave (Bearer; también se acepta x-api-key). | +| `yi` | `yi` | Yi (01.AI) | Clave de API | [enlace](https://01.ai) | Obtén una clave de API en platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | Clave de API, agregador | [enlace](https://yolo-auto.com) | El acceso gratuito a la API tiene un límite de solicitudes y está destinado a pruebas; no se publica ninguna cuota diaria numérica ni se promete que el acceso gratuito sea indefinido. | +| `zai` | `zai` | Z.AI | Clave de API | [enlace](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | Clave de API | [enlace](https://zenmux.ai) | Usa tu clave de API de ZenMux en Authorization: Bearer . ZenMux es totalmente compatible con OpenAI. URL base: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Clave de API, agregador | [enlace](https://www.zerolimitai.com) | Se anuncia una prueba gratuita temporal, pero las páginas oficiales se contradicen entre 3 y 7 días; una afirmación de 100 llamadas/día no se considera permanente. | +| `zylo-api` | `zylo` | Zylo API | Clave de API, agregador | [enlace](https://zyloai.net) | Plan Basic: 10 RPM, 7,200 solicitudes/día y 200,000 tokens/día; limitado a modelos de texto Basic. | ## Proveedores locales (14) diff --git a/docs/i18n/es/docs/routing/REASONING_REPLAY.md b/docs/i18n/es/docs/routing/REASONING_REPLAY.md index b6db150ac0f0..30c048ea293b 100644 --- a/docs/i18n/es/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/es/docs/routing/REASONING_REPLAY.md @@ -25,19 +25,21 @@ Sin embargo, los clientes habituales (Cursor, Cline, Roo Code, OpenAI SDK) elimi Turno N (el asistente genera): → la respuesta contiene reasoning_content + tool_calls → si requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - escribe (memoria + BD), indexado por cada tool_call.id + escribe en (memoria + BD), indexado por cada tool_call.id → reenvía la respuesta al cliente (que puede conservar o no el razonamiento) Turno N+1 (el cliente envía un seguimiento): → el traductor detecta: requiresReasoningReplay(provider, model) === true → para cada mensaje del asistente con tool_calls y sin reasoning_content: lookupReasoning(toolCalls[0].id) → memoria → BD - acierto → msg.reasoning_content = cached; recordReplay() - fallo → msg.reasoning_content = "" (alternativa heredada para versiones anteriores de DeepSeek) - → el proveedor ascendente recibe un historial coherente → no hay error 400 + encontrado → msg.reasoning_content = cached; recordReplay() + no encontrado → msg.reasoning_content = "" (alternativa heredada para versiones anteriores de DeepSeek) + → el servicio de origen recibe un historial coherente → no se produce un error 400 ``` -La captura se realiza en `open-sse/handlers/chatCore.ts` (en dos lugares, correspondientes a los dos puntos donde se llama a `cacheReasoningFromAssistantMessage`). La reproducción se realiza en `open-sse/translator/index.ts` después de la conversión del esquema, pero antes del envío. +La captura se realiza en `open-sse/handlers/chatCore.ts` (en dos lugares, en los dos puntos donde se llama a `cacheReasoningFromAssistantMessage`). La reproducción se realiza en `open-sse/translator/index.ts` después de la coerción del esquema, pero antes del envío. + +Los turnos simples del asistente (sin llamadas a herramientas) se indexan de forma diferente: `buildAssistantMessageCacheKey()` genera un resumen criptográfico del ámbito de la sesión junto con la transcripción normalizada en formato OpenAI hasta ese turno, porque DeepSeek requiere el razonamiento de _todos_ los turnos anteriores cuando `tools` está presente. Para los destinos de la API Responses (por ejemplo, `opencode-go/deepseek-v4-flash`, dirigido a `/responses`), el cuerpo enviado al servicio de origen contiene `input`, no `messages`, por lo que `translateRequest()` (`open-sse/translator/index.ts`) comunica mediante una opción de devolución de llamada la transcripción intermedia cuyo resumen criptográfico generó, y los puntos de captura generan el resumen criptográfico de esa misma transcripción. La fase de reproducción de Responses se ejecuta sobre la representación intermedia de OpenAI para todos los formatos de origen, por lo que también se reproducen los clientes de Anthropic Messages (Claude → OpenAI → Responses). ## Almacenamiento — Memoria híbrida + SQLite diff --git a/docs/i18n/es/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/es/docs/security/SOCKET_DEV_FINDINGS.md index 6de68d7be952..fcc8e1a0f3bf 100644 --- a/docs/i18n/es/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/es/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- -Este documento es la atestación redactada por el mantenedor para los seis +> **Nota sobre el alcance:** `socket.yml` configura el análisis posterior a la publicación de Socket.dev, del lado del registro, sobre el artefacto npm (rutas ignoradas para contenido no distribuido, como `tests/`, `docs/` e informes de compilación). No configura una comprobación de bloqueo para la integración de CI/PR: ningún flujo de trabajo de `.github/workflows`, ningún script de `package.json` ni ningún objetivo de `Makefile` invoca Socket.dev. + +Este documento es la declaración redactada por los mantenedores para los seis hallazgos de `AI-detected potential malware` detectados en `omniroute@3.8.5` y -las mitigaciones aplicadas en `omniroute@3.8.6`. Existe para que: +las medidas de mitigación aplicadas en `omniroute@3.8.6`. Existe para que: -1. Los operadores de canalizaciones de seguridad dispongan de una única referencia que citar cuando necesiten - evaluar los hallazgos frente al código fuente real. -2. Los futuros escáneres de IA puedan detectar la declaración firmada por el mantenedor de que cada +1. Los operadores de canalizaciones de seguridad tengan una única referencia que citar cuando necesiten + evaluar los hallazgos comparándolos con el código fuente real. +2. Los futuros escáneres de IA puedan detectar la declaración firmada por los mantenedores de que cada ruta marcada es intencional, opcional y está documentada. -3. Tengamos un registro escrito de _por qué_ cada sitio de llamada tiene la forma que tiene — - para que una futura refactorización no reintroduzca accidentalmente una huella que +3. Tengamos un registro escrito de _por qué_ cada lugar de llamada tiene la forma que tiene — + para que una refactorización futura no reintroduzca accidentalmente una huella que se eliminó deliberadamente. -Si opera un escáner que vuelve a marcar cualquiera de los sitios de llamada que aparecen a continuación después de que +Si opera un escáner que vuelve a marcar cualquiera de los lugares de llamada indicados a continuación después de que se hayan publicado las mitigaciones de v3.8.6, abra una incidencia con la traza del análisis y -ampliaremos aquí la atestación. +ampliaremos aquí la declaración. --- diff --git a/docs/i18n/et/README.md b/docs/i18n/et/README.md index e1bf1fe9a675..b23557a2d609 100644 --- a/docs/i18n/et/README.md +++ b/docs/i18n/et/README.md @@ -19,17 +19,17 @@
-## 💰 ~1.62B tasuta tokenit kuus +## 💰 ~1,62 mld tasuta tokenit kuus
-> Tasuta kasutustasemete käsitsi ühendamine on vaevarikas — kümned SDK-d, kümned kiirusepiirangud ja puudub ülevaade sellest, kui palju sul tegelikult kasutada on. OmniRoute’i kataloog sisaldab **491 tasuta kasutustaseme kirjet 35 korduva kogumivõtme lõikes** ning arvutab tokenite koondnäitaja **17 kogumi põhjal, millel on avaldatud positiivne kuueelarve, lisades viis mudelipõhist Groqi ülempiiri** ja eemaldades jagatud kogumitest tulenevad duplikaadid. Kvoodid, mis avanevad alles pärast piirkondliku identiteedi kontrollimist (praegu ModelScope), kuvatakse eraldi: +~6M pärast piirkondliku identiteedi kinnitamist; neid ei liideta kunagi koondnäitajale. Tulemus on alati nähtav juhtpaneelil (`/dashboard/free-tiers`). +> Tasuta tasemete käsitsi kombineerimine on vaevarikas — kümned SDK-d, kümned kiiruspiirangud ja puudub ülevaade sellest, kui palju sul tegelikult kasutada on. OmniRoute kataloog sisaldab **489 tasuta taseme kirjet 35 korduva kogumi võtme lõikes** ning arvutab tokenite koondnäitaja **17 kogumi põhjal, millel on avaldatud positiivne kuueelarve, ning lisaks viie mudelipõhise Groqi ülempiiri põhjal**, eemaldades jagatud kogumite duplikaadid. Kvoodid, mis avanevad alles pärast piirkondliku isikusamasuse kontrolli (praegu ModelScope), kuvatakse eraldi — +~6 mln pärast piirkondliku isikusamasuse kinnitamist — ning neid ei liideta kunagi koondnäitajale. Tulemus on alati nähtav töölaual (`/dashboard/free-tiers`). -OmniRoute’i tasuta kasutustaseme eelarvekaart: püsivalt ~1.62B tasuta tokenit kuus, registreerumiskrediitidega esimesel kuul kuni ~2.22B, ühest lõpp-punktist kättesaadava 491 kataloogitud tasuta kasutustaseme kirje ja 35 dokumenteeritud korduva kogumivõtme põhjal. Aus, kogumite duplikaate eemaldav arvutus — iga jagatud kogumit arvestatakse ainult üks kord, sealhulgas 17 korduvat kogumit, millel on avaldatud positiivne kuine tokenieelarve, ning viis mudelipõhist Groqi ülempiiri; kasutustingimuste riskikataloogis on 13 teenusepakkujat märgitud vältimiseks, et saaksid ise otsustada. Eelarveriba sisaldab Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (viis mudelipõhist ülempiiri) ja väiksemaid kogumeid; lisaks kuvatakse eraldi esimese kuu registreerumiskrediidid ning püsivalt tasuta ja tokenipiiranguta teenusepakkujad, et need ei suurendaks kunagi eksitavalt koondnäitajat. Reaalajas kasutatud/järelejäänud maht aadressil /dashboard/free-tiers. +OmniRoute’i tasuta taseme eelarvekaart: püsivalt ~1,62 mld tasuta tokenit kuus, registreerumiskrediitidega esimesel kuul kuni ~2,22 mld, 35 dokumenteeritud korduva kogumi võtme kaudu, mis hõlmavad ühe lõpp-punkti taga 489 kataloogitud tasuta taseme kirjet. Aus, kogumite duplikaate eemaldav arvutus — iga jagatud kogumit arvestatakse üks kord, sealhulgas 17 korduvat kogumit, millel on avaldatud positiivne igakuine tokenieelarve, ning viis mudelipõhist Groqi ülempiiri; tingimuste riskikataloogis on 13 pakkujat märgitud vältimiseks, et saaksid ise otsustada. Eelarveriba sisaldab Mistrali 1 mld, Nara 210 mln, LLM7 150 mln, xKiro 150 mln, Groqi 30 mln (viis mudelipõhist ülempiiri) ja väiksemaid kogumeid; lisaks kuvatakse eraldi esimese kuu registreerumiskrediidid ning püsivalt tasuta tokenipiiranguta pakkujad, et need ei paisutaks kunagi koondnäitajat. Reaalajas kasutatud/järelejäänud maht lehel /dashboard/free-tiers. -> Reaalajas `/dashboard/free-tiers` lehe animeeritud kokkuvõte. Täielik metoodika (kogumite duplikaatide eemaldamine, krediiditasemed, teenusepakkujate tingimused): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Reaalajas `/dashboard/free-tiers` lehe animeeritud kokkuvõte. Täielik metoodika (kogumite duplikaatide eemaldamine, krediiditasemed, pakkujate tingimused): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Neid arve auditeeritakse iga kahe nädala järel uuesti, võrreldes neid reaalajas kataloogiga, ning need **liiguvad mõlemas suunas** — kui teenusepakkuja lõpetab tasuta kasutustaseme, arv väheneb; uue lisandumisel see kasvab. Avaldame alati selle, mida kataloog tegelikult arvutab, mitte ülespoole ümardatud parimat võimalikku tulemust. +> Neid arve auditeeritakse iga kahe nädala järel reaalajas kataloogi põhjal uuesti ning need **liiguvad mõlemas suunas** — kui pakkuja lõpetab tasuta taseme pakkumise, arv väheneb; uue lisandumisel see suureneb. Avaldame selle, mida kataloog tegelikult arvutab, mitte kunagi ülespoole ümardatud parimat võimalikku tulemust.
@@ -37,29 +37,29 @@

-⭐ Lisa repositoorium lemmikuks, kui OMNIROUTE aitas sul raha säästa ja tööd lihtsustada. +⭐ Lisa repositoorium lemmikuks, kui OMNIROUTE aitas sul raha säästa ja tööd lihtsamaks muuta.

[![Tähed](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) diegosouzapw%2FOmniRoute | Trendshift -[![Tähtede ajaloo edetabelikoht](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) +[![Täheajaloo koht](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) [![olud.ai](https://olud.ai/badge.php?tool=diegosouzapw-omniroute)](https://olud.ai/project/diegosouzapw-omniroute.html) ### 💬 Liitu kogukonnaga -**👋 Jälgi haldajat — saa uutest teenusepakkujatest, väljalasetest ja nõuannetest teada esimesena:** +**👋 Jälgi hooldajat — saa uutest pakkujatest, väljalasetest ja nõuannetest teada esimesena:** [![Jälgi Diegot LinkedInis](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Jälgi kasutajat @diegosouzapw GitHubis](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![WhatsApp Global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) -[![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) +[![WhatsApp ülemaailmne](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp Brasiilia](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Veebisait](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Küsimused, teenusepakkujate soovitused, tegevuskava ja kasutajatugi → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Globaalne](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasiilia](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portaal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Küsimused, pakkujatega seotud nõuanded, tegevuskava ja tugi → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Ülemaailmne](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasiilia](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portaal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -590,59 +590,59 @@ Radar on vabatahtlik ja kasutab ainult GET-päringuid. OmniRoute'i klient ei laa
-## 🤖 Ühilduvad CLI-d ja koodiagendid +## 🤖 Ühilduvad CLI-d ja kodeerimisagendid -> Üks konfiguratsioon — `http://localhost:20128/v1` — ja **kõik** AI IDE-d või CLI-d töötavad tasuta ja odavate mudelitega. +> Üks konfiguratsioon — `http://localhost:20128/v1` — ja **iga** tehisintellektil põhinev IDE või CLI töötab tasuta ja soodsate mudelitega.
- - - + + + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + +
Claude Code
Claude Code
Codex CLI
Codex CLI
Cline
Cline
Claude Code
Claude Code
                           
Codex CLI
Codex CLI
                           
Cline
Cline
                           
Kilo Code
Kilo Code
Zoo Code
Zoo Code
Continue
Continue
Continue
Continue
                           
Aider
Aider
ForgeCode
ForgeCode
jcode
jcode
DeepSeek TUI
DeepSeek TUI
CodeWhale
CodeWhale
OpenCode
OpenCode
Aider
Aider
                           
ForgeCode
ForgeCode
                           
jcode
jcode
                           
DeepSeek TUI
DeepSeek TUI
                           
CodeWhale
CodeWhale
                           
OpenCode
OpenCode
                           
Factory Droid
Factory Droid
GitHub Copilot CLI
Copilot CLI
Cursor CLI
Cursor CLI
Smelt
Smelt
Pi (pi-coding-agent)
Pi
Grok Build (xAI)
Grok Build
Factory Droid
Factory Droid
                           
GitHub Copilot CLI
Copilot CLI
                           
Cursor CLI
Cursor CLI
                           
Smelt
Smelt
                           
Pi (pi-coding-agent)
Pi
                           
Grok Build (xAI)
Grok Build
                           
Hermes Agent (Nous Research)
Hermes Agent
OpenClaw
OpenClaw
Goose
Goose
Open Interpreter
Open Interpreter
Warp AI
Warp AI
Agent Deck
Agent Deck
Hermes Agent (Nous Research)
Hermes Agent
                           
OpenClaw
OpenClaw
                           
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
deyin.ai
deyin.ai
                           
-+ töötab ka koos · Kiro · Command Code · Antigravity · Windsurf · AMP · iga OpenAI-ühilduva tööriistaga ++ töötab ka nendega · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · mis tahes OpenAI-ga ühilduv tööriist
-📖 Iga tööriista jaoks eraldi seadistusjuhis kõigi 36 tööriista kohta (26 CLI koodiagenti + 10 CLI agenti) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Tööriistapõhine seadistus kõigile 36 tööriistale (26 CLI-kooditööriista + 10 CLI-agenti) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode'i pistikprogramm → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Käivita iga toetatud CLI OmniRoute kaudu ühe käsuga** — konfiguratsioonifaile ei kirjutata, -volitused süstitakse protsessi kaupa, Qwen/Gemini saavad ühekordse eraldatud kodukataloogi: +**Käivitage OmniRoute'i kaudu mis tahes toetatud CLI ühe käsuga** — konfiguratsioonifaile ei kirjutata, +mandaadid lisatakse igale protsessile eraldi ning Qwen/Gemini saavad ajutise isoleeritud kodukataloogi: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,23 +653,23 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Või vali provider+mudel interaktiivselt ja kirjuta tööriista oma konfiguratsioon: +# Või valige pakkuja ja mudel interaktiivselt ning kirjutage tööriista enda konfiguratsioon: omniroute configure codex # samuti: claude opencode qwen aider goose gemini cline continue kilo ``` -Kõik käsud austavad aktiivset kaugkontekst (`omniroute connect `), `--dry-run` -näitab ette täpsed env/argumendid ilma käivitamata, ja `--api-key-env NAME` hoiab saladused -eemal sinu shelli ajaloost. → [CLI integratsioonid](docs/guides/CLI-INTEGRATIONS.md) +Iga käsk arvestab aktiivset kaugkonteksti (`omniroute connect `), `--dry-run` +näitab enne käivitamist täpseid keskkonnamuutujaid ja argumente ning `--api-key-env NAME` hoiab saladused +teie shelli ajaloost eemal. → [CLI-integratsioonid](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 tehisintellekti pakkujat — 152 kataloogis tasuta teenusena märgitud +## 🌐 357 AI-teenusepakkujat — 152 kataloogis tasuta kasutatavaks märgitud
-> **357 registreeritud pakkujat** kanoonilistes vestlus-, meedia-, otsingu-, kohalike, pilveagentide ja süsteemikogudes, sealhulgas **152 pakkujat, mille tuvastusmetaandmetes on `hasFree: true`**. Vestlusmudelite register hõlmab **229 pakkujat / 2 554 unikaalset pakkuja-mudeli paari / 1 283 töötlemata mudeli ID-d**; eraldiseisvas tasuta kasutusmahu kataloogis on **491 mudelipõhist rida**, **35 korduvat ressursside kogumit** ja **54 korduva tasuta kasutusmahuga või võtmeta igavesti tasuta pakkujat**. Need nimetajad on teadlikult erinevad; määratlused ja kogumite dubleerimist välistavad arvutused leiate jaotistest [Pakkujate teatmik](docs/reference/PROVIDER_REFERENCE.md) ja [Tasuta paketid](docs/reference/FREE_TIERS.md). +> **357 registreeritud teenusepakkujat** kanoonilistes vestluse, meedia, otsingu, kohalikes, pilveagentide ja süsteemi kogumites, sealhulgas **152 teenusepakkujat, mille tuvastusmetaandmetes on `hasFree: true`**. Vestlusmudelite register hõlmab **229 teenusepakkujat / 2 554 eraldiseisvat teenusepakkuja ja mudeli paari / 1 283 töötlemata mudeli ID-d**; eraldi tasuta kasutuseelarve kataloogis on **491 mudelipõhist rida**, **35 korduvat kogumit** ning **54 korduvat/võtmeta igavesti tasuta teenusepakkujat**. Need nimetajad on taotluslikult erinevad; definitsioonid ja kogumite dubleerimist välistavad arvutused leiate jaotistest [Teenusepakkujate teatmik](docs/reference/PROVIDER_REFERENCE.md) ja [Tasuta paketid](docs/reference/FREE_TIERS.md).
@@ -702,7 +702,7 @@ eemal sinu shelli ajaloost. → [CLI integratsioonid](docs/guides/CLI-INTEGRATIO -…ja veel üle 330 — iga ikoon laaditakse reaalajas juhtpaneeli pakkujakataloogist. 📖 [Pakkujate teatmik](docs/reference/PROVIDER_REFERENCE.md) +…ja veel üle 330 — kõik ikoonid laaditakse reaalajas juhtpaneeli teenusepakkujate kataloogist. 📖 [Teenusepakkujate teatmik](docs/reference/PROVIDER_REFERENCE.md)
@@ -710,8 +710,8 @@ eemal sinu shelli ajaloost. → [CLI integratsioonid](docs/guides/CLI-INTEGRATIO - - + + @@ -722,7 +722,7 @@ eemal sinu shelli ajaloost. → [CLI integratsioonid](docs/guides/CLI-INTEGRATIO - +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Tokenipiirang puudub
Kilo Code
Kilo Code
Automaatne marsruuter, Tencent Hy3
Alati tasuta
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Tokenipiiranguta
Kilo Code
Kilo Code
Automaatne ruuter, Tencent Hy3
Alati tasuta
Requesty
Requesty
GPT-OSS 120B, Nemotron
Alati tasuta
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Tasuta pakett
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Alati tasuta
Pollinations
Pollinations
GPT, Llama, Claude
Võtit pole vaja
Cloudflare AI
Cloudflare AI
Üle 50 mudeli
10K neuronit päevas
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM tasuta
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M tokenit päevas
Openference
Openference
Qwen3.8 27B, Llama 3.2
Tasuta pakett
OpenRouter
OpenRouter
:free mudelid
+$10 → suurem RPM
@@ -1226,21 +1226,21 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 - + - - + + - - - - - + + + + + - +
KihtTehnoloogia
TäituskeskkondNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
KeelTypeScript 6.0 — 100% TypeScript kataloogides src/ ja open-sse/ (alates versioonist v2.0 pole tuumikus ühtegi any tüüpi)
KeelTypeScript 6.0 — 100% TypeScript kataloogides src/ ja open-sse/ (alates versioonist v2.0 pole tuumkoodis ühtegi any-tüüpi)
RaamistikNext.js 16 + React 19 + Tailwind CSS 4
Andmebaasbetter-sqlite3 (SQLite, WAL-logimine) + LowDB (pärand-JSON) — 122 domeenimoodulit, 176 migratsiooni
MäluSQLite FTS5 täistekstiotsing + int8-kvantiseeritud vektormanused, tüübitud hääbumine
Andmebaasbetter-sqlite3 (SQLite, WAL-päevik) + LowDB (pärandvormingus JSON) — 122 domeenimoodulit, 178 migratsiooni
MäluSQLite FTS5 täistekstiotsing + int8-kvanditud vektormanused, tüübitud hääbumine
SkeemidZod 4 — MCP-tööriistade sisendi/väljundi valideerimine + API-lepingud
ProtokollidMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
VoogedastusServer-Sent Events (SSE) + WebSocket-sild (/v1/ws)
Tihendamine12-mootoriline konveier — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autentimine ja turvalisusOAuth 2.0 (PKCE) + JWT + API-võtmed + ulatustega MCP-autentimine · AES-256-GCM jõudeolekus · DOMPurify
Varjatuswreq-js — JA3 / JA4 TLS-sõrmejälje matkimine, 3-tasemeline puhverserver
TõrkekindlusKaitselüliti, eksponentsiaalne viivitus, päringuvalangu vältimine, automaatkombinatsioonide iseparanemine
VoogedastusServer-Sent Events (SSE) + WebSocketi sild (/v1/ws)
Tihendamine12 mootoriga konveier — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autentimine ja turvalisusOAuth 2.0 (PKCE) + JWT + API-võtmed + MCP piiratud ulatusega autentimine · AES-256-GCM jõudeolekus · DOMPurify
Varjatuswreq-js — JA3 / JA4 TLS-sõrmejälje jäljendamine, 3-tasemeline puhverserver
VastupidavusKaitselüliti, eksponentsiaalne tagasipõrge, päringuvalangu vältimine, automaatkombinatsioonide iseparanemine
Logiminepino — struktureeritud JSON-logid koos päringukontekstiga
TestimineNode.js-i testikäitaja + Vitest — 39 000+ staatilist testideklaratsiooni enam kui 5100 jälgitavas testifailis (üksus-, integratsiooni-, E2E-, turbe- ja ökosüsteemitestid)
PlatvormidTöölaud (Electron) · Android (Termux) · PWA (mis tahes brauser)
CI/CDGitHub Actions — automaatne avaldamine npm-is + Docker Hubis versiooni väljalaskmisel
CI/CDGitHub Actions — automaatne avaldamine npm-is + Docker Hubis väljalaske korral
LingidVeebisait · npm · Docker Hub
@@ -1257,24 +1257,24 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 - + - - - + + +
DokumentKirjeldus
KasutusjuhendPakkujad, kombinatsioonid, CLI-integratsioon, juurutamine
SeadistusjuhendKõik installimisviisid, CLI-tööriistade konfiguratsioonid, protokollide seadistamine, ajalõppude häälestamine
SeadistusjuhendKõik paigaldusmeetodid, CLI-tööriistade konfiguratsioonid, protokollide seadistamine, ajalõppude häälestamine
CLI-tööriistade juhendTööriistapõhine seadistamine Claude Code'i, Codexi, Cursori, Cline'i, OpenClaw', Kilo ja Copiloti jaoks
KaugrežiimJuhtige oma sülearvuti CLI kaudu kaugserveris (VPS-is) töötavat OmniRoute'i piiratud ulatusega juurdepääsutunnuste abil
Claude Code'i konfiguratsioonSuunake Claude Code OmniRoute'i (kohalikku/kaugserverisse), kasutades käsku launch ja mudelipõhiseid profiile
KiirjuhendKolm sammu: installimine → ühendamine → konfigureerimine
KaugrežiimKaug-OmniRoute'i (VPS) juhtimine sülearvuti CLI-st piiratud ulatusega juurdepääsutõendite abil
Claude Code'i konfiguratsioonClaude Code'i ühendamine OmniRoute'iga (kohalik/kaugühendus), kasutades käsku launch ja mudelipõhiseid profiile
KiiralustusKolm sammu: paigalda → ühenda → konfigureeri
### 🔧 Käitamine ja juurutamine - + - + - - + +
DokumentKirjeldus
Dockeri juhendDocker run, Compose'i profiilid, Caddy HTTPS, tunnelid, tõmmiste sildid
Dockeri juhendDocker run, Compose'i profiilid, Caddy HTTPS, tunnelid, tõmmisesildid
Podmani juhendQuadleti systemd-integratsioon, podman-compose, SELinux
Virtuaalmasinasse juurutamineTäielik juhend: virtuaalmasina, nginxi ja Cloudflare'i seadistamine
Fly.io-sse juurutamineJuurutamine Fly.io-sse püsiva andmesalvestusega
Fly.io-sse juurutamineJuurutamine Fly.io-sse püsiva salvestusruumiga
Termuxi juhendOmniRoute'i käitamine Androidis Termuxi kaudu
PWA juhendProgressiivse veebirakenduse installimine, vahemällu salvestamine, arhitektuur
DesinstallimisjuhendPuhas eemaldamine kõigi installimisviiside korral
PWA juhendProgressiivse veebirakenduse paigaldamine, vahemällu salvestamine ja arhitektuur
DesinstallimisjuhendPuhas eemaldamine kõigi paigaldusmeetodite korral
Keskkonna konfiguratsioonKõik .env muutujad ja viited
@@ -1282,16 +1282,16 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 - - - - - + + + + + - - + + - +
DokumentKirjeldus
ArhitektuurSüsteemi arhitektuur, andmevoog ja sisemised mehhanismid
TihendusjuhendSeitsme valikuga töövoog: väljas / kerge / standardne / agressiivne / ultra / RTK / virnastatud
RTK-tihendusKäsuväljundi tihendamine, filtrid, usaldamine, kontrollimine, töötlemata väljundi taastamine
TihendusmootoridCaveman, RTK, virnastatud töövood, töölaua/API/MCP liidesed
Tihendusreeglite vormingCavemani ja RTK filtrite JSON-reeglipakettide skeemid
ArhitektuurSüsteemi arhitektuur, andmevoog ja sisemine toimimine
TihendusjuhendSeitsme valikuga konveier: väljas / kerge / standardne / agressiivne / ultra / RTK / virnastatud
RTK-tihendusKäsuväljundi tihendamine, filtrid, usaldus, kontrollimine, toorväljundi taastamine
TihendusmootoridCaveman, RTK, virnastatud konveierid, töölaua/API/MCP liidesed
Tihendusreeglite vormingJSON-reeglipakettide skeemid Cavemani ja RTK filtrite jaoks
Tihenduse keelepaketidKeeletuvastus ja Cavemani reeglipakettide koostamine
Töökindluse juhendKaitselülitid, jahtumisajad, järjekord, päringutulva vältimine, TLS-i võltsimine
Automaatkombinatsiooni mootor16 teguriga hindamine, režiimipaketid, isetaastumine
Tõrkekindluse juhendKaitselülitid, ooteajad, järjekord, päringutulva vältimine, TLS-i võltsimine
Automaatsete kombinatsioonide mootor16 teguriga hindamine, režiimipaketid, isetaastumine
Puhverserveri juhendKolmetasemeline puhverserverisüsteem, 1proxy turg, registri CRUD-toimingud
Tasuta kasutustasemedKoondkataloog: 35 dokumenteeritud korduvate ressursside kogumit / 491 kataloogitud tasuta kasutustaseme kirjet
Tasuta paketidKoondkataloog: 35 dokumenteeritud korduvkasutatavat kogumit / 489 kataloogitud tasuta paketi kirjet
Funktsioonide galeriiVisuaalne töölaua tutvustus ekraanipiltidega
Koodibaasi dokumentatsioonAlgajasõbralik koodibaasi ülevaade
@@ -1300,10 +1300,10 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 - + - - + +
DokumentKirjeldus
API teatmikKõik lõpp-punktid koos näidetega
API-teatmikKõik lõpp-punktid koos näidetega
OpenAPI spetsifikatsioonOpenAPI 3.0 spetsifikatsioon
MCP-server110 MCP-tööriista, IDE-konfiguratsioonid, Python/TS/Go kliendid
MCP-serveri juhendMCP installimine, transpordimehhanismid ja tööriistade teatmik
MCP-server110 MCP-tööriista, IDE konfiguratsioonid, Pythoni/TS-i/Go kliendid
MCP-serveri juhendMCP paigaldamine, transpordid ja tööriistade teatmik
A2A-serverJSON-RPC 2.0 protokoll, oskused, voogedastus, ülesannete haldus
A2A-serveri juhendA2A agendikaart, ülesanded, oskused ja voogedastus
@@ -1312,27 +1312,27 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 - - - + + + - - - + + +
DokumentKirjeldus
Kaastöö tegemineArenduskeskkonna seadistamine ja suunised
Harude ja väljalasete mudelKuhu PR-id suunatakse (release/*) ning mida tähendavad main ja sildid
Muudatuste logiTäielik väljalasete ajalugu versioonide kaupa
Kaastöö tegemineArenduskeskkonna seadistamine ja juhised
Harude ja väljalasete mudelMillistele harudele PR-id suunatakse (release/*) ning mida tähendavad main ja sildid
Muudatuste logiTäielik versioonipõhine väljalasete ajalugu
TurbepoliitikaTurvanõrkustest teatamine ja turbepraktikad
i18n-i juhend42 keele tugi, tõlketöövoog, RTL
Väljalaske kontrollnimekiriVäljalaske-eelsed valideerimistoimingud
Testikatte plaanTestikatte strateegia enam kui 39 000 staatilise testideklaratsiooni jaoks enam kui 5 100 jälgitavas testifailis
i18n-juhend42 keele tugi, tõlkimise töövoog, RTL
Väljalaske kontrollnimekiriVäljalaske-eelse valideerimise etapid
Testikatvuse plaanTestikatvuse strateegia enam kui 39 000 staatilise testideklaratsiooni jaoks enam kui 5 100 jälgitavas testifailis

-# ⭐ Parimad kaastöötajad +# ⭐ Parimad kaasautorid -> OmniRoute'i kujundab pühendunud avatud lähtekoodi kogukond. Need inimesed on andnud erakordse panuse, mis mõjutab otseselt projekti kvaliteeti, stabiilsust ja ulatust. **Aitäh teile.** +> OmniRoute'i kujundab pühendunud avatud lähtekoodiga kogukond. Need inimesed on andnud erakordse panuse, mis mõjutab otseselt projekti kvaliteeti, stabiilsust ja haaret. **Aitäh teile.** -### Välised kaastöötajad ühendatud tõmbetaotluste arvu järgi +### Välised kaasautorid ühendatud tõmbetaotluste arvu järgi - + @@ -1356,9 +1356,9 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13
KohtKaastöötajaÜhendatud PR-id~Muudetud ridu
KohtKaasautorÜhendatud PR-id~Muudetud ridu
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Fikseeritud aktiivse release/v3.8.50 haru tipus dafb4ae808, hõlmates ühendamisi kuni 2026-08-24 05:26:03 UTC. Lehekülgedeks jaotatud GitHub GraphQL-i loendus sisaldab 5 911 ühendatud PR-i: 2 707 hoidla omanikult, 179 Dependabotilt ja 3 025 välist PR-i 535 erinevalt kaastöötajalt. „Muudetud read” tähendab GitHubi lisamiste ja kustutamiste summat ning hõlmab genereeritud faile, lukufaile, katalooge, tõlkeid ja dokumentatsiooni; see näitab muudatuste mahtu, mitte autori kirjutatud koodiridu. Piirväärtusel viiki jäänud kaastöötajad on loendisse jäetud. +Fikseeritud aktiivse haru release/v3.8.50 tipus dafb4ae808, hõlmates ühendamisi kuni 2026-08-24 05:26:03 UTC. Lehekülgedeks jaotatud GitHub GraphQL-i loendus sisaldab 5 911 ühendatud PR-i: 2 707 repositooriumi omanikult, 179 Dependabotilt ja 3 025 välist PR-i 535 erinevalt kaasautorilt. „Muudetud read” tähendab GitHubi lisamiste ja kustutamiste summat ning hõlmab genereeritud faile, lukufaile, katalooge, tõlkeid ja dokumentatsiooni; see näitab muudatuste mahtu, mitte autori kirjutatud koodiridade arvu. Piirile jäänud viigiseisud on säilitatud. -### GitHubile omistatud kommitid +### GitHubi omistatud sissekanded @@ -1367,42 +1367,42 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 backryun
backryun
- 🥇 220 GitHubile omistatud sissekannet + 🥇 220 GitHubile omistatud kinnitust @@ -1411,42 +1411,42 @@ Kanoonilised näitajad 2026-08-24 seisuga: **1029 unikaalset videot** · **11 13 Dizzle
Dizzle
- 🏅 69 GitHubile omistatud sissekannet · jagatud 6. koht + 🏅 69 GitHubile omistatud kinnitust · jagatud 6. koht
Paijo
Paijo

- 🥈 219 GitHubile omistatud sissekannet + 🥈 219 GitHubile omistatud kinnitust
Randi
Randi

- 🥉 108 GitHubile omistatud sissekannet + 🥉 108 GitHubile omistatud kinnitust
Ravi Tharuma
Ravi Tharuma

- 🏅 81 GitHubile omistatud sissekannet + 🏅 81 GitHubile omistatud kinnitust
Chris
Chris

- 🏅 70 GitHubile omistatud sissekannet + 🏅 70 GitHubile omistatud kinnitust
Markus Hartung
Markus Hartung

- 🏅 69 GitHubile omistatud sissekannet · jagatud 6. koht + 🏅 69 GitHubile omistatud kinnitust · jagatud 6. koht
Jan Leon
Jan Leon

- 🏅 64 GitHubile omistatud sissekannet + 🏅 64 GitHubile omistatud kinnitust
zenobit
zenobit

- 🏅 62 GitHubile omistatud sissekannet + 🏅 62 GitHubile omistatud kinnitust
Bob.Hou
Bob.Hou

- 🏅 51 GitHubile omistatud sissekannet · jagatud 10. koht + 🏅 51 GitHubile omistatud kinnitust · jagatud 10. koht
Xiangzhe
Xiangzhe

- 🏅 51 GitHubile omistatud sissekannet · jagatud 10. koht + 🏅 51 GitHubile omistatud kinnitust · jagatud 10. koht
-Kontrollitud uuesti 2026-08-24 06:14:31 UTC: hoidla Contributors API teatatud GitHubile omistatud sissekanded vaikeharus release/v3.8.50. API tagastas 525 identiteeti (415 kasutajat, 2 robotit, 108 anonüümset); sellest tabelist on välja jäetud haldaja, robotid ja anonüümsed identiteedid ning võrdsete tulemustega kohad on säilitatud. See erineb nii ülaltoodud ühendatud tõmbetaotluste pingereast kui ka alltoodud 639 inimesega Git-metaandmete loendusest. +Kontrollitud uuesti 2026-08-24 06:14:31 UTC: hoidla Contributors API teatatud GitHubile omistatud kinnitused vaikeharus release/v3.8.50. API tagastas 525 identiteeti (415 kasutajat, 2 robotit, 108 anonüümset); sellest tabelist on välja jäetud hooldaja, robotid ja anonüümsed identiteedid ning võrdsete tulemuste korral on kohad säilitatud. See erineb nii ülaltoodud ühendatud PR-ide edetabelist kui ka alltoodud 639 inimesega Git-metaandmete loendusest. -> 🙏 Nende panustajate funktsioonid, veaparandused ja taristu täiustused on **keskne osa** sellest, mis muudab OmniRoute'i töökindlaks ja funktsioonirohkeks. Iga tõmbetaotlus, iga testjuhtum ja iga i18n-tõlkefail on oluline. Avatud lähtekood valmib tänu sellistele inimestele nagu nemad. +> 🙏 Nende kaastöötajate loodud funktsioonid, veaparandused ja taristu täiustused on **põhiosa** sellest, mis teeb OmniRoute'i töökindlaks ja funktsioonirohkeks. Iga tõmbetaotlus, iga testjuhtum ja iga i18n-tõlkefail on oluline. Avatud lähtekood sünnib tänu sellistele inimestele nagu nemad.
diff --git a/docs/i18n/et/SECURITY.md b/docs/i18n/et/SECURITY.md index 727b026096b1..1086b71f433e 100644 --- a/docs/i18n/et/SECURITY.md +++ b/docs/i18n/et/SECURITY.md @@ -220,35 +220,40 @@ Neid reegleid jõustavad tööriistad ja ülevaatajad: 10. **`exec()` / `spawn()` käitusväärtused läbi `env` valiku** — ära kunagi stringi-interpoleeri väliseid teid või ebausaldusväärseid väärtusi shelli kaudu käivitatavatesse skriptidesse. Viide: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Eelista vaikimisi turvalisi teeke** — vaata [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Kasuta neid enne oma lahenduse kirjutamist. -## Tarneahela skanneri leiud (Socket.dev / Snyk / sarnased) +## Tarneahela skanneri tuvastused (Socket.dev / Snyk / sarnased) -Avaldatud `omniroute` npm-i artefakt sisaldab Next.js-i `output: "standalone"` -järku, mis tähendab, et iga marsruudikäitleja — sealhulgas dokumenteeritud privilegeeritud -funktsioonid (MITM, Zedi import, Cloud Sync, manustatud teenuste järelevaataja) — jõuab -minimeeritud fragmentidena kataloogi `.next/server/*.js`. Heuristilised tarneahela skannerid -võrdlevad neid fragmente sageli pahavara signatuuride mustritega. +> **Ulatusmärkus:** hoidla juurkaustas olev `socket.yml` määrab üksnes Socket.dev registripoolse avaldamisjärgse skanni `projectIgnorePaths` sätted avaldatud npm-artefakti jaoks — see ei ole jõustatud CI/PR-i liitmise kontrollpunkt. Ükski `.github/workflows` töövoog, `package.json` skript ega `Makefile` sihtmärk ei käivita Socket.dev-i. -Meie kasutatav skanneri konfiguratsioon asub repositooriumi juurkataloogis failis +Avaldatud `omniroute` npm-artefakt sisaldab Next.js-i `output: "standalone"` +järku, mis tähendab, et iga marsruudikäitleja — sealhulgas dokumenteeritud +privilegeeritud funktsioonid (MITM, Zedi import, Cloud Sync, manustatud teenuste +järelevaataja) — jõuab `.next/server/*.js` minimeeritud tükkidesse. Heuristilised +tarneahela skannerid võrdlevad neid tükke sageli mustripõhiselt pahavara +signatuuridega. + +Meie kasutatav skanneri konfiguratsioon asub hoidla juurkaustas failis [`socket.yml`](socket.yml) (Socket.dev GitHub Appi vorming v2 — vt ). See välistab sõnaselgelt -mittelisatavad kataloogid (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/` jne), et skanner raporteeriks ainult kooditeedest, mis -tegelikult avaldatud versiooni kasutajateni jõuavad — skannimist ennast käitab seda faili lugev Socketi -GitHub App, mitte selle repositooriumi töövoog. +mittetarnitavad kataloogid (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` jne), et skanner esitaks teateid ainult nende +kooditeede kohta, mis tegelikult avaldatud versiooni kasutajateni jõuavad — +skanni ennast käitab seda faili lugev Socket GitHub App, mitte selle hoidla +töövoog. -Iga leiukategooria kohta haldame iga leiu jaoks hooldaja kinnitust: +Iga tuvastuskategooria kohta hoiame haldaja kinnitust: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - leiupõhine vastendus: lähtefail ↔ märgistatud fragment ↔ käitumine ↔ versioonis v3.8.6 - rakendatud leevendus. -- Lähtekoodis olevad `SECURITY-AUDITOR-NOTE:` plokid iga märgistatud funktsiooni juures - viitavad samale dokumendile. - -Kasutajad, kelle konveier ei saa hoiatust leevendada, peaksid järgu looma käsuga -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. See asendab neli -tundlikku moodulit stubidega, mis tagastavad käitusajal HTTP 503 `feature-disabled`, -nii et privilegeeritud kooditeed puuduvad paketist füüsiliselt. -Avaldamisjuhised leiate failist [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). + tuvastuspõhine vastavuskaart: lähtefail ↔ märgistatud tükk ↔ käitumine ↔ + versioonis v3.8.6 rakendatud leevendus. +- Lähtekoodis olevad `SECURITY-AUDITOR-NOTE:` plokid iga märgistatud funktsiooni + juures viitavad samale dokumendile. + +Kasutajad, kelle konveier ei võimalda hoiatust leevendada, saavad järgu luua +käsuga `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. See asendab neli +tundlikku moodulit stubidega, mis tagastavad käitusajal HTTP 503 +`feature-disabled`, mistõttu privilegeeritud kooditeed paketis füüsiliselt +puuduvad. Avaldamisjuhiseid vt failist +[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Viited diff --git a/docs/i18n/et/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/et/docs/architecture/CODEBASE_DOCUMENTATION.md index 06ae72ffd3f4..e7e13935d627 100644 --- a/docs/i18n/et/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/et/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -435,8 +435,8 @@ Jaotatud keskendunud alamkataloogidesse: ## 4. `open-sse/` — voogedastusmootori tööruum -Eraldi npm-i tööruum, mis avaldatakse paketina `@omniroute/open-sse`. Hõlmab päringute -töötlemist, täitureid, tõlkijaid, teenuseid, teisendajat ja MCP-serverit. +Eraldi npm-i tööruum, mis avaldatakse paketina `@omniroute/open-sse`. Haldab päringute +töötlemist, täitureid, tõlkureid, teenuseid, teisendajat ja MCP-serverit. ``` open-sse/ @@ -444,67 +444,67 @@ open-sse/ ├── package.json Tööruumi manifest ├── tsconfig.json ├── types.d.ts -├── config/ Pakkujate registrid, päiseprofiilid, identiteet, … -├── handlers/ Päringutöötlejad (vestlus, manused, heli, pildid, …) +├── config/ Pakkujaregistrid, päiseprofiilid, identiteet, … +├── handlers/ Päringutöötlejad (vestlus, manused, heli, pilt, …) ├── executors/ 108 pakkujapõhist HTTP-täiturit -├── translator/ Vormingute teisendamine (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) +├── translator/ Vormingu teisendamine (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions voo teisendaja -├── services/ Üle 80 teenusemooduli (kombod, varulahendused, kvoodid, identiteet, …) -├── utils/ Voogedastuse abifunktsioonid, TLS-klient, AWS SigV4, puhverserveri fetch, … -└── mcp-server/ MCP-server (3 transporti, 33 mõjuala, 110 tööriista) +├── services/ Üle 80 teenusemooduli (kombod, varuvariandid, kvoodid, identiteet, …) +├── utils/ Voogedastuse abifunktsioonid, TLS-klient, AWS SigV4, puhverserveri päringud, … +└── mcp-server/ MCP-server (3 transporti, 33 kehtivusala, 110 tööriista) ``` ### 4.1 `open-sse/handlers/` -| Töötleja | Otstarve | -| ----------------------- | --------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Peamine vestluskonveier (vahemälu, kiiruspiirang, kombode marsruutimine, täituri käivitamine) | -| `responsesHandler.ts` | OpenAI Responses API sisenemispunkt | -| `embeddings.ts` | Manused | -| `imageGeneration.ts` | Piltide genereerimine | -| `audioSpeech.ts` | Tekst kõneks | -| `audioTranscription.ts` | Kõne tekstiks | -| `videoGeneration.ts` | Videote genereerimine | -| `musicGeneration.ts` | Muusika genereerimine | -| `rerank.ts` | Ümberjärjestamine | -| `moderations.ts` | Modereerimine | -| `search.ts` | Veebiotsing | -| `sseParser.ts` | SSE-sündmuste parser | -| `usageExtractor.ts` | Loendib ülesvooluvoogudest tokenid | -| `responseSanitizer.ts` | Eemaldab pakkujapõhise müra | -| `responseTranslator.ts` | Ühenduskiht pakkuja vastuse ja tõlkekihi vahel | +| Töötleja | Otstarve | +| ----------------------- | ---------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Peamine vestluskonveier (vahemälu, kiiruse piiramine, kombomarsruutimine, täituri käivitamine) | +| `responsesHandler.ts` | OpenAI Responses API sisenemispunkt | +| `embeddings.ts` | Manused | +| `imageGeneration.ts` | Piltide genereerimine | +| `audioSpeech.ts` | Tekst kõneks | +| `audioTranscription.ts` | Kõne tekstiks | +| `videoGeneration.ts` | Videote genereerimine | +| `musicGeneration.ts` | Muusika genereerimine | +| `rerank.ts` | Ümberjärjestamine | +| `moderations.ts` | Modereerimine | +| `search.ts` | Veebiotsing | +| `sseParser.ts` | SSE-sündmuste parser | +| `usageExtractor.ts` | Loendab ülesvoolu voogudest tokenid | +| `responseSanitizer.ts` | Eemaldab pakkujapõhise müra | +| `responseTranslator.ts` | Ühenduslüli pakkuja vastuse ja tõlkekihi vahel | ### 4.2 `open-sse/executors/` -108 pakkujatäiturit, millest igaüks laiendab `BaseExecutor`-it (`base.ts`): +108 pakkujatäiturit, millest igaüks laiendab klassi `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, lisaks `claudeIdentity.ts` -(jagatud identiteedi abimoodul) ja `index.ts` (register). +(jagatud identiteedi abifunktsioon) ja `index.ts` (register). > Märkus: siin loetlemata pakkujaid teenindab `default.ts`, kasutades üldist -> OpenAI-ga ühilduvat täiturit. Täielik pakkujate kataloog (355 pakkujat) asub failis +> OpenAI-ga ühilduvat täiturit. Täielik pakkujakataloog (355 pakkujat) asub failis > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Keskme ja kodarate mudelil põhinev tõlkimine (OpenAI on kese). +Keskme ja kodarate põhimõttel tõlkimine (OpenAI on kese). -- **9 päringutõlkijat** (`translator/request/`): +- **9 päringutõlkurit** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. -- **9 vastusetõlkijat** (`translator/response/`): +- **9 vastusetõlkurit** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. - **9 abimoodulit** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, lisaks - abimoodulite testid. -- **Piltide abimoodulid** (`translator/image/sizeMapper.ts`). + abifunktsioonide testid. +- **Pildiabimoodulid** (`translator/image/sizeMapper.ts`). - Tipptasemel: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` @@ -514,41 +514,41 @@ Keskme ja kodarate mudelil põhinev tõlkimine (OpenAI on kese). ### 4.5 `open-sse/services/` -Olulisemad osad (täielik loend asub kataloogis `open-sse/services/`): - -| Teema | Failid | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Kombomarsruutimine | `combo.ts` (19 strateegiat), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Automaatne kombomootor | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Tõrkekindlus | `accountFallback.ts` (ooteaeg + lukustus), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kvoodid | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Vahemällu salvestamine | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Marsruutimisloogika | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Mudelite käsitlemine | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Tihendamine | `compression/` — tihendusmootori täielik ühendusloogika | -| Luba + seanss | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Tase / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / võrk | `ipFilter.ts`, `webSearchFallback.ts` | -| Pakktöötlus | `batchProcessor.ts` | -| Kasutus | `usage.ts` | +Olulisemad moodulid (täielik loend asub kataloogis `open-sse/services/`): + +| Valdkond | Failid | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Combo-marsruutimine | `combo.ts` (19 strateegiat), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Auto Combo mootor | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Tõrkekindlus | `accountFallback.ts` (ooteaeg + lukustus), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kvoodid | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Vahemällu salvestamine | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Marsruutimise intelligentsus | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Mudelite käsitlemine | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Tihendamine | `compression/` — tihendusmootori täielik ühendamine | +| Tokenid + seansid | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Tase / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / võrk | `ipFilter.ts`, `webSearchFallback.ts` | +| Pakktöötlus | `batchProcessor.ts` | +| Kasutus | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 unikaalset tööriista**, mis on ühendatud failis `server.ts` (45 kanoonilist failis `schemas/tools.ts` + - mälu-, oskuste, GitHubi oskuste, ressursikogumi, mängustamise, pistikprogrammi, Notioni, Obsidiani, - kohaliku korpuse ja tihendamise moodulid — ühendkogumi loendab `countUniqueMcpTools`). -- **3 transporti**: stdio, voogedastatav HTTP, SSE. -- **33 kehtivusala**, mida jõustatakse käitusajal — põhiloend asub failis `src/shared/constants/mcpScopes.ts`, täielik kogum on iga tööriistamooduli deklareeritud kehtivusalade ühend. + mälu-, oskuste, GitHubi oskuste, puuli-, mängustamise, plugina-, Notioni, Obsidiani, + kohaliku korpuse ja tihendusmoodulid — ühendloend arvutatakse funktsiooniga `countUniqueMcpTools`). +- **3 transporti**: stdio, HTTP Streamable, SSE. +- Käitusajal jõustatakse **33 ulatust** — baasloend asub failis `src/shared/constants/mcpScopes.ts`, täielik hulk on iga tööriistamooduli deklareeritud ulatuste ühend. - Audititabel: `mcp_tool_audit` (täidab `audit.ts`). - Failid: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - ning testid kataloogis `__tests__/`. -- Tööriistade täielikku kataloogi vaadake failist [MCP-SERVER.md](../frameworks/MCP-SERVER.md). + lisaks testid kataloogis `__tests__/`. +- Täielikku tööriistakataloogi vaadake failist [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### 4.7 `open-sse/config/` -Pakkujaregistrid (`providerRegistry.ts`, `providerModels.ts`, +Pakkujate registrid (`providerRegistry.ts`, `providerModels.ts`, `providerHeaderProfiles.ts`), vormingupõhised mudeliregistrid (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), @@ -655,7 +655,7 @@ bin/ ## 8. `scripts/` -Korraldatud otstarbe järgi kuude alamkausta. +Jaotatud otstarbe järgi kuude alamkausta. - **`scripts/build/`** — `build-next-isolated.mjs`, `prepublish.ts`, `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, diff --git a/docs/i18n/et/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/et/docs/architecture/RESILIENCE_GUIDE.md index 39597eeea6ba..0a6d103e92ec 100644 --- a/docs/i18n/et/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/et/docs/architecture/RESILIENCE_GUIDE.md @@ -86,62 +86,127 @@ Regressioonikaitse: `tests/unit/provider-cooldown-window-gate.test.ts`. - `rateLimitedUntil` — ajatempel, milleni ooteaeg kestab - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — eksponentsiaalse tagasitaandumise loendur +- `backoffLevel` — eksponentsiaalse taganemise loendur **Vaikimisi ooteajad:** - OAuthi baasaeg: 5 s - API-võtme baasaeg: 3 s -- API-võtme 429: eelistab ülesvoolu `Retry-After`/lähtestamispäiseid/sõelutavat lähtestamisteksti -- Tagasitaandumine: `baseCooldownMs * 2 ** failureIndex` +- API-võtme 429: eelistab ülesvoolu `Retry-After`-/lähtestamispäiseid või sõelutavat lähtestamisteksti +- Taganemine: `baseCooldownMs * 2 ** failureIndex` -**Päringutulva vastane kaitse:** takistab samaaegsetel tõrgetel ooteaega liigselt pikendada või väärtust `backoffLevel` topelt suurendada. +**Päringutulva vastane kaitse:** takistab samaaegsetel tõrgetel ooteaega liigselt pikendada või `backoffLevel`-it topelt suurendada. **Lõppolekud (EI OLE ooteajad):** -- `banned` — määratakse keelatud märksõna / konto blokeerimise tuvastamisel (vt [BAN_DETECTION](../security/BAN_DETECTION.md)) ning pärast kolme järjestikust ülesvoolu keeldumist päringu kohta (`request_rejected`, nt Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); üksik keeldumine rakendab ühendusele ainult ooteaja -- `expired` (läheb piiratud arvu korduskatsete järel lõppolekusse — `EXPIRED_RETRY_MAX = 3` koos eksponentsiaalse tagasitaandumisega — et ajutised OAuthi vead saaksid enne konto püsivat inaktiveerimist iseenesest laheneda) +- `banned` — määratakse keelatud märksõna / konto blokeerimise tuvastamisel (vt [BAN_DETECTION](../security/BAN_DETECTION.md)) ning kolme järjestikuse ülesvoolu päringupõhise keeldumise korral (`request_rejected`, nt Anthropic OAuth 403 „Request not allowed” — `open-sse/services/requestRejectedStreak.ts`); üksik keeldumine paneb ühenduse ainult ooteajale +- `expired` (läheb pärast piiratud arvu korduskatseid lõppolekusse — `EXPIRED_RETRY_MAX = 3` koos eksponentsiaalse taganemisega — et ajutised OAuthi vead saaksid enne konto püsivat inaktiveerimist ise laheneda) - `credits_exhausted` -Need püsivad, kuni identimisteave muutub või operaator need lähtestab. Ärge kirjutage lõppolekuid ajutise ooteaja olekuga üle. +Need olekud püsivad, kuni autentimisandmeid muudetakse või operaator need lähtestab. Ärge kirjutage lõppolekuid ajutise ooteaja olekuga üle. -**Laisk taastumine:** kui `rateLimitedUntil` on möödunud, muutub ühendus uuesti valikukõlblikuks. Eduka kasutuse korral eemaldab `clearAccountError()` kõik veaväljad. +**Laisk taastumine:** kui `rateLimitedUntil` on möödunud, muutub ühendus jälle sobivaks. Eduka kasutuse korral eemaldab `clearAccountError()` kõik veaväljad. -### Seansiafiinsus (#7274) +### Claude OAuthi kasutuspiir: madalama prioriteediga rada + seansipiirangu lähtestamine -**Ulatus:** üks kliendiseanss (päis `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`), mis on seotud ühe ühendusega **mis tahes** teenusepakkuja puhul. +**Ulatus:** üks Claude'i tellimuse (OAuth) ühendus. Mõlemad funktsioonid on **iga +ühenduse puhul valikulised** (Ühenduse muutmine → Claude'i jaotis → `lowPriorityMode` / +`autoLimitReset` väljal `providerSpecificData`, mõlemad vaikimisi välja lülitatud) ning +jäljendavad Claude Code'i käske `/low-priority` ja `/limit-reset` (sideprotokoll jäädvustatud +Claude Code 2.1.263 põhjal). -**Eesmärk:** hoida mitmevooruline agent (Claude Code, aider, kohandatud agendid) päringute lõikes samal kontol, vähendades kontodevahelist kontekstikadu ja korduvaid külmkäivituse 429-vastuseid teenusepakkujatel, kellel on kontopõhine seansiolek. +**Teostus:** + +- Olekumasin + vastuse liigitamine: `open-sse/services/claudeLowPriority.ts` +- Lähtestamisoleku/-nõude klient: `open-sse/services/claudeLimitReset.ts` +- Täituri haak (päise lisamine + korduskatse sama kontoga): `open-sse/executors/base.ts::execute()` +- Valiku püsimällu salvestamine: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Käivitaja:** 5-tunnine kasutuspiir — `429`, mille päised sisaldavad +`anthropic-ratelimit-unified-status: rejected` ja konto sobivuse korral +`anthropic-ratelimit-unified-slow-offer: treatment`. Enne esimest kasutuspiiri vastust +429 ei saadeta midagi; ühtsete päisteta 429-puhang läbib tavapärase ooteaja tee. + +**Madalama prioriteediga rada** (`lowPriorityMode`): + +- Kasutuspiiri vastuse 429 korral võtab täitur pakkumise vastu ja proovib kohe uuesti **sama** + kontoga, lisades `anthropic-usage-limit: slow`; rada jääb aktiivseks kuni väljakuulutatud + ajani `anthropic-ratelimit-unified-reset` (+60 s varuaega) ning iga selle ajavahemiku + päring sisaldab seda päist. Vahele püütud 429 ei jõua kunagi funktsioonini `handleChatCore`, + seega ühendust **ei** panda ooteajale ega vahetata välja. +- `anthropic-ratelimit-unified-slow-status` hilisemates vastustes: `active` / `not_needed` + säilitavad raja; `slot_busy` (429) või `529` ootavad serveri määratud + `anthropic-ratelimit-unified-slow-retry-after` aja (vaikimisi 20 s, piiratud vahemikku + 5–600 s, ±30% juhuslik hälve) ja proovivad uuesti kuni väärtusega + `anthropic-ratelimit-unified-slow-max-wait` määratud piirini (vaikimisi 20 min, piiratud + vahemikku 1 min–6 h) — pärast seda rada lõpetatakse ja 10-minutiline paus takistab pakkumise + uuesti vastuvõtmist. Ooteaega piirab lisaks päringu enda ülesvoolu käivitamise ajalõpu + (`resolveFetchStartTimeout`, vaikimisi 10 min) järelejäänud aeg, millest lahutatakse 5 s: + selle piiranguta kestaks vaikimisi 20-minutiline maksimaalne ooteaeg päringust kauem ning + ootamine katkestataks poole pealt, tuues sujuva `max_wait` lõpetamise ja pausi asemel + nähtavale `TimeoutError`-i. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, 5 h akna uuenemine või + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (mis lõpetab raja mis tahes + oleku korral olekuga `extra_usage`, sest tasuline ülekasutus katab nüüd kasutuspiiri) + lõpetavad raja; seejärel liigub vastus tavapärasele ooteaja teele. `budget_exhausted` + jäetakse meelde kuni väljakuulutatud eelarve lähtestamiseni (≤ 8 päeva). +- Kasutuspiiri kontroll tehakse pärast täituri enda 400-põhiseid katse siseseid korduskatseid + (konteksti muutmine, mõtlemise/pingutuse piiramine, parameetrite automaatõpe), seega püütakse + ainult mõnel sellisel korduskatsel ilmnev kasutuspiiri vastus 429 ikkagi kinni, mitte ei + lasta sellel ooteaja teele jõuda. +- Olek asub iga ühenduse kohta mälus (taaskäivitamine põhjustab pakkumise uuesti vastuvõtmiseks + ühe täiendava kasutuspiiri vastuse 429). + +**Seansipiirangu lähtestamine** (`autoLimitReset`, kui mõlemad on sisse lülitatud, proovitakse enne rada): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + plokk; kui `arm: "reset"` ja `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` koos + sisuga `{ "program": "juniper_tide" }` (organisatsiooni UUID pärineb väljast + `providerSpecificData.organizationUUID`, varuvariandina algväärtustamine). +- `result: reset|not_limited` → päringut proovitakse uuesti täiskiirusel (ilma aeglase raja + päiseta). `already_used` / `not_offered` jätavad `next_available_at` väärtuse meelde + (vaikimisi üks nädal); mis tahes tõrge põhjustab 15-minutilise taganemise. Lähtestamine + on võimalik kord nädalas ja arvestatakse endiselt nädalase piirangu sisse. + +Regressioonikaitsed: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + +### Seansi afiinsus (#7274) + +**Ulatus:** üks kliendiseanss (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` päis), mis on seotud ühe ühendusega **mis tahes** teenusepakkuja puhul. + +**Eesmärk:** hoida mitmevoorulist agenti (Claude Code, aider, kohandatud agendid) päringute vahel samal kontol, vähendades konto vahetamisest tingitud konteksti kadu ja korduvaid külmkäivitusest põhjustatud 429-vigu teenusepakkujatel, kelle seansi olek on kontopõhine. **Teostus:** - TTL-i lahendamine: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Seose valimine/loomine: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Päise eraldamine (üldine, mis tahes teenusepakkuja): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Püsiv seoste tabel: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Seade: `sessionAffinityTtlMs` (globaalne TTL millisekundites, `0` keelab) — `src/lib/db/settings.ts`. Codexi-põhiselt nimelt `codexSessionAffinityTtlMs` nimetati see migreerimisega `124_generic_session_affinity_ttl.sql` ümber; see kannab kõik varem seadistatud Codexi TTL-id üle uue vaikeväärtusena. +- Kinnituse valimine/loomine: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Päise eraldamine (üldine, iga teenusepakkuja jaoks): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Püsiv kinnituste tabel: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Säte: `sessionAffinityTtlMs` (globaalne TTL millisekundites, `0` keelab) — `src/lib/db/settings.ts`. See nimetati ainult Codexile mõeldud sättest `codexSessionAffinityTtlMs` ümber migratsiooniga `124_generic_session_affinity_ttl.sql`, mis kannab kõik varem seadistatud Codexi TTL-i väärtused üle uueks vaikeväärtuseks. -Enne #7274 lõpetas `resolveSessionAffinityTtlMs()` iga muu teenusepakkuja kui `codex` puhul kohe väärtusega `0`, mistõttu TTL-i seade (ja seansipäised) ei avaldanud mujal mõju, kuigi seostamismehhanism ja päiste eraldamine olid juba teenusepakkujast sõltumatud. Parandus eemaldas selle varajase tagastuse; TTL rakendub nüüd pärast globaalselt nullist suuremaks seadistamist ühtlaselt igale teenusepakkujale. +Enne #7274 lõpetas `resolveSessionAffinityTtlMs()` kohe töö ja tagastas `0` iga teenusepakkuja puhul peale `codex`-i, mistõttu TTL-i säte (ja seansipäised) ei avaldanud mujal mõju, kuigi kinnitamise mehhanism ja päiste eraldamine olid juba teenusepakkujast sõltumatud. Parandus eemaldas selle varajase tagastuse; kui globaalne väärtus on määratud suuremaks kui `0`, rakendub TTL nüüd ühtlaselt kõigile teenusepakkujatele. -Kolme seansiafiinsuse päist ei edastata kunagi ülesvoolu — täitjad koostavad oma ülesvoolupäised algusest peale, selle asemel et kliendi päiseid edasi saata, mistõttu jääb see ainult sisemiseks korrelatsiooniidentifikaatoriks. +Kolme seansisidususe päist ei edastata kunagi ülesvoolu — täiturid koostavad oma ülesvoolupäised nullist, mitte ei edasta kliendi päiseid, seega jääb see ainult sisemiseks korrelatsiooniidentifikaatoriks. -### Eksklusiivsete hallatud seansiühenduste rendid +### Hallatava seansi ühenduste eksklusiivsed liisingud -**Ulatus:** üks aktiivne hallatud HTTP-klient/seanss omab ühte sobivat OmniRoute'i ühendust. +**Ulatus:** üks aktiivne hallatav HTTP-klient/seanss omab ühte sobivat OmniRoute'i ühendust. -**Eesmärk:** pakkuda vastupidavat eksklusiivset ühenduse omandiõigust klientidele, kes vajavad päringute vahel ranget marsruutimispiiret. See erineb seansiafiinsusest, mis on pehme järjepidevuseelistus: eksklusiivne rent säilitab elutsükli oleku SQLite'is, jõustab aktiivse omaniku ja aktiivse ühenduse globaalse unikaalsuse ning lükkab aegunud põlvkonna tagasi enne teenusepakkujale edastamist. +**Eesmärk:** pakkuda püsivat eksklusiivset ühenduse omandiõigust klientidele, kes vajavad päringute vahel ranget marsruutimiskaitset. See erineb seansisidususest, mis on nõrk järjepidevuseelistus: eksklusiivne liising säilitab elutsükli oleku SQLite'is, jõustab aktiivse omaniku ja aktiivse ühenduse globaalse unikaalsuse ning lükkab aegunud põlvkonna enne teenusepakkujale edastamist tagasi. -Funktsioon on iga API-võtme puhul valikuline. Hallatud võtmel peab olema ulatus `lease:exclusive` ja selgelt määratud mittetühi loend `allowedConnections`. Elutsükli otspunkti võib kasutada iga HTTP-klient; kliendi nime, kasutajaagenti, teenusepakkujat, OAuthi meetodit ega mudelit ei nõuta. Rent omab ühendust, mitte mudelit, seega säilitab mudeli muutmine seose seni, kuni ühendus on tavapäraselt sobiv. Tavapärased mudeli-, kvoodi-, seisundi-, ooteaja- ja lubatud loendi reeglid jäävad määravaks ning võivad sama põlvkonna üle viia teisele vabale sobivale ühendusele. +Funktsioon lubatakse iga API-võtme jaoks eraldi. Hallataval võtmel peab olema ulatus `lease:exclusive` ja selgesõnaline mittetühi loend `allowedConnections`. Elutsükli lõpp-punkti saab kasutada iga HTTP-klient; kliendi nime, kasutajaagenti, teenusepakkujat, OAuthi meetodit ega mudelit ei nõuta. Liising omab ühendust, mitte mudelit, seega säilib mudeli vahetamisel seotus seni, kuni ühendus jääb tavapäraste reeglite järgi sobivaks. Tavapärased mudeli-, kvoodi-, seisundi-, ooteaja- ja lubatud loendi reeglid jäävad määravaks ning võivad viia sama põlvkonna üle teisele vabale sobivale ühendusele. -Elutsüklit hallatakse otspunkti `POST /api/v1/session-leases` kaudu JSON-toimingutega `acquire`, `renew` ja `release`. Hallatud inferentsipäringud esitavad läbipaistmatu väärtuse `X-OmniRoute-Lease-Owner` ja täpse väärtuse `X-OmniRoute-Lease-Generation`. Omaniku väärtus koosneb prefiksist `vlo_`, millele järgneb 43 base64url-märki; talletatakse ainult selle SHA-256 räsi. Iga lõplik edastamispiire seob ka autenditud API-võtme ID ja aktiivse ühenduse ID. Rendi juhtpäised eemaldatakse logidest, säilitatavatest päringutõmmistest ja ülesvoolu täitjate päistest. +Elutsükkel kasutab `POST /api/v1/session-leases` päringut JSON-toimingutega `acquire`, `renew` ja `release`. Hallatavad inferentsipäringud esitavad läbipaistmatu `X-OmniRoute-Lease-Owner` väärtuse ja täpse `X-OmniRoute-Lease-Generation` väärtuse. Omanik koosneb prefiksist `vlo_`, millele järgneb 43 base64url-märki; salvestatakse ainult selle SHA-256 räsi. Iga lõplik edastustõke seob ka autenditud API-võtme ID ja aktiivse ühenduse ID. Liisingu juhtpäised eemaldatakse logidest, säilitatavatest päringutõmmistest ja ülesvoolu täituri päistest. -Kui tavapärasel marsruutimisel leidub sobivaid hallatud kandidaate, kuid iga vaba kandidaat on hõivatud võõra aktiivse rendiga, tagastab OmniRoute HTTP `429`, koodi lease-capacity-unavailable, mahu ootamise oleku ja piiratud `Retry-After` väärtuse, mis tuletatakse varaseimast asjakohasest aegumisest. Tavapärane sobivate kandidaatide puudumine ei ole rendikonkurents ja säilitab olemasoleva marsruutimisvea semantika. +Kui tavapärase marsruutimise jaoks leidub sobivaid hallatavaid kandidaate, kuid kõik vabad kandidaadid on hõivatud võõra aktiivse liisinguga, tagastab OmniRoute HTTP `429`, koodi lease-capacity-unavailable, oleku waiting-for-capacity ja piiratud `Retry-After` väärtuse, mis tuletatakse varaseimast asjakohasest aegumisajast. Tavapärane sobivate kandidaatide puudumine ei ole liisingukonkurents ning säilitab olemasoleva marsruutimisvea semantika. Seotud mehhanismid jäävad eraldiseisvaks: -- OAuthi seansihõivatus on protsessisisene pehme jaotus OAuthi kontode jaoks. -- Konto semaforid annavad päringute samaaegsuse lubasid ja lõpevad päringu lõpetamisel. -- Eksklusiivsed hallatud seansirendid on vastupidav elutsükli omandiõigus koos põlvkonnapõhise piirajaga. +- OAuthi seansihõivatus on protsessisisene nõrk jaotus OAuthi kontode jaoks. +- Konto semaforid annavad päringute samaaegsuse lubasid ja lõpevad päringu valmimisel. +- Hallatava seansi eksklusiivsed liisingud pakuvad püsivat elutsüklipõhist omandiõigust koos põlvkonnatõkkega. --- @@ -272,49 +337,81 @@ mõlemad sihtmärgid jõuavad mudelipõhise kiirusepiiranguni. Seda piirab --- -## 5. Päringujärjekorra vastuvõtu juhtimine (v3.8.49 · probleem #6593) - -**Ulatus**: kohalik teenusepakkuja+ühenduse põhine kiirusepiirangu järjekord -(`open-sse/services/rateLimitManager.ts`, mille aluseks on Bottleneck), üks kiht -allpool kolmest eespool kirjeldatud mehhanismist. - -**`maxWaitMs` on täitmise aegumise pärandina säilitatud nimi.** -`resilienceSettings.requestQueue.maxWaitMs` edastatakse Bottleneckile töö -`expiration` väärtusena, mille taimer käivitub alles pärast edastamist. Seega piirab see -piiraja hallatavat täitmist, mitte kohalikus järjekorras veedetud aega. Aegumine -esitatakse usaldusväärse kohaliku veana `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504); -endist järjekorra ajalõpu koodinime aktsepteeritakse ainult usaldusväärse sisemise -tagasiühilduvuse tagamiseks. Vaikeväärtus on 15000ms; seda saab muuta -`RATE_LIMIT_MAX_WAIT_MS` (keskkonnamuutuja) kaudu või juhtpaneelil (**Settings → Resilience**, -kasutajaliidese ülempiir 1–30000ms). Järjekorras viibimisel pole ajalist tähtaega; kasutage -järjekorras olevate kutsujate arvu piiramiseks allpool kirjeldatud `maxQueueDepth` väärtust. +## 5. Päringujärjekorra vastuvõtukontroll (v3.8.49 · probleem #6593) + +**Ulatus**: kohalik teenusepakkuja+ühenduse põhine kiiruspiirangu järjekord (`open-sse/services/rateLimitManager.ts`, +mida toetab Bottleneck), üks kiht ülaltoodud kolmest mehhanismist allpool. + +**`maxWaitMs` piirab järjekorras ootamist; `executionMaxWaitMs` piirab täitmist.** +Need kaks on teadlikult eraldatud ning kumbki ei mõjuta teist. + +`resilienceSettings.requestQueue.maxWaitMs` on **järjekorras ootamise eelarve**: +see hõlmab teenusepakkuja vaba koha ootamist ja seejärel olekus QUEUED viibimist +ning selle taimer tühistatakse hetkel, mil töö lahkub olekust QUEUED ja alustab +täitmist (`rateLimitManager.ts`, `wrappedFn`). Seda piiri ületav päring ei jõua +kunagi ülesvooluteenusesse. Vaikeväärtus on 30000ms, mille määrab +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` failis `src/lib/resilience/settings.ts` ja +mille fikseerib `tests/unit/ratelimit-admission-control-6593.test.ts`, nii et +selle muutmine muudab testi punaseks ega lase sellel lõigul märkamatult +aeguneda. + +`resilienceSettings.requestQueue.executionMaxWaitMs` on väärtus, mille +Bottleneck saab töö `expiration`-ina ja mille taimer käivitub alles pärast töö +väljasaatmist. See on varumeede täituritele, millel puudub oma ülesvoolu +ajalõpp, ning seda suurendatakse täituri enda päringu alustamise ajalõpuni, kui +see on pikem, et see ei saaks katkestada korrektselt töötavat pooleliolevat +vastust. Vaikeväärtus on 600000ms (10 min). + +Järjekorra eelarve edastamine parameetrisse `expiration` põhjustas varem +mitteinkrementaalsete lüüside katkestamise töö keskel — neil võib esimeste +baitide saabumiseni õigustatult kuluda minuteid — ning seetõttu esitatakse +aegumine kujul `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), samas kui +järjekorra eelarve kasutab järjekorra ajalõpu koodi. Kumbagi saab muuta +keskkonnamuutuja `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` kaudu või juhtpaneelil +(**Seaded → Tõrkekindlus**). Normaliseerimisel piiratakse mõlemad vahemikku +1ms–24h. + +**Prioriteetsus mõlema puhul:** keskkonnamuutuja määrab ainult _vaikeväärtuse_. +Väärtus, mis on püsivalt salvestatud asukohas +`resilienceSettings.requestQueue` (juhtpaneeli / API paiga kaudu, salvestatud +andmekogusse `key_value`), on sellest ülimuslik ning ühendusepõhine +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` on omakorda sellest +ülimuslik. Keskkonnamuutuja määramine juurutuses, kus püsivalt salvestatud +väärtus on juba olemas, ei muuda seega midagi — selle asemel tühjendage või +värskendage püsivalt salvestatud seadistust. + +Järjekorras viibimise aega piirab `maxWaitMs`; allpool kirjeldatud +`maxQueueDepth` piirab korraga järjekorras olla võivate kutsujate arvu. **`maxQueueDepth` — valikuline vastuvõtupiirang (uus).** `resilienceSettings.requestQueue.maxQueueDepth` piirab, mitu päringut võib ühe teenusepakkuja+ühenduse kohta korraga järjekorras -(veel edastamata) olla. Kui järjekorras on juba `maxQueueDepth` päringut, -lükatakse uus päring kiiresti tagasi tüübistatud veaga -`code: "RATE_LIMIT_QUEUE_FULL"` **enne**, kui see üldse jõuab funktsioonini `limiter.schedule()` -— seega on tagasilükkamine odav ja toimub enne selle päringu mis tahes allavoolu -viiba tihendamise / tõlkimise tööd. Vaikeväärtus `0` = -keelatud, säilitades olemasoleva piiramatu järjekorra käitumise; lubatud vahemik on 0–100000. -Väärtust saab muuta `RATE_LIMIT_MAX_QUEUE_DEPTH` (keskkonnamuutuja) või -`resilienceSettings.requestQueue.maxQueueDepth` kaudu (juhtpaneeli/API parandus). - -Vastuvõtukontroll ise on puhas funktsioon +olla (ilma et neid oleks veel välja saadetud). Kui järjekorras on juba +`maxQueueDepth` päringut, lükatakse uus päring kiiresti tagasi tüübitud veaga +`code: "RATE_LIMIT_QUEUE_FULL"` **enne**, kui see üldse jõuab funktsioonini +`limiter.schedule()` — seega on tagasilükkamine odav ja toimub enne selle +päringu mis tahes allavoolu viiba tihendamise / tõlkimise tööd. Vaikeväärtus +`0` = keelatud, säilitades senise piiranguta järjekorra käitumise; lubatud +vahemik on 0–100000. Muutke seda keskkonnamuutuja +`RATE_LIMIT_MAX_QUEUE_DEPTH` kaudu või väljal +`resilienceSettings.requestQueue.maxQueueDepth` (juhtpaneeli/API paik). + +Vastuvõtukontroll ise on puhasfunktsioon (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), mistõttu saab seda ühiktestida ilma tegeliku Bottlenecki piirajata. -> RFC, millega avati #6593, pakkus välja ka lipu `bypassCompressionOnRateLimit`. -> Selle hoidla `open-sse/services/compression/` konveier tihendab -> väljuva LLM-päringu viipa/konteksti (`chatCore.ts`, -> ploki `resolveCompressionSettings`/`selectCompressionStrategy` ümbruses), -> mitte sünteesitud 429-vastuste HTTP-vastuseid — sõnasõnalise möödaviigulipu jaoks -> puudub vastav kooditee. See viiba tihendamise etapp käivitatakse praegu päringukonveieris -> ka _enne_ funktsiooni `withRateLimit()`, seega on selle järjekorra muutmine, et jätta -> tihendamine täis järjekorra tõttu tagasilükatud päringu korral vahele, eraldiseisev ja -> selle probleemi ulatusest suurem muudatus; seda **ei** rakendatud siin tahtlikult -> ning see jäeti järeltegevuseks juhuks, kui protsessoriressursi sääst kaalub üles -> ümberjärjestamise riski. +> #6593 algatanud RFC pakkus välja ka lipu `bypassCompressionOnRateLimit`. +> Selle repo konveier `open-sse/services/compression/` tegeleb väljamineva +> LLM-päringu viiba/konteksti tihendamisega (`chatCore.ts`, ploki +> `resolveCompressionSettings`/`selectCompressionStrategy` ümbruses), mitte +> sünteesitud 429-vastuste HTTP-tihendamisega — otsesele möödaviigulipule +> vastavat kooditeed pole olemas. See viiba tihendamise etapp käivitatakse +> praegu päringukonveieris ka _enne_ funktsiooni `withRateLimit()`, mistõttu +> selle järjekorra täitumisest tingitud tagasilükkamise korral vahelejätmiseks +> vajalik ümberjärjestamine on eraldiseisev ja suurem muudatus kui selle +> probleemi ulatus; seda **ei** rakendatud siin tahtlikult ning see jäeti +> järeltööks juhuks, kui protsessoriressursi sääst õigustab ümberjärjestamisega +> seotud riski. --- diff --git a/docs/i18n/et/docs/architecture/admission-lanes.md b/docs/i18n/et/docs/architecture/admission-lanes.md index a5a431450d7e..332975ab9caf 100644 --- a/docs/i18n/et/docs/architecture/admission-lanes.md +++ b/docs/i18n/et/docs/architecture/admission-lanes.md @@ -7,49 +7,55 @@ OmniRoute'il on **kaks** protsessisisest, erineva ulatusega rajasüsteemi. Need täiendavad teineteist; operaatorid peaksid teadma, kumba neist nad vaatavad. -## 1. Baiditaseme protsessiülene vastuvõtt (`chatBodyAdmission.ts`) +## 1. Baiditasemel protsessiülene vastuvõtt (`chatBodyAdmission.ts`) -- **Ulatus:** puhverdatud päringukeha/kuhja töötlustee päringute `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` ja teiste vestlusekujuliste marsruutide jaoks. Kaitseb - suurte kodeerimisagentide päringukehade põhjustatud kuhjamälu võimenduse eest (#4380). +- **Ulatus:** puhverdatud päringukeha/kuhja tee marsruutidele `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` ja teistele vestluskujulistele marsruutidele. Kaitseb + suurte programmeerimisagentide päringukehade põhjustatud kuhjamälu võimenduse eest (#4380). - **Üks protsessiülene kontroller, mitte võtmekohased rajad (#10110).** Iga API-võti - (räsitud) või `anonymous`-seanss taotleb pääsu **sama** jagatud eelarve alusel — + (räsitud) või `anonymous`-seanss kasutab vastuvõtul **sama** jagatud eelarvet — räsitud seansi ID-d kasutatakse AINULT õiglase ajastamise võtmena (ootajate - tsükliline teenindamine), mitte kunagi läbilaskevõime killuna. Selle dokumendi - varasem versioon kirjeldas sõltumatu läbilaskevõimega võtmekohaseid radu; see - mudel eemaldati muudatuses #10110, sest see võimaldas autentimata võltsmandaatidega - protsessiülest piirangut mitmekordistada. -- **Värav (#503-fanout): automaatselt tuletatud vastuvõtu BAIDIEELARVE, mitte fikseeritud päringute - arv.** Päringute arvul põhinev pärandpiirang `CHAT_MAX_HEAVY_IN_FLIGHT` (enne seda parandust - vaikimisi `1`) ahendas kodeerimisagentide hargnemise (mitu alamagenti/CLI-d, - päringukehad tavaliselt > 256 KB) tegeliku samaaegsuse ligikaudu ühele, põhjustades - täiesti tavapärase koormuse korral vastuseid 503. Nüüd rakendub see ainult siis, kui operaator - määrab sõnaselgelt `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Kui see on määramata, juhib vastuvõttu - selle asemel `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — eelarve, mis tuletatakse automaatselt - protsessi tegelikust mälupiirangust (`src/shared/middleware/admissionBudget.ts`): - 25% rangemast piirangust, võrreldes V8 kuhja piirangut ning mis tahes cgroup'i/konteineri piirangut, - jagatuna 8-kordse ajutise võimendusteguriga ja piiratud vahemikku 8 MiB kuni - 2 GiB. Sõnaselgete ülekirjutuste puhul kasutatakse samu piire. See skaleerub ise - 512 MB konteinerist 32 GB lauaarvutini ilma keskkonnamuutujaid häälestamata. Päringukeha, mis - ei mahu tegeliku eelarve sisse, lükatakse kohe tagasi veaga `413 body_exceeds_budget`; - piiratud õigluse järjekorda lisatakse ainult eraldi teenindatavate päringukehade omavaheline - konkurents. Reaalajas töötav mitme signaali põhine ressursisurve jälgija (V8 kuhja suhe, - cgroup, PSI, OOM-sündmused — `open-sse/utils/resourcePressurePolicy.ts`) lühendab - piiratud ooteaega `high` surve korral ja katkestab teenindamise kohe veaga + tsükliline teenindamine), mitte kunagi mahu sektsioonina. Selle dokumendi varasem + versioon kirjeldas sõltumatu mahuga võtmekohaseid radu; see mudel eemaldati + muudatuses #10110, sest see võimaldas autentimata võltsitud mandaatidega + protsessiülest piiri mitmekordistada. +- **Värav (#503-fanout): automaatselt tuletatud sisendi BAIDIEELARVE, mitte fikseeritud + päringute arv.** Päringute arvul põhinev pärandpiirang `CHAT_MAX_HEAVY_IN_FLIGHT` + (enne seda parandust vaikimisi `1`) vähendas programmeerimisagentide hargnemise + (mitu alamagenti/CLI-d, päringukehad tavaliselt > 256 KB) tegeliku paralleelsuse + ligikaudu üheni, mistõttu tagastati täiesti tavapärase koormuse korral 503. + Nüüd rakendub see ainult siis, kui operaator määrab selgesõnaliselt + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Kui see on määramata, juhib vastuvõttu + selle asemel `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — protsessi tegelikust + mälupiirist automaatselt tuletatud eelarve (`src/shared/middleware/admissionBudget.ts`): + 25% V8 kuhja piirangu ja mis tahes cgroup'i/konteineri piirangu väiksemast väärtusest, + jagatuna 8-kordse ajutise võimendusteguriga ning piiratud vahemikku 8 MiB kuni + 2 GiB. Selgesõnalistele ülekirjutustele kehtivad samad piirid. See skaleerub + ilma keskkonnamuutujate häälestamiseta 512 MB konteinerist 32 GB lauaarvutini. + Päringukeha, mis tegelikku eelarvesse ei mahu, lükatakse kohe tagasi veaga + `413 body_exceeds_budget`; piiratud õiglasesse järjekorda lisatakse ainult + omavahelist ressursikonkurentsi põhjustavad päringukehad, mida eraldi oleks + võimalik teenindada. Mitme signaaliga reaalajas ressursisurve jälgija (V8 kuhja + suhtarv, cgroup, PSI, OOM-sündmused — `open-sse/utils/resourcePressurePolicy.ts`) + lühendab piiratud ooteaega `high` surve korral ja tõrjub päringu kohe veaga `503 resource_pressure` `critical` surve korral, enne kui ühtegi baiti üldse - vastu võetakse. + vastu võetakse. PSI-d loetakse võimaluse korral selle üksuse cgroup'i failist + `memory.pressure` (`open-sse/utils/resourcePressureSampler.ts`); + `/proc/pressure/memory` hõlmab kogu hosti ja seda kasutatakse ainult varuvariandina + füüsilises keskkonnas / cgroup v1 korral, et saalimist kasutav host ei põhjustaks + jõudeolevas konteineris 503 vastust. - **Häälestamine:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaatselt tuletatud baidieelarve ülekirjutus - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — päringute arvul põhinev pärandpiirang, ainult soovi korral - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — järjekorras ootamise aeg enne vastust 503 (vaikimisi 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — järjekorrabaitide kuhjakaitse (vaikimisi 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — alates #10110 aegunud - ja toimeta (konfiguratsiooni ühilduvuse huvides aktsepteeritakse, kuid eiratakse) -- **Aruandlus:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — sealhulgas + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — päringute arvul põhinev pärandpiirang, ainult valikulisel aktiveerimisel + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — järjekorra ooteaeg enne 503 vastust (vaikimisi 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — järjekorras olevate baitide kuhjamälu kaitseklapp (vaikimisi 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — alates + muudatusest #10110 aegunud mittetoimivad sätted (konfiguratsiooni ühilduvuse nimel aktsepteeritakse, kuid eiratakse) +- **Aruanded:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — sealhulgas #503-fanout täiendused `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` ja `countCapEnabled` - (vaikejuurutuses false — kinnitab, et tegelikult rakendub baidieelarve, mitte pärandiks - olev arvuline piirang). + (vaikejuurutuses false — kinnitab, et tegelikult rakendub baidieelarve, mitte + pärandiks olev päringute arvuline piirang). ## 2. Kohanduvad käitusaegsed virtuaalrajad (`open-sse/services/admission`) diff --git a/docs/i18n/et/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/et/docs/frameworks/EMBEDDED-SERVICES.md index 552da89da7cb..ec8c186ebdf3 100644 --- a/docs/i18n/et/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/et/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,11 +5,11 @@ --- > **Versioon:** v3.8.44 -> **Viimati uuendatud:** 2026-07-03 -> **Sihtrühm:** Insenerid, kes lisavad, hooldavad või siluvad manustatud teenuseid (9Router, CLIProxyAPI, Mux, Bifrost). +> **Viimati uuendatud:** 2026-09-09 +> **Sihtrühm:** Insenerid, kes lisavad, hooldavad või siluvad manustatud teenuseid (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Manustatud teenused on kohalikult installitud protsessi kõrvalkomponendid, mida OmniRoute installib, jälgib ja -pakub esmaklassiliste marsruutimissihtmärkidena. Erinevalt välistest teenusepakkujatest (millega luuakse interneti kaudu +Manustatud teenused on kohalikult installitud protsessi kaastööriistad, mille OmniRoute installib, mida see jälgib ja +mida see pakub esmaklassiliste marsruutimissihtmärkidena. Erinevalt välistest teenusepakkujatest (millega luuakse interneti kaudu ühendus API-võtmete abil) töötavad manustatud teenused OmniRoute'iga samas masinas ja suhtlevad loopback-liidese kaudu. --- @@ -29,35 +29,36 @@ pakub esmaklassiliste marsruutimissihtmärkidena. Erinevalt välistest teenusepa ## 1. Ülevaade -### Miks kasutada manustatud teenuseid? +### Miks manustatud teenused? -Manustatud on viis teenust: +Manustatud on kuus teenust: -| Teenus | npm-pakett | Vaikeport | Otstarve | -| --------------- | ------------------------------------------- | :-------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **9Router** | `9router` | 20130 | Tehisintellekti marsruuter, mida OmniRoute saab kasutada alamteenusepakkujana. Mudelid on kättesaadavad kujul `9router/{sub}/{model}` | -| **CLIProxyAPI** | GitHubi väljalaskebinaar (`cliproxy`) | 8317 | Kohalik puhverserveri adapter Anthropic CLI autentimisvoogude jaoks. Pakub varumarsruutimist OAuthi tunnuslubade aegumisel | -| **Mux** | `mux` (ilma kasutajaliideseta `mux server`) | 8322 | Kohalik agentide orkestreerimise deemon (coder/mux). Ainult elutsüklihaldusega — ei ole marsruutimissihtmärk (LLM-i puhverserverdus puudub). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-põhine tehisintellekti lüüsi relee taustsüsteem. Töötamise ajal valib releemarsruut (`/v1/relay/`) selle automaatselt | -| **Dario** | `@askalf/dario` | 3456 | Claude'i tellimuse puhverserver — CLIProxyAPI alternatiiv/tõrkesiirdevariant Claude Code'i kujulise liikluse jaoks; sisestatud võtmest saab `DARIO_ADMIN_TOKEN`, mis piirab selle `/admin/*` OAuthi juhtimistasandi kasutamist | +| Teenus | npm-pakett | Vaikimisi port | Otstarve | +| --------------- | ------------------------------------------- | :------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | AI-ruuter, mida OmniRoute saab kasutada alampakkujana. Mudelid avaldatakse kujul `9router/{sub}/{model}` | +| **CLIProxyAPI** | GitHubi väljalaskebinaar (`cliproxy`) | 8317 | Kohalik proksiadapter Anthropic CLI autentimisvoogude jaoks. Pakub varumarsruutimist OAuthi lubade aegumisel | +| **Mux** | `mux` (ilma kasutajaliideseta `mux server`) | 8322 | Kohalik agentide orkestreerimise deemon (coder/mux). Ainult elutsükli halduseks — pole marsruutimise sihtmärk (LLM-i proksimist ei toimu). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-põhine AI-lüüsi releetaustsüsteem. Töötamise ajal valitakse see releemarsruudi (`/v1/relay/`) jaoks automaatselt | +| **Dario** | `@askalf/dario` | 3456 | Claude'i tellimuse proksi — alternatiiv/varulahendus CLIProxyAPI-le Claude Code'i kujulise liikluse jaoks; sisestatud võtmest saab `DARIO_ADMIN_TOKEN`, mis kaitseb selle `/admin/*` OAuthi juhtimistasandit | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Webi automatiseerimine (ilma kasutajaliideseta Chromium Puppeteeri kaudu). Ainult elutsükli halduseks — pole marsruutimise sihtmärk. | -Kõik viis järgivad sama järelevalvemudelit: +Kõik kuus järgivad sama järelevalvemudelit: -- OmniRoute installib need kataloogi `DATA_DIR/services/{name}/` (OmniRoute'i enda failist `package.json` isoleeritult) +- OmniRoute installib need kausta `DATA_DIR/services/{name}/` (OmniRoute'i enda `package.json`-ist eraldatult) - OmniRoute käivitab ja jälgib neid alamprotsessidena -- OmniRoute sisestab ajutise API-võtme alamprotsessi keskkonda ja vahetab seda ilma katkestuseta (kui kohaldatav) -- Kõik haldusmarsruudid (`/api/services/*`) on **LOCAL_ONLY** — juurdepääsetavad ainult loopback-liidese kaudu (range reegel nr 17) +- OmniRoute sisestab alamprotsessi keskkonda ajutise API-võtme ja vahetab seda ilma katkestuseta (kui see on kohaldatav) +- Kõik haldusmarsruudid (`/api/services/*`) on **LOCAL_ONLY** — juurdepääsetavad ainult loopback-liideselt (range reegel nr 17) ### Põhiotsused (disainiplaanist) -| Otsus | Väärtus | -| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | -| Juurdepääs 9Routeri omakasutajaliidesele juhtpaneelilt | Pöördpuhverserver aadressil `/dashboard/providers/services/9router/embed/*` | -| Installimismehhanism | `npm install {package}` käsu `execFile` kaudu (ilma kestainterpoleerimiseta) | -| Kasutusrežiim | Teenusepakkuja on marsruutimismootoris registreeritud kujul `9router/{sub}/{model}` | -| API-võtmete haldus | OmniRoute genereerib ja krüpteerib need talletamisel (AES-256-GCM) ning sisestab keskkonna kaudu | -| Asukoht juhtpaneelil | `/dashboard/providers/services` (kolm vahekaarti) | -| Automaatne käivitamine | Lüliti teenusepõhiselt, vaikimisi VÄLJAS | +| Otsus | Väärtus | +| ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| Juurdepääs 9Routeri native UI-le juhtpaneelilt | Pöördproksi aadressil `/dashboard/providers/services/9router/embed/*` | +| Installimismehhanism | `npm install {package}` `execFile`-i kaudu (ilma shelli interpolatsioonita) | +| Kasutusrežiim | Pakkuja registreeritakse marsruutimismootoris kujul `9router/{sub}/{model}` | +| API-võtme haldus | OmniRoute genereerib võtme, krüpteerib selle salvestamisel (AES-256-GCM) ja sisestab keskkonnamuutuja kaudu | +| Asukoht juhtpaneelil | `/dashboard/providers/services` (kolm vahekaarti) | +| Automaatne käivitamine | Lüliti iga teenuse jaoks, vaikimisi VÄLJAS | --- @@ -67,7 +68,7 @@ Kõik viis järgivad sama järelevalvemudelit: ┌────────────────────────────────────────────────────────────────────┐ │ Kiht 1 — kasutajaliides │ │ /dashboard/providers/services (vahekaardid: CLIProxyAPI | 9Router | Mux)│ -│ Reaalajas logid (SSE), käivitamine/peatamine/taaskäivitamine/uuendamine, sätted, installimine│ +│ Reaalaja logid (SSE), käivitamine/peatamine/taaskäivitamine/uuendamine, sätted, installimine│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx Kest + vahekaartide marsruutimine ?tab= järgi│ @@ -87,9 +88,9 @@ Kõik viis järgivad sama järelevalvemudelit: │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (HTTP-pöördproksi + WebSocketi proksi → 9Routeri ülesvool) │ +│ (HTTP-pöördproksi + WebSocketi proksi → 9Routeri ülesvool) │ │ │ -│ Kontroll: LOCAL_ONLY_API_PREFIXES sisaldab "/api/services/" ja │ +│ Tõke: LOCAL_ONLY_API_PREFIXES sisaldab "/api/services/" ja │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ protsessisisesed kutsed @@ -97,30 +98,30 @@ Kõik viis järgivad sama järelevalvemudelit: │ Kiht 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Üldine järelevaataja (child_process.spawn) │ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 20130 9Routeri jaoks (konfigureeritav) │ -│ ├── logs: stdio ringpuhver 5 MB → SSE-sündmused │ -│ ├── health: HTTP GET /health iga 2–5 s järel, laisk taastamine│ -│ └── lifecycle: SIGTERM 15 s → SIGKILL │ +│ ├── installimine: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── käivitamine: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ +│ ├── port: 20130 teenuse 9Router jaoks (seadistatav) │ +│ ├── logid: stdio 5 MB ringpuhver → SSE-sündmused │ +│ ├── tervisekontroll: HTTP GET /health iga 2–5 s järel, laisk taastamine│ +│ └── elutsükkel: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts Algkäivitab protsessi käivitumisel kõik SERVICES[]│ +│ bootstrap.ts Algkäivitab protsessi käivitamisel kõik SERVICES[]│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Perioodiline GET /v1/models → service_models tabel│ -│ ringBuffer.ts Ringlogipuhver (5 MB teenuse kohta) │ -│ healthCheck.ts HTTP-tervisekontrolli perioodiline päring │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (installeri adapterid) │ +│ ringBuffer.ts Ringlogipuhver (5 MB teenuse kohta) │ +│ healthCheck.ts Perioodiline HTTP-tervisekontroll │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (installeri adapterid) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-ga ühilduv HTTP (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Kiht 4 — pakkuja / marsruutimine │ +│ Kiht 4 — teenusepakkuja / marsruutimine │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Otsib iga päringu puhul pordi ja API-võtme uuesti (vahemäluta). │ -│ Eemaldab enne proksimist mudeli ID-st prefiksi "9router/". │ +│ Hangib pordi ja API-võtme iga päringu jaoks uuesti (vahemäluta).│ +│ Eemaldab enne vahendamist mudeli ID-st prefiksi "9router/". │ │ Tagastab 503 service_not_running, kui järelevaataja pole olekus "running".│ │ │ │ src/shared/constants/providers.ts │ @@ -128,32 +129,32 @@ Kõik viis järgivad sama järelevalvemudelit: │ │ │ open-sse/config/providerRegistry.ts │ │ Mudelid salvestatakse kujul "9router/{sub}/{model}" (prefiksiga).│ -│ modelSync.ts sünkroonib neid iga 5 min järel. │ +│ modelSync.ts sünkroonib neid iga 5 minuti järel. │ │ │ -│ Muxi hallatakse AINULT elutsükli tasandil (kihid 1–3) — see on │ -│ agentide orkestreerimise deemon, mitte LLM-proksi, seega puudub │ -│ sellel 4. kihi täituri/pakkuja kirje ning see pole kunagi │ -│ marsruutimise sihtmärk. │ +│ Muxi puhul hallatakse AINULT elutsüklit (kihid 1–3) — see on agendi│ +│ orkestreerimise deemon, mitte LLM-proksi, seega pole sellel 4. kihi│ +│ täituri/teenusepakkuja kirjet ning see pole kunagi marsruutimise sihtmärk.│ └────────────────────────────────────────────────────────────────────┘ ``` ### Peamised lähtefailid -| Fail | Roll | -| ------------------------------------------- | -------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Põhiklass: elutsükkel, lukk, tervisekontroll, ringpuhver | -| `src/lib/services/bootstrap.ts` | Protsessitaseme registreerimine ja automaatne käivitamine | -| `src/lib/services/registry.ts` | Üksikeksemplari kaart `tool → supervisor` | -| `src/lib/services/apiKey.ts` | Võtme genereerimine, AES-256-GCM-krüptimine salvestamisel | -| `src/lib/services/modelSync.ts` | Perioodiline mudelite sünkroonimine (5 min) + nõudmisel | -| `src/lib/services/ringBuffer.ts` | 5 MB ringlogipuhver SSE-tellimusega | -| `src/lib/services/healthCheck.ts` | HTTP-tervisekontroll (seadistatav intervall) | -| `src/lib/services/installers/ninerouter.ts` | 9Routeri installimine/värskendamine/desinstallimine npm-iga | -| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI installimine/värskendamine/desinstallimine npm-iga | -| `src/lib/services/installers/mux.ts` | Muxi installimine/värskendamine/desinstallimine npm-iga | -| `src/app/api/services/9router/_lib.ts` | Abifunktsioon `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Jagatud SSE-logide otspunkt | -| `open-sse/executors/ninerouter.ts` | Pakkuja täitur (4. kiht) | +| Fail | Roll | +| ------------------------------------------- | ------------------------------------------------------------------ | +| `src/lib/services/ServiceSupervisor.ts` | Põhiklass: elutsükkel, lukk, seisundikontroll, ringpuhver | +| `src/lib/services/bootstrap.ts` | Protsessitaseme registreerimine ja automaatne käivitamine | +| `src/lib/services/registry.ts` | Üksikeksemplari kaart `tool → supervisor` | +| `src/lib/services/apiKey.ts` | Võtme genereerimine, AES-256-GCM-krüptimine salvestamisel | +| `src/lib/services/modelSync.ts` | Perioodiline mudelite sünkroonimine (5 min) + nõudmisel | +| `src/lib/services/ringBuffer.ts` | 5 MB ringlogipuhver SSE-tellimisega | +| `src/lib/services/healthCheck.ts` | HTTP-seisundikontroll (seadistatav intervall) | +| `src/lib/services/installers/ninerouter.ts` | 9Routeri installimine/värskendamine/desinstallimine npm-i kaudu | +| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI installimine/värskendamine/desinstallimine npm-i kaudu | +| `src/lib/services/installers/mux.ts` | Muxi installimine/värskendamine/desinstallimine npm-i kaudu | +| `src/lib/services/installers/openwa.ts` | open-wa installimine/värskendamine/desinstallimine npm-i kaudu | +| `src/app/api/services/9router/_lib.ts` | Abifunktsioon `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | Jagatud SSE-logide lõpp-punkt | +| `open-sse/executors/ninerouter.ts` | Pakkuja täitur (4. kiht) | --- @@ -208,20 +209,19 @@ aktiveeruvad samal ajal. --- -## 4. API viitedokumentatsioon +## 4. API viide -Kõik marsruudid prefiksiga `/api/services/` on **LOCAL_ONLY** (ainult tagasisideahel, -range reegel #17). Väljastpoolt tagasisideahelat saabuvad päringud saavad vastuseks -`403 LOCAL_ONLY` sõltumata autentimistõendist. +Kõik marsruudid prefiksi `/api/services/` all on **LOCAL_ONLY** (ainult loopback, range reegel #17). +Mitte-loopback-päringud saavad vastuseks `403 LOCAL_ONLY` olenemata autentimistõendist. ### 4.1 9Routeri lõpp-punktid (11 marsruuti) #### `POST /api/services/9router/install` -Installib 9Routeri npm-ist. Loob kataloogi `DATA_DIR/services/9router/` koos eraldi +Paigaldab 9Routeri npm-ist. Loob kataloogi `DATA_DIR/services/9router/` koos eraldi `package.json`-i ja `node_modules/`-iga. Ei lähe vastuollu OmniRoute'i enda sõltuvustega. -**Päringu keha** (kõik väljad valikulised): +**Päringu keha** (kõik väljad on valikulised): ```json { "version": "latest" } @@ -229,26 +229,26 @@ Installib 9Routeri npm-ist. Loob kataloogi `DATA_DIR/services/9router/` koos era | Väli | Tüüp | Vaikeväärtus | Kirjeldus | | --------- | -------- | ------------ | ------------------------------------------ | -| `version` | `string` | `"latest"` | installitav npm-i versioonisilt või semver | +| `version` | `string` | `"latest"` | Paigaldatav npm-i versioonisilt või semver | **Vastused:** -| Olek | Kirjeldus | -| ----- | --------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Vigane päringu keha (Zodi valideerimistõrge) | -| `409` | Installimine juba käib (lukk on hõivatud) | -| `500` | npm install nurjus — kasutajasõbralikku viga vt `message` | +| Olek | Kirjeldus | +| ----- | ---------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Vigane päringu keha (Zodi valideerimine nurjus) | +| `409` | Paigaldamine on juba pooleli (lukk on hõivatud) | +| `500` | npm-i paigaldamine nurjus — kasutajasõbralikku veateadet vt väljal `message` | -**Märkused:** Kasutab käsku `execFile('npm', [...])` — ilma kestata ja interpoleerimiseta -(range reegel #13). EACCES-i vead esitatakse kasutajasõbralike teadetena. +**Märkused:** Kasutab käsku `execFile('npm', [...])` — kest puudub ja interpoleerimist ei toimu (range reegel #13). +EACCES-i vead esitatakse kasutajasõbralike teadetena. --- #### `POST /api/services/9router/start` -Käivitab 9Routeri. Registreerib järelevaataja, kui see pole juba registreeritud, -ja kutsub seejärel välja `supervisor.start()`. Juba töötamise korral idempotentne. +Käivitab 9Routeri. Registreerib järelevaataja, kui see pole veel registreeritud, ja kutsub seejärel välja +`supervisor.start()`. Juba töötava teenuse korral idempotentne. **Päringu keha:** puudub @@ -257,10 +257,10 @@ ja kutsub seejärel välja `supervisor.start()`. Juba töötamise korral idempot | Olek | Kirjeldus | | ----- | ---------------------------------------------------- | | `200` | Objekt `ServiceStatus` (vt allolevat skeemi) | -| `409` | 9Router pole installitud (`status: "not_installed"`) | -| `503` | Käivitamine nurjus (protsessiviga — vt `lastError`) | +| `409` | 9Router pole paigaldatud (`status: "not_installed"`) | +| `503` | Käivitamine nurjus (protsessi viga — vt `lastError`) | -**`ServiceStatus`-e skeem:** +**ServiceStatus skeem:** ```json { @@ -278,37 +278,37 @@ ja kutsub seejärel välja `supervisor.start()`. Juba töötamise korral idempot #### `POST /api/services/9router/stop` -Peatab 9Routeri sujuvalt. Saadab SIGTERM-i, ootab 15 s ja saadab seejärel SIGKILL-i, -kui protsess on endiselt aktiivne. Juba peatatud oleku korral idempotentne. +Peatab 9Routeri kontrollitult. Saadab SIGTERM-i, ootab 15 s ja saadab seejärel SIGKILL-i, kui protsess on endiselt töös. +Juba peatatud teenuse korral idempotentne. **Päringu keha:** puudub **Vastused:** -| Olek | Kirjeldus | -| ----- | ----------------------------------- | -| `200` | `ServiceStatus` (olek: `"stopped"`) | -| `503` | Peatamine nurjus ootamatult | +| Olek | Kirjeldus | +| ----- | ------------------------------------ | +| `200` | `ServiceStatus` (`state: "stopped"`) | +| `503` | Peatamine nurjus ootamatult | --- #### `POST /api/services/9router/restart` -Samaväärne toimingutega `stop()` ja seejärel `start()` toiminguluku all. +Samaväärne `stop()` ja seejärel `start()` väljakutsumisega operatsiooniluku all. **Päringu keha:** puudub -**Vastused:** samad mis `start`-i puhul (tagastab lõpliku `ServiceStatus`-e). +**Vastused:** samad mis `start` puhul (tagastab lõpliku `ServiceStatus`-e). --- #### `POST /api/services/9router/update` -Värskendab 9Routeri uuemale npm-i versioonile. Kui teenus töötab, peatatakse see -esmalt, käivitatakse npm install (uuem versioon installitakse olemasolevasse -asukohta) ning seejärel käivitatakse teenus uuesti. +Uuendab 9Routeri uuemale npm-i versioonile. Kui teenus töötab, peatatakse see +esmalt, käivitatakse npm-i paigaldamine (uuem versioon paigaldatakse samasse asukohta) ja seejärel +käivitatakse teenus uuesti. -**Päringu keha** (kõik väljad valikulised): +**Päringu keha** (kõik väljad on valikulised): ```json { "version": "latest" } @@ -319,15 +319,15 @@ asukohta) ning seejärel käivitatakse teenus uuesti. | Olek | Kirjeldus | | ----- | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | Vigane päringu keha | -| `500` | npm-i värskendamine nurjus | +| `400` | Vigane keha | +| `500` | npm-i uuendamine nurjus | --- #### `POST /api/services/9router/rotate-key` -Genereerib 9Routeri jaoks uue API-võtme, krüpteerib selle talletamisel ja taaskäivitab teenuse -(kui see töötab), et teenus saaks uue võtme oma keskkonnast kätte. Vana võti +Loob 9Routerile uue API võtme, krüpteerib selle talletamisel ja taaskäivitab teenuse +(kui see töötab), et teenus saaks uue võtme oma keskkonnast laadida. Vana võti muudetakse kohe kehtetuks. **Päringu keha:** puudub @@ -337,23 +337,23 @@ muudetakse kohe kehtetuks. | Olek | Kirjeldus | | ----- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Võtme vahetamine ebaõnnestus | +| `500` | Võtme vahetamine nurjus | -**Turvalisus:** uut võtit ei tagastata kunagi vastuses (autentimisteave ei leki). -See talletatakse krüpteeritult (AES-256-GCM) tabelis `version_manager`. +**Turvalisus:** Uut võtit ei tagastata kunagi vastuses (mandaatide leket ei teki). +See salvestatakse krüpteeritult (AES-256-GCM) tabelisse `version_manager`. --- #### `GET /api/services/9router/status` -Tagastab kombineeritud reaalajas + andmebaasi oleku, sealhulgas versiooni metaandmed ja API-võtme eelvaate. +Tagastab kombineeritud reaalaja- ja andmebaasioleku, sealhulgas versiooni metaandmed ning API võtme eelvaate. **Vastused:** -| Olek | Kirjeldus | -| ----- | -------------------------- | -| `200` | Vaadake allolevat skeemi | -| `500` | Oleku lugemine ebaõnnestus | +| Olek | Kirjeldus | +| ----- | --------------------- | +| `200` | Vt allolevat skeemi | +| `500` | Oleku lugemine nurjus | **Vastuse skeem:** @@ -379,8 +379,8 @@ Tagastab kombineeritud reaalajas + andmebaasi oleku, sealhulgas versiooni metaan #### `POST /api/services/9router/auto-start` -Lülitab automaatkäivituse lipu sisse või välja. Kui `enabled: true`, käivitub teenus automaatselt -järgmisel OmniRoute'i käivitamisel (kui teenus on installitud). +Lülitab automaatse käivitamise lipu sisse või välja. Kui `enabled: true`, käivitub teenus automaatselt +OmniRoute'i järgmisel käivitamisel (kui teenus on paigaldatud). **Päringu keha:** @@ -399,24 +399,24 @@ järgmisel OmniRoute'i käivitamisel (kui teenus on installitud). #### `GET /api/services/9router/logs` -9Routeri stdout/stderr-ringpuhvrist pärinevate reaalajaliste logide SSE-voog. +9Routeri stdout/stderr-i ringpuhvrist pärinevate reaalajaliste logide SSE-voog. **Päringuparameetrid:** -| Parameeter | Tüüp | Vaikeväärtus | Kirjeldus | -| ---------- | --------- | ------------ | --------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Esmalt saadetavate ajalooliste ridade arv (max 1000) | -| `filter` | `string` | puudub | Tõstutundetu alamstringi filter (ilma regex'ita — ReDoS-i suhtes turvaline) | +| Parameeter | Tüüp | Vaikeväärtus | Kirjeldus | +| ---------- | --------- | ------------ | -------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Esmalt saadetavate ajalooliste ridade arv (maksimaalselt 1000) | +| `filter` | `string` | puudub | Tõstutundetu alamstringi filter (regulaaravaldisteta — ReDoS-kindel) | -**SSE-sündmused:** +**SSE sündmused:** -| Sündmus | Andmed | Kirjeldus | -| ----------- | ----------- | ---------------------------------------- | -| `snapshot` | `LogLine[]` | Esialgne ajalooline lõpuosa | -| `log` | `LogLine` | Reaalajas logirida | -| `heartbeat` | `{}` | Ühenduse hoidmise signaal iga 15 s järel | +| Sündmus | Andmed | Kirjeldus | +| ----------- | ----------- | --------------------------- | +| `snapshot` | `LogLine[]` | Esialgne ajalooline lõpuosa | +| `log` | `LogLine` | Reaalajaline logirida | +| `heartbeat` | `{}` | Elushoidmine iga 15 s järel | -**LogLine'i skeem:** +**LogLine skeem:** ```json { @@ -436,69 +436,69 @@ järgmisel OmniRoute'i käivitamisel (kui teenus on installitud). --- -### 4.2 CLIProxyAPI otspunktid (10 marsruuti) +### 4.2 CLIProxyAPI lõpp-punktid (10 marsruuti) -CLIProxyAPI otspunktide struktuur on sama mis 9Routeril, välja arvatud `rotate-key`, ning lisatud on +CLIProxyAPI lõpp-punktide struktuur on sama mis 9Routeril, välja arvatud `rotate-key`, ning sellele lisanduvad `accounts`, `provider-expose` ja `auto-restart-adopted`. Nüüd saab see -käivitamisel sisestatud spetsiaalse andmekihi API-võtme (`needsApiKey: true` failis -`bootstrap.ts`, kasutatakse mudelite sünkroonimiseks); `status` sisaldab vähem välju. +käivitamisel sisestatud spetsiaalse andmetasandi API-võtme (`needsApiKey: true` +failis `bootstrap.ts`, kasutatakse mudelite sünkroonimiseks); `status` sisaldab vähem välju. -| Meetod | Tee | Kirjeldus | -| ------ | ----------------------------------- | ----------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Installib CLIProxyAPI npm-ist | -| `POST` | `/api/services/cliproxy/start` | Käivitab CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Peatab CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Taaskäivitab CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Uuendab uuemale versioonile | -| `GET` | `/api/services/cliproxy/status` | Reaalajas + andmebaasi olek (ilma `apiKeyMasked`-ita) | -| `POST` | `/api/services/cliproxy/auto-start` | Lülitab automaatkäivituse sisse või välja | +| Meetod | Tee | Kirjeldus | +| ------ | ----------------------------------- | --------------------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Paigalda CLIProxyAPI npm-ist | +| `POST` | `/api/services/cliproxy/start` | Käivita CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Peata CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Taaskäivita CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Uuenda uuemale versioonile | +| `GET` | `/api/services/cliproxy/status` | Reaalajas + andmebaasi olek (ilma `apiKeyMasked` väljata) | +| `POST` | `/api/services/cliproxy/auto-start` | Lülita automaatne käivitamine sisse või välja | -Ühine otspunkt `GET /api/services/{name}/logs` (vt §4.1) töötab kõigi -nelja teenusega, kasutades dünaamilist segmenti `[name]`. +Jagatud lõpp-punkt `GET /api/services/{name}/logs` (vt §4.1) töötab kõigi +nelja teenuse puhul, kasutades dünaamilist segmenti `[name]`. --- -### 4.3 Muxi otspunktid (8 marsruuti) +### 4.3 Muxi lõpp-punktid (8 marsruuti) -Muxi otspunktide struktuur on sama mis CLIProxyAPI-l — API-pinnal puudub marsruut -`rotate-key` (omanikutõend genereeritakse samal viisil nagu 9Routeril funktsiooni -`getOrCreateApiKey("mux")` kaudu ja sisestatakse keskkonnamuutuja `MUX_SERVER_AUTH_TOKEN` abil, kuid -selle jaoks pole veel spetsiaalset võtme vahetamise otspunkti). Muxi puhul hallatakse ainult elutsüklit: -erinevalt 9Routerist pole sellel 4. kihi täiturit ja seda ei registreerita kunagi marsruutimisteenuse pakkujana. +Muxi lõpp-punktide struktuur on sama mis CLIProxyAPI-l — API-liideses puudub +marsruut `rotate-key` (kandjatõend luuakse samamoodi nagu 9Routeri oma funktsiooniga +`getOrCreateApiKey("mux")` ja sisestatakse keskkonnamuutuja `MUX_SERVER_AUTH_TOKEN` kaudu, kuid +spetsiaalset võtme roteerimise lõpp-punkti veel pole). Muxil hallatakse ainult elutsüklit: +erinevalt 9Routerist pole sellel 4. kihi täiturit ja seda ei registreerita kunagi marsruutimispakkujana. -| Meetod | Tee | Kirjeldus | -| ------ | ------------------------------ | ----------------------------------------- | -| `POST` | `/api/services/mux/install` | Installib Muxi npm-ist (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Käivitab Muxi (`mux server`) | -| `POST` | `/api/services/mux/stop` | Peatab Muxi | -| `POST` | `/api/services/mux/restart` | Taaskäivitab Muxi | -| `POST` | `/api/services/mux/update` | Uuendab uuemale npm-i versioonile | -| `GET` | `/api/services/mux/status` | Reaalajas + andmebaasi olek | -| `POST` | `/api/services/mux/auto-start` | Lülitab automaatkäivituse sisse või välja | +| Meetod | Tee | Kirjeldus | +| ------ | ------------------------------ | --------------------------------------------- | +| `POST` | `/api/services/mux/install` | Paigalda Mux npm-ist (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Käivita Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Peata Mux | +| `POST` | `/api/services/mux/restart` | Taaskäivita Mux | +| `POST` | `/api/services/mux/update` | Uuenda uuemale npm-versioonile | +| `GET` | `/api/services/mux/status` | Reaalajas + andmebaasi olek | +| `POST` | `/api/services/mux/auto-start` | Lülita automaatne käivitamine sisse või välja | --- -### 4.4 Bifrosti otspunktid (8 marsruuti) +### 4.4 Bifrosti lõpp-punktid (8 marsruuti) -Bifrost on Go-põhine AI-lüüsi vahendustaustateenus (`@maximhq/bifrost`). See kasutab sama -otspunktide struktuuri nagu CLIProxyAPI (ilma `rotate-key`-ta — Bifrost haldab oma teenusepakkujate -võtmeid failis `config.json` oma `-app-dir` all). +Bifrost on Go-põhine tehisintellekti lüüsirelee taustsüsteem (`@maximhq/bifrost`). See kasutab +sama lõpp-punktide struktuuri nagu CLIProxyAPI (ilma `rotate-key` marsruudita — Bifrost haldab oma +pakkujavõtmeid failis `config.json` oma `-app-dir` all). -| Meetod | Tee | Kirjeldus | -| ------ | ---------------------------------- | -------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Bifrosti installimine npm-ist (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Bifrosti käivitamine pordil 8080 (vaikimisi) | -| `POST` | `/api/services/bifrost/stop` | Bifrosti peatamine | -| `POST` | `/api/services/bifrost/restart` | Bifrosti taaskäivitamine | -| `POST` | `/api/services/bifrost/update` | Uuemale versioonile värskendamine | -| `GET` | `/api/services/bifrost/status` | Reaalajas olek + andmebaasi olek | -| `POST` | `/api/services/bifrost/auto-start` | Automaatse käivitamise sisse- või väljalülitamine | -| `GET` | `/api/services/bifrost/logs` | SSE logi lõpposa (jagatud dünaamilise marsruudi `[name]/logs` kaudu) | +| Meetod | Tee | Kirjeldus | +| ------ | ---------------------------------- | ---------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Paigalda Bifrost npm-ist (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Käivita Bifrost pordil 8080 (vaikimisi) | +| `POST` | `/api/services/bifrost/stop` | Peata Bifrost | +| `POST` | `/api/services/bifrost/restart` | Taaskäivita Bifrost | +| `POST` | `/api/services/bifrost/update` | Uuenda uuemale versioonile | +| `GET` | `/api/services/bifrost/status` | Reaalajas + andmebaasi olek | +| `POST` | `/api/services/bifrost/auto-start` | Lülita automaatne käivitamine sisse või välja | +| `GET` | `/api/services/bifrost/logs` | SSE-logisaba (jagatud dünaamilise marsruudi `[name]/logs` kaudu) | -**Marsruutimise ühendamine:** Kui `BIFROST_BASE_URL` pole määratud ja hallatav Bifrosti -eksemplar töötab, kasutab `getBifrostRoutingConfig()` (failis `routingBackend.ts`) relee -baas-URL-ina automaatselt aadressi `http://127.0.0.1:{port}`. Sõnaselgelt määratud -keskkonnamuutuja `BIFROST_BASE_URL` on alati ülimuslik. +**Marsruutimise ühendamine:** Kui `BIFROST_BASE_URL` pole määratud ja järelevalve all olev Bifrosti +eksemplar töötab, kasutab `getBifrostRoutingConfig()` (failis `routingBackend.ts`) automaatselt +relee baas-URL-ina aadressi `http://127.0.0.1:{port}`. Selgelt määratud keskkonnamuutuja `BIFROST_BASE_URL` +on alati ülimuslik. --- @@ -506,12 +506,47 @@ keskkonnamuutuja `BIFROST_BASE_URL` on alati ülimuslik. Sama elutsükli struktuur nagu teistel teenustel (`install`, `start`, `stop`, `restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`) ning lisaks loaga kaitstud OAuthi -juhtimistasand asukohas `admin/`: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (kõik on kaitstud muutujaga `DARIO_ADMIN_TOKEN`). - -### 4.6 Pöördproksi (9Routeri juhtpaneeli manustamine) - -Juhtpaneel manustab 9Routeri veebiliidese iframe'i sisse sisemise pöördproksi kaudu +juhtimistasand prefiksi `admin/` all: `admin/accounts`, `admin/import-from-omniroute`, +`admin/login-start`, `admin/login-complete` (kõik kaitstud muutujaga `DARIO_ADMIN_TOKEN`). + +### 4.6 open-wa lõpp-punktid (7 marsruuti) + +open-wa (`@open-wa/wa-automate`) juhib WhatsApp Webi automatiseerimiseks ilma graafilise liideseta +Chromiumi eksemplari (Puppeteeri kaudu). See kasutab sama lõpp-punktide struktuuri nagu Mux (marsruuti +`rotate-key` veel pole). Selle puhul hallatakse ainult elutsüklit — see pole marsruutimise sihtmärk +ning sellel puudub 4. kihi täituri/pakkuja kirje. + +| Meetod | Tee | Kirjeldus | +| ------ | --------------------------------- | ------------------------------------------------------------------ | +| `POST` | `/api/services/openwa/install` | Paigalda open-wa npm-ist (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Käivita open-wa pordil 8323 (vaikimisi) | +| `POST` | `/api/services/openwa/stop` | Peata open-wa | +| `POST` | `/api/services/openwa/restart` | Taaskäivita open-wa | +| `POST` | `/api/services/openwa/update` | Värskenda uuemale versioonile | +| `GET` | `/api/services/openwa/status` | Reaalaja- ja andmebaasiolek | +| `POST` | `/api/services/openwa/auto-start` | Lülita automaatkäivitus sisse või välja | +| `GET` | `/api/services/openwa/logs` | SSE-logi lõpuosa (ühise dünaamilise marsruudi `[name]/logs` kaudu) | + +**API võti:** sisestatakse muutujana `WA_KEY` — open-wa üldine keskkonnamuutujate +ülekirjutus prefiksiga `WA_*` vastendab selle CLI suvandile `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, kontrollitud installitud paketi 4.76.0 põhjal). +Funktsiooni `generateServiceApiKey()` genereeritud võtmele lisatakse prefiks `ow_`. +open-wa loeb võtme HTTP-päisest `key`/`api_key` (mitte `Authorization: +Bearer`); `/api-docs*` on kontrollist sõnaselgelt vabastatud +(`setupAuthenticationLayer` failis `dist/cli/server.js`), seega ei vaja +seisundikontroll autentimispäist. + +**Sidumine:** open-wa on mitteametlik ega ole WhatsAppiga seotud — ühendatud +numbril on WhatsAppi enda automatiseerimise tuvastuse tõttu blokeerimisoht. +Esimesel käivitamisel prinditakse sidumise QR-kood standardväljundisse ning +kuvatakse olemasoleva logipaneeli/SSE-voo kaudu — selles integratsioonis pole +veel eraldi QR-pildi lõpp-punkti. + +--- + +### 4.7 Pöördproksi (9Routeri juhtpaneeli manustamine) + +Juhtpaneel manustab 9Routeri veebiliidese iframe'i sisemise pöördproksi kaudu aadressil: ``` @@ -520,18 +555,18 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] See proksi: -- Edastab päringu aadressile `http://127.0.0.1:{port}/{path}` (ainult tagasisidestusliides) +- Edastab päringu aadressile `http://127.0.0.1:{port}/{path}` (ainult loopback) - Eemaldab sissetulevad päised `cookie` ja `authorization` (OmniRoute'i seanss ei leki) - Lisab 9Routeri autentimiseks päise `Authorization: Bearer {apiKey}` -- Eemaldab vastusest päised `set-cookie`, `content-security-policy`, `x-frame-options` ja `cross-origin-*` -- Kirjutab HTML-vastused ümber, lisades `` ja normaliseerides absoluutsed teed (`/foo` → `/dashboard/.../embed/foo`) +- Eemaldab vastusest päised `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` +- Kirjutab HTML-vastused ümber, et lisada `` ja normaliseerida absoluutsed teed (`/foo` → `/dashboard/.../embed/foo`) -Manustatud juhtpaneeli WebSocketi täiendustaotlusi töötleb eraldi pordil töötav +Manustatud juhtpaneeli WebSocketi protokollivahetusi käitleb eraldi pordil töötav kaasserver (vt `src/lib/services/embedWsProxy.ts`). -**Turvalisus:** Manustamisproksi marsruudid on liigitatud loendi `LOCAL_ONLY_API_PREFIXES` -alla ja neile pääseb ligi ainult tagasisidestusliidesest. Ründaja, kes saab JWT -Cloudflare'i/Ngroki tunneli kaudu, ei saa manustatud teenustesse päringuid vahendada. +**Turvalisus:** manustusproksi marsruudid on liigitatud jaotisse `LOCAL_ONLY_API_PREFIXES` +ning neile pääseb juurde ainult loopback'i kaudu. Ründaja, kes hangib JWT +Cloudflare'i/Ngroki tunneli kaudu, ei saa manustatud teenustesse proksida. --- diff --git a/docs/i18n/et/docs/frameworks/MEMORY.md b/docs/i18n/et/docs/frameworks/MEMORY.md index 50e55578f6d7..754eed2cfe93 100644 --- a/docs/i18n/et/docs/frameworks/MEMORY.md +++ b/docs/i18n/et/docs/frameworks/MEMORY.md @@ -166,29 +166,33 @@ Tabel `memory_vec_meta` (migratsioon `083_memory_vec.sql`) talletab: ## Seadete laiendus -Failis `src/shared/schemas/memory.ts` oleva `MemorySettingsExtended` jaoks on saadaval üheksa manustus- ja vektorvälja, mis salvestatakse faili `src/lib/db/settings.ts` kaudu: - -| Väli | Tüüp | Vaikeväärtus | Kirjeldus | -| ------------------------ | -------------------------------------------------- | ------------ | --------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Kasutatav manustamisallikas | -| `embeddingProviderModel` | `string \| null` | `null` | Pakkuja/mudel vormingus `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | Ainult mälu jaoks mõeldud OpenAI-ga ühilduva otspunkti baas-URL | -| `customModelId` | `string \| null` | `null` | Kohandatud otspunktile saadetav mudeli ID | -| `transformersEnabled` | `boolean` | `false` | Transformers.js-i lubamine (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Staatilise kohaliku mudeli potion-base-8M lubamine | -| `rerankEnabled` | `boolean` | `false` | Ümberjärjestamise etapi lubamine (lisab +200-500ms/päring) | -| `rerankProviderModel` | `string \| null` | `null` | Ümberjärjestamise pakkuja/mudel vormingus `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Kasutatav vektortaustsüsteem | - -Need on saadaval `GET /PUT /api/settings/memory` kaudu (skeem `MemorySettingsExtendedSchema`). +Üheksa põimendus- ja vektorvälja on saadaval liideses `MemorySettingsExtended` failis +`src/shared/schemas/memory.ts` ning need salvestatakse faili `src/lib/db/settings.ts` kaudu: + +| Väli | Tüüp | Vaikeväärtus | Kirjeldus | +| ------------------------ | -------------------------------------------------- | ------------ | ----------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Kasutatav põimendusallikas | +| `embeddingProviderModel` | `string \| null` | `null` | Pakkuja/mudel vormingus `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | Ainult Memory jaoks mõeldud OpenAI-ga ühilduva otspunkti baas-URL | +| `customModelId` | `string \| null` | `null` | Kohandatud otspunktile saadetav mudeli ID | +| `transformersEnabled` | `boolean` | `false` | Transformers.js-i kasutamise lubamine (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Staatilise kohaliku mudeli potion-base-8M kasutamise lubamine | +| `rerankEnabled` | `boolean` | `false` | Ümberjärjestamise etapi lubamine (lisab +200-500ms/päring) | +| `rerankProviderModel` | `string \| null` | `null` | Ümberjärjestamise pakkuja/mudel vormingus `provider/model` | + +`rerankProviderModel` lahendatakse marsruudi `POST /v1/rerank` kaudu (kutsutakse loopback-liidese kaudu), seega aktsepteerib see kõike, mida vastav marsruut aktsepteerib: kureeritud pilvepõhist ümberjärjestusmudelit (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) või OpenAI-ga ühilduva pakkuja sõlme kujul `/` (nt `skilled-mini/bge-reranker-v2-m3` TEI/Infinity serveri puhul). Loopback-sõlmed on alati sobilikud; teises hostis (LAN, Tailscale) asuv sõlm nõuab lisaks funktsioonilippu `RERANK_REMOTE_PROVIDER_NODES` ja peab vastama pakkuja väljaminevate URL-ide poliitikale — vt [Funktsioonilipud](../reference/FEATURE_FLAGS.md). Töölaua valik kuvab kureeritud pakkujad ja kohalikud sõlmed; mis tahes kehtiva `provider/model` stringi saab määrata otse marsruudi `PUT /api/settings/memory` kaudu. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Kasutatav vektorsalvestuse taustsüsteem | + +Need väljad on kättesaadavad marsruudi `GET /PUT /api/settings/memory` kaudu (skeem `MemorySettingsExtendedSchema`). Allika `remote` puhul aktsepteerib Memory ka valikulisi seadeid `customBaseUrl` ja -`customModelId`. Koos valivad need OpenAI-ga ühilduva `/embeddings` -otspunkti ja mudeli ilma globaalset manustusregistrit muutmata. Otspunkt -normaliseeritakse enne kasutamist ja seda kontrollitakse pakkuja väljaminevate URL-ide reeglistiku alusel: nõutav on -HTTP(S), manustatud identimisteave ja päringustringid lükatakse tagasi ning pilve metaandmete -aadressid jäävad blokeerituks. Tühjad väärtused säilitavad valitud registripakkuja. Töölauale -tagastatavad vead puhastatakse ning otspunkti identimisteavet ei logita kunagi. +`customModelId`. Koos valivad need OpenAI-ga ühilduva `/embeddings`-otspunkti ja +mudeli ilma globaalset põimendusregistrit muutmata. Otspunkt normaliseeritakse enne +kasutamist ja seda kontrollitakse pakkuja väljaminevate URL-ide poliitika alusel: nõutav +on HTTP(S), manustatud autentimisandmed ja päringustringid lükatakse tagasi ning +pilvkeskkonna metaandmete aadressid jäävad blokeerituks. Tühjad väärtused säilitavad +valitud registripakkuja. Töölauale tagastatavad vead puhastatakse ja otspunkti +autentimisandmeid ei logita kunagi. > **TODO (D20):** Ulatus `global` (mälestuste jagamine kõigi API-võtmete vahel) ei ole > selles versioonis rakendatud. See nõuab skeemimuudatusi ja globaalset otsinguteed. diff --git a/docs/i18n/et/docs/guides/DOCKER_GUIDE.md b/docs/i18n/et/docs/guides/DOCKER_GUIDE.md index 36de9e485506..852e9e3497e9 100644 --- a/docs/i18n/et/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/et/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Kiirkäivitus +> **Isemajuta ühe käsuga?** Vaata +> [isemajutuse juhendit](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (avaldatud tõmmis + +> Redis, ainult loopback-liidesel, profiili pole vaja valida). Allolev kiirkäivitus on +> ühe konteineriga lahendus kasutajatele, kes käitavad Redist juba mujal. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/et/docs/guides/TROUBLESHOOTING.md b/docs/i18n/et/docs/guides/TROUBLESHOOTING.md index dc6be4805605..c3b930460f3a 100644 --- a/docs/i18n/et/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/et/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ Määrake need OmniRoute'i protsessi keskkonnas (deemonis, näiteks LaunchAgenti --- -## `npm install` hoiatused (ERESOLVE / partnerpaketid / aegunud paketid) +## `npm install` hoiatused (ERESOLVE / võrdväärsõltuvused / aegunud paketid) -Kui käivitate käsu `npm install -g omniroute`, võite näha hulgaliselt hoiatusi, nagu `npm warn ERESOLVE`, partnerpakettide sõltuvuste teateid ja `deprecated`-teateid. **Need on ootuspärased ja ohutud.** Installimine õnnestus, kui väljundis kuvatakse `added packages`. +Kui käivitate käsu `npm install -g omniroute`, võite näha hulgaliselt hoiatusi, nagu `npm warn ERESOLVE`, võrdväärsõltuvuste teated ja `deprecated`-teated. **Need on ootuspärased ja kahjutud.** Installimine õnnestus, kui väljundis kuvatakse `added packages`. -Hoiatused tulenevad aegunud partnerpakettide sõltuvusvahemikest kolmandate osapoolte pakettides, mida OmniRoute ei halda: +Võrdväärsõltuvuste lahendamise hoiatuste peitmiseks kasutage OmniRoute'i toetatud installimisviisi: -1. **`marked-terminal` nõuab versiooni `marked >=1 <16`, kuid leiti `marked@18`** — praktikas töötab see korralikult; ülesvoolu partnerpaketi vahemik on lihtsalt aegunud. -2. **`deprecated prebuild-install@7.1.3`** — transitiivne natiivse binaarfaili hankimise abitööriist. Seda ei - kasutata fikseeritud versiooniga `wreq-js` transpordisidumise installimiseks ning see ei näita, et veebiküpsiste +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` peidab ainult `ERESOLVE`- ja võrdväärsõltuvuste teated. Aegumise teated jäävad nähtavaks, sest need pärinevad transitiivsetest kolmanda osapoole pakettidest; need ei tähenda, et installimine ebaõnnestus. + +Hoiatused tulenevad aegunud võrdväärsõltuvuste versioonivahemikest kolmanda osapoole pakettides, mida OmniRoute ei halda: + +1. **`marked-terminal` nõuab versiooni `marked >=1 <16`, kuid leiti `marked@18`** — praktikas töötab see probleemideta; ülesvoolu võrdväärsõltuvuse versioonivahemik on lihtsalt aegunud. +2. **`deprecated prebuild-install@7.1.3`** — transitiivne abivahend natiivbinaarfailide hankimiseks. Seda ei + kasutata fikseeritud versiooniga `wreq-js` transpordisideme installimiseks ning see ei tähenda, et veebiküpsiste pakkuja transpordi seadistamine ebaõnnestus. -**Midagi pole vaja teha** — hoiatusi ei saa täielikult vaigistada ilma ülesvoolu pakette kahveldamata. +**Midagi pole vaja teha** — hoiatusi ei saa täielikult peita ilma ülesvoolu pakette hargnemata. --- diff --git a/docs/i18n/et/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/et/docs/providers/CURSOR-API-KEY-AND-CLI.md index 27660ea7bd79..47ebae264f48 100644 --- a/docs/i18n/et/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/et/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,30 +4,31 @@ --- -Kaks võimalust Cursori paigutamiseks OmniRoute'i taha ilma IDE-seansita: +Kaks võimalust Cursori kasutamiseks OmniRoute’i kaudu ilma IDE-seansita: -1. **`cursor-api` pakkuja** (kaart „Cursor API“, alias `cua`): API-võtme - pakkuja, mis hoiab Cursori kasutaja API-võtit (`crsr_…`, loodud aadressil - `https://cursor.com/dashboard/api`). Seejärel pääseb iga OmniRoute'i klient - Cursori mudelitele ligi `/v1/chat/completions` kaudu mudelina +1. **`cursor-api` pakkuja** (kaart „Cursor API“, alias `cua`): API-võtmel + põhinev pakkuja, mis talletab Cursori kasutaja API-võtme (`crsr_…`, loodud + aadressil `https://cursor.com/dashboard/api`). Seejärel pääseb iga OmniRoute’i klient + Cursori mudelitele ligi lõpp-punkti `/v1/chat/completions` kaudu mudelinimega `cursor-api/` või `cua/`, kasutades tavapäraseid kvoodi-, - varuvariandi- ja logimiskihte. IDE-pakkuja (`cursor`, OAuth/IDE-seanss) jääb + varuvaliku- ja logimiskihte. IDE-pakkuja (`cursor`, OAuth/IDE-seanss) jääb muutmata. -2. **Cursor CLI läbipääs**: suuna Cursor CLI (`agent`) OmniRoute'i, et - iga CLI tehtud RPC autentitaks OmniRoute'i API-võtmega, edastataks - Cursorile `cursor-api` ühenduse mandaadiga ning salvestataks lehel - Logid. +2. **Cursor CLI läbipääs**: suunake Cursor CLI (`agent`) OmniRoute’i, et + iga CLI tehtud RPC autenditaks OmniRoute’i API-võtmega, edastataks + Cursorile `cursor-api` ühenduse mandaadiga ja salvestataks + logide lehel. ## Miks võti vahetatakse -`api2.cursor.sh` lükkab töötlemata `crsr_…` võtme Bearer-loana tagasi (401). Cursor -CLI saadab võtme esmalt POST-päringuga lõpp-punkti `/auth/exchange_user_api_key` ja saab -vastuseks seansi JWT, mis aegub ühe tunni pärast; tagastatud `refreshToken` sisaldab sama +`api2.cursor.sh` lükkab toore `crsr_…` võtme Bearer-loana tagasi (401). Cursor +CLI saadab esmalt võtme POST-päringuga lõpp-punkti `/auth/exchange_user_api_key` ja saab +seansi JWT, mis aegub ühe tunni pärast; tagastatud `refreshToken` sisaldab sama `exp` väärtust, seega tähendab värskendamine võtme uuesti vahetamist. -`open-sse/services/cursorApiKeyAuth.ts` teeb selle vahetuse, salvestab vahemällu ühe seansi -loa võtme kohta, vahetab selle uuesti viis minutit enne aegumist ja eemaldab vahemällu -salvestatud loa, kui Cursor vastab koodiga 401. `CursorExecutor` kutsub seda vahetult enne -ülesvoolu voo avamist `cursor-api` ühenduste jaoks. +`open-sse/services/cursorApiKeyAuth.ts` teeb selle vahetuse, salvestab vahemällu +ühe seansitõendi iga võtme kohta, vahetab selle uuesti viis minutit enne aegumist +ja eemaldab vahemällu salvestatud tõendi, kui Cursor vastab olekukoodiga 401. +`CursorExecutor` kutsub selle välja vahetult enne `cursor-api` ühenduste +ülesvooluvoo avamist. ## `cursor-api` pakkuja @@ -38,7 +39,7 @@ Register: `open-sse/config/providers/registry/cursor/index.ts` `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Juhtpaneel: Pakkujad → Cursor API → Lisa API-võti. +Töölaud: Pakkujad → Cursor API → Lisa API-võti. REST: @@ -59,11 +60,23 @@ curl -sS http://localhost:20128/v1/chat/completions \ Märkused: -- `cursor-api` mudelite loend pärineb staatilisest Cursori registrist (samast - loendist, mida IDE-pakkuja kasutab varuvariandina); `cursor-agent` paigaldamine - OmniRoute'i hosti pole vajalik. -- `POST /api/providers/{id}/refresh-cursor` on mõeldud ainult `cursor` IDE-pakkujale; - `cursor-api` ühendustel pole uuendamist vajavat IDE-seanssi. +- `cursor-api` mudelite loend pärineb Cursori staatilisest registrist (sama + loend, mida IDE-pakkuja kasutab varuvariandina); OmniRoute’i hosti pole vaja + installida paketti `cursor-agent`. +- `POST /api/providers/{id}/refresh-cursor` on mõeldud ainult `cursor` + IDE-pakkujale; `cursor-api` ühendustel pole uuendatavat IDE-seanssi. + +## Natiivsed mudeli-ID-d ja pingutustase + +`cursor` / `cu` ja `cursor-api` / `cua` puhul jätab ühine Claude’i pingutustaseme +normaliseerija taotletud mudeli-ID muutmata. Cursor võib reklaamida sufiksit, +näiteks `-low`, tegeliku mudeli-ID osana, mitte OmniRoute’i pingutustaseme +aliasena. Cursori täitur säilitab täpse vaste aktiivses kataloogis; kui vastet +pole, haldab selle olemasolev mudelilahendaja sufiksi teisendamist parameetriks. + +See ei muuda pingutustaseme normaliseerimist Claude’i otseühenduste, +Claude’iga ühilduvate ega Vertexi marsruutide puhul. Saadavus sõltub endiselt +valitud Cursori konto kataloogist ja kasutusõigusest. ## Cursor CLI läbipääs @@ -72,31 +85,31 @@ Marsruut: `src/app/api/cursor-cli/[...path]/route.ts` → registreeritud failis `src/shared/constants/publicApiRoutes.ts`, sest töötleja jõustab oma autentimise: -| Tee | CLI-lt oodatav autentimine | Mida OmniRoute teeb | -| -------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Valideerib võtme, loob 1-tunnise HS256 JWT (allkirjastatud võtmega `JWT_SECRET`) ja tagastab selle | -| kõik muud teed (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Kontrollib väljaandjat/sihtrühma/aegumist, valib aktiivse `cursor-api` ühenduse, asendab Authorization-päise vahetatud Cursori loaga ja voogedastab vastuse tagasi | +| Tee | CLI-lt oodatav autentimine | Mida OmniRoute teeb | +| -------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Valideerib võtme, väljastab 1-tunnise HS256 JWT (allkirjastatud muutujaga `JWT_SECRET`) ja tagastab selle | +| kõik muud teed (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Kontrollib väljastajat, sihtrühma ja aegumisaega, valib aktiivse `cursor-api` ühenduse, asendab Authorization-päise vahetatud Cursor tokeniga ning voogedastab vastuse tagasi | -CLI dekodeerib `exp` väärtuse igast saadud loast, seega põhjustab läbipaistmatu -loa andmine selle uuesti vahetamise peaaegu enne iga päringut; loodud JWT väldib -seda. OmniRoute'i vastus 401 paneb CLI loa uuesti vahetama. +CLI dekodeerib välja `exp` mis tahes saadud tokenist, seega läbipaistmatu tokeni +andmisel vahetab see tokeni uuesti enne peaaegu iga päringut; väljastatud JWT +väldib seda. OmniRoute'i vastus 401 paneb CLI tokenit uuesti vahetama. ### Seadistamine -1. Loo OmniRoute'i API-võti (Juhtpaneel → API-võtmed) ja `cursor-api` +1. Looge OmniRoute API-võti (Dashboard → API keys) ja `cursor-api` ühendus. -2. Määra CLI kasutama agendivoo jaoks HTTP/1.1. Failis +2. Määrake CLI kasutama agendi voo jaoks HTTP/1.1. Failis `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Ilma selleta avab CLI agendi suhtluse HTTP/2 kaudu eraldi - seadistatud agendihostiga ja lõpp-punkti kaudu liiguvad ainult + Ilma selleta avab CLI agendi pöörde HTTP/2 kaudu eraldi + seadistatud agendi hosti suunas ning lõpp-punkti kaudu liiguvad ainult juhtimistasandi RPC-d. -3. Käivita CLI OmniRoute'i suhtes: +3. Käivitage CLI OmniRoute'i vastu: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -104,19 +117,19 @@ seda. OmniRoute'i vastus 401 paneb CLI loa uuesti vahetama. agent -p --trust "Reply with exactly OK" ``` -Iga etapp jõuab logidesse pakkujana `cursor-api`, päringu tüübina `cursor-cli`, -teega `/api/cursor-cli/` ning seostatakse OmniRoute'i API-võtme ja päringut -teenindanud ühendusega. +Iga etapp jõuab logidesse teenusepakkujana `cursor-api`, päringutüübiga `cursor-cli` +ja teega `/api/cursor-cli/` ning seostatakse OmniRoute API-võtme ja +seda teenindanud ühendusega. ### Tõrkerežiimid | Olukord | Vastus CLI-le | | --------------------------------------------------- | ------------------------------------------------------ | | Tundmatu OmniRoute'i võti ja `REQUIRE_API_KEY=true` | 401 `unauthenticated` vahetamisel | -| `REQUIRE_API_KEY=false` | anonüümne seanss (vastab `/v1/*` käitumisele) | -| Aegunud / võõras / muudetud seansi JWT | 401, CLI vahetab selle uuesti | -| OmniRoute'i API-võti tühistati pärast vahetamist | 401 järgmisel RPC-l | +| `REQUIRE_API_KEY=false` | anonüümne seanss (järgib `/v1/*` käitumist) | +| Aegunud / võõras / muudetud seansi JWT | 401, CLI vahetab tokeni uuesti | +| OmniRoute API-võti tühistati pärast vahetamist | 401 järgmisel RPC-l | | Aktiivne `cursor-api` ühendus puudub | 503 `unavailable` | -| Cursor lükkab ühenduse võtme tagasi | 401 `unauthenticated`, puhverdatud seanss eemaldatakse | +| Cursor lükkab ühenduse võtme tagasi | 401 `unauthenticated`, puhverdatud seanss kustutatakse | | Ülemteenus pole kättesaadav | 502 `unavailable` (puhastatud sõnum) | -| `JWT_SECRET` pole määratud | 503 vahetamisel | +| `JWT_SECRET` on määramata | 503 vahetamisel | diff --git a/docs/i18n/et/docs/reference/API_REFERENCE.md b/docs/i18n/et/docs/reference/API_REFERENCE.md index e1b89d72b25c..d3e9517028ff 100644 --- a/docs/i18n/et/docs/reference/API_REFERENCE.md +++ b/docs/i18n/et/docs/reference/API_REFERENCE.md @@ -417,68 +417,90 @@ Kasuta seda endpointi, kui sidecar töötab väliselt (out-of-process) ja ei saa --- -## Ühilduvuse endpointid - -| Meetod | Tee | Formaat | -| ------ | ----------------------------------------- | ------------------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (redigeerimine/inpaint) | -| POST | `/v1/videos/generations` | OpenAI-laadne video genereerimine | -| POST | `/v1/music/generations` | OpenAI-laadne muusika genereerimine | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (tagastab audio sisu) | -| POST | `/v1/rerank` | Cohere/Voyage-laadne uuesti järjestamine (rerank) | -| POST | `/v1/classify` | Jina klassifitseerimine (`api.jina.ai`) | -| POST | `/v1/segment` | Jina segmenteerija (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | OpenAI kataloogi alias | -| GET | `/api/v1/vscode/{token}/models` | OpenAI mudelite alias | -| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokenitud alias | -| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokenitud alias | -| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenitud alias | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama tags tokenitud alias | - -Kõik POST-teed järgivad sama struktuuri: `Bearer your-api-key` + Zod-valideeritud JSON-sisu (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` jne, vaata `src/shared/validation/schemas.ts`). Skeemi valideerimise ebaõnnestumisel tagastatakse 4xx. - -Klientidele, kes ei saa lisada `Authorization: Bearer ...`, aktsepteerib OmniRoute API võtmeid ka URL-is, kas päringustringi ühilduvuse kaudu (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) või allpool dokumenteeritud eraldi `/api/v1/vscode/{token}/...` endpointide kaudu. +## Ühilduvusotspunktid + +| Meetod | Tee | Vorming | +| ------ | ----------------------------------------- | --------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (redigeerimine/inpaint) | +| POST | `/v1/videos/generations` | OpenAI-laadne videogeneratsioon | +| POST | `/v1/music/generations` | OpenAI-laadne muusikageneratsioon | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (tagastab heli sisuosa) | +| POST | `/v1/rerank` | Cohere/Voyage-laadne ümberjärjestamine | +| POST | `/v1/classify` | Jina klassifitseerimine (`api.jina.ai`) | +| POST | `/v1/segment` | Jina segmentija (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | OpenAI kataloogi alias | +| GET | `/api/v1/vscode/{token}/models` | OpenAI mudelite alias | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokeniseeritud alias | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokeniseeritud alias | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokeniseeritud alias | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama siltide tokeniseeritud alias | + +Kõik POST-marsruudid järgivad sama kuju: `Bearer your-api-key` + Zodiga valideeritud JSON-i sisuosa (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` jne, vt `src/shared/validation/schemas.ts`). Skeemi valideerimise nurjumisel tagastatakse 4xx. + +Klientide jaoks, mis ei saa lisada päist `Authorization: Bearer ...`, aktsepteerib OmniRoute API võtmeid ka URL-is kas päringustringi ühilduvuse kaudu (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) või allpool dokumenteeritud spetsiaalsete `/api/v1/vscode/{token}/...` otspunktide kaudu. ```bash -# Uuesti järjestamine (rerank) +# Ümberjärjestamine (pilveregistri pakkuja või OpenAI-ga ühilduv pakkujasõlm kujul "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina klassifitseerimine (Foundation API mandaadid) +# Jina klassifitseerimine (Foundation API mandaat) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Jina segmenteerija +# Jina segmentija POST /v1/segment { "content": "...", "return_chunks": true } -# Jina otsing (s.jina.ai; provider'i aliased: jina-search, jina-ai, jina) +# Jina otsing (s.jina.ai; pakkuja aliased: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } # Modereerimine POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — tagastab audio/mpeg (või soovitud vormingus) sisu +# TTS — tagastab audio/mpeg-vormingus (või soovitud vormingus) sisuosa POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Pildi redigeerimine (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Video / muusika genereerimine (provider'i eesliitega mudeli ID) +# Video / muusika genereerimine (pakkuja prefiksiga mudeli ID) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Provider'ile pühendatud teed +> **Ümberjärjestamise pakkujasõlmed:** `POST /v1/rerank` suunab päringuid ka OpenAI-ga ühilduvatesse pakkujasõlmedesse +> (oMLX, vLLM, Infinity, TEI lüüsi taga jne), mille aadress on `/`. Tagasisideahela +> sõlmed (`localhost`, `127.0.0.1`, `172.16.0.0/12`) on alati lubatud. Mis tahes muus hostis +> asuvad sõlmed — kohtvõrgu masin või Tailscale'i partner — on lubatud ainult siis, kui operaator lubab +> funktsioonilipu `RERANK_REMOTE_PROVIDER_NODES` **ja** sõlme baas-URL läbib pakkuja +> väljamineva URL-i poliitika (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> pilvemetaandmete hostidesse ei suunata kunagi päringuid. Mälu mootori ümberjärjestamise samm kutsub seda marsruuti +> tagasisideahela kaudu, seega reguleerib sama reegel mälu seadetes väärtust `rerankProviderModel`. +> +> **Kohalike serverite kujud:** sõlme kutsutakse aadressil `/v1/rerank` ja vastuse 404 korral aadressil `/rerank` +> (Infinity, TEI). Ülesvoolu sisuosa sisaldab nii Cohere'i/OpenAI kirjapilti (`documents`, +> `return_documents`) kui ka TEI kirjapilti (`texts`, `return_text`) ning ülesvoolu vastus +> normaliseeritakse Cohere'i ümbrikuks: TEI tühi `[{index, score, text}]`, õhukeste lüüside +> `{results: [{index, score}]}` ja Voyage'i-laadne `{data: [...]}` tagastatakse kõik kliendile kujul +> `{results: [{index, relevance_score, document?}]}`, sordituna skoori järgi ja piiratud väärtusega `top_n`. + +> **Pakkujasõlmede tuvastamine:** OpenAI-ga ühilduva pakkujasõlme mudelid kuvatakse päringus `GET /v1/models` +> sõlme prefiksi all. Read, mis ei sisalda otspunkti metaandmeid (tüüpiline kohalike `/v1/models` loendite puhul), +> pärivad sõlme `apiType` väärtuse, mistõttu `embeddings`-sõlme mudelite väärtus on `type: "embedding"` ja +> `rerank`-sõlme mudelite väärtus on `type: "rerank"`, selle asemel et kasutada vaikimisi vestlust; sünkroonitud +> või käsitsi lisatud rea selgesõnaline `supportedEndpoints` on endiselt ülimuslik. + +### Spetsiaalsed pakkujamarsruudid ```bash POST /v1/providers/{provider}/chat/completions @@ -486,7 +508,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Provider'i eesliide lisatakse automaatselt, kui see puudub. Mittevastavate mudelite korral tagastatakse `400`. +Pakkuja prefiks lisatakse automaatselt, kui see puudub. Sobimatud mudelid tagastavad vastuse `400`. --- diff --git a/docs/i18n/et/docs/reference/ENVIRONMENT.md b/docs/i18n/et/docs/reference/ENVIRONMENT.md index 35f5dbaa8c43..bc24ee395bd0 100644 --- a/docs/i18n/et/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/et/docs/reference/ENVIRONMENT.md @@ -77,74 +77,73 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" --- -## 2. Salvestusruum ja andmebaas - -OmniRoute kasutab kogu püsiva talletuse jaoks **SQLite’i** (`better-sqlite3` kaudu). Need muutujad juhivad andmete asukohta, krüptimist ja elutsüklit. - -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite’i andmebaasi, varukoopiate ja andmefailide juurkataloog. Kirjuta see üle Dockeri köidete või kohandatud teede kasutamiseks. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(määramata)_ | `src/lib/dataPaths.ts` | Pääsetee testide/hindamise DATA_DIR-i kaitse jaoks (#10428). Testid ja Node’i eval/print-kontrollid (`-e`/`--eval`/`-p`/`--print`, sealhulgas vormid `--eval=`/`--print=`), millel puudub `DATA_DIR`, suunatakse ajutisse ühekordselt kasutatavasse kataloogi, et need ei saaks avada operaatori tegelikku andmebaasi; tegeliku kataloogi kasutamise lubamiseks määra väärtuseks `1`. | -| `OMNIROUTE_BUILD_SHA` | _(määramata)_ | `src/lib/monitoring/buildSha.ts` | Töötava artefakti Git SHA. Lisatakse käsuga `npm run build:release`; konteinerites, mida levitatakse ilma kontrollfailita `dist/BUILD_SHA`, saab selle väärtuse sisestada. Avaldatakse väljana `system.buildSha` otspunktis `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Viide, mille suhtes kontrollib artefakti pakkimise päritoluvärav järgu SHA-d (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(määramata)_ | `scripts/build/buildProvenance.ts` | Määra väärtuseks `1`, et lubada sellise järgu pakkimine, mille SHA ei asu väljalaskeharul, salvestades selle värava nurjumise asemel tahtliku canary-järguna (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(määramata)_ | `scripts/ops/deploy-canary.mjs` | Canary-juurutuse smoke-kontrolli API-võti, mis saadetakse otspunktile `/v1/chat/completions` kujul `Authorization: Bearer`. Seda kasutab ainult juurutusskript (#10429), mitte kunagi server. See ei ole seotud eraldi lubatava CLI smoke-testiraamistiku muutujatega `OMNIROUTE_SMOKE_*` (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` failis `tests/integration/upstream-cli-smoke.int.test.ts`) — vt [CLI integratsioonid → Tegelik smoke-kontroll](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(määramata)_ | `src/lib/buildPhase.ts` | Järgufaasi signaal (#10060): skript `scripts/build/build-next-isolated.mjs` määrab selle väärtuseks `1` ja iga käivitatud järgukoostaja pärib selle, et andmebaasikiht tagastaks natiivse better-sqlite3 lisamooduli laadimise asemel toiminguteta asenduse (lisamoodul katkestab koostaja töö väljumisel). Töötava serveri puhul ei määrata seda kunagi. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Määra väärtuseks `1`, et jätta ebaharilike komplekteeritud kataloogipuude puhul valikuliste natiivsõltuvuste järgueelse kontroll vahele. See ei muuda puuduva sõltuvusega järku koostatavaks; kasuta ainult siis, kui natiivsõltuvused tarnitakse eraldi. | -| `OMNIROUTE_DATA_DIR` | _(määramata)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR`-i **varu-alias**, mida kontrollitakse ainult siis, kui `DATA_DIR` on määramata. Seda kasutatakse PromptQL-i täituri kettal asuva lõimepüsiva seansivahemälu (`/promptql-thread-sessions.json`) leidmiseks; kui kumbagi muutujat pole määratud, jääb vahemälu ainult mällu (seda ei säilitata taaskäivituste vahel). | -| `OMNIROUTE_PLUGINS_DIR` | _(määramata)_ | `src/lib/plugins/scanner.ts` | Kataloog, mida loeb **käitusaegne pistikprogrammiskanner** ja kuhu pistikprogrammihaldur installib, kirjutades üle kodukataloogist tuletatud vaikeväärtuse (#11827). Suuna see Dockeris/K8s-is haagitud pistikprogrammipuule, selle asemel et muuta muutujat HOME üksnes skannimistee ümberpaigutamiseks (HOME juhib ka kõiki muid kodukataloogi suhtes määratud käitumisi). Määramata = `~/.omniroute/plugins` või `/tmp/.omniroute/plugins`, kui protsess ei ekspordi üldse kodukataloogi — see muutuja kõrvaldab sellest tuleneva vaikiva tuvastamata jäämise. Lahendatud kataloog logitakse käivitamisel üks kord sündmusena `scanner.dir_resolved` koos määravaks osutunud sisendiga. Ainult serveripoolel: CLI käsupistikprogrammid kasutavad jätkuvalt oma muutujat `OMNIROUTE_PLUGIN_PATH` (jaotis 9). | -| `STORAGE_ENCRYPTION_KEY` | _(tühi = keelatud)_ | `src/lib/db/encryption.ts` | AES-võti kogu SQLite'i andmebaasi jõudeoleku krüptimiseks. Genereerige käsuga `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Krüptimisvõtme versioonitähis. Vanade varukoopiate dekrüptimise toetamiseks suurendage seda võtme roteerimisel. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Kui väärtus on `true`, jäetakse tavapärased / kirjutamiseelsed SQLite'i failide varukoopiad vahele (models.dev-i hinnakirja salvestamine/tühjendamine, seadete kirjutamine). Käsitsi loodavad ja taastamiseelsed varukoopiad luuakse endiselt. See **ei** keela migratsioonikäituri kohustuslikku püsivat turvatõmmist ega olemasoleva püsiva andmebaasi massmigratsiooni kaitset. Mittekäsitsi loodavaid varukoopiaid tehakse kõige rohkem üks kord 60 minuti jooksul. Juhtpaneeli jaotises **Seaded → Salvestusruum** saab tavapärase automaatse varundamise eraldi keelata. | -| `OMNIROUTE_CRYPT_KEY` | _(määramata)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` **pärandalias**. Kui esmane muutuja puudub, aktsepteeritakse seda varuvariandina. | -| `OMNIROUTE_API_KEY_BASE64` | _(määramata)_ | `src/lib/db/encryption.ts` | **Pärandalias** (Base64-kodeeritud kujul), mida aktsepteeritakse varuvariandina. Dekodeeritakse enne kasutamist automaatselt. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(määramata)_ | `src/lib/db/core.ts` | Alistab SQLite'i perioodilise tervisekontrolli intervalli (ms). Kui see pole määratud, tuletatakse vaikeväärtused muutujast `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/walMaintenance.ts` | Alistab perioodilise `wal_checkpoint(TRUNCATE)` intervalli (ms). Automaatne kontrollpunkt ei vähenda kunagi WAL-faili ennast ja pikaajaliselt töötav server ei sulge kunagi oma andmebaasi. `0` keelab selle. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Alistab sagedase `wal_checkpoint(PASSIVE)` intervalli (ms). Hoiab ootel WAL-kaadrite mahu väiksena, et perioodiline TRUNCATE ei kopeeriks põhilõimes kunagi mitme GB suurust kuhjumit. `0` keelab selle. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Kui PASSIVE-tsükkel tuvastab, et WAL-fail ületab selle suuruse, käivitatakse aeglase tsükli ootamise asemel kohe `wal_checkpoint(TRUNCATE)`. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Määrake väärtuseks `1`/`true`/`yes`/`on`, et protsess väljuks pärast kriitilise ressursisurve püsimist ajavahemiku `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` jooksul, võimaldades järelevalveprotsessil (systemd `Restart=always`, Dockeri taaskäivitamispoliitika) käivitada puhta protsessi selle asemel, et lõputult 503-vastuseid väljastada. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Kui kaua peab kriitiline ressursisurve püsima, enne kui protsess isetaaskäivituseks sulgub. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(automaattuvastus)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Selgesõnaline tee (absoluutne või cwd suhtes relatiivne) failini `sql-wasm.wasm`, kui kasutatakse `sql.js`-i WASM-varuadapterit. Kui see pole määratud, tuvastatakse see automaatselt paketi sõltuvuste ja kandidaatpaigutuste kaudu. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/core.ts` | Alistab perioodilise `wal_checkpoint(TRUNCATE)` intervalli (ms). Automaatne kontrollpunkt ei vähenda kunagi WAL-faili ennast ja pikaajaliselt töötav server ei sulge kunagi oma andmebaasi. `0` keelab selle. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Päevade arv, mille jooksul säilitatakse lõpetatud (completed/failed/cancelled/expired) Batch API töö kontrollpunktid, viidatud sisend-/väljund-/veafailid ja rida enne nende kustutamist automaatse puhastuse käigus. Rakendub ainult siis, kui `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` on sisse lülitatud; vastab OpenAI enda Batch API väljundite säilitusperioodile. Ei mõjuta operaatori käivitatavat marsruuti `DELETE /api/v1/batches/delete-completed`, mis jääb ettekavatsetult tingimusteta toimivaks (vanusefiltrita). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Kui väärtuseks on `true`, lubatakse automaatsel puhastusel kustutada lõppenud Batch API tööd (ja nende kontrollpunktid), mille vanus ületab `OMNIROUTE_BATCH_RETENTION_DAYS`, ning tühjendada üleslaaditud failide BLOB-sisu pärast nende enda `expires_at` tähtaja möödumist. Vaikimisi välja lülitatud: iga olemasolev paigaldus säilitab need andmed täpselt nagu varem, kuni operaator selle funktsiooni sisse lülitab. See on ka töölaualt muudetav funktsioonilipp — vt `docs/reference/FEATURE_FLAGS.md` → Käitusaeg. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Määrake väärtuseks `1`, et jätta andmebaasi seisundikontroll käivitamisel täielikult vahele. Kasulik lühiajaliste ülesannete ja integratsioonitestide jaoks. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Määrake väärtuseks `1`, et sundida andmebaasi seisundikontrolli tsükkel tööle isegi siis, kui see tavaliselt vahele jäetaks (nt lühiajaliste ülesannete puhul). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Määrake väärtuseks `1`, et jätta `npm install` ajal vahele omaplatvormse käituskeskkonna soojendus. Kasulik CI/peata paigalduste puhul, kus sqlite on juba kompileeritud. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(automaatne tuvastamine)_ | `src/lib/db/migrationRunner.ts` | Alistage kataloog, mida migratsioonikäitaja läbi vaatab. Kasulik, kui kohandatud järkudes tarnitakse komplekteeritud migratsioone. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(määramata)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Täiendavad migratsioonikataloogid `namespace=dir` kirjetena, mis on eraldatud platvormi teeeraldajaga (nt `ee=/opt/app/enterprise/db/migrations`). Sealt leitud failid registreeritakse kujul `-`, mistõttu oma migratsioone tarniva distributsiooni kirjed ei lähe kunagi vastuollu ülesvoolu numbriliste pesadega. Vigane kirje, kehtetu nimeruum või puuduv kataloog põhjustab käivitamisel vea, selle asemel et skeem vaikselt vahele jätta. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Ootel migratsioonide suure hulga turvalävi (#3416). Käivitamine katkestatakse, kui olemasolevas andmebaasis ootab rohkem migratsioone, kui see väärtus lubab (kaitseb tühjendatud jälgimistabeli eest). Vanema varukoopia taastamiseks suurendage seda; kontrolli keelamiseks määrake väärtuseks `0`. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Väljalaskevärava `check:install-upgrade` töökataloog. See vajab ligikaudu 12 GB (kaks ~3 GB paigalduspuud ja tarball), mistõttu ei tohi seda käitada väikesel tmpfs-il — isehostitud käitajal on `/tmp` 12 GB RAM-i põhine tmpfs ning väljalaskevärav ammendas selle, kärpides paketti. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(vaikeväärtus koodis)_ | `src/lib/spend/batchWriter.ts` | Puhverdusintervall (ms) pakettidena kirjutava kulu-/maksumuskirjuti jaoks. Väiksemad väärtused vähendavad kirjutamiste koondamist; suuremad väärtused vähendavad andmebaasi konkurentsi. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(vaikeväärtus koodis)_ | `src/lib/spend/batchWriter.ts` | Puhverdatud kulukirjete maksimaalne arv enne sundtühjendust. Suurendage suure QPS-iga juurutustes; vähendage, kui piiratud mälukasutus on olulisem. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(määramata)_ | `open-sse/utils/proxyFetch.ts` | Määrake väärtuseks `"true"`, et väljastada Verceli releeteel `[ProxyFetch]` silumislogid. Vaikimisi välja lülitatud, et vältida marsruutimisvihjete lekkimist. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Määrake väärtuseks `"true"` või `"1"`, et lisada kliendi/väljuva ühenduse IP-d ja konto prefiks üksikasjalikule `[ProxyEgress]` protsessilogi reale. Vaikimisi on see VÄLJAS, et protsessilogi ei lekitaks IP-sid ega konto prefiksit. | -| `OMNIROUTE_DEBUG` | _(määramata)_ | `bin/cli/commands/quota.mjs` | Määrake väärtuseks `1`, et väljastada CLI kvoodikäskudest stderr-i päringupõhised ajastusdiagnostikad (`[omniroute] GET completed in Nms`). | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automaatne)_ | `scripts/dev/healthcheck.mjs` | Konteineri seisundikontrolli sondeeritav sõnaselge tee. Kui see pole määratud, tuletab sond selle muutujast `OMNIROUTE_BASE_PATH`; selle määramine võtab uuesti kasutusele põhjaliku monitooringu lõpp-punkti. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(määramata)_ | `bin/cli/commands/completion.mjs` | Määrake mis tahes mittetühi väärtus, et väljastada `[omniroute completion]` diagnostika CLI kestatäienduse vahemälu teedelt (lugemine/värskendamine/kirjutamine). Vaikimisi välja lülitatud — nende vahemälude tõrked jäävad märkamatuks, et puuduv/rikutud vahemälu ei rikuks kunagi tabeldusklahviga täiendamist. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Üksikute pakettüksuste maksimaalne uuesti proovimise ajavahemik (ms). Selle kestuse ületanud üksused märgitakse nurjunuks. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Pakettüksuste uuesti proovimisel kasutatava eksponentsiaalse ooteaja baaskestus (ms). | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Pakettüksuste uuesti proovimise vahelise eksponentsiaalse ooteaja ülempiir (ms). | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Samaaegselt töödeldavate pakettide maksimaalne arv. Läbilaskevõime suurendamiseks tõstke väärtust; päringusageduse piirangu massilise ületamise vältimiseks hoidke see madal. | +## 2. Salvestus ja andmebaas + +OmniRoute kasutab kogu püsiva salvestuse jaoks **SQLite'i** (`better-sqlite3` kaudu). Need muutujad juhivad andmete asukohta, krüptimist ja elutsüklit. + +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite'i andmebaasi, varukoopiate ja andmefailide juurkataloog. Määrake teine väärtus Dockeri köidete või kohandatud teede jaoks. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(määramata)_ | `src/lib/dataPaths.ts` | Testide/hindamiste DATA_DIR-i kaitsemeetmest möödapääs (#10428). Testid ja Node'i eval/print-päringud (`-e`/`--eval`/`-p`/`--print`, sealhulgas vormid `--eval=`/`--print=`), millel puudub `DATA_DIR`, suunatakse ajutisse ühekordselt kasutatavasse kataloogi, et need ei saaks avada operaatori tegelikku andmebaasi; tegeliku kataloogi kasutamise lubamiseks määrake väärtuseks `1`. | +| `OMNIROUTE_BUILD_SHA` | _(määramata)_ | `src/lib/monitoring/buildSha.ts` | Töötava artefakti Git SHA. Lisatakse käsuga `npm run build:release`; selle saab sisestada konteineritesse, mis tarnitakse ilma kontrollfailita `dist/BUILD_SHA`. Avaldatakse väljana `system.buildSha` lõpp-punktis `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Viide, mille suhtes pakitava artefakti päritolukontroll ehituse SHA-d kontrollib (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(määramata)_ | `scripts/build/buildProvenance.ts` | Määrake väärtuseks `1`, et lubada sellise ehituse pakkimist, mille SHA ei asu väljalaskeharus, salvestades selle kontrolli nurjumise asemel tahtliku canary-ehitusena (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(määramata)_ | `scripts/ops/deploy-canary.mjs` | Canary-juurutuse suitsutesti API-võti, mis saadetakse päisena `Authorization: Bearer` lõpp-punkti `/v1/chat/completions`. Seda kasutab ainult juurutusskript (#10429), server ei kasuta seda kunagi. See ei ole seotud vabatahtlikult lubatava CLI suitsutestiraamistiku muutujatega `OMNIROUTE_SMOKE_*` (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` failis `tests/integration/upstream-cli-smoke.int.test.ts`) — vt [CLI-integratsioonid → Tegelik suitsutest](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(määramata)_ | `src/lib/buildPhase.ts` | Ehitusfaasi signaal (#10060): `scripts/build/build-next-isolated.mjs` määrab selle väärtuseks `1` ja iga käivitatud ehitustöötaja pärib selle, et andmebaasikiht tagastaks toiminguid mittetegeva asenduse, selle asemel et laadida natiivne `better-sqlite3` lisandmoodul (mis katkestab töötaja väljumisel). Töötava serveri korral ei määrata seda kunagi. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Määrake väärtuseks `1`, et jätta ebaharilike komplekteeritud failipuude puhul valikuline natiivsõltuvuste ehituseelne kontroll vahele. See ei muuda puuduva sõltuvusega ehitamist võimalikuks; kasutage seda ainult siis, kui natiivsõltuvused pakutakse süsteemiväliselt. | +| `OMNIROUTE_DATA_DIR` | _(määramata)_ | `open-sse/executors/promptql/threadSticky.ts` | **Varualias** muutujale `DATA_DIR`, mida kontrollitakse ainult siis, kui `DATA_DIR` on määramata. Seda kasutatakse PromptQL-i täituri kettal asuva lõimepõhise püsiseansi vahemälu (`/promptql-thread-sessions.json`) leidmiseks; kui kumbagi muutujat pole määratud, jääb vahemälu ainult mällu (seda ei säilitata taaskäivituste vahel). | +| `OMNIROUTE_PLUGINS_DIR` | _(määramata)_ | `src/lib/plugins/scanner.ts` | Kataloog, mida **käitusaegne pistikprogrammide skanner** loeb ja kuhu pistikprogrammihaldur installib, alistades kodukataloogist tuletatud vaikeväärtuse (#11827). Suunake see Dockeris/K8s-is seostatud pistikprogrammipuule, selle asemel et muuta muutujat HOME üksnes skannimistee ümberpaigutamiseks (HOME juhib ka kõiki muid kodukataloogi suhtes määratud käitumisi). Määramata väärtus = `~/.omniroute/plugins` või `/tmp/.omniroute/plugins`, kui protsess ei ekspordi üldse kodukataloogi — see muutuja kõrvaldab vaikse avastamata jäämise. Lahendatud kataloog logitakse käivitamisel üks kord sündmusena `scanner.dir_resolved` koos valitud sisendiga. Ainult serveripoolne: CLI käsupistikprogrammid kasutavad jätkuvalt oma muutujat `OMNIROUTE_PLUGIN_PATH` (jaotis 9). | +| `STORAGE_ENCRYPTION_KEY` | _(tühi = keelatud)_ | `src/lib/db/encryption.ts` | AES-võti kogu SQLite'i andmebaasi jõudeolekus krüptimiseks. Genereerige käsuga `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Krüptovõtme versioonitähis. Suurendage seda võtme roteerimisel, et toetada vanade varukoopiate dekrüptimist. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Kui väärtus on `true`, jäetakse vahele tavapärased/kirjutamiseelsed SQLite'i failivarundused (models.dev hinnastuse salvestamine/kustutamine, seadete kirjutamine). Käsitsi käivitatud ja taastamiseelsed varundused toimivad endiselt. See **ei** keela migratsioonikäitaja kohustuslikku püsivat turvatõmmist ega olemasoleva püsiva andmebaasi massmigratsiooni kaitset. Mitte-käsitsi käivitatud varundusi tehakse kõige rohkem kord 60 minuti jooksul. Juhtpaneeli jaotises **Seaded → Salvestusruum** saab tavapärase automaatse varundamise eraldi keelata. | +| `OMNIROUTE_CRYPT_KEY` | _(määramata)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` **pärandalias**. Aktsepteeritakse varuvariandina, kui põhimuutuja puudub. | +| `OMNIROUTE_API_KEY_BASE64` | _(määramata)_ | `src/lib/db/encryption.ts` | **Pärandalias** (Base64-kodeeritud kujul), mida aktsepteeritakse varuvariandina. Enne kasutamist dekodeeritakse automaatselt. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(määramata)_ | `src/lib/db/core.ts` | Alistab perioodilise SQLite'i tervisekontrolli intervalli (ms). Kui väärtus on määramata, tuletatakse vaikeväärtused muutujast `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(eemaldatud)_ | `src/lib/db/walMaintenance.ts` | **Eemaldatud.** Perioodiline töötava süsteemi `wal_checkpoint(TRUNCATE)` võib muuta jagatud wal-indeksi vastenduse kehtetuks ja põhjustada protsessi krahhi signaaliga SIGBUS (#13973), mistõttu plaanurit enam ei eksisteeri. Muutuja on passiivne: positiivse väärtuse korral logitakse ühekordne aegumishoiatus, väärtuse `0` korral või määramata jätmisel teadet ei kuvata. WAL-i hooldatakse PASSIVE-kontrollpunktidega (allpool) ja kärbitakse sulgemise kontrollpunktiga. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Alistab sagedase `wal_checkpoint(PASSIVE)` intervalli (ms). Hoiab ootel WAL-kaadrite arvu väiksena, et kontrollpunktid oleksid kiired ja WAL-faili maht püsiks sulgemisel tehtavate kärbete vahel piiratud. `0` keelab selle. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Kui PASSIVE-käivituse ajal leitakse, et WAL-fail ületab selle mahu, käivitatakse `wal_checkpoint(RESTART)`, et WAL alustaks uuesti ilma vastendatud wal-indeksit ümber kirjutamata. Töötava süsteemi kärpimisrežiimi kontrollpunktid eemaldati (vt rida `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Määrake väärtuseks `1`/`true`/`yes`/`on`, et protsess väljuks pärast kriitilise ressursisurve püsimist `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` jooksul, võimaldades järelevalveprotsessil (systemd `Restart=always`, Dockeri taaskäivitamispoliitika) käivitada puhta protsessi, selle asemel et lõputult 503-vastuseid väljastada. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Aeg, mille jooksul peab kriitiline surve püsima, enne kui käivitub isetaaskäivitust põhjustav väljumine. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(automaatne tuvastamine)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Selgesõnaline tee (absoluutne või cwd suhtes suhteline) failini `sql-wasm.wasm`, kui kasutatakse `sql.js` WASM-i varuadapterit. Kui väärtus on määramata, tuvastatakse see automaatselt paketisõltuvuste ja võimalike paigutuste põhjal. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Päevade arv, mille jooksul säilitatakse automaatse puhastuse käigus enne kustutamist lõplikus olekus (lõpetatud/nurjunud/tühistatud/aegunud) Batch API töö kontrollpunktid, viidatud sisend-/väljund-/veafailid ja rida. Rakendub alles pärast muutuja `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` sisselülitamist; vastab OpenAI enda Batch API väljundi säilitusperioodile. Ei mõjuta operaatori käivitatavat marsruuti `DELETE /api/v1/batches/delete-completed`, mis jääb kavandatult tingimusteta toimivaks (vanusefiltrita). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Kui väärtus on `true`, lubatakse automaatsel puhastusel kustutada lõplikus olekus Batch API tööd (ja nende kontrollpunktid), mis on vanemad kui `OMNIROUTE_BATCH_RETENTION_DAYS`, ning tühjendada üleslaaditud failide BLOB-sisu pärast nende enda `expires_at` tähtaja möödumist. Vaikimisi välja lülitatud: iga olemasolev install säilitab neid andmeid täpselt nagu varem, kuni operaator funktsiooni lubab. Ühtlasi juhtpaneelil muudetav funktsioonilipp — vt `docs/reference/FEATURE_FLAGS.md` → Käitusaeg. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Määra väärtuseks `1`, et DB seisundikontroll käivitamisel täielikult vahele jätta. Kasulik lühiajaliste ülesannete ja integratsioonitestide jaoks. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Määra väärtuseks `1`, et sundida DB seisundikontrolli tsükkel sisse lülituma ka siis, kui see tavaliselt vahele jäetaks (nt lühiajaliste ülesannete puhul). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Määra väärtuseks `1`, et jätta `npm install` ajal platvormipõhise käituskeskkonna soojendus vahele. Kasulik CI/peata installide puhul, kus sqlite on juba kompileeritud. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(automaatne tuvastamine)_ | `src/lib/db/migrationRunner.ts` | Alista kataloog, mida migratsioonikäitaja skannib. Kasulik komplekteeritud migratsioonide tarnimisel kohandatud järkudes. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(määramata)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Täiendavad migratsioonikataloogid platvormi teeeraldajaga eraldatud `namespace=dir` kirjetena (nt `ee=/opt/app/enterprise/db/migrations`). Sealt leitud failid salvestatakse kujul `-`, mistõttu oma migratsioone tarniv distributsioon ei lähe kunagi vastuollu ülesvoolu numbriliste pesadega. Vigane kirje, sobimatu nimeruum või puuduv kataloog põhjustab käivitamisel vea, selle asemel et skeem vaikselt vahele jätta. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Hulga ootel migratsioonide ohutuslävi (#3416). Käivitamine katkestatakse, kui olemasolevas DB-s on ootel rohkem migratsioone kui see arv (kaitseb tühjendatud jälgimistabeli eest). Vanema varukoopia taastamiseks suurenda väärtust; kontrolli keelamiseks määra väärtuseks `0`. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Väljalaskekontrolli `check:install-upgrade` töökataloog. See vajab ligikaudu 12 GB (kaks ~3 GB installipuud ja tarball), mistõttu ei tohi seda käitada väikesel tmpfs-il — isehostitud käitajal on `/tmp` 12 GB RAM-i-põhine tmpfs ning kontroll ammendas selle, kärpides paketti. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(vaikeväärtus koodis)_ | `src/lib/spend/batchWriter.ts` | Pakktöötlusega kulu-/maksumusekirjutaja puhverdamisintervall (ms). Väiksemad väärtused vähendavad kirjutamiste koondamist; suuremad väärtused vähendavad DB konkurentsi. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(vaikeväärtus koodis)_ | `src/lib/spend/batchWriter.ts` | Puhverdatud kulukirjete maksimumarv enne sunnitud puhvri tühjendamist. Suurenda suure QPS-iga juurutustes; vähenda, kui piiratud mälukasutus on olulisem. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(määramata)_ | `open-sse/utils/proxyFetch.ts` | Määra väärtuseks `"true"`, et väljastada Verceli releeteel `[ProxyFetch]` silumislogid. Vaikimisi välja lülitatud, et vältida marsruutimisvihjete lekkimist. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Määra väärtuseks `"true"` või `"1"`, et lisada kliendi/väljuva ühenduse IP-d ja konto prefiks üksikasjalikule `[ProxyEgress]` protsessilogi reale. Vaikimisi on see VÄLJAS, et protsessilogi ei lekitaks IP-sid ega konto prefiksit. | +| `OMNIROUTE_DEBUG` | _(määramata)_ | `bin/cli/commands/quota.mjs` | Määra väärtuseks `1`, et printida CLI kvoodikäskudest stderr-i päringupõhine ajastamisdiagnostika (`[omniroute] GET completed in Nms`). | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automaatne)_ | `scripts/dev/healthcheck.mjs` | Konteineri seisundikontrolli kontrollitav eksplitsiitne tee. Kui väärtus on määramata, tuletab kontroll selle muutujast `OMNIROUTE_BASE_PATH`; väärtuse määramine lülitab sügava seire lõpp-punkti uuesti sisse. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(määramata)_ | `bin/cli/commands/completion.mjs` | Määra suvaline mittetühi väärtus, et väljastada `[omniroute completion]` diagnostika CLI kesta automaattäitmise vahemälu teedelt (lugemine/värskendamine/kirjutamine). Vaikimisi välja lülitatud — need vahemälud ebaõnnestuvad vaikselt, et puuduv/rikutud vahemälu ei katkestaks kunagi tabeldusklahviga automaattäitmist. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Üksikute pakkelementide maksimaalne korduskatsete aken (ms). Seda kestust ületavad elemendid märgitakse nurjunuks. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Baasviivitus (ms) eksponentsiaalseks ooteaja pikendamiseks paketielementide korduskatsetel. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Eksponentsiaalse ooteaja ülempiir (ms) paketielementide korduskatsete vahel. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Samaaegselt töödeldavate pakettide maksimaalne arv. Jõudluse suurendamiseks tõstke seda väärtust; päringulimiitide massilise ületamise vältimiseks hoidke see madal. | > [!IMPORTANT] -> Enne olemasoleva püsiva andmebaasi muutmist avaldab migreerimiskäivitaja täieliku -> sisupõhise adresseerimisega hetktõmmise kataloogis `DATA_DIR/db_backups/`. Avaldamiseks on vaja failisüsteemi, -> mis toetab sama failisüsteemi piires ülekirjutamiseta püsilinke ja failide töökindlat sünkroonimist. POSIX-hostid nõuavad ka -> kataloogide sünkroonimist; Windowsis võib Node kataloogipidemetest keelduda, mistõttu OmniRoute kirjutab -> avaldatud faili püsivalt andmekandjale ja käsitleb kataloogikirjete sünkroonimist parima võimaliku jõupingutusena. -> Kui ühendatud `DATA_DIR` ei suuda neid garantiisid pakkuda, katkestatakse käivitus enne -> migratsiooni rakendamist turvaliselt. Teisaldage `DATA_DIR` andmekandjale, mis neid primitiive toetab; ärge kasutage -> migratsiooni turvameetmetest möödahiilimiseks muutujat `DISABLE_SQLITE_AUTO_BACKUP`. +> Enne olemasoleva püsiva andmebaasi muutmist avaldab migratsioonikäitaja täieliku +> sisupõhiselt adresseeritud hetktõmmise kataloogis `DATA_DIR/db_backups/`. Avaldamiseks on vaja failisüsteemi, +> mis toetab sama failisüsteemi piires ülekirjutamiseta püsilinke ja failide püsivat sünkroonimist. POSIX-hostid nõuavad ka +> kataloogide sünkroonimist; Windowsis võib Node kataloogipidemetest keelduda, mistõttu OmniRoute sünkroonib +> avaldatud faili ning käsitleb kataloogikirje sünkroonimist parima võimaliku pingutusena. +> Kui ühendatud `DATA_DIR` ei suuda neid garantiisid pakkuda, katkestatakse käivitamine turvaliselt enne +> migratsiooni rakendamist. Teisaldage `DATA_DIR` kettale, mis neid primitiive toetab; ärge kasutage +> migratsiooni turvalisusest möödahiilimiseks muutujat `DISABLE_SQLITE_AUTO_BACKUP`. ### Stsenaariumid -| Stsenaarium | Konfiguratsioon | -| ---------------------------- | ----------------------------------------------------------------------------------------------------- | -| **Kohalik arendus** | Jätke kõik vaikeväärtused. Andmebaas asub failis `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + ühendage köide asukohta `/data`. | -| **Krüpteeritud jõudeolekus** | Määrake `STORAGE_ENCRYPTION_KEY` + säilitage võtme varukoopiaid! Selle kaotamine = andmete kaotamine. | -| **CI/Testimine** | `DATA_DIR=/tmp/omniroute-test` — ajutine, krüpteerimist pole vaja. | +| Stsenaarium | Konfiguratsioon | +| ------------------------- | ----------------------------------------------------------------------------------------------------- | +| **Kohalik arendus** | Jätke kõik vaikeväärtused. Andmebaas asub failis `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + ühendage ketas asukohta `/data`. | +| **Krüpteeritud talletus** | Määrake `STORAGE_ENCRYPTION_KEY` + säilitage võtme varukoopiaid! Võtme kaotamine = andmete kaotamine. | +| **CI/testimine** | `DATA_DIR=/tmp/omniroute-test` — ajutine, krüptimist pole vaja. | --- @@ -213,37 +212,38 @@ OmniRoute kasutab kogu püsiva talletuse jaoks **SQLite’i** (`better-sqlite3` ## 4. Turvalisus ja autentimine -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Masina sõrmejälje loomiseks riistvaraidentifikaatoritega kombineeritav sool. Isolatsiooni tagamiseks muutke seda iga juurutuse puhul. | -| `OMNIROUTE_CLI_SALT` | _(määramata = juhuslik paigalduspõhine sool, mis säilitatakse asukohas `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-sool kohaliku CLI autentimistõendi tuletamiseks. Selle väärtuse määramine vahetab välja kõik masina CLI tõendid ja on alati säilitatud soola suhtes prioriteetne. Vt `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Määrab seansiküpsistele lipu `Secure`. HTTPS-i taga töötamisel **peab väärtus olema `true`**. | -| `REQUIRE_API_KEY` | `false` | API vahevara | Kui väärtus on `true`, peavad kõik `/v1/*` puhverserveri päringud sisaldama kehtivat API-võtit. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Lubab töölaua kasutajaliideses kuvada API-võtmete täielikke väärtusi. Seadistatav töölaua funktsioonilippude kaudu; jagatud eksemplarides kujutab see endast turvariski. | -| `NO_LOG_API_KEY_IDS` | _(tühi)_ | `src/lib/compliance/index.ts` | Komadega eraldatud API-võtmete ID-d, mille puhul päringute logimine vahele jäetakse (GDPR-i nõuetele vastavus). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(määramata = piiramatu)_ | `src/shared/utils/apiKeyPolicy.ts` | Päevapõhine päringute varulimiit, mida rakendatakse API-võtmetele, mille veeru `rate_limits` väärtus on null. Määramata või tühi: kaudne piirang puudub (#2289, #11017). `0` tähendab sama (piiramatu). Positiivne täisarv N lubab N päringut päevas, 5N nädalas ja 20N kuus. Vigased mittetühjad väärtused kasutavad varasemast süsteemist pärit limiite 1000 päevas, 5000 nädalas ja 20000 kuus. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Päringu keha maksimaalne lubatud suurus. Seda piirangut ületavad lastid lükatakse tagasi. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Selle lävendiga võrdse või sellest suurema tegeliku päringukehaga päringud võtavad enne JSON-i parsimist aatomaarse protsessipõhise raskekaalulise vastuvõtuloa (BYTE-rada, sealhulgas `POST /v1/responses`). Struktuurimahukate päringutega sama [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) terve puhverruumi erand; endiselt piiratud väärtusega `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), et [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ei korduks. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Vestlusmarsruudi range ülempiir, mida rakendatakse piiratud vastuvõtu käigus loetud baitidele, sealhulgas puuduva, vigase või ebaausa `Content-Length` väärtusega päringutele; ülempiiri ületamisel tagastatakse `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(määramata — päringute arvu piirang puudub)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** see pärandpiirang päringute ARVULE rakendub nüüd ainult siis, kui see on sõnaselgelt määratud. Kui see on määramata (vaikeseade), juhib suure ressursikuluga vestluspäringute vastuvõttu selle asemel `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaatselt tuletatud BAITIDE eelarve, mille suurus põhineb protsessi tegelikul mälupiiril **ühes protsessis** (üks V8 kuhi). Kaks kattuvat ~750k-sõnest koosnevat `/v1/responses` päringut katkestavad ~12 GiB kuhjad (#7849) — see on **mälueelarve** hoiatus, mitte toote jäik maksimum 2. Terve protsess (kuhi on hülgamissuhte piirist allpool) VÕIB lubada rohkem samaaegseid pikki `/v1/responses` päringuid parameetri `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` kaudu. Kümned pikad SSE-kliendid (40–50) sõltuvad kuhjast + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, mitte „maksimaalselt 2“. Selle pimesi suurendamine „hosti ärakasutamiseks“ toob #7849 uuesti esile. Korrutage **kuhjasid** **N sõltumatu `DATA_DIR`-iga** (#11024); ärge kunagi kasutage `replicas>1` ühe SQLite'i faili puhul. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automaatselt tuletatud)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** automaatselt tuletatud sisendi baidieelarve alistus (25% rangemast V8/cgroupi mälupiirist, jagatuna 8-kordse ajutise võimendusega). Tuletatud ja sõnaselged väärtused piiratakse vahemikku 8 MiB–2 GiB. Efektiivsest eelarvest suurem keha nurjub kohe veaga `413 body_exceeds_budget`; eraldi käsitletavate kehade vaheline konkurents jääb uuesti proovitavaks veaks `503`. 40–50 samaaegset pikka SSE-klienti sõltuvad sellest eelarvest + kuhjast, mitte jäigast piirangust „maksimaalselt 2“. Enne häälestamist vaadake `/api/monitoring/health` kaudu väärtusi `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity`. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Kuhusurve hülgamissuhe (`heapUsed / heap_size_limit`) suure ressursikuluga BYTE- ja STRUCTURE-vastuvõtu jaoks (#10183, #10268, #10437). Piiri `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ületav samaaegne suure ressursikuluga päring hüljatakse uuesti proovitava veaga `503` ainult siis, kui kuhi on SAMUTI selle suhte tasemel või sellest kõrgemal; terve kuhja korral võetakse see vastu terve kuhja lisavaru kaudu. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (vaikimisi `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Piiratud lisamaht terve kuhja kiirtee jaoks (#10437) **nii** STRUCTURE- kui ka BYTE-vastuvõtul (`admitChatRequest`, sealhulgas kehad ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ilma selle piiranguta möödus iga hõivatud, kuid terve kuhja päring vastuvõtukontrollist ilma ülempiirita. Kui selle arvu jagu samaaegseid rendilube on terve kuhja tee kaudu aktiivsed, suunatakse edasised hõivatud päringud edasi SAMASSE piiratud ootamise/hülgamise teesse, mida kasutatakse tegeliku kuhjusurve korral. `0` keelab möödaviigu täielikult. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Sõnumite arv, mille korral liigitatakse vestluspäring suure ressursikuluga päringuks isegi siis, kui selle keha jääb alla baidiläve. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Tööriistade arv, mille korral liigitatakse vestluspäring suure ressursikuluga päringuks isegi siis, kui selle keha jääb alla baidiläve. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservatiivne sõne suurusel põhinev sõnede hinnang, mille korral liigitatakse päring suure ressursikuluga päringuks; see on vastuvõtukulu ligikaudne näitaja, mitte teenusepakkuja arvelduse sõnestamine. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (keelatud) | `src/shared/middleware/chatBodyAdmission.ts` | Valikuline vestlusajaloo piirang. Vaikimisi keelatud: sõnumite arv on juurutuspoliitika, mitte päringu universaalne omadus, ning siin piiramine lükkab vestlused lõpliku veaga `413` tagasi enne, kui tihenduskonveier saab need teenindatavaks muuta. Kuhja kasvu piiravad `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ja kuhjusurvepõhine hülgamine. Määrake positiivne väärtus piiratud mäluga juurutustes, mis vajavad jäika ülempiiri; piirangut ületavad päringud saavad seejärel struktureeritud tihendamist nõudva vea `413`. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Jäik piirang mittevoogedastatavale ülesvoolu vastusele, mis puhverdatakse täielikult mällu. Selle ületamisel tühistatakse ülesvoolu lugeja ja päring nurjub kiiresti, selle asemel et kasvatada piiramatult sõnet kuni kuhja ammendumiseni. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Ülesvoolu vastusepäistest edastatavate baitide maksimaalne arv võrgutasandil. Eelarve ületamisel jäetakse madalama prioriteediga päised (nt kohandatud `x-codex-*`, `x-oai-request-id`) välja, et jääda levinud pöördpuhverserverite päisepiirangute piiresse. Määrake suurem väärtus, et edastada rohkem ülesvoolu metaandmeid suuremate vastusepäiste hinnaga. | -| `CORS_ORIGIN` | _(määramata)_ | `src/server/cors/origins.ts` | Pärandrakenduste ühe päritoluga CORS-i lubatud loend. Uute juurutuste puhul eelista muutujat `CORS_ALLOWED_ORIGINS`. CORS on mõeldud ainult eri päritoluga brauseri API-klientidele; autenditud juhtpaneeli kirjutuspäringud kasutavad selle asemel sama päritoluga päringuid koos seansiga seotud CSRF-kaitsega. | -| `CORS_ALLOWED_ORIGINS` | _(määramata)_ | `src/server/cors/origins.ts` | Komadega eraldatud CORS-i lubatud loend. Metamärki ei saadeta, välja arvatud juhul, kui `CORS_ALLOW_ALL=true` on sõnaselgelt seadistatud. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Ainult arenduseks mõeldud erand, mis peegeldab mis tahes brauseri `Origin`-väärtuse. Ära luba seda jagatud ega tootmisjuurutustes. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Blokeeri teenusepakkuja kutsed, mis sihivad privaatseid, tagasisideaadresside või kohaliku lingi IP-vahemikke. Keela ainult isoleeritud testkeskkondades. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Luba privaatsetele/kohalikele võrkudele (localhost, 192.168.x.x, 10.x.x.x jne) osutavad teenusepakkujate URL-id. **NÕUTAV isehostitud teenusepakkujate puhul** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Kui väärtus on `false`, lükkab juhtpaneel kohalike URL-ide valideerimise tagasi. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Luba lisada/valideerida kohalikel/privaatsetel aadressidel (127.0.0.1, localhost, LAN, privaatsed vahemikud) asuvaid teenusepakkujaid — kehtib ainult teenusepakkuja valideerimisteele. **Vaikeväärtus on `true`** (kohalik eelisjärjekorras); määra väärtuseks `false`, et jõustada range, ainult avalikke aadresse lubav blokeerimine. Pilvemetaandmete otspunktid (169.254.169.254, metadata.google.internal) jäävad sellest olenemata blokeerituks. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Luba marsruutidel `/v1/audio/*` (transkriptsioonid, kõne, tõlked) kasutada väljaspool localhosti majutatud OpenAI-ga ühilduvat teenusepakkuja sõlme. Vaikimisi välja lülitatud — heli marsruutimine kaughosti muudab väljamineva liikluse identiteeti ja peab olema operaatori sõnaselge otsus. Tagasisideaadressiga/privaatsed sõlmed (localhost, 127.0.0.1, 172.16-31.x) on alati lubatud ja see säte neid ei mõjuta. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kui OIDC on lubatud, keela parooliga sisselogimine, et kasutajad saaksid autentida ainult OIDC ühekordse sisselogimise kaudu. Aktsepteeritakse ka lühialiast `OIDC_DISABLE_PASSWORD_LOGIN`; sama võtmega juhtpaneeli funktsioonilipp on ülimuslik. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Muutuja `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` lühialias (#10889). | +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sool, mis kombineeritakse masina sõrmejälje loomiseks riistvaraidentifikaatoritega. Isolatsiooni tagamiseks muutke seda iga juurutuse puhul. | +| `OMNIROUTE_CLI_SALT` | _(määramata = juhuslik paigalduspõhine sool, mis talletatakse asukohas `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-sool kohaliku CLI autentimistõendi tuletamiseks. Selle väärtuse määramine uuendab kõiki masina CLI tõendeid ja on alati talletatud soola suhtes prioriteetne. Vaadake `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Määrab seansiküpsistele lipu `Secure`. HTTPS-i taga töötamisel **peab olema `true`**. | +| `REQUIRE_API_KEY` | `false` | API vahevara | Kui väärtus on `true`, peavad kõik `/v1/*` puhverserveri päringud sisaldama kehtivat API-võtit. **See lipp ei piira päringut `GET /v1/models`**, mis järgib selle asemel juhtpaneeli sisselogimise seadistust (`requireAuthForModels`) — seega `/v1/models` vastus `401` EI tähenda, et järelduspäringud on kaitstud. Vaadake `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Võimaldab juhtpaneeli kasutajaliideses kuvada API-võtmete täisväärtusi. Seadistatav juhtpaneeli funktsioonilippude kaudu; jagatud eksemplarides kujutab see endast turvariski. | +| `NO_LOG_API_KEY_IDS` | _(tühi)_ | `src/lib/compliance/index.ts` | Komadega eraldatud API-võtmete ID-d, mille puhul päringute logimine vahele jäetakse (GDPR-i nõuetele vastavuse tagamiseks). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(määramata = piiramatu)_ | `src/shared/utils/apiKeyPolicy.ts` | Päevase päringumahu varuväärtus, mida rakendatakse API-võtmetele, mille veeru `rate_limits` väärtus on null. Määramata või tühi: kaudset piirangut pole (#2289, #11017). `0` tähendab sama (piiramatu). Positiivne täisarv N lubab N päringut päevas, 5N nädalas ja 20N kuus. Vigased mittetühjad väärtused kasutavad varasemaid piiranguid: 1000 päevas, 5000 nädalas ja 20000 kuus. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Päringu keha suurim lubatud maht. Seda piirangut ületavad andmekogumid lükatakse tagasi. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Selle läveni ulatuvad või seda ületavad tegelikud päringukehad võtavad enne JSON-i sõelumist atomaarse protsessisisese raskekaalulise vastuvõtuloa (BYTE-tee, sealhulgas `POST /v1/responses`). Kehtib sama [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) piisava vaba mahu erand nagu struktuurimahukate päringute puhul; maht on endiselt piiratud väärtusega `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), et probleem [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ei korduks. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Vestluse marsruudi jäik piirang, mida rakendatakse piiratud vastuvõtu käigus loetud baitidele, sealhulgas puuduva, vigase või ebaausa `Content-Length`-iga päringutele; piiri ületamisel tagastatakse `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(määramata — päringute arvu piirang puudub)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** see pärandina säilinud päringute ARVU piirang rakendub nüüd ainult siis, kui see on sõnaselgelt määratud. Kui see jäetakse määramata (vaikeseade), reguleerib suure ressursikuluga vestluspäringute vastuvõttu selle asemel `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaatselt tuletatud BAITIDE eelarve, mille suurus põhineb protsessi tegelikul mälupiirangul **ühes protsessis** (üks V8 kuhi). Kaks kattuvat ~750 000 tokeniga `/v1/responses`-päringut katkestavad ~12 GiB kuhjad (#7849) — see on **mälueelarve** hoiatus, mitte toote jäik maksimum 2. Heas seisundis protsess (kuhi on allpool koormuse vähendamise suhtarvu) VÕIB lubada rohkem samaaegseid pikki `/v1/responses`-päringuid väärtuse `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` kaudu. Kümned pikad SSE-kliendid (40–50) sõltuvad kuhjast + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, mitte „maksimaalselt 2“. Selle väärtuse pimesi suurendamine „hosti kasutamiseks“ toob probleemi #7849 tagasi. Suurendage **kuhjade** arvu **N sõltumatu `DATA_DIR`-iga** (#11024); ärge kunagi kasutage ühe SQLite'i faili puhul `replicas>1`. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(automaatselt tuletatud)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** automaatselt tuletatud vastuvõtu baidieelarve alistamine (25% rangemast V8/cgroupi mälupiirangust, jagatuna 8-kordse ajutise võimendusega). Tuletatud ja sõnaselged väärtused piiratakse vahemikku 8 MiB–2 GiB. Efektiivsest eelarvest suurem keha nurjub kohe veaga `413 body_exceeds_budget`; konkurents eraldi teenindatavate kehade vahel jääb uuesti proovitavaks veaks `503`. 40–50 samaaegset pikka SSE-klienti sõltuvad sellest eelarvest + kuhjast, mitte jäigast piirangust „maksimaalselt 2“. Enne häälestamist vaadake lõpp-punktis `/api/monitoring/health` väärtusi `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity`. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Kuhjasurve koormuse vähendamise suhtarv (`heapUsed / heap_size_limit`) suure ressursikuluga BAIDI- ja STRUKTUURI-põhise vastuvõtu jaoks (#10183, #10268, #10437). Samaaegne suure ressursikuluga päring, mis ületab `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` väärtuse, lükatakse uuesti proovitava veaga `503` tagasi ainult siis, kui kuhi on SAMUTI selle suhtarvuga võrdne või sellest suurem; heas seisundis kuhja korral võetakse päring vastu terve kuhja lisavaru kaudu. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (vaikimisi `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Piiratud lisamaht terve kuhja kiirtee jaoks (#10437) nii STRUKTUURI kui ka BAIDI puhul (`admitChatRequest`, sealhulgas kehad ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ilma selle piiranguta möödus iga hõivatud, kuid terve kuhja päring vastuvõtu reguleerimisest ilma ülempiirita. Kui terve kuhja tee kaudu on aktiivsed nii paljud samaaegsed rendid, suunatakse järgmised hõivatud päringud SAMASSE piiratud ootamise / koormuse vähendamise teesse, mida kasutatakse tegeliku kuhjasurve korral. `0` keelab möödaviigu täielikult. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Sõnumite arv, mille puhul liigitatakse vestluspäring suure ressursikuluga päringuks isegi siis, kui selle keha jääb alla baidiläve. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Tööriistade arv, mille puhul liigitatakse vestluspäring suure ressursikuluga päringuks isegi siis, kui selle keha jääb alla baidiläve. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservatiivne stringi suurusel põhinev tokenite hinnang, mille puhul liigitatakse päring suure ressursikuluga päringuks; see on vastuvõtukulu lähend, mitte teenusepakkuja arvelduse tokeniseerimine. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (keelatud) | `src/shared/middleware/chatBodyAdmission.ts` | Valikuline sõnaselgelt lubatav vestlusajaloo piirang. Vaikimisi keelatud: sõnumite arv on juurutuspoliitika, mitte päringu universaalne omadus, ning siin piiramine lükkab vestlused lõpliku veaga `413` tagasi enne, kui tihenduskonveier saab need teenindatavaks muuta. Kuhja kasvu piiravad `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ja kuhjasurvepõhine koormuse vähendamine. Määrake positiivne väärtus piiratud mäluga juurutustes, mis vajavad jäika ülempiiri; piiri ületamisel tagastatakse struktureeritud tihendamisnõudega `413`. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Jäik piirang mittevoogedastatavale ülesvoolu vastusele, mis puhverdatakse täielikult mällu. Selle ületamisel tühistatakse ülesvoolu lugeja ja päring nurjub kiiresti, selle asemel et kasvatada piiramatult stringi kuni kuhja ammendumiseni. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Maksimaalne baitide arv, mis edastatakse ülesvoolu vastuse päistest. Eelarve ületamisel jäetakse levinud pöördpuhverserverite päisepiirangutesse jäämiseks madalama prioriteediga päised (nt kohandatud `x-codex-*`, `x-oai-request-id`) välja. Suurema hulga ülesvoolu metaandmete edastamiseks määrake suurem väärtus, arvestades vastuse päiste suuremat mahtu. | +| `CORS_ORIGIN` | _(määramata)_ | `src/server/cors/origins.ts` | Pärandina kasutatav ühe lähtekoha CORS-i lubatud loend. Uute juurutuste puhul eelistage muutujat `CORS_ALLOWED_ORIGINS`. CORS on mõeldud ainult eri lähtekohtadest pärit brauseripõhistele API-klientidele; autenditud juhtpaneeli kirjutuspäringud kasutavad selle asemel sama lähtekoha päringuid koos seansiga seotud CSRF-kaitsega. | +| `CORS_ALLOWED_ORIGINS` | _(määramata)_ | `src/server/cors/origins.ts` | Komadega eraldatud CORS-i lubatud loend. Metamärki ei saadeta, välja arvatud juhul, kui `CORS_ALLOW_ALL=true` on selgesõnaliselt seadistatud. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Ainult arenduseks mõeldud pääsetee mis tahes brauseri `Origin`-päise väärtuse tagastamiseks. Ärge lubage seda jagatud ega tootmisjuurutustes. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Blokeerib teenusepakkuja kutsed, mis sihivad privaatseid, tagasisideahela või kohaliku lingi IP-vahemikke. Keelake ainult isoleeritud testkeskkondades. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Lubab privaatsetele/kohalikele võrkudele osutavaid teenusepakkuja URL-e (localhost, 192.168.x.x, 10.x.x.x jne). **NÕUTAV isemajutatud teenusepakkujate jaoks** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Kui väärtus on `false`, lükkab juhtpaneel kohalike URL-ide valideerimise tagasi. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Lubab lisada/valideerida kohalikel või privaatsetel aadressidel (127.0.0.1, localhost, LAN, privaatvahemikud) asuvaid teenusepakkujaid — piiratud teenusepakkuja valideerimisteega. **Vaikeväärtus on `true`** (kohalik eelisjärjekorras); ainult avalike aadresside range nõude jõustamiseks määrake `false`. Pilve metaandmete lõpp-punktid (169.254.169.254, metadata.google.internal) jäävad sellest olenemata blokeerituks. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Lubab marsruutidel `/v1/audio/*` (transkriptsioonid, kõne, tõlked) kasutada väljaspool localhosti majutatud OpenAI-ga ühilduvat teenusepakkuja sõlme. Vaikimisi välja lülitatud — heli marsruutimine kaughosti muudab väljamineva liikluse identiteeti ja peab olema operaatori selgesõnaline otsus. Tagasisideahela/privaatsed sõlmed (localhost, 127.0.0.1, 172.16-31.x) on alati lubatud ja see seadistus neid ei mõjuta. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Lubab käsul `POST /v1/rerank` (ja mälumootori tagasisideahela ümberjärjestamise etapil) kasutada väljaspool localhosti majutatud OpenAI-ga ühilduvat teenusepakkuja sõlme — LAN-is asuvat masinat või Tailscale'i partnermasinat, kus töötab TEI, Infinity, vLLM jne. Vaikimisi välja lülitatud — kaughosti marsruutimine muudab väljamineva liikluse identiteeti ja peab olema operaatori selgesõnaline otsus. Tagasisideahela sõlmed (localhost, 127.0.0.1, 172.16-31.x) on alati lubatud ja see seadistus neid ei mõjuta. Kaugsõlmed peavad läbima ka teenusepakkuja väljamineva URL-i poliitika kontrolli (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); pilve metaandmete hostidele ei marsruudita kunagi. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kui OIDC on lubatud, keelab parooliga sisselogimise, et kasutajad saaksid autentida ainult OIDC ühekordse sisselogimise kaudu. Aktsepteeritakse ka lihtsat aliast `OIDC_DISABLE_PASSWORD_LOGIN`; sama võtmega juhtpaneeli funktsioonilipp on ülimuslik. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Muutuja `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` lihtne alias (#10889). | ### Turvalisuse tugevdamise kontrollnimekiri @@ -251,9 +251,9 @@ OmniRoute kasutab kogu püsiva talletuse jaoks **SQLite’i** (`better-sqlite3` # Tootmiskeskkonna turvalisuse miinimumnõuded: AUTH_COOKIE_SECURE=true # Nõuab HTTPS-i REQUIRE_API_KEY=true # Autendi kõik puhverserveri kutsed -ALLOW_API_KEY_REVEAL=false # Ära kuva võtmeid kunagi kasutajaliideses +ALLOW_API_KEY_REVEAL=false # Ära kunagi kuva võtmeid kasutajaliideses CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # 5 MB piirang +MAX_BODY_SIZE_BYTES=5242880 # Piirang 5 MB ``` --- @@ -301,59 +301,66 @@ OmniRoute pakub kahetasandilist kaitset: päringupoolne injektsioonide tuvastami ## 6. Tööriista- ja marsruutimispoliitikad -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Juhib LLM-i juurdepääsu tööriistadele/funktsioonikutsetele. `allowlist` = ainult loetletud tööriistad, `denylist` = kõik peale loetletute, `disabled` = piirangud puuduvad. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Tee kasuliku koormuse muutmise reeglite JSON-failini (mudeli-/protokollipõhised ülesvoolu kohandused). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Kasuliku koormuse reeglite faili käigult uuesti laadimise intervall (ms). Minimaalselt `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Valikuline: marsruudib Claude Code'i klientide prefiksita `claude-*` mudeli-ID-d Claude Code'i OAuth-konto kaudu, selle asemel et nõuda teenusepakkuja prefiksit. Selgesõnalised teenusepakkuja prefiksid on endiselt ülimuslikud. Seadistatav ka juhtpaneeli lüliti kaudu Claude'i teenusepakkuja lehel. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Mudelipõhine paralleelsuspiir rotatsioonipõhiste kombinatsioonide jaoks (#9100). Rotatsioonipõhise kombinatsiooni semafor oli jäigalt piiratud kolme samaaegse päringuga mudeli kohta ilma muutmisvõimaluseta, mistõttu suurema paralleelsusega liiklus selle piiri taga järjestati. Kontrollitakse, et väärtus oleks `>= 1`, ja piiratakse väärtuseni `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Ohtlik valikuline säte, mis jätab otseste ühe mudeli päringute puhul vahele OmniRoute'i kohaliku kontekstiakna / maksimaalse sisendžetoonide arvu kontrolli. Ülesvoolu teenusepakkujad jõustavad endiselt oma tegelikud piirangud; viiba tihendamine ja mudeli enda väljundžetoonide piirang jäävad aktiivseks. Tegelik prioriteedijärjestus on funktsioonilippude andmebaasi alistus > keskkonnamuutuja > vaikeväärtus; taaskäivitamine pole vajalik. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(määramata)_ | `open-sse/services/conversationTracker.ts` | Vestlusajaloo kogumise peatamiseks määrake väärtuseks `1`. `resolveConversationId()` tagastab jälgimata tulemuse enne SQLite'i lugemist või sõnumiajaloo parsimist ning see hõlmab ka kliendi edastatud seansi-ID-sid. Marsruutimisseansi käsitlemine ei muutu ja olemasolevaid kirjeid ei kustutata. Mõeldud juurutustele, mis ei kasuta juhtpaneeli vestlusvaadet ja soovivad peatada voorude tabeli kasvu. | +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ----------------------------------------------------------- | ------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Juhib LLM-i juurdepääsu tööriistade/funktsioonide väljakutsetele. `allowlist` = ainult loetletud tööriistad, `denylist` = kõik peale loetletute, `disabled` = piirangud puuduvad. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Kasuliku koormuse muutmise reeglite JSON-faili tee (mudeli-/protokollipõhised ülesvoolu kohandused). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Kasuliku koormuse reeglite faili jooksvalt uuesti laadimise intervall (ms). Miinimum `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Valikuline: marsruudib Claude Code'i klientide prefiksita `claude-*` mudeli-ID-d Claude Code'i OAuth-konto kaudu, selle asemel et nõuda teenusepakkuja prefiksit. Selgesõnalised teenusepakkuja prefiksid on endiselt ülimuslikud. Seadistatav ka Claude'i teenusepakkuja lehel oleva juhtpaneeli lüliti kaudu. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Mudelipõhine samaaegsuspiir tsüklilise jaotusega kombinatsioonidele (#9100). Tsüklilise jaotusega kombinatsiooni semafor oli jäigalt piiratud kolme samaaegse päringuga mudeli kohta ilma muutmisvõimaluseta, mistõttu suurema samaaegsusega liiklus selle piirangu taga jadastati. Valideeritakse väärtusele `>= 1`, piiratakse väärtuseni `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Ohtlik valik, mis jätab otseste ühe mudeli päringute puhul OmniRoute'i kohaliku kontekstiakna / sisendtõkendite maksimumpiiri kontrolli vahele. Ülesvoolu teenusepakkujad jõustavad endiselt oma tegelikud piirangud; viiba tihendamine ja mudeli enda väljundtõkendite piirang jäävad aktiivseks. Kehtiv prioriteedijärjekord on funktsioonilippude andmebaasi alistus > keskkonnamuutuja > vaikeväärtus; taaskäivitamine pole vajalik. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(määramata)_ | `open-sse/services/selfHostedEntry.ts` | Tekstisisene YAML-i `providers:` dokument (RIC-738, D4). Kui see on määratud (`strategy:` plokiga või ilma), suunatakse `/v1/chat/completions` pilvetoru asemel isemajutatud ühtsesse OpenAI-ga ühilduvasse sisendpunkti. Määramata (vaikeväärtus): marsruut liigub otse edasi olemasolevasse pilvetorusse. Vt `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(määramata)_ | `open-sse/services/selfHostedEntry.ts` | Tee YAML-failini, mis sisaldab sama `providers:` dokumenti nagu `OMNIROUTE_SELF_HOSTED_PROVIDERS`, juurutuste jaoks, kus tekstisisese keskkonnamuutuja asemel eelistatakse faili. Kumb tahes neist aktiveerib isemajutatud sisendpunkti. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(määramata — avatud marsruut)_ | `open-sse/services/selfHostedEntry.ts` | Valikuline jagatud API-võti ühtse isemajutatud sisendpunkti jaoks (D5 aluskarkass, reserveeritud võtmepõhise kvoodisüsteemi jaoks). Kui see on määratud, peavad päringud sisaldama `Authorization: Bearer `. Määramata: marsruut on avatud, mis vastab olemasolevale isemajutatud kohaliku teenusepakkuja mustrile (tagasisideaadressi/usaldusväärse võrgu juurutus). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(määramata)_ | `open-sse/services/routingStrategies.ts` | Tekstisisene YAML-i `strategy:` dokument deterministliku marsruutimismootori jaoks (M2/RIC-740, D3) — must nimekiri / valge nimekiri, ooteajaga kaitselüliti, kulupõhine prioriteet, latentsust arvestav marsruutimine, varuvariantide ahel. Alistab võtmepõhiselt `OMNIROUTE_SELF_HOSTED_PROVIDERS` sisse pesastatud tekstisisese `strategy:` ploki. Vt `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(määramata)_ | `open-sse/services/routingStrategies.ts` | Tee YAML-failini, mis sisaldab sama `strategy:` dokumenti nagu `OMNIROUTE_SELF_HOSTED_STRATEGY`, juurutuste jaoks, kus tekstisisese keskkonnamuutuja asemel eelistatakse faili. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(määramata)_ | `open-sse/services/conversationTracker.ts` | Määrake väärtuseks `1`, et lõpetada vestlusajaloo kogumine. `resolveConversationId()` tagastab jälgimata tulemuse enne SQLite'i lugemist või sõnumiajaloo parsimist ning see hõlmab ka kliendi edastatud seansi-ID-sid. Marsruutimisseansi käsitlemine jääb muutmata ja olemasolevaid kirjeid ei kustutata. Mõeldud juurutustele, mis ei kasuta juhtpaneeli vestluste vaadet ja mille puhul soovitakse peatada voorude tabeli kasvamine. | --- ## 7. URL-id ja pilvesünkroonimine -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Serveripoolne URL, mille kaudu sisemised sünkroonimistööd kutsuvad välja `/api/sync/cloud`. Hoidke see tagasisideahela/konteineri URL-ina ka siis, kui rakendus on avalikult puhverserveri kaudu kättesaadav. | -| `CLOUD_URL` | _(tühi)_ | `src/lib/cloudSync.ts` | Pilverelee lõpp-punkti URL (tasuline funktsioon). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Pilvesünkroonimise päringute HTTP-ajalõpp. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpacki ehituskonfiguratsioon | Ehitusaegne profiil (määrake väärtuseks `minimal`, et privilegeeritud moodulid paketist füüsiliselt välja jätta). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ autonoomne väljund_ | `scripts/build/colocate-standalone.mjs` | Ehitusaegne autonoomse väljundkataloogi ülekirjutus, mida kasutab ehitusjärgne koondamisetapp. See ei ole käitusaegne säte. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(tühi)_ | `src/lib/cloudSync.ts` | Jagatud saladus, mida kasutatakse Cloud Synci vastuste HMAC-SHA256 allkirja kontrollimiseks. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Määrake väärtuseks `true`, et lubada Cloud Synci lõpp-punktil kohalikud identimisteabe kirjed üle kirjutada. Vaikeväärtus on `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Määrake väärtuseks `true`, et lükata allkirjastamata Cloud Synci vastus tagasi, kui kohalikku saladust pole seadistatud (#13679). Olemasolevat allkirja kontrollitakse alati — ja see lükatakse alati tagasi, kui `OMNIROUTE_CLOUD_SYNC_SECRET` pole määratud — olenemata sellest lipust. Versioonis v3.9 muutub jõustamine vaikevalikuks. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Määrake väärtuseks `true`, et naasta versiooni v3.8.5 üheetapilise „impordi kõik” käitumise juurde ilma kasutaja kinnituseta. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, töölaud, sünkroonimine | Avalik URL OAuthi `redirect_uri`, töölaua linkide ja genereeritud avalike URL-ide jaoks. Määrake see stabiilseks avalikuks URL-iks, kui OAuthi tagasikutsed või genereeritud brauserilingid peavad kasutama kanoonilist pöördpuhverserveri hosti. | -| `NEXT_PUBLIC_CLOUD_URL` | _(tühi)_ | Kliendipoolne | Muutuja `CLOUD_URL` kliendipoolne peegeldus. | -| `NEXT_PUBLIC_APP_URL` | _(määramata)_ | `src/shared/services/cloudSyncScheduler.ts` | Muutuja `NEXT_PUBLIC_BASE_URL` pärandvaruvariant. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(määramata)_ | Avaliku päritolu lahendaja, piltide URL-id | Kõrgeima prioriteediga brauserile suunatud OmniRoute'i päritolu, mida kasutatakse avalike URL-ide genereerimiseks ja töölauavälise brauseripäritolu valideerimiseks. Määrake see, kui OpenWebUI või muu relee jõuab OmniRoute'i sisemise URL-i kaudu, kuid kasutaja brauser peab laadima genereeritud meedia kohtvõrgu, tunneli või avaliku päritolu kaudu. **Ärge** lisage `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(määramata)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absoluutne teenusepakkuja plugina manifesti URL, mida teatatakse külgprotsessi klientidele. Kui see pole määratud, tuletab OmniRoute `/api/v1/provider-plugin-manifest` päringu päritolust või väärtustest HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokoll, mida kasutatakse teenusepakkuja plugina manifesti URL-i tuletamisel väärtustest HOST/PORT, kui päringu päritolu puudub. TLS-i lõpetava avaliku puhverserveri taga määrake väärtuseks `https`, kui selgesõnalist muutujat `OMNIROUTE_PROVIDER_MANIFEST_URL` pole määratud. | -| `OMNIROUTE_TRUST_PROXY` | _(määramata)_ | `src/server/origin/publicOrigin.ts` | Valikuline usaldusrežiim edastatud avaliku päritolu päiste jaoks. Määramata = turbeotsustes ei usaldata päiseid `Forwarded` / `X-Forwarded-*`. `true` / `loopback` usaldab edastatud hosti/protokolli ainult loaga märgistatud tagasisideahela puhverserverilt. `private` / `lan` usaldab ka privaatse kohtvõrgu puhverserveri partnereid. Tootmiskeskkonnas eelistage selgesõnalist `NEXT_PUBLIC_BASE_URL` väärtust. | -| `KIE_CALLBACK_URL` | _(määramata)_ | `open-sse/utils/kieTask.ts` | Avalik tagasikutse URL asünkroonsete kie.ai tööde jaoks. Kõrgeima prioriteediga ülekirjutus enne muutujaid `OMNIROUTE_KIE_CALLBACK_URL` ja `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(määramata)_ | `open-sse/utils/kieTask.ts` | Muutuja `KIE_CALLBACK_URL` alternatiivne kirjapilt. Kasutatakse varuvariandina, kui esmane muutuja pole määratud. | -| `OMNIROUTE_PUBLIC_URL` | _(määramata)_ | `open-sse/utils/kieTask.ts` | Avalik päritolu, mida kasutatakse asünkroonsete tagasikutse-URL-ide koostamiseks. Madalaima prioriteediga varuvariant kie.ai tagasikutsetele; kasutatakse ka üldise avaliku URL-ina teiste releede jaoks. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | CrofAI kvoodipäringu lõpp-punkt, mida kasutab kasutuse leht. Kirjutage üle releede/testfikstuuride jaoks. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Ametlik API-võtmega autenditud OpenCode Go kasutuse lõpp-punkt, mida kasutab kasutuse leht. Kirjutage üle releede/testfikstuuride jaoks. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sünteesib OpenCode CLI identiteedipäised (User-Agent, x-opencode-client/project, päringu/seansi UUID-d) opencode-go/zen ülesvoolupäringutele, mida klient ei saatnud, et Cloudflare aktsepteeriks neid VPS-i väljundliikluses (#6210/#5997). Alates #10571 vaikimisi sisse lülitatud; loobumiseks kasutage `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Vaikimisi User-Agent, mida kasutatakse, kui `OPENCODE_SYNTHESIZE_CLI_HEADERS` on sisse lülitatud ja teenusepakkujapõhist `_USER_AGENT` ülekirjutust pole määratud. Rakendatakse ainult opencode'i täituritele. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Sünteesitud päise `x-opencode-client` väärtus, kui `OPENCODE_SYNTHESIZE_CLI_HEADERS` on sisse lülitatud. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Sünteesitud päise `x-opencode-project` väärtus, kui `OPENCODE_SYNTHESIZE_CLI_HEADERS` on sisse lülitatud. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Ollama Cloudi seadete URL, mida kasutatakse kvoodi kraapimiseks. Kirjutage üle releede/testfikstuuride jaoks. | -| `OLLAMA_USAGE_COOKIE` | _(määramata)_ | `open-sse/services/usage.ts` | Ollama Cloudi `__Secure-session` küpsis, mida kasutatakse seadete lehelt kvoodi kraapimiseks. Tundlik teave; kui seadistatud on mitu kontot, eelistage töölaua ühendusepõhist välja. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(määramata)_ | `open-sse/services/usage.ts` | Alternatiivne Ollama Cloudi `__Secure-session` küpsise keskkonnamuutuja. Tundlik teave; kui seadistatud on mitu kontot, eelistage töölaua ühendusepõhist välja. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(määramata)_ | `open-sse/services/usage.ts` | Alternatiivne Ollama Cloudi `__Secure-session` küpsise keskkonnamuutuja, mida kasutatakse enne lühemaid pseudonüüme. Tundlik teave; kui seadistatud on mitu kontot, eelistage töölaua ühendusepõhist välja. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhispereri (AWS Kiro) kasutuspiirangute lõpp-punkt. Kirjutage üle releede/testfikstuuride jaoks. | +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Serveripoolne URL, mille kaudu sisemised sünkroonimistööd kutsuvad välja `/api/sync/cloud`. Hoidke see tagasisideahela/konteineri URL-ina isegi siis, kui rakendus on pöördproksi kaudu avalikult kättesaadav. | +| `CLOUD_URL` | _(tühi)_ | `src/lib/cloudSync.ts` | Pilverelee lõpp-punkti URL (tasuline funktsioon). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Pilvesünkroonimise päringute HTTP-ajalõpp. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpacki koostekonfiguratsioon | Koostamisaegne profiil (määrake väärtuseks `minimal`, et eelisõigustega moodulid komplektist füüsiliselt välja jätta). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ autonoomne väljund_ | `scripts/build/colocate-standalone.mjs` | Koostamisaegne autonoomse väljundkataloogi alistus, mida kasutab koostamisjärgne kõrvutamisetapp. See ei ole käitusaegne säte. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(tühi)_ | `src/lib/cloudSync.ts` | Jagatud saladus, mida kasutatakse pilvesünkroonimise vastuste HMAC-SHA256 allkirja kontrollimiseks. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Määrake väärtuseks `true`, et lubada pilvesünkroonimise lõpp-punktil kohalikud identimisteabe andmed üle kirjutada. Vaikeväärtus on `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Määrake väärtuseks `true`, et lükata allkirjastamata pilvesünkroonimise vastus tagasi, kui kohalikku saladust pole seadistatud (#13679). Olemasolevat allkirja kontrollitakse alati — ja see lükatakse alati tagasi, kui `OMNIROUTE_CLOUD_SYNC_SECRET` pole määratud — olenemata sellest lipust. Versioonis v3.9 muutub jõustamine vaikeväärtuseks. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Määrake väärtuseks `true`, et naasta v3.8.5 üheetapilise „impordi kõik” käitumise juurde ilma kasutaja kinnituseta. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, töölaud, sünkroonimine | Avalik URL OAuthi redirect_uri jaoks, töölaua linkide ja loodud avalike URL-ide jaoks. Määrake selleks stabiilne avalik URL, kui OAuthi tagasikutsetes või loodud brauserilinkides tuleb kasutada kanoonilist pöördproksi hosti. | +| `NEXT_PUBLIC_CLOUD_URL` | _(tühi)_ | Kliendipoolne | Muutuja `CLOUD_URL` kliendipoolne peegel. | +| `NEXT_PUBLIC_APP_URL` | _(määramata)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL`-i pärandvaruvariant. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(määramata)_ | Avaliku päritolu lahendaja, piltide URL-id | Kõrgeima prioriteediga brauserile suunatud OmniRoute'i päritolu, mida kasutatakse avalike URL-ide genereerimiseks ja juhtpaneelivälise brauseri päritolu valideerimiseks. Määrake see, kui OpenWebUI või mõni muu vahendaja pöördub OmniRoute'i poole sisemise URL-i kaudu, kuid kasutaja brauser peab genereeritud meedia hankima LAN-i, tunneli või avaliku päritolu kaudu. Ärge lisage `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(määramata)_ | `open-sse/config/providerPluginManifestUrl.ts` | Absoluutne teenusepakkuja pistikprogrammi manifesti URL, mida reklaamitakse sidecar-klientidele. Kui see on määramata, tuletab OmniRoute `/api/v1/provider-plugin-manifest`-i päringu päritolust või väärtustest HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokoll, mida kasutatakse teenusepakkuja pistikprogrammi manifesti URL-i tuletamisel väärtustest HOST/PORT, kui päringu päritolu puudub. Kui selgesõnalist `OMNIROUTE_PROVIDER_MANIFEST_URL`-i pole määratud, seadke TLS-i lõpetava avaliku puhverserveri taga väärtuseks `https`. | +| `OMNIROUTE_TRUST_PROXY` | _(määramata)_ | `src/server/origin/publicOrigin.ts` | Valikuline usaldusrežiim edastatud avaliku päritolu päiste jaoks. Määramata = ärge usaldage turbeotsuste tegemisel päiseid `Forwarded` / `X-Forwarded-*`. `true` / `loopback` usaldab edastatud hosti/protokolli ainult loaga märgistatud loopback-puhverserverilt. `private` / `lan` usaldab ka privaatse LAN-i puhverserveri partnerseadmeid. Tootmiskeskkonnas eelistage selgesõnalist `NEXT_PUBLIC_BASE_URL`-i. | +| `KIE_CALLBACK_URL` | _(määramata)_ | `open-sse/utils/kieTask.ts` | Avalik tagasikutse URL asünkroonsete kie.ai tööde jaoks. Kõrgeima prioriteediga alistus enne muutujaid `OMNIROUTE_KIE_CALLBACK_URL` ja `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(määramata)_ | `open-sse/utils/kieTask.ts` | Muutuja `KIE_CALLBACK_URL` alternatiivne kirjapilt. Seda kasutatakse varuvariandina, kui esmane muutuja on määramata. | +| `OMNIROUTE_PUBLIC_URL` | _(määramata)_ | `open-sse/utils/kieTask.ts` | Avalik päritolu, mida kasutatakse asünkroonsete tagasikutse URL-ide koostamiseks. Madalaima prioriteediga varuvariant kie.ai tagasikutsete jaoks; kasutatakse ka üldise avaliku URL-ina muude vahendajate puhul. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | CrofAI kvoodi päringu lõpp-punkt, mida kasutab kasutuse leht. Alistage vahendajate / testfikstuuride jaoks. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Ametlik API-võtmega autenditud OpenCode Go kasutuse lõpp-punkt, mida kasutab kasutuse leht. Alistage vahendajate / testfikstuuride jaoks. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sünteesib OpenCode CLI identiteedipäised (User-Agent, x-opencode-client/project, päringu/seansi UUID-d) opencode-go/zen-i ülesvoolupäringutele, mille puhul klient neid ei saatnud, et Cloudflare aktsepteeriks neid VPS-i väljuvas liikluses (#6210/#5997). Vaikimisi sisse lülitatud alates #10571; keelamiseks kasutage `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Vaikimisi User-Agent, mida kasutatakse, kui `OPENCODE_SYNTHESIZE_CLI_HEADERS` on sisse lülitatud ja teenusepakkujapõhist `_USER_AGENT` alistust pole määratud. Rakendatakse ainult opencode'i täituritele. Kui ülesvoolusüsteem tõkestab võtmeta päringu, asendatakse seadistatud väärtus, mis ei sisalda väärtust `opencode/= 1.17>`, päringust keeldumise asemel selle vaikeväärtusega. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Sünteesitud päise `x-opencode-client` väärtus, kui `OPENCODE_SYNTHESIZE_CLI_HEADERS` on sisse lülitatud. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Sünteesitud `x-opencode-project` päise väärtus, kui `OPENCODE_SYNTHESIZE_CLI_HEADERS` on sisse lülitatud. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(määramata)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Määrake väärtuseks `off`, et lõpetada võtmeta OpenCode'i päringute keha kohandamine (voogedastuse lipp ja tööriistade loend). Päiseid rakendatakse endiselt. Loetakse iga päringu puhul, seega jõustub muudatus kohe. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(määramata)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Komadega eraldatud tööriistade nimed, mis deklareeritakse võtmeta OpenCode'i päringus, milles neid pole, kui selle mudeli puhul pole veel midagi tuvastatud. Tühi väärtus kasutab üht kohatäitjat, mida mudelil kästakse mitte kutsuda. Maksimaalselt 32 kirjet, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; vigaseid kirjeid eiratakse. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Kvoodi hankimiseks kasutatav Ollama Cloudi seadete URL. Muutke releede / testandmete jaoks. | +| `OLLAMA_USAGE_COOKIE` | _(määramata)_ | `open-sse/services/usage.ts` | Ollama Cloudi `__Secure-session` küpsis, mida kasutatakse seadete lehelt kvoodi hankimiseks. Tundlik teave; mitme konto seadistamisel eelistage ühendusepõhist juhtpaneeli välja. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(määramata)_ | `open-sse/services/usage.ts` | Alternatiivne Ollama Cloudi `__Secure-session` küpsise keskkonnamuutuja. Tundlik teave; mitme konto seadistamisel eelistage ühendusepõhist juhtpaneeli välja. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(määramata)_ | `open-sse/services/usage.ts` | Alternatiivne Ollama Cloudi `__Secure-session` küpsise keskkonnamuutuja, mida kasutatakse enne lühemaid aliaseid. Tundlik teave; mitme konto seadistamisel eelistage ühendusepõhist juhtpaneeli välja. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhispereri (AWS Kiro) kasutuspiirangute lõpp-punkt. Muutke releede / testandmete jaoks. | > [!IMPORTANT] -> Pöördproksi (nginx, Caddy) taga juurutamisel määrake `NEXT_PUBLIC_BASE_URL` oma stabiilseks avalikuks URL-iks (nt `https://omniroute.example.com`), kui OAuthi tagasikutsed või genereeritud avalikud lingid peavad kasutama seda hostinime. Ilma selleta võivad OAuthi tagasikutsed nurjuda, sest redirect_uri ei ühti, ning genereeritud avalikud lingid võivad osutada konteineri sisemisele lähteaadressile. +> Pöördpuhverserveri (nginx, Caddy) taga juurutamisel määrake `NEXT_PUBLIC_BASE_URL` oma stabiilseks avalikuks URL-iks (nt `https://omniroute.example.com`), kui OAuthi tagasikutsed või loodud avalikud lingid peavad kasutama seda hostinime. Ilma selleta võivad OAuthi tagasikutsed nurjuda, sest redirect_uri ei ühti, ning loodud avalikud lingid võivad osutada konteineri sisemisele lähtepunktile. > -> Jätke `BASE_URL` serveritevaheliste tööde jaoks sisemiseks loopback-/konteineri-URL-iks. Ärge kasutage mandaate sisaldavate sisemiste isepäringute jaoks brauseri `Origin`-päist ega avalikku hostinime. +> Hoidke `BASE_URL` serveritevaheliste tööde jaoks sisemise tagasisideahela/konteineri URL-ina. Ärge kasutage mandaate sisaldavate sisemiste isepäringute jaoks brauseri `Origin`-päist ega avalikku hostinime. > -> Autenditud juhtpaneeli kirjutustoimingud ei vaja staatilist avalikku baas-URL-i: juhtpaneel saadab sama päritoluga ebaturvalised päringud koos seansiga seotud CSRF-loaga. OmniRoute tsentraliseerib endiselt avaliku päritolu valideerimise juhtpaneeliväliste brauseri-integratsioonide jaoks: esmalt usaldatakse sõnaselgelt määratud avaliku URL-i keskkonnamuutujaid; töötlemata `Forwarded` / `X-Forwarded-*` päiseid eiratakse, välja arvatud juhul, kui `OMNIROUTE_TRUST_PROXY` on lubatud ja vahetu proksipartner on tokeniga usaldusväärseks märgitud. Ärge kasutage CORS-i sätteid sama päritoluga juhtpaneelipäringute parandamiseks; CORS on mõeldud ainult eri päritoluga brauseriklientidele. +> Autenditud juhtpaneeli kirjutustoimingud ei vaja staatilist avalikku baas-URL-i: juhtpaneel saadab sama päritoluga ebaturvalised päringud koos seansiga seotud CSRF-tokeniga. OmniRoute tsentraliseerib endiselt avaliku päritolu valideerimise juhtpaneeliväliste brauseri-integratsioonide jaoks: esmalt usaldatakse selgesõnaliselt määratud avaliku URL-i keskkonnamuutujaid; töötlemata `Forwarded` / `X-Forwarded-*` päiseid eiratakse, välja arvatud juhul, kui `OMNIROUTE_TRUST_PROXY` on lubatud ja vahetu puhverserveri partner on tokeniga usaldusväärseks märgitud. Ärge kasutage sama päritoluga juhtpaneelipäringute parandamiseks CORS-i sätteid; CORS on mõeldud ainult eri päritoluga brauseriklientidele. --- @@ -586,49 +593,50 @@ kirjeldatud sidecar'i tuvastamist). --- -## 11. OAuthi pakkuja identimisteave - -Sisseehitatud identimisteave **localhost-arenduseks**. Kaugjuurutuste jaoks registreerige iga pakkuja arendajakonsoolis enda oma. - -| Muutuja | Pakkuja | Märkused | -| --------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Avalik klient — saladust pole vaja. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Ümbersuunamise URI alistamine. Vaikeväärtus: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Avalik klient. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Nõuab vastavat `_SECRET`-i. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Avalik klient. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Nõuab vastavat `_SECRET`-i. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Avalik klient. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Valikuline GitHub Enterprise Copiloti OAuthi kliendi-ID alistus. Kui see pole määratud, kasutatakse `GITHUB_OAUTH_CLIENT_ID` avalikku vaikeväärtust. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API-võtme varuvariant, mida `open-sse/executors/devin-cli.ts` kasutab, kui ühendusepõhiseid identimisteabeid pole saadaval. Valikuline. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Kohandatud tee Devin CLI binaarfailini (`devin`). Selle lahendab `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo OAuthi kliendi-ID. Registreerige rakendus aadressil `https://gitlab.com/-/profile/applications`, kasutades ümbersuunamise URI-d `/callback` ja kehtivuspiirkondi `api, read_user, openid, profile, email`. Varuvariandina kasutatakse `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo OAuthi kliendisaladus. Valikuline — PKCE-voog ei nõua saladust. Varuvariandina kasutatakse `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLabi baas-URL-i alistamine (iseseisvalt majutatud GitLab). Vaikeväärtus on `https://gitlab.com`. Varuvariandina kasutatakse `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL`-i pärandvaruvariant. Kasutatakse siis, kui `_DUO_` variant pole määratud. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `GITLAB_DUO_OAUTH_CLIENT_ID` pärandvaruvariant, mida kasutab `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `GITLAB_DUO_OAUTH_CLIENT_SECRET` pärandvaruvariant, mida kasutab `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Määrake Qoder OAuthi lubamiseks. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Otsene API-võtme varuvariant (möödub OAuthist). | -| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI tööruumi ID. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Muutuja `QODER_CLI_WORKSPACE` alias. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI konfiguratsioonikataloogi alistamine (isoleeritud PAT-seanss, väldib brauseri sisselogimise ülekirjutamist). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Kasutajaliidese `tk`-luba, mis saadetakse `/api/chat`-ile väljana `validated`. Nõutav, kui Blackbox jõustab lubade vastavuse; vastasel juhul kasutab OmniRoute varuvariandina juhuslikku UUID-d. Vt probleemi #2252. | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | OpenAI-ga ühilduv baas-URL mitte-Anthropicu vision-bridge'i kutsete jaoks. Vaikeväärtusena kasutatakse pärand-OpenAI URL-i keskkonnamuutujat või api.openai.com-i. Suunake see OmniRoute'i `/v1` isetsüklile või mis tahes OpenAI-ga ühilduvale lõpp-punktile (Gemini OpenAI-ühilduvus, OpenRouter). Probleem #2232. Kui URL on OmniRoute'i enda `/v1`, saadab kirjeldamise alampäring `x-omniroute-admission-bypass: internal` ja autendib lahendatud isetsükli identimisteabega (`sk_omniroute` sentinell kohalikus režiimis või `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), et juurutused, kus `REQUIRE_API_KEY=true`, töötaksid. | -| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | Ülaltoodud URL-i API-võti. Alistab mitte-Anthropicu vision-bridge'i kutsete pakkujapõhised OpenAI / Google'i keskkonnamuutujad. Anthropicu mudelid säilitavad oma spetsiaalse Anthropicu võtmetee. Probleem #2232. | +## 11. OAuthi teenusepakkujate identimisteave + +Sisseehitatud identimisteave **localhosti arenduseks**. Kaugjuurutuste jaoks registreerige iga teenusepakkuja arenduskonsoolis oma identimisteave. + +| Muutuja | Teenusepakkuja | Märkused | +| --------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Avalik klient — saladust pole vaja. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Ümbersuunamise URI alistamine. Vaikimisi: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Avalik klient. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Nõuab vastavat `_SECRET` väärtust. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Avalik klient. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Nõuab vastavat `_SECRET` väärtust. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Avalik klient. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copiloti OAuthi kliendi-ID valikuline alistamine. Kui väärtus pole määratud, kasutatakse `GITHUB_OAUTH_CLIENT_ID` avalikku vaikeväärtust. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | GitHub Copiloti kliendiintegratsiooni ID valikuline alistamine, mis saadetakse päistes `Copilot-Integration-Id` ja `Editor-Plugin-Version`. Vaikimisi `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API-võtme varuväärtus, mida `open-sse/executors/devin-cli.ts` kasutab, kui ühendusepõhist identimisteavet pole saadaval. Valikuline. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Kohandatud tee Devin CLI binaarfailini (`devin`). Selle tuvastab `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo OAuthi kliendi-ID. Registreerige rakendus aadressil `https://gitlab.com/-/profile/applications`, kasutades ümbersuunamise URI-d `/callback` ja kehtivuspiirkondi `api, read_user, openid, profile, email`. Varuväärtus on `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo OAuthi kliendisaladus. Valikuline — PKCE-voog ei nõua saladust. Varuväärtus on `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLabi baas-URL-i alistamine (isehostitud GitLab). Vaikimisi `https://gitlab.com`. Varuväärtus on `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` pärandvaruväärtus. Seda kasutatakse, kui `_DUO_` variant pole määratud. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Pärandvaruvariant muutujale `GITLAB_DUO_OAUTH_CLIENT_ID`, mida kasutab `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Pärandvaruvariant muutujale `GITLAB_DUO_OAUTH_CLIENT_SECRET`, mida kasutab `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Määrake Qoder OAuthi lubamiseks. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Otsese API-võtme varuvariant (möödub OAuthist). | +| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI tööruumi ID. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Muutuja `QODER_CLI_WORKSPACE` alias. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Alistab Qoder CLI konfiguratsioonikataloogi (isoleeritud PAT-seanss, väldib brauseri sisselogimise ülekirjutamist). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Kasutajaliidese `tk` luba, mis saadetakse päringus `/api/chat` väärtusena `validated`. Nõutav, kui Blackbox jõustab lubade vastavuse; vastasel juhul kasutab OmniRoute varuvariandina juhuslikku UUID-d. Vt probleemi #2252. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge'i kaitsepiire | OpenAI-ga ühilduv baas-URL mitte-Anthropicu vision-bridge'i kutsete jaoks. Vaikimisi kasutatakse pärand-OpenAI URL-i keskkonnamuutujast või aadressi api.openai.com. Suunake see OmniRoute'i `/v1` enesesilmusele või mis tahes OpenAI-ga ühilduvale lõpp-punktile (Gemini OpenAI-compat, OpenRouter). Probleem #2232. Kui URL on OmniRoute'i enda `/v1`, saadab kirjeldamise alampäring päise `x-omniroute-admission-bypass: internal` ja autentib lahendatud enesesilmuse mandaadiga (`sk_omniroute` kohatäitja kohalikus režiimis või `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), et juurutused seadistusega `REQUIRE_API_KEY=true` töötaksid. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge'i kaitsepiire | Ülaltoodud URL-i API-võti. Alistab mitte-Anthropicu vision-bridge'i kutsete puhul teenusepakkujapõhised OpenAI / Google'i keskkonnamuutujad. Anthropicu mudelid kasutavad endiselt oma spetsiaalset Anthropicu võtme asukohta. Probleem #2232. | > [!WARNING] > -> 1. Avage [Google Cloud Console → Volitused](https://console.cloud.google.com/apis/credentials) -> 2. Looge OAuth 2.0 kliendi ID (tüüp: „Veebirakendus“) +> 1. Avage [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) +> 2. Looge OAuth 2.0 kliendi ID (tüüp: „Web application”) > 3. Lisage oma serveri URL volitatud ümbersuunamise URI-na -> 4. Asendage volituste väärtused failis `.env`. +> 4. Asendage mandaadi väärtused failis `.env`. --- @@ -731,13 +739,13 @@ Tuvastatav muster: `{PROVIDER_ID}_API_KEY` ## 15. Ajalõpu seaded -Kõik väärtused on **millisekundites**. Tsentraliseeritud lahendamine failis `src/shared/utils/runtimeTimeouts.ts`. +Kõik väärtused on esitatud **millisekundites**. Tsentraliseeritud väärtuste määramine toimub failis `src/shared/utils/runtimeTimeouts.ts`. ### Ajalõppude hierarhia ``` -REQUEST_TIMEOUT_MS (globaalne ülekirjutus) -├─→ FETCH_TIMEOUT_MS (teenusepakkuja päringud, vaikeväärtus: 600000) +REQUEST_TIMEOUT_MS (globaalne alistus) +├─→ FETCH_TIMEOUT_MS (väliste teenusepakkujate päringud, vaikeväärtus: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (pärib väärtuse muutujalt FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (pärib väärtuse muutujalt FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (pärib väärtuse muutujalt FETCH_TIMEOUT_MS) @@ -748,7 +756,7 @@ REQUEST_TIMEOUT_MS (globaalne ülekirjutus) ├─→ STREAM_IDLE_TIMEOUT_MS (pärib väärtuse muutujalt REQUEST_TIMEOUT_MS, vaikeväärtus: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (sõltumatu, vaikeväärtus: 1260000; 0 keelab) ├─→ STREAM_READINESS_TIMEOUT_MS (pärib väärtuse muutujalt REQUEST_TIMEOUT_MS, vaikeväärtus: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (piirab kohanduvaid valmisolekuaja pikendusi, vaikeväärtus: 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (piirab adaptiivseid valmisolekuajalõpu pikendusi, vaikeväärtus: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (pärib väärtuse muutujalt REQUEST_TIMEOUT_MS, vaikeväärtus: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (tuletatud, vaikeväärtus: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (vaikeväärtus: 60000) @@ -756,114 +764,115 @@ REQUEST_TIMEOUT_MS (globaalne ülekirjutus) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (vaikeväärtus: 0 = keelatud) ``` -| Muutuja | Vaikeväärtus | Kirjeldus | -| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(määramata)_ | Globaalne otsetee — alistab nii `FETCH_TIMEOUT_MS` kui ka `STREAM_IDLE_TIMEOUT_MS` vaikeväärtused. | -| `FETCH_TIMEOUT_MS` | `600000` | Ülesvoolu teenusepakkuja kutsete HTTP-päringu koguaeg. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maksimaalne vaikus ülesvoolust saabuvate toorbaitide vahel enne katkestamist. Laiendatud mõtlemisega mudelid peatuvad harva kauemaks kui 90 sekundit. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Aktiivse SSE-voo maksimaalne kogukestus; seda ei lähtestata kunagi ülesvoolust saabuvate baitide korral ning see ei sõltu muutujast `REQUEST_TIMEOUT_MS`. Tuletatud registri suurimast mudelipõhisest väärtusest `timeoutMs` (1200000, Codex), millele on lisatud varu 60000, et mudelit, millel lubatakse kogu oma eelarve ära kasutada, ei katkestataks kunagi vastuse keskel. Keelamiseks määra väärtuseks `0`. | -| `OMNIROUTE_SSE_COMMENTS` | _(keelatud)_ | Kas OmniRoute võib väljastada SSE `:` kommentaariridu (nt `: keepalive` südamelöögisignaal ja `x-omniroute-*` metaandmete lõpuread). Vaikimisi keelatud (#10524), kuna ranged OpenAI-ga ühilduvad kliendid rakendavad igale SSE-reale funktsiooni JSON.parse ja jooksevad `:` kommentaaride tõttu kokku; `data:` südamelöögisignaale see ei mõjuta. Uuesti lubamiseks määra väärtuseks `on`/`true`/`1`/`yes`. Seda kasutab `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Esimese mitte-ping SSE-sündmuse vastuvõtmise aeg. Kui `REQUEST_TIMEOUT_MS` on määratud, pärib selle väärtuse. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maksimaalne kohanduv esimese sündmuse valmisoleku ajavahemik suurte, tööriistarohkete või põhjalikku arutluskäiku nõudvate voogedastuspäringute jaoks. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` heuristika hädaseiskamislüliti. Tuvastamise täielikuks keelamiseks määra väärtuseks `false`/`0`/`off` — päringu keha või päised ei pikenda kunagi valmisoleku ajalõppe ega voo taastamist, vähendades kliendi juhitava ajalõpu võimendamise ohtu. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maksimaalne esimese sündmuse valmisoleku ajavahemik tuvastatud `/goal` agendikäituste või päisega `x-omniroute-agent-goal` sunnitud päringute jaoks. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Luba tuvastatud `/goal` agendikäituste puhul automaatselt voo varajane taastamine. Eesmärgipõhise lubamise keelamiseks määra väärtuseks `false`/`0`/`off`. See saab taastamise ainult operaatori vaikeväärtusele LISADA — see ei alista kunagi selgesõnalist `STREAM_RECOVERY_ENABLED`/andmebaasi seadete kaudu keelamist. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Eemalda ebastandardsed `codex.*` SSE-sündmused (nt `codex.rate_limits`), mille tõttu OpenAI SDK `responses.stream()` tagastab vea 502. Vaikimisi SEES (#11014). Nende edastamiseks määra väärtuseks `0`/`false`/`no`/`off`. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(määramata)_ | Valikuline Codexi rakendusserveri transport. Kohaliku `codex app-server` kõrvalprotsessi WebSocketi otspunkt (`ws://`/`wss://`). Kui see on määratud koos loaga, suunatakse Codexi päringud HTTP Responses API asemel JSON-RPC kaudu kõrvalprotsessile. Saab määrata ka ühendusepõhiselt välja `providerSpecificData.codexAppServerUrl` kaudu. Seda kasutab `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(määramata)_ | Rakendusserverile esitatav tekstisisene võimekus-/bearer-luba. Ühendusepõhine alistus: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(määramata)_ | Rakendusserveri võimekusluba sisaldava faili tee (käsust `codex app-server --ws-token-file`). Kasutatakse, kui `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` on määramata. Ühendusepõhine alistus: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Töökataloog, milles rakendusserveri voor käitatakse. Ühendusepõhine alistus: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(määramata)_ | Rakendusserveri voorule edastatav kinnituspoliitika (nt `never`, `on-request`). Ühendusepõhine alistus: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(määramata)_ | Rakendusserveri voorule edastatav liivakastipoliitika (nt `read-only`, `workspace-write`, `danger-full-access`). Kui see on määramata, kasutab täitur vaikeväärtust `workspace-write` (tugevdatud turvalisusega; varem `danger-full-access`). Ühendusepõhine alistus: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Kinnita rakendusserveri enda kinnitusviibad automaatselt (käskude/failide/õiguste rakendamine hostis). Vaikimisi väljas — viibad lükatakse automaatselt tagasi; rakenduskesta tööriistakutseid see ei mõjuta (need liiguvad eraldi `item/tool/call` läbivkanali kaudu). Aktsepteerib väärtusi `true`/`1`/`yes`. Ühendusepõhine alistus: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Vastuse päiste vastuvõtmise aeg. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Maksimaalne ooteaeg (ms) vastuse alguseni iga otsese, puhverserverita katse puhul. Ajalõpu korral proovitakse üks kord uuesti uue sokliga; piirangu keelamiseks ja varasema käitumise säilitamiseks määrake väärtuseks `0`. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Kogu vastuse keha vastuvõtmiseks ette nähtud aeg. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP-ühenduse loomise ajalõpp. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive-sokli jõudeoleku ajalõpp. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS-sõrmejälje puhverserveri (wreq-js) ajalõpp. | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Piirab aega esimese baidini konkreetselt wreq-js-i TLS-sõrmejälje transpordi vastuse kehas; `TLS_CLIENT_TIMEOUT_MS` üksi ei suuda tuvastada takerdunud vastuse keha, sest see laheneb kohe päiste saabumisel (#12656). Ajalõpp tühistab wreq-lugeja ja kasutab varuvariandina otsest/puhverserveri dispetšerit; `0` keelab valve. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Ainult OpenCode'i täituri jaoks ja üksnes siis, kui funktsioonilipp `OPENCODE_RESPONSES_STALL_ROTATION` on sisse lülitatud (vaikimisi väljas): piirab pärast päiste saabumist voogedastatava Responses-vastuse keha esimese baidi ooteaega (#13484). Responses-voog avaneb sündmusega `response.created`, seega tähendab sellest ajavahemikust pikem vaikus takerdumist: konto pannakse jahtuma ja päring suunatakse ühe korra järgmisele kontole; teise takerdumise korral nurjub päring kohe. `0` keelab kaitse isegi siis, kui lipp on sisse lülitatud. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Puhverserveri etapi ajalõpp `/v1` silla päringute jaoks. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Suunab Firecrawli veebist hankimise täituri isehostitud eksemplarile (pilvevälises keskkonnas on API-võti valikuline). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawli veebist hankimise täituri päringupõhine ajalõpp. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Silla serveripäringu üldine ajalõpp. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Aeg vastuse päiste saatmiseks silla kaudu. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Silla keep-alive-ühenduse jõudeoleku ajalõpp. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Toorsokli ajalõpp (0 = keelatud). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Ajapikendus pärast SIGTERM-i/SIGINT-i enne sundväljumist. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Varuväärtus, mida `src/shared/utils/fetchTimeout.ts` kasutab, kui `FETCH_TIMEOUT_MS` pole määratud. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Eelseadete `validationRead` ja `modelsProbe` ajalõpp (ms) failis `src/shared/network/safeOutboundFetch.ts`. Suurendage seda aeglaste lõpp-punktide (Cerebras, Cloudflare AI, Groq) puhul, et vältida juhtpaneelil aktiivse ja veaoleku vahel kõikumist. Sobimatute (<1000) või mittearvuliste väärtuste korral kasutatakse varuväärtust 8000 ms. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Releespetsiifiline hankimise ajalõpp failis `open-sse/utils/proxyFetch.ts` (#9158). Hangunud relee peab nurjuma enne kliendi/agendi ajalõppu (~30 s), et kutsujad näeksid üldise ülesvoolu ajalõpu asemel releespetsiifilist tõrget. Ülempiir on `29000`, et see rakenduks alati esimesena. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Ühine korduskatsete ooteaeg otsese/relee/puhverserveri ühekordse korduskatse teede jaoks failis `open-sse/utils/proxyFetch.ts` (#9158). `0` = proovitakse kohe uuesti. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | wreq-js-i omapäringute ajalõpp (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absoluutse JS-i lõpptähtaja ajapikendus, mis lisatakse omapäringu ajalõpule. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | wreq-js-i omapäringute ajalõpp (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absoluutse JS-i lõpptähtaja ajapikendus, mis lisatakse omapäringu ajalõpule. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (väljas) | Lisab kutsuja süsteemisõnumile teksti „You have built-in web search. Answer questions directly using search results.” (`perplexity-web/protocol.ts`). Vaikimisi väljas — Perplexity otsib niikuinii ning lause lekib programmeerimisklientide vastustesse metakommentaarina. Taastamiseks määrake väärtuseks `1`/`true`/`yes`/`on`. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | wreq-js-i omapäringu ajalõpp (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absoluutse JS-i range tähtaja varuaeg, mis lisatakse omapäringu ajalõpule. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | wreq-js-i omapäringu ajalõpp (`notionTlsClient.ts`); `notion-web` suurendab selle pikkade genereerimiste jaoks iga päringu puhul väärtuseni `180000`. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absoluutse JS-i range tähtaja varuaeg, mis lisatakse omapäringu ajalõpule. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Jagatud Playwrighti brauseripark brauseripõhise veebiküpsisega vestluse jaoks (`browserPool.ts`); keelamiseks määrake väärtuseks `off`. | -| `OBSCURA_BIN` | `auto-detect` | Brauseripargi ja Cloudflare Playgroundi täituri põhimootorina kasutatava `obscura` binaarfaili tee (`open-sse/services/obscura.ts`); kui väärtus on määramata, tuvastatakse see automaatselt süsteemi PATH-ist. | -| `OBSCURA_CDP_ENDPOINT` | _(määramata)_ | Kasutage juba töötavat Obscurat (`http://host:port`) uue protsessi käivitamise asemel; moodul ei halda seda protsessi (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `juhuslik vaba port` | Käivitatud käsu `obscura serve` konkreetne port; kui väärtus on määramata, valitakse automaatselt vaba port (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Suunab veebiküpsisega vestluspäringu brauseripõhisele teele (`browserBackedChat.ts`); lubamiseks määrake väärtuseks `1`. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Webi (rahvusvaheline kimi.ai Connect-RPC) täituri baas-URL (`kimi-web.ts`); alistage ainult peegel-/puhverserveri lõpp-punktide jaoks. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Webi täituri täielik vestluse lõpp-punkt (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(automaatselt tuvastatud)_ | Adobe Firefly interaktiivseks brauseris sisselogimiseks kasutatava süsteemi Chrome'i/Edge'i täitmisfaili tee (`adobeFireflyBrowserLogin.ts`); alistab operatsioonisüsteemipõhise automaattuvastuse. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ autonoomne väljund_ | Järelkoostamise kõrvutamisetapis kasutatava autonoomse väljundkataloogi koostamisaegne alistus (`scripts/build/colocate-standalone.mjs`); koostamistööriistade jaoks, mitte käitusajal. | - -Kombineeritud sihtmärgi katsed pärivad lahendatud ülesvoolupäringu ajalõpu (`FETCH_TIMEOUT_MS` või +| Muutuja | Vaikeväärtus | Kirjeldus | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUEST_TIMEOUT_MS` | _(määramata)_ | Globaalne otsetee — alistab nii `FETCH_TIMEOUT_MS` kui ka `STREAM_IDLE_TIMEOUT_MS` vaikeväärtused. | +| `FETCH_TIMEOUT_MS` | `600000` | Ülesvooluteenuse pakkuja päringute HTTP-päringu koguaegumine. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Maksimaalne vaikus ülesvoolust saabuvate toorbaitide vahel enne katkestamist. Laiendatud arutlusega mudelid peatuvad harva kauemaks kui 90 sekundiks. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Aktiivse SSE-voo maksimaalne kogukestus; ülesvoolust saabuvad baidid ei lähtesta seda ning see ei sõltu muutujast `REQUEST_TIMEOUT_MS`. Tuletatud registri suurimast mudelipõhisest `timeoutMs` väärtusest (1200000, Codex), millele on lisatud varu 60000, et kogu lubatud aja töötavat mudelit ei katkestataks kunagi vastuse keskel. Keelamiseks määrake väärtuseks `0`. | +| `OMNIROUTE_SSE_COMMENTS` | _(keelatud)_ | Kas OmniRoute võib väljastada SSE `:` kommentaariridu (nt `: keepalive` südamelöögisignaal ja `x-omniroute-*` metaandmete lõpuread). Vaikimisi keelatud (#10524), sest ranged OpenAI-ga ühilduvad kliendid käivitavad iga SSE-rea jaoks JSON.parse'i ja jooksevad `:` kommentaaride tõttu kokku; `data:` südamelöögisignaale see ei mõjuta. Uuesti lubamiseks määrake väärtuseks `on`/`true`/`1`/`yes`. Kasutab `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Esimese mitte-ping-SSE-sündmuse vastuvõtmiseks antud aeg. Kui `REQUEST_TIMEOUT_MS` on määratud, pärib selle väärtuse. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Maksimaalne adaptiivne esimese sündmuse valmisoleku ooteaken suurte, tööriistamahukate või põhjalikku arutlust nõudvate voogedastuspäringute jaoks. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Hädaseiskamislüliti `/goal` heuristika jaoks. Tuvastamise täielikuks keelamiseks määrake väärtuseks `false`/`0`/`off` — päringu keha või päiste alusel ei suurendata kunagi valmisoleku aegumisi ega voo taastamise taset, mis vähendab kliendi juhitava aegumise võimendamise ohtu. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Maksimaalne esimese sündmuse valmisoleku ooteaken tuvastatud `/goal` agendikäituste või päisega `x-omniroute-agent-goal` sunnitud päringute jaoks. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Luba tuvastatud `/goal` agendikäituste jaoks automaatselt voo varajane taastamine. Eesmärgipõhise lubamise keelamiseks määrake väärtuseks `false`/`0`/`off`. See saab ainult LISADA taastamise operaatori vaikeväärtusele — see ei alista kunagi muutujaga `STREAM_RECOVERY_ENABLED` või andmebaasi sätetes sõnaselgelt määratud loobumist. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Eemalda mittestandardsed `codex.*` SSE-sündmused (nt `codex.rate_limits`), mis põhjustavad OpenAI SDK meetodi `responses.stream()` nurjumise veaga 502. Vaikimisi SEES (#11014). Nende edastamiseks määrake väärtuseks `0`/`false`/`no`/`off`. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(määramata)_ | Valikuliselt lubatav Codexi app-serveri transport. Kohaliku `codex app-server` külgprotsessi WebSocketi lõpp-punkt (`ws://`/`wss://`). Kui see määratakse koos loaga, suunatakse Codexi päringud HTTP Responses API asemel JSON-RPC kaudu külgprotsessile. Saab määrata ka ühendusepõhiselt parameetriga `providerSpecificData.codexAppServerUrl`. Kasutab `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(määramata)_ | App-serverile esitatav tekstisisene võimekus-/kandjaluba. Ühendusepõhine alistus: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(määramata)_ | App-serveri võimekusluba sisaldava faili tee (loodud käsuga `codex app-server --ws-token-file`). Kasutatakse siis, kui `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` on määramata. Ühendusepõhine alistus: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Töökataloog, milles app-serveri voor käivitatakse. Ühendusepõhine alistus: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(määramata)_ | App-serveri voorule edastatav heakskiidupoliitika (nt `never`, `on-request`). Ühendusepõhine alistus: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(määramata)_ | App-serveri voorule edastatav liivakastipoliitika (nt `read-only`, `workspace-write`, `danger-full-access`). Kui see on määramata, kasutab täitur vaikeväärtust `workspace-write` (tugevdatud turvalisusega; varem `danger-full-access`). Ühendusepõhine alistus: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Kiida app-serveri enda heakskiidupäringud automaatselt heaks (käsu/faili/õiguse käivitamine hostis). Vaikimisi väljas — päringud lükatakse automaatselt tagasi; rakenduskesta tööriistakutseid see ei mõjuta (need liiguvad eraldi `item/tool/call` läbiva edastuse kaudu). Aktsepteerib väärtusi `true`/`1`/`yes`. Ühendusepõhine alistus: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Vastusepäiste vastuvõtmiseks antud aeg. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Maksimaalne ooteaeg (ms) vastuse alguseni iga otsese, puhverserverita katse puhul. Ajalõpu korral proovitakse üks kord uuesti uue sokliga; piirangu keelamiseks ja varasema käitumise säilitamiseks määrake väärtuseks `0`. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Uue sokliga RETRY-katse ülempiir (ms) pärast eespool kirjeldatud ühenduste puulil põhineva katse vastuse alguse ajalõppu (#13703). Rakendub ainult siis, kui kutsuja on juba lisanud oma tähtajasignaali (lahendatud ühenduse/mudeli/pakkuja/`FETCH_TIMEOUT_MS` kaskaad); see signaal on tegelik piirang ja käivitub ettenähtud töövoos esimesena, mistõttu on see pigem leebe turvapiir kui jäik ülempiir — ilma selleta kasutas korduskatse sama lühikest `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` ajavahemikku nagu ühenduste puulil põhinev katse ning tagastas tervete, kuid aeglase TTFB-ga arutlusmudelite puhul vea 504. Väärtus ei tohi kunagi olla eespool toodud jäigast alampiirist väiksem; kui kutsuja ei esita üldse tähtajasignaali, jääb korduskatse jäik alampiir muutmata. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Kogu vastusekeha vastuvõtmiseks ette nähtud aeg. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP-ühenduse loomise ajalõpp. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive-sokli jõudeoleku ajalõpp. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS-sõrmejälje puhverserveri (wreq-js) ajalõpp. | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Piirab konkreetselt wreq-js-i TLS-sõrmejäljetranspordi vastusekeha esimese baidini kuluvat aega; `TLS_CLIENT_TIMEOUT_MS` üksi ei suuda seiskunud vastusekeha tuvastada, sest see loetakse lõppenuks kohe päiste saabumisel (#12656). Ajalõpp tühistab wreq-lugeja ja lülitub tagasi otse-/puhverserveridispetšerile; `0` keelab valvefunktsiooni. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Ainult OpenCode'i täituri jaoks ja üksnes siis, kui funktsioonilipp `OPENCODE_RESPONSES_STALL_ROTATION` on sisse lülitatud (vaikimisi väljas): piirab pärast päiste saabumist voogedastatava Responses-vastuse esimese kehabaidi ooteaega (#13484). Responses-voog algab sündmusega `response.created`, seega tähendab sellest ajavahemikust pikem vaikus seiskumist: konto pannakse jahtuma ning päring suunatakse üks kord järgmisele kontole; teise seiskumise korral nurjub päring kohe. `0` keelab kaitse ka siis, kui lipp on sisse lülitatud. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Puhverserverihüppe ajalõpp `/v1` silla päringute jaoks. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Suunab Firecrawli veebist toomise täituri isemajutatud eksemplarile (pilveväliselt on API-võti valikuline). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawli veebist toomise täituri päringupõhine ajalõpp. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Silla serveripäringu üldine ajalõpp. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Silla kaudu vastuse päiste saatmiseks ette nähtud aeg. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Silla keep-alive-ühenduse jõudeoleku ajalõpp. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Töötlemata sokli ajalõpp (0 = keelatud). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Ajapikendus SIGTERM-i/SIGINT-i korral enne sunnitud väljumist. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Varuväärtus, mida `src/shared/utils/fetchTimeout.ts` kasutab, kui `FETCH_TIMEOUT_MS` pole määratud. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `validationRead` ja `modelsProbe` eelseadete ajalõpp (ms) failis `src/shared/network/safeOutboundFetch.ts`. Suurendage seda aeglaste lõpp-punktide (Cerebras, Cloudflare AI, Groq) puhul, et vältida juhtpaneelil aktiivse ja veaoleku vahel kõikumist. Sobimatute (<1000) või mittearvuliste väärtuste korral kasutatakse varuväärtust 8000 ms. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Releepõhine toomise ajalõpp failis `open-sse/utils/proxyFetch.ts` (#9158). Hangunud relee peab nurjuma enne kliendi/agendi ajalõppu (~30 s), et kutsujad näeksid üldise ülesvoolu ajalõpu asemel releepõhist tõrget. Ülempiir on `29000`, et see käivituks alati esimesena. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Ühine korduskatsete viivitus otse-/relee-/puhverserveriteede ühekordse korduskatse jaoks failis `open-sse/utils/proxyFetch.ts` (#9158). `0` = proovi kohe uuesti. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | wreq-js-i omapärane päringu ajalõpp (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Omapärasele ajalõpule lisatav absoluutse JS-i lõpptähtaja puhver. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | wreq-js-i omapärane päringu ajalõpp (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Omapärasele ajalõpule lisatav absoluutse JS-i lõpptähtaja puhver. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (väljas) | Lisab kutsuja süsteemisõnumile teksti „Teil on sisseehitatud veebiotsing. Vastake küsimustele otse otsingutulemuste põhjal.” (`perplexity-web/protocol.ts`). Vaikimisi väljas — Perplexity teeb otsinguid niikuinii ja see lause lekib programmeerimisklientide vastustesse metakommentaarina. Taastamiseks määrake `1`/`true`/`yes`/`on`. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | wreq-js-i omapärane päringu ajalõpp (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Omapärasele ajalõpule lisatav absoluutse JS-i lõpptähtaja puhver. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | wreq-js-i omapärane päringu ajalõpp (`notionTlsClient.ts`); `notion-web` suurendab selle pikkade genereerimiste korral iga päringu jaoks väärtuseni `180000`. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Omapärasele ajalõpule lisatav absoluutse JS-i lõpptähtaja puhver. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Jagatud Playwrighti brauserikogum brauseripõhise veebiküpsistega vestluse jaoks (`browserPool.ts`); keelamiseks määrake `off`. | +| `OBSCURA_BIN` | `auto-detect` | Brauserikogumi ja Cloudflare Playgroundi täituri põhimootorina kasutatava binaarfaili `obscura` asukoht (`open-sse/services/obscura.ts`); kui see pole määratud, tuvastatakse see automaatselt süsteemi PATH-ist. | +| `OBSCURA_CDP_ENDPOINT` | _(määramata)_ | Kasutage juba töötavat Obscurat (`http://host:port`), selle asemel et uus protsess käivitada; moodul ei halda seda protsessi (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `juhuslik vaba port` | Käivitatava käsu `obscura serve` konkreetne port; kui see pole määratud, valitakse automaatselt vaba port (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Suunab veebiküpsistega vestluspäringu brauseripõhisele teele (`browserBackedChat.ts`); lubamiseks määrake `1`. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Webi (rahvusvaheline kimi.ai Connect-RPC) täituri baas-URL (`kimi-web.ts`); muutke ainult peegel-/puhverserveri lõpp-punktide jaoks. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Webi täituri täielik vestluse lõpp-punkt (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(automaatselt tuvastatud)_ | Adobe Firefly interaktiivseks brauseris sisselogimiseks kasutatava süsteemi Chrome'i/Edge'i täitmisfaili asukoht (`adobeFireflyBrowserLogin.ts`); alistab operatsioonisüsteemipõhise automaattuvastuse. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ eraldiseisev väljund_ | Järelkoostamise koondamissammus kasutatava eraldiseisva väljundkataloogi koostamisaegne alistus (`scripts/build/colocate-standalone.mjs`); mõeldud koostamistööriistadele, mitte käitusajaks. | + +Kombineeritud sihtmärkide katsed pärivad lahendatud ülesvoolupäringu ajalõpu (`FETCH_TIMEOUT_MS` või `REQUEST_TIMEOUT_MS`, kui see määrab fetchi vaikeväärtuse). Määrake `targetTimeoutMs` kombinatsioonis, -kombinatsiooni vaikeväärtustes või teenusepakkuja alistuses ainult selleks, et kombinatsiooni varuvariandile -üleminek oleks kiirem; praegusest ülesvoolu ajalõpust suuremad väärtused piiratakse ülesvoolu ajalõpuga. +kombinatsiooni vaikeväärtustes või teenusepakkuja alistuses ainult selleks, et muuta kombinatsiooni varuvariandile üleminek kiiremaks; praegusest +ülesvoolu ajalõpust suuremad väärtused piiratakse ülesvoolu ajalõpuga. -`comboTimeoutMs` on eraldiseisev kogu kombinatsiooni seinaajakellal põhinev eelarve kõigi tõrkeümberlülituse sihtmärkide peale. -Jätke see määramata või määrake väärtuseks `0`, et iteratsioon jääks piiramatuks (10-minutiline -`COMBO_LOOP_SAFETY_TIMEOUT_MS` hangumise peatamise mehhanism kehtib endiselt). Positiivne väärtus asendab selle -kombinatsiooni turvamehhanismi. Hoidke `comboTimeoutMs` pikem kui `targetTimeoutMs`, et tõrkeümberlülituseks -jääks pärast aeglast esimest sihtmärki veel aega. +`comboTimeoutMs` on eraldi kogu kombinatsiooni seinakella-aja eelarve kõigi tõrkesiirde sihtmärkide peale. +Jätke see määramata või määrake väärtuseks `0`, et säilitada piiramatu iteratsioon (10-minutiline +`COMBO_LOOP_SAFETY_TIMEOUT_MS` hangumise peatamine kehtib endiselt). Positiivne väärtus asendab selle +kombinatsiooni turvamehhanismi. Hoidke `comboTimeoutMs` pikemana kui `targetTimeoutMs`, et tõrkesiirdeks +jääks pärast aeglast esimest sihtmärki endiselt aega. ### Kaitselüliti läviväärtused Teenusepakkuja taseme kaitselüliti häälestamine. Vaikeväärtused kajastavad alates versioonist v3.6 vähemalt 500 ühenduse jaoks kasutatud skaleeritud väärtusi. -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ------------------------------------------------------------- | ------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | OAuthi pakkujate järjestikuste tõrgete lävi, mille ületamisel kaitselüliti rakendub. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuthi pakkuja kaitselüliti lähtestusaken (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-võtmega pakkujate järjestikuste tõrgete lävi. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-võtmega pakkuja kaitselüliti lähtestusaken (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Kohalike pakkujate (Ollama, LM Studio, ...) järjestikuste tõrgete lävi. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Kohaliku pakkuja kaitselüliti lähtestusaken (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: tõrgete arv aknas enne kogu OAuthi pakkuja ooteajale lülitumist. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: OAuthi pakkujate libisev tõrgete loendusaken (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: ooteaeg (ms) pärast OAuthi pakkuja läve saavutamist. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuthi pakkuja läheb olekusse DEGRADED pärast nii mitut tõrget. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuthi pakkuja `resetTimeout`-i suurendamise maksimaalne kordaja. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuthi pakkuja viiteaega suurendatakse pärast nii mitut avatud tsüklit. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: tõrgete arv aknas enne kogu API-võtmega pakkuja ooteajale lülitumist. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: API-võtmega pakkujate libisev tõrgete loendusaken (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: ooteaeg (ms) pärast API-võtmega pakkuja läve saavutamist. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-võtmega pakkuja läheb olekusse DEGRADED pärast nii mitut tõrget. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-võtmega pakkuja `resetTimeout`-i suurendamise maksimaalne kordaja. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-võtmega pakkuja viiteaega suurendatakse pärast nii mitut avatud tsüklit. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: tõrgete arv enne kogu kohaliku pakkuja ooteajale lülitumist. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: kohalike pakkujate libisev tõrgete loendusaken (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: ooteaeg (ms) pärast kohaliku pakkuja läve saavutamist. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Viitetase, mille puhul kontekstivahemälu kinnistuse pakkuja loetakse püsivalt mittetöötavaks ja kinnistus eemaldatakse tõrkesiirdeks. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Kõikumisvastane aken (ms), mis lubab lühiajalisi mööduvaid ooteaegu enne kontekstivahemälu kinnistuse eemaldamist. | +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ------------------------------------------------------------- | ------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | OAuthi pakkujate järjestikuste tõrgete lävi, mille järel kaitselüliti rakendub. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuthi pakkuja kaitselüliti lähtestusaken (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-võtmega pakkujate järjestikuste tõrgete lävi. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-võtmega pakkuja kaitselüliti lähtestusaken (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Kohalike pakkujate (Ollama, LM Studio, ...) järjestikuste tõrgete lävi. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Kohaliku pakkuja kaitselüliti lähtestusaken (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: tõrgete arv aknas, mille järel läheb kogu OAuthi pakkuja jahtumisrežiimi. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: OAuthi pakkujate tõrgete arvu libisev aken (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: jahtumisaeg (ms) pärast OAuthi pakkuja läveni jõudmist. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuthi pakkuja läheb olekusse DEGRADED sellise tõrgete arvu juures. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuthi pakkuja `resetTimeout`-i suurendamise maksimaalne kordaja. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuthi pakkuja suurendab viivitust pärast sellist arvu avatud tsükleid. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: tõrgete arv aknas, mille järel läheb kogu API-võtmega pakkuja jahtumisrežiimi. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: API-võtmega pakkujate tõrgete arvu libisev aken (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: jahtumisaeg (ms) pärast API-võtmega pakkuja läveni jõudmist. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-võtmega pakkuja läheb olekusse DEGRADED sellise tõrgete arvu juures. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-võtmega pakkuja `resetTimeout`-i suurendamise maksimaalne kordaja. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-võtmega pakkuja suurendab viivitust pärast sellist arvu avatud tsükleid. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: tõrgete arv, mille järel läheb kogu kohalik pakkuja jahtumisrežiimi. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: kohalike pakkujate tõrgete arvu libisev aken (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Pakkuja taseme kaitselüliti: jahtumisaeg (ms) pärast kohaliku pakkuja läveni jõudmist. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Viivitustase, mille juures loetakse kontekstivahemälu kinnituse pakkuja püsivalt mittetoimivaks ning kinnitus eemaldatakse tõrkesiirde võimaldamiseks. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Võnkumisvastane aken (ms), mis lubab enne kontekstivahemälu kinnituse eemaldamist lühikesi ajutisi jahtumisperioode. | ### Stsenaariumid -| Stsenaarium | Konfiguratsioon | -| ------------------------------------------ | ------------------------------------------------------ | -| **Pikaajaline koodi genereerimine** | `REQUEST_TIMEOUT_MS=900000` (15 min) | -| **Voo kogukestuse piiramine** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | -| **Kiire tõrge tootmiskeskkonna API puhul** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Laiendatud arutlusega mudelid** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min plokkide vahel) | +| Stsenaarium | Konfiguratsioon | +| ------------------------------------------ | -------------------------------------------------------- | +| **Pikaajaline koodi genereerimine** | `REQUEST_TIMEOUT_MS=900000` (15 min) | +| **Voo kogukestuse piiramine** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | +| **Kiire tõrge tootmiskeskkonna API jaoks** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Laiendatud mõtlemisega mudelid** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min andmeosade vahel) | --- @@ -1113,68 +1122,68 @@ Anthropicuga ühilduv pakkuja. --- -## 21. Puhverserveri tervislik seisund - -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Kiire tõrke tuvastamise tervisekontrolli ajalõpp. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Ajavahemik (tundides), mille põhjal arvutatakse latentsusele optimeeritud puulistrateegias kandidaatprokside keskmine latentsus. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Tervisekontrolli tulemuse vahemälu TTL. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Ebaõnnestunud proksi tervisekontrollide vahemälu TTL. Hoidke see lühem kui `PROXY_HEALTH_CACHE_TTL_MS`, et ajutiste proksi ajalõppude korral suure samaaegsuse juures proovitaks kiiresti uuesti, ilma et tõeliselt mittetoimivate prokside kiire tõrketuvastus keelataks. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Määrake väärtuseks `false`, et keelata taustal töötav prokside tervisekontrollide ajastaja, mis kontrollib perioodiliselt registreeritud prokse. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Taustal töötava tervisekontrollide ajastaja kontrollitsükli intervall millisekundites (minimaalselt `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ühenduvuskontrolli sihtkoht, mida kasutavad ajastaja ja lõpp-punkt `/api/settings/proxies/auto-test`. Avaliku vaikeväärtuse vältimiseks suunake see sisemisele või isemajutatud URL-ile. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Ühe partii kohta korraga käivitatavate kontrollide arv, mida jagavad ajastaja ja lõpp-punkt `/api/settings/proxies/auto-test`. Ümardatakse allapoole täisarvuni, minimaalselt 1 ja maksimaalselt 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Viivitus millisekundites kahe samasse partiisse kuuluva kontrolli väljasaatmise vahel. Ilma selleta saadetakse kogu partii välja samal hetkel ja ühine väljaminev IP võib käivitada sihtkoha kiiruspiirangu. Hajutamise keelamiseks määrake väärtuseks `0`; maksimaalne väärtus on 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Määrake väärtuseks "false", et lõpetada proksile määratud teenusepakkuja tegeliku hosti kontrollimine (`GET /models`, ilma API võtmeta) ja kasutada selle asemel alati väärtust `PROXY_HEALTH_TEST_URL`. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Kui väärtus on `false` (vaikimisi), on automaatsed ühenduvuskontrollid (ajastaja + lehe `/api/settings/proxies/auto-test` nupp "Testi kõiki") **kirjutuskaitstud** ega muuda kunagi proksi olekut — aktiivse või passiivse oleku määrab ainult operaator, mistõttu ebastabiilne kontroll ei saa määratud proksit kasutuskõlbmatuks muuta (#6246). Varasema kontrolli-ja-määra-käitumise taastamiseks määrake väärtuseks `true`. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Vabatahtlik funktsioonilipp (vt [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); juhtpaneeli andmebaasi ülekirjutus on prioriteetsem). `true` (või `1`, `yes`) kuvab juhtpaneelil proksipuuli all kirjutuskaitstud väljamineva liikluse vaatluse (erinevad väljaminevad IP-d, ühendused ja viimase 24 tunni jooksul ühe IP taga kõige sagedamini nähtud ühenduste arv, võetud proksilogist). Seda ei kasutata kunagi marsruutimiseks. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Määrake väärtuseks `true`, et lubada ajastajal proksid pärast korduvaid järjestikuseid tõrkeid automaatselt eemaldada. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Järjestikuste tõrgete arv, mille järel ajastaja eemaldab proksi automaatselt (kui `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Määrake väärtuseks `true`, et ajastaja proksi korduvate järjestikuste tõrgete järel eemaldamise asemel pehmelt keelaks (olek `dead`, seda ei kustutata kunagi). See on `PROXY_AUTO_REMOVE`-i mittelaastav alternatiiv: proksi eemaldatakse kohe puuli ja rotatsiooni lahendamisest (ulatusepuuli lahendamisel kasutatav elusoleku olekufilter juba välistab selle) ning aktiveeritakse automaatselt uuesti, kui see hakkab taas kontrolle läbima. Kasutab sama lävendit `PROXY_AUTO_REMOVE_AFTER`. Kui mõlemad lipud on `true`, on `PROXY_AUTO_REMOVE` prioriteetsem. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Lubab OAuthi ja teenusepakkuja valideerimisvoogudel fikseeritud proksist mööda minna ning luua otseühenduse, kui proksi ühenduvuse eelkontrollid ebaõnnestuvad. Tegelik prioriteedijärjekord on funktsioonilipu andmebaasi ülekirjutus > keskkonnamuutuja > vaikeväärtus. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `open-sse/services/rateLimitManager.ts` | Maksimaalne ooteaeg pärast vastust 429, enne kui päring loetakse nurjunuks. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Ülempiir ajale, mille jooksul vastuvõetud päring võib jääda täitmisse enne selle kiiruspiirangu reservatsiooni aegumist — see on järjekorra ooteaja eelarvest lahutatud, et aeglane päringu käivitumine mitteinkrementaalsetes lüüsides ei põhjustaks ajalõppu (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (keelatud) | `open-sse/services/rateLimitManager.ts` | Järjekorda lubamise ülempiir: kui nii palju päringuid on juba järjekorras, lükatakse uus päring tagasi vastusega 429 `queue_full`. `0` = piiramatu (vaikimisi). | -| `RATE_LIMIT_AUTO_ENABLE` | _(määramata)_ | `open-sse/services/rateLimitManager.ts` | Sunnib kiiruspiirangu automaatse lubamise turvamehhanismi sisse või välja sõltumata juhtpaneelil salvestatud sättest. Sundlubamiseks aktsepteeritakse väärtusi `true`/`1`/`on`, sundkeelamiseks väärtusi `false`/`0`/`off`. | -| `PROVIDER_COOLDOWN_ENABLED` | _(määramata → väljas)_ | `open-sse/services/providerCooldownTracker.ts` | Vabatahtlik globaalne päringuteülene teenusepakkuja/ühenduse jahtumisaja jälgimine. Vaikimisi VÄLJAS (kattub ühenduse jahtumisaja / teenusepakkuja kaitselülitiga). Lubamiseks aktsepteeritakse väärtusi `true`/`1`/`on`. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimaalne jahtumisaeg (ms), enne kui nurjunud teenusepakkujat/ühendust proovitakse uuesti. Suureneb järjestikuste tõrgete korral eksponentsiaalselt. Kasutatakse ainult siis, kui `PROVIDER_COOLDOWN_ENABLED` on lubatud. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Maksimaalne jahtumisaja ülempiir (ms), mille järel proovitakse nurjunud teenusepakkujat/ühendust igal juhul uuesti. Kasutatakse ainult siis, kui `PROVIDER_COOLDOWN_ENABLED` on lubatud. | -| `STREAM_RECOVERY_ENABLED` | _(määramata → väljas)_ | `src/lib/resilience/settings.ts` (algväärtus) → `open-sse/services/streamRecovery.ts` (loogika) | **Mis:** ülesvoolu kärbitud voogude läbipaistev taastamine (free-claude-code'i port). Hoiab SSE avamisakent kuni `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), nii et _enne kinnitamist_ toimunud katkestus — mis leiab aset enne, kui ükski bait jõuab kliendini — avatakse uuesti ja seda proovitakse nähtamatult korrata. **Millal lubada:** ebastabiilsed ülesvoolud, mis kärbivad voo alguses sageli 0 baiti; jätke VÄLJA, kui te ei saa lubada iga voo esimese tokeni saabumisaja pikenemist kuni 750 ms võrra. Aktsepteerib väärtusi `true`/`1`/`on`. Määrab salvestatud töökindluse sätte algväärtuse; pärast juhtpaneelil määramist on juhtpaneeli säte prioriteetsem. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(määramata → väljas)_ | `src/lib/resilience/settings.ts` (algväärtus) → `open-sse/services/streamRecovery.ts` (loogika) | **Mis:** voo keskelt jätkamine (etapp 4.4) — pärast _kinnitamisjärgset_ kärpimist (baidid on juba kliendini jõudnud) esitatakse osaline tekst assistendi eeltäitena uues päringus ja puuduv järelliide liidetakse sellele. Ainult lihttekstilised OpenAI-ga ühilduvad vood; seda ei käivitata kunagi poolelioleva tööriistakutse korral. **Millal lubada:** pikad genereerimised, mis katkevad vastuse keskel, ja te aktsepteerite taastatud lõpu saabumist ühe puhanguna, mitte tokenite kaupa. Sõltumatu sättest `STREAM_RECOVERY_ENABLED` (erinev riskiprofiil). Aktsepteerib väärtusi `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(määramata → väljas)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Vabatahtlik aktiivse voo kasuliku väljundi valvekoer. Tuvastab vood, mis jätkavad andmeosade saatmist, kuid jäävad alla assistendi väljundi seadistatud kiiruse; südamelöögid, kasutussündmused, tühjad deltad ning tööriista- ja arutlusfaasid ei jäta ekslikult edenemise muljet. Eraldiseisev jõudeoleku ja lõpliku tähtaja ajalõppudest. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Ajapikendus enne läbilaskevõime hindamist, piiratud vahemikku 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Jooksev kasuliku väljundi aken, piiratud vahemikku 1000–600000 ms; enne katkestamist on nõutav üks täielik aken. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Assistendi UTF-8 väljundi minimaalne baidikiirus (konservatiivne tokenite asendusmõõdik), piiratud vahemikku 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Mõõdetavaks peetava nullist erineva kasuliku väljundi valimi minimaalne suurus, piiratud vahemikku 1–1000000 baiti. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Hajutusintervall (ms) teenusepakkuja tokenite tervisekontrollide vahel käivitamisel. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimaalne juhuslik nihe (ms), mis lisatakse teenusepakkuja tokenite tervisekontrollide vahel väärtusele `HEALTHCHECK_STAGGER_MS`, et vältida koormuspuhanguid (probleem #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maksimaalne juhuslik nihe (ms), mis lisatakse teenusepakkuja tokenite tervisekontrollide vahel väärtusele `HEALTHCHECK_STAGGER_MS`, et vältida koormuspuhanguid (probleem #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Samaaegsete kontrollide partii suurus käivitamisel tehtava tokenite tervisekontrolli tsükli jaoks; suuremad väärtused kontrollivad paralleelselt rohkem ühendusi, väiksemad väärtused vähendavad koormuspuhangut (probleem #7875, probleemi #7719 regressioon). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Automaatsete korduskatsete arv mudelipõhiste jahtumisaja vastuste korral enne vea kliendile tagastamist. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maksimaalne taganemisintervall (sekundites) jahtumisaja korduskatsete vahel. Piiratakse selle väärtusega sõltumata ülesvoolu päisest `Retry-After`. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroomi tokenisäästuproksi URL. Juhtpaneeli elutsükkel (`api/headroom/*`) käivitab vaikimisi tagasisideaadressil kohaliku `headroom-ai` CLI; kirjutage üle ainult välisele Dockeri sidecar-proksile osutamiseks. | +## 21. Puhverserveri seisund + +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Kiire tõrke tuvastamise seisundikontrolli ajalõpp. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Ajavahemik (tundides), mille põhjal arvutatakse latentsusoptimeeritud kogumi strateegias kandidaatpuhverserverite keskmine latentsus. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Seisundikontrolli tulemuste vahemälu TTL. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Nurjunud puhverserveri seisundikontrollide vahemälu TTL. Hoidke see lühem kui `PROXY_HEALTH_CACHE_TTL_MS`, et suure paralleelsuse korral prooviks süsteem ajutise puhverserveri ajalõpu järel kiiresti uuesti, lülitamata samal ajal välja tõeliselt mittetöötavate puhverserverite kiiret tõrketuvastust. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Määrake väärtuseks `false`, et keelata taustal töötav puhverserverite seisundiplaanur, mis kontrollib registreeritud puhverservereid perioodiliselt. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Taustal töötava seisundiplaanuri kontrollitsükli intervall millisekundites (minimaalselt `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ajastaja ja lõpp-punkti `/api/settings/proxies/auto-test` kasutatav kättesaadavuse kontrolli sihtmärk. Avaliku vaikeväärtuse vältimiseks määrake selleks sisemine/ise hostitud URL. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Ühes paketis korraga käivitatavate kontrollide arv, mida jagavad ajastaja ja lõpp-punkt `/api/settings/proxies/auto-test`. Minimaalne väärtus on 1 ja maksimaalne 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Viivitus millisekundites kahe samas paketis oleva kontrolli väljasaatmise vahel. Ilma selleta saadetakse kogu pakett välja samal hetkel ja ühine väljaminev IP-aadress võib käivitada sihtmärgi päringusageduse piirangu. Vahede keelamiseks määrake väärtuseks `0`; maksimaalne väärtus on 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Määrake väärtuseks "false", et lõpetada puhverserverile määratud teenusepakkuja tegeliku hosti kontrollimine (`GET /models`, ilma API-võtmeta) ja kasutada selle asemel alati väärtust `PROXY_HEALTH_TEST_URL`. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Kui väärtus on `false` (vaikimisi), on automaatsed kättesaadavuse kontrollid (ajastaja + lõpp-punkti `/api/settings/proxies/auto-test` nupp "Testi kõiki") **kirjutuskaitstud** ega muuda kunagi puhverserveri olekut — aktiivse/mitteaktiivse oleku määrab ainult operaator, et ebastabiilne kontroll ei saaks määratud puhverserverit kasutusest välja jätta (#6246). Varasema kontrolli-ja-määra käitumise taastamiseks määrake väärtuseks `true`. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Lubatav funktsioonilipp (vt [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); juhtpaneeli andmebaasi ülekirjutus on prioriteetne). Väärtus `true` (või `1`, `yes`) kuvab juhtpaneelil puhverserverite kogumi all kirjutuskaitstud väljamineva liikluse vaatluse (erinevad väljaminevad IP-aadressid, ühendused ja viimase 24 tunni jooksul ühe IP-aadressi taga kõige sagedamini nähtud ühenduste arv puhverserveri logist). Seda ei kasutata kunagi marsruutimiseks. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Määrake väärtuseks `true`, et lubada ajastajal puhverserverid pärast korduvaid järjestikuseid tõrkeid automaatselt eemaldada. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Järjestikuste tõrgete arv, mille järel ajastaja eemaldab puhverserveri automaatselt (kui `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Määrake väärtuseks `true`, et ajastaja märgiks puhverserveri pärast korduvaid järjestikuseid tõrkeid ajutiselt keelatuks (olek `dead`, seda ei kustutata), selle asemel et see eemaldada. `PROXY_AUTO_REMOVE`-i mittelagundav alternatiiv: puhverserver eemaldatakse kohe puuli/rotatsiooni lahendusest (ulatuse puuli lahenduses kasutatav aktiivse oleku filter juba välistab selle) ja aktiveeritakse automaatselt uuesti, kui see hakkab kontrollpäringuid taas läbima. Kasutab sama `PROXY_AUTO_REMOVE_AFTER` lävendit. Kui mõlemad lipud on `true`, on `PROXY_AUTO_REMOVE` ülimuslik. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Lubab OAuthi ja teenusepakkuja valideerimisvoogudel kinnistatud puhverserverist mööduda ning luua otseühenduse, kui puhverserveri kättesaadavuse eelkontrollid ebaõnnestuvad. Tegelik prioriteedijärjestus on funktsioonilippude andmebaasi alistus > keskkonnamuutuja > vaikeväärtus. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `src/lib/resilience/settings.ts` | **Järjekorras ootamise** vaike-eelarve: kui kaua võib päring oodata teenusepakkuja vaba kohta ja püsida järjekorras, enne kui see tagasi lükatakse ega jõua kunagi ülesvooluteenusesse. Taimer tühistatakse kohe, kui töö käivitub — täitmisele seab eraldi piiri `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Keskkonnamuutuja määrab ainult vaikeväärtuse: püsiv `resilienceSettings.requestQueue.maxWaitMs` ja seejärel ühendusepõhine `rateLimitOverrides.maxWaitMs` on kumbki sellest ülimuslikud. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Ülempiir, kui kaua võib vastu võetud päring olla täitmisel, enne kui selle kiiruspiirangu reserveering aegub — see on järjekorras ootamise eelarvest lahutatud, et aeglane päringu käivitumine mitteinkrementaalsetes lüüsides ei põhjustaks ajalõppu (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (keelatud) | `open-sse/services/rateLimitManager.ts` | Järjekorda vastuvõtmise ülempiir: kui nii palju päringuid on juba järjekorras, lükatakse päring tagasi vastusega 429 `queue_full`. `0` = piiramatu (vaikeväärtus). | +| `RATE_LIMIT_AUTO_ENABLE` | _(määramata)_ | `open-sse/services/rateLimitManager.ts` | Sunnib kiiruspiirangu automaatse lubamise turvamehhanismi sisse või välja, sõltumata töölaua püsivast seadest. Sisselülitamise sundimiseks aktsepteerib väärtusi `true`/`1`/`on`, väljalülitamise sundimiseks väärtusi `false`/`0`/`off`. | +| `PROVIDER_COOLDOWN_ENABLED` | _(määramata → väljas)_ | `open-sse/services/providerCooldownTracker.ts` | Vabatahtlikult sisselülitatav globaalne päringuteülene teenusepakkuja/ühenduse ooteaja jälgimine. Vaikimisi VÄLJAS (kattub ühenduse ooteaja / teenusepakkuja kaitselülitiga). Lubamiseks aktsepteerib väärtusi `true`/`1`/`on`. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Minimaalne ooteaeg (ms), enne kui nurjunud teenusepakkujat/ühendust proovitakse uuesti. Järjestikuste tõrgete korral suureneb eksponentsiaalselt. Kasutatakse ainult siis, kui `PROVIDER_COOLDOWN_ENABLED` on lubatud. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Maksimaalne jahtumisaja piirang (ms), mille järel ebaõnnestunud pakkujat/ühendust proovitakse sellest hoolimata uuesti. Kasutatakse ainult siis, kui `PROVIDER_COOLDOWN_ENABLED` on lubatud. | +| `STREAM_RECOVERY_ENABLED` | _(määramata → väljas)_ | `src/lib/resilience/settings.ts` (algväärtus) → `open-sse/services/streamRecovery.ts` (loogika) | **Mis:** ülesvoolu kärbitud voogude läbipaistev taastamine (free-claude-code'i port). Hoiab algavat SSE-akent avatuna kuni `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), et _enne kinnitamist_ toimuv katkestus — mis leiab aset enne, kui ükski bait kliendini jõuab — avataks uuesti ja seda proovitaks nähtamatult uuesti. **Millal lubada:** ebastabiilsed/ülesvooluteenused, mis kärbivad voo alguses sageli 0 baiti; jätke VÄLJA, kui te ei saa lubada igale voole kuni 750 ms lisandumist esimese tokenini jõudmise ajale. Aktsepteerib väärtusi `true`/`1`/`on`. Määrab püsiva vastupidavussätte algväärtuse; pärast töölaua sätte määramist on sellel ülimuslikkus. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(määramata → väljas)_ | `src/lib/resilience/settings.ts` (algväärtus) → `open-sse/services/streamRecovery.ts` (loogika) | **Mis:** voo keskel jätkamine (faas 4.4) — pärast _kinnitamisjärgset_ kärpimist (baidid on juba kliendini jõudnud) tehakse osalise tekstiga assistendi eeltäitena uus päring ja puuduv järelliide liidetakse külge. Ainult lihttekstilised OpenAI-ga ühilduvad vood; seda ei käivitata kunagi poolelioleva tööriistakutse ajal. **Millal lubada:** pikad genereerimised, mis katkevad vastuse keskel, ja te aktsepteerite, et taastatud lõpp saabub tokenhaaval edastamise asemel ühe kogumina. Sõltumatu sättest `STREAM_RECOVERY_ENABLED` (erinev riskiprofiil). Aktsepteerib väärtusi `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(määramata → väljas)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Valikuline aktiivse voo kasuliku väljundi valve. Tuvastab vood, mis jätkavad andmeplokkide saatmist, kuid jäävad alla konfigureeritud assistendi väljundkiiruse; südamelöögid, kasutussündmused, tühjad deltad ning tööriista- ja arutlusetapid ei jäta ekslikku muljet edenemisest. Jõudeoleku ja absoluutse tähtaja ajalõppudest eraldiseisev. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Ajapikendus enne läbilaskevõime hindamist, piiratud vahemikku 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Kasuliku väljundi libisev aken, piiratud vahemikku 1000–600000 ms; enne katkestamist peab mööduma üks täielik aken. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimaalne UTF-8 assistendi väljundi baidikiirus (konservatiivne tokenite asendusmõõdik), piiratud vahemikku 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Minimaalne nullist erinev kasuliku väljundi valim, mida peetakse mõõdetavaks, piiratud vahemikku 1–1000000 baiti. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Viivitusintervall (ms) pakkujate tokenite tervisekontrollide vahel käivitamisel. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimaalne juhuslik hajutus (ms), mis lisatakse pakkujate tokenite tervisekontrollide vahel väärtusele `HEALTHCHECK_STAGGER_MS`, et vältida päringute kuhjumist (probleem #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maksimaalne juhuslik hajutus (ms), mis lisatakse pakkujate tokenite tervisekontrollide vahel väärtusele `HEALTHCHECK_STAGGER_MS`, et vältida päringute kuhjumist (probleem #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Samaaegsete kontrollide paketi suurus käivitamisel toimuva tokenite seisundi kontrollimise jaoks; suuremad väärtused kontrollivad rohkem ühendusi paralleelselt, väiksemad väärtused vähendavad hetkelist koormust (probleem #7875, probleemi #7719 regressioon). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Automaatsete korduskatsete arv mudelipõhiste ooteajavastuste korral enne kliendile vea tagastamist. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Maksimaalne eksponentsiaalse ooteaja intervall (sekundites) ooteajaga seotud korduskatsete vahel. See väärtus kehtib ülempiirina sõltumata ülesvoolu `Retry-After` väärtusest. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroomi tokenisäästu puhverserveri URL. Juhtpaneeli elutsükkel (`api/headroom/*`) käivitab vaikimisi tagasisideaadressil kohaliku `headroom-ai` CLI; muutke seda ainult välisele Dockeri sidecar-puhverserverile osutamiseks. | ### Voo taastamise häälestuskonstandid Taastamise viivituskäitumist häälestatakse failis -`open-sse/config/constants.ts` (`STREAM_RECOVERY`) olevate püsikodeeritud konstantidega, mis on siin viitamiseks esitatud — -nende muutmine nõuab koodi muutmist, mitte keskkonnamuutujat: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — kui kaua hoitakse SSE avamisakent ootel, - et varajase katkestuse korral saaks enne ühegi baidi kliendile edastamist uuesti proovida. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — ootel oleva akna range ülempiir; edastamine - (puhvri tühjendamine + otseedastus) algab kohe, kui koguneb nii palju baite, olenemata taimerist. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — ülesvooluvoo läbipaistvate taasavamiste maksimaalne arv, - kuni ootel olevat sisu pole veel edastatud. - -> **Teenusepakkujapõhine libiseva akna kiirusepiirang (keskkonnamuutujata):** FCC-st üle toodud -> teenusepakkujapõhise libiseva akna kiirusepiirangu _varumehhanism_ on koodis olemas +`open-sse/config/constants.ts` (`STREAM_RECOVERY`) kõvakodeeritud konstantidega, mis on siin esitatud viitamiseks — +nende muutmine nõuab koodi redigeerimist, mitte keskkonnamuutujat: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — kui kaua hoitakse SSE avamisakent kinni, + et varajase katkemise korral saaks enne kliendile mis tahes baidi edastamist uuesti proovida. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — kinnihoitava akna range ülempiir; kinnitamine + (puhverdamine + läbipääs) toimub kohe, kui koguneb nii palju baite, sõltumata taimerist. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — ülesvoolu voo läbipaistvate taasavamiste maksimaalne arv, + kuni kinnihoitud andmed pole veel kinnitatud. + +> **Teenusepakkuja-põhine libiseva akna kiiruspiirang (keskkonnamuutujata):** FCC-st üle toodud +> teenusepakkuja-põhise libiseva akna kiiruspiirangu _varumehhanism_ on koodis olemas > (`open-sse/services/providerDefaultRateLimit.ts`, ühendatud faili -> `open-sse/services/rateLimitManager.ts` kaudu), kuid tarnitakse **tühja vaikekaardiga** -> ja sellel **pole praegu operaatori keskkonnamuutujat** — see lubatakse ainult testikonksu / -> koodimuudatuse kaudu. Seda pole tahtlikult ülalolevas tabelis loetletud. `(token, IP)`-põhine -> releepiiraja, millel _on_ seadistusvõimalus, on `RELAY_IP_PER_MINUTE` (§3 Võrk ja pordid). +> `open-sse/services/rateLimitManager.ts` kaudu), kuid see tarnitakse **tühja vaikekaardiga** +> ja sellel **pole praegu operaatori keskkonnamuutujat** — see lubatakse ainult testkonksu / +> koodimuudatuse kaudu. Seda ei ole teadlikult ülaltoodud tabelis loetletud. `(token, IP)`-põhise +> releepiiraja seadistus, millel _on_ muudetav parameeter, on `RELAY_IP_PER_MINUTE` (§3 Võrk ja pordid). --- @@ -1183,32 +1192,33 @@ nende muutmine nõuab koodi muutmist, mitte keskkonnamuutujat: > [!CAUTION] > Need muutujad tekitavad **üksikasjaliku väljundi** ja võivad lekitada tundlikke andmeid. **Ärge kunagi lubage neid tootmiskeskkonnas.** -| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | -| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(määramata)_ | `open-sse/executors/cursor.ts` | Määrake väärtuseks `1`, et lubada Cursori täituri üksikasjalikud logid (dekodeeritud SSE-osad jne). | -| `CURSOR_STREAM_DEBUG` | _(määramata)_ | `open-sse/executors/cursor.ts` | Muutuja `CURSOR_DEBUG` tagasiühilduv alias. | -| `CURSOR_DUMP_FILE` | _(määramata)_ | `open-sse/executors/cursor.ts` | Valikuline failitee, kuhu kirjutatakse dekodeeritud Cursori toorosad, kui `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursori täituri voo jõudeoleku ajalõpp (ms). | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Ooteaken (ms) pärast composer'i kv_after_text pehmet lõpetajat, kui baite on veel puhvris — annab järgnevale exec_mcp tööriistakutsele aega oma kaader lõpule viia. | -| `CURSOR_TOOL_DIRECTIVE` | lubatud (`!== "0"`) | `open-sse/executors/cursor.ts` | Tööriista kinnitamise direktiiv, mis paneb composer-2.5 tööriistakutseid usaldusväärselt väljastama. Keelamiseks määrake `0`. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(määramata)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Operaatori määratud süsteemiviiba tekst, mis lisatakse süsteemisõnumile PÄRAST tõlkimist (tõlkimisjärgne sisestus) ning jõuab codex/Responses- ja `/v1/messages`-teedeni. Seda kasutatakse ka direktiivi prefiksina, mis eemaldatakse tagasi kajatud süsteemi preambula plokkidest. Keelamiseks jätke määramata. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Pildipõhine toomise ajalõpp (ms) kaug-`image_url`-i nägemissisendi jaoks. | -| `CURSOR_STATE_DB_PATH` | _(tuvastatakse)_ | `open-sse/utils/cursorVersionDetector.ts` | Alistab Cursori IDE versiooni tuvastamiseks kasutatava olekuandmebaasi otsingu. | -| `CURSOR_AGENT_CLI_VERSION` | _(tuvasta / fikseeri)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI järgu ID (`YYYY.MM.DD-`) päise `x-cursor-client-version: cli-…` jaoks Agent Runis. | -| `CURSOR_AGENT_BIN` | _(määramata)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Piltide genereerimiseks kasutatava Cursor Agenti kahendfaili tee. Kui see on määramata, kasutab töötleja kõigepealt `providerSpecificData.agentBin` ja seejärel PATH-i. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agenti pilditööde pildipõhine kogukestuse piirang (ms). | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jagatud kasutuskoha samaaegsuse piirang Cursori pilditöödele. | -| `CURSOR_IMG_MODEL` | päring / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Alistab Cursori CLI `--model` väärtuse pilditööde jaoks. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) pildigeneratsiooni tulemuse kontrollimise intervall (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC pildigeneratsiooni tulemuse kontrollimise kogukestuse piirang (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) videogeneratsiooni tulemuse kontrollimise intervall (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC videogeneratsiooni tulemuse kontrollimise kogukestuse piirang (ms). | -| `CURSOR_DATA_DIR` | _(tuvastatakse)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Alistab Cursor Agent CLI andmekataloogi (`…/versions/`); sama muutujat kasutab ametlik agent. | -| `CURSOR_TOKEN` | _(määramata)_ | `scripts/ad-hoc/cursor-tap.cjs` | Otsene Cursori kandjatõend, mida kasutavad arendaja tööriistad. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | keelatud (lubamiseks määrake `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Logib suurte vestluste kasulike koormuste sisutüübi ja pikkuse markerid, kui määratud on `"1"`. Logimüra vähendamiseks on see vaikimisi välja lülitatud. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(määramata)_ | `open-sse/handlers/responseTranslator.ts` | Määrake väärtuseks `true`, et logida Responses API SSE→JSON tõlkimise üksikasjad. | -| `DEBUG_CLAUDE_NONSTREAM` | _(määramata)_ | `open-sse/handlers/responseTranslator.ts` | Määrake väärtuseks `true`, et tuua Claude'i vastuse tõlkimisteel esile tühjad textContent-osad (ainult silumiseks). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(määramata)_ | E2E testiraamistik | Määrake väärtuseks `true`, et lubada E2E-testirežiim (leevendatud autentimine, testikonksud). | +| Muutuja | Vaikeväärtus | Lähtefail | Kirjeldus | +| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(määramata)_ | `open-sse/executors/cursor.ts` | Määrake väärtuseks `1`, et lubada Cursori käituri üksikasjalikud logid (dekodeeritud SSE-fragmendid jne). | +| `CURSOR_STREAM_DEBUG` | _(määramata)_ | `open-sse/executors/cursor.ts` | Muutuja `CURSOR_DEBUG` tagasiühilduv alias. | +| `CURSOR_DUMP_FILE` | _(määramata)_ | `open-sse/executors/cursor.ts` | Valikuline failitee, kuhu kirjutatakse töötlemata dekodeeritud Cursori fragmendid, kui `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursori käituri voo jõudeoleku ajalõpp (ms). | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Ajapikendus (ms) pärast composeri `kv_after_text` pehmet terminaatorit, kui baite on veel puhvris — annab järgnevale `exec_mcp` tööriistakutsele aega oma kaader lõpule viia. | +| `CURSOR_TOOL_DIRECTIVE` | lubatud (`!== "0"`) | `open-sse/executors/cursor.ts` | Tööriista kinnitamise direktiiv, mis paneb composer-2.5 tööriistakutseid usaldusväärselt tegema. Keelamiseks määrake väärtuseks `0`. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(määramata)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Operaatori määratud süsteemiviiba tekst, mis lisatakse süsteemisõnumile PÄRAST tõlkimist (tõlkimisjärgne sisestus) ning jõuab codex/Responses- ja `/v1/messages`-teedeni. Seda kasutatakse ka direktiivi prefiksina, mis eemaldatakse tagastatud süsteemi preambuliplokkidest. Keelamiseks jätke määramata. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (väljas) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Määrake väärtuseks `1`, et eemaldada openai→claude-voo algusest tagastatud süsteemiviiba preambuliplokid. Vaikimisi väljas — heuristika on kujundatud ingliskeelse proosa järgi ja muudab vastuse sisu, mistõttu läheks sellise jaotisega õiguspäraselt algav vastus kaduma. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Kaugallika `image_url` visuaalsisendi toomise ajalõpp pildi kohta (ms). | +| `CURSOR_STATE_DB_PATH` | _(automaatselt otsitud)_ | `open-sse/utils/cursorVersionDetector.ts` | Alistab Cursori IDE olekuandmebaasi otsingu, mida kasutatakse IDE versiooni tuvastamiseks. | +| `CURSOR_AGENT_CLI_VERSION` | _(tuvasta / fikseeri)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI järgu ID (`YYYY.MM.DD-`) päise `x-cursor-client-version: cli-…` jaoks Agent Runis. | +| `CURSOR_AGENT_BIN` | _(määramata)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Piltide genereerimiseks kasutatava Cursor Agenti binaarfaili tee. Kui see on määramata, kasutab töötleja esmalt `providerSpecificData.agentBin` ja seejärel muutujat PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agenti pilditööde täitmise kogukestuse piirang pildi kohta (ms). | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jagatud kasutuskoha samaaegsuspiirang Cursori pilditöödele. | +| `CURSOR_IMG_MODEL` | päring / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Alistab pilditööde jaoks Cursor CLI suvandi `--model`. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) pildigenereerimise tulemuse pollimise intervall (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC pildigenereerimise tulemuse pollimise kogukestuse piirang (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) videog genereerimise tulemuse pollimise intervall (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video genereerimise tulemuse pollimise kogukestuse piirang (ms). | +| `CURSOR_DATA_DIR` | _(automaatselt otsitud)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Alistab Cursor Agent CLI andmekataloogi (`…/versions/`); sama muutujat kasutab ametlik agent. | +| `CURSOR_TOKEN` | _(määramata)_ | `scripts/ad-hoc/cursor-tap.cjs` | Arendustööriistades kasutatav otsene Cursori bearer-tõend. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | keelatud (lubatav väärtusega `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Logib suurte vestluspäringute sisu tüübi ja pikkuse tähised, kui määratud on `"1"`. Logimüra vähendamiseks on see vaikimisi väljas. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(määramata)_ | `open-sse/handlers/responseTranslator.ts` | Määrake väärtuseks `true`, et logida Responses API SSE→JSON-tõlke üksikasjad. | +| `DEBUG_CLAUDE_NONSTREAM` | _(määramata)_ | `open-sse/handlers/responseTranslator.ts` | Määrake väärtuseks `true`, et tuua Claude'i vastuse tõlketeel esile tühjad textContent-fragmendid (ainult silumiseks). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(määramata)_ | E2E-testi raamistik | Määrake väärtuseks `true`, et lubada E2E-testirežiim (leebem autentimine, testikonksud). | --- diff --git a/docs/i18n/et/docs/reference/FEATURE_FLAGS.md b/docs/i18n/et/docs/reference/FEATURE_FLAGS.md index 7458ea743f44..70d7cbb333a2 100644 --- a/docs/i18n/et/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/et/docs/reference/FEATURE_FLAGS.md @@ -44,124 +44,126 @@ Tõeväärtusega lipp loetakse **lubatuks**, kui selle tegelik väärtus on `"tr ## Lippude kataloog -72 lippu 6 kategoorias. **Vaikeväärtus** on definitsiooni vaikeväärtus — väärtus, -mida kasutatakse siis, kui andmebaasi alistust ega keskkonnamuutujat pole määratud. +74 lippu 6 kategoorias. **Vaikeväärtus** on definitsioonis määratud vaikeväärtus — väärtus, +mida kasutatakse, kui puuduvad nii andmebaasi ülekirjutus kui ka keskkonnamuutuja. ### Turvalisus (10) -| Võti | Tüüp | Vaikeväärtus | Kirjeldus | -| --------------------------------------- | ------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Nõua kõigi sissetulevate päringute puhul API võtit. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Luba kõigi päringute sisendi puhastamine. | -| `INJECTION_GUARD_MODE` | enum | `off` | Viibasüsti vastase kaitse režiim. Väärtused: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Redigeeri päringutest isikuandmed (sõltumata väärtusest `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Puhasta teenusepakkuja vastustest isikuandmed. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Isikuandmete vastustest puhastamise režiim. Väärtused: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Blokeeri väljuvad päringud privaatsetesse/sisemistesse IP-vahemikesse. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Luba autenditud juhtpaneeli kasutajatel näha talletatud API võtmeid, mitte üksnes maskeeritud väärtusi. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Kaasa konto prefiks AUTH-logiridadele (nt „Kasutatakse teenusepakkuja kontot: abc12345...”). Vaikimisi on see keelatud, et kontoidentifikaatorid oleksid jagatud/mitme rentnikuga protsessilogides redigeeritud. See ei sõltu silumisrežiimist; silumisrežiimi ümberlülitamine seda ei avalda. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Kui OIDC on lubatud, keela parooliga sisselogimine, et kasutajad saaksid autentida ainult OIDC ühekordse sisselogimise kaudu. Kui see on keelatud (vaikimisi), on saadaval nii parooliga sisselogimine kui ka OIDC. | - -### Võrk (15) - -| Võti | Tüüp | Vaikeväärtus | Taaskäivitus | Kirjeldus | -| ----------------------------------------------- | ------- | ------------ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Luba TLS-sõrmejälje varjamise režiim. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Luba marsruutidel /v1/audio/* kasutada OpenAI-ga ühilduvaid teenusepakkuja sõlmi, mida majutatakse väljaspool localhost'i. Vaikimisi väljas — heli suunamine kaughosti muudab väljamineva liikluse identiteeti ja peab olema käitaja teadlik otsus. Tagasisideahela sõlmed on alati lubatud ja see säte neid ei mõjuta. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Kui ühendusele pole puhverserverit määratud, vali registrist automaatselt esimene töötav puhverserver. Vaikimisi väljas (vastasel juhul muutub iga registri puhverserver globaalseks varuvariandiks — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Luba OAuthi ja teenusepakkuja valideerimisvoogudel seotud puhverserverist mööda minna ning luua otseühendus, kui puhverserveri kättesaadavuse eelkontrollid nurjuvad. Vaikimisi väljas, sest see võib muuta väljamineva liikluse IP-aadressi. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Mitme konto rotatsiooni täituri võrguerandi korral (ajalõpp, ühendusest keeldumine või ühenduse lähtestamine), kui nurjunud kontol pole eraldi puhverserverit, rakenda lühike ooteaeg ja jäta ülejäänud puhverserverita kontod päringu lõpuni vahele, selle asemel et igaüht uuesti proovida. Vaikimisi sees (ohutu: väljamineva liikluse IP-aadress ei muutu, vähendab ainult jagatud väljamineva liiklusega kontode latentsuse ja ooteaja riski). Keela, et taastada esimese puhverserverita erandi kohene edastamine. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Puhverserverikogumid ja opencode'i kontopõhine rotatsioon lõpetavad äsja nurjunud puhverserveri uuesti pakkumise (tagasilükatud TCP-kontroll või selle kaudu saadud 429) protsessipõhiseks ajavahemikuks, mis iga korduva nurjumisega kahekordistub kuni ülempiirini. Puhverserveri olekut ei kirjutata; kui kõik kandidaadid on kõrvale jäetud, jääb valik muutmata. Vaikimisi väljas. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Kuva juhtpaneelil puhverserverikogumi all, mitu täheldatud väljamineva liikluse IP-aadressi teenindas viimase 24 h jooksul selle liikmeid ja mitu ühendust neid kasutas. Kirjutuskaitstud, arvutatakse puhverserveri logist ja seda ei kasutata kunagi marsruutimiseks. Vaikimisi väljas. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Jälgi OpenCode'i täituri puhul voogedastatud Responsesi vastuse keha esimest baiti (aken: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, vaikeväärtus `15000`). 2xx Responsesi voogu, mis jääb pärast akna möödumist vaikseks, käsitletakse seiskununa: kontole rakendatakse ooteaega ja päring suunatakse ühe korra järgmisele kontole; teine seiskumine nurjub kohe. Vaikimisi väljas: seiskunud vood jätkavad praegust ootamist kuni voo valmisoleku ajalõpuni. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode'i täitur: `user_blocked`-tõrget sisaldava 403/451 korral (mitte geograafiline piirang ega Cloudflare'i sõrmejälje tagasilükkamine) rakenda tagasilükatud kontole ooteaega ja suuna päring järgmisele kontole kõige rohkem üks kord päringu kohta; teine tõrge tagastatakse muutmata kujul ilma õnnestumise märgistuseta. Vaikimisi väljas: ülesvoolu kasutajablokeeringust mööda marsruutimine võib näida piirangust kõrvalehoidmisena ja levitada märgistust kogu süsteemipargis. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode'i rotatsioon: pärast kahte järjestikust ajutist ülesvoolu tõrget (5xx või tühi 400) pea enne järgmist kontot paus — 1,5 s, mis iga järgmise tõrkega kahekordistub; ühe pausi ülempiir on 6 s ja päringu ülempiir 10 s; kliendi ühenduse katkemisel jäetakse paus vahele. Nurjunud vastuse keha vabastatakse enne ootamist. Vaikimisi väljas: tõrkesiire jääb koheseks. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode'i rotatsioon: peata kontode laine esimese tegelikuks kiiruspiiranguks liigitatud 429 korral (sõelutav `Retry-After` või keha, mis nimetab kiiruse- või kasutuspiirangut) ja tagasta see ülesvoolu 429 muutmata kujul. Liigitamata 429 korral rotatsioon jätkub. Vaikimisi väljas: tasuta taseme piirang kehtib väljamineva liikluse IP-aadressi kohta (#9611), seega käivitab iga 429 rotatsiooni ja ammendatud laine tagastab viimase ülesvoolu 429. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Keela MITM-puhverserveri TLS-serdi kontrollimine. **Ohtlik.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Luba privaatsetele/sisevõrkudele osutavad teenusepakkuja URL-id. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Luba lisada ja valideerida kohalikel/privaatsetel aadressidel (127.0.0.1, localhost, LAN) olevaid teenusepakkujaid. Vaikimisi sees (kohalik eelistatud); keela rangeks ainult avalike aadresside lubamiseks. Pilve metaandmed jäävad blokeerituks. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Luba Claude Code'iga ühilduv teenusepakkuja režiim. | - -### Poliitikad (5) +| Võti | Tüüp | Vaikeväärtus | Kirjeldus | +| --------------------------------------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUIRE_API_KEY` | tõeväärtus | `false` | Nõua kõigi sissetulevate päringute puhul API-võtit. | +| `INPUT_SANITIZER_ENABLED` | tõeväärtus | `true` | Luba kõigi päringute sisendi puhastamine. | +| `INJECTION_GUARD_MODE` | loend | `off` | Viibainjektsiooni kaitse režiim. Väärtused: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | tõeväärtus | `false` | Peida päringutest isikuandmed (sõltumatult sättest `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | tõeväärtus | `false` | Puhasta teenusepakkuja vastustest isikuandmed. | +| `PII_RESPONSE_SANITIZATION_MODE` | loend | `redact` | Isikuandmete vastustest puhastamise režiim. Väärtused: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | tõeväärtus | `true` | Blokeeri väljaminevad päringud privaatsetesse/sisemistesse IP-vahemikesse. | +| `ALLOW_API_KEY_REVEAL` | tõeväärtus | `false` | Luba autenditud töölaua kasutajatel salvestatud API-võtmeid kuvada, selle asemel et näidata ainult maskitud väärtusi. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | tõeväärtus | `false` | Lisa AUTH-logiridadele konto prefiks (nt „Using account: abc12345...”). Vaikimisi on see keelatud, et kontoidentifikaatorid oleksid jagatud/mitme rentnikuga protsessilogides peidetud. See ei sõltu silumisrežiimist; silumisrežiimi ümberlülitamine seda ei kuva. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | tõeväärtus | `false` | Kui OIDC on lubatud, keela parooliga sisselogimine, et kasutajad saaksid autentida ainult OIDC ühekordse sisselogimise kaudu. Kui see on keelatud (vaikimisi), on saadaval nii parooliga sisselogimine kui ka OIDC. | + +### Võrk (16) + +| Võti | Tüüp | Vaikeväärtus | Taaskäivitamine | Kirjeldus | +| ----------------------------------------------- | ------- | ------------ | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Luba TLS-sõrmejälje varjamise režiim. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Luba marsruutidel /v1/audio/* kasutada väljaspool localhost'i majutatud OpenAI-ga ühilduvaid teenusepakkuja sõlmi. Vaikimisi väljas — heli marsruutimine kaughosti muudab väljamineva liikluse identiteeti ja peab olema operaatori teadlik otsus. Tagasisideahela sõlmed on alati lubatud ja see säte neid ei mõjuta. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Luba marsruudil POST /v1/rerank (ja mälumootori tagasisideahela ümberjärjestamise etapil) kasutada väljaspool localhost'i majutatud OpenAI-ga ühilduvaid teenusepakkuja sõlmi. Vaikimisi väljas — kaughosti marsruutimine muudab väljamineva liikluse identiteeti ja peab olema operaatori teadlik otsus. Tagasisideahela sõlmed on alati lubatud; kaugsõlmed peavad läbima ka teenusepakkuja väljamineva URL-i reeglistiku kontrolli. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Kui ühendusele pole puhverserverit määratud, vali registrist automaatselt esimene töötav puhverserver. Vaikimisi väljas (vastasel juhul muutuks iga registris olev puhverserver globaalseks varuvariandiks — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Luba OAuthi ja teenusepakkuja valideerimisvoogudel eirata kinnistatud puhverserverit ning luua otseühendus, kui puhverserveri kättesaadavuse eelkontrollid nurjuvad. Vaikimisi väljas, sest see võib muuta väljamineva liikluse IP-aadressi. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Mitme kontoga rotatsioonitäituri võrguerandi korral (ajalõpp, ühendusest keeldumine/lähtestamine), kui tõrkuval kontol puudub spetsiaalne puhverserver, rakenda lühike jahtumisperiood ja jäta teised puhverserverita kontod ülejäänud päringu ajaks vahele, selle asemel et neid kõiki uuesti proovida. Vaikimisi sees (ohutu: väljamineva liikluse IP-aadress ei muutu; vähendab ainult latentsuse/jahtumisperioodi riski jagatud väljuva ühendusega kontodel). Keela, et taastada kohene edastamine esimese puhverserverita konto erandi korral. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Puhverserverikogumid ja opencode'i kontopõhine rotatsioon lõpetavad äsja nurjunud puhverserveri uuesti pakkumise protsessipõhiseks ajavahemikuks (tagasilükatud TCP-proov või selle kaudu saadud 429), mis iga korduva tõrke korral kahekordistub kuni ülempiirini. Puhverserveri olekut ei salvestata; kui kõik kandidaadid on kõrvale jäetud, valik ei muutu. Vaikimisi väljas. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Kuva juhtpaneelil puhverserverikogumi all, mitu vaadeldud väljamineva liikluse IP-aadressi teenindas viimase 24 h jooksul selle liikmeid ja mitu ühendust neid kasutas. Kirjutuskaitstud, arvutatakse puhverserverilogist ja seda ei kasutata kunagi marsruutimiseks. Vaikimisi väljas. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Jälgi OpenCode'i täituri puhul voogedastatud Responses-vastuse esimest sisukeha baiti (aken: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, vaikimisi `15000`). 2xx Responses-voogu, mis jääb pärast akna möödumist vaikseks, käsitletakse seiskununa: kontole rakendatakse jahtumisperiood ja päring suunatakse ühe korra järgmisele kontole; teine seiskumine põhjustab kiire tõrke. Vaikimisi väljas: seiskunud vood jätkavad praegust ootamist kuni voo valmisoleku ajalõpuni. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode'i täitja: kui vastus on 403/451 koos `user_blocked` keeldumisega (mitte geograafilise piirangu ega Cloudflare'i sõrmejälje tagasilükkamise tõttu), määratakse keeldunud kontole ooteaeg ja lülitutakse järgmisele kontole kuni üks kord päringu kohta; teine keeldumine tagastatakse muutmata kujul, ilma edukaks märkimata. Vaikimisi väljas: ülesvoolu kasutajablokeeringust möödamarsruutimine võib näida piirangust kõrvalehoidmisena ja levitada märgistust kogu kontopargile. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode'i rotatsioon: pärast kahte järjestikust ajutist ülesvoolu tõrget (5xx või tühi 400) tehakse enne järgmise konto kasutamist paus — 1,5 s, mis kahekordistub iga järgneva tõrke korral; ühe pausi ülempiir on 6 s ja päringu kohta 10 s; kliendi ühenduse katkemisel jäetakse paus vahele. Tõrke vastuse sisu vabastatakse enne ootamist. Vaikimisi väljas: tõrkesiire jääb viivitamatuks. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode'i rotatsioon: kontode läbimine peatatakse esimese 429 vastuse juures, mis liigitatakse tegelikuks kiirusepiiranguks (sõelutav `Retry-After` või vastuse sisu, mis nimetab kiiruse- või kasutuspiirangut), ning see ülesvoolu 429 vastus tagastatakse muutmata kujul. Liigitamata 429 vastuste korral rotatsioon jätkub. Vaikimisi väljas: tasuta taseme piirang rakendub väljamineva IP-aadressi kohta (#9611), seega põhjustab iga 429 rotatsiooni ja ammendunud läbimine tagastab viimase ülesvoolu 429 vastuse. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Keela MITM-puhverserveri TLS-sertifikaadi kontrollimine. **Ohtlik.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Luba privaatsetele/sisevõrkudele osutavad teenusepakkuja URL-id. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Luba teenusepakkujate lisamine/valideerimine kohalikel/privaatsetel aadressidel (127.0.0.1, localhost, LAN). Vaikimisi sees (kohalik eelistatud); keela, et lubada rangelt ainult avalikud aadressid. Pilve metaandmete aadressid jäävad blokeerituks. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Luba Claude Code'iga ühilduva teenusepakkuja režiim. | + +### Reeglid (5) | Võti | Tüüp | Vaikeväärtus | Kirjeldus | | ------------------------------- | ------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Tööriistade kasutamise poliitika jõustamise režiim. Väärtused: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Lülita kasutusmustrite põhjal automaatselt sisse päringusageduse piiramine. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Jäta otseste ühe mudeli päringute puhul OmniRoute'i kohalik kontekstiakna / sisendi maksimaalse tokenite arvu kontroll vahele. Ülesvoolu piirangud kehtivad endiselt. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Lükka päringud enne edastamist tagasi, kui sihtmudelil puuduvad nõutavad võimekused (nägemine, tööriistad, struktureeritud väljund, kontekstiaken). Kaitseb otseseid ühe teenusepakkuja päringuid, mis mööduvad kombinatsioonikihi ühilduvusfiltrist. | -| `RADAR_ENABLED` | boolean | `false` | Lülita sisse OmniRoute Radari moodul (kataloogivoo vaated ja sünkroonimine). Vaikimisi väljas; sisselülitamine avab ainult kasutajaliidese — andmete sünkroonimine nõuab eraldi nõusolekut. | - -### Käituskeskkond (32) - -| Võti | Tüüp | Vaikimisi | Taaskäivitus | Kirjeldus | -| ------------------------------------------- | ------- | --------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Genereeri ja sisesta vestluste kokkuvõtted, kui kombineeritud marsruutimine vahetab mudelit. Keela, et käsitleda mudelivahetusi sõltumatult ja vältida taustal üleandmispäringuid kõigi olemasolevate ja tulevaste kombinatsioonide puhul. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Eemalda Responses API läbivooluvoogudest enne klientidele edastamist sisemised kommentaarifaasi väljundelemendid. Keela, et saada töötlemata ülesvoolu kommentaare. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Jõusta MCP-tööriistade juurdepääsu ulatusepiirangud. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Tihenda MCP-tööriistade kirjeldusi, et vähendada tokenite kasutust. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Luba käitusajal taustülesannete töötlemine. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Keela kõik taustteenused (kvoodi värskendamine, sünkroonimine jne). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Usalda projektitaseme RTK-filtreid ilma valideerimiseta. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Käivita importimisel reaalajas töölaua WebSocket-server (vaikimisi port 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Luba Codexil kasutada Responses-over-WebSocket transporti. Kui see on välja lülitatud, kasutab Codex varuvariandina HTTP Responses transporti. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Luba Codexil kasutada kohaliku app-serveri WebSocket JSON-RPC transporti (codexTransport=app-server). Kui see on välja lülitatud, kasutavad app-serveri valinud ühendused varuvariandina Codexi muid transporte. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Marsruudi eelarve ammendanud päringud erakorralisele tasuta varupakkujale/-mudelile. (Vaata allpool jaotist [Erakorraline eelarvevaru](#emergency-budget-fallback).) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Luba katkenud ülesvoolu SSE-voogude läbipaistev varajane korduskatse enne, kui vastuse baidid jõuavad kliendini. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Luba voo taastamisel vastust uuesti pärida ja liita pärast seda, kui baidid on juba kliendini jõudnud. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Muuda voo keskel jätkamine tööriistakutsete jaoks ohutuks: ära kunagi jätka katkenud voogu, kui tööriistakutse on väljastatud (pooleli või juba lõpetatud väärtusega finish_reason tool_calls), ning lõpeta pärast üht tühja jätkamist, selle asemel et kulutada kogu eelarve. Väljas: väljalaske tavakäitumine. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Lülitu üks kord sõsarühendusele, kui SSE-voog sulgub enne mis tahes kasuliku kaadri väljastamist ja piiratud korduskatse samal ühendusel on ammendatud; kasutatava sõsarühenduse puudumisel tagastatakse algne `STREAM_EARLY_EOF` 502. Vaikimisi väljas: varajane EOF jääb pärast samal ühendusel tehtud korduskatset lõplikuks. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Kaasa `/v1/models` vastustesse kuvamiseks sobivad nimeväljad. Keela klientide jaoks, mis eeldavad ainult mudeli ID-sid. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Määrab, kuidas mudeli ID-dele lisatakse /v1/models-is prefiksid. 'dual' (vaikimisi) väljastab tagasiühilduvuse tagamiseks nii aliase kui ka kanoonilise pakkuja ID prefiksid. 'alias' väljastab ainult lühikese aliaseprefiksi (nt ds-web/model, mitte deepseek-web/model). 'canonical' väljastab ainult täieliku pakkuja ID prefiksi. Väärtused: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Luba mudelite intelligentsuse pingerea jaoks Arena AI edetabeli ELO perioodiline sünkroonimine. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Avalda `/v1/models` kaudu `claude//` peegel-ID-d, et Claude Code'i lüüsi mudeliotsing loetleks ka mitte-Claude'i mudeleid. Kolmetasemelise lüliti globaalne tase (keskkonnamuutuja alistab töölaua sätte). Vaata [Claude Code'i konfiguratsiooni](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Pealüliti lüüsi no-think// aliastele. Sees (vaikimisi): /v1/models avaldab mõtlemiseta variandi iga sobiva mõtlemisvõimelise Claude'i mudeli jaoks ning päringus saadetud no-think/ ID teisendatakse tagasi tegelikuks mudeliks, mille arutluskäik on pärsitud. Väljas: variante ei avaldata ja no-think/ ID-d käsitletakse nagu mis tahes muud tundmatut mudeli ID-d. Mudelipõhine ModelSpec.noThinkingAlias lubamine/keelamine kehtib endiselt, kui see on sisse lülitatud. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Keela mõtlemistaseme variantide (nt -low, -medium, -high) genereerimine /v1/models kataloogis. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Luba pakkujale edastamiseks rentnikupõhised kohanduvad virtuaalsed vastuvõturajad (#9654): ühe rentniku päringutulv ei põhjusta enam teisele 503-vastuseid. Keskkonnamuutuja OMNIROUTE_CHAT_VIRTUAL_LANES alistab selle töölaua sätte; muudatused jõustuvad serveri taaskäivitamisel. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Avalda /v1/models kaudu / peegel-ID-d mudelitele, mille kanoonilisel omanikul pole aktiivset mandaati, kuid mida marsruudib aktiivse mandaadiga läbivoolulüüs. Hoiatus: globaalsel lubamisel lisab kataloogikirjed kõigile klientidele. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Luba saldo tuvastamine New-API / One-API / Sub2API agregaatoriga ühilduvates sõlmedes. Kui see on lubatud, kuvavad agregaatorilipuga ühilduvad sõlmed oma saldo töölaual ja kvoodieelse kontrolli marsruutimisel. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Jätka mittevoogedastavaid serveri hallatavaid tööriistakutseid, kuni mudel tagastab kliendile kasutatava vastuse. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Otsingustatistika ja hiljutised otsingud arvestavad ainult pakkujaid, millel on endiselt aktiivne ühendus (võtmeta pakkujaid, nagu duckduckgo-free, arvestatakse alati). Väljalülitatud olekus säilitatakse iga alleshoitud otsingurida koos pakkuja ID-ga. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Töölaua pakkujalehed: kuva märk Free ainult signaalide korral, mida pakkuja toetab — jätab välja kuvatava nime heuristika, mitte-tõeväärtuslikud tasuta kasutuse väljad ja registreeritud pakkujate :free sufiksid, kui dokumenteeritud tasuta taset pole. Väljalülitatud olekus säilib senine märgireegel. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Koondatud 429/503 kättesaamatuse vastustes jäta `Retry-After` välja, kui konkreetne tulevane korduskatse aeg pole teada (sünteetilise 1s asemel), lisa `error.retry_after_provenance` (`signal` \| `none`) ning luba kombinatsiooni tühjendusteedel lugeda korduskatse tekstilisi vihjeid JSON-ist ja ülesvoolu lihttekstkehadest. Väli ilmub ainult funktsiooni `unavailableResponse()` loodud vastustes; muud 429/503 kehad ei muutu. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Kui `priority` kombinatsiooni sihtmärk, mis on märgitud varuvariandiks ainult kvoodi ammendumise korral, peatab kombinatsiooni põhjusel, mis pole tõendatavalt kvoodiga seotud (pakkuja kaitselüliti on avatud, ennustava latentsuse tõttu vahelejätmine), vasta kvoodile viitava 503 asemel koodiga 502. Lukustusest, jahtumisest, kättesaamatusest, ammendumisest ja samaaegsuspiirangust tingitud peatumised jäävad koodiga 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Paljas Mistrali 401 (`{"detail":"Unauthorized"}`, ilma otsese autentimissignaalita) on tühistatud võtme ja ammendunud kvoodi puhul identne. Kui see on sisse lülitatud, pannakse ühendus olekusse `expired` parkimise asemel jahtuma, maksimaalselt 3 korda tunnis ühenduse kohta; järgmine kord ühendus pargitakse, nii et tühistatud võti jõuab siiski lõppolekusse. Vaikimisi väljas: iga paljas Mistrali 401 pargib ühenduse nagu varem. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Hangi `xai-oauth` ühenduste reaalajas xAI mudelikataloog aadressilt `https://api.x.ai/v1/models`, kasutades OAuthi esitaja tokenit, selle asemel et kasutada külmutatud staatilist algkogumit. Vaikimisi väljas: `xai-oauth` jätkab staatilise algkogumi muutmata kujul pakkumist. Mis tahes lahendusvea korral kasutatakse avastuse varuvariandina algkogumit (pole kontrollitud, kas x.ai aktsepteerib selles lõpp-punktis OAuthi esitaja tokenit). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Luba automaatsel puhastusel kustutada lõppolekus (completed/failed/cancelled/expired) Batch API tööd, mis on vanemad kui `OMNIROUTE_BATCH_RETENTION_DAYS`, koos nende reapõhiste kontrollpunktidega, ning tühjendada oma `expires_at` aja ületanud üleslaaditud failide BLOB-sisu. Vaikimisi väljas: iga olemasolev installatsioon säilitab need andmed täpselt nagu varem, kuni operaator funktsiooni lubab. Operaatori käivitatavat marsruuti `DELETE /api/v1/batches/delete-completed` see kummalgi juhul ei mõjuta — see on eraldiseisev tingimusteta avalik API leping. | +| `TOOL_POLICY_MODE` | enum | `disabled` | Tööriistakasutuse reeglite jõustamise režiim. Väärtused: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Luba kasutusmustrite põhjal automaatselt kiiruse piiramine. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Jäta otseste ühe mudeli päringute puhul OmniRoute'i kohalik kontekstiakna / maksimaalse sisendtokenite arvu kontroll vahele. Ülesvoolu piirangud kehtivad endiselt. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Lükka päringud enne edastamist tagasi, kui sihtmudelil puuduvad nõutavad võimalused (nägemine, tööriistad, struktureeritud väljund, kontekstiaken). Kaitseb otseseid ühe teenusepakkuja päringuid, mis mööduvad kombinatsioonikihi ühilduvusfiltrist. | +| `RADAR_ENABLED` | boolean | `false` | Luba OmniRoute Radari moodul (kataloogivoo kuvad ja sünkroonimine). Vaikimisi väljas; lubamine avab ainult kasutajaliidese — andmete sünkroonimine nõuab endiselt eraldi nõusolekut. | + +### Käituskeskkond (33) + +| Võti | Tüüp | Vaikeväärtus | Taaskäivitamine | Kirjeldus | +| ------------------------------------------- | ---------- | ------------ | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | tõeväärtus | `true` | | Genereerib ja lisab vestluste kokkuvõtted, kui kombineeritud marsruutimine vahetab mudeleid. Keelake see, et käsitleda mudelivahetusi sõltumatult ning vältida taustal üleandmistaotluste tegemist kõigi olemasolevate ja tulevaste kombinatsioonide puhul. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | tõeväärtus | `true` | | Eemaldab Responses API läbivooluvoogudest sisemised kommentaarifaasi väljundüksused enne klientidele edastamist. Keelake see, et saada töötlemata ülesvoolu kommentaare. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | tõeväärtus | `true` | | Jõustab MCP tööriistade juurdepääsu ulatuspiirangud. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | tõeväärtus | `false` | | Tihendab MCP tööriistade kirjeldusi, et vähendada lubade kasutust. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | tõeväärtus | `false` | | Lubab taustülesannete töötlemise käitusajal. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | tõeväärtus | `false` | ✓ | Keelab kõik taustteenused (kvoodi värskendamine, sünkroonimine jne). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | tõeväärtus | `false` | | Usalda projektitaseme RTK-filtreid ilma valideerimiseta. | +| `OMNIROUTE_ENABLE_LIVE_WS` | tõeväärtus | `true` | ✓ | Käivita importimisel reaalajas töölaua WebSocketi server (vaikimisi port 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | tõeväärtus | `true` | | Luba Codexil kasutada Responses-over-WebSocketi transporti. Kui see on välja lülitatud, kasutab Codex varuvariandina HTTP Responsesi. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | tõeväärtus | `true` | | Luba Codexil kasutada kohaliku app-serveri WebSocket JSON-RPC transporti (codexTransport=app-server). Kui see on välja lülitatud, kasutavad app-serveri jaoks seadistatud ühendused varuvariandina Codexi muid transporte. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | tõeväärtus | `true` | | Suuna eelarve ammendanud päringud hädaolukorra tasuta varuteenusepakkujale/-mudelile. (Vt allpool jaotist [Hädaolukorra eelarve varuvariant](#emergency-budget-fallback).) | +| `STREAM_RECOVERY_ENABLED` | tõeväärtus | `false` | | Luba kärbitud ülesvoolu SSE-voogude läbipaistev varajane korduskatse enne, kui ükski vastusebait kliendini jõuab. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | tõeväärtus | `false` | | Luba voo taastamisel vastus uuesti pärida ja kokku liita pärast seda, kui baidid on juba kliendini jõudnud. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | tõeväärtus | `false` | | Muuda voo keskel jätkamine tööriistakutsete jaoks ohutuks: ära jätka katkenud voogu pärast tööriistakutse väljastamist (olenemata sellest, kas see on pooleli või juba lõpetatud väärtusega finish_reason tool_calls), ning sulge ühendus pärast üht tühja jätkamist, selle asemel et kogu eelarve ära kulutada. Väljas: väljalaske tavakäitumine. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Lülitu üks kord ümber sama taseme ühendusele, kui SSE-voog sulgub enne mis tahes kasuliku kaadri väljastamist ja sama ühenduse piiratud korduskatse on ammendatud; kasutatava sama taseme ühenduse puudumisel tagastatakse algne `STREAM_EARLY_EOF` 502. Vaikimisi välja lülitatud: varajane EOF jääb pärast sama ühenduse korduskatset lõplikuks veaks. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Lisa `/v1/models` vastustesse kuvamiseks sobivad nimeväljad. Keela klientide puhul, mis eeldavad ainult mudeli-ID-sid. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Määrab, kuidas mudeli-ID-dele lisatakse /v1/models-is prefiksid. 'dual' (vaikimisi) väljastab tagasiühilduvuse tagamiseks nii pseudonüümi kui ka teenusepakkuja kanoonilise ID prefiksid. 'alias' väljastab ainult lühikese pseudonüümi prefiksi (nt ds-web/model, mitte deepseek-web/model). 'canonical' väljastab ainult teenusepakkuja täieliku ID prefiksi. Väärtused: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Luba mudelite intelligentsuse paremusjärjestuse jaoks Arena AI edetabeli ELO perioodiline sünkroonimine. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Reklaami `/v1/models` kaudu `claude//` peegel-ID-sid, et Claude Code'i lüüsi mudelituvastus loetleks ka mitte-Claude'i mudeleid. Kolmetasandilise lüüsi globaalne tase (keskkonnamuutuja on juhtpaneeli alistusest ülimuslik). Vaata [Claude Code'i konfiguratsiooni](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Pealüliti lüüsi no-think// pseudonüümidele. Sees (vaikimisi): /v1/models reklaamib iga sobiva mõtlemisvõimelise Claude'i mudeli jaoks mõtlemiseta varianti ning päringus saadetud no-think/ ID teisendatakse tagasi tegelikuks mudeliks, mille arutluskäik on maha surutud. Väljas: variante ei reklaamita ja no-think/ ID-d käsitletakse nagu mis tahes muud tundmatut mudeli-ID-d. Mudelipõhine ModelSpec.noThinkingAlias osalemise lubamine või keelamine kehtib ka siis, kui see säte on sisse lülitatud. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Keela mõtlemistaseme variantide (nt -low, -medium, -high) genereerimine /v1/models kataloogis. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Luba teenusepakkujale edastamiseks rentnikupõhised adaptiivsed virtuaalsed vastuvõturajad (#9654): ühe rentniku koormushoog ei põhjusta enam teisele 503-viga. Keskkonnamuutuja OMNIROUTE_CHAT_VIRTUAL_LANES on selle juhtpaneeli alistuse suhtes ülimuslik; muudatused jõustuvad serveri taaskäivitamisel. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Kuva lüüsipeeglite identifikaatorid kujul / otspunktis /v1/models nende mudelite puhul, mille kanoonilisel omanikul pole aktiivset pääsutunnust, kuid mida marsruudib aktiivse pääsutunnusega läbipaistev lüüs. Hoiatus: globaalsel lubamisel lisab see kataloogikirjeid kõigi klientide jaoks. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Luba saldo tuvastamine New-API / One-API / Sub2API agregaatoritega ühilduvate sõlmede puhul. Kui see on lubatud, kuvatakse agregaatori lipuga ühilduvate sõlmede saldo töölaual ja kvoodi eelkontrolliga marsruutimisel. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Jätka serveri hallatavaid mittevoogedastusrežiimis tööriistakutseid, kuni mudel tagastab kliendi jaoks kasutatava vastuse. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Otsingustatistikas ja hiljutistes otsingutes arvestatakse ainult pakkujaid, millel on endiselt aktiivne ühendus (võtmeta pakkujaid, nagu duckduckgo-free, arvestatakse alati). Väljalülitatuna säilitatakse kõik alleshoitud otsinguread, millel on pakkuja identifikaator. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Pakkujate lehed töölaual: kuva märk „Tasuta“ ainult nende signaalide alusel, mida pakkuja toetab — eiratakse kuvatava nime heuristikat, mitteloogikaväärtuslikke tasuta kasutuse välju ja järelliiteid :free registreeritud pakkujate puhul, kellel pole dokumenteeritud tasuta kasutustaset. Väljalülitatuna säilib senine märgi kuvamise reegel. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Agregeeritud 429/503 kättesaamatuse vastustes jäta `Retry-After` välja, kui konkreetne tulevane korduskatse aeg pole teada (sünteetilise 1 s asemel), lisa `error.retry_after_provenance` (`signal` \| `none`) ning võimalda kombinatsiooni tühjendamise teedel lugeda JSON-vormingus ja lihttekstina ülesvoolu vastusekehadest sõnalisi korduskatse vihjeid. Väli kuvatakse ainult funktsiooniga `unavailableResponse()` loodud vastustes; muud 429/503 vastusekehad jäävad muutmata. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Kui kombinatsiooni `priority`-sihtmärk, mis on märgitud kasutamiseks ainult kvoodi ammendumisel varuvariandina, peatab kombinatsiooni põhjusel, mis tõendatult ei ole kvoodiga seotud (pakkuja kaitselüliti on avatud, prognoositud latentsuse tõttu vahelejätmine), vasta kvoodile viitava 503 asemel koodiga 502. Lukustuse, ooteaja, kättesaamatuse, ammendumise ja samaaegsuspiirangu tõttu peatamise korral säilib 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Paljas Mistrali 401 (`{"detail":"Unauthorized"}`, ilma selgesõnalise autentimissignaalita) on tühistatud võtme ja ammendunud kvoodi korral ühesugune. Kui see on sisse lülitatud, määratakse ühendusele `expired`-olekusse jätmise asemel ooteaeg, kuid mitte rohkem kui 3 korda tunnis ühenduse kohta; järgmine kord jäetakse see `expired`-olekusse, mistõttu tühistatud võti jõuab siiski lõppolekusse. Vaikimisi välja lülitatud: iga paljas Mistrali 401 jätab ühenduse nagu varemgi `expired`-olekusse. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Too `xai-oauth` ühenduste jaoks OAuthi kandjatõendi abil aadressilt `https://api.x.ai/v1/models` reaalajas xAI mudelikataloog külmutatud staatilise algandmestiku asemel. Vaikimisi välja lülitatud: `xai-oauth` jätkab staatilise algandmestiku muutmata kujul pakkumist. Mis tahes lahendustõrke korral kasutatakse varuvariandina algandmestikku (pole kontrollitud, kas x.ai aktsepteerib selles lõpp-punktis OAuthi kandjatõendit). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Luba automaatsel puhastusel kustutada lõppolekus (lõpetatud/ebaõnnestunud/tühistatud/aegunud) Batch API tööd, mis on vanemad kui `OMNIROUTE_BATCH_RETENTION_DAYS`, koos nende reapõhiste kontrollpunktidega, ning tühjendada üleslaaditud failide BLOB-sisu pärast nende `expires_at` väärtuse möödumist. Vaikimisi välja lülitatud: iga olemasolev paigaldus säilitab neid andmeid täpselt nagu varem, kuni operaator funktsiooni sisse lülitab. Operaatori käivitatavat marsruuti `DELETE /api/v1/batches/delete-completed` see kummalgi juhul ei mõjuta — tegemist on eraldiseisva ja tingimusteta avaliku API-lepinguga. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Reserveeri valitud Antigravity konto selle valinud päringu voogedastuse elutsükli ajaks, et samaaegne korduskatse või identimisteabe üleandmine ei saaks poolelioleva voo jaoks juba kasutusele võetud kontot uuesti valida. Reserveering on piiritletud ühenduse ja kutsutava ülesvoolumudeli paariga, seega saab üks konto endiselt teenindada korraga kaht erinevat mudelit. Kui kõik sobivad kontod on selle mudeli jaoks juba reserveeritud, tagastab päring struktureeritud 503 vea `antigravity_pool_busy` koos piiratud `Retry-After` väärtusega, selle asemel et koormata juba hõivatud kontot. Vaikimisi välja lülitatud: konto valimine toimib täpselt nagu varem ja reserveeringut ei tehta. | ### CLI (5) -| Võti | Tüüp | Vaikeväärtus | Taaskäivitus | Kirjeldus | -| ------------------------------------- | ------- | ------------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Luba ühilduvusrežiim kõigi CLI-klientide jaoks. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Luba mudelialiaste ühilduvuskiht. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Luba hinnakujundusandmete automaatne sünkroonimine (vajab ka keskkonnamuutujat `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Pärast teenusepakkuja mudelite sünkroonimist kirjuta aktiivse kataloogi põhjal automaatselt (uuesti) profiilifailid ~/.codex/*.config.toml. Aktiivset/vaikimisi Codexi konfiguratsiooni ei muudeta kunagi. Vaikimisi väljas. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Pärast teenusepakkuja mudelite sünkroonimist kirjuta aktiivse kataloogi põhjal automaatselt (uuesti) Claude Code'i profiilid ~/.claude/profiles//settings.json. Aktiivset/vaikimisi Claude'i konfiguratsiooni ei muudeta kunagi. Vaikimisi väljas. | +| Võti | Tüüp | Vaikeväärtus | Taaskäivitamine | Kirjeldus | +| ------------------------------------- | ------- | ------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Luba ühilduvusrežiim kõigi CLI klientide jaoks. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Luba mudelialiaste ühilduvuskiht. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Luba hinnastamisandmete automaatne sünkroonimine (vajab ka keskkonnamuutujat `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Pärast teenusepakkuja mudelite sünkroonimist kirjuta reaalajas kataloogi põhjal automaatselt (uuesti) profiilifailid ~/.codex/*.config.toml. Aktiivset/vaikimisi Codexi konfiguratsiooni ei muudeta kunagi. Vaikimisi välja lülitatud. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Pärast teenusepakkuja mudelite sünkroonimist kirjuta reaalajas kataloogi põhjal automaatselt (uuesti) Claude Code'i profiilid ~/.claude/profiles//settings.json. Aktiivset/vaikimisi Claude'i konfiguratsiooni ei muudeta kunagi. Vaikimisi välja lülitatud. | -### Tervisekontroll (5) +### Tervis (5) -| Võti | Tüüp | Vaikeväärtus | Kirjeldus | -| ----------------------------------------- | ------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Keela kohaliku eksemplari tervisekontrolli lõpp-punkt. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Keela loa valideerimise tervisekontroll. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Luba oskuste liivakastikeskkonnas võrgujuurdepääs. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Puhverserverite tervisekontrolli käigus lähtestab sihtmärgi tagasilükatud päring (401/403/429) puhverserveri järjestikuste tõrgete seeria. Vaikimisi väljas: tagasilükkamine jääb neutraalseks (#10654). 5xx jääb mõlemal juhul ebaselgeks; tagasilükkamine ei eemalda, keela ega aktiveeri puhverserverit uuesti. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Käivita DB tervikluse/terviseseisundi kontroll pärast seda, kui server hakkab päringuid vastu võtma (`setImmediate` kaudu), selle asemel et käivitamist kontrolli lõppemiseni blokeerida (#13717). Vaikimisi väljas: käivitamine blokeeritakse täpselt samamoodi nagu enne seda PR-i. | +| Võti | Tüüp | Vaikeväärtus | Kirjeldus | +| ----------------------------------------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | tõeväärtus | `false` | Keela kohaliku eksemplari seisundikontrolli lõpp-punkt. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | tõeväärtus | `false` | Keela loa valideerimise seisundikontroll. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | tõeväärtus | `false` | Luba oskuste liivakastikeskkonnas võrgujuurdepääs. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | tõeväärtus | `false` | Puhverserverite seisundikontrolli käigus lähtestab sihtmärgi tagasi lükatud kontrollpäring (401/403/429) puhverserveri järjestikuste tõrgete jada. Vaikimisi väljas: tagasilükkamine jääb neutraalseks (#10654). 5xx jääb mõlemal juhul ebaselgeks; tagasilükkamine ei eemalda, keela ega taasaktiveeri kunagi puhverserverit. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | tõeväärtus | `false` | Käivita andmebaasi tervikluse/seisundi käivitusaegne kontroll pärast seda, kui server hakkab päringuid vastu võtma (`setImmediate` kaudu), selle asemel et blokeerida käivitamist kontrolli lõpuleviimiseni (#13717). Vaikimisi väljas: käivitamine blokeeritakse täpselt samamoodi nagu enne seda PR-i. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` ja selle pärandalias > `INJECTION_GUARD_BLOCK_THRESHOLD` häälestavad muutuja > `INJECTION_GUARD_MODE` režiimi `block`, kuid need on tavalised keskkonnamuutujad, mida loeb > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> mitte funktsioonilipud: neil pole DB-poolset alistust ega juhtpaneeli lülitit. Vaata +> mitte funktsioonilipud: neil pole andmebaasi alistust ega juhtpaneeli lülitit. Vaadake > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> Veerus `Taaskäivitus` märgitakse lipud, millel on `requiresRestart: true` — väärtus -> salvestatakse kohe, kuid rakendub alles pärast protsessi uuesti laadimist. Enum-tüüpi -> lipud lükkavad tagasi kõik väärtused, mis ei kuulu nende lubatud hulka (serveripoolne valideerimine toimub -> nii funktsioonis `setFeatureFlagOverride()` kui ka REST-i `PUT`-töötlejas). +> Veerg `Restart` tähistab lippe, millel on `requiresRestart: true` — väärtus +> salvestatakse kohe, kuid jõustub alles pärast protsessi uuesti laadimist. Loenditüüpi +> lipud lükkavad tagasi kõik väärtused, mis ei kuulu nende lubatud hulka (serveripoolne valideerimine toimub nii +> funktsioonis `setFeatureFlagOverride()` kui ka REST-i `PUT`-töötlejas). --- @@ -172,23 +174,20 @@ mida kasutatakse siis, kui andmebaasi alistust ega keskkonnamuutujat pole määr Liikuge jaotisse **Töölaud → Seaded → Funktsioonilipud** (`/dashboard/settings/feature-flags`). Ruudustik (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) -toetab järgmist: +toetab järgmisi toiminguid: -- **Otsing** võtme või kirjelduse järgi ja **filtreerimine** kategooria järgi (lisaks sünteetiline - vaade **Nõuab taaskäivitamist**). -- **Lüliti** kahendväärtusega lippude ja **rippmenüü** loendväärtusega lippude jaoks +- **Otsing** võtme või kirjelduse järgi ja **filtreerimine** kategooria järgi (lisaks sünteetiline vaade **Nõuab taaskäivitamist**). +- **Lüliti** tõeväärtuslippude ja **rippmenüü** loendväärtustega lippude jaoks (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- Iga lipu **allikamärgis** — `DB`, `ENV` või `DEF` — näitab, kust - kehtiv väärtus pärineb. -- Nupp **Lähtesta** (kuvatakse ainult `DB`-allikaga lippude puhul) ülekirjutuse eemaldamiseks - ja allosas nupp **Lähtesta kõik ülekirjutused**. -- Bänner **Taaskäivita server**, kui muudetakse lippu `requiresRestart`. +- Iga lipu juures olev **allika märgis** — `DB`, `ENV` või `DEF` —, mis näitab, kust kehtiv väärtus pärineb. +- Nupp **Lähtesta** (kuvatakse ainult lippude puhul, mille allikas on `DB`) ülekirjutuse eemaldamiseks ning allosas nupp **Lähtesta kõik ülekirjutused**. +- Bänner **Taaskäivita server**, kui muudetakse lippu, millel on `requiresRestart`. ### REST API -Kõik toimingud kasutavad üht marsruuti: +Kõik toimingud tehakse ühe marsruudi kaudu: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Iga meetod nõuab autenditud töölauaseanssi (vastasel juhul `401`). +Iga meetod nõuab autentitud töölauaseanssi (vastasel juhul tagastatakse `401`). #### `GET /api/settings/feature-flags` @@ -199,8 +198,8 @@ Tagastab kõik lipud koos nende kehtiva väärtuse, allika ja kokkuvõttega. "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Nõua API-võtit", - "description": "Nõua API-võtit kõigi sissetulevate päringute puhul", + "label": "Require API Key", + "description": "Require an API key for all incoming requests", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +209,7 @@ Tagastab kõik lipud koos nende kehtiva väärtuse, allika ja kokkuvõttega. "requiresRestart": false, "warningLevel": "caution", }, - // ... kõik 72 lippu + // ... kõik 74 lippu ], "summary": { "total": 56, @@ -240,18 +239,16 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ ``` Vastus tagastab uued `effectiveValue`/`source` väärtused, varasemad `previousValue`/ -`previousSource` väärtused ja `requiresRestart`. Tundmatud võtmed ja lubatud vahemikust väljapoole jäävad loendväärtused -lükatakse tagasi koodiga `400`. +`previousSource` väärtused ja `requiresRestart` väärtuse. Tundmatud võtmed ja lubatud vahemikust väljas olevad loendväärtused lükatakse tagasi koodiga `400`. #### `DELETE /api/settings/feature-flags` -Eemaldab korraga **kõik** DB ülekirjutused, taastades iga lipu keskkonnamuutuja / vaikeväärtuse. -Tagastab `{ cleared: , message: "..." }`. +Eemaldab korraga **kõik** DB ülekirjutused, taastades iga lipu keskkonnamuutuja / vaikeväärtuse. Tagastab `{ cleared: , message: "..." }`. > [!NOTE] -> Lipud, mille puhul on `requiresRestart: true`, jõustuvad alles pärast protsessi uuesti laadimist. -> Töölaua taaskäivitusvoog kutsub välja `POST /api/restart` ja seejärel küsitleb -> `GET /api/health/ping`, kuni server on taas töös. +> Lipud, millel on `requiresRestart: true`, jõustuvad alles pärast protsessi uuesti laadimist. +> Töölaua taaskäivitusvoog kutsub välja `POST /api/restart` ja küsitleb seejärel +> `GET /api/health/ping`, kuni server on taas töökorras. --- diff --git a/docs/i18n/et/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/et/docs/reference/PROVIDER_REFERENCE.md index 8e608561ca77..cc600646149f 100644 --- a/docs/i18n/et/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/et/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > **Automaatselt genereeritud** failist `src/shared/constants/providers.ts` — ärge muutke käsitsi. > Uuesti genereerimiseks: `npm run gen:provider-reference` -> **Viimati genereeritud:** 2026-09-17 +> **Viimati genereeritud:** 2026-09-18 -Pakkujaid kokku: **359**. Kategooriate jaotust vt allpool. +Pakkujaid kokku: **359**. Vaadake allpool kategooriate jaotust. ## Kategooriad @@ -32,49 +32,49 @@ Kasutage iga pakkuja lubamiseks, seadistamiseks ja testimiseks juhtpaneeli aadre --- -## Autentimiseta teenusepakkujad (võtit pole vaja) (10) - -| ID | Alias | Nimi | Sildid | Veebisait | Märkused | Tööriistade kutsumine | -| ----------------------- | ---------- | ------------------------- | -------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------- | -| `aihorde` | `horde` | AI Horde | Autentimiseta | [link](https://aihorde.net) | API-võtit pole vaja — kasutab AI Horde'i dokumenteeritud anonüümset võtit. Tasuta aihorde.net-i võtme lisamine on valikuline ja annab ainult kõrgema järjekorraprioriteedi (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Autentimiseta | [link](https://augmentcode.com) | OmniRoute ei salvesta API-võtit. Installige Auggie CLI ja käivitage selles masinas `auggie login`; seejärel käivitab OmniRoute selle iga päringu jaoks kohalikult. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Autentimiseta | [link](https://playground.ai.cloudflare.com) | Autentimisandmeid pole vaja — kasutatakse anonüümseid brauseriseansse pöördprojekteeritud cf_agent WebSocketi protokolli kaudu (Playwrighti transport). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Autentimiseta | [link](https://developers.openai.com/codex/cli) | OmniRoute ei salvesta tokenit. Codex CLI app-server haldab ise ChatGPT-sse sisselogimist (~/.codex/auth.json, värskendatakse automaatselt). Kui CLI pole veel autenditud, kasutage valikut „Logi sisse ChatGPT-ga“. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Autentimiseta | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Autentimist haldab ametlik Devin CLI oma isoleeritud sillaköites. | emuleeritud | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Autentimiseta | [link](https://duckduckgo.com/duckchat) | Autentimisandmeid pole vaja — DuckDuckGo AI Chat on anonüümne ja tasuta. | emuleeritud | -| `opencode` | `oc` | OpenCode Free | Autentimiseta | [link](https://opencode.ai) | API-võtit pole vaja — kasutab OpenCode'i avalikku tasuta lõpp-punkti. | — | -| `uncloseai` | `unc` | UncloseAI | Autentimiseta | [link](https://uncloseai.com) | Autentimist pole vaja. API aktsepteerib tuvastamiseks võtmena mis tahes mittetühja stringi. Kui vanemad sisseehitatud mudelid tagastavad 404, kasutage valikut Saadaolevad mudelid → Impordi asukohast /models või Automaatne sünkroonimine; kontrollitud töötav mudel: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Autentimiseta, video | [link](https://veoaifree.com) | Autentimist pole vaja. Piirang on 6 päringut tunnis IP-aadressi kohta. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Autentimiseta | [link](https://zcode.z.ai) | OmniRoute ei salvesta API-võtit. Kohalik ZCode app-server kasutab olemasolevat builtin:zai-coding-plan sisselogimist. | — | +## Autentimist mittevajavad pakkujad (võtit pole vaja) (10) + +| ID | Alias | Nimi | Sildid | Veebisait | Märkused | Tööriistade kutsumine | +| ----------------------- | ---------- | ------------------------- | ---------------------------- | ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | +| `aihorde` | `horde` | AI Horde | Autentimist pole vaja | [link](https://aihorde.net) | API-võtit pole vaja — kasutab AI Horde'i dokumenteeritud anonüümset võtit. Tasuta aihorde.net-i võtme lisamine on valikuline ja annab ainult kõrgema järjekorraprioriteedi (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Autentimist pole vaja | [link](https://augmentcode.com) | OmniRoute ei talleta API-võtit. Installige Auggie CLI ja käivitage selles masinas `auggie login`; seejärel käivitab OmniRoute selle iga päringu jaoks kohalikult. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Autentimist pole vaja | [link](https://playground.ai.cloudflare.com) | Autentimisandmeid pole vaja — anonüümsed brauseriseansid pöördprojekteeritud cf_agent WebSocketi protokolli kaudu (Playwrighti transport). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Autentimist pole vaja | [link](https://developers.openai.com/codex/cli) | OmniRoute ei talleta luba. Codex CLI rakendusserver haldab ise ChatGPT-sse sisselogimist (~/.codex/auth.json, värskendatakse automaatselt). Kui CLI pole veel autenditud, kasutage valikut „Sign in with ChatGPT“. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Autentimist pole vaja | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Autentimist haldab ametlik Devin CLI oma isoleeritud sillaköites. | emuleeritud | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Autentimist pole vaja | [link](https://duckduckgo.com/duckchat) | Autentimisandmeid pole vaja — DuckDuckGo AI Chat on anonüümne ja tasuta. | emuleeritud | +| `opencode` | `oc` | OpenCode Free | Autentimist pole vaja | [link](https://opencode.ai) | API-võtit pole vaja — kasutab OpenCode'i avalikku tasuta lõpp-punkti. | — | +| `uncloseai` | `unc` | UncloseAI | Autentimist pole vaja | [link](https://uncloseai.com) | Autentimist pole vaja. API aktsepteerib tuvastamiseks võtmena mis tahes mittetühja stringi. Kui vanemad sisseehitatud mudelid tagastavad vea 404, kasutage valikut Available Models → Import from /models või Auto-Sync; kontrollitud töötav mudel: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Autentimist pole vaja, video | [link](https://veoaifree.com) | Autentimist pole vaja. Piirang on 6 päringut tunnis IP-aadressi kohta. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Autentimist pole vaja | [link](https://zcode.z.ai) | OmniRoute ei talleta API-võtit. Kohalik ZCode'i rakendusserver kasutab olemasolevat builtin:zai-coding-plan sisselogimist. | — | ## OAuthi pakkujad (24) -| ID | Alias | Nimi | Sildid | Veebisait | Märkused | -| --------------- | ------------- | ------------------------- | ------ | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [link](https://antigravity.google) | Importige oma Antigravity CLI (`agy`) sisselogimisandmed (kleepige või laadige üles selle tokenifail), tuvastage automaatselt kohaliku CLI sisselogimine või logige sisse Google'iga. Kasutab ühist Antigravity tagasüsteemi (sh Claude'i mudeleid). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [link](https://aws.amazon.com/q/developer/) | Kasutab sama AWS Builder ID-d või imporditud värskendustokeni voogu nagu Kiro, kuid hoiab Amazon Q ühendused eraldi. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [link](https://cline.bot/cline-pass) | ClinePass on Cline'i 9,99 USA dollarit kuus maksev tellimus, mis hõlmab 10 avatud programmeerimismudelit. Logige sisse oma Cline'i kontoga (sama sisselogimine nagu Cline CLI/IDE puhul) või kleepige ClinePassi API-võti otse (app.cline.bot → Settings → API Keys). ClinePassi tellimus avab cline-pass/* mudelid. Kasutab uuesti Cline WorkOS OAuthi voogu. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Logige sisse ametliku CLI seadmekoodi voo kaudu või kleepige API-võti otse (saadetakse kujul Authorization: Bearer). Kataloog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [link](https://cli.devin.ai) | Nõuab Devin CLI binaarfaili. Autentimiseks käivitage `devin auth login` või sisestage oma WINDSURF_API_KEY. Paigaldamine: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [link](https://devin.ai) | Kleepige olemasolev Devin API-võti autenditud Devini seansist. Võtme eksportimise võimalus ja toimingud erinevad Devini versiooni ja konto järgi. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Sisestage pakkuja seadetes oma GHE eksemplari URL (nt https://ghe.company.com) ja autentige seejärel seadmevoo kaudu. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth pole seadistatud. Registreerige OAuthi rakendus aadressil https://gitlab.com/-/profile/applications, kasutades ümbersuunamise URI-d http://localhost:20128/callback ja ulatusi "ai_features read_user", seejärel määrake GITLAB_DUO_OAUTH_CLIENT_ID (ja soovi korral GITLAB_DUO_OAUTH_CLIENT_SECRET) ning taaskäivitage. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Logige sisse brauseriga või kleepige oma ~/.grok/auth.json (või JWT juurdepääsutoken) Grok Build CLI-st; refresh_token pööratakse mõlemal juhul automaatselt. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [link](https://www.kimi.com/code?aff=omniroute) | Logige sisse sama Kimi kontoga, mida kasutab Kimi Code CLI. OmniRoute kasutab CLI OAuthi voogu ja Kimi Coding Plani lõpp-punkte. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Tasuta pakett: 50 krediiti kuus (~25K–100K tokenit). ⚠️ Kiro kasutustingimused keelavad kolmanda osapoole puhverserveri või käituskeskkonna kasutamise. | -| `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Logige sisse oma Openference'i kontoga, et suunata päringud läbi api.openference.com-i. Järeldamiseks on vaja aktiivset paketti — OAuth võib autentimise õnnestuda, kuid ilma selleta tagastatakse 402. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [link](https://trae.ai) | Trae on ByteDance'i tehisintellektipõhine IDE (SOLO kaugagent). Andke hüpikaknas luba trae.ai kaudu või logige sisse aadressil solo.trae.ai ja kleepige juurdepääsutokenina Cloud-IDE-JWT (saadetakse kujul 'Authorization: Cloud-IDE-JWT ', kehtib umbes 14 päeva); web_id/biz_user_id/user_unique_id/scope/tenant/region edastatakse providerSpecificData kaudu. Kleebitud tokeneid ei saa ilma kasutajaliideseta värskendada — kleepige token pärast aegumist uuesti. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [link](https://x.ai) | Logige xAI-ga sisse, et kasutada api.x.ai mudeleid, nagu Grok 4.5. See on eraldiseisev Grok Build JWT seanssidest, mis kasutavad cli-chat-proxy.grok.com-i ja grok-build mudelialiaseid. | -| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed talletab LLM-i pakkujate (OpenAI, Anthropic, Google, Mistral, xAI) identimisteavet operatsioonisüsteemi võtmehoidlas. Kasutage allolevat nuppu Import, et need automaatselt leida ja importida. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Logige sisse oma Zedi kontoga (omarakenduse sisselogimine). OmniRoute genereerib ühekordse RSA-võtmepaari ja avab selle autoriseerimiseks zed.dev-i — kaug- või ilma kasutajaliideseta paigalduse korral kopeerige saadud 127.0.0.1 tagasikutse URL brauseri aadressiribalt ja kleepige see siia. See erineb ülaltoodud „Zed IDE” identimisteabe importimise kirjest: see vahendab vestluse lõpetamispäringuid Zedi enda hostitud mudeliagregaatori (cloud.zed.dev) kaudu, pakkudes teie Zedi paketi alusel Anthropic/OpenAI/Google/xAI mudeleid. | +| ID | Alias | Nimi | Sildid | Veebisait | Märkused | +| --------------- | ------------- | ------------------------- | ------ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [link](https://antigravity.google) | Importige oma Antigravity CLI (`agy`) sisselogimisandmed (kleepige või laadige üles selle tõendifail), tuvastage automaatselt kohalik CLI-sisselogimine või logige sisse Google'iga. Kasutab ühist Antigravity tagasüsteemi (sh Claude'i mudelid). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [link](https://aws.amazon.com/q/developer/) | Kasutab sama AWS Builder ID või imporditud värskendustõendi voogu nagu Kiro, kuid hoiab Amazon Q ühendused eraldi. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [link](https://cline.bot/cline-pass) | ClinePass on Cline'i 9,99 USA dollarit kuus maksev tellimus, mis sisaldab 10 avatud programmeerimismudelit. Logige sisse oma Cline'i kontoga (sama sisselogimine nagu Cline CLI-s/IDE-s) või kleepige otsene ClinePass API-võti (app.cline.bot → Settings → API Keys). ClinePassi tellimus avab cline-pass/* mudelid. Kasutab uuesti Cline WorkOS OAuthi voogu. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Logige sisse ametliku CLI seadmekoodi voo kaudu või kleepige otsene API-võti (saadetakse kujul Authorization: Bearer). Kataloog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [link](https://cli.devin.ai) | Nõuab Devin CLI binaarfaili. Autentimiseks käivitage `devin auth login` või esitage oma WINDSURF_API_KEY. Paigaldamine: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [link](https://devin.ai) | Kleepige autentitud Devini seansist olemasolev Devin API-võti. Võtme eksportimise saadavus ja toimingud erinevad Devini versiooni ja konto järgi. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Sisestage pakkuja seadetes oma GHE eksemplari URL (nt https://ghe.company.com) ja seejärel autentige seadmevoo kaudu. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth ei ole seadistatud. Registreerige OAuthi rakendus aadressil https://gitlab.com/-/profile/applications, kasutades ümbersuunamise URI-d http://localhost:20128/callback ja ulatusi "ai_features read_user", seejärel määrake GITLAB_DUO_OAUTH_CLIENT_ID (ja soovi korral GITLAB_DUO_OAUTH_CLIENT_SECRET) ning taaskäivitage. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Logige sisse brauseriga või kleepige Grok Build CLI-st oma ~/.grok/auth.json (või JWT juurdepääsutõend); refresh_token pööratakse mõlemal juhul automaatselt. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [link](https://www.kimi.com/code?aff=omniroute) | Logige sisse sama Kimi kontoga, mida kasutab Kimi Code CLI. OmniRoute kasutab CLI OAuthi voogu ja Kimi Coding Plani lõpp-punkte. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Tasuta pakett: 50 krediiti kuus (~25K–100K tõendit). ⚠️ Kiro teenusetingimused keelavad kolmanda osapoole puhverserveri või rakendusraamistiku kasutamise. | +| `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Logige sisse oma Openference'i kontoga, et suunata päringud api.openference.com kaudu. Sisaldab tasuta paketi juurdepääsu mudelitele Qwen3.8 27b ja Llama 3.2 3B — kehtivad paketitingimused leiate aadressilt openference.com/pricing. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [link](https://trae.ai) | Trae on ByteDance'i tehisintellektipõhine IDE (SOLO kaugagent). Andke hüpikaknas luba trae.ai kaudu või logige sisse aadressil solo.trae.ai ja kleepige Cloud-IDE-JWT (saadetakse kujul 'Authorization: Cloud-IDE-JWT ', kehtivusaeg ~14 päeva) juurdepääsutõendina; web_id/biz_user_id/user_unique_id/scope/tenant/region edastatakse providerSpecificData kaudu. Kleebitud tõendeid ei saa kasutajaliideseta režiimis värskendada — kleepige need aegumisel uuesti. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [link](https://x.ai) | Logige xAI-ga sisse, et kasutada api.x.ai mudeleid, nagu Grok 4.5. See erineb Grok Build JWT seanssidest, mis kasutavad cli-chat-proxy.grok.com-i ja grok-build mudelialiaseid. | +| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed talletab LLM-i pakkujate mandaate (OpenAI, Anthropic, Google, Mistral, xAI) operatsioonisüsteemi võtmehoidlas. Kasutage nende automaatseks leidmiseks ja importimiseks allolevat nuppu Import. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Logige sisse oma Zedi kontoga (omarakenduse sisselogimine). OmniRoute loob ühekordse RSA-võtmepaari ja avab selle autoriseerimiseks zed.dev-i — kaug- või kasutajaliideseta paigalduse korral kopeerige saadud 127.0.0.1 tagasikutse URL oma brauseri aadressiribalt ja kleepige see siia. See erineb ülalolevast „Zed IDE“ mandaatide importimise kirjest: see vahendab vestluslõpetusi Zedi enda hostitud mudeliagregaatori (cloud.zed.dev) kaudu, pakkudes teie Zedi paketi alusel Anthropic/OpenAI/Google/xAI mudeleid. | ## Veebiküpsiste pakkujad (34) @@ -115,252 +115,252 @@ Kasutage iga pakkuja lubamiseks, seadistamiseks ja testimiseks juhtpaneeli aadre | `zai-web` | `zw` | Z.ai Web | Veebiküpsis | [link](https://chat.z.ai) | Kopeerige „token“-väärtus asukohast chat.z.ai → DevTools → Rakendus → Kohalik salvestusruum. Ärge kopeerige küpsiseid; OmniRoute töötleb päringupõhist CAPTCHA-t oma brauseritranspordi kaudu. | — | | `zenmux-free` | `zmf` | ZenMux Free (veeb) | Veebiküpsis | [link](https://zenmux.ai) | Logige saidil zenmux.ai sisse, seejärel eksportige EditThisCookie või Cookie-Editori abil kõik küpsised ja kleepige täielik Cookie-päise string siia. Värskendage umbes iga 30 päeva järel. | — | -## API-võtme pakkujad (tasulised / tasulised tasuta krediidiga) (242) - -| ID | Alias | Nimi | Sildid | Veebisait | Märkused | -| ------------------------ | --------------- | ------------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API võti | [link](https://ai.360.cn) | Hankige API võti aadressilt ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | API võti, agregaator | [link](https://agentrouter.org) | Registreerumisel $200 tasuta krediiti – mitme mudeli marsruutimise lüüs | -| `agnes` | `agnes` | Agnes AI | API võti, video | [link](https://agnes-ai.com) | Hankige API võti aadressilt agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Hiina) | API võti | [link](https://api.agnes-ai.cn) | Hankige API võti Agnes CN-i saidilt. | -| `ai21` | `ai21` | AI21 Labs | API võti | [link](https://www.ai21.com) | Registreerumisel $10 proovikrediiti (kehtib 3 kuud), krediitkaarti pole vaja | -| `aimlapi` | `aiml` | AI/ML API | API võti, agregaator | [link](https://aimlapi.com) | Tasuta pakett on peatatud (2026) — AI/ML API on nüüd saadaval ainult kasutuspõhise hinnastamisega (minimaalne täiendus $20); korduvat tasuta krediiti ei pakuta. | -| `ainative` | `ainative` | AINative Studio | API võti | [link](https://ainative.studio) | Looge aadressil ainative.studio tasuta API võti (kaarti pole vaja), seejärel kleepige see siia Bearer-loana. | -| `aion` | `aion` | Aion Labs | API võti | [link](https://www.aionlabs.ai) | Looge aadressil aionlabs.ai tasuta API võti (kaarti pole vaja), seejärel kleepige see siia Bearer-loana. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API võti | [link](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Hiina) | API võti | [link](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API võti | [link](https://developer.ant-ling.com/en/docs/) | Registreeruge ja looge API võti Ant Ling API konsoolis (https://chat.ant-ling.com/open), seejärel kleepige see siia. OmniRoute suunab vestlusliikluse aadressile https://api.ant-ling.com/v1/chat/completions; teenusepakkuja ühildub OpenAI-ga ning pakub ka Anthropicuga ühilduvat liidest. | -| `anthropic` | `anthropic` | Anthropic | API võti | [link](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API võti, agregaator | [link](https://anyapi.ai) | Tasuta pakett: sobivatele Free/Basic-mudelitele 100 000 ANY Tokenit päevas ja 100 RPM-i; krediitkaarti pole vaja. | -| `api-airforce` | `af` | Api.airforce | API võti | [link](https://api.airforce) | 55 tasuta paketi mudelit, sealhulgas Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API võti | [link](https://arcee.ai) | Hankige API võti aadressilt arcee.ai | -| `auriko` | `auriko` | Auriko | API võti, agregaator | [link](https://www.auriko.ai) | Tasuta pakett pakub 1000 platvormi RPM-i ja 10 000 BYOK RPM-i. Platvormi inferentsiga kaasnevad endiselt teenusepakkuja kulud; see ei ole tasuta tokenite kogum ega piiramatu tasuta inferents. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API võti, ettevõtetele | [link](https://learn.microsoft.com/azure/ai-foundry) | Kasutage oma Azure AI Foundry võtit. Baas-URL võib olla https://.services.ai.azure.com/openai/v1/ või https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | API võti, ettevõtetele | [link](https://azure.microsoft.com/products/ai-services/openai-service) | Kasutage oma Azure OpenAI API võtit. Baas-URL peaks olema teie ressursi lõpp-punkt, näiteks https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API võti | [link](https://b.ai) | Bearer API võti b.ai OpenAI-ga ühilduva LLM-lüüsi jaoks (erineb teenusest TheB.AI). Looge võti aadressil https://docs.b.ai, seejärel kasutage OpenAI-ga ühilduva baas-URL-ina https://api.b.ai/v1. | -| `baichuan` | `baichuan` | Baichuan | API võti | [link](https://www.baichuan-ai.com/) | Hankige API võti aadressilt platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | API võti | [link](https://ernie.baidu.com/) | Hankige API võti aadressilt console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API võti | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API võti | [link](https://baseten.co) | $30 tasuta proovikrediiti GPU inferentsiks | -| `bazaarlink` | `bzl` | BazaarLink | API võti | [link](https://bazaarlink.ai) | Kasutage oma BazaarLinki API võtit (algab tekstiga sk-bl-) päises Authorization: Bearer . OpenAI SDK töötab baas-URL-iga https://bazaarlink.ai/api/v1. Mudelid kasutavad vormingut provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | API võti, ettevõtetele | [link](https://aws.amazon.com/bedrock) | Kasutage oma Amazon Bedrocki API võtit ja konfigureerige AWS-i piirkond, kus teie mudelid on lubatud (näiteks eu-west-2). OmniRoute kutsub Bedrocki loomulikku Converse API-t otse. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API võti, pilt | [link](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API võti | [link](https://blackbox.ai) | ⚠️ **AEGUNUD.** api.blackbox.ai tagastab iga teekonna variandi puhul HTTP 404 (kontroll 2026-08-21); avalik inferentsiliides on viidud piiratud juurdepääsuga lõpp-punkti enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | API võti | [link](https://www.bluesminds.com) | Iga päev tasuta pi-krediit — toetab enam kui 200 mudelit, sealhulgas GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API võti | [link](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API võti | [link](https://bytez.com) | $1 tasuta krediiti, uueneb iga 4 nädala järel | -| `cerebras` | `cerebras` | Cerebras | API võti | [link](https://inference.cerebras.ai) | Ühekordne $5 registreerumiskrediit (kehtib 30 päeva); makseviis on nõutav. Tegemist ei ole korduva tasuta paketiga. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API võti | [link](https://hyper.charm.land) | Registreerumisel 100 tasuta igakuist Hypercreditit | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API võti, agregaator | [link](https://api.oriper.com) | Ametlikud metaandmed reklaamivad 2 miljonit tokenit kuus, kuid avalik sait ja dokumentatsioon olid auditi ajal blokeeritud; käsitlege kvooti ja seost kaubamärgiga kinnitamata teabena. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-võti, agregaator | [link](https://chatanywhere.tech) | Ainult isiklikuks, hariduslikuks või teaduslikuks kasutamiseks: avalikus dokumentatsioonis on märgitud 10 000 punkti päevas ja 200 päringut päevas IP/võtme kohta; ärge kasutage kommertsliikluseks. | -| `cheaperinference` | `cinf` | Cheaper Inference | API-võti | [link](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API-võti | [link](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API-võti, agregaator | [link](https://chutes.ai) | Bearer API-võti Chutesi OpenAI-ga ühilduva lüüsi jaoks. | -| `clarifai` | `clarifai` | Clarifai | API-võti, ettevõttelahendus | [link](https://docs.clarifai.com) | Kasutage oma Clarifai PAT-i või rakendusepõhist API-võtit. OmniRoute kasutab OpenAI-ga ühilduvat lõpp-punkti aadressil https://api.clarifai.com/v2/ext/openai/v1 ja autendib päisega Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-võti, agregaator | [link](https://cloudcode.one) | Avaldatud tasuta mudelite hulka kuuluvad glm-4.7-flash ja glm-4.6v-flash; arvulist kvooti pole avaldatud ning võtme loomine võib nõuda krediiti või kupongi. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-võti | [link](https://developers.cloudflare.com/workers-ai) | Nõuab API Tokenit JA Account ID-d (leitav aadressilt dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API-võti | [link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API-võti | [link](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API-võti | [link](https://cohere.com) | Tasuta prooviperiood: testimiseks 1 000 API-kutset kuus, krediitkaarti pole vaja | -| `command-code` | `cmd` | Command Code | API-võti | [link](https://commandcode.ai/) | Kasutage Command Code'i API-võtit. Päringud saadetakse Command Code'i lõpp-punkti /provider/v1/chat/completions. | -| `coze` | `coze` | Coze | API-võti | [link](https://coze.com) | Hankige API-võti aadressilt coze.com/open/api | -| `crof` | `crof` | CrofAI | API-võti | [link](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API-võti | [link](https://cursor.com/dashboard/api) | Kleepige aadressilt cursor.com/dashboard/api Cursor'i kasutaja API-võti (crsr_...). OmniRoute vahetab selle vajaduse korral seansitõendi vastu; IDE ega cursor-agent'i installimine pole vajalik. Kasutuse eest esitatakse arve võtmega seotud Cursor'i paketile. | -| `dahl` | `dahl` | Dahl | API-võti | [link](https://inference.dahl.global) | Tõendi automaatseks genereerimiseks klõpsake „Add Account” või lisage API-võti käsitsi. | -| `databricks` | `databricks` | Databricks | API-võti, ettevõttelahendus | [link](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API-võti, ettevõttelahendus | [link](https://docs.datarobot.com) | Kasutage oma DataRobot'i API-tõendit. Valikuline baas-URL võib olla konto juuraadress (LLM Gateway jaoks) või juurutuse URL teekonna /api/v2/deployments/ all. | -| `deepai` | `deepai` | DeepAI | API-võti, pilt | [link](https://deepai.org) | Kasutage oma DeepAI API-võtit. Hankige see aadressilt deepai.org — vajalik on Pro-tellimus ($9.99 kuus). | -| `deepinfra` | `deepinfra` | DeepInfra | API-võti | [link](https://deepinfra.com) | Registreerumisel tasuta krediit API testimiseks ja mudelite uurimiseks | -| `deepseek` | `ds` | DeepSeek | API-võti | [link](https://platform.deepseek.com) | Registreerumisel 5M tasuta tõendit — krediitkaarti pole vaja | -| `dgrid` | `dgrid` | DGrid | API-võti | [link](https://dgrid.ai) | DGrid Free Models Router: 10 päringut minutis ja 100 päringut päevas. Ühekordne $5 konto täiendamine suurendab piirangu kuni 20 päringuni minutis ja 1 000 päringuni päevas. | -| `dify` | `dify` | Dify | API-võti | [link](https://dify.ai) | Hankige API-võti oma Dify eksemplarist. | -| `digitalocean` | `digitalocean` | DigitalOcean | API-võti | [link](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API-võti | [link](https://dit.ai) | Kasutage oma dit.ai API-võtit päises Authorization: Bearer . Täielikult OpenAI-ga ühilduv — otseasendus, muutke vaid baas-URL-iks https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API-võti | [link](https://doubao.com) | Hankige API-võti aadressilt console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | API-võti, agregaator | [link](https://www.dxnt.com) | Tasuta kontode dokumenteeritud piirang on 100 kutset päevas; kvoot võib kutsete kaudu suureneda ja kontoti erineda. | -| `electronhub` | `electronhub` | Electron Hub | API-võti, agregaator | [link](https://www.electronhub.ai) | Tasuta pakett: 5 RPM, $0.25 krediiti nädalas ja 10 Neutrinot päevas :free-mudelite jaoks; kehtivad ka perekonnaeelarved. | -| `empower` | `empower` | Empower | API-võti, agregaator | [link](https://docs.empower.dev) | Bearer API-võti Empoweri OpenAI-ga ühilduva lõpp-punkti jaoks. | -| `eurouter` | `eurouter` | EURouter | API-võti, agregaator | [link](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API-võti | [link](https://factory.ai) | Bearer API-võti Factory OpenAI-ga ühilduva lüüsi jaoks. | -| `fal-ai` | `fal` | Fal.ai | API-võti, pilt | [link](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API-võti, agregaator | [link](https://fastrouter.ai) | Sufiksiga :free mudelid võimaldavad organisatsiooni ja mudeli kohta 10 päringut päevas; saadavus võib muutuda. | -| `featherless-ai` | `featherless` | Featherless AI | API-võti | [link](https://featherless.ai) | Saadaval on tasuta tase — krediitkaarti pole vaja | -| `fenayai` | `fenayai` | FenayAI | API-võti, agregaator | [link](https://fenayai.com) | Bearer API-võti FenayAI OpenAI-ga ühilduva lüüsi jaoks. | -| `fireworks` | `fireworks` | Fireworks AI | API-võti | [link](https://fireworks.ai) | Registreerumisel $1 tasuta algkrediiti API testimiseks | -| `free-ai` | `free-ai` | Free.ai | API-võti, agregaator | [link](https://free.ai) | Pärast e-posti aadressi kinnitamist saab ise hostitud mudelite jaoks kasutada 30 000 tõendit päevas. Kogumi ületava kasutuse eest võidakse esitada arve omahinna alusel ning esmaklassilised välised mudelid on tasulised. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API-võti | [link](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API-võti | [link](https://freebuff.com) | Sisestage Freebuffi / Codebuffi autentimistõend (saadud CLI-s sisselogimise või automatiseeritud koguja kaudu). | -| `freeinference` | `freeinference` | FreeInference | API-võti, agregaator | [link](https://freeinference.org) | Tasuta juurdepääs teadusuuringuteks ilma kaardita; mitte-Harvardi taotlejad vajavad käsitsi kinnitamist ning numbrilist kvooti pole avalikult tagatud. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API-võti | [link](https://freemodel.dev) | Registreerumisel $300 tasuta krediiti — krediitkaarti pole vaja. Juurdepääs mudelitele GPT-5.4 ja GPT-5.5 (OpenAI uusimad lipulaevmudelid) OpenAI-ga ühilduva API kaudu. | -| `freetheai` | `fta` | FreeTheAi | API-võti, agregaator | [link](https://freetheai.xyz) | Tasuta API-võtme saamiseks liituge FreeTheAi Discordiga. | -| `friendliai` | `friendli` | FriendliAI | API-võti | [link](https://friendli.ai) | Tasuta pakett serverita inferentsiks — krediitkaarti pole vaja | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-võti, agregaator | [link](https://g4f.space) | Teenige anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev liikmevõtit (looge see aadressil g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-võti, agregaator | [link](https://g4f.space) | Teenige anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev liikmevõtit (looge see aadressil g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-võti, agregaator | [link](https://g4f.space) | Teenige anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev liikmevõtit (looge see aadressil g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-võti, agregaator | [link](https://g4f.space) | Teenige anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev liikmevõtit (looge see aadressil g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-võti, agregaator | [link](https://g4f.space) | Teenige anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev liikmevõtit (looge see aadressil g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | API-võti | [link](https://galadriel.com) | ⚠️ **AEGUNUD.** api.galadriel.ai ei lahendu enam (kontroll 2026-06-19); inferentsi-API näib olevat lõpetatud. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API-võti | [link](https://aistudio.google.com) | Google AI Studio kaudu on saadaval tasuta pakett; rakenduvad kehtivad mudelipõhised kvoodid ja piirkondlikud piirangud | -| `getgoapi` | `ggo` | GoAPI | API-võti, agregaator | [link](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API-võti | [link](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API-võti | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLabi isiklik pääsutõend avaliku Code Suggestions API jaoks. Kui te ei kasuta gitlab.com-i, seadistage isemajutatud baas-URL. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-võti | [link](https://opengateway.gitlawb.com) | Tasuta MiMo (xiaomi/mimo-v2.5) tühistati 2026-05 — Opengateway on nüüd kasutuspõhise krediidi lüüs; korduvat tasuta mudelit pole. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-võti | [link](https://opengateway.gitlawb.com) | Tasuta Nemotroni kampaania lõppes 2026-06 — GMI Cloudi marsruut kasutab nüüd ainult kasutuspõhist krediiti. | -| `glm` | `glm` | GLM Coding | API-võti | [link](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Hiina) | API-võti | [link](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API-võti | [link](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API-võti | [link](https://greenpt.com) | API-tellimuse loomine on tasuta; inferentsi eest võetakse tasu tokenite arvu alusel. Tasuta inferentsimahtu pole avaldatud. | -| `groq` | `groq` | Groq | API-võti | [link](https://groq.com) | Tasuta pakett: mudelipõhised piirangud (200K tokenit päevas vestlusmudeli kohta; RPM/RPD piiranguid vt console.groq.com/docs/rate-limits) — makseviisi pole salvestatud. | -| `haiper` | `hp` | Haiper | API-võti, video | [link](https://haiper.ai) | Hankige API-võti aadressilt haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | API-võti | [link](https://api.hcnsec.cn) | Hankige API-võti aadressilt api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | API-võti, agregaator | [link](https://helixmind.online) | Varem levinud väited 3 RPM/50 RPD ja kaardi mittevajalikkuse kohta ei leidnud 2026-08-02 auditi käigus kinnitust; praeguse kvoodi ja arvelduse kontrollimiseks on vaja kontot. | -| `helyxai` | `helyxai` | Helyx AI | API-võti, agregaator | [link](https://helyxai.space) | Toimiva tasuta paketi dokumentatsiooni kohaselt on limiit 100,000 tokenit päevas; saidi eraldiseisev turundusväide 2M+ on sellega vastuolus ja seda ei käsitleta kvoodigarantiina. | -| `heroku` | `heroku` | Heroku AI | API-võti, ettevõtetele | [link](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API-võti | [link](https://huggingface.co) | Tasuta Inference API tuhandetele mudelitele (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API-võti | [link](https://hyperbolic.xyz) | Registreerumisel $1-5 proovikrediiti serverita inferentsiks | -| `ideogram` | `ideo` | Ideogram | API-võti | [link](https://ideogram.ai) | Hankige API-võti aadressilt ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | API-võti | [link](https://xinghuo.xfyun.cn) | Hankige API-võti aadressilt console.xfyun.cn | -| `inception` | `inception` | Inception | API-võti | [link](https://docs.inceptionlabs.ai) | Registreerumisel 10M tasuta tokenit, krediitkaarti pole vaja. | -| `inference-net` | `inet` | Inference.net | API-võti | [link](https://inference.net) | Registreerumisel $25 tasuta krediiti, lisaks on saadaval teadusuuringute toetused | -| `internlm` | `internlm` | InternLM (Intern-S1) | API-võti | [link](https://internlm.intern-ai.org.cn/) | Tasuta kuukvoot ~1M sisend- / 3M väljundtokenit (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API-võti, manustamine/ümberjärjestamine | [link](https://jina.ai) | Bearer API-võti teenuse api.jina.ai jaoks — manustamine, ümberjärjestamine, klassifitseerimine, segmentimine ja otsing. Juhtpaneeli võtmed on JINA_AI_API_KEY suhtes prioriteetsed. See ei ole Readeri / r.jina.ai kaart ega hangi URL-e. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-võti | [link](https://jina.ai/reader) | Bearer API-võti r.jina.ai URL-ist Markdowni teisendamiseks (ainult /v1/web/fetch). Ei paku teenuseid /v1/embeddings ega /v1/rerank. Töötab sama Jina luba nagu Foundation API puhul; OmniRoute kasutab tühja kaardi korral uuesti jina-ai juhtpaneeli võtit või JINA_AI_API_KEY. | -| `kenari` | `kenari` | Kenari | API-võti | [link](https://kenari.id) | Kasutage oma Kenari API-võtit (kn-...) päises Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API-võti | [link](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API-võti, agregaator | [link](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (pärand-Moonshot API) | API-võti | [link](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-võti | [link](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API-võti | [link](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API-võti, agregaator | [link](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API-võti, video | [link](https://leonardo.ai) | Hankige API-võti aadressilt leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | API-võti | [link](https://liquid.ai) | Hankige API-võti aadressilt liquid.ai | -| `literouter` | `literouter` | LiteRouter | API-võti, agregaator | [link](https://literouter.com) | Tasuta mudelivariandid kasutavad järelliidet :free; päevased krediidilimiidid erinevad mudeliti ja tasuta sisend on piiratud 5000 sõnega. | -| `llamagate` | `llamagate` | LlamaGate | API-võti | [link](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-võti, agregaator | [link](https://llm.kiwi) | Tasuta pakett võimaldab kasutada mudeleid auto ja hrLLM; avaldatud 40 päringu tunnilimiit kehtib mudelile hrLLM. | -| `llm7` | `llm7` | LLM7.io | API-võti | [link](https://llm7.io) | Kasutage mis tahes mittetühja võtit (näiteks 'unused'). Kui vanemad sisseehitatud mudelid tagastavad model_unavailable, kasutage valikut Available Models → Import from /models või Auto-Sync; kontrollitud töötav mudel: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API-võti, agregaator | [link](https://llmgateway.io) | Majutatud tasuta pakett: tasuta hinnaga mudelid on piiratud viie päringuga 10 minuti jooksul, kui kontol puudub krediit. | -| `logfare` | `logfare` | Logfare | API-võti, agregaator | [link](https://logfare.ai) | Looge aadressil https://logfare.ai/register tasuta konto (kasutajanimi/parool, e-posti kinnitamist pole vaja), et saada kohe API-võti, seejärel kleepige see siia Bearer-loana. | -| `longcat` | `lc` | LongCat AI | API-võti | [link](https://longcat.chat/platform/docs) | Tasuta: pärast konto registreerimist ja KYC-kinnitust antakse ühekordselt 10 miljonit sõnet (LongCat-2.0). Ainult ühekordne — see ei ole korduv päeva- ega kuupõhine limiit. | -| `magnific` | `freepik` | Magnific | API-võti, pilt | [link](https://www.magnific.com) | Hankige API-võti aadressilt magnific.com/user/api-keys (päis x-magnific-api-key). Freepiku pärand-arendajavõtmed töötavad endiselt. | -| `maritalk` | `maritalk` | Maritalk | API-võti | [link](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API-võti, agregaator | [link](https://meganova.ai) | Tasuta registreerimine ilma kaardita. Avaldatud Tier 1 mudelipõhised kvoodid võimaldavad kokku 550 päringut päevas; need ei moodusta ühist globaalset kogumit ning lubamise korral võivad rakenduda tasulised ülekasutustasud. | -| `meta-llama` | `meta` | Meta Llama API | API-võti | [link](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API-võti, video | [link](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Hiina) | API-võti | [link](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API-võti | [link](https://mistral.ai) | Tasuta Experimenti tase: kiiruspiiranguga juurdepääs kõigile mudelitele, krediitkaarti pole vaja | -| `mixedbread` | `mxbai` | Mixedbread AI | API-võti | [link](https://www.mixedbread.com) | Bearer API-võti Mixedbreadi manustamise API jaoks. | -| `mixlayer` | `mixlayer` | Mixlayer | API-võti, agregaator | [link](https://www.mixlayer.com) | Mudel qwen/qwen3.5-4b-free on prototüüpimiseks tasuta ja kiiruspiiranguga; kindlat avalikku RPM-i ega päevakvooti pole kinnitatud. | -| `mnn-ai` | `mnn-ai` | MNN AI | API-võti, agregaator | [link](https://mnnai.ru) | Tasuta pakett: 1 $ kuus krediiti, 10 RPM-i ja juurdepääs ainult tähisega Free mudelitele. | -| `modal` | `mdl` | Modal | API-võti, ettevõte | [link](https://modal.com/docs) | Kasutage Bearer-luba, mis kaitseb teie Modali juurutust, kui see on lubatud. Baas-URL peab osutama teie OpenAI-ga ühilduvale Modali rakendusele, näiteks https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API-võti | [link](https://modelscope.cn) | Tasuta tase ModelScope API-Inference'i kaudu — vajalik on Alibaba konto. | -| `monsterapi` | `monster` | MonsterAPI | API-võti | [link](https://monsterapi.ai) | ⚠️ **AEGUNUD.** Monster API lõpetas tegevuse 2026-06-30. Kasutage alternatiivseid OpenAI-ga ühilduvaid pakkujaid. | -| `moonshot` | `moonshot` | Kimi | API-võti | [link](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API-võti | [link](https://morphllm.com) | Tasuta tase: 250 000 krediiti kuus, 0 $ | -| `muse-code` | `mc` | Muse Code (Meta) | API-võti | [link](https://github.com/meta-llama/llama-stack) | Kasutage oma keskkonnamuutujat META_API_KEY Bearer-loana. Muse Code CLI kasutab OpenAI Responses API andmevahetusvormingut (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API-võti, agregaator | [link](https://naga.ac) | Hankige API-võti aadressilt naga.ac — saadaval on registreerimine Google'i, GitHubi või Discordi kaudu. | -| `naga-ai` | `naga-ai` | Naga AI | API-võti, agregaator | [link](https://naga.ac) | Märgendiga :free mudelid on avalikult loetletud, kuid arvulist kvooti pole kinnitatud. Naga eeskirjad hoiatavad, et tasuta paketi viipasid ja väljundeid võidakse koguda või treenimiseks kasutada. | -| `nanogpt` | `nanogpt` | NanoGPT | API-võti | [link](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API-võti | [link](https://bynara.id) | Looge tasuta NaraRouteri konto, siduge oma Telegram (nõutav enne /v1 vastuste kasutamist) ja seejärel kleepige võti siia Bearer-tõendina. | -| `navy` | `navy` | NavyAI | API-võti | [link](https://api.navy) | Looge NavyAI juhtpaneelil tasuta API-võti ja seejärel kleepige see siia Bearer-tõendina. | -| `nebius` | `nebius` | Nebius AI | API-võti | [link](https://nebius.com) | Registreerumisel ligikaudu 1 $ proovikrediiti API testimiseks | -| `nlpcloud` | `nlpc` | NLP Cloud | API-võti | [link](https://docs.nlpcloud.com) | Kasutage oma NLP Cloudi API-võtit päises Authorization: Token . Vaikimisi kasutab OmniRoute vestlusroboti lõpp-punkti aadressil https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | API-võti | [link](https://nomic.ai) | Hankige API-võti aadressilt atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | API-võti | [link](https://portal.nousresearch.com/help) | Kasutage oma Nous Portali API-võtit. OmniRoute kasutab ametlikku OpenAI-ga ühilduvat inferentsi lõpp-punkti aadressil https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API-võti, video, agregaator | [link](https://novita.ai) | Registreerumisel 0,50 $ proovikrediiti (kehtib ligikaudu ühe aasta) | -| `nscale` | `nscale` | nScale | API-võti | [link](https://nscale.com) | Registreerumisel 5 $ tasuta krediiti inferentsi testimiseks | -| `nube` | `nube` | Nube.sh | API-võti | [link](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API-võti | [link](https://build.nvidia.com) | Tasuta arendajajuurdepääs: ~40 RPM, üle 70 mudeli (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API-võti, ettevõtetele | [link](https://www.oracle.com/artificial-intelligence/generative-ai) | Kasutage oma OCI Generative AI API-võtit või IAM-i Bearer-tõendit. Baas-URL võib olla https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | API-võti, agregaator | [link](https://ofox.ai) | Praeguses kataloogis reklaamitakse üle 10 tasuta mudeli ilma avaliku arvulise kvoodita; enne tootmiskeskkonnas kasutamist vaadake üle algallika päritolu ning andmete säilitamise ja treenimise tingimused. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-võti | [link](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API-võti | [link](https://1min.ai) | Looge API-võti aadressil https://docs.1min.ai/docs/api/create-api-key ja seejärel kleepige see siia. | -| `openadapter` | `oad` | OpenAdapter | API-võti | [link](https://openadapter.dev) | Kasutage oma OpenAdapteri API-võtit päises Authorization: Bearer sk-cv-. Täielikult OpenAI-ga ühilduv. API baas-URL: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API-võti | [link](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API-võti | [link](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-võti | [link](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API-võti | [link](https://openference.com) | Tasuta pakett: kolmepäevane prooviperiood avatud lähtekoodiga mudelitega — krediitkaarti pole vaja | -| `openrouter` | `openrouter` | OpenRouter | API-võti, agregaator | [link](https://openrouter.ai) | Tasuta mudelid hinnaga 0 $/tõend ja järelliitega :free – 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API-võti | [link](https://openvecta.com) | Registreerumisel tasuta krediiti OpenAI-ga ühilduvaks inferentsiks LLM-ide, manuste ja arutlusmudelitega | -| `opper` | `opper` | Opper | API-võti, agregaator | [link](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API-võti | [link](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API-võti | [link](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API-võti | [link](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-võti | [link](https://www.perplexity.ai) | Kasutage oma Perplexity API-võtit. OmniRoute suunab Agent API mudeli-ID-d Perplexity Responses-ühilduva lõpp-punkti kaudu. | -| `piapi` | `pi` | PiAPI | API-võti, agregaator | [link](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API-võti | [link](https://pioneer.ai) | 75 $ tasuta kasutuskrediiti — krediitkaarti pole vaja | -| `plamo` | `plamo` | PLaMo | API-võti | [link](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API-võti, agregaator | [link](https://creator.poe.com/api-reference) | Bearer API-võti Poe OpenAI-ga ühilduva API jaoks. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API-võti, agregaator | [link](https://poixe.com) | Praegused avalikud tasuta piirangud on väikesed ja mudelirühmapõhised: suurte mudelite puhul 2 RPM / 5 RPD ning väikeste mudelite puhul 20 RPM / 50 RPD. | -| `pollinations` | `pol` | Pollinations AI | API-võti, video | [link](https://pollinations.ai) | Dokumenteeritud tasuta mudelite anonüümne ja võtmeta kasutamine toimib parima võimaliku pingutuse põhimõttel. Kohalik v3.8.50 kontroll (2026-07-31) tagastas OmniRoute'i kaudu vea 401 ning sama võrgu otseste ülesvoolupäringute korral Cloudflare'i vea 1010. Premium-mudelid nõuavad endiselt Pollinationsi API-võtit saidilt enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API-võti | [link](https://poolside.ai) | Laguna S 2.1 ja XS 2.1 on eelvaateperioodil tasuta; avalikku arvulist kvooti pole avaldatud. | -| `predibase` | `predibase` | Predibase | API-võti | [link](https://predibase.com) | ⚠️ **AEGUNUD.** serving.app.predibase.com ei lahendu enam (kontroll 2026-06-19); hallatud teenindus-API näib olevat lõpetatud. | -| `publicai` | `publicai` | PublicAI | API-võti | [link](https://publicai.co) | Nõuab API-võtit — ühekordne registreerumiskrediit, seejärel tasuline | -| `qianfan` | `qianfan` | Baidu Qianfan | API-võti | [link](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API-võti | [link](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API-võti | [link](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-võti | [link](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API-võti, pilt | [link](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API-võti | [link](https://regolo.ai) | Hankige oma Regolo API-võti saidilt regolo.ai ja kleepige see siia Bearer-loana. | -| `reka` | `reka` | Reka | API-võti | [link](https://docs.reka.ai/chat/overview) | Kasutage oma Reka API-võtit. OmniRoute toetab OpenAI-ga ühilduvat baas-URL-i https://api.reka.ai/v1 ning saadab ühilduvuse tagamiseks nii Authorization- kui ka X-Api-Key-päise. | -| `requesty` | `requesty` | Requesty | API-võti | [link](https://requesty.ai) | Tasuta pakett: ~200 päringut päevas – mitme mudeli marsruutimise lüüs (üle 300 mudeli) | -| `routeway` | `routeway` | Routeway | API-võti | [link](https://routeway.ai) | Looge saidil routeway.ai tasuta API-võti ja kleepige see siia Bearer-loana. | -| `runwayml` | `runway` | Runway | API-võti, video | [link](https://docs.dev.runwayml.com) | Kasutage oma Runway API-võtit kujul Authorization: Bearer . OmniRoute kasutab praegust Runway API-t aadressil https://api.dev.runwayml.com/v1 ja saadab nõutava X-Runway-Version-päise automaatselt. | -| `sambanova` | `samba` | SambaNova | API-võti | [link](https://sambanova.ai) | Registreerumisel $5 tasuta krediiti (kehtib 30 päeva), krediitkaarti pole vaja | -| `sap` | `sap` | SAP Generative AI Hub | API-võti, ettevõtetele | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Kasutage oma SAP AI Core'i Bearer-luba. Baas-URL võib olla teie AI_API_URL-i juur-URL või Generative AI Hubi deploymentUrl. | -| `sarvam` | `sarvam` | Sarvam AI | API-võti | [link](https://docs.sarvam.ai) | Registreerumisel ₹1,000 tasuta krediiti, mis ei aegu kunagi | -| `scaleway` | `scw` | Scaleway AI | API-võti | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Uutele kontodele 1M tasuta tokenit – EL-i/GDPR-iga ühilduv (Pariis), Qwen3 235B ja Llama 70B | -| `sealion` | `sealion` | SEA-LION | API-võti | [link](https://sea-lion.ai) | Logige saidile sea-lion.ai Google'iga sisse (kaarti pole vaja, piirkondlikke piiranguid pole), looge API-võti ja kleepige see siia. | -| `seekai` | `ska` | SeekAi | API-võti, agregaator | [link](https://seekai.cc) | Looge aadressil https://seekai.cc API-võti ja kleepige see siia Bearer-loana. | -| `segmind` | `segmind` | Segmind | API-võti, pilt, video | [link](https://segmind.com) | Kasutage oma Segmindi API-võtit x-api-key-päises. OmniRoute kasutab aadressi https://api.segmind.com/v1/ ja tagastab loodud pildi või video baidid otse. | -| `sensenova` | `sensenova` | SenseNova | API-võti | [link](https://platform.sensenova.cn) | Hankige API-võti saidilt platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | API-võti | [link](https://cloud.siliconflow.com) | $1 tasuta krediiti ning pärast isikusamasuse kinnitamist praegu loetletud $0 mudelid; saadavus ja piirangud võivad muutuda | -| `snowflake` | `snowflake` | Snowflake Cortex | API-võti, ettevõtetele | [link](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API-võti | [link](https://xinghuo.xfyun.cn) | Hankige API-võti saidilt console.xfyun.cn | -| `speka` | `speka` | Speka AI | API-võti, agregaator | [link](https://speka.me) | Tasuta pakett: $1 kasutusmahtu kuus, 10 RPM, üks API-võti ning juurdepääs avatud mudelitele ja katsekeskkonnale; kaarti pole vaja. | -| `stability-ai` | `stability` | Stability AI | API-võti, pilt | [link](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API-võti | [link](https://stepfun.com) | Hankige API-võti saidilt platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | API-võti | [link](https://ai.sumopod.com) | Kasutage oma SumoPodi API-võtit (sk-...) kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API-võti | [link](https://suno.ai) | Kleepige saidilt suno.ai saadud seansiküpsis (Clerki autentimine) | -| `synthetic` | `synthetic` | Synthetic | API-võti, agregaator | [link](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API-võti, agregaator | [link](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API-võti | [link](https://hunyuan.tencent.com) | Hankige API-võti saidilt console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | API-võti, agregaator | [link](https://theb.ai) | Bearer API-võti TheB.AI OpenAI-ga ühilduva lüüsi jaoks. | -| `tinyfish` | `tf` | TinyFish Fetch | API-võti | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key saidilt agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API-võti, video | [link](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API-võti | [link](https://agent-router.gaib.ai) | Kasutage oma Token Kioski API-võtit kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv lüüs. API baas-URL: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API-võti, agregaator | [link](https://www.tokenreply.com) | Tasuta märgendiga mudelitel on mudeli- ja kampaaniapõhised päevased piirangud; fikseeritud üldist tasuta kvooti pole avaldatud. | -| `tokenrouter` | `trk` | TokenRouter | API-võti | [link](https://tokenrouter.com) | Kasutage oma TokenRouteri API-võtit kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API-võti, pilt | [link](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API-võti | [link](https://docs.opentyphoon.ai) | Tasuta API-võti kiiruspiiranguga 5 päringut sekundis ja 200 päringut minutis. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API võti | [link](https://uncensored.com) | Kasutage oma uncensored.com-i arendaja API võtit (uai_sk_live_...). OmniRoute saadab selle päisena X-api-key OpenAI-ga ühilduvasse lõpp-punkti https://api.uncensored.com/api/v1. Võti ei aegu kunagi. See on mõõdetava kasutuse/krediitide liides; mõõdetamatu tellimusvestlus kasutab eraldi pakkujat 'uc'. | -| `udio` | `udio` | Udio | API võti | [link](https://udio.com) | Kleepige udio.com-i seansiküpsis (Supabase'i autentimine) | -| `unorouter` | `unorouter` | UnoRouter | API võti, agregaator | [link](https://unorouter.ai) | Sufiksiga :free mudelid ei vähenda saldot; piirang on 1 päring minutis iga tasuta mudeli ja kasutaja kohta. | -| `upstage` | `upstage` | Upstage | API võti | [link](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API võti | [link](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API võti | [link](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API võti, agregaator | [link](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API võti, ettevõttelahendus | [link](https://cloud.google.com/vertex-ai) | Esitage teenusekonto JSON, OAuthi juurdepääsutõend, Vertex Expressi API võti või teenusekontoga seotud autoriseerimisvõti. Expressi režiim toetab ainult Geminit; partnerite mudelid nõuavad projektipõhiseid autentimisandmeid. | -| `vertex-partner` | `vp` | Vertex AI Partners | API võti, ettevõttelahendus | [link](https://cloud.google.com/vertex-ai) | Esitage teenusekonto JSON või OAuthi autentimisandmed. Teenusekontoga seotud autoriseerimisvõti toetab samuti tuvastamist, kuid partneri mudeli järeldamine nõuab lisaks selle Google Cloudi projekti ID-d. Standardsed Expressi võtmed toetavad ainult Geminit. | -| `void-ai` | `void-ai` | Void AI | API võti, agregaator | [link](https://voidai.app) | Avalikus mudelikataloogis on mõned mudelid märgitud tasuta paketi nõudega, kuid juurdepääs on tingimuslik ja arvulist kvooti pole kinnitatud. | -| `volcengine` | `volcengine` | Volcengine | API võti | [link](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API võti | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Ühendage oma Volcano Engine'i konto või kasutage Ark Agent Plani tellimuse API võtit. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API võti | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Ühendage oma Volcano Engine'i konto või kasutage Ark Coding Plani tellimuse API võtit. | -| `voyage-ai` | `voyage` | Voyage AI | API võti, manustamine/ümberjärjestamine | [link](https://www.voyageai.com) | Bearer-API võti Voyage AI manustamis- ja ümberjärjestamis-API-de jaoks. | -| `wafer` | `wafer` | Wafer AI | API võti | [link](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API võti | [link](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API võti, ettevõttelahendus | [link](https://www.ibm.com/products/watsonx-ai) | Kasutage oma watsonxi Bearer-tõendit. Baas-URL võib olla https://.ml.cloud.ibm.com/ml/gateway/v1/ või isehallatav /ml/gateway/v1 lõpp-punkt. | -| `writer` | `writer` | Writer | API võti | [link](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API võti | [link](https://x5lab.dev) | Kasutage oma X5Labi API võtit (x5-...) kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API võti | [link](https://x.ai) | Kasutage ametlikku xAI API võtit või logige sisse xAI OAuthiga. Grok Buildi JWT-seansid jäävad eraldi pakkujaks. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API võti | [link](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API võti | [link](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API võti, agregaator | [link](https://xkiro.com) | Looge aadressil xkiro.com tasuta konto ja kleepige võti siia (Bearer; aktsepteeritakse ka x-api-key). | -| `yi` | `yi` | Yi (01.AI) | API võti | [link](https://01.ai) | Hankige API võti aadressilt platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API võti, agregaator | [link](https://yolo-auto.com) | Tasuta API-juurdepääs on päringute arvuga piiratud ja mõeldud testimiseks; arvulist päevakvooti pole avaldatud ning tasuta juurdepääsu ei lubata tähtajatult. | -| `zai` | `zai` | Z.AI | API võti | [link](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API võti | [link](https://zenmux.ai) | Kasutage oma ZenMuxi API võtit kujul Authorization: Bearer . ZenMux ühildub täielikult OpenAI-ga. Baas-URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API võti, agregaator | [link](https://www.zerolimitai.com) | Reklaamitakse ajutist tasuta prooviperioodi, kuid ametlikel lehtedel on vastuoluline teave, kas see kestab 3 või 7 päeva; väidet 100 kutset päevas ei käsitleta püsiva pakkumisena. | -| `zylo-api` | `zylo` | Zylo API | API võti, agregaator | [link](https://zyloai.net) | Põhipakett: 10 RPM, 7200 päringut päevas ja 200 000 tokenit päevas; piiratud põhipaketi tekstimudelitega. | +## API-võtme pakkujad (tasulised / tasuta krediidiga tasulised) (242) + +| ID | Alias | Nimi | Sildid | Veebisait | Märkused | +| ------------------------ | --------------- | ------------------------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API võti | [link](https://ai.360.cn) | Hankige API võti aadressilt ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | API võti, agregaator | [link](https://agentrouter.org) | Registreerumisel $200 tasuta krediiti – mitme mudeli marsruutimise lüüs | +| `agnes` | `agnes` | Agnes AI | API võti, video | [link](https://agnes-ai.com) | Hankige API võti aadressilt agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (Hiina) | API võti | [link](https://api.agnes-ai.cn) | Hankige API võti Agnes CN-i saidilt. | +| `ai21` | `ai21` | AI21 Labs | API võti | [link](https://www.ai21.com) | Registreerumisel $10 proovikrediiti (kehtib 3 kuud), krediitkaarti pole vaja | +| `aimlapi` | `aiml` | AI/ML API | API võti, agregaator | [link](https://aimlapi.com) | Tasuta pakett on peatatud (2026) — AI/ML API on nüüd ainult kasutuspõhise hinnastamisega (minimaalne saldo täiendamine $20); korduvat tasuta krediiti ei pakuta. | +| `ainative` | `ainative` | AINative Studio | API võti | [link](https://ainative.studio) | Looge aadressil ainative.studio tasuta API võti (kaarti pole vaja) ja kleepige see siia Bearer-loana. | +| `aion` | `aion` | Aion Labs | API võti | [link](https://www.aionlabs.ai) | Looge aadressil aionlabs.ai tasuta API võti (kaarti pole vaja) ja kleepige see siia Bearer-loana. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API võti | [link](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Hiina) | API võti | [link](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API võti | [link](https://developer.ant-ling.com/en/docs/) | Registreeruge ja looge Ant Ling API konsoolis (https://chat.ant-ling.com/open) API võti ning kleepige see siia. OmniRoute marsruudib vestlusliikluse aadressile https://api.ant-ling.com/v1/chat/completions; teenusepakkuja ühildub OpenAI-ga ja pakub ka Anthropicuga ühilduvat liidest. | +| `anthropic` | `anthropic` | Anthropic | API võti | [link](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API võti, agregaator | [link](https://anyapi.ai) | Tasuta pakett: sobivate Free/Basic-mudelite jaoks 100 000 ANY tokenit päevas ja 100 RPM-i; krediitkaarti pole vaja. | +| `api-airforce` | `af` | Api.airforce | API võti | [link](https://api.airforce) | 55 tasuta paketi mudelit, sealhulgas Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash ja DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | API võti | [link](https://arcee.ai) | Hankige API võti aadressilt arcee.ai | +| `auriko` | `auriko` | Auriko | API võti, agregaator | [link](https://www.auriko.ai) | Tasuta pakett võimaldab platvormil 1000 RPM-i ja BYOK-i korral 10 000 RPM-i. Platvormi inferentsiga kaasneb endiselt teenusepakkuja kulu; see pole tasuta tokenite kogum ega piiramatu tasuta inferents. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API võti, ettevõtetele | [link](https://learn.microsoft.com/azure/ai-foundry) | Kasutage oma Azure AI Foundry võtit. Baas-URL võib olla https://.services.ai.azure.com/openai/v1/ või https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | API võti, ettevõtetele | [link](https://azure.microsoft.com/products/ai-services/openai-service) | Kasutage oma Azure OpenAI API võtit. Baas-URL peaks olema teie ressursi lõpp-punkt, näiteks https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API võti | [link](https://b.ai) | Bearer API võti b.ai OpenAI-ga ühilduva LLM-lüüsi jaoks (TheB.AI-st eraldiseisev). Looge võti aadressil https://docs.b.ai ja kasutage seejärel OpenAI-ga ühilduva baas-URL-ina aadressi https://api.b.ai/v1. | +| `baichuan` | `baichuan` | Baichuan | API võti | [link](https://www.baichuan-ai.com/) | Hankige API võti aadressilt platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | API võti | [link](https://ernie.baidu.com/) | Hankige API võti aadressilt console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API võti | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API võti | [link](https://baseten.co) | $30 tasuta proovikrediiti GPU-inferentsi jaoks | +| `bazaarlink` | `bzl` | BazaarLink | API võti | [link](https://bazaarlink.ai) | Kasutage oma BazaarLinki API võtit (algab prefiksiga sk-bl-) päises Authorization: Bearer . OpenAI SDK töötab baas-URL-iga https://bazaarlink.ai/api/v1. Mudelid kasutavad vormingut provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | API võti, ettevõtetele | [link](https://aws.amazon.com/bedrock) | Kasutage oma Amazon Bedrocki API võtit ja seadistage AWS-i regioon, kus teie mudelid on lubatud (näiteks eu-west-2). OmniRoute kutsub Bedrocki loomulikku Converse API-t otse. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API võti, pilt | [link](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API võti | [link](https://blackbox.ai) | ⚠️ **AEGUNUD.** api.blackbox.ai tagastab iga teekonna variandi puhul HTTP 404 (kontroll 2026-08-21); avalik inferentsiliides on viidud piiratud juurdepääsuga lõpp-punkti enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | API võti | [link](https://www.bluesminds.com) | Igapäevased tasuta pi-krediidid — toetab üle 200 mudeli, sealhulgas GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen ja Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | API võti | [link](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API võti | [link](https://bytez.com) | $1 tasuta krediiti, mis uueneb iga 4 nädala järel | +| `cerebras` | `cerebras` | Cerebras | API võti | [link](https://inference.cerebras.ai) | Ühekordne $5 registreerumiskrediit (kehtib 30 päeva); makseviis on nõutav. See pole korduv tasuta pakett. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API võti | [link](https://hyper.charm.land) | Registreerumisel 100 tasuta Hypercredits-krediiti kuus | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API võti, agregaator | [link](https://api.oriper.com) | Ametlikes metaandmetes reklaamitakse 2 miljonit tokenit kuus, kuid avalik sait ja dokumentatsioon olid auditi ajal blokeeritud; käsitlege kvooti ja kaubamärgi vastavust kinnitamata teabena. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API võti, agregaator | [link](https://chatanywhere.tech) | Ainult isiklikuks, hariduslikuks või teaduslikuks kasutuseks: avalikus dokumentatsioonis on märgitud 10 000 punkti päevas ja 200 päringut päevas IP/võtme kohta; ärge kasutage kommertsliikluseks. | +| `cheaperinference` | `cinf` | Cheaper Inference | API võti | [link](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API võti | [link](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API võti, agregaator | [link](https://chutes.ai) | Bearer API võti Chutesi OpenAI-ga ühilduva lüüsi jaoks. | +| `clarifai` | `clarifai` | Clarifai | API võti, ettevõttelahendus | [link](https://docs.clarifai.com) | Kasutage oma Clarifai PAT-i või rakendusepõhist API võtit. OmniRoute kasutab OpenAI-ga ühilduvat lõpp-punkti aadressil https://api.clarifai.com/v2/ext/openai/v1 ja autendib päisega Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API võti, agregaator | [link](https://cloudcode.one) | Avaldatud tasuta mudelite hulka kuuluvad glm-4.7-flash ja glm-4.6v-flash; arvulist kvooti pole avaldatud ning võtme loomine võib nõuda krediiti või kupongi. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API võti | [link](https://developers.cloudflare.com/workers-ai) | Nõuab API tokenit JA konto ID-d (leitav aadressilt dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API võti | [link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API võti | [link](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API võti | [link](https://cohere.com) | Tasuta prooviversioon: testimiseks 1000 API kutset kuus, krediitkaarti pole vaja | +| `command-code` | `cmd` | Command Code | API võti | [link](https://commandcode.ai/) | Kasutage Command Code'i API võtit. Päringud saadetakse Command Code'i lõpp-punkti /provider/v1/chat/completions. | +| `coze` | `coze` | Coze | API võti | [link](https://coze.com) | Hankige API võti aadressilt coze.com/open/api | +| `crof` | `crof` | CrofAI | API võti | [link](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API võti | [link](https://cursor.com/dashboard/api) | Kleepige aadressilt cursor.com/dashboard/api saadud Cursor kasutaja API võti (crsr_...). OmniRoute vahetab selle vajaduse korral seansitokeni vastu; IDE-d ega cursor-agent'i pole vaja installida. Kasutuse eest esitatakse arve võtit omavale Cursor paketile. | +| `dahl` | `dahl` | Dahl | API võti | [link](https://inference.dahl.global) | Tokeni automaatseks genereerimiseks klõpsake valikul „Add Account” või lisage API võti käsitsi. | +| `databricks` | `databricks` | Databricks | API võti, ettevõttelahendus | [link](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API võti, ettevõttelahendus | [link](https://docs.datarobot.com) | Kasutage oma DataRobot API tokenit. Valikuline baas-URL võib olla konto juuraadress (LLM Gateway jaoks) või juurutuse URL asukohas /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | API võti, pilt | [link](https://deepai.org) | Kasutage oma DeepAI API võtit. Hankige see aadressilt deepai.org — vajalik on Pro-tellimus ($9.99 kuus). | +| `deepinfra` | `deepinfra` | DeepInfra | API võti | [link](https://deepinfra.com) | Registreerumisel tasuta krediit API testimiseks ja mudelitega tutvumiseks | +| `deepseek` | `ds` | DeepSeek | API võti | [link](https://platform.deepseek.com) | Registreerumisel 5 miljonit tasuta tokenit – krediitkaarti pole vaja | +| `dgrid` | `dgrid` | DGrid | API võti | [link](https://dgrid.ai) | DGridi tasuta mudelite ruuter: 10 päringut minutis ja 100 päringut päevas. Ühekordne $5 konto täiendamine avab kuni 20 päringut minutis ja 1000 päringut päevas. | +| `dify` | `dify` | Dify | API võti | [link](https://dify.ai) | Hankige API võti oma Dify eksemplarist. | +| `digitalocean` | `digitalocean` | DigitalOcean | API võti | [link](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API võti | [link](https://dit.ai) | Kasutage oma dit.ai API võtit päises Authorization: Bearer . Täielikult OpenAI-ga ühilduv — vahetu asendus, muutke ainult baas-URL-iks https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | API võti | [link](https://doubao.com) | Hankige API võti aadressilt console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | API võti, agregaator | [link](https://www.dxnt.com) | Tasuta kontode dokumenteeritud piirang on 100 kutset päevas; kvoot võib kutsete kaudu suureneda ja kontode lõikes erineda. | +| `electronhub` | `electronhub` | Electron Hub | API võti, agregaator | [link](https://www.electronhub.ai) | Tasuta pakett: 5 RPM-i, $0.25 nädalast krediiti ja 10 neutriinot päevas :free-mudelite jaoks; kehtivad ka pere-eelarved. | +| `empower` | `empower` | Empower | API võti, agregaator | [link](https://docs.empower.dev) | Bearer API võti Empoweri OpenAI-ga ühilduva lõpp-punkti jaoks. | +| `eurouter` | `eurouter` | EURouter | API võti, agregaator | [link](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API võti | [link](https://factory.ai) | Bearer API võti Factory OpenAI-ga ühilduva lüüsi jaoks. | +| `fal-ai` | `fal` | Fal.ai | API võti, pilt | [link](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API võti, agregaator | [link](https://fastrouter.ai) | Sufiksiga :free mudelid võimaldavad organisatsiooni ja mudeli kohta 10 päringut päevas; saadavus võib muutuda. | +| `featherless-ai` | `featherless` | Featherless AI | API võti | [link](https://featherless.ai) | Saadaval on tasuta kasutustase — krediitkaarti pole vaja | +| `fenayai` | `fenayai` | FenayAI | API võti, agregaator | [link](https://fenayai.com) | Bearer API võti FenayAI OpenAI-ga ühilduva lüüsi jaoks. | +| `fireworks` | `fireworks` | Fireworks AI | API võti | [link](https://fireworks.ai) | Registreerumisel $1 tasuta stardikrediiti API testimiseks | +| `free-ai` | `free-ai` | Free.ai | API võti, agregaator | [link](https://free.ai) | Pärast e-posti aadressi kinnitamist saab ise majutatud mudelite jaoks kasutada 30 000 tokenit päevas. Kogumi ületava kasutuse eest võidakse arvestada tasu omahinna alusel ning kvaliteetsemad välised mudelid on tasulised. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API võti | [link](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API võti | [link](https://freebuff.com) | Sisestage Freebuffi / Codebuffi autentimistõend (saadud CLI kaudu sisse logides või automatiseeritud kogujaga). | +| `freeinference` | `freeinference` | FreeInference | API võti, agregaator | [link](https://freeinference.org) | Tasuta juurdepääs teadusuuringuteks ilma maksekaardita; taotlejad väljastpoolt Harvardit vajavad käsitsi kinnitamist ning avalikult pole tagatud ühtegi arvulist kvooti. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API võti | [link](https://freemodel.dev) | Registreerumisel $300 tasuta krediiti — krediitkaarti pole vaja. Juurdepääs mudelitele GPT-5.4 ja GPT-5.5 (OpenAI uusimad lipulaevmudelid) OpenAI-ga ühilduva API kaudu. | +| `freetheai` | `fta` | FreeTheAi | API võti, agregaator | [link](https://freetheai.xyz) | Tasuta API võtme saamiseks liituge FreeTheAi Discordiga. | +| `friendliai` | `friendli` | FriendliAI | API võti | [link](https://friendli.ai) | Tasuta pakett serverita inferentsiks — krediitkaarti pole vaja | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API võti, agregaator | [link](https://g4f.space) | Koguge anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev-i liikmevõtit (looge see aadressil g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API võti, agregaator | [link](https://g4f.space) | Koguge anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev-i liikmevõtit (looge see aadressil g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API võti, agregaator | [link](https://g4f.space) | Koguge anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev-i liikmevõtit (looge see aadressil g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API võti, agregaator | [link](https://g4f.space) | Koguge anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev-i liikmevõtit (looge see aadressil g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API võti, agregaator | [link](https://g4f.space) | Koguge anonüümseid cake-krediite aadressil g4f.dev/chat või kasutage g4f.dev-i liikmevõtit (looge see aadressil g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API võti | [link](https://galadriel.com) | ⚠️ **AEGUNUD.** api.galadriel.ai ei lahendu enam (kontroll 2026-06-19); inferentsi-API näib olevat lõpetatud. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API võti | [link](https://aistudio.google.com) | Google AI Studio kaudu on saadaval tasuta pakett; kehtivad praegused mudelipõhised kvoodid ja piirkondlikud piirangud | +| `getgoapi` | `ggo` | GoAPI | API võti, agregaator | [link](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API võti | [link](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API võti | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLabi isiklik juurdepääsutõend avaliku Code Suggestions API jaoks. Kui te ei kasuta gitlab.com-i, seadistage isemajutatud baas-URL. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API võti | [link](https://opengateway.gitlawb.com) | Tasuta MiMo (xiaomi/mimo-v2.5) tühistati 2026-05 — Opengateway on nüüd kasutuspõhise krediidiga lüüs; korduvat tasuta mudelit pole. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API võti | [link](https://opengateway.gitlawb.com) | Tasuta Nemotroni kampaania lõppes 2026-06 — GMI Cloudi marsruut on nüüd saadaval ainult kasutuspõhise krediidiga. | +| `glm` | `glm` | GLM Coding | API võti | [link](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Hiina) | API võti | [link](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API võti | [link](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API võti | [link](https://greenpt.com) | API tellimuse saab luua tasuta; inferentsi eest võetakse tasu tõendite arvu alusel. Tasuta inferentsimahtu pole avaldatud. | +| `groq` | `groq` | Groq | API võti | [link](https://groq.com) | Tasuta pakett: mudelipõhised piirangud (200K tõendit päevas vestlusmudeli kohta; RPM/RPD piiranguid vt console.groq.com/docs/rate-limits) — makseviisi pole lisatud. | +| `haiper` | `hp` | Haiper | API võti, video | [link](https://haiper.ai) | Hankige API võti aadressilt haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | API võti | [link](https://api.hcnsec.cn) | Hankige API võti aadressilt api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | API võti, agregaator | [link](https://helixmind.online) | Varem levitatud väited 3 RPM/50 RPD ja maksekaardi mittevajamise kohta ei leidnud 2026-08-02 auditi käigus kinnitust; praegune kvoot ja arveldamine nõuavad konto kontrollimist. | +| `helyxai` | `helyxai` | Helyx AI | API võti, agregaator | [link](https://helyxai.space) | Toimiva tasuta paketi dokumentatsioonis on märgitud 100 000 tõendit päevas; saidi eraldi turundusväide 2M+ on sellega vastuolus ja seda ei käsitleta kvoodigarantiina. | +| `heroku` | `heroku` | Heroku AI | API võti, ettevõtetele | [link](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API võti | [link](https://huggingface.co) | Tasuta Inference API tuhandetele mudelitele (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API võti | [link](https://hyperbolic.xyz) | Registreerumisel $1-5 proovikrediiti serverita inferentsiks | +| `ideogram` | `ideo` | Ideogram | API võti | [link](https://ideogram.ai) | Hankige API võti aadressilt ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | API võti | [link](https://xinghuo.xfyun.cn) | Hankige API võti aadressilt console.xfyun.cn | +| `inception` | `inception` | Inception | API võti | [link](https://docs.inceptionlabs.ai) | Registreerumisel 10M tasuta tõendit, krediitkaarti pole vaja. | +| `inference-net` | `inet` | Inference.net | API võti | [link](https://inference.net) | Registreerumisel $25 tasuta krediiti, lisaks on saadaval teadustoetused | +| `internlm` | `internlm` | InternLM (Intern-S1) | API võti | [link](https://internlm.intern-ai.org.cn/) | Tasuta kuukvoot ~1M sisend- / 3M väljundtõendit (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API-võti, manustamine/ümberjärjestamine | [link](https://jina.ai) | Bearer API-võti teenusele api.jina.ai — manustamine, ümberjärjestamine, klassifitseerimine, segmentimine ja otsing. Juhtpaneeli võtmed on JINA_AI_API_KEY suhtes prioriteetsed. See ei ole Readeri / r.jina.ai kaart ega hangi URL-e. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-võti | [link](https://jina.ai/reader) | Bearer API-võti teenuse r.jina.ai URL-ist Markdowni teisendamiseks (ainult /v1/web/fetch). Ei paku lõpp-punkte /v1/embeddings ega /v1/rerank. Töötab sama Jina tunnus nagu Foundation API puhul; kui see kaart on tühi, kasutab OmniRoute uuesti jina-ai juhtpaneeli võtit või JINA_AI_API_KEY-d. | +| `kenari` | `kenari` | Kenari | API-võti | [link](https://kenari.id) | Kasutage oma Kenari API-võtit (kn-...) päises Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API-võti | [link](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API-võti, koondteenus | [link](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (pärand-Moonshot API) | API-võti | [link](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-võti | [link](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API-võti | [link](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API-võti, koondteenus | [link](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API-võti, video | [link](https://leonardo.ai) | Hankige API-võti aadressilt leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | API-võti | [link](https://liquid.ai) | Hankige API-võti aadressilt liquid.ai | +| `literouter` | `literouter` | LiteRouter | API-võti, koondteenus | [link](https://literouter.com) | Tasuta mudelivariandid kasutavad järelliidet :free; päevased krediidilimiidid erinevad mudeliti ja tasuta sisend on piiratud 5,000 sõnega. | +| `llamagate` | `llamagate` | LlamaGate | API-võti | [link](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-võti, koondteenus | [link](https://llm.kiwi) | Tasuta paketis on saadaval auto ja hrLLM; avaldatud piirang 40 päringut tunnis kehtib hrLLM-ile. | +| `llm7` | `llm7` | LLM7.io | API-võti | [link](https://llm7.io) | Kasutage mis tahes mittetühja võtit (näiteks 'unused'). Kui vanemad sisseehitatud mudelid tagastavad model_unavailable, kasutage Available Models → Import from /models või Auto-Sync; kontrollitud toimiv mudel: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API-võti, koondteenus | [link](https://llmgateway.io) | Majutatud tasuta pakett: tasuta hinnaga mudelid on piiratud 5 päringuga 10 minuti jooksul, kui kontol pole krediiti. | +| `logfare` | `logfare` | Logfare | API-võti, koondteenus | [link](https://logfare.ai) | Looge aadressil https://logfare.ai/register tasuta konto (kasutajanimi/parool, e-posti kinnitamine pole vajalik), et saada kohe API-võti, seejärel kleepige see siia Bearer-tunnusena. | +| `longcat` | `lc` | LongCat AI | API-võti | [link](https://longcat.chat/platform/docs) | Tasuta: pärast konto registreerimist ja KYC-kontrolli ühekordne 10M sõne suurune toetus (LongCat-2.0). Ainult ühekordne — see ei ole korduv päevane/kuine kvoot. | +| `magnific` | `freepik` | Magnific | API-võti, pilt | [link](https://www.magnific.com) | Hankige API-võti aadressilt magnific.com/user/api-keys (päis x-magnific-api-key). Pärand-Freepiku arendajavõtmed töötavad endiselt. | +| `maritalk` | `maritalk` | Maritalk | API-võti | [link](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API-võti, koondteenus | [link](https://meganova.ai) | Tasuta registreerimine ilma kaardita. Avaldatud Tier 1 mudelipõhised kvoodid on kokku 550 päringut päevas; need ei moodusta ühist globaalset reservi ning lubamise korral võivad rakenduda tasulised ülekasutustasud. | +| `meta-llama` | `meta` | Meta Llama API | API-võti | [link](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API-võti, video | [link](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Hiina) | API-võti | [link](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API-võti | [link](https://mistral.ai) | Tasuta Experiment-tase: piiratud päringusagedusega juurdepääs kõigile mudelitele, krediitkaarti pole vaja | +| `mixedbread` | `mxbai` | Mixedbread AI | API-võti | [link](https://www.mixedbread.com) | Bearer API-võti Mixedbreadi manustamis-API jaoks. | +| `mixlayer` | `mixlayer` | Mixlayer | API-võti, koondteenus | [link](https://www.mixlayer.com) | Mudel qwen/qwen3.5-4b-free on prototüüpimiseks tasuta ja päringusagedus on piiratud; kindlat avalikku RPM-i ega päevast kvooti pole kinnitatud. | +| `mnn-ai` | `mnn-ai` | MNN AI | API-võti, koondteenus | [link](https://mnnai.ru) | Tasuta pakett: $1 jagu igakuist krediiti, 10 RPM-i ja juurdepääs ainult mudelitele, mis on märgitud Free. | +| `modal` | `mdl` | Modal | API-võti, ettevõte | [link](https://modal.com/docs) | Kasutage Bearer-tunnust, mis kaitseb teie Modali juurutust, kui see on lubatud. Baas-URL peaks osutama teie OpenAI-ga ühilduvale Modali rakendusele, näiteks https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API-võti | [link](https://modelscope.cn) | Tasuta tase ModelScope API-Inference'i kaudu — vajalik on Alibaba konto. | +| `monsterapi` | `monster` | MonsterAPI | API-võti | [link](https://monsterapi.ai) | ⚠️ **AEGUNUD.** Monster API lõpetas tegevuse 2026-06-30. Kasutage alternatiivseid OpenAI-ga ühilduvaid teenusepakkujaid. | +| `moonshot` | `moonshot` | Kimi | API-võti | [link](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API-võti | [link](https://morphllm.com) | Tasuta tase: 250K krediiti kuus, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API-võti | [link](https://github.com/meta-llama/llama-stack) | Kasutage oma keskkonnamuutujat META_API_KEY Bearer-tunnusena. Muse Code CLI kasutab OpenAI Responses API andmevahetusvormingut (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API-võti, koondteenus | [link](https://naga.ac) | Hankige API-võti aadressilt naga.ac — saadaval on registreerumine Google'i/GitHubi/Discordi kaudu. | +| `naga-ai` | `naga-ai` | Naga AI | API võti, agregaator | [link](https://naga.ac) | Märgendiga :free mudelid on avalikult loetletud, kuid arvulist kvooti pole kinnitatud. Naga eeskirjad hoiatavad, et tasuta taseme viipasid ja väljundeid võidakse koguda või treenimiseks kasutada. | +| `nanogpt` | `nanogpt` | NanoGPT | API võti | [link](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API võti | [link](https://bynara.id) | Looge tasuta NaraRouteri konto, siduge oma Telegram (nõutav enne /v1 vastuste saamist) ja seejärel kleepige võti siia Bearer-loana. | +| `navy` | `navy` | NavyAI | API võti | [link](https://api.navy) | Looge NavyAI juhtpaneelil tasuta API võti ja seejärel kleepige see siia Bearer-loana. | +| `nebius` | `nebius` | Nebius AI | API võti | [link](https://nebius.com) | Registreerumisel ligikaudu $1 proovikrediiti API testimiseks | +| `nlpcloud` | `nlpc` | NLP Cloud | API võti | [link](https://docs.nlpcloud.com) | Kasutage oma NLP Cloudi API võtit päises Authorization: Token . OmniRoute kasutab vaikimisi vestlusroboti lõpp-punkti aadressil https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API võti | [link](https://nomic.ai) | Hankige API võti aadressilt atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | API võti | [link](https://portal.nousresearch.com/help) | Kasutage oma Nous Portali API võtit. OmniRoute kasutab ametlikku OpenAI-ga ühilduvat järelduspäringute lõpp-punkti aadressil https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API võti, video, agregaator | [link](https://novita.ai) | Registreerumisel $0.50 proovikrediiti (kehtib ligikaudu 1 aasta) | +| `nscale` | `nscale` | nScale | API võti | [link](https://nscale.com) | Registreerumisel $5 tasuta krediiti järelduspäringute testimiseks | +| `nube` | `nube` | Nube.sh | API võti | [link](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API võti | [link](https://build.nvidia.com) | Tasuta arendajajuurdepääs: ~40 RPM, üle 70 mudeli (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API võti, ettevõtetele | [link](https://www.oracle.com/artificial-intelligence/generative-ai) | Kasutage oma OCI Generative AI API võtit või IAM-i Bearer-luba. Baas-URL võib olla https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | API võti, agregaator | [link](https://ofox.ai) | Praeguses kataloogis reklaamitakse üle 10 tasuta mudeli ilma avaliku arvulise kvoodita; enne tootmiskeskkonnas kasutamist vaadake üle ülesvoolu päritolu ning säilitamis- ja treenimistingimused. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API võti | [link](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API võti | [link](https://1min.ai) | Looge API võti aadressil https://docs.1min.ai/docs/api/create-api-key ja seejärel kleepige see siia. | +| `openadapter` | `oad` | OpenAdapter | API võti | [link](https://openadapter.dev) | Kasutage oma OpenAdapteri API võtit päises Authorization: Bearer sk-cv-. Täielikult OpenAI-ga ühilduv. API baas-URL: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API võti | [link](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API võti | [link](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API võti | [link](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API võti | [link](https://openference.com) | Tasuta tase: sisaldab mudeleid Qwen3.8 27b ja Llama 3.2 3B — praeguste tingimuste kohta vaadake openference.com/pricing | +| `openrouter` | `openrouter` | OpenRouter | API võti, agregaator | [link](https://openrouter.ai) | Tasuta mudelid hinnaga $0/token ja järelliitega :free – 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API võti | [link](https://openvecta.com) | Registreerumisel tasuta krediiti OpenAI-ga ühilduvate järelduspäringute jaoks LLM-ide, manuste ja arutlusmudelite lõikes | +| `opper` | `opper` | Opper | API võti, agregaator | [link](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API võti | [link](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API võti | [link](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API võti | [link](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API võti | [link](https://www.perplexity.ai) | Kasutage oma Perplexity API võtit. OmniRoute suunab Agent API mudeli-ID-d Perplexity Responses-ühilduva lõpp-punkti kaudu. | +| `piapi` | `pi` | PiAPI | API võti, agregaator | [link](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API võti | [link](https://pioneer.ai) | $75 tasuta kasutuskrediiti — krediitkaarti pole vaja | +| `plamo` | `plamo` | PLaMo | API võti | [link](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API võti, agregaator | [link](https://creator.poe.com/api-reference) | Bearer API võti Poe OpenAI-ga ühilduva API jaoks. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API võti, agregaator | [link](https://poixe.com) | Praegused avalikud tasuta piirangud on väikesed ja mudelirühmapõhised: 2 RPM/5 RPD suure mahu mudelitele ning 20 RPM/50 RPD väikese mahu mudelitele. | +| `pollinations` | `pol` | Pollinations AI | API võti, video | [link](https://pollinations.ai) | Dokumenteeritud tasuta mudelite anonüümne ja võtmeta juurdepääs toimib võimaluse korral. Kohalik v3.8.50 kontroll (2026-07-31) tagastas OmniRoute'i kaudu 401 ning samast võrgust otse ülesvoolu tehtud päringutele Cloudflare 1010. Premium-mudelid nõuavad endiselt Pollinationsi API võtit aadressilt enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API võti | [link](https://poolside.ai) | Laguna S 2.1 ja XS 2.1 on eelvaate ajal tasuta; avalikku arvulist kvooti pole avaldatud. | +| `predibase` | `predibase` | Predibase | API võti | [link](https://predibase.com) | ⚠️ **AEGUNUD.** serving.app.predibase.com ei lahendu enam (kontroll 2026-06-19); hallatud teenindus-API näib olevat lõpetatud. | +| `publicai` | `publicai` | PublicAI | API võti | [link](https://publicai.co) | Nõuab API võtit — registreerumisel ühekordne krediit, seejärel tasuline | +| `qianfan` | `qianfan` | Baidu Qianfan | API võti | [link](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API-võti | [link](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API-võti | [link](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-võti | [link](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API-võti, pilt | [link](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API-võti | [link](https://regolo.ai) | Hankige oma Regolo API-võti saidilt regolo.ai ja kleepige see siia Bearer-loana. | +| `reka` | `reka` | Reka | API-võti | [link](https://docs.reka.ai/chat/overview) | Kasutage oma Reka API-võtit. OmniRoute toetab OpenAI-ga ühilduvat baas-URL-i https://api.reka.ai/v1 ning saadab ühilduvuse tagamiseks nii Authorization- kui ka X-Api-Key-päise. | +| `requesty` | `requesty` | Requesty | API-võti | [link](https://requesty.ai) | Tasuta pakett: ~200 päringut päevas – mitme mudeli marsruutimise lüüs (üle 300 mudeli) | +| `routeway` | `routeway` | Routeway | API-võti | [link](https://routeway.ai) | Looge saidil routeway.ai tasuta API-võti ja kleepige see siia Bearer-loana. | +| `runwayml` | `runway` | Runway | API-võti, video | [link](https://docs.dev.runwayml.com) | Kasutage oma Runway API-võtit kujul Authorization: Bearer . OmniRoute kasutab praegust Runway API-t aadressil https://api.dev.runwayml.com/v1 ja saadab nõutava X-Runway-Version-päise automaatselt. | +| `sambanova` | `samba` | SambaNova | API-võti | [link](https://sambanova.ai) | Registreerumisel $5 tasuta krediiti (kehtib 30 päeva), krediitkaarti pole vaja | +| `sap` | `sap` | SAP Generative AI Hub | API-võti, ettevõtetele | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Kasutage oma SAP AI Core'i Bearer-luba. Baas-URL võib olla teie AI_API_URL-i juur-URL või Generative AI Hubi deploymentUrl. | +| `sarvam` | `sarvam` | Sarvam AI | API-võti | [link](https://docs.sarvam.ai) | Registreerumisel ₹1,000 tasuta krediiti, mis ei aegu kunagi | +| `scaleway` | `scw` | Scaleway AI | API-võti | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Uutele kontodele 1 miljon tasuta luba – EL-i/GDPR-iga ühilduv (Pariis), Qwen3 235B ja Llama 70B | +| `sealion` | `sealion` | SEA-LION | API-võti | [link](https://sea-lion.ai) | Logige Google'iga saidile sea-lion.ai sisse (kaarti pole vaja, piirkondlikke piiranguid pole), looge API-võti ja kleepige see siia. | +| `seekai` | `ska` | SeekAi | API-võti, agregaator | [link](https://seekai.cc) | Looge API-võti aadressil https://seekai.cc ja kleepige see siia Bearer-loana. | +| `segmind` | `segmind` | Segmind | API-võti, pilt, video | [link](https://segmind.com) | Kasutage oma Segmindi API-võtit x-api-key-päises. OmniRoute kasutab aadressi https://api.segmind.com/v1/ ning tagastab genereeritud pildi- või videobaidid otse. | +| `sensenova` | `sensenova` | SenseNova | API-võti | [link](https://platform.sensenova.cn) | Hankige API-võti aadressilt platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | API-võti | [link](https://cloud.siliconflow.com) | $1 tasuta krediiti ja praegu loetletud $0 mudelid pärast isikusamasuse kontrollimist; saadavus ja piirangud võivad muutuda | +| `snowflake` | `snowflake` | Snowflake Cortex | API-võti, ettevõtetele | [link](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API-võti | [link](https://xinghuo.xfyun.cn) | Hankige API-võti aadressilt console.xfyun.cn | +| `speka` | `speka` | Speka AI | API-võti, agregaator | [link](https://speka.me) | Tasuta pakett: $1 igakuist kasutusmahtu, 10 RPM-i, üks API-võti ning juurdepääs avatud mudelitele ja mänguväljakule; kaarti pole vaja. | +| `stability-ai` | `stability` | Stability AI | API-võti, pilt | [link](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API-võti | [link](https://stepfun.com) | Hankige API-võti aadressilt platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | API-võti | [link](https://ai.sumopod.com) | Kasutage oma SumoPodi API-võtit (sk-...) kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API-võti | [link](https://suno.ai) | Kleepige saidilt suno.ai saadud seansiküpsis (Clerki autentimine) | +| `synthetic` | `synthetic` | Synthetic | API-võti, agregaator | [link](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API-võti, agregaator | [link](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API-võti | [link](https://hunyuan.tencent.com) | Hankige API-võti aadressilt console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | API-võti, agregaator | [link](https://theb.ai) | Bearer API-võti TheB.AI OpenAI-ga ühilduva lüüsi jaoks. | +| `tinyfish` | `tf` | TinyFish Fetch | API-võti | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key aadressilt agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API-võti, video | [link](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API-võti | [link](https://agent-router.gaib.ai) | Kasutage oma Token Kioski API-võtit kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv lüüs. API baas-URL: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API-võti, agregaator | [link](https://www.tokenreply.com) | Tasuta märgendiga mudelitel on mudeli- ja kampaaniapõhised päevased piirangud; kindlat üldist tasuta kvooti pole avaldatud. | +| `tokenrouter` | `trk` | TokenRouter | API-võti | [link](https://tokenrouter.com) | Kasutage oma TokenRouteri API-võtit kujul Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API-võti, pilt | [link](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API-võti | [link](https://docs.opentyphoon.ai) | Tasuta API-võti kiiruspiiranguga 5 päringut sekundis ja 200 päringut minutis. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API võti | [link](https://uncensored.com) | Kasutage oma uncensored.com arendaja API võtit (uai_sk_live_...). OmniRoute saadab selle päisena X-api-key OpenAI-ga ühilduvasse lõpp-punkti https://api.uncensored.com/api/v1. Võti ei aegu kunagi. See on kasutuspõhine/krediitidega teenus; piiramatu tellimuspõhine vestlus on eraldi pakkuja 'uc'. | +| `udio` | `udio` | Udio | API võti | [link](https://udio.com) | Kleepige udio.com-i seansiküpsis (Supabase'i autentimine) | +| `unorouter` | `unorouter` | UnoRouter | API võti, agregaator | [link](https://unorouter.ai) | Sufiksiga :free mudelid ei vähenda saldot; limiit on 1 päring minutis iga tasuta mudeli ja kasutaja kohta. | +| `upstage` | `upstage` | Upstage | API võti | [link](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API võti | [link](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API võti | [link](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API võti, agregaator | [link](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API võti, ettevõttelahendus | [link](https://cloud.google.com/vertex-ai) | Esitage teenusekonto JSON, OAuthi juurdepääsutõend, Vertex Expressi API võti või teenusekontoga seotud autoriseerimisvõti. Express-režiim toetab ainult Geminit; partnermudelid nõuavad projektipõhiseid identimisteavet. | +| `vertex-partner` | `vp` | Vertex AI Partners | API võti, ettevõttelahendus | [link](https://cloud.google.com/vertex-ai) | Esitage teenusekonto JSON või OAuthi identimisteave. Teenusekontoga seotud autoriseerimisvõti toetab samuti tuvastamist, kuid partneri inferents nõuab lisaks selle Google Cloudi projekti ID-d. Standardsed Expressi võtmed toetavad ainult Geminit. | +| `void-ai` | `void-ai` | Void AI | API võti, agregaator | [link](https://voidai.app) | Avalikus mudelikataloogis on mõned mudelid märgitud tasuta paketi nõudega, kuid juurdepääs on tingimuslik ja arvulist kvooti pole kinnitatud. | +| `volcengine` | `volcengine` | Volcengine | API võti | [link](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API võti | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Ühendage oma Volcano Engine'i konto või kasutage Ark Agent Plani tellimuse API võtit. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API võti | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Ühendage oma Volcano Engine'i konto või kasutage Ark Coding Plani tellimuse API võtit. | +| `voyage-ai` | `voyage` | Voyage AI | API võti, vektoresitus/ümberjärjestamine | [link](https://www.voyageai.com) | Bearer API võti Voyage AI vektoresituste ja ümberjärjestamise API-de jaoks. | +| `wafer` | `wafer` | Wafer AI | API võti | [link](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API võti | [link](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API võti, ettevõttelahendus | [link](https://www.ibm.com/products/watsonx-ai) | Kasutage oma watsonxi Bearer-tõendit. Baas-URL võib olla https://.ml.cloud.ibm.com/ml/gateway/v1/ või isehallatav /ml/gateway/v1 lõpp-punkt. | +| `writer` | `writer` | Writer | API võti | [link](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API võti | [link](https://x5lab.dev) | Kasutage oma X5Labi API võtit (x5-...) väljal Authorization: Bearer . Täielikult OpenAI-ga ühilduv. API baas-URL: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API võti | [link](https://x.ai) | Kasutage ametlikku xAI API võtit või logige sisse xAI OAuthiga. Grok Buildi JWT-seansid jäävad eraldi pakkujaks. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API võti | [link](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API võti | [link](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API võti, agregaator | [link](https://xkiro.com) | Looge saidil xkiro.com tasuta konto ja kleepige võti siia (Bearer; aktsepteeritakse ka x-api-key). | +| `yi` | `yi` | Yi (01.AI) | API võti | [link](https://01.ai) | Hankige API võti aadressilt platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API võti, agregaator | [link](https://yolo-auto.com) | Tasuta API-juurdepääs on päringute arvuga piiratud ja mõeldud testimiseks; arvulist päevakvooti pole avaldatud ning tasuta juurdepääsu ei lubata tähtajatult. | +| `zai` | `zai` | Z.AI | API võti | [link](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API võti | [link](https://zenmux.ai) | Kasutage oma ZenMuxi API võtit väljal Authorization: Bearer . ZenMux ühildub täielikult OpenAI-ga. Baas-URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API võti, agregaator | [link](https://www.zerolimitai.com) | Reklaamitakse ajutist tasuta prooviperioodi, kuid ametlikel lehtedel on vastuoluline teave, kas see kestab 3 või 7 päeva; väidet 100 kutse kohta päevas ei käsitleta püsiva pakkumisena. | +| `zylo-api` | `zylo` | Zylo API | API võti, agregaator | [link](https://zyloai.net) | Basic-pakett: 10 RPM, 7,200 päringut päevas ja 200,000 tokenit päevas; piiratud Basic-tekstimudelitega. | ## Kohalikud pakkujad (14) diff --git a/docs/i18n/et/docs/routing/REASONING_REPLAY.md b/docs/i18n/et/docs/routing/REASONING_REPLAY.md index 97ce054dbfe3..b55b96f79e56 100644 --- a/docs/i18n/et/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/et/docs/routing/REASONING_REPLAY.md @@ -23,21 +23,23 @@ Kuid tavapärased kliendid (Cursor, Cline, Roo Code, OpenAI SDK) eemaldavad `rea ``` Voor N (assistent genereerib): - → vastus sisaldab reasoning_content-i + tool_calls-i + → vastus sisaldab reasoning_content + tool_calls → kui requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - kirjutab (mällu + DB-sse), võtmeks iga tool_call.id - → edastab vastuse kliendile (kes võib arutluskäigu säilitada või mitte) + kirjutab (mälu + DB), võtmena kasutatakse iga tool_call.id väärtust + → edasta vastus kliendile (kes võib reasoning'u säilitada või mitte) Voor N+1 (klient saadab jätkupäringu): → tõlkija tuvastab: requiresReasoningReplay(provider, model) === true → iga assistendi sõnumi puhul, millel on tool_calls, kuid puudub reasoning_content: lookupReasoning(toolCalls[0].id) → mälu → DB - tabamus → msg.reasoning_content = cached; recordReplay() - puudumine → msg.reasoning_content = "" (pärandvaruvariant vanema DeepSeeki jaoks) - → ülesvoolu teenus näeb järjepidevat ajalugu → 400 viga ei teki + leidub → msg.reasoning_content = cached; recordReplay() + ei leidu → msg.reasoning_content = "" (pärandvaruvariant vanema DeepSeeki jaoks) + → ülesvool näeb ühtset ajalugu → viga 400 ei teki ``` -Salvestamine toimub failis `open-sse/handlers/chatCore.ts` (kahes kohas, kahe `cacheReasoningFromAssistantMessage` väljakutse juures). Taasesitamine toimub failis `open-sse/translator/index.ts` pärast skeemi sundteisendamist, kuid enne edastamist. +Hõivamine toimub failis `open-sse/handlers/chatCore.ts` (kahes kohas, kahe `cacheReasoningFromAssistantMessage` väljakutse juures). Taasesitus toimub failis `open-sse/translator/index.ts` pärast skeemi koertsiooni, kuid enne edastamist. + +Tavaliste (ilma tööriistakutseta) assistendi voorude võtmed luuakse teisiti: `buildAssistantMessageCacheKey()` räsib seansi ulatuse koos normaliseeritud OpenAI-vormingus transkriptiga kuni vastava vooruni, sest DeepSeek nõuab pärast `tools` olemasolu _iga_ varasema vooru arutluskäiku. Responses API sihtmärkide puhul (näiteks `opencode-go/deepseek-v4-flash`, mis suunatakse marsruudile `/responses`) sisaldab ülesvoolu päringu keha välja `input`, mitte `messages`, seega edastab `translateRequest()` (`open-sse/translator/index.ts`) tagasikutse suvandi kaudu kasutatud vahetranskripti ning hõivamiskohad räsivad sama transkripti. Responsesi taasesitusetapp töötab OpenAI vahevormingu põhjal iga lähtevormingu puhul, seega taasesitatakse ka Anthropic Messagesi klientide päringud (Claude → OpenAI → Responses). ## Salvestus — hübriidne mälu + SQLite @@ -56,7 +58,7 @@ Kirjed kirjutatakse mõlemasse. Lugemisel kontrollitakse esmalt mälu ja seejär - Maksimaalne kirjete arv mälus: `200` (`MAX_MEMORY_ENTRIES`) - Eemaldamine: kõige vanem `createdAt` esimesena -## Andmebaasiskeem +## Andmebaasi skeem Migratsioon: `src/lib/db/migrations/033_create_reasoning_cache.sql` @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -Indeksid: `expires_at`, `provider`, `model`, `created_at`. `expires_at` salvestatakse Unixi epohhi sekunditena; SELECT-kiht normaliseerib pärandteksti väärtused `EXPIRES_AT_EPOCH_SQL`-i kaudu. +Indeksid: `expires_at`, `provider`, `model`, `created_at`. `expires_at` salvestatakse Unixi epohhi sekunditena; SELECT-kiht normaliseerib pärandtekstiväärtused `EXPIRES_AT_EPOCH_SQL` kaudu. ## Pakkuja / mudeli tuvastamine diff --git a/docs/i18n/et/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/et/docs/security/SOCKET_DEV_FINDINGS.md index 253913357f2b..fe013b1f473c 100644 --- a/docs/i18n/et/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/et/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,22 @@ --- +> **Käsitlusala märkus:** `socket.yml` konfigureerib Socket.dev-i registripoolse npm-i artefakti avaldamisjärgse kontrolli (eiratud teed paketti mittekuuluva sisu jaoks, näiteks `tests/`, `docs/` ja koostearuanded). See ei seadista CI/PR-i ühendamise kontrollväravat — ükski töövoog kataloogis `.github/workflows`, ükski `package.json`-i skript ega ükski `Makefile`-i sihtmärk ei käivita Socket.dev-i. + See dokument on hooldaja koostatud kinnitus kuue -`AI-detected potential malware` leiu kohta, mis tuvastati paketis `omniroute@3.8.5`, ja -paketis `omniroute@3.8.6` rakendatud leevendusmeetmete kohta. Selle eesmärgid on järgmised: +`AI tuvastatud potentsiaalse pahavara` leiu kohta, mis tuvastati versioonis `omniroute@3.8.5`, ning +versioonis `omniroute@3.8.6` rakendatud leevendusmeetmete kohta. Selle eesmärgid on järgmised: -1. Turbekonveieri operaatoritel on üks viide, millele toetuda, kui neil on vaja +1. Turbekonveieri haldajatel on üks viiteallikas, millele osutada, kui neil on vaja hinnata leide tegeliku lähtekoodi põhjal. 2. Tulevased tehisintellektil põhinevad skannerid saavad tuvastada hooldaja allkirjastatud kinnituse, et iga - märgistatud tee on tahtlik, valikuline ja dokumenteeritud. + märgistatud tee on tahtlik, vabatahtlikult kasutatav ja dokumenteeritud. 3. Meil on kirjalik ülevaade sellest, _miks_ iga väljakutsekoht on just sellise kujuga — - et tulevane refaktoreerimine ei tooks kogemata tagasi signatuuri, mis - eemaldati teadlikult. + et tulevane refaktoreerimine ei tooks kogemata uuesti sisse tunnusmustrit, mis + teadlikult eemaldati. -Kui haldate skannerit, mis märgistab pärast v3.8.6 -leevendusmeetmete avaldamist uuesti mõne alltoodud väljakutsekoha, avage skannimisjäljega probleemiaruanne ja +Kui haldate skannerit, mis märgistab pärast v3.8.6 leevendusmeetmete avaldamist mõne +alltoodud väljakutsekoha uuesti, avage palun probleem koos kontrollijäljega ja me täiendame siinset kinnitust. --- diff --git a/docs/i18n/fa/README.md b/docs/i18n/fa/README.md index e77040ce2bb5..15abef027b8a 100644 --- a/docs/i18n/fa/README.md +++ b/docs/i18n/fa/README.md @@ -19,17 +19,17 @@
-## 💰 حدود 1.62 میلیارد توکن رایگان در ماه +## 💰 ~1.62B توکن رایگان / ماه
-> کنار هم چیدن دستی پلنهای رایگان دردسرساز است — دهها SDK، دهها محدودیت نرخ و بدون هیچ تصوری از اینکه واقعاً چه مقدار در اختیار دارید. OmniRoute تعداد **491 مورد پلن رایگان را در 35 کلید مخزن دورهای** فهرست میکند و رقم اصلی توکنها را بر اساس **17 مخزن دارای بودجه ماهانه مثبت و منتشرشده، بهعلاوه پنج سقف مجزای Groq برای هر مدل** محاسبه میکند؛ مخزنهای مشترک نیز حذف تکراری میشوند. سهمیههایی که تنها پس از احراز هویت منطقهای فعال میشوند (در حال حاضر: ModelScope)، جداگانه نمایش داده میشوند؛ حدود 6M+ توکن پشت احراز هویت منطقهای قرار دارند و هرگز به رقم اصلی افزوده نمیشوند. نتیجه در داشبورد (`/dashboard/free-tiers`) همواره قابل مشاهده است. +> رویهمگذاشتن دستی پلنهای رایگان دردسرساز است — دهها SDK، دهها محدودیت نرخ و بدون اینکه بدانید واقعاً چه مقدار در اختیار دارید. OmniRoute تعداد **489 ورودی پلن رایگان را در 35 کلید استخر تکرارشونده** فهرست میکند و رقم توکن شاخص را از **17 استخری که بودجه ماهانه مثبت و منتشرشده دارند، بهعلاوه پنج سقف Groq برای هر مدل** محاسبه میکند؛ در این محاسبه، استخرهای مشترک تکراری حذف میشوند. سهمیههایی که تنها پس از تأیید هویت منطقهای فعال میشوند (در حال حاضر: ModelScope)، جداگانه نمایش داده میشوند؛ +~6M پشت تأیید هویت منطقهای قرار دارد و هرگز در رقم شاخص جمع زده نمیشود. نتیجه در داشبورد (`/dashboard/free-tiers`) قابل مشاهده باقی میماند. -کارت بودجه پلن رایگان OmniRoute: حدود 1.62 میلیارد توکن رایگان پایدار در ماه و تا حدود 2.22 میلیارد در ماه نخست با اعتبارهای ثبتنام؛ از 35 کلید مستند مخزن دورهای که 491 مورد فهرستشده پلن رایگان را پشت یک نقطه پایانی پوشش میدهند. محاسبه شفاف با حذف تکرار مخزنها — هر مخزن مشترک تنها یکبار محاسبه میشود؛ شامل 17 مخزن دورهای با بودجه ماهانه مثبت و منتشرشده توکن، بهعلاوه پنج سقف مجزای Groq برای هر مدل؛ 13 ارائهدهنده در فهرست ریسک شرایط استفاده با برچسب اجتناب مشخص شدهاند تا خودتان تصمیم بگیرید. نوار بودجه شامل Mistral با 1B،‏ Nara با 210M،‏ LLM7 با 150M،‏ xKiro با 150M،‏ Groq با 30M (پنج سقف مجزا برای هر مدل) و مخزنهای کوچکتر است؛ همچنین اعتبارهای ثبتنام ماه نخست و ارائهدهندگان همیشهرایگان بدون سقف توکن بهصورت جداگانه نمایش داده میشوند تا هرگز رقم اصلی را بهطور مصنوعی افزایش ندهند. میزان مصرفشده/باقیمانده زنده در /dashboard/free-tiers. +کارت بودجه پلن رایگان OmniRoute: حدود 1.62B توکن رایگان ثابت در ماه، تا حدود 2.22B در ماه نخست با اعتبارهای ثبتنام، از 35 کلید استخر تکرارشونده مستند که 489 ورودی پلن رایگان فهرستشده را پشت یک نقطه پایانی پوشش میدهند. محاسبهای شفاف با حذف تکرار استخرها — هر استخر مشترک فقط یک بار شمرده میشود، از جمله 17 استخر تکرارشونده با بودجه ماهانه مثبت و منتشرشده برای توکن، بهعلاوه پنج سقف Groq برای هر مدل؛ 13 ارائهدهنده در فهرست ریسک شرایط استفاده با برچسب اجتناب مشخص شدهاند تا خودتان تصمیم بگیرید. نوار بودجه شامل Mistral 1B، Nara 210M، LLM7 150M، xKiro 150M، Groq 30M (پنج سقف برای هر مدل) و استخرهای کوچکتر است؛ همچنین اعتبارهای ثبتنام ماه نخست و ارائهدهندگان همیشگی رایگانِ بدون سقف توکن، جداگانه نمایش داده میشوند تا هرگز رقم شاخص را بهطور مصنوعی افزایش ندهند. میزان مصرفشده/باقیمانده زنده در /dashboard/free-tiers. -> خلاصه متحرک صفحه زنده `/dashboard/free-tiers`. روششناسی کامل (حذف تکرار مخزنها، سطوح اعتبار، شرایط ارائهدهندگان): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> خلاصه متحرک صفحه زنده `/dashboard/free-tiers`. روششناسی کامل (حذف تکرار استخرها، سطوح اعتبار، شرایط ارائهدهندگان): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> این ارقام هر دو هفته یکبار بر اساس فهرست زنده دوباره ممیزی میشوند و **در هر دو جهت تغییر میکنند** — اگر ارائهدهندهای پلن رایگان خود را متوقف کند، عدد کاهش مییابد؛ اگر مورد جدیدی اضافه شود، افزایش پیدا میکند. ما چیزی را منتشر میکنیم که فهرست واقعاً محاسبه میکند، نه یک بهترین حالتِ گردشده به بالا. +> این ارقام هر دو هفته یکبار بر اساس فهرست زنده مجدداً ممیزی میشوند و **در هر دو جهت تغییر میکنند** — اگر ارائهدهندهای پلن رایگان خود را پایان دهد، عدد کاهش مییابد؛ اگر پلن جدیدی اضافه شود، افزایش پیدا میکند. ما همان چیزی را منتشر میکنیم که فهرست واقعاً محاسبه میکند، نه بهترین حالتِ رو به بالا گردشده.
@@ -37,7 +37,7 @@

-⭐ اگر OMNIROUTE به شما کمک کرده است در هزینهها صرفهجویی کنید و کارتان را آسانتر انجام دهید، به مخزن ستاره بدهید. +⭐ اگر OMNIROUTE به شما کمک کرده است در هزینه صرفهجویی کنید و کارتان را آسانتر انجام دهید، به مخزن ستاره بدهید.

@@ -48,7 +48,7 @@ ### 💬 به جامعه بپیوندید -**👋 نگهدارنده پروژه را دنبال کنید — زودتر از همه از ارائهدهندگان جدید، انتشارها و نکتهها باخبر شوید:** +**👋 نگهدارنده پروژه را دنبال کنید — زودتر از همه از ارائهدهندگان جدید، نسخهها و نکتهها باخبر شوید:** [![Diego را در LinkedIn دنبال کنید](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![@diegosouzapw را در GitHub دنبال کنید](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -59,7 +59,7 @@ [![WhatsApp برزیل](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![وبسایت](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**پرسشها، نکتههای ارائهدهندگان، نقشه راه و پشتیبانی ← [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 جهانی](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 برزیل](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [پورتال](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**پرسشها، نکتههای مربوط به ارائهدهندگان، نقشه راه و پشتیبانی ← [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 جهانی](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 برزیل](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [پورتال](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -592,7 +592,7 @@ OmniRoute دارای مجوز MIT است و بهصورت عمومی نگهدار ## 🤖 رابطهای خط فرمان و عاملهای کدنویسی سازگار -> یک پیکربندی — `http://localhost:20128/v1` — و **همهٔ** محیطهای توسعه یا رابطهای خط فرمان هوش مصنوعی با مدلهای رایگان و کمهزینه اجرا میشوند. +> یک پیکربندی — `http://localhost:20128/v1` — و **هر** محیط توسعه یا رابط خط فرمان هوش مصنوعی با مدلهای رایگان و کمهزینه اجرا میشود.
@@ -626,40 +626,40 @@ OmniRoute دارای مجوز MIT است و بهصورت عمومی نگهدار - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ همچنین با این ابزارها کار میکند · Kiro · Command Code · Antigravity · Windsurf · AMP · هر ابزار سازگار با OpenAI ++ با این موارد نیز کار میکند · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · هر ابزار سازگار با OpenAI
-📖 راهاندازی جداگانه برای هر یک از ۳۶ ابزار (۲۶ ابزار CLI Code و ۱۰ عامل CLI) ← [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 افزونه OpenCode ← [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 راهاندازی اختصاصی هر ابزار برای همهٔ ۳۶ ابزار (۲۶ ابزار CLI Code و ۱۰ عامل CLI) ← [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 افزونهٔ OpenCode ← [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

**هر CLI پشتیبانیشده را تنها با یک فرمان از طریق OmniRoute اجرا کنید** — بدون نوشتن فایل پیکربندی، -اعتبارنامهها برای هر فرایند تزریق میشوند و Qwen/Gemini یک پوشه خانگی موقت و ایزوله دریافت میکنند: +با تزریق اعتبارنامهها بهصورت جداگانه برای هر فرایند و یک پوشهٔ خانگی موقت و ایزوله برای Qwen/Gemini: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code -omniroute run codex --model glm/glm-5.2 # رابط خط فرمان OpenAI Codex +omniroute run codex --model glm/glm-5.2 # OpenAI Codex CLI omniroute run aider --model glm/glm-5.2 -- --message "reply OK" omniroute run goose --model glm/glm-5.2 omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# یا ارائهدهنده و مدل را بهصورت تعاملی انتخاب کنید و پیکربندی اختصاصی ابزار را بنویسید: +# یا ارائهدهنده و مدل را بهصورت تعاملی انتخاب کنید و پیکربندی خود ابزار را بنویسید: omniroute configure codex # همچنین: claude opencode qwen aider goose gemini cline continue kilo ``` -هر فرمان از زمینه راهدور فعال (`omniroute connect `) پیروی میکند؛ `--dry-run` -متغیرهای محیطی و آرگومانهای دقیق را بدون اجرا پیشنمایش میکند و `--api-key-env NAME` اسرار را -از تاریخچه پوسته شما دور نگه میدارد. ← [یکپارچهسازیهای CLI](docs/guides/CLI-INTEGRATIONS.md) +هر فرمان از زمینهٔ راهدور فعال (`omniroute connect `) پیروی میکند، `--dry-run` +متغیرهای محیطی/آرگومانهای دقیق را بدون اجرا پیشنمایش میکند، و `--api-key-env NAME` اسرار را +از تاریخچهٔ پوستهٔ شما دور نگه میدارد. ← [یکپارچهسازیهای CLI](docs/guides/CLI-INTEGRATIONS.md)
@@ -669,7 +669,7 @@ omniroute configure codex # همچنین: claude opencode qwen aider go -> **357 ارائهدهندهٔ ثبتشده** در مجموعههای مرجع چت، رسانه، جستوجو، محلی، عامل ابری و سیستم، شامل **152 مورد دارای فرادادهٔ اکتشافی `hasFree: true`**. رجیستری مدلهای چت شامل **229 ارائهدهنده / 2,554 جفت متمایز ارائهدهنده-مدل / 1,283 شناسهٔ خام مدل** است؛ کاتالوگ جداگانهٔ بودجهٔ رایگان نیز دارای **491 ردیف برای مدلها**، **35 مخزن دورهای** و **54 ارائهدهندهٔ رایگان دائمیِ دورهای/بدون نیاز به کلید** است. این مخرجها عمداً متفاوتاند؛ تعاریف و محاسباتی که مخزنهای تکراری را حذف میکنند، در [مرجع ارائهدهندگان](docs/reference/PROVIDER_REFERENCE.md) و [سطوح رایگان](docs/reference/FREE_TIERS.md) آمدهاند. +> **357 ارائهدهندهٔ ثبتشده** در مجموعههای مرجع چت، رسانه، جستوجو، محلی، عامل ابری و سیستم، شامل **152 مورد دارای فرادادهٔ اکتشافی `hasFree: true`**. رجیستری مدلهای چت شامل **229 ارائهدهنده / 2,554 جفت متمایز ارائهدهنده-مدل / 1,283 شناسهٔ خام مدل** است؛ کاتالوگ جداگانهٔ بودجهٔ رایگان نیز **491 ردیف بهازای هر مدل**، **35 مخزن دورهای** و **54 ارائهدهندهٔ رایگان همیشگیِ دورهای/بدون کلید** دارد. این مخرجها آگاهانه متفاوتاند؛ تعریفها و محاسباتی که مخزنهای تکراری از آنها حذف شدهاند، در [مرجع ارائهدهندگان](docs/reference/PROVIDER_REFERENCE.md) و [سطوح رایگان](docs/reference/FREE_TIERS.md) آمدهاند.
@@ -702,32 +702,32 @@ omniroute configure codex # همچنین: claude opencode qwen aider go -…و بیش از 330 مورد دیگر — همهٔ آیکونها بهصورت زنده از کاتالوگ ارائهدهندگان داشبورد دریافت میشوند. 📖 [مرجع ارائهدهندگان](docs/reference/PROVIDER_REFERENCE.md) +…و بیش از 330 مورد دیگر — همهٔ آیکونها بهصورت زنده از کاتالوگ ارائهدهندگان داشبورد بارگیری میشوند. 📖 [مرجع ارائهدهندگان](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 رایگان برای همیشه — $0، بدون نیاز به کارت +### 🆓 رایگان برای همیشه — $0، بدون نیاز به کارت بانکی - + - + - - + + - - + +
OpenCode Zen
OpenCode Zen
DeepSeek V4، Nemotron 3
بدون محدودیت توکن
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
بدون محدودیت توکن
Kilo Code
Kilo Code
مسیریاب خودکار، Tencent Hy3
برای همیشه رایگان
Requesty
Requesty
GPT-OSS 120B، Nemotron
برای همیشه رایگان
Requesty
Requesty
GPT-OSS 120B, Nemotron
برای همیشه رایگان
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
سطح رایگان
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
برای همیشه رایگان
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
برای همیشه رایگان
Qoder AI
Qoder AI
Qwen3-Max، Kimi-K2
رایگان و نامحدود
Pollinations
Pollinations
GPT، Llama، Claude
بدون نیاز به کلید
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
رایگان و نامحدود
Pollinations
Pollinations
GPT, Llama, Claude
بدون نیاز به کلید
Cloudflare AI
Cloudflare AI
بیش از 50 مدل
10K نورون در روز
NVIDIA NIM
NVIDIA NIM
GLM، MiniMax
حدود 40 RPM رایگان
Cerebras
Cerebras
GLM 4.7، GPT-OSS
1M توکن در روز
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
حدود 40 RPM رایگان
Openference
Openference
Qwen3.8 27B, Llama 3.2
سطح رایگان
OpenRouter
OpenRouter
مدلهای :free
+$10 ← RPM بالاتر
-📖 فهرست کامل قابلخواندن توسط ماشین ← [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 فهرست کاملِ قابلخواندن توسط ماشین ← [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1263,19 +1263,19 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن - + - - + + - - - - - - - + + + + + + + @@ -1293,25 +1293,25 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن
لایهفناوری
محیط اجراNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
زبانTypeScript 6.0 — ۱۰۰٪ TypeScript در سراسر src/ و open-sse/ (از v2.0 تاکنون بدون هیچ any در هسته)
زبانTypeScript 6.0 — صددرصد TypeScript در سراسر src/ و open-sse/ (از v2.0 تاکنون بدون هیچ any در هسته)
فریمورکNext.js 16 + React 19 + Tailwind CSS 4
پایگاه دادهbetter-sqlite3 (SQLite، ثبت رویداد WAL) + LowDB (JSON قدیمی) — ۱۲۲ ماژول دامنه، ۱۷۶ مهاجرت
حافظهجستوجوی تماممتن SQLite FTS5 + تعبیههای برداری کوانتیزهشده با int8، زوال نوعدار
پایگاه دادهbetter-sqlite3 (SQLite، ثبت رویداد WAL) + LowDB (سامانه قدیمی JSON) — 122 ماژول دامنه، 178 مهاجرت
حافظهجستوجوی تماممتن SQLite FTS5 + تعبیههای برداری کوانتیزهشده int8، زوال نوعدار
طرحوارههاZod 4 — اعتبارسنجی ورودی/خروجی ابزار MCP + قراردادهای API
پروتکلهاMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
استریمرویدادهای ارسالشده از سرور (SSE) + پل WebSocket (/v1/ws)
فشردهسازیخط لوله ۱۲ موتوره — RTK، Caveman، LLMLingua-2 (MobileBERT ONNX)، GCF، OmniGlyph
احراز هویت و امنیتOAuth 2.0 (PKCE) + JWT + کلیدهای API + احراز هویت محدودهبندیشده MCP · AES-256-GCM برای دادههای ذخیرهشده · DOMPurify
اختفاwreq-js — جعل اثر انگشت TLS از نوع JA3 / JA4، پراکسی سهسطحی
تابآوریمدارشکن، عقبنشینی نمایی، جلوگیری از هجوم همزمان درخواستها، خودترمیمی خودکار ترکیبها
ثبت گزارشpino — گزارشهای ساختاریافته JSON همراه با زمینه درخواست
آزمایشاجراکننده آزمون Node.js + Vitest — بیش از ۳۹٬۰۰۰ اعلان آزمون ایستا در بیش از ۵٬۱۰۰ فایل آزمون رهگیریشده (واحد، یکپارچهسازی، سرتاسری، امنیت، زیستبوم)
جریان دادهServer-Sent Events (SSE) + پل WebSocket (/v1/ws)
فشردهسازیخط لوله 12 موتوره — RTK، Caveman، LLMLingua-2 (MobileBERT ONNX)، GCF، OmniGlyph
احراز هویت و امنیتOAuth 2.0 (PKCE) + JWT + کلیدهای API + احراز هویت دامنهبندیشده MCP · رمزنگاری AES-256-GCM برای دادههای ذخیرهشده · DOMPurify
پنهانکاریwreq-js — جعل اثر انگشت TLS مبتنی بر JA3 / JA4، پراکسی سهسطحی
تابآوریقطعکننده مدار، عقبنشینی نمایی، جلوگیری از ازدحام ناگهانی درخواستها، خودترمیمی خودکار ترکیبها
ثبت رویدادpino — گزارشهای ساختاریافته JSON همراه با زمینه درخواست
آزمایشاجراکننده آزمون Node.js + Vitest — بیش از 39,000 اعلان آزمون ایستا در بیش از 5,100 فایل آزمون رهگیریشده (واحد، یکپارچهسازی، E2E، امنیت، زیستبوم)
پلتفرمهادسکتاپ (Electron) · Android (Termux) · PWA (هر مرورگری)
CI/CDGitHub Actions — انتشار خودکار در npm و Docker Hub هنگام انتشار نسخه
پیوندهاوبسایت · npm · Docker Hub
- - + + - - - + + +
سندتوضیحات
راهنمای کاربرارائهدهندگان، ترکیبها، یکپارچهسازی CLI، استقرار
راهنمای راهاندازیروشهای کامل نصب، پیکربندی ابزارهای CLI، راهاندازی پروتکل، تنظیم مهلت زمانی
راهنمای کاربرارائهدهندگان، ترکیبها، یکپارچهسازی CLI و استقرار
راهنمای راهاندازیروشهای کامل نصب، پیکربندی ابزارهای CLI، راهاندازی پروتکل و تنظیم مهلت زمانی
راهنمای ابزارهای CLIراهاندازی اختصاصی هر ابزار برای Claude Code، Codex، Cursor، Cline، OpenClaw، Kilo و Copilot
حالت راه دورکنترل یک OmniRoute راه دور (VPS) از CLI لپتاپ خود از طریق توکنهای دسترسی با دامنه محدود
پیکربندی Claude Codeاتصال Claude Code به OmniRoute (محلی/راه دور) با launch و پروفایلهای مختص هر مدل
شروع سریع۳ مرحله: نصب ← اتصال ← پیکربندی
حالت راهدورکنترل یک OmniRoute راهدور (VPS) از CLI لپتاپ خود از طریق توکنهای دسترسی محدودشده
پیکربندی Claude Codeاتصال Claude Code به OmniRoute (محلی/راهدور) با launch و پروفایلهای اختصاصی هر مدل
شروع سریعنصب ۳ مرحلهای ← اتصال ← پیکربندی
### 🔧 عملیات و استقرار - - - - - - - + + + + + + +
سندتوضیحات
راهنمای Dockerاجرای Docker، پروفایلهای Compose، ‏HTTPS با Caddy، تونلها، برچسبهای ایمیج
راهنمای Podmanیکپارچهسازی Quadlet با systemd، ‏podman-compose، ‏SELinux
استقرار ماشین مجازیراهنمای کامل: راهاندازی ماشین مجازی + nginx + Cloudflare
استقرار Fly.ioاستقرار در Fly.io با فضای ذخیرهسازی پایدار
راهنمای Termuxاجرای OmniRoute در Android از طریق Termux
راهنمای PWAنصب برنامه وب پیشرونده، کشکردن، معماری
راهنمای حذف نصبحذف پاک و کامل برای تمام روشهای نصب
راهنمای Dockerاجرای Docker، پروفایلهای Compose، HTTPS با Caddy، تونلها و برچسبهای ایمیج
راهنمای Podmanیکپارچهسازی Quadlet با systemd، podman-compose و SELinux
استقرار روی VMراهنمای کامل: راهاندازی VM + nginx + Cloudflare
استقرار روی Fly.ioاستقرار روی Fly.io با فضای ذخیرهسازی پایدار
راهنمای Termuxاجرای OmniRoute روی Android از طریق Termux
راهنمای PWAنصب برنامه وب پیشرونده، ذخیرهسازی موقت و معماری
راهنمای حذف نصبحذف کامل برای همه روشهای نصب
پیکربندی محیطمتغیرها و مراجع کامل .env
@@ -1320,29 +1320,29 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن - - - - - - - - - - - + + + + + + + + + + +
سندتوضیحات
معماریمعماری سیستم، جریان داده و سازوکارهای داخلی
راهنمای فشردهسازیخط لوله ۷گزینهای: خاموش / سبک / استاندارد / تهاجمی / فوقفشرده / RTK / پشتهای
فشردهسازی RTKفشردهسازی خروجی فرمان، فیلترها، اعتماد، تأیید، بازیابی خروجی خام
موتورهای فشردهسازیCaveman، ‏RTK، خطوط لوله پشتهای، رابطهای داشبورد/API/MCP
قالب قواعد فشردهسازیطرحوارههای بسته قواعد JSON برای فیلترهای Caveman و RTK
بستههای زبانی فشردهسازیتشخیص زبان و نگارش بسته قواعد Caveman
راهنمای تابآوریقطعکنندههای مدار، دورههای انتظار، صف، جلوگیری از هجوم همزمان، جعل TLS
موتور ترکیب خودکارامتیازدهی ۱۶عاملی، بستههای حالت، خودترمیمی
راهنمای پروکسیسیستم پروکسی سهسطحی، بازار 1proxy، عملیات CRUD رجیستری
سطوح رایگانفهرست تجمیعشده: ۳۵ مجموعه دورهای مستندشده / ۴۹۱ ورودی سطح رایگان فهرستشده
نگارخانه قابلیتهاتور تصویری داشبورد همراه با نماگرفتها
مستندات پایگاه کدمرور پایگاه کد بهزبانی مناسب برای تازهکاران
راهنمای فشردهسازیخط لوله ۷ گزینهای: خاموش / سبک / استاندارد / تهاجمی / فوقفشرده / RTK / پشتهای
فشردهسازی RTKفشردهسازی خروجی فرمان، فیلترها، اعتماد، تأیید و بازیابی خروجی خام
موتورهای فشردهسازیCaveman، RTK، خطوط لوله پشتهای و رابطهای داشبورد/API/MCP
قالب قوانین فشردهسازیطرحوارههای بسته قوانین JSON برای فیلترهای Caveman و RTK
بستههای زبانی فشردهسازیتشخیص زبان و تألیف بسته قوانین Caveman
راهنمای تابآوریمدارشکنها، دورههای انتظار، صف، جلوگیری از ازدحام ناگهانی و جعل TLS
موتور ترکیب خودکارامتیازدهی ۱۶ عاملی، بستههای حالت و خودترمیمی
راهنمای پروکسیسیستم پروکسی ۳ سطحی، بازارچه 1proxy و عملیات CRUD رجیستری
سطوح رایگانفهرست تجمیعشده: ۳۵ مخزن دورهای مستندشده / ۴۸۹ ورودی سطح رایگان فهرستشده
گالری قابلیتهاتور بصری داشبورد همراه با تصاویر صفحه
مستندات کدبیسمرور گامبهگام کدبیس، مناسب برای مبتدیان
### 🤖 پروتکلها و APIها - + - + - - + +
سندتوضیحات
مرجع APIتمام نقاط پایانی همراه با مثال
مرجع APIهمه نقاط پایانی همراه با مثال
مشخصات OpenAPIمشخصات OpenAPI 3.0
سرور MCP۱۱۰ ابزار MCP، پیکربندیهای IDE، کلاینتهای Python/TS/Go
سرور MCP۱۱۰ ابزار MCP، پیکربندیهای IDE و کلاینتهای Python/TS/Go
راهنمای سرور MCPنصب MCP، روشهای انتقال و مرجع ابزارها
سرور A2Aپروتکل JSON-RPC 2.0، مهارتها، پخش جریانی، مدیریت وظایف
راهنمای سرور A2Aکارت عامل A2A، وظایف، مهارتها و پخش جریانی
سرور A2Aپروتکل JSON-RPC 2.0، مهارتها، استریم و مدیریت وظایف
راهنمای سرور A2Aکارت عامل A2A، وظایف، مهارتها و استریم
### 📋 پروژه و کیفیت @@ -1351,22 +1351,22 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن سندتوضیحات مشارکتراهاندازی محیط توسعه و دستورالعملها مدل شاخهبندی و انتشارمقصد PRها (release/*) و معنای main و برچسبها - گزارش تغییراتتاریخچهٔ کامل انتشار بهتفکیک نسخه - سیاست امنیتیگزارش آسیبپذیریها و رویههای امنیتی - راهنمای i18nپشتیبانی از ۴۲ زبان، گردشکار ترجمه و RTL + گزارش تغییراتتاریخچه کامل انتشار بهتفکیک نسخه + سیاست امنیتیگزارش آسیبپذیریها و شیوههای امنیتی + راهنمای i18nپشتیبانی از 42 زبان، گردشکار ترجمه و RTL چکلیست انتشارمراحل اعتبارسنجی پیش از انتشار - برنامهٔ پوششراهبرد پوشش آزمون برای بیش از ۳۹٬۰۰۰ اعلان آزمون ایستا در بیش از ۵٬۱۰۰ فایل آزمون ردیابیشده + برنامه پوششراهبرد پوشش آزمون برای بیش از 39,000 اعلان آزمون ایستا در بیش از 5,100 فایل آزمون رهگیریشده
-# ⭐ مشارکتکنندگان برتر +# ⭐ برترین مشارکتکنندگان -> OmniRoute بهدست جامعهای پرشور از متنباز شکل گرفته است. این افراد مشارکتهای استثناییای داشتهاند که مستقیماً بر کیفیت، پایداری و دامنهٔ دسترسی پروژه تأثیر میگذارند. **سپاسگزاریم.** +> OmniRoute بهدست جامعهای پرشور از متنباز شکل گرفته است. این افراد مشارکتهای برجستهای داشتهاند که مستقیماً بر کیفیت، پایداری و گستره پروژه تأثیر میگذارد. **سپاسگزاریم.** -### مشارکتکنندگان بیرونی بر اساس درخواستهای کشش ادغامشده +### مشارکتکنندگان خارجی بر اساس درخواستهای کشش ادغامشده @@ -1393,9 +1393,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن
رتبهمشارکتکنندهPRهای ادغامشده~خطوط تغییریافته
20Prudhvivuda246,312
-این دادهها در آخرین وضعیت فعال release/v3.8.50 با شناسهٔ dafb4ae808 و شامل ادغامها تا 2026-08-24 05:26:03 UTC تثبیت شدهاند. سرشماری صفحهبندیشدهٔ GitHub GraphQL شامل ۵٬۹۱۱ PR ادغامشده است: ۲٬۷۰۷ مورد توسط مالک مخزن، ۱۷۹ مورد توسط Dependabot و ۳٬۰۲۵ PR بیرونی از ۵۳۵ مشارکتکنندهٔ متمایز. «خطوط تغییریافته» مجموع افزودهها و حذفهای GitHub است و فایلهای تولیدشده، lockfileها، کاتالوگها، ترجمهها و مستندات را نیز شامل میشود؛ این عدد میزان تغییرات است، نه LOC تألیفشده. رتبههای مساوی در نقطهٔ برش حفظ شدهاند. +این آمار بر اساس آخرین وضعیت زنده release/v3.8.50 در dafb4ae808، با ادغامها تا 2026-08-24 05:26:03 UTC ثابت شده است. سرشماری صفحهبندیشده GitHub GraphQL شامل 5,911 درخواست کشش ادغامشده است: 2,707 مورد توسط مالک مخزن، 179 مورد توسط Dependabot و 3,025 درخواست کشش خارجی از 535 مشارکتکننده متمایز. «خطوط تغییریافته» برابر با مجموع افزودهها و حذفهای GitHub است و فایلهای تولیدشده، lockfileها، کاتالوگها، ترجمهها و مستندات را شامل میشود؛ این مقدار نشاندهنده حجم تغییرات است، نه LOC تألیفشده. رتبههای مساوی در مرز نهایی حفظ شدهاند. -### کامیتهای منتسبشده در GitHub +### کامیتهای منتسب به GitHub @@ -1404,42 +1404,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن backryun
backryun
- 🥇 220 کامیت منتسب به GitHub + 🥇 ۲۲۰ کامیت منتسب به GitHub @@ -1448,42 +1448,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 نیز از آن Dizzle
Dizzle
- 🏅 69 کامیت منتسب به GitHub · رتبهٔ مشترک 6 + 🏅 ۶۹ کامیت منتسب به GitHub · رتبه مشترک ۶
Paijo
Paijo

- 🥈 219 کامیت منتسب به GitHub + 🥈 ۲۱۹ کامیت منتسب به GitHub
Randi
Randi

- 🥉 108 کامیت منتسب به GitHub + 🥉 ۱۰۸ کامیت منتسب به GitHub
Ravi Tharuma
Ravi Tharuma

- 🏅 81 کامیت منتسب به GitHub + 🏅 ۸۱ کامیت منتسب به GitHub
Chris
Chris

- 🏅 70 کامیت منتسب به GitHub + 🏅 ۷۰ کامیت منتسب به GitHub
Markus Hartung
Markus Hartung

- 🏅 69 کامیت منتسب به GitHub · رتبهٔ مشترک 6 + 🏅 ۶۹ کامیت منتسب به GitHub · رتبه مشترک ۶
Jan Leon
Jan Leon

- 🏅 64 کامیت منتسب به GitHub + 🏅 ۶۴ کامیت منتسب به GitHub
zenobit
zenobit

- 🏅 62 کامیت منتسب به GitHub + 🏅 ۶۲ کامیت منتسب به GitHub
Bob.Hou
Bob.Hou

- 🏅 51 کامیت منتسب به GitHub · رتبهٔ مشترک 10 + 🏅 ۵۱ کامیت منتسب به GitHub · رتبه مشترک ۱۰
Xiangzhe
Xiangzhe

- 🏅 51 کامیت منتسب به GitHub · رتبهٔ مشترک 10 + 🏅 ۵۱ کامیت منتسب به GitHub · رتبه مشترک ۱۰
-بازبینی مجدد در 2026-08-24 06:14:31 UTC: کامیتهای منتسب به GitHub که توسط API مشارکتکنندگان مخزن برای شاخهٔ پیشفرض release/v3.8.50 گزارش شدهاند. API تعداد 525 هویت (415 کاربر، 2 ربات و 108 ناشناس) را برگرداند؛ این جدول نگهدارنده، رباتها و هویتهای ناشناس را مستثنا میکند و رتبههای مشترک را حفظ میکند. این جدول هم با رتبهبندی PRهای ادغامشده در بالا و هم با سرشماری 639نفرهٔ فرادادههای Git در پایین متفاوت است. +بازبینی مجدد در 2026-08-24 06:14:31 UTC: کامیتهای منتسب به GitHub که توسط API مشارکتکنندگان مخزن برای شاخه پیشفرض release/v3.8.50 گزارش شدهاند. API تعداد ۵۲۵ هویت (۴۱۵ کاربر، ۲ ربات و ۱۰۸ ناشناس) را برگرداند؛ این جدول نگهدارنده، رباتها و هویتهای ناشناس را مستثنا میکند و رتبههای مشترک را حفظ میکند. این جدول هم با رتبهبندی درخواستهای کشش ادغامشده در بالا و هم با سرشماری ۶۳۹نفره فرادادههای Git در پایین متفاوت است. -> 🙏 قابلیتها، رفع اشکالها و بهبودهای زیرساختی این مشارکتکنندگان، **بخش اصلی** چیزی هستند که OmniRoute را قابلاعتماد و غنی از قابلیت میسازد. هر درخواست کشش، هر مورد آزمایشی و هر فایل ترجمهٔ i18n اهمیت دارد. متنباز بهدست افرادی مانند آنها ساخته میشود. +> 🙏 قابلیتها، رفع اشکالها و بهبودهای زیرساختی این مشارکتکنندگان، **بخشی اساسی** از عواملی هستند که OmniRoute را قابلاعتماد و سرشار از قابلیت میکنند. هر درخواست کشش، هر مورد آزمایشی و هر فایل ترجمه i18n اهمیت دارد. متنباز به دست افرادی مانند آنها ساخته میشود.
diff --git a/docs/i18n/fa/SECURITY.md b/docs/i18n/fa/SECURITY.md index d7a4b2b752ab..2d06fd1b642a 100644 --- a/docs/i18n/fa/SECURITY.md +++ b/docs/i18n/fa/SECURITY.md @@ -222,20 +222,26 @@ docker run -d \ ## یافتههای اسکنر زنجیره تأمین (Socket.dev / Snyk / ابزارهای مشابه) -آرتیفکت npm منتشرشدهٔ `omniroute`، بیلد Next.js با تنظیم `output: "standalone"` را در خود بستهبندی میکند؛ این یعنی تمام مدیریتکنندههای مسیر — از جمله قابلیتهای ممتاز مستندشده (MITM، وارد کردن Zed، Cloud Sync و ناظر سرویس تعبیهشده) — در نهایت در قطعههای کوچکسازیشدهٔ `.next/server/*.js` قرار میگیرند. اسکنرهای اکتشافی زنجیره تأمین اغلب این قطعهها را بر اساس الگو با امضاهای بدافزار تطبیق میدهند. +> **یادداشت محدوده:** فایل `socket.yml` در ریشه مخزن فقط `projectIgnorePaths` را برای اسکن پس از انتشارِ سمت رجیستری Socket.dev روی آرتیفکت منتشرشده npm تنظیم میکند — این فایل یک گیت اجباری برای ادغام CI/PR نیست. هیچ گردش کاری در `.github/workflows`، هیچ اسکریپتی در `package.json` و هیچ هدفی در `Makefile`، Socket.dev را فراخوانی نمیکند. -پیکربندی اسکنری که استفاده میکنیم در فایل [`socket.yml`](socket.yml) واقع در ریشهٔ مخزن قرار دارد (قالب v2 برنامهٔ GitHub متعلق به Socket.dev — بنگرید به +آرتیفکت منتشرشده `omniroute` در npm، بیلد Next.js با `output: "standalone"` را در خود جای میدهد؛ این یعنی هر مدیریتکننده مسیر — از جمله قابلیتهای ممتاز مستندشده (MITM، واردسازی Zed، Cloud Sync و ناظر سرویس تعبیهشده) — در نهایت در چانکهای مینیفایشده `.next/server/*.js` قرار میگیرد. اسکنرهای اکتشافی زنجیره تأمین اغلب الگوهای موجود در این چانکها را با امضاهای بدافزار تطبیق میدهند. + +پیکربندی اسکنری که استفاده میکنیم در [`socket.yml`](socket.yml) در ریشه مخزن قرار دارد (قالب v2 برنامه GitHub مربوط به Socket.dev — بنگرید به ). این پیکربندی صراحتاً دایرکتوریهایی را که منتشر نمیشوند (`tests/`، `_tasks/`، `_references/`، `_ideia/`، -`_mono_repo/`، `docs/` و غیره) مستثنا میکند تا اسکنر فقط مسیرهای کدی را گزارش کند که واقعاً به دست کاربران نسخهٔ منتشرشده میرسند — خود اسکن توسط برنامهٔ GitHub متعلق به Socket و با خواندن این فایل انجام میشود، نه توسط یک گردشکار در این مخزن. +`_mono_repo/`، `docs/` و غیره) مستثنا میکند تا اسکنر فقط مسیرهای کدی را گزارش کند که واقعاً به دست کاربران نسخه منتشرشده میرسند — خود اسکن توسط برنامه GitHub مربوط به Socket و با خواندن این فایل انجام میشود، نه توسط یک گردش کاری در این مخزن. -برای هر دسته از یافتهها، یک گواهی نگهدارنده بهازای هر یافته نگهداری میکنیم: +برای هر دسته از یافتهها، یک تأییدیه نگهدارنده بهازای هر یافته نگهداری میکنیم: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - نگاشت هر یافته: فایل منبع ↔ قطعهٔ علامتگذاریشده ↔ رفتار ↔ راهکار کاهشی اعمالشده در v3.8.6. -- بلوکهای درونمنبعی `SECURITY-AUDITOR-NOTE:` در محل هر تابع علامتگذاریشده، به همان سند ارجاع میدهند. - -برای کاربرانی که خط لولهٔ آنها امکان تعدیل هشدار را ندارد: با -`OMNIROUTE_BUILD_PROFILE=minimal npm run build` بیلد کنید. این کار چهار ماژول حساس را با stubهایی جایگزین میکند که هنگام اجرا HTTP 503 با پاسخ `feature-disabled` برمیگردانند؛ بنابراین مسیرهای کد ممتاز از نظر فیزیکی در بسته وجود نخواهند داشت. + نگاشت بهازای هر یافته: فایل منبع ↔ چانک علامتگذاریشده ↔ رفتار ↔ اقدام کاهشی + اعمالشده در v3.8.6. +- بلوکهای `SECURITY-AUDITOR-NOTE:` در کد منبع، در محل هر تابع علامتگذاریشده، + به همان سند ارجاع میدهند. + +برای کاربرانی که خط لوله آنها امکان تعدیل این هشدار را ندارد: با +`OMNIROUTE_BUILD_PROFILE=minimal npm run build` بیلد کنید. این فرمان چهار +ماژول حساس را با stubهایی جایگزین میکند که هنگام اجرا پاسخ HTTP 503 با +`feature-disabled` برمیگردانند؛ بنابراین مسیرهای کد ممتاز بهصورت فیزیکی در باندل وجود نخواهند داشت. برای دستورالعمل انتشار، به [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) مراجعه کنید. diff --git a/docs/i18n/fa/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/fa/docs/architecture/CODEBASE_DOCUMENTATION.md index 7b53be894f0f..4a7ed1d78713 100644 --- a/docs/i18n/fa/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/fa/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,7 +436,8 @@ server/ ## 4. `open-sse/` — فضای کاری موتور استریم -یک فضای کاری مستقل npm که با نام `@omniroute/open-sse` منتشر میشود. مالک پردازش درخواستها، اجراکنندهها، مترجمها، سرویسها، تبدیلکننده و سرور MCP است. +یک فضای کاری npm مستقل که با نام `@omniroute/open-sse` منتشر میشود. مالک پردازش +درخواست، اجراکنندهها، مترجمها، سرویسها، تبدیلکننده و سرور MCP است. ``` open-sse/ @@ -445,22 +446,22 @@ open-sse/ ├── tsconfig.json ├── types.d.ts ├── config/ رجیستریهای ارائهدهندگان، پروفایلهای هدر، هویت، … -├── handlers/ هندلرهای درخواست (چت، امبدینگ، صوت، تصویر، …) -├── executors/ 108 اجراکننده HTTP مختص ارائهدهندگان +├── handlers/ کنترلکنندههای درخواست (چت، تعبیهها، صوت، تصویر، …) +├── executors/ ۱۰۸ اجراکننده HTTP مختص ارائهدهندگان ├── translator/ تبدیل قالب (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ تبدیلکننده استریم Responses API ↔ Chat Completions -├── services/ بیش از 80 ماژول سرویس (ترکیبها، جایگزینی، سهمیهها، هویت، …) +├── services/ بیش از ۸۰ ماژول سرویس (ترکیبها، جایگزینی، سهمیهها، هویت، …) ├── utils/ ابزارهای کمکی استریم، کلاینت TLS، AWS SigV4، واکشی از طریق پروکسی، … -└── mcp-server/ سرور MCP (3 روش انتقال، 33 حوزه، 110 ابزار) +└── mcp-server/ سرور MCP (۳ روش انتقال، ۳۳ حوزه، ۱۱۰ ابزار) ``` ### 4.1 `open-sse/handlers/` -| هندلر | هدف | +| کنترلکننده | هدف | | ----------------------- | ---------------------------------------------------------------------- | | `chatCore.ts` | خط لوله اصلی چت (کش، محدودیت نرخ، مسیریابی ترکیبی، ارسال به اجراکننده) | | `responsesHandler.ts` | نقطه ورود OpenAI Responses API | -| `embeddings.ts` | امبدینگها | +| `embeddings.ts` | تعبیهها | | `imageGeneration.ts` | تولید تصویر | | `audioSpeech.ts` | تبدیل متن به گفتار | | `audioTranscription.ts` | تبدیل گفتار به متن | @@ -469,38 +470,38 @@ open-sse/ | `rerank.ts` | رتبهبندی مجدد | | `moderations.ts` | تعدیل محتوا | | `search.ts` | جستوجوی وب | -| `sseParser.ts` | تجزیهگر رویداد SSE | +| `sseParser.ts` | تجزیهکننده رویداد SSE | | `usageExtractor.ts` | استخراج تعداد توکنها از استریمهای بالادستی | | `responseSanitizer.ts` | حذف نویز مختص ارائهدهنده | | `responseTranslator.ts` | لایه اتصال میان پاسخ ارائهدهنده و لایه مترجم | ### 4.2 `open-sse/executors/` -108 اجراکننده ارائهدهنده که هرکدام `BaseExecutor` (`base.ts`) را گسترش میدهند: +۱۰۸ اجراکننده ارائهدهنده که هرکدام `BaseExecutor` (`base.ts`) را گسترش میدهند: `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`، بهعلاوه `claudeIdentity.ts` -(ابزار کمکی هویت مشترک) و `index.ts` (رجیستری). +(ابزار کمکی مشترک هویت) و `index.ts` (رجیستری). -> نکته: ارائهدهندگانی که در اینجا فهرست نشدهاند، توسط `default.ts` و با استفاده از اجراکننده عمومی -> سازگار با OpenAI سرویسدهی میشوند. کاتالوگ کامل ارائهدهندگان (355 ارائهدهنده) در +> توجه: ارائهدهندگانی که در اینجا فهرست نشدهاند، توسط `default.ts` و با استفاده از اجراکننده عمومی +> سازگار با OpenAI سرویسدهی میشوند. کاتالوگ کامل ارائهدهندگان (۳۵۵ ارائهدهنده) در > `src/shared/constants/providers.ts` قرار دارد. ### 4.3 `open-sse/translator/` -ترجمه به شیوه هاب و پره (OpenAI هاب است). +ترجمه با معماری هابوپره (OpenAI هاب است). -- **9 مترجم درخواست** (`translator/request/`): +- **۹ مترجم درخواست** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. -- **9 مترجم پاسخ** (`translator/response/`): +- **۹ مترجم پاسخ** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 ابزار کمکی** (`translator/helpers/`): +- **۹ ابزار کمکی** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`، بهعلاوه آزمونهای ابزارهای کمکی. @@ -516,29 +517,29 @@ open-sse/ موارد برجسته (فهرست کامل در `open-sse/services/`): -| حوزه | فایلها | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| مسیریابی Combo | `combo.ts` (۱۹ راهبرد)، `comboConfig.ts`، `comboMetrics.ts`، `comboManifestMetrics.ts`، `comboAgentMiddleware.ts` | -| موتور Auto Combo | `autoCombo/` — `engine.ts`، `scoring.ts`، `taskFitness.ts`، `virtualFactory.ts`، `modePacks.ts`، `autoPrefix.ts`، `persistence.ts`، `providerDiversity.ts`، `providerRegistryAccessor.ts`، `routerStrategy.ts`، `selfHealing.ts`، `index.ts` | -| تابآوری | `accountFallback.ts` (دوره انتظار + قفلشدن)، `errorClassifier.ts`، `requestRejectedStreak.ts`، `emergencyFallback.ts`، `rateLimitManager.ts`، `rateLimitSemaphore.ts`، `accountSemaphore.ts`، `accountSelector.ts` | -| سهمیهها | `quotaMonitor.ts`، `quotaPreflight.ts`، `bailianQuotaFetcher.ts`، `codexQuotaFetcher.ts`، `deepseekQuotaFetcher.ts`، `openrouterQuotaFetcher.ts`، `openrouterFreeWindow.ts`، `crofUsageFetcher.ts`، `antigravityCredits.ts` | -| کشکردن | `reasoningCache.ts`، `searchCache.ts`، `signatureCache.ts`، `requestDedup.ts` | -| هوشمندی مسیریابی | `intentClassifier.ts`، `taskAwareRouter.ts`، `backgroundTaskDetector.ts`، `volumeDetector.ts`، `wildcardRouter.ts`، `workflowFSM.ts`، `specificityDetector.ts`، `specificityRules.ts`، `specificityTypes.ts` | -| مدیریت مدل | `modelCapabilities.ts`، `modelDeprecation.ts`، `modelFamilyFallback.ts`، `modelStrip.ts`، `model.ts`، `provider.ts`، `providerRequestDefaults.ts`، `providerCostData.ts`، `payloadRules.ts` | -| فشردهسازی | `compression/` — سیمکشی کامل موتور فشردهسازی | -| توکن + نشست | `tokenRefresh.ts`، `sessionManager.ts`، `apiKeyRotator.ts`، `contextManager.ts`، `contextHandoff.ts`، `systemPrompt.ts`، `roleNormalizer.ts`، `responsesInputSanitizer.ts`، `toolSchemaSanitizer.ts`، `toolLimitDetector.ts`، `thinkingBudget.ts` | -| سطح / مانیفست | `tierResolver.ts`، `tierConfig.ts`، `tierDefaults.json`، `tierTypes.ts`، `manifestAdapter.ts` | -| IP / شبکه | `ipFilter.ts`، `webSearchFallback.ts` | -| دستهها | `batchProcessor.ts` | -| میزان استفاده | `usage.ts` | +| حوزه | فایلها | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| مسیریابی Combo | `combo.ts` (۱۹ راهبرد)، `comboConfig.ts`، `comboMetrics.ts`، `comboManifestMetrics.ts`، `comboAgentMiddleware.ts` | +| موتور Auto Combo | `autoCombo/` — `engine.ts`، `scoring.ts`، `taskFitness.ts`، `virtualFactory.ts`، `modePacks.ts`، `autoPrefix.ts`، `persistence.ts`، `providerDiversity.ts`، `providerRegistryAccessor.ts`، `routerStrategy.ts`، `selfHealing.ts`، `index.ts` | +| تابآوری | `accountFallback.ts` (دوره انتظار + قفلشدن)، `errorClassifier.ts`، `requestRejectedStreak.ts`، `emergencyFallback.ts`، `rateLimitManager.ts`، `rateLimitSemaphore.ts`، `accountSemaphore.ts`، `accountSelector.ts` | +| سهمیهها | `quotaMonitor.ts`، `quotaPreflight.ts`، `bailianQuotaFetcher.ts`، `codexQuotaFetcher.ts`، `deepseekQuotaFetcher.ts`، `openrouterQuotaFetcher.ts`، `openrouterFreeWindow.ts`، `llmgatewayQuotaFetcher.ts`، `crofUsageFetcher.ts`، `antigravityCredits.ts` | +| ذخیرهسازی موقت | `reasoningCache.ts`، `searchCache.ts`، `signatureCache.ts`، `requestDedup.ts` | +| هوشمندی مسیریابی | `intentClassifier.ts`، `taskAwareRouter.ts`، `backgroundTaskDetector.ts`، `volumeDetector.ts`، `wildcardRouter.ts`، `workflowFSM.ts`، `specificityDetector.ts`، `specificityRules.ts`، `specificityTypes.ts` | +| مدیریت مدل | `modelCapabilities.ts`، `modelDeprecation.ts`، `modelFamilyFallback.ts`، `modelStrip.ts`، `model.ts`، `provider.ts`، `providerRequestDefaults.ts`، `providerCostData.ts`، `payloadRules.ts` | +| فشردهسازی | `compression/` — سیمکشی کامل موتور فشردهسازی | +| توکن + نشست | `tokenRefresh.ts`، `sessionManager.ts`، `apiKeyRotator.ts`، `contextManager.ts`، `contextHandoff.ts`، `systemPrompt.ts`، `roleNormalizer.ts`، `responsesInputSanitizer.ts`، `toolSchemaSanitizer.ts`، `toolLimitDetector.ts`، `thinkingBudget.ts` | +| سطح / مانیفست | `tierResolver.ts`، `tierConfig.ts`، `tierDefaults.json`، `tierTypes.ts`، `manifestAdapter.ts` | +| IP / شبکه | `ipFilter.ts`، `webSearchFallback.ts` | +| دستهها | `batchProcessor.ts` | +| میزان استفاده | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **۱۱۰ ابزار منحصربهفرد** که در `server.ts` سیمکشی شدهاند (۴۵ ابزار متعارف در `schemas/tools.ts` + - ماژولهای حافظه، مهارتها، مهارتهای GitHub، مخزن، بازیوارسازی، افزونه، Notion، Obsidian، - پیکره محلی و فشردهسازی — اجتماع آنها توسط `countUniqueMcpTools` شمارش میشود). -- **۳ انتقال**: stdio، HTTP Streamable، SSE. -- **۳۳ دامنه دسترسی** که در زمان اجرا اعمال میشوند — فهرست پایه در `src/shared/constants/mcpScopes.ts` قرار دارد و مجموعه کامل، اجتماع دامنههای دسترسی اعلامشده توسط هر ماژول ابزار است. +- **۱۱۰ ابزار منحصربهفرد** در `server.ts` متصل شدهاند (۴۵ ابزار متعارف در `schemas/tools.ts` + + ماژولهای حافظه، مهارتها، GitHub-skills، مخزن، بازیوارسازی، افزونه، Notion، Obsidian، + پیکره محلی و فشردهسازی — اجتماع آنها توسط `countUniqueMcpTools` شمارش شده است). +- **۳ روش انتقال**: stdio، HTTP Streamable و SSE. +- **۳۳ محدوده دسترسی** در زمان اجرا اعمال میشوند — فهرست پایه در `src/shared/constants/mcpScopes.ts` قرار دارد و مجموعه کامل، اجتماع محدودههای دسترسی تعریفشده توسط هر ماژول ابزار است. - جدول ممیزی: `mcp_tool_audit` (توسط `audit.ts` پر میشود). - فایلها: `server.ts`، `index.ts`، `httpTransport.ts`، `audit.ts`، `scopeEnforcement.ts`، `runtimeHeartbeat.ts`، `descriptionCompressor.ts`، `schemas/{tools, a2a, audit, index}.ts`، @@ -548,8 +549,8 @@ open-sse/ ### 4.7 `open-sse/config/` -رجیستریهای ارائهدهنده (`providerRegistry.ts`، `providerModels.ts`، -`providerHeaderProfiles.ts`)، رجیستریهای مدل برای هر قالب (`audioRegistry.ts`، +رجیستریهای ارائهدهندگان (`providerRegistry.ts`، `providerModels.ts`، +`providerHeaderProfiles.ts`)، رجیستریهای مدل بهتفکیک قالب (`audioRegistry.ts`، `embeddingRegistry.ts`، `imageRegistry.ts`، `moderationRegistry.ts`، `musicRegistry.ts`، `rerankRegistry.ts`، `searchRegistry.ts`، `videoRegistry.ts`)، ابزارهای کمکی هویت (`codexIdentity.ts`، `codexInstructions.ts`، @@ -562,7 +563,7 @@ open-sse/ ### 4.8 `open-sse/utils/` -مولفههای پایهٔ استریم و ابزارهای کمکی ارائهدهنده: `stream.ts`، `streamHandler.ts`، +مؤلفههای پایهٔ استریم و ابزارهای کمکی ارائهدهنده: `stream.ts`، `streamHandler.ts`، `streamHelpers.ts`، `streamPayloadCollector.ts`، `streamReadiness.ts`، `sseHeartbeat.ts`، `proxyFetch.ts`، `proxyDispatcher.ts`، `tlsClient.ts`، `networkProxy.ts`، `awsSigV4.ts`، `cacheControlPolicy.ts`، diff --git a/docs/i18n/fa/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/fa/docs/architecture/RESILIENCE_GUIDE.md index b9d4f5de30b4..7704e69a3f3b 100644 --- a/docs/i18n/fa/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/fa/docs/architecture/RESILIENCE_GUIDE.md @@ -62,80 +62,139 @@ OmniRoute سه سازوکار تابآوری متمایز اما مرتبط دا `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. محافظ رگرسیون: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. دوره انتظار اتصال +## 2. وقفهٔ اتصال **دامنه:** یک اتصال/حساب/کلید ارائهدهنده. -**هدف:** نادیده گرفتن یک کلید معیوب، درحالیکه سایر اتصالهای همان ارائهدهنده همچنان سرویسدهی میکنند. +**هدف:** نادیده گرفتن یک کلید معیوب، درحالیکه سایر اتصالهای همان ارائهدهنده همچنان به درخواستها سرویس میدهند. **پیادهسازی:** - علامتگذاری بهعنوان دردسترسنبودن: `src/sse/services/auth.ts::markAccountUnavailable()` - انتخاب: `getProviderCredentials*` در همان فایل -- محاسبه دوره انتظار: `open-sse/services/accountFallback.ts::checkFallbackError()` +- محاسبهٔ وقفه: `open-sse/services/accountFallback.ts::checkFallbackError()` - تنظیمات: `src/lib/resilience/settings.ts` **فیلدهای هر اتصال:** -- `rateLimitedUntil` — برچسب زمانی پایان دوره انتظار +- `rateLimitedUntil` — برچسب زمانی تا پایان وقفه - `testStatus: "unavailable"` - `lastError`، `lastErrorType`، `errorCode` -- `backoffLevel` — شمارنده عقبنشینی نمایی +- `backoffLevel` — شمارندهٔ عقبنشینی نمایی -**دورههای انتظار پیشفرض:** +**وقفههای پیشفرض:** -- پایه OAuth: 5 ثانیه -- پایه کلید API: 3 ثانیه -- خطای 429 کلید API: مقادیر بالادستی `Retry-After`/هدرهای بازنشانی/متن بازنشانی قابلتجزیه را ترجیح میدهد +- پایهٔ OAuth: ۵ ثانیه +- پایهٔ API-key: ۳ ثانیه +- API-key با خطای 429: سرآیندهای بالادستی `Retry-After`/بازنشانی یا متن قابلتجزیهٔ بازنشانی را ترجیح میدهد - عقبنشینی: `baseCooldownMs * 2 ** failureIndex` -**محافظ جلوگیری از هجوم همزمان:** مانع از آن میشود که خطاهای همزمان دوره انتظار را بیشازحد طولانی کنند یا `backoffLevel` را دو بار افزایش دهند. +**محافظ جلوگیری از هجوم همزمان:** مانع میشود خطاهای همزمان، وقفه را بیشازحد تمدید کنند یا `backoffLevel` را دو بار افزایش دهند. -**وضعیتهای نهایی (دوره انتظار نیستند):** +**وضعیتهای نهایی (وقفه نیستند):** -- `banned` — توسط تشخیص کلیدواژه ممنوعیت / مسدودشدن حساب تنظیم میشود (به [BAN_DETECTION](../security/BAN_DETECTION.md) مراجعه کنید) و همچنین در پی سه رد متوالی درخواست از سوی سرویس بالادستی (`request_rejected`، برای مثال خطای 403 مربوط به Anthropic OAuth با پیام «Request not allowed» — `open-sse/services/requestRejectedStreak.ts`)؛ یک بار رد شدن صرفاً اتصال را وارد دوره انتظار میکند -- `expired` (پس از تعداد محدودی تلاش مجدد به وضعیت نهایی منتقل میشود — `EXPIRED_RETRY_MAX = 3` با عقبنشینی نمایی — تا خطاهای موقت OAuth بتوانند پیش از غیرفعالشدن دائمی حساب، خودبهخود برطرف شوند) +- `banned` — با تشخیص کلیدواژهٔ مسدودسازی / مسدودشدن حساب تنظیم میشود (به [BAN_DETECTION](../security/BAN_DETECTION.md) مراجعه کنید) و همچنین پس از سه رد متوالی هر درخواست از سمت بالادست (`request_rejected`، برای مثال پاسخ 403 مربوط به Anthropic OAuth با پیام «Request not allowed» — `open-sse/services/requestRejectedStreak.ts`)؛ یک رد منفرد فقط اتصال را وارد وقفه میکند +- `expired` (پس از تعداد محدودی تلاش مجدد به وضعیت نهایی منتقل میشود — `EXPIRED_RETRY_MAX = 3` همراه با عقبنشینی نمایی — تا خطاهای موقتی OAuth بتوانند پیش از غیرفعالشدن دائمی حساب، خودبهخود رفع شوند) - `credits_exhausted` -این وضعیتها تا زمانی که اعتبارنامهها تغییر کنند یا یک اپراتور آنها را بازنشانی کند، پایدار میمانند. وضعیتهای نهایی را با وضعیت دوره انتظار موقت بازنویسی نکنید. +این وضعیتها تا زمان تغییر اعتبارنامهها یا بازنشانی آنها توسط اپراتور پابرجا میمانند. وضعیتهای نهایی را با وضعیت وقفهٔ موقت بازنویسی نکنید. -**بازیابی تنبل:** وقتی زمان `rateLimitedUntil` گذشته باشد، اتصال دوباره واجد شرایط میشود. پس از استفاده موفق، `clearAccountError()` تمام فیلدهای خطا را پاک میکند. +**بازیابی تنبل:** وقتی زمان `rateLimitedUntil` گذشته باشد، اتصال دوباره واجد شرایط میشود. پس از استفادهٔ موفق، `clearAccountError()` همهٔ فیلدهای خطا را پاک میکند. + +### دیوار مصرف Claude OAuth: مسیر با اولویت پایینتر + بازنشانی محدودیت نشست + +**دامنه:** یک اتصال اشتراک Claude ‏(OAuth). هر دو قابلیت بهصورت **اختیاری برای هر +اتصال** فعال میشوند (ویرایش اتصال ← بخش Claude ← گزینههای `lowPriorityMode` / `autoLimitReset` در +`providerSpecificData` که هر دو بهطور پیشفرض خاموشاند) و معادل فرمانهای `/low-priority` و +`/limit-reset` در Claude Code هستند (قرارداد ارتباطی ثبتشده از Claude Code 2.1.263). + +**پیادهسازی:** + +- ماشین حالت + طبقهبندی پاسخ: `open-sse/services/claudeLowPriority.ts` +- کارخواه وضعیت/درخواست بازنشانی: `open-sse/services/claudeLimitReset.ts` +- هوک اجراکننده (تزریق سرآیند + تلاش مجدد با همان حساب): `open-sse/executors/base.ts::execute()` +- ماندگاری انتخاب فعالسازی: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**محرک:** دیوار مصرف ۵ ساعته — یک پاسخ `429` که سرآیندهای آن شامل +`anthropic-ratelimit-unified-status: rejected` و، در صورت واجد شرایط بودن حساب، +`anthropic-ratelimit-unified-slow-offer: treatment` باشند. پیش از نخستین پاسخ 429 مربوط به دیوار +هیچچیز ارسال نمیشود؛ یک پاسخ 429 انفجاری بدون سرآیندهای یکپارچه، از مسیر معمول وقفه عبور میکند. + +**مسیر با اولویت پایینتر** (`lowPriorityMode`): + +- هنگام دریافت پاسخ 429 مربوط به دیوار، اجراکننده پیشنهاد را میپذیرد و بلافاصله همان + حساب را با `anthropic-usage-limit: slow` دوباره امتحان میکند؛ این مسیر تا زمان اعلامشده در + `anthropic-ratelimit-unified-reset` (بهاضافهٔ ۶۰ ثانیه مهلت) فعال میماند و هر درخواست در این بازه + سرآیند را حمل میکند. پاسخ 429 رهگیریشده هرگز به `handleChatCore` نمیرسد، بنابراین اتصال + وارد **وقفه نمیشود** و با اتصال دیگری جایگزین نمیگردد. +- مقدار `anthropic-ratelimit-unified-slow-status` در پاسخهای بعدی: `active` / `not_needed` + مسیر را حفظ میکنند؛ `slot_busy` ‏(429) یا یک پاسخ `529` بهاندازهٔ مقدار + `anthropic-ratelimit-unified-slow-retry-after` اعلامشده از سوی سرور منتظر میماند (پیشفرض ۲۰ ثانیه، محدودشده به ۵ تا ۶۰۰ ثانیه، با نوسان تصادفی ±۳۰٪) + و دوباره تلاش میکند؛ این فرایند به مقدار `anthropic-ratelimit-unified-slow-max-wait` محدود است (پیشفرض ۲۰ دقیقه، محدودشده به + ۱ دقیقه تا ۶ ساعت) — پس از آن مسیر پایان مییابد و یک دورهٔ استراحت ۱۰ دقیقهای مانع پذیرش مجدد میشود. علاوه بر این، + زمان انتظار به مقدار باقیمانده از مهلت آغاز بالادستی خود درخواست + (`resolveFetchStartTimeout`، با پیشفرض ۱۰ دقیقه) منهای حاشیهٔ ۵ ثانیهای محدود میشود: بدون این محدودیت، + حداکثر زمان انتظار پیشفرض ۲۰ دقیقهای از عمر درخواست بیشتر میشد و خواب در میانهٔ انتظار لغو میگردید، + در نتیجه بهجای پایان مطلوب `max_wait` و دورهٔ استراحت، یک `TimeoutError` نمایان میشد. +- مقادیر `weekly_limit` / `budget_exhausted` / `off` / `ineligible`، تغییر پنجرهٔ ۵ ساعته، یا + `ineligible` همراه با `anthropic-ratelimit-unified-overage-in-use: true` (که در هر وضعیتی آن را با + `extra_usage` پایان میدهد، زیرا مصرف مازاد پولی اکنون دیوار را پوشش میدهد) مسیر را خاتمه میدهند؛ سپس + پاسخ به مسیر معمول وقفه میرود. وضعیت `budget_exhausted` تا بازنشانی بودجهٔ اعلامشده (≤ ۸ روز) به خاطر سپرده میشود. +- بررسی دیوار پس از تلاشهای مجدد درونمرحلهای اجراکننده که با پاسخ 400 هدایت میشوند انجام میگیرد (ویرایش + زمینه، محدودسازی تفکر/تلاش، یادگیری خودکار پارامتر)، بنابراین پاسخ 429 مربوط به دیوار که فقط در + یکی از آن تلاشهای مجدد ظاهر شود نیز، بهجای رسیدن به مسیر وقفه، رهگیری میشود. +- وضعیت برای هر اتصال در حافظه نگهداری میشود (راهاندازی مجدد باعث میشود برای پذیرش مجدد، یک پاسخ 429 اضافی مربوط به دیوار دریافت شود). + +**بازنشانی محدودیت نشست** (`autoLimitReset`، وقتی هر دو قابلیت روشن باشند پیش از مسیر امتحان میشود): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` ← بلوک `juniper_tide`؛ + وقتی `arm: "reset"` و `available: true` باشند، + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` با + `{ "program": "juniper_tide" }` ارسال میشود (UUID سازمان از + `providerSpecificData.organizationUUID`، با جایگزین راهاندازی اولیه). +- `result: reset|not_limited` ← درخواست با سرعت کامل دوباره امتحان میشود (بدون سرآیند slow). + مقادیر `already_used` / `not_offered`، مقدار `next_available_at` را به خاطر میسپارند (پیشفرض یک هفته)؛ هر + خطایی باعث ۱۵ دقیقه عقبنشینی میشود. بازنشانی هفتهای یک بار انجام میشود و همچنان جزو + محدودیت هفتگی محسوب میگردد. + +محافظهای رگرسیون: `tests/unit/claude-low-priority-mode.test.ts`، +`tests/unit/claude-limit-reset.test.ts`، `tests/unit/claude-low-priority-executor.test.ts`. ### وابستگی نشست (#7274) -**دامنه:** یک نشست کلاینت (هدر `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) که برای **هر** ارائهدهنده به یک اتصال سنجاق شده است. +**دامنه:** یک نشست کارخواه (سرآیند `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) که برای **هر** ارائهدهندهای به یک اتصال سنجاق شده است. -**هدف:** نگهداشتن یک عامل چندمرحلهای (Claude Code، aider، عاملهای سفارشی) روی همان حساب در درخواستهای مختلف، با هدف کاهش از دست رفتن زمینه میان حسابها و خطاهای مکرر 429 ناشی از شروع سرد در ارائهدهندگانی که وضعیت نشست را بهازای هر حساب نگه میدارند. +**هدف:** نگهداشتن یک عامل چندمرحلهای (Claude Code، aider، عاملهای سفارشی) روی یک حساب یکسان در درخواستهای مختلف، برای کاهش از دست رفتن زمینه در اثر جابهجایی بین حسابها و کاهش خطاهای تکراری 429 ناشی از شروع سرد در ارائهدهندگانی که وضعیت نشست را بهازای هر حساب نگه میدارند. **پیادهسازی:** - تعیین TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- انتخاب/ایجاد اتصال سنجاقشده: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- انتخاب/ایجاد پین: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - استخراج هدر (عمومی، برای هر ارائهدهنده): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- جدول ماندگار سنجاقها: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- تنظیم: `sessionAffinityTtlMs` (TTL سراسری برحسب میلیثانیه، `0` آن را غیرفعال میکند) — `src/lib/db/settings.ts`. نام آن از `codexSessionAffinityTtlMs` مختص Codex، توسط مهاجرت `124_generic_session_affinity_ttl.sql` تغییر کرده است؛ این مهاجرت هر TTL از پیش پیکربندیشده Codex را بهعنوان مقدار پیشفرض جدید منتقل میکند. +- جدول پین پایدارشده: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- تنظیم: `sessionAffinityTtlMs` (TTL سراسری برحسب میلیثانیه، مقدار `0` آن را غیرفعال میکند) — `src/lib/db/settings.ts`. نام آن از `codexSessionAffinityTtlMs` که فقط مخصوص Codex بود، بهوسیله مهاجرت `124_generic_session_affinity_ttl.sql` تغییر کرده است؛ این مهاجرت هر TTL ازپیشپیکربندیشده Codex را بهعنوان مقدار پیشفرض جدید منتقل میکند. -پیش از #7274، تابع `resolveSessionAffinityTtlMs()` برای همه ارائهدهندگان بهجز `codex` فوراً مقدار `0` را برمیگرداند؛ بنابراین تنظیم TTL (و هدرهای نشست) در هیچ جای دیگری اثری نداشت، هرچند سازوکار سنجاقکردن و استخراج هدر از قبل مستقل از ارائهدهنده بودند. این اصلاح آن بازگشت زودهنگام را حذف کرد؛ اکنون پس از تنظیم سراسری TTL روی مقداری بیشتر از `0`، این مقدار بهطور یکسان برای همه ارائهدهندگان اعمال میشود. +پیش از #7274، تابع `resolveSessionAffinityTtlMs()` برای همه ارائهدهندگان بهجز `codex` فوراً مقدار `0` را برمیگرداند؛ بنابراین تنظیم TTL (و هدرهای نشست) در هیچ جای دیگری اثری نداشت، با اینکه سازوکار پینکردن و استخراج هدر از قبل مستقل از ارائهدهنده بودند. این اصلاح، آن بازگشت زودهنگام را حذف کرد؛ اکنون TTL پس از تنظیم سراسری روی مقداری بیشتر از `0`، بهطور یکسان برای همه ارائهدهندگان اعمال میشود. -سه هدر وابستگی نشست هرگز به سرویس بالادستی ارسال نمیشوند — اجراکنندهها بهجای عبور دادن هدرهای کلاینت، هدرهای بالادستی خود را از ابتدا میسازند؛ بنابراین این مقدار فقط یک شناسه همبستگی داخلی باقی میماند. +سه هدر وابستگی نشست هرگز به بالادست ارسال نمیشوند — اجراکنندهها هدرهای بالادست خود را از ابتدا میسازند و هدرهای کلاینت را عبور نمیدهند؛ بنابراین این مقدار فقط یک شناسه همبستگی داخلی باقی میماند. ### اجارههای انحصاری اتصال برای نشست مدیریتشده **دامنه:** یک کلاینت/نشست HTTP مدیریتشده فعال، مالک یک اتصال واجد شرایط OmniRoute است. -**هدف:** فراهمکردن مالکیت انحصاری و ماندگار اتصال برای کلاینتهایی که به یک مرز سخت مسیریابی در میان درخواستها نیاز دارند. این سازوکار با وابستگی نشست، که یک ترجیح نرم برای حفظ تداوم است، تفاوت دارد: یک اجاره انحصاری وضعیت چرخه حیات را در SQLite بهصورت ماندگار نگه میدارد، یکتایی سراسری مالک فعال و اتصال فعال را اعمال میکند و نسل منقضیشده را پیش از ارسال به ارائهدهنده رد میکند. +**هدف:** فراهمکردن مالکیت انحصاری و بادوام اتصال برای کلاینتهایی که به یک مرز سخت مسیریابی میان درخواستها نیاز دارند. این سازوکار با وابستگی نشست، که یک ترجیح نرم برای تداوم است، تفاوت دارد: یک اجاره انحصاری، وضعیت چرخه عمر را در SQLite پایدار میکند، یکتایی سراسری مالک فعال و اتصال فعال را اعمال میکند و نسل منقضیشده را پیش از ارسال به ارائهدهنده رد میکند. -این قابلیت برای هر کلید API بهصورت اختیاری فعال میشود. یک کلید مدیریتشده باید دامنه `lease:exclusive` و یک فهرست صریح و غیرخالی `allowedConnections` داشته باشد. هر کلاینت HTTP میتواند از نقطه پایانی چرخه حیات استفاده کند؛ به نام کلاینت، عامل کاربر، ارائهدهنده، روش OAuth یا مدل نیازی نیست. اجاره، مالک یک اتصال است نه یک مدل؛ بنابراین تغییر مدل تا زمانی که اتصال بهطور معمول واجد شرایط باقی بماند، پیوند را حفظ میکند. قواعد عادی مدل، سهمیه، سلامت، دوره انتظار و فهرست مجاز همچنان مرجع نهایی هستند و ممکن است همان نسل را به یک اتصال آزاد و واجد شرایط دیگر منتقل کنند. +این قابلیت برای هر کلید API بهصورت اختیاری فعال میشود. یک کلید مدیریتشده باید دامنه `lease:exclusive` و یک فهرست صریح و غیرخالی `allowedConnections` داشته باشد. هر کلاینت HTTP میتواند از نقطه پایانی چرخه عمر استفاده کند؛ نیازی به نام کلاینت، user-agent، ارائهدهنده، روش OAuth یا مدل نیست. اجاره، مالک یک اتصال است نه یک مدل؛ بنابراین تغییر مدل تا زمانی که اتصال طبق روال معمول واجد شرایط باقی بماند، اتصال برقرارشده را حفظ میکند. قواعد عادی مدل، سهمیه، سلامت، دوره انتظار و فهرست مجاز همچنان تعیینکننده هستند و ممکن است همان نسل را به اتصال آزاد و واجد شرایط دیگری منتقل کنند. -چرخه حیات از طریق `POST /api/v1/session-leases` و با کنشهای JSON شامل `acquire`، `renew` و `release` انجام میشود. درخواستهای استنتاج مدیریتشده، مقدار مبهم `X-OmniRoute-Lease-Owner` و مقدار دقیق `X-OmniRoute-Lease-Generation` را ارائه میکنند. مالک از پیشوند `vlo_` و سپس 43 نویسه base64url استفاده میکند؛ فقط هش SHA-256 آن ذخیره میشود. هر مرز نهایی ارسال نیز شناسه کلید API احراز هویتشده و شناسه اتصال فعال را مقید میکند. هدرهای کنترل اجاره از گزارشها، اسنپشاتهای نگهداریشده درخواست و هدرهای اجراکننده بالادستی حذف میشوند. +چرخه عمر از `POST /api/v1/session-leases` با کنشهای JSON شامل `acquire`، `renew` و `release` استفاده میکند. درخواستهای استنتاج مدیریتشده، مقدار مبهم `X-OmniRoute-Lease-Owner` و مقدار دقیق `X-OmniRoute-Lease-Generation` را ارائه میکنند. شناسه مالک با `vlo_` آغاز میشود و پس از آن 43 نویسه base64url قرار میگیرد؛ فقط هش SHA-256 آن ذخیره میشود. هر مرز نهایی ارسال، شناسه کلید API احراز هویتشده و شناسه اتصال فعال را نیز مقید میکند. هدرهای کنترل اجاره از گزارشها، نماهای ذخیرهشده درخواست و هدرهای اجراکننده بالادست حذف میشوند. -اگر مسیریابی عادی دارای گزینههای مدیریتشده واجد شرایط باشد، اما هر گزینه آزاد توسط یک اجاره فعال خارجی اشغال شده باشد، OmniRoute پاسخ HTTP `429`، کد عدم دسترسی به ظرفیت اجاره، وضعیت انتظار برای ظرفیت و یک `Retry-After` محدودشده را که از نزدیکترین زمان انقضای مرتبط محاسبه شده است، برمیگرداند. خالیبودن عادی مجموعه گزینههای واجد شرایط، رقابت بر سر اجاره محسوب نمیشود و معناشناسی خطای مسیریابی موجود خود را حفظ میکند. +اگر مسیریابی عادی دارای گزینههای مدیریتشده واجد شرایط باشد، اما همه گزینههای آزاد توسط اجارههای فعال متعلق به دیگران اشغال شده باشند، OmniRoute پاسخ HTTP `429`، کد عدم دسترسی به ظرفیت اجاره، وضعیت انتظار برای ظرفیت و یک `Retry-After` محدودشده را برمیگرداند که از نزدیکترین زمان انقضای مرتبط محاسبه میشود. خالیبودن عادی مجموعه گزینههای واجد شرایط بهمعنای رقابت بر سر اجاره نیست و معناشناسی خطای مسیریابی موجود خود را حفظ میکند. -سازوکارهای مرتبط همچنان جدا باقی میمانند: +سازوکارهای مرتبط همچنان مجزا باقی میمانند: -- اشغال نشست OAuth یک توزیع نرم و محلی در سطح پردازش برای حسابهای OAuth است. +- اشغال نشست OAuth، توزیع نرم و محلیِ فرایند برای حسابهای OAuth است. - سمافورهای حساب، مجوزهای همزمانی درخواست را اعطا میکنند و با تکمیل درخواست پایان مییابند. -- اجارههای انحصاری اتصال برای نشست مدیریتشده، مالکیت ماندگار چرخه حیات را همراه با یک مرز نسل فراهم میکنند. +- اجارههای انحصاری نشست مدیریتشده، مالکیت بادوام چرخه عمر را همراه با مرز نسل فراهم میکنند. --- @@ -241,47 +300,76 @@ concurrency** (`resilienceSettings.quotaShareConcurrencyLimit.enabled`، بهط --- -## 5. کنترل پذیرش صف درخواستها (v3.8.49 · issue #6593) - -**دامنه**: صف محلی محدودیت نرخ بهازای هر ارائهدهنده+اتصال (`open-sse/services/rateLimitManager.ts` -که توسط Bottleneck پشتیبانی میشود)، یک لایه پایینتر از سه سازوکار بالا. - -**`maxWaitMs` یک نام قدیمی و ذخیرهشده برای انقضای اجرا است.** -`resilienceSettings.requestQueue.maxWaitMs` بهعنوان `expiration` یک کار به -Bottleneck ارسال میشود که زمانسنج آن فقط پس از ارسال آغاز میگردد. بنابراین، -اجرای مدیریتشده توسط محدودکننده را مقید میکند، نه زمان سپریشده در صف محلی را. -انقضا بهصورت `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` محلی و مورداعتماد -(HTTP 504) گزارش میشود؛ نام قبلی کد پایان مهلت صف فقط برای سازگاری عقبرو داخلی -و مورداعتماد پذیرفته میشود. مقدار پیشفرض 15000ms است؛ آن را از طریق -`RATE_LIMIT_MAX_WAIT_MS` (متغیر محیطی) یا داشبورد (**Settings → Resilience**، -با سقف رابط کاربری 1–30000ms) بازنویسی کنید. مدت حضور در صف هیچ مهلت زمانیای -ندارد؛ برای محدود کردن درخواستکنندگان در صف از `maxQueueDepth` زیر استفاده کنید. +## 5. کنترل پذیرش صف درخواست (v3.8.49 · مسئله #6593) + +**دامنه**: صف محلی محدودسازی نرخ بهازای هر ارائهدهنده+اتصال (`open-sse/services/rateLimitManager.ts`، +با پشتوانه Bottleneck)، یک لایه پایینتر از سه سازوکار بالا. + +**`maxWaitMs` انتظار در صف را محدود میکند؛ `executionMaxWaitMs` اجرا را محدود میکند.** +این دو عمداً از یکدیگر جدا هستند و هیچکدام روی دیگری اثر نمیگذارد. + +`resilienceSettings.requestQueue.maxWaitMs` **بودجه انتظار در صف** است: این +مقدار، انتظار برای آزاد شدن یک جایگاه ارائهدهنده و سپس ماندن در وضعیت QUEUED را +پوشش میدهد و تایمر آن بهمحض خروج کار از وضعیت QUEUED و آغاز اجرا پاک میشود +(`rateLimitManager.ts`، `wrappedFn`). درخواستی که از این مقدار فراتر رود هرگز +به سرویس بالادستی نمیرسد. مقدار پیشفرض 30000ms است که توسط +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` در `src/lib/resilience/settings.ts` ارائه +میشود و در `tests/unit/ratelimit-admission-control-6593.test.ts` تثبیت شده است؛ +بنابراین تغییر آن، بهجای اینکه بیسروصدا باعث منسوخ شدن این بند شود، آن آزمون را +ناموفق میکند. + +`resilienceSettings.requestQueue.executionMaxWaitMs` مقداری است که Bottleneck +بهعنوان `expiration` کار دریافت میکند و تایمر آن تنها پس از اعزام آغاز میشود. این +مقدار یک سازوکار پشتیبان برای اجراکنندههایی است که مهلت زمانی بالادستی مختص خود +ندارند و وقتی مهلت زمانی شروع واکشی خود اجراکننده بیشتر باشد، تا آن مقدار افزایش +مییابد تا نتواند یک پاسخ سالمِ در حال پردازش را قطع کند. مقدار پیشفرض 600000ms +(10 دقیقه) است. + +وارد کردن بودجه صف در `expiration` همان چیزی بود که پیشتر دروازههای +غیرافزایشی را حین پردازش متوقف میکرد — آنها بهطور مجاز چند دقیقه پیش از رسیدن +اولین بایتها اجرا میشوند — و به همین دلیل، انقضای اجرا بهصورت `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) ارائه میشود، درحالیکه بودجه صف +کد مهلت زمانی صف را حمل میکند. هرکدام را از طریق +`RATE_LIMIT_MAX_WAIT_MS` / `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (متغیر محیطی) +یا داشبورد (**Settings → Resilience**) بازنویسی کنید. هر دو هنگام نرمالسازی +به بازه 1ms–24h محدود میشوند. + +**اولویت برای هر دو:** متغیر محیطی فقط مقدار _پیشفرض_ را تأمین میکند. مقداری +که در `resilienceSettings.requestQueue` ماندگار شده باشد (از طریق داشبورد / +وصله API و ذخیرهشده در `key_value`) بر آن اولویت دارد و مقدار +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` مختص هر اتصال نیز بر +آن اولویت دارد. بنابراین تنظیم متغیر محیطی در استقراری که از قبل مقداری ماندگار +دارد، هیچ تغییری ایجاد نمیکند — در عوض، تنظیم ماندگار را پاک یا بهروزرسانی کنید. + +مدت حضور در صف توسط `maxWaitMs` محدود میشود؛ `maxQueueDepth` در ادامه تعداد +فراخوانندههایی را که میتوانند همزمان در صف باشند محدود میکند. **`maxQueueDepth` — سقف پذیرش اختیاری (جدید).** `resilienceSettings.requestQueue.maxQueueDepth` -تعداد درخواستهایی را که میتوانند بهطور همزمان برای یک ارائهدهنده+اتصال در صف -باشند (و هنوز ارسال نشدهاند) محدود میکند. هنگامی که صف از قبل -`maxQueueDepth` درخواست داشته باشد، یک درخواست جدید با خطای نوعدار -`code: "RATE_LIMIT_QUEUE_FULL"`، **پیش از** آنکه به `limiter.schedule()` برسد، -بهسرعت رد میشود — بنابراین، رد شدن کمهزینه است و پیش از هرگونه عملیات پاییندستی -فشردهسازی پرامپت / ترجمه برای آن درخواست رخ میدهد. مقدار پیشفرض `0` = -غیرفعال است و رفتار فعلی صف نامحدود را حفظ میکند؛ محدوده مجاز 0–100000 است. -آن را از طریق `RATE_LIMIT_MAX_QUEUE_DEPTH` (متغیر محیطی) یا -`resilienceSettings.requestQueue.maxQueueDepth` (وصله داشبورد/API) بازنویسی کنید. - -بررسی پذیرش، خود یک تابع خالص است +تعداد درخواستهایی را که میتوانند بهطور همزمان برای یک +ارائهدهنده+اتصال در صف بمانند (و هنوز اعزام نشده باشند) محدود میکند. وقتی صف +از قبل شامل `maxQueueDepth` درخواست باشد، یک درخواست جدید با خطای نوعدار +`code: "RATE_LIMIT_QUEUE_FULL"` و **پیش از** آنکه هرگز به `limiter.schedule()` +برسد، بهسرعت رد میشود — بنابراین رد کردن کمهزینه است و پیش از هرگونه کار +پاییندستی فشردهسازی پرامپت / ترجمه برای آن درخواست رخ میدهد. مقدار پیشفرض +`0` = غیرفعال است و رفتار فعلی صف نامحدود را حفظ میکند؛ بازه مجاز 0–100000 +است. از طریق `RATE_LIMIT_MAX_QUEUE_DEPTH` (متغیر محیطی) یا +`resilienceSettings.requestQueue.maxQueueDepth` (وصله داشبورد/API) بازنویسی +کنید. + +خود بررسی پذیرش یک تابع خالص است (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) تا -بدون یک محدودکننده واقعی Bottleneck قابل آزمون واحد باشد. - -> RFC که #6593 را ایجاد کرد، یک پرچم `bypassCompressionOnRateLimit` را نیز -> پیشنهاد داده بود. خط لوله `open-sse/services/compression/` در این مخزن، -> فشردهسازی پرامپت/زمینه روی درخواست خروجی LLM است (`chatCore.ts`، -> در حوالی بلوک `resolveCompressionSettings`/`selectCompressionStrategy`)، -> نه فشردهسازی پاسخ HTTP روی بدنههای 429 تولیدشده — هیچ مسیر کد متناظری -> برای یک پرچم bypass تحتاللفظی وجود ندارد. آن مرحله فشردهسازی پرامپت نیز در -> حال حاضر در خط لوله درخواست _پیش از_ `withRateLimit()` اجرا میشود؛ بنابراین، -> تغییر ترتیب برای رد کردن آن هنگام رد شدن بهدلیل پر بودن صف، تغییری جداگانه و -> بزرگتر از دامنه این issue است؛ این قابلیت عمداً در اینجا پیادهسازی **نشد** -> و اگر صرفهجویی در CPU ارزش ریسک تغییر ترتیب را داشته باشد، بهعنوان کاری برای +بدون یک محدودکننده واقعی Bottleneck نیز قابل آزمون واحد باشد. + +> RFCای که #6593 را ایجاد کرد، یک پرچم `bypassCompressionOnRateLimit` را نیز +> پیشنهاد داده بود. خط لوله `open-sse/services/compression/` این مخزن برای +> فشردهسازی پرامپت/زمینه در درخواست خروجی LLM است (`chatCore.ts`، +> پیرامون بلوک `resolveCompressionSettings`/`selectCompressionStrategy`)، +> نه فشردهسازی پاسخ HTTP روی بدنههای 429 تولیدشده — هیچ مسیر کدی مطابق با +> یک پرچم دور زدن صریح وجود ندارد. آن مرحله فشردهسازی پرامپت نیز در حال حاضر +> در خط لوله درخواست _پیش از_ `withRateLimit()` اجرا میشود؛ بنابراین تغییر +> ترتیب برای صرفنظر کردن از آن هنگام رد شدن بهدلیل پر بودن صف، تغییری جداگانه +> و بزرگتر از دامنه این مسئله است؛ این تغییر عمداً در اینجا پیادهسازی **نشد** +> و اگر صرفهجویی CPU ارزش ریسک تغییر ترتیب را داشته باشد، بهعنوان کاری برای > پیگیری بعدی باقی مانده است. --- diff --git a/docs/i18n/fa/docs/architecture/admission-lanes.md b/docs/i18n/fa/docs/architecture/admission-lanes.md index 90c53fe88d7d..389a89557ac9 100644 --- a/docs/i18n/fa/docs/architecture/admission-lanes.md +++ b/docs/i18n/fa/docs/architecture/admission-lanes.md @@ -7,51 +7,52 @@ OmniRoute دارای **دو** سیستم مسیر محلی در سطح پردازه با دامنههای متفاوت است. این دو مکمل یکدیگرند؛ اپراتورها باید بدانند که کدامیک را مشاهده میکنند. -## 1. پذیرش سراسری پردازه در سطح بایت (`chatBodyAdmission.ts`) - -- **دامنه:** مسیر بدنهٔ بافرشده/حافظهٔ heap برای `POST /v1/chat/completions`، - `/v1/messages`، `/v1/responses` و سایر مسیرهای مشابه چت. از تقویت مصرف - حافظهٔ heap ناشی از بدنههای بزرگ عاملهای کدنویسی جلوگیری میکند (#4380). -- **یک کنترلگر سراسری برای کل پردازه، نه مسیرهای مجزا برای هر کلید (#10110).** هر کلید API - (بهصورت هششده) یا نشست `anonymous` برای پذیرش از **همان** بودجهٔ مشترک استفاده - میکند — شناسهٔ هششدهٔ نشست فقط بهعنوان کلید زمانبندی منصفانه (توزیع - round-robin میان درخواستهای منتظر) استفاده میشود و هرگز نقش یک بخش مستقل - از ظرفیت را ندارد. نسخهٔ قبلی این سند، مسیرهای جداگانه برای هر کلید با ظرفیت - مستقل را توصیف میکرد؛ آن مدل در #10110 حذف شد، زیرا به اعتبارنامههای جعلی - و احرازهویتنشده اجازه میداد حد سراسری پردازه را چندبرابر کنند. -- **دروازه (#503-fanout): بودجهٔ BYTE برای ورود داده که بهطور خودکار محاسبه میشود، نه تعداد - ثابت درخواستها.** سقف قدیمی تعداد درخواست `CHAT_MAX_HEAVY_IN_FLIGHT` (با مقدار - پیشفرض `1` پیش از این اصلاح) fan-out عاملهای کدنویسی (چندین زیرعامل/CLI، - با بدنههایی که معمولاً بزرگتر از 256 KB هستند) را به همزمانی مؤثر حدود ۱ - کاهش میداد و در بار کاملاً عادی به خطای 503 منجر میشد. اکنون این سقف فقط - زمانی اعمال میشود که اپراتور صراحتاً `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` را - تنظیم کند. اگر تنظیم نشده باشد، پذیرش در عوض توسط - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` کنترل میشود — بودجهای که بهطور خودکار - از سقف واقعی حافظهٔ پردازه محاسبه میشود - (`src/shared/middleware/admissionBudget.ts`): ۲۵٪ از مقدار محدودتر میان حد - heap در V8 و هرگونه محدودیت cgroup/container، تقسیم بر ضریب 8x برای افزایش - موقت مصرف حافظه و محدودشده به بازهٔ 8 MiB تا 2 GiB. مقادیر override صریح - نیز از همین حدود استفاده میکنند. این بودجه بدون نیاز به تنظیم متغیرهای - محیطی، خود را از یک container با حافظهٔ 512 MB تا یک رایانهٔ رومیزی با حافظهٔ - 32 GB مقیاس میدهد. بدنهای که در بودجهٔ مؤثر جای نگیرد، بلافاصله با - `413 body_exceeds_budget` رد میشود؛ فقط رقابت میان بدنههایی که بهصورت - مستقل قابل سرویسدهی هستند وارد صف محدود و منصفانه میشود. یک ردیاب زندهٔ - فشار منابع با چند سیگنال (نسبت heap در V8،‏ cgroup،‏ PSI، رویدادهای OOM — - `open-sse/utils/resourcePressurePolicy.ts`) در فشار `high` زمان انتظار - محدود را کوتاه میکند و در فشار `critical`، حتی پیش از ورود هرگونه بایت، - درخواست را فوراً با `503 resource_pressure` حذف میکند. +## 1. پذیرش سراسری در سطح بایت (`chatBodyAdmission.ts`) + +- **دامنه:** مسیر بدنهٔ بافرشده/heap برای `POST /v1/chat/completions`، + `/v1/messages`، `/v1/responses` و سایر مسیرهای دارای ساختار چت. از تقویت + مصرف heap بر اثر بدنههای بزرگ عاملهای کدنویسی جلوگیری میکند (#4380). +- **یک کنترلکنندهٔ سراسری برای کل فرایند، نه مسیرهای مجزا برای هر کلید (#10110).** هر کلید API + (هششده) یا نشست `anonymous` در برابر **همان** بودجهٔ مشترک پذیرش میشود — + شناسهٔ هششدهٔ نشست فقط بهعنوان کلید زمانبندی منصفانه (ارسال نوبتگردشی + میان منتظران) استفاده میشود و هرگز نقش بخشبندی ظرفیت را ندارد. نسخهای پیشین از این + سند، مسیرهای مجزا برای هر کلید با ظرفیت مستقل را توصیف میکرد؛ آن مدل در + #10110 حذف شد، زیرا به اعتبارنامههای جعلی و احراز هویتنشده اجازه میداد + کران سراسری فرایند را چند برابر کنند. +- **دروازه (#503-fanout): یک بودجهٔ BYTE برای دریافت داده که بهصورت خودکار محاسبه میشود، نه تعداد ثابتی + درخواست.** سقف قدیمی مبتنی بر تعداد درخواست، یعنی `CHAT_MAX_HEAVY_IN_FLIGHT` (با مقدار پیشفرض `1` + پیش از این اصلاح)، توزیع همزمان عاملهای کدنویسی (چندین زیرعامل/CLI، + با بدنههایی که معمولاً > 256 KB هستند) را به همروندی مؤثر تقریباً ۱ کاهش میداد و + در بار کاملاً عادی، پاسخ 503 ایجاد میکرد. اکنون این سقف فقط زمانی اعمال میشود که اپراتور + صراحتاً `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` را تنظیم کند. اگر تنظیم نشده باقی بماند، پذیرش در عوض + با `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` محدود میشود — بودجهای که بهطور خودکار از + سقف واقعی حافظهٔ فرایند محاسبه میشود (`src/shared/middleware/admissionBudget.ts`): + ۲۵٪ از مقدار محدودکنندهتر میان حد heap در V8 و هر حد cgroup/container، + تقسیم بر ضریب 8x تقویت گذرای حافظه و محدودشده به بازهٔ 8 MiB تا + 2 GiB. مقادیر جایگزین صریح نیز از همین حدود استفاده میکنند. این بودجه بدون نیاز به + تنظیم متغیرهای محیطی، خود را از یک container با حافظهٔ 512 MB تا یک رایانهٔ رومیزی با حافظهٔ 32 GB + مقیاس میدهد. بدنهای که در بودجهٔ مؤثر جا نمیگیرد، فوراً با `413 body_exceeds_budget` + رد میشود؛ تنها رقابت میان بدنههایی که هر یک بهتنهایی قابل پردازشاند وارد صف محدودشدهٔ + منصفانه میشود. یک ردیاب زندهٔ چندسیگناله برای فشار منابع (نسبت heap در V8، + cgroup، PSI، رویدادهای OOM — `open-sse/utils/resourcePressurePolicy.ts`) در فشار + `high` زمان انتظار محدودشده را کاهش میدهد و در فشار `critical`، پیش از آنکه حتی + یک بایت دریافت شود، بار را فوراً با `503 resource_pressure` دفع میکند. + در صورت وجود، PSI از `memory.pressure` متعلق به cgroup همین واحد خوانده میشود + (`open-sse/utils/resourcePressureSampler.ts`)؛ `/proc/pressure/memory` مربوط به + کل میزبان است و فقط در bare metal / cgroup v1 بهعنوان مسیر جایگزین استفاده میشود، بنابراین یک + میزبان در حال swapping نمیتواند باعث شود یک container بیکار پاسخ 503 بدهد. - **تنظیمات:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — override برای بودجهٔ بایتی محاسبهشده بهصورت خودکار - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — سقف قدیمی تعداد درخواستها که فقط با opt-in فعال میشود + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — مقدار جایگزین برای بودجهٔ بایتی محاسبهشده بهصورت خودکار + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — سقف قدیمی تعداد درخواست، فقط با فعالسازی صریح - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — مدت انتظار در صف پیش از 503 (پیشفرض 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — شیر کنترل heap برای بایتهای صفشده (پیشفرض 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — از - #10110 منسوخ شده و بدون اثر هستند (برای سازگاری پیکربندی پذیرفته میشوند، اما نادیده گرفته میشوند) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — شیر کنترل heap بر اساس بایتهای صفشده (پیشفرض 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — منسوخشده و + بدون اثر از #10110 (برای سازگاری پیکربندی پذیرفته میشوند، اما نادیده گرفته میشوند) - **گزارشها:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — شامل - افزودههای #503-fanout یعنی `inflightBytes`،‏ `maxInflightBytes`،‏ `budgetSource` - (`v8_heap` | `cgroup` | `override`)،‏ `pressureSeverity` و `countCapEnabled` + افزودههای #503-fanout یعنی `inflightBytes`، `maxInflightBytes`، `budgetSource` + (`v8_heap` | `cgroup` | `override`)، `pressureSeverity` و `countCapEnabled` (در استقرار پیشفرض false است — تأیید میکند که بودجهٔ بایتی، نه سقف قدیمی - تعداد درخواستها، محدودیت واقعی اعمالشده است). + تعداد، محدودیت واقعی اعمالشده است). ## 2. مسیرهای مجازی تطبیقی زمان اجرا (`open-sse/services/admission`) diff --git a/docs/i18n/fa/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/fa/docs/frameworks/EMBEDDED-SERVICES.md index 7a424f820916..353e2d51be91 100644 --- a/docs/i18n/fa/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/fa/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **نسخه:** v3.8.44 -> **آخرین بهروزرسانی:** 2026-07-03 -> **مخاطبان:** مهندسانی که سرویسهای تعبیهشده (9Router، CLIProxyAPI، Mux، Bifrost) را اضافه، نگهداری یا اشکالزدایی میکنند. +> **آخرین بهروزرسانی:** 2026-09-09 +> **مخاطبان:** مهندسانی که سرویسهای تعبیهشده (9Router، CLIProxyAPI، Mux، Bifrost، open-wa) را اضافه، نگهداری یا اشکالزدایی میکنند. -سرویسهای تعبیهشده ابزارهای فرایند جانبیِ نصبشده روی سیستم محلی هستند که OmniRoute آنها را نصب و نظارت میکند و -بهعنوان مقصدهای مسیریابی سطحاول ارائه میدهد. برخلاف ارائهدهندگان خارجی (که از طریق اینترنت -و با استفاده از کلیدهای API به آنها دسترسی میشود)، سرویسهای تعبیهشده روی همان دستگاه OmniRoute اجرا میشوند و از طریق loopback ارتباط برقرار میکنند. +سرویسهای تعبیهشده، ابزارهای پردازشی سایدکارِ نصبشده بهصورت محلی هستند که OmniRoute آنها را نصب و نظارت میکند و +بهعنوان مقصدهای مسیریابی درجهیک ارائه میدهد. برخلاف ارائهدهندگان خارجی (که از طریق اینترنت و +با استفاده از کلیدهای API در دسترس قرار میگیرند)، سرویسهای تعبیهشده روی همان دستگاهی اجرا میشوند که OmniRoute اجرا میشود و از طریق رابط loopback ارتباط برقرار میکنند. --- @@ -31,54 +31,55 @@ ### چرا سرویسهای تعبیهشده؟ -پنج سرویس تعبیه شدهاند: +شش سرویس تعبیه شدهاند: -| سرویس | بستهٔ npm | پورت پیشفرض | هدف | -| --------------- | -------------------------------------- | :---------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | مسیریاب هوش مصنوعی که OmniRoute میتواند از آن بهعنوان ارائهدهندهٔ فرعی استفاده کند. مدلها بهشکل `9router/{sub}/{model}` ارائه میشوند | -| **CLIProxyAPI** | فایل اجرایی انتشار GitHub (`cliproxy`) | 8317 | آداپتور پراکسی محلی برای جریانهای احراز هویت Anthropic CLI. هنگامی که توکنهای OAuth منقضی میشوند، مسیریابی جایگزین را فراهم میکند | -| **Mux** | `mux` (`mux server` بدون رابط گرافیکی) | 8322 | دیمن محلی هماهنگسازی عاملها (coder/mux). فقط چرخهٔ حیات آن مدیریت میشود — مقصد مسیریابی نیست (هیچ پراکسی LLM انجام نمیدهد). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | بکاند رلهٔ دروازهٔ هوش مصنوعی Go. هنگام اجرا، بهطور خودکار توسط مسیر رله (`/v1/relay/`) انتخاب میشود | -| **Dario** | `@askalf/dario` | 3456 | پراکسی اشتراک Claude — جایگزین/پشتیبان CLIProxyAPI برای ترافیک با ساختار Claude-Code؛ کلید تزریقشده به `DARIO_ADMIN_TOKEN` تبدیل میشود و دسترسی به صفحهٔ کنترل OAuth در `/admin/*` را محدود میکند | +| سرویس | بسته npm | پورت پیشفرض | هدف | +| --------------- | ------------------------------------------- | :---------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | مسیریاب هوش مصنوعی که OmniRoute میتواند از آن بهعنوان یک ارائهدهنده فرعی استفاده کند. مدلها بهصورت `9router/{sub}/{model}` ارائه میشوند | +| **CLIProxyAPI** | فایل اجرایی منتشرشده در GitHub (`cliproxy`) | 8317 | آداپتور پراکسی محلی برای جریانهای احراز هویت Anthropic CLI. هنگامی که توکنهای OAuth منقضی میشوند، مسیریابی جایگزین را فراهم میکند | +| **Mux** | `mux` (`mux server` بدون رابط گرافیکی) | 8322 | دیمن محلی هماهنگسازی عاملها (coder/mux). فقط چرخه عمر آن مدیریت میشود — هدف مسیریابی نیست (هیچ پراکسی LLM انجام نمیدهد). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | بکاند رله دروازه هوش مصنوعی مبتنی بر Go. هنگام اجرا، بهطور خودکار توسط مسیر رله (`/v1/relay/`) انتخاب میشود | +| **Dario** | `@askalf/dario` | 3456 | پراکسی اشتراک Claude — جایگزین/پشتیبان CLIProxyAPI برای ترافیک با ساختار Claude Code؛ کلید تزریقشده به `DARIO_ADMIN_TOKEN` تبدیل میشود و دسترسی به صفحه کنترل OAuth در `/admin/*` را محدود میکند | +| **open-wa** | `@open-wa/wa-automate` | 8323 | خودکارسازی WhatsApp Web (Chromium بدون رابط گرافیکی از طریق Puppeteer). فقط چرخه عمر آن مدیریت میشود — هدف مسیریابی نیست. | -هر پنج سرویس از یک مدل نظارتی مشترک پیروی میکنند: +هر شش سرویس از مدل نظارتی یکسانی پیروی میکنند: - OmniRoute آنها را در `DATA_DIR/services/{name}/` نصب میکند (جدا از `package.json` خود OmniRoute) -- OmniRoute آنها را بهعنوان فرایندهای فرزند اجرا و پایش میکند -- OmniRoute یک کلید API موقت را به محیط فرایند فرزند تزریق میکند و آن را بدون توقف سرویس میچرخاند (در موارد قابلاعمال) -- همهٔ مسیرهای مدیریتی (`/api/services/*`) **LOCAL_ONLY** هستند — فقط از loopback قابلدسترسیاند (قانون قطعی شمارهٔ ۱۷) +- OmniRoute آنها را بهعنوان فرایندهای فرزند راهاندازی و پایش میکند +- OmniRoute یک کلید API موقت را به محیط فرایند فرزند تزریق میکند و آن را بدون قطعی میچرخاند (در موارد قابلاعمال) +- همه مسیرهای مدیریتی (`/api/services/*`) **LOCAL_ONLY** هستند — فقط از طریق loopback قابلدسترسیاند (قانون قطعی شماره 17) -### تصمیمهای کلیدی (برگرفته از طرح طراحی) +### تصمیمهای کلیدی (از طرح طراحی) -| تصمیم | مقدار | -| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | -| دسترسی داشبورد به رابط کاربری بومی 9Router | پراکسی معکوس در `/dashboard/providers/services/9router/embed/*` | -| سازوکار نصب | `npm install {package}` از طریق `execFile` (بدون درونیابی پوسته) | -| حالت استفاده | ارائهدهنده بهشکل `9router/{sub}/{model}` در موتور مسیریابی ثبت میشود | -| مدیریت کلید API | OmniRoute آن را تولید میکند، در حالت ذخیرهشده رمزنگاری میکند (AES-256-GCM) و از طریق متغیر محیطی تزریق میکند | -| محل داشبورد | `/dashboard/providers/services` (سه زبانه) | -| شروع خودکار | کلید تغییر وضعیت برای هر سرویس، بهطور پیشفرض خاموش | +| تصمیم | مقدار | +| ----------------------------------- | ---------------------------------------------------------------------------------------- | +| دسترسی داشبورد به رابط بومی 9Router | پراکسی معکوس در `/dashboard/providers/services/9router/embed/*` | +| سازوکار نصب | `npm install {package}` از طریق `execFile` (بدون درونیابی پوسته) | +| حالت استفاده | ارائهدهنده با نام `9router/{sub}/{model}` در موتور مسیریابی ثبت میشود | +| مدیریت کلید API | OmniRoute آن را تولید، در حالت ذخیرهشده رمزگذاری (AES-256-GCM) و از طریق env تزریق میکند | +| محل داشبورد | `/dashboard/providers/services` (سه زبانه) | +| شروع خودکار | کلید تغییر وضعیت برای هر سرویس، بهطور پیشفرض خاموش | --- -## 2. معماری — 4 لایه +## 2. معماری — ۴ لایه ``` ┌────────────────────────────────────────────────────────────────────┐ -│ لایه 1 — رابط کاربری │ +│ لایه ۱ — رابط کاربری │ │ /dashboard/providers/services (زبانهها: CLIProxyAPI | 9Router | Mux)│ │ گزارشهای زنده (SSE)، شروع/توقف/راهاندازی مجدد/بهروزرسانی، تنظیمات، نصب│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx پوسته + مسیریابی زبانه با ?tab= │ -│ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ +│ ├── tabs/ CliproxyServiceTab، NinerouterServiceTab،│ │ │ MuxServiceTab │ -│ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ -│ ServiceLogsPanel, ApiKeyCard, ... │ +│ └── components/ ServiceStatusCard، ServiceLifecycleButtons،│ +│ ServiceLogsPanel، ApiKeyCard، ... │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP (فراخوانی Next.js با fetch) + │ HTTP ‏(fetch در Next.js) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ لایه 2 — API (LOCAL_ONLY — فقط loopback) │ +│ لایه ۲ — API ‏(LOCAL_ONLY — فقط loopback) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -87,39 +88,39 @@ │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (پراکسی معکوس HTTP + WebSocket ← بالادست 9Router) │ +│ (پراکسی معکوس HTTP + WebSocket ← سرویس بالادستی 9Router) │ │ │ │ دروازه: LOCAL_ONLY_API_PREFIXES شامل "/api/services/" و │ -│ "/dashboard/providers/services/*/embed/" است │ +│ "/dashboard/providers/services/*/embed/" است │ └──────────────────────┬─────────────────────────────────────────────┘ - │ فراخوانیهای درونپردازهای + │ فراخوانیهای درونپردازشی ┌──────────────────────▼─────────────────────────────────────────────┐ -│ لایه 3 — ServiceSupervisor (src/lib/services/) │ +│ لایه ۳ — ServiceSupervisor ‏(src/lib/services/) │ │ │ │ ServiceSupervisor.ts ناظر عمومی (child_process.spawn) │ │ ├── نصب: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── شروع: spawn(node, [entrypoint], {env, cwd}) │ │ ├── کلید API: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── پورت: 20130 برای 9Router (قابل پیکربندی) │ -│ ├── گزارشها: بافر حلقوی stdio با ظرفیت 5 MB → رویدادهای SSE │ -│ ├── سلامت: HTTP GET /health هر 2–5 ثانیه، بازیابی تنبل │ -│ └── چرخه حیات: SIGTERM بهمدت 15 ثانیه → SIGKILL │ +│ ├── گزارشها: بافر حلقوی stdio با حجم 5 MB ← رویدادهای SSE │ +│ ├── سلامت: HTTP GET /health هر ۲ تا ۵ ثانیه، بازیابی تنبل │ +│ └── چرخه حیات: SIGTERM بهمدت ۱۵ ثانیه → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts راهاندازی اولیه همه SERVICES[] هنگام شروع پردازه│ -│ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts GET دورهای /v1/models → جدول service_models │ +│ bootstrap.ts راهاندازی اولیه همه SERVICES[] هنگام شروع پردازش│ +│ apiKey.ts getOrCreateApiKey()، generateServiceApiKey() │ +│ modelSync.ts GET دورهای /v1/models ← جدول service_models │ │ ringBuffer.ts بافر حلقوی گزارشها (5 MB برای هر سرویس) │ -│ healthCheck.ts کاوش سلامت HTTP بهصورت دورهای │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (سازگارکنندههای نصبکننده) │ +│ healthCheck.ts بررسی دورهای سلامت HTTP │ +│ installers/ ninerouter.ts، cliproxy.ts، mux.ts، openwa.ts │ +│ (آداپتورهای نصبکننده) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP سازگار با OpenAI (loopback) + │ HTTP سازگار با OpenAI ‏(loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ لایه 4 — ارائهدهنده / مسیریابی │ +│ لایه ۴ — ارائهدهنده / مسیریابی │ │ │ │ open-sse/executors/ninerouter.ts │ -│ پورت و کلید API را برای هر درخواست دوباره جستوجو میکند (بدون کش).│ +│ پورت و کلید API را برای هر درخواست دوباره واکشی میکند (بدون کش).│ │ پیشوند "9router/" را پیش از پراکسیکردن از شناسه مدل حذف میکند.│ │ اگر ناظر در وضعیت "running" نباشد، 503 service_not_running را برمیگرداند.│ │ │ @@ -127,13 +128,12 @@ │ ورودی مربوط به "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ مدلها بهشکل "9router/{sub}/{model}" ذخیره میشوند (با پیشوند).│ -│ هر 5 دقیقه توسط modelSync.ts همگامسازی میشوند. │ +│ مدلها بهصورت "9router/{sub}/{model}" ذخیره میشوند (با پیشوند).│ +│ هر ۵ دقیقه توسط modelSync.ts همگامسازی میشوند. │ │ │ -│ Mux فقط از نظر چرخه حیات مدیریت میشود (لایههای 1 تا 3) — این یک │ -│ دیمن هماهنگسازی عاملها است، نه یک پراکسی LLM؛ بنابراین هیچ │ -│ اجراکننده/ورودی ارائهدهندهای در لایه 4 ندارد و هرگز مقصد │ -│ مسیریابی نیست. │ +│ Mux فقط از نظر چرخه حیات مدیریت میشود (لایههای ۱ تا ۳) — این یک │ +│ دیمن هماهنگسازی عاملهاست، نه یک پراکسی LLM؛ بنابراین هیچ ورودی │ +│ executor/provider در لایه ۴ ندارد و هرگز هدف مسیریابی نیست. │ └────────────────────────────────────────────────────────────────────┘ ``` @@ -142,15 +142,16 @@ | فایل | نقش | | ------------------------------------------- | ------------------------------------------------------ | | `src/lib/services/ServiceSupervisor.ts` | کلاس اصلی: چرخهٔ حیات، قفل، سلامت، بافر حلقوی | -| `src/lib/services/bootstrap.ts` | ثبت در سطح فرایند و شروع خودکار | -| `src/lib/services/registry.ts` | نگاشت تکنمونهای `tool → supervisor` | +| `src/lib/services/bootstrap.ts` | ثبت در سطح فرایند و راهاندازی خودکار | +| `src/lib/services/registry.ts` | نگاشت تکنمونهٔ `ابزار → سرپرست` | | `src/lib/services/apiKey.ts` | تولید کلید، رمزنگاری AES-256-GCM برای دادههای ذخیرهشده | | `src/lib/services/modelSync.ts` | همگامسازی دورهای مدل (۵ دقیقه) + در صورت درخواست | | `src/lib/services/ringBuffer.ts` | بافر حلقوی گزارش ۵ مگابایتی با اشتراک SSE | -| `src/lib/services/healthCheck.ts` | بررسی سلامت HTTP (با فاصلهٔ زمانی قابل تنظیم) | +| `src/lib/services/healthCheck.ts` | کاوش سلامت HTTP (با فاصلهٔ زمانی قابل پیکربندی) | | `src/lib/services/installers/ninerouter.ts` | نصب/بهروزرسانی/حذف 9Router با npm | | `src/lib/services/installers/cliproxy.ts` | نصب/بهروزرسانی/حذف CLIProxyAPI با npm | | `src/lib/services/installers/mux.ts` | نصب/بهروزرسانی/حذف Mux با npm | +| `src/lib/services/installers/openwa.ts` | نصب/بهروزرسانی/حذف open-wa با npm | | `src/app/api/services/9router/_lib.ts` | تابع کمکی `getOrInitSupervisor()` | | `src/app/api/services/[name]/logs/route.ts` | نقطهٔ پایانی مشترک گزارشهای SSE | | `open-sse/executors/ninerouter.ts` | اجراکنندهٔ ارائهدهنده (لایهٔ ۴) | @@ -209,14 +210,14 @@ ## 4. مرجع API -تمام مسیرهای زیرمجموعهٔ `/api/services/` **LOCAL_ONLY** هستند (فقط loopback، قانون قطعی شمارهٔ 17). -درخواستهای غیرـloopback، صرفنظر از توکن احراز هویت، پاسخ `403 LOCAL_ONLY` دریافت میکنند. +تمام مسیرهای زیرمجموعهٔ `/api/services/` **LOCAL_ONLY** هستند (فقط loopback، قانون قطعی #17). +درخواستهای غیر-loopback، صرفنظر از توکن احراز هویت، پاسخ `403 LOCAL_ONLY` دریافت میکنند. ### 4.1 نقاط پایانی 9Router (11 مسیر) #### `POST /api/services/9router/install` -9Router را از npm نصب میکند. مسیر `DATA_DIR/services/9router/` را همراه با +9Router را از npm نصب میکند. مسیر `DATA_DIR/services/9router/` را با `package.json` و `node_modules/` اختصاصی آن ایجاد میکند. با وابستگیهای خود OmniRoute تداخلی ندارد. **بدنهٔ درخواست** (همه اختیاری): @@ -225,28 +226,28 @@ { "version": "latest" } ``` -| فیلد | نوع | پیشفرض | توضیحات | -| --------- | -------- | ---------- | ---------------------------------- | -| `version` | `string` | `"latest"` | برچسب نسخهٔ npm یا semver برای نصب | +| فیلد | نوع | پیشفرض | توضیحات | +| --------- | -------- | ---------- | ------------------------------- | +| `version` | `string` | `"latest"` | تگ نسخهٔ npm یا semver برای نصب | **پاسخها:** -| وضعیت | توضیحات | -| ----- | ----------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | بدنهٔ درخواست نامعتبر (شکست اعتبارسنجی Zod) | -| `409` | نصب از قبل در حال انجام است (قفل در اختیار است) | -| `500` | نصب npm ناموفق بود — برای خطای قابلفهم، `message` را ببینید | +| وضعیت | توضیحات | +| ----- | --------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | بدنهٔ درخواست نامعتبر (خطای اعتبارسنجی Zod) | +| `409` | نصب از قبل در حال انجام است (قفل در اختیار است) | +| `500` | نصب npm ناموفق بود — برای خطای قابلفهم به `message` مراجعه کنید | -**نکات:** از `execFile('npm', [...])` استفاده میکند — بدون shell و بدون درونیابی (قانون قطعی شمارهٔ 13). -خطاهای EACCES بهصورت پیامهای قابلفهم ارائه میشوند. +**یادداشتها:** از `execFile('npm', [...])` استفاده میکند — بدون shell و بدون درونیابی (قانون قطعی #13). +خطاهای EACCES بهصورت پیامهای قابلفهم نمایش داده میشوند. --- #### `POST /api/services/9router/start` -9Router را راهاندازی میکند. اگر سرپرستی از قبل ثبت نشده باشد، آن را ثبت میکند و سپس -`supervisor.start()` را فراخوانی میکند. اگر سرویس از قبل در حال اجرا باشد، عملیات همتوان است. +9Router را راهاندازی میکند. اگر supervisor از قبل ثبت نشده باشد، آن را ثبت میکند و سپس +`supervisor.start()` را فراخوانی میکند. اگر سرویس از قبل در حال اجرا باشد، این عملیات idempotent است. **بدنهٔ درخواست:** ندارد @@ -256,7 +257,7 @@ | ----- | ---------------------------------------------------------- | | `200` | شیء `ServiceStatus` (طرحوارهٔ زیر را ببینید) | | `409` | 9Router نصب نشده است (`status: "not_installed"`) | -| `503` | راهاندازی ناموفق بود (خطای فرایند — `lastError` را ببینید) | +| `503` | راهاندازی ناموفق بود (خطای پردازش — `lastError` را ببینید) | **طرحوارهٔ ServiceStatus:** @@ -276,8 +277,8 @@ #### `POST /api/services/9router/stop` -9Router را بهصورت کنترلشده متوقف میکند. SIGTERM را ارسال میکند، 15 ثانیه منتظر میماند و اگر -فرایند همچنان زنده باشد، SIGKILL را ارسال میکند. اگر سرویس از قبل متوقف باشد، عملیات همتوان است. +9Router را بهصورت امن متوقف میکند. SIGTERM را ارسال میکند، 15 ثانیه منتظر میماند و اگر پردازش همچنان فعال باشد، SIGKILL را ارسال میکند. +اگر سرویس از قبل متوقف شده باشد، این عملیات idempotent است. **بدنهٔ درخواست:** ندارد @@ -296,14 +297,14 @@ **بدنهٔ درخواست:** ندارد -**پاسخها:** همانند `start` است (`ServiceStatus` نهایی را برمیگرداند). +**پاسخها:** مشابه `start` است (`ServiceStatus` نهایی را بازمیگرداند). --- #### `POST /api/services/9router/update` -9Router را به نسخهٔ جدیدتر npm بهروزرسانی میکند. اگر سرویس در حال اجرا باشد، ابتدا -متوقف میشود، سپس نصب npm اجرا میشود (نسخهٔ جدیدتر را در همان محل نصب میکند) و در پایان +9Router را به نسخهٔ جدیدتر npm بهروزرسانی میکند. اگر سرویس در حال اجرا باشد، ابتدا متوقف میشود، +سپس نصب npm اجرا میشود (نسخهٔ جدیدتر در همان محل نصب میشود) و پس از آن سرویس مجدداً راهاندازی میشود. **بدنهٔ درخواست** (همه اختیاری): @@ -324,8 +325,8 @@ #### `POST /api/services/9router/rotate-key` -یک کلید API جدید برای 9Router ایجاد میکند، آن را در حالت ذخیرهشده رمزگذاری میکند و سرویس را -(در صورت اجرا بودن) مجدداً راهاندازی میکند تا کلید جدید را از محیط خود دریافت کند. کلید قدیمی +یک کلید API جدید برای 9Router تولید میکند، آن را در حالت ذخیرهشده رمزنگاری میکند و سرویس را +(اگر در حال اجرا باشد) مجدداً راهاندازی میکند تا کلید جدید را از محیط خود دریافت کند. کلید قدیمی بلافاصله نامعتبر میشود. **بدنهٔ درخواست:** ندارد @@ -337,21 +338,21 @@ | `200` | `{ keyRotated: true, restarted: boolean }` | | `500` | چرخش کلید ناموفق بود | -**امنیت:** کلید جدید هرگز در پاسخ بازگردانده نمیشود (هیچ اطلاعات اعتباری افشا نمیشود). -این کلید بهصورت رمزگذاریشده (AES-256-GCM) در جدول `version_manager` ذخیره میشود. +**امنیت:** کلید جدید هرگز در پاسخ بازگردانده نمیشود (از نشت اعتبارنامه جلوگیری میشود). +این کلید بهصورت رمزنگاریشده (AES-256-GCM) در جدول `version_manager` ذخیره میشود. --- #### `GET /api/services/9router/status` -وضعیت ترکیبی زنده + پایگاه داده، شامل فرادادهٔ نسخه و پیشنمایش کلید API را برمیگرداند. +وضعیت ترکیبی زنده + DB، شامل فرادادهٔ نسخه و پیشنمایش کلید API را بازمیگرداند. **پاسخها:** -| وضعیت | توضیحات | -| ----- | --------------------------- | -| `200` | طرحوارهٔ زیر را مشاهده کنید | -| `500` | خواندن وضعیت ناموفق بود | +| وضعیت | توضیحات | +| ----- | ----------------------- | +| `200` | طرحوارهٔ زیر را ببینید | +| `500` | خواندن وضعیت ناموفق بود | **طرحوارهٔ پاسخ:** @@ -377,8 +378,8 @@ #### `POST /api/services/9router/auto-start` -پرچم شروع خودکار را تغییر میدهد. هنگامی که `enabled: true` باشد، سرویس در نوبت بعدی -راهاندازی OmniRoute بهطور خودکار شروع میشود (بهشرط آنکه سرویس نصب شده باشد). +پرچم راهاندازی خودکار را تغییر میدهد. وقتی `enabled: true` باشد، دفعهٔ بعد که OmniRoute راهاندازی میشود، +سرویس بهطور خودکار اجرا خواهد شد (بهشرط آنکه سرویس نصب شده باشد). **بدنهٔ درخواست:** @@ -397,22 +398,22 @@ #### `GET /api/services/9router/logs` -جریان SSE از لاگهای زندهٔ بافر حلقوی stdout/stderr متعلق به 9Router. +جریان SSE از لاگهای زندهٔ بافر حلقوی stdout/stderr مربوط به 9Router. **پارامترهای کوئری:** -| پارامتر | نوع | پیشفرض | توضیحات | -| -------- | --------- | ------ | ---------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | تعداد خطوط تاریخی که ابتدا ارسال میشوند (حداکثر 1000) | -| `filter` | `string` | ندارد | فیلتر زیررشتهای بدون حساسیت به بزرگی حروف (بدون regex — ایمن در برابر ReDoS) | +| پارامتر | نوع | پیشفرض | توضیحات | +| -------- | --------- | ------ | ------------------------------------------------------------------------------------ | +| `tail` | `integer` | 200 | تعداد خطوط تاریخی که ابتدا ارسال میشوند (حداکثر 1000) | +| `filter` | `string` | ندارد | فیلتر زیررشتهای بدون حساسیت به بزرگی و کوچکی حروف (بدون regex — ایمن در برابر ReDoS) | **رویدادهای SSE:** -| رویداد | داده | توضیحات | -| ----------- | ----------- | ------------------------------ | -| `snapshot` | `LogLine[]` | دنبالهٔ تاریخی اولیه | -| `log` | `LogLine` | خط لاگ زنده | -| `heartbeat` | `{}` | زندهنگهداشتن اتصال هر 15 ثانیه | +| رویداد | داده | توضیحات | +| ----------- | ----------- | ------------------------------- | +| `snapshot` | `LogLine[]` | بخش انتهایی اولیهٔ لاگ تاریخی | +| `log` | `LogLine` | خط لاگ زنده | +| `heartbeat` | `{}` | زنده نگهداشتن اتصال هر 15 ثانیه | **طرحوارهٔ LogLine:** @@ -426,110 +427,144 @@ **پاسخها:** -| وضعیت | توضیحات | -| ----- | --------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | پارامتر `filter` بیش از حد طولانی است (> 200 نویسه) | -| `404` | سرویس یافت نشد (ناظر ثبت نشده است) | +| وضعیت | توضیحات | +| ----- | ------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | پارامتر `filter` بیشازحد طولانی است (> 200 نویسه) | +| `404` | سرویس پیدا نشد (سرپرست ثبت نشده است) | --- ### 4.2 نقاط پایانی CLIProxyAPI (10 مسیر) -CLIProxyAPI ساختار نقاط پایانی یکسانی با 9Router دارد، بهجز `rotate-key`، و علاوه بر آن -شامل `accounts`، `provider-expose` و `auto-restart-adopted` است. اکنون یک کلید API -اختصاصی صفحهٔ داده را دریافت میکند که هنگام ایجاد فرایند تزریق میشود (`needsApiKey: true` در +CLIProxyAPI همان ساختار نقاط پایانی 9Router را بدون `rotate-key` دارد و +`accounts`، `provider-expose` و `auto-restart-adopted` نیز به آن اضافه شدهاند. اکنون یک +کلید API اختصاصی صفحهٔ داده را دریافت میکند که هنگام ایجاد فرایند تزریق میشود (`needsApiKey: true` در `bootstrap.ts`، برای همگامسازی مدل استفاده میشود)؛ `status` شامل فیلدهای کمتری است. | متد | مسیر | توضیحات | | ------ | ----------------------------------- | ---------------------------------------------- | | `POST` | `/api/services/cliproxy/install` | نصب CLIProxyAPI از npm | -| `POST` | `/api/services/cliproxy/start` | شروع CLIProxyAPI | +| `POST` | `/api/services/cliproxy/start` | راهاندازی CLIProxyAPI | | `POST` | `/api/services/cliproxy/stop` | توقف CLIProxyAPI | | `POST` | `/api/services/cliproxy/restart` | راهاندازی مجدد CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | بهروزرسانی به نسخهٔ جدیدتر | +| `POST` | `/api/services/cliproxy/update` | بهروزرسانی به نسخهای جدیدتر | | `GET` | `/api/services/cliproxy/status` | وضعیت زنده + پایگاه داده (بدون `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | تغییر وضعیت شروع خودکار | +| `POST` | `/api/services/cliproxy/auto-start` | فعال یا غیرفعال کردن شروع خودکار | -نقطهٔ پایانی مشترک `GET /api/services/{name}/logs` (به §4.1 مراجعه کنید) با استفاده از -بخش پویای `[name]` برای هر چهار سرویس کار میکند. +نقطهٔ پایانی مشترک `GET /api/services/{name}/logs` (به §4.1 مراجعه کنید) برای هر +چهار سرویس با استفاده از بخش پویای `[name]` کار میکند. --- ### 4.3 نقاط پایانی Mux (8 مسیر) -Mux ساختار نقاط پایانی یکسانی با CLIProxyAPI دارد — هیچ مسیر `rotate-key` در سطح API -وجود ندارد (توکن bearer به همان روش 9Router و از طریق -`getOrCreateApiKey("mux")` ایجاد و با متغیر محیطی `MUX_SERVER_AUTH_TOKEN` تزریق میشود، اما +Mux همان ساختار نقاط پایانی CLIProxyAPI را دارد — در سطح API هیچ مسیر `rotate-key` +وجود ندارد (توکن حامل به همان روش 9Router و از طریق +`getOrCreateApiKey("mux")` تولید و با متغیر محیطی `MUX_SERVER_AUTH_TOKEN` تزریق میشود، اما هنوز نقطهٔ پایانی اختصاصی برای چرخش آن وجود ندارد). Mux فقط از نظر چرخهٔ عمر مدیریت میشود: -برخلاف 9Router، هیچ اجراکنندهٔ لایهٔ 4 ندارد و هرگز بهعنوان ارائهدهندهٔ مسیریابی ثبت نمیشود. +برخلاف 9Router، اجراکنندهٔ لایهٔ 4 ندارد و هرگز بهعنوان ارائهدهندهٔ مسیریابی ثبت نمیشود. -| متد | مسیر | توضیحات | -| ------ | ------------------------------ | ------------------------------ | -| `POST` | `/api/services/mux/install` | نصب Mux از npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | شروع Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | توقف Mux | -| `POST` | `/api/services/mux/restart` | راهاندازی مجدد Mux | -| `POST` | `/api/services/mux/update` | بهروزرسانی به نسخهٔ جدیدتر npm | -| `GET` | `/api/services/mux/status` | وضعیت زنده + پایگاه داده | -| `POST` | `/api/services/mux/auto-start` | تغییر وضعیت شروع خودکار | +| متد | مسیر | توضیحات | +| ------ | ------------------------------ | -------------------------------- | +| `POST` | `/api/services/mux/install` | نصب Mux از npm (`npm i mux`) | +| `POST` | `/api/services/mux/start` | راهاندازی Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | توقف Mux | +| `POST` | `/api/services/mux/restart` | راهاندازی مجدد Mux | +| `POST` | `/api/services/mux/update` | بهروزرسانی به نسخهٔ جدیدتر npm | +| `GET` | `/api/services/mux/status` | وضعیت زنده + پایگاه داده | +| `POST` | `/api/services/mux/auto-start` | فعال یا غیرفعال کردن شروع خودکار | --- ### 4.4 نقاط پایانی Bifrost (8 مسیر) -Bifrost یک بکاند رلهٔ دروازهٔ هوش مصنوعی نوشتهشده با Go است (`@maximhq/bifrost`). این سرویس از همان -ساختار نقاط پایانی CLIProxyAPI استفاده میکند (بدون `rotate-key` — Bifrost کلیدهای ارائهدهندهٔ خود را -در `config.json` و زیر `-app-dir` مدیریت میکند). +Bifrost یک بکاند رلهٔ درگاه هوش مصنوعی مبتنی بر Go است (`@maximhq/bifrost`). این سرویس از همان +ساختار نقاط پایانی CLIProxyAPI استفاده میکند (بدون `rotate-key` — Bifrost کلیدهای ارائهدهندگان +خود را در `config.json` و زیر `-app-dir` مدیریت میکند). -| متد | مسیر | توضیحات | -| ------ | ---------------------------------- | ----------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | نصب Bifrost از npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | راهاندازی Bifrost روی پورت 8080 (پیشفرض) | -| `POST` | `/api/services/bifrost/stop` | توقف Bifrost | -| `POST` | `/api/services/bifrost/restart` | راهاندازی مجدد Bifrost | -| `POST` | `/api/services/bifrost/update` | بهروزرسانی به نسخه جدیدتر | -| `GET` | `/api/services/bifrost/status` | وضعیت زنده + پایگاه داده | -| `POST` | `/api/services/bifrost/auto-start` | فعال یا غیرفعال کردن شروع خودکار | -| `GET` | `/api/services/bifrost/logs` | دنباله زنده گزارشهای SSE (از طریق مسیر پویای مشترک `[name]/logs`) | +| متد | مسیر | توضیحات | +| ------ | ---------------------------------- | ------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | نصب Bifrost از npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | راهاندازی Bifrost روی پورت 8080 (پیشفرض) | +| `POST` | `/api/services/bifrost/stop` | توقف Bifrost | +| `POST` | `/api/services/bifrost/restart` | راهاندازی مجدد Bifrost | +| `POST` | `/api/services/bifrost/update` | بهروزرسانی به نسخهای جدیدتر | +| `GET` | `/api/services/bifrost/status` | وضعیت زنده + پایگاه داده | +| `POST` | `/api/services/bifrost/auto-start` | فعال یا غیرفعال کردن شروع خودکار | +| `GET` | `/api/services/bifrost/logs` | دنبالهٔ زندهٔ گزارش با SSE (از طریق مسیر پویای مشترک `[name]/logs`) | -**پیکربندی مسیریابی:** وقتی `BIFROST_BASE_URL` تنظیم نشده باشد و نمونه تحت نظارت Bifrost -در حال اجرا باشد، `getBifrostRoutingConfig()` (در `routingBackend.ts`) بهطور خودکار از -`http://127.0.0.1:{port}` بهعنوان URL پایه رله استفاده میکند. متغیر محیطی صریح `BIFROST_BASE_URL` -همیشه اولویت دارد. +**اتصال مسیریابی:** وقتی `BIFROST_BASE_URL` تنظیم نشده باشد و نمونهٔ Bifrost تحت نظارت +در حال اجرا باشد، `getBifrostRoutingConfig()` (در `routingBackend.ts`) بهطور خودکار +از `http://127.0.0.1:{port}` بهعنوان URL پایهٔ رله استفاده میکند. متغیر محیطی صریح +`BIFROST_BASE_URL` همیشه اولویت دارد. --- -### 4.5 نقاط پایانی Dario (۱۲ مسیر) +### 4.5 نقاط پایانی Dario (12 مسیر) + +همان ساختار چرخهٔ عمر سایر سرویسها (`install`، `start`، `stop`، `restart`، +`update`، `status`، `auto-start`، `auto-restart-adopted`) را دارد، بهعلاوهٔ یک +صفحهٔ کنترل OAuth محافظتشده با توکن در زیر `admin/`:‏ `admin/accounts`، `admin/import-from-omniroute`، +`admin/login-start`، `admin/login-complete` (همگی پشت `DARIO_ADMIN_TOKEN`). + +### 4.6 نقاط پایانی open-wa (7 مسیر) + +open-wa (`@open-wa/wa-automate`) یک نمونهٔ بدون رابط گرافیکی Chromium را (از طریق +Puppeteer) برای خودکارسازی WhatsApp Web کنترل میکند. این سرویس همان ساختار نقاط پایانی Mux را دارد (هنوز +مسیر `rotate-key` ندارد). این سرویس فقط از نظر چرخهٔ عمر مدیریت میشود — هدف مسیریابی نیست و +هیچ ورودی اجراکننده/ارائهدهندهٔ لایهٔ 4 ندارد. -دارای همان ساختار چرخه عمر سایر سرویسها (`install`، `start`، `stop`، `restart`، -`update`، `status`، `auto-start`، `auto-restart-adopted`) بهعلاوه یک صفحه کنترل OAuth -محافظتشده با توکن در زیر `admin/`: شامل `admin/accounts`، `admin/import-from-omniroute`، -`admin/login-start`، `admin/login-complete` (همگی تحت محافظت `DARIO_ADMIN_TOKEN`). +| متد | مسیر | توضیحات | +| ------ | --------------------------------- | ------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | نصب open-wa از npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | راهاندازی open-wa روی پورت 8323 (پیشفرض) | +| `POST` | `/api/services/openwa/stop` | توقف open-wa | +| `POST` | `/api/services/openwa/restart` | راهاندازی مجدد open-wa | +| `POST` | `/api/services/openwa/update` | بهروزرسانی به نسخه جدیدتر | +| `GET` | `/api/services/openwa/status` | وضعیت زنده + پایگاه داده | +| `POST` | `/api/services/openwa/auto-start` | فعال یا غیرفعالکردن راهاندازی خودکار | +| `GET` | `/api/services/openwa/logs` | دنباله زنده گزارشها با SSE (از طریق مسیر پویای مشترک `[name]/logs`) | + +**کلید API:** بهصورت `WA_KEY` تزریق میشود — بازنویسی عمومی متغیرهای محیطی open-wa با پیشوند `WA_*`، آن را به گزینه CLI یعنی `--key`/`-k` نگاشت میکند +(`dist/cli/setup.js::envArgs()`، با بسته نصبشده نسخه 4.76.0 +تأیید شده است). هنگام تولید توسط `generateServiceApiKey()`، پیشوند `ow_` به آن +اضافه میشود. open-wa کلید را از هدر HTTP با نام `key`/`api_key` میخواند (نه +`Authorization: Bearer`)؛ مسیر `/api-docs*` صراحتاً از این بررسی معاف شده است +(`setupAuthenticationLayer` در `dist/cli/server.js`)، بنابراین پروب سلامت +به هدر احراز هویت نیاز ندارد. + +**جفتسازی:** open-wa غیررسمی است و هیچ وابستگیای به WhatsApp ندارد — شماره +متصلشده بهدلیل سامانه تشخیص خودکارسازی خود WhatsApp با خطر مسدودشدن مواجه است. +در اولین راهاندازی، کد QR جفتسازی در stdout چاپ میشود و از طریق +پنل موجود Logs/جریان SSE نمایش داده میشود — در حال حاضر، هیچ نقطه پایانی +اختصاصی برای تصویر QR در این یکپارچهسازی وجود ندارد. + +--- -### 4.6 پراکسی معکوس (تعبیه داشبورد 9Router) +### 4.7 پروکسی معکوس (تعبیه داشبورد 9Router) -داشبورد، رابط وب 9Router را از طریق یک پراکسی معکوس داخلی درون iframe +داشبورد، رابط وب 9Router را از طریق یک پروکسی معکوس داخلی درون iframe تعبیه میکند: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] ``` -این پراکسی: +این پروکسی: -- درخواست را به `http://127.0.0.1:{port}/{path}` هدایت میکند (فقط loopback) -- هدرهای ورودی `cookie` و `authorization` را حذف میکند (بدون نشت نشست OmniRoute) -- برای احراز هویت 9Router، `Authorization: Bearer {apiKey}` را تزریق میکند -- موارد `set-cookie`، `content-security-policy`، `x-frame-options` و `cross-origin-*` را از پاسخ حذف میکند -- پاسخهای HTML را برای تزریق `` و نرمالسازی مسیرهای مطلق بازنویسی میکند (`/foo` ← `/dashboard/.../embed/foo`) +- درخواست را به `http://127.0.0.1:{port}/{path}` ارسال میکند (فقط loopback) +- هدرهای ورودی `cookie` و `authorization` را حذف میکند (برای جلوگیری از افشای نشست OmniRoute) +- برای احراز هویت 9Router، هدر `Authorization: Bearer {apiKey}` را تزریق میکند +- هدرهای `set-cookie`، `content-security-policy`، `x-frame-options` و `cross-origin-*` را از پاسخ حذف میکند +- پاسخهای HTML را برای تزریق `` و عادیسازی مسیرهای مطلق بازنویسی میکند (`/foo` → `/dashboard/.../embed/foo`) -ارتقاهای WebSocket برای داشبورد تعبیهشده توسط یک سرور همراه روی +ارتقاهای WebSocket مربوط به داشبورد تعبیهشده، توسط یک سرور همراه روی پورتی اختصاصی مدیریت میشوند (به `src/lib/services/embedWsProxy.ts` مراجعه کنید). -**امنیت:** مسیرهای پراکسی تعبیهشده زیرمجموعه `LOCAL_ONLY_API_PREFIXES` -طبقهبندی شدهاند و فقط از طریق loopback قابل دسترسی هستند. مهاجمی که از طریق یک -تونل Cloudflare/Ngrok به JWT دست یابد، نمیتواند به سرویسهای تعبیهشده پراکسی بزند. +**امنیت:** مسیرهای پروکسی تعبیهشده تحت `LOCAL_ONLY_API_PREFIXES` +طبقهبندی شدهاند و فقط از طریق loopback قابل دسترسی هستند. مهاجمی که از طریق +تونل Cloudflare/Ngrok به یک JWT دست یابد، نمیتواند به سرویسهای تعبیهشده پروکسی بزند. --- diff --git a/docs/i18n/fa/docs/frameworks/MEMORY.md b/docs/i18n/fa/docs/frameworks/MEMORY.md index 1f76cf9ad4db..a1376b19f03a 100644 --- a/docs/i18n/fa/docs/frameworks/MEMORY.md +++ b/docs/i18n/fa/docs/frameworks/MEMORY.md @@ -168,35 +168,36 @@ RRF بهعنوان روشی مؤثر شناخته شده است که به نرم ## افزونهٔ تنظیمات -نه فیلد مربوط به تعبیهسازی و بردار در `MemorySettingsExtended` واقع در -`src/shared/schemas/memory.ts` موجود است و از طریق `src/lib/db/settings.ts` ماندگار میشوند: - -| فیلد | نوع | پیشفرض | توضیحات | -| ------------------------ | -------------------------------------------------- | -------- | ------------------------------------------------------ | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | منبع تعبیهسازی مورد استفاده | -| `embeddingProviderModel` | `string \| null` | `null` | ارائهدهنده/مدل با قالب `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | URL پایهٔ نقطهٔ پایانی سازگار با OpenAI فقط برای حافظه | -| `customModelId` | `string \| null` | `null` | شناسهٔ مدل ارسالشده به نقطهٔ پایانی سفارشی | -| `transformersEnabled` | `boolean` | `false` | فعالسازی اختیاری Transformers.js ‏(MiniLM، حدود 400MB) | -| `staticEnabled` | `boolean` | `false` | فعالسازی اختیاری مدل محلی ایستای potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | فعالسازی مرحلهٔ رتبهبندی مجدد (افزودن +200-500ms/req) | -| `rerankProviderModel` | `string \| null` | `null` | ارائهدهنده/مدل رتبهبندی مجدد با قالب `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | بکاند برداری مورد استفاده | - -این موارد از طریق `GET /PUT /api/settings/memory` (شِمای `MemorySettingsExtendedSchema`) در دسترس قرار میگیرند. - -برای منبع `remote`، حافظه همچنین تنظیمات اختیاری `customBaseUrl` و +نه فیلد تعبیهسازی و برداری در `MemorySettingsExtended` واقع در +`src/shared/schemas/memory.ts` موجود است که از طریق `src/lib/db/settings.ts` ماندگار میشوند: + +| فیلد | نوع | پیشفرض | توضیحات | +| ------------------------ | -------------------------------------------------- | -------- | --------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | منبع تعبیهسازی مورد استفاده | +| `embeddingProviderModel` | `string \| null` | `null` | ارائهدهنده/مدل با قالب `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | URL پایهٔ نقطهٔ پایانی سازگار با OpenAI، فقط برای حافظه | +| `customModelId` | `string \| null` | `null` | شناسهٔ مدل ارسالشده به نقطهٔ پایانی سفارشی | +| `transformersEnabled` | `boolean` | `false` | فعالسازی اختیاری Transformers.js (MiniLM، حدود 400MB) | +| `staticEnabled` | `boolean` | `false` | فعالسازی اختیاری مدل محلی و ایستای potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | فعالسازی مرحلهٔ رتبهبندی مجدد (افزودن +200-500ms به هر درخواست) | +| `rerankProviderModel` | `string \| null` | `null` | ارائهدهنده/مدل رتبهبندی مجدد با قالب `provider/model` | + +`rerankProviderModel` توسط `POST /v1/rerank` تفکیک میشود (که از طریق loopback فراخوانی میشود)، بنابراین هر چیزی را که آن مسیر میپذیرد، قبول میکند: یک مدل ابری منتخب برای رتبهبندی مجدد (`cohere/rerank-v3.5`، `jina-ai/jina-reranker-v3.5`، …) یا یک گرهٔ ارائهدهندهٔ سازگار با OpenAI بهشکل `/` (برای مثال، `skilled-mini/bge-reranker-v2-m3` برای یک سامانهٔ TEI/Infinity). گرههای loopback همیشه واجد شرایط هستند؛ یک گره روی میزبانی دیگر (LAN، Tailscale) علاوه بر این به پرچم قابلیت `RERANK_REMOTE_PROVIDER_NODES` نیاز دارد و باید با خطمشی URL خروجی ارائهدهنده مطابقت داشته باشد — به [پرچمهای قابلیت](../reference/FEATURE_FLAGS.md) مراجعه کنید. انتخابگر داشبورد، ارائهدهندگان منتخب را بههمراه گرههای محلی فهرست میکند؛ هر رشتهٔ معتبر `provider/model` را میتوان مستقیماً از طریق `PUT /api/settings/memory` تنظیم کرد. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | بکاند برداری مورد استفاده | + +این موارد از طریق `GET /PUT /api/settings/memory` (طرحوارهٔ `MemorySettingsExtendedSchema`) در دسترس قرار میگیرند. + +برای منبع `remote`، Memory همچنین تنظیمات اختیاری `customBaseUrl` و `customModelId` را میپذیرد. این دو در کنار هم، یک نقطهٔ پایانی `/embeddings` -سازگار با OpenAI و مدل مربوط به آن را بدون تغییر رجیستری سراسری تعبیهسازی انتخاب -میکنند. نقطهٔ پایانی پیش از استفاده نرمالسازی شده و توسط سیاست URL خروجی -ارائهدهنده بررسی میشود: استفاده از HTTP(S) الزامی است، اعتبارنامههای تعبیهشده -و رشتههای پرسوجو رد میشوند و آدرسهای فرادادهٔ ابری همچنان مسدود میمانند. -مقادیر خالی، ارائهدهندهٔ انتخابشده از رجیستری را حفظ میکنند. خطاهای بازگرداندهشده -به داشبورد پاکسازی میشوند و اعتبارنامههای نقطهٔ پایانی هرگز ثبت نمیشوند. - -> **TODO (D20):** دامنهٔ `global` (اشتراکگذاری حافظهها میان همهٔ کلیدهای API) در -> این نسخه پیادهسازی نشده است. این قابلیت به تغییرات شِما و یک مسیر بازیابی -> سراسری نیاز دارد. آن را جداگانه پیگیری کنید. +سازگار با OpenAI و مدل آن را بدون تغییر رجیستری سراسری تعبیهسازی انتخاب میکنند. نقطهٔ پایانی +پیش از استفاده نرمالسازی میشود و با خطمشی URL خروجی ارائهدهنده بررسی میشود: استفاده از HTTP(S) +الزامی است، اعتبارنامههای جاسازیشده و رشتههای پرسوجو رد میشوند و نشانیهای فرادادهٔ +ابری همچنان مسدود میمانند. مقادیر خالی، ارائهدهندهٔ انتخابشده از رجیستری را حفظ میکنند. خطاهای +بازگرداندهشده به داشبورد پاکسازی میشوند و اعتبارنامههای نقطهٔ پایانی هرگز ثبت نمیشوند. + +> **TODO (D20):** دامنهٔ `global` (اشتراکگذاری حافظهها میان همهٔ کلیدهای API) در این +> نسخه پیادهسازی نشده است. این قابلیت به تغییرات طرحواره و یک مسیر بازیابی سراسری +> نیاز دارد. آن را جداگانه پیگیری کنید. ## لایههای ذخیرهسازی diff --git a/docs/i18n/fa/docs/guides/DOCKER_GUIDE.md b/docs/i18n/fa/docs/guides/DOCKER_GUIDE.md index a90d0e70e7e3..a27ee949bbbb 100644 --- a/docs/i18n/fa/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/fa/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## اجرای سریع +> **میزبانی شخصی تنها با یک دستور؟** به +> [راهنمای میزبانی شخصی](../getting-started/SELF_HOST_GUIDE.md) مراجعه کنید — +> `docker compose -f docker-compose.selfhost.yml up -d` (ایمیج منتشرشده + +> Redis، فقط روی loopback، بدون انتخاب پروفایل). روش اجرای سریع زیر، +> مسیر تککانتینری برای کاربرانی است که Redis را از قبل در جای دیگری اجرا میکنند. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/fa/docs/guides/TROUBLESHOOTING.md b/docs/i18n/fa/docs/guides/TROUBLESHOOTING.md index bd75d6d429f0..4fd8302bb6b6 100644 --- a/docs/i18n/fa/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/fa/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # انتظار محدود و طو ## هشدارهای npm install ‏(ERESOLVE / peer / deprecated) -هنگامی که `npm install -g omniroute` را اجرا میکنید، ممکن است با انبوهی از هشدارها مانند `npm warn ERESOLVE`، اعلانهای وابستگی همتا و پیامهای `deprecated` مواجه شوید. **این موارد مورد انتظار و بیضرر هستند.** اگر در خروجی `added packages` را مشاهده کنید، نصب شما با موفقیت انجام شده است. +هنگامی که `npm install -g omniroute` را اجرا میکنید، ممکن است با انبوهی از هشدارها مانند `npm warn ERESOLVE`، اعلانهای وابستگی همتا و پیامهای `deprecated` مواجه شوید. **این موارد قابل انتظار و بیضرر هستند.** اگر در خروجی عبارت `added packages` را مشاهده کنید، نصب شما با موفقیت انجام شده است. -این هشدارها ناشی از محدودههای قدیمی وابستگی همتا در بستههای شخص ثالثی هستند که OmniRoute کنترلی بر آنها ندارد: +برای پنهان کردن هشدارهای حل وابستگی همتا، از روش نصب پشتیبانیشده توسط OmniRoute استفاده کنید: -1. **`marked-terminal` به `marked >=1 <16` نیاز دارد، اما `marked@18` پیدا شده است** — در عمل بهدرستی کار میکند؛ محدوده همتای بالادستی صرفاً قدیمی است. -2. **`deprecated prebuild-install@7.1.3`** — یک ابزار کمکی انتقالی برای دریافت فایلهای باینری بومی است. از آن برای - نصب اتصال انتقال پینشده `wreq-js` استفاده نمیشود و نشاندهنده ناموفق بودن راهاندازی انتقال - ارائهدهنده وبکوکی نیست. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` فقط اعلانهای `ERESOLVE` و وابستگی همتا را پنهان میکند. اعلانهای منسوخشدگی همچنان نمایش داده میشوند، زیرا از بستههای ثالثِ وابسته میآیند؛ این اعلانها نشاندهنده ناموفق بودن نصب نیستند. + +این هشدارها ناشی از محدودههای قدیمی وابستگی همتا در بستههای ثالثی هستند که OmniRoute کنترلی بر آنها ندارد: + +1. **`marked-terminal` به `marked >=1 <16` نیاز دارد، اما `marked@18` یافت شده است** — در عمل بهدرستی کار میکند؛ محدوده همتای بالادستی صرفاً قدیمی است. +2. **`deprecated prebuild-install@7.1.3`** — یک ابزار کمکی وابسته برای دریافت فایلهای باینری بومی است. از آن برای + نصب اتصال انتقالِ ثابتشده `wreq-js` استفاده نمیشود و نشاندهنده ناموفق بودن + راهاندازی انتقالِ ارائهدهنده web-cookie نیست. -**هیچ اقدامی لازم نیست** — بدون فورک کردن بستههای بالادستی، نمیتوان این هشدارها را بهطور کامل غیرفعال کرد. +**هیچ اقدامی لازم نیست** — بدون فورک کردن بستههای بالادستی، نمیتوان این هشدارها را بهطور کامل پنهان کرد. --- diff --git a/docs/i18n/fa/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/fa/docs/providers/CURSOR-API-KEY-AND-CLI.md index 319072766990..b33e451d52d5 100644 --- a/docs/i18n/fa/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/fa/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,43 +4,43 @@ --- -دو روش برای قرار دادن Cursor پشت OmniRoute بدون نشست IDE: +دو روش برای قرار دادن Cursor پشت OmniRoute بدون نشست IDE وجود دارد: -1. **ارائهدهندهی `cursor-api`** (کارت «Cursor API»، نام مستعار `cua`): یک - ارائهدهنده مبتنی بر کلید API که کلید API کاربر Cursor را نگه میدارد +1. **ارائهدهندهٔ `cursor-api`** (کارت «Cursor API»، نام مستعار `cua`): یک + ارائهدهندهٔ مبتنی بر کلید API که کلید API کاربر Cursor را نگه میدارد (`crsr_…`، تولیدشده در `https://cursor.com/dashboard/api`). سپس هر کلاینت OmniRoute میتواند از طریق `/v1/chat/completions` و با نام - `cursor-api/` یا `cua/` به مدلهای Cursor دسترسی پیدا کند؛ - همراه با لایههای معمول سهمیه، جایگزینی و ثبت گزارش. ارائهدهنده IDE - (`cursor`، نشست OAuth/IDE) بدون تغییر باقی میماند. -2. **عبور مستقیم Cursor CLI**: Cursor CLI (`agent`) را به OmniRoute متصل کنید تا - هر RPC که CLI ارسال میکند با یک کلید API متعلق به OmniRoute احراز هویت شود، - با اعتبارنامهی یک اتصال `cursor-api` به Cursor ارسال گردد و در صفحه Logs - ثبت شود. + `cursor-api/` یا `cua/` به مدلهای Cursor دسترسی پیدا کند و + لایههای معمول سهمیه، جایگزینی و ثبت گزارش نیز اعمال میشوند. ارائهدهندهٔ + IDE (`cursor`، نشست OAuth/IDE) بدون تغییر باقی میماند. +2. **عبور مستقیم Cursor CLI**: Cursor CLI (`agent`) را به OmniRoute متصل کنید + تا هر RPC که CLI ارسال میکند با یک کلید API متعلق به OmniRoute احراز هویت + شود، با اعتبارنامهٔ یک اتصال `cursor-api` به Cursor فرستاده شود و در صفحهٔ + گزارشها ثبت گردد. ## چرا کلید مبادله میشود `api2.cursor.sh` یک کلید خام `crsr_…` را بهعنوان توکن Bearer رد میکند (401). -Cursor CLI ابتدا کلید را با درخواست POST به `/auth/exchange_user_api_key` -ارسال میکند و یک JWT نشست با اعتبار یکساعته دریافت میکند؛ `refreshToken` -برگرداندهشده همان `exp` را دارد، بنابراین تازهسازی بهمعنای مبادلهی مجدد -کلید است. -`open-sse/services/cursorApiKeyAuth.ts` این مبادله را انجام میدهد، برای هر کلید -یک توکن نشست را در حافظه پنهان نگه میدارد، پنج دقیقه پیش از انقضا دوباره آن را -مبادله میکند و هنگامی که Cursor پاسخ 401 میدهد، توکن ذخیرهشده را حذف میکند. +Cursor CLI ابتدا کلید را با POST به `/auth/exchange_user_api_key` ارسال میکند +و یک JWT نشست دریافت میکند که پس از یک ساعت منقضی میشود؛ `refreshToken` +برگرداندهشده نیز همان `exp` را دارد، بنابراین تازهسازی به معنای مبادلهٔ +مجدد کلید است. +`open-sse/services/cursorApiKeyAuth.ts` این مبادله را انجام میدهد، برای هر +کلید یک توکن نشست را در کش نگه میدارد، پنج دقیقه پیش از انقضا دوباره کلید را +مبادله میکند و هنگامی که Cursor پاسخ 401 میدهد، توکن کششده را حذف میکند. `CursorExecutor` درست پیش از باز کردن جریان بالادستی برای اتصالهای `cursor-api` آن را فراخوانی میکند. -## ارائهدهندهی `cursor-api` +## ارائهدهندهٔ `cursor-api` رجیستری: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`، `authType: "apikey"`، با همان `format`، `baseUrl` و -`models` مربوط به `cursor`). کارت کاتالوگ: +(`cursor_apiProvider`، `authType: "apikey"`، با `format`، `baseUrl` و +`models` یکسان با `cursor`). کارت کاتالوگ: `src/shared/constants/providers/apikey/specialty-media.ts`. نگاشت اجراکننده: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -داشبورد: Providers → Cursor API → Add API key. +داشبورد: ارائهدهندگان → Cursor API → افزودن کلید API. REST: @@ -61,45 +61,58 @@ curl -sS http://localhost:20128/v1/chat/completions \ نکات: -- فهرست مدلها برای `cursor-api` از رجیستری ایستای Cursor گرفته میشود (همان - فهرستی که ارائهدهنده IDE در حالت جایگزین از آن استفاده میکند)؛ نیازی به +- فهرست مدلهای `cursor-api` از رجیستری ایستای Cursor دریافت میشود (همان + فهرستی که ارائهدهندهٔ IDE در حالت جایگزین از آن استفاده میکند)؛ نیازی به نصب `cursor-agent` روی میزبان OmniRoute نیست. -- `POST /api/providers/{id}/refresh-cursor` فقط برای ارائهدهنده IDE با نام - `cursor` است؛ اتصالهای `cursor-api` نشست IDE برای تمدید ندارند. +- `POST /api/providers/{id}/refresh-cursor` فقط برای ارائهدهندهٔ IDE با نام + `cursor` است؛ اتصالهای `cursor-api` هیچ نشست IDEای برای تمدید ندارند. -## عبور مستقیم Cursor CLI +## شناسههای بومی مدل و سطح تلاش + +برای `cursor` / `cu` و `cursor-api` / `cua`، نرمالساز مشترک سطح تلاش Claude +شناسهٔ مدل درخواستی را دستنخورده باقی میگذارد. Cursor میتواند پسوندی مانند +`-low` را بهعنوان بخشی از شناسهٔ واقعی مدل اعلام کند، نه بهعنوان نام مستعار +سطح تلاش در OmniRoute. اجراکنندهٔ Cursor تطابق دقیق با کاتالوگ زنده را حفظ +میکند؛ وقتی تطابقی وجود نداشته باشد، تحلیلگر مدل فعلی آن مدیریت تبدیل پسوند +به پارامتر را بر عهده میگیرد. + +این موضوع نرمالسازی سطح تلاش را برای مسیرهای مستقیم Claude، مسیرهای سازگار +با Claude یا مسیرهای Vertex تغییر نمیدهد. دسترسپذیری همچنان به کاتالوگ و +مجوزهای حساب Cursor انتخابشده بستگی دارد. + +## گذردهی Cursor CLI مسیر: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. پیشوند `/api/cursor-cli/` در -`src/shared/constants/publicApiRoutes.ts` ثبت شده است، زیرا کنترلکننده احراز -هویت مختص خود را اعمال میکند: +`src/shared/constants/publicApiRoutes.ts` ثبت شده است، زیرا کنترلکننده +احراز هویت اختصاصی خود را اعمال میکند: -| مسیر | احراز هویت مورد انتظار از CLI | کاری که OmniRoute انجام میدهد | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `POST /auth/exchange_user_api_key` | `Bearer ` | کلید را اعتبارسنجی میکند، یک JWT یکساعته HS256 صادر میکند (که با `JWT_SECRET` امضا شده است) و آن را برمیگرداند | -| همه مسیرهای دیگر (`/aiserver.v1.*`، `/agent.v1.AgentService/RunSSE`، `/aiserver.v1.BidiService/BidiAppend`، `/v1/traces`، …) | `Bearer ` | صادرکننده/مخاطب/انقضا را بررسی میکند، یک اتصال فعال `cursor-api` را انتخاب میکند، هدر Authorization را با توکن مبادلهشده Cursor جایگزین کرده و پاسخ را بهصورت جریان برمیگرداند | +| مسیر | احراز هویت مورد انتظار از CLI | کاری که OmniRoute انجام میدهد | +| ------------------------------------------------------------------------------------------------------------------------ | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | کلید را اعتبارسنجی میکند، یک JWT از نوع HS256 با اعتبار ۱ ساعت (امضاشده با `JWT_SECRET`) صادر میکند و آن را برمیگرداند | +| هر مسیر دیگر (`/aiserver.v1.*`، `/agent.v1.AgentService/RunSSE`، `/aiserver.v1.BidiService/BidiAppend`، `/v1/traces`، …) | `Bearer ` | صادرکننده/مخاطب/انقضا را تأیید میکند، یک اتصال فعال `cursor-api` را انتخاب میکند، هدر Authorization را با توکن مبادلهشده Cursor جایگزین میکند و پاسخ را بهصورت جریانی بازمیگرداند | -CLI مقدار `exp` را از هر توکنی که دریافت میکند رمزگشایی میکند؛ بنابراین ارائه -یک توکن غیرشفاف باعث میشود پیش از تقریباً هر درخواست، مبادله را دوباره انجام -دهد. JWT صادرشده از این وضعیت جلوگیری میکند. پاسخ 401 از OmniRoute باعث -میشود CLI دوباره مبادله را انجام دهد. +CLI مقدار `exp` را از هر توکنی که دریافت کند رمزگشایی میکند؛ بنابراین، ارائه +یک توکن مات باعث میشود تقریباً پیش از هر درخواست دوباره تبادل انجام دهد؛ JWT +صادرشده از این مسئله جلوگیری میکند. پاسخ 401 از OmniRoute باعث میشود CLI +دوباره تبادل را انجام دهد. ### راهاندازی -1. یک کلید API برای OmniRoute بسازید (Dashboard → API keys) و یک اتصال - `cursor-api` ایجاد کنید. -2. به CLI اعلام کنید برای جریان عامل از HTTP/1.1 استفاده کند. در +1. یک کلید API برای OmniRoute (Dashboard → API keys) و یک اتصال `cursor-api` + ایجاد کنید. +2. به CLI بگویید برای جریان عامل از HTTP/1.1 استفاده کند. در `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - بدون این تنظیم، CLI نوبت عامل را از طریق HTTP/2 و روی یک میزبان عامل که + بدون این تنظیم، CLI نوبت عامل را از طریق HTTP/2 به یک میزبان عامل که جداگانه پیکربندی شده است باز میکند و فقط RPCهای صفحه کنترل از endpoint عبور میکنند. -3. CLI را در مقابل OmniRoute اجرا کنید: +3. CLI را در برابر OmniRoute اجرا کنید: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -107,19 +120,19 @@ CLI مقدار `exp` را از هر توکنی که دریافت میکند رم agent -p --trust "Reply with exactly OK" ``` -هر مرحله در Logs با ارائهدهنده `cursor-api`، نوع درخواست `cursor-cli` و مسیر -`/api/cursor-cli/` ثبت میشود و به کلید API متعلق به OmniRoute و اتصالی -که آن را سرویسدهی کرده است نسبت داده میشود. - -### حالتهای شکست - -| وضعیت | پاسخ به CLI | -| --------------------------------------------------- | ---------------------------------------------- | -| کلید ناشناختهٔ OmniRoute و `REQUIRE_API_KEY=true` | 401 `unauthenticated` هنگام تبادل | -| `REQUIRE_API_KEY=false` | نشست ناشناس (همانند رفتار `/v1/*`) | -| JWT نشست منقضیشده / خارجی / دستکاریشده | 401، CLI دوباره تبادل را انجام میدهد | -| کلید API متعلق به OmniRoute پس از تبادل لغو شده است | 401 در RPC بعدی | -| هیچ اتصال فعالی به `cursor-api` وجود ندارد | 503 `unavailable` | -| Cursor کلید اتصال را رد میکند | 401 `unauthenticated`، نشست ذخیرهشده حذف میشود | -| بالادست در دسترس نیست | 502 `unavailable` (پیام پاکسازیشده) | -| `JWT_SECRET` تنظیم نشده است | 503 هنگام تبادل | +هر گام در Logs با ارائهدهنده `cursor-api`، نوع درخواست `cursor-cli` و مسیر +`/api/cursor-cli/` ثبت میشود و به کلید API مربوط به OmniRoute و اتصالی +که آن را پردازش کرده است نسبت داده میشود. + +### حالتهای خرابی + +| وضعیت | پاسخ به CLI | +| ------------------------------------------------ | ---------------------------------------------- | +| کلید ناشناخته OmniRoute و `REQUIRE_API_KEY=true` | 401 `unauthenticated` هنگام تبادل | +| `REQUIRE_API_KEY=false` | نشست ناشناس (همانند رفتار `/v1/*`) | +| JWT نشست منقضیشده / خارجی / دستکاریشده | 401، CLI دوباره تبادل را انجام میدهد | +| لغو کلید API مربوط به OmniRoute پس از تبادل | 401 در RPC بعدی | +| نبود اتصال فعال `cursor-api` | 503 `unavailable` | +| رد شدن کلید اتصال توسط Cursor | 401 `unauthenticated`، نشست ذخیرهشده حذف میشود | +| در دسترس نبودن بالادست | 502 `unavailable` (پیام پاکسازیشده) | +| تنظیم نبودن `JWT_SECRET` | 503 هنگام تبادل | diff --git a/docs/i18n/fa/docs/reference/API_REFERENCE.md b/docs/i18n/fa/docs/reference/API_REFERENCE.md index df5fecdcd7f1..107af21a54b5 100644 --- a/docs/i18n/fa/docs/reference/API_REFERENCE.md +++ b/docs/i18n/fa/docs/reference/API_REFERENCE.md @@ -428,45 +428,45 @@ GET /api/v1/provider-plugin-manifest --- -## Endpointهای سازگاری - -| متد | مسیر | قالب | -| ---- | ----------------------------------------- | ----------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (ویرایش/inpaint) | -| POST | `/v1/videos/generations` | تولید ویدئو به سبک OpenAI | -| POST | `/v1/music/generations` | تولید موسیقی به سبک OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (بدنه صوتی برمیگرداند) | -| POST | `/v1/rerank` | بازرتبهبندی به سبک Cohere/Voyage | -| POST | `/v1/classify` | دستهبندی Jina (`api.jina.ai`) | -| POST | `/v1/segment` | قطعهبند Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | نام مستعار کاتالوگ OpenAI | -| GET | `/api/v1/vscode/{token}/models` | نام مستعار مدلهای OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | نام مستعار توکندار OpenAI | -| POST | `/api/v1/vscode/{token}/responses` | نام مستعار توکندار OpenAI Responses | -| POST | `/api/v1/vscode/{token}/api/chat` | نام مستعار توکندار Ollama | -| GET | `/api/v1/vscode/{token}/api/tags` | نام مستعار توکندار تگهای Ollama | - -تمام مسیرهای POST از ساختار یکسانی پیروی میکنند: `Bearer your-api-key` بههمراه بدنه JSON اعتبارسنجیشده با Zod (`v1RerankSchema`، `v1ModerationSchema`، `v1AudioSpeechSchema` و غیره؛ به `src/shared/validation/schemas.ts` مراجعه کنید). در صورت شکست اعتبارسنجی schema، پاسخ 4xx برگردانده میشود. - -برای کلاینتهایی که نمیتوانند `Authorization: Bearer ...` را ضمیمه کنند، OmniRoute کلیدهای API را در URL نیز میپذیرد؛ یا از طریق سازگاری query string (`?token=...`، `?apiKey=...`، `?api_key=...`، `?key=...`) یا با استفاده از endpointهای اختصاصی `/api/v1/vscode/{token}/...` که در ادامه مستند شدهاند. +## نقاط پایانی سازگاری + +| متد | مسیر | قالب | +| ---- | ----------------------------------------- | ---------------------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | پاسخهای OpenAI | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | تصاویر OpenAI | +| POST | `/v1/images/edits` | تصاویر OpenAI (ویرایش/دروننگاری) | +| POST | `/v1/videos/generations` | تولید ویدئو به سبک OpenAI | +| POST | `/v1/music/generations` | تولید موسیقی به سبک OpenAI | +| POST | `/v1/audio/transcriptions` | صدای OpenAI (تبدیل گفتار به متن) | +| POST | `/v1/audio/speech` | تبدیل متن به گفتار OpenAI (بدنهٔ صوتی را برمیگرداند) | +| POST | `/v1/rerank` | بازرتبهبندی به سبک Cohere/Voyage | +| POST | `/v1/classify` | طبقهبندی Jina (`api.jina.ai`) | +| POST | `/v1/segment` | قطعهبند Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | تعدیلهای OpenAI | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | نام مستعار کاتالوگ OpenAI | +| GET | `/api/v1/vscode/{token}/models` | نام مستعار مدلهای OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | نام مستعار توکندار OpenAI | +| POST | `/api/v1/vscode/{token}/responses` | نام مستعار توکندار پاسخهای OpenAI | +| POST | `/api/v1/vscode/{token}/api/chat` | نام مستعار توکندار Ollama | +| GET | `/api/v1/vscode/{token}/api/tags` | نام مستعار توکندار برچسبهای Ollama | + +تمام مسیرهای POST از ساختار یکسانی پیروی میکنند: `Bearer your-api-key` بههمراه بدنهٔ JSON اعتبارسنجیشده توسط Zod (`v1RerankSchema`، `v1ModerationSchema`، `v1AudioSpeechSchema` و غیره؛ `src/shared/validation/schemas.ts` را ببینید). در صورت شکست اعتبارسنجی طرحواره، پاسخ 4xx برگردانده میشود. + +برای کلاینتهایی که نمیتوانند `Authorization: Bearer ...` را پیوست کنند، OmniRoute همچنین کلیدهای API را در URL، چه از طریق سازگاری رشتهٔ پرسوجو (`?token=...`، `?apiKey=...`، `?api_key=...`، `?key=...`) و چه از طریق نقاط پایانی اختصاصی `/api/v1/vscode/{token}/...` که در ادامه مستند شدهاند، میپذیرد. ```bash -# بازرتبهبندی +# بازرتبهبندی (ارائهدهندهٔ رجیستری ابری، یا گرهٔ ارائهدهندهٔ سازگار با OpenAI بهشکل "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# دستهبندی Jina (اعتبارنامههای Foundation API) +# طبقهبندی Jina (اعتبارنامههای Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # قطعهبند Jina @@ -475,20 +475,42 @@ POST /v1/segment { "content": "...", "return_chunks": true } # جستوجوی Jina (s.jina.ai؛ نامهای مستعار ارائهدهنده: jina-search، jina-ai، jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# تعدیل محتوا +# تعدیلها POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — بدنه audio/mpeg (یا قالب درخواستی) را برمیگرداند +# تبدیل متن به گفتار — بدنهٔ audio/mpeg (یا قالب درخواستی) را برمیگرداند POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # ویرایش تصویر (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# تولید ویدئو / موسیقی (شناسه مدل با پیشوند ارائهدهنده) +# تولید ویدئو / موسیقی (شناسهٔ مدل با پیشوند ارائهدهنده) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **گرههای ارائهدهندهٔ بازرتبهبندی:** `POST /v1/rerank` همچنین درخواستها را به گرههای ارائهدهندهٔ سازگار با OpenAI +> (oMLX، vLLM، Infinity، TEI در پشت یک دروازه و غیره) که بهشکل `/` آدرسدهی شدهاند، هدایت میکند. گرههای +> loopback (`localhost`، `127.0.0.1`، `172.16.0.0/12`) همیشه واجد شرایط هستند. گرههای روی هر میزبان دیگری +> — یک دستگاه LAN یا همتای Tailscale — تنها زمانی واجد شرایط هستند که اپراتور پرچم قابلیت +> `RERANK_REMOTE_PROVIDER_NODES` را فعال کند **و** URL پایهٔ گره از سیاست URL خروجی ارائهدهنده +> (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) عبور کند؛ +> درخواستها هرگز به میزبانهای فرادادهٔ ابری هدایت نمیشوند. مرحلهٔ بازرتبهبندی موتور حافظه این مسیر را از طریق +> loopback فراخوانی میکند، بنابراین همین قاعده بر `rerankProviderModel` در تنظیمات حافظه حاکم است. +> +> **ساختارهای سرور محلی:** گره ابتدا در `/v1/rerank` و در صورت دریافت 404، در `/rerank` +> (Infinity، TEI) فراخوانی میشود. بدنهٔ بالادستی هم املای Cohere/OpenAI (`documents`، +> `return_documents`) و هم املای TEI (`texts`، `return_text`) را حمل میکند و پاسخ بالادستی +> به پوشش Cohere نرمالسازی میشود: آرایهٔ سادهٔ `[{index, score, text}]` متعلق به TEI، ساختار `{results: [{index, score}]}` +> از دروازههای سبک، و ساختار به سبک Voyage یعنی `{data: [...]}`، همگی بهشکل +> `{results: [{index, relevance_score, document?}]}`، مرتبشده بر اساس امتیاز و محدودشده به `top_n`، به کلاینت بازگردانده میشوند. + +> **کشف گرهٔ ارائهدهنده:** مدلهای روی یک گرهٔ ارائهدهندهٔ سازگار با OpenAI در `GET /v1/models` +> زیر پیشوند گره ظاهر میشوند. ردیفهایی که فاقد فرادادهٔ نقطهٔ پایانی هستند (که برای فهرستهای محلی `/v1/models` معمول است) +> مقدار `apiType` گره را به ارث میبرند؛ بنابراین مدلهای یک گرهٔ `embeddings` دارای `type: "embedding"` و مدلهای +> یک گرهٔ `rerank` دارای `type: "rerank"` هستند، بهجای اینکه بهطور پیشفرض به چت تبدیل شوند؛ یک +> `supportedEndpoints` صریح در ردیفی همگامسازیشده یا افزودهشده بهصورت دستی همچنان اولویت دارد. + ### مسیرهای اختصاصی ارائهدهنده ```bash @@ -497,7 +519,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -اگر پیشوند ارائهدهنده وجود نداشته باشد، بهطور خودکار افزوده میشود. مدلهای ناسازگار پاسخ `400` برمیگردانند. +اگر پیشوند ارائهدهنده وجود نداشته باشد، بهطور خودکار اضافه میشود. مدلهای ناسازگار خطای `400` برمیگردانند. --- diff --git a/docs/i18n/fa/docs/reference/ENVIRONMENT.md b/docs/i18n/fa/docs/reference/ENVIRONMENT.md index 5fed4379a2a1..1025aee90fc4 100644 --- a/docs/i18n/fa/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/fa/docs/reference/ENVIRONMENT.md @@ -77,65 +77,64 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" --- -## 2. ذخیرهسازی و پایگاه داده - -OmniRoute برای تمام دادههای ماندگار از **SQLite** (از طریق `better-sqlite3`) استفاده میکند. این متغیرها محل دادهها، رمزگذاری و چرخهٔ عمر را کنترل میکنند. - -| متغیر | پیشفرض | فایل منبع | توضیحات | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | دایرکتوری ریشه برای پایگاه دادهٔ SQLite، نسخههای پشتیبان و فایلهای داده. برای استفاده از volumeهای Docker یا مسیرهای سفارشی، آن را بازنویسی کنید. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(تنظیمنشده)_ | `src/lib/dataPaths.ts` | راه فرار برای محافظ DATA_DIR در تستها/ارزیابیها (#10428). تستها و کاوشهای eval/print در Node (`-e`/`--eval`/`-p`/`--print`، شامل شکلهای `--eval=`/`--print=`) که `DATA_DIR` ندارند، به یک دایرکتوری موقت دورریختنی هدایت میشوند تا نتوانند پایگاه دادهٔ واقعی اپراتور را باز کنند؛ برای استفادهٔ دوباره از دایرکتوری واقعی، آن را روی `1` تنظیم کنید. | -| `OMNIROUTE_BUILD_SHA` | _(تنظیمنشده)_ | `src/lib/monitoring/buildSha.ts` | Git SHA مربوط به artifact در حال اجرا. توسط `npm run build:release` ثبت میشود؛ در کانتینرهایی که بدون نشانگر `dist/BUILD_SHA` ارائه میشوند، قابل تزریق است. در `/api/monitoring/health` با عنوان `system.buildSha` نمایش داده میشود. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | مرجعی که دروازهٔ منشأ pack-artifact، SHA ساخت را با آن بررسی میکند (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(تنظیمنشده)_ | `scripts/build/buildProvenance.ts` | برای اجازهدادن به بستهبندی ساختی که SHA آن روی خط انتشار نیست، روی `1` تنظیم کنید؛ در این حالت بهجای شکست دروازه، ساخت بهعنوان یک canary عمدی ثبت میشود (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(تنظیمنشده)_ | `scripts/ops/deploy-canary.mjs` | کلید API برای کاوش smoke استقرار canary که بهصورت `Authorization: Bearer` به `/v1/chat/completions` ارسال میشود. فقط توسط اسکریپت استقرار استفاده میشود (#10429)، نه توسط سرور. این متغیر با متغیرهای `OMNIROUTE_SMOKE_*` مربوط به چارچوب smoke اختیاری CLI (`RUN_CLI_SMOKE=1`،‏ `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` در `tests/integration/upstream-cli-smoke.int.test.ts`) ارتباطی ندارد — به [یکپارچهسازیهای CLI ← پیمایش smoke واقعی](../guides/CLI-INTEGRATIONS.md) مراجعه کنید. | -| `OMNIROUTE_BUILDING` | _(تنظیمنشده)_ | `src/lib/buildPhase.ts` | سیگنال مرحلهٔ ساخت (#10060): توسط `scripts/build/build-next-isolated.mjs` روی `1` تنظیم میشود و هر worker ساخت ایجادشده آن را به ارث میبرد؛ در نتیجه، لایهٔ پایگاه داده بهجای بارگذاری افزونهٔ بومی better-sqlite3 (که هنگام خروج، worker را متوقف میکند)، یک stub بدون عملیات برمیگرداند. هرگز برای سرور در حال اجرا تنظیم نمیشود. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | برای ردکردن بررسی اختیاری پیش از ساختِ وابستگیهای بومی در درختهای vendored نامتعارف، روی `1` تنظیم کنید. این کار یک وابستگی مفقود را قابل ساخت نمیکند؛ فقط زمانی استفاده کنید که وابستگیهای بومی خارج از این سازوکار تأمین شده باشند. | -| `OMNIROUTE_DATA_DIR` | _(تنظیمنشده)_ | `open-sse/executors/promptql/threadSticky.ts` | **نام مستعار جایگزین** برای `DATA_DIR` که فقط وقتی `DATA_DIR` تنظیم نشده باشد بررسی میشود. برای یافتن cache نشست thread-sticky روی دیسکِ اجراکنندهٔ PromptQL (`/promptql-thread-sessions.json`) استفاده میشود؛ اگر هیچیک از متغیرها تنظیم نشده باشند، cache فقط در حافظه باقی میماند (و در راهاندازیهای مجدد حفظ نمیشود). | -| `OMNIROUTE_PLUGINS_DIR` | _(تنظیمنشده)_ | `src/lib/plugins/scanner.ts` | دایرکتوریای که **اسکنر plugin زمان اجرا** میخواند — و ریشهای که مدیر plugin در آن نصب میکند — و مقدار پیشفرض مشتقشده از home را بازنویسی میکند (#11827). در Docker/K8s آن را به درخت plugin متصلشده با bind اشاره دهید، بهجای آنکه فقط برای جابهجاکردن مسیر اسکن، HOME را تغییر دهید (HOME تمام رفتارهای دیگر وابسته به home را نیز کنترل میکند). تنظیمنشده = `~/.omniroute/plugins`، یا وقتی فرایند هیچ homeای صادر نمیکند `/tmp/.omniroute/plugins` — این متغیر مشکل شناسایینشدن بیسروصدا را برطرف میکند. دایرکتوری resolveشده یکبار هنگام راهاندازی، همراه با ورودی برنده، با عنوان `scanner.dir_resolved` ثبت میشود. فقط سمت سرور: pluginهای فرمان CLI همچنان از `OMNIROUTE_PLUGIN_PATH` اختصاصی خود استفاده میکنند (بخش 9). | -| `STORAGE_ENCRYPTION_KEY` | _(خالی = غیرفعال)_ | `src/lib/db/encryption.ts` | کلید AES برای رمزگذاری کامل پایگاه داده SQLite در حالت ذخیرهشده. آن را با `openssl rand -hex 32` تولید کنید. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | برچسب نسخه برای کلید رمزگذاری. هنگام چرخش کلید، آن را افزایش دهید تا رمزگشایی نسخههای پشتیبان قدیمی پشتیبانی شود. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | وقتی `true` باشد، از ایجاد نسخههای پشتیبان معمول/پیش از نوشتن فایل SQLite صرفنظر میشود (ذخیره/پاکسازی قیمتگذاری models.dev و نوشتن تنظیمات). نسخههای پشتیبان دستی و پیش از بازیابی همچنان ایجاد میشوند. این گزینه snapshot ایمنی پایدار و اجباری اجراکننده مهاجرت یا محافظ مهاجرت انبوه برای یک DB پایدار موجود را غیرفعال **نمیکند**. ایجاد نسخههای پشتیبان غیردستی به حداکثر یکبار در هر ۶۰ دقیقه محدود میشود. در داشبورد، **تنظیمات ← فضای ذخیرهسازی** میتواند پشتیبانگیری خودکار معمول را بهطور مستقل غیرفعال کند. | -| `OMNIROUTE_CRYPT_KEY` | _(تنظیمنشده)_ | `src/lib/db/encryption.ts` | **نام مستعار قدیمی** برای `STORAGE_ENCRYPTION_KEY`. وقتی متغیر اصلی وجود نداشته باشد، بهعنوان جایگزین پذیرفته میشود. | -| `OMNIROUTE_API_KEY_BASE64` | _(تنظیمنشده)_ | `src/lib/db/encryption.ts` | **نام مستعار قدیمی** (با قالب کدگذاریشده Base64) که بهعنوان جایگزین پذیرفته میشود. پیش از استفاده، بهطور خودکار رمزگشایی میشود. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(تنظیمنشده)_ | `src/lib/db/core.ts` | بازه بررسی دورهای سلامت SQLite (برحسب میلیثانیه) را بازنویسی میکند. وقتی تنظیم نشده باشد، مقادیر پیشفرض از `NODE_ENV` مشتق میشوند. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/walMaintenance.ts` | بازه دورهای `wal_checkpoint(TRUNCATE)` (برحسب میلیثانیه) را بازنویسی میکند. checkpoint خودکار هرگز خود فایل WAL را کوچک نمیکند و یک سرور با اجرای طولانیمدت هرگز DB خود را نمیبندد. `0` آن را غیرفعال میکند. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | بازه پرتکرار `wal_checkpoint(PASSIVE)` (برحسب میلیثانیه) را بازنویسی میکند. فریمهای در انتظار WAL را کم نگه میدارد تا TRUNCATE دورهای هرگز یک صف چندگیگابایتی را در رشته اصلی کپی نکند. `0` آن را غیرفعال میکند. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | وقتی یک تیک PASSIVE تشخیص دهد که فایل WAL از این اندازه بزرگتر است، بهجای انتظار برای تیک کُند، بلافاصله به `wal_checkpoint(TRUNCATE)` ارتقا مییابد. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | آن را روی `1`/`true`/`yes`/`on` تنظیم کنید تا پس از تداوم فشار بحرانی منابع بهمدت `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`، فرایند خارج شود؛ در نتیجه، یک ناظر (systemd با `Restart=always` یا سیاست راهاندازی مجدد Docker) بهجای ارائه نامحدود پاسخهای 503، فرایندی پاک را دوباره اجرا میکند. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | مدتزمانی که فشار بحرانی باید ادامه یابد تا خروج برای راهاندازی مجدد خودکار فعال شود. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(تشخیص خودکار)_ | `src/lib/db/adapters/sqljsAdapter.ts` | مسیر صریح (مطلق یا نسبی نسبت به cwd) به `sql-wasm.wasm` هنگام استفاده از آداپتور جایگزین WASM مربوط به `sql.js`. وقتی تنظیم نشده باشد، از طریق وابستگیهای بسته و چیدمانهای کاندید بهطور خودکار شناسایی میشود. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/core.ts` | بازه دورهای `wal_checkpoint(TRUNCATE)` (برحسب میلیثانیه) را بازنویسی میکند. checkpoint خودکار هرگز خود فایل WAL را کوچک نمیکند و یک سرور با اجرای طولانیمدت هرگز DB خود را نمیبندد. `0` آن را غیرفعال میکند. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | تعداد روزهایی که checkpointها، فایلهای ورودی/خروجی/خطای ارجاعشده و ردیف یک کار Batch API نهاییشده (تکمیلشده/ناموفق/لغوشده/منقضیشده)، پیش از حذف توسط پاکسازی خودکار نگهداری میشوند. این گزینه تنها پس از فعال شدن `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` اثر میگذارد و با بازه نگهداری خروجی Batch API خود OpenAI مطابقت دارد. این گزینه بر مسیر `DELETE /api/v1/batches/delete-completed` که توسط اپراتور اجرا میشود اثری ندارد؛ این مسیر طبق طراحی بدون قیدوشرط باقی میماند (بدون فیلتر سن). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | وقتی `true` باشد، پیمایش پاکسازی خودکار میتواند کارهای پایانیافتهٔ Batch API (و نقاط بررسی آنها) را که از `OMNIROUTE_BATCH_RETENTION_DAYS` گذشتهاند حذف کند و محتوای BLOB فایلهای آپلودشدهای را که از `expires_at` خود عبور کردهاند پاک کند. بهطور پیشفرض غیرفعال است: تا زمانی که یک اپراتور آن را فعال نکند، هر نصب موجود این دادهها را دقیقاً مانند قبل نگه میدارد. همچنین یک پرچم قابلیت قابلویرایش در داشبورد است — بخش Runtime در `docs/reference/FEATURE_FLAGS.md` را ببینید. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | برای رد کردن کامل بررسی سلامت DB هنگام راهاندازی، روی `1` تنظیم کنید. برای وظایف کوتاهمدت و آزمونهای یکپارچهسازی مفید است. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | برای فعالسازی اجباری حلقهٔ بررسی سلامت DB، حتی زمانی که معمولاً رد میشود (برای مثال، در وظایف کوتاهمدت)، روی `1` تنظیم کنید. | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | برای رد کردن آمادهسازی اولیهٔ محیط اجرای بومی در طول `npm install`، روی `1` تنظیم کنید. در نصبهای CI/بدون رابط گرافیکی که sqlite از قبل ساخته شده است، مفید است. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(تشخیص خودکار)_ | `src/lib/db/migrationRunner.ts` | دایرکتوریای را که اجراکنندهٔ مهاجرت اسکن میکند، بازنویسی کنید. هنگام ارائهٔ مهاجرتهای بستهبندیشده در ساختهای سفارشی مفید است. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(تنظیمنشده)_ | `src/lib/db/migrationRunner/extraDirs.ts` | دایرکتوریهای مهاجرت اضافی بهصورت ورودیهای `namespace=dir` که با جداکنندهٔ مسیر پلتفرم از هم جدا شدهاند (برای مثال، `ee=/opt/app/enterprise/db/migrations`). فایلهای یافتشده در آنجا بهشکل `-` ثبت میشوند؛ بنابراین توزیعی که مهاجرتهای خودش را ارائه میکند هرگز با جایگاههای عددی بالادستی تداخل پیدا نمیکند. یک ورودی بدقالب، یک فضای نام نامعتبر یا یک دایرکتوری مفقود، بهجای رد کردن بیصدای طرحواره، هنگام راهاندازی خطا ایجاد میکند. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | آستانهٔ ایمنی برای تعداد زیاد مهاجرتهای در انتظار (#3416). اگر در یک DB موجود بیش از این تعداد مهاجرت در انتظار باشد، راهاندازی متوقف میشود (برای محافظت در برابر پاک شدن جدول ردیابی). برای بازیابی یک نسخهٔ پشتیبان قدیمی، آن را افزایش دهید؛ برای غیرفعال کردن بررسی، روی `0` تنظیم کنید. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | دایرکتوری کاری برای دروازهٔ انتشار `check:install-upgrade`. این فرایند تقریباً به 12 GB فضا نیاز دارد (دو درخت نصب حدوداً 3 GB بهعلاوهٔ فایل tarball)، بنابراین نباید روی یک tmpfs کوچک اجرا شود — در اجراکنندهٔ خودمیزبان، `/tmp` یک tmpfs مبتنی بر RAM با ظرفیت 12 GB است و دروازه تمام فضای آن را مصرف کرد و باعث ناقص شدن بسته شد. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(مقدار پیشفرض در کد)_ | `src/lib/spend/batchWriter.ts` | فاصلهٔ زمانی تخلیه (ms) برای نویسندهٔ دستهای هزینه/مصرف. مقادیر کمتر ادغام نوشتنها را کاهش میدهند؛ مقادیر بیشتر رقابت بر سر DB را کاهش میدهند. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(مقدار پیشفرض در کد)_ | `src/lib/spend/batchWriter.ts` | حداکثر تعداد ورودیهای هزینهٔ بافرشده پیش از تخلیهٔ اجباری. در استقرارهای با QPS بالا آن را افزایش دهید؛ زمانی که محدود نگهداشتن حافظه اهمیت بیشتری دارد، آن را کاهش دهید. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(تنظیمنشده)_ | `open-sse/utils/proxyFetch.ts` | برای انتشار گزارشهای اشکالزدایی `[ProxyFetch]` در مسیر رلهٔ Vercel، روی `"true"` تنظیم کنید. برای جلوگیری از افشای سرنخهای مسیریابی، بهطور پیشفرض غیرفعال است. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | برای درج IPهای کلاینت/خروجی و پیشوند حساب در خط گزارش تفصیلی فرایند `[ProxyEgress]`، روی `"true"` یا `"1"` تنظیم کنید. بهطور پیشفرض خاموش نگه داشته شده است تا گزارش فرایند IPها یا پیشوند حساب را افشا نکند. | -| `OMNIROUTE_DEBUG` | _(تنظیمنشده)_ | `bin/cli/commands/quota.mjs` | برای چاپ اطلاعات عیبیابی زمانبندی هر درخواست (`[omniroute] GET completed in Nms`) از فرمانهای سهمیهٔ CLI در stderr، روی `1` تنظیم کنید. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(خودکار)_ | `scripts/dev/healthcheck.mjs` | مسیر صریحی که بررسی سلامت کانتینر کاوش میکند. اگر تنظیم نشده باشد، کاوشگر آن را از `OMNIROUTE_BASE_PATH` استخراج میکند؛ تنظیم آن، نقطهٔ پایانی نظارت عمیق را دوباره فعال میکند. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(تنظیمنشده)_ | `bin/cli/commands/completion.mjs` | برای انتشار اطلاعات عیبیابی `[omniroute completion]` از مسیرهای کش تکمیل پوستهٔ CLI (خواندن/نوسازی/نوشتن)، روی هر مقدار غیرخالی تنظیم کنید. بهطور پیشفرض غیرفعال است — این کشها بیصدا شکست میخورند تا یک کش مفقود/خراب هرگز تکمیل با کلید Tab را مختل نکند. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ساعت) | `open-sse/services/batchProcessor.ts` | حداکثر بازه تلاش مجدد برای هر یک از آیتمهای دسته (میلیثانیه). آیتمهایی که از این مدت فراتر روند، ناموفق علامتگذاری میشوند. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | تأخیر پایه (میلیثانیه) برای وقفه تصاعدی در تلاشهای مجدد آیتمهای دسته. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ساعت) | `open-sse/services/batchProcessor.ts` | سقف وقفه تصاعدی (میلیثانیه) بین تلاشهای مجدد آیتمهای دسته. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | حداکثر تعداد دستههایی که بهصورت همزمان پردازش میشوند. برای افزایش توان عملیاتی آن را بالا ببرید؛ برای جلوگیری از موج محدودیت نرخ، مقدار آن را پایین نگه دارید. | +## 2. فضای ذخیرهسازی و پایگاه داده + +OmniRoute برای تمام دادههای ماندگار از **SQLite** (از طریق `better-sqlite3`) استفاده میکند. این متغیرها محل دادهها، رمزنگاری و چرخه عمر آنها را کنترل میکنند. + +| متغیر | پیشفرض | فایل منبع | توضیحات | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | دایرکتوری ریشه برای پایگاه داده SQLite، نسخههای پشتیبان و فایلهای داده. برای volumeهای Docker یا مسیرهای سفارشی، آن را بازنویسی کنید. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(تنظیمنشده)_ | `src/lib/dataPaths.ts` | راه فرار برای محافظ `DATA_DIR` در تست/eval ‏(#10428). تستها و کاوشهای eval/print در Node (`-e`/`--eval`/`-p`/`--print`، شامل شکلهای `--eval=`/`--print=`) که `DATA_DIR` ندارند، به یک دایرکتوری موقت یکبارمصرف هدایت میشوند تا نتوانند پایگاه داده واقعی اپراتور را باز کنند؛ برای استفاده مجدد از دایرکتوری واقعی، آن را روی `1` تنظیم کنید. | +| `OMNIROUTE_BUILD_SHA` | _(تنظیمنشده)_ | `src/lib/monitoring/buildSha.ts` | SHA مربوط به Git برای artifact در حال اجرا. توسط `npm run build:release` ثبت میشود؛ در کانتینرهایی که بدون sentinelِ `dist/BUILD_SHA` عرضه میشوند، قابل تزریق است. در `/api/monitoring/health` با نام `system.buildSha` نمایش داده میشود. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | ارجاعی که دروازه منشأ pack-artifact، SHA بیلد را با آن بررسی میکند (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(تنظیمنشده)_ | `scripts/build/buildProvenance.ts` | برای اجازهدادن به بستهبندی بیلدی که SHA آن در خط انتشار نیست، روی `1` تنظیم کنید؛ در این حالت، بهجای شکست دروازه، بیلد بهعنوان یک canary عمدی ثبت میشود (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(تنظیمنشده)_ | `scripts/ops/deploy-canary.mjs` | کلید API برای کاوش smoke مربوط به استقرار canary که در `/v1/chat/completions` بهصورت `Authorization: Bearer` ارسال میشود. فقط توسط اسکریپت استقرار استفاده میشود (#10429)، و هرگز توسط سرور استفاده نمیشود. این متغیر ارتباطی با متغیرهای `OMNIROUTE_SMOKE_*` مربوط به ابزار smoke اختیاری CLI (`RUN_CLI_SMOKE=1`،‏ `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` در `tests/integration/upstream-cli-smoke.int.test.ts`) ندارد — به [یکپارچهسازیهای CLI ← پیمایش smoke واقعی](../guides/CLI-INTEGRATIONS.md) مراجعه کنید. | +| `OMNIROUTE_BUILDING` | _(تنظیمنشده)_ | `src/lib/buildPhase.ts` | سیگنال مرحله بیلد (#10060): توسط `scripts/build/build-next-isolated.mjs` روی `1` تنظیم میشود و هر worker بیلدی که ایجاد میشود آن را به ارث میبرد؛ در نتیجه، لایه پایگاه داده بهجای بارگذاری افزونه بومی better-sqlite3 (که هنگام خروج، worker را متوقف میکند)، یک stub بدون عملیات برمیگرداند. هرگز برای سرور در حال اجرا تنظیم نمیشود. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | برای ردکردن بررسی اختیاری پیش از بیلدِ وابستگیهای بومی در درختهای vendored نامتعارف، روی `1` تنظیم کنید. این کار وابستگی مفقود را قابل بیلد نمیکند؛ فقط زمانی استفاده کنید که وابستگیهای بومی از مسیری خارج از روال معمول تأمین شدهاند. | +| `OMNIROUTE_DATA_DIR` | _(تنظیمنشده)_ | `open-sse/executors/promptql/threadSticky.ts` | **نام مستعار جایگزین** برای `DATA_DIR` که فقط وقتی `DATA_DIR` تنظیم نشده باشد بررسی میشود. برای یافتن cache نشست thread-sticky روی دیسکِ اجراکننده PromptQL (`/promptql-thread-sessions.json`) استفاده میشود؛ اگر هیچیک از متغیرها تنظیم نشده باشند، cache فقط در حافظه باقی میماند (و میان راهاندازیهای مجدد ماندگار نیست). | +| `OMNIROUTE_PLUGINS_DIR` | _(تنظیمنشده)_ | `src/lib/plugins/scanner.ts` | دایرکتوریای که **اسکنر پلاگین زمان اجرا** میخواند — و ریشهای که مدیر پلاگین در آن نصب میکند — و پیشفرض مشتقشده از دایرکتوری خانه را بازنویسی میکند (#11827). در Docker/K8s، بهجای جابهجاکردن HOME صرفاً برای تغییر مسیر اسکن، آن را به درخت پلاگین bind-mountشده اشاره دهید (HOME تمام رفتارهای دیگر وابسته به دایرکتوری خانه را نیز کنترل میکند). تنظیمنشده = `~/.omniroute/plugins`، یا وقتی فرایند هیچ دایرکتوری خانهای صادر نمیکند، `/tmp/.omniroute/plugins` — این متغیر مشکل کشفنشدن بیسروصدا را برطرف میکند. دایرکتوری resolveشده هنگام راهاندازی یکبار با نام `scanner.dir_resolved` و همراه با ورودی برنده در log ثبت میشود. فقط سمت سرور: پلاگینهای فرمان CLI همچنان از `OMNIROUTE_PLUGIN_PATH` مخصوص خود استفاده میکنند (بخش 9). | +| `STORAGE_ENCRYPTION_KEY` | _(خالی = غیرفعال)_ | `src/lib/db/encryption.ts` | کلید AES برای رمزنگاری کامل پایگاه داده SQLite در حالت ذخیرهشده. آن را با `openssl rand -hex 32` تولید کنید. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | برچسب نسخه برای کلید رمزنگاری. هنگام چرخش کلید، آن را افزایش دهید تا رمزگشایی نسخههای پشتیبان قدیمی پشتیبانی شود. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | وقتی `true` باشد، از تهیه نسخههای پشتیبان معمول/پیش از نوشتن فایل SQLite صرفنظر میشود (ذخیره/پاکسازی قیمتگذاری models.dev و نوشتن تنظیمات). نسخههای پشتیبان دستی و پیش از بازیابی همچنان اجرا میشوند. این گزینه، اسنپشات ایمنی پایدار و اجباری اجراکننده مهاجرت یا محافظ مهاجرت انبوه برای یک پایگاه داده ماندگار موجود را غیرفعال **نمیکند**. تهیه نسخههای پشتیبان غیردستی به حداکثر یکبار در هر ۶۰ دقیقه محدود میشود. در داشبورد، **تنظیمات ← فضای ذخیرهسازی** میتواند پشتیبانگیری خودکار معمول را بهطور مستقل غیرفعال کند. | +| `OMNIROUTE_CRYPT_KEY` | _(تنظیمنشده)_ | `src/lib/db/encryption.ts` | **نام مستعار قدیمی** برای `STORAGE_ENCRYPTION_KEY`. در صورت نبود متغیر اصلی، بهعنوان جایگزین پذیرفته میشود. | +| `OMNIROUTE_API_KEY_BASE64` | _(تنظیمنشده)_ | `src/lib/db/encryption.ts` | **نام مستعار قدیمی** (با قالب کدگذاریشده Base64) که بهعنوان جایگزین پذیرفته میشود. پیش از استفاده بهطور خودکار رمزگشایی میشود. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(تنظیمنشده)_ | `src/lib/db/core.ts` | بازه بررسی دورهای سلامت SQLite را بازنویسی میکند (میلیثانیه). وقتی تنظیم نشده باشد، مقادیر پیشفرض از `NODE_ENV` استخراج میشوند. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(حذفشده)_ | `src/lib/db/walMaintenance.ts` | **حذف شده است.** اجرای دورهای `wal_checkpoint(TRUNCATE)` در حالت فعال میتواند نگاشت مشترک wal-index را نامعتبر کند و فرایند را با SIGBUS (#13973) از کار بیندازد؛ بنابراین زمانبند دیگر وجود ندارد. این متغیر بیاثر است: یک مقدار مثبت، هشدار منسوخشدن را یکبار ثبت میکند، درحالیکه مقدار `0` یا تنظیمنشدن آن بدون پیام باقی میماند. WAL با checkpointهای PASSIVE (در زیر) نگهداری میشود و توسط checkpoint هنگام خاموششدن کوتاه میشود. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (۵ دقیقه) | `src/lib/db/walMaintenance.ts` | بازه مکرر `wal_checkpoint(PASSIVE)` را بازنویسی میکند (میلیثانیه). فریمهای معلق WAL را کم نگه میدارد تا checkpointها سریع بمانند و اندازه فایل WAL در فاصله بین کوتاهسازیهای هنگام خاموششدن محدود بماند. `0` آن را غیرفعال میکند. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | وقتی یک نوبت PASSIVE تشخیص دهد که فایل WAL از این اندازه بزرگتر است، `wal_checkpoint(RESTART)` اجرا میشود تا WAL بدون بازنویسی wal-index نگاشتشده از ابتدا شروع کند. checkpointهای زنده در حالت truncate حذف شدهاند (ردیف `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` را ببینید). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | آن را روی `1`/`true`/`yes`/`on` تنظیم کنید تا پس از تداوم فشار بحرانی منابع بهمدت `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`، فرایند خارج شود و یک ناظر (systemd با `Restart=always` یا سیاست راهاندازی مجدد Docker) بتواند بهجای ارائه نامحدود خطاهای 503، یک فرایند سالم را دوباره راهاندازی کند. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (۲ دقیقه) | `open-sse/utils/resourcePressure.ts` | مدتزمانی که فشار بحرانی باید ادامه یابد تا خروج ناشی از راهاندازی مجدد خودکار فعال شود. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(تشخیص خودکار)_ | `src/lib/db/adapters/sqljsAdapter.ts` | مسیر صریح (مطلق یا نسبی به cwd) برای `sql-wasm.wasm` هنگام استفاده از آداپتور جایگزین WASM مربوط به `sql.js`. وقتی تنظیم نشده باشد، از طریق وابستگیهای بسته و چیدمانهای کاندید بهطور خودکار شناسایی میشود. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | تعداد روزهایی که checkpointها، فایلهای ورودی/خروجی/خطای ارجاعشده و ردیف یک کار نهاییشده Batch API (تکمیلشده/ناموفق/لغوشده/منقضیشده) پیش از حذف توسط پاکسازی خودکار نگه داشته میشوند. فقط پس از فعالشدن `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` اثر میگذارد و با بازه نگهداری خروجی Batch API خود OpenAI مطابقت دارد. بر مسیر `DELETE /api/v1/batches/delete-completed` که توسط اپراتور فعال میشود اثری ندارد؛ این مسیر طبق طراحی بدون قیدوشرط باقی میماند (بدون فیلتر سن). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | وقتی `true` باشد، پاکسازی خودکار اجازه مییابد کارهای نهاییشده Batch API (و checkpointهای آنها) را پس از گذشت `OMNIROUTE_BATCH_RETENTION_DAYS` حذف کند و محتوای BLOB فایلهای بارگذاریشدهای را که از `expires_at` خود گذشتهاند پاک کند. بهطور پیشفرض خاموش است: تمام نصبهای موجود این دادهها را دقیقاً مانند قبل نگه میدارند تا زمانی که اپراتور آن را فعال کند. همچنین یک پرچم قابلیت قابلویرایش در داشبورد است — `docs/reference/FEATURE_FLAGS.md` ← زمان اجرا را ببینید. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | برای رد شدن کامل از بررسی سلامت DB هنگام راهاندازی، روی `1` تنظیم کنید. برای وظایف کوتاهمدت و آزمونهای یکپارچهسازی مفید است. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | برای فعالسازی اجباری حلقه بررسی سلامت DB، حتی زمانی که معمولاً از آن صرفنظر میشود (مثلاً در وظایف کوتاهمدت)، روی `1` تنظیم کنید. | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | برای رد شدن از آمادهسازی اولیه محیط اجرای بومی در طول `npm install`، روی `1` تنظیم کنید. در نصبهای CI/بدون رابط گرافیکی که sqlite از قبل ساخته شده است مفید است. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(تشخیص خودکار)_ | `src/lib/db/migrationRunner.ts` | دایرکتوری اسکنشده توسط اجراکننده مهاجرت را بازنویسی میکند. هنگام ارائه مهاجرتهای بستهبندیشده در بیلدهای سفارشی مفید است. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(تنظیمنشده)_ | `src/lib/db/migrationRunner/extraDirs.ts` | دایرکتوریهای مهاجرت اضافی بهصورت ورودیهای `namespace=dir` که با جداکننده مسیر پلتفرم از هم جدا شدهاند (مثلاً `ee=/opt/app/enterprise/db/migrations`). فایلهای یافتشده در آنجا بهشکل `-` ثبت میشوند؛ بنابراین توزیعی که مهاجرتهای خودش را ارائه میکند، هرگز با جایگاههای عددی بالادستی تداخل پیدا نمیکند. یک ورودی نادرست، فضای نام نامعتبر یا دایرکتوری مفقود، بهجای نادیده گرفتن بیسروصدای شِما، هنگام راهاندازی خطا ایجاد میکند. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | آستانه ایمنی برای تعداد زیاد مهاجرتهای در انتظار (#3416). اگر در یک DB موجود، بیش از این تعداد مهاجرت در انتظار باشد، راهاندازی متوقف میشود (برای محافظت در برابر پاک شدن جدول رهگیری). برای بازیابی یک نسخه پشتیبان قدیمی، مقدار آن را افزایش دهید؛ برای غیرفعال کردن بررسی، روی `0` تنظیم کنید. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | دایرکتوری کاری برای دروازه انتشار `check:install-upgrade`. این فرایند تقریباً به 12 GB فضا نیاز دارد (دو درخت نصب حدوداً 3 GB بهعلاوه tarball)، بنابراین نباید روی یک tmpfs کوچک اجرا شود — در اجراکننده خودمیزبان، `/tmp` یک tmpfs مبتنی بر RAM با ظرفیت 12 GB است و دروازه انتشار آن را پر کرد و باعث ناقص شدن بسته شد. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(پیشفرض در کد)_ | `src/lib/spend/batchWriter.ts` | فاصله زمانی تخلیه (ms) برای نویسنده دستهای مصرف/هزینه. مقادیر کمتر تجمیع عملیات نوشتن را کاهش میدهند؛ مقادیر بیشتر رقابت بر سر DB را کاهش میدهند. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(پیشفرض در کد)_ | `src/lib/spend/batchWriter.ts` | حداکثر تعداد ورودیهای مصرف بافرشده پیش از تخلیه اجباری. در استقرارهای با QPS بالا آن را افزایش دهید؛ هنگامی که محدود بودن حافظه اهمیت بیشتری دارد، آن را کاهش دهید. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(تنظیمنشده)_ | `open-sse/utils/proxyFetch.ts` | برای انتشار گزارشهای اشکالزدایی `[ProxyFetch]` در مسیر رله Vercel، روی `"true"` تنظیم کنید. برای جلوگیری از افشای سرنخهای مسیریابی، بهطور پیشفرض غیرفعال است. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | برای گنجاندن IPهای کلاینت/خروجی و پیشوند حساب در خط مفصل گزارش فرایند `[ProxyEgress]`، روی `"true"` یا `"1"` تنظیم کنید. بهطور پیشفرض خاموش نگه داشته شده است تا گزارش فرایند، IPها یا پیشوند حساب را افشا نکند. | +| `OMNIROUTE_DEBUG` | _(تنظیمنشده)_ | `bin/cli/commands/quota.mjs` | برای چاپ اطلاعات عیبیابی زمانبندی هر درخواست (`[omniroute] GET completed in Nms`) از فرمانهای سهمیه CLI در stderr، روی `1` تنظیم کنید. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(خودکار)_ | `scripts/dev/healthcheck.mjs` | مسیر صریحی که توسط بررسی سلامت کانتینر کاوش میشود. اگر تنظیم نشده باشد، کاوشگر آن را از `OMNIROUTE_BASE_PATH` استخراج میکند؛ تنظیم آن، نقطه پایانی پایش عمیق را دوباره فعال میکند. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(تنظیمنشده)_ | `bin/cli/commands/completion.mjs` | برای انتشار اطلاعات عیبیابی `[omniroute completion]` از مسیرهای حافظه نهان تکمیل پوسته CLI (خواندن/بازآوری/نوشتن)، روی هر مقدار غیرخالی تنظیم کنید. بهطور پیشفرض غیرفعال است — خطاهای این حافظههای نهان بدون پیام رخ میدهند تا حافظه نهان مفقود/خراب هرگز تکمیل با Tab را مختل نکند. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | حداکثر بازه تلاش مجدد برای آیتمهای منفرد دسته (ms). آیتمهایی که از این مدت فراتر بروند، شکستخورده علامتگذاری میشوند. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | تأخیر پایه (میلیثانیه) برای عقبنشینی نمایی در تلاشهای مجدد اقلام دسته. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (۱ ساعت) | `open-sse/services/batchProcessor.ts` | سقف تأخیر (میلیثانیه) برای عقبنشینی نمایی بین تلاشهای مجدد اقلام دسته. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | حداکثر تعداد دستههایی که بهطور همزمان پردازش میشوند. برای افزایش توان عملیاتی آن را بالا ببرید؛ برای جلوگیری از هجوم درخواستها به محدودیت نرخ، آن را پایین نگه دارید. | > [!IMPORTANT] -> پیش از تغییر یک پایگاه داده دائمی موجود، اجراکننده مهاجرت یک تصویر لحظهای کامل -> و آدرسدهیشده بر اساس محتوا را در `DATA_DIR/db_backups/` منتشر میکند. انتشار به یک سیستم فایل -> نیاز دارد که از پیوندهای سخت بدون بازنویسی در همان سیستم فایل و همگامسازی پایدار فایل پشتیبانی کند. میزبانهای POSIX همچنین +> پیش از تغییر یک پایگاه داده ماندگار موجود، اجراکننده مهاجرت یک اسنپشات کامل +> با آدرسدهی محتوامحور را در `DATA_DIR/db_backups/` منتشر میکند. انتشار به فایلسیستمی نیاز دارد +> که از پیوندهای سختِ بدون بازنویسی در همان فایلسیستم و همگامسازی پایدار فایل پشتیبانی کند. میزبانهای POSIX همچنین > به همگامسازی دایرکتوری نیاز دارند؛ در Windows، ممکن است Node هندلهای دایرکتوری را رد کند، بنابراین OmniRoute فایل -> منتشرشده را تخلیه میکند و همگامسازی مدخل دایرکتوری را بهصورت بهترین تلاش ممکن انجام میدهد. +> منتشرشده را تخلیه میکند و همگامسازی ورودی دایرکتوری را بهصورت بهترین تلاش ممکن انجام میدهد. > اگر `DATA_DIR` متصلشده نتواند این تضمینها را فراهم کند، راهاندازی پیش از اعمال -> مهاجرت بهشکل ایمن متوقف میشود. `DATA_DIR` را به یک والیوم دارای این قابلیتهای پایه منتقل کنید؛ از -> `DISABLE_SQLITE_AUTO_BACKUP` برای دور زدن ایمنی مهاجرت استفاده نکنید. +> مهاجرت، بهصورت ایمن متوقف میشود. `DATA_DIR` را به یک والیوم دارای این قابلیتها منتقل کنید؛ برای دور زدن ایمنی مهاجرت از +> `DISABLE_SQLITE_AUTO_BACKUP` استفاده نکنید. ### سناریوها @@ -143,8 +142,8 @@ OmniRoute برای تمام دادههای ماندگار از **SQLite** (از | ---------------------------- | ------------------------------------------------------------------------------------------------------------- | | **توسعه محلی** | همه مقادیر پیشفرض را حفظ کنید. پایگاه داده در `~/.omniroute/omniroute.db` قرار دارد. | | **Docker** | `DATA_DIR=/data` + یک والیوم را در `/data` متصل کنید. | -| **رمزنگاریشده در حالت سکون** | `STORAGE_ENCRYPTION_KEY` را تنظیم کنید + از کلید نسخه پشتیبان نگه دارید! از دست دادن آن = از دست دادن دادهها. | -| **CI/آزمایش** | `DATA_DIR=/tmp/omniroute-test` — موقتی است و به رمزنگاری نیاز ندارد. | +| **رمزگذاریشده در حالت سکون** | `STORAGE_ENCRYPTION_KEY` را تنظیم کنید + از کلید نسخه پشتیبان نگه دارید! از دست دادن آن = از دست دادن دادهها. | +| **CI/آزمایش** | `DATA_DIR=/tmp/omniroute-test` — موقتی است و نیازی به رمزگذاری ندارد. | --- @@ -213,37 +212,38 @@ OmniRoute برای تمام دادههای ماندگار از **SQLite** (از ## 4. امنیت و احراز هویت -| متغیر | پیشفرض | فایل منبع | توضیحات | -| ------------------------------------------- | ------------------------------------------------------------------------------------------ | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt ترکیبشده با شناسههای سختافزاری برای ایجاد اثر انگشت ماشین. برای جداسازی، آن را در هر استقرار تغییر دهید. | -| `OMNIROUTE_CLI_SALT` | _(تنظیمنشده = Salt تصادفی مختص هر نصب که در `/cli-token-salt.json` ذخیره میشود)_ | `src/lib/machineToken.ts` | Salt مربوط به HMAC برای استخراج توکن احراز هویت محلی CLI. تنظیم این مقدار همه توکنهای CLI روی ماشین را تعویض میکند و همیشه بر Salt ذخیرهشده اولویت دارد. به `docs/security/CLI_TOKEN.md` مراجعه کنید. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | پرچم `Secure` را روی کوکیهای نشست تنظیم میکند. هنگام اجرا پشت HTTPS، **باید `true` باشد**. | -| `REQUIRE_API_KEY` | `false` | میانافزار API | وقتی `true` باشد، همه درخواستهای پروکسی `/v1/*` باید شامل یک کلید API معتبر باشند. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | امکان نمایش کامل مقادیر کلید API را در رابط کاربری داشبورد فراهم میکند. از بخش پرچمهای قابلیت داشبورد قابل پیکربندی است؛ در نمونههای اشتراکی خطر امنیتی دارد. | -| `NO_LOG_API_KEY_IDS` | _(خالی)_ | `src/lib/compliance/index.ts` | شناسههای کلید API جداشده با ویرگول که ثبت درخواستها را دور میزنند (برای انطباق با GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(تنظیمنشده = نامحدود)_ | `src/shared/utils/apiKeyPolicy.ts` | بودجه جایگزین روزانه درخواستها که برای کلیدهای API با ستون `rate_limits` برابر با null اعمال میشود. تنظیمنشده یا خالی: بدون سقف ضمنی (#2289، #11017). مقدار `0` نیز همین معنا را دارد (نامحدود). عدد صحیح مثبت N، محدودیت N در روز، 5N در هفته و 20N در ماه را فعال میکند. مقادیر غیرخالی و نادرست به پنجرههای قدیمی 1000 در روز، 5000 در هفته و 20000 در ماه بازمیگردند. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | حداکثر اندازه مجاز بدنه درخواست. محمولههایی را که از این محدودیت فراتر روند رد میکند. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | بدنههای واقعی درخواست با اندازه مساوی یا بیشتر از این آستانه، پیش از تجزیه JSON، اجاره پذیرش اتمیک و سنگینوزن محلیِ فرایند را دریافت میکنند (مسیر BYTE، شامل `POST /v1/responses`). همان سازوکار خروج در صورت وجود فضای آزاد سالمِ [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) که برای ساختارهای سنگین بهکار میرود؛ همچنان توسط `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) محدود میشود تا [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) بازنگردد. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | سقف سخت مسیر چت که بر اساس بایتهای خواندهشده در طول دریافت محدود اعمال میشود؛ از جمله برای درخواستهایی با `Content-Length` مفقود، نامعتبر یا خلاف واقع. درخواستهای بیش از این حد پاسخ `413` دریافت میکنند. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(تنظیمنشده — بدون سقف تعداد درخواست)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** این سقف قدیمی بر اساس تعداد درخواست اکنون فقط زمانی اعمال میشود که صراحتاً تنظیم شده باشد. اگر تنظیمنشده باقی بماند (حالت پیشفرض)، پذیرش چت سنگین در عوض توسط `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` کنترل میشود — یک بودجه بایتی که بهطور خودکار از سقف واقعی حافظه فرایند در **یک فرایند** (یک heap از V8) محاسبه میشود. دو درخواست همپوشان `/v1/responses` با حدود 750k توکن، heapهای حدود 12 Gi را از کار میاندازند (#7849) — این یک هشدار درباره **بودجه حافظه** است، نه سقف قطعی محصول برابر با 2. یک فرایند سالم (با heap پایینتر از نسبت دفع بار) ممکن است از طریق `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` درخواستهای طولانی `/v1/responses` بیشتری را بهصورت همزمان بپذیرد. دهها کلاینت طولانی SSE (40–50) به heap و `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 مربوط است، نه «حداکثر 2». افزایش کورکورانه این مقدار برای «استفاده از میزبان»، مشکل #7849 را دوباره ایجاد میکند. **heapها** را با **N عدد `DATA_DIR` مستقل** تکثیر کنید (#11024)؛ هرگز `replicas>1` را روی یک فایل SQLite واحد اجرا نکنید. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(محاسبهشده بهطور خودکار)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** مقدار بازنویسی برای بودجه بایتی ورودی که بهطور خودکار محاسبه میشود (25% از محدودترِ سقف حافظه V8/cgroup، تقسیم بر ضریب تقویت گذرای 8x). مقادیر محاسبهشده و صریح به بازه 8 MiB تا 2 GiB محدود میشوند. بدنهای بزرگتر از بودجه مؤثر، بلافاصله با `413 body_exceeds_budget` شکست میخورد؛ رقابت میان بدنههایی که هرکدام بهتنهایی قابل سرویسدهی هستند، همچنان با `503` قابل تلاش مجدد باقی میماند. وجود 40–50 کلاینت طولانی SSE به این بودجه و heap مربوط است، نه یک «حداکثر 2» قطعی. پیش از تنظیم، مقادیر `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` را در `/api/monitoring/health` بررسی کنید. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | نسبت دفع بار ناشی از فشار heap (`heapUsed / heap_size_limit`) برای پذیرش سنگین بایتی و ساختاری (#10183، #10268، #10437). یک درخواست سنگین همزمان که از `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` عبور کند، فقط زمانی با `503` قابل تلاش مجدد دفع میشود که heap نیز در این نسبت یا بالاتر از آن باشد؛ در یک heap سالم، درخواست در عوض از طریق ظرفیت اضافی حالت سالم پذیرفته میشود. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (پیشفرض `1`) | `src/shared/middleware/chatBodyAdmission.ts` | ظرفیت اضافی محدود برای مسیر سریع heap سالم (#10437)، هم برای پذیرش ساختاری و هم بایتی (`admitChatRequest`، شامل بدنههای ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). بدون این محدودیت، هر درخواست پرترافیک اما دارای heap سالم، بدون هیچ سقفی از پذیرش عبور میکرد. پس از فعال شدن این تعداد lease همزمان از طریق مسیر heap سالم، درخواستهای پرترافیک بعدی به همان مسیر انتظار محدود/دفع بار هدایت میشوند که هنگام فشار واقعی heap استفاده میشود. `0` این میانبُر را بهطور کامل غیرفعال میکند. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | تعداد پیامهایی که یک درخواست چت را حتی زمانی که بدنه آن کمتر از آستانه بایتی است، در رده سنگین قرار میدهد. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | تعداد ابزارهایی که یک درخواست چت را حتی زمانی که بدنه آن کمتر از آستانه بایتی است، در رده سنگین قرار میدهد. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | برآورد محافظهکارانه توکن بر اساس اندازه رشته که یک درخواست را در رده سنگین قرار میدهد؛ این یک معیار تقریبی برای هزینه پذیرش است، نه توکنسازی صورتحساب ارائهدهنده. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (غیرفعال) | `src/shared/middleware/chatBodyAdmission.ts` | سقف اختیاری و نیازمند فعالسازی برای تاریخچه چت. بهطور پیشفرض غیرفعال است: تعداد پیام یک سیاست استقرار است، نه ویژگی همگانی یک درخواست؛ اعمال سقف در اینجا، مکالمات را پیش از آنکه خط لوله فشردهسازی بتواند آنها را قابل سرویس کند، با `413` نهایی رد میکند. رشد heap توسط `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` و دفع بار ناشی از فشار heap محدود میشود. در استقرارهای دارای محدودیت حافظه که به سقفی قطعی نیاز دارند، مقداری مثبت تنظیم کنید؛ در این صورت موارد مازاد، پاسخ ساختاریافته `413` با الزام فشردهسازی دریافت میکنند. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | سقف قطعی برای پاسخ غیرجریانی بالادستی که بهطور کامل در حافظه بافر میشود. پس از عبور از این مقدار، خوانشگر بالادستی لغو میشود و درخواست سریعاً شکست میخورد، بهجای آنکه یک رشته بدون محدودیت تا زمان اتمام heap رشد کند. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | حداکثر تعداد بایتهای روی سیم که از سرآیندهای پاسخ بالادستی ارسال میشوند. وقتی بودجه تمام شود، سرآیندهای کماولویتتر (برای مثال، `x-codex-*` سفارشی و `x-oai-request-id`) حذف میشوند تا محدودیتهای رایج سرآیند در پراکسی معکوس رعایت شوند. برای ارسال فراداده بیشتر از بالادست، با پذیرفتن هزینه افزایش اندازه سرآیند پاسخ، مقدار بالاتری تنظیم کنید. | -| `CORS_ORIGIN` | _(تنظیمنشده)_ | `src/server/cors/origins.ts` | فهرست مجاز قدیمی CORS برای یک مبدأ واحد. برای استقرارهای جدید، `CORS_ALLOWED_ORIGINS` را ترجیح دهید. CORS فقط برای کلاینتهای API مرورگر با مبدأ متقاطع است؛ نوشتنهای احراز هویتشدهٔ داشبورد در عوض از درخواستهای هممبدأ بههمراه محافظت CSRF وابسته به نشست استفاده میکنند. | -| `CORS_ALLOWED_ORIGINS` | _(تنظیمنشده)_ | `src/server/cors/origins.ts` | فهرست مجاز CORS با مقادیر جداشده با ویرگول. هیچ نویسهٔ عامی ارسال نمیشود، مگر اینکه `CORS_ALLOW_ALL=true` بهصراحت پیکربندی شده باشد. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | راه گریز مختص توسعه برای بازتاب دادن هر `Origin` مرورگر. آن را در استقرارهای اشتراکی یا عملیاتی فعال نکنید. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | فراخوانیهای ارائهدهنده را که محدودههای IP خصوصی/بازگشتی/پیوند-محلی را هدف قرار میدهند، مسدود کنید. فقط در محیطهای آزمایشی ایزوله غیرفعال کنید. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | اجازه دادن به URLهای ارائهدهنده که به شبکههای خصوصی/محلی اشاره میکنند (localhost، 192.168.x.x، 10.x.x.x و غیره). **برای ارائهدهندگان خودمیزبان الزامی است** (LM Studio، Ollama، vLLM، Llamafile، Triton، SearXNG). هنگامی که `false` باشد، داشبورد اعتبارسنجی URLهای محلی را رد میکند. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | اجازه افزودن/اعتبارسنجی ارائهدهندگان روی آدرسهای محلی/خصوصی (127.0.0.1، localhost، LAN، محدودههای خصوصی) — محدود به مسیر اعتبارسنجی ارائهدهنده. **مقدار پیشفرض `true` است** (اولویت با حالت محلی)؛ برای اعمال مسدودسازی سختگیرانه و محدود به آدرسهای عمومی، آن را روی `false` تنظیم کنید. نقاط پایانی فرادادهٔ ابری (169.254.169.254، metadata.google.internal) در هر صورت مسدود باقی میمانند. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | اجازه دهید مسیرهای `/v1/audio/*` (رونویسی، گفتار، ترجمه) از یک گره ارائهدهندهٔ سازگار با OpenAI که خارج از localhost میزبانی میشود، استفاده کنند. بهطور پیشفرض غیرفعال است — مسیریابی صدا به یک میزبان راهدور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای بازگشتی/خصوصی (localhost، 127.0.0.1، 172.16-31.x) همیشه مجاز و بدون تأثیر هستند. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | هنگامی که OIDC فعال است، ورود با گذرواژه را غیرفعال کنید تا کاربران فقط از طریق ورود یکپارچه OIDC احراز هویت شوند. نام مستعار سادهٔ `OIDC_DISABLE_PASSWORD_LOGIN` نیز پذیرفته میشود؛ پرچم قابلیت داشبورد با همین کلید اولویت دارد. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | نام مستعار سادهٔ `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +| متغیر | مقدار پیشفرض | فایل منبع | توضیحات | +| ------------------------------------------- | ------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt ترکیبشده با شناسههای سختافزاری برای ایجاد اثر انگشت ماشین. برای جداسازی، آن را در هر استقرار تغییر دهید. | +| `OMNIROUTE_CLI_SALT` | _(تنظیمنشده = Salt تصادفی مختص هر نصب که در `/cli-token-salt.json` ذخیره میشود)_ | `src/lib/machineToken.ts` | Salt مربوط به HMAC برای استخراج توکن احراز هویت CLI محلی. تنظیم این مقدار، همه توکنهای CLI روی ماشین را تعویض میکند و همیشه نسبت به Salt ذخیرهشده اولویت دارد. به `docs/security/CLI_TOKEN.md` مراجعه کنید. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | پرچم `Secure` را روی کوکیهای نشست تنظیم میکند. هنگام اجرا پشت HTTPS، **باید `true` باشد**. | +| `REQUIRE_API_KEY` | `false` | میانافزار API | وقتی `true` باشد، همه درخواستهای پروکسی `/v1/*` باید شامل یک کلید API معتبر باشند. **این پرچم دسترسی به `GET /v1/models` را کنترل نمیکند**؛ این مسیر در عوض از وضعیت ورود داشبورد (`requireAuthForModels`) پیروی میکند—بنابراین دریافت `401` از `/v1/models` به این معنا نیست که استنتاج محافظت شده است. به `docs/security/INFERENCE_AUTH_POSTURE.md` مراجعه کنید (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | امکان نمایش کامل مقادیر کلید API را در رابط کاربری داشبورد فراهم میکند. از طریق پرچمهای قابلیت داشبورد قابل پیکربندی است؛ در نمونههای اشتراکی خطر امنیتی دارد. | +| `NO_LOG_API_KEY_IDS` | _(خالی)_ | `src/lib/compliance/index.ts` | شناسههای کلید API جداشده با ویرگول که ثبت درخواست را دور میزنند (برای انطباق با GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(تنظیمنشده = نامحدود)_ | `src/shared/utils/apiKeyPolicy.ts` | بودجه جایگزین روزانه درخواست که برای کلیدهای API با ستون `rate_limits` برابر با null اعمال میشود. تنظیمنشده یا خالی: بدون محدودیت ضمنی (#2289، #11017). مقدار `0` نیز همین معنا را دارد (نامحدود). عدد صحیح مثبت N، محدودیت N در روز، 5N در هفته و 20N در ماه را فعال میکند. مقادیر غیرخالیِ نامعتبر به محدودیتهای قدیمی 1000 در روز، 5000 در هفته و 20000 در ماه بازمیگردند. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | حداکثر اندازه مجاز بدنه درخواست. محمولههایی را که از این محدودیت فراتر روند رد میکند. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | بدنههای واقعی درخواست با اندازه برابر یا بیشتر از این آستانه، پیش از تجزیه JSON، اجاره پذیرش سنگینوزن اتمی و محلیِ فرایند را دریافت میکنند (مسیر BYTE، شامل `POST /v1/responses`). همان راه گریزِ فضای آزاد سالم [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) که برای ساختارهای سنگین استفاده میشود؛ همچنان توسط `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) محدود است تا مشکل [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) دوباره رخ ندهد. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | سقف سخت مسیر چت که بر اساس بایتهای خواندهشده طی دریافت کراندار اعمال میشود؛ از جمله برای درخواستهایی که `Content-Length` ندارند یا مقدار آن نامعتبر یا خلاف واقع است؛ موارد بیشازحد پاسخ `413` دریافت میکنند. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(تنظیمنشده — بدون سقف تعداد درخواست)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** این سقف قدیمیِ تعداد درخواست اکنون فقط زمانی اعمال میشود که صراحتاً تنظیم شده باشد. وقتی تنظیم نشده باقی بماند (حالت پیشفرض)، پذیرش چتهای سنگین در عوض با `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` کنترل میشود — بودجهای بر حسب بایت که بهطور خودکار بر اساس سقف واقعی حافظهٔ فرایند در **یک فرایند** (یک heap از V8) تعیین میشود. دو درخواست همپوشان `/v1/responses` با حدود 750k توکن، heapهای تقریباً 12 GiB را از کار میاندازند (#7849) — این یک هشدار دربارهٔ **بودجهٔ حافظه** است، نه سقف سخت محصول برابر با 2. یک فرایند سالم (با heap پایینتر از نسبت کاهش بار) ممکن است از طریق `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` تعداد بیشتری درخواست طولانیِ همزمان `/v1/responses` را بپذیرد. دهها کلاینت طولانی SSE (40–50) به heap و `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 مربوط است، نه «حداکثر 2». افزایش کورکورانهٔ این مقدار برای «استفاده از میزبان» دوباره مشکل #7849 را ایجاد میکند. **heapها** را با **N عدد `DATA_DIR` مستقل** تکثیر کنید (#11024)؛ هرگز روی یک فایل SQLite از `replicas>1` استفاده نکنید. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(مشتقشده بهصورت خودکار)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** بازنویسی بودجهٔ بایتی دریافت که بهصورت خودکار مشتق میشود (25٪ از محدودترِ سقف حافظهٔ V8/cgroup، تقسیم بر ضریب تقویت موقتی 8x). مقادیر مشتقشده و صریح به بازهٔ 8 MiB تا 2 GiB محدود میشوند. بدنهای بزرگتر از بودجهٔ مؤثر، بلافاصله با `413 body_exceeds_budget` شکست میخورد؛ رقابت میان بدنههایی که هرکدام بهتنهایی قابل سرویسدهی هستند همچنان با `503` قابل تلاش مجدد است. 40–50 کلاینت طولانیِ همزمان SSE حاصل این بودجه بهعلاوهٔ heap است، نه یک «حداکثر 2» سخت. پیش از تنظیم، `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` را در `/api/monitoring/health` بخوانید. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | نسبت کاهش بار تحت فشار heap (`heapUsed / heap_size_limit`) برای پذیرش سنگینِ BYTE و STRUCTURE (#10183، #10268، #10437). یک درخواست سنگین همزمان که از `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` عبور کرده باشد، فقط زمانی با `503` قابل تلاش مجدد کنار گذاشته میشود که heap نیز در این نسبت یا بالاتر از آن باشد؛ در heap سالم، درخواست از طریق فضای اضافهٔ سالم پذیرفته میشود. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (پیشفرض `1`) | `src/shared/middleware/chatBodyAdmission.ts` | ظرفیت اضافی کراندار برای مسیر سریعِ heap سالم (#10437)، هم برای STRUCTURE و هم BYTE (`admitChatRequest`، شامل بدنههای ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). بدون این کران، هر درخواست در حالت شلوغ ولی با heap سالم، پذیرش را بدون هیچ سقفی دور میزد. پس از فعال شدن این تعداد lease همزمان از طریق مسیر heap سالم، درخواستهای شلوغِ بعدی به همان مسیر انتظار کراندار/کاهش بار میروند که هنگام فشار واقعی heap استفاده میشود. `0` این میانبُر را کاملاً غیرفعال میکند. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | تعداد پیامهایی که باعث میشود یک درخواست چت حتی در صورت کمتر بودن بدنهاش از آستانهٔ بایتی، سنگین طبقهبندی شود. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | تعداد ابزارهایی که باعث میشود یک درخواست چت حتی در صورت کمتر بودن بدنهاش از آستانهٔ بایتی، سنگین طبقهبندی شود. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | برآورد محافظهکارانهٔ توکن بر اساس اندازهٔ رشته که یک درخواست را سنگین طبقهبندی میکند؛ این یک شاخص تقریبی هزینهٔ پذیرش است، نه توکنسازی صورتحساب ارائهدهنده. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (غیرفعال) | `src/shared/middleware/chatBodyAdmission.ts` | سقف اختیاری و نیازمند فعالسازی برای تاریخچهٔ چت. بهطور پیشفرض غیرفعال است: تعداد پیام یک سیاست استقرار است، نه ویژگی همگانی یک درخواست، و اعمال سقف در اینجا مکالمهها را پیش از آنکه خط لولهٔ فشردهسازی بتواند آنها را قابل سرویسدهی کند، با `413` نهایی رد میکند. رشد heap با `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` و کاهش بار تحت فشار heap کراندار میشود. در استقرارهای دارای محدودیت حافظه که به سقف سخت نیاز دارند، یک مقدار مثبت تنظیم کنید؛ موارد بیشازحد سپس پاسخ ساختیافتهٔ `413` با الزام فشردهسازی دریافت میکنند. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | سقف سخت برای پاسخ بالادستیِ غیرجریانی که بهطور کامل در حافظه بافر میشود. پس از عبور از این سقف، خوانندهٔ بالادستی لغو میشود و درخواست سریعاً شکست میخورد، بهجای آنکه یک رشتهٔ بدون کران تا زمان تمام شدن heap رشد کند. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | حداکثر تعداد بایتهای ارسالی که از سرآیندهای پاسخ بالادستی منتقل میشوند. وقتی از این سقف عبور شود، سرآیندهای با اولویت پایینتر (برای مثال، `x-codex-*` سفارشی و `x-oai-request-id`) حذف میشوند تا محدودیتهای رایج سرآیند در پروکسی معکوس رعایت شوند. برای انتقال فرادادههای بیشتر از بالادست، این مقدار را افزایش دهید؛ البته به بهای افزایش اندازه سرآیند پاسخ. | +| `CORS_ORIGIN` | _(تنظیمنشده)_ | `src/server/cors/origins.ts` | فهرست مجاز قدیمی CORS برای یک مبدأ واحد. برای استقرارهای جدید، `CORS_ALLOWED_ORIGINS` را ترجیح دهید. CORS فقط برای کلاینتهای API مرورگر با مبدأ متفاوت است؛ عملیات نوشتن احراز هویتشده در داشبورد، در عوض از درخواستهای هممبدأ بههمراه محافظت CSRF متصل به نشست استفاده میکنند. | +| `CORS_ALLOWED_ORIGINS` | _(تنظیمنشده)_ | `src/server/cors/origins.ts` | فهرست مجاز CORS با مقادیر جداشده با ویرگول. هیچ نویسه عامی ارسال نمیشود، مگر اینکه `CORS_ALLOW_ALL=true` صراحتاً پیکربندی شده باشد. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | راه گریز مختص محیط توسعه برای بازتاب هر `Origin` مرورگر. آن را در استقرارهای اشتراکی یا عملیاتی فعال نکنید. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | فراخوانیهای ارائهدهنده را که محدودههای IP خصوصی، loopback یا link-local را هدف میگیرند، مسدود میکند. فقط در محیطهای آزمایشی ایزوله غیرفعال کنید. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | URLهای ارائهدهنده را که به شبکههای خصوصی/محلی اشاره میکنند (localhost، 192.168.x.x، 10.x.x.x و غیره) مجاز میکند. **برای ارائهدهندگان خودمیزبان الزامی است** (LM Studio، Ollama، vLLM، Llamafile، Triton، SearXNG). وقتی مقدار `false` باشد، داشبورد اعتبارسنجی URLهای محلی را رد میکند. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | افزودن/اعتبارسنجی ارائهدهندگان روی آدرسهای محلی/خصوصی (127.0.0.1، localhost، LAN، محدودههای خصوصی) را مجاز میکند — با دامنه محدود به مسیر اعتبارسنجی ارائهدهنده. **مقدار پیشفرض `true` است** (اولویت با محیط محلی)؛ برای اعمال مسدودسازی سختگیرانه و صرفاً عمومی، آن را روی `false` تنظیم کنید. نقاط پایانی فراداده ابری (169.254.169.254، metadata.google.internal) در هر صورت مسدود باقی میمانند. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | به مسیرهای `/v1/audio/*` (رونویسی، گفتار و ترجمه) اجازه میدهد از یک گره ارائهدهنده سازگار با OpenAI که خارج از localhost میزبانی میشود، استفاده کنند. بهطور پیشفرض غیرفعال است — مسیریابی صوت به میزبان راهدور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback/خصوصی (localhost، 127.0.0.1، 172.16-31.x) همیشه مجاز و بدون تأثیر هستند. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | به `POST /v1/rerank` (و مرحله بازرتبهبندی loopback موتور حافظه) اجازه میدهد از یک گره ارائهدهنده سازگار با OpenAI که خارج از localhost میزبانی میشود استفاده کند — یک دستگاه LAN یا همتای Tailscale که TEI، Infinity، vLLM و غیره را اجرا میکند. بهطور پیشفرض غیرفعال است — مسیریابی به میزبان راهدور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback (localhost، 127.0.0.1، 172.16-31.x) همیشه مجاز و بدون تأثیر هستند. گرههای راهدور همچنین باید از سیاست URL خروجی ارائهدهنده (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) عبور کنند؛ هیچگاه به میزبانهای فراداده ابری مسیریابی نمیشود. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | وقتی OIDC فعال است، ورود با گذرواژه را غیرفعال میکند تا کاربران فقط بتوانند از طریق ورود یکپارچه OIDC احراز هویت کنند. نام مستعار ساده `OIDC_DISABLE_PASSWORD_LOGIN` نیز پذیرفته میشود؛ پرچم قابلیت داشبورد با همین کلید اولویت دارد. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | نام مستعار ساده `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### چکلیست مقاومسازی @@ -253,7 +253,7 @@ AUTH_COOKIE_SECURE=true # به HTTPS نیاز دارد REQUIRE_API_KEY=true # همه فراخوانیهای پروکسی را احراز هویت کنید ALLOW_API_KEY_REVEAL=false # هرگز کلیدها را در رابط کاربری نمایش ندهید CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # محدودیت 5 مگابایت +MAX_BODY_SIZE_BYTES=5242880 # محدودیت 5 MB ``` --- @@ -301,59 +301,66 @@ OmniRoute یک دفاع دولایه ارائه میدهد: اسکن تزریق ## 6. سیاستهای ابزار و مسیریابی -| متغیر | پیشفرض | فایل منبع | توضیحات | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | دسترسی LLM به فراخوانی ابزار/تابع را کنترل میکند. `allowlist` = فقط ابزارهای فهرستشده، `denylist` = همه بهجز ابزارهای فهرستشده، `disabled` = بدون محدودیت. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | مسیر فایل JSON حاوی قوانین دستکاری payload (تغییرات بالادستی مختص هر مدل/پروتکل). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | بازهٔ بارگذاری مجدد (میلیثانیه) برای بازخوانی آنی فایل قوانین payload. حداقل `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | قابلیت انتخابی: شناسههای مدل سادهٔ `claude-*` را از کلاینتهای Claude Code، بهجای الزام به پیشوند ارائهدهنده، از طریق حساب OAuth مربوط به Claude Code مسیریابی میکند. پیشوندهای صریح ارائهدهنده همچنان اولویت دارند. همچنین از طریق یک گزینه در داشبوردِ صفحهٔ ارائهدهندهٔ Claude قابل پیکربندی است. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | سقف همزمانی بهازای هر مدل برای ترکیبهای round-robin (#9100). سمافور ترکیب round-robin بدون امکان بازنویسی، بهصورت ثابت به 3 درخواست همزمان برای هر مدل محدود شده بود و ترافیک با همزمانی بیشتر را پشت این سقف بهصورت سریالی پردازش میکرد. مقدار باید `>= 1` باشد و حداکثر به `<= 32` محدود میشود. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | گزینهای خطرناک که بررسی محلی پنجرهٔ زمینه / حداکثر توکن ورودی OmniRoute را برای درخواستهای مستقیم تکمدلی نادیده میگیرد. ارائهدهندگان بالادستی همچنان محدودیتهای واقعی خود را اعمال میکنند؛ فشردهسازی prompt و سقف توکن خروجی خود مدل همچنان فعال میمانند. ترتیب اولویت مؤثر عبارت است از: بازنویسی پایگاه دادهٔ Feature Flags > متغیر محیطی > مقدار پیشفرض؛ نیازی به راهاندازی مجدد نیست. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(تنظیمنشده)_ | `open-sse/services/conversationTracker.ts` | برای توقف جمعآوری تاریخچهٔ مکالمه، آن را روی `1` تنظیم کنید. `resolveConversationId()` پیش از خواندن SQLite یا تجزیهٔ تاریخچهٔ پیامها، نتیجهای ردیابینشده برمیگرداند و شناسههای نشست ارائهشده توسط کلاینت را نیز پوشش میدهد. مدیریت نشست مسیریابی بدون تغییر باقی میماند و رکوردهای موجود حذف نمیشوند. مناسب استقرارهایی است که از نمای مکالمهٔ داشبورد استفاده نمیکنند و میخواهند رشد جدول نوبتها متوقف شود. | +| متغیر | پیشفرض | فایل منبع | توضیحات | +| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | دسترسی LLM به ابزارها/فراخوانی توابع را کنترل میکند. `allowlist` = فقط ابزارهای فهرستشده، `denylist` = همه بهجز ابزارهای فهرستشده، `disabled` = بدون محدودیت. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | مسیر فایل JSON حاوی قواعد دستکاری payload (تنظیمات بالادستی مختص هر مدل/پروتکل). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | بازهٔ بارگذاری مجدد (میلیثانیه) برای بازخوانی آنی فایل قواعد payload. حداقل `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | قابلیت اختیاری: شناسههای مدل سادهٔ `claude-*` را از کلاینتهای Claude Code، بهجای الزام به پیشوند ارائهدهنده، از طریق حساب OAuth مربوط به Claude Code مسیریابی میکند. پیشوندهای صریح ارائهدهنده همچنان اولویت دارند. همچنین از طریق کلید تغییر وضعیت در داشبوردِ صفحهٔ ارائهدهندهٔ Claude قابل پیکربندی است. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | سقف همزمانی بهازای هر مدل برای ترکیبهای نوبتگردشی (#9100). سمافور ترکیب نوبتگردشی با سقف ثابت ۳ درخواست همزمان بهازای هر مدل و بدون امکان بازنویسی محدود شده بود و ترافیک با همزمانی بالاتر را پشت این سقف بهصورت سریالی پردازش میکرد. مقدار باید `>= 1` باشد و حداکثر به `<= 32` محدود میشود. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | گزینهٔ اختیاری خطرناکی که بررسی محلی پنجرهٔ زمینه / حداکثر توکن ورودی OmniRoute را برای درخواستهای مستقیم تکمدلی نادیده میگیرد. ارائهدهندگان بالادستی همچنان محدودیتهای واقعی خود را اعمال میکنند؛ فشردهسازی prompt و سقف توکن خروجی خود مدل نیز فعال باقی میمانند. ترتیب مؤثر اولویت عبارت است از: بازنویسی پایگاه دادهٔ Feature Flags > متغیر محیطی > مقدار پیشفرض؛ نیازی به راهاندازی مجدد نیست. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(تنظیمنشده)_ | `open-sse/services/selfHostedEntry.ts` | سند YAML درونخطی `providers:` ‏(RIC-738، D4). در صورت تنظیم (با یا بدون بلوک `strategy:`)، مسیر `/v1/chat/completions` بهجای pipeline ابری، به ورودی یکپارچهٔ self-hosted سازگار با OpenAI هدایت میشود. در حالت تنظیمنشده (حالت پیشفرض)، مسیر مستقیماً به pipeline ابری موجود منتقل میشود. به `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md` مراجعه کنید. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(تنظیمنشده)_ | `open-sse/services/selfHostedEntry.ts` | مسیر یک فایل YAML حاوی همان سند `providers:` موجود در `OMNIROUTE_SELF_HOSTED_PROVIDERS`، برای استقرارهایی که فایل را به متغیر محیطی درونخطی ترجیح میدهند. تنظیم هرکدام از این دو، ورودی self-hosted را فعال میکند. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(تنظیمنشده — مسیر باز)_ | `open-sse/services/selfHostedEntry.ts` | کلید API مشترک و اختیاری برای ورودی یکپارچهٔ self-hosted (چارچوب اولیهٔ D5، رزروشده برای سیستم سهمیهبندی بهازای هر کلید). در صورت تنظیم، درخواستها باید شامل `Authorization: Bearer ` باشند. در حالت تنظیمنشده، مسیر باز است و با الگوی موجودِ ارائهدهندهٔ محلی self-hosted مطابقت دارد (استقرار در شبکهٔ loopback/مورداعتماد). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(تنظیمنشده)_ | `open-sse/services/routingStrategies.ts` | سند YAML درونخطی `strategy:` برای موتور مسیریابی قطعی (M2/RIC-740، D3) — فهرست سیاه/سفید، قطعکنندهٔ دورهٔ انتظار، اولویت هزینه، آگاه از تأخیر و زنجیرهٔ جایگزین. بلوک درونخطی `strategy:` تودرتو در `OMNIROUTE_SELF_HOSTED_PROVIDERS` را بهازای هر کلید بازنویسی میکند. به `docs/routing/DETERMINISTIC_ROUTING.md` مراجعه کنید. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(تنظیمنشده)_ | `open-sse/services/routingStrategies.ts` | مسیر یک فایل YAML حاوی همان سند `strategy:` موجود در `OMNIROUTE_SELF_HOSTED_STRATEGY`، برای استقرارهایی که فایل را به متغیر محیطی درونخطی ترجیح میدهند. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(تنظیمنشده)_ | `open-sse/services/conversationTracker.ts` | برای توقف جمعآوری تاریخچهٔ مکالمه، آن را روی `1` تنظیم کنید. `resolveConversationId()` پیش از خواندن SQLite یا تجزیهٔ تاریخچهٔ پیامها، یک نتیجهٔ ردیابینشده برمیگرداند؛ شناسههای نشست ارائهشده توسط کلاینت نیز شامل این رفتار میشوند. مدیریت نشست مسیریابی بدون تغییر باقی میماند و رکوردهای موجود حذف نمیشوند. مناسب برای استقرارهایی که از نمای مکالمهٔ داشبورد استفاده نمیکنند و میخواهند رشد جدول نوبتها متوقف شود. | --- -## ۷. URLها و همگامسازی ابری - -| متغیر | پیشفرض | فایل منبع | توضیحات | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | نشانی سمت سرور برای فراخوانی `/api/sync/cloud` توسط کارهای همگامسازی داخلی. حتی زمانی که برنامه بهصورت عمومی از طریق پراکسی ارائه میشود، این مقدار را بهشکل یک نشانی loopback/کانتینر نگه دارید. | -| `CLOUD_URL` | _(خالی)_ | `src/lib/cloudSync.ts` | نشانی نقطه پایانی رلهٔ ابری (ویژگی پولی). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | مهلت زمانی HTTP برای درخواستهای همگامسازی ابری. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | پیکربندی ساخت Webpack | پروفایل زمان ساخت (برای حذف فیزیکی ماژولهای دارای دسترسی ویژه از بسته، روی `minimal` تنظیم کنید). | -| `OMNIROUTE_STANDALONE_DIR` | _خروجی مستقل ‎.build/_ | `scripts/build/colocate-standalone.mjs` | بازنویسی زمان ساخت برای پوشهٔ خروجی مستقل که مرحلهٔ هممکانسازی پس از ساخت از آن استفاده میکند. این یک تنظیم زمان اجرا نیست. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(خالی)_ | `src/lib/cloudSync.ts` | راز مشترک مورد استفاده برای تأیید امضای HMAC-SHA256 پاسخهای Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | برای اینکه نقطه پایانی Cloud Sync بتواند اطلاعات اعتباری محلی را بازنویسی کند، روی `true` تنظیم کنید. مقدار پیشفرض `false` است. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | برای رد کردن پاسخ بدون امضای Cloud Sync در زمانی که هیچ راز محلی پیکربندی نشده است، روی `true` تنظیم کنید (#13679). امضای موجود همیشه تأیید میشود — و اگر `OMNIROUTE_CLOUD_SYNC_SECRET` تنظیم نشده باشد، مستقل از این پرچم همیشه رد میشود. در v3.9 مقدار پیشفرض به حالت اجباری تغییر میکند. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | برای بازگشت به رفتار یکمرحلهای «وارد کردن همهچیز» در v3.8.5 بدون تأیید کاربر، روی `true` تنظیم کنید. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth، داشبورد، همگامسازی | نشانی عمومی برای OAuth redirect_uri، پیوندهای داشبورد و نشانیهای عمومی تولیدشده. وقتی بازگشتهای OAuth یا پیوندهای مرورگرِ تولیدشده باید از یک میزبان متعارفِ پراکسی معکوس استفاده کنند، این مقدار را روی نشانی عمومی پایدار تنظیم کنید. | -| `NEXT_PUBLIC_CLOUD_URL` | _(خالی)_ | سمت کلاینت | همتای سمت کلاینتِ `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(تنظیمنشده)_ | `src/shared/services/cloudSyncScheduler.ts` | جایگزین قدیمی برای `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(تنظیمنشده)_ | تفکیککنندهٔ مبدأ عمومی، نشانیهای تصویر | مبدأ OmniRoute با بالاترین اولویت و قابلدسترسی از مرورگر که برای تولید نشانی عمومی و اعتبارسنجی مبدأ مرورگر خارج از داشبورد استفاده میشود. وقتی OpenWebUI یا رلهای دیگر از طریق یک نشانی داخلی به OmniRoute دسترسی دارد، اما مرورگر کاربر باید رسانهٔ تولیدشده را از یک مبدأ LAN، تونل یا عمومی دریافت کند، این مقدار را تنظیم کنید. `/v1` را **اضافه نکنید**. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(تنظیمنشده)_ | `open-sse/config/providerPluginManifestUrl.ts` | نشانی مطلق مانیفست افزونهٔ ارائهدهنده که به کلاینتهای sidecar اعلام میشود. وقتی تنظیم نشده باشد، OmniRoute مسیر `/api/v1/provider-plugin-manifest` را از مبدأ درخواست یا HOST/PORT استخراج میکند. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | پروتکل مورد استفاده هنگام استخراج نشانی مانیفست افزونهٔ ارائهدهنده از HOST/PORT، بدون وجود مبدأ درخواست. وقتی `OMNIROUTE_PROVIDER_MANIFEST_URL` صریحی تنظیم نشده است، پشت یک پراکسی عمومی خاتمهدهندهٔ TLS آن را روی `https` تنظیم کنید. | -| `OMNIROUTE_TRUST_PROXY` | _(تنظیمنشده)_ | `src/server/origin/publicOrigin.ts` | حالت اعتماد اختیاری برای سربرگهای ارسالشدهٔ مبدأ عمومی. تنظیمنشده = برای تصمیمهای امنیتی به `Forwarded` / `X-Forwarded-*` اعتماد نکنید. `true` / `loopback` فقط از یک پراکسی loopback دارای مهر توکن به میزبان/پروتکل ارسالشده اعتماد میکند. `private` / `lan` همچنین به همتایان پراکسی در LAN خصوصی اعتماد میکند. در محیط عملیاتی، `NEXT_PUBLIC_BASE_URL` صریح ترجیح داده میشود. | -| `KIE_CALLBACK_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | نشانی عمومی بازگشت برای کارهای ناهمگام kie.ai. بازنویسی با بالاترین اولویت، پیش از `OMNIROUTE_KIE_CALLBACK_URL` و `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | نگارش جایگزین `KIE_CALLBACK_URL`. وقتی متغیر اصلی تنظیم نشده باشد، بهعنوان جایگزین استفاده میشود. | -| `OMNIROUTE_PUBLIC_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | مبدأ عمومی مورد استفاده برای ساخت نشانیهای بازگشت ناهمگام. جایگزین با پایینترین اولویت برای بازگشتهای kie.ai؛ همچنین بهعنوان یک نشانی عمومی کلی برای رلههای دیگر استفاده میشود. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | نقطه پایانی جستوجوی سهمیهٔ CrofAI که صفحهٔ مصرف از آن استفاده میکند. برای رلهها / دادههای آزمایشی قابل بازنویسی است. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | نقطه پایانی رسمی مصرف OpenCode Go با احراز هویت کلید API که صفحهٔ مصرف از آن استفاده میکند. برای رلهها / دادههای آزمایشی قابل بازنویسی است. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | سربرگهای هویت OpenCode CLI ‏(User-Agent، x-opencode-client/project، شناسههای UUID درخواست/نشست) را در درخواستهای بالادستی opencode-go/zen که کلاینت ارسال نکرده است تولید میکند تا Cloudflare آنها را در ترافیک خروجی VPS بپذیرد (#6210/#5997). از #10571 بهطور پیشفرض فعال است؛ برای انصراف از `false`/`0`/`no`/`off` استفاده کنید. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | User-Agent پیشفرض که وقتی `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است و بازنویسی `_USER_AGENT` برای ارائهدهنده تنظیم نشده، استفاده میشود. فقط روی اجراکنندههای opencode اعمال میشود. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | مقدار سربرگ تولیدشدهٔ `x-opencode-client` هنگامی که `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | مقدار سربرگ تولیدشدهٔ `x-opencode-project` هنگامی که `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | نشانی تنظیمات Ollama Cloud که برای استخراج سهمیه استفاده میشود. برای رلهها / دادههای آزمایشی قابل بازنویسی است. | -| `OLLAMA_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | کوکی `__Secure-session` مربوط به Ollama Cloud که برای استخراج سهمیه از صفحهٔ تنظیمات استفاده میشود. حساس است؛ وقتی چند حساب پیکربندی شدهاند، فیلد مختص هر اتصال در داشبورد را ترجیح دهید. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | متغیر محیطی جایگزین برای کوکی `__Secure-session` مربوط به Ollama Cloud. حساس است؛ وقتی چند حساب پیکربندی شدهاند، فیلد مختص هر اتصال در داشبورد را ترجیح دهید. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | متغیر محیطی جایگزین برای کوکی `__Secure-session` مربوط به Ollama Cloud که پیش از نامهای مستعار کوتاهتر استفاده میشود. حساس است؛ وقتی چند حساب پیکربندی شدهاند، فیلد مختص هر اتصال در داشبورد را ترجیح دهید. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | نقطه پایانی محدودیتهای مصرف CodeWhisperer (AWS Kiro). برای رلهها / دادههای آزمایشی قابل بازنویسی است. | +## 7. نشانیهای URL و همگامسازی ابری + +| متغیر | پیشفرض | فایل منبع | توضیحات | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | نشانی URL سمت سرور که وظایف همگامسازی داخلی برای فراخوانی `/api/sync/cloud` از آن استفاده میکنند. حتی زمانی که برنامه از طریق پراکسی بهصورت عمومی در دسترس است، این مقدار را بهصورت یک URL لوپبک/کانتینر نگه دارید. | +| `CLOUD_URL` | _(خالی)_ | `src/lib/cloudSync.ts` | نشانی URL نقطه پایانی رله ابری (قابلیت ویژه). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | مهلت زمانی HTTP برای درخواستهای همگامسازی ابری. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | پیکربندی ساخت Webpack | پروفایل زمان ساخت (برای حذف فیزیکی ماژولهای دارای دسترسی ویژه از باندل، روی `minimal` تنظیم کنید). | +| `OMNIROUTE_STANDALONE_DIR` | _خروجی مستقل .build/_ | `scripts/build/colocate-standalone.mjs` | بازنویسی زمان ساخت برای دایرکتوری خروجی مستقل که در مرحله هممکانسازی پس از ساخت استفاده میشود. این یک تنظیم زمان اجرا نیست. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(خالی)_ | `src/lib/cloudSync.ts` | راز مشترک مورداستفاده برای تأیید امضای HMAC-SHA256 پاسخهای همگامسازی ابری. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | برای اینکه نقطه پایانی همگامسازی ابری بتواند اعتبارنامههای محلی را بازنویسی کند، روی `true` تنظیم کنید. مقدار پیشفرض `false` است. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | برای رد کردن پاسخ بدون امضای همگامسازی ابری در زمانی که هیچ راز محلی پیکربندی نشده است، روی `true` تنظیم کنید (#13679). امضای موجود همواره تأیید میشود — و هنگامی که `OMNIROUTE_CLOUD_SYNC_SECRET` تنظیم نشده باشد، صرفنظر از این پرچم، همیشه رد میشود. از v3.9 به بعد، مقدار پیشفرض به حالت اجباری تغییر میکند. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | برای بازگشت به رفتار یکمرحلهای «وارد کردن همهچیز» در v3.8.5 بدون تأیید کاربر، روی `true` تنظیم کنید. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth، داشبورد، همگامسازی | نشانی URL عمومی برای redirect_uri مربوط به OAuth، پیوندهای داشبورد و URLهای عمومی تولیدشده. هنگامی که فراخوانیهای بازگشتی OAuth یا پیوندهای مرورگر تولیدشده باید از یک میزبان متعارف پراکسی معکوس استفاده کنند، این مقدار را روی URL عمومی پایدار تنظیم کنید. | +| `NEXT_PUBLIC_CLOUD_URL` | _(خالی)_ | سمت کلاینت | همتای سمت کلاینت `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(تنظیمنشده)_ | `src/shared/services/cloudSyncScheduler.ts` | گزینهٔ بازگشت قدیمی برای `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(تنظیمنشده)_ | حلکنندهٔ مبدأ عمومی، URLهای تصویر | مبدأ OmniRoute قابلمشاهده برای مرورگر با بالاترین اولویت که برای تولید URLهای عمومی و اعتبارسنجی مبدأ مرورگر خارج از داشبورد استفاده میشود. این مقدار را زمانی تنظیم کنید که OpenWebUI یا رلهای دیگر از طریق یک URL داخلی به OmniRoute دسترسی دارد، اما مرورگر کاربر باید رسانهٔ تولیدشده را از مبدأ LAN، تونل یا عمومی دریافت کند. `/v1` را **اضافه نکنید**. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(تنظیمنشده)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL مطلق مانیفست افزونهٔ ارائهدهنده که به کلاینتهای sidecar اعلام میشود. وقتی تنظیم نشده باشد، OmniRoute مسیر `/api/v1/provider-plugin-manifest` را از مبدأ درخواست یا HOST/PORT استخراج میکند. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | پروتکلی که هنگام استخراج URL مانیفست افزونهٔ ارائهدهنده از HOST/PORT بدون وجود مبدأ درخواست استفاده میشود. اگر `OMNIROUTE_PROVIDER_MANIFEST_URL` صریحی تنظیم نشده است، در پشت یک پراکسی عمومی خاتمهدهندهٔ TLS آن را روی `https` تنظیم کنید. | +| `OMNIROUTE_TRUST_PROXY` | _(تنظیمنشده)_ | `src/server/origin/publicOrigin.ts` | حالت اعتماد اختیاری برای هدرهای هدایتشدهٔ مبدأ عمومی. تنظیمنشده = برای تصمیمهای امنیتی به `Forwarded` / `X-Forwarded-*` اعتماد نکنید. `true` / `loopback` تنها از پراکسی loopback دارای مهر توکن به میزبان/پروتکل هدایتشده اعتماد میکند. `private` / `lan` به همتایان پراکسی LAN خصوصی نیز اعتماد میکند. در محیط عملیاتی، `NEXT_PUBLIC_BASE_URL` صریح را ترجیح دهید. | +| `KIE_CALLBACK_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | URL عمومی callback برای کارهای ناهمگام kie.ai. بازنویسی با بالاترین اولویت، پیش از `OMNIROUTE_KIE_CALLBACK_URL` و `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | نگارش جایگزین `KIE_CALLBACK_URL`. هنگامی که متغیر اصلی تنظیم نشده باشد، بهعنوان گزینهٔ بازگشت استفاده میشود. | +| `OMNIROUTE_PUBLIC_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | مبدأ عمومی مورداستفاده برای ساخت URLهای callback ناهمگام. گزینهٔ بازگشت با کمترین اولویت برای callbackهای kie.ai؛ همچنین بهعنوان یک URL عمومی کلی برای رلههای دیگر استفاده میشود. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | نقطهٔ پایانی جستوجوی سهمیهٔ CrofAI که صفحهٔ Usage از آن استفاده میکند. برای رلهها / دادههای آزمایشی بازنویسی کنید. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | نقطهٔ پایانی رسمی مصرف OpenCode Go با احراز هویت API key که صفحهٔ Usage از آن استفاده میکند. برای رلهها / دادههای آزمایشی بازنویسی کنید. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | هدرهای هویتی OpenCode CLI ‏(User-Agent، x-opencode-client/project و UUIDهای درخواست/نشست) را در درخواستهای بالادستی opencode-go/zen که کلاینت ارسال نکرده است تولید میکند تا Cloudflare آنها را در خروجی VPS بپذیرد (#6210/#5997). از #10571 بهطور پیشفرض فعال است؛ با `false`/`0`/`no`/`off` غیرفعالش کنید. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent پیشفرضی که وقتی `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است و بازنویسی اختصاصی `_USER_AGENT` برای هر ارائهدهنده تنظیم نشده، استفاده میشود. فقط روی اجراکنندههای opencode اعمال میشود. در یک درخواست بدون کلید که بالادست آن را محدود میکند، مقدار پیکربندیشدهای که شامل `opencode/= 1.17>` نباشد، بهجای رد شدن با این مقدار پیشفرض جایگزین میشود. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | مقدار هدر تولیدشدهٔ `x-opencode-client` هنگامی که `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | مقدار هدر ترکیبی `x-opencode-project` هنگامی که `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(تنظیمنشده)_ | `open-sse/executors/opencodeFreeTierContract.ts` | برای متوقفکردن تنظیم بدنهٔ درخواستهای OpenCode بدون کلید (پرچم استریم و فهرست ابزارها)، روی `off` تنظیم کنید. هدرها همچنان اعمال میشوند. این مقدار برای هر درخواست خوانده میشود، بنابراین تغییر آن بلافاصله اعمال میشود. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(تنظیمنشده)_ | `open-sse/executors/opencodeFreeTierContract.ts` | نام ابزارهایی با جداکنندهٔ ویرگول که باید در یک درخواست OpenCode بدون کلید و فاقد ابزار اعلام شوند، در صورتی که هنوز چیزی برای آن مدل مشاهده نشده باشد. مقدار خالی باعث استفاده از یک ابزار نگهدارندهٔ تکی میشود که به مدل گفته میشود آن را فراخوانی نکند. حداکثر ۳۲ ورودی با الگوی `[A-Za-z_][A-Za-z0-9_-]{0,63}`؛ ورودیهای نامعتبر نادیده گرفته میشوند. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | نشانی URL تنظیمات Ollama Cloud که برای استخراج سهمیه استفاده میشود. برای رلهها / دادههای آزمایشی بازنویسی کنید. | +| `OLLAMA_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | کوکی `__Secure-session` مربوط به Ollama Cloud که برای استخراج سهمیه از صفحهٔ تنظیمات استفاده میشود. حساس است؛ هنگامی که چند حساب پیکربندی شدهاند، فیلد مخصوص هر اتصال در داشبورد ترجیح داده میشود. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | متغیر محیطی جایگزین برای کوکی `__Secure-session` مربوط به Ollama Cloud. حساس است؛ هنگامی که چند حساب پیکربندی شدهاند، فیلد مخصوص هر اتصال در داشبورد ترجیح داده میشود. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | متغیر محیطی جایگزین برای کوکی `__Secure-session` مربوط به Ollama Cloud که پیش از نامهای مستعار کوتاهتر استفاده میشود. حساس است؛ هنگامی که چند حساب پیکربندی شدهاند، فیلد مخصوص هر اتصال در داشبورد ترجیح داده میشود. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | نقطهٔ پایانی محدودیتهای مصرف CodeWhisperer (AWS Kiro). برای رلهها / دادههای آزمایشی بازنویسی کنید. | > [!IMPORTANT] -> هنگام استقرار پشت یک پراکسی معکوس (nginx، Caddy)، در مواردی که callbackهای OAuth یا لینکهای عمومی تولیدشده باید از آن نام میزبان استفاده کنند، `NEXT_PUBLIC_BASE_URL` را روی URL عمومی و پایدار خود تنظیم کنید (برای مثال، `https://omniroute.example.com`). بدون این تنظیم، ممکن است callbackهای OAuth با شکست مواجه شوند، زیرا redirect_uri مطابقت نخواهد داشت و لینکهای عمومی تولیدشده ممکن است به origin داخلی کانتینر اشاره کنند. +> هنگام استقرار پشت یک پراکسی معکوس (nginx، Caddy)، اگر فراخوانهای برگشتی OAuth یا پیوندهای عمومی تولیدشده باید از آن نام میزبان استفاده کنند، `NEXT_PUBLIC_BASE_URL` را روی نشانی URL عمومی پایدار خود تنظیم کنید (برای مثال، `https://omniroute.example.com`). بدون این تنظیم، فراخوانهای برگشتی OAuth ممکن است ناموفق باشند، زیرا `redirect_uri` مطابقت نخواهد داشت و پیوندهای عمومی تولیدشده ممکن است به مبدأ داخلی کانتینر اشاره کنند. > -> `BASE_URL` را برای jobهای server-to-server بهصورت یک URL داخلی loopback/کانتینر نگه دارید. برای self-fetchهای داخلی حاوی اطلاعات احراز هویت، از `Origin` مرورگر یا نام میزبان عمومی استفاده نکنید. +> برای کارهای سروربهسرور، `BASE_URL` را بهصورت یک نشانی داخلی loopback/کانتینر نگه دارید. برای واکشیهای داخلی از خود سامانه که حاوی اطلاعات اعتباری هستند، از `Origin` مرورگر یا نام میزبان عمومی استفاده نکنید. > -> عملیات نوشتن احرازشده در داشبورد به URL پایه عمومی ثابت نیاز ندارند: داشبورد درخواستهای ناامن same-origin را همراه با یک توکن CSRF وابسته به session ارسال میکند. OmniRoute همچنان اعتبارسنجی origin عمومی را برای یکپارچهسازیهای مرورگری خارج از داشبورد بهصورت متمرکز انجام میدهد: ابتدا به متغیرهای محیطی صریحِ URL عمومی اعتماد میشود؛ هدرهای خام `Forwarded` / `X-Forwarded-*` نادیده گرفته میشوند، مگر اینکه `OMNIROUTE_TRUST_PROXY` فعال باشد و peer پراکسی مستقیم با یک توکن بهعنوان مورد اعتماد علامتگذاری شده باشد. برای رفع مشکل درخواستهای same-origin داشبورد از تنظیمات CORS استفاده نکنید؛ CORS فقط برای کلاینتهای مرورگری cross-origin است. +> نوشتنهای احراز هویتشدهٔ داشبورد به نشانی پایهٔ عمومی ثابت نیاز ندارند: داشبورد درخواستهای ناامن هممبدأ را همراه با یک توکن CSRF متصل به نشست ارسال میکند. OmniRoute همچنان اعتبارسنجی مبدأ عمومی را برای یکپارچهسازیهای مرورگری خارج از داشبورد متمرکز میکند: ابتدا به متغیرهای محیطی صریح نشانی URL عمومی اعتماد میشود؛ هدرهای خام `Forwarded` / `X-Forwarded-*` نادیده گرفته میشوند، مگر اینکه `OMNIROUTE_TRUST_PROXY` فعال باشد و همتای پراکسی بلافصل با توکن بهعنوان مورداعتماد علامتگذاری شده باشد. برای رفع مشکلات درخواستهای هممبدأ داشبورد از تنظیمات CORS استفاده نکنید؛ CORS فقط برای کلاینتهای مرورگری میانمبدأ است. --- @@ -586,49 +593,50 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude --- -## 11. اطلاعات احراز هویت ارائهدهنده OAuth - -اطلاعات احراز هویت داخلی برای **توسعه روی localhost**. برای استقرارهای راهدور، اطلاعات احراز هویت خود را در کنسول توسعهدهندگان هر ارائهدهنده ثبت کنید. - -| متغیر | ارائهدهنده | یادداشتها | -| --------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | کلاینت عمومی — نیازی به کلید محرمانه نیست. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | بازنویسی URI تغییر مسیر. پیشفرض: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | کلاینت عمومی. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | به `_SECRET` متناظر نیاز دارد. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | کلاینت عمومی. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | به `_SECRET` متناظر نیاز دارد. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | کلاینت عمومی. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | بازنویسی اختیاری شناسه کلاینت OAuth مربوط به GitHub Enterprise Copilot. اگر تنظیم نشده باشد، از مقدار عمومی پیشفرض `GITHUB_OAUTH_CLIENT_ID` استفاده میشود. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | کلید API جایگزین که وقتی اعتبارنامهای برای اتصال موجود نباشد، توسط `open-sse/executors/devin-cli.ts` استفاده میشود. اختیاری است. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | مسیر سفارشی فایل اجرایی Devin CLI (`devin`). توسط `open-sse/executors/devin-cli.ts` شناسایی میشود. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | شناسه کلاینت OAuth برای GitLab Duo. یک برنامه را در `https://gitlab.com/-/profile/applications` با URI تغییر مسیر `/callback` و محدودههای دسترسی `api, read_user, openid, profile, email` ثبت کنید. مقدار جایگزین آن `GITLAB_OAUTH_CLIENT_ID` است. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | کلید محرمانه کلاینت OAuth برای GitLab Duo. اختیاری — جریان PKCE به کلید محرمانه نیاز ندارد. مقدار جایگزین آن `GITLAB_OAUTH_CLIENT_SECRET` است. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | بازنویسی URL پایه GitLab برای GitLab خودمیزبان. مقدار پیشفرض `https://gitlab.com` است. مقدار جایگزین آن `GITLAB_BASE_URL` است. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | جایگزین قدیمی برای `GITLAB_DUO_BASE_URL`. وقتی نوع `_DUO_` تنظیم نشده باشد، استفاده میشود. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | جایگزین قدیمی برای `GITLAB_DUO_OAUTH_CLIENT_ID` که توسط `src/lib/oauth/constants/oauth.ts` مصرف میشود. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | جایگزین قدیمی برای `GITLAB_DUO_OAUTH_CLIENT_SECRET` که توسط `src/lib/oauth/constants/oauth.ts` مصرف میشود. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | برای فعالسازی OAuth مربوط به Qoder تنظیم کنید. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | کلید API مستقیم جایگزین که OAuth را دور میزند. | -| `QODER_CLI_WORKSPACE` | Qoder | شناسه فضای کاری برای Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | نام مستعار برای `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | بازنویسی پوشه پیکربندی Qoder CLI برای نشست PAT ایزوله، بهمنظور جلوگیری از بازنویسی ورود مرورگر. | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | توکن `tk` فرانتاند که بهعنوان `validated` در `/api/chat` ارسال میشود. وقتی Blackbox تطابق توکن را اجباری میکند، الزامی است؛ در غیر این صورت، OmniRoute از یک UUID تصادفی استفاده میکند. به مشکل #2252 مراجعه کنید. | -| `VISION_BRIDGE_BASE_URL` | محافظ Vision Bridge | URL پایه سازگار با OpenAI برای فراخوانیهای vision-bridge غیر Anthropic. مقدار پیشفرض، متغیر محیطی URL قدیمی OpenAI یا api.openai.com است. آن را به حلقه داخلی `/v1` در OmniRoute یا هر نقطه پایانی سازگار با OpenAI مانند Gemini OpenAI-compat یا OpenRouter اشاره دهید. مشکل #2232. وقتی URL همان `/v1` متعلق به OmniRoute باشد، زیردرخواست توصیف، `x-omniroute-admission-bypass: internal` را ارسال میکند و با اعتبارنامه شناساییشده حلقه داخلی احراز هویت میشود (`sk_omniroute` در حالت محلی، یا `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) تا استقرارهایی با `REQUIRE_API_KEY=true` کار کنند. | -| `VISION_BRIDGE_API_KEY` | محافظ Vision Bridge | کلید API برای URL بالا. متغیرهای محیطی OpenAI / Google مختص هر ارائهدهنده را برای فراخوانیهای vision-bridge غیر Anthropic بازنویسی میکند. مدلهای Anthropic همچنان از مسیر اختصاصی کلید Anthropic خود استفاده میکنند. مشکل #2232. | +## 11. اطلاعات احراز هویت ارائهدهندگان OAuth + +اطلاعات احراز هویت داخلی برای **توسعه روی localhost**. برای استقرارهای راهدور، اطلاعات احراز هویت اختصاصی خود را در کنسول توسعهدهندگان هر ارائهدهنده ثبت کنید. + +| متغیر | ارائهدهنده | توضیحات | +| --------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | کلاینت عمومی — نیازی به رمز نیست. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | بازنویسی URI تغییر مسیر. پیشفرض: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | کلاینت عمومی. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | به `_SECRET` متناظر نیاز دارد. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | کلاینت عمومی. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | به `_SECRET` متناظر نیاز دارد. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | کلاینت عمومی. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | بازنویسی اختیاری شناسه کلاینت OAuth مربوط به GitHub Enterprise Copilot. اگر تنظیم نشده باشد، از مقدار عمومی پیشفرض `GITHUB_OAUTH_CLIENT_ID` استفاده میکند. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | بازنویسی اختیاری شناسه یکپارچهسازی کلاینت GitHub Copilot که در هدرهای `Copilot-Integration-Id` و `Editor-Plugin-Version` ارسال میشود. مقدار پیشفرض `copilot-developer-cli` است. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | کلید API جایگزین که وقتی اطلاعات احراز هویت مختص اتصال موجود نباشد، توسط `open-sse/executors/devin-cli.ts` استفاده میشود. اختیاری است. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | مسیر سفارشی فایل اجرایی Devin CLI ‏(`devin`). توسط `open-sse/executors/devin-cli.ts` تفکیک میشود. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | شناسه کلاینت OAuth برای GitLab Duo. یک برنامه در `https://gitlab.com/-/profile/applications` با URI تغییر مسیر `/callback` و دامنههای دسترسی `api, read_user, openid, profile, email` ثبت کنید. در صورت نبود مقدار، از `GITLAB_OAUTH_CLIENT_ID` استفاده میکند. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | رمز کلاینت OAuth برای GitLab Duo. اختیاری است — جریان PKCE به رمز نیاز ندارد. در صورت نبود مقدار، از `GITLAB_OAUTH_CLIENT_SECRET` استفاده میکند. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | بازنویسی URL پایه GitLab (برای GitLab خودمیزبان). مقدار پیشفرض `https://gitlab.com` است. در صورت نبود مقدار، از `GITLAB_BASE_URL` استفاده میکند. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | مقدار جایگزین قدیمی برای `GITLAB_DUO_BASE_URL`. وقتی گونه `_DUO_` تنظیم نشده باشد، استفاده میشود. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | مقدار جایگزین قدیمی برای `GITLAB_DUO_OAUTH_CLIENT_ID` که توسط `src/lib/oauth/constants/oauth.ts` استفاده میشود. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | مقدار جایگزین قدیمی برای `GITLAB_DUO_OAUTH_CLIENT_SECRET` که توسط `src/lib/oauth/constants/oauth.ts` استفاده میشود. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | برای فعالکردن OAuth در Qoder تنظیم کنید. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | کلید API مستقیم جایگزین (OAuth را دور میزند). | +| `QODER_CLI_WORKSPACE` | Qoder | شناسه فضای کاری برای Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | نام مستعار `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | بازنویسی پوشه پیکربندی Qoder CLI (نشست PAT ایزوله، بدون اختلال در ورود مرورگر). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | توکن `tk` فرانتاند که بهصورت `validated` در `/api/chat` ارسال میشود. وقتی Blackbox تطبیق توکن را اجباری میکند، الزامی است؛ در غیر این صورت، OmniRoute از یک UUID تصادفی بهعنوان مقدار جایگزین استفاده میکند. مسئله #2252 را ببینید. | +| `VISION_BRIDGE_BASE_URL` | محافظ Vision Bridge | نشانی URL پایه سازگار با OpenAI برای فراخوانیهای vision-bridge غیر Anthropic. مقدار پیشفرض، متغیر محیطی قدیمی URL مربوط به OpenAI یا api.openai.com است. آن را به حلقه خودارجاع `/v1` متعلق به OmniRoute یا هر نقطه پایانی سازگار با OpenAI (Gemini OpenAI-compat، OpenRouter) اشاره دهید. مسئله #2232. وقتی URL همان `/v1` متعلق به OmniRoute باشد، زیردرخواست توصیف، `x-omniroute-admission-bypass: internal` را ارسال میکند و با اعتبارنامه حلشده حلقه خودارجاع (`sk_omniroute` بهعنوان مقدار نگهبان در حالت محلی، یا `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) احراز هویت میشود تا استقرارهایی با `REQUIRE_API_KEY=true` کار کنند. | +| `VISION_BRIDGE_API_KEY` | محافظ Vision Bridge | کلید API برای URL بالا. متغیرهای محیطی OpenAI / Google مختص هر ارائهدهنده را برای فراخوانیهای vision-bridge غیر Anthropic بازنویسی میکند. مدلهای Anthropic همچنان از مسیر اختصاصی کلید Anthropic خود استفاده میکنند. مسئله #2232. | > [!WARNING] > > 1. به [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) بروید > 2. یک شناسه کلاینت OAuth 2.0 ایجاد کنید (نوع: «برنامه وب») > 3. URL سرور خود را بهعنوان URI مجاز تغییر مسیر اضافه کنید -> 4. مقادیر اطلاعات احراز هویت را در `.env` جایگزین کنید. +> 4. مقادیر اعتبارنامه را در `.env` جایگزین کنید. --- @@ -729,132 +737,133 @@ process.env[`${PROVIDER_ID}_USER_AGENT`] --- -## ۱۵. تنظیمات مهلت زمانی +## 15. تنظیمات مهلت زمانی -تمام مقادیر بر حسب **میلیثانیه** هستند. منطق تعیین متمرکز مقادیر در `src/shared/utils/runtimeTimeouts.ts` قرار دارد. +همه مقادیر بر حسب **میلیثانیه** هستند. منطق متمرکز تعیین مقادیر در `src/shared/utils/runtimeTimeouts.ts` قرار دارد. ### سلسلهمراتب مهلتهای زمانی ``` REQUEST_TIMEOUT_MS (بازنویسی سراسری) ├─→ FETCH_TIMEOUT_MS (فراخوانیهای ارائهدهنده بالادستی، پیشفرض: 600000) -│ ├─→ FETCH_HEADERS_TIMEOUT_MS (از FETCH_TIMEOUT_MS به ارث میبرد) -│ ├─→ FETCH_BODY_TIMEOUT_MS (از FETCH_TIMEOUT_MS به ارث میبرد) -│ ├─→ TLS_CLIENT_TIMEOUT_MS (از FETCH_TIMEOUT_MS به ارث میبرد) +│ ├─→ FETCH_HEADERS_TIMEOUT_MS (از FETCH_TIMEOUT_MS ارثبری میکند) +│ ├─→ FETCH_BODY_TIMEOUT_MS (از FETCH_TIMEOUT_MS ارثبری میکند) +│ ├─→ TLS_CLIENT_TIMEOUT_MS (از FETCH_TIMEOUT_MS ارثبری میکند) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (مستقل، پیشفرض: 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (مستقل، پیشفرض: 15000) │ ├── FETCH_CONNECT_TIMEOUT_MS (مستقل، پیشفرض: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (مستقل، پیشفرض: 4000) -├─→ STREAM_IDLE_TIMEOUT_MS (از REQUEST_TIMEOUT_MS به ارث میبرد، پیشفرض: 600000) +├─→ STREAM_IDLE_TIMEOUT_MS (از REQUEST_TIMEOUT_MS ارثبری میکند، پیشفرض: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (مستقل، پیشفرض: 1260000؛ مقدار 0 آن را غیرفعال میکند) -├─→ STREAM_READINESS_TIMEOUT_MS (از REQUEST_TIMEOUT_MS به ارث میبرد، پیشفرض: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (افزایشهای تطبیقی مهلت آمادگی را محدود میکند، پیشفرض: 180000) -└─→ API_BRIDGE_PROXY_TIMEOUT_MS (از REQUEST_TIMEOUT_MS به ارث میبرد، پیشفرض: 30000) +├─→ STREAM_READINESS_TIMEOUT_MS (از REQUEST_TIMEOUT_MS ارثبری میکند، پیشفرض: 80000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (تمدیدهای تطبیقی آمادگی را محدود میکند، پیشفرض: 180000) +└─→ API_BRIDGE_PROXY_TIMEOUT_MS (از REQUEST_TIMEOUT_MS ارثبری میکند، پیشفرض: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (مشتقشده، پیشفرض: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (پیشفرض: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (پیشفرض: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (پیشفرض: 0 = غیرفعال) ``` -| متغیر | پیشفرض | توضیحات | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(تنظیمنشده)_ | میانبر سراسری — مقادیر پیشفرض هر دو متغیر `FETCH_TIMEOUT_MS` و `STREAM_IDLE_TIMEOUT_MS` را بازنویسی میکند. | -| `FETCH_TIMEOUT_MS` | `600000` | مهلت زمانی کل درخواست HTTP برای فراخوانی ارائهدهندگان بالادستی. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | حداکثر زمان سکوت میان بایتهای خام بالادستی پیش از لغو. مدلهای دارای تفکر گسترده بهندرت بیش از ۹۰ ثانیه مکث میکنند. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | حداکثر طول عمر کل جریان فعال SSE؛ با دریافت بایتهای بالادستی هرگز بازنشانی نمیشود و از `REQUEST_TIMEOUT_MS` مستقل است. این مقدار از بزرگترین `timeoutMs` مختص هر مدل در رجیستری (1200000، Codex)، بهعلاوه حاشیهای 60000، مشتق شده است تا مدلی که اجازه دارد از تمام بودجه زمانی خود استفاده کند، هرگز در میانه پاسخ متوقف نشود. برای غیرفعالسازی روی `0` تنظیم کنید. | -| `OMNIROUTE_SSE_COMMENTS` | _(غیرفعال)_ | تعیین میکند که آیا OmniRoute مجاز است خطوط توضیحی `:` در SSE منتشر کند یا خیر (برای مثال، ضربان `: keepalive` و تریلرهای فراداده `x-omniroute-*`). این قابلیت بهطور پیشفرض غیرفعال است (#10524)، زیرا کلاینتهای سختگیرِ سازگار با OpenAI هر خط SSE را با JSON.parse پردازش میکنند و در مواجهه با توضیحات `:` از کار میافتند؛ ضربانهای `data:` تحت تأثیر قرار نمیگیرند. برای فعالسازی مجدد، مقدار را روی `on`/`true`/`1`/`yes` تنظیم کنید. در `open-sse/utils/sseHeartbeat.ts` استفاده میشود. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | مدتزمان انتظار برای دریافت نخستین رویداد SSE غیر از ping. در صورت تنظیم بودن `REQUEST_TIMEOUT_MS`، مقدار آن را به ارث میبرد. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | حداکثر بازه تطبیقی آمادگی برای نخستین رویداد در درخواستهای جریانی بزرگ، متکی بر ابزار، یا دارای استدلال زیاد. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | کلید توقف اضطراری برای روش اکتشافی `/goal`. برای غیرفعالسازی کامل تشخیص، مقدار را روی `false`/`0`/`off` تنظیم کنید — مهلتهای آمادگی و بازیابی جریان هرگز بر اساس بدنه درخواست یا سرآیندها افزایش نمییابند؛ در نتیجه، تقویت مهلت زمانی تحت کنترل کلاینت کاهش مییابد. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | حداکثر بازه آمادگی نخستین رویداد برای اجرای عاملهای `/goal` تشخیصدادهشده یا درخواستهایی که با `x-omniroute-agent-goal` اجباری شدهاند. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | بازیابی زودهنگام جریان را بهصورت خودکار برای اجرای عاملهای `/goal` تشخیصدادهشده فعال میکند. برای غیرفعالسازی این انتخاب مختص هدف، مقدار را روی `false`/`0`/`off` تنظیم کنید. این گزینه فقط میتواند بازیابی را به تنظیم پیشفرض اپراتور اضافه کند — هرگز انصراف صریح از طریق `STREAM_RECOVERY_ENABLED` یا تنظیمات DB را بازنویسی نمیکند. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | رویدادهای غیراستاندارد `codex.*` در SSE (برای مثال، `codex.rate_limits`) را که باعث شکست `responses.stream()` در SDK مربوط به OpenAI با خطای 502 میشوند، حذف میکند. بهطور پیشفرض روشن است (#11014). برای ارسال آنها، مقدار را روی `0`/`false`/`no`/`off` تنظیم کنید. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(تنظیمنشده)_ | انتقال اختیاری app-server برای Codex. نقطه پایانی WebSocket (`ws://`/`wss://`) یک سایدکار محلی `codex app-server`. وقتی همراه با یک توکن تنظیم شود، درخواستهای Codex بهجای API پاسخهای HTTP، از طریق JSON-RPC به سایدکار هدایت میشوند. همچنین میتوان آن را برای هر اتصال از طریق `providerSpecificData.codexAppServerUrl` تنظیم کرد. در `open-sse/executors/codex/appServerConfig.ts` استفاده میشود. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(تنظیمنشده)_ | توکن قابلیت/حامل درونخطی که به app-server ارائه میشود. بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(تنظیمنشده)_ | مسیر فایلی که توکن قابلیت app-server را نگهداری میکند (از `codex app-server --ws-token-file`). هنگامی استفاده میشود که `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` تنظیم نشده باشد. بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | دایرکتوری کاری که نوبت app-server در آن اجرا میشود. بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(تنظیمنشده)_ | خطمشی تأییدی که به نوبت app-server ارسال میشود (برای مثال، `never` یا `on-request`). بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(تنظیمنشده)_ | خطمشی سندباکس که به نوبت app-server ارسال میشود (برای مثال، `read-only`، `workspace-write` یا `danger-full-access`). در صورت تنظیمنبودن، اجراکننده بهطور پیشفرض از `workspace-write` استفاده میکند (ایمنسازیشده؛ قبلاً `danger-full-access`). بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | درخواستهای تأیید خود app-server را بهطور خودکار تأیید میکند (اجرای فرمان/فایل/مجوز روی میزبان). بهطور پیشفرض خاموش است — درخواستها بهطور خودکار رد میشوند؛ فراخوانیهای ابزار هارنس تحت تأثیر قرار نمیگیرند (آنها از مسیر عبوری جداگانه `item/tool/call` منتقل میشوند). مقادیر `true`/`1`/`yes` را میپذیرد. بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | مدتزمان انتظار برای دریافت سرآیندهای پاسخ. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (۳۰ ثانیه) | حداکثر زمان انتظار برای شروع پاسخ (میلیثانیه) در هر تلاش مستقیم و بدون پراکسی. در صورت پایان مهلت، یکبار دیگر با یک سوکت جدید تلاش میشود؛ برای غیرفعالکردن این محدودیت و حفظ رفتار قبلی، مقدار `0` را تنظیم کنید. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | زمان دریافت کامل بدنه پاسخ. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | مهلت برقراری اتصال TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | مهلت بیکاری سوکت keep-alive. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | مهلت پراکسی اثرانگشت TLS ‏(wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | زمان رسیدن به نخستین بایت را، مشخصاً برای بدنه انتقال اثرانگشت TLS مبتنی بر wreq-js، محدود میکند؛ `TLS_CLIENT_TIMEOUT_MS` بهتنهایی نمیتواند توقف بدنه را تشخیص دهد، زیرا بهمحض رسیدن هدرها نهایی میشود (#12656). پایان مهلت، خواننده wreq را لغو میکند و به توزیعکننده مستقیم/پراکسی بازمیگردد؛ `0` ناظر را غیرفعال میکند. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | فقط برای اجراکننده OpenCode و تنها زمانی که پرچم قابلیت `OPENCODE_RESPONSES_STALL_ROTATION` فعال باشد (بهطور پیشفرض غیرفعال است): انتظار برای نخستین بایت بدنه یک پاسخ جریانی Responses پس از هدرهای آن را محدود میکند (#13484). جریان Responses با `response.created` باز میشود؛ بنابراین سکوت فراتر از این بازه بهمعنای توقف است: حساب وارد دوره انتظار میشود و درخواست یکبار به حساب بعدی منتقل میگردد؛ توقف دوم بلافاصله شکست میخورد. `0` حتی در صورت فعالبودن پرچم نیز این محافظ را غیرفعال میکند. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | مهلت گام پراکسی برای درخواستهای پل `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | اجراکننده واکشی وب Firecrawl را به یک نمونه خودمیزبان هدایت میکند (کلید API خارج از سرویس ابری اختیاری است). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | مهلت هر درخواست برای اجراکننده واکشی وب Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | مهلت کلی درخواست سرور برای پل. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | زمان ارسال هدرهای پاسخ از طریق پل. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | مهلت بیکاری keep-alive پل. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | مهلت سوکت خام (0 = غیرفعال). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | دوره مهلت پس از SIGTERM/SIGINT پیش از خروج اجباری. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | مقدار جایگزینی که `src/shared/utils/fetchTimeout.ts` هنگام تنظیمنبودن `FETCH_TIMEOUT_MS` استفاده میکند. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | مهلت (میلیثانیه) برای پیشتنظیمهای `validationRead` و `modelsProbe` در `src/shared/network/safeOutboundFetch.ts`. برای نقاط پایانی کند (Cerebras، Cloudflare AI، Groq) این مقدار را افزایش دهید تا از جابهجایی مکرر وضعیت میان فعال/خطا در داشبورد جلوگیری شود. برای مقادیر نامعتبر (کمتر از 1000) یا غیرعددی، مقدار جایگزین 8000ms استفاده میشود. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | مهلت واکشی مختص رله در `open-sse/utils/proxyFetch.ts` ‏(#9158). رله متوقفشده باید پیش از مهلت کلاینت/عامل (~30s) شکست بخورد تا فراخوانها بهجای خطای عمومی پایان مهلت بالادست، خطای مختص رله را مشاهده کنند. این مقدار به `29000` محدود میشود تا همیشه زودتر فعال گردد. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | تأخیر بازگشتی مشترک تلاش مجدد برای مسیرهای یکبار تلاش مجدد مستقیم/رله/پراکسی در `open-sse/utils/proxyFetch.ts` ‏(#9158). `0` = تلاش مجدد فوری. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | مهلت درخواست بومی wreq-js ‏(`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | مهلت ارفاقی برای ضربالاجل سخت و مطلق JS که به مهلت بومی افزوده میشود. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | مهلت درخواست بومی wreq-js ‏(`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | مهلت ارفاقی برای ضربالاجل سخت و مطلق JS که به مهلت بومی افزوده میشود. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (خاموش) | عبارت «شما قابلیت جستوجوی داخلی وب را دارید. با استفاده از نتایج جستوجو مستقیماً به پرسشها پاسخ دهید.» را به پیام سیستمی فراخواننده اضافه میکند (`perplexity-web/protocol.ts`). بهطور پیشفرض خاموش است — Perplexity در هر صورت جستوجو میکند و این جمله در پاسخها بهصورت توضیحی فرامتنی برای کلاینتهای برنامهنویسی ظاهر میشود. برای بازیابی این رفتار، آن را روی `1`/`true`/`yes`/`on` تنظیم کنید. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | مهلت زمانی درخواست بومی wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | مهلت ارفاقی قطعی JS که به مهلت زمانی بومی افزوده میشود. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | مهلت زمانی درخواست بومی wreq-js (`notionTlsClient.ts`)؛ `notion-web` برای تولیدهای طولانی، آن را در هر درخواست به `180000` افزایش میدهد. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | مهلت ارفاقی قطعی JS که به مهلت زمانی بومی افزوده میشود. | -| `OMNIROUTE_BROWSER_POOL` | `on` | مخزن مرورگر اشتراکی Playwright برای گفتوگوی کوکی وب مبتنی بر مرورگر (`browserPool.ts`)؛ برای غیرفعالسازی، روی `off` تنظیم کنید. | -| `OBSCURA_BIN` | `auto-detect` | مسیر فایل اجرایی `obscura` که بهعنوان موتور اصلی توسط مخزن مرورگر و اجراکننده Cloudflare Playground استفاده میشود (`open-sse/services/obscura.ts`)؛ اگر تنظیم نشده باشد، بهطور خودکار از PATH سیستم شناسایی میشود. | -| `OBSCURA_CDP_ENDPOINT` | _(تنظیمنشده)_ | بهجای راهاندازی یک نمونه جدید، به یک Obscura ازپیشدرحالاجرا (`http://host:port`) اشاره کنید؛ ماژول مالک آن فرایند نیست (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | پورت صریح برای `obscura serve` راهاندازیشده؛ اگر تنظیم نشده باشد، یک پورت آزاد بهطور خودکار انتخاب میشود (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | یک درخواست گفتوگوی کوکی وب را برای استفاده از مسیر مبتنی بر مرورگر فعال میکند (`browserBackedChat.ts`)؛ برای فعالسازی، روی `1` تنظیم کنید. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | نشانی URL پایه برای اجراکننده Kimi Web (رابط بینالمللی kimi.ai Connect-RPC) (`kimi-web.ts`)؛ فقط برای نقاط پایانی آینه/پروکسی بازنویسی کنید. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | نقطه پایانی کامل گفتوگو برای اجراکننده Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(شناسایی خودکار)_ | مسیر فایل اجرایی Chrome/Edge سیستم برای ورود تعاملی Adobe Firefly از طریق مرورگر (`adobeFireflyBrowserLogin.ts`)؛ شناسایی خودکار مختص هر سیستمعامل را بازنویسی میکند. | -| `OMNIROUTE_STANDALONE_DIR` | _خروجی مستقل .build/_ | بازنویسی زمان ساخت برای دایرکتوری خروجی مستقل که در مرحله هممکانسازی پس از ساخت استفاده میشود (`scripts/build/colocate-standalone.mjs`)؛ مربوط به ابزارهای ساخت است، نه زمان اجرا. | - -تلاشهای مقصد ترکیبی، مهلت زمانی حلشده درخواست بالادستی را به ارث میبرند (`FETCH_TIMEOUT_MS`، یا -`REQUEST_TIMEOUT_MS` هنگامی که مقدار پیشفرض fetch را تأمین میکند). `targetTimeoutMs` را در یک ترکیب، -مقادیر پیشفرض ترکیب یا بازنویسی ارائهدهنده فقط برای سریعتر کردن بازگشت به مقصد جایگزین تنظیم کنید؛ مقادیر بیشتر از +| متغیر | پیشفرض | توضیحات | +| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(تنظیمنشده)_ | میانبر سراسری — پیشفرضهای `FETCH_TIMEOUT_MS` و `STREAM_IDLE_TIMEOUT_MS` را بازنویسی میکند. | +| `FETCH_TIMEOUT_MS` | `600000` | مهلت زمانی کل درخواست HTTP برای فراخوانیهای ارائهدهندهٔ بالادستی. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | حداکثر سکوت بین بایتهای خام بالادستی پیش از لغو. مدلهای دارای تفکر توسعهیافته بهندرت بیش از 90 ثانیه مکث میکنند. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | حداکثر طول عمر فعال کل جریان SSE؛ با دریافت بایتهای بالادستی هرگز بازنشانی نمیشود و مستقل از `REQUEST_TIMEOUT_MS` است. این مقدار از بزرگترین `timeoutMs` مختص هر مدل در رجیستری (1200000، Codex) بهاضافهٔ حاشیهٔ 60000 بهدست آمده است تا مدلی که اجازه دارد تمام بودجهٔ زمانی خود را مصرف کند، هرگز در میانهٔ پاسخ متوقف نشود. برای غیرفعالکردن، آن را روی `0` تنظیم کنید. | +| `OMNIROUTE_SSE_COMMENTS` | _(غیرفعال)_ | مشخص میکند که آیا OmniRoute میتواند خطوط توضیحی SSE با `:` منتشر کند یا خیر (برای مثال، ضربان `: keepalive` و تریلرهای فرادادهٔ `x-omniroute-*`). بهطور پیشفرض غیرفعال است (#10524)، زیرا کلاینتهای سختگیرِ سازگار با OpenAI هر خط SSE را با JSON.parse پردازش میکنند و در برخورد با توضیحات `:` از کار میافتند؛ ضربانهای `data:` تحت تأثیر نیستند. برای فعالسازی مجدد، مقدار را روی `on`/`true`/`1`/`yes` تنظیم کنید. توسط `open-sse/utils/sseHeartbeat.ts` استفاده میشود. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | زمان انتظار برای دریافت نخستین رویداد SSE غیر از ping. در صورت تنظیمبودن `REQUEST_TIMEOUT_MS`، مقدار آن را به ارث میبرد. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | حداکثر بازهٔ تطبیقی آمادگی برای نخستین رویداد در درخواستهای جریانی بزرگ، ابزارمحور یا دارای استدلال زیاد. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | کلید توقف اضطراری برای روش اکتشافی `/goal`. برای غیرفعالکردن کامل تشخیص، مقدار را روی `false`/`0`/`off` تنظیم کنید — مهلتهای آمادگی و بازیابی جریان هرگز بر اساس بدنه یا سرآیندهای درخواست افزایش نمییابند و بدین ترتیب، تشدید مهلت زمانی تحت کنترل کلاینت کاهش مییابد. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | حداکثر بازهٔ آمادگی نخستین رویداد برای اجرای عاملهای `/goal` تشخیصدادهشده یا درخواستهایی که با `x-omniroute-agent-goal` اجبار شدهاند. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | بازیابی زودهنگام جریان را بهطور خودکار برای اجرای عاملهای `/goal` تشخیصدادهشده فعال میکند. برای غیرفعالکردن فعالسازی مختص goal، مقدار را روی `false`/`0`/`off` تنظیم کنید. این گزینه فقط میتواند بازیابی را علاوه بر پیشفرض اپراتور اضافه کند — هرگز انصراف صریح از طریق `STREAM_RECOVERY_ENABLED` یا تنظیمات DB را بازنویسی نمیکند. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | رویدادهای SSE غیراستاندارد `codex.*` (برای مثال، `codex.rate_limits`) را که باعث شکست `responses.stream()` در SDK مربوط به OpenAI با خطای 502 میشوند، حذف میکند. بهطور پیشفرض روشن است (#11014). برای عبوردادن آنها، مقدار را روی `0`/`false`/`no`/`off` تنظیم کنید. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(تنظیمنشده)_ | انتقال اختیاری app-server مربوط به Codex. نقطهٔ پایانی WebSocket (`ws://`/`wss://`) برای یک سایدکار محلی `codex app-server`. وقتی این مقدار همراه با یک توکن تنظیم شود، درخواستهای Codex بهجای HTTP Responses API، از طریق JSON-RPC به سایدکار هدایت میشوند. همچنین میتوان آن را برای هر اتصال از طریق `providerSpecificData.codexAppServerUrl` تنظیم کرد. توسط `open-sse/executors/codex/appServerConfig.ts` استفاده میشود. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(تنظیمنشده)_ | توکن capability/bearer درونخطی که به app-server ارائه میشود. بازنویسی برای هر اتصال: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(تنظیمنشده)_ | مسیر فایلی که توکن capability مربوط به app-server را نگه میدارد (از `codex app-server --ws-token-file`). هنگامی استفاده میشود که `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` تنظیم نشده باشد. بازنویسی برای هر اتصال: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | دایرکتوری کاری که نوبت app-server در آن اجرا میشود. بازنویسی برای هر اتصال: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(تنظیمنشده)_ | سیاست تأییدی که به نوبت app-server ارسال میشود (برای مثال، `never`، `on-request`). بازنویسی برای هر اتصال: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(تنظیمنشده)_ | سیاست sandbox که به نوبت app-server ارسال میشود (برای مثال، `read-only`، `workspace-write`، `danger-full-access`). در صورت تنظیمنبودن، مجری بهطور پیشفرض از `workspace-write` استفاده میکند (سختسازیشده؛ در گذشته `danger-full-access`). بازنویسی برای هر اتصال: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | درخواستهای تأیید خود app-server را بهطور خودکار تأیید میکند (اجرای فرمان/فایل/مجوز روی میزبان). بهطور پیشفرض خاموش است — درخواستها بهطور خودکار رد میشوند؛ فراخوانیهای ابزار harness تحت تأثیر نیستند (آنها از مسیر عبوری جداگانهٔ `item/tool/call` منتقل میشوند). مقادیر `true`/`1`/`yes` را میپذیرد. بازنویسی برای هر اتصال: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | زمان انتظار برای دریافت سرآیندهای پاسخ. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 ثانیه) | حداکثر زمان انتظار برای شروع پاسخ (میلیثانیه) در هر تلاش مستقیم و بدون پراکسی. در صورت پایان مهلت، یک بار دیگر با یک سوکت جدید تلاش میشود؛ برای غیرفعالکردن این محدودیت و حفظ رفتار قبلی، مقدار را روی `0` تنظیم کنید. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 دقیقه) | سقف زمانی (میلیثانیه) برای تلاش RETRY با سوکت جدید، پس از پایان مهلت شروع پاسخ در تلاش مبتنی بر اتصال تجمیعشده در بالا (#13703). فقط زمانی اعمال میشود که فراخواننده از قبل سیگنال مهلت مختص به خود را متصل کرده باشد (زنجیرهٔ اتصال/مدل/ارائهدهنده/`FETCH_TIMEOUT_MS` حلشده)؛ آن سیگنال محدودیت واقعی است و در مسیر موردنظر زودتر فعال میشود، بنابراین این مقدار بهجای یک سقف ثابت، یک محافظ پشتیبان سخاوتمندانه است — بدون آن، تلاش مجدد همان بازهٔ کوتاه `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` مربوط به تلاش تجمیعشده را دوباره استفاده میکرد و مدلهای استدلالی سالم با TTFB آهسته را با خطای 504 مواجه میساخت. این مقدار هرگز نمیتواند از حداقل ثابت بالا کمتر باشد؛ وقتی فراخواننده هیچ سیگنال مهلتی ارائه نمیکند، تلاش مجدد همان حداقل ثابت را بدون تغییر حفظ میکند. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | زمان دریافت کامل بدنهٔ پاسخ. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | مهلت برقراری اتصال TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | مهلت بیکاری سوکت keep-alive. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | مهلت پراکسی اثرانگشت TLS ‏(wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | بهطور مشخص زمان رسیدن اولین بایت در بدنهٔ انتقال اثرانگشت TLS مربوط به wreq-js را محدود میکند؛ `TLS_CLIENT_TIMEOUT_MS` بهتنهایی نمیتواند بدنهٔ متوقفشده را تشخیص دهد، زیرا بهمحض رسیدن هدرها تکمیل میشود (#12656). پایان مهلت، خوانشگر wreq را لغو میکند و به توزیعکنندهٔ مستقیم/پراکسی برمیگردد؛ `0` این ناظر را غیرفعال میکند. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | فقط برای اجراکنندهٔ OpenCode و تنها هنگامی که پرچم قابلیت `OPENCODE_RESPONSES_STALL_ROTATION` روشن باشد (بهطور پیشفرض خاموش است): زمان انتظار برای اولین بایت بدنهٔ پاسخ جریانی Responses پس از دریافت هدرهای آن را محدود میکند (#13484). جریان Responses با `response.created` باز میشود، بنابراین سکوت فراتر از این بازه بهمعنای توقف است: حساب وارد دورهٔ سردشدن میشود و درخواست یک بار به حساب بعدی منتقل میگردد؛ توقف دوم فوراً با شکست مواجه میشود. `0` حتی در صورت روشنبودن پرچم، این محافظ را غیرفعال میکند. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | مهلت گام پراکسی برای درخواستهای پل `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | اجراکنندهٔ واکشی وب Firecrawl را به یک نمونهٔ خودمیزبان هدایت میکند (کلید API خارج از فضای ابری اختیاری است). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | مهلت هر درخواست برای اجراکنندهٔ واکشی وب Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | مهلت کلی درخواست سرور برای پل. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | زمان ارسال هدرهای پاسخ از طریق پل. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | مهلت بیکاری keep-alive پل. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | مهلت سوکت خام (`0` = غیرفعال). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | دورهٔ مهلت پس از SIGTERM/SIGINT پیش از خروج اجباری. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | مقدار جایگزین مورد استفادهٔ `src/shared/utils/fetchTimeout.ts` هنگامی که `FETCH_TIMEOUT_MS` تنظیم نشده باشد. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | مهلت (میلیثانیه) برای پیشتنظیمهای `validationRead` و `modelsProbe` در `src/shared/network/safeOutboundFetch.ts`. برای نقاط پایانی کند (Cerebras، Cloudflare AI، Groq) آن را افزایش دهید تا از جابهجایی مکرر میان وضعیتهای فعال/خطا در داشبورد جلوگیری شود. برای مقادیر نامعتبر (کمتر از 1000) یا غیرعددی، مقدار جایگزین 8000 میلیثانیه استفاده میشود. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | مهلت واکشی مختص رله در `open-sse/utils/proxyFetch.ts` ‏(#9158). یک رلهٔ متوقفشده باید پیش از مهلت کلاینت/عامل (حدود 30 ثانیه) شکست بخورد تا فراخوانندگان بهجای مهلت عمومی بالادست، خطایی مختص رله مشاهده کنند. این مقدار به `29000` محدود شده است تا همیشه زودتر فعال شود. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | وقفهٔ مشترک تلاش مجدد برای مسیرهایی که یک بار تلاش مستقیم/رله/پراکسی را در `open-sse/utils/proxyFetch.ts` تکرار میکنند (#9158). `0` = تلاش مجدد فوری. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | مهلت زمانی درخواست بومی wreq-js ‏(`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | مهلت ارفاقی مطلق برای ضربالاجل سخت JS که به مهلت زمانی بومی افزوده میشود. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | مهلت زمانی درخواست بومی wreq-js ‏(`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | مهلت ارفاقی مطلق برای ضربالاجل سخت JS که به مهلت زمانی بومی افزوده میشود. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (خاموش) | عبارت «شما جستوجوی داخلی وب دارید. با استفاده از نتایج جستوجو مستقیماً به پرسشها پاسخ دهید.» را به پیام سیستمی فراخواننده اضافه میکند (`perplexity-web/protocol.ts`). بهطور پیشفرض خاموش است—Perplexity در هر صورت جستوجو میکند و این جمله در پاسخهای کلاینتهای برنامهنویسی بهشکل توضیحات فرامتنی نشت میکند. برای بازیابی آن، مقدار را روی `1`/`true`/`yes`/`on` تنظیم کنید. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | مهلت زمانی درخواست بومی wreq-js ‏(`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | مهلت ارفاقی مطلق برای ضربالاجل سخت JS که به مهلت زمانی بومی افزوده میشود. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | مهلت زمانی درخواست بومی wreq-js ‏(`notionTlsClient.ts`)؛ `notion-web` برای تولیدهای طولانی، آن را در هر درخواست به `180000` افزایش میدهد. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | مهلت ارفاقی مطلق برای ضربالاجل سخت JS که به مهلت زمانی بومی افزوده میشود. | +| `OMNIROUTE_BROWSER_POOL` | `on` | مخزن مرورگر مشترک Playwright برای گفتوگوی مبتنی بر کوکی وب با پشتوانه مرورگر (`browserPool.ts`)؛ برای غیرفعالسازی، آن را روی `off` تنظیم کنید. | +| `OBSCURA_BIN` | `auto-detect` | مسیر فایل اجرایی `obscura` که بهعنوان موتور اصلی توسط مخزن مرورگر و اجراکننده Cloudflare Playground استفاده میشود (`open-sse/services/obscura.ts`)؛ اگر تنظیم نشده باشد، بهطور خودکار از PATH سیستم شناسایی میشود. | +| `OBSCURA_CDP_ENDPOINT` | _(تنظیمنشده)_ | بهجای راهاندازی یک نمونه جدید، به یک Obscura در حال اجرا (`http://host:port`) اشاره میکند؛ ماژول مالک آن فرایند نیست (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `درگاه آزاد تصادفی` | درگاه صریح برای `obscura serve` راهاندازیشده؛ اگر تنظیم نشده باشد، یک درگاه آزاد بهطور خودکار انتخاب میشود (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | یک درخواست گفتوگوی مبتنی بر کوکی وب را برای استفاده از مسیر با پشتوانه مرورگر فعال میکند (`browserBackedChat.ts`)؛ برای فعالسازی از `1` استفاده کنید. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | نشانی پایه برای اجراکننده Kimi Web ‏(Connect-RPC بینالمللی kimi.ai) ‏(`kimi-web.ts`)؛ فقط برای نقاط پایانی آینه/پروکسی بازنویسی کنید. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | نقطه پایانی کامل گفتوگو برای اجراکننده Kimi Web ‏(`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(شناسایی خودکار)_ | مسیر فایل اجرایی Chrome/Edge سیستم برای ورود تعاملی Adobe Firefly در مرورگر (`adobeFireflyBrowserLogin.ts`)؛ شناسایی خودکار مختص هر سیستمعامل را بازنویسی میکند. | +| `OMNIROUTE_STANDALONE_DIR` | _خروجی مستقل .build/_ | بازنویسی زمان ساخت برای دایرکتوری خروجی مستقل که در مرحله هممکانسازی پس از ساخت استفاده میشود (`scripts/build/colocate-standalone.mjs`)؛ مربوط به ابزارهای ساخت است، نه زمان اجرا. | + +تلاشهای مقصد ترکیبی، مهلت زمانی حلشده درخواست بالادستی (`FETCH_TIMEOUT_MS`، یا +`REQUEST_TIMEOUT_MS` هنگامی که مقدار پیشفرض fetch را فراهم میکند) را به ارث میبرند. تنها برای سریعتر کردن +بازگشت جایگزین ترکیبی، `targetTimeoutMs` را در یک ترکیب، مقادیر پیشفرض ترکیب یا بازنویسی ارائهدهنده تنظیم کنید؛ مقادیر بالاتر از مهلت زمانی فعلی بالادستی، به همان مهلت زمانی بالادستی محدود میشوند. -`comboTimeoutMs` یک بودجه زمانی جداگانه برای کل ترکیب بر اساس ساعت واقعی و در میان مقصدهای جایگزین است. -برای حفظ تکرار نامحدود، آن را تنظیمنشده باقی بگذارید یا روی `0` تنظیم کنید (توقف اضطراری ۱۰ دقیقهای -`COMBO_LOOP_SAFETY_TIMEOUT_MS` همچنان اعمال میشود). یک مقدار مثبت، آن -سازوکار ایمنی را برای ترکیب جایگزین میکند. `comboTimeoutMs` را بیشتر از `targetTimeoutMs` نگه دارید تا پس از -کند بودن مقصد اول، همچنان برای انتقال به مقصد جایگزین زمان باقی بماند. +`comboTimeoutMs` یک بودجه زمانی مستقل برای کل ترکیب بر اساس ساعت واقعی است که تمام مقصدهای جایگزین را پوشش میدهد. +برای حفظ تکرار نامحدود، آن را تنظیمنشده بگذارید یا روی `0` قرار دهید (توقف ایمنی ۱۰ دقیقهای +`COMBO_LOOP_SAFETY_TIMEOUT_MS` برای هنگکردن همچنان اعمال میشود). یک مقدار مثبت، آن +سازوکار ایمنی را برای ترکیب جایگزین میکند. `comboTimeoutMs` را بیشتر از `targetTimeoutMs` نگه دارید تا بازگشت جایگزین +پس از کند بودن مقصد اول همچنان فرصت اجرا داشته باشد. ### آستانههای قطعکننده مدار -تنظیم قطعکننده مدار در سطح ارائهدهنده. مقادیر پیشفرض، مقادیر مقیاسبندیشدهای را منعکس میکنند که از v3.6 برای بیش از 500 اتصال استفاده شدهاند. - -| متغیر | مقدار پیشفرض | فایل منبع | توضیحات | -| ------------------------------------------------------------- | ------------ | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | آستانهٔ خطاهای متوالی برای ارائهدهندگان OAuth پیش از فعالشدن قطعکننده. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای قطعکنندهٔ ارائهدهندهٔ OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | آستانهٔ خطاهای متوالی برای ارائهدهندگان مبتنی بر کلید API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای قطعکنندهٔ ارائهدهندهٔ مبتنی بر کلید API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | آستانهٔ خطاهای متوالی برای ارائهدهندگان محلی (Ollama، LM Studio و ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای قطعکنندهٔ ارائهدهندهٔ محلی. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: تعداد خطاها درون بازه، پیش از آنکه کل ارائهدهندهٔ OAuth وارد دورهٔ انتظار شود. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: بازهٔ لغزان شمارش خطاها (میلیثانیه) برای ارائهدهندگان OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ OAuth به آستانه. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | ارائهدهندهٔ OAuth پس از این تعداد خطا وارد وضعیت DEGRADED میشود. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | حداکثر ضریب افزایش resetTimeout برای ارائهدهندهٔ OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | ارائهدهندهٔ OAuth پس از این تعداد چرخهٔ باز، سطح تأخیر را افزایش میدهد. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: تعداد خطاها درون بازه، پیش از آنکه کل ارائهدهندهٔ مبتنی بر کلید API وارد دورهٔ انتظار شود. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: بازهٔ لغزان شمارش خطاها (میلیثانیه) برای ارائهدهندگان مبتنی بر کلید API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ مبتنی بر کلید API به آستانه. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | ارائهدهندهٔ مبتنی بر کلید API پس از این تعداد خطا وارد وضعیت DEGRADED میشود. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | حداکثر ضریب افزایش resetTimeout برای ارائهدهندهٔ مبتنی بر کلید API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | ارائهدهندهٔ مبتنی بر کلید API پس از این تعداد چرخهٔ باز، سطح تأخیر را افزایش میدهد. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: تعداد خطاها پیش از آنکه کل ارائهدهندهٔ محلی وارد دورهٔ انتظار شود. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: بازهٔ لغزان شمارش خطاها (میلیثانیه) برای ارائهدهندگان محلی. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | قطعکننده در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ محلی به آستانه. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | عمق عقبنشینی که در آن ارائهدهندهٔ پینِ حافظهٔ نهان زمینه، بهطور پایدار ناسالم تلقی میشود و پین برای تغییر مسیر در زمان خرابی حذف میگردد. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | بازهٔ ضدنوسان (میلیثانیه) که دورههای انتظار گذرای کوتاه را پیش از حذف پینِ حافظهٔ نهان زمینه تحمل میکند. | +تنظیم قطعکننده مدار در سطح ارائهدهنده. مقادیر پیشفرض، مقادیر مقیاسشدهای را منعکس میکنند که از v3.6 برای بیش از ۵۰۰ اتصال استفاده شدهاند. + +| متغیر | مقدار پیشفرض | فایل منبع | توضیحات | +| ------------------------------------------------------------- | ------------ | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | آستانهٔ خطاهای متوالی برای ارائهدهندگان OAuth پیش از فعالشدن مدارشکن. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای مدارشکن ارائهدهندهٔ OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | آستانهٔ خطاهای متوالی برای ارائهدهندگان مبتنی بر کلید API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای مدارشکن ارائهدهندهٔ مبتنی بر کلید API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | آستانهٔ خطاهای متوالی برای ارائهدهندگان محلی (Ollama، LM Studio و ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای مدارشکن ارائهدهندهٔ محلی. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: تعداد خطاها درون بازه، پیش از آنکه کل ارائهدهندهٔ OAuth وارد دورهٔ انتظار شود. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: بازهٔ لغزان شمارش خطا (میلیثانیه) برای ارائهدهندگان OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ OAuth به آستانه. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | ارائهدهندهٔ OAuth پس از این تعداد خطا وارد وضعیت DEGRADED میشود. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | حداکثر ضریب افزایش resetTimeout برای ارائهدهندهٔ OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | ارائهدهندهٔ OAuth پس از این تعداد چرخهٔ باز، سطح تأخیر را افزایش میدهد. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: تعداد خطاها درون بازه، پیش از آنکه کل ارائهدهندهٔ مبتنی بر کلید API وارد دورهٔ انتظار شود. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: بازهٔ لغزان شمارش خطا (میلیثانیه) برای ارائهدهندگان مبتنی بر کلید API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ مبتنی بر کلید API به آستانه. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | ارائهدهندهٔ مبتنی بر کلید API پس از این تعداد خطا وارد وضعیت DEGRADED میشود. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | حداکثر ضریب افزایش resetTimeout برای ارائهدهندهٔ مبتنی بر کلید API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | ارائهدهندهٔ مبتنی بر کلید API پس از این تعداد چرخهٔ باز، سطح تأخیر را افزایش میدهد. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: تعداد خطاها پیش از آنکه کل ارائهدهندهٔ محلی وارد دورهٔ انتظار شود. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: بازهٔ لغزان شمارش خطا (میلیثانیه) برای ارائهدهندگان محلی. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ محلی به آستانه. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | عمق عقبنشینی که در آن ارائهدهندهٔ پینِ حافظهٔ نهان زمینه، بهطور پایدار ناسالم تلقی میشود و پین برای انتقال به ارائهدهندهٔ جایگزین حذف میشود. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | بازهٔ ضدنوسان (میلیثانیه) برای تحمل دورههای انتظار گذرای کوتاه، پیش از حذف پینِ حافظهٔ نهان زمینه. | ### سناریوها @@ -863,7 +872,7 @@ REQUEST_TIMEOUT_MS (بازنویسی سراسری) | **تولید کد طولانیمدت** | `REQUEST_TIMEOUT_MS=900000` (15 دقیقه) | | **محدودکردن طول عمر کل جریان** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 دقیقه) | | **شکست سریع برای API محیط عملیاتی** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **مدلهای دارای تفکر گسترده** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 دقیقه بین قطعهها) | +| **مدلهای استدلال توسعهیافته** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 دقیقه بین قطعهها) | --- @@ -1112,100 +1121,101 @@ STREAM_HISTORY_MAX=10 ## 21. سلامت پراکسی -| متغیر | پیشفرض | فایل منبع | توضیحات | -| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | مهلت زمانی بررسی سلامت برای شکست سریع. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | بازه زمانی (برحسب ساعت) برای محاسبه میانگین تأخیر پراکسیهای نامزد در راهبرد استخر بهینهشده برای تأخیر. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL کش نتایج بررسی سلامت. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL کش برای کاوشهای ناموفق سلامت پراکسی. این مقدار را کوتاهتر از `PROXY_HEALTH_CACHE_TTL_MS` نگه دارید تا مهلتهای زمانی گذرای پراکسی در همزمانی بالا، بدون غیرفعالکردن شکست سریع برای پراکسیهای واقعاً ازکارافتاده، بهسرعت دوباره امتحان شوند. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | برای غیرفعالکردن زمانبند پسزمینه سلامت پراکسی که بهصورت دورهای پراکسیهای ثبتشده را کاوش میکند، روی `false` تنظیم کنید. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | فاصله پیمایش زمانبند سلامت پسزمینه برحسب میلیثانیه (حداقل `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | هدف کاوش دسترسیپذیری که توسط زمانبند و نقطه پایانی `/api/settings/proxies/auto-test` استفاده میشود. برای اجتناب از مقدار پیشفرض عمومی، آن را روی یک URL داخلی/خودمیزبان تنظیم کنید. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | تعداد کاوشهایی که در هر دسته بهطور همزمان آغاز میشوند و میان زمانبند و نقطه پایانی `/api/settings/proxies/auto-test` مشترکاند. حد پایین 1 و حد بالا 50 است. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | تأخیر برحسب میلیثانیه میان ارسال دو کاوش درون یک دسته. بدون آن، کل دسته در یک لحظه ارسال میشود و یک IP خروجی مشترک میتواند محدودیت نرخ هدف را فعال کند. برای غیرفعالکردن فاصلهگذاری، روی `0` تنظیم کنید؛ سقف آن 5000 است. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | برای متوقفکردن کاوش میزبان واقعی ارائهدهنده تخصیصیافته به پراکسی (`GET /models`، بدون کلید API) و استفاده همیشگی از `PROXY_HEALTH_TEST_URL` بهجای آن، روی `false` تنظیم کنید. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | وقتی `false` باشد (پیشفرض)، کاوشهای خودکار دسترسیپذیری (زمانبند + دکمه «آزمایش همه» در `/api/settings/proxies/auto-test`) **فقطخواندنی** هستند و هرگز وضعیت پراکسی را تغییر نمیدهند — فقط اپراتور حالت فعال/غیرفعال را تعیین میکند؛ بنابراین یک کاوش ناپایدار نمیتواند پراکسی تخصیصیافته را بلااستفاده کند (#6246). برای بازگرداندن رفتار قدیمیِ آزمایش و تنظیم، روی `true` قرار دهید. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | پرچم ویژگی انتخابی (به [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) مراجعه کنید؛ بازنویسی DB داشبورد اولویت دارد). مقدار `true` (یا `1`، `yes`) مشاهده فقطخواندنی خروجی استخر را زیر یک استخر پراکسی در داشبورد نمایش میدهد (IPهای خروجی متمایز، اتصالها و بیشترین تعداد مشاهدهشده پشت یک IP طی 24 ساعت گذشته، برگرفته از گزارش پراکسی). هرگز برای مسیریابی استفاده نمیشود. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | برای اینکه زمانبند پس از شکستهای متوالی و تکراری، پراکسیها را بهطور خودکار حذف کند، روی `true` تنظیم کنید. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | تعداد شکستهای متوالی پیش از آنکه زمانبند یک پراکسی را بهطور خودکار حذف کند (وقتی `PROXY_AUTO_REMOVE=true` باشد). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | برای اینکه زمانبند پس از شکستهای متوالی و تکراری، بهجای حذف پراکسی آن را بهصورت نرم غیرفعال کند (وضعیت `dead`، بدون حذفشدن)، روی `true` تنظیم کنید. جایگزینی غیرمخرب برای `PROXY_AUTO_REMOVE`: پراکسی بلافاصله از فرایند تفکیک استخر/چرخش خارج میشود (فیلتر وضعیت زنده که تفکیک استخر دامنه از آن استفاده میکند، از قبل آن را کنار میگذارد) و بهمحض موفقشدن دوباره کاوشها، خودکار فعال میشود. آستانه `PROXY_AUTO_REMOVE_AFTER` را بهاشتراک میگذارد. اگر هر دو پرچم `true` باشند، `PROXY_AUTO_REMOVE` اولویت دارد. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | به جریانهای اعتبارسنجی OAuth و ارائهدهنده اجازه میدهد وقتی پیشبررسیهای دسترسیپذیری پراکسی شکست میخورند، پراکسی سنجاقشده را دور بزنند و مستقیماً متصل شوند. ترتیب اولویت مؤثر عبارت است از: بازنویسی DB پرچمهای ویژگی > متغیر محیطی > پیشفرض. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 ثانیه) | `open-sse/services/rateLimitManager.ts` | حداکثر زمان انتظار برای پاسخ 429 پیش از ناموفق اعلامکردن درخواست. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 دقیقه) | `open-sse/services/rateLimitManager.ts` | سقف زمانی که یک درخواست پذیرفتهشده میتواند پیش از انقضای رزرو محدودیت نرخ خود در حال اجرا بماند — مستقل از بودجه انتظار صف، تا شروع کند واکشی در درگاههای غیرتدریجی موجب پایان مهلت نشود (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (غیرفعال) | `open-sse/services/rateLimitManager.ts` | سقف پذیرش صف: وقتی این تعداد درخواست از قبل در صف باشند، با خطای 429 و `queue_full` رد میشود. `0` = نامحدود (پیشفرض). | -| `RATE_LIMIT_AUTO_ENABLE` | _(تنظیمنشده)_ | `open-sse/services/rateLimitManager.ts` | بدون توجه به تنظیم ذخیرهشده داشبورد، شبکه ایمنی محدودیت نرخ با فعالسازی خودکار را بهاجبار روشن/خاموش میکند. برای روشنکردن اجباری، `true`/`1`/`on` و برای خاموشکردن اجباری، `false`/`0`/`off` را میپذیرد. | -| `PROVIDER_COOLDOWN_ENABLED` | _(تنظیمنشده → خاموش)_ | `open-sse/services/providerCooldownTracker.ts` | ردیابی انتخابی و سراسریِ دوره انتظار ارائهدهنده/اتصال میان درخواستها. بهطور پیشفرض خاموش است (با دوره انتظار اتصال / مدارشکن ارائهدهنده همپوشانی دارد). برای فعالسازی، `true`/`1`/`on` را میپذیرد. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | حداقل دوره انتظار (میلیثانیه) پیش از تلاش مجدد برای ارائهدهنده/اتصال ناموفق. با شکستهای متوالی بهصورت نمایی افزایش مییابد. فقط وقتی `PROVIDER_COOLDOWN_ENABLED` فعال است استفاده میشود. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 دقیقه) | `open-sse/services/providerCooldownTracker.ts` | سقف حداکثر دوره انتظار (میلیثانیه) پیش از تلاش مجدد برای ارائهدهنده/اتصال ناموفق، فارغ از شرایط دیگر. فقط وقتی `PROVIDER_COOLDOWN_ENABLED` فعال است استفاده میشود. | -| `STREAM_RECOVERY_ENABLED` | _(تنظیمنشده → خاموش)_ | `src/lib/resilience/settings.ts` (مقداردهی اولیه) → `open-sse/services/streamRecovery.ts` (منطق) | **چیستی:** بازیابی شفاف جریانهای بالادستی قطعشده (درگاه free-claude-code). پنجره آغازین SSE را تا `STREAM_RECOVERY.HOLDBACK_MS` (750 میلیثانیه) نگه میدارد تا قطعیِ _پیش از ثبت_ — قطعیای که پیش از رسیدن هر بایت به کارخواه رخ میدهد — دوباره باز و بهطور نامرئی تکرار شود. **زمان فعالسازی:** برای بالادستیهای ناپایدار که در آغاز جریان مرتباً با صفر بایت قطع میشوند؛ اگر نمیتوانید افزایش حداکثر 750 میلیثانیهای زمان رسیدن نخستین توکن در هر جریان را بپذیرید، آن را خاموش نگه دارید. `true`/`1`/`on` را میپذیرد. تنظیم ذخیرهشده تابآوری را مقداردهی اولیه میکند؛ پس از تنظیم، گزینه داشبورد اولویت دارد. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(تنظیمنشده → خاموش)_ | `src/lib/resilience/settings.ts` (مقداردهی اولیه) → `open-sse/services/streamRecovery.ts` (منطق) | **چیستی:** ادامه میانجریان (مرحله 4.4) — پس از قطعشدن _پس از ثبت_ (بایتها از قبل به کارخواه رسیدهاند)، با متن ناقص بهعنوان پیشپرکنی دستیار، دوباره درخواست میدهد و پسوند ازدسترفته را پیوند میزند. فقط برای جریانهای متن ساده سازگار با OpenAI؛ وقتی فراخوانی ابزار در حال اجرا باشد، هرگز فعال نمیشود. **زمان فعالسازی:** برای تولیدهای طولانی که در میانه پاسخ قطع میشوند و میپذیرید دنباله بازیابیشده بهجای توکنبهتوکن، یکباره برسد. مستقل از `STREAM_RECOVERY_ENABLED` است (نمایه ریسک متفاوت). `true`/`1`/`on` را میپذیرد. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(تنظیمنشده → خاموش)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | پایشگر انتخابی خروجی مفید جریان فعال. جریانهایی را شناسایی میکند که همچنان قطعه میفرستند اما نرخ خروجی دستیار آنها کمتر از مقدار پیکربندیشده باقی میماند؛ ضربانهای حیات، رویدادهای مصرف، دلتاهای خالی و مراحل ابزار/استدلال بهاشتباه پیشرفت محسوب نمیشوند. جدا از مهلتهای زمانی بیکاری و ضربالاجل قطعی است. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | دوره مهلت پیش از ارزیابی گذردهی، محدود به 0 تا 600000 میلیثانیه. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | پنجره لغزان خروجی مفید، محدود به 1000 تا 600000 میلیثانیه؛ پیش از توقف، یک پنجره کامل لازم است. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | حداقل نرخ بایت UTF-8 خروجی دستیار (نماینده محافظهکارانه توکن)، محدود به 1 تا 1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | حداقل نمونه غیرصفر خروجی مفید که قابل اندازهگیری محسوب میشود، محدود به 1 تا 1000000 بایت. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | فاصله پلکانی (میلیثانیه) میان بررسیهای سلامت توکن ارائهدهنده هنگام راهاندازی. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | حداقل نوسان تصادفی (میلیثانیه) که برای جلوگیری از ارسال انفجاری، میان بررسیهای سلامت توکن ارائهدهنده به `HEALTHCHECK_STAGGER_MS` افزوده میشود (مسئله #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | حداکثر نوسان تصادفی (میلیثانیه) که برای جلوگیری از ارسال انفجاری، میان بررسیهای سلامت توکن ارائهدهنده به `HEALTHCHECK_STAGGER_MS` افزوده میشود (مسئله #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | اندازه دسته بررسیهای همزمان برای پیمایش بررسی سلامت توکن هنگام راهاندازی؛ مقادیر بزرگتر اتصالهای بیشتری را بهصورت موازی بررسی میکنند و مقادیر کوچکتر بار انفجاری را کاهش میدهند (مسئله #7875، پسرفت #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | تعداد تلاشهای مجدد خودکار در پاسخهای دوره انتظار محدود به مدل، پیش از بازگرداندن خطا به کارخواه. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | حداکثر فاصله عقبنشینی (ثانیه) میان تلاشهای مجدد دوره انتظار. صرفنظر از `Retry-After` بالادستی، به این مقدار محدود میشود. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL پراکسی صرفهجویی در توکن Headroom. چرخهعمر داشبورد (`api/headroom/*`) بهطور پیشفرض یک CLI محلی `headroom-ai` را روی رابط حلقه بازگشتی اجرا میکند؛ فقط برای اشاره به یک پراکسی سایدکار Docker خارجی، آن را بازنویسی کنید. | - -### ثابتهای تنظیم بازیابی جریان - -رفتار نگهداشت بازیابی با ثابتهای هاردکدشده در -`open-sse/config/constants.ts` (`STREAM_RECOVERY`) تنظیم میشود که برای ارجاع در اینجا آمدهاند — -تغییر آنها مستلزم ویرایش کد است، نه استفاده از یک متغیر محیطی: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — مدتزمانی که پنجره آغازین SSE نگه داشته میشود - تا در صورت قطع زودهنگام، پیش از ارسال قطعی هر بایتی به کلاینت، امکان تلاش مجدد وجود داشته باشد. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — سقف قطعی پنجره نگهداشتهشده؛ بهمحض انباشتهشدن +| متغیر | مقدار پیشفرض | فایل منبع | توضیحات | +| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | مهلت زمانی بررسی سلامت برای شکست سریع. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | بازه زمانی (برحسب ساعت) برای محاسبه میانگین تأخیر پراکسیهای نامزد در راهبرد مجموعه بهینهشده برای تأخیر. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL حافظه پنهان نتیجه بررسی سلامت. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL حافظه پنهان برای کاوشهای ناموفق سلامت پراکسی. این مقدار را کوتاهتر از `PROXY_HEALTH_CACHE_TTL_MS` نگه دارید تا در صورت بروز مهلتهای زمانی گذرای پراکسی تحت همزمانی بالا، تلاش مجدد بهسرعت انجام شود، بدون اینکه شکست سریع برای پراکسیهای واقعاً ازکارافتاده غیرفعال شود. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | برای غیرفعالکردن زمانبند پسزمینه سلامت پراکسی که بهصورت دورهای پراکسیهای ثبتشده را بررسی میکند، آن را روی `false` تنظیم کنید. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | فاصله زمانی پیمایش زمانبند پسزمینه سلامت برحسب میلیثانیه (حداقل `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | هدف کاوش دسترسیپذیری که توسط زمانبند و نقطه پایانی `/api/settings/proxies/auto-test` استفاده میشود. برای اجتناب از مقدار پیشفرض عمومی، آن را روی یک URL داخلی/خودمیزبان تنظیم کنید. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | تعداد کاوشهایی که در هر دسته بهطور همزمان آغاز میشوند و میان زمانبند و نقطه پایانی `/api/settings/proxies/auto-test` مشترک هستند. حداقل آن 1 و حداکثر آن 50 است. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | تأخیر بر حسب میلیثانیه بین آغاز دو کاوش درون یک دسته. بدون آن، کل دسته در یک لحظه ارسال میشود و یک IP خروجی مشترک میتواند محدودیت نرخ هدف را فعال کند. برای غیرفعالکردن فاصلهگذاری، آن را روی `0` تنظیم کنید؛ حداکثر مقدار 5000 است. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | برای متوقفکردن کاوش میزبان واقعی ارائهدهنده تخصیصیافته به پراکسی (`GET /models`، بدون کلید API) و استفاده همیشگی از `PROXY_HEALTH_TEST_URL` بهجای آن، مقدار را روی "false" تنظیم کنید. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | وقتی مقدار `false` است (پیشفرض)، کاوشهای خودکار دسترسیپذیری (زمانبند + دکمه «آزمایش همه» در `/api/settings/proxies/auto-test`) **فقطخواندنی** هستند و هرگز وضعیت پراکسی را تغییر نمیدهند — فقط اپراتور وضعیت فعال/غیرفعال را تعیین میکند، بنابراین یک کاوش ناپایدار نمیتواند پراکسی تخصیصیافته را بلااستفاده کند (#6246). برای بازگرداندن رفتار قدیمیِ آزمایش و تنظیم وضعیت، مقدار را روی `true` تنظیم کنید. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | پرچم قابلیت اختیاری (به [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) مراجعه کنید؛ مقدار بازنویسیشده در پایگاه داده داشبورد اولویت دارد). مقدار `true` (یا `1`، `yes`) مشاهده فقطخواندنی خروجی مجموعه پراکسی را زیر یک مجموعه پراکسی در داشبورد نمایش میدهد (IPهای خروجی متمایز، اتصالها و بیشترین تعداد مشاهدهشده پشت یک IP طی 24 ساعت گذشته، بر اساس گزارش پراکسی). هرگز برای مسیریابی استفاده نمیشود. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | برای اینکه زمانبند پس از چند شکست متوالی، پراکسیها را بهطور خودکار حذف کند، مقدار را روی `true` تنظیم کنید. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | تعداد شکستهای متوالی پیش از آنکه زمانبند یک پراکسی را بهطور خودکار حذف کند (وقتی `PROXY_AUTO_REMOVE=true` است). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | روی `true` تنظیم کنید تا زمانبند پس از شکستهای متوالی و تکرارشونده، یک پراکسی را بهصورت نرم غیرفعال کند (وضعیت `dead`، بدون حذف شدن)، بهجای آنکه آن را حذف کند. جایگزینی غیرمخرب برای `PROXY_AUTO_REMOVE`: پراکسی بلافاصله از تفکیک استخر/چرخش خارج میشود (فیلتر وضعیت فعال که در تفکیک استخرِ محدوده استفاده میشود، از قبل آن را مستثنا میکند) و بهمحض اینکه دوباره بررسیها را با موفقیت پشت سر بگذارد، بهطور خودکار فعال میشود. از آستانه `PROXY_AUTO_REMOVE_AFTER` بهصورت مشترک استفاده میکند. اگر هر دو پرچم `true` باشند، `PROXY_AUTO_REMOVE` اولویت دارد. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | به جریانهای اعتبارسنجی OAuth و ارائهدهنده اجازه میدهد وقتی پیشبررسیهای دسترسیپذیری پراکسی ناموفق هستند، پراکسی سنجاقشده را دور بزنند و مستقیماً متصل شوند. ترتیب اولویت مؤثر عبارت است از: بازنویسی پایگاه داده Feature Flags > متغیر محیطی > مقدار پیشفرض. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (۳۰ ثانیه) | `src/lib/resilience/settings.ts` | بودجه پیشفرض **انتظار در صف**: مدتزمانی که یک درخواست میتواند برای یک جایگاه ارائهدهنده منتظر بماند و پیش از رد شدن در صف باقی بماند، بدون آنکه هرگز به بالادست برسد. پس از شروع اجرای کار، زمانسنج پاک میشود — اجرای آن بهطور جداگانه توسط `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` محدود میشود. متغیر محیطی فقط مقدار پیشفرض را تعیین میکند: ابتدا `resilienceSettings.requestQueue.maxWaitMs` ذخیرهشده و سپس `rateLimitOverrides.maxWaitMs` مختص هر اتصال، هرکدام بر آن اولویت دارند. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (۱۰ دقیقه) | `open-sse/services/rateLimitManager.ts` | سقف مدتزمانی که یک درخواست پذیرفتهشده میتواند پیش از انقضای رزرو محدودیت نرخ خود در حال اجرا بماند — این مقدار از بودجه انتظار در صف جدا شده است تا شروع کند واکشی در درگاههای غیرتدریجی منقضی نشود (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (غیرفعال) | `open-sse/services/rateLimitManager.ts` | سقف پذیرش صف: وقتی این تعداد درخواست از قبل در صف هستند، با خطای 429 و `queue_full` رد شود. `0` = بدون محدودیت (پیشفرض). | +| `RATE_LIMIT_AUTO_ENABLE` | _(تنظیمنشده)_ | `open-sse/services/rateLimitManager.ts` | شبکه ایمنی محدودیت نرخ با فعالسازی خودکار را، صرفنظر از تنظیم ذخیرهشده داشبورد، بهاجبار روشن/خاموش میکند. مقادیر `true`/`1`/`on` برای اجبار به روشن بودن و `false`/`0`/`off` برای اجبار به خاموش بودن پذیرفته میشوند. | +| `PROVIDER_COOLDOWN_ENABLED` | _(تنظیمنشده ← خاموش)_ | `open-sse/services/providerCooldownTracker.ts` | ردیابی سراسری و بیندرخواستی زمان انتظار ارائهدهنده/اتصال بهصورت انتخابی. بهطور پیشفرض خاموش است (با زمان انتظار اتصال / مدارشکن ارائهدهنده همپوشانی دارد). برای فعالسازی، مقادیر `true`/`1`/`on` پذیرفته میشوند. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | حداقل زمان انتظار (میلیثانیه) پیش از تلاش مجدد برای ارائهدهنده/اتصال ناموفق. این مدت با شکستهای متوالی بهصورت نمایی افزایش مییابد. فقط زمانی استفاده میشود که `PROVIDER_COOLDOWN_ENABLED` فعال باشد. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 دقیقه) | `open-sse/services/providerCooldownTracker.ts` | حداکثر سقف دوره انتظار (میلیثانیه) پیش از تلاش مجدد برای ارائهدهنده/اتصال ناموفق، صرفنظر از شرایط. فقط زمانی استفاده میشود که `PROVIDER_COOLDOWN_ENABLED` فعال باشد. | +| `STREAM_RECOVERY_ENABLED` | _(تنظیمنشده ← غیرفعال)_ | `src/lib/resilience/settings.ts` (مقداردهی اولیه) → `open-sse/services/streamRecovery.ts` (منطق) | **چیست:** بازیابی شفاف جریانهای بالادستی ناقص (پورت free-claude-code). پنجره آغازین SSE را تا `STREAM_RECOVERY.HOLDBACK_MS` (750 میلیثانیه) نگه میدارد تا قطعی _پیش از تثبیت_ — قطعیای که پیش از رسیدن هرگونه بایت به کلاینت رخ میدهد — دوباره باز شده و بهصورت نامرئی تلاش مجدد انجام شود. **چه زمانی فعال شود:** برای بالادستیهای ناپایدار/بالادستیهایی که اغلب در شروع جریان با صفر بایت قطع میشوند؛ اگر نمیتوانید افزودن حداکثر 750 میلیثانیه به زمان دریافت نخستین توکن در هر جریان را بپذیرید، آن را غیرفعال نگه دارید. مقادیر `true`/`1`/`on` را میپذیرد. مقدار اولیه تنظیم ماندگار Resilience را تعیین میکند؛ پس از تنظیم گزینه Dashboard، مقدار آن اولویت دارد. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(تنظیمنشده ← غیرفعال)_ | `src/lib/resilience/settings.ts` (مقداردهی اولیه) → `open-sse/services/streamRecovery.ts` (منطق) | **چیست:** ادامه جریان در میانه آن (Fase 4.4) — پس از یک قطعی _پس از تثبیت_ (بایتها از قبل به کلاینت رسیدهاند)، با استفاده از متن جزئی بهعنوان پیشپرکننده دستیار، درخواست دوباره ارسال و پسوند ازدسترفته به آن متصل میشود. فقط برای جریانهای متن ساده سازگار با OpenAI؛ هنگام اجرای فراخوانی ابزار هرگز فعال نمیشود. **چه زمانی فعال شود:** برای تولیدهای طولانی که در میانه پاسخ قطع میشوند و میپذیرید بخش بازیابیشده بهجای توکنبهتوکن، یکباره دریافت شود. مستقل از `STREAM_RECOVERY_ENABLED` است (نمایه ریسک متفاوت). مقادیر `true`/`1`/`on` را میپذیرد. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(تنظیمنشده ← غیرفعال)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ناظر اختیاری خروجی مفید جریان فعال. جریانهایی را شناسایی میکند که همچنان قطعهها را ارسال میکنند، اما نرخ خروجی دستیار آنها پایینتر از مقدار پیکربندیشده باقی میماند؛ سیگنالهای حیات، رویدادهای مصرف، دلتاهای خالی و مراحل ابزار/استدلال بهاشتباه پیشرفت تلقی نمیشوند. مستقل از مهلتهای عدم فعالیت و ضربالاجل قطعی است. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | مهلت اولیه پیش از ارزیابی توان عملیاتی که به بازه 0–600000 میلیثانیه محدود میشود. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | پنجره لغزان خروجی مفید که به بازه 1000–600000 میلیثانیه محدود میشود؛ پیش از لغو، یک پنجره کامل لازم است. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | حداقل نرخ بایت خروجی UTF-8 دستیار (تقریب محافظهکارانه توکن) که به بازه 1–1000000 محدود میشود. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | حداقل نمونه غیرصفر خروجی مفید که قابلاندازهگیری تلقی میشود و به بازه 1–1000000 بایت محدود است. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | فاصله زمانی پلکانی (میلیثانیه) میان بررسیهای سلامت توکن ارائهدهندگان هنگام راهاندازی. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | حداقل تأخیر تصادفی (میلیثانیه) که برای جلوگیری از هجوم ناگهانی، میان بررسیهای سلامت توکن ارائهدهندگان به `HEALTHCHECK_STAGGER_MS` افزوده میشود (Issue #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | حداکثر تأخیر تصادفی (میلیثانیه) که برای جلوگیری از هجوم ناگهانی، میان بررسیهای سلامت توکن ارائهدهندگان به `HEALTHCHECK_STAGGER_MS` افزوده میشود (Issue #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | اندازهٔ دستهٔ بررسیهای همزمان برای پیمایش بررسی سلامت توکن هنگام راهاندازی؛ مقادیر بزرگتر اتصالهای بیشتری را بهصورت موازی بررسی میکنند و مقادیر کوچکتر بار ناگهانی را کاهش میدهند (Issue #7875، پسرفتِ #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | تعداد تلاشهای مجدد خودکار در پاسخهای دورهٔ انتظارِ محدود به مدل، پیش از بازگرداندن خطا به کلاینت. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | حداکثر فاصلهٔ عقبنشینی (برحسب ثانیه) میان تلاشهای مجدد دورهٔ انتظار. صرفنظر از مقدار بالادستی `Retry-After`، به این مقدار محدود میشود. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL پراکسی صرفهجویی در توکن Headroom. چرخهٔ حیات داشبورد (`api/headroom/*`) بهطور پیشفرض یک CLI محلی `headroom-ai` را روی رابط loopback اجرا میکند؛ این مقدار را فقط برای اشاره به یک پراکسی sidecar خارجی Docker بازنویسی کنید. | + +### ثابتهای تنظیم بازیابی استریم + +رفتار نگهداری بازیابی با ثابتهای کدنویسیشده در +`open-sse/config/constants.ts` (`STREAM_RECOVERY`) تنظیم میشود که برای مرجع در اینجا نشان داده شدهاند — +تغییر آنها به ویرایش کد نیاز دارد، نه یک متغیر محیطی: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — مدتزمانی که پنجرهٔ آغازین SSE نگه داشته میشود + تا در صورت قطع زودهنگام، پیش از ارسال قطعی هر بایت به کلاینت بتوان دوباره تلاش کرد. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — سقف قطعی پنجرهٔ نگهداشتهشده؛ بهمحض انباشتهشدن این تعداد بایت، صرفنظر از تایمر، ارسال قطعی (تخلیه + عبور مستقیم) انجام میشود. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — حداکثر تعداد بازگشاییهای شفاف جریان بالادستی - تا زمانی که دادههای نگهداشتهشده هنوز بهطور قطعی ارسال نشدهاند. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — حداکثر تعداد بازگشاییهای شفاف استریم بالادستی + تا زمانی که دادههای نگهداشتهشده هنوز بهصورت قطعی ارسال نشدهاند. -> **محدودیت نرخ پنجره لغزان بهازای هر ارائهدهنده (بدون متغیر محیطی):** سازوکار -> _جایگزین_ محدودیت نرخ پنجره لغزان بهازای هر ارائهدهنده که از FCC منتقل شده، در کد وجود دارد +> **محدودیت نرخ پنجرهٔ لغزان بهازای هر ارائهدهنده (بدون متغیر محیطی):** سازوکار _جایگزینِ_ +> محدودیت نرخ پنجرهٔ لغزان بهازای هر ارائهدهنده که از FCC منتقل شده، در کد وجود دارد > (`open-sse/services/providerDefaultRateLimit.ts`، متصلشده از طریق > `open-sse/services/rateLimitManager.ts`)، اما با یک **نگاشت پیشفرض خالی** عرضه میشود -> و در حال حاضر **هیچ متغیر محیطی برای اپراتور ندارد** — این قابلیت فقط از طریق یک هوک آزمایشی / -> ویرایش کد فعال میشود. این مورد عمداً در جدول بالا فهرست نشده است. محدودکننده رله بهازای -> `(token, IP)` که _دارای_ گزینه تنظیم است، `RELAY_IP_PER_MINUTE` (§3 شبکه و پورتها) است. +> و در حال حاضر **هیچ متغیر محیطی برای اپراتور ندارد** — فقط از طریق یک قلاب آزمایشی / +> ویرایش کد فعال میشود. عمداً در جدول بالا فهرست نشده است. محدودکنندهٔ رله بهازای هر `(token, IP)` +> که _دارای_ گزینهٔ تنظیم است، `RELAY_IP_PER_MINUTE` است (§3 شبکه و درگاهها). --- ## 22. اشکالزدایی > [!CAUTION] -> این متغیرها **خروجی مفصل** تولید میکنند و ممکن است باعث افشای دادههای حساس شوند. **هرگز آنها را در محیط تولید فعال نکنید.** - -| متغیر | پیشفرض | فایل منبع | توضیحات | -| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | برای فعالکردن گزارشهای مفصل اجراکننده Cursor (قطعههای SSE رمزگشاییشده و غیره)، آن را روی `1` تنظیم کنید. | -| `CURSOR_STREAM_DEBUG` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | نام مستعار سازگار با نسخههای قبلی برای `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | مسیر فایل اختیاری که وقتی `CURSOR_DEBUG=1` باشد، قطعههای خام رمزگشاییشده Cursor را دریافت میکند. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | مهلت عدم فعالیت جریان (میلیثانیه) برای اجراکننده Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | بازه ارفاقی (میلیثانیه) پس از خاتمهدهنده نرم composer kv_after_text، هنگامی که هنوز بایتهایی در بافر باقی ماندهاند — به فراخوانی ابزار exec_mcp انتهایی فرصت میدهد قاب خود را تکمیل کند. | -| `CURSOR_TOOL_DIRECTIVE` | فعال (`!== "0"`) | `open-sse/executors/cursor.ts` | دستورالعمل ثبت ابزار که باعث میشود composer-2.5 فراخوانیهای ابزار را بهشکل قابلاعتماد صادر کند. برای غیرفعالکردن، آن را روی `0` تنظیم کنید. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(تنظیمنشده)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | متن اعلان سیستمی تعریفشده توسط اپراتور که پس از ترجمه به پیام سیستم افزوده میشود (تزریق پس از ترجمه) و به مسیرهای codex/Responses و `/v1/messages` میرسد. همچنین بهعنوان پیشوند دستورالعملی استفاده میشود که از بلوکهای مقدمه سیستمی بازتابیافته حذف میگردد. برای غیرفعالماندن، آن را تنظیم نکنید. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | مهلت دریافت هر تصویر (میلیثانیه) برای ورودی بینایی راهدور `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(کاوششده)_ | `open-sse/utils/cursorVersionDetector.ts` | جستوجوی پایگاه داده وضعیت Cursor IDE را که برای تشخیص نسخه IDE استفاده میشود، بازنویسی میکند. | -| `CURSOR_AGENT_CLI_VERSION` | _(تشخیص / تثبیت)_ | `open-sse/utils/cursorAgentCliVersion.ts` | شناسه ساخت Agent CLI (`YYYY.MM.DD-`) برای `x-cursor-client-version: cli-…` در Agent Run. | -| `CURSOR_AGENT_BIN` | _(تنظیمنشده)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | مسیر فایل اجرایی Cursor Agent که برای تولید تصویر استفاده میشود. در صورت تنظیمنبودن، کنترلگر ابتدا از `providerSpecificData.agentBin` و سپس از PATH استفاده میکند. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | زمان واقعی مجاز برای هر تصویر (میلیثانیه) در کارهای تصویری Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | دروازه همزمانی صندلی مشترک برای کارهای تصویری Cursor. | -| `CURSOR_IMG_MODEL` | درخواست / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | بازنویسی `--model` در Cursor CLI برای کارهای تصویری. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | تناوب بررسی نتیجه تولید تصویر UC (uncensored.com) بر حسب میلیثانیه. | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | زمان واقعی مجاز برای بررسی نتیجه تولید تصویر UC (میلیثانیه). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | تناوب بررسی نتیجه تولید ویدیوی UC (uncensored.com) بر حسب میلیثانیه. | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | زمان واقعی مجاز برای بررسی نتیجه تولید ویدیوی UC (میلیثانیه). | -| `CURSOR_DATA_DIR` | _(کاوششده)_ | `open-sse/utils/cursorAgentCliVersion.ts` | دایرکتوری داده Cursor Agent CLI (`…/versions/`) را بازنویسی میکند؛ همان متغیری که عامل رسمی استفاده میکند. | -| `CURSOR_TOKEN` | _(تنظیمنشده)_ | `scripts/ad-hoc/cursor-tap.cjs` | توکن bearer مستقیم Cursor که ابزارهای توسعهدهنده از آن استفاده میکنند. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | غیرفعال (فعالسازی اختیاری با `"1"`) | `src/app/api/v1/chat/completions/route.ts` | وقتی روی `"1"` تنظیم شود، نشانگرهای نوع/طول محتوا را برای payloadهای بزرگ چت ثبت میکند. برای کاهش شلوغی گزارشها، بهطور پیشفرض خاموش است. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(تنظیمنشده)_ | `open-sse/handlers/responseTranslator.ts` | برای ثبت جزئیات ترجمه SSE→JSON در Responses API، آن را روی `true` تنظیم کنید. | -| `DEBUG_CLAUDE_NONSTREAM` | _(تنظیمنشده)_ | `open-sse/handlers/responseTranslator.ts` | برای نمایانکردن قطعههای خالی textContent در مسیر ترجمه پاسخ Claude، آن را روی `true` تنظیم کنید (فقط برای اشکالزدایی). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(تنظیمنشده)_ | چارچوب آزمون E2E | برای فعالکردن حالت آزمون E2E (احراز هویت آسانگیرانه، هوکهای آزمون)، آن را روی `true` تنظیم کنید. | +> این متغیرها خروجی **پرمفصل** تولید میکنند و ممکن است دادههای حساس را افشا کنند. **هرگز آنها را در محیط عملیاتی فعال نکنید.** + +| متغیر | مقدار پیشفرض | فایل منبع | توضیحات | +| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | برای فعالکردن گزارشهای پرجزئیات اجراکننده Cursor (قطعههای SSE رمزگشاییشده و غیره)، روی `1` تنظیم کنید. | +| `CURSOR_STREAM_DEBUG` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | نام مستعار سازگار با نسخههای قبلی برای `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | مسیر فایل اختیاری که هنگام `CURSOR_DEBUG=1` قطعههای خام و رمزگشاییشده Cursor را دریافت میکند. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | مهلت بیکاری جریان (میلیثانیه) برای اجراکننده Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | بازه ارفاقی (میلیثانیه) پس از پایاندهنده نرم composer kv_after_text، هنگامی که هنوز بایتهایی در بافر باقی ماندهاند — به فراخوانی ابزار exec_mcp انتهایی فرصت میدهد تا فریم خود را کامل کند. | +| `CURSOR_TOOL_DIRECTIVE` | فعال (`!== "0"`) | `open-sse/executors/cursor.ts` | دستورالعمل ثبت ابزار که باعث میشود composer-2.5 فراخوانیهای ابزار را با اطمینان صادر کند. برای غیرفعالکردن، روی `0` تنظیم کنید. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(تنظیمنشده)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | متن اعلان سیستمی تعریفشده توسط اپراتور که پس از ترجمه به پیام سیستمی افزوده میشود (تزریق پس از ترجمه) و به مسیرهای codex/Responses و `/v1/messages` میرسد. همچنین بهعنوان پیشوند دستورالعملی استفاده میشود که از بلوکهای مقدمه سیستمی بازتابشده حذف میگردد. برای غیرفعالماندن، آن را تنظیم نکنید. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (خاموش) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | برای حذف بلوکهای مقدمه اعلان سیستمی بازتابشده از ابتدای یک جریان openai→claude، روی `1` تنظیم کنید. بهطور پیشفرض خاموش است — روشهای اکتشافی بر اساس نثر انگلیسی طراحی شدهاند و محتوای پاسخ را تغییر میدهند؛ بنابراین پاسخی که بهطور مجاز با چنین بخشی آغاز شود، آن را از دست خواهد داد. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | مهلت واکشی هر تصویر (میلیثانیه) برای ورودی بینایی راهدور `image_url`. | +| `CURSOR_STATE_DB_PATH` | _(کاوششده)_ | `open-sse/utils/cursorVersionDetector.ts` | جستوجوی پایگاه داده وضعیت Cursor IDE را که برای تشخیص نسخه IDE استفاده میشود، بازنویسی میکند. | +| `CURSOR_AGENT_CLI_VERSION` | _(تشخیص / تثبیت)_ | `open-sse/utils/cursorAgentCliVersion.ts` | شناسه ساخت Agent CLI با قالب (`YYYY.MM.DD-`) برای `x-cursor-client-version: cli-…` در Agent Run. | +| `CURSOR_AGENT_BIN` | _(تنظیمنشده)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | مسیر فایل اجرایی Cursor Agent که برای تولید تصویر استفاده میشود. اگر تنظیم نشده باشد، کنترلگر ابتدا از `providerSpecificData.agentBin` و سپس PATH استفاده میکند. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | زمان سپریشده مجاز برای هر تصویر (میلیثانیه) در کارهای تصویری Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | محدودکننده همزمانی مجوز اشتراکی برای کارهای تصویری Cursor. | +| `CURSOR_IMG_MODEL` | درخواست / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | بازنویسی `--model` در Cursor CLI برای کارهای تصویری. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | تناوب نظرسنجی نتیجه تولید تصویر UC (uncensored.com) (میلیثانیه). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | زمان سپریشده مجاز برای نظرسنجی نتیجه تولید تصویر UC (میلیثانیه). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | تناوب نظرسنجی نتیجه تولید ویدئوی UC (uncensored.com) (میلیثانیه). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | زمان سپریشده مجاز برای نظرسنجی نتیجه تولید ویدئوی UC (میلیثانیه). | +| `CURSOR_DATA_DIR` | _(کاوششده)_ | `open-sse/utils/cursorAgentCliVersion.ts` | مسیر پوشه داده Cursor Agent CLI (`…/versions/`) را بازنویسی میکند؛ همان متغیری که عامل رسمی استفاده میکند. | +| `CURSOR_TOKEN` | _(تنظیمنشده)_ | `scripts/ad-hoc/cursor-tap.cjs` | توکن حامل مستقیم Cursor که ابزارهای توسعهدهنده از آن استفاده میکنند. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | غیرفعال (فعالسازی اختیاری با `"1"`) | `src/app/api/v1/chat/completions/route.ts` | هنگامی که روی `"1"` تنظیم شود، نشانگرهای نوع/طول محتوا را برای محمولههای بزرگ گفتوگو ثبت میکند. برای کاهش شلوغی گزارشها، بهطور پیشفرض خاموش است. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(تنظیمنشده)_ | `open-sse/handlers/responseTranslator.ts` | برای ثبت جزئیات ترجمه SSE→JSON در Responses API، روی `true` تنظیم کنید. | +| `DEBUG_CLAUDE_NONSTREAM` | _(تنظیمنشده)_ | `open-sse/handlers/responseTranslator.ts` | برای آشکارکردن قطعههای خالی textContent در مسیر ترجمه پاسخ Claude، روی `true` تنظیم کنید (فقط برای اشکالزدایی). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(تنظیمنشده)_ | زیرساخت آزمون E2E | برای فعالکردن حالت آزمون E2E (احراز هویت آسانگیرانه، قلابهای آزمون)، روی `true` تنظیم کنید. | --- @@ -1223,7 +1233,7 @@ STREAM_HISTORY_MAX=10 ## سناریوهای استقرار -برای راهنمای SRE بکاند رله (رفتار ts/bifrost/auto، نحوه استقرار 9router در مقایسه با CLIProxyAPI و راهبرد جایگزین برای توان عملیاتی بالا)، به [راهبرد بکاند رله](/docs/reference/RELAY_BACKEND_STRATEGY.md) مراجعه کنید. +برای راهنمای SRE بکاند رله (رفتار ts/bifrost/auto، محل استقرار 9router در مقایسه با CLIProxyAPI و راهبرد جایگزین برای توان عملیاتی بالا)، به [راهبرد بکاند رله](/docs/reference/RELAY_BACKEND_STRATEGY.md) مراجعه کنید. ### توسعه محلی حداقلی diff --git a/docs/i18n/fa/docs/reference/FEATURE_FLAGS.md b/docs/i18n/fa/docs/reference/FEATURE_FLAGS.md index 746981b6588f..0d9115dd0759 100644 --- a/docs/i18n/fa/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/fa/docs/reference/FEATURE_FLAGS.md @@ -44,124 +44,126 @@ runtime تغییر داد و در پایگاه داده ذخیره کرد، بد ## فهرست فلگها -72 فلگ در 6 دسته. **پیشفرض** همان مقدار پیشفرض تعریف است — مقداری -که وقتی نه بازنویسی DB و نه متغیر محیطی وجود داشته باشد، استفاده میشود. - -### امنیت (10) - -| کلید | نوع | پیشفرض | توضیحات | -| --------------------------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | برای همه درخواستهای ورودی، کلید API الزامی باشد. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | پاکسازی ورودی برای همه درخواستها فعال شود. | -| `INJECTION_GUARD_MODE` | enum | `off` | حالت محافظت در برابر تزریق پرامپت. مقادیر: `off`، `warn`، `block`، `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | اطلاعات شناسایی شخصی از درخواستها حذف شود (مستقل از `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | اطلاعات شناسایی شخصی از پاسخهای ارائهدهنده پاکسازی شود. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | حالت پاکسازی اطلاعات شناسایی شخصی از پاسخها. مقادیر: `redact`، `warn`، `block`، `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | درخواستهای خروجی به محدودههای IP خصوصی/داخلی مسدود شوند. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | به کاربران احراز هویتشده داشبورد اجازه داده شود بهجای مشاهده صرفاً مقادیر پوشاندهشده، کلیدهای API ذخیرهشده را آشکار کنند. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | پیشوند حساب در خطوط گزارش AUTH درج شود (برای مثال، «در حال استفاده از حساب : abc12345...»). این گزینه بهطور پیشفرض غیرفعال است تا شناسههای حساب در گزارشهای فرایند اشتراکی/چندمستاجری پوشانده شوند. مستقل از حالت اشکالزدایی است؛ تغییر حالت اشکالزدایی این اطلاعات را آشکار نمیکند. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | وقتی OIDC فعال است، ورود با گذرواژه غیرفعال شود تا کاربران فقط از طریق ورود یکپارچه OIDC احراز هویت کنند. وقتی غیرفعال باشد (پیشفرض)، هر دو روش ورود با گذرواژه و OIDC در دسترس هستند. | - -### شبکه (15) - -| کلید | نوع | پیشفرض | راهاندازی مجدد | توضیحات | -| ----------------------------------------------- | ------- | ------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | حالت پنهانسازی اثر انگشت TLS را فعال میکند. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | به مسیرهای /v1/audio/* اجازه میدهد از گرههای ارائهدهندهٔ سازگار با OpenAI که خارج از localhost میزبانی میشوند استفاده کنند. بهطور پیشفرض غیرفعال است — مسیریابی صوت به یک میزبان راهدور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback همیشه مجاز هستند و تحت تأثیر قرار نمیگیرند. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | وقتی هیچ پروکسیای به یک اتصال اختصاص داده نشده است، نخستین پروکسی فعال را بهصورت خودکار از رجیستری انتخاب میکند. بهطور پیشفرض غیرفعال است (در غیر این صورت هر پروکسی رجیستری به یک جایگزین سراسری تبدیل میشود — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | به جریانهای اعتبارسنجی OAuth و ارائهدهنده اجازه میدهد وقتی بررسیهای اولیهٔ دسترسیپذیری پروکسی ناموفق هستند، پروکسی سنجاقشده را دور بزنند و مستقیماً متصل شوند. بهطور پیشفرض غیرفعال است، زیرا این کار میتواند IP خروجی را تغییر دهد. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | هنگام رخدادن یک استثنای شبکه (مهلت زمانی، رد یا بازنشانی اتصال) در یک اجراکنندهٔ چرخش چندحسابی، اگر حساب ناموفق پروکسی اختصاصی نداشته باشد، یک دورهٔ انتظار کوتاه اعمال میکند و بهجای تلاش مجدد برای تکتک حسابها، سایر حسابهای بدون پروکسی را تا پایان درخواست رد میکند. بهطور پیشفرض فعال است (ایمن: IP خروجی تغییر نمیکند و فقط خطر تأخیر/دورهٔ انتظار در حسابهای دارای خروجی مشترک را کاهش میدهد). برای بازگرداندن انتشار فوری در نخستین خطای حساب بدون پروکسی، آن را غیرفعال کنید. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | استخرهای پروکسی و چرخش مختص هر حساب در opencode، ارائهٔ مجدد پروکسیای را که بهتازگی ناموفق بوده است (کاوش TCP ردشده یا دریافت 429 از طریق آن)، برای مدتی مختص هر فرایند متوقف میکنند؛ این مدت با هر تکرار دو برابر میشود تا به سقف برسد. هیچ وضعیت پروکسیای ثبت نمیشود؛ اگر همهٔ گزینهها کنار گذاشته شوند، انتخاب بدون تغییر باقی میماند. بهطور پیشفرض غیرفعال است. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | در داشبورد و زیر یک استخر پروکسی نشان میدهد که طی 24 ساعت گذشته، چند IP خروجی مشاهدهشده به اعضای آن سرویس دادهاند و چند اتصال از آنها استفاده کردهاند. فقط خواندنی است، از گزارش پروکسی محاسبه میشود و هرگز برای مسیریابی استفاده نمیشود. بهطور پیشفرض غیرفعال است. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | برای اجراکنندهٔ OpenCode، نخستین بایت بدنهٔ پاسخ جریانی Responses را پایش میکند (بازه: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`، پیشفرض `15000`). یک جریان 2xx از Responses که پس از پایان این بازه همچنان ساکت بماند، متوقفشده تلقی میشود: حساب وارد دورهٔ انتظار میشود و درخواست یک بار به حساب بعدی میچرخد؛ توقف دوم بلافاصله با شکست مواجه میشود. بهطور پیشفرض غیرفعال است: جریانهای متوقفشده تا پایان مهلت آمادگی جریان، رفتار انتظار فعلی را حفظ میکنند. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | اجراکنندهٔ OpenCode: هنگام دریافت 403/451 حاوی امتناع `user_blocked` (نه محدودیت جغرافیایی و نه رد اثر انگشت Cloudflare)، حساب ردشده را وارد دورهٔ انتظار میکند و در هر درخواست حداکثر یک بار به حساب بعدی میچرخد؛ امتناع دوم بدون علامتگذاری موفقیت، همانطور که هست بازگردانده میشود. بهطور پیشفرض غیرفعال است: دور زدن مسیریابی یک مسدودسازی کاربر از سوی سرویس بالادستی ممکن است شبیه تلاش برای فرار به نظر برسد و پرچم را در سراسر ناوگان منتشر کند. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | چرخش OpenCode: پس از دو شکست موقت متوالی در سرویس بالادستی (5xx یا یک 400 با بدنهٔ خالی)، پیش از رفتن به حساب بعدی مکث میکند — از 1.5 ثانیه شروع میشود و با هر شکست بعدی دو برابر میگردد، با سقف 6 ثانیه برای هر مکث و 10 ثانیه برای هر درخواست؛ در صورت قطع اتصال کلاینت از آن صرفنظر میشود. بدنهٔ ناموفق پیش از انتظار آزاد میشود. بهطور پیشفرض غیرفعال است: انتقال به جایگزین همچنان فوری انجام میشود. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | چرخش OpenCode: موج حسابها را در نخستین 429 که بهعنوان محدودیت نرخ واقعی طبقهبندی شده است (دارای `Retry-After` قابل تجزیه یا بدنهای که از محدودیت نرخ/مصرف نام میبرد) متوقف میکند و همان 429 بالادستی را بدون تغییر بازمیگرداند. برای 429های طبقهبندینشده، چرخش ادامه مییابد. بهطور پیشفرض غیرفعال است: سطح رایگان بهازای هر IP خروجی محدود است (#9611)، بنابراین هر 429 باعث چرخش میشود و یک موج تمامشده آخرین 429 بالادستی را بازمیگرداند. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | تأیید گواهی TLS را برای پروکسی MITM غیرفعال میکند. **خطرناک است.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | URLهای ارائهدهنده را که به شبکههای خصوصی/داخلی اشاره میکنند مجاز میسازد. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | افزودن/اعتبارسنجی ارائهدهندگان روی آدرسهای محلی/خصوصی (127.0.0.1، localhost، LAN) را مجاز میکند. بهطور پیشفرض فعال است (اولویت با محیط محلی)؛ برای مسدودسازی سختگیرانه و محدود به آدرسهای عمومی، آن را غیرفعال کنید. فرادادهٔ ابری همچنان مسدود میماند. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | حالت ارائهدهندهٔ سازگار با Claude Code را فعال میکند. | +۷۴ فلگ در ۶ دسته. **پیشفرض** همان مقدار پیشفرض تعریفشده است — مقداری که +وقتی نه بازنویسی DB و نه متغیر محیطی وجود داشته باشد، استفاده میشود. + +### امنیت (۱۰) + +| کلید | نوع | پیشفرض | توضیحات | +| --------------------------------------- | ---- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | بولی | `false` | برای همه درخواستهای ورودی، کلید API الزامی باشد. | +| `INPUT_SANITIZER_ENABLED` | بولی | `true` | پاکسازی ورودی برای همه درخواستها فعال شود. | +| `INJECTION_GUARD_MODE` | enum | `off` | حالت محافظت در برابر تزریق پرامپت. مقادیر: `off`، `warn`، `block`، `redact`. | +| `PII_REDACTION_ENABLED` | بولی | `false` | اطلاعات قابل شناسایی شخصی (PII) از درخواستها حذف شود (مستقل از `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | بولی | `false` | اطلاعات قابل شناسایی شخصی (PII) از پاسخهای ارائهدهنده پاکسازی شود. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | حالت پاکسازی اطلاعات قابل شناسایی شخصی (PII) در پاسخ. مقادیر: `redact`، `warn`، `block`، `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | بولی | `true` | درخواستهای خروجی به محدودههای IP خصوصی/داخلی مسدود شوند. | +| `ALLOW_API_KEY_REVEAL` | بولی | `false` | به کاربران احراز هویتشده داشبورد اجازه داده شود بهجای مشاهده صرفِ مقادیر پوشاندهشده، کلیدهای API ذخیرهشده را آشکار کنند. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | بولی | `false` | پیشوند حساب در خطوط گزارش AUTH درج شود (برای مثال، «استفاده از حساب : abc12345...»). بهطور پیشفرض غیرفعال است تا شناسههای حساب در گزارشهای فرایند اشتراکی/چندمستاجری پوشانده شوند. این گزینه مستقل از حالت اشکالزدایی است؛ تغییر حالت اشکالزدایی باعث آشکار شدن این اطلاعات نمیشود. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | بولی | `false` | هنگامی که OIDC فعال است، ورود با گذرواژه غیرفعال شود تا کاربران فقط بتوانند از طریق ورود یکپارچه OIDC احراز هویت کنند. در حالت غیرفعال (پیشفرض)، هم ورود با گذرواژه و هم OIDC در دسترس هستند. | + +### شبکه (۱۶) + +| کلید | نوع | پیشفرض | راهاندازی مجدد | توضیحات | +| ----------------------------------------------- | ------- | ------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | حالت پنهانسازی اثر انگشت TLS را فعال میکند. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | به مسیرهای /v1/audio/* اجازه میدهد از گرههای ارائهدهنده سازگار با OpenAI که خارج از localhost میزبانی میشوند استفاده کنند. بهطور پیشفرض غیرفعال است — مسیریابی صوت به یک میزبان راه دور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback همیشه مجاز و بدون تأثیر هستند. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | به POST /v1/rerank (و مرحله بازرتبهبندی loopback موتور حافظه) اجازه میدهد از گرههای ارائهدهنده سازگار با OpenAI که خارج از localhost میزبانی میشوند استفاده کند. بهطور پیشفرض غیرفعال است — مسیریابی به یک میزبان راه دور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback همیشه مجاز هستند؛ گرههای راه دور باید سیاست URL خروجی ارائهدهنده را نیز با موفقیت بگذرانند. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | وقتی هیچ پراکسیای به یک اتصال اختصاص داده نشده است، نخستین پراکسی فعال را بهطور خودکار از رجیستری انتخاب میکند. بهطور پیشفرض غیرفعال است (در غیر این صورت، هر پراکسی رجیستری به یک گزینه جایگزین سراسری تبدیل میشود — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | به جریانهای اعتبارسنجی OAuth و ارائهدهنده اجازه میدهد در صورت شکست بررسیهای اولیه دسترسیپذیری پراکسی، پراکسی سنجاقشده را دور بزنند و مستقیماً متصل شوند. بهطور پیشفرض غیرفعال است، زیرا این کار میتواند IP خروجی را تغییر دهد. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | هنگام وقوع یک استثنای شبکه (پایان مهلت زمانی، رد یا بازنشانی اتصال) برای یک اجراکننده چرخش چندحسابی، اگر حساب ناموفق پراکسی اختصاصی نداشته باشد، یک دوره انتظار کوتاه اعمال میکند و بهجای تلاش مجدد برای تکتک حسابها، سایر حسابهای بدون پراکسی را تا پایان درخواست نادیده میگیرد. بهطور پیشفرض فعال است (ایمن: IP خروجی تغییر نمیکند و فقط خطر تأخیر یا دوره انتظار را برای حسابهای دارای خروجی مشترک کاهش میدهد). برای بازگرداندن انتشار فوری پس از نخستین خطای حساب بدون پراکسی، آن را غیرفعال کنید. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | استخرهای پراکسی و چرخش هر حساب در opencode، ارائه مجدد پراکسیای را که بهتازگی ناموفق بوده است (بررسی TCP ردشده یا پاسخ 429 دریافتشده از طریق آن) برای مدتی در هر فرایند متوقف میکنند؛ این مدت با هر تکرار دو برابر میشود تا به سقف برسد. هیچ وضعیت پراکسیای نوشته نمیشود؛ اگر همه گزینهها کنار گذاشته شوند، انتخاب بدون تغییر باقی میماند. بهطور پیشفرض غیرفعال است. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | در داشبورد و زیر یک استخر پراکسی نشان میدهد که طی 24 ساعت گذشته، چند IP خروجی مشاهدهشده به اعضای آن سرویس دادهاند و چند اتصال از آنها استفاده کردهاند. فقطخواندنی است، از گزارش پراکسی محاسبه میشود و هرگز برای مسیریابی استفاده نمیشود. بهطور پیشفرض غیرفعال است. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | برای اجراکننده OpenCode، نخستین بایت بدنه یک پاسخ جریانی Responses را پایش میکند (بازه: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`، پیشفرض `15000`). یک جریان 2xx از Responses که پس از این بازه همچنان ساکت بماند، متوقفشده در نظر گرفته میشود: حساب وارد دوره انتظار میشود و درخواست یک بار به حساب بعدی میچرخد؛ توقف دوم فوراً با شکست مواجه میشود. بهطور پیشفرض غیرفعال است: جریانهای متوقفشده تا پایان مهلت زمانی آمادگی جریان، انتظار فعلی را ادامه میدهند. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | اجراکننده OpenCode: هنگام دریافت پاسخ 403/451 حاوی امتناع `user_blocked` (نه محدودیت جغرافیایی و نه رد اثرانگشت Cloudflare)، حساب ردشده را موقتاً از گردش خارج کرده و حداکثر یک بار در هر درخواست به حساب بعدی منتقل میشود؛ امتناع دوم بدون تغییر و بدون علامتگذاری موفقیت بازگردانده میشود. بهطور پیشفرض غیرفعال است: دور زدن مسدودسازی کاربر در سرویس بالادستی ممکن است بهعنوان تلاش برای اجتناب تلقی شود و این علامت را در سراسر مجموعه حسابها گسترش دهد. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | گردش OpenCode: پس از دو خطای گذرای متوالی در سرویس بالادستی (5xx یا پاسخ 400 با بدنه خالی)، پیش از رفتن به حساب بعدی مکث میشود — از 1.5 ثانیه شروع شده و با هر خطای بعدی دو برابر میشود، با سقف 6 ثانیه برای هر مکث و 10 ثانیه برای هر درخواست؛ در صورت قطع اتصال کارخواه، مکث انجام نمیشود؛ بدنه پاسخ ناموفق پیش از انتظار آزاد میشود. بهطور پیشفرض غیرفعال است: جایگزینی پس از خطا همچنان فوری باقی میماند. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | گردش OpenCode: موج حسابها را در نخستین پاسخ 429 که بهعنوان محدودیت واقعی نرخ طبقهبندی شده است (دارای `Retry-After` قابلتجزیه، یا بدنهای که محدودیت نرخ/مصرف را ذکر میکند) متوقف کرده و همان پاسخ 429 سرویس بالادستی را بدون تغییر بازمیگرداند. پاسخهای 429 طبقهبندینشده به گردش ادامه میدهند. بهطور پیشفرض غیرفعال است: سطح رایگان بهازای هر IP خروجی محدود است (#9611)، بنابراین هر پاسخ 429 باعث گردش میشود و در صورت اتمام موج، آخرین پاسخ 429 سرویس بالادستی بازگردانده میشود. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | تأیید گواهی TLS را برای پراکسی MITM غیرفعال میکند. **خطرناک است.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | نشانیهای URL ارائهدهنده را که به شبکههای خصوصی/داخلی اشاره میکنند مجاز میکند. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | افزودن/اعتبارسنجی ارائهدهندگان روی نشانیهای محلی/خصوصی (127.0.0.1، localhost، LAN) را مجاز میکند. بهطور پیشفرض فعال است (اولویت با محیط محلی)؛ برای مسدودسازی سختگیرانه و محدود به نشانیهای عمومی، آن را غیرفعال کنید. فراداده ابری همچنان مسدود میماند. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | حالت ارائهدهنده سازگار با Claude Code را فعال میکند. | ### سیاستها (5) -| کلید | نوع | پیشفرض | توضیحات | -| ------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | حالت اعمال سیاست استفاده از ابزار. مقادیر: `disabled`، `warn`، `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | فعالسازی خودکار محدودسازی نرخ بر اساس الگوهای استفاده. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | بررسی محلی پنجرهٔ زمینه / حداکثر توکن ورودی OmniRoute را برای درخواستهای مستقیم تکمدلی نادیده میگیرد. محدودیتهای بالادستی همچنان اعمال میشوند. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | وقتی مدل مقصد فاقد قابلیتهای لازم (بینایی، ابزارها، خروجی ساختیافته، پنجرهٔ زمینه) باشد، درخواستها را پیش از ارسال رد میکند. از درخواستهای مستقیم تکارائهدهندهای که فیلتر سازگاری لایهٔ ترکیبی را دور میزنند، محافظت میکند. | -| `RADAR_ENABLED` | boolean | `false` | ماژول Radar در OmniRoute (صفحههای فید کاتالوگ و همگامسازی) را فعال میکند. بهطور پیشفرض خاموش است؛ فعالسازی فقط رابط کاربری را در دسترس قرار میدهد — همگامسازی دادهها همچنان نیازمند اعلام رضایت جداگانه است. | - -### زمان اجرا (32) - -| کلید | نوع | پیشفرض | راهاندازی مجدد | توضیحات | -| ------------------------------------------- | ------ | ------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | بولی | `true` | | هنگام تغییر مدل در مسیریابی ترکیبی، خلاصههای مکالمه را تولید و تزریق میکند. برای مستقل در نظر گرفتن تغییر مدلها و جلوگیری از درخواستهای تحویل پسزمینه برای همهٔ ترکیبهای فعلی و آینده، آن را غیرفعال کنید. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | بولی | `true` | | آیتمهای خروجی داخلیِ مرحلهٔ توضیحات را پیش از ارسال به کلاینتها، از جریانهای عبوری Responses API حذف میکند. برای دریافت توضیحات خام بالادستی، آن را غیرفعال کنید. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | بولی | `true` | | محدودیتهای دامنه را برای دسترسی به ابزارهای MCP اعمال میکند. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | بولی | `false` | | برای کاهش مصرف توکن، توضیحات ابزارهای MCP را فشرده میکند. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | بولی | `false` | | پردازش وظایف پسزمینه را در زمان اجرا فعال میکند. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | بولی | `false` | ✓ | همهٔ سرویسهای پسزمینه (نوسازی سهمیه، همگامسازی و غیره) را غیرفعال میکند. | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | بولی | `false` | | بدون اعتبارسنجی به فیلترهای RTK در سطح پروژه اعتماد میکند. | -| `OMNIROUTE_ENABLE_LIVE_WS` | بولی | `true` | ✓ | سرور WebSocket داشبورد بلادرنگ را هنگام import راهاندازی میکند (بهطور پیشفرض روی پورت 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | بولی | `true` | | به Codex اجازه میدهد از انتقال Responses-over-WebSocket استفاده کند. در صورت خاموش بودن، Codex به HTTP Responses برمیگردد. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | بولی | `true` | | به Codex اجازه میدهد از انتقال محلی WebSocket JSON-RPC مربوط به app-server استفاده کند (codexTransport=app-server). در صورت خاموش بودن، اتصالهایی که app-server را انتخاب کردهاند به سایر روشهای انتقال Codex برمیگردند. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | بولی | `true` | | درخواستهایی را که بودجهشان تمام شده است به ارائهدهنده/مدل جایگزین رایگان اضطراری هدایت میکند. (بخش [جایگزین اضطراری بودجه](#emergency-budget-fallback) را در ادامه ببینید.) | -| `STREAM_RECOVERY_ENABLED` | بولی | `false` | | پیش از آنکه هرگونه بایت پاسخ به کلاینت برسد، تلاش مجدد زودهنگام و شفاف را برای جریانهای SSE بالادستیِ ناقص فعال میکند. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | بولی | `false` | | به بازیابی جریان اجازه میدهد پس از رسیدن بایتها به کلاینت نیز پاسخ را دوباره درخواست کرده و به جریان قبلی متصل کند. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | بولی | `false` | | ادامه دادن در میانهٔ جریان را برای فراخوانی ابزار ایمن میکند: پس از انتشار یک فراخوانی ابزار، چه در حال اجرا باشد و چه پیشتر با finish_reason برابر با tool_calls پایان یافته باشد، هرگز جریان قطعشده را از سر نمیگیرد و بهجای مصرف کل بودجه، پس از یک ادامهٔ خالی اتصال را میبندد. حالت خاموش: رفتار نسخهٔ انتشاریافته. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | بولی | `false` | | وقتی یک جریان SSE پیش از انتشار هر فریم مفیدی بسته شود و تلاش مجدد محدود روی همان اتصال نیز مصرف شده باشد، یکبار به اتصال همتای دیگری سوییچ میکند؛ اگر همتای قابلاستفادهای وجود نداشته باشد، پاسخ اصلی 502 با `STREAM_EARLY_EOF` بازگردانده میشود. بهطور پیشفرض خاموش است: EOF زودهنگام پس از تلاش مجدد روی همان اتصال، نهایی باقی میماند. | -| `MODEL_CATALOG_INCLUDE_NAMES` | بولی | `true` | | فیلدهای نام مناسب برای نمایش را در پاسخهای `/v1/models` قرار میدهد. برای کلاینتهایی که فقط شناسههای مدل را انتظار دارند، آن را غیرفعال کنید. | -| `MODELS_CATALOG_PREFIX_MODE` | شمارشی | `dual` | | نحوهٔ پیشوندگذاری شناسههای مدل در /v1/models را کنترل میکند. 'dual' (پیشفرض) برای سازگاری عقبرو، هم پیشوند نام مستعار و هم پیشوند شناسهٔ رسمی ارائهدهنده را منتشر میکند. 'alias' فقط پیشوند کوتاه نام مستعار را منتشر میکند (برای مثال ds-web/model، نه deepseek-web/model). 'canonical' فقط پیشوند کامل شناسهٔ ارائهدهنده را منتشر میکند. مقادیر: `dual`، `alias`، `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | بولی | `true` | | همگامسازی دورهای ELO با جدول رتبهبندی Arena AI را برای رتبهبندی هوشمندی مدلها فعال میکند. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | بولی | `false` | | شناسههای آینهای `claude//` را در `/v1/models` اعلام میکند تا کشف مدل در درگاه Claude Code، مدلهای غیر Claude را فهرست کند. این گزینه سطح سراسریِ دروازهٔ سهسطحی است (متغیر محیطی بر تنظیم داشبورد اولویت دارد). بخش [پیکربندی Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) را ببینید. | -| `NO_THINKING_ALIAS_ENABLED` | بولی | `true` | | کلید اصلی برای نامهای مستعار درگاه no-think//. حالت روشن (پیشفرض): /v1/models برای هر مدل واجد شرایط Claude که قابلیت تفکر دارد، یک گونهٔ بدون تفکر اعلام میکند و شناسهٔ no-think/ ارسالشده در درخواست با سرکوب استدلال به مدل واقعی بازگردانی میشود. حالت خاموش: هیچ گونهای اعلام نمیشود و شناسهٔ no-think/ مانند هر شناسهٔ مدل ناشناختهٔ دیگری در نظر گرفته میشود. تا زمانی که این گزینه روشن است، انتخاب فعال/غیرفعالسازی جداگانهٔ هر مدل با ModelSpec.noThinkingAlias همچنان اعمال میشود. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | بولی | `false` | | تولید گونههای سطح تفکر (برای مثال -low، -medium، -high) را در کاتالوگ /v1/models غیرفعال میکند. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | بولی | `false` | ✓ | مسیرهای پذیرش مجازی تطبیقی بهازای هر مستأجر را برای ارسال به ارائهدهنده فعال میکند (#9654): جهش بار یک مستأجر دیگر باعث خطای 503 برای مستأجر دیگری نمیشود. متغیر محیطی OMNIROUTE_CHAT_VIRTUAL_LANES بر این تنظیم داشبورد اولویت دارد؛ تغییرات پس از راهاندازی مجدد سرور اعمال میشوند. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | بولی | `false` | | شناسههای آینهای / را در /v1/models برای مدلهایی اعلام میکند که مالک رسمی آنها اعتبارنامهٔ فعالی ندارد، اما یک درگاه عبوری دارای اعتبارنامهٔ فعال آنها را مسیریابی میکند. هشدار: در صورت فعالسازی سراسری، ورودیهایی را برای همهٔ کلاینتها به کاتالوگ اضافه میکند. | -| `NEWAPI_AGGREGATOR_BALANCE` | بولی | `false` | | تشخیص موجودی را برای گرههای تجمیعکنندهٔ سازگار با New-API / One-API / Sub2API فعال میکند. در صورت فعال بودن، گرههای سازگاری که پرچم تجمیعکننده برایشان تنظیم شده است، موجودی خود را در داشبورد و مسیریابی پیشبررسی سهمیه گزارش میکنند. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | بولی | `false` | | فراخوانیهای غیرجریانی ابزار تحت مالکیت سرور را تا زمانی ادامه میدهد که مدل پاسخی قابلاستفاده برای کلاینت بازگرداند. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | بولی | `false` | | آمار جستوجو و جستوجوهای اخیر فقط ارائهدهندگانی را محاسبه میکنند که همچنان اتصال فعالی دارند (ارائهدهندگان بدون کلید مانند duckduckgo-free همیشه محاسبه میشوند). در حالت خاموش، هر ردیف جستوجوی نگهداریشده که دارای شناسهٔ ارائهدهنده است حفظ میشود. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | بولی | `false` | | صفحههای ارائهدهندگان در داشبورد: نشان رایگان را فقط براساس سیگنالهایی نمایش میدهد که ارائهدهنده به آنها پایبند است — روش ابتکاری مبتنی بر نام نمایشی، فیلدهای رایگان غیربولی و پسوندهای :free را برای ارائهدهندگان ثبتشدهای که سطح رایگان مستندی ندارند کنار میگذارد. حالت خاموش، قاعدهٔ تاریخی نمایش نشان را حفظ میکند. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | بولی | `false` | | در پاسخهای تجمیعشدهٔ عدم دسترسی 429/503، هنگامی که زمان مشخصی برای تلاش مجدد در آینده معلوم نیست، `Retry-After` را حذف میکند (بهجای مقدار ساختگی 1s)، فیلد `error.retry_after_provenance` (`signal` \| `none`) را اضافه میکند و به مسیرهای تخلیهٔ ترکیب اجازه میدهد راهنمای متنی تلاش مجدد را از بدنههای بالادستی JSON و متن ساده بخوانند. این فیلد فقط در پاسخهایی ظاهر میشود که توسط `unavailableResponse()` ساخته شدهاند؛ سایر بدنههای 429/503 بدون تغییر میمانند. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | بولی | `false` | | وقتی یک مقصد ترکیبی `priority` که بهعنوان «فقط هنگام اتمام سهمیه جایگزین شود» علامتگذاری شده است، ترکیب را به دلیلی که بهطور اثباتپذیر سهمیه نیست متوقف کند (باز بودن قطعکنندهٔ مدار ارائهدهنده، رد شدن بهعلت تأخیر پیشبینیشده)، بهجای 503 شبیه خطای سهمیه، پاسخ 502 میدهد. توقفهای ناشی از قفل، دورهٔ انتظار، عدم دسترسی، اتمام منابع و سقف همزمانی همچنان 503 برمیگردانند. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | بولی | `false` | | یک پاسخ سادهٔ 401 از Mistral (`{"detail":"Unauthorized"}`، بدون سیگنال صریح احراز هویت) برای کلید لغوشده و سهمیهٔ تمامشده یکسان است. در حالت روشن، بهجای کنار گذاشتن اتصال با وضعیت `expired`، آن را وارد دورهٔ انتظار میکند؛ حداکثر 3 بار در ساعت برای هر اتصال. مورد بعدی اتصال را کنار میگذارد، بنابراین کلید لغوشده همچنان در نهایت شناسایی میشود. بهطور پیشفرض خاموش است: هر پاسخ سادهٔ 401 از Mistral مانند گذشته اتصال را کنار میگذارد. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | بولی | `false` | | کاتالوگ زندهٔ مدلهای xAI را برای اتصالهای `xai-oauth` با استفاده از توکن حامل OAuth از `https://api.x.ai/v1/models` دریافت میکند، بهجای آنکه از دادهٔ اولیهٔ ایستای منجمدشده استفاده کند. بهطور پیشفرض خاموش است: `xai-oauth` همچنان دادهٔ اولیهٔ ایستا را بدون تغییر ارائه میکند. در صورت بروز هرگونه خطای تفکیک، کشف مدل به دادهٔ اولیه بازمیگردد (پذیرش توکن حامل OAuth توسط x.ai در این نقطهٔ پایانی تأیید نشده است). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | بولی | `false` | | به پاکسازی خودکار اجازه میدهد کارهای نهاییشدهٔ Batch API (completed/failed/cancelled/expired) قدیمیتر از `OMNIROUTE_BATCH_RETENTION_DAYS` را همراه با نقاط وارسی هر خط حذف کند و محتوای BLOB فایلهای بارگذاریشدهای را که از `expires_at` خود گذشتهاند پاک کند. بهطور پیشفرض خاموش است: تا زمانی که اپراتور آن را فعال نکند، همهٔ نصبهای موجود این دادهها را دقیقاً مانند گذشته نگه میدارند. مسیر `DELETE /api/v1/batches/delete-completed` که توسط اپراتور اجرا میشود در هر دو حالت بیتأثیر میماند — این مسیر یک قرارداد عمومی API جداگانه و بدون شرط است. | +| کلید | نوع | پیشفرض | توضیحات | +| ------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | حالت اعمال سیاست استفاده از ابزار. مقادیر: `disabled`، `warn`، `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | محدودسازی نرخ را بهطور خودکار و بر اساس الگوهای مصرف فعال میکند. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | بررسی محلی OmniRoute برای پنجره زمینه / حداکثر توکنهای ورودی را در درخواستهای مستقیم تکمدلی نادیده میگیرد. محدودیتهای سرویس بالادستی همچنان اعمال میشوند. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | هنگامی که مدل هدف فاقد قابلیتهای موردنیاز باشد (بینایی، ابزارها، خروجی ساختاریافته، پنجره زمینه)، درخواستها را پیش از ارسال رد میکند. از درخواستهای مستقیم تکارائهدهندهای که فیلتر سازگاری لایه ترکیبی را دور میزنند محافظت میکند. | +| `RADAR_ENABLED` | boolean | `false` | ماژول Radar در OmniRoute (صفحههای خوراک کاتالوگ و همگامسازی) را فعال میکند. بهطور پیشفرض غیرفعال است؛ فعالسازی فقط رابط کاربری را در دسترس قرار میدهد — همگامسازی دادهها همچنان نیازمند فعالسازی جداگانه است. | + +### زمان اجرا (33) + +| کلید | نوع | پیشفرض | راهاندازی مجدد | توضیحات | +| ------------------------------------------- | ------- | ------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | بولی | `true` | | هنگام تغییر مدلها توسط مسیریابی ترکیبی، خلاصههای مکالمه را تولید و تزریق میکند. برای مستقل در نظر گرفتن تغییر مدلها و جلوگیری از درخواستهای انتقال پسزمینه برای همه ترکیبهای فعلی و آینده، آن را غیرفعال کنید. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | بولی | `true` | | پیش از ارسال جریانهای عبوری Responses API به کلاینتها، موارد خروجی داخلی مربوط به مرحله توضیحات را حذف میکند. برای دریافت توضیحات خام بالادستی، آن را غیرفعال کنید. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | بولی | `true` | | محدودیتهای دامنه را برای دسترسی به ابزارهای MCP اعمال میکند. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | بولی | `false` | | توضیحات ابزارهای MCP را برای کاهش مصرف توکن فشرده میکند. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | بولی | `false` | | پردازش وظایف پسزمینه را در زمان اجرا فعال میکند. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | بولی | `false` | ✓ | همه سرویسهای پسزمینه (بهروزرسانی سهمیه، همگامسازی و غیره) را غیرفعال میکند. | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | اعتماد به فیلترهای RTK در سطح پروژه بدون اعتبارسنجی. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | راهاندازی سرور WebSocket داشبورد بلادرنگ هنگام import (بهطور پیشفرض روی پورت 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | اجازه به Codex برای استفاده از انتقال Responses-over-WebSocket. در صورت غیرفعال بودن، Codex به HTTP Responses بازمیگردد. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | اجازه به Codex برای استفاده از انتقال محلی JSON-RPC مبتنی بر WebSocket در app-server (`codexTransport=app-server`). در صورت غیرفعال بودن، اتصالهایی که app-server را انتخاب کردهاند به سایر روشهای انتقال Codex بازمیگردند. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | هدایت درخواستهایی که بودجهشان تمام شده است به ارائهدهنده/مدل جایگزین رایگان اضطراری. (بخش [جایگزین اضطراری در صورت اتمام بودجه](#emergency-budget-fallback) را در ادامه ببینید.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | فعالسازی تلاش مجدد زودهنگام و شفاف برای جریانهای بالادستی SSE که ناقص قطع شدهاند، پیش از آنکه هرگونه بایت پاسخ به کلاینت برسد. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | اجازه به بازیابی جریان برای ارسال مجدد درخواست و پیوند دادن پاسخ، پس از آنکه بایتها از قبل به کلاینت رسیدهاند. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | ایمنسازی ادامه در میانه جریان برای فراخوانی ابزار: پس از انتشار یک فراخوانی ابزار، هرگز جریان قطعشده را از سر نگیرید (چه در حال اجرا باشد و چه قبلاً با `finish_reason` برابر با `tool_calls` پایان یافته باشد) و بهجای مصرف کل بودجه، پس از یک ادامه خالی اتصال را ببندید. در حالت غیرفعال: رفتار نسخه انتشاریافته. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | وقتی یک جریان SSE پیش از انتشار هرگونه فریم مفید بسته میشود و تلاش مجدد محدود روی همان اتصال به پایان رسیده است، یکبار به یک اتصال همسطح سوئیچ اضطراری انجام دهید؛ اگر اتصال همسطح قابلاستفادهای وجود نداشته باشد، خطای اصلی `STREAM_EARLY_EOF` با کد 502 بازگردانده میشود. بهطور پیشفرض غیرفعال است: EOF زودهنگام پس از تلاش مجدد روی همان اتصال، همچنان نهایی باقی میماند. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | فیلدهای نام مناسب برای نمایش را در پاسخهای `/v1/models` بگنجانید. برای کلاینتهایی که فقط انتظار شناسههای مدل را دارند، غیرفعال کنید. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | نحوه پیشوندگذاری شناسههای مدل در /v1/models را کنترل میکند. 'dual' (پیشفرض) برای سازگاری با نسخههای قبلی، هم پیشوند نام مستعار و هم پیشوند شناسه متعارف ارائهدهنده را منتشر میکند. 'alias' فقط پیشوند کوتاه نام مستعار را منتشر میکند (برای مثال ds-web/model، نه deepseek-web/model). 'canonical' فقط پیشوند کامل شناسه ارائهدهنده را منتشر میکند. مقادیر: `dual`، `alias`، `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | همگامسازی دورهای ELO جدول امتیازات Arena AI را برای رتبهبندی هوشمندی مدلها فعال کنید. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | شناسههای آینهای `claude//` را در `/v1/models` اعلام کنید تا کشف مدل در دروازه Claude Code، مدلهای غیر Claude را فهرست کند. سطح سراسریِ سازوکار سهسطحی (متغیر محیطی بر بازنویسی داشبورد اولویت دارد). به [پیکربندی Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) مراجعه کنید. | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | کلید اصلی برای نامهای مستعار دروازه no-think//. در حالت فعال (پیشفرض): /v1/models برای هر مدل واجد شرایط Claude که قابلیت تفکر دارد، یک گونه بدون تفکر اعلام میکند و شناسهای با no-think/ که در یک درخواست ارسال شود، با سرکوب استدلال دوباره به مدل واقعی نگاشت میشود. در حالت غیرفعال: هیچ گونهای اعلام نمیشود و شناسهای با no-think/ مانند هر شناسه مدل ناشناخته دیگری تلقی میشود. تا زمانی که این گزینه فعال است، انتخاب فعال/غیرفعال برای هر مدل از طریق ModelSpec.noThinkingAlias همچنان اعمال میشود. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | تولید گونههای سطح تفکر (برای مثال -low، -medium، -high) را در کاتالوگ /v1/models غیرفعال کنید. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | مسیرهای مجازی تطبیقی پذیرش بهازای هر مستأجر را برای ارسال به ارائهدهنده فعال کنید (#9654): افزایش ناگهانی بار یک مستأجر دیگر باعث خطای 503 برای مستأجر دیگر نمیشود. متغیر محیطی OMNIROUTE_CHAT_VIRTUAL_LANES بر این بازنویسی داشبورد اولویت دارد؛ تغییرات پس از راهاندازی مجدد سرور اعمال میشوند. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | شناسههای آینهای / را در /v1/models برای مدلهایی اعلام میکند که مالک اصلی آنها اعتبارنامهٔ فعالی ندارد، اما یک دروازهٔ عبوری با اعتبارنامهٔ فعال آنها را مسیریابی میکند. هشدار: در صورت فعالسازی سراسری، برای همهٔ کلاینتها ورودیهایی به کاتالوگ اضافه میکند. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | تشخیص موجودی را برای گرههای سازگار با تجمیعکنندههای New-API / One-API / Sub2API فعال میکند. در صورت فعال بودن، گرههای سازگاری که پرچم تجمیعکننده برایشان تنظیم شده است، موجودی خود را در داشبورد و مسیریابیِ پیشبررسی سهمیه گزارش میکنند. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | فراخوانیهای غیرجریانی ابزارهای تحت مالکیت سرور را تا زمانی ادامه میدهد که مدل پاسخی قابلاستفاده برای کلاینت برگرداند. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | آمار جستجو و جستجوهای اخیر فقط ارائهدهندگانی را محاسبه میکنند که همچنان اتصال فعالی دارند (ارائهدهندگان بدون کلید مانند duckduckgo-free همیشه محاسبه میشوند). در حالت غیرفعال، همهٔ ردیفهای جستجوی نگهداریشده که دارای شناسهٔ ارائهدهنده هستند حفظ میشوند. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | صفحات ارائهدهندگان در داشبورد: نشان «رایگان» را فقط بر اساس سیگنالهایی نمایش میدهد که ارائهدهنده به آنها پایبند است؛ روش ابتکاری مبتنی بر نام نمایشی، فیلدهای رایگانِ غیربولین و پسوندهای :free را برای ارائهدهندگان ثبتشدهای که سطح رایگان مستندی ندارند کنار میگذارد. در حالت غیرفعال، قاعدهٔ تاریخی نمایش نشان حفظ میشود. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | در پاسخهای تجمیعشدهٔ 429/503 مربوط به عدم دسترسپذیری، هنگامی که هیچ زمان مشخصی برای تلاش مجدد در آینده معلوم نیست، `Retry-After` را حذف میکند (بهجای مقدار مصنوعی 1 ثانیه)، `error.retry_after_provenance` (`signal` \| `none`) را اضافه میکند و به مسیرهای تخلیهٔ ترکیبی اجازه میدهد راهنمای متنیِ تلاش مجدد را از بدنههای JSON و متن سادهٔ بالادستی بخوانند. این فیلد فقط در پاسخهایی ظاهر میشود که توسط `unavailableResponse()` ساخته شدهاند؛ سایر بدنههای 429/503 بدون تغییر باقی میمانند. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | هنگامی که یک مقصد ترکیبی `priority` که فقط در صورت اتمام سهمیه برای استفادهٔ پشتیبان علامتگذاری شده است، به دلیلی که بهطور اثباتپذیر مرتبط با سهمیه نیست (باز بودن قطعکنندهٔ مدار ارائهدهنده، رد کردن پیشبینانه بر اساس تأخیر) ترکیب را متوقف میکند، بهجای 503 که ظاهری مرتبط با سهمیه دارد، پاسخ 502 میدهد. توقفهای ناشی از قفلشدن، دورهٔ انتظار، عدم دسترسپذیری، اتمام منابع و سقف همزمانی همچنان 503 را حفظ میکنند. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | یک پاسخ سادهٔ 401 از Mistral (`{"detail":"Unauthorized"}`، بدون سیگنال صریح احراز هویت) برای یک کلید لغوشده و سهمیهٔ تمامشده یکسان است. در صورت فعال بودن، بهجای پارک کردن اتصال با وضعیت `expired`، آن را وارد دورهٔ انتظار میکند؛ این کار برای هر اتصال حداکثر 3 بار در ساعت انجام میشود و مورد بعدی اتصال را پارک میکند، بنابراین یک کلید لغوشده همچنان در نهایت به وضعیت پایدار میرسد. بهطور پیشفرض غیرفعال است: هر پاسخ سادهٔ 401 از Mistral مانند گذشته اتصال را پارک میکند. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | کاتالوگ زندهٔ مدلهای xAI را برای اتصالهای `xai-oauth` با استفاده از توکن حامل OAuth از `https://api.x.ai/v1/models` دریافت میکند، بهجای آنکه از دادهٔ اولیهٔ ثابت و منجمد استفاده کند. بهطور پیشفرض غیرفعال است: `xai-oauth` بدون تغییر به ارائهٔ دادهٔ اولیهٔ ثابت ادامه میدهد. در صورت بروز هرگونه خطای تفکیک، فرایند کشف به دادهٔ اولیه بازمیگردد (تأیید نشده است که آیا x.ai توکن حامل OAuth را در این نقطهٔ پایانی میپذیرد یا خیر). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | به پاکسازی خودکار اجازه میدهد کارهای Batch API نهاییشده (تکمیلشده/ناموفق/لغوشده/منقضیشده) قدیمیتر از `OMNIROUTE_BATCH_RETENTION_DAYS` را همراه با نقاط وارسی هر خط آنها حذف کند و محتوای BLOB فایلهای بارگذاریشدهای را که از `expires_at` خود گذشتهاند پاک کند. بهطور پیشفرض غیرفعال است: تا زمانی که اپراتور آن را فعال نکند، هر نصب موجود این دادهها را دقیقاً مانند قبل نگه میدارد. مسیر `DELETE /api/v1/batches/delete-completed` که توسط اپراتور فعال میشود، در هر دو حالت بدون تأثیر باقی میماند — این مسیر یک قرارداد API عمومی، مستقل و بدون شرط است. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | حساب Antigravity انتخابشده را برای چرخهٔ حیات جریانیِ درخواستی که آن را انتخاب کرده است رزرو میکند تا تلاش مجدد همزمان یا واگذاری اعتبارنامه نتواند حسابی را که پیشتر به یک جریان در حال اجرا اختصاص یافته است دوباره انتخاب کند. دامنهٔ رزرو به (اتصال، مدل بالادستی قابل فراخوانی) محدود است؛ بنابراین یک حساب همچنان میتواند همزمان به دو مدل متفاوت سرویس دهد. هنگامی که همهٔ حسابهای واجد شرایط از قبل برای آن مدل اجاره شده باشند، درخواست بهجای تحمیل بار بیشتر بر یک حساب مشغول، پاسخ ساختیافتهٔ 503 با کد `antigravity_pool_busy` و مقدار محدودشدهٔ `Retry-After` را برمیگرداند. بهطور پیشفرض غیرفعال است: انتخاب حساب دقیقاً مانند قبل باقی میماند و هیچ رزروی انجام نمیشود. | ### CLI (5) -| کلید | نوع | پیشفرض | راهاندازی مجدد | توضیحات | -| ------------------------------------- | ------- | ------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | حالت سازگاری را برای همه کلاینتهای CLI فعال میکند. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | لایه سازگاری نام مستعار مدل را فعال میکند. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | همگامسازی خودکار دادههای قیمتگذاری را فعال میکند (همچنین به متغیر محیطی `PRICING_SYNC_ENABLED` نیاز دارد). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | پس از همگامسازی مدل ارائهدهنده، فایلهای پروفایل ~/.codex/*.config.toml را بهصورت خودکار بر اساس کاتالوگ فعال (باز)نویسی میکند. پیکربندی فعال/پیشفرض Codex هرگز تغییر نمیکند. بهطور پیشفرض غیرفعال است. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | پس از همگامسازی مدل ارائهدهنده، پروفایلهای Claude Code در ~/.claude/profiles//settings.json را بهصورت خودکار بر اساس کاتالوگ فعال (باز)نویسی میکند. پیکربندی فعال/پیشفرض Claude هرگز تغییر نمیکند. بهطور پیشفرض غیرفعال است. | +| کلید | نوع | پیشفرض | راهاندازی مجدد | توضیحات | +| ------------------------------------- | ------- | ------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | حالت سازگاری را برای همهٔ کلاینتهای CLI فعال میکند. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | لایهٔ سازگاری نام مستعار مدل را فعال میکند. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | همگامسازی خودکار دادههای قیمتگذاری را فعال میکند (همچنین به متغیر محیطی `PRICING_SYNC_ENABLED` نیاز دارد). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | پس از همگامسازی مدل ارائهدهنده، فایلهای نمایهٔ ~/.codex/*.config.toml را بهطور خودکار از کاتالوگ زنده (باز)نویسی میکند. هرگز پیکربندی فعال/پیشفرض Codex را تغییر نمیدهد. بهطور پیشفرض غیرفعال است. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | پس از همگامسازی مدل ارائهدهنده، نمایههای Claude Code در ~/.claude/profiles//settings.json را بهطور خودکار از کاتالوگ زنده (باز)نویسی میکند. هرگز پیکربندی فعال/پیشفرض Claude را تغییر نمیدهد. بهطور پیشفرض غیرفعال است. | ### سلامت (5) -| کلید | نوع | پیشفرض | توضیحات | -| ----------------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | نقطه پایانی بررسی سلامت نمونه محلی را غیرفعال میکند. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | بررسی سلامت اعتبارسنجی توکن را غیرفعال میکند. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | دسترسی به شبکه را در محیط سندباکس مهارتها فعال میکند. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | در پیمایش سلامت پروکسی، کاوشی که هدف آن را رد کرده است (401/403/429)، زنجیره شکستهای متوالی پروکسی را بازنشانی میکند. بهطور پیشفرض غیرفعال است: یک رد درخواست خنثی باقی میماند (#10654). پاسخ 5xx در هر دو حالت نامشخص باقی میماند؛ رد درخواست هرگز پروکسی را حذف، غیرفعال یا دوباره فعال نمیکند. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | بررسی یکپارچگی/سلامت DB هنگام راهاندازی را پس از آغاز پذیرش درخواستها توسط سرور (از طریق `setImmediate`) اجرا میکند، بهجای اینکه راهاندازی را تا تکمیل آن مسدود کند (#13717). بهطور پیشفرض غیرفعال است: راهاندازی دقیقاً مانند قبل از این PR مسدود میشود. | +| کلید | نوع | پیشفرض | توضیحات | +| ----------------------------------------- | ---- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | بولی | `false` | نقطه پایانی بررسی سلامت نمونه محلی را غیرفعال میکند. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | بولی | `false` | بررسی سلامت اعتبارسنجی توکن را غیرفعال میکند. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | بولی | `false` | دسترسی به شبکه را در محیط سندباکس مهارتها فعال میکند. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | بولی | `false` | در پیمایش سلامت پروکسی، اگر هدف یک کاوش را رد کند (401/403/429)، شمار شکستهای متوالی پروکسی بازنشانی میشود. بهطور پیشفرض غیرفعال است: رد شدن خنثی باقی میماند (#10654). پاسخ 5xx در هر دو حالت نامشخص باقی میماند؛ رد شدن هرگز باعث حذف، غیرفعالسازی یا فعالسازی مجدد پروکسی نمیشود. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | بولی | `false` | بررسی یکپارچگی/سلامت DB هنگام راهاندازی را پس از آنکه سرور پذیرش درخواستها را آغاز کرد (از طریق `setImmediate`) اجرا میکند، بهجای اینکه راهاندازی را تا زمان تکمیل آن مسدود کند (#13717). بهطور پیشفرض غیرفعال است: راهاندازی دقیقاً مانند قبل از این PR مسدود میشود. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` و نام مستعار قدیمی آن -> `INJECTION_GUARD_BLOCK_THRESHOLD` حالت `block` مربوط به -> `INJECTION_GUARD_MODE` را تنظیم میکنند، اما متغیرهای محیطی سادهای هستند که توسط +> `INPUT_SANITIZER_BLOCK_THRESHOLD` و نام مستعار قدیمی آن، +> `INJECTION_GUARD_BLOCK_THRESHOLD`، حالت `block` مربوط به +> `INJECTION_GUARD_MODE` را تنظیم میکنند، اما متغیرهای محیطی معمولی هستند که توسط > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> خوانده میشوند، نه پرچمهای ویژگی: آنها نه بازنویسی DB دارند و نه کلید تغییر وضعیت در داشبورد. مراجعه کنید به +> خوانده میشوند و پرچم ویژگی نیستند: نه بازنویسی DB دارند و نه کلید تغییر وضعیت در داشبورد. بنگرید به > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> ستون `راهاندازی مجدد` پرچمهای دارای `requiresRestart: true` را مشخص میکند — مقدار -> فوراً ذخیره میشود، اما تنها پس از بارگذاری مجدد فرایند اعمال میشود. پرچمهای -> enum هر مقداری خارج از مجموعه مجاز خود را رد میکنند (اعتبارسنجی در سمت سرور هم در -> `setFeatureFlagOverride()` و هم در کنترلکننده REST `PUT` انجام میشود). +> ستون `Restart` پرچمهایی را مشخص میکند که دارای `requiresRestart: true` هستند — مقدار +> فوراً ذخیره میشود، اما تنها پس از بارگذاری مجدد فرایند اثر میگذارد. پرچمهای +> enum هر مقداری خارج از مجموعه مجاز خود را رد میکنند (اعتبارسنجی در سمت سرور، هم در +> `setFeatureFlagOverride()` و هم در کنترلکننده REST برای `PUT` انجام میشود). --- @@ -169,38 +171,38 @@ runtime تغییر داد و در پایگاه داده ذخیره کرد، بد ### داشبورد -به **داشبورد ← تنظیمات ← پرچمهای ویژگی** -(`/dashboard/settings/feature-flags`) بروید. شبکهٔ +به **داشبورد ← تنظیمات ← پرچمهای قابلیت** +(`/dashboard/settings/feature-flags`) بروید. شبکه (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) از موارد زیر پشتیبانی میکند: -- **جستوجو** بر اساس کلید یا توضیحات و **فیلتر** بر اساس دستهبندی (بهعلاوهٔ نمای ساختگی +- **جستجو** بر اساس کلید یا توضیحات، و **فیلتر** بر اساس دستهبندی (بهعلاوهٔ نمای مصنوعی **نیازمند راهاندازی مجدد**). - یک **کلید تغییر وضعیت** برای پرچمهای بولی و یک **فهرست کشویی** برای پرچمهای enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- یک **نشان منبع** برای هر پرچم — `DB`، `ENV` یا `DEF` — که نشان میدهد مقدار - مؤثر از کجا آمده است. +- یک **نشان منبع** برای هر پرچم — `DB`، `ENV` یا `DEF` — که نشان میدهد + مقدار مؤثر از کجا آمده است. - یک دکمهٔ **بازنشانی** (که فقط برای پرچمهای دارای منبع `DB` نمایش داده میشود) برای حذف مقدار بازنویسیشده، و یک دکمهٔ **بازنشانی همهٔ مقادیر بازنویسیشده** در پایین صفحه. - هنگام تغییر پرچمی با ویژگی `requiresRestart`، یک بنر **راهاندازی مجدد سرور** نمایش داده میشود. -### API مبتنی بر REST +### REST API همهٔ عملیات از طریق یک مسیر واحد انجام میشوند: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -هر متد به یک نشست احراز هویتشدهٔ داشبورد نیاز دارد (در غیر این صورت `401`). +هر متد به یک نشست احرازهویتشدهٔ داشبورد نیاز دارد (در غیر این صورت `401`). #### `GET /api/settings/feature-flags` -همهٔ پرچمها را همراه با مقدار مؤثر، منبع و یک خلاصه برمیگرداند. +همهٔ پرچمها را همراه با مقدار مؤثر، منبع و خلاصهای از آنها برمیگرداند. ```jsonc { "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Require API Key", - "description": "Require an API key for all incoming requests", + "label": "نیاز به کلید API", + "description": "برای همهٔ درخواستهای ورودی به یک کلید API نیاز باشد", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +212,7 @@ runtime تغییر داد و در پایگاه داده ذخیره کرد، بد "requiresRestart": false, "warningLevel": "caution", }, - // ... همهٔ 72 پرچم + // ... همهٔ 74 پرچم ], "summary": { "total": 56, @@ -224,8 +226,8 @@ runtime تغییر داد و در پایگاه داده ذخیره کرد، بد #### `PUT /api/settings/feature-flags` -یک مقدار بازنویسیشده را برای یک پرچم تنظیم یا حذف میکند. بدنه: `{ key: string; value?: string }`. -حذف `value` از بدنه، مقدار بازنویسیشده را حذف میکند (و مقدار env / پیشفرض را بازمیگرداند). +یک مقدار بازنویسیشده را تنظیم یا حذف میکند. بدنه: `{ key: string; value?: string }`. +حذف `value` باعث حذف مقدار بازنویسیشده میشود (و مقدار env / پیشفرض را بازیابی میکند). ```bash # تنظیم یک مقدار بازنویسیشده در DB @@ -239,19 +241,19 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -پاسخ، `effectiveValue`/`source` جدید، `previousValue`/ -`previousSource` و `requiresRestart` را بازتاب میدهد. کلیدهای ناشناخته و مقادیر enum +پاسخ شامل `effectiveValue`/`source` جدید، `previousValue`/ +`previousSource` و `requiresRestart` است. کلیدهای ناشناخته و مقادیر enum خارج از محدوده با `400` رد میشوند. #### `DELETE /api/settings/feature-flags` -**همهٔ** مقادیر بازنویسیشدهٔ DB را یکباره پاک میکند و هر پرچم را به مقدار env / پیشفرض آن -بازمیگرداند. `{ cleared: , message: "..." }` را برمیگرداند. +همهٔ مقادیر بازنویسیشدهٔ DB را بهصورت همزمان پاک میکند و مقدار هر پرچم را به مقدار env / پیشفرض +آن بازمیگرداند. `{ cleared: , message: "..." }` را برمیگرداند. > [!NOTE] -> پرچمهایی با `requiresRestart: true` فقط پس از بارگذاری مجدد فرایند اعمال میشوند. -> جریان راهاندازی مجدد داشبورد، `POST /api/restart` را فراخوانی میکند و سپس تا زمانی که -> سرور دوباره در دسترس قرار گیرد، `GET /api/health/ping` را بهطور دورهای بررسی میکند. +> پرچمهایی که `requiresRestart: true` دارند، فقط پس از بارگذاری مجدد فرایند اعمال میشوند. +> جریان راهاندازی مجدد داشبورد، `POST /api/restart` را فراخوانی میکند و سپس +> `GET /api/health/ping` را تا زمانی که سرور دوباره در دسترس قرار گیرد، بررسی میکند. --- diff --git a/docs/i18n/fa/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/fa/docs/reference/PROVIDER_REFERENCE.md index aaa26bd9f13f..fc2e4684f0d8 100644 --- a/docs/i18n/fa/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/fa/docs/reference/PROVIDER_REFERENCE.md @@ -6,7 +6,7 @@ > **تولیدشده بهصورت خودکار** از `src/shared/constants/providers.ts` — بهصورت دستی ویرایش نکنید. > تولید مجدد با: `npm run gen:provider-reference` -> **آخرین تولید:** 2026-09-17 +> **آخرین تولید:** 2026-09-18 تعداد کل ارائهدهندگان: **359**. تفکیک بر اساس دستهبندی را در ادامه ببینید. @@ -34,47 +34,47 @@ ## ارائهدهندگان بدون احراز هویت (بدون نیاز به کلید) (10) -| شناسه | نام مستعار | نام | برچسبها | وبسایت | یادداشتها | فراخوانی ابزار | -| ----------------------- | ---------- | ------------------------- | ---------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -| `aihorde` | `horde` | AI Horde | بدون احراز هویت | [پیوند](https://aihorde.net) | به کلید API نیازی نیست — از کلید ناشناس مستندشدهٔ AI Horde استفاده میکند. افزودن یک کلید رایگان از aihorde.net اختیاری است و فقط اولویت بالاتری در صف (kudos) فراهم میکند. | — | -| `auggie` | `aug` | Augment (Auggie CLI) | بدون احراز هویت | [پیوند](https://augmentcode.com) | هیچ کلید API توسط OmniRoute ذخیره نمیشود. Auggie CLI را نصب کنید و روی این دستگاه `auggie login` را اجرا کنید؛ سپس OmniRoute برای هر درخواست آن را بهصورت محلی اجرا میکند. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | بدون احراز هویت | [پیوند](https://playground.ai.cloudflare.com) | به هیچ اطلاعات اعتباری نیاز نیست — از نشستهای ناشناس مرورگر روی پروتکل مهندسی معکوسشدهٔ WebSocket مربوط به cf_agent (انتقال از طریق Playwright) استفاده میکند. | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | بدون احراز هویت | [پیوند](https://developers.openai.com/codex/cli) | هیچ توکنی توسط OmniRoute ذخیره نمیشود. app-server متعلق به Codex CLI ورود به ChatGPT را خودش مدیریت میکند (`~/.codex/auth.json`، با تازهسازی خودکار). اگر CLI هنوز احراز هویت نشده است، از «ورود با ChatGPT» استفاده کنید. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | بدون احراز هویت | [پیوند](https://docs.devin.ai/work-with-devin/devin-cli) | احراز هویت توسط Devin CLI رسمی در فضای ذخیرهسازی ایزولهٔ پل آن مدیریت میشود. | شبیهسازیشده | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | بدون احراز هویت | [پیوند](https://duckduckgo.com/duckchat) | به هیچ اطلاعات اعتباری نیاز نیست — DuckDuckGo AI Chat ناشناس و رایگان است. | شبیهسازیشده | -| `opencode` | `oc` | OpenCode Free | بدون احراز هویت | [پیوند](https://opencode.ai) | به کلید API نیازی نیست — از نقطه پایانی عمومی و رایگان OpenCode استفاده میکند. | — | -| `uncloseai` | `unc` | UncloseAI | بدون احراز هویت | [پیوند](https://uncloseai.com) | به احراز هویت نیازی نیست. API هر رشتهٔ غیرخالی را بهعنوان کلید شناسایی میپذیرد. اگر مدلهای داخلی قدیمیتر خطای 404 برمیگردانند، از «مدلهای موجود» ← «درونریزی از /models» یا «همگامسازی خودکار» استفاده کنید؛ مدل زندهٔ تأییدشده: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | بدون احراز هویت، ویدئو | [پیوند](https://veoaifree.com) | به احراز هویت نیازی نیست. نرخ درخواست به 6 درخواست در ساعت برای هر IP محدود شده است. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | بدون احراز هویت | [پیوند](https://zcode.z.ai) | هیچ کلید API توسط OmniRoute ذخیره نمیشود. app-server محلی ZCode از ورود موجود `builtin:zai-coding-plan` استفاده میکند. | — | +| شناسه | نام مستعار | نام | برچسبها | وبسایت | یادداشتها | فراخوانی ابزار | +| ----------------------- | ---------- | ------------------------- | ---------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- | +| `aihorde` | `horde` | AI Horde | بدون احراز هویت | [پیوند](https://aihorde.net) | به کلید API نیازی نیست — از کلید ناشناس مستندشده AI Horde استفاده میکند. افزودن یک کلید رایگان از aihorde.net اختیاری است و فقط اولویت بالاتری در صف (kudos) فراهم میکند. | — | +| `auggie` | `aug` | Augment (Auggie CLI) | بدون احراز هویت | [پیوند](https://augmentcode.com) | هیچ کلید API توسط OmniRoute ذخیره نمیشود. Auggie CLI را نصب کنید و `auggie login` را روی این دستگاه اجرا کنید؛ سپس OmniRoute آن را بهصورت محلی برای هر درخواست اجرا میکند. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | بدون احراز هویت | [پیوند](https://playground.ai.cloudflare.com) | به هیچگونه اطلاعات احراز هویت نیازی نیست — نشستهای ناشناس مرورگر از طریق پروتکل مهندسی معکوسشده WebSocket مربوط به cf_agent (انتقال Playwright) انجام میشوند. | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | بدون احراز هویت | [پیوند](https://developers.openai.com/codex/cli) | هیچ توکنی توسط OmniRoute ذخیره نمیشود. app-server مربوط به Codex CLI ورود به ChatGPT را بهطور مستقل مدیریت میکند (~/.codex/auth.json، با نوسازی خودکار). اگر CLI هنوز احراز هویت نشده است، از «ورود با ChatGPT» استفاده کنید. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | بدون احراز هویت | [پیوند](https://docs.devin.ai/work-with-devin/devin-cli) | احراز هویت توسط Devin CLI رسمی در حجم پل ایزوله آن مدیریت میشود. | شبیهسازیشده | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | بدون احراز هویت | [پیوند](https://duckduckgo.com/duckchat) | به هیچگونه اطلاعات احراز هویت نیازی نیست — DuckDuckGo AI Chat ناشناس و رایگان است. | شبیهسازیشده | +| `opencode` | `oc` | OpenCode Free | بدون احراز هویت | [پیوند](https://opencode.ai) | به کلید API نیازی نیست — از نقطه پایانی عمومی و رایگان OpenCode استفاده میکند. | — | +| `uncloseai` | `unc` | UncloseAI | بدون احراز هویت | [پیوند](https://uncloseai.com) | به احراز هویت نیازی نیست. API هر رشته غیرخالی را بهعنوان کلید شناسایی میپذیرد. اگر مدلهای داخلی قدیمیتر خطای 404 برمیگردانند، از مدلهای موجود ← وارد کردن از /models یا همگامسازی خودکار استفاده کنید؛ مدل زنده تأییدشده: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | بدون احراز هویت، ویدئو | [پیوند](https://veoaifree.com) | به احراز هویت نیازی نیست. نرخ درخواستها به 6 درخواست در ساعت برای هر IP محدود شده است. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | بدون احراز هویت | [پیوند](https://zcode.z.ai) | هیچ کلید API توسط OmniRoute ذخیره نمیشود. app-server محلی ZCode از ورود موجود builtin:zai-coding-plan استفاده میکند. | — | ## ارائهدهندگان OAuth (24) -| شناسه | نام مستعار | نام | برچسبها | وبسایت | یادداشتها | -| --------------- | ------------- | ------------------------- | ------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [پیوند](https://antigravity.google) | ورود Antigravity CLI (`agy`) خود را وارد کنید (فایل توکن آن را جایگذاری/بارگذاری کنید)، ورود محلی CLI را بهطور خودکار شناسایی کنید، یا با Google وارد شوید. از بکاند Antigravity (از جمله مدلهای Claude) بهصورت مشترک استفاده میکند. | -| `amazon-q` | `aq` | Amazon Q | OAuth | [پیوند](https://aws.amazon.com/q/developer/) | از همان AWS Builder ID یا جریان refresh-token واردشده مانند Kiro استفاده میکند، اما اتصالهای Amazon Q را جدا نگه میدارد. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [پیوند](https://cline.bot/cline-pass) | ClinePass اشتراک ماهانه ۹٫۹۹ دلاری Cline است که ۱۰ مدل کدنویسی متنباز را در یک بسته ارائه میدهد. با حساب Cline خود وارد شوید (همان ورود Cline CLI/IDE)، یا یک کلید API مستقیم ClinePass را جایگذاری کنید (app.cline.bot → تنظیمات → کلیدهای API). اشتراک ClinePass مدلهای cline-pass/* را فعال میکند. از جریان OAuth مربوط به Cline WorkOS مجدداً استفاده میکند. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [پیوند](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). از طریق جریان رسمی کد دستگاه CLI وارد شوید، یا یک کلید API مستقیم را جایگذاری کنید (بهصورت Authorization: Bearer ارسال میشود). فهرست مدلها: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [پیوند](https://cli.devin.ai) | به فایل اجرایی Devin CLI نیاز دارد. برای احراز هویت، `devin auth login` را اجرا کنید یا WINDSURF_API_KEY خود را ارائه دهید. نصب: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [پیوند](https://devin.ai) | یک کلید API موجود Devin را از یک نشست احرازهویتشده Devin جایگذاری کنید. امکان در دسترس بودن و مراحل صادر کردن کلید بسته به نسخه Devin و حساب متفاوت است. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | نشانی URL نمونه GHE خود (برای مثال، https://ghe.company.com) را در تنظیمات ارائهدهنده وارد کنید، سپس از طریق جریان دستگاه احراز هویت کنید. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [پیوند](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | OAuth مربوط به GitLab Duo پیکربندی نشده است. یک برنامه OAuth در https://gitlab.com/-/profile/applications با URI تغییرمسیر http://localhost:20128/callback و دامنههای دسترسی "ai_features read_user" ثبت کنید، سپس GITLAB_DUO_OAUTH_CLIENT_ID (و در صورت تمایل GITLAB_DUO_OAUTH_CLIENT_SECRET) را تنظیم کرده و راهاندازی مجدد کنید. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | با مرورگر خود وارد شوید، یا فایل ~/.grok/auth.json (یا توکن دسترسی JWT) را از Grok Build CLI جایگذاری کنید؛ در هر دو حالت refresh_token بهطور خودکار چرخانده میشود. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [پیوند](https://www.kimi.com/code?aff=omniroute) | با همان حساب Kimi که در Kimi Code CLI استفاده میشود وارد شوید. OmniRoute از جریان OAuth مربوط به CLI و نقاط پایانی Kimi Coding Plan استفاده میکند. | -| `kiro` | `kr` | Kiro AI | OAuth | — | سطح رایگان: ۵۰ اعتبار در ماه (حدود ۲۵هزار تا ۱۰۰هزار توکن). ⚠️ شرایط خدمات Kiro استفاده از پروکسی/چارچوب اجرایی شخص ثالث را ممنوع میکند. | -| `openference` | `of` | Openference | OAuth | [پیوند](https://openference.com) | با حساب Openference خود وارد شوید تا درخواستها از طریق api.openference.com مسیریابی شوند. برای استنتاج، یک طرح فعال لازم است — OAuth ممکن است احراز هویت را انجام دهد، اما بدون طرح فعال پاسخ 402 برگرداند. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [پیوند](https://trae.ai) | Trae یک IDE بومی هوش مصنوعی از ByteDance است (عامل راهدور SOLO). از طریق trae.ai در پنجره بازشو مجوز دهید، یا در solo.trae.ai وارد شوید و Cloud-IDE-JWT را (که بهصورت 'Authorization: Cloud-IDE-JWT ' ارسال میشود و حدود ۱۴ روز اعتبار دارد) بهعنوان توکن دسترسی جایگذاری کنید؛ web_id/biz_user_id/user_unique_id/scope/tenant/region از طریق providerSpecificData منتقل میشوند. برای توکنهای جایگذاریشده، تازهسازی بدون رابط گرافیکی وجود ندارد — پس از انقضا دوباره آنها را جایگذاری کنید. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [پیوند](https://x.ai) | با xAI وارد شوید تا از مدلهای api.x.ai مانند Grok 4.5 استفاده کنید. این مورد از نشستهای JWT مربوط به Grok Build جدا است؛ آن نشستها از cli-chat-proxy.grok.com و نامهای مستعار مدل grok-build استفاده میکنند. | -| `zed` | `zd` | Zed IDE | OAuth | [پیوند](https://zed.dev) | Zed اطلاعات احراز هویت ارائهدهندگان LLM ‏(OpenAI، Anthropic، Google، Mistral، xAI) را در دستهکلید سیستمعامل ذخیره میکند. از دکمه «وارد کردن» در زیر استفاده کنید تا آنها بهطور خودکار شناسایی و وارد شوند. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [پیوند](https://zed.dev) | با حساب Zed خود وارد شوید (ورود برنامه بومی). OmniRoute یک جفتکلید یکبارمصرف RSA تولید میکند و zed.dev را برای صدور مجوز باز میکند — در یک نصب راهدور/بدون رابط گرافیکی، URL بازگشتی 127.0.0.1 حاصل را از نوار نشانی مرورگر خود کپی کرده و در اینجا جایگذاری کنید. این مورد با ورودی وارد کردن اطلاعات احراز هویت 'Zed IDE' در بالا متفاوت است: تکمیلهای گفتوگو را از طریق تجمیعکننده مدل میزبانیشده خود Zed ‏(cloud.zed.dev) پروکسی میکند و مدلهای Anthropic/OpenAI/Google/xAI را تحت طرح Zed شما ارائه میدهد. | +| شناسه | نام مستعار | نام | برچسبها | وبسایت | توضیحات | +| --------------- | ------------- | ------------------------- | ------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `agy` | `agy` | Antigravity CLI | OAuth | [پیوند](https://antigravity.google) | ورود Antigravity CLI (`agy`) خود را وارد کنید (فایل توکن آن را جایگذاری/بارگذاری کنید)، ورود محلی CLI را بهطور خودکار شناسایی کنید، یا با Google وارد شوید. از بکاند مشترک Antigravity (از جمله مدلهای Claude) استفاده میکند. | +| `amazon-q` | `aq` | Amazon Q | OAuth | [پیوند](https://aws.amazon.com/q/developer/) | از همان AWS Builder ID یا جریان refresh-token واردشده مانند Kiro استفاده میکند، اما اتصالهای Amazon Q را جدا نگه میدارد. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [پیوند](https://cline.bot/cline-pass) | ClinePass اشتراک ماهانه 9.99 دلاری Cline است که 10 مدل کدنویسی باز را در قالب یک بسته ارائه میدهد. با حساب Cline خود وارد شوید (همان اطلاعات ورود Cline CLI/IDE)، یا یک کلید API مستقیم ClinePass را جایگذاری کنید (app.cline.bot → Settings → API Keys). اشتراک ClinePass مدلهای cline-pass/* را فعال میکند. از جریان OAuth مربوط به Cline WorkOS مجدداً استفاده میکند. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [پیوند](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). از طریق جریان رسمی کد دستگاه CLI وارد شوید، یا یک کلید API مستقیم را جایگذاری کنید (بهشکل Authorization: Bearer ارسال میشود). فهرست مدلها: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [پیوند](https://cli.devin.ai) | به فایل اجرایی Devin CLI نیاز دارد. برای احراز هویت، `devin auth login` را اجرا کنید یا WINDSURF_API_KEY خود را ارائه دهید. نصب: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [پیوند](https://devin.ai) | یک کلید API موجود Devin را از نشست احراز هویتشده Devin جایگذاری کنید. امکانپذیری و مراحل برونبری کلید بسته به نسخه Devin و حساب متفاوت است. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | URL نمونه GHE خود را (مثلاً https://ghe.company.com) در تنظیمات ارائهدهنده وارد کنید، سپس از طریق جریان دستگاه احراز هویت کنید. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [پیوند](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | OAuth مربوط به GitLab Duo پیکربندی نشده است. یک برنامه OAuth در https://gitlab.com/-/profile/applications با URI تغییر مسیر http://localhost:20128/callback و دامنههای دسترسی "ai_features read_user" ثبت کنید، سپس GITLAB_DUO_OAUTH_CLIENT_ID (و در صورت تمایل GITLAB_DUO_OAUTH_CLIENT_SECRET) را تنظیم کرده و راهاندازی مجدد کنید. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | با مرورگر خود وارد شوید، یا فایل ~/.grok/auth.json خود (یا توکن دسترسی JWT) را از Grok Build CLI جایگذاری کنید؛ refresh_token در هر دو حالت بهطور خودکار چرخانده میشود. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [پیوند](https://www.kimi.com/code?aff=omniroute) | با همان حساب Kimi که در Kimi Code CLI استفاده میشود وارد شوید. OmniRoute از جریان OAuth مربوط به CLI و نقاط پایانی Kimi Coding Plan استفاده میکند. | +| `kiro` | `kr` | Kiro AI | OAuth | — | سطح رایگان: 50 اعتبار در ماه (حدود 25K تا 100K توکن). ⚠️ شرایط استفاده Kiro استفاده از پراکسیها/چارچوبهای شخص ثالث را ممنوع میکند. | +| `openference` | `of` | Openference | OAuth | [پیوند](https://openference.com) | با حساب Openference خود وارد شوید تا درخواستها از طریق api.openference.com مسیریابی شوند. شامل دسترسی سطح رایگان به Qwen3.8 27b و Llama 3.2 3B است — برای مشاهده شرایط فعلی طرح، به openference.com/pricing مراجعه کنید. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [پیوند](https://trae.ai) | Trae یک IDE مبتنی بر هوش مصنوعی از ByteDance است (عامل راهدور SOLO). از طریق trae.ai در پنجره بازشو مجوز دهید، یا در solo.trae.ai وارد شوید و Cloud-IDE-JWT را (که بهشکل 'Authorization: Cloud-IDE-JWT ' ارسال میشود و حدود 14 روز اعتبار دارد) بهعنوان توکن دسترسی جایگذاری کنید؛ web_id/biz_user_id/user_unique_id/scope/tenant/region از طریق providerSpecificData منتقل میشوند. برای توکنهای جایگذاریشده، تازهسازی بدون رابط گرافیکی وجود ندارد — پس از انقضا دوباره آن را جایگذاری کنید. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [پیوند](https://x.ai) | برای استفاده از مدلهای api.x.ai مانند Grok 4.5 با xAI وارد شوید. این مورد از نشستهای JWT مربوط به Grok Build جدا است؛ آن نشستها از cli-chat-proxy.grok.com و نامهای مستعار مدل grok-build استفاده میکنند. | +| `zed` | `zd` | Zed IDE | OAuth | [پیوند](https://zed.dev) | Zed اطلاعات ورود ارائهدهندگان LLM (OpenAI، Anthropic، Google، Mistral و xAI) را در دستهکلید سیستمعامل ذخیره میکند. برای یافتن و وارد کردن خودکار آنها، از دکمه Import در پایین استفاده کنید. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [پیوند](https://zed.dev) | با حساب Zed خود وارد شوید (ورود برنامه بومی). OmniRoute یک جفتکلید یکبارمصرف RSA ایجاد میکند و zed.dev را برای مجاز کردن آن باز میکند — در نصب راهدور/بدون رابط گرافیکی، URL فراخوانی برگشتی 127.0.0.1 ایجادشده را از نوار نشانی مرورگر خود کپی کرده و اینجا جایگذاری کنید. این مورد با ورودی وارد کردن اطلاعات ورود «Zed IDE» در بالا متفاوت است: تکمیلهای چت را از طریق گردآورنده مدل میزبانیشده خود Zed (cloud.zed.dev) پراکسی میکند و مدلهای Anthropic/OpenAI/Google/xAI را تحت طرح Zed شما ارائه میدهد. | ## ارائهدهندگان کوکی وب (34) @@ -117,250 +117,250 @@ ## ارائهدهندگان کلید API (پولی / پولی با اعتبار رایگان) (242) -| شناسه | نام مستعار | نام | برچسبها | وبسایت | یادداشتها | -| ------------------------ | --------------- | ------------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | کلید API | [پیوند](https://ai.360.cn) | کلید API را از ai.360.cn دریافت کنید | -| `agentrouter` | `agentrouter` | AgentRouter | کلید API، تجمیعکننده | [پیوند](https://agentrouter.org) | ۲۰۰ دلار اعتبار رایگان هنگام ثبتنام — درگاه مسیریابی چندمدلی | -| `agnes` | `agnes` | Agnes AI | کلید API، ویدئو | [پیوند](https://agnes-ai.com) | کلید API را از agnes-ai.com دریافت کنید | -| `agnes-cn` | `agnescn` | Agnes AI (چین) | کلید API | [پیوند](https://api.agnes-ai.cn) | کلید API را از سایت Agnes CN دریافت کنید. | -| `ai21` | `ai21` | AI21 Labs | کلید API | [پیوند](https://www.ai21.com) | ۱۰ دلار اعتبار آزمایشی هنگام ثبتنام (با اعتبار ۳ ماهه)، بدون نیاز به کارت اعتباری | -| `aimlapi` | `aiml` | AI/ML API | کلید API، تجمیعکننده | [پیوند](https://aimlapi.com) | سطح رایگان متوقف شده است (2026) — اکنون AI/ML API فقط بهصورت پرداخت بهازای مصرف ارائه میشود (حداقل افزایش موجودی ۲۰ دلار)؛ اعتبار رایگان دورهای وجود ندارد. | -| `ainative` | `ainative` | AINative Studio | کلید API | [پیوند](https://ainative.studio) | یک کلید API رایگان در ainative.studio ایجاد کنید (بدون نیاز به کارت)، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | -| `aion` | `aion` | Aion Labs | کلید API | [پیوند](https://www.aionlabs.ai) | یک کلید API رایگان در aionlabs.ai ایجاد کنید (بدون نیاز به کارت)، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | کلید API | [پیوند](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (چین) | کلید API | [پیوند](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | کلید API | [پیوند](https://developer.ant-ling.com/en/docs/) | ثبتنام کنید و در کنسول API متعلق به Ant Ling به نشانی (https://chat.ant-ling.com/open) یک کلید API بسازید، سپس آن را در اینجا جایگذاری کنید. OmniRoute ترافیک چت را به https://api.ant-ling.com/v1/chat/completions هدایت میکند؛ این ارائهدهنده با OpenAI سازگار است و یک رابط سازگار با Anthropic نیز ارائه میدهد. | -| `anthropic` | `anthropic` | Anthropic | کلید API | [پیوند](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | کلید API، تجمیعکننده | [پیوند](https://anyapi.ai) | طرح رایگان: روزانه ۱۰۰٬۰۰۰ توکن ANY و ۱۰۰ RPM برای مدلهای واجد شرایط Free/Basic؛ بدون نیاز به کارت اعتباری. | -| `api-airforce` | `af` | Api.airforce | کلید API | [پیوند](https://api.airforce) | ۵۵ مدل در سطح رایگان، از جمله Grok-3، Claude 3.7، Qwen3، Kimi-K2، Gemini 2.5 Flash و DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | کلید API | [پیوند](https://arcee.ai) | کلید API را از arcee.ai دریافت کنید | -| `auriko` | `auriko` | Auriko | کلید API، تجمیعکننده | [پیوند](https://www.auriko.ai) | طرح رایگان، ۱٬۰۰۰ RPM برای پلتفرم و ۱۰٬۰۰۰ RPM برای BYOK ارائه میکند. هزینه استنتاج پلتفرم همچنان از طریق ارائهدهنده محاسبه میشود؛ این طرح شامل مجموعهای از توکنهای رایگان یا استنتاج رایگان نامحدود نیست. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | کلید API، سازمانی | [پیوند](https://learn.microsoft.com/azure/ai-foundry) | از کلید Azure AI Foundry خود استفاده کنید. نشانی پایه میتواند https://.services.ai.azure.com/openai/v1/ یا https://.openai.azure.com/openai/v1/ باشد. | -| `azure-openai` | `azure` | Azure OpenAI | کلید API، سازمانی | [پیوند](https://azure.microsoft.com/products/ai-services/openai-service) | از کلید API متعلق به Azure OpenAI خود استفاده کنید. نشانی پایه باید نقطه پایانی منبع شما باشد؛ برای مثال https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | کلید API | [پیوند](https://b.ai) | کلید API از نوع Bearer برای درگاه LLM سازگار با OpenAI متعلق به b.ai (متمایز از TheB.AI). یک کلید در https://docs.b.ai ایجاد کنید، سپس از https://api.b.ai/v1 بهعنوان نشانی پایه سازگار با OpenAI استفاده کنید. مدلها از قالب provider/model-name استفاده میکنند. | -| `baichuan` | `baichuan` | Baichuan | کلید API | [پیوند](https://www.baichuan-ai.com/) | کلید API را از platform.baichuan-ai.com دریافت کنید | -| `baidu` | `baidu` | Baidu (ERNIE) | کلید API | [پیوند](https://ernie.baidu.com/) | کلید API را از console.bce.baidu.com دریافت کنید | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | کلید API | [پیوند](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | کلید API | [پیوند](https://baseten.co) | ۳۰ دلار اعتبار آزمایشی رایگان برای استنتاج GPU | -| `bazaarlink` | `bzl` | BazaarLink | کلید API | [پیوند](https://bazaarlink.ai) | از کلید API متعلق به BazaarLink خود (که با sk-bl- آغاز میشود) در Authorization: Bearer استفاده کنید. OpenAI SDK با نشانی پایه https://bazaarlink.ai/api/v1 کار میکند. مدلها از قالب provider/model-name استفاده میکنند. | -| `bedrock` | `bedrock` | Amazon Bedrock | کلید API، سازمانی | [پیوند](https://aws.amazon.com/bedrock) | از کلید API متعلق به Amazon Bedrock خود استفاده کنید و منطقه AWS را که مدلهایتان در آن فعال هستند پیکربندی کنید (برای مثال eu-west-2). OmniRoute مستقیماً API بومی Converse متعلق به Bedrock را فراخوانی میکند. | -| `black-forest-labs` | `bfl` | Black Forest Labs | کلید API، تصویر | [پیوند](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | کلید API | [پیوند](https://blackbox.ai) | ⚠️ **منسوخ شده است.** api.blackbox.ai برای همه گونههای مسیر، HTTP 404 برمیگرداند (بررسی گسترده در 2026-08-21)؛ رابط عمومی استنتاج به نقطه پایانی محدودشده enterprise.blackbox.ai/v1 منتقل شده است. | -| `bluesminds` | `bm` | BluesMinds | کلید API | [پیوند](https://www.bluesminds.com) | اعتبارهای رایگان روزانه pi — پشتیبانی از بیش از ۲۰۰ مدل، از جمله GPT-4o، GPT-4.1، Claude Sonnet 4.5، Gemini 2.0 Flash، DeepSeek V4، Qwen و Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | کلید API | [پیوند](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | کلید API | [پیوند](https://bytez.com) | ۱ دلار اعتبار رایگان که هر ۴ هفته تمدید میشود | -| `cerebras` | `cerebras` | Cerebras | کلید API | [پیوند](https://inference.cerebras.ai) | ۵ دلار اعتبار یکباره هنگام ثبتنام (با اعتبار ۳۰ روزه)؛ ارائه روش پرداخت الزامی است. این یک سطح رایگان دورهای نیست. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | کلید API | [پیوند](https://hyper.charm.land) | ۱۰۰ Hypercredit رایگان ماهانه هنگام ثبتنام | -| `chat-oripe` | `chat-oripe` | Chat Oripe | کلید API، تجمیعکننده | [پیوند](https://api.oriper.com) | فراداده رسمی، ماهانه ۲ میلیون توکن را اعلام میکند، اما سایت عمومی و مستندات هنگام ممیزی مسدود بودند؛ سهمیه و تطبیق برند را تأییدنشده در نظر بگیرید. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | کلید API، تجمیعکننده | [پیوند](https://chatanywhere.tech) | فقط برای استفاده شخصی، آموزشی یا پژوهشی: مستندات عمومی به 10,000 امتیاز در روز و 200 درخواست در روز بهازای هر IP/کلید اشاره میکنند؛ برای ترافیک تجاری استفاده نکنید. | -| `cheaperinference` | `cinf` | Cheaper Inference | کلید API | [پیوند](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | کلید API | [پیوند](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | کلید API، تجمیعکننده | [پیوند](https://chutes.ai) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به Chutes. | -| `clarifai` | `clarifai` | Clarifai | کلید API، سازمانی | [پیوند](https://docs.clarifai.com) | از PAT متعلق به Clarifai یا کلید API مختص برنامه خود استفاده کنید. OmniRoute نقطه پایانی سازگار با OpenAI را در https://api.clarifai.com/v2/ext/openai/v1 هدف قرار میدهد و با Authorization: Key احراز هویت میکند. | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | کلید API، تجمیعکننده | [پیوند](https://cloudcode.one) | مدلهای رایگان منتشرشده شامل glm-4.7-flash و glm-4.6v-flash هستند؛ سهمیه عددی مشخصی منتشر نشده است و ایجاد کلید ممکن است به اعتبار یا کوپن نیاز داشته باشد. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | کلید API | [پیوند](https://developers.cloudflare.com/workers-ai) | به API Token و Account ID نیاز دارد (در dash.cloudflare.com قابل یافتن است) | -| `clova-studio` | `clova` | Naver CLOVA Studio | کلید API | [پیوند](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | کلید API | [پیوند](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | کلید API | [پیوند](https://cohere.com) | دوره آزمایشی رایگان: 1,000 فراخوانی API در ماه برای آزمایش، بدون نیاز به کارت اعتباری | -| `command-code` | `cmd` | Command Code | کلید API | [پیوند](https://commandcode.ai/) | از کلید API متعلق به Command Code استفاده کنید. درخواستها به نقطه پایانی /provider/v1/chat/completions متعلق به Command Code ارسال میشوند. | -| `coze` | `coze` | Coze | کلید API | [پیوند](https://coze.com) | کلید API را از coze.com/open/api دریافت کنید | -| `crof` | `crof` | CrofAI | کلید API | [پیوند](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | کلید API | [پیوند](https://cursor.com/dashboard/api) | یک کلید API کاربری Cursor ‏(crsr_...) را از cursor.com/dashboard/api جایگذاری کنید. OmniRoute در صورت نیاز آن را با یک توکن نشست مبادله میکند؛ نیازی به IDE یا نصب cursor-agent نیست. هزینه استفاده از طرح Cursor مالک کلید کسر میشود. | -| `dahl` | `dahl` | Dahl | کلید API | [پیوند](https://inference.dahl.global) | برای تولید خودکار توکن روی «افزودن حساب» کلیک کنید یا یک کلید API را بهصورت دستی اضافه کنید. | -| `databricks` | `databricks` | Databricks | کلید API، سازمانی | [پیوند](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | کلید API، سازمانی | [پیوند](https://docs.datarobot.com) | از توکن API متعلق به DataRobot خود استفاده کنید. Base URL اختیاری میتواند ریشه حساب (برای LLM Gateway) یا URL استقرار در مسیر /api/v2/deployments/ باشد. | -| `deepai` | `deepai` | DeepAI | کلید API، تصویر | [پیوند](https://deepai.org) | از کلید API متعلق به DeepAI خود استفاده کنید. آن را از deepai.org دریافت کنید — به اشتراک Pro ‏($9.99/mo) نیاز دارد. | -| `deepinfra` | `deepinfra` | DeepInfra | کلید API | [پیوند](https://deepinfra.com) | اعتبار رایگان ثبتنام برای آزمایش API و بررسی مدلها | -| `deepseek` | `ds` | DeepSeek | کلید API | [پیوند](https://platform.deepseek.com) | 5M توکن رایگان هنگام ثبتنام — بدون نیاز به کارت اعتباری | -| `dgrid` | `dgrid` | DGrid | کلید API | [پیوند](https://dgrid.ai) | مسیریاب مدلهای رایگان DGrid: ‏10 درخواست در دقیقه و 100 درخواست در روز. یک شارژ مادامالعمر $5 سقف را به حداکثر 20 درخواست در دقیقه و 1,000 درخواست در روز افزایش میدهد. | -| `dify` | `dify` | Dify | کلید API | [پیوند](https://dify.ai) | کلید API را از نمونه Dify خود دریافت کنید. | -| `digitalocean` | `digitalocean` | DigitalOcean | کلید API | [پیوند](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | کلید API | [پیوند](https://dit.ai) | از کلید API متعلق به dit.ai خود در Authorization: Bearer استفاده کنید. کاملاً با OpenAI سازگار است — جایگزینی آماده، فقط URL پایه را به https://api.dit.ai/v1 تغییر دهید. | -| `doubao` | `doubao` | Doubao | کلید API | [پیوند](https://doubao.com) | کلید API را از console.volcengine.com دریافت کنید | -| `dxnt` | `dxnt` | DXNT / DX Token | کلید API، تجمیعکننده | [پیوند](https://www.dxnt.com) | طبق مستندات، حسابهای رایگان 100 فراخوانی در روز دارند؛ سهمیه ممکن است از طریق دعوتها افزایش یابد و بسته به حساب متفاوت باشد. | -| `electronhub` | `electronhub` | Electron Hub | کلید API، تجمیعکننده | [پیوند](https://www.electronhub.ai) | طرح رایگان: 5 RPM، اعتبار هفتگی $0.25 و 10 نوترینو در روز برای مدلهای دارای پسوند :free؛ بودجههای خانوادگی نیز اعمال میشوند. | -| `empower` | `empower` | Empower | کلید API، تجمیعکننده | [پیوند](https://docs.empower.dev) | کلید API از نوع Bearer برای نقطه پایانی سازگار با OpenAI متعلق به Empower. | -| `eurouter` | `eurouter` | EURouter | کلید API، تجمیعکننده | [پیوند](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | کلید API | [پیوند](https://factory.ai) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به Factory. | -| `fal-ai` | `fal` | Fal.ai | کلید API، تصویر | [پیوند](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | کلید API، تجمیعکننده | [پیوند](https://fastrouter.ai) | مدلهای دارای پسوند :free امکان 10 درخواست در روز بهازای هر سازمان و مدل را فراهم میکنند؛ دسترسپذیری ممکن است تغییر کند. | -| `featherless-ai` | `featherless` | Featherless AI | کلید API | [پیوند](https://featherless.ai) | سطح رایگان در دسترس است — بدون نیاز به کارت اعتباری | -| `fenayai` | `fenayai` | FenayAI | کلید API، تجمیعکننده | [پیوند](https://fenayai.com) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به FenayAI. | -| `fireworks` | `fireworks` | Fireworks AI | کلید API | [پیوند](https://fireworks.ai) | $1 اعتبار اولیه رایگان هنگام ثبتنام برای آزمایش API | -| `free-ai` | `free-ai` | Free.ai | کلید API، تجمیعکننده | [پیوند](https://free.ai) | پس از تأیید ایمیل، 30,000 توکن در روز برای مدلهای میزبانیشده توسط خودتان ارائه میشود. استفاده فراتر از این سهمیه ممکن است با هزینه خام محاسبه شود و مدلهای خارجی ممتاز پولی هستند. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | کلید API | [پیوند](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | کلید API | [پیوند](https://freebuff.com) | توکن احراز هویت Freebuff / Codebuff را وارد کنید (از طریق ورود CLI یا جمعآورنده خودکار دریافت میشود). | -| `freeinference` | `freeinference` | FreeInference | کلید API، تجمیعکننده | [پیوند](https://freeinference.org) | دسترسی رایگان پژوهشی بدون نیاز به کارت؛ متقاضیان خارج از Harvard به تأیید دستی نیاز دارند و هیچ سهمیه عددی بهصورت عمومی تضمین نشده است. | -| `freemodel-dev` | `fmd` | FreeModel.dev | کلید API | [پیوند](https://freemodel.dev) | 300 دلار اعتبار رایگان هنگام ثبتنام — بدون نیاز به کارت اعتباری. دسترسی به GPT-5.4 و GPT-5.5 (جدیدترین مدلهای پرچمدار OpenAI) از طریق یک API سازگار با OpenAI. | -| `freetheai` | `fta` | FreeTheAi | کلید API، تجمیعکننده | [پیوند](https://freetheai.xyz) | برای دریافت کلید API رایگان خود به Discord مربوط به FreeTheAi بپیوندید. | -| `friendliai` | `friendli` | FriendliAI | کلید API | [پیوند](https://friendli.ai) | سطح رایگان برای استنتاج بدون سرور — بدون نیاز به کارت اعتباری | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای ناشناس cake را در g4f.dev/chat ایجاد کنید، یا از کلید عضویت g4f.dev استفاده کنید (یکی را در g4f.dev/members.html بسازید). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای ناشناس cake را در g4f.dev/chat ایجاد کنید، یا از کلید عضویت g4f.dev استفاده کنید (یکی را در g4f.dev/members.html بسازید). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای ناشناس cake را در g4f.dev/chat ایجاد کنید، یا از کلید عضویت g4f.dev استفاده کنید (یکی را در g4f.dev/members.html بسازید). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای ناشناس cake را در g4f.dev/chat ایجاد کنید، یا از کلید عضویت g4f.dev استفاده کنید (یکی را در g4f.dev/members.html بسازید). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای ناشناس cake را در g4f.dev/chat ایجاد کنید، یا از کلید عضویت g4f.dev استفاده کنید (یکی را در g4f.dev/members.html بسازید). | -| `galadriel` | `galadriel` | Galadriel | کلید API | [پیوند](https://galadriel.com) | ⚠️ **منسوخ شده است.** api.galadriel.ai دیگر resolve نمیشود (بررسی 2026-06-19)؛ به نظر میرسد API استنتاج متوقف شده است. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | کلید API | [پیوند](https://aistudio.google.com) | سطح رایگان از طریق Google AI Studio در دسترس است؛ سهمیههای فعلی هر مدل و محدودیتهای منطقهای اعمال میشوند | -| `getgoapi` | `ggo` | GoAPI | کلید API، تجمیعکننده | [پیوند](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | کلید API | [پیوند](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | کلید API | [پیوند](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | توکن دسترسی شخصی GitLab برای API عمومی Code Suggestions. هنگام استفاده نکردن از gitlab.com، یک URL پایه خودمیزبان را پیکربندی کنید. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | کلید API | [پیوند](https://opengateway.gitlawb.com) | دسترسی رایگان MiMo (xiaomi/mimo-v2.5) در 2026-05 لغو شد — اکنون Opengateway یک درگاه اعتباری پرداخت بهمیزان مصرف است؛ هیچ مدل رایگان دورهای وجود ندارد. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | کلید API | [پیوند](https://opengateway.gitlawb.com) | طرح تبلیغاتی رایگان Nemotron در 2026-06 پایان یافت — مسیر GMI Cloud اکنون فقط بهصورت اعتباری و پرداخت بهمیزان مصرف ارائه میشود. | -| `glm` | `glm` | GLM Coding | کلید API | [پیوند](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | کلید API | [پیوند](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | کلید API | [پیوند](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | کلید API | [پیوند](https://greenpt.com) | ایجاد اشتراک API رایگان است؛ هزینه استنتاج بهازای هر توکن محاسبه میشود. هیچ سهمیه استنتاج رایگانی اعلام نشده است. | -| `groq` | `groq` | Groq | کلید API | [پیوند](https://groq.com) | طرح رایگان: سقفهای مختص هر مدل (200 هزار توکن در روز برای هر مدل چت؛ برای RPM/RPD به console.groq.com/docs/rate-limits مراجعه کنید) — هیچ روش پرداختی ثبت نشده است. | -| `haiper` | `hp` | Haiper | کلید API، ویدئو | [پیوند](https://haiper.ai) | کلید API را از haiper.ai/haiper-api دریافت کنید | -| `hcnsec` | `hcnsec` | Huancheng Public API | کلید API | [پیوند](https://api.hcnsec.cn) | کلید API را از api.hcnsec.cn دریافت کنید | -| `helixmind` | `helixmind` | HelixMind | کلید API، تجمیعکننده | [پیوند](https://helixmind.online) | ادعاهای پیشین درباره 3 RPM/50 RPD و عدم نیاز به کارت در ممیزی 2026-08-02 تأیید نشدند؛ سهمیه و صورتحساب فعلی به تأیید حساب نیاز دارند. | -| `helyxai` | `helyxai` | Helyx AI | کلید API، تجمیعکننده | [پیوند](https://helyxai.space) | مستندات طرح رایگان عملیاتی، 100,000 توکن در روز را ذکر میکنند؛ ادعای بازاریابی جداگانه سایت مبنی بر بیش از 2M با آن تناقض دارد و بهعنوان تضمین سهمیه در نظر گرفته نمیشود. | -| `heroku` | `heroku` | Heroku AI | کلید API، سازمانی | [پیوند](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | کلید API | [پیوند](https://huggingface.co) | API استنتاج رایگان برای هزاران مدل (Whisper، VITS، SDXL و غیره) | -| `hyperbolic` | `hyp` | Hyperbolic | کلید API | [پیوند](https://hyperbolic.xyz) | 1 تا 5 دلار اعتبار آزمایشی هنگام ثبتنام برای استنتاج بدون سرور | -| `ideogram` | `ideo` | Ideogram | کلید API | [پیوند](https://ideogram.ai) | کلید API را از ideogram.ai/docs/api دریافت کنید | -| `iflytek` | `iflytek` | iFlytek Spark | کلید API | [پیوند](https://xinghuo.xfyun.cn) | کلید API را از console.xfyun.cn دریافت کنید | -| `inception` | `inception` | Inception | کلید API | [پیوند](https://docs.inceptionlabs.ai) | 10M توکن رایگان هنگام ثبتنام، بدون نیاز به کارت اعتباری. | -| `inference-net` | `inet` | Inference.net | کلید API | [پیوند](https://inference.net) | 25 دلار اعتبار رایگان هنگام ثبتنام، بهعلاوه امکان دریافت کمکهزینههای پژوهشی | -| `internlm` | `internlm` | InternLM (Intern-S1) | کلید API | [پیوند](https://internlm.intern-ai.org.cn/) | سهمیه ماهانه رایگان حدود 1M توکن ورودی / 3M توکن خروجی (حدود 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | کلید API، تعبیه/بازرتبهبندی | [پیوند](https://jina.ai) | کلید Bearer API برای api.jina.ai — تعبیه، بازرتبهبندی، طبقهبندی، قطعهبندی و جستوجو. کلیدهای داشبورد بر JINA_AI_API_KEY اولویت دارند. این کارت مربوط به Reader / r.jina.ai نیست و URLها را واکشی نمیکند. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | کلید API | [پیوند](https://jina.ai/reader) | کلید Bearer API برای تبدیل URL به مارکداون در r.jina.ai (فقط /v1/web/fetch). سرویسهای /v1/embeddings یا /v1/rerank را ارائه نمیدهد. همان توکن Jina مربوط به Foundation API کار میکند؛ وقتی این کارت خالی باشد، OmniRoute از کلید داشبورد jina-ai یا JINA_AI_API_KEY دوباره استفاده میکند. | -| `kenari` | `kenari` | Kenari | کلید API | [پیوند](https://kenari.id) | کلید Kenari API خود (kn-...) را در Authorization: Bearer استفاده کنید. کاملاً سازگار با OpenAI. URL پایه API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | کلید API | [پیوند](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | کلید API، تجمیعکننده | [پیوند](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | کلید API | [پیوند](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | کلید API | [پیوند](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | کلید API | [پیوند](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | کلید API، تجمیعکننده | [پیوند](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | کلید API، ویدئو | [پیوند](https://leonardo.ai) | کلید API را از leonardo.ai/developer دریافت کنید. | -| `liquid` | `liquid` | Liquid AI | کلید API | [پیوند](https://liquid.ai) | کلید API را از liquid.ai دریافت کنید. | -| `literouter` | `literouter` | LiteRouter | کلید API، تجمیعکننده | [پیوند](https://literouter.com) | گونههای رایگان مدل از پسوند :free استفاده میکنند؛ محدودیت اعتبار روزانه بسته به مدل متفاوت است و ورودی رایگان به 5,000 توکن محدود میشود. | -| `llamagate` | `llamagate` | LlamaGate | کلید API | [پیوند](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | کلید API، تجمیعکننده | [پیوند](https://llm.kiwi) | طرح رایگان، auto و hrLLM را ارائه میدهد؛ محدودیت منتشرشده 40 درخواست در ساعت برای hrLLM اعمال میشود. | -| `llm7` | `llm7` | LLM7.io | کلید API | [پیوند](https://llm7.io) | از هر کلید غیرخالی استفاده کنید (برای مثال 'unused'). اگر مدلهای داخلی قدیمی model_unavailable برمیگردانند، از Available Models → Import from /models یا Auto-Sync استفاده کنید؛ مدل زنده تأییدشده: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | کلید API، تجمیعکننده | [پیوند](https://llmgateway.io) | طرح رایگان میزبانیشده: وقتی حساب هیچ اعتباری ندارد، مدلهای رایگان به 5 درخواست در هر 10 دقیقه محدود میشوند. | -| `logfare` | `logfare` | Logfare | کلید API، تجمیعکننده | [پیوند](https://logfare.ai) | برای دریافت فوری کلید API، در https://logfare.ai/register یک حساب رایگان بسازید (نام کاربری/گذرواژه، بدون تأیید ایمیل)، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | -| `longcat` | `lc` | LongCat AI | کلید API | [پیوند](https://longcat.chat/platform/docs) | رایگان: اعتبار یکباره 10M توکن پس از ثبتنام حساب و تأیید KYC (LongCat-2.0). فقط یکبار — نه سهمیهای تکرارشونده بهصورت روزانه/ماهانه. | -| `magnific` | `freepik` | Magnific | کلید API، تصویر | [پیوند](https://www.magnific.com) | یک کلید API از magnific.com/user/api-keys دریافت کنید (هدر x-magnific-api-key). کلیدهای قدیمی توسعهدهندگان Freepik همچنان کار میکنند. | -| `maritalk` | `maritalk` | Maritalk | کلید API | [پیوند](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | کلید API، تجمیعکننده | [پیوند](https://meganova.ai) | ثبتنام رایگان بدون کارت. مجموع سهمیههای منتشرشده Tier 1 برای هر مدل، 550 درخواست در روز است؛ این سهمیهها یک مخزن سراسری مشترک نیستند و در صورت فعال بودن، ممکن است هزینه مصرف مازاد اعمال شود. | -| `meta-llama` | `meta` | Meta Llama API | کلید API | [پیوند](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | کلید API، ویدئو | [پیوند](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (China) | کلید API | [پیوند](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | کلید API | [پیوند](https://mistral.ai) | سطح رایگان Experiment: دسترسی با محدودیت نرخ به همه مدلها، بدون نیاز به کارت اعتباری | -| `mixedbread` | `mxbai` | Mixedbread AI | کلید API | [پیوند](https://www.mixedbread.com) | کلید Bearer API برای API تعبیههای Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | کلید API، تجمیعکننده | [پیوند](https://www.mixlayer.com) | مدل qwen/qwen3.5-4b-free برای نمونهسازی رایگان است و محدودیت نرخ دارد؛ هیچ RPM ثابت عمومی یا سهمیه روزانهای تأیید نشده است. | -| `mnn-ai` | `mnn-ai` | MNN AI | کلید API، تجمیعکننده | [پیوند](https://mnnai.ru) | طرح رایگان: $1 اعتبار ماهانه، 10 RPM و دسترسی فقط به مدلهایی که با Free علامتگذاری شدهاند. | -| `modal` | `mdl` | Modal | کلید API، سازمانی | [پیوند](https://modal.com/docs) | در صورت فعال بودن، از توکن Bearer که از استقرار Modal شما محافظت میکند استفاده کنید. URL پایه باید به برنامه سازگار با OpenAI در Modal شما اشاره کند، برای مثال https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | کلید API | [پیوند](https://modelscope.cn) | سطح رایگان از طریق ModelScope API-Inference — نیازمند حساب Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | کلید API | [پیوند](https://monsterapi.ai) | ⚠️ **منسوخشده.** Monster API در 2026-06-30 فعالیت خود را متوقف کرد. از ارائهدهندگان جایگزین سازگار با OpenAI استفاده کنید. | -| `moonshot` | `moonshot` | Kimi | کلید API | [پیوند](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | کلید API | [پیوند](https://morphllm.com) | سطح رایگان: 250K اعتبار در ماه، $0 | -| `muse-code` | `mc` | Muse Code (Meta) | کلید API | [پیوند](https://github.com/meta-llama/llama-stack) | از متغیر محیطی META_API_KEY خود بهعنوان توکن Bearer استفاده کنید. Muse Code CLI از قالب انتقال OpenAI Responses API استفاده میکند (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | کلید API، تجمیعکننده | [پیوند](https://naga.ac) | کلید API را از naga.ac دریافت کنید — ثبتنام با Google/GitHub/Discord در دسترس است. | -| `naga-ai` | `naga-ai` | Naga AI | کلید API، تجمیعکننده | [پیوند](https://naga.ac) | مدلهای علامتگذاریشده با :free بهصورت عمومی فهرست شدهاند، اما هیچ سهمیهٔ عددی تأیید نشده است. خطمشی Naga هشدار میدهد که پرامپتها و خروجیهای سطح رایگان ممکن است جمعآوری شوند یا برای آموزش استفاده شوند. | -| `nanogpt` | `nanogpt` | NanoGPT | کلید API | [پیوند](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | کلید API | [پیوند](https://bynara.id) | یک حساب رایگان NaraRouter ایجاد کنید، Telegram خود را پیوند دهید (پیش از پاسخهای /v1 الزامی است)، سپس کلید را در اینجا بهعنوان توکن Bearer وارد کنید. | -| `navy` | `navy` | NavyAI | کلید API | [پیوند](https://api.navy) | یک کلید API رایگان از داشبورد NavyAI ایجاد کنید، سپس آن را در اینجا بهعنوان توکن Bearer وارد کنید. | -| `nebius` | `nebius` | Nebius AI | کلید API | [پیوند](https://nebius.com) | حدود $1 اعتبار آزمایشی هنگام ثبتنام برای آزمایش API | -| `nlpcloud` | `nlpc` | NLP Cloud | کلید API | [پیوند](https://docs.nlpcloud.com) | از کلید API مربوط به NLP Cloud خود در Authorization: Token استفاده کنید. OmniRoute بهطور پیشفرض نقطهٔ پایانی چتبات در https://api.nlpcloud.io/v1/gpu//chatbot را هدف قرار میدهد. | -| `nomic` | `nomic` | Nomic | کلید API | [پیوند](https://nomic.ai) | کلید API را از atlas.nomic.ai دریافت کنید | -| `nous-research` | `nous` | Nous Research | کلید API | [پیوند](https://portal.nousresearch.com/help) | از کلید API مربوط به Nous Portal خود استفاده کنید. OmniRoute نقطهٔ پایانی رسمی استنتاج سازگار با OpenAI در https://inference-api.nousresearch.com/v1 را هدف قرار میدهد. | -| `novita` | `novita` | Novita AI | کلید API، ویدئو، تجمیعکننده | [پیوند](https://novita.ai) | $0.50 اعتبار آزمایشی هنگام ثبتنام (با اعتبار حدود ۱ سال) | -| `nscale` | `nscale` | nScale | کلید API | [پیوند](https://nscale.com) | $5 اعتبار رایگان هنگام ثبتنام برای آزمایش استنتاج | -| `nube` | `nube` | Nube.sh | کلید API | [پیوند](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | کلید API | [پیوند](https://build.nvidia.com) | دسترسی رایگان توسعهدهندگان: حدود 40 RPM، بیش از ۷۰ مدل (Kimi K2.5، GLM 4.7، DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | کلید API، سازمانی | [پیوند](https://www.oracle.com/artificial-intelligence/generative-ai) | از کلید API مربوط به OCI Generative AI یا توکن حامل IAM خود استفاده کنید. نشانی پایه میتواند https://inference.generativeai..oci.oraclecloud.com/openai/v1/ باشد. | -| `ofoxai` | `ofoxai` | OfoxAI | کلید API، تجمیعکننده | [پیوند](https://ofox.ai) | کاتالوگ فعلی بیش از ۱۰ مدل رایگان را بدون سهمیهٔ عددی عمومی تبلیغ میکند؛ پیش از استفاده در محیط عملیاتی، منشأ بالادستی و شرایط نگهداری داده و آموزش را بررسی کنید. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | کلید API | [پیوند](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | کلید API | [پیوند](https://1min.ai) | یک کلید API در https://docs.1min.ai/docs/api/create-api-key ایجاد کنید، سپس آن را اینجا وارد کنید. | -| `openadapter` | `oad` | OpenAdapter | کلید API | [پیوند](https://openadapter.dev) | از کلید API مربوط به OpenAdapter خود در Authorization: Bearer sk-cv- استفاده کنید. کاملاً با OpenAI سازگار است. نشانی پایهٔ API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | کلید API | [پیوند](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | کلید API | [پیوند](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | کلید API | [پیوند](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | کلید API | [پیوند](https://openference.com) | طرح رایگان: دورهٔ آزمایشی ۳روزه با مدلهای متنباز — بدون نیاز به کارت اعتباری | -| `openrouter` | `openrouter` | OpenRouter | کلید API، تجمیعکننده | [پیوند](https://openrouter.ai) | مدلهای رایگان با هزینهٔ $0/token و پسوند :free - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | کلید API | [پیوند](https://openvecta.com) | اعتبار رایگان هنگام ثبتنام برای استنتاج سازگار با OpenAI در مدلهای زبانی بزرگ، تعبیهها و مدلهای استدلالی | -| `opper` | `opper` | Opper | کلید API، تجمیعکننده | [پیوند](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | کلید API | [پیوند](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | کلید API | [پیوند](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | کلید API | [پیوند](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | کلید API | [پیوند](https://www.perplexity.ai) | از کلید API مربوط به Perplexity خود استفاده کنید. OmniRoute شناسههای مدل Agent API را از طریق نقطهٔ پایانی سازگار با Responses متعلق به Perplexity مسیریابی میکند. | -| `piapi` | `pi` | PiAPI | کلید API، تجمیعکننده | [پیوند](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | کلید API | [پیوند](https://pioneer.ai) | $75 اعتبار استفادهٔ رایگان — بدون نیاز به کارت اعتباری | -| `plamo` | `plamo` | PLaMo | کلید API | [پیوند](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | کلید API، تجمیعکننده | [پیوند](https://creator.poe.com/api-reference) | کلید API از نوع Bearer برای API سازگار با OpenAI متعلق به Poe. | -| `poixe-ai` | `poixe-ai` | Poixe AI | کلید API، تجمیعکننده | [پیوند](https://poixe.com) | محدودیتهای رایگان عمومی فعلی کم و مختص گروه مدل هستند: 2 RPM/5 RPD برای مدلهای large-cup و 20 RPM/50 RPD برای مدلهای small-cup. | -| `pollinations` | `pol` | Pollinations AI | کلید API، ویدئو | [پیوند](https://pollinations.ai) | دسترسی ناشناس/بدون کلید به مدلهای رایگان مستندشده بر مبنای بهترین تلاش ارائه میشود. راستیآزمایی محلی v3.8.50 در (2026-07-31) از طریق OmniRoute پاسخ 401 و در بررسیهای مستقیم بالادستی از همان شبکه خطای Cloudflare 1010 را برگرداند. مدلهای پریمیوم همچنان به کلید API مربوط به Pollinations از enter.pollinations.ai نیاز دارند. | -| `poolside` | `poolside` | Poolside | کلید API | [پیوند](https://poolside.ai) | Laguna S 2.1 و XS 2.1 در دورهٔ پیشنمایش رایگان هستند؛ هیچ سهمیهٔ عددی عمومی منتشر نشده است. | -| `predibase` | `predibase` | Predibase | کلید API | [پیوند](https://predibase.com) | ⚠️ **منسوخشده.** serving.app.predibase.com دیگر resolve نمیشود (بررسی 2026-06-19)؛ به نظر میرسد API سرویسدهی مدیریتشده متوقف شده باشد. | -| `publicai` | `publicai` | PublicAI | کلید API | [پیوند](https://publicai.co) | به کلید API نیاز دارد — اعتبار یکباره هنگام ثبتنام، سپس پولی | -| `qianfan` | `qianfan` | Baidu Qianfan | کلید API | [پیوند](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | کلید API | [پیوند](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | کلید API | [پیوند](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | کلید API | [پیوند](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | کلید API، تصویر | [پیوند](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | کلید API | [پیوند](https://regolo.ai) | کلید API مربوط به Regolo را از regolo.ai دریافت کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | -| `reka` | `reka` | Reka | کلید API | [پیوند](https://docs.reka.ai/chat/overview) | از کلید API مربوط به Reka استفاده کنید. OmniRoute از URL پایه سازگار با OpenAI به نشانی https://api.reka.ai/v1 پشتیبانی میکند و برای سازگاری، هر دو هدر Authorization و X-Api-Key را ارسال میکند. | -| `requesty` | `requesty` | Requesty | کلید API | [پیوند](https://requesty.ai) | سطح رایگان با حدود ۲۰۰ درخواست در روز — درگاه مسیریابی چندمدلی (بیش از ۳۰۰ مدل) | -| `routeway` | `routeway` | Routeway | کلید API | [پیوند](https://routeway.ai) | یک کلید API رایگان در routeway.ai ایجاد کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | -| `runwayml` | `runway` | Runway | کلید API، ویدئو | [پیوند](https://docs.dev.runwayml.com) | از کلید API مربوط به Runway در Authorization: Bearer استفاده کنید. OmniRoute از API فعلی Runway در https://api.dev.runwayml.com/v1 استفاده میکند و هدر الزامی X-Runway-Version را بهطور خودکار ارسال میکند. | -| `sambanova` | `samba` | SambaNova | کلید API | [پیوند](https://sambanova.ai) | ۵ دلار اعتبار رایگان هنگام ثبتنام (با اعتبار ۳۰روزه)، بدون نیاز به کارت اعتباری | -| `sap` | `sap` | SAP Generative AI Hub | کلید API، سازمانی | [پیوند](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | از توکن Bearer مربوط به SAP AI Core استفاده کنید. URL پایه میتواند ریشه AI_API_URL شما یا یک deploymentUrl از Generative AI Hub باشد. | -| `sarvam` | `sarvam` | Sarvam AI | کلید API | [پیوند](https://docs.sarvam.ai) | ۱٬۰۰۰ روپیه اعتبار رایگان هنگام ثبتنام — بدون تاریخ انقضا | -| `scaleway` | `scw` | Scaleway AI | کلید API | [پیوند](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | ۱ میلیون توکن رایگان برای حسابهای جدید — سازگار با EU/GDPR (پاریس)، Qwen3 235B و Llama 70B | -| `sealion` | `sealion` | SEA-LION | کلید API | [پیوند](https://sea-lion.ai) | با Google در sea-lion.ai وارد شوید (بدون نیاز به کارت و بدون محدودیت منطقهای)، یک کلید API ایجاد کنید و سپس آن را در اینجا جایگذاری کنید. | -| `seekai` | `ska` | SeekAi | کلید API، تجمیعکننده | [پیوند](https://seekai.cc) | یک کلید API در https://seekai.cc ایجاد کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | -| `segmind` | `segmind` | Segmind | کلید API، تصویر، ویدئو | [پیوند](https://segmind.com) | از کلید API مربوط به Segmind در هدر x-api-key استفاده کنید. OmniRoute از https://api.segmind.com/v1/ استفاده میکند و بایتهای تصویر/ویدئوی تولیدشده را مستقیماً بازمیگرداند. | -| `sensenova` | `sensenova` | SenseNova | کلید API | [پیوند](https://platform.sensenova.cn) | کلید API را از platform.sensenova.cn دریافت کنید | -| `siliconflow` | `siliconflow` | SiliconFlow | کلید API | [پیوند](https://cloud.siliconflow.com) | ۱ دلار اعتبار رایگان، بهعلاوه مدلهای ۰ دلاری که در حال حاضر پس از تأیید هویت فهرست شدهاند؛ دسترسپذیری و محدودیتها ممکن است تغییر کنند | -| `snowflake` | `snowflake` | Snowflake Cortex | کلید API، سازمانی | [پیوند](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | کلید API | [پیوند](https://xinghuo.xfyun.cn) | کلید API را از console.xfyun.cn دریافت کنید | -| `speka` | `speka` | Speka AI | کلید API، تجمیعکننده | [پیوند](https://speka.me) | طرح رایگان: ۱ دلار استفاده ماهانه، ۱۰ RPM، یک کلید API و دسترسی به مدلهای باز و محیط آزمایشی؛ بدون نیاز به کارت. | -| `stability-ai` | `stability` | Stability AI | کلید API، تصویر | [پیوند](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | کلید API | [پیوند](https://stepfun.com) | کلید API را از platform.stepfun.com دریافت کنید | -| `sumopod` | `sumopod` | SumoPod | کلید API | [پیوند](https://ai.sumopod.com) | از کلید API مربوط به SumoPod (sk-...) در Authorization: Bearer استفاده کنید. کاملاً سازگار با OpenAI. URL پایه API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | کلید API | [پیوند](https://suno.ai) | کوکی نشست را از suno.ai جایگذاری کنید (احراز هویت Clerk) | -| `synthetic` | `synthetic` | Synthetic | کلید API، تجمیعکننده | [پیوند](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | کلید API، تجمیعکننده | [پیوند](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | کلید API | [پیوند](https://hunyuan.tencent.com) | کلید API را از console.cloud.tencent.com دریافت کنید | -| `thebai` | `thebai` | TheB.AI | کلید API، تجمیعکننده | [پیوند](https://theb.ai) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI مربوط به TheB.AI. | -| `tinyfish` | `tf` | TinyFish Fetch | کلید API | [پیوند](https://docs.tinyfish.ai/fetch-api) | X-API-Key از agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | کلید API، ویدئو | [پیوند](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | کلید API | [پیوند](https://agent-router.gaib.ai) | از کلید API مربوط به Token Kiosk در Authorization: Bearer استفاده کنید. درگاه کاملاً سازگار با OpenAI. URL پایه API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | کلید API، تجمیعکننده | [پیوند](https://www.tokenreply.com) | مدلهای دارای برچسب رایگان، محدودیتهای روزانه مختص مدل و کمپین دارند؛ هیچ سهمیه رایگان ثابت و سراسری منتشر نشده است. | -| `tokenrouter` | `trk` | TokenRouter | کلید API | [پیوند](https://tokenrouter.com) | از کلید API مربوط به TokenRouter در Authorization: Bearer استفاده کنید. کاملاً سازگار با OpenAI. URL پایه API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | کلید API، تصویر | [پیوند](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | کلید API | [پیوند](https://docs.opentyphoon.ai) | کلید API رایگان با محدودیت نرخ ۵ درخواست در ثانیه و ۲۰۰ درخواست در دقیقه. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | کلید API | [پیوند](https://uncensored.com) | از کلید API توسعهدهنده uncensored.com خود (uai_sk_live_...) استفاده کنید. OmniRoute آن را بهعنوان هدر X-api-key به نقطه پایانی سازگار با OpenAI در https://api.uncensored.com/api/v1 ارسال میکند. این کلید هرگز منقضی نمیشود. این سطح مبتنی بر مصرف/اعتبار است؛ گفتوگوی اشتراکی بدون محاسبه مصرف، ارائهدهنده جداگانه «uc» است. | -| `udio` | `udio` | Udio | کلید API | [پیوند](https://udio.com) | کوکی نشست را از udio.com (احراز هویت Supabase) جایگذاری کنید | -| `unorouter` | `unorouter` | UnoRouter | کلید API، تجمیعکننده | [پیوند](https://unorouter.ai) | مدلهای دارای پسوند :free از موجودی کسر نمیکنند؛ محدودیت برای هر مدل رایگان بهازای هر کاربر، ۱ درخواست در دقیقه است. | -| `upstage` | `upstage` | Upstage | کلید API | [پیوند](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | کلید API | [پیوند](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | کلید API | [پیوند](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | کلید API، تجمیعکننده | [پیوند](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | کلید API، سازمانی | [پیوند](https://cloud.google.com/vertex-ai) | JSON حساب سرویس، توکن دسترسی OAuth، کلید API مربوط به Vertex Express یا کلید مجوز متصل به حساب سرویس را ارائه دهید. حالت Express فقط از Gemini پشتیبانی میکند؛ مدلهای شرکا به اعتبارنامههای محدود به پروژه نیاز دارند. | -| `vertex-partner` | `vp` | Vertex AI Partners | کلید API، سازمانی | [پیوند](https://cloud.google.com/vertex-ai) | JSON حساب سرویس یا اعتبارنامههای OAuth را ارائه دهید. کلید مجوز متصل به حساب سرویس نیز از شناسایی پشتیبانی میکند، اما استنتاج شریک علاوه بر آن به شناسه پروژه Google Cloud مربوطه نیاز دارد. کلیدهای استاندارد Express فقط از Gemini پشتیبانی میکنند. | -| `void-ai` | `void-ai` | Void AI | کلید API، تجمیعکننده | [پیوند](https://voidai.app) | کاتالوگ عمومی مدلها برخی مدلها را با الزام طرح رایگان مشخص میکند، اما دسترسی مشروط است و هیچ سهمیه عددی تأیید نشده است. | -| `volcengine` | `volcengine` | Volcengine | کلید API | [پیوند](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | کلید API | [پیوند](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | حساب Volcano Engine خود را متصل کنید یا از کلید API اشتراک Ark Agent Plan استفاده کنید. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | کلید API | [پیوند](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | حساب Volcano Engine خود را متصل کنید یا از کلید API اشتراک Ark Coding Plan استفاده کنید. | -| `voyage-ai` | `voyage` | Voyage AI | کلید API، تعبیه/بازرتبهبندی | [پیوند](https://www.voyageai.com) | کلید API از نوع Bearer برای APIهای تعبیه و بازرتبهبندی Voyage AI. | -| `wafer` | `wafer` | Wafer AI | کلید API | [پیوند](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | کلید API | [پیوند](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | کلید API، سازمانی | [پیوند](https://www.ibm.com/products/watsonx-ai) | از توکن bearer مربوط به watsonx خود استفاده کنید. نشانی URL پایه میتواند https://.ml.cloud.ibm.com/ml/gateway/v1/ یا یک نقطه پایانی خودمدیریتشده /ml/gateway/v1 باشد. | -| `writer` | `writer` | Writer | کلید API | [پیوند](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | کلید API | [پیوند](https://x5lab.dev) | از کلید API مربوط به X5Lab خود (x5-...) در Authorization: Bearer استفاده کنید. کاملاً با OpenAI سازگار است. نشانی URL پایه API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | کلید API | [پیوند](https://x.ai) | از یک کلید API رسمی xAI استفاده کنید یا با OAuth مربوط به xAI وارد شوید. نشستهای JWT مربوط به Grok Build همچنان ارائهدهندهای جداگانه هستند. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | کلید API | [پیوند](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | کلید API | [پیوند](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | کلید API، تجمیعکننده | [پیوند](https://xkiro.com) | در xkiro.com یک حساب رایگان ایجاد کنید و کلید را اینجا جایگذاری کنید (Bearer؛ x-api-key نیز پذیرفته میشود). | -| `yi` | `yi` | Yi (01.AI) | کلید API | [پیوند](https://01.ai) | کلید API را از platform.lingyiwanwu.com دریافت کنید | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | کلید API، تجمیعکننده | [پیوند](https://yolo-auto.com) | دسترسی رایگان به API دارای محدودیت درخواست و برای آزمایش در نظر گرفته شده است؛ هیچ سهمیه عددی روزانهای منتشر نشده و تداوم دائمی دسترسی رایگان تضمین نشده است. | -| `zai` | `zai` | Z.AI | کلید API | [پیوند](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | کلید API | [پیوند](https://zenmux.ai) | از کلید API مربوط به ZenMux خود در Authorization: Bearer استفاده کنید. ZenMux کاملاً با OpenAI سازگار است. نشانی URL پایه: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | کلید API، تجمیعکننده | [پیوند](https://www.zerolimitai.com) | دوره آزمایشی رایگان موقت تبلیغ شده است، اما صفحات رسمی درباره مدت ۳ یا ۷ روز تناقض دارند؛ ادعای ۱۰۰ فراخوانی در روز دائمی تلقی نمیشود. | -| `zylo-api` | `zylo` | Zylo API | کلید API، تجمیعکننده | [پیوند](https://zyloai.net) | طرح Basic: ۱۰ درخواست در دقیقه، ۷٬۲۰۰ درخواست در روز و ۲۰۰٬۰۰۰ توکن در روز؛ محدود به مدلهای متنی Basic. | +| ID | نام مستعار | نام | برچسبها | وبسایت | یادداشتها | +| ------------------------ | --------------- | ------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | کلید API | [پیوند](https://ai.360.cn) | کلید API را از ai.360.cn دریافت کنید | +| `agentrouter` | `agentrouter` | AgentRouter | کلید API، تجمیعکننده | [پیوند](https://agentrouter.org) | با ثبتنام، ۲۰۰ دلار اعتبار رایگان دریافت کنید — درگاه مسیریابی چندمدلی | +| `agnes` | `agnes` | Agnes AI | کلید API، ویدئو | [پیوند](https://agnes-ai.com) | کلید API را از agnes-ai.com دریافت کنید | +| `agnes-cn` | `agnescn` | Agnes AI (چین) | کلید API | [پیوند](https://api.agnes-ai.cn) | کلید API را از وبسایت چینی Agnes دریافت کنید. | +| `ai21` | `ai21` | AI21 Labs | کلید API | [پیوند](https://www.ai21.com) | با ثبتنام، ۱۰ دلار اعتبار آزمایشی دریافت کنید (با اعتبار ۳ماهه)؛ نیازی به کارت اعتباری نیست | +| `aimlapi` | `aiml` | AI/ML API | کلید API، تجمیعکننده | [پیوند](https://aimlapi.com) | سطح رایگان متوقف شده است (2026) — اکنون AI/ML API فقط بهصورت پرداخت بهمیزان مصرف ارائه میشود (حداقل افزایش موجودی ۲۰ دلار)؛ هیچ اعتبار رایگان دورهای وجود ندارد. | +| `ainative` | `ainative` | AINative Studio | کلید API | [پیوند](https://ainative.studio) | یک کلید API رایگان در ainative.studio ایجاد کنید (بدون نیاز به کارت)، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `aion` | `aion` | Aion Labs | کلید API | [پیوند](https://www.aionlabs.ai) | یک کلید API رایگان در aionlabs.ai ایجاد کنید (بدون نیاز به کارت)، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | کلید API | [پیوند](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (چین) | کلید API | [پیوند](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | کلید API | [پیوند](https://developer.ant-ling.com/en/docs/) | ثبتنام کنید و در کنسول API متعلق به Ant Ling (https://chat.ant-ling.com/open) یک کلید API بسازید، سپس آن را در اینجا جایگذاری کنید. OmniRoute ترافیک چت را به https://api.ant-ling.com/v1/chat/completions هدایت میکند؛ این ارائهدهنده با OpenAI سازگار است و همچنین یک رابط سازگار با Anthropic ارائه میدهد. | +| `anthropic` | `anthropic` | Anthropic | کلید API | [پیوند](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | کلید API، تجمیعکننده | [پیوند](https://anyapi.ai) | طرح رایگان: روزانه ۱۰۰٬۰۰۰ توکن ANY و ۱۰۰ درخواست در دقیقه برای مدلهای واجد شرایط Free/Basic؛ نیازی به کارت اعتباری نیست. | +| `api-airforce` | `af` | Api.airforce | کلید API | [پیوند](https://api.airforce) | ۵۵ مدل در سطح رایگان، از جمله Grok-3، Claude 3.7، Qwen3، Kimi-K2، Gemini 2.5 Flash و DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | کلید API | [پیوند](https://arcee.ai) | کلید API را از arcee.ai دریافت کنید | +| `auriko` | `auriko` | Auriko | کلید API، تجمیعکننده | [پیوند](https://www.auriko.ai) | طرح رایگان، ۱٬۰۰۰ RPM برای پلتفرم و ۱۰٬۰۰۰ RPM برای BYOK ارائه میکند. استنتاج پلتفرم همچنان شامل هزینه ارائهدهنده میشود؛ این یک مخزن توکن رایگان یا استنتاج رایگان نامحدود نیست. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | کلید API، سازمانی | [پیوند](https://learn.microsoft.com/azure/ai-foundry) | از کلید Azure AI Foundry خود استفاده کنید. نشانی پایه میتواند https://.services.ai.azure.com/openai/v1/ یا https://.openai.azure.com/openai/v1/ باشد. | +| `azure-openai` | `azure` | Azure OpenAI | کلید API، سازمانی | [پیوند](https://azure.microsoft.com/products/ai-services/openai-service) | از کلید API متعلق به Azure OpenAI خود استفاده کنید. نشانی پایه باید نقطه پایانی منبع شما باشد؛ برای مثال https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | کلید API | [پیوند](https://b.ai) | کلید API از نوع Bearer برای درگاه LLM سازگار با OpenAI متعلق به b.ai (متمایز از TheB.AI). یک کلید در https://docs.b.ai ایجاد کنید، سپس از https://api.b.ai/v1 بهعنوان نشانی پایه سازگار با OpenAI استفاده کنید. | +| `baichuan` | `baichuan` | Baichuan | کلید API | [پیوند](https://www.baichuan-ai.com/) | کلید API را از platform.baichuan-ai.com دریافت کنید | +| `baidu` | `baidu` | Baidu (ERNIE) | کلید API | [پیوند](https://ernie.baidu.com/) | کلید API را از console.bce.baidu.com دریافت کنید | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | کلید API | [پیوند](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | کلید API | [پیوند](https://baseten.co) | ۳۰ دلار اعتبار آزمایشی رایگان برای استنتاج GPU | +| `bazaarlink` | `bzl` | BazaarLink | کلید API | [پیوند](https://bazaarlink.ai) | از کلید API متعلق به BazaarLink خود (که با sk-bl- شروع میشود) در Authorization: Bearer استفاده کنید. OpenAI SDK با نشانی پایه https://bazaarlink.ai/api/v1 کار میکند. مدلها از قالب provider/model-name استفاده میکنند. | +| `bedrock` | `bedrock` | Amazon Bedrock | کلید API، سازمانی | [پیوند](https://aws.amazon.com/bedrock) | از کلید API متعلق به Amazon Bedrock خود استفاده کنید و منطقه AWS را که مدلهایتان در آن فعال هستند پیکربندی کنید (برای مثال eu-west-2). OmniRoute مستقیماً API بومی Converse متعلق به Bedrock را فراخوانی میکند. | +| `black-forest-labs` | `bfl` | Black Forest Labs | کلید API، تصویر | [پیوند](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | کلید API | [پیوند](https://blackbox.ai) | ⚠️ **منسوخ شده است.** api.blackbox.ai برای تمام گونههای مسیر، HTTP 404 برمیگرداند (بررسی جامع در 2026-08-21)؛ رابط عمومی استنتاج به نقطه پایانی محدودشده enterprise.blackbox.ai/v1 منتقل شده است. | +| `bluesminds` | `bm` | BluesMinds | کلید API | [پیوند](https://www.bluesminds.com) | اعتبار روزانه رایگان pi — پشتیبانی از بیش از ۲۰۰ مدل، از جمله GPT-4o، GPT-4.1، Claude Sonnet 4.5، Gemini 2.0 Flash، DeepSeek V4، Qwen و Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | کلید API | [پیوند](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | کلید API | [پیوند](https://bytez.com) | ۱ دلار اعتبار رایگان که هر ۴ هفته تمدید میشود | +| `cerebras` | `cerebras` | Cerebras | کلید API | [پیوند](https://inference.cerebras.ai) | اعتبار یکباره ۵ دلاری هنگام ثبتنام (با اعتبار ۳۰روزه)؛ ارائه روش پرداخت الزامی است. این یک سطح رایگان دورهای نیست. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | کلید API | [پیوند](https://hyper.charm.land) | با ثبتنام، ماهانه ۱۰۰ Hypercredit رایگان دریافت کنید | +| `chat-oripe` | `chat-oripe` | Chat Oripe | کلید API، تجمیعکننده | [پیوند](https://api.oriper.com) | فراداده رسمی، ماهانه ۲ میلیون توکن را تبلیغ میکند؛ اما وبسایت عمومی و مستندات هنگام ممیزی مسدود بودند. سهمیه و نگاشت برند را تأییدنشده در نظر بگیرید. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | کلید API، تجمیعکننده | [پیوند](https://chatanywhere.tech) | فقط برای استفاده شخصی، آموزشی یا پژوهشی: مستندات عمومی به 10,000 امتیاز در روز و 200 درخواست در روز بهازای هر IP/کلید اشاره میکنند؛ برای ترافیک تجاری استفاده نکنید. | +| `cheaperinference` | `cinf` | Cheaper Inference | کلید API | [پیوند](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | کلید API | [پیوند](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | کلید API، تجمیعکننده | [پیوند](https://chutes.ai) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به Chutes. | +| `clarifai` | `clarifai` | Clarifai | کلید API، سازمانی | [پیوند](https://docs.clarifai.com) | از PAT متعلق به Clarifai یا کلید API مختص برنامه خود استفاده کنید. OmniRoute نقطه پایانی سازگار با OpenAI در https://api.clarifai.com/v2/ext/openai/v1 را هدف قرار میدهد و با Authorization: Key احراز هویت میکند. | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | کلید API، تجمیعکننده | [پیوند](https://cloudcode.one) | مدلهای رایگان منتشرشده شامل glm-4.7-flash و glm-4.6v-flash هستند؛ هیچ سهمیه عددی منتشر نشده است و ایجاد کلید ممکن است به اعتبار یا کوپن نیاز داشته باشد. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | کلید API | [پیوند](https://developers.cloudflare.com/workers-ai) | به API Token و Account ID (قابل یافتن در dash.cloudflare.com) نیاز دارد | +| `clova-studio` | `clova` | Naver CLOVA Studio | کلید API | [پیوند](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | کلید API | [پیوند](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | کلید API | [پیوند](https://cohere.com) | آزمایش رایگان: 1,000 فراخوانی API در ماه برای آزمایش، بدون نیاز به کارت اعتباری | +| `command-code` | `cmd` | Command Code | کلید API | [پیوند](https://commandcode.ai/) | از یک کلید API متعلق به Command Code استفاده کنید. درخواستها به نقطه پایانی /provider/v1/chat/completions متعلق به Command Code ارسال میشوند. | +| `coze` | `coze` | Coze | کلید API | [پیوند](https://coze.com) | کلید API را از coze.com/open/api دریافت کنید | +| `crof` | `crof` | CrofAI | کلید API | [پیوند](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | کلید API | [پیوند](https://cursor.com/dashboard/api) | یک کلید API کاربری Cursor (crsr_...) را از cursor.com/dashboard/api جایگذاری کنید. OmniRoute در صورت نیاز آن را با یک توکن نشست مبادله میکند؛ نیازی به نصب IDE یا cursor-agent نیست. هزینه استفاده به طرح Cursor مالک کلید منظور میشود. | +| `dahl` | `dahl` | Dahl | کلید API | [پیوند](https://inference.dahl.global) | برای تولید خودکار توکن روی 'Add Account' کلیک کنید، یا یک کلید API را بهصورت دستی اضافه کنید. | +| `databricks` | `databricks` | Databricks | کلید API، سازمانی | [پیوند](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | کلید API، سازمانی | [پیوند](https://docs.datarobot.com) | از توکن API متعلق به DataRobot استفاده کنید. Base URL اختیاری میتواند ریشه حساب (برای LLM Gateway) یا URL استقرار در مسیر /api/v2/deployments/ باشد. | +| `deepai` | `deepai` | DeepAI | کلید API، تصویر | [پیوند](https://deepai.org) | از کلید API متعلق به DeepAI استفاده کنید. آن را از deepai.org دریافت کنید — به اشتراک Pro ($9.99/mo) نیاز دارد. | +| `deepinfra` | `deepinfra` | DeepInfra | کلید API | [پیوند](https://deepinfra.com) | اعتبار رایگان هنگام ثبتنام برای آزمایش API و بررسی مدلها | +| `deepseek` | `ds` | DeepSeek | کلید API | [پیوند](https://platform.deepseek.com) | 5M توکن رایگان هنگام ثبتنام — بدون نیاز به کارت اعتباری | +| `dgrid` | `dgrid` | DGrid | کلید API | [پیوند](https://dgrid.ai) | مسیریاب مدلهای رایگان DGrid: 10 درخواست در دقیقه و 100 درخواست در روز. افزایش اعتبار مادامالعمر به مبلغ $5، حداکثر 20 درخواست در دقیقه و 1,000 درخواست در روز را فعال میکند. | +| `dify` | `dify` | Dify | کلید API | [پیوند](https://dify.ai) | کلید API را از نمونه Dify خود دریافت کنید. | +| `digitalocean` | `digitalocean` | DigitalOcean | کلید API | [پیوند](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | کلید API | [پیوند](https://dit.ai) | از کلید API متعلق به dit.ai در Authorization: Bearer استفاده کنید. کاملاً سازگار با OpenAI — جایگزینی مستقیم که فقط کافی است URL پایه را به https://api.dit.ai/v1 تغییر دهید. | +| `doubao` | `doubao` | Doubao | کلید API | [پیوند](https://doubao.com) | کلید API را از console.volcengine.com دریافت کنید | +| `dxnt` | `dxnt` | DXNT / DX Token | کلید API، تجمیعکننده | [پیوند](https://www.dxnt.com) | برای حسابهای رایگان، 100 فراخوانی در روز مستند شده است؛ سهمیه ممکن است از طریق دعوتها افزایش یابد و بسته به حساب متفاوت باشد. | +| `electronhub` | `electronhub` | Electron Hub | کلید API، تجمیعکننده | [پیوند](https://www.electronhub.ai) | طرح رایگان: 5 RPM، اعتبار هفتگی $0.25 و 10 Neutrinos در روز برای مدلهای دارای :free؛ بودجههای خانوادگی نیز اعمال میشوند. | +| `empower` | `empower` | Empower | کلید API، تجمیعکننده | [پیوند](https://docs.empower.dev) | کلید API از نوع Bearer برای نقطه پایانی سازگار با OpenAI متعلق به Empower. | +| `eurouter` | `eurouter` | EURouter | کلید API، تجمیعکننده | [پیوند](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | کلید API | [پیوند](https://factory.ai) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به Factory. | +| `fal-ai` | `fal` | Fal.ai | کلید API، تصویر | [پیوند](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | کلید API، تجمیعکننده | [پیوند](https://fastrouter.ai) | مدلهای دارای پسوند :free، بهازای هر سازمان و مدل، 10 درخواست در روز مجاز میدانند؛ دسترسپذیری ممکن است تغییر کند. | +| `featherless-ai` | `featherless` | Featherless AI | کلید API | [پیوند](https://featherless.ai) | سطح رایگان در دسترس است — بدون نیاز به کارت اعتباری | +| `fenayai` | `fenayai` | FenayAI | کلید API، تجمیعکننده | [پیوند](https://fenayai.com) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به FenayAI. | +| `fireworks` | `fireworks` | Fireworks AI | کلید API | [پیوند](https://fireworks.ai) | اعتبار اولیه رایگان $1 هنگام ثبتنام برای آزمایش API | +| `free-ai` | `free-ai` | Free.ai | کلید API، تجمیعکننده | [پیوند](https://free.ai) | پس از تأیید ایمیل، 30,000 توکن در روز مدلهای خودمیزبان را پوشش میدهند. استفاده فراتر از این مجموعه ممکن است با هزینه خام محاسبه شود و مدلهای خارجی ممتاز پولی هستند. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | کلید API | [پیوند](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | کلید API | [پیوند](https://freebuff.com) | توکن احراز هویت Freebuff / Codebuff را وارد کنید (از طریق ورود CLI یا جمعآوریکنندهٔ خودکار بهدست میآید). | +| `freeinference` | `freeinference` | FreeInference | کلید API، تجمیعکننده | [پیوند](https://freeinference.org) | دسترسی پژوهشی رایگان بدون نیاز به کارت؛ متقاضیان خارج از هاروارد به تأیید دستی نیاز دارند و هیچ سهمیهٔ عددی بهصورت عمومی تضمین نشده است. | +| `freemodel-dev` | `fmd` | FreeModel.dev | کلید API | [پیوند](https://freemodel.dev) | هنگام ثبتنام $300 اعتبار رایگان دریافت کنید — بدون نیاز به کارت اعتباری. از طریق یک API سازگار با OpenAI به GPT-5.4 و GPT-5.5 (جدیدترین مدلهای پرچمدار OpenAI) دسترسی داشته باشید. | +| `freetheai` | `fta` | FreeTheAi | کلید API، تجمیعکننده | [پیوند](https://freetheai.xyz) | برای دریافت کلید API رایگان خود به Discord متعلق به FreeTheAi بپیوندید. | +| `friendliai` | `friendli` | FriendliAI | کلید API | [پیوند](https://friendli.ai) | سطح رایگان برای استنتاج بدون سرور — بدون نیاز به کارت اعتباری | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای cake ناشناس را در g4f.dev/chat بسازید، یا از کلید عضویت g4f.dev استفاده کنید (آن را در g4f.dev/members.html ایجاد کنید). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای cake ناشناس را در g4f.dev/chat بسازید، یا از کلید عضویت g4f.dev استفاده کنید (آن را در g4f.dev/members.html ایجاد کنید). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای cake ناشناس را در g4f.dev/chat بسازید، یا از کلید عضویت g4f.dev استفاده کنید (آن را در g4f.dev/members.html ایجاد کنید). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای cake ناشناس را در g4f.dev/chat بسازید، یا از کلید عضویت g4f.dev استفاده کنید (آن را در g4f.dev/members.html ایجاد کنید). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | کلید API، تجمیعکننده | [پیوند](https://g4f.space) | اعتبارهای cake ناشناس را در g4f.dev/chat بسازید، یا از کلید عضویت g4f.dev استفاده کنید (آن را در g4f.dev/members.html ایجاد کنید). | +| `galadriel` | `galadriel` | Galadriel | کلید API | [پیوند](https://galadriel.com) | ⚠️ **منسوخشده.** api.galadriel.ai دیگر resolve نمیشود (بررسی 2026-06-19)؛ به نظر میرسد API استنتاج متوقف شده است. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | کلید API | [پیوند](https://aistudio.google.com) | سطح رایگان از طریق Google AI Studio در دسترس است؛ سهمیههای فعلی هر مدل و محدودیتهای منطقهای اعمال میشوند | +| `getgoapi` | `ggo` | GoAPI | کلید API، تجمیعکننده | [پیوند](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | کلید API | [پیوند](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | کلید API | [پیوند](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | توکن دسترسی شخصی GitLab برای API عمومی Code Suggestions. هنگام استفادهنکردن از gitlab.com، یک URL پایهٔ خودمیزبان پیکربندی کنید. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | کلید API | [پیوند](https://opengateway.gitlawb.com) | دسترسی رایگان MiMo (xiaomi/mimo-v2.5) در 2026-05 لغو شد — Opengateway اکنون یک درگاه اعتباری پرداخت بهمیزان مصرف است؛ هیچ مدل رایگان دورهای وجود ندارد. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | کلید API | [پیوند](https://opengateway.gitlawb.com) | تبلیغ رایگان Nemotron در 2026-06 پایان یافت — مسیر GMI Cloud اکنون فقط بهصورت اعتباری و پرداخت بهمیزان مصرف ارائه میشود. | +| `glm` | `glm` | GLM Coding | کلید API | [پیوند](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (چین) | کلید API | [پیوند](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | کلید API | [پیوند](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | کلید API | [پیوند](https://greenpt.com) | ایجاد اشتراک API رایگان است؛ هزینهٔ استنتاج بهازای هر توکن محاسبه میشود. هیچ سهمیهٔ استنتاج رایگانی منتشر نشده است. | +| `groq` | `groq` | Groq | کلید API | [پیوند](https://groq.com) | طرح رایگان: سقفهای مختص هر مدل (200K توکن در روز برای هر مدل چت؛ برای RPM/RPD به console.groq.com/docs/rate-limits مراجعه کنید) — هیچ روش پرداختی ثبت نشده است. | +| `haiper` | `hp` | Haiper | کلید API، ویدئو | [پیوند](https://haiper.ai) | کلید API را از haiper.ai/haiper-api دریافت کنید | +| `hcnsec` | `hcnsec` | Huancheng Public API | کلید API | [پیوند](https://api.hcnsec.cn) | کلید API را از api.hcnsec.cn دریافت کنید | +| `helixmind` | `helixmind` | HelixMind | کلید API، تجمیعکننده | [پیوند](https://helixmind.online) | ادعاهای پیشین دربارهٔ 3 RPM/50 RPD و عدم نیاز به کارت طی ممیزی 2026-08-02 تأیید نشدند؛ سهمیه و صورتحساب فعلی نیازمند تأیید حساب هستند. | +| `helyxai` | `helyxai` | Helyx AI | کلید API، تجمیعکننده | [پیوند](https://helyxai.space) | مستندات طرح رایگان عملیاتی، 100,000 توکن در روز را ذکر میکنند؛ ادعای بازاریابی جداگانهٔ سایت مبنی بر 2M+ با آن در تضاد است و تضمین سهمیه تلقی نمیشود. | +| `heroku` | `heroku` | Heroku AI | کلید API، سازمانی | [پیوند](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | کلید API | [پیوند](https://huggingface.co) | API استنتاج رایگان برای هزاران مدل (Whisper، VITS، SDXL و غیره) | +| `hyperbolic` | `hyp` | Hyperbolic | کلید API | [پیوند](https://hyperbolic.xyz) | هنگام ثبتنام، $1-5 اعتبار آزمایشی برای استنتاج بدون سرور | +| `ideogram` | `ideo` | Ideogram | کلید API | [پیوند](https://ideogram.ai) | کلید API را از ideogram.ai/docs/api دریافت کنید | +| `iflytek` | `iflytek` | iFlytek Spark | کلید API | [پیوند](https://xinghuo.xfyun.cn) | کلید API را از console.xfyun.cn دریافت کنید | +| `inception` | `inception` | Inception | کلید API | [پیوند](https://docs.inceptionlabs.ai) | هنگام ثبتنام 10M توکن رایگان دریافت کنید؛ بدون نیاز به کارت اعتباری. | +| `inference-net` | `inet` | Inference.net | کلید API | [پیوند](https://inference.net) | هنگام ثبتنام $25 اعتبار رایگان دریافت کنید؛ کمکهزینههای پژوهشی نیز در دسترس هستند | +| `internlm` | `internlm` | InternLM (Intern-S1) | کلید API | [پیوند](https://internlm.intern-ai.org.cn/) | سهمیهٔ ماهانهٔ رایگان حدود 1M توکن ورودی / 3M توکن خروجی (حدود 10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | کلید API، تعبیهسازی/بازرتبهبندی | [پیوند](https://jina.ai) | کلید API از نوع Bearer برای api.jina.ai — تعبیهسازی، بازرتبهبندی، طبقهبندی، قطعهبندی و جستوجو. کلیدهای داشبورد بر JINA_AI_API_KEY اولویت دارند. این کارت مربوط به Reader / r.jina.ai نیست و URLها را واکشی نمیکند. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | کلید API | [پیوند](https://jina.ai/reader) | کلید API از نوع Bearer برای تبدیل URL به Markdown در r.jina.ai (فقط /v1/web/fetch). سرویسهای /v1/embeddings یا /v1/rerank را ارائه نمیدهد. همان توکن Jina مربوط به Foundation API کار میکند؛ وقتی این کارت خالی باشد، OmniRoute از کلید داشبورد jina-ai یا JINA_AI_API_KEY دوباره استفاده میکند. | +| `kenari` | `kenari` | Kenari | کلید API | [پیوند](https://kenari.id) | از کلید API مربوط به Kenari خود (kn-...) در Authorization: Bearer استفاده کنید. کاملاً سازگار با OpenAI. URL پایهٔ API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | کلید API | [پیوند](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | کلید API، تجمیعکننده | [پیوند](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | کلید API | [پیوند](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | کلید API | [پیوند](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | کلید API | [پیوند](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | کلید API، تجمیعکننده | [پیوند](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | کلید API، ویدئو | [پیوند](https://leonardo.ai) | کلید API را از leonardo.ai/developer دریافت کنید | +| `liquid` | `liquid` | Liquid AI | کلید API | [پیوند](https://liquid.ai) | کلید API را از liquid.ai دریافت کنید | +| `literouter` | `literouter` | LiteRouter | کلید API، تجمیعکننده | [پیوند](https://literouter.com) | گونههای رایگان مدل از پسوند :free استفاده میکنند؛ محدودیت اعتبار روزانه بسته به مدل متفاوت است و ورودی رایگان به ۵٬۰۰۰ توکن محدود میشود. | +| `llamagate` | `llamagate` | LlamaGate | کلید API | [پیوند](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | کلید API، تجمیعکننده | [پیوند](https://llm.kiwi) | طرح رایگان، auto و hrLLM را ارائه میدهد؛ محدودیت منتشرشدهٔ ۴۰ درخواست در ساعت برای hrLLM اعمال میشود. | +| `llm7` | `llm7` | LLM7.io | کلید API | [پیوند](https://llm7.io) | از هر کلید غیرخالی استفاده کنید (برای مثال 'unused'). اگر مدلهای داخلی قدیمی خطای model_unavailable برمیگردانند، از Available Models → Import from /models یا Auto-Sync استفاده کنید؛ مدل زندهٔ تأییدشده: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | کلید API، تجمیعکننده | [پیوند](https://llmgateway.io) | طرح رایگان میزبانیشده: هنگامی که حساب اعتباری ندارد، مدلهای رایگان به ۵ درخواست در هر ۱۰ دقیقه محدود میشوند. | +| `logfare` | `logfare` | Logfare | کلید API، تجمیعکننده | [پیوند](https://logfare.ai) | برای دریافت فوری کلید API، در https://logfare.ai/register یک حساب رایگان بسازید (نام کاربری/رمز عبور، بدون تأیید ایمیل)، سپس آن را بهعنوان توکن Bearer اینجا جایگذاری کنید. | +| `longcat` | `lc` | LongCat AI | کلید API | [پیوند](https://longcat.chat/platform/docs) | رایگان: پس از ثبتنام حساب و تأیید KYC، یک کمکهزینهٔ یکبارهٔ ۱۰ میلیون توکنی (LongCat-2.0). فقط یکبار — این سهمیه بهصورت روزانه/ماهانه تمدید نمیشود. | +| `magnific` | `freepik` | Magnific | کلید API، تصویر | [پیوند](https://www.magnific.com) | یک کلید API از magnific.com/user/api-keys دریافت کنید (هدر x-magnific-api-key). کلیدهای قدیمی توسعهدهندگان Freepik همچنان کار میکنند. | +| `maritalk` | `maritalk` | Maritalk | کلید API | [پیوند](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | کلید API، تجمیعکننده | [پیوند](https://meganova.ai) | ثبتنام رایگان بدون کارت. مجموع سهمیههای منتشرشدهٔ Tier 1 برای هر مدل، ۵۵۰ درخواست در روز است؛ این سهمیهها یک مخزن سراسری مشترک نیستند و در صورت فعال بودن، ممکن است هزینهٔ مصرف مازاد اعمال شود. | +| `meta-llama` | `meta` | Meta Llama API | کلید API | [پیوند](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | کلید API، ویدئو | [پیوند](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (China) | کلید API | [پیوند](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | کلید API | [پیوند](https://mistral.ai) | سطح رایگان Experiment: دسترسی با محدودیت نرخ به همهٔ مدلها، بدون نیاز به کارت اعتباری | +| `mixedbread` | `mxbai` | Mixedbread AI | کلید API | [پیوند](https://www.mixedbread.com) | کلید API از نوع Bearer برای API تعبیهسازی Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | کلید API، تجمیعکننده | [پیوند](https://www.mixlayer.com) | مدل qwen/qwen3.5-4b-free برای نمونهسازی رایگان و دارای محدودیت نرخ است؛ هیچ RPM عمومی ثابت یا سهمیهٔ روزانهای تأیید نشده است. | +| `mnn-ai` | `mnn-ai` | MNN AI | کلید API، تجمیعکننده | [پیوند](https://mnnai.ru) | طرح رایگان: ۱ دلار اعتبار ماهانه، ۱۰ RPM و دسترسی فقط به مدلهایی که با Free علامتگذاری شدهاند. | +| `modal` | `mdl` | Modal | کلید API، سازمانی | [پیوند](https://modal.com/docs) | در صورت فعال بودن، از توکن Bearer که از استقرار Modal شما محافظت میکند استفاده کنید. URL پایه باید به برنامهٔ Modal سازگار با OpenAI شما اشاره کند، برای مثال https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | کلید API | [پیوند](https://modelscope.cn) | سطح رایگان از طریق ModelScope API-Inference — نیازمند حساب Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | کلید API | [پیوند](https://monsterapi.ai) | ⚠️ **منسوخشده.** Monster API در 2026-06-30 فعالیت خود را متوقف کرد. از ارائهدهندگان جایگزین سازگار با OpenAI استفاده کنید. | +| `moonshot` | `moonshot` | Kimi | کلید API | [پیوند](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | کلید API | [پیوند](https://morphllm.com) | سطح رایگان: ۲۵۰ هزار اعتبار در ماه، ۰ دلار | +| `muse-code` | `mc` | Muse Code (Meta) | کلید API | [پیوند](https://github.com/meta-llama/llama-stack) | از متغیر محیطی META_API_KEY خود بهعنوان توکن Bearer استفاده کنید. Muse Code CLI از قالب انتقالی OpenAI Responses API استفاده میکند (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | کلید API، تجمیعکننده | [پیوند](https://naga.ac) | کلید API را از naga.ac دریافت کنید — ثبتنام با Google/GitHub/Discord در دسترس است. | +| `naga-ai` | `naga-ai` | Naga AI | کلید API، تجمیعکننده | [پیوند](https://naga.ac) | مدلهای علامتگذاریشده با :free بهصورت عمومی فهرست شدهاند، اما هیچ سهمیه عددی تأیید نشده است. خطمشی Naga هشدار میدهد که درخواستها و خروجیهای سطح رایگان ممکن است جمعآوری شوند یا برای آموزش استفاده شوند. | +| `nanogpt` | `nanogpt` | NanoGPT | کلید API | [پیوند](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | کلید API | [پیوند](https://bynara.id) | یک حساب رایگان NaraRouter ایجاد کنید، Telegram خود را پیوند دهید (پیش از پاسخهای /v1 الزامی است)، سپس کلید را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `navy` | `navy` | NavyAI | کلید API | [پیوند](https://api.navy) | یک کلید API رایگان از داشبورد NavyAI ایجاد کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `nebius` | `nebius` | Nebius AI | کلید API | [پیوند](https://nebius.com) | حدود $1 اعتبار آزمایشی هنگام ثبتنام برای آزمایش API | +| `nlpcloud` | `nlpc` | NLP Cloud | کلید API | [پیوند](https://docs.nlpcloud.com) | از کلید API مربوط به NLP Cloud خود در Authorization: Token استفاده کنید. OmniRoute بهطور پیشفرض نقطه پایانی چتبات در https://api.nlpcloud.io/v1/gpu//chatbot را هدف قرار میدهد. | +| `nomic` | `nomic` | Nomic | کلید API | [پیوند](https://nomic.ai) | کلید API را از atlas.nomic.ai دریافت کنید | +| `nous-research` | `nous` | Nous Research | کلید API | [پیوند](https://portal.nousresearch.com/help) | از کلید API مربوط به Nous Portal خود استفاده کنید. OmniRoute نقطه پایانی رسمی استنتاج سازگار با OpenAI در https://inference-api.nousresearch.com/v1 را هدف قرار میدهد. | +| `novita` | `novita` | Novita AI | کلید API، ویدئو، تجمیعکننده | [پیوند](https://novita.ai) | $0.50 اعتبار آزمایشی هنگام ثبتنام (با اعتبار حدود 1 سال) | +| `nscale` | `nscale` | nScale | کلید API | [پیوند](https://nscale.com) | $5 اعتبار رایگان هنگام ثبتنام برای آزمایش استنتاج | +| `nube` | `nube` | Nube.sh | کلید API | [پیوند](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | کلید API | [پیوند](https://build.nvidia.com) | دسترسی رایگان توسعهدهندگان: حدود 40 RPM، بیش از 70 مدل (Kimi K2.5، GLM 4.7، DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | کلید API، سازمانی | [پیوند](https://www.oracle.com/artificial-intelligence/generative-ai) | از کلید API مربوط به OCI Generative AI یا توکن bearer مربوط به IAM خود استفاده کنید. نشانی URL پایه میتواند https://inference.generativeai..oci.oraclecloud.com/openai/v1/ باشد. | +| `ofoxai` | `ofoxai` | OfoxAI | کلید API، تجمیعکننده | [پیوند](https://ofox.ai) | کاتالوگ فعلی بیش از 10 مدل رایگان را بدون سهمیه عددی عمومی تبلیغ میکند؛ پیش از استفاده در محیط عملیاتی، منشأ بالادستی و شرایط نگهداری داده و آموزش را بررسی کنید. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | کلید API | [پیوند](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | کلید API | [پیوند](https://1min.ai) | در https://docs.1min.ai/docs/api/create-api-key یک کلید API ایجاد کنید، سپس آن را در اینجا جایگذاری کنید. | +| `openadapter` | `oad` | OpenAdapter | کلید API | [پیوند](https://openadapter.dev) | از کلید API مربوط به OpenAdapter خود در Authorization: Bearer sk-cv- استفاده کنید. کاملاً با OpenAI سازگار است. نشانی URL پایه API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | کلید API | [پیوند](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | کلید API | [پیوند](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | کلید API | [پیوند](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | کلید API | [پیوند](https://openference.com) | سطح رایگان: شامل Qwen3.8 27b و Llama 3.2 3B است — برای مشاهده شرایط فعلی به openference.com/pricing مراجعه کنید | +| `openrouter` | `openrouter` | OpenRouter | کلید API، تجمیعکننده | [پیوند](https://openrouter.ai) | مدلهای رایگان با هزینه $0/token و پسوند :free - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | کلید API | [پیوند](https://openvecta.com) | اعتبار رایگان هنگام ثبتنام برای استنتاج سازگار با OpenAI در مدلهای LLM، تعبیهسازی و استدلال | +| `opper` | `opper` | Opper | کلید API، تجمیعکننده | [پیوند](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | کلید API | [پیوند](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | کلید API | [پیوند](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | کلید API | [پیوند](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | کلید API | [پیوند](https://www.perplexity.ai) | از کلید API مربوط به Perplexity خود استفاده کنید. OmniRoute شناسههای مدل Agent API را از طریق نقطه پایانی سازگار با Responses متعلق به Perplexity مسیریابی میکند. | +| `piapi` | `pi` | PiAPI | کلید API، تجمیعکننده | [پیوند](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | کلید API | [پیوند](https://pioneer.ai) | $75 اعتبار استفاده رایگان — بدون نیاز به کارت اعتباری | +| `plamo` | `plamo` | PLaMo | کلید API | [پیوند](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | کلید API، تجمیعکننده | [پیوند](https://creator.poe.com/api-reference) | کلید API از نوع Bearer برای API سازگار با OpenAI متعلق به Poe. | +| `poixe-ai` | `poixe-ai` | Poixe AI | کلید API، تجمیعکننده | [پیوند](https://poixe.com) | محدودیتهای رایگان عمومی فعلی اندک و مختص گروه مدل هستند: 2 RPM/5 RPD برای مدلهای large-cup و 20 RPM/50 RPD برای مدلهای small-cup. | +| `pollinations` | `pol` | Pollinations AI | کلید API، ویدئو | [پیوند](https://pollinations.ai) | دسترسی ناشناس/بدون کلید به مدلهای رایگان مستندشده بر مبنای بهترین تلاش ارائه میشود. راستیآزمایی محلی v3.8.50 ‏(2026-07-31) از طریق OmniRoute پاسخ 401 و در بررسیهای مستقیم بالادستی از همان شبکه، خطای Cloudflare 1010 را برگرداند. مدلهای Premium همچنان به کلید API مربوط به Pollinations از enter.pollinations.ai نیاز دارند. | +| `poolside` | `poolside` | Poolside | کلید API | [پیوند](https://poolside.ai) | Laguna S 2.1 و XS 2.1 در دوره Preview رایگان هستند؛ هیچ سهمیه عددی عمومی منتشر نشده است. | +| `predibase` | `predibase` | Predibase | کلید API | [پیوند](https://predibase.com) | ⚠️ **منسوخ شده است.** serving.app.predibase.com دیگر resolve نمیشود (بررسی 2026-06-19)؛ به نظر میرسد API سرویسدهی مدیریتشده متوقف شده است. | +| `publicai` | `publicai` | PublicAI | کلید API | [پیوند](https://publicai.co) | به کلید API نیاز دارد — اعتبار یکباره هنگام ثبتنام، سپس پولی | +| `qianfan` | `qianfan` | Baidu Qianfan | کلید API | [پیوند](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | کلید API | [پیوند](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | کلید API | [پیوند](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | کلید API | [پیوند](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | کلید API، تصویر | [پیوند](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | کلید API | [پیوند](https://regolo.ai) | کلید API مربوط به Regolo را از regolo.ai دریافت کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `reka` | `reka` | Reka | کلید API | [پیوند](https://docs.reka.ai/chat/overview) | از کلید API مربوط به Reka استفاده کنید. OmniRoute از URL پایه سازگار با OpenAI به نشانی https://api.reka.ai/v1 پشتیبانی میکند و برای سازگاری، هر دو هدر Authorization و X-Api-Key را ارسال میکند. | +| `requesty` | `requesty` | Requesty | کلید API | [پیوند](https://requesty.ai) | سطح رایگان با حدود ۲۰۰ درخواست در روز — درگاه مسیریابی چندمدلی (بیش از ۳۰۰ مدل) | +| `routeway` | `routeway` | Routeway | کلید API | [پیوند](https://routeway.ai) | یک کلید API رایگان در routeway.ai ایجاد کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `runwayml` | `runway` | Runway | کلید API، ویدئو | [پیوند](https://docs.dev.runwayml.com) | از کلید API مربوط به Runway در Authorization: Bearer استفاده کنید. OmniRoute از API فعلی Runway در https://api.dev.runwayml.com/v1 استفاده میکند و هدر الزامی X-Runway-Version را بهطور خودکار ارسال میکند. | +| `sambanova` | `samba` | SambaNova | کلید API | [پیوند](https://sambanova.ai) | ۵ دلار اعتبار رایگان هنگام ثبتنام (با اعتبار ۳۰روزه)، بدون نیاز به کارت اعتباری | +| `sap` | `sap` | SAP Generative AI Hub | کلید API، سازمانی | [پیوند](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | از توکن Bearer مربوط به SAP AI Core استفاده کنید. URL پایه میتواند ریشه AI_API_URL شما یا یک deploymentUrl از Generative AI Hub باشد. | +| `sarvam` | `sarvam` | Sarvam AI | کلید API | [پیوند](https://docs.sarvam.ai) | ۱٬۰۰۰ روپیه اعتبار رایگان ثبتنام — بدون تاریخ انقضا | +| `scaleway` | `scw` | Scaleway AI | کلید API | [پیوند](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | ۱ میلیون توکن رایگان برای حسابهای جدید — سازگار با EU/GDPR (پاریس)، Qwen3 235B و Llama 70B | +| `sealion` | `sealion` | SEA-LION | کلید API | [پیوند](https://sea-lion.ai) | با Google در sea-lion.ai وارد شوید (بدون نیاز به کارت و بدون محدودیت منطقهای)، یک کلید API ایجاد کنید و سپس آن را در اینجا جایگذاری کنید. | +| `seekai` | `ska` | SeekAi | کلید API، تجمیعکننده | [پیوند](https://seekai.cc) | یک کلید API در https://seekai.cc ایجاد کنید، سپس آن را بهعنوان توکن Bearer در اینجا جایگذاری کنید. | +| `segmind` | `segmind` | Segmind | کلید API، تصویر، ویدئو | [پیوند](https://segmind.com) | از کلید API مربوط به Segmind در هدر x-api-key استفاده کنید. OmniRoute از https://api.segmind.com/v1/ استفاده میکند و بایتهای تصویر/ویدئوی تولیدشده را مستقیماً برمیگرداند. | +| `sensenova` | `sensenova` | SenseNova | کلید API | [پیوند](https://platform.sensenova.cn) | کلید API را از platform.sensenova.cn دریافت کنید | +| `siliconflow` | `siliconflow` | SiliconFlow | کلید API | [پیوند](https://cloud.siliconflow.com) | ۱ دلار اعتبار رایگان، بهعلاوه مدلهایی که در حال حاضر با قیمت ۰ دلار فهرست شدهاند، پس از تأیید هویت؛ دسترسپذیری و محدودیتها ممکن است تغییر کنند | +| `snowflake` | `snowflake` | Snowflake Cortex | کلید API، سازمانی | [پیوند](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | کلید API | [پیوند](https://xinghuo.xfyun.cn) | کلید API را از console.xfyun.cn دریافت کنید | +| `speka` | `speka` | Speka AI | کلید API، تجمیعکننده | [پیوند](https://speka.me) | طرح رایگان: ۱ دلار استفاده ماهانه، ۱۰ RPM، یک کلید API و دسترسی به مدلهای باز و محیط آزمایشی؛ بدون نیاز به کارت. | +| `stability-ai` | `stability` | Stability AI | کلید API، تصویر | [پیوند](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | کلید API | [پیوند](https://stepfun.com) | کلید API را از platform.stepfun.com دریافت کنید | +| `sumopod` | `sumopod` | SumoPod | کلید API | [پیوند](https://ai.sumopod.com) | از کلید API مربوط به SumoPod ‏(sk-...) در Authorization: Bearer استفاده کنید. کاملاً با OpenAI سازگار است. URL پایه API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | کلید API | [پیوند](https://suno.ai) | کوکی نشست را از suno.ai ‏(احراز هویت Clerk) جایگذاری کنید | +| `synthetic` | `synthetic` | Synthetic | کلید API، تجمیعکننده | [پیوند](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | کلید API، تجمیعکننده | [پیوند](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | کلید API | [پیوند](https://hunyuan.tencent.com) | کلید API را از console.cloud.tencent.com دریافت کنید | +| `thebai` | `thebai` | TheB.AI | کلید API، تجمیعکننده | [پیوند](https://theb.ai) | کلید API از نوع Bearer برای درگاه سازگار با OpenAI متعلق به TheB.AI. | +| `tinyfish` | `tf` | TinyFish Fetch | کلید API | [پیوند](https://docs.tinyfish.ai/fetch-api) | X-API-Key را از agent.tinyfish.ai/api-keys دریافت کنید | +| `together` | `together` | Together AI | کلید API، ویدئو | [پیوند](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | کلید API | [پیوند](https://agent-router.gaib.ai) | از کلید API مربوط به Token Kiosk در Authorization: Bearer استفاده کنید. درگاهی کاملاً سازگار با OpenAI. URL پایه API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | کلید API، تجمیعکننده | [پیوند](https://www.tokenreply.com) | مدلهای دارای برچسب رایگان، محدودیتهای روزانه مختص مدل و کمپین دارند؛ هیچ سهمیه رایگان سراسری و ثابتی منتشر نشده است. | +| `tokenrouter` | `trk` | TokenRouter | کلید API | [پیوند](https://tokenrouter.com) | از کلید API مربوط به TokenRouter در Authorization: Bearer استفاده کنید. کاملاً با OpenAI سازگار است. URL پایه API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | کلید API، تصویر | [پیوند](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | کلید API | [پیوند](https://docs.opentyphoon.ai) | کلید API رایگان با محدودیت نرخ ۵ درخواست در ثانیه و ۲۰۰ درخواست در دقیقه. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | کلید API | [پیوند](https://uncensored.com) | از کلید Developer API خود در uncensored.com‏ (uai_sk_live_...) استفاده کنید. OmniRoute آن را بهصورت هدر X-api-key به نقطه پایانی سازگار با OpenAI در https://api.uncensored.com/api/v1 ارسال میکند. این کلید هرگز منقضی نمیشود. این رابط دارای محاسبه مصرف/اعتبار است؛ چت اشتراکی بدون محاسبه مصرف، ارائهدهنده جداگانه `uc` است. | +| `udio` | `udio` | Udio | کلید API | [پیوند](https://udio.com) | کوکی نشست را از udio.com‏ (احراز هویت Supabase) جایگذاری کنید | +| `unorouter` | `unorouter` | UnoRouter | کلید API، تجمیعکننده | [پیوند](https://unorouter.ai) | مدلهایی با پسوند :free از موجودی کسر نمیکنند؛ محدودیت برای هر مدل رایگان بهازای هر کاربر، ۱ درخواست در دقیقه است. | +| `upstage` | `upstage` | Upstage | کلید API | [پیوند](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | کلید API | [پیوند](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | کلید API | [پیوند](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | کلید API، تجمیعکننده | [پیوند](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | کلید API، سازمانی | [پیوند](https://cloud.google.com/vertex-ai) | فایل JSON حساب سرویس، توکن دسترسی OAuth، کلید API مربوط به Vertex Express یا کلید مجوز متصل به حساب سرویس را ارائه دهید. حالت Express فقط از Gemini پشتیبانی میکند؛ مدلهای شریک به اعتبارنامههای محدود به پروژه نیاز دارند. | +| `vertex-partner` | `vp` | شرکای Vertex AI | کلید API، سازمانی | [پیوند](https://cloud.google.com/vertex-ai) | فایل JSON حساب سرویس یا اعتبارنامههای OAuth را ارائه دهید. کلید مجوز متصل به حساب سرویس نیز از کشف پشتیبانی میکند، اما استنتاج مدلهای شریک علاوه بر آن به شناسه پروژه Google Cloud مربوطه نیاز دارد. کلیدهای استاندارد Express فقط از Gemini پشتیبانی میکنند. | +| `void-ai` | `void-ai` | Void AI | کلید API، تجمیعکننده | [پیوند](https://voidai.app) | کاتالوگ عمومی مدلها برخی مدلها را نیازمند طرح رایگان نشان میدهد، اما دسترسی مشروط است و هیچ سهمیه عددیای تأیید نشده است. | +| `volcengine` | `volcengine` | Volcengine | کلید API | [پیوند](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | طرح عامل Volcengine Ark | کلید API | [پیوند](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | حساب Volcano Engine خود را متصل کنید یا از کلید API اشتراک Ark Agent Plan استفاده کنید. | +| `volcengine-coding-plan` | `vecp` | طرح کدنویسی Volcengine Ark | کلید API | [پیوند](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | حساب Volcano Engine خود را متصل کنید یا از کلید API اشتراک Ark Coding Plan استفاده کنید. | +| `voyage-ai` | `voyage` | Voyage AI | کلید API، تعبیه/رتبهبندی مجدد | [پیوند](https://www.voyageai.com) | کلید API از نوع Bearer برای APIهای تعبیه و رتبهبندی مجدد Voyage AI. | +| `wafer` | `wafer` | Wafer AI | کلید API | [پیوند](https://wafer.ai) | — | +| `wandb` | `wandb` | استنتاج Weights & Biases | کلید API | [پیوند](https://wandb.ai) | — | +| `watsonx` | `watsonx` | درگاه IBM watsonx.ai | کلید API، سازمانی | [پیوند](https://www.ibm.com/products/watsonx-ai) | از توکن Bearer مربوط به watsonx استفاده کنید. نشانی پایه میتواند https://.ml.cloud.ibm.com/ml/gateway/v1/ یا یک نقطه پایانی خودمدیریتشده /ml/gateway/v1 باشد. | +| `writer` | `writer` | Writer | کلید API | [پیوند](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | کلید API | [پیوند](https://x5lab.dev) | از کلید API مربوط به X5Lab‏ (x5-...) در Authorization: Bearer استفاده کنید. کاملاً با OpenAI سازگار است. نشانی پایه API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | کلید API | [پیوند](https://x.ai) | از یک کلید رسمی xAI API استفاده کنید یا با xAI OAuth وارد شوید. نشستهای JWT مربوط به Grok Build همچنان ارائهدهندهای جداگانه هستند. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | کلید API | [پیوند](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | طرح توکن Xiaomi MiMo | کلید API | [پیوند](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | کلید API، تجمیعکننده | [پیوند](https://xkiro.com) | یک حساب رایگان در xkiro.com ایجاد کنید و کلید را اینجا جایگذاری کنید (Bearer؛ x-api-key نیز پذیرفته میشود). | +| `yi` | `yi` | Yi (01.AI) | کلید API | [پیوند](https://01.ai) | کلید API را از platform.lingyiwanwu.com دریافت کنید | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | کلید API، تجمیعکننده | [پیوند](https://yolo-auto.com) | دسترسی رایگان به API از نظر تعداد درخواست محدود و برای آزمایش در نظر گرفته شده است؛ هیچ سهمیه عددی روزانهای منتشر نشده و تداوم همیشگی دسترسی رایگان تضمین نشده است. | +| `zai` | `zai` | Z.AI | کلید API | [پیوند](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | کلید API | [پیوند](https://zenmux.ai) | از کلید API مربوط به ZenMux در Authorization: Bearer استفاده کنید. ZenMux کاملاً با OpenAI سازگار است. نشانی پایه: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | کلید API، تجمیعکننده | [پیوند](https://www.zerolimitai.com) | دوره آزمایشی رایگان موقت تبلیغ میشود، اما صفحات رسمی درباره مدت ۳ یا ۷ روز با یکدیگر تناقض دارند؛ ادعای ۱۰۰ فراخوانی در روز، دائمی تلقی نمیشود. | +| `zylo-api` | `zylo` | Zylo API | کلید API، تجمیعکننده | [پیوند](https://zyloai.net) | طرح پایه: ۱۰ RPM،‏ ۷٬۲۰۰ درخواست در روز و ۲۰۰٬۰۰۰ توکن در روز؛ محدود به مدلهای متنی Basic. | ## ارائهدهندگان محلی (14) diff --git a/docs/i18n/fa/docs/routing/REASONING_REPLAY.md b/docs/i18n/fa/docs/routing/REASONING_REPLAY.md index bad3dea8f6ef..81cc316c7b89 100644 --- a/docs/i18n/fa/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/fa/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ OmniRoute مقدار `reasoning_content` تولیدشده توسط مدلهای ## معماری ``` -مرحله N (دستیار تولید میکند): - → پاسخ شامل reasoning_content و tool_calls است +نوبت N (دستیار تولید میکند): + → پاسخ شامل reasoning_content + tool_calls است → اگر requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - در حافظه و DB مینویسد و از هر tool_call.id بهعنوان کلید استفاده میکند - → پاسخ را به کلاینت ارسال میکند (که ممکن است استدلال را حفظ کند یا نکند) + مینویسد (حافظه + پایگاه داده)، با کلیدی مبتنی بر هر tool_call.id + → پاسخ را به کلاینت ارسال میکند (که ممکن است reasoning را نگه دارد یا ندارد) -مرحله N+1 (کلاینت درخواست بعدی را ارسال میکند): +نوبت N+1 (کلاینت پیام پیگیری را ارسال میکند): → مترجم تشخیص میدهد: requiresReasoningReplay(provider, model) === true → برای هر پیام دستیار که دارای tool_calls و فاقد reasoning_content است: - lookupReasoning(toolCalls[0].id) → حافظه → DB + lookupReasoning(toolCalls[0].id) → حافظه → پایگاه داده یافت شد → msg.reasoning_content = cached; recordReplay() - یافت نشد → msg.reasoning_content = "" (راهکار جایگزین قدیمی برای نسخههای قدیمیتر DeepSeek) + یافت نشد → msg.reasoning_content = "" (راهکار بازگشت قدیمی برای نسخههای قدیمیتر DeepSeek) → سرویس بالادستی تاریخچهای سازگار میبیند → بدون خطای 400 ``` -ثبت در `open-sse/handlers/chatCore.ts` انجام میشود (در دو محل، یعنی دو محل فراخوانی `cacheReasoningFromAssistantMessage`). بازپخش در `open-sse/translator/index.ts`، پس از تبدیل اجباری طرحواره اما پیش از ارسال، انجام میشود. +ثبت در `open-sse/handlers/chatCore.ts` انجام میشود (در دو محل، یعنی دو محل فراخوانی `cacheReasoningFromAssistantMessage`). بازپخش در `open-sse/translator/index.ts`، پس از اجبار به انطباق با طرحواره اما پیش از ارسال، انجام میشود. + +نوبتهای معمولی دستیار (بدون فراخوانی ابزار) بهشکل متفاوتی کلیدگذاری میشوند: `buildAssistantMessageCacheKey()` از محدودهٔ نشست بههمراه رونوشت نرمالشده با قالب OpenAI تا آن نوبت، چکیدهای تولید میکند، زیرا DeepSeek پس از وجود `tools` به reasoning مربوط به _تمام_ نوبتهای قبلی نیاز دارد. برای مقصدهای Responses-API (برای مثال `opencode-go/deepseek-v4-flash` که به `/responses` هدایت میشود)، بدنهٔ ارسالی به سرویس بالادستی بهجای `messages` دارای `input` است؛ بنابراین `translateRequest()` (`open-sse/translator/index.ts`) رونوشت محوریای را که چکیده کرده است از طریق یک گزینهٔ callback گزارش میدهد و محلهای ثبت نیز از همان رونوشت چکیده تولید میکنند. مرحلهٔ بازپخش Responses برای تمام قالبهای مبدأ روی محور OpenAI اجرا میشود؛ بنابراین بازپخش برای کلاینتهای Anthropic Messages (Claude → OpenAI → Responses) نیز انجام میشود. ## ذخیرهسازی — ترکیب حافظه + SQLite diff --git a/docs/i18n/fa/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/fa/docs/security/SOCKET_DEV_FINDINGS.md index 381bc758028b..9a7093c0a36e 100644 --- a/docs/i18n/fa/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/fa/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- -این سند، گواهی تدوینشده توسط نگهدارنده برای شش یافتهٔ -`AI-detected potential malware` مطرحشده علیه `omniroute@3.8.5` و -راهکارهای کاهشی اعمالشده در `omniroute@3.8.6` است. این سند وجود دارد تا: +> **یادداشت دامنه:** `socket.yml` اسکن پس از انتشارِ سمت رجیستری Socket.dev را برای آرتیفکت npm پیکربندی میکند (مسیرهای نادیدهگرفتهشده برای محتوایی که منتشر نمیشود، مانند `tests/`، `docs/` و گزارشهای ساخت). این فایل یک دروازه ادغام CI/PR ایجاد نمیکند — هیچ گردش کاری در `.github/workflows`، هیچ اسکریپتی در `package.json` و هیچ هدفی در `Makefile`، Socket.dev را فراخوانی نمیکند. -1. اپراتورهای خط لولهٔ امنیتی یک مرجع واحد برای استناد در زمان ارزیابی - یافتهها بر اساس کد منبع واقعی داشته باشند. +این سند، گواهی تدوینشده توسط نگهدارنده برای شش یافته +`AI-detected potential malware` مطرحشده درباره `omniroute@3.8.5` و +اقدامات کاهشی اعمالشده در `omniroute@3.8.6` است. این سند وجود دارد تا: + +1. گردانندگان خط لوله امنیتی، هنگامی که نیاز دارند یافتهها را در برابر + کد منبع واقعی ارزیابی کنند، مرجعی واحد برای استناد داشته باشند. 2. اسکنرهای هوش مصنوعی آینده بتوانند ادعای امضاشده توسط نگهدارنده را تشخیص دهند که هر - مسیر علامتگذاریشده عمدی، اختیاری و مستندسازیشده است. + مسیر علامتگذاریشده، عمدی، اختیاری و مستندسازیشده است. 3. سابقهای مکتوب از _چرایی_ شکل فعلی هر محل فراخوانی داشته باشیم — - تا بازسازی کد در آینده بهطور تصادفی اثرانگشتی را که عمداً - حذف شده است، دوباره ایجاد نکند. + تا بازآرایی کد در آینده بهطور تصادفی اثری را که عمداً + حذف شده بود، دوباره ایجاد نکند. -اگر اسکنری را مدیریت میکنید که پس از انتشار راهکارهای کاهشی -v3.8.6 هر یک از محلهای فراخوانی زیر را دوباره علامتگذاری میکند، لطفاً یک issue همراه با ردپای اسکن باز کنید تا -این گواهی را در اینجا گسترش دهیم. +اگر اسکنری را اجرا میکنید که پس از انتشار اقدامات کاهشی +v3.8.6 هر یک از محلهای فراخوانی زیر را دوباره علامتگذاری میکند، لطفاً یک issue بههمراه ردّ اسکن باز کنید تا +گواهی اینجا را گسترش دهیم. --- diff --git a/docs/i18n/fi/README.md b/docs/i18n/fi/README.md index c8396a810bf0..d72af4dd3d2a 100644 --- a/docs/i18n/fi/README.md +++ b/docs/i18n/fi/README.md @@ -19,17 +19,17 @@
-## 💰 ~1.62B ilmaista tokenia / kuukausi +## 💰 ~1,62 mrd. ilmaista tokenia / kuukausi
-> Ilmaistasojen pinoaminen käsin on työlästä — kymmeniä SDK:ita, kymmeniä nopeusrajoituksia eikä mitään käsitystä siitä, kuinka paljon kapasiteettia sinulla oikeasti on. OmniRoute luetteloi **491 ilmaistason kohdetta 35 toistuvan pool-avaimen alla** ja laskee tokenien pääluvun niiden **17 poolin perusteella, joille on julkaistu positiivinen kuukausibudjetti, sekä viiden mallikohtaisen Groq-rajan perusteella**, poistaen jaettujen poolien kaksoislaskennan. Kiintiöt, jotka avautuvat vasta alueellisen henkilöllisyyden tarkistuksen jälkeen (tällä hetkellä: ModelScope), näytetään erikseen: +~6M alueellisen henkilöllisyyden vahvistamisen takana, eikä niitä koskaan lasketa mukaan päälukuun. Tulos pysyy näkyvissä hallintapaneelissa (`/dashboard/free-tiers`). +> Ilmaistasojen pinoaminen käsin on työlästä — kymmeniä SDK:ita, kymmeniä nopeusrajoituksia eikä mitään käsitystä siitä, kuinka paljon kapasiteettia sinulla todellisuudessa on. OmniRoute luetteloi **489 ilmaistason merkintää 35 toistuvan pooliavaimen alla** ja laskee tokenien kokonaismäärän **17 poolista, joille on julkaistu positiivinen kuukausibudjetti, sekä viidestä mallikohtaisesta Groq-rajasta**, ja poistaa jaettujen poolien päällekkäisyydet. Kiintiöt, jotka avautuvat vasta alueellisen henkilöllisyyden tarkistuksen jälkeen (tällä hetkellä ModelScope), näytetään erikseen: +~6M alueellisen henkilöllisyyden vahvistamisen takana, eikä niitä koskaan lasketa mukaan kokonaismäärään. Tulos pysyy näkyvissä hallintapaneelissa (`/dashboard/free-tiers`). -OmniRouten ilmaistason budjettikortti: vakaasti ~1.62B ilmaista tokenia kuukaudessa ja rekisteröitymiskrediittien ansiosta jopa ~2.22B ensimmäisen kuukauden aikana, yhdestä rajapinnasta saatavilla olevien 35 dokumentoidun toistuvan pool-avaimen kautta, jotka kattavat 491 luetteloitua ilmaistason kohdetta. Rehellinen, poolien kaksoislaskennan poistava laskenta — jokainen jaettu pooli lasketaan vain kerran, mukaan lukien 17 toistuvaa poolia, joille on julkaistu positiivinen kuukausittainen tokenbudjetti, sekä viisi mallikohtaista Groq-rajaa; 13 palveluntarjoajaa on merkitty ehtoriskiluettelossa vältettäviksi, joten päätös on sinun. Budjettipalkki sisältää Mistral 1B:n, Nara 210M:n, LLM7 150M:n, xKiro 150M:n, Groq 30M:n (viisi mallikohtaista rajaa) ja pienempiä pooleja. Lisäksi ensimmäisen kuukauden rekisteröitymiskrediitit ja pysyvästi ilmaiset palveluntarjoajat, joilla ei ole tokenrajaa, tuodaan esiin erikseen, jotta ne eivät koskaan kasvata päälukua keinotekoisesti. Reaaliaikaiset käytetyt ja jäljellä olevat määrät osoitteessa /dashboard/free-tiers. +OmniRouten ilmaistasobudjettikortti: jatkuvasti ~1,62 mrd. ilmaista tokenia kuukaudessa ja rekisteröitymiskrediittien ansiosta jopa ~2,22 mrd. ensimmäisen kuukauden aikana, 35 dokumentoidusta toistuvasta pooliavaimesta, jotka kattavat 489 luetteloitua ilmaistason merkintää yhden päätepisteen takana. Rehellinen, poolien päällekkäisyydet poistava laskenta — jokainen jaettu pooli lasketaan vain kerran, mukaan lukien 17 toistuvaa poolia, joille on julkaistu positiivinen kuukausittainen tokenbudjetti, sekä viisi mallikohtaista Groq-rajaa; 13 palveluntarjoajaa on merkitty avoid-merkinnällä käyttöehtoriskien luettelossa, jotta voit päättää itse. Budjettipalkki sisältää Mistral 1B:n, Nara 210M:n, LLM7 150M:n, xKiro 150M:n, Groq 30M:n (viisi mallikohtaista rajaa) ja pienemmät poolit. Lisäksi ensimmäisen kuukauden rekisteröitymiskrediitit ja pysyvästi ilmaiset palveluntarjoajat, joilla ei ole tokenrajaa, esitetään erikseen, jotta ne eivät koskaan kasvata kokonaismäärää keinotekoisesti. Reaaliaikainen käytetty/jäljellä oleva määrä sivulla /dashboard/free-tiers. -> Animoitu yhteenveto reaaliaikaisesta `/dashboard/free-tiers`-sivusta. Täydellinen menetelmäkuvaus (poolien kaksoislaskennan poisto, krediittitasot, palveluntarjoajien ehdot): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Animoitu yhteenveto reaaliaikaisesta `/dashboard/free-tiers`-sivusta. Täydellinen menetelmäkuvaus (poolien päällekkäisyyksien poisto, krediittitasot, palveluntarjoajien ehdot): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Nämä luvut tarkastetaan uudelleen kahden viikon välein ajantasaista luetteloa vasten, ja ne **voivat muuttua kumpaankin suuntaan** — jos palveluntarjoaja lopettaa ilmaistason, luku laskee; kun uusi lisätään, luku nousee. Julkaisemme sen, mitä luettelo todellisuudessa laskee, emme koskaan ylöspäin pyöristettyä parasta mahdollista tapausta. +> Nämä luvut tarkastetaan uudelleen kahden viikon välein reaaliaikaista luetteloa vasten, ja ne **muuttuvat molempiin suuntiin** — kun palveluntarjoaja lopettaa ilmaistason, luku pienenee; kun uusi tulee saataville, luku kasvaa. Julkaisemme sen, mitä luettelo todella laskee, emmekä koskaan ylöspäin pyöristettyä parasta mahdollista arviota.
@@ -48,7 +48,7 @@ ### 💬 Liity yhteisöön -**👋 Seuraa ylläpitäjää — saat tiedon uusista palveluntarjoajista, julkaisuista ja vinkeistä ensimmäisenä:** +**👋 Seuraa ylläpitäjää — saat ensimmäisenä tiedon uusista palveluntarjoajista, julkaisuista ja vinkeistä:** [![Seuraa Diegoa LinkedInissä](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Seuraa käyttäjää @diegosouzapw GitHubissa](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -59,7 +59,7 @@ [![WhatsApp Brasilia](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Verkkosivusto](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Kysymykset, palveluntarjoajavinkit, kehityssuunnitelma ja tuki → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Maailmanlaajuinen](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasilia](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portaali](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Kysymykset, palveluntarjoajavinkit, etenemissuunnitelma ja tuki → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Maailmanlaajuinen](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasilia](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portaali](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -601,7 +601,7 @@ nykyisestä luettelosta on osoitteessa **[radar.omniroute.online/planos](https:/ ## 🤖 Yhteensopivat CLI-työkalut ja koodausagentit -> Yksi määritys — `http://localhost:20128/v1` — ja **jokainen** AI-IDE tai CLI toimii ilmaisilla ja edullisilla malleilla. +> Yksi määritys — `http://localhost:20128/v1` — ja **jokainen** tekoälyä hyödyntävä IDE tai CLI toimii ilmaisilla ja edullisilla malleilla.
@@ -635,22 +635,23 @@ nykyisestä luettelosta on osoitteessa **[radar.omniroute.online/planos](https:/ - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ toimii myös seuraavien kanssa · Kiro · Command Code · Antigravity · Windsurf · AMP · mikä tahansa OpenAI-yhteensopiva työkalu ++ toimii myös näiden kanssa · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · mikä tahansa OpenAI-yhteensopiva työkalu
-📖 Työkalukohtaiset määritykset kaikille 36 työkalulle (26 CLI Code -työkalua + 10 CLI Agent -työkalua) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode-lisäosa → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Työkalukohtaiset määritykset kaikille 36 työkalulle (26 CLI-koodityökalua + 10 CLI-agenttia) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode-laajennus → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)
-**Käynnistä mikä tahansa tuettu CLI OmniRouten kautta yhdellä komennolla** — määritystiedostoja ei kirjoiteta, tunnistetiedot syötetään prosessikohtaisesti ja Qwen/Gemini saavat tilapäisen eristetyn kotihakemiston: +**Käynnistä mikä tahansa tuettu CLI OmniRouten kautta yhdellä komennolla** — määritystiedostoja ei kirjoiteta, +tunnistetiedot syötetään prosessikohtaisesti ja Qwen/Gemini saavat väliaikaisen eristetyn kotihakemiston: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -677,7 +678,7 @@ komentotulkkisi historiasta. → [CLI-integraatiot](docs/guides/CLI-INTEGRATIONS -> **357 rekisteröityä palveluntarjoajaa** kanonisissa keskustelu-, media-, haku-, paikallis-, pilviagentti- ja järjestelmäkokoelmissa, joista **152 sisältää `hasFree: true` -löytämismetatiedon**. Keskustelumallirekisteri kattaa **229 palveluntarjoajaa / 2 554 erillistä palveluntarjoaja–malli-paria / 1 283 käsittelemätöntä mallitunnusta**; erillisessä ilmaisen käyttöbudjetin luettelossa on **491 mallikohtaista riviä**, **35 uusiutuvaa resurssipoolia** ja **54 uusiutuvaa tai ilman avainta käytettävää pysyvästi ilmaista palveluntarjoajaa**. Nimittäjät ovat tarkoituksellisesti erilaisia; määritelmät ja resurssipoolien päällekkäisyydet poistavat laskelmat ovat [palveluntarjoajaviitteessä](docs/reference/PROVIDER_REFERENCE.md) ja [ilmaiskäyttötasoissa](docs/reference/FREE_TIERS.md). +> **357 rekisteröityä palveluntarjoajaa** kanonisissa keskustelu-, media-, haku-, paikallis-, pilviagentti- ja järjestelmäkokoelmissa, joista **152 sisältää `hasFree: true` -hakumetatiedon**. Keskustelumallirekisteri kattaa **229 palveluntarjoajaa / 2 554 erillistä palveluntarjoaja–malli-paria / 1 283 käsittelemätöntä mallitunnusta**; erillisessä ilmaisen käyttöbudjetin luettelossa on **491 mallikohtaista riviä**, **35 uusiutuvaa kiintiötä** ja **54 uusiutuvan tai avaimettoman, pysyvästi ilmaisen käytön tarjoavaa palveluntarjoajaa**. Nimittäjät ovat tarkoituksella erilaisia; määritelmät ja kiintiöiden päällekkäisyydet poistavat laskelmat löytyvät sivuilta [Palveluntarjoajien viiteopas](docs/reference/PROVIDER_REFERENCE.md) ja [Ilmaiskäyttötasot](docs/reference/FREE_TIERS.md).
@@ -710,32 +711,32 @@ komentotulkkisi historiasta. → [CLI-integraatiot](docs/guides/CLI-INTEGRATIONS -…ja yli 330 muuta — jokainen kuvake haetaan reaaliaikaisesti koontinäytön palveluntarjoajaluettelosta. 📖 [Palveluntarjoajaviite](docs/reference/PROVIDER_REFERENCE.md) +…ja yli 330 muuta — jokainen kuvake noudetaan reaaliaikaisesti hallintapaneelin palveluntarjoajaluettelosta. 📖 [Palveluntarjoajien viiteopas](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Ilmainen ikuisesti — $0, ei maksukorttia +### 🆓 Ilmainen pysyvästi — $0, ei korttia - - + + - - + + - - - + + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Ei tokenirajaa
Kilo Code
Kilo Code
Automaattinen reititys, Tencent Hy3
Ilmainen ikuisesti
Requesty
Requesty
GPT-OSS 120B, Nemotron
Ilmainen ikuisesti
Kilo Code
Kilo Code
Automaattinen reititys, Tencent Hy3
Ikuisesti ilmainen
Requesty
Requesty
GPT-OSS 120B, Nemotron
Ikuisesti ilmainen
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Ilmaistaso
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Ilmainen ikuisesti
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Ilmainen ikuisesti
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Ikuisesti ilmainen
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Ikuisesti ilmainen
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Rajattomasti ILMAISEKSI
Pollinations
Pollinations
GPT, Llama, Claude
Avainta ei tarvita
Cloudflare AI
Cloudflare AI
Yli 50 mallia
10 000 neuronia/päivä
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM ilmaiseksi
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1 milj. tokenia/päivä
OpenRouter
OpenRouter
:free-mallit
+$10 → suurempi RPM
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 pyyntöä/min ilmaiseksi
Openference
Openference
Qwen3.8 27B, Llama 3.2
Ilmaistaso
OpenRouter
OpenRouter
:free-mallit
+$10 → enemmän pyyntöjä/min
-📖 Täydellinen koneellisesti luettava luettelo → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 Kattava koneluettava luettelo → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1271,21 +1272,21 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 - + - - - + + + - - - - - + + + + + - +
KerrosTeknologia
SuoritusympäristöNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
KieliTypeScript 6.0 — 100 % TypeScriptiä hakemistoissa src/ ja open-sse/ (ei yhtään any-tyyppiä ytimessä versiosta v2.0 lähtien)
KieliTypeScript 6.0 — 100 % TypeScriptiä hakemistoissa src/ ja open-sse/ (ytimessä ei yhtään any-tyyppiä versiosta v2.0 lähtien)
SovelluskehysNext.js 16 + React 19 + Tailwind CSS 4
Tietokantabetter-sqlite3 (SQLite, WAL-kirjaus) + LowDB (vanha JSON-toteutus) — 122 toimialamoduulia, 176 migraatiota
MuistiSQLite FTS5 -kokotekstihaku + int8-kvantisoidut vektoriupotukset, tyypitetty vaimeneminen
SkeematZod 4 — MCP-työkalujen syötteiden ja tulosteiden validointi + API-sopimukset
Tietokantabetter-sqlite3 (SQLite, WAL-lokikirjaus) + LowDB (vanha JSON-ratkaisu) — 122 toimialamoduulia, 178 migraatiota
MuistiSQLite FTS5 -kokotekstihaku + int8-kvantisoidut vektoriupotukset, tyypitetty vaimennus
SkeematZod 4 — MCP-työkalujen I/O-validointi + API-sopimukset
ProtokollatMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
SuoratoistoServer-Sent Events (SSE) + WebSocket-silta (/v1/ws)
Pakkaus12 moottorin käsittelyputki — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Todennus ja tietoturvaOAuth 2.0 (PKCE) + JWT + API-avaimet + käyttöalueisiin rajattu MCP-todennus · AES-256-GCM levossa oleville tiedoille · DOMPurify
Häivetilawreq-js — JA3-/JA4-TLS-sormenjälkien jäljittely, 3-tasoinen välityspalvelin
VikasietoisuusKatkaisija, eksponentiaalinen viive, kuormituspiikkien esto, automaattisesti itsekorjautuvat yhdistelmät
Lokituspino — jäsennellyt JSON-lokit pyyntökontekstilla
TestausNode.js-testiajoympäristö + Vitest — yli 39 000 staattista testimääritystä yli 5 100 seuratussa testitiedostossa (yksikkö-, integraatio-, E2E-, tietoturva- ja ekosysteemitestit)
Todennus & tietoturvaOAuth 2.0 (PKCE) + JWT + API-avaimet + käyttöalueisiin rajattu MCP-todennus · levossa oleva data suojattu AES-256-GCM-salauksella · DOMPurify
Häivytyswreq-js — JA3- ja JA4 TLS -sormenjälkien jäljittely, kolmitasoinen välityspalvelin
VikasietoisuusKatkaisija, eksponentiaalinen viive, yhtäaikaisten pyyntöryöppyjen esto, automaattiyhdistelmien itsekorjautuvuus
Lokituspino — rakenteiset JSON-lokit pyyntökontekstilla
TestausNode.js-testiajuri + Vitest — yli 39 000 staattista testimäärittelyä yli 5 100 seuratussa testitiedostossa (yksikkö-, integraatio-, E2E-, tietoturva- ja ekosysteemitestit)
AlustatTyöpöytä (Electron) · Android (Termux) · PWA (mikä tahansa selain)
CI/CDGitHub Actions — automaattinen julkaisu npm:ään ja Docker Hubiin julkaisun yhteydessä
CI/CDGitHub Actions — automaattinen julkaisu npm:ään ja Docker Hubiin uuden version yhteydessä
LinkitVerkkosivusto · npm · Docker Hub
@@ -1302,10 +1303,10 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 - + - - + +
DokumenttiKuvaus
KäyttöopasPalveluntarjoajat, yhdistelmät, CLI-integraatio, käyttöönotto
AsennusopasKaikki asennustavat, CLI-työkalujen määritykset, protokollien määritys, aikakatkaisujen hienosäätö
AsennusopasKaikki asennustavat, CLI-työkalujen määritykset, protokollien käyttöönotto, aikakatkaisujen hienosäätö
CLI-työkalujen opasTyökalukohtaiset määritykset: Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo ja Copilot
EtätilaOhjaa etäpalvelimella (VPS) toimivaa OmniRoutea kannettavan tietokoneesi CLI:stä rajatuilla käyttöoikeustunnuksilla
Claude Code -määritysYhdistä Claude Code OmniRouteen (paikallinen/etäpalvelin) käyttäen launch-toimintoa ja mallikohtaisia profiileja
EtätilaOhjaa etäpalvelimella (VPS) toimivaa OmniRoutea kannettavan tietokoneesi CLI:stä rajattujen käyttöoikeustunnusten avulla
Claude Code -määritysYhdistä Claude Code OmniRouteen (paikallinen/etäpalvelin) käyttämällä launch-toimintoa ja mallikohtaisia profiileja
Pika-aloitusKolme vaihetta: asenna → yhdistä → määritä
@@ -1313,14 +1314,14 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 - + - - + + - +
DokumenttiKuvaus
Docker-opasDocker run, Compose-profiilit, Caddy HTTPS, tunnelit, näköistiedostotunnisteet
Docker-opasDocker run, Compose-profiilit, Caddy HTTPS, tunnelit, levykuvatunnisteet
Podman-opasQuadlet systemd -integraatio, podman-compose, SELinux
VirtuaalikonekäyttöönottoKattava opas: virtuaalikoneen, nginxin ja Cloudflaren määritys
Fly.io-käyttöönottoOta käyttöön Fly.io:ssa pysyvän tallennustilan kanssa
Termux-opasSuorita OmniRoute Androidissa Termuxin kautta
Fly.io-käyttöönottoOta sovellus käyttöön Fly.io:ssa pysyvällä tallennustilalla
Termux-opasSuorita OmniRoute Androidissa Termuxin avulla
PWA-opasProgressiivisen verkkosovelluksen asennus, välimuisti ja arkkitehtuuri
Poisto-opasSiisti poistaminen kaikilla asennustavoilla
YmpäristömäärityksetKaikki .env-muuttujat ja viitteet
YmpäristömäärityksetKaikki .env-muuttujat ja viitetiedot
### 🧠 Ominaisuudet ja arkkitehtuuri @@ -1329,16 +1330,16 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 DokumenttiKuvaus ArkkitehtuuriJärjestelmäarkkitehtuuri, tietovirta ja sisäinen toiminta PakkausopasSeitsemän vaihtoehdon käsittelyketju: pois käytöstä / kevyt / vakio / aggressiivinen / ultra / RTK / pinottu - RTK-pakkausKomentotulosteiden pakkaus, suodattimet, luottamus, vahvistaminen ja raakamuotoisen tulosteen palautus - PakkausmoottoritCaveman, RTK, pinotut käsittelyketjut sekä koontinäyttö-, API- ja MCP-rajapinnat + RTK-pakkausKomentotulosteiden pakkaus, suodattimet, luottamus, varmennus ja raakamuotoisen tulosteen palautus + PakkausmoottoritCaveman, RTK, pinotut käsittelyketjut sekä hallintapaneeli-, API- ja MCP-rajapinnat Pakkaussääntöjen muotoJSON-sääntöpakettien skeemat Caveman- ja RTK-suodattimille - Pakkauksen kielipaketitKielen tunnistus ja Caveman-sääntöpakettien laatiminen - VikasietoisuusopasKatkaisijat, jäähdytysajat, jono, kuormituspiikkien esto ja TLS-huijaus - Automaattinen yhdistelmämoottori16 tekijän pisteytys, tilapaketit ja itsekorjautuvuus + Pakkauksen kielipaketitKielen tunnistus ja Caveman-sääntöpakettien luominen + VikasietoisuusopasKatkaisijat, jäähdytysajat, jono, samanaikaisten pyyntöryöppyjen esto ja TLS-väärentäminen + Automaattinen yhdistelmämoottori16 tekijän pisteytys, tilapaketit ja itsekorjaus VälityspalvelinopasKolmitasoinen välityspalvelinjärjestelmä, 1proxy-markkinapaikka ja rekisterin CRUD-toiminnot - IlmaistasotKoottu hakemisto: 35 dokumentoitua toistuvaa resurssipoolia / 491 luetteloitua ilmaistason kohdetta - OminaisuusgalleriaVisuaalinen esittely koontinäytöstä kuvakaappauksineen - Koodikannan dokumentaatioAloittelijaystävällinen opastus koodikantaan + IlmaistasotKoottu hakemisto: 35 dokumentoitua toistuvaa resurssivarantoa / 489 luetteloitua ilmaistason kohdetta + OminaisuusgalleriaVisuaalinen hallintapaneelikierros kuvakaappauksineen + Koodikannan dokumentaatioAloittelijaystävällinen koodikannan esittely ### 🤖 Protokollat ja API:t @@ -1346,8 +1347,8 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 - - + + @@ -1363,7 +1364,7 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 - +
DokumenttiKuvaus
API-viiteKaikki päätepisteet esimerkkeineen
OpenAPI-määritysOpenAPI 3.0 -määrittely
MCP-palvelin110 MCP-työkalua, IDE-määritykset sekä Python-, TS- ja Go-asiakasohjelmat
OpenAPI-määritysOpenAPI 3.0 -spesifikaatio
MCP-palvelin110 MCP-työkalua, IDE-määritykset sekä Python-, TS- ja Go-asiakkaat
MCP-palvelinopasMCP:n asennus, siirtotavat ja työkaluviite
A2A-palvelinJSON-RPC 2.0 -protokolla, taidot, suoratoisto ja tehtävien hallinta
A2A-palvelinopasA2A-agenttikortti, tehtävät, taidot ja suoratoisto
TietoturvakäytäntöHaavoittuvuuksien ilmoittaminen ja tietoturvakäytännöt
i18n-opas42 kielen tuki, käännöstyönkulku ja RTL
Julkaisun tarkistuslistaJulkaisua edeltävät validointivaiheet
KattavuussuunnitelmaTestikattavuusstrategia yli 39 000 staattiselle testi-ilmoitukselle yli 5 100 seuratussa testitiedostossa
KattavuussuunnitelmaTestikattavuusstrategia yli 39 000 staattiselle testimääritykselle yli 5 100 seuratussa testitiedostossa

@@ -1372,12 +1373,12 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922 # ⭐ Parhaat osallistujat -> Intohimoinen avoimen lähdekoodin yhteisö muovaa OmniRoutea. Nämä henkilöt ovat tehneet poikkeuksellisia panostuksia, jotka vaikuttavat suoraan projektin laatuun, vakauteen ja tavoittavuuteen. **Kiitos.** +> Intohimoinen avoimen lähdekoodin yhteisö muovaa OmniRoutea. Nämä henkilöt ovat antaneet poikkeuksellisen panoksen, joka vaikuttaa suoraan projektin laatuun, vakauteen ja tavoittavuuteen. **Kiitos.** -### Ulkoiset osallistujat yhdistettyjen vetopyyntöjen mukaan +### Ulkopuoliset osallistujat yhdistettyjen vetopyyntöjen mukaan - + @@ -1401,9 +1402,9 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922
SijaOsallistujaYhdistetyt PR:t~Muuttuneet rivit
SijaOsallistujaYhdistetyt PR:t~Muutetut rivit
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Tilanne jäädytetty aktiivisen release/v3.8.50-haaran kärkeen dafb4ae808, sisältäen yhdistämiset ajankohtaan 2026-08-24 05:26:03 UTC asti. Sivutettu GitHub GraphQL -kartoitus sisältää 5 911 yhdistettyä PR:ää: 2 707 tietovaraston omistajalta, 179 Dependabotilta ja 3 025 ulkoista PR:ää 535 eri osallistujalta. ”Muuttuneet rivit” tarkoittaa GitHubin lisäysten ja poistojen yhteismäärää ja sisältää generoidut tiedostot, lukitustiedostot, luettelot, käännökset ja dokumentaation; se kuvaa muutosten määrää, ei kirjoitettuja lähdekoodirivejä. Katkaisurajan tasatulokset on säilytetty. +Tilanne jäädytetty aktiivisen release/v3.8.50-haaran kärkeen dafb4ae808, ja mukana ovat yhdistämiset ajankohtaan 2026-08-24 05:26:03 UTC asti. Sivutettu GitHub GraphQL -kartoitus sisältää 5 911 yhdistettyä PR:ää: 2 707 arkiston omistajalta, 179 Dependabotilta ja 3 025 ulkopuolista PR:ää 535 eri osallistujalta. ”Muutetut rivit” tarkoittaa GitHubin lisäysten ja poistojen summaa ja sisältää generoidut tiedostot, lukitustiedostot, luettelot, käännökset ja dokumentaation; se kuvaa muutosten määrää, ei kirjoitettujen lähdekoodirivien määrää. Tasasijat rajalla säilytetään. -### GitHubin määrittämät commitit +### GitHubin tekijöihin liittämät commitit @@ -1489,9 +1490,9 @@ Kanoniset mittarit 2026-08-24: **1.029 yksilöllistä videota** · **11.132.922
-Tarkistettu uudelleen 2026-08-24 06:14:31 UTC: repositorion Contributors API:n ilmoittamat GitHubiin liitetyt commitit oletushaaralle release/v3.8.50. API palautti 525 identiteettiä (415 käyttäjää, 2 bottia, 108 anonyymiä); tästä taulukosta on jätetty pois ylläpitäjä, botit ja anonyymit identiteetit, ja jaetut sijoitukset on säilytetty. Tämä eroaa sekä yllä olevasta yhdistettyjen pull requestien sijoituksesta että alla olevasta 639 henkilön Git-metatietolaskennasta. +Tarkistettu uudelleen 2026-08-24 06:14:31 UTC: GitHubiin liitetyt commitit, jotka repositorion Contributors API ilmoitti oletushaaralle release/v3.8.50. API palautti 525 identiteettiä (415 käyttäjää, 2 bottia, 108 anonyymiä); tästä taulukosta on jätetty pois ylläpitäjä, botit ja anonyymit identiteetit, ja tasatilanteet on säilytetty. Se eroaa sekä yllä olevasta yhdistettyjen PR:ien sijoituksesta että alla olevasta 639 henkilön Git-metatietolaskennasta. -> 🙏 Näiden osallistujien ominaisuudet, virheenkorjaukset ja infrastruktuuriparannukset ovat **keskeinen osa** sitä, mikä tekee OmniRoutesta luotettavan ja ominaisuuksiltaan monipuolisen. Jokaisella pull requestilla, jokaisella testitapauksella ja jokaisella i18n-käännöstiedostolla on merkitystä. Avoimen lähdekoodin rakentavat heidän kaltaisensa ihmiset. +> 🙏 Näiden osallistujien ominaisuudet, virheenkorjaukset ja infrastruktuuriparannukset ovat **keskeinen osa** sitä, mikä tekee OmniRoutesta luotettavan ja monipuolisen. Jokaisella pull requestilla, testitapauksella ja i18n-käännöstiedostolla on merkitystä. Avoimen lähdekoodin rakentavat heidän kaltaisensa ihmiset. diff --git a/docs/i18n/fi/SECURITY.md b/docs/i18n/fi/SECURITY.md index a7c25cfa6539..6dbb4b3a5818 100644 --- a/docs/i18n/fi/SECURITY.md +++ b/docs/i18n/fi/SECURITY.md @@ -220,19 +220,31 @@ Työkalut ja katselmoijat valvovat näiden sääntöjen noudattamista: 10. **`exec()`- / `spawn()`-funktioiden suorituksenaikaiset arvot `env`-valinnan kautta** — älä koskaan lisää ulkoisia polkuja tai epäluotettuja arvoja merkkijonointerpoloinnilla komentotulkin kautta suoritettaviin komentosarjoihin. Viite: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Suosi oletusarvoisesti turvallisia kirjastoja** — katso [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Valitse ne ennen oman ratkaisun toteuttamista. -## Toimitusketjuskannerien havainnot (Socket.dev / Snyk / vastaavat) +## Toimitusketjuskannerin havainnot (Socket.dev / Snyk / vastaavat) -Julkaistu `omniroute`-npm-artefakti sisältää Next.js:n `output: "standalone"`-koontiversion, mikä tarkoittaa, että jokainen reitinkäsittelijä — mukaan lukien dokumentoidut etuoikeutetut ominaisuudet (MITM, Zed-tuonti, Cloud Sync, sulautettu palveluvalvoja) — päätyy minimoituihin `.next/server/*.js`-osiin. Heuristiset toimitusketjuskannerit vertaavat usein näitä osia haittaohjelmien tunnisteisiin hahmontunnistuksen avulla. +> **Laajuutta koskeva huomautus:** tietovaraston juuressa oleva `socket.yml` määrittää vain Socket.dev-palvelun `projectIgnorePaths`-asetukset julkaistun npm-artefaktin rekisteripuolen julkaisun jälkeistä tarkistusta varten — sitä ei käytetä pakollisena CI-/PR-yhdistämisporttina. Mikään `.github/workflows`-työnkulku, `package.json`-skripti tai `Makefile`-kohde ei käynnistä Socket.dev-palvelua. -Käyttämämme skannerimääritys sijaitsee tietovaraston juuressa tiedostossa [`socket.yml`](socket.yml) (Socket.dev GitHub App -muoto v2 — katso ). Se sulkee nimenomaisesti pois jakelemattomat hakemistot (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` jne.), joten skanneri raportoi vain koodipoluista, jotka todella päätyvät julkaistun version käyttäjille — itse tarkistuksen suorittaa Socket GitHub App lukemalla kyseisen tiedoston, ei tämän tietovaraston työnkulku. +Julkaistu `omniroute`-npm-artefakti sisältää Next.js:n `output: "standalone"` -koontiversion, mikä tarkoittaa, että jokainen reitinkäsittelijä — mukaan lukien dokumentoidut korotettuja käyttöoikeuksia edellyttävät ominaisuudet (MITM, Zed-tuonti, Cloud Sync, upotettu palveluvalvoja) — päätyy `.next/server/*.js`-tiedostojen minifioituihin osiin. Heuristiset toimitusketjuskannerit vertaavat näitä osia usein hahmontunnistuksella haittaohjelmien tunnisteisiin. -Ylläpidämme jokaiselle havaintoluokalle havaintokohtaista ylläpitäjän vakuutusta: +Käyttämämme skannerimääritys sijaitsee tietovaraston juuressa tiedostossa [`socket.yml`](socket.yml) (Socket.dev GitHub App -muoto v2 — katso +). Se sulkee erikseen pois +toimitukseen kuulumattomat hakemistot (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` jne.), jotta skanneri raportoi vain koodipoluista, jotka +todella päätyvät julkaistuille käyttäjille — itse tarkistuksen suorittaa tämän tiedoston lukeva Socket +GitHub App, ei tämän tietovaraston työnkulku. -- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - havaintokohtainen kartoitus: lähdetiedosto ↔ merkitty osa ↔ toiminta ↔ versiossa v3.8.6 toteutettu lievennys. -- Lähdekoodin `SECURITY-AUDITOR-NOTE:`-lohkot kunkin merkityn funktion kohdalla viittaavat samaan dokumenttiin. +Ylläpidämme jokaisesta havaintoluokasta havaintokohtaista ylläpitäjän vahvistusta: -Käyttäjät, joiden koostamisputkessa hälytystä ei voida lieventää, voivat koostaa seuraavasti: `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Tämä korvaa neljä arkaluonteista moduulia tynkämoduuleilla, jotka palauttavat suorituksen aikana HTTP 503 `feature-disabled` -vastauksen, joten etuoikeutetut koodipolut puuttuvat fyysisesti koontipaketista. Julkaisuohje on dokumentissa [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). +- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — + havaintokohtainen kartoitus: lähdetiedosto ↔ merkitty osa ↔ toiminta ↔ versiossa v3.8.6 + käytetty lievennys. +- Lähdekoodin `SECURITY-AUDITOR-NOTE:`-lohkot kunkin merkityn funktion kohdalla + viittaavat samaan dokumenttiin. + +Käyttäjät, joiden käsittelyputkessa hälytystä ei voida lieventää, voivat koota sovelluksen komennolla +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Tämä korvaa neljä +arkaluonteista moduulia tynkämoduuleilla, jotka palauttavat suorituksen aikana HTTP 503 -vastauksen `feature-disabled`, joten korotettuja käyttöoikeuksia edellyttävät koodipolut puuttuvat fyysisesti paketista. +Julkaisuohje on tiedostossa [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Viitteet diff --git a/docs/i18n/fi/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/fi/docs/architecture/CODEBASE_DOCUMENTATION.md index 5f91cc46d90a..acc6a3d1e2e0 100644 --- a/docs/i18n/fi/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/fi/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,8 @@ Jaettu kohdennettuihin alihakemistoihin: ## 4. `open-sse/` — Suoratoistomoottorin työtila -Erillinen npm-työtila, joka julkaistaan pakettina `@omniroute/open-sse`. Vastaa pyyntöjen -käsittelystä, suorittajista, muuntimista, palveluista, transformaattorista ja MCP-palvelimesta. +Erillinen npm-työtila, joka julkaistaan nimellä `@omniroute/open-sse`. Vastaa pyyntöjen +käsittelystä, suorittimista, kääntäjistä, palveluista, muuntimesta ja MCP-palvelimesta. ``` open-sse/ @@ -446,10 +446,10 @@ open-sse/ ├── tsconfig.json ├── types.d.ts ├── config/ Palveluntarjoajarekisterit, otsakeprofiilit, identiteetti, … -├── handlers/ Pyyntöjen käsittelijät (keskustelu, upotukset, ääni, kuva, …) -├── executors/ 108 palveluntarjoajakohtaista HTTP-suorittajaa +├── handlers/ Pyyntökäsittelijät (keskustelu, upotukset, ääni, kuva, …) +├── executors/ 108 palveluntarjoajakohtaista HTTP-suoritinta ├── translator/ Muotomuunnos (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Responses API ↔ Chat Completions -suoratoistotransformaattori +├── transformer/ Responses API ↔ Chat Completions -suoratoistomuunnin ├── services/ Yli 80 palvelumoduulia (yhdistelmät, varajärjestelyt, kiintiöt, identiteetti, …) ├── utils/ Suoratoiston apuohjelmat, TLS-asiakas, AWS SigV4, välityspalvelinhaku, … └── mcp-server/ MCP-palvelin (3 siirtotapaa, 33 käyttöaluetta, 110 työkalua) @@ -457,95 +457,95 @@ open-sse/ ### 4.1 `open-sse/handlers/` -| Käsittelijä | Tarkoitus | -| ----------------------- | ------------------------------------------------------------------------------------------------------ | -| `chatCore.ts` | Keskustelun pääkäsittelyketju (välimuisti, nopeusrajoitus, yhdistelmäreititys, suorittajan käynnistys) | -| `responsesHandler.ts` | OpenAI Responses API:n aloituspiste | -| `embeddings.ts` | Upotukset | -| `imageGeneration.ts` | Kuvien generointi | -| `audioSpeech.ts` | Tekstistä puheeksi | -| `audioTranscription.ts` | Puheesta tekstiksi | -| `videoGeneration.ts` | Videoiden generointi | -| `musicGeneration.ts` | Musiikin generointi | -| `rerank.ts` | Uudelleenjärjestäminen | -| `moderations.ts` | Moderointi | -| `search.ts` | Verkkohaku | -| `sseParser.ts` | SSE-tapahtumien jäsennin | -| `usageExtractor.ts` | Poimii tunnisteiden määrät ylävirran tietovirroista | -| `responseSanitizer.ts` | Poistaa palveluntarjoajakohtaisen kohinan | -| `responseTranslator.ts` | Yhdistää palveluntarjoajan vastauksen ja muunnoskerroksen | +| Käsittelijä | Tarkoitus | +| ----------------------- | --------------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Keskustelun pääkäsittelyketju (välimuisti, nopeusrajoitus, yhdistelmäreititys, suorittimen välitys) | +| `responsesHandler.ts` | OpenAI Responses API:n aloituspiste | +| `embeddings.ts` | Upotukset | +| `imageGeneration.ts` | Kuvien generointi | +| `audioSpeech.ts` | Tekstistä puheeksi | +| `audioTranscription.ts` | Puheesta tekstiksi | +| `videoGeneration.ts` | Videoiden generointi | +| `musicGeneration.ts` | Musiikin generointi | +| `rerank.ts` | Uudelleenjärjestäminen | +| `moderations.ts` | Moderointi | +| `search.ts` | Verkkohaku | +| `sseParser.ts` | SSE-tapahtumajäsennin | +| `usageExtractor.ts` | Poimii tunnistemäärät ylävirran suoratoistoista | +| `responseSanitizer.ts` | Poistaa palveluntarjoajakohtaisen kohinan | +| `responseTranslator.ts` | Yhdysosa palveluntarjoajan vastauksen ja käännöskerroksen välillä | ### 4.2 `open-sse/executors/` -108 palveluntarjoajakohtaista suorittajaa, joista jokainen laajentaa `BaseExecutor`-luokkaa (`base.ts`): +108 palveluntarjoajasuoritinta, joista jokainen laajentaa `BaseExecutor`-luokkaa (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop` sekä `claudeIdentity.ts` -(jaettu identiteettiapuri) ja `index.ts` (rekisteri). +(jaettu identiteettiapuohjelma) ja `index.ts` (rekisteri). -> Huomautus: palveluntarjoajia, joita ei ole lueteltu tässä, palvelee `default.ts` käyttämällä yleistä -> OpenAI-yhteensopivaa suorittajaa. Täydellinen palveluntarjoajaluettelo (355 palveluntarjoajaa) sijaitsee tiedostossa -> `src/shared/constants/providers.ts`. +> Huomautus: palveluntarjoajia, joita ei ole lueteltu tässä, palvelee `default.ts` käyttäen yleistä +> OpenAI-yhteensopivaa suoritinta. Täydellinen palveluntarjoajaluettelo (355 palveluntarjoajaa) sijaitsee +> tiedostossa `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Keskiö–puola-mallinen muunnos (OpenAI toimii keskiönä). +Keskiöön ja haaroihin perustuva kääntäminen (OpenAI toimii keskiönä). -- **9 pyyntömuunninta** (`translator/request/`): +- **9 pyyntökääntäjää** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. -- **9 vastausmuunninta** (`translator/response/`): +- **9 vastauskääntäjää** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 apuria** (`translator/helpers/`): +- **9 apuohjelmaa** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper` sekä - apurien testit. -- **Kuva-apurit** (`translator/image/sizeMapper.ts`). + apuohjelmien testit. +- **Kuva-apuohjelmat** (`translator/image/sizeMapper.ts`). - Ylätaso: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-pohjainen Responses API ↔ Chat - Completions -muunnin (jota `responses/`-reitin kaikki pyynnöt käsittelevä reitti käyttää). + Completions -muunnin (jota `responses/`-reitin yleiskäsittelijä käyttää). ### 4.5 `open-sse/services/` Poimintoja (täydellinen luettelo hakemistossa `open-sse/services/`): -| Kohde | Tiedostot | -| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Yhdistelmäreititys | `combo.ts` (19 strategiaa), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Auto Combo -moottori | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Vikasietoisuus | `accountFallback.ts` (jäähdytys + lukitus), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kiintiöt | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Välimuistit | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Älykäs reititys | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Mallien käsittely | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Pakkaus | `compression/` — pakkausmoottorin täydellinen kytkentä | -| Tunniste + istunto | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Taso / manifesti | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / verkko | `ipFilter.ts`, `webSearchFallback.ts` | -| Erät | `batchProcessor.ts` | -| Käyttö | `usage.ts` | +| Huolenaihe | Tiedostot | +| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Yhdistelmäreititys | `combo.ts` (19 strategiaa), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Automaattinen yhdistelmämoottori | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Vikasietoisuus | `accountFallback.ts` (jäähdytys + lukitus), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kiintiöt | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Välimuistit | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Älykäs reititys | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Mallien käsittely | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Pakkaus | `compression/` — koko pakkausmoottorin kytkentä | +| Tokenit + istunto | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Taso / manifesti | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / verkko | `ipFilter.ts`, `webSearchFallback.ts` | +| Erät | `batchProcessor.ts` | +| Käyttö | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 yksilöllistä työkalua**, jotka on kytketty tiedostossa `server.ts` (45 kanonista työkalua tiedostossa `schemas/tools.ts` + +- **110 yksilöllistä työkalua** kytketty tiedostossa `server.ts` (45 kanonista työkalua tiedostossa `schemas/tools.ts` + muisti-, taito-, GitHub-taito-, pooli-, pelillistämis-, laajennus-, Notion-, Obsidian-, - paikalliskorpus- ja pakkausmoduulit — unioni lasketaan funktiolla `countUniqueMcpTools`). + paikallinen korpus- ja pakkausmoduulit — unioni laskettu funktiolla `countUniqueMcpTools`). - **3 siirtotapaa**: stdio, suoratoistettava HTTP, SSE. -- **33 käyttöaluetta**, jotka pakotetaan suorituksen aikana — perusluettelo on tiedostossa `src/shared/constants/mcpScopes.ts`, ja koko joukko on kunkin työkalumoduulin ilmoittamien käyttöalueiden unioni. +- **33 käyttöaluetta** valvotaan suorituksen aikana — perusluettelo on tiedostossa `src/shared/constants/mcpScopes.ts`, ja täydellinen joukko on kunkin työkalumoduulin ilmoittamien käyttöalueiden unioni. - Auditointitaulu: `mcp_tool_audit` (täytetään tiedostolla `audit.ts`). - Tiedostot: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, sekä testit hakemistossa `__tests__/`. -- Täydellinen työkaluluettelo on kohdassa [MCP-SERVER.md](../frameworks/MCP-SERVER.md). +- Täydellinen työkaluluettelo on dokumentissa [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### 4.7 `open-sse/config/` @@ -563,7 +563,7 @@ sovittimet (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, ### 4.8 `open-sse/utils/` -Suoratoiston perusosat ja palveluntarjoajien apuohjelmat: `stream.ts`, `streamHandler.ts`, +Suoratoiston peruskomponentit ja palveluntarjoajien apufunktiot: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/fi/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/fi/docs/architecture/RESILIENCE_GUIDE.md index 4655e6116272..2b0912fc0d2e 100644 --- a/docs/i18n/fi/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/fi/docs/architecture/RESILIENCE_GUIDE.md @@ -67,80 +67,156 @@ eksponentiaalista `minRetryCooldownMs → maxRetryCooldownMs`-viivettä. Ohituks `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Regressiosuojaus: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Yhteyden jäähyaika +## 2. Yhteyden jäähdytysaika -**Soveltamisala:** yksittäinen palveluntarjoajan yhteys/tili/avain. +**Laajuus:** yksittäinen palveluntarjoajan yhteys/tili/avain. -**Tarkoitus:** ohittaa yksi viallinen avain muiden saman palveluntarjoajan yhteyksien jatkaessa pyyntöjen käsittelyä. +**Tarkoitus:** ohittaa yksi viallinen avain samalla, kun muut saman palveluntarjoajan yhteydet jatkavat palvelemista. **Toteutus:** - Merkitse ei-käytettäväksi: `src/sse/services/auth.ts::markAccountUnavailable()` - Valinta: `getProviderCredentials*` samassa tiedostossa -- Jäähyajan laskenta: `open-sse/services/accountFallback.ts::checkFallbackError()` +- Jäähdytysajan laskenta: `open-sse/services/accountFallback.ts::checkFallbackError()` - Asetukset: `src/lib/resilience/settings.ts` **Yhteyskohtaiset kentät:** -- `rateLimitedUntil` — aikaleima, johon asti jäähyaika kestää +- `rateLimitedUntil` — aikaleima, johon asti jäähdytysaika kestää - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — eksponentiaalisen viiveen laskuri -**Oletusarvoiset jäähyajat:** +**Oletusjäähdytysajat:** - OAuth-perusaika: 5 s - API-avaimen perusaika: 3 s -- API-avaimen 429: käyttää ensisijaisesti ylävirran `Retry-After`-otsaketta, nollausotsakkeita tai jäsennettävissä olevaa nollausaikatekstiä +- API-avaimen 429: käyttää ensisijaisesti ylävirran `Retry-After`-/nollausotsakkeita tai jäsennettävissä olevaa nollausaikatekstiä - Viive: `baseCooldownMs * 2 ** failureIndex` -**Samanaikaisten pyyntöryöppyjen esto:** estää samanaikaisia virheitä pidentämästä jäähyaikaa liikaa tai kasvattamasta `backoffLevel`-arvoa kahdesti. +**Samanaikaisten pyyntöryöppyjen esto:** estää samanaikaisia virheitä pidentämästä jäähdytysaikaa liikaa tai kasvattamasta `backoffLevel`-arvoa kahdesti. -**Päättävät tilat (EIVÄT jäähyaikoja):** +**Lopulliset tilat (EIVÄT jäähdytysaikoja):** -- `banned` — asetetaan kielletyn avainsanan tai tilin eston tunnistuksen perusteella (katso [BAN_DETECTION](../security/BAN_DETECTION.md)) sekä kolmen peräkkäisen ylävirran pyyntökohtaisen hylkäyksen jälkeen (`request_rejected`, esimerkiksi Anthropic OAuth 403 "Pyyntöä ei sallita" — `open-sse/services/requestRejectedStreak.ts`); yksittäinen hylkäys asettaa yhteydelle vain jäähyajan -- `expired` (siirtyy päättävään tilaan rajatun uudelleenyritysmäärän jälkeen — `EXPIRED_RETRY_MAX = 3` eksponentiaalisella viiveellä — jotta tilapäiset OAuth-virheet voivat korjaantua itsestään ennen tilin pysyvää deaktivointia) +- `banned` — asetetaan kielletyn avainsanan / tilin eston tunnistuksen perusteella (katso [BAN_DETECTION](../security/BAN_DETECTION.md)) sekä kolmen peräkkäisen ylävirran pyyntökohtaisen hylkäyksen jälkeen (`request_rejected`, esim. Anthropic OAuth 403 "Pyyntöä ei sallita" — `open-sse/services/requestRejectedStreak.ts`); yksittäinen hylkäys vain asettaa yhteyden jäähdytystilaan +- `expired` (siirtyy lopulliseen tilaan rajatun määrän uudelleenyrityksiä jälkeen — `EXPIRED_RETRY_MAX = 3` eksponentiaalisella viiveellä — jotta tilapäiset OAuth-virheet voivat korjaantua itsestään ennen tilin pysyvää deaktivointia) - `credits_exhausted` -Nämä säilyvät, kunnes tunnistetiedot muuttuvat tai operaattori nollaa ne. Älä korvaa päättäviä tiloja tilapäisellä jäähyajan tilalla. +Nämä säilyvät, kunnes tunnistetiedot muuttuvat tai operaattori nollaa ne. Älä korvaa lopullisia tiloja tilapäisellä jäähdytystilalla. -**Laiska palautuminen:** kun `rateLimitedUntil` on menneisyydessä, yhteys voidaan jälleen valita. Onnistuneen käytön jälkeen `clearAccountError()` tyhjentää kaikki virhekentät. +**Laiska palautuminen:** kun `rateLimitedUntil` on menneisyydessä, yhteys voidaan jälleen valita. Onnistuneen käytön yhteydessä `clearAccountError()` tyhjentää kaikki virhekentät. -### Istuntoaffiniteetti (#7274) +### Claude OAuthin käyttöraja: alemman prioriteetin kaista + istuntorajan nollaus -**Soveltamisala:** yksi asiakasistunto (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`-otsake), joka on kiinnitetty yhteen yhteyteen **millä tahansa** palveluntarjoajalla. +**Laajuus:** yksi Claude-tilauksen (OAuth) yhteys. Molemmat ominaisuudet ovat **yhteyskohtaisesti valinnaisia** +(Muokkaa yhteyttä → Claude-osio → `lowPriorityMode` / `autoLimitReset` kohteessa +`providerSpecificData`, molemmat oletusarvoisesti poissa käytöstä), ja ne vastaavat Claude Coden `/low-priority`- ja +`/limit-reset`-komentoja (siirtosopimus tallennettu Claude Code 2.1.263:sta). -**Tarkoitus:** pitää monivaiheinen agentti (Claude Code, aider, mukautetut agentit) samalla tilillä pyyntöjen välillä, mikä vähentää kontekstin katoamista tilien välillä ja toistuvia kylmäkäynnistyksen 429-virheitä palveluntarjoajilla, joilla on tilikohtainen istuntotila. +**Toteutus:** + +- Tilakone + vastausten luokittelu: `open-sse/services/claudeLowPriority.ts` +- Nollaustilan/-varauksen asiakasohjelma: `open-sse/services/claudeLimitReset.ts` +- Suorittimen kytkentäkohta (otsakkeen lisäys + uudelleenyritys samalla tilillä): `open-sse/executors/base.ts::execute()` +- Valinnan pysyvä tallennus: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Laukaisin:** viiden tunnin käyttöraja — `429`, jonka otsakkeissa on +`anthropic-ratelimit-unified-status: rejected` ja, kun tili on kelvollinen, +`anthropic-ratelimit-unified-slow-offer: treatment`. Mitään ei lähetetä ennen ensimmäistä käyttörajan +429-vastausta; 429-ryöppy ilman yhtenäisiä otsakkeita käsitellään normaalin jäähdytyspolun kautta. + +**Alemman prioriteetin kaista** (`lowPriorityMode`): + +- Käyttörajan 429-vastauksen yhteydessä suoritin hyväksyy tarjouksen ja yrittää välittömästi uudelleen **samalla** + tilillä käyttäen otsaketta `anthropic-usage-limit: slow`; kaista pysyy aktiivisena ilmoitettuun + `anthropic-ratelimit-unified-reset`-ajankohtaan saakka (+60 s lisäaika), ja jokainen tämän aikaikkunan pyyntö sisältää + otsakkeen. Siepattu 429-vastaus ei koskaan saavuta `handleChatCore`-käsittelijää, joten yhteyttä + **ei** aseteta jäähdytystilaan eikä vaihdeta pois. +- Myöhempien vastausten `anthropic-ratelimit-unified-slow-status`: `active` / `not_needed` + säilyttävät kaistan; `slot_busy` (429) tai `529` odottavat palvelimen + `anthropic-ratelimit-unified-slow-retry-after`-ajan (oletus 20 s, rajaus 5–600 s, ±30 % satunnaisvaihtelu) + ja yrittävät uudelleen `anthropic-ratelimit-unified-slow-max-wait`-arvon rajoissa (oletus 20 min, rajaus + 1 min–6 h) — tämän jälkeen kaista päättyy ja 10 minuutin odotusaika estää tarjouksen hyväksymisen uudelleen. Odotus + rajataan lisäksi pyynnön oman ylävirran aloituksen aikakatkaisun jäljellä olevaan aikaan + (`resolveFetchStartTimeout`, oletuksena 10 min), josta vähennetään 5 s:n marginaali: ilman tätä rajausta + 20 minuutin oletusenimmäisodotus jatkuisi pyyntöä pidempään ja lepo keskeytyisi + odotuksen aikana, jolloin näkyviin tulisi `TimeoutError` hallitun `max_wait`-päättymisen ja odotusajan sijaan. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, viiden tunnin aikaikkunan vaihtuminen tai + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (joka päättää kaistan tilaan + `extra_usage` missä tahansa tilassa, koska maksullinen ylitys kattaa nyt käyttörajan) päättävät kaistan; + vastaus siirtyy tämän jälkeen normaaliin jäähdytyspolkuun. `budget_exhausted` muistetaan ilmoitettuun + budjetin nollaukseen asti (≤ 8 päivää). +- Käyttörajan tarkistus suoritetaan suorittimen omien 400-vastauksesta käynnistyvien yrityksen sisäisten uudelleenyritysten jälkeen (kontekstin + muokkaus, ajattelun/ponnistuksen rajaukset, parametrien automaattinen oppiminen), joten vain yhden tällaisen uudelleenyrityksen aikana + ilmenevä käyttörajan 429-vastaus siepataan edelleen sen sijaan, että se päätyisi jäähdytyspolkuun. +- Tila säilytetään muistissa yhteyskohtaisesti (uudelleenkäynnistys aiheuttaa yhden ylimääräisen käyttörajan 429-vastauksen ennen uutta hyväksyntää). + +**Istuntorajan nollaus** (`autoLimitReset`, kokeillaan ennen kaistaa, kun molemmat ovat käytössä): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide`- + lohko; kun `arm: "reset"` ja `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` käyttäen + `{ "program": "juniper_tide" }` (organisaation UUID kentästä + `providerSpecificData.organizationUUID`, alustuksen varavaihtoehto). +- `result: reset|not_limited` → pyyntöä yritetään uudelleen täydellä nopeudella (ei hidastusotsaketta). + `already_used` / `not_offered` tallentavat `next_available_at`-arvon (oletus yksi viikko); + mikä tahansa virhe aiheuttaa 15 minuutin viiveen. Nollaus voidaan tehdä kerran viikossa, ja se lasketaan edelleen + mukaan viikkorajaan. + +Regressiosuojaukset: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + +### Istuntokohtainen affiniteetti (#7274) + +**Laajuus:** yksi asiakasistunto (`X-Session-Id`- / `x-codex-session-id`- / `x-omniroute-session`-otsake), joka on sidottu yhteen yhteyteen **millä tahansa** palveluntarjoajalla. + +**Tarkoitus:** pitää monivaiheinen agentti (Claude Code, aider, mukautetut agentit) samalla tilillä pyyntöjen välillä, mikä vähentää tilien välisestä kontekstin menetyksestä aiheutuvia ongelmia ja toistuvia kylmäkäynnistyksen 429-virheitä palveluntarjoajilla, joilla istunnon tila on tilikohtainen. **Toteutus:** -- TTL:n ratkaisu: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- TTL:n määritys: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - Kiinnityksen valinta/luonti: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Otsakkeen poiminta (yleinen, mikä tahansa palveluntarjoaja): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Pysyvästi tallennettu kiinnitystaulu: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Asetus: `sessionAffinityTtlMs` (yleinen TTL millisekunteina, `0` poistaa käytöstä) — `src/lib/db/settings.ts`. Nimetty uudelleen vain Codexia koskeneesta `codexSessionAffinityTtlMs`-asetuksesta migraatiossa `124_generic_session_affinity_ttl.sql`, joka siirtää aiemmin määritetyn Codexin TTL-arvon uudeksi oletusarvoksi. +- Pysyvä kiinnitystaulu: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Asetus: `sessionAffinityTtlMs` (yleinen TTL millisekunteina, `0` poistaa käytöstä) — `src/lib/db/settings.ts`. Nimi muutettiin vain Codexia koskeneesta asetuksesta `codexSessionAffinityTtlMs` migraatiolla `124_generic_session_affinity_ttl.sql`, joka siirtää aiemmin määritetyn Codexin TTL-arvon uudeksi oletusarvoksi. -Ennen muutosta #7274 `resolveSessionAffinityTtlMs()` palautti välittömästi arvon `0` kaikille muille palveluntarjoajille paitsi `codex`, joten TTL-asetuksella (ja istunto-otsakkeilla) ei ollut vaikutusta muualla, vaikka kiinnitysmekanismi ja otsakkeiden poiminta olivat jo palveluntarjoajasta riippumattomia. Korjaus poisti tämän aikaisen palautuksen; TTL koskee nyt yhdenmukaisesti kaikkia palveluntarjoajia, kun sen yleiseksi arvoksi on asetettu yli `0`. +Ennen muutosta #7274 `resolveSessionAffinityTtlMs()` palautti välittömästi arvon `0` kaikille muille palveluntarjoajille paitsi `codex`, joten TTL-asetuksella (ja istunto-otsakkeilla) ei ollut vaikutusta muualla, vaikka kiinnitysmekanismi ja otsakkeiden poiminta olivat jo palveluntarjoajasta riippumattomia. Korjaus poisti tämän aikaisen palautuksen; TTL koskee nyt yhdenmukaisesti kaikkia palveluntarjoajia, kun sen yleiseksi arvoksi on asetettu enemmän kuin `0`. -Kolmea istuntoaffiniteetin otsaketta ei koskaan välitetä ylävirtaan — suorittimet muodostavat omat ylävirran otsakkeensa alusta alkaen sen sijaan, että ne välittäisivät asiakkaan otsakkeet, joten arvo säilyy vain sisäisenä korrelaatiotunnisteena. +Kolmea istunnon affiniteettiotsaketta ei koskaan välitetä eteenpäin ylävirtaan — suorittimet muodostavat omat ylävirran otsakkeensa alusta alkaen sen sijaan, että ne välittäisivät asiakkaan otsakkeet, joten tunniste säilyy vain sisäisenä korrelaatiotunnuksena. -### Hallittujen istuntoyhteyksien yksinomaiset vuokrasopimukset +### Hallittujen istuntoyhteyksien yksinomaiset vuokraukset -**Soveltamisala:** yksi aktiivinen hallittu HTTP-asiakasohjelma/-istunto omistaa yhden valintakelpoisen OmniRoute-yhteyden. +**Soveltamisala:** yksi aktiivinen hallittu HTTP-asiakas tai -istunto omistaa yhden kelvollisen OmniRoute-yhteyden. -**Tarkoitus:** tarjota pysyvä yksinomainen yhteyden omistajuus asiakkaille, jotka tarvitsevat pyyntöjen välille ehdottoman reititysrajan. Tämä eroaa istuntoaffiniteetista, joka on pehmeä jatkuvuuspreferenssi: yksinomainen vuokrasopimus säilyttää elinkaaren tilan SQLitessä, valvoo aktiivisen omistajan ja aktiivisen yhteyden yleistä yksikäsitteisyyttä sekä hylkää vanhentuneen sukupolven ennen pyynnön välittämistä palveluntarjoajalle. +**Tarkoitus:** tarjota pysyvä ja yksinomainen yhteyden omistajuus asiakkaille, jotka tarvitsevat tiukan reititysrajan +pyyntöjen välillä. Tämä eroaa istunnon affiniteetista, joka on pehmeä jatkuvuuspreferenssi: +yksinomainen vuokraus säilyttää elinkaaren tilan SQLitessä, varmistaa aktiivisen omistajan ja +aktiivisen yhteyden maailmanlaajuisen yksilöllisyyden sekä hylkää vanhentuneen sukupolven ennen palveluntarjoajalle välittämistä. -Ominaisuus otetaan käyttöön erikseen kullekin API-avaimelle. Hallitulla avaimella on oltava käyttöalue `lease:exclusive` ja eksplisiittinen, ei-tyhjä `allowedConnections`-luettelo. Mikä tahansa HTTP-asiakasohjelma voi käyttää elinkaaripäätepistettä; asiakkaan nimeä, user-agentia, palveluntarjoajaa, OAuth-menetelmää tai mallia ei vaadita. Vuokrasopimus omistaa yhteyden, ei mallia, joten mallin vaihtaminen säilyttää sidoksen niin kauan kuin yhteys on tavanomaisten sääntöjen mukaan valintakelpoinen. Tavalliset mallia, kiintiötä, kuntoa, jäähyaikaa ja sallittujen kohteiden luetteloa koskevat säännöt pysyvät määräävinä ja voivat siirtää saman sukupolven toiseen vapaaseen, valintakelpoiseen yhteyteen. +Ominaisuus otetaan käyttöön erikseen kullekin API-avaimelle. Hallitulla avaimella on oltava `lease:exclusive`-käyttöalue ja +eksplisiittinen, ei-tyhjä `allowedConnections`-luettelo. Mikä tahansa HTTP-asiakas voi käyttää elinkaaripäätepistettä; +asiakkaan nimeä, user-agent-arvoa, palveluntarjoajaa, OAuth-menetelmää tai mallia ei vaadita. Vuokraus omistaa yhteyden, +ei mallia, joten mallin vaihtaminen säilyttää sidoksen niin kauan kuin yhteys pysyy tavanomaisesti +kelvollisena. Tavanomaiset mallia, kiintiötä, toimintakuntoa, jäähtymisaikaa ja sallittujen kohteiden luetteloa koskevat säännöt pysyvät määräävinä ja voivat +siirtää saman sukupolven toiseen vapaaseen, kelvolliseen yhteyteen. -Elinkaaripäätepiste on `POST /api/v1/session-leases`, ja sen JSON-toiminnot ovat `acquire`, `renew` ja `release`. Hallitut päättelypyynnöt esittävät läpinäkymättömän `X-OmniRoute-Lease-Owner`-arvon ja täsmällisen `X-OmniRoute-Lease-Generation`-arvon. Omistaja käyttää etuliitettä `vlo_`, jota seuraa 43 base64url-merkkiä; vain sen SHA-256-tiiviste tallennetaan. Jokainen lopullinen välitysraja sitoo myös todennetun API-avaimen tunnuksen ja aktiivisen yhteyden tunnuksen. Vuokrasopimuksen hallintaotsakkeet poistetaan lokeista, säilytetyistä pyyntötilannevedoksista ja ylävirran suorittimien otsakkeista. +Elinkaaripäätepiste on `POST /api/v1/session-leases`, ja sen JSON-toiminnot ovat `acquire`, `renew` ja `release`. +Hallitut päättelypyynnöt välittävät läpinäkymättömän `X-OmniRoute-Lease-Owner`-arvon ja täsmällisen +`X-OmniRoute-Lease-Generation`-arvon. Omistajatunnus alkaa merkkijonolla `vlo_`, jota seuraa 43 base64url-merkkiä; vain +sen SHA-256-tiiviste tallennetaan. Jokainen lopullinen välitysraja sitoo myös todennetun API-avaimen tunnuksen ja +aktiivisen yhteyden tunnuksen. Vuokrauksen hallintaotsakkeet poistetaan lokeista, säilytetyistä pyyntövedoksista ja +ylävirran suorittimien otsakkeista. -Jos tavallisessa reitityksessä on valintakelpoisia hallittuja ehdokkaita, mutta jokainen vapaa ehdokas on ulkopuolisen aktiivisen vuokrasopimuksen varaama, OmniRoute palauttaa HTTP-tilan `429`, koodin lease-capacity-unavailable, kapasiteetin odotustilan sekä rajatun `Retry-After`-arvon, joka johdetaan aikaisimmasta asiaankuuluvasta vanhenemisajasta. Tavallinen tyhjä valintakelpoisten yhteyksien joukko ei ole vuokrasopimusristiriita, joten se säilyttää nykyisen reititysvirhesemantiikkansa. +Jos tavallisessa reitityksessä on kelvollisia hallittuja ehdokkaita mutta jokainen vapaa ehdokas on +vieraan aktiivisen vuokrauksen varaama, OmniRoute palauttaa HTTP-tilan `429`, koodin lease-capacity-unavailable, +kapasiteetin odotustilan ja rajatun `Retry-After`-arvon, joka johdetaan aikaisimmasta asiaankuuluvasta vanhentumisajasta. +Tavallinen tyhjä kelpoisuusjoukko ei ole vuokrauskiista, vaan säilyttää nykyisen reititysvirhesemantiikkansa. -Liittyvät mekanismit pysyvät erillisinä: +Aiheeseen liittyvät mekanismit pysyvät erillisinä: -- OAuth-istuntojen varaus on prosessikohtaista pehmeää kuormanjakoa OAuth-tileille. -- Tilisemaforit myöntävät pyyntöjen rinnakkaisuuslupia, jotka päättyvät pyynnön valmistuessa. -- Hallittujen istuntojen yksinomaiset vuokrasopimukset tarjoavat pysyvän elinkaaren aikaisen omistajuuden sukupolvirajalla. +- OAuth-istunnon käyttöaste on prosessikohtaista pehmeää kuormanjakoa OAuth-tileille. +- Tilikohtaiset semaforit myöntävät pyyntöjen samanaikaisuusluvat ja päättyvät pyynnön valmistuessa. +- Hallittujen istuntoyhteyksien yksinomaiset vuokraukset tarjoavat pysyvän elinkaaren omistajuuden sukupolvirajalla. --- @@ -270,47 +346,81 @@ nopeusrajoituksen. Toimintaa rajoittaa **Asetukset → Häiriönsietokyky** -koh --- -## 5. Pyyntöjonon sisäänoton hallinta (v3.8.49 · ongelma #6593) - -**Soveltamisala**: paikallinen palveluntarjoaja- ja yhteyskohtainen nopeusrajoitusjono (`open-sse/services/rateLimitManager.ts`, -jonka taustalla toimii Bottleneck), yhtä tasoa alempana kuin edellä kuvatut kolme mekanismia. - -**`maxWaitMs` on vanha pysyvästi tallennettu nimi suorituksen vanhenemiselle.** -`resilienceSettings.requestQueue.maxWaitMs` välitetään Bottleneckille työn -`expiration`-arvona, jonka ajastin käynnistyy vasta välityksen jälkeen. Näin ollen se rajoittaa -rajoittimen hallitsemaa suoritusta, ei paikallisessa jonossa vietettyä aikaa. Vanheneminen -ilmoitetaan luotettuna paikallisena `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` -virheenä (HTTP 504); -aiempi jonon aikakatkaisun koodinimi hyväksytään vain luotetun sisäisen -taaksepäin yhteensopivuuden vuoksi. Oletusarvo on 15000ms; sen voi ohittaa -`RATE_LIMIT_MAX_WAIT_MS`-ympäristömuuttujalla tai hallintapaneelissa (**Asetukset → Häiriönsietokyky**, -käyttöliittymän raja 1–30000ms). Jonossa oloajalla ei ole aikarajaa; rajoita -jonossa olevien kutsujien määrää alla kuvatulla `maxQueueDepth`-asetuksella. - -**`maxQueueDepth` — erikseen käyttöön otettava sisäänoton yläraja (uusi).** `resilienceSettings.requestQueue.maxQueueDepth` -rajoittaa, kuinka monta pyyntöä voi odottaa jonossa (ei vielä välitettynä) yhtä -palveluntarjoaja- ja yhteysyhdistelmää kohden samanaikaisesti. Kun jonossa on jo `maxQueueDepth` -pyyntöä, uusi pyyntö hylätään välittömästi tyypitetyllä -`code: "RATE_LIMIT_QUEUE_FULL"` -virheellä **ennen** kuin se koskaan saavuttaa `limiter.schedule()`-kutsun -— hylkäys on siten kevyt ja tapahtuu ennen pyynnön myöhempää -kehotteen pakkaus- tai käännöstyötä. Oletusarvo `0` = -pois käytöstä, mikä säilyttää nykyisen rajoittamattoman jonon toiminnan; sallittu alue on 0–100000. -Arvon voi ohittaa `RATE_LIMIT_MAX_QUEUE_DEPTH`-ympäristömuuttujalla tai -`resilienceSettings.requestQueue.maxQueueDepth`-asetuksella (hallintapaneeli/API-päivitys). - -Sisäänottotarkistus itsessään on puhdas funktio +## 5. Pyyntöjonon sisäänpääsyn hallinta (v3.8.49 · issue #6593) + +**Laajuus**: paikallinen palveluntarjoaja- ja yhteyskohtainen nopeusrajoitusjono (`open-sse/services/rateLimitManager.ts`, +jonka taustalla toimii Bottleneck), yksi taso yllä mainittujen kolmen mekanismin alapuolella. + +**`maxWaitMs` rajaa jonotusajan; `executionMaxWaitMs` rajaa suorituksen.** +Nämä kaksi on tarkoituksella erotettu toisistaan, eikä kumpikaan vaikuta toiseen. + +`resilienceSettings.requestQueue.maxWaitMs` on **jonotusajan budjetti**: se +kattaa palveluntarjoajan vapaan paikan odottamisen ja sen jälkeisen QUEUED-tilassa +olemisen, ja sen ajastin tyhjennetään heti, kun työ poistuu QUEUED-tilasta ja +alkaa suorittua (`rateLimitManager.ts`, `wrappedFn`). Sen ylittävä pyyntö ei +koskaan saavuta ylävirran palvelua. Oletusarvo on 30000ms, ja sen antaa +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` tiedostossa +`src/lib/resilience/settings.ts`. Arvo on lukittu testillä +`tests/unit/ratelimit-admission-control-6593.test.ts`, joten sen muuttaminen +rikkoo testin sen sijaan, että tämä kappale jäisi huomaamatta vanhentuneeksi. + +`resilienceSettings.requestQueue.executionMaxWaitMs` on arvo, jonka Bottleneck +saa työn `expiration`-arvoksi ja jonka ajastin käynnistyy vasta lähettämisen +jälkeen. Se toimii varmistuksena suorittajille, joilla ei ole omaa ylävirran +aikakatkaisua, ja se nostetaan suorittajan oman noudon aloituksen aikakatkaisun +tasolle, jos tämä on pidempi, joten se ei voi katkaista toimivaa, parhaillaan +käsiteltävää vastausta. Oletusarvo on 600000ms (10 min). + +Jonotusbudjetin syöttäminen `expiration`-arvoksi aiheutti aiemmin sen, että +ei-inkrementaaliset yhdyskäytävät keskeytyivät kesken suorituksen — ne voivat +perustellusti toimia useita minuutteja ennen ensimmäisiä tavuja — ja tämän +vuoksi vanheneminen ilmoitetaan muodossa `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), kun taas jonotusbudjetti käyttää +jonon aikakatkaisukoodia. Ohita kumpi tahansa ympäristömuuttujalla +`RATE_LIMIT_MAX_WAIT_MS` / `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) tai +hallintapaneelista (**Settings → Resilience**). Molemmat rajataan välille +1ms–24h normalisoinnin yhteydessä. + +**Prioriteettijärjestys kummallekin:** ympäristömuuttuja määrittää vain +_oletusarvon_. Kohteeseen `resilienceSettings.requestQueue` tallennettu arvo +(hallintapaneelin / API-korjauksen kautta, tallennettuna kohteeseen `key_value`) +ohittaa sen, ja yhteyskohtainen `rateLimitOverrides.maxWaitMs` / +`.executionMaxWaitMs` ohittaa tämänkin. Ympäristömuuttujan asettaminen +käyttöönotossa, jossa on jo tallennettu arvo, ei siis muuta mitään — tyhjennä +tai päivitä tallennettu asetus sen sijaan. + +Jonossa oloa rajaa `maxWaitMs`; alla kuvattu `maxQueueDepth` rajaa sen, kuinka +monta kutsujaa voi olla jonossa samanaikaisesti. + +**`maxQueueDepth` — valinnainen sisäänpääsyraja (uusi).** `resilienceSettings.requestQueue.maxQueueDepth` +rajaa, kuinka monta pyyntöä voi olla samanaikaisesti jonossa (ei vielä +lähetettynä) yhdelle palveluntarjoaja- ja yhteysyhdistelmälle. Kun jonossa on +jo `maxQueueDepth` pyyntöä, uusi pyyntö hylätään välittömästi tyypitetyllä +`code: "RATE_LIMIT_QUEUE_FULL"` -virheellä **ennen** kuin se koskaan saavuttaa +kutsun `limiter.schedule()` — hylkäys on siis kevyt ja tapahtuu ennen pyynnölle +tehtävää myöhempää kehotteen pakkaus- tai käännöstyötä. Oletusarvo `0` = +pois käytöstä, mikä säilyttää nykyisen rajoittamattoman jonon toiminnan; +sallittu väli on 0–100000. Ohita ympäristömuuttujalla +`RATE_LIMIT_MAX_QUEUE_DEPTH` (env) tai asetuksella +`resilienceSettings.requestQueue.maxQueueDepth` (hallintapaneeli/API-korjaus). + +Sisäänpääsyn tarkistus on itsessään puhdas funktio (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), joten sitä voidaan yksikkötestata ilman todellista Bottleneck-rajoitinta. -> Ongelman #6593 avannut RFC ehdotti myös `bypassCompressionOnRateLimit`-asetusta. -> Tämän repositorion `open-sse/services/compression/`-putki suorittaa -> kehotteen/kontekstin pakkauksen ulospäin lähtevälle LLM-pyynnölle (`chatCore.ts`, +> RFC, jolla #6593 avattiin, ehdotti myös `bypassCompressionOnRateLimit`- +> lippua. Tämän repositorion `open-sse/services/compression/`-putki tekee +> lähtevän LLM-pyynnön kehotteen/kontekstin pakkausta (`chatCore.ts`, > `resolveCompressionSettings`/`selectCompressionStrategy`-lohkon ympärillä), -> eikä HTTP-vastauksen pakkausta muodostetuille 429-vastausrungoille — kirjaimellista ohitusasetusta vastaavaa -> koodipolkua ei ole. Tämä kehotteen pakkausvaihe suoritetaan lisäksi tällä hetkellä -> _ennen_ `withRateLimit()`-kutsua pyyntöputkessa, joten toimintojen uudelleenjärjestely sen ohittamiseksi -> jonon täyttymisestä johtuvan hylkäyksen yhteydessä on erillinen ja tätä ongelmaa laajempi -> muutos; sitä **ei** tarkoituksellisesti toteutettu tässä, vaan se jätettiin jatkotoimeksi, mikäli -> suorittimen käytön vähenemisestä saatava hyöty on uudelleenjärjestelyn riskin arvoinen. +> ei syntetisoitujen 429-vastausten HTTP-vastauspakkausta — kirjaimelliselle +> ohituslipulle ei ole vastaavaa koodipolkua. Tämä kehotteen pakkausvaihe +> suoritetaan myös tällä hetkellä _ennen_ `withRateLimit()`-kutsua +> pyyntöputkessa, joten sen järjestyksen muuttaminen siten, että vaihe +> ohitettaisiin jonon täyttymisestä johtuvan hylkäyksen yhteydessä, on tämän +> issuen laajuutta erillinen ja suurempi muutos; sitä **ei** tarkoituksella +> toteutettu tässä, vaan se jätettiin jatkotoimeksi siltä varalta, että +> suorittimen käytön säästö on järjestyksen muuttamiseen liittyvän riskin +> arvoinen. --- diff --git a/docs/i18n/fi/docs/architecture/admission-lanes.md b/docs/i18n/fi/docs/architecture/admission-lanes.md index d9dcb3c57bd6..5113b211653a 100644 --- a/docs/i18n/fi/docs/architecture/admission-lanes.md +++ b/docs/i18n/fi/docs/architecture/admission-lanes.md @@ -8,56 +8,52 @@ OmniRoutessa on **kaksi** prosessikohtaista kaistajärjestelmää, joilla on eri soveltamisalat. Ne täydentävät toisiaan; ylläpitäjien tulee tietää, kumpaa he tarkastelevat. -## 1. Tavutasoinen, koko prosessin kattava pääsynhallinta (`chatBodyAdmission.ts`) - -- **Soveltamisala:** puskuroidun rungon ja keon polku reiteille - `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` ja muille - chat-muotoisille reiteille. Suojaa suurten koodausagenttien pyyntörunkojen - aiheuttamalta keon käytön moninkertaistumiselta (#4380). -- **Yksi prosessinlaajuinen ohjain, ei avainkohtaisia kaistoja (#10110).** - Jokainen API-avain (hajautettuna) tai `anonymous`-istunto kilpailee - pääsystä **saman** jaetun budjetin puitteissa — hajautettua istuntotunnistetta - käytetään VAIN oikeudenmukaisen ajoituksen avaimena (odottajien vuorottainen - käsittely), ei koskaan kapasiteetin ositukseen. Tämän dokumentin aiemmassa - versiossa kuvattiin avainkohtaiset kaistat, joilla oli itsenäinen kapasiteetti; - tämä malli poistettiin muutoksessa #10110, koska sen avulla todentamattomat - väärennetyt tunnistetiedot saattoivat moninkertaistaa prosessinlaajuisen rajan. -- **Portti (#503-fanout): automaattisesti johdettu vastaanoton TAVUbudjetti, ei - kiinteä pyyntömäärä.** Vanha `CHAT_MAX_HEAVY_IN_FLIGHT`-pyyntömääräraja - (oletusarvo `1` ennen tätä korjausta) romahdutti koodausagenttien rinnakkaisen - hajautuksen (useita aliagentteja/CLI-työkaluja, pyyntörungot tavallisesti - > 256 KB) käytännössä noin yhden pyynnön rinnakkaisuuteen, mikä aiheutti - > 503-virheitä täysin normaalissa kuormituksessa. Se rajoittaa nyt vain silloin, - > kun ylläpitäjä asettaa nimenomaisesti muuttujan - > `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Kun sitä ei ole asetettu, pääsynhallintaa - > ohjaa sen sijaan `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — budjetti, joka johdetaan - > automaattisesti prosessin todellisesta muistirajasta - > (`src/shared/middleware/admissionBudget.ts`): 25 % pienemmästä V8-keon rajasta - > ja mahdollisesta cgroup-/säilörajasta, jaettuna kahdeksankertaisella - > tilapäisen moninkertaistumisen kertoimella ja rajattuna välille 8 MiB–2 GiB. - > Eksplisiittisiin ohituksiin sovelletaan samoja rajoja. Tämä skaalautuu - > itsestään 512 MB:n säilöstä 32 GB:n työpöytäkoneeseen ilman - > ympäristömuuttujien säätämistä. Pyyntörunko, joka ei mahdu efektiiviseen - > budjettiin, hylätään välittömästi virheellä `413 body_exceeds_budget`; - > rajattuun oikeudenmukaisuusjonoon päätyy vain kilpailu sellaisten - > pyyntörunkojen välillä, jotka voidaan käsitellä yksittäin. Reaaliaikainen, - > useita signaaleja käyttävä resurssipaineen seuranta (V8-keon käyttöaste, - > cgroup, PSI, OOM-tapahtumat — `open-sse/utils/resourcePressurePolicy.ts`) - > lyhentää rajattua odotusaikaa `high`-paineessa ja hylkää pyynnöt välittömästi - > virheellä `503 resource_pressure` `critical`-paineessa, ennen kuin yhtäkään - > tavua edes vastaanotetaan. +## 1. Tavutasoinen prosessinlaajuinen sisäänpääsyn hallinta (`chatBodyAdmission.ts`) + +- **Laajuus:** puskuroidun rungon / keon käsittelypolku reiteille `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` ja muille chat-muotoisille reiteille. Suojaa + suurten koodausagenttien pyyntörunkojen aiheuttamalta keon käytön moninkertaistumiselta (#4380). +- **Yksi prosessinlaajuinen ohjain, ei avainkohtaisia kaistoja (#10110).** Jokainen API-avain + (hajautettuna) tai `anonymous`-istunto hakee sisäänpääsyä **samasta** jaetusta budjetista — + hajautettua istuntotunnusta käytetään VAIN tasapuolisen ajoituksen avaimena (odottajien + vuorotteluperusteinen käsittely), ei koskaan kapasiteetin ositukseen. Tämän dokumentin + aiemmassa versiossa kuvattiin avainkohtaiset kaistat, joilla oli itsenäinen kapasiteetti; + kyseinen malli poistettiin muutoksessa #10110, koska se mahdollisti prosessinlaajuisen + rajan moninkertaistamisen todentamattomilla väärennetyillä tunnistetiedoilla. +- **Portti (#503-fanout): automaattisesti johdettu vastaanoton TAVUbudjetti, ei kiinteä pyyntömäärä.** + Vanha `CHAT_MAX_HEAVY_IN_FLIGHT`-pyyntömääräraja (oletusarvo `1` + ennen tätä korjausta) romahdutti koodausagenttien rinnakkaishaarauman (useita aliagentteja/CLI-työkaluja, + pyyntörungot tavallisesti > 256 KB) tosiasiallisesti noin yhden pyynnön rinnakkaisuuteen, mikä aiheutti + 503-virheitä täysin normaalilla kuormituksella. Se rajoittaa nyt vain silloin, kun operaattori asettaa + nimenomaisesti muuttujan `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Kun sitä ei ole asetettu, sisäänpääsyä + rajoittaa sen sijaan `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — budjetti, joka johdetaan automaattisesti + prosessin todellisesta muistirajasta (`src/shared/middleware/admissionBudget.ts`): + 25 % V8-keon rajan ja mahdollisen cgroup-/säiliörajan pienemmästä arvosta + jaettuna kahdeksankertaisella tilapäisen moninkertaistumisen kertoimella sekä rajattuna välille 8 MiB– + 2 GiB. Eksplisiittisiin ohituksiin sovelletaan samoja rajoja. Tämä skaalautuu automaattisesti + 512 MB:n säiliöstä 32 GB:n työpöytäkoneeseen ilman ympäristömuuttujien säätämistä. Pyyntörunko, joka ei + mahdu efektiiviseen budjettiin, hylätään välittömästi virheellä `413 body_exceeds_budget`; + vain yksittäin käsiteltävissä olevien pyyntörunkojen keskinäinen kilpailu päätyy rajattuun + tasapuolisuusjonoon. Reaaliaikainen, useita signaaleja hyödyntävä resurssipaineen seuranta (V8-keon suhde, + cgroup, PSI, OOM-tapahtumat — `open-sse/utils/resourcePressurePolicy.ts`) lyhentää + rajattua odotusaikaa `high`-paineessa ja hylkää pyynnön välittömästi virheellä + `503 resource_pressure` `critical`-paineessa jo ennen ensimmäisenkään tavun + vastaanottamista. PSI luetaan tämän yksikön cgroupin `memory.pressure`-tiedostosta, kun se on olemassa + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` kattaa + koko isäntäkoneen, ja sitä käytetään vain varavaihtoehtona fyysisellä palvelimella / cgroup v1:ssä, joten sivuttava + isäntäkone ei voi aiheuttaa 503-virhettä toimettomalle säiliölle. - **Säätäminen:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaattisesti johdetun tavubudjetin ohitus - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — vanha pyyntömääräraja, vain erikseen käyttöön otettuna + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — vanha pyyntömääräraja, käytössä vain erikseen valittaessa - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — jonotusaika ennen 503-virhettä (oletus 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — jonotettujen tavujen kekomuistiventtiili (oletus 4 MB) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — jonotettujen tavujen kekoventtiili (oletus 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — vanhentuneet - ja toiminnattomat muutoksesta #10110 lähtien (hyväksytään asetusten yhteensopivuuden vuoksi, mutta ohitetaan) -- **Raportointi:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — mukaan - lukien #503-fanout-lisäykset `inflightBytes`, `maxInflightBytes`, `budgetSource` + ja vaikutuksettomat muutoksesta #10110 lähtien (hyväksytään määritysten yhteensopivuuden vuoksi, mutta ohitetaan) +- **Raportointi:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — sisältää + #503-fanout-lisäykset `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` ja `countCapEnabled` - (oletuskäyttöönotossa false — vahvistaa, että todellisuudessa rajoittava tekijä - on tavubudjetti eikä vanha pyyntömääräraja). + (oletuskäyttöönotossa false — vahvistaa, että rajoittava tekijä on tavubudjetti eikä vanha + pyyntömääräraja). ## 2. Mukautuvat virtuaaliset ajonaikaiset kaistat (`open-sse/services/admission`) diff --git a/docs/i18n/fi/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/fi/docs/frameworks/EMBEDDED-SERVICES.md index caee3e7651a8..615f031f74dc 100644 --- a/docs/i18n/fi/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/fi/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Versio:** v3.8.44 -> **Viimeksi päivitetty:** 2026-07-03 -> **Kohderyhmä:** Insinöörit, jotka lisäävät, ylläpitävät tai korjaavat upotettuja palveluita (9Router, CLIProxyAPI, Mux, Bifrost). +> **Päivitetty viimeksi:** 2026-09-09 +> **Kohderyhmä:** Upotettuja palveluita (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) lisäävät, ylläpitävät tai vianmäärittävät kehittäjät. -Upotetut palvelut ovat paikallisesti asennettuja prosessin rinnalla toimivia työkaluja, jotka OmniRoute asentaa, joita se valvoo ja -jotka se tarjoaa ensiluokkaisina reitityskohteina. Toisin kuin ulkoiset palveluntarjoajat (joihin muodostetaan internetin kautta -yhteys API-avaimilla), upotetut palvelut toimivat samalla koneella kuin OmniRoute ja viestivät takaisinkytkentäverkon kautta. +Upotetut palvelut ovat paikallisesti asennettuja prosessien oheistyökaluja, jotka OmniRoute asentaa, valvoo ja +asettaa käytettäviksi ensisijaisina reitityskohteina. Toisin kuin ulkoisia palveluntarjoajia (joihin muodostetaan yhteys internetin kautta +API-avaimilla), upotetut palvelut suoritetaan samalla koneella kuin OmniRoute, ja ne viestivät takaisinkytkentärajapinnan kautta. --- @@ -29,35 +29,36 @@ yhteys API-avaimilla), upotetut palvelut toimivat samalla koneella kuin OmniRout ## 1. Yleiskatsaus -### Miksi upotettuja palveluita käytetään? +### Miksi upotettuja palveluita? -Upotettuja palveluita on viisi: +Kuusi palvelua on upotettu: -| Palvelu | npm-paketti | Oletusportti | Tarkoitus | -| --------------- | ----------------------------------- | :----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **9Router** | `9router` | 20130 | Tekoälyreititin, jota OmniRoute voi käyttää alipalveluntarjoajana. Mallit tarjotaan muodossa `9router/{sub}/{model}` | -| **CLIProxyAPI** | GitHub-julkaisubinaari (`cliproxy`) | 8317 | Paikallinen välityssovitin Anthropicin CLI-todennuskulkuihin. Tarjoaa varareitityksen OAuth-tunnisteiden vanhentuessa | -| **Mux** | `mux` (headless `mux server`) | 8322 | Paikallinen agenttien orkestrointitaustaprosessi (coder/mux). Vain elinkaaren hallinta — ei reitityskohde (ei LLM-välitystä). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-pohjainen tekoäly-yhdyskäytävän välitystaustajärjestelmä. Kun se on käynnissä, välitysreitti (`/v1/relay/`) valitsee sen automaattisesti | -| **Dario** | `@askalf/dario` | 3456 | Claude-tilausvälityspalvelin — vaihtoehto/varajärjestelmä CLIProxyAPI:lle Claude Code -muotoista liikennettä varten; lisätystä avaimesta tulee `DARIO_ADMIN_TOKEN`, joka suojaa sen `/admin/*`-OAuth-hallintatasoa | +| Palvelu | npm-paketti | Oletusportti | Tarkoitus | +| --------------- | -------------------------------------- | :----------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI-reititin, jota OmniRoute voi käyttää alipalveluntarjoajana. Mallit julkaistaan muodossa `9router/{sub}/{model}` | +| **CLIProxyAPI** | GitHub-julkaisubinaari (`cliproxy`) | 8317 | Paikallinen välityssovitin Anthropic CLI:n todennusprosesseille. Tarjoaa varareitityksen OAuth-tunnusten vanhentuessa | +| **Mux** | `mux` (käyttöliittymätön `mux server`) | 8322 | Paikallinen agenttien orkestrointitaustapalvelu (coder/mux). Vain elinkaaren hallinta — ei reitityskohde (ei LLM-välitystä). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-pohjaisen AI-yhdyskäytävän välitystaustajärjestelmä. Käynnissä ollessaan välitysreitti (`/v1/relay/`) valitsee sen automaattisesti | +| **Dario** | `@askalf/dario` | 3456 | Claude-tilauksen välityspalvelin — vaihtoehto/varajärjestelmä CLIProxyAPI:lle Claude Code -muotoista liikennettä varten; syötettävästä avaimesta tulee `DARIO_ADMIN_TOKEN`, joka suojaa sen `/admin/*`-OAuth-hallintatasoa | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web -automaatio (käyttöliittymätön Chromium Puppeteerin kautta). Vain elinkaaren hallinta — ei reitityskohde. | -Kaikki viisi noudattavat samaa valvontamallia: +Kaikki kuusi noudattavat samaa valvontamallia: - OmniRoute asentaa ne hakemistoon `DATA_DIR/services/{name}/` (erillään OmniRouten omasta `package.json`-tiedostosta) - OmniRoute käynnistää ne aliprosesseina ja valvoo niitä -- OmniRoute lisää lyhytikäisen API-avaimen aliprosessin ympäristöön ja vaihtaa sen ilman käyttökatkoa (soveltuvissa tapauksissa) -- Kaikki hallintareitit (`/api/services/*`) ovat **LOCAL_ONLY** — niitä voi käyttää vain takaisinkytkentäverkon kautta (ehdoton sääntö #17) +- OmniRoute syöttää lyhytikäisen API-avaimen aliprosessin ympäristöön ja kierrättää sen ilman käyttökatkoa (soveltuvin osin) +- Kaikki hallintareitit (`/api/services/*`) ovat **LOCAL_ONLY** — käytettävissä vain loopback-osoitteesta (ehdoton sääntö #17) -### Keskeiset päätökset (suunnitelmasta) +### Keskeiset päätökset (suunnittelusuunnitelmasta) -| Päätös | Arvo | -| ------------------------------------------------------- | --------------------------------------------------------------------------------------- | -| Hallintapaneelin pääsy 9Routerin omaan käyttöliittymään | Käänteinen välityspalvelin osoitteessa `/dashboard/providers/services/9router/embed/*` | -| Asennusmekanismi | `npm install {package}` komennolla `execFile` (ei komentotulkin interpolointia) | -| Käyttötapa | Palveluntarjoaja rekisteröidään reititysmoottoriin muodossa `9router/{sub}/{model}` | -| API-avainten hallinta | OmniRoute luo avaimen, salaa sen levossa (AES-256-GCM) ja lisää sen ympäristömuuttujana | -| Sijainti hallintapaneelissa | `/dashboard/providers/services` (kolme välilehteä) | -| Automaattinen käynnistys | Palvelukohtainen valitsin, oletuksena POIS | +| Päätös | Arvo | +| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| Hallintapaneelin pääsy 9Routerin omaan käyttöliittymään | Käänteinen välityspalvelin osoitteessa `/dashboard/providers/services/9router/embed/*` | +| Asennusmekanismi | `npm install {package}` komennolla `execFile` (ei komentotulkin interpolointia) | +| Käyttötapa | Palveluntarjoaja rekisteröidään reititysmoottoriin muodossa `9router/{sub}/{model}` | +| API-avainten hallinta | OmniRoute luo avaimen, salaa sen levossa (AES-256-GCM) ja syöttää sen ympäristömuuttujan kautta | +| Hallintapaneelin sijainti | `/dashboard/providers/services` (kolme välilehteä) | +| Automaattinen käynnistys | Palvelukohtainen valitsin, oletusarvoisesti POIS PÄÄLTÄ | --- @@ -70,7 +71,7 @@ Kaikki viisi noudattavat samaa valvontamallia: │ Reaaliaikaiset lokit (SSE), käynnistys/pysäytys/uudelleenkäynnistys/päivitys, asetukset, asennus│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Runko + välilehtien reititys parametrilla ?tab=│ +│ ├── page.tsx Kehys + välilehtireititys parametrilla ?tab=│ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -96,64 +97,65 @@ Kaikki viisi noudattavat samaa valvontamallia: ┌──────────────────────▼─────────────────────────────────────────────┐ │ Kerros 3 — ServiceSupervisor (src/lib/services/) │ │ │ -│ ServiceSupervisor.ts Yleinen valvoja (child_process.spawn) │ +│ ServiceSupervisor.ts Yleiskäyttöinen valvoja (child_process.spawn)│ │ ├── asennus: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── käynnistys: spawn(node, [entrypoint], {env, cwd}) │ │ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── portti: 20130 9Routerille (määritettävissä) │ -│ ├── lokit: stdio-rengaspuskuri 5 Mt → SSE-tapahtumat │ +│ ├── lokit: stdio-rengaspuskuri 5 MB → SSE-tapahtumat │ │ ├── kunto: HTTP GET /health 2–5 s välein, laiska palautuminen│ │ └── elinkaari: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts Alustaa kaikki SERVICES[] prosessin käynnistyessä│ +│ bootstrap.ts Alustaa kaikki SERVICES[]-palvelut prosessin käynnistyessä│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Säännöllinen GET /v1/models → service_models-taulu│ -│ ringBuffer.ts Kiertävä lokipuskuri (5 Mt palvelua kohden) │ +│ ringBuffer.ts Pyöreä lokipuskuri (5 MB palvelua kohden) │ │ healthCheck.ts Kyselyihin perustuva HTTP-kuntotarkistus │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (asennussovittimet) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-yhteensopiva HTTP (takaisinkytkentä) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Kerros 4 — Tarjoaja / reititys │ +│ Kerros 4 — Palveluntarjoaja / reititys │ │ │ │ open-sse/executors/ninerouter.ts │ │ Hakee portin ja API-avaimen uudelleen jokaiselle pyynnölle (ei välimuistia).│ -│ Poistaa "9router/"-etuliitteen mallitunnuksesta ennen välitystä. │ +│ Poistaa mallin tunnuksen "9router/"-etuliitteen ennen välitystä.│ │ Palauttaa 503 service_not_running, jos valvoja ei ole "running"-tilassa.│ │ │ │ src/shared/constants/providers.ts │ -│ Kohteen "9router" määritys: isEmbeddedService: true │ +│ Kohteen "9router" määritys: isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ Mallit tallennetaan muodossa "9router/{sub}/{model}" (etuliitteellä).│ │ modelSync.ts synkronoi ne 5 minuutin välein. │ │ │ -│ VAIN Muxin elinkaarta hallitaan (kerrokset 1–3) — se on agenttien │ -│ orkestrointitaustapalvelu, ei LLM-välityspalvelin, joten sillä ei │ -│ ole kerroksen 4 suoritin-/tarjoajamääritystä eikä se ole koskaan │ -│ reitityksen kohde. │ +│ Muxissa hallitaan VAIN elinkaarta (kerrokset 1–3) — se on agenttien│ +│ orkestrointipalvelu, ei LLM-välityspalvelin, joten sillä ei ole │ +│ kerroksen 4 suoritin-/palveluntarjoajamääritystä eikä se koskaan │ +│ ole reitityskohde. │ └────────────────────────────────────────────────────────────────────┘ ``` -### Keskeiset lähdetiedostot +### Keskeiset lähdekooditiedostot | Tiedosto | Rooli | | ------------------------------------------- | ------------------------------------------------------- | | `src/lib/services/ServiceSupervisor.ts` | Ydinluokka: elinkaari, lukitus, kunto, rengaspuskuri | | `src/lib/services/bootstrap.ts` | Prosessitason rekisteröinti ja automaattinen käynnistys | | `src/lib/services/registry.ts` | Singleton-kartta `työkalu → valvoja` | -| `src/lib/services/apiKey.ts` | Avaimen luonti, AES-256-GCM-salaus levossa | -| `src/lib/services/modelSync.ts` | Säännöllinen mallien synkronointi (5 min) + pyynnöstä | -| `src/lib/services/ringBuffer.ts` | 5 Mt:n kiertävä lokipuskuri SSE-tilauksella | +| `src/lib/services/apiKey.ts` | Avainten luonti, AES-256-GCM-salaus levossa | +| `src/lib/services/modelSync.ts` | Mallien säännöllinen synkronointi (5 min) + pyynnöstä | +| `src/lib/services/ringBuffer.ts` | 5 Mt:n rengaslokipuskuri SSE-tilauksella | | `src/lib/services/healthCheck.ts` | HTTP-kuntotarkistus (määritettävä aikaväli) | -| `src/lib/services/installers/ninerouter.ts` | npm-asennus/-päivitys/-poisto 9Routerille | -| `src/lib/services/installers/cliproxy.ts` | npm-asennus/-päivitys/-poisto CLIProxyAPI:lle | -| `src/lib/services/installers/mux.ts` | npm-asennus/-päivitys/-poisto Muxille | +| `src/lib/services/installers/ninerouter.ts` | 9Routerin npm-asennus, -päivitys ja -poisto | +| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI:n npm-asennus, -päivitys ja -poisto | +| `src/lib/services/installers/mux.ts` | Muxin npm-asennus, -päivitys ja -poisto | +| `src/lib/services/installers/openwa.ts` | open-wa:n npm-asennus, -päivitys ja -poisto | | `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()`-apufunktio | | `src/app/api/services/[name]/logs/route.ts` | Jaettu SSE-lokien päätepiste | -| `open-sse/executors/ninerouter.ts` | Palveluntarjoajan suorittaja (taso 4) | +| `open-sse/executors/ninerouter.ts` | Palveluntarjoajan suorittaja (kerros 4) | --- @@ -210,14 +212,14 @@ kilpailutilanteet esimerkiksi silloin, kun automaattinen käynnistys ja käyttö ## 4. API-viite Kaikki `/api/services/`-polun alla olevat reitit ovat **LOCAL_ONLY** (vain loopback, ehdoton sääntö #17). -Muut kuin loopback-pyynnöt saavat vastauksen `403 LOCAL_ONLY` todennustunnuksesta riippumatta. +Muusta kuin loopback-osoitteesta tulevat pyynnöt saavat vastauksen `403 LOCAL_ONLY` todennustunnuksesta riippumatta. ### 4.1 9Router-päätepisteet (11 reittiä) #### `POST /api/services/9router/install` -Asentaa 9Routerin npm:stä. Luo hakemiston `DATA_DIR/services/9router/`, jolla on omat -`package.json`- ja `node_modules/`-kohteensa. Ei aiheuta ristiriitoja OmniRouten omien riippuvuuksien kanssa. +Asentaa 9Routerin npm:stä. Luo hakemiston `DATA_DIR/services/9router/`, jossa ovat sen omat +`package.json` ja `node_modules/`. Ei aiheuta ristiriitoja OmniRouten omien riippuvuuksien kanssa. **Pyynnön runko** (kaikki valinnaisia): @@ -227,7 +229,7 @@ Asentaa 9Routerin npm:stä. Luo hakemiston `DATA_DIR/services/9router/`, jolla o | Kenttä | Tyyppi | Oletusarvo | Kuvaus | | --------- | -------- | ---------- | ----------------------------------------- | -| `version` | `string` | `"latest"` | asennettava npm-versiotunniste tai semver | +| `version` | `string` | `"latest"` | Asennettava npm-versiotunniste tai semver | **Vastaukset:** @@ -246,9 +248,9 @@ EACCES-virheet esitetään käyttäjäystävällisinä viesteinä. #### `POST /api/services/9router/start` Käynnistää 9Routerin. Rekisteröi valvojan, jos sitä ei ole vielä rekisteröity, ja kutsuu sitten -`supervisor.start()`. Idempotentti, kun palvelu on jo käynnissä. +metodia `supervisor.start()`. Idempotentti, jos palvelu on jo käynnissä. -**Pyynnön runko:** ei mitään +**Pyynnön runko:** ei ole **Vastaukset:** @@ -276,34 +278,34 @@ Käynnistää 9Routerin. Rekisteröi valvojan, jos sitä ei ole vielä rekister #### `POST /api/services/9router/stop` -Pysäyttää 9Routerin hallitusti. Lähettää SIGTERM-signaalin, odottaa 15 s ja lähettää sitten SIGKILL-signaalin, -jos prosessi on yhä käynnissä. Idempotentti, kun palvelu on jo pysäytetty. +Pysäyttää 9Routerin hallitusti. Lähettää SIGTERM-signaalin, odottaa 15 s ja lähettää sitten SIGKILL-signaalin, jos prosessi on yhä käynnissä. +Idempotentti, jos palvelu on jo pysäytetty. -**Pyynnön runko:** ei mitään +**Pyynnön runko:** ei ole **Vastaukset:** -| Tila | Kuvaus | -| ----- | ------------------------------------- | -| `200` | `ServiceStatus` (tila: "stopped") | -| `503` | Pysäytys epäonnistui odottamattomasti | +| Tila | Kuvaus | +| ----- | ------------------------------------ | +| `200` | `ServiceStatus` (`state: "stopped"`) | +| `503` | Pysäytys epäonnistui odottamatta | --- #### `POST /api/services/9router/restart` -Vastaa `stop()`-kutsua ja sen jälkeen `start()`-kutsua toimintolukon alaisuudessa. +Vastaa kutsua `stop()` ja sen jälkeen `start()` toimintolukon alaisena. -**Pyynnön runko:** ei mitään +**Pyynnön runko:** ei ole -**Vastaukset:** samat kuin `start`-toiminnolla (palauttaa lopullisen `ServiceStatus`-objektin). +**Vastaukset:** samat kuin `start`-päätepisteellä (palauttaa lopullisen `ServiceStatus`-objektin). --- #### `POST /api/services/9router/update` Päivittää 9Routerin uudempaan npm-versioon. Jos palvelu on käynnissä, se pysäytetään -ensin, npm-asennus suoritetaan (uudempi versio asennetaan nykyiseen sijaintiin) ja sitten +ensin, npm-asennus suoritetaan (uudempi versio asennetaan nykyiseen sijaintiin), minkä jälkeen palvelu käynnistetään uudelleen. **Pyynnön runko** (kaikki valinnaisia): @@ -324,11 +326,11 @@ palvelu käynnistetään uudelleen. #### `POST /api/services/9router/rotate-key` -Luo uuden API-avaimen 9Routerille, salaa sen levossa ja käynnistää palvelun -uudelleen (jos se on käynnissä), jotta uusi avain otetaan käyttöön ympäristöstä. -Vanha avain mitätöidään välittömästi. +Luo 9Routerille uuden API-avaimen, salaa sen levossa ja käynnistää palvelun uudelleen +(jos se on käynnissä), jotta uusi avain ladataan ympäristöstä. Vanha avain +mitätöidään välittömästi. -**Pyynnön runko:** ei mitään +**Pyynnön runko:** ei ole **Vastaukset:** @@ -337,15 +339,14 @@ Vanha avain mitätöidään välittömästi. | `200` | `{ keyRotated: true, restarted: boolean }` | | `500` | Avaimen vaihto epäonnistui | -**Tietoturva:** Uutta avainta ei koskaan palauteta vastauksessa (tunnistetietoja ei -vuoda). Se tallennetaan salattuna (AES-256-GCM) `version_manager`-tauluun. +**Tietoturva:** Uutta avainta ei koskaan palauteta vastauksessa (tunnistetietoja ei vuoda). +Se tallennetaan salattuna (AES-256-GCM) `version_manager`-tauluun. --- #### `GET /api/services/9router/status` -Palauttaa yhdistetyn reaaliaikaisen ja tietokantaan tallennetun tilan, joka sisältää -versioiden metatiedot ja API-avaimen esikatselun. +Palauttaa yhdistetyn reaaliaikaisen ja tietokantaan tallennetun tilan, mukaan lukien version metatiedot ja API-avaimen esikatselun. **Vastaukset:** @@ -378,9 +379,8 @@ versioiden metatiedot ja API-avaimen esikatselun. #### `POST /api/services/9router/auto-start` -Vaihtaa automaattisen käynnistyksen asetusta. Kun `enabled: true`, palvelu -käynnistyy automaattisesti seuraavan kerran, kun OmniRoute käynnistyy (jos palvelu -on asennettu). +Ottaa automaattisen käynnistyksen käyttöön tai poistaa sen käytöstä. Kun `enabled: true`, palvelu käynnistyy automaattisesti +seuraavan kerran, kun OmniRoute käynnistyy (jos palvelu on asennettu). **Pyynnön runko:** @@ -390,32 +390,31 @@ on asennettu). **Vastaukset:** -| Tila | Kuvaus | -| ----- | -------------------------- | -| `200` | `{ autoStart: true }` | -| `400` | Virheellinen pyynnön runko | +| Tila | Kuvaus | +| ----- | --------------------- | +| `200` | `{ autoStart: true }` | +| `400` | Virheellinen runko | --- #### `GET /api/services/9router/logs` -9Routerin stdout/stderr-rengaspuskurista saatavien reaaliaikaisten lokien -SSE-virta. +Reaaliaikainen SSE-lokivirta 9Routerin stdout/stderr-rengaspuskurista. **Kyselyparametrit:** -| Parametri | Tyyppi | Oletus | Kuvaus | -| --------- | --------- | ------ | -------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Ensin lähetettävien historiallisten rivien määrä (enint. 1000) | -| `filter` | `string` | ei ole | Kirjainkoosta riippumaton osamerkkijonosuodatin (ei regexiä — ReDoS-turvallinen) | +| Parametri | Tyyppi | Oletusarvo | Kuvaus | +| --------- | --------- | ---------- | ----------------------------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Ensin lähetettävien historiallisten rivien määrä (enintään 1000) | +| `filter` | `string` | ei ole | Kirjainkoosta riippumaton alimerkkijonosuodatin (ei regex-lausekkeita — suojattu ReDoS-hyökkäyksiltä) | **SSE-tapahtumat:** -| Tapahtuma | Data | Kuvaus | -| ----------- | ----------- | --------------------------------- | -| `snapshot` | `LogLine[]` | Alustava historiallinen loppuosa | -| `log` | `LogLine` | Reaaliaikainen lokirivi | -| `heartbeat` | `{}` | Ylläpitoviesti 15 sekunnin välein | +| Tapahtuma | Data | Kuvaus | +| ----------- | ----------- | ------------------------------ | +| `snapshot` | `LogLine[]` | Historiallisten rivien alkuosa | +| `log` | `LogLine` | Reaaliaikainen lokirivi | +| `heartbeat` | `{}` | Yhteyden ylläpito 15 s välein | **LogLine-skeema:** @@ -429,64 +428,61 @@ SSE-virta. **Vastaukset:** -| Tila | Kuvaus | -| ----- | ------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | `filter`-parametri on liian pitkä (> 200 merkkiä) | -| `404` | Palvelua ei löydy (valvojaa ei ole rekisteröity) | +| Tila | Kuvaus | +| ----- | --------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | `filter`-parametri on liian pitkä (> 200 merkkiä) | +| `404` | Palvelua ei löytynyt (valvojaa ei ole rekisteröity) | --- ### 4.2 CLIProxyAPI-päätepisteet (10 reittiä) -CLIProxyAPIlla on sama päätepisterakenne kuin 9Routerilla ilman `rotate-key`-reittiä -sekä lisäksi `accounts`-, `provider-expose`- ja `auto-restart-adopted`-reitit. Se -vastaanottaa nyt erillisen datatason API-avaimen, joka injektoidaan prosessin -käynnistyksen yhteydessä (`needsApiKey: true` tiedostossa `bootstrap.ts` ja jota -käytetään mallien synkronointiin); `status` sisältää vähemmän kenttiä. - -| Menetelmä | Polku | Kuvaus | -| --------- | ----------------------------------- | ------------------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Asenna CLIProxyAPI npm:stä | -| `POST` | `/api/services/cliproxy/start` | Käynnistä CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Pysäytä CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Käynnistä CLIProxyAPI uudelleen | -| `POST` | `/api/services/cliproxy/update` | Päivitä uudempaan versioon | -| `GET` | `/api/services/cliproxy/status` | Reaaliaikainen + tietokannan tila (ei `apiKeyMasked`-kenttää) | -| `POST` | `/api/services/cliproxy/auto-start` | Vaihda automaattisen käynnistyksen asetusta | +CLIProxyAPI käyttää samaa päätepisterakennetta kuin 9Router, mutta ilman `rotate-key`-reittiä sekä lisäyksillä +`accounts`, `provider-expose` ja `auto-restart-adopted`. Se saa nyt +oman käynnistyksen yhteydessä injektoitavan datatason API-avaimen (`needsApiKey: true` +tiedostossa `bootstrap.ts`, käytetään mallien synkronointiin); `status` sisältää vähemmän kenttiä. + +| Menetelmä | Polku | Kuvaus | +| --------- | ----------------------------------- | ------------------------------------------------------------------ | +| `POST` | `/api/services/cliproxy/install` | Asenna CLIProxyAPI npm:stä | +| `POST` | `/api/services/cliproxy/start` | Käynnistä CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Pysäytä CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Käynnistä CLIProxyAPI uudelleen | +| `POST` | `/api/services/cliproxy/update` | Päivitä uudempaan versioon | +| `GET` | `/api/services/cliproxy/status` | Reaaliaikainen tila + tietokannan tila (ei `apiKeyMasked`-kenttää) | +| `POST` | `/api/services/cliproxy/auto-start` | Ota automaattinen käynnistys käyttöön tai poista se käytöstä | Jaettu `GET /api/services/{name}/logs`-päätepiste (katso §4.1) toimii kaikille -neljälle palvelulle käyttämällä dynaamista `[name]`-segmenttiä. +neljälle palvelulle dynaamisen `[name]`-segmentin avulla. --- ### 4.3 Mux-päätepisteet (8 reittiä) -Muxilla on sama päätepisterakenne kuin CLIProxyAPIlla — API-pinnassa ei ole -`rotate-key`-reittiä (bearer-token luodaan samalla tavalla kuin 9Routerin token -funktion `getOrCreateApiKey("mux")` avulla ja injektoidaan `MUX_SERVER_AUTH_TOKEN` --ympäristömuuttujan kautta, mutta sille ei vielä ole erillistä vaihtopäätepistettä). -Muxissa hallitaan vain elinkaarta: toisin kuin 9Routerissa, siinä ei ole tason 4 -suoritinta, eikä sitä koskaan rekisteröidä reitityspalveluntarjoajaksi. +Mux käyttää samaa päätepisterakennetta kuin CLIProxyAPI — API-rajapinnassa ei ole +`rotate-key`-reittiä (haltijatunnus luodaan samalla tavalla kuin 9Routerissa +`getOrCreateApiKey("mux")`-funktion avulla ja injektoidaan `MUX_SERVER_AUTH_TOKEN`-ympäristömuuttujan kautta, mutta +sille ei vielä ole erillistä kierrätyspäätepistettä). Muxille hallitaan vain elinkaarta: toisin kuin +9Routerilla, sillä ei ole kerroksen 4 suorittajaa, eikä sitä koskaan rekisteröidä reitityspalveluntarjoajaksi. -| Menetelmä | Polku | Kuvaus | -| --------- | ------------------------------ | ------------------------------------------- | -| `POST` | `/api/services/mux/install` | Asenna Mux npm:stä (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Käynnistä Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Pysäytä Mux | -| `POST` | `/api/services/mux/restart` | Käynnistä Mux uudelleen | -| `POST` | `/api/services/mux/update` | Päivitä uudempaan npm-versioon | -| `GET` | `/api/services/mux/status` | Reaaliaikainen + tietokannan tila | -| `POST` | `/api/services/mux/auto-start` | Vaihda automaattisen käynnistyksen asetusta | +| Menetelmä | Polku | Kuvaus | +| --------- | ------------------------------ | ------------------------------------------------------------ | +| `POST` | `/api/services/mux/install` | Asenna Mux npm:stä (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Käynnistä Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Pysäytä Mux | +| `POST` | `/api/services/mux/restart` | Käynnistä Mux uudelleen | +| `POST` | `/api/services/mux/update` | Päivitä uudempaan npm-versioon | +| `GET` | `/api/services/mux/status` | Reaaliaikainen tila + tietokannan tila | +| `POST` | `/api/services/mux/auto-start` | Ota automaattinen käynnistys käyttöön tai poista se käytöstä | --- ### 4.4 Bifrost-päätepisteet (8 reittiä) -Bifrost on Go-pohjainen tekoäly-yhdyskäytävän välitystaustajärjestelmä -(`@maximhq/bifrost`). Se käyttää samaa päätepisterakennetta kuin CLIProxyAPI (ei -`rotate-key`-reittiä — Bifrost hallitsee omia palveluntarjoaja-avaimiaan -`config.json`-tiedostossa oman `-app-dir`-hakemistonsa alla). +Bifrost on Go-pohjainen tekoäly-yhdyskäytävän välitystaustapalvelu (`@maximhq/bifrost`). Se käyttää samaa +päätepisterakennetta kuin CLIProxyAPI (ei `rotate-key`-reittiä — Bifrost hallitsee omia palveluntarjoaja- +avaimiaan `config.json`-tiedostossa `-app-dir`-hakemistossaan). | Menetelmä | Polku | Kuvaus | | --------- | ---------------------------------- | ------------------------------------------------------------------ | @@ -496,26 +492,61 @@ Bifrost on Go-pohjainen tekoäly-yhdyskäytävän välitystaustajärjestelmä | `POST` | `/api/services/bifrost/restart` | Käynnistä Bifrost uudelleen | | `POST` | `/api/services/bifrost/update` | Päivitä uudempaan versioon | | `GET` | `/api/services/bifrost/status` | Reaaliaikainen tila + tietokannan tila | -| `POST` | `/api/services/bifrost/auto-start` | Ota automaattinen käynnistys käyttöön tai pois käytöstä | +| `POST` | `/api/services/bifrost/auto-start` | Ota automaattinen käynnistys käyttöön tai poista se käytöstä | | `GET` | `/api/services/bifrost/logs` | SSE-lokin loppuosa (jaetun dynaamisen `[name]/logs`-reitin kautta) | **Reitityksen kytkentä:** Kun `BIFROST_BASE_URL`-muuttujaa ei ole asetettu ja valvottu Bifrost- instanssi on käynnissä, `getBifrostRoutingConfig()` (tiedostossa `routingBackend.ts`) käyttää automaattisesti -osoitetta `http://127.0.0.1:{port}` välityspalvelun perus-URL-osoitteena. Eksplisiittisesti asetettu `BIFROST_BASE_URL`-ympäristömuuttuja +osoitetta `http://127.0.0.1:{port}` välityspalvelun perus-URL-osoitteena. Eksplisiittisesti määritetty `BIFROST_BASE_URL`-ympäristömuuttuja on aina etusijalla. --- ### 4.5 Dario-päätepisteet (12 reittiä) -Sama elinkaarirakenne kuin muissa palveluissa (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`) sekä tunnisteella suojattu OAuth- +Sama elinkaarirakenne kuin muilla palveluilla (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`) sekä tunnuksella suojattu OAuth- hallintataso polun `admin/` alla: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (kaikki suojattu `DARIO_ADMIN_TOKEN`-tunnisteella). - -### 4.6 Käänteinen välityspalvelin (9Router-hallintapaneelin upotus) - -Hallintapaneeli upottaa 9Router-verkkokäyttöliittymän iframe-elementtiin sisäisen käänteisen +`admin/login-start`, `admin/login-complete` (kaikki suojattu `DARIO_ADMIN_TOKEN`-muuttujalla). + +### 4.6 open-wa-päätepisteet (7 reittiä) + +open-wa (`@open-wa/wa-automate`) ohjaa selaimen käyttöliittymätöntä Chromium-instanssia +(Puppeteerin kautta) WhatsApp Webin automatisoimiseksi. Se käyttää samaa päätepisterakennetta kuin Mux (ei +vielä `rotate-key`-reittiä). Sille hallitaan vain elinkaarta — se ei ole reitityskohde, +eikä sillä ole kerroksen 4 suorittaja-/palveluntarjoajamerkintää. + +| Menetelmä | Polku | Kuvaus | +| --------- | --------------------------------- | ------------------------------------------------------------------ | +| `POST` | `/api/services/openwa/install` | Asenna open-wa npm:stä (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Käynnistä open-wa portissa 8323 (oletus) | +| `POST` | `/api/services/openwa/stop` | Pysäytä open-wa | +| `POST` | `/api/services/openwa/restart` | Käynnistä open-wa uudelleen | +| `POST` | `/api/services/openwa/update` | Päivitä uudempaan versioon | +| `GET` | `/api/services/openwa/status` | Reaaliaikainen tila + tietokannan tila | +| `POST` | `/api/services/openwa/auto-start` | Ota automaattinen käynnistys käyttöön tai pois käytöstä | +| `GET` | `/api/services/openwa/logs` | SSE-lokin loppuosa (jaetun dynaamisen `[name]/logs`-reitin kautta) | + +**API-avain:** lisätään muuttujana `WA_KEY` — open-wa:n yleinen `WA_*`-etuliitteisten +ympäristömuuttujien ohitus yhdistää sen CLI-valintaan `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, vahvistettu asennettua 4.76.0-versiota +vasten). Etuliitteeksi lisätään `ow_`, kun avain luodaan funktiolla `generateServiceApiKey()`. open-wa +lukee avaimen HTTP-otsakkeesta `key`/`api_key` (ei otsakkeesta `Authorization: +Bearer`); `/api-docs*` on nimenomaisesti vapautettu tarkistuksesta +(`setupAuthenticationLayer` tiedostossa `dist/cli/server.js`), joten kuntotarkistus +ei tarvitse todennusotsaketta. + +**Pariliitos:** open-wa on epävirallinen eikä liity WhatsAppiin — yhdistettyyn +numeroon kohdistuu estoriski WhatsAppin oman automaation tunnistuksen vuoksi. +Ensimmäisellä käynnistyskerralla pariliitoksen QR-koodi tulostetaan vakiotulosteeseen ja tuodaan näkyviin +olemassa olevan Lokit-paneelin/SSE-virran kautta — tässä integraatiossa ei vielä ole erillistä +QR-kuvan päätepistettä. + +--- + +### 4.7 Käänteinen välityspalvelin (9Router-koontinäyttöupotus) + +Koontinäyttö upottaa 9Router-verkkokäyttöliittymän iframe-kehykseen sisäisen käänteisen välityspalvelimen kautta osoitteessa: ``` @@ -524,17 +555,17 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Tämä välityspalvelin: -- Välittää pyynnön osoitteeseen `http://127.0.0.1:{port}/{path}` (vain loopback) -- Poistaa saapuvat `cookie`- ja `authorization`-otsakkeet (OmniRoute-istunnon tietoja ei vuoda) +- Välittää pyynnön osoitteeseen `http://127.0.0.1:{port}/{path}` (vain silmukkaliitäntä) +- Poistaa saapuvat `cookie`- ja `authorization`-otsakkeet (OmniRoute-istunto ei vuoda) - Lisää 9Router-todennusta varten otsakkeen `Authorization: Bearer {apiKey}` - Poistaa vastauksesta otsakkeet `set-cookie`, `content-security-policy`, `x-frame-options` ja `cross-origin-*` -- Muokkaa HTML-vastauksia lisäämällä ``-elementin ja normalisoimalla absoluuttiset polut (`/foo` → `/dashboard/.../embed/foo`) +- Kirjoittaa HTML-vastaukset uudelleen lisäämällä ``-elementin ja normalisoimalla absoluuttiset polut (`/foo` → `/dashboard/.../embed/foo`) -Upotetun hallintapaneelin WebSocket-päivitykset käsittelee erillinen oheispalvelin omassa -portissaan (katso `src/lib/services/embedWsProxy.ts`). +Upotetun koontinäytön WebSocket-päivitykset käsittelee erillisessä +portissa toimiva rinnakkaispalvelin (katso `src/lib/services/embedWsProxy.ts`). -**Tietoturva:** Upotuksen välityspalvelinreitit on luokiteltu `LOCAL_ONLY_API_PREFIXES`-ryhmään, -ja niitä voi käyttää vain loopback-yhteyden kautta. Hyökkääjä, joka saa JWT:n +**Tietoturva:** Upotuksen välityspalvelinreitit luokitellaan muuttujassa `LOCAL_ONLY_API_PREFIXES`, +ja niitä voidaan käyttää vain silmukkaliitännästä. Hyökkääjä, joka saa JWT:n Cloudflare-/Ngrok-tunnelin kautta, ei voi käyttää upotettuja palveluita välityspalvelimen kautta. --- diff --git a/docs/i18n/fi/docs/frameworks/MEMORY.md b/docs/i18n/fi/docs/frameworks/MEMORY.md index 9266bcae81fb..2bfe64126223 100644 --- a/docs/i18n/fi/docs/frameworks/MEMORY.md +++ b/docs/i18n/fi/docs/frameworks/MEMORY.md @@ -169,32 +169,34 @@ pyyntöä kohden. Edistymistä voidaan seurata kyselyllä ## Asetusten laajennus -Yhdeksän upotus- ja vektorikenttää ovat käytettävissä `MemorySettingsExtended`-tyypissä tiedostossa +`MemorySettingsExtended` sisältää yhdeksän upotus- ja vektorikenttää tiedostossa `src/shared/schemas/memory.ts`, ja ne tallennetaan tiedoston `src/lib/db/settings.ts` kautta: -| Kenttä | Tyyppi | Oletus | Kuvaus | -| ------------------------ | -------------------------------------------------- | -------- | ---------------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Käytettävä upotuslähde | -| `embeddingProviderModel` | `string \| null` | `null` | Palveluntarjoaja/malli muodossa `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | Vain Memorylle tarkoitettu OpenAI-yhteensopivan päätepisteen perus-URL | -| `customModelId` | `string \| null` | `null` | Mukautettuun päätepisteeseen lähetettävä mallitunnus | -| `transformersEnabled` | `boolean` | `false` | Transformers.js:n käyttöönotto (MiniLM, ~400 Mt) | -| `staticEnabled` | `boolean` | `false` | Paikallisen staattisen potion-base-8M-mallin käyttöönotto | -| `rerankEnabled` | `boolean` | `false` | Ota uudelleenjärjestelyvaihe käyttöön (lisää +200–500 ms/pyyntö) | -| `rerankProviderModel` | `string \| null` | `null` | Uudelleenjärjestelyn palveluntarjoaja/malli muodossa `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Käytettävä vektoritaustajärjestelmä | +| Kenttä | Tyyppi | Oletusarvo | Kuvaus | +| ------------------------ | -------------------------------------------------- | ---------- | --------------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Käytettävä upotuslähde | +| `embeddingProviderModel` | `string \| null` | `null` | Palveluntarjoaja/malli muodossa `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | Vain Memoryn käyttämän OpenAI-yhteensopivan päätepisteen perus-URL | +| `customModelId` | `string \| null` | `null` | Mukautettuun päätepisteeseen lähetettävä mallitunnus | +| `transformersEnabled` | `boolean` | `false` | Transformers.js:n käyttöönotto (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Paikallisen staattisen potion-base-8M-mallin käyttöönotto | +| `rerankEnabled` | `boolean` | `false` | Ota uudelleenjärjestelyvaihe käyttöön (lisää +200-500ms/pyyntö) | +| `rerankProviderModel` | `string \| null` | `null` | Uudelleenjärjestelyn palveluntarjoaja/malli muodossa `provider/model` | + +`rerankProviderModel` ratkaistaan kutsulla `POST /v1/rerank` (joka tehdään takaisinkytkentäyhteyden kautta), joten se hyväksyy kaiken, minkä kyseinen reitti hyväksyy: kuratoidun pilvipohjaisen uudelleenjärjestelymallin (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) tai OpenAI-yhteensopivan palveluntarjoajasolmun muodossa `/` (esim. `skilled-mini/bge-reranker-v2-m3` TEI/Infinity-palvelimelle). Takaisinkytkentäsolmut ovat aina kelvollisia; toisella isäntäkoneella (LAN, Tailscale) sijaitseva solmu edellyttää lisäksi `RERANK_REMOTE_PROVIDER_NODES`-ominaisuuslippua, ja sen on läpäistävä palveluntarjoajan lähtevien URL-osoitteiden käytäntö — katso [Ominaisuusliput](../reference/FEATURE_FLAGS.md). Hallintapaneelin valitsin luettelee kuratoidut palveluntarjoajat sekä paikalliset solmut; mikä tahansa kelvollinen `provider/model`-merkkijono voidaan asettaa suoraan kutsulla `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Käytettävä vektoritaustajärjestelmä | Nämä ovat käytettävissä rajapinnan `GET /PUT /api/settings/memory` kautta (skeema `MemorySettingsExtendedSchema`). -`remote`-lähdettä varten Memory hyväksyy myös valinnaiset `customBaseUrl`- ja +`remote`-lähdettä käytettäessä Memory hyväksyy myös valinnaiset `customBaseUrl`- ja `customModelId`-asetukset. Yhdessä ne valitsevat OpenAI-yhteensopivan `/embeddings`- -päätepisteen ja mallin muuttamatta yleistä upotusrekisteriä. Päätepiste -normalisoidaan ennen käyttöä ja tarkistetaan palveluntarjoajan lähtevien URL-osoitteiden käytännön mukaisesti: HTTP(S) -vaaditaan, upotetut tunnistetiedot ja kyselymerkkijonot hylätään ja pilven metatieto- -osoitteet pysyvät estettyinä. Tyhjät arvot säilyttävät valitun rekisteripalveluntarjoajan. Hallintapaneelille +päätepisteen ja mallin muuttamatta yleistä upotusrekisteriä. Päätepiste normalisoidaan +ennen käyttöä ja tarkistetaan palveluntarjoajan lähtevien URL-osoitteiden käytännön mukaisesti: HTTP(S) +vaaditaan, upotetut tunnistetiedot ja kyselymerkkijonot hylätään, ja pilvipalvelujen metatieto- +osoitteet pysyvät estettyinä. Tyhjät arvot säilyttävät valitun rekisterin palveluntarjoajan. Hallintapaneelille palautettavat virheet puhdistetaan, eikä päätepisteen tunnistetietoja koskaan kirjata lokiin. -> **TODO (D20):** Laajuutta `global` (muistojen jakaminen kaikkien API-avainten kesken) ei ole +> **TODO (D20):** `global`-laajuutta (muistojen jakaminen kaikkien API-avainten kesken) ei ole > toteutettu tässä julkaisussa. Se edellyttää skeemamuutoksia ja yleistä hakupolkua. > Seurattava erikseen. diff --git a/docs/i18n/fi/docs/guides/DOCKER_GUIDE.md b/docs/i18n/fi/docs/guides/DOCKER_GUIDE.md index bd078f8b63df..26c76dfc2e8e 100644 --- a/docs/i18n/fi/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/fi/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Pikakäynnistys +> **Itse ylläpidetty yhdellä komennolla?** Katso +> [itseylläpito-opas](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (julkaistu levykuva + +> Redis, vain loopback-yhteydet, ei profiilin valintaa). Alla oleva pikakäynnistys on +> yhden säilön vaihtoehto käyttäjille, joilla Redis on jo käytössä muualla. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/fi/docs/guides/TROUBLESHOOTING.md b/docs/i18n/fi/docs/guides/TROUBLESHOOTING.md index 6830a009a7f4..d0ebcc14a35c 100644 --- a/docs/i18n/fi/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/fi/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ Aseta nämä OmniRoute-prosessin ympäristöön (taustapalveluun, esimerkiksi La --- -## npm install -varoitukset (ERESOLVE / vertaisriippuvuudet / vanhentuneet paketit) +## `npm install` -varoitukset (ERESOLVE / vertaisriippuvuudet / vanhentuneet paketit) -Kun suoritat komennon `npm install -g omniroute`, saatat nähdä suuren määrän varoituksia, kuten `npm warn ERESOLVE`, ilmoituksia vertaisriippuvuuksista ja `deprecated`-viestejä. **Nämä ovat odotettuja ja harmittomia.** Asennus onnistui, jos tulosteessa näkyy `added packages`. +Kun suoritat komennon `npm install -g omniroute`, saatat nähdä suuren määrän varoituksia, kuten `npm warn ERESOLVE`, vertaisriippuvuuksia koskevia ilmoituksia ja `deprecated`-viestejä. **Nämä ovat odotettuja ja harmittomia.** Asennus onnistui, jos tulosteessa näkyy `added packages`. + +Voit estää vertaisriippuvuuksien ratkaisuvaroitukset käyttämällä OmniRouten tukemaa asennusmuotoa: + +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` estää vain `ERESOLVE`-varoitukset ja vertaisriippuvuuksia koskevat ilmoitukset. Vanhentumisilmoitukset jäävät näkyviin, koska ne tulevat epäsuorista kolmannen osapuolen paketeista. Ne eivät tarkoita, että asennus epäonnistui. Varoitukset johtuvat sellaisten kolmannen osapuolen pakettien vanhentuneista vertaisriippuvuuksien versioalueista, joita OmniRoute ei hallitse: -1. **`marked-terminal` vaatii version `marked >=1 <16`, mutta löytyi `marked@18`** — toimii käytännössä hyvin; upstream-paketin vertaisriippuvuuden versioalue on vain vanhentunut. -2. **`deprecated prebuild-install@7.1.3`** — transitiivinen apuohjelma natiivibinäärien noutamiseen. Sitä ei - käytetä lukitun `wreq-js`-siirtosidoksen asentamiseen, eikä se tarkoita, että verkkoevästeiden - tarjoajan siirtoasetusten määritys olisi epäonnistunut. +1. **`marked-terminal` edellyttää versiota `marked >=1 <16`, mutta löytyi `marked@18`** — toimii käytännössä hyvin; upstream-paketin vertaisriippuvuuden versioalue on vain vanhentunut. +2. **`deprecated prebuild-install@7.1.3`** — epäsuora natiivibinäärien noutamiseen tarkoitettu apuohjelma. Sitä ei + käytetä kiinnitetyn `wreq-js`-siirtosidoksen asentamiseen, eikä se tarkoita, että web-cookie-palveluntarjoajan + siirron määritys epäonnistui. -**Toimenpiteitä ei tarvita** — varoituksia ei voi poistaa kokonaan käytöstä ilman upstream-pakettien haarauttamista. +**Toimia ei tarvita** — varoituksia ei voi poistaa kokonaan näkyvistä haarauttamatta upstream-paketteja. --- diff --git a/docs/i18n/fi/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/fi/docs/providers/CURSOR-API-KEY-AND-CLI.md index ef750378b33e..3a9a7052ac3a 100644 --- a/docs/i18n/fi/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/fi/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,43 +4,39 @@ --- -Kaksi tapaa sijoittaa Cursor OmniRouten taakse ilman IDE-istuntoa: - -1. **`cursor-api`-palveluntarjoaja** (kortti ”Cursor API”, alias `cua`): API-avainta - käyttävä palveluntarjoaja, joka säilyttää Cursor-käyttäjän API-avaimen (`crsr_…`, - luodaan osoitteessa `https://cursor.com/dashboard/api`). Tämän jälkeen mikä - tahansa OmniRoute-asiakas voi käyttää Cursor-malleja `/v1/chat/completions`-rajapinnan - kautta muodossa `cursor-api/` tai `cua/` tavanomaisilla kiintiö-, - varajärjestely- ja lokituskerroksilla. IDE-palveluntarjoaja (`cursor`, - OAuth/IDE-istunto) säilyy ennallaan. -2. **Cursor CLI -läpivienti**: määritä Cursor CLI (`agent`) käyttämään OmniRoutea, - jolloin jokainen CLI:n tekemä RPC-pyyntö todennetaan OmniRoute-API-avaimella, - välitetään Cursorille `cursor-api`-yhteyden tunnistetiedoilla ja kirjataan - Lokit-sivulle. +Kaksi tapaa asettaa Cursor OmniRouten taakse ilman IDE-istuntoa: + +1. **`cursor-api`-palveluntarjoaja** (kortti "Cursor API", alias `cua`): API-avainpohjainen + palveluntarjoaja, joka säilyttää Cursor-käyttäjän API-avaimen (`crsr_…`, luodaan + osoitteessa `https://cursor.com/dashboard/api`). Mikä tahansa OmniRoute-asiakas voi + tällöin käyttää Cursor-malleja `/v1/chat/completions`-päätepisteen kautta nimellä + `cursor-api/` tai `cua/` sekä hyödyntää tavanomaisia kiintiö-, vara- + ja lokituskerroksia. IDE-palveluntarjoaja (`cursor`, OAuth/IDE-istunto) säilyy ennallaan. +2. **Cursor CLI -läpivienti**: määritä Cursor CLI (`agent`) käyttämään OmniRoutea, jotta + jokainen CLI:n tekemä RPC-pyyntö todennetaan OmniRoute-API-avaimella, välitetään + Cursorille `cursor-api`-yhteyden tunnistetiedolla ja tallennetaan Logs-sivulle. ## Miksi avain vaihdetaan -`api2.cursor.sh` hylkää raa'an `crsr_…`-avaimen Bearer-tunnuksena (401). Cursor -CLI lähettää avaimen ensin POST-pyynnöllä osoitteeseen -`/auth/exchange_user_api_key` ja saa tunnin kuluttua vanhentuvan istunto-JWT:n; -palautetulla `refreshToken`-tunnuksella on sama `exp`, joten uusiminen tarkoittaa -avaimen vaihtamista uudelleen. -`open-sse/services/cursorApiKeyAuth.ts` suorittaa tämän vaihdon, tallentaa -välimuistiin yhden istuntotunnuksen avainta kohden, vaihtaa avaimen uudelleen -viisi minuuttia ennen vanhentumista ja poistaa välimuistissa olevan tunnuksen, -kun Cursor vastaa koodilla 401. `CursorExecutor` kutsuu sitä juuri ennen -ylävirran suoratoiston avaamista `cursor-api`-yhteyksille. +`api2.cursor.sh` hylkää käsittelemättömän `crsr_…`-avaimen Bearer-tunnuksena (401). Cursor +CLI lähettää avaimen ensin POST-pyynnöllä päätepisteeseen `/auth/exchange_user_api_key` ja saa +istunnon JWT:n, joka vanhenee tunnin kuluttua. Palautetulla `refreshToken`-tunnuksella on sama +`exp`, joten päivittäminen tarkoittaa avaimen vaihtamista uudelleen. +`open-sse/services/cursorApiKeyAuth.ts` suorittaa tämän vaihdon, tallentaa välimuistiin yhden +istuntotunnuksen avainta kohden, vaihtaa sen uudelleen viisi minuuttia ennen vanhenemista ja +poistaa välimuistiin tallennetun tunnuksen Cursorin vastatessa 401. `CursorExecutor` kutsuu +sitä juuri ennen ylävirran suoratoiston avaamista `cursor-api`-yhteyksille. ## `cursor-api`-palveluntarjoaja Rekisteri: `open-sse/config/providers/registry/cursor/index.ts` (`cursor_apiProvider`, `authType: "apikey"`, samat `format`, `baseUrl` ja -`models` kuin `cursor`-palveluntarjoajalla). Luettelokortti: -`src/shared/constants/providers/apikey/specialty-media.ts`. Suorittajamääritys: +`models` kuin palveluntarjoajalla `cursor`). Luettelokortti: +`src/shared/constants/providers/apikey/specialty-media.ts`. Suorittajien kartoitus: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Hallintapaneeli: Palveluntarjoajat → Cursor API → Lisää API-avain. +Hallintapaneeli: Providers → Cursor API → Add API key. REST: @@ -59,44 +55,56 @@ curl -sS http://localhost:20128/v1/chat/completions \ -d '{"model":"cursor-api/auto","messages":[{"role":"user","content":"say PONG"}]}' ``` -Huomautuksia: +Huomautukset: -- `cursor-api`-mallien luettelo tulee staattisesta Cursor-rekisteristä (samasta - luettelosta, jota IDE-palveluntarjoaja käyttää varavaihtoehtona); - `cursor-agent`-asennusta ei tarvita OmniRoute-isäntäkoneessa. +- `cursor-api`-malliluettelo tulee staattisesta Cursor-rekisteristä (samasta + luettelosta, jota IDE-palveluntarjoaja käyttää varavaihtoehtona); `cursor-agent`-asennusta + ei tarvita OmniRoute-isäntäkoneessa. - `POST /api/providers/{id}/refresh-cursor` on tarkoitettu vain `cursor`-IDE-palveluntarjoajalle; `cursor-api`-yhteyksillä ei ole uusittavaa IDE-istuntoa. -## Cursor CLI -läpivienti +## Alkuperäiset mallitunnukset ja effort + +Reiteillä `cursor` / `cu` ja `cursor-api` / `cua` yhteinen Clauden effort-normalisoija +säilyttää pyydetyn mallitunnuksen muuttumattomana. Cursor voi ilmoittaa päätteen, kuten +`-low`, osana todellista mallitunnusta eikä OmniRouten effort-aliaksena. +Cursor-suoritin säilyttää tarkan vastaavuuden aktiiviseen luetteloon; jos vastaavuutta +ei löydy, sen nykyinen mallinratkaisija huolehtii päätteen muuntamisesta parametriksi. + +Tämä ei muuta effort-normalisointia suorilla Claude-, Claude-yhteensopivilla tai +Vertex-reiteillä. Saatavuus riippuu edelleen valitun Cursor-tilin luettelosta ja +käyttöoikeuksista. + +## Cursor CLI -välitys Reitti: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Etuliite `/api/cursor-cli/` on -rekisteröity tiedostossa `src/shared/constants/publicApiRoutes.ts`, koska -käsittelijä toteuttaa oman todennuksensa: +rekisteröity tiedostossa `src/shared/constants/publicApiRoutes.ts`, koska käsittelijä +huolehtii omasta todennuksestaan: -| Polku | CLI:ltä odotettu todennus | Mitä OmniRoute tekee | -| ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Vahvistaa avaimen, luo tunnin voimassa olevan HS256 JWT:n (allekirjoitettu muuttujalla `JWT_SECRET`) ja palauttaa sen | -| kaikki muut polut (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Vahvistaa myöntäjän, kohdeyleisön ja vanhentumisajan, valitsee aktiivisen `cursor-api`-yhteyden, vaihtaa Authorization-otsakkeen Cursor-tunnukseen ja suoratoistaa vastauksen takaisin | +| Polku | CLI:n odottama todennus | Mitä OmniRoute tekee | +| ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Vahvistaa avaimen, luo yhden tunnin voimassa olevan HS256 JWT:n (allekirjoitettuna `JWT_SECRET`-salaisuudella) ja palauttaa sen | +| kaikki muut polut (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Tarkistaa myöntäjän, kohdeyleisön ja vanhenemisajan, valitsee aktiivisen `cursor-api`-yhteyden, korvaa Authorization-otsakkeen vaihdetulla Cursor-tunnisteella ja suoratoistaa vastauksen takaisin | -CLI purkaa `exp`-arvon mistä tahansa saamastaan tunnuksesta, joten läpinäkymättömän -tunnuksen antaminen saa sen suorittamaan vaihdon uudelleen ennen lähes jokaista -pyyntöä; luotu JWT estää tämän. OmniRouten palauttama 401 saa CLI:n suorittamaan -vaihdon uudelleen. +CLI purkaa `exp`-arvon saamastaan tunnisteesta, joten läpinäkymättömän +tunnisteen antaminen saa sen tekemään vaihdon uudelleen ennen lähes jokaista pyyntöä; +luotu JWT estää tämän. OmniRouten palauttama 401 saa CLI:n tekemään vaihdon uudelleen. ### Määritys -1. Luo OmniRoute-API-avain (Hallintapaneeli → API-avaimet) ja `cursor-api`-yhteys. -2. Määritä CLI käyttämään agentin suoratoistossa HTTP/1.1-protokollaa. Tiedostossa +1. Luo OmniRoute API -avain (Hallintapaneeli → API-avaimet) ja `cursor-api`- + yhteys. +2. Määritä CLI käyttämään HTTP/1.1-protokollaa agentin suoratoistoon. Tiedostossa `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Ilman tätä CLI avaa agentin vuoron HTTP/2-yhteydellä erikseen määritettyyn - agentti-isäntään, ja vain ohjaustason RPC-pyynnöt kulkevat päätepisteen - kautta. + Ilman tätä CLI avaa agenttivuoron HTTP/2-yhteydellä erikseen + määritettyyn agenttipalvelimeen, ja vain ohjaustason RPC-kutsut kulkevat + päätepisteen kautta. 3. Suorita CLI OmniRoutea vasten: @@ -106,19 +114,19 @@ vaihdon uudelleen. agent -p --trust "Reply with exactly OK" ``` -Jokainen vaihe kirjautuu Lokeihin palveluntarjoajalla `cursor-api`, pyyntötyypillä -`cursor-cli` ja polulla `/api/cursor-cli/`, ja se yhdistetään OmniRoute-API-avaimeen -sekä pyynnön käsitelleeseen yhteyteen. +Jokainen välitysvaihe kirjautuu lokeihin palveluntarjoajana `cursor-api`, pyyntötyyppinä +`cursor-cli` ja polkuna `/api/cursor-cli/`, ja se kohdistetaan OmniRoute API -avaimeen sekä +pyynnön käsitelleeseen yhteyteen. ### Virhetilanteet -| Tilanne | Vastaus CLI:lle | -| ------------------------------------------------------- | ------------------------------------------------------------- | -| Tuntematon OmniRoute-avain ja `REQUIRE_API_KEY=true` | 401 `unauthenticated` tunnustenvaihdossa | -| `REQUIRE_API_KEY=false` | anonyymi istunto (vastaa `/v1/*`-toimintaa) | -| Vanhentunut / vieras / peukaloitu istunnon JWT | 401, CLI suorittaa tunnustenvaihdon uudelleen | -| OmniRoute-API-avain peruutettu tunnustenvaihdon jälkeen | 401 seuraavassa RPC-kutsussa | -| Ei aktiivista `cursor-api`-yhteyttä | 503 `unavailable` | -| Cursor hylkää yhteyden avaimen | 401 `unauthenticated`, välimuistissa oleva istunto poistetaan | -| Ylävirran palvelu ei ole tavoitettavissa | 502 `unavailable` (siistitty viesti) | -| `JWT_SECRET` ei ole asetettu | 503 tunnustenvaihdossa | +| Tilanne | Vastaus CLI:lle | +| ---------------------------------------------------- | ------------------------------------------------------------- | +| Tuntematon OmniRoute-avain ja `REQUIRE_API_KEY=true` | 401 `unauthenticated` vaihdon yhteydessä | +| `REQUIRE_API_KEY=false` | anonyymi istunto (vastaa `/v1/*`-toimintaa) | +| Vanhentunut / vieras / peukaloitu istunnon JWT | 401, CLI tekee vaihdon uudelleen | +| OmniRoute API -avain kumottu vaihdon jälkeen | 401 seuraavan RPC-kutsun yhteydessä | +| Ei aktiivista `cursor-api`-yhteyttä | 503 `unavailable` | +| Cursor hylkää yhteyden avaimen | 401 `unauthenticated`, välimuistissa oleva istunto poistetaan | +| Ylävirran palvelua ei tavoiteta | 502 `unavailable` (puhdistettu viesti) | +| `JWT_SECRET` ei ole asetettu | 503 vaihdon yhteydessä | diff --git a/docs/i18n/fi/docs/reference/API_REFERENCE.md b/docs/i18n/fi/docs/reference/API_REFERENCE.md index 5685b06f34a7..75dd8bb3628e 100644 --- a/docs/i18n/fi/docs/reference/API_REFERENCE.md +++ b/docs/i18n/fi/docs/reference/API_REFERENCE.md @@ -416,10 +416,10 @@ Käytä tätä päätepistettä, kun rinnakkaisprosessi suoritetaan pääprosess | POST | `/v1/embeddings` | OpenAI | | POST | `/v1/images/generations` | OpenAI Images | | POST | `/v1/images/edits` | OpenAI Images (muokkaus/täyttö) | -| POST | `/v1/videos/generations` | OpenAI-tyylinen videon luonti | -| POST | `/v1/music/generations` | OpenAI-tyylinen musiikin luonti | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (puhe tekstiksi) | -| POST | `/v1/audio/speech` | OpenAI TTS (palauttaa äänirungon) | +| POST | `/v1/videos/generations` | OpenAI-tyylinen videon generointi | +| POST | `/v1/music/generations` | OpenAI-tyylinen musiikin generointi | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (palauttaa äänisisällön) | | POST | `/v1/rerank` | Cohere/Voyage-tyylinen uudelleenjärjestys | | POST | `/v1/classify` | Jina-luokittelu (`api.jina.ai`) | | POST | `/v1/segment` | Jina-segmentoija (`segment.jina.ai`) | @@ -429,19 +429,19 @@ Käytä tätä päätepistettä, kun rinnakkaisprosessi suoritetaan pääprosess | GET | `/v1beta/models` | Gemini | | POST | `/v1beta/models/{...path}` | Gemini generateContent | | POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | OpenAI-luettelon alias | -| GET | `/api/v1/vscode/{token}/models` | OpenAI-mallien alias | -| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI:n tunnisteellinen alias | -| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses -tunnistealias | -| POST | `/api/v1/vscode/{token}/api/chat` | Ollama-tunnistealias | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama-tunnisteiden alias | +| GET | `/api/v1/vscode/{token}/` | OpenAI-luetteloalias | +| GET | `/api/v1/vscode/{token}/models` | OpenAI-mallialias | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI:n tunnuksellinen alias | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses -tunnuksellinen alias | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollaman tunnuksellinen alias | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama-tunnisteiden tunnuksellinen alias | -Kaikki POST-reitit noudattavat samaa rakennetta: `Bearer your-api-key` + Zod-validoitu JSON-runko (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` jne.; katso `src/shared/validation/schemas.ts`). Skeeman epäonnistuessa palautetaan 4xx. +Kaikki POST-reitit noudattavat samaa rakennetta: `Bearer your-api-key` + Zod-validoitu JSON-runko (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` jne., katso `src/shared/validation/schemas.ts`). Rakenteen validoinnin epäonnistuessa palautetaan 4xx. -Asiakasohjelmille, jotka eivät voi liittää `Authorization: Bearer ...` -otsaketta, OmniRoute hyväksyy API-avaimet myös URL-osoitteessa joko kyselymerkkijonoyhteensopivuuden (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) tai alla dokumentoitujen erillisten `/api/v1/vscode/{token}/...`-päätepisteiden kautta. +Asiakkaille, jotka eivät voi liittää `Authorization: Bearer ...` -otsaketta, OmniRoute hyväksyy API-avaimet myös URL-osoitteessa joko kyselymerkkijonoyhteensopivuuden (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) tai alla dokumentoitujen erillisten `/api/v1/vscode/{token}/...`-päätepisteiden kautta. ```bash -# Uudelleenjärjestys +# Uudelleenjärjestys (pilvirekisterin tarjoaja tai OpenAI-yhteensopiva tarjoajasolmu muodossa "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # Jina-luokittelu (Foundation API -tunnistetiedot) @@ -450,7 +450,7 @@ POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..." # Jina-segmentoija POST /v1/segment { "content": "...", "return_chunks": true } -# Jina-haku (s.jina.ai; palveluntarjoajan aliakset: jina-search, jina-ai, jina) +# Jina-haku (s.jina.ai; tarjoaja-aliakset: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } # Moderointi @@ -462,12 +462,34 @@ POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "all # Kuvan muokkaus (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Videon / musiikin luonti (palveluntarjoajan etuliitteellä varustettu mallitunnus) +# Videon/musiikin generointi (tarjoajan etuliitteellä varustettu mallitunnus) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Palveluntarjoajakohtaiset reitit +> **Uudelleenjärjestyksen tarjoajasolmut:** `POST /v1/rerank` reitittää myös OpenAI-yhteensopiviin tarjoajasolmuihin +> (oMLX, vLLM, Infinity, yhdyskäytävän takana oleva TEI, …), joihin viitataan muodossa `/`. Takaisinkytkentäosoitteiden +> solmut (`localhost`, `127.0.0.1`, `172.16.0.0/12`) ovat aina kelvollisia. Kaikissa muissa +> isännissä olevat solmut — lähiverkon kone tai Tailscale-vertaislaite — ovat kelvollisia vain, kun operaattori ottaa käyttöön +> `RERANK_REMOTE_PROVIDER_NODES`-ominaisuuslipun **ja** solmun perus-URL läpäisee tarjoajan +> lähtevien URL-osoitteiden käytännön (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> pilvimetatietojen isäntiin ei koskaan reititetä. Muistimoottorin uudelleenjärjestysvaihe kutsuu tätä reittiä +> takaisinkytkennän kautta, joten sama sääntö koskee Muisti-asetusten `rerankProviderModel`-arvoa. +> +> **Paikallisten palvelinten muodot:** solmua kutsutaan osoitteessa `/v1/rerank` ja 404-vastauksen tapauksessa osoitteessa `/rerank` +> (Infinity, TEI). Ylävirtaan lähetettävä runko sisältää sekä Cohere/OpenAI-kirjoitusasun (`documents`, +> `return_documents`) että TEI-kirjoitusasun (`texts`, `return_text`), ja ylävirran vastaus +> normalisoidaan Cohere-kuoreen: TEI:n pelkkä `[{index, score, text}]`, kevyiden yhdyskäytävien +> `{results: [{index, score}]}` ja Voyage-tyylinen `{data: [...]}` palautetaan kaikki asiakkaalle muodossa +> `{results: [{index, relevance_score, document?}]}`, pistemäärän mukaan lajiteltuina ja enintään `top_n`-määrään rajattuina. + +> **Tarjoajasolmujen löytäminen:** OpenAI-yhteensopivan tarjoajasolmun mallit näkyvät kohdassa `GET /v1/models` +> solmun etuliitteen alla. Rivit, joissa ei ole päätepisteiden metatietoja (tyypillistä paikallisille `/v1/models`-luetteloille), +> perivät solmun `apiType`-arvon, joten `embeddings`-solmun mallien tyyppi on `type: "embedding"` ja +> `rerank`-solmun mallien tyyppi on `type: "rerank"` sen sijaan, että oletusarvoksi tulisi keskustelu; synkronoidulla +> tai manuaalisesti lisätyllä rivillä eksplisiittinen `supportedEndpoints` on edelleen etusijalla. + +### Erilliset tarjoajareitit ```bash POST /v1/providers/{provider}/chat/completions diff --git a/docs/i18n/fi/docs/reference/ENVIRONMENT.md b/docs/i18n/fi/docs/reference/ENVIRONMENT.md index 914dbcfea475..ae50d3ee3d2c 100644 --- a/docs/i18n/fi/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/fi/docs/reference/ENVIRONMENT.md @@ -79,72 +79,71 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. Tallennus ja tietokanta -OmniRoute käyttää kaikkeen pysyvään tallennukseen **SQLitea** (`better-sqlite3`-paketin kautta). Näillä muuttujilla hallitaan tietojen sijaintia, salausta ja elinkaarta. - -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ------------------------------------------ | ------------------------------ | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite-tietokannan, varmuuskopioiden ja datatiedostojen juurihakemisto. Ohita Docker-taltiota tai mukautettuja polkuja varten. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(ei asetettu)_ | `src/lib/dataPaths.ts` | Poikkeusmahdollisuus testien/evaluoinnin DATA_DIR-suojaukseen (#10428). Testit ja Noden eval/print-kokeilut (`-e`/`--eval`/`-p`/`--print`, mukaan lukien muodot `--eval=`/`--print=`), joissa `DATA_DIR`-muuttujaa ei ole asetettu, ohjataan tilapäiseen kertakäyttöhakemistoon, jotta ne eivät voi avata ylläpitäjän oikeaa tietokantaa. Aseta arvoksi `1`, jos haluat käyttää jälleen oikeaa hakemistoa. | -| `OMNIROUTE_BUILD_SHA` | _(ei asetettu)_ | `src/lib/monitoring/buildSha.ts` | Käynnissä olevan artefaktin Git-SHA. Sen lisää `npm run build:release`; arvo voidaan injektoida säilöihin, jotka toimitetaan ilman `dist/BUILD_SHA`-tunnistetiedostoa. Näytetään arvona `system.buildSha` päätepisteessä `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Viite, jota vasten pakattavan artefaktin alkuperän tarkistusportti tarkistaa koontiversion SHA:n (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(ei asetettu)_ | `scripts/build/buildProvenance.ts` | Aseta arvoksi `1`, jos haluat sallia sellaisen koontiversion pakkaamisen, jonka SHA ei ole julkaisuhaarassa. Tällöin se kirjataan tarkoitukselliseksi canary-versioksi sen sijaan, että tarkistusportti epäonnistuisi (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(ei asetettu)_ | `scripts/ops/deploy-canary.mjs` | Canary-käyttöönoton smoke-tarkistuksen API-avain, joka lähetetään `Authorization: Bearer` -otsakkeena päätepisteeseen `/v1/chat/completions`. Vain käyttöönottoskripti käyttää sitä (#10429), palvelin ei koskaan. Tämä ei liity erikseen käyttöön otettavan CLI:n smoke-testikehyksen `OMNIROUTE_SMOKE_*`-muuttujiin (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` tiedostossa `tests/integration/upstream-cli-smoke.int.test.ts`) — katso [CLI-integraatiot → Todellinen smoke-testaus](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(ei asetettu)_ | `src/lib/buildPhase.ts` | Koontivaiheen signaali (#10060): `scripts/build/build-next-isolated.mjs` asettaa sen arvoksi `1`, ja jokainen käynnistetty koontityöprosessi perii sen, jotta tietokantakerros palauttaa mitään tekemättömän stub-toteutuksen sen sijaan, että se lataisi natiivin better-sqlite3-lisäosan (joka keskeyttää työprosessin sen sulkeutuessa). Ei koskaan aseteta käynnissä olevalle palvelimelle. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Aseta arvoksi `1`, jos haluat ohittaa valinnaisen natiivien riippuvuuksien esikoonnin tarkistuksen epätavallisissa vendoroiduissa hakemistopuissa. Tämä ei tee puuttuvan riippuvuuden sisältävää projektia koontikelpoiseksi; käytä vain, kun natiivit riippuvuudet toimitetaan muuta kautta. | -| `OMNIROUTE_DATA_DIR` | _(ei asetettu)_ | `open-sse/executors/promptql/threadSticky.ts` | **Varmistusalias** muuttujalle `DATA_DIR`; tarkistetaan vain, kun `DATA_DIR`-muuttujaa ei ole asetettu. Sen avulla paikannetaan PromptQL-suorittimen levylle tallennettava säiekohtaisesti pysyvä istuntovälimuisti (`/promptql-thread-sessions.json`). Jos kumpaakaan muuttujaa ei ole asetettu, välimuisti säilytetään vain muistissa (sitä ei säilytetä uudelleenkäynnistysten välillä). | -| `OMNIROUTE_PLUGINS_DIR` | _(ei asetettu)_ | `src/lib/plugins/scanner.ts` | Hakemisto, jota **ajonaikainen liitännäisskanneri** lukee ja johon liitännäisten hallinta asentaa liitännäiset; ohittaa kotihakemistosta johdetun oletusarvon (#11827). Osoita se Dockerissa/K8s:ssä liitospisteenä liitettyyn liitännäispuuhun sen sijaan, että siirtäisit HOME-hakemiston vain skannauspolun vaihtamiseksi (HOME hallitsee myös kaikkea muuta kotihakemistoon suhteutettua toimintaa). Asettamatta = `~/.omniroute/plugins`, tai `/tmp/.omniroute/plugins`, kun prosessi ei vie lainkaan kotihakemistotietoa ympäristöön — tämä muuttuja poistaa tällaisessa tilanteessa tapahtuvan hiljaisen löytymättä jäämisen. Ratkaistu hakemisto kirjataan kerran käynnistyksen yhteydessä nimellä `scanner.dir_resolved` yhdessä valitun syötteen kanssa. Vain palvelinpuolella: CLI-komentoliitännäiset käyttävät edelleen omaa `OMNIROUTE_PLUGIN_PATH`-muuttujaansa (osio 9). | -| `STORAGE_ENCRYPTION_KEY` | _(tyhjä = poistettu käytöstä)_ | `src/lib/db/encryption.ts` | AES-avain koko levylle tallennetun SQLite-tietokannan salaamiseen. Luo komennolla `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Salausavaimen versiotunniste. Kasvata arvoa avaimen kierron yhteydessä, jotta vanhojen varmuuskopioiden salauksen purkamista voidaan tukea. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Kun arvo on `true`, tavanomaiset SQLite-tiedoston varmuuskopiot ja kirjoitusta edeltävät varmuuskopiot ohitetaan (models.dev-hinnoittelun tallennus/tyhjennys ja asetusten kirjoitukset). Manuaaliset ja palautusta edeltävät varmuuskopiot suoritetaan edelleen. Tämä **ei** poista käytöstä migraatioiden suorittajan pakollista pysyvää turvatilannevedosta eikä olemassa olevan pysyvän tietokannan massamigraation suojausta. Muut kuin manuaaliset varmuuskopiot rajoitetaan enintään yhteen 60 minuutin aikana. Hallintapaneelin **Asetukset → Tallennustila** -kohdassa tavanomainen automaattinen varmuuskopiointi voidaan poistaa käytöstä erikseen. | -| `OMNIROUTE_CRYPT_KEY` | _(ei asetettu)_ | `src/lib/db/encryption.ts` | **Vanha alias** muuttujalle `STORAGE_ENCRYPTION_KEY`. Hyväksytään vara-arvona, kun ensisijaista muuttujaa ei ole määritetty. | -| `OMNIROUTE_API_KEY_BASE64` | _(ei asetettu)_ | `src/lib/db/encryption.ts` | **Vanha alias** (Base64-koodattu muoto), joka hyväksytään vara-arvona. Dekoodataan automaattisesti ennen käyttöä. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ei asetettu)_ | `src/lib/db/core.ts` | Ohita SQLite-tietokannan säännöllisen kuntotarkistuksen aikaväli (ms). Kun arvoa ei ole asetettu, oletusarvot johdetaan muuttujasta `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/walMaintenance.ts` | Ohita säännöllisen `wal_checkpoint(TRUNCATE)`-toiminnon aikaväli (ms). Automaattinen tarkistuspiste ei koskaan pienennä itse WAL-tiedostoa, eikä pitkään käynnissä oleva palvelin koskaan sulje tietokantaansa. `0` poistaa toiminnon käytöstä. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Ohita usein suoritettavan `wal_checkpoint(PASSIVE)`-toiminnon aikaväli (ms). Pitää odottavien WAL-kehysten määrän pienenä, jotta säännöllinen TRUNCATE-toiminto ei koskaan kopioi useiden gigatavujen jonoa pääsäikeessä. `0` poistaa toiminnon käytöstä. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Kun PASSIVE-suorituskerta havaitsee WAL-tiedoston ylittävän tämän koon, siirrytään välittömästi toimintoon `wal_checkpoint(TRUNCATE)` hitaan suorituskerran odottamisen sijaan. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Aseta arvoksi `1`/`true`/`yes`/`on`, jotta prosessi suljetaan kriittisen resurssipaineen jatkuttua ajan `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, jolloin valvoja (systemd `Restart=always`, Dockerin uudelleenkäynnistyskäytäntö) voi käynnistää puhtaan prosessin sen sijaan, että 503-vastauksia tarjottaisiin loputtomasti. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Kuinka kauan kriittisen paineen on jatkuttava ennen kuin itseuudelleenkäynnistyksen sulkeminen käynnistyy. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(automaattinen tunnistus)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Täsmällinen polku (absoluuttinen tai suhteellinen nykyiseen työhakemistoon) tiedostoon `sql-wasm.wasm`, kun käytetään `sql.js`-WASM-varasovitinta. Kun arvoa ei ole asetettu, polku tunnistetaan automaattisesti pakettiriippuvuuksien ja mahdollisten hakemistorakenteiden perusteella. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/core.ts` | Ohita säännöllisen `wal_checkpoint(TRUNCATE)`-toiminnon aikaväli (ms). Automaattinen tarkistuspiste ei koskaan pienennä itse WAL-tiedostoa, eikä pitkään käynnissä oleva palvelin koskaan sulje tietokantaansa. `0` poistaa toiminnon käytöstä. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Päivien määrä, jonka päättyneeseen (valmis/epäonnistunut/peruutettu/vanhentunut) Batch API -työhön liittyvät tarkistuspisteet, viitatut syöte-, tuloste- ja virhetiedostot sekä rivi säilytetään ennen automaattisen puhdistuksen suorittamaa poistamista. Tulee voimaan vasta, kun `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` on käytössä; vastaa OpenAI:n oman Batch API:n tulosteiden säilytysaikaa. Ei vaikuta operaattorin käynnistämään `DELETE /api/v1/batches/delete-completed`-reittiin, joka toimii suunnitellusti aina ehdottomasti (ilman ikäsuodatinta). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Kun arvo on `true`, automaattinen siivousajo voi poistaa valmiiseen tilaan päätyneet Batch API -työt (ja niiden tarkistuspisteet), jotka ovat vanhempia kuin `OMNIROUTE_BATCH_RETENTION_DAYS`, sekä tyhjentää niiden ladattujen tiedostojen BLOB-sisällön, joiden oma `expires_at` on ohitettu. Oletusarvoisesti pois käytöstä: jokainen olemassa oleva asennus säilyttää nämä tiedot täsmälleen kuten ennen, kunnes ylläpitäjä ottaa ominaisuuden käyttöön. Tämä on myös hallintapaneelissa muokattava ominaisuuslippu — katso `docs/reference/FEATURE_FLAGS.md` → Suorituksen aikana. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Aseta arvoksi `1`, jos haluat ohittaa tietokannan kuntotarkistuksen kokonaan käynnistyksen yhteydessä. Hyödyllinen lyhytkestoisissa tehtävissä ja integraatiotesteissä. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Aseta arvoksi `1`, jos haluat pakottaa tietokannan kuntotarkistussilmukan käyttöön silloinkin, kun se normaalisti ohitettaisiin (esim. lyhytkestoisissa tehtävissä). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Aseta arvoksi `1`, jos haluat ohittaa natiivin suoritusympäristön esilämmityksen `npm install` -komennon aikana. Hyödyllinen CI-/headless-asennuksissa, joissa sqlite on jo käännetty. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(automaattinen tunnistus)_ | `src/lib/db/migrationRunner.ts` | Ohita hakemisto, jonka siirtojen suoritin käy läpi. Hyödyllinen toimitettaessa paketoituja siirtoja mukautetuissa koontiversioissa. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ei asetettu)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Muut siirtohakemistot `namespace=dir`-merkintöinä, jotka erotetaan toisistaan alustan polkuerottimella (esim. `ee=/opt/app/enterprise/db/migrations`). Niistä löytyvät tiedostot kirjataan muodossa `-`, joten omia siirtojaan toimittava jakelu ei koskaan joudu ristiriitaan upstream-projektin numeeristen paikkojen kanssa. Virheellisesti muotoiltu merkintä, virheellinen nimiavaruus tai puuttuva hakemisto aiheuttaa virheen käynnistyksessä sen sijaan, että skeema ohitettaisiin huomaamatta. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Suuren odottavien siirtojen määrän turvaraja (#3416). Käynnistys keskeytyy, jos olemassa olevassa tietokannassa on odottamassa tätä enemmän siirtoja (suojaa tyhjennetyltä seurantataululta). Suurenna arvoa palauttaaksesi vanhemman varmuuskopion; poista tarkistus käytöstä asettamalla arvoksi `0`. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade`-julkaisuportin työhakemisto. Se tarvitsee noin 12 Gt tilaa (kaksi noin 3 Gt:n asennuspuuta sekä tar-paketin), joten sitä ei saa suorittaa pienellä tmpfs-levyllä — itse isännöidyllä suorittajalla `/tmp` on 12 Gt:n RAM-muistiin pohjautuva tmpfs, jonka portti täytti kokonaan ja typisti paketin. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(oletusarvo koodissa)_ | `src/lib/spend/batchWriter.ts` | Eräajona toimivan kulutus-/kustannuskirjoittimen tyhjennysväli (ms). Pienemmät arvot vähentävät kirjoitusten yhdistämistä; suuremmat arvot vähentävät tietokantakilpailua. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(oletusarvo koodissa)_ | `src/lib/spend/batchWriter.ts` | Puskuroitujen kulutusmerkintöjen enimmäismäärä ennen pakotettua tyhjennystä. Suurenna arvoa suuren QPS:n käyttöönotoissa; pienennä sitä, kun rajattu muistinkäyttö on tärkeämpää. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ei asetettu)_ | `open-sse/utils/proxyFetch.ts` | Aseta arvoksi `"true"`, jotta `[ProxyFetch]`-virheenkorjauslokit tulostetaan Vercel-välityspolulla. Oletusarvoisesti pois käytöstä reititysvihjeiden vuotamisen välttämiseksi. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Aseta arvoksi `"true"` tai `"1"`, jotta asiakkaan ja ulosmenevän liikenteen IP-osoitteet sekä tilin etuliite sisällytetään yksityiskohtaiseen `[ProxyEgress]`-prosessilokiriviin. Oletusarvoisesti POIS käytöstä, jotta prosessiloki ei vuoda IP-osoitteita tai tilin etuliitettä. | -| `OMNIROUTE_DEBUG` | _(ei asetettu)_ | `bin/cli/commands/quota.mjs` | Aseta arvoksi `1`, jotta CLI:n kiintiökomennoista tulostetaan stderr-virtaan pyyntökohtaiset ajoitusdiagnostiikat (`[omniroute] GET valmistui ajassa Nms`). | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automaattinen)_ | `scripts/dev/healthcheck.mjs` | Säilön kuntotarkistuksen testaama eksplisiittinen polku. Kun arvoa ei ole asetettu, tarkistus johtaa polun muuttujasta `OMNIROUTE_BASE_PATH`; arvon asettaminen ottaa syvän valvontapäätepisteen uudelleen käyttöön. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(ei asetettu)_ | `bin/cli/commands/completion.mjs` | Aseta mikä tahansa ei-tyhjä arvo, jotta `[omniroute completion]`-diagnostiikka tulostetaan CLI:n komentotulkin täydennysvälimuistin poluilta (luku/päivitys/kirjoitus). Oletusarvoisesti pois käytöstä — näiden välimuistien virheet ohitetaan hiljaisesti, jotta puuttuva tai vioittunut välimuisti ei koskaan riko sarkaintäydennystä. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Yksittäisten eräkohteiden uudelleenyritysten enimmäisaikaikkuna (ms). Tämän keston ylittävät kohteet merkitään epäonnistuneiksi. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Perusviive (ms) eksponentiaaliselle odotusajan pidennykselle eräkohteiden uudelleenyrityksissä. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Eräkohteiden uudelleenyritysten välisen eksponentiaalisen odotusajan pidennyksen yläraja (ms). | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Samanaikaisesti käsiteltävien erien enimmäismäärä. Kasvata arvoa suorituskyvyn parantamiseksi; pidä se pienenä välttääksesi nopeusrajoitusten ryöpytyksen. | +OmniRoute käyttää kaikkeen pysyvään tallennukseen **SQLitea** (`better-sqlite3`:n kautta). Näillä muuttujilla hallitaan tietojen sijaintia, salausta ja elinkaarta. + +| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | +| ------------------------------------------ | ------------------------------ | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite-tietokannan, varmuuskopioiden ja datatiedostojen juurihakemisto. Ohita tämä Docker-taltiota tai mukautettuja polkuja varten. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(asettamaton)_ | `src/lib/dataPaths.ts` | Poikkeusreitti testien/evaluointien DATA_DIR-suojaukselle (#10428). Testit ja Noden eval/print-tarkistukset (`-e`/`--eval`/`-p`/`--print`, mukaan lukien muodot `--eval=`/`--print=`), joilla ei ole `DATA_DIR`-muuttujaa, ohjataan kertakäyttöiseen väliaikaishakemistoon, jotta ne eivät voi avata ylläpitäjän oikeaa tietokantaa; aseta arvoksi `1`, jos haluat käyttää jälleen oikeaa hakemistoa. | +| `OMNIROUTE_BUILD_SHA` | _(asettamaton)_ | `src/lib/monitoring/buildSha.ts` | Käynnissä olevan artefaktin Git-SHA. Komento `npm run build:release` leimaa sen; se voidaan syöttää säilöihin, jotka toimitetaan ilman `dist/BUILD_SHA`-tunnistetiedostoa. Näytetään arvona `system.buildSha` päätepisteessä `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Viite, johon pakattavan artefaktin alkuperätietojen tarkistus vertaa koontiversion SHA:ta (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(asettamaton)_ | `scripts/build/buildProvenance.ts` | Aseta arvoksi `1`, jotta julkaisuhaaraan kuulumattoman SHA:n sisältävän koontiversion pakkaaminen sallitaan ja se kirjataan tarkoitukselliseksi canary-koontiversioksi sen sijaan, että tarkistus epäonnistuisi (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(asettamaton)_ | `scripts/ops/deploy-canary.mjs` | Canary-käyttöönoton savutestin API-avain, joka lähetetään muodossa `Authorization: Bearer` päätepisteeseen `/v1/chat/completions`. Vain käyttöönottoskripti käyttää sitä (#10429), palvelin ei koskaan. Se ei liity erikseen käyttöön otettavan CLI-savutestikehyksen `OMNIROUTE_SMOKE_*`-muuttujiin (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` tiedostossa `tests/integration/upstream-cli-smoke.int.test.ts`) — katso [CLI-integraatiot → Todellinen savutestikierros](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(asettamaton)_ | `src/lib/buildPhase.ts` | Koontivaiheen signaali (#10060): `scripts/build/build-next-isolated.mjs` asettaa sen arvoksi `1`, ja jokainen käynnistetty koontityöntekijä perii sen, jotta tietokantakerros palauttaa toimintoja suorittamattoman tyngän natiivin better-sqlite3-lisäosan lataamisen sijaan (lisäosa keskeyttää työntekijän poistuttaessa). Ei koskaan aseteta käynnissä olevalle palvelimelle. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Aseta arvoksi `1`, jos haluat ohittaa valinnaisen natiiviriippuvuuksien koontia edeltävän tarkistuksen erikoisia toimittajakohtaisia hakemistopuita varten. Tämä ei tee puuttuvasta riippuvuudesta koontikelpoista; käytä vain, kun natiiviriippuvuudet toimitetaan erillistä kanavaa pitkin. | +| `OMNIROUTE_DATA_DIR` | _(asettamaton)_ | `open-sse/executors/promptql/threadSticky.ts` | **Varavaihtoehtoinen alias** muuttujalle `DATA_DIR`; tarkistetaan vain, kun `DATA_DIR` on asettamatta. Sen avulla paikannetaan PromptQL-suorittimen levyllä oleva säiekohtaisesti pysyvä istuntovälimuisti (`/promptql-thread-sessions.json`); jos kumpaakaan muuttujaa ei ole asetettu, välimuisti säilyy vain muistissa (eikä säily uudelleenkäynnistysten välillä). | +| `OMNIROUTE_PLUGINS_DIR` | _(asettamaton)_ | `src/lib/plugins/scanner.ts` | Hakemisto, jota **ajonaikainen liitännäisskanneri** lukee ja johon liitännäisten hallintaohjelma asentaa liitännäiset; ohittaa kotihakemistosta johdetun oletusarvon (#11827). Osoita se Dockerissa/K8s:ssä bind-liitettyyn liitännäishakemistopuuhun sen sijaan, että siirtäisit HOME-sijaintia vain skannauspolun vaihtamiseksi (HOME hallitsee myös kaikkea muuta kotihakemistoon suhteutettua toimintaa). Asettamattomana = `~/.omniroute/plugins`, tai `/tmp/.omniroute/plugins`, jos prosessi ei vie lainkaan kotihakemistoa ympäristöön — tämä muuttuja estää liitännäisten jäämisen hiljaisesti löytymättä. Ratkaistu hakemisto ja valituksi tullut syöte kirjataan kerran käynnistyksen yhteydessä nimellä `scanner.dir_resolved`. Vain palvelinpuolella: CLI-komentoliitännäiset käyttävät edelleen omaa `OMNIROUTE_PLUGIN_PATH`-muuttujaansa (osio 9). | +| `STORAGE_ENCRYPTION_KEY` | _(tyhjä = poistettu käytöstä)_ | `src/lib/db/encryption.ts` | AES-avain koko SQLite-tietokannan levossa olevan datan salaukseen. Luo komennolla `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Salausavaimen versiotunniste. Kasvata arvoa avainta vaihdettaessa, jotta vanhojen varmuuskopioiden salauksen purkamista voidaan edelleen tukea. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Kun arvona on `true`, tavanomaiset SQLite-tiedoston varmuuskopiot ja kirjoitusta edeltävät varmuuskopiot ohitetaan (models.dev-hinnoittelun tallennus/tyhjennys ja asetusten kirjoitukset). Manuaaliset ja palautusta edeltävät varmuuskopiot suoritetaan edelleen. Tämä **ei** poista käytöstä siirtosuorittimen pakollista, pysyvää turvatilannevedosta eikä olemassa olevan pysyvän tietokannan massasiirron suojausta. Muita kuin manuaalisia varmuuskopioita tehdään rajoitetusti, enintään kerran 60 minuutissa. Hallintapaneelin **Asetukset → Tallennustila** -kohdassa tavanomainen automaattinen varmuuskopiointi voidaan poistaa käytöstä erikseen. | +| `OMNIROUTE_CRYPT_KEY` | _(ei asetettu)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY`-muuttujan **vanha alias**. Hyväksytään varavaihtoehtona, kun ensisijaista muuttujaa ei ole määritetty. | +| `OMNIROUTE_API_KEY_BASE64` | _(ei asetettu)_ | `src/lib/db/encryption.ts` | **Vanha alias** (Base64-koodattu muoto), joka hyväksytään varavaihtoehtona. Puretaan automaattisesti ennen käyttöä. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ei asetettu)_ | `src/lib/db/core.ts` | Ohita säännöllisen SQLite-terveystarkistuksen aikaväli (ms). Kun arvoa ei ole asetettu, oletusarvot johdetaan `NODE_ENV`-muuttujasta. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(poistettu)_ | `src/lib/db/walMaintenance.ts` | **Poistettu.** Säännöllinen käytönaikainen `wal_checkpoint(TRUNCATE)` voi mitätöidä jaetun wal-index-kartoituksen ja kaataa prosessin SIGBUS-signaalilla (#13973), joten ajastinta ei enää ole. Muuttujalla ei ole vaikutusta: positiivinen arvo kirjaa kertaluonteisen vanhentumisvaroituksen, kun taas arvo `0` tai asettamaton arvo ei tuota ilmoitusta. WAL-tiedostoa ylläpidetään PASSIVE-tarkistuspisteillä (alla), ja se typistetään sammutuksen yhteydessä tehtävällä tarkistuspisteellä. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Ohita usein suoritettavan `wal_checkpoint(PASSIVE)`-tarkistuspisteen aikaväli (ms). Pitää odottavien WAL-kehysten määrän pienenä, jotta tarkistuspisteet pysyvät nopeina ja WAL-tiedoston koko rajattuna sammutuksen yhteydessä tehtävien typistysten välillä. `0` poistaa toiminnon käytöstä. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Kun PASSIVE-suorituskerta havaitsee WAL-tiedoston ylittävän tämän koon, suoritetaan `wal_checkpoint(RESTART)`, jotta WAL aloitetaan alusta kirjoittamatta kartoitettua wal-indexiä uudelleen. Käytönaikaiset truncate-tilan tarkistuspisteet on poistettu (katso `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`-rivi). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Aseta arvoksi `1`/`true`/`yes`/`on`, jotta prosessi suljetaan kriittisen resurssipaineen jatkuttua ajan `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`. Tällöin valvontajärjestelmä (systemd `Restart=always`, Dockerin uudelleenkäynnistyskäytäntö) voi käynnistää puhtaan prosessin sen sijaan, että 503-vastauksia tarjotaan loputtomasti. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Aika, jonka kriittisen paineen on jatkuttava ennen itsenäiseen uudelleenkäynnistykseen johtavaa sulkemista. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(automaattinen tunnistus)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Eksplisiittinen polku (absoluuttinen tai suhteessa nykyiseen työhakemistoon) tiedostoon `sql-wasm.wasm`, kun käytetään `sql.js`-WASM-varasovitinta. Jos arvoa ei ole asetettu, polku tunnistetaan automaattisesti pakettiriippuvuuksien ja mahdollisten hakemistorakenteiden perusteella. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Päivien määrä, jonka päättyneen (valmistuneen/epäonnistuneen/peruutetun/vanhentuneen) Batch API -työn tarkistuspisteet, viitatut syöte-, tuloste- ja virhetiedostot sekä rivi säilytetään ennen automaattisen siivouksen tekemää poistoa. Tulee voimaan vasta, kun `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` otetaan käyttöön; vastaa OpenAI:n oman Batch API:n tulosteiden säilytysaikaa. Ei vaikuta operaattorin käynnistämään `DELETE /api/v1/batches/delete-completed`-reittiin, joka toimii tarkoituksellisesti aina ilman ikäsuodatinta. | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Kun arvona on `true`, automaattinen siivous voi poistaa päättyneet Batch API -työt (ja niiden tarkistuspisteet), joiden ikä ylittää `OMNIROUTE_BATCH_RETENTION_DAYS`-arvon, sekä tyhjentää niiden ladattujen tiedostojen BLOB-sisällön, joiden oma `expires_at` on ohitettu. Oletuksena pois käytöstä: jokainen olemassa oleva asennus säilyttää nämä tiedot täsmälleen entiseen tapaan, kunnes operaattori ottaa toiminnon käyttöön. Tämä on myös hallintapaneelissa muokattava ominaisuusvalitsin — katso `docs/reference/FEATURE_FLAGS.md` → Suoritusaika. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Aseta arvoksi `1`, jos haluat ohittaa tietokannan kuntotarkistuksen kokonaan käynnistyksen yhteydessä. Hyödyllinen lyhytkestoisissa tehtävissä ja integraatiotesteissä. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Aseta arvoksi `1`, jos haluat pakottaa tietokannan kuntotarkistussilmukan käyttöön silloinkin, kun se normaalisti ohitettaisiin (esim. lyhytkestoisissa tehtävissä). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Aseta arvoksi `1`, jos haluat ohittaa natiivin suoritusympäristön esilämmityksen `npm install` -komennon aikana. Hyödyllinen CI- ja headless-asennuksissa, joissa sqlite on jo koostettu. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(automaattinen tunnistus)_ | `src/lib/db/migrationRunner.ts` | Ohita siirtojen suorittajan tarkistama hakemisto. Hyödyllinen, kun mukautetuissa koontiversioissa toimitetaan mukana paketoituja siirtoja. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ei asetettu)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Ylimääräiset siirtohakemistot `namespace=dir`-merkintöinä, jotka erotetaan toisistaan alustan polkuerottimella (esim. `ee=/opt/app/enterprise/db/migrations`). Niistä löydetyt tiedostot kirjataan muodossa `-`, joten omia siirtojaan toimittavan jakelun siirrot eivät koskaan törmää ylävirran numeerisiin paikkoihin. Virheellisesti muotoiltu merkintä, virheellinen nimiavaruus tai puuttuva hakemisto aiheuttaa virheen käynnistyksen yhteydessä sen sijaan, että skeema ohitettaisiin huomaamatta. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Suuren odottavien siirtojen määrän turvaraja (#3416). Käynnistys keskeytyy, jos olemassa olevassa tietokannassa on tätä enemmän odottavia siirtoja (suojaa tyhjennetyltä seurantataululta). Nosta arvoa palauttaaksesi vanhemman varmuuskopion; poista tarkistus käytöstä asettamalla arvoksi `0`. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade`-julkaisuportin työhakemisto. Se tarvitsee noin 12 Gt tilaa (kaksi noin 3 Gt:n asennuspuuta sekä tar-paketti), joten sitä ei saa suorittaa pienellä tmpfs-tiedostojärjestelmällä — itse ylläpidetyllä suorittimella `/tmp` on 12 Gt:n RAM-pohjainen tmpfs, jonka julkaisuportti täytti, minkä seurauksena paketti typistyi. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(oletusarvo koodissa)_ | `src/lib/spend/batchWriter.ts` | Eräajona toimivan käyttö-/kustannuskirjoittajan tyhjennysväli (ms). Pienemmät arvot vähentävät kirjoitusten yhdistämistä, suuremmat arvot vähentävät tietokannan resurssikilpailua. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(oletusarvo koodissa)_ | `src/lib/spend/batchWriter.ts` | Puskuroitujen käyttökirjausten enimmäismäärä ennen pakotettua tyhjennystä. Nosta arvoa korkean QPS:n ympäristöissä; laske sitä, kun rajattu muistinkäyttö on tärkeämpää. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ei asetettu)_ | `open-sse/utils/proxyFetch.ts` | Aseta arvoksi `"true"`, jos haluat tuottaa `[ProxyFetch]`-virheenkorjauslokit Vercel-välityspolulla. Oletusarvoisesti pois käytöstä reititysvihjeiden vuotamisen välttämiseksi. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Aseta arvoksi `"true"` tai `"1"`, jos haluat sisällyttää asiakkaan ja ulospäin suuntautuvan liikenteen IP-osoitteet sekä tilin etuliitteen yksityiskohtaiseen `[ProxyEgress]`-prosessilokiriviin. Oletusarvoisesti POIS käytöstä, jotta prosessiloki ei vuoda IP-osoitteita tai tilin etuliitettä. | +| `OMNIROUTE_DEBUG` | _(ei asetettu)_ | `bin/cli/commands/quota.mjs` | Aseta arvoksi `1`, jos haluat CLI:n kiintiökomennoista stderr-virtaan pyyntökohtaiset ajoitusdiagnostiikat (`[omniroute] GET completed in Nms`). | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automaattinen)_ | `scripts/dev/healthcheck.mjs` | Säilön kuntotarkistuksen eksplisiittisesti testaama polku. Kun arvoa ei ole asetettu, tarkistus johtaa polun muuttujasta `OMNIROUTE_BASE_PATH`; arvon asettaminen ottaa syvällisen valvontapäätepisteen uudelleen käyttöön. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(ei asetettu)_ | `bin/cli/commands/completion.mjs` | Aseta miksi tahansa ei-tyhjäksi arvoksi, jos haluat tuottaa `[omniroute completion]`-diagnostiikkaa CLI:n komentotulkin täydennysvälimuistin poluilta (luku/päivitys/kirjoitus). Oletusarvoisesti pois käytöstä — näiden välimuistien virheet ohitetaan, jotta puuttuva tai vioittunut välimuisti ei koskaan estä sarkaintäydennystä. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Yksittäisten eräkohteiden uudelleenyritysten enimmäisaikaikkuna (ms). Tämän keston ylittävät kohteet merkitään epäonnistuneiksi. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Perusviive (ms) eksponentiaaliselle odotukselle eräkohteiden uudelleenyrityksissä. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Enimmäisviive (ms) eksponentiaaliselle odotukselle eräkohteiden uudelleenyritysten välillä. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Samanaikaisesti käsiteltävien erien enimmäismäärä. Kasvata suorituskyvyn parantamiseksi; pidä pienenä välttääksesi nopeusrajoitusten ylittymisen ryöpsähdykset. | > [!IMPORTANT] -> Ennen olemassa olevan pysyvän tietokannan muuttamista siirtotyökalu julkaisee täydellisen, +> Ennen aiemmin luodun pysyvän tietokannan muuttamista migraation suorittaja julkaisee täydellisen, > sisältöosoitteisen tilannevedoksen hakemistoon `DATA_DIR/db_backups/`. Julkaiseminen edellyttää tiedostojärjestelmää, -> joka tukee saman tiedostojärjestelmän sisäisiä, korvaamisen estäviä kovia linkkejä sekä kestävää tiedostojen synkronointia. POSIX-isäntäjärjestelmät edellyttävät myös -> hakemistojen synkronointia; Windowsissa Node voi hylätä hakemistokahvat, joten OmniRoute tyhjentää -> julkaistun tiedoston puskurin ja käsittelee hakemistomerkinnän synkronoinnin parhaansa mukaan. -> Jos liitetty `DATA_DIR` ei pysty tarjoamaan näitä takeita, käynnistys keskeytetään turvallisesti ennen -> siirron käyttöönottoa. Siirrä `DATA_DIR` taltiolle, joka tukee näitä toimintoja; älä käytä -> `DISABLE_SQLITE_AUTO_BACKUP`-asetusta siirron turvallisuuden ohittamiseen. +> joka tukee saman tiedostojärjestelmän sisäisiä, ylikirjoittamattomia kovia linkkejä sekä tiedostojen pysyvää synkronointia. +> POSIX-isännät edellyttävät myös hakemistojen synkronointia; Windowsissa Node saattaa hylätä hakemistokahvat, joten OmniRoute +> tyhjentää julkaistun tiedoston puskurit levylle ja käsittelee hakemistomerkinnän synkronoinnin parhaan yrityksen periaatteella. +> Jos liitetty `DATA_DIR` ei pysty tarjoamaan näitä takeita, käynnistys keskeytyy turvallisesti ennen +> migraation suorittamista. Siirrä `DATA_DIR` taltiolle, joka tukee näitä toimintoja; älä käytä +> `DISABLE_SQLITE_AUTO_BACKUP`-muuttujaa migraation turvallisuuden ohittamiseen. -### Käyttötilanteet +### Skenaariot -| Käyttötilanne | Määritys | -| ----------------------- | --------------------------------------------------------------------------------------------------- | -| **Paikallinen kehitys** | Jätä kaikki oletusarvoihin. Tietokanta sijaitsee polussa `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + liitä taltio polkuun `/data`. | -| **Levossa salattu** | Aseta `STORAGE_ENCRYPTION_KEY` + säilytä avaimesta varmuuskopioita! Sen menetys = tietojen menetys. | -| **CI/testaus** | `DATA_DIR=/tmp/omniroute-test` — väliaikainen, salausta ei tarvita. | +| Skenaario | Määritys | +| ----------------------- | ---------------------------------------------------------------------------------------------- | +| **Paikallinen kehitys** | Säilytä kaikki oletusarvot. Tietokanta sijaitsee polussa `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + liitä taltio polkuun `/data`. | +| **Salattu levossa** | Aseta `STORAGE_ENCRYPTION_KEY` + pidä avaimesta varmuuskopiot! Sen menetys = tietojen menetys. | +| **CI/Testaus** | `DATA_DIR=/tmp/omniroute-test` — väliaikainen, salausta ei tarvita. | --- @@ -214,47 +213,48 @@ OmniRoute käyttää kaikkeen pysyvään tallennukseen **SQLitea** (`better-sqli ## 4. Tietoturva ja todennus -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Laitteistotunnisteisiin yhdistettävä suola koneen yksilöivän tunnisteen muodostamista varten. Vaihda arvo käyttöönottokohtaisesti ympäristöjen eristämiseksi. | -| `OMNIROUTE_CLI_SALT` | _(asettamaton = satunnainen asennuskohtainen suola, joka säilytetään tiedostossa `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-suola paikallisen CLI-todennustunnuksen johtamiseen. Tämän arvon asettaminen vaihtaa kaikki koneen CLI-tunnukset ja ohittaa aina säilytetyn suolan. Katso `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Asettaa istuntoevästeiden `Secure`-määritteen. Arvon **on oltava `true`**, kun palvelua käytetään HTTPS:n takana. | -| `REQUIRE_API_KEY` | `false` | API-väliohjelmisto | Kun arvona on `true`, kaikkien `/v1/*`-välityspyyntöjen on sisällettävä kelvollinen API-avain. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Mahdollistaa API-avainten täydellisten arvojen näyttämisen hallintapaneelin käyttöliittymässä. Määritettävissä hallintapaneelin ominaisuuslipuista; aiheuttaa tietoturvariskin jaetuissa instansseissa. | -| `NO_LOG_API_KEY_IDS` | _(tyhjä)_ | `src/lib/compliance/index.ts` | Pilkuilla erotetut API-avaintunnukset, joiden pyyntöjä ei kirjata lokiin (GDPR-vaatimustenmukaisuus). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(asettamaton = rajoittamaton)_ | `src/shared/utils/apiKeyPolicy.ts` | Päiväkohtainen varapyyntökiintiö, jota sovelletaan API-avaimiin, joiden `rate_limits`-sarake on null. Asettamaton tai tyhjä: ei implisiittistä ylärajaa (#2289, #11017). `0` tarkoittaa samaa (rajoittamaton). Positiivinen kokonaisluku N ottaa käyttöön rajat N/päivä, 5N/viikko ja 20N/kuukausi. Virheellisesti muotoillut ei-tyhjät arvot käyttävät varalla vanhoja rajoja 1000/päivä, 5000/viikko ja 20000/kuukausi. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Pyynnön rungon suurin sallittu koko. Tämän rajan ylittävät hyötykuormat hylätään. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Varsinaiset pyynnön rungot, joiden koko on vähintään tämä kynnysarvo, varaavat atomisesti prosessikohtaisen raskaan käsittelyn pääsyluvan ennen JSON-jäsennystä (BYTE-polku, mukaan lukien `POST /v1/responses`). Sama [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437):n terveen kapasiteettimarginaalin poikkeus kuin rakenteeltaan raskaissa pyynnöissä; edelleen `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`-arvon / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110):n rajoittama, jotta [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ei palaa. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Keskustelureitin ehdoton yläraja, joka tarkistetaan rajatun vastaanoton aikana luettujen tavujen perusteella, mukaan lukien pyynnöt, joiden `Content-Length` puuttuu, on virheellinen tai harhaanjohtava; rajan ylityksestä palautetaan `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(ei asetettu — ei pyyntömäärärajaa)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** tämä vanha pyyntöjen MÄÄRÄÄ koskeva raja on nyt voimassa vain, kun se asetetaan eksplisiittisesti. Kun sitä ei ole asetettu (oletus), raskaiden chat-pyyntöjen hyväksyntää rajoittaa sen sijaan `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaattisesti johdettu TAVUBUDJETTI, joka mitoitetaan prosessin todellisen muistirajan perusteella **yhdessä prosessissa** (yksi V8-keko). Kaksi päällekkäistä noin 750 000 tokenin `/v1/responses`-pyyntöä kaataa noin 12 GiB:n keot (#7849) — tämä on **muistibudjettia** koskeva varoitus, ei tuotteen ehdoton kahden pyynnön enimmäisraja. Terve prosessi (keko poistokynnyssuhteen alapuolella) VOI hyväksyä useampia samanaikaisia pitkiä `/v1/responses`-pyyntöjä asetuksen `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` kautta. Kymmenet pitkät SSE-asiakkaat (40–50) määräytyvät keon + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`-asetuksen / #10110 perusteella, eivät ”enintään 2” -rajan mukaan. Tämän arvon sokea kasvattaminen ”isäntäkoneen hyödyntämiseksi” tuo ongelman #7849 takaisin. Moninkertaista **keot** käyttämällä **N:ää riippumatonta `DATA_DIR`-hakemistoa** (#11024); älä koskaan käytä asetusta `replicas>1` yhdelle SQLite-tiedostolle. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(johdetaan automaattisesti)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** automaattisesti johdetun saapuvan datan tavubudjetin ohitus (25 % tiukemmasta V8-/cgroup-muistirajasta jaettuna 8-kertaisella tilapäisellä vahvistuskertoimella). Johdetut ja eksplisiittiset arvot rajataan välille 8 MiB–2 GiB. Tehollista budjettia suurempi runko hylätään välittömästi virheellä `413 body_exceeds_budget`; yksittäin käsiteltävissä olevien runkojen välinen kilpailutilanne palauttaa edelleen uudelleenyrityksen sallivan virheen `503`. 40–50 samanaikaista pitkää SSE-asiakasta määräytyy tämän budjetin + keon perusteella, eikä kyseessä ole ehdoton ”enintään 2” -raja. Tarkista arvot `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` osoitteessa `/api/monitoring/health` ennen säätämistä. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Kekopaineen poistokynnyssuhde (`heapUsed / heap_size_limit`) TAVU- ja RAKENNE-pohjaisten raskaiden pyyntöjen hyväksynnälle (#10183, #10268, #10437). `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`-rajan ylittävä samanaikainen raskas pyyntö poistetaan uudelleenyrityksen sallivalla `503`-virheellä vain, kun keko on MYÖS tämän suhteen tasolla tai sen yläpuolella; terveellä keolla pyyntö hyväksytään sen sijaan terveen keon lisäkapasiteetin kautta. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (oletus `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Rajattu lisäkapasiteetti terveen keon nopealle polulle (#10437) sekä RAKENNE- että TAVU-pohjaisessa hyväksynnässä (`admitChatRequest`, mukaan lukien rungot ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ilman tätä rajaa jokainen kiireisen mutta terveen keon pyyntö ohitti hyväksynnän ilman ylärajaa. Kun näin monta samanaikaista varausta on aktiivisena terveen keon polun kautta, seuraavat kiiretilanteen pyynnöt siirtyvät SAMAAN rajatun odotuksen / poiston polkuun, jota käytetään todellisessa kekopaineessa. `0` poistaa ohituksen kokonaan käytöstä. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Viestimäärä, joka luokittelee chat-pyynnön raskaaksi, vaikka sen runko alittaisi tavukynnyksen. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Työkalujen määrä, joka luokittelee chat-pyynnön raskaaksi, vaikka sen runko alittaisi tavukynnyksen. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservatiivinen merkkijonon kokoon perustuva token-arvio, joka luokittelee pyynnön raskaaksi; tämä on hyväksyntäkustannuksen likiarvo, ei palveluntarjoajan laskutuksessa käyttämä tokenisointi. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (poistettu käytöstä) | `src/shared/middleware/chatBodyAdmission.ts` | Valinnainen erikseen käyttöön otettava chat-historian raja. Oletusarvoisesti poistettu käytöstä: viestimäärä on käyttöönottokohtainen käytäntö, ei pyynnön yleispätevä ominaisuus, ja tässä asetettu raja hylkää keskustelut lopullisella `413`-virheellä ennen kuin pakkausputki voi tehdä niistä käsiteltäviä. Keon kasvua rajoittavat `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ja kekopaineeseen perustuva poisto. Aseta positiivinen arvo muistirajoitteisissa käyttöönotoissa, joissa tarvitaan ehdoton yläraja; rajan ylittävät pyynnöt saavat tällöin rakenteisen, tiivistämistä edellyttävän `413`-vastauksen. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Ehdoton raja ei-suoratoistettavalle ylävirran vastaukselle, joka puskuroidaan kokonaan muistiin. Kun raja ylittyy, ylävirran lukija peruutetaan ja pyyntö epäonnistuu nopeasti sen sijaan, että rajoittamaton merkkijono kasvaisi keon ehtymiseen asti. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Ylävirran vastausotsakkeista välitettävien tavujen enimmäismäärä siirtomuodossa. Kun budjetti ylittyy, alemman prioriteetin otsakkeet (esim. mukautetut `x-codex-*`, `x-oai-request-id`) jätetään pois yleisten käänteisten välityspalvelimien otsakerajojen noudattamiseksi. Aseta suurempi arvo, jos haluat välittää enemmän ylävirran metadataa suuremman vastausotsakekoon kustannuksella. | -| `CORS_ORIGIN` | _(määrittämätön)_ | `src/server/cors/origins.ts` | Vanha yhden alkuperän CORS-sallittujen luettelo. Käytä uusissa käyttöönotoissa mieluummin asetusta `CORS_ALLOWED_ORIGINS`. CORS on tarkoitettu vain eri alkuperää käyttäville selainpohjaisille API-asiakasohjelmille; todennetut hallintapaneelin kirjoituspyynnöt käyttävät sen sijaan saman alkuperän pyyntöjä ja istuntoon sidottua CSRF-suojausta. | -| `CORS_ALLOWED_ORIGINS` | _(määrittämätön)_ | `src/server/cors/origins.ts` | Pilkuilla eroteltu CORS-sallittujen luettelo. Jokerimerkkiä ei lähetetä, ellei asetusta `CORS_ALLOW_ALL=true` ole määritetty erikseen. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Vain kehityskäyttöön tarkoitettu ohitusasetus, joka palauttaa minkä tahansa selaimen `Origin`-arvon. Älä ota käyttöön jaetuissa ympäristöissä tai tuotantoympäristöissä. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Estä palveluntarjoajakutsut, jotka kohdistuvat yksityisiin, loopback- tai link-local-IP-alueisiin. Poista käytöstä vain eristetyissä testiympäristöissä. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Salli yksityisiin tai paikallisiin verkkoihin (localhost, 192.168.x.x, 10.x.x.x jne.) osoittavat palveluntarjoajien URL-osoitteet. **VAADITAAN itse ylläpidetyille palveluntarjoajille** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Kun arvo on `false`, hallintapaneeli hylkää paikallisten URL-osoitteiden validoinnin. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Salli paikallisissa tai yksityisissä osoitteissa (127.0.0.1, localhost, LAN, yksityiset osoitealueet) olevien palveluntarjoajien lisääminen ja validointi — rajattuna palveluntarjoajan validointipolkuun. **Oletusarvo on `true`** (paikallisuus ensin); aseta arvoksi `false`, jos haluat sallia vain julkiset osoitteet. Pilvipalvelujen metatietopäätepisteet (169.254.169.254, metadata.google.internal) pysyvät estettyinä asetuksesta riippumatta. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Salli `/v1/audio/*`-reittien (litteroinnit, puhe, käännökset) käyttää localhostin ulkopuolella isännöityä OpenAI-yhteensopivaa palveluntarjoajasolmua. Oletusarvoisesti poissa käytöstä — äänen reitittäminen etäisännälle muuttaa lähtevän liikenteen identiteettiä, joten ylläpitäjän on tehtävä tämä päätös erikseen. Loopback- ja yksityiset solmut (localhost, 127.0.0.1, 172.16-31.x) sallitaan aina, eikä asetus vaikuta niihin. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kun OIDC on käytössä, poista salasanakirjautuminen käytöstä, jotta käyttäjät voivat todentautua vain OIDC-kertakirjautumisella. Myös pelkkä alias `OIDC_DISABLE_PASSWORD_LOGIN` hyväksytään; saman avaimen hallintapaneelin ominaisuusasetus on etusijalla. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Asetuksen `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` pelkkä alias (#10889). | +| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Suola, joka yhdistetään laitteistotunnisteisiin koneen sormenjäljen muodostamista varten. Vaihda arvo käyttöönottokohtaisesti ympäristöjen eristämiseksi. | +| `OMNIROUTE_CLI_SALT` | _(asettamaton = satunnainen asennuskohtainen suola, joka säilytetään tiedostossa `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC-suola paikallisen CLI-todennustunnuksen johtamiseen. Tämän arvon asettaminen vaihtaa kaikki koneen CLI-tunnukset ja ohittaa aina säilytetyn suolan. Katso `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Asettaa istuntoevästeiden `Secure`-lipun. Arvon **on oltava `true`**, kun palvelua käytetään HTTPS:n takana. | +| `REQUIRE_API_KEY` | `false` | API-väliohjelmisto | Kun arvo on `true`, kaikkien `/v1/*`-välityspyyntöjen on sisällettävä kelvollinen API-avain. **Tämä lippu ei rajoita `GET /v1/models` -päätepistettä**, vaan se noudattaa hallintapaneelin kirjautumiskäytäntöä (`requireAuthForModels`) — siksi `/v1/models`-päätepisteen palauttama `401` EI tarkoita, että päättely olisi suojattu. Katso `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Sallii API-avainten täydellisten arvojen näyttämisen hallintapaneelin käyttöliittymässä. Määritettävissä hallintapaneelin ominaisuuslipuista; aiheuttaa tietoturvariskin jaetuissa instansseissa. | +| `NO_LOG_API_KEY_IDS` | _(tyhjä)_ | `src/lib/compliance/index.ts` | Pilkuilla erotetut API-avaintunnukset, joiden pyyntöjä ei kirjata lokiin (GDPR-vaatimustenmukaisuus). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(asettamaton = rajoittamaton)_ | `src/shared/utils/apiKeyPolicy.ts` | Päiväkohtainen pyyntöbudjetin vara-arvo, jota sovelletaan API-avaimiin, joiden `rate_limits`-sarake on null. Asettamaton tai tyhjä: ei implisiittistä rajoitusta (#2289, #11017). Myös `0` tarkoittaa samaa (rajoittamaton). Positiivinen kokonaisluku N ottaa käyttöön rajat N/päivä, 5N/viikko ja 20N/kuukausi. Virheellisesti muotoillut ei-tyhjät arvot käyttävät vanhoja rajoja 1000/päivä, 5000/viikko ja 20000/kuukausi. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Pyynnön rungon suurin sallittu koko. Tämän rajan ylittävät hyötykuormat hylätään. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Tämän raja-arvon kokoiset tai sitä suuremmat varsinaiset pyyntörungot varaavat atomisesti prosessipaikallisen raskaan käsittelyn pääsyluvan ennen JSON-jäsennystä (BYTE-polku, mukaan lukien `POST /v1/responses`). Sama [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437)-muutoksen terveen kapasiteettimarginaalin poikkeus kuin rakenteellisesti raskaissa pyynnöissä; edelleen `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`-arvon / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110)-muutoksen rajoittama, jotta [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ei toistu. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 Mt) | `src/shared/middleware/chatBodyAdmission.ts` | Chat-reitin ehdoton raja, joka tarkistetaan rajatun vastaanoton aikana luettujen tavujen perusteella, mukaan lukien pyynnöt, joiden `Content-Length` puuttuu, on virheellinen tai ilmoittaa koon totuudenvastaisesti; rajan ylityksestä palautetaan `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(ei asetettu — ei pyyntömäärän rajaa)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** tämä vanha pyyntöjen MÄÄRÄÄ rajoittava asetus vaikuttaa nyt vain, kun se on asetettu eksplisiittisesti. Kun sitä ei ole asetettu (oletus), raskaiden chat-pyyntöjen hyväksyntää rajoittaa sen sijaan `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — automaattisesti johdettu TAVUbudjetti, joka mitoitetaan prosessin todellisen muistirajan perusteella **yhdessä prosessissa** (yksi V8-keko). Kaksi päällekkäistä, noin 750 000 tunnisteen `/v1/responses`-pyyntöä kaataa noin 12 Gi:n keot (#7849) — tämä on **muistibudjettia** koskeva varoitus, ei tuotteen ehdoton kahden pyynnön enimmäismäärä. Terve prosessi (keko hylkäyssuhteen alapuolella) VOI hyväksyä useampia samanaikaisia pitkiä `/v1/responses`-pyyntöjä asetuksen `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` kautta. Kymmenissä pitkissä SSE-asiakkaissa (40–50) on kyse keosta + asetuksesta `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ei ”enintään kahdesta”. Tämän arvon sokea kasvattaminen ”isäntäkoneen hyödyntämiseksi” tuo ongelman #7849 takaisin. Moninkertaista **keot** käyttämällä **N:ää riippumatonta `DATA_DIR`-hakemistoa** (#11024); älä koskaan käytä asetusta `replicas>1` yhdelle SQLite-tiedostolle. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(johdetaan automaattisesti)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** automaattisesti johdetun vastaanoton tavubudjetin ohitus (25 % tiukemmasta V8-/cgroup-muistirajasta jaettuna kahdeksankertaisella tilapäisellä vahvistuskertoimella). Johdetut ja eksplisiittiset arvot rajataan välille 8 MiB–2 GiB. Tehollista budjettia suurempi runko hylätään välittömästi virheellä `413 body_exceeds_budget`; yksittäin käsiteltävissä olevien runkojen välinen resurssikilpailu palauttaa edelleen uudelleenyrityksen sallivan virheen `503`. 40–50 samanaikaisessa pitkässä SSE-asiakkaassa on kyse tästä budjetista + keosta, ei ehdottomasta ”enintään kahden” rajasta. Tarkista arvot `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` osoitteesta `/api/monitoring/health` ennen säätämistä. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Kekopaineen hylkäyssuhde (`heapUsed / heap_size_limit`) TAVU- ja RAKENNEperusteiselle raskaiden pyyntöjen hyväksynnälle (#10183, #10268, #10437). Raja-arvon `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ylittävä samanaikainen raskas pyyntö hylätään uudelleenyrityksen sallivalla virheellä `503` vain, kun keko on MYÖS tämän suhteen tasolla tai sen yläpuolella; terveellä keolla se hyväksytään terveen tilan lisäkapasiteetin kautta. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (oletus `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Rajattu lisäkapasiteetti terveen keon nopealle polulle (#10437) **sekä** RAKENNE- että TAVUperusteisessa hyväksynnässä (`admitChatRequest`, mukaan lukien rungot ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ilman tätä rajaa jokainen ruuhka-aikana saapuva pyyntö ohitti hyväksyntärajoituksen ilman ylärajaa, jos keko oli terve. Kun näin monta samanaikaista varausta on aktiivisena terveen keon polulla, uudet ruuhka-aikana saapuvat pyynnöt siirtyvät SAMAAN rajatun odotuksen ja hylkäyksen polkuun, jota käytetään todellisen kekopaineen aikana. `0` poistaa ohituksen kokonaan käytöstä. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Viestimäärä, jonka perusteella chat-pyyntö luokitellaan raskaaksi, vaikka sen runko alittaisi tavurajan. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Työkalumäärä, jonka perusteella chat-pyyntö luokitellaan raskaaksi, vaikka sen runko alittaisi tavurajan. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konservatiivinen merkkijonon kokoon perustuva tunnistearvio, jonka perusteella pyyntö luokitellaan raskaaksi; tämä on hyväksyntäkustannuksen likiarvo, ei palveluntarjoajan laskutuksessa käyttämä tokenisointi. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (poistettu käytöstä) | `src/shared/middleware/chatBodyAdmission.ts` | Valinnainen erikseen käyttöönotettava chat-historian raja. Oletusarvoisesti poissa käytöstä: viestimäärä on käyttöympäristökohtainen käytäntö, ei pyynnön yleispätevä ominaisuus, ja tässä asetettu raja hylkäisi keskustelut lopullisella virheellä `413` ennen kuin pakkausputki ehtisi tehdä niistä käsiteltäviä. Keon kasvua rajoittavat `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ja kekopaineeseen perustuva hylkäys. Aseta positiivinen arvo muistirajoitteisissa käyttöympäristöissä, joissa tarvitaan ehdoton yläraja; rajan ylityksestä palautetaan tällöin rakenteinen, pakkauksen tarpeesta ilmoittava virhe `413`. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 Mt) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Ehdoton raja suoratoistamattomalle ylävirran vastaukselle, joka puskuroidaan kokonaan muistiin. Kun raja ylittyy, ylävirran lukija peruutetaan ja pyyntö epäonnistuu nopeasti sen sijaan, että rajattomasti kasvava merkkijono jatkaisi kasvuaan keon loppumiseen asti. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Ylävirran vastauksen otsakkeista välitettävien tavujen enimmäismäärä siirtomuodossa. Kun budjetti ylittyy, alemman prioriteetin otsakkeet (esim. mukautetut `x-codex-*`-otsakkeet ja `x-oai-request-id`) poistetaan, jotta pysytään yleisten käänteisten välityspalvelinten otsakerajojen sisällä. Aseta suuremmaksi, jos haluat välittää enemmän ylävirran metatietoja suuremman vastausotsakekoon kustannuksella. | +| `CORS_ORIGIN` | _(ei asetettu)_ | `src/server/cors/origins.ts` | Vanha yhden alkuperän CORS-sallittujen luettelo. Käytä uusissa käyttöönotoissa mieluummin asetusta `CORS_ALLOWED_ORIGINS`. CORS on tarkoitettu vain eri alkuperästä tuleville selaimen API-asiakkaille; todennetut hallintapaneelin kirjoituspyynnöt käyttävät sen sijaan saman alkuperän pyyntöjä sekä istuntoon sidottua CSRF-suojausta. | +| `CORS_ALLOWED_ORIGINS` | _(ei asetettu)_ | `src/server/cors/origins.ts` | Pilkuilla eroteltu CORS-sallittujen luettelo. Jokerimerkkiä ei lähetetä, ellei asetusta `CORS_ALLOW_ALL=true` ole määritetty nimenomaisesti. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Vain kehityskäyttöön tarkoitettu vararatkaisu, joka palauttaa minkä tahansa selaimen `Origin`-arvon. Älä ota tätä käyttöön jaetuissa ympäristöissä tai tuotantokäyttöönotoissa. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Estä palveluntarjoajakutsut, jotka kohdistuvat yksityisiin, loopback- tai link-local-IP-osoitealueisiin. Poista käytöstä vain eristetyissä testiympäristöissä. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Salli yksityisiin tai paikallisiin verkkoihin (localhost, 192.168.x.x, 10.x.x.x jne.) osoittavat palveluntarjoajien URL-osoitteet. **VAADITAAN itse ylläpidetyille palveluntarjoajille** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Kun arvo on `false`, hallintapaneeli hylkää paikallisten URL-osoitteiden validoinnin. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Salli palveluntarjoajien lisääminen ja validointi paikallisissa tai yksityisissä osoitteissa (127.0.0.1, localhost, lähiverkko, yksityiset osoitealueet) — koskee vain palveluntarjoajan validointipolkua. **Oletusarvo on `true`** (paikallisuus ensisijaisena); aseta arvoksi `false`, jos haluat sallia tiukasti vain julkiset osoitteet. Pilvipalvelujen metatietopäätepisteet (169.254.169.254, metadata.google.internal) pysyvät estettyinä asetuksesta riippumatta. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Salli `/v1/audio/*`-reittien (litterointi, puhe, käännökset) käyttää localhostin ulkopuolella ylläpidettyä OpenAI-yhteensopivaa palveluntarjoajasolmua. Oletusarvoisesti pois käytöstä — äänen reitittäminen etäisännälle muuttaa ulospäin suuntautuvan liikenteen identiteettiä, joten operaattorin on tehtävä siitä nimenomainen päätös. Loopback- ja yksityiset solmut (localhost, 127.0.0.1, 172.16-31.x) ovat aina sallittuja, eikä asetus vaikuta niihin. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Salli `POST /v1/rerank`-pyynnön (sekä muistimoottorin loopback-uudelleenjärjestelyvaiheen) käyttää localhostin ulkopuolella ylläpidettyä OpenAI-yhteensopivaa palveluntarjoajasolmua — esimerkiksi TEI:tä, Infinityä, vLLM:ää tai muuta vastaavaa suorittavaa lähiverkkolaitetta tai Tailscale-vertaisjärjestelmää. Oletusarvoisesti pois käytöstä — etäisännälle reitittäminen muuttaa ulospäin suuntautuvan liikenteen identiteettiä, joten operaattorin on tehtävä siitä nimenomainen päätös. Loopback-solmut (localhost, 127.0.0.1, 172.16-31.x) ovat aina sallittuja, eikä asetus vaikuta niihin. Etäsolmujen on myös läpäistävä palveluntarjoajan lähtevien URL-osoitteiden käytäntö (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); pilvipalvelujen metatieto-isäntiin ei koskaan reititetä. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kun OIDC on käytössä, poista salasanakirjautuminen käytöstä, jotta käyttäjät voivat tunnistautua vain OIDC-kertakirjautumisella. Myös pelkkä alias `OIDC_DISABLE_PASSWORD_LOGIN` hyväksytään; saman avaimen hallintapaneelin ominaisuuslippu on etusijalla. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Asetuksen `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` pelkkä alias (#10889). | ### Suojauksen tarkistuslista ```bash -# Tuotantoympäristön tietoturvan vähimmäisvaatimukset: -AUTH_COOKIE_SECURE=true # Edellyttää HTTPS:ää +# Tuotantoturvallisuuden vähimmäisvaatimukset: +AUTH_COOKIE_SECURE=true # Vaatii HTTPS-yhteyden REQUIRE_API_KEY=true # Todenna kaikki välityspalvelinkutsut -ALLOW_API_KEY_REVEAL=false # Älä koskaan paljasta avaimia käyttöliittymässä +ALLOW_API_KEY_REVEAL=false # Älä koskaan näytä avaimia käyttöliittymässä CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # 5 MB:n rajoitus +MAX_BODY_SIZE_BYTES=5242880 # 5 MB:n raja ``` --- @@ -302,59 +302,66 @@ OmniRoute tarjoaa kaksitasoisen suojauksen: pyyntöpuolen injektioiden tarkistuk ## 6. Työkalu- ja reitityskäytännöt -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Hallitsee LLM:n pääsyä työkalujen ja funktioiden kutsumiseen. `allowlist` = vain luetellut työkalut, `denylist` = kaikki muut paitsi luetellut, `disabled` = ei rajoituksia. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Polku hyötykuorman käsittelysääntöjen JSON-tiedostoon (malli- tai protokollakohtaiset muutokset ylävirran palveluihin). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Hyötykuorman sääntötiedoston dynaamisen uudelleenlatauksen aikaväli (ms). Vähintään `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Valinnainen asetus: reititä Claude Code -asiakasohjelmien pelkät `claude-*`-mallitunnukset Claude Code OAuth -tilin kautta sen sijaan, että vaadittaisiin palveluntarjoajan etuliite. Eksplisiittiset palveluntarjoajan etuliitteet ovat edelleen etusijalla. Määritettävissä myös koontinäytön valitsimella Claude-palveluntarjoajan sivulla. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Mallikohtainen samanaikaisuusraja vuorotteluyhdistelmille (#9100). Vuorotteluyhdistelmien semafori oli kiinteästi rajoitettu kolmeen samanaikaiseen pyyntöön mallia kohden ilman mahdollisuutta ohittaa rajaa, mikä asetti suuremman samanaikaisuuden liikenteen sarjamuotoiseen jonoon tämän rajan taakse. Arvon on oltava `>= 1`, ja se rajataan arvoon `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Vaarallinen valinnainen asetus, joka ohittaa OmniRouten paikallisen konteksti-ikkunan / syötteen enimmäistunnusmäärän tarkistuksen suorissa yhden mallin pyynnöissä. Ylävirran palveluntarjoajat valvovat edelleen todellisia rajojaan; kehotteen pakkaus ja mallin oma tulostetunnusten raja pysyvät käytössä. Käytännön prioriteettijärjestys on ominaisuuslippujen tietokannan ohitus > ympäristömuuttuja > oletusarvo; uudelleenkäynnistystä ei tarvita. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(ei asetettu)_ | `open-sse/services/conversationTracker.ts` | Aseta arvoksi `1`, jos haluat lopettaa keskusteluhistorian keräämisen. `resolveConversationId()` palauttaa seuraamattoman tuloksen ennen kuin se lukee SQLitestä tai jäsentää viestihistoriaa, ja tämä koskee myös asiakkaan toimittamia istuntotunnuksia. Reititysistuntojen käsittely pysyy ennallaan, eikä olemassa olevia tietueita poisteta. Tarkoitettu käyttöönottoihin, joissa ei käytetä koontinäytön keskustelunäkymää ja joissa halutaan estää vuorotaulun jatkuva kasvu. | +| Muuttuja | Oletus | Lähdetiedosto | Kuvaus | +| ----------------------------------------------------------- | ------------------------------ | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Hallitsee LLM:n pääsyä työkalujen ja funktioiden kutsumiseen. `allowlist` = vain luetellut työkalut, `denylist` = kaikki paitsi luetellut, `disabled` = ei rajoituksia. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Hyötykuorman käsittelysääntöjen JSON-tiedoston polku (malli- ja protokollakohtaiset ylävirran mukautukset). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Hyötykuorman sääntötiedoston ajonaikaisen uudelleenlatauksen aikaväli (ms). Vähintään `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Valinnainen asetus: reitittää Claude Code -asiakkaiden etuliitteettömät `claude-*`-mallitunnukset Claude Code OAuth -tilin kautta sen sijaan, että vaadittaisiin palveluntarjoajan etuliite. Eksplisiittiset palveluntarjoajan etuliitteet ovat edelleen ensisijaisia. Määritettävissä myös Claude-palveluntarjoajan sivulla olevan hallintapaneelin valitsimen kautta. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Mallikohtainen samanaikaisuusraja vuorotteluyhdistelmille (#9100). Vuorotteluyhdistelmän semaforin mallikohtainen enimmäismäärä oli kiinteästi 3 samanaikaista pyyntöä ilman ohitusmahdollisuutta, minkä vuoksi suuremman samanaikaisuuden liikenne jonoutui tämän rajan taakse. Vahvistetaan ehdolla `>= 1` ja rajataan arvoon `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Vaarallinen valinnainen asetus, joka ohittaa OmniRouten paikallisen konteksti-ikkunan / syötteen enimmäistunnusmäärän tarkistuksen suorissa yhden mallin pyynnöissä. Ylävirran palveluntarjoajat valvovat edelleen todellisia rajojaan; kehotteen pakkaus ja mallin oma tulostetunnusten enimmäismäärä pysyvät käytössä. Käytännön prioriteettijärjestys on Feature Flags -tietokannan ohitus > ympäristömuuttuja > oletus; uudelleenkäynnistystä ei tarvita. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(ei asetettu)_ | `open-sse/services/selfHostedEntry.ts` | Sisäinen YAML-`providers:`-asiakirja (RIC-738, D4). Kun se on asetettu (`strategy:`-lohkon kanssa tai ilman), `/v1/chat/completions` ohjataan pilviputken sijasta itse ylläpidettyyn, yhtenäiseen OpenAI-yhteensopivaan käsittelypisteeseen. Kun sitä ei ole asetettu (oletus), reitti jatkaa suoraan olemassa olevaan pilviputkeen. Katso `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(ei asetettu)_ | `open-sse/services/selfHostedEntry.ts` | Polku YAML-tiedostoon, joka sisältää saman `providers:`-asiakirjan kuin `OMNIROUTE_SELF_HOSTED_PROVIDERS`; tarkoitettu käyttöönottoihin, joissa tiedostoa suositaan sisäisen ympäristömuuttujan sijasta. Kumpi tahansa aktivoi itse ylläpidetyn käsittelypisteen. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(ei asetettu — avoin reitti)_ | `open-sse/services/selfHostedEntry.ts` | Valinnainen jaettu API-avain yhtenäiselle itse ylläpidetylle käsittelypisteelle (D5-runko, varattu avainkohtaista kiintiöjärjestelmää varten). Kun se on asetettu, pyyntöjen on sisällettävä `Authorization: Bearer `. Kun sitä ei ole asetettu, reitti on avoin nykyisen itse ylläpidettyjen paikallisten palveluntarjoajien mallin mukaisesti (käyttöönotto takaisinkytkentäosoitteessa tai luotetussa verkossa). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(ei asetettu)_ | `open-sse/services/routingStrategies.ts` | Sisäinen YAML-`strategy:`-asiakirja deterministiselle reititysmoottorille (M2/RIC-740, D3) — esto-/sallintalista, palautumisajallinen katkaisija, kustannusprioriteetti, viivetietoinen reititys ja varaketju. Ohittaa avainkohtaisesti `OMNIROUTE_SELF_HOSTED_PROVIDERS`-muuttujan sisälle upotetun `strategy:`-lohkon. Katso `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(ei asetettu)_ | `open-sse/services/routingStrategies.ts` | Polku YAML-tiedostoon, joka sisältää saman `strategy:`-asiakirjan kuin `OMNIROUTE_SELF_HOSTED_STRATEGY`; tarkoitettu käyttöönottoihin, joissa tiedostoa suositaan sisäisen ympäristömuuttujan sijasta. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(ei asetettu)_ | `open-sse/services/conversationTracker.ts` | Aseta arvoksi `1`, jos haluat lopettaa keskusteluhistorian keräämisen. `resolveConversationId()` palauttaa seuraamattoman tuloksen ennen SQLite-tietokannan lukemista tai viestihistorian jäsentämistä, ja tämä koskee myös asiakkaan toimittamia istuntotunnuksia. Reititysistuntojen käsittely säilyy ennallaan, eikä olemassa olevia tietueita poisteta. Tarkoitettu käyttöönottoihin, joissa hallintapaneelin keskustelunäkymää ei käytetä ja joissa vuorotaulukon kasvaminen halutaan pysäyttää. | --- ## 7. URL-osoitteet ja pilvisynkronointi -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Palvelinpuolen URL-osoite, jonka kautta sisäiset synkronointityöt kutsuvat `/api/sync/cloud`-päätepistettä. Säilytä tämä loopback-/säilö-URL-osoitteena myös silloin, kun sovellus välitetään julkisesti välityspalvelimen kautta. | -| `CLOUD_URL` | _(tyhjä)_ | `src/lib/cloudSync.ts` | Pilvireleen päätepisteen URL-osoite (premium-ominaisuus). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Pilvisynkronointipyyntöjen HTTP-aikakatkaisu. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack-koontimääritykset | Koontiaikainen profiili (aseta arvoksi `minimal`, jotta etuoikeutetut moduulit jätetään fyysisesti pois paketista). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone-tuloste_ | `scripts/build/colocate-standalone.mjs` | Koontiaikainen ohitus itsenäisen tulosteen hakemistolle, jota koonnin jälkeinen rinnakkainasetteluvaihe käyttää. Ei ole ajonaikainen asetus. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(tyhjä)_ | `src/lib/cloudSync.ts` | Jaettu salaisuus, jolla Cloud Sync -vastausten HMAC-SHA256-allekirjoitus vahvistetaan. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Aseta arvoksi `true`, jotta Cloud Sync -päätepiste voi korvata paikalliset tunnistetiedot. Oletusarvo on `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Aseta arvoksi `true`, jotta allekirjoittamaton Cloud Sync -vastaus hylätään, kun paikallista salaisuutta ei ole määritetty (#13679). Mukana oleva allekirjoitus vahvistetaan aina — ja hylätään aina, jos `OMNIROUTE_CLOUD_SYNC_SECRET` ei ole asetettu — tämän asetuksen arvosta riippumatta. Oletusarvoksi tulee pakotettu vahvistus versiossa v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Aseta arvoksi `true`, jotta palataan version v3.8.5 yksivaiheiseen ”tuo kaikki” -toimintaan ilman käyttäjän vahvistusta. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, hallintapaneeli, synkronointi | Julkinen URL-osoite OAuthin `redirect_uri`-arvolle, hallintapaneelin linkeille ja luoduille julkisille URL-osoitteille. Aseta tämä vakaaksi julkiseksi URL-osoitteeksi, kun OAuth-palautuskutsujen tai luotujen selainlinkkien on käytettävä kanonista käänteisen välityspalvelimen isäntää. | -| `NEXT_PUBLIC_CLOUD_URL` | _(tyhjä)_ | Asiakaspuoli | Muuttujan `CLOUD_URL` asiakaspuolen vastine. | -| `NEXT_PUBLIC_APP_URL` | _(ei asetettu)_ | `src/shared/services/cloudSyncScheduler.ts` | Vanha varavaihtoehto muuttujalle `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(ei asetettu)_ | Julkisen alkuperän selvitys, kuvien URL-osoitteet | Ensisijaisin selaimelle näkyvä OmniRoute-alkuperä, jota käytetään julkisten URL-osoitteiden luomiseen ja muiden kuin hallintapaneelipyyntöjen selainalkuperän vahvistamiseen. Aseta tämä, kun OpenWebUI tai jokin muu rele käyttää OmniRoutea sisäisen URL-osoitteen kautta, mutta käyttäjän selaimen on noudettava luotu media lähiverkko-, tunneli- tai julkisesta alkuperästä. **Älä** sisällytä osaa `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(ei asetettu)_ | `open-sse/config/providerPluginManifestUrl.ts` | Sivuprosessiasiakkaille ilmoitettava palveluntarjoajalaajennusten manifestin absoluuttinen URL-osoite. Kun arvoa ei ole asetettu, OmniRoute johtaa polun `/api/v1/provider-plugin-manifest` pyynnön alkuperästä tai arvoista HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokolla, jota käytetään johdettaessa palveluntarjoajalaajennusten manifestin URL-osoite arvoista HOST/PORT ilman pyynnön alkuperää. Aseta arvoksi `https` TLS:n päättävän julkisen välityspalvelimen takana, kun eksplisiittistä `OMNIROUTE_PROVIDER_MANIFEST_URL`-arvoa ei ole asetettu. | -| `OMNIROUTE_TRUST_PROXY` | _(ei asetettu)_ | `src/server/origin/publicOrigin.ts` | Valinnainen luottamustila välitetyille julkisen alkuperän otsakkeille. Asettamaton = älä luota `Forwarded`- tai `X-Forwarded-*`-otsakkeisiin tietoturvapäätöksissä. `true` / `loopback` luottaa välitettyyn isäntään/protokollaan vain tunnuksella merkatulta loopback-välityspalvelimelta. `private` / `lan` luottaa myös yksityisen lähiverkon välityspalvelinvertaisiin. Suosi tuotannossa eksplisiittistä `NEXT_PUBLIC_BASE_URL`-arvoa. | -| `KIE_CALLBACK_URL` | _(ei asetettu)_ | `open-sse/utils/kieTask.ts` | Julkinen takaisinkutsu-URL asynkronisille kie.ai-töille. Ensisijaisin ohitus ennen muuttujia `OMNIROUTE_KIE_CALLBACK_URL` ja `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(ei asetettu)_ | `open-sse/utils/kieTask.ts` | Muuttujan `KIE_CALLBACK_URL` vaihtoehtoinen kirjoitusasu. Toimii varavaihtoehtona, kun ensisijaista muuttujaa ei ole asetettu. | -| `OMNIROUTE_PUBLIC_URL` | _(ei asetettu)_ | `open-sse/utils/kieTask.ts` | Julkinen alkuperä, jota käytetään asynkronisten takaisinkutsu-URL-osoitteiden muodostamiseen. Toissijaisin varavaihtoehto kie.ai-takaisinkutsuille; käytetään myös muiden releiden yleisenä julkisena URL-osoitteena. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Käyttösivun käyttämä CrofAI-kiintiön hakupäätepiste. Ohita releitä/testisyötteitä varten. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Käyttösivun käyttämä virallinen API-avaimella todennettu OpenCode Go -käyttöpäätepiste. Ohita releitä/testisyötteitä varten. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Muodosta OpenCode CLI:n tunnisteotsakkeet (User-Agent, x-opencode-client/project, pyyntö-/istunto-UUID:t) sellaisiin opencode-go/zen-ylävirtapyyntöihin, joissa asiakas ei lähettänyt niitä, jotta VPS:n lähtevässä liikenteessä oleva Cloudflare hyväksyy ne (#6210/#5997). Oletuksena käytössä muutoksesta #10571 lähtien; poista käytöstä arvolla `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Oletusarvoinen User-Agent, jota käytetään, kun `OPENCODE_SYNTHESIZE_CLI_HEADERS` on käytössä eikä palveluntarjoajakohtaista `_USER_AGENT`-ohitusta ole asetettu. Sovelletaan vain opencode-suorittimiin. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Muodostetun `x-opencode-client`-otsakkeen arvo, kun `OPENCODE_SYNTHESIZE_CLI_HEADERS` on käytössä. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Muodostetun `x-opencode-project`-otsakkeen arvo, kun `OPENCODE_SYNTHESIZE_CLI_HEADERS` on käytössä. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Kiintiötietojen keräämiseen käytettävä Ollama Cloud -asetusten URL-osoite. Ohita releitä/testisyötteitä varten. | -| `OLLAMA_USAGE_COOKIE` | _(ei asetettu)_ | `open-sse/services/usage.ts` | Ollama Cloudin `__Secure-session`-eväste, jota käytetään kiintiötietojen keräämiseen asetussivulta. Arkaluonteinen; suosi yhteyskohtaista hallintapaneelin kenttää, kun useita tilejä on määritetty. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(ei asetettu)_ | `open-sse/services/usage.ts` | Vaihtoehtoinen Ollama Cloudin `__Secure-session`-evästeen ympäristömuuttuja. Arkaluonteinen; suosi yhteyskohtaista hallintapaneelin kenttää, kun useita tilejä on määritetty. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(ei asetettu)_ | `open-sse/services/usage.ts` | Vaihtoehtoinen Ollama Cloudin `__Secure-session`-evästeen ympäristömuuttuja, jota käytetään ennen lyhyempiä aliaksia. Arkaluonteinen; suosi yhteyskohtaista hallintapaneelin kenttää, kun useita tilejä on määritetty. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhispererin (AWS Kiro) käyttörajojen päätepiste. Ohita releitä/testisyötteitä varten. | +| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | Palvelinpuolen URL-osoite, jonka kautta sisäiset synkronointityöt kutsuvat `/api/sync/cloud`-päätepistettä. Säilytä tämä takaisinkytkentä- tai säilö-URL-osoitteena silloinkin, kun sovellus välitetään julkisesti käänteisen välityspalvelimen kautta. | +| `CLOUD_URL` | _(tyhjä)_ | `src/lib/cloudSync.ts` | Pilvivälityksen päätepisteen URL-osoite (premium-ominaisuus). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Pilvisynkronointipyyntöjen HTTP-aikakatkaisu. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack-koontimääritykset | Koontiaikainen profiili (aseta arvoksi `minimal`, jos haluat jättää etuoikeutetut moduulit fyysisesti pois paketista). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone-tuloste_ | `scripts/build/colocate-standalone.mjs` | Koontiaikainen ohitus erillistulostehakemistolle, jota koonnin jälkeinen rinnakkain sijoittamisen vaihe käyttää. Ei ole ajonaikainen asetus. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(tyhjä)_ | `src/lib/cloudSync.ts` | Jaettu salaisuus, jolla Cloud Sync -vastausten HMAC-SHA256-allekirjoitus varmennetaan. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Aseta arvoksi `true`, jotta Cloud Sync -päätepiste voi korvata paikalliset tunnistetiedot. Oletusarvo on `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Aseta arvoksi `true`, jos allekirjoittamaton Cloud Sync -vastaus halutaan hylätä, kun paikallista salaisuutta ei ole määritetty (#13679). Jos allekirjoitus on mukana, se varmennetaan aina — ja hylätään aina, kun `OMNIROUTE_CLOUD_SYNC_SECRET` ei ole asetettu — tämän asetuksen arvosta riippumatta. Oletusarvoksi tulee pakotettu varmennus versiossa v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Aseta arvoksi `true`, jos haluat palata version v3.8.5 yksivaiheiseen ”tuo kaikki” -toimintaan ilman käyttäjän vahvistusta. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, hallintapaneeli, synkronointi | Julkinen URL-osoite OAuth-parametrille redirect_uri, hallintapaneelin linkeille ja luoduille julkisille URL-osoitteille. Aseta tämä vakaaksi julkiseksi URL-osoitteeksi, kun OAuth-paluukutsujen tai luotujen selainlinkkien on käytettävä kanonista käänteisen välityspalvelimen isäntää. | +| `NEXT_PUBLIC_CLOUD_URL` | _(tyhjä)_ | Asiakaspuoli | Asiakaspuolen vastine muuttujalle `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(asettamaton)_ | `src/shared/services/cloudSyncScheduler.ts` | Vanha varavaihtoehto muuttujalle `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(asettamaton)_ | Julkisen alkuperän selvitys, kuvien URL-osoitteet | Ensisijaisin selaimelle näkyvä OmniRoute-alkuperä, jota käytetään julkisten URL-osoitteiden luomiseen ja muiden kuin koontinäyttöjen selainalkuperän validointiin. Aseta tämä, kun OpenWebUI tai jokin muu välityspalvelu käyttää OmniRoutea sisäisen URL-osoitteen kautta, mutta käyttäjän selaimen on haettava luotu media lähiverkosta, tunnelista tai julkisesta alkuperästä. **Älä** sisällytä polkua `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(asettamaton)_ | `open-sse/config/providerPluginManifestUrl.ts` | Sivupalkkiasiakkaille ilmoitettava palveluntarjoajalaajennuksen manifestin absoluuttinen URL-osoite. Kun muuttujaa ei ole asetettu, OmniRoute johtaa polun `/api/v1/provider-plugin-manifest` pyynnön alkuperästä tai HOST/PORT-arvoista. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokolla, jota käytetään johdettaessa palveluntarjoajalaajennuksen manifestin URL-osoite HOST/PORT-arvoista ilman pyynnön alkuperää. Aseta arvoksi `https` TLS-yhteyden päättävän julkisen välityspalvelimen takana, kun nimenomaista `OMNIROUTE_PROVIDER_MANIFEST_URL`-arvoa ei ole asetettu. | +| `OMNIROUTE_TRUST_PROXY` | _(asettamaton)_ | `src/server/origin/publicOrigin.ts` | Valinnainen luottamustila välitetyille julkisen alkuperän otsakkeille. Asettamaton = älä luota `Forwarded`- / `X-Forwarded-*`-otsakkeisiin tietoturvapäätöksissä. `true` / `loopback` luottaa välitettyyn isäntään/protokollaan vain tunnisteella merkatulta loopback-välityspalvelimelta. `private` / `lan` luottaa myös yksityisen lähiverkon välityspalvelinvertaisiin. Suosi tuotannossa nimenomaista `NEXT_PUBLIC_BASE_URL`-arvoa. | +| `KIE_CALLBACK_URL` | _(asettamaton)_ | `open-sse/utils/kieTask.ts` | Julkinen takaisinkutsu-URL asynkronisille kie.ai-töille. Ensisijaisin ohitus ennen muuttujia `OMNIROUTE_KIE_CALLBACK_URL` ja `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(asettamaton)_ | `open-sse/utils/kieTask.ts` | Muuttujan `KIE_CALLBACK_URL` vaihtoehtoinen kirjoitusasu. Käytetään varavaihtoehtona, kun ensisijaista muuttujaa ei ole asetettu. | +| `OMNIROUTE_PUBLIC_URL` | _(asettamaton)_ | `open-sse/utils/kieTask.ts` | Julkinen alkuperä, jota käytetään asynkronisten takaisinkutsu-URL-osoitteiden muodostamiseen. Viimesijainen varavaihtoehto kie.ai-takaisinkutsuille; käytetään myös muiden välityspalvelujen yleisenä julkisena URL-osoitteena. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage-sivun käyttämä CrofAI-kiintiön hakupäätepiste. Ohita välityspalvelimia / testikiinnitteitä varten. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage-sivun käyttämä virallinen API-avaimella todennettava OpenCode Go -käyttöpäätepiste. Ohita välityspalvelimia / testikiinnitteitä varten. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Muodosta synteettisesti OpenCode CLI -identiteettiotsakkeet (User-Agent, x-opencode-client/project, pyyntö-/istunto-UUID:t) opencode-go/zen-ylävirran pyyntöihin, joissa asiakas ei lähettänyt niitä, jotta Cloudflare hyväksyy ne VPS:n ulosmenoliikenteessä (#6210/#5997). Oletusarvoisesti käytössä versiosta #10571 alkaen; poista käytöstä arvolla `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Oletusarvoinen User-Agent, jota käytetään, kun `OPENCODE_SYNTHESIZE_CLI_HEADERS` on käytössä eikä palveluntarjoajakohtaista `_USER_AGENT`-ohitusta ole asetettu. Sovelletaan vain opencode-suorittimiin. Jos ylävirta estää avaimettoman pyynnön, määritetty arvo, joka ei sisällä tunnistetta `opencode/= 1.17>`, korvataan tällä oletusarvolla hylkäämisen sijaan. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Synteettisesti muodostetun `x-opencode-client`-otsakkeen arvo, kun `OPENCODE_SYNTHESIZE_CLI_HEADERS` on käytössä. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Synteettisen `x-opencode-project`-otsakkeen arvo, kun `OPENCODE_SYNTHESIZE_CLI_HEADERS` on käytössä. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(ei asetettu)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Aseta arvoksi `off`, jos haluat estää avaimettomien OpenCode-pyyntöjen rungon muokkaamisen (suoratoistolippu ja työkaluluettelo). Otsakkeet lisätään edelleen. Arvo luetaan jokaiselle pyynnölle erikseen, joten muutos tulee voimaan välittömästi. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(ei asetettu)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Pilkuilla erotellut työkalujen nimet, jotka ilmoitetaan työkaluttomassa avaimettomassa OpenCode-pyynnössä, kun kyseiselle mallille ei ole vielä havaittu työkaluja. Tyhjä arvo palautuu yhteen paikkamerkkiin, jota mallia ohjeistetaan olemaan kutsumatta. Enintään 32 merkintää, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; virheelliset merkinnät ohitetaan. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Kiintiötietojen poimintaan käytettävä Ollama Cloudin asetusten URL-osoite. Ohita välityspalvelimia/testikalusteita varten. | +| `OLLAMA_USAGE_COOKIE` | _(ei asetettu)_ | `open-sse/services/usage.ts` | Ollama Cloudin `__Secure-session`-eväste, jota käytetään kiintiötietojen poimintaan asetussivulta. Arkaluonteinen; suosi yhteyskohtaista Dashboard-kenttää, kun määritettynä on useita tilejä. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(ei asetettu)_ | `open-sse/services/usage.ts` | Vaihtoehtoinen Ollama Cloudin `__Secure-session`-evästeen ympäristömuuttuja. Arkaluonteinen; suosi yhteyskohtaista Dashboard-kenttää, kun määritettynä on useita tilejä. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(ei asetettu)_ | `open-sse/services/usage.ts` | Vaihtoehtoinen Ollama Cloudin `__Secure-session`-evästeen ympäristömuuttuja, jota käytetään ennen lyhyempiä aliaksia. Arkaluonteinen; suosi yhteyskohtaista Dashboard-kenttää, kun määritettynä on useita tilejä. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhispererin (AWS Kiro) käyttörajojen päätepiste. Ohita välityspalvelimia/testikalusteita varten. | > [!IMPORTANT] -> Kun sovellus otetaan käyttöön käänteisen välityspalvelimen (nginx, Caddy) takana, aseta `NEXT_PUBLIC_BASE_URL` vakaaksi julkiseksi URL-osoitteeksi (esim. `https://omniroute.example.com`), kun OAuth-palautuskutsujen tai luotujen julkisten linkkien on käytettävä kyseistä palvelinnimeä. Ilman tätä OAuth-palautuskutsut voivat epäonnistua, koska redirect_uri ei täsmää, ja luodut julkiset linkit voivat osoittaa säilön sisäiseen alkuperään. +> Kun otat sovelluksen käyttöön käänteisen välityspalvelimen (nginx, Caddy) takana, aseta `NEXT_PUBLIC_BASE_URL` vakaaksi julkiseksi URL-osoitteeksesi (esim. `https://omniroute.example.com`), kun OAuth-takaisinkutsujen tai luotujen julkisten linkkien on käytettävä kyseistä isäntänimeä. Ilman tätä OAuth-takaisinkutsut voivat epäonnistua, koska redirect_uri ei täsmää, ja luodut julkiset linkit voivat osoittaa sisäiseen konttialkuperään. > -> Säilytä `BASE_URL` sisäisenä takaisinkytkentä- tai säilö-URL-osoitteena palvelinten välisiä töitä varten. Älä käytä selaimen `Origin`-arvoa tai julkista palvelinnimeä tunnistetietoja sisältävissä sisäisissä itseensä kohdistuvissa pyynnöissä. +> Säilytä `BASE_URL` sisäisenä loopback-/kontti-URL-osoitteena palvelinten välisiä töitä varten. Älä käytä selaimen `Origin`-arvoa tai julkista isäntänimeä tunnistetietoja sisältäviin sisäisiin itsehakuihin. > -> Todennetut hallintapaneelin kirjoitusoperaatiot eivät edellytä staattista julkista perus-URL-osoitetta: hallintapaneeli lähettää saman alkuperän suojaamattomat pyynnöt istuntoon sidotulla CSRF-tunnisteella. OmniRoute keskittää edelleen julkisen alkuperän validoinnin muille kuin hallintapaneelin selainintegraatioille: eksplisiittisiin julkisen URL-osoitteen ympäristömuuttujiin luotetaan ensisijaisesti; käsittelemättömät `Forwarded`- / `X-Forwarded-*`-otsakkeet ohitetaan, ellei `OMNIROUTE_TRUST_PROXY` ole käytössä ja välittömän välityspalvelimen vertaisosapuolta ole merkitty tunnisteella luotetuksi. Älä käytä CORS-asetuksia saman alkuperän hallintapaneelipyyntöjen korjaamiseen; CORS on tarkoitettu vain eri alkuperää käyttäville selainasiakkaille. +> Todennusta vaativat Dashboard-kirjoitukset eivät edellytä staattista julkista perus-URL-osoitetta: Dashboard lähettää saman alkuperän turvattomat pyynnöt istuntoon sidotulla CSRF-tunnisteella. OmniRoute keskittää silti julkisen alkuperän validoinnin muille kuin Dashboardin selainintegraatioille: eksplisiittisiin julkisen URL-osoitteen ympäristömuuttujiin luotetaan ensin; käsittelemättömät `Forwarded`- / `X-Forwarded-*`-otsakkeet ohitetaan, ellei `OMNIROUTE_TRUST_PROXY` ole käytössä ja välitön välityspalvelin ole merkitty tunnuksella luotetuksi. Älä käytä CORS-asetuksia saman alkuperän Dashboard-pyyntöjen korjaamiseen; CORS on tarkoitettu vain eri alkuperää käyttäville selainasiakkaille. --- @@ -587,49 +594,50 @@ sidecar-tunnistusta). --- -## 11. OAuth-palveluntarjoajan tunnistetiedot +## 11. OAuth-palveluntarjoajien tunnistetiedot Sisäänrakennetut tunnistetiedot **localhost-kehitystä** varten. Etäkäyttöönottoja varten rekisteröi omat tunnistetietosi kunkin palveluntarjoajan kehittäjäkonsolissa. -| Muuttuja | Palveluntarjoaja | Huomautukset | -| --------------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Julkinen asiakas — salaisuutta ei tarvita. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Ohita uudelleenohjauksen URI. Oletus: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Julkinen asiakas. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Edellyttää vastaavaa `_SECRET`-arvoa. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Julkinen asiakas. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Edellyttää vastaavaa `_SECRET`-arvoa. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Julkinen asiakas. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Valinnainen ohitus GitHub Enterprise Copilotin OAuth-asiakastunnukselle. Jos arvoa ei ole asetettu, käytetään `GITHUB_OAUTH_CLIENT_ID`-muuttujan julkista oletusarvoa. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API-avaimen varavaihtoehto, jota `open-sse/executors/devin-cli.ts` käyttää, kun yhteyskohtaista tunnistetietoa ei ole saatavilla. Valinnainen. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Mukautettu polku Devin CLI -binääriin (`devin`). Tiedosto `open-sse/executors/devin-cli.ts` selvittää polun. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duon OAuth-asiakastunnus. Rekisteröi sovellus osoitteessa `https://gitlab.com/-/profile/applications` käyttäen uudelleenohjauksen URI:a `/callback` ja käyttöoikeusalueita `api, read_user, openid, profile, email`. Varavaihtoehtona käytetään `GITLAB_OAUTH_CLIENT_ID`-arvoa. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duon OAuth-asiakassalaisuus. Valinnainen — PKCE-työnkulku ei edellytä salaisuutta. Varavaihtoehtona käytetään `GITLAB_OAUTH_CLIENT_SECRET`-arvoa. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Ohita GitLabin perus-URL (itse ylläpidetty GitLab). Oletusarvo on `https://gitlab.com`. Varavaihtoehtona käytetään `GITLAB_BASE_URL`-arvoa. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Vanha varavaihtoehto muuttujalle `GITLAB_DUO_BASE_URL`. Käytetään, kun `_DUO_`-versiota ei ole asetettu. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Vanha varavaihtoehto muuttujalle `GITLAB_DUO_OAUTH_CLIENT_ID`, jota `src/lib/oauth/constants/oauth.ts` käyttää. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Vanha varavaihtoehto muuttujalle `GITLAB_DUO_OAUTH_CLIENT_SECRET`, jota `src/lib/oauth/constants/oauth.ts` käyttää. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Ota Qoder OAuth käyttöön asettamalla tämä arvo. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Suoran API-avaimen varavaihtoehto (ohittaa OAuthin). | -| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI:n työtilan tunnus. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Muuttujan `QODER_CLI_WORKSPACE` alias. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Ohita Qoder CLI:n määrityshakemisto (eristetty PAT-istunto, joka estää selainsisäänkirjautumisen ylikirjoittamisen). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Käyttöliittymän `tk`-tunnus, joka lähetetään `validated`-arvona päätepisteeseen `/api/chat`. Pakollinen, kun Blackbox edellyttää tunnusten vastaavuutta; muussa tapauksessa OmniRoute käyttää varavaihtoehtona satunnaista UUID:tä. Katso ongelma #2252. | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge -suojakaide | OpenAI-yhteensopiva perus-URL muiden kuin Anthropicin vision bridge -kutsuille. Oletusarvona käytetään vanhaa OpenAI URL -ympäristömuuttujaa tai osoitetta api.openai.com. Osoita se OmniRouten omaan `/v1`-silmukkaan tai mihin tahansa OpenAI-yhteensopivaan päätepisteeseen (Gemini OpenAI-compat, OpenRouter). Ongelma #2232. Kun URL on OmniRouten oma `/v1`, kuvaileva alipyyntö lähettää otsakkeen `x-omniroute-admission-bypass: internal` ja todentautuu selvitetyllä sisäisen silmukan tunnistetiedolla (`sk_omniroute`-sentineli paikallisessa tilassa tai `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), jotta `REQUIRE_API_KEY=true`-käyttöönotot toimivat. | -| `VISION_BRIDGE_API_KEY` | Vision Bridge -suojakaide | Yllä olevan URL-osoitteen API-avain. Ohittaa palveluntarjoajakohtaiset OpenAI-/Google-ympäristömuuttujat muiden kuin Anthropicin vision bridge -kutsuissa. Anthropic-mallit käyttävät edelleen omaa Anthropic-avainpolkuaan. Ongelma #2232. | +| Muuttuja | Palveluntarjoaja | Huomautukset | +| --------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Julkinen asiakas — salaisuutta ei tarvita. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Ohita uudelleenohjauksen URI. Oletusarvo: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Julkinen asiakas. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Edellyttää vastaavaa `_SECRET`-arvoa. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Julkinen asiakas. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Edellyttää vastaavaa `_SECRET`-arvoa. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Julkinen asiakas. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Valinnainen ohitus GitHub Enterprise Copilotin OAuth-asiakastunnukselle. Jos arvoa ei ole asetettu, käytetään `GITHUB_OAUTH_CLIENT_ID`-muuttujan julkista oletusarvoa. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Valinnainen ohitus GitHub Copilot -asiakasintegraation tunnukselle, joka lähetetään `Copilot-Integration-Id`- ja `Editor-Plugin-Version`-otsakkeissa. Oletusarvo on `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API-avaimen vara-arvo, jota `open-sse/executors/devin-cli.ts` käyttää, kun yhteyskohtaista tunnistetietoa ei ole saatavilla. Valinnainen. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Mukautettu polku Devin CLI -binääritiedostoon (`devin`). Polun selvittää `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duon OAuth-asiakastunnus. Rekisteröi sovellus osoitteessa `https://gitlab.com/-/profile/applications` käyttäen uudelleenohjauksen URI:a `/callback` ja käyttöalueita `api, read_user, openid, profile, email`. Vara-arvona käytetään `GITLAB_OAUTH_CLIENT_ID`-muuttujaa. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duon OAuth-asiakassalaisuus. Valinnainen — PKCE-työnkulku ei edellytä salaisuutta. Vara-arvona käytetään `GITLAB_OAUTH_CLIENT_SECRET`-muuttujaa. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Ohita GitLabin perus-URL (itse ylläpidetty GitLab). Oletusarvo on `https://gitlab.com`. Vara-arvona käytetään `GITLAB_BASE_URL`-muuttujaa. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Vanha vara-arvo muuttujalle `GITLAB_DUO_BASE_URL`. Käytetään, kun `_DUO_`-versiota ei ole asetettu. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Vanha varavaihtoehto muuttujalle `GITLAB_DUO_OAUTH_CLIENT_ID`, jota `src/lib/oauth/constants/oauth.ts` käyttää. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Vanha varavaihtoehto muuttujalle `GITLAB_DUO_OAUTH_CLIENT_SECRET`, jota `src/lib/oauth/constants/oauth.ts` käyttää. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Määritä tämä ottaaksesi Qoder OAuthin käyttöön. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Suoran API-avaimen varavaihtoehto (ohittaa OAuthin). | +| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI:n työtilan tunnus. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Muuttujan `QODER_CLI_WORKSPACE` alias. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Ohita Qoder CLI:n määrityshakemisto (eristetty PAT-istunto, joka estää selainsisäänkirjautumisen ylikirjoittamisen). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Käyttöliittymän `tk`-tunnus, joka lähetetään `validated`-arvona `/api/chat`-päätepisteeseen. Vaaditaan, kun Blackbox edellyttää tunnusten täsmäämistä; muussa tapauksessa OmniRoute käyttää varavaihtoehtona satunnaista UUID:tä. Katso ongelma #2252. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge -suojakaide | OpenAI-yhteensopiva perus-URL muille kuin Anthropic vision-bridge -kutsuille. Oletusarvona on vanha OpenAI-URL-ympäristömuuttuja tai api.openai.com. Osoita se OmniRouten omaan `/v1`-silmukkaan tai mihin tahansa OpenAI-yhteensopivaan päätepisteeseen (Gemini OpenAI-compat, OpenRouter). Ongelma #2232. Kun URL on OmniRouten oma `/v1`, kuvaileva alipyyntö lähettää `x-omniroute-admission-bypass: internal` -otsakkeen ja todentaa ratkaistulla silmukan tunnistetiedolla (`sk_omniroute`-sentineli paikallisessa tilassa tai `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), jotta `REQUIRE_API_KEY=true`-käyttöönotot toimivat. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge -suojakaide | Yllä olevan URL-osoitteen API-avain. Ohittaa palveluntarjoajakohtaiset OpenAI- / Google-ympäristömuuttujat muissa kuin Anthropic vision-bridge -kutsuissa. Anthropic-mallit säilyttävät oman Anthropic-avainpolkunsa. Ongelma #2232. | > [!WARNING] > -> 1. Siirry kohtaan [Google Cloud Console → Kirjautumistiedot](https://console.cloud.google.com/apis/credentials) +> 1. Siirry kohtaan [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) > 2. Luo OAuth 2.0 -asiakastunnus (tyyppi: "Verkkosovellus") > 3. Lisää palvelimesi URL-osoite valtuutetuksi uudelleenohjaus-URI:ksi -> 4. Korvaa kirjautumistietojen arvot `.env`-tiedostossa. +> 4. Korvaa tunnistetiedot `.env`-tiedostossa. --- @@ -739,130 +747,131 @@ Kaikki arvot ovat **millisekunteina**. Keskitetty määritys tiedostossa `src/sh ``` REQUEST_TIMEOUT_MS (yleinen ohitus) ├─→ FETCH_TIMEOUT_MS (kutsut ulkoisille palveluntarjoajille, oletus: 600000) -│ ├─→ FETCH_HEADERS_TIMEOUT_MS (perii arvon muuttujalta FETCH_TIMEOUT_MS) -│ ├─→ FETCH_BODY_TIMEOUT_MS (perii arvon muuttujalta FETCH_TIMEOUT_MS) -│ ├─→ TLS_CLIENT_TIMEOUT_MS (perii arvon muuttujalta FETCH_TIMEOUT_MS) +│ ├─→ FETCH_HEADERS_TIMEOUT_MS (periytyy muuttujasta FETCH_TIMEOUT_MS) +│ ├─→ FETCH_BODY_TIMEOUT_MS (periytyy muuttujasta FETCH_TIMEOUT_MS) +│ ├─→ TLS_CLIENT_TIMEOUT_MS (periytyy muuttujasta FETCH_TIMEOUT_MS) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (itsenäinen, oletus: 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (itsenäinen, oletus: 15000) │ ├── FETCH_CONNECT_TIMEOUT_MS (itsenäinen, oletus: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (itsenäinen, oletus: 4000) -├─→ STREAM_IDLE_TIMEOUT_MS (perii arvon muuttujalta REQUEST_TIMEOUT_MS, oletus: 600000) +├─→ STREAM_IDLE_TIMEOUT_MS (periytyy muuttujasta REQUEST_TIMEOUT_MS, oletus: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (itsenäinen, oletus: 1260000; 0 poistaa käytöstä) -├─→ STREAM_READINESS_TIMEOUT_MS (perii arvon muuttujalta REQUEST_TIMEOUT_MS, oletus: 80000) +├─→ STREAM_READINESS_TIMEOUT_MS (periytyy muuttujasta REQUEST_TIMEOUT_MS, oletus: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (rajoittaa mukautuvia valmiusajan pidennyksiä, oletus: 180000) -└─→ API_BRIDGE_PROXY_TIMEOUT_MS (perii arvon muuttujalta REQUEST_TIMEOUT_MS, oletus: 30000) +└─→ API_BRIDGE_PROXY_TIMEOUT_MS (periytyy muuttujasta REQUEST_TIMEOUT_MS, oletus: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (johdettu, oletus: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (oletus: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (oletus: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (oletus: 0 = poistettu käytöstä) ``` -| Muuttuja | Oletusarvo | Kuvaus | -| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(ei asetettu)_ | Yleinen oikotie — ohittaa sekä `FETCH_TIMEOUT_MS`- että `STREAM_IDLE_TIMEOUT_MS`-oletusarvot. | -| `FETCH_TIMEOUT_MS` | `600000` | Ylävirran palveluntarjoajalle tehtävien HTTP-pyyntöjen kokonaisaikakatkaisu. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Raakojen ylävirran tavujen välisen hiljaisuuden enimmäiskesto ennen keskeytystä. Laajennettua päättelyä käyttävät mallit pitävät harvoin yli 90 sekunnin taukoja. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Aktiivisen SSE-virran enimmäiskokonaiskesto; ei koskaan nollaudu ylävirran tavujen vuoksi ja on riippumaton `REQUEST_TIMEOUT_MS`-arvosta. Johdettu rekisterin suurimmasta mallikohtaisesta `timeoutMs`-arvosta (1200000, Codex) sekä 60000:n marginaalista, joten koko aikabudjettinsa käyttävän mallin suoritus ei koskaan keskeydy kesken vastauksen. Poista käytöstä asettamalla arvoksi `0`. | -| `OMNIROUTE_SSE_COMMENTS` | _(poistettu käytöstä)_ | Määrittää, voiko OmniRoute lähettää SSE:n `:`-kommenttirivejä (esim. `: keepalive`-sykeviestin ja `x-omniroute-*`-metatietojen loppumerkinnät). Oletusarvoisesti pois käytöstä (#10524), koska tiukasti OpenAI-yhteensopivat asiakkaat suorittavat JSON.parse-toiminnon jokaiselle SSE-riville ja kaatuvat `:`-kommentteihin; tämä ei vaikuta `data:`-sykeviesteihin. Ota uudelleen käyttöön asettamalla arvoksi `on`/`true`/`1`/`yes`. Tiedosto `open-sse/utils/sseHeartbeat.ts` käyttää tätä. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Aika ensimmäisen muun kuin ping-SSE-tapahtuman vastaanottamiseen. Perii `REQUEST_TIMEOUT_MS`-arvon, kun se on asetettu. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Mukautuvan ensimmäisen tapahtuman valmiusikkunan enimmäiskesto suurille, paljon työkaluja käyttäville tai runsaasti päättelyä vaativille suoratoistopyynnöille. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal`-heuristiikan hätäpysäytys. Poista tunnistus kokonaan käytöstä asettamalla arvoksi `false`/`0`/`off` — valmiusaikakatkaisuja ja virran palautusta ei tällöin koskaan kasvateta pyynnön rungon tai otsakkeiden perusteella, mikä vähentää asiakkaan hallitseman aikakatkaisun vahvistamisen riskiä. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Ensimmäisen tapahtuman valmiusikkunan enimmäiskesto tunnistetuille `/goal`-agenttiajoille tai `x-omniroute-agent-goal`-otsakkeella pakotetuille pyynnöille. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Ottaa varhaisen virran palautuksen automaattisesti käyttöön tunnistetuille `/goal`-agenttiajoille. Poista tavoitekohtainen valinta käytöstä asettamalla arvoksi `false`/`0`/`off`. Tämä voi vain LISÄTÄ palautuksen operaattorin oletusasetuksen päälle — se ei koskaan ohita `STREAM_RECOVERY_ENABLED`-asetuksella tai tietokanta-asetuksilla nimenomaisesti tehtyä käytöstäpoistoa. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Poistaa standardista poikkeavat `codex.*`-SSE-tapahtumat (esim. `codex.rate_limits`), jotka rikkovat OpenAI SDK:n `responses.stream()`-toiminnon 502-virheellä. Oletusarvoisesti KÄYTÖSSÄ (#11014). Välitä tapahtumat eteenpäin asettamalla arvoksi `0`/`false`/`no`/`off`. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(ei asetettu)_ | Valinnainen Codex app-server -siirtotapa. Paikallisen `codex app-server` -sivuprosessin WebSocket-päätepiste (`ws://`/`wss://`). Kun tämä ja tunniste on asetettu, Codex-pyynnöt reititetään JSON-RPC:n kautta sivuprosessille HTTP Responses API:n sijaan. Voidaan asettaa myös yhteyskohtaisesti arvolla `providerSpecificData.codexAppServerUrl`. Tiedosto `open-sse/executors/codex/appServerConfig.ts` käyttää tätä. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(ei asetettu)_ | Sisäinen käyttöoikeus-/haltijatunniste, joka esitetään app-serverille. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(ei asetettu)_ | Polku app-serverin käyttöoikeustunnisteen sisältävään tiedostoon (komennosta `codex app-server --ws-token-file`). Käytetään, kun `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ei ole asetettu. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Työhakemisto, jossa app-serverin vuoro suoritetaan. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(ei asetettu)_ | App-serverin vuorolle välitettävä hyväksyntäkäytäntö (esim. `never`, `on-request`). Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(ei asetettu)_ | App-serverin vuorolle välitettävä hiekkalaatikkokäytäntö (esim. `read-only`, `workspace-write`, `danger-full-access`). Kun arvoa ei ole asetettu, suorittaja käyttää oletusarvona `workspace-write` (kovennettu; aiemmin `danger-full-access`). Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Hyväksyy automaattisesti app-serverin omat hyväksyntäkehotteet (komentojen/tiedostojen/oikeuksien suoritus isäntäkoneessa). Oletusarvoisesti pois käytöstä — kehotteet hylätään automaattisesti; tämä ei vaikuta testikehyksen työkalukutsuihin (ne kulkevat erillisen `item/tool/call`-läpivälityksen kautta). Hyväksyy arvot `true`/`1`/`yes`. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Aika vastausotsakkeiden vastaanottamiseen. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Vastauksen alkamisen enimmäisodotusaika (ms) kullekin suoralle välityspalvelimettomalle yritykselle. Aikakatkaisun jälkeen yritetään kerran uudelleen uudella pistokkeella; aseta arvoksi `0`, jos haluat poistaa rajan käytöstä ja säilyttää aiemman toiminnan. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Koko vastausrungon vastaanottamiseen varattu aika. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP-yhteyden muodostamisen aikakatkaisu. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive-pistokkeen joutilasajan aikakatkaisu. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS-sormenjälkivälityspalvelimen (wreq-js) aikakatkaisu. | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Rajaa nimenomaan wreq-js:n TLS-sormenjälkisiirron vastausrungon ensimmäisen tavun odotusajan; `TLS_CLIENT_TIMEOUT_MS` ei yksin havaitse pysähtynyttä vastausrunkoa, koska se valmistuu heti otsakkeiden saavuttua (#12656). Aikakatkaisu peruuttaa wreq-lukijan ja siirtyy käyttämään suoraa/välityspalvelimen välittäjää; `0` poistaa valvonnan käytöstä. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Vain OpenCode-suorittimelle ja vain, kun `OPENCODE_RESPONSES_STALL_ROTATION`-ominaisuuslippu on käytössä (oletuksena pois käytöstä): rajaa suoratoistetun Responses-vastauksen rungon ensimmäisen tavun odotusajan sen otsakkeiden jälkeen (#13484). Responses-suoratoisto alkaa tapahtumalla `response.created`, joten tämän aikaikkunan ylittävä hiljaisuus tulkitaan pysähtymiseksi: tili asetetaan jäähylle ja pyyntö siirretään kerran seuraavalle tilille; toinen pysähtyminen aiheuttaa välittömän epäonnistumisen. `0` poistaa suojauksen käytöstä, vaikka lippu olisi käytössä. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Välityspalvelinhypyn aikakatkaisu `/v1`-siltapyynnöille. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Ohjaa Firecrawl-verkkonoutosuoritin itse ylläpidettyyn instanssiin (API-avain on valinnainen pilven ulkopuolella). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl-verkkonoutosuorittimen pyyntökohtainen aikakatkaisu. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Sillan palvelinpyynnön kokonaisaikakatkaisu. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Vastausotsakkeiden lähettämiseen sillan kautta varattu aika. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Sillan keep-alive-yhteyden joutilasajan aikakatkaisu. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Raakapistokkeen aikakatkaisu (0 = pois käytöstä). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | SIGTERM/SIGINT-signaalin jälkeinen armonaika ennen pakotettua sulkemista. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Vara-arvo, jota `src/shared/utils/fetchTimeout.ts` käyttää, kun muuttujaa `FETCH_TIMEOUT_MS` ei ole asetettu. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Tiedoston `src/shared/network/safeOutboundFetch.ts` esiasetusten `validationRead` ja `modelsProbe` aikakatkaisu (ms). Suurenna arvoa hitaille päätepisteille (Cerebras, Cloudflare AI, Groq), jotta koontinäytön active/error-tilojen välinen vaihtelu vältetään. Virheellisillä (<1000) tai muilla kuin numeerisilla arvoilla käytetään vara-arvoa 8000 ms. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Välitysketjukohtainen noudon aikakatkaisu tiedostossa `open-sse/utils/proxyFetch.ts` (#9158). Jumiutuneen välitysketjun on epäonnistuttava ennen asiakkaan/agentin aikakatkaisua (~30 s), jotta kutsujat näkevät välitysketjukohtaisen virheen yleisen ylävirran aikakatkaisun sijaan. Enimmäisarvo on `29000`, jotta se laukeaa aina ensin. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Jaettu uudelleenyrityksen viive suorien/välitysketjun/välityspalvelimen kerran uudelleen yrittäville poluille tiedostossa `open-sse/utils/proxyFetch.ts` (#9158). `0` = yritä uudelleen välittömästi. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Natiivin wreq-js-pyynnön aikakatkaisu (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Natiivin aikakatkaisun päälle lisättävä ehdottoman JS-määräajan armonaika. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Natiivin wreq-js-pyynnön aikakatkaisu (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Natiivin aikakatkaisun päälle lisättävä ehdottoman JS-määräajan armonaika. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (pois käytöstä) | Lisää kutsujan järjestelmäviestiin tekstin "Sinulla on sisäänrakennettu verkkohaku. Vastaa kysymyksiin suoraan hakutulosten avulla." (`perplexity-web/protocol.ts`). Oletusarvoisesti pois käytöstä — Perplexity tekee hakuja joka tapauksessa, ja lause vuotaa koodausasiakkaiden vastauksiin metakommenttina. Palauta käyttöön asettamalla arvoksi `1`/`true`/`yes`/`on`. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Natiivin wreq-js-pyynnön aikakatkaisu (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absoluuttisen JS-kovan määräajan lisäaika, joka lisätään natiivin aikakatkaisun päälle. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Natiivin wreq-js-pyynnön aikakatkaisu (`notionTlsClient.ts`); `notion-web` nostaa sen pitkille generoinneille pyyntökohtaisesti arvoon `180000`. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absoluuttisen JS-kovan määräajan lisäaika, joka lisätään natiivin aikakatkaisun päälle. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Jaettu Playwright-selainvaranto selaimeen perustuvaa verkkoevästeitä käyttävää keskustelua varten (`browserPool.ts`); poista käytöstä asettamalla arvoksi `off`. | -| `OBSCURA_BIN` | `auto-detect` | Polku `obscura`-binääritiedostoon, jota selainvaranto ja Cloudflare Playground -suorittaja käyttävät ensisijaisena moottorina (`open-sse/services/obscura.ts`); tunnistetaan automaattisesti järjestelmän PATH-muuttujasta, kun arvoa ei ole asetettu. | -| `OBSCURA_CDP_ENDPOINT` | _(ei asetettu)_ | Käytä jo käynnissä olevaa Obscuraa (`http://host:port`) uuden prosessin käynnistämisen sijaan; moduuli ei hallinnoi kyseistä prosessia (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `satunnainen vapaa portti` | Käynnistetylle `obscura serve` -prosessille määritettävä portti; vapaa portti valitaan automaattisesti, kun arvoa ei ole asetettu (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Ohjaa verkkoevästeitä käyttävä keskustelupyyntö selaimeen perustuvaan polkuun (`browserBackedChat.ts`); ota käyttöön arvolla `1`. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web -suorittajan (kansainvälinen kimi.ai Connect-RPC) perus-URL-osoite (`kimi-web.ts`); ohita vain peili- tai välityspalvelinpäätepisteitä varten. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web -suorittajan täydellinen keskustelupäätepiste (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(tunnistetaan automaattisesti)_ | Polku järjestelmän Chrome- tai Edge-suoritustiedostoon Adobe Fireflyn vuorovaikutteista selaimella tehtävää kirjautumista varten (`adobeFireflyBrowserLogin.ts`); ohittaa käyttöjärjestelmäkohtaisen automaattisen tunnistuksen. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ erillisen version tuloste_ | Koontiaikainen ohitus erillisen version tulostehakemistolle, jota koonnin jälkeinen rinnakkainasetteluvaihe käyttää (`scripts/build/colocate-standalone.mjs`); koskee koontityökaluja, ei suoritusaikaa. | - -Yhdistelmäkohteiden yritykset perivät selvitetyn ylävirran pyynnön aikakatkaisun (`FETCH_TIMEOUT_MS` tai -`REQUEST_TIMEOUT_MS`, kun se määrittää noudon oletusarvon). Määritä `targetTimeoutMs` yhdistelmässä, -yhdistelmän oletusarvoissa tai palveluntarjoajan ohituksessa vain nopeuttaaksesi yhdistelmän varakohteeseen siirtymistä; nykyisen +| Muuttuja | Oletusarvo | Kuvaus | +| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(ei asetettu)_ | Yleinen oikopolku — ohittaa sekä `FETCH_TIMEOUT_MS`- että `STREAM_IDLE_TIMEOUT_MS`-oletusarvot. | +| `FETCH_TIMEOUT_MS` | `600000` | Ylävirran palveluntarjoajille tehtävien HTTP-pyyntöjen kokonaisaikakatkaisu. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Raakojen ylävirran tavujen välisen hiljaisuuden enimmäiskesto ennen keskeytystä. Laajennettua päättelyä käyttävissä malleissa tauot ovat harvoin >90 s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Aktiivisen SSE-virran enimmäiskokonaiskesto; ei koskaan nollaudu ylävirran tavuista ja on riippumaton `REQUEST_TIMEOUT_MS`-arvosta. Johdettu rekisterin suurimmasta mallikohtaisesta `timeoutMs`-arvosta (1200000, Codex) lisäämällä 60000:n marginaali, jotta koko sallitun aikabudjettinsa käyttävää mallia ei koskaan keskeytetä kesken vastauksen. Poista käytöstä asettamalla arvoksi `0`. | +| `OMNIROUTE_SSE_COMMENTS` | _(poistettu käytöstä)_ | Määrittää, voiko OmniRoute lähettää SSE:n `:`-kommenttirivejä (esim. `: keepalive`-sykkeen ja `x-omniroute-*`-metatietojälkiosat). Oletusarvoisesti poistettu käytöstä (#10524), koska tiukasti OpenAI-yhteensopivat asiakkaat suorittavat JSON.parse-käsittelyn jokaiselle SSE-riville ja kaatuvat `:`-kommentteihin; tämä ei vaikuta `data:`-sykkeisiin. Ota takaisin käyttöön asettamalla arvoksi `on`/`true`/`1`/`yes`. Tiedosto `open-sse/utils/sseHeartbeat.ts` käyttää tätä. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Aika ensimmäisen muun kuin ping-SSE-tapahtuman vastaanottamiseen. Perii `REQUEST_TIMEOUT_MS`-arvon, kun se on asetettu. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Mukautuvan ensimmäisen tapahtuman valmiusikkunan enimmäiskesto suurille, paljon työkaluja käyttäville tai runsaasti päättelyä vaativille suoratoistopyynnöille. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal`-heuristiikan hätäkatkaisin. Poista tunnistus kokonaan käytöstä asettamalla arvoksi `false`/`0`/`off` — pyyntörungon tai otsakkeiden perusteella ei tällöin koskaan pidennetä valmiuden aikakatkaisuja eikä virran palautusta, mikä vähentää asiakkaan hallitseman aikakatkaisun vahvistamisen riskiä. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Ensimmäisen tapahtuman valmiusikkunan enimmäiskesto tunnistetuille `/goal`-agenttiajoille tai `x-omniroute-agent-goal`-otsakkeella pakotetuille pyynnöille. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Ota varhainen virran palautus automaattisesti käyttöön tunnistetuille `/goal`-agenttiajoille. Poista tavoitekohtainen suostumus käytöstä asettamalla arvoksi `false`/`0`/`off`. Tämä voi vain LISÄTÄ palautuksen ylläpitäjän oletusasetuksen päälle — se ei koskaan ohita nimenomaista `STREAM_RECOVERY_ENABLED`-asetuksen tai tietokanta-asetusten kieltoa. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Poista epästandardit `codex.*`-SSE-tapahtumat (esim. `codex.rate_limits`), jotka rikkovat OpenAI SDK:n `responses.stream()`-toiminnon 502-virheellä. Oletusarvoisesti KÄYTÖSSÄ (#11014). Välitä tapahtumat eteenpäin asettamalla arvoksi `0`/`false`/`no`/`off`. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(ei asetettu)_ | Valinnainen Codex app-server -siirtotapa. Paikallisen `codex app-server` -sivuprosessin WebSocket-päätepiste (`ws://`/`wss://`). Kun tämä ja tunnus asetetaan, Codex-pyynnöt reititetään JSON-RPC:n kautta sivuprosessille HTTP Responses API:n sijaan. Voidaan asettaa myös yhteyskohtaisesti arvolla `providerSpecificData.codexAppServerUrl`. Tiedosto `open-sse/executors/codex/appServerConfig.ts` käyttää tätä. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(ei asetettu)_ | App-serverille esitettävä sisäinen käyttöoikeus-/bearer-tunnus. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(ei asetettu)_ | Polku app-serverin käyttöoikeustunnuksen sisältävään tiedostoon (komennosta `codex app-server --ws-token-file`). Käytetään, kun `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ei ole asetettu. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Työhakemisto, jossa app-serverin vuoro suoritetaan. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(ei asetettu)_ | App-serverin vuorolle välitettävä hyväksyntäkäytäntö (esim. `never`, `on-request`). Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(ei asetettu)_ | App-serverin vuorolle välitettävä hiekkalaatikkokäytäntö (esim. `read-only`, `workspace-write`, `danger-full-access`). Kun arvoa ei ole asetettu, suorittimen oletuksena on `workspace-write` (vahvistettu; aiemmin `danger-full-access`). Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Hyväksy app-serverin omat hyväksyntäkehotteet automaattisesti (komentojen, tiedostojen tai käyttöoikeuksien suoritus isäntäkoneella). Oletusarvoisesti pois käytöstä — kehotteet hylätään automaattisesti; tämä ei vaikuta testikehyksen työkalukutsuihin (ne kulkevat erillisen `item/tool/call`-läpiviennin kautta). Hyväksyy arvot `true`/`1`/`yes`. Yhteyskohtainen ohitus: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Vastausotsakkeiden vastaanottamiseen varattu aika. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Vastauksen alkamisen enimmäisodotusaika (ms) jokaiselle suoralle välityspalvelimettomalle yritykselle. Aikakatkaisun jälkeen yritetään kerran uudelleen uudella pistokkeella; aseta arvoksi `0`, jos haluat poistaa rajoituksen käytöstä ja säilyttää aiemman toiminnan. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Enimmäisaika (ms) uudella pistokkeella tehtävälle RETRY-yritykselle sen jälkeen, kun yhteyspoolia käyttäneen yrityksen vastauksen alkaminen on aikakatkaistu edellä kuvatulla tavalla (#13703). Koskee vain tilanteita, joissa kutsuja on jo liittänyt oman määräaikasignaalinsa (ratkaistun yhteyksen/mallin/palveluntarjoajan/`FETCH_TIMEOUT_MS`:n ketju); kyseinen signaali on varsinainen rajoitus ja laukeaa tarkoitetussa suorituspolussa ensin, joten tämä on väljä varmistus eikä kiinteä enimmäisraja — ilman sitä uudelleenyritys käytti samaa lyhyttä `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`-aikaikkunaa kuin yhteyspoolia käyttänyt yritys ja aiheutti 504-virheen terveille, hitaasti ensimmäisen tavun tuottaville päättelymalleille. Arvo ei voi koskaan alittaa edellä mainittua kiinteää alarajaa; jos kutsuja ei anna lainkaan määräaikasignaalia, uudelleenyritys säilyttää kiinteän alarajan muuttumattomana. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Koko vastausrungon vastaanottamiseen käytettävissä oleva aika. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP-yhteyden muodostamisen aikakatkaisu. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive-pistokkeen käyttämättömyyden aikakatkaisu. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS-sormenjälkivälityspalvelimen (wreq-js) aikakatkaisu. | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Rajoittaa erityisesti ensimmäisen tavun odotusaikaa wreq-js:n TLS-sormenjälkisiirtotavan vastausrungossa; pelkkä `TLS_CLIENT_TIMEOUT_MS` ei havaitse pysähtynyttä runkoa, koska se ratkeaa heti otsakkeiden saavuttua (#12656). Aikakatkaisu peruuttaa wreq-lukijan ja siirtyy käyttämään suoraa/välityspalvelimen välittäjää; `0` poistaa valvonnan käytöstä. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Vain OpenCode-suorittimelle ja vain, kun `OPENCODE_RESPONSES_STALL_ROTATION`-ominaisuuslippu on käytössä (oletuksena pois käytöstä): rajoittaa ensimmäisen runkotavun odotusaikaa suoratoistetussa Responses-vastauksessa sen otsakkeiden jälkeen (#13484). Responses-virta alkaa tapahtumalla `response.created`, joten tämän aikaikkunan ylittävä hiljaisuus merkitsee pysähtymistä: tili asetetaan jäähylle ja pyyntö siirretään kerran seuraavalle tilille; toinen pysähtyminen aiheuttaa välittömän epäonnistumisen. `0` poistaa suojauksen käytöstä, vaikka ominaisuuslippu olisi käytössä. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Välityspalvelinhypyn aikakatkaisu `/v1`-siltapyynnöille. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Ohjaa Firecrawl-verkkonoudon suoritin itse ylläpidettyyn instanssiin (API-avain on valinnainen pilvipalvelun ulkopuolella). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl-verkkonoudon suorittimen pyyntökohtainen aikakatkaisu. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Sillan palvelinpyynnön kokonaisaikakatkaisu. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Aika vastausotsakkeiden lähettämiseen sillan kautta. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Sillan keep-alive-yhteyden käyttämättömyyden aikakatkaisu. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Raakapistokkeen aikakatkaisu (0 = poistettu käytöstä). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Armonaika SIGTERM/SIGINT-signaalin jälkeen ennen pakotettua lopetusta. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Vara-arvo, jota `src/shared/utils/fetchTimeout.ts` käyttää, kun `FETCH_TIMEOUT_MS`-muuttujaa ei ole asetettu. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `validationRead`- ja `modelsProbe`-esiasetusten aikakatkaisu (ms) tiedostossa `src/shared/network/safeOutboundFetch.ts`. Suurenna arvoa hitaille päätepisteille (Cerebras, Cloudflare AI, Groq), jotta koontinäytön tila ei vaihtele aktiivisen ja virhetilan välillä. Virheelliset (<1000) tai muut kuin numeeriset arvot käyttävät vara-arvoa 8000 ms. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Välityspalvelukohtainen noudon aikakatkaisu tiedostossa `open-sse/utils/proxyFetch.ts` (#9158). Jumiutuneen välityspalvelun on epäonnistuttava ennen asiakkaan/agentin aikakatkaisua (~30 s), jotta kutsujat näkevät välityspalvelukohtaisen virheen yleisen ylävirran aikakatkaisun sijaan. Enimmäisarvo on `29000`, jotta se laukeaa aina ensin. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Jaettu uudelleenyrityksen viive suoran/välityspalvelimen/proxyn kerran uudelleen yrittäville suorituspoluille tiedostossa `open-sse/utils/proxyFetch.ts` (#9158). `0` = yritä heti uudelleen. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Natiivin wreq-js-pyynnön aikakatkaisu (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Absoluuttisen JS-kovan määräajan lisäaika, joka lisätään natiivin aikakatkaisun päälle. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Natiivin wreq-js-pyynnön aikakatkaisu (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absoluuttisen JS-kovan määräajan lisäaika, joka lisätään natiivin aikakatkaisun päälle. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (pois käytöstä) | Lisää kutsujan järjestelmäviestiin tekstin "Sinulla on sisäänrakennettu verkkohaku. Vastaa kysymyksiin suoraan hakutulosten avulla." (`perplexity-web/protocol.ts`). Oletusarvoisesti pois käytöstä — Perplexity tekee hakuja joka tapauksessa, ja lause vuotaa koodausasiakkaiden vastauksiin metakommentointina. Palauta käyttöön asettamalla arvoksi `1`/`true`/`yes`/`on`. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Natiivin wreq-js-pyynnön aikakatkaisu (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absoluuttisen JS-kovan määräajan lisäaika, joka lisätään natiivin aikakatkaisun päälle. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Natiivin wreq-js-pyynnön aikakatkaisu (`notionTlsClient.ts`); `notion-web` nostaa sen pitkissä generoinneissa pyyntökohtaisesti arvoon `180000`. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absoluuttisen JS-kovan määräajan lisäaika, joka lisätään natiivin aikakatkaisun päälle. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Jaettu Playwright-selainpooli selainpohjaiselle verkkovästeitä käyttävälle chatille (`browserPool.ts`); poista käytöstä asettamalla arvoksi `off`. | +| `OBSCURA_BIN` | `auto-detect` | Polku `obscura`-binääriin, jota selainpooli ja Cloudflare Playground -suorittaja käyttävät ensisijaisena moottorina (`open-sse/services/obscura.ts`); jos arvoa ei ole asetettu, se tunnistetaan automaattisesti järjestelmän PATH-muuttujasta. | +| `OBSCURA_CDP_ENDPOINT` | _(ei asetettu)_ | Käytä jo käynnissä olevaa Obscuraa (`http://host:port`) uuden käynnistämisen sijaan; moduuli ei omista kyseistä prosessia (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `satunnainen vapaa portti` | Käynnistetyn `obscura serve` -prosessin eksplisiittinen portti; jos arvoa ei ole asetettu, vapaa portti valitaan automaattisesti (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Ohjaa verkkovästeitä käyttävä chat-pyyntö selainpohjaiselle polulle (`browserBackedChat.ts`); ota käyttöön arvolla `1`. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web -suorittajan (kansainvälinen kimi.ai Connect-RPC) perus-URL-osoite (`kimi-web.ts`); ohita vain peili-/välityspalvelinpäätepisteitä varten. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web -suorittajan täydellinen chat-päätepiste (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(tunnistetaan automaattisesti)_ | Polku järjestelmän Chrome-/Edge-suoritettavaan tiedostoon Adobe Fireflyn interaktiivista selainkirjautumista varten (`adobeFireflyBrowserLogin.ts`); ohittaa käyttöjärjestelmäkohtaisen automaattisen tunnistuksen. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone-tuloste_ | Koontiaikainen ohitus erillisen tulosteen hakemistolle, jota koonnin jälkeinen rinnakkaissijoitusvaihe käyttää (`scripts/build/colocate-standalone.mjs`); liittyy koontityökaluihin, ei suoritusaikaan. | + +Yhdistelmäkohteiden yritykset perivät ratkaistun ylävirran pyynnön aikakatkaisun (`FETCH_TIMEOUT_MS` tai +`REQUEST_TIMEOUT_MS`, kun se määrittää noudon oletusarvon). Aseta `targetTimeoutMs` yhdistelmään, +yhdistelmän oletusarvoihin tai palveluntarjoajan ohitukseen vain nopeuttaaksesi yhdistelmän varakohteeseen siirtymistä; nykyisen ylävirran aikakatkaisun ylittävät arvot rajataan ylävirran aikakatkaisuun. -`comboTimeoutMs` on erillinen koko yhdistelmän seinäkelloaikabudjetti kaikille vikasietokohteille. -Jätä se määrittämättä tai aseta arvoksi `0`, jotta iterointia ei rajoiteta (10 minuutin -`COMBO_LOOP_SAFETY_TIMEOUT_MS`-pysäytys jumiutumisen varalta on silti voimassa). Positiivinen arvo korvaa kyseisen -turvamekanismin yhdistelmän osalta. Pidä `comboTimeoutMs` pidempänä kuin `targetTimeoutMs`, jotta varakohteeseen siirtymiselle -jää aikaa myös hitaan ensimmäisen kohteen jälkeen. +`comboTimeoutMs` on erillinen koko yhdistelmän seinäkelloaikabudjetti, joka kattaa kaikki vikasietokohteet. +Jätä se asettamatta tai aseta arvoksi `0`, jotta iterointi pysyy rajoittamattomana (10 minuutin +`COMBO_LOOP_SAFETY_TIMEOUT_MS`-pysäytys jumittumisen varalta on silti voimassa). Positiivinen arvo korvaa kyseisen +turvamekanismin yhdistelmän osalta. Pidä `comboTimeoutMs` pidempänä kuin `targetTimeoutMs`, jotta vikasietoisuudelle +jää edelleen aikaa hitaan ensimmäisen kohteen jälkeen. ### Katkaisijan kynnysarvot -Palveluntarjoajatason katkaisijan hienosäätö. Oletusarvot vastaavat versiosta v3.6 lähtien yli 500 yhteydelle käytettyjä skaalattuja arvoja. - -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ------------------------------------------------------------- | ---------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajien peräkkäisten virheiden kynnys ennen kuin katkaisija laukeaa. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajan katkaisijan palautusjakso (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajien peräkkäisten virheiden kynnys. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajan katkaisijan palautusjakso (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Paikallisten palveluntarjoajien (Ollama, LM Studio, ...) peräkkäisten virheiden kynnys. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Paikallisen palveluntarjoajan katkaisijan palautusjakso (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: virheiden määrä ikkunassa ennen kuin koko OAuth-palveluntarjoaja siirtyy jäähdytysjaksolle. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: OAuth-palveluntarjoajien liukuva virhelaskentaikkuna (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: jäähdytysjakso (ms), kun OAuth-palveluntarjoajan kynnys saavutetaan. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth-palveluntarjoaja siirtyy DEGRADED-tilaan näin monen virheen jälkeen. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajan resetTimeout-arvon enimmäiskorotuskerroin. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajan viiveporrastusta kasvatetaan näin monen avoimen jakson jälkeen. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: virheiden määrä ikkunassa ennen kuin koko API-avainpalveluntarjoaja siirtyy jäähdytysjaksolle. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: API-avainpalveluntarjoajien liukuva virhelaskentaikkuna (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: jäähdytysjakso (ms), kun API-avainpalveluntarjoajan kynnys saavutetaan. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-avainpalveluntarjoaja siirtyy DEGRADED-tilaan näin monen virheen jälkeen. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajan resetTimeout-arvon enimmäiskorotuskerroin. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajan viiveporrastusta kasvatetaan näin monen avoimen jakson jälkeen. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: virheiden määrä ennen kuin koko paikallinen palveluntarjoaja siirtyy jäähdytysjaksolle. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: paikallisten palveluntarjoajien liukuva virhelaskentaikkuna (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: jäähdytysjakso (ms), kun paikallisen palveluntarjoajan kynnys saavutetaan. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Viiveporrastuksen taso, jolla kontekstivälimuistin kiinnityksen palveluntarjoaja katsotaan pysyvästi epäkuntoiseksi ja kiinnitys poistetaan varajärjestelyyn siirtymistä varten. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Heilahtelua estävä aikaikkuna (ms), joka sallii lyhyet tilapäiset jäähdytysjaksot ennen kontekstivälimuistin kiinnityksen poistamista. | +Palveluntarjoajatason katkaisijan hienosäätö. Oletusarvot vastaavat versiosta v3.6 alkaen yli 500 yhteydelle käytettyjä skaalattuja arvoja. + +| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | +| ------------------------------------------------------------- | ---------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajien peräkkäisten virheiden kynnys, jonka jälkeen katkaisija laukeaa. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajan katkaisijan palautusjakso (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajien peräkkäisten virheiden kynnys. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajan katkaisijan palautusjakso (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Paikallisten palveluntarjoajien (Ollama, LM Studio, ...) peräkkäisten virheiden kynnys. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Paikallisen palveluntarjoajan katkaisijan palautusjakso (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: virheiden määrä ikkunassa ennen kuin koko OAuth-palveluntarjoaja siirtyy jäähdytysjaksolle. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: OAuth-palveluntarjoajien liukuva virhelaskentaikkuna (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: jäähdytysjakso (ms), kun OAuth-palveluntarjoajan kynnys on saavutettu. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth-palveluntarjoaja siirtyy DEGRADED-tilaan tällä virhemäärällä. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajan resetTimeout-arvon korotuksen enimmäiskerroin. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth-palveluntarjoajan viivettä korotetaan näin monen avoimen jakson jälkeen. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: virheiden määrä ikkunassa ennen kuin koko API-avainpalveluntarjoaja siirtyy jäähdytysjaksolle. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: API-avainpalveluntarjoajien liukuva virhelaskentaikkuna (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: jäähdytysjakso (ms), kun API-avainpalveluntarjoajan kynnys on saavutettu. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-avainpalveluntarjoaja siirtyy DEGRADED-tilaan tällä virhemäärällä. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajan resetTimeout-arvon korotuksen enimmäiskerroin. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-avainpalveluntarjoajan viivettä korotetaan näin monen avoimen jakson jälkeen. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: virheiden määrä ennen kuin koko paikallinen palveluntarjoaja siirtyy jäähdytysjaksolle. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: paikallisten palveluntarjoajien liukuva virhelaskentaikkuna (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Palveluntarjoajatason katkaisija: jäähdytysjakso (ms), kun paikallisen palveluntarjoajan kynnys on saavutettu. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Viivetaso, jolla kontekstivälimuistin kiinnityksen palveluntarjoaja katsotaan pysyvästi epäkuntoiseksi ja kiinnitys poistetaan varajärjestelmään siirtymistä varten. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Värähtelyä estävä aikaikkuna (ms), jonka ajan lyhyitä tilapäisiä jäähdytysjaksoja siedetään ennen kontekstivälimuistin kiinnityksen poistamista. | ### Skenaariot | Skenaario | Määritys | | ------------------------------------------- | ----------------------------------------------------- | | **Pitkäkestoinen koodin generointi** | `REQUEST_TIMEOUT_MS=900000` (15 min) | -| **Striimin kokonaiskeston rajoittaminen** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | +| **Rajoita tietovirran kokonaiskestoa** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | | **Nopea epäonnistuminen tuotanto-API:ssa** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **Laajennettua päättelyä käyttävät mallit** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min osien välillä) | @@ -1111,68 +1120,68 @@ työpöytäasennusta varten. --- -## 21. Välityspalvelimen kunto - -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ------------------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Nopean epäonnistumisen terveystarkistuksen aikakatkaisu. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Aikaikkuna (tunteina), jota käytetään ehdokasvälityspalvelinten keskimääräisen viiveen laskemiseen viiveoptimoidussa poolistrategiassa. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Terveystarkistuksen tulosvälimuistin TTL. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Epäonnistuneiden välityspalvelimen terveystarkistuspyyntöjen välimuistin TTL. Pidä tämä lyhyempänä kuin `PROXY_HEALTH_CACHE_TTL_MS`, jotta suuren samanaikaisuuden aiheuttamat tilapäiset välityspalvelimen aikakatkaisut yritetään nopeasti uudelleen poistamatta nopeaa epäonnistumista käytöstä todella toimimattomilta välityspalvelimilta. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Aseta arvoksi `false`, jos haluat poistaa käytöstä taustalla toimivan välityspalvelinten kunnon ajastimen, joka tarkistaa rekisteröidyt välityspalvelimet säännöllisesti. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Taustalla toimivan terveysajastimen tarkistuskierroksen aikaväli millisekunteina (vähintään `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ajastimen ja `/api/settings/proxies/auto-test`-päätepisteen käyttämä tavoitettavuustarkistuksen kohde. Määritä kohteeksi sisäinen tai itse ylläpidetty URL, jos haluat välttää julkisen oletuskohteen käytön. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Kussakin erässä samanaikaisesti aloitettavien tarkistusten määrä, jonka ajastin ja `/api/settings/proxies/auto-test`-päätepiste jakavat. Alaraja on 1 ja yläraja 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Viive millisekunteina erän kahden tarkistuspyynnön lähetyksen välillä. Ilman sitä koko erä lähtee samalla hetkellä, jolloin jaettu ulosmenon IP-osoite voi laukaista kohteen nopeusrajoituksen. Aseta arvoksi `0`, jos haluat poistaa porrastuksen käytöstä; yläraja on 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Aseta arvoksi "false", jos haluat lopettaa välityspalvelimelle määritetyn palveluntarjoajan todellisen isännän tarkistamisen (`GET /models`, ei API-avainta) ja käyttää sen sijaan aina kohdetta `PROXY_HEALTH_TEST_URL`. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Kun arvo on `false` (oletus), automaattiset tavoitettavuustarkistukset (ajastin ja `/api/settings/proxies/auto-test`-toiminnon "Test All" -painike) ovat **vain luku -tilassa** eivätkä koskaan kirjoita välityspalvelimen tilaa — vain operaattori asettaa sen aktiiviseksi tai passiiviseksi, joten epävakaa tarkistus ei voi jättää määritettyä välityspalvelinta jumiin (#6246). Aseta arvoksi `true`, jos haluat palauttaa vanhan testaa-ja-aseta-toiminnan. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Erikseen käyttöön otettava ominaisuuslippu (katso [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); hallintapaneelin tietokantaohitus on ensisijainen). `true` (tai `1`, `yes`) näyttää hallintapaneelissa välityspalvelinpoolin alla vain luku -muotoisen ulosmenohavainnon (erilliset ulosmenon IP-osoitteet, yhteydet ja yhden IP-osoitteen takana useimmin havaittu määrä viimeisten 24 tunnin ajalta välityspalvelinlokin perusteella). Tätä ei koskaan käytetä reititykseen. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Aseta arvoksi `true`, jotta ajastin poistaa välityspalvelimet automaattisesti toistuvien peräkkäisten epäonnistumisten jälkeen. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Peräkkäisten epäonnistumisten määrä, jonka jälkeen ajastin poistaa välityspalvelimen automaattisesti (kun `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Aseta arvoksi `true`, jotta ajastin poistaa välityspalvelimen pehmeästi käytöstä (tila `dead`, ei koskaan poisteta) toistuvien peräkkäisten epäonnistumisten jälkeen sen poistamisen sijaan. Tuhoamaton vaihtoehto asetukselle `PROXY_AUTO_REMOVE`: välityspalvelin poistuu välittömästi poolin ja kierron valinnasta (käyttöaluepoolin valinnan käyttämä toimintatilasuodatin sulkee sen jo pois) ja aktivoituu automaattisesti uudelleen, kun tarkistukset alkavat jälleen onnistua. Käyttää samaa `PROXY_AUTO_REMOVE_AFTER`-raja-arvoa. Jos molemmat liput ovat `true`, `PROXY_AUTO_REMOVE` on ensisijainen. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Salli OAuth- ja palveluntarjoajan validointikulkujen ohittaa kiinnitetty välityspalvelin ja muodostaa suora yhteys, kun välityspalvelimen tavoitettavuuden ennakkotarkistukset epäonnistuvat. Voimassa oleva ensisijaisuusjärjestys on ominaisuuslippujen tietokantaohitus > ympäristömuuttuja > oletusarvo. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `open-sse/services/rateLimitManager.ts` | Enimmäisaika, jonka pyyntö odottaa 429-vastauksen jälkeen ennen epäonnistumista. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Yläraja sille, kuinka kauan hyväksytty pyyntö voi pysyä suorituksessa ennen sen nopeusrajoitusvarauksen vanhenemista — tämä on erotettu jonon odotusbudjetista, jotta hidas noudon aloitus ei-inkrementaalisissa yhdyskäytävissä ei aiheuta aikakatkaisua (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (poistettu käytöstä) | `open-sse/services/rateLimitManager.ts` | Jonoon hyväksymisen yläraja: hylkää 429-virheellä `queue_full`, kun näin monta pyyntöä on jo jonossa. `0` = rajoittamaton (oletus). | -| `RATE_LIMIT_AUTO_ENABLE` | _(ei asetettu)_ | `open-sse/services/rateLimitManager.ts` | Pakota nopeusrajoituksen automaattisen turvaverkon käyttöönotto tai käytöstäpoisto tallennetusta hallintapaneelin asetuksesta riippumatta. Arvot `true`/`1`/`on` pakottavat sen käyttöön ja `false`/`0`/`off` pois käytöstä. | -| `PROVIDER_COOLDOWN_ENABLED` | _(ei asetettu → pois käytöstä)_ | `open-sse/services/providerCooldownTracker.ts` | Erikseen käyttöön otettava, pyyntöjen välinen yleinen palveluntarjoajan tai yhteyden jäähdytysajan seuranta. Oletuksena POIS KÄYTÖSTÄ (päällekkäinen yhteyden jäähdytyksen ja palveluntarjoajan piirikatkaisijan kanssa). Ota käyttöön arvoilla `true`/`1`/`on`. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Vähimmäisjäähdytysaika (ms), ennen kuin epäonnistunutta palveluntarjoajaa tai yhteyttä yritetään uudelleen. Aika kasvaa eksponentiaalisesti peräkkäisten epäonnistumisten myötä. Käytetään vain, kun `PROVIDER_COOLDOWN_ENABLED` on käytössä. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Jäähdytysajan enimmäisraja (ms), jonka jälkeen epäonnistunutta palveluntarjoajaa tai yhteyttä yritetään joka tapauksessa uudelleen. Käytetään vain, kun `PROVIDER_COOLDOWN_ENABLED` on käytössä. | -| `STREAM_RECOVERY_ENABLED` | _(ei asetettu → pois käytöstä)_ | `src/lib/resilience/settings.ts` (alustus) → `open-sse/services/streamRecovery.ts` (logiikka) | **Mitä:** katkenneiden ylävirran tietovirtojen läpinäkyvä palautus (free-claude-code-porttaus). Viivyttää SSE-avausikkunaa enintään `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), jotta _vahvistusta edeltävä_ katkos — joka tapahtuu ennen kuin yksikään tavu saavuttaa asiakkaan — avataan uudelleen ja yritetään huomaamattomasti uudelleen. **Milloin otetaan käyttöön:** epävakaat ylävirrat, jotka katkeavat usein 0 tavun kohdalla tietovirran alussa; jätä POIS KÄYTÖSTÄ, jos et voi hyväksyä enintään 750 ms:n lisäystä jokaisen tietovirran ensimmäisen tunnuksen saapumisaikaan. Hyväksyy arvot `true`/`1`/`on`. Alustaa tallennetun vikasietoisuusasetuksen; määrittämisen jälkeen hallintapaneelin asetus on ensisijainen. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(ei asetettu → pois käytöstä)_ | `src/lib/resilience/settings.ts` (alustus) → `open-sse/services/streamRecovery.ts` (logiikka) | **Mitä:** tietovirran keskeltä jatkaminen (vaihe 4.4) — _vahvistuksen jälkeisen_ katkoksen jälkeen (tavut ovat jo saavuttaneet asiakkaan) pyyntö lähetetään uudelleen käyttäen osittaista tekstiä avustajan esitäyttönä, ja puuttuva loppuosa liitetään mukaan. Vain raakatekstiä käyttävät OpenAI-yhteensopivat tietovirrat; ei koskaan käynnisty työkalukutsun ollessa kesken. **Milloin otetaan käyttöön:** pitkät generoinnit, jotka katkeavat vastauksen keskellä, ja hyväksyt palautetun loppuosan saapumisen yhtenä ryöppynä tunnus tunnukselta saapumisen sijaan. Riippumaton asetuksesta `STREAM_RECOVERY_ENABLED` (eri riskiprofiili). Hyväksyy arvot `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(ei asetettu → pois käytöstä)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Erikseen käyttöön otettava aktiivisen tietovirran hyödyllisen tulosteen valvontatoiminto. Tunnistaa tietovirrat, jotka lähettävät edelleen osia mutta jäävät määritetyn avustajan tulostenopeuden alapuolelle; sykesignaalit, käyttötapahtumat, tyhjät muutokset sekä työkalu- ja päättelyvaiheet eivät näytä virheellisesti edistymiseltä. Erillinen joutoajan ja ehdottoman määräajan aikakatkaisuista. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Suoja-aika ennen suoritustehon arviointia, rajattu välille 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Liukuva hyödyllisen tulosteen ikkuna, rajattu välille 1000–600000 ms; ennen keskeytystä vaaditaan yksi kokonainen ikkuna. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Avustajan UTF-8-tulosteen vähimmäistavunopeus (konservatiivinen tunnusten korvikemittari), rajattu välille 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Pienin nollasta poikkeava hyödyllisen tulosteen otos, jota pidetään mitattavana; rajattu välille 1–1000000 tavua. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Porrastusväli (ms) palveluntarjoajan tunnusten terveystarkistusten välillä käynnistyksen yhteydessä. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Satunnaistetun hajonnan vähimmäismäärä (ms), joka lisätään arvon `HEALTHCHECK_STAGGER_MS` päälle palveluntarjoajan tunnusten terveystarkistusten välillä pyyntöryöppyjen estämiseksi (ongelma #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Satunnaistetun hajonnan enimmäismäärä (ms), joka lisätään arvon `HEALTHCHECK_STAGGER_MS` päälle palveluntarjoajan tunnusten terveystarkistusten välillä pyyntöryöppyjen estämiseksi (ongelma #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Samanaikaisten tarkistusten eräkoko käynnistyksen yhteydessä suoritettavalle tunnusten terveystarkistuskierrokselle; suuremmat arvot tarkistavat useampia yhteyksiä rinnakkain, pienemmät arvot vähentävät ryöppykuormaa (ongelma #7875, ongelman #7719 regressio). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Automaattisten uudelleenyritysten määrä mallikohtaisissa jäähdytysvastauksissa ennen virheen palauttamista asiakkaalle. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Uudelleenyritysten välisen enimmäisviiveen pituus sekunteina jäähdytyksen aikana. Tämä arvo toimii ylärajana ylävirran `Retry-After`-arvosta riippumatta. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom-tunnussäästövälityspalvelimen URL. Hallintapaneelin elinkaari (`api/headroom/*`) käynnistää oletusarvoisesti paikallisen `headroom-ai`-komentorivityökalun loopback-osoitteessa; ohita asetus vain, jos haluat osoittaa ulkoiseen Docker-sivuvaunuvälityspalvelimeen. | +## 21. Välityspalvelinten kunto + +| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | +| ------------------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Nopean epäonnistumisen kuntotarkistuksen aikakatkaisu. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Aikaikkuna (tunteina), jota käytetään ehdolla olevien välityspalvelinten keskimääräisen latenssin laskemiseen latenssioptimoidussa poolistrategiassa. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Kuntotarkistuksen tuloksen välimuistin TTL. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Epäonnistuneiden välityspalvelinten kuntotarkistusten välimuistin TTL. Pidä tämä lyhyempänä kuin `PROXY_HEALTH_CACHE_TTL_MS`, jotta suuren rinnakkaisuuden aiheuttamien väliaikaisten välityspalvelinten aikakatkaisujen jälkeen yritetään nopeasti uudelleen poistamatta nopeaa epäonnistumista käytöstä aidosti toimimattomien välityspalvelinten kohdalla. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Aseta arvoksi `false`, jos haluat poistaa käytöstä taustalla toimivan välityspalvelinten kunnon ajastimen, joka tarkistaa rekisteröidyt välityspalvelimet säännöllisesti. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Taustalla toimivan kuntoajastimen tarkistuskierrosten aikaväli millisekunteina (vähintään `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ajastimen ja `/api/settings/proxies/auto-test`-päätepisteen käyttämä tavoitettavuustestin kohde. Aseta arvoksi sisäinen tai itse ylläpidetty URL, jotta julkista oletuskohdetta ei käytetä. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Kussakin erässä samanaikaisesti käynnistettävien testien määrä, jota ajastin ja `/api/settings/proxies/auto-test`-päätepiste käyttävät yhdessä. Vähimmäisarvo on 1 ja enimmäisarvo 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Kahden testipyynnön lähetyksen välinen viive millisekunteina erän sisällä. Ilman sitä koko erä lähetetään samanaikaisesti, jolloin yhteinen lähtevä IP-osoite voi laukaista kohteen nopeusrajoituksen. Poista porrastus käytöstä asettamalla arvoksi `0`; enimmäisarvo on 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Aseta arvoksi "false", jotta välityspalvelimelle määritetyn palveluntarjoajan todelliseen isäntään kohdistuvat testit (`GET /models`, ei API-avainta) lopetetaan ja niiden sijaan käytetään aina `PROXY_HEALTH_TEST_URL`-osoitetta. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Kun arvo on `false` (oletus), automaattiset tavoitettavuustestit (ajastin ja `/api/settings/proxies/auto-test`-päätepisteen "Testaa kaikki" -painike) ovat **vain luku -tilassa** eivätkä koskaan muuta välityspalvelimen tilaa — vain ylläpitäjä asettaa sen aktiiviseksi tai passiiviseksi, joten epävakaa testi ei voi jättää määritettyä välityspalvelinta pois käytöstä (#6246). Palauta aiempi testaa-ja-aseta-toiminta asettamalla arvoksi `true`. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Erikseen käyttöönotettava ominaisuusvalitsin (katso [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); hallintapaneelin tietokanta-asetus ohittaa tämän). `true` (tai `1`, `yes`) näyttää hallintapaneelissa välityspalvelinpoolin alla vain luku -muotoiset lähtevän liikenteen havainnot (erilliset lähtevät IP-osoitteet, yhteydet ja yleisimmin saman IP-osoitteen takana havaitut yhteydet viimeisten 24 tunnin ajalta välityspalvelinlokin perusteella). Tietoja ei koskaan käytetä reititykseen. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Aseta arvoksi `true`, jotta ajastin voi poistaa välityspalvelimet automaattisesti useiden peräkkäisten epäonnistumisten jälkeen. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Peräkkäisten epäonnistumisten määrä, jonka jälkeen ajastin poistaa välityspalvelimen automaattisesti (kun `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Aseta arvoksi `true`, jotta ajastin poistaa välityspalvelimen pehmeästi käytöstä (tila `dead`, ei koskaan poisteta) toistuvien peräkkäisten virheiden jälkeen sen poistamisen sijaan. Tämä on tietoja tuhoamaton vaihtoehto asetukselle `PROXY_AUTO_REMOVE`: välityspalvelin poistuu välittömästi poolin/kierron ratkaisusta (laajuuspoolin ratkaisun käyttämä aktiivisuustilan suodatin sulkee sen jo pois) ja aktivoidaan automaattisesti uudelleen, kun se alkaa jälleen läpäistä tarkistukset. Käyttää samaa `PROXY_AUTO_REMOVE_AFTER`-kynnysarvoa. Jos molempien asetusten arvo on `true`, `PROXY_AUTO_REMOVE` on etusijalla. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Salli OAuth- ja palveluntarjoajan vahvistustyönkulkujen ohittaa kiinnitetty välityspalvelin ja muodostaa yhteys suoraan, kun välityspalvelimen tavoitettavuuden ennakkotarkistukset epäonnistuvat. Voimassa oleva etusijajärjestys on ominaisuuslippujen tietokannan ohitus > ympäristömuuttuja > oletusarvo. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `src/lib/resilience/settings.ts` | **Jonotusajan** oletusbudjetti: kuinka kauan pyyntö voi odottaa palveluntarjoajan vapaata paikkaa ja olla jonossa ennen hylkäämistä pääsemättä koskaan ylävirran palveluun. Ajastin tyhjennetään, kun työn suoritus alkaa — suoritusta rajoittaa erikseen `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Ympäristömuuttuja määrittää vain oletusarvon: tallennettu `resilienceSettings.requestQueue.maxWaitMs` ja sen jälkeen yhteyskohtainen `rateLimitOverrides.maxWaitMs` ohittavat sen kumpikin. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Enimmäisaika, jonka hyväksytty pyyntö voi pysyä suorituksessa ennen kuin sen nopeusrajoitusvaraus vanhenee — tämä on erotettu jonotusajan budjetista, jotta haun hidas käynnistyminen ei-inkrementaalisissa yhdyskäytävissä ei aiheuta aikakatkaisua (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (pois käytöstä) | `open-sse/services/rateLimitManager.ts` | Jonoon hyväksymisen enimmäisraja: hylkää 429-virheellä `queue_full`, kun näin monta pyyntöä on jo jonossa. `0` = rajoittamaton (oletus). | +| `RATE_LIMIT_AUTO_ENABLE` | _(ei asetettu)_ | `open-sse/services/rateLimitManager.ts` | Pakota nopeusrajoituksen automaattisen käyttöönoton turvaverkko käyttöön tai pois käytöstä tallennetusta Dashboard-asetuksesta riippumatta. Arvot `true`/`1`/`on` pakottavat sen käyttöön ja arvot `false`/`0`/`off` pois käytöstä. | +| `PROVIDER_COOLDOWN_ENABLED` | _(ei asetettu → pois käytöstä)_ | `open-sse/services/providerCooldownTracker.ts` | Valinnainen globaali, pyyntöjen välinen palveluntarjoajan/yhteyden jäähdytysajan seuranta. Oletusarvoisesti POIS KÄYTÖSTÄ (päällekkäinen Connection Cooldown- / Provider Circuit Breaker -toimintojen kanssa). Arvot `true`/`1`/`on` ottavat sen käyttöön. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Vähimmäisjäähdytysaika (ms), ennen kuin epäonnistunutta palveluntarjoajaa/yhteyttä yritetään uudelleen. Aikaa kasvatetaan eksponentiaalisesti peräkkäisten virheiden määrän mukaan. Käytetään vain, kun `PROVIDER_COOLDOWN_ENABLED` on käytössä. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Enimmäisjäähyaika (ms), jonka jälkeen epäonnistunutta palveluntarjoajaa/yhteyttä yritetään joka tapauksessa uudelleen. Käytetään vain, kun `PROVIDER_COOLDOWN_ENABLED` on käytössä. | +| `STREAM_RECOVERY_ENABLED` | _(asettamatta → pois käytöstä)_ | `src/lib/resilience/settings.ts` (alustus) → `open-sse/services/streamRecovery.ts` (logiikka) | **Mitä:** katkenneiden ylävirran suoratoistojen läpinäkyvä palautus (free-claude-code-porttaus). Pidättää avaavaa SSE-ikkunaa enintään `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), jotta _ennen vahvistusta_ tapahtuva katkeaminen — ennen kuin yksikään tavu saavuttaa asiakkaan — voidaan avata uudelleen ja yrittää huomaamattomasti uudelleen. **Milloin ottaa käyttöön:** epävakaat ylävirrat, jotka katkaisevat suoratoiston usein 0 tavun kohdalla sen alussa; jätä POIS käytöstä, jos et voi hyväksyä enintään 750 ms:n lisäystä jokaisen suoratoiston ensimmäisen tokenin saapumisaikaan. Hyväksyy arvot `true`/`1`/`on`. Alustaa pysyvän Resilience-asetuksen; hallintapaneelin asetus ohittaa sen, kun se on määritetty. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(asettamatta → pois käytöstä)_ | `src/lib/resilience/settings.ts` (alustus) → `open-sse/services/streamRecovery.ts` (logiikka) | **Mitä:** suoratoiston keskeltä jatkaminen (vaihe 4.4) — _vahvistuksen jälkeisen_ katkeamisen jälkeen (tavuja on jo saavuttanut asiakkaan) tehdään uusi pyyntö käyttäen osittaista tekstiä avustajan esitäyttönä ja liitetään puuttuva loppuosa. Vain pelkkää tekstiä sisältäville OpenAI-yhteensopiville suoratoistoille; ei koskaan käynnisty työkalukutsun ollessa kesken. **Milloin ottaa käyttöön:** pitkät generoinnit, jotka katkeavat kesken vastauksen, kun hyväksyt sen, että palautettu loppuosa saapuu yhtenä purskeena token kerrallaan saapumisen sijaan. Riippumaton asetuksesta `STREAM_RECOVERY_ENABLED` (eri riskiprofiili). Hyväksyy arvot `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(asettamatta → pois käytöstä)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Valinnainen aktiivisen suoratoiston hyödyllisen tulosteen valvontamekanismi. Havaitsee suoratoistot, jotka lähettävät edelleen osia mutta jäävät määritetyn avustajan tulostusnopeuden alapuolelle; heartbeat-viestit, käyttötapahtumat, tyhjät deltat sekä työkalu- ja päättelyvaiheet eivät näyttäydy edistymisenä. Erillinen käyttämättömyyden ja ehdottoman määräajan aikakatkaisuista. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Suoja-aika ennen läpäisykyvyn arviointia, rajattu välille 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Liukuva hyödyllisen tulosteen ikkuna, rajattu välille 1000–600000 ms; keskeyttäminen edellyttää yhtä täyttä ikkunaa. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Avustajan UTF-8-tulosteen vähimmäisnopeus tavuina (konservatiivinen tokenien korvikemittari), rajattu välille 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Mitattavaksi katsottavan nollasta poikkeavan hyödyllisen tulostenäytteen vähimmäiskoko, rajattu välille 1–1000000 tavua. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Porrastusväli (ms) palveluntarjoajien tokenien kuntotarkistusten välillä käynnistyksen yhteydessä. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Satunnaistetun hajonnan vähimmäismäärä (ms), joka lisätään asetuksen `HEALTHCHECK_STAGGER_MS` päälle palveluntarjoajien tokenien kuntotarkistusten välillä purskeiden estämiseksi (ongelma #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Satunnaistetun hajonnan enimmäismäärä (ms), joka lisätään asetuksen `HEALTHCHECK_STAGGER_MS` päälle palveluntarjoajien tokenien kuntotarkistusten välillä purskeiden estämiseksi (ongelma #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Samanaikaisten tarkistusten eräkoko käynnistyksen yhteydessä suoritettavalle tunnusten kuntotarkistuskierrokselle; suuremmat arvot tarkistavat useampia yhteyksiä rinnakkain, kun taas pienemmät arvot vähentävät kuormituspiikkejä (ongelma #7875, ongelman #7719 regressio). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Automaattisten uudelleenyritysten määrä mallikohtaisissa jäähdytysvastauksissa ennen virheen palauttamista asiakkaalle. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Jäähdytykseen liittyvien uudelleenyritysten välinen enimmäisviive (sekunteina). Tämä arvo toimii ylärajana ylävirran `Retry-After`-arvosta riippumatta. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroomin tunnuksia säästävän välityspalvelimen URL-osoite. Hallintapaneelin elinkaari (`api/headroom/*`) käynnistää oletusarvoisesti paikallisen `headroom-ai`-CLI:n loopback-osoitteessa; ohita arvo vain, jos haluat käyttää ulkoista Docker-sivuvaunuvälityspalvelinta. | ### Suoratoiston palautuksen säätövakiot -Palautuksen viivästyskäyttäytymistä säädetään kovakoodatuilla vakioilla tiedostossa -`open-sse/config/constants.ts` (`STREAM_RECOVERY`), jotka on esitetty tässä viitteeksi — +Palautuksen viivästystoimintaa säädetään tiedostoon +`open-sse/config/constants.ts` kovakoodatuilla vakioilla (`STREAM_RECOVERY`), jotka esitetään tässä viitteeksi — niiden muuttaminen edellyttää koodin muokkaamista, ei ympäristömuuttujaa: -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — kuinka kauan SSE-yhteyden alkuikkunaa pidätetään, - jotta varhainen katkeaminen voidaan yrittää uudelleen ennen kuin yhtäkään tavua lähetetään asiakkaalle. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — pidätetyn ikkunan ehdoton yläraja; lähetys - (tyhjennys + läpivienti) aloitetaan heti, kun näin monta tavua on kertynyt, ajastimesta riippumatta. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — taustapalvelun suoratoiston läpinäkyvien - uudelleenavausten enimmäismäärä niin kauan kuin pidätettyä sisältöä ei ole vielä lähetetty. +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — kuinka kauan SSE-yhteyden avausikkunaa pidetään + odottamassa, jotta varhainen katkeaminen voidaan yrittää uudelleen ennen kuin asiakkaalle lähetetään yhtäkään tavua. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — odottavan ikkunan ehdoton yläraja; vahvista + (tyhjennys + läpivienti) heti, kun näin monta tavua on kertynyt, ajastimesta riippumatta. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — ylävirran suoratoiston läpinäkyvien + uudelleenavausten enimmäismäärä, kun viivästettyjä tietoja ei ole vielä vahvistettu. > **Palveluntarjoajakohtainen liukuvan ikkunan nopeusrajoitus (ei ympäristömuuttujaa):** FCC:stä siirretty -> palveluntarjoajakohtaisen liukuvan ikkunan nopeusrajoituksen _varamekanismi_ on olemassa koodissa +> palveluntarjoajakohtaisen liukuvan ikkunan nopeusrajoituksen _varamekanismi_ on toteutettu koodissa > (`open-sse/services/providerDefaultRateLimit.ts`, kytketty tiedoston -> `open-sse/services/rateLimitManager.ts` kautta), mutta se toimitetaan **tyhjällä oletuskartalla** -> eikä sillä ole tällä hetkellä **ylläpitäjän ympäristömuuttujaa** — se voidaan ottaa käyttöön vain testikoukun / -> koodimuutoksen kautta. Sitä ei tarkoituksella ole lueteltu yllä olevassa taulukossa. `(token, IP)`-kohtainen -> välityspalvelun rajoitin, jolla _on_ säätöasetus, on `RELAY_IP_PER_MINUTE` (§3 Verkko ja portit). +> `open-sse/services/rateLimitManager.ts` kautta), mutta sen mukana toimitetaan **tyhjä oletuskartta**, +> eikä sillä ole tällä hetkellä **operaattorin ympäristömuuttujaa** — se voidaan ottaa käyttöön vain testikoukun / +> koodimuutoksen avulla. Sitä ei tarkoituksella ole lueteltu yllä olevassa taulukossa. `RELAY_IP_PER_MINUTE` on +> välityspalvelun ` (token, IP)`-kohtainen rajoitin, jolla _on_ säätöasetus (§3 Verkko ja portit). --- @@ -1181,32 +1190,33 @@ niiden muuttaminen edellyttää koodin muokkaamista, ei ympäristömuuttujaa: > [!CAUTION] > Nämä muuttujat tuottavat **yksityiskohtaista tulostetta** ja voivat vuotaa arkaluonteisia tietoja. **Älä koskaan ota niitä käyttöön tuotannossa.** -| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | -| ------------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(ei asetettu)_ | `open-sse/executors/cursor.ts` | Aseta arvoksi `1`, jos haluat ottaa käyttöön Cursor-suorittimen yksityiskohtaiset lokit (puretut SSE-lohkot jne.). | -| `CURSOR_STREAM_DEBUG` | _(ei asetettu)_ | `open-sse/executors/cursor.ts` | Taaksepäin yhteensopiva alias muuttujalle `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(ei asetettu)_ | `open-sse/executors/cursor.ts` | Valinnainen tiedostopolku, johon raa'at puretut Cursor-lohkot kirjoitetaan, kun `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor-suorittimen virran toimettomuuden aikakatkaisu (ms). | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Lisäaika (ms) composer-kohteen kv_after_text-pehmeän päättimen jälkeen, kun puskuroituja tavuja on jäljellä — antaa perässä tulevalle exec_mcp-työkalukutsulle aikaa viimeistellä kehyksensä. | -| `CURSOR_TOOL_DIRECTIVE` | käytössä (`!== "0"`) | `open-sse/executors/cursor.ts` | Työkalukutsujen vahvistusdirektiivi, joka saa composer-2.5:n tekemään työkalukutsut luotettavasti. Poista käytöstä asettamalla arvoksi `0`. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(ei asetettu)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Operaattorin määrittämä järjestelmäkehoteteksti, joka lisätään järjestelmäviestiin käännöksen JÄLKEEN (käännöksen jälkeinen injektio) ja joka välitetään codex/Responses- ja `/v1/messages`-poluille. Käytetään myös direktiivin etuliitteenä, joka poistetaan kaiutetuista järjestelmän johdantolohkoista. Jätä asettamatta poistaaksesi toiminnon käytöstä. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Kuvakohtainen noudon aikakatkaisu (ms) etäpalvelun `image_url`-syötteelle. | -| `CURSOR_STATE_DB_PATH` | _(etsitään)_ | `open-sse/utils/cursorVersionDetector.ts` | Ohita Cursor IDE:n tilatietokannan hakupolku, jota käytetään IDE-version tunnistamiseen. | -| `CURSOR_AGENT_CLI_VERSION` | _(tunnista / kiinnitä)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI:n koontitunnus (`YYYY.MM.DD-`) Agent Runin `x-cursor-client-version: cli-…`-otsaketta varten. | -| `CURSOR_AGENT_BIN` | _(ei asetettu)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Kuvien luontiin käytettävän Cursor Agent -binääritiedoston polku. Jos muuttujaa ei ole asetettu, käsittelijä käyttää ensin arvoa `providerSpecificData.agentBin` ja sitten PATH-muuttujaa. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Kuvakohtainen kokonaisaikaraja (ms) Cursor Agent -kuvatöille. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jaetun käyttöpaikan rinnakkaisuusrajoitus Cursor-kuvatöille. | -| `CURSOR_IMG_MODEL` | pyyntö / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ohita Cursor CLI:n `--model` kuvatöitä varten. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC:n (uncensored.com) kuvanluonnin tulosten kyselyväli (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC:n kuvanluonnin tulosten kyselyn kokonaisaikaraja (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC:n (uncensored.com) videonluonnin tulosten kyselyväli (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC:n videonluonnin tulosten kyselyn kokonaisaikaraja (ms). | -| `CURSOR_DATA_DIR` | _(etsitään)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Ohita Cursor Agent CLI:n datahakemisto (`…/versions/`); sama muuttuja on virallisen agentin käytössä. | -| `CURSOR_TOKEN` | _(ei asetettu)_ | `scripts/ad-hoc/cursor-tap.cjs` | Kehittäjätyökalujen käyttämä suora Cursor-bearer-tunniste. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | pois käytöstä (ota käyttöön arvolla `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Kirjaa suurten keskusteluhyötykuormien sisältötyypin ja pituuden merkinnät, kun arvoksi on asetettu `"1"`. Oletuksena pois käytöstä lokikohinan vähentämiseksi. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(ei asetettu)_ | `open-sse/handlers/responseTranslator.ts` | Aseta arvoksi `true`, jos haluat kirjata Responses API:n SSE→JSON-käännöksen tiedot. | -| `DEBUG_CLAUDE_NONSTREAM` | _(ei asetettu)_ | `open-sse/handlers/responseTranslator.ts` | Aseta arvoksi `true`, jos haluat tuoda tyhjät textContent-lohkot näkyviin Clauden vastausten käännöspolussa (vain virheenkorjaukseen). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(ei asetettu)_ | E2E-testikehys | Aseta arvoksi `true`, jos haluat ottaa käyttöön E2E-testitilan (kevennetty todennus, testikytkennät). | +| Muuttuja | Oletusarvo | Lähdetiedosto | Kuvaus | +| ------------------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(ei asetettu)_ | `open-sse/executors/cursor.ts` | Aseta arvoksi `1`, jotta Cursor-suorittimen yksityiskohtaiset lokit otetaan käyttöön (puretut SSE-lohkot jne.). | +| `CURSOR_STREAM_DEBUG` | _(ei asetettu)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG`-muuttujan taaksepäin yhteensopiva alias. | +| `CURSOR_DUMP_FILE` | _(ei asetettu)_ | `open-sse/executors/cursor.ts` | Valinnainen tiedostopolku, johon kirjoitetaan raa'at puretut Cursor-lohkot, kun `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor-suorittimen tietovirran joutoaikakatkaisu (ms). | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Lisäaikaikkuna (ms) composer-kohteen kv_after_text-pehmeän päättimen jälkeen, kun tavujonossa on vielä dataa — antaa jäljessä tulevalle exec_mcp-työkalukutsulle aikaa viimeistellä kehyksensä. | +| `CURSOR_TOOL_DIRECTIVE` | käytössä (`!== "0"`) | `open-sse/executors/cursor.ts` | Työkalun vahvistusdirektiivi, joka saa composer-2.5:n tekemään työkalukutsuja luotettavasti. Poista käytöstä asettamalla arvoksi `0`. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(ei asetettu)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Operaattorin määrittämä järjestelmäkehoteteksti, joka liitetään järjestelmäviestiin käännöksen JÄLKEEN (käännöksen jälkeinen lisäys) ja joka välitetään codex/Responses- ja `/v1/messages`-poluille. Sitä käytetään myös direktiivin etuliitteenä, joka poistetaan toistetuista järjestelmän johdantolohkoista. Jätä asettamatta poistaaksesi toiminnon käytöstä. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (pois käytöstä) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Aseta arvoksi `1`, jotta toistetut järjestelmäkehotteen johdantolohkot poistetaan openai→claude-tietovirran alusta. Oletusarvoisesti pois käytöstä — heuristiikat on muotoiltu englanninkielistä proosaa varten ja ne muuttavat vastauksen hyötykuormaa, joten tällaisella osiolla aidosti alkava vastaus menettäisi sen. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Kuvakohtainen noudon aikakatkaisu (ms) etämuotoiselle `image_url`-kuvasyötteelle. | +| `CURSOR_STATE_DB_PATH` | _(etsitään)_ | `open-sse/utils/cursorVersionDetector.ts` | Ohita Cursor IDE:n tilatietokannan hakupolku, jota käytetään IDE-version tunnistamiseen. | +| `CURSOR_AGENT_CLI_VERSION` | _(tunnista / kiinnitä)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI:n koontitunnus (`YYYY.MM.DD-`) Agent Runin `x-cursor-client-version: cli-…`-otsaketta varten. | +| `CURSOR_AGENT_BIN` | _(ei asetettu)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Kuvien luomiseen käytettävän Cursor Agent -binääritiedoston polku. Jos muuttujaa ei ole asetettu, käsittelijä käyttää ensin `providerSpecificData.agentBin`-arvoa ja sitten PATH-muuttujaa. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agentin kuvatöiden kuvakohtainen kokonaisaikaraja (ms). | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jaetun käyttöpaikan samanaikaisuusrajoitus Cursor-kuvatöille. | +| `CURSOR_IMG_MODEL` | pyyntö / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ohita Cursor CLI:n `--model`-arvo kuvatöitä varten. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC:n (uncensored.com) kuvageneroinnin tulosten kyselyväli (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC:n kuvageneroinnin tulosten kyselyn kokonaisaikaraja (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC:n (uncensored.com) videogeneroinnin tulosten kyselyväli (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC:n videogeneroinnin tulosten kyselyn kokonaisaikaraja (ms). | +| `CURSOR_DATA_DIR` | _(etsitään)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Ohita Cursor Agent CLI:n datahakemisto (`…/versions/`); sama muuttuja, jota virallinen agentti käyttää. | +| `CURSOR_TOKEN` | _(ei asetettu)_ | `scripts/ad-hoc/cursor-tap.cjs` | Kehittäjätyökalujen käyttämä suora Cursor bearer token. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | pois käytöstä (otetaan käyttöön arvolla `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Kirjaa suurten chat-hyötykuormien sisältötyypin ja pituuden tunnisteet, kun arvoksi on asetettu `"1"`. Oletusarvoisesti pois käytöstä lokikohinan vähentämiseksi. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(ei asetettu)_ | `open-sse/handlers/responseTranslator.ts` | Aseta arvoksi `true`, jotta Responses API:n SSE→JSON-käännöksen tiedot kirjataan lokiin. | +| `DEBUG_CLAUDE_NONSTREAM` | _(ei asetettu)_ | `open-sse/handlers/responseTranslator.ts` | Aseta arvoksi `true`, jotta tyhjät textContent-lohkot tuodaan näkyviin Claude-vastauksen käännöspolulla (vain virheenkorjaukseen). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(ei asetettu)_ | E2E-testikehys | Aseta arvoksi `true`, jotta E2E-testitila otetaan käyttöön (kevennetty todennus, testikytkennät). | --- diff --git a/docs/i18n/fi/docs/reference/FEATURE_FLAGS.md b/docs/i18n/fi/docs/reference/FEATURE_FLAGS.md index 0e00f2182177..87c411b2646c 100644 --- a/docs/i18n/fi/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/fi/docs/reference/FEATURE_FLAGS.md @@ -42,130 +42,132 @@ Totuusarvoinen lippu katsotaan **käytössä olevaksi**, kun sen voimassa oleva --- -## Lippuluettelo +## Ominaisuuslippujen luettelo -72 lippua 6 kategoriassa. **Oletusarvo** on määrityksen oletusarvo eli arvo, -jota käytetään, kun tietokannan ohitusarvoa tai ympäristömuuttujaa ei ole. +74 ominaisuuslippua 6 kategoriassa. **Oletus** on määrittelyssä asetettu oletusarvo — arvo, +jota käytetään, kun tietokannan ohitusta tai ympäristömuuttujaa ei ole asetettu. ### Tietoturva (10) -| Avain | Tyyppi | Oletusarvo | Kuvaus | -| --------------------------------------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | totuusarvo | `false` | Vaadi API-avain kaikilta saapuvilta pyynnöiltä. | -| `INPUT_SANITIZER_ENABLED` | totuusarvo | `true` | Ota kaikkien pyyntöjen syötteiden puhdistus käyttöön. | -| `INJECTION_GUARD_MODE` | luettelo | `off` | Kehotesyötteen manipuloinnin suojauksen tila. Arvot: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | totuusarvo | `false` | Peitä henkilötiedot pyynnöistä (`INPUT_SANITIZER_MODE`-asetuksesta riippumatta). | -| `PII_RESPONSE_SANITIZATION` | totuusarvo | `false` | Puhdista henkilötiedot palveluntarjoajien vastauksista. | -| `PII_RESPONSE_SANITIZATION_MODE` | luettelo | `redact` | Henkilötietojen puhdistuksen tila vastauksissa. Arvot: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | totuusarvo | `true` | Estä lähtevät pyynnöt yksityisille ja sisäisille IP-osoitealueille. | -| `ALLOW_API_KEY_REVEAL` | totuusarvo | `false` | Salli todennettujen hallintapaneelin käyttäjien paljastaa tallennetut API-avaimet pelkkien peitettyjen arvojen näyttämisen sijaan. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | totuusarvo | `false` | Sisällytä tilin etuliite AUTH-lokiriveihin (esim. "Käytetään palveluntarjoajan tiliä: abc12345..."). Oletuksena poissa käytöstä, jotta tilien tunnisteet peitetään jaetuissa tai usean vuokraajan prosessilokeissa. Riippumaton virheenkorjaustilasta; virheenkorjaustilan vaihtaminen ei paljasta tätä. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | totuusarvo | `false` | Kun OIDC on käytössä, poista salasanakirjautuminen käytöstä, jotta käyttäjät voivat todentautua vain OIDC-kertakirjautumisella. Kun asetus ei ole käytössä (oletus), sekä salasanakirjautuminen että OIDC ovat käytettävissä. | - -### Verkko (15) - -| Avain | Tyyppi | Oletus | Uudelleenkäynnistys | Kuvaus | -| ----------------------------------------------- | ------- | ------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Ota käyttöön TLS-sormenjäljen häivetila. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Salli /v1/audio/*-reittien käyttää localhostin ulkopuolella isännöityjä OpenAI-yhteensopivia palveluntarjoajasolmuja. Oletusarvoisesti pois käytöstä — äänen reitittäminen etäisäntään muuttaa lähtevän liikenteen identiteettiä, joten ylläpitäjän on tehtävä siitä nimenomainen päätös. Loopback-solmut ovat aina sallittuja, eikä tämä asetus vaikuta niihin. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Kun yhteydelle ei ole määritetty välityspalvelinta, valitse automaattisesti rekisterin ensimmäinen toimiva välityspalvelin. Oletusarvoisesti pois käytöstä (muuten mistä tahansa rekisterin välityspalvelimesta tulee yleinen varavaihtoehto — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Salli OAuth- ja palveluntarjoajan validointiprosessien ohittaa kiinnitetty välityspalvelin ja muodostaa yhteys suoraan, kun välityspalvelimen tavoitettavuuden ennakkotarkistukset epäonnistuvat. Oletusarvoisesti pois käytöstä, koska tämä voi muuttaa lähtevän liikenteen IP-osoitetta. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Kun usean tilin kiertoa suorittavassa toiminnossa tapahtuu verkkopoikkeus (aikakatkaisu tai yhteyden hylkäys/nollaus) eikä epäonnistuneella tilillä ole omaa välityspalvelinta, aseta lyhyt jäähdytysjakso ja ohita muut välityspalvelimettomat tilit pyynnön loppuajaksi sen sijaan, että jokaista yritettäisiin uudelleen. Oletusarvoisesti käytössä (turvallinen: lähtevän liikenteen IP-osoite ei muutu; pienentää vain jaetun lähtevän liikenteen tilien viive- ja jäähdytysriskiä). Poista käytöstä palauttaaksesi välittömän etenemisen ensimmäisen välityspalvelimettoman poikkeuksen yhteydessä. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Välityspalvelinpoolit ja opencoden tilikohtainen kierto lakkaavat tarjoamasta uudelleen juuri epäonnistunutta välityspalvelinta (hylätty TCP-tarkistus tai sen kautta saatu 429) prosessikohtaiseksi ajaksi, joka kaksinkertaistuu jokaisella toistolla enimmäisrajaan asti. Välityspalvelimen tilaa ei tallenneta; jos jokainen ehdokas on sivuutettu, valinta pysyy muuttumattomana. Oletusarvoisesti pois käytöstä. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Näytä koontinäytössä välityspalvelinpoolin kohdalla, kuinka moni havaittu lähtevän liikenteen IP-osoite palveli sen jäseniä viimeisten 24 tunnin aikana ja kuinka moni yhteys käytti niitä. Vain luku -tieto, joka lasketaan välityspalvelinlokista eikä jota koskaan käytetä reititykseen. Oletusarvoisesti pois käytöstä. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Tarkkaile OpenCode-suorittimessa suoratoistetun Responses-vastauksen ensimmäistä runkotavua (aikaikkuna: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, oletus `15000`). Jos 2xx Responses -suoratoisto pysyy äänettömänä aikaikkunan jälkeen, se tulkitaan jumittuneeksi: tili asetetaan jäähdytysjaksolle ja pyyntö kierretään kerran seuraavalle tilille; toinen jumittuminen epäonnistuu heti. Oletusarvoisesti pois käytöstä: jumittuneet suoratoistot odottavat nykyiseen tapaan suoratoiston valmiuden aikakatkaisuun asti. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode-suoritin: jos 403/451 sisältää `user_blocked`-hylkäyksen (ei maantieteellinen esto eikä Cloudflare-sormenjäljen hylkäys), aseta hylätty tili jäähdytysjaksolle ja kierrä seuraavalle tilille enintään kerran pyyntöä kohden; toinen hylkäys palautetaan sellaisenaan ilman onnistumismerkintää. Oletusarvoisesti pois käytöstä: ylävirran käyttäjäeston kiertäminen voi vaikuttaa eston välttelyltä ja levittää merkinnän koko palvelinkantaan. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode-kierto: kahden peräkkäisen tilapäisen ylävirran virheen (5xx tai tyhjä 400) jälkeen pidä tauko ennen seuraavaa tiliä — 1,5 s, joka kaksinkertaistuu jokaisen myöhemmän virheen jälkeen; enimmäiskesto on 6 s taukoa kohden ja 10 s pyyntöä kohden. Tauko ohitetaan, jos asiakas katkaisee yhteyden; epäonnistuneen vastauksen runko vapautetaan ennen odottamista. Oletusarvoisesti pois käytöstä: varajärjestelmään siirtyminen pysyy välittömänä. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode-kierto: pysäytä tilikierros ensimmäiseen 429-vastaukseen, joka luokitellaan todelliseksi nopeusrajoitukseksi (jäsennettävissä oleva `Retry-After` tai runko, jossa mainitaan nopeus- tai käyttörajoitus), ja palauta kyseinen ylävirran 429 muuttamattomana. Luokittelemattomat 429-vastaukset jatkavat kiertoa. Oletusarvoisesti pois käytöstä: ilmaistasoa rajoitetaan lähtevän liikenteen IP-osoitteen mukaan (#9611), joten jokainen 429 kierrättää tilin ja loppuun käytetty kierros palauttaa viimeisen ylävirran 429-vastauksen. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Poista TLS-varmenteen varmennus käytöstä MITM-välityspalvelimessa. **Vaara.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Salli yksityisiin/sisäisiin verkkoihin osoittavat palveluntarjoajien URL-osoitteet. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Salli palveluntarjoajien lisääminen ja validointi paikallisissa/yksityisissä osoitteissa (127.0.0.1, localhost, LAN). Oletusarvoisesti käytössä (paikallinen ensin); poista käytöstä, jos haluat sallia tiukasti vain julkiset osoitteet. Pilvipalvelun metatiedot pysyvät estettyinä. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Ota käyttöön Claude Code -yhteensopiva palveluntarjoajatila. | +| Avain | Tyyppi | Oletus | Kuvaus | +| --------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Vaadi API-avain kaikille saapuville pyynnöille. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Ota syötteiden puhdistus käyttöön kaikille pyynnöille. | +| `INJECTION_GUARD_MODE` | enum | `off` | Kehotesyötteiden injektioilta suojaamisen tila. Arvot: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Peitä pyynnöistä henkilötiedot (`INPUT_SANITIZER_MODE`-asetuksesta riippumatta). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Puhdista henkilötiedot palveluntarjoajan vastauksista. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Henkilötietojen poistamisen tila vastauksissa. Arvot: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Estä lähtevät pyynnöt yksityisille tai sisäisille IP-osoitealueille. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Salli todennettujen hallintapaneelin käyttäjien paljastaa tallennetut API-avaimet sen sijaan, että he näkisivät vain peitetyt arvot. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Sisällytä tilin etuliite AUTH-lokiriveihin (esim. "Käytetään palveluntarjoajan tiliä: abc12345..."). Oletusarvoisesti poissa käytöstä, jotta tilitunnisteet peitetään jaetuista tai usean vuokraajan prosessilokeista. Ei riipu virheenkorjaustilasta; virheenkorjaustilan vaihtaminen ei paljasta tätä. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Kun OIDC on käytössä, poista salasanakirjautuminen käytöstä, jotta käyttäjät voivat tunnistautua vain OIDC-kertakirjautumisella. Kun asetus on poissa käytöstä (oletus), sekä salasanakirjautuminen että OIDC ovat käytettävissä. | + +### Verkko (16) + +| Avain | Tyyppi | Oletus | Uudelleenkäynnistys | Kuvaus | +| ----------------------------------------------- | ---------- | ------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | totuusarvo | `false` | ✓ | Ota TLS-sormenjäljen häivetila käyttöön. | +| `AUDIO_REMOTE_PROVIDER_NODES` | totuusarvo | `false` | | Salli /v1/audio/*-reittien käyttää localhostin ulkopuolella ylläpidettyjä OpenAI-yhteensopivia palveluntarjoajasolmuja. Oletusarvoisesti pois käytöstä — äänen reitittäminen etäisännälle muuttaa lähtevän liikenteen identiteettiä, joten ylläpitäjän on tehtävä siitä nimenomainen päätös. Takaisinkytkentäsolmut ovat aina sallittuja, eikä asetus vaikuta niihin. | +| `RERANK_REMOTE_PROVIDER_NODES` | totuusarvo | `false` | | Salli POST /v1/rerank -pyynnön (ja muistimoottorin takaisinkytkennän kautta tehtävän uudelleenjärjestelyvaiheen) käyttää localhostin ulkopuolella ylläpidettyjä OpenAI-yhteensopivia palveluntarjoajasolmuja. Oletusarvoisesti pois käytöstä — reitittäminen etäisännälle muuttaa lähtevän liikenteen identiteettiä, joten ylläpitäjän on tehtävä siitä nimenomainen päätös. Takaisinkytkentäsolmut ovat aina sallittuja; etäsolmujen on lisäksi läpäistävä palveluntarjoajan lähtevien URL-osoitteiden käytäntö. | +| `PROXY_AUTO_SELECT_ENABLED` | totuusarvo | `false` | | Kun yhteydelle ei ole määritetty välityspalvelinta, valitse automaattisesti rekisterin ensimmäinen toimiva välityspalvelin. Oletusarvoisesti pois käytöstä (muutoin mistä tahansa rekisterin välityspalvelimesta tulee yleinen varavaihtoehto — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | totuusarvo | `false` | | Salli OAuth- ja palveluntarjoajan vahvistustyönkulkujen ohittaa kiinnitetty välityspalvelin ja muodostaa suora yhteys, kun välityspalvelimen saavutettavuuden ennakkotarkistukset epäonnistuvat. Oletusarvoisesti pois käytöstä, koska tämä voi muuttaa lähtevän liikenteen IP-osoitetta. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | totuusarvo | `true` | | Kun usean tilin kierrätyssuorittimessa ilmenee verkkopoikkeus (aikakatkaisu tai yhteyden torjuminen/nollaus) eikä epäonnistuneella tilillä ole omaa välityspalvelinta, ota käyttöön lyhyt jäähdytysjakso ja ohita muut välityspalvelimettomat tilit pyynnön loppuajaksi sen sijaan, että jokaista yritettäisiin uudelleen. Oletusarvoisesti käytössä (turvallinen: lähtevän liikenteen IP-osoite ei muutu; vähentää vain viiveen/jäähdytysjakson riskiä yhteistä ulospääsyä käyttävillä tileillä). Poista käytöstä palauttaaksesi välittömän välityksen ensimmäisen välityspalvelimettoman heiton yhteydessä. | +| `PROXY_SKIP_RECENTLY_FAILED` | totuusarvo | `false` | | Välityspalvelinpoolit ja opencoden tilikohtainen kierrätys lopettavat juuri epäonnistuneen välityspalvelimen tarjoamisen uudelleen (torjuttu TCP-testi tai sen kautta vastaanotettu 429) prosessikohtaiseksi ajaksi, joka kaksinkertaistuu jokaisella toistolla ylärajaan asti. Välityspalvelimen tilaa ei kirjoiteta; jos kaikki ehdokkaat sivuutetaan, valinta säilyy ennallaan. Oletusarvoisesti pois käytöstä. | +| `PROXY_POOL_EGRESS_OBSERVATION` | totuusarvo | `false` | | Näytä hallintapaneelissa välityspalvelinpoolin kohdalla, kuinka moni havaittu lähtevän liikenteen IP-osoite palveli sen jäseniä viimeisten 24 tunnin aikana ja kuinka monta yhteyttä käytti niitä. Vain luku -tieto, joka lasketaan välityspalvelinlokista ja jota ei koskaan käytetä reititykseen. Oletusarvoisesti pois käytöstä. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | totuusarvo | `false` | | Tarkkaile OpenCode-suorittimessa suoratoistetun Responses-vastauksen ensimmäistä runkotavua (aikaikkuna: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, oletus `15000`). Jos 2xx Responses -suoratoisto pysyy hiljaisena aikaikkunan päättymiseen asti, se katsotaan jumiutuneeksi: tili asetetaan jäähdytysjaksolle ja pyyntö siirretään kerran seuraavalle tilille; toinen jumiutuminen aiheuttaa välittömän epäonnistumisen. Oletusarvoisesti pois käytöstä: jumiutuneet suoratoistot odottavat nykyiseen tapaan suoratoiston valmiuden aikakatkaisuun asti. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode-suoritin: kun 403/451-vastaus sisältää `user_blocked`-eston (ei maantieteellinen esto eikä Cloudflare-sormenjälkeen perustuva hylkäys), aseta hylätty tili jäähylle ja vaihda seuraavaan tiliin enintään kerran pyyntöä kohden; toinen hylkäys palautetaan sellaisenaan ilman onnistumismerkintää. Oletusarvoisesti pois käytöstä: ylävirran käyttäjäeston kiertäminen reitityksellä voi näyttää eston välttelyltä ja levittää merkinnän koko palvelinjoukkoon. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode-kierrätys: kahden peräkkäisen tilapäisen ylävirran virheen (5xx tai tyhjä 400) jälkeen odota ennen seuraavaa tiliä — 1,5 s, joka kaksinkertaistuu jokaisesta seuraavasta virheestä; enintään 6 s odotusta kohden ja 10 s pyyntöä kohden. Odotus ohitetaan, jos asiakas katkaisee yhteyden; epäonnistuneen vastauksen runko vapautetaan ennen odottamista. Oletusarvoisesti pois käytöstä: vikasietoisuuden vaihto tapahtuu välittömästi. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode-kierrätys: pysäytä tilien läpikäynti ensimmäiseen 429-vastaukseen, joka luokitellaan todelliseksi nopeusrajoitukseksi (jäsennettävissä oleva `Retry-After` tai runko, jossa mainitaan nopeus- tai käyttöraja), ja palauta kyseinen ylävirran 429-vastaus muuttamattomana. Luokittelemattomien 429-vastausten yhteydessä kierrätystä jatketaan. Oletusarvoisesti pois käytöstä: ilmaistasoa rajoitetaan lähtevän liikenteen IP-osoitteen perusteella (#9611), joten jokainen 429 kierrättää tiliä, ja tilien loppuessa palautetaan viimeinen ylävirran 429-vastaus. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Poista TLS-varmenteen tarkistus käytöstä MITM-välityspalvelimessa. **Vaara.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Salli yksityisiin/sisäisiin verkkoihin osoittavat palveluntarjoajien URL-osoitteet. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Salli palveluntarjoajien lisääminen ja validointi paikallisissa/yksityisissä osoitteissa (127.0.0.1, localhost, LAN). Oletusarvoisesti käytössä (paikallinen ensin); poista käytöstä, jos haluat sallia vain julkiset osoitteet. Pilvipalvelujen metatiedot pysyvät estettyinä. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Ota käyttöön Claude Code -yhteensopiva palveluntarjoajatila. | ### Käytännöt (5) -| Avain | Tyyppi | Oletusarvo | Kuvaus | -| ------------------------------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Työkalujen käyttöä koskevan käytännön valvontatila. Arvot: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | totuusarvo | `false` | Ota nopeusrajoitus automaattisesti käyttöön käyttötapojen perusteella. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | totuusarvo | `false` | Ohita OmniRouten paikallinen konteksti-ikkunan / syötteen enimmäistunnusmäärän tarkistus suorissa yhden mallin pyynnöissä. Ylävirran rajoitukset ovat edelleen voimassa. | -| `CAPABILITY_FILTER_ENABLED` | totuusarvo | `false` | Hylkää pyynnöt ennen välitystä, kun kohdemallilta puuttuu vaadittuja ominaisuuksia (konenäkö, työkalut, rakenteinen tuloste, konteksti-ikkuna). Suojaa suorat yhden palveluntarjoajan pyynnöt, jotka ohittavat yhdistelmäkerroksen yhteensopivuussuodattimen. | -| `RADAR_ENABLED` | totuusarvo | `false` | Ota OmniRoute Radar -moduuli käyttöön (luettelosyötteen näkymät ja synkronointi). Oletusarvoisesti poissa käytöstä; käyttöönotto avaa vain käyttöliittymän — tietojen synkronointi on edelleen otettava erikseen käyttöön. | - -### Suorituksenaikaiset asetukset (32) - -| Avain | Tyyppi | Oletus | Uudelleenkäynnistys | Kuvaus | -| ------------------------------------------- | ------- | ------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Luo ja lisää keskusteluyhteenvedot, kun yhdistelmäreititys vaihtaa mallia. Poista käytöstä, jos mallinvaihdot tulee käsitellä toisistaan riippumatta ja taustalla tehtävät kontekstinsiirtopyynnöt estää kaikilta nykyisiltä ja tulevilta yhdistelmiltä. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Poista Responses API:n läpivientivirroista sisäiset kommentointivaiheen tuloskohteet ennen niiden välittämistä asiakkaille. Poista käytöstä saadaksesi käsittelemättömät ylävirran kommentit. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Pakota MCP-työkalujen käytön käyttöaluerajoitukset. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Pakkaa MCP-työkalujen kuvaukset tunnisteiden käytön vähentämiseksi. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Ota taustatehtävien käsittely käyttöön ajon aikana. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Poista käytöstä kaikki taustapalvelut (kiintiön päivitys, synkronointi jne.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Luota projektitason RTK-suodattimiin ilman validointia. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Käynnistä reaaliaikaisen hallintapaneelin WebSocket-palvelin tuonnin yhteydessä (oletusportti 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Salli Codexin käyttää Responses-over-WebSocket-siirtotapaa. Kun asetus ei ole käytössä, Codex palaa käyttämään HTTP Responses -siirtotapaa. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Salli Codexin käyttää paikallisen app-server-palvelimen WebSocket JSON-RPC -siirtotapaa (codexTransport=app-server). Kun asetus ei ole käytössä, app-server-palvelimen käyttöön määritetyt yhteydet palaavat käyttämään Codexin muita siirtotapoja. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Reititä budjettinsa käyttäneet pyynnöt maksuttomalle hätävarapalveluntarjoajalle/-mallille. (Katso alta [Hätävarareititys budjetin loputtua](#emergency-budget-fallback).) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Ota käyttöön katkenneiden ylävirran SSE-virtojen läpinäkyvä varhainen uudelleenyritys ennen kuin vastauksen tavuja on lähetetty asiakkaalle. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Salli virran palautuksen pyytää vastaus uudelleen ja yhdistää se sen jälkeen, kun tavuja on jo lähetetty asiakkaalle. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Tee kesken virran tapahtuvasta jatkamisesta työkalukutsuille turvallista: älä koskaan jatka katkennutta virtaa, kun työkalukutsu on lähetetty (käynnissä tai jo päättynyt finish_reason-arvoon tool_calls), ja sulje yhteys yhden tyhjän jatkon jälkeen koko budjetin käyttämisen sijaan. Pois käytöstä: julkaisuversiota vastaava toiminta. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Vaihda kerran rinnakkaiseen yhteyteen, kun SSE-virta sulkeutuu ennen minkään hyödyllisen kehyksen lähettämistä ja saman yhteyden rajattu uudelleenyritys on käytetty; jos käyttökelpoista rinnakkaisyhteyttä ei ole, palautetaan alkuperäinen `STREAM_EARLY_EOF` 502. Oletusarvoisesti pois käytöstä: varhainen EOF pysyy lopullisena saman yhteyden uudelleenyrityksen jälkeen. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Sisällytä näyttöystävälliset nimikentät `/v1/models`-vastauksiin. Poista käytöstä asiakkailta, jotka odottavat vain mallitunnuksia. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Määrittää, miten mallitunnuksiin lisätään etuliitteet kohteessa /v1/models. 'dual' (oletus) tuottaa sekä aliaksen että palveluntarjoajan kanonisen tunnuksen etuliitteet taaksepäin yhteensopivuuden vuoksi. 'alias' tuottaa vain lyhyen aliasetuliitteen (esim. ds-web/model, ei deepseek-web/model). 'canonical' tuottaa vain palveluntarjoajan täydellisen kanonisen tunnuksen etuliitteen. Arvot: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Ota käyttöön Arena AI -tulostaulun ELO-luokituksen säännöllinen synkronointi mallien älykkyysluokituksia varten. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Ilmoita `claude//`-peilitunnukset kohteessa `/v1/models`, jotta Claude Code -yhdyskäytävän mallihaku luettelee muut kuin Claude-mallit. Kolmitasoisen portin globaali taso (ympäristömuuttuja ohittaa hallintapaneelin asetuksen). Katso [Claude Coden määritys](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Pääkytkin yhdyskäytävän no-think//-aliaksille. Käytössä (oletus): /v1/models ilmoittaa ilman päättelyä toimivan version jokaisesta soveltuvasta päättelykykyisestä Claude-mallista, ja pyynnössä lähetetty no-think/-tunnus palautetaan todelliseksi malliksi päättely estettynä. Pois käytöstä: versioita ei ilmoiteta, ja no-think/-tunnusta käsitellään kuten mitä tahansa muuta tuntematonta mallitunnusta. Mallikohtainen ModelSpec.noThinkingAlias-valinta tai -poissulkeminen on edelleen voimassa asetuksen ollessa käytössä. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Poista käytöstä päättelytasoversioiden (esim. -low, -medium, -high) luominen /v1/models-luettelossa. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Ota käyttöön palveluntarjoajalle lähettämistä varten vuokralaiskohtaiset mukautuvat virtuaaliset hyväksyntäkaistat (#9654): yhden vuokralaisen kuormituspiikki ei enää aiheuta toiselle 503-virhettä. Ympäristömuuttuja OMNIROUTE_CHAT_VIRTUAL_LANES ohittaa tämän hallintapaneelin asetuksen; muutokset tulevat voimaan palvelimen uudelleenkäynnistyksen yhteydessä. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Ilmoita /-peilitunnukset kohteessa /v1/models malleille, joiden kanonisella omistajalla ei ole aktiivisia tunnistetietoja mutta joihin aktiiviset tunnistetiedot sisältävä läpivientiyhdyskäytävä reitittää. Varoitus: lisää luettelomerkinnät kaikille asiakkaille, kun toiminto otetaan käyttöön globaalisti. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Ota käyttöön saldon tunnistus New-API / One-API / Sub2API -aggregaattorien kanssa yhteensopiville solmuille. Kun asetus on käytössä, yhteensopivat solmut, joille aggregaattorilippu on asetettu, ilmoittavat saldonsa hallintapaneelissa ja kiintiön ennakkotarkistukseen perustuvassa reitityksessä. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Jatka palvelimen hallinnoimia ei-suoratoistavia työkalukutsuja, kunnes malli palauttaa asiakkaan käytettävissä olevan vastauksen. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Hakutilastot ja viimeaikaiset haut laskevat vain palveluntarjoajat, joilla on edelleen aktiivinen yhteys (ilman avainta toimivat palveluntarjoajat, kuten duckduckgo-free, lasketaan aina). Pois käytöstä -asetus säilyttää kaikki tallennetut hakurivit, joilla on palveluntarjoajan tunnus. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Hallintapaneelin palveluntarjoajasivut: näytä Maksuton-merkki vain palveluntarjoajan noudattamien signaalien perusteella — poistaa näyttönimeen perustuvan heuristiikan, muut kuin totuusarvoiset maksuttomuuskentät ja :free-jälkiliitteet rekisteröidyiltä palveluntarjoajilta, joilla ei ole dokumentoitua maksutonta tasoa. Pois käytöstä säilyttää merkin aiemman säännön. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Jätä koostetuista 429/503-palvelu ei käytettävissä -vastauksista `Retry-After` pois, kun konkreettista tulevaa uudelleenyritysaikaa ei tiedetä (synteettisen 1s-arvon sijaan), lisää `error.retry_after_provenance` (`signal` \| `none`) ja anna yhdistelmien tyhjennyspolkujen lukea sanallisia uudelleenyritysvihjeitä JSON-muotoisista ja raakatekstisistä ylävirran rungoista. Kenttä näkyy vain funktion `unavailableResponse()` luomissa vastauksissa; muut 429/503-rungot eivät muutu. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Kun `priority`-yhdistelmäkohde, joka on merkitty varakohteeksi vain kiintiön loppuessa, pysäyttää yhdistelmän syystä, joka ei todistettavasti liity kiintiöön (palveluntarjoajan katkaisija avoinna, ennakoivaan viiveeseen perustuva ohitus), vastaa 502 kiintiöltä näyttävän 503:n sijaan. Lukitus, jäähdytys, poissa käytöstä oleminen, kiintiön loppuminen ja samanaikaisuusrajan aiheuttamat pysäytykset säilyttävät 503:n. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Pelkkä Mistral 401 (`{"detail":"Unauthorized"}`, ei nimenomaista todennussignaalia) on samanlainen sekä peruutetulle avaimelle että loppuun käytetylle kiintiölle. Kun asetus on käytössä, yhteys asetetaan jäähdytykseen sen sijaan, että se merkittäisiin `expired`-tilaan, enintään 3 kertaa tunnissa yhteyttä kohden; seuraavalla kerralla se merkitään, joten peruutettu avain päätyy silti lopulta oikeaan tilaan. Oletusarvoisesti pois käytöstä: jokainen pelkkä Mistral 401 merkitsee yhteyden kuten ennenkin. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Nouda reaaliaikainen xAI-malliluettelo `xai-oauth`-yhteyksille osoitteesta `https://api.x.ai/v1/models` OAuth-haltijatunnuksella kiinteän staattisen pohjan sijaan. Oletusarvoisesti pois käytöstä: `xai-oauth` käyttää edelleen muuttumatonta staattista pohjaa. Minkä tahansa selvitysvirheen yhteydessä haku palaa käyttämään pohjaa (ei ole vahvistettu, hyväksyykö x.ai OAuth-haltijatunnuksen tässä päätepisteessä). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Salli automaattisen siivousajon poistaa lopullisessa tilassa olevat (valmistuneet/epäonnistuneet/peruutetut/vanhentuneet) Batch API -työt, jotka ovat vanhempia kuin `OMNIROUTE_BATCH_RETENTION_DAYS`, sekä niiden rivikohtaiset tarkistuspisteet, ja tyhjentää ladattujen tiedostojen BLOB-sisältö niiden oman `expires_at`-ajan umpeuduttua. Oletusarvoisesti pois käytöstä: jokainen nykyinen asennus säilyttää nämä tiedot ennallaan, kunnes ylläpitäjä ottaa toiminnon käyttöön. Ylläpitäjän käynnistämään `DELETE /api/v1/batches/delete-completed` -reittiin asetus ei vaikuta kummassakaan tapauksessa — se on erillinen, ehdoton julkinen API-sopimus. | +| Avain | Tyyppi | Oletusarvo | Kuvaus | +| ------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Työkalujen käyttöä koskevien käytäntöjen valvontatila. Arvot: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Ota nopeusrajoitus automaattisesti käyttöön käyttötapojen perusteella. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Ohita OmniRouten paikallinen konteksti-ikkunan / syötteen enimmäistunnusmäärän tarkistus suorissa yhden mallin pyynnöissä. Ylävirran rajoitukset ovat edelleen voimassa. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Hylkää pyynnöt ennen lähettämistä, jos kohdemallista puuttuu vaadittuja ominaisuuksia (kuvantunnistus, työkalut, jäsennelty tuloste, konteksti-ikkuna). Suojaa suorat yhden palveluntarjoajan pyynnöt, jotka ohittavat yhdistelmäkerroksen yhteensopivuussuodattimen. | +| `RADAR_ENABLED` | boolean | `false` | Ota OmniRoute Radar -moduuli käyttöön (luettelosyötteen näkymät ja synkronointi). Oletusarvoisesti pois käytöstä; käyttöönotto avaa vain käyttöliittymän — tietojen synkronointi on edelleen otettava erikseen käyttöön. | + +### Suorituksenaikaiset asetukset (33) + +| Avain | Tyyppi | Oletusarvo | Uudelleenkäynnistys | Kuvaus | +| ------------------------------------------- | ------- | ---------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Luo ja lisää keskusteluyhteenvedot, kun yhdistelmäreititys vaihtaa mallia. Poista käytöstä, jos haluat käsitellä mallinvaihdot toisistaan riippumatta ja estää taustalla tehtävät kontekstinsiirtopyynnöt kaikissa nykyisissä ja tulevissa yhdistelmissä. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Poista sisäiset kommentointivaiheen tuloskohteet Responses API:n läpivientivirroista ennen niiden välittämistä asiakkaille. Poista käytöstä, jos haluat vastaanottaa käsittelemättömät ylävirran kommentit. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Pakota käyttöalueiden rajoitukset MCP-työkalujen käytölle. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Tiivistä MCP-työkalujen kuvaukset tunnusten käytön vähentämiseksi. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Ota taustatehtävien käsittely käyttöön suorituksen aikana. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Poista käytöstä kaikki taustapalvelut (kiintiön päivitys, synkronointi jne.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Luota projektitason RTK-suodattimiin ilman validointia. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Käynnistä reaaliaikaisen koontinäytön WebSocket-palvelin tuonnin yhteydessä (oletusarvoisesti portissa 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Salli Codexin käyttää Responses-over-WebSocket-siirtotapaa. Kun asetus on pois käytöstä, Codex käyttää varavaihtoehtona HTTP Responses -siirtotapaa. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Salli Codexin käyttää paikallisen app-server-palvelimen WebSocket JSON-RPC -siirtotapaa (codexTransport=app-server). Kun asetus on pois käytöstä, app-server-siirtotavan valinneet yhteydet käyttävät varavaihtoehtona Codexin muita siirtotapoja. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Reititä budjettinsa käyttäneet pyynnöt maksuttomalle varapalveluntarjoajalle/-mallille. (Katso [Budjetin hätävaravaihtoehto](#emergency-budget-fallback) jäljempänä.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Ota käyttöön katkenneiden upstream-SSE-virtojen läpinäkyvä varhainen uudelleenyritys ennen kuin vastauksen tavuja lähetetään asiakkaalle. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Salli virran palautuksen pyytää vastaus uudelleen ja yhdistää se aiempaan sen jälkeen, kun tavuja on jo lähetetty asiakkaalle. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Tee kesken virran tapahtuvasta jatkamisesta työkalukutsujen kannalta turvallista: älä koskaan jatka katkennutta virtaa, kun työkalukutsu on lähetetty (kesken tai jo päättynyt arvolla finish_reason tool_calls), ja sulje yhteys yhden tyhjän jatkoyrityksen jälkeen koko budjetin kuluttamisen sijaan. Pois käytöstä: julkaisuversiota vastaava toiminta. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Vaihda kerran sisaryhteyteen, kun SSE-virta sulkeutuu ennen kuin se on lähettänyt yhtään hyödyllistä kehystä ja saman yhteyden rajatut uudelleenyritykset on käytetty loppuun; jos käyttökelpoista sisaryhteyttä ei ole, palautetaan alkuperäinen `STREAM_EARLY_EOF` 502 -virhe. Oletuksena pois käytöstä: aikainen EOF pysyy lopullisena saman yhteyden uudelleenyrityksen jälkeen. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Sisällytä näyttöön sopivat nimikentät `/v1/models`-vastauksiin. Poista käytöstä asiakkaille, jotka odottavat vain mallitunnuksia. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Määrittää, miten mallitunnusten etuliitteet muodostetaan kohteessa /v1/models. 'dual' (oletus) tuottaa sekä aliaksen että palveluntarjoajan kanonisen tunnuksen mukaiset etuliitteet taaksepäin yhteensopivuutta varten. 'alias' tuottaa vain lyhyen alias-etuliitteen (esim. ds-web/model, ei deepseek-web/model). 'canonical' tuottaa vain palveluntarjoajan täydellisen tunnuksen mukaisen etuliitteen. Arvot: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Ota käyttöön Arena AI -tulostaulukon ELO-luokituksen säännöllinen synkronointi mallien älykkyysluokituksia varten. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Ilmoita `claude//`-peilitunnukset kohteessa `/v1/models`, jotta Claude Code -yhdyskäytävän mallien haku näyttää muut kuin Claude-mallit. Kolmitasoisen portin yleinen taso (ympäristömuuttuja ohittaa hallintapaneelin asetuksen). Katso [Claude Code -määritys](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Pääkytkin no-think//-yhdyskäytäväaliaksille. Käytössä (oletus): /v1/models ilmoittaa päättelyttömän variantin jokaiselle ehdot täyttävälle, päättelykykyiselle Claude-mallille, ja pyynnössä lähetetty no-think/-tunnus muunnetaan takaisin varsinaiseksi malliksi päättely estettynä. Pois käytöstä: variantteja ei ilmoiteta ja no-think/-tunnusta käsitellään kuten mitä tahansa muuta tuntematonta mallitunnusta. Mallikohtainen ModelSpec.noThinkingAlias-asetus on edelleen voimassa tämän ollessa käytössä. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Poista päättelytasovarianttien (esim. -low, -medium, -high) luonti käytöstä /v1/models-luettelossa. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Ota käyttöön vuokraajakohtaiset mukautuvat virtuaaliset sisäänpääsykaistat palveluntarjoajalle välitystä varten (#9654): yhden vuokraajan kuormituspiikki ei enää aiheuta 503-virheitä toiselle. Ympäristömuuttuja OMNIROUTE_CHAT_VIRTUAL_LANES ohittaa tämän hallintapaneelin asetuksen; muutokset tulevat voimaan palvelimen uudelleenkäynnistyksen yhteydessä. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Mainosta /-peilitunnuksia /v1/models-päätepisteessä malleille, joiden ensisijaisella omistajalla ei ole aktiivista tunnistetietoa mutta joihin aktiivisen tunnistetiedon sisältävä läpivientiyhdyskäytävä reitittää liikennettä. Varoitus: lisää luettelomerkintöjä kaikille asiakkaille, kun asetus otetaan käyttöön globaalisti. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Ota käyttöön saldon tunnistus New-API / One-API / Sub2API -aggregaattorien kanssa yhteensopiville solmuille. Kun asetus on käytössä, yhteensopivat solmut, joille aggregaattorimerkintä on asetettu, ilmoittavat saldonsa hallintapaneelissa ja kiintiön ennakkotarkistukseen perustuvassa reitityksessä. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Jatka palvelimen hallitsemia suoratoistamattomia työkalukutsuja, kunnes malli palauttaa asiakkaan käytettävissä olevan vastauksen. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Hakutilastoissa ja viimeaikaisissa hauissa huomioidaan vain palveluntarjoajat, joilla on yhä aktiivinen yhteys (avaimettomat palveluntarjoajat, kuten duckduckgo-free, huomioidaan aina). Kun asetus ei ole käytössä, kaikki säilytetyt hakurivit, joilla on palveluntarjoajan tunnus, pidetään mukana. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Hallintapaneelin palveluntarjoajasivut: näytä Ilmainen-merkki vain palveluntarjoajan tukemien signaalien perusteella — jätä pois näyttönimeen perustuva heuristiikka, muut kuin totuusarvotyyppiset ilmaisuutta kuvaavat kentät sekä rekisteröityjen palveluntarjoajien :free-päätteet, jos palveluntarjoajalla ei ole dokumentoitua ilmaistasoa. Kun asetus ei ole käytössä, historiallinen merkkisääntö säilytetään. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Jätä koostetuista 429/503-palvelu ei käytettävissä -vastauksista `Retry-After` pois, kun konkreettista tulevaa uudelleenyritysaikaa ei tunneta (keinotekoisen 1 sekunnin sijaan), lisää `error.retry_after_provenance` (`signal` \| `none`) ja salli combo-tyhjennyspolkujen lukea sanallisia uudelleenyritysvihjeitä JSON-muotoisista ja pelkkää tekstiä sisältävistä ylävirran vastausrungoista. Kenttä näkyy vain funktion `unavailableResponse()` muodostamissa vastauksissa; muut 429/503-vastausrungot säilyvät ennallaan. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Kun `priority`-combo-kohde, joka on merkitty käytettäväksi varavaihtoehtona vain kiintiön ehtyessä, pysäyttää combon syystä, joka ei todistettavasti liity kiintiöön (palveluntarjoajan virtakatkaisin on avoinna tai ennakoivaan viiveeseen perustuva ohitus), vastaa tilakoodilla 502 kiintiöön viittaavan tilakoodin 503 sijaan. Lukitus-, jäähdytys-, ei käytettävissä-, ehtymis- ja samanaikaisuusrajoituksen aiheuttamat pysäytykset säilyttävät tilakoodin 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Pelkistetty Mistral 401 -vastaus (`{"detail":"Unauthorized"}`, ei nimenomaista todennussignaalia) on samanlainen sekä perutun avaimen että loppuun käytetyn kiintiön tapauksessa. Kun asetus on käytössä, yhteys asetetaan jäähdytystilaan sen sijaan, että se pysäköitäisiin tilaan `expired`, enintään 3 kertaa tunnissa yhteyttä kohden; seuraavalla kerralla se pysäköidään, joten peruttu avain päätyy silti lopulta pysäköidyksi. Oletusarvoisesti asetus ei ole käytössä: jokainen pelkistetty Mistral 401 -vastaus pysäköi yhteyden kuten aiemminkin. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Nouda reaaliaikainen xAI-malliluettelo `xai-oauth`-yhteyksille osoitteesta `https://api.x.ai/v1/models` käyttämällä OAuth-haltijatunnusta kiinteän staattisen lähtöjoukon sijaan. Oletusarvoisesti pois käytöstä: `xai-oauth` käyttää edelleen muuttumatonta staattista lähtöjoukkoa. Jos selvityksessä tapahtuu virhe, mallien etsintä palaa käyttämään lähtöjoukkoa (ei ole vahvistettu, hyväksyykö x.ai OAuth-haltijatunnuksen tässä päätepisteessä). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Salli automaattisen siivouksen poistaa lopputilassa olevat (valmistuneet, epäonnistuneet, peruutetut tai vanhentuneet) Batch API -työt, jotka ovat vanhempia kuin `OMNIROUTE_BATCH_RETENTION_DAYS`, sekä niiden rivikohtaiset tarkistuspisteet, ja tyhjentää niiden ladattujen tiedostojen BLOB-sisältö, joiden oma `expires_at`-aika on umpeutunut. Oletusarvoisesti pois käytöstä: jokainen olemassa oleva asennus säilyttää nämä tiedot ennallaan, kunnes operaattori ottaa toiminnon käyttöön. Operaattorin käynnistämään `DELETE /api/v1/batches/delete-completed` -reittiin tämä ei vaikuta kummassakaan tapauksessa — se on erillinen, ehdoton julkisen API:n sopimus. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Varaa valittu Antigravity-tili sen valinneen pyynnön suoratoiston elinkaaren ajaksi, jotta samanaikainen uudelleenyritys tai tunnistetietojen luovutus ei voi valita uudelleen tiliä, joka on jo sidottu käynnissä olevaan suoratoistoon. Varaus rajataan pariin (yhteys, kutsuttavissa oleva ylävirran malli), joten yksi tili voi edelleen palvella kahta eri mallia samanaikaisesti. Kun kaikki kelvolliset tilit on jo varattu kyseiselle mallille, pyyntö palauttaa jäsennellyn 503-virheen `antigravity_pool_busy` ja rajatun `Retry-After`-arvon sen sijaan, että pyyntö kasattaisiin varatulle tilille. Oletusarvoisesti pois käytöstä: tilin valinta toimii täsmälleen kuten ennenkin, eikä varausta tehdä. | ### CLI (5) -| Avain | Tyyppi | Oletusarvo | Uudelleenkäynnistys | Kuvaus | -| ------------------------------------- | ------- | ---------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Ota yhteensopivuustila käyttöön kaikille CLI-asiakasohjelmille. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Ota mallien aliasten yhteensopivuuskerros käyttöön. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Ota hinnoittelutietojen automaattinen synkronointi käyttöön (edellyttää myös ympäristömuuttujaa `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Kirjoita palveluntarjoajan mallien synkronoinnin jälkeen ~/.codex/*.config.toml-profiilit automaattisesti (uudelleen) reaaliaikaisesta luettelosta. Ei koskaan muuta aktiivista Codex-oletusmääritystä. Oletusarvoisesti pois käytöstä. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Kirjoita palveluntarjoajan mallien synkronoinnin jälkeen Claude Code -profiilit ~/.claude/profiles//settings.json automaattisesti (uudelleen) reaaliaikaisesta luettelosta. Ei koskaan muuta aktiivista Claude-oletusmääritystä. Oletusarvoisesti pois käytöstä. | +| Avain | Tyyppi | Oletusarvo | Uudelleenkäynnistys | Kuvaus | +| ------------------------------------- | ------- | ---------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Ota yhteensopivuustila käyttöön kaikille CLI-asiakasohjelmille. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Ota mallien aliasten yhteensopivuuskerros käyttöön. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Ota hintatietojen automaattinen synkronointi käyttöön (edellyttää myös ympäristömuuttujaa `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Kirjoita palveluntarjoajan mallien synkronoinnin jälkeen automaattisesti (uudelleen) ~/.codex/*.config.toml-profiilitiedostot reaaliaikaisen luettelon perusteella. Ei koskaan muuta aktiivista Codex-oletusmääritystä. Oletusarvoisesti pois käytöstä. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Kirjoita palveluntarjoajan mallien synkronoinnin jälkeen automaattisesti (uudelleen) ~/.claude/profiles//settings.json Claude Code -profiilit reaaliaikaisen luettelon perusteella. Ei koskaan muuta aktiivista Claude-oletusmääritystä. Oletusarvoisesti pois käytöstä. | ### Terveys (5) -| Avain | Tyyppi | Oletusarvo | Kuvaus | -| ----------------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Poista paikallisen instanssin terveystarkistuspäätepiste käytöstä. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Poista tunnuksen validoinnin terveystarkistus käytöstä. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Ota verkkoyhteys käyttöön taitojen eristetyssä ympäristössä. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Välityspalvelinten terveystarkistuksessa kohteen torjuma testipyyntö (401/403/429) nollaa välityspalvelimen peräkkäisten epäonnistumisten sarjan. Oletusarvoisesti pois käytöstä: torjunta pysyy neutraalina (#10654). 5xx-vastaus jää kummassakin tapauksessa epäselväksi; torjunta ei koskaan poista välityspalvelinta, poista sitä käytöstä tai aktivoi sitä uudelleen. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Suorita tietokannan eheyden/terveyden käynnistystarkistus sen jälkeen, kun palvelin alkaa vastaanottaa pyyntöjä (`setImmediate`-kutsun kautta), sen sijaan että käynnistys estettäisiin tarkistuksen valmistumiseen asti (#13717). Oletusarvoisesti pois käytöstä: käynnistys estetään täsmälleen samalla tavalla kuin ennen tätä PR:ää. | +| Avain | Tyyppi | Oletusarvo | Kuvaus | +| ----------------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Poista paikallisen instanssin kuntotarkistuksen päätepiste käytöstä. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Poista tunnuksen validoinnin kuntotarkistus käytöstä. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Ota verkkoyhteys käyttöön taitojen hiekkalaatikkoympäristössä. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Välityspalvelinten kuntotarkistuskierroksella kohteen hylkäämä tarkistus (401/403/429) nollaa välityspalvelimen peräkkäisten epäonnistumisten sarjan. Oletusarvoisesti pois käytöstä: hylkäys pysyy neutraalina (#10654). 5xx pysyy kummassakin tapauksessa epäselvänä; hylkäys ei koskaan poista välityspalvelinta, poista sitä käytöstä tai aktivoi sitä uudelleen. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Suorita tietokannan eheyden/kunnon käynnistystarkistus sen jälkeen, kun palvelin on alkanut vastaanottaa pyyntöjä (`setImmediate`-toiminnon kautta), sen sijaan että käynnistys estettäisiin tarkistuksen valmistumiseen asti (#13717). Oletusarvoisesti pois käytöstä: käynnistys estyy täsmälleen kuten ennen tätä PR:ää. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` ja sen vanha alias > `INJECTION_GUARD_BLOCK_THRESHOLD` säätävät muuttujan `INJECTION_GUARD_MODE` > `block`-tilaa, mutta ne ovat tavallisia ympäristömuuttujia, jotka > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> lukee, eivät ominaisuuslippuja: niillä ei ole tietokantaohitusta eikä koontinäytön valitsinta. Katso +> lukee, eivät ominaisuuslippuja: niillä ei ole tietokantaohitusta eikä hallintapaneelin valitsinta. Katso > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] > `Uudelleenkäynnistys`-sarake merkitsee liput, joilla on `requiresRestart: true` — arvo -> tallennetaan välittömästi, mutta se tulee voimaan vasta prosessin latauduttua uudelleen. Enum-liput -> hylkäävät kaikki arvot, jotka eivät kuulu niiden sallittuun joukkoon (vahvistetaan palvelinpuolella -> sekä `setFeatureFlagOverride()`-funktiossa että REST-`PUT`-käsittelijässä). +> tallennetaan välittömästi, mutta se tulee voimaan vasta prosessin uudelleenlatauksen jälkeen. Enum- +> liput hylkäävät kaikki sallitun joukon ulkopuoliset arvot (palvelinpuolen validointi tehdään +> sekä `setFeatureFlagOverride()`-toiminnossa että REST-`PUT`-käsittelijässä). --- -## Ominaisuuslippujen vaihtaminen +## Lippujen vaihtaminen ### Hallintapaneeli @@ -174,21 +176,21 @@ Siirry kohtaan **Hallintapaneeli → Asetukset → Ominaisuusliput** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) tukee seuraavia toimintoja: -- **Haku** avaimen tai kuvauksen perusteella ja **suodatus** luokan perusteella (sekä synteettinen +- **Haku** avaimen tai kuvauksen perusteella sekä **suodatus** luokan mukaan (mukaan lukien synteettinen **Vaatii uudelleenkäynnistyksen** -näkymä). -- **Valintakytkin** totuusarvolipuille ja **pudotusvalikko** enum-lipuille +- **Valintakytkin** totuusarvolipuille ja **pudotusvalikko** luettelotyyppisille lipuille (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- **Lähdetunnus** jokaiselle lipulle — `DB`, `ENV` tai `DEF` — joka osoittaa, mistä +- Kunkin lipun **lähdemerkintä** — `DB`, `ENV` tai `DEF` — joka osoittaa, mistä käytössä oleva arvo on peräisin. -- **Palauta**-painike (näytetään vain lipuille, joiden lähde on `DB`) ohituksen poistamiseksi - sekä alareunassa **Palauta kaikki ohitukset** -painike. +- **Palauta**-painike (näytetään vain `DB`-lähteisille lipuille), jolla ohitus poistetaan, + sekä alareunassa oleva **Palauta kaikki ohitukset** -painike. - **Käynnistä palvelin uudelleen** -ilmoituspalkki, kun `requiresRestart`-lippua muutetaan. ### REST API Kaikki toiminnot kulkevat yhden reitin kautta: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Jokainen metodi edellyttää todennettua hallintapaneeli-istuntoa (muuten palautetaan `401`). +Jokainen metodi edellyttää todennettua hallintapaneeli-istuntoa (muussa tapauksessa `401`). #### `GET /api/settings/feature-flags` @@ -210,7 +212,7 @@ Palauttaa kaikki liput sekä niiden käytössä olevan arvon, lähteen ja yhteen "requiresRestart": false, "warningLevel": "caution", }, - // ... kaikki 72 lippua + // ... kaikki 74 lippua ], "summary": { "total": 56, @@ -224,8 +226,8 @@ Palauttaa kaikki liput sekä niiden käytössä olevan arvon, lähteen ja yhteen #### `PUT /api/settings/feature-flags` -Asettaa tai poistaa yksittäisen ohituksen. Runko: `{ key: string; value?: string }`. -Kentän `value` pois jättäminen poistaa ohituksen (jolloin ympäristömuuttujan arvo / oletusarvo palautetaan). +Aseta tai poista yksittäinen ohitus. Runko: `{ key: string; value?: string }`. +Arvon `value` pois jättäminen poistaa ohituksen (jolloin ympäristömuuttujan arvo / oletusarvo palautetaan). ```bash # Aseta tietokantaohitus @@ -239,19 +241,19 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Vastaus sisältää uuden `effectiveValue`/`source`-arvon, `previousValue`/ -`previousSource`-arvon sekä `requiresRestart`-arvon. Tuntemattomat avaimet ja sallitun alueen ulkopuoliset enum-arvot +Vastaus palauttaa uuden `effectiveValue`/`source`-arvon, `previousValue`/ +`previousSource`-arvon sekä `requiresRestart`-tiedon. Tuntemattomat avaimet ja sallitun alueen ulkopuoliset luetteloarvot hylätään tilakoodilla `400`. #### `DELETE /api/settings/feature-flags` -Poistaa **kaikki** tietokantaohitukset kerralla ja palauttaa jokaisen lipun ympäristömuuttujan arvon / oletusarvon -käyttöön. Palauttaa `{ cleared: , message: "..." }`. +Tyhjentää **kaikki** tietokantaohitukset kerralla ja palauttaa jokaiselle lipulle sen ympäristömuuttujan arvon / oletusarvon. +Palauttaa `{ cleared: , message: "..." }`. > [!NOTE] -> Liput, joiden `requiresRestart: true`, tulevat voimaan vasta prosessin uudelleenlatauksen jälkeen. -> Hallintapaneelin uudelleenkäynnistystoiminto kutsuu reittiä `POST /api/restart` ja tekee sen jälkeen kyselyitä reittiin -> `GET /api/health/ping`, kunnes palvelin on jälleen käytettävissä. +> Liput, joiden `requiresRestart: true`, tulevat voimaan vasta prosessin uudelleenkäynnistyksen jälkeen. +> Hallintapaneelin uudelleenkäynnistystoiminto kutsuu reittiä `POST /api/restart` ja tekee sen jälkeen kyselyitä +> reittiin `GET /api/health/ping`, kunnes palvelin on jälleen toiminnassa. --- diff --git a/docs/i18n/fi/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/fi/docs/reference/PROVIDER_REFERENCE.md index 9d3d8349a6bc..a733355f929e 100644 --- a/docs/i18n/fi/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/fi/docs/reference/PROVIDER_REFERENCE.md @@ -4,11 +4,11 @@ --- -> **Luotu automaattisesti** tiedostosta `src/shared/constants/providers.ts` — älä muokkaa käsin. +> **Automaattisesti luotu** tiedostosta `src/shared/constants/providers.ts` — älä muokkaa käsin. > Luo uudelleen komennolla: `npm run gen:provider-reference` -> **Luotu viimeksi:** 2026-09-17 +> **Luotu viimeksi:** 2026-09-18 -Palveluntarjoajia yhteensä: **359**. Katso alla oleva kategoriakohtainen erittely. +Palveluntarjoajia yhteensä: **359**. Katso alla oleva luokkakohtainen erittely. ## Luokat @@ -32,49 +32,49 @@ Ota kukin palveluntarjoaja käyttöön sekä määritä ja testaa se hallintapan --- -## Palveluntarjoajat ilman tunnistautumista (avainta ei tarvita) (10) - -| ID | Alias | Nimi | Tunnisteet | Verkkosivusto | Huomautukset | Työkalukutsut | -| ----------------------- | ---------- | ------------------------- | -------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| `aihorde` | `horde` | AI Horde | Ei tunnistautumista | [linkki](https://aihorde.net) | API-avainta ei tarvita — käyttää AI Horden dokumentoitua anonyymiä avainta. Ilmaisen aihorde.net-avaimen lisääminen on valinnaista ja antaa ainoastaan korkeamman prioriteetin jonossa (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Ei tunnistautumista | [linkki](https://augmentcode.com) | OmniRoute ei tallenna API-avainta. Asenna Auggie CLI ja suorita `auggie login` tällä koneella, minkä jälkeen OmniRoute käynnistää sen paikallisesti jokaista pyyntöä varten. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Ei tunnistautumista | [linkki](https://playground.ai.cloudflare.com) | Tunnistetietoja ei tarvita — anonyymit selainistunnot käyttävät käänteismallinnettua cf_agent-WebSocket-protokollaa (Playwright-siirtokerros). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Ei tunnistautumista | [linkki](https://developers.openai.com/codex/cli) | OmniRoute ei tallenna tunnistetta. Codex CLI:n app-server hallitsee omaa ChatGPT-kirjautumistaan (~/.codex/auth.json, päivitetään automaattisesti). Käytä ”Kirjaudu sisään ChatGPT:llä” -vaihtoehtoa, jos CLI:tä ei ole vielä todennettu. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Ei tunnistautumista | [linkki](https://docs.devin.ai/work-with-devin/devin-cli) | Virallinen Devin CLI hallitsee tunnistautumista eristetyssä siltataltiössään. | emuloitu | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Ei tunnistautumista | [linkki](https://duckduckgo.com/duckchat) | Tunnistetietoja ei tarvita — DuckDuckGo AI Chat on anonyymi ja maksuton. | emuloitu | -| `opencode` | `oc` | OpenCode Free | Ei tunnistautumista | [linkki](https://opencode.ai) | API-avainta ei tarvita — käyttää OpenCoden julkista maksutonta päätepistettä. | — | -| `uncloseai` | `unc` | UncloseAI | Ei tunnistautumista | [linkki](https://uncloseai.com) | Tunnistautumista ei tarvita. API hyväksyy tunnistamista varten avaimeksi minkä tahansa ei-tyhjän merkkijonon. Jos vanhemmat sisäänrakennetut mallit palauttavat virheen 404, käytä Saatavilla olevat mallit → Tuo kohteesta /models tai Automaattinen synkronointi; toimivaksi vahvistettu malli: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Ei tunnistautumista, video | [linkki](https://veoaifree.com) | Tunnistautumista ei tarvita. Nopeusrajoitus on 6 pyyntöä tunnissa IP-osoitetta kohden. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Ei tunnistautumista | [linkki](https://zcode.z.ai) | OmniRoute ei tallenna API-avainta. Paikallinen ZCode app-server käyttää olemassa olevaa builtin:zai-coding-plan-kirjautumista. | — | +## Todennusta vaatimattomat palveluntarjoajat (avainta ei tarvita) (10) + +| Tunnus | Alias | Nimi | Tunnisteet | Verkkosivusto | Huomautukset | Työkalukutsut | +| ----------------------- | ---------- | ------------------------- | -------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `aihorde` | `horde` | AI Horde | Ei todennusta | [linkki](https://aihorde.net) | API-avainta ei tarvita — käyttää AI Horden dokumentoitua anonyymiä avainta. Ilmaisen aihorde.net-avaimen lisääminen on valinnaista ja antaa vain paremman jonoprioriteetin (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Ei todennusta | [linkki](https://augmentcode.com) | OmniRoute ei tallenna API-avainta. Asenna Auggie CLI ja suorita `auggie login` tällä koneella, minkä jälkeen OmniRoute käynnistää sen paikallisesti jokaista pyyntöä varten. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Ei todennusta | [linkki](https://playground.ai.cloudflare.com) | Tunnistetietoja ei tarvita — anonyymit selainistunnot käyttävät takaisinmallinnettua cf_agent-WebSocket-protokollaa (Playwright-siirtotapa). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Ei todennusta | [linkki](https://developers.openai.com/codex/cli) | OmniRoute ei tallenna tunnistetta. Codex CLI app-server hallinnoi omaa ChatGPT-kirjautumistaan (~/.codex/auth.json, päivitetään automaattisesti). Käytä ”Kirjaudu sisään ChatGPT:llä” -vaihtoehtoa, jos CLI:tä ei ole vielä todennettu. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Ei todennusta | [linkki](https://docs.devin.ai/work-with-devin/devin-cli) | Todennuksesta vastaa virallinen Devin CLI eristetyssä siltataltiοssaan. | emuloitu | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Ei todennusta | [linkki](https://duckduckgo.com/duckchat) | Tunnistetietoja ei tarvita — DuckDuckGo AI Chat on anonyymi ja maksuton. | emuloitu | +| `opencode` | `oc` | OpenCode Free | Ei todennusta | [linkki](https://opencode.ai) | API-avainta ei tarvita — käyttää OpenCoden julkista maksutonta päätepistettä. | — | +| `uncloseai` | `unc` | UncloseAI | Ei todennusta | [linkki](https://uncloseai.com) | Todennusta ei tarvita. API hyväksyy tunnistamista varten avaimeksi minkä tahansa muun kuin tyhjän merkkijonon. Jos vanhemmat sisäänrakennetut mallit palauttavat 404-virheen, käytä Saatavilla olevat mallit → Tuo kohteesta /models- tai Automaattinen synkronointi -toimintoa; toimivaksi vahvistettu malli: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Ei todennusta, video | [linkki](https://veoaifree.com) | Todennusta ei tarvita. Nopeusrajoitus on 6 pyyntöä tunnissa IP-osoitetta kohden. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Ei todennusta | [linkki](https://zcode.z.ai) | OmniRoute ei tallenna API-avainta. Paikallinen ZCode app-server käyttää olemassa olevaa builtin:zai-coding-plan-kirjautumista. | — | ## OAuth-palveluntarjoajat (24) -| Tunnus | Alias | Nimi | Tunnisteet | Verkkosivusto | Huomautukset | -| --------------- | ------------- | ------------------------- | ---------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `agy` | `agy` | Antigravity CLI | OAuth | [linkki](https://antigravity.google) | Tuo Antigravity CLI (`agy`) -kirjautumisesi (liitä tai lataa sen tunnistetiedosto), tunnista paikallinen CLI-kirjautuminen automaattisesti tai kirjaudu Googlella. Käyttää samaa Antigravity-taustapalvelua (mukaan lukien Claude-mallit). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [linkki](https://aws.amazon.com/q/developer/) | Käyttää samaa AWS Builder ID:tä tai tuotuun päivitystunnukseen perustuvaa prosessia kuin Kiro, mutta pitää Amazon Q -yhteydet erillään. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [linkki](https://cline.bot/cline-pass) | ClinePass on Clinen 9,99 $/kk maksava tilaus, joka sisältää 10 avointa koodausmallia. Kirjaudu Cline-tililläsi (sama kirjautuminen kuin Cline CLI:ssä/IDE:ssä) tai liitä suora ClinePass API -avain (app.cline.bot → Asetukset → API-avaimet). ClinePass-tilaus avaa cline-pass/*-mallit. Käyttää uudelleen Cline WorkOS OAuth -prosessia. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [linkki](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Kirjaudu virallisen CLI-laitetunnuskulun kautta tai liitä suora API-avain (lähetetään muodossa Authorization: Bearer). Valikoima: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [linkki](https://cli.devin.ai) | Edellyttää Devin CLI -binääritiedostoa. Todenna suorittamalla `devin auth login` tai anna WINDSURF_API_KEY. Asennus: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [linkki](https://devin.ai) | Liitä olemassa oleva Devin API -avain todennetusta Devin-istunnosta. Avaimen vientimahdollisuus ja vaiheet vaihtelevat Devin-version ja tilin mukaan. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Syötä GHE-instanssisi URL-osoite (esim. https://ghe.company.com) palveluntarjoajan asetuksiin ja todenna sitten laiteprosessin kautta. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [linkki](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuthia ei ole määritetty. Rekisteröi OAuth-sovellus osoitteessa https://gitlab.com/-/profile/applications käyttäen uudelleenohjauksen URI-osoitetta http://localhost:20128/callback ja käyttöoikeusalueita "ai_features read_user", aseta sitten GITLAB_DUO_OAUTH_CLIENT_ID (ja valinnaisesti GITLAB_DUO_OAUTH_CLIENT_SECRET) ja käynnistä uudelleen. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Kirjaudu selaimellasi tai liitä Grok Build CLI:n ~/.grok/auth.json (tai JWT-käyttötunnus); refresh_token kierrätetään kummassakin tapauksessa automaattisesti. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [linkki](https://www.kimi.com/code?aff=omniroute) | Kirjaudu samalla Kimi-tilillä, jota Kimi Code CLI käyttää. OmniRoute käyttää CLI OAuth -prosessia ja Kimi Coding Plan -päätepisteitä. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Ilmaistaso: 50 krediittiä kuukaudessa (~25 000–100 000 tokenia). ⚠️ Kiron käyttöehdot kieltävät kolmannen osapuolen välityspalvelujen ja valjasten käytön. | -| `openference` | `of` | Openference | OAuth | [linkki](https://openference.com) | Kirjaudu Openference-tililläsi reitittääksesi pyynnöt api.openference.com-palvelun kautta. Päättely edellyttää aktiivista tilausta — OAuth-todennus voi onnistua mutta palauttaa ilman tilausta virheen 402. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [linkki](https://trae.ai) | Trae on ByteDancen tekoälynatiivinen IDE (SOLO-etäagentti). Valtuuta ponnahdusikkunassa trae.ai-palvelun kautta tai kirjaudu osoitteessa solo.trae.ai ja liitä Cloud-IDE-JWT (lähetetään muodossa 'Authorization: Cloud-IDE-JWT ', voimassa noin 14 päivää) käyttötunnukseksi; web_id/biz_user_id/user_unique_id/scope/tenant/region välitetään providerSpecificData-kohdan kautta. Liitettyjä tunnuksia ei voi päivittää ilman käyttöliittymää — liitä tunnus uudelleen sen vanhennuttua. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [linkki](https://x.ai) | Kirjaudu xAI:lla käyttääksesi api.x.ai-malleja, kuten Grok 4.5:tä. Tämä on erillinen Grok Build JWT -istunnoista, jotka käyttävät cli-chat-proxy.grok.com-palvelua ja grok-build-mallialiaksia. | -| `zed` | `zd` | Zed IDE | OAuth | [linkki](https://zed.dev) | Zed tallentaa LLM-palveluntarjoajien tunnistetiedot (OpenAI, Anthropic, Google, Mistral, xAI) käyttöjärjestelmän avainnippuun. Etsi ja tuo ne automaattisesti käyttämällä alla olevaa Tuo-painiketta. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [linkki](https://zed.dev) | Kirjaudu Zed-tililläsi (natiivisovelluksen kirjautuminen). OmniRoute luo kertakäyttöisen RSA-avainparin ja avaa zed.dev-sivuston sen valtuuttamista varten — kopioi etä- tai käyttöliittymättömässä asennuksessa tuloksena saatu 127.0.0.1-takaisinkutsu-URL selaimesi osoiteriviltä ja liitä se takaisin tähän. Tämä eroaa yllä olevasta 'Zed IDE' -tunnistetietojen tuontikohdasta: se välittää keskustelutäydennykset Zedin oman isännöidyn malliaggregaattorin (cloud.zed.dev) kautta ja tarjoaa Anthropic/OpenAI/Google/xAI-mallit Zed-tilauksesi puitteissa. | +| Tunnus | Alias | Nimi | Tunnisteet | Verkkosivusto | Huomautukset | +| --------------- | ------------- | ------------------------- | ---------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `agy` | `agy` | Antigravity CLI | OAuth | [linkki](https://antigravity.google) | Tuo Antigravity CLI (`agy`) -kirjautumisesi (liitä/lataa sen tunnustiedosto), tunnista paikallinen CLI-kirjautuminen automaattisesti tai kirjaudu Googlella. Käyttää samaa Antigravity-taustajärjestelmää (mukaan lukien Claude-mallit). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [linkki](https://aws.amazon.com/q/developer/) | Käyttää samaa AWS Builder ID -tunnusta tai tuotua päivitystunnuksen työnkulkua kuin Kiro, mutta pitää Amazon Q -yhteydet erillään. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [linkki](https://cline.bot/cline-pass) | ClinePass on Clinen 9,99 $/kk maksava tilaus, joka sisältää 10 avointa koodausmallia. Kirjaudu Cline-tililläsi (sama kirjautuminen kuin Cline CLI:ssä/IDE:ssä) tai liitä suora ClinePass API -avain (app.cline.bot → Asetukset → API-avaimet). ClinePass-tilaus avaa cline-pass/*-mallit. Käyttää uudelleen Cline WorkOS OAuth -työnkulkua. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [linkki](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Kirjaudu virallisen CLI:n laitekoodityönkululla tai liitä suora API-avain (lähetetään muodossa Authorization: Bearer). Mallivalikoima: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [linkki](https://cli.devin.ai) | Edellyttää Devin CLI -binääritiedostoa. Todenna suorittamalla `devin auth login` tai anna WINDSURF_API_KEY-avaimesi. Asennus: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [linkki](https://devin.ai) | Liitä olemassa oleva Devin API -avain todennetusta Devin-istunnosta. Avaimen vientimahdollisuus ja vaiheet vaihtelevat Devin-version ja tilin mukaan. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Syötä GHE-instanssisi URL-osoite (esim. https://ghe.company.com) palveluntarjoajan asetuksiin ja todenna sitten laitekoodityönkululla. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [linkki](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuthia ei ole määritetty. Rekisteröi OAuth-sovellus osoitteessa https://gitlab.com/-/profile/applications käyttämällä uudelleenohjaus-URI:a http://localhost:20128/callback ja käyttöoikeusalueita "ai_features read_user". Aseta sitten GITLAB_DUO_OAUTH_CLIENT_ID (ja valinnaisesti GITLAB_DUO_OAUTH_CLIENT_SECRET) ja käynnistä uudelleen. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Kirjaudu selaimellasi tai liitä ~/.grok/auth.json (tai JWT-käyttötunnus) Grok Build CLI:stä; refresh_token kierrätetään automaattisesti kummassakin tapauksessa. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [linkki](https://www.kimi.com/code?aff=omniroute) | Kirjaudu samalla Kimi-tilillä, jota käytetään Kimi Code CLI:ssä. OmniRoute käyttää CLI:n OAuth-työnkulkua ja Kimi Coding Plan -päätepisteitä. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Ilmaistaso: 50 krediittiä kuukaudessa (~25K–100K tokenia). ⚠️ Kiron käyttöehdot kieltävät kolmannen osapuolen välityspalvelinten/testikehysten käytön. | +| `openference` | `of` | Openference | OAuth | [linkki](https://openference.com) | Kirjaudu Openference-tililläsi reitittääksesi pyynnöt api.openference.com-palvelun kautta. Sisältää ilmaistason käyttöoikeuden Qwen3.8 27b- ja Llama 3.2 3B -malleihin — katso nykyiset tilausehdot osoitteesta openference.com/pricing. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [linkki](https://trae.ai) | Trae on ByteDancen tekoälypohjainen IDE (SOLO-etäagentti). Valtuuta trae.ai ponnahdusikkunassa tai kirjaudu osoitteessa solo.trae.ai ja liitä Cloud-IDE-JWT (lähetetään muodossa 'Authorization: Cloud-IDE-JWT ', voimassa noin 14 päivää) käyttötunnukseksi; web_id/biz_user_id/user_unique_id/scope/tenant/region välitetään providerSpecificData-kentän kautta. Liitetyille tunnuksille ei ole taustalla toimivaa päivitystä — liitä tunnus uudelleen sen vanhennuttua. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [linkki](https://x.ai) | Kirjaudu xAI:lla käyttääksesi api.x.ai-malleja, kuten Grok 4.5:tä. Tämä on erillinen Grok Build JWT -istunnoista, jotka käyttävät cli-chat-proxy.grok.com-palvelua ja grok-build-mallialiaksia. | +| `zed` | `zd` | Zed IDE | OAuth | [linkki](https://zed.dev) | Zed tallentaa LLM-palveluntarjoajien tunnistetiedot (OpenAI, Anthropic, Google, Mistral, xAI) käyttöjärjestelmän avainnippuun. Käytä alla olevaa Tuo-painiketta löytääksesi ja tuodaksesi ne automaattisesti. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [linkki](https://zed.dev) | Kirjaudu Zed-tililläsi (natiivisovelluksen kirjautuminen). OmniRoute luo kertakäyttöisen RSA-avainparin ja avaa zed.dev-sivuston sen valtuuttamista varten — kopioi etä- tai ilman graafista käyttöliittymää tehdyssä asennuksessa selaimesi osoiteriviltä tuloksena oleva 127.0.0.1-takaisinkutsu-URL ja liitä se takaisin tähän. Tämä eroaa yllä olevasta 'Zed IDE' -tunnistetietojen tuontimerkinnästä: tämä välittää keskustelutäydennykset Zedin oman isännöidyn malliaggregaattorin (cloud.zed.dev) kautta ja tarjoaa Anthropic/OpenAI/Google/xAI-malleja Zed-tilauksesi mukaisesti. | ## Verkon evästeiden tarjoajat (34) @@ -115,252 +115,252 @@ Ota kukin palveluntarjoaja käyttöön sekä määritä ja testaa se hallintapan | `zai-web` | `zw` | Z.ai Web | Verkkoeväste | [linkki](https://chat.z.ai) | Kopioi "token"-arvo kohdasta chat.z.ai → DevTools → Application → Local Storage. Älä kopioi evästeitä; OmniRoute käsittelee pyyntökohtaisen CAPTCHA-tarkistuksen selainkuljetuksensa kautta. | — | | `zenmux-free` | `zmf` | ZenMux Free (verkko) | Verkkoeväste | [linkki](https://zenmux.ai) | Kirjaudu osoitteessa zenmux.ai, vie sitten kaikki evästeet EditThisCookie- tai Cookie-Editor-laajennuksella ja liitä koko Cookie-otsakemerkkijono tähän. Päivitä noin 30 päivän välein. | — | -## API-avainpalveluntarjoajat (maksullinen / maksullinen ilmaisilla krediiteillä) (242) - -| ID | Alias | Nimi | Tunnisteet | Verkkosivusto | Huomautukset | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API-avain | [linkki](https://ai.360.cn) | Hanki API-avain osoitteesta ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | API-avain, aggregaattori | [linkki](https://agentrouter.org) | Rekisteröityessä 200 dollarin arvosta ilmaisia krediittejä – usean mallin reititysyhdyskäytävä | -| `agnes` | `agnes` | Agnes AI | API-avain, video | [linkki](https://agnes-ai.com) | Hanki API-avain osoitteesta agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Kiina) | API-avain | [linkki](https://api.agnes-ai.cn) | Hanki API-avain Agnes CN -sivustolta. | -| `ai21` | `ai21` | AI21 Labs | API-avain | [linkki](https://www.ai21.com) | Rekisteröityessä 10 dollarin arvosta kokeilukrediittejä (voimassa 3 kuukautta), luottokorttia ei vaadita | -| `aimlapi` | `aiml` | AI/ML API | API-avain, aggregaattori | [linkki](https://aimlapi.com) | Ilmaistaso on keskeytetty (2026) — AI/ML API toimii nyt vain käytön mukaan laskutettavalla mallilla (vähintään 20 dollarin lisäys); ei toistuvia ilmaisia krediittejä. | -| `ainative` | `ainative` | AINative Studio | API-avain | [linkki](https://ainative.studio) | Luo ilmainen API-avain osoitteessa ainative.studio (korttia ei vaadita) ja liitä se sitten tähän Bearer-tunnuksena. | -| `aion` | `aion` | Aion Labs | API-avain | [linkki](https://www.aionlabs.ai) | Luo ilmainen API-avain osoitteessa aionlabs.ai (korttia ei vaadita) ja liitä se sitten tähän Bearer-tunnuksena. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API-avain | [linkki](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Kiina) | API-avain | [linkki](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API-avain | [linkki](https://developer.ant-ling.com/en/docs/) | Rekisteröidy ja luo API-avain Ant Ling API -konsolissa (https://chat.ant-ling.com/open) ja liitä se sitten tähän. OmniRoute reitittää keskusteluliikenteen osoitteeseen https://api.ant-ling.com/v1/chat/completions; palveluntarjoaja on OpenAI-yhteensopiva ja tarjoaa myös Anthropic-yhteensopivan rajapinnan. | -| `anthropic` | `anthropic` | Anthropic | API-avain | [linkki](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API-avain, aggregaattori | [linkki](https://anyapi.ai) | Ilmainen paketti: 100 000 ANY-tokenia päivässä ja 100 RPM vaatimukset täyttäville Free/Basic-malleille; luottokorttia ei vaadita. | -| `api-airforce` | `af` | Api.airforce | API-avain | [linkki](https://api.airforce) | 55 ilmaistason mallia, mukaan lukien Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash ja DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API-avain | [linkki](https://arcee.ai) | Hanki API-avain osoitteesta arcee.ai | -| `auriko` | `auriko` | Auriko | API-avain, aggregaattori | [linkki](https://www.auriko.ai) | Ilmaisessa paketissa ilmoitetaan rajaksi 1 000 Platform RPM ja 10 000 BYOK RPM. Alustan päättelystä veloitetaan silti palveluntarjoajan kustannukset; kyseessä ei ole ilmainen token-pooli tai rajoittamaton ilmainen päättely. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API-avain, yrityskäyttö | [linkki](https://learn.microsoft.com/azure/ai-foundry) | Käytä Azure AI Foundry -avaintasi. Perus-URL voi olla https://.services.ai.azure.com/openai/v1/ tai https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | API-avain, yrityskäyttö | [linkki](https://azure.microsoft.com/products/ai-services/openai-service) | Käytä Azure OpenAI API -avaintasi. Perus-URL:n tulee olla resurssisi päätepiste, esimerkiksi https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API-avain | [linkki](https://b.ai) | Bearer API -avain b.ai:n OpenAI-yhteensopivalle LLM-yhdyskäytävälle (eri palvelu kuin TheB.AI). Luo avain osoitteessa https://docs.b.ai ja käytä sitten osoitetta https://api.b.ai/v1 OpenAI-yhteensopivana perus-URL-osoitteena. Mallit käyttävät muotoa palveluntarjoaja/mallin-nimi. | -| `baichuan` | `baichuan` | Baichuan | API-avain | [linkki](https://www.baichuan-ai.com/) | Hanki API-avain osoitteesta platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | API-avain | [linkki](https://ernie.baidu.com/) | Hanki API-avain osoitteesta console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API-avain | [linkki](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API-avain | [linkki](https://baseten.co) | 30 dollarin arvosta ilmaisia kokeilukrediittejä GPU-päättelyyn | -| `bazaarlink` | `bzl` | BazaarLink | API-avain | [linkki](https://bazaarlink.ai) | Käytä BazaarLink API -avaintasi (alkaa merkkijonolla sk-bl-) muodossa Authorization: Bearer . OpenAI SDK toimii perus-URL-osoitteella https://bazaarlink.ai/api/v1. Mallit käyttävät muotoa palveluntarjoaja/mallin-nimi. | -| `bedrock` | `bedrock` | Amazon Bedrock | API-avain, yrityskäyttö | [linkki](https://aws.amazon.com/bedrock) | Käytä Amazon Bedrock API -avaintasi ja määritä AWS-alue, jolla mallisi on otettu käyttöön (esimerkiksi eu-west-2). OmniRoute kutsuu suoraan Bedrockin natiivia Converse API -rajapintaa. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API-avain, kuva | [linkki](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API-avain | [linkki](https://blackbox.ai) | ⚠️ **VANHENTUNUT.** api.blackbox.ai palauttaa HTTP 404 -vastauksen kaikilla polkuvarianteilla (tarkistus 2026-08-21); julkinen päättelyrajapinta on siirretty käyttöoikeudeltaan rajattuun päätepisteeseen enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | API-avain | [linkki](https://www.bluesminds.com) | Ilmaisia päivittäisiä pi-krediittejä — tukee yli 200:aa mallia, mukaan lukien GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen ja Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API-avain | [linkki](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API-avain | [linkki](https://bytez.com) | 1 dollarin arvosta ilmaisia krediittejä, jotka uusiutuvat 4 viikon välein | -| `cerebras` | `cerebras` | Cerebras | API-avain | [linkki](https://inference.cerebras.ai) | Kertaluonteinen 5 dollarin rekisteröitymiskrediitti (voimassa 30 päivää); maksutapa vaaditaan. Kyseessä ei ole toistuva ilmaistaso. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API-avain | [linkki](https://hyper.charm.land) | Rekisteröityessä 100 ilmaista Hypercredit-krediittiä kuukaudessa | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API-avain, aggregaattori | [linkki](https://api.oriper.com) | Virallisten metatietojen mukaan tarjolla on 2 miljoonaa tokenia kuukaudessa, mutta julkinen sivusto ja dokumentaatio olivat estettyinä tarkastuksen aikana; kiintiötä ja brändikytköstä tulee pitää vahvistamattomina. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-avain, aggregaattori | [linkki](https://chatanywhere.tech) | Vain henkilökohtaiseen, opetus- tai tutkimuskäyttöön: julkisessa dokumentaatiossa mainitaan 10 000 pistettä päivässä ja 200 pyyntöä päivässä IP-osoitetta/avainta kohden; älä käytä kaupalliseen liikenteeseen. | -| `cheaperinference` | `cinf` | Cheaper Inference | API-avain | [linkki](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API-avain | [linkki](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API-avain, aggregaattori | [linkki](https://chutes.ai) | Bearer-API-avain Chutesin OpenAI-yhteensopivalle yhdyskäytävälle. | -| `clarifai` | `clarifai` | Clarifai | API-avain, yrityskäyttö | [linkki](https://docs.clarifai.com) | Käytä Clarifai PAT -tunnustasi tai sovelluskohtaista API-avainta. OmniRoute käyttää OpenAI-yhteensopivaa päätepistettä osoitteessa https://api.clarifai.com/v2/ext/openai/v1 ja todentaa pyynnöt otsakkeella Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-avain, aggregaattori | [linkki](https://cloudcode.one) | Julkaistuihin ilmaisiin malleihin kuuluvat glm-4.7-flash ja glm-4.6v-flash; numeerista kiintiötä ei ole julkaistu, ja avaimen luominen voi edellyttää saldoa tai kuponkia. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-avain | [linkki](https://developers.cloudflare.com/workers-ai) | Edellyttää API Token -tunnusta JA Account ID -tunnusta (löytyy osoitteesta dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API-avain | [linkki](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API-avain | [linkki](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API-avain | [linkki](https://cohere.com) | Ilmainen kokeilu: 1 000 API-kutsua kuukaudessa testausta varten, luottokorttia ei vaadita | -| `command-code` | `cmd` | Command Code | API-avain | [linkki](https://commandcode.ai/) | Käytä Command Code API -avainta. Pyynnöt lähetetään Command Coden /provider/v1/chat/completions-päätepisteeseen. | -| `coze` | `coze` | Coze | API-avain | [linkki](https://coze.com) | Hanki API-avain osoitteesta coze.com/open/api | -| `crof` | `crof` | CrofAI | API-avain | [linkki](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API-avain | [linkki](https://cursor.com/dashboard/api) | Liitä Cursor-käyttäjän API-avain (crsr_...) osoitteesta cursor.com/dashboard/api. OmniRoute vaihtaa sen tarvittaessa istuntotunnukseksi; IDE:n tai cursor-agent-asennusta ei tarvita. Käyttö laskutetaan avaimen omistavalta Cursor-tilaukselta. | -| `dahl` | `dahl` | Dahl | API-avain | [linkki](https://inference.dahl.global) | Luo tunnus automaattisesti napsauttamalla 'Add Account' tai lisää API-avain manuaalisesti. | -| `databricks` | `databricks` | Databricks | API-avain, yrityskäyttö | [linkki](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API-avain, yrityskäyttö | [linkki](https://docs.datarobot.com) | Käytä DataRobot API -tunnustasi. Valinnainen Base URL voi olla tilin juuriosoite (LLM Gatewayta varten) tai käyttöönoton URL-osoite polun /api/v2/deployments/ alla. | -| `deepai` | `deepai` | DeepAI | API-avain, kuva | [linkki](https://deepai.org) | Käytä DeepAI API -avaintasi. Hanki avain osoitteesta deepai.org — edellyttää Pro-tilausta ($9.99/kk). | -| `deepinfra` | `deepinfra` | DeepInfra | API-avain | [linkki](https://deepinfra.com) | Rekisteröitymisen yhteydessä saat ilmaisia krediittejä API-testaukseen ja mallien tutkimiseen | -| `deepseek` | `ds` | DeepSeek | API-avain | [linkki](https://platform.deepseek.com) | 5 miljoonaa ilmaista tokenia rekisteröitymisen yhteydessä – luottokorttia ei vaadita | -| `dgrid` | `dgrid` | DGrid | API-avain | [linkki](https://dgrid.ai) | DGrid Free Models Router: 10 pyyntöä minuutissa ja 100 pyyntöä päivässä. 5 dollarin kertaluonteinen saldon lisäys avaa enintään 20 pyyntöä minuutissa ja 1 000 pyyntöä päivässä. | -| `dify` | `dify` | Dify | API-avain | [linkki](https://dify.ai) | Hanki API-avain Dify-instanssistasi. | -| `digitalocean` | `digitalocean` | DigitalOcean | API-avain | [linkki](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API-avain | [linkki](https://dit.ai) | Käytä dit.ai API -avaintasi muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva — suoraan korvaava ratkaisu, vaihda vain perus-URL-osoitteeksi https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API-avain | [linkki](https://doubao.com) | Hanki API-avain osoitteesta console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | API-avain, aggregaattori | [linkki](https://www.dxnt.com) | Ilmaistilien dokumentoitu raja on 100 kutsua päivässä; kiintiö voi kasvaa kutsujen kautta ja vaihdella tilikohtaisesti. | -| `electronhub` | `electronhub` | Electron Hub | API-avain, aggregaattori | [linkki](https://www.electronhub.ai) | Ilmainen tilaus: 5 RPM, 0,25 dollarin viikoittaiset krediitit ja 10 Neutrinoa päivässä :free-malleille; myös perhebudjetit ovat voimassa. | -| `empower` | `empower` | Empower | API-avain, aggregaattori | [linkki](https://docs.empower.dev) | Bearer-API-avain Empowerin OpenAI-yhteensopivalle päätepisteelle. | -| `eurouter` | `eurouter` | EURouter | API-avain, aggregaattori | [linkki](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API-avain | [linkki](https://factory.ai) | Bearer-API-avain Factoryn OpenAI-yhteensopivalle yhdyskäytävälle. | -| `fal-ai` | `fal` | Fal.ai | API-avain, kuva | [linkki](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API-avain, aggregaattori | [linkki](https://fastrouter.ai) | :free-päätteiset mallit sallivat 10 pyyntöä päivässä organisaatiota ja mallia kohden; saatavuus voi muuttua. | -| `featherless-ai` | `featherless` | Featherless AI | API-avain | [linkki](https://featherless.ai) | Ilmainen taso saatavilla — luottokorttia ei vaadita | -| `fenayai` | `fenayai` | FenayAI | API-avain, aggregaattori | [linkki](https://fenayai.com) | Bearer-API-avain FenayAI:n OpenAI-yhteensopivalle yhdyskäytävälle. | -| `fireworks` | `fireworks` | Fireworks AI | API-avain | [linkki](https://fireworks.ai) | 1 dollarin ilmaiset aloituskrediitit rekisteröitymisen yhteydessä API-testausta varten | -| `free-ai` | `free-ai` | Free.ai | API-avain, aggregaattori | [linkki](https://free.ai) | 30 000 tokenia päivässä kattaa itse ylläpidetyt mallit sähköpostivahvistuksen jälkeen. Kiintiön ylittävä käyttö voidaan laskuttaa omakustannushintaan, ja ulkoiset premium-mallit ovat maksullisia. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API-avain | [linkki](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API-avain | [linkki](https://freebuff.com) | Anna Freebuff-/Codebuff-todennustunnus (saatu CLI-kirjautumisen tai automaattisen keräimen kautta). | -| `freeinference` | `freeinference` | FreeInference | API-avain, koontipalvelu | [linkki](https://freeinference.org) | Maksuton tutkimuskäyttö ilman maksukorttia; muiden kuin Harvardin hakijoiden hyväksyntä edellyttää manuaalista käsittelyä, eikä numeerista kiintiötä taata julkisesti. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API-avain | [linkki](https://freemodel.dev) | Rekisteröityessä 300 dollarin ilmaiset krediitit — luottokorttia ei vaadita. Käytä GPT-5.4- ja GPT-5.5-malleja (OpenAI:n uusimpia lippulaivamalleja) OpenAI-yhteensopivan APIn kautta. | -| `freetheai` | `fta` | FreeTheAi | API-avain, koontipalvelu | [linkki](https://freetheai.xyz) | Liity FreeTheAi-Discordiin saadaksesi ilmaisen API-avaimesi. | -| `friendliai` | `friendli` | FriendliAI | API-avain | [linkki](https://friendli.ai) | Maksuton taso palvelimettomaan päättelyyn — luottokorttia ei vaadita | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-avain, koontipalvelu | [linkki](https://g4f.space) | Kerää anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-avain, koontipalvelu | [linkki](https://g4f.space) | Kerää anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-avain, koontipalvelu | [linkki](https://g4f.space) | Kerää anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-avain, koontipalvelu | [linkki](https://g4f.space) | Kerää anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-avain, koontipalvelu | [linkki](https://g4f.space) | Kerää anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | API-avain | [linkki](https://galadriel.com) | ⚠️ **VANHENTUNUT.** api.galadriel.ai ei enää ratkea (tarkistus 2026-06-19); päättely-API vaikuttaa lopetetulta. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API-avain | [linkki](https://aistudio.google.com) | Maksuton taso on saatavilla Google AI Studion kautta; nykyiset mallikohtaiset kiintiöt ja alueelliset rajoitukset ovat voimassa | -| `getgoapi` | `ggo` | GoAPI | API-avain, koontipalvelu | [linkki](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API-avain | [linkki](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API-avain | [linkki](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLabin henkilökohtainen käyttöoikeustunnus julkista Code Suggestions APIa varten. Määritä itse ylläpidetty perus-URL, jos et käytä gitlab.comia. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-avain | [linkki](https://opengateway.gitlawb.com) | Maksuttoman MiMo-mallin (xiaomi/mimo-v2.5) käyttöoikeus peruutettiin 2026-05 — Opengateway on nyt käytön mukaan veloittava krediittiyhdyskäytävä; toistuvasti maksutonta mallia ei ole. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-avain | [linkki](https://opengateway.gitlawb.com) | Maksuton Nemotron-kampanja päättyi 2026-06 — GMI Cloud -reitti toimii nyt ainoastaan käytön mukaan veloitettavilla krediiteillä. | -| `glm` | `glm` | GLM Coding | API-avain | [linkki](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Kiina) | API-avain | [linkki](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API-avain | [linkki](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API-avain | [linkki](https://greenpt.com) | API-tilauksen voi luoda maksutta; päättelystä veloitetaan tunnistekohtaisesti. Maksutonta päättelykiintiötä ei ole julkaistu. | -| `groq` | `groq` | Groq | API-avain | [linkki](https://groq.com) | Maksuton paketti: mallikohtaiset rajat (200 000 tunnistetta päivässä kutakin keskustelumallia kohden; katso RPM/RPD-rajat osoitteesta console.groq.com/docs/rate-limits) — maksutapaa ei ole tallennettu. | -| `haiper` | `hp` | Haiper | API-avain, video | [linkki](https://haiper.ai) | Hanki API-avain osoitteesta haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | API-avain | [linkki](https://api.hcnsec.cn) | Hanki API-avain osoitteesta api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | API-avain, koontipalvelu | [linkki](https://helixmind.online) | Aiemmin levitettyjä väitteitä 3 RPM:n / 50 RPD:n kiintiöistä ja maksukortittomuudesta ei vahvistettu 2026-08-02 tehdyssä tarkastuksessa; nykyinen kiintiö ja laskutus edellyttävät tilin vahvistamista. | -| `helyxai` | `helyxai` | Helyx AI | API-avain, koontipalvelu | [linkki](https://helyxai.space) | Käytössä olevan maksuttoman paketin dokumentaatiossa ilmoitetaan 100 000 tunnistetta päivässä; sivuston erillinen markkinointiväite yli 2 miljoonasta on ristiriidassa tämän kanssa, eikä sitä pidetä kiintiötakuuna. | -| `heroku` | `heroku` | Heroku AI | API-avain, yrityskäyttö | [linkki](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API-avain | [linkki](https://huggingface.co) | Maksuton Inference API tuhansille malleille (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API-avain | [linkki](https://hyperbolic.xyz) | Rekisteröityessä 1–5 dollarin kokeilukrediitit palvelimettomaan päättelyyn | -| `ideogram` | `ideo` | Ideogram | API-avain | [linkki](https://ideogram.ai) | Hanki API-avain osoitteesta ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | API-avain | [linkki](https://xinghuo.xfyun.cn) | Hanki API-avain osoitteesta console.xfyun.cn | -| `inception` | `inception` | Inception | API-avain | [linkki](https://docs.inceptionlabs.ai) | Rekisteröityessä 10 miljoonaa ilmaista tunnistetta, eikä luottokorttia vaadita. | -| `inference-net` | `inet` | Inference.net | API-avain | [linkki](https://inference.net) | Rekisteröityessä 25 dollarin ilmaiset krediitit, minkä lisäksi saatavilla on tutkimusapurahoja | -| `internlm` | `internlm` | InternLM (Intern-S1) | API-avain | [linkki](https://internlm.intern-ai.org.cn/) | Maksuton kuukausikiintiö noin 1 miljoona syötetunnistetta / 3 miljoonaa tulostunnistetta (noin 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API-avain, upotus/uudelleenjärjestys | [linkki](https://jina.ai) | Bearer-API-avain api.jina.ai-palvelulle — upotukset, uudelleenjärjestys, luokittelu, segmentointi ja haku. Hallintapaneelin avaimet ovat ensisijaisia JINA_AI_API_KEY-muuttujaan nähden. Tämä ei ole Reader-/r.jina.ai-kortti eikä se nouda URL-osoitteita. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-avain | [linkki](https://jina.ai/reader) | Bearer-API-avain r.jina.ai-palvelun URL-osoitteesta Markdowniksi -muunnokseen (vain /v1/web/fetch). Ei tarjoa /v1/embeddings- tai /v1/rerank-päätepisteitä. Sama Jina-tunnus kuin Foundation API:ssa toimii; OmniRoute käyttää uudelleen jina-ai-hallintapaneeliavainta tai JINA_AI_API_KEY-muuttujaa, kun tämä kortti on tyhjä. | -| `kenari` | `kenari` | Kenari | API-avain | [linkki](https://kenari.id) | Käytä Kenari-API-avaintasi (kn-...) muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. API:n perus-URL: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API-avain | [linkki](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API-avain, aggregaattori | [linkki](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (vanha Moonshot API) | API-avain | [linkki](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-avain | [linkki](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API-avain | [linkki](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API-avain, aggregaattori | [linkki](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API-avain, video | [linkki](https://leonardo.ai) | Hanki API-avain osoitteesta leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | API-avain | [linkki](https://liquid.ai) | Hanki API-avain osoitteesta liquid.ai | -| `literouter` | `literouter` | LiteRouter | API-avain, aggregaattori | [linkki](https://literouter.com) | Ilmaiset malliversiot käyttävät :free-päätettä; päivittäiset krediittirajat vaihtelevat mallikohtaisesti, ja ilmaisen syötteen enimmäismäärä on 5 000 tokenia. | -| `llamagate` | `llamagate` | LlamaGate | API-avain | [linkki](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-avain, aggregaattori | [linkki](https://llm.kiwi) | Ilmaispaketti tarjoaa auto- ja hrLLM-mallit; julkaistu 40 pyynnön tuntiraja koskee hrLLM-mallia. | -| `llm7` | `llm7` | LLM7.io | API-avain | [linkki](https://llm7.io) | Käytä mitä tahansa ei-tyhjää avainta (esimerkiksi 'unused'). Jos vanhemmat sisäänrakennetut mallit palauttavat model_unavailable-virheen, käytä Available Models → Import from /models- tai Auto-Sync-toimintoa; toimivaksi vahvistettu malli: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API-avain, aggregaattori | [linkki](https://llmgateway.io) | Isännöity Free-paketti: ilmaiseksi hinnoitetut mallit on rajoitettu viiteen pyyntöön 10 minuutissa, kun tilillä ei ole krediittejä. | -| `logfare` | `logfare` | Logfare | API-avain, aggregaattori | [linkki](https://logfare.ai) | Luo ilmainen tili osoitteessa https://logfare.ai/register (käyttäjänimi/salasana, ei sähköpostivahvistusta) saadaksesi API-avaimen heti, ja liitä se sitten tähän Bearer-tunnuksena. | -| `longcat` | `lc` | LongCat AI | API-avain | [linkki](https://longcat.chat/platform/docs) | Ilmainen: kertaluonteinen 10 miljoonan tokenin saldo tilin rekisteröinnin ja KYC-vahvistuksen jälkeen (LongCat-2.0). Vain kertaluonteinen — ei toistuva päivittäinen tai kuukausittainen käyttövara. | -| `magnific` | `freepik` | Magnific | API-avain, kuva | [linkki](https://www.magnific.com) | Hanki API-avain osoitteesta magnific.com/user/api-keys (otsake x-magnific-api-key). Vanhat Freepik-kehittäjäavaimet toimivat edelleen. | -| `maritalk` | `maritalk` | Maritalk | API-avain | [linkki](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API-avain, aggregaattori | [linkki](https://meganova.ai) | Ilmainen rekisteröityminen ilman maksukorttia. Julkaistut Tier 1 -mallikohtaiset kiintiöt ovat yhteensä 550 pyyntöä päivässä; ne eivät muodosta yhteistä kokonaiskiintiötä, ja maksullista ylityslaskutusta voidaan soveltaa, jos se on käytössä. | -| `meta-llama` | `meta` | Meta Llama API | API-avain | [linkki](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API-avain, video | [linkki](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Kiina) | API-avain | [linkki](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API-avain | [linkki](https://mistral.ai) | Ilmainen Experiment-taso: nopeusrajoitettu pääsy kaikkiin malleihin, ei maksukorttia | -| `mixedbread` | `mxbai` | Mixedbread AI | API-avain | [linkki](https://www.mixedbread.com) | Bearer-API-avain Mixedbreadin upotus-API:lle. | -| `mixlayer` | `mixlayer` | Mixlayer | API-avain, aggregaattori | [linkki](https://www.mixlayer.com) | Malli qwen/qwen3.5-4b-free on ilmainen prototyyppien kehittämiseen ja nopeusrajoitettu; kiinteää julkista RPM-rajaa tai päiväkohtaista kiintiötä ei ole vahvistettu. | -| `mnn-ai` | `mnn-ai` | MNN AI | API-avain, aggregaattori | [linkki](https://mnnai.ru) | Ilmaispaketti: 1 dollarin kuukausittaiset krediitit, 10 RPM ja pääsy vain Free-merkinnällä varustettuihin malleihin. | -| `modal` | `mdl` | Modal | API-avain, yrityskäyttö | [linkki](https://modal.com/docs) | Käytä Modal-käyttöönottoasi suojaavaa Bearer-tunnusta, jos suojaus on käytössä. Perus-URL-osoitteen tulee osoittaa OpenAI-yhteensopivaan Modal-sovellukseesi, esimerkiksi https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API-avain | [linkki](https://modelscope.cn) | Ilmainen taso ModelScope API-Inference -palvelun kautta — Alibaba-tili vaaditaan. | -| `monsterapi` | `monster` | MonsterAPI | API-avain | [linkki](https://monsterapi.ai) | ⚠️ **VANHENTUNUT.** Monster API lopetti toimintansa 2026-06-30. Käytä vaihtoehtoisia OpenAI-yhteensopivia palveluntarjoajia. | -| `moonshot` | `moonshot` | Kimi | API-avain | [linkki](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API-avain | [linkki](https://morphllm.com) | Ilmainen taso: 250 000 krediittiä kuukaudessa, 0 $ | -| `muse-code` | `mc` | Muse Code (Meta) | API-avain | [linkki](https://github.com/meta-llama/llama-stack) | Käytä META_API_KEY-ympäristömuuttujaasi Bearer-tunnuksena. Muse Code CLI käyttää OpenAI Responses API -siirtomuotoa (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API-avain, aggregaattori | [linkki](https://naga.ac) | Hanki API-avain osoitteesta naga.ac — rekisteröityminen Google-, GitHub- tai Discord-tilillä on mahdollista. | -| `naga-ai` | `naga-ai` | Naga AI | API-avain, aggregaattori | [linkki](https://naga.ac) | Merkinnällä :free varustetut mallit on lueteltu julkisesti, mutta numeerista kiintiötä ei ole vahvistettu. Nagan käytännössä varoitetaan, että ilmaistason kehotteita ja tulosteita voidaan kerätä tai käyttää koulutukseen. | -| `nanogpt` | `nanogpt` | NanoGPT | API-avain | [linkki](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API-avain | [linkki](https://bynara.id) | Luo ilmainen NaraRouter-tili, yhdistä Telegram-tilisi (vaaditaan ennen /v1-vastauksia) ja liitä sitten avain tähän Bearer-tunnisteena. | -| `navy` | `navy` | NavyAI | API-avain | [linkki](https://api.navy) | Luo ilmainen API-avain NavyAI-hallintapaneelissa ja liitä se sitten tähän Bearer-tunnisteena. | -| `nebius` | `nebius` | Nebius AI | API-avain | [linkki](https://nebius.com) | Rekisteröitymisen yhteydessä noin $1 kokeilusaldo API-testaukseen | -| `nlpcloud` | `nlpc` | NLP Cloud | API-avain | [linkki](https://docs.nlpcloud.com) | Käytä NLP Cloud -API-avaintasi muodossa Authorization: Token . OmniRoute käyttää oletusarvoisesti chatbot-päätepistettä osoitteessa https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | API-avain | [linkki](https://nomic.ai) | Hanki API-avain osoitteesta atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | API-avain | [linkki](https://portal.nousresearch.com/help) | Käytä Nous Portal -API-avaintasi. OmniRoute käyttää virallista OpenAI-yhteensopivaa päättelypäätepistettä osoitteessa https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API-avain, video, aggregaattori | [linkki](https://novita.ai) | Rekisteröitymisen yhteydessä $0.50 kokeilusaldo (voimassa noin vuoden) | -| `nscale` | `nscale` | nScale | API-avain | [linkki](https://nscale.com) | Rekisteröitymisen yhteydessä $5 ilmaista saldoa päättelytestaukseen | -| `nube` | `nube` | Nube.sh | API-avain | [linkki](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API-avain | [linkki](https://build.nvidia.com) | Ilmainen kehittäjäkäyttö: noin 40 RPM, yli 70 mallia (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API-avain, yrityskäyttö | [linkki](https://www.oracle.com/artificial-intelligence/generative-ai) | Käytä OCI Generative AI -API-avaintasi tai IAM Bearer -tunnistetta. Perus-URL voi olla https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | API-avain, aggregaattori | [linkki](https://ofox.ai) | Nykyisessä luettelossa mainostetaan yli 10:tä ilmaista mallia ilman julkista numeerista kiintiötä; tarkista alkuperäisten palveluntarjoajien alkuperää, säilytystä ja koulutusta koskevat ehdot ennen tuotantokäyttöä. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-avain | [linkki](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API-avain | [linkki](https://1min.ai) | Luo API-avain osoitteessa https://docs.1min.ai/docs/api/create-api-key ja liitä se sitten tähän. | -| `openadapter` | `oad` | OpenAdapter | API-avain | [linkki](https://openadapter.dev) | Käytä OpenAdapter-API-avaintasi muodossa Authorization: Bearer sk-cv-. Täysin OpenAI-yhteensopiva. API:n perus-URL: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API-avain | [linkki](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API-avain | [linkki](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-avain | [linkki](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API-avain | [linkki](https://openference.com) | Ilmainen tilaus: 3 päivän kokeilujakso avoimen lähdekoodin malleilla — luottokorttia ei vaadita | -| `openrouter` | `openrouter` | OpenRouter | API-avain, aggregaattori | [linkki](https://openrouter.ai) | Ilmaiset mallit hintaan $0/tunniste päätteellä :free – 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API-avain | [linkki](https://openvecta.com) | Rekisteröitymisen yhteydessä ilmaista saldoa OpenAI-yhteensopivaan päättelyyn LLM-malleilla, upotuksilla ja päättelymalleilla | -| `opper` | `opper` | Opper | API-avain, aggregaattori | [linkki](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API-avain | [linkki](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API-avain | [linkki](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API-avain | [linkki](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-avain | [linkki](https://www.perplexity.ai) | Käytä Perplexity-API-avaintasi. OmniRoute reitittää Agent API -mallitunnukset Perplexityn Responses-yhteensopivan päätepisteen kautta. | -| `piapi` | `pi` | PiAPI | API-avain, aggregaattori | [linkki](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API-avain | [linkki](https://pioneer.ai) | $75 ilmaista käyttösaldoa — luottokorttia ei vaadita | -| `plamo` | `plamo` | PLaMo | API-avain | [linkki](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API-avain, aggregaattori | [linkki](https://creator.poe.com/api-reference) | Bearer-API-avain Poen OpenAI-yhteensopivaa API:a varten. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API-avain, aggregaattori | [linkki](https://poixe.com) | Nykyiset julkiset ilmaisrajat ovat pieniä ja malliryhmäkohtaisia: 2 RPM / 5 RPD suurten mallien ryhmälle ja 20 RPM / 50 RPD pienten mallien ryhmälle. | -| `pollinations` | `pol` | Pollinations AI | API-avain, video | [linkki](https://pollinations.ai) | Dokumentoitujen ilmaisten mallien anonyymi ja avaimeton käyttö toimii parhaansa mukaan. Paikallinen v3.8.50-tarkistus (2026-07-31) palautti OmniRouten kautta virheen 401 ja samasta verkosta tehdyissä suorissa ylävirran kokeiluissa Cloudflare 1010 -virheen. Premium-mallit edellyttävät edelleen Pollinations-API-avainta osoitteesta enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API-avain | [linkki](https://poolside.ai) | Laguna S 2.1 ja XS 2.1 ovat ilmaisia esikatseluvaiheen ajan; julkista numeerista kiintiötä ei ole julkaistu. | -| `predibase` | `predibase` | Predibase | API-avain | [linkki](https://predibase.com) | ⚠️ **VANHENTUNUT.** serving.app.predibase.com ei enää ratkea (tarkistus 2026-06-19); hallittu palvelu-API vaikuttaa lakkautetulta. | -| `publicai` | `publicai` | PublicAI | API-avain | [linkki](https://publicai.co) | Edellyttää API-avainta — kertaluonteinen rekisteröitymissaldo, jonka jälkeen palvelu on maksullinen | -| `qianfan` | `qianfan` | Baidu Qianfan | API-avain | [linkki](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API-avain | [linkki](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API-avain | [linkki](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-avain | [linkki](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API-avain, kuva | [linkki](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API-avain | [linkki](https://regolo.ai) | Hanki Regolo-API-avaimesi osoitteesta regolo.ai ja liitä se sitten tähän Bearer-tunnuksena. | -| `reka` | `reka` | Reka | API-avain | [linkki](https://docs.reka.ai/chat/overview) | Käytä Reka-API-avaintasi. OmniRoute tukee OpenAI-yhteensopivaa perus-URL-osoitetta https://api.reka.ai/v1 ja lähettää yhteensopivuuden varmistamiseksi sekä Authorization- että X-Api-Key-otsakkeet. | -| `requesty` | `requesty` | Requesty | API-avain | [linkki](https://requesty.ai) | Ilmainen taso ~200 pyyntöä/päivä – usean mallin reititysyhdyskäytävä (yli 300 mallia) | -| `routeway` | `routeway` | Routeway | API-avain | [linkki](https://routeway.ai) | Luo ilmainen API-avain osoitteessa routeway.ai ja liitä se sitten tähän Bearer-tunnuksena. | -| `runwayml` | `runway` | Runway | API-avain, video | [linkki](https://docs.dev.runwayml.com) | Käytä Runway-API-avaintasi muodossa Authorization: Bearer . OmniRoute käyttää nykyistä Runway-API:a osoitteessa https://api.dev.runwayml.com/v1 ja lähettää vaaditun X-Runway-Version-otsakkeen automaattisesti. | -| `sambanova` | `samba` | SambaNova | API-avain | [linkki](https://sambanova.ai) | Rekisteröityessä 5 $ ilmaista saldoa (voimassa 30 päivää), luottokorttia ei vaadita | -| `sap` | `sap` | SAP Generative AI Hub | API-avain, yrityskäyttö | [linkki](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Käytä SAP AI Core -Bearer-tunnustasi. Perus-URL voi olla AI_API_URL-juuriosoitteesi tai Generative AI Hubin deploymentUrl. | -| `sarvam` | `sarvam` | Sarvam AI | API-avain | [linkki](https://docs.sarvam.ai) | Rekisteröityessä ₹1 000 ilmaista saldoa – ei vanhene koskaan | -| `scaleway` | `scw` | Scaleway AI | API-avain | [linkki](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Uusille tileille 1M ilmaista tokenia – EU-/GDPR-yhteensopiva (Pariisi), Qwen3 235B ja Llama 70B | -| `sealion` | `sealion` | SEA-LION | API-avain | [linkki](https://sea-lion.ai) | Kirjaudu osoitteessa sea-lion.ai Google-tilillä (ei korttia eikä alue-estettä), luo API-avain ja liitä se sitten tähän. | -| `seekai` | `ska` | SeekAi | API-avain, aggregaattori | [linkki](https://seekai.cc) | Luo API-avain osoitteessa https://seekai.cc ja liitä se sitten tähän Bearer-tunnuksena. | -| `segmind` | `segmind` | Segmind | API-avain, kuva, video | [linkki](https://segmind.com) | Käytä Segmind-API-avaintasi x-api-key-otsakkeessa. OmniRoute käyttää osoitetta https://api.segmind.com/v1/ ja palauttaa luodun kuvan tai videon tavut suoraan. | -| `sensenova` | `sensenova` | SenseNova | API-avain | [linkki](https://platform.sensenova.cn) | Hanki API-avain osoitteesta platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | API-avain | [linkki](https://cloud.siliconflow.com) | 1 $ ilmaista saldoa sekä tällä hetkellä luettelossa olevat 0 $:n mallit henkilöllisyyden vahvistamisen jälkeen; saatavuus ja rajoitukset voivat muuttua | -| `snowflake` | `snowflake` | Snowflake Cortex | API-avain, yrityskäyttö | [linkki](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API-avain | [linkki](https://xinghuo.xfyun.cn) | Hanki API-avain osoitteesta console.xfyun.cn | -| `speka` | `speka` | Speka AI | API-avain, aggregaattori | [linkki](https://speka.me) | Ilmainen paketti: 1 $ kuukausittaista käyttöä, 10 RPM, yksi API-avain sekä pääsy avoimiin malleihin ja kokeiluympäristöön; korttia ei vaadita. | -| `stability-ai` | `stability` | Stability AI | API-avain, kuva | [linkki](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API-avain | [linkki](https://stepfun.com) | Hanki API-avain osoitteesta platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | API-avain | [linkki](https://ai.sumopod.com) | Käytä SumoPod-API-avaintasi (sk-...) muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. API:n perus-URL: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API-avain | [linkki](https://suno.ai) | Liitä istuntoeväste osoitteesta suno.ai (Clerk-todennus) | -| `synthetic` | `synthetic` | Synthetic | API-avain, aggregaattori | [linkki](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API-avain, aggregaattori | [linkki](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API-avain | [linkki](https://hunyuan.tencent.com) | Hanki API-avain osoitteesta console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | API-avain, aggregaattori | [linkki](https://theb.ai) | Bearer-API-avain TheB.AI:n OpenAI-yhteensopivaa yhdyskäytävää varten. | -| `tinyfish` | `tf` | TinyFish Fetch | API-avain | [linkki](https://docs.tinyfish.ai/fetch-api) | X-API-Key osoitteesta agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API-avain, video | [linkki](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API-avain | [linkki](https://agent-router.gaib.ai) | Käytä Token Kiosk -API-avaintasi muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva yhdyskäytävä. API:n perus-URL: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API-avain, aggregaattori | [linkki](https://www.tokenreply.com) | Ilmaisiksi merkityillä malleilla on malli- ja kampanjakohtaiset päivittäiset rajoitukset; kiinteää yleistä ilmaista kiintiötä ei ole julkaistu. | -| `tokenrouter` | `trk` | TokenRouter | API-avain | [linkki](https://tokenrouter.com) | Käytä TokenRouter-API-avaintasi muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. API:n perus-URL: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API-avain, kuva | [linkki](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API-avain | [linkki](https://docs.opentyphoon.ai) | Ilmainen API-avain, jonka nopeusrajoitus on 5 pyyntöä/s ja 200 pyyntöä/min. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API-avain | [linkki](https://uncensored.com) | Käytä uncensored.com-palvelun Developer API -avaintasi (uai_sk_live_...). OmniRoute lähettää sen X-api-key-otsakkeena OpenAI-yhteensopivaan https://api.uncensored.com/api/v1-päätepisteeseen. Avain ei vanhene koskaan. Tämä on käytön mukaan veloitettava saldo-/krediittipalvelu; rajoittamattoman tilaustason keskustelu on erillinen `uc`-tarjoaja. | -| `udio` | `udio` | Udio | API-avain | [linkki](https://udio.com) | Liitä udio.com-palvelun istuntoeväste (Supabase-todennus) | -| `unorouter` | `unorouter` | UnoRouter | API-avain, aggregaattori | [linkki](https://unorouter.ai) | Mallit, joiden nimen lopussa on :free, eivät vähennä saldoa; rajoitus on 1 pyyntö minuutissa kutakin ilmaista mallia ja käyttäjää kohden. | -| `upstage` | `upstage` | Upstage | API-avain | [linkki](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API-avain | [linkki](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API-avain | [linkki](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API-avain, aggregaattori | [linkki](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API-avain, yrityskäyttö | [linkki](https://cloud.google.com/vertex-ai) | Anna palvelutilin JSON-tiedot, OAuth-käyttöoikeustunnus, Vertex Express API -avain tai palvelutiliin sidottu valtuutusavain. Express-tila tukee vain Geminiä; kumppanimallit edellyttävät projektikohtaisia tunnistetietoja. | -| `vertex-partner` | `vp` | Vertex AI Partners | API-avain, yrityskäyttö | [linkki](https://cloud.google.com/vertex-ai) | Anna palvelutilin JSON-tiedot tai OAuth-tunnistetiedot. Palvelutiliin sidottu valtuutusavain tukee myös mallien löytämistä, mutta kumppanimallien päättely edellyttää lisäksi avaimen Google Cloud -projektitunnusta. Tavalliset Express-avaimet tukevat vain Geminiä. | -| `void-ai` | `void-ai` | Void AI | API-avain, aggregaattori | [linkki](https://voidai.app) | Julkisessa malliluettelossa jotkin mallit on merkitty ilmaisen tilauksen vaativiksi, mutta käyttöoikeus on ehdollinen eikä numeerista kiintiötä ole vahvistettu. | -| `volcengine` | `volcengine` | Volcengine | API-avain | [linkki](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API-avain | [linkki](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Yhdistä Volcano Engine -tilisi tai käytä Ark Agent Plan -tilauksen API-avainta. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API-avain | [linkki](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Yhdistä Volcano Engine -tilisi tai käytä Ark Coding Plan -tilauksen API-avainta. | -| `voyage-ai` | `voyage` | Voyage AI | API-avain, upotus/uudelleenjärjestys | [linkki](https://www.voyageai.com) | Bearer API -avain Voyage AI:n upotus- ja uudelleenjärjestelyrajapinnoille. | -| `wafer` | `wafer` | Wafer AI | API-avain | [linkki](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API-avain | [linkki](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API-avain, yrityskäyttö | [linkki](https://www.ibm.com/products/watsonx-ai) | Käytä watsonx-palvelun bearer-tunnustasi. Perus-URL voi olla https://.ml.cloud.ibm.com/ml/gateway/v1/ tai itse hallinnoitu /ml/gateway/v1-päätepiste. | -| `writer` | `writer` | Writer | API-avain | [linkki](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API-avain | [linkki](https://x5lab.dev) | Käytä X5Lab API -avaintasi (x5-...) muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. API:n perus-URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API-avain | [linkki](https://x.ai) | Käytä virallista xAI API -avainta tai kirjaudu sisään xAI OAuthilla. Grok Build JWT -istunnot ovat edelleen erillinen tarjoaja. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API-avain | [linkki](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API-avain | [linkki](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API-avain, aggregaattori | [linkki](https://xkiro.com) | Luo ilmainen tili osoitteessa xkiro.com ja liitä avain tähän (Bearer; myös x-api-key hyväksytään). | -| `yi` | `yi` | Yi (01.AI) | API-avain | [linkki](https://01.ai) | Hanki API-avain osoitteesta platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API-avain, aggregaattori | [linkki](https://yolo-auto.com) | Ilmaisen API-käytön pyyntömäärää on rajoitettu, ja se on tarkoitettu testaamiseen; numeerista päiväkohtaista kiintiötä ei ole julkaistu eikä ilmaisen käytön luvata jatkuvan määräämättömästi. | -| `zai` | `zai` | Z.AI | API-avain | [linkki](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API-avain | [linkki](https://zenmux.ai) | Käytä ZenMux API -avaintasi muodossa Authorization: Bearer . ZenMux on täysin OpenAI-yhteensopiva. Perus-URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API-avain, aggregaattori | [linkki](https://www.zerolimitai.com) | Tilapäistä ilmaista kokeilujaksoa mainostetaan, mutta viralliset sivut antavat ristiriitaisesti kestoksi 3 tai 7 päivää; väitettä 100 kutsusta päivässä ei pidetä pysyvänä. | -| `zylo-api` | `zylo` | Zylo API | API-avain, aggregaattori | [linkki](https://zyloai.net) | Basic-tilaus: 10 RPM, 7 200 pyyntöä päivässä ja 200 000 tokenia päivässä; rajoitettu Basic-tekstimalleihin. | +## API-avainpalveluntarjoajat (maksulliset / maksulliset ilmaisilla krediiteillä) (242) + +| ID | Alias | Nimi | Tunnisteet | Verkkosivusto | Huomautukset | +| ------------------------ | --------------- | ------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API-avain | [linkki](https://ai.360.cn) | Hanki API-avain osoitteesta ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | API-avain, aggregaattori | [linkki](https://agentrouter.org) | Rekisteröitymällä saat $200 ilmaista saldoa – usean mallin reititysyhdyskäytävä | +| `agnes` | `agnes` | Agnes AI | API-avain, video | [linkki](https://agnes-ai.com) | Hanki API-avain osoitteesta agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (Kiina) | API-avain | [linkki](https://api.agnes-ai.cn) | Hanki API-avain Agnes CN -sivustolta. | +| `ai21` | `ai21` | AI21 Labs | API-avain | [linkki](https://www.ai21.com) | Rekisteröitymällä saat $10 kokeilusaldon (voimassa 3 kuukautta), eikä luottokorttia vaadita | +| `aimlapi` | `aiml` | AI/ML API | API-avain, aggregaattori | [linkki](https://aimlapi.com) | Ilmaistaso on keskeytetty (2026) — AI/ML API on nyt saatavilla vain käytön mukaan laskutettavana (vähintään $20:n saldolataus); ei toistuvaa ilmaista saldoa. | +| `ainative` | `ainative` | AINative Studio | API-avain | [linkki](https://ainative.studio) | Luo ilmainen API-avain osoitteessa ainative.studio (korttia ei tarvita) ja liitä se sitten tähän Bearer-tunnuksena. | +| `aion` | `aion` | Aion Labs | API-avain | [linkki](https://www.aionlabs.ai) | Luo ilmainen API-avain osoitteessa aionlabs.ai (korttia ei tarvita) ja liitä se sitten tähän Bearer-tunnuksena. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API-avain | [linkki](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Kiina) | API-avain | [linkki](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API-avain | [linkki](https://developer.ant-ling.com/en/docs/) | Rekisteröidy ja luo API-avain Ant Ling API -konsolissa (https://chat.ant-ling.com/open) ja liitä se sitten tähän. OmniRoute reitittää keskusteluliikenteen osoitteeseen https://api.ant-ling.com/v1/chat/completions; palveluntarjoaja on OpenAI-yhteensopiva ja tarjoaa myös Anthropic-yhteensopivan rajapinnan. | +| `anthropic` | `anthropic` | Anthropic | API-avain | [linkki](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API-avain, aggregaattori | [linkki](https://anyapi.ai) | Ilmaispaketti: 100 000 ANY-tokenia päivässä ja 100 RPM vaatimukset täyttäville Free/Basic-malleille; luottokorttia ei vaadita. | +| `api-airforce` | `af` | Api.airforce | API-avain | [linkki](https://api.airforce) | 55 ilmaistason mallia, mukaan lukien Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash ja DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | API-avain | [linkki](https://arcee.ai) | Hanki API-avain osoitteesta arcee.ai | +| `auriko` | `auriko` | Auriko | API-avain, aggregaattori | [linkki](https://www.auriko.ai) | Ilmaispaketin ilmoitetut rajat ovat 1 000 Platform RPM ja 10 000 BYOK RPM. Alustan inferenssistä aiheutuvat palveluntarjoajan kustannukset veloitetaan edelleen; kyseessä ei ole ilmainen token-kiintiö tai rajoittamaton ilmainen inferenssi. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API-avain, yrityskäyttö | [linkki](https://learn.microsoft.com/azure/ai-foundry) | Käytä Azure AI Foundry -avaintasi. Perus-URL voi olla https://.services.ai.azure.com/openai/v1/ tai https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | API-avain, yrityskäyttö | [linkki](https://azure.microsoft.com/products/ai-services/openai-service) | Käytä Azure OpenAI API -avaintasi. Perus-URL:n tulee olla resurssisi päätepiste, esimerkiksi https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API-avain | [linkki](https://b.ai) | Bearer API -avain b.ai:n OpenAI-yhteensopivaan LLM-yhdyskäytävään (eri palvelu kuin TheB.AI). Luo avain osoitteessa https://docs.b.ai ja käytä sitten osoitetta https://api.b.ai/v1 OpenAI-yhteensopivana perus-URL:na. | +| `baichuan` | `baichuan` | Baichuan | API-avain | [linkki](https://www.baichuan-ai.com/) | Hanki API-avain osoitteesta platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | API-avain | [linkki](https://ernie.baidu.com/) | Hanki API-avain osoitteesta console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API-avain | [linkki](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API-avain | [linkki](https://baseten.co) | $30 ilmaista kokeilusaldon GPU-inferenssiin | +| `bazaarlink` | `bzl` | BazaarLink | API-avain | [linkki](https://bazaarlink.ai) | Käytä BazaarLink API -avaintasi (alkaa merkkijonolla sk-bl-) muodossa Authorization: Bearer . OpenAI SDK toimii perus-URL:n https://bazaarlink.ai/api/v1 kanssa. Mallit käyttävät muotoa provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | API-avain, yrityskäyttö | [linkki](https://aws.amazon.com/bedrock) | Käytä Amazon Bedrock API -avaintasi ja määritä AWS-alue, jolla mallisi ovat käytössä (esimerkiksi eu-west-2). OmniRoute kutsuu Bedrockin natiivia Converse API -rajapintaa suoraan. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API-avain, kuva | [linkki](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API-avain | [linkki](https://blackbox.ai) | ⚠️ **VANHENTUNUT.** api.blackbox.ai palauttaa HTTP 404 -vastauksen jokaiselle polkuvariantille (kartoitus 2026-08-21); julkinen inferenssirajapinta on siirretty käyttöoikeudeltaan rajattuun enterprise.blackbox.ai/v1-päätepisteeseen. | +| `bluesminds` | `bm` | BluesMinds | API-avain | [linkki](https://www.bluesminds.com) | Ilmaista pi-saldoa päivittäin — tukee yli 200:aa mallia, mukaan lukien GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen ja Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | API-avain | [linkki](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API-avain | [linkki](https://bytez.com) | $1 ilmaista saldoa, joka uusiutuu 4 viikon välein | +| `cerebras` | `cerebras` | Cerebras | API-avain | [linkki](https://inference.cerebras.ai) | Kertaluonteinen $5 rekisteröitymissaldo (voimassa 30 päivää); maksutapa vaaditaan. Ei toistuva ilmaistaso. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API-avain | [linkki](https://hyper.charm.land) | Rekisteröitymällä saat 100 ilmaista Hypercredit-pistettä kuukaudessa | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API-avain, aggregaattori | [linkki](https://api.oriper.com) | Virallisissa metatiedoissa luvataan 2 miljoonaa tokenia kuukaudessa, mutta julkinen sivusto ja dokumentaatio olivat estettyinä auditoinnin aikana; kiintiötä ja brändikytkentää on pidettävä vahvistamattomina. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API-avain, koontipalvelu | [linkki](https://chatanywhere.tech) | Vain henkilökohtaiseen, opetus- tai tutkimuskäyttöön: julkisessa dokumentaatiossa mainitaan 10 000 pistettä päivässä ja 200 pyyntöä päivässä IP-osoitetta/avainta kohden; älä käytä kaupalliseen liikenteeseen. | +| `cheaperinference` | `cinf` | Cheaper Inference | API-avain | [linkki](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API-avain | [linkki](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API-avain, koontipalvelu | [linkki](https://chutes.ai) | Bearer-API-avain Chutesin OpenAI-yhteensopivaa yhdyskäytävää varten. | +| `clarifai` | `clarifai` | Clarifai | API-avain, yrityskäyttö | [linkki](https://docs.clarifai.com) | Käytä Clarifai PAT -tunnustasi tai sovelluskohtaista API-avainta. OmniRoute käyttää OpenAI-yhteensopivaa päätepistettä osoitteessa https://api.clarifai.com/v2/ext/openai/v1 ja todentaa pyynnöt arvolla Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API-avain, koontipalvelu | [linkki](https://cloudcode.one) | Julkaistuihin ilmaisiin malleihin kuuluvat glm-4.7-flash ja glm-4.6v-flash; numeerista kiintiötä ei ole julkaistu, ja avaimen luominen saattaa edellyttää saldoa tai kuponkia. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API-avain | [linkki](https://developers.cloudflare.com/workers-ai) | Edellyttää API-tunnusta JA tilitunnusta (löytyy osoitteesta dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API-avain | [linkki](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API-avain | [linkki](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API-avain | [linkki](https://cohere.com) | Ilmainen kokeilu: 1 000 API-kutsua kuukaudessa testausta varten, luottokorttia ei tarvita | +| `command-code` | `cmd` | Command Code | API-avain | [linkki](https://commandcode.ai/) | Käytä Command Code -API-avainta. Pyynnöt lähetetään Command Coden /provider/v1/chat/completions-päätepisteeseen. | +| `coze` | `coze` | Coze | API-avain | [linkki](https://coze.com) | Hanki API-avain osoitteesta coze.com/open/api | +| `crof` | `crof` | CrofAI | API-avain | [linkki](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API-avain | [linkki](https://cursor.com/dashboard/api) | Liitä Cursor-käyttäjän API-avain (crsr_...) osoitteesta cursor.com/dashboard/api. OmniRoute vaihtaa sen tarvittaessa istuntotunnukseksi; IDE:n tai cursor-agentin asennusta ei tarvita. Käyttö laskutetaan avaimen omistavalta Cursor-tilaukselta. | +| `dahl` | `dahl` | Dahl | API-avain | [linkki](https://inference.dahl.global) | Luo tunnus automaattisesti napsauttamalla 'Add Account' tai lisää API-avain manuaalisesti. | +| `databricks` | `databricks` | Databricks | API-avain, yrityskäyttö | [linkki](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API-avain, yrityskäyttö | [linkki](https://docs.datarobot.com) | Käytä DataRobot-API-tunnustasi. Valinnainen perus-URL-osoite voi olla tilin juuriosoite (LLM Gatewaylle) tai käyttöönoton URL-osoite polun /api/v2/deployments/ alla. | +| `deepai` | `deepai` | DeepAI | API-avain, kuva | [linkki](https://deepai.org) | Käytä DeepAI-API-avaintasi. Hanki se osoitteesta deepai.org — edellyttää Pro-tilausta ($9.99/kk). | +| `deepinfra` | `deepinfra` | DeepInfra | API-avain | [linkki](https://deepinfra.com) | Rekisteröityessä saat ilmaisia krediittejä API-testaukseen ja mallien kokeilemiseen | +| `deepseek` | `ds` | DeepSeek | API-avain | [linkki](https://platform.deepseek.com) | 5 miljoonaa ilmaista tokenia rekisteröitymisen yhteydessä – luottokorttia ei tarvita | +| `dgrid` | `dgrid` | DGrid | API-avain | [linkki](https://dgrid.ai) | DGrid Free Models Router: 10 pyyntöä minuutissa ja 100 pyyntöä päivässä. Kertaluonteinen $5:n saldon lisäys avaa enintään 20 pyyntöä minuutissa ja 1 000 pyyntöä päivässä. | +| `dify` | `dify` | Dify | API-avain | [linkki](https://dify.ai) | Hanki API-avain Dify-instanssistasi. | +| `digitalocean` | `digitalocean` | DigitalOcean | API-avain | [linkki](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API-avain | [linkki](https://dit.ai) | Käytä dit.ai-API-avaintasi muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva ja suoraan korvaava ratkaisu — vaihda vain perus-URL-osoitteeksi https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | API-avain | [linkki](https://doubao.com) | Hanki API-avain osoitteesta console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | API-avain, koontipalvelu | [linkki](https://www.dxnt.com) | Ilmaistilien dokumentoitu raja on 100 kutsua päivässä; kiintiö voi kasvaa kutsujen kautta ja vaihdella tileittäin. | +| `electronhub` | `electronhub` | Electron Hub | API-avain, koontipalvelu | [linkki](https://www.electronhub.ai) | Ilmainen tilaus: 5 pyyntöä minuutissa, $0.25:n viikoittaiset krediitit ja 10 Neutrinoa päivässä :free-malleille; myös perhebudjetit ovat voimassa. | +| `empower` | `empower` | Empower | API-avain, koontipalvelu | [linkki](https://docs.empower.dev) | Bearer-API-avain Empowerin OpenAI-yhteensopivaa päätepistettä varten. | +| `eurouter` | `eurouter` | EURouter | API-avain, koontipalvelu | [linkki](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API-avain | [linkki](https://factory.ai) | Bearer-API-avain Factoryn OpenAI-yhteensopivaa yhdyskäytävää varten. | +| `fal-ai` | `fal` | Fal.ai | API-avain, kuva | [linkki](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API-avain, koontipalvelu | [linkki](https://fastrouter.ai) | :free-päätteiset mallit sallivat 10 pyyntöä päivässä organisaatiota ja mallia kohden; saatavuus voi muuttua. | +| `featherless-ai` | `featherless` | Featherless AI | API-avain | [linkki](https://featherless.ai) | Ilmainen käyttöluokka saatavilla — luottokorttia ei tarvita | +| `fenayai` | `fenayai` | FenayAI | API-avain, koontipalvelu | [linkki](https://fenayai.com) | Bearer-API-avain FenayAI:n OpenAI-yhteensopivaa yhdyskäytävää varten. | +| `fireworks` | `fireworks` | Fireworks AI | API-avain | [linkki](https://fireworks.ai) | Rekisteröityessä saat $1:n edestä ilmaisia aloituskrediittejä API-testaukseen | +| `free-ai` | `free-ai` | Free.ai | API-avain, koontipalvelu | [linkki](https://free.ai) | Sähköpostivahvistuksen jälkeen 30 000 tokenia päivässä kattaa itse ylläpidetyt mallit. Kiintiön ylittävä käyttö voidaan laskuttaa omakustannushintaan, ja ulkoiset premium-mallit ovat maksullisia. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API-avain | [linkki](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API-avain | [linkki](https://freebuff.com) | Syötä Freebuff-/Codebuff-todennustunnus (saatu CLI-kirjautumisella tai automaattisella keräimellä). | +| `freeinference` | `freeinference` | FreeInference | API-avain, välityspalvelu | [linkki](https://freeinference.org) | Maksuton tutkimuskäyttö ilman maksukorttia; muiden kuin Harvardin hakijoiden käyttöoikeus edellyttää manuaalista hyväksyntää, eikä numeerista kiintiötä taata julkisesti. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API-avain | [linkki](https://freemodel.dev) | Rekisteröityessä 300 $ maksuttomia krediittejä — luottokorttia ei vaadita. Käytä GPT-5.4- ja GPT-5.5-malleja (OpenAI:n uusimpia lippulaivamalleja) OpenAI-yhteensopivan API:n kautta. | +| `freetheai` | `fta` | FreeTheAi | API-avain, välityspalvelu | [linkki](https://freetheai.xyz) | Liity FreeTheAi Discordiin saadaksesi maksuttoman API-avaimesi. | +| `friendliai` | `friendli` | FriendliAI | API-avain | [linkki](https://friendli.ai) | Maksuton taso palvelimettomaan inferenssiin — luottokorttia ei vaadita | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API-avain, välityspalvelu | [linkki](https://g4f.space) | Hanki anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API-avain, välityspalvelu | [linkki](https://g4f.space) | Hanki anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API-avain, välityspalvelu | [linkki](https://g4f.space) | Hanki anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API-avain, välityspalvelu | [linkki](https://g4f.space) | Hanki anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API-avain, välityspalvelu | [linkki](https://g4f.space) | Hanki anonyymejä cake-krediittejä osoitteessa g4f.dev/chat tai käytä g4f.dev-jäsenavainta (luo sellainen osoitteessa g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API-avain | [linkki](https://galadriel.com) | ⚠️ **VANHENTUNUT.** api.galadriel.ai ei enää ratkea (tarkistus 2026-06-19); inferenssi-API vaikuttaa lakkautetulta. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API-avain | [linkki](https://aistudio.google.com) | Maksuton taso on saatavilla Google AI Studion kautta; nykyiset mallikohtaiset kiintiöt ja alueelliset rajoitukset ovat voimassa | +| `getgoapi` | `ggo` | GoAPI | API-avain, välityspalvelu | [linkki](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API-avain | [linkki](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API-avain | [linkki](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLabin henkilökohtainen käyttöoikeustunnus julkista Code Suggestions API:a varten. Määritä itse isännöity perus-URL, kun gitlab.com ei ole käytössä. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API-avain | [linkki](https://opengateway.gitlawb.com) | Maksuton MiMo (xiaomi/mimo-v2.5) poistettiin käytöstä 2026-05 — Opengateway on nyt käytön mukaan veloittava krediittiyhdyskäytävä, eikä siinä ole toistuvasti maksutonta mallia. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API-avain | [linkki](https://opengateway.gitlawb.com) | Maksuton Nemotron-kampanja päättyi 2026-06 — GMI Cloud -reitti toimii nyt vain käytön mukaan veloitettavilla krediiteillä. | +| `glm` | `glm` | GLM Coding | API-avain | [linkki](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Kiina) | API-avain | [linkki](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API-avain | [linkki](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API-avain | [linkki](https://greenpt.com) | API-tilauksen luominen on maksutonta; inferenssistä veloitetaan tokenien mukaan. Maksutonta inferenssikiintiötä ei ole julkaistu. | +| `groq` | `groq` | Groq | API-avain | [linkki](https://groq.com) | Maksuton sopimus: mallikohtaiset rajat (200 000 tokenia päivässä kutakin keskustelumallia kohden; katso RPM-/RPD-rajat osoitteesta console.groq.com/docs/rate-limits) — maksutapaa ei ole tallennettu. | +| `haiper` | `hp` | Haiper | API-avain, video | [linkki](https://haiper.ai) | Hanki API-avain osoitteesta haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | API-avain | [linkki](https://api.hcnsec.cn) | Hanki API-avain osoitteesta api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | API-avain, välityspalvelu | [linkki](https://helixmind.online) | Aiemmin levitettyjä väitteitä 3 RPM:n / 50 RPD:n kiintiöstä ja maksukortittomuudesta ei vahvistettu tarkastuksessa 2026-08-02; nykyinen kiintiö ja laskutus edellyttävät tilin vahvistamista. | +| `helyxai` | `helyxai` | Helyx AI | API-avain, välityspalvelu | [linkki](https://helyxai.space) | Käytössä olevan maksuttoman sopimuksen dokumentaatiossa ilmoitetaan 100 000 tokenia päivässä; sivuston erillinen markkinointiväite yli 2 miljoonasta on ristiriidassa tämän kanssa, eikä sitä pidetä kiintiötakuuna. | +| `heroku` | `heroku` | Heroku AI | API-avain, yrityskäyttö | [linkki](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API-avain | [linkki](https://huggingface.co) | Maksuton Inference API tuhansille malleille (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API-avain | [linkki](https://hyperbolic.xyz) | Rekisteröityessä 1–5 $ kokeilukrediittejä palvelimettomaan inferenssiin | +| `ideogram` | `ideo` | Ideogram | API-avain | [linkki](https://ideogram.ai) | Hanki API-avain osoitteesta ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | API-avain | [linkki](https://xinghuo.xfyun.cn) | Hanki API-avain osoitteesta console.xfyun.cn | +| `inception` | `inception` | Inception | API-avain | [linkki](https://docs.inceptionlabs.ai) | Rekisteröityessä 10 miljoonaa maksutonta tokenia, eikä luottokorttia vaadita. | +| `inference-net` | `inet` | Inference.net | API-avain | [linkki](https://inference.net) | Rekisteröityessä 25 $ maksuttomia krediittejä; lisäksi saatavilla on tutkimusapurahoja | +| `internlm` | `internlm` | InternLM (Intern-S1) | API-avain | [linkki](https://internlm.intern-ai.org.cn/) | Maksuton kuukausikiintiö noin 1 miljoona syötetokenia / 3 miljoonaa tulostokenia (noin 10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API-avain, upotus/uudelleenjärjestely | [linkki](https://jina.ai) | Bearer-API-avain palvelulle api.jina.ai — upotukset, uudelleenjärjestely, luokittelu, segmentointi ja haku. Hallintapaneelin avaimet ovat etusijalla muuttujaan JINA_AI_API_KEY nähden. Tämä ei ole Reader-/r.jina.ai-kortti, eikä se nouda URL-osoitteita. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API-avain | [linkki](https://jina.ai/reader) | Bearer-API-avain r.jina.ai-palvelun URL-osoitteesta Markdown-muotoon muuntamista varten (vain /v1/web/fetch). Ei tarjoa päätepisteitä /v1/embeddings tai /v1/rerank. Sama Jina-tunniste kuin Foundation API:ssa toimii; OmniRoute käyttää uudelleen jina-ai-hallintapaneeliavainta tai muuttujaa JINA_AI_API_KEY, kun tämä kortti on tyhjä. | +| `kenari` | `kenari` | Kenari | API-avain | [linkki](https://kenari.id) | Käytä Kenari-API-avaintasi (kn-...) muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. API:n perus-URL: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API-avain | [linkki](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API-avain, aggregaattori | [linkki](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (vanha Moonshot API) | API-avain | [linkki](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API-avain | [linkki](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API-avain | [linkki](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API-avain, aggregaattori | [linkki](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API-avain, video | [linkki](https://leonardo.ai) | Hanki API-avain osoitteesta leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | API-avain | [linkki](https://liquid.ai) | Hanki API-avain osoitteesta liquid.ai | +| `literouter` | `literouter` | LiteRouter | API-avain, aggregaattori | [linkki](https://literouter.com) | Ilmaiset mallivariantit käyttävät päätettä :free; päivittäiset krediittirajat vaihtelevat mallin mukaan, ja ilmaisen syötteen enimmäismäärä on 5 000 tokenia. | +| `llamagate` | `llamagate` | LlamaGate | API-avain | [linkki](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API-avain, aggregaattori | [linkki](https://llm.kiwi) | Ilmaispaketti tarjoaa mallit auto ja hrLLM; julkaistu 40 pyynnön tuntirajoitus koskee mallia hrLLM. | +| `llm7` | `llm7` | LLM7.io | API-avain | [linkki](https://llm7.io) | Käytä mitä tahansa epätyhjää avainta (esimerkiksi 'unused'). Jos vanhemmat sisäänrakennetut mallit palauttavat virheen model_unavailable, käytä Available Models → Import from /models tai Auto-Sync; toimivaksi vahvistettu malli: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API-avain, aggregaattori | [linkki](https://llmgateway.io) | Isännöity ilmaispaketti: ilmaiset mallit on rajoitettu viiteen pyyntöön 10 minuutissa, kun tilillä ei ole krediittejä. | +| `logfare` | `logfare` | Logfare | API-avain, aggregaattori | [linkki](https://logfare.ai) | Luo maksuton tili osoitteessa https://logfare.ai/register (käyttäjänimi/salasana, ei sähköpostivahvistusta) saadaksesi API-avaimen heti, ja liitä se sitten tähän Bearer-tunnisteena. | +| `longcat` | `lc` | LongCat AI | API-avain | [linkki](https://longcat.chat/platform/docs) | Ilmainen: kertaluonteinen 10 miljoonan tokenin myöntö tilin rekisteröinnin ja KYC-vahvistuksen jälkeen (LongCat-2.0). Vain kerran — ei toistuvaa päivittäistä tai kuukausittaista kiintiötä. | +| `magnific` | `freepik` | Magnific | API-avain, kuva | [linkki](https://www.magnific.com) | Hanki API-avain osoitteesta magnific.com/user/api-keys (otsake x-magnific-api-key). Vanhat Freepik-kehittäjäavaimet toimivat edelleen. | +| `maritalk` | `maritalk` | Maritalk | API-avain | [linkki](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API-avain, aggregaattori | [linkki](https://meganova.ai) | Maksuton rekisteröityminen ilman korttia. Julkaistut Tier 1 -mallikohtaiset kiintiöt ovat yhteensä 550 pyyntöä päivässä; ne eivät muodosta yhteistä yleiskiintiötä, ja maksullista ylityskäyttöä voidaan veloittaa, jos se on käytössä. | +| `meta-llama` | `meta` | Meta Llama API | API-avain | [linkki](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API-avain, video | [linkki](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Kiina) | API-avain | [linkki](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API-avain | [linkki](https://mistral.ai) | Ilmainen Experiment-taso: käyttönopeudeltaan rajoitettu pääsy kaikkiin malleihin, luottokorttia ei tarvita | +| `mixedbread` | `mxbai` | Mixedbread AI | API-avain | [linkki](https://www.mixedbread.com) | Bearer-API-avain Mixedbreadin upotus-API:a varten. | +| `mixlayer` | `mixlayer` | Mixlayer | API-avain, aggregaattori | [linkki](https://www.mixlayer.com) | Malli qwen/qwen3.5-4b-free on ilmainen prototyyppien luomiseen ja käyttönopeudeltaan rajoitettu; kiinteää julkista RPM- tai päiväkohtaista kiintiötä ei ole vahvistettu. | +| `mnn-ai` | `mnn-ai` | MNN AI | API-avain, aggregaattori | [linkki](https://mnnai.ru) | Ilmaispaketti: 1 $ krediittejä kuukaudessa, 10 RPM ja pääsy vain Free-merkinnällä varustettuihin malleihin. | +| `modal` | `mdl` | Modal | API-avain, yrityskäyttö | [linkki](https://modal.com/docs) | Käytä Modal-käyttöönottoasi suojaavaa Bearer-tunnistetta, jos se on käytössä. Perus-URL-osoitteen tulee osoittaa OpenAI-yhteensopivaan Modal-sovellukseesi, esimerkiksi https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API-avain | [linkki](https://modelscope.cn) | Ilmaistaso ModelScope API-Inference -palvelun kautta — Alibaba-tili vaaditaan. | +| `monsterapi` | `monster` | MonsterAPI | API-avain | [linkki](https://monsterapi.ai) | ⚠️ **VANHENTUNUT.** Monster API lopetti toimintansa 2026-06-30. Käytä vaihtoehtoisia OpenAI-yhteensopivia palveluntarjoajia. | +| `moonshot` | `moonshot` | Kimi | API-avain | [linkki](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API-avain | [linkki](https://morphllm.com) | Ilmaistaso: 250 000 krediittiä kuukaudessa, 0 $ | +| `muse-code` | `mc` | Muse Code (Meta) | API-avain | [linkki](https://github.com/meta-llama/llama-stack) | Käytä META_API_KEY-ympäristömuuttujaasi Bearer-tunnisteena. Muse Code CLI käyttää OpenAI Responses API -rajapinnan siirtomuotoa (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API-avain, aggregaattori | [linkki](https://naga.ac) | Hanki API-avain osoitteesta naga.ac — rekisteröityminen Google-, GitHub- tai Discord-tilillä on mahdollista. | +| `naga-ai` | `naga-ai` | Naga AI | API-avain, aggregaattori | [linkki](https://naga.ac) | Merkinnällä :free varustetut mallit on lueteltu julkisesti, mutta numeerista kiintiötä ei ole vahvistettu. Nagan käytännössä varoitetaan, että ilmaistason kehotteita ja tulosteita voidaan kerätä tai käyttää koulutukseen. | +| `nanogpt` | `nanogpt` | NanoGPT | API-avain | [linkki](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API-avain | [linkki](https://bynara.id) | Luo ilmainen NaraRouter-tili, yhdistä Telegram-tilisi (pakollinen ennen /v1-vastauksia) ja liitä sitten avain tähän Bearer-tunnuksena. | +| `navy` | `navy` | NavyAI | API-avain | [linkki](https://api.navy) | Luo ilmainen API-avain NavyAI-hallintapaneelissa ja liitä se sitten tähän Bearer-tunnuksena. | +| `nebius` | `nebius` | Nebius AI | API-avain | [linkki](https://nebius.com) | Rekisteröityessä noin $1 kokeilukrediittejä API-testaukseen | +| `nlpcloud` | `nlpc` | NLP Cloud | API-avain | [linkki](https://docs.nlpcloud.com) | Käytä NLP Cloudin API-avaintasi muodossa Authorization: Token . OmniRoute käyttää oletusarvoisesti chatbot-päätepistettä osoitteessa https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API-avain | [linkki](https://nomic.ai) | Hanki API-avain osoitteesta atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | API-avain | [linkki](https://portal.nousresearch.com/help) | Käytä Nous Portal -API-avaintasi. OmniRoute käyttää virallista OpenAI-yhteensopivaa päättelypäätepistettä osoitteessa https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API-avain, video, aggregaattori | [linkki](https://novita.ai) | Rekisteröityessä $0.50 kokeilukrediittejä (voimassa noin vuoden) | +| `nscale` | `nscale` | nScale | API-avain | [linkki](https://nscale.com) | Rekisteröityessä $5 ilmaisia krediittejä päättelytestaukseen | +| `nube` | `nube` | Nube.sh | API-avain | [linkki](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API-avain | [linkki](https://build.nvidia.com) | Ilmainen kehittäjäkäyttö: noin 40 RPM, yli 70 mallia (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API-avain, yrityskäyttö | [linkki](https://www.oracle.com/artificial-intelligence/generative-ai) | Käytä OCI Generative AI -API-avaintasi tai IAM Bearer -tunnustasi. Perus-URL voi olla https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | API-avain, aggregaattori | [linkki](https://ofox.ai) | Nykyisessä luettelossa mainostetaan yli 10:tä ilmaista mallia ilman julkista numeerista kiintiötä; tarkista tuotantokäyttöä varten taustapalvelujen alkuperää, säilytystä ja koulutusta koskevat ehdot. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API-avain | [linkki](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API-avain | [linkki](https://1min.ai) | Luo API-avain osoitteessa https://docs.1min.ai/docs/api/create-api-key ja liitä se sitten tähän. | +| `openadapter` | `oad` | OpenAdapter | API-avain | [linkki](https://openadapter.dev) | Käytä OpenAdapter-API-avaintasi muodossa Authorization: Bearer sk-cv-. Täysin OpenAI-yhteensopiva. API:n perus-URL: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API-avain | [linkki](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API-avain | [linkki](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API-avain | [linkki](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API-avain | [linkki](https://openference.com) | Ilmaistaso: sisältää mallit Qwen3.8 27b ja Llama 3.2 3B — nykyiset ehdot ovat osoitteessa openference.com/pricing | +| `openrouter` | `openrouter` | OpenRouter | API-avain, aggregaattori | [linkki](https://openrouter.ai) | Ilmaiset mallit hintaan $0/token päätteellä :free – 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API-avain | [linkki](https://openvecta.com) | Rekisteröityessä ilmaisia krediittejä OpenAI-yhteensopivaan päättelyyn LLM-, upotus- ja päättelymalleilla | +| `opper` | `opper` | Opper | API-avain, aggregaattori | [linkki](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API-avain | [linkki](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API-avain | [linkki](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API-avain | [linkki](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API-avain | [linkki](https://www.perplexity.ai) | Käytä Perplexity-API-avaintasi. OmniRoute reitittää Agent API -mallitunnukset Perplexityn Responses-yhteensopivan päätepisteen kautta. | +| `piapi` | `pi` | PiAPI | API-avain, aggregaattori | [linkki](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API-avain | [linkki](https://pioneer.ai) | $75 ilmaisia käyttökrediittejä — luottokorttia ei vaadita | +| `plamo` | `plamo` | PLaMo | API-avain | [linkki](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API-avain, aggregaattori | [linkki](https://creator.poe.com/api-reference) | Bearer-API-avain Poen OpenAI-yhteensopivaa API:a varten. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API-avain, aggregaattori | [linkki](https://poixe.com) | Nykyiset julkiset ilmaisrajat ovat pieniä ja malliryhmäkohtaisia: 2 RPM / 5 RPD large-cup-malleille ja 20 RPM / 50 RPD small-cup-malleille. | +| `pollinations` | `pol` | Pollinations AI | API-avain, video | [linkki](https://pollinations.ai) | Anonyymi ja avaimeton pääsy dokumentoituihin ilmaismalleihin toimii mahdollisuuksien mukaan. Paikallinen v3.8.50-tarkistus (2026-07-31) palautti OmniRouten kautta virheen 401 ja suorissa taustapalvelun tarkistuspyynnöissä samasta verkosta Cloudflare 1010 -virheen. Premium-mallit edellyttävät edelleen Pollinations-API-avainta osoitteesta enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API-avain | [linkki](https://poolside.ai) | Laguna S 2.1 ja XS 2.1 ovat ilmaisia esikatselun aikana; julkista numeerista kiintiötä ei ole julkaistu. | +| `predibase` | `predibase` | Predibase | API-avain | [linkki](https://predibase.com) | ⚠️ **VANHENTUNUT.** serving.app.predibase.com ei enää ratkea (tarkistus 2026-06-19); hallittu palvelu-API vaikuttaa lopetetulta. | +| `publicai` | `publicai` | PublicAI | API-avain | [linkki](https://publicai.co) | Edellyttää API-avainta — kertaluonteinen rekisteröitymiskrediitti, jonka jälkeen käyttö on maksullista | +| `qianfan` | `qianfan` | Baidu Qianfan | API-avain | [linkki](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API-avain | [linkki](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API-avain | [linkki](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API-avain | [linkki](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API-avain, kuva | [linkki](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API-avain | [linkki](https://regolo.ai) | Hanki Regolon API-avain osoitteesta regolo.ai ja liitä se sitten tähän Bearer-tunnuksena. | +| `reka` | `reka` | Reka | API-avain | [linkki](https://docs.reka.ai/chat/overview) | Käytä Rekan API-avaintasi. OmniRoute tukee OpenAI-yhteensopivaa perus-URL-osoitetta https://api.reka.ai/v1 ja lähettää yhteensopivuuden varmistamiseksi sekä Authorization- että X-Api-Key-otsakkeen. | +| `requesty` | `requesty` | Requesty | API-avain | [linkki](https://requesty.ai) | Ilmainen taso: noin 200 pyyntöä päivässä – usean mallin reititysyhdyskäytävä (yli 300 mallia) | +| `routeway` | `routeway` | Routeway | API-avain | [linkki](https://routeway.ai) | Luo ilmainen API-avain osoitteessa routeway.ai ja liitä se sitten tähän Bearer-tunnuksena. | +| `runwayml` | `runway` | Runway | API-avain, video | [linkki](https://docs.dev.runwayml.com) | Käytä Runwayn API-avaintasi muodossa Authorization: Bearer . OmniRoute käyttää nykyistä Runway-rajapintaa osoitteessa https://api.dev.runwayml.com/v1 ja lähettää vaaditun X-Runway-Version-otsakkeen automaattisesti. | +| `sambanova` | `samba` | SambaNova | API-avain | [linkki](https://sambanova.ai) | Rekisteröityessä 5 $ ilmaista krediittiä (voimassa 30 päivää), luottokorttia ei vaadita | +| `sap` | `sap` | SAP Generative AI Hub | API-avain, yrityskäyttö | [linkki](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Käytä SAP AI Core -palvelun Bearer-tunnustasi. Perus-URL voi olla AI_API_URL-juuriosoitteesi tai Generative AI Hubin deploymentUrl. | +| `sarvam` | `sarvam` | Sarvam AI | API-avain | [linkki](https://docs.sarvam.ai) | Rekisteröityessä 1 000 ₹ ilmaista krediittiä – ne eivät vanhene koskaan | +| `scaleway` | `scw` | Scaleway AI | API-avain | [linkki](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Uusille tileille miljoona ilmaista tokenia – EU:n GDPR-vaatimusten mukainen (Pariisi), Qwen3 235B ja Llama 70B | +| `sealion` | `sealion` | SEA-LION | API-avain | [linkki](https://sea-lion.ai) | Kirjaudu osoitteeseen sea-lion.ai Google-tilillä (ei korttia eikä alue-estettä), luo API-avain ja liitä se sitten tähän. | +| `seekai` | `ska` | SeekAi | API-avain, koontipalvelu | [linkki](https://seekai.cc) | Luo API-avain osoitteessa https://seekai.cc ja liitä se sitten tähän Bearer-tunnuksena. | +| `segmind` | `segmind` | Segmind | API-avain, kuva, video | [linkki](https://segmind.com) | Käytä Segmindin API-avaintasi x-api-key-otsakkeessa. OmniRoute käyttää osoitetta https://api.segmind.com/v1/ ja palauttaa luodun kuvan tai videon tavut suoraan. | +| `sensenova` | `sensenova` | SenseNova | API-avain | [linkki](https://platform.sensenova.cn) | Hanki API-avain osoitteesta platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | API-avain | [linkki](https://cloud.siliconflow.com) | 1 $ ilmaista krediittiä sekä tällä hetkellä listatut 0 $:n mallit henkilöllisyyden vahvistamisen jälkeen; saatavuus ja rajoitukset voivat muuttua | +| `snowflake` | `snowflake` | Snowflake Cortex | API-avain, yrityskäyttö | [linkki](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API-avain | [linkki](https://xinghuo.xfyun.cn) | Hanki API-avain osoitteesta console.xfyun.cn | +| `speka` | `speka` | Speka AI | API-avain, koontipalvelu | [linkki](https://speka.me) | Ilmainen sopimus: 1 $ kuukausittaiseen käyttöön, 10 RPM, yksi API-avain sekä pääsy avoimiin malleihin ja kokeiluympäristöön; korttia ei vaadita. | +| `stability-ai` | `stability` | Stability AI | API-avain, kuva | [linkki](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API-avain | [linkki](https://stepfun.com) | Hanki API-avain osoitteesta platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | API-avain | [linkki](https://ai.sumopod.com) | Käytä SumoPodin API-avaintasi (sk-...) muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. Rajapinnan perus-URL: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API-avain | [linkki](https://suno.ai) | Liitä osoitteesta suno.ai saatu istuntoeväste (Clerk-todennus) | +| `synthetic` | `synthetic` | Synthetic | API-avain, koontipalvelu | [linkki](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API-avain, koontipalvelu | [linkki](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API-avain | [linkki](https://hunyuan.tencent.com) | Hanki API-avain osoitteesta console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | API-avain, koontipalvelu | [linkki](https://theb.ai) | Bearer-API-avain TheB.AI:n OpenAI-yhteensopivaa yhdyskäytävää varten. | +| `tinyfish` | `tf` | TinyFish Fetch | API-avain | [linkki](https://docs.tinyfish.ai/fetch-api) | X-API-Key osoitteesta agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API-avain, video | [linkki](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API-avain | [linkki](https://agent-router.gaib.ai) | Käytä Token Kioskin API-avaintasi muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva yhdyskäytävä. Rajapinnan perus-URL: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API-avain, koontipalvelu | [linkki](https://www.tokenreply.com) | Ilmaisiksi merkityillä malleilla on malli- ja kampanjakohtaiset päivittäiset rajoitukset; kiinteää yleistä ilmaista kiintiötä ei ole julkaistu. | +| `tokenrouter` | `trk` | TokenRouter | API-avain | [linkki](https://tokenrouter.com) | Käytä TokenRouterin API-avaintasi muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. Rajapinnan perus-URL: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API-avain, kuva | [linkki](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API-avain | [linkki](https://docs.opentyphoon.ai) | Ilmainen API-avain, jonka nopeusrajoitukset ovat 5 pyyntöä sekunnissa ja 200 pyyntöä minuutissa. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API-avain | [linkki](https://uncensored.com) | Käytä uncensored.comin Developer API -avainta (uai_sk_live_...). OmniRoute lähettää sen X-api-key-otsakkeena OpenAI-yhteensopivaan https://api.uncensored.com/api/v1-päätepisteeseen. Avain ei vanhene koskaan. Tämä on käytön mukaan veloitettava krediittipalvelu; ilman käyttöperusteista veloitusta toimiva tilauskeskustelu on erillinen 'uc'-palveluntarjoaja. | +| `udio` | `udio` | Udio | API-avain | [linkki](https://udio.com) | Liitä udio.comin istuntoeväste (Supabase-todennus) | +| `unorouter` | `unorouter` | UnoRouter | API-avain, aggregaattori | [linkki](https://unorouter.ai) | Mallit, joiden nimen lopussa on :free, eivät vähennä saldoa; rajoitus on 1 pyyntö minuutissa kutakin ilmaista mallia ja käyttäjää kohden. | +| `upstage` | `upstage` | Upstage | API-avain | [linkki](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API-avain | [linkki](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API-avain | [linkki](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API-avain, aggregaattori | [linkki](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API-avain, yrityskäyttö | [linkki](https://cloud.google.com/vertex-ai) | Anna Service Account JSON, OAuth-käyttöoikeustunnus, Vertex Express API -avain tai palvelutiliin sidottu valtuutusavain. Express-tila tukee vain Geminiä; kumppanimallit edellyttävät projektikohtaisia tunnistetietoja. | +| `vertex-partner` | `vp` | Vertex AI Partners | API-avain, yrityskäyttö | [linkki](https://cloud.google.com/vertex-ai) | Anna Service Account JSON- tai OAuth-tunnistetiedot. Palvelutiliin sidottu valtuutusavain tukee myös hakua, mutta kumppanimallien päättely edellyttää lisäksi avaimen Google Cloud -projektitunnusta. Tavalliset Express-avaimet tukevat vain Geminiä. | +| `void-ai` | `void-ai` | Void AI | API-avain, aggregaattori | [linkki](https://voidai.app) | Julkisessa malliluettelossa joidenkin mallien kohdalla ilmoitetaan ilmaisen paketin vaatimus, mutta käyttöoikeus on ehdollinen eikä numeerista kiintiötä ole vahvistettu. | +| `volcengine` | `volcengine` | Volcengine | API-avain | [linkki](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API-avain | [linkki](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Yhdistä Volcano Engine -tilisi tai käytä Ark Agent Plan -tilauksen API-avainta. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API-avain | [linkki](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Yhdistä Volcano Engine -tilisi tai käytä Ark Coding Plan -tilauksen API-avainta. | +| `voyage-ai` | `voyage` | Voyage AI | API-avain, upotus/uudelleenjärjestys | [linkki](https://www.voyageai.com) | Bearer-API-avain Voyage AI:n upotus- ja uudelleenjärjestysrajapinnoille. | +| `wafer` | `wafer` | Wafer AI | API-avain | [linkki](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API-avain | [linkki](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API-avain, yrityskäyttö | [linkki](https://www.ibm.com/products/watsonx-ai) | Käytä watsonx-bearer-tunnustasi. Perus-URL voi olla https://.ml.cloud.ibm.com/ml/gateway/v1/ tai itse hallinnoitu /ml/gateway/v1-päätepiste. | +| `writer` | `writer` | Writer | API-avain | [linkki](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API-avain | [linkki](https://x5lab.dev) | Käytä X5Lab API -avaintasi (x5-...) muodossa Authorization: Bearer . Täysin OpenAI-yhteensopiva. API:n perus-URL: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API-avain | [linkki](https://x.ai) | Käytä virallista xAI API -avainta tai kirjaudu sisään xAI OAuthilla. Grok Build JWT -istunnot säilyvät erillisenä palveluntarjoajana. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API-avain | [linkki](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API-avain | [linkki](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API-avain, aggregaattori | [linkki](https://xkiro.com) | Luo ilmainen tili osoitteessa xkiro.com ja liitä avain tähän (Bearer; myös x-api-key hyväksytään). | +| `yi` | `yi` | Yi (01.AI) | API-avain | [linkki](https://01.ai) | Hanki API-avain osoitteesta platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API-avain, aggregaattori | [linkki](https://yolo-auto.com) | Ilmaisen API-käytön pyyntömääriä on rajoitettu, ja se on tarkoitettu testaukseen; numeerista päiväkohtaista kiintiötä ei ole julkaistu eikä ilmaisen käytön luvata jatkuvan pysyvästi. | +| `zai` | `zai` | Z.AI | API-avain | [linkki](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API-avain | [linkki](https://zenmux.ai) | Käytä ZenMux API -avaintasi muodossa Authorization: Bearer . ZenMux on täysin OpenAI-yhteensopiva. Perus-URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API-avain, aggregaattori | [linkki](https://www.zerolimitai.com) | Tilapäistä ilmaista kokeilujaksoa mainostetaan, mutta viralliset sivut antavat ristiriitaisia tietoja sen kestosta, joka on joko 3 tai 7 päivää; väitettä 100 kutsusta päivässä ei pidetä pysyvänä etuna. | +| `zylo-api` | `zylo` | Zylo API | API-avain, aggregaattori | [linkki](https://zyloai.net) | Basic-paketti: 10 RPM, 7 200 pyyntöä päivässä ja 200 000 tokenia päivässä; rajoitettu Basic-tekstimalleihin. | ## Paikalliset palveluntarjoajat (14) diff --git a/docs/i18n/fi/docs/routing/REASONING_REPLAY.md b/docs/i18n/fi/docs/routing/REASONING_REPLAY.md index 9fea77058c6e..419ad2678d48 100644 --- a/docs/i18n/fi/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/fi/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ Tavalliset asiakkaat (Cursor, Cline, Roo Code, OpenAI SDK) kuitenkin poistavat ` ## Arkkitehtuuri ``` -Vuoro N (avustaja generoi): - → vastaus sisältää reasoning_content-sisällön ja tool_calls-kutsut +Kierros N (avustaja generoi): + → vastaus sisältää reasoning_content- ja tool_calls-kentät → jos requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() kirjoittaa (muistiin + tietokantaan), avaimena jokainen tool_call.id - → välitä vastaus asiakkaalle (joka saattaa säilyttää päättelyn tai jättää sen säilyttämättä) + → välitä vastaus asiakkaalle (joka voi säilyttää päättelyn tai olla säilyttämättä sitä) -Vuoro N+1 (asiakas lähettää jatkopyynnön): +Kierros N+1 (asiakas lähettää jatkopyynnön): → muunnin havaitsee: requiresReasoningReplay(provider, model) === true - → jokaiselle avustajan viestille, jossa on tool_calls mutta ei reasoning_content-sisältöä: + → jokaiselle avustajaviestille, jolla on tool_calls mutta ei reasoning_content-kenttää: lookupReasoning(toolCalls[0].id) → muisti → tietokanta - osuma → msg.reasoning_content = cached; recordReplay() - ei osumaa → msg.reasoning_content = "" (vanha varamenettely aiemmille DeepSeek-versioille) - → ylävirta näkee johdonmukaisen historian → ei 400-virhettä + osuma → msg.reasoning_content = cached; recordReplay() + huti → msg.reasoning_content = "" (yhteensopivuusvararatkaisu vanhemmalle DeepSeekille) + → ylävirta saa johdonmukaisen historian → ei 400-virhettä ``` -Tallennus tapahtuu tiedostossa `open-sse/handlers/chatCore.ts` (kahdessa kohdassa, joissa kutsutaan `cacheReasoningFromAssistantMessage`-funktiota). Toisto tapahtuu tiedostossa `open-sse/translator/index.ts` skeeman tyyppimuunnoksen jälkeen mutta ennen välitystä. +Tallennus tapahtuu tiedostossa `open-sse/handlers/chatCore.ts` (kahdessa kohdassa, joissa kutsutaan `cacheReasoningFromAssistantMessage`-funktiota). Toisto tapahtuu tiedostossa `open-sse/translator/index.ts` skeeman pakotetun muunnoksen jälkeen mutta ennen välitystä. + +Tavallisten (ilman työkalukutsua olevien) avustajakierrosten avaimet muodostetaan eri tavalla: `buildAssistantMessageCacheKey()` muodostaa tiivisteen istunnon laajuudesta sekä normalisoidusta OpenAI-muotoisesta keskusteluhistoriasta kyseiseen kierrokseen asti, koska DeepSeek vaatii _jokaisen_ aiemman kierroksen päättelyn, kun `tools` on mukana. Responses-API-kohteissa (esimerkiksi `opencode-go/deepseek-v4-flash`, joka reititetään polkuun `/responses`) ylävirran pyyntörunko sisältää `input`-kentän eikä `messages`-kenttää, joten `translateRequest()` (`open-sse/translator/index.ts`) ilmoittaa takaisinsoittovaihtoehdon kautta pivot-keskusteluhistorian, josta se muodosti tiivisteen, ja tallennuskohdat muodostavat tiivisteen samasta keskusteluhistoriasta. Responses-toistovaihe suoritetaan OpenAI-pivotille kaikissa lähdemuodoissa, joten myös Anthropic Messages -asiakkaiden (Claude → OpenAI → Responses) historia toistetaan. ## Tallennus — muistin ja SQLiten hybridi diff --git a/docs/i18n/fi/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/fi/docs/security/SOCKET_DEV_FINDINGS.md index 2a098d01ed02..90151bd1a08a 100644 --- a/docs/i18n/fi/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/fi/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- +> **Laajuushuomautus:** `socket.yml` määrittää Socket.dev-palvelun rekisteripuolella julkaisun jälkeen suoritettavan npm-artefaktin tarkistuksen (ohitettavat polut pakettiin kuulumattomalle sisällölle, kuten `tests/`, `docs/` ja koontiraportit). Se ei määritä CI-/PR-yhdistämisporttia — mikään `.github/workflows`-hakemiston työnkulku, `package.json`-komentosarja tai `Makefile`-kohde ei kutsu Socket.dev-palvelua. + Tämä asiakirja on ylläpitäjän laatima vakuutus kuudesta `AI-detected potential malware` -havainnosta, jotka tehtiin paketista `omniroute@3.8.5`, sekä versiossa `omniroute@3.8.6` toteutetuista lievennyksistä. Sen tarkoituksena on, että: -1. Tietoturvaputkien operaattoreilla on yksi viite, johon he voivat vedota - arvioidessaan havaintoja suhteessa varsinaiseen lähdekoodiin. +1. Tietoturvaputkien ylläpitäjillä on yksi viite, johon vedota, kun heidän on + arvioitava havaintoja suhteessa todelliseen lähdekoodiin. 2. Tulevat tekoälyskannerit voivat tunnistaa ylläpitäjän allekirjoittaman vakuutuksen siitä, että jokainen merkitty polku on tarkoituksellinen, erikseen käyttöön otettava ja dokumentoitu. -3. Meillä on kirjallinen dokumentaatio siitä, _miksi_ kukin kutsukohta on toteutettu juuri kyseisellä tavalla — - jotta tuleva refaktorointi ei vahingossa palauta sormenjälkeä, joka +3. Meillä on kirjallinen tieto siitä, _miksi_ kukin kutsukohta on toteutettu juuri kyseisellä tavalla — + jotta tuleva refaktorointi ei vahingossa palauta tunnusjälkeä, joka poistettiin tarkoituksella. -Jos ylläpidät skanneria, joka merkitsee jonkin alla olevista kutsukohdista uudelleen sen jälkeen, kun -version v3.8.6 lievennykset on julkaistu, avaa ongelmaraportti ja liitä siihen skannauksen jäljitys, -niin laajennamme tätä vakuutusta. +Jos ylläpidätte skanneria, joka merkitsee jonkin alla olevista kutsukohdista uudelleen sen jälkeen, kun +v3.8.6-version lievennykset on julkaistu, avatkaa ongelmaraportti ja liittäkää mukaan tarkistuksen jäljitystiedot, +niin täydennämme tätä vakuutusta. --- diff --git a/docs/i18n/fr/README.md b/docs/i18n/fr/README.md index 19474be86231..756b5912f43a 100644 --- a/docs/i18n/fr/README.md +++ b/docs/i18n/fr/README.md @@ -19,17 +19,17 @@
-## 💰 ~1,62 Md de jetons gratuits / mois +## 💰 ~1,62 Md de tokens gratuits / mois
-> Cumuler manuellement les offres gratuites est pénible — des dizaines de SDK, des dizaines de limites de débit, et aucun moyen de savoir de combien vous disposez réellement. OmniRoute répertorie **491 entrées d’offres gratuites réparties sur 35 clés de pools récurrents** et calcule le nombre de jetons annoncé à partir des **17 pools disposant d’un budget mensuel positif publié, auxquels s’ajoutent cinq plafonds Groq par modèle**, avec déduplication des pools partagés. Les quotas qui ne deviennent accessibles qu’après une vérification d’identité régionale (actuellement : ModelScope) sont affichés séparément, soit +~6 M derrière une vérification d’identité régionale, et ne sont jamais inclus dans le total annoncé. Le résultat reste visible dans le tableau de bord (`/dashboard/free-tiers`). +> Cumuler manuellement les offres gratuites est fastidieux — des dizaines de SDK, des dizaines de limites de débit, et aucun moyen de savoir de quelle capacité vous disposez réellement. OmniRoute répertorie **489 entrées d’offres gratuites réparties sur 35 clés de pools récurrents** et calcule le total de tokens affiché à partir des **17 pools disposant d’un budget mensuel positif publié, auxquels s’ajoutent cinq plafonds Groq par modèle**, avec déduplication des pools partagés. Les quotas qui ne deviennent accessibles qu’après une vérification d’identité régionale (actuellement : ModelScope) sont affichés séparément, soit +~6 M après vérification d’identité régionale, et ne sont jamais inclus dans le total principal. Le résultat reste visible dans le tableau de bord (`/dashboard/free-tiers`). -Carte du budget des offres gratuites d’OmniRoute : ~1,62 Md de jetons gratuits par mois de manière récurrente, jusqu’à ~2,22 Md le premier mois grâce aux crédits d’inscription, issus de 35 clés documentées de pools récurrents couvrant 491 entrées d’offres gratuites répertoriées derrière un seul endpoint. Calcul transparent avec déduplication des pools — chaque pool partagé n’est compté qu’une fois, notamment 17 pools récurrents disposant d’un budget mensuel positif publié, auxquels s’ajoutent cinq plafonds Groq par modèle ; 13 fournisseurs sont signalés comme étant à éviter dans le catalogue des risques liés aux conditions d’utilisation, afin que vous puissiez décider. La barre de budget comprend Mistral 1 Md, Nara 210 M, LLM7 150 M, xKiro 150 M, Groq 30 M (cinq plafonds par modèle) ainsi que des pools plus petits, auxquels s’ajoutent les crédits d’inscription du premier mois ; les fournisseurs gratuits en permanence sans plafond de jetons sont présentés séparément afin de ne jamais gonfler le total annoncé. Consommation et solde disponibles en direct sur /dashboard/free-tiers. +Carte du budget des offres gratuites d’OmniRoute : ~1,62 Md de tokens gratuits par mois en régime permanent, jusqu’à ~2,22 Md le premier mois grâce aux crédits d’inscription, provenant de 35 clés de pools récurrents documentées couvrant 489 entrées d’offres gratuites répertoriées derrière un point d’accès unique. Calcul transparent avec déduplication des pools — chaque pool partagé n’est compté qu’une seule fois, notamment 17 pools récurrents disposant d’un budget mensuel positif publié, auxquels s’ajoutent cinq plafonds Groq par modèle ; 13 fournisseurs sont marqués « avoid » dans le catalogue des risques liés aux conditions d’utilisation afin que vous puissiez décider. La barre de budget comprend Mistral 1 Md, Nara 210 M, LLM7 150 M, xKiro 150 M, Groq 30 M (cinq plafonds par modèle) et des pools plus petits, ainsi que les crédits d’inscription du premier mois et les fournisseurs gratuits en permanence sans plafond de tokens, présentés séparément afin qu’ils ne gonflent jamais le total principal. Consommation et solde disponibles en direct sur /dashboard/free-tiers. -> Résumé animé de la page `/dashboard/free-tiers` en direct. Méthodologie complète (déduplication des pools, niveaux de crédits, conditions des fournisseurs) : **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Résumé animé de la page active `/dashboard/free-tiers`. Méthodologie complète (déduplication des pools, niveaux de crédits, conditions des fournisseurs) : **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Ces chiffres sont réaudités toutes les deux semaines à partir du catalogue en direct et **peuvent évoluer dans les deux sens** — si un fournisseur met fin à une offre gratuite, le nombre baisse ; si une nouvelle offre apparaît, il augmente. Nous publions ce que le catalogue calcule réellement, jamais un scénario optimal arrondi à la hausse. +> Ces chiffres sont réaudités toutes les deux semaines par rapport au catalogue actif et **peuvent évoluer dans les deux sens** — lorsqu’un fournisseur met fin à une offre gratuite, le chiffre baisse ; lorsqu’une nouvelle offre apparaît, il augmente. Nous publions ce que le catalogue calcule réellement, jamais une estimation optimiste arrondie à la hausse.
@@ -48,18 +48,18 @@ ### 💬 Rejoignez la communauté -**👋 Suivez le mainteneur — découvrez en premier les nouveaux fournisseurs, les nouvelles versions et les astuces :** +**👋 Suivez le mainteneur — découvrez en avant-première les nouveaux fournisseurs, les versions et les conseils :** [![Suivre Diego sur LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Suivre @diegosouzapw sur GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![WhatsApp international](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp mondial](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) [![WhatsApp Brésil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Site web](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Questions, conseils sur les fournisseurs, feuille de route et assistance → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 International](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brésil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portail](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Questions, conseils sur les fournisseurs, feuille de route et assistance → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Mondial](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brésil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portail](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -590,9 +590,9 @@ Radar est facultatif et utilise uniquement des requêtes GET. Le client OmniRout
-## 🤖 CLI compatibles et agents de codage +## 🤖 CLI et agents de codage compatibles -> Une seule configuration — `http://localhost:20128/v1` — et **chaque** IDE ou CLI d’IA fonctionne avec des modèles gratuits et à faible coût. +> Une seule configuration — `http://localhost:20128/v1` — et **tous** les IDE ou CLI d’IA fonctionnent avec des modèles gratuits et à faible coût.
@@ -626,23 +626,23 @@ Radar est facultatif et utilise uniquement des requêtes GET. Le client OmniRout - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ fonctionne également avec · Kiro · Command Code · Antigravity · Windsurf · AMP · tout outil compatible avec OpenAI ++ fonctionne également avec · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · tout outil compatible avec OpenAI
-📖 Configuration par outil pour les 36 outils (26 outils CLI de code + 10 agents CLI) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Configuration propre à chacun des 36 outils (26 CLI de code + 10 agents CLI) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Extension OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Lancez n’importe quel outil CLI pris en charge via OmniRoute avec une seule commande** — aucun fichier de configuration n’est écrit, -les identifiants sont injectés pour chaque processus, et Qwen/Gemini disposent d’un répertoire personnel isolé temporaire : +**Lancez n’importe quel CLI pris en charge via OmniRoute avec une seule commande** — aucun fichier de configuration n’est créé, +les identifiants sont injectés pour chaque processus, et Qwen/Gemini disposent d’un répertoire personnel isolé et temporaire : ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,13 +653,13 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Ou sélectionnez interactivement le fournisseur et le modèle, puis écrivez la configuration propre à l’outil : +# Ou choisissez interactivement le fournisseur et le modèle, puis écrivez la configuration propre à l’outil : omniroute configure codex # également : claude opencode qwen aider goose gemini cline continue kilo ``` Chaque commande respecte le contexte distant actif (`omniroute connect `), `--dry-run` affiche un aperçu exact des variables d’environnement et des arguments sans rien exécuter, et `--api-key-env NAME` évite -que les secrets n’apparaissent dans l’historique de votre shell. → [Intégrations CLI](docs/guides/CLI-INTEGRATIONS.md) +que les secrets figurent dans l’historique de votre shell. → [Intégrations CLI](docs/guides/CLI-INTEGRATIONS.md)
@@ -669,11 +669,11 @@ que les secrets n’apparaissent dans l’historique de votre shell. → [Intég -> **357 fournisseurs enregistrés** dans les collections canoniques de chat, de médias, de recherche, d’exécution locale, d’agents cloud et de systèmes, dont **152 dotés de la métadonnée de découverte `hasFree: true`**. Le registre des modèles de chat couvre **229 fournisseurs / 2 554 paires fournisseur-modèle distinctes / 1 283 identifiants de modèle bruts** ; le catalogue distinct des quotas gratuits comporte **491 entrées par modèle**, **35 pools récurrents** et **54 fournisseurs gratuits à vie, récurrents ou sans clé**. Ces dénominateurs sont différents par conception ; les définitions et les calculs dédupliqués par pool figurent dans la [Référence des fournisseurs](docs/reference/PROVIDER_REFERENCE.md) et les [Offres gratuites](docs/reference/FREE_TIERS.md). +> **357 fournisseurs enregistrés** répartis entre les collections canoniques de chat, de médias, de recherche, d’exécution locale, d’agents cloud et de systèmes, dont **152 disposent de la métadonnée de découverte `hasFree: true`**. Le registre des modèles de chat couvre **229 fournisseurs / 2 554 paires fournisseur-modèle distinctes / 1 283 identifiants de modèle bruts** ; le catalogue distinct des budgets gratuits contient **491 entrées par modèle**, **35 pools récurrents** et **54 fournisseurs gratuits à vie, récurrents ou sans clé**. Ces dénominateurs sont différents par conception ; les définitions et les calculs dédupliqués par pool figurent dans la [Référence des fournisseurs](docs/reference/PROVIDER_REFERENCE.md) et les [Offres gratuites](docs/reference/FREE_TIERS.md).
-### 🏢 Tous les grands laboratoires — via un seul point de terminaison +### 🏢 Tous les grands laboratoires — via un point de terminaison unique @@ -702,16 +702,16 @@ que les secrets n’apparaissent dans l’historique de votre shell. → [Intég
-…et plus de 330 autres — chaque icône est chargée en direct depuis le catalogue des fournisseurs du tableau de bord. 📖 [Référence des fournisseurs](docs/reference/PROVIDER_REFERENCE.md) +…et plus de 330 autres — chaque icône est chargée en direct depuis le catalogue de fournisseurs du tableau de bord. 📖 [Référence des fournisseurs](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Gratuit à vie — 0 $, sans carte +### 🆓 Gratuit à vie — 0 $, sans carte bancaire - + @@ -721,8 +721,8 @@ que les secrets n’apparaissent dans l’historique de votre shell. → [Intég - - + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Aucune limite de jetons
Kilo Code
Kilo Code
Routage automatique, Tencent Hy3
Gratuit pour toujours
Kilo Code
Kilo Code
Routeur automatique, Tencent Hy3
Gratuit pour toujours
Requesty
Requesty
GPT-OSS 120B, Nemotron
Gratuit pour toujours
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Offre gratuite
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Gratuit pour toujours
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
GRATUIT et illimité
Pollinations
Pollinations
GPT, Llama, Claude
Aucune clé requise
Cloudflare AI
Cloudflare AI
Plus de 50 modèles
10 000 neurones/jour
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
Environ 40 RPM gratuitement
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1 million de jetons/jour
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM gratuitement
Openference
Openference
Qwen3.8 27B, Llama 3.2
Offre gratuite
OpenRouter
OpenRouter
Modèles :free
+10 $ → RPM plus élevé
@@ -1256,28 +1256,28 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922
-## 🛠️ Stack technologique +## 🛠️ Pile technologique
- + - + - - - - + + + + - +
CoucheTechnologie
Environnement d’exécutionNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
LangageTypeScript 6.0 — 100 % TypeScript dans src/ et open-sse/ (aucun any dans le cœur depuis la v2.0)
LangageTypeScript 6.0 — 100 % TypeScript dans src/ et open-sse/ (aucun any dans le cœur depuis v2.0)
FrameworkNext.js 16 + React 19 + Tailwind CSS 4
Base de donnéesbetter-sqlite3 (SQLite, journalisation WAL) + LowDB (ancien format JSON) — 122 modules métier, 176 migrations
Base de donnéesbetter-sqlite3 (SQLite, journalisation WAL) + LowDB (ancien format JSON) — 122 modules métier, 178 migrations
MémoireRecherche plein texte SQLite FTS5 + plongements vectoriels quantifiés en int8, décroissance typée
SchémasZod 4 — validation des entrées/sorties des outils MCP + contrats d’API
ProtocolesMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
Diffusion en continuServer-Sent Events (SSE) + passerelle WebSocket (/v1/ws)
CompressionPipeline à 12 moteurs — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Authentification & sécuritéOAuth 2.0 (PKCE) + JWT + clés API + authentification MCP à portée limitée · AES-256-GCM pour les données au repos · DOMPurify
Furtivitéwreq-js — usurpation d’empreintes TLS JA3 / JA4, proxy à 3 niveaux
RésilienceDisjoncteur, temporisation exponentielle, protection contre les afflux simultanés, auto-réparation par combinaison automatique
Journalisationpino — journaux JSON structurés avec le contexte des requêtes
Authentification et sécuritéOAuth 2.0 (PKCE) + JWT + clés d’API + authentification MCP à portée limitée · AES-256-GCM pour les données au repos · DOMPurify
Furtivitéwreq-js — imitation d’empreintes TLS JA3 / JA4, proxy à 3 niveaux
RésilienceDisjoncteur, temporisation exponentielle, protection contre les accès simultanés massifs, auto-réparation auto-combo
Journalisationpino — journaux JSON structurés avec contexte de requête
TestsExécuteur de tests Node.js + Vitest — plus de 39 000 déclarations de tests statiques réparties dans plus de 5 100 fichiers de test suivis (unitaires, intégration, E2E, sécurité, écosystème)
PlateformesOrdinateur de bureau (Electron) · Android (Termux) · PWA (tout navigateur)
CI/CDGitHub Actions — publication automatique sur npm + Docker Hub lors des versions
CI/CDGitHub Actions — publication automatique sur npm + Docker Hub lors d’une version
LiensSite web · npm · Docker Hub
@@ -1294,10 +1294,10 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922 - - - - + + + +
DocumentDescription
Guide de l’utilisateurFournisseurs, combinaisons, intégration CLI, déploiement
Guide de configurationMéthodes d’installation complètes, configurations des outils CLI, configuration des protocoles, ajustement des délais d’expiration
Guide des outils CLIConfiguration par outil pour Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo et Copilot
Mode distantPiloter une instance OmniRoute distante (VPS) depuis la CLI de votre ordinateur portable grâce à des jetons d’accès à portée limitée
Configuration de Claude CodeConnecter Claude Code à OmniRoute (local/distant) avec launch et des profils par modèle
Guide de configurationMéthodes d’installation complètes, configurations des outils CLI, configuration des protocoles, réglage des délais d’expiration
Guide des outils CLIConfiguration par outil pour Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Mode distantPilotez un OmniRoute distant (VPS) depuis le CLI de votre ordinateur portable grâce à des jetons d’accès à portée limitée
Configuration de Claude CodeConnectez Claude Code à OmniRoute (local/distant) avec launch et des profils propres à chaque modèle
Démarrage rapideInstallation en 3 étapes → connexion → configuration
@@ -1305,14 +1305,14 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922 - - + + - - - + + + - +
DocumentDescription
Guide DockerExécution avec Docker, profils Compose, HTTPS avec Caddy, tunnels, balises d’images
Guide PodmanIntégration de Quadlet avec systemd, podman-compose, SELinux
Guide DockerExécution de Docker, profils Compose, HTTPS avec Caddy, tunnels, balises d’image
Guide PodmanIntégration à systemd avec Quadlet, podman-compose, SELinux
Déploiement sur une VMGuide complet : configuration d’une VM, de nginx et de Cloudflare
Déploiement sur Fly.ioDéployer sur Fly.io avec un stockage persistant
Guide TermuxExécuter OmniRoute sur Android via Termux
Guide PWAInstallation de l’application web progressive, mise en cache, architecture
Déploiement sur Fly.ioDéployez sur Fly.io avec un stockage persistant
Guide TermuxExécutez OmniRoute sur Android via Termux
Guide PWAInstallation, mise en cache et architecture de l’application web progressive
Guide de désinstallationSuppression propre pour toutes les méthodes d’installation
Configuration de l’environnementVariables et références complètes du fichier .env
Configuration de l’environnementListe complète des variables .env et références associées
### 🧠 Fonctionnalités et architecture @@ -1320,17 +1320,17 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922 - + - - - - - - + + + + + + - +
DocumentDescription
ArchitectureArchitecture du système, flux de données et fonctionnement interne
Guide de compressionPipeline à 7 options : désactivé / léger / standard / agressif / ultra / RTK / empilé
Guide de compressionPipeline à 7 options : désactivée / légère / standard / agressive / ultra / RTK / empilée
Compression RTKCompression de la sortie des commandes, filtres, confiance, vérification, récupération de la sortie brute
Moteurs de compressionCaveman, RTK, pipelines empilés, interfaces du tableau de bord, de l’API et de MCP
Format des règles de compressionSchémas JSON des jeux de règles pour les filtres Caveman et RTK
Packs linguistiques de compressionDétection de la langue et création de jeux de règles Caveman
Guide de résilienceDisjoncteurs, périodes de récupération, file d’attente, prévention des afflux massifs simultanés, usurpation TLS
Moteur Auto-ComboNotation à 16 facteurs, packs de modes, autoréparation
Guide des proxysSystème de proxys à 3 niveaux, place de marché 1proxy, opérations CRUD sur le registre
Offres gratuitesRépertoire consolidé : 35 pools récurrents documentés / 491 entrées d’offres gratuites répertoriées
Format des règles de compressionSchémas JSON des paquets de règles pour les filtres Caveman et RTK
Paquets linguistiques de compressionDétection de la langue et création de paquets de règles Caveman
Guide de résilienceDisjoncteurs, périodes de temporisation, file d’attente, prévention des afflux simultanés, usurpation TLS
Moteur Auto-ComboÉvaluation selon 16 facteurs, paquets de modes, autoréparation
Guide des proxysSystème de proxys à 3 niveaux, place de marché 1proxy, opérations CRUD du registre
Offres gratuitesRépertoire consolidé : 35 pools récurrents documentés / 489 entrées d’offres gratuites cataloguées
Galerie des fonctionnalitésVisite visuelle du tableau de bord avec captures d’écran
Documentation du code sourcePrésentation du code source adaptée aux débutants
Documentation de la base de codePrésentation de la base de code adaptée aux débutants
### 🤖 Protocoles et API @@ -1350,7 +1350,7 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922 - + @@ -1364,9 +1364,9 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922 # ⭐ Principaux contributeurs -> OmniRoute est façonné par une communauté open source passionnée. Ces personnes ont apporté des contributions exceptionnelles qui ont un impact direct sur la qualité, la stabilité et la portée du projet. **Merci.** +> OmniRoute est façonné par une communauté open source passionnée. Ces personnes ont apporté des contributions exceptionnelles qui ont une incidence directe sur la qualité, la stabilité et la portée du projet. **Merci.** -### Contributeurs externes selon le nombre de pull requests fusionnées +### Contributeurs externes par demandes de tirage fusionnées
DocumentDescription
ContributionConfiguration et directives de développement
Modèle de branches et de publicationBranches ciblées par les PR (release/*), signification de main et des tags
Modèle de branches et de publicationBranches ciblées par les PR (release/*), signification de main et des balises
Journal des modificationsHistorique complet des publications pour chaque version
Politique de sécuritéSignalement des vulnérabilités et pratiques de sécurité
Guide d’i18nPrise en charge de 42 langues, processus de traduction, RTL
@@ -1393,7 +1393,7 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922
RangContributeurPR fusionnées~Lignes modifiées
20Prudhvivuda246,312
-Données figées à la pointe active de release/v3.8.50, commit dafb4ae808, avec les fusions effectuées jusqu’au 2026-08-24 05:26:03 UTC. Le recensement paginé de GitHub GraphQL contient 5 911 PR fusionnées : 2 707 par le propriétaire du dépôt, 179 par Dependabot et 3 025 PR externes provenant de 535 contributeurs distincts. Les « lignes modifiées » correspondent aux ajouts et suppressions GitHub et comprennent les fichiers générés, les fichiers de verrouillage, les catalogues, les traductions et la documentation ; elles représentent le volume de modifications, et non les lignes de code rédigées. Les ex æquo à la limite du classement sont conservés. +Statistiques figées à la pointe active de release/v3.8.50, au commit dafb4ae808, avec les fusions effectuées jusqu’au 2026-08-24 à 05:26:03 UTC. Le recensement paginé via l’API GraphQL de GitHub contient 5 911 PR fusionnées : 2 707 par le propriétaire du dépôt, 179 par Dependabot et 3 025 PR externes provenant de 535 contributeurs distincts. Les « lignes modifiées » correspondent aux ajouts et suppressions comptabilisés par GitHub et incluent les fichiers générés, les fichiers de verrouillage, les catalogues, les traductions et la documentation ; elles représentent le volume de modifications, et non les lignes de code rédigées. Les ex æquo au seuil de classement sont conservés. ### Commits attribués par GitHub @@ -1481,9 +1481,9 @@ Métriques canoniques au 2026-08-24 : **1.029 vidéos uniques** · **11.132.922 -Nouvelle vérification effectuée le 2026-08-24 à 06:14:31 UTC : commits attribués par GitHub et signalés par l’API Contributors du dépôt pour la branche par défaut release/v3.8.50. L’API a renvoyé 525 identités (415 utilisateurs, 2 bots et 108 anonymes) ; ce tableau exclut le responsable de la maintenance, les bots et les identités anonymes, tout en conservant les ex æquo. Il est distinct à la fois du classement des PR fusionnées ci-dessus et du recensement de 639 personnes fondé sur les métadonnées Git ci-dessous. +Revérifié le 2026-08-24 à 06:14:31 UTC : commits attribués par GitHub et signalés par l’API Contributors du dépôt pour la branche par défaut release/v3.8.50. L’API a renvoyé 525 identités (415 utilisateurs, 2 bots et 108 anonymes) ; ce tableau exclut le responsable de la maintenance, les bots et les identités anonymes, et conserve les ex æquo. Il est distinct à la fois du classement des PR fusionnées ci-dessus et du recensement de 639 personnes fondé sur les métadonnées Git ci-dessous. -> 🙏 Les fonctionnalités, les corrections de bogues et les améliorations d’infrastructure apportées par ces contributeurs sont un **élément essentiel** de ce qui rend OmniRoute fiable et riche en fonctionnalités. Chaque pull request, chaque cas de test et chaque fichier de traduction i18n compte. L’open source est construit par des personnes comme elles. +> 🙏 Les fonctionnalités, les corrections de bogues et les améliorations de l’infrastructure apportées par ces contributeurs constituent une **composante essentielle** de ce qui rend OmniRoute fiable et riche en fonctionnalités. Chaque pull request, chaque cas de test et chaque fichier de traduction i18n compte. L’open source est construit par des personnes comme elles.
diff --git a/docs/i18n/fr/SECURITY.md b/docs/i18n/fr/SECURITY.md index ce721ad695bf..ca923236499d 100644 --- a/docs/i18n/fr/SECURITY.md +++ b/docs/i18n/fr/SECURITY.md @@ -222,10 +222,12 @@ Ces règles sont appliquées par les outils et les réviseurs : ## Résultats des scanners de chaîne d’approvisionnement (Socket.dev / Snyk / similaires) +> **Note sur le périmètre :** `socket.yml`, à la racine du dépôt, définit uniquement les `projectIgnorePaths` pour l’analyse post-publication, côté registre, par Socket.dev de l’artefact npm publié — il ne constitue pas un contrôle bloquant imposé pour la CI ou la fusion des PR. Aucun workflow dans `.github/workflows`, aucun script de `package.json` et aucune cible de `Makefile` n’invoquent Socket.dev. + L’artefact npm `omniroute` publié inclut le build Next.js `output: "standalone"`, ce qui signifie que chaque gestionnaire de route — y compris les fonctionnalités privilégiées documentées (MITM, importation Zed, Cloud Sync, -superviseur de services intégré) — se retrouve dans des fragments minifiés +superviseur de service intégré) — se retrouve dans des fragments minifiés `.next/server/*.js`. Les scanners heuristiques de chaîne d’approvisionnement comparent fréquemment ces fragments à des signatures de logiciels malveillants. @@ -233,25 +235,25 @@ La configuration du scanner que nous utilisons se trouve dans [`socket.yml`](socket.yml), à la racine du dépôt (format v2 de l’application GitHub Socket.dev — voir ). Elle exclut explicitement les répertoires non distribués (`tests/`, `_tasks/`, -`_references/`, `_ideia/`, `_mono_repo/`, `docs/`, etc.) afin que le scanner -ne signale que les chemins de code qui parviennent réellement aux utilisateurs +`_references/`, `_ideia/`, `_mono_repo/`, `docs/`, etc.), afin que le scanner +ne signale que les chemins de code qui atteignent réellement les utilisateurs de la version publiée — l’analyse elle-même est déclenchée par l’application GitHub Socket qui lit ce fichier, et non par un workflow de ce dépôt. -Pour chaque catégorie de résultat, nous conservons une attestation du -mainteneur propre à chaque résultat : +Pour chaque catégorie de résultat, nous conservons une attestation des +mainteneurs propre à chaque résultat : - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - correspondance par résultat : fichier source ↔ fragment signalé ↔ comportement - ↔ mesure d’atténuation appliquée dans la v3.8.6. -- Les blocs `SECURITY-AUDITOR-NOTE:` dans le code source, placés à chaque - fonction signalée, renvoient vers ce même document. + correspondance par résultat : fichier source ↔ fragment signalé ↔ + comportement ↔ mesure d’atténuation appliquée dans v3.8.6. +- Les blocs `SECURITY-AUDITOR-NOTE:` dans le code source, placés au niveau de + chaque fonction signalée, renvoient vers le même document. Pour les utilisateurs dont le pipeline ne permet pas d’assouplir l’alerte : -compilez avec `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Cela remplace les -quatre modules sensibles par des stubs qui renvoient une réponse HTTP 503 -`feature-disabled` lors de l’exécution, de sorte que les chemins de code -privilégiés sont physiquement absents du bundle. Consultez +construisez avec `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Cela remplace +les quatre modules sensibles par des stubs qui renvoient HTTP 503 +`feature-disabled` à l’exécution, de sorte que les chemins de code privilégiés +sont physiquement absents du bundle. Consultez [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) pour la procédure de publication. diff --git a/docs/i18n/fr/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/fr/docs/architecture/CODEBASE_DOCUMENTATION.md index 63c62995a779..ae04ed91dfab 100644 --- a/docs/i18n/fr/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/fr/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,18 +436,18 @@ Divisé en sous-répertoires spécialisés : ## 4. `open-sse/` — Espace de travail du moteur de streaming -Espace de travail npm distinct publié sous le nom `@omniroute/open-sse`. Il gère le traitement +Espace de travail npm distinct publié sous le nom `@omniroute/open-sse`. Regroupe le traitement des requêtes, les exécuteurs, les traducteurs, les services, le transformateur et le serveur MCP. ``` open-sse/ -├── index.ts Exports publics +├── index.ts Exportations publiques ├── package.json Manifeste de l’espace de travail ├── tsconfig.json ├── types.d.ts ├── config/ Registres de fournisseurs, profils d’en-têtes, identité, … ├── handlers/ Gestionnaires de requêtes (chat, embeddings, audio, image, …) -├── executors/ 108 exécuteurs HTTP propres aux fournisseurs +├── executors/ 108 exécuteurs HTTP spécifiques aux fournisseurs ├── translator/ Conversion de formats (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Transformateur de flux Responses API ↔ Chat Completions ├── services/ Plus de 80 modules de service (combinaisons, repli, quotas, identité, …) @@ -457,7 +457,7 @@ open-sse/ ### 4.1 `open-sse/handlers/` -| Gestionnaire | Rôle | +| Gestionnaire | Objectif | | ----------------------- | ------------------------------------------------------------------------------------------------------------------ | | `chatCore.ts` | Pipeline de chat principal (cache, limitation du débit, routage des combinaisons, répartition vers les exécuteurs) | | `responsesHandler.ts` | Point d’entrée de l’API Responses d’OpenAI | @@ -473,7 +473,7 @@ open-sse/ | `sseParser.ts` | Analyseur d’événements SSE | | `usageExtractor.ts` | Extraction du nombre de jetons depuis les flux en amont | | `responseSanitizer.ts` | Suppression des données parasites propres aux fournisseurs | -| `responseTranslator.ts` | Liaison entre la réponse du fournisseur et la couche de traduction | +| `responseTranslator.ts` | Couche de liaison entre la réponse du fournisseur et la couche de traduction | ### 4.2 `open-sse/executors/` @@ -485,13 +485,13 @@ open-sse/ `pollinations`, `qoder`, `vertex`, `devin-desktop`, ainsi que `claudeIdentity.ts` (utilitaire d’identité partagé) et `index.ts` (registre). -> Remarque : les fournisseurs qui ne figurent pas ici sont pris en charge par `default.ts` au moyen de l’exécuteur générique +> Remarque : les fournisseurs qui ne figurent pas dans cette liste sont pris en charge par `default.ts` au moyen de l’exécuteur générique > compatible avec OpenAI. Le catalogue complet des fournisseurs (355 fournisseurs) se trouve dans > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Traduction en étoile (OpenAI constitue le centre). +Traduction en étoile (OpenAI constitue le concentrateur). - **9 traducteurs de requêtes** (`translator/request/`) : `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -505,8 +505,8 @@ Traduction en étoile (OpenAI constitue le centre). `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, ainsi que les tests des utilitaires. -- **Utilitaires pour les images** (`translator/image/sizeMapper.ts`). -- À la racine : `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. +- **Utilitaires d’image** (`translator/image/sizeMapper.ts`). +- Niveau supérieur : `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` @@ -515,31 +515,31 @@ Traduction en étoile (OpenAI constitue le centre). ### 4.5 `open-sse/services/` -Points notables (liste complète dans `open-sse/services/`) : - -| Préoccupation | Fichiers | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Routage Combo | `combo.ts` (19 stratégies), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Moteur Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Résilience | `accountFallback.ts` (délai de récupération + verrouillage), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Quotas | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Mise en cache | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Intelligence de routage | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Gestion des modèles | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Compression | `compression/` — câblage complet du moteur de compression | -| Jetons + session | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Niveau / manifeste | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / réseau | `ipFilter.ts`, `webSearchFallback.ts` | -| Lots | `batchProcessor.ts` | -| Utilisation | `usage.ts` | +Principaux éléments (liste complète dans `open-sse/services/`) : + +| Préoccupation | Fichiers | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Routage Combo | `combo.ts` (19 stratégies), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Moteur Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Résilience | `accountFallback.ts` (délai de récupération + verrouillage), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Quotas | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Mise en cache | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Routage intelligent | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Gestion des modèles | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Compression | `compression/` — câblage complet du moteur de compression | +| Jetons + sessions | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Niveau / manifeste | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / réseau | `ipFilter.ts`, `webSearchFallback.ts` | +| Lots | `batchProcessor.ts` | +| Utilisation | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 outils uniques** câblés dans `server.ts` (45 canoniques dans `schemas/tools.ts` + - modules de mémoire, de compétences, de compétences GitHub, de pool, de ludification, de plugin, Notion, Obsidian, - de corpus local et de compression — union dénombrée par `countUniqueMcpTools`). + les modules de mémoire, de compétences, de compétences GitHub, de pool, de ludification, de plug-in, Notion, Obsidian, + de corpus local et de compression — union comptabilisée par `countUniqueMcpTools`). - **3 transports** : stdio, HTTP Streamable, SSE. -- **33 portées** appliquées à l’exécution — liste de base dans `src/shared/constants/mcpScopes.ts`, l’ensemble complet étant l’union des portées déclarées par chaque module d’outils. +- **33 portées** appliquées à l’exécution — liste de base dans `src/shared/constants/mcpScopes.ts`, l’ensemble complet étant l’union des portées déclarées par chaque module d’outil. - Table d’audit : `mcp_tool_audit` (alimentée par `audit.ts`). - Fichiers : `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, @@ -563,7 +563,7 @@ cloud (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, ### 4.8 `open-sse/utils/` -Primitives de streaming et utilitaires pour les fournisseurs : `stream.ts`, `streamHandler.ts`, +Primitives de streaming et utilitaires de fournisseurs : `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/fr/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/fr/docs/architecture/RESILIENCE_GUIDE.md index 83ed13f355da..2c7dd33e9661 100644 --- a/docs/i18n/fr/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/fr/docs/architecture/RESILIENCE_GUIDE.md @@ -67,80 +67,140 @@ le délai exponentiel `minRetryCooldownMs → maxRetryCooldownMs`. Surcharges : `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Protection contre les régressions : `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Période de récupération de connexion +## 2. Période de refroidissement des connexions -**Portée :** connexion/compte/clé d’un seul fournisseur. +**Portée :** une seule connexion/un seul compte/une seule clé de fournisseur. -**Objectif :** ignorer une clé défaillante tout en permettant aux autres connexions du même fournisseur de continuer à traiter les requêtes. +**Objectif :** ignorer une clé défaillante tandis que les autres connexions du même fournisseur continuent de traiter les requêtes. **Implémentation :** - Marquage comme indisponible : `src/sse/services/auth.ts::markAccountUnavailable()` - Sélection : `getProviderCredentials*` dans le même fichier -- Calcul de la période de récupération : `open-sse/services/accountFallback.ts::checkFallbackError()` +- Calcul du refroidissement : `open-sse/services/accountFallback.ts::checkFallbackError()` - Paramètres : `src/lib/resilience/settings.ts` **Champs par connexion :** -- `rateLimitedUntil` — horodatage jusqu’à l’expiration de la période de récupération +- `rateLimitedUntil` — horodatage jusqu’à l’expiration du refroidissement - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — compteur de temporisation exponentielle -**Périodes de récupération par défaut :** +**Refroidissements par défaut :** - Base OAuth : 5 s -- Base pour les clés API : 3 s -- Erreur 429 pour une clé API : privilégie les en-têtes `Retry-After`/de réinitialisation en amont ou un texte de réinitialisation analysable +- Base pour clé API : 3 s +- 429 pour clé API : privilégie les en-têtes `Retry-After`/de réinitialisation en amont/le texte de réinitialisation analysable - Temporisation : `baseCooldownMs * 2 ** failureIndex` -**Protection contre les effets de troupeau :** empêche les échecs simultanés de prolonger excessivement la période de récupération ou d’incrémenter deux fois `backoffLevel`. +**Protection contre les afflux simultanés :** empêche des échecs simultanés de prolonger excessivement le refroidissement ou de doubler l’incrémentation de `backoffLevel`. -**États terminaux (PAS des périodes de récupération) :** +**États terminaux (PAS des refroidissements) :** -- `banned` — défini par la détection de mots-clés de bannissement / de bannissement de compte (voir [BAN_DETECTION](../security/BAN_DETECTION.md)), ainsi que par trois refus consécutifs en amont par requête (`request_rejected`, par ex. l’erreur OAuth Anthropic 403 « Request not allowed » — `open-sse/services/requestRejectedStreak.ts`) ; un seul refus place uniquement la connexion en période de récupération -- `expired` (passe à l’état terminal après un nombre limité de nouvelles tentatives — `EXPIRED_RETRY_MAX = 3` avec temporisation exponentielle — afin que les erreurs OAuth transitoires puissent se résoudre automatiquement avant la désactivation définitive du compte) +- `banned` — défini par la détection de mots-clés d’interdiction/de bannissement de compte (voir [BAN_DETECTION](../security/BAN_DETECTION.md)), ainsi que par trois refus consécutifs en amont par requête (`request_rejected`, par exemple Anthropic OAuth 403 « Request not allowed » — `open-sse/services/requestRejectedStreak.ts`) ; un refus unique ne fait que mettre la connexion en refroidissement +- `expired` (passe à l’état terminal après un nombre limité de nouvelles tentatives — `EXPIRED_RETRY_MAX = 3` avec temporisation exponentielle — afin que les erreurs OAuth transitoires puissent se résoudre d’elles-mêmes avant la désactivation définitive du compte) - `credits_exhausted` -Ces états persistent jusqu’à ce que les identifiants changent ou qu’un opérateur les réinitialise. Ne remplacez pas les états terminaux par un état de récupération transitoire. +Ces états persistent jusqu’à ce que les identifiants changent ou qu’un opérateur les réinitialise. Ne remplacez pas les états terminaux par un état de refroidissement transitoire. -**Récupération différée :** lorsque `rateLimitedUntil` est dépassé, la connexion redevient éligible. Après une utilisation réussie, `clearAccountError()` efface tous les champs d’erreur. +**Récupération différée :** lorsque `rateLimitedUntil` est dépassé, la connexion redevient admissible. Après une utilisation réussie, `clearAccountError()` efface tous les champs d’erreur. + +### Plafond d’utilisation Claude OAuth : voie de priorité inférieure + réinitialisation de la limite de session + +**Portée :** une connexion d’abonnement Claude (OAuth). Les deux fonctionnalités sont **activables par +connexion** (Modifier la connexion → section Claude → `lowPriorityMode` / `autoLimitReset` dans +`providerSpecificData`, toutes deux désactivées par défaut) et reproduisent les commandes `/low-priority` et +`/limit-reset` de Claude Code (contrat filaire capturé depuis Claude Code 2.1.263). + +**Implémentation :** + +- Machine à états + classification des réponses : `open-sse/services/claudeLowPriority.ts` +- Client de statut/réclamation de réinitialisation : `open-sse/services/claudeLimitReset.ts` +- Point d’extension de l’exécuteur (injection d’en-tête + nouvelle tentative sur le même compte) : `open-sse/executors/base.ts::execute()` +- Persistance de l’activation : `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Déclencheur :** le plafond d’utilisation de 5 heures — une réponse `429` dont les en-têtes contiennent +`anthropic-ratelimit-unified-status: rejected` et, lorsque le compte est admissible, +`anthropic-ratelimit-unified-slow-offer: treatment`. Rien n’est envoyé avant cette première réponse +429 liée au plafond ; une rafale de réponses 429 sans en-têtes unifiés suit le chemin de refroidissement normal. + +**Voie de priorité inférieure** (`lowPriorityMode`) : + +- Lors de la réponse 429 liée au plafond, l’exécuteur accepte l’offre et réessaie immédiatement avec le **même** + compte en utilisant `anthropic-usage-limit: slow` ; la voie reste active jusqu’à la valeur annoncée par + `anthropic-ratelimit-unified-reset` (+60 s de marge), et chaque requête durant cette période contient + l’en-tête. La réponse 429 interceptée n’atteint jamais `handleChatCore` ; la connexion n’est donc + **pas** mise en refroidissement ni remplacée par rotation. +- `anthropic-ratelimit-unified-slow-status` dans les réponses ultérieures : `active` / `not_needed` + maintiennent la voie ; `slot_busy` (429) ou une réponse `529` attend la durée indiquée par + `anthropic-ratelimit-unified-slow-retry-after` du serveur (20 s par défaut, limitée à 5–600 s, avec une variation aléatoire de ±30 %) + puis réessaie, dans la limite de `anthropic-ratelimit-unified-slow-max-wait` (20 min par défaut, limitée + à 1 min–6 h) — au-delà, la voie prend fin et une période de repos de 10 minutes bloque toute nouvelle acceptation. L’attente + est également plafonnée par le temps restant avant l’expiration du délai propre à la requête pour démarrer en amont + (`resolveFetchStartTimeout`, 10 min par défaut), moins une marge de 5 s : sans ce plafond, le + délai d’attente maximal par défaut de 20 minutes dépasserait la durée de vie de la requête et la veille serait interrompue + en cours d’attente, exposant une `TimeoutError` au lieu de la fin normale `max_wait` suivie de la période de repos. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, le renouvellement d’une fenêtre de 5 h, ou + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (qui y met fin avec + `extra_usage` quel que soit le statut, puisque le dépassement payant couvre désormais le plafond) mettent fin à la voie ; la + réponse suit alors le chemin de refroidissement normal. `budget_exhausted` est mémorisé jusqu’à + la réinitialisation annoncée du budget (≤ 8 jours). +- La vérification du plafond s’exécute après les nouvelles tentatives internes de l’exécuteur déclenchées par une réponse 400 (modification + du contexte, plafonnement de la réflexion/de l’effort, apprentissage automatique des paramètres), afin qu’une réponse 429 liée au plafond n’apparaissant que lors + de l’une de ces nouvelles tentatives soit tout de même interceptée au lieu d’atteindre le chemin de refroidissement. +- L’état est conservé en mémoire par connexion (un redémarrage entraîne une réponse 429 supplémentaire liée au plafond avant la nouvelle acceptation). + +**Réinitialisation de la limite de session** (`autoLimitReset`, tentée avant la voie lorsque les deux sont activées) : + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → bloc `juniper_tide` ; + lorsque `arm: "reset"` et `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` avec + `{ "program": "juniper_tide" }` (UUID de l’organisation provenant de + `providerSpecificData.organizationUUID`, solution de secours lors de l’amorçage). +- `result: reset|not_limited` → la requête est retentée à pleine vitesse (sans en-tête de ralentissement). + `already_used` / `not_offered` mémorisent `next_available_at` (une semaine par défaut) ; tout + échec applique une temporisation de 15 minutes. La réinitialisation n’est possible qu’une fois par semaine et reste comptabilisée dans la + limite hebdomadaire. + +Protections contre les régressions : `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Affinité de session (#7274) **Portée :** une session cliente (en-tête `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) épinglée à une connexion, pour **n’importe quel** fournisseur. -**Objectif :** maintenir un agent multitour (Claude Code, aider, agents personnalisés) sur le même compte d’une requête à l’autre, afin de réduire la perte de contexte entre comptes et les erreurs 429 répétées de démarrage à froid chez les fournisseurs dont l’état de session est propre à chaque compte. +**Objectif :** maintenir un agent multi-tour (Claude Code, aider, agents personnalisés) sur le même compte d’une requête à l’autre, afin de réduire la perte de contexte entre comptes et les erreurs 429 répétées lors des démarrages à froid chez les fournisseurs dont l’état de session est propre à chaque compte. **Implémentation :** -- Résolution de la durée de vie : `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- Résolution du TTL : `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - Sélection/création de l’épinglage : `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - Extraction de l’en-tête (générique, tout fournisseur) : `src/sse/services/auth.ts::extractSessionAffinityKey()` - Table d’épinglage persistante : `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Paramètre : `sessionAffinityTtlMs` (durée de vie globale en ms, `0` désactive la fonctionnalité) — `src/lib/db/settings.ts`. Renommé depuis le paramètre propre à Codex `codexSessionAffinityTtlMs` par la migration `124_generic_session_affinity_ttl.sql`, qui reprend toute durée de vie Codex précédemment configurée comme nouvelle valeur par défaut. +- Paramètre : `sessionAffinityTtlMs` (TTL global en ms, `0` le désactive) — `src/lib/db/settings.ts`. Renommé depuis `codexSessionAffinityTtlMs`, auparavant spécifique à Codex, par la migration `124_generic_session_affinity_ttl.sql`, qui reprend tout TTL Codex précédemment configuré comme nouvelle valeur par défaut. -Avant #7274, `resolveSessionAffinityTtlMs()` renvoyait immédiatement `0` pour tous les fournisseurs sauf `codex`. Le paramètre de durée de vie (et les en-têtes de session) n’avait donc aucun effet ailleurs, même si le mécanisme d’épinglage et l’extraction des en-têtes étaient déjà indépendants du fournisseur. Le correctif a supprimé ce retour anticipé ; la durée de vie s’applique désormais uniformément à tous les fournisseurs dès qu’elle est définie globalement à une valeur supérieure à `0`. +Avant #7274, `resolveSessionAffinityTtlMs()` renvoyait immédiatement `0` pour tous les fournisseurs sauf `codex`. Le paramètre TTL (ainsi que les en-têtes de session) n’avait donc aucun effet ailleurs, même si le mécanisme d’épinglage et l’extraction des en-têtes étaient déjà indépendants du fournisseur. Le correctif a supprimé ce retour anticipé ; le TTL s’applique désormais uniformément à tous les fournisseurs dès lors que sa valeur globale est supérieure à `0`. -Les trois en-têtes d’affinité de session ne sont jamais transmis en amont — les exécuteurs construisent leurs propres en-têtes en amont de zéro au lieu de transmettre les en-têtes du client, de sorte qu’ils restent uniquement des identifiants de corrélation internes. +Les trois en-têtes d’affinité de session ne sont jamais transmis en amont — les exécuteurs construisent leurs propres en-têtes en amont à partir de zéro au lieu de transmettre ceux du client ; ils restent donc uniquement des identifiants de corrélation internes. -### Baux exclusifs de connexion pour les sessions gérées +### Baux exclusifs de connexion de session gérée -**Portée :** un client/une session HTTP géré actif possède une connexion OmniRoute éligible. +**Portée :** un client/une session HTTP géré(e) actif/active possède une connexion OmniRoute éligible. -**Objectif :** fournir aux clients qui ont besoin d’une barrière de routage stricte entre les requêtes une propriété exclusive et durable de la connexion. Cela diffère de l’affinité de session, qui constitue une préférence souple de continuité : un bail exclusif conserve son état de cycle de vie dans SQLite, impose l’unicité globale du propriétaire actif et de la connexion active, et rejette une génération obsolète avant l’envoi au fournisseur. +**Objectif :** fournir une propriété exclusive et durable de la connexion aux clients nécessitant une barrière de routage stricte entre les requêtes. Cela diffère de l’affinité de session, qui constitue une préférence souple de continuité : un bail exclusif conserve l’état du cycle de vie dans SQLite, impose l’unicité globale du propriétaire actif et de la connexion active, et rejette une génération obsolète avant l’envoi au fournisseur. -Cette fonctionnalité est activée explicitement pour chaque clé API. Une clé gérée doit disposer de la portée `lease:exclusive` et d’une liste `allowedConnections` explicite et non vide. Tout client HTTP peut utiliser le point de terminaison de cycle de vie ; aucun nom de client, agent utilisateur, fournisseur, méthode OAuth ou modèle n’est requis. Le bail porte sur une connexion, et non sur un modèle ; un changement de modèle conserve donc la liaison tant que la connexion reste normalement éligible. Les règles habituelles relatives au modèle, au quota, à l’intégrité, à la période de récupération et à la liste d’autorisation restent prioritaires et peuvent faire basculer la même génération vers une autre connexion libre et éligible. +Cette fonctionnalité est activée séparément pour chaque clé API. Une clé gérée doit disposer de la portée `lease:exclusive` et d’une liste `allowedConnections` explicite et non vide. Tout client HTTP peut utiliser le point de terminaison du cycle de vie ; aucun nom de client, agent utilisateur, fournisseur, méthode OAuth ou modèle n’est requis. Le bail porte sur une connexion, et non sur un modèle ; un changement de modèle conserve donc la liaison tant que la connexion reste normalement éligible. Les règles habituelles relatives au modèle, au quota, à l’état de santé, au délai de récupération et à la liste d’autorisation restent prépondérantes et peuvent faire basculer la même génération vers une autre connexion libre et éligible. -Le cycle de vie utilise `POST /api/v1/session-leases` avec les actions JSON `acquire`, `renew` et `release`. Les requêtes d’inférence gérées présentent la valeur opaque `X-OmniRoute-Lease-Owner` et la valeur exacte `X-OmniRoute-Lease-Generation`. Le propriétaire utilise le préfixe `vlo_` suivi de 43 caractères base64url ; seul son hachage SHA-256 est stocké. Chaque barrière finale d’envoi associe également l’ID de la clé API authentifiée et l’ID de la connexion active. Les en-têtes de contrôle du bail sont supprimés des journaux, des instantanés de requête conservés et des en-têtes des exécuteurs en amont. +Le cycle de vie utilise `POST /api/v1/session-leases` avec les actions JSON `acquire`, `renew` et `release`. Les requêtes d’inférence gérées présentent la valeur opaque `X-OmniRoute-Lease-Owner` et la valeur exacte `X-OmniRoute-Lease-Generation`. Le propriétaire utilise le préfixe `vlo_` suivi de 43 caractères base64url ; seul son hachage SHA-256 est stocké. Chaque barrière d’envoi finale lie également l’ID de la clé API authentifiée et l’ID de la connexion active. Les en-têtes de contrôle du bail sont supprimés des journaux, des instantanés de requêtes conservés et des en-têtes des exécuteurs en amont. -Si le routage ordinaire dispose de candidats gérés éligibles, mais que tous les candidats libres sont occupés par un bail actif tiers, OmniRoute renvoie une réponse HTTP `429`, un code indiquant l’indisponibilité de la capacité de bail, un état d’attente de capacité et un en-tête `Retry-After` borné, calculé à partir de la première expiration pertinente. Une absence ordinaire d’éligibilité ne constitue pas un conflit de bail et conserve la sémantique existante des erreurs de routage. +Si le routage ordinaire dispose de candidats gérés éligibles, mais que chaque candidat libre est occupé par un bail actif étranger, OmniRoute renvoie le code HTTP `429`, le code indiquant une capacité de bail indisponible, un état d’attente de capacité et un en-tête `Retry-After` borné, calculé à partir de l’expiration pertinente la plus proche. Une absence ordinaire d’éligibilité ne constitue pas un conflit de bail et conserve la sémantique existante des erreurs de routage. -Les mécanismes connexes restent distincts : +Les mécanismes associés restent distincts : -- L’occupation de session OAuth est une distribution souple propre au processus pour les comptes OAuth. -- Les sémaphores de compte accordent des autorisations de concurrence des requêtes et prennent fin lorsqu’une requête se termine. -- Les baux exclusifs de connexion pour les sessions gérées constituent une propriété durable du cycle de vie avec une barrière de génération. +- L’occupation des sessions OAuth est une distribution souple, locale au processus, pour les comptes OAuth. +- Les sémaphores de compte accordent des autorisations de requêtes concurrentes et prennent fin lorsqu’une requête se termine. +- Les baux exclusifs de connexion de session gérée assurent une propriété durable liée au cycle de vie, avec une barrière de génération. --- @@ -276,48 +336,73 @@ de débit propre au modèle. Ce comportement est encadré par `comboCooldownWait --- -## 5. Contrôle d'admission de la file d'attente des requêtes (v3.8.49 · ticket #6593) - -**Portée** : la file d'attente locale de limitation de débit par fournisseur+connexion (`open-sse/services/rateLimitManager.ts`, -basée sur Bottleneck), située une couche en dessous des trois mécanismes ci-dessus. - -**`maxWaitMs` est un ancien nom persistant désignant l'expiration de l'exécution.** -`resilienceSettings.requestQueue.maxWaitMs` est transmis à Bottleneck comme valeur -`expiration` d'une tâche, dont le minuteur ne démarre qu'après le routage. Il limite donc -l'exécution gérée par le limiteur, et non le temps passé dans la file d'attente locale. L'expiration est -exposée comme une erreur locale fiable `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) ; -l'ancien nom de code lié au délai d'attente dans la file n'est accepté que pour assurer une -rétrocompatibilité interne fiable. La valeur par défaut est 15000ms ; remplacez-la via -`RATE_LIMIT_MAX_WAIT_MS` (variable d'environnement) ou le tableau de bord (**Paramètres → Résilience**, -plafond de l'interface : 1–30000ms). Le temps passé dans la file d'attente n'a aucune échéance ; utilisez -`maxQueueDepth` ci-dessous pour limiter le nombre d'appelants en attente. - -**`maxQueueDepth` — limite d'admission facultative (nouveauté).** `resilienceSettings.requestQueue.maxQueueDepth` -limite le nombre de requêtes pouvant rester en attente (sans avoir encore été acheminées) simultanément pour une même +## 5. Contrôle d’admission de la file d’attente des requêtes (v3.8.49 · issue #6593) + +**Portée** : la file d’attente locale de limitation du débit par fournisseur+connexion (`open-sse/services/rateLimitManager.ts`, +reposant sur Bottleneck), située un niveau sous les trois mécanismes ci-dessus. + +**`maxWaitMs` limite l’attente dans la file ; `executionMaxWaitMs` limite l’exécution.** +Ces deux limites sont volontairement distinctes, et aucune n’alimente l’autre. + +`resilienceSettings.requestQueue.maxWaitMs` est le **budget d’attente dans la file** : il +couvre l’attente d’un créneau chez le fournisseur, puis le temps passé à l’état QUEUED, et son minuteur est +annulé dès que la tâche quitte l’état QUEUED et commence son exécution +(`rateLimitManager.ts`, `wrappedFn`). Une requête qui le dépasse n’atteint jamais +le service en amont. La valeur par défaut est 30000ms, fournie par `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +dans `src/lib/resilience/settings.ts` et verrouillée par +`tests/unit/ratelimit-admission-control-6593.test.ts`, de sorte que toute modification +fait échouer ce test au lieu de laisser silencieusement ce paragraphe devenir obsolète. + +`resilienceSettings.requestQueue.executionMaxWaitMs` est la valeur que Bottleneck +reçoit comme `expiration` de la tâche, dont le minuteur ne démarre qu’après l’envoi. Elle sert +de filet de sécurité pour les exécuteurs ne disposant pas de leur propre délai d’expiration en amont, et elle est +augmentée jusqu’au délai d’expiration au démarrage de la récupération propre à l’exécuteur lorsque celui-ci est plus long, afin qu’elle +ne puisse pas interrompre une réponse saine en cours. Valeur par défaut : 600000ms (10 min). + +L’utilisation du budget de file comme `expiration` provoquait auparavant l’arrêt en cours d’exécution des passerelles +non incrémentales — celles-ci s’exécutent légitimement pendant plusieurs minutes avant l’arrivée des premiers octets — +et c’est pourquoi une expiration est exposée sous la forme `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), tandis que le budget de file porte le +code d’expiration de la file. Remplacez l’une ou l’autre valeur via `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) ou le tableau de bord +(**Paramètres → Résilience**). Lors de leur normalisation, les deux valeurs sont limitées à 1ms–24h. + +**Priorité, pour les deux :** la variable d’environnement fournit uniquement la valeur _par défaut_. Une valeur +persistée dans `resilienceSettings.requestQueue` (tableau de bord / correctif d’API, stockée +dans `key_value`) prévaut sur celle-ci, et une valeur par connexion +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` prévaut à son tour. Définir +la variable d’environnement sur un déploiement qui possède déjà une valeur persistée +ne change donc rien — effacez ou mettez plutôt à jour le paramètre persistant. + +Le temps de résidence dans la file est limité par `maxWaitMs` ; la valeur `maxQueueDepth` ci-dessous limite le +nombre d’appelants pouvant être placés simultanément dans la file. + +**`maxQueueDepth` — plafond d’admission facultatif (nouveau).** `resilienceSettings.requestQueue.maxQueueDepth` +limite le nombre de requêtes pouvant rester dans la file (sans avoir encore été envoyées) simultanément pour une paire fournisseur+connexion. Lorsque la file contient déjà `maxQueueDepth` -requêtes, toute nouvelle requête est immédiatement rejetée avec une erreur typée -`code: "RATE_LIMIT_QUEUE_FULL"` **avant** même d'atteindre `limiter.schedule()` -— le rejet est ainsi peu coûteux et intervient avant tout travail en aval de -compression / traduction du prompt pour cette requête. Valeur par défaut `0` = -désactivé, ce qui préserve le comportement existant d'une file d'attente sans limite ; plage autorisée : 0–100000. -Remplacez cette valeur via `RATE_LIMIT_MAX_QUEUE_DEPTH` (variable d'environnement) ou -`resilienceSettings.requestQueue.maxQueueDepth` (correctif via le tableau de bord/l'API). - -Le contrôle d'admission lui-même est une fonction pure +requêtes, une nouvelle requête est immédiatement rejetée avec une erreur typée +`code: "RATE_LIMIT_QUEUE_FULL"` **avant** même d’atteindre `limiter.schedule()` +— le rejet est donc peu coûteux et intervient avant tout travail ultérieur +de compression / traduction du prompt pour cette requête. Valeur par défaut : `0` = +désactivé, ce qui préserve le comportement existant de file non bornée ; plage limitée à 0–100000. +Remplacez cette valeur via `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) ou +`resilienceSettings.requestQueue.maxQueueDepth` (correctif via le tableau de bord/l’API). + +La vérification d’admission elle-même est une fonction pure (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), ce qui permet de la tester unitairement sans véritable limiteur Bottleneck. -> La RFC à l'origine du ticket #6593 proposait également un indicateur `bypassCompressionOnRateLimit`. +> La RFC à l’origine de #6593 proposait également un indicateur `bypassCompressionOnRateLimit`. > Dans ce dépôt, le pipeline `open-sse/services/compression/` effectue la > compression du prompt/contexte sur la requête LLM sortante (`chatCore.ts`, > autour du bloc `resolveCompressionSettings`/`selectCompressionStrategy`), -> et non la compression de la réponse HTTP sur les corps 429 générés — il n'existe aucun +> et non la compression de la réponse HTTP sur les corps 429 synthétisés — il n’existe aucun > chemin de code correspondant à un indicateur de contournement littéral. Cette étape de compression du prompt -> s'exécute aussi actuellement _avant_ `withRateLimit()` dans le pipeline de requêtes ; la -> réorganiser afin de l'ignorer lors d'un rejet pour cause de file pleine constitue une modification distincte et plus -> importante que la portée de ce ticket ; elle n'a intentionnellement **pas** été implémentée -> ici et reste à traiter ultérieurement si le gain de ressources CPU justifie le -> risque lié à cette réorganisation. +> s’exécute aussi actuellement _avant_ `withRateLimit()` dans le pipeline de requêtes ; par conséquent, +> la réorganisation nécessaire pour l’ignorer lors d’un rejet dû à une file pleine constitue une modification distincte et plus +> importante que le périmètre de cette issue. Elle n’a volontairement **pas** été implémentée +> ici et reste un suivi potentiel si le gain en ressources CPU justifie le +> risque lié à la réorganisation. --- diff --git a/docs/i18n/fr/docs/architecture/admission-lanes.md b/docs/i18n/fr/docs/architecture/admission-lanes.md index beeb2c8b583d..72129266ba30 100644 --- a/docs/i18n/fr/docs/architecture/admission-lanes.md +++ b/docs/i18n/fr/docs/architecture/admission-lanes.md @@ -7,48 +7,62 @@ OmniRoute dispose de **deux** systèmes locaux au processus pour les files, avec des portées différentes. Ils sont complémentaires ; les opérateurs doivent savoir lequel ils consultent. -## 1. Admission à l’échelle du processus au niveau des octets (`chatBodyAdmission.ts`) +## 1. Admission globale au processus au niveau des octets (`chatBodyAdmission.ts`) -- **Portée :** le chemin du corps mis en mémoire tampon/tas pour `POST /v1/chat/completions`, +- **Portée :** le chemin corps mis en mémoire tampon/tas pour `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` et les autres routes de type chat. Protège - contre l’amplification du tas provoquée par les corps volumineux des agents de programmation (#4380). -- **Un seul contrôleur global au processus, et non des files par clé (#10110).** Chaque clé d’API - (hachée) ou session `anonymous` est admise selon le **même** budget partagé — - l’identifiant de session haché est utilisé UNIQUEMENT comme clé de planification équitable (distribution - à tour de rôle entre les requêtes en attente), jamais comme partition de capacité. Une version antérieure de ce - document décrivait des files par clé avec une capacité indépendante ; ce modèle a été - supprimé dans #10110, car il permettait à de faux identifiants non authentifiés de multiplier - la limite à l’échelle du processus. -- **Barrière (#503-fanout) : un budget d’ingestion en OCTETS dérivé automatiquement, et non un nombre fixe de - requêtes.** La limite historique `CHAT_MAX_HEAVY_IN_FLIGHT` fondée sur le nombre de requêtes (valeur par défaut `1` - avant ce correctif) réduisait la dispersion des agents de programmation (plusieurs sous-agents/CLI, - avec des corps dépassant régulièrement 256 Ko) à une concurrence effective d’environ 1, ce qui provoquait - des erreurs 503 sous une charge tout à fait normale. Elle ne s’applique désormais que lorsqu’un opérateur définit explicitement - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Lorsqu’elle n’est pas définie, l’admission est à la place - contrôlée par `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — un budget dérivé automatiquement de la - limite mémoire réelle du processus (`src/shared/middleware/admissionBudget.ts`) : - 25 % de la plus stricte entre la limite du tas V8 et toute limite de cgroup/conteneur, - divisés par un facteur d’amplification transitoire de 8x, puis bornés entre 8 Mio et - 2 Gio. Les remplacements explicites utilisent les mêmes bornes. Ce mécanisme s’adapte automatiquement d’un - conteneur de 512 Mo à un poste de travail de 32 Go, sans réglage des variables d’environnement. Un corps qui ne peut pas - tenir dans le budget effectif échoue immédiatement avec `413 body_exceeds_budget` ; - seule la contention entre des corps pouvant être traités individuellement entre dans la file d’attente - équitable bornée. Un dispositif actif de suivi de la pression sur les ressources basé sur plusieurs signaux (ratio du tas V8, - cgroup, PSI, événements OOM — `open-sse/utils/resourcePressurePolicy.ts`) réduit - l’attente bornée sous une pression `high` et déleste immédiatement avec - `503 resource_pressure` sous une pression `critical`, avant même l’ingestion du moindre octet. + contre l'amplification du tas provoquée par les corps volumineux des agents de + programmation (#4380). +- **Un contrôleur global unique par processus, et non des files par clé (#10110).** + Chaque clé API (hachée) ou session `anonymous` est admise selon le **même** + budget partagé — l'identifiant de session haché sert UNIQUEMENT de clé de + planification équitable (distribution à tour de rôle entre les requêtes en + attente), jamais de partition de capacité. Une version antérieure de ce + document décrivait des files par clé dotées de capacités indépendantes ; ce + modèle a été supprimé dans #10110, car il permettait à de faux identifiants + non authentifiés de multiplier la limite globale du processus. +- **Barrière (#503-fanout) : un budget d'ingestion en OCTETS calculé + automatiquement, et non un nombre fixe de requêtes.** L'ancienne limite du + nombre de requêtes `CHAT_MAX_HEAVY_IN_FLIGHT` (valeur par défaut `1` avant ce + correctif) réduisait le fan-out des agents de programmation (plusieurs + sous-agents/CLI, avec des corps dépassant couramment 256 KB) à une concurrence + effective d'environ 1, ce qui provoquait des erreurs 503 sous une charge tout + à fait normale. Elle n'est désormais contraignante que lorsqu'un opérateur + définit explicitement `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Lorsqu'elle n'est + pas définie, l'admission est plutôt contrôlée par + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — un budget calculé automatiquement à + partir de la limite mémoire réelle du processus + (`src/shared/middleware/admissionBudget.ts`) : 25 % de la plus restrictive + entre la limite du tas V8 et toute limite de cgroup/conteneur, divisés par un + facteur d'amplification transitoire de 8x, puis bornés entre 8 MiB et 2 GiB. + Les remplacements explicites utilisent les mêmes bornes. Ce budget s'adapte + automatiquement d'un conteneur de 512 MB à un ordinateur de bureau de 32 GB, + sans ajustement des variables d'environnement. Un corps qui ne peut pas tenir + dans le budget effectif échoue immédiatement avec `413 body_exceeds_budget` ; + seule la contention entre des corps individuellement admissibles entre dans + la file d'attente bornée et équitable. Un système actif de suivi de la + pression sur les ressources à signaux multiples (ratio du tas V8, cgroup, + PSI, événements OOM — `open-sse/utils/resourcePressurePolicy.ts`) réduit + l'attente bornée sous une pression `high` et déleste immédiatement avec + `503 resource_pressure` sous une pression `critical`, avant même l'ingestion + du moindre octet. PSI est lu depuis `memory.pressure` du cgroup de cette unité + lorsqu'il est disponible (`open-sse/utils/resourcePressureSampler.ts`) ; + `/proc/pressure/memory` concerne l'ensemble de l'hôte et n'est utilisé qu'en + secours sur une machine physique / avec cgroup v1, afin qu'un hôte utilisant + l'espace d'échange ne puisse pas provoquer une erreur 503 dans un conteneur + inactif. - **Réglage :** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — remplacement du budget en octets dérivé automatiquement - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — limite historique fondée sur le nombre de requêtes, uniquement sur activation explicite + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — remplacement du budget en octets calculé automatiquement + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — ancienne limite du nombre de requêtes, activée uniquement sur demande - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — attente dans la file avant une erreur 503 (valeur par défaut : 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — soupape du tas fondée sur les octets en file d’attente (valeur par défaut : 4 Mo) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — obsolètes et - sans effet depuis #10110 (acceptées pour la compatibilité de la configuration, ignorées) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — soupape du tas pour les octets en file d'attente (valeur par défaut : 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — obsolètes + et sans effet depuis #10110 (acceptées pour la compatibilité de la configuration, ignorées) - **Rapports :** `GET /api/monitoring/health` → `chatAdmission` (#11244) — notamment les ajouts de #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` et `countCapEnabled` - (`false` dans un déploiement par défaut — confirme que c’est le budget en octets, et non la - limite historique fondée sur le nombre de requêtes, qui constitue réellement la contrainte). + (false sur un déploiement par défaut — confirme que le budget en octets, et + non l'ancienne limite du nombre de requêtes, est effectivement contraignant). ## 2. Voies virtuelles adaptatives à l’exécution (`open-sse/services/admission`) diff --git a/docs/i18n/fr/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/fr/docs/frameworks/EMBEDDED-SERVICES.md index d287d7799f58..05147e4d120e 100644 --- a/docs/i18n/fr/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/fr/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Version :** v3.8.44 -> **Dernière mise à jour :** 2026-07-03 -> **Public :** ingénieurs chargés d’ajouter, de maintenir ou de déboguer des services intégrés (9Router, CLIProxyAPI, Mux, Bifrost). +> **Dernière mise à jour :** 2026-09-09 +> **Public :** ingénieurs ajoutant, assurant la maintenance ou effectuant le débogage de services embarqués (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Les services intégrés sont des outils side-car sous forme de processus installés localement qu’OmniRoute installe, supervise et +Les services embarqués sont des outils de processus auxiliaires installés localement qu’OmniRoute installe, supervise et expose comme des cibles de routage de premier ordre. Contrairement aux fournisseurs externes (accessibles via Internet -à l’aide de clés d’API), les services intégrés s’exécutent sur la même machine qu’OmniRoute et communiquent via l’interface de bouclage. +à l’aide de clés API), les services embarqués s’exécutent sur la même machine qu’OmniRoute et communiquent via l’interface de bouclage. --- @@ -31,22 +31,23 @@ expose comme des cibles de routage de premier ordre. Contrairement aux fournisse ### Pourquoi des services intégrés ? -Cinq services sont intégrés : +Six services sont intégrés : -| Service | Paquet npm | Port par défaut | Objectif | -| --------------- | --------------------------------------------- | :-------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | Routeur d’IA qu’OmniRoute peut utiliser comme sous-fournisseur. Modèles exposés sous la forme `9router/{sub}/{model}` | -| **CLIProxyAPI** | Binaire de version GitHub (`cliproxy`) | 8317 | Adaptateur de proxy local pour les flux d’authentification de l’interface CLI d’Anthropic. Fournit un routage de secours lorsque les jetons OAuth expirent | -| **Mux** | `mux` (`mux server` sans interface graphique) | 8322 | Démon local d’orchestration d’agents (coder/mux). Uniquement géré par le cycle de vie — ce n’est pas une cible de routage (aucun proxy LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend de relais de passerelle d’IA en Go. Lorsqu’il est en cours d’exécution, il est automatiquement sélectionné par la route de relais (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Proxy d’abonnement Claude — solution de remplacement/secours de CLIProxyAPI pour le trafic au format Claude Code ; la clé injectée devient `DARIO_ADMIN_TOKEN` et protège son plan de contrôle OAuth `/admin/*` | +| Service | Package npm | Port par défaut | Objectif | +| --------------- | --------------------------------------------- | :-------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | Routeur d’IA qu’OmniRoute peut utiliser comme sous-fournisseur. Les modèles sont exposés sous la forme `9router/{sub}/{model}` | +| **CLIProxyAPI** | Binaire de version GitHub (`cliproxy`) | 8317 | Adaptateur de proxy local pour les flux d’authentification de l’interface en ligne de commande Anthropic. Fournit un routage de secours lorsque les jetons OAuth expirent | +| **Mux** | `mux` (`mux server` sans interface graphique) | 8322 | Démon local d’orchestration d’agents (coder/mux). Seul son cycle de vie est géré — il ne constitue pas une cible de routage (aucun proxy LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend relais de passerelle d’IA en Go. Lorsqu’il est en cours d’exécution, il est automatiquement sélectionné par la route de relais (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Proxy d’abonnement Claude — solution de remplacement/secours pour CLIProxyAPI destinée au trafic au format Claude Code ; la clé injectée devient `DARIO_ADMIN_TOKEN` et protège son plan de contrôle OAuth `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Automatisation de WhatsApp Web (Chromium sans interface graphique via Puppeteer). Seul son cycle de vie est géré — il ne constitue pas une cible de routage. | -Tous les cinq suivent le même modèle de supervision : +Les six services suivent le même modèle de supervision : -- OmniRoute les installe sous `DATA_DIR/services/{name}/` (isolés du propre `package.json` d’OmniRoute) -- OmniRoute les lance et les surveille comme des processus enfants +- OmniRoute les installe sous `DATA_DIR/services/{name}/` (isolés du propre fichier `package.json` d’OmniRoute) +- OmniRoute les lance et les surveille en tant que processus enfants - OmniRoute injecte une clé d’API éphémère dans l’environnement du processus enfant et la renouvelle sans interruption de service (le cas échéant) -- Toutes les routes de gestion (`/api/services/*`) sont **LOCAL_ONLY** — accessibles uniquement depuis l’interface de bouclage (règle stricte n° 17) +- Toutes les routes de gestion (`/api/services/*`) sont **LOCAL_ONLY** — accessibles uniquement depuis l’interface de bouclage (règle stricte nº 17) ### Décisions clés (issues du plan de conception) @@ -54,10 +55,10 @@ Tous les cinq suivent le même modèle de supervision : | -------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | Accès du tableau de bord à l’interface native de 9Router | Proxy inverse à `/dashboard/providers/services/9router/embed/*` | | Mécanisme d’installation | `npm install {package}` via `execFile` (sans interpolation par le shell) | -| Mode d’utilisation | Fournisseur enregistré sous la forme `9router/{sub}/{model}` dans le moteur de routage | +| Mode d’utilisation | Fournisseur enregistré sous `9router/{sub}/{model}` dans le moteur de routage | | Gestion des clés d’API | OmniRoute les génère, les chiffre au repos (AES-256-GCM) et les injecte via l’environnement | | Emplacement dans le tableau de bord | `/dashboard/providers/services` (trois onglets) | -| Démarrage automatique | Option activable par service, désactivée par défaut | +| Démarrage automatique | Option configurable pour chaque service, désactivée par défaut | --- @@ -67,7 +68,7 @@ Tous les cinq suivent le même modèle de supervision : ┌────────────────────────────────────────────────────────────────────┐ │ Couche 1 — UI │ │ /dashboard/providers/services (onglets : CLIProxyAPI | 9Router | Mux)│ -│ Journaux en direct (SSE), démarrage/arrêt/redémarrage/mise à jour, paramètres, installation│ +│ Journaux en direct (SSE), Démarrer/Arrêter/Redémarrer/Mettre à jour, Paramètres, Installer│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx Structure + routage des onglets via ?tab=│ @@ -87,7 +88,7 @@ Tous les cinq suivent le même modèle de supervision : │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (proxy inverse HTTP + WebSocket → serveur en amont 9Router) │ +│ (proxy inverse HTTP + WebSocket → service 9Router en amont) │ │ │ │ Contrôle : LOCAL_ONLY_API_PREFIXES inclut "/api/services/" et │ │ "/dashboard/providers/services/*/embed/" │ @@ -97,21 +98,21 @@ Tous les cinq suivent le même modèle de supervision : │ Couche 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Superviseur générique (child_process.spawn)│ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 20130 pour 9Router (configurable) │ -│ ├── logs: tampon circulaire stdio de 5 Mo → événements SSE│ -│ ├── health: HTTP GET /health toutes les 2 à 5 s, récupération différée│ -│ └── lifecycle: SIGTERM 15 s → SIGKILL │ +│ ├── installation : execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── démarrage : spawn(node, [entrypoint], {env, cwd}) │ +│ ├── clé d’API : crypto.randomBytes(32) → env NINEROUTER_API_KEY│ +│ ├── port : 20130 pour 9Router (configurable) │ +│ ├── journaux : tampon circulaire stdio de 5 MB → événements SSE│ +│ ├── santé : HTTP GET /health toutes les 2 à 5 s, récupération différée│ +│ └── cycle de vie : SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Initialise tous les SERVICES[] au démarrage du processus│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts GET /v1/models périodique → table service_models│ -│ ringBuffer.ts Tampon circulaire de journaux (5 Mo par service)│ -│ healthCheck.ts Sonde d’intégrité HTTP périodique │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ ringBuffer.ts Tampon circulaire de journaux (5 MB par service)│ +│ healthCheck.ts Sonde d’intégrité HTTP par interrogation │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (adaptateurs d’installation) │ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP compatible OpenAI (boucle locale) @@ -119,9 +120,9 @@ Tous les cinq suivent le même modèle de supervision : │ Couche 4 — Fournisseur / Routage │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Recherche à nouveau le port et la clé API à chaque requête (sans cache).│ -│ Supprime le préfixe "9router/" de l’identifiant du modèle avant le proxy.│ -│ Renvoie 503 service_not_running si le superviseur n’est pas dans l’état "running".│ +│ Recherche à nouveau le port et la clé d’API à chaque requête (sans cache).│ +│ Retire le préfixe "9router/" de l’identifiant du modèle avant le transfert.│ +│ Renvoie 503 service_not_running si le superviseur n’est pas à l’état "running".│ │ │ │ src/shared/constants/providers.ts │ │ Entrée pour "9router" : isEmbeddedService: true │ @@ -130,10 +131,10 @@ Tous les cinq suivent le même modèle de supervision : │ Modèles stockés sous la forme "9router/{sub}/{model}" (préfixés).│ │ Synchronisés toutes les 5 min par modelSync.ts. │ │ │ -│ Mux est UNIQUEMENT géré pour son cycle de vie (couches 1 à 3) — │ -│ il s’agit d’un démon d’orchestration d’agents, et non d’un proxy LLM,│ -│ il ne possède donc aucune entrée d’exécuteur/fournisseur de couche 4│ -│ et n’est jamais une cible de routage. │ +│ Mux est UNIQUEMENT géré pour son cycle de vie (couches 1 à 3) — │ +│ il s’agit d’un démon d’orchestration d’agents, et non d’un proxy │ +│ LLM ; il ne possède donc aucune entrée d’exécuteur/fournisseur de │ +│ couche 4 et n’est jamais une cible de routage. │ └────────────────────────────────────────────────────────────────────┘ ``` @@ -143,14 +144,15 @@ Tous les cinq suivent le même modèle de supervision : | ------------------------------------------- | ------------------------------------------------------------------ | | `src/lib/services/ServiceSupervisor.ts` | Classe principale : cycle de vie, verrou, santé, tampon circulaire | | `src/lib/services/bootstrap.ts` | Enregistrement au niveau du processus et démarrage automatique | -| `src/lib/services/registry.ts` | Table singleton `outil → superviseur` | +| `src/lib/services/registry.ts` | Map singleton `outil → superviseur` | | `src/lib/services/apiKey.ts` | Génération de clés, chiffrement AES-256-GCM au repos | | `src/lib/services/modelSync.ts` | Synchronisation périodique des modèles (5 min) + à la demande | -| `src/lib/services/ringBuffer.ts` | Tampon de journal circulaire de 5 Mo avec abonnement SSE | +| `src/lib/services/ringBuffer.ts` | Tampon circulaire de journaux de 5 Mo avec abonnement SSE | | `src/lib/services/healthCheck.ts` | Sonde de santé HTTP (intervalle configurable) | -| `src/lib/services/installers/ninerouter.ts` | Installation/mise à jour/désinstallation npm pour 9Router | -| `src/lib/services/installers/cliproxy.ts` | Installation/mise à jour/désinstallation npm pour CLIProxyAPI | -| `src/lib/services/installers/mux.ts` | Installation/mise à jour/désinstallation npm pour Mux | +| `src/lib/services/installers/ninerouter.ts` | Installation/mise à jour/désinstallation npm de 9Router | +| `src/lib/services/installers/cliproxy.ts` | Installation/mise à jour/désinstallation npm de CLIProxyAPI | +| `src/lib/services/installers/mux.ts` | Installation/mise à jour/désinstallation npm de Mux | +| `src/lib/services/installers/openwa.ts` | Installation/mise à jour/désinstallation npm de open-wa | | `src/app/api/services/9router/_lib.ts` | Fonction utilitaire `getOrInitSupervisor()` | | `src/app/api/services/[name]/logs/route.ts` | Point de terminaison partagé pour les journaux SSE | | `open-sse/executors/ninerouter.ts` | Exécuteur de fournisseur (couche 4) | @@ -209,15 +211,15 @@ les conditions de concurrence lorsque, par exemple, le démarrage automatique et ## 4. Référence de l'API -Toutes les routes sous `/api/services/` sont **LOCAL_ONLY** (boucle locale uniquement, règle stricte n° 17). -Les requêtes ne provenant pas de la boucle locale reçoivent `403 LOCAL_ONLY`, quel que soit le jeton d'authentification. +Toutes les routes sous `/api/services/` sont **LOCAL_ONLY** (bouclage uniquement, règle stricte n° 17). +Les requêtes ne provenant pas de l'interface de bouclage reçoivent `403 LOCAL_ONLY`, quel que soit le jeton d'authentification. ### 4.1 Points de terminaison de 9Router (11 routes) #### `POST /api/services/9router/install` Installe 9Router depuis npm. Crée `DATA_DIR/services/9router/` avec ses propres -`package.json` et `node_modules/`. N'entre pas en conflit avec les dépendances propres à OmniRoute. +`package.json` et `node_modules/`. N'entre pas en conflit avec les dépendances d'OmniRoute. **Corps de la requête** (tous les champs sont facultatifs) : @@ -225,28 +227,28 @@ Installe 9Router depuis npm. Crée `DATA_DIR/services/9router/` avec ses propres { "version": "latest" } ``` -| Champ | Type | Valeur par défaut | Description | -| --------- | -------- | ----------------- | ---------------------------------------------- | -| `version` | `string` | `"latest"` | étiquette de version npm ou semver à installer | +| Champ | Type | Valeur par défaut | Description | +| --------- | -------- | ----------------- | ---------------------------------------- | +| `version` | `string` | `"latest"` | Tag de version npm ou semver à installer | **Réponses :** -| Statut | Description | -| ------ | ------------------------------------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Corps de requête non valide (échec de validation Zod) | -| `409` | Installation déjà en cours (verrou détenu) | -| `500` | Échec de l'installation npm — consultez `message` pour obtenir un message d'erreur compréhensible | +| Statut | Description | +| ------ | ------------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Corps de requête non valide (échec de validation Zod) | +| `409` | Installation déjà en cours (verrou détenu) | +| `500` | Échec de l'installation npm — voir `message` pour un message d'erreur explicite | **Remarques :** utilise `execFile('npm', [...])` — aucun shell, aucune interpolation (règle stricte n° 13). -Les erreurs EACCES sont présentées sous forme de messages compréhensibles. +Les erreurs EACCES sont présentées sous forme de messages explicites. --- #### `POST /api/services/9router/start` Démarre 9Router. Enregistre un superviseur s'il ne l'est pas déjà, puis appelle -`supervisor.start()`. Cette opération est idempotente si le service est déjà en cours d'exécution. +`supervisor.start()`. Idempotent si le service est déjà en cours d'exécution. **Corps de la requête :** aucun @@ -258,7 +260,7 @@ Démarre 9Router. Enregistre un superviseur s'il ne l'est pas déjà, puis appel | `409` | 9Router n'est pas installé (`status: "not_installed"`) | | `503` | Échec du démarrage (erreur de processus — voir `lastError`) | -**Schéma de ServiceStatus :** +**Schéma ServiceStatus :** ```json { @@ -276,8 +278,8 @@ Démarre 9Router. Enregistre un superviseur s'il ne l'est pas déjà, puis appel #### `POST /api/services/9router/stop` -Arrête proprement 9Router. Envoie SIGTERM, attend 15 s, puis envoie SIGKILL si le processus est toujours actif. -Cette opération est idempotente si le service est déjà arrêté. +Arrête 9Router proprement. Envoie SIGTERM, attend 15 s, puis envoie SIGKILL si le processus est toujours actif. +Idempotent si le service est déjà arrêté. **Corps de la requête :** aucun @@ -285,14 +287,14 @@ Cette opération est idempotente si le service est déjà arrêté. | Statut | Description | | ------ | ---------------------------------- | -| `200` | `ServiceStatus` (état : "stopped") | +| `200` | `ServiceStatus` (state: "stopped") | | `503` | Échec inattendu de l'arrêt | --- #### `POST /api/services/9router/restart` -Équivaut à `stop()`, puis à `start()` sous le verrou d'opération. +Équivaut à `stop()` puis `start()` sous le verrou d'opération. **Corps de la requête :** aucun @@ -324,7 +326,7 @@ service est redémarré. #### `POST /api/services/9router/rotate-key` -Génère une nouvelle clé API pour 9Router, la chiffre au repos et redémarre le service +Génère une nouvelle clé d'API pour 9Router, la chiffre au repos et redémarre le service (s'il est en cours d'exécution) afin qu'il récupère la nouvelle clé depuis son environnement. L'ancienne clé est immédiatement invalidée. @@ -337,21 +339,21 @@ immédiatement invalidée. | `200` | `{ keyRotated: true, restarted: boolean }` | | `500` | Échec de la rotation | -**Sécurité :** La nouvelle clé n'est jamais renvoyée dans la réponse (aucune fuite d'identifiants). +**Sécurité :** la nouvelle clé n'est jamais renvoyée dans la réponse (aucune fuite d'identifiants). Elle est stockée sous forme chiffrée (AES-256-GCM) dans la table `version_manager`. --- #### `GET /api/services/9router/status` -Renvoie le statut combiné en direct et en base de données, y compris les métadonnées de version et un aperçu de la clé API. +Renvoie l'état combiné en temps réel et en base de données, notamment les métadonnées de version et un aperçu de la clé d'API. **Réponses :** | Statut | Description | | ------ | ----------------------------- | | `200` | Voir le schéma ci-dessous | -| `500` | Échec de la lecture du statut | +| `500` | Échec de la lecture de l'état | **Schéma de la réponse :** @@ -377,8 +379,8 @@ Renvoie le statut combiné en direct et en base de données, y compris les méta #### `POST /api/services/9router/auto-start` -Active ou désactive le démarrage automatique. Lorsque `enabled: true`, le service démarre automatiquement -au prochain lancement d'OmniRoute (si le service est installé). +Active ou désactive l'option de démarrage automatique. Lorsque `enabled: true`, le service démarre automatiquement +au prochain démarrage d'OmniRoute (si le service est installé). **Corps de la requête :** @@ -388,33 +390,33 @@ au prochain lancement d'OmniRoute (si le service est installé). **Réponses :** -| Statut | Description | -| ------ | --------------------------- | -| `200` | `{ autoStart: true }` | -| `400` | Corps de requête non valide | +| Statut | Description | +| ------ | --------------------- | +| `200` | `{ autoStart: true }` | +| `400` | Corps non valide | --- #### `GET /api/services/9router/logs` -Flux SSE des journaux en direct provenant du tampon circulaire stdout/stderr de 9Router. +Flux SSE des journaux en temps réel provenant du tampon circulaire stdout/stderr de 9Router. **Paramètres de requête :** -| Paramètre | Type | Valeur par défaut | Description | -| --------- | --------- | ----------------- | ----------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Nombre de lignes historiques à envoyer en premier (maximum 1000) | -| `filter` | `string` | aucun | Filtre de sous-chaîne insensible à la casse (sans regex — protégé contre les ReDoS) | +| Paramètre | Type | Valeur par défaut | Description | +| --------- | --------- | ----------------- | ------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Nombre de lignes historiques à envoyer en premier (maximum 1000) | +| `filter` | `string` | aucun | Filtre de sous-chaîne insensible à la casse (sans regex — protégé contre ReDoS) | **Événements SSE :** -| Événement | Données | Description | -| ----------- | ----------- | ------------------------------------- | -| `snapshot` | `LogLine[]` | Fin initiale des données historiques | -| `log` | `LogLine` | Ligne de journal en direct | -| `heartbeat` | `{}` | Maintien de connexion toutes les 15 s | +| Événement | Données | Description | +| ----------- | ----------- | ---------------------------------------- | +| `snapshot` | `LogLine[]` | Fin initiale de l'historique | +| `log` | `LogLine` | Ligne de journal en temps réel | +| `heartbeat` | `{}` | Maintien de la connexion toutes les 15 s | -**Schéma de LogLine :** +**Schéma LogLine :** ```json { @@ -436,33 +438,33 @@ Flux SSE des journaux en direct provenant du tampon circulaire stdout/stderr de ### 4.2 Points de terminaison CLIProxyAPI (10 routes) -CLIProxyAPI présente la même structure de points de terminaison que 9Router, à l'exception de `rotate-key`, avec en plus +CLIProxyAPI possède la même structure de points de terminaison que 9Router, sans `rotate-key`, mais avec `accounts`, `provider-expose` et `auto-restart-adopted`. Il reçoit désormais une -clé API dédiée au plan de données, injectée lors de son lancement (`needsApiKey: true` dans +clé API dédiée au plan de données, injectée lors du lancement (`needsApiKey: true` dans `bootstrap.ts`, utilisée pour la synchronisation des modèles) ; `status` contient moins de champs. -| Méthode | Chemin | Description | -| ------- | ----------------------------------- | ----------------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Installer CLIProxyAPI depuis npm | -| `POST` | `/api/services/cliproxy/start` | Démarrer CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Arrêter CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Redémarrer CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Mettre à jour vers une version plus récente | -| `GET` | `/api/services/cliproxy/status` | Statut en direct + en base de données (sans `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Activer ou désactiver le démarrage automatique | +| Méthode | Chemin | Description | +| ------- | ----------------------------------- | ---------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Installer CLIProxyAPI depuis npm | +| `POST` | `/api/services/cliproxy/start` | Démarrer CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Arrêter CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Redémarrer CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Mettre à jour vers une version plus récente | +| `GET` | `/api/services/cliproxy/status` | État en direct + BDD (sans `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Activer ou désactiver le démarrage automatique | Le point de terminaison partagé `GET /api/services/{name}/logs` (voir §4.1) fonctionne pour les -quatre services à l'aide du segment dynamique `[name]`. +quatre services grâce au segment dynamique `[name]`. --- ### 4.3 Points de terminaison Mux (8 routes) -Mux présente la même structure de points de terminaison que CLIProxyAPI — aucune route `rotate-key` dans la surface -de l'API (le jeton porteur est généré de la même manière que celui de 9Router via +Mux possède la même structure de points de terminaison que CLIProxyAPI — aucune route `rotate-key` dans la surface +de l'API (le jeton bearer est généré de la même manière que celui de 9Router via `getOrCreateApiKey("mux")` et injecté au moyen de la variable d'environnement `MUX_SERVER_AUTH_TOKEN`, mais il n'existe pas encore de point de terminaison dédié à sa rotation). Seul le cycle de vie de Mux est géré : contrairement à -9Router, il ne possède aucun exécuteur de couche 4 et n'est jamais enregistré en tant que fournisseur de routage. +9Router, il ne possède aucun exécuteur de couche 4 et n'est jamais enregistré comme fournisseur de routage. | Méthode | Chemin | Description | | ------- | ------------------------------ | ----------------------------------------------- | @@ -471,7 +473,7 @@ il n'existe pas encore de point de terminaison dédié à sa rotation). Seul le | `POST` | `/api/services/mux/stop` | Arrêter Mux | | `POST` | `/api/services/mux/restart` | Redémarrer Mux | | `POST` | `/api/services/mux/update` | Mettre à jour vers une version npm plus récente | -| `GET` | `/api/services/mux/status` | Statut en direct + en base de données | +| `GET` | `/api/services/mux/status` | État en direct + BDD | | `POST` | `/api/services/mux/auto-start` | Activer ou désactiver le démarrage automatique | --- @@ -480,7 +482,7 @@ il n'existe pas encore de point de terminaison dédié à sa rotation). Seul le Bifrost est un backend relais de passerelle d'IA en Go (`@maximhq/bifrost`). Il utilise la même structure de points de terminaison que CLIProxyAPI (sans `rotate-key` — Bifrost gère ses propres clés de -fournisseur dans `config.json`, sous son `-app-dir`). +fournisseurs dans `config.json`, sous son `-app-dir`). | Méthode | Chemin | Description | | ------- | ---------------------------------- | -------------------------------------------------------------------------- | @@ -489,28 +491,63 @@ fournisseur dans `config.json`, sous son `-app-dir`). | `POST` | `/api/services/bifrost/stop` | Arrêter Bifrost | | `POST` | `/api/services/bifrost/restart` | Redémarrer Bifrost | | `POST` | `/api/services/bifrost/update` | Mettre à jour vers une version plus récente | -| `GET` | `/api/services/bifrost/status` | État en temps réel + état de la base de données | +| `GET` | `/api/services/bifrost/status` | État en direct + BDD | | `POST` | `/api/services/bifrost/auto-start` | Activer ou désactiver le démarrage automatique | -| `GET` | `/api/services/bifrost/logs` | Suivi des journaux via SSE (par la route dynamique partagée `[name]/logs`) | +| `GET` | `/api/services/bifrost/logs` | Suivi des journaux par SSE (via la route dynamique partagée `[name]/logs`) | -**Configuration du routage :** Lorsque `BIFROST_BASE_URL` n’est pas définie et que l’instance -Bifrost supervisée est en cours d’exécution, `getBifrostRoutingConfig()` (dans `routingBackend.ts`) utilise -automatiquement `http://127.0.0.1:{port}` comme URL de base du relais. La variable d’environnement -`BIFROST_BASE_URL` explicitement définie est toujours prioritaire. +**Configuration du routage :** Lorsque `BIFROST_BASE_URL` n'est pas défini et que l'instance Bifrost +supervisée est en cours d'exécution, `getBifrostRoutingConfig()` (dans `routingBackend.ts`) utilise automatiquement +`http://127.0.0.1:{port}` comme URL de base du relais. Une variable d'environnement `BIFROST_BASE_URL` explicite +est toujours prioritaire. --- ### 4.5 Points de terminaison Dario (12 routes) -Même cycle de vie que les autres services (`install`, `start`, `stop`, `restart`, +Même structure de cycle de vie que les autres services (`install`, `start`, `stop`, `restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`), avec en plus un plan de contrôle OAuth protégé par jeton sous `admin/` : `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (tous protégés par `DARIO_ADMIN_TOKEN`). -### 4.6 Proxy inverse (intégration du tableau de bord 9Router) +### 4.6 Points de terminaison open-wa (7 routes) -Le tableau de bord intègre l’interface web de 9Router dans une iframe via un proxy -inverse interne à l’adresse suivante : +open-wa (`@open-wa/wa-automate`) pilote une instance Chromium sans interface graphique (via +Puppeteer) afin d'automatiser WhatsApp Web. Il utilise la même structure de points de terminaison que Mux (aucune +route `rotate-key` pour le moment). Seul son cycle de vie est géré — ce n'est pas une cible de routage, +et il ne possède aucune entrée d'exécuteur/fournisseur de couche 4. + +| Méthode | Chemin | Description | +| ------- | --------------------------------- | ----------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Installer open-wa depuis npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Démarrer open-wa sur le port 8323 (par défaut) | +| `POST` | `/api/services/openwa/stop` | Arrêter open-wa | +| `POST` | `/api/services/openwa/restart` | Redémarrer open-wa | +| `POST` | `/api/services/openwa/update` | Mettre à jour vers une version plus récente | +| `GET` | `/api/services/openwa/status` | État en temps réel + état de la base de données | +| `POST` | `/api/services/openwa/auto-start` | Activer ou désactiver le démarrage automatique | +| `GET` | `/api/services/openwa/logs` | Suivi des journaux via SSE (par la route dynamique `[name]/logs`) | + +**Clé d'API :** injectée sous la forme `WA_KEY` — la substitution générique des variables +d'environnement préfixées par `WA_*` d'open-wa l'associe à l'option CLI `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, vérifié avec le package 4.76.0 installé). +Préfixée par `ow_` lorsqu'elle est générée par `generateServiceApiKey()`. open-wa +lit la clé depuis un en-tête HTTP `key`/`api_key` (et non `Authorization: +Bearer`) ; `/api-docs*` est explicitement exempté de cette vérification +(`setupAuthenticationLayer` dans `dist/cli/server.js`), la sonde d'intégrité +ne nécessite donc aucun en-tête d'authentification. + +**Appairage :** open-wa n'est ni officiel ni affilié à WhatsApp — le +numéro connecté présente un risque de bannissement lié à la détection des automatisations +par WhatsApp. Lors du premier démarrage, le code QR d'appairage est affiché sur stdout et +rendu accessible via le panneau de journaux et le flux SSE existants — cette intégration +ne dispose pas encore d'un endpoint dédié pour l'image du code QR. + +--- + +### 4.7 Proxy inverse (intégration du tableau de bord 9Router) + +Le tableau de bord intègre l'interface Web de 9Router dans une iframe par l'intermédiaire +d'un proxy inverse interne accessible à l'adresse suivante : ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -520,15 +557,15 @@ Ce proxy : - Transmet la requête à `http://127.0.0.1:{port}/{path}` (boucle locale uniquement) - Supprime les en-têtes entrants `cookie` et `authorization` (aucune fuite de la session OmniRoute) -- Injecte `Authorization: Bearer {apiKey}` pour l’authentification auprès de 9Router -- Supprime `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` de la réponse +- Injecte `Authorization: Bearer {apiKey}` pour l'authentification auprès de 9Router +- Supprime `set-cookie`, `content-security-policy`, `x-frame-options` et `cross-origin-*` de la réponse - Réécrit les réponses HTML pour injecter `` et normaliser les chemins absolus (`/foo` → `/dashboard/.../embed/foo`) -Les mises à niveau WebSocket du tableau de bord intégré sont gérées par un serveur complémentaire sur un -port dédié (voir `src/lib/services/embedWsProxy.ts`). +Les mises à niveau WebSocket du tableau de bord intégré sont gérées par un serveur compagnon sur +un port dédié (voir `src/lib/services/embedWsProxy.ts`). -**Sécurité :** Les routes du proxy d’intégration sont classées sous `LOCAL_ONLY_API_PREFIXES` -et ne sont accessibles que depuis la boucle locale. Un attaquant qui obtient un JWT par l’intermédiaire d’un +**Sécurité :** Les routes du proxy d'intégration sont classées sous `LOCAL_ONLY_API_PREFIXES` +et ne sont accessibles que depuis la boucle locale. Un attaquant qui obtient un JWT via un tunnel Cloudflare/Ngrok ne peut pas utiliser le proxy pour accéder aux services intégrés. --- diff --git a/docs/i18n/fr/docs/frameworks/MEMORY.md b/docs/i18n/fr/docs/frameworks/MEMORY.md index addf38b71ed5..0f92c62047c1 100644 --- a/docs/i18n/fr/docs/frameworks/MEMORY.md +++ b/docs/i18n/fr/docs/frameworks/MEMORY.md @@ -170,33 +170,35 @@ La table `memory_vec_meta` (migration `083_memory_vec.sql`) stocke : ## Extension des paramètres -Neuf champs d’embedding et de stockage vectoriel sont disponibles dans `MemorySettingsExtended`, dans +Neuf champs d’intégration et de vecteurs sont disponibles dans `MemorySettingsExtended`, dans `src/shared/schemas/memory.ts`, et sont persistés via `src/lib/db/settings.ts` : -| Champ | Type | Valeur par défaut | Description | -| ------------------------ | -------------------------------------------------- | ----------------- | ------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Source d’embedding à utiliser | -| `embeddingProviderModel` | `string \| null` | `null` | Fournisseur/modèle au format `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | URL de base d’un endpoint compatible OpenAI dédié à Memory | -| `customModelId` | `string \| null` | `null` | ID du modèle envoyé à l’endpoint personnalisé | -| `transformersEnabled` | `boolean` | `false` | Activation explicite de Transformers.js (MiniLM, ~400 Mo) | -| `staticEnabled` | `boolean` | `false` | Activation explicite du modèle local statique potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Active l’étape de reclassement (ajoute 200 à 500 ms/requête) | -| `rerankProviderModel` | `string \| null` | `null` | Fournisseur/modèle de reclassement au format `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend vectoriel à utiliser | +| Champ | Type | Valeur par défaut | Description | +| ------------------------ | -------------------------------------------------- | ----------------- | -------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Source d’intégration à utiliser | +| `embeddingProviderModel` | `string \| null` | `null` | Fournisseur/modèle au format `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | URL de base d’un endpoint compatible OpenAI réservé à Memory | +| `customModelId` | `string \| null` | `null` | ID du modèle envoyé à l’endpoint personnalisé | +| `transformersEnabled` | `boolean` | `false` | Activation facultative de Transformers.js (MiniLM, ~400 Mo) | +| `staticEnabled` | `boolean` | `false` | Activation facultative du modèle local statique potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Activer l’étape de reclassement (ajoute 200 à 500 ms/requête) | +| `rerankProviderModel` | `string \| null` | `null` | Fournisseur/modèle de reclassement au format `provider/model` | + +`rerankProviderModel` est résolu par `POST /v1/rerank` (appelé via l’interface de bouclage) ; il accepte donc tout ce que cette route accepte : un modèle cloud de reclassement sélectionné (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) ou un nœud fournisseur compatible OpenAI sous la forme `/` (par exemple `skilled-mini/bge-reranker-v2-m3` pour une machine TEI/Infinity). Les nœuds de bouclage sont toujours admissibles ; un nœud situé sur un autre hôte (LAN, Tailscale) nécessite en outre l’indicateur de fonctionnalité `RERANK_REMOTE_PROVIDER_NODES` et doit respecter la politique des URL sortantes des fournisseurs — voir [Indicateurs de fonctionnalité](../reference/FEATURE_FLAGS.md). Le sélecteur du tableau de bord répertorie les fournisseurs sélectionnés ainsi que les nœuds locaux ; toute chaîne `provider/model` valide peut être définie directement via `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend vectoriel à utiliser | Ces paramètres sont exposés via `GET /PUT /api/settings/memory` (schéma `MemorySettingsExtendedSchema`). Pour la source `remote`, Memory accepte également les paramètres facultatifs `customBaseUrl` et -`customModelId`. Ensemble, ils permettent de sélectionner un endpoint `/embeddings` -compatible OpenAI et un modèle sans modifier le registre global des embeddings. L’endpoint est -normalisé avant utilisation et vérifié par la politique relative aux URL sortantes du fournisseur : HTTP(S) est -obligatoire, les identifiants intégrés et les chaînes de requête sont rejetés, et les -adresses de métadonnées cloud restent bloquées. Les valeurs vides conservent le fournisseur sélectionné dans le registre. Les erreurs -renvoyées au tableau de bord sont assainies et les identifiants de l’endpoint ne sont jamais journalisés. - -> **TODO (D20) :** La portée `global` (partage des mémoires entre toutes les clés API) n’est pas -> implémentée dans cette version. Elle nécessite des modifications du schéma et un chemin de récupération +`customModelId`. Ensemble, ils sélectionnent un endpoint `/embeddings` compatible OpenAI +et un modèle sans modifier le registre global des intégrations. L’endpoint est +normalisé avant utilisation et vérifié par la politique des URL sortantes des fournisseurs : HTTP(S) est +requis, les identifiants intégrés et les chaînes de requête sont rejetés, et les adresses +des services de métadonnées cloud restent bloquées. Les valeurs vides conservent le fournisseur sélectionné dans le registre. Les erreurs +renvoyées au tableau de bord sont nettoyées et les identifiants de l’endpoint ne sont jamais consignés. + +> **À FAIRE (D20) :** La portée `global` (partage des mémoires entre toutes les clés d’API) n’est pas +> implémentée dans cette version. Elle nécessite des modifications du schéma ainsi qu’un chemin de récupération > global. À suivre séparément. ## Couches de stockage diff --git a/docs/i18n/fr/docs/guides/DOCKER_GUIDE.md b/docs/i18n/fr/docs/guides/DOCKER_GUIDE.md index 260d5a378af3..e3534ae48446 100644 --- a/docs/i18n/fr/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/fr/docs/guides/DOCKER_GUIDE.md @@ -25,7 +25,13 @@ --- -## Exécution rapide +## Démarrage rapide + +> **Auto-héberger en une seule commande ?** Consultez le +> [guide d’auto-hébergement](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (image publiée + +> Redis, accessible uniquement via l’interface de bouclage, sans choix de profil). Le démarrage rapide ci-dessous correspond à +> l’utilisation d’un conteneur unique pour les utilisateurs qui exécutent déjà Redis ailleurs. ```bash docker run -d \ diff --git a/docs/i18n/fr/docs/guides/TROUBLESHOOTING.md b/docs/i18n/fr/docs/guides/TROUBLESHOOTING.md index 0b7246d7ea85..b8e7f88e5c3b 100644 --- a/docs/i18n/fr/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/fr/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ Définissez ces variables dans l’environnement du processus OmniRoute (le dém --- -## Avertissements de npm install (ERESOLVE / pair / obsolète) +## Avertissements lors de npm install (ERESOLVE / dépendances pair / obsolète) -Lorsque vous exécutez `npm install -g omniroute`, vous pouvez voir une multitude d’avertissements tels que `npm warn ERESOLVE`, des notifications concernant les dépendances pair et des messages `deprecated`. **Ils sont attendus et sans conséquence.** L’installation a réussi si la sortie contient `added packages`. +Lorsque vous exécutez `npm install -g omniroute`, vous pouvez voir une multitude d’avertissements tels que `npm warn ERESOLVE`, des notifications concernant les dépendances pair et des messages `deprecated`. **Ces avertissements sont attendus et sans conséquence.** L’installation a réussi si la sortie contient `added packages`. -Ces avertissements proviennent de plages de versions obsolètes pour les dépendances pair de paquets tiers qu’OmniRoute ne contrôle pas : +Pour masquer les avertissements liés à la résolution des dépendances pair, utilisez la forme d’installation prise en charge par OmniRoute : -1. **`marked-terminal` demande `marked >=1 <16`, mais `marked@18` a été trouvé** — cela fonctionne correctement en pratique ; seule la plage de dépendances pair en amont est obsolète. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` masque uniquement les notifications `ERESOLVE` et celles concernant les dépendances pair. Les avis d’obsolescence restent visibles, car ils proviennent de paquets tiers transitifs ; ils n’indiquent pas que l’installation a échoué. + +Ces avertissements proviennent de plages de versions de dépendances pair obsolètes dans des paquets tiers qu’OmniRoute ne contrôle pas : + +1. **`marked-terminal` requiert `marked >=1 <16`, mais `marked@18` a été trouvé** — cela fonctionne correctement en pratique ; seule la plage de versions de la dépendance pair en amont est obsolète. 2. **`deprecated prebuild-install@7.1.3`** — un utilitaire transitif de récupération de binaires natifs. Il n’est pas utilisé pour installer la liaison de transport `wreq-js` épinglée et n’indique pas que la configuration - du transport du fournisseur de cookies web a échoué. + du transport du fournisseur web-cookie a échoué. -**Aucune action nécessaire** — ces avertissements ne peuvent pas être entièrement supprimés sans créer de fork des paquets en amont. +**Aucune action n’est nécessaire** — les avertissements ne peuvent pas être entièrement masqués sans créer de dérivations des paquets en amont. --- diff --git a/docs/i18n/fr/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/fr/docs/providers/CURSOR-API-KEY-AND-CLI.md index 71c58bf954e8..447d31c4fc5c 100644 --- a/docs/i18n/fr/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/fr/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -6,29 +6,29 @@ Deux façons de placer Cursor derrière OmniRoute sans session IDE : -1. **Fournisseur `cursor-api`** (carte « Cursor API », alias `cua`) : un fournisseur - à clé API qui contient une clé API utilisateur Cursor (`crsr_…`, générée sur - `https://cursor.com/dashboard/api`). Tout client OmniRoute peut alors accéder - aux modèles Cursor via `/v1/chat/completions` sous la forme `cursor-api/` - ou `cua/`, avec les couches habituelles de quota, de repli et de - journalisation. Le fournisseur IDE (`cursor`, session OAuth/IDE) reste inchangé. -2. **Relais direct de la CLI Cursor** : configurez la CLI Cursor (`agent`) pour - qu’elle utilise OmniRoute, afin que chaque RPC effectué par la CLI soit - authentifié avec une clé API OmniRoute, transmis à Cursor avec les - identifiants d’une connexion `cursor-api`, puis enregistré sur la page des - journaux. +1. **Fournisseur `cursor-api`** (carte « Cursor API », alias `cua`) : un + fournisseur à clé API qui stocke une clé API utilisateur Cursor (`crsr_…`, + générée sur `https://cursor.com/dashboard/api`). Tout client OmniRoute peut + alors accéder aux modèles Cursor via `/v1/chat/completions` sous la forme + `cursor-api/` ou `cua/`, avec les couches habituelles de quota, + de repli et de journalisation. Le fournisseur IDE (`cursor`, session + OAuth/IDE) reste inchangé. +2. **Relais du CLI Cursor** : configurez le CLI Cursor (`agent`) pour qu'il + utilise OmniRoute, afin que chaque RPC effectué par le CLI soit authentifié + avec une clé API OmniRoute, transféré à Cursor avec les identifiants d'une + connexion `cursor-api` et enregistré dans la page des journaux. ## Pourquoi la clé est échangée -`api2.cursor.sh` rejette une clé `crsr_…` brute utilisée comme jeton Bearer (401). -La CLI Cursor commence par envoyer la clé via une requête POST à +`api2.cursor.sh` rejette une clé `crsr_…` brute utilisée comme jeton Bearer +(401). Le CLI Cursor commence par envoyer la clé via POST à `/auth/exchange_user_api_key` et reçoit un JWT de session qui expire après une heure ; le `refreshToken` renvoyé possède la même valeur `exp`, de sorte que -l’actualisation nécessite un nouvel échange de la clé. +l'actualisation nécessite d'échanger de nouveau la clé. `open-sse/services/cursorApiKeyAuth.ts` effectue cet échange, met en cache un jeton de session par clé, procède à un nouvel échange cinq minutes avant -l’expiration et supprime le jeton mis en cache lorsque Cursor répond 401. -`CursorExecutor` l’appelle juste avant d’ouvrir le flux en amont pour les +l'expiration et supprime le jeton mis en cache lorsque Cursor répond 401. +`CursorExecutor` l'appelle juste avant d'ouvrir le flux en amont pour les connexions `cursor-api`. ## Le fournisseur `cursor-api` @@ -36,8 +36,8 @@ connexions `cursor-api`. Registre : `open-sse/config/providers/registry/cursor/index.ts` (`cursor_apiProvider`, `authType: "apikey"`, mêmes `format`, `baseUrl` et `models` que `cursor`). Carte du catalogue : -`src/shared/constants/providers/apikey/specialty-media.ts`. Table des exécuteurs : -`open-sse/executors/index.ts` (`"cursor-api"` / `cua` → +`src/shared/constants/providers/apikey/specialty-media.ts`. Table des +exécuteurs : `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). Tableau de bord : Fournisseurs → Cursor API → Ajouter une clé API. @@ -61,29 +61,42 @@ curl -sS http://localhost:20128/v1/chat/completions \ Remarques : -- La liste des modèles pour `cursor-api` provient du registre statique de Cursor - (la même liste que celle utilisée en dernier recours par le fournisseur IDE) ; - aucune installation de `cursor-agent` n’est nécessaire sur l’hôte OmniRoute. +- La liste des modèles pour `cursor-api` provient du registre statique de + Cursor (la même liste que celle utilisée en repli par le fournisseur IDE) ; + aucune installation de `cursor-agent` n'est nécessaire sur l'hôte OmniRoute. - `POST /api/providers/{id}/refresh-cursor` est réservé au fournisseur IDE - `cursor` ; les connexions `cursor-api` ne possèdent aucune session IDE à - renouveler. + `cursor` ; les connexions `cursor-api` n'ont aucune session IDE à renouveler. -## Relais direct de la CLI Cursor +## Identifiants natifs des modèles et niveau d'effort + +Pour `cursor` / `cu` et `cursor-api` / `cua`, le normaliseur partagé du niveau +d'effort Claude conserve intact l'identifiant du modèle demandé. Cursor peut +annoncer un suffixe tel que `-low` comme faisant partie d'un véritable +identifiant de modèle, plutôt que comme alias de niveau d'effort OmniRoute. +L'exécuteur Cursor préserve une correspondance exacte avec le catalogue actif ; +en l'absence de correspondance, son résolveur de modèle existant gère le repli +du suffixe vers un paramètre. + +Cela ne modifie pas la normalisation du niveau d'effort pour les routes Claude +directes, compatibles avec Claude ou Vertex. La disponibilité dépend toujours +du catalogue et des droits du compte Cursor sélectionné. + +## Transfert transparent de la CLI Cursor Route : `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Le préfixe `/api/cursor-cli/` est enregistré dans `src/shared/constants/publicApiRoutes.ts`, car le gestionnaire applique sa propre authentification : -| Chemin | Authentification attendue de la CLI | Action d’OmniRoute | -| ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Valide la clé, génère un JWT HS256 valable 1 h (signé avec `JWT_SECRET`) et le renvoie | -| tous les autres chemins (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Vérifie l’émetteur, l’audience et l’expiration, sélectionne une connexion `cursor-api` active, remplace l’en-tête Authorization par le jeton Cursor échangé et retransmet la réponse en flux | +| Chemin | Authentification attendue de la CLI | Action d’OmniRoute | +| ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Valide la clé, génère un JWT HS256 valable 1 h (signé avec `JWT_SECRET`) et le renvoie | +| tous les autres chemins (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Vérifie l’émetteur, l’audience et l’expiration, sélectionne une connexion `cursor-api` active, remplace l’en-tête Authorization par le jeton Cursor échangé et retransmet la réponse sous forme de flux | -La CLI décode `exp` à partir de tout jeton reçu. Lui fournir un jeton opaque -l’oblige donc à effectuer un nouvel échange avant presque chaque requête ; le -JWT généré évite ce problème. Une réponse 401 d’OmniRoute amène la CLI à -effectuer un nouvel échange. +La CLI décode `exp` à partir de tout jeton qu’elle reçoit ; lui fournir un +jeton opaque l’oblige donc à effectuer un nouvel échange avant presque chaque +requête. Le JWT généré évite ce problème. Une réponse 401 d’OmniRoute entraîne +un nouvel échange par la CLI. ### Configuration @@ -100,17 +113,17 @@ effectuer un nouvel échange. configuré séparément, et seuls les RPC du plan de contrôle passent par le point de terminaison. -3. Exécutez la CLI avec OmniRoute comme cible : +3. Exécutez la CLI avec OmniRoute : ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli - export CURSOR_API_KEY= - agent -p --trust "Reply with exactly OK" + export CURSOR_API_KEY= + agent -p --trust "Réponds exactement par OK" ``` Chaque étape apparaît dans les journaux avec le fournisseur `cursor-api`, le -type de requête `cursor-cli` et le chemin `/api/cursor-cli/`, attribuée à la -clé API OmniRoute et à la connexion qui l’a traitée. +type de requête `cursor-cli` et le chemin `/api/cursor-cli/`, attribuée à +la clé API OmniRoute et à la connexion qui l’a traitée. ### Modes d’échec @@ -118,9 +131,9 @@ clé API OmniRoute et à la connexion qui l’a traitée. | ------------------------------------------------ | ------------------------------------------------------ | | Clé OmniRoute inconnue et `REQUIRE_API_KEY=true` | 401 `unauthenticated` lors de l’échange | | `REQUIRE_API_KEY=false` | session anonyme (reproduit le comportement de `/v1/*`) | -| JWT de session expiré / étranger / altéré | 401, la CLI effectue un nouvel échange | -| Clé API OmniRoute révoquée après l’échange | 401 lors du prochain RPC | +| JWT de session expiré, étranger ou falsifié | 401, la CLI effectue un nouvel échange | +| Clé API OmniRoute révoquée après l’échange | 401 lors du RPC suivant | | Aucune connexion `cursor-api` active | 503 `unavailable` | -| Cursor rejette la clé de la connexion | 401 `unauthenticated`, session en cache supprimée | -| Service en amont inaccessible | 502 `unavailable` (message nettoyé) | +| Cursor rejette la clé de la connexion | 401 `unauthenticated`, session mise en cache supprimée | +| Serveur en amont inaccessible | 502 `unavailable` (message expurgé) | | `JWT_SECRET` non défini | 503 lors de l’échange | diff --git a/docs/i18n/fr/docs/reference/API_REFERENCE.md b/docs/i18n/fr/docs/reference/API_REFERENCE.md index 1fed15c1ca00..13244c780443 100644 --- a/docs/i18n/fr/docs/reference/API_REFERENCE.md +++ b/docs/i18n/fr/docs/reference/API_REFERENCE.md @@ -408,18 +408,18 @@ Utilisez ce point de terminaison lorsqu’un side-car s’exécute dans un proce | ------- | ----------------------------------------- | ------------------------------------ | | POST | `/v1/chat/completions` | OpenAI | | POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/responses` | Réponses OpenAI | | POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (édition/inpainting) | +| POST | `/v1/images/generations` | Images OpenAI | +| POST | `/v1/images/edits` | Images OpenAI (édition/inpainting) | | POST | `/v1/videos/generations` | Génération vidéo de style OpenAI | | POST | `/v1/music/generations` | Génération musicale de style OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (reconnaissance vocale) | -| POST | `/v1/audio/speech` | OpenAI TTS (renvoie un corps audio) | +| POST | `/v1/audio/transcriptions` | Audio OpenAI (STT) | +| POST | `/v1/audio/speech` | TTS OpenAI (renvoie le corps audio) | | POST | `/v1/rerank` | Reclassement de style Cohere/Voyage | | POST | `/v1/classify` | Classification Jina (`api.jina.ai`) | | POST | `/v1/segment` | Segmenteur Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | +| POST | `/v1/moderations` | Modérations OpenAI | | GET | `/v1/models` | OpenAI | | POST | `/v1/messages/count_tokens` | Anthropic | | GET | `/v1beta/models` | Gemini | @@ -428,16 +428,16 @@ Utilisez ce point de terminaison lorsqu’un side-car s’exécute dans un proce | GET | `/api/v1/vscode/{token}/` | Alias du catalogue OpenAI | | GET | `/api/v1/vscode/{token}/models` | Alias des modèles OpenAI | | POST | `/api/v1/vscode/{token}/chat/completions` | Alias OpenAI avec jeton | -| POST | `/api/v1/vscode/{token}/responses` | Alias OpenAI Responses avec jeton | +| POST | `/api/v1/vscode/{token}/responses` | Alias des réponses OpenAI avec jeton | | POST | `/api/v1/vscode/{token}/api/chat` | Alias Ollama avec jeton | | GET | `/api/v1/vscode/{token}/api/tags` | Alias des balises Ollama avec jeton | -Toutes les routes POST suivent la même structure : `Bearer your-api-key` + corps JSON validé par Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, etc., voir `src/shared/validation/schemas.ts`). Une erreur 4xx est renvoyée en cas d’échec de validation du schéma. +Toutes les routes POST suivent la même structure : `Bearer your-api-key` + un corps JSON validé par Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, etc., voir `src/shared/validation/schemas.ts`). Une réponse 4xx est renvoyée en cas d’échec de validation du schéma. -Pour les clients qui ne peuvent pas joindre `Authorization: Bearer ...`, OmniRoute accepte également les clés API dans l’URL, soit via les paramètres de requête compatibles (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), soit via les points de terminaison dédiés `/api/v1/vscode/{token}/...` documentés ci-dessous. +Pour les clients qui ne peuvent pas joindre `Authorization: Bearer ...`, OmniRoute accepte également les clés d’API dans l’URL, soit via des paramètres de requête de compatibilité (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), soit via les points de terminaison dédiés `/api/v1/vscode/{token}/...` documentés ci-dessous. ```bash -# Reclassement +# Reclassement (fournisseur du registre cloud ou nœud fournisseur compatible OpenAI sous la forme "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # Classification Jina (identifiants de l’API Foundation) @@ -452,7 +452,7 @@ POST /v1/search { "query": "...", "provider": "jina-search" } # Modérations POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — renvoie un corps audio/mpeg (ou dans le format demandé) +# TTS — renvoie un corps audio/mpeg (ou au format demandé) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Édition d’image (multipart) @@ -463,6 +463,28 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Nœuds fournisseurs de reclassement :** `POST /v1/rerank` achemine également les requêtes vers des nœuds fournisseurs compatibles OpenAI +> (oMLX, vLLM, Infinity, TEI derrière une passerelle, …) désignés sous la forme `/`. Les nœuds +> de bouclage (`localhost`, `127.0.0.1`, `172.16.0.0/12`) sont toujours admissibles. Les nœuds situés sur tout autre +> hôte — une machine du réseau local ou un pair Tailscale — ne sont admissibles que lorsque l’opérateur active +> l’indicateur de fonctionnalité `RERANK_REMOTE_PROVIDER_NODES` **et** que l’URL de base du nœud satisfait à la politique +> relative aux URL sortantes du fournisseur (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) ; +> les hôtes de métadonnées cloud ne sont jamais utilisés pour le routage. L’étape de reclassement du moteur de mémoire appelle cette route via +> l’interface de bouclage ; la même règle régit donc `rerankProviderModel` dans les paramètres de mémoire. +> +> **Structures des serveurs locaux :** le nœud est appelé à l’adresse `/v1/rerank` et, en cas de réponse 404, à l’adresse `/rerank` +> (Infinity, TEI). Le corps envoyé en amont contient à la fois la nomenclature Cohere/OpenAI (`documents`, +> `return_documents`) et la nomenclature TEI (`texts`, `return_text`), et la réponse en amont est +> normalisée dans l’enveloppe Cohere : le tableau brut de TEI `[{index, score, text}]`, la structure `{results: [{index, score}]}` +> provenant de passerelles légères et la structure de style Voyage `{data: [...]}` sont tous renvoyés au client sous la forme +> `{results: [{index, relevance_score, document?}]}`, triés par score et limités à `top_n`. + +> **Découverte des nœuds fournisseurs :** les modèles d’un nœud fournisseur compatible OpenAI apparaissent dans `GET /v1/models` +> sous le préfixe du nœud. Les lignes dépourvues de métadonnées de point de terminaison (cas typique des listes locales `/v1/models`) +> héritent de l’`apiType` du nœud, de sorte que les modèles d’un nœud `embeddings` ont `type: "embedding"` et ceux d’un +> nœud `rerank` ont `type: "rerank"` au lieu d’utiliser le chat par défaut ; un champ +> `supportedEndpoints` explicite sur une ligne synchronisée ou ajoutée manuellement reste prioritaire. + ### Routes dédiées aux fournisseurs ```bash @@ -471,7 +493,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Le préfixe du fournisseur est ajouté automatiquement s’il est absent. Les modèles incompatibles renvoient `400`. +Le préfixe du fournisseur est ajouté automatiquement s’il est absent. Les modèles incompatibles renvoient une erreur `400`. --- diff --git a/docs/i18n/fr/docs/reference/ENVIRONMENT.md b/docs/i18n/fr/docs/reference/ENVIRONMENT.md index e6d10bb0729d..e3f64f3502d5 100644 --- a/docs/i18n/fr/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/fr/docs/reference/ENVIRONMENT.md @@ -79,60 +79,59 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. Stockage et base de données -OmniRoute utilise **SQLite** (via `better-sqlite3`) pour toute la persistance. Ces variables contrôlent l’emplacement des données, le chiffrement et leur cycle de vie. - -| Variable | Valeur par défaut | Fichier source | Description | -| ------------------------------------------ | ---------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Répertoire racine de la base de données SQLite, des sauvegardes et des fichiers de données. Remplacez cette valeur pour les volumes Docker ou les chemins personnalisés. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(non définie)_ | `src/lib/dataPaths.ts` | Échappatoire pour la protection de `DATA_DIR` lors des tests/évaluations (#10428). Les tests et les sondes d’évaluation/d’affichage Node (`-e`/`--eval`/`-p`/`--print`, y compris les formes `--eval=`/`--print=`) sans `DATA_DIR` sont redirigés vers un répertoire temporaire jetable afin qu’ils ne puissent pas ouvrir la véritable base de données de l’opérateur ; définissez cette variable sur `1` pour réutiliser le véritable répertoire. | -| `OMNIROUTE_BUILD_SHA` | _(non définie)_ | `src/lib/monitoring/buildSha.ts` | SHA Git de l’artefact en cours d’exécution. Inscrit par `npm run build:release` ; peut être injecté dans les conteneurs livrés sans le fichier sentinelle `dist/BUILD_SHA`. Exposé sous la forme `system.buildSha` sur `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Référence par rapport à laquelle le contrôle de provenance de l’artefact empaqueté vérifie le SHA du build (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(non définie)_ | `scripts/build/buildProvenance.ts` | Définissez cette variable sur `1` pour autoriser l’empaquetage d’un build dont le SHA ne se trouve pas sur la branche de publication, en l’enregistrant comme version canari intentionnelle au lieu de faire échouer le contrôle (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(non définie)_ | `scripts/ops/deploy-canary.mjs` | Clé API pour la sonde de validation rapide du déploiement canari, envoyée sous la forme `Authorization: Bearer` à `/v1/chat/completions`. Utilisée uniquement par le script de déploiement (#10429), jamais par le serveur. Sans rapport avec les variables `OMNIROUTE_SMOKE_*` du banc de validation rapide CLI activé explicitement (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` dans `tests/integration/upstream-cli-smoke.int.test.ts`) — voir [Intégrations CLI → Passe de validation rapide réelle](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(non définie)_ | `src/lib/buildPhase.ts` | Signal de phase de build (#10060) : défini sur `1` par `scripts/build/build-next-isolated.mjs` et hérité par chaque processus de build lancé, afin que la couche de base de données renvoie un substitut sans effet au lieu de charger le module complémentaire natif `better-sqlite3` (qui interrompt le processus à sa fermeture). Jamais défini pour le serveur en cours d’exécution. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Définissez cette variable sur `1` pour ignorer la vérification préalable facultative des dépendances natives pour les arborescences fournies particulièrement atypiques. Cela ne permet pas de compiler avec une dépendance manquante ; utilisez cette option uniquement lorsque les dépendances natives sont fournies séparément. | -| `OMNIROUTE_DATA_DIR` | _(non définie)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias de repli** pour `DATA_DIR`, vérifié uniquement lorsque `DATA_DIR` n’est pas définie. Sert à localiser le cache sur disque des sessions liées aux fils d’exécution de l’exécuteur PromptQL (`/promptql-thread-sessions.json`) ; si aucune des deux variables n’est définie, le cache reste uniquement en mémoire (et n’est pas conservé entre les redémarrages). | -| `OMNIROUTE_PLUGINS_DIR` | _(non définie)_ | `src/lib/plugins/scanner.ts` | Répertoire lu par le **scanner de plugins à l’exécution**, et répertoire racine dans lequel le gestionnaire de plugins effectue les installations, en remplacement de la valeur par défaut dérivée du répertoire personnel (#11827). Faites-le pointer vers l’arborescence de plugins montée par liaison dans Docker/K8s au lieu de déplacer `HOME` uniquement pour relocaliser le chemin d’analyse (`HOME` régit également tous les autres comportements relatifs au répertoire personnel). Non définie = `~/.omniroute/plugins`, ou `/tmp/.omniroute/plugins` lorsque le processus n’exporte aucun répertoire personnel — ce qui évite l’absence silencieuse de détection. Le répertoire résolu est journalisé une fois au démarrage sous `scanner.dir_resolved`, avec l’entrée retenue. Côté serveur uniquement : les plugins de commandes CLI conservent leur propre `OMNIROUTE_PLUGIN_PATH` (section 9). | -| `STORAGE_ENCRYPTION_KEY` | _(vide = désactivé)_ | `src/lib/db/encryption.ts` | Clé AES pour le chiffrement au repos de l’ensemble de la base de données SQLite. Générez-la avec `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Étiquette de version de la clé de chiffrement. Incrémentez-la lors d’une rotation de clé afin de permettre le déchiffrement des anciennes sauvegardes. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Lorsque cette option vaut `true`, ignore les sauvegardes de routine/avant écriture du fichier SQLite (enregistrement/suppression des tarifs models.dev, écritures des paramètres). Les sauvegardes manuelles et celles effectuées avant une restauration restent actives. Elle ne désactive **pas** l’instantané de sécurité durable obligatoire de l’outil d’exécution des migrations ni la protection contre les migrations massives pour une base de données persistante existante. Les sauvegardes non manuelles sont limitées à une toutes les 60 minutes au maximum. Dans le tableau de bord, **Paramètres → Stockage** permet de désactiver indépendamment la sauvegarde automatique de routine. | -| `OMNIROUTE_CRYPT_KEY` | _(non définie)_ | `src/lib/db/encryption.ts` | **Alias hérité** de `STORAGE_ENCRYPTION_KEY`. Accepté comme valeur de secours lorsque la variable principale est absente. | -| `OMNIROUTE_API_KEY_BASE64` | _(non définie)_ | `src/lib/db/encryption.ts` | **Alias hérité** (forme encodée en Base64) accepté comme valeur de secours. Décodé automatiquement avant utilisation. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(non définie)_ | `src/lib/db/core.ts` | Remplace l’intervalle de vérification périodique de l’état de SQLite (ms). Lorsqu’elle n’est pas définie, les valeurs par défaut sont déterminées à partir de `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/walMaintenance.ts` | Remplace l’intervalle périodique de `wal_checkpoint(TRUNCATE)` (ms). Le point de contrôle automatique ne réduit jamais le fichier WAL lui-même, et un serveur s’exécutant sur une longue durée ne ferme jamais sa base de données. `0` désactive cette fonctionnalité. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Remplace l’intervalle fréquent de `wal_checkpoint(PASSIVE)` (ms). Maintient à un faible niveau le nombre de trames WAL en attente afin que l’opération TRUNCATE périodique ne copie jamais un volume en attente de plusieurs Go sur le thread principal. `0` désactive cette fonctionnalité. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Lorsqu’une exécution PASSIVE détecte que le fichier WAL dépasse cette taille, passe immédiatement à `wal_checkpoint(TRUNCATE)` au lieu d’attendre l’exécution moins fréquente. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Définissez cette option sur `1`/`true`/`yes`/`on` pour quitter le processus après le maintien d’une pression critique sur les ressources pendant `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, afin de permettre à un superviseur (systemd `Restart=always`, politique de redémarrage Docker) de relancer un processus sain au lieu de renvoyer indéfiniment des erreurs 503. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Durée pendant laquelle la pression critique doit persister avant le déclenchement de la sortie avec redémarrage automatique. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(détection automatique)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Chemin explicite (absolu ou relatif au répertoire de travail actuel) vers `sql-wasm.wasm` lors de l’utilisation de l’adaptateur de secours WASM `sql.js`. Lorsqu’il n’est pas défini, il est détecté automatiquement à partir des dépendances du package et des structures de répertoires possibles. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 h) | `src/lib/db/core.ts` | Remplace l’intervalle périodique de `wal_checkpoint(TRUNCATE)` (ms). Le point de contrôle automatique ne réduit jamais le fichier WAL lui-même, et un serveur s’exécutant sur une longue durée ne ferme jamais sa base de données. `0` désactive cette fonctionnalité. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Nombre de jours pendant lesquels les points de contrôle, les fichiers d’entrée/de sortie/d’erreur référencés et la ligne d’une tâche de l’API Batch arrivée à un état terminal (terminée/échouée/annulée/expirée) sont conservés avant leur suppression par le nettoyage automatique. Cette option ne prend effet qu’une fois `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` activée ; elle correspond à la période de conservation des sorties de l’API Batch d’OpenAI. Elle n’affecte pas la route `DELETE /api/v1/batches/delete-completed` déclenchée par l’opérateur, qui reste inconditionnelle (sans filtre d’ancienneté) par conception. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Lorsque cette option est définie sur `true`, permet au nettoyage automatique de supprimer les tâches Batch API terminées (ainsi que leurs points de contrôle) datant de plus de `OMNIROUTE_BATCH_RETENTION_DAYS`, et d’effacer le contenu BLOB des fichiers téléversés ayant dépassé leur propre date `expires_at`. Désactivée par défaut : chaque installation existante conserve ces données exactement comme auparavant, jusqu’à ce qu’un opérateur active cette option. Également modifiable depuis le tableau de bord en tant qu’indicateur de fonctionnalité — voir `docs/reference/FEATURE_FLAGS.md` → Exécution. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Définissez cette variable sur `1` pour ignorer entièrement le contrôle d’intégrité de la base de données au démarrage. Utile pour les tâches de courte durée et les tests d’intégration. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Définissez cette variable sur `1` pour forcer l’activation de la boucle de contrôle d’intégrité de la base de données, même lorsqu’elle serait normalement ignorée (par exemple, pour les tâches de courte durée). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Définissez cette variable sur `1` pour ignorer le préchauffage de l’environnement d’exécution natif pendant `npm install`. Utile dans les installations CI/sans interface graphique où sqlite est déjà compilé. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(détection automatique)_ | `src/lib/db/migrationRunner.ts` | Remplace le répertoire analysé par l’exécuteur de migrations. Utile lors de la livraison de migrations groupées dans des versions personnalisées. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(non définie)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Répertoires de migration supplémentaires sous forme d’entrées `namespace=dir` séparées par le délimiteur de chemins de la plateforme (par exemple `ee=/opt/app/enterprise/db/migrations`). Les fichiers qui s’y trouvent sont enregistrés sous la forme `-`, afin qu’une distribution fournissant ses propres migrations n’entre jamais en conflit avec les emplacements numériques du projet en amont. Une entrée mal formée, un espace de noms non valide ou un répertoire manquant provoque une erreur au démarrage au lieu d’ignorer silencieusement le schéma. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Seuil de sécurité pour un grand nombre de migrations en attente (#3416). Le démarrage est interrompu si le nombre de migrations en attente dépasse ce seuil sur une base de données existante (protection contre l’effacement de la table de suivi). Augmentez-le pour restaurer une sauvegarde plus ancienne ; définissez-le sur `0` pour désactiver le contrôle. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Répertoire de travail pour la validation de version `check:install-upgrade`. Elle nécessite environ 12 Go (deux arborescences d’installation d’environ 3 Go plus l’archive tar) et ne doit donc pas être exécutée sur un petit tmpfs — sur l’exécuteur autohébergé, `/tmp` est un tmpfs de 12 Go stocké en mémoire vive, que la validation a saturé, ce qui a tronqué le paquet. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(valeur par défaut dans le code)_ | `src/lib/spend/batchWriter.ts` | Intervalle de vidage (ms) pour l’enregistreur groupé des dépenses/coûts. Des valeurs plus faibles réduisent le regroupement des écritures ; des valeurs plus élevées réduisent la contention sur la base de données. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(valeur par défaut dans le code)_ | `src/lib/spend/batchWriter.ts` | Nombre maximal d’entrées de dépenses mises en mémoire tampon avant un vidage forcé. Augmentez cette valeur pour les déploiements à QPS élevé ; réduisez-la lorsque la limitation de la mémoire est prioritaire. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(non définie)_ | `open-sse/utils/proxyFetch.ts` | Définissez cette variable sur `"true"` pour émettre les journaux de débogage `[ProxyFetch]` sur le chemin de relais Vercel. Désactivée par défaut pour éviter de divulguer des indications de routage. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Définissez cette variable sur `"true"` ou `"1"` pour inclure les adresses IP du client/de sortie et le préfixe du compte dans la ligne détaillée du journal de processus `[ProxyEgress]`. Cette option reste DÉSACTIVÉE par défaut afin que le journal de processus ne divulgue ni les adresses IP ni le préfixe du compte. | -| `OMNIROUTE_DEBUG` | _(non définie)_ | `bin/cli/commands/quota.mjs` | Définissez cette variable sur `1` pour afficher dans stderr les diagnostics de durée de chaque requête (`[omniroute] GET completed in Nms`) depuis les commandes de quota de la CLI. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(automatique)_ | `scripts/dev/healthcheck.mjs` | Chemin explicite sondé par le contrôle d’intégrité du conteneur. Si cette variable n’est pas définie, la sonde le déduit de `OMNIROUTE_BASE_PATH` ; la définir réactive le point de terminaison de surveillance approfondie. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(non définie)_ | `bin/cli/commands/completion.mjs` | Définissez cette variable sur n’importe quelle valeur non vide pour émettre les diagnostics `[omniroute completion]` depuis les chemins de cache de complétion shell de la CLI (lecture/actualisation/écriture). Désactivée par défaut — les échecs de ces caches restent silencieux afin qu’un cache manquant/corrompu ne perturbe jamais la complétion par tabulation. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Fenêtre maximale de nouvelle tentative pour les éléments individuels d’un lot (ms). Les éléments dépassant cette durée sont marqués comme ayant échoué. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Délai de base (ms) pour le délai exponentiel entre les nouvelles tentatives des éléments d’un lot. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Plafond (ms) du délai exponentiel entre les nouvelles tentatives des éléments d’un lot. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Nombre maximal de lots traités simultanément. Augmentez cette valeur pour accroître le débit ; conservez une valeur faible pour éviter les rafales de dépassement de limite. | +OmniRoute utilise **SQLite** (via `better-sqlite3`) pour toute la persistance. Ces variables contrôlent l’emplacement des données, leur chiffrement et leur cycle de vie. + +| Variable | Valeur par défaut | Fichier source | Description | +| ------------------------------------------ | ---------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Répertoire racine de la base de données SQLite, des sauvegardes et des fichiers de données. Remplacez cette valeur pour utiliser des volumes Docker ou des chemins personnalisés. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(non définie)_ | `src/lib/dataPaths.ts` | Échappatoire pour la protection DATA_DIR des tests/évaluations (#10428). Les tests et les sondes d’évaluation/d’affichage Node (`-e`/`--eval`/`-p`/`--print`, y compris les formes `--eval=`/`--print=`) sans `DATA_DIR` sont redirigés vers un répertoire temporaire jetable afin qu’ils ne puissent pas ouvrir la véritable base de données de l’opérateur ; définissez cette variable sur `1` pour réutiliser le véritable répertoire. | +| `OMNIROUTE_BUILD_SHA` | _(non définie)_ | `src/lib/monitoring/buildSha.ts` | SHA Git de l’artefact en cours d’exécution. Inscrit par `npm run build:release` ; peut être injecté dans les conteneurs livrés sans la sentinelle `dist/BUILD_SHA`. Exposé sous la forme `system.buildSha` sur `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Référence par rapport à laquelle le contrôle de provenance de l’artefact empaqueté vérifie le SHA de la build (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(non définie)_ | `scripts/build/buildProvenance.ts` | Définissez cette variable sur `1` pour autoriser l’empaquetage d’une build dont le SHA ne se trouve pas sur la branche de publication, en l’enregistrant comme version canary délibérée au lieu de faire échouer le contrôle (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(non définie)_ | `scripts/ops/deploy-canary.mjs` | Clé API de la sonde de vérification rapide du déploiement canary, envoyée sous la forme `Authorization: Bearer` sur `/v1/chat/completions`. Utilisée uniquement par le script de déploiement (#10429), jamais par le serveur. Sans rapport avec les variables `OMNIROUTE_SMOKE_*` du banc de vérification rapide en CLI à activation explicite (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` dans `tests/integration/upstream-cli-smoke.int.test.ts`) — voir [Intégrations CLI → Vérification rapide réelle](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(non définie)_ | `src/lib/buildPhase.ts` | Signal de phase de build (#10060) : défini sur `1` par `scripts/build/build-next-isolated.mjs` et hérité par chaque worker de build lancé, afin que la couche de base de données renvoie un stub sans opération au lieu de charger l’extension native better-sqlite3 (qui interrompt le worker à sa fermeture). Jamais défini pour le serveur en cours d’exécution. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Définissez cette variable sur `1` pour ignorer la vérification préalable facultative des dépendances natives pour les arborescences de dépendances intégrées inhabituelles. Cela ne permet pas de compiler en cas de dépendance manquante ; utilisez cette option uniquement lorsque les dépendances natives sont fournies hors bande. | +| `OMNIROUTE_DATA_DIR` | _(non définie)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias de secours** pour `DATA_DIR`, vérifié uniquement lorsque `DATA_DIR` n’est pas définie. Utilisé pour localiser le cache sur disque des sessions persistantes par fil d’exécution de PromptQL (`/promptql-thread-sessions.json`) ; si aucune des deux variables n’est définie, le cache reste uniquement en mémoire (il n’est pas conservé entre les redémarrages). | +| `OMNIROUTE_PLUGINS_DIR` | _(non définie)_ | `src/lib/plugins/scanner.ts` | Répertoire lu par le **scanner de plugins à l’exécution** — et répertoire racine dans lequel le gestionnaire de plugins effectue les installations — remplaçant la valeur par défaut dérivée du répertoire personnel (#11827). Faites-le pointer vers l’arborescence de plugins montée par liaison dans Docker/K8s au lieu de déplacer HOME uniquement pour relocaliser le chemin d’analyse (HOME régit également tous les autres comportements relatifs au répertoire personnel). Non définie = `~/.omniroute/plugins`, ou `/tmp/.omniroute/plugins` lorsque le processus n’exporte aucun répertoire personnel — ce qui élimine l’absence silencieuse de détection. Le répertoire résolu est journalisé une fois au démarrage sous la forme `scanner.dir_resolved`, avec l’entrée retenue. Côté serveur uniquement : les plugins de commandes CLI conservent leur propre `OMNIROUTE_PLUGIN_PATH` (section 9). | +| `STORAGE_ENCRYPTION_KEY` | _(vide = désactivé)_ | `src/lib/db/encryption.ts` | Clé AES pour le chiffrement au repos de l’intégralité de la base de données SQLite. Générez-la avec `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Étiquette de version de la clé de chiffrement. Incrémentez-la lors d’une rotation de clé afin de permettre le déchiffrement des anciennes sauvegardes. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Lorsque la valeur est `true`, ignore les sauvegardes régulières/avant écriture du fichier SQLite (enregistrement/suppression des tarifs models.dev, écritures des paramètres). Les sauvegardes manuelles et celles précédant une restauration sont toujours effectuées. Cela ne désactive **pas** l’instantané de sécurité durable obligatoire du gestionnaire de migrations ni la protection contre les migrations massives pour une base de données persistante existante. Les sauvegardes non manuelles sont limitées à une au maximum toutes les 60 minutes. L’option **Paramètres → Stockage** du tableau de bord permet de désactiver indépendamment la sauvegarde automatique régulière. | +| `OMNIROUTE_CRYPT_KEY` | _(non définie)_ | `src/lib/db/encryption.ts` | **Alias hérité** de `STORAGE_ENCRYPTION_KEY`. Accepté comme solution de repli lorsque la variable principale est absente. | +| `OMNIROUTE_API_KEY_BASE64` | _(non définie)_ | `src/lib/db/encryption.ts` | **Alias hérité** (forme encodée en Base64) accepté comme solution de repli. Décodé automatiquement avant utilisation. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(non définie)_ | `src/lib/db/core.ts` | Remplace l’intervalle de vérification périodique de l’état de SQLite (ms). Lorsque cette variable n’est pas définie, les valeurs par défaut sont dérivées de `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(supprimée)_ | `src/lib/db/walMaintenance.ts` | **Supprimée.** Un appel périodique à chaud de `wal_checkpoint(TRUNCATE)` peut invalider le mappage partagé de wal-index et provoquer l’arrêt brutal du processus avec SIGBUS (#13973) ; le planificateur n’existe donc plus. La variable est sans effet : une valeur positive consigne une seule fois un avertissement d’obsolescence, tandis que `0` ou une variable non définie ne produit aucun message. Le WAL est maintenu par des points de contrôle PASSIVE (ci-dessous) et tronqué par le point de contrôle lors de l’arrêt. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 min) | `src/lib/db/walMaintenance.ts` | Remplace l’intervalle fréquent de `wal_checkpoint(PASSIVE)` (ms). Maintient un faible nombre de trames WAL en attente afin que les points de contrôle restent rapides et que la taille du fichier WAL demeure limitée entre les troncatures effectuées lors des arrêts. `0` désactive cette fonction. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Lorsqu’une exécution PASSIVE détecte que le fichier WAL dépasse cette taille, exécute `wal_checkpoint(RESTART)` afin que le WAL reparte de zéro sans réécrire le wal-index mappé. Les points de contrôle à chaud en mode troncature ont été supprimés (voir la ligne `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Définissez cette variable sur `1`/`true`/`yes`/`on` pour quitter le processus après le maintien d’une pression critique sur les ressources pendant `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, afin de permettre à un superviseur (systemd `Restart=always`, politique de redémarrage Docker) de relancer un processus sain au lieu de renvoyer indéfiniment des erreurs 503. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 min) | `open-sse/utils/resourcePressure.ts` | Durée pendant laquelle la pression critique doit persister avant le déclenchement de la sortie avec auto-redémarrage. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(détection automatique)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Chemin explicite (absolu ou relatif au répertoire de travail courant) vers `sql-wasm.wasm` lors de l’utilisation de l’adaptateur de repli WASM `sql.js`. Lorsque cette variable n’est pas définie, le chemin est détecté automatiquement à partir des dépendances des packages et des structures de répertoires candidates. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Nombre de jours pendant lesquels les points de contrôle, les fichiers d’entrée/de sortie/d’erreur référencés et la ligne d’une tâche Batch API terminale (terminée/échouée/annulée/expirée) sont conservés avant leur suppression par le nettoyage automatique. Ne prend effet qu’une fois `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` activée ; correspond à la période de conservation des sorties de la Batch API d’OpenAI. N’affecte pas la route `DELETE /api/v1/batches/delete-completed` déclenchée par l’opérateur, qui reste inconditionnelle (sans filtre d’ancienneté) par conception. | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Lorsque la valeur est `true`, autorise le nettoyage automatique à supprimer les tâches Batch API terminales (ainsi que leurs points de contrôle) ayant dépassé `OMNIROUTE_BATCH_RETENTION_DAYS`, et à effacer le contenu BLOB des fichiers téléversés ayant dépassé leur propre valeur `expires_at`. Désactivée par défaut : chaque installation existante conserve ces données exactement comme auparavant jusqu’à ce qu’un opérateur choisisse d’activer cette fonction. Il s’agit également d’un indicateur de fonctionnalité modifiable depuis le tableau de bord — voir `docs/reference/FEATURE_FLAGS.md` → Exécution. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Définissez sur `1` pour ignorer entièrement le contrôle d’intégrité de la base de données au démarrage. Utile pour les tâches de courte durée et les tests d’intégration. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Définissez sur `1` pour forcer l’activation de la boucle de contrôle d’intégrité de la base de données, même lorsqu’elle serait normalement ignorée (par exemple, pour les tâches de courte durée). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Définissez sur `1` pour ignorer le préchauffage de l’environnement d’exécution natif pendant `npm install`. Utile dans les installations CI/sans interface graphique où sqlite est déjà compilé. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(détection automatique)_ | `src/lib/db/migrationRunner.ts` | Remplacez le répertoire analysé par l’outil d’exécution des migrations. Utile lors de la livraison de migrations groupées dans des versions personnalisées. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(non défini)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Répertoires de migration supplémentaires sous forme d’entrées `namespace=dir` séparées par le délimiteur de chemin de la plateforme (par exemple `ee=/opt/app/enterprise/db/migrations`). Les fichiers qui s’y trouvent sont enregistrés sous la forme `-`, afin qu’une distribution fournissant ses propres migrations n’entre jamais en conflit avec les emplacements numériques en amont. Une entrée mal formée, un espace de noms non valide ou un répertoire manquant provoque une erreur au démarrage au lieu d’ignorer silencieusement le schéma. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Seuil de sécurité pour les migrations en attente en masse (#3416). Le démarrage est interrompu si plus de ce nombre de migrations sont en attente sur une base de données existante (protection contre l’effacement d’une table de suivi). Augmentez-le pour restaurer une ancienne sauvegarde ; définissez-le sur `0` pour désactiver la vérification. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Répertoire de travail pour la barrière de validation de version `check:install-upgrade`. Il nécessite environ 12 Go (deux arborescences d’installation d’environ 3 Go chacune, plus l’archive tar), et ne doit donc pas être exécuté sur un petit tmpfs — sur le runner auto-hébergé, `/tmp` est un tmpfs de 12 Go soutenu par la RAM, que la barrière de validation a saturé, tronquant ainsi le package. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(valeur par défaut dans le code)_ | `src/lib/spend/batchWriter.ts` | Intervalle de vidage (ms) pour l’outil d’écriture groupée des dépenses/coûts. Des valeurs plus faibles réduisent le regroupement des écritures ; des valeurs plus élevées réduisent les conflits d’accès à la base de données. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(valeur par défaut dans le code)_ | `src/lib/spend/batchWriter.ts` | Nombre maximal d’entrées de dépenses mises en mémoire tampon avant un vidage forcé. Augmentez-le pour les déploiements à QPS élevé ; réduisez-le lorsque la limitation de la mémoire est prioritaire. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(non défini)_ | `open-sse/utils/proxyFetch.ts` | Définissez sur `"true"` pour émettre les journaux de débogage `[ProxyFetch]` sur le chemin de relais Vercel. Désactivé par défaut pour éviter de divulguer des indices de routage. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Définissez sur `"true"` ou `"1"` pour inclure les adresses IP du client/de sortie et le préfixe du compte dans la ligne détaillée `[ProxyEgress]` du journal de processus. Désactivé par défaut afin que le journal de processus ne divulgue ni les adresses IP ni le préfixe du compte. | +| `OMNIROUTE_DEBUG` | _(non défini)_ | `bin/cli/commands/quota.mjs` | Définissez sur `1` pour afficher dans stderr les diagnostics de durée par requête (`[omniroute] GET completed in Nms`) à partir des commandes de quota de la CLI. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(automatique)_ | `scripts/dev/healthcheck.mjs` | Chemin explicite interrogé par le contrôle d’intégrité du conteneur. Lorsqu’il n’est pas défini, la sonde le déduit de `OMNIROUTE_BASE_PATH` ; le définir réactive le point de terminaison de surveillance approfondie. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(non défini)_ | `bin/cli/commands/completion.mjs` | Définissez sur n’importe quelle valeur non vide pour émettre les diagnostics `[omniroute completion]` à partir des chemins de cache de complétion de shell de la CLI (lecture/actualisation/écriture). Désactivé par défaut — les échecs de ces caches sont silencieux afin qu’un cache manquant/corrompu n’empêche jamais la complétion par tabulation. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24 h) | `open-sse/services/batchProcessor.ts` | Fenêtre maximale de nouvelle tentative pour les éléments individuels d’un lot (ms). Les éléments qui dépassent cette durée sont marqués comme ayant échoué. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Délai de base (ms) pour le backoff exponentiel lors des nouvelles tentatives sur les éléments d’un lot. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 h) | `open-sse/services/batchProcessor.ts` | Limite (ms) du backoff exponentiel entre les nouvelles tentatives sur les éléments d’un lot. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Nombre maximal de lots traités simultanément. Augmentez cette valeur pour accroître le débit ; gardez-la basse pour éviter une avalanche de dépassements de limite de débit. | > [!IMPORTANT] -> Avant de modifier une base de données persistante existante, l’outil d’exécution des migrations publie un instantané complet, -> adressé par contenu, sous `DATA_DIR/db_backups/`. La publication nécessite un système de fichiers -> prenant en charge les liens physiques sans écrasement sur le même système de fichiers ainsi que la synchronisation durable des fichiers. Les hôtes POSIX nécessitent également -> la synchronisation des répertoires ; sous Windows, Node peut refuser les descripteurs de répertoire, OmniRoute vide donc -> le fichier publié et traite la synchronisation de l’entrée de répertoire comme une opération au mieux. +> Avant de modifier une base de données persistante existante, l’outil de migration publie un instantané complet, +> adressé par son contenu, sous `DATA_DIR/db_backups/`. La publication nécessite un système de fichiers +> prenant en charge les liens physiques sans écrasement sur un même système de fichiers, ainsi que la synchronisation durable des fichiers. Les hôtes POSIX +> nécessitent également la synchronisation des répertoires ; sous Windows, Node peut refuser les descripteurs de répertoire, de sorte qu’OmniRoute vide +> le fichier publié et traite la synchronisation des entrées de répertoire comme une opération au mieux. > Si le `DATA_DIR` monté ne peut pas fournir ces garanties, le démarrage échoue de manière sécurisée avant l’application > d’une migration. Déplacez `DATA_DIR` vers un volume prenant en charge ces primitives ; n’utilisez pas > `DISABLE_SQLITE_AUTO_BACKUP` pour contourner la sécurité des migrations. @@ -141,7 +140,7 @@ OmniRoute utilise **SQLite** (via `better-sqlite3`) pour toute la persistance. C | Scénario | Configuration | | ------------------------ | ----------------------------------------------------------------------------------------------------------- | -| **Développement local** | Conservez toutes les valeurs par défaut. La BDD se trouve dans `~/.omniroute/omniroute.db`. | +| **Développement local** | Conservez toutes les valeurs par défaut. La base de données se trouve dans `~/.omniroute/omniroute.db`. | | **Docker** | `DATA_DIR=/data` + montez un volume sur `/data`. | | **Chiffrement au repos** | Définissez `STORAGE_ENCRYPTION_KEY` + conservez des sauvegardes de la clé ! La perdre = perdre les données. | | **CI/Tests** | `DATA_DIR=/tmp/omniroute-test` — éphémère, aucun chiffrement nécessaire. | @@ -215,42 +214,43 @@ OmniRoute utilise **SQLite** (via `better-sqlite3`) pour toute la persistance. C ## 4. Sécurité et authentification -| Variable | Valeur par défaut | Fichier source | Description | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sel combiné aux identifiants matériels pour générer l’empreinte de la machine. À modifier pour chaque déploiement afin d’assurer l’isolation. | -| `OMNIROUTE_CLI_SALT` | _(non défini = sel aléatoire propre à l’installation, conservé dans `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Sel HMAC utilisé pour dériver le jeton d’authentification local de la CLI. La définition de cette valeur renouvelle tous les jetons CLI de la machine et prévaut toujours sur le sel conservé. Consultez `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Définit l’attribut `Secure` des cookies de session. **Doit être `true`** lors d’une exécution derrière HTTPS. | -| `REQUIRE_API_KEY` | `false` | Middleware de l’API | Lorsque la valeur est `true`, toutes les requêtes du proxy vers `/v1/*` doivent inclure une clé API valide. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Autorise l’affichage des valeurs complètes des clés API dans l’interface du tableau de bord. Configurable depuis les indicateurs de fonctionnalité du tableau de bord ; présente un risque de sécurité sur les instances partagées. | -| `NO_LOG_API_KEY_IDS` | _(vide)_ | `src/lib/compliance/index.ts` | Identifiants de clés API séparés par des virgules pour lesquels la journalisation des requêtes est désactivée (conformité au RGPD). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(non défini = illimité)_ | `src/shared/utils/apiKeyPolicy.ts` | Budget quotidien de requêtes de secours appliqué aux clés API dont la colonne `rate_limits` est nulle. Valeur non définie ou vide : aucune limite implicite (#2289, #11017). `0` a le même effet (illimité). Un entier positif N active N/jour, 5N/semaine, 20N/mois. Les valeurs non vides mal formées utilisent les anciennes limites de 1000/jour, 5000/semaine et 20000/mois. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 Mo) | `src/shared/middleware/bodySizeGuard.ts` | Taille maximale autorisée du corps d’une requête. Rejette les charges utiles dépassant cette limite. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 Ko) | `src/shared/middleware/chatBodyAdmission.ts` | Les corps de requête dont la taille réelle atteint ou dépasse ce seuil obtiennent le bail d’admission atomique local au processus pour les charges lourdes avant l’analyse JSON (chemin BYTE, y compris `POST /v1/responses`). Même mécanisme d’échappement en cas de marge de capacité suffisante que [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) pour les structures lourdes ; reste limité par `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) afin d’éviter la réapparition de [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 Mo) | `src/shared/middleware/chatBodyAdmission.ts` | Limite stricte des routes de chat, appliquée au nombre d’octets lus lors de l’ingestion bornée, y compris pour les requêtes dont l’en-tête `Content-Length` est absent, non valide ou mensonger ; tout dépassement entraîne une réponse `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(non défini — aucune limite du nombre de requêtes)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout :** cette ancienne limite du NOMBRE de requêtes ne s'applique désormais que lorsqu'elle est explicitement définie. Lorsqu'elle n'est pas définie (valeur par défaut), l'admission des requêtes de chat lourdes est plutôt contrôlée par `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — un budget en OCTETS calculé automatiquement à partir de la limite de mémoire réelle du processus dans **un seul processus** (un seul tas V8). Deux requêtes `/v1/responses` d'environ 750 000 tokens qui se chevauchent font planter des tas d'environ 12 Gio (#7849) — il s'agit d'un avertissement relatif au **budget mémoire**, et non d'une limite produit stricte de 2. Un processus sain (tas en dessous du ratio de délestage) PEUT admettre davantage de requêtes longues `/v1/responses` simultanées via `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Des dizaines de clients SSE de longue durée (40 à 50) dépendent du tas + de `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, et non d'un « maximum de 2 ». Augmenter aveuglément cette valeur pour « utiliser l'hôte » réintroduit #7849. Multipliez les **tas** avec **N `DATA_DIR` indépendants** (#11024) ; n'utilisez jamais `replicas>1` sur un même fichier SQLite. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(calculé automatiquement)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout :** remplacement du budget d'ingestion en octets calculé automatiquement (25 % de la plus stricte des limites de mémoire V8/cgroup, divisés par une amplification transitoire de 8x). Les valeurs calculées et explicites sont limitées à une plage de 8 Mio à 2 Gio. Un corps dépassant le budget effectif échoue immédiatement avec `413 body_exceeds_budget` ; la contention entre des corps pouvant être traités individuellement reste réessayable avec `503`. La prise en charge simultanée de 40 à 50 clients SSE de longue durée dépend de ce budget + du tas, et non d'un « maximum de 2 » strict. Consultez `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` sur `/api/monitoring/health` avant tout réglage. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Ratio de délestage sous pression du tas (`heapUsed / heap_size_limit`) pour l'admission des requêtes lourdes de type BYTE et STRUCTURE (#10183, #10268, #10437). Une requête lourde simultanée dépassant `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` n'est délestée avec le code réessayable `503` que si le tas atteint ou dépasse ÉGALEMENT ce ratio ; sur un tas sain, elle est admise via la marge de capacité saine. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (valeur par défaut `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Capacité supplémentaire limitée pour le chemin rapide sur tas sain (#10437), pour les types **à la fois** STRUCTURE et BYTE (`admitChatRequest`, y compris les corps ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Sans cette limite, chaque requête reçue alors que le système était occupé mais que le tas était sain contournait l'admission sans aucun plafond. Lorsque ce nombre de baux simultanés est actif via le chemin sur tas sain, les requêtes supplémentaires en période d'activité repassent par le MÊME chemin d'attente limitée/de délestage que celui utilisé sous une véritable pression du tas. `0` désactive entièrement ce contournement. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Nombre de messages à partir duquel une requête de chat est classée comme lourde, même lorsque son corps est inférieur au seuil d'octets. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Nombre d'outils à partir duquel une requête de chat est classée comme lourde, même lorsque son corps est inférieur au seuil d'octets. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Estimation prudente du nombre de tokens fondée sur la taille des chaînes, à partir de laquelle une requête est classée comme lourde ; il s'agit d'un indicateur indirect du coût d'admission, et non de la tokenisation utilisée pour la facturation du fournisseur. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (désactivé) | `src/shared/middleware/chatBodyAdmission.ts` | Limite facultative et activable de l'historique de chat. Désactivée par défaut : le nombre de messages relève de la politique de déploiement et non d'une propriété universelle d'une requête ; appliquer une limite ici rejette les conversations avec un code `413` définitif avant que le pipeline de compression puisse les rendre traitables. La croissance du tas est limitée par `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` et le délestage sous pression du tas. Définissez une valeur positive pour les déploiements aux ressources mémoire limitées qui nécessitent un plafond strict ; les requêtes excédentaires reçoivent alors une réponse structurée `413` indiquant qu'une réduction est requise. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 Mo) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Limite stricte pour une réponse amont sans streaming entièrement mise en mémoire tampon. Au-delà, le lecteur amont est annulé et la requête échoue rapidement au lieu de faire croître une chaîne sans limite jusqu'à épuisement du tas. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Nombre maximal d'octets transmis sur le réseau depuis les en-têtes de réponse amont. Lorsque le budget est dépassé, les en-têtes de priorité inférieure (par exemple, les en-têtes personnalisés `x-codex-*`, `x-oai-request-id`) sont supprimés afin de rester dans les limites courantes des en-têtes des proxys inverses. Définissez une valeur supérieure pour transmettre davantage de métadonnées amont, au prix d'une taille accrue des en-têtes de réponse. | -| `CORS_ORIGIN` | _(non défini)_ | `src/server/cors/origins.ts` | Liste d’autorisation CORS historique à origine unique. Préférez `CORS_ALLOWED_ORIGINS` pour les nouveaux déploiements. CORS est réservé aux clients d’API de navigateur interorigines ; les écritures authentifiées du tableau de bord utilisent plutôt des requêtes de même origine ainsi qu’une protection CSRF liée à la session. | -| `CORS_ALLOWED_ORIGINS` | _(non défini)_ | `src/server/cors/origins.ts` | Liste d’autorisation CORS séparée par des virgules. Aucun caractère générique n’est envoyé, sauf si `CORS_ALLOW_ALL=true` est explicitement configuré. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Échappatoire réservée au développement permettant de renvoyer n’importe quelle valeur `Origin` du navigateur. Ne l’activez pas sur les déploiements partagés ou de production. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Bloque les appels aux fournisseurs ciblant des plages d’adresses IP privées, de bouclage ou locales au lien. Ne désactivez cette option que dans des environnements de test isolés. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Autorise les URL de fournisseurs pointant vers des réseaux privés/locaux (localhost, 192.168.x.x, 10.x.x.x, etc.). **REQUIS pour les fournisseurs auto-hébergés** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Lorsque cette option vaut `false`, le tableau de bord rejette la validation des URL locales. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Autorise l’ajout/la validation de fournisseurs sur des adresses locales/privées (127.0.0.1, localhost, réseau local, plages privées) — limité au chemin de validation des fournisseurs. **Valeur par défaut : `true`** (priorité au local) ; définissez cette option sur `false` pour appliquer un blocage strict limité aux adresses publiques. Les points de terminaison de métadonnées cloud (169.254.169.254, metadata.google.internal) restent bloqués dans tous les cas. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Permet aux routes `/v1/audio/*` (transcriptions, synthèse vocale, traductions) d’utiliser un nœud de fournisseur compatible avec OpenAI hébergé en dehors de localhost. Désactivé par défaut — l’acheminement audio vers un hôte distant modifie l’identité de sortie et doit résulter d’une décision explicite de l’opérateur. Les nœuds de bouclage/privés (localhost, 127.0.0.1, 172.16-31.x) sont toujours autorisés et ne sont pas affectés. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Lorsque OIDC est activé, désactive la connexion par mot de passe afin que les utilisateurs puissent uniquement s’authentifier via l’authentification unique OIDC. L’alias simple `OIDC_DISABLE_PASSWORD_LOGIN` est également accepté ; l’indicateur de fonctionnalité du tableau de bord portant la même clé est prioritaire. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias simple de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +| Variable | Valeur par défaut | Fichier source | Description | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sel combiné aux identifiants matériels pour générer l’empreinte de la machine. À modifier pour chaque déploiement afin d’assurer l’isolation. | +| `OMNIROUTE_CLI_SALT` | _(non défini = sel aléatoire propre à l’installation, conservé dans `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Sel HMAC utilisé pour dériver le jeton d’authentification local de la CLI. La définition de cette valeur renouvelle tous les jetons CLI de la machine et prévaut toujours sur le sel conservé. Voir `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Définit l’attribut `Secure` des cookies de session. **Doit être défini sur `true`** lorsque l’application s’exécute derrière HTTPS. | +| `REQUIRE_API_KEY` | `false` | Intergiciel d’API | Lorsque la valeur est `true`, toutes les requêtes proxy `/v1/*` doivent inclure une clé d’API valide. **Cet indicateur ne contrôle pas `GET /v1/models`**, qui suit à la place la configuration de connexion du tableau de bord (`requireAuthForModels`) — ainsi, une erreur `401` provenant de `/v1/models` ne signifie PAS que l’inférence est protégée. Voir `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Autorise l’affichage des valeurs complètes des clés d’API dans l’interface du tableau de bord. Configurable dans les indicateurs de fonctionnalité du tableau de bord ; présente un risque de sécurité sur les instances partagées. | +| `NO_LOG_API_KEY_IDS` | _(vide)_ | `src/lib/compliance/index.ts` | Identifiants de clés d’API, séparés par des virgules, pour lesquels la journalisation des requêtes est désactivée (conformité au RGPD). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(non défini = illimité)_ | `src/shared/utils/apiKeyPolicy.ts` | Budget quotidien de requêtes de secours appliqué aux clés d’API dont la colonne `rate_limits` est nulle. Valeur non définie ou vide : aucune limite implicite (#2289, #11017). `0` produit le même résultat (illimité). Un entier positif N active N requêtes/jour, 5N/semaine et 20N/mois. Les valeurs non vides mal formées utilisent les limites historiques de 1000/jour, 5000/semaine et 20000/mois. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 Mo) | `src/shared/middleware/bodySizeGuard.ts` | Taille maximale autorisée du corps d’une requête. Rejette les charges utiles dépassant cette limite. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 Ko) | `src/shared/middleware/chatBodyAdmission.ts` | Les corps de requête réels dont la taille atteint ou dépasse ce seuil acquièrent le bail d’admission atomique local au processus pour les charges lourdes avant l’analyse JSON (chemin BYTE, y compris `POST /v1/responses`). Utilise le même mécanisme d’échappement lorsque la marge disponible est suffisante que [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) pour les charges structurellement lourdes ; reste limité par `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), afin que [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ne se reproduise pas. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Limite stricte des routes de chat, appliquée aux octets lus pendant l'ingestion bornée, y compris pour les requêtes dont l'en-tête `Content-Length` est absent, non valide ou mensonger ; tout dépassement reçoit une réponse `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(non défini — aucune limite du nombre de requêtes)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout :** cette ancienne limite en NOMBRE de requêtes ne s'applique désormais que lorsqu'elle est explicitement définie. Lorsqu'elle n'est pas définie (comportement par défaut), l'admission des requêtes de chat lourdes est plutôt contrôlée par `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — un budget en OCTETS calculé automatiquement à partir de la limite de mémoire réelle du processus dans **un seul processus** (un seul tas V8). Deux requêtes `/v1/responses` simultanées d'environ 750 000 jetons font planter des tas d'environ 12 Gio (#7849) — il s'agit d'un avertissement lié au **budget mémoire**, et non d'une limite produit stricte de 2. Un processus sain (tas sous le ratio de délestage) PEUT accepter davantage de requêtes `/v1/responses` longues simultanées via `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Des dizaines de clients SSE de longue durée (40–50) dépendent du tas + de `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, et non d'un « maximum de 2 ». Augmenter aveuglément cette valeur pour « utiliser l'hôte » réintroduit #7849. Multipliez les **tas** avec **N `DATA_DIR` indépendants** (#11024) ; n'utilisez jamais `replicas>1` avec un seul fichier SQLite. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(calculé automatiquement)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout :** remplacement du budget d'octets d'ingestion calculé automatiquement (25 % de la plus restrictive des limites de mémoire V8/cgroup, divisés par une amplification transitoire de 8x). Les valeurs calculées et explicites sont limitées à une plage de 8 Mio à 2 Gio. Un corps plus volumineux que le budget effectif échoue immédiatement avec `413 body_exceeds_budget` ; la contention entre des corps pouvant individuellement être traités reste retentable avec `503`. La prise en charge de 40 à 50 clients SSE de longue durée dépend de ce budget + du tas, et non d'un « maximum de 2 » strict. Consultez `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` sur `/api/monitoring/health` avant tout réglage. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Ratio de délestage en cas de pression sur le tas (`heapUsed / heap_size_limit`) pour l'admission des requêtes lourdes de type OCTETS et STRUCTURE (#10183, #10268, #10437). Une requête lourde simultanée dépassant `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` n'est délestée avec la réponse retentable `503` que lorsque le tas atteint ou dépasse ÉGALEMENT ce ratio ; si le tas est sain, elle est admise via la marge de capacité saine. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (valeur par défaut `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Capacité supplémentaire bornée pour le chemin rapide avec tas sain (#10437), à la fois pour STRUCTURE et OCTETS (`admitChatRequest`, y compris les corps ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Sans cette limite, chaque requête reçue pendant une période chargée, mais avec un tas sain, contournait l'admission sans aucun plafond. Une fois ce nombre de baux simultanés actifs via le chemin avec tas sain atteint, les requêtes supplémentaires reçues pendant la période chargée basculent vers le MÊME chemin d'attente bornée/de délestage que celui utilisé sous une véritable pression sur le tas. `0` désactive entièrement le contournement. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Nombre de messages à partir duquel une requête de chat est classée comme lourde, même lorsque son corps est inférieur au seuil en octets. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Nombre d'outils à partir duquel une requête de chat est classée comme lourde, même lorsque son corps est inférieur au seuil en octets. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Estimation prudente du nombre de jetons d'après la taille des chaînes, utilisée pour classer une requête comme lourde ; il s'agit d'une approximation du coût d'admission, et non de la tokenisation utilisée pour la facturation du fournisseur. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (désactivé) | `src/shared/middleware/chatBodyAdmission.ts` | Limite facultative et volontaire de l'historique de chat. Désactivée par défaut : une limite du nombre de messages relève de la politique de déploiement, et non d'une propriété universelle d'une requête ; imposer cette limite ici rejette les conversations avec une réponse terminale `413` avant que le pipeline de compression puisse les rendre traitables. La croissance du tas est bornée par `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` et par le délestage en cas de pression sur le tas. Définissez une valeur positive pour les déploiements contraints en mémoire qui nécessitent un plafond strict ; tout dépassement reçoit alors une réponse structurée `413` indiquant qu'une compression est requise. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Limite stricte pour une réponse amont non diffusée en continu, entièrement mise en mémoire tampon. Au-delà de cette limite, la lecture en amont est annulée et la requête échoue rapidement au lieu de faire croître une chaîne sans limite jusqu'à épuisement du tas. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Nombre maximal d’octets transmis depuis les en-têtes de réponse en amont. Lorsque le budget est dépassé, les en-têtes de priorité inférieure (par ex., les en-têtes personnalisés `x-codex-*`, `x-oai-request-id`) sont supprimés afin de respecter les limites courantes des en-têtes des proxys inverses. Définissez une valeur plus élevée pour transmettre davantage de métadonnées en amont, au prix d’une taille accrue des en-têtes de réponse. | +| `CORS_ORIGIN` | _(non défini)_ | `src/server/cors/origins.ts` | Liste d’autorisation CORS historique pour une origine unique. Préférez `CORS_ALLOWED_ORIGINS` pour les nouveaux déploiements. CORS est uniquement destiné aux clients d’API de navigateur inter-origines ; les écritures authentifiées du tableau de bord utilisent plutôt des requêtes de même origine ainsi qu’une protection CSRF liée à la session. | +| `CORS_ALLOWED_ORIGINS` | _(non défini)_ | `src/server/cors/origins.ts` | Liste d’autorisation CORS séparée par des virgules. Aucun caractère générique n’est envoyé, sauf si `CORS_ALLOW_ALL=true` est explicitement configuré. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Échappatoire réservée au développement permettant de renvoyer n’importe quel `Origin` de navigateur. Ne l’activez pas dans les déploiements partagés ou de production. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Bloque les appels aux fournisseurs ciblant des plages d’adresses IP privées, de bouclage ou lien-local. Désactivez cette option uniquement dans des environnements de test isolés. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Autorise les URL de fournisseurs pointant vers des réseaux privés/locaux (localhost, 192.168.x.x, 10.x.x.x, etc.). **REQUIS pour les fournisseurs auto-hébergés** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Lorsque la valeur est `false`, le tableau de bord refuse la validation des URL locales. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Autorise l’ajout/la validation de fournisseurs sur des adresses locales/privées (127.0.0.1, localhost, LAN, plages privées) — limité au chemin de validation des fournisseurs. **Valeur par défaut : `true`** (priorité au local) ; définissez `false` pour imposer un blocage strict limité aux adresses publiques. Les points de terminaison des métadonnées cloud (169.254.169.254, metadata.google.internal) restent bloqués dans tous les cas. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Permet aux routes `/v1/audio/*` (transcriptions, synthèse vocale, traductions) d’utiliser un nœud fournisseur compatible avec OpenAI hébergé en dehors de localhost. Désactivé par défaut — le routage audio vers un hôte distant modifie l’identité de sortie et doit résulter d’une décision explicite de l’opérateur. Les nœuds de bouclage/privés (localhost, 127.0.0.1, 172.16-31.x) sont toujours autorisés et ne sont pas affectés. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Permet à `POST /v1/rerank` (ainsi qu’à l’étape de reclassement en bouclage du moteur de mémoire) d’utiliser un nœud fournisseur compatible avec OpenAI hébergé en dehors de localhost — une machine du LAN ou un pair Tailscale exécutant TEI, Infinity, vLLM, etc. Désactivé par défaut — le routage vers un hôte distant modifie l’identité de sortie et doit résulter d’une décision explicite de l’opérateur. Les nœuds de bouclage (localhost, 127.0.0.1, 172.16-31.x) sont toujours autorisés et ne sont pas affectés. Les nœuds distants doivent également respecter la politique relative aux URL sortantes des fournisseurs (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) ; les hôtes de métadonnées cloud ne sont jamais utilisés pour le routage. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Lorsque OIDC est activé, désactive la connexion par mot de passe afin que les utilisateurs puissent uniquement s’authentifier via l’authentification unique OIDC. L’alias court `OIDC_DISABLE_PASSWORD_LOGIN` est également accepté ; l’indicateur de fonctionnalité du tableau de bord portant la même clé est prioritaire. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias court de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### Liste de contrôle du renforcement de la sécurité ```bash -# Configuration minimale de sécurité pour la production : +# Configuration de sécurité minimale pour la production : AUTH_COOKIE_SECURE=true # Nécessite HTTPS REQUIRE_API_KEY=true # Authentifie tous les appels au proxy ALLOW_API_KEY_REVEAL=false # Ne jamais exposer les clés dans l’interface utilisateur @@ -303,59 +303,66 @@ OmniRoute fournit une défense à deux niveaux : l’analyse des injections côt ## 6. Politiques relatives aux outils et au routage -| Variable | Valeur par défaut | Fichier source | Description | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Contrôle l’accès du LLM aux outils/appels de fonctions. `allowlist` = uniquement les outils répertoriés, `denylist` = tous sauf ceux répertoriés, `disabled` = aucune restriction. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Chemin d’accès au fichier JSON des règles de manipulation de la charge utile (ajustements en amont propres à chaque modèle/protocole). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Intervalle de rechargement (ms) pour le rechargement à chaud du fichier de règles de charge utile. Minimum : `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Option facultative : achemine les identifiants de modèle `claude-*` sans préfixe provenant des clients Claude Code via le compte OAuth Claude Code au lieu d’exiger un préfixe de fournisseur. Les préfixes de fournisseur explicites restent prioritaires. Également configurable via une option du tableau de bord sur la page du fournisseur Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Limite de concurrence par modèle pour les combinaisons en tourniquet (#9100). Le sémaphore des combinaisons en tourniquet était strictement limité à 3 requêtes simultanées par modèle, sans possibilité de remplacement, ce qui sérialisait le trafic à plus forte concurrence derrière cette limite. Valeur validée comme étant `>= 1` et plafonnée à `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Option facultative dangereuse qui ignore la vérification locale d’OmniRoute sur la fenêtre de contexte et le nombre maximal de jetons d’entrée pour les requêtes directes adressées à un seul modèle. Les fournisseurs en amont continuent d’appliquer leurs limites réelles ; la compression des invites et la limite de jetons de sortie propre au modèle restent actives. L’ordre de priorité effectif est le suivant : remplacement dans la base de données des indicateurs de fonctionnalités > variable d’environnement > valeur par défaut ; aucun redémarrage n’est requis. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(non défini)_ | `open-sse/services/conversationTracker.ts` | Définissez cette variable sur `1` pour arrêter la collecte de l’historique des conversations. `resolveConversationId()` renvoie un résultat non suivi avant de lire SQLite ou d’analyser l’historique des messages, et les identifiants de session fournis par le client sont également concernés. La gestion des sessions de routage reste inchangée et les enregistrements existants ne sont pas supprimés. Destiné aux déploiements qui n’utilisent pas la vue des conversations du tableau de bord et souhaitent empêcher la table des tours de continuer à croître. | +| Variable | Valeur par défaut | Fichier source | Description | +| ----------------------------------------------------------- | ------------------------------ | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Contrôle l’accès du LLM aux outils/appels de fonctions. `allowlist` = uniquement les outils répertoriés, `denylist` = tous sauf ceux répertoriés, `disabled` = aucune restriction. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Chemin vers le fichier JSON des règles de manipulation des charges utiles (ajustements en amont propres à chaque modèle/protocole). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Intervalle de rechargement (ms) pour le rechargement à chaud du fichier de règles de charge utile. Minimum : `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Option facultative : achemine les identifiants de modèles `claude-*` sans préfixe provenant des clients Claude Code via le compte OAuth Claude Code au lieu d’exiger un préfixe de fournisseur. Les préfixes de fournisseur explicites restent prioritaires. Également configurable au moyen d’un bouton dans le tableau de bord, sur la page du fournisseur Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Limite d’accès concurrent par modèle pour les combinaisons en tourniquet (#9100). Le sémaphore des combinaisons en tourniquet était strictement limité à 3 requêtes simultanées par modèle, sans possibilité de remplacement, ce qui mettait en file d’attente derrière cette limite le trafic présentant une concurrence plus élevée. Valeur validée à `>= 1` et plafonnée à `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Option facultative dangereuse qui ignore la vérification locale d’OmniRoute concernant la fenêtre de contexte et le nombre maximal de jetons d’entrée pour les requêtes directes visant un seul modèle. Les fournisseurs en amont continuent d’appliquer leurs limites réelles ; la compression des invites et la propre limite de jetons de sortie du modèle restent actives. L’ordre de priorité effectif est le suivant : remplacement par la base de données Feature Flags > variable d’environnement > valeur par défaut ; aucun redémarrage n’est requis. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(non défini)_ | `open-sse/services/selfHostedEntry.ts` | Document YAML `providers:` en ligne (RIC-738, D4). Lorsqu’il est défini (avec ou sans bloc `strategy:`), `/v1/chat/completions` est redirigé vers le point d’entrée unifié auto-hébergé compatible avec OpenAI plutôt que vers le pipeline cloud. Lorsqu’il n’est pas défini (valeur par défaut), la route passe directement au pipeline cloud existant. Voir `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(non défini)_ | `open-sse/services/selfHostedEntry.ts` | Chemin vers un fichier YAML contenant le même document `providers:` que `OMNIROUTE_SELF_HOSTED_PROVIDERS`, pour les déploiements qui préfèrent un fichier à une variable d’environnement en ligne. L’un ou l’autre active le point d’entrée auto-hébergé. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(non défini — route ouverte)_ | `open-sse/services/selfHostedEntry.ts` | Clé API partagée facultative pour le point d’entrée unifié auto-hébergé (structure D5, réservée au système de quotas par clé). Lorsqu’elle est définie, les requêtes doivent inclure `Authorization: Bearer `. Lorsqu’elle n’est pas définie, la route est ouverte, conformément au modèle existant de fournisseur local auto-hébergé (déploiement sur la boucle locale ou un réseau de confiance). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(non défini)_ | `open-sse/services/routingStrategies.ts` | Document YAML `strategy:` en ligne pour le moteur de routage déterministe (M2/RIC-740, D3) — liste noire/liste blanche, disjoncteur avec délai de récupération, priorité au coût, prise en compte de la latence et chaîne de repli. Remplace, pour chaque clé, un bloc `strategy:` en ligne imbriqué dans `OMNIROUTE_SELF_HOSTED_PROVIDERS`. Voir `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(non défini)_ | `open-sse/services/routingStrategies.ts` | Chemin vers un fichier YAML contenant le même document `strategy:` que `OMNIROUTE_SELF_HOSTED_STRATEGY`, pour les déploiements qui préfèrent un fichier à une variable d’environnement en ligne. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(non défini)_ | `open-sse/services/conversationTracker.ts` | Définissez cette variable sur `1` pour arrêter de collecter l’historique des conversations. `resolveConversationId()` renvoie un résultat non suivi avant de lire SQLite ou d’analyser l’historique des messages, et les identifiants de session fournis par le client sont également pris en compte. La gestion des sessions de routage reste inchangée et les enregistrements existants ne sont pas supprimés. Cette option est destinée aux déploiements qui n’utilisent pas la vue des conversations du tableau de bord et souhaitent empêcher la table des tours de continuer à croître. | --- -## 7. URL et synchronisation avec le cloud - -| Variable | Valeur par défaut | Fichier source | Description | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL côté serveur permettant aux tâches de synchronisation internes d’appeler `/api/sync/cloud`. Conservez une URL de bouclage/conteneur même lorsque l’application est exposée publiquement via un proxy. | -| `CLOUD_URL` | _(vide)_ | `src/lib/cloudSync.ts` | URL du point de terminaison du relais cloud (fonctionnalité premium). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Délai d’expiration HTTP des requêtes de synchronisation cloud. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Configuration de build Webpack | Profil utilisé lors du build (définissez-le sur `minimal` pour exclure physiquement du bundle les modules privilégiés). | -| `OMNIROUTE_STANDALONE_DIR` | _sortie standalone .build/_ | `scripts/build/colocate-standalone.mjs` | Remplacement, lors du build, du répertoire de sortie standalone utilisé par l’étape de colocalisation post-build. Ce n’est pas un paramètre d’exécution. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(vide)_ | `src/lib/cloudSync.ts` | Secret partagé utilisé pour vérifier la signature HMAC-SHA256 des réponses Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Définissez cette variable sur `true` pour autoriser le point de terminaison Cloud Sync à remplacer les identifiants locaux. La valeur par défaut est `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Définissez cette variable sur `true` pour rejeter une réponse Cloud Sync non signée lorsqu’aucun secret local n’est configuré (#13679). Une signature présente est toujours vérifiée — et toujours rejetée lorsque `OMNIROUTE_CLOUD_SYNC_SECRET` n’est pas définie — indépendamment de cet indicateur. L’application de cette vérification deviendra la valeur par défaut dans la v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Définissez cette variable sur `true` pour revenir au comportement en une étape « tout importer » de la v3.8.5, sans confirmation de l’utilisateur. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, tableau de bord, synchronisation | URL publique pour le redirect_uri OAuth, les liens du tableau de bord et les URL publiques générées. Définissez-la sur l’URL publique stable lorsque les rappels OAuth ou les liens de navigateur générés doivent utiliser un hôte de proxy inverse canonique. | -| `NEXT_PUBLIC_CLOUD_URL` | _(vide)_ | Côté client | Équivalent côté client de `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(non définie)_ | `src/shared/services/cloudSyncScheduler.ts` | Valeur de secours héritée pour `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(non définie)_ | Résolveur d’origine publique, URL d’images | Origine OmniRoute destinée au navigateur ayant la priorité la plus élevée, utilisée pour la génération d’URL publiques et la validation de l’origine du navigateur hors tableau de bord. Définissez-la lorsqu’OpenWebUI ou un autre relais accède à OmniRoute via une URL interne, mais que le navigateur de l’utilisateur doit récupérer les médias générés depuis une origine LAN, de tunnel ou publique. N’incluez **pas** `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(non définie)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL absolue du manifeste de plug-ins de fournisseurs annoncée aux clients sidecar. Lorsqu’elle n’est pas définie, OmniRoute déduit `/api/v1/provider-plugin-manifest` de l’origine de la requête ou de HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocole utilisé lors de la déduction de l’URL du manifeste de plug-ins de fournisseurs à partir de HOST/PORT sans origine de requête. Définissez-le sur `https` derrière un proxy public qui termine TLS lorsqu’aucune valeur explicite de `OMNIROUTE_PROVIDER_MANIFEST_URL` n’est définie. | -| `OMNIROUTE_TRUST_PROXY` | _(non définie)_ | `src/server/origin/publicOrigin.ts` | Mode de confiance facultatif pour les en-têtes d’origine publique transférés. Non définie = ne pas faire confiance à `Forwarded` / `X-Forwarded-*` pour les décisions de sécurité. `true` / `loopback` n’accorde sa confiance à l’hôte et au protocole transférés que depuis un proxy de bouclage marqué par un jeton. `private` / `lan` accorde également sa confiance aux pairs proxy du LAN privé. En production, privilégiez une valeur explicite de `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(non définie)_ | `open-sse/utils/kieTask.ts` | URL de rappel publique pour les tâches kie.ai asynchrones. Remplacement prioritaire avant `OMNIROUTE_KIE_CALLBACK_URL` et `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(non définie)_ | `open-sse/utils/kieTask.ts` | Autre nom de `KIE_CALLBACK_URL`. Utilisé comme valeur de secours lorsque la variable principale n’est pas définie. | -| `OMNIROUTE_PUBLIC_URL` | _(non définie)_ | `open-sse/utils/kieTask.ts` | Origine publique utilisée pour composer les URL de rappel asynchrones. Valeur de secours la moins prioritaire pour les rappels kie.ai ; également utilisée comme URL publique générique pour d’autres relais. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Point de terminaison de consultation du quota CrofAI utilisé par la page d’utilisation. Peut être remplacé pour les relais / données de test. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Point de terminaison officiel d’utilisation d’OpenCode Go, authentifié par clé API et utilisé par la page d’utilisation. Peut être remplacé pour les relais / données de test. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Synthétise les en-têtes d’identité de l’interface en ligne de commande OpenCode (User-Agent, x-opencode-client/project, UUID de requête/session) pour les requêtes en amont opencode-go/zen lorsque le client ne les a pas envoyés, afin que Cloudflare les accepte à la sortie du VPS (#6210/#5997). Activé par défaut depuis #10571 ; désactivez-le avec `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | User-Agent par défaut utilisé lorsque `OPENCODE_SYNTHESIZE_CLI_HEADERS` est activé et qu’aucun remplacement `_USER_AGENT` propre au fournisseur n’est défini. S’applique uniquement aux exécuteurs opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Valeur de l’en-tête synthétisé `x-opencode-client` lorsque `OPENCODE_SYNTHESIZE_CLI_HEADERS` est activé. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Valeur de l’en-tête synthétisé `x-opencode-project` lorsque `OPENCODE_SYNTHESIZE_CLI_HEADERS` est activé. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL des paramètres Ollama Cloud utilisée pour extraire les informations de quota. Peut être remplacée pour les relais / données de test. | -| `OLLAMA_USAGE_COOKIE` | _(non défini)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` d’Ollama Cloud utilisé pour extraire le quota depuis la page des paramètres. Donnée sensible ; privilégiez le champ propre à chaque connexion dans le tableau de bord lorsque plusieurs comptes sont configurés. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(non défini)_ | `open-sse/services/usage.ts` | Autre variable d’environnement pour le cookie `__Secure-session` d’Ollama Cloud. Donnée sensible ; privilégiez le champ propre à chaque connexion dans le tableau de bord lorsque plusieurs comptes sont configurés. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(non défini)_ | `open-sse/services/usage.ts` | Autre variable d’environnement pour le cookie `__Secure-session` d’Ollama Cloud, utilisée avant les alias plus courts. Donnée sensible ; privilégiez le champ propre à chaque connexion dans le tableau de bord lorsque plusieurs comptes sont configurés. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Point de terminaison des limites d’utilisation de CodeWhisperer (AWS Kiro). Peut être remplacé pour les relais / données de test. | +## 7. URL et synchronisation cloud + +| Variable | Valeur par défaut | Fichier source | Description | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL côté serveur utilisée par les tâches de synchronisation internes pour appeler `/api/sync/cloud`. Conservez une URL de boucle locale/de conteneur, même lorsque l’application est exposée publiquement via un proxy. | +| `CLOUD_URL` | _(vide)_ | `src/lib/cloudSync.ts` | URL du point de terminaison du relais cloud (fonctionnalité premium). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Délai d’expiration HTTP des requêtes de synchronisation cloud. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Configuration de build Webpack | Profil utilisé lors du build (définissez-le sur `minimal` pour exclure physiquement les modules privilégiés du bundle). | +| `OMNIROUTE_STANDALONE_DIR` | _sortie standalone .build/_ | `scripts/build/colocate-standalone.mjs` | Remplacement, lors du build, du répertoire de sortie standalone utilisé par l’étape de colocalisation post-build. Ce n’est pas un paramètre d’exécution. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(vide)_ | `src/lib/cloudSync.ts` | Secret partagé utilisé pour vérifier la signature HMAC-SHA256 des réponses de Cloud Sync. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Définissez cette variable sur `true` pour permettre au point de terminaison Cloud Sync de remplacer les identifiants locaux. La valeur par défaut est `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Définissez cette variable sur `true` pour rejeter une réponse Cloud Sync non signée lorsqu’aucun secret local n’est configuré (#13679). Toute signature présente est toujours vérifiée — et toujours rejetée lorsque `OMNIROUTE_CLOUD_SYNC_SECRET` n’est pas défini — indépendamment de cet indicateur. L’application de cette règle devient la valeur par défaut dans v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Définissez cette variable sur `true` pour revenir au comportement en une étape « tout importer » de v3.8.5, sans confirmation de l’utilisateur. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, tableau de bord, synchronisation | URL publique utilisée pour l’élément redirect_uri d’OAuth, les liens du tableau de bord et les URL publiques générées. Définissez-la sur l’URL publique stable lorsque les rappels OAuth ou les liens générés pour le navigateur doivent utiliser un hôte de proxy inverse canonique. | +| `NEXT_PUBLIC_CLOUD_URL` | _(vide)_ | Côté client | Miroir côté client de `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(non défini)_ | `src/shared/services/cloudSyncScheduler.ts` | Solution de repli héritée pour `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(non défini)_ | Résolveur d’origine publique, URL des images | Origine OmniRoute destinée au navigateur ayant la priorité la plus élevée, utilisée pour générer les URL publiques et valider l’origine du navigateur hors tableau de bord. Définissez cette variable lorsque OpenWebUI ou un autre relais accède à OmniRoute via une URL interne, mais que le navigateur de l’utilisateur doit récupérer les médias générés depuis un réseau local, un tunnel ou une origine publique. N’incluez **pas** `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(non défini)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL absolue du manifeste des plugins de fournisseurs communiquée aux clients sidecar. Lorsqu’elle n’est pas définie, OmniRoute dérive `/api/v1/provider-plugin-manifest` de l’origine de la requête ou de HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocole utilisé lors de la dérivation de l’URL du manifeste des plugins de fournisseurs à partir de HOST/PORT sans origine de requête. Définissez-le sur `https` derrière un proxy public assurant la terminaison TLS lorsqu’aucune valeur explicite de `OMNIROUTE_PROVIDER_MANIFEST_URL` n’est définie. | +| `OMNIROUTE_TRUST_PROXY` | _(non défini)_ | `src/server/origin/publicOrigin.ts` | Mode de confiance facultatif pour les en-têtes transférés relatifs à l’origine publique. Non défini = ne pas faire confiance à `Forwarded` / `X-Forwarded-*` pour les décisions de sécurité. `true` / `loopback` n’accorde sa confiance à l’hôte et au protocole transférés que s’ils proviennent d’un proxy de bouclage marqué par un jeton. `private` / `lan` accorde également sa confiance aux pairs proxy du réseau local privé. En production, privilégiez une valeur explicite de `NEXT_PUBLIC_BASE_URL`. | +| `KIE_CALLBACK_URL` | _(non défini)_ | `open-sse/utils/kieTask.ts` | URL de rappel publique pour les tâches kie.ai asynchrones. Remplacement prioritaire avant `OMNIROUTE_KIE_CALLBACK_URL` et `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(non défini)_ | `open-sse/utils/kieTask.ts` | Autre nom de `KIE_CALLBACK_URL`. Sert de solution de repli lorsque la variable principale n’est pas définie. | +| `OMNIROUTE_PUBLIC_URL` | _(non défini)_ | `open-sse/utils/kieTask.ts` | Origine publique utilisée pour composer les URL de rappel asynchrones. Solution de repli de priorité la plus faible pour les rappels kie.ai ; également utilisée comme URL publique générique pour d’autres relais. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Point de terminaison de consultation du quota CrofAI utilisé par la page d’utilisation. À remplacer pour les relais / données de test. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Point de terminaison officiel d’utilisation d’OpenCode Go, authentifié par clé API et utilisé par la page d’utilisation. À remplacer pour les relais / données de test. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Synthétise les en-têtes d’identité d’OpenCode CLI (User-Agent, x-opencode-client/project, UUID de requête/session) dans les requêtes en amont opencode-go/zen lorsque le client ne les a pas envoyés, afin que Cloudflare les accepte sur les sorties VPS (#6210/#5997). Activé par défaut depuis #10571 ; désactivez-le avec `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent par défaut utilisé lorsque `OPENCODE_SYNTHESIZE_CLI_HEADERS` est activé et qu’aucun remplacement `_USER_AGENT` propre au fournisseur n’est défini. S’applique uniquement aux exécuteurs opencode. Pour une requête sans clé soumise aux contrôles du service en amont, une valeur configurée ne comportant pas `opencode/= 1.17>` est remplacée par cette valeur par défaut plutôt que d’être refusée. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Valeur de l’en-tête `x-opencode-client` synthétisé lorsque `OPENCODE_SYNTHESIZE_CLI_HEADERS` est activé. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Valeur de l’en-tête `x-opencode-project` synthétisé lorsque `OPENCODE_SYNTHESIZE_CLI_HEADERS` est activé. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(non défini)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Définissez cette variable sur `off` pour ne plus ajuster le corps des requêtes OpenCode sans clé (indicateur de streaming et liste des outils). Les en-têtes restent appliqués. La valeur est lue à chaque requête, de sorte qu’une modification prend effet immédiatement. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(non défini)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Noms d’outils séparés par des virgules à déclarer dans une requête OpenCode sans clé qui n’en contient aucun, lorsque rien n’a encore été observé pour ce modèle. Une valeur vide entraîne l’utilisation d’un unique outil fictif que le modèle reçoit pour instruction de ne pas appeler. Au maximum 32 entrées, `[A-Za-z_][A-Za-z0-9_-]{0,63}` ; les entrées non valides sont ignorées. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL des paramètres d’Ollama Cloud utilisée pour extraire les quotas. À remplacer pour les relais / données de test. | +| `OLLAMA_USAGE_COOKIE` | _(non défini)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` d’Ollama Cloud utilisé pour extraire les quotas depuis la page des paramètres. Sensible ; privilégiez le champ correspondant à chaque connexion dans le tableau de bord lorsque plusieurs comptes sont configurés. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(non défini)_ | `open-sse/services/usage.ts` | Autre variable d’environnement de cookie `__Secure-session` pour Ollama Cloud. Sensible ; privilégiez le champ correspondant à chaque connexion dans le tableau de bord lorsque plusieurs comptes sont configurés. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(non défini)_ | `open-sse/services/usage.ts` | Autre variable d’environnement de cookie `__Secure-session` pour Ollama Cloud, utilisée avant les alias plus courts. Sensible ; privilégiez le champ correspondant à chaque connexion dans le tableau de bord lorsque plusieurs comptes sont configurés. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Point de terminaison des limites d’utilisation de CodeWhisperer (AWS Kiro). À remplacer pour les relais / données de test. | > [!IMPORTANT] > Lors d’un déploiement derrière un proxy inverse (nginx, Caddy), définissez `NEXT_PUBLIC_BASE_URL` sur votre URL publique stable (par exemple, `https://omniroute.example.com`) lorsque les rappels OAuth ou les liens publics générés doivent utiliser ce nom d’hôte. Sans cela, les rappels OAuth peuvent échouer, car le redirect_uri ne correspondra pas, et les liens publics générés peuvent pointer vers l’origine interne du conteneur. > -> Conservez `BASE_URL` comme URL interne de bouclage ou de conteneur pour les tâches serveur à serveur. N’utilisez pas une valeur `Origin` provenant d’un navigateur ni un nom d’hôte public pour les auto-requêtes internes contenant des identifiants. +> Conservez `BASE_URL` comme URL interne de bouclage ou de conteneur pour les tâches serveur à serveur. N’utilisez pas une valeur `Origin` de navigateur ni un nom d’hôte public pour les auto-requêtes internes transportant des identifiants. > -> Les écritures authentifiées du tableau de bord ne nécessitent pas d’URL de base publique statique : le tableau de bord envoie les requêtes non sûres vers la même origine avec un jeton CSRF lié à la session. OmniRoute centralise néanmoins la validation de l’origine publique pour les intégrations de navigateur autres que le tableau de bord : les variables d’environnement explicites d’URL publique sont approuvées en priorité ; les en-têtes `Forwarded` / `X-Forwarded-*` bruts sont ignorés, sauf si `OMNIROUTE_TRUST_PROXY` est activé et que le pair proxy immédiat est identifié par un jeton comme étant approuvé. N’utilisez pas les paramètres CORS pour corriger les requêtes du tableau de bord vers la même origine ; CORS est réservé aux clients de navigateur interorigines. +> Les écritures authentifiées du tableau de bord ne nécessitent pas d’URL de base publique statique : le tableau de bord envoie les requêtes non sûres vers la même origine avec un jeton CSRF lié à la session. OmniRoute centralise néanmoins la validation de l’origine publique pour les intégrations de navigateur autres que le tableau de bord : les variables d’environnement explicites d’URL publique sont approuvées en premier ; les en-têtes bruts `Forwarded` / `X-Forwarded-*` sont ignorés, sauf si `OMNIROUTE_TRUST_PROXY` est activé et que l’homologue proxy immédiat est marqué comme approuvé par un jeton. N’utilisez pas les paramètres CORS pour corriger les requêtes du tableau de bord provenant de la même origine ; CORS ne concerne que les clients de navigateur interorigines. --- @@ -590,46 +597,47 @@ ci-dessus). ## 11. Identifiants des fournisseurs OAuth -Identifiants intégrés pour le **développement en localhost**. Pour les déploiements distants, enregistrez les vôtres dans la console de développement de chaque fournisseur. - -| Variable | Fournisseur | Remarques | -| --------------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Client public — aucun secret requis. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Remplace l’URI de redirection. Valeur par défaut : `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Client public. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Nécessite le `_SECRET` correspondant. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Client public. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Nécessite le `_SECRET` correspondant. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Client public. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Remplacement facultatif de l’ID client OAuth de GitHub Enterprise Copilot. Utilise la valeur publique par défaut de `GITHUB_OAUTH_CLIENT_ID` si cette variable n’est pas définie. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Clé API de secours utilisée par `open-sse/executors/devin-cli.ts` lorsqu’aucun identifiant propre à la connexion n’est disponible. Facultative. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Chemin personnalisé vers le binaire Devin CLI (`devin`). Résolu par `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID client OAuth pour GitLab Duo. Enregistrez une application sur `https://gitlab.com/-/profile/applications` avec l’URI de redirection `/callback` et les portées `api, read_user, openid, profile, email`. Utilise `GITLAB_OAUTH_CLIENT_ID` comme valeur de secours. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Secret client OAuth pour GitLab Duo. Facultatif — le flux PKCE ne nécessite aucun secret. Utilise `GITLAB_OAUTH_CLIENT_SECRET` comme valeur de secours. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Remplace l’URL de base de GitLab (GitLab auto-hébergé). Valeur par défaut : `https://gitlab.com`. Utilise `GITLAB_BASE_URL` comme valeur de secours. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Valeur de secours héritée pour `GITLAB_DUO_BASE_URL`. Utilisée lorsque la variante `_DUO_` n’est pas définie. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Valeur de secours héritée pour `GITLAB_DUO_OAUTH_CLIENT_ID`, utilisée par `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Valeur de secours héritée pour `GITLAB_DUO_OAUTH_CLIENT_SECRET`, utilisée par `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | À définir pour activer OAuth pour Qoder. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Clé API directe de secours (contourne OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | ID de l’espace de travail pour Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias de `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Remplace le répertoire de configuration de Qoder CLI (session PAT isolée, évite d’écraser une connexion via navigateur). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Jeton `tk` de l’interface à envoyer comme `validated` à `/api/chat`. Requis lorsque Blackbox impose la correspondance des jetons ; sinon, OmniRoute utilise un UUID aléatoire comme valeur de secours. Voir le ticket #2252. | -| `VISION_BRIDGE_BASE_URL` | Garde-fou Vision Bridge | URL de base compatible avec OpenAI pour les appels Vision Bridge non-Anthropic. Utilise par défaut l’ancienne variable d’environnement d’URL OpenAI ou api.openai.com. Faites-la pointer vers la boucle locale `/v1` d’OmniRoute ou vers tout point de terminaison compatible avec OpenAI (compatibilité OpenAI de Gemini, OpenRouter). Ticket #2232. Lorsque l’URL correspond au propre `/v1` d’OmniRoute, la sous-requête de description envoie `x-omniroute-admission-bypass: internal` et s’authentifie avec l’identifiant résolu de la boucle locale (valeur sentinelle `sk_omniroute` en mode local, ou `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), afin que les déploiements avec `REQUIRE_API_KEY=true` fonctionnent. | -| `VISION_BRIDGE_API_KEY` | Garde-fou Vision Bridge | Clé API pour l’URL ci-dessus. Remplace les variables d’environnement OpenAI / Google propres au fournisseur pour les appels Vision Bridge non-Anthropic. Les modèles Anthropic conservent leur chemin dédié pour la clé Anthropic. Ticket #2232. | +Identifiants intégrés pour le **développement sur localhost**. Pour les déploiements distants, enregistrez vos propres identifiants dans la console développeur de chaque fournisseur. + +| Variable | Fournisseur | Remarques | +| --------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Client public — aucun secret requis. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Remplace l’URI de redirection. Valeur par défaut : `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Client public. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Nécessite le `_SECRET` correspondant. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Client public. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Nécessite le `_SECRET` correspondant. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Client public. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Remplacement facultatif de l’identifiant client OAuth de GitHub Enterprise Copilot. S’il n’est pas défini, la valeur publique par défaut de `GITHUB_OAUTH_CLIENT_ID` est utilisée. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Remplacement facultatif de l’ID d’intégration du client GitHub Copilot envoyé dans les en-têtes `Copilot-Integration-Id` et `Editor-Plugin-Version`. La valeur par défaut est `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Clé API de secours utilisée par `open-sse/executors/devin-cli.ts` lorsqu’aucun identifiant propre à la connexion n’est disponible. Facultative. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Chemin personnalisé vers le binaire Devin CLI (`devin`). Résolu par `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID client OAuth pour GitLab Duo. Enregistrez une application à l’adresse `https://gitlab.com/-/profile/applications` avec l’URI de redirection `/callback` et les portées `api, read_user, openid, profile, email`. Utilise `GITLAB_OAUTH_CLIENT_ID` comme valeur de secours. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Secret client OAuth pour GitLab Duo. Facultatif — le flux PKCE ne nécessite aucun secret. Utilise `GITLAB_OAUTH_CLIENT_SECRET` comme valeur de secours. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Remplace l’URL de base de GitLab (GitLab auto-hébergé). La valeur par défaut est `https://gitlab.com`. Utilise `GITLAB_BASE_URL` comme valeur de secours. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Ancienne valeur de secours pour `GITLAB_DUO_BASE_URL`. Utilisée lorsque la variante `_DUO_` n’est pas définie. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Valeur de repli héritée pour `GITLAB_DUO_OAUTH_CLIENT_ID`, utilisée par `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Valeur de repli héritée pour `GITLAB_DUO_OAUTH_CLIENT_SECRET`, utilisée par `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | À définir pour activer OAuth pour Qoder. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Clé d'API directe de secours (contourne OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | ID de l'espace de travail pour la CLI Qoder. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias de `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Remplace le répertoire de configuration de la CLI Qoder (session PAT isolée, évite d'écraser une connexion via navigateur). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Jeton `tk` du frontend à envoyer en tant que `validated` sur `/api/chat`. Requis lorsque Blackbox impose la correspondance des jetons ; sinon, OmniRoute utilise un UUID aléatoire comme valeur de repli. Voir le ticket #2252. | +| `VISION_BRIDGE_BASE_URL` | Protection Vision Bridge | URL de base compatible avec OpenAI pour les appels de pont de vision non-Anthropic. Utilise par défaut la variable d'environnement de l'ancienne URL OpenAI ou api.openai.com. Pointez-la vers la boucle locale `/v1` d'OmniRoute ou vers n'importe quel point de terminaison compatible avec OpenAI (compatibilité OpenAI de Gemini, OpenRouter). Ticket #2232. Lorsque l'URL correspond au propre `/v1` d'OmniRoute, la sous-requête de description envoie `x-omniroute-admission-bypass: internal` et s'authentifie avec l'identifiant résolu de la boucle locale (sentinelle `sk_omniroute` en mode local, ou `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), afin que les déploiements avec `REQUIRE_API_KEY=true` fonctionnent. | +| `VISION_BRIDGE_API_KEY` | Protection Vision Bridge | Clé d'API pour l'URL ci-dessus. Remplace les variables d'environnement OpenAI / Google propres à chaque fournisseur pour les appels de pont de vision non-Anthropic. Les modèles Anthropic conservent leur chemin dédié pour la clé Anthropic. Ticket #2232. | > [!WARNING] > > 1. Accédez à [Google Cloud Console → Identifiants](https://console.cloud.google.com/apis/credentials) > 2. Créez un ID client OAuth 2.0 (type : « Application Web ») -> 3. Ajoutez l’URL de votre serveur en tant qu’URI de redirection autorisé +> 3. Ajoutez l'URL de votre serveur en tant qu'URI de redirection autorisé > 4. Remplacez les valeurs des identifiants dans `.env`. --- @@ -733,7 +741,7 @@ Format reconnu : `{PROVIDER_ID}_API_KEY` ## 15. Paramètres de délai d’expiration -Toutes les valeurs sont exprimées en **millisecondes**. Résolution centralisée dans `src/shared/utils/runtimeTimeouts.ts`. +Toutes les valeurs sont exprimées en **millisecondes**. La résolution est centralisée dans `src/shared/utils/runtimeTimeouts.ts`. ### Hiérarchie des délais d’expiration @@ -748,9 +756,9 @@ REQUEST_TIMEOUT_MS (remplacement global) │ ├── FETCH_CONNECT_TIMEOUT_MS (indépendant, valeur par défaut : 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (indépendant, valeur par défaut : 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (hérite de REQUEST_TIMEOUT_MS, valeur par défaut : 600000) -├─→ STREAM_ACTIVE_TIMEOUT_MS (indépendant, valeur par défaut : 1260000 ; 0 le désactive) +├─→ STREAM_ACTIVE_TIMEOUT_MS (indépendant, valeur par défaut : 1260000 ; 0 désactive ce délai) ├─→ STREAM_READINESS_TIMEOUT_MS (hérite de REQUEST_TIMEOUT_MS, valeur par défaut : 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (plafonne les extensions adaptatives de préparation, valeur par défaut : 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (limite les prolongations adaptatives de disponibilité, valeur par défaut : 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (hérite de REQUEST_TIMEOUT_MS, valeur par défaut : 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (dérivé, valeur par défaut : 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (valeur par défaut : 60000) @@ -758,114 +766,115 @@ REQUEST_TIMEOUT_MS (remplacement global) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (valeur par défaut : 0 = désactivé) ``` -| Variable | Valeur par défaut | Description | -| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(non définie)_ | Raccourci global — remplace les valeurs par défaut de `FETCH_TIMEOUT_MS` et `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Délai d’expiration total de la requête HTTP pour les appels aux fournisseurs en amont. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Durée maximale de silence entre les octets bruts reçus en amont avant l’abandon. Les modèles à raisonnement prolongé font rarement des pauses >90s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Durée de vie active totale maximale du flux SSE ; elle n’est jamais réinitialisée par les octets reçus en amont et est indépendante de `REQUEST_TIMEOUT_MS`. Dérivée de la plus grande valeur `timeoutMs` par modèle dans le registre (1200000, Codex), plus une marge de 60000, afin qu’un modèle autorisé à utiliser la totalité de son budget ne soit jamais interrompu en cours de réponse. Définissez-la sur `0` pour la désactiver. | -| `OMNIROUTE_SSE_COMMENTS` | _(désactivé)_ | Indique si OmniRoute peut émettre des lignes de commentaire SSE `:` (p. ex. le signal périodique `: keepalive` et les bandes-annonces de métadonnées `x-omniroute-*`). Désactivé par défaut (#10524), car les clients strictement compatibles avec OpenAI appliquent JSON.parse à chaque ligne SSE et plantent sur les commentaires `:` ; les signaux périodiques `data:` ne sont pas affectés. Définissez cette variable sur `on`/`true`/`1`/`yes` pour les réactiver. Utilisé par `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Délai pour recevoir le premier événement SSE autre qu’un ping. Hérite de `REQUEST_TIMEOUT_MS` lorsque cette variable est définie. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Fenêtre adaptative maximale d’attente du premier événement pour les requêtes en streaming volumineuses, utilisant beaucoup d’outils ou nécessitant un raisonnement poussé. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Coupe-circuit pour l’heuristique `/goal`. Définissez cette variable sur `false`/`0`/`off` pour désactiver complètement la détection — les délais d’attente avant disponibilité et la récupération du flux ne sont jamais augmentés en fonction du corps ou des en-têtes de la requête, ce qui limite l’amplification des délais contrôlée par le client. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Fenêtre maximale d’attente du premier événement pour les exécutions d’agent `/goal` détectées ou les requêtes forcées avec `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Active automatiquement la récupération précoce du flux pour les exécutions d’agent `/goal` détectées. Définissez cette variable sur `false`/`0`/`off` pour désactiver l’activation propre aux objectifs. Cela peut uniquement AJOUTER la récupération au réglage par défaut de l’opérateur — cela ne remplace jamais une désactivation explicite dans `STREAM_RECOVERY_ENABLED` ou les paramètres de la base de données. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Supprime les événements SSE `codex.*` non standard (p. ex. `codex.rate_limits`) qui provoquent une erreur 502 dans `responses.stream()` du SDK OpenAI. Activé par défaut (#11014). Définissez cette variable sur `0`/`false`/`no`/`off` pour les transmettre. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(non définie)_ | Activation facultative du transport Codex app-server. Point de terminaison WebSocket (`ws://`/`wss://`) d’un side-car local `codex app-server`. Lorsque cette variable est définie avec un jeton, les requêtes Codex sont acheminées via JSON-RPC vers le side-car au lieu de l’API HTTP Responses. Également configurable par connexion via `providerSpecificData.codexAppServerUrl`. Utilisé par `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(non définie)_ | Jeton de capacité/d’authentification en ligne présenté à l’app-server. Remplacement par connexion : `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(non définie)_ | Chemin vers un fichier contenant le jeton de capacité de l’app-server (provenant de `codex app-server --ws-token-file`). Utilisé lorsque `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` n’est pas définie. Remplacement par connexion : `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Répertoire de travail dans lequel s’exécute le tour de l’app-server. Remplacement par connexion : `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(non définie)_ | Politique d’approbation transmise au tour de l’app-server (p. ex. `never`, `on-request`). Remplacement par connexion : `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(non définie)_ | Politique de bac à sable transmise au tour de l’app-server (p. ex. `read-only`, `workspace-write`, `danger-full-access`). Lorsqu’elle n’est pas définie, l’exécuteur utilise par défaut `workspace-write` (sécurisé ; auparavant `danger-full-access`). Remplacement par connexion : `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Approuve automatiquement les demandes d’approbation propres à l’app-server (exécution de commandes/fichiers/permissions sur l’hôte). Désactivé par défaut — les demandes sont automatiquement refusées ; les appels d’outils du harnais ne sont pas affectés (ils transitent par le mécanisme distinct `item/tool/call`). Accepte `true`/`1`/`yes`. Remplacement par connexion : `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Délai pour recevoir les en-têtes de réponse. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Délai maximal d’attente du début de la réponse (ms) pour chaque tentative directe sans proxy. En cas d’expiration du délai, une nouvelle tentative est effectuée une fois sur un nouveau socket ; définissez cette valeur sur `0` pour désactiver la limite et conserver le comportement précédent. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Délai pour recevoir l’intégralité du corps de la réponse. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Délai d’expiration pour l’établissement de la connexion TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Délai d’inactivité du socket keep-alive. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Délai d’expiration du proxy d’empreinte TLS (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Limite spécifiquement le délai avant réception du premier octet du corps sur le transport d’empreinte TLS wreq-js ; `TLS_CLIENT_TIMEOUT_MS` ne peut pas, à lui seul, détecter un corps bloqué, car il se résout dès l’arrivée des en-têtes (#12656). En cas d’expiration du délai, le lecteur wreq est annulé et le répartiteur direct/proxy prend le relais ; `0` désactive le mécanisme de surveillance. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Uniquement pour l’exécuteur OpenCode, et seulement lorsque l’indicateur de fonctionnalité `OPENCODE_RESPONSES_STALL_ROTATION` est activé (désactivé par défaut) : limite l’attente du premier octet du corps d’une réponse Responses diffusée en continu après réception de ses en-têtes (#13484). Un flux Responses s’ouvre avec `response.created` ; l’absence de données au-delà de cette fenêtre est donc considérée comme un blocage : le compte est temporairement mis en pause et la requête bascule une fois vers le compte suivant ; un second blocage provoque un échec immédiat. `0` désactive cette protection même lorsque l’indicateur est activé. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Délai d’expiration du saut de proxy pour les requêtes de pont `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Dirige l’exécuteur de récupération web Firecrawl vers une instance auto-hébergée (clé API facultative hors cloud). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Délai d’expiration par requête pour l’exécuteur de récupération web Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Délai d’expiration global des requêtes serveur pour le pont. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Délai pour envoyer les en-têtes de réponse via le pont. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Délai d’inactivité keep-alive du pont. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Délai d’expiration du socket brut (0 = désactivé). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Délai de grâce après SIGTERM/SIGINT avant l’arrêt forcé. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Valeur de repli utilisée par `src/shared/utils/fetchTimeout.ts` lorsque `FETCH_TIMEOUT_MS` n’est pas défini. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Délai d’expiration (ms) pour les préréglages `validationRead` et `modelsProbe` dans `src/shared/network/safeOutboundFetch.ts`. Augmentez-le pour les points de terminaison lents (Cerebras, Cloudflare AI, Groq) afin d’éviter les basculements répétés entre les états actif/erreur dans le tableau de bord. Revient à 8000 ms pour les valeurs non valides (<1000) ou non numériques. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Délai d’expiration de récupération propre au relais dans `open-sse/utils/proxyFetch.ts` (#9158). Un relais bloqué doit échouer avant l’expiration du délai du client/agent (~30 s), afin que les appelants reçoivent une erreur propre au relais plutôt qu’un délai d’expiration générique du service en amont. Plafonné à `29000` afin qu’il se déclenche toujours en premier. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Temporisation partagée avant nouvelle tentative pour les chemins direct/relais/proxy qui réessaient une fois dans `open-sse/utils/proxyFetch.ts` (#9158). `0` = nouvelle tentative immédiate. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Délai d’expiration natif des requêtes wreq-js (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance absolue JS en complément du délai d’expiration natif. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Délai d’expiration natif des requêtes wreq-js (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance absolue JS en complément du délai d’expiration natif. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (désactivé) | Ajoute « You have built-in web search. Answer questions directly using search results. » au message système de l’appelant (`perplexity-web/protocol.ts`). Désactivé par défaut — Perplexity effectue de toute façon des recherches, et cette phrase apparaît dans les réponses sous forme de méta-commentaire pour les clients de programmation. Définissez la valeur sur `1`/`true`/`yes`/`on` pour la réactiver. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Délai d’expiration des requêtes natives wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance absolue stricte côté JS, en plus du délai d’expiration natif. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Délai d’expiration des requêtes natives wreq-js (`notionTlsClient.ts`) ; `notion-web` le porte à `180000` pour chaque requête lors des générations longues. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance absolue stricte côté JS, en plus du délai d’expiration natif. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Pool de navigateurs Playwright partagé pour les conversations basées sur les cookies web et exécutées dans un navigateur (`browserPool.ts`) ; définissez la valeur sur `off` pour le désactiver. | -| `OBSCURA_BIN` | `auto-detect` | Chemin vers le binaire `obscura` utilisé comme moteur principal par le pool de navigateurs et l’exécuteur Cloudflare Playground (`open-sse/services/obscura.ts`) ; détecté automatiquement dans le PATH du système lorsque la variable n’est pas définie. | -| `OBSCURA_CDP_ENDPOINT` | _(non défini)_ | Pointe vers une instance Obscura déjà en cours d’exécution (`http://host:port`) au lieu d’en lancer une ; le module ne gère pas ce processus (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `port libre aléatoire` | Port explicite pour le processus `obscura serve` lancé ; un port libre est choisi automatiquement lorsque la variable n’est pas définie (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Fait passer une requête de conversation utilisant des cookies web par le chemin reposant sur le navigateur (`browserBackedChat.ts`) ; `1` pour l’activer. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL de base de l’exécuteur Kimi Web (Connect-RPC international de kimi.ai) (`kimi-web.ts`) ; ne la remplacez que pour les points de terminaison miroir/proxy. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Point de terminaison complet de conversation pour l’exécuteur Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(détecté automatiquement)_ | Chemin vers un exécutable Chrome/Edge du système pour la connexion interactive à Adobe Firefly dans le navigateur (`adobeFireflyBrowserLogin.ts`) ; remplace la détection automatique propre à chaque système d’exploitation. | -| `OMNIROUTE_STANDALONE_DIR` | _sortie autonome .build/_ | Remplacement, au moment de la compilation, du répertoire de sortie autonome utilisé par l’étape de colocalisation post-compilation (`scripts/build/colocate-standalone.mjs`) ; concerne les outils de compilation, pas l’exécution. | - -Les tentatives sur les cibles combinées héritent du délai d’expiration résolu de la requête en amont (`FETCH_TIMEOUT_MS`, ou -`REQUEST_TIMEOUT_MS` lorsqu’il fournit la valeur par défaut de récupération). Définissez `targetTimeoutMs` dans une combinaison, -dans les valeurs par défaut des combinaisons ou dans une substitution propre au fournisseur uniquement pour accélérer le basculement de la combinaison ; les valeurs supérieures au -délai d’expiration en amont actuel sont plafonnées à celui-ci. - -`comboTimeoutMs` constitue un budget d’horloge murale distinct pour l’ensemble de la combinaison, couvrant toutes les cibles de basculement. -Laissez-le non défini ou défini sur `0` pour conserver une itération illimitée (le mécanisme d’arrêt en cas de blocage de 10 minutes +| Variable | Valeur par défaut | Description | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUEST_TIMEOUT_MS` | _(non définie)_ | Raccourci global — remplace les valeurs par défaut de `FETCH_TIMEOUT_MS` et `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Délai d’expiration total de la requête HTTP pour les appels aux fournisseurs en amont. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Durée maximale de silence entre les octets bruts reçus en amont avant l’abandon. Les modèles à raisonnement étendu marquent rarement une pause de plus de 90 s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Durée de vie active totale maximale du flux SSE ; elle n’est jamais réinitialisée par les octets reçus en amont et est indépendante de `REQUEST_TIMEOUT_MS`. Dérivée de la plus grande valeur `timeoutMs` par modèle dans le registre (1200000, Codex), avec une marge supplémentaire de 60000, afin qu’un modèle autorisé à utiliser tout son budget ne soit jamais interrompu en cours de réponse. Définissez-la sur `0` pour la désactiver. | +| `OMNIROUTE_SSE_COMMENTS` | _(désactivé)_ | Indique si OmniRoute peut émettre des lignes de commentaire SSE `:` (par ex. le signal périodique `: keepalive` et les bandes-annonces de métadonnées `x-omniroute-*`). Désactivé par défaut (#10524), car les clients strictement compatibles avec OpenAI appliquent JSON.parse à chaque ligne SSE et échouent sur les commentaires `:` ; les signaux périodiques `data:` ne sont pas affectés. Définissez sur `on`/`true`/`1`/`yes` pour les réactiver. Utilisé par `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Délai pour recevoir le premier événement SSE autre qu’un ping. Hérite de `REQUEST_TIMEOUT_MS` lorsque cette variable est définie. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Fenêtre adaptative maximale d’attente du premier événement pour les requêtes en streaming volumineuses, utilisant beaucoup d’outils ou nécessitant un raisonnement poussé. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Coupe-circuit pour l’heuristique `/goal`. Définissez sur `false`/`0`/`off` pour désactiver entièrement la détection — les délais de préparation et la récupération du flux ne sont jamais augmentés en fonction du corps ou des en-têtes de la requête, ce qui atténue l’amplification des délais contrôlée par le client. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Fenêtre maximale d’attente du premier événement pour les exécutions d’agent `/goal` détectées ou les requêtes forcées avec `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Active automatiquement la récupération anticipée du flux pour les exécutions d’agent `/goal` détectées. Définissez sur `false`/`0`/`off` pour désactiver l’activation propre aux objectifs. Cela peut uniquement AJOUTER la récupération par-dessus la valeur par défaut de l’opérateur — cela ne remplace jamais une désactivation explicite via `STREAM_RECOVERY_ENABLED` ou les paramètres de la base de données. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Supprime les événements SSE `codex.*` non standard (par ex. `codex.rate_limits`) qui provoquent une erreur 502 dans `responses.stream()` du SDK OpenAI. Activé par défaut (#11014). Définissez sur `0`/`false`/`no`/`off` pour les transmettre. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(non définie)_ | Transport optionnel par serveur d’application Codex. Point de terminaison WebSocket (`ws://`/`wss://`) d’un side-car local `codex app-server`. Lorsqu’il est défini avec un jeton, les requêtes Codex sont acheminées vers le side-car via JSON-RPC plutôt que par l’API HTTP Responses. Également configurable pour chaque connexion via `providerSpecificData.codexAppServerUrl`. Utilisé par `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(non définie)_ | Jeton de capacité/bearer intégré présenté au serveur d’application. Remplacement par connexion : `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(non définie)_ | Chemin d’accès à un fichier contenant le jeton de capacité du serveur d’application (provenant de `codex app-server --ws-token-file`). Utilisé lorsque `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` n’est pas définie. Remplacement par connexion : `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Répertoire de travail dans lequel s’exécute le tour du serveur d’application. Remplacement par connexion : `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(non définie)_ | Politique d’approbation transmise au tour du serveur d’application (par ex. `never`, `on-request`). Remplacement par connexion : `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(non définie)_ | Politique de bac à sable transmise au tour du serveur d’application (par ex. `read-only`, `workspace-write`, `danger-full-access`). Lorsqu’elle n’est pas définie, l’exécuteur utilise par défaut `workspace-write` (configuration renforcée ; auparavant `danger-full-access`). Remplacement par connexion : `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Approuve automatiquement les propres demandes d’approbation du serveur d’application (exécution de commandes, de fichiers ou d’autorisations sur l’hôte). Désactivé par défaut — les demandes sont automatiquement refusées ; les appels d’outils du harnais ne sont pas affectés (ils transitent par le mécanisme de transfert distinct `item/tool/call`). Accepte `true`/`1`/`yes`. Remplacement par connexion : `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Délai pour recevoir les en-têtes de réponse. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 s) | Délai d’attente maximal (ms) avant le début de la réponse pour chaque tentative directe sans proxy. En cas d’expiration du délai, une nouvelle tentative est effectuée une fois sur un nouveau socket ; définissez cette valeur sur `0` pour désactiver la limite et conserver le comportement précédent. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Limite maximale (ms) pour la tentative RETRY sur un nouveau socket après l’expiration du délai d’attente du début de la réponse d’une tentative utilisant un socket du pool ci-dessus (#13703). S’applique uniquement lorsque l’appelant a déjà associé son propre signal d’échéance (la cascade résolue connexion/modèle/fournisseur/`FETCH_TIMEOUT_MS`) ; ce signal constitue la véritable limite et se déclenche en premier dans le chemin prévu. Il s’agit donc d’un généreux filet de sécurité plutôt que d’un plafond fixe — sans celui-ci, la nouvelle tentative réutilisait la même courte fenêtre `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` que la tentative utilisant le pool et renvoyait une erreur 504 pour des modèles de raisonnement sains mais à TTFB lent. Cette valeur ne peut jamais être inférieure au seuil fixe ci-dessus ; lorsque l’appelant ne fournit aucun signal d’échéance, la nouvelle tentative conserve le seuil fixe inchangé. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Délai pour recevoir l’intégralité du corps de la réponse. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Délai d’expiration de l’établissement de la connexion TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Délai d’inactivité du socket keep-alive. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Délai d’expiration du proxy d’empreinte TLS (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Limite spécifiquement le délai avant le premier octet du corps sur le transport d’empreinte TLS wreq-js ; `TLS_CLIENT_TIMEOUT_MS` seul ne peut pas détecter un corps bloqué, car il se résout dès l’arrivée des en-têtes (#12656). L’expiration du délai annule le lecteur wreq et revient au répartiteur direct/proxy ; `0` désactive le mécanisme de surveillance. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Exécuteur OpenCode uniquement, et seulement lorsque l’indicateur de fonctionnalité `OPENCODE_RESPONSES_STALL_ROTATION` est activé (désactivé par défaut) : limite l’attente du premier octet du corps d’une réponse Responses diffusée en continu après ses en-têtes (#13484). Un flux Responses s’ouvre avec `response.created` ; l’absence de données au-delà de cette fenêtre constitue donc un blocage : le compte est mis en période de refroidissement et la requête bascule une fois vers le compte suivant ; un second blocage provoque un échec immédiat. `0` désactive cette protection même lorsque l’indicateur est activé. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Délai d’expiration du saut de proxy pour les requêtes du pont `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Orientez l’exécuteur de récupération web Firecrawl vers une instance auto-hébergée (clé API facultative hors cloud). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Délai d’expiration par requête pour l’exécuteur de récupération web Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Délai d’expiration global des requêtes serveur pour le pont. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Délai pour envoyer les en-têtes de réponse via le pont. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Délai d’inactivité keep-alive du pont. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Délai d’expiration du socket brut (`0` = désactivé). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Délai de grâce après SIGTERM/SIGINT avant l’arrêt forcé. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Valeur de repli utilisée par `src/shared/utils/fetchTimeout.ts` lorsque `FETCH_TIMEOUT_MS` n’est pas défini. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Délai d’expiration (ms) pour les préréglages `validationRead` et `modelsProbe` dans `src/shared/network/safeOutboundFetch.ts`. Augmentez-le pour les points de terminaison lents (Cerebras, Cloudflare AI, Groq) afin d’éviter les basculements répétés entre les états actif/erreur dans le tableau de bord. Revient à 8000 ms pour les valeurs non valides (<1000) ou non numériques. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Délai d’expiration de récupération propre au relais dans `open-sse/utils/proxyFetch.ts` (#9158). Un relais bloqué doit échouer avant le délai d’expiration du client/de l’agent (~30 s), afin que les appelants voient une erreur propre au relais plutôt qu’un délai d’expiration générique du service en amont. Plafonné à `29000` afin qu’il se déclenche toujours en premier. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Délai d’attente partagé entre les nouvelles tentatives pour les chemins direct/relais/proxy à tentative unique dans `open-sse/utils/proxyFetch.ts` (#9158). `0` = nouvelle tentative immédiate. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Délai d’expiration natif des requêtes wreq-js (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance stricte absolue côté JS, en plus du délai d’expiration natif. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Délai d’expiration natif des requêtes wreq-js (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance stricte absolue côté JS, en plus du délai d’expiration natif. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (désactivé) | Ajoute « Vous disposez d’une recherche Web intégrée. Répondez directement aux questions à l’aide des résultats de recherche. » au message système de l’appelant (`perplexity-web/protocol.ts`). Désactivé par défaut — Perplexity effectue tout de même des recherches, et cette phrase apparaît dans les réponses sous forme de métacommentaire pour les clients de programmation. Définissez cette valeur sur `1`/`true`/`yes`/`on` pour rétablir ce comportement. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Délai d’expiration natif des requêtes wreq-js (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance stricte absolue côté JS, en plus du délai d’expiration natif. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Délai d’expiration natif des requêtes wreq-js (`notionTlsClient.ts`) ; `notion-web` le porte à `180000` pour chaque requête lors des générations longues. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Délai de grâce ajouté à l’échéance stricte absolue côté JS, en plus du délai d’expiration natif. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Pool de navigateurs Playwright partagé pour les conversations utilisant des cookies Web et reposant sur un navigateur (`browserPool.ts`) ; définissez cette valeur sur `off` pour le désactiver. | +| `OBSCURA_BIN` | `auto-detect` | Chemin vers le binaire `obscura` utilisé comme moteur principal par le pool de navigateurs et l’exécuteur Cloudflare Playground (`open-sse/services/obscura.ts`) ; détecté automatiquement dans le PATH du système lorsque cette variable n’est pas définie. | +| `OBSCURA_CDP_ENDPOINT` | _(non défini)_ | Permet de cibler une instance Obscura déjà en cours d’exécution (`http://host:port`) au lieu d’en lancer une ; le module n’est pas propriétaire de ce processus (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `random free port` | Port explicite pour l’instance `obscura serve` lancée ; un port libre est choisi automatiquement lorsque cette variable n’est pas définie (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Fait passer une requête de conversation utilisant des cookies Web par le chemin reposant sur un navigateur (`browserBackedChat.ts`) ; utilisez `1` pour l’activer. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL de base de l’exécuteur Kimi Web (Connect-RPC international de kimi.ai) (`kimi-web.ts`) ; ne la remplacez que pour des points de terminaison miroir/proxy. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Point de terminaison complet de conversation pour l’exécuteur Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(détecté automatiquement)_ | Chemin vers un exécutable Chrome/Edge du système pour la connexion interactive à Adobe Firefly dans un navigateur (`adobeFireflyBrowserLogin.ts`) ; remplace la détection automatique propre à chaque système d’exploitation. | +| `OMNIROUTE_STANDALONE_DIR` | _sortie autonome .build/_ | Remplacement, lors de la compilation, du répertoire de sortie autonome utilisé par l’étape de colocalisation post-compilation (`scripts/build/colocate-standalone.mjs`) ; concerne les outils de compilation, et non l’exécution. | + +Les tentatives sur les cibles d’un combo héritent du délai d’expiration résolu de la requête en amont (`FETCH_TIMEOUT_MS`, ou +`REQUEST_TIMEOUT_MS` lorsqu’il fournit la valeur par défaut de la récupération). Définissez `targetTimeoutMs` dans un combo, +dans les valeurs par défaut des combos ou dans un remplacement propre au fournisseur uniquement pour accélérer le repli du combo ; les valeurs supérieures au +délai d’expiration en amont actuel sont plafonnées à ce dernier. + +`comboTimeoutMs` constitue un budget d’horloge murale distinct pour l’ensemble du combo sur toutes les cibles de basculement. +Laissez-le non défini ou définissez-le sur `0` pour conserver une itération illimitée (le mécanisme d’arrêt en cas de blocage de 10 minutes `COMBO_LOOP_SAFETY_TIMEOUT_MS` reste applicable). Une valeur positive remplace ce -filet de sécurité pour la combinaison. Définissez `comboTimeoutMs` sur une durée supérieure à `targetTimeoutMs` afin que le basculement -dispose encore de suffisamment de temps après une première cible lente. +mécanisme de sécurité pour le combo. Définissez `comboTimeoutMs` sur une durée supérieure à `targetTimeoutMs` afin que le basculement +dispose encore de temps après une première cible lente. ### Seuils du disjoncteur Réglage du disjoncteur au niveau du fournisseur. Les valeurs par défaut correspondent aux valeurs mises à l’échelle utilisées depuis la v3.6 pour plus de 500 connexions. -| Variable | Valeur par défaut | Fichier source | Description | -| ------------------------------------------------------------- | ----------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Seuil d’échecs consécutifs pour les fournisseurs OAuth avant le déclenchement du coupe-circuit. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Fenêtre de réinitialisation (ms) du coupe-circuit des fournisseurs OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Seuil d’échecs consécutifs pour les fournisseurs utilisant une clé API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Fenêtre de réinitialisation (ms) du coupe-circuit des fournisseurs utilisant une clé API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Seuil d’échecs consécutifs pour les fournisseurs locaux (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Fenêtre de réinitialisation (ms) du coupe-circuit des fournisseurs locaux. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : nombre d’échecs dans la fenêtre avant que l’ensemble du fournisseur OAuth n’entre en période de récupération. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : fenêtre glissante de comptage des échecs (ms) pour les fournisseurs OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : période de récupération (ms) une fois le seuil du fournisseur OAuth atteint. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Le fournisseur OAuth passe à l’état DEGRADED à partir de ce nombre d’échecs. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Multiplicateur maximal d’augmentation de resetTimeout pour le fournisseur OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Le fournisseur OAuth augmente le délai après ce nombre de cycles d’ouverture. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : nombre d’échecs dans la fenêtre avant que l’ensemble du fournisseur utilisant une clé API n’entre en période de récupération. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : fenêtre glissante de comptage des échecs (ms) pour les fournisseurs utilisant une clé API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : période de récupération (ms) une fois le seuil du fournisseur utilisant une clé API atteint. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Le fournisseur utilisant une clé API passe à l’état DEGRADED à partir de ce nombre d’échecs. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Multiplicateur maximal d’augmentation de resetTimeout pour le fournisseur utilisant une clé API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Le fournisseur utilisant une clé API augmente le délai après ce nombre de cycles d’ouverture. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : nombre d’échecs avant que l’ensemble du fournisseur local n’entre en période de récupération. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : fenêtre glissante de comptage des échecs (ms) pour les fournisseurs locaux. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Coupe-circuit au niveau du fournisseur : période de récupération (ms) une fois le seuil du fournisseur local atteint. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Niveau de temporisation à partir duquel le fournisseur associé à un verrou du cache de contexte est considéré comme durablement défaillant et le verrou est supprimé pour permettre le basculement. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Fenêtre anti-oscillation (ms) tolérant de brèves périodes de récupération transitoires avant la suppression d’un verrou du cache de contexte. | +| Variable | Valeur par défaut | Fichier source | Description | +| ------------------------------------------------------------- | ----------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Seuil d'échecs consécutifs des fournisseurs OAuth avant le déclenchement du disjoncteur. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Fenêtre de réinitialisation (ms) du disjoncteur des fournisseurs OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Seuil d'échecs consécutifs des fournisseurs utilisant une clé API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Fenêtre de réinitialisation (ms) du disjoncteur des fournisseurs utilisant une clé API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Seuil d'échecs consécutifs des fournisseurs locaux (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Fenêtre de réinitialisation (ms) du disjoncteur des fournisseurs locaux. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : nombre d'échecs dans la fenêtre avant que l'ensemble du fournisseur OAuth n'entre en temporisation. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : fenêtre glissante de comptage des échecs (ms) pour les fournisseurs OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : temporisation (ms) une fois le seuil du fournisseur OAuth atteint. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Le fournisseur OAuth passe à l'état DEGRADED à partir de ce nombre d'échecs. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Multiplicateur maximal d'augmentation de resetTimeout pour le fournisseur OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Le fournisseur OAuth augmente le délai après ce nombre de cycles d'ouverture. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : nombre d'échecs dans la fenêtre avant que l'ensemble du fournisseur utilisant une clé API n'entre en temporisation. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : fenêtre glissante de comptage des échecs (ms) pour les fournisseurs utilisant une clé API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : temporisation (ms) une fois le seuil du fournisseur utilisant une clé API atteint. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Le fournisseur utilisant une clé API passe à l'état DEGRADED à partir de ce nombre d'échecs. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Multiplicateur maximal d'augmentation de resetTimeout pour le fournisseur utilisant une clé API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Le fournisseur utilisant une clé API augmente le délai après ce nombre de cycles d'ouverture. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : nombre d'échecs avant que l'ensemble du fournisseur local n'entre en temporisation. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : fenêtre glissante de comptage des échecs (ms) pour les fournisseurs locaux. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Disjoncteur au niveau du fournisseur : temporisation (ms) une fois le seuil du fournisseur local atteint. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Profondeur de temporisation à partir de laquelle le fournisseur associé à un ancrage du cache de contexte est considéré comme durablement défaillant, entraînant l'abandon de l'ancrage pour permettre le basculement. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Fenêtre anti-oscillation (ms) tolérant de brèves temporisations transitoires avant l'abandon d'un ancrage du cache de contexte. | ### Scénarios -| Scénario | Configuration | -| ----------------------------------------- | ------------------------------------------------------- | -| **Génération de code longue durée** | `REQUEST_TIMEOUT_MS=900000` (15 min) | -| **Limiter la durée totale du flux** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | -| **Échec rapide pour l’API de production** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Modèles à raisonnement prolongé** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min entre les blocs) | +| Scénario | Configuration | +| ------------------------------------------------ | ----------------------------------------------------------- | +| **Génération de code de longue durée** | `REQUEST_TIMEOUT_MS=900000` (15 min) | +| **Limitation de la durée de vie totale du flux** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | +| **Échec rapide pour l'API de production** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Modèles à raisonnement prolongé** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min entre les fragments) | --- @@ -1112,68 +1121,68 @@ de bureau standard. --- -## 21. Santé du proxy - -| Variable | Valeur par défaut | Fichier source | Description | -| ------------------------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Délai d’expiration de la vérification d’état à échec rapide. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Fenêtre temporelle (en heures) utilisée pour calculer la latence moyenne des proxys candidats dans la stratégie de pool optimisée pour la latence. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Durée de vie du cache des résultats de vérification d’état. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Durée de vie du cache pour les sondes d’état de proxy ayant échoué. Conservez-la plus courte que `PROXY_HEALTH_CACHE_TTL_MS` afin que les expirations temporaires des proxys sous forte concurrence soient rapidement retentées, sans désactiver l’échec rapide pour les proxys réellement hors service. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Définissez sur `false` pour désactiver le planificateur d’état des proxys en arrière-plan, qui sonde périodiquement les proxys enregistrés. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Intervalle, en ms, entre les balayages du planificateur d’état en arrière-plan (minimum `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Cible de la sonde d’accessibilité utilisée par le planificateur et le point de terminaison `/api/settings/proxies/auto-test`. Faites-la pointer vers une URL interne/auto-hébergée pour éviter la valeur publique par défaut. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Nombre de sondes lancées simultanément par lot, partagé par le planificateur et le point de terminaison `/api/settings/proxies/auto-test`. Valeur minimale de 1 et maximale de 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Délai en ms entre deux départs de sondes au sein d’un lot. Sans ce délai, l’ensemble du lot part au même moment et une adresse IP de sortie partagée peut déclencher la limitation de débit de la cible. Définissez sur `0` pour désactiver l’espacement ; valeur maximale de 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Définissez sur `false` pour cesser de sonder l’hôte réel du fournisseur attribué à un proxy (`GET /models`, sans clé API) et toujours utiliser `PROXY_HEALTH_TEST_URL` à la place. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Lorsque la valeur est `false` (par défaut), les sondes automatisées d’accessibilité (le planificateur + le bouton « Tout tester » de `/api/settings/proxies/auto-test`) sont **en lecture seule** et ne modifient jamais l’état d’un proxy — seul l’opérateur définit celui-ci comme actif/inactif, afin qu’une sonde instable ne puisse pas rendre un proxy attribué inutilisable (#6246). Définissez sur `true` pour restaurer l’ancien comportement de test et de mise à jour. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Indicateur de fonctionnalité à activation volontaire (voir [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; une surcharge provenant de la base de données du tableau de bord est prioritaire). `true` (ou `1`, `yes`) affiche dans le tableau de bord l’observation en lecture seule des sorties d’un pool de proxys (adresses IP de sortie distinctes, connexions et nombre maximal observé derrière une même adresse IP au cours des dernières 24 h, d’après le journal des proxys). Jamais utilisé pour le routage. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Définissez sur `true` pour permettre au planificateur de supprimer automatiquement les proxys après plusieurs échecs consécutifs. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Nombre d’échecs consécutifs avant que le planificateur ne supprime automatiquement un proxy (lorsque `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Définissez sur `true` pour permettre au planificateur de désactiver de manière réversible un proxy (état `dead`, jamais supprimé) après plusieurs échecs consécutifs, au lieu de le supprimer. Alternative non destructive à `PROXY_AUTO_REMOVE` : le proxy est immédiatement exclu de la résolution du pool/de la rotation (le filtre d’état actif utilisé par la résolution du pool de portée l’exclut déjà) et est automatiquement réactivé dès qu’il réussit de nouveau les sondes. Utilise le même seuil `PROXY_AUTO_REMOVE_AFTER`. Si les deux indicateurs valent `true`, `PROXY_AUTO_REMOVE` est prioritaire. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Autorise les flux OAuth et de validation des fournisseurs à contourner un proxy imposé et à se connecter directement lorsque les pré-vérifications d’accessibilité du proxy échouent. L’ordre de priorité effectif est : surcharge de la base de données des indicateurs de fonctionnalité > variable d’environnement > valeur par défaut. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `open-sse/services/rateLimitManager.ts` | Durée maximale d’attente en cas de réponse 429 avant de faire échouer la requête. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Limite maximale pendant laquelle une requête admise peut rester en cours d’exécution avant l’expiration de sa réservation de limitation de débit — découplée du budget d’attente dans la file afin qu’un démarrage lent de la récupération sur les passerelles non incrémentales n’entraîne pas d’expiration (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (désactivé) | `open-sse/services/rateLimitManager.ts` | Limite d’admission dans la file : rejette avec une réponse 429 `queue_full` dès que ce nombre de requêtes est déjà en attente. `0` = illimité (par défaut). | -| `RATE_LIMIT_AUTO_ENABLE` | _(non défini)_ | `open-sse/services/rateLimitManager.ts` | Force l’activation ou la désactivation du filet de sécurité de limitation automatique du débit, indépendamment du paramètre persistant du tableau de bord. Accepte `true`/`1`/`on` pour forcer l’activation et `false`/`0`/`off` pour forcer la désactivation. | -| `PROVIDER_COOLDOWN_ENABLED` | _(non défini → désactivé)_ | `open-sse/services/providerCooldownTracker.ts` | Suivi global et interrequêtes, à activation volontaire, des périodes de récupération des fournisseurs/connexions. DÉSACTIVÉ par défaut (chevauche la période de récupération des connexions/le disjoncteur des fournisseurs). Accepte `true`/`1`/`on` pour l’activer. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Période de récupération minimale (ms) avant de réessayer un fournisseur/une connexion ayant échoué. Augmente exponentiellement avec les échecs consécutifs. Utilisé uniquement lorsque `PROVIDER_COOLDOWN_ENABLED` est activé. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Limite maximale de la période de récupération (ms) avant de réessayer dans tous les cas un fournisseur/une connexion ayant échoué. Utilisé uniquement lorsque `PROVIDER_COOLDOWN_ENABLED` est activé. | -| `STREAM_RECOVERY_ENABLED` | _(non défini → désactivé)_ | `src/lib/resilience/settings.ts` (initialisation) → `open-sse/services/streamRecovery.ts` (logique) | **Fonction :** récupération transparente des flux en amont tronqués (portage de free-claude-code). Retient la fenêtre SSE initiale jusqu’à `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), afin qu’une interruption _avant validation_ — qui se produit avant qu’un seul octet n’atteigne le client — soit rouverte et retentée de manière invisible. **Quand l’activer :** pour les flux en amont instables qui sont fréquemment tronqués à 0 octet au démarrage ; laissez-la DÉSACTIVÉE si vous ne pouvez pas accepter jusqu’à 750 ms supplémentaires avant le premier jeton sur chaque flux. Accepte `true`/`1`/`on`. Initialise le paramètre persistant de résilience ; une fois défini, le paramètre du tableau de bord est prioritaire. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(non défini → désactivé)_ | `src/lib/resilience/settings.ts` (initialisation) → `open-sse/services/streamRecovery.ts` (logique) | **Fonction :** continuation en cours de flux (phase 4.4) — après une troncation _postérieure à la validation_ (des octets ont déjà atteint le client), relance la requête avec le texte partiel comme préremplissage de l’assistant et raccorde le suffixe manquant. Uniquement pour les flux OpenAI compatibles en texte brut ; ne se déclenche jamais lorsqu’un appel d’outil est en cours. **Quand l’activer :** pour les longues générations interrompues au milieu d’une réponse, si vous acceptez que la fin récupérée arrive en un seul bloc plutôt que jeton par jeton. Indépendant de `STREAM_RECOVERY_ENABLED` (profil de risque différent). Accepte `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(non défini → désactivé)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Chien de garde, à activation volontaire, de la sortie utile des flux actifs. Détecte les flux qui continuent à envoyer des fragments, mais restent sous le débit configuré de sortie de l’assistant ; les signaux de maintien de connexion, les événements d’utilisation, les deltas vides et les phases d’outil/de raisonnement ne sont pas considérés à tort comme une progression. Distinct des délais d’inactivité et des échéances strictes. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Délai de grâce avant l’évaluation du débit, limité à 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Fenêtre glissante de sortie utile, limitée à 1000–600000 ms ; une fenêtre complète est requise avant l’interruption. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Débit minimal, en octets UTF-8 par seconde, de la sortie de l’assistant (approximation prudente du débit de jetons), limité à 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Échantillon minimal non nul de sortie utile considéré comme mesurable, limité à 1–1000000 octets. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Intervalle d’échelonnement (ms) entre les vérifications d’état des jetons des fournisseurs au démarrage. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Variation aléatoire minimale (ms) ajoutée à `HEALTHCHECK_STAGGER_MS` entre les vérifications d’état des jetons des fournisseurs, afin d’éviter les rafales (problème #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Variation aléatoire maximale (ms) ajoutée à `HEALTHCHECK_STAGGER_MS` entre les vérifications d’état des jetons des fournisseurs, afin d’éviter les rafales (problème #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Taille des lots de vérifications simultanées pour le balayage d’état des jetons au démarrage ; les valeurs élevées vérifient davantage de connexions en parallèle, tandis que les valeurs faibles réduisent la charge en rafale (problème #7875, régression de #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Nombre de nouvelles tentatives automatiques en cas de réponses de période de récupération propres au modèle, avant de renvoyer une erreur au client. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Intervalle maximal d’attente progressive (en secondes) entre les nouvelles tentatives après une période de récupération. Limité à cette valeur indépendamment de l’en-tête `Retry-After` en amont. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL du proxy d’économie de jetons Headroom. Par défaut, le cycle de vie du tableau de bord (`api/headroom/*`) lance une CLI `headroom-ai` locale sur l’interface de bouclage ; ne remplacez cette valeur que pour pointer vers un proxy side-car Docker externe. | +## 21. Santé des proxys + +| Variable | Valeur par défaut | Fichier source | Description | +| ------------------------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Délai d’expiration de la vérification de santé en échec rapide. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Fenêtre temporelle (en heures) utilisée pour calculer la latence moyenne des proxys candidats dans la stratégie de pool optimisée pour la latence. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Durée de vie du cache des résultats de vérification de santé. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Durée de vie du cache pour les sondes de santé de proxy ayant échoué. Conservez-la plus courte que `PROXY_HEALTH_CACHE_TTL_MS` afin que les délais d’expiration transitoires des proxys en cas de forte concurrence soient rapidement retentés, sans désactiver l’échec rapide pour les proxys réellement hors service. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Définissez cette variable sur `false` pour désactiver le planificateur de santé des proxys en arrière-plan qui sonde périodiquement les proxys enregistrés. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Intervalle en ms entre les cycles du planificateur de santé en arrière-plan (minimum `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Cible de la sonde d’accessibilité utilisée par le planificateur et le point de terminaison `/api/settings/proxies/auto-test`. Faites-la pointer vers une URL interne/auto-hébergée pour éviter la cible publique par défaut. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Nombre de sondes lancées simultanément par lot, partagé par le planificateur et le point de terminaison `/api/settings/proxies/auto-test`. Valeur ramenée à un minimum de 1 et plafonnée à 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Délai en ms entre deux départs de sonde au sein d’un lot. Sans ce délai, l’ensemble du lot part au même moment et une adresse IP de sortie partagée peut déclencher la limitation de débit d’une cible. Définissez cette valeur sur `0` pour désactiver l’espacement ; elle est plafonnée à 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Définissez sur "false" pour cesser de sonder l’hôte réel du fournisseur attribué à un proxy (`GET /models`, sans clé d’API) et toujours utiliser `PROXY_HEALTH_TEST_URL` à la place. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Lorsque la valeur est `false` (par défaut), les sondes d’accessibilité automatisées (le planificateur et le bouton « Test All » de `/api/settings/proxies/auto-test`) sont **en lecture seule** et ne modifient jamais le statut d’un proxy — seul l’opérateur définit son état actif/inactif, afin qu’une sonde instable ne puisse pas rendre indisponible un proxy attribué (#6246). Définissez la valeur sur `true` pour rétablir l’ancien comportement de test et de mise à jour du statut. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Indicateur de fonctionnalité à activation volontaire (voir [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; une substitution dans la base de données du tableau de bord est prioritaire). `true` (ou `1`, `yes`) affiche, sous un pool de proxys dans le tableau de bord, l’observation en lecture seule des sorties du pool (adresses IP de sortie distinctes, connexions et nombre maximal observé derrière une même adresse IP au cours des dernières 24 h, d’après le journal des proxys). Jamais utilisé pour le routage. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Définissez sur `true` pour permettre au planificateur de supprimer automatiquement les proxys après des échecs consécutifs répétés. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Nombre d’échecs consécutifs avant que le planificateur ne supprime automatiquement un proxy (lorsque `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Définissez sur `true` pour permettre au planificateur de désactiver temporairement (statut `dead`, jamais supprimé) un proxy après plusieurs échecs consécutifs, au lieu de le supprimer. Alternative non destructive à `PROXY_AUTO_REMOVE` : le proxy est immédiatement exclu de la résolution du pool/de la rotation (le filtre d’état actif utilisé par la résolution des pools de portée l’exclut déjà) et est automatiquement réactivé dès qu’il réussit de nouveau les sondes. Utilise le même seuil `PROXY_AUTO_REMOVE_AFTER`. Si les deux indicateurs sont définis sur `true`, `PROXY_AUTO_REMOVE` prévaut. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Autorise les flux OAuth et de validation des fournisseurs à contourner un proxy épinglé et à se connecter directement lorsque les vérifications préalables d’accessibilité du proxy échouent. L’ordre de priorité effectif est le suivant : remplacement dans la base de données des indicateurs de fonctionnalités > variable d’environnement > valeur par défaut. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 s) | `src/lib/resilience/settings.ts` | Budget d’**attente dans la file** par défaut : durée pendant laquelle une requête peut attendre un emplacement de fournisseur et rester en file avant d’être rejetée, sans jamais atteindre le service en amont. Le minuteur est effacé dès que la tâche commence à s’exécuter — l’exécution est limitée séparément par `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. La variable d’environnement définit uniquement la valeur par défaut : une valeur persistante `resilienceSettings.requestQueue.maxWaitMs`, puis une valeur `rateLimitOverrides.maxWaitMs` propre à la connexion, sont chacune prioritaires sur celle-ci. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Durée maximale pendant laquelle une requête admise peut rester en cours d’exécution avant l’expiration de sa réservation de limite de débit — découplée du budget d’attente dans la file afin qu’un démarrage lent de la récupération sur les passerelles non incrémentales n’expire pas (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (désactivé) | `open-sse/services/rateLimitManager.ts` | Limite d’admission dans la file : rejette avec une erreur 429 `queue_full` lorsque ce nombre de requêtes est déjà en file. `0` = sans limite (valeur par défaut). | +| `RATE_LIMIT_AUTO_ENABLE` | _(non défini)_ | `open-sse/services/rateLimitManager.ts` | Force l’activation ou la désactivation du filet de sécurité d’activation automatique de la limitation de débit, quel que soit le paramètre persistant du tableau de bord. Accepte `true`/`1`/`on` pour forcer l’activation, et `false`/`0`/`off` pour forcer la désactivation. | +| `PROVIDER_COOLDOWN_ENABLED` | _(non défini → désactivé)_ | `open-sse/services/providerCooldownTracker.ts` | Active facultativement le suivi global, entre requêtes, des délais de récupération des fournisseurs/connexions. DÉSACTIVÉ par défaut (chevauche les fonctionnalités de délai de récupération des connexions et de disjoncteur des fournisseurs). Accepte `true`/`1`/`on` pour l’activer. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Délai de récupération minimal (ms) avant qu’une nouvelle tentative ne soit effectuée pour un fournisseur/une connexion ayant échoué. Augmente exponentiellement avec les échecs consécutifs. Utilisé uniquement lorsque `PROVIDER_COOLDOWN_ENABLED` est activé. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Plafond maximal du délai de récupération (ms) avant qu’un fournisseur/une connexion en échec ne soit réessayé, quoi qu’il arrive. Utilisé uniquement lorsque `PROVIDER_COOLDOWN_ENABLED` est activé. | +| `STREAM_RECOVERY_ENABLED` | _(non défini → désactivé)_ | `src/lib/resilience/settings.ts` (initialisation) → `open-sse/services/streamRecovery.ts` (logique) | **Fonctionnement :** récupération transparente des flux en amont tronqués (portage de free-claude-code). Maintient en attente la fenêtre SSE initiale pendant une durée maximale de `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), afin qu’une interruption _avant validation_ — survenant avant qu’un seul octet n’atteigne le client — entraîne une réouverture et une nouvelle tentative de manière invisible. **Quand l’activer :** pour les flux en amont instables qui sont fréquemment tronqués sans aucun octet au démarrage ; laissez cette option DÉSACTIVÉE si vous ne pouvez pas accepter jusqu’à 750 ms supplémentaires avant le premier jeton pour chaque flux. Accepte `true`/`1`/`on`. Initialise le paramètre de résilience persistant ; une fois défini, le paramètre du tableau de bord prévaut. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(non défini → désactivé)_ | `src/lib/resilience/settings.ts` (initialisation) → `open-sse/services/streamRecovery.ts` (logique) | **Fonctionnement :** continuation en milieu de flux (phase 4.4) — après une troncature _postérieure à la validation_ (des octets ont déjà atteint le client), relance la requête en utilisant le texte partiel comme préremplissage de l’assistant, puis raccorde le suffixe manquant. Uniquement pour les flux en texte brut compatibles avec OpenAI ; ne se déclenche jamais lorsqu’un appel d’outil est en cours. **Quand l’activer :** pour les longues générations interrompues au milieu d’une réponse, si vous acceptez que la partie récupérée arrive en un seul bloc plutôt que jeton par jeton. Indépendant de `STREAM_RECOVERY_ENABLED` (profil de risque différent). Accepte `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(non défini → désactivé)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Chien de garde facultatif de la sortie utile des flux actifs. Détecte les flux qui continuent à envoyer des fragments, mais dont le débit de sortie de l’assistant reste inférieur au seuil configuré ; les signaux de présence, les événements d’utilisation, les deltas vides et les phases d’utilisation d’outils ou de raisonnement ne sont pas considérés à tort comme une progression. Distinct des délais d’expiration pour inactivité et des échéances strictes. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Période de grâce avant l’évaluation du débit, limitée à 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Fenêtre glissante de sortie utile, limitée à 1000–600000 ms ; une fenêtre complète est requise avant l’interruption. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Débit minimal en octets UTF-8 de la sortie de l’assistant (approximation prudente du débit de jetons), limité à 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Taille minimale non nulle d’un échantillon de sortie utile considéré comme mesurable, limitée à 1–1000000 octets. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Intervalle de décalage (ms) entre les contrôles d’intégrité des jetons des fournisseurs au démarrage. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Gigue aléatoire minimale (ms) ajoutée à `HEALTHCHECK_STAGGER_MS` entre les contrôles d’intégrité des jetons des fournisseurs, afin d’éviter les envois en rafale (problème nº 1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Gigue aléatoire maximale (ms) ajoutée à `HEALTHCHECK_STAGGER_MS` entre les contrôles d’intégrité des jetons des fournisseurs, afin d’éviter les envois en rafale (problème nº 1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Taille des lots de vérifications simultanées lors du balayage de contrôle d’intégrité des jetons au démarrage ; des valeurs plus élevées vérifient davantage de connexions en parallèle, tandis que des valeurs plus faibles réduisent la charge en rafale (problème #7875, régression de #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Nombre de nouvelles tentatives automatiques en cas de réponses de temporisation propres au modèle avant de renvoyer une erreur au client. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Intervalle maximal d’attente exponentielle (en secondes) entre les nouvelles tentatives après temporisation. Plafonné à cette valeur, quelle que soit la valeur de l’en-tête en amont `Retry-After`. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL du proxy d’économie de jetons Headroom. Par défaut, le cycle de vie du tableau de bord (`api/headroom/*`) lance une CLI `headroom-ai` locale sur l’interface de bouclage ; ne remplacez cette valeur que pour pointer vers un proxy side-car Docker externe. | ### Constantes de réglage de la récupération des flux -Le comportement de mise en attente lors de la récupération est réglé par des constantes codées en dur dans +Le comportement de mise en attente de la récupération est réglé au moyen de constantes codées en dur dans `open-sse/config/constants.ts` (`STREAM_RECOVERY`), présentées ici à titre de référence — -leur modification nécessite de changer le code, et non une variable d’environnement : +leur modification nécessite de modifier le code, et non une variable d’environnement : -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — durée pendant laquelle la fenêtre SSE initiale est mise en attente - afin qu’une troncature précoce puisse faire l’objet d’une nouvelle tentative avant qu’un quelconque octet ne soit envoyé au client. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — limite stricte de la fenêtre mise en attente ; validation +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — durée pendant laquelle la fenêtre SSE initiale est conservée + afin qu’une troncation précoce puisse faire l’objet d’une nouvelle tentative avant qu’un octet ne soit transmis au client. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — limite stricte de la fenêtre conservée ; validation (vidage + transmission directe) dès que ce nombre d’octets est accumulé, indépendamment du minuteur. - `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — nombre maximal de réouvertures transparentes du flux - en amont tant que le contenu mis en attente n’a pas encore été validé. + en amont tant que la mise en attente n’a pas encore été validée. -> **Limite de débit par fenêtre glissante et par fournisseur (aucune variable d’environnement) :** la solution de _repli_ de limitation -> de débit par fenêtre glissante et par fournisseur, portée depuis FCC, existe dans le code -> (`open-sse/services/providerDefaultRateLimit.ts`, intégrée via -> `open-sse/services/rateLimitManager.ts`), mais est fournie avec une **table de correspondance vide par défaut** -> et ne dispose actuellement d’**aucune variable d’environnement pour l’opérateur** — elle est activée uniquement via un point d’injection de test / -> une modification du code. Elle n’est volontairement pas répertoriée dans le tableau ci-dessus. Le limiteur de relais par `(token, IP)` -> qui, lui, dispose d’un paramètre de réglage est `RELAY_IP_PER_MINUTE` (§3 Réseau et ports). +> **Limite de débit par fenêtre glissante et par fournisseur (aucune variable d’environnement) :** le mécanisme de repli +> de limite de débit par fenêtre glissante et par fournisseur, porté depuis FCC, existe dans le code +> (`open-sse/services/providerDefaultRateLimit.ts`, raccordé via +> `open-sse/services/rateLimitManager.ts`), mais est fourni avec une **table de correspondance vide par défaut** +> et ne dispose actuellement d’**aucune variable d’environnement pour l’opérateur** — il n’est activé que par un point d’injection de test / +> une modification du code. Il n’est volontairement pas répertorié dans le tableau ci-dessus. Le limiteur de relais par `(jeton, adresse IP)` +> qui _dispose_ d’un paramètre est `RELAY_IP_PER_MINUTE` (§3 Réseau et ports). --- @@ -1182,32 +1191,33 @@ leur modification nécessite de changer le code, et non une variable d’environ > [!CAUTION] > Ces variables produisent une **sortie détaillée** et peuvent divulguer des données sensibles. **Ne les activez jamais en production.** -| Variable | Valeur par défaut | Fichier source | Description | -| ------------------------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(non définie)_ | `open-sse/executors/cursor.ts` | Définissez-la sur `1` pour activer les journaux détaillés de l’exécuteur Cursor (fragments SSE décodés, etc.). | -| `CURSOR_STREAM_DEBUG` | _(non définie)_ | `open-sse/executors/cursor.ts` | Alias rétrocompatible de `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(non définie)_ | `open-sse/executors/cursor.ts` | Chemin de fichier facultatif recevant les fragments Cursor bruts décodés lorsque `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Délai d’inactivité du flux (ms) pour l’exécuteur Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Période de grâce (ms) après un terminateur souple composer kv_after_text lorsque des octets restent en mémoire tampon — laisse à un appel d’outil exec_mcp final le temps de terminer sa trame. | -| `CURSOR_TOOL_DIRECTIVE` | activée (`!== "0"`) | `open-sse/executors/cursor.ts` | Directive de validation d’outil permettant à composer-2.5 d’émettre des appels d’outils de manière fiable. Définissez-la sur `0` pour la désactiver. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(non définie)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Texte d’invite système défini par l’opérateur et ajouté au message système APRÈS la traduction (injection post-traduction), atteignant les chemins codex/Responses et `/v1/messages`. Également utilisé comme préfixe de directive supprimé des blocs de préambule système reproduits. Laissez cette variable non définie pour désactiver cette fonctionnalité. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Délai d’expiration par image (ms) pour la récupération d’une entrée visuelle `image_url` distante. | -| `CURSOR_STATE_DB_PATH` | _(détectée)_ | `open-sse/utils/cursorVersionDetector.ts` | Remplace la recherche de la base de données d’état de l’IDE Cursor utilisée pour détecter la version de l’IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(détection / valeur imposée)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Identifiant de build de l’interface CLI de l’agent (`YYYY.MM.DD-`) pour `x-cursor-client-version: cli-…` lors de l’exécution de l’agent. | -| `CURSOR_AGENT_BIN` | _(non définie)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Chemin vers le binaire Cursor Agent utilisé pour la génération d’images. Si cette variable n’est pas définie, le gestionnaire utilise `providerSpecificData.agentBin`, puis PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Durée maximale réelle par image (ms) pour les tâches d’image Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Limite de concurrence du siège partagé pour les tâches d’image Cursor. | -| `CURSOR_IMG_MODEL` | requête / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Remplace l’option `--model` de la CLI Cursor pour les tâches d’image. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Fréquence d’interrogation des résultats de génération d’images UC (uncensored.com) (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Durée maximale réelle de l’interrogation des résultats de génération d’images UC (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Fréquence d’interrogation des résultats de génération de vidéos UC (uncensored.com) (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Durée maximale réelle de l’interrogation des résultats de génération de vidéos UC (ms). | -| `CURSOR_DATA_DIR` | _(détectée)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Remplace le répertoire de données de la CLI Cursor Agent (`…/versions/`) ; il s’agit de la même variable que celle utilisée par l’agent officiel. | -| `CURSOR_TOKEN` | _(non définie)_ | `scripts/ad-hoc/cursor-tap.cjs` | Jeton bearer Cursor direct utilisé par les outils de développement. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | désactivée (activation explicite via `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Journalise les marqueurs de type et de longueur du contenu pour les charges utiles de chat volumineuses lorsque la valeur `"1"` est définie. Désactivée par défaut afin de réduire le bruit dans les journaux. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(non définie)_ | `open-sse/handlers/responseTranslator.ts` | Définissez-la sur `true` pour journaliser les détails de traduction SSE→JSON de l’API Responses. | -| `DEBUG_CLAUDE_NONSTREAM` | _(non définie)_ | `open-sse/handlers/responseTranslator.ts` | Définissez-la sur `true` pour afficher les fragments textContent vides dans le chemin de traduction des réponses Claude (débogage uniquement). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(non définie)_ | Banc de test E2E | Définissez-la sur `true` pour activer le mode de test E2E (authentification assouplie, points d’accroche de test). | +| Variable | Valeur par défaut | Fichier source | Description | +| ------------------------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(non définie)_ | `open-sse/executors/cursor.ts` | Définissez cette variable sur `1` pour activer les journaux détaillés de l’exécuteur Cursor (fragments SSE décodés, etc.). | +| `CURSOR_STREAM_DEBUG` | _(non définie)_ | `open-sse/executors/cursor.ts` | Alias rétrocompatible de `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(non définie)_ | `open-sse/executors/cursor.ts` | Chemin de fichier facultatif recevant les fragments Cursor bruts décodés lorsque `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Délai d’expiration d’inactivité du flux (ms) pour l’exécuteur Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Fenêtre de grâce (ms) après un terminateur souple composer kv_after_text lorsque des octets restent en mémoire tampon — laisse à un appel d’outil exec_mcp final le temps de terminer sa trame. | +| `CURSOR_TOOL_DIRECTIVE` | activée (`!== "0"`) | `open-sse/executors/cursor.ts` | Directive de validation d’outil qui permet à composer-2.5 d’émettre des appels d’outils de manière fiable. Définissez-la sur `0` pour la désactiver. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(non définie)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Texte d’invite système défini par l’opérateur et ajouté au message système APRÈS la traduction (injection post-traduction), atteignant les chemins codex/Responses et `/v1/messages`. Également utilisé comme préfixe de directive supprimé des blocs de préambule système renvoyés en écho. Laissez cette variable non définie pour désactiver cette fonctionnalité. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (désactivée) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Définissez cette variable sur `1` pour supprimer les blocs de préambule d’invite système renvoyés en écho au début d’un flux openai→claude. Désactivée par défaut — les heuristiques sont conçues pour de la prose anglaise et modifient la charge utile de la réponse ; une réponse commençant légitimement par une telle section la perdrait donc. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Délai d’expiration de récupération par image (ms) pour une entrée de vision `image_url` distante. | +| `CURSOR_STATE_DB_PATH` | _(détectée)_ | `open-sse/utils/cursorVersionDetector.ts` | Remplace la recherche de la base de données d’état de l’IDE Cursor utilisée pour détecter la version de l’IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(détecter / fixer)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Identifiant de build de l’interface CLI de l’agent (`YYYY.MM.DD-`) pour `x-cursor-client-version: cli-…` sur Agent Run. | +| `CURSOR_AGENT_BIN` | _(non définie)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Chemin vers le binaire Cursor Agent utilisé pour la génération d’images. Lorsqu’elle n’est pas définie, le gestionnaire utilise `providerSpecificData.agentBin`, puis PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Temps écoulé maximal par image (ms) pour les tâches d’image de Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Limite de concurrence du poste partagé pour les tâches d’image Cursor. | +| `CURSOR_IMG_MODEL` | requête / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Remplace l’option `--model` de la CLI Cursor pour les tâches d’image. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Fréquence d’interrogation des résultats de génération d’images UC (uncensored.com) (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Durée maximale d’interrogation des résultats de génération d’images UC (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Fréquence d’interrogation des résultats de génération de vidéos UC (uncensored.com) (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Durée maximale d’interrogation des résultats de génération de vidéos UC (ms). | +| `CURSOR_DATA_DIR` | _(détecté)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Remplace le répertoire de données de la CLI Cursor Agent (`…/versions/`) ; il s’agit de la même variable que celle utilisée par l’agent officiel. | +| `CURSOR_TOKEN` | _(non définie)_ | `scripts/ad-hoc/cursor-tap.cjs` | Jeton de porteur Cursor direct utilisé par les outils de développement. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | désactivée (activation explicite via `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Consigne les indicateurs de type et de longueur du contenu pour les charges utiles de discussion volumineuses lorsque cette variable est définie sur `"1"`. Désactivée par défaut pour réduire le bruit dans les journaux. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(non définie)_ | `open-sse/handlers/responseTranslator.ts` | Définissez cette variable sur `true` pour journaliser les détails de la traduction SSE→JSON de l’API Responses. | +| `DEBUG_CLAUDE_NONSTREAM` | _(non définie)_ | `open-sse/handlers/responseTranslator.ts` | Définissez cette variable sur `true` pour faire apparaître les fragments textContent vides dans le chemin de traduction des réponses Claude (débogage uniquement). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(non définie)_ | Banc de test E2E | Définissez cette variable sur `true` pour activer le mode de test E2E (authentification assouplie, points d’accroche de test). | --- diff --git a/docs/i18n/fr/docs/reference/FEATURE_FLAGS.md b/docs/i18n/fr/docs/reference/FEATURE_FLAGS.md index 4f3dc4eab172..fc3e1ac0ec4a 100644 --- a/docs/i18n/fr/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/fr/docs/reference/FEATURE_FLAGS.md @@ -44,143 +44,145 @@ Un indicateur booléen est considéré comme **activé** lorsque sa valeur effec ## Catalogue des indicateurs -72 indicateurs répartis dans 6 catégories. La valeur **Par défaut** est celle de la définition — la valeur -utilisée lorsqu’il n’existe ni remplacement en base de données ni variable d’environnement. +74 indicateurs répartis en 6 catégories. La valeur **Par défaut** est celle définie par défaut — la valeur +utilisée lorsqu’aucune substitution en base de données ni aucune variable d’environnement n’est présente. ### Sécurité (10) -| Clé | Type | Par défaut | Description | -| --------------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | booléen | `false` | Exiger une clé API pour toutes les requêtes entrantes. | -| `INPUT_SANITIZER_ENABLED` | booléen | `true` | Activer l’assainissement des entrées pour toutes les requêtes. | -| `INJECTION_GUARD_MODE` | enum | `off` | Mode de protection contre l’injection de prompts. Valeurs : `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | booléen | `false` | Masquer les informations personnelles identifiables dans les requêtes (indépendamment de `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | booléen | `false` | Assainir les informations personnelles identifiables dans les réponses des fournisseurs. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Mode d’assainissement des informations personnelles identifiables dans les réponses. Valeurs : `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | booléen | `true` | Bloquer les requêtes sortantes vers les plages d’adresses IP privées/internes. | -| `ALLOW_API_KEY_REVEAL` | booléen | `false` | Autoriser les utilisateurs authentifiés du tableau de bord à révéler les clés API stockées au lieu de n’afficher que des valeurs masquées. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | booléen | `false` | Inclure le préfixe du compte dans les lignes de journal AUTH (par ex. « Utilisation du compte : abc12345... »). Désactivé par défaut afin de masquer les identifiants de compte dans les journaux de processus partagés/multilocataires. Indépendant du mode de débogage ; l’activation de ce mode ne révèle pas ces identifiants. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | booléen | `false` | Lorsque l’OIDC est activé, désactiver la connexion par mot de passe afin que les utilisateurs ne puissent s’authentifier que via l’authentification unique OIDC. Lorsque cette option est désactivée (par défaut), la connexion par mot de passe et l’OIDC sont tous deux disponibles. | - -### Réseau (15) - -| Clé | Type | Valeur par défaut | Redémarrage | Description | -| ----------------------------------------------- | ------- | ----------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | booléen | `false` | ✓ | Active le mode furtif d’empreinte TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | booléen | `false` | | Autorise les routes /v1/audio/* à utiliser des nœuds de fournisseurs compatibles avec OpenAI hébergés en dehors de localhost. Désactivé par défaut — acheminer l’audio vers un hôte distant modifie l’identité de sortie et doit résulter d’une décision explicite de l’opérateur. Les nœuds de bouclage sont toujours autorisés et ne sont pas concernés. | -| `PROXY_AUTO_SELECT_ENABLED` | booléen | `false` | | Lorsqu’aucun proxy n’est attribué à une connexion, sélectionne automatiquement le premier proxy fonctionnel du registre. Désactivé par défaut (sinon, tout proxy du registre devient une solution de repli globale — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | booléen | `false` | | Autorise les flux de validation OAuth et des fournisseurs à contourner un proxy imposé et à se connecter directement lorsque les vérifications préalables d’accessibilité du proxy échouent. Désactivé par défaut, car cela peut modifier l’adresse IP de sortie. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | booléen | `true` | | Lors d’une exception réseau (expiration du délai, connexion refusée/réinitialisée) pour un exécuteur de rotation multicomptes, lorsque le compte en échec ne dispose d’aucun proxy dédié, applique une courte période de récupération et ignore les autres comptes sans proxy pour le reste de la requête au lieu de les réessayer un par un. Activé par défaut (sûr : aucun changement d’adresse IP de sortie, réduit uniquement le risque de latence/période de récupération pour les comptes partageant la même sortie). Désactivez cette option pour rétablir la propagation immédiate dès la première exception d’un compte sans proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | booléen | `false` | | Les pools de proxys et la rotation par compte d’opencode cessent de resservir un proxy qui vient d’échouer (sonde TCP refusée ou erreur 429 reçue par son intermédiaire) pendant une durée propre au processus, qui double à chaque nouvel échec jusqu’à un plafond. Aucun statut de proxy n’est enregistré ; si tous les candidats sont mis de côté, le choix reste inchangé. Désactivé par défaut. | -| `PROXY_POOL_EGRESS_OBSERVATION` | booléen | `false` | | Affiche, sous un pool de proxys dans le tableau de bord, combien d’adresses IP de sortie observées ont servi ses membres au cours des dernières 24 h et combien de connexions les ont utilisées. En lecture seule, calculé à partir du journal des proxys et jamais utilisé pour le routage. Désactivé par défaut. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | booléen | `false` | | Pour l’exécuteur OpenCode, surveille le premier octet du corps d’une réponse Responses diffusée en continu (fenêtre : `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, valeur par défaut `15000`). Un flux Responses 2xx qui reste silencieux au-delà de cette fenêtre est considéré comme bloqué : le compte est placé en période de récupération et la requête bascule une fois vers le compte suivant ; un second blocage provoque un échec immédiat. Désactivé par défaut : les flux bloqués conservent le délai d’attente actuel jusqu’à l’expiration du délai de disponibilité du flux. | -| `OPENCODE_USER_BLOCKED_ROTATION` | booléen | `false` | | Exécuteur OpenCode : lors d’une erreur 403/451 contenant un refus `user_blocked` (non lié à la géolocalisation ni à un rejet d’empreinte Cloudflare), place le compte refusé en période de récupération et bascule vers le compte suivant au plus une fois par requête ; un second refus est renvoyé tel quel, sans marque de réussite. Désactivé par défaut : contourner le blocage d’un utilisateur en amont peut ressembler à une tentative d’évasion et propager le signalement à l’ensemble du parc. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | booléen | `false` | | Rotation OpenCode : après deux défaillances transitoires consécutives en amont (5xx ou erreur 400 vide), marque une pause avant de passer au compte suivant — 1,5 s, doublée à chaque défaillance supplémentaire, avec un plafond de 6 s par pause et de 10 s par requête, et ignorée en cas de déconnexion du client ; le corps de la réponse en échec est libéré avant l’attente. Désactivé par défaut : le basculement reste immédiat. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | booléen | `false` | | Rotation OpenCode : arrête la vague de comptes à la première erreur 429 classée comme une véritable limitation de débit (`Retry-After` analysable ou corps mentionnant une limite de débit/d’utilisation) et renvoie cette erreur 429 en amont sans la modifier. Les erreurs 429 non classées poursuivent la rotation. Désactivé par défaut : le niveau gratuit est limité par adresse IP de sortie (#9611), donc chaque erreur 429 déclenche une rotation et une vague épuisée renvoie la dernière erreur 429 reçue en amont. | -| `MITM_DISABLE_TLS_VERIFY` | booléen | `false` | ✓ | Désactive la vérification des certificats TLS pour le proxy MITM. **Danger.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | booléen | `false` | | Autorise les URL de fournisseurs pointant vers des réseaux privés/internes. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | booléen | `true` | | Autorise l’ajout et la validation de fournisseurs sur des adresses locales/privées (127.0.0.1, localhost, LAN). Activé par défaut (priorité au local) ; désactivez cette option pour imposer un blocage strict n’autorisant que les adresses publiques. Les métadonnées cloud restent bloquées. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | booléen | `false` | ✓ | Active le mode de fournisseur compatible avec Claude Code. | +| Clé | Type | Par défaut | Description | +| --------------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | booléen | `false` | Exiger une clé d’API pour toutes les requêtes entrantes. | +| `INPUT_SANITIZER_ENABLED` | booléen | `true` | Activer l’assainissement des entrées pour toutes les requêtes. | +| `INJECTION_GUARD_MODE` | énum. | `off` | Mode de protection contre l’injection de prompt. Valeurs : `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | booléen | `false` | Masquer les informations personnelles identifiables dans les requêtes (indépendamment de `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | booléen | `false` | Assainir les informations personnelles identifiables dans les réponses des fournisseurs. | +| `PII_RESPONSE_SANITIZATION_MODE` | énum. | `redact` | Mode d’assainissement des informations personnelles identifiables dans les réponses. Valeurs : `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | booléen | `true` | Bloquer les requêtes sortantes vers les plages d’adresses IP privées/internes. | +| `ALLOW_API_KEY_REVEAL` | booléen | `false` | Autoriser les utilisateurs authentifiés du tableau de bord à afficher les clés d’API stockées au lieu de voir uniquement des valeurs masquées. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | booléen | `false` | Inclure le préfixe du compte dans les lignes de journal AUTH (par exemple, « Using account: abc12345... »). Désactivé par défaut afin que les identifiants de compte soient masqués dans les journaux de processus partagés ou mutualisés. Indépendant du mode débogage ; activer ce mode ne les révèle pas. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | booléen | `false` | Lorsque l’OIDC est activé, désactiver la connexion par mot de passe afin que les utilisateurs puissent s’authentifier uniquement via l’authentification unique OIDC. Lorsque cette option est désactivée (valeur par défaut), la connexion par mot de passe et l’OIDC sont tous deux disponibles. | + +### Réseau (16) + +| Clé | Type | Valeur par défaut | Redémarrage | Description | +| ----------------------------------------------- | ------- | ----------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | booléen | `false` | ✓ | Active le mode furtif d’empreinte TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | booléen | `false` | | Autorise les routes /v1/audio/* à utiliser des nœuds de fournisseur compatibles avec OpenAI hébergés en dehors de localhost. Désactivé par défaut — l’acheminement de l’audio vers un hôte distant modifie l’identité de sortie et doit résulter d’une décision explicite de l’opérateur. Les nœuds de bouclage sont toujours autorisés et ne sont pas affectés. | +| `RERANK_REMOTE_PROVIDER_NODES` | booléen | `false` | | Autorise POST /v1/rerank (ainsi que l’étape de reclassement en bouclage du moteur de mémoire) à utiliser des nœuds de fournisseur compatibles avec OpenAI hébergés en dehors de localhost. Désactivé par défaut — l’acheminement vers un hôte distant modifie l’identité de sortie et doit résulter d’une décision explicite de l’opérateur. Les nœuds de bouclage sont toujours autorisés ; les nœuds distants doivent également respecter la politique du fournisseur relative aux URL sortantes. | +| `PROXY_AUTO_SELECT_ENABLED` | booléen | `false` | | Lorsqu’aucun proxy n’est affecté à une connexion, sélectionne automatiquement le premier proxy fonctionnel du registre. Désactivé par défaut (sinon, n’importe quel proxy du registre devient une solution de repli globale — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | booléen | `false` | | Autorise les flux de validation OAuth et de fournisseur à contourner un proxy imposé et à se connecter directement lorsque les vérifications préalables d’accessibilité du proxy échouent. Désactivé par défaut, car cela peut modifier l’adresse IP de sortie. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | booléen | `true` | | En cas d’exception réseau (expiration du délai, connexion refusée/réinitialisée) pour un exécuteur de rotation multicomptes, lorsque le compte en échec ne dispose d’aucun proxy dédié, applique une courte période de récupération et ignore les autres comptes sans proxy pendant le reste de la requête au lieu de réessayer chacun d’eux. Activé par défaut (sans risque : aucun changement d’adresse IP de sortie ; réduit seulement les risques de latence et de mise en récupération pour les comptes partageant la même sortie). Désactivez cette option pour rétablir la propagation immédiate dès la première exception d’un compte sans proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | booléen | `false` | | Les pools de proxys et la rotation par compte d’opencode cessent de reproposer un proxy qui vient d’échouer (sonde TCP refusée ou erreur 429 reçue via celui-ci) pendant une durée propre au processus, qui double à chaque récidive jusqu’à une limite maximale. Aucun état de proxy n’est enregistré ; lorsque tous les candidats sont mis de côté, le choix reste inchangé. Désactivé par défaut. | +| `PROXY_POOL_EGRESS_OBSERVATION` | booléen | `false` | | Affiche, sous un pool de proxys dans le tableau de bord, combien d’adresses IP de sortie observées ont servi ses membres au cours des dernières 24 h et combien de connexions les ont utilisées. En lecture seule, calculé à partir du journal des proxys et jamais utilisé pour le routage. Désactivé par défaut. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | booléen | `false` | | Pour l’exécuteur OpenCode, surveille le premier octet du corps d’une réponse Responses diffusée en continu (fenêtre : `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, valeur par défaut `15000`). Un flux Responses 2xx qui reste silencieux au-delà de cette fenêtre est considéré comme bloqué : le compte est mis en récupération et la requête est transférée une fois vers le compte suivant ; un second blocage provoque un échec immédiat. Désactivé par défaut : les flux bloqués conservent le délai d’attente actuel jusqu’à l’expiration du délai de disponibilité du flux. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Exécuteur OpenCode : lors d’une réponse 403/451 comportant un refus `user_blocked` (ni géographique, ni lié au rejet d’une empreinte Cloudflare), place le compte refusé en période de temporisation et passe au compte suivant au maximum une fois par requête ; un second refus est renvoyé tel quel, sans marquage de réussite. Désactivé par défaut : contourner le blocage d’un utilisateur en amont peut être perçu comme une tentative d’évasion et propager le signalement à l’ensemble du parc. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotation OpenCode : après deux défaillances transitoires consécutives en amont (5xx ou réponse 400 vide), attend avant de passer au compte suivant — 1,5 s, durée doublée à chaque défaillance supplémentaire, avec un maximum de 6 s par pause et de 10 s par requête ; cette attente est ignorée si le client se déconnecte. Le corps de la réponse en échec est libéré avant l’attente. Désactivé par défaut : le basculement reste immédiat. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotation OpenCode : arrête la vague de comptes à la première réponse 429 classée comme une véritable limitation de débit (`Retry-After` analysable, ou corps mentionnant une limite de débit ou d’utilisation) et renvoie cette réponse 429 en amont sans modification. Les réponses 429 non classées continuent d’entraîner une rotation. Désactivé par défaut : l’offre gratuite est limitée par adresse IP de sortie (#9611), de sorte que chaque réponse 429 entraîne une rotation et qu’une vague épuisée renvoie la dernière réponse 429 en amont. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Désactive la vérification des certificats TLS pour le proxy MITM. **Danger.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Autorise les URL de fournisseurs pointant vers des réseaux privés/internes. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Autorise l’ajout et la validation de fournisseurs sur des adresses locales/privées (127.0.0.1, localhost, LAN). Activé par défaut (priorité au local) ; désactivez cette option pour appliquer un blocage strict n’autorisant que les adresses publiques. Les métadonnées cloud restent bloquées. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Active le mode fournisseur compatible avec Claude Code. | ### Politiques (5) -| Clé | Type | Valeur par défaut | Description | -| ------------------------------- | ------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Mode d’application de la politique d’utilisation des outils. Valeurs : `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Active automatiquement la limitation du débit en fonction des schémas d’utilisation. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Ignore la vérification locale d’OmniRoute relative à la fenêtre de contexte et au nombre maximal de jetons d’entrée pour les requêtes directes adressées à un seul modèle. Les limites en amont restent applicables. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Rejette les requêtes avant leur envoi lorsque le modèle cible ne dispose pas des capacités requises (vision, outils, sortie structurée, fenêtre de contexte). Protège les requêtes directes adressées à un seul fournisseur qui contournent le filtre de compatibilité de la couche de combinaison. | -| `RADAR_ENABLED` | boolean | `false` | Active le module OmniRoute Radar (écrans du flux du catalogue et synchronisation). Désactivé par défaut ; son activation déverrouille uniquement l’interface utilisateur — la synchronisation des données nécessite toujours une activation distincte. | - -### Exécution (32) - -| Clé | Type | Valeur par défaut | Redémarrage | Description | -| ------------------------------------------- | ------- | ----------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | booléen | `true` | | Génère et injecte des résumés de conversation lorsque le routage combiné change de modèle. Désactivez cette option pour traiter les changements de modèle indépendamment et empêcher les requêtes de transfert en arrière-plan pour toutes les combinaisons existantes et futures. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | booléen | `true` | | Supprime les éléments de sortie internes de la phase de commentaire des flux de relais de l'API Responses avant de les transmettre aux clients. Désactivez cette option pour recevoir les commentaires bruts du service en amont. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | booléen | `true` | | Applique les restrictions de portée à l'accès aux outils MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | booléen | `false` | | Compresse les descriptions des outils MCP afin de réduire l'utilisation de jetons. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | booléen | `false` | | Active le traitement des tâches en arrière-plan lors de l'exécution. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | booléen | `false` | ✓ | Désactive tous les services en arrière-plan (actualisation des quotas, synchronisation, etc.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | booléen | `false` | | Accepte les filtres RTK au niveau du projet sans validation. | -| `OMNIROUTE_ENABLE_LIVE_WS` | booléen | `true` | ✓ | Démarre le serveur WebSocket du tableau de bord en temps réel lors de l'importation (port 20132 par défaut). | -| `OMNIROUTE_CODEX_WS_ENABLED` | booléen | `true` | | Autorise Codex à utiliser le transport Responses sur WebSocket. Lorsque cette option est désactivée, Codex revient aux Responses via HTTP. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | booléen | `true` | | Autorise Codex à utiliser le transport JSON-RPC WebSocket du serveur d'application local (codexTransport=app-server). Lorsque cette option est désactivée, les connexions configurées pour utiliser app-server reviennent aux autres transports de Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | booléen | `true` | | Achemine les requêtes dont le budget est épuisé vers le fournisseur/modèle de secours gratuit d'urgence. (Voir [Solution de secours en cas d'épuisement du budget](#emergency-budget-fallback) ci-dessous.) | -| `STREAM_RECOVERY_ENABLED` | booléen | `false` | | Active une nouvelle tentative anticipée et transparente pour les flux SSE en amont tronqués, avant que le moindre octet de réponse n'atteigne le client. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | booléen | `false` | | Autorise la récupération de flux à relancer une requête et à raccorder une réponse après que des octets ont déjà atteint le client. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | booléen | `false` | | Sécurise la continuation en cours de flux pour les appels d'outils : ne reprend jamais un flux interrompu après l'émission d'un appel d'outil (en cours ou déjà terminé avec finish_reason tool_calls), et ferme après une continuation vide au lieu de consommer la totalité du budget. Désactivé : comportement de la version publiée. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | booléen | `false` | | Bascule une fois vers une connexion sœur lorsqu'un flux SSE se ferme avant d'avoir émis la moindre trame utile et que la tentative limitée sur la même connexion a été épuisée ; en l'absence de connexion sœur utilisable, l'erreur 502 `STREAM_EARLY_EOF` d'origine est renvoyée. Désactivé par défaut : une fin de fichier anticipée reste définitive après la nouvelle tentative sur la même connexion. | -| `MODEL_CATALOG_INCLUDE_NAMES` | booléen | `true` | | Inclut des champs de nom conviviaux dans les réponses de `/v1/models`. Désactivez cette option pour les clients qui attendent uniquement des identifiants de modèle. | -| `MODELS_CATALOG_PREFIX_MODE` | énum. | `dual` | | Contrôle la manière dont les identifiants de modèle sont préfixés dans /v1/models. 'dual' (par défaut) émet à la fois les préfixes d'alias et d'identifiant canonique du fournisseur pour assurer la rétrocompatibilité. 'alias' émet uniquement le préfixe d'alias court (p. ex. ds-web/model, et non deepseek-web/model). 'canonical' émet uniquement le préfixe complet de l'identifiant du fournisseur. Valeurs : `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | booléen | `true` | | Active la synchronisation périodique du classement ELO du palmarès Arena AI pour les classements d'intelligence des modèles. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | booléen | `false` | | Publie les identifiants miroirs `claude//` sur `/v1/models` afin que la découverte des modèles de la passerelle Claude Code répertorie les modèles non-Claude. Niveau global du mécanisme à trois niveaux (la variable d'environnement prévaut sur le remplacement du tableau de bord). Voir [Configuration de Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | booléen | `true` | | Interrupteur principal des alias de passerelle no-think//. Activé (par défaut) : /v1/models publie une variante sans réflexion pour chaque modèle Claude admissible capable de raisonnement, et un identifiant no-think/ envoyé dans une requête est résolu vers le modèle réel avec le raisonnement désactivé. Désactivé : aucune variante n'est publiée et un identifiant no-think/ est traité comme tout autre identifiant de modèle inconnu. Le choix d'activation/de désactivation par modèle ModelSpec.noThinkingAlias reste applicable lorsque cette option est activée. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | booléen | `false` | | Désactive la génération des variantes de niveau de réflexion (p. ex. -low, -medium, -high) dans le catalogue /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | booléen | `false` | ✓ | Active des voies d'admission virtuelles adaptatives par locataire pour la répartition vers les fournisseurs (#9654) : le pic d'activité d'un locataire ne provoque plus d'erreurs 503 pour un autre. La variable d'environnement OMNIROUTE_CHAT_VIRTUAL_LANES prévaut sur ce remplacement du tableau de bord ; les modifications prennent effet au redémarrage du serveur. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | booléen | `false` | | Publie les identifiants miroirs / sur /v1/models pour les modèles dont le propriétaire canonique ne dispose d'aucun identifiant actif, mais pour lesquels une passerelle de relais dotée d'un identifiant actif assure le routage. Avertissement : ajoute des entrées au catalogue pour tous les clients lorsque cette option est activée globalement. | -| `NEWAPI_AGGREGATOR_BALANCE` | booléen | `false` | | Active la détection du solde pour les nœuds d'agrégation compatibles avec New-API / One-API / Sub2API. Lorsque cette option est activée, les nœuds compatibles dont l'indicateur d'agrégation est défini signalent leur solde dans le tableau de bord et lors du routage de vérification préalable des quotas. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | booléen | `false` | | Poursuit les appels d'outils non diffusés en continu et gérés par le serveur jusqu'à ce que le modèle renvoie une réponse utilisable par le client. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | booléen | `false` | | Les statistiques de recherche et les recherches récentes ne comptabilisent que les fournisseurs qui disposent encore d'une connexion active (les fournisseurs sans clé tels que duckduckgo-free sont toujours comptabilisés). Lorsque cette option est désactivée, chaque ligne de recherche conservée avec un identifiant de fournisseur est maintenue. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | booléen | `false` | | Pages des fournisseurs du tableau de bord : affiche le badge Gratuit uniquement selon les signaux pris en charge par le fournisseur — ignore l'heuristique du nom d'affichage, les champs de gratuité non booléens et les suffixes :free pour les fournisseurs enregistrés sans offre gratuite documentée. Lorsque cette option est désactivée, la règle historique du badge est conservée. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | booléen | `false` | | Pour les réponses agrégées d'indisponibilité 429/503, omet `Retry-After` lorsqu'aucune date future concrète de nouvelle tentative n'est connue (au lieu d'une valeur synthétique de 1 s), ajoute `error.retry_after_provenance` (`signal` \| `none`) et permet aux chemins d'épuisement des combinaisons de lire les indications textuelles de nouvelle tentative dans les corps JSON et en texte brut provenant de l'amont. Le champ apparaît uniquement dans les réponses construites par `unavailableResponse()` ; les autres corps 429/503 restent inchangés. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | booléen | `false` | | Lorsqu'une cible de combinaison `priority`, marquée comme solution de secours uniquement en cas d'épuisement du quota, arrête la combinaison pour une cause dont il est démontré qu'elle n'est pas liée au quota (disjoncteur du fournisseur ouvert, exclusion prédictive en raison de la latence), répond avec 502 au lieu du 503 évoquant un problème de quota. Les arrêts dus au verrouillage, au délai de récupération, à l'indisponibilité, à l'épuisement et à la limite de concurrence conservent le code 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | booléen | `false` | | Une réponse 401 nue de Mistral (`{"detail":"Unauthorized"}`, sans signal d'authentification explicite) est identique pour une clé révoquée et pour un quota épuisé. Lorsque cette option est activée, la connexion est mise en période de récupération au lieu d'être mise à l'écart comme `expired`, au maximum 3 fois par heure et par connexion ; la suivante la met à l'écart, de sorte qu'une clé révoquée finit tout de même par converger. Désactivé par défaut : chaque réponse 401 nue de Mistral met la connexion à l'écart comme auparavant. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | booléen | `false` | | Récupère le catalogue de modèles xAI en direct pour les connexions `xai-oauth` depuis `https://api.x.ai/v1/models` en utilisant le jeton porteur OAuth, au lieu de l'ensemble statique figé. Désactivé par défaut : `xai-oauth` continue de fournir l'ensemble statique sans modification. En cas d'erreur de résolution, la découverte revient à cet ensemble (il n'est pas vérifié si x.ai accepte un jeton porteur OAuth sur ce point de terminaison). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | booléen | `false` | | Autorise le nettoyage automatique à supprimer les tâches terminales de l'API Batch (completed/failed/cancelled/expired) antérieures à `OMNIROUTE_BATCH_RETENTION_DAYS`, ainsi que leurs points de contrôle par ligne, et à effacer le contenu BLOB des fichiers téléversés ayant dépassé leur propre `expires_at`. Désactivé par défaut : chaque installation existante conserve ces données exactement comme auparavant jusqu'à ce qu'un opérateur choisisse d'activer cette option. La route `DELETE /api/v1/batches/delete-completed`, déclenchée par l'opérateur, n'est affectée dans aucun des deux cas — il s'agit d'un contrat d'API publique distinct et inconditionnel. | +| Clé | Type | Valeur par défaut | Description | +| ------------------------------- | ------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Mode d’application de la politique d’utilisation des outils. Valeurs : `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Active automatiquement la limitation de débit en fonction des habitudes d’utilisation. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Ignore la vérification locale par OmniRoute de la fenêtre de contexte et du nombre maximal de jetons d’entrée pour les requêtes directes visant un seul modèle. Les limites en amont restent applicables. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Rejette les requêtes avant leur transmission lorsque le modèle cible ne dispose pas des capacités requises (vision, outils, sortie structurée, fenêtre de contexte). Protège les requêtes directes adressées à un seul fournisseur qui contournent le filtre de compatibilité de la couche de combinaison. | +| `RADAR_ENABLED` | boolean | `false` | Active le module OmniRoute Radar (écrans du flux de catalogue et synchronisation). Désactivé par défaut ; l’activation ne fait que déverrouiller l’interface utilisateur — la synchronisation des données reste une option distincte à activer explicitement. | + +### Exécution (33) + +| Clé | Type | Valeur par défaut | Redémarrage | Description | +| ------------------------------------------- | ------- | ----------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | booléen | `true` | | Génère et injecte des résumés de conversation lorsque le routage combiné change de modèle. Désactivez cette option pour traiter les changements de modèle indépendamment et empêcher les requêtes de transfert en arrière-plan pour toutes les combinaisons existantes et futures. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | booléen | `true` | | Supprime les éléments de sortie internes de la phase de commentaire des flux de transfert direct de l’API Responses avant de les transmettre aux clients. Désactivez cette option pour recevoir les commentaires bruts du service en amont. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | booléen | `true` | | Applique les restrictions de portée à l’accès aux outils MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | booléen | `false` | | Compresse les descriptions des outils MCP afin de réduire l’utilisation de jetons. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | booléen | `false` | | Active le traitement des tâches en arrière-plan lors de l’exécution. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | booléen | `false` | ✓ | Désactive tous les services en arrière-plan (actualisation des quotas, synchronisation, etc.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Faire confiance aux filtres RTK au niveau du projet sans validation. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Démarrer le serveur WebSocket du tableau de bord en temps réel lors de l’importation (port 20132 par défaut). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Autoriser Codex à utiliser le transport Responses-over-WebSocket. Lorsque cette option est désactivée, Codex revient aux Responses HTTP. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Autoriser Codex à utiliser le transport JSON-RPC WebSocket du serveur d’application local (codexTransport=app-server). Lorsque cette option est désactivée, les connexions configurées pour utiliser le serveur d’application reviennent aux autres transports de Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Acheminer les requêtes dont le budget est épuisé vers le fournisseur/modèle de secours gratuit d’urgence. (Voir [Solution de secours en cas d’épuisement du budget](#emergency-budget-fallback) ci-dessous.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Activer une nouvelle tentative anticipée transparente pour les flux SSE en amont tronqués, avant que le moindre octet de réponse n’atteigne le client. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Autoriser la récupération du flux à renvoyer une requête et à raccorder une réponse après que des octets ont déjà atteint le client. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Sécuriser la continuation en milieu de flux pour les appels d’outils : ne jamais reprendre un flux interrompu après l’émission d’un appel d’outil (en cours ou déjà terminé avec finish_reason tool_calls), et fermer après une continuation vide au lieu d’épuiser la totalité du budget. Désactivé : comportement de la version publiée. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Basculer une fois vers une connexion sœur lorsqu’un flux SSE se ferme avant d’avoir émis une trame utile et que la nouvelle tentative limitée sur la même connexion a été épuisée ; si aucune connexion sœur utilisable n’est disponible, l’erreur 502 `STREAM_EARLY_EOF` d’origine est renvoyée. Désactivé par défaut : une fin de fichier anticipée reste définitive après la nouvelle tentative sur la même connexion. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Inclure des champs de nom adaptés à l’affichage dans les réponses de `/v1/models`. Désactivez cette option pour les clients qui attendent uniquement des identifiants de modèle. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Contrôle la manière dont les identifiants de modèle sont préfixés dans /v1/models. 'dual' (valeur par défaut) émet à la fois les préfixes d’alias et d’identifiant canonique du fournisseur afin d’assurer la rétrocompatibilité. 'alias' émet uniquement le préfixe d’alias court (par ex. ds-web/model, et non deepseek-web/model). 'canonical' émet uniquement le préfixe complet de l’identifiant du fournisseur. Valeurs : `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Activer la synchronisation périodique de l’ELO du classement Arena AI pour les classements d’intelligence des modèles. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Publier les identifiants miroirs `claude//` dans `/v1/models` afin que la découverte des modèles de la passerelle Claude Code répertorie les modèles autres que Claude. Niveau global du mécanisme de contrôle à trois niveaux (la variable d’environnement prévaut sur le remplacement configuré dans le tableau de bord). Consultez la [configuration de Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Commutateur principal pour les alias de passerelle no-think//. Activé (par défaut) : /v1/models publie une variante sans réflexion pour chaque modèle Claude admissible prenant en charge la réflexion, et un identifiant no-think/ envoyé dans une requête est résolu vers le modèle réel avec le raisonnement désactivé. Désactivé : aucune variante n’est publiée et un identifiant no-think/ est traité comme n’importe quel autre identifiant de modèle inconnu. L’activation ou la désactivation par modèle via ModelSpec.noThinkingAlias continue de s’appliquer tant que cette option est activée. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Désactiver la génération des variantes de niveau de réflexion (par ex. -low, -medium, -high) dans le catalogue /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Activer des voies d’admission virtuelles adaptatives par locataire pour l’envoi aux fournisseurs (#9654) : une hausse soudaine de trafic d’un locataire ne provoque plus d’erreur 503 pour un autre. La variable d’environnement OMNIROUTE_CHAT_VIRTUAL_LANES prévaut sur ce remplacement configuré dans le tableau de bord ; les modifications prennent effet au redémarrage du serveur. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | booléen | `false` | | Publier les identifiants miroirs / sur /v1/models pour les modèles dont le propriétaire canonique ne dispose d'aucun identifiant actif, mais qui sont acheminés par une passerelle transparente disposant d'un identifiant actif. Avertissement : ajoute des entrées au catalogue pour tous les clients lorsque cette option est activée globalement. | +| `NEWAPI_AGGREGATOR_BALANCE` | booléen | `false` | | Activer la détection du solde pour les nœuds compatibles avec les agrégateurs New-API / One-API / Sub2API. Lorsque cette option est activée, les nœuds compatibles pour lesquels l'indicateur d'agrégateur est défini affichent leur solde dans le tableau de bord et lors du routage avec vérification préalable du quota. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | booléen | `false` | | Poursuivre les appels d'outils non diffusés en continu et gérés par le serveur jusqu'à ce que le modèle renvoie une réponse utilisable par le client. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | booléen | `false` | | Les statistiques et les recherches récentes ne comptabilisent que les fournisseurs qui disposent encore d'une connexion active (les fournisseurs sans clé, tels que duckduckgo-free, sont toujours comptabilisés). Lorsque cette option est désactivée, chaque ligne de recherche conservée ayant un identifiant de fournisseur est incluse. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | booléen | `false` | | Pages des fournisseurs du tableau de bord : afficher le badge Gratuit uniquement en présence de signaux pris en charge par le fournisseur — ignore l'heuristique basée sur le nom d'affichage, les champs de gratuité non booléens et les suffixes :free pour les fournisseurs enregistrés sans offre gratuite documentée. Lorsque cette option est désactivée, la règle historique du badge est conservée. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | booléen | `false` | | Pour les réponses agrégées 429/503 signalant une indisponibilité, omettre `Retry-After` lorsqu'aucune date de nouvelle tentative future précise n'est connue (au lieu d'une valeur synthétique de 1 s), ajouter `error.retry_after_provenance` (`signal` \| `none`) et permettre aux chemins de vidage des combinaisons de lire les indications textuelles de nouvelle tentative dans les corps JSON et en texte brut des réponses en amont. Le champ n'apparaît que dans les réponses générées par `unavailableResponse()` ; les autres corps 429/503 restent inchangés. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | booléen | `false` | | Lorsqu'une cible de combinaison `priority`, marquée comme solution de secours uniquement en cas d'épuisement du quota, interrompt la combinaison pour une cause qui n'est manifestement pas liée au quota (disjoncteur du fournisseur ouvert, omission prédictive pour cause de latence), répondre avec le code 502 au lieu du code 503 suggérant un problème de quota. Les interruptions dues à un verrouillage, à une période de récupération, à une indisponibilité, à un épuisement ou à une limite de concurrence continuent de renvoyer le code 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | booléen | `false` | | Une réponse 401 nue de Mistral (`{"detail":"Unauthorized"}`, sans signal d'authentification explicite) est identique pour une clé révoquée et pour un quota épuisé. Lorsque cette option est activée, la connexion est placée en période de récupération au lieu d'être mise de côté comme `expired`, au maximum 3 fois par heure et par connexion ; la tentative suivante la met de côté, de sorte qu'une clé révoquée finit tout de même par converger vers cet état. Option désactivée par défaut : chaque réponse 401 nue de Mistral met la connexion de côté, comme auparavant. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Récupère le catalogue de modèles xAI en temps réel pour les connexions `xai-oauth` depuis `https://api.x.ai/v1/models` à l’aide du jeton porteur OAuth, au lieu de la graine statique figée. Désactivé par défaut : `xai-oauth` continue de fournir la graine statique sans modification. En cas d’erreur de résolution, la découverte revient à la graine (il n’est pas vérifié si x.ai accepte un jeton porteur OAuth sur ce point de terminaison). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Autorise le nettoyage automatique à supprimer les tâches terminales (terminées/échouées/annulées/expirées) de l’API Batch datant de plus de `OMNIROUTE_BATCH_RETENTION_DAYS`, ainsi que leurs points de contrôle par ligne, et à effacer le contenu BLOB des fichiers téléversés ayant dépassé leur propre `expires_at`. Désactivé par défaut : chaque installation existante conserve ces données exactement comme auparavant jusqu’à ce qu’un opérateur active cette option. La route `DELETE /api/v1/batches/delete-completed`, déclenchée par l’opérateur, n’est affectée dans aucun des deux cas — il s’agit d’un contrat d’API publique distinct et inconditionnel. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Réserve le compte Antigravity sélectionné pendant tout le cycle de vie du streaming de la requête qui l’a choisi, afin qu’une nouvelle tentative concurrente ou le transfert des identifiants ne puisse pas sélectionner de nouveau un compte déjà affecté à un flux en cours. La réservation est limitée au couple (connexion, modèle en amont appelable), de sorte qu’un même compte peut toujours servir simultanément deux modèles différents. Lorsque tous les comptes admissibles sont déjà réservés pour ce modèle, la requête renvoie une erreur 503 structurée `antigravity_pool_busy` avec un en-tête `Retry-After` borné, au lieu de surcharger un compte occupé. Désactivé par défaut : la sélection des comptes reste exactement comme auparavant et aucune réservation n’est effectuée. | ### CLI (5) -| Clé | Type | Valeur par défaut | Redémarrage | Description | -| ------------------------------------- | ------- | ----------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Active le mode de compatibilité pour tous les clients CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Active la couche de compatibilité des alias de modèles. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Active la synchronisation automatique des données tarifaires (nécessite également la variable d’environnement `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Après la synchronisation des modèles d’un fournisseur, (ré)écrit automatiquement les fichiers de profil ~/.codex/*.config.toml à partir du catalogue actif. Ne modifie jamais la configuration Codex active/par défaut. Désactivé par défaut. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Après la synchronisation des modèles d’un fournisseur, (ré)écrit automatiquement les profils Claude Code ~/.claude/profiles//settings.json à partir du catalogue actif. Ne modifie jamais la configuration Claude active/par défaut. Désactivé par défaut. | +| Clé | Type | Par défaut | Redémarrage | Description | +| ------------------------------------- | ------- | ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Active le mode de compatibilité pour tous les clients CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Active la couche de compatibilité des alias de modèles. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Active la synchronisation automatique des données tarifaires (nécessite également la variable d’environnement `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Après la synchronisation des modèles d’un fournisseur, (ré)écrit automatiquement les fichiers de profil ~/.codex/*.config.toml à partir du catalogue en temps réel. Ne modifie jamais la configuration Codex active/par défaut. Désactivé par défaut. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Après la synchronisation des modèles d’un fournisseur, (ré)écrit automatiquement les profils Claude Code ~/.claude/profiles//settings.json à partir du catalogue en temps réel. Ne modifie jamais la configuration Claude active/par défaut. Désactivé par défaut. | -### État de santé (5) +### Santé (5) -| Clé | Type | Valeur par défaut | Description | -| ----------------------------------------- | ------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Désactive le point de terminaison de vérification de l’état de santé de l’instance locale. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Désactive la vérification de l’état de santé liée à la validation des jetons. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Active l’accès au réseau dans l’environnement sandbox des skills. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Lors du balayage de l’état de santé des proxys, une sonde refusée par la cible (401/403/429) réinitialise la série d’échecs consécutifs du proxy. Désactivé par défaut : un refus reste neutre (#10654). Une erreur 5xx reste non concluante dans tous les cas ; un refus ne supprime, ne désactive ni ne réactive jamais un proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Exécute la vérification de l’intégrité et de l’état de santé de la base de données au démarrage après que le serveur a commencé à accepter les requêtes (via `setImmediate`), au lieu de bloquer le démarrage jusqu’à sa fin (#13717). Désactivé par défaut : le démarrage reste bloquant exactement comme avant cette PR. | +| Clé | Type | Valeur par défaut | Description | +| ----------------------------------------- | ------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | booléen | `false` | Désactive le point de terminaison de vérification de l’état de l’instance locale. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | booléen | `false` | Désactive la vérification de l’état de validation des jetons. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | booléen | `false` | Active l’accès au réseau dans l’environnement sandbox des compétences. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | booléen | `false` | Lors du balayage de l’état des proxys, une sonde refusée par la cible (401/403/429) réinitialise la série d’échecs consécutifs du proxy. Désactivé par défaut : un refus reste neutre (#10654). Une erreur 5xx reste non concluante dans les deux cas ; un refus ne supprime, ne désactive ni ne réactive jamais un proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | booléen | `false` | Exécute la vérification de l’intégrité et de l’état de la base de données au démarrage après que le serveur a commencé à accepter les requêtes (via `setImmediate`), au lieu de bloquer le démarrage jusqu’à son achèvement (#13717). Désactivé par défaut : le démarrage reste bloqué exactement comme avant cette PR. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` et son alias historique +> `INPUT_SANITIZER_BLOCK_THRESHOLD` et son ancien alias > `INJECTION_GUARD_BLOCK_THRESHOLD` ajustent le mode `block` de > `INJECTION_GUARD_MODE`, mais ce sont de simples variables d’environnement lues par > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> et non des indicateurs de fonctionnalité : elles ne disposent d’aucune substitution en base de données ni d’aucun bouton dans le tableau de bord. Consultez +> et non des indicateurs de fonctionnalité : elles ne disposent d’aucune substitution dans la base de données ni d’aucun bouton dans le tableau de bord. Voir > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> La colonne `Redémarrage` signale les indicateurs avec `requiresRestart: true` — la valeur est -> enregistrée instantanément, mais ne prend effet qu’après le rechargement du processus. Les indicateurs de type énumération -> rejettent toute valeur ne faisant pas partie de leur ensemble autorisé (validation côté serveur dans +> La colonne `Restart` indique les indicateurs avec `requiresRestart: true` — la valeur est +> enregistrée instantanément, mais ne prend effet qu’après le redémarrage du processus. Les indicateurs +> d’énumération rejettent toute valeur en dehors de leur ensemble autorisé (validation côté serveur dans > `setFeatureFlagOverride()` et dans le gestionnaire REST `PUT`). --- -## Activation/désactivation des indicateurs +## Activation et désactivation des indicateurs ### Tableau de bord -Accédez à **Tableau de bord → Paramètres → Indicateurs de fonctionnalité** +Accédez à **Tableau de bord → Paramètres → Indicateurs de fonctionnalités** (`/dashboard/settings/feature-flags`). La grille (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) permet : -- Une **recherche** par clé ou description, et un **filtrage** par catégorie (avec en plus une vue synthétique +- Une **recherche** par clé ou description, ainsi qu’un **filtrage** par catégorie (avec une vue synthétique **Redémarrage requis**). -- Un **bouton d’activation/désactivation** pour les indicateurs booléens et une **liste déroulante** pour les indicateurs d’énumération +- Un **bouton d’activation** pour les indicateurs booléens et une **liste déroulante** pour les indicateurs de type enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- Un **badge de source** par indicateur — `DB`, `ENV` ou `DEF` — indiquant d’où provient la +- Un **badge de source** pour chaque indicateur — `DB`, `ENV` ou `DEF` — indiquant d’où provient la valeur effective. -- Un bouton **Réinitialiser** (affiché uniquement pour les indicateurs provenant de `DB`) afin de supprimer la valeur de remplacement, +- Un bouton **Réinitialiser** (affiché uniquement pour les indicateurs provenant de `DB`) permettant de supprimer la valeur de remplacement, ainsi qu’un bouton **Réinitialiser toutes les valeurs de remplacement** en bas. - Une bannière **Redémarrer le serveur** lorsqu’un indicateur `requiresRestart` est modifié. @@ -210,7 +212,7 @@ Renvoie chaque indicateur avec sa valeur effective, sa source et un récapitulat "requiresRestart": false, "warningLevel": "caution", }, - // ... les 72 indicateurs + // ... les 74 indicateurs ], "summary": { "total": 56, @@ -224,11 +226,11 @@ Renvoie chaque indicateur avec sa valeur effective, sa source et un récapitulat #### `PUT /api/settings/feature-flags` -Définit ou supprime une valeur de remplacement individuelle. Corps : `{ key: string; value?: string }`. -L’omission de `value` supprime la valeur de remplacement (rétablissant la variable d’environnement ou la valeur par défaut). +Définit ou supprime une valeur de remplacement unique. Corps : `{ key: string; value?: string }`. +L’omission de `value` supprime la valeur de remplacement (rétablissant la valeur d’environnement ou par défaut). ```bash -# Définir une valeur de remplacement dans la DB +# Définir une valeur de remplacement en base de données curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' @@ -239,18 +241,18 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -d '{"key":"REQUIRE_API_KEY"}' ``` -La réponse renvoie les nouvelles valeurs `effectiveValue`/`source`, les valeurs précédentes `previousValue`/ -`previousSource`, ainsi que `requiresRestart`. Les clés inconnues et les valeurs d’énumération -hors plage sont rejetées avec le code `400`. +La réponse renvoie les nouvelles valeurs `effectiveValue`/`source`, les valeurs `previousValue`/ +`previousSource`, ainsi que `requiresRestart`. Les clés inconnues et les valeurs d’enum hors limites +sont rejetées avec le code `400`. #### `DELETE /api/settings/feature-flags` -Supprime **toutes** les valeurs de remplacement de la DB en une seule fois, rétablissant pour chaque indicateur sa variable d’environnement ou sa valeur +Supprime **toutes** les valeurs de remplacement de la base de données en une seule fois, rétablissant pour chaque indicateur sa valeur d’environnement ou par défaut. Renvoie `{ cleared: , message: "..." }`. > [!NOTE] -> Les indicateurs avec `requiresRestart: true` ne prennent effet qu’après le rechargement du processus. -> Le processus de redémarrage du tableau de bord appelle `POST /api/restart`, puis interroge régulièrement +> Les indicateurs ayant `requiresRestart: true` ne prennent effet qu’après le redémarrage du processus. +> Le flux de redémarrage du tableau de bord appelle `POST /api/restart`, puis interroge > `GET /api/health/ping` jusqu’à ce que le serveur soit de nouveau opérationnel. --- diff --git a/docs/i18n/fr/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/fr/docs/reference/PROVIDER_REFERENCE.md index 2983e0d65274..7c13bab35ceb 100644 --- a/docs/i18n/fr/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/fr/docs/reference/PROVIDER_REFERENCE.md @@ -6,9 +6,9 @@ > **Généré automatiquement** à partir de `src/shared/constants/providers.ts` — ne pas modifier manuellement. > Régénérer avec : `npm run gen:provider-reference` -> **Dernière génération :** 2026-09-17 +> **Dernière génération :** 2026-09-18 -Nombre total de fournisseurs : **359**. Voir la répartition par catégorie ci-dessous. +Nombre total de fournisseurs : **359**. Consultez la répartition par catégorie ci-dessous. ## Catégories @@ -34,47 +34,47 @@ Utilisez le tableau de bord à l’adresse `/dashboard/providers` pour activer, ## Fournisseurs sans authentification (aucune clé requise) (10) -| ID | Alias | Nom | Étiquettes | Site web | Remarques | Appel d’outils | -| ----------------------- | ---------- | ------------------------- | ---------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -| `aihorde` | `horde` | AI Horde | Sans authentification | [lien](https://aihorde.net) | Aucune clé API requise — utilise la clé anonyme documentée d’AI Horde. L’ajout d’une clé aihorde.net gratuite est facultatif et permet uniquement d’obtenir une priorité plus élevée dans la file d’attente (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Sans authentification | [lien](https://augmentcode.com) | Aucune clé API n’est stockée par OmniRoute. Installez Auggie CLI et exécutez `auggie login` sur cette machine, puis OmniRoute le lance localement pour chaque requête. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Sans authentification | [lien](https://playground.ai.cloudflare.com) | Aucun identifiant requis — sessions de navigateur anonymes via un protocole WebSocket cf_agent rétroconçu (transport Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Sans authentification | [lien](https://developers.openai.com/codex/cli) | Aucun jeton n’est stocké par OmniRoute. L’app-server de Codex CLI gère sa propre connexion à ChatGPT (~/.codex/auth.json, actualisée automatiquement). Utilisez « Se connecter avec ChatGPT » si la CLI n’est pas encore authentifiée. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Sans authentification | [lien](https://docs.devin.ai/work-with-devin/devin-cli) | L’authentification est gérée par la CLI Devin officielle dans son volume de pont isolé. | émulé | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Sans authentification | [lien](https://duckduckgo.com/duckchat) | Aucun identifiant requis — DuckDuckGo AI Chat est anonyme et gratuit. | émulé | -| `opencode` | `oc` | OpenCode Free | Sans authentification | [lien](https://opencode.ai) | Aucune clé API requise — utilise le point de terminaison public gratuit d’OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Sans authentification | [lien](https://uncloseai.com) | Aucune authentification requise. L’API accepte comme clé toute chaîne non vide à des fins d’identification. Si les anciens modèles intégrés renvoient une erreur 404, utilisez Modèles disponibles → Importer depuis /models ou Synchronisation automatique ; modèle actif vérifié : solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Sans authentification, vidéo | [lien](https://veoaifree.com) | Aucune authentification requise. Limite fixée à 6 requêtes/heure par adresse IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Sans authentification | [lien](https://zcode.z.ai) | Aucune clé API n’est stockée par OmniRoute. L’app-server ZCode local utilise la connexion builtin:zai-coding-plan existante. | — | +| ID | Alias | Nom | Étiquettes | Site web | Remarques | Appel d’outils | +| ----------------------- | ---------- | ------------------------- | ---------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | +| `aihorde` | `horde` | AI Horde | Sans authentification | [lien](https://aihorde.net) | Aucune clé API requise — utilise la clé anonyme documentée d’AI Horde. L’ajout d’une clé aihorde.net gratuite est facultatif et permet uniquement d’obtenir une priorité plus élevée dans la file d’attente (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Sans authentification | [lien](https://augmentcode.com) | Aucune clé API stockée par OmniRoute. Installez Auggie CLI et exécutez `auggie login` sur cette machine, puis OmniRoute le lance localement pour chaque requête. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Sans authentification | [lien](https://playground.ai.cloudflare.com) | Aucun identifiant requis — sessions anonymes dans le navigateur via un protocole WebSocket cf_agent rétroconçu (transport Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Sans authentification | [lien](https://developers.openai.com/codex/cli) | Aucun jeton stocké par OmniRoute. Le serveur d’application de Codex CLI gère sa propre connexion à ChatGPT (~/.codex/auth.json, actualisée automatiquement). Utilisez « Se connecter avec ChatGPT » si la CLI n’est pas encore authentifiée. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Sans authentification | [lien](https://docs.devin.ai/work-with-devin/devin-cli) | L’authentification est gérée par la CLI Devin officielle dans son volume de pont isolé. | émulé | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Sans authentification | [lien](https://duckduckgo.com/duckchat) | Aucun identifiant requis — DuckDuckGo AI Chat est anonyme et gratuit. | émulé | +| `opencode` | `oc` | OpenCode Free | Sans authentification | [lien](https://opencode.ai) | Aucune clé API requise — utilise le point de terminaison public gratuit d’OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Sans authentification | [lien](https://uncloseai.com) | Aucune authentification requise. L’API accepte comme clé toute chaîne non vide à des fins d’identification. Si les anciens modèles intégrés renvoient une erreur 404, utilisez Modèles disponibles → Importer depuis /models ou Synchronisation automatique ; modèle actif vérifié : Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Sans authentification, vidéo | [lien](https://veoaifree.com) | Aucune authentification requise. Limité à 6 requêtes/heure par adresse IP. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Sans authentification | [lien](https://zcode.z.ai) | Aucune clé API stockée par OmniRoute. Le serveur d’application ZCode local utilise la connexion builtin:zai-coding-plan existante. | — | ## Fournisseurs OAuth (24) -| ID | Alias | Nom | Étiquettes | Site web | Remarques | -| --------------- | ------------- | ------------------------- | ---------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [lien](https://antigravity.google) | Importez votre connexion Antigravity CLI (`agy`) en collant ou en téléversant son fichier de jeton, détectez automatiquement une connexion CLI locale ou connectez-vous avec Google. Partage le backend Antigravity (y compris les modèles Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [lien](https://aws.amazon.com/q/developer/) | Utilise le même AWS Builder ID ou le même flux de jeton d’actualisation importé que Kiro, tout en conservant les connexions Amazon Q séparées. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [lien](https://cline.bot/cline-pass) | ClinePass est l’abonnement à 9,99 $/mois de Cline qui regroupe 10 modèles de programmation ouverts. Connectez-vous avec votre compte Cline (les mêmes identifiants que pour le CLI/IDE Cline), ou collez directement une clé API ClinePass (app.cline.bot → Settings → API Keys). Un abonnement ClinePass donne accès aux modèles cline-pass/*. Réutilise le flux OAuth Cline WorkOS. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [lien](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Connectez-vous via le flux officiel de code d’appareil du CLI, ou collez directement une clé API (envoyée sous la forme Authorization: Bearer). Catalogue : GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [lien](https://cli.devin.ai) | Nécessite le binaire Devin CLI. Exécutez `devin auth login` pour vous authentifier, ou fournissez votre WINDSURF_API_KEY. Installation : https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [lien](https://devin.ai) | Collez une clé API Devin existante provenant d’une session Devin authentifiée. La disponibilité et les étapes d’exportation de la clé varient selon la version de Devin et le compte. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Saisissez l’URL de votre instance GHE (par exemple, https://ghe.company.com) dans les paramètres du fournisseur, puis authentifiez-vous via le flux d’appareil. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [lien](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth n’est pas configuré. Enregistrez une application OAuth à l’adresse https://gitlab.com/-/profile/applications avec l’URI de redirection http://localhost:20128/callback et les portées "ai_features read_user", puis définissez GITLAB_DUO_OAUTH_CLIENT_ID (et éventuellement GITLAB_DUO_OAUTH_CLIENT_SECRET) et redémarrez. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Connectez-vous avec votre navigateur, ou collez votre fichier ~/.grok/auth.json (ou le jeton d’accès JWT) provenant du CLI Grok Build ; refresh_token est automatiquement renouvelé dans les deux cas. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [lien](https://www.kimi.com/code?aff=omniroute) | Connectez-vous avec le même compte Kimi que celui utilisé par Kimi Code CLI. OmniRoute utilise le flux OAuth du CLI et les points de terminaison Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Offre gratuite : 50 crédits/mois (environ 25 000 à 100 000 jetons). ⚠️ Les conditions d’utilisation de Kiro interdisent l’utilisation de proxys ou de harnais tiers. | -| `openference` | `of` | Openference | OAuth | [lien](https://openference.com) | Connectez-vous avec votre compte Openference pour acheminer les requêtes via api.openference.com. Un forfait actif est requis pour l’inférence : OAuth peut authentifier la requête, mais renvoyer une erreur 402 en l’absence de forfait. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [lien](https://trae.ai) | Trae est un IDE natif pour l’IA de ByteDance (agent distant SOLO). Autorisez l’accès via trae.ai dans la fenêtre contextuelle, ou connectez-vous sur solo.trae.ai et collez le Cloud-IDE-JWT (envoyé sous la forme 'Authorization: Cloud-IDE-JWT ', avec une durée de vie d’environ 14 jours) comme jeton d’accès ; web_id/biz_user_id/user_unique_id/scope/tenant/region sont propagés via providerSpecificData. Aucune actualisation sans interface graphique pour les jetons collés : recollez-les à leur expiration. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [lien](https://x.ai) | Connectez-vous avec xAI pour utiliser des modèles api.x.ai tels que Grok 4.5. Ce mécanisme est distinct des sessions JWT Grok Build, qui utilisent cli-chat-proxy.grok.com et les alias de modèles grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [lien](https://zed.dev) | Zed stocke les identifiants des fournisseurs LLM (OpenAI, Anthropic, Google, Mistral, xAI) dans le trousseau du système d’exploitation. Utilisez le bouton Import ci-dessous pour les détecter et les importer automatiquement. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [lien](https://zed.dev) | Connectez-vous avec votre compte Zed (connexion via l’application native). OmniRoute génère une paire de clés RSA à usage unique et ouvre zed.dev pour l’autoriser ; sur une installation distante ou sans interface graphique, copiez l’URL de rappel 127.0.0.1 obtenue depuis la barre d’adresse de votre navigateur et collez-la ici. Cette entrée est distincte de l’entrée d’importation d’identifiants « Zed IDE » ci-dessus : elle relaie les complétions de chat via l’agrégateur de modèles hébergés de Zed (cloud.zed.dev), qui donne accès aux modèles Anthropic/OpenAI/Google/xAI dans le cadre de votre forfait Zed. | +| ID | Alias | Nom | Étiquettes | Site web | Notes | +| --------------- | ------------- | ------------------------- | ---------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [lien](https://antigravity.google) | Importez la connexion de votre Antigravity CLI (`agy`) (collez/téléversez son fichier de jeton), détectez automatiquement une connexion CLI locale ou connectez-vous avec Google. Partage le backend Antigravity (y compris les modèles Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [lien](https://aws.amazon.com/q/developer/) | Utilise le même flux AWS Builder ID ou d’importation de jeton d’actualisation que Kiro, mais conserve les connexions Amazon Q séparément. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [lien](https://cline.bot/cline-pass) | ClinePass est l’abonnement à 9,99 $/mois de Cline regroupant 10 modèles de codage ouverts. Connectez-vous avec votre compte Cline (les mêmes identifiants que pour le CLI/IDE Cline), ou collez directement une clé API ClinePass (app.cline.bot → Paramètres → Clés API). Un abonnement ClinePass donne accès aux modèles cline-pass/*. Réutilise le flux OAuth Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [lien](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Connectez-vous via le flux officiel de code d’appareil du CLI, ou collez directement une clé API (envoyée sous la forme Authorization: Bearer). Catalogue : GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [lien](https://cli.devin.ai) | Nécessite le binaire Devin CLI. Exécutez `devin auth login` pour vous authentifier, ou fournissez votre WINDSURF_API_KEY. Installation : https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [lien](https://devin.ai) | Collez une clé API Devin existante provenant d’une session Devin authentifiée. La disponibilité et les étapes d’exportation de la clé varient selon la version de Devin et le compte. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Saisissez l’URL de votre instance GHE (par exemple, https://ghe.company.com) dans les paramètres du fournisseur, puis authentifiez-vous via le flux d’appareil. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [lien](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth n’est pas configuré. Enregistrez une application OAuth sur https://gitlab.com/-/profile/applications avec l’URI de redirection http://localhost:20128/callback et les portées « ai_features read_user », puis définissez GITLAB_DUO_OAUTH_CLIENT_ID (et éventuellement GITLAB_DUO_OAUTH_CLIENT_SECRET) et redémarrez. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Connectez-vous avec votre navigateur, ou collez votre ~/.grok/auth.json (ou le jeton d’accès JWT) provenant du Grok Build CLI ; refresh_token est automatiquement renouvelé dans les deux cas. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [lien](https://www.kimi.com/code?aff=omniroute) | Connectez-vous avec le même compte Kimi que celui utilisé par Kimi Code CLI. OmniRoute utilise le flux OAuth du CLI et les points de terminaison Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Offre gratuite : 50 crédits/mois (environ 25 000 à 100 000 jetons). ⚠️ Les conditions d’utilisation de Kiro interdisent l’utilisation de proxys/outils d’orchestration tiers. | +| `openference` | `of` | Openference | OAuth | [lien](https://openference.com) | Connectez-vous avec votre compte Openference pour acheminer les requêtes via api.openference.com. Inclut un accès gratuit à Qwen3.8 27b et Llama 3.2 3B — consultez openference.com/pricing pour connaître les conditions actuelles de l’offre. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [lien](https://trae.ai) | Trae est un IDE natif pour l’IA créé par ByteDance (agent distant SOLO). Accordez l’autorisation via trae.ai dans la fenêtre contextuelle, ou connectez-vous sur solo.trae.ai et collez le Cloud-IDE-JWT (envoyé sous la forme 'Authorization: Cloud-IDE-JWT ', avec une durée de validité d’environ 14 jours) en tant que jeton d’accès ; web_id/biz_user_id/user_unique_id/scope/tenant/region sont propagés via providerSpecificData. Aucun renouvellement sans interface graphique pour les jetons collés — recollez-les à leur expiration. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [lien](https://x.ai) | Connectez-vous avec xAI pour utiliser les modèles api.x.ai tels que Grok 4.5. Cela est distinct des sessions JWT Grok Build, qui utilisent cli-chat-proxy.grok.com et les alias de modèles grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [lien](https://zed.dev) | Zed stocke les identifiants des fournisseurs de LLM (OpenAI, Anthropic, Google, Mistral, xAI) dans le trousseau du système d’exploitation. Utilisez le bouton Importer ci-dessous pour les détecter et les importer automatiquement. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [lien](https://zed.dev) | Connectez-vous avec votre compte Zed (connexion via l’application native). OmniRoute génère une paire de clés RSA à usage unique et ouvre zed.dev pour l’autoriser — sur une installation distante/sans interface graphique, copiez l’URL de rappel 127.0.0.1 obtenue depuis la barre d’adresse de votre navigateur et collez-la ici. Distinct de l’entrée d’importation d’identifiants « Zed IDE » ci-dessus : cette fonctionnalité relaie les complétions de chat via l’agrégateur de modèles hébergé de Zed (cloud.zed.dev), qui donne accès aux modèles Anthropic/OpenAI/Google/xAI dans le cadre de votre offre Zed. | ## Fournisseurs de cookies Web (34) @@ -117,47 +117,47 @@ Utilisez le tableau de bord à l’adresse `/dashboard/providers` pour activer, ## Fournisseurs de clés API (payants / payants avec crédits gratuits) (242) -| ID | Alias | Nom | Tags | Site web | Notes | +| ID | Alias | Nom | Étiquettes | Site web | Remarques | | ------------------------ | --------------- | ------------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `360ai` | `360ai` | 360 AI | Clé API | [lien](https://ai.360.cn) | Obtenez une clé API sur ai.360.cn | | `agentrouter` | `agentrouter` | AgentRouter | Clé API, agrégateur | [lien](https://agentrouter.org) | 200 $ de crédits gratuits à l’inscription — passerelle de routage multimodèle | | `agnes` | `agnes` | Agnes AI | Clé API, vidéo | [lien](https://agnes-ai.com) | Obtenez une clé API sur agnes-ai.com | | `agnes-cn` | `agnescn` | Agnes AI (Chine) | Clé API | [lien](https://api.agnes-ai.cn) | Obtenez une clé API sur le site chinois d’Agnes. | | `ai21` | `ai21` | AI21 Labs | Clé API | [lien](https://www.ai21.com) | 10 $ de crédits d’essai à l’inscription (valables 3 mois), sans carte bancaire requise | -| `aimlapi` | `aiml` | AI/ML API | Clé API, agrégateur | [lien](https://aimlapi.com) | Offre gratuite suspendue (2026) — AI/ML API fonctionne désormais uniquement à l’utilisation (rechargement minimal de 20 $) ; aucun crédit gratuit récurrent. | -| `ainative` | `ainative` | AINative Studio | Clé API | [lien](https://ainative.studio) | Créez une clé API gratuite sur ainative.studio (sans carte), puis collez-la ici en tant que jeton Bearer. | -| `aion` | `aion` | Aion Labs | Clé API | [lien](https://www.aionlabs.ai) | Créez une clé API gratuite sur aionlabs.ai (sans carte), puis collez-la ici en tant que jeton Bearer. | +| `aimlapi` | `aiml` | AI/ML API | Clé API, agrégateur | [lien](https://aimlapi.com) | Offre gratuite suspendue (2026) — AI/ML API fonctionne désormais uniquement à l’utilisation (recharge minimale de 20 $) ; aucun crédit gratuit récurrent. | +| `ainative` | `ainative` | AINative Studio | Clé API | [lien](https://ainative.studio) | Créez une clé API gratuite sur ainative.studio (sans carte), puis collez-la ici comme jeton Bearer. | +| `aion` | `aion` | Aion Labs | Clé API | [lien](https://www.aionlabs.ai) | Créez une clé API gratuite sur aionlabs.ai (sans carte), puis collez-la ici comme jeton Bearer. | | `alibaba` | `ali` | Alibaba Cloud Model Studio | Clé API | [lien](https://bailian.console.alibabacloud.com/) | — | | `alibaba-cn` | `ali-cn` | Alibaba (Chine) | Clé API | [lien](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Clé API | [lien](https://developer.ant-ling.com/en/docs/) | Inscrivez-vous et créez une clé API dans la console API d’Ant Ling (https://chat.ant-ling.com/open), puis collez-la ici. OmniRoute achemine le trafic de conversation vers https://api.ant-ling.com/v1/chat/completions ; le fournisseur est compatible avec OpenAI et propose également une interface compatible avec Anthropic. | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Clé API | [lien](https://developer.ant-ling.com/en/docs/) | Inscrivez-vous et créez une clé API dans la console API d’Ant Ling (https://chat.ant-ling.com/open), puis collez-la ici. OmniRoute achemine le trafic de chat vers https://api.ant-ling.com/v1/chat/completions ; le fournisseur est compatible avec OpenAI et propose également une interface compatible avec Anthropic. | | `anthropic` | `anthropic` | Anthropic | Clé API | [lien](https://platform.claude.com) | — | | `anyapi` | `anyapi` | AnyAPI AI | Clé API, agrégateur | [lien](https://anyapi.ai) | Offre gratuite : 100 000 ANY Tokens/jour et 100 RPM pour les modèles Free/Basic éligibles ; aucune carte bancaire requise. | | `api-airforce` | `af` | Api.airforce | Clé API | [lien](https://api.airforce) | 55 modèles gratuits, notamment Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash et DeepSeek-V3 | | `arcee-ai` | `arcee` | Arcee AI | Clé API | [lien](https://arcee.ai) | Obtenez une clé API sur arcee.ai | -| `auriko` | `auriko` | Auriko | Clé API, agrégateur | [lien](https://www.auriko.ai) | L’offre gratuite annonce 1 000 RPM pour la plateforme et 10 000 RPM en BYOK. L’inférence de la plateforme reste soumise aux coûts du fournisseur ; il ne s’agit pas d’une réserve de jetons gratuits ni d’une inférence gratuite illimitée. | +| `auriko` | `auriko` | Auriko | Clé API, agrégateur | [lien](https://www.auriko.ai) | L’offre gratuite annonce 1 000 RPM pour la plateforme et 10 000 RPM en BYOK. L’inférence de la plateforme reste soumise aux coûts du fournisseur ; il ne s’agit ni d’une réserve de jetons gratuits ni d’une inférence gratuite illimitée. | | `azure-ai` | `azure-ai` | Azure AI Foundry | Clé API, entreprise | [lien](https://learn.microsoft.com/azure/ai-foundry) | Utilisez votre clé Azure AI Foundry. L’URL de base peut être https://.services.ai.azure.com/openai/v1/ ou https://.openai.azure.com/openai/v1/. | | `azure-openai` | `azure` | Azure OpenAI | Clé API, entreprise | [lien](https://azure.microsoft.com/products/ai-services/openai-service) | Utilisez votre clé API Azure OpenAI. L’URL de base doit être le point de terminaison de votre ressource, par exemple https://my-resource.openai.azure.com. | | `bai` | `bai` | b.ai | Clé API | [lien](https://b.ai) | Clé API Bearer pour la passerelle LLM de b.ai compatible avec OpenAI (distincte de TheB.AI). Créez une clé sur https://docs.b.ai, puis utilisez https://api.b.ai/v1 comme URL de base compatible avec OpenAI. | | `baichuan` | `baichuan` | Baichuan | Clé API | [lien](https://www.baichuan-ai.com/) | Obtenez une clé API sur platform.baichuan-ai.com | | `baidu` | `baidu` | Baidu (ERNIE) | Clé API | [lien](https://ernie.baidu.com/) | Obtenez une clé API sur console.bce.baidu.com | | `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Clé API | [lien](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | Clé API | [lien](https://baseten.co) | 30 $ de crédits d’essai gratuits pour l’inférence sur GPU | +| `baseten` | `baseten` | Baseten | Clé API | [lien](https://baseten.co) | 30 $ de crédits d’essai gratuits pour l’inférence GPU | | `bazaarlink` | `bzl` | BazaarLink | Clé API | [lien](https://bazaarlink.ai) | Utilisez votre clé API BazaarLink (commençant par sk-bl-) dans Authorization: Bearer . Le SDK OpenAI fonctionne avec l’URL de base https://bazaarlink.ai/api/v1. Les modèles utilisent le format provider/model-name. | | `bedrock` | `bedrock` | Amazon Bedrock | Clé API, entreprise | [lien](https://aws.amazon.com/bedrock) | Utilisez votre clé API Amazon Bedrock et configurez la région AWS dans laquelle vos modèles sont activés (par exemple eu-west-2). OmniRoute appelle directement l’API Converse native de Bedrock. | | `black-forest-labs` | `bfl` | Black Forest Labs | Clé API, image | [lien](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | Clé API | [lien](https://blackbox.ai) | ⚠️ **OBSOLETE.** api.blackbox.ai renvoie HTTP 404 pour chaque variante de chemin (analyse du 2026-08-21) ; l’interface d’inférence publique a été déplacée vers le point de terminaison restreint enterprise.blackbox.ai/v1. | +| `blackbox` | `bb` | Blackbox AI | Clé API | [lien](https://blackbox.ai) | ⚠️ **OBSOLÈTE.** api.blackbox.ai renvoie une erreur HTTP 404 pour chaque variante de chemin (analyse du 21/08/2026) ; l’interface publique d’inférence a été déplacée vers le point de terminaison restreint enterprise.blackbox.ai/v1. | | `bluesminds` | `bm` | BluesMinds | Clé API | [lien](https://www.bluesminds.com) | Crédits pi quotidiens gratuits — prend en charge plus de 200 modèles, notamment GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen et Kimi K2 | | `byteplus` | `bpm` | BytePlus ModelArk | Clé API | [lien](https://console.byteplus.com/ark) | — | | `bytez` | `bytez` | Bytez | Clé API | [lien](https://bytez.com) | 1 $ de crédits gratuits, renouvelés toutes les 4 semaines | -| `cerebras` | `cerebras` | Cerebras | Clé API | [lien](https://inference.cerebras.ai) | Crédit d’inscription unique de 5 $ (valable 30 jours) ; un moyen de paiement est requis. Il ne s’agit pas d’une offre gratuite récurrente. | +| `cerebras` | `cerebras` | Cerebras | Clé API | [lien](https://inference.cerebras.ai) | Crédit unique de 5 $ à l’inscription (valable 30 jours) ; un moyen de paiement est requis. Il ne s’agit pas d’une offre gratuite récurrente. | | `charm-hyper` | `charm-hyper` | Charm Hyper | Clé API | [lien](https://hyper.charm.land) | 100 Hypercredits mensuels gratuits à l’inscription | -| `chat-oripe` | `chat-oripe` | Chat Oripe | Clé API, agrégateur | [lien](https://api.oriper.com) | Les métadonnées officielles annoncent 2 millions de jetons par mois, mais le site public et la documentation étaient bloqués lors de l’audit ; considérez le quota et la correspondance avec la marque comme non confirmés. | +| `chat-oripe` | `chat-oripe` | Chat Oripe | Clé API, agrégateur | [lien](https://api.oriper.com) | Les métadonnées officielles annoncent 2 millions de jetons/mois, mais le site public et la documentation étaient bloqués lors de l’audit ; considérez le quota et l’association à la marque comme non confirmés. | | `chatanywhere` | `chatanywhere` | ChatAnywhere | Clé API, agrégateur | [lien](https://chatanywhere.tech) | Usage personnel, éducatif ou de recherche uniquement : la documentation publique indique 10 000 points/jour et 200 requêtes/jour par IP/clé ; ne pas utiliser pour du trafic commercial. | | `cheaperinference` | `cinf` | Cheaper Inference | Clé API | [lien](https://cheaperinference.com/?utm_source=omniroute) | — | | `chenzk` | `chenzk` | Chenzk API | Clé API | [lien](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | Clé API, agrégateur | [lien](https://chutes.ai) | Clé API Bearer pour la passerelle compatible OpenAI de Chutes. | -| `clarifai` | `clarifai` | Clarifai | Clé API, entreprise | [lien](https://docs.clarifai.com) | Utilisez votre PAT Clarifai ou une clé API propre à l’application. OmniRoute cible le point de terminaison compatible OpenAI à l’adresse https://api.clarifai.com/v2/ext/openai/v1 et s’authentifie avec Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Clé API, agrégateur | [lien](https://cloudcode.one) | Les modèles gratuits publiés incluent glm-4.7-flash et glm-4.6v-flash ; aucun quota chiffré n’est publié, et la création d’une clé peut nécessiter un crédit ou un coupon. | +| `chutes` | `chutes` | Chutes.ai | Clé API, agrégateur | [lien](https://chutes.ai) | Clé API Bearer pour la passerelle Chutes compatible avec OpenAI. | +| `clarifai` | `clarifai` | Clarifai | Clé API, entreprise | [lien](https://docs.clarifai.com) | Utilisez votre PAT Clarifai ou une clé API propre à l’application. OmniRoute cible le point de terminaison compatible avec OpenAI à l’adresse https://api.clarifai.com/v2/ext/openai/v1 et s’authentifie avec Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Clé API, agrégateur | [lien](https://cloudcode.one) | Les modèles gratuits publiés incluent glm-4.7-flash et glm-4.6v-flash ; aucun quota chiffré n’est publié et la création d’une clé peut nécessiter un crédit ou un coupon. | | `cloudflare-ai` | `cf` | Cloudflare Workers AI | Clé API | [lien](https://developers.cloudflare.com/workers-ai) | Nécessite un jeton API ET un identifiant de compte (disponible sur dash.cloudflare.com) | | `clova-studio` | `clova` | Naver CLOVA Studio | Clé API | [lien](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | | `codestral` | `codestral` | Codestral | Clé API | [lien](https://mistral.ai) | — | @@ -165,65 +165,65 @@ Utilisez le tableau de bord à l’adresse `/dashboard/providers` pour activer, | `command-code` | `cmd` | Command Code | Clé API | [lien](https://commandcode.ai/) | Utilisez une clé API Command Code. Les requêtes sont envoyées au point de terminaison /provider/v1/chat/completions de Command Code. | | `coze` | `coze` | Coze | Clé API | [lien](https://coze.com) | Obtenez une clé API sur coze.com/open/api | | `crof` | `crof` | CrofAI | Clé API | [lien](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | Clé API | [lien](https://cursor.com/dashboard/api) | Collez une clé API utilisateur Cursor (crsr_...) depuis cursor.com/dashboard/api. OmniRoute l’échange à la demande contre un jeton de session ; aucune installation d’IDE ou de cursor-agent n’est nécessaire. L’utilisation est facturée sur le forfait Cursor auquel appartient la clé. | -| `dahl` | `dahl` | Dahl | Clé API | [lien](https://inference.dahl.global) | Cliquez sur « Add Account » pour générer automatiquement un jeton, ou ajoutez manuellement une clé API. | +| `cursor-api` | `cua` | Cursor API | Clé API | [lien](https://cursor.com/dashboard/api) | Collez une clé API utilisateur Cursor (crsr_...) provenant de cursor.com/dashboard/api. OmniRoute l’échange à la demande contre un jeton de session ; aucune installation de l’IDE ou de cursor-agent n’est nécessaire. L’utilisation est facturée au forfait Cursor auquel appartient la clé. | +| `dahl` | `dahl` | Dahl | Clé API | [lien](https://inference.dahl.global) | Cliquez sur « Add Account » pour générer automatiquement un jeton, ou ajoutez une clé API manuellement. | | `databricks` | `databricks` | Databricks | Clé API, entreprise | [lien](https://www.databricks.com) | — | | `datarobot` | `datarobot` | DataRobot | Clé API, entreprise | [lien](https://docs.datarobot.com) | Utilisez votre jeton API DataRobot. L’URL de base facultative peut être la racine du compte (pour LLM Gateway) ou une URL de déploiement sous /api/v2/deployments/. | | `deepai` | `deepai` | DeepAI | Clé API, image | [lien](https://deepai.org) | Utilisez votre clé API DeepAI. Obtenez-en une sur deepai.org — nécessite un abonnement Pro (9,99 $/mois). | | `deepinfra` | `deepinfra` | DeepInfra | Clé API | [lien](https://deepinfra.com) | Crédits gratuits à l’inscription pour tester l’API et explorer les modèles | -| `deepseek` | `ds` | DeepSeek | Clé API | [lien](https://platform.deepseek.com) | 5 millions de jetons gratuits à l’inscription, sans carte bancaire requise | -| `dgrid` | `dgrid` | DGrid | Clé API | [lien](https://dgrid.ai) | Routeur de modèles gratuits DGrid : 10 requêtes/minute et 100 requêtes/jour. Un rechargement unique de 5 $ débloque jusqu’à 20 requêtes/minute et 1 000 requêtes/jour. | +| `deepseek` | `ds` | DeepSeek | Clé API | [lien](https://platform.deepseek.com) | 5 millions de jetons gratuits à l’inscription — sans carte bancaire requise | +| `dgrid` | `dgrid` | DGrid | Clé API | [lien](https://dgrid.ai) | Routeur de modèles gratuits DGrid : 10 requêtes/minute et 100 requêtes/jour. Une recharge unique de 5 $ débloque jusqu’à 20 requêtes/minute et 1 000 requêtes/jour. | | `dify` | `dify` | Dify | Clé API | [lien](https://dify.ai) | Obtenez la clé API depuis votre instance Dify. | | `digitalocean` | `digitalocean` | DigitalOcean | Clé API | [lien](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | Clé API | [lien](https://dit.ai) | Utilisez votre clé API dit.ai dans Authorization: Bearer . Entièrement compatible avec OpenAI — une solution de remplacement immédiate : modifiez simplement l’URL de base en https://api.dit.ai/v1. | +| `dit` | `dai` | DIT.ai | Clé API | [lien](https://dit.ai) | Utilisez votre clé API dit.ai dans Authorization: Bearer . Entièrement compatible avec OpenAI — une solution de remplacement directe : il suffit de remplacer l’URL de base par https://api.dit.ai/v1. | | `doubao` | `doubao` | Doubao | Clé API | [lien](https://doubao.com) | Obtenez une clé API sur console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | Clé API, agrégateur | [lien](https://www.dxnt.com) | Les comptes gratuits sont documentés avec une limite de 100 appels/jour ; le quota peut augmenter grâce aux invitations et varier selon le compte. | +| `dxnt` | `dxnt` | DXNT / DX Token | Clé API, agrégateur | [lien](https://www.dxnt.com) | Les comptes gratuits sont indiqués comme bénéficiant de 100 appels/jour ; le quota peut augmenter grâce aux invitations et varier selon le compte. | | `electronhub` | `electronhub` | Electron Hub | Clé API, agrégateur | [lien](https://www.electronhub.ai) | Forfait gratuit : 5 RPM, 0,25 $ de crédits hebdomadaires et 10 Neutrinos/jour pour les modèles :free ; les budgets familiaux s’appliquent également. | -| `empower` | `empower` | Empower | Clé API, agrégateur | [lien](https://docs.empower.dev) | Clé API Bearer pour le point de terminaison compatible OpenAI d’Empower. | +| `empower` | `empower` | Empower | Clé API, agrégateur | [lien](https://docs.empower.dev) | Clé API Bearer pour le point de terminaison Empower compatible avec OpenAI. | | `eurouter` | `eurouter` | EURouter | Clé API, agrégateur | [lien](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | Clé API | [lien](https://factory.ai) | Clé API Bearer pour la passerelle compatible OpenAI de Factory. | +| `factory` | `factory` | Factory | Clé API | [lien](https://factory.ai) | Clé API Bearer pour la passerelle Factory compatible avec OpenAI. | | `fal-ai` | `fal` | Fal.ai | Clé API, image | [lien](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | Clé API, agrégateur | [lien](https://fastrouter.ai) | Les modèles dotés du suffixe :free autorisent 10 requêtes/jour par organisation et par modèle ; leur disponibilité peut changer. | -| `featherless-ai` | `featherless` | Featherless AI | Clé API | [lien](https://featherless.ai) | Offre gratuite disponible — aucune carte bancaire requise | -| `fenayai` | `fenayai` | FenayAI | Clé API, agrégateur | [lien](https://fenayai.com) | Clé API Bearer pour la passerelle compatible OpenAI de FenayAI. | +| `fastrouter` | `fastrouter` | FastRouter | Clé API, agrégateur | [lien](https://fastrouter.ai) | Les modèles portant le suffixe :free permettent 10 requêtes/jour par organisation et par modèle ; leur disponibilité peut changer. | +| `featherless-ai` | `featherless` | Featherless AI | Clé API | [lien](https://featherless.ai) | Offre gratuite disponible — sans carte bancaire requise | +| `fenayai` | `fenayai` | FenayAI | Clé API, agrégateur | [lien](https://fenayai.com) | Clé API Bearer pour la passerelle FenayAI compatible avec OpenAI. | | `fireworks` | `fireworks` | Fireworks AI | Clé API | [lien](https://fireworks.ai) | 1 $ de crédits de démarrage gratuits à l’inscription pour tester l’API | | `free-ai` | `free-ai` | Free.ai | Clé API, agrégateur | [lien](https://free.ai) | 30 000 jetons/jour couvrent les modèles auto-hébergés après vérification de l’adresse e-mail. L’utilisation au-delà de cette réserve peut être facturée au coût brut, et les modèles externes premium sont payants. | | `freeaiapikey` | `faik` | FreeAIAPIKey | Clé API | [lien](https://freeaiapikey.com) | — | | `freebuff` | `freebuff` | Freebuff | Clé API | [lien](https://freebuff.com) | Saisissez le jeton d’authentification Freebuff / Codebuff (obtenu via une connexion CLI ou un collecteur automatisé). | -| `freeinference` | `freeinference` | FreeInference | Clé API, agrégateur | [lien](https://freeinference.org) | Accès gratuit pour la recherche sans carte bancaire ; les candidats ne relevant pas de Harvard doivent obtenir une approbation manuelle et aucun quota chiffré n’est garanti publiquement. | -| `freemodel-dev` | `fmd` | FreeModel.dev | Clé API | [lien](https://freemodel.dev) | 300 $ de crédits gratuits à l’inscription — aucune carte bancaire requise. Accès à GPT-5.4 et GPT-5.5 (les derniers modèles phares d’OpenAI) via une API compatible avec OpenAI. | -| `freetheai` | `fta` | FreeTheAi | Clé API, agrégateur | [lien](https://freetheai.xyz) | Rejoignez le Discord FreeTheAi pour obtenir votre clé API gratuite. | +| `freeinference` | `freeinference` | FreeInference | Clé API, agrégateur | [lien](https://freeinference.org) | Accès gratuit pour la recherche sans carte bancaire ; les candidats ne relevant pas de Harvard doivent obtenir une approbation manuelle et aucun quota numérique n’est garanti publiquement. | +| `freemodel-dev` | `fmd` | FreeModel.dev | Clé API | [lien](https://freemodel.dev) | $300 de crédits gratuits à l’inscription — aucune carte bancaire requise. Accédez à GPT-5.4 et GPT-5.5 (les derniers modèles phares d’OpenAI) via une API compatible avec OpenAI. | +| `freetheai` | `fta` | FreeTheAi | Clé API, agrégateur | [lien](https://freetheai.xyz) | Rejoignez le Discord de FreeTheAi pour obtenir votre clé API gratuite. | | `friendliai` | `friendli` | FriendliAI | Clé API | [lien](https://friendli.ai) | Offre gratuite pour l’inférence sans serveur — aucune carte bancaire requise | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits cake sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits cake sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits cake sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits cake sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits cake sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits « cake » sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits « cake » sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits « cake » sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits « cake » sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Clé API, agrégateur | [lien](https://g4f.space) | Générez anonymement des crédits « cake » sur g4f.dev/chat, ou utilisez une clé de membre g4f.dev (créez-en une sur g4f.dev/members.html). | | `galadriel` | `galadriel` | Galadriel | Clé API | [lien](https://galadriel.com) | ⚠️ **OBSOLÈTE.** api.galadriel.ai ne répond plus (vérification du 2026-06-19) ; l’API d’inférence semble avoir été abandonnée. | | `gemini` | `gemini` | Gemini (Google AI Studio) | Clé API | [lien](https://aistudio.google.com) | Offre gratuite disponible via Google AI Studio ; les quotas actuels propres à chaque modèle et les restrictions régionales s’appliquent | | `getgoapi` | `ggo` | GoAPI | Clé API, agrégateur | [lien](https://api.getgoapi.com) | — | | `gigachat` | `gigachat` | GigaChat (Sber) | Clé API | [lien](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | Clé API | [lien](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Jeton d’accès personnel GitLab pour l’API publique Code Suggestions. Configurez une URL de base auto-hébergée si vous n’utilisez pas gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Clé API | [lien](https://opengateway.gitlawb.com) | L’accès gratuit à MiMo (xiaomi/mimo-v2.5) a été révoqué en 2026-05 — Opengateway est désormais une passerelle à crédits facturée à l’utilisation ; aucun modèle gratuit récurrent. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Clé API | [lien](https://opengateway.gitlawb.com) | La promotion gratuite Nemotron a pris fin en 2026-06 — la route GMI Cloud est désormais uniquement accessible avec des crédits facturés à l’utilisation. | +| `gitlab` | `gitlab` | GitLab Duo PAT | Clé API | [lien](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Jeton d’accès personnel GitLab pour l’API publique Code Suggestions. Configurez une URL de base auto-hébergée lorsque vous n’utilisez pas gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Clé API | [lien](https://opengateway.gitlawb.com) | L’accès gratuit à MiMo (xiaomi/mimo-v2.5) a été révoqué en 2026-05 — Opengateway est désormais une passerelle de crédits facturée à l’utilisation ; aucun modèle gratuit récurrent. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Clé API | [lien](https://opengateway.gitlawb.com) | La promotion gratuite Nemotron a pris fin en 2026-06 — la route GMI Cloud est désormais uniquement facturée à l’utilisation sous forme de crédits. | | `glm` | `glm` | GLM Coding | Clé API | [lien](https://z.ai/subscribe) | — | | `glm-cn` | `glmcn` | GLM Coding (Chine) | Clé API | [lien](https://open.bigmodel.cn) | — | | `glmt` | `glmt` | GLM Thinking | Clé API | [lien](https://open.bigmodel.cn) | — | | `greenpt` | `greenpt` | GreenPT | Clé API | [lien](https://greenpt.com) | La création d’un abonnement API est gratuite ; l’inférence est facturée par jeton. Aucun quota d’inférence gratuit n’est publié. | -| `groq` | `groq` | Groq | Clé API | [lien](https://groq.com) | Offre gratuite : plafonds propres à chaque modèle (200 000 jetons/jour par modèle de chat ; consultez console.groq.com/docs/rate-limits pour les RPM/RPD) — aucun moyen de paiement enregistré. | +| `groq` | `groq` | Groq | Clé API | [lien](https://groq.com) | Offre gratuite : plafonds propres à chaque modèle (200K jetons/jour par modèle de conversation ; consultez console.groq.com/docs/rate-limits pour les limites RPM/RPD) — aucun moyen de paiement enregistré. | | `haiper` | `hp` | Haiper | Clé API, vidéo | [lien](https://haiper.ai) | Obtenez une clé API sur haiper.ai/haiper-api | | `hcnsec` | `hcnsec` | Huancheng Public API | Clé API | [lien](https://api.hcnsec.cn) | Obtenez une clé API sur api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | Clé API, agrégateur | [lien](https://helixmind.online) | Les affirmations précédemment diffusées concernant 3 RPM/50 RPD et l’absence de carte bancaire n’ont pas été confirmées lors de l’audit du 2026-08-02 ; le quota et la facturation actuels nécessitent une vérification du compte. | -| `helyxai` | `helyxai` | Helyx AI | Clé API, agrégateur | [lien](https://helyxai.space) | L’offre gratuite opérationnelle documente 100 000 jetons/jour ; l’affirmation marketing distincte du site faisant état de plus de 2 millions entre en contradiction avec ce chiffre et n’est pas considérée comme une garantie de quota. | +| `helixmind` | `helixmind` | HelixMind | Clé API, agrégateur | [lien](https://helixmind.online) | Les affirmations précédemment diffusées concernant des limites de 3 RPM/50 RPD et l’absence de carte bancaire requise n’ont pas été confirmées lors de l’audit du 2026-08-02 ; le quota et la facturation actuels nécessitent une vérification du compte. | +| `helyxai` | `helyxai` | Helyx AI | Clé API, agrégateur | [lien](https://helyxai.space) | L’offre gratuite opérationnelle indique 100,000 jetons/jour ; l’affirmation marketing distincte du site faisant état de plus de 2M est contradictoire et n’est pas considérée comme une garantie de quota. | | `heroku` | `heroku` | Heroku AI | Clé API, entreprise | [lien](https://www.heroku.com) | — | | `huggingface` | `hf` | HuggingFace | Clé API | [lien](https://huggingface.co) | API d’inférence gratuite pour des milliers de modèles (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | Clé API | [lien](https://hyperbolic.xyz) | 1 à 5 $ de crédits d’essai à l’inscription pour l’inférence sans serveur | +| `hyperbolic` | `hyp` | Hyperbolic | Clé API | [lien](https://hyperbolic.xyz) | $1-5 de crédits d’essai à l’inscription pour l’inférence sans serveur | | `ideogram` | `ideo` | Ideogram | Clé API | [lien](https://ideogram.ai) | Obtenez une clé API sur ideogram.ai/docs/api | | `iflytek` | `iflytek` | iFlytek Spark | Clé API | [lien](https://xinghuo.xfyun.cn) | Obtenez une clé API sur console.xfyun.cn | -| `inception` | `inception` | Inception | Clé API | [lien](https://docs.inceptionlabs.ai) | 10 millions de jetons gratuits à l’inscription, aucune carte bancaire requise. | -| `inference-net` | `inet` | Inference.net | Clé API | [lien](https://inference.net) | 25 $ de crédits gratuits à l’inscription, auxquels s’ajoutent des subventions de recherche disponibles | -| `internlm` | `internlm` | InternLM (Intern-S1) | Clé API | [lien](https://internlm.intern-ai.org.cn/) | Quota mensuel gratuit d’environ 1 million de jetons en entrée / 3 millions en sortie (environ 10 RPM) | -| `jina-ai` | `jina` | Jina AI (API Foundation) | Clé API, intégration/reclassement | [lien](https://jina.ai) | Clé API Bearer pour api.jina.ai — intégration, reclassement, classification, segmentation et recherche. Les clés du tableau de bord ont priorité sur JINA_AI_API_KEY. Il ne s’agit pas de la carte Reader / r.jina.ai et elle ne récupère pas d’URL. | +| `inception` | `inception` | Inception | Clé API | [lien](https://docs.inceptionlabs.ai) | 10M de jetons gratuits à l’inscription, sans carte bancaire requise. | +| `inference-net` | `inet` | Inference.net | Clé API | [lien](https://inference.net) | $25 de crédits gratuits à l’inscription, avec en plus des subventions disponibles pour la recherche | +| `internlm` | `internlm` | InternLM (Intern-S1) | Clé API | [lien](https://internlm.intern-ai.org.cn/) | Quota mensuel gratuit d’environ 1M de jetons en entrée / 3M en sortie (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (API Foundation) | Clé API, intégration/reclassement | [lien](https://jina.ai) | Clé API Bearer pour api.jina.ai — intégration, reclassement, classification, segmentation et recherche. Les clés du tableau de bord sont prioritaires sur JINA_AI_API_KEY. Il ne s’agit pas de la carte Reader / r.jina.ai et elle ne récupère pas les URL. | | `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Clé API | [lien](https://jina.ai/reader) | Clé API Bearer pour la conversion d’URL en Markdown via r.jina.ai (/v1/web/fetch uniquement). Ne fournit pas /v1/embeddings ni /v1/rerank. Le même jeton Jina que pour l’API Foundation fonctionne ; OmniRoute réutilise une clé jina-ai du tableau de bord ou JINA_AI_API_KEY lorsque cette carte est vide. | | `kenari` | `kenari` | Kenari | Clé API | [lien](https://kenari.id) | Utilisez votre clé API Kenari (kn-...) dans Authorization: Bearer . Entièrement compatible avec OpenAI. URL de base de l’API : https://kenari.id/v1. | | `kie` | `kie` | KIE.AI | Clé API | [lien](https://kie.ai) | — | @@ -234,53 +234,53 @@ Utilisez le tableau de bord à l’adresse `/dashboard/providers` pour activer, | `laozhang` | `lz` | LaoZhang AI | Clé API, agrégateur | [lien](https://api.laozhang.ai) | — | | `leonardo` | `leo` | Leonardo AI | Clé API, vidéo | [lien](https://leonardo.ai) | Obtenez une clé API sur leonardo.ai/developer | | `liquid` | `liquid` | Liquid AI | Clé API | [lien](https://liquid.ai) | Obtenez une clé API sur liquid.ai | -| `literouter` | `literouter` | LiteRouter | Clé API, agrégateur | [lien](https://literouter.com) | Les variantes gratuites des modèles utilisent le suffixe :free ; les limites quotidiennes de crédits varient selon le modèle et les entrées gratuites sont plafonnées à 5 000 jetons. | +| `literouter` | `literouter` | LiteRouter | Clé API, agrégateur | [lien](https://literouter.com) | Les variantes gratuites des modèles utilisent le suffixe :free ; les limites quotidiennes de crédits varient selon le modèle et l’entrée gratuite est plafonnée à 5 000 jetons. | | `llamagate` | `llamagate` | LlamaGate | Clé API | [lien](https://llamagate.ai) | — | | `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Clé API, agrégateur | [lien](https://llm.kiwi) | L’offre gratuite donne accès à auto et hrLLM ; la limite publiée de 40 requêtes/heure s’applique à hrLLM. | -| `llm7` | `llm7` | LLM7.io | Clé API | [lien](https://llm7.io) | Utilisez n’importe quelle clé non vide (par exemple « unused »). Si les anciens modèles intégrés renvoient model_unavailable, utilisez Available Models → Import from /models ou Auto-Sync ; modèle actif vérifié : gemini-3.1-flash-lite. | +| `llm7` | `llm7` | LLM7.io | Clé API | [lien](https://llm7.io) | Utilisez n’importe quelle clé non vide (par exemple « unused »). Si les anciens modèles intégrés renvoient model_unavailable, utilisez Modèles disponibles → Importer depuis /models ou Synchronisation automatique ; modèle actif vérifié : gemini-3.1-flash-lite. | | `llmgateway` | `llmgateway` | LLM Gateway | Clé API, agrégateur | [lien](https://llmgateway.io) | Offre gratuite hébergée : les modèles gratuits sont limités à 5 requêtes toutes les 10 minutes lorsque le compte ne dispose d’aucun crédit. | -| `logfare` | `logfare` | Logfare | Clé API, agrégateur | [lien](https://logfare.ai) | Créez un compte gratuit sur https://logfare.ai/register (nom d’utilisateur/mot de passe, sans vérification de l’adresse e-mail) afin d’obtenir immédiatement une clé API, puis collez-la ici en tant que jeton Bearer. | -| `longcat` | `lc` | LongCat AI | Clé API | [lien](https://longcat.chat/platform/docs) | Gratuit : allocation unique de 10 millions de jetons après l’inscription du compte et la vérification KYC (LongCat-2.0). Allocation unique uniquement — il ne s’agit pas d’un quota quotidien/mensuel récurrent. | -| `magnific` | `freepik` | Magnific | Clé API, image | [lien](https://www.magnific.com) | Obtenez une clé API sur magnific.com/user/api-keys (en-tête x-magnific-api-key). Les anciennes clés de développement Freepik fonctionnent toujours. | +| `logfare` | `logfare` | Logfare | Clé API, agrégateur | [lien](https://logfare.ai) | Créez un compte gratuit sur https://logfare.ai/register (nom d’utilisateur/mot de passe, sans vérification de l’adresse e-mail) pour obtenir instantanément une clé API, puis collez-la ici comme jeton Bearer. | +| `longcat` | `lc` | LongCat AI | Clé API | [lien](https://longcat.chat/platform/docs) | Gratuit : attribution unique de 10 millions de jetons après l’inscription du compte et la vérification KYC (LongCat-2.0). Une seule fois — il ne s’agit pas d’une allocation quotidienne/mensuelle récurrente. | +| `magnific` | `freepik` | Magnific | Clé API, image | [lien](https://www.magnific.com) | Obtenez une clé API sur magnific.com/user/api-keys (en-tête x-magnific-api-key). Les anciennes clés de développeur Freepik fonctionnent toujours. | | `maritalk` | `maritalk` | Maritalk | Clé API | [lien](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | Clé API, agrégateur | [lien](https://meganova.ai) | Inscription gratuite sans carte bancaire. Les quotas publiés de niveau 1 par modèle totalisent 550 requêtes/jour ; ils ne constituent pas une réserve globale partagée et des dépassements payants peuvent s’appliquer s’ils sont activés. | +| `meganova-ai` | `meganova-ai` | MegaNova AI | Clé API, agrégateur | [lien](https://meganova.ai) | Inscription gratuite sans carte bancaire. Les quotas publiés de niveau 1, propres à chaque modèle, totalisent 550 requêtes/jour ; ils ne constituent pas une réserve globale partagée, et des frais de dépassement peuvent s’appliquer s’ils sont activés. | | `meta-llama` | `meta` | API Meta Llama | Clé API | [lien](https://llama.developer.meta.com) | — | | `minimax` | `minimax` | Minimax Coding | Clé API, vidéo | [lien](https://www.minimax.io) | — | | `minimax-cn` | `minimax-cn` | Minimax (Chine) | Clé API | [lien](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | Clé API | [lien](https://mistral.ai) | Niveau gratuit Experiment : accès à tous les modèles avec limitation du débit, sans carte bancaire requise | +| `mistral` | `mistral` | Mistral | Clé API | [lien](https://mistral.ai) | Niveau Experiment gratuit : accès à débit limité à tous les modèles, sans carte bancaire requise | | `mixedbread` | `mxbai` | Mixedbread AI | Clé API | [lien](https://www.mixedbread.com) | Clé API Bearer pour l’API d’intégration de Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | Clé API, agrégateur | [lien](https://www.mixlayer.com) | Le modèle qwen/qwen3.5-4b-free est gratuit pour le prototypage et soumis à une limitation du débit ; aucun nombre fixe et public de requêtes par minute ni quota quotidien n’est confirmé. | +| `mixlayer` | `mixlayer` | Mixlayer | Clé API, agrégateur | [lien](https://www.mixlayer.com) | Le modèle qwen/qwen3.5-4b-free est gratuit pour le prototypage et soumis à une limite de débit ; aucun nombre fixe public de requêtes par minute ni aucun quota quotidien n’est confirmé. | | `mnn-ai` | `mnn-ai` | MNN AI | Clé API, agrégateur | [lien](https://mnnai.ru) | Offre gratuite : 1 $ de crédits mensuels, 10 requêtes par minute et accès uniquement aux modèles marqués Free. | | `modal` | `mdl` | Modal | Clé API, entreprise | [lien](https://modal.com/docs) | Utilisez le jeton Bearer qui protège votre déploiement Modal, s’il est activé. L’URL de base doit pointer vers votre application Modal compatible avec OpenAI, par exemple https://--.modal.run/v1. | | `modelscope` | `ms` | ModelScope | Clé API | [lien](https://modelscope.cn) | Niveau gratuit via ModelScope API-Inference — compte Alibaba requis. | | `monsterapi` | `monster` | MonsterAPI | Clé API | [lien](https://monsterapi.ai) | ⚠️ **OBSOLÈTE.** Monster API a cessé ses activités le 2026-06-30. Utilisez d’autres fournisseurs compatibles avec OpenAI. | | `moonshot` | `moonshot` | Kimi | Clé API | [lien](https://platform.kimi.ai?aff=omniroute) | — | | `morph` | `morph` | Morph | Clé API | [lien](https://morphllm.com) | Niveau gratuit : 250 000 crédits/mois, 0 $ | -| `muse-code` | `mc` | Muse Code (Meta) | Clé API | [lien](https://github.com/meta-llama/llama-stack) | Utilisez votre variable d’environnement META_API_KEY comme jeton Bearer. L’interface en ligne de commande Muse Code utilise le format d’échange de l’API OpenAI Responses (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | Clé API, agrégateur | [lien](https://naga.ac) | Obtenez une clé API sur naga.ac — inscription via Google/GitHub/Discord disponible. | -| `naga-ai` | `naga-ai` | Naga AI | Clé API, agrégateur | [lien](https://naga.ac) | Les modèles marqués :free sont répertoriés publiquement, mais aucun quota chiffré n’est confirmé. La politique de Naga avertit que les prompts et les sorties de l’offre gratuite peuvent être collectés ou utilisés à des fins d’entraînement. | +| `muse-code` | `mc` | Muse Code (Meta) | Clé API | [lien](https://github.com/meta-llama/llama-stack) | Utilisez votre variable d’environnement META_API_KEY comme jeton Bearer. Muse Code CLI utilise le format de transmission de l’API OpenAI Responses (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | Clé API, agrégateur | [lien](https://naga.ac) | Obtenez une clé API sur naga.ac — inscription avec Google/GitHub/Discord disponible. | +| `naga-ai` | `naga-ai` | Naga AI | Clé API, agrégateur | [lien](https://naga.ac) | Les modèles marqués :free sont répertoriés publiquement, mais aucun quota numérique n’est confirmé. La politique de Naga avertit que les prompts et les sorties de l’offre gratuite peuvent être collectés ou utilisés pour l’entraînement. | | `nanogpt` | `nanogpt` | NanoGPT | Clé API | [lien](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | Clé API | [lien](https://bynara.id) | Créez un compte NaraRouter gratuit, associez votre compte Telegram (requis avant les réponses de /v1), puis collez la clé ici en tant que jeton Bearer. | +| `nara` | `nara` | NaraRouter | Clé API | [lien](https://bynara.id) | Créez un compte NaraRouter gratuit, associez votre compte Telegram (obligatoire avant d’obtenir des réponses via /v1), puis collez la clé ici en tant que jeton Bearer. | | `navy` | `navy` | NavyAI | Clé API | [lien](https://api.navy) | Créez une clé API gratuite depuis le tableau de bord NavyAI, puis collez-la ici en tant que jeton Bearer. | | `nebius` | `nebius` | Nebius AI | Clé API | [lien](https://nebius.com) | Environ 1 $ de crédits d’essai à l’inscription pour tester l’API | -| `nlpcloud` | `nlpc` | NLP Cloud | Clé API | [lien](https://docs.nlpcloud.com) | Utilisez votre clé API NLP Cloud dans Authorization: Token . Par défaut, OmniRoute cible le point de terminaison du chatbot à l’adresse https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nlpcloud` | `nlpc` | NLP Cloud | Clé API | [lien](https://docs.nlpcloud.com) | Utilisez votre clé API NLP Cloud dans Authorization: Token . Par défaut, OmniRoute cible le point de terminaison de chatbot à l’adresse https://api.nlpcloud.io/v1/gpu//chatbot. | | `nomic` | `nomic` | Nomic | Clé API | [lien](https://nomic.ai) | Obtenez une clé API sur atlas.nomic.ai | | `nous-research` | `nous` | Nous Research | Clé API | [lien](https://portal.nousresearch.com/help) | Utilisez votre clé API Nous Portal. OmniRoute cible le point de terminaison d’inférence officiel compatible avec OpenAI à l’adresse https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | Clé API, vidéo, agrégateur | [lien](https://novita.ai) | 0,50 $ de crédits d’essai à l’inscription (valables environ 1 an) | +| `novita` | `novita` | Novita AI | Clé API, vidéo, agrégateur | [lien](https://novita.ai) | 0,50 $ de crédits d’essai à l’inscription (valides environ 1 an) | | `nscale` | `nscale` | nScale | Clé API | [lien](https://nscale.com) | 5 $ de crédits gratuits à l’inscription pour tester l’inférence | | `nube` | `nube` | Nube.sh | Clé API | [lien](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | Clé API | [lien](https://build.nvidia.com) | Accès gratuit pour le développement : environ 40 RPM, plus de 70 modèles (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `nvidia` | `nvidia` | NVIDIA NIM | Clé API | [lien](https://build.nvidia.com) | Accès développeur gratuit : environ 40 RPM, plus de 70 modèles (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | | `oci` | `oci` | OCI Generative AI | Clé API, entreprise | [lien](https://www.oracle.com/artificial-intelligence/generative-ai) | Utilisez votre clé API OCI Generative AI ou votre jeton Bearer IAM. L’URL de base peut être https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | Clé API, agrégateur | [lien](https://ofox.ai) | Le catalogue actuel annonce plus de 10 modèles gratuits sans quota chiffré public ; examinez la provenance en amont ainsi que les conditions de conservation et d’entraînement avant toute utilisation en production. | +| `ofoxai` | `ofoxai` | OfoxAI | Clé API, agrégateur | [lien](https://ofox.ai) | Le catalogue actuel annonce plus de 10 modèles gratuits sans quota numérique public ; vérifiez la provenance en amont ainsi que les conditions de conservation et d’entraînement avant toute utilisation en production. | | `ollama-cloud` | `ollamacloud` | Ollama Cloud | Clé API | [lien](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | Clé API | [lien](https://1min.ai) | Créez une clé API sur https://docs.1min.ai/docs/api/create-api-key, puis collez-la ici. | +| `oneminai` | `1min` | 1min.AI | Clé API | [lien](https://1min.ai) | Créez une clé API à l’adresse https://docs.1min.ai/docs/api/create-api-key, puis collez-la ici. | | `openadapter` | `oad` | OpenAdapter | Clé API | [lien](https://openadapter.dev) | Utilisez votre clé API OpenAdapter dans Authorization: Bearer sk-cv-. Entièrement compatible avec OpenAI. URL de base de l’API : https://api.openadapter.in/v1. | | `openai` | `openai` | OpenAI | Clé API | [lien](https://platform.openai.com) | — | | `opencode-go` | `opencode-go` | OpenCode Go | Clé API | [lien](https://opencode.ai/go) | — | | `opencode-zen` | `opencode-zen` | OpenCode Zen | Clé API | [lien](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | Clé API | [lien](https://openference.com) | Offre gratuite : essai de 3 jours avec des modèles open source — aucune carte bancaire requise | +| `openference-api` | `ofa` | Openference API | Clé API | [lien](https://openference.com) | Offre gratuite : inclut Qwen3.8 27b et Llama 3.2 3B — consultez openference.com/pricing pour connaître les conditions actuelles | | `openrouter` | `openrouter` | OpenRouter | Clé API, agrégateur | [lien](https://openrouter.ai) | Modèles gratuits à 0 $/jeton avec le suffixe :free — 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | Clé API | [lien](https://openvecta.com) | Crédits gratuits à l’inscription pour l’inférence compatible avec OpenAI sur des LLM, des embeddings et des modèles de raisonnement | +| `openvecta` | `openvecta` | OpenVecta | Clé API | [lien](https://openvecta.com) | Crédits gratuits à l’inscription pour l’inférence compatible avec OpenAI sur les LLM, les embeddings et les modèles de raisonnement | | `opper` | `opper` | Opper | Clé API, agrégateur | [lien](https://opper.ai) | — | | `orcarouter` | `orcarouter` | OrcaRouter | Clé API | [lien](https://www.orcarouter.ai) | — | | `ovhcloud` | `ovh` | OVHcloud AI | Clé API | [lien](https://www.ovhcloud.com) | — | @@ -290,58 +290,58 @@ Utilisez le tableau de bord à l’adresse `/dashboard/providers` pour activer, | `pioneer` | `pn` | Pioneer AI | Clé API | [lien](https://pioneer.ai) | 75 $ de crédits d’utilisation gratuits — aucune carte bancaire requise | | `plamo` | `plamo` | PLaMo | Clé API | [lien](https://plamo.preferredai.jp/api) | — | | `poe` | `poe` | Poe | Clé API, agrégateur | [lien](https://creator.poe.com/api-reference) | Clé API Bearer pour l’API Poe compatible avec OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | Clé API, agrégateur | [lien](https://poixe.com) | Les limites gratuites publiques actuelles sont faibles et propres à chaque groupe de modèles : 2 RPM/5 RPD pour les modèles large-cup et 20 RPM/50 RPD pour les modèles small-cup. | -| `pollinations` | `pol` | Pollinations AI | Clé API, vidéo | [lien](https://pollinations.ai) | L’accès anonyme/sans clé aux modèles gratuits documentés est fourni sans garantie. La vérification locale de la v3.8.50 (2026-07-31) a renvoyé une erreur 401 via OmniRoute et une erreur Cloudflare 1010 lors de tests directs du service en amont depuis le même réseau. Les modèles premium nécessitent toujours une clé API Pollinations provenant de enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | Clé API | [lien](https://poolside.ai) | Laguna S 2.1 et XS 2.1 sont gratuits pendant la phase Preview ; aucun quota chiffré public n’est publié. | -| `predibase` | `predibase` | Predibase | Clé API | [lien](https://predibase.com) | ⚠️ **OBsolète.** serving.app.predibase.com ne se résout plus (vérification du 2026-06-19) ; l’API de service gérée semble avoir été abandonnée. | +| `poixe-ai` | `poixe-ai` | Poixe AI | Clé API, agrégateur | [lien](https://poixe.com) | Les limites gratuites publiques actuelles sont faibles et spécifiques à chaque groupe de modèles : 2 RPM/5 RPD pour les modèles large-cup et 20 RPM/50 RPD pour les modèles small-cup. | +| `pollinations` | `pol` | Pollinations AI | Clé API, vidéo | [lien](https://pollinations.ai) | L’accès anonyme/sans clé aux modèles gratuits documentés est fourni sans garantie. Une vérification locale de la v3.8.50 (2026-07-31) a renvoyé une erreur 401 via OmniRoute et une erreur Cloudflare 1010 lors de tests directs du service en amont depuis le même réseau. Les modèles premium nécessitent toujours une clé API Pollinations obtenue sur enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | Clé API | [lien](https://poolside.ai) | Laguna S 2.1 et XS 2.1 sont gratuits pendant la phase Preview ; aucun quota numérique public n’est publié. | +| `predibase` | `predibase` | Predibase | Clé API | [lien](https://predibase.com) | ⚠️ **OBSOLÈTE.** serving.app.predibase.com ne se résout plus (vérification du 2026-06-19) ; l’API de service gérée semble avoir été abandonnée. | | `publicai` | `publicai` | PublicAI | Clé API | [lien](https://publicai.co) | Nécessite une clé API — crédit unique à l’inscription, puis service payant | | `qianfan` | `qianfan` | Baidu Qianfan | Clé API | [lien](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | Clé API | [lien](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | Clé API | [lien](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Clé API | [lien](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | Clé API, image | [lien](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | Clé API | [lien](https://regolo.ai) | Obtenez votre clé API Regolo sur regolo.ai, puis collez-la ici en tant que jeton Bearer. | -| `reka` | `reka` | Reka | Clé API | [lien](https://docs.reka.ai/chat/overview) | Utilisez votre clé API Reka. OmniRoute prend en charge l’URL de base compatible avec OpenAI https://api.reka.ai/v1 et envoie les en-têtes Authorization et X-Api-Key pour assurer la compatibilité. | -| `requesty` | `requesty` | Requesty | Clé API | [lien](https://requesty.ai) | Offre gratuite d’environ 200 requêtes/jour — passerelle de routage multimodèle (plus de 300 modèles) | -| `routeway` | `routeway` | Routeway | Clé API | [lien](https://routeway.ai) | Créez une clé API gratuite sur routeway.ai, puis collez-la ici en tant que jeton Bearer. | -| `runwayml` | `runway` | Runway | Clé API, vidéo | [lien](https://docs.dev.runwayml.com) | Utilisez votre clé API Runway dans Authorization: Bearer . OmniRoute cible l’API Runway actuelle à l’adresse https://api.dev.runwayml.com/v1 et envoie automatiquement l’en-tête X-Runway-Version requis. | -| `sambanova` | `samba` | SambaNova | Clé API | [lien](https://sambanova.ai) | 5 $ de crédits gratuits à l’inscription (valides 30 jours), aucune carte bancaire requise | -| `sap` | `sap` | SAP Generative AI Hub | Clé API, entreprise | [lien](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Utilisez votre jeton Bearer SAP AI Core. L’URL de base peut être la racine de votre AI_API_URL ou une deploymentUrl de Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | Clé API | [lien](https://docs.sarvam.ai) | 1 000 ₹ de crédits gratuits à l’inscription — sans expiration | -| `scaleway` | `scw` | Scaleway AI | Clé API | [lien](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 million de jetons gratuits pour les nouveaux comptes — conforme UE/RGPD (Paris), Qwen3 235B et Llama 70B | -| `sealion` | `sealion` | SEA-LION | Clé API | [lien](https://sea-lion.ai) | Connectez-vous à sea-lion.ai avec Google (sans carte ni restriction régionale), créez une clé API, puis collez-la ici. | -| `seekai` | `ska` | SeekAi | Clé API, agrégateur | [lien](https://seekai.cc) | Créez une clé API sur https://seekai.cc, puis collez-la ici en tant que jeton Bearer. | -| `segmind` | `segmind` | Segmind | Clé API, image, vidéo | [lien](https://segmind.com) | Utilisez votre clé API Segmind dans l’en-tête x-api-key. OmniRoute cible https://api.segmind.com/v1/ et renvoie directement les octets de l’image ou de la vidéo générée. | -| `sensenova` | `sensenova` | SenseNova | Clé API | [lien](https://platform.sensenova.cn) | Obtenez une clé API sur platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | Clé API | [lien](https://cloud.siliconflow.com) | 1 $ de crédits gratuits, ainsi que des modèles à 0 $ actuellement répertoriés après vérification d’identité ; la disponibilité et les limites peuvent changer | -| `snowflake` | `snowflake` | Snowflake Cortex | Clé API, entreprise | [lien](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | Clé API | [lien](https://xinghuo.xfyun.cn) | Obtenez une clé API sur console.xfyun.cn | -| `speka` | `speka` | Speka AI | Clé API, agrégateur | [lien](https://speka.me) | Offre gratuite : 1 $ d’utilisation mensuelle, 10 RPM, une clé API et un accès aux modèles ouverts ainsi qu’au terrain d’expérimentation ; aucune carte requise. | -| `stability-ai` | `stability` | Stability AI | Clé API, image | [lien](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | Clé API | [lien](https://stepfun.com) | Obtenez une clé API sur platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | Clé API | [lien](https://ai.sumopod.com) | Utilisez votre clé API SumoPod (sk-...) dans Authorization: Bearer . Entièrement compatible avec OpenAI. URL de base de l’API : https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | Clé API | [lien](https://suno.ai) | Collez le cookie de session provenant de suno.ai (authentification Clerk) | -| `synthetic` | `synthetic` | Synthetic | Clé API, agrégateur | [lien](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | Clé API, agrégateur | [lien](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | Clé API | [lien](https://hunyuan.tencent.com) | Obtenez une clé API sur console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | Clé API, agrégateur | [lien](https://theb.ai) | Clé API Bearer pour la passerelle TheB.AI compatible avec OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | Clé API | [lien](https://docs.tinyfish.ai/fetch-api) | X-API-Key provenant de agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | Clé API, vidéo | [lien](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | Clé API | [lien](https://agent-router.gaib.ai) | Utilisez votre clé API Token Kiosk dans Authorization: Bearer . Passerelle entièrement compatible avec OpenAI. URL de base de l’API : https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | Clé API, agrégateur | [lien](https://www.tokenreply.com) | Les modèles indiqués comme gratuits ont des limites quotidiennes propres à chaque modèle et campagne ; aucun quota gratuit global fixe n’est publié. | -| `tokenrouter` | `trk` | TokenRouter | Clé API | [lien](https://tokenrouter.com) | Utilisez votre clé API TokenRouter dans Authorization: Bearer . Entièrement compatible avec OpenAI. URL de base de l’API : https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | Clé API, image | [lien](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | Clé API | [lien](https://docs.opentyphoon.ai) | Clé API gratuite avec une limite de débit de 5 requêtes/s et 200 requêtes/min. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Clé API | [lien](https://uncensored.com) | Utilisez votre clé API développeur uncensored.com (uai_sk_live_...). OmniRoute l’envoie dans l’en-tête X-api-key au point de terminaison compatible avec OpenAI https://api.uncensored.com/api/v1. La clé n’expire jamais. Il s’agit de l’offre facturée à l’usage/par crédits ; le chat avec abonnement sans facturation à l’usage correspond au fournisseur distinct 'uc'. | -| `udio` | `udio` | Udio | Clé API | [lien](https://udio.com) | Collez le cookie de session de udio.com (authentification Supabase) | -| `unorouter` | `unorouter` | UnoRouter | Clé API, agrégateur | [lien](https://unorouter.ai) | Les modèles avec le suffixe :free ne débitent pas le solde ; la limite est de 1 requête/minute par modèle gratuit et par utilisateur. | +| `qiniu` | `qiniu` | Qiniu | clé API | [lien](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | clé API | [lien](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | clé API | [lien](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | clé API, image | [lien](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | clé API | [lien](https://regolo.ai) | Obtenez votre clé API Regolo sur regolo.ai, puis collez-la ici en tant que jeton Bearer. | +| `reka` | `reka` | Reka | clé API | [lien](https://docs.reka.ai/chat/overview) | Utilisez votre clé API Reka. OmniRoute prend en charge l’URL de base compatible avec OpenAI https://api.reka.ai/v1 et envoie les en-têtes Authorization et X-Api-Key à des fins de compatibilité. | +| `requesty` | `requesty` | Requesty | clé API | [lien](https://requesty.ai) | Offre gratuite d’environ 200 requêtes/jour — passerelle de routage multimodèle (plus de 300 modèles) | +| `routeway` | `routeway` | Routeway | clé API | [lien](https://routeway.ai) | Créez une clé API gratuite sur routeway.ai, puis collez-la ici en tant que jeton Bearer. | +| `runwayml` | `runway` | Runway | clé API, vidéo | [lien](https://docs.dev.runwayml.com) | Utilisez votre clé API Runway dans Authorization: Bearer . OmniRoute cible l’API Runway actuelle à l’adresse https://api.dev.runwayml.com/v1 et envoie automatiquement l’en-tête X-Runway-Version requis. | +| `sambanova` | `samba` | SambaNova | clé API | [lien](https://sambanova.ai) | 5 $ de crédits gratuits à l’inscription (valides 30 jours), aucune carte bancaire requise | +| `sap` | `sap` | SAP Generative AI Hub | clé API, entreprise | [lien](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Utilisez votre jeton Bearer SAP AI Core. L’URL de base peut être la racine de votre AI_API_URL ou une deploymentUrl de Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | clé API | [lien](https://docs.sarvam.ai) | 1 000 ₹ de crédits gratuits à l’inscription — sans expiration | +| `scaleway` | `scw` | Scaleway AI | clé API | [lien](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 million de jetons gratuits pour les nouveaux comptes — conforme aux exigences de l’UE et du RGPD (Paris), Qwen3 235B et Llama 70B | +| `sealion` | `sealion` | SEA-LION | clé API | [lien](https://sea-lion.ai) | Connectez-vous à sea-lion.ai avec Google (sans carte bancaire ni restriction régionale), créez une clé API, puis collez-la ici. | +| `seekai` | `ska` | SeekAi | clé API, agrégateur | [lien](https://seekai.cc) | Créez une clé API sur https://seekai.cc, puis collez-la ici en tant que jeton Bearer. | +| `segmind` | `segmind` | Segmind | clé API, image, vidéo | [lien](https://segmind.com) | Utilisez votre clé API Segmind dans l’en-tête x-api-key. OmniRoute cible https://api.segmind.com/v1/ et renvoie directement les octets de l’image ou de la vidéo générée. | +| `sensenova` | `sensenova` | SenseNova | clé API | [lien](https://platform.sensenova.cn) | Obtenez une clé API sur platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | clé API | [lien](https://cloud.siliconflow.com) | 1 $ de crédits gratuits, ainsi que les modèles actuellement indiqués à 0 $ après vérification de l’identité ; la disponibilité et les limites peuvent changer | +| `snowflake` | `snowflake` | Snowflake Cortex | clé API, entreprise | [lien](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | clé API | [lien](https://xinghuo.xfyun.cn) | Obtenez une clé API sur console.xfyun.cn | +| `speka` | `speka` | Speka AI | clé API, agrégateur | [lien](https://speka.me) | Offre gratuite : 1 $ d’utilisation mensuelle, 10 RPM, une clé API et un accès aux modèles ouverts et à l’environnement de test ; aucune carte bancaire requise. | +| `stability-ai` | `stability` | Stability AI | clé API, image | [lien](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | clé API | [lien](https://stepfun.com) | Obtenez une clé API sur platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | clé API | [lien](https://ai.sumopod.com) | Utilisez votre clé API SumoPod (sk-...) dans Authorization: Bearer . Entièrement compatible avec OpenAI. URL de base de l’API : https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | clé API | [lien](https://suno.ai) | Collez le cookie de session de suno.ai (authentification Clerk) | +| `synthetic` | `synthetic` | Synthetic | clé API, agrégateur | [lien](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | clé API, agrégateur | [lien](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | clé API | [lien](https://hunyuan.tencent.com) | Obtenez une clé API sur console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | clé API, agrégateur | [lien](https://theb.ai) | Clé API Bearer pour la passerelle TheB.AI compatible avec OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | clé API | [lien](https://docs.tinyfish.ai/fetch-api) | X-API-Key provenant de agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | clé API, vidéo | [lien](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | clé API | [lien](https://agent-router.gaib.ai) | Utilisez votre clé API Token Kiosk dans Authorization: Bearer . Passerelle entièrement compatible avec OpenAI. URL de base de l’API : https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | clé API, agrégateur | [lien](https://www.tokenreply.com) | Les modèles marqués comme gratuits ont des limites quotidiennes propres à chaque modèle et campagne ; aucun quota gratuit global fixe n’est publié. | +| `tokenrouter` | `trk` | TokenRouter | clé API | [lien](https://tokenrouter.com) | Utilisez votre clé API TokenRouter dans Authorization: Bearer . Entièrement compatible avec OpenAI. URL de base de l’API : https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | clé API, image | [lien](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | clé API | [lien](https://docs.opentyphoon.ai) | Clé API gratuite avec une limite de débit de 5 requêtes/s et 200 requêtes/min. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Clé API | [lien](https://uncensored.com) | Utilisez votre clé API développeur uncensored.com (uai_sk_live_...). OmniRoute l’envoie dans l’en-tête X-api-key au point de terminaison compatible avec OpenAI https://api.uncensored.com/api/v1. La clé n’expire jamais. Il s’agit de l’offre facturée à l’usage/par crédits ; le chat par abonnement sans comptage est proposé par le fournisseur distinct « uc ». | +| `udio` | `udio` | Udio | Clé API | [lien](https://udio.com) | Collez le cookie de session d’udio.com (authentification Supabase) | +| `unorouter` | `unorouter` | UnoRouter | Clé API, agrégateur | [lien](https://unorouter.ai) | Les modèles dotés du suffixe :free ne débitent pas le solde ; la limite est de 1 requête/minute par modèle gratuit et par utilisateur. | | `upstage` | `upstage` | Upstage | Clé API | [lien](https://www.upstage.ai) | — | | `v0-vercel` | `v0` | v0 (Vercel) | Clé API | [lien](https://v0.dev) | — | | `venice` | `venice` | Venice.ai | Clé API | [lien](https://venice.ai) | — | | `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Clé API, agrégateur | [lien](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | Clé API, entreprise | [lien](https://cloud.google.com/vertex-ai) | Fournissez un JSON de compte de service, un jeton d’accès OAuth, une clé API Vertex Express ou une clé d’autorisation liée à un compte de service. Le mode Express prend uniquement en charge Gemini ; les modèles partenaires nécessitent des identifiants associés à un projet. | -| `vertex-partner` | `vp` | Vertex AI Partners | Clé API, entreprise | [lien](https://cloud.google.com/vertex-ai) | Fournissez un JSON de compte de service ou des identifiants OAuth. Une clé d’autorisation liée à un compte de service permet également la découverte, mais l’inférence avec les partenaires nécessite en plus l’identifiant de son projet Google Cloud. Les clés Express standard prennent uniquement en charge Gemini. | -| `void-ai` | `void-ai` | Void AI | Clé API, agrégateur | [lien](https://voidai.app) | Le catalogue public des modèles indique que certains modèles nécessitent une offre gratuite, mais l’accès est conditionnel et aucun quota chiffré n’est confirmé. | +| `vertex` | `vertex` | Vertex AI | Clé API, entreprise | [lien](https://cloud.google.com/vertex-ai) | Fournissez le JSON du compte de service, un jeton d’accès OAuth, une clé API Vertex Express ou une clé d’autorisation liée à un compte de service. Le mode Express prend uniquement en charge Gemini ; les modèles partenaires nécessitent des identifiants limités à un projet. | +| `vertex-partner` | `vp` | Vertex AI Partners | Clé API, entreprise | [lien](https://cloud.google.com/vertex-ai) | Fournissez le JSON du compte de service ou des identifiants OAuth. Une clé d’autorisation liée à un compte de service permet également la découverte, mais l’inférence des partenaires nécessite en outre l’identifiant de son projet Google Cloud. Les clés Express standard prennent uniquement en charge Gemini. | +| `void-ai` | `void-ai` | Void AI | Clé API, agrégateur | [lien](https://voidai.app) | Le catalogue public de modèles indique que certains modèles nécessitent une offre gratuite, mais l’accès est conditionnel et aucun quota numérique n’est confirmé. | | `volcengine` | `volcengine` | Volcengine | Clé API | [lien](https://www.volcengine.com) | — | | `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Clé API | [lien](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Connectez votre compte Volcano Engine ou utilisez une clé API d’abonnement Ark Agent Plan. | | `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Clé API | [lien](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Connectez votre compte Volcano Engine ou utilisez une clé API d’abonnement Ark Coding Plan. | @@ -351,15 +351,15 @@ Utilisez le tableau de bord à l’adresse `/dashboard/providers` pour activer, | `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Clé API, entreprise | [lien](https://www.ibm.com/products/watsonx-ai) | Utilisez votre jeton Bearer watsonx. L’URL de base peut être https://.ml.cloud.ibm.com/ml/gateway/v1/ ou un point de terminaison autogéré /ml/gateway/v1. | | `writer` | `writer` | Writer | Clé API | [lien](https://dev.writer.com) | — | | `x5lab` | `x5lab` | X5Lab | Clé API | [lien](https://x5lab.dev) | Utilisez votre clé API X5Lab (x5-...) dans Authorization: Bearer . Entièrement compatible avec OpenAI. URL de base de l’API : https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | Clé API | [lien](https://x.ai) | Utilisez une clé API xAI officielle ou connectez-vous avec xAI OAuth. Les sessions JWT Grok Build restent un fournisseur distinct. | +| `xai` | `xai` | xAI (Grok) | Clé API | [lien](https://x.ai) | Utilisez une clé API xAI officielle ou connectez-vous avec xAI OAuth. Les sessions JWT Grok Build restent proposées par un fournisseur distinct. | | `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Clé API | [lien](https://mimo.mi.com) | — | | `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Clé API | [lien](https://mimo.mi.com) | — | | `xkiro` | `xkiro` | xKiro | Clé API, agrégateur | [lien](https://xkiro.com) | Créez un compte gratuit sur xkiro.com et collez la clé ici (Bearer ; x-api-key est également accepté). | | `yi` | `yi` | Yi (01.AI) | Clé API | [lien](https://01.ai) | Obtenez une clé API sur platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | Clé API, agrégateur | [lien](https://yolo-auto.com) | L’accès gratuit à l’API est limité en nombre de requêtes et destiné aux tests ; aucun quota quotidien chiffré n’est publié et la pérennité de l’accès gratuit n’est pas garantie. | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | Clé API, agrégateur | [lien](https://yolo-auto.com) | L’accès gratuit à l’API est limité en nombre de requêtes et destiné aux tests ; aucun quota quotidien numérique n’est publié et la pérennité de l’accès gratuit n’est pas garantie. | | `zai` | `zai` | Z.AI | Clé API | [lien](https://open.bigmodel.cn) | — | | `zenmux` | `zm` | ZenMux | Clé API | [lien](https://zenmux.ai) | Utilisez votre clé API ZenMux dans Authorization: Bearer . ZenMux est entièrement compatible avec OpenAI. URL de base : https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Clé API, agrégateur | [lien](https://www.zerolimitai.com) | Un essai gratuit temporaire est annoncé, mais les pages officielles se contredisent, indiquant 3 ou 7 jours ; la limite annoncée de 100 appels/jour n’est pas considérée comme permanente. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Clé API, agrégateur | [lien](https://www.zerolimitai.com) | Un essai gratuit temporaire est annoncé, mais les pages officielles se contredisent entre 3 et 7 jours ; l’affirmation de 100 appels/jour n’est pas considérée comme permanente. | | `zylo-api` | `zylo` | Zylo API | Clé API, agrégateur | [lien](https://zyloai.net) | Offre Basic : 10 RPM, 7 200 requêtes/jour et 200 000 jetons/jour ; limitée aux modèles de texte Basic. | ## Fournisseurs locaux (14) diff --git a/docs/i18n/fr/docs/routing/REASONING_REPLAY.md b/docs/i18n/fr/docs/routing/REASONING_REPLAY.md index 4d38f7cb340b..b793a7a10bae 100644 --- a/docs/i18n/fr/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/fr/docs/routing/REASONING_REPLAY.md @@ -25,19 +25,21 @@ Cependant, les clients habituels (Cursor, Cline, Roo Code, OpenAI SDK) supprimen Tour N (génération par l’assistant) : → la réponse contient reasoning_content + tool_calls → si requiresReasoningReplay(provider, model) : cacheReasoningFromAssistantMessage() - écrit (mémoire + BDD), avec chaque tool_call.id comme clé + écrit (mémoire + DB), avec chaque tool_call.id comme clé → transmet la réponse au client (qui peut conserver ou non le raisonnement) Tour N+1 (le client envoie une requête de suivi) : → le traducteur détecte : requiresReasoningReplay(provider, model) === true → pour chaque message de l’assistant avec tool_calls et sans reasoning_content : - lookupReasoning(toolCalls[0].id) → mémoire → BDD + lookupReasoning(toolCalls[0].id) → mémoire → DB succès → msg.reasoning_content = cached; recordReplay() échec → msg.reasoning_content = "" (solution de repli historique pour les anciennes versions de DeepSeek) - → le fournisseur en amont reçoit un historique cohérent → aucune erreur 400 + → le service en amont reçoit un historique cohérent → aucune erreur 400 ``` -La capture s’effectue dans `open-sse/handlers/chatCore.ts` (à deux emplacements, correspondant aux deux sites d’appel de `cacheReasoningFromAssistantMessage`). La réinjection s’effectue dans `open-sse/translator/index.ts` après la coercition du schéma, mais avant l’envoi. +La capture s’effectue dans `open-sse/handlers/chatCore.ts` (à deux endroits, aux deux sites d’appel de `cacheReasoningFromAssistantMessage`). La réinjection s’effectue dans `open-sse/translator/index.ts`, après la coercition du schéma, mais avant la répartition. + +Les tours de l’assistant ordinaires (sans appel d’outil) utilisent un autre type de clé : `buildAssistantMessageCacheKey()` calcule l’empreinte du périmètre de la session ainsi que de la transcription normalisée au format OpenAI jusqu’à ce tour, car DeepSeek exige le raisonnement de _chaque_ tour précédent dès que `tools` est présent. Pour les cibles de l’API Responses (par exemple `opencode-go/deepseek-v4-flash`, acheminé vers `/responses`), le corps de la requête en amont contient `input`, et non `messages`. Ainsi, `translateRequest()` (`open-sse/translator/index.ts`) transmet, via une option de rappel, la transcription pivot dont il a calculé l’empreinte, et les sites de capture calculent l’empreinte de cette même transcription. La passe de réinjection Responses s’exécute sur le pivot OpenAI pour chaque format source, de sorte que les clients Anthropic Messages (Claude → OpenAI → Responses) bénéficient eux aussi de la réinjection. ## Stockage — Mémoire hybride + SQLite diff --git a/docs/i18n/fr/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/fr/docs/security/SOCKET_DEV_FINDINGS.md index c89ee1b09945..b1a288de1bf8 100644 --- a/docs/i18n/fr/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/fr/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,22 @@ --- -Ce document constitue l'attestation rédigée par le mainteneur concernant les six -signalements `AI-detected potential malware` émis à l'encontre de `omniroute@3.8.5` et -les mesures d'atténuation appliquées dans `omniroute@3.8.6`. Il existe afin que : +> **Remarque sur la portée :** `socket.yml` configure l’analyse post-publication, côté registre, de l’artefact npm par Socket.dev (chemins ignorés pour le contenu non distribué, tel que `tests/`, `docs/` et les rapports de build). Il ne met pas en place de contrôle bloquant la fusion dans la CI/les PR — aucun workflow dans `.github/workflows`, aucun script `package.json` et aucune cible `Makefile` n’invoque Socket.dev. -1. Les opérateurs des pipelines de sécurité disposent d'une référence unique à citer lorsqu'ils doivent - évaluer les signalements par rapport au code source réel. -2. Les futurs scanners d'IA puissent détecter la déclaration signée par le mainteneur indiquant que chaque +Ce document constitue l’attestation rédigée par le mainteneur concernant les six +signalements de `logiciel malveillant potentiel détecté par l’IA` émis à l’encontre de `omniroute@3.8.5` et +les mesures d’atténuation appliquées dans `omniroute@3.8.6`. Il existe afin que : + +1. Les opérateurs du pipeline de sécurité disposent d’une référence unique à citer lorsqu’ils doivent + évaluer les signalements au regard du code source réel. +2. Les futurs analyseurs basés sur l’IA puissent prendre en compte la déclaration signée par le mainteneur selon laquelle chaque chemin signalé est intentionnel, facultatif et documenté. -3. Nous disposions d'une trace écrite expliquant _pourquoi_ chaque site d'appel est structuré de cette manière — - afin qu'une future refactorisation ne réintroduise pas accidentellement une signature qui +3. Nous disposions d’une trace écrite expliquant _pourquoi_ chaque site d’appel est structuré de cette manière — + afin qu’une future refactorisation ne réintroduise pas accidentellement une signature qui avait été délibérément supprimée. -Si vous exploitez un scanner qui signale de nouveau l'un des sites d'appel ci-dessous après le -déploiement des mesures d'atténuation de la v3.8.6, veuillez ouvrir un ticket en joignant la trace d'analyse et +Si vous exploitez un analyseur qui signale à nouveau l’un des sites d’appel ci-dessous après le +déploiement des mesures d’atténuation de la v3.8.6, veuillez ouvrir un ticket en joignant la trace de l’analyse et nous compléterons cette attestation ici. --- diff --git a/docs/i18n/ga/README.md b/docs/i18n/ga/README.md index e9cd72461488..2baf925445e9 100644 --- a/docs/i18n/ga/README.md +++ b/docs/i18n/ga/README.md @@ -19,17 +19,17 @@
-## 💰 ~1.62B Tóiceán Saor in Aisce / Mí +## 💰 ~1.62B Comhartha Saor in Aisce / Mí
-> Is crá croí é sraitheanna saor in aisce a chruachadh de láimh — na dosaenacha SDKanna, na dosaenacha teorainneacha ráta, agus gan tuairim ar bith agat cé mhéad atá agat i ndáiríre. Déanann OmniRoute catalógú ar **491 iontráil sa tsraith saor in aisce thar 35 eochair chomhthiomsaithe athfhillteacha** agus ríomhann sé ceannlíne na dtóiceán ó na **17 gcomhthiomsú a bhfuil buiséad míosúil dearfach foilsithe acu móide cúig theorainn Groq de réir samhla**, agus comhthiomsuithe comhroinnte á ndí-dhúbláil. Taispeántar ar leithligh cuótaí nach n-osclaítear ach tar éis seiceáil aitheantais réigiúnaigh (inniu: ModelScope), +~6M taobh thiar d'fhíorú aitheantais réigiúnaigh, agus ní chuirtear iad le suim na ceannlíne riamh. Fanann an toradh infheicthe ar an deais (`/dashboard/free-tiers`). +> Is cráite é sraitheanna saor in aisce a chruachadh de láimh — na dosaenacha SDKanna, na dosaenacha teorainneacha ráta, agus gan aon tuairim agat cé mhéad atá agat i ndáiríre. Déanann OmniRoute catalógú ar **489 iontráil sraithe saor in aisce thar 35 eochair chomhthiomsaithe athfhillteacha** agus ríomhann sé líon ceannlíne na gcomharthaí ó na **17 gcomhthiomsú a bhfuil buiséad míosúil dearfach foilsithe acu, chomh maith le cúig uasteorainn Groq in aghaidh na samhla**, agus comhthiomsuithe comhroinnte á ndídhúbláil. Taispeántar ar leithligh cuótaí nach n-osclaítear ach tar éis seiceáil aitheantais réigiúnaigh (faoi láthair: ModelScope), +~6M taobh thiar de fhíorú aitheantais réigiúnaigh, agus ní chuirtear iad leis an gceannlíne riamh. Fanann an toradh le feiceáil ar an deais (`/dashboard/free-tiers`). -Cárta buiséid na sraithe saor in aisce de chuid OmniRoute: ~1.62B tóiceán saor in aisce in aghaidh na míosa go seasta, suas le ~2.22B sa chéad mhí le creidmheasanna clárúcháin, ó 35 eochair chomhthiomsaithe athfhillteacha dhoiciméadaithe a chlúdaíonn 491 iontráil chatalógaithe sa tsraith saor in aisce taobh thiar d'aon chríochphointe amháin. Matamaitic ionraic agus comhthiomsuithe dí-dhúbláilte — ní chomhairtear gach comhthiomsú comhroinnte ach uair amháin, lena n-áirítear 17 gcomhthiomsú athfhillteacha a bhfuil buiséad míosúil dearfach foilsithe acu móide cúig theorainn Groq de réir samhla; tá 13 sholáthraí marcáilte le seachaint i gcatalóg riosca na dtéarmaí ionas gur tusa a dhéanfaidh an cinneadh. Áirítear sa bharra buiséid Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (cúig theorainn de réir samhla) agus comhthiomsuithe níos lú, chomh maith le creidmheasanna clárúcháin don chéad mhí agus soláthraithe atá saor in aisce go buan gan teorainn tóiceán, arna dtaispeáint ar leithligh ionas nach méadaíonn siad an phríomhfhigiúr riamh. Úsáidte/fágtha beo ar /dashboard/free-tiers. +Cárta buiséid sraithe saor in aisce OmniRoute: ~1.62B comhartha saor in aisce in aghaidh na míosa go seasmhach, suas le ~2.22B sa chéad mhí le creidmheasanna clárúcháin, ó 35 eochair chomhthiomsaithe athfhillteacha dhoiciméadaithe a chlúdaíonn 489 iontráil chatalógaithe sa tsraith saor in aisce taobh thiar d'aon chríochphointe amháin. Matamaitic ionraic dhídhúbláilte de réir comhthiomsaithe — ní chomhairtear gach comhthiomsú comhroinnte ach uair amháin, lena n-áirítear 17 gcomhthiomsú athfhillteacha a bhfuil buiséad míosúil dearfach foilsithe comharthaí acu, chomh maith le cúig uasteorainn Groq in aghaidh na samhla; tá 13 sholáthraí marcáilte mar sholáthraithe le seachaint i gcatalóg riosca na dtéarmaí, ionas gur tusa a dhéanfaidh an cinneadh. Áirítear sa bharra buiséid Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (cúig uasteorainn in aghaidh na samhla) agus comhthiomsuithe níos lú, chomh maith le creidmheasanna clárúcháin don chéad mhí agus soláthraithe buansaora gan uasteorainn comharthaí a léirítear ar leithligh ionas nach ndéanfaidh siad líon an cheannlíne a mhéadú go saorga choíche. Úsáidte/fágtha beo ar /dashboard/free-tiers. -> Achoimre bheoite ar an leathanach beo `/dashboard/free-tiers`. Modheolaíocht iomlán (dí-dhúbláil comhthiomsuithe, sraitheanna creidmheasa, téarmaí soláthraithe): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Achoimre bheoite ar an leathanach beo `/dashboard/free-tiers`. Modheolaíocht iomlán (dídhúbláil comhthiomsuithe, sraitheanna creidmheasa, téarmaí soláthraithe): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Déantar athiniúchadh ar na figiúirí seo gach coicís in aghaidh na catalóige beo agus **bogann siad sa dá threo** — má chuireann soláthraí deireadh le sraith saor in aisce, laghdaíonn an uimhir; má chuirtear ceann nua leis, méadaíonn sí. Foilsímid an méid a ríomhann an chatalóg i ndáiríre, agus ní cás is fearr arna shlánú suas riamh. +> Déantar athiniúchadh ar na figiúirí seo gach coicís i gcomparáid leis an gcatalóg bheo agus **bogann siad sa dá threo** — má chuireann soláthraí deireadh le sraith saor in aisce, titeann an uimhir; má chuirtear ceann nua leis, ardaíonn sí. Foilsímid an méid a ríomhann an chatalóg i ndáiríre, agus ní foilsímid cás is fearr arna shlánú suas riamh.
@@ -37,13 +37,13 @@

-⭐ Cuir réalta leis an stór má chabhraigh OMNIROUTE leat airgead a shábháil agus do chuid oibre a dhéanamh níos éasca. +⭐ Cuir réalta leis an stór má chuidigh OMNIROUTE leat airgead a shábháil agus do chuid oibre a dhéanamh níos éasca.

[![Réaltaí](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) diegosouzapw%2FOmniRoute | Trendshift -[![Rang Stair na Réaltaí](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) +[![Rangú Stair na Réaltaí](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) [![olud.ai](https://olud.ai/badge.php?tool=diegosouzapw-omniroute)](https://olud.ai/project/diegosouzapw-omniroute.html) ### 💬 Glac páirt sa phobal @@ -56,10 +56,10 @@ [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) [![WhatsApp Domhanda](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) -[![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) +[![WhatsApp an Bhrasaíl](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Suíomh Gréasáin](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Ceisteanna, leideanna faoi sholáthraithe, treochlár agus tacaíocht → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Domhanda](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Tairseach](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Ceisteanna, leideanna faoi sholáthraithe, treochlár agus tacaíocht → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Domhanda](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 An Bhrasaíl](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Tairseach](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -598,9 +598,9 @@ faoin gcatalóg reatha ag **[radar.omniroute.online/planos](https://radar.omniro
-## 🤖 CLInna & Gníomhairí Códála Comhoiriúnacha +## 🤖 CLIanna & Gníomhairí Códúcháin Comhoiriúnacha -> Aon chumraíocht amháin — `http://localhost:20128/v1` — agus ritheann **gach** IDE AI nó CLI ar mhúnlaí saor in aisce agus ar chostas íseal. +> Cumraíocht amháin — `http://localhost:20128/v1` — agus ritheann **gach** IDE nó CLI IS ar shamhlacha saor in aisce agus ar chostas íseal.
@@ -634,23 +634,23 @@ faoin gcatalóg reatha ag **[radar.omniroute.online/planos](https://radar.omniro - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ oibríonn sé freisin le · Kiro · Command Code · Antigravity · Windsurf · AMP · aon uirlis atá comhoiriúnach le OpenAI ++ oibríonn sé freisin le · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · aon uirlis atá comhoiriúnach le OpenAI
-📖 Socrú in aghaidh na huirlise do na 36 uirlis go léir (26 CLI Code's + 10 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Breiseán OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Socrú de réir uirlise do na 36 uirlis ar fad (26 CLI Code + 10 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Breiseán OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Seol aon CLI tacaithe trí OmniRoute le hordú amháin** — gan aon chomhaid chumraíochta a scríobh, -dintiúir á instealladh in aghaidh an phróisis, faigheann Qwen/Gemini baile scoite sealadach: +**Seol aon CLI a dtacaítear leis trí OmniRoute le hordú amháin** — ní scríobhtar aon chomhad cumraíochta, +instealltar dintiúir de réir próisis, agus faigheann Qwen/Gemini eolaire baile scoite sealadach: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -662,12 +662,12 @@ omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" # Nó roghnaigh soláthraí+múnla go hidirghníomhach agus scríobh cumraíocht na huirlise féin: -omniroute configure codex # freisin: claude opencode qwen aider goose gemini cline continue kilo +omniroute configure codex # chomh maith: claude opencode qwen aider goose gemini cline continue kilo ``` -Tugann gach ordú ómós do chomhthéacs cianda gníomhach (`omniroute connect `), réamhamharcann `--dry-run` -ar na env/args beacht gan iad a fhorghníomhú, agus coinníonn `--api-key-env NAME` rúin amach -as do stair scaoill. → [Comhtháthú CLI](docs/guides/CLI-INTEGRATIONS.md) +Cloíonn gach ordú leis an gcomhthéacs cianda gníomhach (`omniroute connect `), tugann `--dry-run` +réamhamharc ar na hathróga timpeallachta/argóintí beachta gan iad a rith, agus coimeádann `--api-key-env NAME` rúin amach +as stair do bhlaoisce. → [Comhtháthuithe CLI](docs/guides/CLI-INTEGRATIONS.md)
@@ -677,7 +677,7 @@ as do stair scaoill. → [Comhtháthú CLI](docs/guides/CLI-INTEGRATIONS.md) -> **357 soláthraí cláraithe** ar fud na mbailiúchán canónach comhrá, meán, cuardaigh, áitiúil, gníomhaire néil agus córais, lena n-áirítear **152 a bhfuil meiteashonraí aimsithe `hasFree: true` acu**. Clúdaíonn clárlann na samhlacha comhrá **229 soláthraí / 2,554 péire leithleacha soláthraí-samhail / 1,283 aitheantas amhshamhla**; tá **491 ró in aghaidh na samhla**, **35 linn athfhillteacha** agus **54 soláthraí saor in aisce go deo, athfhillteacha/gan eochair** sa chatalóg ar leith de bhuiséid saor in aisce. Is ainmneoirí éagsúla iad seo de réir dearaidh; tá na sainmhínithe agus na ríomhanna dí-dhúbláilte de réir linne sa [Tagairt Soláthraithe](docs/reference/PROVIDER_REFERENCE.md) agus sna [Sraitheanna Saor in Aisce](docs/reference/FREE_TIERS.md). +> **357 soláthraí cláraithe** ar fud na mbailiúchán canónach comhrá, meán, cuardaigh, áitiúil, gníomhairí néil agus córais, lena n-áirítear **152 a bhfuil meiteashonraí aimsithe `hasFree: true` acu**. Cuimsíonn clárlann na samhlacha comhrá **229 soláthraí / 2,554 péire ar leith soláthraí-samhla / 1,283 aitheantas samhla amh**; tá **491 ró in aghaidh na samhla**, **35 linn athfhillteacha** agus **54 soláthraí athfhillteacha/gan eochair atá saor in aisce go deo** sa chatalóg ar leith de bhuiséid in aisce. Is ainmneoirí éagsúla iad seo de réir dearaidh; tá na sainmhínithe agus na ríomhanna dí-dhúbláilte de réir linne sa [Tagairt Soláthraithe](docs/reference/PROVIDER_REFERENCE.md) agus sna [Sraitheanna Saor in Aisce](docs/reference/FREE_TIERS.md).
@@ -710,11 +710,11 @@ as do stair scaoill. → [Comhtháthú CLI](docs/guides/CLI-INTEGRATIONS.md) -…agus 330+ eile — réitítear gach deilbhín beo ó chatalóg soláthraithe an deais. 📖 [Tagairt Soláthraithe](docs/reference/PROVIDER_REFERENCE.md) +…agus 330+ eile — réitítear gach íocón beo ó chatalóg soláthraithe an deais. 📖 [Tagairt Soláthraithe](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Saor in Aisce go Deo — $0, gan chárta +### 🆓 Saor in Aisce go Deo — $0, gan chárta creidmheasa @@ -730,7 +730,7 @@ as do stair scaoill. → [Comhtháthú CLI](docs/guides/CLI-INTEGRATIONS.md) - +
Pollinations
Pollinations
GPT, Llama, Claude
Níl eochair de dhíth
Cloudflare AI
Cloudflare AI
50+ samhail
10K néarón/lá
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM saor in aisce
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M comhartha/lá
Openference
Openference
Qwen3.8 27B, Llama 3.2
Sraith saor in aisce
OpenRouter
OpenRouter
Samhlacha :free
+$10 → RPM níos airde
@@ -1234,20 +1234,20 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a - + - - - + + + - - - + + + - +
SraithTeicneolaíocht
Timpeallacht riteNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
TeangaTypeScript 6.0 — 100% TypeScript ar fud src/ agus open-sse/ (gan aon any sa chroílár ó v2.0 i leith)
TeangaTypeScript 6.0 — 100% TypeScript ar fud src/ agus open-sse/ (gan aon any sa chroílár ó v2.0)
CreatNext.js 16 + React 19 + Tailwind CSS 4
Bunachar sonraíbetter-sqlite3 (SQLite, dialannú WAL) + LowDB (oidhreacht JSON) — 122 modúl fearainn, 176 imirce
CuimhneTéacs iomlán SQLite FTS5 + leabuithe veicteora cainníochtaithe go int8, meath clóscríofa
ScéimeannaZod 4 — bailíochtú I/O d'uirlisí MCP + conarthaí API
Bunachar sonraíbetter-sqlite3 (SQLite, iriseoireacht WAL) + LowDB (oidhreacht JSON) — 122 modúl fearainn, 178 aistriú
CuimhneLántéacs SQLite FTS5 + leabuithe veicteora cainníochtaithe go int8, meath clóscríofa
ScéimeannaZod 4 — bailíochtú I/O uirlisí MCP + conarthaí API
PrótacailMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
SruthúServer-Sent Events (SSE) + droichead WebSocket (/v1/ws)
ComhbhrúPíblíne 12 inneall — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Fíordheimhniú & slándáilOAuth 2.0 (PKCE) + JWT + Eochracha API + fíordheimhniú MCP de réir raoin · AES-256-GCM agus sonraí ar fos · DOMPurify
Ceiltwreq-js — pearsanú méarloirg JA3 / JA4 TLS, seachfhreastalaí 3 leibhéal
AthléimneachtScoradán ciorcaid, cúlú easpónantúil, cosaint ar ró-ualach comhuaineach, féinleighis uathoibríoch teaglamaí
Fíordheimhniú & slándáilOAuth 2.0 (PKCE) + JWT + Eochracha API + fíordheimhniú MCP de réir raoin · AES-256-GCM ar fos · DOMPurify
Ceiltwreq-js — aithris méarloirg TLS JA3 / JA4, seachfhreastalaí 3 leibhéal
AthléimneachtScoradán ciorcaid, cúlú easpónantúil, cosaint ar thréad toirní, féinleigheas teaglama uathoibríoch
Logáilpino — logaí struchtúrtha JSON le comhthéacs iarratais
TástáilReathaí tástála Node.js + Vitest — 39,000+ dearbhú tástála statach thar 5,100+ comhad tástála rianaithe (aonadach, comhtháthaithe, E2E, slándála, éiceachórais)
ArdáinDeasc (Electron) · Android (Termux) · PWA (aon bhrabhsálaí)
ArdáinDeasc (Electron) · Android (Termux) · PWA (brabhsálaí ar bith)
CI/CDGitHub Actions — foilsiú uathoibríoch chuig npm + Docker Hub tráth eisiúna
NaiscSuíomh Gréasáin · npm · Docker Hub
@@ -1256,30 +1256,30 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a
-## 📖 Doiciméadacht +## 📖 Doiciméadúchán
-### 📘 Ag Tosú +### 📘 Tús Maith - + - + - - + +
DoiciméadCur Síos
DoiciméadCur síos
Treoir ÚsáideoraSoláthraithe, teaglamaí, comhtháthú CLI, imscaradh
Treoir ShocraitheModhanna iomlána suiteála, cumraíochtaí uirlisí CLI, socrú prótacail, mionchoigeartú teorainneacha ama
Treoir SocraitheModhanna iomlána suiteála, cumraíochtaí uirlisí CLI, socrú prótacail, mionchoigeartú teorainneacha ama
Treoir Uirlisí CLISocrú de réir uirlise do Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Mód CiandaRialaigh OmniRoute cianda (VPS) ó CLI do ríomhaire glúine trí chomharthaí rochtana scóipithe
Cumraíocht Claude CodeCeangail Claude Code le OmniRoute (áitiúil/cianda) le launch + próifílí de réir samhla
Mód CiandaRialaigh OmniRoute cianda (VPS) ó CLI do ríomhaire glúine trí chomharthaí rochtana a bhfuil raon feidhme acu
Cumraíocht Claude CodeTreoraigh Claude Code chuig OmniRoute (áitiúil/cianda) le launch + próifílí de réir samhla
Tús TapaSuiteáil 3 chéim → ceangail → cumraigh
### 🔧 Oibríochtaí & Imscaradh - + - + @@ -1289,44 +1289,44 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a ### 🧠 Gnéithe & Ailtireacht
DoiciméadCur Síos
DoiciméadCur síos
Treoir DockerRith Docker, próifílí Compose, Caddy HTTPS, tolláin, clibeanna íomhá
Treoir PodmanComhtháthú Quadlet systemd, podman-compose, SELinux
Imscaradh VMTreoir iomlán: socrú VM + nginx + Cloudflare
Imscaradh Fly.ioImscar ar Fly.io le stóras seasmhach
Imscaradh Fly.ioImscar chuig Fly.io le stóras marthanach
Treoir TermuxRith OmniRoute ar Android trí Termux
Treoir PWASuiteáil Aip Ghréasáin Fhorásach, taisceadh, ailtireacht
Treoir DíshuiteálaBaint ghlan do gach modh suiteála
- - - - - + + + + + - - - + + + - - - + + +
DoiciméadCur Síos
AiltireachtAiltireacht an chórais, sreabhadh sonraí, agus oibriú inmheánach
Treoir ChomhbhrúitePíblíne 7 rogha: múchta / éadrom / caighdeánach / ionsaitheach / ultra / RTK / cruachta
Comhbhrú RTKComhbhrú aschuir ordaithe, scagairí, iontaoibh, fíorú, aisghabháil aschuir amh
Innill ChomhbhrúiteCaveman, RTK, píblínte cruachta, comhéadain deaise/API/MCP
DoiciméadCur síos
AiltireachtAiltireacht an chórais, sreabhadh sonraí agus feidhmiú inmheánach
Treoir ComhbhrúitePíblíne 7 rogha: as / éadrom / caighdeánach / ionsaitheach / ultra / RTK / cruachta
Comhbhrú RTKComhbhrú aschuir orduithe, scagairí, iontaoibh, fíorú, aisghabháil amh-aschuir
Innill ChomhbhrúiteCaveman, RTK, píblínte cruachta, comhéadain deais/API/MCP
Formáid Rialacha ComhbhrúiteScéimeanna pacáistí rialacha JSON do scagairí Caveman agus RTK
Pacáistí Teanga ComhbhrúiteBrath teanga agus cumadh pacáistí rialacha Caveman
Treoir AthléimneachtaScoradáin chiorcaid, tréimhsí fuaraithe, scuaine, cosaint ar thoirneach chomhuaineach, pearsanú TLS
Inneall Teaglama UathoibríochScóráil 16 fhachtóir, pacáistí móid, féinchneasú
Pacáistí Teanga ComhbhrúiteBrath teanga agus údarú pacáistí rialacha Caveman
Treoir AthléimneachtaScoradáin chiorcaid, tréimhsí fuaraithe, ciú, cosaint ar thréad reatha, bréagú TLS
Inneall Auto-ComboScóráil 16 fhachtóir, pacáistí móid, féinleigheas
Treoir SheachfhreastalaíCóras seachfhreastalaí 3 leibhéal, margadh 1proxy, CRUD clárlainne
Sraitheanna Saor in AisceEolaire comhdhlúite: 35 linn athfhillteacha doiciméadaithe / 491 iontráil sraithe saor in aisce catalógaithe
Gailearaí GnéitheTuras amhairc den deais le gabhálacha scáileáin
Doiciméadacht an Bhunachair ChóidSiúlóid tríd an mbunachar cód atá oiriúnach do thosaitheoirí
Sraitheanna Saor in AisceEolaire comhdhlúite: 35 linn athfhillteacha doiciméadaithe / 489 iontráil sraithe saor in aisce catalógaithe
Gailearaí GnéitheTuras físiúil ar an deais le gabhálacha scáileáin
Doiciméadúchán an Bhunachair ChóidSiúlóid tríd an mbunachar cód atá oiriúnach do thosaitheoirí
### 🤖 Prótacail & APIanna - + - + - +
DoiciméadCur Síos
DoiciméadCur síos
Tagairt APIGach críochphointe le samplaí
Sonraíocht OpenAPISonraíocht OpenAPI 3.0
Freastalaí MCP110 uirlis MCP, cumraíochtaí IDE, cliaint Python/TS/Go
Treoir Freastalaí MCPSuiteáil MCP, iompar, agus tagairt uirlisí
Treoir Freastalaí MCPSuiteáil MCP, iompróirí agus tagairt uirlisí
Freastalaí A2APrótacal JSON-RPC 2.0, scileanna, sruthú, bainistiú tascanna
Treoir Freastalaí A2ACárta gníomhaire A2A, tascanna, scileanna, agus sruthú
Treoir Freastalaí A2ACárta gníomhaire A2A, tascanna, scileanna agus sruthú
### 📋 Tionscadal & Cáilíocht - + - + - +
DoiciméadCur síos
CáipéisCur síos
RannchuidiúSocrú agus treoirlínte forbartha
Samhail Brainseála & EisiúnaNa brainsí a ndírítear PRanna orthu (release/*), agus an bhrí atá le main agus le clibeanna
Samhail Bhrainseála & EisiúnaNa spriocanna a bhíonn ag PRanna (release/*), agus brí main agus clibeanna
Loga AthruitheStair iomlán na n-eisiúintí de réir leagain
Beartas SlándálaTuairisciú leochaileachtaí agus cleachtais slándála
Treoir i18nTacaíocht do 42 teanga, sreabhadh oibre aistriúcháin, RTL
Seicliosta EisiúnaCéimeanna bailíochtaithe réamheisiúna
Plean CumhdaighStraitéis cumhdaigh tástálacha do 39,000+ dearbhú tástála statach thar 5,100+ comhad tástála a rianaítear
Plean CumhdaighStraitéis cumhdaigh tástálacha do 39,000+ dearbhú statach tástála thar 5,100+ comhad tástála rianaithe

@@ -1335,7 +1335,7 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a # ⭐ Na Rannchuiditheoirí is Fearr -> Tá OmniRoute á mhúnlú ag pobal paiseanta foinse oscailte. Tá rannchuidithe eisceachtúla déanta ag na daoine seo a bhfuil tionchar díreach acu ar cháilíocht, ar chobhsaíocht agus ar raon an tionscadail. **Go raibh maith agaibh.** +> Tá OmniRoute múnlaithe ag pobal foinse oscailte díograiseach. Tá rannchuidithe eisceachtúla déanta ag na daoine seo a mbíonn tionchar díreach acu ar cháilíocht, cobhsaíocht agus fairsinge an tionscadail. **Go raibh maith agaibh.** ### Rannchuiditheoirí seachtracha de réir iarrataí tarraingthe cumaiscthe @@ -1364,9 +1364,9 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a 20Prudhvivuda246,312 -Reoite ag barr beo release/v3.8.50, dafb4ae808, le cumaisc suas go dtí 2026-08-24 05:26:03 UTC. Tá 5,911 PR cumaiscthe i ndaonáireamh leathanachaithe GitHub GraphQL: 2,707 ag úinéir na stórtha, 179 ag Dependabot, agus 3,025 PR sheachtracha ó 535 rannchuiditheoir ar leith. Is ionann “Línte athraithe” agus suimiú + scriosadh GitHub agus áirítear leis comhaid ghinte, comhaid ghlais, catalóga, aistriúcháin agus doiciméadacht; is tomhas athraithe é, ní LOC údaraithe. Coinnítear comhscóir ag an tairseach. +Reoite ag barr beo release/v3.8.50 dafb4ae808, le cumaisc go dtí 2026-08-24 05:26:03 UTC. Tá 5,911 PR cumaiscthe i ndaonáireamh leathanachaithe GitHub GraphQL: 2,707 ó úinéir na stórtha, 179 ó Dependabot, agus 3,025 PR seachtrach ó 535 rannchuiditheoir ar leith. Is ionann “Línte athraithe” agus suimiú + scriosadh GitHub agus áirítear ann comhaid ghinte, comhaid ghlais, catalóga, aistriúcháin agus doiciméadacht; is méid athraithe é, ní LOC a scríobhadh. Coinnítear comhscóir ag an tairseach. -### Tiomantais arna sannadh ag GitHub +### Tiomantais arna gcur i leith GitHub @@ -1375,42 +1375,42 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a backryun
backryun
- 🥇 220 tiomantas atá curtha i leith GitHub + 🥇 220 tiomantas arna sannadh ag GitHub @@ -1419,42 +1419,42 @@ Métrics canónacha ar 2026-08-24: **1,029 físeán uathúil** · **11,132,922 a Dizzle
Dizzle
- 🏅 69 tiomantas atá curtha i leith GitHub · ar comhchéim ag #6 + 🏅 69 tiomantas arna sannadh ag GitHub · cothrom sa 6ú háit
Paijo
Paijo

- 🥈 219 tiomantas atá curtha i leith GitHub + 🥈 219 tiomantas arna sannadh ag GitHub
Randi
Randi

- 🥉 108 tiomantas atá curtha i leith GitHub + 🥉 108 tiomantas arna sannadh ag GitHub
Ravi Tharuma
Ravi Tharuma

- 🏅 81 tiomantas atá curtha i leith GitHub + 🏅 81 tiomantas arna sannadh ag GitHub
Chris
Chris

- 🏅 70 tiomantas atá curtha i leith GitHub + 🏅 70 tiomantas arna sannadh ag GitHub
Markus Hartung
Markus Hartung

- 🏅 69 tiomantas atá curtha i leith GitHub · ar comhchéim ag #6 + 🏅 69 tiomantas arna sannadh ag GitHub · cothrom sa 6ú háit
Jan Leon
Jan Leon

- 🏅 64 tiomantas atá curtha i leith GitHub + 🏅 64 tiomantas arna sannadh ag GitHub
zenobit
zenobit

- 🏅 62 tiomantas atá curtha i leith GitHub + 🏅 62 tiomantas arna sannadh ag GitHub
Bob.Hou
Bob.Hou

- 🏅 51 tiomantas atá curtha i leith GitHub · ar comhchéim ag #10 + 🏅 51 tiomantas arna sannadh ag GitHub · cothrom sa 10ú háit
Xiangzhe
Xiangzhe

- 🏅 51 tiomantas atá curtha i leith GitHub · ar comhchéim ag #10 + 🏅 51 tiomantas arna sannadh ag GitHub · cothrom sa 10ú háit
-Athsheiceáilte ag 2026-08-24 06:14:31 UTC: tiomantais atá curtha i leith GitHub arna dtuairisciú ag API Rannpháirtithe na stórtha don bhrainse réamhshocraithe release/v3.8.50. D’fhill an API 525 aitheantas (415 úsáideoir, 2 róbat, 108 gan ainm); fágtar an cothabhálaí, róbait agus aitheantais gan ainm as an tábla seo agus coinnítear comhchéimeanna an chomórtais ann. Tá sé éagsúil leis an rangú PRanna cumaiscthe thuas agus le daonáireamh meiteashonraí Git de 639 duine thíos araon. +Athsheiceáilte ag 2026-08-24 06:14:31 UTC: tiomantais arna sannadh ag GitHub a thuairiscigh API Rannpháirtithe na stórtha don bhrainse réamhshocraithe release/v3.8.50. D'fhill an API 525 aitheantas (415 úsáideoir, 2 róbat, 108 gan ainm); fágtar an cothaitheoir, na róbait agus na haitheantais gan ainm as an tábla seo agus coinnítear comhscóir an chomórtais ann. Tá sé éagsúil ón rangú PRanna cumaiscthe thuas agus ón daonáireamh meiteashonraí Git ina bhfuil 639 duine thíos. -> 🙏 Is **croíchuid** iad gnéithe, ceartúcháin fabhtanna agus feabhsuithe bonneagair na rannpháirtithe seo den mhéid a fhágann OmniRoute iontaofa agus saibhir ó thaobh gnéithe de. Tá tábhacht le gach iarratas tarraingthe, gach cás tástála agus gach comhad aistriúcháin i18n. Is iad daoine mar iad seo a thógann bogearraí foinse oscailte. +> 🙏 Is **cuid lárnach** iad gnéithe, ceartúcháin fabhtanna agus feabhsuithe bonneagair na rannpháirtithe seo den mhéid a fhágann OmniRoute iontaofa agus saibhir ó thaobh gnéithe de. Tá tábhacht le gach iarratas tarraingthe, gach cás tástála agus gach comhad aistriúcháin i18n. Is iad daoine cosúil leo a thógann bogearraí foinse oscailte. diff --git a/docs/i18n/ga/SECURITY.md b/docs/i18n/ga/SECURITY.md index a7582de4d6ac..3eec0223914a 100644 --- a/docs/i18n/ga/SECURITY.md +++ b/docs/i18n/ga/SECURITY.md @@ -216,39 +216,37 @@ Tá na rialacha seo forfheidhmithe ag uirlisí agus athbhreithneoirí: 10. **Luachanna runtime `exec()` / `spawn()` trí rogha `env`** — ná hionchuir cosáin sheachtracha nó luachanna neamhiontaofa i scripteanna a chuirtear trí shlaod riamh. Tagairt: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Bí i bhfabhar leabharlanna slán-de-réir-chineáil** — féach [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Sroich dóibh sula ndéanann tú do chuid féin. -## Torthaí scanóra slabhra soláthair (Socket.dev / Snyk / a leithéid) - -Cuimsíonn déantán foilsithe npm `omniroute` leagan tógála Next.js -`output: "standalone"`, rud a chiallaíonn go gcuirtear gach láimhseálaí róid — -lena n-áirítear gnéithe pribhléideacha doiciméadaithe (MITM, iompórtáil Zed, -Cloud Sync, maoirseoir seirbhíse leabaithe) — i smutáin íoslaghdaithe -`.next/server/*.js`. Is minic a mheaitseálann scanóirí heorastúla slabhra -soláthair patrúin sna smutáin sin le sínithe bogearraí mailísigh. - -Tá cumraíocht an scanóra a úsáidimid le fáil ag -[`socket.yml`](socket.yml) i bhfréamh na stórtha (formáid v2 d'Aip GitHub -Socket.dev — féach ). Eisiatar inti -go sainráite comhadlanna nach seoltar (`tests/`, `_tasks/`, `_references/`, -`_ideia/`, `_mono_repo/`, `docs/`, etc.) ionas nach dtuairiscíonn an scanóir -ach ar chonairí cóid a shroicheann úsáideoirí foilsithe i ndáiríre — is í Aip -GitHub Socket a léann an comhad sin a ritheann an scanadh féin, agus ní sreabhadh -oibre sa stór seo. - -I gcás gach catagóire toraidh, coinnímid fianú cothabhálaí ar leith do gach -toradh: +## Torthaí scanóir an tslabhra soláthair (Socket.dev / Snyk / a leithéid) + +> **Nóta faoin raon feidhme:** Ní dhéanann `socket.yml` ag fréamh na stórtha ach `projectIgnorePaths` a chumrú do scanadh iar-fhoilsithe Socket.dev ar thaobh na clárlainne ar an déantán npm foilsithe — ní geata éigeantach cumaisc CI/PR é. Ní dhéanann aon sreabhadh oibre in `.github/workflows`, aon script `package.json`, ná aon sprioc `Makefile` Socket.dev a agairt. + +Cuimsíonn an déantán npm foilsithe `omniroute` an leagan Next.js `output: "standalone"`, +rud a chiallaíonn go gcríochnaíonn gach láimhseálaí bealaigh — lena n-áirítear gnéithe +pribhléideacha doiciméadaithe (MITM, iompórtáil Zed, Cloud Sync, maoirseoir seirbhíse +leabaithe) — i smutáin íoslaghdaithe `.next/server/*.js`. Is minic a dhéanann scanóirí +heorastúla slabhra soláthair na smutáin sin a mheaitseáil de réir patrúin le sínithe bogearraí mailíseacha. + +Tá cumraíocht an scanóra a úsáidimid suite in [`socket.yml`](socket.yml) ag +fréamh na stórtha (formáid v2 d’Aip GitHub Socket.dev — féach +). Eisiann sé go sainráite +comhadlanna nach seoltar (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/`, etc.) ionas nach dtuairiscíonn an scanóir ach ar chonairí cóid a +shroicheann úsáideoirí foilsithe i ndáiríre — is í Aip GitHub Socket a léann an comhad +sin a thiomáineann an scanadh féin, ní sreabhadh oibre sa stór seo. + +Coinnímid fianú cothabhálaí ar leith do gach toradh i ngach catagóir torthaí: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - léarscáil de réir toraidh: comhad foinseach ↔ smután marcáilte ↔ iompar ↔ - maolú a cuireadh i bhfeidhm in v3.8.6. -- Díríonn bloic `SECURITY-AUDITOR-NOTE:` laistigh den fhoinse ag gach pointe - feidhme marcáilte siar chuig an doiciméad céanna. - -D'úsáideoirí nach féidir lena bpíblíne an foláireamh a mhaolú: tóg le -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Cuirtear bonnleaganacha in -ionad na gceithre mhodúl íogaire leis sin, a sheolann HTTP 503 -`feature-disabled` ar ais ag am rite, ionas go mbeidh na conairí cóid -pribhléideacha in easnamh go fisiciúil ón mbeart. Féach -[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) + léarscáil de réir toraidh: comhad foinseach ↔ smután marcáilte ↔ iompraíocht ↔ maolú + curtha i bhfeidhm in v3.8.6. +- Déanann bloic `SECURITY-AUDITOR-NOTE:` san fhoinse ag gach pointe feidhme marcáilte + tagairt don doiciméad céanna. + +D’úsáideoirí nach féidir lena bpíblíne an foláireamh a mhaolú: tóg le +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Cuireann sé sin stoic in ionad na +gceithre mhodúl íogaire a fhilleann HTTP 503 `feature-disabled` ag +am rite, ionas go mbíonn na conairí cóid pribhléideacha as láthair go fisiciúil ón mbeart. +Féach [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) chun an t-oideas foilsithe a fháil. ## Téacsanna tagartha diff --git a/docs/i18n/ga/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/ga/docs/architecture/CODEBASE_DOCUMENTATION.md index 44d9fc0751f6..fc7cd1a70797 100644 --- a/docs/i18n/ga/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/ga/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,8 +434,8 @@ Roinnte i bhfochomhlaigh dírithe: ## 4. `open-sse/` — Spás oibre an innill sruthaithe -Spás oibre npm ar leith a fhoilsítear mar `@omniroute/open-sse`. Is leis próiseáil -iarrataí, feidhmitheoirí, aistritheoirí, seirbhísí, an claochladán, agus an freastalaí MCP. +Spás oibre npm ar leith a fhoilsítear mar `@omniroute/open-sse`. Tá sé freagrach as próiseáil +iarratas, forghníomhaitheoirí, aistritheoirí, seirbhísí, an claochladán agus an freastalaí MCP. ``` open-sse/ @@ -444,52 +444,52 @@ open-sse/ ├── tsconfig.json ├── types.d.ts ├── config/ Clárlanna soláthraithe, próifílí ceanntásca, aitheantas, … -├── handlers/ Láimhseálaithe iarrataí (comhrá, leabuithe, fuaim, íomhá, …) -├── executors/ 108 bhfeidhmitheoir HTTP a bhaineann go sonrach le soláthraithe +├── handlers/ Láimhseálaithe iarratas (comhrá, leabuithe, fuaim, íomhá, …) +├── executors/ 108 bhforghníomhaitheoir HTTP a bhaineann go sonrach le soláthraithe ├── translator/ Tiontú formáide (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Claochladán srutha Responses API ↔ Chat Completions ├── services/ Breis agus 80 modúl seirbhíse (teaglamaí, cúltaca, cuótaí, aitheantas, …) -├── utils/ Áiseanna sruthaithe, cliant TLS, AWS SigV4, aisghabháil trí sheachfhreastalaí, … -└── mcp-server/ Freastalaí MCP (3 mheán iompair, 33 raon feidhme, 110 uirlis) +├── utils/ Cúntóirí sruthaithe, cliant TLS, AWS SigV4, aisghabháil trí sheachfhreastalaí, … +└── mcp-server/ Freastalaí MCP (3 iompar, 33 scóip, 110 uirlis) ``` ### 4.1 `open-sse/handlers/` | Láimhseálaí | Cuspóir | | ----------------------- | ------------------------------------------------------------------------------------------ | -| `chatCore.ts` | Príomhphíblíne comhrá (taisce, teorainn ráta, ródú teaglamaí, seoladh chuig feidhmitheoir) | +| `chatCore.ts` | Príomh-phíblíne comhrá (taisce, teorainn ráta, ródú teaglamaí, seoladh forghníomhaitheora) | | `responsesHandler.ts` | Pointe iontrála OpenAI Responses API | | `embeddings.ts` | Leabuithe | | `imageGeneration.ts` | Giniúint íomhánna | -| `audioSpeech.ts` | Téacs-go-caint | -| `audioTranscription.ts` | Caint-go-téacs | +| `audioSpeech.ts` | Téacs-go-hurlabhra | +| `audioTranscription.ts` | Urlabhra-go-téacs | | `videoGeneration.ts` | Giniúint físeán | | `musicGeneration.ts` | Giniúint ceoil | | `rerank.ts` | Athrangú | | `moderations.ts` | Modhnóireacht | | `search.ts` | Cuardach gréasáin | | `sseParser.ts` | Parsálaí teagmhas SSE | -| `usageExtractor.ts` | Líon na dtóiceanna a bhaint as sruthanna réamhtheachtacha | -| `responseSanitizer.ts` | Torann a bhaineann go sonrach le soláthraithe a bhaint | -| `responseTranslator.ts` | Gliú idir freagra an tsoláthraí agus ciseal an aistritheora | +| `usageExtractor.ts` | Baintear comhairimh comharthaí as sruthanna réamhtheachtacha | +| `responseSanitizer.ts` | Baintear torann a bhaineann go sonrach le soláthraithe | +| `responseTranslator.ts` | Nasc idir freagra an tsoláthraí agus ciseal an aistritheora | ### 4.2 `open-sse/executors/` -108 bhfeidhmitheoir soláthraí, agus gach ceann acu ag leathnú `BaseExecutor` (`base.ts`): +108 bhforghníomhaitheoir soláthraí, agus gach ceann acu ag leathnú `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, chomh maith le `claudeIdentity.ts` -(áis aitheantais chomhroinnte) agus `index.ts` (clárlann). +(cúntóir aitheantais comhroinnte) agus `index.ts` (clárlann). -> Nóta: freastalaíonn `default.ts` ar sholáthraithe nach bhfuil liostaithe anseo agus úsáid á baint as an bhfeidhmitheoir cineálach -> atá comhoiriúnach le OpenAI. Tá catalóg iomlán na soláthraithe (355 sholáthraí) le fáil in +> Nóta: freastalaíonn `default.ts` ar sholáthraithe nach bhfuil liostaithe anseo agus úsáid á baint as an +> bhforghníomhaitheoir cineálach atá comhoiriúnach le OpenAI. Tá catalóg iomlán na soláthraithe (355 soláthraí) le fáil in > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Aistriú mol-agus-spóca (is é OpenAI an mol). +Aistriú moil agus spócaí (is é OpenAI an mol). - **9 n-aistritheoir iarratais** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -499,12 +499,12 @@ Aistriú mol-agus-spóca (is é OpenAI an mol). `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 n-áis** (`translator/helpers/`): +- **9 gcúntóir** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, chomh maith le - tástálacha áise. -- **Áiseanna íomhá** (`translator/image/sizeMapper.ts`). -- Ag an mbarrleibhéal: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. + tástálacha cúntóirí. +- **Cúntóirí íomhá** (`translator/image/sizeMapper.ts`). +- Barrleibhéal: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` @@ -515,29 +515,29 @@ Aistriú mol-agus-spóca (is é OpenAI an mol). Buaicphointí (an liosta iomlán faoi `open-sse/services/`): -| Ábhar imní | Comhaid | -| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Ródú teaglamaí | `combo.ts` (19 straitéis), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Inneall Teaglama Uathoibríoch | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Athléimneacht | `accountFallback.ts` (tréimhse shuaimhnithe + frithdhúnadh), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Cuótaí | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Taisceadh | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Éirim ródúcháin | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Láimhseáil samhlacha | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Comhbhrú | `compression/` — sreangú iomlán an innill chomhbhrúite | -| Comhartha + seisiún | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Sraith / lastliosta | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / líonra | `ipFilter.ts`, `webSearchFallback.ts` | -| Baisceanna | `batchProcessor.ts` | -| Úsáid | `usage.ts` | +| Ábhar imní | Comhaid | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Ródú Combo | `combo.ts` (19 straitéis), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Inneall Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Athléimneacht | `accountFallback.ts` (tréimhse shuaimhnithe + frithdhúnadh), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Cuótaí | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Taisceadh | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Faisnéis ródaithe | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Láimhseáil samhlacha | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Comhbhrú | `compression/` — sreangú iomlán an innill chomhbhrúite | +| Comharthaí + seisiún | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Sraith / lastliosta | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / líonra | `ipFilter.ts`, `webSearchFallback.ts` | +| Baisceanna | `batchProcessor.ts` | +| Úsáid | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 uirlis uathúil** sreangaithe in `server.ts` (45 uirlis chanónach in `schemas/tools.ts` + modúil chuimhne, scileanna, scileanna GitHub, díorma, cluichíocht, breiseán, Notion, Obsidian, - corpás áitiúil agus comhbhrú — an t-aontas á chomhaireamh ag `countUniqueMcpTools`). + corpas áitiúil agus comhbhrú — an t-aontas arna chomhaireamh ag `countUniqueMcpTools`). - **3 mheán iompair**: stdio, HTTP Streamable, SSE. -- **33 scóip** curtha i bhfeidhm ag am rite — tá an bunliosta in `src/shared/constants/mcpScopes.ts`, agus is é an tacar iomlán aontas na scóp a dhearbhaíonn gach modúl uirlise. +- **33 scóip** curtha i bhfeidhm ag am rite — bunliosta in `src/shared/constants/mcpScopes.ts`; is é an tacar iomlán aontas na scóip a dhearbhaíonn gach modúl uirlise. - Tábla iniúchóireachta: `mcp_tool_audit` (arna líonadh ag `audit.ts`). - Comhaid: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, @@ -555,7 +555,7 @@ Clárlanna soláthraithe (`providerRegistry.ts`, `providerModels.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), áiseanna dintiúr (`credentialLoader.ts`, `codexClient.ts`), agus cuibheoirí -néil (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, +néalríomhaireachta (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). diff --git a/docs/i18n/ga/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/ga/docs/architecture/RESILIENCE_GUIDE.md index b1d36f7b3eef..bb263d4336fa 100644 --- a/docs/i18n/ga/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/ga/docs/architecture/RESILIENCE_GUIDE.md @@ -71,18 +71,18 @@ Cosaint aischéimnithe: `tests/unit/provider-cooldown-window-gate.test.ts`. **Raon feidhme:** nasc/cuntas/eochair aonair soláthraí. -**Cuspóir:** eochair lochtach amháin a scipeáil agus naisc eile don soláthraí céanna ag leanúint de bheith ag freastal. +**Cuspóir:** eochair lochtach amháin a sheachaint agus naisc eile don soláthraí céanna ag leanúint de bheith ag freastal. -**Cur chun feidhme:** +**Cur i bhfeidhm:** -- Marcáil mar cheann nach bhfuil ar fáil: `src/sse/services/auth.ts::markAccountUnavailable()` +- Marcáil mar neamh-inúsáidte: `src/sse/services/auth.ts::markAccountUnavailable()` - Roghnú: `getProviderCredentials*` sa chomhad céanna - Ríomh na tréimhse maolaithe: `open-sse/services/accountFallback.ts::checkFallbackError()` - Socruithe: `src/lib/resilience/settings.ts` **Réimsí in aghaidh an naisc:** -- `rateLimitedUntil` — stampa ama go dtí go rachaidh an tréimhse mhaolaithe in éag +- `rateLimitedUntil` — stampa ama go dtí go dtéann an tréimhse mhaolaithe in éag - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — cuntar cúlscoir easpónantúil @@ -94,71 +94,133 @@ Cosaint aischéimnithe: `tests/unit/provider-cooldown-window-gate.test.ts`. - Eochair API 429: tugtar tús áite do cheanntásca réamhtheachtacha `Retry-After`/athshocraithe/téacs athshocraithe is féidir a pharsáil - Cúlscoir: `baseCooldownMs * 2 ** failureIndex` -**Cosaint in aghaidh plódú comhuaineach:** cuireann sí cosc ar theipeanna comhthráthacha an tréimhse mhaolaithe a shíneadh an iomarca nó `backoffLevel` a incrimintiú faoi dhó. +**Cosaint ar ró-ualach comhuaineach:** cuireann sí cosc ar theipeanna comhuaineacha an tréimhse mhaolaithe a shíneadh an iomarca nó `backoffLevel` a mhéadú faoi dhó. -**Staideanna foirceanta (NÍ tréimhsí maolaithe iad):** +**Staid chríochnaitheacha (NÍ tréimhsí maolaithe iad):** -- `banned` — socraítear é trí bhrath eochairfhocail toirmisc / toirmisc cuntais (féach [BAN_DETECTION](../security/BAN_DETECTION.md)), agus trí thrí dhiúltú réamhtheachtacha as a chéile in aghaidh iarratais (`request_rejected`, m.sh. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); ní dhéanann diúltú aonair ach tréimhse mhaolaithe a chur i bhfeidhm ar an nasc -- `expired` (aistríonn sé go staid fhoirceanta tar éis líon teoranta atrialacha — `EXPIRED_RETRY_MAX = 3` le cúlscoir easpónantúil — ionas gur féidir le hearráidí sealadacha OAuth iad féin a leigheas sula ndíghníomhachtaítear an cuntas go buan) +- `banned` — socraítear é trí bhrath eochairfhocail toirmiscthe / toirmisc cuntais (féach [BAN_DETECTION](../security/BAN_DETECTION.md)), agus trí thrí dhiúltú réamhtheachtacha comhleanúnacha in aghaidh na hiarrata (`request_rejected`, m.sh. Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); ní dhéanann aon diúltú aonair ach an nasc a chur i dtréimhse mhaolaithe +- `expired` (aistríonn sé go staid chríochnaitheach tar éis líon teoranta atrialacha — `EXPIRED_RETRY_MAX = 3` le cúlscoir easpónantúil — ionas gur féidir le hearráidí sealadacha OAuth iad féin a leigheas sula ndíghníomhachtaítear an cuntas go buan) - `credits_exhausted` -Maireann siad seo go dtí go n-athraítear na dintiúir nó go n-athshocraíonn oibreoir iad. Ná forscríobh staideanna foirceanta le staid shealadach mhaolaithe. +Maireann siad seo go dtí go n-athraíonn na dintiúir nó go n-athshocraíonn oibreoir iad. Ná forscríobh staid chríochnaitheach le staid shealadach mhaolaithe. **Athshlánú leisciúil:** nuair atá `rateLimitedUntil` caite, bíonn an nasc incháilithe arís. Tar éis úsáid rathúil, glanann `clearAccountError()` gach réimse earráide. +### Balla úsáide Claude OAuth: lána ar thosaíocht níos ísle + athshocrú teorainn seisiúin + +**Raon feidhme:** nasc amháin síntiúis Claude (OAuth). Tá an dá ghné **roghnach in aghaidh an +naisc** (Cuir nasc in eagar → rannán Claude → `lowPriorityMode` / `autoLimitReset` in +`providerSpecificData`, iad araon múchta de réir réamhshocraithe) agus déanann siad aithris ar orduithe `/low-priority` agus +`/limit-reset` Claude Code (conradh sreinge gabhtha ó Claude Code 2.1.263). + +**Cur i bhfeidhm:** + +- Meaisín staide + aicmiú freagartha: `open-sse/services/claudeLowPriority.ts` +- Cliant stádais/éilimh athshocraithe: `open-sse/services/claudeLimitReset.ts` +- Crúca feidhmitheora (instealladh ceanntáisc + atriail ar an gcuntas céanna): `open-sse/executors/base.ts::execute()` +- Marthanacht roghnach: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Truicear:** an balla úsáide 5 uair an chloig — `429` a bhfuil +`anthropic-ratelimit-unified-status: rejected` ina cheanntásca agus, nuair atá an cuntas incháilithe, +`anthropic-ratelimit-unified-slow-offer: treatment`. Ní sheoltar aon rud roimh an gcéad +429 balla sin; téann 429 tobann gan ceanntásca aontaithe tríd an ngnáthchonair mhaolaithe. + +**Lána ar thosaíocht níos ísle** (`lowPriorityMode`): + +- Ar 429 an bhalla, glacann an feidhmitheoir leis an tairiscint agus déanann sé atriail láithreach ar an gcuntas + **céanna** le `anthropic-usage-limit: slow`; fanann an lána gníomhach go dtí an + `anthropic-ratelimit-unified-reset` fógartha (+60s de thréimhse chairde) agus bíonn + an ceanntásc ar gach iarratas san fhuinneog sin. Ní shroicheann an 429 idircheaptha + `handleChatCore` choíche, mar sin **ní chuirtear** an nasc i dtréimhse mhaolaithe agus ní rothlaítear uaidh. +- `anthropic-ratelimit-unified-slow-status` ar fhreagraí níos déanaí: coinníonn `active` / `not_needed` + an lána; fanann `slot_busy` (429) nó `529` ar feadh + `anthropic-ratelimit-unified-slow-retry-after` an fhreastalaí (20s de réir réamhshocraithe, teorannaithe do 5–600s, giodam ±30%) + agus déanann sé atriail, faoi theorainn `anthropic-ratelimit-unified-slow-max-wait` (20 nóiméad de réir réamhshocraithe, teorannaithe do + 1 nóiméad–6 uair) — ina dhiaidh sin cuirtear deireadh leis an lána agus cuireann tréimhse shuaimhnithe 10 nóiméad bac ar athghlacadh leis. Cuirtear + teorainn bhreise leis an bhfanacht de réir an ama atá fágtha de theorainn ama tosaithe réamhtheachtaí na hiarrata féin + (`resolveFetchStartTimeout`, 10 nóiméad de réir réamhshocraithe) lúide corrlach 5 s: gan an teorainn sin, mhairfeadh + an uasfhanacht réamhshocraithe 20 nóiméad níos faide ná an t-iarratas agus chuirfí deireadh leis an gcodladh + i lár na feithimh, rud a nochtfadh `TimeoutError` in ionad an deiridh shéimh `max_wait` + tréimhse shuaimhnithe. +- Cuireann `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, rolladh thar fhuinneog 5h, nó + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (a chuireann deireadh leis mar + `extra_usage` ar aon stádas, ós rud é go gclúdaíonn an farasbarr íoctha an balla anois) deireadh leis an lána; téann an + freagra ansin chuig an ngnáthchonair mhaolaithe. Coinnítear `budget_exhausted` i gcuimhne go dtí + athshocrú fógartha an bhuiséid (≤ 8 lá). +- Ritheann seiceáil an bhalla tar éis atrialacha laistigh den iarracht féin atá tiomáinte ag 400 ag an bhfeidhmitheoir (eagarthóireacht + comhthéacs, teanntáin smaointeoireachta/iarrachta, uathfhoghlaim paraiméadar), mar sin idircheapfar fós 429 balla nach dtagann chun solais ach + ar cheann de na hatrialacha sin seachas é a ligean chuig an gconair mhaolaithe. +- Coinnítear an staid sa chuimhne in aghaidh an naisc (cosnaíonn atosú 429 balla breise amháin chun glacadh leis arís). + +**Athshocrú teorainn seisiúin** (`autoLimitReset`, baintear triail as roimh an lána nuair atá an dá cheann cumasaithe): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → bloc `juniper_tide`; + nuair atá `arm: "reset"` agus `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` le + `{ "program": "juniper_tide" }` (UUID na heagraíochta ó + `providerSpecificData.organizationUUID`, cúltaca tosaithe). +- `result: reset|not_limited` → déantar atriail ar an iarratas ar lánluas (gan ceanntásc moillithe). + Cuireann `already_used` / `not_offered` `next_available_at` de ghlanmheabhair (seachtain amháin de réir réamhshocraithe); bíonn + cúlscoir 15 nóiméad ann i gcás aon teipe. Tarlaíonn an t-athshocrú uair amháin sa tseachtain agus áirítear fós é i dtreo na + teorann seachtainiúla. + +Cosaintí aischéimnithe: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + ### Cleamhnas seisiúin (#7274) -**Raon feidhme:** seisiún cliaint amháin (ceanntásc `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) pionnáilte le nasc amháin, i gcás **aon** soláthraí. +**Raon feidhme:** seisiún cliaint amháin (ceanntásc `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) ceangailte le nasc amháin, do **sholáthraí ar bith**. -**Cuspóir:** gníomhaire ilbabhta (Claude Code, aider, gníomhairí saincheaptha) a choinneáil ar an gcuntas céanna thar iarratais, rud a laghdaíonn caillteanas comhthéacs idir cuntais agus 429anna tosaithe fhuair arís agus arís eile ar sholáthraithe a bhfuil staid seisiúin in aghaidh an chuntais acu. +**Cuspóir:** gníomhaire ilseala (Claude Code, aider, gníomhairí saincheaptha) a choinneáil ar an gcuntas céanna thar iarratais, rud a laghdaíonn caillteanas comhthéacs idir cuntais agus earráidí 429 athfhillteacha ag tosú fuar ar sholáthraithe a bhfuil staid seisiúin in aghaidh an chuntais acu. **Cur chun feidhme:** - Réiteach TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - Roghnú/cruthú pionna: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Aistarraingt ceanntáisc (cineálach, aon soláthraí): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Baint ceanntásca (ginearálta, soláthraí ar bith): `src/sse/services/auth.ts::extractSessionAffinityKey()` - Tábla pionnaí marthanacha: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Socrú: `sessionAffinityTtlMs` (TTL domhanda ina ms, díchumasaíonn `0` é) — `src/lib/db/settings.ts`. Athainmníodh é ón `codexSessionAffinityTtlMs` a bhain le Codex amháin tríd an aistriú `124_generic_session_affinity_ttl.sql`, a thugann aon TTL Codex a cumraíodh roimhe seo ar aghaidh mar an réamhshocrú nua. +- Socrú: `sessionAffinityTtlMs` (TTL domhanda ina ms, díchumasaíonn `0` é) — `src/lib/db/settings.ts`. Athainmníodh é ón `codexSessionAffinityTtlMs`, a bhain le Codex amháin, leis an aistriú `124_generic_session_affinity_ttl.sql`, a thugann aon TTL Codex a cumraíodh roimhe seo ar aghaidh mar an réamhshocrú nua. -Roimh #7274, d'éirigh `resolveSessionAffinityTtlMs()` as láithreach le `0` i gcás gach soláthraí seachas `codex`, mar sin ní raibh aon éifeacht ag an socrú TTL (ná ag na ceanntásca seisiúin) in aon áit eile, cé go raibh an mheicníocht phionnála agus aistarraingt na gceanntásc neamhspleách ar an soláthraí cheana féin. Bhain an ceartúchán an luathfhilleadh sin; cuirtear an TTL i bhfeidhm go haonfhoirmeach anois ar gach soláthraí a luaithe a shocraítear go domhanda os cionn `0` é. +Roimh #7274, d'fhill `resolveSessionAffinityTtlMs()` `0` láithreach do gach soláthraí seachas `codex`, agus mar sin ní raibh aon éifeacht ag an socrú TTL (ná ag ceanntásca an tseisiúin) in aon áit eile, cé go raibh an mheicníocht pionnaithe agus baint na gceanntásca neamhspleách ar an soláthraí cheana féin. Bhain an deisiú an filleadh luath sin; cuirtear an TTL i bhfeidhm go haonfhoirmeach anois ar gach soláthraí a luaithe a shocraítear go domhanda é os cionn `0`. -Ní chuirtear na trí cheanntásc cleamhnais seisiúin ar aghaidh chuig an gcóras réamhtheachtach choíche — tógann feidhmitheoirí a gceanntásca réamhtheachtacha féin ón tús seachas ceanntásca cliaint a chur ar aghaidh, mar sin ní fhanann sé seo ach mar aitheantas comhghaolmhaireachta inmheánach. +Ní chuirtear na trí cheanntásc cleamhnais seisiúin ar aghaidh réamhtheachtach riamh — tógann seiceadóirí a gceanntásca réamhtheachtacha féin ón tús in ionad ceanntásca an chliaint a chur ar aghaidh, mar sin ní úsáidtear é seo ach mar aitheantas comhghaolmhaireachta inmheánach. -### Léasanna eisiacha do naisc seisiún bainistithe +### Léasanna eisiacha bainistithe do naisc seisiúin -**Raon feidhme:** is le cliant/seisiún HTTP bainistithe gníomhach amháin nasc incháilithe OmniRoute amháin. +**Raon feidhme:** is le cliant/seisiún gníomhach bainistithe HTTP amháin nasc incháilithe OmniRoute amháin. -**Cuspóir:** úinéireacht eisiach mharthanach ar nasc a sholáthar do chliaint a dteastaíonn teorainn ródaithe dhocht uathu -thar iarratais. Ní hionann é seo agus cleamhnas seisiúin, ar rogha bhog leanúnachais é: -coinníonn léas eisiach staid saolré in SQLite, cuireann sé uathúlacht dhomhanda an úinéara ghníomhaigh agus -an naisc ghníomhaigh i bhfeidhm, agus diúltaíonn sé do ghlúin atá as dáta sula seoltar chuig an soláthraí í. +**Cuspóir:** úinéireacht eisiach mharthanach ar nasc a sholáthar do chliaint a dteastaíonn +teorainn ródúcháin dhocht uathu thar iarratais. Ní hionann é seo agus cleamhnas seisiúin, ar rogha +bhog leanúnachais é: coinníonn léas eisiach staid saolré in SQLite, forfheidhmíonn sé uathúlacht +dhomhanda an úinéara ghníomhaigh agus an naisc ghníomhaigh, agus diúltaíonn sé do ghlúin atá as +dáta sula seoltar chuig an soláthraí í. -Ní mór roghnú sainráite a dhéanamh don ghné seo in aghaidh na heochrach API. Ní mór an raon feidhme `lease:exclusive` agus -liosta sainráite neamhfholamh `allowedConnections` a bheith ag eochair bhainistithe. Is féidir le haon chliant HTTP críochphointe na saolré a úsáid; ní theastaíonn -ainm cliaint, gníomhaire úsáideora, soláthraí, modh OAuth ná samhail. Is le nasc an léas, -ní le samhail, mar sin coinníonn athrú samhla an ceangal fad a fhanann an nasc -incháilithe de ghnáth. Fanann na gnáthrialacha samhla, cuóta, sláinte, tréimhse maolaithe agus liosta ceadaithe -údarásach agus féadfaidh siad an ghlúin chéanna a aistriú chuig nasc saor incháilithe eile. +Is gné roghnach í seo de réir na heochrach API. Ní mór an raon `lease:exclusive` agus liosta +sainráite neamhfholamh `allowedConnections` a bheith ag eochair bhainistithe. Is féidir le haon +chliant HTTP an críochphointe saolré a úsáid; ní theastaíonn ainm cliaint, gníomhaire úsáideora, +soláthraí, modh OAuth ná samhail. Is le nasc an léas, ní le samhail, agus mar sin coinnítear an +ceangal nuair a athraítear samhail fad is atá an nasc incháilithe de ghnáth. Tá gnáthrialacha +samhla, cuóta, sláinte, tréimhse shuaimhnithe agus liosta ceadaithe fós ceannasach agus féadfaidh +siad an ghlúin chéanna a aistriú chuig nasc incháilithe saor eile. -Is é `POST /api/v1/session-leases` an tsaolré, leis na gníomhartha JSON `acquire`, `renew`, agus `release`. -Cuireann iarratais tátail bhainistithe an luach teimhneach `X-OmniRoute-Lease-Owner` agus an luach beacht -`X-OmniRoute-Lease-Generation` i láthair. Úsáideann an t-úinéir `vlo_` agus 43 carachtar base64url ina dhiaidh; ní stóráiltear ach -a hais SHA-256. Ceanglaíonn gach teorainn deiridh seolta aitheantas na heochrach API fíordheimhnithe agus -aitheantas an naisc ghníomhaigh freisin. Baintear ceanntásca rialaithe léasa de logaí, de ghrianghraif iarratais a choinnítear, agus de -cheanntásca feidhmitheoirí réamhtheachtacha. +Is é `POST /api/v1/session-leases` an saolré, le gníomhartha JSON `acquire`, `renew`, agus `release`. +Cuireann iarratais tátail bhainistithe an luach doiléir `X-OmniRoute-Lease-Owner` agus an +`X-OmniRoute-Lease-Generation` beacht i láthair. Úsáideann an t-úinéir `vlo_` agus 43 carachtar +base64url ina dhiaidh; ní stóráiltear ach a hais SHA-256. Ceanglaíonn gach teorainn seolta +dheiridh aitheantas na heochrach API fíordheimhnithe agus aitheantas an naisc ghníomhaigh freisin. +Baintear ceanntásca rialaithe léasa ó logaí, ó léargais iarratais choinnithe, agus ó cheanntásca +seiceadóra réamhtheachtacha. -Má tá iarrthóirí bainistithe incháilithe ag an ngnáthródú ach go bhfuil gach iarrthóir saor áitithe ag -léas gníomhach eachtrach, seolann OmniRoute HTTP `429`, an cód lease-capacity-unavailable, -staid feithimh ar acmhainn, agus `Retry-After` teoranta a dhíorthaítear ón dáta éaga ábhartha is luaithe. -Ní hionann gnátheaspa incháilitheachta agus iomaíocht léasa, agus coinníonn sé an tséimeantaic earráide ródaithe atá ann cheana. +Má tá iarrthóirí bainistithe incháilithe ag an ngnáthródú ach go bhfuil gach iarrthóir saor i +seilbh léasa ghníomhaigh choimhthí, filleann OmniRoute HTTP `429`, cód nach bhfuil acmhainn léasa +ar fáil, staid feithimh ar acmhainn, agus `Retry-After` teoranta a dhíorthaítear ón dul in éag +ábhartha is luaithe. Ní conspóid léasa í gnáthfholús incháilitheachta agus coinníonn sé na +séimeantaicí earráide ródúcháin atá ann cheana. Fanann meicníochtaí gaolmhara ar leithligh: -- Is dáileadh bog áitiúil don phróiseas é áitiú seisiúin OAuth le haghaidh cuntais OAuth. -- Deonaíonn séamafair chuntais ceadanna comhthráthachta iarratais agus críochnaíonn siad nuair a chuirtear iarratas i gcrích. -- Is úinéireacht mharthanach saolré le teorainn ghlúine iad léasanna eisiacha seisiún bainistithe. - ---- +- Is dáileadh bog próiseas-logánta é áitíocht seisiúin OAuth do chuntais OAuth. +- Deonaíonn séamafóir cuntais ceadanna comhthráthachta iarratais agus tagann deireadh leo nuair a chuirtear iarratas i gcrích. +- Is úinéireacht mharthanach saolré le teorainn ghlúine iad léasanna eisiacha bainistithe do sheisiúin. ## 3. Frithdhúnadh Samhla @@ -286,48 +348,84 @@ teorainn ráta in aghaidh an mhúnla. Tá sé teorannaithe ag `comboCooldownWait --- -## 5. Rialú Iontrála Scuaine Iarratas (v3.8.49 · saincheist #6593) - -**Raon feidhme**: an scuaine áitiúil teorannaithe ráta in aghaidh an tsoláthraí+naisc (`open-sse/services/rateLimitManager.ts`, -le Bottleneck mar bhonn taca aige), sraith amháin faoi bhun na dtrí mheicníocht thuas. - -**Is ainm oidhreachta marthanaithe é `maxWaitMs` le haghaidh dhul in éag an fhorghníomhaithe.** -Cuirtear `resilienceSettings.requestQueue.maxWaitMs` ar aghaidh chuig Bottleneck mar -`expiration` poist, agus ní thosaíonn a amadóir go dtí tar éis an tseolta. Dá bhrí sin, cuireann sé teorainn le -forghníomhú atá faoi bhainistiú an teorantóra, ní leis an am a chaitear sa scuaine áitiúil. Cuirtear dul in éag -in iúl mar `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` áitiúil iontaofa (HTTP 504); -ní ghlactar leis an seanainm cóid don teorainn ama scuaine ach ar mhaithe le comhoiriúnacht -shiardhátaithe inmheánach iontaofa. Is é 15000ms an réamhshocrú; sáraigh é trí -`RATE_LIMIT_MAX_WAIT_MS` (athróg timpeallachta) nó tríd an deais (**Socruithe → Athléimneacht**, -uasteorainn UI 1–30000ms). Níl spriocdháta ama ag fanacht sa scuaine; úsáid -`maxQueueDepth` thíos chun teorainn a chur le glaoiteoirí sa scuaine. - -**`maxQueueDepth` — uasteorainn iontrála roghnach (nua).** Cuireann `resilienceSettings.requestQueue.maxQueueDepth` -teorainn le líon na n-iarratas ar féidir leo fanacht sa scuaine (gan a bheith seolta fós) do -sholáthraí+nasc amháin ag aon am amháin. Nuair atá `maxQueueDepth` iarratas sa scuaine cheana féin, -diúltaítear d'iarratas nua láithreach le hearráid chlóscríofa -`code: "RATE_LIMIT_QUEUE_FULL"` **sula** sroicheann sé `limiter.schedule()` riamh -— mar sin tá an diúltú saor agus tarlaíonn sé roimh aon obair iartheachtach -chomhbhrú leid / aistriúcháin don iarratas sin. Réamhshocrú `0` = -díchumasaithe, rud a chaomhnaíonn an t-iompar scuaine gan teorainn atá ann cheana; teorannaithe do 0–100000. -Sáraigh é trí `RATE_LIMIT_MAX_QUEUE_DEPTH` (athróg timpeallachta) nó -`resilienceSettings.requestQueue.maxQueueDepth` (paiste deaise/API). - -Is feidhm íon í an tseiceáil iontrála féin -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) ionas -gur féidir í a thástáil mar aonad gan fíortheorantóir Bottleneck. - -> Moladh san RFC a d'oscail #6593 bratach `bypassCompressionOnRateLimit` -> freisin. Is comhbhrú leide/comhthéacs ar an iarratas LLM amach é píblíne -> `open-sse/services/compression/` an stór seo (`chatCore.ts`, -> thart ar an mbloc `resolveCompressionSettings`/`selectCompressionStrategy`), -> ní comhbhrú freagartha HTTP ar chabhlacha 429 sintéisithe — níl aon -> chonair chóid chomhfhreagrach ann do bhratach sheachanta liteartha. Faoi láthair ritheann an chéim chomhbhrú leide sin -> _roimh_ `withRateLimit()` sa phíblíne iarratais freisin, mar sin -> is athrú níos leithne ar leith é í a athordú chun í a scipeáil nuair a dhiúltaítear mar gheall ar scuaine lán, -> seachas raon feidhme na saincheiste seo; **níor** cuireadh i bhfeidhm anseo í d'aon ghnó -> agus fágtar í mar obair leantach más fiú an coigilteas LAP an riosca -> athordaithe. +## 5. Rialú Iontrála do Scuaine Iarratas (v3.8.49 · saincheist #6593) + +**Raon feidhme**: an scuaine áitiúil teorannaithe ráta in aghaidh an tsoláthraí+na ceangailteachta (`open-sse/services/rateLimitManager.ts`, +le tacaíocht ó Bottleneck), sraith amháin faoi bhun na dtrí mheicníocht thuas. + +**Cuireann `maxWaitMs` teorainn le fanacht sa scuaine; cuireann `executionMaxWaitMs` teorainn leis an rith.** +Coinnítear an dá cheann scartha d’aon ghnó, agus ní chuireann ceachtar acu leis an gceann eile. + +Is é `resilienceSettings.requestQueue.maxWaitMs` an **buiséad feithimh sa scuaine**: +cumhdaíonn sé fanacht le sliotán soláthraí agus ansin suí sa staid QUEUED, agus +glantar a amadóir a luaithe a fhágann an jab QUEUED agus a thosaíonn sé ag rith +(`rateLimitManager.ts`, `wrappedFn`). Ní shroicheann iarratas a sháraíonn é an +córas réamhtheachtach choíche. Is é 30000ms an réamhshocrú, arna sholáthar ag +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` in `src/lib/resilience/settings.ts` agus arna +shocrú ag `tests/unit/ratelimit-admission-control-6593.test.ts`, ionas go +dteipfidh an tástáil sin má athraítear é seachas ligean don mhír seo dul as dáta +go ciúin. + +Is é `resilienceSettings.requestQueue.executionMaxWaitMs` an méid a fhaigheann +Bottleneck mar `expiration` an jaib, agus ní thosaíonn a amadóir go dtí tar éis +an tseolta. Is cosaint chúltaca é do riteoirí nach bhfuil teorainn ama +réamhtheachtach dá gcuid féin acu, agus ardaítear é go dtí teorainn ama +thosaithe aisghabhála an riteora féin nuair is faide í sin, ionas nach féidir +leis freagairt shláintiúil atá ar siúl a ghearradh as. Is é 600000ms (10 nóim.) +an réamhshocrú. + +Ba é buiséad na scuaine a chur isteach in `expiration` an rud a bhíodh ag +marú geataí neamh-incriminteacha i lár an reatha — ritheann siad go dlisteanach +ar feadh nóiméad sula dtagann na chéad bhearta — agus sin é an fáth a nochtar +dul in éag mar `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), agus cód teorann ama na scuaine ag +gabháil le buiséad na scuaine. Sáraigh ceachtar acu trí +`RATE_LIMIT_MAX_WAIT_MS` / `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (athróg +timpeallachta) nó tríd an deais (**Socruithe → Athléimneacht**). Cuirtear +teorainn 1ms–24h leis an dá cheann nuair a normalaítear iad. + +**Tosaíocht, don dá cheann:** ní sholáthraíonn an athróg timpeallachta ach an +_luach réamhshocraithe_. Bíonn tosaíocht ag luach a coinníodh in +`resilienceSettings.requestQueue` (paiste deaise / API, stóráilte in +`key_value`) air, agus bíonn tosaíocht ag `rateLimitOverrides.maxWaitMs` / +`.executionMaxWaitMs` in aghaidh na ceangailteachta air sin. Dá bhrí sin, ní +athraítear rud ar bith ach an athróg timpeallachta a shocrú ar imscaradh a +bhfuil luach coinnithe aige cheana féin — glan nó nuashonraigh an socrú +coinnithe ina ionad sin. + +Cuireann `maxWaitMs` teorainn leis an tréimhse sa scuaine; cuireann +`maxQueueDepth` thíos teorainn le líon na nglaoiteoirí is féidir a bheith sa +scuaine ag aon am amháin. + +**`maxQueueDepth` — uasteorainn iontrála roghnach (nua).** Cuireann +`resilienceSettings.requestQueue.maxQueueDepth` teorainn le líon na n-iarratas +is féidir suí sa scuaine (gan a bheith seolta fós) do sholáthraí+ceangal amháin +ag aon am amháin. Nuair atá `maxQueueDepth` iarratas sa scuaine cheana féin, +diúltaítear d’iarratas nua láithreach le hearráid chlóscríofa +`code: "RATE_LIMIT_QUEUE_FULL"` **sula** sroicheann sé `limiter.schedule()` +riamh — mar sin tá an diúltú saor agus tarlaíonn sé roimh aon obair +chomhbhrúite / aistriúcháin leide iartheachtach don iarratas sin. Réamhshocrú +`0` = díchumasaithe, rud a chaomhnaíonn iompraíocht neamhtheoranta reatha na +scuaine; teoranta do 0–100000. Sáraigh é trí `RATE_LIMIT_MAX_QUEUE_DEPTH` +(athróg timpeallachta) nó `resilienceSettings.requestQueue.maxQueueDepth` +(paiste deaise/API). + +Is feidhm íon é an tseiceáil iontrála féin +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), ionas +gur féidir í a thástáil le tástáil aonaid gan fíortheorantóir Bottleneck. + +> Moladh san RFC a d’oscail #6593 bratach `bypassCompressionOnRateLimit` +> freisin. Is é atá i bpíblíne `open-sse/services/compression/` na stórlainne +> seo ná comhbhrú leide/comhthéacs ar an iarratas LLM amach (`chatCore.ts`, +> timpeall an bhloic `resolveCompressionSettings`/`selectCompressionStrategy`), +> seachas comhbhrú freagartha HTTP ar choirp 429 shintéisithe — níl cosán cóid +> meaitseála ann do bhratach sheachanta liteartha. Ritheann an chéim +> chomhbhrúite leide sin _roimh_ `withRateLimit()` sa phíblíne iarratais faoi +> láthair freisin, mar sin is athrú ar leith agus níos mó ná raon feidhme na +> saincheiste seo é an t-ord a athrú chun í a scipeáil nuair a dhiúltaítear mar +> gheall ar scuaine lán; níor cuireadh i bhfeidhm anseo í **d’aon ghnó** agus +> fágadh mar obair leantach í má tá an gnóthachan ó thaobh CPU a shábháil de +> fiúntach i gcomparáid leis an riosca a bhaineann leis an athordú. --- diff --git a/docs/i18n/ga/docs/architecture/admission-lanes.md b/docs/i18n/ga/docs/architecture/admission-lanes.md index 3caaa955b746..8aca383159d1 100644 --- a/docs/i18n/ga/docs/architecture/admission-lanes.md +++ b/docs/i18n/ga/docs/architecture/admission-lanes.md @@ -7,48 +7,52 @@ Tá **dhá** chóras lána atá áitiúil don phróiseas ag OmniRoute, agus scóip dhifriúla acu. Tá siad comhlántach; ba cheart d’oibreoirí a bheith ar an eolas cé acu ceann a bhfuil siad ag féachaint air. -## 1. Iontráil ar leibhéal beart ar fud an phróisis (`chatBodyAdmission.ts`) - -- **Scóip:** cosán an choirp mhaolánaithe/na carnchuimhne le haghaidh `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses`, agus na bealaí eile ar chruth comhrá. Cosnaíonn sé - ar aimpliú carnchuimhne de bharr coirp mhóra ó ghníomhairí códúcháin (#4380). -- **Rialaitheoir domhanda amháin don phróiseas, ní lánaí in aghaidh na heochrach (#10110).** Glacann gach eochair API - (haiste) nó seisiún `anonymous` le hiarrataí faoi réir an bhuiséid chomhroinnte **chéanna** — - úsáidtear aitheantas haistithe an tseisiúin MAR eochair sceidealaithe cothroime AMHÁIN (seoladh - spideogach thar iarrataí atá ar feitheamh), agus ní úsáidtear riamh é mar dheighilt acmhainne. Rinne leagan roimhe seo den - doiciméad seo cur síos ar lánaí in aghaidh na heochrach a raibh acmhainn neamhspleách acu; baineadh an tsamhail sin +## 1. Cead isteach ar fud an phróisis ag leibhéal beart (`chatBodyAdmission.ts`) + +- **Raon feidhme:** cosán an choirp mhaolánaithe/na carnchuimhne do `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses`, agus na bealaí eile atá múnlaithe mar chomhrá. Cosnaíonn + sé ar aimpliú carnchuimhne de bharr coirp mhóra ó ghníomhairí códaithe (#4380). +- **Rialaitheoir domhanda amháin don phróiseas, ní lánaí in aghaidh na heochrach (#10110).** Faigheann gach eochair API + (haiseáilte) nó seisiún `anonymous` cead isteach i gcoinne an bhuiséid chomhroinnte + **chéanna** — úsáidtear aitheantas haiseáilte an tseisiúin MAR eochair sceidealaithe cothroime AMHÁIN + (seoladh timthriallach i measc iarrthóirí feithimh), agus ní mar dheighilt acmhainne riamh. Rinne leagan roimhe seo den + cháipéis seo cur síos ar lánaí in aghaidh na heochrach a raibh acmhainn neamhspleách acu; baineadh an tsamhail sin in #10110 toisc gur lig sí do dhintiúir bhréige gan fíordheimhniú - an teorainn uile-phróisis a iolrú. -- **Geata (#503-fanout): buiséad BEART ionghabhála a dhíorthaítear go huathoibríoch, ní líon seasta - iarrataí.** Laghdaigh an uasteorainn oidhreachta `CHAT_MAX_HEAVY_IN_FLIGHT` ar líon na n-iarratas (`1` mar réamhshocrú - roimh an gceartúchán seo) scaipeadh amach gníomhairí códúcháin (fogníomhairí/CLIanna iolracha, - coirp > 256 KB go rialta) go comhthreomhaireacht éifeachtach de ~1, rud a thug freagra 503 - faoi ghnáthualach ar fad. Ní bhíonn sí ceangailteach anois ach amháin nuair a shocraíonn oibreoir - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` go sainráite. Má fhágtar gan socrú é, déantar iontráil a - gheataíocht ina ionad sin le `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — buiséad a dhíorthaítear go huathoibríoch ó - fhíoruasteorainn chuimhne an phróisis (`src/shared/middleware/admissionBudget.ts`): - 25% den luach is sriantaí idir teorainn charnchuimhne V8 agus aon teorainn cgroup/coimeádáin, - roinnte ar fhachtóir aimplithe neamhbhuan 8x, agus é clampáilte idir 8 MiB agus + an teorainn ar fud an phróisis a iolrú. +- **Geata (#503-fanout): buiséad ionghabhála BEART a dhíorthaítear go huathoibríoch, ní líon seasta + iarratas.** Chrap teorainn chomhairimh iarratas oidhreachta `CHAT_MAX_HEAVY_IN_FLIGHT` (`1` + mar réamhshocrú roimh an gceartúchán seo) eisréimneacht gníomhairí códaithe (il-fhoghníomhairí/CLIanna, + coirp > 256 KB go rialta) go comhthreomhaireacht éifeachtach de ~1, rud a d'fhág + gur tugadh 503 faoi ualach iomlán gnáth. Ní bhíonn sí ceangailteach anois ach amháin nuair a shocraíonn oibreoir + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` go sainráite. Má fhágtar gan socrú é, rialaítear cead isteach ina ionad sin + le `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — buiséad a dhíorthaítear go huathoibríoch ó + fhíor-uasteorainn chuimhne an phróisis (`src/shared/middleware/admissionBudget.ts`): + 25% den cheann is sriantaí idir teorainn charn V8 agus aon teorainn cgroup/coimeádáin, + roinnte ar fhachtóir aimplithe neamhbhuan 8x, agus clampáilte idir 8 MiB agus 2 GiB. Úsáideann sáruithe sainráite na clampálacha céanna. Scálaíonn sé seo é féin ó - choimeádán 512 MB go deasc 32 GB gan aon mhionchoigeartú athróige timpeallachta. Teipeann láithreach ar chorp nach féidir - a chur laistigh den bhuiséad éifeachtach le `413 body_exceeds_budget`; - ní théann ach iomaíocht idir coirp ar féidir freastal orthu astu féin isteach sa scuaine cothroime - theoranta. Giorraíonn rianaire beo brú acmhainní ilchomhartha (cóimheas charnchuimhne V8, + choimeádán 512 MB go deasc 32 GB gan aon tiúnadh timpeallachta. Teipeann láithreach ar chorp nach féidir + leis luí laistigh den bhuiséad éifeachtach le `413 body_exceeds_budget`; + ní théann ach coinbhleacht i measc corp ar féidir freastal orthu astu féin isteach sa scuaine cothroime + faoi theorainn. Giorraíonn rianaire beo brú acmhainní ilchomhartha (cóimheas charn V8, cgroup, PSI, teagmhais OOM — `open-sse/utils/resourcePressurePolicy.ts`) - an fanacht teoranta faoi bhrú `high` agus diúltaíonn sé d’iarrataí láithreach le - `503 resource_pressure` faoi bhrú `critical`, sula n-ionghabhtar aon bheart fiú. -- **Mionchoigeartú:** + an fanacht teoranta faoi bhrú `high` agus díbríonn sé láithreach le + `503 resource_pressure` faoi bhrú `critical`, sula n-ionghabhtar fiú aon bheart. + Léitear PSI ó `memory.pressure` de chuid cgroup an aonaid seo nuair atá sé ar fáil + (`open-sse/utils/resourcePressureSampler.ts`); baineann `/proc/pressure/memory` + leis an óstríomhaire ar fad agus ní úsáidtear é ach mar chúltaca ar mhiotal lom / cgroup v1, ionas nach féidir le + hóstríomhaire atá ag babhtáil 503 a thabhairt do choimeádán díomhaoin. +- **Tiúnadh:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — sárú don bhuiséad beart a dhíorthaítear go huathoibríoch - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — uasteorainn oidhreachta ar líon na n-iarratas, roghnach amháin + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — teorainn chomhairimh iarratas oidhreachta, roghnach amháin - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — fanacht sa scuaine roimh 503 (réamhshocrú 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — comhla carnchuimhne do bhearta sa scuaine (réamhshocrú 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — dímholta + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — comhla charnchuimhne do bhearta sa scuaine (réamhshocrú 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — dulta i léig agus gan éifeacht ó #10110 (glactar leo ar mhaithe le comhoiriúnacht cumraíochta, ach déantar neamhaird díobh) - **Tuairiscí:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — lena n-áirítear - na breiseanna #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` + na breiseanna ó #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity`, agus `countCapEnabled` - (bréagach ar imscaradh réamhshocraithe — deimhníonn sé gurb é an buiséad beart, seachas an uasteorainn oidhreachta - ar líon na n-iarratas, atá ceangailteach i ndáiríre). + (false ar imscaradh réamhshocraithe — deimhníonn sé gurb é an buiséad beart, agus ní an teorainn chomhairimh + oidhreachta, atá ceangailteach i ndáiríre). ## 2. Lánaí fíorúla oiriúnaitheacha ag am rite (`open-sse/services/admission`) diff --git a/docs/i18n/ga/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/ga/docs/frameworks/EMBEDDED-SERVICES.md index 1fb38875a7ad..054e88378117 100644 --- a/docs/i18n/ga/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/ga/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Leagan:** v3.8.44 -> **Nuashonraithe go deireanach:** 2026-07-03 -> **Lucht léitheoireachta:** Innealtóirí atá ag cur seirbhísí leabaithe leis, á gcothabháil nó á ndífhabhtú (9Router, CLIProxyAPI, Mux, Bifrost). +> **Nuashonrú deireanach:** 2026-09-09 +> **Lucht léitheoireachta:** Innealtóirí a chuireann seirbhísí leabaithe leis, a chothabhálann iad, nó a dhéanann dífhabhtú orthu (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Is uirlisí taobhcharr próisis iad seirbhísí leabaithe, suiteáilte go háitiúil, a shuiteálann agus a mhaoirsíonn OmniRoute agus -a nochtann sé mar spriocanna ródaithe den chéad scoth. Murab ionann agus soláthraithe seachtracha (a mbaintear amach iad thar an idirlíon -trí eochracha API), ritheann seirbhísí leabaithe ar an meaisín céanna le OmniRoute agus déanann siad cumarsáid thar lúb-ais. +Is uirlisí próisis taobhcharr iad seirbhísí leabaithe a shuiteáiltear go háitiúil agus a shuiteálann agus a mhaoirsíonn OmniRoute, agus +a nochtann sé mar spriocanna ródúcháin den chéad scoth. Murab ionann agus soláthraithe seachtracha (a mbaintear amach iad thar an idirlíon +trí eochracha API), ritheann seirbhísí leabaithe ar an ríomhaire céanna le OmniRoute agus déanann siad cumarsáid thar an gcomhéadan aisfhillte. --- @@ -27,35 +27,36 @@ trí eochracha API), ritheann seirbhísí leabaithe ar an meaisín céanna le Om --- -## 1. Forléargas +## 1. Forbhreathnú -### Cén fáth a n-úsáidtear seirbhísí leabaithe? +### Cén fáth seirbhísí leabaithe? -Tá cúig sheirbhís leabaithe ann: +Tá sé sheirbhís leabaithe: -| Seirbhís | Pacáiste npm | Port réamhshocraithe | Cuspóir | -| --------------- | ------------------------------------------- | :------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | Ródaire IS ar féidir le OmniRoute é a úsáid mar fho-sholáthraí. Nochtar samhlacha mar `9router/{sub}/{model}` | -| **CLIProxyAPI** | Dénártha eisiúna GitHub (`cliproxy`) | 8317 | Cuibheoir seachfhreastalaí áitiúil le haghaidh sreafaí fíordheimhnithe CLI Anthropic. Soláthraíonn sé ródú cúltaca nuair a théann comharthaí OAuth in éag | -| **Mux** | `mux` (`mux server` gan chomhéadan grafach) | 8322 | Deamhan áitiúil um cheolfhoireannú gníomhairí (coder/mux). Bainistítear a shaolré amháin — ní sprioc ródaithe é (gan seachfhreastalaíocht LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Inneall sealaíochta tairsí IS Go. Nuair atá sé ag rith, roghnaítear go huathoibríoch é ag an mbealach sealaíochta (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Seachfhreastalaí síntiúis Claude — rogha mhalartach/chúltaca ar CLIProxyAPI do thrácht atá múnlaithe ar Claude Code; déantar `DARIO_ADMIN_TOKEN` den eochair insteallta, rud a chuireann srian ar a phlána rialaithe OAuth `/admin/*` | +| Seirbhís | pacáiste npm | Port réamhshocraithe | Cuspóir | +| --------------- | ------------------------------------------- | :------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | Ródaire AI is féidir le OmniRoute a úsáid mar fhofhoshnáthraí. Nochtar samhlacha mar `9router/{sub}/{model}` | +| **CLIProxyAPI** | Dénártha eisiúna GitHub (`cliproxy`) | 8317 | Cuibheoir seachfhreastalaí logánta le haghaidh sreafaí fíordheimhnithe Anthropic CLI. Soláthraíonn sé ródú cúltaca nuair a théann comharthaí OAuth in éag | +| **Mux** | `mux` (`mux server` gan chomhéadan grafach) | 8322 | Deamhan logánta ceolfhoirneoireachta gníomhairí (coder/mux). Ní dhéantar ach a shaolré a bhainistiú — ní sprioc ródaithe é (gan seachfhreastalaíocht LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Inneall sealaíochta geata AI Go. Nuair atá sé ag rith, roghnaítear go huathoibríoch é ag an mbealach sealaíochta (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Seachfhreastalaí síntiúis Claude — rogha mhalartach/chúltaca ar CLIProxyAPI do thrácht i bhformáid Claude Code; déantar `DARIO_ADMIN_TOKEN` den eochair insteallta, rud a gheataíonn a phlána rialaithe OAuth `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Uathoibriú WhatsApp Web (Chromium gan chomhéadan grafach trí Puppeteer). Ní dhéantar ach a shaolré a bhainistiú — ní sprioc ródaithe é. | -Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: +Leanann na sé cinn ar fad an tsamhail mhaoirseachta chéanna: -- Suiteálann OmniRoute iad faoi `DATA_DIR/services/{name}/` (scoite amach ó `package.json` OmniRoute féin) -- Tosaíonn OmniRoute iad mar phróisis mhac agus déanann sé monatóireacht orthu -- Insteallann OmniRoute eochair API ghearrshaolach i dtimpeallacht an phróisis mhic agus rothlaíonn sé í gan aga neamhfhónaimh (nuair is infheidhme) -- Is **LOCAL_ONLY** iad na bealaí bainistíochta go léir (`/api/services/*`) — ní féidir rochtain a fháil orthu ach ón lúb-ais (riail dhocht #17) +- Suiteálann OmniRoute iad faoi `DATA_DIR/services/{name}/` (scoite ó `package.json` OmniRoute féin) +- Seolann agus déanann OmniRoute monatóireacht orthu mar phróisis mhac +- Insteallann OmniRoute eochair API ghearrshaolach isteach i dtimpeallacht an phróisis mhic agus rothlaíonn sé í gan aga neamhfhónaimh (nuair is infheidhme) +- Tá gach bealach bainistíochta (`/api/services/*`) **LOCAL_ONLY** — níl rochtain orthu ach ón gcomhéadan lúb-ais (riail dhocht #17) ### Príomhchinntí (ón bplean dearaidh) | Cinneadh | Luach | | ------------------------------------------------- | --------------------------------------------------------------------------------------------- | | Rochtain ón deais ar chomhéadan dúchasach 9Router | Seachfhreastalaí droim ar ais ag `/dashboard/providers/services/9router/embed/*` | -| Meicníocht suiteála | `npm install {package}` trí `execFile` (gan idirshuíomh blaoisce) | +| Meicníocht suiteála | `npm install {package}` trí `execFile` (gan idirshuíomh blaosc) | | Mód úsáide | Soláthraí cláraithe mar `9router/{sub}/{model}` san inneall ródaithe | -| Bainistíocht eochracha API | Gineann OmniRoute iad, criptíonn sé iad ar fos (AES-256-GCM), agus insteallann sé iad trí env | +| Bainistiú eochracha API | Gineann OmniRoute iad, criptíonn sé iad ar fos (AES-256-GCM), agus insteallann sé trí env iad | | Suíomh na deaise | `/dashboard/providers/services` (trí chluaisín) | | Uath-thosú | Scorán do gach seirbhís, MÚCHTA de réir réamhshocraithe | @@ -65,9 +66,9 @@ Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: ``` ┌────────────────────────────────────────────────────────────────────┐ -│ Sraith 1 — Comhéadan Úsáideora │ +│ Sraith 1 — Comhéadan úsáideora │ │ /dashboard/providers/services (cluaisíní: CLIProxyAPI | 9Router | Mux)│ -│ Logaí beo (SSE), Tosaigh/Stop/Atosaigh/Nuashonraigh, Socruithe, Suiteáil│ +│ Logaí beo (SSE), Tosaigh/Stop/Aththosaigh/Nuashonraigh, Socruithe, Suiteáil│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx Blaosc + ródú cluaisíní de réir ?tab=│ @@ -78,7 +79,7 @@ Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (fetch Next.js) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Sraith 2 — API (LOCAL_ONLY — aisfhilleadh amháin) │ +│ Sraith 2 — API (LOCAL_ONLY — aisfhillte amháin) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -87,9 +88,9 @@ Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (seachfhreastalaí HTTP + WebSocket → réamhtheachta 9Router) │ +│ (seachfhreastalaí HTTP + WebSocket → 9Router réamhtheachtach) │ │ │ -│ Geata: cuimsíonn LOCAL_ONLY_API_PREFIXES "/api/services/" agus │ +│ Geata: cuimsíonn LOCAL_ONLY_API_PREFIXES "/api/services/" agus │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ glaonna laistigh den phróiseas @@ -97,9 +98,9 @@ Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: │ Sraith 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Maoirseoir ginearálta (child_process.spawn)│ -│ ├── suiteáil: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── suiteáil: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── tosú: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── port: 20130 do 9Router (inchumraithe) │ │ ├── logaí: maolán fáinne stdio 5 MB → teagmhais SSE │ │ ├── sláinte: HTTP GET /health gach 2–5 s, athshlánú leisciúil│ @@ -110,40 +111,40 @@ Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts GET tréimhsiúil /v1/models → tábla service_models│ │ ringBuffer.ts Maolán loga ciorclach (5 MB in aghaidh na seirbhíse)│ -│ healthCheck.ts Taiscéalaí sláinte HTTP le vótaíocht │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ healthCheck.ts Tóireadóir sláinte HTTP a dhéanann vótaíocht │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (cuibheoirí suiteálaí) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP atá comhoiriúnach le OpenAI (aisfhilleadh) + │ HTTP comhoiriúnach le OpenAI (aisfhillte) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Sraith 4 — Soláthraí / Ródú │ +│ Sraith 4 — Soláthraí / Ródú │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Athaimsíonn sé an port agus an eochair API do gach iarratas (gan taisceadh).│ +│ Aimsíonn sé an port agus an eochair API arís do gach iarratas (gan taisceadh).│ │ Baineann sé an réimír "9router/" d'aitheantas na samhla roimh sheachfhreastal.│ │ Filleann sé 503 service_not_running mura bhfuil an maoirseoir i "running".│ │ │ │ src/shared/constants/providers.ts │ -│ Iontráil do "9router": isEmbeddedService: true │ +│ Iontráil le haghaidh "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ Stóráiltear samhlacha mar "9router/{sub}/{model}" (le réimír). │ │ Sioncronaíonn modelSync.ts iad gach 5 nóiméad. │ │ │ -│ Déantar saolré Mux a bhainistiú AMHÁIN (Sraitheanna 1-3) — is │ +│ Ní dhéantar bainistiú ach ar shaolré Mux (Sraitheanna 1-3) — is │ │ deamhan ceolfhoirneoireachta gníomhairí é, ní seachfhreastalaí LLM,│ -│ mar sin níl aon iontráil seiceadóra/soláthraí i Sraith 4 aige agus│ -│ ní sprioc ródaithe é riamh. │ +│ mar sin níl iontráil seiceadóra/soláthraí i Sraith 4 aige agus ní │ +│ sprioc ródaithe é riamh. │ └────────────────────────────────────────────────────────────────────┘ ``` -### Príomhchomhaid foinseacha +### Príomhchomhaid foinse | Comhad | Ról | | ------------------------------------------- | -------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Croí-aicme: saolré, glas, sláinte, maolán fáinne | +| `src/lib/services/ServiceSupervisor.ts` | Croí-aicme: saolré, glas, sláinte, maolán fáinneach | | `src/lib/services/bootstrap.ts` | Clárú ar leibhéal an phróisis agus uath-thosú | -| `src/lib/services/registry.ts` | Mapa singil `tool → supervisor` | +| `src/lib/services/registry.ts` | Léarscáil aonáin `tool → supervisor` | | `src/lib/services/apiKey.ts` | Giniúint eochracha, criptiú AES-256-GCM ar fos | | `src/lib/services/modelSync.ts` | Sioncronú tréimhsiúil samhlacha (5 nóiméad) + ar éileamh | | `src/lib/services/ringBuffer.ts` | Maolán loga ciorclach 5 MB le síntiús SSE | @@ -151,8 +152,9 @@ Leanann na cúig cinn ar fad an tsamhail mhaoirseachta chéanna: | `src/lib/services/installers/ninerouter.ts` | Suiteáil/nuashonrú/díshuiteáil npm do 9Router | | `src/lib/services/installers/cliproxy.ts` | Suiteáil/nuashonrú/díshuiteáil npm do CLIProxyAPI | | `src/lib/services/installers/mux.ts` | Suiteáil/nuashonrú/díshuiteáil npm do Mux | +| `src/lib/services/installers/openwa.ts` | Suiteáil/nuashonrú/díshuiteáil npm do open-wa | | `src/app/api/services/9router/_lib.ts` | Feidhm chúnta `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Críochphointe comhroinnte logaí SSE | +| `src/app/api/services/[name]/logs/route.ts` | Críochphointe comhroinnte do logaí SSE | | `open-sse/executors/ninerouter.ts` | Seiceadóir soláthraí (Sraith 4) | --- @@ -211,15 +213,15 @@ mar shampla, a ghníomhaíonn uath-thosú agus cnaipe sa chomhéadan úsáideora ## 4. Tagairt API -Tá gach bealach faoi `/api/services/` **LOCAL_ONLY** (lúb siar amháin, riail dhocht #17). -Faigheann iarratais nach ón lúb siar iad `403 LOCAL_ONLY` beag beann ar an gcomhartha fíordheimhnithe. +Tá gach bealach faoi `/api/services/` **LOCAL_ONLY** (aisfhillte amháin, riail dhocht #17). +Faigheann iarratais nach iarratais aisfhillte iad `403 LOCAL_ONLY` beag beann ar an gcomhartha fíordheimhnithe. ### 4.1 Críochphointí 9Router (11 bhealach) #### `POST /api/services/9router/install` -Suiteáil 9Router ó npm. Cruthaíonn sé `DATA_DIR/services/9router/` lena chomhaid féin -`package.json` agus `node_modules/`. Ní thagann sé salach ar spleáchais OmniRoute féin. +Suiteáil 9Router ó npm. Cruthaítear `DATA_DIR/services/9router/` lena +`package.json` agus `node_modules/` féin. Ní thagann sé salach ar spleáchais OmniRoute féin. **Corp an iarratais** (iad uile roghnach): @@ -229,26 +231,26 @@ Suiteáil 9Router ó npm. Cruthaíonn sé `DATA_DIR/services/9router/` lena chom | Réimse | Cineál | Réamhshocrú | Cur síos | | --------- | -------- | ----------- | -------------------------------------- | -| `version` | `string` | `"latest"` | clib leagain npm nó semver le suiteáil | +| `version` | `string` | `"latest"` | Clib leagain npm nó semver le suiteáil | **Freagraí:** -| Stádas | Cur síos | -| ------ | --------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Corp iarratais neamhbhailí (teip bhailíochtaithe Zod) | -| `409` | Suiteáil ar siúl cheana (glas á choinneáil) | -| `500` | Theip ar shuiteáil npm — féach `message` le haghaidh earráid sholéite | +| Stádas | Cur síos | +| ------ | ------------------------------------------------------------------------ | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Corp iarratais neamhbhailí (teip bhailíochtaithe Zod) | +| `409` | Suiteáil ar siúl cheana féin (glas á choinneáil) | +| `500` | Theip ar shuiteáil npm — féach `message` le haghaidh earráide sothuigthe | -**Nótaí:** Úsáideann sé `execFile('npm', [...])` — gan bhlaosc, gan idirshuíomh (riail dhocht #13). -Cuirtear earráidí EACCES i láthair mar theachtaireachtaí soléite. +**Nótaí:** Úsáidtear `execFile('npm', [...])` — gan bhlaosc, gan idirshuíomh (riail dhocht #13). +Cuirtear earráidí EACCES i láthair mar theachtaireachtaí sothuigthe. --- #### `POST /api/services/9router/start` -Tosaigh 9Router. Cláraíonn sé maoirseoir mura bhfuil ceann cláraithe cheana, ansin glaonn -sé `supervisor.start()`. Tá sé idéimpitéinseach má tá sé ar siúl cheana. +Tosaigh 9Router. Cláraítear maoirseoir mura bhfuil ceann cláraithe cheana féin, agus ansin glaoitear ar +`supervisor.start()`. Idé-phoitéinseach nuair atá sé ag rith cheana féin. **Corp an iarratais:** faic @@ -256,7 +258,7 @@ sé `supervisor.start()`. Tá sé idéimpitéinseach má tá sé ar siúl cheana | Stádas | Cur síos | | ------ | ------------------------------------------------------- | -| `200` | réad `ServiceStatus` (féach an scéimre thíos) | +| `200` | Oibiacht `ServiceStatus` (féach an scéimre thíos) | | `409` | Níl 9Router suiteáilte (`status: "not_installed"`) | | `503` | Theip ar an tosú (earráid phróisis — féach `lastError`) | @@ -278,8 +280,8 @@ sé `supervisor.start()`. Tá sé idéimpitéinseach má tá sé ar siúl cheana #### `POST /api/services/9router/stop` -Stop 9Router go rianúil. Seolann sé SIGTERM, fanann sé 15 s, ansin seolann sé SIGKILL -má tá an próiseas fós beo. Tá sé idéimpitéinseach má tá sé stoptha cheana. +Stop 9Router go rianúil. Seoltar SIGTERM, fantar 15 s, agus ansin seoltar SIGKILL má tá sé fós beo. +Idé-phoitéinseach nuair atá sé stoptha cheana féin. **Corp an iarratais:** faic @@ -287,26 +289,26 @@ má tá an próiseas fós beo. Tá sé idéimpitéinseach má tá sé stoptha ch | Stádas | Cur síos | | ------ | ---------------------------------- | -| `200` | `ServiceStatus` (staid: "stopped") | +| `200` | `ServiceStatus` (state: "stopped") | | `503` | Theip ar an stopadh gan choinne | --- #### `POST /api/services/9router/restart` -Comhionann le `stop()` agus ansin `start()` faoin nglas oibríochta. +Comhionann le `stop()` agus ansin `start()` faoi ghlas na hoibríochta. **Corp an iarratais:** faic -**Freagraí:** mar an gcéanna le `start` (filleann sé an `ServiceStatus` deiridh). +**Freagraí:** mar an gcéanna le `start` (seoltar an `ServiceStatus` deiridh ar ais). --- #### `POST /api/services/9router/update` -Nuashonraíonn sé 9Router go leagan npm níos nuaí. Má tá an tseirbhís ar siúl, stoptar -í ar dtús, ritear suiteáil npm (ag suiteáil an leagain níos nuaí san áit chéanna), agus -ansin atosaítear an tseirbhís. +Nuashonraítear 9Router go leagan npm níos nuaí. Má tá an tseirbhís ag rith, stoptar í +ar dtús, ritear suiteáil npm (agus an leagan níos nuaí á shuiteáil san áit chéanna), agus ansin +atosaítear an tseirbhís. **Corp an iarratais** (iad uile roghnach): @@ -326,27 +328,27 @@ ansin atosaítear an tseirbhís. #### `POST /api/services/9router/rotate-key` -Gineann sé eochair API nua do 9Router, criptíonn sé í agus í ar fos, agus atosaíonn sé an tseirbhís -(má tá sí ag rith) ionas go bhfaighidh sí an eochair nua óna timpeallacht. Déantar an tseaneochair a -neamhbhailíochtú láithreach. +Gintear eochair API nua do 9Router, criptítear í ar fos, agus atosaítear an tseirbhís +(má tá sí ag rith) ionas go bhfaighidh sí an eochair nua óna timpeallacht. Déantar an tseaneochair +neamhbhailí láithreach. -**Corp an iarratais:** ceann ar bith +**Corp an iarratais:** faic **Freagraí:** | Stádas | Cur síos | | ------ | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Theip ar an rothlú | +| `500` | Theip ar rothlú na heochrach | -**Slándáil:** Ní sheoltar an eochair nua ar ais sa fhreagra riamh (ní sceitear aon dintiúr). -Stóráiltear í agus í criptithe (AES-256-GCM) sa tábla `version_manager`. +**Slándáil:** Ní sheoltar an eochair nua ar ais sa fhreagra riamh (gan aon sceitheadh dintiúr). +Stóráiltear í criptithe (AES-256-GCM) sa tábla `version_manager`. --- #### `GET /api/services/9router/status` -Tugann sé stádas comhcheangailte beo + bunachair sonraí ar ais, lena n-áirítear meiteashonraí leagain agus réamhamharc ar an eochair API. +Seoltar stádas comhcheangailte beo + DB ar ais, lena n-áirítear meiteashonraí leagain agus réamhamharc ar an eochair API. **Freagraí:** @@ -403,10 +405,10 @@ Sruth SSE de logaí beo ó mhaolán fáinne stdout/stderr 9Router. **Paraiméadair iarratais:** -| Paraiméadar | Cineál | Réamhshocrú | Cur síos | -| ----------- | --------- | ------------- | ----------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Cé mhéad líne stairiúil atá le seoladh ar dtús (uasmhéid 1000) | -| `filter` | `string` | ceann ar bith | Scagaire fosthringe nach beann do chás (gan regex — sábháilte ar ReDoS) | +| Paraiméadar | Cineál | Réamhshocrú | Cur síos | +| ----------- | --------- | ----------- | ---------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Líon na línte stairiúla atá le seoladh ar dtús (uasmhéid 1000) | +| `filter` | `string` | faic | Scagaire fotheaghráin nach bhfuil cásíogair (gan regex — sábháilte ar ReDoS) | **Teagmhais SSE:** @@ -431,40 +433,43 @@ Sruth SSE de logaí beo ó mhaolán fáinne stdout/stderr 9Router. | Stádas | Cur síos | | ------ | -------------------------------------------------------- | | `200` | `text/event-stream` | -| `400` | Tá an paraiméadar `filter` rófhada (> 200 carachtar) | +| `400` | Paraiméadar `filter` rófhada (> 200 carachtar) | | `404` | Níor aimsíodh an tseirbhís (níl an maoirseoir cláraithe) | --- ### 4.2 Críochphointí CLIProxyAPI (10 mbealach) -Tá an cruth críochphointe céanna ag CLIProxyAPI agus atá ag 9Router, seachas `rotate-key`, agus -`accounts`, `provider-expose` agus `auto-restart-adopted` curtha leis. Faigheann sé anois -eochair API thiomnaithe don phlána sonraí a instealltar tráth an tsceite (`needsApiKey: true` in -`bootstrap.ts`, a úsáidtear do shioncronú samhlacha); tá níos lú réimsí in `status`. +Tá an struchtúr críochphointe céanna ag CLIProxyAPI agus atá ag 9Router, seachas +`rotate-key`, agus cuirtear `accounts`, `provider-expose` agus `auto-restart-adopted` +leis. Faigheann sé anois eochair API thiomnaithe don phlána sonraí a instealltar +nuair a sheoltar é (`needsApiKey: true` in `bootstrap.ts`, a úsáidtear chun +samhlacha a shioncronú); tá níos lú réimsí in `status`. -| Modh | Conair | Cur síos | -| ------ | ----------------------------------- | -------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Suiteáil CLIProxyAPI ó npm | -| `POST` | `/api/services/cliproxy/start` | Tosaigh CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Stop CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Atosaigh CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Nuashonraigh go leagan níos nuaí | -| `GET` | `/api/services/cliproxy/status` | Stádas beo + bunachair sonraí (gan `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Scoránaigh uath-thosú | +| Modh | Conair | Cur síos | +| ------ | ----------------------------------- | ------------------------------------ | +| `POST` | `/api/services/cliproxy/install` | Suiteáil CLIProxyAPI ó npm | +| `POST` | `/api/services/cliproxy/start` | Tosaigh CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Stop CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Atosaigh CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Nuashonraigh go leagan níos nuaí | +| `GET` | `/api/services/cliproxy/status` | Stádas beo + DB (gan `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Scoránaigh an t-uath-thosú | -Oibríonn an críochphointe comhroinnte `GET /api/services/{name}/logs` (féach §4.1) do gach ceann de na -ceithre sheirbhís agus an mhír dhinimiciúil `[name]` á húsáid. +Oibríonn an críochphointe comhroinnte `GET /api/services/{name}/logs` (féach §4.1) +do na ceithre sheirbhís ar fad agus an deighleog dhinimiciúil `[name]` á húsáid. --- ### 4.3 Críochphointí Mux (8 mbealach) -Tá an cruth críochphointe céanna ag Mux agus atá ag CLIProxyAPI — níl aon bhealach `rotate-key` sa chomhéadan -API (gintear an comhartha iompróra ar an mbealach céanna le ceann 9Router trí -`getOrCreateApiKey("mux")` agus instealltar é tríd an athróg timpeallachta `MUX_SERVER_AUTH_TOKEN`, ach -níl aon chríochphointe tiomnaithe rothlaithe ann go fóill). Ní bhainistítear ach saolré Mux: murab ionann agus -9Router, níl aon seiceadóir Sraith 4 aige agus ní chláraítear mar sholáthraí ródúcháin riamh é. +Tá an struchtúr críochphointe céanna ag Mux agus atá ag CLIProxyAPI — níl bealach +`rotate-key` sa dromchla API (gineann `getOrCreateApiKey("mux")` an comhartha +iompróra ar an mbealach céanna le comhartha 9Router agus instealltar é tríd an +athróg timpeallachta `MUX_SERVER_AUTH_TOKEN`, ach níl críochphointe tiomnaithe +rothlaithe ann fós). Ní bhainistítear ach saolré Mux: murab ionann agus 9Router, +níl aon seiceadóir Sraith 4 aige agus ní chláraítear riamh é mar sholáthraí +ródaithe. | Modh | Conair | Cur síos | | ------ | ------------------------------ | ------------------------------------ | @@ -473,46 +478,85 @@ níl aon chríochphointe tiomnaithe rothlaithe ann go fóill). Ní bhainistítea | `POST` | `/api/services/mux/stop` | Stop Mux | | `POST` | `/api/services/mux/restart` | Atosaigh Mux | | `POST` | `/api/services/mux/update` | Nuashonraigh go leagan npm níos nuaí | -| `GET` | `/api/services/mux/status` | Stádas beo + bunachair sonraí | -| `POST` | `/api/services/mux/auto-start` | Scoránaigh uath-thosú | +| `GET` | `/api/services/mux/status` | Stádas beo + DB | +| `POST` | `/api/services/mux/auto-start` | Scoránaigh an t-uath-thosú | --- ### 4.4 Críochphointí Bifrost (8 mbealach) -Is inneall sealaíochta geata IS in Go é Bifrost (`@maximhq/bifrost`). Úsáideann sé an cruth -críochphointe céanna le CLIProxyAPI (gan `rotate-key` — bainistíonn Bifrost a chuid eochracha soláthraí -féin in `config.json` faoina `-app-dir`). - -| Modh | Conair | Cur Síos | -| ------ | ---------------------------------- | ---------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Suiteáil Bifrost ó npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Tosaigh Bifrost ar phort 8080 (réamhshocrú) | -| `POST` | `/api/services/bifrost/stop` | Stop Bifrost | -| `POST` | `/api/services/bifrost/restart` | Atosaigh Bifrost | -| `POST` | `/api/services/bifrost/update` | Nuashonraigh go leagan níos nuaí | -| `GET` | `/api/services/bifrost/status` | Stádas beo + bunachar sonraí | -| `POST` | `/api/services/bifrost/auto-start` | Scoránaigh an t-uath-thosú | -| `GET` | `/api/services/bifrost/logs` | Deireadh loga SSE (tríd an róda dinimiciúil comhroinnte `[name]/logs`) | - -**Sreangú ródaithe:** Nuair nach bhfuil `BIFROST_BASE_URL` socraithe agus atá an ásc -maoirsithe Bifrost ag rith, úsáideann `getBifrostRoutingConfig()` (in `routingBackend.ts`) -`http://127.0.0.1:{port}` go huathoibríoch mar bhun-URL an athsheachadáin. Bíonn tosaíocht -i gcónaí ag an athróg timpeallachta shainráite `BIFROST_BASE_URL`. - ---- - -### 4.5 Críochphointí Dario (12 róda) - -An cruth saolré céanna leis na seirbhísí eile (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`) chomh maith le plána rialaithe -OAuth faoi `admin/`, atá cosanta le comhartha: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (iad uile taobh thiar de `DARIO_ADMIN_TOKEN`). - -### 4.6 Seachfhreastalaí droim ar ais (leabú deais 9Router) - -Leabaíonn an deais comhéadan gréasáin 9Router taobh istigh de iframe trí sheachfhreastalaí -droim ar ais inmheánach ag: +Is inneall sealaíochta tairsí IS in Go é Bifrost (`@maximhq/bifrost`). Úsáideann +sé an struchtúr críochphointe céanna le CLIProxyAPI (gan `rotate-key` — bainistíonn +Bifrost a eochracha soláthraí féin in `config.json` faoina `-app-dir`). + +| Modh | Conair | Cur síos | +| ------ | ---------------------------------- | --------------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Suiteáil Bifrost ó npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Tosaigh Bifrost ar phort 8080 (réamhshocrú) | +| `POST` | `/api/services/bifrost/stop` | Stop Bifrost | +| `POST` | `/api/services/bifrost/restart` | Atosaigh Bifrost | +| `POST` | `/api/services/bifrost/update` | Nuashonraigh go leagan níos nuaí | +| `GET` | `/api/services/bifrost/status` | Stádas beo + DB | +| `POST` | `/api/services/bifrost/auto-start` | Scoránaigh an t-uath-thosú | +| `GET` | `/api/services/bifrost/logs` | Eireaball loga SSE (tríd an mbealach dinimiciúil comhroinnte `[name]/logs`) | + +**Sreangú ródaithe:** Nuair nach bhfuil `BIFROST_BASE_URL` socraithe agus an +t-ásc Bifrost atá faoi mhaoirseacht ar siúl, úsáideann +`getBifrostRoutingConfig()` (in `routingBackend.ts`) `http://127.0.0.1:{port}` +go huathoibríoch mar bhun-URL an tseachadáin. Bíonn tosaíocht i gcónaí ag athróg +timpeallachta shainráite `BIFROST_BASE_URL`. + +--- + +### 4.5 Críochphointí Dario (12 bhealach) + +An struchtúr saolré céanna leis na seirbhísí eile (`install`, `start`, `stop`, +`restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`), chomh maith +le plána rialaithe OAuth faoi `admin/` a bhfuil comhartha riachtanach dó: +`admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, +`admin/login-complete` (iad uile faoi chosaint `DARIO_ADMIN_TOKEN`). + +### 4.6 Críochphointí open-wa (7 mbealach) + +Tiomáineann open-wa (`@open-wa/wa-automate`) ásc Chromium gan chomhéadan grafach +(trí Puppeteer) chun WhatsApp Web a uathoibriú. Úsáideann sé an struchtúr +críochphointe céanna le Mux (níl bealach `rotate-key` ann fós). Ní bhainistítear +ach a shaolré — ní sprioc ródaithe é, agus níl aon seiceadóir Sraith 4 ná iontráil +soláthraí aige. + +| Modh | Conair | Cur síos | +| ------ | --------------------------------- | ------------------------------------------------------------------ | +| `POST` | `/api/services/openwa/install` | Suiteáil open-wa ó npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Tosaigh open-wa ar phort 8323 (réamhshocrú) | +| `POST` | `/api/services/openwa/stop` | Stop open-wa | +| `POST` | `/api/services/openwa/restart` | Atosaigh open-wa | +| `POST` | `/api/services/openwa/update` | Nuashonraigh go leagan níos nuaí | +| `GET` | `/api/services/openwa/status` | Stádas beo + DB | +| `POST` | `/api/services/openwa/auto-start` | Scoránaigh an t-uath-thosú | +| `GET` | `/api/services/openwa/logs` | Deireadh loga SSE (trí róda dinimiciúil comhroinnte `[name]/logs`) | + +**Eochair API:** insteallta mar `WA_KEY` — mapálann sárú cineálach athróige +timpeallachta open-wa, leis an réimír `WA_*`, í chuig an rogha CLI `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, fíoraithe i gcoinne an phacáiste suiteáilte +4.76.0). Cuirtear an réimír `ow_` léi nuair a ghineann +`generateServiceApiKey()` í. Léann open-wa an eochair ar ais ó cheanntásc HTTP +`key`/`api_key` (ní ó `Authorization: Bearer`); tá `/api-docs*` díolmhaithe go +sainráite ón tseiceáil (`setupAuthenticationLayer` in +`dist/cli/server.js`), mar sin ní theastaíonn ceanntásc fíordheimhnithe ón +tóireadóir sláinte. + +**Péireáil:** tá open-wa neamhoifigiúil agus níl sé cleamhnaithe le WhatsApp — +tá baol ann go gcuirfidh WhatsApp cosc ar an uimhir nasctha mar gheall ar a +bhrath uathoibrithe féin. Ar an gcéad tosú, priontáiltear an cód QR péireála +chuig stdout agus cuirtear ar fáil é tríd an bpainéal Logaí/sruth SSE atá ann +cheana — níl aon chríochphointe tiomnaithe d’íomhá QR sa chomhtháthú seo fós. + +--- + +### 4.7 Seachfhreastalaí droim ar ais (leabú dheais 9Router) + +Leabaíonn an deais comhéadan gréasáin 9Router laistigh de iframe trí +sheachfhreastalaí inmheánach droim ar ais ag: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -520,18 +564,19 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Déanann an seachfhreastalaí seo na nithe seo a leanas: -- Cuireann sé an t-iarratas ar aghaidh chuig `http://127.0.0.1:{port}/{path}` (aislúb amháin) -- Baintear na ceanntásca isteach `cookie` agus `authorization` (gan aon sceitheadh ó sheisiún OmniRoute) -- Insteallann sé `Authorization: Bearer {apiKey}` le haghaidh fíordheimhniú 9Router -- Baintear `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` den fhreagra -- Athscríobhann sé freagraí HTML chun `` a instealladh agus dearbhchonairí a normalú (`/foo` → `/dashboard/.../embed/foo`) +- Cuireann sé an t-iarratas ar aghaidh chuig `http://127.0.0.1:{port}/{path}` (aischúrsáil amháin) +- Baineann sé na ceanntásca isteach `cookie` agus `authorization` (gan seisiún OmniRoute a sceitheadh) +- Insteallann sé `Authorization: Bearer {apiKey}` le haghaidh fhíordheimhniú 9Router +- Baineann sé `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` den fhreagra +- Athscríobhann sé freagraí HTML chun `` a instealladh agus conairí absalóideacha a normalú (`/foo` → `/dashboard/.../embed/foo`) -Láimhseálann freastalaí compánach ar phort tiomnaithe uasghráduithe WebSocket don deais -leabaithe (féach `src/lib/services/embedWsProxy.ts`). +Láimhseálann freastalaí compánach ar phort tiomnaithe uasghráduithe WebSocket don +deais leabaithe (féach `src/lib/services/embedWsProxy.ts`). -**Slándáil:** Aicmítear ródaí an tseachfhreastalaí leabaithe faoi `LOCAL_ONLY_API_PREFIXES` -agus ní féidir teacht orthu ach ón aislúb. Ní féidir le hionsaitheoir a fhaigheann JWT trí -thollán Cloudflare/Ngrok seachfhreastalaíocht a dhéanamh isteach i seirbhísí leabaithe. +**Slándáil:** aicmítear na róid seachfhreastalaí leabaithe faoi +`LOCAL_ONLY_API_PREFIXES` agus ní féidir iad a rochtain ach ón aischúrsáil. Ní +féidir le hionsaitheoir a fhaigheann JWT trí thollán Cloudflare/Ngrok +seachfhreastalú isteach i seirbhísí leabaithe. --- diff --git a/docs/i18n/ga/docs/frameworks/MEMORY.md b/docs/i18n/ga/docs/frameworks/MEMORY.md index 49c3cf8f9397..0341ee20d2b9 100644 --- a/docs/i18n/ga/docs/frameworks/MEMORY.md +++ b/docs/i18n/ga/docs/frameworks/MEMORY.md @@ -169,31 +169,33 @@ Stórálann an tábla `memory_vec_meta` (aistriú `083_memory_vec.sql`): Tá naoi réimse leabaithe agus veicteora ar fáil in `MemorySettingsExtended` in `src/shared/schemas/memory.ts`, agus déantar iad a bhuanú trí `src/lib/db/settings.ts`: -| Réimse | Cineál | Réamhshocrú | Cur síos | -| ------------------------ | -------------------------------------------------- | ----------- | -------------------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Cén fhoinse leabaithe atá le húsáid | -| `embeddingProviderModel` | `string \| null` | `null` | Soláthraí/samhail i bhformáid `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | Bun-URL críochphointe atá comhoiriúnach le OpenAI agus don Chuimhne amháin | -| `customModelId` | `string \| null` | `null` | Aitheantas na samhla a sheoltar chuig an gcríochphointe saincheaptha | -| `transformersEnabled` | `boolean` | `false` | Rogha ghlactha isteach do Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Rogha ghlactha isteach don tsamhail áitiúil statach potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Cumasaigh an chéim athrangaithe (cuireann sí +200-500ms/iarratas leis) | -| `rerankProviderModel` | `string \| null` | `null` | Soláthraí/samhail athrangaithe i bhformáid `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Cén inneall stórála veicteora atá le húsáid | +| Réimse | Cineál | Réamhshocrú | Cur síos | +| ------------------------ | -------------------------------------------------- | ----------- | -------------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | An fhoinse leabaithe atá le húsáid | +| `embeddingProviderModel` | `string \| null` | `null` | Soláthraí/samhail i bhformáid `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | Bun-URL críochphointe comhoiriúnach le OpenAI, don chuimhne amháin | +| `customModelId` | `string \| null` | `null` | Aitheantas na samhla a sheoltar chuig an gcríochphointe saincheaptha | +| `transformersEnabled` | `boolean` | `false` | Rogha chun Transformers.js a úsáid (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Rogha chun samhail áitiúil statach potion-base-8M a úsáid | +| `rerankEnabled` | `boolean` | `false` | Cumasaigh céim athrangaithe (cuireann sé +200-500ms/req leis) | +| `rerankProviderModel` | `string \| null` | `null` | Soláthraí/samhail athrangaithe i bhformáid `provider/model` | + +Déantar `rerankProviderModel` a réiteach le `POST /v1/rerank` (a ghlaoitear thar loopback), mar sin glacann sé le haon rud a nglacann an bealach sin leis: samhail athrangaithe néil roghnaithe (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) nó nód soláthraí atá comhoiriúnach le OpenAI mar `/` (m.sh. `skilled-mini/bge-reranker-v2-m3` do bhosca TEI/Infinity). Bíonn nóid loopback incháilithe i gcónaí; i gcás nód ar óstach eile (LAN, Tailscale), teastaíonn an bhratach ghné `RERANK_REMOTE_PROVIDER_NODES` freisin agus ní mór dó polasaí URL amach an tsoláthraí a chomhlíonadh — féach [Bratacha Gné](../reference/FEATURE_FLAGS.md). Liostaíonn roghnóir an deais soláthraithe roghnaithe chomh maith le nóid áitiúla; is féidir aon teaghrán bailí `provider/model` a shocrú go díreach trí `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | An t-inneall veicteora atá le húsáid | Nochtar iad seo trí `GET /PUT /api/settings/memory` (scéimre `MemorySettingsExtendedSchema`). Maidir leis an bhfoinse `remote`, glacann Memory leis na socruithe roghnacha `customBaseUrl` agus `customModelId` freisin. Le chéile, roghnaíonn siad críochphointe `/embeddings` -agus samhail atá comhoiriúnach le OpenAI gan an chlárlann leabaithe dhomhanda a athrú. Déantar an críochphointe a -normalú sula n-úsáidtear é agus déantar é a sheiceáil de réir bheartas URLanna amach an tsoláthraí: tá HTTP(S) -riachtanach, diúltaítear do dhintiúir leabaithe agus do theaghráin iarratais, agus fanann seoltaí -meiteashonraí néil bactha. Caomhnaíonn luachanna folmha soláthraí roghnaithe na clárlainne. Déantar earráidí -a chuirtear ar ais chuig an deais a shláintiú agus ní logáiltear dintiúir an chríochphointe riamh. +atá comhoiriúnach le OpenAI agus samhail gan an chlárlann leabaithe dhomhanda a athrú. Déantar an críochphointe a +normalú sula n-úsáidtear é agus seiceálann polasaí URL amach an tsoláthraí é: tá HTTP(S) +riachtanach, diúltaítear do dhintiúir leabaithe agus do theaghráin iarratais, agus fanann +seoltaí meiteashonraí néil blocáilte. Caomhnaíonn luachanna folmha an soláthraí clárlainne roghnaithe. Déantar earráidí +a chuirtear ar ais chuig an deais a shláintiú agus ní logáiltear dintiúir críochphointe riamh. -> **TODO (D20):** Níl an scóip `global` (cuimhní a chomhroinnt thar gach eochair API) +> **LE DÉANAMH (D20):** Níl an scóip `global` (cuimhní a chomhroinnt thar gach eochair API) > curtha i bhfeidhm san eisiúint seo. Teastaíonn athruithe scéimre agus conair aisghabhála -> dhomhanda chuige. Rianaigh ar leithligh é. +> dhomhanda uaithi. Rianaigh ar leithligh í. ## Sraitheanna Stórála diff --git a/docs/i18n/ga/docs/guides/DOCKER_GUIDE.md b/docs/i18n/ga/docs/guides/DOCKER_GUIDE.md index 53ac29bbf97a..4e70a481faf2 100644 --- a/docs/i18n/ga/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/ga/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Rith Thapa +> **Féinóstáil le hordú amháin?** Féach ar an +> [Treoir Féinóstála](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (íomhá fhoilsithe + +> Redis, aischúb amháin, gan rogha próifíle). Is é an Rith Thapa thíos an +> chonair aon-choimeádáin d’úsáideoirí a ritheann Redis in áit eile cheana féin. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/ga/docs/guides/TROUBLESHOOTING.md b/docs/i18n/ga/docs/guides/TROUBLESHOOTING.md index 695331d6958c..9f018c098f44 100644 --- a/docs/i18n/ga/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/ga/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ Socraigh iad seo i dtimpeallacht phróiseas OmniRoute (an deamhan, m.sh. tríd a --- -## Rabhaidh npm install (ERESOLVE / piara / dímholta) +## Rabhaidh `npm install` (ERESOLVE / piara / dímholta) Nuair a ritheann tú `npm install -g omniroute`, seans go bhfeicfidh tú lear mór rabhaidh amhail `npm warn ERESOLVE`, fógraí faoi spleáchais phiara, agus teachtaireachtaí `deprecated`. **Tá siad seo ionchais agus neamhdhíobhálach.** D’éirigh le do shuiteáil má fheiceann tú `added packages` san aschur. -Tagann na rabhaidh ó raonta spleáchais phiara atá as dáta i bpacáistí tríú páirtí nach bhfuil faoi rialú OmniRoute: +Chun na rabhaidh faoi réiteach spleáchas piara a cheilt, úsáid an fhoirm shuiteála a dtacaíonn OmniRoute léi: -1. **Teastaíonn `marked >=1 <16` ó `marked-terminal`, ach aimsíodh `marked@18`** — oibríonn sé gan fadhb go praiticiúil; níl ach an raon piara réamhtheachtach as dáta. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +Ní cheileann `--legacy-peer-deps` ach `ERESOLVE` agus fógraí faoi spleáchais phiara. Fanann fógraí dímholtachta infheicthe toisc go dtagann siad ó phacáistí trasdultacha tríú páirtí; ní thugann siad le fios gur theip ar an tsuiteáil. + +Tagann na rabhaidh ó raonta spleáchas piara atá as dáta i bpacáistí tríú páirtí nach bhfuil faoi smacht OmniRoute: + +1. **Teastaíonn `marked >=1 <16` ó `marked-terminal`, ach aimsíodh `marked@18`** — oibríonn sé go breá sa chleachtas; níl ach an raon piara réamhtheachtach as dáta. 2. **`deprecated prebuild-install@7.1.3`** — uirlis chúnta thrasdultach chun dénártha dúchasacha a fháil. Ní úsáidtear í - chun an ceangal iompair `wreq-js` pionnáilte a shuiteáil agus ní thugann sí le fios gur theip ar - shocrú iompair sholáthraí na bhfianán gréasáin. + chun an ceangal iompair pionnáilte `wreq-js` a shuiteáil agus ní thugann sí le fios gur theip ar chumraíocht iompair + sholáthraí na bhfianán gréasáin. -**Ní gá aon ghníomh a dhéanamh** — ní féidir na rabhaidh a chur faoi chois go hiomlán gan gabhlacha a chruthú de na pacáistí réamhtheachtacha. +**Ní gá aon ghníomh a dhéanamh** — ní féidir na rabhaidh a cheilt go hiomlán gan forc a dhéanamh de na pacáistí réamhtheachtacha. --- diff --git a/docs/i18n/ga/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/ga/docs/providers/CURSOR-API-KEY-AND-CLI.md index 188528247077..4d0740af5843 100644 --- a/docs/i18n/ga/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/ga/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -7,38 +7,37 @@ Dhá bhealach chun Cursor a chur taobh thiar de OmniRoute gan seisiún IDE: 1. **Soláthraí `cursor-api`** (cárta "Cursor API", ailias `cua`): soláthraí eochrach API - ina gcoinnítear eochair API úsáideora Cursor (`crsr_…`, arna giniúint ag - `https://cursor.com/dashboard/api`). Is féidir le cliant OmniRoute ar bith ansin - samhlacha Cursor a rochtain trí `/v1/chat/completions` mar `cursor-api/` nó - `cua/`, leis na gnáthshraitheanna cuóta, cúltaca agus logála. Níl aon athrú - ar an soláthraí IDE (`cursor`, seisiún OAuth/IDE). -2. **Tréchur Cursor CLI**: dírigh Cursor CLI (`agent`) ar OmniRoute ionas go - bhfíordheimhnítear gach RPC a dhéanann an CLI le heochair API OmniRoute, go gcuirtear - ar aghaidh chuig Cursor é le dintiúr naisc `cursor-api`, agus go dtaifeadtar é ar an - leathanach Logaí. + a choinníonn eochair API úsáideora Cursor (`crsr_…`, a ghintear ag + `https://cursor.com/dashboard/api`). Is féidir le cliant OmniRoute ar bith ansin samhlacha + Cursor a rochtain trí `/v1/chat/completions` mar `cursor-api/` nó + `cua/`, leis na gnáthshraitheanna cuóta, cúltaca agus logála. Níl aon athrú ar an soláthraí + IDE (`cursor`, seisiún OAuth/IDE). +2. **Pas-trí Cursor CLI**: treoraigh Cursor CLI (`agent`) chuig OmniRoute ionas + go bhfíordheimhnítear gach RPC a dhéanann an CLI le heochair API OmniRoute, go gcuirtear ar aghaidh + chuig Cursor é le dintiúr naisc `cursor-api`, agus go dtaifeadtar é ar an + leathanach Logs. ## Cén fáth a malartaítear an eochair -Diúltaíonn `api2.cursor.sh` d'eochair amh `crsr_…` mar chomhartha Bearer (401). Déanann -Cursor CLI POST den eochair chuig `/auth/exchange_user_api_key` ar dtús agus faigheann -sé JWT seisiúin a théann in éag tar éis uair an chloig; tá an `exp` céanna ag an -`refreshToken` a chuirtear ar ais, mar sin is gá an eochair a athmhalartú chun é a athnuachan. -Déanann `open-sse/services/cursorApiKeyAuth.ts` an malartú sin, taisceann sé comhartha -seisiúin amháin in aghaidh na heochrach, athmhalartaíonn sé cúig nóiméad roimh dhul in éag -agus scriosann sé an comhartha taiscthe nuair a fhreagraíonn Cursor le 401. Glaonn -`CursorExecutor` air díreach sula n-osclaítear an sruth réamhtheachtach do naisc -`cursor-api`. +Diúltaíonn `api2.cursor.sh` d’eochair amh `crsr_…` mar chomhartha Bearer (401). Déanann Cursor +CLI POST den eochair chuig `/auth/exchange_user_api_key` ar dtús agus faigheann sé JWT seisiúin +a théann in éag tar éis uair an chloig; bíonn an `exp` céanna ag an `refreshToken` +a chuirtear ar ais, mar sin is gá an eochair a mhalartú arís chun athnuachan a dhéanamh. +Déanann `open-sse/services/cursorApiKeyAuth.ts` an malartú sin, taisceann sé comhartha seisiúin +amháin in aghaidh na heochrach, déanann sé athmhalartú cúig nóiméad roimh dhul in éag agus scriosann sé an +comhartha taiscthe nuair a fhreagraíonn Cursor le 401. Glaonn `CursorExecutor` air díreach sula n-osclaítear +an sruth réamhtheachtach do naisc `cursor-api`. ## An soláthraí `cursor-api` Clárlann: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, an `format`, `baseUrl` agus +(`cursor_apiProvider`, `authType: "apikey"`, na `format`, `baseUrl` agus `models` céanna le `cursor`). Cárta catalóige: -`src/shared/constants/providers/apikey/specialty-media.ts`. Léarscáil seiceadóirí: +`src/shared/constants/providers/apikey/specialty-media.ts`. Léarscáil riteora: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Painéal: Soláthraithe → Cursor API → Cuir eochair API leis. +Painéal: Providers → Cursor API → Add API key. REST: @@ -59,31 +58,45 @@ curl -sS http://localhost:20128/v1/chat/completions \ Nótaí: -- Tagann liostú na samhlacha do `cursor-api` ó chlárlann statach Cursor (an - liosta céanna a úsáideann an soláthraí IDE mar chúltaca); ní gá `cursor-agent` - a shuiteáil ar óstach OmniRoute. -- Is don soláthraí IDE `cursor` amháin atá `POST /api/providers/{id}/refresh-cursor`; +- Tagann liostú samhlacha do `cursor-api` ó chlárlann statach Cursor (an + liosta céanna a úsáideann an soláthraí IDE mar chúltaca); ní gá `cursor-agent` a shuiteáil + ar óstach OmniRoute. +- Is don soláthraí IDE `cursor` amháin é `POST /api/providers/{id}/refresh-cursor`; níl aon seisiún IDE le hathnuachan ag naisc `cursor-api`. -## Tréchur Cursor CLI +## Aitheantais dhúchasacha samhlacha agus leibhéal iarrachta + +I gcás `cursor` / `cu` agus `cursor-api` / `cua`, fágann comhnormalaitheoir iarrachta Claude +aitheantas iarrtha na samhla gan athrú. Is féidir le Cursor iarmhír amhail +`-low` a fhógairt mar chuid d’aitheantas fíor samhla, seachas mar ailias iarrachta OmniRoute. +Caomhnaíonn riteoir Cursor meaitseáil bheacht leis an gcatalóg bheo; nuair nach bhfuil aon +mheaitseáil ann, láimhseálann a réiteoir samhla reatha an tiontú cúltaca ó iarmhír go paraiméadar. + +Ní athraíonn sé seo normalú iarrachta do bhealaí díreacha Claude, do bhealaí atá +comhoiriúnach le Claude, ná do bhealaí Vertex. Braitheann infhaighteacht fós ar chatalóg agus +ar theidlíocht an chuntais Cursor roghnaithe. + +## Seoladh tríd Cursor CLI Bealach: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Tá an réimír `/api/cursor-cli/` -cláraithe in `src/shared/constants/publicApiRoutes.ts` toisc go bhforfheidhmíonn an láimhseálaí -a fhíordheimhniú féin: +cláraithe in `src/shared/constants/publicApiRoutes.ts` toisc go +bhforfheidhmíonn an láimhseálaí a fhíordheimhniú féin: -| Conair | Fíordheimhniú a bhfuil an CLI ag súil leis | Cad a dhéanann OmniRoute | -| ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Bailíochtaíonn sé an eochair, gineann sé JWT HS256 1u (sínithe le `JWT_SECRET`) agus cuireann sé ar ais é | -| gach conair eile (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Fíoraíonn sé eisitheoir/lucht éisteachta/dul in éag, roghnaíonn sé nasc gníomhach `cursor-api`, malartaíonn sé an ceanntásc Authorization don chomhartha Cursor malartaithe agus sruthaíonn sé an freagra ar ais | +| Conair | Fíordheimhniú a bhfuiltear ag súil leis ón CLI | An méid a dhéanann OmniRoute | +| ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Bailíochtaíonn sé an eochair, eisíonn sé JWT HS256 a mhaireann 1u (sínithe le `JWT_SECRET`) agus seolann sé ar ais é | +| gach conair eile (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Fíoraíonn sé an t-eisitheoir/an spriocphobal/an dáta éaga, roghnaíonn sé ceangal gníomhach `cursor-api`, cuireann sé an comhartha Cursor malartaithe sa cheanntásc Authorization agus sruthaíonn sé an freagra ar ais | -Díchódaíonn an CLI `exp` ó cibé comhartha a fhaigheann sé, mar sin má thugtar comhartha -teimhneach dó, athmhalartóidh sé é roimh bheagnach gach iarratas; seachnaíonn an JWT -ginithe é sin. Má fhaigheann an CLI 401 ó OmniRoute, déanann sé malartú arís. +Díchódaíonn an CLI `exp` as cibé comhartha a fhaigheann sé, mar sin má thugtar +comhartha teimhneach dó, déanann sé malartú arís roimh bheagnach gach iarratas; +seachnaíonn an JWT eisithe é sin. Má fhaigheann sé 401 ó OmniRoute, déanann an +CLI malartú arís. -### Cumraíocht +### Socrú -1. Cruthaigh eochair API OmniRoute (Painéal → Eochracha API) agus nasc `cursor-api`. +1. Cruthaigh eochair API OmniRoute (Painéal → Eochracha API) agus ceangal + `cursor-api`. 2. Abair leis an CLI HTTP/1.1 a úsáid do shruth an ghníomhaire. In `~/.cursor/cli-config.json`: @@ -91,9 +104,9 @@ ginithe é sin. Má fhaigheann an CLI 401 ó OmniRoute, déanann sé malartú ar { "network": { "useHttp1ForAgent": true } } ``` - Gan é seo, osclaíonn an CLI seal an ghníomhaire thar HTTP/2 chuig óstach gníomhaire - atá cumraithe ar leithligh agus ní théann ach RPCanna an phlána rialaithe tríd an - gcríochphointe. + Gan é seo, osclaíonn an CLI seal an ghníomhaire thar HTTP/2 chuig óstach + gníomhaire atá cumraithe ar leithligh agus ní théann ach RPCanna an phlána + rialaithe tríd an gcríochphointe. 3. Rith an CLI in aghaidh OmniRoute: @@ -103,19 +116,19 @@ ginithe é sin. Má fhaigheann an CLI 401 ó OmniRoute, déanann sé malartú ar agent -p --trust "Reply with exactly OK" ``` -Téann gach céim isteach sna Logaí mar sholáthraí `cursor-api`, cineál iarratais `cursor-cli`, -conair `/api/cursor-cli/`, agus cuirtear i leith eochair API OmniRoute agus an -naisc a d'fhreastail air é. - -### Modhanna teipe - -| Cás | Freagra don CLI | -| --------------------------------------------------------- | ----------------------------------------------------- | -| Eochair OmniRoute anaithnid agus `REQUIRE_API_KEY=true` | 401 `unauthenticated` le linn an mhalartaithe | -| `REQUIRE_API_KEY=false` | seisiún anaithnid (a léiríonn iompar `/v1/*`) | -| JWT seisiúin atá imithe in éag / eachtrach / cúbláilte | 401, déanann an CLI athmhalartú | -| Eochair API OmniRoute cúlghairthe tar éis an mhalartaithe | 401 ar an gcéad RPC eile | -| Gan aon cheangal gníomhach `cursor-api` | 503 `unavailable` | -| Diúltaíonn Cursor d'eochair an cheangail | 401 `unauthenticated`, scriostar an seisiún i dtaisce | -| Ní féidir an córas réamhtheachtach a bhaint amach | 502 `unavailable` (teachtaireacht sláintithe) | -| `JWT_SECRET` gan socrú | 503 le linn an mhalartaithe | +Taispeántar gach céim sna Logaí leis an soláthraí `cursor-api`, leis an gcineál +iarratais `cursor-cli`, agus leis an gconair `/api/cursor-cli/`, agus í +curtha i leith eochair API OmniRoute agus an cheangail a rinne freastal uirthi. + +### Módanna teipe + +| Cás | Freagra don CLI | +| ------------------------------------------------------- | ---------------------------------------------------- | +| Eochair anaithnid OmniRoute agus `REQUIRE_API_KEY=true` | 401 `unauthenticated` le linn an mhalartaithe | +| `REQUIRE_API_KEY=false` | seisiún gan ainm (ar aon dul le hiompar `/v1/*`) | +| JWT seisiúin atá imithe in éag / eachtrach / cúbláilte | 401, déanann an CLI malartú arís | +| Eochair API OmniRoute cúlghairthe tar éis malartaithe | 401 ar an gcéad RPC eile | +| Gan aon cheangal gníomhach `cursor-api` | 503 `unavailable` | +| Diúltaíonn Cursor d’eochair an cheangail | 401 `unauthenticated`, baintear an seisiún ón taisce | +| Ní féidir an córas réamhtheachtach a bhaint amach | 502 `unavailable` (teachtaireacht slánaithe) | +| `JWT_SECRET` gan socrú | 503 le linn an mhalartaithe | diff --git a/docs/i18n/ga/docs/reference/API_REFERENCE.md b/docs/i18n/ga/docs/reference/API_REFERENCE.md index c5d902b84ccc..c43fe83ffad6 100644 --- a/docs/i18n/ga/docs/reference/API_REFERENCE.md +++ b/docs/i18n/ga/docs/reference/API_REFERENCE.md @@ -413,68 +413,90 @@ Bain úsáid as an bhfeidhmchlár seo nuair a rithíonn sidecar lasmuigh den phr --- -## Feidhmeanna Comhoiriúnachta - -| Modh | Cosán | Formáid | -| ---- | ----------------------------------------- | ------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (edit/inpaint) | -| POST | `/v1/videos/generations` | Gineadh físeán ar stíl OpenAI | -| POST | `/v1/music/generations` | Gineadh ceol ar stíl OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (fillfidh corp fuaime) | -| POST | `/v1/rerank` | Athrangement ar stíl Cohere/Voyage | -| POST | `/v1/classify` | Aicmigh Jina (`api.jina.ai`) | -| POST | `/v1/segment` | Deighilteoir Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | Modhnuithe OpenAI | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Ailias catalóige OpenAI | -| GET | `/api/v1/vscode/{token}/models` | Ailias múnlaí OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | Ailias tógála OpenAI | -| POST | `/api/v1/vscode/{token}/responses` | Ailias tógála OpenAI Responses | -| POST | `/api/v1/vscode/{token}/api/chat` | Ailias tógála Ollama | -| GET | `/api/v1/vscode/{token}/api/tags` | Ailias tógála clibeanna Ollama | - -Leanann gach cosán POST an chéanna: `Bearer your-api-key` + corp JSON atá bailíochta ag Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, srl., féach `src/shared/validation/schemas.ts`). Filleann 4xx ar theip scéime. - -Do chliaint nach féidir leo `Authorization: Bearer ...` a cheangal, glactha le eochracha API freisin i URL trí áiseanna comhoiriúnachta sreangfhiarróta (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) nó na feidhmeanna speisialta `/api/v1/vscode/{token}/...` atá dhoiciméadaithe thíos. +## Críochphointí Comhoiriúnachta + +| Modh | Conair | Formáid | +| ---- | ----------------------------------------- | ---------------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | Freagraí OpenAI | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | Íomhánna OpenAI | +| POST | `/v1/images/edits` | Íomhánna OpenAI (eagarthóireacht/inphéinteáil) | +| POST | `/v1/videos/generations` | Giniúint físe ar stíl OpenAI | +| POST | `/v1/music/generations` | Giniúint ceoil ar stíl OpenAI | +| POST | `/v1/audio/transcriptions` | Fuaim OpenAI (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (tugann sé corp fuaime ar ais) | +| POST | `/v1/rerank` | Athrangú ar stíl Cohere/Voyage | +| POST | `/v1/classify` | Aicmiú Jina (`api.jina.ai`) | +| POST | `/v1/segment` | Deighilteoir Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | Modhnóireacht OpenAI | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | Ailias catalóige OpenAI | +| GET | `/api/v1/vscode/{token}/models` | Ailias samhlacha OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | Ailias comharthaíochta OpenAI | +| POST | `/api/v1/vscode/{token}/responses` | Ailias comharthaíochta Freagraí OpenAI | +| POST | `/api/v1/vscode/{token}/api/chat` | Ailias comharthaíochta Ollama | +| GET | `/api/v1/vscode/{token}/api/tags` | Ailias comharthaíochta clibeanna Ollama | + +Leanann gach bealach POST an struchtúr céanna: `Bearer your-api-key` + corp JSON bailíochtaithe ag Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, srl., féach `src/shared/validation/schemas.ts`). Tugtar 4xx ar ais má theipeann ar an scéimre. + +I gcás cliant nach féidir leo `Authorization: Bearer ...` a cheangal, glacann OmniRoute le heochracha API san URL freisin, trí chomhoiriúnacht teaghráin iarratais (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) nó trí na críochphointí tiomnaithe `/api/v1/vscode/{token}/...` atá doiciméadaithe thíos. ```bash -# Athrangement +# Athrangú (soláthraí clárlainne néil, nó nód soláthraí atá comhoiriúnach le OpenAI mar "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Aicmigh Jina (Cúigí Aiceanáise) +# Aicmiú Jina (dintiúir Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Deighilteoir Jina POST /v1/segment { "content": "...", "return_chunks": true } -# Cuardach Jina (s.jina.ai; ainmneacha soláthraithe: jina-search, jina-ai, jina) +# Cuardach Jina (s.jina.ai; ailiasanna soláthraí: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Modhnuithe +# Modhnóireachtaí POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — fillfidh corp audio/mpeg (nó formáid iarrata) +# TTS — tugann sé corp audio/mpeg (nó na formáide iarrtha) ar ais POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } -# Eagarthóir íomhá (ilpháirt) +# Eagarthóireacht íomhá (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Gineadh físeáin/ceoil (ID múnla le réimír soláthraithe) +# Giniúint físe / ceoil (aitheantas samhla le réimír soláthraí) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Cosáin Soláthraithe Speisialta +> **Nóid soláthraí athrangaithe:** seolann `POST /v1/rerank` iarratais chuig nóid soláthraí atá comhoiriúnach le OpenAI freisin +> (oMLX, vLLM, Infinity, TEI taobh thiar de gheata, …) agus a seoltar chucu mar `/`. Bíonn nóid +> aisfhillteacha (`localhost`, `127.0.0.1`, `172.16.0.0/12`) incháilithe i gcónaí. Ní bhíonn nóid ar aon +> óstach eile — bosca LAN nó piara Tailscale — incháilithe ach amháin nuair a chumasaíonn an t-oibreoir +> an bhratach gné `RERANK_REMOTE_PROVIDER_NODES` **agus** nuair a éiríonn le bun-URL an nóid polasaí URL +> amach an tsoláthraí (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> ní sheoltar iarratais chuig óstaigh mheiteashonraí néil riamh. Glaonn céim athrangaithe an innill chuimhne ar an mbealach seo thar +> aisfhillte, agus mar sin rialaíonn an riail chéanna `rerankProviderModel` sna socruithe Cuimhne. +> +> **Struchtúir freastalaí áitiúil:** glaoitear ar an nód ag `/v1/rerank` agus, i gcás 404, ag `/rerank` +> (Infinity, TEI). Bíonn litriú Cohere/OpenAI (`documents`, +> `return_documents`) agus litriú TEI (`texts`, `return_text`) araon sa chorp réamhtheachtach, agus +> normalaítear an freagra réamhtheachtach chuig clúdach Cohere: eagar lom TEI `[{index, score, text}]`, +> `{results: [{index, score}]}` ó gheataí tanaí, agus `{data: [...]}` ar stíl Voyage — tagann siad ar fad ar ais chuig an gcliant mar +> `{results: [{index, relevance_score, document?}]}`, sórtáilte de réir scóir agus teoranta ag `top_n`. + +> **Aimsiú nóid soláthraí:** feictear samhlacha ar nód soláthraí atá comhoiriúnach le OpenAI in `GET /v1/models` +> faoi réimír an nóid. Faigheann rónna nach bhfuil meiteashonraí críochphointe acu (rud atá coitianta i liostaí áitiúla `/v1/models`) +> `apiType` an nóid le hoidhreacht, ionas gur `type: "embedding"` iad samhlacha nóid `embeddings` agus gur +> `type: "rerank"` iad samhlacha nóid `rerank`, seachas comhrá a úsáid mar réamhshocrú; bíonn tosaíocht fós ag +> `supportedEndpoints` sainráite ar ró sioncronaithe nó curtha leis de láimh. + +### Bealaí Tiomnaithe Soláthraí ```bash POST /v1/providers/{provider}/chat/completions @@ -482,7 +504,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Cuirtear réimír an tsoláthraigh leis go huathoibríoch más gá. Filleann múnlaí mímhaithe `400`. +Cuirtear réimír an tsoláthraí leis go huathoibríoch má tá sé ar iarraidh. Tugann samhlacha nach bhfuil comhoiriúnach `400` ar ais. --- diff --git a/docs/i18n/ga/docs/reference/ENVIRONMENT.md b/docs/i18n/ga/docs/reference/ENVIRONMENT.md index bd5f4c622b01..b12167e036cd 100644 --- a/docs/i18n/ga/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/ga/docs/reference/ENVIRONMENT.md @@ -81,70 +81,69 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" Úsáideann OmniRoute **SQLite** (trí `better-sqlite3`) don bhuanseasmhacht ar fad. Rialaíonn na hathróga seo suíomh, criptiú agus saolré na sonraí. -| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Fréamhchomhadlann do bhunachar sonraí SQLite, cúltacaí agus comhaid sonraí. Sáraigh é seo le haghaidh imleabhair Docker nó conairí saincheaptha. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(gan socrú)_ | `src/lib/dataPaths.ts` | Bealach éalaithe do gharda DATA_DIR na dtástálacha/meastóireachta (#10428). Atreoraítear tástálacha agus tóireadóirí meastóireachta/priontála Node (`-e`/`--eval`/`-p`/`--print`, lena n-áirítear na foirmeacha `--eval=`/`--print=`) nach bhfuil `DATA_DIR` acu chuig comhadlann shealadach indiúscartha ionas nach féidir leo fíorbhunachar sonraí an oibreora a oscailt; socraigh go `1` é chun filleadh ar úsáid na fíorchomhadlainne. | -| `OMNIROUTE_BUILD_SHA` | _(gan socrú)_ | `src/lib/monitoring/buildSha.ts` | SHA Git an déantáin atá ag rith. Stampáilte ag `npm run build:release`; is féidir é a instealladh i gcoimeádáin a sheoltar gan an comhartha `dist/BUILD_SHA`. Nochtaítear é mar `system.buildSha` ar `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | An tagairt a n-úsáideann geata tionscnaimh an déantáin phacáilte chun SHA na tógála a sheiceáil (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(gan socrú)_ | `scripts/build/buildProvenance.ts` | Socraigh go `1` é chun tógáil nach bhfuil a SHA ar an líne eisiúna a phacáil, agus í a thaifeadadh mar thógáil chanáraí d'aon ghnó seachas teip a chur ar an ngeata (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(gan socrú)_ | `scripts/ops/deploy-canary.mjs` | Eochair API don tóireadóir deataigh imlonnaithe canáraí, a sheoltar mar `Authorization: Bearer` ar `/v1/chat/completions`. Ní úsáideann ach an script imlonnaithe í (#10429), agus ní úsáideann an freastalaí riamh í. Níl baint aici le hathróga `OMNIROUTE_SMOKE_*` an úim deataigh CLI roghnach (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` in `tests/integration/upstream-cli-smoke.int.test.ts`) — féach [Comhtháthuithe CLI → Fíorscuabadh deataigh](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(gan socrú)_ | `src/lib/buildPhase.ts` | Comhartha chéim na tógála (#10060): socraíonn `scripts/build/build-next-isolated.mjs` go `1` é agus faigheann gach oibrí tógála sceite le hoidhreacht é, ionas go gcuireann ciseal an bhunachair sonraí stub neamhghníomhach ar ais in ionad an breiseán dúchasach better-sqlite3 a lódáil (a thobscorann an t-oibrí agus é ag scor). Ní shocraítear riamh é don fhreastalaí atá ag rith. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Socraigh go `1` é chun an tseiceáil roghnach réamhthógála ar spleáchais dhúchasacha a scipeáil i gcás crainn dhíoltóra neamhghnácha. Ní fhágann sé seo gur féidir spleáchas atá ar iarraidh a thógáil; ná húsáid é ach amháin nuair a sholáthraítear spleáchais dhúchasacha trí bhealach eile. | -| `OMNIROUTE_DATA_DIR` | _(gan socrú)_ | `open-sse/executors/promptql/threadSticky.ts` | **Ailias cúltaca** do `DATA_DIR`, nach seiceáiltear ach amháin nuair nach bhfuil `DATA_DIR` socraithe. Úsáidtear é chun taisce seisiún snáithe-ghreamaitheach ar diosca an riteora PromptQL (`/promptql-thread-sessions.json`) a aimsiú; mura bhfuil ceachtar athróg socraithe, fanann an taisce sa chuimhne amháin (ní choinnítear í idir atosuithe). | -| `OMNIROUTE_PLUGINS_DIR` | _(gan socrú)_ | `src/lib/plugins/scanner.ts` | An chomhadlann a léann **scanóir breiseán an ama rite** — agus an fhréamh a shuiteálann bainisteoir na mbreiseán isteach inti — agus a sháraíonn an réamhshocrú díorthaithe ón gcomhadlann bhaile (#11827). Dírigh ar an gcrann breiseán atá feistithe trí cheangal in Docker/K8s é seachas HOME a bhogadh díreach chun conair an scanadh a athlonnú (rialaíonn HOME gach iompraíocht eile atá coibhneasta leis an gcomhadlann bhaile freisin). Gan socrú = `~/.omniroute/plugins`, nó `/tmp/.omniroute/plugins` nuair nach n-easpórtálann an próiseas aon chomhadlann bhaile ar chor ar bith — an neamhfhionnachtain chiúin a chuireann an athróg seo deireadh léi. Logáiltear an chomhadlann réitithe uair amháin ag an tosú mar `scanner.dir_resolved`, mar aon leis an ionchur a raibh an bua aige. Taobh an fhreastalaí amháin: coimeádann breiseáin orduithe CLI a `OMNIROUTE_PLUGIN_PATH` féin (rannán 9). | -| `STORAGE_ENCRYPTION_KEY` | _(folamh = díchumasaithe)_ | `src/lib/db/encryption.ts` | Eochair AES le haghaidh criptiú iomlán bhunachar sonraí SQLite agus é ar fos. Gin í le `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Lipéad leagain don eochair chriptithe. Méadaigh é agus rothlú eochrach á dhéanamh chun tacú le díchriptiú seanchúltacaí. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Nuair atá sé socraithe mar `true`, scipeáiltear gnáthchúltacaí/réamhscríofa de chomhaid SQLite (sábháil/glanadh praghsála models.dev, scríobh socruithe). Ritear cúltacaí láimhe agus réamh-athchóirithe fós. **Ní dhíchumasaíonn** sé léargas sábháilteachta marthanach éigeantach reathaí na n-aistrithe ná an chosaint ar ollaistriú le haghaidh DB marthanach atá ann cheana. Cuirtear srian ar chúltacaí neamhláimhe ionas nach dtarlaíonn siad níos mó ná uair amháin gach 60 nóiméad. Is féidir le **Socruithe → Stóráil** an deais gnáthchúltaca uathoibríoch a dhíchumasú go neamhspleách. | -| `OMNIROUTE_CRYPT_KEY` | _(gan socrú)_ | `src/lib/db/encryption.ts` | **Ailias oidhreachta** do `STORAGE_ENCRYPTION_KEY`. Glactar leis mar rogha thánaisteach nuair nach bhfuil an phríomhathróg ann. | -| `OMNIROUTE_API_KEY_BASE64` | _(gan socrú)_ | `src/lib/db/encryption.ts` | **Ailias oidhreachta** (foirm ionchódaithe le Base64) a nglactar leis mar rogha thánaisteach. Díchódaítear go huathoibríoch é sula n-úsáidtear é. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(gan socrú)_ | `src/lib/db/core.ts` | Sáraigh eatramh tréimhsiúil seiceála sláinte SQLite (ms). Nuair nach bhfuil sé socraithe, díorthaítear na réamhshocruithe ó `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6u) | `src/lib/db/walMaintenance.ts` | Sáraigh eatramh tréimhsiúil `wal_checkpoint(TRUNCATE)` (ms). Ní chrapann an tseiceáilphointe uathoibríoch an comhad WAL féin riamh, agus ní dhúnann freastalaí fadreatha a DB riamh. Díchumasaíonn `0` é. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5n) | `src/lib/db/walMaintenance.ts` | Sáraigh eatramh minic `wal_checkpoint(PASSIVE)` (ms). Coinníonn sé frámaí WAL atá ar feitheamh beag ionas nach gcóipeálann an TRUNCATE tréimhsiúil riaráiste il-GB ar an bpríomhshnáithe riamh. Díchumasaíonn `0` é. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Nuair a aimsíonn ticeáil PASSIVE go bhfuil an comhad WAL os cionn na méide seo, ardaítear láithreach é go `wal_checkpoint(TRUNCATE)` in ionad fanacht leis an ticeáil mhall. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Socraigh mar `1`/`true`/`yes`/`on` é chun an próiseas a scor tar éis brú criticiúil ar acmhainní a bheith leanúnach ar feadh `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, rud a ligeann do mhaoirseoir (systemd `Restart=always`, beartas atosaithe Docker) próiseas glan a chur ar bun arís in ionad 503anna a sheirbheáil ar feadh tréimhse éiginnte. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2n) | `open-sse/utils/resourcePressure.ts` | An fad nach mór don bhrú criticiúil leanúint sula spreagtar scor an fhéin-atosaithe. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(uathbhraite)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Conair shainráite (absalóideach nó coibhneasta le cwd) chuig `sql-wasm.wasm` agus cuibheoir cúltaca WASM `sql.js` á úsáid. Déantar í a uathbhrath trí spleáchais pacáiste agus leagan amach féideartha nuair nach bhfuil sí socraithe. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6u) | `src/lib/db/core.ts` | Sáraigh eatramh tréimhsiúil `wal_checkpoint(TRUNCATE)` (ms). Ní chrapann an tseiceáilphointe uathoibríoch an comhad WAL féin riamh, agus ní dhúnann freastalaí fadreatha a DB riamh. Díchumasaíonn `0` é. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Líon na laethanta a choinnítear seicphointí poist chríochfoirt (críochnaithe/teipthe/cealaithe/éagtha) de chuid Batch API, na comhaid ionchuir/aschuir/earráide dá dtagraítear, agus an ró, sula scriosann an scuabadh glantacháin uathoibríoch iad. Ní thagann sé i bhfeidhm ach amháin nuair a chuirtear `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ar siúl; tá sé ar aon dul le tréimhse choinneála aschuir Batch API OpenAI féin. Ní dhéanann sé difear don róda `DELETE /api/v1/batches/delete-completed` a spreagann an t-oibreoir, a fhanann neamhchoinníollach (gan scagaire aoise) de réir dearaidh. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Nuair atá sé `true`, lig don scuabadh glanta uathoibríoch jabanna críochnaitheacha Batch API (agus a seicphointí) atá níos sine ná `OMNIROUTE_BATCH_RETENTION_DAYS` a scriosadh, agus inneachar BLOB comhad uaslódáilte atá níos sine ná a luach `expires_at` féin a ghlanadh. Díchumasaithe de réir réamhshocraithe: coinníonn gach suiteáil atá ann cheana na sonraí seo díreach mar a bhí go dtí go roghnaíonn oibreoir é a chumasú. Bratach ghné is féidir a chur in eagar sa deais freisin — féach `docs/reference/FEATURE_FLAGS.md` → Am rite. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Socraigh go `1` é chun seiceáil sláinte an DB a scipeáil go hiomlán ag an tosú. Úsáideach do thascanna gearrshaolacha agus do thástálacha comhtháthaithe. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Socraigh go `1` é chun iallach a chur ar lúb seiceála sláinte an DB a bheith ar siúl, fiú nuair a dhéanfaí í a scipeáil de ghnáth (m.sh., i gcás tascanna gearrshaolacha). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Socraigh go `1` é chun téamh an ama rite dhúchasaigh a scipeáil le linn `npm install`. Úsáideach i suiteálacha CI/gan chomhéadan ina bhfuil sqlite tógtha cheana féin. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(uathbhraite)_ | `src/lib/db/migrationRunner.ts` | Sáraigh an chomhadlann a scanann riteoir na n-aistrithe. Úsáideach nuair a sheoltar aistrithe cuachta i dtógálacha saincheaptha. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(gan socrú)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Comhadlanna breise aistrithe mar iontrálacha `namespace=dir`, deighilte ag teorantóir conaire an ardáin (m.sh. `ee=/opt/app/enterprise/db/migrations`). Taifeadtar na comhaid a aimsítear iontu mar `-`, ionas nach mbeidh dáileadh a sheolann a chuid aistrithe féin i gcoimhlint choíche leis na sliotáin uimhriúla réamhtheachtacha. Caitheann iontráil mhíchumtha, ainmspás neamhbhailí nó comhadlann atá ar iarraidh earráid ag an tosú in ionad an scéimre a scipeáil go ciúin. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Tairseach sábháilteachta d'aistrithe ar feitheamh ar an mórchóir (#3416). Teipeann an tosú má tá níos mó ná an líon seo aistrithe ar feitheamh ar DB atá ann cheana (cosaint ar thábla rianaithe a glanadh). Ardaigh é chun cúltaca níos sine a athchóiriú; socraigh go `0` é chun an tseiceáil a dhíchumasú. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Comhadlann oibre do gheata eisiúna `check:install-upgrade`. Teastaíonn thart ar 12 GB uaidh (dhá chrann suiteála ~3 GB móide an tarball), mar sin níor cheart é a rith ar tmpfs beag — ar an riteoir féinóstáilte is tmpfs 12 GB le tacaíocht RAM é `/tmp`, agus d'ídigh an geata é, rud a theasc an pacáiste. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(réamhshocrú sa chód)_ | `src/lib/spend/batchWriter.ts` | Eatramh sruthlaithe (ms) don scríbhneoir baiscthe caiteachais/costais. Laghdaíonn luachanna níos ísle comhthiomsú scríobhán; laghdaíonn luachanna níos airde coimhlint DB. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(réamhshocrú sa chód)_ | `src/lib/spend/batchWriter.ts` | Uaslíon iontrálacha caiteachais sa mhaolán sula gcuirtear sruthlú éigeantach i bhfeidhm. Ardaigh é in imscaradh ard-QPS; ísligh é nuair is tábhachtaí cuimhne theoranta. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(gan socrú)_ | `open-sse/utils/proxyFetch.ts` | Socraigh go `"true"` é chun logaí dífhabhtaithe `[ProxyFetch]` a astú ar chonair athsheachadta Vercel. Díchumasaithe de réir réamhshocraithe chun leideanna ródaithe a ligean amach a sheachaint. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Socraigh go `"true"` nó `"1"` é chun IPanna an chliaint/an amachshrutha agus réimír an chuntais a chur san áireamh sa líne fhoclach loga próisis `[ProxyEgress]`. Coinnítear AS é de réir réamhshocraithe ionas nach ligeann loga an phróisis IPanna ná réimír an chuntais amach. | -| `OMNIROUTE_DEBUG` | _(gan socrú)_ | `bin/cli/commands/quota.mjs` | Socraigh go `1` é chun diagnóisic uainithe in aghaidh na hiarrata (`[omniroute] GET completed in Nms`) ó orduithe cuóta CLI a phriontáil chuig stderr. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(uathoibríoch)_ | `scripts/dev/healthcheck.mjs` | Conair shainráite a scrúdaíonn seiceáil sláinte an choimeádáin. Mura bhfuil sí socraithe, díorthaíonn an tóireadóir í ó `OMNIROUTE_BASE_PATH`; má shocraítear í, athchumasaítear críochphointe domhain na monatóireachta. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(gan socrú)_ | `bin/cli/commands/completion.mjs` | Socraigh go luach ar bith nach bhfuil folamh é chun diagnóisic `[omniroute completion]` a astú ó chonairí taisce uathchríochnaithe bhlaosc an CLI (léamh/athnuachan/scríobh). Díchumasaithe de réir réamhshocraithe — teipeann na taiscí sin go ciúin ionas nach mbrisfidh taisce atá ar iarraidh/truaillithe uathchríochnú le táb. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24u) | `open-sse/services/batchProcessor.ts` | Uastréimhse athiarrachta d’earraí aonair baisce (ms). Marcáiltear mar theipthe earraí a sháraíonn an tréimhse seo. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Bunmhoill (ms) don chúlú easpónantúil ar athiarrachtaí earraí baisce. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1u) | `open-sse/services/batchProcessor.ts` | Uasteorainn (ms) don chúlú easpónantúil idir athiarrachtaí earraí baisce. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Uaslíon na mbaisceanna a phróiseáiltear i gcomhthráth. Méadaigh é chun tréchur a mhéadú; coinnigh íseal é chun ráigeanna teorannaithe ráta a sheachaint. | +| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Fréamhchomhadlann do bhunachar sonraí SQLite, cúltacaí agus comhaid sonraí. Sáraigh í le haghaidh imleabhar Docker nó conairí saincheaptha. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(gan socrú)_ | `src/lib/dataPaths.ts` | Bealach éalaithe do chosaint DATA_DIR na dtástálacha/measúnuithe (#10428). Déantar tástálacha agus tóireadóirí measúnaithe/priontála Node (`-e`/`--eval`/`-p`/`--print`, lena n-áirítear na foirmeacha `--eval=`/`--print=`) nach bhfuil `DATA_DIR` acu a atreorú chuig comhadlann shealadach indiúscartha ionas nach féidir leo fíorbhunachar sonraí an oibreora a oscailt; socraigh go `1` é chun roghnú filleadh ar an bhfíorchomhadlann. | +| `OMNIROUTE_BUILD_SHA` | _(gan socrú)_ | `src/lib/monitoring/buildSha.ts` | SHA Git an déantáin atá á rith. Stampáilte ag `npm run build:release`; is féidir é a instealladh i gcoimeádáin a sheoltar gan an fairtheoir `dist/BUILD_SHA`. Nochta mar `system.buildSha` ar `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | An tagairt a n-úsáideann geata bunáitíochta an déantáin phacáilte chun SHA na tógála a sheiceáil ina haghaidh (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(gan socrú)_ | `scripts/build/buildProvenance.ts` | Socraigh go `1` é chun pacáil tógála nach bhfuil a SHA ar an líne eisiúna a cheadú, agus í a thaifeadadh mar chanáraí d'aon ghnó in ionad teip a chur ar an ngeata (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(gan socrú)_ | `scripts/ops/deploy-canary.mjs` | Eochair API do thóireadóir deataigh imlonnaithe an chanáraí, a sheoltar mar `Authorization: Bearer` ar `/v1/chat/completions`. Ní úsáideann ach an script imlonnaithe í (#10429), agus ní úsáideann an freastalaí riamh í. Níl baint aici leis na hathróga `OMNIROUTE_SMOKE_*` d'úim deataigh roghnach CLI (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` in `tests/integration/upstream-cli-smoke.int.test.ts`) — féach [Comhtháthuithe CLI → Fíorscuabadh deataigh](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(gan socrú)_ | `src/lib/buildPhase.ts` | Comhartha chéim na tógála (#10060): socraíonn `scripts/build/build-next-isolated.mjs` go `1` é agus faigheann gach oibrí tógála a sceitear é le hoidhreacht, ionas go dtugann ciseal an bhunachair sonraí stuba neamhghníomhach ar ais in ionad an breiseán dúchasach better-sqlite3 a lódáil (a thobscorann an t-oibrí agus é ag scor). Ní shocraítear riamh é don fhreastalaí atá á rith. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Socraigh go `1` é chun an tseiceáil réamhthógála roghnach ar spleáchais dhúchasacha a scipeáil i gcás crainn neamhghnácha atá cuachta leis an gcód. Ní fhágann sé seo gur féidir tógáil a dhéanamh nuair atá spleáchas ar iarraidh; ná húsáid é ach amháin nuair a sholáthraítear spleáchais dhúchasacha trí bhealach eile. | +| `OMNIROUTE_DATA_DIR` | _(gan socrú)_ | `open-sse/executors/promptql/threadSticky.ts` | **Ailias cúltaca** do `DATA_DIR`, nach seiceáiltear ach amháin nuair nach bhfuil `DATA_DIR` socraithe. Úsáidtear é chun taisce seisiún greamaitheach de réir snáithe ar diosca an riteora PromptQL (`/promptql-thread-sessions.json`) a aimsiú; mura bhfuil ceachtar athróg socraithe, fanann an taisce sa chuimhne amháin (ní choinnítear í thar atosuithe). | +| `OMNIROUTE_PLUGINS_DIR` | _(gan socrú)_ | `src/lib/plugins/scanner.ts` | An chomhadlann a léann **scanóir breiseán an ama rite** — agus an fhréamh ina ndéanann bainisteoir na mbreiseán suiteáil — rud a sháraíonn an réamhshocrú a dhíorthaítear ón gcomhadlann bhaile (#11827). Dírigh í ar chrann na mbreiseán atá feistithe trí cheangal in Docker/K8s in ionad HOME a bhogadh díreach chun conair an scanadh a athshuí (rialaíonn HOME gach iompar eile atá coibhneasta leis an gcomhadlann bhaile freisin). Gan socrú = `~/.omniroute/plugins`, nó `/tmp/.omniroute/plugins` nuair nach n-easpórtálann an próiseas aon chomhadlann bhaile ar chor ar bith — an neamhfhionnachtain chiúin a chuireann an athróg seo deireadh léi. Logáiltear an chomhadlann réitithe uair amháin ag am tosaithe mar `scanner.dir_resolved`, mar aon leis an ionchur a raibh an bua aige. Taobh an fhreastalaí amháin: coimeádann breiseáin orduithe CLI a `OMNIROUTE_PLUGIN_PATH` féin (rannán 9). | +| `STORAGE_ENCRYPTION_KEY` | _(folamh = díchumasaithe)_ | `src/lib/db/encryption.ts` | Eochair AES le haghaidh criptiú iomlán bhunachar sonraí SQLite agus é ar fos. Gin í le `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Lipéad leagain don eochair chriptithe. Méadaigh é agus rothlú eochrach á dhéanamh chun tacú le díchriptiú seanchúltacaí. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Nuair is `true` é, scipeáiltear gnáthchúltacaí/réamhscríofa de chomhaid SQLite (sábháil/glanadh praghsála models.dev, scríobh socruithe). Ritheann cúltacaí láimhe agus réamh-athchóirithe fós. **Ní** dhíchumasaíonn sé léargas sábháilteachta buan éigeantach reathaí na n-aistrithe ná an chosaint ar ollaistriú do bhunachar sonraí marthanach atá ann cheana. Cuirtear srian ar chúltacaí neamh-láimhe go huasmhéid uair amháin gach 60 nóiméad. Is féidir le **Settings → Storage** ar an deais gnáthchúltaca uathoibríoch a dhíchumasú go neamhspleách. | +| `OMNIROUTE_CRYPT_KEY` | _(gan socrú)_ | `src/lib/db/encryption.ts` | **Ailias oidhreachta** do `STORAGE_ENCRYPTION_KEY`. Glactar leis mar rogha thánaisteach nuair nach bhfuil an phríomh-athróg ann. | +| `OMNIROUTE_API_KEY_BASE64` | _(gan socrú)_ | `src/lib/db/encryption.ts` | **Ailias oidhreachta** (i bhfoirm ionchódaithe Base64) a nglactar leis mar rogha thánaisteach. Díchódaítear go huathoibríoch é roimh úsáid. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(gan socrú)_ | `src/lib/db/core.ts` | Sáraigh eatramh tréimhsiúil seiceála sláinte SQLite (ms). Nuair nach bhfuil sé socraithe, díorthaítear na réamhshocruithe ó `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(bainte)_ | `src/lib/db/walMaintenance.ts` | **Bainte.** Is féidir le `wal_checkpoint(TRUNCATE)` beo tréimhsiúil mapáil chomhroinnte an wal-index a neamhbhailíochtú agus an próiseas a thuairteáil le SIGBUS (#13973), mar sin níl an sceidealóir ann a thuilleadh. Tá an athróg támh: logálann luach deimhneach rabhadh dímheasa aonuaire, agus fanann `0` nó luach gan socrú ina thost. Déantar cothabháil ar an WAL le pointí seiceála PASSIVE (thíos) agus teascann an pointe seiceála múchta é. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5n) | `src/lib/db/walMaintenance.ts` | Sáraigh eatramh rialta `wal_checkpoint(PASSIVE)` (ms). Coinníonn sé frámaí WAL atá ar feitheamh beag ionas go bhfanann pointí seiceála tapa agus go bhfanann méid an chomhaid WAL teoranta idir teascthaí múchta. Díchumasaíonn `0` é. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Nuair a aimsíonn timthriall PASSIVE go bhfuil an comhad WAL os cionn an mhéid seo, rith `wal_checkpoint(RESTART)` ionas go dtosóidh an WAL arís gan an wal-index mapáilte a athscríobh. Baineadh pointí seiceála beo i mód teasctha (féach an ró `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Socraigh go `1`/`true`/`yes`/`on` é chun an próiseas a scor tar éis brú criticiúil acmhainní a bheith leanúnach ar feadh `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, rud a ligeann do mhaoirseoir (systemd `Restart=always`, polasaí atosaithe Docker) próiseas glan a thabhairt ar ais in ionad freagraí 503 a sholáthar gan teorainn. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2n) | `open-sse/utils/resourcePressure.ts` | An fad a chaithfidh brú criticiúil leanúint sula spreagtar scor an fhéin-atosaithe. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(uathbhraite)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Conair shainráite (absalóideach nó coibhneasta le cwd) chuig `sql-wasm.wasm` agus cuibheoir cúltaca WASM `sql.js` á úsáid. Nuair nach bhfuil sí socraithe, aimsítear go huathoibríoch í trí spleáchais pacáiste agus leagan amach iarrthach. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Líon na laethanta a choinníonn an scuabadh glanta uathoibríoch, sula scriostar iad, pointí seiceála jab Batch API foirceanta (críochnaithe/teipthe/curtha ar ceal/éagtha), comhaid ionchuir/aschuir/earráide tagartha, agus an ró. Ní thagann sé i bhfeidhm ach amháin nuair a chuirtear `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ar siúl; tá sé ag teacht le tréimhse choinneála aschuir Batch API OpenAI féin. Ní dhéanann sé difear don bhealach `DELETE /api/v1/batches/delete-completed` a spreagann an t-oibreoir, a fhanann neamhchoinníollach (gan scagaire aoise) de réir dearaidh. | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Nuair is `true` é, lig don scuabadh glanta uathoibríoch jabanna Batch API foirceanta (agus a bpointí seiceála) atá níos sine ná `OMNIROUTE_BATCH_RETENTION_DAYS` a scriosadh, agus ábhar BLOB na gcomhad uaslódáilte atá níos sine ná a `expires_at` féin a ghlanadh. Múchta de réir réamhshocraithe: coinníonn gach suiteáil atá ann cheana na sonraí seo díreach mar a bhí go dtí go roghnaíonn oibreoir é a chumasú. Is bratach ghné ineagarthóireachta ar an deais é freisin — féach `docs/reference/FEATURE_FLAGS.md` → Am rite. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Socraigh go `1` chun seiceáil sláinte an DB a scipeáil go hiomlán ag am tosaithe. Úsáideach do thascanna gearrshaolacha agus do thástálacha comhtháthaithe. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Socraigh go `1` chun lúb seiceáil sláinte an DB a chur i bhfeidhm, fiú nuair a dhéanfaí í a scipeáil de ghnáth (m.sh., i gcás tascanna gearrshaolacha). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Socraigh go `1` chun téamh an ama rite dhúchasaigh a scipeáil le linn `npm install`. Úsáideach i suiteálacha CI/gan chomhéadan grafach ina bhfuil sqlite tógtha cheana féin. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(uathbhraite)_ | `src/lib/db/migrationRunner.ts` | Sáraigh an chomhadlann a scanann reathaí na n-aistrithe. Úsáideach agus aistrithe cuachta á seoladh i dtógálacha saincheaptha. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(gan socrú)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Comhadlanna breise aistrithe mar iontrálacha `namespace=dir`, scartha ag teorantóir conairí an ardáin (m.sh. `ee=/opt/app/enterprise/db/migrations`). Déantar comhaid a aimsítear iontu a thaifeadadh mar `-`, ionas nach mbeidh dáileadh a sheolann a chuid aistrithe féin i gcoimhlint riamh leis na sliotáin uimhriúla réamhtheachtacha. Má bhíonn iontráil míchumtha, ainmspás neamhbhailí nó comhadlann ar iarraidh ann, caitear earráid ag am tosaithe seachas an scéimre a scipeáil go ciúin. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Tairseach sábháilteachta le haghaidh mórán aistrithe ar feitheamh (#3416). Cuirtear deireadh leis an tosú má tá níos mó ná an líon seo aistrithe ar feitheamh ar DB atá ann cheana (cosnaíonn sé ar thábla rianaithe a bheith glanta). Méadaigh é chun cúltaca níos sine a athchóiriú; socraigh go `0` chun an tseiceáil a dhíchumasú. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Comhadlann oibre don gheata eisiúna `check:install-upgrade`. Teastaíonn thart ar 12 GB uaidh (dhá chrann suiteála de ~3 GB móide an tarball), mar sin níor cheart é a rith ar tmpfs beag — ar an reathaí féinóstáilte, is tmpfs 12 GB le tacaíocht RAM é `/tmp`, agus d’ídigh an geata é, rud a theasc an pacáiste. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(réamhshocrú sa chód)_ | `src/lib/spend/batchWriter.ts` | Eatramh folmhaithe (ms) don scríbhneoir baisc caiteachais/costais. Laghdaíonn luachanna níos ísle comhcheangal scríobh; laghdaíonn luachanna níos airde iomaíocht DB. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(réamhshocrú sa chód)_ | `src/lib/spend/batchWriter.ts` | Uasmhéid iontrálacha caiteachais sa mhaolán sula ndéantar folmhú éigeantach. Méadaigh é ar imscarthaí ard-QPS; laghdaigh é nuair is tábhachtaí cuimhne theoranta. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(gan socrú)_ | `open-sse/utils/proxyFetch.ts` | Socraigh go `"true"` chun logaí dífhabhtaithe `[ProxyFetch]` a astú ar chonair athsheachadta Vercel. Díchumasaithe de réir réamhshocraithe chun leideanna ródaithe a sheachaint ó sceitheadh. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Socraigh go `"true"` nó `"1"` chun IPanna cliaint/amach agus réimír an chuntais a chur san áireamh sa líne mhionsonraithe loga próisis `[ProxyEgress]`. Coinnítear DÍCHUMASAITHE é de réir réamhshocraithe ionas nach sceithfidh loga an phróisis IPanna ná réimír an chuntais. | +| `OMNIROUTE_DEBUG` | _(gan socrú)_ | `bin/cli/commands/quota.mjs` | Socraigh go `1` chun diagnóisic uainithe in aghaidh na hiarrata (`[omniroute] GET completed in Nms`) ó orduithe cuóta CLI a phriontáil chuig stderr. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(uathoibríoch)_ | `scripts/dev/healthcheck.mjs` | Conair shainráite a dhéanann seiceáil sláinte an choimeádáin a thástáil. Nuair nach bhfuil sé socraithe, díorthaíonn an taiscéalaí í ó `OMNIROUTE_BASE_PATH`; ach í a shocrú, roghnaítear an críochphointe domhain monatóireachta arís. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(gan socrú)_ | `bin/cli/commands/completion.mjs` | Socraigh go luach neamhfholamh ar bith chun diagnóisic `[omniroute completion]` a astú ó chonairí taisce chomhlánú bhlaosc CLI (léamh/athnuachan/scríobh). Díchumasaithe de réir réamhshocraithe — teipeann ar na taiscí sin go ciúin ionas nach mbrisfidh taisce ar iarraidh/truaillithe comhlánú le táb choíche. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24u) | `open-sse/services/batchProcessor.ts` | Uastréimhse atrialach d’ítimí aonair baisce (ms). Marcáiltear mar theipthe na hítimí a sháraíonn an tréimhse seo. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Bunmhoill bhunúsach (ms) don chúlú easpónantúil agus atrialacha á ndéanamh ar mhíreanna baisce. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1u) | `open-sse/services/batchProcessor.ts` | Uasteorainn (ms) don chúlú easpónantúil idir atrialacha ar mhíreanna baisce. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Uaslíon na mbaisceanna a phróiseáiltear i gcomhthráth. Méadaigh é chun tréchur a mhéadú; coinnigh íseal é chun ráigeanna teorannaithe ráta a sheachaint. | > [!IMPORTANT] > Sula n-athraítear bunachar sonraí seasmhach atá ann cheana, foilsíonn an riteoir ascnaimh seat iomlán, -> seoladh de réir inneachair, faoi `DATA_DIR/db_backups/`. Éilíonn an foilsiú córas comhad -> a thacaíonn le naisc chrua gan forscríobh ar an gcóras comhad céanna, chomh maith le sioncronú marthanach comhad. Éilíonn óstaigh POSIX -> sioncronú eolaire freisin; ar Windows, d’fhéadfadh Node hanlaí eolaire a dhiúltú, mar sin sruthlaíonn OmniRoute an -> comhad foilsithe agus déileálann sé le sioncronú iontrála eolaire mar iarracht is fearr. -> Mura féidir leis an `DATA_DIR` gléasta na ráthaíochtaí sin a sholáthar, teipeann an tosú go dúnta sula gcuirtear -> ascnamh i bhfeidhm. Bog `DATA_DIR` chuig imleabhar a bhfuil na hoibríochtaí bunúsacha sin aige; ná húsáid +> seolaithe de réir inneachair faoi `DATA_DIR/db_backups/`. Éilíonn an foilsiú córas comhad +> a thacaíonn le naisc chrua gan forscríobh ar an gcóras comhad céanna, chomh maith le sioncronú buan comhad. Éilíonn óstaigh POSIX +> sioncronú comhadlainne freisin; ar Windows, féadfaidh Node hanlaí comhadlainne a dhiúltú, mar sin sruthlaíonn OmniRoute an +> comhad foilsithe agus déileálann sé le sioncronú iontrála comhadlainne mar iarracht chomh fada agus is féidir. +> Mura féidir leis an `DATA_DIR` gléasta na ráthaíochtaí sin a sholáthar, teipeann an tosú go slán sula gcuirtear +> ascnaimh i bhfeidhm. Bog `DATA_DIR` chuig imleabhar a bhfuil na bunghnéithe sin aige; ná húsáid > `DISABLE_SQLITE_AUTO_BACKUP` chun sábháilteacht ascnaimh a sheachaint. ### Cásanna -| Cás | Cumraíocht | -| ----------------------- | ----------------------------------------------------------------------------------------------------------------- | -| **Forbairt áitiúil** | Fág na réamhshocruithe uile mar atá. Tá an bunachar sonraí ag `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + gléas imleabhar ag `/data`. | -| **Criptithe ar diosca** | Socraigh `STORAGE_ENCRYPTION_KEY` + coinnigh cóipeanna cúltaca den eochair! Má chailltear í, cailltear na sonraí. | -| **CI/Tástáil** | `DATA_DIR=/tmp/omniroute-test` — sealadach, níl criptiú de dhíth. | +| Cás | Cumraíocht | +| ----------------------- | -------------------------------------------------------------------------------------------------------- | +| **Forbairt áitiúil** | Fág na réamhshocruithe uile mar atá. Tá an bunachar sonraí ag `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + gléas imleabhar ag `/data`. | +| **Criptithe ar diosca** | Socraigh `STORAGE_ENCRYPTION_KEY` + coinnigh cúltacaí den eochair! Má chailltear í, cailltear na sonraí. | +| **CI/Tástáil** | `DATA_DIR=/tmp/omniroute-test` — sealadach, níl criptiú de dhíth. | --- @@ -213,43 +212,44 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 4. Slándáil & Fíordheimhniú -| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | -| ------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salann a chomhcheanglaítear le haitheantóirí crua-earraí chun méarlorg an mheaisín a chruthú. Athraigh é do gach imscaradh ar mhaithe le leithlisiú. | -| `OMNIROUTE_CLI_SALT` | _(gan socrú = salann randamach do gach suiteáil a choinnítear ag `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Salann HMAC chun an comhartha fíordheimhnithe CLI áitiúil a dhíorthú. Má shocraítear an luach seo, rothlaítear gach comhartha CLI ar an meaisín agus tugtar tús áite dó i gcónaí ar an salann marthanach. Féach `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Socraíonn sé an bhratach `Secure` ar fhianáin seisiúin. **Caithfidh sé a bheith `true`** agus an córas ag rith taobh thiar de HTTPS. | -| `REQUIRE_API_KEY` | `false` | Meánearraí API | Nuair atá sé `true`, ní mór eochair bhailí API a bheith i ngach iarratas seachfhreastalaí `/v1/*`. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ceadaíonn sé luachanna iomlána eochracha API a nochtadh i gcomhéadan úsáideora an Deais. Is féidir é a chumrú ó Bhratacha Gné na Deaise; is riosca slándála é ar áscanna comhroinnte. | -| `NO_LOG_API_KEY_IDS` | _(folamh)_ | `src/lib/compliance/index.ts` | Aitheantais eochracha API, scartha le camóga, a sheachnaíonn logáil iarratas (comhlíonadh GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(gan socrú = gan teorainn)_ | `src/shared/utils/apiKeyPolicy.ts` | Buiséad cúltaca iarratas in aghaidh an lae a chuirtear i bhfeidhm ar eochracha API a bhfuil a gcolún `rate_limits` neamhnitheach. Gan socrú nó folamh: níl aon uasteorainn intuigthe ann (#2289, #11017). Is ionann `0` agus sin freisin (gan teorainn). Cumasaíonn slánuimhir dheimhneach N N/lá, 5N/seachtain, 20N/mí. I gcás luachanna neamhfholmha míchumtha, úsáidtear na fuinneoga oidhreachta 1000/lá, 5000/seachtain, 20000/mí mar chúltaca. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Uasmhéid ceadaithe chorp an iarratais. Diúltaítear d’ualaí a sháraíonn an teorainn seo. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Glacann coirp iarratais iarbhír atá ag an tairseach seo nó os a cionn an léas glactha adamhach trom-ualaitheach atá logánta don phróiseas sula bparsáiltear JSON (conair BYTE, lena n-áirítear `POST /v1/responses`). Tá an t-éalú céanna [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) nuair atá spás sláintiúil ar fáil agus atá ann d’iarratais atá trom ó thaobh struchtúir de; tá sé fós faoi theorainn `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), ionas nach bhfillfidh [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Uasteorainn dhocht do bhealaí comhrá a chuirtear i bhfeidhm ar na bearta a léitear le linn ionghabháil theoranta, lena n-áirítear iarratais a bhfuil `Content-Length` in easnamh, neamhbhailí nó mí-ionraic iontu; faigheann aon bharrachas `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(gan socrú — gan uasteorainn ar líon na n-iarratas)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** ní bhíonn an uasteorainn oidhreachta seo ar LÍON na n-iarratas i bhfeidhm anois ach amháin nuair a shocraítear go sainráite í. Má fhágtar gan socrú í (an réamhshocrú), déantar ligean isteach comhráite troma a rialú ina ionad sin le `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — buiséad BEART uathdhíorthaithe atá tomhaiste ó fhíoruasteorainn chuimhne an phróisis i **bpróiseas amháin** (carn V8 amháin). Cuireann dhá `/v1/responses` fhorluiteacha de thart ar 750k comhartha deireadh le carnáin ~12 GiB (#7849) — rabhadh **buiséid chuimhne**, ní uasmhéid docht táirge de 2. FÉADFAIDH próiseas sláintiúil (carn faoi bhun an chóimheasa díluchtaithe) tuilleadh `/v1/responses` fada comhthráthacha a ligean isteach trí `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Baineann na deicheanna de chliaint fhada SSE (40–50) leis an gcarn + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ní le “uasmhéid 2”. Má ardaítear é seo go dall chun “an t-óstach a úsáid”, tugtar #7849 isteach arís. Iolraigh **carnáin** le **N `DATA_DIR` neamhspleácha** (#11024); ná húsáid `replicas>1` riamh ar chomhad SQLite amháin. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(uathdhíorthaithe)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** sárú don bhuiséad beart ionghabhála uathdhíorthaithe (25% den uasteorainn chuimhne V8/cgroup is sriantaí, roinnte ar aimpliú neamhbhuan 8x). Cuirtear luachanna díorthaithe agus sainráite faoi theorainn 8 MiB–2 GiB. Teipeann corp atá níos mó ná an buiséad éifeachtach láithreach le `413 body_exceeds_budget`; fanann an choimhlint idir coirp ar féidir freastal orthu ina n-aonar in-atrialach le `503`. Baineann 40–50 cliant fada SSE comhthráthach leis an mbuiséad seo + an carn, ní le “uasmhéid 2” docht. Léigh `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` ag `/api/monitoring/health` sula ndéantar mionchoigeartú. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Cóimheas díluchtaithe brú cairn (`heapUsed / heap_size_limit`) le haghaidh ligean isteach trom de réir BEART agus STRUCHTÚIR (#10183, #10268, #10437). Ní dhíluchtaítear iarratas trom comhthráthach os cionn `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` leis an `503` in-atrialach ach amháin nuair atá an carn ag an gcóimheas seo nó os a chionn FREISIN; ar charn sláintiúil ligtear isteach é trí spás breise sláintiúil ina ionad sin. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (réamhshocrú `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Acmhainn bhreise theoranta do chonair thapa an chairn shláintiúil (#10437) ar **STRUCHTÚR** agus BEARTA araon (`admitChatRequest`, lena n-áirítear coirp ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Gan an teorainn seo, sheachain gach iarratas gnóthach ach le carn sláintiúil an rialú ligean isteach gan aon uasteorainn. Nuair atá an oiread seo léasanna comhthráthacha gníomhach trí chonair an chairn shláintiúil, téann iarratais ghnóthacha eile ar aghaidh chuig an gconair feithimh theoranta/díluchtaithe CHÉANNA a úsáidtear faoi fhíorbhrú cairn. Díchumasaíonn `0` an seachbhóthar go hiomlán. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Líon na dteachtaireachtaí a aicmíonn iarratas comhrá mar iarratas trom fiú nuair atá a chorp faoi bhun na tairsí beart. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Líon na n-uirlisí a aicmíonn iarratas comhrá mar iarratas trom fiú nuair atá a chorp faoi bhun na tairsí beart. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Meastachán coimeádach ar chomharthaí de réir mhéid an teaghráin a aicmíonn iarratas mar iarratas trom; seachfhreastalaí costais ligean isteach atá anseo, ní comharthú billeála an tsoláthraí. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (díchumasaithe) | `src/shared/middleware/chatBodyAdmission.ts` | Uasteorainn roghnach, rogha an diúltaithe, ar stair comhrá. Díchumasaithe de réir réamhshocraithe: is beartas imscartha é líon teachtaireachtaí, ní airí uilíoch iarratais, agus má chuirtear uasteorainn anseo diúltaítear comhráite le `413` deiridh sular féidir leis an bpíblíne chomhbhrúite iad a dhéanamh infhreastailte. Cuirtear teorainn le fás cairn trí `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` agus an díluchtú faoi bhrú cairn. Socraigh luach deimhneach ar imscaradh a bhfuil srian cuimhne air agus a dteastaíonn uasteorainn dhocht uaidh; gheobhaidh an farasbarr `413` struchtúrtha a éilíonn dlúthú ansin. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Uasteorainn dhocht do fhreagra réamhtheachtach neamhshruthaithe a mhaolánaítear go hiomlán sa chuimhne. Thar an teorainn seo, cealaítear an léitheoir réamhtheachtach agus teipeann an t-iarratas go tapa in ionad teaghrán gan teorainn a fhás go dtí go n-ídítear an carn. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Uaslíon na mbeart ar an tsreang a chuirtear ar aghaidh ó cheanntásca freagartha réamhtheachtacha. Nuair a sháraítear an buiséad, ligtear ceanntásca ar thosaíocht níos ísle ar lár (m.sh., `x-codex-*`, `x-oai-request-id`) chun fanacht laistigh de ghnáth-theorainneacha ceanntásca seachfhreastalaithe droim ar ais. Socraigh níos airde é chun tuilleadh meiteashonraí réamhtheachtacha a chur ar aghaidh ar chostas ceanntásca freagartha níos mó. | -| `CORS_ORIGIN` | _(gan socrú)_ | `src/server/cors/origins.ts` | Liosta ceadaithe CORS oidhreachta d'fhoinse aonair. Moltar `CORS_ALLOWED_ORIGINS` le haghaidh imscaradh nua. Ní bhaineann CORS ach le cliaint API brabhsálaí trasfhoinse; úsáideann scríbhinní fíordheimhnithe ón deais iarrataí den fhoinse chéanna mar aon le cosaint CSRF atá ceangailte leis an seisiún. | -| `CORS_ALLOWED_ORIGINS` | _(gan socrú)_ | `src/server/cors/origins.ts` | Liosta ceadaithe CORS atá deighilte le camóga. Ní sheoltar saoróg ar bith mura bhfuil `CORS_ALLOW_ALL=true` cumraithe go sainráite. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Bealach éalaithe forbartha amháin chun macalla a dhéanamh d'aon `Origin` brabhsálaí. Ná cumasaigh é ar imscaradh comhroinnte ná táirgeachta. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Cuir bac ar ghlaonna soláthraí a dhíríonn ar raonta IP príobháideacha/aisfhillteacha/nasc-áitiúla. Ná díchumasaigh ach amháin i dtimpeallachtaí tástála leithlisithe. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Ceadaigh URLanna soláthraí a dhíríonn ar líonraí príobháideacha/áitiúla (localhost, 192.168.x.x, 10.x.x.x, etc.). **RIACHTANACH do sholáthraithe féinhóstáilte** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Nuair atá sé `false`, diúltaíonn an deais do bhailíochtú URLanna áitiúla. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Ceadaigh soláthraithe a chur leis/a bhailíochtú ag seoltaí áitiúla/príobháideacha (127.0.0.1, localhost, LAN, raonta príobháideacha) — teoranta do chonair bhailíochtaithe an tsoláthraí. **Réamhshocrú `true`** (áitiúil ar dtús); socraigh go `false` é chun blocáil dhian d'fhoinsí poiblí amháin a fhorfheidhmiú. Fanann críochphointí meiteashonraí néil (169.254.169.254, metadata.google.internal) blocáilte beag beann air sin. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Lig do na bealaí `/v1/audio/*` (tras-scríbhinní, urlabhra, aistriúcháin) nód soláthraí atá comhoiriúnach le OpenAI agus atá á óstáil lasmuigh de localhost a úsáid. Múchta de réir réamhshocraithe — athraíonn ródú fuaime chuig óstach cianda aitheantas an eis-sreafa agus ní mór dó a bheith ina chinneadh sainráite ag an oibreoir. Ceadaítear nóid aisfhillteacha/phríobháideacha (localhost, 127.0.0.1, 172.16-31.x) i gcónaí agus ní dhéanann sé seo difear dóibh. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Nuair atá OIDC cumasaithe, díchumasaigh logáil isteach le pasfhocal ionas nach féidir le húsáideoirí fíordheimhniú ach trí Logáil Aonair Isteach OIDC. Glactar leis an ailias lom `OIDC_DISABLE_PASSWORD_LOGIN` freisin; tugtar tús áite do Bhratach Gné na Deaise leis an eochair chéanna. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Ailias lom de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | - -### Seicliosta Cruaithe +| Athróg | Réamhshocrú | Comhad Foinseach | Cur Síos | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salann a chomhcheanglaítear le haitheantóirí crua-earraí chun méarlorg meaisín a chruthú. Athraigh é do gach imscaradh ar leith chun aonrú a chinntiú. | +| `OMNIROUTE_CLI_SALT` | _(gan socrú = salann randamach in aghaidh na suiteála a choinnítear ag `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Salann HMAC chun an comhartha fíordheimhnithe CLI áitiúil a dhíorthú. Má shocraítear an luach seo, rothlaítear gach comhartha CLI ar an meaisín agus tugtar tosaíocht dó i gcónaí ar an salann marthanach. Féach `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Socraíonn sé an bhratach `Secure` ar fhianáin seisiúin. **Ní mór dó a bheith `true`** nuair atá sé ag rith taobh thiar de HTTPS. | +| `REQUIRE_API_KEY` | `false` | Meánearra API | Nuair atá sé `true`, ní mór eochair bhailí API a bheith san áireamh i ngach iarratas seachfhreastalaí `/v1/*`. **Ní rialaíonn an bhratach seo `GET /v1/models`**, a leanann staidiúir logála isteach an deais (`requireAuthForModels`) ina ionad sin — mar sin, NÍ chiallaíonn `401` ó `/v1/models` go bhfuil tátal cosanta. Féach `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ceadaíonn sé luachanna iomlána eochracha API a nochtadh i gcomhéadan úsáideora na Deaise. Is féidir é a chumrú ó Bhratacha Gné na Deaise; is riosca slándála é ar áscanna comhroinnte. | +| `NO_LOG_API_KEY_IDS` | _(folamh)_ | `src/lib/compliance/index.ts` | Aitheantais eochracha API, deighilte le camóga, a sheachnaíonn logáil iarratas (comhlíonadh GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(gan socrú = gan teorainn)_ | `src/shared/utils/apiKeyPolicy.ts` | Buiséad cúltaca iarratas in aghaidh an lae a chuirtear i bhfeidhm ar eochracha API a bhfuil luach null ina gcolún `rate_limits`. Gan socrú nó folamh: gan uasteorainn intuigthe (#2289, #11017). Is ionann `0` agus sin (gan teorainn). Cumasaíonn slánuimhir dhearfach N N/lá, 5N/seachtain, 20N/mí. Má bhíonn luachanna neamhfholmha míchumtha ann, úsáidtear na fuinneoga oidhreachta 1000/lá, 5000/seachtain, 20000/mí mar chúltaca. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Uasmhéid ceadaithe chorp an iarratais. Diúltaítear d’ualaí pá a sháraíonn an teorainn seo. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Glacann coirp iarratais iarbhír atá ag an tairseach seo nó os a cionn an léas iontrála tromualach adamhach atá áitiúil don phróiseas sula ndéantar parsáil JSON (conair BYTE, lena n-áirítear `POST /v1/responses`). Tá an bealach éalaithe céanna [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) nuair atá dóthain spáis shláintiúil ar fáil agus atá ann d’ualaí troma ó thaobh struchtúir de; tá sé fós faoi cheangal ag `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110), ionas nach bhfillfidh [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Uasteorainn chrua do bhealaí comhrá a chuirtear i bhfeidhm ar na bearta a léitear le linn ionghabhála teorannaithe, lena n-áirítear iarratais ina bhfuil `Content-Length` ar iarraidh, neamhbhailí nó bréagach; faigheann farasbarr `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(gan socrú — gan uasteorainn ar líon na n-iarratas)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** ní bheidh an uasteorainn oidhreachta seo ar LÍON na n-iarratas ceangailteach anois ach amháin nuair a shocraítear go sainráite í. Má fhágtar gan socrú í (an réamhshocrú), déantar ligean isteach comhrá trom a rialú ina ionad sin le `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — buiséad BEART a dhíorthaítear go huathoibríoch, arna mhéidsiú ó fhíor-uasteorainn chuimhne an phróisis in **aon phróiseas amháin** (carn V8 amháin). Cuireann dhá iarratas `/v1/responses` forluiteacha de thart ar 750k comhartha deireadh le cairn ~12 Gi (#7849) — rabhadh faoi **bhuiséad cuimhne**, ní uasmhéid docht táirge de 2. FÉADFAIDH próiseas sláintiúil (carn faoi bhun an chóimheasa maolaithe) níos mó iarratas fada comhthráthach `/v1/responses` a ligean isteach trí `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Baineann na deicheanna de chliaint fhada SSE (40–50) leis an gcarn + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ní le “uasmhéid 2”. Má ardaítear é seo go dall chun “an t-óstach a úsáid”, tabharfar #7849 ar ais. Méadaigh líon na **gcarn** le **N `DATA_DIR` neamhspleácha** (#11024); ná húsáid `replicas>1` riamh ar chomhad SQLite amháin. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(díorthaithe go huathoibríoch)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** sárú ar an mbuiséad beart ionghabhála a dhíorthaítear go huathoibríoch (25% den uasteorainn chuimhne V8/cgroup is sriantaí, roinnte ar aimpliú neamhbhuan 8x). Cuirtear teorainn 8 MiB–2 GiB le luachanna díorthaithe agus sainráite. Teipeann corp atá níos mó ná an buiséad éifeachtach láithreach le `413 body_exceeds_budget`; fanann coimhlint idir coirp is féidir a sheirbhísiú astu féin in-atriailte le `503`. Baineann 40–50 cliant fada SSE leis an mbuiséad seo + an carn, ní le “uasmhéid 2” docht. Léigh `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` ag `/api/monitoring/health` sula ndéanann tú tiúnadh. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Cóimheas maolaithe brú cairn (`heapUsed / heap_size_limit`) le haghaidh ligean isteach trom de chineál BEART agus STRUCHTÚR (#10183, #10268, #10437). Ní mhaolaítear iarratas trom comhthráthach thar `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` leis an `503` in-atriailte ach amháin nuair atá an carn ag an gcóimheas seo nó os a chionn FREISIN; ar charn sláintiúil ligtear isteach é trí spás sláintiúil breise ina ionad sin. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (réamhshocrú `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Acmhainn bhreise theorannaithe do chonair thapa an chairn shláintiúil (#10437) ar **STRUCHTÚR** agus **BEART** araon (`admitChatRequest`, lena n-áirítear coirp ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Gan an teorainn seo, sheachnódh gach iarratas gnóthach ach le carn sláintiúil an ligean isteach gan aon uasteorainn. Nuair a bhíonn an líon seo léasanna comhthráthacha gníomhach trí chonair an chairn shláintiúil, téann iarratais ghnóthacha eile ar aghaidh chuig an gconair CHÉANNA feithimh theorannaithe/maolaithe a úsáidtear faoi fhíorbhrú cairn. Díchumasaíonn `0` an seachbhóthar go hiomlán. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Líon teachtaireachtaí a aicmíonn iarratas comhrá mar iarratas trom fiú nuair atá a chorp faoi bhun thairseach na mbeart. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Líon uirlisí a aicmíonn iarratas comhrá mar iarratas trom fiú nuair atá a chorp faoi bhun thairseach na mbeart. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Meastachán coimeádach ar chomharthaí bunaithe ar mhéid teaghráin a aicmíonn iarratas mar iarratas trom; seachfhreastalaí costais ligean isteach é seo, ní comharthú billeála an tsoláthraí. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (díchumasaithe) | `src/shared/middleware/chatBodyAdmission.ts` | Uasteorainn roghnach rogha-isteach ar stair chomhrá. Díchumasaithe de réir réamhshocraithe: is beartas imlonnaithe é líon teachtaireachtaí, ní airí uilíoch de chuid iarratais, agus má chuirtear uasteorainn anseo diúltaítear do chomhráite le `413` críochnaitheach sula bhféadfaidh an phíblíne comhbhrúite iad a dhéanamh inseirbhíse. Cuireann `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` agus maolú an bhrú cairn teorainn le fás an chairn. Socraigh luach deimhneach ar imlonnuithe atá srianta ó thaobh cuimhne de agus a dteastaíonn uasteorainn chrua uathu; gheobhaidh farasbarr `413` struchtúrtha a éilíonn dlúthú ansin. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Uasteorainn chrua do fhreagra neamhsruthaithe réamhtheachtach a mhaolánaítear go hiomlán sa chuimhne. Thar an teorainn seo, cealaítear an léitheoir réamhtheachtach agus teipeann an t-iarratas go tapa in ionad teaghrán gan teorainn a fhás go dtí go n-ídítear an carn. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Uasmhéid beart ar an sreang a chuirtear ar aghaidh ó cheanntásca freagartha réamhtheachtacha. Nuair a sháraítear an buiséad, fágtar ceanntásca ar thosaíocht níos ísle (m.sh., `x-codex-*`, `x-oai-request-id`) ar lár chun fanacht laistigh de ghnáth-theorainneacha ceanntásca seachfhreastalaí droim ar ais. Socraigh níos airde é chun tuilleadh meiteashonraí réamhtheachtacha a chur ar aghaidh, ar chostas ceanntásca freagartha níos mó. | +| `CORS_ORIGIN` | _(gan socrú)_ | `src/server/cors/origins.ts` | Liosta ceadaithe CORS oidhreachta d'aon bhunús amháin. Moltar `CORS_ALLOWED_ORIGINS` le haghaidh imscaradh nua. Ní bhaineann CORS ach le cliaint API brabhsálaí trastionscnaimh; úsáideann scríbhinní fíordheimhnithe an deais iarratais den tionscnamh céanna agus cosaint CSRF atá ceangailte leis an seisiún ina ionad sin. | +| `CORS_ALLOWED_ORIGINS` | _(gan socrú)_ | `src/server/cors/origins.ts` | Liosta ceadaithe CORS scartha le camóga. Ní sheoltar saoróg mura bhfuil `CORS_ALLOW_ALL=true` cumraithe go sainráite. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Bealach éalaithe forbartha amháin chun aon `Origin` brabhsálaí a athshondasú. Ná cumasaigh é ar imscaradh comhroinnte ná táirgeachta. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Cuir bac ar ghlaonna soláthraí atá dírithe ar raonta IP príobháideacha/aislúbtha/nasc-logánta. Ná díchumasaigh ach amháin i dtimpeallachtaí tástála leithlisithe. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Ceadaigh URLanna soláthraí a dhíríonn ar líonraí príobháideacha/áitiúla (localhost, 192.168.x.x, 10.x.x.x, etc.). **RIACHTANACH do sholáthraithe féinóstáilte** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Nuair atá sé `false`, diúltaíonn an deais do bhailíochtú URLanna áitiúla. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Ceadaigh soláthraithe ar sheoltaí áitiúla/príobháideacha (127.0.0.1, localhost, LAN, raonta príobháideacha) a chur leis/a bhailíochtú — teoranta do chonair bhailíochtaithe an tsoláthraí. **Réamhshocrú `true`** (áitiúil ar dtús); socraigh go `false` é chun dianbhlocáil phoiblí amháin a chur i bhfeidhm. Fanann críochphointí meiteashonraí néil (169.254.169.254, metadata.google.internal) blocáilte beag beann air sin. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Ceadaigh do na bealaí `/v1/audio/*` (tras-scríbhinní, urlabhra, aistriúcháin) nód soláthraí atá comhoiriúnach le OpenAI agus óstáilte lasmuigh de localhost a úsáid. Díchumasaithe de réir réamhshocraithe — athraíonn ródú fuaime chuig óstríomhaire cianda céannacht eis-sreafa agus ní mór gur cinneadh sainráite oibreora é. Ceadaítear nóid aislúbtha/phríobháideacha (localhost, 127.0.0.1, 172.16-31.x) i gcónaí agus ní théann sé seo i bhfeidhm orthu. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Ceadaigh do `POST /v1/rerank` (agus céim athrangaithe aislúbtha an innill chuimhne) nód soláthraí atá comhoiriúnach le OpenAI agus óstáilte lasmuigh de localhost a úsáid — bosca LAN nó piara Tailscale a ritheann TEI, Infinity, vLLM, etc. Díchumasaithe de réir réamhshocraithe — athraíonn ródú chuig óstríomhaire cianda céannacht eis-sreafa agus ní mór gur cinneadh sainráite oibreora é. Ceadaítear nóid aislúbtha (localhost, 127.0.0.1, 172.16-31.x) i gcónaí agus ní théann sé seo i bhfeidhm orthu. Ní mór do nóid chianda polasaí URL amach an tsoláthraí (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) a chomhlíonadh freisin; ní dhéantar ródú chuig óstríomhairí meiteashonraí néil riamh. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Nuair atá OIDC cumasaithe, díchumasaigh logáil isteach le pasfhocal ionas nach féidir le húsáideoirí fíordheimhniú ach trí Shíniú Aonair OIDC. Glactar leis an ailias lom `OIDC_DISABLE_PASSWORD_LOGIN` freisin; tugtar tús áite do Bhratach Gné na Deaise a bhfuil an eochair chéanna aici. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Ailias lom de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | + +### Seicliosta Cruaite ```bash -# Íosriachtanas slándála táirgeachta: -AUTH_COOKIE_SECURE=true # Teastaíonn HTTPS +# Íosmhéid slándála táirgeachta: +AUTH_COOKIE_SECURE=true # Éilíonn HTTPS REQUIRE_API_KEY=true # Fíordheimhnigh gach glao seachfhreastalaí ALLOW_API_KEY_REVEAL=false # Ná nocht eochracha sa chomhéadan úsáideora riamh CORS_ALLOWED_ORIGINS=https://your.domain.com @@ -299,61 +299,68 @@ Soláthraíonn OmniRoute cosaint dhá shraith: scanadh ionsteallta ar thaobh na --- -## 6. Polasaithe Uirlisí agus Ródaithe - -| Athróg | Réamhshocrú | Comhad Foinseach | Cur Síos | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Rialaíonn sé rochtain an LLM ar ghlaonna uirlisí/feidhmeanna. `allowlist` = na huirlisí liostaithe amháin, `denylist` = gach uirlis seachas na cinn liostaithe, `disabled` = gan srianta. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Conair chuig an gcomhad JSON ina bhfuil rialacha láimhsithe an phálasta (mionathruithe réamhtheachtacha de réir samhla/prótacail). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Eatramh athlódála (ms) chun comhad rialacha an phálasta a athlódáil go beo. Íosmhéid `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Rogha roghnach: ródáil aitheantais samhlacha lom `claude-*` ó chliaint Claude Code trí chuntas OAuth Claude Code in ionad réimír soláthraí a éileamh. Bíonn tosaíocht fós ag réimíreanna sainráite soláthraí. Is féidir é a chumrú freisin trí lasc ar an deais ar leathanach sholáthraí Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Uasteorainn chomhthráthachta in aghaidh na samhla le haghaidh teaglamaí babhta-rothlacha (#9100). Bhí séamafór an teaglaim bhabhta-rothlaigh teoranta go docht do 3 iarratas chomhthráthacha in aghaidh na samhla gan aon sárú, rud a chuir trácht níos comhthráthaí i sraith taobh thiar den teorainn sin. Bailíochtaithe mar `>= 1`, agus teoranta do `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Rogha chontúirteach a scipeálann seiceáil áitiúil OmniRoute ar fhuinneog an chomhthéacs / uasmhéid comharthaí ionchuir le haghaidh iarrataí díreacha aon-samhla. Cuireann soláthraithe réamhtheachtacha a dteorainneacha iarbhír i bhfeidhm fós; fanann comhbhrú na leide agus uasteorainn comharthaí aschuir na samhla féin gníomhach. Is í an tosaíocht éifeachtach ná sárú DB na mBratach Gnéithe > athróg timpeallachta > réamhshocrú; ní gá atosú. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(gan socrú)_ | `open-sse/services/conversationTracker.ts` | Socraigh go `1` é chun stop a chur le stair comhráite a bhailiú. Tugann `resolveConversationId()` toradh neamhrianaithe ar ais sula léann sé SQLite nó sula bparsálann sé stair teachtaireachtaí, agus clúdaítear aitheantais seisiúin arna soláthar ag an gcliant freisin. Ní athraítear láimhseáil seisiún ródaithe agus ní scriostar taifid atá ann cheana. Le haghaidh imscaradh nach n-úsáideann amharc comhráite na deaise agus ar mian leo stop a chur le fás thábla na sealanna. | +## 6. Beartais Uirlisí & Ródaithe + +| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | +| ----------------------------------------------------------- | -------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Rialaíonn sé rochtain an LLM ar uirlisí/ar ghlaonna feidhme. `allowlist` = na huirlisí liostaithe amháin, `denylist` = gach uirlis seachas na cinn liostaithe, `disabled` = gan srianta. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Conair chuig an gcomhad JSON ina bhfuil rialacha ionramhála an phálasta (mionathruithe réamhtheachtacha de réir samhla/prótacail). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Eatramh athlódála (ms) chun comhad rialacha an phálasta a athlódáil go beo. Íosmhéid `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Rogha le cumasú: ródaigh aitheantóirí samhla lom `claude-*` ó chliaint Claude Code trí chuntas OAuth Claude Code in ionad réimír soláthraí a éileamh. Bíonn tosaíocht fós ag réimíreanna sainráite soláthraí. Is féidir é a chumrú freisin trí lasc ar an deais ar leathanach an tsoláthraí Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Uasteorainn chomhthreomhaireachta de réir samhla le haghaidh teaglamaí timthriallacha (#9100). Bhí séamatóir an teaglama thimthreallaigh teoranta go docht do 3 iarratas comhthreomhara in aghaidh na samhla gan aon sárú féideartha, rud a chuir trácht le comhthreomhaireacht níos airde i sraith taobh thiar den teorainn sin. Fíoraithe mar `>= 1`, teoranta do `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Rogha chontúirteach le cumasú a scipeálann seiceáil áitiúil OmniRoute ar an bhfuinneog chomhthéacsúil / ar uaslíon na dtócan ionchuir le haghaidh iarratais dhíreacha aon-samhla. Forfheidhmíonn soláthraithe réamhtheachtacha a dteorainneacha iarbhír fós; fanann comhbhrú leide agus uasteorainn tócan aschuir na samhla féin gníomhach. Is í an tosaíocht éifeachtach ná sárú Bhunachar Sonraí na mBratach Gné > athróg timpeallachta > réamhshocrú; ní theastaíonn atosú. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(gan socrú)_ | `open-sse/services/selfHostedEntry.ts` | Cáipéis YAML inlíne `providers:` (RIC-738, D4). Nuair a shocraítear í (le bloc `strategy:` nó dá uireasa), atreoraíonn `/v1/chat/completions` chuig an bpointe iontrála aontaithe féinóstáilte atá comhoiriúnach le OpenAI in ionad phíblíne na néalríomhaireachta. Gan socrú (an réamhshocrú): téann an bealach díreach ar aghaidh chuig píblíne reatha na néalríomhaireachta. Féach `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(gan socrú)_ | `open-sse/services/selfHostedEntry.ts` | Conair chuig comhad YAML ina bhfuil an cháipéis chéanna `providers:` agus atá in `OMNIROUTE_SELF_HOSTED_PROVIDERS`, le haghaidh imscaradh ar fearr leo comhad ná athróg timpeallachta inlíne. Gníomhachtaíonn ceachtar acu an pointe iontrála féinóstáilte. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(gan socrú — bealach oscailte)_ | `open-sse/services/selfHostedEntry.ts` | Eochair API chomhroinnte roghnach don phointe iontrála aontaithe féinóstáilte (scafall D5, curtha in áirithe don chóras cuótaí de réir eochrach). Nuair a shocraítear í, ní mór `Authorization: Bearer ` a bheith san áireamh sna hiarratais. Gan socrú: tá an bealach oscailte, ag teacht leis an bpatrún reatha do sholáthraithe áitiúla féinóstáilte (imscaradh aisfhillte/líonra iontaofa). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(gan socrú)_ | `open-sse/services/routingStrategies.ts` | Cáipéis YAML inlíne `strategy:` don inneall ródaithe cinntitheach (M2/RIC-740, D3) — dúliosta/bánliosta, scoradán tréimhse fhuaraithe, tosaíocht costais, feasacht ar aga folaigh, slabhra cúltaca. Sáraíonn sí bloc inlíne `strategy:` atá neadaithe taobh istigh de `OMNIROUTE_SELF_HOSTED_PROVIDERS`, de réir eochrach. Féach `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(gan socrú)_ | `open-sse/services/routingStrategies.ts` | Conair chuig comhad YAML ina bhfuil an cháipéis chéanna `strategy:` agus atá in `OMNIROUTE_SELF_HOSTED_STRATEGY`, le haghaidh imscaradh ar fearr leo comhad ná athróg timpeallachta inlíne. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(gan socrú)_ | `open-sse/services/conversationTracker.ts` | Socraigh go `1` é chun stop a chur le bailiú stair na gcomhráite. Tugann `resolveConversationId()` toradh neamhrianaithe ar ais sula léann sé SQLite nó sula bparsálann sé stair na dteachtaireachtaí, agus cumhdaítear aitheantais seisiúin arna soláthar ag an gcliant freisin. Ní athraítear láimhseáil na seisiún ródúcháin agus ní scriostar taifid atá ann cheana. Le haghaidh imscaradh nach n-úsáideann amharc comhráite an deais agus ar mian leo cosc a chur ar an tábla sealanna leanúint de bheith ag fás. | --- -## 7. URLanna & Sioncronú Néalríomhaireachta - -| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL ar thaobh an fhreastalaí lena nglaonn jabanna sioncronaithe inmheánacha ar `/api/sync/cloud`. Coinnigh é seo mar URL aisfhillte/coimeádáin fiú nuair a dhéantar an aip a sheachfhreastalaí go poiblí. | -| `CLOUD_URL` | _(folamh)_ | `src/lib/cloudSync.ts` | URL chríochphointe an athsheachadáin néil (gné phréimhe). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Teorainn ama HTTP d'iarratais sioncronaithe néil. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Cumraíocht tógála Webpack | Próifíl ag am tógála (socraigh go `minimal` í chun modúil phribhléideacha a eisiamh go fisiciúil ón mbeart). | -| `OMNIROUTE_STANDALONE_DIR` | _aschur neamhspleách .build/_ | `scripts/build/colocate-standalone.mjs` | Sárú ag am tógála don chomhadlann aschuir neamhspleách a úsáideann an chéim chomhlonnaithe iarthógála. Ní socrú ama rite é. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(folamh)_ | `src/lib/cloudSync.ts` | Rún comhroinnte a úsáidtear chun síniú HMAC-SHA256 freagraí Cloud Sync a fhíorú. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Socraigh go `true` é chun ligean do chríochphointe Cloud Sync dintiúir áitiúla a fhorscríobh. Is é `false` an réamhshocrú. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Socraigh go `true` é chun freagra Cloud Sync gan síniú a dhiúltú nuair nach bhfuil rún áitiúil cumraithe (#13679). Déantar síniú atá i láthair a fhíorú i gcónaí — agus diúltaítear dó i gcónaí nuair nach bhfuil `OMNIROUTE_CLOUD_SYNC_SECRET` socraithe — beag beann ar an mbratach seo. Beidh forfheidhmiú mar réamhshocrú in v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Socraigh go `true` é chun filleadh ar iompar aonchéime v3.8.5 ina ndéantar "gach rud a iompórtáil" gan deimhniú ón úsáideoir. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Deais, sioncronú | URL poiblí le haghaidh redirect_uri OAuth, naisc Deaise, agus URLanna poiblí ginte. Socraigh é seo don URL poiblí cobhsaí nuair is gá d'aisghlaonna OAuth nó do naisc bhrabhsálaí ghinte óstach canónach seachfhreastalaí droim ar ais a úsáid. | -| `NEXT_PUBLIC_CLOUD_URL` | _(folamh)_ | Taobh an chliaint | Scáthán ar thaobh an chliaint de `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(gan socrú)_ | `src/shared/services/cloudSyncScheduler.ts` | Cúltaca oidhreachta do `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(gan socrú)_ | Réiteoir tionscnaimh phoiblí, URLanna íomhá | Tionscnamh OmniRoute don bhrabhsálaí leis an tosaíocht is airde, a úsáidtear chun URLanna poiblí a ghiniúint agus chun tionscnamh brabhsálaí nach mbaineann leis an Deais a bhailíochtú. Socraigh é seo nuair a shroicheann OpenWebUI nó athsheachadán eile OmniRoute trí URL inmheánach ach nuair is gá do bhrabhsálaí an úsáideora meáin ghinte a fháil ó LAN, ó thollán, nó ó thionscnamh poiblí. Ná cuir `/v1` san áireamh. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(gan socrú)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL absalóideach léiriúcháin bhreiseáin soláthraí a fhógraítear do chliaint taobhcharr. Nuair nach bhfuil sé socraithe, díorthaíonn OmniRoute `/api/v1/provider-plugin-manifest` ó thionscnamh na hiarrata nó ó HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Prótacal a úsáidtear agus URL léiriúcháin bhreiseáin an tsoláthraí á dhíorthú ó HOST/PORT gan tionscnamh iarrata. Socraigh go `https` é taobh thiar de sheachfhreastalaí poiblí a fhoirceannann TLS nuair nach bhfuil `OMNIROUTE_PROVIDER_MANIFEST_URL` follasach socraithe. | -| `OMNIROUTE_TRUST_PROXY` | _(gan socrú)_ | `src/server/origin/publicOrigin.ts` | Mód iontaoibhe roghnach do cheanntásca tionscnaimh phoiblí curtha ar aghaidh. Gan socrú = ná bíodh muinín agat as `Forwarded` / `X-Forwarded-*` le haghaidh cinntí slándála. Cuireann `true` / `loopback` muinín in óstach/prótacal curtha ar aghaidh ó sheachfhreastalaí aisfhillte stampáilte le comhartha amháin. Cuireann `private` / `lan` muinín freisin i bpiaraí seachfhreastalaí LAN phríobháidigh. B'fhearr `NEXT_PUBLIC_BASE_URL` follasach i dtáirgeadh. | -| `KIE_CALLBACK_URL` | _(gan socrú)_ | `open-sse/utils/kieTask.ts` | URL poiblí aisghlaoigh do jabanna neamhshioncronacha kie.ai. Sárú leis an tosaíocht is airde roimh `OMNIROUTE_KIE_CALLBACK_URL` agus `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(gan socrú)_ | `open-sse/utils/kieTask.ts` | Litriú malartach ar `KIE_CALLBACK_URL`. Úsáidtear mar chúltaca é nuair nach bhfuil an phríomhathróg socraithe. | -| `OMNIROUTE_PUBLIC_URL` | _(gan socrú)_ | `open-sse/utils/kieTask.ts` | Tionscnamh poiblí a úsáidtear chun URLanna neamhshioncronacha aisghlaoigh a chumadh. Cúltaca leis an tosaíocht is ísle d'aisghlaonna kie.ai; úsáidtear freisin é mar URL poiblí cineálach d'athsheachadáin eile. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Críochphointe cuardaigh cuóta CrofAI a úsáideann an leathanach Úsáide. Sáraigh é d'athsheachadáin / daingneáin tástála. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Críochphointe oifigiúil úsáide OpenCode Go atá fíordheimhnithe le heochair API agus a úsáideann an leathanach Úsáide. Sáraigh é d'athsheachadáin / daingneáin tástála. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintéisigh ceanntásca aitheantais CLI OpenCode (User-Agent, x-opencode-client/project, UUIDanna iarrata/seisiúin) ar iarratais réamhtheachtacha opencode-go/zen nár sheol an cliant iad, ionas go nglacfaidh Cloudflare leo ar bhealach amach VPS (#6210/#5997). Ar siúl de réir réamhshocraithe ó #10571; díroghnaigh le `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | An User-Agent réamhshocraithe a úsáidtear nuair atá `OPENCODE_SYNTHESIZE_CLI_HEADERS` ar siúl agus nach bhfuil sárú `_USER_AGENT` in aghaidh an tsoláthraí socraithe. Ní chuirtear i bhfeidhm é ach ar fheidhmitheoirí opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Luach don cheanntásc sintéisithe `x-opencode-client` nuair atá `OPENCODE_SYNTHESIZE_CLI_HEADERS` ar siúl. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Luach don cheanntásc sintéisithe `x-opencode-project` nuair atá `OPENCODE_SYNTHESIZE_CLI_HEADERS` ar siúl. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL shocruithe Ollama Cloud a úsáidtear chun sonraí cuóta a scríobadh. Sáraigh é d'athsheachadáin / daingneáin tástála. | -| `OLLAMA_USAGE_COOKIE` | _(gan socrú)_ | `open-sse/services/usage.ts` | Fianán `__Secure-session` Ollama Cloud a úsáidtear chun sonraí cuóta a scríobadh ó leathanach na socruithe. Íogair; b'fhearr an réimse Deaise in aghaidh an naisc nuair atá cuntais iolracha cumraithe. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(gan socrú)_ | `open-sse/services/usage.ts` | Athróg timpeallachta mhalartach d'fhianán `__Secure-session` Ollama Cloud. Íogair; b'fhearr an réimse Deaise in aghaidh an naisc nuair atá cuntais iolracha cumraithe. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(gan socrú)_ | `open-sse/services/usage.ts` | Athróg timpeallachta mhalartach d'fhianán `__Secure-session` Ollama Cloud a úsáidtear roimh na hailiasanna is giorra. Íogair; b'fhearr an réimse Deaise in aghaidh an naisc nuair atá cuntais iolracha cumraithe. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Críochphointe teorainneacha úsáide CodeWhisperer (AWS Kiro). Sáraigh é d'athsheachadáin / daingneáin tástála. | +## 7. URLanna & Sioncronú Néal + +| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL ar thaobh an fhreastalaí a úsáideann jabanna sioncronaithe inmheánacha chun `/api/sync/cloud` a ghlaoch. Coinnigh mar URL aisfhillteáin/coimeádáin é seo fiú nuair a bhíonn seachfhreastalaí poiblí os comhair na haipe. | +| `CLOUD_URL` | _(folamh)_ | `src/lib/cloudSync.ts` | URL chríochphointe athsheachadta néil (gné phréimhe). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Teorainn ama HTTP le haghaidh iarrataí sioncronaithe néil. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Cumraíocht tógála Webpack | Próifíl aimsir thógála (socraigh go `minimal` í chun modúil phribhléideacha a eisiamh go fisiciúil ón mbeart). | +| `OMNIROUTE_STANDALONE_DIR` | _aschur neamhspleách .build/_ | `scripts/build/colocate-standalone.mjs` | Sárú aimsir thógála don chomhadlann aschuir neamhspleách a úsáideann céim an chomhshocraithe iarthógála. Ní socrú am rite é. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(folamh)_ | `src/lib/cloudSync.ts` | Rún comhroinnte a úsáidtear chun síniú HMAC-SHA256 na bhfreagairtí Sioncronaithe Néal a fhíorú. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Socraigh go `true` é chun ligean do chríochphointe an tSioncronaithe Néal dintiúir áitiúla a fhorscríobh. Is é `false` an réamhshocrú. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Socraigh go `true` é chun freagairt neamhshínithe ón Sioncronú Néal a dhiúltú nuair nach bhfuil aon rún áitiúil cumraithe (#13679). Fíoraítear síniú atá i láthair i gcónaí — agus diúltaítear dó i gcónaí nuair nach bhfuil `OMNIROUTE_CLOUD_SYNC_SECRET` socraithe — beag beann ar an mbratach seo. Athraíonn an réamhshocrú go forfheidhmiú in v3.9. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Socraigh go `true` é chun filleadh ar iompar aonchéime "iompórtáil gach rud" v3.8.5 gan deimhniú ón úsáideoir. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Deais, sioncronú | URL poiblí le haghaidh redirect_uri OAuth, naisc Deaise, agus URLanna poiblí ginte. Socraigh é seo mar an URL poiblí cobhsaí nuair is gá d’aisghlaonna OAuth nó do naisc bhrabhsálaí ginte óstach canónach seachfhreastalaí droim ar ais a úsáid. | +| `NEXT_PUBLIC_CLOUD_URL` | _(folamh)_ | Taobh an chliaint | Scáthán ar thaobh an chliaint de `CLOUD_URL`. | +| `NEXT_PUBLIC_APP_URL` | _(gan socrú)_ | `src/shared/services/cloudSyncScheduler.ts` | Cúltaca oidhreachta do `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(gan socrú)_ | Réiteoir tionscnaimh phoiblí, URLanna íomhánna | Tionscnamh OmniRoute don bhrabhsálaí leis an tosaíocht is airde, a úsáidtear chun URLanna poiblí a ghiniúint agus chun tionscnamh brabhsálaí nach mbaineann leis an deais a bhailíochtú. Socraigh é seo nuair a shroicheann OpenWebUI nó athsheachadán eile OmniRoute trí URL inmheánach ach nuair is gá do bhrabhsálaí an úsáideora meáin ghinte a fháil ó LAN, tollán nó tionscnamh poiblí. Ná cuir `/v1` san áireamh. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(gan socrú)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL absalóideach do léiriú breiseán an tsoláthraí a fhógraítear do chliaint taobhcharr. Nuair nach bhfuil sé socraithe, díorthaíonn OmniRoute `/api/v1/provider-plugin-manifest` ó thionscnamh an iarratais nó ó HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | An prótacal a úsáidtear agus URL léiriú breiseán an tsoláthraí á dhíorthú ó HOST/PORT gan tionscnamh iarratais. Socraigh go `https` é taobh thiar de sheachfhreastalaí poiblí a chríochnaíonn TLS nuair nach bhfuil `OMNIROUTE_PROVIDER_MANIFEST_URL` sainráite socraithe. | +| `OMNIROUTE_TRUST_PROXY` | _(gan socrú)_ | `src/server/origin/publicOrigin.ts` | Mód roghnach iontaoibhe do cheanntásca tionscnaimh phoiblí arna gcur ar aghaidh. Gan socrú = ná cuir muinín in `Forwarded` / `X-Forwarded-*` le haghaidh cinntí slándála. Cuireann `true` / `loopback` muinín san óstach/prótacal a cuireadh ar aghaidh ó sheachfhreastalaí aisfhillte stampáilte le comhartha amháin. Cuireann `private` / `lan` muinín freisin i bpiaraí seachfhreastalaí LAN phríobháidigh. Is fearr `NEXT_PUBLIC_BASE_URL` sainráite i dtáirgeadh. | +| `KIE_CALLBACK_URL` | _(gan socrú)_ | `open-sse/utils/kieTask.ts` | URL poiblí aisghlaoigh do jabanna asincrónacha kie.ai. An sárú leis an tosaíocht is airde roimh `OMNIROUTE_KIE_CALLBACK_URL` agus `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(gan socrú)_ | `open-sse/utils/kieTask.ts` | Litriú malartach ar `KIE_CALLBACK_URL`. Úsáidtear é mar chúltaca nuair nach bhfuil an phríomh-athróg socraithe. | +| `OMNIROUTE_PUBLIC_URL` | _(gan socrú)_ | `open-sse/utils/kieTask.ts` | Tionscnamh poiblí a úsáidtear chun URLanna aisghlaoigh asincrónacha a chumadh. An cúltaca leis an tosaíocht is ísle d’aisghlaonna kie.ai; úsáidtear é freisin mar URL poiblí ginearálta d’athsheachadáin eile. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Críochphointe cuardaigh cuóta CrofAI a úsáideann an leathanach Úsáide. Sáraigh é le haghaidh athsheachadán / daingneán tástála. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Críochphointe oifigiúil úsáide OpenCode Go atá fíordheimhnithe le heochair API agus a úsáideann an leathanach Úsáide. Sáraigh é le haghaidh athsheachadán / daingneán tástála. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintéisigh ceanntásca aitheantais CLI OpenCode (User-Agent, x-opencode-client/project, UUIDanna iarratais/seisiúin) ar iarratais réamhtheachtacha opencode-go/zen nár sheol an cliant iad, ionas go nglacfaidh Cloudflare leo ar imeacht VPS (#6210/#5997). Ar siúl de réir réamhshocraithe ó #10571; díliostáil le `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | An User-Agent réamhshocraithe a úsáidtear nuair atá `OPENCODE_SYNTHESIZE_CLI_HEADERS` ar siúl agus nach bhfuil sárú `_USER_AGENT` in aghaidh an tsoláthraí socraithe. Ní chuirtear i bhfeidhm é ach ar riteoirí opencode. Ar iarratas gan eochair a gcuireann an réamhtheachtach geata air, cuirtear an réamhshocrú seo in ionad luach cumraithe nach bhfuil `opencode/= 1.17>` ann seachas é a dhiúltú. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Luach don cheanntásc sintéisithe `x-opencode-client` nuair atá `OPENCODE_SYNTHESIZE_CLI_HEADERS` ar siúl. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Luach don cheanntásc sintéisithe `x-opencode-project` nuair atá `OPENCODE_SYNTHESIZE_CLI_HEADERS` casta air. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(gan socrú)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Socraigh mar `off` é chun stop a chur le corp iarrataí OpenCode gan eochair a choigeartú (an bhratach sruthaithe agus liosta na n-uirlisí). Cuirtear na ceanntásca i bhfeidhm fós. Léitear é le haghaidh gach iarrata, mar sin tagann athrú i bhfeidhm láithreach. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(gan socrú)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Ainmneacha uirlisí scartha le camóga atá le dearbhú ar iarratas OpenCode gan eochair nach bhfuil aon cheann aige, nuair nach bhfuil aon rud tugtha faoi deara fós don tsamhail sin. Má tá sé folamh, úsáidtear ionadchoinneálaí aonair agus deirtear leis an tsamhail gan é a ghlaoch. Uasmhéid 32 iontráil, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; déantar neamhaird d'iontrálacha neamhbhailí. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL socruithe Ollama Cloud a úsáidtear chun sonraí cuóta a scríobadh. Sáraigh é le haghaidh athsheachadán / daingneán tástála. | +| `OLLAMA_USAGE_COOKIE` | _(gan socrú)_ | `open-sse/services/usage.ts` | Fianán `__Secure-session` Ollama Cloud a úsáidtear chun sonraí cuóta a scríobadh ó leathanach na socruithe. Íogair; b'fhearr an réimse Deaise in aghaidh an naisc nuair atá cuntais iolracha cumraithe. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(gan socrú)_ | `open-sse/services/usage.ts` | Athróg timpeallachta mhalartach don fhianán `__Secure-session` Ollama Cloud. Íogair; b'fhearr an réimse Deaise in aghaidh an naisc nuair atá cuntais iolracha cumraithe. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(gan socrú)_ | `open-sse/services/usage.ts` | Athróg timpeallachta mhalartach don fhianán `__Secure-session` Ollama Cloud a úsáidtear roimh na hailiasanna níos giorra. Íogair; b'fhearr an réimse Deaise in aghaidh an naisc nuair atá cuntais iolracha cumraithe. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Críochphointe teorainneacha úsáide CodeWhisperer (AWS Kiro). Sáraigh é le haghaidh athsheachadán / daingneán tástála. | > [!IMPORTANT] -> Agus tú ag imscaradh taobh thiar de sheachfhreastalaí droim ar ais (nginx, Caddy), socraigh `NEXT_PUBLIC_BASE_URL` chuig do URL poiblí cobhsaí (m.sh., `https://omniroute.example.com`) nuair is gá d'aisghlaonna OAuth nó do naisc phoiblí ghinte an t-óstainm sin a úsáid. Gan é seo, d'fhéadfadh teip teacht ar aisghlaonna OAuth toisc nach mbeidh an redirect_uri ag teacht leis, agus d'fhéadfadh naisc phoiblí ghinte a bheith dírithe ar bhunús inmheánach an choimeádáin. +> Agus imscaradh á dhéanamh taobh thiar de sheachfhreastalaí droim ar ais (nginx, Caddy), socraigh `NEXT_PUBLIC_BASE_URL` mar do URL poiblí cobhsaí (m.sh., `https://omniroute.example.com`) nuair is gá d'aisghlaonna OAuth nó do naisc phoiblí ghinte an t-óstainm sin a úsáid. Gan é seo, d'fhéadfadh go dteipfeadh ar aisghlaonna OAuth toisc nach mbeidh `redirect_uri` ag teacht leis agus d'fhéadfadh naisc phoiblí ghinte a bheith dírithe ar bhunphointe inmheánach an choimeádáin. > -> Coinnigh `BASE_URL` mar URL lúb-ais/coimeádáin inmheánach le haghaidh jabanna ó fhreastalaí go freastalaí. Ná húsáid `Origin` brabhsálaí ná óstainm poiblí le haghaidh féin-iarraidh inmheánach ina bhfuil dintiúir. +> Coinnigh `BASE_URL` mar URL aisfhillte/coimeádáin inmheánach le haghaidh jabanna ó fhreastalaí go freastalaí. Ná húsáid `Origin` brabhsálaí ná óstainm poiblí le haghaidh féin-aisghabhálacha inmheánacha a iompraíonn dintiúir. > -> Ní theastaíonn bun-URL poiblí statach le haghaidh scríobhanna fíordheimhnithe an deais: seolann an deais iarrataí neamhshábháilte den bhunús céanna le comhartha CSRF atá ceangailte leis an seisiún. Déanann OmniRoute bailíochtú an bhunúis phoiblí a lárú fós le haghaidh comhtháthuithe brabhsálaí nach mbaineann leis an deais: cuirtear muinín ar dtús in athróga timpeallachta sainráite URL phoiblí; déantar neamhaird de cheanntásca amh `Forwarded` / `X-Forwarded-*` mura bhfuil `OMNIROUTE_TRUST_PROXY` cumasaithe agus mura bhfuil an piara seachfhreastalaí díreach marcáilte le comhartha mar cheann iontaofa. Ná húsáid socruithe CORS chun iarrataí deais den bhunús céanna a dheisiú; níl CORS ann ach le haghaidh cliant brabhsálaí tras-bhunaidh. +> Ní theastaíonn URL bonn poiblí statach le haghaidh scríobhanna fíordheimhnithe na Deaise: seolann an Deais iarrataí neamhshábháilte den bhunús céanna le comhartha CSRF atá ceangailte leis an seisiún. Déanann OmniRoute bailíochtú an bhunúis phoiblí a lárú fós le haghaidh comhtháthuithe brabhsálaí nach mbaineann leis an Deais: cuirtear muinín ar dtús in athróga timpeallachta follasacha don URL poiblí; déantar neamhaird de cheanntásca loma `Forwarded` / `X-Forwarded-*` mura bhfuil `OMNIROUTE_TRUST_PROXY` cumasaithe agus mura bhfuil comhartha iontaoibhe stampáilte ar an bpiara seachfhreastalaí díreach. Ná húsáid socruithe CORS chun iarrataí Deaise den bhunús céanna a dheisiú; níl CORS ann ach do chliaint bhrabhsálaí trasbhunúis. --- @@ -587,47 +594,48 @@ brath taobhchoimeádáin thuas). ## 11. Dintiúir Soláthraí OAuth -Dintiúir ionsuite d’fhorbairt ar **localhost**. Le haghaidh imlonnuithe cianda, cláraigh do dhintiúir féin i gconsól forbróra gach soláthraí. - -| Athróg | Soláthraí | Nótaí | -| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Cliant poiblí — níl aon rún ag teastáil. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Sáraigh an URI atreoraithe. Réamhshocrú: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Cliant poiblí. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Teastaíonn `_SECRET` comhoiriúnach. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Cliant poiblí. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Teastaíonn `_SECRET` comhoiriúnach. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Cliant poiblí. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Sárú roghnach d’aitheantas cliaint OAuth GitHub Enterprise Copilot. Úsáidtear réamhshocrú poiblí `GITHUB_OAUTH_CLIENT_ID` mar chúltaca nuair nach bhfuil sé socraithe. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Cúltaca eochrach API a úsáideann `open-sse/executors/devin-cli.ts` nuair nach bhfuil dintiúr in aghaidh an naisc ar fáil. Roghnach. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Conair shaincheaptha chuig dénártha Devin CLI (`devin`). Réitítear í le `open-sse/executors/devin-cli.ts`. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Aitheantas cliaint OAuth do GitLab Duo. Cláraigh aip ag `https://gitlab.com/-/profile/applications` leis an URI atreoraithe `/callback` agus na scóip `api, read_user, openid, profile, email`. Úsáidtear `GITLAB_OAUTH_CLIENT_ID` mar chúltaca. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Rún cliaint OAuth do GitLab Duo. Roghnach — ní éilíonn sreabhadh PKCE rún. Úsáidtear `GITLAB_OAUTH_CLIENT_SECRET` mar chúltaca. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Sáraigh bun-URL GitLab (GitLab féinóstáilte). Is é `https://gitlab.com` an réamhshocrú. Úsáidtear `GITLAB_BASE_URL` mar chúltaca. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Cúltaca oidhreachta do `GITLAB_DUO_BASE_URL`. Úsáidtear é nuair nach bhfuil an leagan `_DUO_` socraithe. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Cúltaca oidhreachta do `GITLAB_DUO_OAUTH_CLIENT_ID` a úsáideann `src/lib/oauth/constants/oauth.ts`. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Cúltaca oidhreachta do `GITLAB_DUO_OAUTH_CLIENT_SECRET` a úsáideann `src/lib/oauth/constants/oauth.ts`. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Socraigh é chun Qoder OAuth a chumasú. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Cúltaca díreach eochrach API (seachnaítear OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | Aitheantas spáis oibre do Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Ailias do `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Sáraigh comhadlann chumraíochta Qoder CLI (seisiún PAT leithlisithe, seachnaítear logáil isteach brabhsálaí a fhorscríobh). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Comhartha `tk` an éadain le seoladh mar `validated` ar `/api/chat`. Riachtanach nuair a chuireann Blackbox meaitseáil comharthaí i bhfeidhm; murach sin, úsáideann OmniRoute UUID randamach mar chúltaca. Féach eagrán #2252. | -| `VISION_BRIDGE_BASE_URL` | Ráille cosanta Vision Bridge | Bun-URL atá comhoiriúnach le OpenAI do ghlaonna vision-bridge nach glaonna Anthropic iad. Úsáidtear URL timpeallachta oidhreachta OpenAI nó api.openai.com mar réamhshocrú. Dírigh é ar féinlúb `/v1` OmniRoute nó ar aon chríochphointe atá comhoiriúnach le OpenAI (Gemini OpenAI-compat, OpenRouter). Eagrán #2232. Nuair is é `/v1` OmniRoute féin an URL, seolann an fo-iarratas tuairiscithe `x-omniroute-admission-bypass: internal` agus fíordheimhníonn sé leis an dintiúr féinlúibe réitithe (fairtheoir `sk_omniroute` sa mhód áitiúil, nó `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) ionas go n-oibreoidh imscaradh le `REQUIRE_API_KEY=true`. | -| `VISION_BRIDGE_API_KEY` | Ráille cosanta Vision Bridge | Eochair API don URL thuas. Sáraíonn sí athróga timpeallachta OpenAI / Google in aghaidh an tsoláthraí do ghlaonna vision-bridge nach glaonna Anthropic iad. Coinníonn samhlacha Anthropic a gconair thiomnaithe eochrach Anthropic. Eagrán #2232. | +Dintiúir ionsuite le haghaidh **forbairt localhost**. Le haghaidh imscaradh cianda, cláraigh do dhintiúir féin i gconsól forbróra gach soláthraí. + +| Athróg | Soláthraí | Nótaí | +| --------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Cliant poiblí — níl aon rún ag teastáil. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Sáraigh an URI atreoraithe. Réamhshocrú: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Cliant poiblí. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Teastaíonn `_SECRET` comhoiriúnach. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Cliant poiblí. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Teastaíonn `_SECRET` comhoiriúnach. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Cliant poiblí. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Sárú roghnach ar ID cliant OAuth GitHub Enterprise Copilot. Úsáidtear réamhshocrú poiblí `GITHUB_OAUTH_CLIENT_ID` mar chúltaca nuair nach bhfuil sé socraithe. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Sárú roghnach ar ID comhtháthaithe cliant GitHub Copilot a sheoltar sna ceanntásca `Copilot-Integration-Id` agus `Editor-Plugin-Version`. Is é `copilot-developer-cli` an réamhshocrú. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Cúltaca eochrach API a úsáideann `open-sse/executors/devin-cli.ts` nuair nach bhfuil dintiúr ar fáil don nasc ar leith. Roghnach. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Conair shaincheaptha chuig dénártha Devin CLI (`devin`). Réitíonn `open-sse/executors/devin-cli.ts` í. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID cliant OAuth le haghaidh GitLab Duo. Cláraigh aip ag `https://gitlab.com/-/profile/applications` leis an URI atreoraithe `/callback` agus na scóip `api, read_user, openid, profile, email`. Úsáidtear `GITLAB_OAUTH_CLIENT_ID` mar chúltaca. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Rún cliant OAuth le haghaidh GitLab Duo. Roghnach — ní theastaíonn rún ón sreabhadh PKCE. Úsáidtear `GITLAB_OAUTH_CLIENT_SECRET` mar chúltaca. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Sáraigh bun-URL GitLab (GitLab féinóstáilte). Is é `https://gitlab.com` an réamhshocrú. Úsáidtear `GITLAB_BASE_URL` mar chúltaca. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Cúltaca oidhreachta le haghaidh `GITLAB_DUO_BASE_URL`. Úsáidtear é nuair nach bhfuil an leagan `_DUO_` socraithe. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Cúltaca oidhreachta do `GITLAB_DUO_OAUTH_CLIENT_ID` arna húsáid ag `src/lib/oauth/constants/oauth.ts`. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Cúltaca oidhreachta do `GITLAB_DUO_OAUTH_CLIENT_SECRET` arna húsáid ag `src/lib/oauth/constants/oauth.ts`. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Socraigh é chun Qoder OAuth a chumasú. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Cúltaca díreach eochrach API (seachnaíonn sé OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | Aitheantas spás oibre do Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Ailias do `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Sáraigh comhadlann cumraíochta Qoder CLI (seisiún PAT leithlisithe, seachnaíonn sé logáil isteach brabhsálaí a fhorscríobh). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Comhartha `tk` an chomhéadain úsáideora le seoladh mar `validated` ar `/api/chat`. Riachtanach nuair a chuireann Blackbox meaitseáil comharthaí i bhfeidhm; murach sin, filleann OmniRoute ar UUID randamach. Féach saincheist #2252. | +| `VISION_BRIDGE_BASE_URL` | Ráille cosanta Vision Bridge | Bun-URL atá comhoiriúnach le OpenAI do ghlaonna droichid físe neamh-Anthropic. Úsáidtear URL oidhreachta OpenAI ón timpeallacht nó api.openai.com mar réamhshocrú. Dírigh é ar fhéinlúb `/v1` OmniRoute nó ar aon chríochphointe atá comhoiriúnach le OpenAI (Gemini OpenAI-compat, OpenRouter). Saincheist #2232. Nuair is é `/v1` OmniRoute féin an URL, seolann an fofhearratas tuairiscithe `x-omniroute-admission-bypass: internal` agus fíordheimhníonn sé leis an dintiúr féinlúibe réitithe (an fairtheoir `sk_omniroute` sa mhód áitiúil, nó `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) ionas go n-oibreoidh imscarthaí `REQUIRE_API_KEY=true`. | +| `VISION_BRIDGE_API_KEY` | Ráille cosanta Vision Bridge | Eochair API don URL thuas. Sáraíonn sí athróga timpeallachta OpenAI / Google de réir soláthraí do ghlaonna droichid físe neamh-Anthropic. Coinníonn samhlacha Anthropic a gcosán tiomnaithe eochrach Anthropic. Saincheist #2232. | > [!WARNING] > -> 1. Téigh chuig [Google Cloud Console → Dintiúir](https://console.cloud.google.com/apis/credentials) +> 1. Téigh chuig [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) > 2. Cruthaigh Aitheantas Cliant OAuth 2.0 (cineál: "Feidhmchlár gréasáin") > 3. Cuir URL do fhreastalaí leis mar URI atreoraithe údaraithe -> 4. Cuir na luachanna dintiúr in `.env` in ionad na luachanna reatha. +> 4. Cuir na luachanna dintiúir in `.env` ina n-ionad. --- @@ -730,139 +738,140 @@ Patrún a aithnítear: `{PROVIDER_ID}_API_KEY` ## 15. Socruithe Teorann Ama -Tá na luachanna uile i **milleasoicindí**. Taifeach láraithe in `src/shared/utils/runtimeTimeouts.ts`. +Tá na luachanna uile i **milleasoicindí**. Réiteach láraithe in `src/shared/utils/runtimeTimeouts.ts`. ### Ordlathas na dTeorainneacha Ama ``` REQUEST_TIMEOUT_MS (sárú domhanda) ├─→ FETCH_TIMEOUT_MS (glaonna ar sholáthraithe réamhtheachtacha, réamhshocrú: 600000) -│ ├─→ FETCH_HEADERS_TIMEOUT_MS (faigheann sé a luach le hoidhreacht ó FETCH_TIMEOUT_MS) -│ ├─→ FETCH_BODY_TIMEOUT_MS (faigheann sé a luach le hoidhreacht ó FETCH_TIMEOUT_MS) -│ ├─→ TLS_CLIENT_TIMEOUT_MS (faigheann sé a luach le hoidhreacht ó FETCH_TIMEOUT_MS) +│ ├─→ FETCH_HEADERS_TIMEOUT_MS (faigheann sé le hoidhreacht ó FETCH_TIMEOUT_MS) +│ ├─→ FETCH_BODY_TIMEOUT_MS (faigheann sé le hoidhreacht ó FETCH_TIMEOUT_MS) +│ ├─→ TLS_CLIENT_TIMEOUT_MS (faigheann sé le hoidhreacht ó FETCH_TIMEOUT_MS) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (neamhspleách, réamhshocrú: 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (neamhspleách, réamhshocrú: 15000) │ ├── FETCH_CONNECT_TIMEOUT_MS (neamhspleách, réamhshocrú: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (neamhspleách, réamhshocrú: 4000) -├─→ STREAM_IDLE_TIMEOUT_MS (faigheann sé a luach le hoidhreacht ó REQUEST_TIMEOUT_MS, réamhshocrú: 600000) +├─→ STREAM_IDLE_TIMEOUT_MS (faigheann sé le hoidhreacht ó REQUEST_TIMEOUT_MS, réamhshocrú: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (neamhspleách, réamhshocrú: 1260000; díchumasaíonn 0 é) -├─→ STREAM_READINESS_TIMEOUT_MS (faigheann sé a luach le hoidhreacht ó REQUEST_TIMEOUT_MS, réamhshocrú: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (cuireann sé uasteorainn le síntí oiriúnaitheacha ullmhachta, réamhshocrú: 180000) -└─→ API_BRIDGE_PROXY_TIMEOUT_MS (faigheann sé a luach le hoidhreacht ó REQUEST_TIMEOUT_MS, réamhshocrú: 30000) +├─→ STREAM_READINESS_TIMEOUT_MS (faigheann sé le hoidhreacht ó REQUEST_TIMEOUT_MS, réamhshocrú: 80000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (cuireann sé teorainn le síntí oiriúnaitheacha ullmhachta, réamhshocrú: 180000) +└─→ API_BRIDGE_PROXY_TIMEOUT_MS (faigheann sé le hoidhreacht ó REQUEST_TIMEOUT_MS, réamhshocrú: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (díorthaithe, réamhshocrú: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (réamhshocrú: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (réamhshocrú: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (réamhshocrú: 0 = díchumasaithe) ``` -| Athróg | Réamhshocrú | Cur síos | -| ----------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUEST_TIMEOUT_MS` | _(gan socrú)_ | Aicearra domhanda — sáraíonn sé réamhshocruithe `FETCH_TIMEOUT_MS` agus `STREAM_IDLE_TIMEOUT_MS` araon. | -| `FETCH_TIMEOUT_MS` | `600000` | Teorainn ama iomlán an iarratais HTTP le haghaidh glaonna ar sholáthraithe réamhtheachtacha. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | An tost uasta idir bearta amha réamhtheachtacha sula ndéantar scor. Is annamh a ghlacann samhlacha le smaointeoireacht leathnaithe sos >90s. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Saolré uasta iomlán srutha ghníomhaigh SSE; ní athshocraítear riamh í de bharr bearta réamhtheachtacha agus tá sí neamhspleách ar `REQUEST_TIMEOUT_MS`. Díorthaítear í ón `timeoutMs` is mó in aghaidh na samhla sa chlár (1200000, Codex), móide corrlach 60000, ionas nach marófar samhail i lár freagra nuair a cheadaítear di a buiséad iomlán a úsáid. Socraigh mar `0` chun í a dhíchumasú. | -| `OMNIROUTE_SSE_COMMENTS` | _(díchumasaithe)_ | Cé acu is féidir le OmniRoute línte nóta tráchta SSE `:` a astú (m.sh. an buille croí `: keepalive` agus leantóirí meiteashonraí `x-omniroute-*`). Díchumasaithe de réir réamhshocraithe (#10524) mar go ndéanann cliaint dhiana atá comhoiriúnach le OpenAI JSON.parse ar gach líne SSE agus tuairteálann siad ar nótaí tráchta `:`; ní dhéantar difear do bhuillí croí `data:`. Socraigh mar `on`/`true`/`1`/`yes` chun athrogha a dhéanamh. Úsáideann `open-sse/utils/sseHeartbeat.ts` é. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | An t-am chun an chéad teagmhas SSE nach ping é a fháil. Faigheann sé `REQUEST_TIMEOUT_MS` le hoidhreacht nuair atá sé socraithe. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Uastréimhse oiriúnaitheach ullmhachta don chéad teagmhas le haghaidh iarratais sruthaithe mhóra, iarratais a úsáideann go leor uirlisí, nó iarratais ard-réasúnaithe. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Lasc díghníomhachtaithe don heorastach `/goal`. Socraigh mar `false`/`0`/`off` chun brath a dhíchumasú go hiomlán — ní mhéadaítear teorainneacha ama ullmhachta ná aisghabháil srutha riamh de bharr chorp/ceanntásca an iarratais, rud a mhaolaíonn aimpliú teorann ama atá faoi rialú an chliaint. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Uastréimhse ullmhachta don chéad teagmhas le haghaidh rití gníomhaire `/goal` braite nó iarratas a fhorchuirtear le `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Cumasaigh aisghabháil luath srutha go huathoibríoch le haghaidh rití gníomhaire `/goal` braite. Socraigh mar `false`/`0`/`off` chun an rogha shainiúil don sprioc a dhíchumasú. Ní féidir leis seo ach aisghabháil a CHUR LE réamhshocrú an oibreora — ní sháraíonn sé riamh díliostáil shainráite i socruithe `STREAM_RECOVERY_ENABLED`/DB. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Bain teagmhais SSE neamhchaighdeánacha `codex.*` (m.sh. `codex.rate_limits`) a bhriseann `responses.stream()` de chuid OpenAI SDK le 502. AR SIÚL de réir réamhshocraithe (#11014). Socraigh mar `0`/`false`/`no`/`off` chun iad a chur ar aghaidh. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(gan socrú)_ | Iompar roghnach freastalaí feidhmchláir Codex. Críochphointe WebSocket (`ws://`/`wss://`) de thaobhcharr áitiúil `codex app-server`. Nuair a shocraítear é in éineacht le comhartha, seoltar iarratais Codex thar JSON-RPC chuig an taobhcharr in ionad HTTP Responses API. Is féidir é a shocrú in aghaidh an naisc freisin trí `providerSpecificData.codexAppServerUrl`. Úsáideann `open-sse/executors/codex/appServerConfig.ts` é. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(gan socrú)_ | Comhartha cumais/iompróra inlíne a chuirtear faoi bhráid an fhreastalaí feidhmchláir. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(gan socrú)_ | Conair chuig comhad ina bhfuil comhartha cumais an fhreastalaí feidhmchláir (ó `codex app-server --ws-token-file`). Úsáidtear é nuair nach bhfuil `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` socraithe. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | An chomhadlann oibre ina ritheann babhta an fhreastalaí feidhmchláir. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(gan socrú)_ | Polasaí ceadaithe a chuirtear ar aghaidh chuig babhta an fhreastalaí feidhmchláir (m.sh. `never`, `on-request`). Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(gan socrú)_ | Polasaí bosca gainimh a chuirtear ar aghaidh chuig babhta an fhreastalaí feidhmchláir (m.sh. `read-only`, `workspace-write`, `danger-full-access`). Nuair nach bhfuil sé socraithe, úsáideann an seiceadóir `workspace-write` mar réamhshocrú (cruaite; `danger-full-access` roimhe seo). Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Ceadaigh go huathoibríoch leideanna ceadaithe an fhreastalaí feidhmchláir féin (ordú/comhad/cead a rith ar an óstach). Múchta de réir réamhshocraithe — diúltaítear leideanna go huathoibríoch; ní dhéantar difear do ghlaonna uirlisí an chreata (taistealaíonn siad tríd an gcur ar aghaidh ar leith `item/tool/call`). Glacann sé le `true`/`1`/`yes`. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | An t-am chun ceanntásca freagartha a fháil. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Uastréimhse feithimh (ms) le haghaidh thús an fhreagra do gach iarracht dhíreach gan seachfhreastalaí. Déantar atriail uair amháin ar shoicéad úr tar éis dul thar am; socraigh go `0` é chun an teorainn a dhíchumasú agus an t-iompar roimhe seo a choinneáil. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | An t-am chun corp iomlán an fhreagra a fháil. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Teorainn ama chun nasc TCP a bhunú. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Teorainn ama díomhaointis don soicéad coinneála beo. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Teorainn ama don seachfhreastalaí méarloirg TLS (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Cuireann sé teorainn shonrach leis an am go dtí an chéad bheart i gcorp iompar méarloirg TLS wreq-js; ní féidir le `TLS_CLIENT_TIMEOUT_MS` amháin corp atá i bhfostú a bhrath toisc go réitítear é a luaithe a thagann na ceanntásca (#12656). Cealaíonn dul thar am an léitheoir wreq agus téann sé ar ais chuig an seoltóir díreach/seachfhreastalaí; díchumasaíonn `0` an faireoir. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Don seiceadóir OpenCode amháin, agus nuair atá bratach ghné `OPENCODE_RESPONSES_STALL_ROTATION` ar siúl amháin (as de réir réamhshocraithe): cuireann sé teorainn leis an bhfeitheamh ar an gcéad bheart de chorp freagra Responses sruthaithe tar éis a cheanntásca (#13484). Osclaíonn sruth Responses le `response.created`, mar sin is stad é tost thar an tréimhse seo: cuirtear an cuntas i dtréimhse shuaimhnithe agus rothlaítear an t-iarratas chuig an gcéad chuntas eile uair amháin; teipeann an dara stad láithreach. Díchumasaíonn `0` an chosaint fiú agus an bhratach ar siúl. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Teorainn ama do chéim an tseachfhreastalaí i gcás iarratais droichid `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Dírigh seiceadóir aisghabhála gréasáin Firecrawl ar ásc féinóstáilte (eochair API roghnach lasmuigh den néal). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Teorainn ama in aghaidh an iarratais do sheiceadóir aisghabhála gréasáin Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Teorainn ama fhoriomlán d'iarratas freastalaí don droichead. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | An t-am chun ceanntásca freagartha a sheoladh tríd an droichead. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Teorainn ama díomhaointis do choinneáil beo an droichid. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Teorainn ama amhshoicéid (0 = díchumasaithe). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Tréimhse cairde ar SIGTERM/SIGINT roimh scor éigeantach. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Cúltaca a úsáideann `src/shared/utils/fetchTimeout.ts` nuair nach bhfuil `FETCH_TIMEOUT_MS` socraithe. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Teorainn ama (ms) do réamhshocruithe `validationRead` agus `modelsProbe` in `src/shared/network/safeOutboundFetch.ts`. Ardaigh í d'chríochphointí malla (Cerebras, Cloudflare AI, Groq) chun luaineacht idir gníomhach/earráid sa deais a chosc. Titeann sé siar go 8000ms i gcás luachanna neamhbhailí (<1000) nó neamhuimhriúla. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Teorainn ama aisghabhála a bhaineann go sonrach leis an athsheachadán in `open-sse/utils/proxyFetch.ts` (#9158). Ní mór d'athsheachadán atá i bhfostú teip roimh theorainn ama an chliaint/ghníomhaire (~30s) ionas go bhfeicfidh glaoiteoirí teip a bhaineann go sonrach leis an athsheachadán in ionad teorainn ama ghinearálta réamhtheachtach. Cuirtear uasteorainn `29000` air ionas go ngníomhóidh sé ar dtús i gcónaí. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Cúlú comhroinnte atrialach do na conairí díreacha/athsheachadáin/seachfhreastalaí a dhéanann atriail uair amháin in `open-sse/utils/proxyFetch.ts` (#9158). `0` = déan atriail láithreach. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Teorainn ama dhúchasach d'iarratas wreq-js (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Tréimhse cairde go dtí sprioc-am crua absalóideach JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Teorainn ama dhúchasach d'iarratas wreq-js (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Tréimhse cairde go dtí sprioc-am crua absalóideach JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (as) | Cuireann sé "Tá cuardach gréasáin ionsuite agat. Freagair ceisteanna go díreach agus torthaí cuardaigh á n-úsáid agat." le teachtaireacht chórais an ghlaoiteora (`perplexity-web/protocol.ts`). Bíonn sé as de réir réamhshocraithe — déanann Perplexity cuardaigh ar aon nós, agus sceitheann an abairt isteach i bhfreagraí mar mheitráchtaireacht do chliaint chódaithe. Socraigh `1`/`true`/`yes`/`on` chun é a athbhunú. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Teorainn ama iarratais dhúchasach wreq-js (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Tréimhse chairde absalóideach do sprioc-am crua JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Teorainn ama iarratais dhúchasach wreq-js (`notionTlsClient.ts`); ardaíonn `notion-web` í in aghaidh an iarratais go `180000` le haghaidh giniúintí fada. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Tréimhse chairde absalóideach do sprioc-am crua JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Linn chomhroinnte brabhsálaithe Playwright le haghaidh comhrá fianán gréasáin a bhfuil brabhsálaí mar bhonn aige (`browserPool.ts`); socraigh `off` chun é a dhíchumasú. | -| `OBSCURA_BIN` | `auto-detect` | Conair chuig an dénártha `obscura` a úsáideann linn na mbrabhsálaithe agus riteoir Cloudflare Playground mar phríomhinneall (`open-sse/services/obscura.ts`); braitear go huathoibríoch é ó PATH an chórais nuair nach bhfuil sé socraithe. | -| `OBSCURA_CDP_ENDPOINT` | _(gan socrú)_ | Dírigh ar Obscura atá ag rith cheana (`http://host:port`) seachas ceann a thosú; ní leis an modúl an próiseas sin (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | Port sainráite don `obscura serve` a thosaítear; roghnaítear port saor go huathoibríoch nuair nach bhfuil sé socraithe (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Cuir iarratas comhrá fianán gréasáin isteach sa chonair a bhfuil brabhsálaí mar bhonn aici (`browserBackedChat.ts`); `1` lena chumasú. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Bun-URL do riteoir Kimi Web (Connect-RPC idirnáisiúnta kimi.ai) (`kimi-web.ts`); ná sáraigh é ach amháin le haghaidh críochphointí scátháin/seachfhreastalaí. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Críochphointe iomlán comhrá do riteoir Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(braite go huathoibríoch)_ | Conair chuig comhad inrite Chrome/Edge córais le haghaidh shíniú isteach idirghníomhach Adobe Firefly sa bhrabhsálaí (`adobeFireflyBrowserLogin.ts`); sáraíonn sé braite uathoibríoch de réir an chórais oibriúcháin. | -| `OMNIROUTE_STANDALONE_DIR` | _aschur neamhspleách .build/_ | Sárú ag am tógála don chomhadlann aschuir neamhspleách a úsáideann céim na comhlonnaithe iar-thógála (`scripts/build/colocate-standalone.mjs`); uirlisí tógála, ní am rite. | - -Faigheann iarrachtaí sprice teaglama an teorainn ama réitithe don iarratas réamhtheachtach le hoidhreacht (`FETCH_TIMEOUT_MS`, nó -`REQUEST_TIMEOUT_MS` nuair a sholáthraíonn sé an réamhshocrú faighte). Socraigh `targetTimeoutMs` i dteaglama, -i réamhshocruithe teaglama, nó i sárú soláthraí chun cúltaca an teaglama a dhéanamh níos tapúla amháin; cuirtear teorainn atá cothrom le teorainn ama an iarratais réamhtheachtaigh -reatha ar luachanna os a cionn. - -Is buiséad ama cloig balla ar leith é `comboTimeoutMs` don teaglama iomlán thar na spriocanna teipaistrithe. -Fág gan socrú é nó socraigh mar `0` é chun atriall gan teorainn a choinneáil (tá feidhm fós ag an stad crochta 10 nóiméad -`COMBO_LOOP_SAFETY_TIMEOUT_MS`). Tagann luach deimhneach in ionad na -cosanta sin don teaglama. Coinnigh `comboTimeoutMs` níos faide ná `targetTimeoutMs` ionas go mbeidh am fós ag an teipaistriú -tar éis céad sprice mhall. +| Athróg | Réamhshocrú | Cur síos | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(gan socrú)_ | Aicearra domhanda — sáraíonn sé réamhshocruithe `FETCH_TIMEOUT_MS` agus `STREAM_IDLE_TIMEOUT_MS` araon. | +| `FETCH_TIMEOUT_MS` | `600000` | Teorainn ama iomlán iarratais HTTP le haghaidh glaonna ar sholáthraithe réamhtheachtacha. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | An tost uasta idir bearta amh réamhtheachtacha sula ndéantar tobscor. Is annamh a stopann samhlacha ardréasúnaithe ar feadh >90s. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Uastré iomlán shruth ghníomhach SSE; ní athshocraítear riamh í de bharr beart réamhtheachtach agus tá sí neamhspleách ar `REQUEST_TIMEOUT_MS`. Díorthaítear í ón `timeoutMs` is mó in aghaidh na samhla sa chlárlann (1200000, Codex), móide corrlach 60000, ionas nach gcuirfear deireadh le samhail i lár freagra má cheadaítear di a buiséad iomlán a úsáid. Socraigh go `0` chun í a dhíchumasú. | +| `OMNIROUTE_SSE_COMMENTS` | _(díchumasaithe)_ | Cé acu a fhéadfaidh OmniRoute línte nóta tráchta SSE `:` a astú (m.sh. an buille croí `: keepalive` agus leantóirí meiteashonraí `x-omniroute-*`). Díchumasaithe de réir réamhshocraithe (#10524) toisc go ndéanann cliaint dhiana atá comhoiriúnach le OpenAI JSON.parse ar gach líne SSE agus go dtuairteálann siad ar nótaí tráchta `:`; ní dhéanann sé seo difear do bhuillí croí `data:`. Socraigh `on`/`true`/`1`/`yes` chun athrogha a dhéanamh. Úsáidtear é ag `open-sse/utils/sseHeartbeat.ts`. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | An t-am chun an chéad teagmhas SSE nach ping é a fháil. Faigheann sé luach `REQUEST_TIMEOUT_MS` le hoidhreacht nuair a bhíonn sé sin socraithe. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | An fhuinneog uasta oiriúnaitheach ullmhachta don chéad teagmhas le haghaidh iarratais sruthaithe atá mór, trom ar uirlisí, nó a éilíonn mórán réasúnaithe. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Lasc éigeandála don heorastach `/goal`. Socraigh `false`/`0`/`off` chun an bhrath a dhíchumasú go hiomlán — ní mhéadaítear teorainneacha ama ullmhachta ná athshlánú srutha riamh bunaithe ar chorp/ceanntásca an iarratais, rud a mhaolaíonn aimpliú teorann ama faoi rialú an chliaint. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | An fhuinneog uasta ullmhachta don chéad teagmhas le haghaidh rití gníomhaire `/goal` a braitheadh nó iarratais ar cuireadh iallach orthu le `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Cumasaigh athshlánú luath srutha go huathoibríoch le haghaidh rití gníomhaire `/goal` a braitheadh. Socraigh `false`/`0`/`off` chun an rogha shainiúil don sprioc a dhíchumasú. Ní féidir leis seo ach athshlánú a CHUR LE réamhshocrú an oibreora — ní sháraíonn sé riamh dírogha shainráite i socruithe `STREAM_RECOVERY_ENABLED`/DB. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Bain teagmhais neamhchaighdeánacha SSE `codex.*` (m.sh. `codex.rate_limits`) a bhriseann `responses.stream()` OpenAI SDK le 502. CUMASAITHE de réir réamhshocraithe (#11014). Socraigh `0`/`false`/`no`/`off` chun iad a chur ar aghaidh. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(gan socrú)_ | Iompar roghnach app-server Codex. Críochphointe WebSocket (`ws://`/`wss://`) de thaobhcharr áitiúil `codex app-server`. Nuair a shocraítear é in éineacht le comhartha, seoltar iarratais Codex thar JSON-RPC chuig an taobhcharr in ionad HTTP Responses API. Is féidir é a shocrú in aghaidh an naisc freisin trí `providerSpecificData.codexAppServerUrl`. Úsáidtear é ag `open-sse/executors/codex/appServerConfig.ts`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(gan socrú)_ | Comhartha cumais/iompróra inlíne a chuirtear faoi bhráid an app-server. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(gan socrú)_ | Conair chuig comhad ina bhfuil comhartha cumais an app-server (ó `codex app-server --ws-token-file`). Úsáidtear é nuair nach mbíonn `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` socraithe. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | An chomhadlann oibre ina ritear seal an app-server. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(gan socrú)_ | An polasaí ceadaithe a chuirtear ar aghaidh chuig seal an app-server (m.sh. `never`, `on-request`). Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(gan socrú)_ | An polasaí bosca gainimh a chuirtear ar aghaidh chuig seal an app-server (m.sh. `read-only`, `workspace-write`, `danger-full-access`). Nuair nach mbíonn sé socraithe, úsáidtear `workspace-write` mar réamhshocrú an tseiceadóra (cruaite; `danger-full-access` roimhe seo). Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Déan leideanna ceadaithe an app-server féin a uathcheadú (orduithe/comhaid/ceadanna a rith ar an óstach). Múchta de réir réamhshocraithe — déantar leideanna a uathdhiúltú; ní dhéantar difear do ghlaonna uirlisí an chreatlaigh (taistealaíonn siad tríd an bpasáil ar leith `item/tool/call`). Glacann sé le `true`/`1`/`yes`. Sárú in aghaidh an naisc: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | An t-am chun ceanntásca freagartha a fháil. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | An t-uasmhéid feithimh (ms) go dtosóidh freagra do gach iarracht dhíreach gan seachfhreastalaí. Tar éis teorainn ama a bhaint amach, baintear triail eile as uair amháin ar shoicéad úr; socraigh `0` chun an teorainn a dhíchumasú agus an t-iompar roimhe seo a choinneáil. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 nóim) | Uasteorainn (ms) don iarracht RETRY ar shoicéad úr tar éis teorainn ama thuas maidir le tosú freagartha d’iarracht chomhthiomsaithe (#13703). Ní bhíonn feidhm aici ach amháin nuair atá a chomhartha sprioc-ama féin ceangailte cheana féin ag an nglaoiteoir (cascáid an naisc/samhail/an tsoláthraí réitithe/`FETCH_TIMEOUT_MS`); is é an comhartha sin an fhíortheorainn agus spreagtar ar dtús é sa chonair bheartaithe, mar sin is cúlstop flaithiúil é seo seachas uasteorainn chothrom — dá uireasa, d’athúsáid an atriail an fhuinneog ghearr chéanna `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` agus a d’úsáid an iarracht chomhthiomsaithe, agus thug sí earráid 504 do shamhlacha réasúnaíochta sláintiúla a raibh TTFB mall acu. Ní cheadaítear riamh í a bheith faoi bhun na híos-teorann cothroime thuas; nuair nach soláthraíonn an glaoiteoir aon chomhartha sprioc-ama ar chor ar bith, coinníonn an atriail an íos-teorainn chothrom gan athrú. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | An t-am chun corp iomlán an fhreagra a fháil. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Teorainn ama chun nasc TCP a bhunú. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Teorainn ama díomhaointis do shoicéad keep-alive. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Teorainn ama sheachfhreastalaí méarloirg TLS (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Cuireann sé teorainn leis an am go dtí an chéad bheart go sonrach ar chorp iompair méarloirg TLS wreq-js; ní féidir le `TLS_CLIENT_TIMEOUT_MS` amháin corp stoptha a bhrath toisc go réitítear é a luaithe a thagann na ceanntásca (#12656). Cealaíonn teorainn ama an léitheoir wreq agus téann sé ar ais chuig an seoltóir díreach/seachfhreastalaí; díchumasaíonn `0` an faireoir. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Don fheidhmitheoir OpenCode amháin, agus nuair atá an bhratach ghné `OPENCODE_RESPONSES_STALL_ROTATION` ar siúl amháin (múchta de réir réamhshocraithe): cuireann sé teorainn leis an bhfeitheamh ar an gcéad bheart de chorp freagra Responses sruthaithe tar éis a cheanntásca (#13484). Osclaítear sruth Responses le `response.created`, mar sin is stopadh é tost a mhaireann thar an bhfuinneog seo: cuirtear an cuntas i dtréimhse shuaimhnithe agus rothlaítear an t-iarratas chuig an gcéad chuntas eile uair amháin; teipeann an dara stopadh láithreach. Díchumasaíonn `0` an chosaint fiú agus an bhratach ar siúl. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Teorainn ama don chéim tríd an seachfhreastalaí le haghaidh iarratais droichid `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Dírigh feidhmitheoir gabhála gréasáin Firecrawl ar ásc féinóstáilte (eochair API roghnach lasmuigh den néal). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Teorainn ama in aghaidh an iarratais d’fheidhmitheoir gabhála gréasáin Firecrawl. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Teorainn ama fhoriomlán d’iarratas freastalaí don droichead. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | An t-am chun ceanntásca freagartha a sheoladh tríd an droichead. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Teorainn ama díomhaointis keep-alive an droichid. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Teorainn ama an tsoicéid amh (`0` = díchumasaithe). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Tréimhse mhaolaithe ar SIGTERM/SIGINT sula ndéantar scor éigeantach. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Luach cúltaca a úsáideann `src/shared/utils/fetchTimeout.ts` nuair nach bhfuil `FETCH_TIMEOUT_MS` socraithe. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Teorainn ama (ms) do na réamhshocruithe `validationRead` agus `modelsProbe` in `src/shared/network/safeOutboundFetch.ts`. Ardaigh í le haghaidh críochphointí malla (Cerebras, Cloudflare AI, Groq) chun luascadh idir gníomhach/earráid sa deais a chosc. Titeann sé siar go 8000ms i gcás luachanna neamhbhailí (<1000) nó neamh-uimhriúla. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Teorainn ama gabhála a bhaineann go sonrach leis an athsheachadán in `open-sse/utils/proxyFetch.ts` (#9158). Ní mór d’athsheachadán atá ar crochadh teip roimh theorainn ama an chliaint/ghníomhaire (~30s) ionas go bhfeicfidh glaoiteoirí teip a bhaineann go sonrach leis an athsheachadán seachas teorainn ama chineálach réamhtheachtach. Cuirtear uasteorainn `29000` air ionas go spreagtar ar dtús é i gcónaí. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Cúlú comhroinnte atrialach do na conairí aon-atrialach díreacha/athsheachadáin/seachfhreastalaí in `open-sse/utils/proxyFetch.ts` (#9158). `0` = bain triail eile as láithreach. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Teorainn ama iarratais dhúchasach wreq-js (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Tréimhse chairde iomlán don sprioc-am crua JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Teorainn ama iarratais dhúchasach wreq-js (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Tréimhse chairde iomlán don sprioc-am crua JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (as) | Cuireann sé "Tá cuardach gréasáin ionsuite agat. Freagair ceisteanna go díreach agus torthaí cuardaigh á n-úsáid agat." le teachtaireacht chórais an ghlaoiteora (`perplexity-web/protocol.ts`). As de réir réamhshocraithe — déanann Perplexity cuardach ar aon nós, agus sceitheann an abairt isteach sna freagraí mar mheitrácht do chliaint ríomhchláraithe. Socraigh `1`/`true`/`yes`/`on` chun í a athbhunú. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Teorainn ama iarratais dhúchasach wreq-js (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Tréimhse chairde iomlán don sprioc-am crua JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Teorainn ama iarratais dhúchasach wreq-js (`notionTlsClient.ts`); ardaíonn `notion-web` í go `180000` in aghaidh an iarratais le haghaidh giniúintí fada. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Tréimhse chairde iomlán don sprioc-am crua JS a chuirtear sa bhreis ar an teorainn ama dhúchasach. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Linn chomhroinnte brabhsálaithe Playwright do chomhrá fianán gréasáin a fhaigheann tacaíocht ón mbrabhsálaí (`browserPool.ts`); socraigh `off` chun í a dhíchumasú. | +| `OBSCURA_BIN` | `auto-detect` | Conair chuig an dénártha `obscura` a úsáideann linn na mbrabhsálaithe agus riteoir Cloudflare Playground mar an príomhinneall (`open-sse/services/obscura.ts`); braitear go huathoibríoch é ó PATH an chórais nuair nach bhfuil sé socraithe. | +| `OBSCURA_CDP_ENDPOINT` | _(gan socrú)_ | Dírigh ar Obscura atá ag rith cheana féin (`http://host:port`) seachas ceann a thosú; ní leis an modúl an próiseas sin (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `random free port` | Port follasach don `obscura serve` tosaithe; roghnaítear port saor go huathoibríoch nuair nach bhfuil sé socraithe (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Cuir iarratas comhrá fianán gréasáin isteach sa chonair a fhaigheann tacaíocht ón mbrabhsálaí (`browserBackedChat.ts`); úsáid `1` chun é a chumasú. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Bun-URL do riteoir Kimi Web (Connect-RPC idirnáisiúnta kimi.ai) (`kimi-web.ts`); sáraigh é le haghaidh críochphointí scátháin/seachfhreastalaí amháin. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Críochphointe iomlán comhrá do riteoir Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(braite go huathoibríoch)_ | Conair chuig comhad inrite Chrome/Edge an chórais le haghaidh shíniú isteach idirghníomhach Adobe Firefly sa bhrabhsálaí (`adobeFireflyBrowserLogin.ts`); sáraíonn sí an bhrath uathoibríoch de réir an chórais oibriúcháin. | +| `OMNIROUTE_STANDALONE_DIR` | _aschur neamhspleách .build/_ | Sárú ag am tógála don chomhadlann aschuir neamhspleách a úsáideann an chéim chomhshuite i ndiaidh na tógála (`scripts/build/colocate-standalone.mjs`); uirlisí tógála, ní uirlisí ag am rite. | + +Faigheann iarrachtaí ar spriocanna teaglama an teorainn ama réitithe don iarratas réamhtheachtach le hoidhreacht (`FETCH_TIMEOUT_MS`, nó +`REQUEST_TIMEOUT_MS` nuair a sholáthraíonn sé réamhshocrú na haisghabhála). Socraigh `targetTimeoutMs` i dteaglama, +i réamhshocruithe teaglama, nó i sárú soláthraí chun cúltiomnú an teaglama a dhéanamh níos tapa amháin; cuirtear teorainn ama +reatha an iarratais réamhtheachtaigh le luachanna atá os a cionn. + +Is buiséad clog balla ar leith é `comboTimeoutMs` don teaglama iomlán thar spriocanna cúltiomnúcháin. +Fág gan socrú é nó socraigh mar `0` é chun atriall gan teorainn a choinneáil (tá an stopall crochta 10 nóiméad +`COMBO_LOOP_SAFETY_TIMEOUT_MS` fós i bhfeidhm). Tagann luach deimhneach in ionad an +líontáin sábháilteachta sin don teaglama. Coinnigh `comboTimeoutMs` níos faide ná `targetTimeoutMs` ionas go mbeidh +am fós ag an gcúltiomnú tar éis céad sprice moille. ### Tairseacha an Scoradáin Chiorcaid -Mionchoigeartú an scoradáin chiorcaid ar leibhéal an tsoláthraí. Léiríonn na réamhshocruithe na luachanna scálaithe atá in úsáid ó v3.6 i leith le haghaidh 500+ nasc. - -| Athróg | Réamhshocrú | Comhad Foinseach | Cur Síos | -| ------------------------------------------------------------- | ----------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Tairseach teipeanna comhleanúnacha do sholáthraithe OAuth sula ngníomhachtaítear an scoradán. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Fuinneog athshocraithe (ms) do scoradán soláthraí OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Tairseach teipeanna comhleanúnacha do sholáthraithe eochrach API. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Fuinneog athshocraithe (ms) do scoradán soláthraí eochrach API. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Tairseach teipeanna comhleanúnacha do sholáthraithe logánta (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Fuinneog athshocraithe (ms) do scoradán soláthraí logánta. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: líon na dteipeanna laistigh den fhuinneog sula dtéann an soláthraí OAuth iomlán isteach i dtréimhse shuaimhnithe. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: fuinneog rollach comhairimh teipeanna (ms) do sholáthraithe OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: tréimhse shuaimhnithe (ms) nuair a shroichtear tairseach an tsoláthraí OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Téann an soláthraí OAuth isteach i staid DEGRADED tar éis an oiread seo teipeanna. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Uasmhéadaitheoir formhéadaithe `resetTimeout` don soláthraí OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Déanann an soláthraí OAuth formhéadú tar éis an oiread seo timthriallta oscailte. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: líon na dteipeanna laistigh den fhuinneog sula dtéann an soláthraí eochrach API iomlán isteach i dtréimhse shuaimhnithe. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: fuinneog rollach comhairimh teipeanna (ms) do sholáthraithe eochrach API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: tréimhse shuaimhnithe (ms) nuair a shroichtear tairseach an tsoláthraí eochrach API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Téann an soláthraí eochrach API isteach i staid DEGRADED tar éis an oiread seo teipeanna. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Uasmhéadaitheoir formhéadaithe `resetTimeout` don soláthraí eochrach API. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Déanann an soláthraí eochrach API formhéadú tar éis an oiread seo timthriallta oscailte. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: líon na dteipeanna sula dtéann an soláthraí logánta iomlán isteach i dtréimhse shuaimhnithe. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: fuinneog rollach comhairimh teipeanna (ms) do sholáthraithe logánta. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: tréimhse shuaimhnithe (ms) nuair a shroichtear tairseach an tsoláthraí logánta. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Doimhneacht an chúlaithe ag a meastar go bhfuil soláthraí pionna an taisce comhthéacs míshláintiúil go marthanach agus go scaoiltear an pionna chun aistriú teipe a dhéanamh. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Fuinneog frith-luaineachta (ms) a fhulaingíonn tréimhsí suaimhnithe gearra neamhbhuana sula scaoiltear pionna taisce comhthéacs. | +Mionchoigeartú ar an scoradán ciorcaid ar leibhéal an tsoláthraí. Léiríonn na réamhshocruithe na luachanna scálaithe a úsáideadh ó v3.6 i leith do 500+ nasc. + +| Athróg | Réamhshocrú | Comhad Foinseach | Cur Síos | +| ------------------------------------------------------------- | ----------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Tairseach teipeanna comhleanúnacha do sholáthraithe OAuth sula ngníomhachtaítear an scoradán. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Fuinneog athshocraithe (ms) do scoradán soláthraí OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Tairseach teipeanna comhleanúnacha do sholáthraithe eochrach API. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Fuinneog athshocraithe (ms) do scoradán soláthraí eochrach API. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Tairseach teipeanna comhleanúnacha do sholáthraithe áitiúla (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Fuinneog athshocraithe (ms) do scoradán soláthraí áitiúil. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: líon na dteipeanna laistigh den fhuinneog sula dtéann an soláthraí OAuth iomlán isteach i dtréimhse fuaraithe. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: fuinneog rollach chomhairimh teipeanna (ms) do sholáthraithe OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: tréimhse fuaraithe (ms) a luaithe a shroichtear tairseach an tsoláthraí OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Téann an soláthraí OAuth isteach i staid DEGRADED tar éis an lín teipeanna seo. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Uasmhéadaitheoir ardaithe resetTimeout don soláthraí OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Ardaíonn an soláthraí OAuth tar éis an lín timthriallta oscailte seo. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: líon na dteipeanna laistigh den fhuinneog sula dtéann an soláthraí eochrach API iomlán isteach i dtréimhse fuaraithe. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: fuinneog rollach chomhairimh teipeanna (ms) do sholáthraithe eochrach API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: tréimhse fuaraithe (ms) a luaithe a shroichtear tairseach an tsoláthraí eochrach API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Téann an soláthraí eochrach API isteach i staid DEGRADED tar éis an lín teipeanna seo. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Uasmhéadaitheoir ardaithe resetTimeout don soláthraí eochrach API. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Ardaíonn an soláthraí eochrach API tar éis an lín timthriallta oscailte seo. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: líon na dteipeanna sula dtéann an soláthraí áitiúil iomlán isteach i dtréimhse fuaraithe. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: fuinneog rollach chomhairimh teipeanna (ms) do sholáthraithe áitiúla. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Scoradán ar leibhéal an tsoláthraí: tréimhse fuaraithe (ms) a luaithe a shroichtear tairseach an tsoláthraí áitiúil. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Doimhneacht an chúlaithe ag a meastar soláthraí pionna taisce comhthéacs a bheith míshláintiúil go marthanach agus a scaoiltear an pionna le haghaidh teipaistrithe. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Fuinneog frith-luaineachta (ms) a fhulaingíonn tréimhsí fuaraithe gearra neamhbhuana sula scaoiltear pionna taisce comhthéacs. | ### Cásanna | Cás | Cumraíocht | | ---------------------------------------- | -------------------------------------------------------- | -| **Giniúint cóid fadtréimhseach** | `REQUEST_TIMEOUT_MS=900000` (15 nóiméad) | +| **Giniúint cóid fhadtéarmach** | `REQUEST_TIMEOUT_MS=900000` (15 nóiméad) | | **Teorainn le saolré iomlán an tsrutha** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 nóiméad) | -| **Teip thapa le haghaidh API táirgthe** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Samhlacha réasúnaíochta sínte** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 nóiméad idir smutáin) | +| **Teip thapa d’API táirgthe** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Samhlacha smaointeoireachta sínte** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 nóiméad idir smutáin) | --- @@ -1111,102 +1120,103 @@ atá comhoiriúnach le Anthropic leis ina ionad. --- -## 21. Sláinte an tSeachfhreastalaí - -| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | -| ------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Teorainn ama don tseiceáil sláinte a theipeann go tapa. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Fuinneog ama (uaireanta) chun meánfhoighne sheachfhreastalaithe iarrthacha a ríomh i straitéis na linne atá optamaithe ó thaobh foighne de. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL thaisce thorthaí na seiceála sláinte. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL taisce do thóireadóirí sláinte seachfhreastalaí ar theip orthu. Coinnigh é seo níos giorra ná `PROXY_HEALTH_CACHE_TTL_MS` ionas go ndéanfar atriail thapa ar theorainneacha ama neamhbhuana seachfhreastalaí faoi chomhthráthacht ard gan teip thapa a dhíchumasú do sheachfhreastalaithe atá marbh i ndáiríre. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Socraigh `false` chun sceidealóir sláinte cúlra an tseachfhreastalaí, a thóraíonn seachfhreastalaithe cláraithe go tréimhsiúil, a dhíchumasú. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Eatramh scuabtha sceidealóir sláinte an chúlra ina ms (`60000` ar a laghad). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Sprioc an tóireadóra insroichteachta a úsáideann an sceidealóir agus críochphointe `/api/settings/proxies/auto-test`. Dírigh ar URL inmheánach/féinóstáilte é chun an réamhshocrú poiblí a sheachaint. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Líon na dtóireadóirí a thosaítear ag an am céanna in aghaidh an bhaisc, arna roinnt ag an sceidealóir agus ag críochphointe `/api/settings/proxies/auto-test`. Slánaítear síos go 1 é agus cuirtear uasteorainn 50 air. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Moill ina ms idir imeacht dhá thóireadóir laistigh de bhaisc. Gan í, imíonn an bhaisc iomlán ag an nóiméad céanna agus féadfaidh IP comhroinnte amach sprioc atá teoranta ó thaobh ráta de a ghníomhachtú. Socraigh go `0` é chun an spásáil a dhíchumasú; cuirtear uasteorainn 5000 air. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Socraigh "false" chun deireadh a chur le tóradh fhíoróstach sholáthraí sannta seachfhreastalaí (`GET /models`, gan eochair API) agus chun `PROXY_HEALTH_TEST_URL` a úsáid ina ionad i gcónaí. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Nuair is `false` é (réamhshocrú), bíonn tóireadóirí uathoibrithe insroichteachta (an sceidealóir + an cnaipe "Tástáil Uile" `/api/settings/proxies/auto-test`) **inléite amháin** agus ní scríobhann siad stádas seachfhreastalaí riamh — is é an t-oibreoir amháin a shocraíonn gníomhach/neamhghníomhach, mar sin ní féidir le tóireadóir éagobhsaí seachfhreastalaí sannta a fhágáil sáinnithe (#6246). Socraigh `true` chun an t-iompar oidhreachta tástála agus socraithe a athbhunú. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Bratach gné roghnach (féach [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); bíonn tosaíocht ag sárú DB an deais). Taispeánann `true` (nó `1`, `yes`) breathnóireacht inléite amháin ar imeacht na linne faoi linn seachfhreastalaí sa deais (IPanna imeachta ar leith, naisc, agus an líon is mó a chonacthas taobh thiar d'aon IP amháin le 24 u anuas, ón loga seachfhreastalaí). Ní úsáidtear le haghaidh ródúcháin riamh é. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Socraigh `true` chun ligean don sceidealóir seachfhreastalaithe a bhaint go huathoibríoch tar éis teipeanna comhleanúnacha arís agus arís eile. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Líon na dteipeanna comhleanúnacha sula mbaineann an sceidealóir seachfhreastalaí go huathoibríoch (nuair is `PROXY_AUTO_REMOVE=true` é). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Socraigh `true` chun ligean don sceidealóir seachfhreastalaí a dhíchumasú go bog (stádas `dead`, gan scriosadh riamh) tar éis teipeanna comhleanúnacha arís agus arís eile, seachas é a bhaint. Rogha neamh-millteach ar `PROXY_AUTO_REMOVE`: baintear an seachfhreastalaí láithreach as réiteach linne/uainíochta (eisiann an scagaire stádais bheo a úsáideann réiteach linne scóipe é cheana féin) agus athghníomhachtaítear go huathoibríoch é a luaithe a éiríonn leis sna tóireadóirí arís. Úsáideann sé tairseach `PROXY_AUTO_REMOVE_AFTER`. Más `true` an dá bhratach, bíonn tosaíocht ag `PROXY_AUTO_REMOVE`. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ceadaigh do shreafaí bailíochtaithe OAuth agus soláthraí seachfhreastalaí pionnáilte a sheachaint agus nascadh go díreach nuair a theipeann ar réamhsheiceálacha insroichteachta an tseachfhreastalaí. Is í an tosaíocht éifeachtach ná sárú DB Bratacha Gné > athróg timpeallachta > réamhshocrú. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `open-sse/services/rateLimitManager.ts` | An t-uasmhéid ama le fanacht ar 429 sula dteipeann ar an iarratas. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 nóim) | `open-sse/services/rateLimitManager.ts` | Uasteorainn ar an bhfad is féidir le hiarratas glactha fanacht á fhorghníomhú sula dtéann a áirithint teorann ráta in éag — díchúpláilte ó bhuiséad feithimh na scuaine ionas nach rachaidh tús mall aisghabhála ar gheataí neamh-incriminteacha thar am (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (díchumasaithe) | `open-sse/services/rateLimitManager.ts` | Uasteorainn iontrála sa scuaine: diúltaigh le 429 `queue_full` nuair atá an líon seo iarratas sa scuaine cheana féin. `0` = gan teorainn (réamhshocrú). | -| `RATE_LIMIT_AUTO_ENABLE` | _(gan socrú)_ | `open-sse/services/rateLimitManager.ts` | Cuir iallach ar líontán sábhála uathchumasaithe na teorann ráta a bheith ar siúl/as beag beann ar shocrú marthanach na Deaise. Glacann sé le `true`/`1`/`on` chun é a chur ar siúl le héigean, agus `false`/`0`/`off` chun é a chur as le héigean. | -| `PROVIDER_COOLDOWN_ENABLED` | _(gan socrú → as)_ | `open-sse/services/providerCooldownTracker.ts` | Rianú roghnach domhanda thar iarratais ar thréimhse shuaimhnithe soláthraí/naisc. AS de réir réamhshocraithe (forluíonn sé le Tréimhse Shuaimhnithe Naisc / Scoradán Ciorcaid Soláthraí). Glacann sé le `true`/`1`/`on` lena chumasú. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Tréimhse shuaimhnithe íosta (ms) sula ndéantar atriail ar sholáthraí/nasc ar theip air. Scálaítear go heaspónantúil í le teipeanna comhleanúnacha. Ní úsáidtear ach nuair atá `PROVIDER_COOLDOWN_ENABLED` cumasaithe. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 nóim) | `open-sse/services/providerCooldownTracker.ts` | Uasteorainn don tréimhse shuaimhnithe uasta (ms) sula ndéantar atriail ar sholáthraí/nasc ar theip air beag beann ar chúinsí eile. Ní úsáidtear ach nuair atá `PROVIDER_COOLDOWN_ENABLED` cumasaithe. | -| `STREAM_RECOVERY_ENABLED` | _(gan socrú → as)_ | `src/lib/resilience/settings.ts` (síol) → `open-sse/services/streamRecovery.ts` (loighic) | **Cad é:** aisghabháil thrédhearcach sruthanna réamhtheachtacha teasctha (port free-claude-code). Coinníonn sé fuinneog oscailte SSE siar ar feadh suas le `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) ionas go n-athosclaítear agus go n-atriailtear go dofheicthe scoitheadh _réamh-gheallta_ — ceann a tharlaíonn sula sroicheann aon bheart an cliant. **Cathain lena chumasú:** réamhtheachtacha éagobhsaí/a theascann 0 beart go minic ag tús srutha; fág AS é mura féidir leat suas le 750 ms d'am breise go dtí an chéad chomhartha ar gach sruth a sheasamh. Glacann sé le `true`/`1`/`on`. Síolraíonn sé an socrú marthanach Athléimneachta; bíonn tosaíocht ag socrú na Deaise nuair a shocraítear é. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(gan socrú → as)_ | `src/lib/resilience/settings.ts` (síol) → `open-sse/services/streamRecovery.ts` (loighic) | **Cad é:** leanúint i lár srutha (Céim 4.4) — tar éis teascadh _iar-gheallta_ (tá bearta tar éis an cliant a shroicheadh cheana féin), déan iarratas arís leis an téacs páirteach mar réamhlíonadh cúntóra agus fuaigh an iarmhír atá ar iarraidh leis. Sruthanna gnáth-théacs atá comhoiriúnach le OpenAI amháin; ní ghníomhachtaítear riamh é agus glao uirlise ar siúl. **Cathain lena chumasú:** giniúintí fada a scoitear i lár freagra agus tú sásta go dtiocfaidh an t-eireaball aisghafa in aon racht amháin seachas comhartha ar chomhartha. Neamhspleách ar `STREAM_RECOVERY_ENABLED` (próifíl riosca éagsúil). Glacann sé le `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(gan socrú → as)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Faireoir roghnach ar aschur úsáideach srutha ghníomhaigh. Aimsíonn sé sruthanna a leanann de smutáin a sheoladh ach a fhanann faoi ráta cumraithe aschuir an chúntóra; ní ligeann sé do bhuillí croí, teagmhais úsáide, deilteanna folmha ná céimeanna uirlise/réasúnaíochta dul i riocht dul chun cinn. Ar leithligh ó theorainneacha ama díomhaoin agus spriocdhátaí dochta. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Tréimhse chairde roimh mheasúnú tréchuir, teoranta do 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Fuinneog rollach aschuir úsáidigh, teoranta do 1000–600000 ms; teastaíonn fuinneog iomlán amháin sula gcuirtear deireadh leis. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Íosráta beart UTF-8 d'aschur cúntóra (seachfhreastalaí coimeádach ar chomharthaí), teoranta do 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | An sampla neamh-nialasach is lú d'aschur úsáideach a mheastar a bheith intomhaiste, teoranta do 1–1000000 beart. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Eatramh céimnithe (ms) idir seiceálacha sláinte chomharthaí soláthraí ag am tosaithe. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | An giodam randamach íosta (ms) a chuirtear sa bhreis ar `HEALTHCHECK_STAGGER_MS` idir seiceálacha sláinte chomharthaí soláthraí chun ráigeanna a chosc (Saincheist #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | An giodam randamach uasta (ms) a chuirtear sa bhreis ar `HEALTHCHECK_STAGGER_MS` idir seiceálacha sláinte chomharthaí soláthraí chun ráigeanna a chosc (Saincheist #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Méid bhaisc na seiceálacha comhthráthacha do scuabadh seiceála sláinte comharthaí ag am tosaithe; seiceálann luachanna níos mó tuilleadh nasc go comhthreomhar, agus laghdaíonn luachanna níos lú an t-ualach ráige (Saincheist #7875, cúlchéimniú #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Líon na n-atriail uathoibríoch ar fhreagraí tréimhse shuaimhnithe atá scóipithe de réir samhla sula seoltar earráid ar ais chuig an gcliant. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Uaseatramh cúlaithe (soicindí) idir atrialacha tréimhse shuaimhnithe. Cuireann an luach seo uasteorainn air beag beann ar `Retry-After` réamhtheachtach. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL sheachfhreastalaí coigilte comharthaí Headroom. De réir réamhshocraithe, seolann saolré na deaise (`api/headroom/*`) CLI áitiúil `headroom-ai` ar an gcomhéadan aisfhillte; ná sáraigh é ach amháin chun díriú ar sheachfhreastalaí taobhcharr Docker seachtrach. | - -### Tairisigh tiúnála athshlánaithe srutha - -Tiúntar iompar coinneála siar an athshlánaithe le tairisigh chrua-chódaithe in +## 21. Sláinte na Seachfhreastalaithe + +| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | +| ------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Teorainn ama don tseiceáil sláinte mear-theipe. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Fuinneog ama (uaireanta) chun meán-aga folaigh na seachfhreastalaithe iarrthacha a ríomh i straitéis na comhthiomsaithe atá optamaithe don aga folaigh. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL thaisce thorthaí na seiceála sláinte. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL taisce do thóireadóirí sláinte seachfhreastalaí ar theip orthu. Coinnigh é seo níos giorra ná `PROXY_HEALTH_CACHE_TTL_MS` ionas go ndéanfar atriail go tapa ar theorainneacha ama neamhbhuana seachfhreastalaí faoi chomhreathaíocht ard gan mear-theip a dhíchumasú do sheachfhreastalaithe atá marbh i ndáiríre. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Socraigh go `false` é chun sceidealóir sláinte cúlra na seachfhreastalaithe a dhíchumasú, sceidealóir a dhéanann tóireadóirí tréimhsiúla ar sheachfhreastalaithe cláraithe. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Eatramh scuabtha sceidealóir sláinte an chúlra ina ms (`60000` ar a laghad). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Sprioc na tástála inrochtaineachta a úsáideann an sceidealóir agus críochphointe `/api/settings/proxies/auto-test`. Socraigh é chuig URL inmheánach/féinóstáilte chun an réamhshocrú poiblí a sheachaint. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Líon na dtástálacha a thosaítear ag an am céanna i ngach baisc, arna roinnt idir an sceidealóir agus críochphointe `/api/settings/proxies/auto-test`. Slánaítear síos go 1 é agus cuirtear uasteorainn 50 air. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Moill i ms idir imeacht dhá thástáil laistigh de bhaisc. Gan í, imíonn an bhaisc iomlán ag an nóiméad céanna agus d'fhéadfadh IP comhroinnte amach sprioc faoi theorainn ráta a ghníomhachtú. Socraigh go `0` é chun an spásáil a dhíchumasú; cuirtear uasteorainn 5000 air. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Socraigh "false" chun deireadh a chur le tástáil fhíoróstach an tsoláthraí atá sannta do sheachfhreastalaí (`GET /models`, gan eochair API) agus chun `PROXY_HEALTH_TEST_URL` a úsáid i gcónaí ina ionad. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Nuair atá sé `false` (an réamhshocrú), bíonn tástálacha uathoibrithe inrochtaineachta (an sceidealóir + an cnaipe "Test All" ag `/api/settings/proxies/auto-test`) **inléite amháin** agus ní scríobhann siad stádas seachfhreastalaí riamh — is é an t-oibreoir amháin a shocraíonn gníomhach/neamhghníomhach, mar sin ní féidir le tástáil neamhsheasmhach seachfhreastalaí sannta a fhágáil sáinnithe (#6246). Socraigh `true` chun an t-iompar oidhreachta tástála-agus-socraithe a athbhunú. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Bratach gné roghnach (féach [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); tugtar tús áite do shárú DB ón deais). Le `true` (nó `1`, `yes`), taispeántar breathnóireacht inléite amháin ar imeacht na linne seachfhreastalaithe faoi linn seachfhreastalaithe sa deais (IPanna imeachta ar leith, naisc agus an líon is mó a chonacthas taobh thiar d'aon IP amháin le 24 h anuas, ón loga seachfhreastalaí). Ní úsáidtear riamh í le haghaidh ródúcháin. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Socraigh `true` chun ligean don sceidealóir seachfhreastalaithe a bhaint go huathoibríoch tar éis teipeanna comhleanúnacha arís agus arís eile. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Líon na dteipeanna comhleanúnacha sula mbaineann an sceidealóir seachfhreastalaí go huathoibríoch (nuair atá `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Socraigh mar `true` é chun ligean don sceidealóir seachfhreastalaí a dhíchumasú go bog (stádas `dead`, gan é a scriosadh riamh) tar éis teipeanna comhleanúnacha arís agus arís eile, seachas é a bhaint. Rogha mhalartach neamh-millteach ar `PROXY_AUTO_REMOVE`: baintear an seachfhreastalaí as réiteach na linne/an uainíochta láithreach (eisiann an scagaire stádais bheo a úsáideann réiteach na linne de réir scóipe é cheana féin) agus athghníomhachtaítear go huathoibríoch é a luaithe a éiríonn leis sna tóireadóirí arís. Úsáideann sé an tairseach `PROXY_AUTO_REMOVE_AFTER` chéanna. Má tá an dá bhratach socraithe mar `true`, tugtar tús áite do `PROXY_AUTO_REMOVE`. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ceadaigh do shreafaí bailíochtaithe OAuth agus soláthraí seachfhreastalaí pionnáilte a sheachaint agus nascadh go díreach nuair a theipeann ar réamhsheiceálacha inrochtaineachta an tseachfhreastalaí. Is í an ord tosaíochta éifeachtach ná sárú ó bhunachar sonraí na mBratacha Gné > athróg timpeallachta > réamhshocrú. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `src/lib/resilience/settings.ts` | Buiséad réamhshocraithe **feithimh sa scuaine**: an fad is féidir le hiarratas fanacht ar shliotán soláthraí agus suí sa scuaine sula ndiúltaítear dó, gan an tseirbhís réamhtheachtach a bhaint amach riamh. Glantar an t-amadóir a luaithe a thosaíonn an jab á rith — cuirtear teorainn ar leith leis an rith trí `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Ní shocraíonn an athróg timpeallachta ach an réamhshocrú: tugtar tús áite ar a seal do `resilienceSettings.requestQueue.maxWaitMs` marthanach, agus ansin do `rateLimitOverrides.maxWaitMs` in aghaidh an naisc. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 nóim) | `open-sse/services/rateLimitManager.ts` | Uasteorainn ar an bhfad is féidir le hiarratas ceadaithe fanacht á rith sula dtéann a áirithint teorann ráta in éag — díchúpláilte ón mbuiséad feithimh sa scuaine ionas nach rachaidh tús mall faighte thar am ar gheataí neamh-incriminteacha (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (díchumasaithe) | `open-sse/services/rateLimitManager.ts` | Teorainn iontrála sa scuaine: diúltaigh le 429 `queue_full` nuair atá an líon seo iarratas sa scuaine cheana féin. `0` = gan teorainn (réamhshocrú). | +| `RATE_LIMIT_AUTO_ENABLE` | _(gan socrú)_ | `open-sse/services/rateLimitManager.ts` | Cuir iallach ar líontán sábhála uathchumasaithe na teorann ráta a bheith ar siúl/as, beag beann ar an socrú marthanach sa Deais. Glacann sé le `true`/`1`/`on` chun é a chur ar siúl le héigean, agus `false`/`0`/`off` chun é a mhúchadh le héigean. | +| `PROVIDER_COOLDOWN_ENABLED` | _(gan socrú → as)_ | `open-sse/services/providerCooldownTracker.ts` | Rianú domhanda roghnach ar thréimhse shuaimhnithe soláthraí/naisc thar iarratais éagsúla. AS de réir réamhshocraithe (forluíonn sé le Tréimhse Shuaimhnithe Naisc / Scoradán Ciorcaid Soláthraí). Glacann sé le `true`/`1`/`on` chun é a chumasú. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Íostréimhse shuaimhnithe (ms) sula n-atriailtear soláthraí/nasc ar theip air. Scálaítear go heaspónantúil í de réir teipeanna comhleanúnacha. Ní úsáidtear í ach amháin nuair atá `PROVIDER_COOLDOWN_ENABLED` cumasaithe. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 nóim) | `open-sse/services/providerCooldownTracker.ts` | Uasteorainn don uastréimhse mharbhántachta (ms) sula mbaintear triail eile as soláthraí/nasc ar theip air, beag beann ar chúinsí. Ní úsáidtear é ach amháin nuair atá `PROVIDER_COOLDOWN_ENABLED` cumasaithe. | +| `STREAM_RECOVERY_ENABLED` | _(gan socrú → múchta)_ | `src/lib/resilience/settings.ts` (síol) → `open-sse/services/streamRecovery.ts` (loighic) | **Cad é:** aisghabháil thrédhearcach sruthanna réamhtheachtacha teasctha (port free-claude-code). Coinnítear an fhuinneog tosaigh SSE ar feadh suas le `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), ionas go n-athosclaítear agus go n-atriailtear go dofheicthe gearradh _réamh-ghealltanais_ — ceann a tharlaíonn sula sroicheann aon bheart an cliant. **Cathain is ceart é a chumasú:** réamhtheachtacha neamhiontaofa/a theascann go minic ag 0 beart ag tús srutha; fág MÚCHTA é mura féidir leat suas le 750 ms d'am breise go dtí an chéad chomhartha a sheasamh ar gach sruth. Glacann sé le `true`/`1`/`on`. Síolraíonn sé an socrú Seasmhachta marthanach; bíonn forlámhas ag socrú an Deais a luaithe a shocraítear é. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(gan socrú → múchta)_ | `src/lib/resilience/settings.ts` (síol) → `open-sse/services/streamRecovery.ts` (loighic) | **Cad é:** leanúint i lár srutha (Céim 4.4) — tar éis teascadh _iar-ghealltanais_ (tá bearta tar éis an cliant a bhaint amach cheana féin), déantar athiarraidh leis an téacs páirteach mar réamhlíonadh cúntóra agus fuaitear an iarmhír atá ar iarraidh leis. Sruthanna gnáth-théacs atá comhoiriúnach le OpenAI amháin; ní chuirtear i ngníomh riamh é agus glao uirlise ar siúl. **Cathain is ceart é a chumasú:** giniúintí fada a ghearrtar i lár freagra agus tú sásta go dtiocfaidh an t-eireaball aisghafa in aon racht amháin seachas comhartha ar chomhartha. Neamhspleách ar `STREAM_RECOVERY_ENABLED` (próifíl riosca éagsúil). Glacann sé le `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(gan socrú → múchta)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Faire faireacháin aschuir úsáidigh do shruth gníomhach, ar bhonn rogha an úsáideora. Aimsíonn sé sruthanna a leanann orthu ag seoladh smután ach a fhanann faoi bhun ráta cumraithe aschuir an chúntóra; ní chuirtear buillí croí, teagmhais úsáide, deilteanna folmha ná céimeanna uirlise/réasúnaithe i láthair mar dhul chun cinn. Ar leithligh ó theorainneacha ama díomhaoin agus spriocdhátaí dochta. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Tréimhse chairde roimh mheasúnú tréchuir, teoranta do 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Fuinneog rollach aschuir úsáidigh, teoranta do 1000–600000 ms; teastaíonn fuinneog iomlán amháin sula ndéantar scor. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Íosráta beart UTF-8 d'aschur an chúntóra (seachfhreastalaí coimeádach ar chomharthaí), teoranta do 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Íosmhéid sampla neamh-nialasach d'aschur úsáideach a mheastar a bheith intomhaiste, teoranta do 1–1000000 beart. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Eatramh céimnithe (ms) idir seiceálacha sláinte chomharthaí soláthraithe ag am tosaithe. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Íosghiodam randamaithe (ms) a chuirtear sa bhreis ar `HEALTHCHECK_STAGGER_MS` idir seiceálacha sláinte chomharthaí soláthraithe, chun ráigeanna a chosc (Saincheist #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Uasghiodam randamaithe (ms) a chuirtear sa bhreis ar `HEALTHCHECK_STAGGER_MS` idir seiceálacha sláinte chomharthaí soláthraithe, chun ráigeanna a chosc (Saincheist #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Méid bhaisc na seiceálacha comhthráthacha don scuabadh seiceála sláinte comharthaí ag am tosaithe; seiceálann luachanna níos mó tuilleadh nascanna go comhthreomhar, agus laghdaíonn luachanna níos lú an t-ualach tobann (Saincheist #7875, cúlchéimniú ar #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Líon na n-atriail uathoibríoch ar fhreagraí tréimhse shuaimhnithe a bhaineann go sonrach le samhail sula seoltar earráid ar ais chuig an gcliant. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Uas-eatramh cúlaithe (soicindí) idir atrialacha tréimhse shuaimhnithe. Cuirtear teorainn leis de réir an luacha seo beag beann ar `Retry-After` réamhtheachtach. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL seachfhreastalaí sábhála comharthaí Headroom. Seolann saolré an deais (`api/headroom/*`) CLI áitiúil `headroom-ai` ar an gcomhéadan aisfhillte de réir réamhshocraithe; ná sáraigh é ach amháin chun seachfhreastalaí seach-chárta Docker seachtrach a shonrú. | + +### Tairisigh tiúnála aisghabhála srutha + +Tiúnaítear iompar na moille aisghabhála le tairisigh chrua-chódaithe in `open-sse/config/constants.ts` (`STREAM_RECOVERY`), a thaispeántar anseo mar thagairt — teastaíonn eagarthóireacht ar an gcód chun iad a athrú, ní athróg timpeallachta: -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — an fad a choinnítear fuinneog thosaigh SSE siar - ionas gur féidir iarracht eile a dhéanamh tar éis ciorrú luath sula gcuirtear aon bheart ar aghaidh chuig an gcliant. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — uasteorainn dhocht ar an bhfuinneog choinnithe; cuirtear ar aghaidh í - (folmhú + cur tríd) a luaithe a charntar an méid seo beart, beag beann ar an amadóir. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — uaslíon athoscailtí trédhearcacha ar an sruth - réamhtheachtach fad atá an choinneáil siar fós neamhthiomanta. +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — an fad a choinnítear fuinneog tosaigh SSE siar + ionas gur féidir atriail a dhéanamh ar theascadh luath sula seoltar aon bheart chuig an gcliant. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — uasteorainn dhocht ar an bhfuinneog atá á coinneáil siar; seoltar í + (folmhú + cur ar aghaidh) a luaithe a charntar an méid seo beart, beag beann ar an amadóir. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — uaslíon athoscailtí trédhearcacha ar an sruth réamhtheachtach + fad atá an mhoill fós gan seoladh. -> **Teorainn ráta fuinneoige sleamhnáin de réir soláthraí (gan athróg timpeallachta):** tá an _chúltaca_ +> **Teorainn ráta fuinneoige sleamhnáin de réir soláthraí (gan athróg timpeallachta):** tá an _cúltaca_ > teorann ráta fuinneoige sleamhnáin de réir soláthraí, arna phortáil ó FCC, sa chód > (`open-sse/services/providerDefaultRateLimit.ts`, ceangailte trí -> `open-sse/services/rateLimitManager.ts`) ach seoltar é le **léarscáil réamhshocraithe fholamh** -> agus níl **aon athróg timpeallachta don oibreoir** aige faoi láthair — ní chumasaítear é ach trí chrúca tástála / -> eagarthóireacht ar an gcód. Fágtar amach as an tábla thuas é d'aon ghnó. Is é `RELAY_IP_PER_MINUTE` an teorantóir athsheachadta -> de réir `(token, IP)` a bhfuil rialtán aige (§3 Líonra & Poirt). +> `open-sse/services/rateLimitManager.ts`) ach seoltar é le **mapa réamhshocraithe folamh** +> agus níl **aon athróg timpeallachta d’oibreoirí** aige faoi láthair — ní chumasaítear é ach trí chrúca tástála / +> eagarthóireacht ar an gcód. Ní liostaítear sa tábla thuas é d’aon ghnó. Is é `RELAY_IP_PER_MINUTE` (§3 Líonra & Poirt) +> an teorantóir athsheachadta de réir `(token, IP)` a bhfuil rialtán aige. --- ## 22. Dífhabhtú > [!CAUTION] -> Táirgeann na hathróga seo **aschur mionsonraithe** agus d’fhéadfaidís sonraí íogaire a sceitheadh. **Ná cumasaigh iad i dtimpeallacht táirgthe riamh.** - -| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | -| ------------------------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(gan socrú)_ | `open-sse/executors/cursor.ts` | Socraigh go `1` chun logaí mionsonraithe sheiceadóir Cursor a chumasú (smutáin SSE díchódaithe, srl.). | -| `CURSOR_STREAM_DEBUG` | _(gan socrú)_ | `open-sse/executors/cursor.ts` | Ailias atá comhoiriúnach siar le `CURSOR_DEBUG`. | -| `CURSOR_DUMP_FILE` | _(gan socrú)_ | `open-sse/executors/cursor.ts` | Conair chomhaid roghnach a fhaigheann smutáin amh dhíchódaithe Cursor nuair atá `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Teorainn ama neamhghníomhaíochta an tsrutha (ms) do sheiceadóir Cursor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Tréimhse mhaolaithe (ms) tar éis críochfort bog composer kv_after_text nuair a bhíonn bearta fós sa mhaolán — tugann sé seo am do ghlao uirlise exec_mcp ina dhiaidh sin a fhráma a chríochnú. | -| `CURSOR_TOOL_DIRECTIVE` | cumasaithe (`!== "0"`) | `open-sse/executors/cursor.ts` | Treoir deimhnithe uirlise a chuireann faoi deara do composer-2.5 glaonna uirlise a eisiúint go hiontaofa. Socraigh go `0` lena díchumasú. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(gan socrú)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Téacs leid chórais arna shainiú ag an oibreoir a chuirtear leis an teachtaireacht chórais TAR ÉIS an aistriúcháin (instealladh iar-aistriúcháin), agus a shroicheann conairí codex/Responses agus `/v1/messages`. Úsáidtear é freisin mar réimír na treorach a bhaintear de bhloic réamhráite córais macallaithe. Fág gan socrú é lena dhíchumasú. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Teorainn ama aisghabhála in aghaidh na híomhá (ms) d’ionchur amhairc cianda `image_url`. | -| `CURSOR_STATE_DB_PATH` | _(braite)_ | `open-sse/utils/cursorVersionDetector.ts` | Sáraigh cuardach bhunachar sonraí staide IDE Cursor a úsáidtear chun leagan an IDE a bhrath. | -| `CURSOR_AGENT_CLI_VERSION` | _(braith / pionnaigh)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Aitheantas tiomsaithe CLI Agent (`YYYY.MM.DD-`) le haghaidh `x-cursor-client-version: cli-…` ar Agent Run. | -| `CURSOR_AGENT_BIN` | _(gan socrú)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Conair chuig dénártha Cursor Agent a úsáidtear chun íomhánna a ghiniúint. Mura bhfuil sé socraithe, úsáideann an láimhseálaí `providerSpecificData.agentBin` agus ansin PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Am clog balla in aghaidh na híomhá (ms) do thascanna íomhá Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Geata comhthráthachta suíocháin roinnte do thascanna íomhá Cursor. | -| `CURSOR_IMG_MODEL` | iarratas / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sáraigh `--model` CLI Cursor do thascanna íomhá. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Minicíocht vótaíochta thorthaí ghiniúint íomhánna UC (uncensored.com) (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Am clog balla vótaíochta thorthaí ghiniúint íomhánna UC (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Minicíocht vótaíochta thorthaí ghiniúint físeán UC (uncensored.com) (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Am clog balla vótaíochta thorthaí ghiniúint físeán UC (ms). | -| `CURSOR_DATA_DIR` | _(braite)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Sáraigh eolaire sonraí CLI Cursor Agent (`…/versions/`); an athróg chéanna a úsáideann an gníomhaire oifigiúil. | -| `CURSOR_TOKEN` | _(gan socrú)_ | `scripts/ad-hoc/cursor-tap.cjs` | Comhartha iompróra díreach Cursor a úsáideann uirlisí forbróra. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | díchumasaithe (rogha an úsáideora trí `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Logáil marcóirí cineáil/fohaid inneachair d’ualaí móra comhrá nuair a shocraítear `"1"`. Múchta de réir réamhshocraithe chun torann sna logaí a laghdú. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(gan socrú)_ | `open-sse/handlers/responseTranslator.ts` | Socraigh go `true` chun sonraí aistriúcháin SSE→JSON de Responses API a logáil. | -| `DEBUG_CLAUDE_NONSTREAM` | _(gan socrú)_ | `open-sse/handlers/responseTranslator.ts` | Socraigh go `true` chun smutáin fholmha textContent a nochtadh i gconair aistriúcháin fhreagra Claude (dífhabhtú amháin). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(gan socrú)_ | Creat tástála E2E | Socraigh go `true` chun mód tástála E2E a chumasú (fíordheimhniú maolaithe, crúcaí tástála). | +> Táirgeann na hathróga seo **aschur mionsonraithe** agus d’fhéadfaidís sonraí íogaire a sceitheadh. **Ná cumasaigh riamh iad i dtimpeallacht táirgthe.** + +| Athróg | Réamhshocrú | Comhad Foinse | Cur Síos | +| ------------------------------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(gan socrú)_ | `open-sse/executors/cursor.ts` | Socraigh `1` chun logaí mionsonraithe an tseiceadóra Cursor a chumasú (smutáin SSE díchódaithe, srl.). | +| `CURSOR_STREAM_DEBUG` | _(gan socrú)_ | `open-sse/executors/cursor.ts` | Ailias comhoiriúnach siar de `CURSOR_DEBUG`. | +| `CURSOR_DUMP_FILE` | _(gan socrú)_ | `open-sse/executors/cursor.ts` | Conair chomhaid roghnach a fhaigheann smutáin amh dhíchódaithe Cursor nuair atá `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Teorainn ama neamhghníomhaíochta an tsrutha (ms) don seiceadóir Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Fuinneog mhaolaithe (ms) tar éis foirceannaire bhog `kv_after_text` an chumadóra nuair a bhíonn bearta fós sa mhaolán — tugann sé seo am do ghlao uirlise `exec_mcp` ina dhiaidh sin a fhráma a chur i gcrích. | +| `CURSOR_TOOL_DIRECTIVE` | cumasaithe (`!== "0"`) | `open-sse/executors/cursor.ts` | Treoir um dheimhniú uirlise a chuireann ar composer-2.5 glaonna uirlise a eisiúint go hiontaofa. Socraigh `0` chun í a dhíchumasú. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(gan socrú)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Téacs leid córais arna shainiú ag an oibreoir a chuirtear leis an teachtaireacht chórais TAR ÉIS an aistriúcháin (instealladh iar-aistriúcháin), agus a shroicheann conairí codex/Responses agus `/v1/messages`. Úsáidtear é freisin mar réimír na treorach a bhaintear de bhloic réamhrá córais athfhógartha. Fág gan socrú é chun é a dhíchumasú. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (as) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Socraigh `1` chun bloic réamhrá leid córais athfhógartha a bhaint ó thús srutha openai→claude. Bíonn sé as de réir réamhshocraithe — tá na heorastaca múnlaithe de réir próis Bhéarla agus athraíonn siad pálasta an fhreagra, mar sin chaillfí freagra a thosaíonn go dlisteanach le rannán den sórt sin. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Teorainn ama aisghabhála in aghaidh na híomhá (ms) d’ionchur cianda amhairc `image_url`. | +| `CURSOR_STATE_DB_PATH` | _(braite)_ | `open-sse/utils/cursorVersionDetector.ts` | Sáraigh cuardach bhunachar sonraí staide Cursor IDE a úsáidtear chun leagan an IDE a bhrath. | +| `CURSOR_AGENT_CLI_VERSION` | _(braith / pionnaigh)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Aitheantas tógála Agent CLI (`YYYY.MM.DD-`) le haghaidh `x-cursor-client-version: cli-…` ar Agent Run. | +| `CURSOR_AGENT_BIN` | _(gan socrú)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Conair chuig dénártha Cursor Agent a úsáidtear chun íomhánna a ghiniúint. Mura bhfuil sé socraithe, úsáideann an láimhseálaí `providerSpecificData.agentBin` agus ansin PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Am clog balla in aghaidh na híomhá (ms) do thascanna íomhá Cursor Agent. | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Geata comhthráthachta suíocháin chomhroinnte do thascanna íomhá Cursor. | +| `CURSOR_IMG_MODEL` | iarratas / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sáraigh `--model` Cursor CLI do thascanna íomhá. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Minicíocht vótaíochta torthaí giniúna íomhánna UC (uncensored.com) (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Am clog balla vótaíochta torthaí giniúna íomhánna UC (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Minicíocht vótaíochta torthaí giniúna físeán UC (uncensored.com) (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Am clog balla vótaíochta torthaí giniúna físeán UC (ms). | +| `CURSOR_DATA_DIR` | _(braite)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Sáraigh eolaire sonraí Cursor Agent CLI (`…/versions/`); is í seo an athróg chéanna a úsáideann an gníomhaire oifigiúil. | +| `CURSOR_TOKEN` | _(gan socrú)_ | `scripts/ad-hoc/cursor-tap.cjs` | Comhartha iompróra díreach Cursor a úsáideann uirlisí forbróra. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | díchumasaithe (rogha isteach trí `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Logáil marcóirí cineáil/faidh ábhair do phálastaí móra comhrá nuair a shocraítear `"1"`. Bíonn sé as de réir réamhshocraithe chun torann loga a laghdú. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(gan socrú)_ | `open-sse/handlers/responseTranslator.ts` | Socraigh `true` chun sonraí aistriúcháin SSE→JSON de Responses API a logáil. | +| `DEBUG_CLAUDE_NONSTREAM` | _(gan socrú)_ | `open-sse/handlers/responseTranslator.ts` | Socraigh `true` chun smutáin fholmha `textContent` a nochtadh i gconair aistriúcháin fhreagra Claude (dífhabhtú amháin). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(gan socrú)_ | Creat tástála E2E | Socraigh `true` chun mód tástála E2E a chumasú (fíordheimhniú maolaithe, crúcaí tástála). | --- @@ -1222,11 +1232,11 @@ Lig d’úsáideoirí fadhbanna a thuairisciú go díreach ón Deais. --- -## Cásanna Imscartha +## Cásanna Imlonnaithe -Le haghaidh treorach SRE don inneall sealaíochta (iompar ts/bifrost/auto, suíomh 9router i gcomparáid le CLIProxyAPI, agus straitéis chúltaca d’ardtréchur), féach [Straitéis an Innill Sealaíochta](/docs/reference/RELAY_BACKEND_STRATEGY.md). +Le haghaidh treoir SRE d’inneall an athsheachadáin (iompraíocht ts/bifrost/auto, suíomh 9router i gcomparáid le CLIProxyAPI, agus straitéis chúltaca d’ard-tréchur), féach [Straitéis Inneall an Athsheachadáin](/docs/reference/RELAY_BACKEND_STRATEGY.md). -### Forbairt Logánta Íosta +### Forbairt Áitiúil Íosta ```bash JWT_SECRET=$(openssl rand -base64 48) @@ -1255,7 +1265,7 @@ OMNIROUTE_MEMORY_MB=8192 CORS_ORIGIN=https://your-frontend.example.com ``` -### Timpeallacht Aerscartha / CI +### Bearna Aeir / CI ```bash JWT_SECRET=test-jwt-secret-for-ci diff --git a/docs/i18n/ga/docs/reference/FEATURE_FLAGS.md b/docs/i18n/ga/docs/reference/FEATURE_FLAGS.md index f350608d3b4d..0c961b59e347 100644 --- a/docs/i18n/ga/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/ga/docs/reference/FEATURE_FLAGS.md @@ -44,133 +44,135 @@ Meastar bratach bhooleach a bheith **cumasaithe** nuair is é `"true"`, ## Catalóg Bratach -72 bratach thar 6 chatagóir. Is é **Réamhshocrú** réamhshocrú an tsainmhínithe — an luach -a úsáidtear nuair nach bhfuil sárú DB ná athróg timpeallachta i láthair. +74 bratach i 6 chatagóir. Is é **Réamhshocrú** réamhshocrú an tsainmhínithe — an luach +a úsáidtear nuair nach bhfuil sárú bunachair sonraí ná athróg timpeallachta i láthair. ### Slándáil (10) -| Eochair | Cineál | Réamhshocrú | Cur síos | -| --------------------------------------- | -------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `REQUIRE_API_KEY` | booleach | `false` | Éiligh eochair API le haghaidh gach iarratais isteach. | -| `INPUT_SANITIZER_ENABLED` | booleach | `true` | Cumasaigh sláintiú ionchuir le haghaidh gach iarratais. | -| `INJECTION_GUARD_MODE` | enum | `off` | Mód cosanta ar instealladh leid. Luachanna: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | booleach | `false` | Cuir PII in eagar ó iarratais (neamhspleách ar `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | booleach | `false` | Sláintigh PII ó fhreagraí soláthraithe. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Mód le haghaidh sláintiú PII i bhfreagraí. Luachanna: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | booleach | `true` | Cuir bac ar iarratais amach chuig raonta IP príobháideacha/inmheánacha. | -| `ALLOW_API_KEY_REVEAL` | booleach | `false` | Ceadaigh d’úsáideoirí fíordheimhnithe na deaise eochracha API stóráilte a nochtadh in ionad luachanna folaithe amháin a fheiceáil. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | booleach | `false` | Cuir réimír an chuntais san áireamh i línte loga AUTH (m.sh. "Cuntas á úsáid: abc12345..."). Díchumasaithe de réir réamhshocraithe ionas go gcuirtear aitheantóirí cuntais in eagar ó logaí próisis comhroinnte/ilthionónta. Neamhspleách ar Mhód Dífhabhtaithe; ní nochtar é seo trí Mhód Dífhabhtaithe a scoránú. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | booleach | `false` | Nuair atá OIDC cumasaithe, díchumasaigh logáil isteach le pasfhocal ionas nach féidir le húsáideoirí fíordheimhniú ach amháin trí Shíniú Aonair OIDC. Nuair atá sé díchumasaithe (réamhshocrú), tá logáil isteach le pasfhocal agus OIDC araon ar fáil. | - -### Líonra (15) - -| Eochair | Cineál | Réamhshocrú | Atosú | Cur síos | -| ----------------------------------------------- | ------ | ----------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | Boole | `false` | ✓ | Cumasaigh mód ceilteachta méarloirg TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | Boole | `false` | | Ceadaigh do na bealaí /v1/audio/* nóid soláthraí atá comhoiriúnach le OpenAI agus atá á n-óstáil lasmuigh de localhost a úsáid. Díchumasaithe de réir réamhshocraithe — athraíonn seoladh fuaime chuig óstach cianda aitheantas amach agus ní mór gur cinneadh sainráite ón oibreoir é. Ceadaítear nóid lúb-ais i gcónaí agus ní dhéantar difear dóibh. | -| `PROXY_AUTO_SELECT_ENABLED` | Boole | `false` | | Nuair nach bhfuil seachfhreastalaí sannta do nasc, roghnaigh go huathoibríoch an chéad seachfhreastalaí atá ag obair ón gclárlann. Díchumasaithe de réir réamhshocraithe (murach sin, bíonn aon seachfhreastalaí clárlainne ina chúltaca domhanda — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | Boole | `false` | | Ceadaigh do shreafaí OAuth agus bailíochtaithe soláthraí seachfhreastalaí pionnáilte a sheachaint agus nascadh go díreach nuair a theipeann ar réamhsheiceálacha insroichteachta an tseachfhreastalaí. Díchumasaithe de réir réamhshocraithe toisc gur féidir leis seo an IP amach a athrú. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | Boole | `true` | | I gcás eisceacht líonra (teorainn ama, nasc diúltaithe/athshocraithe) i bhfeidhmitheoir uainíochta ilchuntais, nuair nach bhfuil seachfhreastalaí tiomnaithe ag an gcuntas ar theip air, cuir tréimhse ghearr shuaimhnithe i bhfeidhm agus scipeáil cuntais eile gan seachfhreastalaí don chuid eile den iarratas seachas triail a bhaint as gach ceann arís. Cumasaithe de réir réamhshocraithe (sábháilte: ní athraítear an IP amach; ní laghdaítear ach an baol aga folaigh/tréimhse shuaimhnithe ar chuntais a chomhroinneann an bealach amach). Díchumasaigh chun iomadú láithreach a athbhunú ar an gcéad eisceacht ó chuntas gan seachfhreastalaí. | -| `PROXY_SKIP_RECENTLY_FAILED` | Boole | `false` | | Stopann linnte seachfhreastalaithe agus uainíocht opencode in aghaidh an chuntais de sheachfhreastalaí ar theip air le déanaí a athsheirbheáil (tóireadóir TCP diúltaithe, nó 429 a fuarthas tríd) ar feadh tréimhse in aghaidh an phróisis a dhúblaítear le gach teip arís agus arís eile, suas le huasteorainn. Ní scríobhtar aon stádas seachfhreastalaí; nuair a chuirtear gach iarrthóir ar leataobh, ní athraítear an rogha. Díchumasaithe de réir réamhshocraithe. | -| `PROXY_POOL_EGRESS_OBSERVATION` | Boole | `false` | | Taispeáin, faoi linn seachfhreastalaithe sa deais, cá mhéad IP amach a breathnaíodh a d’fhreastail ar a bhaill le 24 h anuas agus cá mhéad nasc a d’úsáid iad. Inléite amháin, ríofa ó loga an tseachfhreastalaí, agus ní úsáidtear riamh é le haghaidh ródaithe. Díchumasaithe de réir réamhshocraithe. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | Boole | `false` | | Maidir le feidhmitheoir OpenCode, déan monatóireacht ar an gcéad bheart de chorp freagra Responses a sruthaítear (fuinneog: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, réamhshocrú `15000`). Caitear le sruth 2xx Responses a fhanann ina thost thar an bhfuinneog mar shruth stoptha: cuirtear an cuntas i dtréimhse shuaimhnithe agus rothlaítear an t-iarratas chuig an gcéad chuntas eile uair amháin; teipeann go tapa ar an dara stopadh. Díchumasaithe de réir réamhshocraithe: coimeádann sruthanna stoptha an fanacht reatha go dtí teorainn ama ullmhachta an tsrutha. | -| `OPENCODE_USER_BLOCKED_ROTATION` | Boole | `false` | | Feidhmitheoir OpenCode: i gcás 403/451 ina bhfuil diúltú `user_blocked` (ní geo é, ná diúltú méarloirg Cloudflare), cuir an cuntas diúltaithe i dtréimhse shuaimhnithe agus rothlaigh chuig an gcéad chuntas eile uair amháin ar a mhéad in aghaidh an iarratais; seoltar an dara diúltú ar ais gan athrú, gan marc ratha. Díchumasaithe de réir réamhshocraithe: d’fhéadfadh ródú timpeall ar bhloc úsáideora réamhtheachtach breathnú cosúil le himghabháil agus an bhratach a scaipeadh ar fud na flíte. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | Boole | `false` | | Uainíocht OpenCode: tar éis dhá theip neamhbhuan as a chéile ón réamhtheachtach (5xx nó 400 folamh), cuir sos roimh an gcéad chuntas eile — 1.5s a dhúblaítear le gach teip bhreise, le huasteorainn 6s in aghaidh an tsosa agus 10s in aghaidh an iarratais, agus scipeáiltear é má dhícheanglaíonn an cliant; scaoiltear corp na teipe sula bhfantar. Díchumasaithe de réir réamhshocraithe: fanann an teipaistriú láithreach. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | Boole | `false` | | Uainíocht OpenCode: stop tonn na gcuntas ag an gcéad 429 a aicmítear mar fhíortheorainn ráta (`Retry-After` atá inpharsáilte, nó corp ina luaitear teorainn ráta/úsáide) agus seol an 429 réamhtheachtach sin ar ais gan athrú. Leanann 429anna neamhaicmithe den uainíocht. Díchumasaithe de réir réamhshocraithe: tá an tsraith saor in aisce teoranta de réir IP amach (#9611), mar sin rothlaíonn gach 429 agus seolann tonn ídithe an 429 réamhtheachtach deireanach ar ais. | -| `MITM_DISABLE_TLS_VERIFY` | Boole | `false` | ✓ | Díchumasaigh fíorú teastais TLS don seachfhreastalaí MITM. **Contúirt.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | Boole | `false` | | Ceadaigh URLanna soláthraí a dhíríonn ar líonraí príobháideacha/inmheánacha. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | Boole | `true` | | Ceadaigh soláthraithe a chur leis/a bhailíochtú ar sheoltaí áitiúla/príobháideacha (127.0.0.1, localhost, LAN). Cumasaithe de réir réamhshocraithe (áitiúil ar dtús); díchumasaigh le haghaidh blocáil dhian ar sheoltaí poiblí amháin. Fanann meiteashonraí néil blocáilte. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | Boole | `false` | ✓ | Cumasaigh mód soláthraí atá comhoiriúnach le Claude Code. | +| Eochair | Cineál | Réamhshocrú | Cur síos | +| --------------------------------------- | ------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Éiligh eochair API le haghaidh gach iarratais isteach. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Cumasaigh sláintiú ionchuir le haghaidh gach iarratais. | +| `INJECTION_GUARD_MODE` | enum | `off` | Mód cosanta ar instealladh leid. Luachanna: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Ceil PII ó iarratais (neamhspleách ar `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Sláintigh PII ó fhreagraí soláthraí. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Mód sláintithe PII i bhfreagraí. Luachanna: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Cuir bac ar iarratais amach chuig raonta IP príobháideacha/inmheánacha. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Lig d’úsáideoirí fíordheimhnithe an deais eochracha API stóráilte a nochtadh seachas gan ach luachanna folaithe a fheiceáil. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Cuir réimír an chuntais san áireamh i línte loga AUTH (m.sh. "Cuntas á úsáid: abc12345..."). Tá sé díchumasaithe de réir réamhshocraithe ionas go gceiltear aitheantóirí cuntais ó logaí próisis comhroinnte/ilthionónta. Tá sé neamhspleách ar Mhód Dífhabhtaithe; ní nochtfar é seo ach Mód Dífhabhtaithe a scoránú. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Nuair atá OIDC cumasaithe, díchumasaigh logáil isteach le pasfhocal ionas nach féidir le húsáideoirí fíordheimhniú ach trí Logáil Aonair OIDC. Nuair atá sé díchumasaithe (an réamhshocrú), tá logáil isteach le pasfhocal agus OIDC araon ar fáil. | + +### Líonra (16) + +| Eochair | Cineál | Réamhshocrú | Atosú | Cur síos | +| ----------------------------------------------- | ------- | ----------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Cumasaigh mód folaitheachta méarloirg TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Ceadaigh do na bealaí /v1/audio/* nóid soláthraí atá comhoiriúnach le OpenAI agus atá á n-óstáil lasmuigh de localhost a úsáid. Díchumasaithe de réir réamhshocraithe — athraíonn seoladh fuaime chuig óstach cianda aitheantas an eis-sreafa agus ní mór gur cinneadh sainráite oibreora é. Ceadaítear nóid ais-lúibe i gcónaí agus ní dhéantar difear dóibh. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Ceadaigh do POST /v1/rerank (agus do chéim athrangaithe ais-lúibe an innill chuimhne) nóid soláthraí atá comhoiriúnach le OpenAI agus atá á n-óstáil lasmuigh de localhost a úsáid. Díchumasaithe de réir réamhshocraithe — athraíonn ródú chuig óstach cianda aitheantas an eis-sreafa agus ní mór gur cinneadh sainráite oibreora é. Ceadaítear nóid ais-lúibe i gcónaí; ní mór do nóid chianda polasaí URL amach an tsoláthraí a chomhlíonadh freisin. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Nuair nach bhfuil aon seachfhreastalaí sannta do cheangal, roghnaigh go huathoibríoch an chéad seachfhreastalaí atá ag obair ón gclárlann. Díchumasaithe de réir réamhshocraithe (murach sin, bíonn aon seachfhreastalaí clárlainne ina rogha chúltaca dhomhanda — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Ceadaigh do shreabha bailíochtaithe OAuth agus soláthraí seachfhreastalaí pionnáilte a sheachaint agus ceangal go díreach nuair a theipeann ar réamhsheiceálacha insroichteachta an tseachfhreastalaí. Díchumasaithe de réir réamhshocraithe toisc gur féidir leis seo IP an eis-sreafa a athrú. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | I gcás eisceacht líonra (teorainn ama, ceangal diúltaithe/athshocraithe) i bhfeidhmitheoir rothlaithe ilchuntas, nuair nach bhfuil seachfhreastalaí tiomnaithe ag an gcuntas a dteipeann air, cuir tréimhse ghearr shuaimhnithe i bhfeidhm agus léim thar chuntais eile gan seachfhreastalaí don chuid eile den iarratas in ionad gach ceann acu a atriail. Cumasaithe de réir réamhshocraithe (sábháilte: ní athraítear IP an eis-sreafa; ní dhéantar ach riosca aga folaigh/suaimhnithe ar chuntais a chomhroinneann eis-sreabhadh a laghdú). Díchumasaigh chun iomadú láithreach a athbhunú ar an gcéad eisceacht ó chuntas gan seachfhreastalaí. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Stopann linnte seachfhreastalaithe agus rothlú opencode de réir cuntais de sheachfhreastalaí ar theip air díreach roimhe sin a athsholáthar (tóraíocht TCP diúltaithe, nó 429 a fuarthas tríd) ar feadh tréimhse in aghaidh an phróisis a dhúblaíonn le gach teip arís agus arís eile, suas le huasteorainn. Ní scríobhtar aon stádas seachfhreastalaí; agus gach iarrthóir curtha i leataobh, ní athraítear an rogha. Díchumasaithe de réir réamhshocraithe. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Taispeáin, faoi linn seachfhreastalaithe sa deais, cé mhéad IP eis-sreafa a breathnaíodh a d'fhreastail ar a chuid ball le 24 h anuas agus cé mhéad ceangal a d'úsáid iad. Inléite amháin, ríofa ón loga seachfhreastalaí, agus ní úsáidtear riamh é le haghaidh ródaithe. Díchumasaithe de réir réamhshocraithe. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Maidir leis an bhfeidhmitheoir OpenCode, déan faire ar an gcéad bheart de chorp freagra Responses sruthaithe (fuinneog: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, réamhshocrú `15000`). Caitear le sruth Responses 2xx a fhanann ina thost tar éis na fuinneoige mar shruth atá stoptha: cuirtear an cuntas ar shuaimhniú agus rothlaítear an t-iarratas chuig an gcéad chuntas eile uair amháin; teipeann go tapa ar an dara stopadh. Díchumasaithe de réir réamhshocraithe: coinníonn sruthanna stoptha tréimhse feithimh an lae inniu go dtí teorainn ama ullmhachta an tsrutha. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Riteoir OpenCode: nuair a bhíonn diúltú `user_blocked` ag gabháil le 403/451 (ní diúltú geografaíoch ná diúltú méarloirg Cloudflare), cuir an cuntas ar diúltaíodh dó ar sos agus rothlaigh go dtí an chéad chuntas eile uair amháin ar a mhéad in aghaidh na hiarrata; seoltar an dara diúltú ar ais mar atá, gan marc ratha. Díchumasaithe de réir réamhshocraithe: d’fhéadfadh cuma imghabhála a bheith ar ródú timpeall ar bhlocáil úsáideora réamhtheachtach agus d’fhéadfadh sé an bhratach a scaipeadh ar fud an chabhlaigh. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rothlú OpenCode: tar éis dhá theip neamhbhuana chomhleanúnacha réamhtheachtacha (5xx nó 400 folamh), fan sula mbogtar chuig an gcéad chuntas eile — 1.5s, á dhúbailt le gach teip bhreise, le huasteorainn 6s in aghaidh an tsosa agus 10s in aghaidh na hiarrata; scipeáiltear é má dhínascann an cliant; scaoiltear corp na freagartha teipthe roimh fanacht. Díchumasaithe de réir réamhshocraithe: fanann an teipaistriú láithreach. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rothlú OpenCode: stop tonn na gcuntas ag an gcéad 429 a aicmítear mar fhíortheorainn ráta (`Retry-After` atá inpharsáilte, nó corp a ainmníonn teorainn ráta/úsáide) agus seol an 429 réamhtheachtach sin ar ais gan athrú. Leantar den rothlú i gcás 429anna neamhaicmithe. Díchumasaithe de réir réamhshocraithe: tá an tsraith saor in aisce teoranta de réir IP imeachta (#9611), mar sin spreagann gach 429 rothlú agus seolann tonn ídithe an 429 réamhtheachtach deireanach ar ais. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Díchumasaigh fíorú teastais TLS don seachfhreastalaí MITM. **Contúirt.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Ceadaigh URLanna soláthraithe a dhíríonn ar líonraí príobháideacha/inmheánacha. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Ceadaigh soláthraithe a chur leis/a bhailíochtú ar sheoltaí logánta/príobháideacha (127.0.0.1, localhost, LAN). Cumasaithe de réir réamhshocraithe (logánta ar dtús); díchumasaigh le haghaidh blocáil dhocht a cheadaíonn seoltaí poiblí amháin. Fanann meiteashonraí néil blocáilte. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Cumasaigh mód soláthraí atá comhoiriúnach le Claude Code. | ### Polasaithe (5) -| Eochair | Cineál | Réamhshocrú | Cur síos | -| ------------------------------- | ------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Mód forfheidhmithe an bheartais maidir le húsáid uirlisí. Luachanna: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Cumasaigh teorannú ráta go huathoibríoch bunaithe ar phatrúin úsáide. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Scipeáil seiceáil áitiúil OmniRoute ar fhuinneog an chomhthéacs / uaslíon na dtócan ionchuir le haghaidh iarrataí díreacha aon mhúnla. Beidh feidhm fós ag teorainneacha réamhtheachtacha. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Diúltaigh d’iarrataí roimh a seoladh nuair nach bhfuil na cumais riachtanacha ag an spriocmhúnla (fís, uirlisí, aschur struchtúrtha, fuinneog chomhthéacs). Cosnaíonn sé iarrataí díreacha ar sholáthraí aonair a sheachnaíonn scagaire comhoiriúnachta na sraithe teaglama. | -| `RADAR_ENABLED` | boolean | `false` | Cumasaigh modúl Radar OmniRoute (scáileáin fotha catalóige agus sioncronú). Tá sé díchumasaithe de réir réamhshocraithe; ní dhíghlasálann a chumasú ach an Chomhéadain — is rogha ar leith fós é sioncronú sonraí. | - -### Am Rite (32) - -| Eochair | Cineál | Réamhshocrú | Atosú | Cur síos | -| ------------------------------------------- | ------- | ----------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Gin agus insteall achoimrí comhrá nuair a athraíonn ródú teaglama samhlacha. Díchumasaigh é chun déileáil le hathruithe samhla go neamhspleách agus chun iarratais aistrithe cúlra a chosc do gach teaglama atá ann cheana agus a bheidh ann amach anseo. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Caith amach míreanna inmheánacha aschuir ó chéim na tráchtaireachta ó shruthanna pas-trí Responses API sula gcuirtear ar aghaidh chuig cliaint iad. Díchumasaigh é chun tráchtaireacht amh réamhtheachtach a fháil. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Cuir srianta raoin i bhfeidhm ar rochtain ar uirlisí MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Comhbhrúigh tuairiscí ar uirlisí MCP chun úsáid téacschomharthaí a laghdú. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Cumasaigh próiseáil tascanna cúlra ag am rite. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Díchumasaigh gach seirbhís chúlra (athnuachan cuóta, sioncronú, srl.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Cuir muinín i scagairí RTK ar leibhéal an tionscadail gan bailíochtú. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Tosaigh freastalaí WebSocket fíor-ama an phainéil nuair a iompórtáiltear é (port 20132 de réir réamhshocraithe). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Ceadaigh do Codex an t-iompar Responses-over-WebSocket a úsáid. Nuair atá sé múchta, téann Codex siar chuig HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Ceadaigh do Codex iompar áitiúil WebSocket JSON-RPC an fhreastalaí feidhmchláir a úsáid (codexTransport=app-server). Nuair atá sé múchta, téann naisc a roghnaigh app-server siar chuig iompar eile Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Ródaigh iarratais a bhfuil a mbuiséad ídithe chuig an soláthraí/samhail éigeandála saor in aisce atá mar chúltaca. (Féach [Cúltaca Éigeandála Buiséid](#emergency-budget-fallback) thíos.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Cumasaigh atriail thrédhearcach luath do shruthanna SSE réamhtheachtacha teasctha sula sroicheann aon bheart freagartha an cliant. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Ceadaigh d'athshlánú srutha freagairt a athiarraidh agus a fhuáil le chéile tar éis do bhearta an cliant a bhaint amach cheana féin. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Déan leanúint ar aghaidh i lár srutha sábháilte do ghlaonna uirlise: ná hatosaigh sruth gearrtha riamh a luaithe a astaíodh glao uirlise (ar siúl nó críochnaithe cheana le finish_reason tool_calls), agus dún tar éis leanúint fholamh amháin seachas an buiséad iomlán a chaitheamh. Múchta: iompar an eisiúna. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Aistrigh teip uair amháin chuig nasc gaolmhar nuair a dhúnann sruth SSE sula n-astaítear aon fhráma úsáideach agus nuair atá an atriail theoranta ar an nasc céanna caite; mura bhfuil nasc gaolmhar inúsáidte ann, seoltar an 502 bunaidh `STREAM_EARLY_EOF` ar ais. Múchta de réir réamhshocraithe: fanann EOF luath ina staid chríochnaitheach tar éis na hatrialach ar an nasc céanna. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Cuir réimsí ainmneacha atá oiriúnach lena dtaispeáint san áireamh i bhfreagraí `/v1/models`. Díchumasaigh é do chliaint nach bhfuil ag súil ach le haitheantais samhlacha. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Rialaíonn sé an chaoi a gcuirtear réimíreanna le haitheantais samhlacha in /v1/models. Astaíonn 'dual' (réamhshocrú) réimíreanna ailias agus aitheantas canónach soláthraí araon ar mhaithe le comhoiriúnacht siarghabhálach. Ní astaíonn 'alias' ach an réimír ghearr ailias (m.sh. ds-web/model, seachas deepseek-web/model). Ní astaíonn 'canonical' ach an réimír iomlán aitheantais soláthraí. Luachanna: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Cumasaigh sioncronú tréimhsiúil ELO de chlár ceannairí Arena AI do ranguithe faisnéise samhlacha. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Fógair aitheantais scáthánacha `claude//` ar `/v1/models` ionas go liostóidh aimsiú samhlacha thairseach Claude Code samhlacha nach samhlacha Claude iad. Leibhéal domhanda an gheata trí leibhéal (tugtar tús áite don athróg timpeallachta thar an sárú ón bpainéal). Féach [Cumraíocht Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Máistirlasc do na hailiasanna tairsí no-think//. Air (réamhshocrú): fógraíonn /v1/models malairt gan réasúnú do gach samhail incháilithe Claude atá in ann réasúnú, agus déantar aitheantas no-think/ a sheoltar in iarratas a réiteach ar ais chuig an bhfíorshamhail agus an réasúnú faoi chois. Múchta: ní fhógraítear aon mhalairtí agus caitear le haitheantas no-think/ mar a chaitear le haon aitheantas samhla anaithnid eile. Beidh rogha isteach/amach ModelSpec.noThinkingAlias gach samhla fós i bhfeidhm nuair atá sé seo air. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Díchumasaigh giniúint malairtí leibhéil réasúnaithe (m.sh. -low, -medium, -high) sa chatalóg /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Cumasaigh lánaí fíorúla oiriúnaitheacha iontrála de réir tionónta le haghaidh seoladh chuig soláthraí (#9654): ní chuireann borradh ó thionónta amháin faoi deara 503 do thionónta eile a thuilleadh. Tugtar tús áite don athróg timpeallachta OMNIROUTE_CHAT_VIRTUAL_LANES thar an sárú seo ón bpainéal; tagann athruithe i bhfeidhm nuair a atosaítear an freastalaí. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Fógair aitheantais scáthánacha / ar /v1/models do shamhlacha nach bhfuil aon dintiúr gníomhach ag a n-úinéir canónach ach a ródaíonn tairseach pas-trí ag a bhfuil dintiúr gníomhach iad. Rabhadh: cuireann sé iontrálacha catalóige leis do gach cliant nuair a chumasaítear go domhanda é. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Cumasaigh aimsiú iarmhéid do nóid chomhbhailitheora atá comhoiriúnach le New-API / One-API / Sub2API. Nuair atá sé cumasaithe, tuairisceoidh nóid chomhoiriúnacha a bhfuil bratach an chomhbhailitheora socraithe acu a n-iarmhéid sa phainéal agus i ródú réamhseiceála cuóta. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Lean ar aghaidh le glaonna neamhshruthaithe uirlise atá faoi úinéireacht an fhreastalaí go dtí go seolann an tsamhail freagairt is féidir leis an gcliant a úsáid. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Ní áirítear i staitisticí cuardaigh ná i gcuardaigh le déanaí ach soláthraithe a bhfuil nasc beo acu fós (áirítear i gcónaí soláthraithe gan eochair amhail duckduckgo-free). Nuair atá sé múchta, coinnítear gach ró cuardaigh leasaithe a bhfuil aitheantas soláthraí aige. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Leathanaigh soláthraithe an phainéil: ná taispeáin an suaitheantas Saor in Aisce ach amháin le haghaidh comharthaí a urramaíonn an soláthraí — baintear an heorastúil ainm taispeána, réimsí saora neamh-Booleacha agus iarmhíreanna :free ar sholáthraithe cláraithe nach bhfuil sraith shaor dhoiciméadaithe acu. Nuair atá sé múchta, coinnítear riail stairiúil an tsuaitheantais. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | I bhfreagraí comhiomlánaithe 429/503 nach bhfuil ar fáil, fág `Retry-After` ar lár nuair nach eol aon am atrialach nithiúil amach anseo (seachas 1s sintéiseach), cuir `error.retry_after_provenance` (`signal` \| `none`) leis, agus lig do chonairí draenála teaglama leideanna atrialach próis a léamh ó JSON agus ó choirpeacha réamhtheachtacha gnáth-théacs. Ní bhíonn an réimse le feiceáil ach ar fhreagraí arna dtógáil ag `unavailableResponse()`; níl aon athrú ar choirpeacha 429/503 eile. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Nuair a stopann sprioc teaglama `priority`, atá marcáilte mar chúltaca amháin nuair a ídítear an cuóta, an teaglama ar chúis nach cúis chuóta í go follasach (scoradán ciorcaid an tsoláthraí oscailte, scipeáil thuarthach folaigh), freagair le 502 seachas an 503 a bhfuil cuma cuóta air. Coinníonn stadanna mar gheall ar fhrithdhúnadh, tréimhse shuaimhnithe, neamh-infhaighteacht, ídiú agus teorainn chomhuaineachta 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Is ionann 401 lom ó Mistral (`{"detail":"Unauthorized"}`, gan aon chomhartha fíordheimhnithe follasach) i gcás eochair chúlghairthe agus cuóta ídithe. Nuair atá sé air, cuireann sé an nasc i dtréimhse shuaimhnithe seachas é a pháirceáil mar `expired`, suas le 3 huaire san uair in aghaidh an naisc; páirceálann an chéad cheann eile é, ionas go dtagann eochair chúlghairthe le chéile fós. Múchta de réir réamhshocraithe: páirceálann gach 401 lom ó Mistral an nasc mar a rinneadh roimhe seo. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Faigh catalóg bheo samhlacha xAI do naisc `xai-oauth` ó `https://api.x.ai/v1/models` agus an téacschomhartha iompróra OAuth á úsáid, seachas an síol statach reoite. Múchta de réir réamhshocraithe: leanann `xai-oauth` den síol statach a sholáthar gan athrú. I gcás aon earráide réitigh, téann an t-aimsiú siar chuig an síol (níl sé fíoraithe an nglacann x.ai le hiompróir OAuth ag an gcríochphointe seo). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Lig don scuabadh glanta uathoibríoch jabanna Batch API críochnaitheacha (completed/failed/cancelled/expired) atá níos sine ná `OMNIROUTE_BATCH_RETENTION_DAYS` a scriosadh, mar aon lena seicphointí in aghaidh na líne, agus inneachar BLOB comhad uaslódáilte atá thar a `expires_at` féin a ghlanadh. Múchta de réir réamhshocraithe: coinníonn gach suiteáil atá ann cheana na sonraí seo díreach mar a bhí go dtí go roghnaíonn oibreoir é seo. Ní dhéantar difear don bhealach `DELETE /api/v1/batches/delete-completed` arna thionscnamh ag oibreoir ar aon chaoi — is conradh API poiblí ar leith, neamhchoinníollach é. | +| Eochair | Cineál | Réamhshocrú | Cur síos | +| ------------------------------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Mód forfheidhmithe an pholasaí úsáide uirlisí. Luachanna: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Cumasaigh teorannú ráta go huathoibríoch bunaithe ar phatrúin úsáide. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Scipeáil seiceáil logánta OmniRoute ar fhuinneog an chomhthéacs / uaslíon na dtócan ionchuir le haghaidh iarrataí díreacha aonmhúnla. Tá teorainneacha réamhtheachtacha fós i bhfeidhm. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Diúltaigh d’iarrataí roimh sheoladh nuair nach bhfuil na cumais riachtanacha ag an spriocmhúnla (fís, uirlisí, aschur struchtúrtha, fuinneog chomhthéacs). Cosnaíonn sé iarrataí díreacha a théann chuig soláthraí aonair agus a sheachnaíonn scagaire comhoiriúnachta na sraithe teaglama. | +| `RADAR_ENABLED` | boolean | `false` | Cumasaigh modúl Radar OmniRoute (scáileáin fotha catalóige agus sioncronaithe). Díchumasaithe de réir réamhshocraithe; ní dhéanann a chumasú ach an comhéadan úsáideora a dhíghlasáil — is rogha ar leith fós é sioncronú sonraí. | + +### Am rite (33) + +| Eochair | Cineál | Réamhshocrú | Atosú | Cur síos | +| ------------------------------------------- | ------- | ----------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Gin agus insteall achoimrí comhrá nuair a athraíonn ródú teaglama idir samhlacha. Díchumasaigh é chun déileáil le hathruithe samhla go neamhspleách agus chun iarratais aistrithe sa chúlra a chosc do gach teaglama atá ann cheana agus a bheidh ann amach anseo. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Fág míreanna inmheánacha aschuir ó chéim na tráchtaireachta ar lár ó shruthanna pas-trí Responses API sula gcuirtear ar aghaidh chuig cliaint iad. Díchumasaigh é chun tráchtaireacht amh ón bhfoinse réamhtheachtach a fháil. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Cuir srianta raoin i bhfeidhm ar rochtain ar uirlisí MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Comhbhrúigh tuairiscí ar uirlisí MCP chun úsáid téac-chomharthaí a laghdú. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Cumasaigh próiseáil tascanna sa chúlra ag am rite. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Díchumasaigh gach seirbhís chúlra (athnuachan cuóta, sioncrónú, etc). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Cuir muinín i scagairí RTK ar leibhéal an tionscadail gan bailíochtú. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Tosaigh freastalaí WebSocket an deais fíor-ama tráth iompórtála (port 20132 de réir réamhshocraithe). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Ceadaigh do Codex an t-iompar Responses-over-WebSocket a úsáid. Nuair atá sé múchta, téann Codex ar ais chuig HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Ceadaigh do Codex iompar áitiúil WebSocket JSON-RPC an app-server a úsáid (codexTransport=app-server). Nuair atá sé múchta, téann naisc a roghnaigh app-server ar ais chuig iompróirí eile Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Seol iarratais a bhfuil a mbuiséad ídithe chuig an soláthraí/samhail éigeandála saor in aisce. (Féach [Cúltaca Éigeandála Buiséid](#emergency-budget-fallback) thíos.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Cumasaigh atriail luath thrédhearcach do shruthanna SSE réamhtheascacha giorraithe sula sroicheann aon bheart freagartha an cliant. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Ceadaigh d'aisghabháil srutha freagra a athiarraidh agus a chomhcheangal tar éis do bhearta an cliant a bhaint amach cheana féin. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Déan leanúint ar aghaidh i lár srutha sábháilte do ghlaonna uirlisí: ná hathchrom ar shruth gearrtha riamh a luaithe a astaíodh glao uirlise (ar siúl nó críochnaithe cheana féin le finish_reason tool_calls), agus dún tar éis leanúint fholamh amháin seachas an buiséad iomlán a chaitheamh. Múchta: iompar an eisiúna. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Athraigh uair amháin go nasc siblíneach mar chúltaca nuair a dhúnann sruth SSE sula n-astaíonn sé aon fhráma úsáideach agus nuair atá an atriail theoranta ar an nasc céanna ídithe; mura bhfuil siblín inúsáidte ann, seoltar an freagra bunaidh `STREAM_EARLY_EOF` 502 ar ais. Díchumasaithe de réir réamhshocraithe: fanann EOF luath ina earráid chríochnaitheach tar éis na hatrialach ar an nasc céanna. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Cuir réimsí ainmneacha atá oiriúnach lena dtaispeáint san áireamh i bhfreagraí `/v1/models`. Díchumasaigh é do chliaint nach mbíonn ag súil ach le haitheantais samhlacha. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Rialaíonn sé an chaoi a gcuirtear réimíreanna le haitheantais samhlacha in /v1/models. Astaíonn 'dual' (an réamhshocrú) réimíreanna ailias agus aitheantas canónach soláthraí araon ar mhaithe le comhoiriúnacht siarghabhálach. Ní astaíonn 'alias' ach an réimír ghearr ailias (m.sh. ds-web/model, seachas deepseek-web/model). Ní astaíonn 'canonical' ach an réimír iomlán d'aitheantas an tsoláthraí. Luachanna: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Cumasaigh sioncronú tréimhsiúil ELO ó chlár ceannais Arena AI le haghaidh ranguithe éirime samhlacha. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Fógair aitheantais scáthánacha `claude//` ar `/v1/models` ionas go liostóidh aimsiú samhlacha gheata Claude Code samhlacha nach samhlacha Claude iad. Leibhéal domhanda an gheata trí leibhéal (bíonn tosaíocht ag an athróg timpeallachta ar an sárú sa deais). Féach [cumraíocht Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Príomhlasc do na hailiasanna geata no-think//. Cumasaithe (réamhshocrú): fógraíonn /v1/models leagan gan réasúnú do gach samhail incháilithe Claude atá in ann réasúnú, agus déantar aitheantas no-think/ a sheoltar in iarratas a réiteach ar ais go dtí an fhíorshamhail agus an réasúnú faoi chois. Díchumasaithe: ní fhógraítear aon leaganacha agus caitear le haitheantas no-think/ amhail aon aitheantas samhla anaithnid eile. Tá feidhm fós ag rogha liostála isteach/amach ModelSpec.noThinkingAlias in aghaidh na samhla fad atá sé seo cumasaithe. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Díchumasaigh giniúint leaganacha de réir leibhéal réasúnaithe (m.sh. -low, -medium, -high) i gcatalóg /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Cumasaigh lánaí fíorúla oiriúnaitheacha iontrála in aghaidh an tionónta do sheoladh chuig soláthraithe (#9654): ní thugann borradh tráchta ó thionónta amháin freagra 503 do thionónta eile a thuilleadh. Bíonn tosaíocht ag an athróg timpeallachta OMNIROUTE_CHAT_VIRTUAL_LANES ar an sárú seo sa deais; tagann athruithe i bhfeidhm nuair a atosaítear an freastalaí. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Fógair aitheantais scátháin / ar /v1/models do shamhlacha nach bhfuil dintiúr gníomhach ag a n-úinéir canónach ach a seolann geata pas-tríd le dintiúr gníomhach iad. Rabhadh: cuireann sé iontrálacha catalóige leis do gach cliant nuair a chumasaítear go domhanda é. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Cumasaigh brath iarmhéid do nóid chomhoiriúnacha chomhbhailitheora New-API / One-API / Sub2API. Nuair a bhíonn sé cumasaithe, tuairisceoidh nóid chomhoiriúnacha a bhfuil bratach an chomhbhailitheora socraithe acu a n-iarmhéid sa deais agus i ródú réamhsheiceála cuóta. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Lean ar aghaidh le glaonna uirlise neamhshruthaithe atá faoi úinéireacht an fhreastalaí go dtí go dtugann an tsamhail freagra is féidir leis an gcliant a úsáid. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Ní áiríonn staitisticí cuardaigh agus cuardaigh le déanaí ach soláthraithe a bhfuil ceangal beo acu fós (áirítear soláthraithe gan eochair amhail duckduckgo-free i gcónaí). Nuair atá sé as, coinnítear gach ró cuardaigh atá coinneáilte agus a bhfuil aitheantas soláthraí aige. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Leathanaigh soláthraithe na deaise: ná taispeáin an suaitheantas Saor in Aisce ach amháin i gcás comharthaí a n-urramaíonn an soláthraí iad — fágtar ar lár an heorastúil ainm taispeána, réimsí saora neamh-Bhúlacha agus iarmhíreanna :free ar sholáthraithe cláraithe nach bhfuil sraith shaor dhoiciméadaithe acu. Nuair atá sé as, coinnítear riail stairiúil an tsuaitheantais. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Ar fhreagraí comhiomlánaithe 429/503 nach bhfuil ar fáil, fág `Retry-After` ar lár nuair nach eol aon am nithiúil atrialach sa todhchaí (in ionad 1s sintéiseach), cuir `error.retry_after_provenance` (`signal` \| `none`) leis, agus lig do chonairí taosctha teaglama leideanna atrialach i bprós a léamh ó choirp réamhtheachtacha JSON agus gnáth-théacs. Ní fheictear an réimse ach ar fhreagraí a chruthaíonn `unavailableResponse()`; ní athraítear coirp eile 429/503. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Nuair a chuireann sprioc teaglama `priority`, atá marcáilte mar chúltaca amháin ar ídiú cuóta, stop leis an teaglama ar chúis ar féidir a chruthú nach mbaineann le cuóta (scoradán ciorcaid an tsoláthraí ar oscailt, scipeáil folaigh thuarthach), tabhair freagra 502 in ionad an 503 a bhfuil cuma cuóta air. Coinníonn stopanna de bharr frithdhúnadh, tréimhse shuaimhnithe, neamh-infhaighteachta, ídithe agus teorann comhthráthachta 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Is ionann 401 lom ó Mistral (`{"detail":"Unauthorized"}`, gan aon chomhartha sainráite fíordheimhnithe) i gcás eochair chúlghairthe agus i gcás cuóta ídithe. Nuair atá sé ar siúl, cuireann sé an ceangal i dtréimhse shuaimhnithe in ionad é a pháirceáil mar `expired`, 3 huaire ar a mhéad san uair in aghaidh an cheangail; páirceálann an chéad cheann eile é, ionas go gcóineasaíonn eochair chúlghairthe fós. As de réir réamhshocraithe: páirceálann gach 401 lom ó Mistral an ceangal mar a rinneadh roimhe seo. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Faigh catalóg bheo na samhlacha xAI le haghaidh naisc `xai-oauth` ó `https://api.x.ai/v1/models` agus an comhartha iompróra OAuth á úsáid, in ionad an tsíl statach reoite. Díchumasaithe de réir réamhshocraithe: leanann `xai-oauth` den síol statach a sholáthar gan athrú. Má tharlaíonn aon earráid réitigh, filleann an aimsiú ar an síol (níl sé fíoraithe an nglacann x.ai le comhartha iompróra OAuth ag an gcríochphointe seo). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Ceadaigh don scuabadh glantacháin uathoibríoch jabanna Batch API críochnaitheacha (curtha i gcrích/teipthe/cealaithe/éagtha) atá níos sine ná `OMNIROUTE_BATCH_RETENTION_DAYS` a scriosadh, mar aon lena seicphointí in aghaidh na líne, agus inneachar BLOB de chomhaid uaslódáilte atá thar a `expires_at` féin a ghlanadh. Díchumasaithe de réir réamhshocraithe: coimeádann gach suiteáil atá ann cheana na sonraí seo díreach mar a bhí go dtí go roghnaíonn oibreoir é seo a chumasú. Ní dhéantar difear don bhealach `DELETE /api/v1/batches/delete-completed` a spreagann an t-oibreoir ar aon nós — is conradh API poiblí ar leith, neamhchoinníollach é. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Cuir an cuntas Antigravity roghnaithe in áirithe ar feadh shaolré sruthaithe na hiarrata a roghnaigh é, ionas nach féidir le hatriail chomhthráthach ná le haistriú na ndintiúr cuntas atá geallta cheana do shruth atá ar siúl a athroghnú. Tá an áirithint teoranta do (nasc, samhail réamhtheachtach inghlaoite), mar sin is féidir le cuntas amháin freastal ar dhá shamhail éagsúla ag an am céanna fós. Nuair atá gach cuntas incháilithe ar léas cheana don tsamhail sin, seolann an t-iarratas freagra struchtúrtha 503 `antigravity_pool_busy` le `Retry-After` teoranta ar ais, in ionad tuilleadh ualaigh a chur ar chuntas gnóthach. Díchumasaithe de réir réamhshocraithe: fanann roghnú na gcuntas díreach mar a bhí, agus ní ghlactar aon áirithint. | ### CLI (5) -| Eochair | Cineál | Réamhshocrú | Atosú | Cur síos | -| ------------------------------------- | ------- | ----------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Cumasaigh mód comhoiriúnachta do gach cliant CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Cumasaigh ciseal comhoiriúnachta ailiasanna samhlacha. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Cumasaigh sioncrónú uathoibríoch sonraí praghsála (tá an athróg timpeallachta `PRICING_SYNC_ENABLED` riachtanach freisin). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Tar éis sioncrónú samhlacha soláthraí, (ath)scríobh comhaid phróifíle ~/.codex/*.config.toml go huathoibríoch ón gcatalóg bheo. Ní athraítear cumraíocht ghníomhach/réamhshocraithe Codex riamh. Díchumasaithe de réir réamhshocraithe. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Tar éis sioncrónú samhlacha soláthraí, (ath)scríobh próifílí Claude Code ~/.claude/profiles//settings.json go huathoibríoch ón gcatalóg bheo. Ní athraítear cumraíocht ghníomhach/réamhshocraithe Claude riamh. Díchumasaithe de réir réamhshocraithe. | +| Eochair | Cineál | Réamhshocrú | Atosú | Cur síos | +| ------------------------------------- | ------- | ----------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Cumasaigh mód comhoiriúnachta do gach cliant CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Cumasaigh ciseal comhoiriúnachta ailiasanna samhlacha. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Cumasaigh sioncrónú uathoibríoch sonraí praghsála (teastaíonn an athróg timpeallachta `PRICING_SYNC_ENABLED` freisin). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Tar éis samhlacha soláthraí a shioncrónú, (ath)scríobh comhaid phróifíle ~/.codex/*.config.toml go huathoibríoch ón gcatalóg bheo. Ní athraítear cumraíocht ghníomhach/réamhshocraithe Codex riamh. Díchumasaithe de réir réamhshocraithe. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Tar éis samhlacha soláthraí a shioncrónú, (ath)scríobh próifílí Claude Code ~/.claude/profiles//settings.json go huathoibríoch ón gcatalóg bheo. Ní athraítear cumraíocht ghníomhach/réamhshocraithe Claude riamh. Díchumasaithe de réir réamhshocraithe. | ### Sláinte (5) -| Eochair | Cineál | Réamhshocrú | Cur síos | -| ----------------------------------------- | ------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Díchumasaigh críochphointe seiceála sláinte an ásc logánta. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Díchumasaigh seiceáil sláinte bailíochtaithe na ndearbhán. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Cumasaigh rochtain líonra i dtimpeallacht bhosca gainimh na scileanna. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | I scuabadh sláinte an tseachfhreastalaí, athshocraíonn tóireadóir ar dhiúltaigh an sprioc dó (401/403/429) stríoc teipeanna comhleanúnacha an tseachfhreastalaí. Díchumasaithe de réir réamhshocraithe: fanann diúltú neodrach (#10654). Fanann 5xx neamhchinntitheach i gceachtar cás; ní bhaineann, ní dhíchumasaíonn ná ní athghníomhachtaíonn diúltú seachfhreastalaí riamh. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Rith seiceáil sláine/sláinte an DB ag an am tosaithe tar éis don fhreastalaí tosú ag glacadh le hiarratais (trí `setImmediate`) seachas bac a chur ar an tosú go dtí go gcríochnaíonn sí (#13717). Díchumasaithe de réir réamhshocraithe: cuirtear bac ar an tosú díreach mar a rinneadh roimh an PR seo. | +| Eochair | Cineál | Réamhshocrú | Cur síos | +| ----------------------------------------- | ------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Díchumasaigh críochphointe seiceála sláinte na háite áitiúla. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Díchumasaigh an tseiceáil sláinte bailíochtaithe comhartha. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Cumasaigh rochtain líonra i dtimpeallacht bhosca gainimh na scileanna. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | I scuabadh sláinte an tseachfhreastalaí, athshocraíonn taiscéalaí a dhiúltaigh an sprioc dó (401/403/429) stríoc teipeanna comhleanúnacha an tseachfhreastalaí. Díchumasaithe de réir réamhshocraithe: fanann diúltú neodrach (#10654). Fanann 5xx neamhchonclúideach sa dá chás; ní bhaineann, ní dhíchumasaíonn ná ní athghníomhachtaíonn diúltú seachfhreastalaí riamh. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Rith seiceáil sláine/sláinte an DB ag am tosaithe tar éis don fhreastalaí tosú ag glacadh le hiarratais (trí `setImmediate`) seachas bac a chur ar an tosú go dtí go gcríochnaíonn sí (#13717). Díchumasaithe de réir réamhshocraithe: cuirtear bac ar an tosú díreach mar a rinneadh roimh an PR seo. | > [!NOTE] -> Tiúnálann `INPUT_SANITIZER_BLOCK_THRESHOLD` agus a ailias oidhreachta -> `INJECTION_GUARD_BLOCK_THRESHOLD` mód `block` +> Coigeartaíonn `INPUT_SANITIZER_BLOCK_THRESHOLD` agus a ailias oidhreachta +> `INJECTION_GUARD_BLOCK_THRESHOLD` mód `block` de > `INJECTION_GUARD_MODE`, ach is gnáth-athróga timpeallachta iad a léann > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> agus ní bratacha gné iad: níl sárú DB ná lasc deais acu. Féach +> ní bratacha gné: níl aon sárú DB ná aon lasc ar an deais acu. Féach > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] > Marcálann an colún `Atosú` bratacha a bhfuil `requiresRestart: true` acu — déantar an luach a -> bhuanú láithreach ach ní thagann sé i bhfeidhm go dtí go n-athlódálann an próiseas. Diúltaíonn bratacha -> enum d’aon luach lasmuigh dá dtacar ceadaithe (bailíochtaithe ar thaobh an fhreastalaí in -> `setFeatureFlagOverride()` agus i láimhseálaí REST `PUT` araon). +> bhuanú láithreach, ach ní thagann sé i bhfeidhm go dtí go n-athlódáiltear an próiseas. Diúltaíonn bratacha +> enum d'aon luach nach bhfuil ina dtacar ceadaithe (déantar é a bhailíochtú ar thaobh an fhreastalaí in +> `setFeatureFlagOverride()` agus sa láimhseálaí REST `PUT` araon). --- ## Bratacha a Scoránú -### Deais +### Painéal -Téigh chuig **Deais → Socruithe → Bratacha Gné** -(`/dashboard/settings/feature-flags`). Tacaíonn an eangach +Téigh chuig **Painéal → Socruithe → Bratacha Gnéithe** +(`/dashboard/settings/feature-flags`). Tacaíonn an ghreille (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) leis na nithe seo a leanas: @@ -178,29 +180,29 @@ leis na nithe seo a leanas: **Atosú de Dhíth**). - **Scorán** do bhratacha Boole agus **roghchlár anuas** do bhratacha enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- **Suaitheantas foinse** do gach bratach — `DB`, `ENV`, nó `DEF` — a thaispeánann cár tháinig an +- **Suaitheantas foinse** do gach bratach — `DB`, `ENV`, nó `DEF` — a thaispeánann cá as a tháinig an luach éifeachtach. -- Cnaipe **Athshocraigh** (nach dtaispeántar ach do bhratacha a bhfuil `DB` mar fhoinse acu) chun an forshárú a bhaint, - agus cnaipe **Athshocraigh Gach Forshárú** ag an mbun. +- Cnaipe **Athshocraigh** (nach dtaispeántar ach do bhratacha a bhfuil `DB` mar fhoinse acu) chun an sárú a bhaint, + agus cnaipe **Athshocraigh Gach Sárú** ag an mbun. - Meirge **Atosaigh an Freastalaí** nuair a athraítear bratach `requiresRestart`. ### REST API Téann gach oibríocht trí bhealach amháin: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Éilíonn gach modh seisiún deaise fíordheimhnithe (`401` murach sin). +Teastaíonn seisiún fíordheimhnithe painéil ó gach modh (`401` murach sin). #### `GET /api/settings/feature-flags` -Seolann sé gach bratach ar ais lena luach éifeachtach, lena foinse agus le hachoimre. +Seolann sé gach bratach ar ais lena luach éifeachtach, lena foinse, agus le hachoimre. ```jsonc { "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Require API Key", - "description": "Require an API key for all incoming requests", + "label": "Eochair API de Dhíth", + "description": "Éiligh eochair API le haghaidh gach iarratais isteach", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +212,7 @@ Seolann sé gach bratach ar ais lena luach éifeachtach, lena foinse agus le hac "requiresRestart": false, "warningLevel": "caution", }, - // ... na 72 bratach ar fad + // ... na 74 bratach ar fad ], "summary": { "total": 56, @@ -224,34 +226,34 @@ Seolann sé gach bratach ar ais lena luach éifeachtach, lena foinse agus le hac #### `PUT /api/settings/feature-flags` -Socraigh nó bain forshárú amháin. Corp: `{ key: string; value?: string }`. -Má fhágtar `value` ar lár, baintear an forshárú (agus athchóirítear luach na timpeallachta / an luach réamhshocraithe). +Socraigh nó bain sárú aonair. Corp: `{ key: string; value?: string }`. +Má fhágtar `value` ar lár, baintear an sárú (agus athchóirítear luach na timpeallachta / an luach réamhshocraithe). ```bash -# Socraigh forshárú DB +# Socraigh sárú DB curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Bain an forshárú (gan "value") +# Bain an sárú (gan "value") curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Cuireann an freagra an `effectiveValue`/`source` nua, an `previousValue`/ -`previousSource`, agus `requiresRestart` ar ais. Diúltaítear d’eochracha anaithnide agus do luachanna enum -lasmuigh den raon le `400`. +Sa fhreagra, tugtar ar ais an `effectiveValue`/`source` nua, an `previousValue`/ +`previousSource`, agus `requiresRestart`. Diúltaítear d'eochracha anaithnide agus do luachanna enum +atá lasmuigh den raon le `400`. #### `DELETE /api/settings/feature-flags` -Glanann sé **gach** forshárú DB ag an am céanna, agus athchóiríonn sé gach bratach go dtí a luach timpeallachta / réamhshocraithe. -Seolann sé `{ cleared: , message: "..." }` ar ais. +Glanann sé **gach** sárú DB ag an am céanna, agus athchóiríonn sé luach timpeallachta / réamhshocraithe +gach brataí. Seolann sé `{ cleared: , message: "..." }` ar ais. > [!NOTE] -> Ní thagann bratacha a bhfuil `requiresRestart: true` acu i bhfeidhm ach amháin tar éis an próiseas a athlódáil. -> Glaonn sreabhadh atosaithe na deaise ar `POST /api/restart` agus ansin déanann sé -> `GET /api/health/ping` a pholláil go dtí go mbíonn an freastalaí ar fáil arís. +> Ní chuirtear bratacha a bhfuil `requiresRestart: true` acu i bhfeidhm go dtí go n-athlódáiltear an próiseas. +> Glaonn sreabhadh atosaithe an phainéil ar `POST /api/restart` agus ansin déanann sé vótaíocht ar +> `GET /api/health/ping` go dtí go mbíonn an freastalaí ar fáil arís. --- diff --git a/docs/i18n/ga/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/ga/docs/reference/PROVIDER_REFERENCE.md index 49a5ec009317..4eff00733d99 100644 --- a/docs/i18n/ga/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/ga/docs/reference/PROVIDER_REFERENCE.md @@ -6,7 +6,7 @@ > **Uathghinte** ó `src/shared/constants/providers.ts` — ná cuir in eagar de láimh. > Athghin le: `npm run gen:provider-reference` -> **Gineadh go deireanach:** 2026-09-17 +> **Gineadh go deireanach:** 2026-09-18 Líon iomlán soláthraithe: **359**. Féach an miondealú de réir catagóire thíos. @@ -32,49 +32,49 @@ Clibeanna breise: `image`, `video`, `aggregator`, `enterprise`, `embed/rerank`, --- -## Soláthraithe gan fíordheimhniú (níl eochair de dhíth) (10) - -| ID | Ailias | Ainm | Clibeanna | Suíomh gréasáin | Nótaí | Glaoch uirlisí | -| ----------------------- | ---------- | ------------------------- | ------------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | -| `aihorde` | `horde` | AI Horde | Gan fíordheimhniú | [nasc](https://aihorde.net) | Níl eochair API de dhíth — úsáidtear eochair anaithnid dhoiciméadaithe AI Horde. Tá sé roghnach eochair saor in aisce ó aihorde.net a chur leis agus ní thugann sí ach tosaíocht níos airde sa scuaine (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Gan fíordheimhniú | [nasc](https://augmentcode.com) | Ní stórálann OmniRoute eochair API. Suiteáil Auggie CLI agus rith `auggie login` ar an meaisín seo, agus ansin seolann OmniRoute go háitiúil é le haghaidh gach iarratais. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Gan fíordheimhniú | [nasc](https://playground.ai.cloudflare.com) | Níl aon dintiúir de dhíth — seisiúin anaithnide brabhsálaí thar phrótacal WebSocket cf_agent a ndearnadh innealtóireacht droim ar ais air (iompar Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Gan fíordheimhniú | [nasc](https://developers.openai.com/codex/cli) | Ní stórálann OmniRoute aon chomhartha. Bainistíonn app-server Codex CLI a shíniú isteach ChatGPT féin (~/.codex/auth.json, athnuaite go huathoibríoch). Úsáid “Sínigh isteach le ChatGPT” mura bhfuil an CLI fíordheimhnithe fós. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Gan fíordheimhniú | [nasc](https://docs.devin.ai/work-with-devin/devin-cli) | Is é Devin CLI oifigiúil a bhainistíonn an fíordheimhniú ina imleabhar droichid leithlisithe. | ionsamhlaithe | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Gan fíordheimhniú | [nasc](https://duckduckgo.com/duckchat) | Níl aon dintiúir de dhíth — tá DuckDuckGo AI Chat anaithnid agus saor in aisce. | ionsamhlaithe | -| `opencode` | `oc` | OpenCode Free | Gan fíordheimhniú | [nasc](https://opencode.ai) | Níl eochair API de dhíth — úsáidtear críochphointe poiblí saor in aisce OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Gan fíordheimhniú | [nasc](https://uncloseai.com) | Níl fíordheimhniú de dhíth. Glacann an API le haon teaghrán nach bhfuil folamh mar eochair aitheantais. Má fhilleann seanmhúnlaí ionsuite 404, úsáid Múnlaí atá ar Fáil → Iompórtáil ó /models nó Uathshioncrónú; múnla beo fíoraithe: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Gan fíordheimhniú, físeán | [nasc](https://veoaifree.com) | Níl fíordheimhniú de dhíth. Teoranta do 6 iarratas/uair an chloig in aghaidh an IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Gan fíordheimhniú | [nasc](https://zcode.z.ai) | Ní stórálann OmniRoute eochair API. Úsáideann app-server áitiúil ZCode an logáil isteach builtin:zai-coding-plan atá ann cheana. | — | +## Soláthraithe gan fhíordheimhniú (níl eochair de dhíth) (10) + +| Aitheantas | Ailias | Ainm | Clibeanna | Suíomh gréasáin | Nótaí | Glao uirlisí | +| ----------------------- | ---------- | ------------------------- | -------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `aihorde` | `horde` | AI Horde | Gan fhíordheimhniú | [nasc](https://aihorde.net) | Níl eochair API de dhíth — úsáidtear eochair anaithnid dhoiciméadaithe AI Horde. Tá sé roghnach eochair saor in aisce ó aihorde.net a chur leis agus ní thugann sí ach tosaíocht níos airde sa scuaine (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Gan fhíordheimhniú | [nasc](https://augmentcode.com) | Ní stórálann OmniRoute aon eochair API. Suiteáil Auggie CLI agus rith `auggie login` ar an ríomhaire seo; ansin seolann OmniRoute é go háitiúil le haghaidh gach iarratais. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Gan fhíordheimhniú | [nasc](https://playground.ai.cloudflare.com) | Níl aon dintiúir de dhíth — úsáidtear seisiúin anaithnide brabhsálaí thar phrótacal WebSocket cf_agent a ndearnadh innealtóireacht droim ar ais air (iompar Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Gan fhíordheimhniú | [nasc](https://developers.openai.com/codex/cli) | Ní stórálann OmniRoute aon chomhartha. Bainistíonn app-server Codex CLI a shíniú isteach ChatGPT féin (~/.codex/auth.json, a athnuachan go huathoibríoch). Úsáid “Sínigh isteach le ChatGPT” mura bhfuil an CLI fíordheimhnithe fós. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Gan fhíordheimhniú | [nasc](https://docs.devin.ai/work-with-devin/devin-cli) | Is leis an Devin CLI oifigiúil an fíordheimhniú ina imleabhar droichid leithlisithe. | ionsamhlaithe | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Gan fhíordheimhniú | [nasc](https://duckduckgo.com/duckchat) | Níl aon dintiúir de dhíth — tá DuckDuckGo AI Chat anaithnid agus saor in aisce. | ionsamhlaithe | +| `opencode` | `oc` | OpenCode Free | Gan fhíordheimhniú | [nasc](https://opencode.ai) | Níl eochair API de dhíth — úsáidtear críochphointe poiblí saor in aisce OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Gan fhíordheimhniú | [nasc](https://uncloseai.com) | Níl fíordheimhniú de dhíth. Glacann an API le haon teaghrán nach bhfuil folamh mar eochair aitheantais. Má thugann samhlacha ionsuite níos sine 404 ar ais, úsáid Samhlacha atá ar Fáil → Iompórtáil ó /models nó Sioncrónú Uathoibríoch; samhail bheo fhíoraithe: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Gan fhíordheimhniú, físeán | [nasc](https://veoaifree.com) | Níl fíordheimhniú de dhíth. Tá teorainn ráta de 6 iarratas/uair an chloig in aghaidh an IP. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Gan fhíordheimhniú | [nasc](https://zcode.z.ai) | Ní stórálann OmniRoute aon eochair API. Úsáideann app-server áitiúil ZCode an logáil isteach builtin:zai-coding-plan atá ann cheana. | — | ## Soláthraithe OAuth (24) -| Aitheantas | Ailias | Ainm | Clibeanna | Suíomh Gréasáin | Nótaí | -| --------------- | ------------- | ------------------------- | --------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `agy` | `agy` | Antigravity CLI | OAuth | [nasc](https://antigravity.google) | Iompórtáil do logáil isteach Antigravity CLI (`agy`) (greamaigh/uaslódáil a chomhad comhartha), braith logáil isteach áitiúil CLI go huathoibríoch, nó sínigh isteach le Google. Comhroinneann sé inneall Antigravity (lena n-áirítear samhlacha Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [nasc](https://aws.amazon.com/q/developer/) | Úsáideann sé an AWS Builder ID céanna nó an sreabhadh comhartha athnuachana iompórtáilte céanna le Kiro, ach coinníonn sé naisc Amazon Q ar leithligh. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [nasc](https://cline.bot/cline-pass) | Is síntiús $9.99/mí de chuid Cline é ClinePass a chuimsíonn 10 samhail oscailte códúcháin. Sínigh isteach le do chuntas Cline (an logáil isteach chéanna leis an Cline CLI/IDE), nó greamaigh eochair dhíreach ClinePass API (app.cline.bot → Settings → API Keys). Díghlasálann síntiús ClinePass na samhlacha cline-pass/*. Athúsáideann sé sreabhadh Cline WorkOS OAuth. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [nasc](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Sínigh isteach trí shreabhadh oifigiúil chód gléis an CLI, nó greamaigh eochair dhíreach API (seolta mar Authorization: Bearer). Catalóg: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [nasc](https://cli.devin.ai) | Teastaíonn an comhad dénártha Devin CLI. Rith `devin auth login` chun fíordheimhniú a dhéanamh, nó soláthair do WINDSURF_API_KEY. Suiteáil: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [nasc](https://devin.ai) | Greamaigh eochair Devin API atá ann cheana ó sheisiún fíordheimhnithe Devin. Athraíonn infhaighteacht agus céimeanna easpórtála na heochrach de réir leagan Devin agus an chuntais. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Cuir URL d'ásc GHE isteach (m.sh., https://ghe.company.com) i socruithe an tsoláthraí, ansin fíordheimhnigh trí shreabhadh gléis. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [nasc](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Níl GitLab Duo OAuth cumraithe. Cláraigh feidhmchlár OAuth ag https://gitlab.com/-/profile/applications leis an URI atreoraithe http://localhost:20128/callback agus na scóip "ai_features read_user", ansin socraigh GITLAB_DUO_OAUTH_CLIENT_ID (agus GITLAB_DUO_OAUTH_CLIENT_SECRET go roghnach) agus atosaigh. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Sínigh isteach le do bhrabhsálaí, nó greamaigh do ~/.grok/auth.json (nó an comhartha rochtana JWT) ón Grok Build CLI; rothlaítear refresh_token go huathoibríoch ar an dá bhealach. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [nasc](https://www.kimi.com/code?aff=omniroute) | Sínigh isteach leis an gcuntas Kimi céanna a úsáideann Kimi Code CLI. Úsáideann OmniRoute sreabhadh OAuth an CLI agus críochphointí Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Sraith saor in aisce: 50 creidmheas/mí (~25K–100K comhartha). ⚠️ Cuireann Téarmaí Seirbhíse Kiro cosc ar úsáid seachfhreastalaí/creata tríú páirtí. | -| `openference` | `of` | Openference | OAuth | [nasc](https://openference.com) | Sínigh isteach le do chuntas Openference chun iarratais a ródú trí api.openference.com. Teastaíonn plean gníomhach le haghaidh tátail — féadfaidh OAuth fíordheimhniú a dhéanamh ach 402 a thabhairt ar ais gan plean. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [nasc](https://trae.ai) | Is IDE dúchasach IS de chuid ByteDance é Trae (cianghníomhaire SOLO). Tabhair údarú trí trae.ai sa phreabfhuinneog, nó sínigh isteach ag solo.trae.ai agus greamaigh an Cloud-IDE-JWT (seolta mar 'Authorization: Cloud-IDE-JWT ', saolré ~14 lá) mar an comhartha rochtana; iomadaítear web_id/biz_user_id/user_unique_id/scope/tenant/region trí providerSpecificData. Níl athnuachan gan chomhéadan ar fáil do chomharthaí greamaithe — greamaigh arís iad nuair a rachaidh siad in éag. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [nasc](https://x.ai) | Sínigh isteach le xAI chun samhlacha api.x.ai amhail Grok 4.5 a úsáid. Tá sé seo ar leithligh ó sheisiúin Grok Build JWT, a úsáideann cli-chat-proxy.grok.com agus ailiasanna samhlacha grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [nasc](https://zed.dev) | Stórálann Zed dintiúir soláthraithe LLM (OpenAI, Anthropic, Google, Mistral, xAI) i slabhra eochracha an chórais oibriúcháin. Úsáid an cnaipe Iompórtáil thíos chun iad a aimsiú agus a iompórtáil go huathoibríoch. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [nasc](https://zed.dev) | Sínigh isteach le do chuntas Zed (síniú isteach aipe dúchasaí). Gineann OmniRoute péire eochracha RSA aonuaire agus osclaíonn sé zed.dev chun é a údarú — ar shuiteáil chianda/gan chomhéadan, cóipeáil URL aisghlao 127.0.0.1 a thagann as sin ó bharra seoltaí do bhrabhsálaí agus greamaigh anseo arís é. Tá sé seo éagsúil leis an iontráil iompórtála dintiúr 'Zed IDE' thuas: seolann sé críochnuithe comhrá trí chomhbhailitheoir samhlacha óstáilte Zed féin (cloud.zed.dev), agus cuireann sé samhlacha Anthropic/OpenAI/Google/xAI ar fáil faoi do phlean Zed. | +| Aitheantas | Ailias | Ainm | Clibeanna | Suíomh Gréasáin | Nótaí | +| --------------- | ------------- | ------------------------- | --------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [nasc](https://antigravity.google) | Iompórtáil do logáil isteach Antigravity CLI (`agy`) (greamaigh/uaslódáil a chomhad comhartha), braith logáil isteach áitiúil CLI go huathoibríoch, nó sínigh isteach le Google. Roinneann sé inneall Antigravity (lena n-áirítear samhlacha Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [nasc](https://aws.amazon.com/q/developer/) | Úsáideann sé an AWS Builder ID céanna nó an sreabhadh comhartha athnuachana iompórtáilte céanna le Kiro, ach coinníonn sé naisc Amazon Q ar leithligh. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [nasc](https://cline.bot/cline-pass) | Is síntiús $9.99/mí de chuid Cline é ClinePass a chuimsíonn 10 samhail oscailte códaithe. Sínigh isteach le do chuntas Cline (an logáil isteach chéanna leis an Cline CLI/IDE), nó greamaigh eochair dhíreach ClinePass API (app.cline.bot → Socruithe → Eochracha API). Díghlasálann síntiús ClinePass na samhlacha cline-pass/*. Athúsáideann sé sreabhadh OAuth Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [nasc](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Sínigh isteach trí shreabhadh oifigiúil chód gléis an CLI, nó greamaigh eochair dhíreach API (seolta mar Authorization: Bearer). Catalóg: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [nasc](https://cli.devin.ai) | Teastaíonn dénártha Devin CLI. Rith `devin auth login` chun fíordheimhniú a dhéanamh, nó tabhair do WINDSURF_API_KEY. Suiteáil: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [nasc](https://devin.ai) | Greamaigh eochair Devin API atá ann cheana ó sheisiún fíordheimhnithe Devin. Braitheann infhaighteacht agus céimeanna easpórtála na heochrach ar leagan Devin agus ar an gcuntas. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Cuir URL d’áis GHE isteach i socruithe an tsoláthraí (m.sh., https://ghe.company.com), ansin déan fíordheimhniú trí shreabhadh gléis. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [nasc](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Níl GitLab Duo OAuth cumraithe. Cláraigh feidhmchlár OAuth ag https://gitlab.com/-/profile/applications leis an URI atreoraithe http://localhost:20128/callback agus na scóip "ai_features read_user", ansin socraigh GITLAB_DUO_OAUTH_CLIENT_ID (agus GITLAB_DUO_OAUTH_CLIENT_SECRET go roghnach) agus atosaigh. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Sínigh isteach le do bhrabhsálaí, nó greamaigh do ~/.grok/auth.json (nó an comhartha rochtana JWT) ón Grok Build CLI; rothlaítear refresh_token go huathoibríoch sa dá chás. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [nasc](https://www.kimi.com/code?aff=omniroute) | Sínigh isteach leis an gcuntas Kimi céanna a úsáideann Kimi Code CLI. Úsáideann OmniRoute sreabhadh OAuth an CLI agus críochphointí Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Sraith saor in aisce: 50 creidmheas/mí (~25K–100K comhartha). ⚠️ Cuireann Téarmaí Seirbhíse Kiro cosc ar úsáid trí sheachfhreastalaí/creatlach tríú páirtí. | +| `openference` | `of` | Openference | OAuth | [nasc](https://openference.com) | Sínigh isteach le do chuntas Openference chun iarratais a ródú trí api.openference.com. Áirítear rochtain sa tsraith saor in aisce ar Qwen3.8 27b agus Llama 3.2 3B — féach openference.com/pricing le haghaidh théarmaí reatha an phlean. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [nasc](https://trae.ai) | Is IDE dúchasach do IS de chuid ByteDance é Trae (cianghníomhaire SOLO). Tabhair údarú trí trae.ai sa phreabfhuinneog, nó sínigh isteach ag solo.trae.ai agus greamaigh an Cloud-IDE-JWT (seolta mar 'Authorization: Cloud-IDE-JWT ', saolré ~14 lá) mar an comhartha rochtana; seoltar web_id/biz_user_id/user_unique_id/scope/tenant/region ar aghaidh trí providerSpecificData. Níl athnuachan gan chomhéadan ar fáil do chomharthaí greamaithe — greamaigh arís iad nuair a théann siad in éag. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [nasc](https://x.ai) | Sínigh isteach le xAI chun samhlacha api.x.ai amhail Grok 4.5 a úsáid. Tá sé seo ar leithligh ó sheisiúin Grok Build JWT, a úsáideann cli-chat-proxy.grok.com agus ailiasanna samhlacha grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [nasc](https://zed.dev) | Stórálann Zed dintiúir sholáthraithe LLM (OpenAI, Anthropic, Google, Mistral, xAI) i slabhra eochracha an chórais oibriúcháin. Úsáid an cnaipe Iompórtáil thíos chun iad a aimsiú agus a iompórtáil go huathoibríoch. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [nasc](https://zed.dev) | Sínigh isteach le do chuntas Zed (síniú isteach trí aip dhúchasach). Gineann OmniRoute péire eochracha RSA aonuaire agus osclaíonn sé zed.dev chun é a údarú — ar shuiteáil chianda/gan chomhéadan, cóipeáil URL aisghlao 127.0.0.1 ó bharra seoltaí do bhrabhsálaí agus greamaigh ar ais anseo é. Tá sé seo éagsúil ón iontráil iompórtála dintiúr 'Zed IDE' thuas: seachfhreastalaíonn sé comhlánuithe comhrá trí chomhbhailitheoir samhlacha óstáilte Zed féin (cloud.zed.dev), a chuireann samhlacha Anthropic/OpenAI/Google/xAI ar fáil faoi do phlean Zed. | ## Soláthraithe Fianán Gréasáin (34) @@ -115,252 +115,252 @@ Clibeanna breise: `image`, `video`, `aggregator`, `enterprise`, `embed/rerank`, | `zai-web` | `zw` | Z.ai Web | Fianán gréasáin | [nasc](https://chat.z.ai) | Cóipeáil luach "token" ó chat.z.ai → DevTools → Application → Local Storage. Ná cóipeáil fianáin; láimhseálann OmniRoute an CAPTCHA in aghaidh an iarratais trína iompar brabhsálaí. | — | | `zenmux-free` | `zmf` | ZenMux Saor in aisce (Gréasán) | Fianán gréasáin | [nasc](https://zenmux.ai) | Logáil isteach ag zenmux.ai, ansin easpórtáil gach fianán le EditThisCookie nó Cookie-Editor agus greamaigh teaghrán iomlán an cheanntáisc Cookie anseo. Athnuaigh gach ~30 lá. | — | -## Soláthraithe Eochracha API (íoctha / íoctha le creidmheasanna saor in aisce) (242) - -| ID | Ailias | Ainm | Clibeanna | Suíomh Gréasáin | Nótaí | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | Eochair API | [nasc](https://ai.360.cn) | Faigh eochair API ag ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | Eochair API, comhbhailitheoir | [nasc](https://agentrouter.org) | $200 de chreidmheasanna saor in aisce nuair a chláraítear - geata ródaithe ilmhúnla | -| `agnes` | `agnes` | Agnes AI | Eochair API, físeán | [nasc](https://agnes-ai.com) | Faigh eochair API ag agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (an tSín) | Eochair API | [nasc](https://api.agnes-ai.cn) | Faigh eochair API ó shuíomh Agnes CN. | -| `ai21` | `ai21` | AI21 Labs | Eochair API | [nasc](https://www.ai21.com) | $10 de chreidmheasanna trialach nuair a chláraítear (bailí ar feadh 3 mhí), níl cárta creidmheasa ag teastáil | -| `aimlapi` | `aiml` | AI/ML API | Eochair API, comhbhailitheoir | [nasc](https://aimlapi.com) | Cuireadh an tsraith saor in aisce ar sos (2026) — níl ach íoc de réir mar a úsáidtear ar fáil anois le AI/ML API (íos-bharrsuim $20); níl aon chreidmheasanna saor in aisce athfhillteacha ann. | -| `ainative` | `ainative` | AINative Studio | Eochair API | [nasc](https://ainative.studio) | Cruthaigh eochair API saor in aisce ag ainative.studio (gan chárta), ansin greamaigh anseo í mar chomhartha Bearer. | -| `aion` | `aion` | Aion Labs | Eochair API | [nasc](https://www.aionlabs.ai) | Cruthaigh eochair API saor in aisce ag aionlabs.ai (gan chárta), ansin greamaigh anseo í mar chomhartha Bearer. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | Eochair API | [nasc](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (an tSín) | Eochair API | [nasc](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Eochair API | [nasc](https://developer.ant-ling.com/en/docs/) | Cláraigh agus cruthaigh eochair API i gconsól API Ant Ling (https://chat.ant-ling.com/open), ansin greamaigh anseo í. Ródálann OmniRoute trácht comhrá chuig https://api.ant-ling.com/v1/chat/completions; tá an soláthraí comhoiriúnach le OpenAI agus cuireann sé comhéadan atá comhoiriúnach le Anthropic ar fáil freisin. | -| `anthropic` | `anthropic` | Anthropic | Eochair API | [nasc](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | Eochair API, comhbhailitheoir | [nasc](https://anyapi.ai) | Plean saor in aisce: 100,000 ANY Tokens/lá agus 100 RPM le haghaidh samhlacha incháilithe Free/Basic; níl cárta creidmheasa ag teastáil. | -| `api-airforce` | `af` | Api.airforce | Eochair API | [nasc](https://api.airforce) | 55 samhail sa tsraith saor in aisce, lena n-áirítear Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | Eochair API | [nasc](https://arcee.ai) | Faigh eochair API ag arcee.ai | -| `auriko` | `auriko` | Auriko | Eochair API, comhbhailitheoir | [nasc](https://www.auriko.ai) | Fógraíonn an plean saor in aisce 1,000 RPM Ardáin agus 10,000 RPM BYOK. Téann tátal ardáin trí chostas an tsoláthraí fós; ní linn comharthaí saor in aisce ná tátal saor in aisce gan teorainn é seo. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | Eochair API, fiontar | [nasc](https://learn.microsoft.com/azure/ai-foundry) | Úsáid d'eochair Azure AI Foundry. Is féidir gurb é https://.services.ai.azure.com/openai/v1/ nó https://.openai.azure.com/openai/v1/ an bun-URL. | -| `azure-openai` | `azure` | Azure OpenAI | Eochair API, fiontar | [nasc](https://azure.microsoft.com/products/ai-services/openai-service) | Úsáid d'eochair API Azure OpenAI. Ba cheart gurb é críochphointe d'acmhainne an bun-URL, mar shampla https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | Eochair API | [nasc](https://b.ai) | Eochair API Bearer do gheata LLM b.ai atá comhoiriúnach le OpenAI (ar leith ó TheB.AI). Cruthaigh eochair ag https://docs.b.ai, ansin úsáid https://api.b.ai/v1 mar an mbun-URL atá comhoiriúnach le OpenAI. | -| `baichuan` | `baichuan` | Baichuan | Eochair API | [nasc](https://www.baichuan-ai.com/) | Faigh eochair API ag platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | Eochair API | [nasc](https://ernie.baidu.com/) | Faigh eochair API ag console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Eochair API | [nasc](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | Eochair API | [nasc](https://baseten.co) | $30 de chreidmheasanna trialach saor in aisce le haghaidh tátal GPU | -| `bazaarlink` | `bzl` | BazaarLink | Eochair API | [nasc](https://bazaarlink.ai) | Úsáid d'eochair API BazaarLink (a thosaíonn le sk-bl-) in Authorization: Bearer . Oibríonn OpenAI SDK leis an mbun-URL https://bazaarlink.ai/api/v1. Úsáideann samhlacha an fhormáid soláthraí/ainm-samhla. | -| `bedrock` | `bedrock` | Amazon Bedrock | Eochair API, fiontar | [nasc](https://aws.amazon.com/bedrock) | Úsáid d'eochair API Amazon Bedrock agus cumraigh an réigiún AWS ina bhfuil do shamhlacha cumasaithe (mar shampla eu-west-2). Glaonn OmniRoute ar API dúchasach Converse de chuid Bedrock go díreach. | -| `black-forest-labs` | `bfl` | Black Forest Labs | Eochair API, íomhá | [nasc](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | Eochair API | [nasc](https://blackbox.ai) | ⚠️ **DÍMHEASTA.** Filleann api.blackbox.ai HTTP 404 ar gach malairt conaire (scuabadh 2026-08-21); bogadh an comhéadan poiblí tátail chuig an gcríochphointe geataithe enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | Eochair API | [nasc](https://www.bluesminds.com) | Creidmheasanna pi laethúla saor in aisce — tacaíonn sé le breis agus 200 samhail, lena n-áirítear GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | Eochair API | [nasc](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | Eochair API | [nasc](https://bytez.com) | $1 de chreidmheasanna saor in aisce, a athnuachan gach 4 seachtaine | -| `cerebras` | `cerebras` | Cerebras | Eochair API | [nasc](https://inference.cerebras.ai) | Creidmheas clárúcháin aonuaire $5 (bailí ar feadh 30 lá); tá modh íocaíochta ag teastáil. Ní sraith saor in aisce athfhillteach é. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | Eochair API | [nasc](https://hyper.charm.land) | 100 Hypercredits mhíosúla saor in aisce nuair a chláraítear | -| `chat-oripe` | `chat-oripe` | Chat Oripe | Eochair API, comhbhailitheoir | [nasc](https://api.oriper.com) | Fógraíonn na meiteashonraí oifigiúla 2M comhartha/mí, ach bhí an suíomh poiblí agus an doiciméadacht blocáilte le linn na hiniúchóireachta; caith leis an gcuóta agus leis an mapáil branda mar nithe neamhdheimhnithe. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | Eochair API, comhbhailitheoir | [nasc](https://chatanywhere.tech) | Le haghaidh úsáid phearsanta, oideachasúil nó taighde amháin: luaitear sa doiciméadacht phoiblí 10,000 pointe/lá agus 200 iarratas/lá in aghaidh an IP/na heochrach; ná húsáid le haghaidh tráchta tráchtála. | -| `cheaperinference` | `cinf` | Cheaper Inference | Eochair API | [nasc](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | Eochair API | [nasc](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | Eochair API, comhbhailitheoir | [nasc](https://chutes.ai) | Eochair API Bearer do gheata Chutes atá comhoiriúnach le OpenAI. | -| `clarifai` | `clarifai` | Clarifai | Eochair API, fiontar | [nasc](https://docs.clarifai.com) | Úsáid do PAT Clarifai nó eochair API a bhaineann go sonrach leis an aip. Díríonn OmniRoute ar an gcríochphointe atá comhoiriúnach le OpenAI ag https://api.clarifai.com/v2/ext/openai/v1 agus fíordheimhníonn sé le Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Eochair API, comhbhailitheoir | [nasc](https://cloudcode.one) | Áirítear glm-4.7-flash agus glm-4.6v-flash ar na samhlacha saor in aisce foilsithe; ní fhoilsítear cuóta uimhriúil ar bith, agus d’fhéadfadh creidmheas nó cúpón a bheith riachtanach chun eochair a chruthú. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Eochair API | [nasc](https://developers.cloudflare.com/workers-ai) | Teastaíonn Comhartha API AGUS Aitheantas Cuntais (le fáil ag dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | Eochair API | [nasc](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | Eochair API | [nasc](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | Eochair API | [nasc](https://cohere.com) | Triail In Aisce: 1,000 glao API/mí le haghaidh tástála, gan cárta creidmheasa de dhíth | -| `command-code` | `cmd` | Command Code | Eochair API | [nasc](https://commandcode.ai/) | Úsáid eochair API Command Code. Seoltar iarratais chuig críochphointe /provider/v1/chat/completions Command Code. | -| `coze` | `coze` | Coze | Eochair API | [nasc](https://coze.com) | Faigh eochair API ag coze.com/open/api | -| `crof` | `crof` | CrofAI | Eochair API | [nasc](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | Eochair API | [nasc](https://cursor.com/dashboard/api) | Greamaigh eochair API úsáideora Cursor (crsr_...) ó cursor.com/dashboard/api. Malartaíonn OmniRoute í ar chomhartha seisiúin de réir mar is gá; ní gá IDE ná cursor-agent a shuiteáil. Gearrtar an úsáid ar an bplean Cursor ar leis an eochair. | -| `dahl` | `dahl` | Dahl | Eochair API | [nasc](https://inference.dahl.global) | Cliceáil ‘Cuir Cuntas Leis’ chun comhartha a ghiniúint go huathoibríoch, nó cuir eochair API de láimh leis. | -| `databricks` | `databricks` | Databricks | Eochair API, fiontar | [nasc](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | Eochair API, fiontar | [nasc](https://docs.datarobot.com) | Úsáid do chomhartha API DataRobot. Is féidir leis an URL Bunúsach roghnach a bheith ina fhréamh chuntais (le haghaidh LLM Gateway) nó ina URL imscartha faoi /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | Eochair API, íomhá | [nasc](https://deepai.org) | Úsáid d’eochair API DeepAI. Faigh ceann ag deepai.org — teastaíonn síntiús Pro ($9.99/mí). | -| `deepinfra` | `deepinfra` | DeepInfra | Eochair API | [nasc](https://deepinfra.com) | Creidmheasanna clárúcháin saor in aisce le haghaidh tástáil API agus iniúchadh samhlacha | -| `deepseek` | `ds` | DeepSeek | Eochair API | [nasc](https://platform.deepseek.com) | 5M comhartha saor in aisce nuair a chláraítear — gan cárta creidmheasa de dhíth | -| `dgrid` | `dgrid` | DGrid | Eochair API | [nasc](https://dgrid.ai) | Ródaire Samhlacha Saor in Aisce DGrid: 10 n-iarratas/nóiméad agus 100 iarratas/lá. Díghlasálann breisiú aonuaire $5 suas le 20 iarratas/nóiméad agus 1,000 iarratas/lá. | -| `dify` | `dify` | Dify | Eochair API | [nasc](https://dify.ai) | Faigh eochair API ó do shampla Dify. | -| `digitalocean` | `digitalocean` | DigitalOcean | Eochair API | [nasc](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | Eochair API | [nasc](https://dit.ai) | Úsáid d’eochair API dit.ai in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI — athsholáthar díreach, níl le déanamh ach an URL bunúsach a athrú go https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | Eochair API | [nasc](https://doubao.com) | Faigh eochair API ag console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | Eochair API, comhbhailitheoir | [nasc](https://www.dxnt.com) | De réir na doiciméadachta, faigheann cuntais saor in aisce 100 glao/lá; d’fhéadfadh an cuóta méadú trí chuirí agus d’fhéadfadh sé a bheith éagsúil de réir cuntais. | -| `electronhub` | `electronhub` | Electron Hub | Eochair API, comhbhailitheoir | [nasc](https://www.electronhub.ai) | Plean saor in aisce: 5 RPM, $0.25 i gcreidmheasanna seachtainiúla agus 10 Neutrino/lá do shamhlacha :free; tá buiséid teaghlaigh i bhfeidhm freisin. | -| `empower` | `empower` | Empower | Eochair API, comhbhailitheoir | [nasc](https://docs.empower.dev) | Eochair API Bearer do chríochphointe Empower atá comhoiriúnach le OpenAI. | -| `eurouter` | `eurouter` | EURouter | Eochair API, comhbhailitheoir | [nasc](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | Eochair API | [nasc](https://factory.ai) | Eochair API Bearer do gheata Factory atá comhoiriúnach le OpenAI. | -| `fal-ai` | `fal` | Fal.ai | Eochair API, íomhá | [nasc](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | Eochair API, comhbhailitheoir | [nasc](https://fastrouter.ai) | Ceadaíonn samhlacha leis an iarmhír :free 10 n-iarratas/lá in aghaidh na heagraíochta agus na samhla; d’fhéadfadh an infhaighteacht athrú. | -| `featherless-ai` | `featherless` | Featherless AI | Eochair API | [nasc](https://featherless.ai) | Sraith saor in aisce ar fáil — gan cárta creidmheasa de dhíth | -| `fenayai` | `fenayai` | FenayAI | Eochair API, comhbhailitheoir | [nasc](https://fenayai.com) | Eochair API Bearer do gheata FenayAI atá comhoiriúnach le OpenAI. | -| `fireworks` | `fireworks` | Fireworks AI | Eochair API | [nasc](https://fireworks.ai) | $1 i gcreidmheasanna tosaithe saor in aisce nuair a chláraítear le haghaidh tástáil API | -| `free-ai` | `free-ai` | Free.ai | Eochair API, comhbhailitheoir | [nasc](https://free.ai) | Clúdaíonn 30,000 comhartha/lá samhlacha féinstósta tar éis fíorú ríomhphoist. Féadfar úsáid thar an linn a bhilleáil ar an gcostas amh, agus tá samhlacha seachtracha préimhe íoctha. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | Eochair API | [nasc](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | Eochair API | [nasc](https://freebuff.com) | Cuir isteach Comhartha Fíordheimhnithe Freebuff / Codebuff (faighte trí logáil isteach CLI nó trí bhailitheoir uathoibrithe). | -| `freeinference` | `freeinference` | FreeInference | Eochair API, comhbhailitheoir | [nasc](https://freeinference.org) | Rochtain taighde saor in aisce gan chárta; teastaíonn ceadú de láimh ó iarratasóirí nach mbaineann le Harvard agus ní ráthaítear cuóta uimhriúil go poiblí. | -| `freemodel-dev` | `fmd` | FreeModel.dev | Eochair API | [nasc](https://freemodel.dev) | $300 de chreidmheasanna saor in aisce ar chlárú — níl cárta creidmheasa ag teastáil. Faigh rochtain ar GPT-5.4 agus GPT-5.5 (na samhlacha suaitheanta is déanaí ó OpenAI) trí API atá comhoiriúnach le OpenAI. | -| `freetheai` | `fta` | FreeTheAi | Eochair API, comhbhailitheoir | [nasc](https://freetheai.xyz) | Glac páirt i Discord FreeTheAi chun d'eochair API saor in aisce a fháil. | -| `friendliai` | `friendli` | FriendliAI | Eochair API | [nasc](https://friendli.ai) | Sraith saor in aisce le haghaidh tátail gan fhreastalaí — níl cárta creidmheasa ag teastáil | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | Eochair API | [nasc](https://galadriel.com) | ⚠️ **DÍMHEASTA.** Ní réitíonn api.galadriel.ai a thuilleadh (scuabadh 2026-06-19); is cosúil gur scoireadh den API tátail. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | Eochair API | [nasc](https://aistudio.google.com) | Tá sraith saor in aisce ar fáil trí Google AI Studio; tá cuótaí reatha de réir samhla agus teorainneacha réigiúnacha i bhfeidhm | -| `getgoapi` | `ggo` | GoAPI | Eochair API, comhbhailitheoir | [nasc](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | Eochair API | [nasc](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | Eochair API | [nasc](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Comhartha rochtana pearsanta GitLab don API poiblí Code Suggestions. Cumraigh bun-URL féinóstáilte nuair nach bhfuil gitlab.com á úsáid. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Eochair API | [nasc](https://opengateway.gitlawb.com) | Cúlghaireadh MiMo saor in aisce (xiaomi/mimo-v2.5) in 2026-05 — is tairseach creidmheasa íoc-mar-a-úsáidtear anois é Opengateway; níl aon samhail saor in aisce athfhillteach ann. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Eochair API | [nasc](https://opengateway.gitlawb.com) | Tháinig deireadh le promóisean saor in aisce Nemotron in 2026-06 — níl bealach GMI Cloud ar fáil anois ach le creidmheas íoc-mar-a-úsáidtear. | -| `glm` | `glm` | GLM Coding | Eochair API | [nasc](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (an tSín) | Eochair API | [nasc](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | Eochair API | [nasc](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | Eochair API | [nasc](https://greenpt.com) | Is féidir síntiús API a chruthú saor in aisce; gearrtar táille ar thátal de réir comhartha. Ní fhoilsítear aon lamháltas tátail saor in aisce. | -| `groq` | `groq` | Groq | Eochair API | [nasc](https://groq.com) | Plean saor in aisce: teorainneacha de réir samhla (200K comhartha/lá in aghaidh na samhla comhrá; féach console.groq.com/docs/rate-limits le haghaidh RPM/RPD) — níl aon mhodh íocaíochta ar comhad. | -| `haiper` | `hp` | Haiper | Eochair API, físeán | [nasc](https://haiper.ai) | Faigh eochair API ag haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | Eochair API | [nasc](https://api.hcnsec.cn) | Faigh eochair API ag api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | Eochair API, comhbhailitheoir | [nasc](https://helixmind.online) | Níor deimhníodh na héilimh a scaipeadh roimhe seo faoi 3 RPM/50 RPD agus gan chárta le linn iniúchadh 2026-08-02; teastaíonn fíorú cuntais chun an cuóta agus an billeáil reatha a dheimhniú. | -| `helyxai` | `helyxai` | Helyx AI | Eochair API, comhbhailitheoir | [nasc](https://helyxai.space) | Sonraítear 100,000 comhartha/lá i ndoiciméid an phlean oibríochtúil Saor in Aisce; tá éileamh margaíochta ar leith an tsuímh maidir le 2M+ ag teacht salach air sin agus ní ghlactar leis mar ráthaíocht cuóta. | -| `heroku` | `heroku` | Heroku AI | Eochair API, fiontar | [nasc](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | Eochair API | [nasc](https://huggingface.co) | API Tátail saor in aisce do na mílte samhail (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | Eochair API | [nasc](https://hyperbolic.xyz) | $1-5 de chreidmheasanna trialach ar chlárú le haghaidh tátail gan fhreastalaí | -| `ideogram` | `ideo` | Ideogram | Eochair API | [nasc](https://ideogram.ai) | Faigh eochair API ag ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | Eochair API | [nasc](https://xinghuo.xfyun.cn) | Faigh eochair API ag console.xfyun.cn | -| `inception` | `inception` | Inception | Eochair API | [nasc](https://docs.inceptionlabs.ai) | 10M comhartha saor in aisce ar chlárú, níl cárta creidmheasa ag teastáil. | -| `inference-net` | `inet` | Inference.net | Eochair API | [nasc](https://inference.net) | $25 de chreidmheasanna saor in aisce ar chlárú, agus deontais taighde ar fáil chomh maith | -| `internlm` | `internlm` | InternLM (Intern-S1) | Eochair API | [nasc](https://internlm.intern-ai.org.cn/) | Cuóta míosúil saor in aisce ~1M comhartha ionchuir / 3M comhartha aschuir (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | Eochair API, leabú/athrangú | [nasc](https://jina.ai) | Eochair API Bearer le haghaidh api.jina.ai — leabuithe, athrangú, aicmiú, deighilt agus cuardach. Tugtar tús áite d’eochracha an deais ar JINA_AI_API_KEY. Ní hé seo an cárta Reader / r.jina.ai agus ní dhéanann sé URLanna a aisghabháil. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Eochair API | [nasc](https://jina.ai/reader) | Eochair API Bearer le haghaidh tiontú URL-go-markdown ar r.jina.ai (/v1/web/fetch amháin). Ní sholáthraíonn sé /v1/embeddings ná /v1/rerank. Oibríonn an comhartha Jina céanna agus a oibríonn le Foundation API; athúsáideann OmniRoute eochair deaise jina-ai nó JINA_AI_API_KEY nuair atá an cárta seo folamh. | -| `kenari` | `kenari` | Kenari | Eochair API | [nasc](https://kenari.id) | Úsáid d’eochair API Kenari (kn-...) in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | Eochair API | [nasc](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | Eochair API, comhbhailitheoir | [nasc](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | Eochair API | [nasc](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | Eochair API | [nasc](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | Eochair API | [nasc](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | Eochair API, comhbhailitheoir | [nasc](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | Eochair API, físeán | [nasc](https://leonardo.ai) | Faigh eochair API ag leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | Eochair API | [nasc](https://liquid.ai) | Faigh eochair API ag liquid.ai | -| `literouter` | `literouter` | LiteRouter | Eochair API, comhbhailitheoir | [nasc](https://literouter.com) | Úsáideann malairtí samhlacha saor in aisce an iarmhír :free; athraíonn teorainneacha creidmheasa laethúla de réir samhla agus tá ionchur saor in aisce teoranta do 5,000 comhartha. | -| `llamagate` | `llamagate` | LlamaGate | Eochair API | [nasc](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Eochair API, comhbhailitheoir | [nasc](https://llm.kiwi) | Cuireann an plean saor in aisce auto agus hrLLM ar fáil; baineann an teorainn fhoilsithe de 40 iarratas/uair an chloig le hrLLM. | -| `llm7` | `llm7` | LLM7.io | Eochair API | [nasc](https://llm7.io) | Úsáid aon eochair nach bhfuil folamh (mar shampla, 'unused'). Má fhilleann samhlacha ionsuite níos sine model_unavailable, úsáid Available Models → Import from /models nó Auto-Sync; samhail bheo fhíoraithe: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | Eochair API, comhbhailitheoir | [nasc](https://llmgateway.io) | Plean Hosted Free: tá samhlacha ar phraghas saor in aisce teoranta do 5 iarratas gach 10 nóiméad nuair nach bhfuil aon chreidmheas sa chuntas. | -| `logfare` | `logfare` | Logfare | Eochair API, comhbhailitheoir | [nasc](https://logfare.ai) | Cruthaigh cuntas saor in aisce ag https://logfare.ai/register (ainm úsáideora/focal faire, gan fíorú ríomhphoist) chun eochair API a fháil láithreach, ansin greamaigh anseo í mar chomhartha Bearer. | -| `longcat` | `lc` | LongCat AI | Eochair API | [nasc](https://longcat.chat/platform/docs) | Saor in aisce: deontas aonuaire 10M comhartha tar éis clárú cuntais + fíorú KYC (LongCat-2.0). Aon uair amháin — ní liúntas athfhillteach laethúil/míosúil é. | -| `magnific` | `freepik` | Magnific | Eochair API, íomhá | [nasc](https://www.magnific.com) | Faigh eochair API ag magnific.com/user/api-keys (ceanntásc x-magnific-api-key). Oibríonn seaneochracha forbróra Freepik fós. | -| `maritalk` | `maritalk` | Maritalk | Eochair API | [nasc](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | Eochair API, comhbhailitheoir | [nasc](https://meganova.ai) | Clárú saor in aisce gan chárta. Is ionann cuótaí foilsithe Tier 1 de réir samhla agus 550 iarratas/lá san iomlán; ní linn dhomhanda chomhroinnte iad, agus d’fhéadfadh táillí breise íoctha a bheith i bhfeidhm má chumasaítear iad. | -| `meta-llama` | `meta` | Meta Llama API | Eochair API | [nasc](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | Eochair API, físeán | [nasc](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (an tSín) | Eochair API | [nasc](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | Eochair API | [nasc](https://mistral.ai) | Sraith Experiment saor in aisce: rochtain faoi theorainn ráta ar gach samhail, gan cárta creidmheasa ag teastáil | -| `mixedbread` | `mxbai` | Mixedbread AI | Eochair API | [nasc](https://www.mixedbread.com) | Eochair API Bearer le haghaidh API leabuithe Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | Eochair API, comhbhailitheoir | [nasc](https://www.mixlayer.com) | Tá an tsamhail qwen/qwen3.5-4b-free saor in aisce le haghaidh fréamhshamhaltaithe agus faoi theorainn ráta; níl aon RPM poiblí seasta ná cuóta laethúil deimhnithe. | -| `mnn-ai` | `mnn-ai` | MNN AI | Eochair API, comhbhailitheoir | [nasc](https://mnnai.ru) | Plean saor in aisce: $1 i gcreidmheasanna míosúla, 10 RPM agus rochtain ar shamhlacha marcáilte Free amháin. | -| `modal` | `mdl` | Modal | Eochair API, fiontar | [nasc](https://modal.com/docs) | Úsáid an comhartha Bearer a chosnaíonn d’imscaradh Modal, má tá sé cumasaithe. Ba cheart don bhun-URL a bheith dírithe ar d’aip Modal atá comhoiriúnach le OpenAI, mar shampla https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | Eochair API | [nasc](https://modelscope.cn) | Sraith saor in aisce trí ModelScope API-Inference — cuntas Alibaba ag teastáil. | -| `monsterapi` | `monster` | MonsterAPI | Eochair API | [nasc](https://monsterapi.ai) | ⚠️ **DÍMHEASTA.** Chuir Monster API deireadh lena chuid oibríochtaí ar 2026-06-30. Úsáid soláthraithe malartacha atá comhoiriúnach le OpenAI. | -| `moonshot` | `moonshot` | Kimi | Eochair API | [nasc](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | Eochair API | [nasc](https://morphllm.com) | Sraith saor in aisce: 250K creidmheas/mí, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | Eochair API | [nasc](https://github.com/meta-llama/llama-stack) | Úsáid d’athróg timpeallachta META_API_KEY mar chomhartha Bearer. Úsáideann Muse Code CLI formáid sreinge OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | Eochair API, comhbhailitheoir | [nasc](https://naga.ac) | Faigh eochair API ag naga.ac — tá clárú le Google/GitHub/Discord ar fáil. | -| `naga-ai` | `naga-ai` | Naga AI | Eochair API, comhbhailitheoir | [nasc](https://naga.ac) | Liostaítear go poiblí na samhlacha a bhfuil :free marcáilte orthu, ach níl aon chuóta uimhriúil deimhnithe. Tugtar rabhadh i mbeartas Naga go bhféadfaí leideanna agus aschuir na sraithe saor in aisce a bhailiú nó a úsáid le haghaidh oiliúna. | -| `nanogpt` | `nanogpt` | NanoGPT | Eochair API | [nasc](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | Eochair API | [nasc](https://bynara.id) | Cruthaigh cuntas NaraRouter saor in aisce, nasc do Telegram (riachtanach roimh fhreagraí /v1), ansin greamaigh an eochair anseo mar chomhartha Bearer. | -| `navy` | `navy` | NavyAI | Eochair API | [nasc](https://api.navy) | Cruthaigh eochair API saor in aisce ó dheais NavyAI, ansin greamaigh anseo í mar chomhartha Bearer. | -| `nebius` | `nebius` | Nebius AI | Eochair API | [nasc](https://nebius.com) | ~\$1 de chreidmheasanna trialach ar chlárú le haghaidh tástáil API | -| `nlpcloud` | `nlpc` | NLP Cloud | Eochair API | [nasc](https://docs.nlpcloud.com) | Úsáid d'eochair API NLP Cloud in Authorization: Token . Díríonn OmniRoute ar an gcríochphointe chatbot ag https://api.nlpcloud.io/v1/gpu//chatbot de réir réamhshocraithe. | -| `nomic` | `nomic` | Nomic | Eochair API | [nasc](https://nomic.ai) | Faigh eochair API ag atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | Eochair API | [nasc](https://portal.nousresearch.com/help) | Úsáid d'eochair API Nous Portal. Díríonn OmniRoute ar an gcríochphointe tátail oifigiúil atá comhoiriúnach le OpenAI ag https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | Eochair API, físeán, comhbhailitheoir | [nasc](https://novita.ai) | \$0.50 de chreidmheasanna trialach ar chlárú (bailí ar feadh thart ar 1 bhliain) | -| `nscale` | `nscale` | nScale | Eochair API | [nasc](https://nscale.com) | \$5 de chreidmheasanna saor in aisce ar chlárú le haghaidh tástáil tátail | -| `nube` | `nube` | Nube.sh | Eochair API | [nasc](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | Eochair API | [nasc](https://build.nvidia.com) | Rochtain forbróra saor in aisce: ~40 RPM, 70+ samhail (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | Eochair API, fiontraíocht | [nasc](https://www.oracle.com/artificial-intelligence/generative-ai) | Úsáid d'eochair API OCI Generative AI nó comhartha iompróra IAM. Is féidir https://inference.generativeai..oci.oraclecloud.com/openai/v1/ a úsáid mar bhun-URL. | -| `ofoxai` | `ofoxai` | OfoxAI | Eochair API, comhbhailitheoir | [nasc](https://ofox.ai) | Fógraíonn an chatalóg reatha 10+ samhail saor in aisce gan chuóta uimhriúil poiblí; athbhreithnigh foinseíocht réamhtheachtach, coinneáil agus téarmaí oiliúna sula n-úsáidtear sa táirgeadh iad. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Eochair API | [nasc](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | Eochair API | [nasc](https://1min.ai) | Cruthaigh eochair API ag https://docs.1min.ai/docs/api/create-api-key, ansin greamaigh anseo í. | -| `openadapter` | `oad` | OpenAdapter | Eochair API | [nasc](https://openadapter.dev) | Úsáid d'eochair API OpenAdapter in Authorization: Bearer sk-cv-. Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | Eochair API | [nasc](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | Eochair API | [nasc](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | Eochair API | [nasc](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | Eochair API | [nasc](https://openference.com) | Plean saor in aisce: triail 3 lá le samhlacha foinse oscailte — níl cárta creidmheasa ag teastáil | -| `openrouter` | `openrouter` | OpenRouter | Eochair API, comhbhailitheoir | [nasc](https://openrouter.ai) | Samhlacha saor in aisce ar \$0/comhartha leis an iarmhír :free - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | Eochair API | [nasc](https://openvecta.com) | Creidmheasanna saor in aisce ar chlárú le haghaidh tátal atá comhoiriúnach le OpenAI thar LLManna, leabúcháin agus samhlacha réasúnaíochta | -| `opper` | `opper` | Opper | Eochair API, comhbhailitheoir | [nasc](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | Eochair API | [nasc](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | Eochair API | [nasc](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | Eochair API | [nasc](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Eochair API | [nasc](https://www.perplexity.ai) | Úsáid d'eochair API Perplexity. Seolann OmniRoute aitheantais samhlacha Agent API trí chríochphointe Perplexity atá comhoiriúnach le Responses. | -| `piapi` | `pi` | PiAPI | Eochair API, comhbhailitheoir | [nasc](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | Eochair API | [nasc](https://pioneer.ai) | \$75 de chreidmheasanna úsáide saor in aisce — níl cárta creidmheasa ag teastáil | -| `plamo` | `plamo` | PLaMo | Eochair API | [nasc](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | Eochair API, comhbhailitheoir | [nasc](https://creator.poe.com/api-reference) | Eochair API Bearer don API Poe atá comhoiriúnach le OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | Eochair API, comhbhailitheoir | [nasc](https://poixe.com) | Tá na teorainneacha poiblí saor in aisce reatha beag agus sainiúil do ghrúpaí samhlacha: 2 RPM/5 RPD do shamhlacha large-cup agus 20 RPM/50 RPD do shamhlacha small-cup. | -| `pollinations` | `pol` | Pollinations AI | Eochair API, físeán | [nasc](https://pollinations.ai) | Cuirtear rochtain anaithnid/gan eochair ar na samhlacha saora doiciméadaithe ar fáil ar bhonn na hiarrachta is fearr. Thug fíorú áitiúil v3.8.50 (2026-07-31) 401 ar ais trí OmniRoute agus Cloudflare 1010 ar thóireadóirí díreacha réamhtheachtacha ón líonra céanna. Teastaíonn eochair API Pollinations ó enter.pollinations.ai fós le haghaidh samhlacha préimhe. | -| `poolside` | `poolside` | Poolside | Eochair API | [nasc](https://poolside.ai) | Tá Laguna S 2.1 agus XS 2.1 saor in aisce le linn an Réamhamhairc; ní fhoilsítear aon chuóta uimhriúil poiblí. | -| `predibase` | `predibase` | Predibase | Eochair API | [nasc](https://predibase.com) | ⚠️ **DÍMHEASTA.** Ní réitítear serving.app.predibase.com a thuilleadh (scuabadh 2026-06-19); is cosúil gur cuireadh deireadh leis an API freastail bainistithe. | -| `publicai` | `publicai` | PublicAI | Eochair API | [nasc](https://publicai.co) | Teastaíonn eochair API — creidmheas aonuaire ar chlárú, íoctha ina dhiaidh sin | -| `qianfan` | `qianfan` | Baidu Qianfan | Eochair API | [nasc](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | eochair API | [nasc](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | eochair API | [nasc](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | eochair API | [nasc](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | eochair API, íomhá | [nasc](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | eochair API | [nasc](https://regolo.ai) | Faigh d'eochair API Regolo ó regolo.ai, ansin greamaigh anseo í mar chomhartha Bearer. | -| `reka` | `reka` | Reka | eochair API | [nasc](https://docs.reka.ai/chat/overview) | Úsáid d'eochair API Reka. Tacaíonn OmniRoute leis an mbun-URL atá comhoiriúnach le OpenAI, https://api.reka.ai/v1, agus seolann sé ceanntásca Authorization agus X-Api-Key araon ar mhaithe le comhoiriúnacht. | -| `requesty` | `requesty` | Requesty | eochair API | [nasc](https://requesty.ai) | Sraith saor in aisce ~200 iarratas/lá - geata ródaithe ilmhúnla (300+ samhail) | -| `routeway` | `routeway` | Routeway | eochair API | [nasc](https://routeway.ai) | Cruthaigh eochair API saor in aisce ag routeway.ai, ansin greamaigh anseo í mar chomhartha Bearer. | -| `runwayml` | `runway` | Runway | eochair API, físeán | [nasc](https://docs.dev.runwayml.com) | Úsáid d'eochair API Runway in Authorization: Bearer . Díríonn OmniRoute ar API reatha Runway ag https://api.dev.runwayml.com/v1 agus seolann sé an ceanntásc riachtanach X-Runway-Version go huathoibríoch. | -| `sambanova` | `samba` | SambaNova | eochair API | [nasc](https://sambanova.ai) | $5 de chreidmheasanna saor in aisce agus tú ag clárú (bailí ar feadh 30 lá), ní theastaíonn cárta creidmheasa | -| `sap` | `sap` | SAP Generative AI Hub | eochair API, fiontraíocht | [nasc](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Úsáid do chomhartha bearer SAP AI Core. Is féidir gurb é an bun-URL fréamh do AI_API_URL nó deploymentUrl ó Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | eochair API | [nasc](https://docs.sarvam.ai) | ₹1,000 de chreidmheasanna clárúcháin saor in aisce — ní théann siad in éag riamh | -| `scaleway` | `scw` | Scaleway AI | eochair API | [nasc](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M comhartha saor in aisce do chuntais nua — comhlíontach le AE/RGCS (Páras), Qwen3 235B & Llama 70B | -| `sealion` | `sealion` | SEA-LION | eochair API | [nasc](https://sea-lion.ai) | Sínigh isteach ag sea-lion.ai le Google (ní theastaíonn cárta, níl aon bhac réigiúin ann), cruthaigh eochair API, ansin greamaigh anseo í. | -| `seekai` | `ska` | SeekAi | eochair API, comhbhailitheoir | [nasc](https://seekai.cc) | Cruthaigh eochair API ag https://seekai.cc, ansin greamaigh anseo í mar chomhartha Bearer. | -| `segmind` | `segmind` | Segmind | eochair API, íomhá, físeán | [nasc](https://segmind.com) | Úsáid d'eochair API Segmind sa cheanntásc x-api-key. Díríonn OmniRoute ar https://api.segmind.com/v1/ agus seolann sé bearta na híomhá/an fhíseáin ginte ar ais go díreach. | -| `sensenova` | `sensenova` | SenseNova | eochair API | [nasc](https://platform.sensenova.cn) | Faigh eochair API ag platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | eochair API | [nasc](https://cloud.siliconflow.com) | $1 de chreidmheasanna saor in aisce, chomh maith le samhlacha $0 atá liostaithe faoi láthair tar éis fíorú aitheantais; d'fhéadfadh infhaighteacht agus teorainneacha athrú | -| `snowflake` | `snowflake` | Snowflake Cortex | eochair API, fiontraíocht | [nasc](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | eochair API | [nasc](https://xinghuo.xfyun.cn) | Faigh eochair API ag console.xfyun.cn | -| `speka` | `speka` | Speka AI | eochair API, comhbhailitheoir | [nasc](https://speka.me) | Plean saor in aisce: $1 d'úsáid mhíosúil, 10 RPM, eochair API amháin agus rochtain ar shamhlacha oscailte agus ar an gclós súgartha; ní theastaíonn cárta. | -| `stability-ai` | `stability` | Stability AI | eochair API, íomhá | [nasc](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | eochair API | [nasc](https://stepfun.com) | Faigh eochair API ag platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | eochair API | [nasc](https://ai.sumopod.com) | Úsáid d'eochair API SumoPod (sk-...) in Authorization: Bearer . Go hiomlán comhoiriúnach le OpenAI. Bun-URL an API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | eochair API | [nasc](https://suno.ai) | Greamaigh fianán an tseisiúin ó suno.ai (fíordheimhniú Clerk) | -| `synthetic` | `synthetic` | Synthetic | eochair API, comhbhailitheoir | [nasc](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | eochair API, comhbhailitheoir | [nasc](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | eochair API | [nasc](https://hunyuan.tencent.com) | Faigh eochair API ag console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | eochair API, comhbhailitheoir | [nasc](https://theb.ai) | Eochair API Bearer do gheata TheB.AI atá comhoiriúnach le OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | eochair API | [nasc](https://docs.tinyfish.ai/fetch-api) | X-API-Key ó agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | eochair API, físeán | [nasc](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | eochair API | [nasc](https://agent-router.gaib.ai) | Úsáid d'eochair API Token Kiosk in Authorization: Bearer . Geata atá go hiomlán comhoiriúnach le OpenAI. Bun-URL an API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | eochair API, comhbhailitheoir | [nasc](https://www.tokenreply.com) | Tá teorainneacha laethúla a bhaineann go sonrach le samhlacha agus feachtais ag samhlacha a bhfuil an chlib saor in aisce orthu; ní fhoilsítear aon chuóta domhanda seasta saor in aisce. | -| `tokenrouter` | `trk` | TokenRouter | eochair API | [nasc](https://tokenrouter.com) | Úsáid d'eochair API TokenRouter in Authorization: Bearer . Go hiomlán comhoiriúnach le OpenAI. Bun-URL an API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | eochair API, íomhá | [nasc](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | eochair API | [nasc](https://docs.opentyphoon.ai) | Eochair API saor in aisce le teorainn ráta 5 iarratas/s agus 200 iarratas/nóim. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Eochair API | [nasc](https://uncensored.com) | Úsáid d’eochair API Forbróra uncensored.com (uai_sk_live_...). Seolann OmniRoute í mar an ceanntásc X-api-key chuig an gcríochphointe https://api.uncensored.com/api/v1 atá comhoiriúnach le OpenAI. Ní théann an eochair in éag riamh. Seo é an comhéadan méadraithe/creidmheasanna; is é an soláthraí ar leith ‘uc’ an comhrá síntiúis neamh-mhéadraithe. | -| `udio` | `udio` | Udio | Eochair API | [nasc](https://udio.com) | Greamaigh fianán seisiúin ó udio.com (fíordheimhniú Supabase) | -| `unorouter` | `unorouter` | UnoRouter | Eochair API, comhbhailitheoir | [nasc](https://unorouter.ai) | Ní bhaintear aon mhéid den iarmhéid i gcás samhlacha a bhfuil an iarmhír :free orthu; is é an teorainn 1 iarratas/nóiméad in aghaidh na samhla saor in aisce, in aghaidh an úsáideora. | -| `upstage` | `upstage` | Upstage | Eochair API | [nasc](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | Eochair API | [nasc](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | Eochair API | [nasc](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Eochair API, comhbhailitheoir | [nasc](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | Eochair API, fiontraíocht | [nasc](https://cloud.google.com/vertex-ai) | Cuir JSON Cuntais Seirbhíse, comhartha rochtana OAuth, eochair API Vertex Express, nó eochair údaraithe atá ceangailte le cuntas seirbhíse ar fáil. Ní thacaíonn mód Express ach le Gemini; teastaíonn dintiúir atá scóipithe don tionscadal ó shamhlacha comhpháirtíochta. | -| `vertex-partner` | `vp` | Vertex AI Partners | Eochair API, fiontraíocht | [nasc](https://cloud.google.com/vertex-ai) | Cuir JSON Cuntais Seirbhíse nó dintiúir OAuth ar fáil. Tacaíonn eochair údaraithe atá ceangailte le cuntas seirbhíse le fionnachtain freisin, ach teastaíonn ID a thionscadail Google Cloud ó thátal comhpháirtíochta chomh maith. Ní thacaíonn eochracha caighdeánacha Express ach le Gemini. | -| `void-ai` | `void-ai` | Void AI | Eochair API, comhbhailitheoir | [nasc](https://voidai.app) | Marcálann catalóg phoiblí na samhlacha roinnt samhlacha mar chinn a dteastaíonn plean saor in aisce uathu, ach tá an rochtain coinníollach agus níl aon chuóta uimhriúil deimhnithe. | -| `volcengine` | `volcengine` | Volcengine | Eochair API | [nasc](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Eochair API | [nasc](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Ceangail do chuntas Volcano Engine nó úsáid eochair API síntiúis Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Eochair API | [nasc](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Ceangail do chuntas Volcano Engine nó úsáid eochair API síntiúis Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | Eochair API, leabú/athrangú | [nasc](https://www.voyageai.com) | Eochair API Bearer le haghaidh APIanna leabaithe agus athrangaithe Voyage AI. | -| `wafer` | `wafer` | Wafer AI | Eochair API | [nasc](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | Eochair API | [nasc](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Eochair API, fiontraíocht | [nasc](https://www.ibm.com/products/watsonx-ai) | Úsáid do chomhartha bearer watsonx. Is féidir https://.ml.cloud.ibm.com/ml/gateway/v1/ nó críochphointe /ml/gateway/v1 féinbhainistithe a úsáid mar an bun-URL. | -| `writer` | `writer` | Writer | Eochair API | [nasc](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | Eochair API | [nasc](https://x5lab.dev) | Úsáid d’eochair API X5Lab (x5-...) in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | Eochair API | [nasc](https://x.ai) | Úsáid eochair oifigiúil API xAI, nó sínigh isteach le xAI OAuth. Is soláthraí ar leith fós iad seisiúin JWT Grok Build. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Eochair API | [nasc](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Eochair API | [nasc](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | Eochair API, comhbhailitheoir | [nasc](https://xkiro.com) | Cruthaigh cuntas saor in aisce ag xkiro.com agus greamaigh an eochair anseo (Bearer; glactar le x-api-key freisin). | -| `yi` | `yi` | Yi (01.AI) | Eochair API | [nasc](https://01.ai) | Faigh eochair API ag platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | Eochair API, comhbhailitheoir | [nasc](https://yolo-auto.com) | Tá teorainn le hiarratais ar rochtain API saor in aisce agus tá sí beartaithe le haghaidh tástála; ní fhoilsítear aon chuóta uimhriúil laethúil agus ní ghealltar rochtain saor in aisce go deo. | -| `zai` | `zai` | Z.AI | Eochair API | [nasc](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | Eochair API | [nasc](https://zenmux.ai) | Úsáid d’eochair API ZenMux in Authorization: Bearer . Tá ZenMux comhoiriúnach go hiomlán le OpenAI. Bun-URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Eochair API, comhbhailitheoir | [nasc](https://www.zerolimitai.com) | Fógraítear triail shealadach saor in aisce, ach tá na leathanaigh oifigiúla ag teacht salach ar a chéile maidir le 3 lá nó 7 lá; ní mheastar éileamh 100 glao/lá a bheith buan. | -| `zylo-api` | `zylo` | Zylo API | Eochair API, comhbhailitheoir | [nasc](https://zyloai.net) | Plean Basic: 10 RPM, 7,200 iarratas/lá agus 200,000 comhartha/lá; teoranta do shamhlacha téacs Basic. | +## Soláthraithe Eochracha API (íoctha / íoctha-le-creidmheasanna-saor-in-aisce) (242) + +| Aitheantas | Ailias | Ainm | Clibeanna | Suíomh gréasáin | Nótaí | +| ------------------------ | --------------- | ------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `360ai` | `360ai` | 360 AI | Eochair API | [nasc](https://ai.360.cn) | Faigh eochair API ag ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | Eochair API, comhbhailitheoir | [nasc](https://agentrouter.org) | $200 de chreidmheasanna saor in aisce ar chlárú - geata ródaithe ilmhúnla | +| `agnes` | `agnes` | Agnes AI | Eochair API, físeán | [nasc](https://agnes-ai.com) | Faigh eochair API ag agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (An tSín) | Eochair API | [nasc](https://api.agnes-ai.cn) | Faigh eochair API ó shuíomh Agnes CN. | +| `ai21` | `ai21` | AI21 Labs | Eochair API | [nasc](https://www.ai21.com) | $10 de chreidmheasanna trialach ar chlárú (bailí ar feadh 3 mhí), níl cárta creidmheasa ag teastáil | +| `aimlapi` | `aiml` | AI/ML API | Eochair API, comhbhailitheoir | [nasc](https://aimlapi.com) | Sraith saor in aisce curtha ar sos (2026) — níl AI/ML API ar fáil anois ach ar bhonn íoc de réir úsáide (breisiú íosta $20); níl aon chreidmheasanna saor in aisce athfhillteacha ann. | +| `ainative` | `ainative` | AINative Studio | Eochair API | [nasc](https://ainative.studio) | Cruthaigh eochair API saor in aisce ag ainative.studio (gan chárta), ansin greamaigh anseo í mar chomhartha Bearer. | +| `aion` | `aion` | Aion Labs | Eochair API | [nasc](https://www.aionlabs.ai) | Cruthaigh eochair API saor in aisce ag aionlabs.ai (gan chárta), ansin greamaigh anseo í mar chomhartha Bearer. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | Eochair API | [nasc](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (An tSín) | Eochair API | [nasc](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Eochair API | [nasc](https://developer.ant-ling.com/en/docs/) | Cláraigh agus cruthaigh eochair API i gconsól API Ant Ling (https://chat.ant-ling.com/open), ansin greamaigh anseo í. Ródálann OmniRoute trácht comhrá chuig https://api.ant-ling.com/v1/chat/completions; tá an soláthraí comhoiriúnach le OpenAI agus cuireann sé comhéadan atá comhoiriúnach le Anthropic ar fáil freisin. | +| `anthropic` | `anthropic` | Anthropic | Eochair API | [nasc](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | Eochair API, comhbhailitheoir | [nasc](https://anyapi.ai) | Plean saor in aisce: 100,000 ANY Tokens/lá agus 100 RPM do mhúnlaí incháilithe Free/Basic; níl cárta creidmheasa ag teastáil. | +| `api-airforce` | `af` | Api.airforce | Eochair API | [nasc](https://api.airforce) | 55 mhúnla sa tsraith saor in aisce, lena n-áirítear Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | Eochair API | [nasc](https://arcee.ai) | Faigh eochair API ag arcee.ai | +| `auriko` | `auriko` | Auriko | Eochair API, comhbhailitheoir | [nasc](https://www.auriko.ai) | Fógraíonn an plean saor in aisce 1,000 RPM Ardáin agus 10,000 RPM BYOK. Téann tátal ardáin trí chostas an tsoláthraí fós; ní linn comharthaí saor in aisce ná tátal saor in aisce gan teorainn é seo. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | Eochair API, fiontraíocht | [nasc](https://learn.microsoft.com/azure/ai-foundry) | Úsáid d'eochair Azure AI Foundry. Is féidir https://.services.ai.azure.com/openai/v1/ nó https://.openai.azure.com/openai/v1/ a úsáid mar an bun-URL. | +| `azure-openai` | `azure` | Azure OpenAI | Eochair API, fiontraíocht | [nasc](https://azure.microsoft.com/products/ai-services/openai-service) | Úsáid d'eochair API Azure OpenAI. Ba cheart gurb é críochphointe d'acmhainne an bun-URL, mar shampla https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | Eochair API | [nasc](https://b.ai) | Eochair API Bearer do gheata LLM b.ai atá comhoiriúnach le OpenAI (atá éagsúil le TheB.AI). Cruthaigh eochair ag https://docs.b.ai, ansin úsáid https://api.b.ai/v1 mar an bun-URL atá comhoiriúnach le OpenAI. | +| `baichuan` | `baichuan` | Baichuan | Eochair API | [nasc](https://www.baichuan-ai.com/) | Faigh eochair API ag platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | Eochair API | [nasc](https://ernie.baidu.com/) | Faigh eochair API ag console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Eochair API | [nasc](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | Eochair API | [nasc](https://baseten.co) | $30 de chreidmheasanna trialach saor in aisce le haghaidh tátal GPU | +| `bazaarlink` | `bzl` | BazaarLink | Eochair API | [nasc](https://bazaarlink.ai) | Úsáid d'eochair API BazaarLink (tosaíonn sí le sk-bl-) in Authorization: Bearer . Oibríonn OpenAI SDK leis an mbun-URL https://bazaarlink.ai/api/v1. Úsáideann múnlaí an fhormáid soláthraí/ainm-múnla. | +| `bedrock` | `bedrock` | Amazon Bedrock | Eochair API, fiontraíocht | [nasc](https://aws.amazon.com/bedrock) | Úsáid d'eochair API Amazon Bedrock agus cumraigh an réigiún AWS ina bhfuil do mhúnlaí cumasaithe (mar shampla eu-west-2). Glaonn OmniRoute API dúchasach Converse de chuid Bedrock go díreach. | +| `black-forest-labs` | `bfl` | Black Forest Labs | Eochair API, íomhá | [nasc](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | Eochair API | [nasc](https://blackbox.ai) | ⚠️ **DÍMHEASTA.** Tugann api.blackbox.ai HTTP 404 ar ais ar gach malairt conair (scuabadh 2026-08-21); aistríodh an comhéadan tátail poiblí chuig an gcríochphointe srianta enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | Eochair API | [nasc](https://www.bluesminds.com) | Creidmheasanna pi laethúla saor in aisce — tacaíonn sé le breis agus 200 múnla, lena n-áirítear GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | Eochair API | [nasc](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | Eochair API | [nasc](https://bytez.com) | $1 de chreidmheasanna saor in aisce, athnuachana gach 4 seachtaine | +| `cerebras` | `cerebras` | Cerebras | Eochair API | [nasc](https://inference.cerebras.ai) | Creidmheas cláraithe aonuaire $5 (bailí ar feadh 30 lá); tá modh íocaíochta ag teastáil. Ní sraith saor in aisce athfhillteach é. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | Eochair API | [nasc](https://hyper.charm.land) | 100 Hypercredits mhíosúla saor in aisce ar chlárú | +| `chat-oripe` | `chat-oripe` | Chat Oripe | Eochair API, comhbhailitheoir | [nasc](https://api.oriper.com) | Fógraíonn na meiteashonraí oifigiúla 2M comhartha/mí, ach bhí an suíomh poiblí agus an doiciméadacht blocáilte le linn an iniúchta; caith leis an gcuóta agus leis an mapáil branda mar nithe neamhdheimhnithe. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | Eochair API, comhbhailitheoir | [nasc](https://chatanywhere.tech) | Le haghaidh úsáid phearsanta, oideachasúil nó taighde amháin: luaitear sa doiciméadacht phoiblí 10,000 pointe/lá agus 200 iarratas/lá in aghaidh an IP/na heochrach; ná húsáid le haghaidh tráchta tráchtála. | +| `cheaperinference` | `cinf` | Cheaper Inference | Eochair API | [nasc](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | Eochair API | [nasc](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | Eochair API, comhbhailitheoir | [nasc](https://chutes.ai) | Eochair API Bearer do gheata Chutes atá comhoiriúnach le OpenAI. | +| `clarifai` | `clarifai` | Clarifai | Eochair API, fiontraíocht | [nasc](https://docs.clarifai.com) | Úsáid do PAT Clarifai nó eochair API a bhaineann go sonrach le feidhmchlár. Díríonn OmniRoute ar an gcríochphointe atá comhoiriúnach le OpenAI ag https://api.clarifai.com/v2/ext/openai/v1 agus fíordheimhníonn sé le Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Eochair API, comhbhailitheoir | [nasc](https://cloudcode.one) | Áirítear glm-4.7-flash agus glm-4.6v-flash ar na samhlacha saor in aisce foilsithe; ní fhoilsítear aon chuóta uimhriúil, agus d’fhéadfadh creidmheas nó cúpón a bheith riachtanach chun eochair a chruthú. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Eochair API | [nasc](https://developers.cloudflare.com/workers-ai) | Teastaíonn API Token AGUS Account ID (atá le fáil ag dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | Eochair API | [nasc](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | Eochair API | [nasc](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | Eochair API | [nasc](https://cohere.com) | Triail In Aisce: 1,000 glao API/mí le haghaidh tástála, gan cárta creidmheasa a bheith riachtanach | +| `command-code` | `cmd` | Command Code | Eochair API | [nasc](https://commandcode.ai/) | Úsáid eochair API Command Code. Seoltar iarratais chuig críochphointe /provider/v1/chat/completions de chuid Command Code. | +| `coze` | `coze` | Coze | Eochair API | [nasc](https://coze.com) | Faigh eochair API ag coze.com/open/api | +| `crof` | `crof` | CrofAI | Eochair API | [nasc](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | Eochair API | [nasc](https://cursor.com/dashboard/api) | Greamaigh eochair API úsáideora Cursor (crsr_...) ó cursor.com/dashboard/api. Malartaíonn OmniRoute í ar chomhartha seisiúin de réir mar is gá; ní gá IDE ná cursor-agent a shuiteáil. Gearrtar an úsáid ar an bplean Cursor ar leis an eochair. | +| `dahl` | `dahl` | Dahl | Eochair API | [nasc](https://inference.dahl.global) | Cliceáil 'Add Account' chun comhartha a ghiniúint go huathoibríoch, nó cuir eochair API de láimh leis. | +| `databricks` | `databricks` | Databricks | Eochair API, fiontraíocht | [nasc](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | Eochair API, fiontraíocht | [nasc](https://docs.datarobot.com) | Úsáid do chomhartha API DataRobot. Is féidir leis an Base URL roghnach a bheith ina fhréamh cuntais (le haghaidh LLM Gateway) nó ina URL imlonnaithe faoi /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | Eochair API, íomhá | [nasc](https://deepai.org) | Úsáid d’eochair API DeepAI. Faigh ceann ag deepai.org — teastaíonn síntiús Pro ($9.99/mí). | +| `deepinfra` | `deepinfra` | DeepInfra | Eochair API | [nasc](https://deepinfra.com) | Creidmheasanna clárúcháin saor in aisce le haghaidh tástáil API agus iniúchadh samhlacha | +| `deepseek` | `ds` | DeepSeek | Eochair API | [nasc](https://platform.deepseek.com) | 5M comhartha saor in aisce ar chlárú - gan cárta creidmheasa a bheith riachtanach | +| `dgrid` | `dgrid` | DGrid | Eochair API | [nasc](https://dgrid.ai) | Ródaire Samhlacha Saor in Aisce DGrid: 10 n-iarratas/nóiméad agus 100 iarratas/lá. Díghlasálann breisiú aonuaire $5 suas le 20 iarratas/nóiméad agus 1,000 iarratas/lá. | +| `dify` | `dify` | Dify | Eochair API | [nasc](https://dify.ai) | Faigh eochair API ó d’ásc Dify. | +| `digitalocean` | `digitalocean` | DigitalOcean | Eochair API | [nasc](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | Eochair API | [nasc](https://dit.ai) | Úsáid d’eochair API dit.ai in Authorization: Bearer . Tá sé comhoiriúnach go hiomlán le OpenAI — ionadaí is féidir a chur ina áit go díreach; níl le déanamh ach an bun-URL a athrú go https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | Eochair API | [nasc](https://doubao.com) | Faigh eochair API ag console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | Eochair API, comhbhailitheoir | [nasc](https://www.dxnt.com) | De réir na doiciméadachta, faigheann cuntais saor in aisce 100 glao/lá; d’fhéadfadh an cuóta méadú trí chuirí agus d’fhéadfadh sé a bheith éagsúil de réir cuntais. | +| `electronhub` | `electronhub` | Electron Hub | Eochair API, comhbhailitheoir | [nasc](https://www.electronhub.ai) | Plean saor in aisce: 5 RPM, creidmheasanna seachtainiúla $0.25 agus 10 Neutrinos/lá do shamhlacha :free; tá feidhm ag buiséid teaghlaigh freisin. | +| `empower` | `empower` | Empower | Eochair API, comhbhailitheoir | [nasc](https://docs.empower.dev) | Eochair API Bearer do chríochphointe Empower atá comhoiriúnach le OpenAI. | +| `eurouter` | `eurouter` | EURouter | Eochair API, comhbhailitheoir | [nasc](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | Eochair API | [nasc](https://factory.ai) | Eochair API Bearer do gheata Factory atá comhoiriúnach le OpenAI. | +| `fal-ai` | `fal` | Fal.ai | Eochair API, íomhá | [nasc](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | Eochair API, comhbhailitheoir | [nasc](https://fastrouter.ai) | Ceadaíonn samhlacha leis an iarmhír :free 10 n-iarratas/lá in aghaidh na heagraíochta agus na samhla; d’fhéadfadh an infhaighteacht athrú. | +| `featherless-ai` | `featherless` | Featherless AI | Eochair API | [nasc](https://featherless.ai) | Sraith saor in aisce ar fáil — gan cárta creidmheasa a bheith riachtanach | +| `fenayai` | `fenayai` | FenayAI | Eochair API, comhbhailitheoir | [nasc](https://fenayai.com) | Eochair API Bearer do gheata FenayAI atá comhoiriúnach le OpenAI. | +| `fireworks` | `fireworks` | Fireworks AI | Eochair API | [nasc](https://fireworks.ai) | $1 de chreidmheasanna tosaithe saor in aisce ar chlárú le haghaidh tástáil API | +| `free-ai` | `free-ai` | Free.ai | Eochair API, comhbhailitheoir | [nasc](https://free.ai) | Clúdaíonn 30,000 comhartha/lá samhlacha féinóstáilte tar éis fíorú ríomhphoist. Is féidir úsáid os cionn an chomhthiomsaithe a ghearradh ar amhchostas, agus tá samhlacha seachtracha préimhe íoctha. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | Eochair API | [nasc](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | Eochair API | [nasc](https://freebuff.com) | Cuir isteach Comhartha Fíordheimhnithe Freebuff / Codebuff (a fhaightear trí logáil isteach CLI nó trí bhailitheoir uathoibrithe). | +| `freeinference` | `freeinference` | FreeInference | Eochair API, comhbhailitheoir | [nasc](https://freeinference.org) | Rochtain taighde saor in aisce gan chárta; teastaíonn faomhadh láimhe ó iarratasóirí nach mbaineann le Harvard agus ní ráthaítear aon chuóta uimhriúil go poiblí. | +| `freemodel-dev` | `fmd` | FreeModel.dev | Eochair API | [nasc](https://freemodel.dev) | $300 de chreidmheasanna saor in aisce agus tú ag clárú — níl cárta creidmheasa ag teastáil. Faigh rochtain ar GPT-5.4 agus GPT-5.5 (na samhlacha suaitheanta is déanaí de chuid OpenAI) trí API atá comhoiriúnach le OpenAI. | +| `freetheai` | `fta` | FreeTheAi | Eochair API, comhbhailitheoir | [nasc](https://freetheai.xyz) | Glac páirt i Discord FreeTheAi chun d'eochair API saor in aisce a fháil. | +| `friendliai` | `friendli` | FriendliAI | Eochair API | [nasc](https://friendli.ai) | Sraith saor in aisce le haghaidh tátail gan fhreastalaí — níl cárta creidmheasa ag teastáil | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Eochair API, comhbhailitheoir | [nasc](https://g4f.space) | Bácáil creidmheasanna cáca gan ainm ag g4f.dev/chat, nó úsáid eochair bhaill g4f.dev (cruthaigh ceann ag g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | Eochair API | [nasc](https://galadriel.com) | ⚠️ **DÍMHEASTA.** Ní dhéantar api.galadriel.ai a réiteach a thuilleadh (scuabadh 2026-06-19); is cosúil gur scoireadh den API tátail. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | Eochair API | [nasc](https://aistudio.google.com) | Tá sraith saor in aisce ar fáil trí Google AI Studio; tá cuótaí reatha de réir samhla agus teorainneacha réigiúnacha i bhfeidhm | +| `getgoapi` | `ggo` | GoAPI | Eochair API, comhbhailitheoir | [nasc](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | Eochair API | [nasc](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | Eochair API | [nasc](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Comhartha rochtana pearsanta GitLab don API poiblí Code Suggestions. Cumraigh bun-URL féinóstáilte nuair nach bhfuil gitlab.com á úsáid. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Eochair API | [nasc](https://opengateway.gitlawb.com) | Cúlghaireadh MiMo saor in aisce (xiaomi/mimo-v2.5) in 2026-05 — is geata creidmheasa íoc-mar-a-úsáidtear é Opengateway anois; níl aon samhail athfhillteach saor in aisce ann. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Eochair API | [nasc](https://opengateway.gitlawb.com) | Tháinig deireadh le cur chun cinn Nemotron saor in aisce in 2026-06 — níl bealach GMI Cloud ar fáil anois ach trí chreidmheas íoc-mar-a-úsáidtear. | +| `glm` | `glm` | GLM Coding | Eochair API | [nasc](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (an tSín) | Eochair API | [nasc](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | Eochair API | [nasc](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | Eochair API | [nasc](https://greenpt.com) | Is féidir síntiús API a chruthú saor in aisce; gearrtar táille de réir comhartha ar thátal. Ní fhoilsítear aon lamháltas tátail saor in aisce. | +| `groq` | `groq` | Groq | Eochair API | [nasc](https://groq.com) | Plean saor in aisce: uasteorainneacha de réir samhla (200K comhartha/lá in aghaidh na samhla comhrá; féach console.groq.com/docs/rate-limits le haghaidh RPM/RPD) — níl aon mhodh íocaíochta ar comhad. | +| `haiper` | `hp` | Haiper | Eochair API, físeán | [nasc](https://haiper.ai) | Faigh eochair API ag haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | Eochair API | [nasc](https://api.hcnsec.cn) | Faigh eochair API ag api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | Eochair API, comhbhailitheoir | [nasc](https://helixmind.online) | Níor deimhníodh na héilimh a scaipeadh roimhe seo maidir le 3 RPM/50 RPD agus gan aon chárta le linn iniúchadh 2026-08-02; teastaíonn fíorú cuntais chun an cuóta agus an billeáil reatha a dheimhniú. | +| `helyxai` | `helyxai` | Helyx AI | Eochair API, comhbhailitheoir | [nasc](https://helyxai.space) | Sonraítear 100,000 comhartha/lá i ndoiciméid an phlean Shaor in Aisce atá i bhfeidhm; tagann éileamh margaíochta ar leith an tsuímh de 2M+ salach air agus ní ghlactar leis mar ráthaíocht chuóta. | +| `heroku` | `heroku` | Heroku AI | Eochair API, fiontar | [nasc](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | Eochair API | [nasc](https://huggingface.co) | API Tátail saor in aisce do na mílte samhail (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | Eochair API | [nasc](https://hyperbolic.xyz) | $1-5 de chreidmheasanna trialach agus tú ag clárú le haghaidh tátail gan fhreastalaí | +| `ideogram` | `ideo` | Ideogram | Eochair API | [nasc](https://ideogram.ai) | Faigh eochair API ag ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | Eochair API | [nasc](https://xinghuo.xfyun.cn) | Faigh eochair API ag console.xfyun.cn | +| `inception` | `inception` | Inception | Eochair API | [nasc](https://docs.inceptionlabs.ai) | 10M comhartha saor in aisce agus tú ag clárú, níl cárta creidmheasa ag teastáil. | +| `inference-net` | `inet` | Inference.net | Eochair API | [nasc](https://inference.net) | $25 de chreidmheasanna saor in aisce agus tú ag clárú, agus deontais taighde ar fáil freisin | +| `internlm` | `internlm` | InternLM (Intern-S1) | Eochair API | [nasc](https://internlm.intern-ai.org.cn/) | Cuóta míosúil saor in aisce ~1M comhartha ionchuir / 3M comhartha aschuir (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | Eochair API, leabú/athrangú | [nasc](https://jina.ai) | Eochair API Bearer le haghaidh api.jina.ai — leabuithe, athrangú, aicmiú, deighilt agus cuardach. Tugtar tús áite d’eochracha an deais ar JINA_AI_API_KEY. Ní hé seo an cárta Reader / r.jina.ai agus ní dhéanann sé URLanna a aisghabháil. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Eochair API | [nasc](https://jina.ai/reader) | Eochair API Bearer le haghaidh tiontú URL-go-markdown r.jina.ai (/v1/web/fetch amháin). Ní sholáthraíonn sé /v1/embeddings ná /v1/rerank. Oibríonn an comhartha Jina céanna agus a úsáidtear le Foundation API; athúsáideann OmniRoute eochair deaise jina-ai nó JINA_AI_API_KEY nuair atá an cárta seo folamh. | +| `kenari` | `kenari` | Kenari | Eochair API | [nasc](https://kenari.id) | Úsáid d’eochair API Kenari (kn-...) in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | Eochair API | [nasc](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | Eochair API, comhbhailitheoir | [nasc](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | Eochair API | [nasc](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | Eochair API | [nasc](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | Eochair API | [nasc](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | Eochair API, comhbhailitheoir | [nasc](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | Eochair API, físeán | [nasc](https://leonardo.ai) | Faigh eochair API ag leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | Eochair API | [nasc](https://liquid.ai) | Faigh eochair API ag liquid.ai | +| `literouter` | `literouter` | LiteRouter | Eochair API, comhbhailitheoir | [nasc](https://literouter.com) | Úsáideann malairtí saor in aisce de shamhlacha an iarmhír :free; athraíonn na teorainneacha creidmheasa laethúla de réir samhla agus tá ionchur saor in aisce teoranta do 5,000 comhartha. | +| `llamagate` | `llamagate` | LlamaGate | Eochair API | [nasc](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Eochair API, comhbhailitheoir | [nasc](https://llm.kiwi) | Cuireann an plean saor in aisce auto agus hrLLM ar fáil; baineann an teorainn fhoilsithe de 40 iarratas/uair an chloig le hrLLM. | +| `llm7` | `llm7` | LLM7.io | Eochair API | [nasc](https://llm7.io) | Úsáid aon eochair nach bhfuil folamh (mar shampla 'unused'). Má fhilleann samhlacha ionsuite níos sine model_unavailable, úsáid Available Models → Import from /models nó Auto-Sync; samhail bheo fhíoraithe: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | Eochair API, comhbhailitheoir | [nasc](https://llmgateway.io) | Plean Saor in Aisce óstáilte: tá samhlacha ar phraghas saor in aisce teoranta do 5 iarratas in aghaidh gach 10 nóiméad nuair nach bhfuil aon chreidmheasanna sa chuntas. | +| `logfare` | `logfare` | Logfare | Eochair API, comhbhailitheoir | [nasc](https://logfare.ai) | Cruthaigh cuntas saor in aisce ag https://logfare.ai/register (ainm úsáideora/focal faire, gan fíorú ríomhphoist) chun eochair API a fháil láithreach, ansin greamaigh anseo í mar chomhartha Bearer. | +| `longcat` | `lc` | LongCat AI | Eochair API | [nasc](https://longcat.chat/platform/docs) | Saor in aisce: deontas aonuaire de 10M comhartha tar éis clárú cuntais + fíorú KYC (LongCat-2.0). Aon uair amháin — ní liúntas athfhillteach laethúil/míosúil é. | +| `magnific` | `freepik` | Magnific | Eochair API, íomhá | [nasc](https://www.magnific.com) | Faigh eochair API ag magnific.com/user/api-keys (ceanntásc x-magnific-api-key). Oibríonn eochracha forbróra oidhreachta Freepik fós. | +| `maritalk` | `maritalk` | Maritalk | Eochair API | [nasc](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | Eochair API, comhbhailitheoir | [nasc](https://meganova.ai) | Clárú saor in aisce gan chárta. Is é 550 iarratas/lá iomlán na gcuótaí foilsithe Tier 1 in aghaidh na samhla; ní comhthiomsú domhanda iad, agus féadfar formhuirear íoctha a chur i bhfeidhm má tá sé cumasaithe. | +| `meta-llama` | `meta` | Meta Llama API | Eochair API | [nasc](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | Eochair API, físeán | [nasc](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (China) | Eochair API | [nasc](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | Eochair API | [nasc](https://mistral.ai) | Sraith Experiment saor in aisce: rochtain theoranta de réir ráta ar gach samhail, ní theastaíonn cárta creidmheasa | +| `mixedbread` | `mxbai` | Mixedbread AI | Eochair API | [nasc](https://www.mixedbread.com) | Eochair API Bearer le haghaidh API leabuithe Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | Eochair API, comhbhailitheoir | [nasc](https://www.mixlayer.com) | Tá an tsamhail qwen/qwen3.5-4b-free saor in aisce le haghaidh fréamhshamhaltaithe agus teoranta de réir ráta; níl aon RPM poiblí seasta ná cuóta laethúil deimhnithe. | +| `mnn-ai` | `mnn-ai` | MNN AI | Eochair API, comhbhailitheoir | [nasc](https://mnnai.ru) | Plean saor in aisce: $1 de chreidmheasanna míosúla, 10 RPM agus rochtain ar shamhlacha marcáilte Free amháin. | +| `modal` | `mdl` | Modal | Eochair API, fiontar | [nasc](https://modal.com/docs) | Úsáid an comhartha Bearer a chosnaíonn d’imscaradh Modal, má tá sé cumasaithe. Ba cheart don bhun-URL díriú ar d’aip Modal atá comhoiriúnach le OpenAI, mar shampla https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | Eochair API | [nasc](https://modelscope.cn) | Sraith saor in aisce trí ModelScope API-Inference — tá cuntas Alibaba riachtanach. | +| `monsterapi` | `monster` | MonsterAPI | Eochair API | [nasc](https://monsterapi.ai) | ⚠️ **DÍMHEASTA.** Chuir Monster API deireadh lena chuid oibríochtaí ar 2026-06-30. Úsáid soláthraithe malartacha atá comhoiriúnach le OpenAI. | +| `moonshot` | `moonshot` | Kimi | Eochair API | [nasc](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | Eochair API | [nasc](https://morphllm.com) | Sraith saor in aisce: 250K creidmheas/mí, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | Eochair API | [nasc](https://github.com/meta-llama/llama-stack) | Úsáid d’athróg timpeallachta META_API_KEY mar chomhartha Bearer. Úsáideann Muse Code CLI formáid sreinge OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | Eochair API, comhbhailitheoir | [nasc](https://naga.ac) | Faigh eochair API ag naga.ac — tá clárú trí Google/GitHub/Discord ar fáil. | +| `naga-ai` | `naga-ai` | Naga AI | Eochair API, comhbhailitheoir | [nasc](https://naga.ac) | Tá na samhlacha marcáilte :free liostaithe go poiblí, ach níl aon chuóta uimhriúil deimhnithe. Tugann beartas Naga rabhadh go bhféadfaí leideanna agus aschuir na sraithe saoire a bhailiú nó a úsáid le haghaidh oiliúna. | +| `nanogpt` | `nanogpt` | NanoGPT | Eochair API | [nasc](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | Eochair API | [nasc](https://bynara.id) | Cruthaigh cuntas NaraRouter saor in aisce, nasc do Telegram (riachtanach roimh fhreagraí /v1), ansin greamaigh an eochair anseo mar chomhartha Bearer. | +| `navy` | `navy` | NavyAI | Eochair API | [nasc](https://api.navy) | Cruthaigh eochair API saor in aisce ó dheais NavyAI, ansin greamaigh anseo í mar chomhartha Bearer. | +| `nebius` | `nebius` | Nebius AI | Eochair API | [nasc](https://nebius.com) | Creidmheasanna trialach de ~$1 nuair a chláraítear le haghaidh tástáil API | +| `nlpcloud` | `nlpc` | NLP Cloud | Eochair API | [nasc](https://docs.nlpcloud.com) | Úsáid d'eochair API NLP Cloud in Authorization: Token . Díríonn OmniRoute ar chríochphointe an bhota comhrá ag https://api.nlpcloud.io/v1/gpu//chatbot de réir réamhshocraithe. | +| `nomic` | `nomic` | Nomic | Eochair API | [nasc](https://nomic.ai) | Faigh eochair API ag atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | Eochair API | [nasc](https://portal.nousresearch.com/help) | Úsáid d'eochair API Nous Portal. Díríonn OmniRoute ar an gcríochphointe oifigiúil tátail atá comhoiriúnach le OpenAI ag https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | Eochair API, físeán, comhbhailitheoir | [nasc](https://novita.ai) | Creidmheasanna trialach de $0.50 nuair a chláraítear (bailí ar feadh thart ar 1 bhliain) | +| `nscale` | `nscale` | nScale | Eochair API | [nasc](https://nscale.com) | Creidmheasanna saor in aisce de $5 nuair a chláraítear le haghaidh tástáil tátail | +| `nube` | `nube` | Nube.sh | Eochair API | [nasc](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | Eochair API | [nasc](https://build.nvidia.com) | Rochtain forbartha saor in aisce: ~40 RPM, 70+ samhail (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | Eochair API, fiontraíocht | [nasc](https://www.oracle.com/artificial-intelligence/generative-ai) | Úsáid d'eochair API OCI Generative AI nó comhartha iompróra IAM. Is féidir gurb é https://inference.generativeai..oci.oraclecloud.com/openai/v1/ an bun-URL. | +| `ofoxai` | `ofoxai` | OfoxAI | Eochair API, comhbhailitheoir | [nasc](https://ofox.ai) | Fógraítear sa chatalóg reatha 10+ samhail saor in aisce gan chuóta uimhriúil poiblí; déan athbhreithniú ar bhunáitíocht réamhtheachtach agus ar théarmaí coinneála agus oiliúna sula n-úsáidtear i dtáirgeadh iad. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Eochair API | [nasc](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | Eochair API | [nasc](https://1min.ai) | Cruthaigh eochair API ag https://docs.1min.ai/docs/api/create-api-key, ansin greamaigh anseo í. | +| `openadapter` | `oad` | OpenAdapter | Eochair API | [nasc](https://openadapter.dev) | Úsáid d'eochair API OpenAdapter in Authorization: Bearer sk-cv-. Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | Eochair API | [nasc](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | Eochair API | [nasc](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | Eochair API | [nasc](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | Eochair API | [nasc](https://openference.com) | Sraith saor in aisce: áirítear Qwen3.8 27b agus Llama 3.2 3B — féach openference.com/pricing le haghaidh na dtéarmaí reatha | +| `openrouter` | `openrouter` | OpenRouter | Eochair API, comhbhailitheoir | [nasc](https://openrouter.ai) | Samhlacha saor in aisce ar $0/comhartha leis an iarmhír :free - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | Eochair API | [nasc](https://openvecta.com) | Creidmheasanna saor in aisce nuair a chláraítear le haghaidh tátal atá comhoiriúnach le OpenAI thar LLManna, leabuithe agus samhlacha réasúnaíochta | +| `opper` | `opper` | Opper | Eochair API, comhbhailitheoir | [nasc](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | Eochair API | [nasc](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | Eochair API | [nasc](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | Eochair API | [nasc](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Eochair API | [nasc](https://www.perplexity.ai) | Úsáid d'eochair API Perplexity. Seolann OmniRoute aitheantais samhlacha Agent API trí chríochphointe Perplexity atá comhoiriúnach le Responses. | +| `piapi` | `pi` | PiAPI | Eochair API, comhbhailitheoir | [nasc](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | Eochair API | [nasc](https://pioneer.ai) | Creidmheasanna úsáide saor in aisce de $75 — ní gá cárta creidmheasa | +| `plamo` | `plamo` | PLaMo | Eochair API | [nasc](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | Eochair API, comhbhailitheoir | [nasc](https://creator.poe.com/api-reference) | Eochair API Bearer le haghaidh API Poe atá comhoiriúnach le OpenAI. | +| `poixe-ai` | `poixe-ai` | Poixe AI | Eochair API, comhbhailitheoir | [nasc](https://poixe.com) | Tá na teorainneacha poiblí saor in aisce reatha beag agus sonrach do ghrúpaí samhlacha: 2 RPM/5 RPD do shamhlacha large-cup agus 20 RPM/50 RPD do shamhlacha small-cup. | +| `pollinations` | `pol` | Pollinations AI | Eochair API, físeán | [nasc](https://pollinations.ai) | Cuirtear rochtain anaithnid/gan eochair ar na samhlacha saora doiciméadaithe ar fáil ar bhonn iarrachta is fearr. Fuarthas 401 i bhfíorú áitiúil v3.8.50 (2026-07-31) trí OmniRoute agus Cloudflare 1010 ar thástálacha díreacha réamhtheachtacha ón líonra céanna. Teastaíonn eochair API Pollinations ó enter.pollinations.ai fós le haghaidh samhlacha préimhe. | +| `poolside` | `poolside` | Poolside | Eochair API | [nasc](https://poolside.ai) | Tá Laguna S 2.1 agus XS 2.1 saor in aisce le linn Preview; níl aon chuóta uimhriúil poiblí foilsithe. | +| `predibase` | `predibase` | Predibase | Eochair API | [nasc](https://predibase.com) | ⚠️ **DÍMHEASTA.** Ní réitíonn serving.app.predibase.com a thuilleadh (scuabadh 2026-06-19); is cosúil gur cuireadh deireadh leis an API freastail bhainistithe. | +| `publicai` | `publicai` | PublicAI | Eochair API | [nasc](https://publicai.co) | Teastaíonn eochair API — creidmheas aonuaire nuair a chláraítear, ansin íoctha | +| `qianfan` | `qianfan` | Baidu Qianfan | Eochair API | [nasc](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | Eochair API | [nasc](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | Eochair API | [nasc](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Eochair API | [nasc](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | Eochair API, íomhá | [nasc](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | Eochair API | [nasc](https://regolo.ai) | Faigh d'eochair API Regolo ó regolo.ai, ansin greamaigh anseo í mar chomhartha Bearer. | +| `reka` | `reka` | Reka | Eochair API | [nasc](https://docs.reka.ai/chat/overview) | Úsáid d'eochair API Reka. Tacaíonn OmniRoute leis an URL bonn atá comhoiriúnach le OpenAI, https://api.reka.ai/v1, agus seolann sé na ceanntásca Authorization agus X-Api-Key araon ar mhaithe le comhoiriúnacht. | +| `requesty` | `requesty` | Requesty | Eochair API | [nasc](https://requesty.ai) | Sraith saor in aisce ~200 iarratas/lá - tairseach ródaithe ilmhúnla (300+ samhail) | +| `routeway` | `routeway` | Routeway | Eochair API | [nasc](https://routeway.ai) | Cruthaigh eochair API saor in aisce ag routeway.ai, ansin greamaigh anseo í mar chomhartha Bearer. | +| `runwayml` | `runway` | Runway | Eochair API, físeán | [nasc](https://docs.dev.runwayml.com) | Úsáid d'eochair API Runway in Authorization: Bearer . Díríonn OmniRoute ar API reatha Runway ag https://api.dev.runwayml.com/v1 agus seolann sé an ceanntásc riachtanach X-Runway-Version go huathoibríoch. | +| `sambanova` | `samba` | SambaNova | Eochair API | [nasc](https://sambanova.ai) | $5 de chreidmheasanna saor in aisce nuair a chláraítear (bailíocht 30 lá), ní theastaíonn cárta creidmheasa | +| `sap` | `sap` | SAP Generative AI Hub | Eochair API, fiontar | [nasc](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Úsáid do chomhartha iompróra SAP AI Core. Is féidir gurb é an bun-URL fréamh do AI_API_URL nó deploymentUrl ó Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | Eochair API | [nasc](https://docs.sarvam.ai) | ₹1,000 i gcreidmheasanna clárúcháin saor in aisce — ní théann siad in éag choíche | +| `scaleway` | `scw` | Scaleway AI | Eochair API | [nasc](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M comhartha saor in aisce do chuntais nua — comhlíontach leis an AE/RGCS (Páras), Qwen3 235B & Llama 70B | +| `sealion` | `sealion` | SEA-LION | Eochair API | [nasc](https://sea-lion.ai) | Sínigh isteach ag sea-lion.ai le Google (ní theastaíonn cárta agus níl aon bhac réigiúin ann), cruthaigh eochair API, ansin greamaigh anseo í. | +| `seekai` | `ska` | SeekAi | Eochair API, comhbhailitheoir | [nasc](https://seekai.cc) | Cruthaigh eochair API ag https://seekai.cc, ansin greamaigh anseo í mar chomhartha Bearer. | +| `segmind` | `segmind` | Segmind | Eochair API, íomhá, físeán | [nasc](https://segmind.com) | Úsáid d'eochair API Segmind sa cheanntásc x-api-key. Díríonn OmniRoute ar https://api.segmind.com/v1/ agus seolann sé bearta na híomhá/an fhíseáin ginte ar ais go díreach. | +| `sensenova` | `sensenova` | SenseNova | Eochair API | [nasc](https://platform.sensenova.cn) | Faigh eochair API ag platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | Eochair API | [nasc](https://cloud.siliconflow.com) | $1 de chreidmheasanna saor in aisce chomh maith le samhlacha $0 atá liostaithe faoi láthair tar éis fíorú aitheantais; d'fhéadfadh an infhaighteacht agus na teorainneacha athrú | +| `snowflake` | `snowflake` | Snowflake Cortex | Eochair API, fiontar | [nasc](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | Eochair API | [nasc](https://xinghuo.xfyun.cn) | Faigh eochair API ag console.xfyun.cn | +| `speka` | `speka` | Speka AI | Eochair API, comhbhailitheoir | [nasc](https://speka.me) | Plean saor in aisce: $1 d'úsáid mhíosúil, 10 RPM, eochair API amháin agus rochtain ar shamhlacha oscailte agus ar an gclós súgartha; ní theastaíonn cárta. | +| `stability-ai` | `stability` | Stability AI | Eochair API, íomhá | [nasc](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | Eochair API | [nasc](https://stepfun.com) | Faigh eochair API ag platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | Eochair API | [nasc](https://ai.sumopod.com) | Úsáid d'eochair API SumoPod (sk-...) in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | Eochair API | [nasc](https://suno.ai) | Greamaigh fianán an tseisiúin ó suno.ai (fíordheimhniú Clerk) | +| `synthetic` | `synthetic` | Synthetic | Eochair API, comhbhailitheoir | [nasc](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | Eochair API, comhbhailitheoir | [nasc](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | Eochair API | [nasc](https://hunyuan.tencent.com) | Faigh eochair API ag console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | Eochair API, comhbhailitheoir | [nasc](https://theb.ai) | Eochair API Bearer do thairseach TheB.AI atá comhoiriúnach le OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | Eochair API | [nasc](https://docs.tinyfish.ai/fetch-api) | X-API-Key ó agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | Eochair API, físeán | [nasc](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | Eochair API | [nasc](https://agent-router.gaib.ai) | Úsáid d'eochair API Token Kiosk in Authorization: Bearer . Tairseach atá comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | Eochair API, comhbhailitheoir | [nasc](https://www.tokenreply.com) | Tá teorainneacha laethúla a bhaineann go sonrach le samhlacha agus feachtais ag samhlacha a bhfuil clib saor in aisce orthu; níl aon chuóta domhanda seasta saor in aisce foilsithe. | +| `tokenrouter` | `trk` | TokenRouter | Eochair API | [nasc](https://tokenrouter.com) | Úsáid d'eochair API TokenRouter in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | Eochair API, íomhá | [nasc](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | Eochair API | [nasc](https://docs.opentyphoon.ai) | Eochair API saor in aisce le teorainn ráta 5 iarratas/s agus 200 iarratas/nóim. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Eochair API | [nasc](https://uncensored.com) | Úsáid d'eochair API Forbróra uncensored.com (uai_sk_live_...). Seolann OmniRoute í mar an ceanntásc X-api-key chuig an gcríochphointe https://api.uncensored.com/api/v1 atá comhoiriúnach le OpenAI. Ní théann an eochair in éag choíche. Is é seo an comhéadan méadraithe/creidmheasanna; is é an comhrá síntiúis neamh-mhéadraithe an soláthraí ar leith 'uc'. | +| `udio` | `udio` | Udio | Eochair API | [nasc](https://udio.com) | Greamaigh fianán an tseisiúin ó udio.com (fíordheimhniú Supabase) | +| `unorouter` | `unorouter` | UnoRouter | Eochair API, comhbhailitheoir | [nasc](https://unorouter.ai) | Ní bhaintear aon mhéid den iarmhéid i gcás samhlacha a bhfuil an iarmhír :free orthu; is é an teorainn 1 iarratas/nóiméad in aghaidh na samhla saor in aisce in aghaidh an úsáideora. | +| `upstage` | `upstage` | Upstage | Eochair API | [nasc](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | Eochair API | [nasc](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | Eochair API | [nasc](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Eochair API, comhbhailitheoir | [nasc](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | Eochair API, fiontair | [nasc](https://cloud.google.com/vertex-ai) | Cuir JSON Cuntais Seirbhíse, ceadchomhartha rochtana OAuth, eochair API Vertex Express, nó eochair údaraithe atá ceangailte le cuntas seirbhíse ar fáil. Ní thacaíonn mód Express ach le Gemini; teastaíonn dintiúir atá scóipithe don tionscadal ó shamhlacha comhpháirtíochta. | +| `vertex-partner` | `vp` | Vertex AI Partners | Eochair API, fiontair | [nasc](https://cloud.google.com/vertex-ai) | Cuir JSON Cuntais Seirbhíse nó dintiúir OAuth ar fáil. Tacaíonn eochair údaraithe atá ceangailte le cuntas seirbhíse le fionnachtain freisin, ach teastaíonn aitheantas tionscadail Google Cloud uaithi freisin le haghaidh tátal comhpháirtíochta. Ní thacaíonn eochracha caighdeánacha Express ach le Gemini. | +| `void-ai` | `void-ai` | Void AI | Eochair API, comhbhailitheoir | [nasc](https://voidai.app) | Marcálann catalóg phoiblí na samhlacha roinnt samhlacha mar chinn a bhfuil plean saor in aisce ag teastáil uathu, ach tá an rochtain coinníollach agus níl aon chuóta uimhriúil deimhnithe. | +| `volcengine` | `volcengine` | Volcengine | Eochair API | [nasc](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Eochair API | [nasc](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Ceangail do chuntas Volcano Engine nó úsáid eochair API síntiúis Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Eochair API | [nasc](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Ceangail do chuntas Volcano Engine nó úsáid eochair API síntiúis Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | Eochair API, leabú/athrangú | [nasc](https://www.voyageai.com) | Eochair API iompróra le haghaidh APIanna leabaithe agus athrangaithe Voyage AI. | +| `wafer` | `wafer` | Wafer AI | Eochair API | [nasc](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | Eochair API | [nasc](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Eochair API, fiontair | [nasc](https://www.ibm.com/products/watsonx-ai) | Úsáid do cheadchomhartha iompróra watsonx. Is féidir gurb é https://.ml.cloud.ibm.com/ml/gateway/v1/ nó críochphointe /ml/gateway/v1 féinbhainistithe an bun-URL. | +| `writer` | `writer` | Writer | Eochair API | [nasc](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | Eochair API | [nasc](https://x5lab.dev) | Úsáid d'eochair API X5Lab (x5-...) in Authorization: Bearer . Comhoiriúnach go hiomlán le OpenAI. Bun-URL an API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | Eochair API | [nasc](https://x.ai) | Úsáid eochair oifigiúil API xAI, nó sínigh isteach le xAI OAuth. Fanann seisiúin JWT Grok Build mar sholáthraí ar leith. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Eochair API | [nasc](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Eochair API | [nasc](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | Eochair API, comhbhailitheoir | [nasc](https://xkiro.com) | Cruthaigh cuntas saor in aisce ag xkiro.com agus greamaigh an eochair anseo (Bearer; glactar le x-api-key freisin). | +| `yi` | `yi` | Yi (01.AI) | Eochair API | [nasc](https://01.ai) | Faigh eochair API ag platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | Eochair API, comhbhailitheoir | [nasc](https://yolo-auto.com) | Tá rochtain API saor in aisce teoranta ó thaobh iarratas de agus beartaithe le haghaidh tástála; níl aon chuóta laethúil uimhriúil foilsithe agus ní ghealltar rochtain saor in aisce go ceann tréimhse éiginnte. | +| `zai` | `zai` | Z.AI | Eochair API | [nasc](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | Eochair API | [nasc](https://zenmux.ai) | Úsáid d'eochair API ZenMux in Authorization: Bearer . Tá ZenMux comhoiriúnach go hiomlán le OpenAI. Bun-URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Eochair API, comhbhailitheoir | [nasc](https://www.zerolimitai.com) | Fógraítear triail shealadach saor in aisce, ach tá neamhréir idir na leathanaigh oifigiúla maidir le 3 lá agus 7 lá; ní mheastar go bhfuil maíomh faoi 100 glao/lá buan. | +| `zylo-api` | `zylo` | Zylo API | Eochair API, comhbhailitheoir | [nasc](https://zyloai.net) | Plean Basic: 10 RPM, 7,200 iarratas/lá agus 200,000 ceadchomhartha/lá; teoranta do shamhlacha téacs Basic. | ## Soláthraithe Áitiúla (14) diff --git a/docs/i18n/ga/docs/routing/REASONING_REPLAY.md b/docs/i18n/ga/docs/routing/REASONING_REPLAY.md index f57dbc265e4a..f07f5dccbab2 100644 --- a/docs/i18n/ga/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/ga/docs/routing/REASONING_REPLAY.md @@ -24,20 +24,22 @@ Ach baineann gnáthchliaint (Cursor, Cline, Roo Code, OpenAI SDK) `reasoning_con ``` Seal N (gineann an cúntóir): → tá reasoning_content + tool_calls sa fhreagra - → más requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - scríobhann sé (cuimhne + DB), eochraithe de réir gach tool_call.id - → cuirtear an freagra ar aghaidh chuig an gcliant (a d'fhéadfadh an réasúnaíocht a choinneáil nó gan í a choinneáil) + → má tá requiresReasoningReplay(provider, model) i bhfeidhm: cacheReasoningFromAssistantMessage() + scríobhann sé (cuimhne + DB), agus gach tool_call.id mar eochair + → cuirtear an freagra ar aghaidh chuig an gcliant (agus d’fhéadfadh sé an réasúnú a choinneáil nó gan é a choinneáil) -Seal N+1 (seolann an cliant iarratas leantach): +Seal N+1 (seolann an cliant teachtaireacht leantach): → braitheann an t-aistritheoir: requiresReasoningReplay(provider, model) === true - → do gach teachtaireacht cúntóra ina bhfuil tool_calls agus nach bhfuil reasoning_content inti: + → do gach teachtaireacht ón gcúntóir ina bhfuil tool_calls ach nach bhfuil reasoning_content: lookupReasoning(toolCalls[0].id) → cuimhne → DB aimsiú → msg.reasoning_content = cached; recordReplay() - easnamh → msg.reasoning_content = "" (cúltaca oidhreachta do DeepSeek níos sine) + teip → msg.reasoning_content = "" (cúltaca oidhreachta do leaganacha níos sine de DeepSeek) → feiceann an córas réamhtheachtach stair chomhsheasmhach → gan 400 ``` -Tarlaíonn an ghabháil in `open-sse/handlers/chatCore.ts` (in dhá áit, ag an dá shuíomh glao `cacheReasoningFromAssistantMessage`). Tarlaíonn an t-athsheinm in `open-sse/translator/index.ts` tar éis comhéigean scéimre ach roimh sheoladh. +Déantar an ghabháil in `open-sse/handlers/chatCore.ts` (in dhá áit, ag an dá shuíomh glao ar `cacheReasoningFromAssistantMessage`). Déantar an t-athsheinm in `open-sse/translator/index.ts` tar éis comhéigean na scéime ach roimh an seoladh. + +Úsáidtear eochracha éagsúla do shealanna simplí ón gcúntóir (gan ghlao uirlise): déanann `buildAssistantMessageCacheKey()` achoimre den scóip seisiúin mar aon leis an tras-scríbhinn normalaithe i bhformáid OpenAI suas go dtí an seal sin, mar éilíonn DeepSeek réasúnú _gach_ seala roimhe sin a luaithe a bhíonn `tools` ann. I gcás spriocanna Responses-API (mar shampla `opencode-go/deepseek-v4-flash`, a sheoltar chuig `/responses`), iompraíonn an corp réamhtheachtach `input`, seachas `messages`, agus mar sin tuairiscíonn `translateRequest()` (`open-sse/translator/index.ts`) an tras-scríbhinn mhaighdeogach a ndearna sé achoimre di trí rogha aisghlao, agus déanann na suíomhanna gabhála achoimre den tras-scríbhinn chéanna. Ritheann pas athsheinm Responses ar mhaighdeog OpenAI i gcás gach formáide foinse, agus mar sin déantar athsheinm freisin do chliaint Anthropic Messages (Claude → OpenAI → Responses). ## Stóráil — Cuimhne Hibrideach + SQLite diff --git a/docs/i18n/ga/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/ga/docs/security/SOCKET_DEV_FINDINGS.md index 47412947b2de..a3cbb9b09a13 100644 --- a/docs/i18n/ga/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/ga/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,22 @@ --- -Is é an doiciméad seo an fianú a scríobh an cothabhálaí maidir leis na sé -thoradh `AI-detected potential malware` a tuairiscíodh i gcoinne `omniroute@3.8.5` agus +> **Nóta scóipe:** Cumraíonn `socket.yml` scanadh iar-fhoilsithe Socket.dev ar thaobh na clárlainne ar an déantán npm (cosáin le neamhaird a dhéanamh orthu d’ábhar nach seoltar, amhail `tests/`, `docs/`, agus tuarascálacha tógála). Ní chumraíonn sé geata cumaisc CI/PR — ní agraíonn aon sreabhadh oibre in `.github/workflows`, aon script `package.json`, ná aon sprioc `Makefile` Socket.dev. + +Is é an doiciméad seo an fianú arna scríobh ag an gcothabhálaí maidir leis na sé thoradh +`AI-detected potential malware` a tuairiscíodh i gcoinne `omniroute@3.8.5` agus na maoluithe a cuireadh i bhfeidhm in `omniroute@3.8.6`. Tá sé ann ionas: -1. Go mbeidh tagairt aonair ag oibreoirí píblínte slándála le lua nuair is gá - dóibh na torthaí a mheas i gcomparáid leis an gcód foinse iarbhír. -2. Gur féidir le scanóirí IS amach anseo an dearbhú sínithe ag an gcothabhálaí a aithint go bhfuil gach - cosán a bratachaíodh d'aon ghnó, roghnach, agus doiciméadaithe. -3. Go mbeidh taifead scríofa againn ar an gcúis a bhfuil gach suíomh glao ceaptha mar atá sé — - ionas nach dtabharfaidh athfhachtóiriú amach anseo méarlorg ar ais de thaisme a - baineadh d'aon ghnó. +1. Go mbeidh tagairt aonair ag oibreoirí na píblíne slándála lena lua nuair is gá dóibh + na torthaí a mheas i gcomparáid leis an gcód foinse iarbhír. +2. Go mbeidh scanóirí IS amach anseo in ann an dearbhú sínithe ag an gcothabhálaí a aithint go bhfuil gach + cosán a marcáladh d’aon ghnó, roghnach, agus doiciméadaithe. +3. Go mbeidh taifead scríofa againn ar an gcúis a bhfuil gach suíomh glao cumtha mar atá sé — + ionas nach dtabharfaidh athfhachtóiriú amach anseo lorg méire isteach arís de thaisme + a baineadh d’aon ghnó. -Má oibríonn tú scanóir a chuireann bratach arís ar aon cheann de na suíomhanna glao thíos tar éis do -mhaoluithe v3.8.6 a bheith eisithe, oscail saincheist le rian an scanta agus +Má oibríonn tú scanóir a mharcálann aon cheann de na suíomhanna glao thíos arís tar éis +na maoluithe in v3.8.6 a bheith seolta, oscail saincheist le rian an scanta agus leathnóimid an fianú anseo. --- diff --git a/docs/i18n/gu/README.md b/docs/i18n/gu/README.md index c3c3588b8c28..d787067084bf 100644 --- a/docs/i18n/gu/README.md +++ b/docs/i18n/gu/README.md @@ -19,17 +19,17 @@
-## 💰 દર મહિને ~1.62B મફત ટોકન્સ +## 💰 ~1.62B મફત ટોકન્સ / મહિનો
-> મફત ટિયર્સને હાથથી એકત્રિત કરવું કષ્ટદાયક છે — ડઝનેક SDKs, ડઝનેક દર મર્યાદાઓ, અને તમારી પાસે વાસ્તવમાં કેટલું ઉપલબ્ધ છે તેનો કોઈ અંદાજ નહીં. OmniRoute **35 પુનરાવર્તિત પૂલ કીઝમાં 491 મફત-ટિયર એન્ટ્રીઓ** સૂચિબદ્ધ કરે છે અને **પ્રકાશિત સકારાત્મક માસિક બજેટ ધરાવતા 17 પૂલ્સ ઉપરાંત પ્રતિ-મોડેલ પાંચ Groq મર્યાદાઓ** પરથી ટોકનનો મુખ્ય આંકડો ગણે છે, જેમાં વહેંચાયેલા પૂલ મુજબ ડુપ્લિકેશન દૂર કરવામાં આવે છે. જે ક્વોટા ફક્ત પ્રાદેશિક ઓળખ ચકાસણી પછી જ ઉપલબ્ધ થાય છે (હાલમાં: ModelScope), તેમને અલગ દર્શાવવામાં આવે છે—પ્રાદેશિક ઓળખ ચકાસણી પાછળ +~6M—અને મુખ્ય આંકડામાં ક્યારેય ઉમેરવામાં આવતા નથી. પરિણામ ડૅશબોર્ડ (`/dashboard/free-tiers`) પર દૃશ્યમાન રહે છે. +> મફત ટિયર્સને હાથથી એકત્રિત કરવું કષ્ટદાયક છે — ડઝનેક SDKs, ડઝનેક દર મર્યાદાઓ અને તમારી પાસે ખરેખર કેટલું ઉપલબ્ધ છે તેની કોઈ જાણકારી નહીં. OmniRoute **35 પુનરાવર્તિત પૂલ કીઝમાં 489 મફત-ટિયર એન્ટ્રીઓ**ની સૂચિ બનાવે છે અને **પ્રકાશિત સકારાત્મક માસિક બજેટ ધરાવતા 17 પૂલ્સ તથા પાંચ પ્રતિ-મોડેલ Groq મર્યાદાઓ** પરથી ટોકન્સનો મુખ્ય આંકડો ગણે છે, જેમાં સહિયારા પૂલ અનુસાર ડુપ્લિકેટ્સ દૂર કરવામાં આવે છે. જે ક્વોટા માત્ર પ્રાદેશિક ઓળખ ચકાસણી પછી જ ઉપલબ્ધ થાય છે (હાલમાં: ModelScope), તે અલગ દર્શાવવામાં આવે છે, પ્રાદેશિક ઓળખ ચકાસણી પાછળ +~6M, અને તેને ક્યારેય મુખ્ય આંકડામાં ઉમેરવામાં આવતો નથી. પરિણામ ડેશબોર્ડ (`/dashboard/free-tiers`) પર દૃશ્યમાન રહે છે. -OmniRoute મફત-ટિયર બજેટ કાર્ડ: દર મહિને સ્થિર રીતે ~1.62B મફત ટોકન્સ, સાઇનઅપ ક્રેડિટ્સ સાથે પ્રથમ મહિને ~2.22B સુધી, એક જ એન્ડપોઇન્ટ પાછળ 491 સૂચિબદ્ધ મફત-ટિયર એન્ટ્રીઓને આવરી લેતી 35 દસ્તાવેજીકૃત પુનરાવર્તિત પૂલ કીઝમાંથી. પ્રામાણિક, પૂલ-ડુપ્લિકેશન દૂર કરેલું ગણિત — દરેક વહેંચાયેલા પૂલની ફક્ત એક વાર ગણતરી, જેમાં પ્રકાશિત સકારાત્મક માસિક ટોકન બજેટ ધરાવતા 17 પુનરાવર્તિત પૂલ્સ ઉપરાંત પ્રતિ-મોડેલ પાંચ Groq મર્યાદાઓનો સમાવેશ થાય છે; શરતોના જોખમવાળી સૂચિમાં 13 પ્રદાતાઓને ટાળવા યોગ્ય તરીકે ચિહ્નિત કરવામાં આવ્યા છે, જેથી નિર્ણય તમે લઈ શકો. બજેટ બારમાં Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (પ્રતિ-મોડેલ પાંચ મર્યાદાઓ) અને નાના પૂલ્સનો સમાવેશ થાય છે, ઉપરાંત પ્રથમ મહિનાની સાઇનઅપ ક્રેડિટ્સ અને કાયમી રીતે મફત, ટોકન-મર્યાદા વિનાના પ્રદાતાઓને અલગથી દર્શાવવામાં આવે છે જેથી તેઓ મુખ્ય આંકડાને ક્યારેય કૃત્રિમ રીતે ન વધારે. /dashboard/free-tiers પર વપરાયેલ/બાકીનું લાઇવ પ્રમાણ. +OmniRoute મફત-ટિયર બજેટ કાર્ડ: દર મહિને સતત ~1.62B મફત ટોકન્સ, સાઇનઅપ ક્રેડિટ્સ સાથે પ્રથમ મહિનામાં ~2.22B સુધી, એક એન્ડપોઇન્ટ પાછળ સૂચિબદ્ધ 489 મફત-ટિયર એન્ટ્રીઓને આવરી લેતી 35 દસ્તાવેજીકૃત પુનરાવર્તિત પૂલ કીઝમાંથી. પ્રામાણિક પૂલ-ડુપ્લિકેટ-મુક્ત ગણતરી — દરેક સહિયારા પૂલને માત્ર એકવાર ગણવામાં આવે છે, જેમાં પ્રકાશિત સકારાત્મક માસિક ટોકન બજેટ ધરાવતા 17 પુનરાવર્તિત પૂલ્સ તથા પાંચ પ્રતિ-મોડેલ Groq મર્યાદાઓનો સમાવેશ થાય છે; શરતો-જોખમ સૂચિમાં 13 પ્રદાતાઓને ટાળવા યોગ્ય તરીકે ચિહ્નિત કરવામાં આવ્યા છે જેથી નિર્ણય તમે લો. બજેટ બારમાં Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (પાંચ પ્રતિ-મોડેલ મર્યાદાઓ) અને નાના પૂલ્સનો સમાવેશ થાય છે; સાથે જ પ્રથમ મહિનાની સાઇનઅપ ક્રેડિટ્સ અને કાયમ માટે મફત, ટોકન-મર્યાદા વિનાના પ્રદાતાઓને અલગથી દર્શાવવામાં આવે છે જેથી તેઓ મુખ્ય આંકડાને ક્યારેય કૃત્રિમ રીતે ન વધારે. /dashboard/free-tiers પર વપરાયેલ/બાકીનું લાઇવ પ્રમાણ. -> લાઇવ `/dashboard/free-tiers` પેજનો એનિમેટેડ સારાંશ. સંપૂર્ણ પદ્ધતિ (પૂલ ડુપ્લિકેશન દૂર કરવું, ક્રેડિટ ટિયર્સ, પ્રદાતાની શરતો): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> લાઇવ `/dashboard/free-tiers` પૃષ્ઠનો એનિમેટેડ સારાંશ. સંપૂર્ણ પદ્ધતિ (પૂલ ડુપ્લિકેશન દૂર કરવું, ક્રેડિટ ટિયર્સ, પ્રદાતાની શરતો): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> લાઇવ સૂચિ સામે આ આંકડાઓનું દર બે અઠવાડિયે ફરી ઑડિટ કરવામાં આવે છે અને તે **બંને દિશામાં બદલાય છે** — કોઈ પ્રદાતા મફત ટિયર બંધ કરે તો આંકડો ઘટે છે; નવો પ્રદાતા ઉમેરાય તો તે વધે છે. સૂચિ વાસ્તવમાં જે ગણે છે તે જ અમે પ્રકાશિત કરીએ છીએ, ઉપર તરફ ગોળ કરેલો શ્રેષ્ઠ સંભવિત આંકડો ક્યારેય નહીં. +> લાઇવ સૂચિના આધારે દર બે અઠવાડિયે આ આંકડાઓનું ફરી ઓડિટ કરવામાં આવે છે અને તે **બંને દિશામાં બદલાય છે** — કોઈ પ્રદાતા મફત ટિયર બંધ કરે તો આંકડો ઘટે છે; નવો ઉમેરાય તો વધે છે. સૂચિ ખરેખર જે ગણે છે તે જ અમે પ્રકાશિત કરીએ છીએ, ક્યારેય ઉપર તરફ ગોળ કરેલો શ્રેષ્ઠ સંભવિત આંકડો નહીં.
@@ -48,10 +48,10 @@ ### 💬 સમુદાયમાં જોડાઓ -**👋 જાળવણીકર્તાને ફૉલો કરો — નવા પ્રદાતાઓ, રિલીઝ અને ટિપ્સ સૌથી પહેલાં મેળવો:** +**👋 જાળવણીકર્તાને અનુસરો — નવા પ્રદાતાઓ, રિલીઝ અને ટિપ્સ સૌથી પહેલાં મેળવો:** -[![LinkedIn પર Diegoને ફૉલો કરો](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) -[![GitHub પર @diegosouzapwને ફૉલો કરો](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) +[![LinkedIn પર Diegoને અનુસરો](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) +[![GitHub પર @diegosouzapwને અનુસરો](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) @@ -59,7 +59,7 @@ [![WhatsApp બ્રાઝિલ](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![વેબસાઇટ](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**પ્રશ્નો, પ્રદાતાઓ વિશેની ટિપ્સ, રોડમૅપ અને સહાય → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 વૈશ્વિક](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 બ્રાઝિલ](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [પોર્ટલ](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**પ્રશ્નો, પ્રદાતા અંગેની ટિપ્સ, રોડમેપ અને સહાય → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 વૈશ્વિક](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 બ્રાઝિલ](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [પોર્ટલ](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -592,7 +592,7 @@ Radar વૈકલ્પિક છે અને માત્ર GET નો ઉ ## 🤖 સુસંગત CLIs અને કોડિંગ એજન્ટ્સ -> એક જ કૉન્ફિગ — `http://localhost:20128/v1` — અને **દરેક** AI IDE અથવા CLI મફત અને ઓછી કિંમતના મોડલ્સ પર ચાલે છે. +> એક જ કૉન્ફિગ — `http://localhost:20128/v1` — અને **દરેક** AI IDE અથવા CLI મફત અને ઓછા ખર્ચવાળા મોડલ્સ પર ચાલે છે.
@@ -626,13 +626,13 @@ Radar વૈકલ્પિક છે અને માત્ર GET નો ઉ - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ આની સાથે પણ કામ કરે છે · Kiro · Command Code · Antigravity · Windsurf · AMP · કોઈપણ OpenAI-સુસંગત ટૂલ ++ આની સાથે પણ કાર્ય કરે છે · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · કોઈપણ OpenAI-સુસંગત સાધન
📖 તમામ 36 ટૂલ્સ (26 CLI Code's + 10 CLI Agents) માટે પ્રતિ-ટૂલ સેટઅપ → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode પ્લગઇન → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) @@ -641,8 +641,8 @@ Radar વૈકલ્પિક છે અને માત્ર GET નો ઉ
-**એક જ કમાન્ડથી OmniRoute મારફતે કોઈપણ સમર્થિત CLI શરૂ કરો** — કોઈ config ફાઇલો લખાતી નથી, -દરેક process માટે credentials દાખલ થાય છે, Qwen/Geminiને કામચલાઉ અલાયદું home મળે છે: +**એક જ કમાન્ડમાં OmniRoute મારફતે કોઈપણ સમર્થિત CLI શરૂ કરો** — કોઈ રૂપરેખાંકન ફાઇલો લખાતી નથી, +દરેક પ્રોસેસ માટે ઓળખપત્રો દાખલ થાય છે, અને Qwen/Gemini ને અસ્થાયી અલગ હોમ મળે છે: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,13 +653,13 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# અથવા provider+model ઇન્ટરેક્ટિવ રીતે પસંદ કરો અને ટૂલનું પોતાનું config લખો: +# અથવા પ્રદાતા+મોડેલ ઇન્ટરેક્ટિવ રીતે પસંદ કરો અને ટૂલનું પોતાનું રૂપરેખાંકન લખો: omniroute configure codex # આ પણ: claude opencode qwen aider goose gemini cline continue kilo ``` -દરેક કમાન્ડ સક્રિય remote context (`omniroute connect `)ને અનુસરે છે, `--dry-run` -ચલાવ્યા વિના ચોક્કસ env/argsનું પૂર્વાવલોકન આપે છે, અને `--api-key-env NAME` secretsને -તમારી shell historyથી દૂર રાખે છે. → [CLI ઇન્ટિગ્રેશન્સ](docs/guides/CLI-INTEGRATIONS.md) +દરેક કમાન્ડ સક્રિય રિમોટ સંદર્ભ (`omniroute connect `)નું પાલન કરે છે, `--dry-run` +ચલાવ્યા વિના ચોક્કસ env/argsનું પૂર્વાવલોકન બતાવે છે, અને `--api-key-env NAME` રહસ્યોને +તમારા શેલ ઇતિહાસથી દૂર રાખે છે. → [CLI એકીકરણો](docs/guides/CLI-INTEGRATIONS.md)
@@ -669,11 +669,11 @@ omniroute configure codex # આ પણ: claude opencode qwen aider goos -> **357 નોંધાયેલા પ્રદાતાઓ** પ્રમાણભૂત ચેટ, મીડિયા, શોધ, લોકલ, ક્લાઉડ-એજન્ટ અને સિસ્ટમ સંગ્રહોમાં ઉપલબ્ધ છે, જેમાં **152 પાસે `hasFree: true` ડિસ્કવરી મેટાડેટા છે**. ચેટ મોડેલ રજિસ્ટ્રીમાં **229 પ્રદાતાઓ / 2,554 વિશિષ્ટ પ્રદાતા-મોડેલ જોડીઓ / 1,283 મૂળ મોડેલ IDs** સામેલ છે; અલગ મફત-બજેટ કેટલોગમાં **491 પ્રતિ-મોડેલ પંક્તિઓ**, **35 પુનરાવર્તિત પૂલ** અને **54 પુનરાવર્તિત/કીલેસ કાયમી મફત પ્રદાતાઓ** છે. આ ગણતરીના આધાર ઇરાદાપૂર્વક અલગ છે; વ્યાખ્યાઓ અને પૂલ-ડિડુપ્લિકેટેડ ગણતરીઓ [પ્રદાતા સંદર્ભ](docs/reference/PROVIDER_REFERENCE.md) અને [મફત ટિયર્સ](docs/reference/FREE_TIERS.md)માં ઉપલબ્ધ છે. +> પ્રમાણભૂત ચેટ, મીડિયા, શોધ, સ્થાનિક, ક્લાઉડ-એજન્ટ અને સિસ્ટમ સંગ્રહોમાં **357 નોંધાયેલા પ્રદાતાઓ** છે, જેમાંથી **152 પાસે `hasFree: true` શોધ મેટાડેટા છે**. ચેટ મોડેલ રજિસ્ટ્રીમાં **229 પ્રદાતાઓ / 2,554 અલગ પ્રદાતા-મોડેલ જોડીઓ / 1,283 મૂળ મોડેલ ID** સામેલ છે; અલગ મફત-બજેટ કેટલોગમાં **મોડેલ દીઠ 491 પંક્તિઓ**, **35 પુનરાવર્તિત પૂલ** અને **54 પુનરાવર્તિત/કી-રહિત કાયમી મફત પ્રદાતાઓ** છે. આ છેદો રચના પ્રમાણે અલગ છે; વ્યાખ્યાઓ અને પૂલ-ડિડુપ્લિકેટ કરેલી ગણતરીઓ [પ્રદાતા સંદર્ભ](docs/reference/PROVIDER_REFERENCE.md) અને [મફત સ્તરો](docs/reference/FREE_TIERS.md)માં ઉપલબ્ધ છે.
-### 🏢 દરેક અગ્રણી લૅબ — એક જ એન્ડપોઇન્ટ મારફતે +### 🏢 દરેક મુખ્ય લૅબ — એક જ એન્ડપોઇન્ટ દ્વારા @@ -687,7 +687,7 @@ omniroute configure codex # આ પણ: claude opencode qwen aider goos - + @@ -710,24 +710,24 @@ omniroute configure codex # આ પણ: claude opencode qwen aider goos
Qwen
Qwen
                           
Meta Llama
Meta Llama
                           
Groq
Groq
                           
Groq
Groq
                           
NVIDIA
NVIDIA
                           
MiniMax
MiniMax
                           
Cohere
Cohere
                           
- - - - - - + + + + + + - - + + - +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
ટોકનની કોઈ મર્યાદા નથી
Kilo Code
Kilo Code
ઑટો-રાઉટર, Tencent Hy3
હંમેશા મફત
Requesty
Requesty
GPT-OSS 120B, Nemotron
હંમેશા મફત
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
મફત સ્તર
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
હંમેશા મફત
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
હંમેશા મફત
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
કોઈ ટોકન મર્યાદા નથી
Kilo Code
Kilo Code
ઑટો-રાઉટર, Tencent Hy3
હંમેશા માટે મફત
Requesty
Requesty
GPT-OSS 120B, Nemotron
હંમેશા માટે મફત
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
મફત ટિયર
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
હંમેશા માટે મફત
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
હંમેશા માટે મફત
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
અમર્યાદિત મફત
Pollinations
Pollinations
GPT, Llama, Claude
કોઈ કીની જરૂર નથી
Cloudflare AI
Cloudflare AI
50+ મોડલ
દરરોજ 10K ન્યુરૉન
Pollinations
Pollinations
GPT, Llama, Claude
કીની જરૂર નથી
Cloudflare AI
Cloudflare AI
50+ મોડલ
10K ન્યૂરૉન/દિવસ
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM મફત
Cerebras
Cerebras
GLM 4.7, GPT-OSS
દરરોજ 1M ટોકન
Openference
Openference
Qwen3.8 27B, Llama 3.2
મફત ટિયર
OpenRouter
OpenRouter
:free મોડલ
+$10 → વધુ RPM
-📖 સંપૂર્ણ મશીન-વાંચનીય સૂચિ → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 સંપૂર્ણ મશીન-વાંચનીય કેટલોગ → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1263,21 +1263,21 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન - + - - - + + + - + - - - - - - - + + + + + + +
સ્તરટેક્નોલોજી
રનટાઇમNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
ભાષાTypeScript 6.0 — src/ અને open-sse/માં સર્વત્ર 100% TypeScript (v2.0થી કોરમાં શૂન્ય any)
ભાષાTypeScript 6.0 — src/ અને open-sse/માં સર્વત્ર 100% TypeScript (v2.0થી કોરમાં એકપણ any નથી)
ફ્રેમવર્કNext.js 16 + React 19 + Tailwind CSS 4
ડેટાબેઝbetter-sqlite3 (SQLite, WAL જર્નલિંગ) + LowDB (JSON લેગસી) — 122 ડોમેન મોડ્યુલ, 176 માઇગ્રેશન
મેમરીSQLite FTS5 પૂર્ણ-ટેક્સ્ટ + int8-ક્વોન્ટાઇઝ્ડ વેક્ટર એમ્બેડિંગ્સ, ટાઇપ્ડ ડિકે
સ્કીમાZod 4 — MCP ટૂલ I/O માન્યતા + API કરારો
ડેટાબેઝbetter-sqlite3 (SQLite, WAL જર્નલિંગ) + LowDB (JSON લેગસી) — 122 ડોમેન મોડ્યુલ, 178 માઇગ્રેશન
મેમરીSQLite FTS5 પૂર્ણ-ટેક્સ્ટ + int8-ક્વૉન્ટાઇઝ્ડ વેક્ટર એમ્બેડિંગ્સ, ટાઇપ્ડ ડિકે
સ્કીમાZod 4 — MCP ટૂલ I/O માન્યતા + API કોન્ટ્રાક્ટ્સ
પ્રોટોકોલMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
સ્ટ્રીમિંગસર્વર-સેન્ટ ઇવેન્ટ્સ (SSE) + WebSocket બ્રિજ (/v1/ws)
સ્ટ્રીમિંગServer-Sent Events (SSE) + WebSocket બ્રિજ (/v1/ws)
કમ્પ્રેશન12-એન્જિન પાઇપલાઇન — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
પ્રમાણીકરણ & સુરક્ષાOAuth 2.0 (PKCE) + JWT + API કીઝ + MCP સ્કોપ્ડ પ્રમાણીકરણ · સંગ્રહિત સ્થિતિમાં AES-256-GCM · DOMPurify
સ્ટેલ્થwreq-js — JA3 / JA4 TLS ફિંગરપ્રિન્ટ અનુકરણ, 3-સ્તરીય પ્રોક્સી
સ્થિતિસ્થાપકતાસર્કિટ બ્રેકર, એક્સ્પોનેન્શિયલ બેકઑફ, એન્ટિ-થન્ડરિંગ-હર્ડ, ઑટો-કોમ્બો સ્વ-ઉપચાર
લૉગિંગpino — રિક્વેસ્ટ સંદર્ભ સાથે સ્ટ્રક્ચર્ડ JSON લૉગ્સ
ટેસ્ટિંગNode.js ટેસ્ટ રનર + Vitest — 5,100+ ટ્રૅક કરેલી ટેસ્ટ ફાઇલોમાં 39,000+ સ્ટેટિક ટેસ્ટ ઘોષણાઓ (યુનિટ, ઇન્ટિગ્રેશન, E2E, સુરક્ષા, ઇકોસિસ્ટમ)
પ્લેટફોર્મડેસ્કટૉપ (Electron) · Android (Termux) · PWA (કોઈપણ બ્રાઉઝર)
CI/CDGitHub Actions — રિલીઝ વખતે સ્વચાલિત npm પ્રકાશન + Docker Hub
પ્રમાણીકરણ અને સુરક્ષાOAuth 2.0 (PKCE) + JWT + API કીઝ + MCP સ્કોપ્ડ પ્રમાણીકરણ · સંગ્રહિત ડેટા માટે AES-256-GCM · DOMPurify
સ્ટેલ્થwreq-js — JA3 / JA4 TLS ફિંગરપ્રિન્ટની નકલ, 3-સ્તરીય પ્રોક્સી
સ્થિતિસ્થાપકતાસર્કિટ બ્રેકર, એક્સ્પોનેન્શિયલ બૅકઑફ, એન્ટિ-થન્ડરિંગ-હર્ડ, ઑટો-કોમ્બો સ્વ-સુધારણા
લૉગિંગpino — રિક્વેસ્ટ સંદર્ભ સાથે સંરચિત JSON લૉગ્સ
પરીક્ષણNode.js ટેસ્ટ રનર + Vitest — 5,100+ ટ્રૅક કરેલી ટેસ્ટ ફાઇલોમાં 39,000+ સ્ટેટિક ટેસ્ટ ઘોષણાઓ (યુનિટ, ઇન્ટિગ્રેશન, E2E, સુરક્ષા, ઇકોસિસ્ટમ)
પ્લેટફોર્મડેસ્કટોપ (Electron) · Android (Termux) · PWA (કોઈપણ બ્રાઉઝર)
CI/CDGitHub Actions — રિલીઝ વખતે આપમેળે npm પબ્લિશ + Docker Hub
લિંક્સવેબસાઇટ · npm · Docker Hub
@@ -1289,57 +1289,57 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન -### 📘 શરૂઆત કરવી +### 📘 શરૂઆત કરો - - - - - - + + + + + +
દસ્તાવેજવર્ણન
વપરાશકર્તા માર્ગદર્શિકાપ્રદાતાઓ, કોમ્બોઝ, CLI એકીકરણ, ડિપ્લોયમેન્ટ
સેટઅપ માર્ગદર્શિકાઇન્સ્ટોલેશનની સંપૂર્ણ પદ્ધતિઓ, CLI ટૂલ ગોઠવણીઓ, પ્રોટોકોલ સેટઅપ, ટાઇમઆઉટ ટ્યુનિંગ
CLI ટૂલ્સ માર્ગદર્શિકાClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot માટે દરેક ટૂલ મુજબનું સેટઅપ
રિમોટ મોડમર્યાદિત ઍક્સેસ ટોકન્સ દ્વારા તમારા લેપટોપના CLIમાંથી રિમોટ OmniRoute (VPS) ચલાવો
Claude Code ગોઠવણીlaunch + દરેક મોડેલ માટેની પ્રોફાઇલ્સ સાથે Claude Codeને OmniRoute (લોકલ/રિમોટ) તરફ નિર્દેશિત કરો
ઝડપી શરૂઆત3-પગલાંનું ઇન્સ્ટોલેશન → કનેક્ટ → ગોઠવણી
વપરાશકર્તા માર્ગદર્શિકાપ્રદાતાઓ, કોમ્બો, CLI એકીકરણ, ડિપ્લોયમેન્ટ
સેટઅપ માર્ગદર્શિકાસંપૂર્ણ ઇન્સ્ટોલેશન પદ્ધતિઓ, CLI ટૂલ કૉન્ફિગ્સ, પ્રોટોકોલ સેટઅપ, ટાઇમઆઉટ ટ્યુનિંગ
CLI ટૂલ્સ માર્ગદર્શિકાClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot માટે દરેક ટૂલનું સેટઅપ
રિમોટ મોડમર્યાદિત ઍક્સેસ ટોકન્સ દ્વારા તમારા લેપટોપના CLIથી રિમોટ OmniRoute (VPS) ચલાવો
Claude Code કૉન્ફિગlaunch + દરેક મોડેલની પ્રોફાઇલ સાથે Claude Codeને OmniRoute (સ્થાનિક/રિમોટ) તરફ નિર્દેશિત કરો
ઝડપી શરૂઆત3-પગલાંમાં ઇન્સ્ટોલ કરો → કનેક્ટ કરો → કૉન્ફિગર કરો
### 🔧 સંચાલન અને ડિપ્લોયમેન્ટ - + - + - - + +
દસ્તાવેજવર્ણન
Docker માર્ગદર્શિકાDocker run, Compose પ્રોફાઇલ્સ, Caddy HTTPS, ટનલ્સ, ઇમેજ ટૅગ્સ
Docker માર્ગદર્શિકાDocker ચલાવવું, Compose પ્રોફાઇલ્સ, Caddy HTTPS, ટનલ્સ, ઇમેજ ટૅગ્સ
Podman માર્ગદર્શિકાQuadlet systemd એકીકરણ, podman-compose, SELinux
VM ડિપ્લોયમેન્ટસંપૂર્ણ માર્ગદર્શિકા: VM + nginx + Cloudflare સેટઅપ
Fly.io ડિપ્લોયમેન્ટકાયમી સ્ટોરેજ સાથે Fly.io પર ડિપ્લોય કરો
Fly.io ડિપ્લોયમેન્ટપર્સિસ્ટન્ટ સ્ટોરેજ સાથે Fly.io પર ડિપ્લોય કરો
Termux માર્ગદર્શિકાTermux દ્વારા Android પર OmniRoute ચલાવો
PWA માર્ગદર્શિકાપ્રોગ્રેસિવ વેબ ઍપ ઇન્સ્ટોલેશન, કૅશિંગ, આર્કિટેક્ચર
અનઇન્સ્ટોલ માર્ગદર્શિકાતમામ ઇન્સ્ટોલેશન પદ્ધતિઓ માટે સ્વચ્છ રીતે દૂર કરવાની રીત
એન્વાયર્નમેન્ટ ગોઠવણીસંપૂર્ણ .env વેરિએબલ્સ અને સંદર્ભો
અનઇન્સ્ટોલ માર્ગદર્શિકાતમામ ઇન્સ્ટોલેશન પદ્ધતિઓ માટે સ્વચ્છ નિરાકરણ
એન્વાયરમેન્ટ કૉન્ફિગસંપૂર્ણ .env વેરિએબલ્સ અને સંદર્ભો
### 🧠 સુવિધાઓ અને આર્કિટેક્ચર - - - - + + + + - - - - - - - + + + + + + +
દસ્તાવેજવર્ણન
આર્કિટેક્ચરસિસ્ટમ આર્કિટેક્ચર, ડેટા પ્રવાહ અને આંતરિક કાર્યપ્રણાલી
કમ્પ્રેશન માર્ગદર્શિકા7-વિકલ્પ પાઇપલાઇન: બંધ / હળવું / પ્રમાણભૂત / આક્રમક / અલ્ટ્રા / RTK / સ્ટૅક્ડ
RTK કમ્પ્રેશનકમાન્ડ-આઉટપુટ કમ્પ્રેશન, ફિલ્ટર્સ, વિશ્વાસ, ચકાસણી, કાચા આઉટપુટની પુનઃપ્રાપ્તિ
કમ્પ્રેશન એન્જિન્સCaveman, RTK, સ્ટૅક્ડ પાઇપલાઇન્સ, ડૅશબોર્ડ/API/MCP ઇન્ટરફેસ
આર્કિટેક્ચરસિસ્ટમ આર્કિટેક્ચર, ડેટા પ્રવાહ અને આંતરિક રચના
કમ્પ્રેશન માર્ગદર્શિકા7-વિકલ્પોની પાઇપલાઇન: બંધ / હળવી / માનક / આક્રમક / અલ્ટ્રા / RTK / સ્ટૅક્ડ
RTK કમ્પ્રેશનકમાન્ડ-આઉટપુટ કમ્પ્રેશન, ફિલ્ટર્સ, વિશ્વાસ, ચકાસણી, રૉ-આઉટપુટ પુનઃપ્રાપ્તિ
કમ્પ્રેશન એન્જિન્સCaveman, RTK, સ્ટૅક્ડ પાઇપલાઇન્સ, ડૅશબોર્ડ/API/MCP સપાટીઓ
કમ્પ્રેશન નિયમોનું ફોર્મેટCaveman અને RTK ફિલ્ટર્સ માટે JSON રૂલ-પૅક સ્કીમા
કમ્પ્રેશન લેંગ્વેજ પૅક્સભાષાની ઓળખ અને Caveman રૂલ-પૅક લેખન
સ્થિતિસ્થાપકતા માર્ગદર્શિકાસર્કિટ બ્રેકર્સ, કૂલડાઉન્સ, કતાર, એકસાથે થતા વિનંતીઓના ધસારાનું નિવારણ, TLS સ્પૂફિંગ
ઑટો-કોમ્બો એન્જિન16-પરિબળ સ્કોરિંગ, મોડ પૅક્સ, સ્વ-ઉપચાર
પ્રોક્સી માર્ગદર્શિકા3-સ્તરીય પ્રોક્સી સિસ્ટમ, 1proxy માર્કેટપ્લેસ, રજિસ્ટ્રી CRUD
મફત સ્તરોસંકલિત ડિરેક્ટરી: 35 દસ્તાવેજીકૃત આવર્તક પૂલ્સ / 491 સૂચિબદ્ધ મફત-સ્તરની એન્ટ્રીઓ
સુવિધાઓની ગેલેરીસ્ક્રીનશૉટ્સ સાથે ડૅશબોર્ડનું દૃશ્યાત્મક અવલોકન
કોડબેઝ દસ્તાવેજીકરણનવા વપરાશકર્તાઓ માટે અનુકૂળ કોડબેઝનું પગલું-દર-પગલું અવલોકન
કમ્પ્રેશન લેંગ્વેજ પૅક્સભાષાની ઓળખ અને Caveman રૂલ-પૅક રચના
સ્થિતિસ્થાપકતા માર્ગદર્શિકાસર્કિટ બ્રેકર્સ, કૂલડાઉન્સ, કતાર, એન્ટિ-થન્ડરિંગ હર્ડ, TLS સ્પૂફિંગ
Auto-Combo એન્જિન16-પરિબળ સ્કોરિંગ, મોડ પૅક્સ, સ્વયં-સુધારણા
પ્રૉક્સી માર્ગદર્શિકા3-સ્તરીય પ્રૉક્સી સિસ્ટમ, 1proxy માર્કેટપ્લેસ, રજિસ્ટ્રી CRUD
મફત સ્તરોએકીકૃત ડિરેક્ટરી: 35 દસ્તાવેજીકૃત પુનરાવર્તિત પૂલ / 489 સૂચિબદ્ધ મફત-સ્તરની એન્ટ્રીઓ
સુવિધાઓની ગૅલેરીસ્ક્રીનશૉટ્સ સાથે ડૅશબોર્ડનું દૃશ્યાત્મક અવલોકન
કોડબેઝ દસ્તાવેજીકરણનવશીખિયા-મૈત્રીપૂર્ણ કોડબેઝ માર્ગદર્શન
### 🤖 પ્રોટોકોલ્સ અને APIs - + - + @@ -1350,11 +1350,11 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન
દસ્તાવેજવર્ણન
API સંદર્ભઉદાહરણો સાથે તમામ એન્ડપોઇન્ટ્સ
API સંદર્ભઉદાહરણો સાથે તમામ એન્ડપૉઇન્ટ્સ
OpenAPI સ્પેસિફિકેશનOpenAPI 3.0 સ્પેસિફિકેશન
MCP સર્વર110 MCP ટૂલ્સ, IDE ગોઠવણીઓ, Python/TS/Go ક્લાયન્ટ્સ
MCP સર્વર110 MCP ટૂલ્સ, IDE કૉન્ફિગ્સ, Python/TS/Go ક્લાયન્ટ્સ
MCP સર્વર માર્ગદર્શિકાMCP ઇન્સ્ટોલેશન, ટ્રાન્સપોર્ટ્સ અને ટૂલ સંદર્ભ
A2A સર્વરJSON-RPC 2.0 પ્રોટોકોલ, કૌશલ્યો, સ્ટ્રીમિંગ, કાર્ય વ્યવસ્થાપન
A2A સર્વર માર્ગદર્શિકાA2A એજન્ટ કાર્ડ, કાર્યો, કૌશલ્યો અને સ્ટ્રીમિંગ
- - - - - + + + + +
દસ્તાવેજવર્ણન
યોગદાનડેવલપમેન્ટ સેટઅપ અને માર્ગદર્શિકાઓ
બ્રાન્ચિંગ અને રિલીઝ મોડેલPRs ક્યાં લક્ષિત થાય છે (release/*), અને main તથા ટૅગ્સનો અર્થ શું છે
ફેરફારનો ઇતિહાસદરેક સંસ્કરણનો સંપૂર્ણ રિલીઝ ઇતિહાસ
સુરક્ષા નીતિનબળાઈઓની જાણ કરવાની પ્રક્રિયા અને સુરક્ષા પ્રથાઓ
i18n માર્ગદર્શિકા42 ભાષાઓ માટે સમર્થન, અનુવાદ કાર્યપ્રવાહ, RTL
રિલીઝ ચેકલિસ્ટરિલીઝ પહેલાંના માન્યતા-ચકાસણીના પગલાં
બ્રાન્ચિંગ અને રિલીઝ મોડેલPRs ક્યાં લક્ષિત થાય છે (release/*), તથા main અને ટૅગ્સનો અર્થ શું છે
ફેરફાર નોંધદરેક વર્ઝનનો સંપૂર્ણ રિલીઝ ઇતિહાસ
સુરક્ષા નીતિનબળાઈઓની જાણ કરવા અને સુરક્ષા જાળવવાની પ્રથાઓ
i18n માર્ગદર્શિકા42 ભાષાઓ માટે સપોર્ટ, અનુવાદ કાર્યપ્રવાહ, RTL
રિલીઝ ચેકલિસ્ટરિલીઝ-પૂર્વ માન્યતા ચકાસણીનાં પગલાં
કવરેજ યોજના5,100+ ટ્રૅક કરેલી ટેસ્ટ ફાઇલોમાં 39,000+ સ્ટેટિક ટેસ્ટ ઘોષણાઓ માટેની ટેસ્ટ કવરેજ વ્યૂહરચના
@@ -1364,12 +1364,12 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન # ⭐ ટોચના યોગદાનકર્તાઓ -> OmniRoute એક ઉત્સાહી ઓપન-સોર્સ સમુદાય દ્વારા ઘડાયું છે. આ વ્યક્તિઓએ અસાધારણ યોગદાન આપ્યાં છે, જે પ્રોજેક્ટની ગુણવત્તા, સ્થિરતા અને પહોંચને સીધી અસર કરે છે. **આભાર.** +> OmniRouteને એક ઉત્સાહી ઓપન-સોર્સ સમુદાય આકાર આપે છે. આ વ્યક્તિઓએ એવા અસાધારણ યોગદાનો આપ્યાં છે, જે પ્રોજેક્ટની ગુણવત્તા, સ્થિરતા અને પહોંચ પર સીધી અસર કરે છે. **આભાર.** -### મર્જ થયેલી પુલ રિક્વેસ્ટ્સ અનુસાર બાહ્ય યોગદાનકર્તાઓ +### મર્જ થયેલી પુલ રિક્વેસ્ટ્સ મુજબ બાહ્ય યોગદાનકર્તાઓ - + @@ -1393,9 +1393,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન
ક્રમયોગદાનકર્તામર્જ થયેલા PRs~બદલાયેલી લાઇનો
ક્રમયોગદાનકર્તામર્જ થયેલા PRs~બદલાયેલી પંક્તિઓ
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-2026-08-24 05:26:03 UTC સુધીના મર્જ સાથે, લાઇવ release/v3.8.50 ટિપ dafb4ae808 પર સ્થિર કરાયેલું. પૃષ્ઠાંકિત GitHub GraphQL ગણતરીમાં 5,911 મર્જ થયેલા PRs સામેલ છે: 2,707 રિપોઝિટરીના માલિક દ્વારા, 179 Dependabot દ્વારા અને 535 અલગ-અલગ યોગદાનકર્તાઓ તરફથી 3,025 બાહ્ય PRs. “બદલાયેલી લાઇનો” એટલે GitHub ઉમેરાઓ + કાઢી નાખેલી લાઇનો અને તેમાં જનરેટ કરેલી ફાઇલો, lockfiles, કૅટલૉગ્સ, અનુવાદો અને દસ્તાવેજીકરણ સામેલ છે; તે ફેરફારોનું પ્રમાણ છે, લેખક દ્વારા લખાયેલા LOC નથી. અંતિમ મર્યાદા પરની બરાબરીઓ જાળવી રાખવામાં આવી છે. +2026-08-24 05:26:03 UTC સુધીના મર્જ સહિત, લાઇવ release/v3.8.50 ટિપ dafb4ae808 પર સ્થિર કરાયેલ. પૃષ્ઠાંકિત GitHub GraphQL ગણતરીમાં 5,911 મર્જ થયેલા PRs છે: રિપોઝિટરી માલિક દ્વારા 2,707, Dependabot દ્વારા 179 અને 535 અલગ-અલગ યોગદાનકર્તાઓના 3,025 બાહ્ય PRs. “બદલાયેલી પંક્તિઓ” એટલે GitHub ઉમેરાઓ + કાઢી નાખેલી પંક્તિઓ અને તેમાં જનરેટ કરેલી ફાઇલો, લૉકફાઇલો, કૅટલૉગ્સ, અનુવાદો તથા દસ્તાવેજીકરણનો સમાવેશ થાય છે; આ ફેરફારોનું પ્રમાણ છે, લેખક દ્વારા લખાયેલ LOC નથી. કટઑફ પરના સમાન આંકડા જાળવી રાખવામાં આવ્યા છે. -### GitHub દ્વારા નિર્ધારિત કમિટ્સ +### GitHub દ્વારા એટ્રિબ્યૂટ કરાયેલા કમિટ્સ @@ -1439,7 +1439,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન Markus Hartung
Markus Hartung
- 🏅 GitHub દ્વારા માન્ય 69 કમિટ્સ · #6 માટે સંયુક્ત સ્થાન + 🏅 GitHub દ્વારા માન્ય 69 કમિટ્સ · સંયુક્ત ક્રમાંક #6 @@ -1448,7 +1448,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન Dizzle
Dizzle
- 🏅 GitHub દ્વારા માન્ય 69 કમિટ્સ · #6 માટે સંયુક્ત સ્થાન + 🏅 GitHub દ્વારા માન્ય 69 કમિટ્સ · સંયુક્ત ક્રમાંક #6
@@ -1469,21 +1469,21 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 પણ તેન Bob.Hou
Bob.Hou

- 🏅 GitHub દ્વારા માન્ય 51 કમિટ્સ · #10 માટે સંયુક્ત સ્થાન + 🏅 GitHub દ્વારા માન્ય 51 કમિટ્સ · સંયુક્ત ક્રમાંક #10
Xiangzhe
Xiangzhe

- 🏅 GitHub દ્વારા માન્ય 51 કમિટ્સ · #10 માટે સંયુક્ત સ્થાન + 🏅 GitHub દ્વારા માન્ય 51 કમિટ્સ · સંયુક્ત ક્રમાંક #10
-2026-08-24 06:14:31 UTCના રોજ ફરી તપાસવામાં આવ્યું: ડિફૉલ્ટ શાખા release/v3.8.50 માટે રિપોઝિટરીના Contributors API દ્વારા અહેવાલ અપાયેલી GitHub દ્વારા માન્ય કમિટ્સ. APIએ 525 ઓળખો (415 વપરાશકર્તાઓ, 2 બોટ્સ, 108 અનામી) પરત કરી; આ કોષ્ટક જાળવણીકર્તા, બોટ્સ અને અનામી ઓળખોને બાકાત રાખે છે અને સ્પર્ધાત્મક સંયુક્ત સ્થાનો જાળવી રાખે છે. તે ઉપરના મર્જ કરેલા PRના ક્રમ અને નીચેની 639-વ્યક્તિઓની Git-મેટાડેટા ગણતરી—બંને કરતાં અલગ છે. +2026-08-24 06:14:31 UTCના રોજ ફરી તપાસવામાં આવ્યું: release/v3.8.50 ડિફૉલ્ટ બ્રાન્ચ માટે રિપોઝિટરી Contributors API દ્વારા અહેવાલ આપવામાં આવેલી GitHub દ્વારા માન્ય કમિટ્સ. APIએ 525 ઓળખો (415 વપરાશકર્તાઓ, 2 બોટ્સ, 108 અનામી) પરત કરી; આ કોષ્ટકમાં મેન્ટેનર, બોટ્સ અને અનામી ઓળખોને બાકાત રાખવામાં આવ્યા છે અને સ્પર્ધાત્મક ટાઇ જાળવી રાખવામાં આવી છે. તે ઉપરના મર્જ થયેલા PRના રેન્કિંગ અને નીચેની 639 વ્યક્તિઓની Git-મેટાડેટા ગણતરી—બંનેથી અલગ છે. -> 🙏 આ યોગદાનકર્તાઓની સુવિધાઓ, બગ સુધારાઓ અને ઇન્ફ્રાસ્ટ્રક્ચર સુધારાઓ OmniRouteને વિશ્વસનીય અને સુવિધાસભર બનાવે છે તેનો **મુખ્ય ભાગ** છે. દરેક પુલ રિક્વેસ્ટ, દરેક ટેસ્ટ કેસ અને દરેક i18n અનુવાદ ફાઇલ મહત્ત્વપૂર્ણ છે. ઓપન સોર્સ તેમના જેવા લોકો દ્વારા બનાવવામાં આવે છે. +> 🙏 આ યોગદાનકર્તાઓની સુવિધાઓ, બગ સુધારાઓ અને ઇન્ફ્રાસ્ટ્રક્ચર સુધારાઓ OmniRouteને વિશ્વસનીય અને સુવિધાસમૃદ્ધ બનાવતા પરિબળોનો **મુખ્ય ભાગ** છે. દરેક પુલ રિક્વેસ્ટ, દરેક ટેસ્ટ કેસ અને દરેક i18n અનુવાદ ફાઇલ મહત્ત્વપૂર્ણ છે. ઓપન સોર્સ તેમના જેવા લોકો દ્વારા બનાવવામાં આવે છે. diff --git a/docs/i18n/gu/SECURITY.md b/docs/i18n/gu/SECURITY.md index 8834808e7c9e..c533b1babb60 100644 --- a/docs/i18n/gu/SECURITY.md +++ b/docs/i18n/gu/SECURITY.md @@ -220,35 +220,37 @@ docker run -d \ 10. **`env` વિકલ્પ મારફતે `exec()` / `spawn()` runtime મૂલ્યો** — બાહ્ય પાથ અથવા અવિશ્વસનીય મૂલ્યોને shell મારફતે પસાર થતી સ્ક્રિપ્ટ્સમાં ક્યારેય string-interpolate ન કરો. સંદર્ભ: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **સુરક્ષિત-બાય-ડિફૉલ્ટ લાઇબ્રેરીઓને પ્રાધાન્ય આપો** — [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) જુઓ (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). પોતાનું સોલ્યુશન બનાવતાં પહેલાં તેમનો ઉપયોગ કરો. -## સપ્લાય-ચેઇન સ્કેનરના તારણો (Socket.dev / Snyk / સમાન) +## સપ્લાય-ચેઇન સ્કેનરનાં તારણો (Socket.dev / Snyk / સમાન) -પ્રકાશિત `omniroute` npm આર્ટિફેક્ટ Next.js `output: "standalone"` -બિલ્ડને બંડલ કરે છે, જેનો અર્થ એ છે કે દરેક રૂટ હેન્ડલર — જેમાં દસ્તાવેજીકૃત વિશેષાધિકારયુક્ત -સુવિધાઓ (MITM, Zed ઇમ્પોર્ટ, Cloud Sync, એમ્બેડેડ સર્વિસ સુપરવાઇઝર) પણ સામેલ છે — અંતે -`.next/server/*.js` મિનિફાઇડ ચંક્સમાં સમાવિષ્ટ થાય છે. હ્યુરિસ્ટિક સપ્લાય-ચેઇન સ્કેનરો -વારંવાર આ ચંક્સને માલવેર સિગ્નેચર્સ સાથે પેટર્ન-મૅચ કરે છે. +> **કાર્યક્ષેત્ર નોંધ:** રિપોઝિટરીના રૂટ પરની `socket.yml` ફક્ત પ્રકાશિત npm આર્ટિફેક્ટના Socket.devના રજિસ્ટ્રી-સાઇડ પોસ્ટ-પબ્લિશ સ્કેન માટે `projectIgnorePaths`ને આકાર આપે છે — તે અમલમાં મૂકાયેલ CI/PR મર્જ ગેટ નથી. `.github/workflows`માં કોઈ workflow, `package.json`માં કોઈ script અને કોઈ `Makefile` target Socket.devને ચલાવતું નથી. -અમે ઉપયોગ કરીએ છીએ તે સ્કેનર કૉન્ફિગરેશન રિપોઝિટરીના રૂટમાં -[`socket.yml`](socket.yml) ખાતે છે (Socket.dev GitHub App ફોર્મેટ v2 — જુઓ -). તે સ્પષ્ટ રીતે વિતરિત ન થતી -ડિરેક્ટરીઓ (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/`, વગેરે)ને બાકાત રાખે છે, જેથી સ્કેનર માત્ર એવા કોડ પાથ વિશે -રિપોર્ટ કરે છે જે વાસ્તવમાં પ્રકાશિત પૅકેજના વપરાશકર્તાઓ સુધી પહોંચે છે — સ્કેન પોતે આ -ફાઇલ વાંચતી Socket GitHub App દ્વારા ચલાવવામાં આવે છે, આ રિપોઝિટરીના કોઈ વર્કફ્લો દ્વારા નહીં. +પ્રકાશિત `omniroute` npm આર્ટિફેક્ટ Next.jsનું `output: "standalone"` +બિલ્ડ બંડલ કરે છે, જેનો અર્થ એ છે કે દરેક route handler — દસ્તાવેજીકૃત વિશેષાધિકૃત +સુવિધાઓ (MITM, Zed import, Cloud Sync, એમ્બેડેડ service supervisor) સહિત — +`.next/server/*.js`ની minified chunksમાં સમાવિષ્ટ થાય છે. હ્યુરિસ્ટિક સપ્લાય-ચેઇન સ્કેનર્સ +વારંવાર તે chunksને માલવેર signatures સાથે pattern-match કરે છે. -દરેક તારણ શ્રેણી માટે અમે દરેક તારણ દીઠ મેઇન્ટેનર પ્રમાણન જાળવીએ છીએ: +અમે ઉપયોગ કરીએ છીએ તે સ્કેનર configuration રિપોઝિટરીના રૂટમાં +[`socket.yml`](socket.yml) ખાતે છે (Socket.dev GitHub App format v2 — જુઓ +). તે સ્પષ્ટપણે વિતરણ ન થતી +directories (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/`, વગેરે)ને બાકાત રાખે છે, જેથી સ્કેનર માત્ર એવા code paths અંગે +રિપોર્ટ કરે જે ખરેખર પ્રકાશિત વપરાશકર્તાઓ સુધી પહોંચે છે — સ્કેન પોતે આ રિપોઝિટરીમાંના +workflow દ્વારા નહીં, પરંતુ તે ફાઇલ વાંચતી Socket GitHub App દ્વારા ચલાવવામાં આવે છે. + +દરેક તારણની શ્રેણી માટે અમે તારણ-દીઠ maintainer attestation જાળવીએ છીએ: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - દરેક તારણનો નકશો: સોર્સ ફાઇલ ↔ ફ્લૅગ કરાયેલ ચંક ↔ વર્તન ↔ - v3.8.6માં લાગુ કરાયેલ નિવારણ. -- દરેક ફ્લૅગ કરાયેલ ફંક્શન પરના ઇન-સોર્સ `SECURITY-AUDITOR-NOTE:` બ્લૉક્સ - એ જ દસ્તાવેજ તરફ નિર્દેશ કરે છે. - -જે વપરાશકર્તાઓની પાઇપલાઇન આ ચેતવણીને શિથિલ કરી શકતી નથી તેમના માટે: -`OMNIROUTE_BUILD_PROFILE=minimal npm run build` વડે બિલ્ડ કરો. આ ચાર -સંવેદનશીલ મોડ્યુલોને એવા સ્ટબ્સથી બદલે છે જે રનટાઇમ પર HTTP 503 -`feature-disabled` પરત કરે છે, જેથી વિશેષાધિકારયુક્ત કોડ પાથ બંડલમાં ભૌતિક રીતે -હાજર રહેતા નથી. પ્રકાશન પ્રક્રિયા માટે + તારણ-દીઠ નકશો: source file ↔ ધ્વજાંકિત chunk ↔ વર્તણૂક ↔ v3.8.6માં + લાગુ કરાયેલ mitigation. +- દરેક ધ્વજાંકિત function પરના in-source `SECURITY-AUDITOR-NOTE:` blocks + એ જ દસ્તાવેજ તરફ સંદર્ભ આપે છે. + +જે વપરાશકર્તાઓની pipeline alertને શિથિલ કરી શકતી નથી તેમના માટે: +`OMNIROUTE_BUILD_PROFILE=minimal npm run build` વડે build કરો. આ ચાર +સંવેદનશીલ modulesને એવા stubsથી બદલે છે જે runtime પર HTTP 503 +`feature-disabled` પરત કરે છે, જેથી વિશેષાધિકૃત code paths bundleમાંથી ભૌતિક રીતે +ગેરહાજર રહે છે. પ્રકાશન પ્રક્રિયા માટે [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) જુઓ. diff --git a/docs/i18n/gu/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/gu/docs/architecture/CODEBASE_DOCUMENTATION.md index de68c326f505..a85d626c5c26 100644 --- a/docs/i18n/gu/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/gu/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,8 @@ server/ ## 4. `open-sse/` — સ્ટ્રીમિંગ એન્જિન વર્કસ્પેસ -`@omniroute/open-sse` તરીકે પ્રકાશિત થયેલું અલગ npm વર્કસ્પેસ. તે વિનંતી -પ્રોસેસિંગ, એક્ઝિક્યુટર્સ, ટ્રાન્સલેટર્સ, સર્વિસિસ, ટ્રાન્સફોર્મર અને MCP સર્વરને સંભાળે છે. +`@omniroute/open-sse` તરીકે પ્રકાશિત થયેલ અલગ npm વર્કસ્પેસ. તે વિનંતી +પ્રક્રિયાકરણ, એક્ઝિક્યુટર્સ, ટ્રાન્સલેટર્સ, સેવાઓ, ટ્રાન્સફોર્મર અને MCP સર્વરનું સંચાલન કરે છે. ``` open-sse/ @@ -450,30 +450,30 @@ open-sse/ ├── executors/ 108 પ્રોવાઇડર-વિશિષ્ટ HTTP એક્ઝિક્યુટર્સ ├── translator/ ફોર્મેટ રૂપાંતરણ (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions સ્ટ્રીમ ટ્રાન્સફોર્મર -├── services/ 80+ સર્વિસ મોડ્યુલ્સ (કોમ્બોઝ, ફૉલબૅક, ક્વોટા, ઓળખ, …) +├── services/ 80+ સેવા મોડ્યુલ્સ (કોમ્બોઝ, ફૉલબૅક, ક્વોટા, ઓળખ, …) ├── utils/ સ્ટ્રીમિંગ સહાયકો, TLS ક્લાયન્ટ, AWS SigV4, પ્રોક્સી ફેચ, … └── mcp-server/ MCP સર્વર (3 ટ્રાન્સપોર્ટ્સ, 33 સ્કોપ્સ, 110 ટૂલ્સ) ``` ### 4.1 `open-sse/handlers/` -| હેન્ડલર | હેતુ | -| ----------------------- | ----------------------------------------------------------------------- | -| `chatCore.ts` | મુખ્ય ચેટ પાઇપલાઇન (કૅશ, રેટ લિમિટ, કોમ્બો રૂટિંગ, એક્ઝિક્યુટર ડિસ્પૅચ) | -| `responsesHandler.ts` | OpenAI Responses API પ્રવેશ બિંદુ | -| `embeddings.ts` | એમ્બેડિંગ્સ | -| `imageGeneration.ts` | ઇમેજ જનરેશન | -| `audioSpeech.ts` | ટેક્સ્ટ-ટુ-સ્પીચ | -| `audioTranscription.ts` | સ્પીચ-ટુ-ટેક્સ્ટ | -| `videoGeneration.ts` | વિડિયો જનરેશન | -| `musicGeneration.ts` | સંગીત જનરેશન | -| `rerank.ts` | પુનઃક્રમનિર્ધારણ | -| `moderations.ts` | મોડરેશન | -| `search.ts` | વેબ શોધ | -| `sseParser.ts` | SSE ઇવેન્ટ પાર્સર | -| `usageExtractor.ts` | અપસ્ટ્રીમ સ્ટ્રીમ્સમાંથી ટોકન ગણતરીઓ મેળવવી | -| `responseSanitizer.ts` | પ્રોવાઇડર-વિશિષ્ટ અવાંછિત સામગ્રી દૂર કરવી | -| `responseTranslator.ts` | પ્રોવાઇડર પ્રતિસાદ અને ટ્રાન્સલેટર સ્તર વચ્ચેનું સંયોજન | +| હેન્ડલર | હેતુ | +| ----------------------- | ------------------------------------------------------------------------ | +| `chatCore.ts` | મુખ્ય ચેટ પાઇપલાઇન (કૅશ, દર મર્યાદા, કોમ્બો રૂટિંગ, એક્ઝિક્યુટર ડિસ્પેચ) | +| `responsesHandler.ts` | OpenAI Responses API પ્રવેશ બિંદુ | +| `embeddings.ts` | એમ્બેડિંગ્સ | +| `imageGeneration.ts` | ઇમેજ જનરેશન | +| `audioSpeech.ts` | ટેક્સ્ટ-ટુ-સ્પીચ | +| `audioTranscription.ts` | સ્પીચ-ટુ-ટેક્સ્ટ | +| `videoGeneration.ts` | વિડિયો જનરેશન | +| `musicGeneration.ts` | સંગીત જનરેશન | +| `rerank.ts` | પુનઃક્રમનિર્ધારણ | +| `moderations.ts` | મોડરેશન | +| `search.ts` | વેબ શોધ | +| `sseParser.ts` | SSE ઇવેન્ટ પાર્સર | +| `usageExtractor.ts` | અપસ્ટ્રીમ સ્ટ્રીમ્સમાંથી ટોકનની સંખ્યા મેળવવી | +| `responseSanitizer.ts` | પ્રોવાઇડર-વિશિષ્ટ બિનજરૂરી સામગ્રી દૂર કરવી | +| `responseTranslator.ts` | પ્રોવાઇડર પ્રતિસાદ અને ટ્રાન્સલેટર સ્તર વચ્ચેનો જોડાણકારી ભાગ | ### 4.2 `open-sse/executors/` @@ -482,16 +482,16 @@ open-sse/ `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, -`pollinations`, `qoder`, `vertex`, `devin-desktop`, તેમજ `claudeIdentity.ts` -(સાંઝો ઓળખ સહાયક) અને `index.ts` (રજિસ્ટ્રી). +`pollinations`, `qoder`, `vertex`, `devin-desktop`, ઉપરાંત `claudeIdentity.ts` +(સહિયારો ઓળખ સહાયક) અને `index.ts` (રજિસ્ટ્રી). -> નોંધ: અહીં સૂચિબદ્ધ ન કરાયેલા પ્રોવાઇડર્સને સામાન્ય -> OpenAI-સુસંગત એક્ઝિક્યુટરનો ઉપયોગ કરીને `default.ts` દ્વારા સેવા આપવામાં આવે છે. સંપૂર્ણ પ્રોવાઇડર કેટલોગ (355 પ્રોવાઇડર્સ) +> નોંધ: અહીં સૂચિબદ્ધ ન હોય તેવા પ્રોવાઇડર્સને સામાન્ય +> OpenAI-સુસંગત એક્ઝિક્યુટરનો ઉપયોગ કરીને `default.ts` દ્વારા સેવા આપવામાં આવે છે. સંપૂર્ણ પ્રોવાઇડર કૅટલૉગ (355 પ્રોવાઇડર્સ) > `src/shared/constants/providers.ts`માં છે. ### 4.3 `open-sse/translator/` -હબ-એન્ડ-સ્પોક અનુવાદ (OpenAI એ હબ છે). +હબ-એન્ડ-સ્પોક અનુવાદ (OpenAI હબ છે). - **9 વિનંતી ટ્રાન્સલેટર્સ** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -506,64 +506,64 @@ open-sse/ `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, ઉપરાંત સહાયક પરીક્ષણો. - **ઇમેજ સહાયકો** (`translator/image/sizeMapper.ts`). -- ટોચનું સ્તર: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. +- ટોચના સ્તરે: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-આધારિત Responses API ↔ Chat - Completions કન્વર્ટર (`responses/` રૂટ કૅચ-ઑલ દ્વારા ઉપયોગમાં લેવાતું). + Completions કન્વર્ટર (`responses/` રૂટ કૅચ-ઑલ દ્વારા ઉપયોગમાં લેવાય છે). ### 4.5 `open-sse/services/` -મુખ્ય બાબતો (સંપૂર્ણ સૂચિ `open-sse/services/` હેઠળ): - -| ચિંતા ક્ષેત્ર | ફાઇલો | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| કોમ્બો રૂટિંગ | `combo.ts` (19 વ્યૂહરચનાઓ), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| ઑટો કોમ્બો એન્જિન | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| સ્થિતિસ્થાપકતા | `accountFallback.ts` (કૂલડાઉન + લૉકઆઉટ), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| ક્વોટા | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| કૅશિંગ | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| રૂટિંગ ઇન્ટેલિજન્સ | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| મૉડલ હૅન્ડલિંગ | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| કમ્પ્રેશન | `compression/` — સંપૂર્ણ કમ્પ્રેશન એન્જિનનું વાયરિંગ | -| ટોકન + સત્ર | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| ટિયર / મેનિફેસ્ટ | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / નેટવર્ક | `ipFilter.ts`, `webSearchFallback.ts` | -| બૅચ | `batchProcessor.ts` | -| ઉપયોગ | `usage.ts` | +મુખ્ય વિશેષતાઓ (સંપૂર્ણ સૂચિ `open-sse/services/` હેઠળ): + +| ચિંતા ક્ષેત્ર | ફાઇલો | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| કોમ્બો રાઉટિંગ | `combo.ts` (19 વ્યૂહરચનાઓ), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| ઑટો કોમ્બો એન્જિન | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| સ્થિતિસ્થાપકતા | `accountFallback.ts` (કૂલડાઉન + લૉકઆઉટ), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| ક્વોટા | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| કૅશિંગ | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| રાઉટિંગ બુદ્ધિમત્તા | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| મૉડલ સંચાલન | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| કમ્પ્રેશન | `compression/` — સંપૂર્ણ કમ્પ્રેશન એન્જિનનું વાયરિંગ | +| ટોકન + સત્ર | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| ટિયર / મેનિફેસ્ટ | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / નેટવર્ક | `ipFilter.ts`, `webSearchFallback.ts` | +| બૅચ | `batchProcessor.ts` | +| વપરાશ | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- `server.ts`માં વાયર કરેલાં **110 અનન્ય ટૂલ્સ** (`schemas/tools.ts`માં 45 પ્રમાણભૂત + - મેમરી, સ્કિલ્સ, GitHub-સ્કિલ્સ, પૂલ, ગેમિફિકેશન, પ્લગિન, Notion, Obsidian, +- `server.ts`માં **110 અનન્ય ટૂલ્સ** જોડાયેલા છે (`schemas/tools.ts`માં 45 પ્રમાણભૂત + + મેમરી, કૌશલ્યો, GitHub-કૌશલ્યો, પૂલ, ગેમિફિકેશન, પ્લગઇન, Notion, Obsidian, લોકલ-કોર્પસ અને કમ્પ્રેશન મૉડ્યુલો — યુનિયનની ગણતરી `countUniqueMcpTools` દ્વારા થાય છે). - **3 ટ્રાન્સપોર્ટ્સ**: stdio, HTTP Streamable, SSE. -- રનટાઇમ પર **33 સ્કોપ્સ** લાગુ કરવામાં આવે છે — મૂળભૂત સૂચિ `src/shared/constants/mcpScopes.ts`માં છે, સંપૂર્ણ સેટ દરેક ટૂલ મૉડ્યુલ દ્વારા જાહેર કરાયેલા સ્કોપ્સનું યુનિયન છે. -- ઑડિટ ટેબલ: `mcp_tool_audit` (`audit.ts` દ્વારા ભરવામાં આવે છે). +- રનટાઇમ પર **33 સ્કોપ્સ** લાગુ કરવામાં આવે છે — મૂળ સૂચિ `src/shared/constants/mcpScopes.ts`માં છે; સંપૂર્ણ સમૂહ દરેક ટૂલ મૉડ્યુલ દ્વારા જાહેર કરાયેલા સ્કોપ્સનું યુનિયન છે. +- ઑડિટ કોષ્ટક: `mcp_tool_audit` (`audit.ts` દ્વારા ભરવામાં આવે છે). - ફાઇલો: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - ઉપરાંત `__tests__/` હેઠળનાં પરીક્ષણો. + તેમજ `__tests__/` હેઠળના પરીક્ષણો. - સંપૂર્ણ ટૂલ કૅટલૉગ માટે [MCP-SERVER.md](../frameworks/MCP-SERVER.md) જુઓ. ### 4.7 `open-sse/config/` પ્રોવાઇડર રજિસ્ટ્રીઓ (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), પ્રત્યેક ફૉર્મેટ માટેની મૉડલ રજિસ્ટ્રીઓ (`audioRegistry.ts`, +`providerHeaderProfiles.ts`), દરેક ફૉર્મેટ માટેની મૉડલ રજિસ્ટ્રીઓ (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), ઓળખ સહાયકો (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), ક્રેડેન્શિયલ સહાયકો (`credentialLoader.ts`, `codexClient.ts`), અને ક્લાઉડ -ઍડૅપ્ટર્સ (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, +ઍડેપ્ટરો (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). ### 4.8 `open-sse/utils/` -સ્ટ્રીમિંગ પ્રિમિટિવ્સ અને પ્રોવાઇડર હેલ્પર્સ: `stream.ts`, `streamHandler.ts`, +સ્ટ્રીમિંગ પ્રિમિટિવ્સ અને પ્રોવાઇડર સહાયકો: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/gu/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/gu/docs/architecture/RESILIENCE_GUIDE.md index a4db904de94c..f91e5c0d105f 100644 --- a/docs/i18n/gu/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/gu/docs/architecture/RESILIENCE_GUIDE.md @@ -69,9 +69,9 @@ OmniRoute પાસે ત્રણ અલગ પરંતુ પરસ્પર ## 2. કનેક્શન કૂલડાઉન -**વ્યાપ:** એક પ્રદાતા કનેક્શન/એકાઉન્ટ/કી. +**વ્યાપ:** એકલ પ્રદાતા કનેક્શન/એકાઉન્ટ/કી. -**હેતુ:** સમાન પ્રદાતાનાં અન્ય કનેક્શનો સેવા આપવાનું ચાલુ રાખે ત્યારે એક ખામીયુક્ત કીને અવગણવી. +**હેતુ:** સમાન પ્રદાતાનાં અન્ય કનેક્શનો સેવા આપવાનું ચાલુ રાખે ત્યારે એક ખરાબ કીને અવગણવી. **અમલીકરણ:** @@ -80,7 +80,7 @@ OmniRoute પાસે ત્રણ અલગ પરંતુ પરસ્પર - કૂલડાઉનની ગણતરી: `open-sse/services/accountFallback.ts::checkFallbackError()` - સેટિંગ્સ: `src/lib/resilience/settings.ts` -**પ્રત્યેક કનેક્શન માટેનાં ફીલ્ડ્સ:** +**દરેક કનેક્શન માટેનાં ફીલ્ડ્સ:** - `rateLimitedUntil` — કૂલડાઉન સમાપ્ત થાય ત્યાં સુધીનો ટાઇમસ્ટૅમ્પ - `testStatus: "unavailable"` @@ -91,72 +91,131 @@ OmniRoute પાસે ત્રણ અલગ પરંતુ પરસ્પર - OAuth આધાર: 5s - API-key આધાર: 3s -- API-key 429: અપસ્ટ્રીમ `Retry-After`/રીસેટ હેડર્સ/પાર્સ કરી શકાય તેવા રીસેટ ટેક્સ્ટને પ્રાધાન્ય આપે છે +- API-key 429: અપસ્ટ્રીમ `Retry-After`/રીસેટ હેડર્સ/પાર્સ કરી શકાય તેવા રીસેટ ટેક્સ્ટને પ્રાથમિકતા આપે છે - બૅકઑફ: `baseCooldownMs * 2 ** failureIndex` -**થન્ડરિંગ-હર્ડ વિરોધી સુરક્ષા:** સમકાલીન નિષ્ફળતાઓને કારણે કૂલડાઉન વધુ પડતું લંબાવાતું અથવા `backoffLevel` બે વાર વધતું અટકાવે છે. +**એકસાથે ભારે ધસારો રોકવા માટેનું સુરક્ષાકવચ:** સમકાલીન નિષ્ફળતાઓને કૂલડાઉન અતિશય લંબાવવાથી અથવા `backoffLevel`ને બે વાર વધારવાથી રોકે છે. -**ટર્મિનલ સ્થિતિઓ (કૂલડાઉન નથી):** +**અંતિમ અવસ્થાઓ (કૂલડાઉન નથી):** -- `banned` — પ્રતિબંધિત-કીવર્ડ / એકાઉન્ટ-પ્રતિબંધ શોધ દ્વારા સેટ થાય છે ([BAN_DETECTION](../security/BAN_DETECTION.md) જુઓ), તેમજ અપસ્ટ્રીમ દ્વારા પ્રતિ-વિનંતી સતત ત્રણ વાર ઇનકાર (`request_rejected`, દા.ત. Anthropic OAuth 403 "વિનંતીને મંજૂરી નથી" — `open-sse/services/requestRejectedStreak.ts`) કરવામાં આવે ત્યારે સેટ થાય છે; એક જ ઇનકાર માત્ર કનેક્શનને કૂલડાઉનમાં મૂકે છે -- `expired` (મર્યાદિત પુનઃપ્રયાસો પછી ટર્મિનલ સ્થિતિમાં પરિવર્તિત થાય છે — એક્સ્પોનેન્શિયલ બૅકઑફ સાથે `EXPIRED_RETRY_MAX = 3` — જેથી ક્ષણિક OAuth ભૂલો એકાઉન્ટ કાયમી રીતે નિષ્ક્રિય થાય તે પહેલાં આપમેળે સુધરી શકે) +- `banned` — પ્રતિબંધિત-કીવર્ડ / એકાઉન્ટ-બૅન શોધ દ્વારા સેટ થાય છે ([BAN_DETECTION](../security/BAN_DETECTION.md) જુઓ), તેમજ સતત ત્રણ અપસ્ટ્રીમ પ્રતિ-વિનંતી ઇનકારો (`request_rejected`, દા.ત. Anthropic OAuth 403 "વિનંતીની મંજૂરી નથી" — `open-sse/services/requestRejectedStreak.ts`) દ્વારા; એક જ ઇનકાર ફક્ત કનેક્શનને કૂલડાઉનમાં મૂકે છે +- `expired` (મર્યાદિત પુનઃપ્રયાસો પછી અંતિમ અવસ્થામાં પરિવર્તિત થાય છે — એક્સ્પોનેન્શિયલ બૅકઑફ સાથે `EXPIRED_RETRY_MAX = 3` — જેથી ક્ષણિક OAuth ભૂલો એકાઉન્ટને કાયમી રીતે નિષ્ક્રિય કરવામાં આવે તે પહેલાં જાતે સુધરી શકે) - `credits_exhausted` -ક્રેડેન્શિયલ્સ બદલાય અથવા ઑપરેટર તેમને રીસેટ કરે ત્યાં સુધી આ સ્થિતિઓ જળવાઈ રહે છે. ક્ષણિક કૂલડાઉન સ્થિતિ વડે ટર્મિનલ સ્થિતિઓને ઓવરરાઇટ કરશો નહીં. +ક્રેડેન્શિયલ્સ બદલાય અથવા ઑપરેટર તેમને રીસેટ કરે ત્યાં સુધી આ અવસ્થાઓ જળવાઈ રહે છે. અંતિમ અવસ્થાઓને ક્ષણિક કૂલડાઉન અવસ્થાથી ઓવરરાઇટ કરશો નહીં. -**લેઝી પુનઃપ્રાપ્તિ:** જ્યારે `rateLimitedUntil` વીતી જાય છે, ત્યારે કનેક્શન ફરીથી પાત્ર બને છે. સફળ ઉપયોગ પર, `clearAccountError()` તમામ ભૂલ ફીલ્ડ્સ સાફ કરે છે. +**લેઝી પુનઃપ્રાપ્તિ:** જ્યારે `rateLimitedUntil` વીતી જાય, ત્યારે કનેક્શન ફરીથી પાત્ર બને છે. સફળ ઉપયોગ પર, `clearAccountError()` ભૂલનાં તમામ ફીલ્ડ્સ સાફ કરે છે. -### સેશન અફિનિટી (#7274) +### Claude OAuth વપરાશ મર્યાદા: ઓછી-પ્રાથમિકતાવાળી લેન + સેશન-મર્યાદા રીસેટ -**વ્યાપ:** એક ક્લાયન્ટ સેશન (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` હેડર), **કોઈપણ** પ્રદાતા માટે એક કનેક્શન સાથે પિન કરેલું. +**વ્યાપ:** એક Claude સબ્સ્ક્રિપ્શન (OAuth) કનેક્શન. બંને સુવિધાઓ **દરેક +કનેક્શન માટે સ્વૈચ્છિક રીતે સક્ષમ કરવાની છે** (કનેક્શન સંપાદિત કરો → Claude વિભાગ → `providerSpecificData`માં +`lowPriorityMode` / `autoLimitReset`, બંને ડિફૉલ્ટ રૂપે બંધ) અને Claude Codeનાં `/low-priority` તથા +`/limit-reset` કમાન્ડ્સનું પ્રતિબિંબ પાડે છે (Claude Code 2.1.263માંથી મેળવેલો વાયર કૉન્ટ્રેક્ટ). -**હેતુ:** મલ્ટિ-ટર્ન એજન્ટને (Claude Code, aider, કસ્ટમ એજન્ટ્સ) વિનંતીઓમાં સમાન એકાઉન્ટ પર જાળવી રાખવું, જેથી એકાઉન્ટ્સ વચ્ચેનો કૉન્ટેક્સ્ટ લૉસ અને પ્રતિ-એકાઉન્ટ સેશન સ્ટેટ ધરાવતા પ્રદાતાઓ પર વારંવાર થતા કોલ્ડ-સ્ટાર્ટ 429 ઘટે. +**અમલીકરણ:** + +- સ્ટેટ મશીન + પ્રતિસાદનું વર્ગીકરણ: `open-sse/services/claudeLowPriority.ts` +- રીસેટ સ્ટેટસ/ક્લેમ ક્લાયન્ટ: `open-sse/services/claudeLimitReset.ts` +- એક્ઝિક્યુટર હૂક (હેડર ઇન્જેક્શન + સમાન-એકાઉન્ટ પુનઃપ્રયાસ): `open-sse/executors/base.ts::execute()` +- સ્વૈચ્છિક સક્ષમતાની પર્સિસ્ટન્સ: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**ટ્રિગર:** 5-કલાકની વપરાશ મર્યાદા — એવો `429` જેના હેડર્સમાં +`anthropic-ratelimit-unified-status: rejected` હોય અને, એકાઉન્ટ પાત્ર હોય ત્યારે, +`anthropic-ratelimit-unified-slow-offer: treatment` હોય. તે પ્રથમ મર્યાદા +429 પહેલાં કંઈ મોકલવામાં આવતું નથી; યુનિફાઇડ હેડર્સ વિનાનો બર્સ્ટ 429 સામાન્ય કૂલડાઉન પાથમાંથી પસાર થાય છે. + +**ઓછી-પ્રાથમિકતાવાળી લેન** (`lowPriorityMode`): + +- મર્યાદા 429 પર એક્ઝિક્યુટર ઑફર સ્વીકારે છે અને `anthropic-usage-limit: slow` સાથે **સમાન** + એકાઉન્ટનો તરત જ પુનઃપ્રયાસ કરે છે; જાહેર કરેલા `anthropic-ratelimit-unified-reset` (+60s ગ્રેસ) સુધી + લેન સક્રિય રહે છે અને તે સમયગાળાની દરેક વિનંતીમાં હેડર હોય છે. અવરોધાયેલ 429 ક્યારેય + `handleChatCore` સુધી પહોંચતો નથી, તેથી કનેક્શનને કૂલડાઉનમાં **મૂકવામાં આવતું નથી** અને તેનાથી દૂર રોટેટ પણ કરાતું નથી. +- પછીના પ્રતિસાદો પર `anthropic-ratelimit-unified-slow-status`: `active` / `not_needed` + લેનને ચાલુ રાખે છે; `slot_busy` (429) અથવા `529` સર્વરના + `anthropic-ratelimit-unified-slow-retry-after`ની રાહ જુએ છે (ડિફૉલ્ટ 20s, 5–600s સુધી ક્લૅમ્પ, ±30% જિટર) + અને `anthropic-ratelimit-unified-slow-max-wait` દ્વારા મર્યાદિત રહીને પુનઃપ્રયાસ કરે છે (ડિફૉલ્ટ 20 min, ક્લૅમ્પ + 1 min–6 h) — તેનાથી વધુ સમય વીતે તો લેન સમાપ્ત થાય છે અને 10-મિનિટનો કૂલ-ઑફ ફરીથી સ્વીકારવાનું અવરોધે છે. રાહ જોવાનો + સમય વિનંતીના પોતાના અપસ્ટ્રીમ-સ્ટાર્ટ ટાઇમઆઉટમાંથી બાકી રહેલા સમય + (`resolveFetchStartTimeout`, ડિફૉલ્ટ રૂપે 10 min)માંથી 5 s માર્જિન ઘટાડીને પણ મર્યાદિત કરવામાં આવે છે: તે મર્યાદા વિના + 20-મિનિટનો ડિફૉલ્ટ મહત્તમ-રાહ સમય વિનંતી કરતાં વધુ ચાલે અને રાહ જોવાની મધ્યમાં સ્લીપ રદ થઈ જાય, + જેના કારણે સુગમ `max_wait` સમાપ્તિ + કૂલ-ઑફના બદલે `TimeoutError` દેખાય. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, 5h-વિન્ડો રોલઓવર, અથવા + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (જે કોઈપણ સ્ટેટસ પર તેને + `extra_usage` તરીકે સમાપ્ત કરે છે, કારણ કે હવે ચૂકવેલ વધારાનો વપરાશ મર્યાદાને આવરી લે છે) લેનને સમાપ્ત કરે છે; ત્યારબાદ + પ્રતિસાદ સામાન્ય કૂલડાઉન પાથમાં જાય છે. જાહેર કરાયેલા બજેટ રીસેટ (≤ 8 days) સુધી `budget_exhausted` + યાદ રાખવામાં આવે છે. +- મર્યાદાની તપાસ એક્ઝિક્યુટરના પોતાના 400-પ્રેરિત પ્રયાસ-અંતર્ગત પુનઃપ્રયાસો (કૉન્ટેક્સ્ટ + એડિટિંગ, થિંકિંગ/એફર્ટ ક્લૅમ્પ્સ, પેરામ ઑટો-લર્ન) પછી ચાલે છે, તેથી ફક્ત તે પુનઃપ્રયાસોમાંના + કોઈ એક પર દેખાતો મર્યાદા 429 પણ કૂલડાઉન પાથ સુધી પહોંચવાને બદલે અવરોધવામાં આવે છે. +- દરેક કનેક્શન માટે સ્ટેટ ઇન-મેમરી હોય છે (રીસ્ટાર્ટને ફરી સ્વીકારવા માટે એક વધારાનો મર્યાદા 429 ખર્ચાય છે). + +**સેશન-મર્યાદા રીસેટ** (`autoLimitReset`, બંને ચાલુ હોય ત્યારે લેન પહેલાં અજમાવવામાં આવે છે): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + બ્લૉક; જ્યારે `arm: "reset"` અને `available: true` હોય ત્યારે, + `{ "program": "juniper_tide" }` સાથે + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` + (`providerSpecificData.organizationUUID`માંથી સંસ્થાનો UUID, બૂટસ્ટ્રૅપ ફૉલબૅક). +- `result: reset|not_limited` → વિનંતીનો પૂર્ણ ઝડપે પુનઃપ્રયાસ થાય છે (કોઈ સ્લો હેડર નહીં). + `already_used` / `not_offered` `next_available_at`ને યાદ રાખે છે (ડિફૉલ્ટ એક અઠવાડિયું); + કોઈપણ નિષ્ફળતા માટે 15 મિનિટનો બૅકઑફ થાય છે. રીસેટ અઠવાડિયામાં એક વાર થાય છે અને હજુ પણ + સાપ્તાહિક મર્યાદામાં ગણાય છે. + +રિગ્રેશન સુરક્ષાકવચ: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + +### સેશન એફિનિટી (#7274) + +**વ્યાપ:** **કોઈપણ** પ્રદાતા માટે, એક કનેક્શન સાથે પિન કરાયેલું એક ક્લાયન્ટ સેશન (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` હેડર). + +**હેતુ:** બહુ-ટર્ન એજન્ટને (Claude Code, aider, કસ્ટમ એજન્ટ્સ) વિનંતીઓ દરમિયાન એક જ એકાઉન્ટ પર જાળવી રાખવો, જેથી ક્રોસ-એકાઉન્ટ સંદર્ભની ખોટ અને પ્રતિ-એકાઉન્ટ સત્ર સ્થિતિ ધરાવતા પ્રદાતાઓ પર વારંવાર થતા કોલ્ડ-સ્ટાર્ટ 429 ઘટાડાય. **અમલીકરણ:** -- TTL રિઝોલ્યુશન: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- પિનની પસંદગી/બનાવટ: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- હેડર એક્સ્ટ્રેક્શન (સામાન્ય, કોઈપણ પ્રદાતા): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- કાયમી સંગ્રહિત પિન ટેબલ: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- સેટિંગ: `sessionAffinityTtlMs` (msમાં ગ્લોબલ TTL, `0` તેને નિષ્ક્રિય કરે છે) — `src/lib/db/settings.ts`. માઇગ્રેશન `124_generic_session_affinity_ttl.sql` દ્વારા તેનું નામ માત્ર Codex માટેના `codexSessionAffinityTtlMs` પરથી બદલવામાં આવ્યું છે, જે અગાઉ કૉન્ફિગર કરાયેલ કોઈપણ Codex TTLને નવા ડિફૉલ્ટ તરીકે આગળ લઈ જાય છે. +- TTL નિર્ધારણ: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- પિનની પસંદગી/રચના: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- હેડર નિષ્કર્ષણ (સામાન્ય, કોઈપણ પ્રદાતા): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- સંગ્રહિત પિન કોષ્ટક: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- સેટિંગ: `sessionAffinityTtlMs` (msમાં વૈશ્વિક TTL, `0` તેને અક્ષમ કરે છે) — `src/lib/db/settings.ts`. માઇગ્રેશન `124_generic_session_affinity_ttl.sql` દ્વારા માત્ર Codex માટેના `codexSessionAffinityTtlMs`માંથી તેનું નામ બદલવામાં આવ્યું છે, જે અગાઉ ગોઠવાયેલ કોઈપણ Codex TTLને નવા ડિફૉલ્ટ તરીકે આગળ લઈ જાય છે. -#7274 પહેલાં, `resolveSessionAffinityTtlMs()` `codex` સિવાયના દરેક પ્રદાતા માટે તરત જ `0` પર અટકી જતું હતું, તેથી પિનિંગ મિકૅનિઝમ અને હેડર એક્સ્ટ્રેક્શન પહેલેથી જ પ્રદાતા-અજ્ઞેય હોવા છતાં TTL સેટિંગ (અને સેશન હેડર્સ) અન્ય ક્યાંય અસર કરતા નહોતા. સુધારામાં તે વહેલું રિટર્ન દૂર કરવામાં આવ્યું; હવે TTLને ગ્લોબલી `0`થી વધુ સેટ કર્યા પછી તે દરેક પ્રદાતા પર એકસરખું લાગુ પડે છે. +#7274 પહેલાં, `resolveSessionAffinityTtlMs()` એ `codex` સિવાયના દરેક પ્રદાતા માટે તરત જ `0` પરત કરતું હતું, તેથી પિનિંગ પદ્ધતિ અને હેડર નિષ્કર્ષણ પહેલેથી જ પ્રદાતા-નિરપેક્ષ હોવા છતાં TTL સેટિંગ (અને સત્ર હેડર્સ)ની અન્ય કોઈ જગ્યાએ અસર થતી નહોતી. સુધારામાં તે વહેલું રિટર્ન દૂર કરવામાં આવ્યું છે; હવે TTL વૈશ્વિક રીતે `0`થી વધુ મૂલ્ય પર સેટ થયા પછી દરેક પ્રદાતા પર સમાન રીતે લાગુ પડે છે. -ત્રણેય સેશન-અફિનિટી હેડર્સ ક્યારેય અપસ્ટ્રીમ ફૉર્વર્ડ કરવામાં આવતા નથી — એક્ઝિક્યુટર્સ ક્લાયન્ટ હેડર્સને પસાર કરવાને બદલે શરૂઆતથી પોતાના અપસ્ટ્રીમ હેડર્સ બનાવે છે, તેથી આ ફક્ત આંતરિક કોરિલેશન ID તરીકે જ રહે છે. +ત્રણ સત્ર-એફિનિટી હેડર્સ ક્યારેય અપસ્ટ્રીમ ફોરવર્ડ કરવામાં આવતા નથી — એક્ઝિક્યુટર્સ ક્લાયન્ટ હેડર્સને સીધા પસાર કરવાને બદલે શરૂઆતથી પોતાના અપસ્ટ્રીમ હેડર્સ બનાવે છે, તેથી આ માત્ર આંતરિક સહસંબંધ ID તરીકે જ રહે છે. -### એક્સક્લૂસિવ મેનેજ્ડ સેશન કનેક્શન લીઝ +### એક્સક્લુઝિવ મેનેજ્ડ સત્ર કનેક્શન લીઝ -**વ્યાપ:** એક સક્રિય મેનેજ્ડ HTTP ક્લાયન્ટ/સેશન એક પાત્ર OmniRoute કનેક્શનની માલિકી ધરાવે છે. +**વ્યાપ:** એક સક્રિય મેનેજ્ડ HTTP ક્લાયન્ટ/સત્ર એક પાત્ર OmniRoute કનેક્શનની માલિકી ધરાવે છે. -**હેતુ:** વિનંતીઓમાં કડક રાઉટિંગ -ફેન્સની જરૂર હોય તેવા ક્લાયન્ટ્સ માટે ટકાઉ એક્સક્લૂસિવ કનેક્શન માલિકી પ્રદાન કરવી. આ સેશન અફિનિટીથી અલગ છે, જે સૉફ્ટ સાતત્ય પ્રાધાન્ય છે: -એક્સક્લૂસિવ લીઝ SQLiteમાં લાઇફસાઇકલ સ્ટેટ જાળવી રાખે છે, ગ્લોબલ સક્રિય-માલિક અને -સક્રિય-કનેક્શન વિશિષ્ટતા લાગુ કરે છે અને પ્રદાતા ડિસ્પૅચ પહેલાં જૂની જનરેશનને નકારે છે. +**હેતુ:** એવી ક્લાયન્ટ્સ માટે ટકાઉ એક્સક્લુઝિવ કનેક્શન માલિકી પૂરી પાડવી, જેમને વિનંતીઓ વચ્ચે કડક રાઉટિંગ +સીમાની જરૂર હોય. આ સત્ર એફિનિટીથી અલગ છે, જે સાતત્ય માટેની નરમ પસંદગી છે: +એક્સક્લુઝિવ લીઝ SQLiteમાં લાઇફસાઇકલ સ્થિતિ જાળવી રાખે છે, વૈશ્વિક સક્રિય-માલિક અને +સક્રિય-કનેક્શન વિશિષ્ટતા લાગુ કરે છે અને પ્રદાતા ડિસ્પેચ પહેલાં જૂની જનરેશનને નકારી કાઢે છે. -આ સુવિધા દરેક API કી દીઠ ઑપ્ટ-ઇન છે. મેનેજ્ડ કી પાસે `lease:exclusive` સ્કોપ અને -સ્પષ્ટપણે બિન-ખાલી `allowedConnections` સૂચિ હોવી જરૂરી છે. કોઈપણ HTTP ક્લાયન્ટ લાઇફસાઇકલ એન્ડપૉઇન્ટનો ઉપયોગ કરી શકે છે; કોઈ -ક્લાયન્ટ નામ, યુઝર-એજન્ટ, પ્રદાતા, OAuth પદ્ધતિ અથવા મૉડલ જરૂરી નથી. લીઝ કનેક્શનની માલિકી ધરાવે છે, -મૉડલની નહીં, તેથી કનેક્શન સામાન્ય રીતે -પાત્ર રહે ત્યાં સુધી મૉડલ બદલાવ બાઇન્ડિંગ જાળવી રાખે છે. સામાન્ય મૉડલ, ક્વોટા, હેલ્થ, કૂલડાઉન અને અલાઉલિસ્ટ નિયમો અધિકૃત રહે છે અને -સમાન જનરેશનને અન્ય મુક્ત પાત્ર કનેક્શન પર પરિવર્તિત કરી શકે છે. +આ સુવિધા દરેક API કી માટે વૈકલ્પિક છે. મેનેજ્ડ કી પાસે `lease:exclusive` સ્કોપ અને +સ્પષ્ટ, ખાલી ન હોય તેવી `allowedConnections` સૂચિ હોવી આવશ્યક છે. કોઈપણ HTTP ક્લાયન્ટ લાઇફસાઇકલ એન્ડપોઇન્ટનો ઉપયોગ કરી શકે છે; કોઈ +ક્લાયન્ટ નામ, યુઝર-એજન્ટ, પ્રદાતા, OAuth પદ્ધતિ કે મોડલ જરૂરી નથી. લીઝ કનેક્શનની માલિકી ધરાવે છે, +મોડલની નહીં, તેથી કનેક્શન સામાન્ય રીતે પાત્ર રહે ત્યાં સુધી મોડલમાં ફેરફાર થવા છતાં બાઇન્ડિંગ જળવાઈ રહે છે. +સામાન્ય મોડલ, ક્વોટા, હેલ્થ, કૂલડાઉન અને એલાઉલિસ્ટ નિયમો અધિકૃત રહે છે અને +એ જ જનરેશનને અન્ય મુક્ત પાત્ર કનેક્શન પર સ્થાનાંતરિત કરી શકે છે. -લાઇફસાઇકલ JSON ઍક્શન્સ `acquire`, `renew` અને `release` સાથે `POST /api/v1/session-leases` છે. -મેનેજ્ડ ઇન્ફરન્સ વિનંતીઓ અસ્પષ્ટ `X-OmniRoute-Lease-Owner` મૂલ્ય અને ચોક્કસ -`X-OmniRoute-Lease-Generation` રજૂ કરે છે. માલિક `vlo_` પછી 43 base64url અક્ષરોનો ઉપયોગ કરે છે; ફક્ત -તેનો SHA-256 હૅશ સંગ્રહિત થાય છે. દરેક અંતિમ ડિસ્પૅચ ફેન્સ પ્રમાણિત API કી ID અને -સક્રિય કનેક્શન IDને પણ બાઇન્ડ કરે છે. લીઝ કન્ટ્રોલ હેડર્સ લૉગ્સ, જાળવી રાખેલા રિક્વેસ્ટ સ્નૅપશૉટ્સ અને +લાઇફસાઇકલ `POST /api/v1/session-leases` છે, જેમાં JSON ક્રિયાઓ `acquire`, `renew` અને `release` છે. +મેનેજ્ડ ઇન્ફરન્સ વિનંતીઓ અપારદર્શક `X-OmniRoute-Lease-Owner` મૂલ્ય અને ચોક્કસ +`X-OmniRoute-Lease-Generation` રજૂ કરે છે. માલિક `vlo_` પછી 43 base64url અક્ષરોનો ઉપયોગ કરે છે; માત્ર +તેનો SHA-256 હૅશ સંગ્રહવામાં આવે છે. દરેક અંતિમ ડિસ્પેચ સીમા પ્રમાણિત API કી ID અને +સક્રિય કનેક્શન IDને પણ બાઇન્ડ કરે છે. લીઝ નિયંત્રણ હેડર્સ લૉગ્સ, જાળવી રાખેલા વિનંતી સ્નૅપશૉટ્સ અને અપસ્ટ્રીમ એક્ઝિક્યુટર હેડર્સમાંથી દૂર કરવામાં આવે છે. -જો સામાન્ય રાઉટિંગ પાસે પાત્ર મેનેજ્ડ ઉમેદવારો હોય, પરંતુ દરેક મુક્ત ઉમેદવાર વિદેશી સક્રિય લીઝના કબજામાં હોય, તો -OmniRoute HTTP `429`, lease-capacity-unavailable કોડ, -waiting-for-capacity સ્થિતિ અને સૌથી વહેલી સંબંધિત સમાપ્તિ પરથી મેળવેલું મર્યાદિત `Retry-After` પરત કરે છે. -સામાન્ય ખાલી પાત્રતા લીઝ વિવાદ નથી અને તેના હાલના રાઉટિંગ ભૂલના અર્થશાસ્ત્રને જાળવી રાખે છે. +જો સામાન્ય રાઉટિંગમાં પાત્ર મેનેજ્ડ ઉમેદવારો હોય પરંતુ દરેક મુક્ત ઉમેદવાર પર +વિદેશી સક્રિય લીઝનો કબજો હોય, તો OmniRoute HTTP `429`, lease-capacity-unavailable કોડ, +ક્ષમતાની રાહ જોવાની સ્થિતિ અને સૌથી વહેલી સંબંધિત સમાપ્તિ પરથી મેળવેલ મર્યાદિત `Retry-After` પરત કરે છે. +સામાન્ય ખાલી પાત્રતા લીઝ વિવાદ નથી અને તેની હાલની રાઉટિંગ ભૂલની અર્થવ્યવસ્થા જાળવી રાખે છે. -સંબંધિત મિકૅનિઝમ્સ અલગ રહે છે: +સંબંધિત પદ્ધતિઓ અલગ રહે છે: -- OAuth સેશન ઑક્યુપન્સી OAuth એકાઉન્ટ્સ માટે પ્રોસેસ-લોકલ સૉફ્ટ વિતરણ છે. +- OAuth સત્ર ઑક્યુપન્સી એ OAuth એકાઉન્ટ્સ માટે પ્રક્રિયા-સ્થાનિક નરમ વિતરણ છે. - એકાઉન્ટ સેમાફોર્સ વિનંતી-સમકાલીનતા પરમિટ આપે છે અને વિનંતી પૂર્ણ થાય ત્યારે સમાપ્ત થાય છે. -- એક્સક્લૂસિવ મેનેજ્ડ સેશન લીઝ એ જનરેશન ફેન્સ સાથેની ટકાઉ લાઇફસાઇકલ માલિકી છે. +- એક્સક્લુઝિવ મેનેજ્ડ સત્ર લીઝ એ જનરેશન સીમા સાથેની ટકાઉ લાઇફસાઇકલ માલિકી છે. --- @@ -290,52 +349,76 @@ Gemini-શ્રેણીની TPM/RPM વિન્ડો (~60s retry-after)ન --- -## 5. વિનંતી કતાર પ્રવેશ નિયંત્રણ (v3.8.49 · issue #6593) - -**વ્યાપ**: સ્થાનિક પ્રતિ-પ્રોવાઇડર+કનેક્શન દર-મર્યાદા કતાર (`open-sse/services/rateLimitManager.ts`, -Bottleneck દ્વારા સમર્થિત), જે ઉપરના ત્રણ મિકેનિઝમથી એક સ્તર નીચે છે. - -**`maxWaitMs` એ એક્ઝિક્યુશન સમાપ્તિ માટેનું લેગસી સ્થાયી નામ છે.** -`resilienceSettings.requestQueue.maxWaitMs`ને Bottleneckમાં જોબ -`expiration` તરીકે પસાર કરવામાં આવે છે, જેનો ટાઇમર ડિસ્પેચ થયા પછી જ શરૂ થાય છે. -તેથી તે સ્થાનિક કતારમાં વિતાવેલા સમયને નહીં, પરંતુ લિમિટર દ્વારા સંચાલિત -એક્ઝિક્યુશનને મર્યાદિત કરે છે. સમાપ્તિને વિશ્વસનીય સ્થાનિક -`code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) તરીકે દર્શાવવામાં આવે છે; -પાછળની સુસંગતતા માટે અગાઉનું કતાર-સમયસમાપ્તિ કોડ નામ માત્ર વિશ્વસનીય આંતરિક -ઉપયોગ માટે સ્વીકારવામાં આવે છે. ડિફૉલ્ટ 15000ms છે; તેને -`RATE_LIMIT_MAX_WAIT_MS` (env) અથવા ડૅશબોર્ડ (**સેટિંગ્સ → સ્થિતિસ્થાપકતા**, -1–30000ms UI મહત્તમ મર્યાદા) મારફતે ઓવરરાઇડ કરો. કતારમાં રહેવા માટે કોઈ -સમયમર્યાદા નથી; કતારમાં રહેલા કૉલર્સને મર્યાદિત કરવા નીચેનું -`maxQueueDepth` વાપરો. - -**`maxQueueDepth` — ઑપ્ટ-ઇન પ્રવેશ મર્યાદા (નવી).** `resilienceSettings.requestQueue.maxQueueDepth` -એક સમયે એક પ્રોવાઇડર+કનેક્શન માટે કેટલી વિનંતીઓ કતારમાં (હજુ ડિસ્પેચ ન થયેલી) -રહી શકે તે મર્યાદિત કરે છે. જ્યારે કતારમાં પહેલેથી જ `maxQueueDepth` વિનંતીઓ -હોય, ત્યારે નવી વિનંતીને ટાઇપ કરેલી `code: "RATE_LIMIT_QUEUE_FULL"` ભૂલ સાથે -`limiter.schedule()` સુધી પહોંચે તે **પહેલાં જ** તરત નકારી દેવામાં આવે છે — -એટલે નકારવાની પ્રક્રિયા સસ્તી છે અને તે વિનંતી માટેના કોઈપણ ડાઉનસ્ટ્રીમ -પ્રોમ્પ્ટ-કમ્પ્રેશન / અનુવાદ કાર્ય પહેલાં થાય છે. ડિફૉલ્ટ `0` = અક્ષમ, -જે હાલના અમર્યાદિત-કતાર વર્તનને જાળવે છે; મર્યાદિત શ્રેણી 0–100000 છે. -તેને `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) અથવા -`resilienceSettings.requestQueue.maxQueueDepth` (ડૅશબોર્ડ/API પેચ) મારફતે -ઓવરરાઇડ કરો. - -પ્રવેશ તપાસ પોતે એક શુદ્ધ ફંક્શન છે +## 5. રિક્વેસ્ટ ક્યૂ એડમિશન કંટ્રોલ (v3.8.49 · issue #6593) + +**વ્યાપ**: સ્થાનિક પ્રતિ-provider+connection rate-limit ક્યૂ (`open-sse/services/rateLimitManager.ts`, +Bottleneck દ્વારા સમર્થિત), ઉપરની ત્રણ પદ્ધતિઓથી એક સ્તર નીચે. + +**`maxWaitMs` ક્યૂમાં રાહ જોવાનો સમય મર્યાદિત કરે છે; `executionMaxWaitMs` એક્ઝિક્યુશનને મર્યાદિત કરે છે.** +આ બંનેને ઇરાદાપૂર્વક અલગ રાખવામાં આવ્યા છે અને એકની અસર બીજા પર થતી નથી. + +`resilienceSettings.requestQueue.maxWaitMs` એ **ક્યૂમાં રાહ જોવાનું બજેટ** છે: તેમાં +provider સ્લોટની રાહ જોવી અને ત્યારબાદ QUEUED સ્થિતિમાં રહેવું સામેલ છે, અને job +QUEUED સ્થિતિ છોડીને એક્ઝિક્યુટ થવાનું શરૂ કરે તે જ ક્ષણે તેનું timer સાફ થઈ જાય છે +(`rateLimitManager.ts`, `wrappedFn`). આ મર્યાદા વટાવતી રિક્વેસ્ટ ક્યારેય +upstream સુધી પહોંચતી નથી. ડિફૉલ્ટ 30000ms છે, જે +`src/lib/resilience/settings.ts` માંના `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +દ્વારા આપવામાં આવે છે અને +`tests/unit/ratelimit-admission-control-6593.test.ts` દ્વારા નિશ્ચિત કરવામાં આવ્યું છે, જેથી તેમાં +ફેરફાર કરવાથી આ ફકરો ચૂપચાપ જૂનો રહી જવાને બદલે તે ટેસ્ટ નિષ્ફળ જાય. + +`resilienceSettings.requestQueue.executionMaxWaitMs` એ મૂલ્ય છે જે Bottleneck +ને job `expiration` તરીકે મળે છે, અને તેનું timer dispatch પછી જ શરૂ થાય છે. જે +executors પાસે પોતાનો upstream timeout નથી તેમના માટે તે અંતિમ સુરક્ષા છે, અને +જ્યારે executor નો પોતાનો fetch-start timeout વધુ લાંબો હોય ત્યારે તેને તે timeout +સુધી વધારવામાં આવે છે, જેથી તે સ્વસ્થ in-flight response ને અધવચ્ચે બંધ ન કરી શકે. +ડિફૉલ્ટ 600000ms (10 મિનિટ) છે. + +ક્યૂ બજેટને `expiration` માં આપવાને કારણે અગાઉ non-incremental +gateways mid-flight બંધ થઈ જતા હતા — પ્રથમ bytes આવે તે પહેલાં તેઓ વાજબી રીતે અનેક મિનિટો સુધી +ચાલે છે — અને આ જ કારણસર expiration ને `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) તરીકે રજૂ કરવામાં આવે છે, જ્યારે ક્યૂ બજેટ સાથે +queue-timeout code સંકળાયેલો હોય છે. બંનેમાંથી કોઈપણને `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) અથવા dashboard +(**Settings → Resilience**) દ્વારા override કરો. normalise કરતી વખતે બંનેને 1ms–24hની +મર્યાદામાં રાખવામાં આવે છે. + +**બંને માટે અગ્રતા:** env var માત્ર _ડિફૉલ્ટ_ પૂરું પાડે છે. +`resilienceSettings.requestQueue` માં persist થયેલું મૂલ્ય (dashboard / API patch, +`key_value` માં સંગ્રહિત) તેના પર અગ્રતા મેળવે છે, અને પ્રતિ-connection +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` તેના પર અગ્રતા મેળવે છે. તેથી +જે deployment માં પહેલેથી persist થયેલું મૂલ્ય હોય ત્યાં env var સેટ કરવાથી +કંઈ બદલાતું નથી — તેના બદલે persist થયેલી setting સાફ કરો અથવા અપડેટ કરો. + +ક્યૂમાં રહેવાનો સમય `maxWaitMs` દ્વારા મર્યાદિત છે; નીચેનું `maxQueueDepth` એક સમયે +કેટલા callers ક્યૂમાં રહી શકે તે મર્યાદિત કરે છે. + +**`maxQueueDepth` — વૈકલ્પિક admission cap (નવું).** `resilienceSettings.requestQueue.maxQueueDepth` +એક provider+connection માટે એક સમયે કેટલી રિક્વેસ્ટ ક્યૂમાં (હજી dispatch ન થયેલી) +રહી શકે તે મર્યાદિત કરે છે. જ્યારે ક્યૂમાં પહેલેથી `maxQueueDepth` +રિક્વેસ્ટ હોય, ત્યારે નવી રિક્વેસ્ટ `limiter.schedule()` સુધી પહોંચે તે **પહેલાં** +typed `code: "RATE_LIMIT_QUEUE_FULL"` error સાથે તરત જ reject થાય છે +— તેથી rejection ઓછા ખર્ચે થાય છે અને તે રિક્વેસ્ટ માટેના કોઈપણ downstream +prompt-compression / translation કાર્ય પહેલાં થાય છે. ડિફૉલ્ટ `0` = +નિષ્ક્રિય, જે હાલની અમર્યાદિત-ક્યૂ વર્તણૂક જાળવે છે; મર્યાદા 0–100000 છે. +`RATE_LIMIT_MAX_QUEUE_DEPTH` (env) અથવા +`resilienceSettings.requestQueue.maxQueueDepth` (dashboard/API patch) દ્વારા override કરો. + +admission check પોતે એક pure function છે (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), તેથી -વાસ્તવિક Bottleneck લિમિટર વિના તેનું યુનિટ-ટેસ્ટિંગ કરી શકાય છે. - -> #6593 શરૂ કરનાર RFCએ `bypassCompressionOnRateLimit` -> ફ્લૅગનો પણ પ્રસ્તાવ કર્યો હતો. આ રેપોની `open-sse/services/compression/` -> પાઇપલાઇન આઉટબાઉન્ડ LLM વિનંતી (`chatCore.ts`, -> `resolveCompressionSettings`/`selectCompressionStrategy` બ્લૉકની આસપાસ) -> પરનું પ્રોમ્પ્ટ/કૉન્ટેક્સ્ટ કમ્પ્રેશન છે, કૃત્રિમ રીતે બનાવેલા 429 બોડી પરનું -> HTTP પ્રતિસાદ કમ્પ્રેશન નહીં — તેથી સીધા બાયપાસ ફ્લૅગને અનુરૂપ કોઈ કોડ પાથ -> નથી. પ્રોમ્પ્ટ-કમ્પ્રેશનનું એ પગલું પણ હાલમાં વિનંતી પાઇપલાઇનમાં -> `withRateLimit()` _પહેલાં_ ચાલે છે, તેથી કતાર-પૂર્ણ હોવાને કારણે વિનંતી નકારાય -> ત્યારે તેને છોડવા માટે ક્રમ બદલવો એ આ issueના વ્યાપ કરતાં અલગ અને વધુ મોટો -> ફેરફાર છે; અહીં ઇરાદાપૂર્વક તેનો અમલ **કરવામાં આવ્યો નથી** અને જો CPU બચતનો -> લાભ ક્રમ બદલવાના જોખમને યોગ્ય ઠેરવે તો તેને અનુવર્તી કાર્ય તરીકે બાકી રાખવામાં -> આવ્યો છે. +વાસ્તવિક Bottleneck limiter વિના તેનો unit-test કરી શકાય છે. + +> #6593 શરૂ કરનાર RFC એ `bypassCompressionOnRateLimit` +> flag પણ પ્રસ્તાવિત કર્યો હતો. આ repo ની `open-sse/services/compression/` pipeline +> outbound LLM રિક્વેસ્ટ પરનું prompt/context compression છે (`chatCore.ts`, +> `resolveCompressionSettings`/`selectCompressionStrategy` block ની આસપાસ), +> synthesized 429 bodies પરનું HTTP response compression નહીં — literal bypass flag માટે +> કોઈ મેળ ખાતો code path નથી. હાલમાં request pipeline માં તે prompt-compression પગલું +> `withRateLimit()` **પહેલાં** પણ ચાલે છે, તેથી queue-full rejection પર તેને છોડવા માટે +> ક્રમમાં ફેરફાર કરવો આ issue ના વ્યાપ કરતાં અલગ અને વધુ મોટો +> ફેરફાર છે; અહીં ઇરાદાપૂર્વક તેનો અમલ **કરવામાં આવ્યો નથી** +> અને જો CPU બચતનો લાભ ક્રમ બદલવાના જોખમને યોગ્ય ઠેરવે તો તેને follow-up તરીકે +> છોડી દેવામાં આવ્યો છે. --- diff --git a/docs/i18n/gu/docs/architecture/admission-lanes.md b/docs/i18n/gu/docs/architecture/admission-lanes.md index 6f6b735c59a4..f2d59c99de7c 100644 --- a/docs/i18n/gu/docs/architecture/admission-lanes.md +++ b/docs/i18n/gu/docs/architecture/admission-lanes.md @@ -7,49 +7,51 @@ OmniRouteમાં અલગ-અલગ વ્યાપ ધરાવતી **બે** પ્રોસેસ-લોકલ લેન સિસ્ટમ્સ છે. તે એકબીજાની પૂરક છે; ઑપરેટર્સને જાણ હોવી જોઈએ કે તેઓ કઈ સિસ્ટમ જોઈ રહ્યા છે. -## 1. બાઇટ-સ્તરીય પ્રોસેસ-વ્યાપી પ્રવેશ (`chatBodyAdmission.ts`) - -- **વ્યાપ:** `POST /v1/chat/completions`, `/v1/messages`, - `/v1/responses` અને અન્ય ચેટ-સ્વરૂપના રૂટ્સ માટેનો બફર્ડ-બોડી/હીપ પાથ. મોટા - કોડિંગ-એજન્ટ બોડીઝથી થતા હીપ એમ્પ્લિફિકેશન સામે રક્ષણ આપે છે (#4380). -- **એક પ્રોસેસ-ગ્લોબલ કન્ટ્રોલર, દરેક કી માટે અલગ લેન નહીં (#10110).** દરેક API કી - (હૅશ કરેલી) અથવા `anonymous` સેશન **સમાન** શેર કરેલા બજેટ સામે પ્રવેશ મેળવે છે — - હૅશ કરેલા સેશન idનો ઉપયોગ માત્ર નિષ્પક્ષતા શેડ્યૂલિંગ કી તરીકે થાય છે (રાહ જોનારાઓ - વચ્ચે રાઉન્ડ-રોબિન ડિસ્પેચ), ક્ષમતાના શાર્ડ તરીકે ક્યારેય નહીં. આ દસ્તાવેજના અગાઉના - સંસ્કરણમાં સ્વતંત્ર ક્ષમતા ધરાવતી દરેક કી માટે અલગ લેન્સનું વર્ણન હતું; તે મોડેલને - #10110માં દૂર કરવામાં આવ્યું, કારણ કે તેના લીધે બિનપ્રમાણિત બનાવટી ક્રેડેન્શિયલ્સ - પ્રોસેસ-વ્યાપી મર્યાદાને ગુણાકારે વધારી શકતાં હતાં. -- **ગેટ (#503-fanout): આપમેળે નિર્ધારિત થતું ઇન્જેસ્ટ BYTE બજેટ, નિશ્ચિત રિક્વેસ્ટ - ગણતરી નહીં.** લેગસી `CHAT_MAX_HEAVY_IN_FLIGHT` રિક્વેસ્ટ-ગણતરી મર્યાદા (આ સુધારા - પહેલાં ડિફૉલ્ટ `1`) કોડિંગ-એજન્ટ ફૅન-આઉટને (અનેક સબએજન્ટ્સ/CLIs, - નિયમિત રીતે > 256 KB બોડીઝ) લગભગ 1ની અસરકારક કન્કરન્સી સુધી સંકુચિત કરતી હતી, - જેના કારણે સંપૂર્ણપણે સામાન્ય લોડ હેઠળ 503 મળતી હતી. હવે તે ફક્ત ત્યારે જ લાગુ પડે છે - જ્યારે કોઈ ઑપરેટર સ્પષ્ટ રીતે `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` સેટ કરે. - તેને સેટ ન રાખવામાં આવે તો પ્રવેશને તેના બદલે `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` - દ્વારા નિયંત્રિત કરવામાં આવે છે — આ બજેટ પ્રોસેસની વાસ્તવિક મેમરી મર્યાદામાંથી - આપમેળે મેળવવામાં આવે છે (`src/shared/middleware/admissionBudget.ts`): - V8 હીપ મર્યાદા અને કોઈપણ cgroup/container મર્યાદામાંથી જે વધુ કડક હોય તેના 25%ને, - 8x ક્ષણિક-એમ્પ્લિફિકેશન ફેક્ટર વડે ભાગીને, 8 MiBથી 2 GiB વચ્ચે સીમિત કરવામાં આવે છે. - સ્પષ્ટ ઓવરરાઇડ્સ પણ સમાન મર્યાદાઓનો ઉપયોગ કરે છે. કોઈ env ટ્યુનિંગ વિના આ પોતે - 512 MB containerથી 32 GB desktop સુધી સ્કેલ થાય છે. અસરકારક બજેટમાં સમાઈ ન શકે - તેવી બોડી `413 body_exceeds_budget` સાથે તરત જ નિષ્ફળ જાય છે; - ફક્ત વ્યક્તિગત રીતે સેવા આપી શકાય તેવી બોડીઝ વચ્ચેનો સંઘર્ષ જ મર્યાદિત - નિષ્પક્ષતા ક્યૂમાં પ્રવેશે છે. લાઇવ મલ્ટિ-સિગ્નલ રિસોર્સ-પ્રેશર ટ્રૅકર (V8 હીપ રેશિયો, - cgroup, PSI, OOM ઇવેન્ટ્સ — `open-sse/utils/resourcePressurePolicy.ts`) `high` - પ્રેશર હેઠળ મર્યાદિત પ્રતીક્ષાને ટૂંકી કરે છે અને `critical` પ્રેશર હેઠળ કોઈપણ બાઇટ્સ - ઇન્જેસ્ટ થાય તે પહેલાં જ `503 resource_pressure` સાથે તરત લોડ ઘટાડે છે. +## 1. બાઇટ-સ્તરની સમગ્ર-પ્રક્રિયા પ્રવેશ-મર્યાદા (`chatBodyAdmission.ts`) + +- **વ્યાપ:** `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` અને અન્ય ચેટ-આકારના રૂટ્સ માટેનો બફર કરેલ-બોડી/હીપ પાથ. મોટા કોડિંગ-એજન્ટ બોડીઝથી થતા હીપ એમ્પ્લિફિકેશન સામે રક્ષણ આપે છે (#4380). +- **દરેક કી માટે અલગ લેન નહીં, પરંતુ એક પ્રક્રિયા-વ્યાપી વૈશ્વિક કંટ્રોલર (#10110).** દરેક API કી + (હેશ કરેલી) અથવા `anonymous` સેશન **સમાન** સહિયારા બજેટ સામે પ્રવેશ મેળવે છે — + હેશ કરેલી સેશન id નો ઉપયોગ ફક્ત નિષ્પક્ષતા શેડ્યૂલિંગ કી તરીકે થાય છે (પ્રતીક્ષારત વિનંતીઓમાં + રાઉન્ડ-રોબિન ડિસ્પેચ), ક્ષમતાના શાર્ડ તરીકે ક્યારેય નહીં. આ દસ્તાવેજના અગાઉના સંસ્કરણમાં + સ્વતંત્ર ક્ષમતા ધરાવતી દરેક કી માટે અલગ લેનનું વર્ણન હતું; તે મોડેલને + #10110 માં દૂર કરવામાં આવ્યું, કારણ કે તે બિનપ્રમાણિત નકલી ક્રેડેન્શિયલ્સને + પ્રક્રિયા-વ્યાપી મર્યાદાને ગુણાકારે વધારવા દેતું હતું. +- **ગેટ (#503-fanout): આપમેળે નિર્ધારિત થતું ઇનજેસ્ટ BYTE બજેટ, નિશ્ચિત વિનંતી + સંખ્યા નહીં.** જૂની `CHAT_MAX_HEAVY_IN_FLIGHT` વિનંતી-સંખ્યા મર્યાદા (આ સુધારા + પહેલાં ડિફૉલ્ટ `1`) કોડિંગ-એજન્ટ ફૅન-આઉટ (બહુવિધ સબએજન્ટ્સ/CLIs, + સામાન્ય રીતે > 256 KB બોડીઝ)ને ~1 ની અસરકારક સમકાલીનતા સુધી સીમિત કરતી હતી, જેના કારણે + સંપૂર્ણપણે સામાન્ય લોડ હેઠળ 503 મળતું હતું. હવે તે માત્ર ત્યારે જ લાગુ પડે છે જ્યારે ઑપરેટર સ્પષ્ટપણે + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` સેટ કરે. તેને અનસેટ રાખવામાં આવે ત્યારે, પ્રવેશને તેના બદલે + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` દ્વારા નિયંત્રિત કરવામાં આવે છે — પ્રક્રિયાની વાસ્તવિક + મેમરી મર્યાદામાંથી આપમેળે નિર્ધારિત થતું બજેટ (`src/shared/middleware/admissionBudget.ts`): + V8 હીપ મર્યાદા અને કોઈપણ cgroup/container મર્યાદામાંથી વધુ કડક મર્યાદાના 25%ને, + 8x ક્ષણિક-એમ્પ્લિફિકેશન પરિબળથી ભાગીને, 8 MiB અને + 2 GiB વચ્ચે ક્લેમ્પ કરવામાં આવે છે. સ્પષ્ટ ઓવરરાઇડ્સ સમાન ક્લેમ્પ્સનો ઉપયોગ કરે છે. આ કોઈ env ટ્યુનિંગ વિના + 512 MB container થી 32 GB desktop સુધી પોતાને સ્કેલ કરે છે. અસરકારક બજેટમાં + સમાઈ ન શકે તેવી બોડી `413 body_exceeds_budget` સાથે તરત નિષ્ફળ જાય છે; + વ્યક્તિગત રીતે સેવા આપી શકાય તેવી બોડીઝ વચ્ચેનો વિવાદ જ મર્યાદિત + નિષ્પક્ષતા કતારમાં પ્રવેશે છે. જીવંત બહુ-સિગ્નલ સંસાધન-દબાણ ટ્રૅકર (V8 હીપ ગુણોત્તર, + cgroup, PSI, OOM ઘટનાઓ — `open-sse/utils/resourcePressurePolicy.ts`) `high` + દબાણ હેઠળ મર્યાદિત પ્રતીક્ષા ઘટાડે છે અને કોઈપણ બાઇટ્સ ઇનજેસ્ટ થાય તે પહેલાં + `critical` દબાણ હેઠળ `503 resource_pressure` સાથે તરત જ લોડ ઘટાડે છે. + PSI ઉપલબ્ધ હોય ત્યારે આ યુનિટના cgroup `memory.pressure` માંથી વાંચવામાં આવે છે + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` + સમગ્ર હોસ્ટ માટે છે અને માત્ર બેર મેટલ / cgroup v1 પર ફૉલબૅક તરીકે વપરાય છે, જેથી સ્વૅપિંગ + હોસ્ટ નિષ્ક્રિય containerને 503 ન કરાવી શકે. - **ટ્યુનિંગ:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — આપમેળે નિર્ધારિત બાઇટ બજેટ માટે ઓવરરાઇડ - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — લેગસી રિક્વેસ્ટ-ગણતરી મર્યાદા, માત્ર ઑપ્ટ-ઇન - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503 પહેલાં ક્યૂમાં પ્રતીક્ષા (ડિફૉલ્ટ 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — ક્યૂ કરેલા બાઇટ્સ માટે હીપ વાલ્વ (ડિફૉલ્ટ 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110થી અપ્રચલિત - no-ops (કન્ફિગ સુસંગતતા માટે સ્વીકારવામાં આવે છે, પણ અવગણવામાં આવે છે) + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — આપમેળે નિર્ધારિત બાઇટ બજેટ માટેનો ઓવરરાઇડ + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — જૂની વિનંતી-સંખ્યા મર્યાદા, માત્ર સ્પષ્ટ પસંદગીથી સક્રિય + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503 પહેલાં કતાર-પ્રતીક્ષા (ડિફૉલ્ટ 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — કતારબદ્ધ-બાઇટ્સ માટેનો હીપ વાલ્વ (ડિફૉલ્ટ 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110 થી અપ્રચલિત + no-ops (કૉન્ફિગ સુસંગતતા માટે સ્વીકારવામાં આવે છે, અવગણવામાં આવે છે) - **રિપોર્ટ્સ:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — જેમાં - #503-fanoutના ઉમેરાઓ `inflightBytes`, `maxInflightBytes`, `budgetSource` - (`v8_heap` | `cgroup` | `override`), `pressureSeverity` અને `countCapEnabled` - (ડિફૉલ્ટ ડિપ્લોયમેન્ટ પર false — આ પુષ્ટિ કરે છે કે વાસ્તવમાં બાઇટ બજેટ જ નિયંત્રણ - લાદે છે, લેગસી ગણતરી મર્યાદા નહીં) સામેલ છે. + #503-fanout ના વધારાઓ `inflightBytes`, `maxInflightBytes`, `budgetSource` + (`v8_heap` | `cgroup` | `override`), `pressureSeverity`, અને `countCapEnabled` + સામેલ છે (ડિફૉલ્ટ ડિપ્લોયમેન્ટ પર false — આ પુષ્ટિ કરે છે કે વાસ્તવમાં બાઇટ બજેટ જ + મર્યાદા લાગુ કરે છે, જૂની સંખ્યા મર્યાદા નહીં). ## 2. અનુકૂલનશીલ રનટાઇમ વર્ચ્યુઅલ લેન (`open-sse/services/admission`) diff --git a/docs/i18n/gu/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/gu/docs/frameworks/EMBEDDED-SERVICES.md index d30f720e0710..73ab61c04fc3 100644 --- a/docs/i18n/gu/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/gu/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **વર્ઝન:** v3.8.44 -> **છેલ્લે અપડેટ કરેલું:** 2026-07-03 -> **લક્ષિત વાચકો:** એમ્બેડેડ સેવાઓ (9Router, CLIProxyAPI, Mux, Bifrost) ઉમેરતા, જાળવતા અથવા ડિબગ કરતા એન્જિનિયરો. +> **છેલ્લે અપડેટ કરેલું:** 2026-09-09 +> **લક્ષિત વાચકો:** એમ્બેડેડ સેવાઓ (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) ઉમેરતા, જાળવતા અથવા ડિબગ કરતા એન્જિનિયરો. -એમ્બેડેડ સેવાઓ સ્થાનિક રીતે ઇન્સ્ટૉલ કરાયેલા પ્રોસેસ સાઇડકાર ટૂલ્સ છે, જેને OmniRoute ઇન્સ્ટૉલ કરે છે, તેનું નિરીક્ષણ કરે છે અને -પ્રથમ-શ્રેણીના રાઉટિંગ લક્ષ્યો તરીકે ઉપલબ્ધ કરાવે છે. બાહ્ય પ્રોવાઇડર્સથી વિપરીત (જેમનો ઇન્ટરનેટ મારફતે -API કીઝનો ઉપયોગ કરીને સંપર્ક કરવામાં આવે છે), એમ્બેડેડ સેવાઓ OmniRoute જે મશીન પર હોય એ જ મશીન પર ચાલે છે અને લૂપબૅક મારફતે સંચાર કરે છે. +એમ્બેડેડ સેવાઓ સ્થાનિક રીતે ઇન્સ્ટોલ કરાયેલા પ્રોસેસ સાઇડકાર ટૂલ્સ છે, જેને OmniRoute ઇન્સ્ટોલ કરે છે, તેનું નિરીક્ષણ કરે છે અને +પ્રથમ-શ્રેણીના રાઉટિંગ લક્ષ્યો તરીકે ઉપલબ્ધ કરાવે છે. બાહ્ય પ્રદાતાઓથી વિપરીત (જેમનો સંપર્ક ઇન્ટરનેટ મારફતે +API કીઓનો ઉપયોગ કરીને કરવામાં આવે છે), એમ્બેડેડ સેવાઓ OmniRouteના જ મશીન પર ચાલે છે અને લૂપબૅક મારફતે સંચાર કરે છે. --- @@ -27,37 +27,38 @@ API કીઝનો ઉપયોગ કરીને સંપર્ક કરવ --- -## 1. વિહંગાવલોકન +## 1. સંક્ષિપ્ત પરિચય ### એમ્બેડેડ સેવાઓ શા માટે? -પાંચ સેવાઓ એમ્બેડ કરવામાં આવી છે: +છ સેવાઓ એમ્બેડ કરવામાં આવી છે: -| સેવા | npm પૅકેજ | ડિફૉલ્ટ પોર્ટ | હેતુ | -| --------------- | -------------------------------- | :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI રાઉટર, જેનો OmniRoute સબ-પ્રોવાઇડર તરીકે ઉપયોગ કરી શકે છે. મૉડલ્સ `9router/{sub}/{model}` તરીકે ઉપલબ્ધ કરાવવામાં આવે છે | -| **CLIProxyAPI** | GitHub રિલીઝ બાઇનરી (`cliproxy`) | 8317 | Anthropic CLI ઑથ ફ્લો માટે સ્થાનિક પ્રૉક્સી ઍડૅપ્ટર. OAuth ટોકન્સની મુદત સમાપ્ત થાય ત્યારે ફૉલબૅક રાઉટિંગ પ્રદાન કરે છે | -| **Mux** | `mux` (હેડલેસ `mux server`) | 8322 | સ્થાનિક એજન્ટ-ઑર્કેસ્ટ્રેશન ડિમન (coder/mux). માત્ર લાઇફસાઇકલ-મેનેજ્ડ — રાઉટિંગ લક્ષ્ય નથી (LLM પ્રૉક્સીંગ નથી). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-ગેટવે રિલે બૅકએન્ડ. જ્યારે તે ચાલી રહ્યું હોય, ત્યારે રિલે રૂટ (`/v1/relay/`) દ્વારા આપમેળે પસંદ થાય છે | -| **Dario** | `@askalf/dario` | 3456 | Claude-સબ્સ્ક્રિપ્શન પ્રૉક્સી — Claude-Code-આકારના ટ્રાફિક માટે CLIProxyAPI નો વિકલ્પ/ફેલઓવર; ઇન્જેક્ટ કરેલી કી `DARIO_ADMIN_TOKEN` બને છે, જે તેના `/admin/*` OAuth કંટ્રોલ પ્લેનને સુરક્ષિત કરે છે | +| સેવા | npm પૅકેજ | ડિફૉલ્ટ પોર્ટ | હેતુ | +| --------------- | -------------------------------- | :-----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **9Router** | `9router` | 20130 | AI રાઉટર, જેનો OmniRoute ઉપ-પ્રદાતા તરીકે ઉપયોગ કરી શકે છે. મોડેલો `9router/{sub}/{model}` તરીકે ઉપલબ્ધ કરાવવામાં આવે છે | +| **CLIProxyAPI** | GitHub રિલીઝ બાઇનરી (`cliproxy`) | 8317 | Anthropic CLI પ્રમાણીકરણ પ્રવાહો માટે સ્થાનિક પ્રૉક્સી ઍડેપ્ટર. OAuth ટોકન સમાપ્ત થાય ત્યારે ફૉલબૅક રાઉટિંગ પૂરું પાડે છે | +| **Mux** | `mux` (હેડલેસ `mux server`) | 8322 | સ્થાનિક એજન્ટ-ઓર્કેસ્ટ્રેશન ડીમન (coder/mux). માત્ર લાઇફસાઇકલ-મેનેજ્ડ — રાઉટિંગ લક્ષ્ય નથી (કોઈ LLM પ્રૉક્સીઇંગ નહીં). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-ગેટવે રિલે બૅકએન્ડ. ચાલુ હોય ત્યારે, રિલે રૂટ (`/v1/relay/`) દ્વારા આપમેળે પસંદ કરવામાં આવે છે | +| **Dario** | `@askalf/dario` | 3456 | Claude-સબ્સ્ક્રિપ્શન પ્રૉક્સી — Claude-Code-સ્વરૂપના ટ્રાફિક માટે CLIProxyAPIનો વિકલ્પ/ફેઇલઓવર; ઇન્જેક્ટ કરેલી કી `DARIO_ADMIN_TOKEN` બને છે, જે તેના `/admin/*` OAuth કંટ્રોલ પ્લેનને સુરક્ષિત કરે છે | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web ઑટોમેશન (Puppeteer મારફતે હેડલેસ Chromium). માત્ર લાઇફસાઇકલ-મેનેજ્ડ — રાઉટિંગ લક્ષ્ય નથી. | -આ પાંચેય એક જ સુપરવાઇઝરી મૉડલને અનુસરે છે: +તમામ છ સેવાઓ સમાન સુપરવાઇઝરી મોડલનું પાલન કરે છે: -- OmniRoute તેમને `DATA_DIR/services/{name}/` હેઠળ ઇન્સ્ટૉલ કરે છે (OmniRoute ના પોતાના `package.json`થી અલગ રાખીને) -- OmniRoute તેમને ચાઇલ્ડ પ્રોસેસ તરીકે શરૂ કરે છે અને તેમનું નિરીક્ષણ કરે છે -- OmniRoute ચાઇલ્ડના એન્વાયર્નમેન્ટમાં અસ્થાયી API કી ઇન્જેક્ટ કરે છે અને (જ્યાં લાગુ પડે ત્યાં) ડાઉનટાઇમ વિના તેને રોટેટ કરે છે -- બધા મેનેજમેન્ટ રૂટ્સ (`/api/services/*`) **LOCAL_ONLY** છે — ફક્ત લૂપબૅક પરથી જ ઍક્સેસ કરી શકાય છે (કડક નિયમ #17) +- OmniRoute તેમને `DATA_DIR/services/{name}/` હેઠળ ઇન્સ્ટૉલ કરે છે (OmniRouteના પોતાના `package.json`થી અલગ) +- OmniRoute તેમને ચાઇલ્ડ પ્રોસેસ તરીકે શરૂ કરે છે અને મોનિટર કરે છે +- OmniRoute ચાઇલ્ડના એન્વાયર્નમેન્ટમાં અસ્થાયી API કી ઇન્જેક્ટ કરે છે અને ડાઉનટાઇમ વિના તેને રોટેટ કરે છે (જ્યાં લાગુ પડે ત્યાં) +- તમામ મેનેજમેન્ટ રૂટ્સ (`/api/services/*`) **LOCAL_ONLY** છે — ફક્ત લૂપબૅકથી ઍક્સેસ કરી શકાય છે (કડક નિયમ #17) -### મુખ્ય નિર્ણયો (ડિઝાઇન પ્લાનમાંથી) +### મુખ્ય નિર્ણયો (ડિઝાઇન યોજનામાંથી) -| નિર્ણય | મૂલ્ય | -| ------------------------------------- | ----------------------------------------------------------------------------------------------- | -| 9Router નેટિવ UI માટે ડૅશબોર્ડ ઍક્સેસ | `/dashboard/providers/services/9router/embed/*` પર રિવર્સ પ્રૉક્સી | -| ઇન્સ્ટૉલેશન પદ્ધતિ | `execFile` મારફતે `npm install {package}` (કોઈ શેલ ઇન્ટરપોલેશન નહીં) | -| ઉપયોગ મોડ | રાઉટિંગ એન્જિનમાં `9router/{sub}/{model}` તરીકે નોંધાયેલ પ્રોવાઇડર | -| API કી વ્યવસ્થાપન | OmniRoute જનરેટ કરે છે, ઍટ-રેસ્ટ એન્ક્રિપ્ટ કરે છે (AES-256-GCM) અને env મારફતે ઇન્જેક્ટ કરે છે | -| ડૅશબોર્ડ સ્થાન | `/dashboard/providers/services` (ત્રણ ટૅબ્સ) | -| ઑટો-સ્ટાર્ટ | દરેક સેવા માટે ટૉગલ, ડિફૉલ્ટ રીતે OFF | +| નિર્ણય | મૂલ્ય | +| --------------------------------------- | ----------------------------------------------------------------------------------------------- | +| 9Routerના નેટિવ UI માટે ડૅશબોર્ડ ઍક્સેસ | `/dashboard/providers/services/9router/embed/*` પર રિવર્સ પ્રૉક્સી | +| ઇન્સ્ટૉલેશન પદ્ધતિ | `execFile` મારફતે `npm install {package}` (કોઈ શેલ ઇન્ટરપોલેશન નહીં) | +| વપરાશ મોડ | રાઉટિંગ એન્જિનમાં `9router/{sub}/{model}` તરીકે નોંધાયેલ પ્રદાતા | +| API કી મેનેજમેન્ટ | OmniRoute જનરેટ કરે છે, ઍટ-રેસ્ટ એન્ક્રિપ્ટ કરે છે (AES-256-GCM) અને env મારફતે ઇન્જેક્ટ કરે છે | +| ડૅશબોર્ડ સ્થાન | `/dashboard/providers/services` (ત્રણ ટૅબ) | +| ઑટો-સ્ટાર્ટ | સેવા દીઠ ટૉગલ, ડિફૉલ્ટ રૂપે બંધ | --- @@ -67,10 +68,10 @@ API કીઝનો ઉપયોગ કરીને સંપર્ક કરવ ┌────────────────────────────────────────────────────────────────────┐ │ સ્તર 1 — UI │ │ /dashboard/providers/services (ટૅબ્સ: CLIProxyAPI | 9Router | Mux)│ -│ લાઇવ લૉગ્સ (SSE), શરૂ/બંધ/પુનઃપ્રારંભ/અપડેટ, સેટિંગ્સ, ઇન્સ્ટૉલ │ +│ લાઇવ લૉગ્સ (SSE), શરૂ/બંધ/પુનઃશરૂ/અપડેટ, સેટિંગ્સ, ઇન્સ્ટૉલ │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx શેલ + ?tab= દ્વારા ટૅબ રૂટિંગ │ +│ ├── page.tsx ?tab= દ્વારા શેલ + ટૅબ રાઉટિંગ │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -78,7 +79,7 @@ API કીઝનો ઉપયોગ કરીને સંપર્ક કરવ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (Next.js fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ સ્તર 2 — API (LOCAL_ONLY — માત્ર લૂપબૅક) │ +│ સ્તર 2 — API (LOCAL_ONLY — ફક્ત લૂપબૅક) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -92,67 +93,68 @@ API કીઝનો ઉપયોગ કરીને સંપર્ક કરવ │ ગેટ: LOCAL_ONLY_API_PREFIXES માં "/api/services/" અને │ │ "/dashboard/providers/services/*/embed/" સામેલ છે │ └──────────────────────┬─────────────────────────────────────────────┘ - │ પ્રક્રિયા-અંતર્ગત કૉલ્સ + │ ઇન-પ્રોસેસ કૉલ્સ ┌──────────────────────▼─────────────────────────────────────────────┐ │ સ્તર 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts સામાન્ય સુપરવાઇઝર (child_process.spawn) │ -│ ├── ઇન્સ્ટૉલ: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── શરૂ: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ -│ ├── પોર્ટ: 9Router માટે 20130 (રૂપરેખાંકિત કરી શકાય તેવો)│ -│ ├── લૉગ્સ: stdio રિંગ બફર 5 MB → SSE ઇવેન્ટ્સ │ -│ ├── હેલ્થ: દર 2–5 સેકંડે HTTP GET /health, આળસુ પુનઃપ્રાપ્તિ│ -│ └── જીવનચક્ર: SIGTERM 15 સેકંડ → SIGKILL │ +│ ├── ઇન્સ્ટૉલ: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── શરૂ: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── પોર્ટ: 9Router માટે 20130 (રૂપરેખાંકિત કરી શકાય તેવું) │ +│ ├── લૉગ્સ: stdio રિંગ બફર 5 MB → SSE ઇવેન્ટ્સ │ +│ ├── હેલ્થ: દર 2–5 s એ HTTP GET /health, લેઝી પુનઃપ્રાપ્તિ │ +│ └── લાઇફસાઇકલ: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts પ્રક્રિયા શરૂ થતાં તમામ SERVICES[]ને બૂટસ્ટ્રૅપ કરે છે│ +│ bootstrap.ts પ્રોસેસ શરૂ થતાં તમામ SERVICES[] બુટસ્ટ્રૅપ કરે│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts સમયાંતરે GET /v1/models → service_models ટેબલ │ -│ ringBuffer.ts વર્તુળાકાર લૉગ બફર (સેવા દીઠ 5 MB) │ +│ modelSync.ts આવર્તક GET /v1/models → service_models ટેબલ │ +│ ringBuffer.ts વર્તુળાકાર લૉગ બફર (દર સેવા દીઠ 5 MB) │ │ healthCheck.ts પોલિંગ HTTP હેલ્થ પ્રોબ │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (ઇન્સ્ટૉલર ઍડૅપ્ટર્સ) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-સુસંગત HTTP (લૂપબૅક) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ સ્તર 4 — પ્રદાતા / રૂટિંગ │ +│ સ્તર 4 — પ્રદાતા / રાઉટિંગ │ │ │ │ open-sse/executors/ninerouter.ts │ -│ દરેક વિનંતી માટે પોર્ટ અને API કી ફરીથી શોધે છે (કૅશિંગ નહીં). │ -│ પ્રૉક્સી કરતાં પહેલાં મૉડલ idમાંથી "9router/" પ્રિફિક્સ દૂર કરે છે.│ -│ જો સુપરવાઇઝર "running" સ્થિતિમાં ન હોય તો 503 service_not_running પરત કરે છે.│ +│ દરેક વિનંતી માટે પોર્ટ અને API કી ફરી શોધે છે (કૅશિંગ નથી). │ +│ પ્રૉક્સી કરતાં પહેલાં મોડેલ id માંથી "9router/" પ્રીફિક્સ દૂર કરે છે.│ +│ સુપરવાઇઝર "running" માં ન હોય તો 503 service_not_running પરત કરે છે.│ │ │ │ src/shared/constants/providers.ts │ │ "9router" માટેની એન્ટ્રી: isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ મૉડલ્સ "9router/{sub}/{model}" (પ્રિફિક્સવાળા) તરીકે સંગ્રહાય છે.│ -│ modelSync.ts દ્વારા દર 5 મિનિટે સિંક થાય છે. │ +│ મોડેલો "9router/{sub}/{model}" તરીકે સંગ્રહાય છે (પ્રીફિક્સવાળા).│ +│ modelSync.ts દ્વારા દર 5 min એ સિંક થાય છે. │ │ │ -│ Muxનું માત્ર જીવનચક્ર સંચાલિત થાય છે (સ્તરો 1-3) — તે એક એજન્ટ- │ -│ ઑર્કેસ્ટ્રેશન ડિમન છે, LLM પ્રૉક્સી નહીં, તેથી તેમાં સ્તર 4ની │ -│ એક્ઝિક્યુટર/પ્રદાતા એન્ટ્રી નથી અને તે ક્યારેય રૂટિંગ લક્ષ્ય નથી.│ +│ Mux માત્ર લાઇફસાઇકલ-વ્યવસ્થાપિત છે (સ્તરો 1-3) — તે એજન્ટ- │ +│ ઑર્કેસ્ટ્રેશન ડિમન છે, LLM પ્રૉક્સી નથી, તેથી તેમાં સ્તર 4ની │ +│ executor/provider એન્ટ્રી નથી અને તે ક્યારેય રાઉટિંગ લક્ષ્ય નથી. │ └────────────────────────────────────────────────────────────────────┘ ``` -### મુખ્ય સોર્સ ફાઇલો +### મુખ્ય સ્રોત ફાઇલો | ફાઇલ | ભૂમિકા | | ------------------------------------------- | ----------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | મુખ્ય ક્લાસ: જીવનચક્ર, લૉક, આરોગ્ય, રિંગ બફર | -| `src/lib/services/bootstrap.ts` | પ્રોસેસ-સ્તરીય નોંધણી અને સ્વચાલિત પ્રારંભ | +| `src/lib/services/ServiceSupervisor.ts` | મુખ્ય ક્લાસ: જીવનચક્ર, લૉક, હેલ્થ, રિંગ બફર | +| `src/lib/services/bootstrap.ts` | પ્રોસેસ-સ્તરીય રજિસ્ટ્રેશન અને સ્વચાલિત શરૂઆત | | `src/lib/services/registry.ts` | સિંગલટન મેપ `tool → supervisor` | | `src/lib/services/apiKey.ts` | કી જનરેશન, સંગ્રહિત સ્થિતિમાં AES-256-GCM એન્ક્રિપ્શન | -| `src/lib/services/modelSync.ts` | સમયાંતરે મોડેલ સિંક (5 મિનિટ) + માંગ પર | -| `src/lib/services/ringBuffer.ts` | SSE સબ્સ્ક્રાઇબ સાથે 5 MB વર્તુળાકાર લૉગ બફર | -| `src/lib/services/healthCheck.ts` | HTTP આરોગ્ય પ્રોબ (રૂપરેખાંકિત કરી શકાય તેવો અંતરાલ) | +| `src/lib/services/modelSync.ts` | સમયાંતરે મોડલ સિંક (5 મિનિટ) + માંગ પર | +| `src/lib/services/ringBuffer.ts` | SSE સબ્સ્ક્રિપ્શન સાથેનો 5 MB સર્ક્યુલર લૉગ બફર | +| `src/lib/services/healthCheck.ts` | HTTP હેલ્થ પ્રોબ (રૂપરેખાંકિત કરી શકાય તેવો અંતરાલ) | | `src/lib/services/installers/ninerouter.ts` | 9Router માટે npm ઇન્સ્ટૉલ/અપડેટ/અનઇન્સ્ટૉલ | | `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI માટે npm ઇન્સ્ટૉલ/અપડેટ/અનઇન્સ્ટૉલ | | `src/lib/services/installers/mux.ts` | Mux માટે npm ઇન્સ્ટૉલ/અપડેટ/અનઇન્સ્ટૉલ | +| `src/lib/services/installers/openwa.ts` | open-wa માટે npm ઇન્સ્ટૉલ/અપડેટ/અનઇન્સ્ટૉલ | | `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` સહાયક | | `src/app/api/services/[name]/logs/route.ts` | સહિયારું SSE લૉગ્સ એન્ડપોઇન્ટ | -| `open-sse/executors/ninerouter.ts` | પ્રદાતા એક્ઝિક્યુટર (સ્તર 4) | +| `open-sse/executors/ninerouter.ts` | પ્રોવાઇડર એક્ઝિક્યુટર (સ્તર 4) | --- @@ -208,55 +210,54 @@ auto-start અને UI બટન એકસાથે ટ્રિગર થા ## 4. API સંદર્ભ -`/api/services/` હેઠળના તમામ રૂટ્સ **LOCAL_ONLY** છે (ફક્ત loopback, અચળ નિયમ #17). -auth token ગમે તે હોય, non-loopback વિનંતીઓને `403 LOCAL_ONLY` મળે છે. +`/api/services/` હેઠળના તમામ રૂટ્સ **LOCAL_ONLY** છે (માત્ર લૂપબૅક, કડક નિયમ #17). +ઑથ ટોકન ગમે તે હોય, નોન-લૂપબૅક વિનંતીઓને `403 LOCAL_ONLY` પ્રતિસાદ મળે છે. ### 4.1 9Router એન્ડપોઇન્ટ્સ (11 રૂટ્સ) #### `POST /api/services/9router/install` -npmમાંથી 9Router ઇન્સ્ટૉલ કરે છે. તેના પોતાના `package.json` અને `node_modules/` -સાથે `DATA_DIR/services/9router/` બનાવે છે. OmniRouteની પોતાની dependencies સાથે -સંઘર્ષ થતો નથી. +npmમાંથી 9Router ઇન્સ્ટૉલ કરે છે. તેના પોતાના `package.json` અને +`node_modules/` સાથે `DATA_DIR/services/9router/` બનાવે છે. OmniRouteની પોતાની ડિપેન્ડન્સીઓ સાથે સંઘર્ષ થતો નથી. -**વિનંતી બોડી** (બધું વૈકલ્પિક): +**વિનંતી બોડી** (બધા વૈકલ્પિક): ```json { "version": "latest" } ``` -| ફીલ્ડ | પ્રકાર | ડિફૉલ્ટ | વર્ણન | -| --------- | -------- | ---------- | ---------------------------------------------- | -| `version` | `string` | `"latest"` | ઇન્સ્ટૉલ કરવા માટે npm version tag અથવા semver | +| ફીલ્ડ | પ્રકાર | ડિફૉલ્ટ | વર્ણન | +| --------- | -------- | ---------- | ----------------------------------------------- | +| `version` | `string` | `"latest"` | ઇન્સ્ટૉલ કરવા માટેનું npm વર્ઝન ટૅગ અથવા semver | **પ્રતિસાદો:** -| સ્ટેટસ | વર્ણન | -| ------ | ------------------------------------------------------ | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | અમાન્ય વિનંતી બોડી (Zod validation નિષ્ફળતા) | -| `409` | પહેલેથી ઇન્સ્ટૉલ થઈ રહ્યું છે (લૉક રોકાયેલો છે) | -| `500` | npm install નિષ્ફળ — સરળ ભૂલ માટે `message` જુઓ | +| સ્થિતિ | વર્ણન | +| ------ | ------------------------------------------------------------------------ | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | અમાન્ય વિનંતી બોડી (Zod માન્યતા નિષ્ફળતા) | +| `409` | ઇન્સ્ટૉલેશન પહેલેથી ચાલુ છે (લૉક મેળવાયેલો છે) | +| `500` | npm ઇન્સ્ટૉલ નિષ્ફળ થયું — સરળતાથી સમજી શકાય તેવી ભૂલ માટે `message` જુઓ | -**નોંધો:** `execFile('npm', [...])`નો ઉપયોગ કરે છે — shell કે interpolation નથી (અચળ નિયમ #13). -EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શાવવામાં આવે છે. +**નોંધો:** `execFile('npm', [...])`નો ઉપયોગ કરે છે — કોઈ શેલ નહીં, કોઈ ઇન્ટરપોલેશન નહીં (કડક નિયમ #13). +EACCES ભૂલો સરળતાથી સમજી શકાય તેવા સંદેશાઓ તરીકે દર્શાવવામાં આવે છે. --- #### `POST /api/services/9router/start` -9Router શરૂ કરે છે. જો પહેલેથી રજિસ્ટર ન હોય તો સુપરવાઇઝર રજિસ્ટર કરે છે, પછી -`supervisor.start()` કૉલ કરે છે. પહેલેથી ચાલી રહ્યું હોય ત્યારે આ idempotent છે. +9Router શરૂ કરે છે. જો સુપરવાઇઝર પહેલેથી નોંધાયેલો ન હોય, તો તેને નોંધે છે અને પછી +`supervisor.start()`ને કૉલ કરે છે. પહેલેથી ચાલી રહ્યું હોય ત્યારે આ ક્રિયા આઇડેમ્પોટન્ટ છે. -**વિનંતી બોડી:** કંઈ નહીં +**વિનંતી બોડી:** કોઈ નહીં **પ્રતિસાદો:** -| સ્ટેટસ | વર્ણન | -| ------ | -------------------------------------------------- | -| `200` | `ServiceStatus` ઑબ્જેક્ટ (નીચેનું સ્કીમા જુઓ) | -| `409` | 9Router ઇન્સ્ટૉલ નથી (`status: "not_installed"`) | -| `503` | શરૂ કરવાનું નિષ્ફળ (પ્રોસેસ ભૂલ — `lastError` જુઓ) | +| સ્થિતિ | વર્ણન | +| ------ | ------------------------------------------------------- | +| `200` | `ServiceStatus` ઑબ્જેક્ટ (નીચેની સ્કીમા જુઓ) | +| `409` | 9Router ઇન્સ્ટૉલ થયેલું નથી (`status: "not_installed"`) | +| `503` | શરૂ કરવું નિષ્ફળ થયું (પ્રોસેસ ભૂલ — `lastError` જુઓ) | **ServiceStatus સ્કીમા:** @@ -276,25 +277,25 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ #### `POST /api/services/9router/stop` -9Routerને સુવ્યવસ્થિત રીતે બંધ કરે છે. SIGTERM મોકલે છે, 15 s રાહ જુએ છે અને જો -હજુ પણ ચાલુ હોય તો SIGKILL મોકલે છે. પહેલેથી બંધ હોય ત્યારે આ idempotent છે. +9Routerને સુવ્યવસ્થિત રીતે બંધ કરે છે. SIGTERM મોકલે છે, 15 s રાહ જુએ છે અને જો હજુ પણ ચાલુ હોય તો SIGKILL મોકલે છે. +પહેલેથી બંધ હોય ત્યારે આ ક્રિયા આઇડેમ્પોટન્ટ છે. -**વિનંતી બોડી:** કંઈ નહીં +**વિનંતી બોડી:** કોઈ નહીં **પ્રતિસાદો:** -| સ્ટેટસ | વર્ણન | -| ------ | ----------------------------------- | -| `200` | `ServiceStatus` (state: "stopped") | -| `503` | બંધ કરવાનું અણધારી રીતે નિષ્ફળ થયું | +| સ્થિતિ | વર્ણન | +| ------ | ------------------------------------ | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | બંધ કરવું અનપેક્ષિત રીતે નિષ્ફળ થયું | --- #### `POST /api/services/9router/restart` -ઑપરેશન લૉક હેઠળ `stop()` અને પછી `start()` કરવા સમકક્ષ છે. +ઑપરેશન લૉક હેઠળ પહેલાં `stop()` અને પછી `start()` કરવા સમકક્ષ છે. -**વિનંતી બોડી:** કંઈ નહીં +**વિનંતી બોડી:** કોઈ નહીં **પ્રતિસાદો:** `start` જેવા જ (અંતિમ `ServiceStatus` પરત કરે છે). @@ -302,11 +303,11 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ #### `POST /api/services/9router/update` -9Routerને વધુ નવા npm version પર અપડેટ કરે છે. જો સર્વિસ ચાલી રહી હોય, તો પહેલાં -તેને બંધ કરવામાં આવે છે, npm install ચલાવવામાં આવે છે (નવું version એ જ સ્થાને -ઇન્સ્ટૉલ થાય છે) અને પછી સર્વિસ ફરીથી શરૂ કરવામાં આવે છે. +9Routerને વધુ નવા npm વર્ઝન પર અપડેટ કરે છે. જો સર્વિસ ચાલી રહી હોય, તો પહેલાં તેને બંધ +કરવામાં આવે છે, npm ઇન્સ્ટૉલ ચલાવવામાં આવે છે (નવું વર્ઝન એ જ સ્થાને ઇન્સ્ટૉલ કરીને), અને પછી +સર્વિસને ફરી શરૂ કરવામાં આવે છે. -**વિનંતી બોડી** (બધું વૈકલ્પિક): +**વિનંતી બોડી** (બધા વૈકલ્પિક): ```json { "version": "latest" } @@ -314,19 +315,21 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ **પ્રતિસાદો:** -| સ્ટેટસ | વર્ણન | +| સ્થિતિ | વર્ણન | | ------ | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | | `400` | અમાન્ય બોડી | -| `500` | npm update નિષ્ફળ | +| `500` | npm અપડેટ નિષ્ફળ થયું | --- #### `POST /api/services/9router/rotate-key` -9Router માટે નવી API કી જનરેટ કરે છે, તેને સંગ્રહિત અવસ્થામાં એન્ક્રિપ્ટ કરે છે અને સેવા ચાલુ હોય તો તેને પુનઃપ્રારંભ કરે છે, જેથી તે પોતાના એન્વાયર્નમેન્ટમાંથી નવી કી મેળવી શકે. જૂની કી તરત જ અમાન્ય થઈ જાય છે. +9Router માટે નવી API કી જનરેટ કરે છે, તેને સંગ્રહિત સ્થિતિમાં એન્ક્રિપ્ટ કરે છે અને સર્વિસ +ચાલી રહી હોય તો તેને ફરી શરૂ કરે છે, જેથી તે પોતાના એન્વાયર્નમેન્ટમાંથી નવી કી મેળવી શકે. જૂની કી +તરત જ અમાન્ય થઈ જાય છે. -**વિનંતી બોડી:** કંઈ નહીં +**વિનંતી બોડી:** કોઈ નહીં **પ્રતિસાદો:** @@ -335,7 +338,8 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ | `200` | `{ keyRotated: true, restarted: boolean }` | | `500` | કી રોટેશન નિષ્ફળ થયું | -**સુરક્ષા:** નવી કી પ્રતિસાદમાં ક્યારેય પરત કરવામાં આવતી નથી (ક્રેડેન્શિયલ લીક થતું નથી). તેને `version_manager` ટેબલમાં એન્ક્રિપ્ટેડ સ્વરૂપે (AES-256-GCM) સંગ્રહિત કરવામાં આવે છે. +**સુરક્ષા:** નવી કી પ્રતિસાદમાં ક્યારેય પરત કરવામાં આવતી નથી (ક્રેડેન્શિયલ લીક થતું નથી). +તે `version_manager` ટેબલમાં એન્ક્રિપ્ટેડ (AES-256-GCM) સ્વરૂપે સંગ્રહિત થાય છે. --- @@ -374,7 +378,8 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ #### `POST /api/services/9router/auto-start` -સ્વતઃ-પ્રારંભ ફ્લૅગને ટૉગલ કરો. જ્યારે `enabled: true` હોય, ત્યારે આગલી વખત OmniRoute બૂટ થાય ત્યારે સેવા આપમેળે શરૂ થાય છે (જો સેવા ઇન્સ્ટોલ કરેલી હોય). +ઑટો-સ્ટાર્ટ ફ્લૅગને ટૉગલ કરે છે. જ્યારે `enabled: true` હોય, ત્યારે આગલી વાર OmniRoute બૂટ થાય ત્યારે +સર્વિસ આપમેળે શરૂ થાય છે (જો સર્વિસ ઇન્સ્ટૉલ થયેલી હોય). **વિનંતી બોડી:** @@ -393,22 +398,22 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ #### `GET /api/services/9router/logs` -9Routerના stdout/stderr રિંગ બફરમાંથી લાઇવ લૉગ્સનો SSE સ્ટ્રીમ. +9Routerના stdout/stderr રિંગ બફરમાંથી લાઇવ લૉગ્સની SSE સ્ટ્રીમ. **ક્વેરી પેરામીટર્સ:** -| પેરામ | પ્રકાર | ડિફૉલ્ટ | વર્ણન | -| -------- | --------- | -------- | ------------------------------------------------------------------- | -| `tail` | `integer` | 200 | શરૂઆતમાં મોકલવાની ઐતિહાસિક લાઇનોની સંખ્યા (મહત્તમ 1000) | -| `filter` | `string` | કંઈ નહીં | અક્ષરકેસ-અસંવેદનશીલ સબસ્ટ્રિંગ ફિલ્ટર (regex નહીં — ReDoS-સુરક્ષિત) | +| પેરામીટર | પ્રકાર | ડિફૉલ્ટ | વર્ણન | +| -------- | --------- | -------- | ------------------------------------------------------------------ | +| `tail` | `integer` | 200 | પહેલાં મોકલવાની ઐતિહાસિક લાઇનોની સંખ્યા (મહત્તમ 1000) | +| `filter` | `string` | કોઈ નહીં | કેસ-અસંવેદનશીલ સબસ્ટ્રિંગ ફિલ્ટર (કોઈ regex નહીં — ReDoS-સુરક્ષિત) | **SSE ઇવેન્ટ્સ:** -| ઇવેન્ટ | ડેટા | વર્ણન | -| ----------- | ----------- | ----------------------------- | -| `snapshot` | `LogLine[]` | પ્રારંભિક ઐતિહાસિક છેલ્લો ભાગ | -| `log` | `LogLine` | લાઇવ લૉગ લાઇન | -| `heartbeat` | `{}` | દર 15 sએ કીપ-અલાઇવ | +| ઇવેન્ટ | ડેટા | વર્ણન | +| ----------- | ----------- | ----------------------- | +| `snapshot` | `LogLine[]` | પ્રારંભિક ઐતિહાસિક ટેઇલ | +| `log` | `LogLine` | લાઇવ લૉગ લાઇન | +| `heartbeat` | `{}` | દર 15 sએ કીપ-અલાઇવ | **LogLine સ્કીમા:** @@ -432,89 +437,136 @@ EACCES ભૂલો સરળ સંદેશાઓ તરીકે દર્શ ### 4.2 CLIProxyAPI એન્ડપોઇન્ટ્સ (10 રૂટ્સ) -CLIProxyAPIમાં `rotate-key` સિવાય 9Router જેવું જ એન્ડપોઇન્ટ માળખું છે, તેમજ તેમાં `accounts`, `provider-expose` અને `auto-restart-adopted` છે. હવે તેને સ્પૉન સમયે ઇન્જેક્ટ કરેલી સમર્પિત ડેટા-પ્લેન API કી મળે છે (`bootstrap.ts`માં `needsApiKey: true`, જેનો ઉપયોગ મોડલ સિંક માટે થાય છે); `status`માં ઓછાં ફીલ્ડ્સ સામેલ છે. +CLIProxyAPI પાસે 9Router જેવું જ એન્ડપોઇન્ટ માળખું છે, પરંતુ તેમાં `rotate-key` નથી અને +`accounts`, `provider-expose` તથા `auto-restart-adopted` ઉમેરવામાં આવ્યા છે. હવે તેને +સ્પૉન સમયે ઇન્જેક્ટ કરેલી સમર્પિત ડેટા-પ્લેન API કી મળે છે (`bootstrap.ts`માં +`needsApiKey: true`, જેનો ઉપયોગ મોડેલ સિંક માટે થાય છે); `status`માં ઓછાં ફીલ્ડ્સ સામેલ છે. | પદ્ધતિ | પાથ | વર્ણન | | ------ | ----------------------------------- | -------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | npmમાંથી CLIProxyAPI ઇન્સ્ટોલ કરો | +| `POST` | `/api/services/cliproxy/install` | npmમાંથી CLIProxyAPI ઇન્સ્ટૉલ કરો | | `POST` | `/api/services/cliproxy/start` | CLIProxyAPI શરૂ કરો | | `POST` | `/api/services/cliproxy/stop` | CLIProxyAPI બંધ કરો | | `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI પુનઃપ્રારંભ કરો | -| `POST` | `/api/services/cliproxy/update` | નવા વર્ઝન પર અપડેટ કરો | +| `POST` | `/api/services/cliproxy/update` | વધુ નવા વર્ઝન પર અપડેટ કરો | | `GET` | `/api/services/cliproxy/status` | લાઇવ + DB સ્થિતિ (`apiKeyMasked` વિના) | -| `POST` | `/api/services/cliproxy/auto-start` | સ્વતઃ-પ્રારંભ ટૉગલ કરો | +| `POST` | `/api/services/cliproxy/auto-start` | સ્વચાલિત પ્રારંભ ટૉગલ કરો | -વહેંચાયેલું `GET /api/services/{name}/logs` એન્ડપોઇન્ટ (§4.1 જુઓ) `[name]` ડાયનેમિક સેગમેન્ટનો ઉપયોગ કરીને ચારેય સેવાઓ માટે કાર્ય કરે છે. +સાંઝો `GET /api/services/{name}/logs` એન્ડપોઇન્ટ (§4.1 જુઓ) `[name]` ડાયનેમિક +સેગમેન્ટનો ઉપયોગ કરીને ચારેય સેવાઓ માટે કાર્ય કરે છે. --- ### 4.3 Mux એન્ડપોઇન્ટ્સ (8 રૂટ્સ) -Muxમાં CLIProxyAPI જેવું જ એન્ડપોઇન્ટ માળખું છે — API સપાટી પર કોઈ `rotate-key` રૂટ નથી (બેરર ટોકન `getOrCreateApiKey("mux")` દ્વારા 9Routerની જેમ જ જનરેટ થાય છે અને `MUX_SERVER_AUTH_TOKEN` એન્વાયર્નમેન્ટ વેરિએબલ મારફતે ઇન્જેક્ટ કરવામાં આવે છે, પરંતુ હજી સુધી કોઈ સમર્પિત રોટેશન એન્ડપોઇન્ટ નથી). Mux માત્ર લાઇફસાઇકલ-મેનેજ્ડ છે: 9Routerથી વિપરીત, તેમાં કોઈ Layer 4 એક્ઝિક્યુટર નથી અને તેને ક્યારેય રાઉટિંગ પ્રોવાઇડર તરીકે નોંધવામાં આવતું નથી. +Mux પાસે CLIProxyAPI જેવું જ એન્ડપોઇન્ટ માળખું છે — API સપાટી પર કોઈ `rotate-key` +રૂટ નથી (બેરર ટોકન 9Routerની જેમ જ `getOrCreateApiKey("mux")` દ્વારા જનરેટ થાય છે +અને `MUX_SERVER_AUTH_TOKEN` એન્વાયરમેન્ટ વેરિએબલ મારફતે ઇન્જેક્ટ થાય છે, પરંતુ +હજુ સુધી કોઈ સમર્પિત રોટેશન એન્ડપોઇન્ટ નથી). Mux માત્ર લાઇફસાઇકલ દ્વારા સંચાલિત છે: +9Routerથી વિપરીત, તેમાં કોઈ Layer 4 એક્ઝિક્યુટર નથી અને તેને ક્યારેય રાઉટિંગ +પ્રોવાઇડર તરીકે નોંધવામાં આવતું નથી. | પદ્ધતિ | પાથ | વર્ણન | | ------ | ------------------------------ | --------------------------------------- | -| `POST` | `/api/services/mux/install` | npmમાંથી Mux ઇન્સ્ટોલ કરો (`npm i mux`) | +| `POST` | `/api/services/mux/install` | npmમાંથી Mux ઇન્સ્ટૉલ કરો (`npm i mux`) | | `POST` | `/api/services/mux/start` | Mux શરૂ કરો (`mux server`) | | `POST` | `/api/services/mux/stop` | Mux બંધ કરો | | `POST` | `/api/services/mux/restart` | Mux પુનઃપ્રારંભ કરો | -| `POST` | `/api/services/mux/update` | નવા npm વર્ઝન પર અપડેટ કરો | +| `POST` | `/api/services/mux/update` | વધુ નવા npm વર્ઝન પર અપડેટ કરો | | `GET` | `/api/services/mux/status` | લાઇવ + DB સ્થિતિ | -| `POST` | `/api/services/mux/auto-start` | સ્વતઃ-પ્રારંભ ટૉગલ કરો | +| `POST` | `/api/services/mux/auto-start` | સ્વચાલિત પ્રારંભ ટૉગલ કરો | --- ### 4.4 Bifrost એન્ડપોઇન્ટ્સ (8 રૂટ્સ) -Bifrost એ Go AI-ગેટવે રિલે બેકએન્ડ (`@maximhq/bifrost`) છે. તે CLIProxyAPI જેવું જ એન્ડપોઇન્ટ માળખું વાપરે છે (`rotate-key` વિના — Bifrost પોતાની પ્રોવાઇડર કીઓનું સંચાલન તેના `-app-dir` હેઠળની `config.json`માં કરે છે). +Bifrost એ Go AI-ગેટવે રિલે બેકએન્ડ (`@maximhq/bifrost`) છે. તે CLIProxyAPI જેવું જ +એન્ડપોઇન્ટ માળખું વાપરે છે (`rotate-key` નથી — Bifrost તેની પોતાની પ્રોવાઇડર કીઝને +તેના `-app-dir` હેઠળના `config.json`માં સંચાલિત કરે છે). -| પદ્ધતિ | પાથ | વર્ણન | -| ------ | ---------------------------------- | --------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | npm (`@maximhq/bifrost`) માંથી Bifrost ઇન્સ્ટોલ કરો | -| `POST` | `/api/services/bifrost/start` | Bifrost ને પોર્ટ 8080 (ડિફૉલ્ટ) પર શરૂ કરો | -| `POST` | `/api/services/bifrost/stop` | Bifrost બંધ કરો | -| `POST` | `/api/services/bifrost/restart` | Bifrost પુનઃપ્રારંભ કરો | -| `POST` | `/api/services/bifrost/update` | વધુ નવા સંસ્કરણ પર અપડેટ કરો | -| `GET` | `/api/services/bifrost/status` | લાઇવ + DB સ્થિતિ | -| `POST` | `/api/services/bifrost/auto-start` | સ્વતઃ-પ્રારંભ ટૉગલ કરો | -| `GET` | `/api/services/bifrost/logs` | SSE લૉગ ટેઇલ (શેર કરેલ `[name]/logs` ડાયનેમિક રૂટ દ્વારા) | +| પદ્ધતિ | પાથ | વર્ણન | +| ------ | ---------------------------------- | ------------------------------------------------------ | +| `POST` | `/api/services/bifrost/install` | npmમાંથી Bifrost ઇન્સ્ટૉલ કરો (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | પોર્ટ 8080 પર Bifrost શરૂ કરો (ડિફૉલ્ટ) | +| `POST` | `/api/services/bifrost/stop` | Bifrost બંધ કરો | +| `POST` | `/api/services/bifrost/restart` | Bifrost પુનઃપ્રારંભ કરો | +| `POST` | `/api/services/bifrost/update` | વધુ નવા વર્ઝન પર અપડેટ કરો | +| `GET` | `/api/services/bifrost/status` | લાઇવ + DB સ્થિતિ | +| `POST` | `/api/services/bifrost/auto-start` | સ્વચાલિત પ્રારંભ ટૉગલ કરો | +| `GET` | `/api/services/bifrost/logs` | SSE લૉગ ટેઇલ (સાંઝા `[name]/logs` ડાયનેમિક રૂટ મારફતે) | -**રાઉટિંગ જોડાણ:** જ્યારે `BIFROST_BASE_URL` સેટ ન હોય અને નિરીક્ષણ હેઠળનું Bifrost -ઇન્સ્ટન્સ ચાલી રહ્યું હોય, ત્યારે `getBifrostRoutingConfig()` (`routingBackend.ts` માં) આપમેળે -`http://127.0.0.1:{port}` નો રિલે બેઝ URL તરીકે ઉપયોગ કરે છે. સ્પષ્ટ રીતે સેટ કરેલ `BIFROST_BASE_URL` env -હંમેશાં પ્રાથમિકતા મેળવે છે. +**રાઉટિંગ વાયરિંગ:** જ્યારે `BIFROST_BASE_URL` સેટ ન હોય અને સુપરવાઇઝ કરાયેલું Bifrost +ઇન્સ્ટન્સ ચાલી રહ્યું હોય, ત્યારે `getBifrostRoutingConfig()` (`routingBackend.ts`માં) +આપમેળે `http://127.0.0.1:{port}`નો રિલે બેઝ URL તરીકે ઉપયોગ કરે છે. સ્પષ્ટપણે સેટ +કરેલું `BIFROST_BASE_URL` એન્વાયરમેન્ટ વેરિએબલ હંમેશાં પ્રાથમિકતા મેળવે છે. --- ### 4.5 Dario એન્ડપોઇન્ટ્સ (12 રૂટ્સ) -અન્ય સેવાઓ જેવું જ જીવનચક્ર માળખું (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`) ઉપરાંત `admin/` હેઠળ ટોકન-ગેટેડ OAuth -કંટ્રોલ પ્લેન: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (બધા `DARIO_ADMIN_TOKEN` દ્વારા સુરક્ષિત). +અન્ય સેવાઓ જેવું જ લાઇફસાઇકલ માળખું (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`) ઉપરાંત `admin/` હેઠળ +ટોકન-ગેટેડ OAuth કંટ્રોલ પ્લેન છે: `admin/accounts`, `admin/import-from-omniroute`, +`admin/login-start`, `admin/login-complete` (બધાં `DARIO_ADMIN_TOKEN` દ્વારા સુરક્ષિત છે). -### 4.6 રિવર્સ પ્રોક્સી (9Router ડૅશબોર્ડ એમ્બેડ) +### 4.6 open-wa એન્ડપોઇન્ટ્સ (7 રૂટ્સ) -ડૅશબોર્ડ આંતરિક રિવર્સ પ્રોક્સી દ્વારા iframe ની અંદર 9Router વેબ UI એમ્બેડ કરે છે: +open-wa (`@open-wa/wa-automate`) WhatsApp Webને સ્વચાલિત કરવા માટે હેડલેસ Chromium +ઇન્સ્ટન્સને (Puppeteer મારફતે) ચલાવે છે. તે Mux જેવું જ એન્ડપોઇન્ટ માળખું વાપરે છે +(હજુ સુધી કોઈ `rotate-key` રૂટ નથી). તે માત્ર લાઇફસાઇકલ દ્વારા સંચાલિત છે — રાઉટિંગ +ટાર્ગેટ નથી અને કોઈ Layer 4 એક્ઝિક્યુટર/પ્રોવાઇડર એન્ટ્રી નથી. + +| પદ્ધતિ | પાથ | વર્ણન | +| ------ | --------------------------------- | ---------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | npm પરથી open-wa (`@open-wa/wa-automate`) ઇન્સ્ટોલ કરો | +| `POST` | `/api/services/openwa/start` | પોર્ટ 8323 (ડિફૉલ્ટ) પર open-wa શરૂ કરો | +| `POST` | `/api/services/openwa/stop` | open-wa બંધ કરો | +| `POST` | `/api/services/openwa/restart` | open-wa ફરી શરૂ કરો | +| `POST` | `/api/services/openwa/update` | નવી આવૃત્તિ પર અપડેટ કરો | +| `GET` | `/api/services/openwa/status` | લાઇવ + DB સ્થિતિ | +| `POST` | `/api/services/openwa/auto-start` | ઑટો-સ્ટાર્ટ ટૉગલ કરો | +| `GET` | `/api/services/openwa/logs` | SSE લૉગ ટેઇલ (શેર કરેલા `[name]/logs` ડાયનેમિક રૂટ મારફતે) | + +**API કી:** `WA_KEY` તરીકે ઇન્જેક્ટ કરવામાં આવે છે — open-waનું સામાન્ય `WA_*`-પ્રીફિક્સ ધરાવતું env +ઓવરરાઇડ તેને `--key`/`-k` CLI વિકલ્પ પર મેપ કરે છે +(`dist/cli/setup.js::envArgs()`, ઇન્સ્ટોલ કરેલા 4.76.0 +પૅકેજ સામે ચકાસેલું). `generateServiceApiKey()` દ્વારા જનરેટ થાય ત્યારે `ow_` પ્રીફિક્સ ઉમેરાય છે. open-wa +કી ને `key`/`api_key` HTTP હેડરમાંથી પાછી વાંચે છે (`Authorization: +Bearer`માંથી નહીં); `/api-docs*`ને ચકાસણીમાંથી સ્પષ્ટપણે મુક્ત રાખવામાં આવ્યું છે +(`dist/cli/server.js`માં `setupAuthenticationLayer`), તેથી હેલ્થ પ્રોબને +કોઈ auth હેડરની જરૂર નથી. + +**પેરિંગ:** open-wa બિનસત્તાવાર છે અને WhatsApp સાથે સંકળાયેલું નથી — +કનેક્ટ કરેલા નંબર પર WhatsAppની પોતાની ઑટોમેશન શોધ પ્રણાલીને કારણે પ્રતિબંધનું જોખમ રહે છે. +પ્રથમ વખત શરૂ કરતી વખતે, પેરિંગ QR કોડ stdout પર પ્રિન્ટ થાય છે અને +હાલની લૉગ્સ પેનલ/SSE સ્ટ્રીમ દ્વારા દર્શાવવામાં આવે છે — આ ઇન્ટિગ્રેશનમાં હજુ +કોઈ સમર્પિત QR-ઇમેજ એન્ડપોઇન્ટ નથી. + +--- + +### 4.7 રિવર્સ પ્રૉક્સી (9Router ડૅશબોર્ડ એમ્બેડ) + +ડૅશબોર્ડ આંતરિક રિવર્સ +પ્રૉક્સી મારફતે 9Router વેબ UIને iframeની અંદર એમ્બેડ કરે છે: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] ``` -આ પ્રોક્સી: +આ પ્રૉક્સી: -- વિનંતીને `http://127.0.0.1:{port}/{path}` પર ફોરવર્ડ કરે છે (ફક્ત લૂપબૅક) -- ઇનકમિંગ `cookie` અને `authorization` હેડર્સ દૂર કરે છે (OmniRoute સેશન લીક થતું નથી) +- વિનંતીને `http://127.0.0.1:{port}/{path}` પર ફૉર્વર્ડ કરે છે (ફક્ત લૂપબૅક) +- ઇનકમિંગ `cookie` અને `authorization` હેડરો દૂર કરે છે (OmniRoute સેશનનું કોઈ લીકેજ નહીં) - 9Router પ્રમાણીકરણ માટે `Authorization: Bearer {apiKey}` ઇન્જેક્ટ કરે છે - પ્રતિસાદમાંથી `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` દૂર કરે છે -- `` ઇન્જેક્ટ કરવા અને ઍબ્સોલ્યુટ પાથ્સને સામાન્ય બનાવવા માટે HTML પ્રતિસાદોને ફરીથી લખે છે (`/foo` → `/dashboard/.../embed/foo`) +- `` ઇન્જેક્ટ કરવા અને ઍબ્સોલ્યુટ પાથને સામાન્યકૃત કરવા માટે HTML પ્રતિસાદો ફરી લખે છે (`/foo` → `/dashboard/.../embed/foo`) -એમ્બેડ કરેલા ડૅશબોર્ડ માટેના WebSocket અપગ્રેડ્સને સમર્પિત પોર્ટ પરના સહાયક સર્વર દ્વારા -હેન્ડલ કરવામાં આવે છે (`src/lib/services/embedWsProxy.ts` જુઓ). +એમ્બેડ કરેલા ડૅશબોર્ડ માટેના WebSocket અપગ્રેડને +સમર્પિત પોર્ટ પરના સહાયક સર્વર દ્વારા સંભાળવામાં આવે છે (`src/lib/services/embedWsProxy.ts` જુઓ). -**સુરક્ષા:** એમ્બેડ પ્રોક્સી રૂટ્સને `LOCAL_ONLY_API_PREFIXES` -હેઠળ વર્ગીકૃત કરવામાં આવ્યા છે અને તેમને ફક્ત લૂપબૅક પરથી જ ઍક્સેસ કરી શકાય છે. Cloudflare/Ngrok -ટનલ દ્વારા JWT મેળવનાર હુમલાખોર એમ્બેડ કરેલી સેવાઓમાં પ્રોક્સી કરી શકતો નથી. +**સુરક્ષા:** એમ્બેડ પ્રૉક્સી રૂટ્સને `LOCAL_ONLY_API_PREFIXES` હેઠળ વર્ગીકૃત કરવામાં આવ્યા છે +અને તેમને ફક્ત લૂપબૅકથી જ ઍક્સેસ કરી શકાય છે. Cloudflare/Ngrok ટનલ મારફતે +JWT મેળવનાર હુમલાખોર એમ્બેડ કરેલી સેવાઓમાં પ્રૉક્સી કરી શકતો નથી. --- diff --git a/docs/i18n/gu/docs/frameworks/MEMORY.md b/docs/i18n/gu/docs/frameworks/MEMORY.md index ca66f0f0ac7c..f144003bd768 100644 --- a/docs/i18n/gu/docs/frameworks/MEMORY.md +++ b/docs/i18n/gu/docs/frameworks/MEMORY.md @@ -136,32 +136,35 @@ RRF(d) = Σ 1 / (k + rank_i(d)) જ્યાં k = 60 (MEMORY_RRF_K દ ## સેટિંગ્સ એક્સ્ટેન્શન -`src/shared/schemas/memory.ts` માં `MemorySettingsExtended` માટે નવ એમ્બેડિંગ અને વેક્ટર ફીલ્ડ ઉપલબ્ધ છે, જે `src/lib/db/settings.ts` મારફતે સ્થાયી રીતે સંગ્રહિત થાય છે: - -| ફીલ્ડ | પ્રકાર | ડિફૉલ્ટ | વર્ણન | -| ------------------------ | -------------------------------------------------- | -------- | ----------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | કયા એમ્બેડિંગ સ્રોતનો ઉપયોગ કરવો | -| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` ફોર્મેટમાં પ્રદાતા/મોડેલ | -| `customBaseUrl` | `string \| null` | `null` | ફક્ત મેમરી માટેનો OpenAI-સુસંગત એન્ડપોઇન્ટ બેઝ URL | -| `customModelId` | `string \| null` | `null` | કસ્ટમ એન્ડપોઇન્ટને મોકલવામાં આવતી મોડેલ ID | -| `transformersEnabled` | `boolean` | `false` | Transformers.js માટે ઑપ્ટ-ઇન (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | સ્થિર potion-base-8M સ્થાનિક મોડેલ માટે ઑપ્ટ-ઇન | -| `rerankEnabled` | `boolean` | `false` | પુનઃક્રમનિર્ધારણ પગલું સક્ષમ કરો (દર વિનંતીએ +200-500ms ઉમેરે છે) | -| `rerankProviderModel` | `string \| null` | `null` | `provider/model` ફોર્મેટમાં પુનઃક્રમનિર્ધારણ પ્રદાતા/મોડેલ | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | કયા વેક્ટર બૅકએન્ડનો ઉપયોગ કરવો | - -આને `GET /PUT /api/settings/memory` (સ્કીમા `MemorySettingsExtendedSchema`) મારફતે ઉપલબ્ધ કરાવવામાં આવ્યા છે. +`MemorySettingsExtended` માં નવ એમ્બેડિંગ અને વેક્ટર ફીલ્ડ ઉપલબ્ધ છે, જે +`src/shared/schemas/memory.ts` માં વ્યાખ્યાયિત છે અને `src/lib/db/settings.ts` દ્વારા પર્સિસ્ટ કરવામાં આવે છે: + +| ફીલ્ડ | પ્રકાર | ડિફૉલ્ટ | વર્ણન | +| ------------------------ | -------------------------------------------------- | -------- | ----------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | કયો એમ્બેડિંગ સ્રોત વાપરવો | +| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` ફોર્મેટમાં પ્રોવાઇડર/મોડેલ | +| `customBaseUrl` | `string \| null` | `null` | માત્ર મેમરી માટેનો OpenAI-સુસંગત એન્ડપોઇન્ટ બેઝ URL | +| `customModelId` | `string \| null` | `null` | કસ્ટમ એન્ડપોઇન્ટને મોકલવામાં આવતું મોડેલ ID | +| `transformersEnabled` | `boolean` | `false` | Transformers.js માટે ઑપ્ટ-ઇન (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | સ્ટેટિક potion-base-8M લોકલ મોડેલ માટે ઑપ્ટ-ઇન | +| `rerankEnabled` | `boolean` | `false` | રીરૅન્કિંગ સ્ટેપ સક્ષમ કરો (દર વિનંતીએ +200-500ms ઉમેરે છે) | +| `rerankProviderModel` | `string \| null` | `null` | `provider/model` ફોર્મેટમાં રીરૅન્ક પ્રોવાઇડર/મોડેલ | + +`rerankProviderModel` ને `POST /v1/rerank` દ્વારા રિઝોલ્વ કરવામાં આવે છે (જેને લૂપબૅક પર કૉલ કરવામાં આવે છે), તેથી તે રૂટ જે કંઈ સ્વીકારે છે તે બધું આ પણ સ્વીકારે છે: પસંદગીપૂર્વક ગોઠવાયેલ ક્લાઉડ રીરૅન્ક મોડેલ (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) અથવા `/` તરીકે OpenAI-સુસંગત પ્રોવાઇડર નોડ (દા.ત. TEI/Infinity બૉક્સ માટે `skilled-mini/bge-reranker-v2-m3`). લૂપબૅક નોડ હંમેશાં પાત્ર હોય છે; બીજા હોસ્ટ (LAN, Tailscale) પરના નોડ માટે વધારામાં `RERANK_REMOTE_PROVIDER_NODES` ફીચર ફ્લૅગ આવશ્યક છે અને તેણે પ્રોવાઇડર આઉટબાઉન્ડ URL પૉલિસી પાસ કરવી આવશ્યક છે — [ફીચર ફ્લૅગ્સ](../reference/FEATURE_FLAGS.md) જુઓ. ડૅશબોર્ડ સિલેક્ટર પસંદગીપૂર્વક ગોઠવાયેલા પ્રોવાઇડર ઉપરાંત લોકલ નોડની યાદી દર્શાવે છે; કોઈપણ માન્ય `provider/model` સ્ટ્રિંગને `PUT /api/settings/memory` દ્વારા સીધું સેટ કરી શકાય છે. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | કયો વેક્ટર બૅકએન્ડ વાપરવો | + +આ `GET /PUT /api/settings/memory` દ્વારા ઉપલબ્ધ કરાવવામાં આવે છે (સ્કીમા `MemorySettingsExtendedSchema`). `remote` સ્રોત માટે, Memory વૈકલ્પિક `customBaseUrl` અને -`customModelId` સેટિંગ્સ પણ સ્વીકારે છે. બંને સાથે મળીને વૈશ્વિક એમ્બેડિંગ રજિસ્ટ્રી બદલ્યા વિના OpenAI-સુસંગત `/embeddings` +`customModelId` સેટિંગ્સ પણ સ્વીકારે છે. બંને સાથે મળીને ગ્લોબલ એમ્બેડિંગ રજિસ્ટ્રી બદલ્યા વિના OpenAI-સુસંગત `/embeddings` એન્ડપોઇન્ટ અને મોડેલ પસંદ કરે છે. ઉપયોગ પહેલાં એન્ડપોઇન્ટને -સામાન્યીકૃત કરવામાં આવે છે અને પ્રદાતાની આઉટબાઉન્ડ URL નીતિ દ્વારા તેની ચકાસણી કરવામાં આવે છે: HTTP(S) -આવશ્યક છે, એમ્બેડ કરેલા ક્રેડેન્શિયલ્સ અને ક્વેરી સ્ટ્રિંગ્સ નકારવામાં આવે છે, અને ક્લાઉડ-મેટાડેટા -સરનામાં અવરોધિત રહે છે. ખાલી મૂલ્યો પસંદ કરેલા રજિસ્ટ્રી પ્રદાતાને યથાવત્ રાખે છે. ડેશબોર્ડને -પરત કરવામાં આવતી ભૂલોને સેનિટાઇઝ કરવામાં આવે છે અને એન્ડપોઇન્ટ ક્રેડેન્શિયલ્સ ક્યારેય લૉગ કરવામાં આવતા નથી. +નોર્મલાઇઝ કરવામાં આવે છે અને પ્રોવાઇડર આઉટબાઉન્ડ URL પૉલિસી દ્વારા તપાસવામાં આવે છે: HTTP(S) +આવશ્યક છે, એમ્બેડ કરાયેલા ક્રેડેન્શિયલ્સ અને ક્વેરી સ્ટ્રિંગ્સ નકારવામાં આવે છે, અને ક્લાઉડ-મેટાડેટા +એડ્રેસ બ્લૉક જ રહે છે. ખાલી મૂલ્યો પસંદ કરેલા રજિસ્ટ્રી પ્રોવાઇડરને જાળવી રાખે છે. ડૅશબોર્ડને +પરત કરવામાં આવતી ભૂલોને સૅનિટાઇઝ કરવામાં આવે છે અને એન્ડપોઇન્ટ ક્રેડેન્શિયલ્સ ક્યારેય લૉગ કરવામાં આવતા નથી. -> **TODO (D20):** `global` સ્કોપ (તમામ API કીઝમાં મેમરીઝ શેર કરવી) આ રિલીઝમાં -> અમલમાં મૂકવામાં આવ્યો નથી. તેના માટે સ્કીમામાં ફેરફારો અને વૈશ્વિક પુનઃપ્રાપ્તિ +> **TODO (D20):** `global` સ્કોપ (તમામ API કી વચ્ચે મેમરીઓ શેર કરવી) આ રિલીઝમાં +> અમલમાં મૂકવામાં આવ્યો નથી. તેના માટે સ્કીમામાં ફેરફારો અને ગ્લોબલ રિટ્રીવલ > પાથ જરૂરી છે. તેને અલગથી ટ્રૅક કરો. ## સ્ટોરેજ સ્તરો diff --git a/docs/i18n/gu/docs/guides/DOCKER_GUIDE.md b/docs/i18n/gu/docs/guides/DOCKER_GUIDE.md index f3a79b52afdd..3bd2d45a6c04 100644 --- a/docs/i18n/gu/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/gu/docs/guides/DOCKER_GUIDE.md @@ -25,7 +25,13 @@ --- -## ઝડપી રીતે ચલાવો +## ઝડપી ચલાવવું + +> **એક જ આદેશથી સ્વ-હોસ્ટ કરવું છે?** જુઓ +> [સ્વ-હોસ્ટ માર્ગદર્શિકા](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (પ્રકાશિત ઇમેજ + +> Redis, ફક્ત લૂપબૅક, પ્રોફાઇલની કોઈ પસંદગી નહીં). નીચે આપેલ ઝડપી ચલાવવાનો વિકલ્પ એવા +> વપરાશકર્તાઓ માટેનો સિંગલ-કન્ટેનર માર્ગ છે, જેઓ પહેલેથી જ અન્યત્ર Redis ચલાવે છે. ```bash docker run -d \ diff --git a/docs/i18n/gu/docs/guides/TROUBLESHOOTING.md b/docs/i18n/gu/docs/guides/TROUBLESHOOTING.md index 6ab56fc3eea8..bf1543e62324 100644 --- a/docs/i18n/gu/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/gu/docs/guides/TROUBLESHOOTING.md @@ -68,15 +68,23 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # તરત ફરી પ્રય ## npm install ચેતવણીઓ (ERESOLVE / peer / deprecated) -જ્યારે તમે `npm install -g omniroute` ચલાવો છો, ત્યારે તમને `npm warn ERESOLVE`, peer-dependency સૂચનાઓ અને `deprecated` સંદેશાઓ જેવી ઘણી ચેતવણીઓ જોવા મળી શકે છે. **આ અપેક્ષિત અને હાનિરહિત છે.** જો આઉટપુટમાં `added packages` દેખાય, તો તમારું ઇન્સ્ટોલેશન સફળ થયું છે. +જ્યારે તમે `npm install -g omniroute` ચલાવો છો, ત્યારે તમને `npm warn ERESOLVE`, peer-dependency સૂચનાઓ અને `deprecated` સંદેશાઓ જેવી ઘણી ચેતવણીઓ દેખાઈ શકે છે. **આ અપેક્ષિત અને હાનિરહિત છે.** જો આઉટપુટમાં `added packages` દેખાય, તો તમારું ઇન્સ્ટોલેશન સફળ થયું છે. -આ ચેતવણીઓ એવા તૃતીય-પક્ષ પૅકેજોમાં જૂની peer-dependency શ્રેણીઓને કારણે આવે છે, જેના પર OmniRouteનું નિયંત્રણ નથી: +peer-dependency રિઝોલ્યુશન ચેતવણીઓને દબાવવા માટે, OmniRouteનું સમર્થિત ઇન્સ્ટોલેશન સ્વરૂપ વાપરો: -1. **`marked-terminal` ને `marked >=1 <16` જોઈએ છે, પરંતુ `marked@18` મળ્યું** — વ્યવહારમાં યોગ્ય રીતે કાર્ય કરે છે; upstream peer શ્રેણી માત્ર જૂની છે. -2. **`deprecated prebuild-install@7.1.3`** — આ એક transitive native-binary fetch helper છે. તેનો ઉપયોગ પિન કરેલ `wreq-js` transport binding ઇન્સ્ટોલ કરવા માટે થતો નથી અને તે web-cookie - provider transport સેટઅપ નિષ્ફળ ગયું હોવાનું સૂચવતું નથી. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` માત્ર `ERESOLVE` અને peer-dependency સૂચનાઓને દબાવે છે. ડિપ્રિકેશન સૂચનાઓ દેખાતી રહે છે, કારણ કે તે ટ્રાન્ઝિટિવ તૃતીય-પક્ષ પેકેજોમાંથી આવે છે; તે ઇન્સ્ટોલેશન નિષ્ફળ ગયું હોવાનું સૂચવતી નથી. + +આ ચેતવણીઓ એવા તૃતીય-પક્ષ પેકેજોમાંની જૂની peer-dependency રેન્જને કારણે આવે છે, જેના પર OmniRouteનું નિયંત્રણ નથી: + +1. **`marked-terminal`ને `marked >=1 <16` જોઈએ છે, પરંતુ `marked@18` મળ્યું** — વ્યવહારમાં તે બરાબર કાર્ય કરે છે; upstream peer રેન્જ માત્ર જૂની છે. +2. **`deprecated prebuild-install@7.1.3`** — ટ્રાન્ઝિટિવ નેટિવ-બાઇનરી ફેચ હેલ્પર. તેનો ઉપયોગ પિન કરેલ `wreq-js` ટ્રાન્સપોર્ટ બાઇન્ડિંગ ઇન્સ્ટોલ કરવા માટે થતો નથી અને તે web-cookie + પ્રોવાઇડર ટ્રાન્સપોર્ટ સેટઅપ નિષ્ફળ ગયું હોવાનું સૂચવતું નથી. -**કોઈ પગલાં લેવાની જરૂર નથી** — upstream પૅકેજોને fork કર્યા વિના આ ચેતવણીઓને સંપૂર્ણપણે બંધ કરી શકાતી નથી. +**કોઈ પગલાં લેવાની જરૂર નથી** — upstream પેકેજોને fork કર્યા વિના આ ચેતવણીઓને સંપૂર્ણપણે દબાવી શકાતી નથી. --- diff --git a/docs/i18n/gu/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/gu/docs/providers/CURSOR-API-KEY-AND-CLI.md index 90c5e84342cc..a29dd6e73689 100644 --- a/docs/i18n/gu/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/gu/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,29 +4,29 @@ --- -IDE સત્ર વિના Cursorને OmniRouteની પાછળ મૂકવાની બે રીતો: +IDE સેશન વિના Cursorને OmniRoute પાછળ મૂકવાની બે રીતો: 1. **`cursor-api` પ્રોવાઇડર** (કાર્ડ "Cursor API", ઉપનામ `cua`): API કી-આધારિત પ્રોવાઇડર, જે Cursor વપરાશકર્તાની API કી (`crsr_…`, જે `https://cursor.com/dashboard/api` પર જનરેટ થાય છે) રાખે છે. ત્યારબાદ કોઈપણ OmniRoute ક્લાયન્ટ - સામાન્ય ક્વોટા, ફૉલબૅક અને લૉગિંગ સ્તરો સાથે `/v1/chat/completions` દ્વારા - `cursor-api/` અથવા `cua/` તરીકે Cursor મોડલ્સને ઍક્સેસ કરી શકે છે. IDE - પ્રોવાઇડર (`cursor`, OAuth/IDE સત્ર) યથાવત્ રહે છે. -2. **Cursor CLI પાસથ્રૂ**: Cursor CLI (`agent`)ને OmniRoute તરફ નિર્દેશિત કરો, જેથી + સામાન્ય ક્વોટા, ફૉલબૅક અને લૉગિંગ લેયર્સ સાથે `/v1/chat/completions` મારફતે + `cursor-api/` અથવા `cua/` તરીકે Cursor મોડલ્સ ઍક્સેસ કરે છે. IDE + પ્રોવાઇડર (`cursor`, OAuth/IDE સેશન) યથાવત્ રહે છે. +2. **Cursor CLI પાસથ્રૂ**: Cursor CLI (`agent`)ને OmniRoute તરફ નિર્દેશિત કરો જેથી CLI દ્વારા કરવામાં આવતી દરેક RPC OmniRoute API કી વડે પ્રમાણિત થાય, તેને - `cursor-api` કનેક્શનના ક્રેડેન્શિયલ સાથે Cursorને ફૉર્વર્ડ કરવામાં આવે અને - Logs પેજમાં નોંધવામાં આવે. + `cursor-api` કનેક્શનના ક્રેડેન્શિયલ સાથે Cursor પર ફૉરવર્ડ કરવામાં આવે અને + Logs પેજમાં રેકોર્ડ કરવામાં આવે. -## કીનું એક્સચેન્જ શા માટે થાય છે +## કીનું વિનિમય શા માટે થાય છે `api2.cursor.sh` કાચી `crsr_…` કીને Bearer ટોકન તરીકે નકારે છે (401). Cursor CLI પહેલાં કીને `/auth/exchange_user_api_key` પર POST કરે છે અને એક કલાક પછી -સમાપ્ત થતું સત્ર JWT મેળવે છે; પરત મળતું `refreshToken` પણ એ જ -`exp` ધરાવે છે, તેથી રિફ્રેશ કરવાનો અર્થ કીનું ફરી એક્સચેન્જ કરવું છે. -`open-sse/services/cursorApiKeyAuth.ts` એ એક્સચેન્જ કરે છે, દરેક કી દીઠ એક સત્ર -ટોકન કૅશ કરે છે, સમાપ્તિના પાંચ મિનિટ પહેલાં ફરી એક્સચેન્જ કરે છે અને Cursor -401 સાથે જવાબ આપે ત્યારે કૅશ કરેલું ટોકન દૂર કરે છે. `CursorExecutor` -`cursor-api` કનેક્શન્સ માટે અપસ્ટ્રીમ સ્ટ્રીમ ખોલતાં બરાબર પહેલાં તેને કૉલ કરે છે. +સમાપ્ત થતું સેશન JWT મેળવે છે; પરત મળેલું `refreshToken` સમાન +`exp` ધરાવે છે, તેથી રિફ્રેશ કરવાનો અર્થ કીનું ફરીથી વિનિમય કરવું છે. +`open-sse/services/cursorApiKeyAuth.ts` આ વિનિમય કરે છે, દરેક કી દીઠ એક સેશન +ટોકન કૅશ કરે છે, સમાપ્તિથી પાંચ મિનિટ પહેલાં ફરીથી વિનિમય કરે છે અને Cursor +401 જવાબ આપે ત્યારે કૅશ કરેલું ટોકન કાઢી નાખે છે. `CursorExecutor` +`cursor-api` કનેક્શન્સ માટે અપસ્ટ્રીમ સ્ટ્રીમ ખોલતાં તરત પહેલાં તેને કૉલ કરે છે. ## `cursor-api` પ્રોવાઇડર @@ -47,7 +47,7 @@ curl -sS -X POST http://localhost:20128/api/providers \ -d '{"provider":"cursor-api","name":"cursor-api-key","apiKey":"crsr_…","priority":1}' ``` -ત્યારબાદ: +પછી: ```bash curl -sS http://localhost:20128/v1/chat/completions \ @@ -58,41 +58,53 @@ curl -sS http://localhost:20128/v1/chat/completions \ નોંધો: -- `cursor-api` માટેની મોડલ સૂચિ સ્ટૅટિક Cursor રજિસ્ટ્રીમાંથી આવે છે (એ જ - સૂચિનો IDE પ્રોવાઇડર ફૉલબૅક તરીકે ઉપયોગ કરે છે); OmniRoute હોસ્ટ પર +- `cursor-api` માટેની મોડલ સૂચિ સ્થિર Cursor રજિસ્ટ્રીમાંથી આવે છે (એ જ સૂચિ + જેનો IDE પ્રોવાઇડર ફૉલબૅક તરીકે ઉપયોગ કરે છે); OmniRoute હોસ્ટ પર `cursor-agent` ઇન્સ્ટૉલ કરવાની જરૂર નથી. - `POST /api/providers/{id}/refresh-cursor` ફક્ત `cursor` IDE પ્રોવાઇડર માટે - છે; `cursor-api` કનેક્શન્સ પાસે રિન્યૂ કરવા માટે કોઈ IDE સત્ર હોતું નથી. + છે; `cursor-api` કનેક્શન્સ પાસે રિન્યૂ કરવા માટે કોઈ IDE સેશન નથી. + +## મૂળ મોડલ IDs અને પ્રયત્ન + +`cursor` / `cu` અને `cursor-api` / `cua` માટે, શેર કરેલું Claude-પ્રયત્ન નૉર્મલાઇઝર +વિનંતી કરેલ મોડલ IDને યથાવત્ રાખે છે. Cursor કોઈ OmniRoute પ્રયત્ન ઉપનામ તરીકે +નહીં, પરંતુ વાસ્તવિક મોડલ IDના ભાગરૂપે `-low` જેવું સફિક્સ જાહેર કરી શકે છે. +Cursor એક્ઝિક્યુટર લાઇવ કૅટલૉગમાં મળતી ચોક્કસ મેળવણી જાળવી રાખે છે; જ્યારે કોઈ +મેળવણી ન હોય, ત્યારે તેનું હાલનું મોડલ રિઝૉલ્વર સફિક્સ-થી-પૅરામીટર ફૉલબૅક સંભાળે છે. + +આનાથી સીધા Claude, Claude-સુસંગત અથવા Vertex રૂટ્સ માટે પ્રયત્ન નૉર્મલાઇઝેશનમાં +કોઈ ફેરફાર થતો નથી. ઉપલબ્ધતા હજુ પણ પસંદ કરેલા Cursor એકાઉન્ટના કૅટલૉગ અને +અધિકાર પર આધારિત છે. ## Cursor CLI પાસથ્રૂ રૂટ: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`. `/api/cursor-cli/` પ્રીફિક્સ -`src/shared/constants/publicApiRoutes.ts`માં રજિસ્ટર થયેલો છે, કારણ કે હૅન્ડલર +`open-sse/handlers/cursorCliProxy.ts`. ઉપસર્ગ `/api/cursor-cli/` ને +`src/shared/constants/publicApiRoutes.ts` માં નોંધવામાં આવ્યો છે કારણ કે હેન્ડલર પોતાનું પ્રમાણીકરણ લાગુ કરે છે: -| પાથ | CLI પાસેથી અપેક્ષિત પ્રમાણીકરણ | OmniRoute શું કરે છે | -| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `POST /auth/exchange_user_api_key` | `Bearer ` | કીને માન્ય કરે છે, 1 કલાકનું HS256 JWT (`JWT_SECRET` વડે સાઇન કરેલું) બનાવે છે અને તેને પરત કરે છે | -| દરેક અન્ય પાથ (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | ઇશ્યૂઅર/ઑડિયન્સ/સમાપ્તિ ચકાસે છે, સક્રિય `cursor-api` કનેક્શન પસંદ કરે છે, Authorization હેડરને એક્સચેન્જ કરેલા Cursor ટોકનથી બદલે છે અને જવાબ પાછો સ્ટ્રીમ કરે છે | +| પાથ | CLI પાસેથી અપેક્ષિત પ્રમાણીકરણ | OmniRoute શું કરે છે | +| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | કીને માન્ય કરે છે, 1 કલાક માટે HS256 JWT (`JWT_SECRET` વડે સહી કરેલું) બનાવે છે અને તેને પરત કરે છે | +| દરેક અન્ય પાથ (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | ઇશ્યુઅર/ઑડિયન્સ/સમાપ્તિની ચકાસણી કરે છે, સક્રિય `cursor-api` કનેક્શન પસંદ કરે છે, Authorization હેડરને એક્સચેન્જ કરેલા Cursor ટોકનથી બદલે છે અને પ્રતિસાદને પાછો સ્ટ્રીમ કરે છે | CLI તેને મળતા કોઈપણ ટોકનમાંથી `exp` ડિકોડ કરે છે, તેથી તેને અપારદર્શક -ટોકન આપવાથી તે લગભગ દરેક વિનંતી પહેલાં ફરી એક્સચેન્જ કરે છે; બનાવેલું JWT -આવું થતું અટકાવે છે. OmniRoute તરફથી મળતો 401 CLIને ફરી એક્સચેન્જ કરવા પ્રેરે છે. +ટોકન આપવાથી તે લગભગ દરેક વિનંતી પહેલાં ફરીથી એક્સચેન્જ કરે છે; બનાવેલું JWT +આવું થતું અટકાવે છે. OmniRoute તરફથી મળતો 401 CLI ને ફરીથી એક્સચેન્જ કરવા પ્રેરે છે. ### સેટઅપ 1. OmniRoute API કી (Dashboard → API keys) અને `cursor-api` કનેક્શન બનાવો. -2. CLIને agent સ્ટ્રીમ માટે HTTP/1.1 વાપરવા કહો. - `~/.cursor/cli-config.json`માં: +2. CLI ને એજન્ટ સ્ટ્રીમ માટે HTTP/1.1 વાપરવાનું કહો. + `~/.cursor/cli-config.json` માં: ```json { "network": { "useHttp1ForAgent": true } } ``` - આ વિના CLI અલગથી કન્ફિગર કરેલા agent હોસ્ટ પર HTTP/2 દ્વારા agent ટર્ન - ખોલે છે અને ફક્ત કન્ટ્રોલ-પ્લેન RPCs જ એન્ડપોઇન્ટમાંથી પસાર થાય છે. + આ વિના CLI અલગથી ગોઠવાયેલા એજન્ટ હોસ્ટ માટે HTTP/2 પર એજન્ટ ટર્ન ખોલે છે + અને માત્ર કંટ્રોલ-પ્લેન RPC જ એન્ડપોઇન્ટમાંથી પસાર થાય છે. 3. OmniRoute સામે CLI ચલાવો: @@ -102,19 +114,19 @@ CLI તેને મળતા કોઈપણ ટોકનમાંથી `exp` agent -p --trust "Reply with exactly OK" ``` -દરેક હૉપ Logsમાં પ્રોવાઇડર `cursor-api`, વિનંતી પ્રકાર `cursor-cli` અને -પાથ `/api/cursor-cli/` તરીકે નોંધાય છે તથા તેને OmniRoute API કી અને -તેને સેવા આપનાર કનેક્શન સાથે સાંકળવામાં આવે છે. - -### નિષ્ફળતાની પરિસ્થિતિઓ - -| પરિસ્થિતિ | CLI માટેનો પ્રતિભાવ | -| ---------------------------------------------- | --------------------------------------------------------- | -| અજ્ઞાત OmniRoute કી અને `REQUIRE_API_KEY=true` | એક્સચેન્જ પર 401 `unauthenticated` | -| `REQUIRE_API_KEY=false` | અનામી સત્ર (`/v1/*` ની વર્તણૂકને પ્રતિબિંબિત કરે છે) | -| સમયસમાપ્ત / વિદેશી / ચેડાં કરાયેલ સત્ર JWT | 401, CLI ફરીથી એક્સચેન્જ કરે છે | -| એક્સચેન્જ પછી OmniRoute API કી રદ કરવામાં આવી | આગામી RPC પર 401 | -| કોઈ સક્રિય `cursor-api` કનેક્શન નથી | 503 `unavailable` | -| Cursor કનેક્શનની કી નકારે છે | 401 `unauthenticated`, કૅશ કરાયેલ સત્ર દૂર કરવામાં આવે છે | -| અપસ્ટ્રીમ સુધી પહોંચી શકાતું નથી | 502 `unavailable` (શુદ્ધ કરાયેલ સંદેશ) | -| `JWT_SECRET` સેટ નથી | એક્સચેન્જ પર 503 | +દરેક હોપ Logs માં પ્રદાતા `cursor-api`, વિનંતી પ્રકાર `cursor-cli`, +પાથ `/api/cursor-cli/` તરીકે નોંધાય છે અને તે OmniRoute API કી તથા તેને +સેવા આપનાર કનેક્શન સાથે સંકળાયેલો હોય છે. + +### નિષ્ફળતાની સ્થિતિઓ + +| પરિસ્થિતિ | CLI ને મળતો પ્રતિસાદ | +| ----------------------------------------------- | -------------------------------------------------- | +| અજ્ઞાત OmniRoute કી અને `REQUIRE_API_KEY=true` | એક્સચેન્જ વખતે 401 `unauthenticated` | +| `REQUIRE_API_KEY=false` | અનામી સત્ર (`/v1/*` ના વર્તનને પ્રતિબિંબિત કરે છે) | +| સમાપ્ત થયેલું / વિદેશી / છેડછાડ કરેલું સત્ર JWT | 401, CLI ફરીથી એક્સચેન્જ કરે છે | +| એક્સચેન્જ પછી OmniRoute API કી રદ કરવામાં આવી | આગામી RPC પર 401 | +| કોઈ સક્રિય `cursor-api` કનેક્શન નથી | 503 `unavailable` | +| Cursor કનેક્શનની કીને નકારે છે | 401 `unauthenticated`, કૅશ કરેલું સત્ર દૂર થાય છે | +| અપસ્ટ્રીમ સુધી પહોંચી શકાતું નથી | 502 `unavailable` (શુદ્ધ કરેલો સંદેશ) | +| `JWT_SECRET` સેટ નથી | એક્સચેન્જ વખતે 503 | diff --git a/docs/i18n/gu/docs/reference/API_REFERENCE.md b/docs/i18n/gu/docs/reference/API_REFERENCE.md index e6b4b9f7d5ef..d5b2ac0ba49f 100644 --- a/docs/i18n/gu/docs/reference/API_REFERENCE.md +++ b/docs/i18n/gu/docs/reference/API_REFERENCE.md @@ -448,14 +448,14 @@ Bifrost, CLIProxyAPI અને ભવિષ્યના સાઇડકાર | POST | `/v1/responses` | OpenAI Responses | | POST | `/v1/embeddings` | OpenAI | | POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (સંપાદન/ઇનપેઇન્ટ) | +| POST | `/v1/images/edits` | OpenAI Images (સંપાદન/inpaint) | | POST | `/v1/videos/generations` | OpenAI-શૈલીનું વિડિયો જનરેશન | | POST | `/v1/music/generations` | OpenAI-શૈલીનું સંગીત જનરેશન | | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (ઑડિયો બોડી પરત કરે છે) | -| POST | `/v1/rerank` | Cohere/Voyage-શૈલીનું રીરૅન્ક | -| POST | `/v1/classify` | Jina વર્ગીકરણ (`api.jina.ai`) | -| POST | `/v1/segment` | Jina સેગમેન્ટર (`segment.jina.ai`) | +| POST | `/v1/audio/speech` | OpenAI TTS (ઑડિયો બૉડી પરત કરે છે) | +| POST | `/v1/rerank` | Cohere/Voyage-શૈલીનું rerank | +| POST | `/v1/classify` | Jina classify (`api.jina.ai`) | +| POST | `/v1/segment` | Jina segmenter (`segment.jina.ai`) | | POST | `/v1/moderations` | OpenAI Moderations | | GET | `/v1/models` | OpenAI | | POST | `/v1/messages/count_tokens` | Anthropic | @@ -463,44 +463,66 @@ Bifrost, CLIProxyAPI અને ભવિષ્યના સાઇડકાર | POST | `/v1beta/models/{...path}` | Gemini generateContent | | POST | `/v1/api/chat` | Ollama | | GET | `/api/v1/vscode/{token}/` | OpenAI કૅટલૉગ ઉપનામ | -| GET | `/api/v1/vscode/{token}/models` | OpenAI મોડલ્સનું ઉપનામ | -| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI ટોકનાઇઝ્ડ ઉપનામ | -| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses ટોકનાઇઝ્ડ ઉપનામ | -| POST | `/api/v1/vscode/{token}/api/chat` | Ollama ટોકનાઇઝ્ડ ઉપનામ | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama ટૅગ્સનું ટોકનાઇઝ્ડ ઉપનામ | +| GET | `/api/v1/vscode/{token}/models` | OpenAI મૉડલ્સ ઉપનામ | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI ટોકનયુક્ત ઉપનામ | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses ટોકનયુક્ત ઉપનામ | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama ટોકનયુક્ત ઉપનામ | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama tags ટોકનયુક્ત ઉપનામ | -બધા POST રૂટ્સ સમાન માળખાને અનુસરે છે: `Bearer your-api-key` + Zod દ્વારા માન્ય કરાયેલ JSON બોડી (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` વગેરે, `src/shared/validation/schemas.ts` જુઓ). સ્કીમા નિષ્ફળ જાય ત્યારે 4xx પરત કરવામાં આવે છે. +બધા POST રૂટ્સ સમાન માળખું અનુસરે છે: `Bearer your-api-key` + Zod દ્વારા માન્ય કરાયેલ JSON બૉડી (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, વગેરે, `src/shared/validation/schemas.ts` જુઓ). સ્કીમા નિષ્ફળ જાય ત્યારે 4xx પરત કરવામાં આવે છે. -જે ક્લાયન્ટ્સ `Authorization: Bearer ...` જોડી શકતા નથી તેમના માટે OmniRoute, ક્વેરી-સ્ટ્રિંગ સુસંગતતા (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) અથવા નીચે દસ્તાવેજીકૃત સમર્પિત `/api/v1/vscode/{token}/...` એન્ડપોઇન્ટ્સ દ્વારા URLમાં API કીઝ પણ સ્વીકારે છે. +જે ક્લાયન્ટ્સ `Authorization: Bearer ...` જોડી શકતા નથી, તેમના માટે OmniRoute URLમાં API કીઝ પણ સ્વીકારે છે—કાં તો ક્વેરી-સ્ટ્રિંગ સુસંગતતા (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) દ્વારા અથવા નીચે દસ્તાવેજીકૃત સમર્પિત `/api/v1/vscode/{token}/...` એન્ડપોઇન્ટ્સ દ્વારા. ```bash -# રીરૅન્ક +# Rerank (ક્લાઉડ રજિસ્ટ્રી પ્રદાતા અથવા "/" તરીકે OpenAI-સુસંગત પ્રદાતા નોડ) POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina વર્ગીકરણ (Foundation API ઓળખપત્રો) +# Jina classify (Foundation API ઓળખપત્રો) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Jina સેગમેન્ટર +# Jina segmenter POST /v1/segment { "content": "...", "return_chunks": true } -# Jina શોધ (s.jina.ai; પ્રોવાઇડર ઉપનામો: jina-search, jina-ai, jina) +# Jina search (s.jina.ai; પ્રદાતા ઉપનામો: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# મોડરેશન્સ +# Moderations POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — audio/mpeg (અથવા વિનંતી કરાયેલ ફોર્મેટ) બોડી પરત કરે છે +# TTS — audio/mpeg (અથવા વિનંતી કરાયેલ ફોર્મેટ) બૉડી પરત કરે છે POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } -# છબી સંપાદન (multipart) +# ઇમેજ સંપાદન (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# વિડિયો / સંગીત જનરેશન (પ્રોવાઇડર-પ્રિફિક્સવાળી મોડલ id) +# વિડિયો / સંગીત જનરેશન (પ્રદાતા-પૂર્વપ્રત્યયયુક્ત મૉડલ ID) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### સમર્પિત પ્રોવાઇડર રૂટ્સ +> **Rerank પ્રદાતા નોડ્સ:** `POST /v1/rerank` OpenAI-સુસંગત પ્રદાતા નોડ્સ તરફ પણ રૂટ કરે છે +> (ગેટવેની પાછળના oMLX, vLLM, Infinity, TEI, …), જેમને `/` તરીકે સંબોધવામાં આવે છે. લૂપબૅક +> નોડ્સ (`localhost`, `127.0.0.1`, `172.16.0.0/12`) હંમેશાં પાત્ર હોય છે. અન્ય કોઈપણ +> હોસ્ટ પરના નોડ્સ — LAN બૉક્સ અથવા Tailscale પિયર — માત્ર ત્યારે જ પાત્ર હોય છે જ્યારે ઑપરેટર +> `RERANK_REMOTE_PROVIDER_NODES` ફીચર ફ્લૅગ સક્ષમ કરે **અને** નોડનો બેઝ URL પ્રદાતાની +> આઉટબાઉન્ડ URL નીતિ (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) પસાર કરે; +> ક્લાઉડ-મેટાડેટા હોસ્ટ્સ તરફ ક્યારેય રૂટ કરવામાં આવતું નથી. મેમરી એન્જિનનું rerank પગલું આ રૂટને +> લૂપબૅક દ્વારા કૉલ કરે છે, તેથી આ જ નિયમ Memory સેટિંગ્સમાં `rerankProviderModel`ને સંચાલિત કરે છે. +> +> **સ્થાનિક સર્વરનાં માળખાં:** નોડને `/v1/rerank` પર અને 404 મળે ત્યારે `/rerank` +> (Infinity, TEI) પર કૉલ કરવામાં આવે છે. અપસ્ટ્રીમ બૉડી Cohere/OpenAI જોડણી (`documents`, +> `return_documents`) અને TEI જોડણી (`texts`, `return_text`) બંને ધરાવે છે, અને અપસ્ટ્રીમ પ્રતિસાદને +> Cohere એન્વલપમાં સામાન્યકૃત કરવામાં આવે છે: TEIનું મૂળ `[{index, score, text}]`, પાતળા ગેટવેમાંથી +> `{results: [{index, score}]}`, અને Voyage-શૈલીનું `{data: [...]}`—આ બધું ક્લાયન્ટને +> `{results: [{index, relevance_score, document?}]}` તરીકે પરત મળે છે, સ્કોર મુજબ ગોઠવાયેલું અને `top_n` સુધી મર્યાદિત. + +> **પ્રદાતા-નોડ શોધ:** OpenAI-સુસંગત પ્રદાતા નોડ પરના મૉડલ્સ `GET /v1/models`માં +> નોડ પૂર્વપ્રત્યય હેઠળ દેખાય છે. જે પંક્તિઓમાં કોઈ એન્ડપોઇન્ટ મેટાડેટા ન હોય (સ્થાનિક `/v1/models` સૂચિઓ માટે સામાન્ય) +> તે નોડનું `apiType` વારસામાં મેળવે છે, તેથી `embeddings` નોડનાં મૉડલ્સ ડિફૉલ્ટ રૂપે chat બનવાને બદલે +> `type: "embedding"` અને `rerank` નોડનાં મૉડલ્સ `type: "rerank"` હોય છે; સિંક કરેલી અથવા મેન્યુઅલી +> ઉમેરેલી પંક્તિ પર સ્પષ્ટ `supportedEndpoints` હજુ પણ પ્રાધાન્ય મેળવે છે. + +### સમર્પિત પ્રદાતા રૂટ્સ ```bash POST /v1/providers/{provider}/chat/completions @@ -508,7 +530,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -જો પ્રોવાઇડર પ્રિફિક્સ ન હોય તો તે આપમેળે ઉમેરવામાં આવે છે. મેળ ન ખાતાં મોડલ્સ `400` પરત કરે છે. +જો પ્રદાતા ઉપસર્ગ ન હોય, તો તે આપમેળે ઉમેરવામાં આવે છે. મેળ ન ખાતાં મોડલ્સ માટે `400` પરત મળે છે. --- diff --git a/docs/i18n/gu/docs/reference/ENVIRONMENT.md b/docs/i18n/gu/docs/reference/ENVIRONMENT.md index e498ba9d212c..633024ca8f58 100644 --- a/docs/i18n/gu/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/gu/docs/reference/ENVIRONMENT.md @@ -79,72 +79,71 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. સ્ટોરેજ અને ડેટાબેઝ -OmniRoute તમામ સ્થાયી સંગ્રહ માટે **SQLite** (`better-sqlite3` દ્વારા) નો ઉપયોગ કરે છે. આ વેરિએબલ્સ ડેટાનું સ્થાન, એન્ક્રિપ્શન અને જીવનચક્ર નિયંત્રિત કરે છે. - -| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite DB, બૅકઅપ્સ અને ડેટા ફાઇલો માટેની રૂટ ડિરેક્ટરી. Docker વૉલ્યુમ્સ અથવા કસ્ટમ પાથ્સ માટે તેને ઓવરરાઇડ કરો. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(સેટ નથી)_ | `src/lib/dataPaths.ts` | ટેસ્ટ/eval DATA_DIR ગાર્ડ માટેનો બચાવ-માર્ગ (#10428). `DATA_DIR` વિનાના ટેસ્ટ્સ અને Node eval/print પ્રોબ્સ (`-e`/`--eval`/`-p`/`--print`, જેમાં `--eval=`/`--print=` સ્વરૂપો પણ સામેલ છે) ને કામચલાઉ નિકાલયોગ્ય ડિરેક્ટરી તરફ રીડાયરેક્ટ કરવામાં આવે છે, જેથી તેઓ ઑપરેટરનો વાસ્તવિક ડેટાબેઝ ખોલી ન શકે; વાસ્તવિક ડિરેક્ટરીનો ફરી ઉપયોગ કરવા માટે તેને `1` પર સેટ કરો. | -| `OMNIROUTE_BUILD_SHA` | _(સેટ નથી)_ | `src/lib/monitoring/buildSha.ts` | ચાલી રહેલા આર્ટિફેક્ટનો Git SHA. `npm run build:release` દ્વારા અંકિત થાય છે; `dist/BUILD_SHA` સેન્ટિનલ વિના મોકલાતા કન્ટેનર્સમાં ઇન્જેક્ટ કરી શકાય છે. `/api/monitoring/health` પર `system.buildSha` તરીકે દર્શાવવામાં આવે છે. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | pack-artifact પ્રોવેનન્સ ગેટ જે ref સામે બિલ્ડ SHA ચકાસે છે (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(સેટ નથી)_ | `scripts/build/buildProvenance.ts` | જેનો SHA રિલીઝ લાઇન પર નથી તેવા બિલ્ડને પૅક કરવાની મંજૂરી આપવા માટે તેને `1` પર સેટ કરો; ગેટને નિષ્ફળ કરવાને બદલે તેને ઇરાદાપૂર્વકના કેનેરી તરીકે નોંધવામાં આવશે (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(સેટ નથી)_ | `scripts/ops/deploy-canary.mjs` | કેનેરી-ડિપ્લોય સ્મોક પ્રોબ માટેની API કી, જેને `/v1/chat/completions` પર `Authorization: Bearer` તરીકે મોકલવામાં આવે છે. તેનો ઉપયોગ માત્ર ડિપ્લોય સ્ક્રિપ્ટ દ્વારા થાય છે (#10429), સર્વર દ્વારા ક્યારેય નહીં. આ ઑપ્ટ-ઇન CLI સ્મોક હાર્નેસના `OMNIROUTE_SMOKE_*` વેરિએબલ્સ (`RUN_CLI_SMOKE=1`, `tests/integration/upstream-cli-smoke.int.test.ts` માં `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`) સાથે સંબંધિત નથી — [CLI ઇન્ટિગ્રેશન્સ → વાસ્તવિક સ્મોક સ્વીપ](../guides/CLI-INTEGRATIONS.md) જુઓ. | -| `OMNIROUTE_BUILDING` | _(સેટ નથી)_ | `src/lib/buildPhase.ts` | બિલ્ડ-ફેઝ સિગ્નલ (#10060): `scripts/build/build-next-isolated.mjs` દ્વારા `1` પર સેટ થાય છે અને દરેક શરૂ કરાયેલા બિલ્ડ વર્કરને વારસામાં મળે છે, જેથી DB લેયર નેટિવ better-sqlite3 ઍડઑન લોડ કરવાને બદલે no-op સ્ટબ પરત કરે છે (આ ઍડઑન બહાર નીકળતી વખતે વર્કરને અબોર્ટ કરે છે). ચાલી રહેલા સર્વર માટે ક્યારેય સેટ થતું નથી. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | અસામાન્ય vendored trees માટે વૈકલ્પિક નેટિવ-ડિપેન્ડન્સી પ્રીબિલ્ડ ચેક છોડવા તેને `1` પર સેટ કરો. આનાથી ગુમ થયેલી ડિપેન્ડન્સી બિલ્ડ કરી શકાય તેવી બનતી નથી; નેટિવ ડિપેન્ડન્સીઝ અન્ય માધ્યમથી પૂરી પાડવામાં આવતી હોય ત્યારે જ તેનો ઉપયોગ કરો. | -| `OMNIROUTE_DATA_DIR` | _(સેટ નથી)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR` માટેનું **ફૉલબૅક ઉપનામ**, જે માત્ર `DATA_DIR` સેટ ન હોય ત્યારે તપાસવામાં આવે છે. PromptQL એક્ઝિક્યુટરના ઑન-ડિસ્ક થ્રેડ-સ્ટિકી સેશન કૅશ (`/promptql-thread-sessions.json`) ને શોધવા માટે તેનો ઉપયોગ થાય છે; જો બંનેમાંથી કોઈ વેરિએબલ સેટ ન હોય, તો કૅશ માત્ર મેમરીમાં રહે છે (પુનઃપ્રારંભો વચ્ચે કાયમી રહેતી નથી). | -| `OMNIROUTE_PLUGINS_DIR` | _(સેટ નથી)_ | `src/lib/plugins/scanner.ts` | **રનટાઇમ પ્લગઇન સ્કેનર** જે ડિરેક્ટરી વાંચે છે — અને પ્લગઇન મૅનેજર જેમાં ઇન્સ્ટૉલ કરે છે તે રૂટ — તે હોમ પરથી મેળવેલા ડિફૉલ્ટને ઓવરરાઇડ કરે છે (#11827). માત્ર સ્કૅન પાથને અન્યત્ર ખસેડવા માટે HOME બદલવાને બદલે તેને Docker/K8s માં bind-mounted પ્લગઇન ટ્રી તરફ નિર્દેશિત કરો (HOME અન્ય તમામ હોમ-સંબંધિત વર્તનને પણ નિયંત્રિત કરે છે). સેટ ન હોય ત્યારે = `~/.omniroute/plugins`, અથવા જ્યારે પ્રોસેસ કોઈ હોમ એક્સપોર્ટ કરતી ન હોય ત્યારે `/tmp/.omniroute/plugins` — આ વેરિએબલ જે નિઃશબ્દ પ્લગઇન ન મળવાની સમસ્યાને દૂર કરે છે. રિઝૉલ્વ કરેલી ડિરેક્ટરી સ્ટાર્ટઅપ વખતે એક વાર, પ્રાધાન્ય પામેલા ઇનપુટ સાથે `scanner.dir_resolved` તરીકે લૉગ થાય છે. માત્ર સર્વર-સાઇડ માટે: CLI કમાન્ડ પ્લગઇન્સ પોતાનો અલગ `OMNIROUTE_PLUGIN_PATH` જાળવે છે (વિભાગ 9). | -| `STORAGE_ENCRYPTION_KEY` | _(ખાલી = અક્ષમ)_ | `src/lib/db/encryption.ts` | સંગ્રહિત સંપૂર્ણ SQLite ડેટાબેઝના એન્ક્રિપ્શન માટેની AES કી. `openssl rand -hex 32` વડે જનરેટ કરો. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | એન્ક્રિપ્શન કી માટેનું વર્ઝન લેબલ. જૂના બૅકઅપનું ડિક્રિપ્શન સમર્થિત રાખવા માટે કી રોટેશન કરતી વખતે તેને વધારો. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` હોય ત્યારે નિયમિત/લખાણ-પૂર્વેના SQLite ફાઇલ બૅકઅપ (models.dev કિંમત સાચવવી/સાફ કરવી, સેટિંગ્સમાં લખાણ) છોડવામાં આવે છે. મેન્યુઅલ અને પુનઃસ્થાપન-પૂર્વેના બૅકઅપ હજુ પણ ચાલે છે. તે માઇગ્રેશન રનરના ફરજિયાત ટકાઉ સલામતી સ્નૅપશૉટ અથવા હાલના સ્થાયી DB માટેના સામૂહિક-માઇગ્રેશન ગાર્ડને અક્ષમ કરતું **નથી**. બિન-મેન્યુઅલ બૅકઅપ વધુમાં વધુ દર 60 મિનિટે એક વખત સુધી મર્યાદિત હોય છે. ડૅશબોર્ડનાં **સેટિંગ્સ → સ્ટોરેજ** દ્વારા નિયમિત સ્વચાલિત બૅકઅપને સ્વતંત્ર રીતે અક્ષમ કરી શકાય છે. | -| `OMNIROUTE_CRYPT_KEY` | _(સેટ કરેલું નથી)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` માટેનું **લેગસી ઉપનામ**. પ્રાથમિક વેરિએબલ ગેરહાજર હોય ત્યારે ફૉલબૅક તરીકે સ્વીકારવામાં આવે છે. | -| `OMNIROUTE_API_KEY_BASE64` | _(સેટ કરેલું નથી)_ | `src/lib/db/encryption.ts` | ફૉલબૅક તરીકે સ્વીકારાતું **લેગસી ઉપનામ** (Base64-એન્કોડેડ સ્વરૂપ). ઉપયોગ પહેલાં આપમેળે ડિકોડ થાય છે. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(સેટ કરેલું નથી)_ | `src/lib/db/core.ts` | સામયિક SQLite સ્વાસ્થ્ય-તપાસ અંતરાલ (ms)ને ઓવરરાઇડ કરો. સેટ ન કરેલું હોય ત્યારે ડિફૉલ્ટ મૂલ્યો `NODE_ENV` પરથી મેળવવામાં આવે છે. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 કલાક) | `src/lib/db/walMaintenance.ts` | સામયિક `wal_checkpoint(TRUNCATE)` અંતરાલ (ms)ને ઓવરરાઇડ કરો. સ્વચાલિત ચેકપૉઇન્ટ ક્યારેય WAL ફાઇલને પોતે નાની કરતું નથી અને લાંબા સમયથી ચાલતું સર્વર ક્યારેય પોતાનો DB બંધ કરતું નથી. `0` અક્ષમ કરે છે. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 મિનિટ) | `src/lib/db/walMaintenance.ts` | વારંવારના `wal_checkpoint(PASSIVE)` અંતરાલ (ms)ને ઓવરરાઇડ કરો. બાકી રહેલી WAL ફ્રેમ્સને નાની રાખે છે, જેથી સામયિક TRUNCATE મુખ્ય થ્રેડ પર બહુ-GB બૅકલૉગની કૉપિ ક્યારેય ન કરે. `0` અક્ષમ કરે છે. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | PASSIVE ટિકને WAL ફાઇલ આ કદ કરતાં મોટી મળે ત્યારે ધીમી ટિકની રાહ જોવાને બદલે તરત જ `wal_checkpoint(TRUNCATE)` પર એસ્કેલેટ કરો. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | ગંભીર સંસાધન દબાણ `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` સુધી જળવાઈ રહે પછી પ્રક્રિયામાંથી બહાર નીકળવા માટે તેને `1`/`true`/`yes`/`on` પર સેટ કરો, જેથી અનિશ્ચિત સમય સુધી 503 પ્રતિસાદો આપવાને બદલે સુપરવાઇઝર (systemd `Restart=always`, Docker પુનઃપ્રારંભ નીતિ) સ્વચ્છ પ્રક્રિયાને ફરીથી શરૂ કરી શકે. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 મિનિટ) | `open-sse/utils/resourcePressure.ts` | સ્વ-પુનઃપ્રારંભ માટેની એક્ઝિટ સક્રિય થાય તે પહેલાં ગંભીર દબાણ કેટલા સમય સુધી જળવાઈ રહેવું જોઈએ. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(સ્વતઃ-શોધ)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ફૉલબૅક ઍડૅપ્ટરનો ઉપયોગ કરતી વખતે `sql-wasm.wasm` માટેનો સ્પષ્ટ પાથ (નિરપેક્ષ અથવા cwdને સાપેક્ષ). સેટ ન કરેલું હોય ત્યારે પૅકેજ ડિપેન્ડન્સીઓ અને સંભવિત લેઆઉટ દ્વારા આપમેળે શોધવામાં આવે છે. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6 કલાક) | `src/lib/db/core.ts` | સામયિક `wal_checkpoint(TRUNCATE)` અંતરાલ (ms)ને ઓવરરાઇડ કરો. સ્વચાલિત ચેકપૉઇન્ટ ક્યારેય WAL ફાઇલને પોતે નાની કરતું નથી અને લાંબા સમયથી ચાલતું સર્વર ક્યારેય પોતાનો DB બંધ કરતું નથી. `0` અક્ષમ કરે છે. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | ટર્મિનલ (પૂર્ણ/નિષ્ફળ/રદ થયેલી/સમયસમાપ્ત) Batch API જૉબના ચેકપૉઇન્ટ્સ, સંદર્ભિત ઇનપુટ/આઉટપુટ/ભૂલ ફાઇલો અને પંક્તિને કાઢી નાખતા પહેલાં સ્વચાલિત સફાઈ સ્વીપ દ્વારા કેટલા દિવસ સુધી રાખવામાં આવે છે. `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ચાલુ કર્યા પછી જ તેની અસર થાય છે; તે OpenAIની પોતાની Batch API આઉટપુટ જાળવણી અવધિ સાથે મેળ ખાય છે. ઑપરેટર દ્વારા સક્રિય કરાતા `DELETE /api/v1/batches/delete-completed` રૂટને તેની અસર થતી નથી, જે ડિઝાઇન મુજબ બિનશરતી (કોઈ વય ફિલ્ટર વિના) રહે છે. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | જ્યારે `true` હોય, ત્યારે સ્વચાલિત ક્લીનઅપ સ્વીપને `OMNIROUTE_BATCH_RETENTION_DAYS` કરતાં જૂની અંતિમ સ્થિતિમાં રહેલી Batch API જોબ્સ (અને તેમના checkpoints) કાઢી નાખવા તથા અપલોડ કરેલી ફાઇલોની પોતાની `expires_at` સમયમર્યાદા વીતી ગયા પછી તેમની BLOB સામગ્રી સાફ કરવાની મંજૂરી આપે છે. ડિફૉલ્ટ રૂપે બંધ: ઑપરેટર તેને સક્રિય ન કરે ત્યાં સુધી દરેક વર્તમાન ઇન્સ્ટૉલ આ ડેટાને પહેલાંની જેમ જ જાળવી રાખે છે. આ dashboard પરથી સંપાદિત કરી શકાય તેવો feature flag પણ છે — `docs/reference/FEATURE_FLAGS.md` → Runtime જુઓ. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | સ્ટાર્ટઅપ વખતે DB healthcheck સંપૂર્ણપણે છોડવા માટે તેને `1` પર સેટ કરો. ટૂંકા સમય માટે ચાલતા કાર્યો અને integration tests માટે ઉપયોગી છે. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | DB healthcheck loop સામાન્ય રીતે છોડવામાં આવે તેવી સ્થિતિમાં પણ (દા.ત., ટૂંકા સમય માટે ચાલતા કાર્યો) તેને ફરજિયાત ચાલુ રાખવા માટે `1` પર સેટ કરો. | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` દરમિયાન native-runtime warm-up છોડવા માટે તેને `1` પર સેટ કરો. જ્યાં sqlite પહેલેથી build થયેલું હોય તેવા CI/headless ઇન્સ્ટૉલ્સમાં ઉપયોગી છે. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(સ્વતઃ-શોધ)_ | `src/lib/db/migrationRunner.ts` | migration runner જે ડિરેક્ટરીને સ્કૅન કરે છે તેને override કરો. કસ્ટમ buildsમાં bundled migrations મોકલતી વખતે ઉપયોગી છે. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(સેટ કરેલ નથી)_ | `src/lib/db/migrationRunner/extraDirs.ts` | પ્લેટફોર્મ path delimiter વડે અલગ કરેલી `namespace=dir` entries તરીકે વધારાની migration directories (દા.ત. `ee=/opt/app/enterprise/db/migrations`). ત્યાં મળેલી ફાઇલો `-` તરીકે નોંધાય છે, જેથી પોતાના migrations મોકલતું distribution upstream numeric slots સાથે ક્યારેય અથડાતું નથી. ખોટી રીતે રચાયેલી entry, અમાન્ય namespace અથવા ગેરહાજર directoryના કિસ્સામાં schemaને ચૂપચાપ છોડવાને બદલે સ્ટાર્ટઅપ વખતે error થાય છે. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | મોટી સંખ્યામાં pending migrations માટેની સુરક્ષા મર્યાદા (#3416). હાલના DB પર આ સંખ્યા કરતાં વધુ migrations pending હોય તો સ્ટાર્ટઅપ અટકી જાય છે (ભૂંસાઈ ગયેલી tracking table સામે રક્ષણ આપે છે). જૂનો backup restore કરવા માટે તેને વધારો; ચકાસણી અક્ષમ કરવા માટે `0` પર સેટ કરો. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` release gate માટેની working directory. તેને આશરે 12 GB જગ્યાની જરૂર પડે છે (બે ~3 GB install trees ઉપરાંત tarball), તેથી તેને નાના tmpfs પર ચલાવવું જોઈએ નહીં — self-hosted runner પર `/tmp` એ 12 GB RAM-backed tmpfs છે અને gateએ તેની જગ્યા ખતમ કરી દીધી હતી, જેના કારણે package અધૂરું કપાઈ ગયું હતું. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(કોડમાં ડિફૉલ્ટ)_ | `src/lib/spend/batchWriter.ts` | batched spend/cost writer માટે flush interval (ms). ઓછાં મૂલ્યો write coalescing ઘટાડે છે; ઊંચાં મૂલ્યો DB contention ઘટાડે છે. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(કોડમાં ડિફૉલ્ટ)_ | `src/lib/spend/batchWriter.ts` | ફરજિયાત flush પહેલાં buffered spend entriesની મહત્તમ સંખ્યા. high-QPS deployments પર તેને વધારો; મર્યાદિત memory વધુ મહત્ત્વની હોય ત્યારે તેને ઘટાડો. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(સેટ કરેલ નથી)_ | `open-sse/utils/proxyFetch.ts` | Vercel relay path પર `[ProxyFetch]` debug logs ઉત્સર્જિત કરવા માટે તેને `"true"` પર સેટ કરો. routing hints જાહેર થઈ જવાનું ટાળવા માટે ડિફૉલ્ટ રૂપે બંધ છે. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | વિગતવાર `[ProxyEgress]` process-log lineમાં client/egress IPs અને account prefix સામેલ કરવા માટે તેને `"true"` અથવા `"1"` પર સેટ કરો. process log IPs અથવા account prefix જાહેર ન કરે તે માટે ડિફૉલ્ટ રૂપે બંધ રાખવામાં આવ્યું છે. | -| `OMNIROUTE_DEBUG` | _(સેટ કરેલ નથી)_ | `bin/cli/commands/quota.mjs` | CLI quota commandsમાંથી stderr પર દરેક request માટે timing diagnostics (`[omniroute] GET completed in Nms`) પ્રિન્ટ કરવા માટે `1` પર સેટ કરો. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(સ્વતઃ)_ | `scripts/dev/healthcheck.mjs` | container health check દ્વારા તપાસવામાં આવતો સ્પષ્ટ path. સેટ ન હોય ત્યારે probe તેને `OMNIROUTE_BASE_PATH` પરથી નક્કી કરે છે; તેને સેટ કરવાથી deep monitoring endpoint ફરી સક્રિય થાય છે. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(સેટ કરેલ નથી)_ | `bin/cli/commands/completion.mjs` | CLI shell-completion cache paths (read/refresh/write)માંથી `[omniroute completion]` diagnostics ઉત્સર્જિત કરવા માટે કોઈપણ ખાલી ન હોય તેવા મૂલ્ય પર સેટ કરો. ડિફૉલ્ટ રૂપે બંધ — એ caches ચૂપચાપ નિષ્ફળ જાય છે, જેથી ગેરહાજર/દૂષિત cache ક્યારેય tab-completionને બગાડતું નથી. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 કલાક) | `open-sse/services/batchProcessor.ts` | વ્યક્તિગત બૅચ આઇટમ માટે મહત્તમ પુનઃપ્રયાસ અવધિ (મિ.સે.). આ અવધિ વટાવતી આઇટમને નિષ્ફળ તરીકે ચિહ્નિત કરવામાં આવે છે. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | બૅચ આઇટમના પુનઃપ્રયાસો માટે એક્સ્પોનેન્શિયલ બૅકઑફનો મૂળ વિલંબ (મિ.સે.). | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 કલાક) | `open-sse/services/batchProcessor.ts` | બૅચ આઇટમના પુનઃપ્રયાસો વચ્ચેના એક્સ્પોનેન્શિયલ બૅકઑફની મહત્તમ મર્યાદા (મિ.સે.). | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | એકસાથે પ્રક્રિયા કરવામાં આવતી બૅચની મહત્તમ સંખ્યા. થ્રુપુટ વધારવા માટે તેને વધારો; રેટ-લિમિટની અતિશય સમસ્યાઓ ટાળવા માટે તેને ઓછી રાખો. | +OmniRoute તમામ ડેટા કાયમી રીતે સંગ્રહવા માટે **SQLite** (`better-sqlite3` મારફતે) નો ઉપયોગ કરે છે. આ વેરિએબલો ડેટાનું સ્થાન, એન્ક્રિપ્શન અને જીવનચક્ર નિયંત્રિત કરે છે. + +| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | +| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite DB, બૅકઅપ અને ડેટા ફાઇલો માટેની રૂટ ડિરેક્ટરી. Docker વૉલ્યુમ અથવા કસ્ટમ પાથ માટે તેને ઓવરરાઇડ કરો. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(સેટ કરેલ નથી)_ | `src/lib/dataPaths.ts` | ટેસ્ટ/eval DATA_DIR ગાર્ડ (#10428) માટેનો બચાવ માર્ગ. `DATA_DIR` વિનાના ટેસ્ટ અને Node eval/print પ્રોબ (`-e`/`--eval`/`-p`/`--print`, જેમાં `--eval=`/`--print=` સ્વરૂપો પણ સામેલ છે) ને કામચલાઉ ફેંકી દેવાની ડિરેક્ટરીમાં રીડાયરેક્ટ કરવામાં આવે છે, જેથી તેઓ ઑપરેટરનો વાસ્તવિક ડેટાબેઝ ખોલી ન શકે; વાસ્તવિક ડિરેક્ટરીનો ફરી ઉપયોગ કરવા માટે તેને `1` પર સેટ કરો. | +| `OMNIROUTE_BUILD_SHA` | _(સેટ કરેલ નથી)_ | `src/lib/monitoring/buildSha.ts` | ચાલી રહેલા આર્ટિફેક્ટનું Git SHA. `npm run build:release` દ્વારા અંકિત કરવામાં આવે છે; `dist/BUILD_SHA` સેન્ટિનલ વિના મોકલાતા કન્ટેનરોમાં ઇન્જેક્ટ કરી શકાય છે. `/api/monitoring/health` પર `system.buildSha` તરીકે દર્શાવવામાં આવે છે. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | પૅક-આર્ટિફેક્ટ પ્રોવેનન્સ ગેટ જે ref સામે બિલ્ડ SHA તપાસે છે (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(સેટ કરેલ નથી)_ | `scripts/build/buildProvenance.ts` | જે બિલ્ડનું SHA રિલીઝ લાઇન પર નથી તેને પૅક કરવાની મંજૂરી આપવા માટે `1` પર સેટ કરો, જેથી ગેટ નિષ્ફળ કરવાને બદલે તેને ઇરાદાપૂર્વકના કેનેરી તરીકે નોંધવામાં આવે (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(સેટ કરેલ નથી)_ | `scripts/ops/deploy-canary.mjs` | કેનેરી-ડિપ્લોય સ્મોક પ્રોબ માટેની API કી, જે `/v1/chat/completions` પર `Authorization: Bearer` તરીકે મોકલવામાં આવે છે. તેનો ઉપયોગ માત્ર ડિપ્લોય સ્ક્રિપ્ટ (#10429) દ્વારા થાય છે, સર્વર દ્વારા ક્યારેય નહીં. આ opt-in CLI સ્મોક હાર્નેસના `OMNIROUTE_SMOKE_*` વેરિએબલો (`RUN_CLI_SMOKE=1`, `tests/integration/upstream-cli-smoke.int.test.ts` માં `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`) સાથે સંબંધિત નથી — [CLI ઇન્ટિગ્રેશન્સ → વાસ્તવિક સ્મોક સ્વીપ](../guides/CLI-INTEGRATIONS.md) જુઓ. | +| `OMNIROUTE_BUILDING` | _(સેટ કરેલ નથી)_ | `src/lib/buildPhase.ts` | બિલ્ડ-ફેઝ સિગ્નલ (#10060): `scripts/build/build-next-isolated.mjs` દ્વારા `1` પર સેટ થાય છે અને દરેક શરૂ કરાયેલા બિલ્ડ વર્કરને વારસામાં મળે છે, જેથી DB લેયર મૂળ `better-sqlite3` ઍડઑન લોડ કરવાને બદલે no-op સ્ટબ પરત કરે છે (જે બહાર નીકળતી વખતે વર્કરને બંધ કરી દે છે). ચાલી રહેલા સર્વર માટે ક્યારેય સેટ થતું નથી. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | વિશિષ્ટ વેન્ડર કરેલ ટ્રી માટે વૈકલ્પિક મૂળ ડિપેન્ડન્સી પ્રિબિલ્ડ ચકાસણી છોડવા માટે `1` પર સેટ કરો. આના કારણે ગુમ થયેલી ડિપેન્ડન્સી બિલ્ડ કરી શકાય તેવી બનતી નથી; માત્ર ત્યારે જ ઉપયોગ કરો જ્યારે મૂળ ડિપેન્ડન્સીઓ બૅન્ડની બહારથી પૂરી પાડવામાં આવતી હોય. | +| `OMNIROUTE_DATA_DIR` | _(સેટ કરેલ નથી)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR` માટેનું **ફૉલબૅક ઉપનામ**, જે ફક્ત `DATA_DIR` સેટ ન હોય ત્યારે તપાસવામાં આવે છે. PromptQL એક્ઝિક્યુટરના ઑન-ડિસ્ક થ્રેડ-સ્ટિકી સેશન કૅશ (`/promptql-thread-sessions.json`) ને શોધવા માટે વપરાય છે; જો બંનેમાંથી કોઈ વેરિએબલ સેટ ન હોય, તો કૅશ માત્ર મેમરીમાં રહે છે (પુનઃપ્રારંભ પછી કાયમી રહેતું નથી). | +| `OMNIROUTE_PLUGINS_DIR` | _(સેટ કરેલ નથી)_ | `src/lib/plugins/scanner.ts` | **રનટાઇમ પ્લગઇન સ્કૅનર** જે ડિરેક્ટરી વાંચે છે — અને પ્લગઇન મૅનેજર જેમાં ઇન્સ્ટૉલ કરે છે તે રૂટ — તેને સેટ કરે છે, જેથી હોમ પરથી મેળવેલા ડિફૉલ્ટને ઓવરરાઇડ કરી શકાય (#11827). માત્ર સ્કૅન પાથનું સ્થાન બદલવા માટે HOME ખસેડવાને બદલે તેને Docker/K8s માં બાઇન્ડ-માઉન્ટ કરેલા પ્લગઇન ટ્રી તરફ નિર્દેશિત કરો (HOME અન્ય તમામ હોમ-સંબંધિત વર્તનને પણ નિયંત્રિત કરે છે). સેટ ન હોય ત્યારે = `~/.omniroute/plugins`, અથવા જ્યારે પ્રોસેસ કોઈ હોમ એક્સપોર્ટ કરતી ન હોય ત્યારે `/tmp/.omniroute/plugins` — આ વેરિએબલ જે નિઃશબ્દ ન શોધાવાની સમસ્યા દૂર કરે છે. ઉકેલાયેલ ડિરેક્ટરીને સ્ટાર્ટઅપ વખતે પ્રભાવશાળી બનેલા ઇનપુટ સાથે `scanner.dir_resolved` તરીકે એક વખત લૉગ કરવામાં આવે છે. ફક્ત સર્વર-સાઇડ: CLI કમાન્ડ પ્લગઇનો પોતાનું `OMNIROUTE_PLUGIN_PATH` જાળવે છે (વિભાગ 9). | +| `STORAGE_ENCRYPTION_KEY` | _(ખાલી = અક્ષમ)_ | `src/lib/db/encryption.ts` | સંગ્રહિત સંપૂર્ણ SQLite ડેટાબેઝ એન્ક્રિપ્શન માટેની AES કી. `openssl rand -hex 32` વડે જનરેટ કરો. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | એન્ક્રિપ્શન કી માટેનું વર્ઝન લેબલ. જૂના બૅકઅપનું ડિક્રિપ્શન સમર્થિત રહે તે માટે કી રોટેશન કરતી વખતે તેને વધારો. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | જ્યારે `true` હોય, ત્યારે નિયમિત/લખાણ-પૂર્વેના SQLite ફાઇલ બૅકઅપ (models.dev કિંમત સાચવવી/સાફ કરવી, સેટિંગ્સમાં લખાણ) છોડે છે. મેન્યુઅલ અને પુનઃસ્થાપન-પૂર્વેના બૅકઅપ હજુ પણ ચાલે છે. તે માઇગ્રેશન રનરના ફરજિયાત ટકાઉ સુરક્ષા સ્નૅપશૉટ અથવા હાલના સ્થાયી DB માટેના સામૂહિક-માઇગ્રેશન ગાર્ડને **અક્ષમ કરતું નથી**. બિન-મેન્યુઅલ બૅકઅપ વધુમાં વધુ દર 60 મિનિટે એક વખત થાય તે રીતે મર્યાદિત છે. ડૅશબોર્ડનું **સેટિંગ્સ → સ્ટોરેજ** નિયમિત ઑટો-બૅકઅપને સ્વતંત્ર રીતે અક્ષમ કરી શકે છે. | +| `OMNIROUTE_CRYPT_KEY` | _(સેટ કરેલ નથી)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` માટેનું **લેગસી ઉપનામ**. પ્રાથમિક વેરિયેબલ ગેરહાજર હોય ત્યારે ફૉલબૅક તરીકે સ્વીકારવામાં આવે છે. | +| `OMNIROUTE_API_KEY_BASE64` | _(સેટ કરેલ નથી)_ | `src/lib/db/encryption.ts` | **લેગસી ઉપનામ** (Base64-એન્કોડેડ સ્વરૂપ) ફૉલબૅક તરીકે સ્વીકારવામાં આવે છે. ઉપયોગ પહેલાં આપમેળે ડિકોડ થાય છે. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(સેટ કરેલ નથી)_ | `src/lib/db/core.ts` | સમયાંતરે થતા SQLite હેલ્થચેકના અંતરાલ (ms)ને ઓવરરાઇડ કરો. સેટ ન હોય ત્યારે ડિફૉલ્ટ મૂલ્યો `NODE_ENV` પરથી મેળવવામાં આવે છે. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(દૂર કરેલ)_ | `src/lib/db/walMaintenance.ts` | **દૂર કરેલ.** સમયાંતરે થતું લાઇવ `wal_checkpoint(TRUNCATE)` શેર્ડ wal-index મૅપિંગને અમાન્ય બનાવી શકે છે અને SIGBUS (#13973) સાથે પ્રોસેસને ક્રૅશ કરી શકે છે, તેથી શેડ્યૂલર હવે અસ્તિત્વમાં નથી. વેરિયેબલ નિષ્ક્રિય છે: ધન મૂલ્ય એક વખત ડિપ્રિકેશન ચેતવણી લૉગ કરે છે, જ્યારે `0` અથવા સેટ ન હોય તો મૌન રહે છે. WALની જાળવણી PASSIVE ચેકપૉઇન્ટ્સ (નીચે) દ્વારા થાય છે અને શટડાઉન ચેકપૉઇન્ટ દ્વારા તેને ટ્રંકેટ કરવામાં આવે છે. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 મિનિટ) | `src/lib/db/walMaintenance.ts` | વારંવાર થતા `wal_checkpoint(PASSIVE)`ના અંતરાલ (ms)ને ઓવરરાઇડ કરો. બાકી રહેલા WAL ફ્રેમ્સને નાના રાખે છે જેથી ચેકપૉઇન્ટ્સ ઝડપી રહે અને શટડાઉન ટ્રંકેશન વચ્ચે WAL ફાઇલ મર્યાદિત રહે. `0` અક્ષમ કરે છે. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | જ્યારે PASSIVE ટિકને WAL ફાઇલ આ કદ કરતાં મોટી મળે, ત્યારે `wal_checkpoint(RESTART)` ચલાવો જેથી મૅપ કરેલા wal-indexને ફરી લખ્યા વિના WAL નવેસરથી શરૂ થાય. લાઇવ ટ્રંકેટ-મોડ ચેકપૉઇન્ટ્સ દૂર કરવામાં આવ્યા હતા (`OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` પંક્તિ જુઓ). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | ગંભીર સંસાધન દબાણ `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` સુધી જળવાય પછી પ્રોસેસમાંથી બહાર નીકળવા માટે તેને `1`/`true`/`yes`/`on` પર સેટ કરો, જેથી અનિશ્ચિત સમય સુધી 503 પ્રતિસાદો આપવાને બદલે સુપરવાઇઝર (systemd `Restart=always`, Docker રીસ્ટાર્ટ નીતિ) સ્વચ્છ પ્રોસેસને ફરી શરૂ કરી શકે. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 મિનિટ) | `open-sse/utils/resourcePressure.ts` | સેલ્ફ-રીસ્ટાર્ટ એક્ઝિટ અમલમાં આવે તે પહેલાં ગંભીર દબાણ કેટલો સમય જળવાવું જોઈએ. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(આપમેળે શોધ)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ફૉલબૅક ઍડૅપ્ટરનો ઉપયોગ કરતી વખતે `sql-wasm.wasm`નો સ્પષ્ટ પાથ (એબ્સોલ્યુટ અથવા cwdને સંબંધિત). સેટ ન હોય ત્યારે પૅકેજ ડિપેન્ડન્સીઓ અને સંભવિત લેઆઉટ દ્વારા આપમેળે શોધવામાં આવે છે. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | ટર્મિનલ (પૂર્ણ/નિષ્ફળ/રદ/સમાપ્ત) Batch API જૉબના ચેકપૉઇન્ટ્સ, સંદર્ભિત ઇનપુટ/આઉટપુટ/ભૂલ ફાઇલો અને પંક્તિને ડિલીટ કરતાં પહેલાં ઑટોમેટિક ક્લીનઅપ સ્વીપ દ્વારા કેટલા દિવસ રાખવામાં આવે છે. `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ચાલુ કર્યા પછી જ અસર કરે છે; OpenAIની પોતાની Batch API આઉટપુટ રિટેન્શન વિન્ડો સાથે મેળ ખાય છે. ઑપરેટર દ્વારા ટ્રિગર કરાયેલા `DELETE /api/v1/batches/delete-completed` રૂટને અસર કરતું નથી, જે ડિઝાઇન મુજબ બિનશરતી રહે છે (ઉંમરનું કોઈ ફિલ્ટર નથી). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | જ્યારે `true` હોય, ત્યારે ઑટોમેટિક ક્લીનઅપ સ્વીપને `OMNIROUTE_BATCH_RETENTION_DAYS`થી જૂની ટર્મિનલ Batch API જૉબ્સ (અને તેમના ચેકપૉઇન્ટ્સ) ડિલીટ કરવા અને પોતાની `expires_at`થી જૂની અપલોડ કરેલી ફાઇલોની BLOB સામગ્રી સાફ કરવા દો. ડિફૉલ્ટ રૂપે બંધ: ઑપરેટર પસંદગીપૂર્વક ચાલુ ન કરે ત્યાં સુધી દરેક હાલનું ઇન્સ્ટોલેશન આ ડેટાને પહેલાંની જેમ જ રાખે છે. આ ડૅશબોર્ડમાં સંપાદિત કરી શકાય તેવો ફીચર ફ્લૅગ પણ છે — `docs/reference/FEATURE_FLAGS.md` → રનટાઇમ જુઓ. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | સ્ટાર્ટઅપ વખતે DB હેલ્થચેકને સંપૂર્ણપણે છોડવા માટે `1` પર સેટ કરો. ટૂંકા સમય માટે ચાલતાં કાર્યો અને ઇન્ટિગ્રેશન પરીક્ષણો માટે ઉપયોગી છે. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | સામાન્ય રીતે DB હેલ્થચેક લૂપ છોડવામાં આવતો હોય ત્યારે પણ (દા.ત., ટૂંકા સમય માટે ચાલતાં કાર્યો) તેને ફરજિયાત ચાલુ કરવા માટે `1` પર સેટ કરો. | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` દરમિયાન નેટિવ રનટાઇમનું વૉર્મ-અપ છોડવા માટે `1` પર સેટ કરો. જ્યાં sqlite પહેલેથી બિલ્ડ થયેલું હોય એવા CI/હેડલેસ ઇન્સ્ટોલ માટે ઉપયોગી છે. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(સ્વતઃ-શોધ)_ | `src/lib/db/migrationRunner.ts` | માઇગ્રેશન રનર જે ડિરેક્ટરી સ્કેન કરે છે તેને ઓવરરાઇડ કરો. કસ્ટમ બિલ્ડમાં બંડલ કરેલા માઇગ્રેશનો મોકલતી વખતે ઉપયોગી છે. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(સેટ કરેલ નથી)_ | `src/lib/db/migrationRunner/extraDirs.ts` | પ્લેટફોર્મના પાથ ડિલિમિટરથી અલગ કરેલી `namespace=dir` એન્ટ્રીઓ તરીકે વધારાની માઇગ્રેશન ડિરેક્ટરીઓ (દા.ત. `ee=/opt/app/enterprise/db/migrations`). ત્યાં મળેલી ફાઇલો `-` તરીકે નોંધાય છે, જેથી પોતાના માઇગ્રેશનો મોકલતું ડિસ્ટ્રિબ્યુશન અપસ્ટ્રીમ ન્યૂમેરિક સ્લોટ્સ સાથે ક્યારેય અથડાતું નથી. ખોટા ફોર્મેટની એન્ટ્રી, અમાન્ય નેમસ્પેસ અથવા ગેરહાજર ડિરેક્ટરીને કારણે સ્કીમા ચૂપચાપ છોડવાને બદલે સ્ટાર્ટઅપ વખતે ભૂલ થાય છે. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | મોટી સંખ્યામાં બાકી રહેલા માઇગ્રેશનો માટેની સુરક્ષા મર્યાદા (#3416). હાલના DB પર આ સંખ્યા કરતાં વધુ માઇગ્રેશનો બાકી હોય તો સ્ટાર્ટઅપ નિષ્ફળ થાય છે (સાફ કરી દેવાયેલા ટ્રૅકિંગ ટેબલ સામે રક્ષણ આપે છે). જૂનો બૅકઅપ પુનઃસ્થાપિત કરવા માટે તેને વધારો; તપાસ અક્ષમ કરવા માટે `0` પર સેટ કરો. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` રિલીઝ ગેટ માટેની કાર્યકારી ડિરેક્ટરી. તેને અંદાજે 12 GB (બે ~3 GB ઇન્સ્ટોલ ટ્રી ઉપરાંત tarball)ની જરૂર પડે છે, તેથી તેને નાના tmpfs પર ચલાવવું જોઈએ નહીં — સેલ્ફ-હોસ્ટેડ રનર પર `/tmp` એ 12 GB RAM-આધારિત tmpfs છે અને ગેટે તેની જગ્યા ખતમ કરી દીધી હતી, જેના કારણે પૅકેજ અધૂરું કપાઈ ગયું હતું. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(કોડમાં ડિફૉલ્ટ)_ | `src/lib/spend/batchWriter.ts` | બૅચ કરેલા ખર્ચ/કૉસ્ટ રાઇટર માટે ફ્લશ અંતરાલ (ms). નીચા મૂલ્યો રાઇટ કોએલેસિંગ ઘટાડે છે; ઊંચા મૂલ્યો DB કન્ટેન્શન ઘટાડે છે. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(કોડમાં ડિફૉલ્ટ)_ | `src/lib/spend/batchWriter.ts` | ફરજિયાત ફ્લશ પહેલાં બફર કરી શકાય તેવી ખર્ચ એન્ટ્રીઓની મહત્તમ સંખ્યા. ઉચ્ચ-QPS ડિપ્લોયમેન્ટ માટે વધારો; જ્યારે મર્યાદિત મેમરી વધુ મહત્ત્વની હોય ત્યારે ઘટાડો. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(સેટ કરેલ નથી)_ | `open-sse/utils/proxyFetch.ts` | Vercel રિલે પાથ પર `[ProxyFetch]` ડિબગ લૉગ્સ ઉત્સર્જિત કરવા માટે `"true"` પર સેટ કરો. રાઉટિંગ સંકેતો લીક ન થાય તે માટે ડિફૉલ્ટ રૂપે બંધ છે. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | વિગતવાર `[ProxyEgress]` પ્રોસેસ-લૉગ લાઇનમાં ક્લાયન્ટ/ઇગ્રેસ IP અને એકાઉન્ટ પ્રીફિક્સનો સમાવેશ કરવા માટે `"true"` અથવા `"1"` પર સેટ કરો. પ્રોસેસ લૉગ IP અથવા એકાઉન્ટ પ્રીફિક્સ લીક ન કરે તે માટે ડિફૉલ્ટ રૂપે બંધ રાખવામાં આવ્યું છે. | +| `OMNIROUTE_DEBUG` | _(સેટ કરેલ નથી)_ | `bin/cli/commands/quota.mjs` | CLI ક્વોટા કમાન્ડમાંથી stderr પર દરેક રિક્વેસ્ટ માટે સમય સંબંધિત ડાયગ્નોસ્ટિક્સ (`[omniroute] GET completed in Nms`) પ્રિન્ટ કરવા માટે `1` પર સેટ કરો. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(સ્વતઃ)_ | `scripts/dev/healthcheck.mjs` | કન્ટેનર હેલ્થ ચેક દ્વારા પ્રોબ કરવામાં આવતો સ્પષ્ટ પાથ. સેટ ન હોય ત્યારે પ્રોબ તેને `OMNIROUTE_BASE_PATH` પરથી નક્કી કરે છે; તેને સેટ કરવાથી ડીપ મોનિટરિંગ એન્ડપોઇન્ટ ફરી પસંદ થાય છે. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(સેટ કરેલ નથી)_ | `bin/cli/commands/completion.mjs` | CLI શેલ-કમ્પ્લીશન કૅશ પાથ (રીડ/રિફ્રેશ/રાઇટ)માંથી `[omniroute completion]` ડાયગ્નોસ્ટિક્સ ઉત્સર્જિત કરવા માટે કોઈપણ બિન-ખાલી મૂલ્ય પર સેટ કરો. ડિફૉલ્ટ રૂપે બંધ છે — એ કૅશ ચૂપચાપ નિષ્ફળ થાય છે, જેથી ગેરહાજર/દૂષિત કૅશ ક્યારેય ટૅબ-કમ્પ્લીશનને બગાડે નહીં. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | વ્યક્તિગત બૅચ આઇટમ્સ માટે મહત્તમ પુનઃપ્રયાસ વિન્ડો (ms). આ અવધિ વટાવતી આઇટમ્સને નિષ્ફળ તરીકે ચિહ્નિત કરવામાં આવે છે. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | બેચ આઇટમના પુનઃપ્રયાસો માટે એક્સ્પોનેન્શિયલ બૅકઑફનો મૂળભૂત વિલંબ (ms). | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 કલાક) | `open-sse/services/batchProcessor.ts` | બેચ આઇટમના પુનઃપ્રયાસો વચ્ચેના એક્સ્પોનેન્શિયલ બૅકઑફની મહત્તમ મર્યાદા (ms). | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | એકસાથે પ્રક્રિયા થતા બેચની મહત્તમ સંખ્યા. થ્રૂપુટ વધારવા માટે આ મૂલ્ય વધારો; રેટ-લિમિટના અતિશય વધારાને ટાળવા માટે તેને ઓછું રાખો. | > [!IMPORTANT] -> હાલના પર્સિસ્ટન્ટ ડેટાબેઝમાં ફેરફાર કરતાં પહેલાં, માઇગ્રેશન રનર `DATA_DIR/db_backups/` હેઠળ સંપૂર્ણ, -> કન્ટેન્ટ-એડ્રેસ્ડ સ્નૅપશૉટ પ્રકાશિત કરે છે. પ્રકાશન માટે એવી ફાઇલ સિસ્ટમ જરૂરી છે જે -> સમાન ફાઇલ સિસ્ટમ પરની, ઓવરરાઇટ વિનાની હાર્ડ લિંક્સ અને ટકાઉ ફાઇલ સિંકને સપોર્ટ કરતી હોય. POSIX હોસ્ટ માટે -> ડિરેક્ટરી સિંક પણ જરૂરી છે; Windows પર, Node ડિરેક્ટરી હેન્ડલને નકારી શકે છે, તેથી OmniRoute -> પ્રકાશિત ફાઇલને ફ્લશ કરે છે અને ડિરેક્ટરી-એન્ટ્રી સિંકને શ્રેષ્ઠ પ્રયાસ તરીકે ગણે છે. -> જો માઉન્ટ કરેલું `DATA_DIR` આ ખાતરીઓ પૂરી પાડી શકતું ન હોય, તો માઇગ્રેશન લાગુ કરતાં પહેલાં -> સ્ટાર્ટઅપ સુરક્ષિત રીતે નિષ્ફળ જાય છે. `DATA_DIR`ને આ સુવિધાઓ ધરાવતા વૉલ્યુમ પર ખસેડો; -> માઇગ્રેશન સુરક્ષાને બાયપાસ કરવા માટે `DISABLE_SQLITE_AUTO_BACKUP`નો ઉપયોગ કરશો નહીં. +> હાલના સ્થાયી ડેટાબેઝમાં ફેરફાર કરતા પહેલાં, માઇગ્રેશન રનર `DATA_DIR/db_backups/` હેઠળ એક સંપૂર્ણ, +> કન્ટેન્ટ-એડ્રેસ્ડ સ્નૅપશૉટ પ્રકાશિત કરે છે. પ્રકાશન માટે એવી ફાઇલસિસ્ટમ જરૂરી છે જે સમાન ફાઇલસિસ્ટમમાં, +> ઓવરરાઇટ ન કરતી હાર્ડ લિંક્સ અને ટકાઉ ફાઇલ સિંકને સપોર્ટ કરતી હોય. POSIX હોસ્ટ પર ડિરેક્ટરી સિંક પણ +> જરૂરી છે; Windows પર Node ડિરેક્ટરી હેન્ડલ્સને નકારી શકે છે, તેથી OmniRoute પ્રકાશિત ફાઇલને ફ્લશ કરે છે +> અને ડિરેક્ટરી-એન્ટ્રી સિંકને શ્રેષ્ઠ પ્રયાસ તરીકે ગણે છે. +> જો માઉન્ટ કરેલું `DATA_DIR` આ ખાતરીઓ પૂરી પાડી શકતું ન હોય, તો માઇગ્રેશન લાગુ કરતાં પહેલાં જ +> સ્ટાર્ટઅપ સુરક્ષિત રીતે નિષ્ફળ જાય છે. `DATA_DIR` ને આ સુવિધાઓ ધરાવતા વોલ્યુમ પર ખસેડો; +> માઇગ્રેશન સુરક્ષાને બાયપાસ કરવા માટે `DISABLE_SQLITE_AUTO_BACKUP` નો ઉપયોગ કરશો નહીં. ### પરિસ્થિતિઓ -| પરિસ્થિતિ | રૂપરેખાંકન | -| -------------------------------- | ---------------------------------------------------------------------------------------- | -| **સ્થાનિક ડેવલપમેન્ટ** | તમામ ડિફૉલ્ટ યથાવત્ રાખો. DB `~/.omniroute/omniroute.db` પર રહે છે. | -| **Docker** | `DATA_DIR=/data` + `/data` પર વૉલ્યુમ માઉન્ટ કરો. | -| **સ્થિર સંગ્રહમાં એન્ક્રિપ્ટેડ** | `STORAGE_ENCRYPTION_KEY` સેટ કરો + કીની બૅકઅપ નકલો રાખો! તેને ગુમાવવી એટલે ડેટા ગુમાવવો. | -| **CI/ટેસ્ટિંગ** | `DATA_DIR=/tmp/omniroute-test` — અસ્થાયી છે, એન્ક્રિપ્શનની જરૂર નથી. | +| પરિસ્થિતિ | રૂપરેખાંકન | +| -------------------------------- | ------------------------------------------------------------------------------ | +| **સ્થાનિક ડેવલપમેન્ટ** | તમામ ડિફૉલ્ટ્સ યથાવત્ રાખો. DB `~/.omniroute/omniroute.db` પર રહે છે. | +| **Docker** | `DATA_DIR=/data` + `/data` પર વોલ્યુમ માઉન્ટ કરો. | +| **સ્થિર અવસ્થામાં એન્ક્રિપ્ટેડ** | `STORAGE_ENCRYPTION_KEY` સેટ કરો + કીનો બૅકઅપ રાખો! તે ગુમાવવી = ડેટા ગુમાવવો. | +| **CI/ટેસ્ટિંગ** | `DATA_DIR=/tmp/omniroute-test` — અસ્થાયી, એન્ક્રિપ્શન જરૂરી નથી. | --- @@ -213,45 +212,46 @@ OmniRoute તમામ સ્થાયી સંગ્રહ માટે **SQLi ## 4. સુરક્ષા અને પ્રમાણીકરણ -| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | -| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | મશીન ફિંગરપ્રિન્ટિંગ માટે હાર્ડવેર ઓળખકર્તાઓ સાથે જોડાતું સૉલ્ટ. અલગતા જાળવવા માટે દરેક ડિપ્લોયમેન્ટ દીઠ તેને બદલો. | -| `OMNIROUTE_CLI_SALT` | _(સેટ ન કરેલું = દરેક ઇન્સ્ટોલ માટે રૅન્ડમ સૉલ્ટ, જે `/cli-token-salt.json` પર સંગ્રહિત રહે છે)_ | `src/lib/machineToken.ts` | સ્થાનિક CLI પ્રમાણીકરણ ટોકન મેળવવા માટેનું HMAC સૉલ્ટ. આ મૂલ્ય સેટ કરવાથી મશીન પરના બધા CLI ટોકન રોટેટ થાય છે અને સંગ્રહિત સૉલ્ટ કરતાં તેને હંમેશાં પ્રાથમિકતા મળે છે. `docs/security/CLI_TOKEN.md` જુઓ. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | સેશન કુકીઝ પર `Secure` ફ્લૅગ સેટ કરે છે. HTTPS પાછળ ચલાવતી વખતે તે **`true` હોવું આવશ્યક છે**. | -| `REQUIRE_API_KEY` | `false` | API મિડલવેર | જ્યારે `true` હોય, ત્યારે બધી `/v1/*` પ્રૉક્સી વિનંતિઓમાં માન્ય API કી સામેલ હોવી આવશ્યક છે. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Dashboard UI માં API કીનાં સંપૂર્ણ મૂલ્યો દર્શાવવાની મંજૂરી આપે છે. Dashboard Feature Flags માંથી કૉન્ફિગર કરી શકાય છે; શૅર્ડ ઇન્સ્ટન્સ પર સુરક્ષા જોખમ છે. | -| `NO_LOG_API_KEY_IDS` | _(ખાલી)_ | `src/lib/compliance/index.ts` | વિનંતી લૉગિંગને બાયપાસ કરતી, અલ્પવિરામથી અલગ કરેલી API કી IDs (GDPR અનુપાલન). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(સેટ ન કરેલું = અમર્યાદિત)_ | `src/shared/utils/apiKeyPolicy.ts` | જે API કીઓની `rate_limits` કૉલમ null છે, તેમના પર લાગુ થતું વૈકલ્પિક દૈનિક વિનંતી બજેટ. સેટ ન કરેલું અથવા ખાલી: કોઈ અપ્રત્યક્ષ મર્યાદા નહીં (#2289, #11017). `0` પણ સમાન છે (અમર્યાદિત). ધન પૂર્ણાંક N, N/દિવસ, 5N/અઠવાડિયું, 20N/મહિનો સક્ષમ કરે છે. ખોટા ફૉર્મેટવાળા બિન-ખાલી મૂલ્યો માટે વારસાગત 1000/દિવસ, 5000/અઠવાડિયું, 20000/મહિનાની વિન્ડોઝ વપરાય છે. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | મંજૂર વિનંતી બૉડીનું મહત્તમ કદ. આ મર્યાદાથી વધુના પેલોડ્સને નકારે છે. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | આ થ્રેશોલ્ડ જેટલી અથવા તેનાથી મોટી વાસ્તવિક વિનંતી બૉડીઝ JSON પાર્સિંગ પહેલાં ઍટૉમિક, પ્રોસેસ-લોકલ હેવીવેઇટ ઍડમિશન લીઝ લે છે (BYTE પાથ, જેમાં `POST /v1/responses` સામેલ છે). સ્ટ્રક્ચર-હેવી જેવી જ [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) હેલ્ધી-હેડરૂમ એસ્કેપ; તેમ છતાં `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) દ્વારા મર્યાદિત છે, જેથી [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ફરી ન આવે. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | મર્યાદિત ઇન્જેશન દરમિયાન વાંચવામાં આવેલા બાઇટ્સ સામે લાગુ કરાતી ચૅટ-રૂટની કડક મર્યાદા, જેમાં ગેરહાજર, અમાન્ય અથવા અપ્રામાણિક `Content-Length` ધરાવતી વિનંતિઓ પણ સામેલ છે; મર્યાદાથી વધુ હોય તો `413` મળે છે. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(સેટ નથી — વિનંતી-સંખ્યા પર કોઈ મર્યાદા નથી)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** આ લેગસી વિનંતી-સંખ્યા મર્યાદા હવે માત્ર સ્પષ્ટ રીતે સેટ કરવામાં આવે ત્યારે જ લાગુ પડે છે. તેને સેટ કર્યા વિના રાખવામાં આવે (ડિફૉલ્ટ), ત્યારે હેવીવેઇટ ચેટ સ્વીકૃતિ તેના બદલે `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` દ્વારા નિયંત્રિત થાય છે — **એક પ્રોસેસમાં** (એક V8 હીપ) પ્રોસેસની વાસ્તવિક મેમરી મર્યાદાના આધારે આપમેળે નિર્ધારિત BYTE બજેટ. એકબીજા સાથે ઓવરલેપ થતી ~750k-tokenની બે `/v1/responses` વિનંતીઓ ~12 Gi હીપ્સને અબોર્ટ કરાવે છે (#7849) — આ **મેમરી-બજેટ** ચેતવણી છે, 2ની કઠોર પ્રોડક્ટ મહત્તમ મર્યાદા નથી. તંદુરસ્ત પ્રોસેસ (શેડ રેશિયોથી નીચેનો હીપ) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` દ્વારા વધુ સમકાલીન લાંબી `/v1/responses` વિનંતીઓ સ્વીકારી શકે છે. દસેક લાંબા SSE ક્લાયન્ટ્સ (40–50) માટે મર્યાદા હીપ + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 છે, “મહત્તમ 2” નહીં. “હોસ્ટનો ઉપયોગ કરવા” આ મૂલ્યને વિચાર્યા વિના વધારવાથી #7849 ફરી સર્જાય છે. **N સ્વતંત્ર `DATA_DIR`s** સાથે **હીપ્સ** વધારો (#11024); એક SQLite ફાઇલ પર ક્યારેય `replicas>1` ન રાખો. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(આપમેળે નિર્ધારિત)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** આપમેળે નિર્ધારિત ઇન્જેસ્ટ બાઇટ બજેટ માટે ઓવરરાઇડ (વધુ ચુસ્ત V8/cgroup મેમરી મર્યાદાના 25%ને 8x ક્ષણિક એમ્પ્લિફિકેશન વડે ભાગીને મળતું મૂલ્ય). નિર્ધારિત અને સ્પષ્ટ મૂલ્યો 8 MiB–2 GiB સુધી ક્લેમ્પ થાય છે. અસરકારક બજેટ કરતાં મોટી બોડી તરત જ `413 body_exceeds_budget` સાથે નિષ્ફળ જાય છે; અલગથી સેવા આપી શકાય તેવી બોડીઓ વચ્ચેનો સંઘર્ષ ફરી પ્રયાસ કરી શકાય તેવા `503` તરીકે રહે છે. 40–50 સમકાલીન લાંબા SSE ક્લાયન્ટ્સ માટે મર્યાદા આ બજેટ + હીપ છે, કઠોર “મહત્તમ 2” નહીં. ટ્યુનિંગ પહેલાં `/api/monitoring/health` પર `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` વાંચો. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | BYTE અને STRUCTURE હેવીવેઇટ સ્વીકૃતિ માટે હીપ-દબાણ શેડ રેશિયો (`heapUsed / heap_size_limit`) (#10183, #10268, #10437). `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`થી આગળની સમકાલીન હેવીવેઇટ વિનંતીને ફરી પ્રયાસ કરી શકાય તેવા `503` સાથે માત્ર ત્યારે જ શેડ કરવામાં આવે છે જ્યારે હીપ પણ આ રેશિયો પર અથવા તેનાથી ઉપર હોય; તંદુરસ્ત હીપ પર તેને તેના બદલે હેલ્ધી-હેડરૂમ દ્વારા સ્વીકારવામાં આવે છે. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ડિફૉલ્ટ `1`) | `src/shared/middleware/chatBodyAdmission.ts` | STRUCTURE અને BYTE (`admitChatRequest`, જેમાં ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` બોડીઓ સામેલ છે) બંને પર હેલ્ધી-હીપ ફાસ્ટ પાથ (#10437) માટે મર્યાદિત વધારાની ક્ષમતા. આ મર્યાદા વિના, વ્યસ્ત પરંતુ તંદુરસ્ત હીપ ધરાવતી દરેક વિનંતી કોઈ મહત્તમ મર્યાદા વિના સ્વીકૃતિને બાયપાસ કરતી હતી. હેલ્ધી-હીપ પાથ દ્વારા આટલી સમકાલીન લીઝ સક્રિય થઈ જાય પછી, આગળની વ્યસ્ત વિનંતીઓ વાસ્તવિક હીપ દબાણ હેઠળ વપરાતા એ જ મર્યાદિત-પ્રતીક્ષા/શેડ પાથ પર જાય છે. `0` બાયપાસને સંપૂર્ણપણે અક્ષમ કરે છે. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | બોડી બાઇટ થ્રેશોલ્ડથી નીચે હોય ત્યારે પણ ચેટ વિનંતીને હેવીવેઇટ તરીકે વર્ગીકૃત કરતી સંદેશ સંખ્યા. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | બોડી બાઇટ થ્રેશોલ્ડથી નીચે હોય ત્યારે પણ ચેટ વિનંતીને હેવીવેઇટ તરીકે વર્ગીકૃત કરતી ટૂલ સંખ્યા. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | વિનંતીને હેવીવેઇટ તરીકે વર્ગીકૃત કરતો સાવચેત સ્ટ્રિંગ-સાઇઝ ટોકન અંદાજ; આ સ્વીકૃતિ-ખર્ચ માટેનું પ્રોક્સી છે, પ્રોવાઇડર બિલિંગ ટોકનાઇઝેશન નથી. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (અક્ષમ) | `src/shared/middleware/chatBodyAdmission.ts` | વૈકલ્પિક, સ્પષ્ટ રીતે સક્ષમ કરવાની ચેટ ઇતિહાસ મર્યાદા. ડિફૉલ્ટ રૂપે અક્ષમ: સંદેશ સંખ્યા એ ડિપ્લોયમેન્ટ નીતિ છે, વિનંતીનો સાર્વત્રિક ગુણધર્મ નથી, અને અહીં મર્યાદા મૂકવાથી કમ્પ્રેશન પાઇપલાઇન તેમને સેવા આપી શકાય તેવી બનાવે તે પહેલાં જ વાતચીતને અંતિમ `413` સાથે નકારી કાઢવામાં આવે છે. હીપ વૃદ્ધિ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` અને હીપ-દબાણ શેડ દ્વારા મર્યાદિત થાય છે. કઠોર મહત્તમ મર્યાદાની જરૂર હોય તેવા મેમરી-મર્યાદિત ડિપ્લોયમેન્ટ્સ પર સકારાત્મક મૂલ્ય સેટ કરો; ત્યારબાદ મર્યાદા કરતાં વધુને સંરચિત compact-required `413` મળે છે. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | મેમરીમાં સંપૂર્ણપણે બફર થતા નોન-સ્ટ્રીમિંગ અપસ્ટ્રીમ પ્રતિસાદ માટે કઠોર મર્યાદા. આનાથી આગળ અપસ્ટ્રીમ રીડર રદ થાય છે અને હીપ ખતમ થાય ત્યાં સુધી અમર્યાદિત સ્ટ્રિંગ વધારવાને બદલે વિનંતી ઝડપથી નિષ્ફળ જાય છે. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | અપસ્ટ્રીમ પ્રતિસાદ હેડર્સમાંથી ફોરવર્ડ કરાતા મહત્તમ વાયર બાઇટ્સ. બજેટ વટાવાય ત્યારે સામાન્ય રિવર્સ-પ્રોક્સી હેડર મર્યાદાઓની અંદર રહેવા માટે ઓછી પ્રાથમિકતાવાળા હેડર્સ (દા.ત., કસ્ટમ `x-codex-*`, `x-oai-request-id`) કાઢી નાખવામાં આવે છે. મોટા પ્રતિસાદ હેડર કદના ખર્ચે વધુ અપસ્ટ્રીમ મેટાડેટા ફોરવર્ડ કરવા માટે વધુ ઊંચું મૂલ્ય સેટ કરો. | -| `CORS_ORIGIN` | _(સેટ કરેલ નથી)_ | `src/server/cors/origins.ts` | જૂની સિંગલ-ઑરિજિન CORS અનુમતિસૂચિ. નવા ડિપ્લોયમેન્ટ માટે `CORS_ALLOWED_ORIGINS` ને પ્રાધાન્ય આપો. CORS માત્ર ક્રોસ-ઑરિજિન બ્રાઉઝર API ક્લાયન્ટ્સ માટે છે; અધિકૃત ડૅશબોર્ડ રાઇટ્સ તેના બદલે સેમ-ઑરિજિન વિનંતીઓ સાથે સેશન-બાઉન્ડ CSRF સુરક્ષાનો ઉપયોગ કરે છે. | -| `CORS_ALLOWED_ORIGINS` | _(સેટ કરેલ નથી)_ | `src/server/cors/origins.ts` | અલ્પવિરામથી અલગ કરેલી CORS અનુમતિસૂચિ. `CORS_ALLOW_ALL=true` સ્પષ્ટ રીતે કૉન્ફિગર ન કરેલું હોય ત્યાં સુધી કોઈ વાઇલ્ડકાર્ડ મોકલવામાં આવતું નથી. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | કોઈપણ બ્રાઉઝર `Origin` ને પ્રતિધ્વનિત કરવા માટે માત્ર ડેવલપમેન્ટ માટેનો બચાવમાર્ગ. શેર કરેલા અથવા પ્રોડક્શન ડિપ્લોયમેન્ટ્સ પર તેને સક્ષમ કરશો નહીં. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | ખાનગી/લૂપબૅક/લિંક-લોકલ IP રેન્જને લક્ષ્ય કરતી પ્રોવાઇડર કૉલ્સને અવરોધો. ફક્ત અલગ રાખેલા ટેસ્ટ એન્વાયર્નમેન્ટ્સમાં જ અક્ષમ કરો. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | ખાનગી/સ્થાનિક નેટવર્ક્સ (localhost, 192.168.x.x, 10.x.x.x, વગેરે) તરફ નિર્દેશ કરતા પ્રોવાઇડર URLs ને મંજૂરી આપો. **સેલ્ફ-હોસ્ટેડ પ્રોવાઇડર્સ માટે આવશ્યક છે** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). `false` હોય ત્યારે, ડૅશબોર્ડ સ્થાનિક URLs નું વૅલિડેશન નકારે છે. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | સ્થાનિક/ખાનગી સરનામાં (127.0.0.1, localhost, LAN, ખાનગી રેન્જ) પર પ્રોવાઇડર્સ ઉમેરવા/વૅલિડેટ કરવાની મંજૂરી આપો — આ માત્ર પ્રોવાઇડર વૅલિડેશન પાથ સુધી મર્યાદિત છે. **ડિફૉલ્ટ `true`** (લોકલ-ફર્સ્ટ); માત્ર સાર્વજનિક સરનામાં માટેનો કડક અવરોધ લાગુ કરવા `false` પર સેટ કરો. ક્લાઉડ-મેટાડેટા એન્ડપોઇન્ટ્સ (169.254.169.254, metadata.google.internal) હંમેશાં અવરોધિત રહે છે. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` રૂટ્સ (ટ્રાન્સક્રિપ્શન, સ્પીચ, અનુવાદ) ને localhost ની બહાર હોસ્ટ કરેલા OpenAI-સુસંગત પ્રોવાઇડર નોડનો ઉપયોગ કરવા દો. ડિફૉલ્ટ રૂપે બંધ છે — ઑડિયોને રિમોટ હોસ્ટ પર રૂટ કરવાથી ઇગ્રેસ ઓળખ બદલાય છે અને તે ઑપરેટરનો સ્પષ્ટ નિર્ણય હોવો આવશ્યક છે. લૂપબૅક/ખાનગી નોડ્સ (localhost, 127.0.0.1, 172.16-31.x) હંમેશાં માન્ય છે અને આ સેટિંગથી અપ્રભાવિત રહે છે. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC સક્ષમ હોય ત્યારે, પાસવર્ડ લૉગિન અક્ષમ કરો જેથી વપરાશકર્તાઓ ફક્ત OIDC Single Sign-On દ્વારા જ પ્રમાણિત થઈ શકે. સાદું ઉપનામ `OIDC_DISABLE_PASSWORD_LOGIN` પણ સ્વીકારવામાં આવે છે; એ જ કી ધરાવતા Dashboard Feature Flag ને પ્રાધાન્ય મળે છે. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` નું સાદું ઉપનામ (#10889). | - -### સુરક્ષા સઘન બનાવવાની ચેકલિસ્ટ +| ચલ | ડિફૉલ્ટ | સ્રોત ફાઇલ | વર્ણન | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | મશીન ફિંગરપ્રિન્ટિંગ માટે હાર્ડવેર ઓળખકર્તાઓ સાથે સંયોજિત કરવામાં આવતું સૉલ્ટ. અલગાવ માટે દરેક ડિપ્લોયમેન્ટ દીઠ તેને બદલો. | +| `OMNIROUTE_CLI_SALT` | _(સેટ કરેલું નથી = દરેક ઇન્સ્ટોલેશન માટે રેન્ડમ સૉલ્ટ, જે `/cli-token-salt.json` પર સંગ્રહિત રહે છે)_ | `src/lib/machineToken.ts` | સ્થાનિક CLI પ્રમાણીકરણ ટોકન મેળવવા માટેનું HMAC સૉલ્ટ. આ મૂલ્ય સેટ કરવાથી મશીન પરના તમામ CLI ટોકન રોટેટ થાય છે અને તે હંમેશાં સંગ્રહિત સૉલ્ટ કરતાં પ્રાથમિકતા ધરાવે છે. `docs/security/CLI_TOKEN.md` જુઓ. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | સેશન કૂકીઝ પર `Secure` ફ્લૅગ સેટ કરે છે. HTTPS પાછળ ચલાવતી વખતે તે **`true` હોવું આવશ્યક છે**. | +| `REQUIRE_API_KEY` | `false` | API મિડલવેર | જ્યારે `true` હોય, ત્યારે તમામ `/v1/*` પ્રૉક્સી વિનંતિઓમાં માન્ય API કી સામેલ હોવી આવશ્યક છે. **આ ફ્લૅગ `GET /v1/models`ને નિયંત્રિત કરતો નથી**, જે તેના બદલે ડૅશબોર્ડ લૉગિન સ્થિતિ (`requireAuthForModels`)ને અનુસરે છે — તેથી `/v1/models` તરફથી મળતા `401`નો અર્થ એવો નથી કે ઇન્ફરન્સ સુરક્ષિત છે. `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695) જુઓ. | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | ડૅશબોર્ડ UIમાં API કીનાં સંપૂર્ણ મૂલ્યો દર્શાવવાની મંજૂરી આપે છે. ડૅશબોર્ડ ફીચર ફ્લૅગ્સમાંથી રૂપરેખાંકિત કરી શકાય છે; શેર કરેલા ઇન્સ્ટન્સ પર તે સુરક્ષા જોખમ છે. | +| `NO_LOG_API_KEY_IDS` | _(ખાલી)_ | `src/lib/compliance/index.ts` | વિનંતિ લૉગિંગને બાયપાસ કરતી, અલ્પવિરામથી અલગ કરેલી API કી IDs (GDPR અનુપાલન). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(સેટ કરેલું નથી = અમર્યાદિત)_ | `src/shared/utils/apiKeyPolicy.ts` | જે API કીઝની `rate_limits` કૉલમ null છે, તેમને લાગુ પડતું પ્રતિ-દિવસ વિનંતિ બજેટ. સેટ ન કરેલું અથવા ખાલી: કોઈ ગર્ભિત મર્યાદા નહીં (#2289, #11017). `0` પણ સમાન છે (અમર્યાદિત). ધન પૂર્ણાંક N, N/દિવસ, 5N/અઠવાડિયું, 20N/મહિનો સક્ષમ કરે છે. ખામીયુક્ત બિન-ખાલી મૂલ્યો માટે લેગસી 1000/દિવસ, 5000/અઠવાડિયું, 20000/મહિનો વિન્ડોઝ વપરાય છે. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | મંજૂર વિનંતિ બૉડીનું મહત્તમ કદ. આ મર્યાદા કરતાં મોટા પેલોડ્સને નકારે છે. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | આ થ્રેશોલ્ડ જેટલી અથવા તેનાથી મોટી વાસ્તવિક વિનંતિ બૉડીઝ JSON પાર્સિંગ પહેલાં ઍટોમિક પ્રોસેસ-લોકલ હેવીવેઇટ એડમિશન લીઝ મેળવે છે (BYTE પાથ, જેમાં `POST /v1/responses` સામેલ છે). સ્ટ્રક્ચર-હેવી જેવી જ [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) હેલ્ધી-હેડરૂમ એસ્કેપ; તેમ છતાં `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) દ્વારા મર્યાદિત છે, જેથી [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ફરી ન આવે. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | મર્યાદિત ઇન્જેશન દરમિયાન વાંચવામાં આવેલા બાઇટ્સ સામે લાગુ કરાતી ચેટ-રૂટની કડક મર્યાદા, જેમાં ગેરહાજર, અમાન્ય અથવા ભ્રામક `Content-Length` ધરાવતી વિનંતીઓનો પણ સમાવેશ થાય છે; મર્યાદા કરતાં વધુ હોય તો `413` મળે છે. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(સેટ કરેલ નથી — વિનંતી-સંખ્યા પર કોઈ મર્યાદા નથી)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** આ લેગસી વિનંતી-સંખ્યા મર્યાદા હવે માત્ર સ્પષ્ટ રીતે સેટ કરેલી હોય ત્યારે જ લાગુ પડે છે. તેને સેટ કર્યા વિના રાખવામાં આવે (ડિફૉલ્ટ), ત્યારે હેવીવેઇટ ચેટ એડમિશનને બદલે `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` દ્વારા નિયંત્રિત થાય છે — જે **એક પ્રોસેસ** (એક V8 heap)માં પ્રોસેસની વાસ્તવિક મેમરી મર્યાદાના આધારે આપમેળે નિર્ધારિત BYTE બજેટ છે. એકબીજા સાથે ઓવરલેપ થતી ~750k-tokenની બે `/v1/responses` વિનંતીઓ ~12 Gi heapsને અબૉર્ટ કરે છે (#7849) — આ **મેમરી-બજેટ** ચેતવણી છે, 2ની કડક પ્રોડક્ટ મર્યાદા નહીં. સ્વસ્થ પ્રોસેસ (shed ratio કરતાં નીચેનો heap) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` દ્વારા વધુ સમકાલીન લાંબી `/v1/responses` વિનંતીઓ સ્વીકારી શકે છે. દસકાઓ લાંબા SSE ક્લાયન્ટ્સ (40–50) માટે મર્યાદા heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 છે, “મહત્તમ 2” નહીં. “હોસ્ટનો ઉપયોગ કરવા” માટે આ મૂલ્યને વિચાર્યા વિના વધારવાથી #7849 ફરી સર્જાય છે. **N સ્વતંત્ર `DATA_DIR`s** સાથે **heaps**ની સંખ્યા વધારો (#11024); એક SQLite ફાઇલ પર ક્યારેય `replicas>1` ન રાખો. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(આપમેળે નિર્ધારિત)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** આપમેળે નિર્ધારિત ઇન્જેસ્ટ બાઇટ બજેટ માટેનું ઓવરરાઇડ (વધુ કડક V8/cgroup મેમરી મર્યાદાના 25%ને 8x ક્ષણિક એમ્પ્લિફિકેશન વડે ભાગીને મળતું મૂલ્ય). નિર્ધારિત અને સ્પષ્ટ બંને મૂલ્યોને 8 MiB–2 GiBની રેન્જમાં મર્યાદિત કરવામાં આવે છે. અસરકારક બજેટ કરતાં મોટી બોડી તરત જ `413 body_exceeds_budget` સાથે નિષ્ફળ જાય છે; વ્યક્તિગત રીતે સર્વિસ કરી શકાય તેવી બોડીઓ વચ્ચેની સ્પર્ધા માટે ફરી પ્રયાસ કરી શકાય તેવું `503` જળવાય છે. 40–50 સમકાલીન લાંબા SSE ક્લાયન્ટ્સ માટે મર્યાદા આ બજેટ + heap છે, કડક “મહત્તમ 2” નહીં. ટ્યુનિંગ પહેલાં `/api/monitoring/health` પર `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` વાંચો. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | BYTE અને STRUCTURE હેવીવેઇટ એડમિશન માટેનો heap-pressure shed ratio (`heapUsed / heap_size_limit`) (#10183, #10268, #10437). `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`ને વટાવતી સમકાલીન હેવીવેઇટ વિનંતીને ફરી પ્રયાસ કરી શકાય તેવા `503` સાથે માત્ર ત્યારે જ નકારવામાં આવે છે જ્યારે heap પણ આ ગુણોત્તર જેટલો અથવા તેનાથી વધુ હોય; સ્વસ્થ heap પર તેને તેના બદલે healthy-headroom દ્વારા સ્વીકારવામાં આવે છે. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ડિફૉલ્ટ `1`) | `src/shared/middleware/chatBodyAdmission.ts` | STRUCTURE અને BYTE **બંને** (`admitChatRequest`, જેમાં ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` બોડીઓનો સમાવેશ થાય છે) પર healthy-heap fast path (#10437) માટે મર્યાદિત વધારાની ક્ષમતા. આ મર્યાદા વિના, વ્યસ્ત પરંતુ સ્વસ્થ heap ધરાવતી દરેક વિનંતી કોઈ ઉચ્ચતમ મર્યાદા વિના એડમિશનને બાયપાસ કરતી હતી. healthy-heap પાથ મારફતે આટલા સમકાલીન leases સક્રિય થયા પછી, આગળની વ્યસ્ત વિનંતીઓ વાસ્તવિક heap દબાણ હેઠળ ઉપયોગમાં લેવાતા એ જ bounded-wait/shed પાથમાં જાય છે. `0` બાયપાસને સંપૂર્ણપણે અક્ષમ કરે છે. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | બોડી બાઇટ થ્રેશોલ્ડથી ઓછી હોય ત્યારે પણ ચેટ વિનંતીને હેવીવેઇટ તરીકે વર્ગીકૃત કરતી સંદેશાઓની સંખ્યા. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | બોડી બાઇટ થ્રેશોલ્ડથી ઓછી હોય ત્યારે પણ ચેટ વિનંતીને હેવીવેઇટ તરીકે વર્ગીકૃત કરતી ટૂલ્સની સંખ્યા. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | વિનંતીને હેવીવેઇટ તરીકે વર્ગીકૃત કરતો રૂઢિચુસ્ત સ્ટ્રિંગ-સાઇઝ ટોકન અંદાજ; આ એડમિશન-ખર્ચ માટેનું પ્રોક્સી છે, પ્રોવાઇડર બિલિંગ ટોકનાઇઝેશન નહીં. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (અક્ષમ) | `src/shared/middleware/chatBodyAdmission.ts` | વૈકલ્પિક opt-in ચેટ ઇતિહાસ મર્યાદા. ડિફૉલ્ટ રૂપે અક્ષમ: સંદેશાઓની સંખ્યા ડિપ્લોયમેન્ટ નીતિ છે, વિનંતીની સાર્વત્રિક લાક્ષણિકતા નહીં, અને અહીં મર્યાદા લાદવાથી કમ્પ્રેશન પાઇપલાઇન તેને સર્વિસ કરી શકાય તેવી બનાવે તે પહેલાં જ ટર્મિનલ `413` સાથે વાર્તાલાપ નકારવામાં આવે છે. Heapની વૃદ્ધિ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` અને heap-pressure shed દ્વારા મર્યાદિત થાય છે. કડક ઉચ્ચતમ મર્યાદાની જરૂર ધરાવતા મેમરી-મર્યાદિત ડિપ્લોયમેન્ટ્સ પર ધન મૂલ્ય સેટ કરો; ત્યારબાદ મર્યાદાથી વધુ હોય તો સંરચિત compact-required `413` મળે છે. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | મેમરીમાં સંપૂર્ણપણે બફર કરાયેલા નૉન-સ્ટ્રીમિંગ અપસ્ટ્રીમ પ્રતિસાદ માટેની કડક મર્યાદા. આ મર્યાદા પછી અપસ્ટ્રીમ રીડર રદ કરવામાં આવે છે અને heap સમાપ્ત થાય ત્યાં સુધી અમર્યાદિત સ્ટ્રિંગ વધતી રહે તેના બદલે વિનંતી ઝડપથી નિષ્ફળ જાય છે. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | અપસ્ટ્રીમ પ્રતિસાદ હેડર્સમાંથી ફોરવર્ડ કરવામાં આવતા મહત્તમ વાયર બાઇટ્સ. જ્યારે બજેટ ઓળંગાઈ જાય છે, ત્યારે સામાન્ય રિવર્સ-પ્રોક્સી હેડર મર્યાદાઓની અંદર રહેવા માટે ઓછી પ્રાથમિકતાવાળા હેડર્સ (દા.ત., કસ્ટમ `x-codex-*`, `x-oai-request-id`) કાઢી નાખવામાં આવે છે. મોટા પ્રતિસાદ હેડર કદના ખર્ચે વધુ અપસ્ટ્રીમ મેટાડેટા ફોરવર્ડ કરવા માટે આને વધુ મૂલ્ય પર સેટ કરો. | +| `CORS_ORIGIN` | _(સેટ કરેલું નથી)_ | `src/server/cors/origins.ts` | લેગસી સિંગલ-ઓરિજિન CORS અનુમતિસૂચિ. નવા ડિપ્લોયમેન્ટ્સ માટે `CORS_ALLOWED_ORIGINS` ને પ્રાધાન્ય આપો. CORS ફક્ત ક્રોસ-ઓરિજિન બ્રાઉઝર API ક્લાયન્ટ્સ માટે છે; તેના બદલે, પ્રમાણિત ડૅશબોર્ડ લેખન વિનંતીઓ સમાન-ઓરિજિન વિનંતીઓ ઉપરાંત સત્ર-બાઉન્ડ CSRF સુરક્ષાનો ઉપયોગ કરે છે. | +| `CORS_ALLOWED_ORIGINS` | _(સેટ કરેલું નથી)_ | `src/server/cors/origins.ts` | અલ્પવિરામથી અલગ કરેલી CORS અનુમતિસૂચિ. જ્યાં સુધી `CORS_ALLOW_ALL=true` સ્પષ્ટ રીતે ગોઠવેલું ન હોય ત્યાં સુધી કોઈ વાઇલ્ડકાર્ડ મોકલવામાં આવતું નથી. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | કોઈપણ બ્રાઉઝર `Origin` ને પ્રતિધ્વનિત કરવા માટે માત્ર ડેવલપમેન્ટ માટેનો બચાવ-માર્ગ. વહેંચાયેલા અથવા પ્રોડક્શન ડિપ્લોયમેન્ટ્સ પર તેને સક્ષમ કરશો નહીં. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | ખાનગી/લૂપબૅક/લિંક-લોકલ IP શ્રેણીઓને લક્ષ્ય બનાવતા પ્રોવાઇડર કૉલ્સને અવરોધો. ફક્ત અલગ રાખેલા પરીક્ષણ એન્વાયર્નમેન્ટ્સમાં જ અક્ષમ કરો. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | ખાનગી/સ્થાનિક નેટવર્ક્સ (localhost, 192.168.x.x, 10.x.x.x, વગેરે) તરફ નિર્દેશ કરતા પ્રોવાઇડર URLs ને મંજૂરી આપો. **સ્વયં-હોસ્ટ કરેલા પ્રોવાઇડર્સ માટે આવશ્યક છે** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). જ્યારે `false` હોય, ત્યારે ડૅશબોર્ડ સ્થાનિક URLs નું માન્યકરણ નકારે છે. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | સ્થાનિક/ખાનગી સરનામાંઓ (127.0.0.1, localhost, LAN, ખાનગી શ્રેણીઓ) પર પ્રોવાઇડર્સ ઉમેરવા/માન્ય કરવા દો — આ ફક્ત પ્રોવાઇડર માન્યકરણ પાથ સુધી મર્યાદિત છે. **ડિફૉલ્ટ `true`** (સ્થાનિક-પ્રથમ); ફક્ત જાહેર સરનામાંઓને મંજૂરી આપતો કડક અવરોધ લાગુ કરવા માટે `false` સેટ કરો. ક્લાઉડ-મેટાડેટા એન્ડપોઇન્ટ્સ (169.254.169.254, metadata.google.internal) કોઈપણ સંજોગોમાં અવરોધિત જ રહે છે. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` રૂટ્સને (ટ્રાન્સક્રિપ્શન્સ, સ્પીચ, અનુવાદો) localhost ની બહાર હોસ્ટ કરેલા OpenAI-સુસંગત પ્રોવાઇડર નોડનો ઉપયોગ કરવા દો. ડિફૉલ્ટ રૂપે બંધ — ઑડિયોને રિમોટ હોસ્ટ તરફ રૂટ કરવાથી ઇગ્રેસ ઓળખ બદલાય છે અને તે ઑપરેટરનો સ્પષ્ટ નિર્ણય હોવો આવશ્યક છે. લૂપબૅક/ખાનગી નોડ્સ (localhost, 127.0.0.1, 172.16-31.x) હંમેશાં માન્ય છે અને અપ્રભાવિત રહે છે. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | `POST /v1/rerank` ને (અને મેમરી એન્જિનના લૂપબૅક રીરૅન્ક પગલાને) localhost ની બહાર હોસ્ટ કરેલા OpenAI-સુસંગત પ્રોવાઇડર નોડનો ઉપયોગ કરવા દો — TEI, Infinity, vLLM વગેરે ચલાવતું LAN બૉક્સ અથવા Tailscale પિયર. ડિફૉલ્ટ રૂપે બંધ — રિમોટ હોસ્ટ તરફ રૂટ કરવાથી ઇગ્રેસ ઓળખ બદલાય છે અને તે ઑપરેટરનો સ્પષ્ટ નિર્ણય હોવો આવશ્યક છે. લૂપબૅક નોડ્સ (localhost, 127.0.0.1, 172.16-31.x) હંમેશાં માન્ય છે અને અપ્રભાવિત રહે છે. રિમોટ નોડ્સે પ્રોવાઇડરની આઉટબાઉન્ડ URL નીતિ (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) પણ પાસ કરવી આવશ્યક છે; ક્લાઉડ-મેટાડેટા હોસ્ટ્સ તરફ ક્યારેય રૂટ કરવામાં આવતું નથી. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC સક્ષમ હોય ત્યારે પાસવર્ડ લૉગિન અક્ષમ કરો, જેથી વપરાશકર્તાઓ ફક્ત OIDC Single Sign-On મારફતે પ્રમાણિત થઈ શકે. સાદું ઉપનામ `OIDC_DISABLE_PASSWORD_LOGIN` પણ સ્વીકારવામાં આવે છે; સમાન કી ધરાવતો Dashboard Feature Flag અગ્રતા મેળવે છે. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` નું સાદું ઉપનામ (#10889). | + +### સુરક્ષા સખ્તીકરણ ચેકલિસ્ટ ```bash -# પ્રોડક્શન સુરક્ષા માટેની ન્યૂનતમ આવશ્યકતાઓ: +# પ્રોડક્શન સુરક્ષા માટેની લઘુતમ આવશ્યકતાઓ: AUTH_COOKIE_SECURE=true # HTTPS આવશ્યક છે -REQUIRE_API_KEY=true # તમામ પ્રૉક્સી કૉલ્સને પ્રમાણિત કરો -ALLOW_API_KEY_REVEAL=false # UI માં કીઝ ક્યારેય જાહેર કરશો નહીં +REQUIRE_API_KEY=true # બધા પ્રોક્સી કૉલ્સને પ્રમાણિત કરો +ALLOW_API_KEY_REVEAL=false # UI માં કીઓ ક્યારેય જાહેર કરશો નહીં CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # 5 MB મર્યાદા ``` @@ -301,59 +301,66 @@ OmniRoute બે-સ્તરીય સુરક્ષા પ્રદાન ક ## 6. ટૂલ અને રાઉટિંગ નીતિઓ -| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM ટૂલ/ફંક્શન-કૉલિંગ ઍક્સેસને નિયંત્રિત કરે છે. `allowlist` = ફક્ત સૂચિબદ્ધ ટૂલ્સ, `denylist` = સૂચિબદ્ધ ટૂલ્સ સિવાયનાં બધાં, `disabled` = કોઈ પ્રતિબંધ નહીં. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | પેલોડમાં ફેરફાર કરવાના નિયમોની JSON ફાઇલનો પાથ (દરેક મોડેલ/પ્રોટોકોલ માટે અપસ્ટ્રીમ ફેરફારો). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | પેલોડ નિયમોની ફાઇલને હૉટ-રીલોડ કરવા માટેનો રીલોડ અંતરાલ (ms). ન્યૂનતમ `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | ઑપ્ટ-ઇન: પ્રોવાઇડર પ્રીફિક્સની આવશ્યકતા રાખવાને બદલે Claude Code ક્લાયન્ટ્સમાંથી મળતા પ્રીફિક્સ વિનાના `claude-*` મોડેલ IDને Claude Code OAuth એકાઉન્ટ મારફતે રાઉટ કરે છે. સ્પષ્ટ પ્રોવાઇડર પ્રીફિક્સને હજી પણ પ્રાથમિકતા મળે છે. Claude પ્રોવાઇડર પેજ પરના ડૅશબોર્ડ ટૉગલ દ્વારા પણ કૉન્ફિગર કરી શકાય છે. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | રાઉન્ડ-રોબિન કૉમ્બો માટે દરેક મોડેલની કન્કરન્સી મર્યાદા (#9100). રાઉન્ડ-રોબિન કૉમ્બો સેમાફોર દરેક મોડેલ દીઠ એકસાથે 3 વિનંતીઓ પર હાર્ડ-કૅપ્ડ હતો અને તેને ઓવરરાઇડ કરી શકાતો નહોતો, જેના કારણે વધુ કન્કરન્સીવાળો ટ્રાફિક આ મર્યાદા પાછળ ક્રમશઃ પ્રક્રિયા થતો હતો. `>= 1` તરીકે માન્ય કરવામાં આવે છે અને `<= 32` સુધી મર્યાદિત કરવામાં આવે છે. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | જોખમી ઑપ્ટ-ઇન, જે સીધી સિંગલ-મોડેલ વિનંતીઓ માટે OmniRouteની સ્થાનિક કૉન્ટેક્સ્ટ-વિન્ડો / મહત્તમ-ઇનપુટ-ટોકન તપાસને અવગણે છે. અપસ્ટ્રીમ પ્રોવાઇડર્સ હજી પણ તેમની વાસ્તવિક મર્યાદાઓ લાગુ કરે છે; પ્રોમ્પ્ટ કમ્પ્રેશન અને મોડેલની પોતાની આઉટપુટ-ટોકન મર્યાદા સક્રિય રહે છે. અસરકારક અગ્રતા Feature Flags DB ઓવરરાઇડ > એન્વાયર્નમેન્ટ વેરિએબલ > ડિફૉલ્ટ છે; રીસ્ટાર્ટ જરૂરી નથી. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(સેટ કરેલ નથી)_ | `open-sse/services/conversationTracker.ts` | વાર્તાલાપ ઇતિહાસ એકત્રિત કરવાનું બંધ કરવા માટે `1` સેટ કરો. `resolveConversationId()` SQLite વાંચે અથવા સંદેશ ઇતિહાસનું પાર્સિંગ કરે તે પહેલાં જ અનટ્રૅક્ડ પરિણામ પરત કરે છે, અને ક્લાયન્ટ દ્વારા આપવામાં આવેલા સેશન ID પણ આવરી લેવાય છે. રાઉટિંગ-સેશન હૅન્ડલિંગમાં કોઈ ફેરફાર થતો નથી અને હાલના રેકોર્ડ્સ કાઢી નાખવામાં આવતા નથી. આ એવા ડિપ્લોયમેન્ટ્સ માટે છે જે ડૅશબોર્ડના વાર્તાલાપ વ્યૂનો ઉપયોગ કરતા નથી અને ટર્ન ટેબલની વૃદ્ધિ અટકાવવા માગે છે. | +| વેરિએબલ | ડિફૉલ્ટ | સ્રોત ફાઇલ | વર્ણન | +| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM ટૂલ/ફંક્શન-કૉલિંગ ઍક્સેસને નિયંત્રિત કરે છે. `allowlist` = માત્ર સૂચિબદ્ધ ટૂલ્સ, `denylist` = સૂચિબદ્ધ ટૂલ્સ સિવાયનાં બધાં, `disabled` = કોઈ પ્રતિબંધ નહીં. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | પેલોડ મેનિપ્યુલેશન નિયમોની JSON ફાઇલનો પાથ (પ્રતિ-મૉડલ/પ્રોટોકૉલ અપસ્ટ્રીમ ફેરફારો). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | પેલોડ નિયમોની ફાઇલને હૉટ-રીલોડ કરવા માટેનો રીલોડ અંતરાલ (ms). ન્યૂનતમ `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | ઑપ્ટ-ઇન: પ્રોવાઇડર પ્રીફિક્સ આવશ્યક બનાવવાને બદલે Claude Code ક્લાયન્ટ્સમાંથી મળતા પ્રીફિક્સ વિનાના `claude-*` મૉડલ IDને Claude Code OAuth એકાઉન્ટ મારફતે રાઉટ કરો. સ્પષ્ટ પ્રોવાઇડર પ્રીફિક્સને હજુ પણ પ્રાથમિકતા મળે છે. Claude પ્રોવાઇડર પેજ પરના ડૅશબોર્ડ ટૉગલ દ્વારા પણ તેને કૉન્ફિગર કરી શકાય છે. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | રાઉન્ડ-રોબિન કોમ્બો (#9100) માટે પ્રતિ-મૉડલ સમકાલીનતા મર્યાદા. રાઉન્ડ-રોબિન કોમ્બો સેમાફોરને કોઈ ઓવરરાઇડ વિના પ્રતિ મૉડલ 3 સમકાલીન વિનંતીઓ સુધી હાર્ડ-કૅપ કરવામાં આવ્યું હતું, જેના કારણે વધુ સમકાલીનતાવાળો ટ્રાફિક તે મર્યાદાની પાછળ ક્રમિક રીતે પ્રક્રિયા થતો હતો. `>= 1` માટે માન્ય કરવામાં આવે છે અને `<= 32` સુધી મર્યાદિત કરવામાં આવે છે. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | જોખમી ઑપ્ટ-ઇન, જે સીધી એકલ-મૉડલ વિનંતીઓ માટે OmniRouteની સ્થાનિક કૉન્ટેક્સ્ટ-વિન્ડો / મહત્તમ-ઇનપુટ-ટોકન ચકાસણીને અવગણે છે. અપસ્ટ્રીમ પ્રોવાઇડર્સ હજી પણ તેમની વાસ્તવિક મર્યાદાઓ લાગુ કરે છે; પ્રૉમ્પ્ટ કમ્પ્રેશન અને મૉડલની પોતાની આઉટપુટ-ટોકન મર્યાદા સક્રિય રહે છે. અસરકારક અગ્રતાક્રમ છે: Feature Flags DB ઓવરરાઇડ > એન્વાયરમેન્ટ વેરિએબલ > ડિફૉલ્ટ; રીસ્ટાર્ટ જરૂરી નથી. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(સેટ નથી)_ | `open-sse/services/selfHostedEntry.ts` | ઇનલાઇન YAML `providers:` દસ્તાવેજ (RIC-738, D4). જ્યારે તે સેટ હોય (ભલે `strategy:` બ્લૉક સાથે હોય કે તેના વિના), ત્યારે `/v1/chat/completions` ક્લાઉડ પાઇપલાઇનને બદલે સેલ્ફ-હોસ્ટેડ એકીકૃત OpenAI-સુસંગત એન્ટ્રી તરફ વળે છે. સેટ ન હોય (ડિફૉલ્ટ): રૂટ સીધો હાલની ક્લાઉડ પાઇપલાઇન તરફ આગળ વધે છે. `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md` જુઓ. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(સેટ નથી)_ | `open-sse/services/selfHostedEntry.ts` | ઇનલાઇન env varને બદલે ફાઇલ પસંદ કરતાં ડિપ્લોયમેન્ટ્સ માટે, `OMNIROUTE_SELF_HOSTED_PROVIDERS` જેવો જ `providers:` દસ્તાવેજ ધરાવતી YAML ફાઇલનો પાથ. આ બેમાંથી કોઈપણ એક સેલ્ફ-હોસ્ટેડ એન્ટ્રીને સક્રિય કરે છે. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(સેટ નથી — ખુલ્લો રૂટ)_ | `open-sse/services/selfHostedEntry.ts` | એકીકૃત સેલ્ફ-હોસ્ટેડ એન્ટ્રી માટે વૈકલ્પિક શેર કરેલી API કી (D5 સ્કેફોલ્ડ, પ્રતિ-કી ક્વોટા સિસ્ટમ માટે અનામત). જ્યારે તે સેટ હોય, ત્યારે વિનંતીઓમાં `Authorization: Bearer ` સામેલ હોવું આવશ્યક છે. સેટ ન હોય: હાલની સેલ્ફ-હોસ્ટેડ સ્થાનિક-પ્રોવાઇડર પૅટર્ન (લૂપબૅક/વિશ્વસનીય-નેટવર્ક ડિપ્લોયમેન્ટ) અનુસાર રૂટ ખુલ્લો રહે છે. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(સેટ નથી)_ | `open-sse/services/routingStrategies.ts` | નિર્ધારિત રાઉટિંગ એન્જિન (M2/RIC-740, D3) માટે ઇનલાઇન YAML `strategy:` દસ્તાવેજ — બ્લૅકલિસ્ટ/વ્હાઇટલિસ્ટ, કૂલડાઉન બ્રેકર, ખર્ચ-પ્રાથમિકતા, લેટન્સી-અવેર, ફૉલબૅક ચેઇન. પ્રતિ-કી ધોરણે `OMNIROUTE_SELF_HOSTED_PROVIDERS`ની અંદર નેસ્ટ કરેલા ઇનલાઇન `strategy:` બ્લૉકને ઓવરરાઇડ કરે છે. `docs/routing/DETERMINISTIC_ROUTING.md` જુઓ. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(સેટ નથી)_ | `open-sse/services/routingStrategies.ts` | ઇનલાઇન env varને બદલે ફાઇલ પસંદ કરતાં ડિપ્લોયમેન્ટ્સ માટે, `OMNIROUTE_SELF_HOSTED_STRATEGY` જેવો જ `strategy:` દસ્તાવેજ ધરાવતી YAML ફાઇલનો પાથ. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(સેટ નથી)_ | `open-sse/services/conversationTracker.ts` | વાર્તાલાપ ઇતિહાસ એકત્રિત કરવાનું બંધ કરવા માટે `1` સેટ કરો. `resolveConversationId()` SQLite વાંચે અથવા સંદેશ ઇતિહાસનું વિશ્લેષણ કરે તે પહેલાં ટ્રૅક ન કરાયેલ પરિણામ પરત કરે છે, અને ક્લાયન્ટ દ્વારા આપવામાં આવેલા સત્ર ID પણ આવરી લેવાય છે. રૂટિંગ-સત્રનું સંચાલન યથાવત્ રહે છે અને હાલના રેકોર્ડ્સ કાઢી નાખવામાં આવતા નથી. આ એવા ડિપ્લોયમેન્ટ્સ માટે છે જે ડૅશબોર્ડના વાર્તાલાપ વ્યૂનો ઉપયોગ કરતા નથી અને ટર્ન ટેબલની વૃદ્ધિ રોકવા માંગે છે. | --- -## 7. URLs અને ક્લાઉડ સિંક - -| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | આંતરિક સિંક જૉબ્સ દ્વારા `/api/sync/cloud` કૉલ કરવા માટેનો સર્વર-સાઇડ URL. ઍપ જાહેર રીતે પ્રૉક્સી કરવામાં આવી હોય ત્યારે પણ તેને લૂપબૅક/કન્ટેનર URL તરીકે જ રાખો. | -| `CLOUD_URL` | _(ખાલી)_ | `src/lib/cloudSync.ts` | ક્લાઉડ રિલે એન્ડપૉઇન્ટ URL (પ્રીમિયમ સુવિધા). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ક્લાઉડ સિંક વિનંતીઓ માટે HTTP ટાઇમઆઉટ. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack બિલ્ડ કૉન્ફિગ | બિલ્ડ-સમય પ્રોફાઇલ (વિશેષાધિકાર ધરાવતા મોડ્યુલોને બંડલમાંથી ભૌતિક રીતે બાકાત રાખવા માટે `minimal` પર સેટ કરો). | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ સ્ટૅન્ડઅલોન આઉટપુટ_ | `scripts/build/colocate-standalone.mjs` | પોસ્ટ-બિલ્ડ સહ-સ્થાપન પગલા દ્વારા ઉપયોગમાં લેવાતી સ્ટૅન્ડઅલોન આઉટપુટ ડિરેક્ટરી માટે બિલ્ડ-સમય ઓવરરાઇડ. આ રનટાઇમ સેટિંગ નથી. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(ખાલી)_ | `src/lib/cloudSync.ts` | Cloud Sync પ્રતિસાદોની HMAC-SHA256 સહી ચકાસવા માટે વપરાતું શેર્ડ સિક્રેટ. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Cloud Sync એન્ડપૉઇન્ટને સ્થાનિક ક્રેડેન્શિયલ્સ ઓવરરાઇટ કરવાની મંજૂરી આપવા માટે `true` પર સેટ કરો. ડિફૉલ્ટ `false` છે. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | કોઈ સ્થાનિક સિક્રેટ કૉન્ફિગર ન હોય ત્યારે સહી વિનાના Cloud Sync પ્રતિસાદને નકારવા માટે `true` પર સેટ કરો (#13679). હાજર સહીની હંમેશાં ચકાસણી થાય છે — અને `OMNIROUTE_CLOUD_SYNC_SECRET` સેટ ન હોય ત્યારે તેને હંમેશાં નકારવામાં આવે છે — આ ફ્લૅગને ધ્યાનમાં લીધા વિના. v3.9માં ડિફૉલ્ટ અમલમાં મૂકાયેલ સ્થિતિમાં બદલાય છે. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | વપરાશકર્તાની પુષ્ટિ વિના v3.8.5ની એક-પગલાવાળી "બધું આયાત કરો" વર્તણૂક પર પાછા જવા માટે `true` પર સેટ કરો. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, સિંક | OAuth redirect_uri, Dashboard લિંક્સ અને જનરેટ થયેલા જાહેર URLs માટે જાહેર-મુખી URL. OAuth કૉલબૅક્સ અથવા જનરેટ થયેલી બ્રાઉઝર લિંક્સે કૅનોનિકલ રિવર્સ-પ્રૉક્સી હોસ્ટનો ઉપયોગ કરવો જરૂરી હોય ત્યારે તેને સ્થિર જાહેર URL પર સેટ કરો. | -| `NEXT_PUBLIC_CLOUD_URL` | _(ખાલી)_ | ક્લાયન્ટ-સાઇડ | `CLOUD_URL`નું ક્લાયન્ટ-સાઇડ મિરર. | -| `NEXT_PUBLIC_APP_URL` | _(સેટ કરેલ નથી)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL` માટે લેગસી ફૉલબૅક. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(સેટ કરેલ નથી)_ | જાહેર-ઓરિજિન રિઝોલ્વર, ઇમેજ URLs | જાહેર URL જનરેશન અને નૉન-Dashboard બ્રાઉઝર-ઓરિજિન માન્યતા માટે વપરાતું સર્વોચ્ચ-પ્રાથમિકતાવાળું બ્રાઉઝર-મુખી OmniRoute ઓરિજિન. OpenWebUI અથવા અન્ય કોઈ રિલે આંતરિક URL દ્વારા OmniRoute સુધી પહોંચે પરંતુ વપરાશકર્તાના બ્રાઉઝરે જનરેટ થયેલું મીડિયા LAN, ટનલ અથવા જાહેર ઓરિજિનમાંથી મેળવવું જરૂરી હોય ત્યારે આ સેટ કરો. `/v1`નો સમાવેશ **કરશો નહીં**. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(સેટ કરેલ નથી)_ | `open-sse/config/providerPluginManifestUrl.ts` | સાઇડકાર ક્લાયન્ટ્સને જાહેર કરવામાં આવતો ઍબ્સોલ્યુટ પ્રોવાઇડર પ્લગઇન મૅનિફેસ્ટ URL. સેટ ન હોય ત્યારે OmniRoute વિનંતીના ઓરિજિન અથવા HOST/PORT પરથી `/api/v1/provider-plugin-manifest` બનાવે છે. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | વિનંતીનું ઓરિજિન ઉપલબ્ધ ન હોય ત્યારે HOST/PORT પરથી પ્રોવાઇડર પ્લગઇન મૅનિફેસ્ટ URL બનાવવા માટે વપરાતો પ્રોટોકૉલ. સ્પષ્ટ `OMNIROUTE_PROVIDER_MANIFEST_URL` સેટ ન હોય ત્યારે TLS સમાપ્ત કરતા જાહેર પ્રૉક્સીની પાછળ તેને `https` પર સેટ કરો. | -| `OMNIROUTE_TRUST_PROXY` | _(સેટ કરેલ નથી)_ | `src/server/origin/publicOrigin.ts` | ફૉર્વર્ડ કરેલા જાહેર-ઓરિજિન હેડર્સ માટે વૈકલ્પિક ટ્રસ્ટ મોડ. સેટ ન હોય = સુરક્ષા નિર્ણયો માટે `Forwarded` / `X-Forwarded-*` પર વિશ્વાસ ન કરો. `true` / `loopback` ફક્ત ટોકન-સ્ટૅમ્પ કરેલા લૂપબૅક પ્રૉક્સીમાંથી આવેલા ફૉર્વર્ડેડ હોસ્ટ/પ્રોટો પર વિશ્વાસ કરે છે. `private` / `lan` ખાનગી-LAN પ્રૉક્સી પીઅર્સ પર પણ વિશ્વાસ કરે છે. પ્રોડક્શનમાં સ્પષ્ટ `NEXT_PUBLIC_BASE_URL`ને પ્રાધાન્ય આપો. | -| `KIE_CALLBACK_URL` | _(સેટ કરેલ નથી)_ | `open-sse/utils/kieTask.ts` | અસિંક્રોનસ kie.ai જૉબ્સ માટે જાહેર કૉલબૅક URL. `OMNIROUTE_KIE_CALLBACK_URL` અને `OMNIROUTE_PUBLIC_URL` પહેલાં સર્વોચ્ચ-પ્રાથમિકતાવાળું ઓવરરાઇડ. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(સેટ કરેલ નથી)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL`ની વૈકલ્પિક જોડણી. પ્રાથમિક વેરિએબલ સેટ ન હોય ત્યારે ફૉલબૅક તરીકે વપરાય છે. | -| `OMNIROUTE_PUBLIC_URL` | _(સેટ કરેલ નથી)_ | `open-sse/utils/kieTask.ts` | અસિંક કૉલબૅક URLs બનાવવા માટે વપરાતું જાહેર ઓરિજિન. kie.ai કૉલબૅક્સ માટે સૌથી નીચી પ્રાથમિકતાવાળું ફૉલબૅક; અન્ય રિલેઝ માટે સામાન્ય જાહેર URL તરીકે પણ વપરાય છે. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage પેજ દ્વારા વપરાતું CrofAI ક્વોટા લુકઅપ એન્ડપૉઇન્ટ. રિલેઝ / ટેસ્ટ ફિક્સચર્સ માટે ઓવરરાઇડ કરો. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage પેજ દ્વારા વપરાતું સત્તાવાર API-key-પ્રમાણિત OpenCode Go વપરાશ એન્ડપૉઇન્ટ. રિલેઝ / ટેસ્ટ ફિક્સચર્સ માટે ઓવરરાઇડ કરો. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | ક્લાયન્ટે ન મોકલેલા opencode-go/zen અપસ્ટ્રીમ વિનંતીઓ પર OpenCode CLI ઓળખ હેડર્સ (User-Agent, x-opencode-client/project, વિનંતી/સેશન UUIDs) સિન્થેસાઇઝ કરો, જેથી VPS ઇગ્રેસ પર Cloudflare તેમને સ્વીકારે (#6210/#5997). #10571થી ડિફૉલ્ટ રૂપે ચાલુ; `false`/`0`/`no`/`off` વડે બહાર નીકળો. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ચાલુ હોય અને પ્રતિ-પ્રોવાઇડર `_USER_AGENT` ઓવરરાઇડ સેટ ન હોય ત્યારે વપરાતું ડિફૉલ્ટ User-Agent. ફક્ત opencode એક્ઝિક્યુટર્સ પર લાગુ થાય છે. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ચાલુ હોય ત્યારે સિન્થેસાઇઝ કરેલા `x-opencode-client` હેડર માટેનું મૂલ્ય. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ચાલુ હોય ત્યારે સિન્થેસાઇઝ કરેલા `x-opencode-project` હેડર માટેનું મૂલ્ય. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | ક્વોટા સ્ક્રેપિંગ માટે વપરાતો Ollama Cloud સેટિંગ્સ URL. રિલેઝ / ટેસ્ટ ફિક્સચર્સ માટે ઓવરરાઇડ કરો. | -| `OLLAMA_USAGE_COOKIE` | _(સેટ કરેલ નથી)_ | `open-sse/services/usage.ts` | સેટિંગ્સ-પેજ ક્વોટા સ્ક્રેપિંગ માટે વપરાતી Ollama Cloud `__Secure-session` કુકી. સંવેદનશીલ; અનેક એકાઉન્ટ્સ કૉન્ફિગર કરેલા હોય ત્યારે પ્રતિ-કનેક્શન Dashboard ફીલ્ડને પ્રાધાન્ય આપો. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(સેટ કરેલ નથી)_ | `open-sse/services/usage.ts` | વૈકલ્પિક Ollama Cloud `__Secure-session` કુકી એન્વ વેરિએબલ. સંવેદનશીલ; અનેક એકાઉન્ટ્સ કૉન્ફિગર કરેલા હોય ત્યારે પ્રતિ-કનેક્શન Dashboard ફીલ્ડને પ્રાધાન્ય આપો. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(સેટ કરેલ નથી)_ | `open-sse/services/usage.ts` | ટૂંકા ઉપનામો પહેલાં વપરાતું વૈકલ્પિક Ollama Cloud `__Secure-session` કુકી એન્વ વેરિએબલ. સંવેદનશીલ; અનેક એકાઉન્ટ્સ કૉન્ફિગર કરેલા હોય ત્યારે પ્રતિ-કનેક્શન Dashboard ફીલ્ડને પ્રાધાન્ય આપો. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) વપરાશ મર્યાદાઓનું એન્ડપૉઇન્ટ. રિલેઝ / ટેસ્ટ ફિક્સચર્સ માટે ઓવરરાઇડ કરો. | +## 7. URLs અને Cloud Sync + +| વેરિએબલ | ડિફૉલ્ટ | સ્રોત ફાઇલ | વર્ણન | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | આંતરિક સિંક કાર્યો દ્વારા `/api/sync/cloud`ને કૉલ કરવા માટેનું સર્વર-સાઇડ URL. ઍપને સાર્વજનિક રીતે પ્રૉક્સી કરવામાં આવી હોય ત્યારે પણ આને લૂપબૅક/કન્ટેનર URL તરીકે રાખો. | +| `CLOUD_URL` | _(ખાલી)_ | `src/lib/cloudSync.ts` | ક્લાઉડ રિલે એન્ડપૉઇન્ટ URL (પ્રીમિયમ સુવિધા). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ક્લાઉડ સિંક વિનંતીઓ માટે HTTP ટાઇમઆઉટ. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack બિલ્ડ કૉન્ફિગ | બિલ્ડ-ટાઇમ પ્રોફાઇલ (બંડલમાંથી વિશેષાધિકાર ધરાવતા મોડ્યુલોને ભૌતિક રીતે બાકાત રાખવા માટે `minimal` પર સેટ કરો). | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ સ્ટૅન્ડઅલોન આઉટપુટ_ | `scripts/build/colocate-standalone.mjs` | બિલ્ડ પછીના કોલોકેશન પગલા દ્વારા ઉપયોગમાં લેવાતી સ્ટૅન્ડઅલોન આઉટપુટ ડિરેક્ટરી માટેનું બિલ્ડ-ટાઇમ ઓવરરાઇડ. આ રનટાઇમ સેટિંગ નથી. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(ખાલી)_ | `src/lib/cloudSync.ts` | Cloud Sync પ્રતિસાદોની HMAC-SHA256 સહી ચકાસવા માટે વપરાતું શેર્ડ સિક્રેટ. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Cloud Sync એન્ડપૉઇન્ટને સ્થાનિક ક્રેડેન્શિયલ્સ ઓવરરાઇટ કરવાની મંજૂરી આપવા માટે `true` પર સેટ કરો. ડિફૉલ્ટ `false` છે. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | કોઈ સ્થાનિક સિક્રેટ કૉન્ફિગર ન હોય ત્યારે સહી વગરના Cloud Sync પ્રતિસાદને નકારવા માટે `true` પર સેટ કરો (#13679). હાજર હોય તેવી સહી હંમેશાં ચકાસવામાં આવે છે — અને `OMNIROUTE_CLOUD_SYNC_SECRET` સેટ ન હોય ત્યારે હંમેશાં નકારવામાં આવે છે — આ ફ્લૅગથી સ્વતંત્ર રીતે. v3.9માં ડિફૉલ્ટ બદલીને અમલીકરણ સક્રિય કરવામાં આવશે. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | વપરાશકર્તાની પુષ્ટિ વિના v3.8.5ની એક-પગલાની "બધું ઇમ્પોર્ટ કરો" વર્તણૂક પર પાછા જવા માટે `true` પર સેટ કરો. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, સિંક | OAuth redirect_uri, Dashboard લિંક્સ અને જનરેટ કરેલા સાર્વજનિક URLs માટેનું જાહેર-ફેસિંગ URL. જ્યારે OAuth કૉલબૅક્સ અથવા જનરેટ કરેલી બ્રાઉઝર લિંક્સે કૅનોનિકલ રિવર્સ-પ્રૉક્સી હોસ્ટનો ઉપયોગ કરવો જરૂરી હોય ત્યારે આને સ્થિર સાર્વજનિક URL પર સેટ કરો. | +| `NEXT_PUBLIC_CLOUD_URL` | _(ખાલી)_ | ક્લાયન્ટ-સાઇડ | `CLOUD_URL`નું ક્લાયન્ટ-સાઇડ મિરર. | +| `NEXT_PUBLIC_APP_URL` | _(સેટ કરેલ નથી)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL` માટે લેગસી ફૉલબૅક. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(સેટ કરેલ નથી)_ | જાહેર ઑરિજિન રિઝૉલ્વર, ઇમેજ URLs | જાહેર URL જનરેશન અને નૉન-ડૅશબોર્ડ બ્રાઉઝર-ઑરિજિન ચકાસણી માટે ઉપયોગમાં લેવાતું સર્વોચ્ચ-પ્રાથમિકતાવાળું બ્રાઉઝર-ફેસિંગ OmniRoute ઑરિજિન. જ્યારે OpenWebUI અથવા અન્ય રિલે આંતરિક URL દ્વારા OmniRoute સુધી પહોંચે, પરંતુ વપરાશકર્તાના બ્રાઉઝરે જનરેટ થયેલ મીડિયા LAN, ટનલ અથવા જાહેર ઑરિજિન પરથી મેળવવું આવશ્યક હોય ત્યારે આને સેટ કરો. `/v1` સામેલ **કરશો નહીં**. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(સેટ કરેલ નથી)_ | `open-sse/config/providerPluginManifestUrl.ts` | સાઇડકાર ક્લાયન્ટ્સને જાહેર કરવામાં આવતું સંપૂર્ણ પ્રોવાઇડર પ્લગઇન મેનિફેસ્ટ URL. સેટ ન હોય ત્યારે OmniRoute રિક્વેસ્ટ ઑરિજિન અથવા HOST/PORT પરથી `/api/v1/provider-plugin-manifest` બનાવે છે. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | રિક્વેસ્ટ ઑરિજિન વિના HOST/PORT પરથી પ્રોવાઇડર પ્લગઇન મેનિફેસ્ટ URL બનાવતી વખતે ઉપયોગમાં લેવાતો પ્રોટોકૉલ. જ્યારે કોઈ સ્પષ્ટ `OMNIROUTE_PROVIDER_MANIFEST_URL` સેટ ન હોય ત્યારે TLS-ટર્મિનેટિંગ જાહેર પ્રૉક્સીની પાછળ આને `https` પર સેટ કરો. | +| `OMNIROUTE_TRUST_PROXY` | _(સેટ કરેલ નથી)_ | `src/server/origin/publicOrigin.ts` | ફૉર્વર્ડ કરેલા જાહેર-ઑરિજિન હેડર્સ માટે વૈકલ્પિક ટ્રસ્ટ મોડ. સેટ ન હોય = સુરક્ષાસંબંધી નિર્ણયો માટે `Forwarded` / `X-Forwarded-*` પર વિશ્વાસ ન કરો. `true` / `loopback` માત્ર ટોકન-સ્ટૅમ્પ કરેલ લૂપબૅક પ્રૉક્સીમાંથી ફૉર્વર્ડ થયેલ હોસ્ટ/પ્રોટો પર વિશ્વાસ કરે છે. `private` / `lan` ખાનગી-LAN પ્રૉક્સી પીઅર્સ પર પણ વિશ્વાસ કરે છે. પ્રોડક્શનમાં સ્પષ્ટ `NEXT_PUBLIC_BASE_URL`ને પ્રાથમિકતા આપો. | +| `KIE_CALLBACK_URL` | _(સેટ કરેલ નથી)_ | `open-sse/utils/kieTask.ts` | અસિંક્રોનસ kie.ai જૉબ્સ માટે જાહેર કૉલબૅક URL. `OMNIROUTE_KIE_CALLBACK_URL` અને `OMNIROUTE_PUBLIC_URL` પહેલાંનું સર્વોચ્ચ-પ્રાથમિકતાવાળું ઓવરરાઇડ. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(સેટ કરેલ નથી)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL`નું વૈકલ્પિક નામ. પ્રાથમિક વેરિએબલ સેટ ન હોય ત્યારે ફૉલબૅક તરીકે વપરાય છે. | +| `OMNIROUTE_PUBLIC_URL` | _(સેટ કરેલ નથી)_ | `open-sse/utils/kieTask.ts` | અસિંક્રોનસ કૉલબૅક URLs બનાવવા માટે ઉપયોગમાં લેવાતું જાહેર ઑરિજિન. kie.ai કૉલબૅક્સ માટે સૌથી ઓછી પ્રાથમિકતાવાળું ફૉલબૅક; અન્ય રિલે માટે સામાન્ય જાહેર URL તરીકે પણ વપરાય છે. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage પેજ દ્વારા ઉપયોગમાં લેવાતું CrofAI ક્વોટા લુકઅપ એન્ડપૉઇન્ટ. રિલે / ટેસ્ટ ફિક્સચર્સ માટે ઓવરરાઇડ કરો. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage પેજ દ્વારા ઉપયોગમાં લેવાતું અધિકૃત API-કી-પ્રમાણિત OpenCode Go યુસેજ એન્ડપૉઇન્ટ. રિલે / ટેસ્ટ ફિક્સચર્સ માટે ઓવરરાઇડ કરો. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | ક્લાયન્ટે ન મોકલેલા opencode-go/zen અપસ્ટ્રીમ રિક્વેસ્ટ્સ પર OpenCode CLI આઇડેન્ટિટી હેડર્સ (User-Agent, x-opencode-client/project, રિક્વેસ્ટ/સેશન UUIDs) બનાવો, જેથી VPS ઇગ્રેસ પર Cloudflare તેમને સ્વીકારે (#6210/#5997). #10571થી ડિફૉલ્ટ રૂપે ચાલુ છે; `false`/`0`/`no`/`off` વડે બંધ કરો. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | જ્યારે `OPENCODE_SYNTHESIZE_CLI_HEADERS` ચાલુ હોય અને દરેક પ્રોવાઇડર માટેનું `_USER_AGENT` ઓવરરાઇડ સેટ ન હોય ત્યારે ઉપયોગમાં લેવાતું ડિફૉલ્ટ User-Agent. ફક્ત opencode એક્ઝિક્યુટર્સ પર લાગુ થાય છે. અપસ્ટ્રીમ દ્વારા ગેટ કરાયેલી કી વિનાની રિક્વેસ્ટ પર, `opencode/= 1.17>` ન ધરાવતું કૉન્ફિગર કરેલ મૂલ્ય નકારવાને બદલે આ ડિફૉલ્ટથી બદલવામાં આવે છે. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ચાલુ હોય ત્યારે બનાવવામાં આવતા `x-opencode-client` હેડર માટેનું મૂલ્ય. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` ચાલુ હોય ત્યારે સંશ્લેષિત `x-opencode-project` હેડર માટેનું મૂલ્ય. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(સેટ નથી)_ | `open-sse/executors/opencodeFreeTierContract.ts` | કી વિનાની OpenCode વિનંતીઓના બૉડીને (સ્ટ્રીમિંગ ફ્લૅગ અને ટૂલ સૂચિ) સમાયોજિત કરવાનું બંધ કરવા માટે `off` પર સેટ કરો. હેડર્સ હજી પણ લાગુ કરવામાં આવે છે. દરેક વિનંતી વખતે વાંચવામાં આવે છે, તેથી ફેરફાર તરત જ અમલમાં આવે છે. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(સેટ નથી)_ | `open-sse/executors/opencodeFreeTierContract.ts` | જ્યારે તે મોડેલ માટે હજુ સુધી કંઈ અવલોકિત ન થયું હોય, ત્યારે કોઈ ટૂલ ન ધરાવતી કી વિનાની OpenCode વિનંતીમાં જાહેર કરવા માટેના અલ્પવિરામથી અલગ કરેલા ટૂલનાં નામ. ખાલી હોય તો એક પ્લેસહોલ્ડર પર પાછું ફરે છે, જેને કૉલ ન કરવા માટે મોડેલને જણાવવામાં આવે છે. વધુમાં વધુ 32 એન્ટ્રીઓ, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; અમાન્ય એન્ટ્રીઓ અવગણવામાં આવે છે. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | ક્વોટા સ્ક્રેપિંગ માટે વપરાતું Ollama Cloud સેટિંગ્સ URL. રિલે / ટેસ્ટ ફિક્સ્ચર માટે ઓવરરાઇડ કરો. | +| `OLLAMA_USAGE_COOKIE` | _(સેટ નથી)_ | `open-sse/services/usage.ts` | સેટિંગ્સ પેજ પરથી ક્વોટા સ્ક્રેપિંગ માટે વપરાતી Ollama Cloud `__Secure-session` કૂકી. સંવેદનશીલ; બહુવિધ એકાઉન્ટ ગોઠવેલાં હોય ત્યારે દરેક કનેક્શન માટેના Dashboard ફીલ્ડને પ્રાધાન્ય આપો. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(સેટ નથી)_ | `open-sse/services/usage.ts` | વૈકલ્પિક Ollama Cloud `__Secure-session` કૂકી env var. સંવેદનશીલ; બહુવિધ એકાઉન્ટ ગોઠવેલાં હોય ત્યારે દરેક કનેક્શન માટેના Dashboard ફીલ્ડને પ્રાધાન્ય આપો. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(સેટ નથી)_ | `open-sse/services/usage.ts` | ટૂંકા ઉપનામો પહેલાં વપરાતી વૈકલ્પિક Ollama Cloud `__Secure-session` કૂકી env var. સંવેદનશીલ; બહુવિધ એકાઉન્ટ ગોઠવેલાં હોય ત્યારે દરેક કનેક્શન માટેના Dashboard ફીલ્ડને પ્રાધાન્ય આપો. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) વપરાશ મર્યાદાઓનું એન્ડપોઇન્ટ. રિલે / ટેસ્ટ ફિક્સ્ચર માટે ઓવરરાઇડ કરો. | > [!IMPORTANT] -> રિવર્સ પ્રોક્સી (nginx, Caddy) પાછળ ડિપ્લોય કરતી વખતે, જ્યારે OAuth callbacks અથવા જનરેટ કરેલી સાર્વજનિક લિંક્સ માટે તે hostname નો ઉપયોગ કરવો જરૂરી હોય ત્યારે `NEXT_PUBLIC_BASE_URL` ને તમારા સ્થિર સાર્વજનિક URL (દા.ત., `https://omniroute.example.com`) પર સેટ કરો. આના વિના, redirect_uri મેળ નહીં ખાય તેથી OAuth callbacks નિષ્ફળ થઈ શકે છે અને જનરેટ કરેલી સાર્વજનિક લિંક્સ આંતરિક container origin તરફ નિર્દેશ કરી શકે છે. +> રિવર્સ પ્રૉક્સી (nginx, Caddy) પાછળ ડિપ્લોય કરતી વખતે, OAuth કૉલબૅક્સ અથવા જનરેટ કરેલી સાર્વજનિક લિંક્સે તે હોસ્ટનામનો ઉપયોગ કરવો જરૂરી હોય તો `NEXT_PUBLIC_BASE_URL`ને તમારા સ્થિર સાર્વજનિક URL (દા.ત., `https://omniroute.example.com`) પર સેટ કરો. આ વિના, OAuth કૉલબૅક્સ નિષ્ફળ થઈ શકે છે કારણ કે redirect_uri મેળ નહીં ખાય અને જનરેટ કરેલી સાર્વજનિક લિંક્સ આંતરિક કન્ટેનર ઓરિજિન તરફ નિર્દેશ કરી શકે છે. > -> server-to-server jobs માટે `BASE_URL` ને આંતરિક loopback/container URL તરીકે જ રાખો. credentials ધરાવતા આંતરિક self-fetches માટે browser `Origin` અથવા સાર્વજનિક hostname નો ઉપયોગ કરશો નહીં. +> સર્વર-થી-સર્વર જોબ્સ માટે `BASE_URL`ને આંતરિક લૂપબૅક/કન્ટેનર URL તરીકે રાખો. ક્રેડેન્શિયલ ધરાવતા આંતરિક સ્વયં-ફેચ માટે બ્રાઉઝર `Origin` અથવા સાર્વજનિક હોસ્ટનામનો ઉપયોગ કરશો નહીં. > -> પ્રમાણિત dashboard writes માટે સ્થિર સાર્વજનિક base URL જરૂરી નથી: dashboard, session-bound CSRF token સાથે same-origin unsafe requests મોકલે છે. OmniRoute હજી પણ non-dashboard browser integrations માટે public-origin validation ને કેન્દ્રિત કરે છે: સ્પષ્ટ public URL env vars પર પહેલા વિશ્વાસ કરવામાં આવે છે; જ્યાં સુધી `OMNIROUTE_TRUST_PROXY` સક્ષમ ન હોય અને તાત્કાલિક proxy peer ને વિશ્વસનીય તરીકે token-stamped ન કરવામાં આવ્યું હોય, ત્યાં સુધી કાચા `Forwarded` / `X-Forwarded-*` headers ને અવગણવામાં આવે છે. same-origin dashboard requests ને ઠીક કરવા માટે CORS settings નો ઉપયોગ કરશો નહીં; CORS માત્ર cross-origin browser clients માટે છે. +> પ્રમાણિત Dashboard રાઇટ્સ માટે સ્થિર સાર્વજનિક બેઝ URL જરૂરી નથી: Dashboard સેશન સાથે બંધાયેલા CSRF ટોકન વડે સમાન-ઓરિજિનની અસુરક્ષિત વિનંતીઓ મોકલે છે. OmniRoute હજી પણ Dashboard સિવાયનાં બ્રાઉઝર ઇન્ટિગ્રેશન્સ માટે સાર્વજનિક-ઓરિજિન માન્યતાને કેન્દ્રીકૃત કરે છે: સ્પષ્ટ સાર્વજનિક URL env vars પર પહેલાં વિશ્વાસ કરવામાં આવે છે; `OMNIROUTE_TRUST_PROXY` સક્ષમ ન હોય અને તાત્કાલિક પ્રૉક્સી પીઅર પર વિશ્વસનીય હોવાનો ટોકન-સ્ટૅમ્પ ન હોય ત્યાં સુધી કાચા `Forwarded` / `X-Forwarded-*` હેડર્સ અવગણવામાં આવે છે. સમાન-ઓરિજિન Dashboard વિનંતીઓને ઠીક કરવા માટે CORS સેટિંગ્સનો ઉપયોગ કરશો નહીં; CORS માત્ર ક્રોસ-ઓરિજિન બ્રાઉઝર ક્લાયન્ટ્સ માટે છે. --- @@ -586,49 +593,50 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude --- -## 11. OAuth પ્રદાતા ઓળખપત્રો - -**localhost ડેવલપમેન્ટ** માટે બિલ્ટ-ઇન ઓળખપત્રો. રિમોટ ડિપ્લોયમેન્ટ માટે, દરેક પ્રદાતાના ડેવલપર કન્સોલમાં તમારા પોતાના ઓળખપત્રો રજિસ્ટર કરો. - -| વેરિએબલ | પ્રદાતા | નોંધો | -| --------------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | સાર્વજનિક ક્લાયન્ટ — કોઈ સિક્રેટની જરૂર નથી. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | રીડાયરેક્ટ URI ઓવરરાઇડ કરો. ડિફૉલ્ટ: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | સાર્વજનિક ક્લાયન્ટ. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | મેળ ખાતું `_SECRET` જરૂરી છે. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | સાર્વજનિક ક્લાયન્ટ. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | મેળ ખાતું `_SECRET` જરૂરી છે. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | સાર્વજનિક ક્લાયન્ટ. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilotના OAuth ક્લાયન્ટ ID માટે વૈકલ્પિક ઓવરરાઇડ. સેટ ન હોય ત્યારે `GITHUB_OAUTH_CLIENT_ID`ના સાર્વજનિક ડિફૉલ્ટનો ઉપયોગ કરે છે. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | જ્યારે કનેક્શન-દીઠ કોઈ ક્રેડેન્શિયલ ઉપલબ્ધ ન હોય ત્યારે `open-sse/executors/devin-cli.ts` દ્વારા ઉપયોગમાં લેવાતી API કી ફૉલબૅક. વૈકલ્પિક. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI બાઇનરી (`devin`) માટે કસ્ટમ પાથ. `open-sse/executors/devin-cli.ts` દ્વારા રિઝૉલ્વ કરવામાં આવે છે. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo માટે OAuth ક્લાયન્ટ ID. `https://gitlab.com/-/profile/applications` પર રીડાયરેક્ટ URI `/callback` અને સ્કોપ્સ `api, read_user, openid, profile, email` સાથે ઍપ રજિસ્ટર કરો. `GITLAB_OAUTH_CLIENT_ID`નો ફૉલબૅક તરીકે ઉપયોગ કરે છે. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo માટે OAuth ક્લાયન્ટ સિક્રેટ. વૈકલ્પિક — PKCE ફ્લોને સિક્રેટની જરૂર નથી. `GITLAB_OAUTH_CLIENT_SECRET`નો ફૉલબૅક તરીકે ઉપયોગ કરે છે. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab બેઝ URL ઓવરરાઇડ કરો (સ્વ-હોસ્ટેડ GitLab). ડિફૉલ્ટ `https://gitlab.com` છે. `GITLAB_BASE_URL`નો ફૉલબૅક તરીકે ઉપયોગ કરે છે. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` માટે લેગસી ફૉલબૅક. `_DUO_` વેરિઅન્ટ સેટ ન હોય ત્યારે ઉપયોગમાં લેવાય છે. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` દ્વારા ઉપયોગમાં લેવાતો `GITLAB_DUO_OAUTH_CLIENT_ID` માટેનો લેગસી ફૉલબૅક. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` દ્વારા ઉપયોગમાં લેવાતો `GITLAB_DUO_OAUTH_CLIENT_SECRET` માટેનો લેગસી ફૉલબૅક. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth સક્ષમ કરવા માટે સેટ કરો. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | સીધી API કી ફૉલબૅક (OAuthને બાયપાસ કરે છે). | -| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI માટે વર્કસ્પેસ ID. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE` માટે ઉપનામ. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI કૉન્ફિગ ડિરેક્ટરી ઓવરરાઇડ કરો (અલગ PAT સેશન, બ્રાઉઝર લૉગિનને ઓવરરાઇટ કરવાનું ટાળે છે). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat` પર `validated` તરીકે મોકલવાનો ફ્રન્ટએન્ડ `tk` ટોકન. જ્યારે Blackbox ટોકન મેચિંગ લાગુ કરે ત્યારે જરૂરી; અન્યથા OmniRoute રેન્ડમ UUIDનો ફૉલબૅક તરીકે ઉપયોગ કરે છે. ઇશ્યૂ #2252 જુઓ. | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge ગાર્ડરેલ | નોન-Anthropic વિઝન-બ્રિજ કૉલ્સ માટે OpenAI-સુસંગત બેઝ URL. લેગસી OpenAI URL env અથવા api.openai.com ડિફૉલ્ટ તરીકે વપરાય છે. તેને OmniRouteના `/v1` સેલ્ફ-લૂપ અથવા કોઈપણ OpenAI-સુસંગત એન્ડપોઇન્ટ (Gemini OpenAI-સુસંગત, OpenRouter) તરફ નિર્દેશિત કરો. ઇશ્યૂ #2232. જ્યારે URL OmniRouteનું પોતાનું `/v1` હોય, ત્યારે વર્ણન સબ-રિક્વેસ્ટ `x-omniroute-admission-bypass: internal` મોકલે છે અને રિઝૉલ્વ કરેલા સેલ્ફ-લૂપ ક્રેડેન્શિયલ (લોકલ મોડમાં `sk_omniroute` સેન્ટિનલ અથવા `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) વડે ઑથેન્ટિકેટ કરે છે, જેથી `REQUIRE_API_KEY=true` ડિપ્લોયમેન્ટ્સ કાર્ય કરે. | -| `VISION_BRIDGE_API_KEY` | Vision Bridge ગાર્ડરેલ | ઉપરના URL માટે API કી. નોન-Anthropic વિઝન-બ્રિજ કૉલ્સ માટે પ્રદાતા-દીઠ OpenAI / Google env વેરિએબલ્સને ઓવરરાઇડ કરે છે. Anthropic મોડલ્સ તેમના સમર્પિત Anthropic કી પાથનો ઉપયોગ ચાલુ રાખે છે. ઇશ્યૂ #2232. | +## 11. OAuth પ્રદાતા ક્રેડેન્શિયલ્સ + +**localhost ડેવલપમેન્ટ** માટે બિલ્ટ-ઇન ક્રેડેન્શિયલ્સ. રિમોટ ડિપ્લોયમેન્ટ માટે, દરેક પ્રદાતાના ડેવલપર કન્સોલમાં તમારા પોતાના ક્રેડેન્શિયલ્સ રજિસ્ટર કરો. + +| વેરિએબલ | પ્રદાતા | નોંધો | +| --------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | સાર્વજનિક ક્લાયન્ટ — કોઈ સિક્રેટની જરૂર નથી. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | રીડાયરેક્ટ URI ઓવરરાઇડ કરે છે. ડિફૉલ્ટ: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | સાર્વજનિક ક્લાયન્ટ. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | મેળ ખાતું `_SECRET` આવશ્યક છે. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | સાર્વજનિક ક્લાયન્ટ. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | મેળ ખાતું `_SECRET` આવશ્યક છે. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | સાર્વજનિક ક્લાયન્ટ. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilotના OAuth ક્લાયન્ટ ID માટે વૈકલ્પિક ઓવરરાઇડ. જો સેટ ન હોય, તો `GITHUB_OAUTH_CLIENT_ID`ના સાર્વજનિક ડિફૉલ્ટનો ઉપયોગ કરે છે. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | `Copilot-Integration-Id` અને `Editor-Plugin-Version` હેડર્સમાં મોકલાતી GitHub Copilot ક્લાયન્ટ ઇન્ટિગ્રેશન ID માટે વૈકલ્પિક ઓવરરાઇડ. ડિફૉલ્ટ `copilot-developer-cli` છે. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | જ્યારે પ્રતિ-કનેક્શન ક્રેડેન્શિયલ ઉપલબ્ધ ન હોય ત્યારે `open-sse/executors/devin-cli.ts` દ્વારા ઉપયોગમાં લેવાતી API કી ફૉલબૅક. વૈકલ્પિક. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI બાઇનરી (`devin`) માટે કસ્ટમ પાથ. `open-sse/executors/devin-cli.ts` દ્વારા રિઝોલ્વ કરવામાં આવે છે. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo માટે OAuth ક્લાયન્ટ ID. `https://gitlab.com/-/profile/applications` પર રીડાયરેક્ટ URI `/callback` અને સ્કોપ્સ `api, read_user, openid, profile, email` સાથે ઍપ રજિસ્ટર કરો. ફૉલબૅક તરીકે `GITLAB_OAUTH_CLIENT_ID`નો ઉપયોગ કરે છે. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo માટે OAuth ક્લાયન્ટ સિક્રેટ. વૈકલ્પિક — PKCE ફ્લો માટે સિક્રેટની જરૂર નથી. ફૉલબૅક તરીકે `GITLAB_OAUTH_CLIENT_SECRET`નો ઉપયોગ કરે છે. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab બેઝ URL (સેલ્ફ-હોસ્ટેડ GitLab) ઓવરરાઇડ કરે છે. ડિફૉલ્ટ `https://gitlab.com` છે. ફૉલબૅક તરીકે `GITLAB_BASE_URL`નો ઉપયોગ કરે છે. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` માટે લેગસી ફૉલબૅક. જ્યારે `_DUO_` વેરિઅન્ટ સેટ ન હોય ત્યારે ઉપયોગમાં લેવાય છે. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` દ્વારા ઉપયોગમાં લેવાતા `GITLAB_DUO_OAUTH_CLIENT_ID` માટે લેગસી ફૉલબૅક. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` દ્વારા ઉપયોગમાં લેવાતા `GITLAB_DUO_OAUTH_CLIENT_SECRET` માટે લેગસી ફૉલબૅક. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth સક્ષમ કરવા માટે સેટ કરો. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | ડાયરેક્ટ API કી ફૉલબૅક (OAuthને બાયપાસ કરે છે). | +| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI માટે વર્કસ્પેસ ID. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE` માટે ઉપનામ. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI કૉન્ફિગ ડિરેક્ટરીને ઓવરરાઇડ કરે છે (અલગ કરેલું PAT સત્ર, બ્રાઉઝર લૉગિનને ઓવરરાઇટ કરવાનું ટાળે છે). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat` પર `validated` તરીકે મોકલવા માટેનો ફ્રન્ટએન્ડ `tk` ટોકન. જ્યારે Blackbox ટોકન મેચિંગ લાગુ કરે ત્યારે આવશ્યક છે; અન્યથા OmniRoute રેન્ડમ UUIDનો ઉપયોગ કરે છે. સમસ્યા #2252 જુઓ. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge ગાર્ડરેલ | નૉન-Anthropic વિઝન-બ્રિજ કૉલ્સ માટે OpenAI-સુસંગત બેઝ URL. ડિફૉલ્ટ રૂપે લેગસી OpenAI URL એન્વાયર્નમેન્ટ વેરિએબલ અથવા api.openai.comનો ઉપયોગ થાય છે. તેને OmniRouteના `/v1` સેલ્ફ-લૂપ અથવા કોઈપણ OpenAI-સુસંગત એન્ડપૉઇન્ટ (Gemini OpenAI-સુસંગત, OpenRouter) તરફ નિર્દેશિત કરો. સમસ્યા #2232. જ્યારે URL OmniRouteનું પોતાનું `/v1` હોય, ત્યારે વર્ણન સબ-રિક્વેસ્ટ `x-omniroute-admission-bypass: internal` મોકલે છે અને રિઝૉલ્વ કરેલા સેલ્ફ-લૂપ ક્રેડેન્શિયલ (લોકલ મોડમાં `sk_omniroute` સેન્ટિનલ અથવા `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) વડે પ્રમાણીકરણ કરે છે, જેથી `REQUIRE_API_KEY=true` ડિપ્લોયમેન્ટ કાર્ય કરે. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge ગાર્ડરેલ | ઉપરના URL માટેની API કી. નૉન-Anthropic વિઝન-બ્રિજ કૉલ્સ માટે પ્રતિ-પ્રદાતા OpenAI / Google એન્વાયર્નમેન્ટ વેરિએબલ્સને ઓવરરાઇડ કરે છે. Anthropic મોડલ્સ તેમની સમર્પિત Anthropic કી પાથ જાળવી રાખે છે. સમસ્યા #2232. | > [!WARNING] > > 1. [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) પર જાઓ > 2. OAuth 2.0 Client ID બનાવો (પ્રકાર: "વેબ એપ્લિકેશન") -> 3. અધિકૃત રીડાયરેક્ટ URI તરીકે તમારા સર્વરનું URL ઉમેરો -> 4. `.env` માં ક્રેડેન્શિયલના મૂલ્યો બદલો. +> 3. તમારા સર્વર URLને અધિકૃત રીડાયરેક્ટ URI તરીકે ઉમેરો +> 4. `.env`માં ક્રેડેન્શિયલ મૂલ્યો બદલો. --- @@ -731,9 +739,9 @@ Docker અથવા હેડલેસ ડિપ્લોયમેન્ટ્ ## 15. ટાઇમઆઉટ સેટિંગ્સ -તમામ મૂલ્યો **મિલિસેકન્ડમાં** છે. કેન્દ્રીકૃત નિરાકરણ `src/shared/utils/runtimeTimeouts.ts`માં છે. +તમામ મૂલ્યો **મિલિસેકન્ડમાં** છે. કેન્દ્રિત રિઝોલ્યુશન `src/shared/utils/runtimeTimeouts.ts` માં છે. -### ટાઇમઆઉટ અધિક્રમ +### ટાઇમઆઉટ પદાનુક્રમ ``` REQUEST_TIMEOUT_MS (વૈશ્વિક ઓવરરાઇડ) @@ -756,114 +764,116 @@ REQUEST_TIMEOUT_MS (વૈશ્વિક ઓવરરાઇડ) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (ડિફૉલ્ટ: 0 = અક્ષમ) ``` -| ચલ | ડિફૉલ્ટ | વર્ણન | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `REQUEST_TIMEOUT_MS` | _(સેટ કરેલ નથી)_ | વૈશ્વિક શૉર્ટકટ — `FETCH_TIMEOUT_MS` અને `STREAM_IDLE_TIMEOUT_MS` બન્નેના ડિફૉલ્ટને ઓવરરાઇડ કરે છે. | -| `FETCH_TIMEOUT_MS` | `600000` | અપસ્ટ્રીમ પ્રદાતાને કરવામાં આવતા કૉલ માટે કુલ HTTP વિનંતી સમયસમાપ્તિ. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | રદ કરતાં પહેલાં અપસ્ટ્રીમમાંથી મળતા કાચા બાઇટ્સ વચ્ચેનો મહત્તમ મૌન સમય. વિસ્તૃત-વિચારશક્તિવાળા મોડલ ભાગ્યે જ >90s માટે વિરામ લે છે. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | સક્રિય SSE સ્ટ્રીમનું મહત્તમ કુલ આયુષ્ય; અપસ્ટ્રીમ બાઇટ્સ મળવા પર તે ક્યારેય રીસેટ થતું નથી અને `REQUEST_TIMEOUT_MS`થી સ્વતંત્ર છે. રજિસ્ટ્રીમાં સૌથી મોટા પ્રતિ-મોડલ `timeoutMs` (1200000, Codex)માં 60000નો માર્જિન ઉમેરીને મેળવવામાં આવ્યું છે, જેથી મોડલને તેનું સંપૂર્ણ બજેટ વાપરવાની મંજૂરી હોય ત્યારે તેને જવાબની વચ્ચે ક્યારેય બંધ ન કરવામાં આવે. અક્ષમ કરવા માટે `0` પર સેટ કરો. | -| `OMNIROUTE_SSE_COMMENTS` | _(અક્ષમ)_ | OmniRoute SSEની `:` ટિપ્પણી લાઇનો (દા.ત. `: keepalive` હાર્ટબીટ અને `x-omniroute-*` મેટાડેટા ટ્રેલર્સ) ઉત્સર્જિત કરી શકે કે નહીં. ડિફૉલ્ટ રૂપે અક્ષમ છે (#10524), કારણ કે સખત OpenAI-સુસંગત ક્લાયન્ટ દરેક SSE લાઇન પર JSON.parse ચલાવે છે અને `:` ટિપ્પણીઓ પર ક્રૅશ થાય છે; `data:` હાર્ટબીટ પર તેની અસર થતી નથી. ફરીથી સક્ષમ થવા માટે `on`/`true`/`1`/`yes` સેટ કરો. `open-sse/utils/sseHeartbeat.ts` દ્વારા વપરાય છે. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | પ્રથમ નૉન-પિંગ SSE ઇવેન્ટ મેળવવાનો સમય. `REQUEST_TIMEOUT_MS` સેટ હોય ત્યારે તેનો સમય અપનાવે છે. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | મોટી, ટૂલ-હેવી અથવા ઉચ્ચ-તર્કવાળી સ્ટ્રીમિંગ વિનંતીઓ માટે મહત્તમ અનુકૂલનશીલ પ્રથમ-ઇવેન્ટ તૈયારી વિન્ડો. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` હ્યુરિસ્ટિક માટે કિલ-સ્વિચ. શોધને સંપૂર્ણપણે અક્ષમ કરવા માટે `false`/`0`/`off` સેટ કરો — વિનંતીના બોડી/હેડર્સના આધારે તૈયારી સમયસમાપ્તિ અને સ્ટ્રીમ પુનઃપ્રાપ્તિ ક્યારેય વધારવામાં આવતાં નથી, જે ક્લાયન્ટ-નિયંત્રિત સમયસમાપ્તિ એમ્પ્લિફિકેશનને ઘટાડે છે. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | શોધાયેલા `/goal` એજન્ટ રન અથવા `x-omniroute-agent-goal` વડે ફરજિયાત કરાયેલી વિનંતીઓ માટે મહત્તમ પ્રથમ-ઇવેન્ટ તૈયારી વિન્ડો. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | શોધાયેલા `/goal` એજન્ટ રન માટે વહેલી સ્ટ્રીમ પુનઃપ્રાપ્તિ આપમેળે સક્ષમ કરો. લક્ષ્ય-વિશિષ્ટ ઑપ્ટ-ઇન અક્ષમ કરવા માટે `false`/`0`/`off` સેટ કરો. આ ફક્ત ઑપરેટરના ડિફૉલ્ટ ઉપરાંત પુનઃપ્રાપ્તિ ઉમેરી શકે છે — તે સ્પષ્ટ `STREAM_RECOVERY_ENABLED`/DB સેટિંગ્સ ઑપ્ટ-આઉટને ક્યારેય ઓવરરાઇડ કરતું નથી. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | 502 સાથે OpenAI SDKના `responses.stream()`ને નિષ્ફળ બનાવતી બિન-પ્રમાણભૂત `codex.*` SSE ઇવેન્ટ્સ (દા.ત. `codex.rate_limits`) દૂર કરો. ડિફૉલ્ટ રૂપે ચાલુ છે (#11014). તેમને ફોરવર્ડ કરવા માટે `0`/`false`/`no`/`off` સેટ કરો. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(સેટ કરેલ નથી)_ | ઑપ્ટ-ઇન Codex app-server ટ્રાન્સપોર્ટ. સ્થાનિક `codex app-server` સાઇડકારનું WebSocket એન્ડપૉઇન્ટ (`ws://`/`wss://`). ટોકન સાથે સેટ કરાય ત્યારે, Codex વિનંતીઓ HTTP Responses APIને બદલે JSON-RPC દ્વારા સાઇડકાર તરફ રૂટ કરવામાં આવે છે. પ્રતિ-કનેક્શન `providerSpecificData.codexAppServerUrl` દ્વારા પણ સેટ કરી શકાય છે. `open-sse/executors/codex/appServerConfig.ts` દ્વારા વપરાય છે. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(સેટ કરેલ નથી)_ | app-server સમક્ષ રજૂ કરવામાં આવતું ઇનલાઇન ક્ષમતા/બેરર ટોકન. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(સેટ કરેલ નથી)_ | app-server ક્ષમતા ટોકન ધરાવતી ફાઇલનો પાથ (`codex app-server --ws-token-file`માંથી). `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` સેટ ન હોય ત્યારે વપરાય છે. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | app-server ટર્ન જે કાર્યકારી ડિરેક્ટરીમાં ચાલે છે. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(સેટ કરેલ નથી)_ | app-server ટર્નને આપવામાં આવતી મંજૂરી નીતિ (દા.ત. `never`, `on-request`). પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(સેટ કરેલ નથી)_ | app-server ટર્નને આપવામાં આવતી સેન્ડબૉક્સ નીતિ (દા.ત. `read-only`, `workspace-write`, `danger-full-access`). સેટ ન હોય ત્યારે એક્ઝિક્યુટર `workspace-write`ને ડિફૉલ્ટ માને છે (વધુ સુરક્ષિત; અગાઉ `danger-full-access`). પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-serverના પોતાના મંજૂરી પ્રૉમ્પ્ટ્સને આપમેળે મંજૂર કરો (હોસ્ટ પર કમાન્ડ/ફાઇલ/પરવાનગી અમલ). ડિફૉલ્ટ રૂપે બંધ — પ્રૉમ્પ્ટ્સ આપમેળે નકારવામાં આવે છે; હાર્નેસ ટૂલ કૉલ્સ પર અસર થતી નથી (તેઓ અલગ `item/tool/call` પાસથ્રૂ દ્વારા જાય છે). `true`/`1`/`yes` સ્વીકારે છે. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | પ્રતિસાદ હેડર્સ મેળવવાનો સમય. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | દરેક સીધા, પ્રૉક્સી વિનાના પ્રયાસ માટે પ્રતિસાદ શરૂ થવાની મહત્તમ પ્રતીક્ષા (ms). સમયસમાપ્તિ થાય ત્યારે નવા સૉકેટ પર એક વાર પુનઃપ્રયાસ થાય છે; મર્યાદા અક્ષમ કરવા અને અગાઉનું વર્તન જાળવી રાખવા માટે `0` સેટ કરો. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | સંપૂર્ણ પ્રતિસાદ બૉડી પ્રાપ્ત કરવાનો સમય. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP કનેક્શન સ્થાપિત કરવાની સમયસમાપ્તિ. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive સૉકેટની નિષ્ક્રિય સમયસમાપ્તિ. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS ફિંગરપ્રિન્ટ પ્રૉક્સી (wreq-js) સમયસમાપ્તિ. | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | ખાસ કરીને wreq-js TLS-ફિંગરપ્રિન્ટ ટ્રાન્સપોર્ટની બૉડી માટે પ્રથમ બાઇટ મળવા સુધીના સમયને મર્યાદિત કરે છે; ફક્ત `TLS_CLIENT_TIMEOUT_MS` અટકેલી બૉડીને શોધી શકતું નથી, કારણ કે હેડર્સ આવતાં જ તે પૂર્ણ થઈ જાય છે (#12656). સમયસમાપ્તિ wreq રીડરને રદ કરે છે અને સીધા/પ્રૉક્સી ડિસ્પેચર પર પાછું ફરે છે; `0` વૉચડૉગને અક્ષમ કરે છે. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | ફક્ત OpenCode એક્ઝિક્યુટર માટે અને માત્ર ત્યારે જ્યારે `OPENCODE_RESPONSES_STALL_ROTATION` ફીચર ફ્લૅગ ચાલુ હોય (ડિફૉલ્ટ રૂપે બંધ): હેડર્સ મળ્યા પછી સ્ટ્રીમ કરાયેલા Responses જવાબની પ્રથમ બૉડી બાઇટ માટેની પ્રતીક્ષાને મર્યાદિત કરે છે (#13484). Responses સ્ટ્રીમ `response.created` સાથે ખુલે છે, તેથી આ સમયગાળા પછીનું મૌન સ્ટૉલ ગણાય છે: એકાઉન્ટને કૂલડાઉન કરવામાં આવે છે અને વિનંતીને એક વાર આગલા એકાઉન્ટ પર ફેરવવામાં આવે છે; બીજી વાર સ્ટૉલ થાય તો તરત નિષ્ફળ થાય છે. ફ્લૅગ ચાલુ હોય તો પણ `0` સુરક્ષાને અક્ષમ કરે છે. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` બ્રિજ વિનંતીઓ માટે પ્રૉક્સી હૉપની સમયસમાપ્તિ. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl વેબ-ફેચ એક્ઝિક્યુટરને સ્વ-હોસ્ટ કરેલા ઇન્સ્ટન્સ તરફ નિર્દેશિત કરો (ઑફ-ક્લાઉડમાં API કી વૈકલ્પિક છે). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl વેબ-ફેચ એક્ઝિક્યુટર માટે પ્રતિ-વિનંતી સમયસમાપ્તિ. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | બ્રિજ માટે સર્વરની એકંદર વિનંતી સમયસમાપ્તિ. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | બ્રિજ મારફતે પ્રતિસાદ હેડર્સ મોકલવાનો સમય. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | બ્રિજ Keep-alive ની નિષ્ક્રિય સમયસમાપ્તિ. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | રૉ સૉકેટ સમયસમાપ્તિ (0 = અક્ષમ). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | બળજબરીથી બહાર નીકળતા પહેલાં SIGTERM/SIGINT પર મળતો ગ્રેસ પિરિયડ. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` સેટ ન હોય ત્યારે `src/shared/utils/fetchTimeout.ts` દ્વારા વપરાતું ફૉલબૅક. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts` માં `validationRead` અને `modelsProbe` પ્રીસેટ્સ માટે સમયસમાપ્તિ (ms). ડૅશબોર્ડમાં સક્રિય/ભૂલ સ્થિતિ વચ્ચે વારંવાર ફેરફાર થતો રોકવા માટે ધીમા એન્ડપૉઇન્ટ્સ (Cerebras, Cloudflare AI, Groq) માટે આ વધારો. અમાન્ય (<1000) અથવા બિન-આંકડાકીય મૂલ્યો માટે 8000ms પર ફૉલબૅક થાય છે. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts` માં રિલે-વિશિષ્ટ ફેચ સમયસમાપ્તિ (#9158). અટકેલું રિલે ક્લાયન્ટ/એજન્ટ સમયસમાપ્તિ (~30s) પહેલાં નિષ્ફળ થવું આવશ્યક છે, જેથી કૉલ કરનારાઓને સામાન્ય અપસ્ટ્રીમ સમયસમાપ્તિના બદલે રિલે-વિશિષ્ટ નિષ્ફળતા દેખાય. તે હંમેશાં પહેલાં સક્રિય થાય તે માટે `29000` સુધી મર્યાદિત છે. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts` માં સીધા/રિલે/પ્રૉક્સીના એક-વખત-પુનઃપ્રયાસ પાથ્સ માટે સહિયારો પુનઃપ્રયાસ બૅકઑફ (#9158). `0` = તરત પુનઃપ્રયાસ કરો. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | નેટિવ wreq-js વિનંતી સમયસમાપ્તિ (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | નેટિવ સમયસમાપ્તિ ઉપરાંત ઉમેરાતો નિશ્ચિત JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | નેટિવ wreq-js વિનંતી સમયસમાપ્તિ (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | નેટિવ સમયસમાપ્તિ ઉપરાંત ઉમેરાતો નિશ્ચિત JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (બંધ) | કૉલરના સિસ્ટમ સંદેશમાં "તમારી પાસે બિલ્ટ-ઇન વેબ શોધ છે. શોધ પરિણામોનો ઉપયોગ કરીને પ્રશ્નોના સીધા જવાબ આપો." ઉમેરે છે (`perplexity-web/protocol.ts`). ડિફૉલ્ટ રૂપે બંધ — Perplexity આમ પણ શોધ કરે છે અને આ વાક્ય કોડિંગ ક્લાયન્ટ્સ માટેના જવાબોમાં મેટા-ટિપ્પણી તરીકે દેખાઈ જાય છે. પુનઃસ્થાપિત કરવા માટે `1`/`true`/`yes`/`on` સેટ કરો. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | મૂળ wreq-js વિનંતી સમયસમાપ્તિ (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | મૂળ સમયસમાપ્તિ ઉપરાંત ઉમેરવામાં આવતો નિરપેક્ષ JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | મૂળ wreq-js વિનંતી સમયસમાપ્તિ (`notionTlsClient.ts`); લાંબી જનરેશન્સ માટે `notion-web` તેને દરેક વિનંતી દીઠ વધારીને `180000` કરે છે. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | મૂળ સમયસમાપ્તિ ઉપરાંત ઉમેરવામાં આવતો નિરપેક્ષ JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | -| `OMNIROUTE_BROWSER_POOL` | `on` | બ્રાઉઝર-સમર્થિત વેબ-કૂકી ચેટ માટે વહેંચાયેલ Playwright બ્રાઉઝર પૂલ (`browserPool.ts`); અક્ષમ કરવા માટે `off` સેટ કરો. | -| `OBSCURA_BIN` | `auto-detect` | બ્રાઉઝર પૂલ અને Cloudflare Playground એક્ઝિક્યુટર દ્વારા પ્રાથમિક એન્જિન તરીકે ઉપયોગમાં લેવાતી `obscura` બાઇનરીનો પાથ (`open-sse/services/obscura.ts`); સેટ ન હોય ત્યારે સિસ્ટમ PATHમાંથી આપમેળે શોધાય છે. | -| `OBSCURA_CDP_ENDPOINT` | _(સેટ નથી)_ | નવું શરૂ કરવાને બદલે પહેલેથી ચાલી રહેલા Obscura (`http://host:port`) તરફ નિર્દેશ કરો; મોડ્યુલ તે પ્રક્રિયાનું સ્વામિત્વ ધરાવતું નથી (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | શરૂ કરાયેલા `obscura serve` માટે સ્પષ્ટ પોર્ટ; સેટ ન હોય ત્યારે ખાલી પોર્ટ આપમેળે પસંદ થાય છે (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | વેબ-કૂકી ચેટ વિનંતી માટે બ્રાઉઝર-સમર્થિત પાથ પસંદ કરો (`browserBackedChat.ts`); સક્ષમ કરવા માટે `1`. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (આંતરરાષ્ટ્રીય kimi.ai Connect-RPC) એક્ઝિક્યુટર માટેનો બેઝ URL (`kimi-web.ts`); ફક્ત મિરર/પ્રોક્સી એન્ડપૉઇન્ટ્સ માટે જ ઓવરરાઇડ કરો. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web એક્ઝિક્યુટર માટેનો સંપૂર્ણ ચેટ એન્ડપૉઇન્ટ (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(આપમેળે શોધાયેલ)_ | Adobe Firefly ઇન્ટરેક્ટિવ બ્રાઉઝર સાઇન-ઇન માટે સિસ્ટમ Chrome/Edge એક્ઝિક્યુટેબલનો પાથ (`adobeFireflyBrowserLogin.ts`); દરેક OS માટેની સ્વચાલિત શોધને ઓવરરાઇડ કરે છે. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ સ્ટૅન્ડઅલોન આઉટપુટ_ | પોસ્ટ-બિલ્ડ કોલોકેશન પગલા દ્વારા ઉપયોગમાં લેવાતી સ્ટૅન્ડઅલોન આઉટપુટ ડિરેક્ટરી માટેનો બિલ્ડ-ટાઇમ ઓવરરાઇડ (`scripts/build/colocate-standalone.mjs`); આ બિલ્ડ ટૂલિંગ માટે છે, રનટાઇમ માટે નહીં. | +| ચલ | ડિફૉલ્ટ | વર્ણન | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUEST_TIMEOUT_MS` | _(સેટ કરેલું નથી)_ | વૈશ્વિક શૉર્ટકટ — `FETCH_TIMEOUT_MS` અને `STREAM_IDLE_TIMEOUT_MS` બન્નેનાં ડિફૉલ્ટને ઓવરરાઇડ કરે છે. | +| `FETCH_TIMEOUT_MS` | `600000` | અપસ્ટ્રીમ પ્રોવાઇડર કૉલ્સ માટે કુલ HTTP વિનંતી સમયસમાપ્તિ. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | રદ કરતાં પહેલાં અપસ્ટ્રીમના કાચા બાઇટ્સ વચ્ચેનું મહત્તમ મૌન. વિસ્તૃત-વિચારણા મોડલ્સ ભાગ્યે જ >90s માટે વિરામ લે છે. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | સક્રિય SSE સ્ટ્રીમનું મહત્તમ કુલ આયુષ્ય; અપસ્ટ્રીમ બાઇટ્સ પર ક્યારેય રીસેટ થતું નથી અને `REQUEST_TIMEOUT_MS`થી સ્વતંત્ર છે. રજિસ્ટ્રીમાં સૌથી મોટા પ્રતિ-મોડલ `timeoutMs` (1200000, Codex) ઉપરાંત 60000ના માર્જિન પરથી મેળવેલું છે, જેથી સંપૂર્ણ બજેટ સુધી ચાલવાની મંજૂરી ધરાવતું મોડલ જવાબની વચ્ચે ક્યારેય બંધ ન થાય. અક્ષમ કરવા માટે `0` સેટ કરો. | +| `OMNIROUTE_SSE_COMMENTS` | _(અક્ષમ)_ | OmniRoute SSE `:` ટિપ્પણી લાઇનો (દા.ત. `: keepalive` હાર્ટબીટ અને `x-omniroute-*` મેટાડેટા ટ્રેલર્સ) મોકલી શકે કે નહીં. ડિફૉલ્ટ રૂપે અક્ષમ છે (#10524), કારણ કે કડક OpenAI-સુસંગત ક્લાયન્ટ્સ દરેક SSE લાઇન પર JSON.parse કરે છે અને `:` ટિપ્પણીઓ પર ક્રેશ થાય છે; `data:` હાર્ટબીટ્સને અસર થતી નથી. ફરીથી સક્રિય થવા માટે `on`/`true`/`1`/`yes` સેટ કરો. `open-sse/utils/sseHeartbeat.ts` દ્વારા વપરાય છે. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | પ્રથમ બિન-ping SSE ઇવેન્ટ પ્રાપ્ત કરવાનો સમય. સેટ હોય ત્યારે `REQUEST_TIMEOUT_MS`માંથી વારસામાં મળે છે. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | મોટી, ટૂલ-સઘન અથવા ઉચ્ચ-તર્કવાળી સ્ટ્રીમિંગ વિનંતીઓ માટે મહત્તમ અનુકૂલનશીલ પ્રથમ-ઇવેન્ટ તૈયારી વિન્ડો. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` હ્યુરિસ્ટિક માટે કિલ-સ્વિચ. શોધને સંપૂર્ણપણે અક્ષમ કરવા માટે `false`/`0`/`off` સેટ કરો — વિનંતી બૉડી/હેડર્સના આધારે તૈયારી સમયસમાપ્તિઓ અને સ્ટ્રીમ પુનઃપ્રાપ્તિ ક્યારેય વધારવામાં આવતી નથી, જે ક્લાયન્ટ-નિયંત્રિત સમયસમાપ્તિ વૃદ્ધિને ઘટાડે છે. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | શોધાયેલા `/goal` એજન્ટ રન અથવા `x-omniroute-agent-goal` વડે ફરજિયાત કરાયેલી વિનંતીઓ માટે મહત્તમ પ્રથમ-ઇવેન્ટ તૈયારી વિન્ડો. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | શોધાયેલા `/goal` એજન્ટ રન માટે પ્રારંભિક સ્ટ્રીમ પુનઃપ્રાપ્તિ આપમેળે સક્રિય કરો. goal-વિશિષ્ટ ઑપ્ટ-ઇનને અક્ષમ કરવા માટે `false`/`0`/`off` સેટ કરો. આ ઑપરેટરના ડિફૉલ્ટની ઉપર માત્ર પુનઃપ્રાપ્તિ ઉમેરી શકે છે — તે સ્પષ્ટ `STREAM_RECOVERY_ENABLED`/DB સેટિંગ્સ ઑપ્ટ-આઉટને ક્યારેય ઓવરરાઇડ કરતું નથી. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | બિન-માનક `codex.*` SSE ઇવેન્ટ્સ (દા.ત. `codex.rate_limits`) દૂર કરો, જે OpenAI SDKના `responses.stream()`ને 502 સાથે નિષ્ફળ બનાવે છે. ડિફૉલ્ટ રૂપે ચાલુ છે (#11014). તેમને ફૉર્વર્ડ કરવા માટે `0`/`false`/`no`/`off` સેટ કરો. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(સેટ કરેલું નથી)_ | ઑપ્ટ-ઇન Codex app-server ટ્રાન્સપોર્ટ. સ્થાનિક `codex app-server` સાઇડકારનું WebSocket એન્ડપૉઇન્ટ (`ws://`/`wss://`). ટોકન સાથે સેટ કરેલું હોય ત્યારે Codex વિનંતીઓ HTTP Responses APIને બદલે JSON-RPC મારફતે સાઇડકાર તરફ રાઉટ થાય છે. `providerSpecificData.codexAppServerUrl` દ્વારા પ્રતિ-કનેક્શન પણ સેટ કરી શકાય છે. `open-sse/executors/codex/appServerConfig.ts` દ્વારા વપરાય છે. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(સેટ કરેલું નથી)_ | app-server સમક્ષ રજૂ કરાતું ઇનલાઇન ક્ષમતા/બેરર ટોકન. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(સેટ કરેલું નથી)_ | app-server ક્ષમતા ટોકન ધરાવતી ફાઇલનો પાથ (`codex app-server --ws-token-file`માંથી). `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` સેટ ન હોય ત્યારે વપરાય છે. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | app-server ટર્ન જે કાર્યકારી ડિરેક્ટરીમાં ચાલે છે. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(સેટ કરેલું નથી)_ | app-server ટર્નને મોકલાતી મંજૂરી નીતિ (દા.ત. `never`, `on-request`). પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(સેટ કરેલું નથી)_ | app-server ટર્નને મોકલાતી સેન્ડબૉક્સ નીતિ (દા.ત. `read-only`, `workspace-write`, `danger-full-access`). સેટ ન હોય ત્યારે એક્ઝિક્યુટર ડિફૉલ્ટ રૂપે `workspace-write` વાપરે છે (વધુ સુરક્ષિત; અગાઉ `danger-full-access`). પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-serverના પોતાના મંજૂરી પ્રૉમ્પ્ટ્સને આપમેળે મંજૂર કરો (હોસ્ટ પર કમાન્ડ/ફાઇલ/પરવાનગીનું એક્ઝિક્યુશન). ડિફૉલ્ટ રૂપે બંધ — પ્રૉમ્પ્ટ્સ આપમેળે નકારવામાં આવે છે; હાર્નેસ ટૂલ કૉલ્સને અસર થતી નથી (તેઓ અલગ `item/tool/call` પાસથ્રૂ મારફતે જાય છે). `true`/`1`/`yes` સ્વીકારે છે. પ્રતિ-કનેક્શન ઓવરરાઇડ: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | પ્રતિસાદ હેડર્સ પ્રાપ્ત કરવાનો સમય. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | દરેક સીધા no-proxy પ્રયાસ માટે પ્રતિસાદ શરૂ થવાની મહત્તમ રાહ (ms). સમયસમાપ્તિ થાય ત્યારે નવા socket પર એક વાર પુનઃપ્રયાસ થાય છે; મર્યાદા અક્ષમ કરવા અને અગાઉનું વર્તન જાળવી રાખવા માટે `0` સેટ કરો. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | ઉપરના pooled-attempt પ્રતિસાદ-પ્રારંભ સમયસમાપ્તિ પછીના fresh-socket RETRY પ્રયાસ માટેની મહત્તમ મર્યાદા (ms) (#13703). આ ફક્ત ત્યારે લાગુ પડે છે જ્યારે કૉલરે પહેલેથી જ પોતાનું deadline signal જોડ્યું હોય (resolved connection/model/provider/`FETCH_TIMEOUT_MS` cascade); એ signal વાસ્તવિક મર્યાદા છે અને ઇચ્છિત પાથમાં પહેલાં સક્રિય થાય છે, તેથી આ એક સમાન કઠોર મર્યાદા નહીં પરંતુ ઉદાર backstop છે — તેના વિના, પુનઃપ્રયાસ pooled attempt જેવી જ ટૂંકી `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` વિન્ડોનો ફરી ઉપયોગ કરતો હતો અને સ્વસ્થ, ધીમા-TTFB reasoning models માટે 504 આપતો હતો. ઉપરની સમાન લઘુત્તમ મર્યાદાથી નીચે ક્યારેય મંજૂર નથી; જ્યારે કૉલર કોઈ deadline signal આપતો જ નથી, ત્યારે પુનઃપ્રયાસ સમાન લઘુત્તમ મર્યાદા યથાવત્ રાખે છે. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | સંપૂર્ણ response body પ્રાપ્ત કરવાનો સમય. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP connection સ્થાપિત થવાની સમયમર્યાદા. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive socket નિષ્ક્રિય સમયમર્યાદા. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS fingerprint proxy (wreq-js) સમયમર્યાદા. | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | ખાસ કરીને wreq-js TLS-fingerprint transport ના body માટે time-to-first-byte ને મર્યાદિત કરે છે; માત્ર `TLS_CLIENT_TIMEOUT_MS` અટવાયેલા body ને પકડી શકતું નથી, કારણ કે headers આવતાની સાથે જ તે resolve થઈ જાય છે (#12656). સમયસમાપ્તિ wreq reader ને રદ કરે છે અને direct/proxy dispatcher પર fallback કરે છે; `0` watchdog ને અક્ષમ કરે છે. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | ફક્ત OpenCode executor માટે, અને માત્ર `OPENCODE_RESPONSES_STALL_ROTATION` feature flag ચાલુ હોય ત્યારે (ડિફૉલ્ટરૂપે બંધ): તેના headers પછી streamed Responses reply ના પ્રથમ body byte માટેની રાહને મર્યાદિત કરે છે (#13484). Responses stream `response.created` સાથે ખુલે છે, તેથી આ વિન્ડોથી વધુ સમયનું મૌન stall ગણાય છે: account ને cooldown કરવામાં આવે છે અને request એક વાર આગલા account પર rotate થાય છે; બીજો stall થાય તો તરત નિષ્ફળ થાય છે. flag ચાલુ હોય તોપણ `0` guard ને અક્ષમ કરે છે. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` bridge requests માટે proxy hop સમયમર્યાદા. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl web-fetch executor ને self-hosted instance તરફ દોરો (off-cloud માં API key વૈકલ્પિક છે). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl web-fetch executor માટે પ્રતિ-request સમયમર્યાદા. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | bridge માટેની એકંદર server request સમયમર્યાદા. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | bridge મારફતે response headers મોકલવાનો સમય. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Bridge keep-alive નિષ્ક્રિય સમયમર્યાદા. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | કાચી socket સમયમર્યાદા (0 = અક્ષમ). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | બળજબરીથી બહાર નીકળતાં પહેલાં SIGTERM/SIGINT પર મળતો grace period. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` સેટ ન હોય ત્યારે `src/shared/utils/fetchTimeout.ts` દ્વારા વપરાતું fallback. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts` માં `validationRead` અને `modelsProbe` presets માટેની સમયમર્યાદા (ms). dashboard માં active/error વચ્ચે વારંવાર ફેરફાર થતો અટકાવવા ધીમા endpoints (Cerebras, Cloudflare AI, Groq) માટે વધારો. અમાન્ય (<1000) અથવા non-numeric મૂલ્યો માટે પાછું 8000ms વાપરે છે. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts` માં relay-વિશિષ્ટ fetch સમયમર્યાદા (#9158). અટવાયેલ relay એ client/agent સમયમર્યાદા (~30s) પહેલાં નિષ્ફળ થવું આવશ્યક છે, જેથી કૉલર્સને generic upstream સમયમર્યાદાને બદલે relay-વિશિષ્ટ નિષ્ફળતા દેખાય. તે હંમેશાં પહેલાં સક્રિય થાય તે માટે `29000` સુધી મર્યાદિત છે. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts` માં direct/relay/proxy retry-once paths માટેનો સહિયારો retry backoff (#9158). `0` = તરત પુનઃપ્રયાસ કરો. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | નેટિવ wreq-js વિનંતી સમયસમાપ્તિ (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | નેટિવ સમયસમાપ્તિ ઉપરાંત ઉમેરવામાં આવતો સંપૂર્ણ JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | નેટિવ wreq-js વિનંતી સમયસમાપ્તિ (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | નેટિવ સમયસમાપ્તિ ઉપરાંત ઉમેરવામાં આવતો સંપૂર્ણ JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (બંધ) | કૉલરના સિસ્ટમ સંદેશમાં "તમારી પાસે બિલ્ટ-ઇન વેબ શોધ છે. શોધ પરિણામોનો ઉપયોગ કરીને પ્રશ્નોના સીધા જવાબ આપો." ઉમેરે છે (`perplexity-web/protocol.ts`). ડિફૉલ્ટ રૂપે બંધ — Perplexity તેમ છતાં શોધ કરે છે, અને આ વાક્ય કોડિંગ ક્લાયન્ટના જવાબોમાં મેટા-ટિપ્પણી તરીકે પ્રગટ થઈ જાય છે. પુનઃસ્થાપિત કરવા માટે `1`/`true`/`yes`/`on` સેટ કરો. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | નેટિવ wreq-js વિનંતી સમયસમાપ્તિ (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | નેટિવ સમયસમાપ્તિ ઉપરાંત ઉમેરવામાં આવતો સંપૂર્ણ JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | નેટિવ wreq-js વિનંતી સમયસમાપ્તિ (`notionTlsClient.ts`); લાંબા જનરેશન માટે `notion-web` તેને દરેક વિનંતી દીઠ વધારીને `180000` કરે છે. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | નેટિવ સમયસમાપ્તિ ઉપરાંત ઉમેરવામાં આવતો સંપૂર્ણ JS હાર્ડ-ડેડલાઇન ગ્રેસ સમય. | +| `OMNIROUTE_BROWSER_POOL` | `on` | બ્રાઉઝર-સમર્થિત વેબ-કૂકી ચેટ માટેનું શેર કરેલું Playwright બ્રાઉઝર પૂલ (`browserPool.ts`); અક્ષમ કરવા માટે `off` સેટ કરો. | +| `OBSCURA_BIN` | `auto-detect` | બ્રાઉઝર પૂલ અને Cloudflare Playground એક્ઝિક્યુટર દ્વારા પ્રાથમિક એન્જિન તરીકે ઉપયોગમાં લેવાતી `obscura` બાઇનરીનો પાથ (`open-sse/services/obscura.ts`); સેટ ન હોય ત્યારે સિસ્ટમ PATHમાંથી આપમેળે શોધાય છે. | +| `OBSCURA_CDP_ENDPOINT` | _(સેટ નથી)_ | નવું ઇન્સ્ટન્સ શરૂ કરવાને બદલે પહેલેથી ચાલી રહેલા Obscura (`http://host:port`) તરફ નિર્દેશ કરો; મોડ્યુલ તે પ્રોસેસની માલિકી ધરાવતું નથી (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `random free port` | શરૂ કરવામાં આવેલા `obscura serve` માટે સ્પષ્ટ પોર્ટ; સેટ ન હોય ત્યારે ખાલી પોર્ટ આપમેળે પસંદ કરવામાં આવે છે (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | વેબ-કૂકી ચેટ વિનંતી માટે બ્રાઉઝર-સમર્થિત પાથ પસંદ કરે છે (`browserBackedChat.ts`); સક્ષમ કરવા માટે `1`. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (આંતરરાષ્ટ્રીય kimi.ai Connect-RPC) એક્ઝિક્યુટર માટેનો બેઝ URL (`kimi-web.ts`); માત્ર મિરર/પ્રૉક્સી એન્ડપૉઇન્ટ માટે જ ઓવરરાઇડ કરો. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web એક્ઝિક્યુટર માટેનો સંપૂર્ણ ચેટ એન્ડપૉઇન્ટ (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(આપમેળે શોધાયેલ)_ | Adobe Firefly ઇન્ટરેક્ટિવ બ્રાઉઝર સાઇન-ઇન માટે સિસ્ટમ Chrome/Edge એક્ઝિક્યુટેબલનો પાથ (`adobeFireflyBrowserLogin.ts`); દરેક OS માટેની આપમેળે શોધ પ્રક્રિયાને ઓવરરાઇડ કરે છે. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ સ્ટૅન્ડઅલોન આઉટપુટ_ | પોસ્ટ-બિલ્ડ સહસ્થાપન પગલા દ્વારા વપરાતી સ્ટૅન્ડઅલોન આઉટપુટ ડિરેક્ટરી માટેનો બિલ્ડ-સમય ઓવરરાઇડ (`scripts/build/colocate-standalone.mjs`); બિલ્ડ ટૂલિંગ માટે, રનટાઇમ માટે નહીં. | કોમ્બો ટાર્ગેટના પ્રયાસો ઉકેલાયેલ અપસ્ટ્રીમ વિનંતી સમયસમાપ્તિ (`FETCH_TIMEOUT_MS`, અથવા -જ્યારે તે fetch ડિફૉલ્ટ પૂરો પાડે ત્યારે `REQUEST_TIMEOUT_MS`) વારસામાં મેળવે છે. કોમ્બો, -કોમ્બો ડિફૉલ્ટ્સ અથવા પ્રોવાઇડર ઓવરરાઇડમાં `targetTimeoutMs` ફક્ત કોમ્બો ફૉલબૅકને વધુ ઝડપી બનાવવા માટે સેટ કરો; વર્તમાન -અપસ્ટ્રીમ સમયસમાપ્તિથી વધુ મૂલ્યોને અપસ્ટ્રીમ સમયસમાપ્તિ સુધી મર્યાદિત કરવામાં આવે છે. - -`comboTimeoutMs` એ ફેઇલઓવર ટાર્ગેટ્સમાં સમગ્ર કોમ્બો માટેનું અલગ વૉલ-ક્લૉક બજેટ છે. -અમર્યાદિત પુનરાવર્તન જાળવવા માટે તેને સેટ કર્યા વિના છોડો અથવા `0` રાખો (10-મિનિટનું -`COMBO_LOOP_SAFETY_TIMEOUT_MS` હૅંગ-સ્ટૉપ હજુ પણ લાગુ પડે છે). ધન મૂલ્ય કોમ્બો માટે તે -સુરક્ષા વ્યવસ્થાને બદલે છે. `comboTimeoutMs` ને `targetTimeoutMs` કરતાં લાંબું રાખો, જેથી ધીમા પ્રથમ ટાર્ગેટ પછી પણ -ફેઇલઓવર માટે સમય બાકી રહે. - -### સર્કિટ બ્રેકર થ્રેશોલ્ડ્સ - -પ્રોવાઇડર-સ્તરનું સર્કિટ બ્રેકર ટ્યુનિંગ. ડિફૉલ્ટ્સ v3.6થી 500+ કનેક્શન્સ માટે ઉપયોગમાં લેવાતા સ્કેલ કરેલા મૂલ્યો દર્શાવે છે. - -| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | -| ------------------------------------------------------------- | --------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | બ્રેકર ટ્રિપ થાય તે પહેલાં OAuth પ્રદાતાઓ માટે સળંગ નિષ્ફળતાઓની મર્યાદા. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth પ્રદાતા બ્રેકર માટે રીસેટ વિન્ડો (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-key પ્રદાતાઓ માટે સળંગ નિષ્ફળતાઓની મર્યાદા. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-key પ્રદાતા બ્રેકર માટે રીસેટ વિન્ડો (ms). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | સ્થાનિક પ્રદાતાઓ (Ollama, LM Studio, ...) માટે સળંગ નિષ્ફળતાઓની મર્યાદા. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | સ્થાનિક પ્રદાતા બ્રેકર માટે રીસેટ વિન્ડો (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સમગ્ર OAuth પ્રદાતા કૂલડાઉનમાં જાય તે પહેલાં વિન્ડોની અંદરની નિષ્ફળતાઓ. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: OAuth પ્રદાતાઓ માટે રોલિંગ નિષ્ફળતા-ગણતરી વિન્ડો (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: OAuth પ્રદાતાની મર્યાદા પહોંચી જાય ત્યાર પછીનો કૂલડાઉન (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | આટલી નિષ્ફળતાઓ પર OAuth પ્રદાતા DEGRADED સ્થિતિમાં જાય છે. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth પ્રદાતા માટે મહત્તમ resetTimeout વૃદ્ધિ ગુણક. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | આટલા ઓપન ચક્રો પછી OAuth પ્રદાતા એસ્કેલેટ થાય છે. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સમગ્ર API-key પ્રદાતા કૂલડાઉનમાં જાય તે પહેલાં વિન્ડોની અંદરની નિષ્ફળતાઓ. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: API-key પ્રદાતાઓ માટે રોલિંગ નિષ્ફળતા-ગણતરી વિન્ડો (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: API-key પ્રદાતાની મર્યાદા પહોંચી જાય ત્યાર પછીનો કૂલડાઉન (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | આટલી નિષ્ફળતાઓ પર API-key પ્રદાતા DEGRADED સ્થિતિમાં જાય છે. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-key પ્રદાતા માટે મહત્તમ resetTimeout વૃદ્ધિ ગુણક. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | આટલા ઓપન ચક્રો પછી API-key પ્રદાતા એસ્કેલેટ થાય છે. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સમગ્ર સ્થાનિક પ્રદાતા કૂલડાઉનમાં જાય તે પહેલાંની નિષ્ફળતાઓ. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સ્થાનિક પ્રદાતાઓ માટે રોલિંગ નિષ્ફળતા-ગણતરી વિન્ડો (ms). | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સ્થાનિક પ્રદાતાની મર્યાદા પહોંચી જાય ત્યાર પછીનો કૂલડાઉન (ms). | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | બૅકઑફની એ ઊંડાઈ કે જ્યાં context-cache પિનનો પ્રદાતા લાંબા સમયથી અસ્વસ્થ હોવાનું માનવામાં આવે છે અને failover માટે પિન દૂર કરવામાં આવે છે. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | context-cache પિન દૂર કરતાં પહેલાં ટૂંકા ક્ષણિક કૂલડાઉનને સહન કરતી એન્ટિ-ફ્લૅપ વિન્ડો (ms). | +જ્યારે તે fetch ડિફૉલ્ટ પૂરું પાડે ત્યારે `REQUEST_TIMEOUT_MS`) વારસામાં મેળવે છે. કોમ્બો, +કોમ્બો ડિફૉલ્ટ અથવા પ્રોવાઇડર ઓવરરાઇડમાં `targetTimeoutMs` માત્ર કોમ્બો ફૉલબૅકને ઝડપી +બનાવવા માટે જ સેટ કરો; વર્તમાન અપસ્ટ્રીમ સમયસમાપ્તિથી વધારે મૂલ્યોને અપસ્ટ્રીમ સમયસમાપ્તિ +સુધી મર્યાદિત કરવામાં આવે છે. + +`comboTimeoutMs` એ ફેઇલઓવર ટાર્ગેટોમાં સમગ્ર કોમ્બો માટેનું અલગ વૉલ-ક્લૉક બજેટ છે. +અમર્યાદિત પુનરાવર્તન જાળવવા માટે તેને સેટ ન કરો અથવા `0` રાખો (10-મિનિટનો +`COMBO_LOOP_SAFETY_TIMEOUT_MS` હૅંગ-સ્ટૉપ હજી પણ લાગુ પડે છે). ધન મૂલ્ય કોમ્બો માટે +તે સુરક્ષા-વ્યવસ્થાને બદલે છે. `comboTimeoutMs` ને `targetTimeoutMs` કરતાં લાંબું રાખો જેથી +ધીમા પ્રથમ ટાર્ગેટ પછી પણ ફેઇલઓવર માટે સમય બાકી રહે. + +### સર્કિટ બ્રેકર થ્રેશોલ્ડ + +પ્રોવાઇડર-સ્તરીય સર્કિટ બ્રેકર ટ્યુનિંગ. ડિફૉલ્ટ મૂલ્યો v3.6થી 500+ કનેક્શન માટે ઉપયોગમાં લેવાતા સ્કેલ કરેલા મૂલ્યોને પ્રતિબિંબિત કરે છે. + +| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | +| ------------------------------------------------------------- | --------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | બ્રેકર ટ્રિપ થાય તે પહેલાં OAuth પ્રદાતાઓ માટે સતત નિષ્ફળતાઓની મર્યાદા. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth પ્રદાતા બ્રેકર માટે રીસેટ વિન્ડો (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-key પ્રદાતાઓ માટે સતત નિષ્ફળતાઓની મર્યાદા. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-key પ્રદાતા બ્રેકર માટે રીસેટ વિન્ડો (ms). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | સ્થાનિક પ્રદાતાઓ (Ollama, LM Studio, ...) માટે સતત નિષ્ફળતાઓની મર્યાદા. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | સ્થાનિક પ્રદાતા બ્રેકર માટે રીસેટ વિન્ડો (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સમગ્ર OAuth પ્રદાતા કૂલડાઉનમાં જાય તે પહેલાં વિન્ડોની અંદર થતી નિષ્ફળતાઓ. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: OAuth પ્રદાતાઓ માટે રોલિંગ નિષ્ફળતા-ગણતરી વિન્ડો (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: OAuth પ્રદાતાની મર્યાદા પહોંચી જાય પછીનો કૂલડાઉન (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | આટલી નિષ્ફળતાઓ પર OAuth પ્રદાતા DEGRADED સ્થિતિમાં જાય છે. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth પ્રદાતા માટે મહત્તમ resetTimeout વૃદ્ધિ ગુણક. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | આટલા ઓપન સાઇકલ પછી OAuth પ્રદાતાનું એસ્કેલેશન થાય છે. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સમગ્ર API-key પ્રદાતા કૂલડાઉનમાં જાય તે પહેલાં વિન્ડોની અંદર થતી નિષ્ફળતાઓ. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: API-key પ્રદાતાઓ માટે રોલિંગ નિષ્ફળતા-ગણતરી વિન્ડો (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: API-key પ્રદાતાની મર્યાદા પહોંચી જાય પછીનો કૂલડાઉન (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | આટલી નિષ્ફળતાઓ પર API-key પ્રદાતા DEGRADED સ્થિતિમાં જાય છે. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-key પ્રદાતા માટે મહત્તમ resetTimeout વૃદ્ધિ ગુણક. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | આટલા ઓપન સાઇકલ પછી API-key પ્રદાતાનું એસ્કેલેશન થાય છે. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સમગ્ર સ્થાનિક પ્રદાતા કૂલડાઉનમાં જાય તે પહેલાંની નિષ્ફળતાઓ. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સ્થાનિક પ્રદાતાઓ માટે રોલિંગ નિષ્ફળતા-ગણતરી વિન્ડો (ms). | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | પ્રદાતા-સ્તરીય બ્રેકર: સ્થાનિક પ્રદાતાની મર્યાદા પહોંચી જાય પછીનો કૂલડાઉન (ms). | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | બૅકઑફની એ ઊંડાઈ કે જ્યાં context-cache pinનો પ્રદાતા લાંબા સમયથી અસ્વસ્થ માનવામાં આવે છે અને failover માટે pin દૂર કરવામાં આવે છે. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | context-cache pin દૂર કરતાં પહેલાં ટૂંકા ક્ષણિક કૂલડાઉનને સહન કરતી ઍન્ટિ-ફ્લૅપ વિન્ડો (ms). | -### પરિદૃશ્યો +### પરિસ્થિતિઓ -| પરિદૃશ્ય | રૂપરેખાંકન | +| પરિસ્થિતિ | રૂપરેખાંકન | | ------------------------------------ | ----------------------------------------------------- | | **લાંબા સમય સુધી ચાલતી કોડ જનરેશન** | `REQUEST_TIMEOUT_MS=900000` (15 મિનિટ) | -| **કુલ સ્ટ્રીમ જીવનકાળ મર્યાદિત કરો** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 મિનિટ) | +| **કુલ સ્ટ્રીમ આયુષ્ય મર્યાદિત કરો** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 મિનિટ) | | **પ્રોડક્શન API માટે ઝડપી નિષ્ફળતા** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **વિસ્તૃત વિચારણા ધરાવતા મૉડલ** | `STREAM_IDLE_TIMEOUT_MS=300000` (ચંક્સ વચ્ચે 5 મિનિટ) | +| **વિસ્તૃત વિચારશક્તિવાળા મૉડલ** | `STREAM_IDLE_TIMEOUT_MS=300000` (ચંક્સ વચ્ચે 5 મિનિટ) | --- @@ -1110,102 +1120,103 @@ Adobe Firefly વેબ પ્રદાતા માટે બ્રાઉઝર --- -## 21. પ્રૉક્સીનું સ્વાસ્થ્ય - -| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | -| ------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | ફાસ્ટ-ફેઇલ હેલ્થ ચેક ટાઇમઆઉટ. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | લેટન્સી-ઑપ્ટિમાઇઝ્ડ પૂલ વ્યૂહરચનામાં ઉમેદવાર પ્રોક્સીઓની સરેરાશ લેટન્સીની ગણતરી કરવા માટેની સમય વિન્ડો (કલાકોમાં). | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | હેલ્થ ચેક પરિણામ કૅશ TTL. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | નિષ્ફળ પ્રોક્સી હેલ્થ પ્રોબ માટે કૅશ TTL. આને `PROXY_HEALTH_CACHE_TTL_MS` કરતાં ટૂંકું રાખો, જેથી ઉચ્ચ સમવર્તિતા હેઠળના ક્ષણિક પ્રોક્સી ટાઇમઆઉટ ખરેખર નિષ્ક્રિય પ્રોક્સીઓ માટે ફાસ્ટ-ફેઇલને અક્ષમ કર્યા વિના ઝડપથી ફરી પ્રયાસ કરે. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | નોંધાયેલ પ્રોક્સીઓને સમયાંતરે પ્રોબ કરતા બૅકગ્રાઉન્ડ પ્રોક્સી હેલ્થ શેડ્યૂલરને અક્ષમ કરવા માટે `false` સેટ કરો. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | બૅકગ્રાઉન્ડ હેલ્થ-શેડ્યૂલર સ્વીપ અંતરાલ msમાં (ન્યૂનતમ `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | શેડ્યૂલર અને `/api/settings/proxies/auto-test` એન્ડપોઇન્ટ દ્વારા વપરાતું પહોંચક્ષમતા પ્રોબ લક્ષ્ય. જાહેર ડિફૉલ્ટ ટાળવા માટે તેને આંતરિક/સ્વ-હોસ્ટેડ URL તરફ નિર્દેશિત કરો. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | દરેક બૅચમાં એકસાથે શરૂ થતા પ્રોબ, જે શેડ્યૂલર અને `/api/settings/proxies/auto-test` એન્ડપોઇન્ટ દ્વારા શેર થાય છે. ન્યૂનતમ 1 અને મહત્તમ 50 સુધી મર્યાદિત. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | બૅચની અંદર બે પ્રોબના પ્રસ્થાન વચ્ચેનો msમાં વિલંબ. તેના વિના આખી બૅચ એક જ સમયે નીકળે છે અને શેર કરાયેલ એગ્રેસ IP રેટ-લિમિટેડ લક્ષ્યને ટ્રિગર કરી શકે છે. અંતર અક્ષમ કરવા માટે `0` સેટ કરો; મહત્તમ 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | પ્રોક્સીને સોંપાયેલા પ્રદાતાના વાસ્તવિક હોસ્ટને (`GET /models`, API કી વિના) પ્રોબ કરવાનું બંધ કરવા અને તેના બદલે હંમેશાં `PROXY_HEALTH_TEST_URL` વાપરવા માટે "false" સેટ કરો. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | જ્યારે `false` (ડિફૉલ્ટ) હોય, ત્યારે સ્વચાલિત પહોંચક્ષમતા પ્રોબ (શેડ્યૂલર + `/api/settings/proxies/auto-test` "બધાનું પરીક્ષણ કરો" બટન) **માત્ર વાંચવા માટે** હોય છે અને ક્યારેય પ્રોક્સીનું સ્ટેટસ લખતા નથી — માત્ર ઑપરેટર જ સક્રિય/નિષ્ક્રિય સેટ કરે છે, તેથી અસ્થિર પ્રોબ સોંપાયેલ પ્રોક્સીને ફસાવી શકતો નથી (#6246). જૂનું ટેસ્ટ-એન્ડ-સેટ વર્તન પુનઃસ્થાપિત કરવા માટે `true` સેટ કરો. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | ઑપ્ટ-ઇન ફીચર ફ્લૅગ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) જુઓ; ડૅશબોર્ડ DB ઓવરરાઇડને પ્રાથમિકતા મળે છે). `true` (અથવા `1`, `yes`) ડૅશબોર્ડમાં પ્રોક્સી પૂલ હેઠળ માત્ર-વાંચી શકાય તેવું પૂલ એગ્રેસ અવલોકન દર્શાવે છે (પ્રોક્સી લૉગમાંથી છેલ્લા 24 કલાકના અલગ એગ્રેસ IP, કનેક્શનો અને એક IP પાછળ સૌથી વધુ જોવાયેલ સંખ્યા). રૂટિંગ માટે ક્યારેય વપરાતું નથી. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | વારંવારની સતત નિષ્ફળતાઓ પછી શેડ્યૂલરને પ્રોક્સીઓ આપમેળે દૂર કરવાની મંજૂરી આપવા માટે `true` સેટ કરો. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | શેડ્યૂલર કોઈ પ્રોક્સીને આપમેળે દૂર કરે તે પહેલાંની સતત નિષ્ફળતાઓની સંખ્યા (જ્યારે `PROXY_AUTO_REMOVE=true` હોય). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | વારંવારની સતત નિષ્ફળતાઓ પછી પ્રોક્સીને દૂર કરવાને બદલે શેડ્યૂલરને તેને સોફ્ટ-ડિસેબલ (સ્ટેટસ `dead`, ક્યારેય કાઢી નાખવામાં આવતી નથી) કરવાની મંજૂરી આપવા માટે `true` સેટ કરો. `PROXY_AUTO_REMOVE`નો બિન-વિનાશક વિકલ્પ: પ્રોક્સી તરત જ પૂલ/રોટેશન રિઝોલ્યુશનમાંથી બહાર થઈ જાય છે (સ્કોપ-પૂલ રિઝોલ્યુશન દ્વારા વપરાતું જીવંત-સ્ટેટસ ફિલ્ટર તેને પહેલેથી જ બાકાત રાખે છે) અને તે ફરીથી પ્રોબ પાસ કરવાનું શરૂ કરે ત્યારે આપમેળે ફરી સક્રિય થાય છે. `PROXY_AUTO_REMOVE_AFTER` થ્રેશોલ્ડ શેર કરે છે. જો બંને ફ્લૅગ `true` હોય, તો `PROXY_AUTO_REMOVE`ને પ્રાથમિકતા મળે છે. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | પ્રોક્સી પહોંચક્ષમતા પૂર્વ-ચકાસણીઓ નિષ્ફળ જાય ત્યારે OAuth અને પ્રદાતા વેલિડેશન ફ્લોને પિન કરાયેલ પ્રોક્સીને બાયપાસ કરીને સીધા કનેક્ટ થવાની મંજૂરી આપો. અસરકારક પ્રાથમિકતાક્રમ Feature Flags DB ઓવરરાઇડ > env var > ડિફૉલ્ટ છે. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `open-sse/services/rateLimitManager.ts` | વિનંતી નિષ્ફળ થાય તે પહેલાં 429 પર રાહ જોવાનો મહત્તમ સમય. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | સ્વીકૃત વિનંતીનું રેટ-લિમિટ રિઝર્વેશન સમાપ્ત થાય તે પહેલાં તે એક્ઝિક્યુશનમાં રહી શકે તેની મહત્તમ સમયમર્યાદા — ક્યૂ-પ્રતીક્ષા બજેટથી અલગ રાખવામાં આવી છે, જેથી નોન-ઇન્ક્રિમેન્ટલ ગેટવે પર ધીમી fetch-શરૂઆત ટાઇમઆઉટ ન થાય (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (અક્ષમ) | `open-sse/services/rateLimitManager.ts` | ક્યૂ પ્રવેશ મર્યાદા: આટલી વિનંતીઓ પહેલેથી ક્યૂમાં હોય ત્યારે 429 `queue_full` સાથે અસ્વીકાર કરો. `0` = અમર્યાદિત (ડિફૉલ્ટ). | -| `RATE_LIMIT_AUTO_ENABLE` | _(સેટ કરેલ નથી)_ | `open-sse/services/rateLimitManager.ts` | સાચવેલી ડૅશબોર્ડ સેટિંગને અવગણીને ઑટો-એનેબલ રેટ-લિમિટ સુરક્ષા વ્યવસ્થાને ચાલુ/બંધ કરવા દબાણ કરો. ચાલુ કરવા માટે `true`/`1`/`on`, બંધ કરવા માટે `false`/`0`/`off` સ્વીકારે છે. | -| `PROVIDER_COOLDOWN_ENABLED` | _(સેટ કરેલ નથી → બંધ)_ | `open-sse/services/providerCooldownTracker.ts` | ઑપ્ટ-ઇન વૈશ્વિક ક્રોસ-રિક્વેસ્ટ પ્રદાતા/કનેક્શન કૂલડાઉન ટ્રૅકિંગ. ડિફૉલ્ટ રૂપે બંધ (કનેક્શન કૂલડાઉન / પ્રોવાઇડર સર્કિટ બ્રેકર સાથે ઓવરલૅપ થાય છે). સક્ષમ કરવા માટે `true`/`1`/`on` સ્વીકારે છે. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | નિષ્ફળ પ્રદાતા/કનેક્શનનો ફરી પ્રયાસ થાય તે પહેલાંનું ન્યૂનતમ કૂલડાઉન (ms). સતત નિષ્ફળતાઓ સાથે ઘાતાંકીય રીતે સ્કેલ થાય છે. ફક્ત `PROVIDER_COOLDOWN_ENABLED` હોય ત્યારે વપરાય છે. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | નિષ્ફળ પ્રદાતા/કનેક્શનનો ફરી પ્રયાસ થાય તે પહેલાંના કૂલડાઉનની મહત્તમ મર્યાદા (ms). ફક્ત `PROVIDER_COOLDOWN_ENABLED` હોય ત્યારે વપરાય છે. | -| `STREAM_RECOVERY_ENABLED` | _(સેટ કરેલ નથી → બંધ)_ | `src/lib/resilience/settings.ts` (સીડ) → `open-sse/services/streamRecovery.ts` (લૉજિક) | **શું:** કપાઈ ગયેલા અપસ્ટ્રીમ સ્ટ્રીમની પારદર્શક પુનઃપ્રાપ્તિ (free-claude-code પોર્ટ). શરૂઆતની SSE વિન્ડોને `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) સુધી રોકી રાખે છે, જેથી _પ્રી-કમિટ_ કટઑફ — જે ક્લાયન્ટ સુધી કોઈપણ બાઇટ પહોંચે તે પહેલાં થાય છે — ફરી ખોલીને અદૃશ્ય રીતે ફરી પ્રયાસ કરી શકાય. **ક્યારે સક્ષમ કરવું:** અસ્થિર/એવા અપસ્ટ્રીમ કે જે સ્ટ્રીમની શરૂઆતમાં વારંવાર 0-બાઇટ ટ્રન્કેટ થાય છે; જો તમે દરેક સ્ટ્રીમ પર પ્રથમ ટોકન સુધીના સમયમાં વધારાના 750 ms સુધીનો વિલંબ સહન ન કરી શકો તો તેને બંધ રાખો. `true`/`1`/`on` સ્વીકારે છે. સાચવેલી Resilience સેટિંગને સીડ કરે છે; એકવાર સેટ થયા પછી ડૅશબોર્ડ સેટિંગને પ્રાથમિકતા મળે છે. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(સેટ કરેલ નથી → બંધ)_ | `src/lib/resilience/settings.ts` (સીડ) → `open-sse/services/streamRecovery.ts` (લૉજિક) | **શું:** મિડ-સ્ટ્રીમ કન્ટિન્યુએશન (Fase 4.4) — _પોસ્ટ-કમિટ_ ટ્રન્કેશન પછી (બાઇટ્સ પહેલેથી ક્લાયન્ટ સુધી પહોંચી ગયા હોય), આંશિક ટેક્સ્ટને assistant prefill તરીકે રાખીને ફરી વિનંતી કરે છે અને ગુમ થયેલો સફિક્સ જોડે છે. ફક્ત પ્લેન-ટેક્સ્ટ OpenAI-સુસંગત સ્ટ્રીમ; ટૂલ કૉલ ચાલુ હોય ત્યારે ક્યારેય સક્રિય થતું નથી. **ક્યારે સક્ષમ કરવું:** લાંબી જનરેશનો જે જવાબની વચ્ચે કપાઈ જાય અને તમે પુનઃપ્રાપ્ત થયેલો અંતિમ ભાગ ટોકન-દર-ટોકનના બદલે એક જ બર્સ્ટમાં આવે તે સ્વીકારો છો. `STREAM_RECOVERY_ENABLED`થી સ્વતંત્ર (અલગ જોખમ પ્રોફાઇલ). `true`/`1`/`on` સ્વીકારે છે. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(સેટ કરેલ નથી → બંધ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ઑપ્ટ-ઇન સક્રિય-સ્ટ્રીમ ઉપયોગી-આઉટપુટ વૉચડૉગ. એવા સ્ટ્રીમ શોધે છે જે ચંક્સ મોકલતા રહે છે પરંતુ ગોઠવેલા assistant-output દરથી નીચે રહે છે; હાર્ટબીટ, usage ઇવેન્ટ, ખાલી ડેલ્ટા અને ટૂલ/રીઝનિંગ તબક્કાઓ પ્રગતિ તરીકે દેખાતા નથી. નિષ્ક્રિયતા અને હાર્ડ-ડેડલાઇન ટાઇમઆઉટથી અલગ. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | થ્રુપુટ મૂલ્યાંકન પહેલાંનો ગ્રેસ પિરિયડ, 0–600000 ms સુધી મર્યાદિત. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | રોલિંગ ઉપયોગી-આઉટપુટ વિન્ડો, 1000–600000 ms સુધી મર્યાદિત; રદ કરતાં પહેલાં એક સંપૂર્ણ વિન્ડો જરૂરી છે. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | ન્યૂનતમ UTF-8 assistant-output બાઇટ દર (રૂઢિચુસ્ત ટોકન પ્રોક્સી), 1–1000000 સુધી મર્યાદિત. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | માપી શકાય તેવો ગણાતો ન્યૂનતમ શૂન્યથી વધુ ઉપયોગી-આઉટપુટ સેમ્પલ, 1–1000000 બાઇટ સુધી મર્યાદિત. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | સ્ટાર્ટઅપ વખતે પ્રદાતા ટોકન હેલ્થચેક વચ્ચેનો સ્ટૅગર અંતરાલ (ms). | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | બર્સ્ટિંગ અટકાવવા માટે પ્રદાતા ટોકન હેલ્થચેક વચ્ચે `HEALTHCHECK_STAGGER_MS` ઉપરાંત ઉમેરાતું ન્યૂનતમ રૅન્ડમાઇઝ્ડ જિટર (ms) (Issue #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | બર્સ્ટિંગ અટકાવવા માટે પ્રદાતા ટોકન હેલ્થચેક વચ્ચે `HEALTHCHECK_STAGGER_MS` ઉપરાંત ઉમેરાતું મહત્તમ રૅન્ડમાઇઝ્ડ જિટર (ms) (Issue #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | સ્ટાર્ટઅપ ટોકન-હેલ્થચેક સ્વીપ માટે સમવર્તી ચેક બૅચનું કદ; મોટા મૂલ્યો સમાંતરમાં વધુ કનેક્શન ચેક કરે છે, નાના મૂલ્યો બર્સ્ટ લોડ ઘટાડે છે (Issue #7875, #7719નું રિગ્રેશન). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ક્લાયન્ટને ભૂલ પરત કરતાં પહેલાં મોડેલ-સ્કોપ્ડ કૂલડાઉન પ્રતિસાદો પર આપમેળે થતા ફરી પ્રયાસોની સંખ્યા. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | કૂલડાઉન ફરી પ્રયાસો વચ્ચેનો મહત્તમ બૅકઑફ અંતરાલ (સેકન્ડમાં). અપસ્ટ્રીમ `Retry-After` ગમે તે હોય, આ મૂલ્ય દ્વારા મર્યાદિત. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom ટોકન-સેવર પ્રોક્સી URL. ડૅશબોર્ડ લાઇફસાઇકલ (`api/headroom/*`) ડિફૉલ્ટ રૂપે લૂપબૅક પર સ્થાનિક `headroom-ai` CLI શરૂ કરે છે; ફક્ત બાહ્ય Docker સાઇડકાર પ્રોક્સી તરફ નિર્દેશિત કરવા માટે જ ઓવરરાઇડ કરો. | +## 21. પ્રોક્સી આરોગ્ય + +| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | +| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | ઝડપી નિષ્ફળતા માટેની આરોગ્ય તપાસની સમયમર્યાદા. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | લેટન્સી-ઑપ્ટિમાઇઝ્ડ પૂલ વ્યૂહરચનામાં ઉમેદવાર પ્રોક્સીઓની સરેરાશ લેટન્સીની ગણતરી કરવા માટેની સમય વિન્ડો (કલાકોમાં). | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | આરોગ્ય તપાસ પરિણામની કૅશ TTL. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | નિષ્ફળ પ્રોક્સી આરોગ્ય પ્રોબ્સ માટેની કૅશ TTL. આને `PROXY_HEALTH_CACHE_TTL_MS` કરતાં ટૂંકી રાખો, જેથી ઉચ્ચ સમકાલીનતા હેઠળના ક્ષણિક પ્રોક્સી ટાઇમઆઉટ્સ ખરેખર નિષ્ક્રિય પ્રોક્સીઓ માટે ઝડપી નિષ્ફળતાને અક્ષમ કર્યા વિના ઝડપથી ફરી પ્રયાસ કરે. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | નોંધાયેલ પ્રોક્સીઓને સમયાંતરે પ્રોબ કરતા બૅકગ્રાઉન્ડ પ્રોક્સી આરોગ્ય શેડ્યૂલરને અક્ષમ કરવા માટે `false` સેટ કરો. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | બૅકગ્રાઉન્ડ આરોગ્ય શેડ્યૂલરના સ્વીપ માટેનો અંતરાલ msમાં (ન્યૂનતમ `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | શેડ્યૂલર અને `/api/settings/proxies/auto-test` એન્ડપોઇન્ટ દ્વારા ઉપયોગમાં લેવાતું પહોંચક્ષમતા પ્રોબ લક્ષ્ય. જાહેર ડિફૉલ્ટ ટાળવા માટે તેને આંતરિક/સ્વ-હોસ્ટેડ URL પર સેટ કરો. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | પ્રતિ બૅચ એકસાથે શરૂ થતા પ્રોબ્સની સંખ્યા, જે શેડ્યૂલર અને `/api/settings/proxies/auto-test` એન્ડપોઇન્ટ દ્વારા સંયુક્ત રીતે ઉપયોગમાં લેવાય છે. ન્યૂનતમ 1 અને મહત્તમ 50 સુધી મર્યાદિત. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | બૅચની અંદર બે પ્રોબ રવાના થવા વચ્ચેનો વિલંબ, ms માં. તેના વિના આખી બૅચ એક જ સમયે રવાના થાય છે અને સંયુક્ત એગ્રેસ IP રેટ-લિમિટેડ લક્ષ્યની મર્યાદા વટાવી શકે છે. અંતરાલ અક્ષમ કરવા માટે `0` સેટ કરો; મહત્તમ 5000 સુધી મર્યાદિત. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | પ્રોક્સીને ફાળવાયેલા પ્રોવાઇડરના વાસ્તવિક હોસ્ટનું પ્રોબિંગ (`GET /models`, કોઈ API key નહીં) બંધ કરવા અને તેના બદલે હંમેશાં `PROXY_HEALTH_TEST_URL` વાપરવા માટે "false" સેટ કરો. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | જ્યારે `false` (ડિફૉલ્ટ) હોય, ત્યારે સ્વચાલિત પહોંચક્ષમતા પ્રોબ્સ (શેડ્યૂલર + `/api/settings/proxies/auto-test`નું "બધાનું પરીક્ષણ કરો" બટન) **ફક્ત વાંચવા માટેનાં** હોય છે અને ક્યારેય પ્રોક્સીનું સ્ટેટસ લખતા નથી — માત્ર ઑપરેટર જ સક્રિય/નિષ્ક્રિય સેટ કરે છે, જેથી અસ્થિર પ્રોબ ફાળવાયેલા પ્રોક્સીને કાર્યરહિત ન બનાવી શકે (#6246). જૂનું પરીક્ષણ-અને-સેટ વર્તન પુનઃસ્થાપિત કરવા માટે `true` સેટ કરો. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | વૈકલ્પિક ફીચર ફ્લૅગ (જુઓ [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ડૅશબોર્ડ DB ઓવરરાઇડને પ્રાથમિકતા મળે છે). `true` (અથવા `1`, `yes`) ડૅશબોર્ડમાં પ્રોક્સી પૂલ હેઠળ ફક્ત વાંચવા માટેનું પૂલ એગ્રેસ અવલોકન દર્શાવે છે (અલગ એગ્રેસ IPs, કનેક્શન્સ અને પ્રોક્સી લૉગમાંથી છેલ્લા 24 h દરમિયાન એક IP પાછળ સૌથી વધુ જોવા મળેલા કનેક્શન્સ). રાઉટિંગ માટે ક્યારેય ઉપયોગ થતો નથી. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | વારંવાર થતી સળંગ નિષ્ફળતાઓ પછી શેડ્યૂલરને પ્રોક્સીઓ સ્વચાલિત રીતે દૂર કરવા દેવા માટે `true` સેટ કરો. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | શેડ્યૂલર દ્વારા પ્રોક્સીને સ્વચાલિત રીતે દૂર કરવામાં આવે તે પહેલાંની સળંગ નિષ્ફળતાઓની સંખ્યા (જ્યારે `PROXY_AUTO_REMOVE=true` હોય). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | વારંવારની સળંગ નિષ્ફળતાઓ પછી પ્રૉક્સીને દૂર કરવાને બદલે, scheduler તેને સોફ્ટ-ડિસેબલ (સ્થિતિ `dead`, ક્યારેય કાઢી નાખવામાં આવતી નથી) કરે તે માટે `true` સેટ કરો. `PROXY_AUTO_REMOVE` નો બિન-વિનાશક વિકલ્પ: પ્રૉક્સી તરત જ pool/rotation resolutionમાંથી બહાર થઈ જાય છે (scope-pool resolution દ્વારા વપરાતું alive-status filter તેને પહેલેથી જ બાકાત રાખે છે) અને જ્યારે તે ફરીથી probes પાસ કરવાનું શરૂ કરે છે ત્યારે આપમેળે ફરી સક્રિય થાય છે. `PROXY_AUTO_REMOVE_AFTER` threshold સહિયારું વાપરે છે. જો બંને flags `true` હોય, તો `PROXY_AUTO_REMOVE` પ્રાધાન્ય મેળવે છે. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | પ્રૉક્સીની પહોંચક્ષમતાની પૂર્વ-તપાસ નિષ્ફળ જાય ત્યારે OAuth અને provider validation flows ને pinned proxy બાયપાસ કરીને સીધા કનેક્ટ થવાની મંજૂરી આપો. અસરકારક અગ્રતાક્રમ Feature Flags DB override > env var > default છે. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `src/lib/resilience/settings.ts` | ડિફૉલ્ટ **queue-wait** બજેટ: કોઈ request provider slot માટે કેટલો સમય રાહ જોઈ શકે અને નકારવામાં આવે તે પહેલાં queueમાં રહી શકે, upstream સુધી ક્યારેય પહોંચ્યા વિના. job execute થવાનું શરૂ થતાં timer સાફ થઈ જાય છે — executionને `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` દ્વારા અલગથી મર્યાદિત કરવામાં આવે છે. Env માત્ર default સેટ કરે છે: persisted `resilienceSettings.requestQueue.maxWaitMs`, અને ત્યારબાદ per-connection `rateLimitOverrides.maxWaitMs`, દરેક તેના કરતાં પ્રાધાન્ય મેળવે છે. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 મિનિટ) | `open-sse/services/rateLimitManager.ts` | સ્વીકારેલી request તેના rate-limit reservationની મુદત પૂરી થાય તે પહેલાં executionમાં કેટલો મહત્તમ સમય રહી શકે તેની મર્યાદા — queue-wait budgetથી અલગ રાખવામાં આવી છે, જેથી non-incremental gateways પર ધીમું fetch-start timeout ન થાય (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (નિષ્ક્રિય) | `open-sse/services/rateLimitManager.ts` | Queue admission cap: આટલી requests પહેલેથી queueમાં હોય ત્યારે 429 `queue_full` સાથે નકારો. `0` = અમર્યાદિત (default). | +| `RATE_LIMIT_AUTO_ENABLE` | _(સેટ કરેલ નથી)_ | `open-sse/services/rateLimitManager.ts` | persisted Dashboard settingને ધ્યાનમાં લીધા વિના auto-enable rate limit safety netને બળજબરીથી ચાલુ/બંધ કરો. ચાલુ કરવા માટે `true`/`1`/`on`, અને બંધ કરવા માટે `false`/`0`/`off` સ્વીકારે છે. | +| `PROVIDER_COOLDOWN_ENABLED` | _(સેટ કરેલ નથી → બંધ)_ | `open-sse/services/providerCooldownTracker.ts` | વૈશ્વિક cross-request provider/connection cooldown tracking માટે opt-in. ડિફૉલ્ટ રૂપે બંધ છે (Connection Cooldown / Provider Circuit Breaker સાથે overlap થાય છે). સક્ષમ કરવા માટે `true`/`1`/`on` સ્વીકારે છે. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | નિષ્ફળ provider/connectionને ફરી અજમાવવામાં આવે તે પહેલાંનો લઘુત્તમ cooldown (ms). સળંગ નિષ્ફળતાઓ સાથે ઘાતાંકીય રીતે વધે છે. માત્ર `PROVIDER_COOLDOWN_ENABLED` હોય ત્યારે જ વપરાય છે. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 મિનિટ) | `open-sse/services/providerCooldownTracker.ts` | નિષ્ફળ થયેલા પ્રદાતા/કનેક્શનનો કોઈપણ સંજોગોમાં ફરી પ્રયાસ કરવામાં આવે તે પહેલાંની મહત્તમ કૂલડાઉન મર્યાદા (ms). ફક્ત `PROVIDER_COOLDOWN_ENABLED` સક્ષમ હોય ત્યારે જ ઉપયોગમાં લેવાય છે. | +| `STREAM_RECOVERY_ENABLED` | _(સેટ કરેલું નથી → બંધ)_ | `src/lib/resilience/settings.ts` (પ્રારંભિક મૂલ્ય) → `open-sse/services/streamRecovery.ts` (તર્ક) | **શું:** અધવચ્ચે કપાઈ ગયેલા અપસ્ટ્રીમ સ્ટ્રીમ્સની પારદર્શક પુનઃપ્રાપ્તિ (free-claude-code પોર્ટ). પ્રારંભિક SSE વિન્ડોને `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) સુધી રોકી રાખે છે, જેથી _પ્રી-કમિટ_ કટઑફ — એટલે કે ક્લાયન્ટ સુધી કોઈપણ બાઇટ પહોંચે તે પહેલાં થતો કટઑફ — ફરી ખોલીને અદૃશ્ય રીતે પુનઃપ્રયાસ કરી શકાય. **ક્યારે સક્ષમ કરવું:** અવિશ્વસનીય/એવા અપસ્ટ્રીમ્સ માટે જે સ્ટ્રીમની શરૂઆતમાં વારંવાર 0-બાઇટ ટ્રન્કેશન કરે છે; જો તમે દરેક સ્ટ્રીમ માટે પ્રથમ ટોકન મળવાના સમયમાં વધારાના 750 ms સુધીનો વિલંબ સહન ન કરી શકો, તો તેને બંધ રાખો. `true`/`1`/`on` સ્વીકારે છે. સંગ્રહિત Resilience સેટિંગનું પ્રારંભિક મૂલ્ય નિર્ધારિત કરે છે; એકવાર Dashboard સેટિંગ નિર્ધારિત થઈ જાય પછી તેને પ્રાધાન્ય મળે છે. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(સેટ કરેલું નથી → બંધ)_ | `src/lib/resilience/settings.ts` (પ્રારંભિક મૂલ્ય) → `open-sse/services/streamRecovery.ts` (તર્ક) | **શું:** સ્ટ્રીમના મધ્યમાં ચાલુ રાખવું (તબક્કો 4.4) — _પોસ્ટ-કમિટ_ ટ્રન્કેશન પછી (બાઇટ્સ પહેલેથી જ ક્લાયન્ટ સુધી પહોંચી ગયા હોય), આંશિક ટેક્સ્ટને assistant prefill તરીકે મોકલી ફરી વિનંતી કરે છે અને ખૂટતા પ્રત્યયને જોડે છે. ફક્ત સાદા-ટેક્સ્ટના OpenAI-સુસંગત સ્ટ્રીમ્સ માટે; tool call ચાલુ હોય ત્યારે ક્યારેય સક્રિય થતું નથી. **ક્યારે સક્ષમ કરવું:** લાંબા જનરેશન માટે, જે જવાબની મધ્યમાં કપાઈ જાય છે અને જેમાં તમે પુનઃપ્રાપ્ત થયેલો અંતિમ ભાગ ટોકન-દર-ટોકન આવવાને બદલે એકસાથે આવવો સ્વીકારો છો. `STREAM_RECOVERY_ENABLED`થી સ્વતંત્ર છે (જોખમની રૂપરેખા અલગ છે). `true`/`1`/`on` સ્વીકારે છે. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(સેટ કરેલું નથી → બંધ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | વૈકલ્પિક રીતે સક્ષમ કરી શકાય એવો સક્રિય-સ્ટ્રીમ ઉપયોગી-આઉટપુટ વૉચડૉગ. એવા સ્ટ્રીમ્સ શોધે છે જે ચંક્સ મોકલવાનું ચાલુ રાખે છે, પરંતુ કૉન્ફિગર કરેલા assistant-output દરથી નીચે રહે છે; હાર્ટબીટ્સ, વપરાશ ઇવેન્ટ્સ, ખાલી ડેલ્ટા અને ટૂલ/રીઝનિંગ તબક્કાઓ પ્રગતિ હોવાનો ખોટો દેખાવ ઊભો કરતા નથી. નિષ્ક્રિયતા અને કડક-સમયમર્યાદા ટાઇમઆઉટ્સથી અલગ છે. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | થ્રુપુટ મૂલ્યાંકન પહેલાંનો ગ્રેસ પિરિયડ, જે 0–600000 ms સુધી મર્યાદિત છે. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | રોલિંગ ઉપયોગી-આઉટપુટ વિન્ડો, જે 1000–600000 ms સુધી મર્યાદિત છે; રદ કરતાં પહેલાં એક સંપૂર્ણ વિન્ડો આવશ્યક છે. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | ન્યૂનતમ UTF-8 assistant-output બાઇટ દર (સાવચેત ટોકન પ્રૉક્સી), જે 1–1000000 સુધી મર્યાદિત છે. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | માપી શકાય એવો ગણવામાં આવતો ન્યૂનતમ શૂન્યથી વધુ ઉપયોગી-આઉટપુટ નમૂનો, જે 1–1000000 બાઇટ્સ સુધી મર્યાદિત છે. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | સ્ટાર્ટઅપ સમયે પ્રદાતાના ટોકન હેલ્થચેક વચ્ચેનો ક્રમશઃ વિલંબ અંતરાલ (ms). | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | અચાનક વધેલો ભાર અટકાવવા માટે પ્રદાતાના ટોકન હેલ્થચેક વચ્ચે `HEALTHCHECK_STAGGER_MS` ઉપરાંત ઉમેરાતો ન્યૂનતમ રૅન્ડમાઇઝ્ડ જિટર (ms) (Issue #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | અચાનક વધેલો ભાર અટકાવવા માટે પ્રદાતાના ટોકન હેલ્થચેક વચ્ચે `HEALTHCHECK_STAGGER_MS` ઉપરાંત ઉમેરાતો મહત્તમ રૅન્ડમાઇઝ્ડ જિટર (ms) (Issue #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | સ્ટાર્ટઅપ ટોકન-હેલ્થચેક સ્વીપ માટે સમકાલીન-તપાસ બેચનું કદ; મોટા મૂલ્યો વધુ કનેક્શન્સને સમાંતરે તપાસે છે, જ્યારે નાના મૂલ્યો અચાનક વધતા લોડને ઘટાડે છે (Issue #7875, #7719નું રિગ્રેશન). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ક્લાયન્ટને ભૂલ પરત કરતાં પહેલાં મોડેલ-સ્કોપ્ડ કૂલડાઉન પ્રતિસાદો પર આપમેળે કરવામાં આવતા પુનઃપ્રયાસોની સંખ્યા. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | કૂલડાઉન પુનઃપ્રયાસો વચ્ચેનો મહત્તમ બૅકઑફ અંતરાલ (સેકન્ડમાં). અપસ્ટ્રીમ `Retry-After` ગમે તે હોય, આ મૂલ્ય દ્વારા મર્યાદિત કરવામાં આવે છે. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom ટોકન-સેવર પ્રોક્સી URL. ડૅશબોર્ડ લાઇફસાઇકલ (`api/headroom/*`) મૂળભૂત રીતે લૂપબૅક પર સ્થાનિક `headroom-ai` CLI શરૂ કરે છે; માત્ર બાહ્ય Docker સાઇડકાર પ્રોક્સી તરફ નિર્દેશ કરવા માટે જ તેને ઓવરરાઇડ કરો. | ### સ્ટ્રીમ-પુનઃપ્રાપ્તિ ટ્યુનિંગ અચળાંકો -પુનઃપ્રાપ્તિ હોલ્ડબૅક વર્તણૂકને `open-sse/config/constants.ts` -(`STREAM_RECOVERY`) માં હાર્ડકોડ કરેલા અચળાંકો દ્વારા ટ્યુન કરવામાં આવે છે, જે સંદર્ભ માટે અહીં દર્શાવ્યા છે — -તેમને બદલવા માટે કોડમાં ફેરફાર કરવો જરૂરી છે, env var દ્વારા નહીં: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — પ્રારંભિક SSE વિન્ડોને કેટલો સમય રોકી રાખવામાં આવે છે, - જેથી ક્લાયન્ટને કોઈપણ બાઇટ કમિટ થાય તે પહેલાં વહેલા થતા ટ્રન્કેશન પર ફરી પ્રયાસ કરી શકાય. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — રોકી રાખેલી વિન્ડો પરની કડક મર્યાદા; ટાઇમરને ધ્યાનમાં લીધા વિના, - આટલા બાઇટ એકત્ર થાય કે તરત કમિટ કરો (ફ્લશ + પાસથ્રૂ). -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — હોલ્ડબૅક હજી કમિટ ન થયું હોય ત્યારે અપસ્ટ્રીમ - સ્ટ્રીમને પારદર્શક રીતે મહત્તમ કેટલી વાર ફરી ખોલી શકાય. - -> **પ્રતિ-પ્રોવાઇડર સ્લાઇડિંગ-વિન્ડો રેટ મર્યાદા (કોઈ env var નહીં):** FCCમાંથી પોર્ટ કરેલું -> પ્રતિ-પ્રોવાઇડર સ્લાઇડિંગ-વિન્ડો રેટ-લિમિટ _ફૉલબૅક_ કોડમાં અસ્તિત્વ ધરાવે છે -> (`open-sse/services/providerDefaultRateLimit.ts`, જેને -> `open-sse/services/rateLimitManager.ts` મારફતે જોડવામાં આવ્યું છે), પરંતુ તે **ખાલી ડિફૉલ્ટ મૅપ** સાથે -> વિતરિત થાય છે અને હાલમાં તેમાં **કોઈ ઑપરેટર env var નથી** — તે ફક્ત ટેસ્ટ હૂક / -> કોડ ફેરફાર દ્વારા સક્ષમ કરવામાં આવે છે. તેને ઇરાદાપૂર્વક ઉપરના કોષ્ટકમાં સૂચિબદ્ધ કરવામાં આવ્યું નથી. પ્રતિ-`(token, IP)` -> રિલે લિમિટર, જેમાં વાસ્તવમાં નિયંત્રણ ઉપલબ્ધ છે, તે `RELAY_IP_PER_MINUTE` (§3 નેટવર્ક અને પોર્ટ્સ) છે. +પુનઃપ્રાપ્તિ હોલ્ડબૅક વર્તનને +`open-sse/config/constants.ts` (`STREAM_RECOVERY`)માં હાર્ડકોડ કરેલા અચળાંકો દ્વારા ટ્યુન કરવામાં આવે છે, જે અહીં સંદર્ભ માટે દર્શાવ્યા છે — +તેમને બદલવા માટે કોડમાં ફેરફાર કરવો જરૂરી છે, env var નહીં: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — પ્રારંભિક SSE વિન્ડોને કેટલા સમય સુધી રોકી રાખવામાં આવે છે + જેથી ક્લાયન્ટને કોઈપણ બાઇટ મોકલવામાં આવે તે પહેલાં વહેલા થયેલા ટ્રન્કેશન પર પુનઃપ્રયાસ કરી શકાય. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — રોકી રાખેલી વિન્ડો પરની સખત મર્યાદા; ટાઇમરને ધ્યાનમાં લીધા વિના, + આટલા બાઇટ્સ એકઠા થતાં જ કમિટ કરો (ફ્લશ + પાસથ્રૂ). +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — હોલ્ડબૅક હજુ અનકમિટેડ હોય ત્યારે અપસ્ટ્રીમ + સ્ટ્રીમને પારદર્શક રીતે ફરીથી ખોલવાના મહત્તમ પ્રયાસો. + +> **પ્રતિ-પ્રદાતા સ્લાઇડિંગ-વિન્ડો દર મર્યાદા (કોઈ env var નથી):** FCCમાંથી પોર્ટ કરેલી +> પ્રતિ-પ્રદાતા સ્લાઇડિંગ-વિન્ડો દર-મર્યાદાની _ફૉલબૅક_ વ્યવસ્થા કોડમાં અસ્તિત્વ ધરાવે છે +> (`open-sse/services/providerDefaultRateLimit.ts`, જે +> `open-sse/services/rateLimitManager.ts` મારફતે જોડાયેલ છે), પરંતુ તે **ખાલી ડિફૉલ્ટ મૅપ** સાથે વિતરિત થાય છે +> અને હાલમાં તેમાં **કોઈ ઑપરેટર env var નથી** — તે માત્ર ટેસ્ટ હૂક / +> કોડ ફેરફાર દ્વારા જ સક્ષમ થાય છે. તેને ઇરાદાપૂર્વક ઉપરના કોષ્ટકમાં સૂચિબદ્ધ કરવામાં આવ્યું નથી. પ્રતિ-`(token, IP)` +> રિલે લિમિટર, જેમાં ખરેખર નિયંત્રણ ઉપલબ્ધ છે, તે `RELAY_IP_PER_MINUTE` (§3 નેટવર્ક અને પોર્ટ્સ) છે. --- ## 22. ડિબગિંગ > [!CAUTION] -> આ વેરિએબલ્સ **વિગતવાર આઉટપુટ** ઉત્પન્ન કરે છે અને સંવેદનશીલ ડેટા લીક કરી શકે છે. **પ્રોડક્શનમાં ક્યારેય સક્ષમ કરશો નહીં.** - -| વેરિએબલ | ડિફૉલ્ટ | સ્રોત ફાઇલ | વર્ણન | -| ------------------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CURSOR_DEBUG` | _(સેટ નથી)_ | `open-sse/executors/cursor.ts` | વિગતવાર Cursor executor લૉગ્સ (ડીકોડ કરેલા SSE chunks વગેરે) સક્ષમ કરવા માટે `1` સેટ કરો. | -| `CURSOR_STREAM_DEBUG` | _(સેટ નથી)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG` માટે પછાત-સુસંગત ઉપનામ. | -| `CURSOR_DUMP_FILE` | _(સેટ નથી)_ | `open-sse/executors/cursor.ts` | વૈકલ્પિક ફાઇલ પાથ, જે `CURSOR_DEBUG=1` હોય ત્યારે raw ડીકોડ કરેલા Cursor chunks મેળવે છે. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor executor માટે સ્ટ્રીમ નિષ્ક્રિયતા સમયસમાપ્તિ (ms). | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | જ્યારે bytes હજુ બફર થયેલા હોય ત્યારે composer kv_after_text soft terminator પછીની ગ્રેસ વિન્ડો (ms) — પાછળથી આવતા exec_mcp tool callને તેની frame પૂર્ણ કરવા માટે સમય આપે છે. | -| `CURSOR_TOOL_DIRECTIVE` | સક્ષમ (`!== "0"`) | `open-sse/executors/cursor.ts` | Tool-commit directive જે composer-2.5ને વિશ્વસનીય રીતે tool calls જારી કરાવે છે. અક્ષમ કરવા માટે `0` સેટ કરો. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(સેટ નથી)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | ઑપરેટર-વ્યાખ્યાયિત system prompt ટેક્સ્ટ, જે અનુવાદ પછી system messageમાં ઉમેરાય છે (post-translation injection) અને codex/Responses તથા `/v1/messages` પાથ સુધી પહોંચે છે. echoed system preamble blocksમાંથી દૂર કરાતા directive prefix તરીકે પણ તેનો ઉપયોગ થાય છે. અક્ષમ રાખવા માટે તેને સેટ ન કરો. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | રિમોટ `image_url` vision input માટે પ્રતિ-ઇમેજ fetch સમયસમાપ્તિ (ms). | -| `CURSOR_STATE_DB_PATH` | _(ચકાસાયેલ)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE વર્ઝન શોધવા માટે ઉપયોગમાં લેવાતી Cursor IDE state DB lookupને ઓવરરાઇડ કરો. | -| `CURSOR_AGENT_CLI_VERSION` | _(શોધો / પિન કરો)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run પર `x-cursor-client-version: cli-…` માટે Agent CLI build id (`YYYY.MM.DD-`). | -| `CURSOR_AGENT_BIN` | _(સેટ નથી)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ઇમેજ જનરેશન માટે ઉપયોગમાં લેવાતા Cursor Agent binaryનો પાથ. સેટ ન હોય તો handler પહેલાં `providerSpecificData.agentBin` અને પછી PATHનો ઉપયોગ કરે છે. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent ઇમેજ jobs માટે પ્રતિ-ઇમેજ wall clock સમય (ms). | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor ઇમેજ jobs માટે shared-seat concurrency gate. | -| `CURSOR_IMG_MODEL` | વિનંતી / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ઇમેજ jobs માટે Cursor CLI `--model`ને ઓવરરાઇડ કરો. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) image-gen પરિણામ-poll આવર્તન (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC image-gen પરિણામ-poll wall clock સમય (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) video-gen પરિણામ-poll આવર્તન (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video-gen પરિણામ-poll wall clock સમય (ms). | -| `CURSOR_DATA_DIR` | _(ચકાસાયેલ)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI data dir (`…/versions/`)ને ઓવરરાઇડ કરો; સત્તાવાર agent પણ આ જ વેરિએબલનો ઉપયોગ કરે છે. | -| `CURSOR_TOKEN` | _(સેટ નથી)_ | `scripts/ad-hoc/cursor-tap.cjs` | ડેવલપર tooling દ્વારા ઉપયોગમાં લેવાતું સીધું Cursor bearer token. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | અક્ષમ (`"1"` દ્વારા opt-in) | `src/app/api/v1/chat/completions/route.ts` | `"1"` સેટ હોય ત્યારે મોટા chat payloads માટે content-type/length markers લૉગ કરો. લૉગનો અવાજ ઘટાડવા માટે ડિફૉલ્ટ રૂપે બંધ છે. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(સેટ નથી)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON અનુવાદની વિગતો લૉગ કરવા માટે `true` સેટ કરો. | -| `DEBUG_CLAUDE_NONSTREAM` | _(સેટ નથી)_ | `open-sse/handlers/responseTranslator.ts` | Claude response અનુવાદ પાથમાં ખાલી textContent chunks દર્શાવવા માટે `true` સેટ કરો (માત્ર ડિબગ માટે). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(સેટ નથી)_ | E2E ટેસ્ટ harness | E2E ટેસ્ટ મોડ (શિથિલ auth, ટેસ્ટ hooks) સક્ષમ કરવા માટે `true` સેટ કરો. | +> આ વેરિએબલો **વિગતવાર આઉટપુટ** ઉત્પન્ન કરે છે અને સંવેદનશીલ ડેટા લીક કરી શકે છે. **પ્રોડક્શનમાં ક્યારેય સક્ષમ કરશો નહીં.** + +| વેરિએબલ | ડિફૉલ્ટ | સોર્સ ફાઇલ | વર્ણન | +| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(સેટ કરેલ નથી)_ | `open-sse/executors/cursor.ts` | વિગતવાર Cursor એક્ઝિક્યુટર લૉગ્સ (ડીકોડ કરેલા SSE ચંક્સ વગેરે) સક્ષમ કરવા માટે `1` સેટ કરો. | +| `CURSOR_STREAM_DEBUG` | _(સેટ કરેલ નથી)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG`નું બૅકવર્ડ-કમ્પેટિબલ ઉપનામ. | +| `CURSOR_DUMP_FILE` | _(સેટ કરેલ નથી)_ | `open-sse/executors/cursor.ts` | વૈકલ્પિક ફાઇલ પાથ, જે `CURSOR_DEBUG=1` હોય ત્યારે કાચા ડીકોડ કરેલા Cursor ચંક્સ મેળવે છે. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor એક્ઝિક્યુટર માટે સ્ટ્રીમ નિષ્ક્રિયતા સમયસમાપ્તિ (ms). | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | બાઇટ્સ બફરમાં બાકી હોય ત્યારે composer `kv_after_text` સોફ્ટ ટર્મિનેટર પછીની ગ્રેસ વિન્ડો (ms) — અંતમાં આવતા `exec_mcp` ટૂલ કૉલને તેની ફ્રેમ પૂર્ણ કરવા માટે સમય આપે છે. | +| `CURSOR_TOOL_DIRECTIVE` | સક્ષમ (`!== "0"`) | `open-sse/executors/cursor.ts` | ટૂલ-કમિટ ડાયરેક્ટિવ, જે composer-2.5ને વિશ્વસનીય રીતે ટૂલ કૉલ્સ જારી કરાવે છે. અક્ષમ કરવા માટે `0` સેટ કરો. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(સેટ કરેલ નથી)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | ઑપરેટર દ્વારા નિર્ધારિત સિસ્ટમ પ્રોમ્પ્ટ ટેક્સ્ટ, જે અનુવાદ પછી સિસ્ટમ સંદેશમાં ઉમેરાય છે (અનુવાદ-પશ્ચાત ઇન્જેક્શન), અને codex/Responses તથા `/v1/messages` પાથ સુધી પહોંચે છે. પ્રતિધ્વનિત સિસ્ટમ પ્રસ્તાવના બ્લૉક્સમાંથી દૂર કરાતા ડાયરેક્ટિવ પ્રિફિક્સ તરીકે પણ તેનો ઉપયોગ થાય છે. અક્ષમ રાખવા માટે સેટ કરશો નહીં. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (બંધ) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | openai→claude સ્ટ્રીમની શરૂઆતમાંથી પ્રતિધ્વનિત સિસ્ટમ-પ્રોમ્પ્ટ પ્રસ્તાવના બ્લૉક્સ દૂર કરવા માટે `1` સેટ કરો. ડિફૉલ્ટ રૂપે બંધ — હ્યુરિસ્ટિક્સ અંગ્રેજી ગદ્યના બંધારણ પર આધારિત છે અને પ્રતિસાદ પેલોડમાં ફેરફાર કરે છે, તેથી કાયદેસર રીતે આવા વિભાગથી શરૂ થતો જવાબ તે વિભાગ ગુમાવી દેશે. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | રિમોટ `image_url` વિઝન ઇનપુટ માટે પ્રતિ-ઇમેજ ફેચ સમયસમાપ્તિ (ms). | +| `CURSOR_STATE_DB_PATH` | _(ચકાસાયેલ)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE વર્ઝન શોધવા માટે ઉપયોગમાં લેવાતી Cursor IDE સ્ટેટ DB લુકઅપને ઓવરરાઇડ કરે છે. | +| `CURSOR_AGENT_CLI_VERSION` | _(શોધો / નિશ્ચિત કરો)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run પર `x-cursor-client-version: cli-…` માટે Agent CLI બિલ્ડ id (`YYYY.MM.DD-`). | +| `CURSOR_AGENT_BIN` | _(સેટ કરેલ નથી)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ઇમેજ જનરેશન માટે ઉપયોગમાં લેવાતી Cursor Agent બાઇનરીનો પાથ. સેટ ન હોય તો, હૅન્ડલર `providerSpecificData.agentBin` અને ત્યારબાદ PATHનો ઉપયોગ કરે છે. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent ઇમેજ જૉબ્સ માટે પ્રતિ-ઇમેજ વૉલ ક્લૉક સમય (ms). | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor ઇમેજ જૉબ્સ માટે શેર કરેલી-સીટ સમકાલીનતા ગેટ. | +| `CURSOR_IMG_MODEL` | વિનંતી / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ઇમેજ જૉબ્સ માટે Cursor CLI `--model`ને ઓવરરાઇડ કરે છે. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) ઇમેજ-જનરેશન પરિણામ-પોલ આવર્તન (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC ઇમેજ-જનરેશન પરિણામ-પોલ વૉલ ક્લૉક સમય (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) વિડિયો-જનરેશન પરિણામ-પોલ આવર્તન (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC વિડિયો-જનરેશન પરિણામ-પોલ વૉલ ક્લૉક સમય (ms). | +| `CURSOR_DATA_DIR` | _(ચકાસાયેલ)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI ડેટા ડિરેક્ટરી (`…/versions/`)ને ઓવરરાઇડ કરે છે; અધિકૃત agent પણ આ જ વેરિએબલનો ઉપયોગ કરે છે. | +| `CURSOR_TOKEN` | _(સેટ કરેલ નથી)_ | `scripts/ad-hoc/cursor-tap.cjs` | ડેવલપર ટૂલિંગ દ્વારા ઉપયોગમાં લેવાતું સીધું Cursor bearer token. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | અક્ષમ (`"1"` દ્વારા પસંદગીથી સક્ષમ) | `src/app/api/v1/chat/completions/route.ts` | `"1"` સેટ હોય ત્યારે મોટા ચૅટ પેલોડ્સ માટે content-type/length માર્કર્સ લૉગ કરે છે. લૉગનો અવાજ ઘટાડવા માટે ડિફૉલ્ટ રૂપે બંધ છે. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(સેટ કરેલ નથી)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON અનુવાદની વિગતો લૉગ કરવા માટે `true` સેટ કરો. | +| `DEBUG_CLAUDE_NONSTREAM` | _(સેટ કરેલ નથી)_ | `open-sse/handlers/responseTranslator.ts` | Claude પ્રતિસાદ અનુવાદ પાથમાં ખાલી `textContent` ચંક્સ દર્શાવવા માટે `true` સેટ કરો (માત્ર ડિબગ માટે). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(સેટ કરેલ નથી)_ | E2E ટેસ્ટ હાર્નેસ | E2E ટેસ્ટ મોડ (શિથિલ auth, ટેસ્ટ હૂક્સ) સક્ષમ કરવા માટે `true` સેટ કરો. | --- @@ -1223,7 +1234,7 @@ Adobe Firefly વેબ પ્રદાતા માટે બ્રાઉઝર ## ડિપ્લોયમેન્ટ પરિસ્થિતિઓ -રિલે બેકએન્ડ SRE માર્ગદર્શન (ts/bifrost/auto વર્તણૂક, 9router વિરુદ્ધ CLIProxyAPI પ્લેસમેન્ટ અને ઉચ્ચ-થ્રૂપુટ ફૉલબૅક વ્યૂહરચના) માટે, [રિલે બેકએન્ડ વ્યૂહરચના](/docs/reference/RELAY_BACKEND_STRATEGY.md) જુઓ. +રિલે બેકએન્ડ SRE માર્ગદર્શન (ts/bifrost/auto વર્તન, 9router અને CLIProxyAPIનું સ્થાનનિર્ધારણ, તેમજ ઉચ્ચ-થ્રુપુટ ફૉલબૅક વ્યૂહરચના) માટે, [રિલે બેકએન્ડ વ્યૂહરચના](/docs/reference/RELAY_BACKEND_STRATEGY.md) જુઓ. ### ન્યૂનતમ સ્થાનિક ડેવલપમેન્ટ @@ -1265,7 +1276,7 @@ OMNIROUTE_DISABLE_BACKGROUND_SERVICES=true APP_LOG_TO_FILE=false ``` -### રિવર્સ પ્રૉક્સી ધરાવતું VPS (nginx + Cloudflare) +### રિવર્સ પ્રોક્સી સાથે VPS (nginx + Cloudflare) ```bash JWT_SECRET= diff --git a/docs/i18n/gu/docs/reference/FEATURE_FLAGS.md b/docs/i18n/gu/docs/reference/FEATURE_FLAGS.md index 47bb617517f2..ce51050c81f4 100644 --- a/docs/i18n/gu/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/gu/docs/reference/FEATURE_FLAGS.md @@ -44,124 +44,125 @@ ## ફ્લૅગ સૂચિ -6 શ્રેણીઓમાં 72 ફ્લૅગ્સ. **ડિફૉલ્ટ** એટલે વ્યાખ્યાનું ડિફૉલ્ટ — જ્યારે DB ઓવરરાઇડ -કે એન્વાયર્નમેન્ટ વેરિએબલ, બંનેમાંથી કોઈ હાજર ન હોય ત્યારે વપરાતું મૂલ્ય. +6 શ્રેણીઓમાં કુલ 74 ફ્લૅગ. **ડિફૉલ્ટ** એટલે વ્યાખ્યામાં નિર્ધારિત ડિફૉલ્ટ — જ્યારે કોઈ DB ઓવરરાઇડ કે પર્યાવરણ ચલ હાજર ન હોય ત્યારે વપરાતું મૂલ્ય. ### સુરક્ષા (10) -| કી | પ્રકાર | ડિફૉલ્ટ | વર્ણન | -| --------------------------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | બુલિયન | `false` | તમામ ઇનકમિંગ વિનંતીઓ માટે API કી આવશ્યક બનાવો. | -| `INPUT_SANITIZER_ENABLED` | બુલિયન | `true` | તમામ વિનંતીઓ માટે ઇનપુટ સૅનિટાઇઝેશન સક્ષમ કરો. | -| `INJECTION_GUARD_MODE` | એનમ | `off` | પ્રોમ્પ્ટ ઇન્જેક્શન ગાર્ડ મોડ. મૂલ્યો: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | બુલિયન | `false` | વિનંતીઓમાંથી PII રિડૅક્ટ કરો (`INPUT_SANITIZER_MODE`થી સ્વતંત્ર). | -| `PII_RESPONSE_SANITIZATION` | બુલિયન | `false` | પ્રદાતાના પ્રતિસાદોમાંથી PII સૅનિટાઇઝ કરો. | -| `PII_RESPONSE_SANITIZATION_MODE` | એનમ | `redact` | PII પ્રતિસાદ સૅનિટાઇઝેશન માટેનો મોડ. મૂલ્યો: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | બુલિયન | `true` | ખાનગી/આંતરિક IP રેન્જ તરફની આઉટબાઉન્ડ વિનંતીઓને અવરોધો. | -| `ALLOW_API_KEY_REVEAL` | બુલિયન | `false` | પ્રમાણિત ડૅશબોર્ડ વપરાશકર્તાઓને માત્ર છુપાવેલાં મૂલ્યો જોવાને બદલે સંગ્રહિત API કીઓ પ્રગટ કરવાની મંજૂરી આપો. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | બુલિયન | `false` | AUTH લૉગ લાઇનોમાં એકાઉન્ટ પ્રીફિક્સ સામેલ કરો (દા.ત. " એકાઉન્ટનો ઉપયોગ થઈ રહ્યો છે: abc12345..."). ડિફૉલ્ટ રૂપે અક્ષમ હોવાથી, શેર કરેલા/મલ્ટિ-ટેનન્ટ પ્રોસેસ લૉગ્સમાંથી એકાઉન્ટ ઓળખકર્તાઓ રિડૅક્ટ થાય છે. Debug Modeથી સ્વતંત્ર; Debug Mode બદલવાથી આ પ્રગટ થતું નથી. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | બુલિયન | `false` | OIDC સક્ષમ હોય ત્યારે પાસવર્ડ લૉગિન અક્ષમ કરો, જેથી વપરાશકર્તાઓ ફક્ત OIDC Single Sign-On દ્વારા જ પ્રમાણિત થઈ શકે. અક્ષમ હોય ત્યારે (ડિફૉલ્ટ), પાસવર્ડ લૉગિન અને OIDC બંને ઉપલબ્ધ હોય છે. | - -### નેટવર્ક (15) - -| કી | પ્રકાર | ડિફૉલ્ટ | રીસ્ટાર્ટ | વર્ણન | -| ----------------------------------------------- | ------- | ------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS ફિંગરપ્રિન્ટ સ્ટેલ્થ મોડ સક્ષમ કરો. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* રૂટ્સને localhostની બહાર હોસ્ટ કરાયેલા OpenAI-સુસંગત પ્રોવાઇડર નોડ્સનો ઉપયોગ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ — ઑડિયોને રિમોટ હોસ્ટ તરફ રૂટ કરવાથી એગ્રેસ ઓળખ બદલાય છે અને તે ઑપરેટરનો સ્પષ્ટ નિર્ણય હોવો આવશ્યક છે. લૂપબૅક નોડ્સને હંમેશાં મંજૂરી છે અને તેના પર કોઈ અસર થતી નથી. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | જ્યારે કનેક્શનને કોઈ પ્રૉક્સી અસાઇન કરાયેલ ન હોય, ત્યારે રજિસ્ટ્રીમાંથી પ્રથમ કાર્યરત પ્રૉક્સીને આપમેળે પસંદ કરો. ડિફૉલ્ટ રૂપે બંધ (નહીં તો રજિસ્ટ્રીની કોઈપણ પ્રૉક્સી વૈશ્વિક ફૉલબૅક બની જાય છે — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | પ્રૉક્સી રીચેબિલિટી પ્રી-ચેક્સ નિષ્ફળ જાય ત્યારે OAuth અને પ્રોવાઇડર વૅલિડેશન ફ્લોને પિન કરેલી પ્રૉક્સીને બાયપાસ કરીને સીધું કનેક્ટ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ, કારણ કે તે એગ્રેસ IP બદલી શકે છે. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | મલ્ટિ-એકાઉન્ટ રોટેશન એક્ઝિક્યુટર માટે નેટવર્ક અપવાદ (ટાઇમઆઉટ, કનેક્શન નામંજૂર/રીસેટ) આવે અને નિષ્ફળ થયેલા એકાઉન્ટ પાસે સમર્પિત પ્રૉક્સી ન હોય, ત્યારે દરેક એકાઉન્ટનો ફરી પ્રયાસ કરવાને બદલે ટૂંકો કૂલડાઉન લાગુ કરો અને બાકીની રિક્વેસ્ટ માટે પ્રૉક્સી વિનાનાં અન્ય એકાઉન્ટ્સને છોડી દો. ડિફૉલ્ટ રૂપે ચાલુ (સુરક્ષિત: એગ્રેસ IP બદલાતો નથી, ફક્ત શેર્ડ-એગ્રેસ એકાઉન્ટ્સ પર લેટન્સી/કૂલડાઉનનું જોખમ ઘટાડે છે). પ્રૉક્સી વિનાનો પ્રથમ થ્રો થતાં જ તાત્કાલિક પ્રોપેગેશન પુનઃસ્થાપિત કરવા માટે અક્ષમ કરો. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | પ્રૉક્સી પૂલ્સ અને opencodeનું પ્રતિ-એકાઉન્ટ રોટેશન, હમણાં જ નિષ્ફળ થયેલી પ્રૉક્સી (નામંજૂર થયેલી TCP પ્રોબ અથવા તેના દ્વારા પ્રાપ્ત થયેલો 429)ને એવી પ્રતિ-પ્રોસેસ અવધિ માટે ફરી આપવાનું બંધ કરે છે, જે દરેક પુનરાવર્તન સાથે બમણી થાય છે અને મહત્તમ મર્યાદા સુધી જાય છે. કોઈ પ્રૉક્સી સ્ટેટસ લખાતું નથી; દરેક ઉમેદવારને બાજુ પર રાખવામાં આવે તો પસંદગી યથાવત્ રહે છે. ડિફૉલ્ટ રૂપે બંધ. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | ડૅશબોર્ડમાં પ્રૉક્સી પૂલ હેઠળ બતાવો કે છેલ્લા 24 h દરમિયાન કેટલા અવલોકિત એગ્રેસ IPએ તેના સભ્યોને સેવા આપી અને કેટલાં કનેક્શનોએ તેનો ઉપયોગ કર્યો. ફક્ત વાંચવા માટે, પ્રૉક્સી લૉગમાંથી ગણતરી કરવામાં આવે છે અને રૂટિંગ માટે ક્યારેય ઉપયોગ થતો નથી. ડિફૉલ્ટ રૂપે બંધ. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode એક્ઝિક્યુટર માટે, સ્ટ્રીમ કરાયેલા Responses જવાબના પ્રથમ બૉડી બાઇટ પર નજર રાખો (વિન્ડો: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, ડિફૉલ્ટ `15000`). વિન્ડો પૂરી થયા પછી પણ મૌન રહેતી 2xx Responses સ્ટ્રીમને અટકી ગયેલી માનવામાં આવે છે: એકાઉન્ટને કૂલડાઉન કરવામાં આવે છે અને રિક્વેસ્ટને એક વખત આગામી એકાઉન્ટ પર રોટેટ કરવામાં આવે છે; બીજી વાર અટકે તો તરત નિષ્ફળ થાય છે. ડિફૉલ્ટ રૂપે બંધ: અટકેલી સ્ટ્રીમ્સ આજના સ્ટ્રીમ રેડીનેસ ટાઇમઆઉટ સુધી રાહ જોવાનું ચાલુ રાખે છે. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode એક્ઝિક્યુટર: `user_blocked` અસ્વીકાર ધરાવતા 403/451 પર (જિયો નહીં, Cloudflare ફિંગરપ્રિન્ટ અસ્વીકાર નહીં), અસ્વીકારાયેલા એકાઉન્ટને કૂલડાઉન કરો અને પ્રતિ રિક્વેસ્ટ વધુમાં વધુ એક વખત આગામી એકાઉન્ટ પર રોટેટ કરો; બીજો અસ્વીકાર સફળતાના ચિહ્ન વિના, જેમનો તેમ પરત કરવામાં આવે છે. ડિફૉલ્ટ રૂપે બંધ: અપસ્ટ્રીમ યુઝર બ્લૉકની આસપાસ રૂટિંગ કરવું ટાળવા જેવું લાગી શકે છે અને સમગ્ર ફ્લીટમાં ફ્લૅગ ફેલાવી શકે છે. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode રોટેશન: અપસ્ટ્રીમની સતત બે કામચલાઉ નિષ્ફળતાઓ (5xx અથવા ખાલી 400) પછી, આગામી એકાઉન્ટ પહેલાં વિરામ લો — વધુ દરેક નિષ્ફળતા માટે 1.5s બમણો થતો જાય છે, પ્રતિ વિરામ મહત્તમ 6s અને પ્રતિ રિક્વેસ્ટ મહત્તમ 10s સુધી; ક્લાયન્ટ ડિસ્કનેક્ટ થાય ત્યારે તે છોડવામાં આવે છે; રાહ જોતા પહેલાં નિષ્ફળ બૉડી રિલીઝ કરવામાં આવે છે. ડિફૉલ્ટ રૂપે બંધ: ફેઇલઓવર તાત્કાલિક રહે છે. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode રોટેશન: વાસ્તવિક રેટ લિમિટ તરીકે વર્ગીકૃત થયેલા પ્રથમ 429 પર એકાઉન્ટ વેવને રોકો (પાર્સ કરી શકાય તેવું `Retry-After`, અથવા રેટ/યુઝેજ લિમિટ દર્શાવતી બૉડી) અને તે અપસ્ટ્રીમ 429ને ફેરફાર વિના પરત કરો. અવર્ગીકૃત 429 પર રોટેશન ચાલુ રહે છે. ડિફૉલ્ટ રૂપે બંધ: ફ્રી ટિયર પ્રતિ એગ્રેસ IP મર્યાદિત છે (#9611), તેથી દરેક 429 રોટેટ થાય છે અને સમાપ્ત થયેલી વેવ છેલ્લું અપસ્ટ્રીમ 429 પરત કરે છે. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM પ્રૉક્સી માટે TLS સર્ટિફિકેટ વેરિફિકેશન અક્ષમ કરો. **જોખમી.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | ખાનગી/આંતરિક નેટવર્ક તરફ નિર્દેશ કરતા પ્રોવાઇડર URLsને મંજૂરી આપો. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | લોકલ/ખાનગી ઍડ્રેસ (127.0.0.1, localhost, LAN) પર પ્રોવાઇડર્સ ઉમેરવા/વૅલિડેટ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે ચાલુ (લોકલ-ફર્સ્ટ); ફક્ત સાર્વજનિક ઍડ્રેસની કડક મંજૂરી માટે અક્ષમ કરો. Cloud-metadata અવરોધિત જ રહે છે. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code સુસંગત પ્રોવાઇડર મોડ સક્ષમ કરો. | +| કી | પ્રકાર | ડિફૉલ્ટ | વર્ણન | +| --------------------------------------- | ------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | બૂલિયન | `false` | આવતી તમામ વિનંતીઓ માટે API કી આવશ્યક બનાવો. | +| `INPUT_SANITIZER_ENABLED` | બૂલિયન | `true` | તમામ વિનંતીઓ માટે ઇનપુટ સેનિટાઇઝેશન સક્ષમ કરો. | +| `INJECTION_GUARD_MODE` | એનમ | `off` | પ્રોમ્પ્ટ ઇન્જેક્શન ગાર્ડ મોડ. મૂલ્યો: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | બૂલિયન | `false` | વિનંતીઓમાંથી PII રીડેક્ટ કરો (`INPUT_SANITIZER_MODE`થી સ્વતંત્ર). | +| `PII_RESPONSE_SANITIZATION` | બૂલિયન | `false` | પ્રદાતાના પ્રતિસાદોમાંથી PII સેનિટાઇઝ કરો. | +| `PII_RESPONSE_SANITIZATION_MODE` | એનમ | `redact` | PII પ્રતિસાદ સેનિટાઇઝેશન માટેનો મોડ. મૂલ્યો: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | બૂલિયન | `true` | ખાનગી/આંતરિક IP રેન્જ તરફની આઉટબાઉન્ડ વિનંતીઓને અવરોધો. | +| `ALLOW_API_KEY_REVEAL` | બૂલિયન | `false` | પ્રમાણિત ડૅશબોર્ડ વપરાશકર્તાઓને માત્ર માસ્ક કરેલા મૂલ્યો જોવાને બદલે સંગ્રહિત API કી પ્રદર્શિત કરવાની મંજૂરી આપો. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | બૂલિયન | `false` | AUTH લૉગ લાઇનોમાં એકાઉન્ટ પ્રીફિક્સ સામેલ કરો (દા.ત. " એકાઉન્ટ વપરાઈ રહ્યું છે: abc12345..."). ડિફૉલ્ટ રૂપે અક્ષમ છે, જેથી શેર કરેલા/મલ્ટિ-ટેનન્ટ પ્રોસેસ લૉગમાંથી એકાઉન્ટ ઓળખકર્તાઓ રીડેક્ટ થાય. Debug Modeથી સ્વતંત્ર; Debug Mode બદલવાથી આ પ્રદર્શિત થતું નથી. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | બૂલિયન | `false` | OIDC સક્ષમ હોય ત્યારે પાસવર્ડ લૉગિન અક્ષમ કરો, જેથી વપરાશકર્તાઓ ફક્ત OIDC Single Sign-On દ્વારા જ પ્રમાણિત થઈ શકે. અક્ષમ હોય ત્યારે (ડિફૉલ્ટ), પાસવર્ડ લૉગિન અને OIDC બંને ઉપલબ્ધ હોય છે. | + +### નેટવર્ક (16) + +| કી | પ્રકાર | ડિફૉલ્ટ | પુનઃપ્રારંભ | વર્ણન | +| ----------------------------------------------- | ------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS ફિંગરપ્રિન્ટ સ્ટેલ્થ મોડ સક્ષમ કરો. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* રૂટ્સને localhostની બહાર હોસ્ટ કરેલા OpenAI-સુસંગત પ્રદાતા નોડ્સનો ઉપયોગ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ — ઑડિયોને રિમોટ હોસ્ટ પર રૂટ કરવાથી એગ્રેસ ઓળખ બદલાય છે અને તે ઑપરેટરનો સ્પષ્ટ નિર્ણય હોવો આવશ્યક છે. લૂપબૅક નોડ્સને હંમેશાં મંજૂરી છે અને તેમના પર કોઈ અસર થતી નથી. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | POST /v1/rerank (અને મેમરી એન્જિનના લૂપબૅક રીરૅન્ક પગલા)ને localhostની બહાર હોસ્ટ કરેલા OpenAI-સુસંગત પ્રદાતા નોડ્સનો ઉપયોગ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ — રિમોટ હોસ્ટ પર રૂટ કરવાથી એગ્રેસ ઓળખ બદલાય છે અને તે ઑપરેટરનો સ્પષ્ટ નિર્ણય હોવો આવશ્યક છે. લૂપબૅક નોડ્સને હંમેશાં મંજૂરી છે; રિમોટ નોડ્સે પ્રદાતાની આઉટબાઉન્ડ URL નીતિ પણ પાસ કરવી આવશ્યક છે. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | જ્યારે કોઈ કનેક્શનને પ્રૉક્સી ફાળવેલી ન હોય, ત્યારે રજિસ્ટ્રીમાંથી પ્રથમ કાર્યરત પ્રૉક્સી આપમેળે પસંદ કરો. ડિફૉલ્ટ રૂપે બંધ (અન્યથા રજિસ્ટ્રીની કોઈપણ પ્રૉક્સી વૈશ્વિક ફૉલબૅક બની જાય છે — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | પ્રૉક્સી પહોંચક્ષમતાની પૂર્વ-તપાસ નિષ્ફળ જાય ત્યારે OAuth અને પ્રદાતા માન્યતા પ્રવાહોને પિન કરેલી પ્રૉક્સીને બાયપાસ કરીને સીધું કનેક્ટ થવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ, કારણ કે તે એગ્રેસ IP બદલી શકે છે. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | બહુ-એકાઉન્ટ રોટેશન એક્ઝિક્યુટર માટે નેટવર્ક અપવાદ (ટાઇમઆઉટ, કનેક્શન નકારાયું/રીસેટ થયું) આવે ત્યારે, જો નિષ્ફળ થયેલા એકાઉન્ટ પાસે સમર્પિત પ્રૉક્સી ન હોય, તો ટૂંકો કૂલડાઉન લાગુ કરો અને દરેકને ફરી અજમાવવાને બદલે બાકીની વિનંતી માટે પ્રૉક્સી વિનાનાં અન્ય એકાઉન્ટ્સને છોડી દો. ડિફૉલ્ટ રૂપે ચાલુ (સુરક્ષિત: એગ્રેસ IPમાં કોઈ ફેરફાર નહીં, માત્ર શેર કરેલ-એગ્રેસ એકાઉન્ટ્સ પર લેટન્સી/કૂલડાઉનનું જોખમ ઘટાડે છે). પ્રૉક્સી વિનાની પ્રથમ થ્રો પર તાત્કાલિક પ્રસાર પુનઃસ્થાપિત કરવા માટે અક્ષમ કરો. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | પ્રૉક્સી પૂલ્સ અને opencodeનું પ્રતિ-એકાઉન્ટ રોટેશન હમણાં જ નિષ્ફળ થયેલી પ્રૉક્સીને (નકારાયેલી TCP પ્રોબ અથવા તેના મારફતે મળેલો 429) પ્રતિ-પ્રક્રિયા સમયગાળા માટે ફરી સર્વ કરવાનું બંધ કરે છે; આ સમયગાળો દરેક પુનરાવર્તન પર બમણો થાય છે, મહત્તમ મર્યાદા સુધી. કોઈ પ્રૉક્સી સ્થિતિ લખાતી નથી; દરેક ઉમેદવારને બાજુએ રાખવામાં આવે તો પસંદગી અપરિવર્તિત રહે છે. ડિફૉલ્ટ રૂપે બંધ. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | ડૅશબોર્ડમાં પ્રૉક્સી પૂલ હેઠળ બતાવો કે છેલ્લા 24 h દરમિયાન કેટલા અવલોકિત એગ્રેસ IPએ તેના સભ્યોને સેવા આપી અને કેટલાં કનેક્શને તેમનો ઉપયોગ કર્યો. માત્ર વાંચવા યોગ્ય, પ્રૉક્સી લૉગમાંથી ગણતરી કરાયેલું અને રૂટિંગ માટે ક્યારેય ઉપયોગમાં લેવાતું નથી. ડિફૉલ્ટ રૂપે બંધ. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode એક્ઝિક્યુટર માટે, સ્ટ્રીમ કરેલા Responses જવાબના પ્રથમ બૉડી બાઇટ પર નજર રાખો (વિન્ડો: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, ડિફૉલ્ટ `15000`). વિન્ડો પસાર થયા પછી પણ મૌન રહેતી 2xx Responses સ્ટ્રીમને અટવાયેલી માનવામાં આવે છે: એકાઉન્ટને કૂલડાઉન પર મૂકવામાં આવે છે અને વિનંતી એક વખત આગલા એકાઉન્ટ પર રોટેટ થાય છે; બીજી વખત અટકવાથી તરત નિષ્ફળતા થાય છે. ડિફૉલ્ટ રૂપે બંધ: અટવાયેલી સ્ટ્રીમ્સ સ્ટ્રીમની તૈયારીના ટાઇમઆઉટ સુધીની હાલની પ્રતીક્ષા જાળવી રાખે છે. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode એક્ઝિક્યુટર: `user_blocked` અસ્વીકાર ધરાવતા 403/451 પર (જિયો નહીં કે Cloudflare ફિંગરપ્રિન્ટ અસ્વીકાર નહીં), અસ્વીકાર કરાયેલા એકાઉન્ટને થોડા સમય માટે નિષ્ક્રિય કરો અને દરેક વિનંતી દીઠ વધુમાં વધુ એક વાર આગલા એકાઉન્ટ પર ફેરવો; બીજો અસ્વીકાર સફળતાની નિશાની વિના, જેમનો તેમ પરત કરવામાં આવે છે. ડિફૉલ્ટ રૂપે બંધ: અપસ્ટ્રીમ વપરાશકર્તા બ્લૉકને ટાળીને રૂટિંગ કરવું નિયમથી બચવાના પ્રયાસ જેવું લાગી શકે છે અને સમગ્ર ફ્લીટમાં ફ્લૅગ ફેલાવી શકે છે. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode રોટેશન: સતત બે કામચલાઉ અપસ્ટ્રીમ નિષ્ફળતાઓ (5xx અથવા ખાલી 400) પછી, આગલા એકાઉન્ટ પહેલાં વિરામ લો — 1.5sથી શરૂ કરીને દરેક અનુગામી નિષ્ફળતા સાથે બમણો, દરેક વિરામ માટે વધુમાં વધુ 6s અને દરેક વિનંતી માટે 10s સુધી મર્યાદિત, ક્લાયન્ટ ડિસ્કનેક્ટ થાય ત્યારે છોડવામાં આવે છે; રાહ જોતા પહેલાં નિષ્ફળ બૉડી રિલીઝ કરવામાં આવે છે. ડિફૉલ્ટ રૂપે બંધ: ફેઇલઓવર તાત્કાલિક રહે છે. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode રોટેશન: વાસ્તવિક રેટ લિમિટ તરીકે વર્ગીકૃત થયેલા પ્રથમ 429 પર એકાઉન્ટ વેવને રોકો (પાર્સ કરી શકાય તેવું `Retry-After`, અથવા રેટ/વપરાશ મર્યાદાનો ઉલ્લેખ કરતી બૉડી) અને તે અપસ્ટ્રીમ 429ને ફેરફાર વિના પરત કરો. અવર્ગીકૃત 429 પર રોટેશન ચાલુ રહે છે. ડિફૉલ્ટ રૂપે બંધ: ફ્રી ટિયર દરેક એગ્રેસ IP દીઠ મર્યાદિત છે (#9611), તેથી દરેક 429 પર રોટેશન થાય છે અને તમામ વિકલ્પો સમાપ્ત થયેલી વેવ છેલ્લું અપસ્ટ્રીમ 429 પરત કરે છે. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM પ્રૉક્સી માટે TLS પ્રમાણપત્ર ચકાસણી અક્ષમ કરો. **જોખમી.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | ખાનગી/આંતરિક નેટવર્ક તરફ નિર્દેશ કરતા પ્રોવાઇડર URLને મંજૂરી આપો. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | સ્થાનિક/ખાનગી સરનામાં (127.0.0.1, localhost, LAN) પર પ્રોવાઇડર ઉમેરવા/માન્ય કરવા દો. ડિફૉલ્ટ રૂપે ચાલુ (સ્થાનિક-પ્રથમ); માત્ર-જાહેર કડક બ્લૉકિંગ માટે અક્ષમ કરો. Cloud-metadata બ્લૉક કરેલું જ રહે છે. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code સુસંગત પ્રોવાઇડર મોડ સક્ષમ કરો. | ### નીતિઓ (5) -| કી | પ્રકાર | ડિફૉલ્ટ | વર્ણન | -| ------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | ટૂલના ઉપયોગ માટેની નીતિ લાગુ કરવાની સ્થિતિ. મૂલ્યો: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | ઉપયોગની પેટર્નના આધારે દર મર્યાદાને આપમેળે સક્ષમ કરો. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | સીધી સિંગલ-મોડલ વિનંતીઓ માટે OmniRouteની સ્થાનિક કૉન્ટેક્સ્ટ-વિન્ડો / મહત્તમ-ઇનપુટ-ટોકન તપાસને અવગણો. અપસ્ટ્રીમ મર્યાદાઓ હજુ પણ લાગુ પડે છે. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | લક્ષ્ય મોડલમાં જરૂરી ક્ષમતાઓ (વિઝન, ટૂલ્સ, સ્ટ્રક્ચર્ડ આઉટપુટ, કૉન્ટેક્સ્ટ વિન્ડો) ન હોય ત્યારે ડિસ્પૅચ પહેલાં વિનંતીઓને નકારો. આ કૉમ્બો-લેયર સુસંગતતા ફિલ્ટરને બાયપાસ કરતી સીધી સિંગલ-પ્રોવાઇડર વિનંતીઓને સુરક્ષિત કરે છે. | -| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar મૉડ્યૂલ (કૅટલૉગ ફીડ સ્ક્રીનો અને સિંક) સક્ષમ કરો. ડિફૉલ્ટ રૂપે બંધ હોય છે; તેને સક્ષમ કરવાથી માત્ર UI અનલૉક થાય છે — ડેટા સિંક માટે અલગથી ઑપ્ટ-ઇન કરવું જરૂરી છે. | - -### રનટાઇમ (32) - -| કી | પ્રકાર | ડિફૉલ્ટ | રીસ્ટાર્ટ | વર્ણન | -| ------------------------------------------- | ------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | કૉમ્બો રૂટિંગ મોડલ બદલે ત્યારે વાર્તાલાપના સારાંશ જનરેટ કરીને ઇન્જેક્ટ કરો. મોડલ સ્વિચને સ્વતંત્ર રીતે ગણવા અને હાલના તથા ભવિષ્યના તમામ કૉમ્બો માટે બૅકગ્રાઉન્ડ હૅન્ડઑફ વિનંતીઓ અટકાવવા આને અક્ષમ કરો. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | ક્લાયન્ટ્સને ફૉર્વર્ડ કરતાં પહેલાં Responses API પાસથ્રૂ સ્ટ્રીમમાંથી આંતરિક commentary-ફેઝ આઉટપુટ આઇટમ દૂર કરો. કાચી અપસ્ટ્રીમ commentary મેળવવા આને અક્ષમ કરો. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | MCP ટૂલ ઍક્સેસ પર સ્કોપ પ્રતિબંધો લાગુ કરો. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | ટોકનનો ઉપયોગ ઘટાડવા MCP ટૂલનાં વર્ણનો સંકુચિત કરો. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | રનટાઇમ દરમિયાન બૅકગ્રાઉન્ડ ટાસ્ક પ્રોસેસિંગ સક્ષમ કરો. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | બધી બૅકગ્રાઉન્ડ સેવાઓ (ક્વોટા રિફ્રેશ, સિંક વગેરે) અક્ષમ કરો. | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | ચકાસણી વિના પ્રોજેક્ટ-સ્તરના RTK ફિલ્ટર્સ પર વિશ્વાસ કરો. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | ઇમ્પોર્ટ વખતે રિયલ-ટાઇમ ડૅશબોર્ડ WebSocket સર્વર શરૂ કરો (ડિફૉલ્ટ રૂપે પોર્ટ 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codexને Responses-over-WebSocket ટ્રાન્સપોર્ટનો ઉપયોગ કરવાની મંજૂરી આપો. બંધ હોય ત્યારે Codex HTTP Responses પર પાછું ફરે છે. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codexને સ્થાનિક app-server WebSocket JSON-RPC ટ્રાન્સપોર્ટ (codexTransport=app-server)નો ઉપયોગ કરવાની મંજૂરી આપો. બંધ હોય ત્યારે app-server પસંદ કરેલાં કનેક્શન્સ Codexના અન્ય ટ્રાન્સપોર્ટ પર પાછાં ફરે છે. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | બજેટ સમાપ્ત થઈ ગયેલી વિનંતીઓને ઇમર્જન્સી મફત ફૉલબૅક પ્રોવાઇડર/મોડલ તરફ રૂટ કરો. (નીચે [ઇમર્જન્સી બજેટ ફૉલબૅક](#emergency-budget-fallback) જુઓ.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | કોઈપણ પ્રતિસાદ બાઇટ્સ ક્લાયન્ટ સુધી પહોંચે તે પહેલાં અધૂરી રહેલી અપસ્ટ્રીમ SSE સ્ટ્રીમ માટે પારદર્શક વહેલી પુનઃપ્રયાસ પ્રક્રિયા સક્ષમ કરો. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | બાઇટ્સ પહેલેથી જ ક્લાયન્ટ સુધી પહોંચી ગયા પછી સ્ટ્રીમ રિકવરીને પ્રતિસાદ ફરીથી માગવાની અને જોડવાની મંજૂરી આપો. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | મધ્ય-સ્ટ્રીમ ચાલુ રાખવાની પ્રક્રિયાને ટૂલ-કૉલ માટે સુરક્ષિત બનાવો: ટૂલ કૉલ ઉત્સર્જિત થયા પછી (ચાલુ હોય અથવા finish_reason tool_calls સાથે પહેલેથી પૂર્ણ થયો હોય) કાપેલી સ્ટ્રીમને ક્યારેય ફરી શરૂ કરશો નહીં અને સમગ્ર બજેટ ખર્ચવાને બદલે એક ખાલી continuation પછી બંધ કરો. બંધ: રિલીઝ વર્તન. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | જ્યારે કોઈ ઉપયોગી ફ્રેમ ઉત્સર્જિત કરતાં પહેલાં SSE સ્ટ્રીમ બંધ થઈ જાય અને મર્યાદિત સમાન-કનેક્શન પુનઃપ્રયાસ વપરાઈ ચૂક્યો હોય ત્યારે sibling કનેક્શન પર એકવાર ફેઇલઓવર કરો; ઉપયોગી sibling ન હોય તો મૂળ `STREAM_EARLY_EOF` 502 પરત કરવામાં આવે છે. ડિફૉલ્ટ રૂપે બંધ: સમાન-કનેક્શન પુનઃપ્રયાસ પછી early-EOF અંતિમ રહે છે. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` પ્રતિસાદોમાં ડિસ્પ્લે માટે અનુકૂળ નામ ફીલ્ડ્સ સામેલ કરો. માત્ર મોડલ IDની અપેક્ષા રાખતા ક્લાયન્ટ્સ માટે આને અક્ષમ કરો. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | /v1/modelsમાં મોડલ IDને કેવી રીતે પ્રીફિક્સ આપવામાં આવે છે તે નિયંત્રિત કરે છે. 'dual' (ડિફૉલ્ટ) પાછળની સુસંગતતા માટે alias અને canonical provider-id બંને પ્રીફિક્સ ઉત્સર્જિત કરે છે. 'alias' માત્ર ટૂંકો alias પ્રીફિક્સ ઉત્સર્જિત કરે છે (દા.ત. ds-web/model, deepseek-web/model નહીં). 'canonical' માત્ર સંપૂર્ણ provider-id પ્રીફિક્સ ઉત્સર્જિત કરે છે. મૂલ્યો: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | મોડલ ઇન્ટેલિજન્સ રૅન્કિંગ્સ માટે સમયાંતરે Arena AI લીડરબોર્ડ ELO સિંક સક્ષમ કરો. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `/v1/models` પર `claude//` mirror IDની જાહેરાત કરો, જેથી Claude Code ગેટવે મોડલ ડિસ્કવરીમાં non-Claude મોડલ સૂચિબદ્ધ થાય. ત્રણ-સ્તરીય ગેટનું વૈશ્વિક સ્તર (env ડૅશબોર્ડ ઓવરરાઇડ કરતાં પ્રાધાન્ય પામે છે). [Claude Code કન્ફિગરેશન](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) જુઓ. | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// ગેટવે aliases માટેનો મુખ્ય સ્વિચ. ચાલુ (ડિફૉલ્ટ): /v1/models દરેક પાત્ર thinking-capable Claude મોડલ માટે no-thinking વેરિઅન્ટની જાહેરાત કરે છે અને વિનંતીમાં મોકલાયેલ no-think/ ID reasoning દબાવીને પાછું વાસ્તવિક મોડલ તરીકે રિઝૉલ્વ થાય છે. બંધ: કોઈ વેરિઅન્ટની જાહેરાત થતી નથી અને no-think/ IDને અન્ય કોઈપણ અજ્ઞાત મોડલ IDની જેમ ગણવામાં આવે છે. આ ચાલુ હોય ત્યારે પ્રતિ-મોડલ ModelSpec.noThinkingAlias opt-in/opt-out હજી પણ લાગુ પડે છે. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | /v1/models કૅટલૉગમાં thinking level વેરિઅન્ટ્સ (દા.ત. -low, -medium, -high)નું જનરેશન અક્ષમ કરો. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | પ્રોવાઇડર ડિસ્પૅચ (#9654) માટે પ્રતિ-ટેનન્ટ અનુકૂલનશીલ virtual admission lanes સક્ષમ કરો: હવે એક ટેનન્ટનો બર્સ્ટ બીજા ટેનન્ટ માટે 503 સર્જતો નથી. OMNIROUTE_CHAT_VIRTUAL_LANES env var આ ડૅશબોર્ડ ઓવરરાઇડ કરતાં પ્રાધાન્ય પામે છે; ફેરફારો સર્વર રીસ્ટાર્ટ વખતે અમલમાં આવે છે. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | એવા મોડલ માટે /v1/models પર / mirror IDની જાહેરાત કરો, જેમના canonical માલિક પાસે કોઈ સક્રિય credential નથી, પરંતુ સક્રિય credential ધરાવતો passthrough ગેટવે તેમને રૂટ કરે છે. ચેતવણી: વૈશ્વિક રીતે સક્ષમ હોય ત્યારે બધા ક્લાયન્ટ્સ માટે કૅટલૉગ એન્ટ્રીઓ ઉમેરે છે. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API aggregator-સુસંગત નોડ્સ માટે બૅલેન્સ શોધ સક્ષમ કરો. સક્ષમ હોય ત્યારે aggregator ફ્લૅગ સેટ કરેલા સુસંગત નોડ્સ ડૅશબોર્ડ અને quota-preflight રૂટિંગમાં તેમનું બૅલેન્સ રિપોર્ટ કરશે. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | મોડલ ક્લાયન્ટ-ઉપયોગી પ્રતિસાદ પરત કરે ત્યાં સુધી non-streaming સર્વર-માલિકીવાળા ટૂલ કૉલ્સ ચાલુ રાખો. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | શોધના આંકડા અને તાજેતરની શોધોમાં માત્ર એવા પ્રોવાઇડર્સની ગણતરી કરો જેમની પાસે હજી live કનેક્શન છે (duckduckgo-free જેવા keyless પ્રોવાઇડર્સ હંમેશા ગણાય છે). બંધ રાખવાથી provider ID ધરાવતી દરેક સાચવી રાખેલી search row જળવાય છે. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | ડૅશબોર્ડ પ્રોવાઇડર પેજ: Free બૅજ માત્ર પ્રોવાઇડર માન્ય રાખે તેવા સંકેતો પર જ બતાવો — documented free tier વિનાના registered પ્રોવાઇડર્સ પર display-name heuristic, non-boolean free fields અને :free suffixes દૂર કરે છે. બંધ રાખવાથી ઐતિહાસિક બૅજ નિયમ જળવાય છે. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | એકત્રિત 429/503 unavailable પ્રતિસાદોમાં, જ્યારે કોઈ ચોક્કસ ભાવિ retry સમય જાણીતો ન હોય ત્યારે (કૃત્રિમ 1sને બદલે) `Retry-After` છોડો, `error.retry_after_provenance` (`signal` \| `none`) ઉમેરો અને combo drain pathsને JSON તથા plain-text અપસ્ટ્રીમ bodiesમાંથી ગદ્યરૂપ retry સંકેતો વાંચવા દો. આ ફીલ્ડ માત્ર `unavailableResponse()` દ્વારા બનાવાયેલા પ્રતિસાદોમાં દેખાય છે; અન્ય 429/503 bodies અપરિવર્તિત રહે છે. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | જ્યારે fallback-only-on-quota-exhaustion તરીકે ચિહ્નિત `priority` combo target સાબિત રીતે quota ન હોય તેવા કારણસર comboને અટકાવે (provider circuit breaker open, predictive latency skip), ત્યારે quota જેવો લાગતો 503 આપવાને બદલે 502 આપો. Lockout, cooldown, unavailable, exhaustion અને concurrency-cap stops માટે 503 જ રહે છે. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | સાદો Mistral 401 (`{"detail":"Unauthorized"}`, કોઈ સ્પષ્ટ auth signal નહીં) revoked key અને exhausted quota બંને માટે સમાન છે. ચાલુ હોય ત્યારે, કનેક્શનને `expired` તરીકે પાર્ક કરવાને બદલે cooldownમાં મૂકે છે, પ્રતિ કનેક્શન પ્રતિ કલાક વધુમાં વધુ 3 વખત; ત્યારપછીનો પ્રયાસ તેને પાર્ક કરે છે, જેથી revoked key અંતે સ્થિર સ્થિતિએ પહોંચે છે. ડિફૉલ્ટ રૂપે બંધ: પહેલાંની જેમ દરેક સાદો Mistral 401 કનેક્શનને પાર્ક કરે છે. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | સ્થિર static seedને બદલે OAuth bearer tokenનો ઉપયોગ કરીને `https://api.x.ai/v1/models` પરથી `xai-oauth` કનેક્શન્સ માટે live xAI model catalog મેળવો. ડિફૉલ્ટ રૂપે બંધ: `xai-oauth` static seedને અપરિવર્તિત રીતે સર્વ કરવાનું ચાલુ રાખે છે. કોઈપણ resolution error પર discovery seed પર પાછી ફરે છે (આ endpoint પર x.ai OAuth bearer સ્વીકારે છે કે નહીં તે ચકાસાયેલ નથી). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | સ્વચાલિત cleanup sweepને `OMNIROUTE_BATCH_RETENTION_DAYS` કરતાં જૂના terminal (completed/failed/cancelled/expired) Batch API jobs તેમની per-line checkpoints સાથે કાઢી નાખવા અને પોતાની `expires_at` સમયમર્યાદા વટાવી ચૂકેલી uploaded filesનું BLOB content સાફ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ: operator opt in ન કરે ત્યાં સુધી દરેક હાલનું installation આ dataને પહેલાંની જેમ જ રાખે છે. Operator દ્વારા trigger કરાયેલ `DELETE /api/v1/batches/delete-completed` route પર કોઈપણ સ્થિતિમાં અસર થતી નથી — તે અલગ, બિનશરતી public API contract છે. | +| કી | પ્રકાર | ડિફૉલ્ટ | વર્ણન | +| ------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | ટૂલ-ઉપયોગ નીતિ અમલીકરણ મોડ. મૂલ્યો: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | વપરાશ પેટર્નના આધારે રેટ લિમિટિંગ આપમેળે સક્ષમ કરો. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | સીધી સિંગલ-મૉડલ વિનંતીઓ માટે OmniRouteની સ્થાનિક કૉન્ટેક્સ્ટ-વિન્ડો / મહત્તમ-ઇનપુટ-ટોકન ચકાસણી છોડો. અપસ્ટ્રીમ મર્યાદાઓ હજુ પણ લાગુ પડે છે. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | લક્ષ્ય મૉડલમાં જરૂરી ક્ષમતાઓ (વિઝન, ટૂલ્સ, સ્ટ્રક્ચર્ડ આઉટપુટ, કૉન્ટેક્સ્ટ વિન્ડો) ન હોય ત્યારે ડિસ્પૅચ પહેલાં વિનંતીઓ નકારો. આ કૉમ્બો-લેયર સુસંગતતા ફિલ્ટરને બાયપાસ કરતી સીધી સિંગલ-પ્રોવાઇડર વિનંતીઓનું રક્ષણ કરે છે. | +| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar મૉડ્યુલ (કૅટલૉગ ફીડ સ્ક્રીન અને સિંક) સક્ષમ કરો. ડિફૉલ્ટ રૂપે બંધ; સક્ષમ કરવાથી માત્ર UI અનલૉક થાય છે — ડેટા સિંક માટે હજી પણ અલગ ઑપ્ટ-ઇન જરૂરી છે. | + +### રનટાઇમ (33) + +| કી | પ્રકાર | ડિફૉલ્ટ | પુનઃપ્રારંભ | વર્ણન | +| ------------------------------------------- | ------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | કોમ્બો રાઉટિંગ દ્વારા મોડેલ બદલાય ત્યારે વાર્તાલાપના સારાંશ જનરેટ કરીને દાખલ કરો. મોડેલ સ્વિચને સ્વતંત્ર રીતે ગણવા અને હાલના તથા ભવિષ્યના તમામ કોમ્બો માટે બૅકગ્રાઉન્ડ હેન્ડઑફ વિનંતીઓને રોકવા આને અક્ષમ કરો. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | ક્લાયન્ટ્સને ફૉર્વર્ડ કરતા પહેલાં Responses API પાસથ્રૂ સ્ટ્રીમ્સમાંથી આંતરિક કોમેન્ટરી-તબક્કાની આઉટપુટ આઇટમ્સ દૂર કરો. મૂળ અપસ્ટ્રીમ કોમેન્ટરી મેળવવા આને અક્ષમ કરો. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | MCP ટૂલ ઍક્સેસ પર સ્કોપ પ્રતિબંધો લાગુ કરો. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | ટોકનનો ઉપયોગ ઘટાડવા માટે MCP ટૂલનાં વર્ણનો સંકુચિત કરો. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | રનટાઇમ દરમિયાન બૅકગ્રાઉન્ડ ટાસ્ક પ્રોસેસિંગ સક્ષમ કરો. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | બધી બૅકગ્રાઉન્ડ સેવાઓ (ક્વોટા રિફ્રેશ, સિંક વગેરે) અક્ષમ કરો. | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | માન્યતા ચકાસણી વિના પ્રોજેક્ટ-સ્તરના RTK ફિલ્ટર્સ પર વિશ્વાસ કરો. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | ઇમ્પોર્ટ વખતે રીઅલ-ટાઇમ ડૅશબોર્ડ WebSocket સર્વર શરૂ કરો (ડિફૉલ્ટ રૂપે પોર્ટ 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codexને Responses-over-WebSocket ટ્રાન્સપોર્ટનો ઉપયોગ કરવાની મંજૂરી આપો. બંધ હોય ત્યારે, Codex HTTP Responses પર પાછું ફરે છે. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codexને સ્થાનિક app-server WebSocket JSON-RPC ટ્રાન્સપોર્ટ (codexTransport=app-server)નો ઉપયોગ કરવાની મંજૂરી આપો. બંધ હોય ત્યારે, app-server પસંદ કરેલા કનેક્શન્સ Codexના અન્ય ટ્રાન્સપોર્ટ્સ પર પાછા ફરે છે. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | બજેટ સમાપ્ત થયેલી વિનંતીઓને ઇમર્જન્સી મફત ફૉલબૅક પ્રદાતા/મોડલ તરફ રૂટ કરો. (નીચે [ઇમર્જન્સી બજેટ ફૉલબૅક](#emergency-budget-fallback) જુઓ.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | કોઈપણ પ્રતિસાદ બાઇટ્સ ક્લાયન્ટ સુધી પહોંચે તે પહેલાં અધવચ્ચે કપાયેલા અપસ્ટ્રીમ SSE સ્ટ્રીમ્સ માટે પારદર્શક પ્રારંભિક પુનઃપ્રયાસ સક્ષમ કરો. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | બાઇટ્સ પહેલેથી ક્લાયન્ટ સુધી પહોંચી ગયા પછી સ્ટ્રીમ પુનઃપ્રાપ્તિને પ્રતિસાદની ફરી વિનંતી કરવાની અને તેને જોડવાની મંજૂરી આપો. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | મધ્ય-સ્ટ્રીમ ચાલુ રાખવાની પ્રક્રિયાને ટૂલ-કૉલ માટે સુરક્ષિત બનાવો: ટૂલ કૉલ ઉત્સર્જિત થયા પછી (પ્રગતિમાં હોય અથવા `finish_reason` `tool_calls` સાથે પહેલેથી પૂર્ણ થયો હોય) કપાયેલા સ્ટ્રીમને ક્યારેય ફરી શરૂ ન કરો અને આખું બજેટ ખર્ચવાને બદલે એક ખાલી ચાલુ રાખવાની પ્રક્રિયા પછી બંધ કરો. બંધ: રિલીઝ વર્તણૂક. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | કોઈ ઉપયોગી ફ્રેમ ઉત્સર્જિત થાય તે પહેલાં SSE સ્ટ્રીમ બંધ થઈ જાય અને મર્યાદિત સમાન-કનેક્શન પુનઃપ્રયાસ પૂર્ણ થઈ ગયો હોય ત્યારે સિબ્લિંગ કનેક્શન પર એક વખત ફેલઓવર કરો; કોઈ ઉપયોગી સિબ્લિંગ ન હોય તો મૂળ `STREAM_EARLY_EOF` 502 પરત કરવામાં આવે છે. ડિફૉલ્ટ રૂપે બંધ: સમાન-કનેક્શન પુનઃપ્રયાસ પછી early-EOF અંતિમ રહે છે. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` પ્રતિસાદોમાં પ્રદર્શન માટે અનુકૂળ નામ ફીલ્ડ્સ સામેલ કરો. માત્ર મોડેલ IDની અપેક્ષા રાખતા ક્લાયન્ટ્સ માટે આને અક્ષમ કરો. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | /v1/modelsમાં મોડેલ IDને કેવી રીતે પ્રિફિક્સ કરવામાં આવે છે તે નિયંત્રિત કરે છે. પાછળની સુસંગતતા માટે 'dual' (ડિફૉલ્ટ) ઉપનામ અને કેનોનિકલ provider-id બંને પ્રિફિક્સ ઉત્સર્જિત કરે છે. 'alias' માત્ર ટૂંકો ઉપનામ પ્રિફિક્સ ઉત્સર્જિત કરે છે (દા.ત. ds-web/model, deepseek-web/model નહીં). 'canonical' માત્ર સંપૂર્ણ provider-id પ્રિફિક્સ ઉત્સર્જિત કરે છે. મૂલ્યો: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | મોડેલ ઇન્ટેલિજન્સ રેન્કિંગ્સ માટે સમયાંતરે Arena AI લીડરબોર્ડ ELO સિંક સક્ષમ કરો. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `/v1/models` પર `claude//` મિરર ID જાહેર કરો, જેથી Claude Code ગેટવે મોડેલ ડિસ્કવરીમાં બિન-Claude મોડેલો સૂચિબદ્ધ થાય. ત્રણ-સ્તરીય ગેટનું વૈશ્વિક સ્તર (env ડેશબોર્ડ ઓવરરાઇડ કરતાં અગ્રતા મેળવે છે). [Claude Code કૉન્ફિગરેશન](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) જુઓ. | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// ગેટવે ઉપનામો માટેનું મુખ્ય સ્વિચ. ચાલુ (ડિફૉલ્ટ): /v1/models દરેક પાત્ર, વિચાર-સક્ષમ Claude મોડેલ માટે વિચારણા-રહિત વેરિઅન્ટ જાહેર કરે છે, અને વિનંતીમાં મોકલાયેલ no-think/ ID વિચારણાને દબાવીને પાછું વાસ્તવિક મોડેલ તરીકે રિઝોલ્વ થાય છે. બંધ: કોઈ વેરિઅન્ટ જાહેર થતા નથી અને no-think/ IDને અન્ય કોઈપણ અજ્ઞાત મોડેલ IDની જેમ ગણવામાં આવે છે. આ ચાલુ હોય ત્યારે પણ પ્રતિ-મોડેલ ModelSpec.noThinkingAlias opt-in/opt-out લાગુ પડે છે. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | /v1/models કૅટલોગમાં વિચારણા સ્તરના વેરિઅન્ટ્સ (દા.ત. -low, -medium, -high)નું નિર્માણ અક્ષમ કરો. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | પ્રોવાઇડર ડિસ્પેચ (#9654) માટે પ્રતિ-ટેનન્ટ અનુકૂલનશીલ વર્ચ્યુઅલ એડમિશન લેન સક્ષમ કરો: હવે એક ટેનન્ટનો અચાનક વધેલો ટ્રાફિક બીજા ટેનન્ટ માટે 503 સર્જતો નથી. `OMNIROUTE_CHAT_VIRTUAL_LANES` env var આ ડેશબોર્ડ ઓવરરાઇડ કરતાં અગ્રતા મેળવે છે; ફેરફારો સર્વર પુનઃપ્રારંભ વખતે અમલમાં આવે છે. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | એવા મોડલ્સ માટે /v1/models પર / મિરર ids જાહેર કરો, જેમના canonical owner પાસે કોઈ સક્રિય credential નથી, પરંતુ સક્રિય credential ધરાવતું passthrough gateway તેમને route કરે છે. ચેતવણી: વૈશ્વિક રીતે સક્ષમ કરવાથી બધા clients માટે catalog entries ઉમેરાય છે. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API aggregator સાથે સુસંગત nodes માટે balance detection સક્ષમ કરો. સક્ષમ હોય ત્યારે, aggregator flag સેટ કરેલા સુસંગત nodes dashboard અને quota-preflight routingમાં તેમનું balance દર્શાવશે. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | જ્યાં સુધી model client માટે ઉપયોગી response પરત ન કરે ત્યાં સુધી non-streaming server-owned tool calls ચાલુ રાખો. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Search stats અને recent searchesમાં માત્ર એવા providersની ગણતરી કરો કે જેમની પાસે હજુ પણ live connection છે (duckduckgo-free જેવા keyless providers હંમેશાં ગણાય છે). બંધ હોય ત્યારે provider id ધરાવતી દરેક retained search row રાખવામાં આવે છે. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Dashboard provider pages: Free badge માત્ર provider દ્વારા માન્ય રાખવામાં આવતા signals પર જ બતાવો — documented free tier વિનાના registered providers માટે display-name heuristic, non-boolean free fields અને :free suffixes અવગણો. બંધ હોય ત્યારે ઐતિહાસિક badge rule યથાવત્ રહે છે. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | એકત્રિત 429/503 unavailable responses પર, જ્યારે ભવિષ્યનો કોઈ ચોક્કસ retry સમય જાણીતો ન હોય ત્યારે `Retry-After` અવગણો (કૃત્રિમ 1sને બદલે), `error.retry_after_provenance` (`signal` \| `none`) ઉમેરો અને combo drain pathsને JSON તથા plain-text upstream bodiesમાંથી prose retry hints વાંચવા દો. આ field માત્ર `unavailableResponse()` દ્વારા બનાવેલા responses પર જ દેખાય છે; અન્ય 429/503 bodies અપરિવર્તિત રહે છે. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | જ્યારે fallback-only-on-quota-exhaustion તરીકે ચિહ્નિત `priority` combo target એવી રીતે combo અટકાવે છે કે જેનું કારણ સાબિત રીતે quota નથી (provider circuit breaker open, predictive latency skip), ત્યારે quota જેવો દેખાતો 503 આપવાને બદલે 502 આપો. Lockout, cooldown, unavailable, exhaustion અને concurrency-cap stops માટે 503 યથાવત્ રહે છે. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | એક સામાન્ય Mistral 401 (`{"detail":"Unauthorized"}`, કોઈ explicit auth signal નહીં) revoked key અને exhausted quota માટે સમાન હોય છે. સક્ષમ હોય ત્યારે, connectionને `expired` તરીકે park કરવાને બદલે તેને cool down કરે છે, દરેક connection દીઠ પ્રતિ કલાક વધુમાં વધુ 3 વખત; ત્યાર પછીનું response તેને park કરે છે, જેથી revoked key હજી પણ converge થાય. ડિફૉલ્ટ રૂપે બંધ: દરેક સામાન્ય Mistral 401 પહેલાંની જેમ connectionને park કરે છે. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | સ્થિર કરેલા સ્ટેટિક સીડને બદલે OAuth બેરર ટોકનનો ઉપયોગ કરીને `https://api.x.ai/v1/models` પરથી `xai-oauth` કનેક્શન્સ માટે લાઇવ xAI મોડેલ કૅટલૉગ મેળવો. ડિફૉલ્ટ રૂપે બંધ: `xai-oauth` કોઈ ફેરફાર વિના સ્ટેટિક સીડ આપવાનું ચાલુ રાખે છે. કોઈપણ રિઝોલ્યુશન ભૂલ થાય તો, ડિસ્કવરી સીડ પર પાછી ફરે છે (આ એન્ડપૉઇન્ટ પર x.ai OAuth બેરર સ્વીકારે છે કે નહીં તે ચકાસાયેલું નથી). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | ઑટોમૅટિક ક્લીનઅપ સ્વીપને `OMNIROUTE_BATCH_RETENTION_DAYS` કરતાં જૂની ટર્મિનલ (પૂર્ણ/નિષ્ફળ/રદ થયેલી/સમાપ્ત થયેલી) Batch API જૉબ્સને તેમની પ્રત્યેક-લાઇન ચેકપૉઇન્ટ્સ સાથે કાઢી નાખવા અને તેમની પોતાની `expires_at` મર્યાદા વટાવી ચૂકેલી અપલોડ કરેલી ફાઇલોની BLOB સામગ્રી સાફ કરવાની મંજૂરી આપો. ડિફૉલ્ટ રૂપે બંધ: ઑપરેટર તેને પસંદ કરીને સક્ષમ ન કરે ત્યાં સુધી દરેક હાલનું ઇન્સ્ટૉલેશન આ ડેટાને પહેલાની જેમ જ રાખે છે. ઑપરેટર દ્વારા ટ્રિગર થતો `DELETE /api/v1/batches/delete-completed` રૂટ કોઈપણ સ્થિતિમાં અપ્રભાવિત રહે છે — તે એક અલગ, બિનશરતી સાર્વજનિક API કરાર છે. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | પસંદ કરેલા Antigravity એકાઉન્ટને તે પસંદ કરનાર રિક્વેસ્ટના સ્ટ્રીમિંગ જીવનચક્ર માટે આરક્ષિત કરો, જેથી સમકાલીન પુનઃપ્રયાસ અથવા ક્રેડેન્શિયલ હેન્ડઑફ પહેલેથી જ પ્રગતિમાં રહેલા સ્ટ્રીમ માટે પ્રતિબદ્ધ એકાઉન્ટને ફરીથી પસંદ ન કરી શકે. આ આરક્ષણ (કનેક્શન, કૉલ કરી શકાય તેવું અપસ્ટ્રીમ મોડેલ) સુધી મર્યાદિત છે, તેથી એક એકાઉન્ટ હજી પણ એક જ સમયે બે અલગ મોડેલને સેવા આપી શકે છે. જ્યારે દરેક પાત્ર એકાઉન્ટ તે મોડેલ માટે પહેલેથી જ લીઝ પર હોય, ત્યારે રિક્વેસ્ટ વ્યસ્ત એકાઉન્ટ પર વધુ ભાર મૂકવાને બદલે મર્યાદિત `Retry-After` સાથે સંરચિત 503 `antigravity_pool_busy` પરત કરે છે. ડિફૉલ્ટ રૂપે બંધ: એકાઉન્ટની પસંદગી પહેલાની જેમ જ રહે છે અને કોઈ આરક્ષણ લેવામાં આવતું નથી. | ### CLI (5) -| કી | પ્રકાર | ડિફૉલ્ટ | પુનઃપ્રારંભ | વર્ણન | -| ------------------------------------- | ------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | બધા CLI ક્લાયન્ટ માટે સુસંગતતા મોડ સક્ષમ કરો. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | મોડેલ ઉપનામ સુસંગતતા સ્તર સક્ષમ કરો. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | કિંમત-નિર્ધારણ ડેટાનું આપમેળે સમન્વયન સક્ષમ કરો (આ માટે `PRICING_SYNC_ENABLED` પર્યાવરણ વેરિયેબલ પણ જરૂરી છે). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | પ્રદાતા મોડેલના સમન્વયન પછી, લાઇવ કેટલોગમાંથી ~/.codex/*.config.toml પ્રોફાઇલ ફાઇલો આપમેળે (ફરીથી) લખો. સક્રિય/ડિફૉલ્ટ Codex કન્ફિગને ક્યારેય બદલતું નથી. ડિફૉલ્ટ રૂપે બંધ છે. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | પ્રદાતા મોડેલના સમન્વયન પછી, લાઇવ કેટલોગમાંથી ~/.claude/profiles//settings.json Claude Code પ્રોફાઇલો આપમેળે (ફરીથી) લખો. સક્રિય/ડિફૉલ્ટ Claude કન્ફિગને ક્યારેય બદલતું નથી. ડિફૉલ્ટ રૂપે બંધ છે. | +| કી | પ્રકાર | ડિફૉલ્ટ | પુનઃપ્રારંભ | વર્ણન | +| ------------------------------------- | ------- | ------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | બધા CLI ક્લાયન્ટ્સ માટે સુસંગતતા મોડ સક્ષમ કરો. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | મોડેલ એલિયાસ સુસંગતતા લેયર સક્ષમ કરો. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | કિંમત-નિર્ધારણ ડેટાનું ઑટોમૅટિક સિંક્રનાઇઝેશન સક્ષમ કરો (`PRICING_SYNC_ENABLED` એન્વાયરમેન્ટ વેરિએબલ પણ જરૂરી છે). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | પ્રોવાઇડર મોડેલ સિંક પછી, લાઇવ કૅટલૉગમાંથી ~/.codex/*.config.toml પ્રોફાઇલ ફાઇલો ઑટોમૅટિક રીતે (ફરીથી) લખો. સક્રિય/ડિફૉલ્ટ Codex કૉન્ફિગને ક્યારેય બદલતું નથી. ડિફૉલ્ટ રૂપે બંધ. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | પ્રોવાઇડર મોડેલ સિંક પછી, લાઇવ કૅટલૉગમાંથી ~/.claude/profiles//settings.json Claude Code પ્રોફાઇલ્સ ઑટોમૅટિક રીતે (ફરીથી) લખો. સક્રિય/ડિફૉલ્ટ Claude કૉન્ફિગને ક્યારેય બદલતું નથી. ડિફૉલ્ટ રૂપે બંધ. | ### આરોગ્ય (5) -| કી | પ્રકાર | ડિફૉલ્ટ | વર્ણન | -| ----------------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | સ્થાનિક ઇન્સ્ટન્સનું આરોગ્ય-તપાસ એન્ડપોઇન્ટ અક્ષમ કરો. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | ટોકન માન્યતા આરોગ્ય-તપાસ અક્ષમ કરો. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | કૌશલ્ય સેન્ડબૉક્સ પર્યાવરણમાં નેટવર્ક ઍક્સેસ સક્ષમ કરો. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | પ્રોક્સી આરોગ્ય સ્વીપમાં, લક્ષ્ય દ્વારા નકારવામાં આવેલી તપાસ (401/403/429) પ્રોક્સીની સળંગ નિષ્ફળતાઓની શ્રેણી રીસેટ કરે છે. ડિફૉલ્ટ રૂપે બંધ: નકાર તટસ્થ રહે છે (#10654). 5xx કોઈપણ સ્થિતિમાં અનિર્ણાયક રહે છે; નકાર ક્યારેય પ્રોક્સીને દૂર, અક્ષમ અથવા ફરી સક્રિય કરતો નથી. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | સ્ટાર્ટઅપ પૂર્ણ થાય ત્યાં સુધી તેને અવરોધવાને બદલે, સર્વર વિનંતીઓ સ્વીકારવાનું શરૂ કરે ત્યાર પછી (`setImmediate` દ્વારા) સ્ટાર્ટઅપ DB અખંડિતતા/આરોગ્ય-તપાસ ચલાવો (#13717). ડિફૉલ્ટ રૂપે બંધ: સ્ટાર્ટઅપ આ PR પહેલાંની જેમ જ અવરોધાય છે. | +| કી | પ્રકાર | ડિફૉલ્ટ | વર્ણન | +| ----------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | સ્થાનિક ઇન્સ્ટન્સનું હેલ્થ ચેક એન્ડપૉઇન્ટ અક્ષમ કરો. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | ટોકન માન્યતા હેલ્થ ચેક અક્ષમ કરો. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | સ્કિલ્સ સૅન્ડબૉક્સ પર્યાવરણમાં નેટવર્ક ઍક્સેસ સક્ષમ કરો. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | પ્રૉક્સી હેલ્થ સ્વીપમાં, લક્ષ્ય દ્વારા નકારવામાં આવેલ પ્રોબ (401/403/429) પ્રૉક્સીની સળંગ નિષ્ફળતાઓની શ્રેણીને રીસેટ કરે છે. ડિફૉલ્ટ રૂપે બંધ: નકાર તટસ્થ રહે છે (#10654). કોઈપણ સ્થિતિમાં 5xx અનિર્ણાયક રહે છે; નકાર ક્યારેય પ્રૉક્સીને દૂર, અક્ષમ કે ફરી સક્રિય કરતો નથી. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | સ્ટાર્ટઅપ પૂર્ણ થાય ત્યાં સુધી તેને અવરોધવાને બદલે, સર્વર વિનંતીઓ સ્વીકારવાનું શરૂ કરે ત્યાર પછી (`setImmediate` મારફતે) સ્ટાર્ટઅપ DB અખંડિતતા/હેલ્થ ચેક ચલાવો (#13717). ડિફૉલ્ટ રૂપે બંધ: આ PR પહેલાંની જેમ જ સ્ટાર્ટઅપ અવરોધાય છે. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` અને તેનું લેગસી ઉપનામ +> `INPUT_SANITIZER_BLOCK_THRESHOLD` અને તેનો લેગસી ઉપનામ > `INJECTION_GUARD_BLOCK_THRESHOLD`, `INJECTION_GUARD_MODE`ના `block` મોડને -> સમાયોજિત કરે છે, પરંતુ તે -> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) દ્વારા વાંચવામાં આવતા સાદા પર્યાવરણ વેરિયેબલ છે, -> ફીચર ફ્લૅગ નથી: તેમના માટે કોઈ DB ઓવરરાઇડ કે ડૅશબોર્ડ ટૉગલ નથી. જુઓ +> સમાયોજિત કરે છે, પરંતુ તે [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) +> દ્વારા વાંચવામાં આવતા સાદા એન્વાયર્નમેન્ટ વેરિએબલ્સ છે, ફીચર ફ્લૅગ્સ નહીં: +> તેમાં કોઈ DB ઓવરરાઇડ કે ડૅશબોર્ડ ટૉગલ નથી. જુઓ > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> `પુનઃપ્રારંભ` કૉલમ `requiresRestart: true` ધરાવતા ફ્લૅગ દર્શાવે છે — મૂલ્ય -> તરત જ સંગ્રહિત થાય છે, પરંતુ પ્રોસેસ ફરી લોડ થયા પછી જ અમલમાં આવે છે. Enum -> ફ્લૅગ તેમના માન્ય સમૂહની બહારના કોઈપણ મૂલ્યને નકારે છે (સર્વર-સાઇડ પર -> `setFeatureFlagOverride()` અને REST `PUT` હૅન્ડલર બંનેમાં માન્ય કરાયેલ). +> `Restart` કૉલમ `requiresRestart: true` ધરાવતા ફ્લૅગ્સને ચિહ્નિત કરે છે — મૂલ્ય +> તરત જ સાચવવામાં આવે છે, પરંતુ પ્રોસેસ ફરી લોડ થયા પછી જ અમલમાં આવે છે. Enum +> ફ્લૅગ્સ તેમના મંજૂર સેટની બહારના કોઈપણ મૂલ્યને નકારે છે (સર્વર-સાઇડ પર +> `setFeatureFlagOverride()` અને REST `PUT` હૅન્ડલર બંનેમાં માન્ય કરવામાં આવે છે). --- @@ -174,33 +175,33 @@ (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) આ સુવિધાઓને સપોર્ટ કરે છે: -- કી અથવા વર્ણન દ્વારા **શોધ**, અને કેટેગરી દ્વારા **ફિલ્ટર** (ઉપરાંત કૃત્રિમ - **Requires Restart** વ્યૂ). -- બુલિયન ફ્લૅગ્સ માટે **ટૉગલ** અને enum ફ્લૅગ્સ માટે **ડ્રૉપડાઉન** +- કી અથવા વર્ણન દ્વારા **શોધ**, અને શ્રેણી દ્વારા **ફિલ્ટર** (ઉપરાંત કૃત્રિમ + **Requires Restart** દૃશ્ય). +- બૂલિયન ફ્લૅગ્સ માટે **ટૉગલ** અને enum ફ્લૅગ્સ માટે **ડ્રૉપડાઉન** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - દરેક ફ્લૅગ માટે **સ્રોત બૅજ** — `DB`, `ENV`, અથવા `DEF` — જે દર્શાવે છે કે - અસરકારક મૂલ્ય ક્યાંથી આવ્યું છે. -- ઓવરરાઇડ દૂર કરવા માટેનું **Reset** બટન (ફક્ત `DB`-સ્રોતવાળા ફ્લૅગ્સ માટે દર્શાવાય છે), + પ્રભાવી મૂલ્ય ક્યાંથી આવ્યું છે. +- ઓવરરાઇડ દૂર કરવા માટે **Reset** બટન (માત્ર `DB`-સ્રોતવાળા ફ્લૅગ્સ માટે દર્શાવાય છે), અને નીચે **Reset All Overrides** બટન. -- જ્યારે `requiresRestart` ફ્લૅગ બદલાય ત્યારે **Restart Server** બૅનર. +- `requiresRestart` ફ્લૅગ બદલાય ત્યારે **Restart Server** બૅનર. ### REST API -બધી કામગીરી એક જ રૂટ દ્વારા થાય છે: +તમામ ઑપરેશન્સ એક જ રૂટ મારફતે થાય છે: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -દરેક મેથડ માટે પ્રમાણિત ડૅશબોર્ડ સેશન જરૂરી છે (નહિતર `401`). +દરેક મેથડ માટે પ્રમાણિત ડૅશબોર્ડ સેશન આવશ્યક છે (અન્યથા `401`). #### `GET /api/settings/feature-flags` -દરેક ફ્લૅગને તેના અસરકારક મૂલ્ય, સ્રોત અને સારાંશ સાથે પરત કરે છે. +દરેક ફ્લૅગને તેના પ્રભાવી મૂલ્ય, સ્રોત અને સારાંશ સાથે પરત કરે છે. ```jsonc { "flags": [ { "key": "REQUIRE_API_KEY", - "label": "API કી જરૂરી બનાવો", - "description": "આવનારી બધી વિનંતીઓ માટે API કી જરૂરી બનાવો", + "label": "Require API Key", + "description": "Require an API key for all incoming requests", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +211,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... બધા 72 ફ્લૅગ્સ + // ... બધા 74 ફ્લૅગ્સ ], "summary": { "total": 56, @@ -225,7 +226,7 @@ #### `PUT /api/settings/feature-flags` એક ઓવરરાઇડ સેટ કરો અથવા દૂર કરો. બૉડી: `{ key: string; value?: string }`. -`value` છોડવાથી ઓવરરાઇડ દૂર થાય છે (env / ડિફૉલ્ટ પુનઃસ્થાપિત થાય છે). +`value` ન આપવાથી ઓવરરાઇડ દૂર થાય છે (env / default પુનઃસ્થાપિત થાય છે). ```bash # DB ઓવરરાઇડ સેટ કરો @@ -233,25 +234,25 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# ઓવરરાઇડ દૂર કરો ("value" વગર) +# ઓવરરાઇડ દૂર કરો ("value" વિના) curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -રિસ્પોન્સ નવા `effectiveValue`/`source`, `previousValue`/ -`previousSource`, અને `requiresRestart` ને પાછા મોકલે છે. અજાણી કી અને માન્ય શ્રેણીની બહારનાં enum +પ્રતિસાદ નવા `effectiveValue`/`source`, `previousValue`/ +`previousSource`, અને `requiresRestart`ને પાછાં દર્શાવે છે. અજાણી કીઓ અને માન્ય સીમાની બહારનાં enum મૂલ્યોને `400` સાથે નકારવામાં આવે છે. #### `DELETE /api/settings/feature-flags` -બધા DB ઓવરરાઇડ્સને એકસાથે સાફ કરે છે અને દરેક ફ્લૅગને તેના env / ડિફૉલ્ટ +બધા DB ઓવરરાઇડ્સને એકસાથે સાફ કરે છે અને દરેક ફ્લૅગને તેના env / default મૂલ્ય પર પુનઃસ્થાપિત કરે છે. `{ cleared: , message: "..." }` પરત કરે છે. > [!NOTE] -> `requiresRestart: true` ધરાવતા ફ્લૅગ્સ ફક્ત પ્રોસેસ ફરીથી લોડ થયા પછી જ અસર કરે છે. -> ડૅશબોર્ડનો રિસ્ટાર્ટ પ્રવાહ `POST /api/restart` ને કૉલ કરે છે અને પછી સર્વર ફરી ચાલુ થાય ત્યાં સુધી -> `GET /api/health/ping` નું પોલિંગ કરે છે. +> `requiresRestart: true` ધરાવતા ફ્લૅગ્સ ફક્ત પ્રોસેસ ફરી લોડ થયા પછી જ અમલમાં આવે છે. +> ડૅશબોર્ડનો રીસ્ટાર્ટ પ્રવાહ `POST /api/restart`ને કૉલ કરે છે અને ત્યારબાદ સર્વર ફરી ચાલુ ન થાય ત્યાં સુધી +> `GET /api/health/ping`ને પોલ કરે છે. --- diff --git a/docs/i18n/gu/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/gu/docs/reference/PROVIDER_REFERENCE.md index 11f2b6206a3f..7c11ebed4e27 100644 --- a/docs/i18n/gu/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/gu/docs/reference/PROVIDER_REFERENCE.md @@ -4,11 +4,11 @@ --- -> `src/shared/constants/providers.ts`માંથી **આપમેળે જનરેટ કરેલું** — હાથથી ફેરફાર કરશો નહીં. -> આની મદદથી ફરીથી જનરેટ કરો: `npm run gen:provider-reference` -> **છેલ્લે જનરેટ કરેલું:** 2026-09-17 +> **સ્વતઃ-જનરેટ થયેલ** `src/shared/constants/providers.ts` માંથી — હાથથી ફેરફાર કરશો નહીં. +> આની મદદથી ફરી જનરેટ કરો: `npm run gen:provider-reference` +> **છેલ્લે જનરેટ કરેલું:** 2026-09-18 -કુલ પ્રદાતાઓ: **359**. નીચે શ્રેણીવાર વિભાજન જુઓ. +કુલ પ્રોવાઇડર્સ: **359**. નીચે શ્રેણીવાર વિભાજન જુઓ. ## કેટેગરીઓ @@ -32,49 +32,49 @@ --- -## પ્રમાણીકરણ-વિનાના પ્રદાતાઓ (કી જરૂરી નથી) (10) - -| ID | ઉપનામ | નામ | ટૅગ્સ | વેબસાઇટ | નોંધો | ટૂલ કૉલિંગ | -| ----------------------- | ---------- | ------------------------- | ----------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| `aihorde` | `horde` | AI Horde | પ્રમાણીકરણ-વિના | [લિંક](https://aihorde.net) | કોઈ API કી જરૂરી નથી — AI Hordeની દસ્તાવેજીકૃત અનામી કીનો ઉપયોગ કરે છે. મફત aihorde.net કી ઉમેરવી વૈકલ્પિક છે અને તે માત્ર કતારમાં વધુ પ્રાથમિકતા (kudos) આપે છે. | — | -| `auggie` | `aug` | Augment (Auggie CLI) | પ્રમાણીકરણ-વિના | [લિંક](https://augmentcode.com) | OmniRoute દ્વારા કોઈ API કી સંગ્રહિત કરવામાં આવતી નથી. Auggie CLI ઇન્સ્ટૉલ કરો અને આ મશીન પર `auggie login` ચલાવો, ત્યારબાદ OmniRoute દરેક વિનંતી માટે તેને સ્થાનિક રીતે શરૂ કરે છે. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | પ્રમાણીકરણ-વિના | [લિંક](https://playground.ai.cloudflare.com) | કોઈ ઓળખપત્રોની જરૂર નથી — રિવર્સ-એન્જિનિયર કરેલા cf_agent WebSocket પ્રોટોકોલ (Playwright ટ્રાન્સપોર્ટ) પર અનામી બ્રાઉઝર સત્રોનો ઉપયોગ કરે છે. | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | પ્રમાણીકરણ-વિના | [લિંક](https://developers.openai.com/codex/cli) | OmniRoute દ્વારા કોઈ ટોકન સંગ્રહિત કરવામાં આવતું નથી. Codex CLI app-server પોતાનું ChatGPT સાઇન-ઇન (~/.codex/auth.json, આપમેળે રિફ્રેશ થાય છે) સંચાલિત કરે છે. જો CLI હજુ સુધી પ્રમાણિત ન હોય, તો “ChatGPT વડે સાઇન ઇન કરો”નો ઉપયોગ કરો. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | પ્રમાણીકરણ-વિના | [લિંક](https://docs.devin.ai/work-with-devin/devin-cli) | પ્રમાણીકરણનું સંચાલન અધિકૃત Devin CLI દ્વારા તેના અલગ રાખેલા બ્રિજ વૉલ્યુમમાં કરવામાં આવે છે. | અનુકરિત | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | પ્રમાણીકરણ-વિના | [લિંક](https://duckduckgo.com/duckchat) | કોઈ ઓળખપત્રોની જરૂર નથી — DuckDuckGo AI Chat અનામી અને મફત છે. | અનુકરિત | -| `opencode` | `oc` | OpenCode Free | પ્રમાણીકરણ-વિના | [લિંક](https://opencode.ai) | કોઈ API કી જરૂરી નથી — OpenCodeના જાહેર મફત એન્ડપૉઇન્ટનો ઉપયોગ કરે છે. | — | -| `uncloseai` | `unc` | UncloseAI | પ્રમાણીકરણ-વિના | [લિંક](https://uncloseai.com) | પ્રમાણીકરણ જરૂરી નથી. ઓળખ માટે API કોઈપણ ખાલી ન હોય તેવી સ્ટ્રિંગને કી તરીકે સ્વીકારે છે. જો જૂનાં બિલ્ટ-ઇન મોડલ 404 પરત કરે, તો ઉપલબ્ધ મોડલ્સ → /modelsમાંથી આયાત કરો અથવા ઑટો-સિંકનો ઉપયોગ કરો; ચકાસાયેલ લાઇવ મોડલ: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | પ્રમાણીકરણ-વિના, વિડિયો | [લિંક](https://veoaifree.com) | પ્રમાણીકરણ જરૂરી નથી. દર IP દીઠ 6 વિનંતીઓ/કલાક સુધી મર્યાદિત છે. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | પ્રમાણીકરણ-વિના | [લિંક](https://zcode.z.ai) | OmniRoute દ્વારા કોઈ API કી સંગ્રહિત કરવામાં આવતી નથી. સ્થાનિક ZCode app-server હાલના builtin:zai-coding-plan લૉગિનનો ઉપયોગ કરે છે. | — | +## પ્રમાણીકરણ વિનાના પ્રદાતાઓ (કી જરૂરી નથી) (10) + +| ID | ઉપનામ | નામ | ટૅગ્સ | વેબસાઇટ | નોંધો | ટૂલ કૉલિંગ | +| ----------------------- | ---------- | ------------------------- | -------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `aihorde` | `horde` | AI Horde | પ્રમાણીકરણ વિનાનું | [લિંક](https://aihorde.net) | કોઈ API કી જરૂરી નથી — AI Hordeની દસ્તાવેજીકૃત અનામી કીનો ઉપયોગ કરે છે. મફત aihorde.net કી ઉમેરવી વૈકલ્પિક છે અને તે માત્ર કતારમાં ઉચ્ચ પ્રાથમિકતા (kudos) આપે છે. | — | +| `auggie` | `aug` | Augment (Auggie CLI) | પ્રમાણીકરણ વિનાનું | [લિંક](https://augmentcode.com) | OmniRoute દ્વારા કોઈ API કી સંગ્રહિત કરવામાં આવતી નથી. આ મશીન પર Auggie CLI ઇન્સ્ટૉલ કરો અને `auggie login` ચલાવો, ત્યારબાદ OmniRoute દરેક વિનંતી માટે તેને સ્થાનિક રીતે શરૂ કરે છે. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | પ્રમાણીકરણ વિનાનું | [લિંક](https://playground.ai.cloudflare.com) | કોઈ ઓળખપત્ર જરૂરી નથી — રિવર્સ-એન્જિનિયર કરાયેલા cf_agent WebSocket પ્રોટોકૉલ (Playwright ટ્રાન્સપોર્ટ) પર અનામી બ્રાઉઝર સત્રોનો ઉપયોગ કરે છે. | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | પ્રમાણીકરણ વિનાનું | [લિંક](https://developers.openai.com/codex/cli) | OmniRoute દ્વારા કોઈ ટોકન સંગ્રહિત કરવામાં આવતું નથી. Codex CLI app-server તેના પોતાના ChatGPT સાઇન-ઇનનું સંચાલન કરે છે (~/.codex/auth.json, આપમેળે રિફ્રેશ થાય છે). જો CLI હજી પ્રમાણીકૃત ન હોય, તો “ChatGPT વડે સાઇન ઇન કરો”નો ઉપયોગ કરો. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | પ્રમાણીકરણ વિનાનું | [લિંક](https://docs.devin.ai/work-with-devin/devin-cli) | પ્રમાણીકરણનું સંચાલન તેના અલગ રાખેલા બ્રિજ વૉલ્યુમમાં અધિકૃત Devin CLI દ્વારા કરવામાં આવે છે. | અનુકરણ કરેલું | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | પ્રમાણીકરણ વિનાનું | [લિંક](https://duckduckgo.com/duckchat) | કોઈ ઓળખપત્ર જરૂરી નથી — DuckDuckGo AI Chat અનામી અને મફત છે. | અનુકરણ કરેલું | +| `opencode` | `oc` | OpenCode Free | પ્રમાણીકરણ વિનાનું | [લિંક](https://opencode.ai) | કોઈ API કી જરૂરી નથી — OpenCodeના સાર્વજનિક મફત એન્ડપોઇન્ટનો ઉપયોગ કરે છે. | — | +| `uncloseai` | `unc` | UncloseAI | પ્રમાણીકરણ વિનાનું | [લિંક](https://uncloseai.com) | કોઈ પ્રમાણીકરણ જરૂરી નથી. ઓળખ માટે API કોઈપણ ખાલી ન હોય તેવી સ્ટ્રિંગને કી તરીકે સ્વીકારે છે. જો જૂનાં બિલ્ટ-ઇન મોડલ 404 પરત કરે, તો ઉપલબ્ધ મોડલ → /modelsમાંથી આયાત કરો અથવા Auto-Syncનો ઉપયોગ કરો; ચકાસાયેલ લાઇવ મોડલ: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | પ્રમાણીકરણ વિનાનું, વિડિયો | [લિંક](https://veoaifree.com) | કોઈ પ્રમાણીકરણ જરૂરી નથી. દર IP દીઠ 6 વિનંતીઓ/કલાક સુધી મર્યાદિત છે. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | પ્રમાણીકરણ વિનાનું | [લિંક](https://zcode.z.ai) | OmniRoute દ્વારા કોઈ API કી સંગ્રહિત કરવામાં આવતી નથી. સ્થાનિક ZCode app-server હાલના builtin:zai-coding-plan લૉગિનનો ઉપયોગ કરે છે. | — | ## OAuth પ્રદાતાઓ (24) -| ID | ઉપનામ | નામ | ટૅગ્સ | વેબસાઇટ | નોંધો | -| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [લિંક](https://antigravity.google) | તમારું Antigravity CLI (`agy`) લૉગિન આયાત કરો (તેની ટોકન ફાઇલ પેસ્ટ/અપલોડ કરો), સ્થાનિક CLI લૉગિન આપમેળે શોધો અથવા Google વડે સાઇન ઇન કરો. Antigravity બૅકએન્ડ શેર કરે છે (Claude મોડલ્સ સહિત). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [લિંક](https://aws.amazon.com/q/developer/) | Kiro જેવો જ AWS Builder ID અથવા આયાત કરેલો રિફ્રેશ-ટોકન પ્રવાહ વાપરે છે, પરંતુ Amazon Q કનેક્શન્સને અલગ રાખે છે. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [લિંક](https://cline.bot/cline-pass) | ClinePass એ Clineનું $9.99/મહિનો સબ્સ્ક્રિપ્શન છે, જેમાં 10 ઓપન કોડિંગ મોડલ્સનો સમાવેશ થાય છે. તમારા Cline એકાઉન્ટ વડે સાઇન ઇન કરો (Cline CLI/IDE જેવું જ લૉગિન), અથવા સીધી ClinePass API કી પેસ્ટ કરો (app.cline.bot → સેટિંગ્સ → API કીઝ). ClinePass સબ્સ્ક્રિપ્શન cline-pass/* મોડલ્સને અનલૉક કરે છે. Cline WorkOS OAuth પ્રવાહનો ફરી ઉપયોગ કરે છે. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [લિંક](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). સત્તાવાર CLI ડિવાઇસ-કોડ પ્રવાહ દ્વારા સાઇન ઇન કરો અથવા સીધી API કી પેસ્ટ કરો (Authorization: Bearer તરીકે મોકલવામાં આવે છે). કૅટલૉગ: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [લિંક](https://cli.devin.ai) | Devin CLI બાઇનરી જરૂરી છે. પ્રમાણીકરણ માટે `devin auth login` ચલાવો અથવા તમારી WINDSURF_API_KEY આપો. ઇન્સ્ટૉલ કરો: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [લિંક](https://devin.ai) | પ્રમાણિત Devin સત્રમાંથી હાલની Devin API કી પેસ્ટ કરો. કી નિકાસની ઉપલબ્ધતા અને પગલાં Devin વર્ઝન અને એકાઉન્ટ પ્રમાણે બદલાય છે. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | પ્રદાતા સેટિંગ્સમાં તમારા GHE ઇન્સ્ટન્સનું URL (દા.ત., https://ghe.company.com) દાખલ કરો, ત્યારબાદ ડિવાઇસ પ્રવાહ દ્વારા પ્રમાણીકરણ કરો. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [લિંક](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth કૉન્ફિગર કરેલું નથી. https://gitlab.com/-/profile/applications પર રીડાયરેક્ટ URI http://localhost:20128/callback અને સ્કોપ્સ "ai_features read_user" સાથે OAuth ઍપ્લિકેશન રજિસ્ટર કરો, પછી GITLAB_DUO_OAUTH_CLIENT_ID (અને વૈકલ્પિક રીતે GITLAB_DUO_OAUTH_CLIENT_SECRET) સેટ કરીને રીસ્ટાર્ટ કરો. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | તમારા બ્રાઉઝર વડે સાઇન ઇન કરો અથવા Grok Build CLIમાંથી તમારી ~/.grok/auth.json (અથવા JWT ઍક્સેસ ટોકન) પેસ્ટ કરો; બંને કિસ્સામાં refresh_token આપમેળે રોટેટ થાય છે. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [લિંક](https://www.kimi.com/code?aff=omniroute) | Kimi Code CLI દ્વારા વપરાતા એ જ Kimi એકાઉન્ટ વડે સાઇન ઇન કરો. OmniRoute CLI OAuth પ્રવાહ અને Kimi Coding Plan એન્ડપૉઇન્ટ્સનો ઉપયોગ કરે છે. | -| `kiro` | `kr` | Kiro AI | OAuth | — | મફત સ્તર: 50 ક્રેડિટ્સ/મહિનો (~25K–100K ટોકન્સ). ⚠️ Kiro ToS તૃતીય-પક્ષ પ્રૉક્સી/હૉર્નેસના ઉપયોગને પ્રતિબંધિત કરે છે. | -| `openference` | `of` | Openference | OAuth | [લિંક](https://openference.com) | વિનંતીઓને api.openference.com મારફતે રૂટ કરવા માટે તમારા Openference એકાઉન્ટ વડે સાઇન ઇન કરો. ઇન્ફરન્સ માટે સક્રિય પ્લાન જરૂરી છે — તેના વિના OAuth પ્રમાણીકરણ કરી શકે છે, પરંતુ 402 પરત કરી શકે છે. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [લિંક](https://trae.ai) | Trae એ ByteDanceનું AI-મૂળ IDE છે (SOLO રિમોટ એજન્ટ). પૉપઅપમાં trae.ai દ્વારા અધિકૃત કરો અથવા solo.trae.ai પર સાઇન ઇન કરીને Cloud-IDE-JWT (જે 'Authorization: Cloud-IDE-JWT ' તરીકે મોકલાય છે, ~14-દિવસની અવધિ) ઍક્સેસ ટોકન તરીકે પેસ્ટ કરો; web_id/biz_user_id/user_unique_id/scope/tenant/region providerSpecificData દ્વારા આગળ મોકલાય છે. પેસ્ટ કરેલા ટોકન્સ માટે કોઈ હેડલેસ રિફ્રેશ નથી — મુદત પૂરી થાય ત્યારે ફરી પેસ્ટ કરો. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [લિંક](https://x.ai) | Grok 4.5 જેવા api.x.ai મોડલ્સનો ઉપયોગ કરવા માટે xAI વડે સાઇન ઇન કરો. આ Grok Build JWT સત્રોથી અલગ છે, જે cli-chat-proxy.grok.com અને grok-build મોડલ ઉપનામોનો ઉપયોગ કરે છે. | -| `zed` | `zd` | Zed IDE | OAuth | [લિંક](https://zed.dev) | Zed, LLM પ્રદાતાનાં ક્રેડેન્શિયલ્સ (OpenAI, Anthropic, Google, Mistral, xAI) OS કીચેઇનમાં સંગ્રહે છે. તેમને આપમેળે શોધવા અને આયાત કરવા માટે નીચેનું આયાત બટન વાપરો. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [લિંક](https://zed.dev) | તમારા Zed એકાઉન્ટ વડે સાઇન ઇન કરો (નેટિવ-ઍપ સાઇન-ઇન). OmniRoute એક વખત વાપરી શકાય તેવી RSA કી-જોડી બનાવે છે અને તેને અધિકૃત કરવા zed.dev ખોલે છે — રિમોટ/હેડલેસ ઇન્સ્ટૉલ પર, તમારા બ્રાઉઝરના ઍડ્રેસ બારમાંથી પરિણામસ્વરૂપ 127.0.0.1 કૉલબૅક URL કૉપી કરીને અહીં પાછું પેસ્ટ કરો. ઉપરની 'Zed IDE' ક્રેડેન્શિયલ-આયાત એન્ટ્રીથી આ અલગ છે: આ તમારા Zed પ્લાન હેઠળ Anthropic/OpenAI/Google/xAI મોડલ્સ પ્રદાન કરતા Zedના પોતાના હોસ્ટેડ મોડલ ઍગ્રીગેટર (cloud.zed.dev) મારફતે ચૅટ કમ્પ્લીશન્સને પ્રૉક્સી કરે છે. | +| ID | ઉપનામ | નામ | ટૅગ્સ | વેબસાઇટ | નોંધો | +| --------------- | ------------- | ------------------------- | ----- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [લિંક](https://antigravity.google) | તમારા Antigravity CLI (`agy`) લૉગિનને આયાત કરો (તેની ટોકન ફાઇલ પેસ્ટ/અપલોડ કરો), સ્થાનિક CLI લૉગિનને આપમેળે શોધો અથવા Google વડે સાઇન ઇન કરો. Antigravity બૅકએન્ડ (Claude મૉડલ્સ સહિત) શેર કરે છે. | +| `amazon-q` | `aq` | Amazon Q | OAuth | [લિંક](https://aws.amazon.com/q/developer/) | Kiro જેવી જ AWS Builder ID અથવા આયાત કરેલ refresh-token પ્રક્રિયાનો ઉપયોગ કરે છે, પરંતુ Amazon Q કનેક્શન્સને અલગ રાખે છે. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [લિંક](https://cline.bot/cline-pass) | ClinePass એ Clineનું $9.99/મહિનો સબ્સ્ક્રિપ્શન છે, જેમાં 10 ઓપન કોડિંગ મૉડલ્સનો સમાવેશ થાય છે. તમારા Cline એકાઉન્ટથી સાઇન ઇન કરો (Cline CLI/IDE જેવું જ લૉગિન), અથવા સીધી ClinePass API કી પેસ્ટ કરો (app.cline.bot → સેટિંગ્સ → API કીઝ). ClinePass સબ્સ્ક્રિપ્શન cline-pass/* મૉડલ્સને અનલૉક કરે છે. Cline WorkOS OAuth પ્રક્રિયાનો ફરીથી ઉપયોગ કરે છે. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [લિંક](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). અધિકૃત CLI device-code પ્રક્રિયા દ્વારા સાઇન ઇન કરો અથવા સીધી API કી પેસ્ટ કરો (Authorization: Bearer તરીકે મોકલવામાં આવે છે). કૅટલૉગ: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [લિંક](https://cli.devin.ai) | Devin CLI બાઇનરી આવશ્યક છે. પ્રમાણીકરણ માટે `devin auth login` ચલાવો અથવા તમારી WINDSURF_API_KEY આપો. ઇન્સ્ટૉલ કરો: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [લિંક](https://devin.ai) | પ્રમાણિત Devin સેશનમાંથી હાલની Devin API કી પેસ્ટ કરો. કી નિકાસની ઉપલબ્ધતા અને પગલાં Devin વર્ઝન અને એકાઉન્ટ અનુસાર બદલાય છે. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | પ્રદાતા સેટિંગ્સમાં તમારા GHE ઇન્સ્ટન્સનું URL (દા.ત., https://ghe.company.com) દાખલ કરો, ત્યારબાદ ડિવાઇસ ફ્લો દ્વારા પ્રમાણીકરણ કરો. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [લિંક](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth કૉન્ફિગર કરેલું નથી. redirect URI http://localhost:20128/callback અને scopes "ai_features read_user" સાથે https://gitlab.com/-/profile/applications પર OAuth ઍપ્લિકેશન રજિસ્ટર કરો, ત્યારબાદ GITLAB_DUO_OAUTH_CLIENT_ID (અને વૈકલ્પિક રીતે GITLAB_DUO_OAUTH_CLIENT_SECRET) સેટ કરીને રીસ્ટાર્ટ કરો. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | તમારા બ્રાઉઝર વડે સાઇન ઇન કરો અથવા Grok Build CLIમાંથી તમારી ~/.grok/auth.json (અથવા JWT ઍક્સેસ ટોકન) પેસ્ટ કરો; બંને રીતે refresh_token આપમેળે રોટેટ થાય છે. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [લિંક](https://www.kimi.com/code?aff=omniroute) | Kimi Code CLI દ્વારા ઉપયોગમાં લેવાતા એ જ Kimi એકાઉન્ટથી સાઇન ઇન કરો. OmniRoute CLI OAuth પ્રક્રિયા અને Kimi Coding Plan એન્ડપોઇન્ટ્સનો ઉપયોગ કરે છે. | +| `kiro` | `kr` | Kiro AI | OAuth | — | મફત ટિયર: 50 ક્રેડિટ્સ/મહિનો (~25K–100K ટોકન્સ). ⚠️ Kiro ToS તૃતીય-પક્ષ પ્રૉક્સી/હાર્ણેસના ઉપયોગને પ્રતિબંધિત કરે છે. | +| `openference` | `of` | Openference | OAuth | [લિંક](https://openference.com) | api.openference.com મારફતે વિનંતીઓને રૂટ કરવા માટે તમારા Openference એકાઉન્ટથી સાઇન ઇન કરો. Qwen3.8 27b અને Llama 3.2 3B માટે મફત-ટિયર ઍક્સેસનો સમાવેશ થાય છે — વર્તમાન પ્લાનની શરતો માટે openference.com/pricing જુઓ. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [લિંક](https://trae.ai) | Trae એ ByteDanceનું AI-નેટિવ IDE છે (SOLO રિમોટ એજન્ટ). પૉપઅપમાં trae.ai મારફતે અધિકૃતતા આપો અથવા solo.trae.ai પર સાઇન ઇન કરીને Cloud-IDE-JWT (`Authorization: Cloud-IDE-JWT ` તરીકે મોકલવામાં આવે છે, ~14-દિવસની અવધિ)ને ઍક્સેસ ટોકન તરીકે પેસ્ટ કરો; web_id/biz_user_id/user_unique_id/scope/tenant/region providerSpecificData મારફતે પ્રસારિત થાય છે. પેસ્ટ કરેલા ટોકન્સ માટે કોઈ હેડલેસ રિફ્રેશ નથી — અવધિ સમાપ્ત થતાં ફરી પેસ્ટ કરો. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [લિંક](https://x.ai) | Grok 4.5 જેવા api.x.ai મૉડલ્સનો ઉપયોગ કરવા માટે xAI વડે સાઇન ઇન કરો. આ Grok Build JWT સેશન્સથી અલગ છે, જે cli-chat-proxy.grok.com અને grok-build મૉડલ ઉપનામોનો ઉપયોગ કરે છે. | +| `zed` | `zd` | Zed IDE | OAuth | [લિંક](https://zed.dev) | Zed, LLM પ્રદાતાઓના ઓળખપત્રો (OpenAI, Anthropic, Google, Mistral, xAI)ને OS કીચેનમાં સંગ્રહે છે. તેમને આપમેળે શોધવા અને આયાત કરવા માટે નીચેના આયાત બટનનો ઉપયોગ કરો. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [લિંક](https://zed.dev) | તમારા Zed એકાઉન્ટથી સાઇન ઇન કરો (નેટિવ-ઍપ સાઇન-ઇન). OmniRoute એક વખત ઉપયોગમાં લેવાતી RSA કી-પૅર જનરેટ કરે છે અને તેને અધિકૃત કરવા માટે zed.dev ખોલે છે — રિમોટ/હેડલેસ ઇન્સ્ટૉલ પર, તમારા બ્રાઉઝરના ઍડ્રેસ બારમાંથી પરિણામી 127.0.0.1 કૉલબૅક URL કૉપી કરીને અહીં પાછું પેસ્ટ કરો. ઉપરની 'Zed IDE' ઓળખપત્ર-આયાત એન્ટ્રીથી આ અલગ છે: આ Zedના પોતાના હોસ્ટેડ મૉડલ ઍગ્રીગેટર (cloud.zed.dev) મારફતે ચૅટ કમ્પ્લીશન્સને પ્રૉક્સી કરે છે અને તમારા Zed પ્લાન હેઠળ Anthropic/OpenAI/Google/xAI મૉડલ્સ ઉપલબ્ધ કરાવે છે. | ## વેબ કૂકી પ્રદાતાઓ (34) @@ -115,252 +115,252 @@ | `zai-web` | `zw` | Z.ai Web | વેબ કૂકી | [લિંક](https://chat.z.ai) | chat.z.ai → DevTools → Application → Local Storage માંથી "token" મૂલ્ય કૉપિ કરો. કૂકીઝ કૉપિ કરશો નહીં; OmniRoute તેના બ્રાઉઝર ટ્રાન્સપોર્ટ મારફતે દરેક રિક્વેસ્ટ માટે CAPTCHA સંભાળે છે. | — | | `zenmux-free` | `zmf` | ZenMux Free (વેબ) | વેબ કૂકી | [લિંક](https://zenmux.ai) | zenmux.ai પર લૉગિન કરો, પછી EditThisCookie અથવા Cookie-Editor નો ઉપયોગ કરીને બધી કૂકીઝ નિકાસ કરો અને સંપૂર્ણ Cookie હેડર સ્ટ્રિંગ અહીં પેસ્ટ કરો. દર ~30 દિવસે રિફ્રેશ કરો. | — | -## API કી પ્રદાતાઓ (ચુકવેલ / મફત-ક્રેડિટ્સ-સાથે-ચુકવેલ) (242) - -| ID | ઉપનામ | નામ | ટૅગ્સ | વેબસાઇટ | નોંધો | -| ------------------------ | --------------- | ------------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API કી | [લિંક](https://ai.360.cn) | ai.360.cn પરથી API કી મેળવો | -| `agentrouter` | `agentrouter` | AgentRouter | API કી, એગ્રીગેટર | [લિંક](https://agentrouter.org) | સાઇન અપ કરવા પર $200ની મફત ક્રેડિટ — મલ્ટિ-મૉડલ રૂટિંગ ગેટવે | -| `agnes` | `agnes` | Agnes AI | API કી, વિડિયો | [લિંક](https://agnes-ai.com) | agnes-ai.com પરથી API કી મેળવો | -| `agnes-cn` | `agnescn` | Agnes AI (ચીન) | API કી | [લિંક](https://api.agnes-ai.cn) | Agnes CN સાઇટ પરથી API કી મેળવો. | -| `ai21` | `ai21` | AI21 Labs | API કી | [લિંક](https://www.ai21.com) | સાઇન અપ કરવા પર $10ની ટ્રાયલ ક્રેડિટ (3 મહિના માટે માન્ય), ક્રેડિટ કાર્ડ જરૂરી નથી | -| `aimlapi` | `aiml` | AI/ML API | API કી, એગ્રીગેટર | [લિંક](https://aimlapi.com) | મફત ટિયર સ્થગિત છે (2026) — AI/ML API હવે માત્ર ઉપયોગ પ્રમાણે ચુકવણીવાળું છે (ઓછામાં ઓછું $20 ટૉપ-અપ); કોઈ પુનરાવર્તિત મફત ક્રેડિટ નથી. | -| `ainative` | `ainative` | AINative Studio | API કી | [લિંક](https://ainative.studio) | ainative.studio પર મફત API કી બનાવો (કાર્ડની જરૂર નથી), પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `aion` | `aion` | Aion Labs | API કી | [લિંક](https://www.aionlabs.ai) | aionlabs.ai પર મફત API કી બનાવો (કાર્ડની જરૂર નથી), પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API કી | [લિંક](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (ચીન) | API કી | [લિંક](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API કી | [લિંક](https://developer.ant-ling.com/en/docs/) | Ant Ling API કન્સોલ (https://chat.ant-ling.com/open) પર નોંધણી કરીને API કી બનાવો, પછી તેને અહીં પેસ્ટ કરો. OmniRoute ચૅટ ટ્રાફિકને https://api.ant-ling.com/v1/chat/completions પર રૂટ કરે છે; પ્રદાતા OpenAI-સુસંગત છે અને Anthropic-સુસંગત ઇન્ટરફેસ પણ ઉપલબ્ધ કરાવે છે. | -| `anthropic` | `anthropic` | Anthropic | API કી | [લિંક](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API કી, એગ્રીગેટર | [લિંક](https://anyapi.ai) | મફત પ્લાન: પાત્ર Free/Basic મૉડલ માટે દરરોજ 100,000 ANY Tokens અને 100 RPM; ક્રેડિટ કાર્ડ જરૂરી નથી. | -| `api-airforce` | `af` | Api.airforce | API કી | [લિંક](https://api.airforce) | Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash અને DeepSeek-V3 સહિત મફત ટિયરના 55 મૉડલ | -| `arcee-ai` | `arcee` | Arcee AI | API કી | [લિંક](https://arcee.ai) | arcee.ai પરથી API કી મેળવો | -| `auriko` | `auriko` | Auriko | API કી, એગ્રીગેટર | [લિંક](https://www.auriko.ai) | મફત પ્લાન 1,000 Platform RPM અને 10,000 BYOK RPM પ્રદાન કરે છે. પ્લૅટફૉર્મ ઇન્ફરન્સ માટે હજી પણ પ્રદાતાનો ખર્ચ લાગુ પડે છે; આ મફત ટોકન પૂલ અથવા અમર્યાદિત મફત ઇન્ફરન્સ નથી. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://learn.microsoft.com/azure/ai-foundry) | તમારી Azure AI Foundry કીનો ઉપયોગ કરો. બેઝ URL https://.services.ai.azure.com/openai/v1/ અથવા https://.openai.azure.com/openai/v1/ હોઈ શકે છે. | -| `azure-openai` | `azure` | Azure OpenAI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://azure.microsoft.com/products/ai-services/openai-service) | તમારી Azure OpenAI API કીનો ઉપયોગ કરો. બેઝ URL તમારું રિસોર્સ એન્ડપૉઇન્ટ હોવું જોઈએ, ઉદાહરણ તરીકે https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API કી | [લિંક](https://b.ai) | b.ai OpenAI-સુસંગત LLM ગેટવે માટેની Bearer API કી (TheB.AIથી અલગ). https://docs.b.ai પર કી બનાવો, પછી OpenAI-સુસંગત બેઝ URL તરીકે https://api.b.ai/v1 નો ઉપયોગ કરો. | -| `baichuan` | `baichuan` | Baichuan | API કી | [લિંક](https://www.baichuan-ai.com/) | platform.baichuan-ai.com પરથી API કી મેળવો | -| `baidu` | `baidu` | Baidu (ERNIE) | API કી | [લિંક](https://ernie.baidu.com/) | console.bce.baidu.com પરથી API કી મેળવો | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API કી | [લિંક](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API કી | [લિંક](https://baseten.co) | GPU ઇન્ફરન્સ માટે $30ની મફત ટ્રાયલ ક્રેડિટ | -| `bazaarlink` | `bzl` | BazaarLink | API કી | [લિંક](https://bazaarlink.ai) | Authorization: Bearer માં તમારી BazaarLink API કીનો ઉપયોગ કરો (જે sk-bl-થી શરૂ થાય છે). OpenAI SDK બેઝ URL https://bazaarlink.ai/api/v1 સાથે કાર્ય કરે છે. મૉડલ provider/model-name ફૉર્મેટનો ઉપયોગ કરે છે. | -| `bedrock` | `bedrock` | Amazon Bedrock | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://aws.amazon.com/bedrock) | તમારી Amazon Bedrock API કીનો ઉપયોગ કરો અને જ્યાં તમારા મૉડલ સક્ષમ છે તે AWS પ્રદેશ કૉન્ફિગર કરો (ઉદાહરણ તરીકે eu-west-2). OmniRoute સીધા Bedrockના મૂળ Converse APIને કૉલ કરે છે. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API કી, ઇમેજ | [લિંક](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API કી | [લિંક](https://blackbox.ai) | ⚠️ **અપ્રચલિત.** api.blackbox.ai દરેક પાથ વેરિઅન્ટ પર HTTP 404 પરત કરે છે (તપાસ 2026-08-21); જાહેર ઇન્ફરન્સ ઇન્ટરફેસ હવે નિયંત્રિત enterprise.blackbox.ai/v1 એન્ડપૉઇન્ટ પર ખસેડવામાં આવ્યું છે. | -| `bluesminds` | `bm` | BluesMinds | API કી | [લિંક](https://www.bluesminds.com) | દરરોજ મફત pi ક્રેડિટ — GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen અને Kimi K2 સહિત 200થી વધુ મૉડલને સપોર્ટ કરે છે | -| `byteplus` | `bpm` | BytePlus ModelArk | API કી | [લિંક](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API કી | [લિંક](https://bytez.com) | $1ની મફત ક્રેડિટ, દર 4 અઠવાડિયે ફરીથી મળે છે | -| `cerebras` | `cerebras` | Cerebras | API કી | [લિંક](https://inference.cerebras.ai) | એક વખત મળતી $5ની સાઇન-અપ ક્રેડિટ (30 દિવસની માન્યતા); ચુકવણીની પદ્ધતિ જરૂરી છે. આ પુનરાવર્તિત મફત ટિયર નથી. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API કી | [લિંક](https://hyper.charm.land) | સાઇન અપ કરવા પર દર મહિને 100 મફત Hypercredits | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API કી, એગ્રીગેટર | [લિંક](https://api.oriper.com) | અધિકૃત મેટાડેટામાં દર મહિને 2M ટોકનની જાહેરાત કરવામાં આવી છે, પરંતુ ઑડિટ દરમિયાન જાહેર સાઇટ અને દસ્તાવેજીકરણ અવરોધિત હતાં; ક્વોટા અને બ્રાન્ડ મૅપિંગને અપ્રમાણિત માનો. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API કી, એગ્રીગેટર | [લિંક](https://chatanywhere.tech) | ફક્ત વ્યક્તિગત, શૈક્ષણિક અથવા સંશોધન ઉપયોગ માટે: જાહેર દસ્તાવેજોમાં દરરોજ 10,000 પૉઇન્ટ અને પ્રતિ IP/કી દરરોજ 200 વિનંતીઓનો ઉલ્લેખ છે; વ્યાવસાયિક ટ્રાફિક માટે ઉપયોગ કરશો નહીં. | -| `cheaperinference` | `cinf` | Cheaper Inference | API કી | [લિંક](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API કી | [લિંક](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API કી, એગ્રીગેટર | [લિંક](https://chutes.ai) | Chutesના OpenAI-સુસંગત ગેટવે માટે Bearer API કી. | -| `clarifai` | `clarifai` | Clarifai | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://docs.clarifai.com) | તમારા Clarifai PAT અથવા ઍપ-વિશિષ્ટ API કીનો ઉપયોગ કરો. OmniRoute https://api.clarifai.com/v2/ext/openai/v1 પરના OpenAI-સુસંગત એન્ડપૉઇન્ટને લક્ષ્ય બનાવે છે અને Authorization: Key વડે પ્રમાણીકરણ કરે છે. | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API કી, એગ્રીગેટર | [લિંક](https://cloudcode.one) | પ્રકાશિત મફત મોડેલોમાં glm-4.7-flash અને glm-4.6v-flash સામેલ છે; કોઈ આંકડાકીય ક્વોટા પ્રકાશિત કરાયો નથી અને કી બનાવવા માટે ક્રેડિટ અથવા કૂપનની જરૂર પડી શકે છે. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API કી | [લિંક](https://developers.cloudflare.com/workers-ai) | API Token અને Account ID બંને જરૂરી છે (dash.cloudflare.com પર મળે છે) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API કી | [લિંક](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API કી | [લિંક](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API કી | [લિંક](https://cohere.com) | મફત અજમાયશ: પરીક્ષણ માટે દર મહિને 1,000 API કૉલ, ક્રેડિટ કાર્ડની જરૂર નથી | -| `command-code` | `cmd` | Command Code | API કી | [લિંક](https://commandcode.ai/) | Command Code API કીનો ઉપયોગ કરો. વિનંતીઓ Command Codeના /provider/v1/chat/completions એન્ડપૉઇન્ટ પર મોકલવામાં આવે છે. | -| `coze` | `coze` | Coze | API કી | [લિંક](https://coze.com) | coze.com/open/api પરથી API કી મેળવો | -| `crof` | `crof` | CrofAI | API કી | [લિંક](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API કી | [લિંક](https://cursor.com/dashboard/api) | cursor.com/dashboard/api પરથી Cursor વપરાશકર્તા API કી (crsr_...) પેસ્ટ કરો. OmniRoute જરૂર મુજબ તેને સત્ર ટોકન સાથે વિનિમય કરે છે; કોઈ IDE અથવા cursor-agent ઇન્સ્ટોલ કરવાની જરૂર નથી. વપરાશનું બિલ કીની માલિકી ધરાવતા Cursor પ્લાનમાં ઉમેરાય છે. | -| `dahl` | `dahl` | Dahl | API કી | [લિંક](https://inference.dahl.global) | ટોકન આપમેળે જનરેટ કરવા માટે 'Add Account' પર ક્લિક કરો અથવા મેન્યુઅલ API કી ઉમેરો. | -| `databricks` | `databricks` | Databricks | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://docs.datarobot.com) | તમારા DataRobot API ટોકનનો ઉપયોગ કરો. વૈકલ્પિક Base URL એકાઉન્ટનું રૂટ (LLM Gateway માટે) અથવા /api/v2/deployments/ હેઠળનું ડિપ્લોયમેન્ટ URL હોઈ શકે છે. | -| `deepai` | `deepai` | DeepAI | API કી, છબી | [લિંક](https://deepai.org) | તમારી DeepAI API કીનો ઉપયોગ કરો. deepai.org પરથી મેળવો — Pro સબ્સ્ક્રિપ્શન ($9.99/મહિનો) જરૂરી છે. | -| `deepinfra` | `deepinfra` | DeepInfra | API કી | [લિંક](https://deepinfra.com) | API પરીક્ષણ અને મોડેલ અન્વેષણ માટે સાઇન અપ કરતાં મફત ક્રેડિટ મળે છે | -| `deepseek` | `ds` | DeepSeek | API કી | [લિંક](https://platform.deepseek.com) | સાઇન અપ પર 5M મફત ટોકન — ક્રેડિટ કાર્ડની જરૂર નથી | -| `dgrid` | `dgrid` | DGrid | API કી | [લિંક](https://dgrid.ai) | DGrid મફત મોડેલ્સ રાઉટર: પ્રતિ મિનિટ 10 વિનંતીઓ અને દરરોજ 100 વિનંતીઓ. $5નું એક વખતનું ટૉપ-અપ પ્રતિ મિનિટ 20 વિનંતીઓ અને દરરોજ 1,000 વિનંતીઓ સુધીની મર્યાદા અનલૉક કરે છે. | -| `dify` | `dify` | Dify | API કી | [લિંક](https://dify.ai) | તમારા Dify ઇન્સ્ટન્સમાંથી API કી મેળવો. | -| `digitalocean` | `digitalocean` | DigitalOcean | API કી | [લિંક](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API કી | [લિંક](https://dit.ai) | Authorization: Bearer માં તમારી dit.ai API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત — સીધું જ બદલી શકાય તેવું; ફક્ત બેઝ URLને https://api.dit.ai/v1માં બદલો. | -| `doubao` | `doubao` | Doubao | API કી | [લિંક](https://doubao.com) | console.volcengine.com પરથી API કી મેળવો | -| `dxnt` | `dxnt` | DXNT / DX Token | API કી, એગ્રીગેટર | [લિંક](https://www.dxnt.com) | મફત એકાઉન્ટ માટે દસ્તાવેજોમાં દરરોજ 100 કૉલ દર્શાવાયા છે; આમંત્રણો દ્વારા ક્વોટા વધી શકે છે અને એકાઉન્ટ પ્રમાણે બદલાઈ શકે છે. | -| `electronhub` | `electronhub` | Electron Hub | API કી, એગ્રીગેટર | [લિંક](https://www.electronhub.ai) | મફત પ્લાન: 5 RPM, દર અઠવાડિયે $0.25 ક્રેડિટ અને :free મોડેલ માટે દરરોજ 10 Neutrinos; ફેમિલી બજેટ પણ લાગુ પડે છે. | -| `empower` | `empower` | Empower | API કી, એગ્રીગેટર | [લિંક](https://docs.empower.dev) | Empowerના OpenAI-સુસંગત એન્ડપૉઇન્ટ માટે Bearer API કી. | -| `eurouter` | `eurouter` | EURouter | API કી, એગ્રીગેટર | [લિંક](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API કી | [લિંક](https://factory.ai) | Factoryના OpenAI-સુસંગત ગેટવે માટે Bearer API કી. | -| `fal-ai` | `fal` | Fal.ai | API કી, છબી | [લિંક](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API કી, એગ્રીગેટર | [લિંક](https://fastrouter.ai) | :free પ્રત્યય ધરાવતા મોડેલ પ્રતિ સંસ્થા અને મોડેલ માટે દરરોજ 10 વિનંતીઓની મંજૂરી આપે છે; ઉપલબ્ધતા બદલાઈ શકે છે. | -| `featherless-ai` | `featherless` | Featherless AI | API કી | [લિંક](https://featherless.ai) | મફત ટિયર ઉપલબ્ધ છે — ક્રેડિટ કાર્ડની જરૂર નથી | -| `fenayai` | `fenayai` | FenayAI | API કી, એગ્રીગેટર | [લિંક](https://fenayai.com) | FenayAIના OpenAI-સુસંગત ગેટવે માટે Bearer API કી. | -| `fireworks` | `fireworks` | Fireworks AI | API કી | [લિંક](https://fireworks.ai) | API પરીક્ષણ માટે સાઇન અપ પર $1ની મફત પ્રારંભિક ક્રેડિટ | -| `free-ai` | `free-ai` | Free.ai | API કી, એગ્રીગેટર | [લિંક](https://free.ai) | ઇમેઇલ ચકાસણી પછી સ્વ-હોસ્ટેડ મોડેલ માટે દરરોજ 30,000 ટોકન મળે છે. પૂલથી વધુ વપરાશ માટે મૂળ ખર્ચે બિલ લાગી શકે છે અને પ્રીમિયમ બાહ્ય મોડેલ સશુલ્ક છે. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API કી | [લિંક](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API કી | [લિંક](https://freebuff.com) | Freebuff / Codebuff Auth Token દાખલ કરો (CLI લૉગિન અથવા સ્વચાલિત હાર્વેસ્ટર દ્વારા મેળવેલ). | -| `freeinference` | `freeinference` | FreeInference | API કી, એગ્રીગેટર | [લિંક](https://freeinference.org) | કાર્ડ વિના મફત સંશોધન ઍક્સેસ; Harvard સિવાયના અરજદારો માટે મેન્યુઅલ મંજૂરી જરૂરી છે અને કોઈ આંકડાકીય ક્વોટાની જાહેર બાંયધરી આપવામાં આવતી નથી. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API કી | [લિંક](https://freemodel.dev) | સાઇનઅપ પર $300ની મફત ક્રેડિટ — ક્રેડિટ કાર્ડ જરૂરી નથી. OpenAI-સુસંગત API મારફતે GPT-5.4 અને GPT-5.5 (OpenAIનાં નવીનતમ ફ્લૅગશિપ મોડલ)ની ઍક્સેસ. | -| `freetheai` | `fta` | FreeTheAi | API કી, એગ્રીગેટર | [લિંક](https://freetheai.xyz) | તમારી મફત API કી મેળવવા માટે FreeTheAi Discordમાં જોડાઓ. | -| `friendliai` | `friendli` | FriendliAI | API કી | [લિંક](https://friendli.ai) | સર્વરલેસ ઇન્ફરન્સ માટે મફત ટિયર — ક્રેડિટ કાર્ડ જરૂરી નથી | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ બનાવો અથવા g4f.dev સભ્ય કી વાપરો (g4f.dev/members.html પર એક બનાવો). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ બનાવો અથવા g4f.dev સભ્ય કી વાપરો (g4f.dev/members.html પર એક બનાવો). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ બનાવો અથવા g4f.dev સભ્ય કી વાપરો (g4f.dev/members.html પર એક બનાવો). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ બનાવો અથવા g4f.dev સભ્ય કી વાપરો (g4f.dev/members.html પર એક બનાવો). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ બનાવો અથવા g4f.dev સભ્ય કી વાપરો (g4f.dev/members.html પર એક બનાવો). | -| `galadriel` | `galadriel` | Galadriel | API કી | [લિંક](https://galadriel.com) | ⚠️ **અપ્રચલિત.** api.galadriel.ai હવે રિઝોલ્વ થતું નથી (તપાસ 2026-06-19); ઇન્ફરન્સ API બંધ કરવામાં આવ્યું હોય એવું જણાય છે. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API કી | [લિંક](https://aistudio.google.com) | Google AI Studio મારફતે મફત ટિયર ઉપલબ્ધ છે; હાલના પ્રતિ-મોડલ ક્વોટા અને પ્રાદેશિક મર્યાદાઓ લાગુ પડે છે | -| `getgoapi` | `ggo` | GoAPI | API કી, એગ્રીગેટર | [લિંક](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API કી | [લિંક](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API કી | [લિંક](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | જાહેર Code Suggestions API માટે GitLab વ્યક્તિગત ઍક્સેસ ટોકન. gitlab.comનો ઉપયોગ ન કરતા હો ત્યારે સ્વ-હોસ્ટેડ બેઝ URL ગોઠવો. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API કી | [લિંક](https://opengateway.gitlawb.com) | મફત MiMo (xiaomi/mimo-v2.5) 2026-05માં પાછું ખેંચાયું — Opengateway હવે વપરાશ મુજબ ચૂકવણીવાળું ક્રેડિટ ગેટવે છે; કોઈ પુનરાવર્તિત મફત મોડલ નથી. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API કી | [લિંક](https://opengateway.gitlawb.com) | મફત Nemotron પ્રમોશન 2026-06માં સમાપ્ત થયું — GMI Cloud રૂટ હવે માત્ર વપરાશ મુજબ ચૂકવણીવાળી ક્રેડિટ પર ઉપલબ્ધ છે. | -| `glm` | `glm` | GLM Coding | API કી | [લિંક](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | API કી | [લિંક](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API કી | [લિંક](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API કી | [લિંક](https://greenpt.com) | API સબ્સ્ક્રિપ્શન બનાવવું મફત છે; ઇન્ફરન્સનું બિલ પ્રતિ ટોકન વસૂલવામાં આવે છે. મફત ઇન્ફરન્સ ભથ્થું પ્રકાશિત કરવામાં આવ્યું નથી. | -| `groq` | `groq` | Groq | API કી | [લિંક](https://groq.com) | મફત પ્લાન: પ્રતિ-મોડલ મર્યાદાઓ (દરેક ચેટ મોડલ માટે 200K ટોકન/દિવસ; RPM/RPD માટે console.groq.com/docs/rate-limits જુઓ) — ફાઇલ પર કોઈ ચુકવણી પદ્ધતિ નથી. | -| `haiper` | `hp` | Haiper | API કી, વિડિયો | [લિંક](https://haiper.ai) | haiper.ai/haiper-api પર API કી મેળવો | -| `hcnsec` | `hcnsec` | Huancheng Public API | API કી | [લિંક](https://api.hcnsec.cn) | api.hcnsec.cn પર API કી મેળવો | -| `helixmind` | `helixmind` | HelixMind | API કી, એગ્રીગેટર | [લિંક](https://helixmind.online) | અગાઉ પ્રચલિત 3 RPM/50 RPD અને કાર્ડની જરૂર ન હોવાના દાવાઓની 2026-08-02ની ઑડિટ દરમિયાન પુષ્ટિ થઈ નહોતી; હાલના ક્વોટા અને બિલિંગ માટે એકાઉન્ટની ચકાસણી જરૂરી છે. | -| `helyxai` | `helyxai` | Helyx AI | API કી, એગ્રીગેટર | [લિંક](https://helyxai.space) | કાર્યરત મફત પ્લાનના દસ્તાવેજોમાં 100,000 ટોકન/દિવસ દર્શાવ્યા છે; સાઇટનો અલગ 2M+ માર્કેટિંગ દાવો આની સાથે વિરોધાભાસી છે અને તેને ક્વોટાની બાંયધરી માનવામાં આવતો નથી. | -| `heroku` | `heroku` | Heroku AI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API કી | [લિંક](https://huggingface.co) | હજારો મોડલ (Whisper, VITS, SDXL…) માટે મફત Inference API | -| `hyperbolic` | `hyp` | Hyperbolic | API કી | [લિંક](https://hyperbolic.xyz) | સર્વરલેસ ઇન્ફરન્સ માટે સાઇનઅપ પર $1-5ની ટ્રાયલ ક્રેડિટ | -| `ideogram` | `ideo` | Ideogram | API કી | [લિંક](https://ideogram.ai) | ideogram.ai/docs/api પર API કી મેળવો | -| `iflytek` | `iflytek` | iFlytek Spark | API કી | [લિંક](https://xinghuo.xfyun.cn) | console.xfyun.cn પર API કી મેળવો | -| `inception` | `inception` | Inception | API કી | [લિંક](https://docs.inceptionlabs.ai) | સાઇનઅપ પર 10M મફત ટોકન, ક્રેડિટ કાર્ડ જરૂરી નથી. | -| `inference-net` | `inet` | Inference.net | API કી | [લિંક](https://inference.net) | સાઇનઅપ પર $25ની મફત ક્રેડિટ ઉપરાંત સંશોધન ગ્રાન્ટ પણ ઉપલબ્ધ છે | -| `internlm` | `internlm` | InternLM (Intern-S1) | API કી | [લિંક](https://internlm.intern-ai.org.cn/) | મફત માસિક ક્વોટા ~1M ઇનપુટ / 3M આઉટપુટ ટોકન (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API કી, એમ્બેડ/રીરેન્ક | [લિંક](https://jina.ai) | api.jina.ai માટે Bearer API કી — એમ્બેડિંગ્સ, રીરેન્ક, વર્ગીકરણ, સેગમેન્ટેશન અને શોધ. ડૅશબોર્ડ કીને JINA_AI_API_KEY કરતાં પ્રાથમિકતા મળે છે. આ Reader / r.jina.ai કાર્ડ નથી અને URLs મેળવતું નથી. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API કી | [લિંક](https://jina.ai/reader) | r.jina.ai URL-થી-માર્કડાઉન માટે Bearer API કી (ફક્ત /v1/web/fetch). તે /v1/embeddings અથવા /v1/rerank પ્રદાન કરતું નથી. Foundation API જેવું જ Jina ટોકન કાર્ય કરે છે; જ્યારે આ કાર્ડ ખાલી હોય ત્યારે OmniRoute jina-ai ડૅશબોર્ડ કી અથવા JINA_AI_API_KEYનો ફરી ઉપયોગ કરે છે. | -| `kenari` | `kenari` | Kenari | API કી | [લિંક](https://kenari.id) | Authorization: Bearer માં તમારી Kenari API કી (kn-...)નો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API આધાર URL: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API કી | [લિંક](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API કી, એગ્રીગેટર | [લિંક](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (લેગસી Moonshot API) | API કી | [લિંક](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API કી | API કી | [લિંક](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API કી | [લિંક](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API કી, એગ્રીગેટર | [લિંક](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API કી, વિડિયો | [લિંક](https://leonardo.ai) | leonardo.ai/developer પરથી API કી મેળવો | -| `liquid` | `liquid` | Liquid AI | API કી | [લિંક](https://liquid.ai) | liquid.ai પરથી API કી મેળવો | -| `literouter` | `literouter` | LiteRouter | API કી, એગ્રીગેટર | [લિંક](https://literouter.com) | મફત મોડેલ વેરિઅન્ટ્સ :free પ્રત્યયનો ઉપયોગ કરે છે; દૈનિક ક્રેડિટ મર્યાદાઓ મોડેલ પ્રમાણે બદલાય છે અને મફત ઇનપુટ 5,000 ટોકન્સ સુધી મર્યાદિત છે. | -| `llamagate` | `llamagate` | LlamaGate | API કી | [લિંક](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API કી, એગ્રીગેટર | [લિંક](https://llm.kiwi) | મફત પ્લાન auto અને hrLLM ઉપલબ્ધ કરાવે છે; પ્રકાશિત 40 વિનંતીઓ/કલાકની મર્યાદા hrLLMને લાગુ પડે છે. | -| `llm7` | `llm7` | LLM7.io | API કી | [લિંક](https://llm7.io) | કોઈપણ ખાલી ન હોય તેવી કીનો ઉપયોગ કરો (ઉદાહરણ તરીકે 'unused'). જો જૂના બિલ્ટ-ઇન મોડેલ્સ model_unavailable પરત કરે, તો Available Models → Import from /models અથવા Auto-Syncનો ઉપયોગ કરો; ચકાસાયેલ લાઇવ મોડેલ: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API કી, એગ્રીગેટર | [લિંક](https://llmgateway.io) | હોસ્ટેડ મફત પ્લાન: જ્યારે એકાઉન્ટમાં કોઈ ક્રેડિટ ન હોય ત્યારે મફત કિંમતવાળા મોડેલ્સ દર 10 મિનિટે 5 વિનંતીઓ સુધી મર્યાદિત હોય છે. | -| `logfare` | `logfare` | Logfare | API કી, એગ્રીગેટર | [લિંક](https://logfare.ai) | તાત્કાલિક API કી મેળવવા માટે https://logfare.ai/register પર મફત એકાઉન્ટ બનાવો (વપરાશકર્તાનામ/પાસવર્ડ, ઈમેલ ચકાસણી નહીં), પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `longcat` | `lc` | LongCat AI | API કી | [લિંક](https://longcat.chat/platform/docs) | મફત: એકાઉન્ટ સાઇનઅપ + KYC ચકાસણી પછી એક વખતની 10M-ટોકન ગ્રાન્ટ (LongCat-2.0). ફક્ત એક વખત — આ પુનરાવર્તિત દૈનિક/માસિક ભથ્થું નથી. | -| `magnific` | `freepik` | Magnific | API કી, ઇમેજ | [લિંક](https://www.magnific.com) | magnific.com/user/api-keys પરથી API કી મેળવો (હેડર x-magnific-api-key). લેગસી Freepik ડેવલપર કી હજુ પણ કાર્ય કરે છે. | -| `maritalk` | `maritalk` | Maritalk | API કી | [લિંક](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API કી, એગ્રીગેટર | [લિંક](https://meganova.ai) | કાર્ડ વિના મફત સાઇનઅપ. પ્રકાશિત Tier 1 પ્રતિ-મોડેલ ક્વોટાનો કુલ સરવાળો 550 વિનંતીઓ/દિવસ છે; તે કોઈ સહિયારો વૈશ્વિક પૂલ નથી અને જો સક્ષમ કરેલું હોય તો ચૂકવેલ વધારાનો ઉપયોગ લાગુ પડી શકે છે. | -| `meta-llama` | `meta` | Meta Llama API | API કી | [લિંક](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API કી, વિડિયો | [લિંક](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (ચીન) | API કી | [લિંક](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API કી | [લિંક](https://mistral.ai) | મફત Experiment ટિયર: બધા મોડેલ્સની દર-મર્યાદિત ઍક્સેસ, ક્રેડિટ કાર્ડ જરૂરી નથી | -| `mixedbread` | `mxbai` | Mixedbread AI | API કી | [લિંક](https://www.mixedbread.com) | Mixedbread એમ્બેડિંગ્સ API માટે Bearer API કી. | -| `mixlayer` | `mixlayer` | Mixlayer | API કી, એગ્રીગેટર | [લિંક](https://www.mixlayer.com) | qwen/qwen3.5-4b-free મોડેલ પ્રોટોટાઇપિંગ માટે મફત અને દર-મર્યાદિત છે; કોઈ નિશ્ચિત જાહેર RPM અથવા દૈનિક ક્વોટાની પુષ્ટિ થયેલી નથી. | -| `mnn-ai` | `mnn-ai` | MNN AI | API કી, એગ્રીગેટર | [લિંક](https://mnnai.ru) | મફત પ્લાન: માસિક $1 ક્રેડિટ, 10 RPM અને ફક્ત Free તરીકે ચિહ્નિત મોડેલ્સની ઍક્સેસ. | -| `modal` | `mdl` | Modal | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://modal.com/docs) | જો સક્ષમ હોય, તો તમારા Modal ડિપ્લોયમેન્ટને સુરક્ષિત રાખતા bearer ટોકનનો ઉપયોગ કરો. આધાર URL તમારી OpenAI-સુસંગત Modal ઍપ તરફ નિર્દેશ કરવો જોઈએ, ઉદાહરણ તરીકે https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API કી | [લિંક](https://modelscope.cn) | ModelScope API-Inference મારફતે મફત ટિયર — Alibaba એકાઉન્ટ જરૂરી છે. | -| `monsterapi` | `monster` | MonsterAPI | API કી | [લિંક](https://monsterapi.ai) | ⚠️ **અપ્રચલિત.** Monster APIએ 2026-06-30ના રોજ કામગીરી બંધ કરી. વૈકલ્પિક OpenAI-સુસંગત પ્રદાતાઓનો ઉપયોગ કરો. | -| `moonshot` | `moonshot` | Kimi | API કી | [લિંક](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API કી | [લિંક](https://morphllm.com) | મફત ટિયર: 250K ક્રેડિટ/મહિનો, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API કી | [લિંક](https://github.com/meta-llama/llama-stack) | તમારા META_API_KEY env varનો Bearer ટોકન તરીકે ઉપયોગ કરો. Muse Code CLI OpenAI Responses API વાયર ફોર્મેટ (POST /responses)નો ઉપયોગ કરે છે. | -| `naga-ac` | `naga` | Naga.ac | API કી, એગ્રીગેટર | [લિંક](https://naga.ac) | naga.ac પરથી API કી મેળવો — Google/GitHub/Discord સાઇનઅપ ઉપલબ્ધ છે. | -| `naga-ai` | `naga-ai` | Naga AI | API કી, એગ્રીગેટર | [લિંક](https://naga.ac) | :free તરીકે ચિહ્નિત મોડેલો સાર્વજનિક રીતે સૂચિબદ્ધ છે, પરંતુ કોઈ આંકડાકીય ક્વોટાની પુષ્ટિ થયેલી નથી. Nagaની નીતિ ચેતવણી આપે છે કે ફ્રી-ટિયર પ્રોમ્પ્ટ અને આઉટપુટ એકત્રિત કરવામાં આવી શકે છે અથવા તાલીમ માટે ઉપયોગમાં લેવાઈ શકે છે. | -| `nanogpt` | `nanogpt` | NanoGPT | API કી | [લિંક](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API કી | [લિંક](https://bynara.id) | મફત NaraRouter એકાઉન્ટ બનાવો, તમારું Telegram લિંક કરો (/v1 જવાબો પહેલાં આવશ્યક), પછી કીને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `navy` | `navy` | NavyAI | API કી | [લિંક](https://api.navy) | NavyAI ડૅશબોર્ડમાંથી મફત API કી બનાવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `nebius` | `nebius` | Nebius AI | API કી | [લિંક](https://nebius.com) | API પરીક્ષણ માટે સાઇનઅપ પર ~$1 ટ્રાયલ ક્રેડિટ | -| `nlpcloud` | `nlpc` | NLP Cloud | API કી | [લિંક](https://docs.nlpcloud.com) | Authorization: Token માં તમારી NLP Cloud API કીનો ઉપયોગ કરો. ડિફૉલ્ટ રૂપે OmniRoute https://api.nlpcloud.io/v1/gpu//chatbot પરના ચેટબોટ એન્ડપોઇન્ટને લક્ષ્ય બનાવે છે. | -| `nomic` | `nomic` | Nomic | API કી | [લિંક](https://nomic.ai) | atlas.nomic.ai પરથી API કી મેળવો | -| `nous-research` | `nous` | Nous Research | API કી | [લિંક](https://portal.nousresearch.com/help) | તમારી Nous Portal API કીનો ઉપયોગ કરો. OmniRoute https://inference-api.nousresearch.com/v1 પરના અધિકૃત OpenAI-સુસંગત ઇન્ફરન્સ એન્ડપોઇન્ટને લક્ષ્ય બનાવે છે. | -| `novita` | `novita` | Novita AI | API કી, વિડિયો, એગ્રીગેટર | [લિંક](https://novita.ai) | સાઇનઅપ પર $0.50 ટ્રાયલ ક્રેડિટ (લગભગ 1 વર્ષ માટે માન્ય) | -| `nscale` | `nscale` | nScale | API કી | [લિંક](https://nscale.com) | ઇન્ફરન્સ પરીક્ષણ માટે સાઇનઅપ પર $5ની મફત ક્રેડિટ | -| `nube` | `nube` | Nube.sh | API કી | [લિંક](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API કી | [લિંક](https://build.nvidia.com) | મફત ડેવલપર ઍક્સેસ: ~40 RPM, 70+ મોડેલ (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.oracle.com/artificial-intelligence/generative-ai) | તમારી OCI Generative AI API કી અથવા IAM bearer ટોકનનો ઉપયોગ કરો. મૂળ URL https://inference.generativeai..oci.oraclecloud.com/openai/v1/ હોઈ શકે છે. | -| `ofoxai` | `ofoxai` | OfoxAI | API કી, એગ્રીગેટર | [લિંક](https://ofox.ai) | વર્તમાન કૅટલૉગ જાહેર આંકડાકીય ક્વોટા વિના 10+ મફત મોડેલોની જાહેરાત કરે છે; પ્રોડક્શનમાં ઉપયોગ કરતાં પહેલાં અપસ્ટ્રીમ ઉદ્ભવ, ડેટા જાળવણી અને તાલીમની શરતોની સમીક્ષા કરો. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API કી | [લિંક](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API કી | [લિંક](https://1min.ai) | https://docs.1min.ai/docs/api/create-api-key પર API કી બનાવો, પછી તેને અહીં પેસ્ટ કરો. | -| `openadapter` | `oad` | OpenAdapter | API કી | [લિંક](https://openadapter.dev) | Authorization: Bearer sk-cv-માં તમારી OpenAdapter API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. APIનો મૂળ URL: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API કી | [લિંક](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API કી | [લિંક](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API કી | [લિંક](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API કી | [લિંક](https://openference.com) | મફત પ્લાન: ઓપન-સોર્સ મોડેલો સાથે 3-દિવસની ટ્રાયલ — કોઈ ક્રેડિટ કાર્ડ જરૂરી નથી | -| `openrouter` | `openrouter` | OpenRouter | API કી, એગ્રીગેટર | [લિંક](https://openrouter.ai) | :free પ્રત્યય સાથે $0/token પર મફત મોડેલ — 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API કી | [લિંક](https://openvecta.com) | LLM, એમ્બેડિંગ અને રીઝનિંગ મોડેલોમાં OpenAI-સુસંગત ઇન્ફરન્સ માટે સાઇનઅપ પર મફત ક્રેડિટ | -| `opper` | `opper` | Opper | API કી, એગ્રીગેટર | [લિંક](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API કી | [લિંક](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API કી | [લિંક](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API કી | [લિંક](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API કી | [લિંક](https://www.perplexity.ai) | તમારી Perplexity API કીનો ઉપયોગ કરો. OmniRoute, Agent API મોડેલ IDને Perplexityના Responses-સુસંગત એન્ડપોઇન્ટ મારફતે રૂટ કરે છે. | -| `piapi` | `pi` | PiAPI | API કી, એગ્રીગેટર | [લિંક](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API કી | [લિંક](https://pioneer.ai) | $75ની મફત વપરાશ ક્રેડિટ — કોઈ ક્રેડિટ કાર્ડ જરૂરી નથી | -| `plamo` | `plamo` | PLaMo | API કી | [લિંક](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API કી, એગ્રીગેટર | [લિંક](https://creator.poe.com/api-reference) | Poe OpenAI-સુસંગત API માટે Bearer API કી. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API કી, એગ્રીગેટર | [લિંક](https://poixe.com) | વર્તમાન સાર્વજનિક મફત મર્યાદાઓ ઓછી અને મોડેલ-જૂથ વિશિષ્ટ છે: large-cup મોડેલો માટે 2 RPM/5 RPD અને small-cup મોડેલો માટે 20 RPM/50 RPD. | -| `pollinations` | `pol` | Pollinations AI | API કી, વિડિયો | [લિંક](https://pollinations.ai) | દસ્તાવેજીકૃત મફત મોડેલો માટે અનામી/કી-રહિત ઍક્સેસ શ્રેષ્ઠ-પ્રયાસ આધારિત છે. સ્થાનિક v3.8.50 ચકાસણી (2026-07-31)માં એ જ નેટવર્ક પરથી OmniRoute મારફતે 401 અને સીધી અપસ્ટ્રીમ તપાસમાં Cloudflare 1010 મળ્યાં હતાં. પ્રીમિયમ મોડેલો માટે હજુ પણ enter.pollinations.ai પરથી Pollinations API કી જરૂરી છે. | -| `poolside` | `poolside` | Poolside | API કી | [લિંક](https://poolside.ai) | Laguna S 2.1 અને XS 2.1 પૂર્વાવલોકન દરમિયાન મફત છે; કોઈ સાર્વજનિક આંકડાકીય ક્વોટા પ્રકાશિત થયો નથી. | -| `predibase` | `predibase` | Predibase | API કી | [લિંક](https://predibase.com) | ⚠️ **અપ્રચલિત.** serving.app.predibase.com હવે રિઝોલ્વ થતું નથી (ચકાસણી 2026-06-19); મેનેજ્ડ સર્વિંગ API બંધ કરાયેલું જણાય છે. | -| `publicai` | `publicai` | PublicAI | API કી | [લિંક](https://publicai.co) | API કી જરૂરી છે — સાઇનઅપ વખતે એક વખતની ક્રેડિટ, ત્યારબાદ ચૂકવણીપાત્ર | -| `qianfan` | `qianfan` | Baidu Qianfan | API કી | [લિંક](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API કી | [લિંક](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API કી | [લિંક](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API કી | [લિંક](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API કી, છબી | [લિંક](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API કી | [લિંક](https://regolo.ai) | regolo.ai પરથી તમારી Regolo API કી મેળવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `reka` | `reka` | Reka | API કી | [લિંક](https://docs.reka.ai/chat/overview) | તમારી Reka API કીનો ઉપયોગ કરો. સુસંગતતા માટે OmniRoute OpenAI-સુસંગત બેઝ URL https://api.reka.ai/v1 ને સપોર્ટ કરે છે અને Authorization તથા X-Api-Key બંને હેડર મોકલે છે. | -| `requesty` | `requesty` | Requesty | API કી | [લિંક](https://requesty.ai) | મફત સ્તર ~200 વિનંતીઓ/દિવસ - મલ્ટિ-મોડલ રાઉટિંગ ગેટવે (300+ મોડલ) | -| `routeway` | `routeway` | Routeway | API કી | [લિંક](https://routeway.ai) | routeway.ai પર મફત API કી બનાવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `runwayml` | `runway` | Runway | API કી, વિડિયો | [લિંક](https://docs.dev.runwayml.com) | Authorization: Bearer માં તમારી Runway API કીનો ઉપયોગ કરો. OmniRoute https://api.dev.runwayml.com/v1 પરની વર્તમાન Runway API ને લક્ષ્ય બનાવે છે અને જરૂરી X-Runway-Version હેડર આપમેળે મોકલે છે. | -| `sambanova` | `samba` | SambaNova | API કી | [લિંક](https://sambanova.ai) | સાઇન અપ કરતાં $5 ની મફત ક્રેડિટ (30 દિવસની માન્યતા), ક્રેડિટ કાર્ડ જરૂરી નથી | -| `sap` | `sap` | SAP Generative AI Hub | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | તમારા SAP AI Core bearer ટોકનનો ઉપયોગ કરો. બેઝ URL તમારું AI_API_URL રૂટ અથવા Generative AI Hub માંથી deploymentUrl હોઈ શકે છે. | -| `sarvam` | `sarvam` | Sarvam AI | API કી | [લિંક](https://docs.sarvam.ai) | સાઇન અપ કરતાં ₹1,000 ની મફત ક્રેડિટ — ક્યારેય સમાપ્ત થતી નથી | -| `scaleway` | `scw` | Scaleway AI | API કી | [લિંક](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | નવા એકાઉન્ટ માટે 1M મફત ટોકન — EU/GDPR અનુરૂપ (પેરિસ), Qwen3 235B અને Llama 70B | -| `sealion` | `sealion` | SEA-LION | API કી | [લિંક](https://sea-lion.ai) | Google વડે sea-lion.ai પર સાઇન ઇન કરો (કાર્ડ નહીં, પ્રાદેશિક પ્રતિબંધ નહીં), API કી બનાવો અને પછી તેને અહીં પેસ્ટ કરો. | -| `seekai` | `ska` | SeekAi | API કી, એગ્રીગેટર | [લિંક](https://seekai.cc) | https://seekai.cc પર API કી બનાવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | -| `segmind` | `segmind` | Segmind | API કી, છબી, વિડિયો | [લિંક](https://segmind.com) | x-api-key હેડરમાં તમારી Segmind API કીનો ઉપયોગ કરો. OmniRoute https://api.segmind.com/v1/ ને લક્ષ્ય બનાવે છે અને જનરેટ થયેલી છબી/વિડિયોના બાઇટ્સ સીધા પરત કરે છે. | -| `sensenova` | `sensenova` | SenseNova | API કી | [લિંક](https://platform.sensenova.cn) | platform.sensenova.cn પર API કી મેળવો | -| `siliconflow` | `siliconflow` | SiliconFlow | API કી | [લિંક](https://cloud.siliconflow.com) | ઓળખની ચકાસણી પછી $1 ની મફત ક્રેડિટ ઉપરાંત હાલમાં સૂચિબદ્ધ $0 મોડલ; ઉપલબ્ધતા અને મર્યાદાઓ બદલાઈ શકે છે | -| `snowflake` | `snowflake` | Snowflake Cortex | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API કી | [લિંક](https://xinghuo.xfyun.cn) | console.xfyun.cn પર API કી મેળવો | -| `speka` | `speka` | Speka AI | API કી, એગ્રીગેટર | [લિંક](https://speka.me) | મફત પ્લાન: દર મહિને $1 નો ઉપયોગ, 10 RPM, એક API કી અને ઓપન મોડલ તથા પ્લેગ્રાઉન્ડની ઍક્સેસ; કાર્ડ જરૂરી નથી. | -| `stability-ai` | `stability` | Stability AI | API કી, છબી | [લિંક](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API કી | [લિંક](https://stepfun.com) | platform.stepfun.com પર API કી મેળવો | -| `sumopod` | `sumopod` | SumoPod | API કી | [લિંક](https://ai.sumopod.com) | Authorization: Bearer માં તમારી SumoPod API કી (sk-...) નો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API કી | [લિંક](https://suno.ai) | suno.ai પરથી સેશન કૂકી પેસ્ટ કરો (Clerk પ્રમાણીકરણ) | -| `synthetic` | `synthetic` | Synthetic | API કી, એગ્રીગેટર | [લિંક](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API કી, એગ્રીગેટર | [લિંક](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API કી | [લિંક](https://hunyuan.tencent.com) | console.cloud.tencent.com પર API કી મેળવો | -| `thebai` | `thebai` | TheB.AI | API કી, એગ્રીગેટર | [લિંક](https://theb.ai) | TheB.AI OpenAI-સુસંગત ગેટવે માટે Bearer API કી. | -| `tinyfish` | `tf` | TinyFish Fetch | API કી | [લિંક](https://docs.tinyfish.ai/fetch-api) | agent.tinyfish.ai/api-keys પરથી X-API-Key | -| `together` | `together` | Together AI | API કી, વિડિયો | [લિંક](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API કી | [લિંક](https://agent-router.gaib.ai) | Authorization: Bearer માં તમારી Token Kiosk API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત ગેટવે. API બેઝ URL: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API કી, એગ્રીગેટર | [લિંક](https://www.tokenreply.com) | મફત તરીકે ટૅગ કરેલા મોડલની દૈનિક મર્યાદા મોડલ અને અભિયાન પ્રમાણે અલગ હોય છે; કોઈ નિશ્ચિત વૈશ્વિક મફત ક્વોટા પ્રકાશિત કરાયો નથી. | -| `tokenrouter` | `trk` | TokenRouter | API કી | [લિંક](https://tokenrouter.com) | Authorization: Bearer માં તમારી TokenRouter API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API કી, છબી | [લિંક](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API કી | [લિંક](https://docs.opentyphoon.ai) | 5 req/s અને 200 req/m ની દર મર્યાદા સાથે મફત API કી. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API કી | [લિંક](https://uncensored.com) | તમારી uncensored.com Developer API કી (uai_sk_live_...) નો ઉપયોગ કરો. OmniRoute તેને OpenAI-સુસંગત https://api.uncensored.com/api/v1 એન્ડપોઇન્ટ પર X-api-key હેડર તરીકે મોકલે છે. કી ક્યારેય સમાપ્ત થતી નથી. આ મીટર કરેલું/ક્રેડિટ્સ આધારિત માધ્યમ છે; અમીટર કરેલી સબ્સ્ક્રિપ્શન ચેટ અલગ 'uc' પ્રદાતા છે. | -| `udio` | `udio` | Udio | API કી | [લિંક](https://udio.com) | udio.com પરથી સેશન કૂકી (Supabase પ્રમાણીકરણ) પેસ્ટ કરો | -| `unorouter` | `unorouter` | UnoRouter | API કી, એગ્રીગેટર | [લિંક](https://unorouter.ai) | :free પ્રત્યય ધરાવતા મોડલ્સ બેલેન્સમાંથી રકમ ઘટાડતા નથી; દરેક વપરાશકર્તા માટે દરેક મફત મોડલ દીઠ મર્યાદા 1 વિનંતી/મિનિટ છે. | -| `upstage` | `upstage` | Upstage | API કી | [લિંક](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API કી | [લિંક](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API કી | [લિંક](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API કી, એગ્રીગેટર | [લિંક](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://cloud.google.com/vertex-ai) | Service Account JSON, OAuth ઍક્સેસ ટોકન, Vertex Express API કી અથવા સર્વિસ-એકાઉન્ટ સાથે બંધાયેલ અધિકૃતતા કી પ્રદાન કરો. Express મોડ માત્ર Gemini ને સપોર્ટ કરે છે; પાર્ટનર મોડલ્સ માટે પ્રોજેક્ટ-સ્કોપ્ડ ઓળખપત્રો જરૂરી છે. | -| `vertex-partner` | `vp` | Vertex AI Partners | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://cloud.google.com/vertex-ai) | Service Account JSON અથવા OAuth ઓળખપત્રો પ્રદાન કરો. સર્વિસ-એકાઉન્ટ સાથે બંધાયેલ અધિકૃતતા કી શોધને પણ સપોર્ટ કરે છે, પરંતુ પાર્ટનર ઇન્ફરન્સ માટે વધુમાં તેનો Google Cloud પ્રોજેક્ટ ID જરૂરી છે. માનક Express કીઓ માત્ર Gemini ને સપોર્ટ કરે છે. | -| `void-ai` | `void-ai` | Void AI | API કી, એગ્રીગેટર | [લિંક](https://voidai.app) | સાર્વજનિક મોડલ કેટલોગ કેટલાક મોડલ્સને મફત પ્લાનની આવશ્યકતા સાથે ચિહ્નિત કરે છે, પરંતુ ઍક્સેસ શરતી છે અને કોઈ આંકડાકીય ક્વોટાની પુષ્ટિ થયેલી નથી. | -| `volcengine` | `volcengine` | Volcengine | API કી | [લિંક](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API કી | [લિંક](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | તમારું Volcano Engine એકાઉન્ટ કનેક્ટ કરો અથવા Ark Agent Plan સબ્સ્ક્રિપ્શન API કીનો ઉપયોગ કરો. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API કી | [લિંક](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | તમારું Volcano Engine એકાઉન્ટ કનેક્ટ કરો અથવા Ark Coding Plan સબ્સ્ક્રિપ્શન API કીનો ઉપયોગ કરો. | -| `voyage-ai` | `voyage` | Voyage AI | API કી, એમ્બેડ/પુનઃક્રમનિર્ધારણ | [લિંક](https://www.voyageai.com) | Voyage AI એમ્બેડિંગ્સ અને પુનઃક્રમનિર્ધારણ API માટેની Bearer API કી. | -| `wafer` | `wafer` | Wafer AI | API કી | [લિંક](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API કી | [લિંક](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.ibm.com/products/watsonx-ai) | તમારા watsonx bearer ટોકનનો ઉપયોગ કરો. બેઝ URL https://.ml.cloud.ibm.com/ml/gateway/v1/ અથવા સ્વ-સંચાલિત /ml/gateway/v1 એન્ડપોઇન્ટ હોઈ શકે છે. | -| `writer` | `writer` | Writer | API કી | [લિંક](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API કી | [લિંક](https://x5lab.dev) | તમારી X5Lab API કી (x5-...) નો Authorization: Bearer માં ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API કી | [લિંક](https://x.ai) | અધિકૃત xAI API કીનો ઉપયોગ કરો અથવા xAI OAuth વડે સાઇન ઇન કરો. Grok Build JWT સેશન્સ અલગ પ્રદાતા તરીકે જ રહે છે. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API કી | [લિંક](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API કી | [લિંક](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API કી, એગ્રીગેટર | [લિંક](https://xkiro.com) | xkiro.com પર મફત એકાઉન્ટ બનાવો અને કી અહીં પેસ્ટ કરો (Bearer; x-api-key પણ સ્વીકાર્ય છે). | -| `yi` | `yi` | Yi (01.AI) | API કી | [લિંક](https://01.ai) | platform.lingyiwanwu.com પરથી API કી મેળવો | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API કી, એગ્રીગેટર | [લિંક](https://yolo-auto.com) | મફત API ઍક્સેસ વિનંતી-મર્યાદિત છે અને પરીક્ષણ માટે નિર્ધારિત છે; કોઈ આંકડાકીય દૈનિક ક્વોટા પ્રકાશિત કરવામાં આવ્યો નથી અને મફત ઍક્સેસ અનિશ્ચિત સમય સુધી આપવાનું વચન નથી. | -| `zai` | `zai` | Z.AI | API કી | [લિંક](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API કી | [લિંક](https://zenmux.ai) | તમારી ZenMux API કીનો Authorization: Bearer માં ઉપયોગ કરો. ZenMux સંપૂર્ણપણે OpenAI-સુસંગત છે. બેઝ URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API કી, એગ્રીગેટર | [લિંક](https://www.zerolimitai.com) | અસ્થાયી મફત ટ્રાયલની જાહેરાત કરવામાં આવે છે, પરંતુ અધિકૃત પૃષ્ઠો 3 અને 7 દિવસ વિશે પરસ્પર વિરોધાભાસી માહિતી આપે છે; દરરોજ 100 કૉલ્સના દાવાને કાયમી માનવામાં આવતો નથી. | -| `zylo-api` | `zylo` | Zylo API | API કી, એગ્રીગેટર | [લિંક](https://zyloai.net) | Basic પ્લાન: 10 RPM, 7,200 વિનંતીઓ/દિવસ અને 200,000 ટોકન્સ/દિવસ; Basic ટેક્સ્ટ મોડલ્સ સુધી મર્યાદિત. | +## API કી પ્રદાતાઓ (ચૂકવેલ / મફત ક્રેડિટ સાથે ચૂકવેલ) (242) + +| ID | ઉપનામ | નામ | ટૅગ્સ | વેબસાઇટ | નોંધો | +| ------------------------ | --------------- | ------------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | API કી | [લિંક](https://ai.360.cn) | ai.360.cn પરથી API કી મેળવો | +| `agentrouter` | `agentrouter` | AgentRouter | API કી, એગ્રીગેટર | [લિંક](https://agentrouter.org) | સાઇન અપ કરવા પર $200ની મફત ક્રેડિટ — મલ્ટિ-મોડલ રૂટિંગ ગેટવે | +| `agnes` | `agnes` | Agnes AI | API કી, વિડિયો | [લિંક](https://agnes-ai.com) | agnes-ai.com પરથી API કી મેળવો | +| `agnes-cn` | `agnescn` | Agnes AI (ચીન) | API કી | [લિંક](https://api.agnes-ai.cn) | Agnes CN સાઇટ પરથી API કી મેળવો. | +| `ai21` | `ai21` | AI21 Labs | API કી | [લિંક](https://www.ai21.com) | સાઇન અપ કરવા પર $10ની ટ્રાયલ ક્રેડિટ (3 મહિના માટે માન્ય), ક્રેડિટ કાર્ડની જરૂર નથી | +| `aimlapi` | `aiml` | AI/ML API | API કી, એગ્રીગેટર | [લિંક](https://aimlapi.com) | મફત ટિયર થોભાવવામાં આવ્યું છે (2026) — AI/ML API હવે માત્ર ઉપયોગ પ્રમાણે ચુકવણીના ધોરણે ઉપલબ્ધ છે (ન્યૂનતમ $20 ટૉપ-અપ); કોઈ પુનરાવર્તિત મફત ક્રેડિટ નથી. | +| `ainative` | `ainative` | AINative Studio | API કી | [લિંક](https://ainative.studio) | ainative.studio પર મફત API કી બનાવો (કાર્ડની જરૂર નથી), પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `aion` | `aion` | Aion Labs | API કી | [લિંક](https://www.aionlabs.ai) | aionlabs.ai પર મફત API કી બનાવો (કાર્ડની જરૂર નથી), પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API કી | [લિંક](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (ચીન) | API કી | [લિંક](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API કી | [લિંક](https://developer.ant-ling.com/en/docs/) | Ant Ling API કન્સોલ (https://chat.ant-ling.com/open) પર નોંધણી કરીને API કી બનાવો, પછી તેને અહીં પેસ્ટ કરો. OmniRoute ચૅટ ટ્રાફિકને https://api.ant-ling.com/v1/chat/completions પર રૂટ કરે છે; પ્રદાતા OpenAI-સુસંગત છે અને Anthropic-સુસંગત ઇન્ટરફેસ પણ પ્રદાન કરે છે. | +| `anthropic` | `anthropic` | Anthropic | API કી | [લિંક](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API કી, એગ્રીગેટર | [લિંક](https://anyapi.ai) | મફત પ્લાન: પાત્ર Free/Basic મોડલ માટે દરરોજ 100,000 ANY Tokens અને 100 RPM; ક્રેડિટ કાર્ડની જરૂર નથી. | +| `api-airforce` | `af` | Api.airforce | API કી | [લિંક](https://api.airforce) | Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash અને DeepSeek-V3 સહિત મફત ટિયરના 55 મોડલ | +| `arcee-ai` | `arcee` | Arcee AI | API કી | [લિંક](https://arcee.ai) | arcee.ai પરથી API કી મેળવો | +| `auriko` | `auriko` | Auriko | API કી, એગ્રીગેટર | [લિંક](https://www.auriko.ai) | મફત પ્લાનમાં 1,000 Platform RPM અને 10,000 BYOK RPM ઉપલબ્ધ છે. પ્લેટફોર્મ ઇન્ફરન્સ માટે હજુ પણ પ્રદાતાનો ખર્ચ લાગુ પડે છે; આ મફત ટોકન પૂલ અથવા અમર્યાદિત મફત ઇન્ફરન્સ નથી. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://learn.microsoft.com/azure/ai-foundry) | તમારી Azure AI Foundry કીનો ઉપયોગ કરો. બેઝ URL https://.services.ai.azure.com/openai/v1/ અથવા https://.openai.azure.com/openai/v1/ હોઈ શકે છે. | +| `azure-openai` | `azure` | Azure OpenAI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://azure.microsoft.com/products/ai-services/openai-service) | તમારી Azure OpenAI API કીનો ઉપયોગ કરો. બેઝ URL તમારા રિસોર્સનું એન્ડપોઇન્ટ હોવું જોઈએ, ઉદાહરણ તરીકે https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API કી | [લિંક](https://b.ai) | b.aiના OpenAI-સુસંગત LLM ગેટવે માટેની Bearer API કી (TheB.AIથી અલગ). https://docs.b.ai પર કી બનાવો, પછી OpenAI-સુસંગત બેઝ URL તરીકે https://api.b.ai/v1નો ઉપયોગ કરો. | +| `baichuan` | `baichuan` | Baichuan | API કી | [લિંક](https://www.baichuan-ai.com/) | platform.baichuan-ai.com પરથી API કી મેળવો | +| `baidu` | `baidu` | Baidu (ERNIE) | API કી | [લિંક](https://ernie.baidu.com/) | console.bce.baidu.com પરથી API કી મેળવો | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API કી | [લિંક](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API કી | [લિંક](https://baseten.co) | GPU ઇન્ફરન્સ માટે $30ની મફત ટ્રાયલ ક્રેડિટ | +| `bazaarlink` | `bzl` | BazaarLink | API કી | [લિંક](https://bazaarlink.ai) | Authorization: Bearer માં તમારી BazaarLink API કી (જે sk-bl-થી શરૂ થાય છે) વાપરો. OpenAI SDK બેઝ URL https://bazaarlink.ai/api/v1 સાથે કાર્ય કરે છે. મોડલ provider/model-name ફોર્મેટનો ઉપયોગ કરે છે. | +| `bedrock` | `bedrock` | Amazon Bedrock | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://aws.amazon.com/bedrock) | તમારી Amazon Bedrock API કીનો ઉપયોગ કરો અને જ્યાં તમારા મોડલ સક્ષમ કરેલા છે તે AWS રીજનને કૉન્ફિગર કરો (ઉદાહરણ તરીકે eu-west-2). OmniRoute સીધું જ Bedrockના મૂળ Converse APIને કૉલ કરે છે. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API કી, ઇમેજ | [લિંક](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API કી | [લિંક](https://blackbox.ai) | ⚠️ **અપ્રચલિત.** api.blackbox.ai દરેક પાથ વેરિઅન્ટ પર HTTP 404 પરત કરે છે (તપાસ 2026-08-21); જાહેર ઇન્ફરન્સ ઇન્ટરફેસને પ્રતિબંધિત enterprise.blackbox.ai/v1 એન્ડપોઇન્ટ પર ખસેડવામાં આવ્યું છે. | +| `bluesminds` | `bm` | BluesMinds | API કી | [લિંક](https://www.bluesminds.com) | દૈનિક મફત pi ક્રેડિટ — GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen અને Kimi K2 સહિત 200થી વધુ મોડલને સપોર્ટ કરે છે | +| `byteplus` | `bpm` | BytePlus ModelArk | API કી | [લિંક](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API કી | [લિંક](https://bytez.com) | $1ની મફત ક્રેડિટ, દર 4 અઠવાડિયે ફરી ઉપલબ્ધ થાય છે | +| `cerebras` | `cerebras` | Cerebras | API કી | [લિંક](https://inference.cerebras.ai) | સાઇન અપ કરવા પર એક વખત $5ની ક્રેડિટ (30 દિવસની માન્યતા); ચુકવણીની પદ્ધતિ જરૂરી છે. આ પુનરાવર્તિત મફત ટિયર નથી. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API કી | [લિંક](https://hyper.charm.land) | સાઇન અપ કરવા પર દર મહિને 100 મફત Hypercredits | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API કી, એગ્રીગેટર | [લિંક](https://api.oriper.com) | અધિકૃત મેટાડેટામાં દર મહિને 2M ટોકનની જાહેરાત કરવામાં આવી છે, પરંતુ ઑડિટ દરમિયાન જાહેર સાઇટ અને દસ્તાવેજીકરણ બ્લૉક હતાં; ક્વોટા અને બ્રાન્ડ મૅપિંગને અપ્રમાણિત માનો. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API કી, એગ્રીગેટર | [લિંક](https://chatanywhere.tech) | ફક્ત વ્યક્તિગત, શૈક્ષણિક અથવા સંશોધન ઉપયોગ માટે: જાહેર દસ્તાવેજોમાં દરરોજ 10,000 પૉઇન્ટ અને દરેક IP/કી દીઠ દરરોજ 200 વિનંતીઓનો ઉલ્લેખ છે; વ્યાવસાયિક ટ્રાફિક માટે ઉપયોગ કરશો નહીં. | +| `cheaperinference` | `cinf` | Cheaper Inference | API કી | [લિંક](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API કી | [લિંક](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API કી, એગ્રીગેટર | [લિંક](https://chutes.ai) | Chutesના OpenAI-સુસંગત ગેટવે માટે બેરર API કી. | +| `clarifai` | `clarifai` | Clarifai | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://docs.clarifai.com) | તમારા Clarifai PAT અથવા ઍપ-વિશિષ્ટ API કીનો ઉપયોગ કરો. OmniRoute https://api.clarifai.com/v2/ext/openai/v1 પરના OpenAI-સુસંગત એન્ડપૉઇન્ટને લક્ષ્ય બનાવે છે અને Authorization: Key વડે પ્રમાણીકરણ કરે છે. | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API કી, એગ્રીગેટર | [લિંક](https://cloudcode.one) | પ્રકાશિત મફત મોડલોમાં glm-4.7-flash અને glm-4.6v-flash સામેલ છે; કોઈ આંકડાકીય ક્વોટા પ્રકાશિત કરાયો નથી અને કી બનાવવા માટે ક્રેડિટ અથવા કૂપનની જરૂર પડી શકે છે. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API કી | [લિંક](https://developers.cloudflare.com/workers-ai) | API Token અને Account ID બંને જરૂરી છે (dash.cloudflare.com પર ઉપલબ્ધ) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API કી | [લિંક](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API કી | [લિંક](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API કી | [લિંક](https://cohere.com) | મફત ટ્રાયલ: પરીક્ષણ માટે દર મહિને 1,000 API કૉલ, ક્રેડિટ કાર્ડની જરૂર નથી | +| `command-code` | `cmd` | Command Code | API કી | [લિંક](https://commandcode.ai/) | Command Code API કીનો ઉપયોગ કરો. વિનંતીઓ Command Codeના /provider/v1/chat/completions એન્ડપૉઇન્ટ પર મોકલવામાં આવે છે. | +| `coze` | `coze` | Coze | API કી | [લિંક](https://coze.com) | coze.com/open/api પરથી API કી મેળવો | +| `crof` | `crof` | CrofAI | API કી | [લિંક](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API કી | [લિંક](https://cursor.com/dashboard/api) | cursor.com/dashboard/api પરથી Cursor વપરાશકર્તા API કી (crsr_...) પેસ્ટ કરો. OmniRoute જરૂર પડ્યે તેને સેશન ટોકન માટે એક્સચેન્જ કરે છે; કોઈ IDE અથવા cursor-agent ઇન્સ્ટૉલ કરવાની જરૂર નથી. ઉપયોગનું બિલ કીના માલિક Cursor પ્લાનમાં વસૂલવામાં આવે છે. | +| `dahl` | `dahl` | Dahl | API કી | [લિંક](https://inference.dahl.global) | ટોકન આપમેળે જનરેટ કરવા માટે 'Add Account' પર ક્લિક કરો અથવા મેન્યુઅલ API કી ઉમેરો. | +| `databricks` | `databricks` | Databricks | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://docs.datarobot.com) | તમારા DataRobot API ટોકનનો ઉપયોગ કરો. વૈકલ્પિક Base URL એકાઉન્ટ રૂટ (LLM Gateway માટે) અથવા /api/v2/deployments/ હેઠળનો ડિપ્લોયમેન્ટ URL હોઈ શકે છે. | +| `deepai` | `deepai` | DeepAI | API કી, ઇમેજ | [લિંક](https://deepai.org) | તમારી DeepAI API કીનો ઉપયોગ કરો. deepai.org પરથી કી મેળવો — Pro સબ્સ્ક્રિપ્શન ($9.99/મહિનો) જરૂરી છે. | +| `deepinfra` | `deepinfra` | DeepInfra | API કી | [લિંક](https://deepinfra.com) | API પરીક્ષણ અને મોડલ અન્વેષણ માટે સાઇન અપ કરતાં મફત ક્રેડિટ | +| `deepseek` | `ds` | DeepSeek | API કી | [લિંક](https://platform.deepseek.com) | સાઇન અપ કરતાં 5M મફત ટોકન — ક્રેડિટ કાર્ડની જરૂર નથી | +| `dgrid` | `dgrid` | DGrid | API કી | [લિંક](https://dgrid.ai) | DGrid મફત મોડલ્સ રાઉટર: દર મિનિટે 10 વિનંતીઓ અને દરરોજ 100 વિનંતીઓ. જીવનકાળ માટે $5નું ટૉપ-અપ દર મિનિટે 20 વિનંતીઓ અને દરરોજ 1,000 વિનંતીઓ સુધીની મર્યાદા અનલૉક કરે છે. | +| `dify` | `dify` | Dify | API કી | [લિંક](https://dify.ai) | તમારા Dify ઇન્સ્ટન્સમાંથી API કી મેળવો. | +| `digitalocean` | `digitalocean` | DigitalOcean | API કી | [લિંક](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API કી | [લિંક](https://dit.ai) | Authorization: Bearer માં તમારી dit.ai API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત — સીધું જ બદલી શકાય તેવું વિકલ્પ; ફક્ત બેઝ URLને https://api.dit.ai/v1 પર બદલો. | +| `doubao` | `doubao` | Doubao | API કી | [લિંક](https://doubao.com) | console.volcengine.com પરથી API કી મેળવો | +| `dxnt` | `dxnt` | DXNT / DX Token | API કી, એગ્રીગેટર | [લિંક](https://www.dxnt.com) | મફત એકાઉન્ટ માટે દરરોજ 100 કૉલ દસ્તાવેજીકૃત છે; આમંત્રણો દ્વારા ક્વોટા વધી શકે છે અને તે એકાઉન્ટ પ્રમાણે અલગ હોઈ શકે છે. | +| `electronhub` | `electronhub` | Electron Hub | API કી, એગ્રીગેટર | [લિંક](https://www.electronhub.ai) | મફત પ્લાન: :free મોડલ માટે 5 RPM, દર અઠવાડિયે $0.25ના ક્રેડિટ અને દરરોજ 10 Neutrinos; ફૅમિલી બજેટ પણ લાગુ પડે છે. | +| `empower` | `empower` | Empower | API કી, એગ્રીગેટર | [લિંક](https://docs.empower.dev) | Empowerના OpenAI-સુસંગત એન્ડપૉઇન્ટ માટે બેરર API કી. | +| `eurouter` | `eurouter` | EURouter | API કી, એગ્રીગેટર | [લિંક](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API કી | [લિંક](https://factory.ai) | Factoryના OpenAI-સુસંગત ગેટવે માટે બેરર API કી. | +| `fal-ai` | `fal` | Fal.ai | API કી, ઇમેજ | [લિંક](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API કી, એગ્રીગેટર | [લિંક](https://fastrouter.ai) | :free પ્રત્યય ધરાવતા મોડલ દરેક સંસ્થા અને મોડલ દીઠ દરરોજ 10 વિનંતીઓની મંજૂરી આપે છે; ઉપલબ્ધતા બદલાઈ શકે છે. | +| `featherless-ai` | `featherless` | Featherless AI | API કી | [લિંક](https://featherless.ai) | મફત ટિયર ઉપલબ્ધ છે — ક્રેડિટ કાર્ડની જરૂર નથી | +| `fenayai` | `fenayai` | FenayAI | API કી, એગ્રીગેટર | [લિંક](https://fenayai.com) | FenayAIના OpenAI-સુસંગત ગેટવે માટે બેરર API કી. | +| `fireworks` | `fireworks` | Fireworks AI | API કી | [લિંક](https://fireworks.ai) | API પરીક્ષણ માટે સાઇન અપ કરતાં $1ની મફત પ્રારંભિક ક્રેડિટ | +| `free-ai` | `free-ai` | Free.ai | API કી, એગ્રીગેટર | [લિંક](https://free.ai) | ઇમેઇલ ચકાસણી પછી દરરોજ 30,000 ટોકન સ્વ-હોસ્ટેડ મોડલોને આવરી લે છે. પૂલથી વધુ ઉપયોગનું બિલ મૂળ ખર્ચે લાગી શકે છે અને પ્રીમિયમ બાહ્ય મોડલો ચૂકવણીયુક્ત છે. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API કી | [લિંક](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API કી | [લિંક](https://freebuff.com) | Freebuff / Codebuff Auth Token દાખલ કરો (CLI લૉગિન અથવા સ્વચાલિત હાર્વેસ્ટર દ્વારા મેળવેલ). | +| `freeinference` | `freeinference` | FreeInference | API કી, એગ્રીગેટર | [લિંક](https://freeinference.org) | કાર્ડ વિના મફત સંશોધન ઍક્સેસ; Harvard સિવાયના અરજદારોને મેન્યુઅલ મંજૂરીની જરૂર પડે છે અને કોઈ સંખ્યાત્મક ક્વોટાની જાહેર ખાતરી આપવામાં આવતી નથી. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API કી | [લિંક](https://freemodel.dev) | સાઇનઅપ પર $300ની મફત ક્રેડિટ — ક્રેડિટ કાર્ડની જરૂર નથી. OpenAI-સુસંગત API દ્વારા GPT-5.4 અને GPT-5.5 (OpenAIના નવીનતમ ફ્લેગશિપ મોડલ્સ) ઍક્સેસ કરો. | +| `freetheai` | `fta` | FreeTheAi | API કી, એગ્રીગેટર | [લિંક](https://freetheai.xyz) | તમારી મફત API કી મેળવવા માટે FreeTheAi Discordમાં જોડાઓ. | +| `friendliai` | `friendli` | FriendliAI | API કી | [લિંક](https://friendli.ai) | સર્વરલેસ ઇન્ફરન્સ માટે મફત સ્તર — ક્રેડિટ કાર્ડની જરૂર નથી | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ્સ બનાવો અથવા g4f.dev સભ્ય કીનો ઉપયોગ કરો (એક કી g4f.dev/members.html પર બનાવો). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ્સ બનાવો અથવા g4f.dev સભ્ય કીનો ઉપયોગ કરો (એક કી g4f.dev/members.html પર બનાવો). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ્સ બનાવો અથવા g4f.dev સભ્ય કીનો ઉપયોગ કરો (એક કી g4f.dev/members.html પર બનાવો). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ્સ બનાવો અથવા g4f.dev સભ્ય કીનો ઉપયોગ કરો (એક કી g4f.dev/members.html પર બનાવો). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API કી, એગ્રીગેટર | [લિંક](https://g4f.space) | g4f.dev/chat પર અનામી કેક ક્રેડિટ્સ બનાવો અથવા g4f.dev સભ્ય કીનો ઉપયોગ કરો (એક કી g4f.dev/members.html પર બનાવો). | +| `galadriel` | `galadriel` | Galadriel | API કી | [લિંક](https://galadriel.com) | ⚠️ **અપ્રચલિત.** api.galadriel.ai હવે રિઝોલ્વ થતું નથી (તપાસ 2026-06-19); ઇન્ફરન્સ API બંધ કરવામાં આવ્યું હોય તેમ જણાય છે. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API કી | [લિંક](https://aistudio.google.com) | Google AI Studio દ્વારા મફત સ્તર ઉપલબ્ધ છે; વર્તમાન પ્રતિ-મોડલ ક્વોટા અને પ્રાદેશિક મર્યાદાઓ લાગુ પડે છે | +| `getgoapi` | `ggo` | GoAPI | API કી, એગ્રીગેટર | [લિંક](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API કી | [લિંક](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API કી | [લિંક](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | જાહેર Code Suggestions API માટે GitLab વ્યક્તિગત ઍક્સેસ ટોકન. gitlab.comનો ઉપયોગ ન કરતા હો ત્યારે સ્વ-હોસ્ટેડ બેઝ URL કૉન્ફિગર કરો. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API કી | [લિંક](https://opengateway.gitlawb.com) | મફત MiMo (xiaomi/mimo-v2.5) 2026-05માં રદ કરાયું — Opengateway હવે વપરાશ મુજબ ચૂકવણીનું ક્રેડિટ ગેટવે છે; કોઈ પુનરાવર્તિત મફત મોડલ નથી. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API કી | [લિંક](https://opengateway.gitlawb.com) | મફત Nemotron પ્રમોશન 2026-06માં સમાપ્ત થયું — GMI Cloud રૂટ હવે માત્ર વપરાશ મુજબ ચૂકવણીની ક્રેડિટ પર ઉપલબ્ધ છે. | +| `glm` | `glm` | GLM Coding | API કી | [લિંક](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (ચીન) | API કી | [લિંક](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API કી | [લિંક](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API કી | [લિંક](https://greenpt.com) | API સબ્સ્ક્રિપ્શન મફતમાં બનાવી શકાય છે; ઇન્ફરન્સનું બિલ પ્રતિ ટોકન ગણાય છે. કોઈ મફત ઇન્ફરન્સ ભથ્થું પ્રકાશિત કરવામાં આવ્યું નથી. | +| `groq` | `groq` | Groq | API કી | [લિંક](https://groq.com) | મફત પ્લાન: પ્રતિ-મોડલ મર્યાદાઓ (પ્રતિ ચેટ મોડલ 200K ટોકન્સ/દિવસ; RPM/RPD માટે console.groq.com/docs/rate-limits જુઓ) — ફાઇલમાં કોઈ ચુકવણી પદ્ધતિ નથી. | +| `haiper` | `hp` | Haiper | API કી, વિડિયો | [લિંક](https://haiper.ai) | haiper.ai/haiper-api પરથી API કી મેળવો | +| `hcnsec` | `hcnsec` | Huancheng Public API | API કી | [લિંક](https://api.hcnsec.cn) | api.hcnsec.cn પરથી API કી મેળવો | +| `helixmind` | `helixmind` | HelixMind | API કી, એગ્રીગેટર | [લિંક](https://helixmind.online) | અગાઉ પ્રચલિત 3 RPM/50 RPD અને કાર્ડની જરૂર ન હોવાના દાવાઓની 2026-08-02ની ઑડિટ દરમિયાન પુષ્ટિ થઈ નહોતી; વર્તમાન ક્વોટા અને બિલિંગ માટે એકાઉન્ટ ચકાસણી જરૂરી છે. | +| `helyxai` | `helyxai` | Helyx AI | API કી, એગ્રીગેટર | [લિંક](https://helyxai.space) | કાર્યરત મફત પ્લાનના દસ્તાવેજોમાં 100,000 ટોકન્સ/દિવસ દર્શાવ્યા છે; સાઇટનો અલગ 2M+ માર્કેટિંગ દાવો તેની સાથે વિરોધાભાસી છે અને તેને ક્વોટાની ખાતરી માનવામાં આવતો નથી. | +| `heroku` | `heroku` | Heroku AI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API કી | [લિંક](https://huggingface.co) | હજારો મોડલ્સ માટે મફત Inference API (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API કી | [લિંક](https://hyperbolic.xyz) | સર્વરલેસ ઇન્ફરન્સ માટે સાઇનઅપ પર $1-5ની ટ્રાયલ ક્રેડિટ્સ | +| `ideogram` | `ideo` | Ideogram | API કી | [લિંક](https://ideogram.ai) | ideogram.ai/docs/api પરથી API કી મેળવો | +| `iflytek` | `iflytek` | iFlytek Spark | API કી | [લિંક](https://xinghuo.xfyun.cn) | console.xfyun.cn પરથી API કી મેળવો | +| `inception` | `inception` | Inception | API કી | [લિંક](https://docs.inceptionlabs.ai) | સાઇનઅપ પર 10M મફત ટોકન્સ, ક્રેડિટ કાર્ડની જરૂર નથી. | +| `inference-net` | `inet` | Inference.net | API કી | [લિંક](https://inference.net) | સાઇનઅપ પર $25ની મફત ક્રેડિટ્સ ઉપરાંત સંશોધન ગ્રાન્ટ્સ પણ ઉપલબ્ધ છે | +| `internlm` | `internlm` | InternLM (Intern-S1) | API કી | [લિંક](https://internlm.intern-ai.org.cn/) | મફત માસિક ક્વોટા ~1M ઇનપુટ / 3M આઉટપુટ ટોકન્સ (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API કી, એમ્બેડ/રીરેન્ક | [લિંક](https://jina.ai) | api.jina.ai માટે Bearer API કી — એમ્બેડિંગ્સ, રીરેન્ક, વર્ગીકરણ, સેગમેન્ટેશન અને શોધ. ડૅશબોર્ડ કીને JINA_AI_API_KEY કરતાં પ્રાથમિકતા મળે છે. આ Reader / r.jina.ai કાર્ડ નથી અને URLs ફેચ કરતું નથી. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API કી | [લિંક](https://jina.ai/reader) | r.jina.ai URL-થી-માર્કડાઉન માટે Bearer API કી (માત્ર /v1/web/fetch). તે /v1/embeddings અથવા /v1/rerank પ્રદાન કરતું નથી. Foundation API વાળું એ જ Jina ટોકન કામ કરે છે; જ્યારે આ કાર્ડ ખાલી હોય ત્યારે OmniRoute jina-ai ડૅશબોર્ડ કી અથવા JINA_AI_API_KEYનો ફરી ઉપયોગ કરે છે. | +| `kenari` | `kenari` | Kenari | API કી | [લિંક](https://kenari.id) | Authorization: Bearer માં તમારી Kenari API કી (kn-...)નો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API કી | [લિંક](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API કી, એગ્રીગેટર | [લિંક](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (લેગસી Moonshot API) | API કી | [લિંક](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API કી | [લિંક](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API કી | [લિંક](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API કી, એગ્રીગેટર | [લિંક](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API કી, વિડિયો | [લિંક](https://leonardo.ai) | leonardo.ai/developer પરથી API કી મેળવો | +| `liquid` | `liquid` | Liquid AI | API કી | [લિંક](https://liquid.ai) | liquid.ai પરથી API કી મેળવો | +| `literouter` | `literouter` | LiteRouter | API કી, એગ્રીગેટર | [લિંક](https://literouter.com) | મફત મોડેલ વેરિઅન્ટ્સ :free પ્રત્યયનો ઉપયોગ કરે છે; દૈનિક ક્રેડિટ મર્યાદાઓ મોડેલ પ્રમાણે બદલાય છે અને મફત ઇનપુટ 5,000 ટોકન્સ સુધી મર્યાદિત છે. | +| `llamagate` | `llamagate` | LlamaGate | API કી | [લિંક](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API કી, એગ્રીગેટર | [લિંક](https://llm.kiwi) | મફત પ્લાન auto અને hrLLM ઉપલબ્ધ કરાવે છે; પ્રકાશિત 40 વિનંતીઓ/કલાકની મર્યાદા hrLLMને લાગુ પડે છે. | +| `llm7` | `llm7` | LLM7.io | API કી | [લિંક](https://llm7.io) | કોઈપણ ખાલી ન હોય તેવી કીનો ઉપયોગ કરો (ઉદાહરણ તરીકે 'unused'). જો જૂના બિલ્ટ-ઇન મોડેલ્સ model_unavailable પરત કરે, તો Available Models → Import from /models અથવા Auto-Syncનો ઉપયોગ કરો; ચકાસાયેલ લાઇવ મોડેલ: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API કી, એગ્રીગેટર | [લિંક](https://llmgateway.io) | હોસ્ટેડ મફત પ્લાન: જ્યારે ખાતામાં કોઈ ક્રેડિટ ન હોય ત્યારે મફત કિંમતવાળા મોડેલ્સ દર 10 મિનિટે 5 વિનંતીઓ સુધી મર્યાદિત હોય છે. | +| `logfare` | `logfare` | Logfare | API કી, એગ્રીગેટર | [લિંક](https://logfare.ai) | તાત્કાલિક API કી મેળવવા માટે https://logfare.ai/register પર મફત ખાતું બનાવો (વપરાશકર્તાનામ/પાસવર્ડ, ઈમેલ ચકાસણી નહીં), પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `longcat` | `lc` | LongCat AI | API કી | [લિંક](https://longcat.chat/platform/docs) | મફત: ખાતું બનાવ્યા અને KYC ચકાસણી કર્યા પછી એક વખતની 10M-ટોકન ગ્રાન્ટ (LongCat-2.0). માત્ર એક વખત — પુનરાવર્તિત દૈનિક/માસિક ભથ્થું નથી. | +| `magnific` | `freepik` | Magnific | API કી, ઇમેજ | [લિંક](https://www.magnific.com) | magnific.com/user/api-keys પરથી API કી મેળવો (હેડર x-magnific-api-key). લેગસી Freepik ડેવલપર કી હજુ પણ કામ કરે છે. | +| `maritalk` | `maritalk` | Maritalk | API કી | [લિંક](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API કી, એગ્રીગેટર | [લિંક](https://meganova.ai) | કાર્ડ વિના મફત સાઇનઅપ. પ્રકાશિત Tier 1 પ્રતિ-મોડેલ ક્વોટાનો કુલ સરવાળો 550 વિનંતીઓ/દિવસ છે; તે કોઈ સહિયારું વૈશ્વિક પૂલ નથી અને જો સક્ષમ કરેલું હોય તો ચૂકવવાપાત્ર વધારાનો ઉપયોગ લાગુ પડી શકે છે. | +| `meta-llama` | `meta` | Meta Llama API | API કી | [લિંક](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API કી, વિડિયો | [લિંક](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (ચીન) | API કી | [લિંક](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API કી | [લિંક](https://mistral.ai) | મફત Experiment ટિયર: તમામ મોડેલ્સ માટે રેટ-મર્યાદિત ઍક્સેસ, ક્રેડિટ કાર્ડ જરૂરી નથી | +| `mixedbread` | `mxbai` | Mixedbread AI | API કી | [લિંક](https://www.mixedbread.com) | Mixedbread એમ્બેડિંગ્સ API માટે Bearer API કી. | +| `mixlayer` | `mixlayer` | Mixlayer | API કી, એગ્રીગેટર | [લિંક](https://www.mixlayer.com) | qwen/qwen3.5-4b-free મોડેલ પ્રોટોટાઇપિંગ માટે મફત અને રેટ-મર્યાદિત છે; કોઈ નિશ્ચિત સાર્વજનિક RPM અથવા દૈનિક ક્વોટાની પુષ્ટિ થયેલી નથી. | +| `mnn-ai` | `mnn-ai` | MNN AI | API કી, એગ્રીગેટર | [લિંક](https://mnnai.ru) | મફત પ્લાન: $1 માસિક ક્રેડિટ, 10 RPM અને માત્ર Free તરીકે ચિહ્નિત મોડેલ્સની ઍક્સેસ. | +| `modal` | `mdl` | Modal | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://modal.com/docs) | જો સક્ષમ હોય, તો તમારા Modal ડિપ્લોયમેન્ટને સુરક્ષિત કરતું bearer ટોકન વાપરો. બેઝ URLએ તમારી OpenAI-સુસંગત Modal ઍપ તરફ નિર્દેશ કરવો જોઈએ, ઉદાહરણ તરીકે https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API કી | [લિંક](https://modelscope.cn) | ModelScope API-Inference મારફતે મફત ટિયર — Alibaba ખાતું જરૂરી છે. | +| `monsterapi` | `monster` | MonsterAPI | API કી | [લિંક](https://monsterapi.ai) | ⚠️ **અપ્રચલિત.** Monster APIએ 2026-06-30ના રોજ કામગીરી બંધ કરી. વૈકલ્પિક OpenAI-સુસંગત પ્રદાતાઓનો ઉપયોગ કરો. | +| `moonshot` | `moonshot` | Kimi | API કી | [લિંક](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API કી | [લિંક](https://morphllm.com) | મફત ટિયર: 250K ક્રેડિટ/મહિનો, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | API કી | [લિંક](https://github.com/meta-llama/llama-stack) | તમારી META_API_KEY env varનો Bearer ટોકન તરીકે ઉપયોગ કરો. Muse Code CLI, OpenAI Responses API વાયર ફોર્મેટનો ઉપયોગ કરે છે (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API કી, એગ્રીગેટર | [લિંક](https://naga.ac) | naga.ac પરથી API કી મેળવો — Google/GitHub/Discord સાઇનઅપ ઉપલબ્ધ છે. | +| `naga-ai` | `naga-ai` | Naga AI | API કી, એગ્રીગેટર | [લિંક](https://naga.ac) | :free તરીકે ચિહ્નિત મોડલ્સ જાહેર રીતે સૂચિબદ્ધ છે, પરંતુ કોઈ આંકડાકીય ક્વોટાની પુષ્ટિ થયેલી નથી. Nagaની નીતિ ચેતવણી આપે છે કે ફ્રી-ટિયરના પ્રોમ્પ્ટ્સ અને આઉટપુટ્સ એકત્રિત થઈ શકે છે અથવા તાલીમ માટે ઉપયોગમાં લેવાઈ શકે છે. | +| `nanogpt` | `nanogpt` | NanoGPT | API કી | [લિંક](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API કી | [લિંક](https://bynara.id) | મફત NaraRouter એકાઉન્ટ બનાવો, તમારું Telegram લિંક કરો (/v1 જવાબો પહેલાં આવશ્યક), પછી કીને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `navy` | `navy` | NavyAI | API કી | [લિંક](https://api.navy) | NavyAI ડૅશબોર્ડમાંથી મફત API કી બનાવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `nebius` | `nebius` | Nebius AI | API કી | [લિંક](https://nebius.com) | API પરીક્ષણ માટે સાઇનઅપ પર આશરે $1 ટ્રાયલ ક્રેડિટ | +| `nlpcloud` | `nlpc` | NLP Cloud | API કી | [લિંક](https://docs.nlpcloud.com) | Authorization: Token માં તમારી NLP Cloud API કીનો ઉપયોગ કરો. ડિફૉલ્ટ રૂપે OmniRoute https://api.nlpcloud.io/v1/gpu//chatbot પરના ચેટબોટ એન્ડપોઇન્ટને લક્ષ્ય બનાવે છે. | +| `nomic` | `nomic` | Nomic | API કી | [લિંક](https://nomic.ai) | atlas.nomic.ai પર API કી મેળવો | +| `nous-research` | `nous` | Nous Research | API કી | [લિંક](https://portal.nousresearch.com/help) | તમારી Nous Portal API કીનો ઉપયોગ કરો. OmniRoute https://inference-api.nousresearch.com/v1 પરના અધિકૃત OpenAI-સુસંગત ઇન્ફરન્સ એન્ડપોઇન્ટને લક્ષ્ય બનાવે છે. | +| `novita` | `novita` | Novita AI | API કી, વિડિયો, એગ્રીગેટર | [લિંક](https://novita.ai) | સાઇનઅપ પર $0.50 ટ્રાયલ ક્રેડિટ (આશરે 1 વર્ષ માટે માન્ય) | +| `nscale` | `nscale` | nScale | API કી | [લિંક](https://nscale.com) | ઇન્ફરન્સ પરીક્ષણ માટે સાઇનઅપ પર $5ની મફત ક્રેડિટ | +| `nube` | `nube` | Nube.sh | API કી | [લિંક](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API કી | [લિંક](https://build.nvidia.com) | મફત ડેવ ઍક્સેસ: આશરે 40 RPM, 70+ મોડલ્સ (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.oracle.com/artificial-intelligence/generative-ai) | તમારી OCI Generative AI API કી અથવા IAM bearer ટોકનનો ઉપયોગ કરો. બેઝ URL https://inference.generativeai..oci.oraclecloud.com/openai/v1/ હોઈ શકે છે. | +| `ofoxai` | `ofoxai` | OfoxAI | API કી, એગ્રીગેટર | [લિંક](https://ofox.ai) | વર્તમાન કેટલોગ જાહેર આંકડાકીય ક્વોટા વિના 10+ મફત મોડલ્સની જાહેરાત કરે છે; પ્રોડક્શનમાં ઉપયોગ કરતાં પહેલાં અપસ્ટ્રીમ ઉદ્ભવ, રિટેન્શન અને તાલીમની શરતોની સમીક્ષા કરો. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API કી | [લિંક](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API કી | [લિંક](https://1min.ai) | https://docs.1min.ai/docs/api/create-api-key પર API કી બનાવો, પછી તેને અહીં પેસ્ટ કરો. | +| `openadapter` | `oad` | OpenAdapter | API કી | [લિંક](https://openadapter.dev) | Authorization: Bearer sk-cv-માં તમારી OpenAdapter API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API કી | [લિંક](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API કી | [લિંક](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API કી | [લિંક](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API કી | [લિંક](https://openference.com) | મફત ટિયર: Qwen3.8 27b અને Llama 3.2 3Bનો સમાવેશ થાય છે — વર્તમાન શરતો માટે openference.com/pricing જુઓ | +| `openrouter` | `openrouter` | OpenRouter | API કી, એગ્રીગેટર | [લિંક](https://openrouter.ai) | :free પ્રત્યય સાથે $0/token પર મફત મોડલ્સ - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API કી | [લિંક](https://openvecta.com) | LLMs, એમ્બેડિંગ્સ અને રીઝનિંગ મોડલ્સમાં OpenAI-સુસંગત ઇન્ફરન્સ માટે સાઇનઅપ પર મફત ક્રેડિટ | +| `opper` | `opper` | Opper | API કી, એગ્રીગેટર | [લિંક](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API કી | [લિંક](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API કી | [લિંક](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API કી | [લિંક](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API કી | [લિંક](https://www.perplexity.ai) | તમારી Perplexity API કીનો ઉપયોગ કરો. OmniRoute, Agent API મોડલ IDને Perplexityના Responses-સુસંગત એન્ડપોઇન્ટ મારફતે રૂટ કરે છે. | +| `piapi` | `pi` | PiAPI | API કી, એગ્રીગેટર | [લિંક](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API કી | [લિંક](https://pioneer.ai) | $75ની મફત ઉપયોગ ક્રેડિટ — ક્રેડિટ કાર્ડની જરૂર નથી | +| `plamo` | `plamo` | PLaMo | API કી | [લિંક](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API કી, એગ્રીગેટર | [લિંક](https://creator.poe.com/api-reference) | Poe OpenAI-સુસંગત API માટે Bearer API કી. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API કી, એગ્રીગેટર | [લિંક](https://poixe.com) | વર્તમાન જાહેર મફત મર્યાદાઓ નાની અને મોડલ-જૂથ વિશિષ્ટ છે: large-cup મોડલ્સ માટે 2 RPM/5 RPD અને small-cup મોડલ્સ માટે 20 RPM/50 RPD. | +| `pollinations` | `pol` | Pollinations AI | API કી, વિડિયો | [લિંક](https://pollinations.ai) | દસ્તાવેજીકૃત મફત મોડલ્સ માટે અનામી/કીવિહીન ઍક્સેસ શ્રેષ્ઠ-પ્રયત્ન ધોરણે છે. સ્થાનિક v3.8.50 ચકાસણી (2026-07-31)માં સમાન નેટવર્ક પરથી OmniRoute મારફતે 401 અને સીધી અપસ્ટ્રીમ તપાસમાં Cloudflare 1010 મળ્યાં. પ્રીમિયમ મોડલ્સ માટે હજી પણ enter.pollinations.ai પરથી Pollinations API કી જરૂરી છે. | +| `poolside` | `poolside` | Poolside | API કી | [લિંક](https://poolside.ai) | Laguna S 2.1 અને XS 2.1 પૂર્વાવલોકન દરમિયાન મફત છે; કોઈ જાહેર આંકડાકીય ક્વોટા પ્રકાશિત કરાયો નથી. | +| `predibase` | `predibase` | Predibase | API કી | [લિંક](https://predibase.com) | ⚠️ **અપ્રચલિત.** serving.app.predibase.com હવે રિઝોલ્વ થતું નથી (તપાસ 2026-06-19); મેનેજ્ડ સર્વિંગ API બંધ થઈ ગયું હોવાનું જણાય છે. | +| `publicai` | `publicai` | PublicAI | API કી | [લિંક](https://publicai.co) | API કી જરૂરી છે — સાઇનઅપ વખતે એક વખતની ક્રેડિટ, ત્યારબાદ ચૂકવણીવાળી સેવા | +| `qianfan` | `qianfan` | Baidu Qianfan | API કી | [લિંક](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API કી | [લિંક](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API કી | [લિંક](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API કી | [લિંક](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API કી, ઇમેજ | [લિંક](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API કી | [લિંક](https://regolo.ai) | તમારી Regolo API કી regolo.ai પરથી મેળવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `reka` | `reka` | Reka | API કી | [લિંક](https://docs.reka.ai/chat/overview) | તમારી Reka API કીનો ઉપયોગ કરો. OmniRoute OpenAI-સુસંગત બેઝ URL https://api.reka.ai/v1 ને સપોર્ટ કરે છે અને સુસંગતતા માટે Authorization તથા X-Api-Key બંને હેડર મોકલે છે. | +| `requesty` | `requesty` | Requesty | API કી | [લિંક](https://requesty.ai) | મફત સ્તર ~200 વિનંતીઓ/દિવસ - બહુવિધ-મોડેલ રૂટિંગ ગેટવે (300+ મોડેલ) | +| `routeway` | `routeway` | Routeway | API કી | [લિંક](https://routeway.ai) | routeway.ai પર મફત API કી બનાવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `runwayml` | `runway` | Runway | API કી, વીડિયો | [લિંક](https://docs.dev.runwayml.com) | Authorization: Bearer માં તમારી Runway API કીનો ઉપયોગ કરો. OmniRoute https://api.dev.runwayml.com/v1 પરની વર્તમાન Runway API ને લક્ષ્ય બનાવે છે અને જરૂરી X-Runway-Version હેડર આપમેળે મોકલે છે. | +| `sambanova` | `samba` | SambaNova | API કી | [લિંક](https://sambanova.ai) | સાઇન અપ કરતી વખતે $5 ની મફત ક્રેડિટ (30 દિવસની માન્યતા), ક્રેડિટ કાર્ડ જરૂરી નથી | +| `sap` | `sap` | SAP Generative AI Hub | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | તમારા SAP AI Core bearer ટોકનનો ઉપયોગ કરો. બેઝ URL તમારું AI_API_URL રૂટ અથવા Generative AI Hub માંથી deploymentUrl હોઈ શકે છે. | +| `sarvam` | `sarvam` | Sarvam AI | API કી | [લિંક](https://docs.sarvam.ai) | સાઇન અપ કરતી વખતે ₹1,000 ની મફત ક્રેડિટ — જે ક્યારેય સમાપ્ત થતી નથી | +| `scaleway` | `scw` | Scaleway AI | API કી | [લિંક](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | નવા એકાઉન્ટ માટે 1M મફત ટોકન — EU/GDPR અનુરૂપ (પેરિસ), Qwen3 235B અને Llama 70B | +| `sealion` | `sealion` | SEA-LION | API કી | [લિંક](https://sea-lion.ai) | Google વડે sea-lion.ai પર સાઇન ઇન કરો (કાર્ડની જરૂર નથી, કોઈ પ્રાદેશિક અવરોધ નથી), API કી બનાવો અને પછી તેને અહીં પેસ્ટ કરો. | +| `seekai` | `ska` | SeekAi | API કી, એગ્રીગેટર | [લિંક](https://seekai.cc) | https://seekai.cc પર API કી બનાવો, પછી તેને અહીં Bearer ટોકન તરીકે પેસ્ટ કરો. | +| `segmind` | `segmind` | Segmind | API કી, ઇમેજ, વીડિયો | [લિંક](https://segmind.com) | x-api-key હેડરમાં તમારી Segmind API કીનો ઉપયોગ કરો. OmniRoute https://api.segmind.com/v1/ ને લક્ષ્ય બનાવે છે અને જનરેટ થયેલી ઇમેજ/વીડિયો બાઇટ્સ સીધી પરત કરે છે. | +| `sensenova` | `sensenova` | SenseNova | API કી | [લિંક](https://platform.sensenova.cn) | platform.sensenova.cn પર API કી મેળવો | +| `siliconflow` | `siliconflow` | SiliconFlow | API કી | [લિંક](https://cloud.siliconflow.com) | ઓળખ ચકાસણી પછી $1 ની મફત ક્રેડિટ ઉપરાંત હાલમાં સૂચિબદ્ધ $0 મોડેલ; ઉપલબ્ધતા અને મર્યાદાઓ બદલાઈ શકે છે | +| `snowflake` | `snowflake` | Snowflake Cortex | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API કી | [લિંક](https://xinghuo.xfyun.cn) | console.xfyun.cn પર API કી મેળવો | +| `speka` | `speka` | Speka AI | API કી, એગ્રીગેટર | [લિંક](https://speka.me) | મફત પ્લાન: $1 નો માસિક ઉપયોગ, 10 RPM, એક API કી તથા ઓપન મોડેલ અને પ્લેગ્રાઉન્ડની ઍક્સેસ; કાર્ડ જરૂરી નથી. | +| `stability-ai` | `stability` | Stability AI | API કી, ઇમેજ | [લિંક](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API કી | [લિંક](https://stepfun.com) | platform.stepfun.com પર API કી મેળવો | +| `sumopod` | `sumopod` | SumoPod | API કી | [લિંક](https://ai.sumopod.com) | Authorization: Bearer માં તમારી SumoPod API કી (sk-...) નો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API કી | [લિંક](https://suno.ai) | suno.ai પરથી સેશન કુકી (Clerk auth) પેસ્ટ કરો | +| `synthetic` | `synthetic` | Synthetic | API કી, એગ્રીગેટર | [લિંક](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API કી, એગ્રીગેટર | [લિંક](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API કી | [લિંક](https://hunyuan.tencent.com) | console.cloud.tencent.com પર API કી મેળવો | +| `thebai` | `thebai` | TheB.AI | API કી, એગ્રીગેટર | [લિંક](https://theb.ai) | TheB.AI OpenAI-સુસંગત ગેટવે માટેની Bearer API કી. | +| `tinyfish` | `tf` | TinyFish Fetch | API કી | [લિંક](https://docs.tinyfish.ai/fetch-api) | agent.tinyfish.ai/api-keys પરથી X-API-Key | +| `together` | `together` | Together AI | API કી, વીડિયો | [લિંક](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API કી | [લિંક](https://agent-router.gaib.ai) | Authorization: Bearer માં તમારી Token Kiosk API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત ગેટવે. API બેઝ URL: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API કી, એગ્રીગેટર | [લિંક](https://www.tokenreply.com) | મફત તરીકે ટૅગ કરાયેલા મોડેલમાં મોડેલ- અને અભિયાન-વિશિષ્ટ દૈનિક મર્યાદાઓ હોય છે; કોઈ નિશ્ચિત વૈશ્વિક મફત ક્વોટા પ્રકાશિત કરવામાં આવ્યો નથી. | +| `tokenrouter` | `trk` | TokenRouter | API કી | [લિંક](https://tokenrouter.com) | Authorization: Bearer માં તમારી TokenRouter API કીનો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API કી, ઇમેજ | [લિંક](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API કી | [લિંક](https://docs.opentyphoon.ai) | 5 req/s અને 200 req/m ની રેટ મર્યાદા સાથે મફત API કી. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API કી | [લિંક](https://uncensored.com) | તમારી uncensored.com Developer API કી (uai_sk_live_...) નો ઉપયોગ કરો. OmniRoute તેને OpenAI-સુસંગત https://api.uncensored.com/api/v1 એન્ડપોઇન્ટ પર X-api-key હેડર તરીકે મોકલે છે. કી ક્યારેય સમાપ્ત થતી નથી. આ વપરાશ-આધારિત/ક્રેડિટ્સ સપાટી છે; અમર્યાદિત સબ્સ્ક્રિપ્શન ચેટ અલગ 'uc' પ્રદાતા છે. | +| `udio` | `udio` | Udio | API કી | [લિંક](https://udio.com) | udio.com પરથી સેશન કૂકી (Supabase auth) પેસ્ટ કરો | +| `unorouter` | `unorouter` | UnoRouter | API કી, એગ્રીગેટર | [લિંક](https://unorouter.ai) | :free પ્રત્યય ધરાવતા મોડલ્સ બેલેન્સમાંથી રકમ કાપતા નથી; દરેક વપરાશકર્તા માટે દરેક મફત મોડલ દીઠ મર્યાદા 1 વિનંતી/મિનિટ છે. | +| `upstage` | `upstage` | Upstage | API કી | [લિંક](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API કી | [લિંક](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API કી | [લિંક](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API કી, એગ્રીગેટર | [લિંક](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://cloud.google.com/vertex-ai) | Service Account JSON, OAuth ઍક્સેસ ટોકન, Vertex Express API કી અથવા સર્વિસ-એકાઉન્ટ-બાઉન્ડ ઑથોરાઇઝેશન કી આપો. Express મોડ માત્ર Gemini ને સપોર્ટ કરે છે; પાર્ટનર મોડલ્સ માટે પ્રોજેક્ટ-સ્કોપ્ડ ક્રેડેન્શિયલ્સ જરૂરી છે. | +| `vertex-partner` | `vp` | Vertex AI Partners | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://cloud.google.com/vertex-ai) | Service Account JSON અથવા OAuth ક્રેડેન્શિયલ્સ આપો. સર્વિસ-એકાઉન્ટ-બાઉન્ડ ઑથોરાઇઝેશન કી પણ ડિસ્કવરીને સપોર્ટ કરે છે, પરંતુ પાર્ટનર ઇન્ફરન્સ માટે તેનો Google Cloud પ્રોજેક્ટ ID પણ જરૂરી છે. માનક Express કી માત્ર Gemini ને સપોર્ટ કરે છે. | +| `void-ai` | `void-ai` | Void AI | API કી, એગ્રીગેટર | [લિંક](https://voidai.app) | જાહેર મોડલ કૅટલોગ કેટલાક મોડલ્સને મફત પ્લાનની જરૂરિયાત સાથે ચિહ્નિત કરે છે, પરંતુ ઍક્સેસ શરતી છે અને કોઈ આંકડાકીય ક્વોટાની પુષ્ટિ થયેલી નથી. | +| `volcengine` | `volcengine` | Volcengine | API કી | [લિંક](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API કી | [લિંક](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | તમારું Volcano Engine એકાઉન્ટ કનેક્ટ કરો અથવા Ark Agent Plan સબ્સ્ક્રિપ્શન API કીનો ઉપયોગ કરો. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API કી | [લિંક](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | તમારું Volcano Engine એકાઉન્ટ કનેક્ટ કરો અથવા Ark Coding Plan સબ્સ્ક્રિપ્શન API કીનો ઉપયોગ કરો. | +| `voyage-ai` | `voyage` | Voyage AI | API કી, એમ્બેડ/રીરૅન્ક | [લિંક](https://www.voyageai.com) | Voyage AI એમ્બેડિંગ્સ અને રીરૅન્ક APIs માટે Bearer API કી. | +| `wafer` | `wafer` | Wafer AI | API કી | [લિંક](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API કી | [લિંક](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API કી, એન્ટરપ્રાઇઝ | [લિંક](https://www.ibm.com/products/watsonx-ai) | તમારા watsonx bearer ટોકનનો ઉપયોગ કરો. બેઝ URL https://.ml.cloud.ibm.com/ml/gateway/v1/ અથવા સ્વ-સંચાલિત /ml/gateway/v1 એન્ડપોઇન્ટ હોઈ શકે છે. | +| `writer` | `writer` | Writer | API કી | [લિંક](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API કી | [લિંક](https://x5lab.dev) | Authorization: Bearer માં તમારી X5Lab API કી (x5-...) નો ઉપયોગ કરો. સંપૂર્ણપણે OpenAI-સુસંગત. API બેઝ URL: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API કી | [લિંક](https://x.ai) | અધિકૃત xAI API કીનો ઉપયોગ કરો અથવા xAI OAuth વડે સાઇન ઇન કરો. Grok Build JWT સેશન્સ અલગ પ્રદાતા તરીકે રહે છે. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API કી | [લિંક](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API કી | [લિંક](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API કી, એગ્રીગેટર | [લિંક](https://xkiro.com) | xkiro.com પર મફત એકાઉન્ટ બનાવો અને અહીં કી પેસ્ટ કરો (Bearer; x-api-key પણ સ્વીકારવામાં આવે છે). | +| `yi` | `yi` | Yi (01.AI) | API કી | [લિંક](https://01.ai) | platform.lingyiwanwu.com પરથી API કી મેળવો | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API કી, એગ્રીગેટર | [લિંક](https://yolo-auto.com) | મફત API ઍક્સેસ વિનંતી-મર્યાદિત છે અને પરીક્ષણ માટે બનાવાયેલ છે; કોઈ આંકડાકીય દૈનિક ક્વોટા પ્રકાશિત થયેલો નથી અને મફત ઍક્સેસ અનિશ્ચિત સમય સુધી આપવાનું વચન નથી. | +| `zai` | `zai` | Z.AI | API કી | [લિંક](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API કી | [લિંક](https://zenmux.ai) | Authorization: Bearer માં તમારી ZenMux API કીનો ઉપયોગ કરો. ZenMux સંપૂર્ણપણે OpenAI-સુસંગત છે. બેઝ URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API કી, એગ્રીગેટર | [લિંક](https://www.zerolimitai.com) | અસ્થાયી મફત ટ્રાયલની જાહેરાત કરવામાં આવે છે, પરંતુ અધિકૃત પૃષ્ઠોમાં 3 અને 7 દિવસ વચ્ચે વિરોધાભાસ છે; 100-કૉલ્સ/દિવસના દાવાને કાયમી માનવામાં આવતો નથી. | +| `zylo-api` | `zylo` | Zylo API | API કી, એગ્રીગેટર | [લિંક](https://zyloai.net) | બેઝિક પ્લાન: 10 RPM, 7,200 વિનંતીઓ/દિવસ અને 200,000 ટોકન્સ/દિવસ; માત્ર Basic ટેક્સ્ટ મોડલ્સ સુધી મર્યાદિત. | ## સ્થાનિક પ્રદાતાઓ (14) diff --git a/docs/i18n/gu/docs/routing/REASONING_REPLAY.md b/docs/i18n/gu/docs/routing/REASONING_REPLAY.md index 6bd62cf220cb..835ea6ce30f2 100644 --- a/docs/i18n/gu/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/gu/docs/routing/REASONING_REPLAY.md @@ -23,21 +23,23 @@ OmniRoute વિચારણા-મોડ મોડેલો દ્વારા ``` ટર્ન N (સહાયક જનરેટ કરે છે): - → પ્રતિસાદમાં reasoning_content + tool_calls હોય છે + → પ્રતિસાદમાં reasoning_content + tool_calls સામેલ છે → જો requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - દરેક tool_call.id દ્વારા કી કરેલું (memory + DB) લખે છે + દરેક tool_call.id દ્વારા કી કરીને (મેમરી + DB) માં લખે છે → પ્રતિસાદ ક્લાયન્ટને ફોરવર્ડ કરે છે (જે રીઝનિંગ જાળવી પણ શકે અથવા ન પણ જાળવે) -ટર્ન N+1 (ક્લાયન્ટ અનુગામી વિનંતી મોકલે છે): +ટર્ન N+1 (ક્લાયન્ટ અનુવર્તી સંદેશ મોકલે છે): → ટ્રાન્સલેટર શોધે છે: requiresReasoningReplay(provider, model) === true - → tool_calls ધરાવતા અને reasoning_content ન ધરાવતા દરેક સહાયક સંદેશા માટે: - lookupReasoning(toolCalls[0].id) → memory → DB + → tool_calls ધરાવતા અને reasoning_content વિનાના દરેક સહાયક સંદેશ માટે: + lookupReasoning(toolCalls[0].id) → મેમરી → DB હિટ → msg.reasoning_content = cached; recordReplay() મિસ → msg.reasoning_content = "" (જૂના DeepSeek માટે લેગસી ફૉલબૅક) - → અપસ્ટ્રીમને સુસંગત ઇતિહાસ દેખાય છે → 400 નહીં + → અપસ્ટ્રીમને સુસંગત હિસ્ટ્રી મળે છે → 400 નહીં ``` -કૅપ્ચરિંગ `open-sse/handlers/chatCore.ts` માં થાય છે (બે સ્થાનો પર, બે `cacheReasoningFromAssistantMessage` કૉલ સાઇટ્સ પર). રીપ્લે સ્કીમા કોઅર્શન પછી પરંતુ ડિસ્પૅચ પહેલાં `open-sse/translator/index.ts` માં થાય છે. +કૅપ્ચર `open-sse/handlers/chatCore.ts` માં થાય છે (બે સ્થળે, બે `cacheReasoningFromAssistantMessage` કૉલ સાઇટ્સ પર). રીપ્લે સ્કીમા કોઅર્શન પછી પરંતુ ડિસ્પૅચ પહેલાં `open-sse/translator/index.ts` માં થાય છે. + +સાદા (ટૂલ-કૉલ વિનાના) સહાયક ટર્ન્સની કી અલગ રીતે નક્કી થાય છે: `buildAssistantMessageCacheKey()` સેશન સ્કોપ અને તે ટર્ન સુધીની નોર્મલાઇઝ્ડ OpenAI-ફોર્મેટ ટ્રાન્સક્રિપ્ટનું ડાઇજેસ્ટ બનાવે છે, કારણ કે `tools` હાજર હોય ત્યારે DeepSeek ને અગાઉના _દરેક_ ટર્નનું રીઝનિંગ જરૂરી હોય છે. Responses-API લક્ષ્યો માટે (ઉદાહરણ તરીકે `opencode-go/deepseek-v4-flash`, જેને `/responses` પર રાઉટ કરવામાં આવે છે) અપસ્ટ્રીમ બૉડીમાં `messages` નહીં પરંતુ `input` હોય છે, તેથી `translateRequest()` (`open-sse/translator/index.ts`) કૉલબૅક વિકલ્પ દ્વારા તેણે ડાઇજેસ્ટ કરેલી પિવટ ટ્રાન્સક્રિપ્ટની જાણ કરે છે અને કૅપ્ચર સાઇટ્સ એ જ ટ્રાન્સક્રિપ્ટનું ડાઇજેસ્ટ બનાવે છે. Responses રીપ્લે પાસ દરેક સ્રોત ફોર્મેટ માટે OpenAI પિવટ પર ચાલે છે, તેથી Anthropic Messages ક્લાયન્ટ્સ (Claude → OpenAI → Responses) માટે પણ રીપ્લે થાય છે. ## સ્ટોરેજ — હાઇબ્રિડ મેમરી + SQLite @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -ઇન્ડેક્સ: `expires_at`, `provider`, `model`, `created_at`. `expires_at` ને Unix epoch સેકન્ડ્સ તરીકે સંગ્રહિત કરવામાં આવે છે; SELECT સ્તર લેગસી ટેક્સ્ટ મૂલ્યોને `EXPIRES_AT_EPOCH_SQL` મારફતે નૉર્મલાઇઝ કરે છે. +ઇન્ડેક્સ: `expires_at`, `provider`, `model`, `created_at`. `expires_at` ને Unix epoch સેકન્ડ તરીકે સંગ્રહિત કરવામાં આવે છે; SELECT સ્તર લેગસી ટેક્સ્ટ મૂલ્યોને `EXPIRES_AT_EPOCH_SQL` મારફતે સામાન્યકૃત કરે છે. ## પ્રદાતા / મોડલ શોધ diff --git a/docs/i18n/gu/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/gu/docs/security/SOCKET_DEV_FINDINGS.md index 8fef0fad3533..b34cd22b8d7b 100644 --- a/docs/i18n/gu/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/gu/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,22 @@ --- +> **વ્યાપ નોંધ:** `socket.yml` npm આર્ટિફેક્ટના Socket.dev તરફના રજિસ્ટ્રી-સાઇડ પોસ્ટ-પબ્લિશ સ્કૅનને ગોઠવે છે (શિપ ન થતી સામગ્રી, જેમ કે `tests/`, `docs/`, અને બિલ્ડ રિપોર્ટ્સ માટેના ignore-paths). તે CI/PR મર્જ ગેટને જોડતું નથી — `.github/workflows`માં કોઈ workflow, `package.json`માં કોઈ script, અને કોઈ `Makefile` target Socket.devને ચલાવતું નથી. + આ દસ્તાવેજ `omniroute@3.8.5` સામે નોંધાયેલા છ -`AI દ્વારા શોધાયેલ સંભવિત માલવેર` તારણો અને `omniroute@3.8.6` માં લાગુ કરાયેલા -નિવારણો માટે જાળવણીકર્તા દ્વારા લખાયેલ પ્રમાણન છે. તેનો હેતુ એ છે કે: - -1. સુરક્ષા-પાઇપલાઇન સંચાલકો પાસે જ્યારે આ તારણોનું વાસ્તવિક સ્રોત સામે - મૂલ્યાંકન કરવાની જરૂર પડે ત્યારે ઉલ્લેખ કરવા માટે એક જ સંદર્ભ હોય. -2. ભાવિ AI સ્કેનરો જાળવણીકર્તા દ્વારા હસ્તાક્ષરિત આ દાવો ઓળખી શકે કે - ચિહ્નિત કરાયેલ દરેક પાથ ઇરાદાપૂર્વકનો, પસંદગીથી સક્રિય થતો અને દસ્તાવેજીકૃત છે. -3. દરેક કૉલ સાઇટની રચના આ રીતે _શા માટે_ કરવામાં આવી છે તેનો અમારી પાસે લેખિત રેકોર્ડ હોય — - જેથી ભાવિ રિફેક્ટરિંગથી ઇરાદાપૂર્વક દૂર કરાયેલી ફિંગરપ્રિન્ટ ભૂલથી - ફરી રજૂ ન થાય. - -જો તમે એવો સ્કેનર ચલાવો છો જે v3.8.6 ના નિવારણો પ્રકાશિત થયા પછી નીચેની -કોઈપણ કૉલ સાઇટને ફરી ચિહ્નિત કરે, તો કૃપા કરીને સ્કેન ટ્રેસ સાથે ઇશ્યૂ ખોલો અને +`AI-detected potential malware` તારણો અને `omniroute@3.8.6`માં લાગુ કરાયેલા +નિવારણો માટે સંભાળક-લિખિત પ્રમાણન છે. તેનો હેતુ છે કે: + +1. સુરક્ષા-પાઇપલાઇન સંચાલકો પાસે તારણોનું વાસ્તવિક સ્રોત સામે મૂલ્યાંકન કરવાની જરૂર પડે ત્યારે + ટાંકવા માટે એક જ સંદર્ભ હોય. +2. ભાવિ AI સ્કૅનર્સ સંભાળક-હસ્તાક્ષરિત દાવો ઓળખી શકે કે ચિહ્નિત કરેલો દરેક + પાથ ઇરાદાપૂર્વકનો, સ્વૈચ્છિક રીતે સક્ષમ કરાતો, અને દસ્તાવેજીકૃત છે. +3. દરેક call siteનું સ્વરૂપ આવું _શા માટે_ છે તેનો અમારી પાસે લેખિત રેકોર્ડ હોય — + જેથી ભાવિ refactor અજાણતાં એ fingerprint ફરી રજૂ ન કરે જેને + જાણીજોઈને દૂર કરવામાં આવ્યું હતું. + +જો તમે એવું scanner ચલાવો છો જે v3.8.6નાં નિવારણો રિલીઝ થયા પછી નીચેના કોઈપણ call siteને +ફરી ચિહ્નિત કરે, તો કૃપા કરીને scan trace સાથે issue ખોલો અને અમે અહીં પ્રમાણનને વિસ્તૃત કરીશું. --- diff --git a/docs/i18n/ha/README.md b/docs/i18n/ha/README.md index 8d768bed57db..2ac88532c338 100644 --- a/docs/i18n/ha/README.md +++ b/docs/i18n/ha/README.md @@ -23,13 +23,13 @@ -> Haɗa matakan kyauta da hannu yana da wahala — SDK da dama, iyakokin saurin amfani da dama, kuma babu sanin ainihin adadin da kake da shi. OmniRoute yana tattara **shigarwar matakan kyauta 491 a cikin maɓallan rumbun amfani masu maimaituwa 35** kuma yana ƙididdige jimillar tokens daga **rumbuna 17 masu tabbataccen kasafin tokens na wata da aka wallafa tare da iyakokin Groq guda biyar na kowane samfur**, bayan cire maimaituwa bisa rumbun da ake rabawa. Ana nuna ƙa'idodin amfani da suke buɗewa ne kawai bayan tabbatar da shaidar yanki (a yau: ModelScope) a wani wuri dabam, +~6M bayan tabbatar da shaidar yanki, kuma ba a taɓa haɗa su cikin babban jimillar ba. Sakamakon yana ci gaba da bayyana a dashboard (`/dashboard/free-tiers`). +> Tara matakan kyauta da hannu yana da wahala — SDK da dama, iyakokin amfani da dama, kuma ba ka san ainihin adadin da kake da shi ba. OmniRoute yana tattara **shigarwar matakin kyauta guda 489 a cikin maɓallan rumbun maimaituwa guda 35** kuma yana ƙididdige jimillar tokens daga **rumbuna 17 masu tabbataccen kasafin tokens na wata da aka wallafa, tare da iyakokin Groq guda biyar na kowane model**, bayan cire maimaitawa bisa rumbun da ake rabawa. Ana nuna kasafin da ke buɗewa ne kawai bayan tabbatar da shaidar yanki (a yau: ModelScope) dabam, +~6M bayan tabbatar da shaidar yanki, kuma ba a taɓa haɗa shi cikin jimillar kanun labari ba. Sakamakon yana ci gaba da bayyana a dashboard (`/dashboard/free-tiers`). -Katin kasafin matakin kyauta na OmniRoute: kusan tokens kyauta 1.62B a kowane wata a kai a kai, har zuwa kusan 2.22B a watan farko tare da kiredit na rajista, daga maɓallan rumbun amfani masu maimaituwa 35 da aka rubuta waɗanda suka ƙunshi shigarwar matakan kyauta 491 da aka tattara a bayan endpoint guda ɗaya. Ƙididdiga ta gaskiya bayan cire maimaituwar rumbuna — ana ƙirga kowane rumbun da ake rabawa sau ɗaya kawai, ciki har da rumbuna masu maimaituwa 17 masu tabbataccen kasafin tokens na wata da aka wallafa tare da iyakokin Groq guda biyar na kowane samfur; an yi wa providers 13 alamar a guje su a kundin haɗarin sharuɗɗa domin kai ne za ka yanke shawara. Sandar kasafin ta haɗa da Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (iyakoki guda biyar na kowane samfur) da ƙananan rumbuna, tare da kiredit na rajistar watan farko da providers na kyauta na dindindin marasa iyakar tokens waɗanda ake nuna su dabam don kada su ƙara girman babban jimillar. Adadin da aka yi amfani da shi/ya rage kai tsaye a /dashboard/free-tiers. +Katin kasafin matakin kyauta na OmniRoute: kusan tokens kyauta biliyan 1.62 a kowane wata akai-akai, har zuwa kusan biliyan 2.22 a watan farko tare da credits na rajista, daga maɓallan rumbun maimaituwa guda 35 da aka rubuta waɗanda suka ƙunshi shigarwar matakin kyauta guda 489 da aka tattara a bayan endpoint guda ɗaya. Ƙididdiga ta gaskiya bayan cire maimaitawar rumbuna — ana ƙirga kowane rumbun da ake rabawa sau ɗaya kawai, ciki har da rumbunan maimaituwa guda 17 masu tabbataccen kasafin tokens na wata da aka wallafa tare da iyakokin Groq guda biyar na kowane model; an yiwa providers guda 13 alamar a guje su a kundin haɗarin sharuɗɗa domin kai ne za ka yanke shawara. Sandar kasafin ta haɗa da Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (iyakoki guda biyar na kowane model) da ƙananan rumbuna, tare da credits na rajistar watan farko da providers masu kyauta na dindindin waɗanda ba su da iyakar tokens da ake nuna su dabam don kada su taɓa ƙara yawan jimillar kanun labari. Adadin da aka yi amfani da shi/ya rage kai tsaye a /dashboard/free-tiers. -> Taƙaitaccen bayani mai motsi na shafin `/dashboard/free-tiers` na kai tsaye. Cikakkiyar hanya (cire maimaituwar rumbuna, matakan kiredit, sharuɗɗan provider): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Taƙaitaccen bayani mai motsi na shafin `/dashboard/free-tiers` na kai tsaye. Cikakkiyar hanya (cire maimaitawar rumbuna, matakan credit, sharuɗɗan provider): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Ana sake bincika waɗannan alkaluma kowane mako biyu ta hanyar kwatanta su da kundin kai tsaye, kuma **suna motsawa ta ɓangarorin biyu** — idan provider ya dakatar da matakin kyauta, adadin yana raguwa; idan sabon ya shigo, yana ƙaruwa. Muna wallafa abin da kundin yake ƙididdigewa a zahiri, ba mafi kyawun hasashen da aka ɗaga adadinsa ba. +> Ana sake tantance waɗannan alkaluma kowane mako biyu ta hanyar kwatanta su da kundin kai tsaye, kuma **suna iya motsawa ta kowace fuska** — idan provider ya kawo ƙarshen matakin kyauta, adadin zai ragu; idan wani sabo ya shigo, zai ƙaru. Muna wallafa abin da kundin yake ƙididdigewa a zahiri, ba mafi kyawun yanayi da aka ƙara yawan sa ba.
@@ -37,7 +37,7 @@

-⭐ Yi wa repo tauraro idan OMNIROUTE ya taimaka maka adana kuɗi da sauƙaƙa aikinka. +⭐ Sanya wa repo tauraro idan OMNIROUTE ya taimaka maka adana kuɗi da sauƙaƙa aikinka.

@@ -48,7 +48,7 @@ ### 💬 Shiga cikin al'umma -**👋 Bi mai kula da aikin — ka fara samun sabbin providers, sabbin fitowa da shawarwari:** +**👋 Bi mai kula da aikin — ka fara samun sababbin providers, sabbin fitarwa da shawarwari:** [![Bi Diego a LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) [![Bi @diegosouzapw a GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) @@ -56,10 +56,10 @@ [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) [![WhatsApp na Duniya](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) -[![WhatsApp na Brazil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) +[![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) [![Shafin Yanar Gizo](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Tambayoyi, shawarwari kan providers, taswirar ci gaba da tallafi → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Na Duniya](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brazil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Tambayoyi, shawarwari kan providers, taswirar ci gaba da tallafi → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Duniya](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -590,9 +590,9 @@ Radar na zaɓi ne kuma GET-only. Abokin hulɗar OmniRoute ba ya loda prompts, zi
-## 🤖 CLIs & Wakilan Shirye-shirye Masu Jituwa +## 🤖 CLIs Masu Jituwa & Wakilan Rubuta Lamba -> Tsari ɗaya — `http://localhost:20128/v1` — kuma **kowane** AI IDE ko CLI yana aiki da samfura na kyauta da masu araha. +> Saiti guda — `http://localhost:20128/v1` — kuma **kowane** IDE ko CLI na AI yana aiki da samfura kyauta & masu araha.
@@ -626,23 +626,23 @@ Radar na zaɓi ne kuma GET-only. Abokin hulɗar OmniRoute ba ya loda prompts, zi - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ yana kuma aiki da · Kiro · Command Code · Antigravity · Windsurf · AMP · duk wani kayan aiki mai dacewa da OpenAI ++ yana kuma aiki da · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · duk wani kayan aiki mai jituwa da OpenAI
-📖 Saitin kowane kayan aiki ga dukkan kayan aiki 36 (CLI Code 26 + CLI Agents 10) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin na OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Saitin kowane kayan aiki ga dukkan kayan aiki 36 (CLI Code 26 + Wakilan CLI 10) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Filogin OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Ƙaddamar da kowace CLI mai tallafi ta hanyar OmniRoute da umarni guda ɗaya** — ba a rubuta fayilolin saituna, -ana saka bayanan izini ga kowane tsari, Qwen/Gemini kuma suna samun keɓantaccen home na wucin gadi: +**Ƙaddamar da kowane CLI mai goyon baya ta hanyar OmniRoute da umarni ɗaya** — ba a rubuta fayilolin saiti, +ana shigar da bayanan shiga ga kowane process, sannan Qwen/Gemini suna samun keɓantaccen kundin gida na wucin gadi: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,23 +653,23 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Ko kuma zaɓi mai samarwa+samfuri ta hanyar hulɗa sannan ka rubuta saitunan kayan aikin da kansa: -omniroute configure codex # akwai kuma: claude opencode qwen aider goose gemini cline continue kilo +# Ko zaɓi mai samarwa+samfuri ta hanyar mu'amala sannan ka rubuta saitin kayan aikin: +omniroute configure codex # har ila yau: claude opencode qwen aider goose gemini cline continue kilo ``` -Kowane umarni yana bin mahallin nesa da ke aiki (`omniroute connect `), `--dry-run` +Kowane umarni yana bin mahallin nesa mai aiki (`omniroute connect `), `--dry-run` yana nuna ainihin env/args ba tare da aiwatarwa ba, sannan `--api-key-env NAME` yana hana sirrika -shiga tarihin shell ɗinka. → [Haɗaɗɗun CLI](docs/guides/CLI-INTEGRATIONS.md) +shiga tarihin shell ɗinka. → [Haɗe-haɗen CLI](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 Masu Samar da AI 357 — 152 Masu Alamar Katalog a Matsayin Kyauta +## 🌐 Masu Bayar da AI 357 — 152 Masu Alamar Katalojin Kyauta
-> **Masu samarwa 357 da aka yi wa rajista** a cikin tarin hukuma na tattaunawa, kafofin watsa labarai, bincike, na gida, wakilin-gajimare da tsarin kwamfuta, ciki har da **152 masu ɗauke da metadata na ganowa na `hasFree: true`**. Rijistar samfurin tattaunawa ta ƙunshi **masu samarwa 229 / nau'i-nau'in haɗin mai samarwa-da-samfuri 2,554 / ainihin ID na samfura 1,283**; katalog ɗin kasafin kyauta na daban yana da **layuka 491 na kowane samfur**, **rumbunan amfani masu sabuntawa 35** da kuma **masu samar da kyauta na dindindin masu sabuntawa/marasa buƙatar maɓalli 54**. Waɗannan ma'aunai ne daban bisa tsari; ma'anoni da lissafe-lissafen da aka cire maimaituwar rumbuna suna cikin [Manunin Masu Samarwa](docs/reference/PROVIDER_REFERENCE.md) da [Matakan Kyauta](docs/reference/FREE_TIERS.md). +> **Masu bayarwa 357 da aka yi wa rajista** a cikin tarin hukuma na taɗi, kafofin watsa labarai, bincike, na gida, wakilin-gajimare da tsarin, ciki har da **152 da ke ɗauke da metadata na ganowa na `hasFree: true`**. Rijistar samfurin taɗi ta ƙunshi **masu bayarwa 229 / nau'i-nau'in haɗin mai bayarwa da samfuri 2,554 / ID na samfuri na asali 1,283**; keɓantaccen katalojin kasafin kyauta yana da **layuka 491 na kowane samfuri**, **tarin albarkatu masu maimaituwa 35** da kuma **masu bayar da kyauta na dindindin masu maimaituwa/marasa buƙatar maɓalli 54**. Waɗannan ma'aunai ne daban-daban bisa tsari; ma'anoni da lissafe-lissafen da aka cire maimaituwar tarin albarkatu suna cikin [Bayanin Masu Bayarwa](docs/reference/PROVIDER_REFERENCE.md) da [Matakan Kyauta](docs/reference/FREE_TIERS.md).
@@ -702,11 +702,11 @@ shiga tarihin shell ɗinka. → [Haɗaɗɗun CLI](docs/guides/CLI-INTEGRATIONS.m -…da wasu 330+ — kowace alama tana fitowa kai tsaye daga katalog ɗin masu samarwa na dashboard. 📖 [Manunin Masu Samarwa](docs/reference/PROVIDER_REFERENCE.md) +…da ƙarin 330+ — kowane gunki yana samuwa kai tsaye daga katalojin masu bayarwa na dashboard. 📖 [Bayanin Masu Bayarwa](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Kyauta Har Abada — $0, ba a buƙatar kati +### 🆓 Kyauta Har Abada — $0, babu katin kuɗi @@ -718,11 +718,11 @@ shiga tarihin shell ɗinka. → [Haɗaɗɗun CLI](docs/guides/CLI-INTEGRATIONS.m - + - +
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Kyauta har abada
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
KYAUTA marar iyaka
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Kyauta MARA IYAKA
Pollinations
Pollinations
GPT, Llama, Claude
Ba a buƙatar maɓalli
Cloudflare AI
Cloudflare AI
Samfura 50+
Neurons 10K/rana
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM kyauta
Cerebras
Cerebras
GLM 4.7, GPT-OSS
Token miliyan 1/rana
Openference
Openference
Qwen3.8 27B, Llama 3.2
Matakin kyauta
OpenRouter
OpenRouter
Samfuran :free
+$10 → RPM mafi girma
@@ -1265,20 +1265,20 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal Yanayin GudanarwaNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27 HarsheTypeScript 6.0 — 100% TypeScript a duk faɗin src/ da open-sse/ (babu any a cikin ginshiƙin tun daga v2.0) Tsarin AikiNext.js 16 + React 19 + Tailwind CSS 4 - Rumbun Bayanaibetter-sqlite3 (SQLite, rubutun mujallar WAL) + LowDB (tsohon tsarin JSON) — manhajojin yanki 122, ƙaura 176 - ƘwaƙwalwaBinciken cikakken rubutu na SQLite FTS5 + wakilcin vector mai quantization na int8, raguwar daraja mai nau'i - Tsarukan BayanaiZod 4 — tantance shigarwa/fitarwa ta kayan aikin MCP + yarjejeniyoyin API - Ka'idojiMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE) - Yaɗawa Kai TsayeServer-Sent Events (SSE) + gadar WebSocket (/v1/ws) - MatsiTsarin injina 12 — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph - Tantancewa & tsaroOAuth 2.0 (PKCE) + JWT + Maɓallan API + tantancewar MCP mai iyakance izini · AES-256-GCM yayin ajiya · DOMPurify + Rumbun Bayanaibetter-sqlite3 (SQLite, ajiyar mujallar WAL) + LowDB (tsohon tsarin JSON) — modulolin yanki 122, ƙaura 178 + ƘwaƙwalwaCikakken binciken rubutu na SQLite FTS5 + wakilcin vector mai int8-quantized, raguwar ƙima mai nau'i + Tsare-tsaren BayanaiZod 4 — tantance shigarwa/fitarwar kayan aikin MCP + yarjejeniyoyin API + Ka'idojin SadarwaMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE) + Yaɗa Bayanai Kai-tsayeServer-Sent Events (SSE) + gadar WebSocket (/v1/ws) + Matse BayanaiTsari mai injuna 12 — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph + Tantancewa & tsaroOAuth 2.0 (PKCE) + JWT + Maɓallan API + tantancewa mai iyakokin MCP · AES-256-GCM yayin ajiya · DOMPurify Ɓoyewawreq-js — kwaikwayon sawun yatsa na JA3 / JA4 TLS, proxy mai matakai 3 - JuriyaMai katse da'ira, jinkirin sake gwadawa mai ƙaruwa, kariya daga tururuwar buƙatu, gyaran kai ta atomatik na auto-combo - Rajistapino — rajistocin JSON masu tsari tare da mahallin buƙata - GwajiMai gudanar da gwajin Node.js + Vitest — sanarwar gwaje-gwaje marasa canzawa 39,000+ a cikin fayilolin gwaji 5,100+ da ake bibiyarsu (na raka'a, haɗaka, E2E, tsaro, muhalli) - DandamaliKwamfutar tebur (Electron) · Android (Termux) · PWA (kowanne burauza) - CI/CDGitHub Actions — wallafa npm ta atomatik + Docker Hub lokacin fitar da sabon siga - Hanyoyin HaɗiGidan Yanar Gizo · npm · Docker Hub + JuriyaMai katse da'ira, jinkirin sake gwadawa mai ƙaruwa, hana cunkoson buƙatu lokaci guda, warkar da kai ta auto-combo + Rikodin Ayyukapino — rikodin JSON masu tsari tare da mahallin buƙata + GwajiMai gudanar da gwajin Node.js + Vitest — sanarwar gwaje-gwaje tsayayyu 39,000+ a cikin fayilolin gwaji 5,100+ da ake bibiyarsu (na ɓangare, haɗin kai, E2E, tsaro, muhalli) + DandamaliKwamfutar tebur (Electron) · Android (Termux) · PWA (kowace burauza) + CI/CDGitHub Actions — wallafa npm ta atomatik + Docker Hub yayin fitar da sabon salo + Hanyoyin HaɗiShafin Yanar Gizo · npm · Docker Hub
@@ -1293,69 +1293,69 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal - - - - - - + + + + + +
TakardaBayani
Jagorar Mai AmfaniMasu samarwa, haɗe-haɗe, haɗin CLI, turawa
Jagorar SaitawaCikakkun hanyoyin girkawa, saitunan kayan aikin CLI, saitin yarjejeniya, daidaita lokacin ƙarewa
Jagorar Kayan Aikin CLISaitin kowane kayan aiki don Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Yanayin NesaSarrafa OmniRoute na nesa (VPS) daga CLI na kwamfutar tafi-da-gidanka ta amfani da token ɗin shiga masu iyakantaccen izini
Saitin Claude CodeHaɗa Claude Code da OmniRoute (na gida/nesa) ta amfani da launch + bayanan martaba na kowane samfuri
Farawa Cikin SauriGirkawa mai matakai 3 → haɗawa → saitawa
Jagorar Mai AmfaniMasu samarwa, haɗe-haɗe, haɗawa da CLI, turawa
Jagorar SaitawaCikakkun hanyoyin girkawa, saitunan kayan aikin CLI, saitin ƙa'ida, da daidaita lokacin jira
Jagorar Kayan Aikin CLISaitin kowane kayan aiki na Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Yanayin NesaSarrafa OmniRoute na nesa (VPS) daga CLI na kwamfutar tafi-da-gidanka ta hanyar token ɗin shiga masu iyakantaccen iko
Saitin Claude CodeHaɗa Claude Code da OmniRoute (na gida/na nesa) ta amfani da launch + bayanan martaba na kowane samfuri
Farawa Cikin SauriGirkawa cikin matakai 3 → haɗawa → saitawa
### 🔧 Ayyuka & Turawa - - - - - - - - + + + + + + + +
TakardaBayani
Jagorar DockerGudanar da Docker, bayanan martabar Compose, Caddy HTTPS, hanyoyin ɓoye, alamomin image
Jagorar PodmanHaɗin Quadlet systemd, podman-compose, SELinux
Turawa zuwa VMCikakkiyar jagora: saitin VM + nginx + Cloudflare
Turawa zuwa Fly.ioTurawa zuwa Fly.io tare da ma'ajiyar dindindin
Jagorar TermuxGudanar da OmniRoute a Android ta hanyar Termux
Jagorar PWAGirkawar Progressive Web App, ajiyar cache, tsarin gini
Jagorar CirewaCirewa mai tsafta don duk hanyoyin girkawa
Saitin MuhalliCikakkun masu canjin .env da manazarta
Jagorar DockerGudanar da Docker, bayanan martabar Compose, Caddy HTTPS, ramummukan sadarwa, alamun image
Jagorar PodmanHaɗawar Quadlet systemd, podman-compose, SELinux
Tura VMCikakkiyar jagora: saitin VM + nginx + Cloudflare
Turawa zuwa Fly.ioTura zuwa Fly.io tare da ma'ajiya mai ɗorewa
Jagorar TermuxGudanar da OmniRoute a kan Android ta hanyar Termux
Jagorar PWAGirkawar Progressive Web App, caching, tsarin gine-gine
Jagorar CirewaCirewa mai tsafta ga duk hanyoyin girkawa
Saitin MuhalliCikakkun sauye-sauyen .env da manazarta
-### 🧠 Fasali & Tsarin Gini +### 🧠 Fasaloli & Tsarin Gine-gine - - - - - - - - + + + + + + + + - - + +
TakardaBayani
Tsarin GiniTsarin ginin tsarin, kwararar bayanai, da ayyukan ciki
Jagorar MatsewaTsarin zaɓuɓɓuka 7: a kashe / sauƙaƙe / daidaitacce / mai tsanani / matsananci / RTK / jere
Matsewar RTKMatse fitowar umarni, matattara, amincewa, tabbatarwa, dawo da ɗanyen fitarwa
Injinan MatsewaCaveman, RTK, hanyoyin aiki na jere, hanyoyin dashboard/API/MCP
Tsarin Dokokin MatsewaTsare-tsaren kunshin dokokin JSON don matattaran Caveman da RTK
Kunshin Harsunan MatsewaGano harshe da ƙirƙirar kunshin dokokin Caveman
Jagorar JuriyaMasu katse da'ira, lokutan hucewa, jerin jira, hana cunkoson buƙatu na lokaci guda, kwaikwayon TLS
Injin Haɗawa ta AtomatikKimantawa ta abubuwa 16, kunshin yanayi, gyara kai tsaye
Tsarin Gine-gineTsarin gine-ginen manhaja, gudan bayanai, da ayyukan ciki
Jagorar MatsawaBututun sarrafawa mai zaɓuɓɓuka 7: kashe / sauƙi / daidaitacce / mai ƙarfi / matuƙa / RTK / tara-tsaye
Matsawar RTKMatsa fitowar umarni, matata, amincewa, tabbatarwa, dawo da ɗanyen fitarwa
Injinan MatsawaCaveman, RTK, bututun sarrafawa masu tara-tsaye, hanyoyin mu'amalar dashboard/API/MCP
Tsarin Dokokin MatsawaTsarukan fakitin ƙa'idojin JSON don matatan Caveman da RTK
Fakitin Harsunan MatsawaGano harshe da ƙirƙirar fakitin ƙa'idojin Caveman
Jagorar JuriyaMasu katse da'ira, lokutan hucewa, layin jira, hana cunkoson buƙatu lokaci guda, kwaikwayon TLS
Injin Haɗawa ta AtomatikƘididdiga bisa dalilai 16, fakitin yanayi, gyaran kai
Jagorar ProxyTsarin proxy mai matakai 3, kasuwar 1proxy, CRUD na rajista
Matakan KyautaHaɗaɗɗen kundin adireshi: guraben amfani 35 masu maimaituwa da aka rubuta / shigarwar matakin kyauta 491 da aka jera
Dandalin FasaliYawon gani na dashboard tare da hotunan allo
Matakan KyautaHaɗaɗɗen kundin adireshi: wuraren albarkatu masu maimaituwa 35 da aka rubuta / shigarwar matakan kyauta 489 da aka jera
Baje-kolin FasaloliYawon gani na dashboard tare da hotunan allo
Takardun CodebaseBayani mataki-mataki na codebase mai sauƙi ga masu farawa
-### 🤖 Yarjeniyoyi & APIs +### 🤖 Ƙa'idoji & API - - - - + + + +
TakardaBayani
Manazartar APIDuk endpoints tare da misalai
Ƙayyadaddun OpenAPIƘayyadaddun OpenAPI 3.0
Sabar MCPKayan aikin MCP 110, saitunan IDE, abokan cinikin Python/TS/Go
Jagorar Sabar MCPGirkawar MCP, hanyoyin sufuri, da manazartar kayan aiki
Sabar A2AYarjejeniyar JSON-RPC 2.0, ƙwarewa, watsawa kai tsaye, sarrafa ayyuka
Jagorar Sabar A2AKatin wakilin A2A, ayyuka, ƙwarewa, da watsawa kai tsaye
Sabar MCPKayan aikin MCP 110, saitunan IDE, clients na Python/TS/Go
Jagorar Sabar MCPGirkawar MCP, hanyoyin jigilar bayanai, da manazartar kayan aiki
Sabar A2AƘa'idar JSON-RPC 2.0, ƙwarewa, yawo, sarrafa ayyuka
Jagorar Sabar A2AKatin wakilin A2A, ayyuka, ƙwarewa, da yawo
-### 📋 Aikin & Inganci +### 📋 Aiki & Inganci - - - - - - - + + + + + + +
TakardaBayani
Ba da GudummawaTsarin kafa yanayin haɓakawa da jagorori
Tsarin Rassa & FitarwaInda ake nufar PRs (release/*), da ma’anar main da tags
Rajistar Sauye-sauyeCikakken tarihin fitarwa na kowace siga
Manufar TsaroBayar da rahoton rauni da ayyukan tsaro
Jagorar i18nTallafin harsuna 42, tsarin aikin fassara, RTL
Jerin Binciken FitarwaMatakan tabbatarwa kafin fitarwa
Tsarin Ɗaukar GwajiDabarun ɗaukar gwaji don ayyana gwaje-gwaje tsayayyu 39,000+ a cikin fayilolin gwaji 5,100+ da ake sa ido
Ba da GudummawaTsarin saita muhalli da ƙa'idojin haɓakawa
Tsarin Rassa & FitarwaInda ake nufin PRs (release/*), da abin da main da alamomi suke nufi
Rajistar Canje-canjeCikakken tarihin fitarwa na kowace siga
Manufar TsaroRahoton rauni da ayyukan tsaro
Jagorar i18nGoyon bayan harsuna 42, tsarin aikin fassara, RTL
Jerin Dubawa na FitarwaMatakan tabbatarwa kafin fitarwa
Tsarin Ɗaukar GwajiDabarun ɗaukar gwaji don ayyana gwaje-gwaje tsayayyu sama da 39,000 a cikin fayilolin gwaji sama da 5,100 da ake bibiyarsu

@@ -1364,12 +1364,12 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal # ⭐ Manyan Masu Ba da Gudummawa -> Al’ummar buɗaɗɗen tushe mai kishin aiki ce ke tsara OmniRoute. Waɗannan mutane sun bayar da gudummawa ta musamman wadda ke shafar inganci, kwanciyar hankali, da yaɗuwar aikin kai tsaye. **Mun gode.** +> Ƙwararrun al'ummar buɗaɗɗen tushe masu kishin aiki ne suka tsara OmniRoute. Waɗannan mutane sun ba da gudummawa ta musamman wadda take tasiri kai tsaye ga inganci, kwanciyar hankali, da yaɗuwar aikin. **Mun gode.** -### Masu ba da gudummawa daga waje bisa ga pull requests da aka haɗe +### Masu ba da gudummawa na waje bisa buƙatun ja da aka haɗe - + @@ -1393,9 +1393,9 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal
MatsayiMai Ba da GudummawaPRs da Aka Haɗe~Layukan da Aka Canza
MatsayiMai ba da gudummawaPRs da aka haɗe~Layukan da aka canza
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-An daskarar da bayanan a kan sabon ƙarshen release/v3.8.50 mai lambar dafb4ae808, tare da haɗe-haɗe har zuwa 2026-08-24 05:26:03 UTC. Ƙidayar GitHub GraphQL mai shafuka tana ɗauke da PRs 5,911 da aka haɗe: 2,707 daga mai ma’ajiyar, 179 daga Dependabot, da PRs 3,025 daga waje daga masu ba da gudummawa daban-daban 535. “Layukan da aka canza” jimillar ƙari + gogewa ce ta GitHub kuma ta haɗa da fayilolin da aka samar, lockfiles, kundin bayanai, fassarori da takardu; ma’aunin yawan canji ne, ba LOC da aka rubuta ba. An riƙe masu maki ɗaya a iyakar zaɓen. +An tsayar da shi a kan ƙarshen release/v3.8.50 mai aiki, wato dafb4ae808, tare da haɗe-haɗe har zuwa 2026-08-24 05:26:03 UTC. Ƙidayar GitHub GraphQL mai shafuka ta ƙunshi PRs 5,911 da aka haɗe: 2,707 daga mai ma'ajiyar, 179 daga Dependabot, da PRs na waje 3,025 daga masu ba da gudummawa daban-daban 535. “Layukan da aka canza” na nufin ƙarin layuka + gogewar layuka na GitHub, kuma ya haɗa da fayilolin da aka samar, lockfiles, kundin bayanai, fassarori da takardu; ma'aunin yawan sauye-sauye ne, ba LOC da aka rubuta ba. An riƙe masu kunnen doki a iyakar jerin. -### Commits da GitHub ya danganta da masu su +### Commits da aka danganta da GitHub @@ -1439,7 +1439,7 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal Markus Hartung
Markus Hartung
- 🏅 commits 69 da aka danganta da GitHub · kunnen doki a matsayi na #6 + 🏅 commits 69 da aka danganta da GitHub · kunnen doki a #6 @@ -1448,7 +1448,7 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal Dizzle
Dizzle
- 🏅 commits 69 da aka danganta da GitHub · kunnen doki a matsayi na #6 + 🏅 commits 69 da aka danganta da GitHub · kunnen doki a #6
@@ -1469,21 +1469,21 @@ Ma'aunai na asali a 2026-08-24: **bidiyoyi na musamman 1.029** · **sanannun kal Bob.Hou
Bob.Hou

- 🏅 commits 51 da aka danganta da GitHub · kunnen doki a matsayi na #10 + 🏅 commits 51 da aka danganta da GitHub · kunnen doki a #10
Xiangzhe
Xiangzhe

- 🏅 commits 51 da aka danganta da GitHub · kunnen doki a matsayi na #10 + 🏅 commits 51 da aka danganta da GitHub · kunnen doki a #10
-An sake dubawa a 2026-08-24 06:14:31 UTC: commits da aka danganta da GitHub waɗanda Contributors API na ma'ajiyar ya bayar don reshen tsoho na release/v3.8.50. API ɗin ya dawo da shaidu 525 (masu amfani 415, bots 2, marasa suna 108); wannan teburin bai haɗa da mai kula da aikin, bots da shaidun marasa suna ba, kuma ya riƙe kunnen dokin gasar. Ya bambanta da duka jerin martabar merged-PR da ke sama da kuma ƙidayar mutane 639 ta Git-metadata da ke ƙasa. +An sake dubawa a 2026-08-24 06:14:31 UTC: commits da aka danganta da GitHub waɗanda Contributors API na ma'ajiyar ya bayar don tsohuwar reshen release/v3.8.50. API ɗin ya dawo da shaidu 525 (masu amfani 415, bots 2, marasa suna 108); wannan teburin bai haɗa da mai kula da aikin, bots da marasa suna ba, kuma ya riƙe matsayin kunnen doki. Ya bambanta da duka jerin matsayin merged-PR na sama da ƙidayar mutane 639 ta metadata na Git da ke ƙasa. -> 🙏 Abubuwan da waɗannan masu ba da gudummawa suka samar, gyaran kurakurai, da inganta ababen more rayuwa su ne **muhimmin ɓangare** na abin da ke sa OmniRoute ya zama abin dogaro kuma mai wadatar fasaloli. Kowace pull request, kowane test case, da kowane fayil ɗin fassarar i18n suna da muhimmanci. Mutane irinsu ne suke gina manhajar buɗaɗɗen tushe. +> 🙏 Sabbin fasaloli, gyaran kurakurai, da inganta ababen more rayuwa da waɗannan masu ba da gudummawa suka yi, **ɓangare ne na asali** na abin da ke sa OmniRoute ya zama abin dogaro kuma mai yalwar fasaloli. Kowace pull request, kowane test case, da kowane fayil na fassarar i18n suna da muhimmanci. Mutane irinsu ne suke gina manhajar buɗaɗɗiyar tushe.
diff --git a/docs/i18n/ha/SECURITY.md b/docs/i18n/ha/SECURITY.md index 2e3583ff6f62..cbc37978719e 100644 --- a/docs/i18n/ha/SECURITY.md +++ b/docs/i18n/ha/SECURITY.md @@ -221,32 +221,21 @@ Kayan aiki da masu bitar lamba suna tilasta waɗannan ƙa'idoji: ## Sakamakon na’urar binciken sarkar samarwa (Socket.dev / Snyk / makamantansu) -Kundin npm na `omniroute` da aka wallafa yana ƙunshe da ginin Next.js mai `output: "standalone"`, -wanda ke nufin cewa kowane mai kula da hanya — ciki har da fasalolin da aka rubuta -masu gata na musamman (MITM, shigarwar Zed, Cloud Sync, mai kula da sabis da aka saka ciki) — yana -ƙarewa a cikin gutsattsarin `.next/server/*.js` da aka matse. Na’urorin binciken sarkar samarwa -masu amfani da dabarun hasashe sukan daidaita tsarin waɗannan gutsattsarin da sa hannun malware. - -Tsarin saitin na’urar binciken da muke amfani da shi yana cikin [`socket.yml`](socket.yml) a tushen -ma’ajiyar lambar (tsarin Socket.dev GitHub App v2 — duba -). A sarari yana ware -kundin adireshi waɗanda ba a tura su (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/`, da sauransu) domin na’urar binciken ta bayar da rahoto kawai kan hanyoyin lambar da -a zahiri suke kaiwa ga masu amfani da abin da aka wallafa — Socket -GitHub App ne ke gudanar da binciken ta hanyar karanta wannan fayil, ba wani workflow a wannan ma’ajiya ba. - -Ga kowane rukuni na sakamakon bincike muna adana takardar shaidar mai kula da aikin ta musamman ga kowane sakamako: +> **Bayanin iyaka:** `socket.yml` da ke tushen ma’ajiyar lamba yana tsara `projectIgnorePaths` ne kawai don binciken bayan-wallafa na Socket.dev a bangaren rajista kan artefakt ɗin npm da aka wallafa — ba ƙa’idar tilasta haɗewar CI/PR ba ce. Babu wani workflow a `.github/workflows`, babu script na `package.json`, kuma babu target na `Makefile` da ke kiran Socket.dev. + +Artefakt ɗin npm na `omniroute` da aka wallafa yana ƙunshe da build ɗin Next.js mai `output: "standalone"`, wanda ke nufin kowane mai sarrafa route — ciki har da fasalolin da aka rubuta bayanansu masu buƙatar gata (MITM, shigo da Zed, Cloud Sync, da mai kula da sabis da aka haɗa ciki) — yana ƙarewa a cikin ƙananan chunks na `.next/server/*.js` da aka matse. Na’urorin binciken sarkar samarwa masu amfani da kimantawa sukan daidaita tsarin waɗannan chunks da sa hannun malware akai-akai. + +Tsarin na’urar binciken da muke amfani da shi yana cikin [`socket.yml`](socket.yml) a tushen ma’ajiyar lambar (tsarin Socket.dev GitHub App v2 — duba +). A sarari yake ware kundin adireshin da ba a tura su ba (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/`, da sauransu) domin na’urar binciken ta bayar da rahoto kawai kan hanyoyin lambar da suke isa ga masu amfani da aka wallafa musu — Socket GitHub App da ke karanta wannan fayil ne ke tafiyar da binciken kansa, ba wani workflow a wannan ma’ajiyar lamba ba. + +Ga kowane rukuni na abin da aka gano, muna adana shaidar mai kula da tsarin ga kowane sakamakon bincike: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - taswira ta kowane sakamako: fayil ɗin tushe ↔ gutsattsarin da aka yi wa alama ↔ ɗabi’a ↔ matakin rage haɗari - da aka aiwatar a v3.8.6. -- Tubalan `SECURITY-AUDITOR-NOTE:` da ke cikin lambar tushe a kowace function da aka yi wa alama - suna mayar da mai karatu zuwa wannan takarda. - -Ga masu amfani waɗanda pipeline ɗinsu ba zai iya sassauta faɗakarwar ba: yi gini da -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Wannan yana maye gurbin modules huɗu -masu muhimmanci da stubs waɗanda ke mayar da HTTP 503 `feature-disabled` yayin -gudanarwa, don haka hanyoyin lambar masu gata na musamman ba sa kasancewa a zahiri cikin kundin. + taswirar kowane sakamakon bincike: fayil ɗin tushe ↔ chunk da aka yi wa alama ↔ ɗabi’a ↔ matakin rage haɗari da aka aiwatar a v3.8.6. +- Tubalan `SECURITY-AUDITOR-NOTE:` da ke cikin lambar tushe a wurin kowane function da aka yi wa alama suna mayar da mai dubawa zuwa wannan takarda. + +Ga masu amfani waɗanda pipeline ɗinsu ba zai iya sassauta faɗakarwar ba: yi build da +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Wannan yana maye gurbin modules huɗu masu muhimmanci da stubs waɗanda ke mayar da HTTP 503 `feature-disabled` a lokacin aiki, don haka hanyoyin lambar masu buƙatar gata ba sa kasancewa a zahiri cikin bundle ɗin. Duba [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) don tsarin wallafawa. diff --git a/docs/i18n/ha/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/ha/docs/architecture/CODEBASE_DOCUMENTATION.md index 931f191b1242..6c6d4661f9d1 100644 --- a/docs/i18n/ha/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/ha/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,9 +434,9 @@ An raba shi zuwa ƙananan directories masu takamaiman aiki: --- -## 4. `open-sse/` — Wurin aikin injin yawo +## 4. `open-sse/` — Wurin aikin injin watsa bayanai kai tsaye -Wurin aikin npm na daban da ake wallafawa a matsayin `@omniroute/open-sse`. Yana kula da sarrafa buƙatu, masu aiwatarwa, masu fassara, ayyuka, mai sauya tsari, da sabar MCP. +Wurin aikin npm na daban da ake wallafawa a matsayin `@omniroute/open-sse`. Yana kula da sarrafa buƙatu, masu aiwatarwa, masu fassara, ayyuka, mai sauya tsari, da uwar garken MCP. ``` open-sse/ @@ -444,35 +444,35 @@ open-sse/ ├── package.json Bayanin wurin aiki ├── tsconfig.json ├── types.d.ts -├── config/ Rajistocin masu samarwa, bayanan martabar header, ainihi, … +├── config/ Rajistocin masu samarwa, bayanan martabar kanun bayanai, ainihi, … ├── handlers/ Masu sarrafa buƙatu (taɗi, embeddings, sauti, hoto, …) ├── executors/ Masu aiwatar da HTTP na musamman ga masu samarwa guda 108 ├── translator/ Sauya tsari (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Mai sauya Responses API ↔ rafin Chat Completions -├── services/ Modulan ayyuka sama da 80 (combos, madadin, ƙididdiga, ainihi, …) -├── utils/ Mataimakan yawo, abokin cinikin TLS, AWS SigV4, proxy fetch, … -└── mcp-server/ Sabar MCP (hanyoyin sufuri 3, scopes 33, kayan aiki 110) +├── transformer/ Responses API ↔ Mai sauya rafin Chat Completions +├── services/ Manhajojin ayyuka 80+ (haɗe-haɗe, madadin, ƙayyadaddun amfani, ainihi, …) +├── utils/ Mataimakan watsa bayanai kai tsaye, abokin hulɗar TLS, AWS SigV4, proxy fetch, … +└── mcp-server/ Uwar garken MCP (hanyoyin sufuri 3, faɗin izini 33, kayan aiki 110) ``` ### 4.1 `open-sse/handlers/` -| Mai sarrafawa | Manufa | -| ----------------------- | -------------------------------------------------------------------------- | -| `chatCore.ts` | Babban tsarin taɗi (cache, iyakar ƙima, combo routing, tura mai aiwatarwa) | -| `responsesHandler.ts` | Wurin shigar OpenAI Responses API | -| `embeddings.ts` | Embeddings | -| `imageGeneration.ts` | Samar da hoto | -| `audioSpeech.ts` | Rubutu-zuwa-magana | -| `audioTranscription.ts` | Magana-zuwa-rubutu | -| `videoGeneration.ts` | Samar da bidiyo | -| `musicGeneration.ts` | Samar da kiɗa | -| `rerank.ts` | Sake jera matsayi | -| `moderations.ts` | Tace abun ciki | -| `search.ts` | Binciken yanar gizo | -| `sseParser.ts` | Mai rarrabe taron SSE | -| `usageExtractor.ts` | Ciro ƙididdigar token daga rafukan tushe | -| `responseSanitizer.ts` | Cire gurɓatattun bayanai na musamman ga mai samarwa | -| `responseTranslator.ts` | Haɗin tsakanin martanin mai samarwa da matakin fassara | +| Mai sarrafawa | Manufa | +| ----------------------- | ---------------------------------------------------------------------------------------- | +| `chatCore.ts` | Babban bututun taɗi (ma'ajiyar wucin gadi, iyakar ƙima, zaɓin haɗe-haɗe, tura aiwatarwa) | +| `responsesHandler.ts` | Mashigar OpenAI Responses API | +| `embeddings.ts` | Embeddings | +| `imageGeneration.ts` | Samar da hoto | +| `audioSpeech.ts` | Rubutu-zuwa-magana | +| `audioTranscription.ts` | Magana-zuwa-rubutu | +| `videoGeneration.ts` | Samar da bidiyo | +| `musicGeneration.ts` | Samar da kiɗa | +| `rerank.ts` | Sake jera matsayi | +| `moderations.ts` | Tace abun ciki | +| `search.ts` | Binciken yanar gizo | +| `sseParser.ts` | Mai fassara al'amuran SSE | +| `usageExtractor.ts` | Ciro adadin token daga rafukan sama | +| `responseSanitizer.ts` | Cire gurɓataccen bayanin da ya keɓanta ga mai samarwa | +| `responseTranslator.ts` | Mahaɗi tsakanin amsar mai samarwa da matakin fassara | ### 4.2 `open-sse/executors/` @@ -484,19 +484,19 @@ Masu aiwatarwa na masu samarwa guda 108, kowannensu yana faɗaɗa `BaseExecutor` `pollinations`, `qoder`, `vertex`, `devin-desktop`, tare da `claudeIdentity.ts` (mataimakin ainihi na bai ɗaya) da `index.ts` (rajista). -> Lura: `default.ts` ne yake yi wa masu samarwa da ba a jera a nan ba hidima ta amfani da mai aiwatarwa na gama-gari -> mai dacewa da OpenAI. Cikakken kundin masu samarwa (masu samarwa 355) yana cikin +> Lura: masu samarwa da ba a jera su a nan ba ana yi musu hidima ta `default.ts` ta amfani da +> mai aiwatarwa na gama-gari mai dacewa da OpenAI. Cikakken kundin masu samarwa (masu samarwa 355) yana cikin > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Fassara ta tsarin cibiya-da-rassa (OpenAI ne cibiyar). +Fassara ta tsarin cibiya-da-rassa (OpenAI ita ce cibiyar). - **Masu fassara buƙatu 9** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. -- **Masu fassara martani 9** (`translator/response/`): +- **Masu fassara amsa 9** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. @@ -509,60 +509,60 @@ Fassara ta tsarin cibiya-da-rassa (OpenAI ne cibiyar). ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — Mai sauya Responses API ↔ Chat Completions wanda ya dogara da `TransformStream` - (wanda hanyar `responses/` mai kama dukkan buƙatu take amfani da shi). +- `responsesTransformer.ts` — Mai sauya Responses API ↔ Chat Completions wanda ya dogara da + `TransformStream` (hanyar `responses/` ta kama-duka ce ke amfani da shi). ### 4.5 `open-sse/services/` -Muhimman bayanai (cikakken jeri yana ƙarƙashin `open-sse/services/`): - -| Abin dubawa | Fayiloli | -| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Turowar Combo | `combo.ts` (dabaru 19), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Injin Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Juriya | `accountFallback.ts` (lokacin jira + kullewa), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Ƙayyadaddun kaso | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Adana bayanai na wucin gadi | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Basirar turowa | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Sarrafa samfurori | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Matsewa | `compression/` — cikakken haɗin injin matsewa | -| Token + zama | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Mataki / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / hanyar sadarwa | `ipFilter.ts`, `webSearchFallback.ts` | -| Rukunin ayyuka | `batchProcessor.ts` | -| Amfani | `usage.ts` | +Muhimman abubuwa (cikakken jeri yana ƙarƙashin `open-sse/services/`): + +| Abin dubawa | Fayiloli | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Sarrafa hanyar Combo | `combo.ts` (dabaru 19), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Injin Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Juriyar matsala | `accountFallback.ts` (lokacin jira + kullewa), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Ƙayyadaddun amfani | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Adana cache | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Basirar sarrafa hanya | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Sarrafa samfuri | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Matsawa | `compression/` — cikakken haɗin wayoyin injin matsawa | +| Token + zama | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Mataki / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / hanyar sadarwa | `ipFilter.ts`, `webSearchFallback.ts` | +| Rukunonin aiki | `batchProcessor.ts` | +| Amfani | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **Kayan aiki na musamman 110** da aka haɗa a cikin `server.ts` (45 na asali a cikin `schemas/tools.ts` + - memory, skills, GitHub-skills, pool, gamification, plugin, Notion, Obsidian, - local-corpus da compression modules — an ƙirga haɗuwarsu ta `countUniqueMcpTools`). +- An haɗa **kayan aiki na musamman 110** a cikin `server.ts` (45 na asali a cikin `schemas/tools.ts` + + ma’adanar ƙwaƙwalwa, ƙwarewa, ƙwarewar GitHub, tafki, sanya aiki ya zama kamar wasa, plugin, Notion, Obsidian, + kundin bayanai na gida da kuma tsarin matsawa — an ƙirga haɗakarsu ta `countUniqueMcpTools`). - **Hanyoyin jigila 3**: stdio, HTTP Streamable, SSE. -- **Scopes 33** da ake tilasta amfani da su yayin aiki — jerin asali yana cikin `src/shared/constants/mcpScopes.ts`, cikakken saitin shi ne haɗuwar scopes da kowace tool module ta ayyana. -- Teburin binciken tantancewa: `mcp_tool_audit` (wanda `audit.ts` ke cike wa). +- Ana tilasta amfani da **scopes 33** a lokacin aiki — jerin asali yana cikin `src/shared/constants/mcpScopes.ts`, cikakken jerin kuwa haɗakar scopes ne da kowane tsarin kayan aiki ya ayyana. +- Teburin binciken aiki: `mcp_tool_audit` (`audit.ts` ne ke cika shi). - Fayiloli: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, tare da gwaje-gwajen da ke ƙarƙashin `__tests__/`. -- Duba [MCP-SERVER.md](../frameworks/MCP-SERVER.md) domin cikakken kundin kayan aiki. +- Duba [MCP-SERVER.md](../frameworks/MCP-SERVER.md) domin samun cikakken kundin kayan aiki. ### 4.7 `open-sse/config/` -Rajistocin masu samarwa (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), rajistocin samfuri bisa kowane tsari (`audioRegistry.ts`, +Rijistocin masu samarwa (`providerRegistry.ts`, `providerModels.ts`, +`providerHeaderProfiles.ts`), rijistocin samfura na kowane tsari (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), -mataimakan tantance ainihi (`codexIdentity.ts`, `codexInstructions.ts`, +mataimakan tantancewa (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), -mataimakan bayanan shaidar shiga (`credentialLoader.ts`, `codexClient.ts`), da cloud -adapters (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, +mataimakan bayanan shiga (`credentialLoader.ts`, `codexClient.ts`), da masu +daidaitawa na cloud (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). ### 4.8 `open-sse/utils/` -Ginshiƙan asali na streaming da mataimakan mai samarwa: `stream.ts`, `streamHandler.ts`, +Ginshikan yawo da mataimakan mai samarwa: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, @@ -655,7 +655,7 @@ Umarni da aka saba amfani da su: ## 8. `scripts/` -An tsara shi zuwa ƙananan manyan fayiloli 6 bisa ga manufa. +An tsara su zuwa manyan fayiloli 6 bisa ga manufarsu. - **`scripts/build/`** — `build-next-isolated.mjs`, `prepublish.ts`, `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, diff --git a/docs/i18n/ha/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/ha/docs/architecture/RESILIENCE_GUIDE.md index d5e5c4d5f7ad..d80cbae86b8f 100644 --- a/docs/i18n/ha/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/ha/docs/architecture/RESILIENCE_GUIDE.md @@ -67,96 +67,156 @@ ja-da-baya mai ƙaruwa na `minRetryCooldownMs → maxRetryCooldownMs`. Ƙimomin `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Kariyar hana komawar matsala: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Lokacin Jiran Sake Haɗi +## 2. Lokacin Jinkirin Sake Haɗawa -**Iyaka:** haɗin mai bayarwa/asusu/maɓalli guda ɗaya. +**Iyaka:** haɗin mai samarwa/asusu/maɓalli guda ɗaya. -**Manufa:** tsallake maɓalli guda ɗaya mai matsala yayin da sauran haɗin mai bayarwar ɗaya suke ci gaba da aiki. +**Manufa:** tsallake maɓalli guda ɗaya mara kyau yayin da sauran hanyoyin haɗin mai samarwar ɗaya suke ci gaba da aiki. **Aiwatarwa:** -- Sanya a matsayin mara samuwa: `src/sse/services/auth.ts::markAccountUnavailable()` +- Yi masa alamar ba ya samuwa: `src/sse/services/auth.ts::markAccountUnavailable()` - Zaɓi: `getProviderCredentials*` a cikin wannan fayil ɗin -- Lissafin lokacin jira: `open-sse/services/accountFallback.ts::checkFallbackError()` +- Lissafin lokacin jinkiri: `open-sse/services/accountFallback.ts::checkFallbackError()` - Saituna: `src/lib/resilience/settings.ts` -**Filaye na kowane haɗi:** +**Filaye na kowace hanyar haɗi:** -- `rateLimitedUntil` — tambarin lokaci har lokacin jira ya ƙare +- `rateLimitedUntil` — tambarin lokaci har sai lokacin jinkiri ya ƙare - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — ma'aunin ƙarin jinkiri na ninkawa +- `backoffLevel` — ma'aunin jinkirin da ke ƙaruwa ninki-ninki -**Tsoffin lokutan jira:** +**Tsoffin lokutan jinkiri:** - Tushen OAuth: 5s - Tushen API-key: 3s -- API-key 429: yana fifita `Retry-After` na upstream/kanun sake saitawa/rubutun sake saitawa da za a iya fassarawa -- Ƙarin jinkiri: `baseCooldownMs * 2 ** failureIndex` +- API-key 429: yana fifita `Retry-After`/kanun sake saiti/rubutun sake saiti da za a iya fassarawa daga uwar garken sama +- Jinkirin komawa baya: `baseCooldownMs * 2 ** failureIndex` -**Kariyar hana cunkoson buƙatu lokaci guda:** tana hana gazawar da ke faruwa lokaci guda daga tsawaita lokacin jira fiye da kima ko ƙara `backoffLevel` sau biyu. +**Kariyar hana turmutsitsin buƙatu:** tana hana gazawa masu faruwa lokaci guda tsawaita lokacin jinkiri fiye da kima ko ƙara `backoffLevel` sau biyu. -**Yanayin ƙarshe (BA lokutan jira ba):** +**Yanayin ƙarshe (BA lokutan jinkiri BA ne):** -- `banned` — ana saita shi ta hanyar gano kalmar-hana / hana asusu (duba [BAN_DETECTION](../security/BAN_DETECTION.md)), da kuma ƙin amincewar upstream sau uku a jere ga kowace buƙata (`request_rejected`, misali Anthropic OAuth 403 "Ba a yarda da buƙatar ba" — `open-sse/services/requestRejectedStreak.ts`); ƙin amincewa guda ɗaya kawai yana sanya haɗin cikin lokacin jira -- `expired` (yana komawa yanayin ƙarshe bayan iyakantattun sake-gwaji — `EXPIRED_RETRY_MAX = 3` tare da ƙarin jinkiri na ninkawa — domin kurakuran OAuth na ɗan lokaci su iya gyara kansu kafin a kashe asusun na dindindin) +- `banned` — ana saita shi ta hanyar gano kalmar da aka hana / hana asusu (duba [BAN_DETECTION](../security/BAN_DETECTION.md)), da kuma ƙin amincewa da buƙata guda-guda sau uku a jere daga uwar garken sama (`request_rejected`, misali Anthropic OAuth 403 "Ba a yarda da buƙata ba" — `open-sse/services/requestRejectedStreak.ts`); ƙin amincewa sau ɗaya kawai yana sanya haɗin cikin lokacin jinkiri +- `expired` (yana komawa yanayin ƙarshe bayan iyakantattun sake gwadawa — `EXPIRED_RETRY_MAX = 3` tare da jinkirin da ke ƙaruwa ninki-ninki — domin kurakuran OAuth na ɗan lokaci su iya gyara kansu kafin a kashe asusun har abada) - `credits_exhausted` -Waɗannan suna ci gaba da kasancewa har sai bayanan shaidarka sun canza ko mai gudanarwa ya sake saita su. Kada a maye gurbin yanayin ƙarshe da yanayin jira na ɗan lokaci. +Waɗannan suna ci gaba da kasancewa har sai bayanan shiga sun canza ko mai gudanarwa ya sake saita su. Kada a maye gurbin yanayin ƙarshe da yanayin jinkiri na ɗan lokaci. -**Farfadowa lokacin buƙata:** idan lokacin `rateLimitedUntil` ya wuce, haɗin zai sake cancanta. Bayan amfani mai nasara, `clearAccountError()` yana share duk filayen kuskure. +**Farfadowa idan an buƙata:** idan lokacin `rateLimitedUntil` ya wuce, haɗin zai sake cancantar amfani. Bayan amfani cikin nasara, `clearAccountError()` yana share duk filayen kuskure. -### Dorewar zama kan haɗi ɗaya (#7274) +### Katangar amfani ta Claude OAuth: layin ƙaramin fifiko + sake saita iyakar zama -**Iyaka:** zaman abokin ciniki guda ɗaya (kan `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) da aka ɗaure da haɗi guda ɗaya, ga **kowane** mai bayarwa. +**Iyaka:** haɗin rajistar Claude (OAuth) guda ɗaya. Duk siffofin biyu **ana kunna su bisa zaɓi ga kowace +hanyar haɗi** (Gyara haɗi → sashen Claude → `lowPriorityMode` / `autoLimitReset` a cikin +`providerSpecificData`, dukkansu a kashe suke ta tsohuwa) kuma suna kwaikwayon umarnin `/low-priority` da +`/limit-reset` na Claude Code (an samo ƙa'idar sadarwa daga Claude Code 2.1.263). -**Manufa:** riƙe wakili mai tattaunawa matakai da yawa (Claude Code, aider, wakilai na musamman) a kan asusu ɗaya tsakanin buƙatu, domin rage asarar mahalli sakamakon sauya asusu da maimaituwar 429 na farawa daga sanyi a wurin masu bayarwa masu yanayin zama na kowane asusu. +**Aiwatarwa:** + +- Injin yanayi + rarraba martani: `open-sse/services/claudeLowPriority.ts` +- Abokin hulɗar matsayin sake saiti/karɓa: `open-sse/services/claudeLimitReset.ts` +- Mahadar mai aiwatarwa (saka kanun bayanai + sake gwadawa da asusu ɗaya): `open-sse/executors/base.ts::execute()` +- Adana zaɓin kunnawa: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Abin da ke tayar da shi:** katangar amfani ta awanni 5 — `429` wanda kanun bayanansa ke ɗauke da +`anthropic-ratelimit-unified-status: rejected` kuma, idan asusun ya cancanta, +`anthropic-ratelimit-unified-slow-offer: treatment`. Ba a aika komai kafin 429 na wannan katanga na farko; +429 na tarin buƙatu ba tare da haɗaɗɗun kanun bayanai ba yana bi ta hanyar lokacin jinkiri ta al'ada. + +**Layin ƙaramin fifiko** (`lowPriorityMode`): + +- A 429 na katangar, mai aiwatarwa yana karɓar tayin kuma nan take ya sake gwada **asusun ɗaya** + tare da `anthropic-usage-limit: slow`; layin yana ci gaba da aiki har zuwa lokacin + `anthropic-ratelimit-unified-reset` da aka sanar (+60s na rangwame), kuma kowace buƙata a wannan lokacin tana ɗauke da + kanun bayanan. 429 da aka katse ba ya isa ga `handleChatCore`, don haka ba a sanya haɗin + cikin lokacin jinkiri kuma ba a sauya shi zuwa wani. +- `anthropic-ratelimit-unified-slow-status` a martanin baya: `active` / `not_needed` + suna ci gaba da layin; `slot_busy` (429) ko `529` suna jira na tsawon + `anthropic-ratelimit-unified-slow-retry-after` na uwar garken (tsoho 20s, iyaka 5–600s, karkacewar ±30%) + sannan su sake gwadawa, ƙarƙashin iyakar `anthropic-ratelimit-unified-slow-max-wait` (tsoho minti 20, iyaka + minti 1–awanni 6) — bayan wannan layin yana ƙarewa kuma hutun minti 10 yana hana sake karɓa. Haka kuma, + an iyakance jiran da abin da ya rage na wa'adin fara sadarwa da uwar garken sama na buƙatar + (`resolveFetchStartTimeout`, minti 10 ta tsohuwa) ban da tazarar 5 s: idan babu wannan iyakar, + tsohuwar iyakar jira ta minti 20 za ta wuce tsawon rayuwar buƙatar, kuma za a katse jiran + a tsakiyarsa, wanda zai fito da `TimeoutError` maimakon ƙarewar `max_wait` cikin sauƙi + hutun tilas. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, sake zagayowar tagar 5h, ko + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (wanda ke ƙare shi a matsayin + `extra_usage` a kowane yanayi, domin ƙarin amfani da aka biya yanzu yana rufe katangar) suna ƙare layin; + sai martanin ya bi hanyar lokacin jinkiri ta al'ada. Ana tuna `budget_exhausted` har sai + sake saitin kasafin da aka sanar (≤ kwanaki 8). +- Binciken katangar yana gudana bayan sake gwadawar cikin yunƙuri ta mai aiwatarwa wanda 400 ya jawo (gyaran + mahalli, iyakance tunani/ƙoƙari, koyon ma'auni ta atomatik), don haka 429 na katanga da ya bayyana kawai a + ɗaya daga cikin waɗannan sake gwadawar har yanzu ana katse shi maimakon ya isa hanyar lokacin jinkiri. +- Yanayin yana cikin ƙwaƙwalwa ga kowace hanyar haɗi (sake farawa yana haifar da ƙarin 429 na katanga guda ɗaya don sake karɓa). + +**Sake saita iyakar zama** (`autoLimitReset`, ana gwada shi kafin layin idan dukansu suna kunne): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → tubalin `juniper_tide`; + idan `arm: "reset"` kuma `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` tare da + `{ "program": "juniper_tide" }` (UUID na ƙungiya daga + `providerSpecificData.organizationUUID`, koma ga ƙaddamarwar farko idan babu). +- `result: reset|not_limited` → ana sake gwada buƙatar da cikakken sauri (ba tare da kanun jinkiri ba). + `already_used` / `not_offered` suna haddace `next_available_at` (tsoho mako ɗaya); kowace + gazawa tana ja da baya na minti 15. Sake saitin sau ɗaya ne a mako kuma har yanzu yana cikin + lissafin iyakar mako-mako. + +Kariyar hana koma-bayan aiki: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + +### Dorewar zama (#7274) + +**Iyaka:** zaman abokin hulɗa guda ɗaya (kanun `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) da aka ɗaure zuwa haɗi guda ɗaya, ga **kowane** mai samarwa. + +**Manufa:** kiyaye wakilin tattaunawa mai zagaye da yawa (Claude Code, aider, wakilai na musamman) a kan asusu ɗaya tsakanin buƙatu, domin rage ɓacewar mahallin da ke faruwa yayin sauya asusu da kuma maimaituwar kuskuren 429 na farawa daga sanyi a kan masu samarwa da ke da yanayin zaman da ya keɓanta ga kowane asusu. **Aiwatarwa:** -- Ƙayyade TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Zaɓi/ƙirƙirar ɗauri: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Ciro kanun bayanai (na gaba ɗaya, kowane mai bayarwa): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Teburin ɗauri da ake adanawa: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Saiti: `sessionAffinityTtlMs` (TTL na gaba ɗaya a ms, `0` yana kashe shi) — `src/lib/db/settings.ts`. An sake masa suna daga `codexSessionAffinityTtlMs` na Codex kawai ta hanyar ƙaura `124_generic_session_affinity_ttl.sql`, wanda ke ɗaukar duk wani Codex TTL da aka riga aka saita ya zama sabon tsohon ƙima. +- Tantance TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- Zaɓi/ƙirƙirar pin: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Ciro header (gama-gari, ga kowane mai samarwa): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Teburin pin da aka adana: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Saiti: `sessionAffinityTtlMs` (TTL na gama-gari a cikin ms, `0` yana kashe shi) — `src/lib/db/settings.ts`. An sauya sunansa daga `codexSessionAffinityTtlMs`, wanda ya keɓanta ga Codex kawai, ta hanyar ƙaura `124_generic_session_affinity_ttl.sql`, wadda ke ɗaukar duk wani Codex TTL da aka riga aka saita a matsayin sabon tsohon ƙima. -Kafin #7274, `resolveSessionAffinityTtlMs()` yana dakatar da wuri ya mayar da `0` ga kowane mai bayarwa ban da `codex`, don haka saitin TTL (da kanun zaman) ba su da tasiri a ko'ina dabam duk da cewa tsarin ɗauri da ciro kanun bayanai sun riga sun kasance masu zaman kansu daga mai bayarwa. Gyaran ya cire wannan mayarwa ta wuri; yanzu TTL yana aiki iri ɗaya ga kowane mai bayarwa da zarar an saita shi a matakin gaba ɗaya sama da `0`. +Kafin #7274, `resolveSessionAffinityTtlMs()` yana dakatarwa nan take ya mayar da `0` ga kowane mai samarwa ban da `codex`, don haka saitin TTL (da headers na zaman) ba su da wani tasiri a ko'ina dabam duk da cewa tsarin pin da ciro header sun riga sun kasance masu zaman kansu daga mai samarwa. Gyaran ya cire wannan dakatarwar ta farko; yanzu TTL yana aiki iri ɗaya ga kowane mai samarwa da zarar an saita shi gaba ɗaya zuwa fiye da `0`. -Ba a taɓa tura kanun dorewar zama guda ukun zuwa upstream ba — masu aiwatarwa suna gina nasu kanun upstream daga tushe maimakon wuce kanun abokin ciniki kai tsaye, don haka wannan ya kasance ID na alaƙar ciki kawai. +Ba a taɓa tura headers uku na session-affinity zuwa sabar sama ba — masu aiwatarwa suna gina nasu headers na sabar sama daga tushe maimakon miƙa headers na abokin ciniki kai tsaye, don haka wannan yana kasancewa ID na haɗa bayanai na ciki kawai. ### Hayar haɗin zaman da ake sarrafawa ta keɓance -**Iyaka:** abokin cinikin HTTP/zama guda ɗaya da ke aiki yana mallakar haɗin OmniRoute guda ɗaya da ya cancanta. +**Iyaka:** HTTP client/zaman da ake sarrafawa guda ɗaya mai aiki yana mallakar haɗin OmniRoute guda ɗaya da ya cancanta. -**Manufa:** samar da mallakar haɗi ta keɓance mai ɗorewa ga abokan ciniki da ke buƙatar ƙaƙƙarfan shingen karkatarwa -tsakanin buƙatu. Wannan ya bambanta da dorewar zama kan haɗi ɗaya, wadda fifikon ci gaba ne mai sassauci: -haya ta keɓance tana adana yanayin zagayowar rayuwa a SQLite, tana tilasta keɓantuwar mai-mallaka mai aiki da -haɗi mai aiki a matakin gaba ɗaya, kuma tana ƙin tsohuwar tsara kafin aika zuwa mai bayarwa. +**Manufa:** samar da mallakar haɗi ta keɓance mai ɗorewa ga abokan ciniki da ke buƙatar shingen zaɓin hanya mai tsauri +a tsakanin buƙatu. Wannan ya bambanta da session affinity, wanda fifikon ci gaba ne mai sassauci: +haya ta keɓance tana adana yanayin zagayowar rayuwa a SQLite, tana tabbatar da keɓancewar mai-mallaka mai aiki da +haɗi mai aiki a tsarin gaba ɗaya, sannan tana ƙin tsohon generation kafin aikawa zuwa mai samarwa. -Ana kunna fasalin ne bisa zaɓi ga kowane API key. Dole ne maɓallin da ake sarrafawa ya kasance da izinin `lease:exclusive` da -jerin `allowedConnections` marar komai da aka fayyace sarai. Kowane abokin cinikin HTTP zai iya amfani da maƙurar zagayowar rayuwa; ba a -buƙatar sunan abokin ciniki, user-agent, mai bayarwa, hanyar OAuth, ko model. Hayar tana mallakar haɗi ne, -ba model ba, don haka sauya model yana riƙe ɗaurin muddin haɗin yana ci gaba da cancanta -kamar yadda aka saba. Dokokin model, ƙayyadadden amfani, lafiya, lokacin jira, da jerin izini na yau da kullum suna ci gaba da zama -masu iko kuma suna iya mayar da tsara ɗaya zuwa wani haɗi kyauta da ya cancanta. +Ana kunna fasalin ne bisa zaɓi ga kowane API key. Maɓallin da ake sarrafawa dole ne ya kasance da scope na `lease:exclusive` da kuma +jerin `allowedConnections` bayyananne wanda ba fanko ba. Kowane HTTP client na iya amfani da lifecycle endpoint; ba a +buƙatar sunan abokin ciniki, user-agent, mai samarwa, hanyar OAuth, ko model. Hayar tana mallakar haɗi, +ba model ba, don haka sauya model yana riƙe ɗaurin muddin haɗin yana ci gaba da kasancewa +wanda ya cancanta bisa ƙa'ida. Dokokin model, quota, health, cooldown, da allowlist na yau da kullum suna ci gaba da +kasancewa masu iko kuma za su iya sauya generation ɗin nan zuwa wani haɗi kyauta da ya cancanta. Zagayowar rayuwar ita ce `POST /api/v1/session-leases` tare da ayyukan JSON `acquire`, `renew`, da `release`. -Buƙatun inference da ake sarrafawa suna gabatar da ƙimar `X-OmniRoute-Lease-Owner` da ba ta bayyana ma'ana ba da kuma daidaitaccen -`X-OmniRoute-Lease-Generation`. Mai-mallakar yana amfani da `vlo_` sannan haruffan base64url guda 43; hash ɗinsa na -SHA-256 kawai ake adanawa. Kowane shingen aikawa na ƙarshe yana kuma ɗaure ID na API key da aka tantance da kuma -ID na haɗin da ke aiki. Ana cire kanun sarrafa haya daga logs, hotunan buƙata da aka riƙe, da -kanun masu aiwatar da upstream. +Buƙatun inference da ake sarrafawa suna gabatar da ƙimar sirri ta `X-OmniRoute-Lease-Owner` da ainihin +`X-OmniRoute-Lease-Generation`. Owner yana amfani da `vlo_` sannan haruffan base64url guda 43 su biyo baya; hash ɗinsa na +SHA-256 kawai ake adanawa. Kowane shingen aikawa na ƙarshe kuma yana ɗaure ID na API key da aka tantance da +ID na haɗi mai aiki. Ana cire headers na sarrafa haya daga logs, hotunan buƙatun da aka riƙe, da +headers na masu aiwatarwa na sabar sama. -Idan karkatarwa ta yau da kullum tana da 'yan takarar da ake sarrafawa masu cancanta amma kowanne ɗan takara kyauta yana hannun -wata haya mai aiki ta daban, OmniRoute yana mayar da HTTP `429`, lambar rashin-samuwar ƙarfin haya, -yanayin jiran samun ƙarfin aiki, da iyakantaccen `Retry-After` da aka samo daga lokacin ƙarewa mafi kusa da ya dace. -Rashin cancantar komai na yau da kullum ba takaddamar haya ba ce kuma yana riƙe ma'anonin kuskuren karkatarwa da ake da su. +Idan zaɓin hanya na yau da kullum yana da 'yan takarar da ake sarrafawa masu cancanta amma kowane ɗan takara kyauta yana hannun +wata hayar mai aiki ta daban, OmniRoute yana mayar da HTTP `429`, lambar lease-capacity-unavailable, +yanayin waiting-for-capacity, da `Retry-After` mai iyaka da aka samo daga lokacin ƙarewa mafi kusa da ya dace. +Rashin 'yan takara masu cancanta na yau da kullum ba takaddamar haya ba ce kuma yana riƙe da ma'anar kuskuren zaɓin hanya da yake da ita. -Hanyoyin da ke da alaƙa suna ci gaba da kasancewa daban: +Hanyoyin da ke da alaƙa suna ci gaba da kasancewa dabam: -- Mamayar zaman OAuth rabon asusun OAuth ne mai sassauci da ke takaita ga process. -- Semaphores na asusu suna ba da izinin yawan buƙatun da za su gudana lokaci guda kuma suna ƙarewa idan buƙata ta kammala. -- Hayar haɗin zaman da ake sarrafawa ta keɓance mallakar zagayowar rayuwa ce mai ɗorewa tare da shingen tsara. +- OAuth session occupancy rarrabawa ce mai sassauci da ta keɓanta ga process domin asusun OAuth. +- Account semaphores suna ba da izinin yawan buƙatun da za a iya aiwatarwa lokaci guda kuma suna ƙarewa idan buƙata ta kammala. +- Exclusive managed session leases mallakar zagayowar rayuwa ce mai ɗorewa tare da shingen generation. --- @@ -275,48 +335,76 @@ iyakar ƙimar buƙatu ta kowane model. `comboCooldownWait` ne ke iyakance shi (` --- -## 5. Sarrafa Karɓar Buƙatu Cikin Layi (v3.8.49 · issue #6593) - -**Iyakar aiki**: layin iyakance ƙimar buƙatu na gida ga kowane mai samarwa+haɗi (`open-sse/services/rateLimitManager.ts`, -wanda Bottleneck ke tallafawa), mataki ɗaya ƙasa da hanyoyi ukun da ke sama. - -**`maxWaitMs` tsohon suna ne da aka adana don ƙarewar lokacin aiwatarwa.** -Ana aika `resilienceSettings.requestQueue.maxWaitMs` zuwa Bottleneck a matsayin -`expiration` na job, wanda mai ƙidayar lokacinsa yake farawa ne kawai bayan an aika buƙatar. Saboda haka, yana iyakance -aiwatarwar da limiter ke sarrafawa, ba lokacin da aka shafe ana jira a layin gida ba. Ana -bayyana ƙarewar lokaci a matsayin amintaccen `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` na gida (HTTP 504); -ana karɓar tsohon sunan lambar ƙarewar lokacin layi ne kawai don amintaccen -dacewar baya ta cikin gida. Tsohuwar ƙima ita ce 15000ms; ana iya maye gurbinta ta -`RATE_LIMIT_MAX_WAIT_MS` (env) ko dashboard (**Settings → Resilience**, -iyakar UI 1–30000ms). Zama a layi ba shi da wa’adin lokaci; yi amfani da -`maxQueueDepth` da ke ƙasa don iyakance masu kira da ke jira. +## 5. Sarrafa Karɓar Buƙatu Cikin Jerin Jira (v3.8.49 · issue #6593) + +**Iyaka**: jerin jiran iyakance-yawan-buƙatu na cikin gida na kowane provider+connection (`open-sse/services/rateLimitManager.ts`, +wanda Bottleneck ke tallafa wa), mataki ɗaya a ƙasa da hanyoyi uku da ke sama. + +**`maxWaitMs` yana iyakance jiran jerin gwano; `executionMaxWaitMs` yana iyakance aiwatarwa.** +An raba su biyun da gangan, kuma babu ɗayansu da ke shafar ɗayan. + +`resilienceSettings.requestQueue.maxWaitMs` shi ne **kasafin lokacin jiran jerin gwano**: yana +rufe lokacin jiran samun gurbin provider sannan da zama a matsayin QUEUED, kuma ana +share ma'aunin lokacinsa da zarar aikin ya bar QUEUED ya fara aiwatuwa +(`rateLimitManager.ts`, `wrappedFn`). Buƙatar da ta wuce wannan lokaci ba za ta taɓa +isa upstream ba. Tsoho shi ne 30000ms, wanda +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` ke samarwa a cikin +`src/lib/resilience/settings.ts` kuma +`tests/unit/ratelimit-admission-control-6593.test.ts` ya tabbatar da shi, don haka +canza shi zai sa gwajin ya gaza maimakon barin wannan sakin layi ya tsufa ba tare da an lura ba. + +`resilienceSettings.requestQueue.executionMaxWaitMs` shi ne abin da Bottleneck +ke karɓa a matsayin `expiration` na aikin, wanda ma'aunin lokacinsa ke farawa ne kawai +bayan an tura aikin. Kariyar ƙarshe ce ga masu aiwatarwa waɗanda ba su da nasu +lokacin ƙarewar upstream, kuma ana ɗaga shi zuwa lokacin ƙarewar fara-fetch na +mai aiwatarwar idan wannan ya fi tsawo, don kada ya katse amsa mai lafiya da ke kan hanya. +Tsoho shi ne 600000ms (minti 10). + +Saka kasafin jerin gwano cikin `expiration` shi ne abin da a baya yake katse +gateways marasa incremental a tsakiyar aiki — bisa ƙa'ida suna iya ɗaukar mintuna kafin bytes na farko — +kuma wannan ne ya sa ake bayyana expiration a matsayin `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), yayin da kasafin jerin gwano ke ɗauke da +lambar ƙarewar lokacin jerin gwano. Sauya kowannensu ta `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) ko dashboard +(**Settings → Resilience**). Ana taƙaita dukansu zuwa 1ms–24h lokacin da ake daidaita su. + +**Fifiko, ga dukansu:** env var yana samar da _default_ ne kawai. Ƙimar da aka +adana a `resilienceSettings.requestQueue` (dashboard / API patch, wadda aka adana +a `key_value`) tana rinjayarsa, sannan +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` na takamaiman connection +yana rinjayar wannan. Saboda haka, saita env var a deployment da ya riga yana da +ƙimar da aka adana ba zai canza komai ba — a maimakon haka, share ko sabunta +saitin da aka adana. + +`maxWaitMs` yana iyakance tsawon zaman buƙata a jerin gwano; `maxQueueDepth` da ke ƙasa +yana iyakance yawan masu kira da za su iya zama a jerin gwano lokaci guda. **`maxQueueDepth` — iyakar karɓa ta zaɓi (sabuwa).** `resilienceSettings.requestQueue.maxQueueDepth` -yana iyakance yawan buƙatun da za su iya zama a layi (ba a aika su ba tukuna) ga -mai samarwa+haɗi guda ɗaya a lokaci guda. Idan layin ya riga ya ƙunshi buƙatu -`maxQueueDepth`, za a ƙi sabuwar buƙata nan take tare da kuskure mai nau’in -`code: "RATE_LIMIT_QUEUE_FULL"` **kafin** ta taɓa isa ga `limiter.schedule()` -— don haka ƙin yana da sauƙin kuɗin sarrafawa kuma yana faruwa kafin duk wani aikin -matse prompt / fassara na downstream ga wannan buƙatar. Tsohuwar ƙima `0` = -a kashe, wanda ke kiyaye halin layi mara iyaka da ake da shi; iyaka 0–100000. -Ana iya maye gurbinta ta `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) ko -`resilienceSettings.requestQueue.maxQueueDepth` (gyaran dashboard/API). +yana iyakance yawan buƙatun da za su iya zama a jerin gwano (waɗanda ba a tura ba tukuna) ga +provider+connection guda ɗaya a lokaci guda. Idan jerin gwano ya riga yana ɗauke da +buƙatu `maxQueueDepth`, za a yi saurin ƙin sabuwar buƙata tare da kuskure mai nau'i +`code: "RATE_LIMIT_QUEUE_FULL"` **kafin** ta taɓa isa `limiter.schedule()` +— saboda haka ƙin yana da sauƙin farashi kuma yana faruwa kafin duk wani aikin +prompt-compression / translation na downstream ga wannan buƙatar. Tsoho `0` = +an kashe, wanda ke kiyaye halin jerin gwano mara iyaka da ake da shi; an taƙaita shi zuwa 0–100000. +Sauya ta `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) ko +`resilienceSettings.requestQueue.maxQueueDepth` (dashboard/API patch). Binciken karɓar kansa pure function ne -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) don haka -ana iya yi masa unit test ba tare da ainihin limiter na Bottleneck ba. +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) saboda haka +ana iya yi masa unit-test ba tare da ainihin Bottleneck limiter ba. -> RFC da ya buɗe #6593 ya kuma ba da shawarar flag na `bypassCompressionOnRateLimit`. +> RFC da ya buɗe #6593 ya kuma ba da shawarar flag mai suna `bypassCompressionOnRateLimit`. > Pipeline na `open-sse/services/compression/` na wannan repo yana yin -> matse prompt/context kan buƙatar LLM mai fita (`chatCore.ts`, +> prompt/context compression kan buƙatar LLM mai fita (`chatCore.ts`, > a kusa da block na `resolveCompressionSettings`/`selectCompressionStrategy`), -> ba matse martanin HTTP kan jikin 429 da aka ƙirƙira ba — babu -> madaidaicin hanyar code don flag na bypass kai tsaye. Wannan matakin matse prompt +> ba HTTP response compression kan jikin 429 da aka ƙirƙira ba — babu +> hanyar code da ta dace da literal bypass flag. Wannan matakin prompt-compression > a halin yanzu kuma yana gudana _kafin_ `withRateLimit()` a cikin pipeline na buƙata, don haka -> sake tsara shi domin tsallake shi idan an ƙi buƙata saboda layi ya cika wani sauyi ne daban kuma mafi girma -> fiye da iyakar aikin wannan issue; da gangan **ba a** aiwatar da shi +> sake tsara jerin domin tsallake shi lokacin ƙin queue-full wani canji ne daban kuma mafi girma +> fiye da iyakar wannan issue; da gangan **ba a** aiwatar da shi > a nan ba, kuma an bar shi a matsayin aikin gaba idan ribar rage amfani da CPU ta cancanci -> haɗarin sake tsara tsarin. +> haɗarin sake tsara jerin. --- diff --git a/docs/i18n/ha/docs/architecture/admission-lanes.md b/docs/i18n/ha/docs/architecture/admission-lanes.md index e8fd79989dfc..5906ea022cae 100644 --- a/docs/i18n/ha/docs/architecture/admission-lanes.md +++ b/docs/i18n/ha/docs/architecture/admission-lanes.md @@ -7,48 +7,52 @@ OmniRoute yana da tsarin layuka na cikin-process guda **biyu** masu iyakoki daban-daban. Suna cika juna; ya kamata masu gudanarwa su san wanne ne suke dubawa. -## 1. Karɓar bayanai a matakin byte na faɗin process (`chatBodyAdmission.ts`) +## 1. Karɓar bayanai a matakin byte ga ɗaukacin tsari (`chatBodyAdmission.ts`) - **Iyaka:** hanyar buffered-body/heap don `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses`, da sauran hanyoyi masu tsarin chat. Yana - karewa daga faɗaɗa amfani da heap sakamakon manyan bodies na coding-agent (#4380). -- **Controller guda ɗaya na gaba ɗaya ga process, ba layuka na kowane key ba (#10110).** Kowane API key - (wanda aka yi hash) ko zaman `anonymous` yana neman izinin shiga ne bisa **kasafi guda ɗaya** - da kowa ke amfani da shi — ana amfani da hashed session id ne KAWAI a matsayin key na tsara - adalci (rarraba masu jira ta round-robin), ba a taɓa amfani da shi a matsayin rarrabuwar - capacity ba. Wata sigar da ta gabata ta wannan doc ta bayyana layuka na kowane key masu - capacity mai zaman kansa; an cire wannan tsarin a #10110 saboda yana ba wa bayanan shaidar - bogi marasa tantancewa damar ninka iyakar faɗin process. -- **Ƙofa (#503-fanout): kasafin BYTE na ingest da ake ƙirƙira ta atomatik, ba tsayayyen adadin - requests ba.** Tsohon iyakar adadin requests ta `CHAT_MAX_HEAVY_IN_FLIGHT` (default `1` + `/v1/messages`, `/v1/responses`, da sauran hanyoyi masu tsarin chat. Tana karewa + daga ƙaruwar amfani da heap sakamakon manyan bodies na coding-agent (#4380). +- **Mai sarrafawa guda ɗaya na gabaɗayan tsari, ba lanes na kowane key ba (#10110).** Kowane API key + (wanda aka yi wa hash) ko zaman `anonymous` yana neman izinin shiga daga **kasafin kuɗi ɗaya** + da kowa ke amfani da shi — ana amfani da hashed session id NE KAWAI a matsayin key na tsara adalci + (rarraba waiters bi-da-bi), ba a taɓa amfani da shi a matsayin shard na capacity ba. Wata sigar baya ta wannan + daftari ta bayyana lanes na kowane key masu capacity masu zaman kansu; an cire wannan tsarin + a #10110 saboda yana ba wa fake credentials marasa authentication damar ninka + iyakar gabaɗayan tsari. +- **Ƙofa (#503-fanout): kasafin BYTE na ingest da ake samarwa ta atomatik, ba ƙayyadadden adadin requests + ba.** Tsohon iyakar adadin requests ta `CHAT_MAX_HEAVY_IN_FLIGHT` (default `1` kafin wannan gyaran) ta durƙusar da fan-out na coding-agent (subagents/CLIs da yawa, - bodies waɗanda akai-akai suke > 256 KB) zuwa ingantaccen concurrency na kusan ~1, wanda - ya haifar da 503 a ƙarƙashin load na yau da kullum. Yanzu yana aiki ne kawai idan mai gudanarwa - ya saita `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` a sarari. Idan ba a saita shi ba, maimakon haka - ana sarrafa karɓar bayanai da `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — kasafin da ake ƙirƙira - ta atomatik daga ainihin iyakar memory na process (`src/shared/middleware/admissionBudget.ts`): - 25% na mafi ƙanƙanta tsakanin iyakar V8 heap da duk wani iyakar cgroup/container, - sannan a raba da ma’aunin transient-amplification na 8x, tare da taƙaita shi tsakanin 8 MiB da - 2 GiB. Explicit overrides suna amfani da waɗannan clamps ɗin. Wannan yana daidaita kansa daga - container mai 512 MB zuwa desktop mai 32 GB ba tare da daidaita env ba. Body da ba zai iya - shiga cikin ingantaccen kasafin ba zai gaza nan take da `413 body_exceeds_budget`; - gasa tsakanin bodies waɗanda kowannensu za a iya sarrafawa ce kawai take shiga layin - adalci mai iyaka. Live multi-signal resource-pressure tracker (V8 heap ratio, + bodies masu wuce 256 KB a kai a kai) zuwa effective concurrency na ~1, wanda ke haifar da 503 + ƙarƙashin load na yau da kullum. Yanzu tana aiki ne kawai idan operator ya saita + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` kai tsaye. Idan ba a saita ta ba, maimakon haka + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` ce ke sarrafa admission — kasafin da ake samarwa ta atomatik daga + ainihin iyakar memory ta process (`src/shared/middleware/admissionBudget.ts`): + 25% na mafi ƙanƙanta tsakanin iyakar V8 heap da kowace iyakar cgroup/container, + a raba da transient-amplification factor na 8x, sannan a taƙaita tsakanin 8 MiB da + 2 GiB. Explicit overrides suna amfani da clamps iri ɗaya. Wannan yana daidaita kansa daga + container mai 512 MB zuwa desktop mai 32 GB ba tare da env tuning ba. Body da ba zai iya + shiga cikin effective budget ba zai gaza nan take da `413 body_exceeds_budget`; + fafatawa tsakanin bodies waɗanda kowannensu za a iya sarrafawa ce kawai ke shiga bounded + fairness queue. Live multi-signal resource-pressure tracker (V8 heap ratio, cgroup, PSI, OOM events — `open-sse/utils/resourcePressurePolicy.ts`) yana rage - iyakantaccen lokacin jira a ƙarƙashin matsin `high`, kuma yana watsarwa nan take da - `503 resource_pressure` a ƙarƙashin matsin `critical`, tun kafin a ingest kowane bytes. + bounded wait a ƙarƙashin matsin `high`, kuma yana watsarwa nan take da + `503 resource_pressure` a ƙarƙashin matsin `critical`, tun kafin a ingest ko byte ɗaya. + Ana karanta PSI daga `memory.pressure` na cgroup na wannan unit idan yana nan + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` ya shafi + duk host kuma fallback ne kawai a bare metal / cgroup v1, don haka host da ke yin swapping + ba zai iya mayar da 503 ga container da ba ya aiki ba. - **Daidaitawa:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — override na kasafin byte da ake ƙirƙira ta atomatik + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — override na kasafin byte da ake samarwa ta atomatik - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — tsohon iyakar adadin requests, opt-in kawai - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — jiran layi kafin 503 (default 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — bawul ɗin heap na queued-bytes (default 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — an daina - amfani da su kuma no-ops ne tun daga #10110 (ana karɓarsu don dacewa da config, amma ana watsi da su) + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — lokacin jiran queue kafin 503 (default 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — queued-bytes heap valve (default 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — deprecated + no-ops tun daga #10110 (ana karɓarsu don config compatibility, amma ana watsi da su) - **Rahotanni:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — ciki har da ƙarin abubuwan #503-fanout: `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity`, da `countCapEnabled` (false a default deployment — yana tabbatar da cewa kasafin byte ne, ba tsohon - count cap ba, yake aiki a zahiri). + count cap ba, ke ƙuntatawa a zahiri). ## 2. Layukan kama-da-wane masu daidaitawa a lokacin aiki (`open-sse/services/admission`) diff --git a/docs/i18n/ha/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/ha/docs/frameworks/EMBEDDED-SERVICES.md index 00d2d4bc4b1f..5fe0dc8a1fe5 100644 --- a/docs/i18n/ha/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/ha/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Siga:** v3.8.44 -> **Sabuntawa ta ƙarshe:** 2026-07-03 -> **Masu karatu:** Injiniyoyin da ke ƙarawa, kulawa, ko gyara matsalolin ayyukan da aka haɗa (9Router, CLIProxyAPI, Mux, Bifrost). +> **Sabuntawa na ƙarshe:** 2026-09-09 +> **Masu karatu:** Injiniyoyin da ke ƙarawa, kulawa, ko gano matsalolin hidimomin da aka saka ciki (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Ayyukan da aka haɗa kayan aikin sidecar ne na matakai da ake girkawa a cikin na'ura, waɗanda OmniRoute ke girkawa, sa ido a kansu, kuma -ke gabatar da su a matsayin cikakkun wuraren da ake iya tura zirga-zirga zuwa gare su. Ba kamar masu samar da sabis na waje ba (waɗanda ake isa gare su ta intanet -ta amfani da maɓallan API), ayyukan da aka haɗa suna aiki a na'ura ɗaya da OmniRoute kuma suna sadarwa ta loopback. +Hidimomin da aka saka ciki kayan aikin tsari ne na gefe da ake girkawa a cikin na’ura, waɗanda OmniRoute ke girkawa, sa ido a kansu, kuma +ke samar da su a matsayin cikakkun maƙasudan turawa. Ba kamar masu samar da sabis na waje ba (waɗanda ake isa gare su ta intanet +ta amfani da maɓallan API), hidimomin da aka saka ciki suna gudana a kan na’ura ɗaya da OmniRoute kuma suna sadarwa ta loopback. --- @@ -27,37 +27,38 @@ ta amfani da maɓallan API), ayyukan da aka haɗa suna aiki a na'ura ɗaya da Om --- -## 1. Bayani +## 1. Bayani Gabaɗaya -### Me ya sa ake amfani da ayyukan da aka haɗa? +### Me ya sa ake amfani da ayyukan da aka haɗa a ciki? -An haɗa ayyuka guda biyar: +An haɗa ayyuka guda shida: -| Aiki | Kunshin npm | Tashar tsoho | Manufa | -| --------------- | --------------------------------------------- | :----------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | Na'urar tura AI da OmniRoute zai iya amfani da ita a matsayin ƙaramin mai samar da sabis. Ana gabatar da samfura a matsayin `9router/{sub}/{model}` | -| **CLIProxyAPI** | Fayil ɗin binary na sakin GitHub (`cliproxy`) | 8317 | Adaftar proxy ta cikin gida don hanyoyin tabbatar da izini na Anthropic CLI. Tana samar da madadin tura zirga-zirga idan wa'adin token ɗin OAuth ya ƙare | -| **Mux** | `mux` (`mux server` marar UI) | 8322 | Daemon na cikin gida don tsara aikin wakilai (coder/mux). Ana sarrafa zagayowar rayuwarsa kawai — ba wurin tura zirga-zirga ba ne (babu proxy na LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend na relay na ƙofar AI da aka gina da Go. Lokacin da yake aiki, hanyar relay (`/v1/relay/`) tana zaɓarsa ta atomatik | -| **Dario** | `@askalf/dario` | 3456 | Proxy na biyan kuɗin Claude — madadi/mafaka ga CLIProxyAPI don zirga-zirga mai tsarin Claude-Code; maɓallin da aka saka ya zama `DARIO_ADMIN_TOKEN` wanda ke tsare tsarin sarrafa OAuth na `/admin/*` | +| Aiki | Kunshin npm | Tsohuwar tashar jiragen ruwa | Manufa | +| --------------- | ----------------------------------------------- | :--------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | Na'urar tsara hanyoyin AI da OmniRoute zai iya amfani da ita a matsayin ƙaramin mai bayarwa. Ana gabatar da samfurori a matsayin `9router/{sub}/{model}` | +| **CLIProxyAPI** | Fayil ɗin binary na GitHub release (`cliproxy`) | 8317 | Adaftar proxy ta cikin gida don hanyoyin tantancewar Anthropic CLI. Tana samar da madadin tsara hanya idan OAuth tokens suka ƙare | +| **Mux** | `mux` (`mux server` marar UI) | 8322 | Daemon na cikin gida don tsara ayyukan agents (coder/mux). Ana sarrafa tsarin rayuwarsa kawai — ba maƙasudin tsara hanya ba ne (babu tura buƙatun LLM ta proxy). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend na isar da AI-gateway na Go. Lokacin da yake aiki, hanyar relay (`/v1/relay/`) za ta zaɓe shi ta atomatik | +| **Dario** | `@askalf/dario` | 3456 | Proxy na biyan kuɗin Claude — madadi/mafita idan CLIProxyAPI ya gaza don zirga-zirga mai tsarin Claude-Code; maɓallin da aka shigar ya zama `DARIO_ADMIN_TOKEN` wanda ke tsare tsarin sarrafa OAuth na `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Sarrafa WhatsApp Web ta atomatik (Chromium marar UI ta hanyar Puppeteer). Ana sarrafa tsarin rayuwarsa kawai — ba maƙasudin tsara hanya ba ne. | -Dukkan biyar suna bin tsarin sa ido iri ɗaya: +Dukkan ayyukan shida suna bin tsarin sa ido iri ɗaya: - OmniRoute yana girka su a ƙarƙashin `DATA_DIR/services/{name}/` (a ware daga `package.json` na OmniRoute) -- OmniRoute yana ƙaddamar da su kuma yana sa ido a kansu a matsayin matakai na reshe -- OmniRoute yana saka maɓallin API na wucin gadi a cikin muhallin matakin reshen kuma yana sabunta shi ba tare da katse aiki ba (inda hakan ya dace) -- Duk hanyoyin gudanarwa (`/api/services/*`) **LOCAL_ONLY** ne — ana iya samun damar su daga loopback kawai (ƙa'ida mai tsauri #17) +- OmniRoute yana ƙaddamar da su a matsayin child processes kuma yana sa ido a kansu +- OmniRoute yana shigar da maɓallin API na wucin gadi cikin environment na child process kuma yana sabunta shi ba tare da katse aiki ba (inda hakan ya dace) +- Dukkan hanyoyin gudanarwa (`/api/services/*`) **LOCAL_ONLY** ne — ana iya samun damar su daga loopback kawai (ƙa'ida mai tsauri #17) ### Muhimman shawarwari (daga tsarin ƙira) -| Shawara | Ƙima | -| ------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| Samun damar dashboard zuwa UI na asali na 9Router | Reverse proxy a `/dashboard/providers/services/9router/embed/*` | -| Hanyar girkawa | `npm install {package}` ta hanyar `execFile` (babu shell interpolation) | -| Yanayin amfani | An yi rajistar mai samar da sabis a matsayin `9router/{sub}/{model}` a cikin injin tura zirga-zirga | -| Gudanar da maɓallin API | OmniRoute yana ƙirƙira, yana ɓoye shi lokacin ajiya (AES-256-GCM), sannan yana saka shi ta env | -| Wurin dashboard | `/dashboard/providers/services` (shafuka uku) | -| Farawa ta atomatik | Maɓallin kunnawa/kashewa ga kowane aiki, a kashe ta tsohuwa | +| Shawara | Ƙima | +| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| Samun damar dashboard zuwa UI na asali na 9Router | Reverse proxy a `/dashboard/providers/services/9router/embed/*` | +| Hanyar girkawa | `npm install {package}` ta hanyar `execFile` (babu shell interpolation) | +| Yanayin amfani | An yi rajistar mai bayarwa a matsayin `9router/{sub}/{model}` cikin routing engine | +| Gudanar da maɓallin API | OmniRoute yana ƙirƙira shi, yana ɓoye shi yayin ajiya (AES-256-GCM), sannan yana shigar da shi ta env | +| Wurin dashboard | `/dashboard/providers/services` (tabs uku) | +| Farawa ta atomatik | Toggle ga kowane aiki, tsohon saiti OFF | --- @@ -67,10 +68,10 @@ Dukkan biyar suna bin tsarin sa ido iri ɗaya: ┌────────────────────────────────────────────────────────────────────┐ │ Mataki na 1 — UI │ │ /dashboard/providers/services (shafuka: CLIProxyAPI | 9Router | Mux)│ -│ Rajistan ayyuka kai tsaye (SSE), Farawa/Tsayarwa/Sake farawa/Sabuntawa, Saituna, Shigarwa│ +│ Rajistan ayyuka kai tsaye (SSE), Farawa/Tsaya/Sake farawa/Sabuntawa, Saituna, Girka│ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Tsarin shafi + karkatar da shafuka ta ?tab=│ +│ ├── page.tsx Tsarin tushe + kewayawar shafi ta ?tab=│ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -87,73 +88,73 @@ Dukkan biyar suna bin tsarin sa ido iri ɗaya: │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (wakilin HTTP na baya + WebSocket → tushen 9Router) │ +│ (wakilin HTTP + WebSocket na baya → 9Router upstream) │ │ │ │ Ƙofa: LOCAL_ONLY_API_PREFIXES ya haɗa da "/api/services/" da │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ - │ kiraye-kiraye cikin tsari + │ kira a cikin tsari ┌──────────────────────▼─────────────────────────────────────────────┐ │ Mataki na 3 — ServiceSupervisor (src/lib/services/) │ │ │ -│ ServiceSupervisor.ts Mai kula na gama-gari (child_process.spawn)│ -│ ├── shigarwa: execFile('npm', ['install', pkg, '--prefix']) │ +│ ServiceSupervisor.ts Babban mai kulawa (child_process.spawn) │ +│ ├── girkawa: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── farawa: spawn(node, [entrypoint], {env, cwd}) │ │ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── tashar: 20130 don 9Router (ana iya saitawa) │ -│ ├── rajista: ma'ajiyar madauwari ta stdio 5 MB → al'amuran SSE│ -│ ├── lafiya: HTTP GET /health kowane sakan 2–5, farfaɗowa a lokacin buƙata│ -│ └── zagayowar aiki: SIGTERM sakan 15 → SIGKILL │ +│ ├── tashar jirga: 20130 don 9Router (ana iya saitawa) │ +│ ├── rajista: ma'ajiyar zobe ta stdio mai 5 MB → abubuwan SSE │ +│ ├── lafiya: HTTP GET /health kowane s 2–5, farfaɗowa idan an buƙata│ +│ └── zagayen rayuwa: SIGTERM s 15 → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts Yana ƙaddamar da duk SERVICES[] a farkon tsari │ +│ bootstrap.ts Yana ƙaddamar da duk SERVICES[] lokacin fara tsari│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts GET /v1/models na lokaci-lokaci → teburin service_models│ -│ ringBuffer.ts Ma'ajiyar rajista mai madauwari (5 MB ga kowace sabis)│ -│ healthCheck.ts Binciken lafiyar HTTP na lokaci-lokaci │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (adaftocin mai-shigarwa) │ +│ ringBuffer.ts Ma'ajiyar rajista mai zagaye (5 MB ga kowace sabis)│ +│ healthCheck.ts Binciken lafiyar HTTP ta hanyar zaɓe │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (adaftocin girkawa) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP mai jituwa da OpenAI (loopback) + │ HTTP mai dacewa da OpenAI (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Mataki na 4 — Mai bayarwa / Karkatarwa │ +│ Mataki na 4 — Mai bayarwa / Kewayawa │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Yana sake neman tashar da maɓallin API ga kowace buƙata (babu caching).│ -│ Yana cire prefix na "9router/" daga id ɗin model kafin wakiltawa.│ -│ Yana mayar da 503 service_not_running idan mai kula ba ya cikin "running".│ +│ Yana sake nemo tashar jirga da maɓallin API ga kowane buƙata (ba tare da caching ba).│ +│ Yana cire prefix ɗin "9router/" daga id ɗin model kafin wakiltawa.│ +│ Yana mayar da 503 service_not_running idan supervisor ba ya cikin "running".│ │ │ │ src/shared/constants/providers.ts │ -│ Shigarwa don "9router": isEmbeddedService: true │ +│ Shigarwa don "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ Ana adana model a matsayin "9router/{sub}/{model}" (tare da prefix).│ │ modelSync.ts yana daidaita su kowane minti 5. │ │ │ -│ Ana sarrafa Mux ne ta fuskar zagayowar aiki KAWAI (Matakai 1-3) — │ -│ daemon ne na tsara ayyukan agent, ba wakilin LLM ba, saboda haka │ -│ ba shi da shigarwar executor/mai bayarwa ta Mataki na 4 kuma ba a │ -│ taɓa amfani da shi a matsayin makasudin karkatarwa. │ +│ Ana sarrafa zagayen rayuwar Mux KAWAI (Matakai na 1-3) — daemon ne na│ +│ tsara ayyukan agent, ba wakilin LLM ba, saboda haka ba shi da shigarwar│ +│ executor/mai bayarwa ta Mataki na 4 kuma ba ya taɓa zama makasudin kewayawa.│ └────────────────────────────────────────────────────────────────────┘ ``` ### Muhimman fayilolin tushe -| Fayil | Aiki | -| ------------------------------------------- | ---------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Babban aji: zagayowar rayuwa, kullewa, lafiya, ring buffer | -| `src/lib/services/bootstrap.ts` | Rijista da farawa ta atomatik a matakin process | -| `src/lib/services/registry.ts` | Taswirar singleton `tool → supervisor` | -| `src/lib/services/apiKey.ts` | Samar da maɓalli, ɓoye bayanai da AES-256-GCM yayin ajiya | -| `src/lib/services/modelSync.ts` | Daidaita model lokaci-lokaci (minti 5) + lokacin buƙata | -| `src/lib/services/ringBuffer.ts` | Madauwari buffer na log mai 5 MB tare da biyan SSE | -| `src/lib/services/healthCheck.ts` | Gwajin lafiyar HTTP (ana iya saita tazarar lokaci) | -| `src/lib/services/installers/ninerouter.ts` | npm install/update/uninstall don 9Router | -| `src/lib/services/installers/cliproxy.ts` | npm install/update/uninstall don CLIProxyAPI | -| `src/lib/services/installers/mux.ts` | npm install/update/uninstall don Mux | -| `src/app/api/services/9router/_lib.ts` | Mataimakin `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Wurin samun log na SSE na bai ɗaya | -| `open-sse/executors/ninerouter.ts` | Mai aiwatar da mai samar da sabis (Layer 4) | +| Fayil | Aiki | +| ------------------------------------------- | ---------------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Babban aji: zagayen rayuwa, kulle, lafiyar sabis, ma'ajiyar zobe | +| `src/lib/services/bootstrap.ts` | Rijista da farawa ta atomatik a matakin tsari | +| `src/lib/services/registry.ts` | Taswirar singleton `tool → supervisor` | +| `src/lib/services/apiKey.ts` | Ƙirƙirar maɓalli, ɓoyewar AES-256-GCM yayin ajiya | +| `src/lib/services/modelSync.ts` | Daidaita samfura lokaci-lokaci (minti 5) + bisa buƙata | +| `src/lib/services/ringBuffer.ts` | Ma'ajiyar log mai zagaye ta MB 5 tare da rajistar SSE | +| `src/lib/services/healthCheck.ts` | Binciken lafiyar HTTP (ana iya saita tazarar lokaci) | +| `src/lib/services/installers/ninerouter.ts` | npm girkawa/sabuntawa/cirewa don 9Router | +| `src/lib/services/installers/cliproxy.ts` | npm girkawa/sabuntawa/cirewa don CLIProxyAPI | +| `src/lib/services/installers/mux.ts` | npm girkawa/sabuntawa/cirewa don Mux | +| `src/lib/services/installers/openwa.ts` | npm girkawa/sabuntawa/cirewa don open-wa | +| `src/app/api/services/9router/_lib.ts` | Mataimakin `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | Wurin samun log na SSE na bai ɗaya | +| `open-sse/executors/ninerouter.ts` | Mai aiwatar da mai samarwa (Mataki na 4) | --- @@ -207,12 +208,12 @@ yana hana yanayin tseren aiki idan, misali, farawa ta atomatik da maɓallin UI s --- -## 4. Bayanin API +## 4. Manunin API -Duk hanyoyin da ke ƙarƙashin `/api/services/` **LOCAL_ONLY** ne (loopback kawai, ƙa'ida mai tsauri #17). -Buƙatun da ba na loopback ba suna karɓar `403 LOCAL_ONLY` ba tare da la'akari da auth token ba. +Duk hanyoyin da ke ƙarƙashin `/api/services/` **LOCAL_ONLY** ne (loopback kaɗai, ƙa'ida mai tsauri #17). +Buƙatun da ba na loopback ba suna karɓar `403 LOCAL_ONLY` ba tare da la'akari da token ɗin tantancewa ba. -### 4.1 Ƙarshen-hanyoyin 9Router (hanyoyi 11) +### 4.1 Wuraren ƙarshen 9Router (hanyoyi 11) #### `POST /api/services/9router/install` @@ -227,16 +228,16 @@ Shigar da 9Router daga npm. Yana ƙirƙirar `DATA_DIR/services/9router/` tare da | Fili | Nau'i | Tsoho | Bayani | | --------- | -------- | ---------- | ----------------------------------------- | -| `version` | `string` | `"latest"` | alamar sigar npm ko semver da za a shigar | +| `version` | `string` | `"latest"` | Alamar sigar npm ko semver da za a shigar | **Amsoshi:** -| Matsayi | Bayani | -| ------- | ------------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Jikin buƙata ba daidai ba (gazawar tantancewar Zod) | -| `409` | Ana kan shigarwa (an riƙe kulle) | -| `500` | npm install ya gaza — duba `message` don saƙon kuskure mai sauƙin fahimta | +| Matsayi | Bayani | +| ------- | --------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Jikin buƙata marar inganci (gazawar tantancewar Zod) | +| `409` | Ana kan shigarwa tuni (ana riƙe da kulle) | +| `500` | Shigarwar npm ta gaza — duba `message` don saƙon kuskure mai sauƙin fahimta | **Bayanan kula:** Yana amfani da `execFile('npm', [...])` — babu shell, babu interpolation (ƙa'ida mai tsauri #13). Ana nuna kurakuran EACCES a matsayin saƙonni masu sauƙin fahimta. @@ -245,8 +246,8 @@ Ana nuna kurakuran EACCES a matsayin saƙonni masu sauƙin fahimta. #### `POST /api/services/9router/start` -Fara 9Router. Yana yi wa supervisor rajista idan ba a riga an yi masa rajista ba, sannan ya kira -`supervisor.start()`. Yana da idempotent idan yana gudana tuni. +Fara 9Router. Yana yi wa supervisor rajista idan ba a riga an yi rajistarsa ba, sannan ya kira +`supervisor.start()`. Idempotent ne idan yana gudana tuni. **Jikin buƙata:** babu @@ -254,9 +255,9 @@ Fara 9Router. Yana yi wa supervisor rajista idan ba a riga an yi masa rajista ba | Matsayi | Bayani | | ------- | ----------------------------------------------------- | -| `200` | Abin `ServiceStatus` (duba schema a ƙasa) | +| `200` | Abun `ServiceStatus` (duba schema da ke ƙasa) | | `409` | Ba a shigar da 9Router ba (`status: "not_installed"`) | -| `503` | Farawa ya gaza (kuskuren tsari — duba `lastError`) | +| `503` | Farawa ta gaza (kuskuren process — duba `lastError`) | **Schema na ServiceStatus:** @@ -276,35 +277,35 @@ Fara 9Router. Yana yi wa supervisor rajista idan ba a riga an yi masa rajista ba #### `POST /api/services/9router/stop` -Tsayar da 9Router cikin tsari. Yana aika SIGTERM, ya jira 15 s, sannan ya aika SIGKILL idan har yanzu yana aiki. -Yana da idempotent idan an riga an tsayar da shi. +Dakatar da 9Router cikin tsari. Yana aika SIGTERM, ya jira 15 s, sannan ya aika SIGKILL idan har yanzu yana aiki. +Idempotent ne idan an riga an dakatar da shi. **Jikin buƙata:** babu **Amsoshi:** -| Matsayi | Bayani | -| ------- | ---------------------------------- | -| `200` | `ServiceStatus` (state: "stopped") | -| `503` | Tsayarwa ta gaza ba zato | +| Matsayi | Bayani | +| ------- | -------------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Dakatarwar ta gaza ba zato ba tsammani | --- #### `POST /api/services/9router/restart` -Daidai yake da `stop()` sannan `start()` a ƙarƙashin kullen aiki. +Daidai yake da `stop()` sannan `start()` a ƙarƙashin makullin aiki. **Jikin buƙata:** babu -**Amsoshi:** iri ɗaya da `start` (yana dawo da `ServiceStatus` na ƙarshe). +**Amsoshi:** iri ɗaya da `start` (yana mayar da `ServiceStatus` na ƙarshe). --- #### `POST /api/services/9router/update` -Yana sabunta 9Router zuwa sabuwar sigar npm. Idan sabis ɗin yana gudana, za a fara -tsayar da shi, a gudanar da npm install (ana shigar da sabuwar sigar a wuri ɗaya), sannan a -sake fara sabis ɗin. +Yana sabunta 9Router zuwa sabuwar sigar npm. Idan service ɗin yana gudana, za a fara +dakatar da shi, a gudanar da shigarwar npm (tare da shigar da sabuwar sigar a wuri ɗaya), sannan a +sake fara service ɗin. **Jikin buƙata** (duk na zaɓi ne): @@ -317,16 +318,16 @@ sake fara sabis ɗin. | Matsayi | Bayani | | ------- | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | Jiki ba daidai ba | +| `400` | Jiki marar inganci | | `500` | Sabuntawar npm ta gaza | --- #### `POST /api/services/9router/rotate-key` -Yana samar da sabon maɓallin API na 9Router, yana ɓoye shi yayin ajiya, sannan yana sake kunna sabis ɗin -(idan yana aiki) domin ya ɗauki sabon maɓallin daga muhallinsa. Ana soke tsohon maɓallin -nan take. +Yana ƙirƙirar sabon maɓallin API na 9Router, ya ɓoye shi lokacin ajiya, sannan ya sake fara service ɗin +(idan yana gudana) domin ya ɗauki sabon maɓallin daga environment ɗinsa. Ana soke +tsohon maɓallin nan take. **Jikin buƙata:** babu @@ -335,16 +336,16 @@ nan take. | Matsayi | Bayani | | ------- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Juyawar maɓalli ta gaza | +| `500` | Sauya maɓallin ya gaza | -**Tsaro:** Ba a taɓa dawo da sabon maɓallin cikin amsar ba (babu fallasar bayanan shiga). +**Tsaro:** Ba a taɓa mayar da sabon maɓallin cikin amsa ba (babu fallasa bayanan sirri). Ana adana shi a ɓoye (AES-256-GCM) a cikin teburin `version_manager`. --- #### `GET /api/services/9router/status` -Yana dawo da haɗaɗɗen matsayi na kai-tsaye + DB, gami da metadata na sigar da samfotin maɓallin API. +Yana mayar da haɗaɗɗen matsayin kai-tsaye + DB, gami da metadata na siga da samfotin maɓallin API. **Amsoshi:** @@ -377,8 +378,8 @@ Yana dawo da haɗaɗɗen matsayi na kai-tsaye + DB, gami da metadata na sigar da #### `POST /api/services/9router/auto-start` -Kunna ko kashe tutar farawa ta atomatik. Lokacin da `enabled: true`, sabis ɗin yana farawa ta atomatik -a lokaci na gaba da OmniRoute ya tashi (idan an shigar da sabis ɗin). +Kunna ko kashe tutar farawa ta atomatik. Lokacin da `enabled: true`, service ɗin yana farawa ta atomatik +a karo na gaba da OmniRoute ya fara aiki (idan an shigar da service ɗin). **Jikin buƙata:** @@ -391,28 +392,28 @@ a lokaci na gaba da OmniRoute ya tashi (idan an shigar da sabis ɗin). | Matsayi | Bayani | | ------- | --------------------- | | `200` | `{ autoStart: true }` | -| `400` | Jiki mara inganci | +| `400` | Jiki marar inganci | --- #### `GET /api/services/9router/logs` -Rafin SSE na log na kai-tsaye daga ring buffer na stdout/stderr na 9Router. +SSE stream na logs kai-tsaye daga ring buffer na stdout/stderr na 9Router. -**Sigogin query:** +**Ma'aunan query:** -| Siga | Nau'i | Na asali | Bayani | -| -------- | --------- | -------- | ------------------------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Yawan layukan tarihi da za a fara aikawa (mafi yawa 1000) | -| `filter` | `string` | babu | Tacewar ƙaramin tsagi ba tare da la'akari da girman harafi ba (babu regex — amintacce daga ReDoS) | +| Ma'auni | Nau'i | Tsoho | Bayani | +| -------- | --------- | ----- | ------------------------------------------------------------------------------------------ | +| `tail` | `integer` | 200 | Yawan layukan tarihi da za a fara aikawa (iyakar 1000) | +| `filter` | `string` | babu | Tace substring ba tare da la'akari da girman harafi ba (babu regex — amintacce daga ReDoS) | **Abubuwan SSE:** -| Abu | Bayanai | Bayani | -| ----------- | ----------- | ------------------------- | -| `snapshot` | `LogLine[]` | Ƙarshen tarihin farko | -| `log` | `LogLine` | Layin log na kai-tsaye | -| `heartbeat` | `{}` | Riƙe-haɗi kowane sakan 15 | +| Event | Bayanai | Bayani | +| ----------- | ----------- | ----------------------- | +| `snapshot` | `LogLine[]` | Tail na tarihi na farko | +| `log` | `LogLine` | Layin log kai-tsaye | +| `heartbeat` | `{}` | Keep-alive kowane 15 s | **Schema na LogLine:** @@ -426,51 +427,51 @@ Rafin SSE na log na kai-tsaye daga ring buffer na stdout/stderr na 9Router. **Amsoshi:** -| Matsayi | Bayani | -| ------- | ----------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | Sigar `filter` ta yi tsawo sosai (> haruffa 200) | -| `404` | Ba a sami sabis ba (ba a yi wa supervisor rajista ba) | +| Matsayi | Bayani | +| ------- | --------------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | Ma'aunin `filter` ya yi tsawo sosai (> haruffa 200) | +| `404` | Ba a sami sabis ɗin ba (ba a yi wa supervisor rajista ba) | --- ### 4.2 Endpoints na CLIProxyAPI (hanyoyi 10) CLIProxyAPI yana da tsarin endpoint iri ɗaya da 9Router ban da `rotate-key`, tare da -`accounts`, `provider-expose` da `auto-restart-adopted`. Yanzu yana karɓar -keɓaɓɓen maɓallin API na data-plane da ake saka masa lokacin spawn (`needsApiKey: true` a cikin -`bootstrap.ts`, wanda ake amfani da shi wajen daidaita model); `status` yana ƙunshe da filaye kaɗan. +ƙarin `accounts`, `provider-expose` da `auto-restart-adopted`. Yanzu yana karɓar +maɓallin API na data-plane na musamman da ake shigarwa yayin spawn (`needsApiKey: true` a cikin +`bootstrap.ts`, ana amfani da shi don daidaita model); `status` yana ƙunshe da filaye kaɗan. | Hanya | Path | Bayani | | ------ | ----------------------------------- | --------------------------------------------- | | `POST` | `/api/services/cliproxy/install` | Shigar da CLIProxyAPI daga npm | | `POST` | `/api/services/cliproxy/start` | Fara CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Dakatar da CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Tsayar da CLIProxyAPI | | `POST` | `/api/services/cliproxy/restart` | Sake kunna CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Sabunta zuwa sabuwar siga | +| `POST` | `/api/services/cliproxy/update` | Sabunta zuwa sabon sigar | | `GET` | `/api/services/cliproxy/status` | Matsayin kai-tsaye + DB (babu `apiKeyMasked`) | | `POST` | `/api/services/cliproxy/auto-start` | Kunna ko kashe farawa ta atomatik | -Endpoint na gama-gari `GET /api/services/{name}/logs` (duba §4.1) yana aiki ga dukkan -sabis huɗun ta amfani da dynamic segment na `[name]`. +Endpoint ɗin `GET /api/services/{name}/logs` da ake rabawa (duba §4.1) yana aiki ga dukkan +sabis huɗun ta amfani da ɓangaren dynamic na `[name]`. --- ### 4.3 Endpoints na Mux (hanyoyi 8) -Mux yana da tsarin endpoint iri ɗaya da CLIProxyAPI — babu hanyar `rotate-key` a cikin API -(yana samar da bearer token ta hanya ɗaya da ta 9Router ta hanyar -`getOrCreateApiKey("mux")`, sannan a saka shi ta env var na `MUX_SERVER_AUTH_TOKEN`, amma -har yanzu babu keɓaɓɓen endpoint na juyawa). Ana sarrafa Mux ne ta fuskar lifecycle kawai: sabanin -9Router, ba shi da executor na Layer 4 kuma ba a taɓa yi masa rajista a matsayin provider na routing ba. +Mux yana da tsarin endpoint iri ɗaya da CLIProxyAPI — babu hanyar `rotate-key` a saman +API (ana samar da bearer token ta hanya iri ɗaya da ta 9Router ta hanyar +`getOrCreateApiKey("mux")` kuma ana shigar da shi ta env var na `MUX_SERVER_AUTH_TOKEN`, amma +har yanzu babu keɓaɓɓen endpoint na sauya maɓalli). Ana sarrafa Mux ne kawai ta fuskar lifecycle: sabanin +9Router, ba shi da Layer 4 executor kuma ba a taɓa yi masa rajista a matsayin routing provider ba. | Hanya | Path | Bayani | | ------ | ------------------------------ | ------------------------------------ | | `POST` | `/api/services/mux/install` | Shigar da Mux daga npm (`npm i mux`) | | `POST` | `/api/services/mux/start` | Fara Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Dakatar da Mux | +| `POST` | `/api/services/mux/stop` | Tsayar da Mux | | `POST` | `/api/services/mux/restart` | Sake kunna Mux | -| `POST` | `/api/services/mux/update` | Sabunta zuwa sabuwar sigar npm | +| `POST` | `/api/services/mux/update` | Sabunta zuwa sabon sigar npm | | `GET` | `/api/services/mux/status` | Matsayin kai-tsaye + DB | | `POST` | `/api/services/mux/auto-start` | Kunna ko kashe farawa ta atomatik | @@ -478,58 +479,93 @@ har yanzu babu keɓaɓɓen endpoint na juyawa). Ana sarrafa Mux ne ta fuskar lif ### 4.4 Endpoints na Bifrost (hanyoyi 8) -Bifrost backend ne na relay na AI-gateway da aka rubuta da Go (`@maximhq/bifrost`). Yana amfani da tsarin -endpoint iri ɗaya da CLIProxyAPI (babu `rotate-key` — Bifrost yana sarrafa nasa maɓallan provider -a cikin `config.json` ƙarƙashin `-app-dir`). +Bifrost backend ne na relay na AI-gateway wanda aka gina da Go (`@maximhq/bifrost`). Yana amfani da +tsarin endpoint iri ɗaya da CLIProxyAPI (babu `rotate-key` — Bifrost yana sarrafa nasa maɓallan +provider a cikin `config.json` ƙarƙashin `-app-dir` nasa). -| Hanya | Path | Bayani | -| ------ | ---------------------------------- | ----------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Shigar da Bifrost daga npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Fara Bifrost a kan port 8080 (tsoho) | -| `POST` | `/api/services/bifrost/stop` | Dakatar da Bifrost | -| `POST` | `/api/services/bifrost/restart` | Sake kunna Bifrost | -| `POST` | `/api/services/bifrost/update` | Sabunta zuwa sabon siga | -| `GET` | `/api/services/bifrost/status` | Matsayin kai-tsaye + DB | -| `POST` | `/api/services/bifrost/auto-start` | Kunna ko kashe farawa ta atomatik | -| `GET` | `/api/services/bifrost/logs` | Ƙarshen log na SSE (ta hanyar shared `[name]/logs` dynamic route) | +| Hanya | Path | Bayani | +| ------ | ---------------------------------- | --------------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Shigar da Bifrost daga npm (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Fara Bifrost a port 8080 (na tsohuwa) | +| `POST` | `/api/services/bifrost/stop` | Tsayar da Bifrost | +| `POST` | `/api/services/bifrost/restart` | Sake kunna Bifrost | +| `POST` | `/api/services/bifrost/update` | Sabunta zuwa sabon sigar | +| `GET` | `/api/services/bifrost/status` | Matsayin kai-tsaye + DB | +| `POST` | `/api/services/bifrost/auto-start` | Kunna ko kashe farawa ta atomatik | +| `GET` | `/api/services/bifrost/logs` | Ƙarshen log na SSE (ta hanyar dynamic route na `[name]/logs` da ake rabawa) | -**Haɗa routing:** Lokacin da ba a saita `BIFROST_BASE_URL` ba kuma supervised Bifrost -instance ɗin yana aiki, `getBifrostRoutingConfig()` (a cikin `routingBackend.ts`) yana amfani da -`http://127.0.0.1:{port}` kai tsaye a matsayin relay base URL. Saitin env na `BIFROST_BASE_URL` -a bayyane koyaushe yana da fifiko. +**Haɗin routing:** Lokacin da ba a saita `BIFROST_BASE_URL` ba kuma supervised instance na Bifrost +yana aiki, `getBifrostRoutingConfig()` (a cikin `routingBackend.ts`) yana amfani da +`http://127.0.0.1:{port}` ta atomatik a matsayin base URL na relay. Env na `BIFROST_BASE_URL` da aka +saita kai tsaye koyaushe yana da fifiko. --- -### 4.5 Dario endpoints (12 routes) +### 4.5 Endpoints na Dario (hanyoyi 12) -Tsarin lifecycle iri ɗaya ne da na sauran services (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), tare da OAuth -control plane mai kariyar token a ƙarƙashin `admin/`: `admin/accounts`, `admin/import-from-omniroute`, +Tsarin lifecycle iri ɗaya ne da na sauran sabis (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`) tare da control plane na OAuth +mai buƙatar token ƙarƙashin `admin/`: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (duk suna bayan `DARIO_ADMIN_TOKEN`). -### 4.6 Reverse proxy (9Router dashboard embed) +### 4.6 Endpoints na open-wa (hanyoyi 7) + +open-wa (`@open-wa/wa-automate`) yana tafiyar da headless Chromium instance (ta hanyar +Puppeteer) domin sarrafa WhatsApp Web ta atomatik. Yana amfani da tsarin endpoint iri ɗaya da Mux (har yanzu babu +hanyar `rotate-key`). Ana sarrafa shi ne kawai ta fuskar lifecycle — ba routing target ba ne, +kuma ba shi da shigarwar Layer 4 executor/provider. + +| Hanya | Tafarki | Bayani | +| ------ | --------------------------------- | ------------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Sanya open-wa daga npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Fara open-wa a tashar 8323 (tsoho) | +| `POST` | `/api/services/openwa/stop` | Tsayar da open-wa | +| `POST` | `/api/services/openwa/restart` | Sake kunna open-wa | +| `POST` | `/api/services/openwa/update` | Sabunta zuwa sabon sigar | +| `GET` | `/api/services/openwa/status` | Matsayin kai-tsaye + DB | +| `POST` | `/api/services/openwa/auto-start` | Kunna ko kashe farawa ta atomatik | +| `GET` | `/api/services/openwa/logs` | Ƙarshen log na SSE (ta hanyar haɗaɗɗiyar hanyar dinamik ta `[name]/logs`) | + +**Maɓallin API:** ana saka shi a matsayin `WA_KEY` — tsarin env na gama-gari na open-wa +mai gabatarwar `WA_*` yana danganta shi da zaɓin CLI na `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, an tabbatar da shi da kunshin 4.76.0 da aka +sanya). Ana ƙara gabatarwar `ow_` lokacin da `generateServiceApiKey()` ya samar da shi. open-wa +yana sake karanta maɓallin daga kanun HTTP na `key`/`api_key` (ba `Authorization: +Bearer` ba); an keɓe `/api-docs*` kai tsaye daga binciken +(`setupAuthenticationLayer` a cikin `dist/cli/server.js`), don haka gwajin lafiya +ba ya buƙatar kanun tantancewa. + +**Haɗawa:** open-wa ba na hukuma ba ne kuma ba shi da alaƙa da WhatsApp — lambar da +aka haɗa tana cikin haɗarin haramtawa sakamakon tsarin WhatsApp na gano aiki da kai. +A farkon farawa, ana buga lambar QR ta haɗawa zuwa stdout kuma ana nuna ta ta hanyar +rukunin Logs/rafi na SSE da ke akwai — har yanzu babu keɓantacciyar hanyar ƙarshen hoton QR +a cikin wannan haɗawar. + +--- + +### 4.7 Wakilin baya (sakaya dashboard na 9Router) -Dashboard ɗin yana saka 9Router web UI a cikin iframe ta hanyar internal reverse -proxy a: +Dashboard ɗin yana sakaya UI na yanar gizo na 9Router a cikin iframe ta hanyar wakilin baya +na cikin gida a: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] ``` -Wannan proxy: +Wannan wakilin: -- Yana tura request ɗin zuwa `http://127.0.0.1:{port}/{path}` (loopback kawai) -- Yana cire headers na `cookie` da `authorization` masu shigowa (babu zubar da session na OmniRoute) -- Yana saka `Authorization: Bearer {apiKey}` don tabbatar da amincin 9Router -- Yana cire `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` daga response -- Yana sake rubuta HTML responses don saka `` da daidaita absolute paths (`/foo` → `/dashboard/.../embed/foo`) +- Yana tura buƙatar zuwa `http://127.0.0.1:{port}/{path}` (loopback kawai) +- Yana cire kanun `cookie` da `authorization` masu shigowa (babu fallasar zaman OmniRoute) +- Yana saka `Authorization: Bearer {apiKey}` don tantancewar 9Router +- Yana cire `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` daga amsar +- Yana sake rubuta amsoshin HTML don saka `` da daidaita cikakkun tafarkuna (`/foo` → `/dashboard/.../embed/foo`) -WebSocket upgrades na embedded dashboard ana sarrafa su ne ta companion server a wani -dedicated port (duba `src/lib/services/embedWsProxy.ts`). +Haɓaka WebSocket don dashboard ɗin da aka sakaya ana sarrafa su ta wata sabar abokiyar aiki a +keɓantacciyar tasha (duba `src/lib/services/embedWsProxy.ts`). -**Tsaro:** An rarraba embed proxy routes ɗin a ƙarƙashin `LOCAL_ONLY_API_PREFIXES` -kuma ana iya isa gare su daga loopback kawai. Mahari da ya samu JWT ta hanyar -Cloudflare/Ngrok tunnel ba zai iya yin proxy zuwa embedded services ba. +**Tsaro:** An rarraba hanyoyin wakilin sakaya a ƙarƙashin `LOCAL_ONLY_API_PREFIXES` +kuma ana iya isa gare su daga loopback kawai. Maharin da ya sami JWT ta hanyar +ramin Cloudflare/Ngrok ba zai iya yin wakilci zuwa sabis ɗin da aka sakaya ba. --- diff --git a/docs/i18n/ha/docs/frameworks/MEMORY.md b/docs/i18n/ha/docs/frameworks/MEMORY.md index 382c72c65315..60a2a52c57d6 100644 --- a/docs/i18n/ha/docs/frameworks/MEMORY.md +++ b/docs/i18n/ha/docs/frameworks/MEMORY.md @@ -166,37 +166,39 @@ Teburin `memory_vec_meta` (migration `083_memory_vec.sql`) yana adana: - `last_reset_at` — timestamp na cikakken reset na ƙarshe. - `vec_loaded` — alamar 0/1 da ke nuna ko sqlite-vec ya loda cikin nasara. -## Tsawaita saituna +## Faɗaɗa saituna -Akwai filayen embedding da vector guda tara a cikin `MemorySettingsExtended` a -`src/shared/schemas/memory.ts`, waɗanda ake adana su ta hanyar `src/lib/db/settings.ts`: +Ana samun filayen embedding da vector guda tara a cikin `MemorySettingsExtended` a +`src/shared/schemas/memory.ts`, kuma ana adana su ta hanyar `src/lib/db/settings.ts`: -| Fili | Nau'i | Tsoho | Bayani | -| ------------------------ | -------------------------------------------------- | -------- | ------------------------------------------------------------ | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Tushen embedding da za a yi amfani da shi | -| `embeddingProviderModel` | `string \| null` | `null` | Mai bayarwa/samfuri a tsarin `provider/model` | -| `customBaseUrl` | `string \| null` | `null` | URL na asalin endpoint mai dacewa da OpenAI don Memory kawai | -| `customModelId` | `string \| null` | `null` | ID na samfurin da ake aikawa zuwa endpoint na musamman | -| `transformersEnabled` | `boolean` | `false` | Amincewa da amfani da Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Amincewa da samfurin gida na static potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Kunna matakin sake jera sakamako (yana ƙara +200-500ms/req) | -| `rerankProviderModel` | `string \| null` | `null` | Mai bayarwa/samfurin sake jeri a tsarin `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend na vector da za a yi amfani da shi | +| Fili | Nau'i | Tsoho | Bayani | +| ------------------------ | -------------------------------------------------- | -------- | ------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Tushen embedding da za a yi amfani da shi | +| `embeddingProviderModel` | `string \| null` | `null` | Mai bayarwa/samfuri a tsarin `provider/model` | +| `customBaseUrl` | `string \| null` | `null` | URL na asalin endpoint mai dacewa da OpenAI don Memory kawai | +| `customModelId` | `string \| null` | `null` | ID na samfurin da ake aika wa endpoint na musamman | +| `transformersEnabled` | `boolean` | `false` | Zaɓin shiga don Transformers.js (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Zaɓin shiga don samfurin gida na static potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Kunna matakin sake jerantawa (yana ƙara +200-500ms/req) | +| `rerankProviderModel` | `string \| null` | `null` | Mai bayarwa/samfurin sake jerantawa a tsarin `provider/model` | -Ana samar da damar amfani da waɗannan ta hanyar `GET /PUT /api/settings/memory` (schema `MemorySettingsExtendedSchema`). +Ana tantance `rerankProviderModel` ta `POST /v1/rerank` (wanda ake kira ta loopback), saboda haka yana karɓar duk abin da wannan route ɗin ke karɓa: samfurin sake jerantawa na cloud da aka zaɓa (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) ko node na mai bayarwa mai dacewa da OpenAI a matsayin `/` (misali `skilled-mini/bge-reranker-v2-m3` don akwatin TEI/Infinity). Node na loopback koyaushe sun cancanta; node da ke kan wani host (LAN, Tailscale) yana kuma buƙatar feature flag na `RERANK_REMOTE_PROVIDER_NODES` kuma dole ne ya cika ƙa'idar URL mai fita ta mai bayarwa — duba [Feature Flags](../reference/FEATURE_FLAGS.md). Mai zaɓin dashboard yana jera zaɓaɓɓun masu bayarwa tare da node na gida; ana iya saita kowace ingantacciyar ƙimar `provider/model` kai tsaye ta `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend na vector da za a yi amfani da shi | + +Ana samar da waɗannan ta `GET /PUT /api/settings/memory` (schema `MemorySettingsExtendedSchema`). Ga tushen `remote`, Memory kuma yana karɓar saitunan `customBaseUrl` da -`customModelId` na zaɓi. Tare suna zaɓar endpoint na `/embeddings` mai dacewa -da OpenAI da kuma samfurinsa ba tare da canza rajistar embedding ta gaba ɗaya ba. Ana daidaita -endpoint ɗin kafin amfani, sannan manufar URL mai fita ta mai bayarwa tana bincikarsa: ana -buƙatar HTTP(S), ana ƙin bayanan shiga da aka saka a ciki da kuma query strings, sannan -adiresoshin cloud-metadata suna ci gaba da kasancewa a toshe. Ƙimomi marasa komai suna barin -mai bayarwar rajista da aka zaɓa yadda yake. Ana tsabtace kurakuran da ake mayarwa zuwa -dashboard, kuma ba a taɓa rubuta bayanan shiga na endpoint cikin log ba. - -> **TODO (D20):** Ba a aiwatar da scope na `global` (raba memories a tsakanin dukkan API keys) ba -> a wannan sakin. Yana buƙatar sauye-sauyen schema da hanyar retrieval ta gaba ɗaya. -> A bibiyi wannan daban. +`customModelId` na zaɓi. Tare, suna zaɓar endpoint na `/embeddings` mai dacewa da +OpenAI da kuma samfurinsa ba tare da canza rajistar embedding ta duniya ba. Ana +daidaita endpoint kafin amfani sannan a duba shi da ƙa'idar URL mai fita ta mai bayarwa: +ana buƙatar HTTP(S), ana ƙin bayanan shaidar shiga da query strings da aka saka a ciki, +kuma adireshin cloud-metadata suna ci gaba da kasancewa a katange. Ƙimomin da babu +komai a cikinsu suna kiyaye zaɓaɓɓen mai bayarwa na rajista. Ana tsabtace kurakuran da +ake mayarwa zuwa dashboard, kuma ba a taɓa rubuta bayanan shaidar endpoint a log ba. + +> **TODO (D20):** Ba a aiwatar da scope na `global` (raba memories tsakanin dukkan +> API keys) a wannan sakin ba. Yana buƙatar sauye-sauyen schema da hanyar retrieval +> ta duniya. A bi diddiginsa daban. ## Matakan ma'ajiyar bayanai diff --git a/docs/i18n/ha/docs/guides/DOCKER_GUIDE.md b/docs/i18n/ha/docs/guides/DOCKER_GUIDE.md index 521d57055562..a7d0ca0b53f5 100644 --- a/docs/i18n/ha/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/ha/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Gudanarwa Cikin Sauri +> **Kana son ka karɓi baƙuncin tsarin da kanka da umarni guda?** Duba +> [Jagorar Karɓar Baƙuncin Tsarin da Kanka](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (hoton da aka wallafa + +> Redis, loopback kawai, babu zaɓin profile). Gudanarwa Cikin Sauri da ke ƙasa ita ce +> hanyar container guda ɗaya ga masu amfani waɗanda tuni suke gudanar da Redis a wani wuri. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/ha/docs/guides/TROUBLESHOOTING.md b/docs/i18n/ha/docs/guides/TROUBLESHOOTING.md index 201d90271861..21b2e6556c22 100644 --- a/docs/i18n/ha/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/ha/docs/guides/TROUBLESHOOTING.md @@ -70,14 +70,22 @@ Saita waɗannan a cikin muhallin tsarin OmniRoute (daemon ɗin, misali ta Launch Lokacin da ka gudanar da `npm install -g omniroute`, za ka iya ganin tarin gargadi kamar `npm warn ERESOLVE`, sanarwar peer-dependency, da saƙonnin `deprecated`. **Ana tsammanin waɗannan kuma ba su da illa.** Shigarwar ta yi nasara idan ka ga `added packages` a cikin sakamakon. -Gargadin suna fitowa ne daga tsofaffin kewayon peer-dependency a cikin fakitin wasu ɓangarori waɗanda OmniRoute ba ya sarrafawa: +Don ɓoye gargadin warware peer-dependency, yi amfani da hanyar shigarwa da OmniRoute ke tallafawa: -1. **`marked-terminal` yana buƙatar `marked >=1 <16`, amma an sami `marked@18`** — yana aiki da kyau a aikace; kewayon peer na upstream ne kawai ya tsufa. -2. **`deprecated prebuild-install@7.1.3`** — mataimaki ne na samun native-binary wanda aka samo ta wata dogara. Ba a - amfani da shi wajen shigar da transport binding na `wreq-js` da aka kayyade, kuma ba ya nuna cewa saitin jigilar - mai samar da web-cookie ya gaza. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` yana ɓoye `ERESOLVE` da sanarwar peer-dependency ne kawai. Sanarwar daina tallafawa za ta ci gaba da bayyana saboda tana fitowa daga fakitin ɓangare na uku masu dogaro kai tsaye ko a kaikaice; ba ta nuna cewa shigarwar ta gaza ba. + +Gargadin yana fitowa ne daga tsofaffin jeren sigar peer-dependency a cikin fakitin ɓangare na uku waɗanda OmniRoute ba ya sarrafawa: + +1. **`marked-terminal` yana buƙatar `marked >=1 <16`, amma an samu `marked@18`** — yana aiki da kyau a zahiri; kawai dai jeren sigar peer na asalin fakitin ya tsufa. +2. **`deprecated prebuild-install@7.1.3`** — kayan taimako ne na ɗauko native-binary mai dogaro a kaikaice. Ba a + amfani da shi wajen shigar da haɗin transport na `wreq-js` da aka ƙayyade sigarsa, kuma ba ya nuna cewa saitin transport + na mai samar da web-cookie ya gaza. -**Ba a buƙatar wani mataki** — ba za a iya kashe gargadin gaba ɗaya ba sai an yi fork na fakitin upstream. +**Ba a buƙatar wani mataki** — ba za a iya ɓoye gargadin gaba ɗaya ba sai an yi fork na fakitin asali. --- diff --git a/docs/i18n/ha/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/ha/docs/providers/CURSOR-API-KEY-AND-CLI.md index 127b9a4445be..3042820ec037 100644 --- a/docs/i18n/ha/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/ha/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -6,36 +6,34 @@ Hanyoyi biyu na sanya Cursor a bayan OmniRoute ba tare da zaman IDE ba: -1. Mai samar da **`cursor-api`** (katin "Cursor API", laƙabi `cua`): mai samarwa - da ke amfani da maɓallin API wanda ke riƙe da maɓallin API na mai amfani da Cursor - (`crsr_…`, wanda ake ƙirƙirawa a `https://cursor.com/dashboard/api`). Daga nan, - kowane abokin cinikin OmniRoute zai iya isa ga samfuran Cursor ta - `/v1/chat/completions` a matsayin `cursor-api/` ko `cua/`, - tare da matakan ƙayyadadden amfani, madadin da rajista na yau da kullum. Mai - samar da IDE (`cursor`, zaman OAuth/IDE) bai canza ba. -2. **Wucewar Cursor CLI kai tsaye**: saita Cursor CLI (`agent`) zuwa OmniRoute domin - kowane RPC da CLI ke yi ya sami tantancewa da maɓallin API na OmniRoute, a tura - shi zuwa Cursor da bayanan shaidar haɗin `cursor-api`, sannan a rubuta shi a +1. **Mai samar da `cursor-api`** (katin "Cursor API", laƙabi `cua`): mai samarwa + da ke amfani da maɓallin API, wanda ke riƙe da maɓallin API na mai amfani da Cursor (`crsr_…`, wanda ake samarwa a + `https://cursor.com/dashboard/api`). Duk wani abokin cinikin OmniRoute zai iya isa ga + samfurorin Cursor ta `/v1/chat/completions` a matsayin `cursor-api/` ko + `cua/`, tare da matakan ƙayyadadden amfani, fallback da rajista na yau da kullum. Mai samar da IDE + (`cursor`, zaman OAuth/IDE) bai canza ba. +2. **Mika buƙatun Cursor CLI kai tsaye**: saita Cursor CLI (`agent`) ya yi amfani da OmniRoute domin + kowace RPC da CLI ke yi a tabbatar da ita ta amfani da maɓallin API na OmniRoute, a tura ta + zuwa Cursor tare da bayanan shaidar haɗin `cursor-api`, sannan a rubuta ta a shafin Logs. ## Dalilin da ya sa ake musayar maɓallin -`api2.cursor.sh` yana ƙin karɓar ɗanyen maɓallin `crsr_…` a matsayin token na Bearer -(401). Da farko Cursor CLI yana aika maɓallin ta POST zuwa -`/auth/exchange_user_api_key`, sannan ya karɓi JWT na zaman da zai ƙare bayan awa -ɗaya; `refreshToken` da aka mayar yana ɗauke da `exp` iri ɗaya, don haka sabuntawa -na nufin sake musayar maɓallin. -`open-sse/services/cursorApiKeyAuth.ts` yana yin wannan musayar, yana adana token -na zama guda ɗaya ga kowane maɓalli, yana sake musayar sa mintuna biyar kafin -lokacin ƙarewarsa, sannan yana cire token ɗin da aka adana idan Cursor ya amsa da 401. `CursorExecutor` yana kiran sa daidai kafin buɗe rafin sama ga haɗin -`cursor-api`. +`api2.cursor.sh` yana ƙin karɓar ainihin maɓallin `crsr_…` kai tsaye a matsayin alamar Bearer (401). Da farko Cursor +CLI yana POST ɗin maɓallin zuwa `/auth/exchange_user_api_key`, sannan ya karɓi JWT na zaman +da ke ƙarewa bayan awa ɗaya; `refreshToken` da aka dawo da shi yana ɗauke da irin wannan +`exp`, don haka sabuntawa na nufin sake musayar maɓallin. +`open-sse/services/cursorApiKeyAuth.ts` yana yin wannan musayar, yana adana alamar zaman +guda ɗaya ga kowane maɓalli, yana sake musayar ta minti biyar kafin ƙarewar wa’adinta, sannan yana cire +alamar da aka adana idan Cursor ya amsa da 401. `CursorExecutor` yana kiransa jim kaɗan kafin buɗe +rafi na upstream don haɗin `cursor-api`. ## Mai samar da `cursor-api` Rajista: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, `format`, `baseUrl` da -`models` iri ɗaya da na `cursor`). Katin katalog: -`src/shared/constants/providers/apikey/specialty-media.ts`. Taswirar mai aiwatarwa: +(`cursor_apiProvider`, `authType: "apikey"`, daidai `format`, `baseUrl` da +`models` kamar `cursor`). Katin kasida: +`src/shared/constants/providers/apikey/specialty-media.ts`. Taswirar executor: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). @@ -60,45 +58,55 @@ curl -sS http://localhost:20128/v1/chat/completions \ Bayanan kula: -- Jerin samfura na `cursor-api` yana fitowa daga tsayayyen rajistar Cursor - (jerin da mai samar da IDE yake komawa gare shi idan ya gaza); ba a buƙatar - shigar da `cursor-agent` a kan uwar-garken OmniRoute. -- `POST /api/providers/{id}/refresh-cursor` na mai samar da IDE na `cursor` - ne kawai; haɗin `cursor-api` ba shi da zaman IDE da za a sabunta. +- Jerin samfura na `cursor-api` yana fitowa daga tsayayyen rajistar Cursor (wato + jerin da mai samar da IDE yake komawa gare shi idan zaɓin farko bai yi aiki ba); ba a buƙatar shigar da `cursor-agent` + a kan na’urar da ke ɗauke da OmniRoute. +- `POST /api/providers/{id}/refresh-cursor` na mai samar da IDE na `cursor` ne + kawai; haɗin `cursor-api` ba su da zaman IDE da za a sabunta. -## Wucewar Cursor CLI kai tsaye +## ID na asali na samfura da matakin ƙoƙari + +Ga `cursor` / `cu` da `cursor-api` / `cua`, mai daidaita ƙoƙarin Claude da ake amfani da shi tare +yana barin ID na samfurin da aka nema yadda yake. Cursor na iya tallata ƙarin suna kamar +`-low` a matsayin wani ɓangare na ainihin ID na samfurin, maimakon a matsayin laƙabin ƙoƙari na OmniRoute. +Cursor executor yana kiyaye daidai gwargwadon abin da ya dace da kasidar kai tsaye; idan babu +wanda ya dace, mai warware samfurin da yake da shi ne ke kula da fallback daga ƙarin suna zuwa siga. + +Wannan ba ya canza daidaita ƙoƙari ga hanyoyin Claude kai tsaye, masu dacewa da Claude, +ko Vertex. Samuwar har yanzu tana dogara da kasida da haƙƙin amfani na +asusun Cursor da aka zaɓa. + +## Miƙa buƙatun Cursor CLI Hanya: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`. An yi rajistar gabatarwar -`/api/cursor-cli/` a cikin `src/shared/constants/publicApiRoutes.ts` saboda -handler ɗin yana aiwatar da nasa tantancewar: +`open-sse/handlers/cursorCliProxy.ts`. An yi rajistar prefix ɗin `/api/cursor-cli/` a cikin +`src/shared/constants/publicApiRoutes.ts` saboda handler ɗin yana +aiwatar da tantancewar kansa: -| Hanya | Tantancewar da ake jira daga CLI | Abin da OmniRoute yake yi | -| ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Yana tabbatar da maɓallin, yana ƙirƙirar JWT na HS256 mai tsawon awa 1 (wanda aka sa wa hannu da `JWT_SECRET`) sannan ya mayar da shi | -| kowace sauran hanya (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Yana tabbatar da mai bayarwa/masu karɓa/lokacin ƙarewa, yana zaɓar haɗin `cursor-api` mai aiki, yana maye gurbin header na Authorization da token na Cursor da aka musanya, sannan yana mayar da amsar a matsayin rafi | +| Path | Tantancewar da ake sa ran daga CLI | Abin da OmniRoute yake yi | +| -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Yana tabbatar da key ɗin, ya ƙirƙiri JWT na HS256 mai tsawon awa 1 (wanda aka sanya wa hannu da `JWT_SECRET`) sannan ya mayar da shi | +| duk wata hanya (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Yana tabbatar da issuer/audience/expiry, ya zaɓi haɗin `cursor-api` mai aiki, ya sauya header na Authorization da token ɗin Cursor da aka musanya sannan ya watsa amsar | -CLI yana karanta `exp` daga duk token ɗin da ya karɓa, don haka ba shi token -marar bayyana yana sa ya sake musayarwa kafin kusan kowace buƙata; JWT da aka -ƙirƙira yana hana hakan. Amsar 401 daga OmniRoute tana sa CLI ya sake yin -musayar. +CLI yana warware `exp` daga duk token ɗin da ya karɓa, don haka ba shi token +maras bayyananniyar ma’ana yana sa ya sake musanya shi kafin kusan kowace buƙata; JWT ɗin da aka +ƙirƙira yana hana hakan. Amsar 401 daga OmniRoute tana sa CLI ya sake musanyawa. ### Saitawa -1. Ƙirƙiri maɓallin API na OmniRoute (Dashboard → API keys) da kuma haɗin - `cursor-api`. -2. Umurci CLI ya yi amfani da HTTP/1.1 don rafin agent. A cikin +1. Ƙirƙiri OmniRoute API key (Dashboard → API keys) da haɗin `cursor-api`. +2. Umurci CLI ya yi amfani da HTTP/1.1 don stream ɗin agent. A cikin `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Ba tare da wannan ba, CLI yana buɗe zagayen agent ta HTTP/2 zuwa wata uwar-garken - agent da aka saita dabam, kuma RPC na matakin sarrafawa kawai ne suke wucewa - ta endpoint ɗin. + Idan babu wannan, CLI zai buɗe zagayen agent ta HTTP/2 zuwa host na agent da aka + saita dabam, kuma RPCs na control-plane ne kaɗai za su bi ta + endpoint ɗin. -3. Gudanar da CLI ta hanyar OmniRoute: +3. Gudanar da CLI tare da OmniRoute: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -106,19 +114,19 @@ musayar. agent -p --trust "Reply with exactly OK" ``` -Kowane mataki yana bayyana a Logs da mai samarwa `cursor-api`, nau'in buƙata -`cursor-cli`, hanya `/api/cursor-cli/`, tare da danganta shi da maɓallin API -na OmniRoute da kuma haɗin da ya sarrafa shi. +Kowane mataki yana bayyana a Logs da provider `cursor-api`, nau'in buƙata `cursor-cli`, +path `/api/cursor-cli/`, tare da danganta shi ga OmniRoute API key da +haɗin da ya sarrafa shi. ### Yanayin gazawa -| Yanayi | Amsar ga CLI | -| ------------------------------------------------------------ | ----------------------------------------------------------- | -| Maɓallin OmniRoute da ba a sani ba da `REQUIRE_API_KEY=true` | 401 `unauthenticated` yayin musaya | -| `REQUIRE_API_KEY=false` | zaman da ba a tantance ba (ya yi daidai da halayen `/v1/*`) | -| JWT na zaman da ya ƙare / na waje / aka yi wa kutse | 401, CLI zai sake musaya | -| An soke maɓallin API na OmniRoute bayan musaya | 401 a RPC na gaba | -| Babu haɗin `cursor-api` mai aiki | 503 `unavailable` | -| Cursor ya ƙi maɓallin haɗin | 401 `unauthenticated`, an share zaman da aka adana | -| Ba za a iya isa ga uwar garken sama ba | 502 `unavailable` (saƙon da aka tsabtace) | -| Ba a saita `JWT_SECRET` ba | 503 yayin musaya | +| Yanayi | Amsa ga CLI | +| ------------------------------------------------------- | ----------------------------------------------------------- | +| OmniRoute key da ba a sani ba da `REQUIRE_API_KEY=true` | 401 `unauthenticated` yayin musanyawa | +| `REQUIRE_API_KEY=false` | zaman da ba a tantance ba (yana kwaikwayon halayen `/v1/*`) | +| JWT na zaman da ya ƙare / na waje / aka sauya | 401, CLI zai sake musanyawa | +| An soke OmniRoute API key bayan musanyawa | 401 a RPC na gaba | +| Babu haɗin `cursor-api` mai aiki | 503 `unavailable` | +| Cursor ya ƙi key na haɗin | 401 `unauthenticated`, an goge zaman da aka adana | +| Ba a iya isa ga upstream ba | 502 `unavailable` (saƙon da aka tsabtace) | +| Ba a saita `JWT_SECRET` ba | 503 yayin musanyawa | diff --git a/docs/i18n/ha/docs/reference/API_REFERENCE.md b/docs/i18n/ha/docs/reference/API_REFERENCE.md index bbd90ff84ccb..d70bf2fe1c59 100644 --- a/docs/i18n/ha/docs/reference/API_REFERENCE.md +++ b/docs/i18n/ha/docs/reference/API_REFERENCE.md @@ -445,68 +445,90 @@ Yi amfani da wannan endpoint lokacin da sidecar ke aiki a wajen tsari kuma ba za --- -## Endpoints na Daidaituwa - -| Hanya | Path | Tsari | -| ----- | ----------------------------------------- | ------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (gyara/inpaint) | -| POST | `/v1/videos/generations` | Samar da bidiyo irin na OpenAI | -| POST | `/v1/music/generations` | Samar da kiɗa irin na OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (yana mayar da audio body) | -| POST | `/v1/rerank` | Sake jere irin na Cohere/Voyage | -| POST | `/v1/classify` | Rarrabawar Jina (`api.jina.ai`) | -| POST | `/v1/segment` | Mai rarraba Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Laƙabin kundin OpenAI | -| GET | `/api/v1/vscode/{token}/models` | Laƙabin models na OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | Laƙabin OpenAI mai token | -| POST | `/api/v1/vscode/{token}/responses` | Laƙabin OpenAI Responses mai token | -| POST | `/api/v1/vscode/{token}/api/chat` | Laƙabin Ollama mai token | -| GET | `/api/v1/vscode/{token}/api/tags` | Laƙabin tags na Ollama mai token | - -Duk hanyoyin POST suna bin tsari iri ɗaya: `Bearer your-api-key` + JSON body da Zod ya inganta (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, da sauransu, duba `src/shared/validation/schemas.ts`). Ana mayar da 4xx idan schema ya gaza. - -Ga clients waɗanda ba za su iya haɗa `Authorization: Bearer ...` ba, OmniRoute kuma yana karɓar API keys a cikin URL ta hanyar daidaituwar query-string (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) ko kuma keɓaɓɓun endpoints na `/api/v1/vscode/{token}/...` da aka bayyana a ƙasa. +## Hanyoyin Ƙarshen Daidaituwa + +| Hanya | Tafarki | Tsari | +| ----- | ----------------------------------------- | -------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (gyara/inpaint) | +| POST | `/v1/videos/generations` | Samar da bidiyo irin na OpenAI | +| POST | `/v1/music/generations` | Samar da kiɗa irin na OpenAI | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (yana mayar da jikin sauti) | +| POST | `/v1/rerank` | Sake jeri irin na Cohere/Voyage | +| POST | `/v1/classify` | Rarrabewar Jina (`api.jina.ai`) | +| POST | `/v1/segment` | Mai rarraba Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | Laƙabin kundin OpenAI | +| GET | `/api/v1/vscode/{token}/models` | Laƙabin samfuran OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | Laƙabin OpenAI mai token | +| POST | `/api/v1/vscode/{token}/responses` | Laƙabin OpenAI Responses mai token | +| POST | `/api/v1/vscode/{token}/api/chat` | Laƙabin Ollama mai token | +| GET | `/api/v1/vscode/{token}/api/tags` | Laƙabin alamun Ollama mai token | + +Duk hanyoyin POST suna bin tsari iri ɗaya: `Bearer your-api-key` + jikin JSON da Zod ya inganta (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, da sauransu, duba `src/shared/validation/schemas.ts`). Ana mayar da 4xx idan ingancin schema ya gaza. + +Ga abokan hulɗa waɗanda ba za su iya haɗa `Authorization: Bearer ...` ba, OmniRoute kuma yana karɓar maɓallan API a cikin URL ta hanyar daidaituwar query-string (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) ko kuma ta keɓaɓɓun hanyoyin ƙarshe na `/api/v1/vscode/{token}/...` da aka bayyana a ƙasa. ```bash -# Sake jere +# Sake jeri (mai bayarwa na rajistar cloud, ko kumburin mai bayarwa mai dacewa da OpenAI a matsayin "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Rarrabawar Jina (takardun shaidar Foundation API) +# Rarrabewar Jina (takardun shaidar Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Mai rarraba Jina +# Mai rarrabawar Jina POST /v1/segment { "content": "...", "return_chunks": true } -# Binciken Jina (s.jina.ai; laƙuban mai bayarwa: jina-search, jina-ai, jina) +# Binciken Jina (s.jina.ai; laƙaban mai bayarwa: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Daidaita abun ciki +# Tace abubuwan da ba su dace ba POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — yana mayar da audio/mpeg (ko tsarin da aka nema) a matsayin body +# TTS — yana mayar da jikin audio/mpeg (ko tsarin da aka nema) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Gyaran hoto (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Samar da bidiyo / kiɗa (model id mai prefix na mai bayarwa) +# Samar da bidiyo / kiɗa (ID ɗin samfuri mai prefix na mai bayarwa) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Keɓaɓɓun Hanyoyin Mai Bayarwa +> **Kumburin masu bayar da sake jeri:** `POST /v1/rerank` kuma yana tura buƙatu zuwa kumburin masu bayarwa masu dacewa da OpenAI +> (oMLX, vLLM, Infinity, TEI a bayan gateway, …) waɗanda ake ambata da `/`. Kumburin loopback +> (`localhost`, `127.0.0.1`, `172.16.0.0/12`) koyaushe sun cancanta. Kumburin da ke kan kowane wani +> host — na'ura a LAN ko takwaran Tailscale — suna cancanta ne kawai idan mai gudanarwa ya kunna +> tutar fasalin `RERANK_REMOTE_PROVIDER_NODES` **kuma** tushen URL na kumburin ya cika manufofin URL +> mai fita na mai bayarwa (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> ba a taɓa tura buƙatu zuwa host ɗin metadata na cloud ba. Matakin sake jeri na injin ƙwaƙwalwa yana kiran wannan hanya ta +> loopback, don haka wannan ƙa'idar ce kuma ke sarrafa `rerankProviderModel` a cikin saitunan Memory. +> +> **Tsarukan uwar garken gida:** ana kiran kumburin a `/v1/rerank`, sannan idan an sami 404, a `/rerank` +> (Infinity, TEI). Jikin da ake aikawa upstream yana ɗauke da rubutun Cohere/OpenAI (`documents`, +> `return_documents`) da kuma rubutun TEI (`texts`, `return_text`), sannan ana daidaita martanin upstream +> zuwa marufin Cohere: tsagwaron jerin TEI na `[{index, score, text}]`, `{results: [{index, score}]}` +> daga ƙananan gateways, da kuma `{data: [...]}` irin na Voyage, duk suna komawa ga abokin hulɗa a matsayin +> `{results: [{index, relevance_score, document?}]}`, an jera su bisa maki kuma an iyakance su zuwa `top_n`. + +> **Gano kumburin mai bayarwa:** samfuran da ke kan kumburin mai bayarwa mai dacewa da OpenAI suna bayyana a `GET /v1/models` +> ƙarƙashin prefix na kumburin. Layukan da ba su ɗauke da metadata na hanyar ƙarshe ba (wanda aka saba gani a jerin `/v1/models` na gida) +> suna gādon `apiType` na kumburin, don haka samfuran kumburin `embeddings` suna zama `type: "embedding"`, yayin da +> samfuran kumburin `rerank` suke zama `type: "rerank"` maimakon ɗaukar chat a matsayin tsoho; takamaiman +> `supportedEndpoints` a kan layin da aka daidaita ko aka ƙara da hannu har yanzu shi ne ke da fifiko. + +### Keɓaɓɓun Hanyoyin Masu Bayarwa ```bash POST /v1/providers/{provider}/chat/completions @@ -514,7 +536,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Ana ƙara prefix na mai bayarwa kai tsaye idan babu shi. Models marasa daidaituwa suna mayar da `400`. +Ana ƙara prefix na mai samarwa ta atomatik idan babu shi. Samfuran da ba su dace ba suna mayar da `400`. --- diff --git a/docs/i18n/ha/docs/reference/ENVIRONMENT.md b/docs/i18n/ha/docs/reference/ENVIRONMENT.md index 3a833766d80e..8c838ccd788b 100644 --- a/docs/i18n/ha/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/ha/docs/reference/ENVIRONMENT.md @@ -77,74 +77,73 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" --- -## 2. Ma'ajiya & Ma'ajiyar Bayanai - -OmniRoute yana amfani da **SQLite** (ta hanyar `better-sqlite3`) don duk wani adana bayanai na dindindin. Waɗannan sauye-sauye suna sarrafa wurin bayanai, ɓoyewa, da zagayowar rayuwarsu. - -| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | -| ------------------------------------------ | ------------------------------ | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Babban kundin adireshi na SQLite DB, kwafin ajiya, da fayilolin bayanai. Sauya shi don kundin Docker ko hanyoyin da aka keɓance. | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(ba a saita ba)_ | `src/lib/dataPaths.ts` | Hanyar kaucewa kariyar DATA_DIR ta gwaji/eval (#10428). Gwaje-gwaje da binciken eval/print na Node (`-e`/`--eval`/`-p`/`--print`, har da siffofin `--eval=`/`--print=`) waɗanda ba su da `DATA_DIR` ana karkatar da su zuwa kundin wucin gadi da za a yar, domin kada su buɗe ainihin ma'ajiyar bayanan mai gudanarwa; saita zuwa `1` don sake amincewa da amfani da ainihin kundin. | -| `OMNIROUTE_BUILD_SHA` | _(ba a saita ba)_ | `src/lib/monitoring/buildSha.ts` | Git SHA na artefakt ɗin da ke gudana. Ana liƙa shi ta `npm run build:release`; ana iya shigar da shi cikin kwantena waɗanda ake rarrabawa ba tare da alamar `dist/BUILD_SHA` ba. Ana nuna shi a matsayin `system.buildSha` a `/api/monitoring/health`. | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref ɗin da ƙofar tabbatar da asalin pack-artifact ke kwatanta build SHA da shi (#10427). | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(ba a saita ba)_ | `scripts/build/buildProvenance.ts` | Saita zuwa `1` don ba da damar shirya build wanda SHA ɗinsa ba ya kan layin fitarwa, tare da yin rikodinsa a matsayin canary da aka yi da gangan maimakon ƙin amincewa da shi a ƙofar (#10427). | -| `OMNIROUTE_SMOKE_API_KEY` | _(ba a saita ba)_ | `scripts/ops/deploy-canary.mjs` | Maɓallin API na binciken smoke na tura-canary, wanda ake aikawa a matsayin `Authorization: Bearer` zuwa `/v1/chat/completions`. Rubutun tura tsarin ne kawai ke amfani da shi (#10429), uwar garken ba ta taɓa amfani da shi. Ba shi da alaƙa da sauye-sauyen `OMNIROUTE_SMOKE_*` na tsarin gwajin smoke na CLI da sai an amince a yi amfani da shi (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` a cikin `tests/integration/upstream-cli-smoke.int.test.ts`) — duba [Haɗaɗɗun CLI → Ainihin zagayen smoke](../guides/CLI-INTEGRATIONS.md). | -| `OMNIROUTE_BUILDING` | _(ba a saita ba)_ | `src/lib/buildPhase.ts` | Alamar matakin build (#10060): `scripts/build/build-next-isolated.mjs` ne ke saita ta zuwa `1`, kuma kowane build worker da aka ƙaddamar yana gadonta domin layin DB ya mayar da stub mara aiki maimakon loda native addon na better-sqlite3 (wanda ke katse worker yayin fita). Ba a taɓa saita ta ga uwar garken da ke gudana. | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Saita zuwa `1` don tsallake binciken prebuild na native dependency na zaɓi ga bishiyoyin vendored na musamman. Wannan ba ya sa dependency da babu ya zama mai yiwuwa a yi build da shi; yi amfani da shi kawai idan ana samar da native dependencies ta wata hanya dabam. | -| `OMNIROUTE_DATA_DIR` | _(ba a saita ba)_ | `open-sse/executors/promptql/threadSticky.ts` | **Madadin alias** na `DATA_DIR`, wanda ake dubawa kawai idan ba a saita `DATA_DIR` ba. Ana amfani da shi don gano ma'ajiyar zaman thread-sticky ta PromptQL executor da ke kan faifai (`/promptql-thread-sessions.json`); idan ba a saita ko ɗaya daga cikin sauye-sauyen ba, ma'ajiyar tana kasancewa cikin ƙwaƙwalwa kawai (ba a adana ta bayan sake farawa). | -| `OMNIROUTE_PLUGINS_DIR` | _(ba a saita ba)_ | `src/lib/plugins/scanner.ts` | Kundin da **runtime plugin scanner** ke karantawa — kuma tushen da plugin manager ke shigarwa a ciki — yana maye gurbin tsohon wurin da ake samo daga home (#11827). Nuna shi zuwa bishiyar plugin da aka bind-mount a Docker/K8s maimakon matsar da HOME kawai don canza wurin hanyar bincike (HOME yana kuma sarrafa duk sauran halayen da suka danganci home). Idan ba a saita ba = `~/.omniroute/plugins`, ko `/tmp/.omniroute/plugins` idan tsarin ba ya fitar da wani home kwata-kwata — wannan sauyin yana kawar da rashin ganowa da ke faruwa ba tare da sanarwa ba. Ana rubuta kundin da aka tantance sau ɗaya yayin farawa a matsayin `scanner.dir_resolved` tare da shigarwar da ta yi nasara. Na gefen uwar garken kawai: plugins na umarnin CLI suna riƙe da nasu `OMNIROUTE_PLUGIN_PATH` (sashe na 9). | -| `STORAGE_ENCRYPTION_KEY` | _(babu komai = an kashe)_ | `src/lib/db/encryption.ts` | Maɓallin AES don cikakken ɓoyewar rumbun bayanan SQLite yayin ajiya. Samar da shi da `openssl rand -hex 32`. | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Alamar sigar maɓallin ɓoyewa. Ƙara ta yayin jujjuya maɓalli domin tallafa wa warware ɓoyewar tsofaffin kwafin ajiyar bayanai. | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Idan `true`, yana tsallake kwafin ajiyar fayil na SQLite na yau da kullum/kafin rubutu (adana/share farashin models.dev, rubuce-rubucen saituna). Kwafin ajiya na hannu da na kafin maidowa suna ci gaba da gudana. **Ba ya** kashe hoton kariya mai ɗorewa na tilas na mai gudanar da ƙaura ko kariyar ƙaura mai yawa ga DB mai ɗorewa da ke akwai. Ana taƙaita kwafin ajiyar da ba na hannu ba zuwa mafi yawa sau ɗaya cikin mintuna 60. **Settings → Storage** na Dashboard na iya kashe kwafin ajiya na yau da kullum kai tsaye. | -| `OMNIROUTE_CRYPT_KEY` | _(ba a saita ba)_ | `src/lib/db/encryption.ts` | **Tsohon madadin suna** na `STORAGE_ENCRYPTION_KEY`. Ana karɓarsa a matsayin madadi idan babban canjin ba ya nan. | -| `OMNIROUTE_API_KEY_BASE64` | _(ba a saita ba)_ | `src/lib/db/encryption.ts` | **Tsohon madadin suna** (nau'in da aka yi wa rufin Base64) da ake karɓa a matsayin madadi. Ana warware shi ta atomatik kafin amfani. | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ba a saita ba)_ | `src/lib/db/core.ts` | Sauya tazarar binciken lafiyar SQLite na lokaci-lokaci (ms). Idan ba a saita ba, ana samo ƙimar tsoho daga `NODE_ENV`. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (sa'o'i 6) | `src/lib/db/walMaintenance.ts` | Sauya tazarar `wal_checkpoint(TRUNCATE)` na lokaci-lokaci (ms). Dubawa ta atomatik ba ta taɓa rage girman fayil ɗin WAL da kanta, kuma sabar da ke aiki na dogon lokaci ba ta taɓa rufe DB ɗinta. `0` yana kashewa. | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (minti 5) | `src/lib/db/walMaintenance.ts` | Sauya tazarar `wal_checkpoint(PASSIVE)` mai yawan gudana (ms). Yana riƙe firamomin WAL masu jiran aiki ƙanana domin TRUNCATE na lokaci-lokaci kada ya kwafi tarin bayanai na GB da yawa a kan babban zaren aiki. `0` yana kashewa. | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Idan zagayen PASSIVE ya tarar fayil ɗin WAL ya wuce wannan girman, a ɗaukaka zuwa `wal_checkpoint(TRUNCATE)` nan take maimakon jiran zagaye mai jinkiri. | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Saita zuwa `1`/`true`/`yes`/`on` domin fita daga tsarin bayan matsin albarkatu mai tsanani ya ci gaba har tsawon `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, ta yadda mai sa ido (systemd `Restart=always`, manufar sake farawa ta Docker) zai dawo da tsari mai tsabta maimakon ci gaba da bayar da 503 har abada. | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (minti 2) | `open-sse/utils/resourcePressure.ts` | Tsawon lokacin da matsin lamba mai tsanani dole ya ci gaba kafin fitowar sake farawa da kansa ta faru. | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(ganowa ta atomatik)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Bayyanannen hanyar fayil (cikakkiya ko dangane da cwd) zuwa `sql-wasm.wasm` yayin amfani da adaftar madadin WASM ta `sql.js`. Ana gano ta atomatik ta hanyar dogaron fakiti da tsare-tsaren wurare masu yiwuwa idan ba a saita ba. | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (sa'o'i 6) | `src/lib/db/core.ts` | Sauya tazarar `wal_checkpoint(TRUNCATE)` na lokaci-lokaci (ms). Dubawa ta atomatik ba ta taɓa rage girman fayil ɗin WAL da kanta, kuma sabar da ke aiki na dogon lokaci ba ta taɓa rufe DB ɗinta. `0` yana kashewa. | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Yawan kwanakin da ake riƙe wuraren dubawa, fayilolin shigarwa/fitarwa/kuskure da aka ambata, da layin aikin Batch API da ya ƙare (an kammala/ya gaza/an soke/lokaci ya ƙare) kafin zagayen tsaftacewa ta atomatik ya share su. Yana fara aiki ne kawai bayan an kunna `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; ya yi daidai da wa'adin riƙe sakamakon Batch API na OpenAI. Ba ya shafar hanyar `DELETE /api/v1/batches/delete-completed` da mai gudanarwa ya tayar, wadda take ci gaba da aiki ba tare da sharadi ba (babu tacewa ta shekaru) bisa tsari. | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Idan `true`, a ba aikin sharewa ta atomatik damar goge ayyukan Batch API da suka kai matakin ƙarshe (da checkpoints ɗinsu) bayan `OMNIROUTE_BATCH_RETENTION_DAYS`, sannan ya share abun cikin BLOB na fayilolin da aka ɗora bayan nasu `expires_at`. A kashe yake ta tsohuwa: duk shigarwar da ake da ita za ta ci gaba da riƙe wannan bayanin daidai kamar da har sai mai gudanarwa ya zaɓi kunna shi. Haka kuma feature flag ne da za a iya gyarawa daga dashboard — duba `docs/reference/FEATURE_FLAGS.md` → Lokacin gudana. | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Saita zuwa `1` don tsallake DB healthcheck gaba ɗaya yayin farawa. Yana da amfani ga ayyuka masu ɗan gajeren lokaci da gwaje-gwajen haɗa-tsari. | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Saita zuwa `1` don tilasta kunna madaukin DB healthcheck, ko da a yanayin da yawanci za a tsallake shi (misali, ayyuka masu ɗan gajeren lokaci). | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Saita zuwa `1` don tsallake dumama native-runtime yayin `npm install`. Yana da amfani a shigarwar CI/headless inda an riga an gina sqlite. | -| `OMNIROUTE_MIGRATIONS_DIR` | _(ganowa ta atomatik)_ | `src/lib/db/migrationRunner.ts` | Sauya kundin adireshin da migration runner ke bincikawa. Yana da amfani yayin tura migrations da aka haɗa cikin custom builds. | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ba a saita ba)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Ƙarin kundin adireshin migration a matsayin shigarwar `namespace=dir` waɗanda aka raba da alamar raba path ta dandali (misali `ee=/opt/app/enterprise/db/migrations`). Ana rubuta fayilolin da aka samu a wurin a matsayin `-`, don haka rarrabawar da ke turo nata migrations ba za ta taɓa karo da ramummukan lambobi na upstream ba. Shigarwar da ba ta da tsari, namespace mara inganci, ko kundin adireshin da babu shi zai jawo kuskure yayin farawa maimakon a tsallake schema ba tare da sanarwa ba. | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Iyakar tsaro ga migrations masu yawa da ke jiran aiwatarwa (#3416). Farawa zai tsaya idan fiye da wannan adadin migrations ne ke jiran aiwatarwa a DB da ake da shi (yana karewa daga tracking table da aka share). Ƙara shi don dawo da tsohon backup; saita zuwa `0` don kashe binciken. | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Kundin adireshin aiki na ƙofar saki ta `check:install-upgrade`. Yana buƙatar kusan 12 GB (bishiyoyin shigarwa guda biyu na kusan 3 GB kowanne tare da tarball), saboda haka kada a gudanar da shi a ƙaramin tmpfs — a self-hosted runner ɗin, `/tmp` tmpfs ne mai 12 GB da RAM ke tallafawa, kuma ƙofar ta cika shi, wanda ya sa aka yanke package ɗin. | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(tsohuwar ƙima a cikin code)_ | `src/lib/spend/batchWriter.ts` | Tazarar flush (ms) ga batched spend/cost writer. Ƙananan ƙimomi suna rage haɗa rubuce-rubuce; manyan ƙimomi suna rage cunkoson DB. | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(tsohuwar ƙima a cikin code)_ | `src/lib/spend/batchWriter.ts` | Matsakaicin adadin shigarwar spend da za a ajiye a buffer kafin tilasta flush. Ƙara shi a deployments masu babban QPS; rage shi idan iyakantaccen memory ya fi muhimmanci. | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ba a saita ba)_ | `open-sse/utils/proxyFetch.ts` | Saita zuwa `"true"` don fitar da debug logs na `[ProxyFetch]` a kan Vercel relay path. A kashe yake ta tsohuwa don kauce wa fallasa alamun routing. | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Saita zuwa `"true"` ko `"1"` don haɗa IPs na client/egress da prefix na account a cikin cikakken layin process-log na `[ProxyEgress]`. Ana barinsa a KASHE ta tsohuwa domin process log kada ya fallasa IPs ko prefix na account. | -| `OMNIROUTE_DEBUG` | _(ba a saita ba)_ | `bin/cli/commands/quota.mjs` | Saita zuwa `1` don buga bayanan binciken lokacin kowace request (`[omniroute] GET completed in Nms`) daga umarnin quota na CLI zuwa stderr. | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(ta atomatik)_ | `scripts/dev/healthcheck.mjs` | Takamaiman path da container health check ke gwadawa. Idan ba a saita ba, probe zai samo shi daga `OMNIROUTE_BASE_PATH`; saita shi yana sake kunna deep monitoring endpoint. | -| `OMNIROUTE_DEBUG_COMPLETION` | _(ba a saita ba)_ | `bin/cli/commands/completion.mjs` | Saita zuwa kowace ƙima da ba fanko ba don fitar da bayanan binciken `[omniroute completion]` daga paths na cache na shell-completion na CLI (karantawa/sabuntawa/rubutawa). A kashe yake ta tsohuwa — waɗannan caches suna kasa ba tare da sanarwa ba domin cache da ya ɓace ko ya lalace kada ya taɓa hana tab-completion aiki. | -| `BATCH_RETRY_DURATION_MS` | `86400000` (awa 24) | `open-sse/services/batchProcessor.ts` | Matsakaicin tsawon lokacin sake gwadawa ga kowane abu na batch (ms). Abubuwan da suka wuce wannan lokaci za a yi musu alamar sun gaza. | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Jinkiri na asali (ms) don ƙarin jinkiri mai ninkawa yayin sake gwada abubuwan batch. | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (awa 1) | `open-sse/services/batchProcessor.ts` | Matsakaicin iyaka (ms) ga ƙarin jinkiri mai ninkawa tsakanin sake gwada abubuwan batch. | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Matsakaicin adadin batches da ake sarrafawa a lokaci guda. Ƙara shi don haɓaka yawan aiki; a bar shi ƙasa don guje wa cunkoson iyakance ƙimar buƙatu. | +## 2. Ma’aji & Ma’adanar Bayanai + +OmniRoute yana amfani da **SQLite** (ta hanyar `better-sqlite3`) don duk adanawa na dindindin. Waɗannan sauye-sauye suna sarrafa wurin bayanai, ɓoyewa, da zagayowar rayuwa. + +| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | +| ------------------------------------------ | ------------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Babban kundin adireshi na DB na SQLite, kwafin ajiya, da fayilolin bayanai. Sauya shi don kundin Docker ko hanyoyi na musamman. | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(ba a saita ba)_ | `src/lib/dataPaths.ts` | Hanyar kaucewa kariyar DATA_DIR ta gwaji/kimantawa (#10428). Ana karkatar da gwaje-gwaje da binciken eval/print na Node (`-e`/`--eval`/`-p`/`--print`, har da siffofin `--eval=`/`--print=`) waɗanda ba su da `DATA_DIR` zuwa kundin wucin gadi da za a jefar domin kada su iya buɗe ainihin ma’adanar bayanan mai gudanarwa; saita zuwa `1` don komawa amfani da ainihin kundin. | +| `OMNIROUTE_BUILD_SHA` | _(ba a saita ba)_ | `src/lib/monitoring/buildSha.ts` | Git SHA na artifact da ke gudana. `npm run build:release` ne ke sanya shi; ana iya shigar da shi cikin containers da ake jigila ba tare da alamar `dist/BUILD_SHA` ba. Ana nuna shi a matsayin `system.buildSha` a `/api/monitoring/health`. | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref ɗin da ƙofar tabbatar da asalin pack-artifact ke kwatanta build SHA da shi (#10427). | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(ba a saita ba)_ | `scripts/build/buildProvenance.ts` | Saita zuwa `1` don ba da damar shirya build wanda SHA ɗinsa ba ya kan layin release, tare da yin rijistarsa a matsayin canary da aka yi da gangan maimakon ƙofar ta gaza (#10427). | +| `OMNIROUTE_SMOKE_API_KEY` | _(ba a saita ba)_ | `scripts/ops/deploy-canary.mjs` | Maɓallin API na binciken smoke na tura canary, wanda ake aikawa a matsayin `Authorization: Bearer` zuwa `/v1/chat/completions`. Rubutun tura tsarin ne kawai ke amfani da shi (#10429), uwar garken ba ta taɓa amfani da shi. Ba shi da alaƙa da sauye-sauyen `OMNIROUTE_SMOKE_*` na tsarin gwajin smoke na CLI da ake shiga da gangan (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` a cikin `tests/integration/upstream-cli-smoke.int.test.ts`) — duba [Haɗe-haɗen CLI → Binciken smoke na ainihi](../guides/CLI-INTEGRATIONS.md). | +| `OMNIROUTE_BUILDING` | _(ba a saita ba)_ | `src/lib/buildPhase.ts` | Alamar matakin build (#10060): `scripts/build/build-next-isolated.mjs` yana saita ta zuwa `1`, kuma kowane build worker da aka ƙaddamar yana gajarta ta, domin layin DB ya mayar da stub marar aiki maimakon loda native addon na better-sqlite3 (wanda ke dakatar da worker yayin fita). Ba a taɓa saita ta ga uwar garken da ke gudana ba. | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Saita zuwa `1` don tsallake binciken prebuild na zaɓi na native dependency ga vendored trees na musamman. Wannan ba ya sa dependency da ta ɓace ta zama mai yiwuwa a build; yi amfani da shi kawai idan ana samar da native dependencies ta wata hanya dabam. | +| `OMNIROUTE_DATA_DIR` | _(ba a saita ba)_ | `open-sse/executors/promptql/threadSticky.ts` | **Laƙabin madadin** `DATA_DIR`, wanda ake dubawa kawai idan ba a saita `DATA_DIR` ba. Ana amfani da shi don gano cache ɗin zaman thread-sticky na mai aiwatar da PromptQL da ke kan faifai (`/promptql-thread-sessions.json`); idan ba a saita ko ɗaya daga cikin sauye-sauyen ba, cache ɗin zai kasance a ƙwaƙwalwa kawai (ba za a adana shi bayan sake farawa ba). | +| `OMNIROUTE_PLUGINS_DIR` | _(ba a saita ba)_ | `src/lib/plugins/scanner.ts` | Kundin da **runtime plugin scanner** ke karantawa — kuma tushen da plugin manager ke girkawa a ciki — yana maye gurbin tsohon wurin da aka samo daga home (#11827). Nuna shi zuwa plugin tree da aka bind-mount a Docker/K8s maimakon matsar da HOME kawai don sauya wurin hanyar bincike (HOME yana sarrafa duk sauran halayen da suka danganci home ma). Ba a saita ba = `~/.omniroute/plugins`, ko `/tmp/.omniroute/plugins` idan process ɗin bai fitar da home ko kaɗan ba — wannan sauyin yana kawar da rashin ganowa ba tare da sanarwa ba. Ana rubuta kundin da aka tantance sau ɗaya yayin farawa a matsayin `scanner.dir_resolved` tare da input ɗin da ya yi nasara. Na gefen uwar garke kawai: plugins na umarnin CLI suna ci gaba da amfani da nasu `OMNIROUTE_PLUGIN_PATH` (sashe na 9). | +| `STORAGE_ENCRYPTION_KEY` | _(babu komai = an kashe)_ | `src/lib/db/encryption.ts` | Maɓallin AES don rufaffen cikakken ma'ajiyar bayanan SQLite yayin da take ajiye. Samar da shi da `openssl rand -hex 32`. | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Alamar sigar maɓallin ɓoyewa. Ƙara ta yayin sauya maɓalli domin tallafa wa warware ɓoyewar tsofaffin kwafin ajiya. | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Idan `true`, ana tsallake kwafin ajiyar fayil ɗin SQLite na yau da kullum/kafin rubutawa (adana/share farashin models.dev, rubuta saituna). Kwafin ajiya na hannu da na kafin maidowa za su ci gaba da aiki. Wannan **ba ya** kashe tilas ɗin hoton kariya mai ɗorewa na mai gudanar da ƙaura ko kariyar ƙaura mai yawa ga DB mai ɗorewa da ke akwai. Ana iyakance kwafin ajiyar da ba na hannu ba zuwa mafi yawa sau ɗaya cikin mintuna 60. **Settings → Storage** na dashboard na iya kashe kwafin ajiya na yau da kullum kai tsaye. | +| `OMNIROUTE_CRYPT_KEY` | _(ba a saita ba)_ | `src/lib/db/encryption.ts` | **Tsohon madadi** na `STORAGE_ENCRYPTION_KEY`. Ana karɓarsa a matsayin madadin idan babban canjin ba ya nan. | +| `OMNIROUTE_API_KEY_BASE64` | _(ba a saita ba)_ | `src/lib/db/encryption.ts` | **Tsohon madadi** (nau'in da aka ɓoye da Base64) da ake karɓa a matsayin madadin. Ana warware shi ta atomatik kafin amfani. | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(ba a saita ba)_ | `src/lib/db/core.ts` | Sauya tazarar binciken lafiyar SQLite na lokaci-lokaci (ms). Idan ba a saita ba, ana samo tsoffin ƙimomi daga `NODE_ENV`. | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(an cire)_ | `src/lib/db/walMaintenance.ts` | **An cire.** Gudanar da `wal_checkpoint(TRUNCATE)` kai tsaye na lokaci-lokaci na iya lalata taswirar wal-index da ake rabawa kuma ya sa tsarin ya faɗi da SIGBUS (#13973), saboda haka jadawalin ba ya wanzuwa. Canjin ba ya aiki: ƙima mai kyau tana rubuta gargadin daina amfani sau ɗaya, yayin da `0` ko rashin saitawa ba sa fitar da komai. Ana kula da WAL ta wuraren dubawa na PASSIVE (a ƙasa), sannan wurin dubawa na lokacin rufewa yana rage shi. | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (minti 5) | `src/lib/db/walMaintenance.ts` | Sauya tazarar `wal_checkpoint(PASSIVE)` mai yawan gudana (ms). Yana rage firamomin WAL da ke jiran aiki domin wuraren dubawa su kasance masu sauri, kuma fayil ɗin WAL ya kasance cikin iyaka tsakanin ragewar lokacin rufewa. `0` yana kashewa. | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Idan zagayen PASSIVE ya tarar da fayil ɗin WAL ya zarce wannan girman, a gudanar da `wal_checkpoint(RESTART)` domin WAL ya fara daga farko ba tare da sake rubuta wal-index da aka tsara ba. An cire wuraren dubawa na yanayin truncate masu aiki kai tsaye (duba layin `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Saita zuwa `1`/`true`/`yes`/`on` domin fita daga tsarin bayan matsin albarkatu mai tsanani ya ci gaba har tsawon `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, ta yadda mai sa ido (systemd `Restart=always`, dokar sake farawa ta Docker) zai dawo da tsari mai tsabta maimakon ci gaba da ba da 503 har abada. | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (minti 2) | `open-sse/utils/resourcePressure.ts` | Tsawon lokacin da matsin mai tsanani dole ne ya ci gaba kafin fitowar sake-fara-kai ta gudana. | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(ganowa ta atomatik)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Takamaiman hanyar fayil (cikakkiya ko dangane da cwd) zuwa `sql-wasm.wasm` lokacin amfani da adaftan madadin WASM na `sql.js`. Ana gano ta atomatik ta hanyar dogaro na fakiti da tsarin fayiloli masu yiwuwa idan ba a saita ba. | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Adadin kwanakin da wuraren dubawa, fayilolin shigarwa/fitarwa/kuskure da aka ambata, da layin aikin Batch API na ƙarshe (an kammala/ya gaza/an soke/ya ƙare) za su kasance ajiye kafin sharewa ta zagayen tsaftacewa na atomatik. Yana fara aiki ne kawai bayan an kunna `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; ya yi daidai da lokacin riƙe sakamakon Batch API na OpenAI. Ba ya shafar hanyar `DELETE /api/v1/batches/delete-completed` da mai gudanarwa ke kunnawa, wadda ke ci gaba da aiki ba tare da sharaɗi ba (babu tacewa ta shekaru) bisa ƙira. | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Idan `true`, a bar zagayen tsaftacewa na atomatik ya share ayyukan Batch API na ƙarshe (da wuraren dubawarsu) da suka wuce `OMNIROUTE_BATCH_RETENTION_DAYS`, sannan ya goge abun BLOB na fayilolin da aka loda bayan sun wuce `expires_at` nasu. A kashe yake ta asali: kowace shigarwa da ke akwai za ta riƙe wannan bayanin daidai yadda yake a baya har sai mai gudanarwa ya zaɓi shiga. Haka kuma tutar fasali ce da za a iya gyarawa a dashboard — duba `docs/reference/FEATURE_FLAGS.md` → Lokacin aiki. | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Saita zuwa `1` don tsallake duba lafiyar DB gaba ɗaya yayin farawa. Yana da amfani ga ayyuka masu ɗan gajeren lokaci da gwaje-gwajen haɗawa. | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Saita zuwa `1` don tilasta kunna madaukin duba lafiyar DB, ko da kuwa a yanayi na yau da kullum za a tsallake shi (misali, ayyuka masu ɗan gajeren lokaci). | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Saita zuwa `1` don tsallake ɗumama native-runtime yayin `npm install`. Yana da amfani a girkawa ta CI/headless inda aka riga aka gina sqlite. | +| `OMNIROUTE_MIGRATIONS_DIR` | _(ganowa ta atomatik)_ | `src/lib/db/migrationRunner.ts` | Sauya kundin adireshin da mai gudanar da ƙaura yake bincikawa. Yana da amfani yayin tura ƙaura da aka haɗa cikin gine-gine na musamman. | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(ba a saita ba)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Ƙarin kundin adiresoshin ƙaura a matsayin shigarwar `namespace=dir` waɗanda aka raba da alamar raba hanya ta dandali (misali `ee=/opt/app/enterprise/db/migrations`). Ana rubuta fayilolin da aka samu a wurin a matsayin `-`, don haka rarrabawa da ke tura ƙaurarta ba za ta taɓa karo da guraben lambobi na upstream ba. Shigarwa mara tsari, namespace mara inganci, ko kundin adireshi da babu shi zai haifar da kuskure yayin farawa maimakon tsallake schema a ɓoye. | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Matsakaicin kariya daga tarin ƙaura masu jiran aiwatarwa (#3416). Farawa zai tsaya idan yawan ƙauran da ke jira a DB da ke akwai ya zarce wannan adadi (yana karewa daga teburin bin diddigi da aka goge). Ƙara shi don dawo da tsohon madadin bayanai; saita zuwa `0` don kashe wannan binciken. | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Kundin aikin ƙofar sakin `check:install-upgrade`. Yana buƙatar kusan 12 GB (bishiyoyin girkawa biyu na kusan ~3 GB tare da tarball), don haka bai kamata ya gudana a kan ƙaramin tmpfs ba — a kan self-hosted runner ɗin, `/tmp` tmpfs ne mai goyon bayan RAM na 12 GB, kuma ƙofar ta cika shi, ta yanke kunshin. | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(tsohuwar ƙima a cikin lamba)_ | `src/lib/spend/batchWriter.ts` | Tazarar flush (ms) ga mai rubuta kashe kuɗi/farashi na rukuni-rukuni. Ƙananan ƙimomi suna rage haɗa rubuce-rubuce; manyan ƙimomi suna rage cunkoson DB. | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(tsohuwar ƙima a cikin lamba)_ | `src/lib/spend/batchWriter.ts` | Matsakaicin adadin shigarwar kashe kuɗi da za a ajiye a buffer kafin tilasta flush. Ƙara shi a turawa masu babban QPS; rage shi idan iyakantaccen ƙwaƙwalwar ajiya ya fi muhimmanci. | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(ba a saita ba)_ | `open-sse/utils/proxyFetch.ts` | Saita zuwa `"true"` don fitar da rajistan debug na `[ProxyFetch]` a kan hanyar relay ta Vercel. A kashe yake ta tsohuwa don guje wa fallasa alamun routing. | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Saita zuwa `"true"` ko `"1"` don haɗa IP na abokin hulɗa/egress da prefix na asusu a cikin layin rajistan tsari mai cikakken bayani na `[ProxyEgress]`. Ana barinsa a KASHE ta tsohuwa domin rajistan tsarin kada ya fallasa IP ko prefix na asusu. | +| `OMNIROUTE_DEBUG` | _(ba a saita ba)_ | `bin/cli/commands/quota.mjs` | Saita zuwa `1` don buga bayanan binciken lokacin kowace buƙata (`[omniroute] GET completed in Nms`) daga umarnin quota na CLI zuwa stderr. | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(ta atomatik)_ | `scripts/dev/healthcheck.mjs` | Takamaiman hanya da duba lafiyar container ke gwadawa. Idan ba a saita ba, gwajin zai samo ta daga `OMNIROUTE_BASE_PATH`; saita ta yana sake kunna endpoint na zurfin sa-ido. | +| `OMNIROUTE_DEBUG_COMPLETION` | _(ba a saita ba)_ | `bin/cli/commands/completion.mjs` | Saita zuwa kowace ƙima marar komai don fitar da bayanan binciken `[omniroute completion]` daga hanyoyin cache na kammala umarnin shell na CLI (karantawa/sabuntawa/rubutawa). A kashe yake ta tsohuwa — waɗannan cache suna gaza a ɓoye domin cache da ya ɓace/ya lalace kada ya taɓa karya kammalawa da tab. | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | Matsakaicin lokacin sake gwadawa ga kowane abu na rukuni (ms). Abubuwan da suka wuce wannan lokaci ana yi musu alamar gazawa. | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Jinkirin asali (ms) don jan-baya na exponential a sake gwada abubuwan batch. | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | Iyakar (ms) don jan-baya na exponential tsakanin sake gwada abubuwan batch. | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Matsakaicin adadin batch da ake sarrafawa a lokaci guda. Ƙara shi don haɓaka yawan aiki; bar shi ƙasa don kauce wa cunkoson iyakance ƙimar buƙatu. | > [!IMPORTANT] -> Kafin a canza rumbun bayanai mai ɗorewa da ke akwai, mai gudanar da ƙaura yana wallafa cikakken, +> Kafin canza wata rumbun bayanai mai ɗorewa da ke akwai, mai gudanar da ƙaura yana wallafa cikakken, > snapshot mai adireshin abun ciki a ƙarƙashin `DATA_DIR/db_backups/`. Wallafawa na buƙatar tsarin fayil -> da ke goyon bayan hard links na tsarin fayil guda, marasa sake-rubutawa, tare da daidaitawar fayil mai ɗorewa. Haka kuma, mahallai na POSIX -> suna buƙatar daidaitawar kundin adireshi; a Windows, Node na iya ƙin amincewa da handles na kundin adireshi, don haka OmniRoute yana flush na +> wanda ke goyon bayan hard links marasa sake-rubutawa a tsarin fayil ɗaya tare da daidaitawar fayil mai ɗorewa. Haka kuma, masaukin POSIX +> na buƙatar daidaitawar kundin adireshi; a Windows, Node na iya ƙin karɓar handles na kundin adireshi, don haka OmniRoute yana flush na > fayil ɗin da aka wallafa kuma yana ɗaukar daidaitawar shigarwar kundin adireshi a matsayin ƙoƙari gwargwadon iko. -> Idan `DATA_DIR` da aka mount ba zai iya samar da waɗannan tabbacin ba, farawa zai tsaya cikin aminci kafin aiwatar -> da ƙaura. Matsar da `DATA_DIR` zuwa volume mai waɗannan primitives; kada a yi amfani da -> `DISABLE_SQLITE_AUTO_BACKUP` don kauce wa amincin ƙaura. +> Idan `DATA_DIR` da aka mount ba zai iya samar da waɗannan tabbacin ba, farawa zai gaza cikin aminci kafin aiwatar da +> ƙaura. Matsar da `DATA_DIR` zuwa volume mai waɗannan primitives; kada a yi amfani da +> `DISABLE_SQLITE_AUTO_BACKUP` don tsallake amincin ƙaura. ### Yanayin Amfani -| Yanayin amfani | Saituna | -| ------------------------------- | -------------------------------------------------------------------------------- | -| **Haɓakawa a gida** | Bar duk tsoffin saituna. DB yana a `~/.omniroute/omniroute.db`. | -| **Docker** | `DATA_DIR=/data` + mount volume a `/data`. | -| **An ɓoye bayanai yayin ajiya** | Saita `STORAGE_ENCRYPTION_KEY` + adana madadin key ɗin! Rasa shi = rasa bayanai. | -| **CI/Gwaji** | `DATA_DIR=/tmp/omniroute-test` — na ɗan lokaci ne, ba a buƙatar encryption. | +| Yanayin Amfani | Saituna | +| ----------------------- | -------------------------------------------------------------------------------- | +| **Haɓakawa a gida** | Bar duk tsoffin saituna. DB tana a `~/.omniroute/omniroute.db`. | +| **Docker** | `DATA_DIR=/data` + mount volume a `/data`. | +| **An ɓoye yayin ajiya** | Saita `STORAGE_ENCRYPTION_KEY` + adana kwafen maɓallin! Rasa shi = rasa bayanai. | +| **CI/Gwaji** | `DATA_DIR=/tmp/omniroute-test` — na wucin gadi ne, ba a buƙatar ɓoyewa. | --- @@ -211,49 +210,50 @@ OmniRoute yana amfani da **SQLite** (ta hanyar `better-sqlite3`) don duk wani ad --- -## 4. Tsaro & Tantancewa - -| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt da ake haɗawa da masu gano kayan aiki domin ƙirƙirar sawun yatsa na na’ura. Canja shi ga kowane turawa domin keɓewa. | -| `OMNIROUTE_CLI_SALT` | _(ba a saita ba = salt na bazuwar da ake ƙirƙira a kowane girkawa kuma a adana a `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Salt na HMAC don samar da token ɗin tantancewar CLI na gida. Saita wannan ƙimar yana sauya duk token ɗin CLI da ke kan na’urar kuma koyaushe yana da fifiko kan salt ɗin da aka adana. Duba `docs/security/CLI_TOKEN.md`. | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Yana saita tutar `Secure` a kan cookies na zaman aiki. **Dole ne ya zama `true`** yayin aiki a bayan HTTPS. | -| `REQUIRE_API_KEY` | `false` | Tsakiyar manhajar API | Idan `true`, duk buƙatun proxy na `/v1/*` dole ne su ƙunshi ingantaccen maɓallin API. | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Yana ba da damar bayyana cikakkun ƙimomin maɓallin API a cikin mahaɗin Dashboard. Ana iya saita shi daga Dashboard Feature Flags; yana haifar da haɗarin tsaro a kan instans ɗin da ake rabawa. | -| `NO_LOG_API_KEY_IDS` | _(fanko)_ | `src/lib/compliance/index.ts` | ID na maɓallan API da aka raba da waƙafi waɗanda ba a rubuta buƙatunsu cikin log (don bin ƙa’idar GDPR). | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(ba a saita ba = babu iyaka)_ | `src/shared/utils/apiKeyPolicy.ts` | Kasafin buƙatu na kowace rana da ake amfani da shi a matsayin madadi ga maɓallan API waɗanda ginshiƙin `rate_limits` nasu yake null. Idan ba a saita ba ko yana fanko: babu iyakar da aka ɗora kai tsaye (#2289, #11017). `0` ma yana nufin haka (babu iyaka). Cikakken lamba tabbatacce N yana ba da damar N/rana, 5N/mako, 20N/wata. Ƙimomi marasa inganci da ba fanko ba suna komawa ga tsoffin iyakokin 1000/rana, 5000/mako, 20000/wata. | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Matsakaicin girman jikin buƙata da aka yarda da shi. Yana ƙin payload ɗin da ya wuce wannan iyaka. | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Ainihin jikin buƙata da ya kai ko ya wuce wannan ma’auni yana karɓar hayar shigar da aiki mai nauyi ta atomatik a cikin tsarin gida kafin warware JSON (hanyar BYTE, ciki har da `POST /v1/responses`). Yana da hanyar kaucewa iri ɗaya ta [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) idan akwai isasshen sarari mai lafiya kamar na tsari mai nauyi; har yanzu `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) ne ke iyakance shi don kada [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ya sake faruwa. | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Tsayayyar iyakar hanyar taɗi da ake tilasta wa adadin bytes da aka karanta yayin karɓa mai iyaka, ciki har da buƙatun da ba su da `Content-Length`, ko wanda ba shi da inganci, ko wanda bai faɗi gaskiya ba; abin da ya wuce iyakar yana karɓar `413`. | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(ba a saita ba — babu iyakar adadin buƙatu)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** wannan tsohuwar iyakar ADADIN buƙatu yanzu tana aiki ne kawai idan an saita ta kai tsaye. Idan aka bar ta ba a saita ba (tsohon zaɓi), karɓar hirar mai nauyi a maimakon haka ana sarrafa ta da `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — kasafin BYTE da ake samarwa ta atomatik bisa ainihin iyakar ƙwaƙwalwar tsarin a cikin **process guda ɗaya** (V8 heap guda ɗaya). Buƙatun `/v1/responses` guda biyu masu cin karo, kowannensu da kusan token 750k, suna katse heap na kusan 12 GiB (#7849) — wannan gargadin **kasafin ƙwaƙwalwa** ne, ba tsayayyar iyakar samfur ta 2 ba. Process mai lafiya (heap yana ƙasa da shed ratio) ZAI IYA karɓar ƙarin dogayen `/v1/responses` masu gudana lokaci guda ta hanyar `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Yawan dogayen abokan SSE (40–50) ya shafi heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ba “iyaka 2” ba. Ƙara wannan kawai don “amfani da host” ba tare da nazari ba zai sake dawo da #7849. Ninka **heaps** ta amfani da **`DATA_DIR`s`masu zaman kansu guda N** (#11024); kada a taɓa amfani da`replicas>1` a kan fayil ɗin SQLite guda ɗaya. | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(ana samarwa ta atomatik)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** saitin maye gurbin kasafin byte na shigarwa da ake samarwa ta atomatik (25% na mafi ƙanƙantar iyakar ƙwaƙwalwar V8/cgroup, a raba da faɗaɗawar wucin gadi ta 8x). Ana taƙaita ƙimomin da aka samar da waɗanda aka saita kai tsaye zuwa 8 MiB–2 GiB. Body da ya fi kasafin da yake aiki girma zai gaza nan take da `413 body_exceeds_budget`; takara tsakanin bodies waɗanda kowannensu za a iya sarrafawa tana ci gaba da ba da damar sake gwadawa da `503`. Abokan SSE dogaye 40–50 masu gudana lokaci guda sun dogara da wannan kasafin + heap, ba tsayayyar “iyaka 2” ba. Karanta `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` a `/api/monitoring/health` kafin daidaitawa. | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Shed ratio na matsin heap (`heapUsed / heap_size_limit`) don karɓar buƙatu masu nauyin BYTE da STRUCTURE (#10183, #10268, #10437). Ana ƙin karɓar buƙata mai nauyi da ke gudana lokaci guda bayan `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` da `503` mai ba da damar sake gwadawa ne kawai idan heap SHIMA ya kai ko ya wuce wannan ratio; idan heap yana da lafiya, ana karɓar ta ta hanyar healthy-headroom maimakon haka. | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (tsohon zaɓi `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Iyakantacciyar ƙarin iya aiki don healthy-heap fast path (#10437) a kan **dukansu** STRUCTURE da BYTE (`admitChatRequest`, ciki har da bodies ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ba tare da wannan iyaka ba, kowace buƙata mai aiki sosai amma heap ɗinta yana da lafiya tana tsallake tsarin karɓa ba tare da wata iyaka ba. Da zarar adadin leases masu gudana lokaci guda ta hanyar healthy-heap path ya kai wannan adadi, sauran buƙatu masu aiki sosai za su koma zuwa HANYAR jira mai iyaka/ƙin karɓa ƊAYA da ake amfani da ita a ƙarƙashin ainihin matsin heap. `0` yana kashe wannan hanyar tsallakewa gaba ɗaya. | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Adadin saƙonnin da ke sanya buƙatar hira a matsayin mai nauyi ko da body ɗinta yana ƙasa da iyakar byte. | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Adadin tools da ke sanya buƙatar hira a matsayin mai nauyi ko da body ɗinta yana ƙasa da iyakar byte. | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Ƙiyasin token na tsawon string mai taka-tsantsan wanda ke sanya buƙata a matsayin mai nauyi; wannan wakilin kuɗin karɓa ne, ba tokenization na cajin provider ba. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (an kashe) | `src/shared/middleware/chatBodyAdmission.ts` | Iyakar tarihin hira ta zaɓi. An kashe ta ta tsohon zaɓi: adadin saƙonni manufar deployment ne, ba siffar gama-gari ta buƙata ba, kuma sanya iyaka a nan yana ƙin tattaunawa da `413` na ƙarshe kafin compression pipeline ta iya sa a sarrafa su. Ana iyakance haɓakar heap ta `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` da ƙin karɓa saboda matsin heap. Saita ƙima mai kyau a deployments masu ƙarancin ƙwaƙwalwa waɗanda ke buƙatar tsayayyar iyaka; abin da ya wuce zai karɓi `413` mai tsari da ke buƙatar taƙaitawa. | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Tsayayyar iyaka ga upstream response marar streaming da ake tara gaba ɗaya a ƙwaƙwalwa. Bayan wannan ana soke upstream reader kuma buƙatar tana gaza nan take maimakon ci gaba da ƙara string marar iyaka har heap ya ƙare. | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Matsakaicin wire bytes da ake tura wa daga upstream response headers. Idan an wuce kasafin, ana watsar da headers masu ƙarancin fifiko (misali, na musamman `x-codex-*`, `x-oai-request-id`) don kasancewa cikin iyakokin header na reverse-proxy da aka saba amfani da su. Saita shi sama don tura ƙarin upstream metadata, tare da karɓar ƙarin girman response header. | -| `CORS_ORIGIN` | _(ba a saita ba)_ | `src/server/cors/origins.ts` | Jerin izinin CORS na asali guda ɗaya na tsohon tsari. A sabbin turawa, a fi son `CORS_ALLOWED_ORIGINS`. CORS na abokan hulɗar API na burauza masu amfani daga wani asali ne kawai; rubuce-rubucen dashboard da aka tantance suna amfani da buƙatun asali ɗaya tare da kariyar CSRF da aka ɗaure da zaman maimakon haka. | -| `CORS_ALLOWED_ORIGINS` | _(ba a saita ba)_ | `src/server/cors/origins.ts` | Jerin izinin CORS da aka raba da wakafi. Ba a aika wildcard sai an saita `CORS_ALLOW_ALL=true` a sarari. | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Hanyar kaucewa ta yanayin haɓakawa kawai don maimaita kowane `Origin` na burauza. Kada a kunna a turawa da ake rabawa ko na samarwa. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Toshe kiran masu samarwa da ke nufin kewayon IP na sirri/loopback/link-local. A kashe kawai a muhallan gwaji da aka keɓe. | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Ba da izinin URLs na masu samarwa da ke nuni zuwa hanyoyin sadarwa na sirri/na gida (localhost, 192.168.x.x, 10.x.x.x, da sauransu). **ANA BUKATA ga masu samarwa da aka karɓi bakuncinsu da kai** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Idan `false`, dashboard zai ƙi tabbatar da URLs na gida. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Ba da izinin ƙara/tabbatar da masu samarwa a adireshin gida/na sirri (127.0.0.1, localhost, LAN, kewayon sirri) — an iyakance shi ga hanyar tabbatar da mai samarwa. **Tsoho `true`** (gida-farko); saita `false` don tilasta tsauraran toshewa ga waɗanda ba na jama'a ba. Ana ci gaba da toshe wuraren ƙarshen metadata na cloud (169.254.169.254, metadata.google.internal) ko da menene. (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Bari hanyoyin `/v1/audio/*` (rubuta sauti, magana, fassara) su yi amfani da node na mai samarwa mai dacewa da OpenAI wanda aka karɓi bakuncinsa a wajen localhost. A kashe yake ta tsohuwa — tura sauti zuwa mai masaukin nesa yana canza asalin fitar bayanai kuma dole ya zama takamaiman shawarar mai gudanarwa. Ana ba da izini ga nodes na loopback/na sirri (localhost, 127.0.0.1, 172.16-31.x) koyaushe kuma wannan ba ya shafarsu. (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Lokacin da aka kunna OIDC, kashe shiga da kalmar sirri domin masu amfani su iya tantance kansu ta hanyar OIDC Single Sign-On kawai. Haka kuma ana karɓar ɗanyen laƙabi `OIDC_DISABLE_PASSWORD_LOGIN`; Dashboard Feature Flag mai maɓalli iri ɗaya yana da fifiko. (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Ɗanyen laƙabi na `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | +## 4. Tsaro & Tabbatar da Shaida + +| Variable | Tsoho | Fayil ɗin Tushe | Bayani | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt da ake haɗawa da masu gano kayan masarufi domin samar da sawun na’ura. Canza shi ga kowane turawa domin warewa. | +| `OMNIROUTE_CLI_SALT` | _(ba a saita ba = salt na bazuwar da ake ƙirƙira ga kowane shigarwa kuma a adana a `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC salt don samar da alamar tantancewar CLI ta gida. Saita wannan ƙimar yana sauya dukkan alamomin CLI da ke kan na’urar, kuma koyaushe yana da fifiko a kan salt ɗin da aka adana. Duba `docs/security/CLI_TOKEN.md`. | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Yana saita tutar `Secure` a kan kukis na zama. **Dole ne ya zama `true`** lokacin aiki a bayan HTTPS. | +| `REQUIRE_API_KEY` | `false` | API middleware | Idan `true`, dole ne duk buƙatun wakili na `/v1/*` su ƙunshi ingantaccen maɓallin API. **Wannan tutar ba ta ƙuntata `GET /v1/models`**, wanda maimakon haka yana bin tsarin shiga na dashboard (`requireAuthForModels`) — saboda haka, samun `401` daga `/v1/models` BA ya nufin cewa inference yana da kariya. Duba `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Yana ba da damar bayyana cikakkun ƙimomin maɓallin API a cikin UI na Dashboard. Ana iya daidaita shi daga Dashboard Feature Flags; yana da haɗarin tsaro a kan instances da ake amfani da su tare. | +| `NO_LOG_API_KEY_IDS` | _(fanko)_ | `src/lib/compliance/index.ts` | IDs na maɓallan API da aka raba da waƙafi waɗanda ba a rubuta buƙatunsu a log ba (bin ƙa’idojin GDPR). | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(ba a saita ba = babu iyaka)_ | `src/shared/utils/apiKeyPolicy.ts` | Kasafin buƙatu na kowace rana da ake amfani da shi a matsayin madadin ga maɓallan API waɗanda ginshiƙin `rate_limits` ɗinsu yake null. Idan ba a saita ba ko fanko ne: babu iyakar da ake ɗauka kai tsaye (#2289, #11017). `0` ma haka yake (babu iyaka). Cikakkiyar lamba mai kyau N tana ba da damar N/rana, 5N/mako, 20N/wata. Ƙimomi marasa tsari waɗanda ba fanko ba suna komawa ga tsoffin tagogin 1000/rana, 5000/mako, 20000/wata. | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Matsakaicin girman jikin buƙata da aka amince da shi. Yana ƙin payloads da suka wuce wannan iyaka. | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Ainihin jikin buƙata da ya kai ko ya wuce wannan ma’auni yana ɗaukar atomic process-local heavyweight admission lease kafin a yi parsing na JSON (hanyar BYTE, ciki har da `POST /v1/responses`). Yana amfani da hanyar tserewa ta healthy-headroom iri ɗaya da structure-heavy ta [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437); har yanzu `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) suna iyakance shi domin kada [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ya sake faruwa. | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Matsakaicin iyaka mai tsauri na hanyar taɗi, wanda ake tilastawa bisa adadin bytes da aka karanta yayin karɓa mai iyaka, har da buƙatun da ba su da `Content-Length`, ko suke da wanda ba daidai ba ko na yaudara; wanda ya wuce iyaka yana karɓar `413`. | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(ba a saita ba — babu iyakar adadin buƙatu)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** wannan tsohuwar iyakar ADADIN buƙatu yanzu tana aiki ne kawai idan an saita ta a bayyane. Idan ba a saita ta ba (abin da yake tsoho), maimakon haka ana sarrafa karɓar manyan buƙatun taɗi da `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — kasafin BYTE da ake ƙirƙira ta atomatik daga ainihin iyakar ƙwaƙwalwar tsarin a cikin **process guda ɗaya** (V8 heap guda ɗaya). Buƙatun `/v1/responses` biyu masu cin karo, kowannensu kusan token 750k, suna rushe heap na kusan 12 GiB (#7849) — wannan gargadin **kasafin ƙwaƙwalwa** ne, ba matsakaicin iyakar samfur mai tsauri ta 2 ba. Process mai lafiya (heap yana ƙasa da shed ratio) NA IYA karɓar ƙarin dogayen `/v1/responses` masu gudana lokaci guda ta `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Dubban goma na dogayen abokan cinikin SSE (40–50) ya shafi heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, ba “matsakaici 2” ba. Ƙara wannan ba tare da nazari ba domin “amfani da host” yana sake jawo #7849. Ninka **heaps** da **`DATA_DIR` masu zaman kansu N** (#11024); kada a taɓa amfani da `replicas>1` a kan fayil ɗin SQLite guda ɗaya. | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(ana ƙirƙira ta atomatik)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** maye gurbin kasafin bytes na karɓa da ake ƙirƙira ta atomatik (25% na mafi ƙanƙantar iyakar ƙwaƙwalwar V8/cgroup, a raba da ninkawar wucin-gadi 8x). Ana taƙaita ƙimomin da aka ƙirƙira da waɗanda aka saita kai tsaye zuwa 8 MiB–2 GiB. Body da ya fi kasafin da ke aiki girma yana gaza nan take da `413 body_exceeds_budget`; cunkoso tsakanin bodies da kowannensu za a iya sarrafa shi daban yana ci gaba da zama abin sake gwadawa da `503`. Dogayen abokan cinikin SSE 40–50 masu gudana lokaci guda ya shafi wannan kasafi + heap, ba matsakaicin iyaka mai tsauri ta “2” ba. Karanta `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` a `/api/monitoring/health` kafin daidaitawa. | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Shed ratio na matsin heap (`heapUsed / heap_size_limit`) don karɓar manyan buƙatun BYTE da STRUCTURE (#10183, #10268, #10437). Ana shed na buƙata mai nauyi da ke gudana lokaci guda bayan `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` tare da `503` mai yiwuwa a sake gwadawa ne kawai idan heap SHIMA ya kai ko ya wuce wannan ratio; idan heap yana lafiya, ana karɓar ta ta healthy-headroom maimakon haka. | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (tsoho `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Ƙarin ƙarfin da aka iyakance don hanyar gaggawa ta healthy-heap (#10437) a kan **dukansu** STRUCTURE da BYTE (`admitChatRequest`, har da bodies ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Ba tare da wannan iyaka ba, kowace buƙata mai aiki sosai amma heap ɗinta yana lafiya tana tsallake tsarin karɓa ba tare da iyaka ba. Da zarar wannan adadin leases masu gudana lokaci guda ya fara aiki ta hanyar healthy-heap, ƙarin buƙatu masu aiki sosai suna komawa kan hanyar jira mai iyaka/shed ƊAYA da ake amfani da ita ƙarƙashin ainihin matsin heap. `0` yana kashe tsallakewar gaba ɗaya. | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Adadin saƙonni da ke rarraba buƙatar taɗi a matsayin mai nauyi ko da body ɗinta yana ƙasa da iyakar bytes. | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Adadin tools da ke rarraba buƙatar taɗi a matsayin mai nauyi ko da body ɗinta yana ƙasa da iyakar bytes. | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Ƙiyasin token mai taka-tsantsan bisa girman string wanda ke rarraba buƙata a matsayin mai nauyi; wannan wakilin kuɗin karɓa ne, ba tokenization na lissafin kuɗin provider ba. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (a kashe) | `src/shared/middleware/chatBodyAdmission.ts` | Iyakar tarihin taɗi ta zaɓi. A kashe take ta tsohuwa: adadin saƙonni manufofin deployment ne, ba siffar gama-gari ta buƙata ba, kuma sanya iyaka a nan yana ƙin tattaunawa da `413` na ƙarshe kafin pipeline na compression ya iya sa a sarrafa su. Ana iyakance haɓakar heap ta `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` da shed na matsin heap. Saita ƙima mai kyau a deployments masu ƙarancin ƙwaƙwalwa waɗanda ke buƙatar iyaka mai tsauri; wanda ya wuce iyaka zai karɓi `413` mai tsari da ke nuna ana buƙatar taƙaitawa. | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Matsakaicin iyaka mai tsauri ga response na upstream mara streaming da ake adana gaba ɗayansa a ƙwaƙwalwa. Bayan wannan, ana soke upstream reader kuma buƙatar tana gaza nan take maimakon ci gaba da haɓaka string marar iyaka har heap ya ƙare. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Matsakaicin adadin bytes na hanyar sadarwa da ake turawa daga headers na martanin tushen sama. Idan an wuce wannan kasafi, ana cire headers masu ƙarancin fifiko (misali, `x-codex-*`, `x-oai-request-id`) domin kasancewa cikin iyakokin headers na reverse-proxy da aka saba amfani da su. Saita ƙima mafi girma domin tura ƙarin metadata daga tushen sama, amma hakan zai ƙara girman headers na martani. | +| `CORS_ORIGIN` | _(ba a saita ba)_ | `src/server/cors/origins.ts` | Tsohon jerin izinin CORS na asali guda ɗaya. Fi son `CORS_ALLOWED_ORIGINS` don sabbin turawa. CORS na abokan hulɗar API na burauza masu ketare-asali ne kawai; rubuce-rubucen dashboard da aka tabbatar da izini suna amfani da buƙatun asali ɗaya tare da kariyar CSRF mai alaƙa da zaman maimakon haka. | +| `CORS_ALLOWED_ORIGINS` | _(ba a saita ba)_ | `src/server/cors/origins.ts` | Jerin izinin CORS da waƙafi ya raba. Ba a aika wildcard sai an saita `CORS_ALLOW_ALL=true` a sarari. | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Mafita ta musamman don yanayin haɓakawa kawai, wadda ke maimaita kowane `Origin` na burauza. Kada a kunna ta a turawa na gama-gari ko na samarwa. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | Toshe kiran masu samarwa da ke nufin kewayon adiresoshin IP masu zaman kansu/loopback/link-local. Kashe wannan kawai a keɓantattun muhallan gwaji. | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | Ba da damar URLs na masu samarwa da ke nuni zuwa cibiyoyin sadarwa masu zaman kansu/na cikin gida (localhost, 192.168.x.x, 10.x.x.x, da sauransu). **ANA BUƘATAR wannan don masu samarwa da ake masaukinsu da kai** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG). Lokacin da yake `false`, dashboard yana ƙin tabbatar da URLs na cikin gida. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | Ba da damar ƙara/tabbatar da masu samarwa a adiresoshin cikin gida/masu zaman kansu (127.0.0.1, localhost, LAN, kewayon masu zaman kansu) — an iyakance wannan ga hanyar tabbatar da mai samarwa. **Tsoho `true`** (na cikin gida da farko); saita `false` don tilasta tsauraran toshewa ga duk abin da ba na jama'a ba. Ana ci gaba da toshe endpoints na metadata na gajimare (169.254.169.254, metadata.google.internal) ko da menene. (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Ba hanyoyin `/v1/audio/*` (rubuta sauti zuwa rubutu, magana, fassara) damar amfani da node na mai samarwa mai dacewa da OpenAI wanda aka masaukinsa a wajen localhost. A kashe yake ta tsohuwa — tura sauti zuwa remote host yana canza shaidar egress kuma dole ne ya zama shawara bayyananniya ta mai gudanarwa. Ana ba da damar nodes na loopback/masu zaman kansu (localhost, 127.0.0.1, 172.16-31.x) koyaushe kuma wannan ba ya shafarsu. (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Ba `POST /v1/rerank` (da matakin sake-jera na loopback na injin ƙwaƙwalwa) damar amfani da node na mai samarwa mai dacewa da OpenAI wanda aka masaukinsa a wajen localhost — na'urar LAN ko takwaran Tailscale da ke gudanar da TEI, Infinity, vLLM, da sauransu. A kashe yake ta tsohuwa — turawa zuwa remote host yana canza shaidar egress kuma dole ne ya zama shawara bayyananniya ta mai gudanarwa. Ana ba da damar nodes na loopback (localhost, 127.0.0.1, 172.16-31.x) koyaushe kuma wannan ba ya shafarsu. Dole ne nodes na nesa su kuma bi manufofin URL na waje na mai samarwa (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); ba a taɓa tura buƙata zuwa hosts na metadata na gajimare ba. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Lokacin da aka kunna OIDC, kashe shiga da kalmar sirri domin masu amfani su iya tabbatar da kansu ta hanyar OIDC Single Sign-On kawai. Ana kuma karɓar alias ɗin kai tsaye `OIDC_DISABLE_PASSWORD_LOGIN`; Dashboard Feature Flag mai wannan key ɗin yana da fifiko. (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias na kai tsaye na `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | ### Jerin Binciken Ƙarfafa Tsaro ```bash # Mafi ƙarancin tsaron samarwa: AUTH_COOKIE_SECURE=true # Yana buƙatar HTTPS -REQUIRE_API_KEY=true # Tantance duk kiran proxy -ALLOW_API_KEY_REVEAL=false # Kada a taɓa bayyana maɓallai a UI +REQUIRE_API_KEY=true # Tabbatar da duk kiran proxy +ALLOW_API_KEY_REVEAL=false # Kada a taɓa fallasa keys a UI CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # Iyakar 5 MB +MAX_BODY_SIZE_BYTES=5242880 # Iyaka ta 5 MB ``` --- @@ -299,61 +299,68 @@ OmniRoute yana samar da kariya mai matakai biyu: binciken kutse a ɓangaren buƙ --- -## 6. Manufofin Kayan Aiki da Tura Buƙatu - -| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Yana sarrafa damar LLM ta amfani da kayan aiki/kiran ayyuka. `allowlist` = kayan aikin da aka jera kawai, `denylist` = duk sai waɗanda aka jera, `disabled` = babu ƙuntatawa. | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Hanya zuwa fayil ɗin JSON na ƙa’idojin sarrafa payload (gyare-gyaren upstream bisa kowane samfuri/protocol). | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Tazarar sake lodawa (ms) domin sake loda fayil ɗin ƙa’idojin payload kai-tsaye. Mafi ƙaranci `1000`. | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Zaɓi na son rai: tura ID na samfurin `claude-*` marasa prefix daga abokan hulɗar Claude Code ta asusun OAuth na Claude Code maimakon buƙatar prefix na mai samarwa. Har yanzu takamaiman prefix na mai samarwa ne ke da fifiko. Haka kuma ana iya saita wannan ta maɓallin kunnawa/kashewa a dashboard da ke shafin mai samar da Claude. | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Iyakar gudanarwa lokaci guda ga kowane samfuri don haɗe-haɗen round-robin (#9100). An ɗaure semaphore na haɗin round-robin zuwa iyakar buƙatu 3 da ke gudana lokaci guda ga kowane samfuri ba tare da damar sauyawa ba, wanda ke sa zirga-zirgar da ke da yawan gudanarwa lokaci guda jira a bayan wannan iyaka. Ana tabbatar da cewa yana `>= 1`, kuma ana iyakance shi zuwa `<= 32`. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Zaɓi na son rai mai haɗari wanda ke tsallake binciken OmniRoute na cikin gida kan context-window / max-input-token don buƙatun kai-tsaye na samfuri guda. Har yanzu masu samar da upstream suna tilasta ainihin iyakokinsu; matse prompt da iyakar output-token ta samfurin kansa suna ci gaba da aiki. Tsarin fifiko mai tasiri shi ne maye gurbin Feature Flags DB > sauyin muhalli > tsohon ƙima; ba a buƙatar sake farawa. | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(ba a saita ba)_ | `open-sse/services/conversationTracker.ts` | Saita `1` don dakatar da tattara tarihin tattaunawa. `resolveConversationId()` yana mayar da sakamakon da ba a bibiyarsa kafin ya karanta SQLite ko ya fassara tarihin saƙonni, kuma hakan ya haɗa da ID na zaman da abokin hulɗa ya bayar. Gudanar da zaman tura buƙatu bai canza ba, kuma ba a share bayanan da ake da su. Wannan ya dace da aiwatarwar da ba sa amfani da kallon tattaunawa na dashboard kuma suke son teburin zagayen tattaunawa ya daina ƙaruwa. | +## 6. Manufofin Kayan Aiki & Daidaita Hanya + +| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | +| ----------------------------------------------------------- | -------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Yana sarrafa damar LLM ta amfani da kayan aiki/kiran ayyuka. `allowlist` = kayan aikin da aka jera kawai, `denylist` = duk sai waɗanda aka jera, `disabled` = babu ƙuntatawa. | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Hanyar zuwa fayil ɗin JSON na ƙa’idojin sarrafa payload (gyare-gyaren upstream na kowane samfuri/protocol). | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Tazarar sake lodawa (ms) don sake loda fayil ɗin ƙa’idojin payload kai tsaye. Mafi ƙaranci `1000`. | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Zaɓin da ake kunnawa: a tura ID na samfuran `claude-*` marasa prefix daga abokan cinikin Claude Code ta asusun OAuth na Claude Code maimakon buƙatar prefix na mai samarwa. Takamaiman prefix na mai samarwa har yanzu suna da fifiko. Haka kuma ana iya saita shi ta maɓallin sauyawa a dashboard da ke shafin mai samar da Claude. | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Iyakar ayyukan lokaci guda ga kowane samfuri don haɗe-haɗen round-robin (#9100). An tsayar da semaphore na haɗin round-robin kai tsaye a buƙatu 3 na lokaci guda ga kowane samfuri ba tare da damar sauyawa ba, wanda ke jera zirga-zirgar da ke da yawan ayyuka lokaci guda a bayan wannan iyaka. Ana tabbatar da shi zuwa `>= 1`, kuma a taƙaita shi zuwa `<= 32`. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Zaɓi mai haɗari wanda ke tsallake binciken OmniRoute na gida kan context-window / matsakaicin token na shigarwa don buƙatun samfuri guda kai tsaye. Masu samar da upstream har yanzu suna tilasta ainihin iyakokinsu; matse prompt da iyakar token na fitarwa ta samfurin kansa suna ci gaba da aiki. Tsarin fifikon da ake amfani da shi shi ne sauyin Feature Flags DB > environment variable > tsoho; ba a buƙatar sake farawa. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(ba a saita ba)_ | `open-sse/services/selfHostedEntry.ts` | Takardar YAML ta `providers:` a cikin layi (RIC-738, D4). Idan an saita (tare da ko ba tare da ɓangaren `strategy:` ba), `/v1/chat/completions` yana karkata zuwa shigarwar OpenAI-compatible mai haɗaka da aka karɓi bakuncinta da kai maimakon cloud pipeline. Idan ba a saita ba (tsoho): hanyar tana wucewa kai tsaye zuwa cloud pipeline da ake da shi. Duba `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(ba a saita ba)_ | `open-sse/services/selfHostedEntry.ts` | Hanyar zuwa fayil ɗin YAML da ke ɗauke da takardar `providers:` iri ɗaya da `OMNIROUTE_SELF_HOSTED_PROVIDERS`, don deployment da suka fi son fayil maimakon inline env var. Kowanne daga cikinsu yana kunna shigarwar da aka karɓi bakuncinta da kai. | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(ba a saita ba — hanya a buɗe)_ | `open-sse/services/selfHostedEntry.ts` | Maɓallin API na bai ɗaya na zaɓi don shigarwar da aka karɓi bakuncinta da kai mai haɗaka (D5 scaffold, an tanada shi don tsarin quota na kowane maɓalli). Idan an saita, dole ne buƙatu su ƙunshi `Authorization: Bearer `. Idan ba a saita ba: hanyar tana buɗe, daidai da tsarin local-provider da aka karɓi bakuncinsa da kai da ake da shi (deployment na loopback/amintacciyar hanyar sadarwa). | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(ba a saita ba)_ | `open-sse/services/routingStrategies.ts` | Takardar YAML ta `strategy:` a cikin layi don injin daidaita hanya mai tabbataccen sakamako (M2/RIC-740, D3) — blacklist/whitelist, cooldown breaker, fifikon farashi, la’akari da latency, jerin fallback. Tana rinjayar ɓangaren `strategy:` na cikin layi da aka saka a cikin `OMNIROUTE_SELF_HOSTED_PROVIDERS`, ga kowane maɓalli. Duba `docs/routing/DETERMINISTIC_ROUTING.md`. | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(ba a saita ba)_ | `open-sse/services/routingStrategies.ts` | Hanyar zuwa fayil ɗin YAML da ke ɗauke da takardar `strategy:` iri ɗaya da `OMNIROUTE_SELF_HOSTED_STRATEGY`, don deployment da suka fi son fayil maimakon inline env var. | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(ba a saita ba)_ | `open-sse/services/conversationTracker.ts` | Saita zuwa `1` don dakatar da tattara tarihin tattaunawa. `resolveConversationId()` yana mayar da sakamakon da ba a bibiyarsa kafin ya karanta SQLite ko ya tantance tarihin saƙonni, kuma wannan ya haɗa da ID na zaman da abokin ciniki ya bayar. Gudanar da zaman routing bai canza ba, kuma ba a share bayanan da ake da su. Wannan ya dace da deployments waɗanda ba sa amfani da kallon tattaunawa na dashboard kuma suke son hana turn table ci gaba da girma. | --- -## 7. URLs & Aiki Tare da Cloud - -| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL na gefen uwar garke wanda ayyukan aiki tare na ciki za su kira `/api/sync/cloud` da shi. A bar wannan a matsayin URL na loopback/container ko da ana wakiltar manhajar ga jama'a ta hanyar proxy. | -| `CLOUD_URL` | _(babu komai)_ | `src/lib/cloudSync.ts` | URL na ƙarshen hanyar isar da bayanai ta cloud (fasalin kuɗi). | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Iyakar lokacin HTTP don buƙatun aiki tare da cloud. | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Tsarin ginawa na Webpack | Bayanan martabar lokacin ginawa (saita zuwa `minimal` don cire kayayyaki masu gata gaba ɗaya daga bundle). | -| `OMNIROUTE_STANDALONE_DIR` | _fitarwa ta standalone ta .build/_ | `scripts/build/colocate-standalone.mjs` | Sauyin lokacin ginawa don kundin adireshin fitarwa na standalone wanda matakin haɗa-wuri bayan ginawa ke amfani da shi. Ba saitin lokacin gudanarwa ba ne. | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(babu komai)_ | `src/lib/cloudSync.ts` | Sirrin da aka raba wanda ake amfani da shi don tabbatar da sa hannun HMAC-SHA256 na martanin Cloud Sync. | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Saita zuwa `true` don bai wa ƙarshen hanyar Cloud Sync damar sake rubuta bayanan shiga na cikin gida. Tsohon ƙima shi ne `false`. | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Saita zuwa `true` don ƙin karɓar martanin Cloud Sync marar sa hannu idan ba a saita wani sirri na cikin gida ba (#13679). Duk sa hannun da yake nan ana tabbatar da shi koyaushe — kuma ana ƙin karɓarsa koyaushe idan ba a saita `OMNIROUTE_CLOUD_SYNC_SECRET` ba — ba tare da la'akari da wannan tuta ba. Tsohon ƙimar zai koma tilas a v3.9. | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Saita zuwa `true` don komawa ga halayyar mataki ɗaya ta v3.8.5 ta "shigo da komai" ba tare da tabbatarwar mai amfani ba. | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Allon Sarrafawa, aiki tare | URL da jama'a ke gani don OAuth redirect_uri, hanyoyin haɗin Allon Sarrafawa, da URLs na jama'a da aka samar. Saita wannan zuwa URL na jama'a mai dorewa idan kiran-baya na OAuth ko hanyoyin haɗin burauza da aka samar dole ne su yi amfani da daidaitaccen mai masaukin reverse-proxy. | -| `NEXT_PUBLIC_CLOUD_URL` | _(babu komai)_ | Gefen abokin ciniki | Madubin gefen abokin ciniki na `CLOUD_URL`. | -| `NEXT_PUBLIC_APP_URL` | _(ba a saita ba)_ | `src/shared/services/cloudSyncScheduler.ts` | Tsohon madadin `NEXT_PUBLIC_BASE_URL`. | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(ba a saita ba)_ | Mai warware asalin jama'a, URL na hotuna | Asalin OmniRoute da burauza ke iya isa wanda ke da fifiko mafi girma, kuma ake amfani da shi wajen samar da URL na jama'a da tabbatar da asalin burauza wanda ba na dashboard ba. Saita wannan idan OpenWebUI ko wani relay yana isa ga OmniRoute ta URL na ciki amma dole ne burauzar mai amfani ta ɗauko kafafen da aka samar daga LAN, tunnel, ko asalin jama'a. **Kada** a haɗa `/v1`. | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(ba a saita ba)_ | `open-sse/config/providerPluginManifestUrl.ts` | Cikakken URL na manifest ɗin plugin na provider da ake sanar da abokan cinikin sidecar. Idan ba a saita ba, OmniRoute yana samo `/api/v1/provider-plugin-manifest` daga asalin buƙata ko HOST/PORT. | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocol da ake amfani da shi lokacin samo URL na manifest ɗin plugin na provider daga HOST/PORT ba tare da asalin buƙata ba. Saita shi zuwa `https` a bayan proxy na jama'a mai ƙare TLS idan ba a saita takamaiman `OMNIROUTE_PROVIDER_MANIFEST_URL` ba. | -| `OMNIROUTE_TRUST_PROXY` | _(ba a saita ba)_ | `src/server/origin/publicOrigin.ts` | Yanayin amincewa na zaɓi don headers na asalin jama'a da aka tura. Ba a saita ba = kada a amince da `Forwarded` / `X-Forwarded-*` wajen yanke shawarar tsaro. `true` / `loopback` yana amincewa da host/proto da aka tura kawai daga proxy na loopback mai tambarin token. `private` / `lan` kuma yana amincewa da takwarorin proxy na LAN mai zaman kansa. A production, an fi son takamaiman `NEXT_PUBLIC_BASE_URL`. | -| `KIE_CALLBACK_URL` | _(ba a saita ba)_ | `open-sse/utils/kieTask.ts` | URL na callback na jama'a don ayyukan kie.ai masu gudana ba tare da jiran sakamako ba. Shi ne override mafi fifiko kafin `OMNIROUTE_KIE_CALLBACK_URL` da `OMNIROUTE_PUBLIC_URL`. | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(ba a saita ba)_ | `open-sse/utils/kieTask.ts` | Wata hanyar rubuta `KIE_CALLBACK_URL`. Ana komawa gare shi idan ba a saita babban variable ɗin ba. | -| `OMNIROUTE_PUBLIC_URL` | _(ba a saita ba)_ | `open-sse/utils/kieTask.ts` | Asalin jama'a da ake amfani da shi wajen haɗa URL na callback masu gudana ba tare da jiran sakamako ba. Madadin da ke da mafi ƙarancin fifiko don callbacks na kie.ai; ana kuma amfani da shi a matsayin URL na jama'a na gama-gari don sauran relays. | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpoint na binciken quota na CrofAI da shafin Usage ke amfani da shi. Yi override don relays / fixtures na gwaji. | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Endpoint na hukuma na amfani da OpenCode Go mai tantancewa ta API key, wanda shafin Usage ke amfani da shi. Yi override don relays / fixtures na gwaji. | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Ƙirƙiri headers na shaidar OpenCode CLI (User-Agent, x-opencode-client/project, UUID na buƙata/session) a kan buƙatun upstream na opencode-go/zen waɗanda abokin ciniki bai aika ba, domin Cloudflare da ke kan egress na VPS ya karɓe su (#6210/#5997). Yana kunne ta tsohuwa tun daga #10571; kashe shi da `false`/`0`/`no`/`off`. | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | Tsohon User-Agent da ake amfani da shi idan `OPENCODE_SYNTHESIZE_CLI_HEADERS` yana kunne kuma ba a saita override na `_USER_AGENT` na kowane provider ba. Ana amfani da shi ne kawai ga executors na opencode. | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Ƙimar header na `x-opencode-client` da aka ƙirƙira idan `OPENCODE_SYNTHESIZE_CLI_HEADERS` yana kunne. | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Ƙimar da za a yi amfani da ita ga kan `x-opencode-project` da aka samar lokacin da `OPENCODE_SYNTHESIZE_CLI_HEADERS` ke kunne. | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL na saitunan Ollama Cloud da ake amfani da shi wajen tattara bayanan ƙa'ida. A sauya shi don relays / kayan gwaji. | -| `OLLAMA_USAGE_COOKIE` | _(ba a saita ba)_ | `open-sse/services/usage.ts` | Cookie na Ollama Cloud `__Secure-session` da ake amfani da shi wajen tattara bayanan ƙa'ida daga shafin saituna. Sirri ne; a fi son filin Dashboard na kowace haɗi idan an saita asusu da yawa. | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(ba a saita ba)_ | `open-sse/services/usage.ts` | Madadin env var na cookie `__Secure-session` na Ollama Cloud. Sirri ne; a fi son filin Dashboard na kowace haɗi idan an saita asusu da yawa. | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(ba a saita ba)_ | `open-sse/services/usage.ts` | Madadin env var na cookie `__Secure-session` na Ollama Cloud da ake amfani da shi kafin gajerun sunayen laƙabi. Sirri ne; a fi son filin Dashboard na kowace haɗi idan an saita asusu da yawa. | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpoint na iyakokin amfani da CodeWhisperer (AWS Kiro). A sauya shi don relays / kayan gwaji. | +## 7. URLs & Daidaitawar Cloud + +| Sauyi | Tsoho | Fayil ɗin Asali | Bayani | +| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL na gefen uwar garke wanda ayyukan daidaitawa na ciki za su yi amfani da shi wajen kiran `/api/sync/cloud`. A bar wannan a matsayin URL na loopback/container ko da ana wakiltar manhajar ga jama'a ta proxy. | +| `CLOUD_URL` | _(babu komai)_ | `src/lib/cloudSync.ts` | URL na endpoint ɗin cloud relay (fasalin kuɗi). | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Iyakar lokacin HTTP don buƙatun daidaitawar cloud. | +| `OMNIROUTE_BUILD_PROFILE` | `full` | Tsarin build na Webpack | Bayanan martabar lokacin build (saita zuwa `minimal` don cire modules masu gata daga bundle gaba ɗaya). | +| `OMNIROUTE_STANDALONE_DIR` | _fitowar standalone ta .build/_ | `scripts/build/colocate-standalone.mjs` | Sauya saitin lokacin build don kundin adireshin fitowar standalone da matakin haɗa-wuri bayan build ke amfani da shi. Ba saitin lokacin gudana ba ne. | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(babu komai)_ | `src/lib/cloudSync.ts` | Sirrin da aka raba da ake amfani da shi don tabbatar da sa hannun HMAC-SHA256 na amsoshin Daidaitawar Cloud. | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Saita zuwa `true` don ba endpoint ɗin Daidaitawar Cloud damar sake rubuta bayanan tantancewa na gida. Tsohon ƙima shi ne `false`. | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Saita zuwa `true` don ƙin amsar Daidaitawar Cloud marar sa hannu idan babu wani sirri na gida da aka saita (#13679). Duk sa hannun da yake akwai ana tabbatar da shi koyaushe — kuma koyaushe ana ƙin sa idan ba a saita `OMNIROUTE_CLOUD_SYNC_SECRET` ba — ba tare da la'akari da wannan flag ba. A v3.9, tsohon saitin zai koma tilastawa. | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Saita zuwa `true` don komawa ga halayyar mataki ɗaya ta v3.8.5 ta "shigo da komai" ba tare da tabbatarwar mai amfani ba. | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, daidaitawa | URL na jama'a don OAuth redirect_uri, hanyoyin haɗin Dashboard, da URLs na jama'a da aka samar. Saita wannan zuwa tsayayyen URL na jama'a idan callbacks na OAuth ko hanyoyin haɗin burauza da aka samar dole ne su yi amfani da canonical reverse-proxy host. | +| `NEXT_PUBLIC_CLOUD_URL` | _(babu komai)_ | Gefen abokin ciniki | Kwafin `CLOUD_URL` na gefen abokin ciniki. | +| `NEXT_PUBLIC_APP_URL` | _(ba a saita ba)_ | `src/shared/services/cloudSyncScheduler.ts` | Tsohon madadin `NEXT_PUBLIC_BASE_URL`. | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(ba a saita ba)_ | Mai warware asalin jama'a, URLs na hotuna | Asalin OmniRoute da burauza ke gani mai fifiko mafi girma, wanda ake amfani da shi wajen samar da URLs na jama'a da tabbatar da asalin burauza wanda ba na dashboard ba. Saita wannan idan OpenWebUI ko wani relay yana isa OmniRoute ta URL na ciki amma dole ne burauzar mai amfani ta ɗauko kafofin da aka samar daga LAN, tunnel, ko asalin jama'a. **Kada** a haɗa `/v1`. | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(ba a saita ba)_ | `open-sse/config/providerPluginManifestUrl.ts` | Cikakken URL na manifest ɗin plugin na provider da ake sanar da abokan cinikin sidecar. Idan ba a saita ba, OmniRoute yana samo `/api/v1/provider-plugin-manifest` daga asalin buƙata ko HOST/PORT. | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocol da ake amfani da shi yayin samo URL na manifest ɗin plugin na provider daga HOST/PORT ba tare da asalin buƙata ba. Saita shi zuwa `https` a bayan proxy na jama'a da ke ƙare TLS idan ba a saita takamaiman `OMNIROUTE_PROVIDER_MANIFEST_URL` ba. | +| `OMNIROUTE_TRUST_PROXY` | _(ba a saita ba)_ | `src/server/origin/publicOrigin.ts` | Yanayin amincewa na zaɓi don headers na asalin jama'a da aka tura. Ba a saita ba = kada a amince da `Forwarded` / `X-Forwarded-*` wajen yanke shawarar tsaro. `true` / `loopback` yana amincewa da host/proto da aka tura kawai daga proxy na loopback mai alamar token. `private` / `lan` kuma yana amincewa da abokan proxy na LAN mai zaman kansa. A production, fi son takamaiman `NEXT_PUBLIC_BASE_URL`. | +| `KIE_CALLBACK_URL` | _(ba a saita ba)_ | `open-sse/utils/kieTask.ts` | URL na callback na jama'a don ayyukan kie.ai masu gudana ba tare da jira ba. Shi ne override mai fifiko mafi girma kafin `OMNIROUTE_KIE_CALLBACK_URL` da `OMNIROUTE_PUBLIC_URL`. | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(ba a saita ba)_ | `open-sse/utils/kieTask.ts` | Wata hanyar rubuta `KIE_CALLBACK_URL`. Ana komawa gare shi idan ba a saita babban variable ɗin ba. | +| `OMNIROUTE_PUBLIC_URL` | _(ba a saita ba)_ | `open-sse/utils/kieTask.ts` | Asalin jama'a da ake amfani da shi wajen haɗa URLs na callback masu gudana ba tare da jira ba. Shi ne madadin mafi ƙarancin fifiko don callbacks na kie.ai; ana kuma amfani da shi a matsayin URL na jama'a na gama-gari don sauran relays. | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpoint na duba adadin CrofAI da shafin Usage ke amfani da shi. Yi override don relays / kayan gwaji. | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Endpoint na hukuma na amfani da OpenCode Go mai tantancewa ta API key, wanda shafin Usage ke amfani da shi. Yi override don relays / kayan gwaji. | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Ƙirƙiri headers na shaidar OpenCode CLI (User-Agent, x-opencode-client/project, UUIDs na buƙata/session) a kan buƙatun opencode-go/zen zuwa upstream waɗanda abokin ciniki bai aika ba, domin Cloudflare a hanyar fita ta VPS ya karɓe su (#6210/#5997). Yana kunne ta tsohuwa tun daga #10571; kashe shi da `false`/`0`/`no`/`off`. | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent na tsohuwa da ake amfani da shi idan `OPENCODE_SYNTHESIZE_CLI_HEADERS` yana kunne kuma ba a saita override na kowane provider na `_USER_AGENT` ba. Ana amfani da shi ne kawai ga executors na opencode. A buƙatar da ba ta da key wadda upstream ke tacewa, ƙimar da aka saita wadda ba ta ɗauke da `opencode/= 1.17>` za a maye gurbinta da wannan ƙimar tsohuwa maimakon a ƙi buƙatar. | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Ƙimar da za a saka a header na `x-opencode-client` da aka ƙirƙira lokacin da `OPENCODE_SYNTHESIZE_CLI_HEADERS` yake kunne. | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Ƙimar da za a yi amfani da ita ga kanun `x-opencode-project` da aka ƙirƙira lokacin da aka kunna `OPENCODE_SYNTHESIZE_CLI_HEADERS`. | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(ba a saita ba)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Saita zuwa `off` don dakatar da daidaita jikin buƙatun OpenCode marasa maɓalli (alamar streaming da jerin kayan aiki). Har yanzu ana amfani da kanun bayanai. Ana karanta wannan a kowace buƙata, saboda haka sauyi zai fara aiki nan take. | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(ba a saita ba)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Sunayen kayan aiki da aka raba da waƙafi waɗanda za a ayyana a cikin buƙatar OpenCode marar maɓalli wadda ba ta ɗauke da ko ɗaya, idan har yanzu ba a lura da wani abu ga wannan model ɗin ba. Idan babu komai, za a koma ga kayan aiki guda ɗaya na wucin gadi wanda ake gaya wa model kada ya kira. Ba fiye da shigarwa 32 ba, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; ana watsi da shigarwar da ba su inganta ba. | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL na saitunan Ollama Cloud da ake amfani da shi wajen karɓo bayanan ƙayyadadden amfani. Sauya shi don relays / kayan gwaji. | +| `OLLAMA_USAGE_COOKIE` | _(ba a saita ba)_ | `open-sse/services/usage.ts` | Cookie na Ollama Cloud mai suna `__Secure-session` da ake amfani da shi wajen karɓo bayanan ƙayyadadden amfani daga shafin saituna. Mai matuƙar sirri ne; idan an saita asusu da yawa, fi son filin Dashboard na kowace haɗi. | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(ba a saita ba)_ | `open-sse/services/usage.ts` | Madadin env var na cookie na Ollama Cloud mai suna `__Secure-session`. Mai matuƙar sirri ne; idan an saita asusu da yawa, fi son filin Dashboard na kowace haɗi. | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(ba a saita ba)_ | `open-sse/services/usage.ts` | Madadin env var na cookie na Ollama Cloud mai suna `__Secure-session`, wanda ake amfani da shi kafin gajerun sunayen madadin. Mai matuƙar sirri ne; idan an saita asusu da yawa, fi son filin Dashboard na kowace haɗi. | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpoint na iyakokin amfani na CodeWhisperer (AWS Kiro). Sauya shi don relays / kayan gwaji. | > [!IMPORTANT] -> Lokacin turawa a bayan reverse proxy (nginx, Caddy), saita `NEXT_PUBLIC_BASE_URL` zuwa tsayayyen URL ɗinka na jama'a (misali, `https://omniroute.example.com`) idan dole ne OAuth callbacks ko hanyoyin jama'a da aka samar su yi amfani da wannan hostname. Idan babu wannan, OAuth callbacks na iya gaza saboda redirect_uri ba zai dace ba, kuma hanyoyin jama'a da aka samar na iya nuna internal container origin. +> Lokacin turawa a bayan reverse proxy (nginx, Caddy), saita `NEXT_PUBLIC_BASE_URL` zuwa tsayayyen URL ɗinka na jama'a (misali, `https://omniroute.example.com`) idan callbacks na OAuth ko hanyoyin jama'a da aka ƙirƙira dole ne su yi amfani da wannan hostname. Idan babu wannan, callbacks na OAuth za su iya gaza saboda redirect_uri ba zai dace ba, kuma hanyoyin jama'a da aka ƙirƙira za su iya nuna internal container origin. > -> Bar `BASE_URL` a matsayin internal loopback/container URL don ayyukan server-to-server. Kada a yi amfani da `Origin` na browser ko hostname na jama'a don internal self-fetches masu ɗauke da bayanan shiga. +> Bar `BASE_URL` a matsayin URL na internal loopback/container don ayyukan server-to-server. Kada a yi amfani da `Origin` na browser ko hostname na jama'a don internal self-fetches masu ɗauke da bayanan shaidar shiga. > -> Rubuce-rubucen dashboard da aka tabbatar da izini ba sa buƙatar tsayayyen public base URL: dashboard yana aika unsafe requests na same-origin tare da CSRF token da ke daure da session. Har yanzu OmniRoute yana tattara public-origin validation a wuri guda don haɗe-haɗen browser waɗanda ba na dashboard ba: ana fara amincewa da bayyanannun public URL env vars; ana yin watsi da ɗanyen headers na `Forwarded` / `X-Forwarded-*` sai idan an kunna `OMNIROUTE_TRUST_PROXY` kuma an yi wa immediate proxy peer alamar amincewa ta token. Kada a yi amfani da saitunan CORS don gyara same-origin dashboard requests; CORS na cross-origin browser clients ne kawai. +> Rubuce-rubucen dashboard da aka tabbatar da izini ba sa buƙatar tsayayyen public base URL: dashboard yana aika unsafe requests na same-origin tare da CSRF token da ke daure da session. Har yanzu OmniRoute yana haɗa tabbatar da public-origin a wuri guda don browser integrations waɗanda ba na dashboard ba: ana fara amincewa da env vars na public URL da aka bayyana kai tsaye; ana watsi da ɗanyen kanun `Forwarded` / `X-Forwarded-*` sai dai idan an kunna `OMNIROUTE_TRUST_PROXY` kuma an yi wa immediate proxy peer alamar token a matsayin amintacce. Kada a yi amfani da saitunan CORS don gyara buƙatun dashboard na same-origin; CORS na clients na browser masu cross-origin ne kawai. --- @@ -586,49 +593,50 @@ da ke sama ba). --- -## 11. Bayanan Shaidar Masu Samar da OAuth - -Bayanan shaidar da aka tanada don **haɓakawa a localhost**. Don turawa zuwa sabar nesa, yi rajistar naka a na’ura mai kula da masu haɓakawa ta kowane mai samarwa. - -| Variable | Mai samarwa | Bayani | -| --------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Abokin ciniki na jama'a — ba a buƙatar sirri. | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Sauya URI na turawa. Tsoho: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Abokin ciniki na jama'a. | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Yana buƙatar `_SECRET` mai dacewa. | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Abokin ciniki na jama'a. | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Yana buƙatar `_SECRET` mai dacewa. | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Abokin ciniki na jama'a. | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Sauyi na zaɓi don ID na abokin cinikin OAuth na GitHub Enterprise Copilot. Yana komawa ga tsohon ƙimar jama'a ta `GITHUB_OAUTH_CLIENT_ID` idan ba a saita shi ba. | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Madadin maɓallin API da `open-sse/executors/devin-cli.ts` ke amfani da shi idan babu bayanan shaidar kowace haɗi. Na zaɓi ne. | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Hanya ta musamman zuwa fayil ɗin binary na Devin CLI (`devin`). `open-sse/executors/devin-cli.ts` ne ke warware ta. | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID na abokin cinikin OAuth don GitLab Duo. Yi rajistar manhaja a `https://gitlab.com/-/profile/applications` tare da URI na turawa `/callback` da izini `api, read_user, openid, profile, email`. Yana komawa ga `GITLAB_OAUTH_CLIENT_ID`. | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Sirrin abokin cinikin OAuth don GitLab Duo. Na zaɓi ne — tsarin PKCE ba ya buƙatar sirri. Yana komawa ga `GITLAB_OAUTH_CLIENT_SECRET`. | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Sauya URL na tushen GitLab (GitLab mai masaukin kansa). Tsoho shi ne `https://gitlab.com`. Yana komawa ga `GITLAB_BASE_URL`. | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Tsohon madadin `GITLAB_DUO_BASE_URL`. Ana amfani da shi idan ba a saita nau'in `_DUO_` ba. | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Tsohon madadin `GITLAB_DUO_OAUTH_CLIENT_ID` wanda `src/lib/oauth/constants/oauth.ts` ke amfani da shi. | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Madadin tsohon tsari na `GITLAB_DUO_OAUTH_CLIENT_SECRET` wanda `src/lib/oauth/constants/oauth.ts` ke amfani da shi. | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Saita shi don kunna Qoder OAuth. | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Madadin maɓallin API kai tsaye (yana tsallake OAuth). | -| `QODER_CLI_WORKSPACE` | Qoder | ID na workspace don Qoder CLI. | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Wani suna na `QODER_CLI_WORKSPACE`. | -| `QODER_CLI_CONFIG_DIR` | Qoder | Sauya kundin daidaitawar Qoder CLI (zaman PAT mai warewa, yana hana lalata shigarwar burauza). | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Token ɗin `tk` na frontend da za a aika a matsayin `validated` zuwa `/api/chat`. Ana buƙatarsa idan Blackbox yana tilasta daidaituwar token; in ba haka ba OmniRoute zai koma amfani da UUID bazuwar. Duba batu #2252. | -| `VISION_BRIDGE_BASE_URL` | Kariyar Vision Bridge | URL na tushe mai dacewa da OpenAI don kiraye-kirayen vision-bridge da ba na Anthropic ba. Ta tsohuwa yana amfani da env na tsohon URL na OpenAI ko api.openai.com. Nuna shi zuwa madaukin kai na `/v1` na OmniRoute ko kowane endpoint mai dacewa da OpenAI (Gemini OpenAI-compat, OpenRouter). Batu #2232. Idan URL ɗin shi ne `/v1` na OmniRoute da kansa, ƙaramin buƙatar describe yana aika `x-omniroute-admission-bypass: internal` kuma yana tantancewa da bayanan shaidar madaukin kai da aka samo (`sk_omniroute` sentinel a yanayin gida, ko `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) domin turawar da ke da `REQUIRE_API_KEY=true` su yi aiki. | -| `VISION_BRIDGE_API_KEY` | Kariyar Vision Bridge | Maɓallin API don URL da ke sama. Yana maye gurbin env vars na OpenAI / Google na kowane mai bayarwa don kiraye-kirayen vision-bridge da ba na Anthropic ba. Samfurin Anthropic suna ci gaba da amfani da keɓaɓɓiyar hanyar maɓallin Anthropic. Batu #2232. | +## 11. Takardun Shaidar Mai Bayar da OAuth + +Takardun shaidar da aka tanada a ciki don **haɓakawa a localhost**. Don turawa zuwa sabar nesa, yi rajistar naka a na’urar sarrafa masu haɓakawa ta kowane mai bayarwa. + +| Sauyi | Mai bayarwa | Bayanan kula | +| --------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Client na jama'a — ba a buƙatar sirri. | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Sauya redirect URI. Tsoho: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Client na jama'a. | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Yana buƙatar `_SECRET` mai dacewa. | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Client na jama'a. | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Yana buƙatar `_SECRET` mai dacewa. | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Client na jama'a. | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Sauyi na zaɓi don client id na OAuth na GitHub Enterprise Copilot. Idan ba a saita shi ba, zai koma ga tsohon ƙimar jama'a ta `GITHUB_OAUTH_CLIENT_ID`. | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Sauyi na zaɓi don ID ɗin haɗa client na GitHub Copilot da ake aikawa a cikin headers na `Copilot-Integration-Id` da `Editor-Plugin-Version`. Tsohuwar ƙima ita ce `copilot-developer-cli`. | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Madadin maɓallin API da `open-sse/executors/devin-cli.ts` ke amfani da shi idan babu takardar shaidar kowace haɗi. Na zaɓi ne. | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Keɓaɓɓiyar hanya zuwa binary na Devin CLI (`devin`). Ana gano ta ta hanyar `open-sse/executors/devin-cli.ts`. | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID ɗin client na OAuth don GitLab Duo. Yi rajistar app a `https://gitlab.com/-/profile/applications` tare da redirect URI `/callback` da scopes `api, read_user, openid, profile, email`. Zai koma ga `GITLAB_OAUTH_CLIENT_ID`. | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Sirrin client na OAuth don GitLab Duo. Na zaɓi ne — tsarin PKCE ba ya buƙatar sirri. Zai koma ga `GITLAB_OAUTH_CLIENT_SECRET`. | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Sauya tushen URL na GitLab (GitLab mai zaman kansa). Tsohuwar ƙima ita ce `https://gitlab.com`. Zai koma ga `GITLAB_BASE_URL`. | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Tsohon madadin `GITLAB_DUO_BASE_URL`. Ana amfani da shi idan ba a saita nau'in `_DUO_` ba. | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Tsohon madadin `GITLAB_DUO_OAUTH_CLIENT_ID` wanda `src/lib/oauth/constants/oauth.ts` ke amfani da shi. | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Tsohon madadin `GITLAB_DUO_OAUTH_CLIENT_SECRET` wanda `src/lib/oauth/constants/oauth.ts` ke amfani da shi. | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Saita shi don kunna Qoder OAuth. | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Madadin maɓallin API kai tsaye (yana tsallake OAuth). | +| `QODER_CLI_WORKSPACE` | Qoder | ID na workspace don Qoder CLI. | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Wani suna na `QODER_CLI_WORKSPACE`. | +| `QODER_CLI_CONFIG_DIR` | Qoder | Sauya kundin saitunan Qoder CLI (zaman PAT mai zaman kansa, yana hana lalata shiga ta browser). | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Token `tk` na frontend da za a aika a matsayin `validated` a `/api/chat`. Ana buƙatarsa lokacin da Blackbox ke tilasta daidaituwar token; in ba haka ba, OmniRoute zai koma amfani da UUID bazuwar. Duba matsala #2252. | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | Base URL mai dacewa da OpenAI don kiran vision-bridge da ba na Anthropic ba. A tsohuwa, yana amfani da tsohon OpenAI URL env ko api.openai.com. Nuna shi zuwa self-loop na OmniRoute na `/v1` ko duk wani endpoint mai dacewa da OpenAI (Gemini OpenAI-compat, OpenRouter). Matsala #2232. Lokacin da URL ɗin yake `/v1` na OmniRoute kansa, ƙaramin buƙatar bayani yana aika `x-omniroute-admission-bypass: internal` kuma yana tabbatar da izini ta amfani da bayanan shaidar self-loop da aka tantance (`sk_omniroute` sentinel a yanayin local, ko `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) domin turawa masu `REQUIRE_API_KEY=true` su yi aiki. | +| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | Maɓallin API na URL da ke sama. Yana fin ƙarfi kan OpenAI / Google env vars na kowane provider don kiran vision-bridge da ba na Anthropic ba. Samfuran Anthropic suna ci gaba da amfani da keɓantacciyar hanyar maɓallin Anthropic. Matsala #2232. | > [!WARNING] > > 1. Je zuwa [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) > 2. Ƙirƙiri OAuth 2.0 Client ID (nau'i: "Web application") -> 3. Ƙara URL na sabarku a matsayin Authorized redirect URI -> 4. Sauya ƙimomin bayanan shaida a cikin `.env`. +> 3. Ƙara URL na server ɗinka a matsayin Authorized redirect URI +> 4. Sauya ƙimomin bayanan shaidar da ke cikin `.env`. --- @@ -731,13 +739,13 @@ Tsarin da ake gane shi: `{PROVIDER_ID}_API_KEY` ## 15. Saitunan Ƙarewar Lokaci -Dukkan ƙimomi suna cikin **milliseconds**. Ana warware su a wuri guda cikin `src/shared/utils/runtimeTimeouts.ts`. +Duk ƙimomin suna cikin **milliseƙonni**. An tattara warware saitunan a `src/shared/utils/runtimeTimeouts.ts`. -### Tsarin Matsayin Ƙarewar Lokaci +### Tsarin Gadon Ƙarewar Lokaci ``` -REQUEST_TIMEOUT_MS (sauyin duniya baki ɗaya) -├─→ FETCH_TIMEOUT_MS (kiran masu samar da sabis na sama, tsoho: 600000) +REQUEST_TIMEOUT_MS (saitin maye gurbin gama-gari) +├─→ FETCH_TIMEOUT_MS (kiran masu samarwa na waje, tsoho: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (yana gado daga FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (yana gado daga FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (yana gado daga FETCH_TIMEOUT_MS) @@ -746,9 +754,9 @@ REQUEST_TIMEOUT_MS (sauyin duniya baki ɗaya) │ ├── FETCH_CONNECT_TIMEOUT_MS (mai zaman kansa, tsoho: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (mai zaman kansa, tsoho: 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (yana gado daga REQUEST_TIMEOUT_MS, tsoho: 600000) -├─→ STREAM_ACTIVE_TIMEOUT_MS (mai zaman kansa, tsoho: 1260000; 0 yana kashe shi) +├─→ STREAM_ACTIVE_TIMEOUT_MS (mai zaman kansa, tsoho: 1260000; 0 yana kashewa) ├─→ STREAM_READINESS_TIMEOUT_MS (yana gado daga REQUEST_TIMEOUT_MS, tsoho: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (yana iyakance daidaitattun tsawaitawar shiri, tsoho: 180000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (yana iyakance tsawaitawar shiri mai daidaituwa, tsoho: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (yana gado daga REQUEST_TIMEOUT_MS, tsoho: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (an samo shi, tsoho: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (tsoho: 60000) @@ -756,114 +764,115 @@ REQUEST_TIMEOUT_MS (sauyin duniya baki ɗaya) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (tsoho: 0 = a kashe) ``` -| Sauyi | Tsoho | Bayani | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `REQUEST_TIMEOUT_MS` | _(ba a saita ba)_ | Gajeriyar hanya ta bai ɗaya — tana maye gurbin tsoffin ƙimomin `FETCH_TIMEOUT_MS` da `STREAM_IDLE_TIMEOUT_MS`. | -| `FETCH_TIMEOUT_MS` | `600000` | Jimillar wa'adin buƙatar HTTP don kiran masu samarwa na sama. | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Matsakaicin lokacin shiru tsakanin ɗanyen bytes na sama kafin a dakatar. Samfuran tunani mai zurfi ba safai suke dakatawa >90s ba. | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Matsakaicin jimillar tsawon rayuwar rafin SSE mai aiki; ba ya sake farawa idan bytes na sama sun zo kuma ba ya dogara da `REQUEST_TIMEOUT_MS`. An samo shi daga mafi girman `timeoutMs` na kowane samfuri a registry (1200000, Codex) tare da ƙarin tazara ta 60000, don haka ba za a taɓa kashe samfurin da aka yarda ya yi amfani da cikakken kasafinsa a tsakiyar amsa ba. Saita zuwa `0` don kashewa. | -| `OMNIROUTE_SSE_COMMENTS` | _(a kashe)_ | Ko OmniRoute zai iya fitar da layukan sharhin SSE na `:` (misali bugun-zuciyar `: keepalive` da metadata trailers na `x-omniroute-*`). A kashe yake ta tsohuwa (#10524) domin tsauraran clients masu jituwa da OpenAI suna yin JSON.parse ga kowane layin SSE kuma su lalace a kan sharhin `:`; wannan bai shafi bugun-zuciyar `data:` ba. Saita `on`/`true`/`1`/`yes` don sake shiga. Ana amfani da shi ta `open-sse/utils/sseHeartbeat.ts`. | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Lokacin karɓar event na farko na SSE wanda ba ping ba. Yana gādon `REQUEST_TIMEOUT_MS` idan an saita shi. | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Matsakaicin tagar jiran event na farko mai daidaitawa don manyan buƙatun streaming masu yawan tools ko zurfin reasoning. | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Kill-switch na heuristic na `/goal`. Saita `false`/`0`/`off` don kashe ganowa gaba ɗaya — ba a taɓa ƙara readiness timeouts da stream recovery saboda request body/headers, wanda ke rage yiwuwar ƙara timeout da client ke sarrafawa. | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Matsakaicin tagar jiran event na farko don ayyukan agent na `/goal` da aka gano ko buƙatun da aka tilasta da `x-omniroute-agent-goal`. | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Kunna early stream recovery kai tsaye don ayyukan agent na `/goal` da aka gano. Saita `false`/`0`/`off` don kashe opt-in na musamman ga goal. Wannan zai iya ƘARA recovery ne kawai a kan tsohon saitin operator — ba ya taɓa soke bayyanannen opt-out na saitunan `STREAM_RECOVERY_ENABLED`/DB. | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Cire events na SSE marasa ma'auni na `codex.*` (misali `codex.rate_limits`) waɗanda ke lalata `responses.stream()` na OpenAI SDK da 502. A KUNNE yake ta tsohuwa (#11014). Saita `0`/`false`/`no`/`off` don tura su gaba. | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(ba a saita ba)_ | Zaɓin shiga transport na Codex app-server. WebSocket endpoint (`ws://`/`wss://`) na sidecar na `codex app-server` na gida. Idan aka saita shi tare da token, ana bi da buƙatun Codex ta JSON-RPC zuwa sidecar maimakon HTTP Responses API. Haka kuma ana iya saita shi ga kowace connection ta `providerSpecificData.codexAppServerUrl`. Ana amfani da shi ta `open-sse/executors/codex/appServerConfig.ts`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(ba a saita ba)_ | Inline capability/bearer token da ake gabatarwa ga app-server. Override na kowace connection: `providerSpecificData.codexAppServerToken`. | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(ba a saita ba)_ | Path zuwa file mai ɗauke da capability token na app-server (daga `codex app-server --ws-token-file`). Ana amfani da shi idan ba a saita `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ba. Override na kowace connection: `providerSpecificData.codexAppServerTokenFile`. | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Working directory da aikin app-server ke gudana a ciki. Override na kowace connection: `providerSpecificData.codexAppServerCwd`. | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(ba a saita ba)_ | Approval policy da ake miƙawa aikin app-server (misali `never`, `on-request`). Override na kowace connection: `providerSpecificData.codexAppServerApprovalPolicy`. | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(ba a saita ba)_ | Sandbox policy da ake miƙawa aikin app-server (misali `read-only`, `workspace-write`, `danger-full-access`). Idan ba a saita ba, executor yana amfani da `workspace-write` a matsayin tsoho (an ƙara tsaro; a baya `danger-full-access`). Override na kowace connection: `providerSpecificData.codexAppServerSandbox`. | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Amincewa kai tsaye da approval prompts na app-server kansa (aiwatar da command/file/permission a kan host). A kashe yake ta tsohuwa — ana ƙin prompts kai tsaye; wannan bai shafi harness tool calls ba (suna bi ta keɓantacciyar hanyar passthrough ta `item/tool/call`). Yana karɓar `true`/`1`/`yes`. Override na kowace connection: `providerSpecificData.codexAppServerAutoApprove`. | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Lokacin karɓar response headers. | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Matsakaicin lokacin jiran fara amsa (ms) ga kowane yunƙurin kai tsaye ba tare da proxy ba. Idan lokaci ya ƙare, za a sake gwadawa sau ɗaya a kan sabuwar socket; saita `0` don kashe iyakar kuma a ci gaba da halayyar da ta gabata. | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Lokacin karɓar cikakken jikin amsa. | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Iyakar lokacin kafa haɗin TCP. | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Iyakar lokacin zaman banza na socket mai keep-alive. | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Iyakar lokacin proxy na sawun-yatsan TLS (wreq-js). | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Yana iyakance lokacin jiran byte na farko musamman a jikin hanyar jigilar sawun-yatsan TLS ta wreq-js; `TLS_CLIENT_TIMEOUT_MS` kaɗai ba zai iya gano jikin da ya maƙale ba domin yana warwarewa da zarar headers sun iso (#12656). Ƙarewar lokaci tana soke mai karatun wreq sannan ta koma ga mai rarrabawa na kai tsaye/proxy; `0` yana kashe watchdog ɗin. | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Na mai aiwatar da OpenCode ne kawai, kuma sai yayin da tutar fasalin `OPENCODE_RESPONSES_STALL_ROTATION` take kunne (a tsohuwa a kashe take): yana iyakance jiran byte na farko na jikin amsar Responses mai gudana bayan headers ɗinta (#13484). Gudanarwar Responses tana buɗewa da `response.created`, don haka yin shiru bayan wannan tazara maƙalewa ce: za a sanyaya asusun kuma buƙatar ta koma zuwa asusu na gaba sau ɗaya; maƙalewa ta biyu za ta gaza nan take. `0` yana kashe kariyar ko da tutar tana kunne. | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Iyakar lokacin tsallaken proxy ga buƙatun gadar `/v1`. | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Nuna mai aiwatar da ɗauko bayanan yanar gizo na Firecrawl zuwa instance mai karɓar baƙuncin kansa (API key ba dole ba ne a wajen cloud). | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Iyakar lokaci ga kowace buƙata ta mai aiwatar da ɗauko bayanan yanar gizo na Firecrawl. | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Gabaɗayan iyakar lokacin buƙatar uwar garke ga gadar. | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Lokacin aika headers na amsa ta hanyar gadar. | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Iyakar lokacin zaman banza na keep-alive na gadar. | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Iyakar lokacin raw socket (0 = a kashe). | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | Lokacin rangwame bayan SIGTERM/SIGINT kafin fita ta tilas. | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Ƙimar madadin da `src/shared/utils/fetchTimeout.ts` ke amfani da ita idan ba a saita `FETCH_TIMEOUT_MS` ba. | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Iyakar lokaci (ms) ga saitunan `validationRead` da `modelsProbe` a cikin `src/shared/network/safeOutboundFetch.ts`. Ƙara shi ga endpoints masu jinkiri (Cerebras, Cloudflare AI, Groq) don hana kai-komo tsakanin active/error a dashboard. Yana komawa 8000ms ga ƙimomi marasa inganci (<1000) ko waɗanda ba lambobi ba. | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Iyakar lokacin fetch ta musamman ga relay a cikin `open-sse/utils/proxyFetch.ts` (#9158). Dole ne relay da ya maƙale ya gaza kafin iyakar lokacin client/agent (~30s), domin masu kira su ga gazawa ta musamman ga relay maimakon gama-garin ƙarewar lokacin upstream. An iyakance shi zuwa `29000` domin ya ko da yaushe fara aiki da wuri. | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Jinkirin sake gwadawa na bai ɗaya ga hanyoyin sake gwadawa sau ɗaya na kai tsaye/relay/proxy a cikin `open-sse/utils/proxyFetch.ts` (#9158). `0` = sake gwadawa nan take. | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Iyakar lokacin buƙatar wreq-js ta asali (`claudeTlsClient.ts`). | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwamen tsayayyen wa'adin JS da ake ƙarawa a kan iyakar lokaci ta asali. | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Iyakar lokacin buƙatar wreq-js ta asali (`perplexityTlsClient.ts`). | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwamen tsayayyen wa'adin JS da ake ƙarawa a kan iyakar lokaci ta asali. | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (a kashe) | Yana ƙara "Kana da ginanniyar binciken yanar gizo. Amsa tambayoyi kai tsaye ta amfani da sakamakon bincike." zuwa saƙon tsarin mai kira (`perplexity-web/protocol.ts`). A kashe yake ta tsohuwa — Perplexity yana yin bincike duk da haka, kuma jimlar tana bayyana a cikin amsoshi a matsayin sharhin-meta ga manhajojin shirye-shirye. Saita `1`/`true`/`yes`/`on` don maidowa. | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Lokacin ƙarewar buƙatar wreq-js ta asali (`grokTlsClient.ts`). | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwamen ƙayyadadden wa'adin JS da ake ƙarawa a kan lokacin ƙarewa na asali. | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Lokacin ƙarewar buƙatar wreq-js ta asali (`notionTlsClient.ts`); `notion-web` yana ƙara shi zuwa `180000` ga kowace buƙata don tsararraki masu ɗaukar lokaci. | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwamen ƙayyadadden wa'adin JS da ake ƙarawa a kan lokacin ƙarewa na asali. | -| `OMNIROUTE_BROWSER_POOL` | `on` | Rumbun burauzar Playwright na bai ɗaya don tattaunawar kukin yanar gizo mai amfani da burauza (`browserPool.ts`); saita `off` don kashewa. | -| `OBSCURA_BIN` | `auto-detect` | Hanya zuwa binary na `obscura` da rumbun burauza da mai aiwatar da Cloudflare Playground suke amfani da shi a matsayin injin farko (`open-sse/services/obscura.ts`); ana gano shi ta atomatik daga PATH na tsarin idan ba a saita shi ba. | -| `OBSCURA_CDP_ENDPOINT` | _(ba a saita ba)_ | Nuna zuwa Obscura da ya riga ya fara aiki (`http://host:port`) maimakon ƙaddamar da wani; wannan module ba shi ne mamallakin wancan process ɗin ba (`open-sse/services/obscura.ts`). | -| `OBSCURA_PORT` | `random free port` | Tashar da aka bayyana don `obscura serve` da aka ƙaddamar; ana zaɓar tashar da ba a amfani da ita ta atomatik idan ba a saita ba (`open-sse/services/obscura.ts`). | -| `WEB_COOKIE_USE_BROWSER` | `0` | Zaɓar hanyar da ke amfani da burauza don buƙatar tattaunawar kukin yanar gizo (`browserBackedChat.ts`); saita `1` don kunnawa. | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL na tushe don mai aiwatar da Kimi Web (kimi.ai Connect-RPC na ƙasa da ƙasa) (`kimi-web.ts`); canza shi kawai don wuraren ƙarshe na madubi/proxy. | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Cikakken wurin ƙarshen tattaunawa na mai aiwatar da Kimi Web (`kimi-web.ts`). | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(ana ganowa ta atomatik)_ | Hanya zuwa executable na Chrome/Edge na tsarin don shigar Adobe Firefly ta burauza mai hulɗa (`adobeFireflyBrowserLogin.ts`); tana maye gurbin ganowa ta atomatik ta kowane OS. | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ fitowar standalone_ | Sauyin lokacin gini don kundin adireshin fitowar standalone da matakin haɗa-wuri bayan gini yake amfani da shi (`scripts/build/colocate-standalone.mjs`); kayan aikin gini ne, ba na lokacin aiki ba. | - -Ƙoƙarin maƙasudin combo yana gaji warwareccen lokacin ƙarewar buƙata ta upstream (`FETCH_TIMEOUT_MS`, ko -`REQUEST_TIMEOUT_MS` idan shi ne yake samar da tsoffin saitunan fetch). Saita `targetTimeoutMs` a cikin combo, -tsoffin saitunan combo, ko sauyin mai samarwa kawai don sa koma-bayan combo ya fi sauri; ƙimomin da suka wuce -lokacin ƙarewar upstream na yanzu za a iyakance su zuwa lokacin ƙarewar upstream. - -`comboTimeoutMs` wani kasafin lokacin bango ne na duk combo gaba ɗaya a tsakanin maƙasudan failover. -Bar shi ba a saita ba ko saita `0` don ci gaba da maimaitawa marar iyaka (abin dakatar da makalewa na minti 10 -`COMBO_LOOP_SAFETY_TIMEOUT_MS` har yanzu yana aiki). Ƙima mai kyau tana maye gurbin wannan -kariyar ga combo. Bar `comboTimeoutMs` ya fi `targetTimeoutMs` tsawo domin failover -ya ci gaba da samun lokaci bayan maƙasudin farko mai jinkiri. - -### Iyakokin Circuit Breaker - -Daidaita circuit breaker a matakin mai samarwa. Tsoffin saituna suna nuna ƙimomin da aka faɗaɗa da ake amfani da su tun v3.6 don haɗi 500+. - -| Maɓalli | Tsoho | Fayil ɗin Asali | Bayani | -| ------------------------------------------------------------- | --------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Iyakar gazawa a jere ga masu samar da OAuth kafin katsewar ta fara aiki. | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Tazarar sake saiti (ms) ga katsewar mai samar da OAuth. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Iyakar gazawa a jere ga masu samarwa masu amfani da API-key. | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Tazarar sake saiti (ms) ga katsewar mai samarwa mai amfani da API-key. | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Iyakar gazawa a jere ga masu samarwa na gida (Ollama, LM Studio, ...). | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Tazarar sake saiti (ms) ga katsewar mai samarwa na gida. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: yawan gazawa a cikin tazarar kafin dukan mai samar da OAuth ya shiga lokacin hucewa. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: taga mai motsi na ƙirga gazawa (ms) ga masu samar da OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: lokacin hucewa (ms) da zarar an kai iyakar mai samar da OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Mai samar da OAuth zai shiga DEGRADED idan gazawa ta kai wannan adadi. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Matsakaicin ninka ƙaruwar resetTimeout ga mai samar da OAuth. | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Mai samar da OAuth zai ƙara matakin jinkiri bayan wannan adadin zagayen buɗewa. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: yawan gazawa a cikin tazarar kafin dukan mai samarwa mai amfani da API-key ya shiga lokacin hucewa. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: taga mai motsi na ƙirga gazawa (ms) ga masu samarwa masu amfani da API-key. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: lokacin hucewa (ms) da zarar an kai iyakar mai samarwa mai amfani da API-key. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Mai samarwa mai amfani da API-key zai shiga DEGRADED idan gazawa ta kai wannan adadi. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Matsakaicin ninka ƙaruwar resetTimeout ga mai samarwa mai amfani da API-key. | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Mai samarwa mai amfani da API-key zai ƙara matakin jinkiri bayan wannan adadin zagayen buɗewa. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: yawan gazawa kafin dukan mai samarwa na gida ya shiga lokacin hucewa. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: taga mai motsi na ƙirga gazawa (ms) ga masu samarwa na gida. | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Katsewa a matakin mai samarwa: lokacin hucewa (ms) da zarar an kai iyakar mai samarwa na gida. | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Zurfin jinkiri da ake ɗaukar mai samar da fil na ma'ajiyar mahalli a matsayin wanda rashin lafiyarsa ta dawwama, sannan a cire fil ɗin domin sauya zuwa madadi. | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Tazarar hana kai-komo (ms) wadda ke jure gajerun lokutan hucewa na wucin gadi kafin a cire fil na ma'ajiyar mahalli. | +| Maɓalli | Tsoho | Bayani | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUEST_TIMEOUT_MS` | _(ba a saita ba)_ | Gajeriyar hanya ta gaba ɗaya — tana maye gurbin tsoffin ƙimomin `FETCH_TIMEOUT_MS` da `STREAM_IDLE_TIMEOUT_MS`. | +| `FETCH_TIMEOUT_MS` | `600000` | Jimillar wa'adin ƙarewar buƙatar HTTP don kiran masu samar da sabis na sama. | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Matsakaicin tsawon shiru tsakanin ɗanyen bytes na sama kafin a katse. Samfuran tunani mai zurfi ba safai suke dakatawa >90s ba. | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Matsakaicin jimillar tsawon rayuwar rafi na SSE mai aiki; ba ya sake farawa idan bytes na sama sun iso kuma baya dogara da `REQUEST_TIMEOUT_MS`. An samo shi daga mafi girman `timeoutMs` na kowane samfuri a rajista (1200000, Codex) tare da ƙarin tazara ta 60000, don haka ba za a taɓa kashe samfurin da aka bari ya yi amfani da cikakken kasafin lokacinsa a tsakiyar amsa ba. Saita zuwa `0` don kashe shi. | +| `OMNIROUTE_SSE_COMMENTS` | _(a kashe)_ | Ko OmniRoute na iya fitar da layukan sharhin SSE na `:` (misali bugun zuciyar `: keepalive` da ƙarin bayanan `x-omniroute-*` a ƙarshen saƙo). A kashe yake ta tsohuwa (#10524) saboda tsauraran abokan ciniki masu dacewa da OpenAI suna yin JSON.parse ga kowane layin SSE kuma su rushe kan sharhin `:`; bugun zuciya na `data:` bai shafa ba. Saita `on`/`true`/`1`/`yes` don sake shiga. `open-sse/utils/sseHeartbeat.ts` ne ke amfani da shi. | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Lokacin jira don karɓar aukuwar SSE ta farko wadda ba ping ba. Yana gado daga `REQUEST_TIMEOUT_MS` idan an saita shi. | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Matsakaicin taga mai daidaitawa na jiran aukuwar farko don manyan buƙatun yawo, masu yawan amfani da kayan aiki, ko masu zurfin tunani. | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Maɓallin kashe gaggawa na dabarar `/goal`. Saita `false`/`0`/`off` don kashe ganowa gaba ɗaya — ba a taɓa ƙara wa'adin shirye-shirye da farfaɗo da rafi saboda jikin buƙata/headers, wanda ke rage yiwuwar abokin ciniki ya tsawaita wa'adin ƙarewa. | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Matsakaicin taga na jiran aukuwar farko don tafiyar wakilin `/goal` da aka gano ko buƙatun da aka tilasta da `x-omniroute-agent-goal`. | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Kunna farfaɗo da rafi da wuri ta atomatik don tafiyar wakilin `/goal` da aka gano. Saita `false`/`0`/`off` don kashe zaɓin shiga na musamman ga goal. Wannan zai iya ƘARA farfaɗowa ne kawai a kan tsohon saitin mai gudanarwa — ba zai taɓa soke fitowar da aka bayyana kai tsaye ta saitunan `STREAM_RECOVERY_ENABLED`/DB ba. | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Cire aukuwar SSE na `codex.*` marasa daidaito (misali `codex.rate_limits`) waɗanda ke karya `responses.stream()` na OpenAI SDK da 502. A KUNNE yake ta tsohuwa (#11014). Saita `0`/`false`/`no`/`off` don tura su gaba. | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(ba a saita ba)_ | Hanyar sufuri ta Codex app-server da ake shiga bisa zaɓi. Wurin haɗin WebSocket (`ws://`/`wss://`) na sidecar na `codex app-server` na gida. Idan an saita shi tare da token, ana tura buƙatun Codex ta JSON-RPC zuwa sidecar maimakon HTTP Responses API. Haka kuma ana iya saita shi ga kowace haɗi ta `providerSpecificData.codexAppServerUrl`. `open-sse/executors/codex/appServerConfig.ts` ne ke amfani da shi. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(ba a saita ba)_ | Token na capability/bearer da aka saka kai tsaye wanda ake miƙawa app-server. Maye gurbi na kowace haɗi: `providerSpecificData.codexAppServerToken`. | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(ba a saita ba)_ | Hanyar fayil mai ɗauke da token na capability na app-server (daga `codex app-server --ws-token-file`). Ana amfani da shi idan ba a saita `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` ba. Maye gurbi na kowace haɗi: `providerSpecificData.codexAppServerTokenFile`. | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Kundin aiki da zagayen app-server ke gudana a ciki. Maye gurbi na kowace haɗi: `providerSpecificData.codexAppServerCwd`. | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(ba a saita ba)_ | Manufar amincewa da ake miƙawa zagayen app-server (misali `never`, `on-request`). Maye gurbi na kowace haɗi: `providerSpecificData.codexAppServerApprovalPolicy`. | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(ba a saita ba)_ | Manufar sandbox da ake miƙawa zagayen app-server (misali `read-only`, `workspace-write`, `danger-full-access`). Idan ba a saita ba executor zai yi amfani da `workspace-write` a matsayin tsoho (an ƙarfafa tsaro; a baya `danger-full-access`). Maye gurbi na kowace haɗi: `providerSpecificData.codexAppServerSandbox`. | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Amincewa ta atomatik da buƙatun amincewa na app-server kansa (aiwatar da umarni/fayil/izini a kan host). A kashe yake ta tsohuwa — ana ƙin buƙatun ta atomatik; kiran kayan aikin harness bai shafa ba (suna bi ta hanyar wucewa ta daban ta `item/tool/call`). Yana karɓar `true`/`1`/`yes`. Maye gurbi na kowace haɗi: `providerSpecificData.codexAppServerAutoApprove`. | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Lokacin jira don karɓar headers na amsa. | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Matsakaicin lokacin jiran fara amsa (ms) ga kowane yunƙurin kai-tsaye ba tare da proxy ba. Idan lokaci ya ƙare, ana sake gwadawa sau ɗaya a kan sabon socket; saita `0` don kashe iyakar kuma a riƙe halayyar da ta gabata. | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (minti 10) | Matsakaicin iyaka (ms) ga yunƙurin RETRY na sabon socket bayan lokacin jiran fara amsa na yunƙurin pooled da ke sama ya ƙare (#13703). Yana aiki ne kawai idan mai kira ya riga ya haɗa nasa siginar wa'adin ƙarewa (jerin fifikon connection/model/provider/`FETCH_TIMEOUT_MS` da aka tantance); wannan siginar ce ainihin iyaka kuma ita ce ke fara aiki a hanyar da aka nufa, don haka wannan kariya ce mai yalwa maimakon tsayayyen iyaka — idan babu ita, sake-gwajin yana sake amfani da gajeriyar taga ɗaya ta `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` kamar yunƙurin pooled, abin da ke haifar da 504 ga lafiyayyun reasoning models masu jinkirin TTFB. Ba a taɓa yarda ya sauka ƙasa da tsayayyen mafi ƙarancin iyakar da ke sama ba; idan mai kira bai samar da kowace siginar wa'adin ƙarewa ba, sake-gwajin zai bar tsayayyen mafi ƙarancin iyakar yadda yake. | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Lokacin karɓar cikakken jikin amsa. | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Lokacin ƙarewar kafa haɗin TCP. | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Lokacin ƙarewar zaman banza na keep-alive socket. | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Lokacin ƙarewar TLS fingerprint proxy (wreq-js). | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Yana iyakance lokacin zuwa byte na farko musamman a jikin jigilar TLS-fingerprint ta wreq-js; `TLS_CLIENT_TIMEOUT_MS` shi kaɗai ba zai iya gano jikin da ya tsaya cik ba, domin yana warwarewa da zarar headers sun iso (#12656). Idan lokaci ya ƙare, ana soke wreq reader sannan a koma ga direct/proxy dispatcher; `0` yana kashe watchdog. | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Na OpenCode executor kawai, kuma kawai yayin da feature flag na `OPENCODE_RESPONSES_STALL_ROTATION` yake kunne (a kashe yake ta tsohuwa): yana iyakance jiran byte na farko na jikin streamed Responses reply bayan headers ɗinsa (#13484). Responses stream yana buɗewa da `response.created`, don haka shiru bayan wannan taga alamar tsayawa cik ne: ana sanya account ɗin cikin lokacin hucewa sannan a juya request zuwa account na gaba sau ɗaya; tsayawa cik na biyu yana sa a gaza nan take. `0` yana kashe kariyar ko da flag ɗin yana kunne. | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Lokacin ƙarewar matakin proxy ga requests na bridge na `/v1`. | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Nuna Firecrawl web-fetch executor zuwa instance da aka self-host (API key ba dole ba ne idan ba a cloud ba). | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Lokacin ƙarewa ga kowane request na Firecrawl web-fetch executor. | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Jimillar lokacin ƙarewar server request ga bridge. | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Lokacin aika response headers ta bridge. | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Lokacin ƙarewar zaman banza na keep-alive na bridge. | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Lokacin ƙarewar raw socket (0 = a kashe). | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | Lokacin sassauci bayan SIGTERM/SIGINT kafin tilasta fita. | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Fallback da `src/shared/utils/fetchTimeout.ts` ke amfani da shi idan ba a saita `FETCH_TIMEOUT_MS` ba. | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Lokacin ƙarewa (ms) ga presets na `validationRead` da `modelsProbe` a cikin `src/shared/network/safeOutboundFetch.ts`. Ƙara shi ga endpoints masu jinkiri (Cerebras, Cloudflare AI, Groq) don hana yawan sauyawa tsakanin active/error a dashboard. Yana komawa 8000ms ga ƙimomin da ba su inganta ba (<1000) ko waɗanda ba lambobi ba. | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Lokacin ƙarewar fetch na musamman ga relay a cikin `open-sse/utils/proxyFetch.ts` (#9158). Dole ne relay da ya maƙale ya gaza kafin lokacin ƙarewar client/agent (~30s), domin masu kira su ga gazawa ta musamman ga relay maimakon lokacin ƙarewar upstream na gama-gari. An iyakance shi zuwa `29000` domin koyaushe ya fara aiki. | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Lokacin jira na retry da aka raba don hanyoyin sake-gwadawa-sau-ɗaya na direct/relay/proxy a cikin `open-sse/utils/proxyFetch.ts` (#9158). `0` = sake gwadawa nan take. | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Lokacin ƙarewar buƙatar wreq-js na asali (`claudeTlsClient.ts`). | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwame na cikakken wa'adin JS da ake ƙarawa a kan lokacin ƙarewa na asali. | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Lokacin ƙarewar buƙatar wreq-js na asali (`perplexityTlsClient.ts`). | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwame na cikakken wa'adin JS da ake ƙarawa a kan lokacin ƙarewa na asali. | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (a kashe) | Yana liƙa "Kana da ginanniyar binciken yanar gizo. Amsa tambayoyi kai tsaye ta amfani da sakamakon bincike." a saƙon tsarin mai kira (`perplexity-web/protocol.ts`). A kashe yake ta tsohuwa — Perplexity yana bincike ko ta yaya, kuma jimlar tana bayyana a cikin amsoshi a matsayin sharhin-meta ga abokan hulɗar coding. Saita `1`/`true`/`yes`/`on` don maidowa. | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Lokacin ƙarewar buƙatar wreq-js na asali (`grokTlsClient.ts`). | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwame na cikakken wa'adin JS da ake ƙarawa a kan lokacin ƙarewa na asali. | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Lokacin ƙarewar buƙatar wreq-js na asali (`notionTlsClient.ts`); `notion-web` yana ɗaga shi zuwa `180000` ga kowace buƙata don dogayen samarwa. | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Ƙarin lokacin rangwame na cikakken wa'adin JS da ake ƙarawa a kan lokacin ƙarewa na asali. | +| `OMNIROUTE_BROWSER_POOL` | `on` | Rumbun burauzar Playwright na bai ɗaya don tattaunawar kuki-na-yanar-gizo mai amfani da burauza (`browserPool.ts`); saita `off` don kashewa. | +| `OBSCURA_BIN` | `auto-detect` | Hanya zuwa fayil ɗin binary na `obscura` da rumbun burauza da mai aiwatar da Cloudflare Playground ke amfani da shi a matsayin injin farko (`open-sse/services/obscura.ts`); ana gano shi ta atomatik daga PATH na tsarin idan ba a saita shi ba. | +| `OBSCURA_CDP_ENDPOINT` | _(ba a saita ba)_ | Nuna zuwa Obscura da ya riga yake aiki (`http://host:port`) maimakon ƙaddamar da ɗaya; modulin ba shi ne ke mallakar wannan tsari ba (`open-sse/services/obscura.ts`). | +| `OBSCURA_PORT` | `random free port` | Tashar da aka ayyana kai tsaye don `obscura serve` da aka ƙaddamar; ana zaɓar tashar da ba a amfani da ita ta atomatik idan ba a saita ba (`open-sse/services/obscura.ts`). | +| `WEB_COOKIE_USE_BROWSER` | `0` | Zaɓar shigar da buƙatar tattaunawar kuki-na-yanar-gizo cikin hanyar da ke amfani da burauza (`browserBackedChat.ts`); `1` don kunnawa. | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL na tushe ga mai aiwatar da Kimi Web (kimi.ai Connect-RPC na ƙasa da ƙasa) (`kimi-web.ts`); sauya shi kawai don wuraren ƙarshen madubi/proxy. | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Cikakken wurin ƙarshen tattaunawa ga mai aiwatar da Kimi Web (`kimi-web.ts`). | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(ana ganowa ta atomatik)_ | Hanya zuwa fayil ɗin aiwatarwa na Chrome/Edge na tsarin don shiga ta burauza mai hulɗa ta Adobe Firefly (`adobeFireflyBrowserLogin.ts`); tana rinjayar ganowa ta atomatik bisa OS. | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ fitarwa mai zaman kanta_ | Sauyin lokacin gini don kundin adireshin fitarwa mai zaman kansa da matakin haɗa-wuri bayan gini ke amfani da shi (`scripts/build/colocate-standalone.mjs`); kayan aikin gini ne, ba na lokacin aiki ba. | + +Ƙoƙarin maƙasudin combo suna gadon lokacin ƙarewar buƙatar upstream da aka warware (`FETCH_TIMEOUT_MS`, ko +`REQUEST_TIMEOUT_MS` idan shi ne ke samar da tsohuwar ƙimar fetch). Saita `targetTimeoutMs` a cikin combo, +tsoffin ƙimomin combo, ko sauyin mai samarwa kawai don sa komawar combo ta yi sauri; ƙimomin da suka haura +lokacin ƙarewar upstream na yanzu ana iyakance su zuwa lokacin ƙarewar upstream. + +`comboTimeoutMs` kasafin lokacin agogo ne na dukkan combo gaba ɗaya, daban daga na maƙasudan failover. +Bar shi ba a saita ba ko saita shi zuwa `0` don ci gaba da maimaitawa ba tare da iyaka ba (har yanzu +matakin dakatar da makalewa na minti 10 na `COMBO_LOOP_SAFETY_TIMEOUT_MS` yana aiki). Ƙima mai kyau tana maye gurbin wannan +kariyar ga combo. Ka sa `comboTimeoutMs` ya fi `targetTimeoutMs` tsawo domin failover +ya ci gaba da samun lokaci bayan jinkirin maƙasudi na farko. + +### Iyakokin Mai Katse Da'ira + +Daidaita mai katse da'ira a matakin mai samarwa. Tsoffin ƙimomi suna nuna ƙimomin da aka faɗaɗa da ake amfani da su tun daga v3.6 don haɗin kai 500+. + +| Maɓalli | Tsoho | Fayil ɗin Tushe | Bayani | +| ------------------------------------------------------------- | --------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Iyakar gazawa a jere ga masu samar da OAuth kafin mai katsewar ya kunna. | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Lokacin sake saiti (ms) na mai katsewar mai samar da OAuth. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Iyakar gazawa a jere ga masu samarwa masu amfani da API-key. | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Lokacin sake saiti (ms) na mai katsewar mai samar da API-key. | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Iyakar gazawa a jere ga masu samarwa na gida (Ollama, LM Studio, ...). | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Lokacin sake saiti (ms) na mai katsewar mai samarwa na gida. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: yawan gazawa a cikin lokacin kafin dukkan mai samar da OAuth ya shiga lokacin hucewa. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: taga mai motsi ta ƙirga gazawa (ms) ga masu samar da OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: lokacin hucewa (ms) da zarar an kai iyakar mai samar da OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Mai samar da OAuth zai shiga DEGRADED bayan wannan adadin gazawa. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Matsakaicin ninkin ƙara `resetTimeout` na mai samar da OAuth. | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Mai samar da OAuth zai ƙara matakin ja-da-baya bayan wannan adadin zagayen buɗewa. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: yawan gazawa a cikin lokacin kafin dukkan mai samar da API-key ya shiga lokacin hucewa. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: taga mai motsi ta ƙirga gazawa (ms) ga masu samar da API-key. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: lokacin hucewa (ms) da zarar an kai iyakar mai samar da API-key. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Mai samar da API-key zai shiga DEGRADED bayan wannan adadin gazawa. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Matsakaicin ninkin ƙara `resetTimeout` na mai samar da API-key. | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Mai samar da API-key zai ƙara matakin ja-da-baya bayan wannan adadin zagayen buɗewa. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: yawan gazawa kafin dukkan mai samarwa na gida ya shiga lokacin hucewa. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: taga mai motsi ta ƙirga gazawa (ms) ga masu samarwa na gida. | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Mai katsewa a matakin mai samarwa: lokacin hucewa (ms) da zarar an kai iyakar mai samarwa na gida. | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Zurfin ja-da-baya inda ake ɗaukar mai samar da fil ɗin ma'ajiyar mahallin a matsayin marar lafiya na dindindin, sannan a sauke fil ɗin don sauya zuwa madadi. | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Tagar hana sauyawa akai-akai (ms) da ke jure gajerun lokutan hucewa na wucin gadi kafin sauke fil ɗin ma'ajiyar mahallin. | -### Yanayin Amfani +### Yanayi -| Yanayi | Saitawa | -| --------------------------------------- | -------------------------------------------------------------- | -| **Samar da lamba na dogon lokaci** | `REQUEST_TIMEOUT_MS=900000` (minti 15) | -| **Iyakar jimillar tsawon rayuwar rafi** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (minti 21) | -| **Gaza da sauri don API na samarwa** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **Samfuran tunani mai tsawo** | `STREAM_IDLE_TIMEOUT_MS=300000` (minti 5 tsakanin gutsattsari) | +| Yanayi | Kanfigareshan | +| ------------------------------------------ | ---------------------------------------------------------------- | +| **Ƙirƙirar lamba mai ɗaukar dogon lokaci** | `REQUEST_TIMEOUT_MS=900000` (mintuna 15) | +| **Ƙayyade jimillar tsawon rayuwar rafi** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (mintuna 21) | +| **Gazawa cikin sauri don API na samarwa** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **Samfuran tunani mai tsawo** | `STREAM_IDLE_TIMEOUT_MS=300000` (mintuna 5 tsakanin gutsattsari) | --- @@ -1115,100 +1124,101 @@ wanda ya dace da Anthropic a maimakonsa. ## 21. Lafiyar Proxy -| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | -| ------------------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Wa'adin ƙarewar binciken lafiya na saurin gazawa. | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Tsawon lokacin (awanni) don ƙididdige matsakaicin jinkirin proxy masu yiwuwa a cikin dabarar rukunin da aka inganta bisa jinkiri. | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL na ma'ajiyar sakamakon binciken lafiya. | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL na ma'ajiyar binciken lafiyar proxy da ya gaza. A bar wannan ya fi `PROXY_HEALTH_CACHE_TTL_MS` gajarta domin a sake gwada ƙarewar lokacin proxy na wucin gadi cikin sauri a ƙarƙashin yawan aiki lokaci guda, ba tare da kashe saurin gazawa ga proxy da suka daina aiki gaba ɗaya ba. | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Saita `false` don kashe mai tsara binciken lafiyar proxy da ke aiki a bayan fage, wanda ke gwada proxy da aka yi wa rajista lokaci-lokaci. | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Tazarar zagayen mai tsara binciken lafiya a bayan fage cikin ms (mafi ƙaranci `60000`). | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Manufar gwajin samuwa da mai tsara lokaci da maƙurar `/api/settings/proxies/auto-test` ke amfani da ita. Nuna shi zuwa URL na ciki/mai masaukin kansa don kauce wa tsohon zaɓin jama'a. | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Yawan gwaje-gwajen da ake farawa lokaci guda a kowane rukuni, waɗanda mai tsara lokaci da maƙurar `/api/settings/proxies/auto-test` ke amfani da su tare. Ana sa mafi ƙarancinsu ya zama 1, kuma mafi yawansu 50. | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Jinkiri a ms tsakanin tashin gwaje-gwaje biyu a cikin rukuni. Idan babu shi, dukan rukunin zai tashi a lokaci guda, kuma IP na fita da ake amfani da shi tare zai iya sa manufa mai iyakance yawan buƙatu ta ƙi karɓa. Saita zuwa `0` don kashe tazarar; an iyakance shi zuwa 5000. | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Saita "false" don dakatar da gwada ainihin mai masaukin mai bayarwa da aka sanya wa proxy (`GET /models`, babu maɓallin API), kuma a maimakon haka a koyaushe a yi amfani da `PROXY_HEALTH_TEST_URL`. | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Lokacin da yake `false` (tsohon zaɓi), gwaje-gwajen samuwa na atomatik (mai tsara lokaci + maɓallin "Gwada Duka" na `/api/settings/proxies/auto-test`) na **karantawa kawai** ne kuma ba sa taɓa rubuta matsayin proxy — mai gudanarwa ne kaɗai ke saita aiki/rashin aiki, don kada gwaji marar tabbas ya bar proxy da aka sanya ba ya aiki (#6246). Saita `true` don dawo da tsohuwar halayyar gwadawa-da-saitawa. | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Tutar fasali ta shiga-da-son-rai (duba [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); saitin maye gurbi na DB na dashboard ne ke da rinjaye). `true` (ko `1`, `yes`) yana nuna lura da fitowar rukunin proxy na karantawa kawai a ƙarƙashin rukunin proxy a dashboard (IP na fita daban-daban, haɗe-haɗe, da wanda aka fi gani a bayan IP ɗaya cikin sa'o'i 24 da suka gabata, daga rajistar proxy). Ba a taɓa amfani da shi wajen zaɓar hanya ba. | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Saita `true` don bai wa mai tsara lokaci damar cire proxies ta atomatik bayan gazawa masu jere da suka maimaitu. | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Yawan gazawa masu jere kafin mai tsara lokaci ya cire proxy ta atomatik (lokacin da `PROXY_AUTO_REMOVE=true`). | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Saita zuwa `true` domin bai wa mai tsara aiki damar kashe proxy a hankali (matsayi `dead`, ba za a taɓa gogewa ba) bayan gazawa a jere sau da yawa, maimakon cire shi. Madadin `PROXY_AUTO_REMOVE` ne wanda ba ya lalata bayanai: proxy ɗin zai fita daga pool/rotation resolution nan take (tacewar alive-status da scope-pool resolution ke amfani da ita ta riga ta cire shi) kuma za a sake kunna shi ta atomatik da zarar ya fara cin gwajin probes. Yana amfani da threshold ɗin `PROXY_AUTO_REMOVE_AFTER`. Idan duka flags ɗin suna `true`, `PROXY_AUTO_REMOVE` ne zai yi rinjaye. | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ba da damar hanyoyin OAuth da tabbatar da provider su kauce wa pinned proxy kuma su haɗu kai tsaye idan binciken farko na samuwar proxy ya gaza. Tsarin fifiko mai aiki shi ne override na Feature Flags DB > env var > default. | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `open-sse/services/rateLimitManager.ts` | Matsakaicin lokacin jiran 429 kafin request ɗin ya gaza. | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (minti 10) | `open-sse/services/rateLimitManager.ts` | Iyaka mafi tsawo da request da aka amince da shi zai iya kasancewa yana gudana kafin ajiyar rate-limit ɗinsa ta ƙare — an ware shi daga kasafin lokacin jiran queue domin jinkirin fara fetch a gateways marasa incremental kada ya haifar da time out (#12027). | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (a kashe) | `open-sse/services/rateLimitManager.ts` | Iyakar karɓar request cikin queue: ƙi da 429 `queue_full` da zarar an riga an jera adadin request ɗin nan a queue. `0` = babu iyaka (default). | -| `RATE_LIMIT_AUTO_ENABLE` | _(ba a saita ba)_ | `open-sse/services/rateLimitManager.ts` | Tilasta kunna/kashe kariyar rate limit ta atomatik ba tare da la’akari da saitin Dashboard da aka adana ba. Yana karɓar `true`/`1`/`on` don tilasta kunnawa, `false`/`0`/`off` don tilasta kashewa. | -| `PROVIDER_COOLDOWN_ENABLED` | _(ba a saita ba → a kashe)_ | `open-sse/services/providerCooldownTracker.ts` | Zaɓin shiga don kunna bin diddigin cooldown na provider/connection a duniya kuma a tsakanin requests. A KASHE yake ta default (yana cin karo da Connection Cooldown / Provider Circuit Breaker). Yana karɓar `true`/`1`/`on` don kunnawa. | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Mafi ƙarancin cooldown (ms) kafin a sake gwada provider/connection da ya gaza. Ana ƙara shi bisa exponential gwargwadon gazawa a jere. Ana amfani da shi ne kawai idan `PROVIDER_COOLDOWN_ENABLED`. | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (minti 5) | `open-sse/services/providerCooldownTracker.ts` | Matsakaicin iyakar lokacin hutu (ms) kafin a sake gwada mai samarwa/haɗin da ya gaza ko da kuwa. Ana amfani da shi ne kawai idan `PROVIDER_COOLDOWN_ENABLED`. | -| `STREAM_RECOVERY_ENABLED` | _(ba a saita ba → a kashe)_ | `src/lib/resilience/settings.ts` (farawa) → `open-sse/services/streamRecovery.ts` (dabaru) | **Mene ne:** dawo da rafukan upstream da aka yanke ba tare da an nuna wa mai amfani ba (tashar free-claude-code). Yana riƙe taga buɗewar SSE har zuwa `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), ta yadda yankewar _kafin tabbatarwa_ — wadda ke faruwa kafin kowane byte ya isa ga abokin ciniki — za a sake buɗe ta kuma a sake gwadawa ba tare da an lura ba. **Lokacin kunnawa:** upstreams marasa tabbas/waɗanda suke yawan yanke rafi da byte 0 a farkon rafi; a bar shi a KASHE idan ba za ka iya jure ƙarin lokaci har zuwa 750 ms kafin token na farko a kowane rafi ba. Yana karɓar `true`/`1`/`on`. Yana fara saitin Resilience da ake adanawa; saitin Dashboard ne ke rinjaya da zarar an saita shi. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(ba a saita ba → a kashe)_ | `src/lib/resilience/settings.ts` (farawa) → `open-sse/services/streamRecovery.ts` (dabaru) | **Mene ne:** ci gaba daga tsakiyar rafi (Mataki 4.4) — bayan yankewar _bayan tabbatarwa_ (bytes sun riga sun isa ga abokin ciniki), a sake aika buƙata tare da rubutun da aka samu a matsayin cike-farkon assistant sannan a haɗa ragowar ɓangaren da ya ɓace. Don rafukan rubutu-tsantsa masu dacewa da OpenAI kawai; ba ya taɓa aiki yayin da kiran tool ke gudana. **Lokacin kunnawa:** dogayen samar da amsa waɗanda ake yankewa a tsakiyar amsa kuma ka yarda ɓangaren ƙarshen da aka dawo da shi ya iso lokaci guda maimakon token ɗaya bayan ɗaya. Ba ya dogaro da `STREAM_RECOVERY_ENABLED` (yana da nau'in haɗari daban). Yana karɓar `true`/`1`/`on`. | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(ba a saita ba → a kashe)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Mai sa ido na zaɓi kan fitarwa mai amfani a rafi mai gudana. Yana gano rafukan da ke ci gaba da aika chunks amma suke ƙasa da ƙimar fitarwar assistant da aka saita; heartbeats, abubuwan usage, deltas marasa komai, da matakan tool/reasoning ba sa bayyana a matsayin ci gaba na ƙarya. Ya bambanta da iyakokin lokacin zaman banza da wa'adin ƙarshe tabbatacce. | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Lokacin rangwame kafin tantance throughput, an iyakance shi zuwa 0–600000 ms. | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Taga mai motsi ta fitarwa mai amfani, an iyakance ta zuwa 1000–600000 ms; ana buƙatar cikakkiyar taga guda kafin katsewa. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Mafi ƙarancin ƙimar bytes na UTF-8 na fitarwar assistant a sakan ɗaya (ƙiyasin token na taka-tsantsan), an iyakance shi zuwa 1–1000000. | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Mafi ƙarancin samfurin fitarwa mai amfani wanda ba sifili ba da ake ɗauka a matsayin abin aunawa, an iyakance shi zuwa bytes 1–1000000. | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Tazarar jinkirta lokaci-lokaci (ms) tsakanin binciken lafiyar token na masu samarwa yayin farawa. | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Mafi ƙarancin bazuwar karkatar lokaci (ms) da ake ƙarawa kan `HEALTHCHECK_STAGGER_MS` tsakanin binciken lafiyar token na masu samarwa, don hana aika buƙatu da yawa lokaci guda (Matsala #1220). | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Mafi girman bazuwar karkatar lokaci (ms) da ake ƙarawa kan `HEALTHCHECK_STAGGER_MS` tsakanin binciken lafiyar token na masu samarwa, don hana aika buƙatu da yawa lokaci guda (Matsala #1220). | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Girman rukuni na bincike a lokaci guda don zagayen binciken lafiyar token yayin farawa; ƙimomi masu girma suna bincika haɗin kai da yawa a layi ɗaya, ƙananan ƙimomi kuma suna rage nauyin da ke zuwa kwatsam (Issue #7875, koma-bayan #7719). | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Yawan sake-gwada ta atomatik kan martanin lokacin jira da ya shafi model kafin a mayar da kuskure ga abokin ciniki. | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Matsakaicin tazarar backoff (daƙiƙa) tsakanin sake-gwada bayan lokacin jira. Wannan ƙimar ce za ta iyakance shi ba tare da la’akari da `Retry-After` na upstream ba. | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL na proxy mai rage amfani da token na Headroom. Zagayen rayuwar dashboard (`api/headroom/*`) yana ƙaddamar da CLI na `headroom-ai` na cikin gida a loopback ta tsohuwa; a sauya wannan kawai don nuna wani proxy na Docker sidecar na waje. | - -### Kafaffen ƙimomin daidaita dawo da stream - -Ana daidaita halayyar jinkirta dawo da aiki ta hanyar kafaffen ƙimomi da aka rubuta kai tsaye a cikin +| Variable | Default | Source File | Bayani | +| ------------------------------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Wa'adin ƙarewar binciken lafiya na gazawa cikin sauri. | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Tsawon lokaci (awanni) don ƙididdige matsakaicin jinkirin proxy masu yiwuwa a dabarar rukunin da aka inganta don rage jinkiri. | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL na cache ɗin sakamakon binciken lafiya. | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL na cache don gwaje-gwajen lafiyar proxy da suka gaza. A bar wannan ya fi `PROXY_HEALTH_CACHE_TTL_MS` gajarta domin a sake gwada ƙarewar lokacin proxy na wucin gadi cikin sauri a ƙarƙashin yawan ayyuka masu gudana lokaci guda, ba tare da kashe gazawa cikin sauri ga proxy da suka daina aiki gaba ɗaya ba. | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Saita zuwa `false` don kashe mai tsara binciken lafiyar proxy na bango wanda ke gwada proxy da aka yi wa rajista lokaci-lokaci. | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Tazarar zagayen mai tsara binciken lafiya na bango a cikin ms (mafi ƙaranci `60000`). | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Manufar gwajin samuwa da mai tsara jadawali da endpoint ɗin `/api/settings/proxies/auto-test` ke amfani da ita. Nuna shi zuwa URL na ciki/mai masaukin kansa don guje wa tsohon zaɓin jama'a. | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Yawan gwaje-gwajen da ake farawa lokaci guda a kowane rukuni, wanda mai tsara jadawali da endpoint ɗin `/api/settings/proxies/auto-test` ke amfani da shi tare. Ana kayyade mafi ƙanƙanta zuwa 1, kuma mafi yawa zuwa 50. | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Jinkiri a ms tsakanin tashiwar gwaje-gwaje biyu a cikin rukuni. Idan babu shi, dukkan rukuni zai tashi a lokaci guda, kuma IP na hanyar fita da ake amfani da shi tare zai iya sa manufa mai iyakance yawan buƙatu ta toshe su. Saita zuwa `0` don kashe tazarar; ana kayyade mafi yawa zuwa 5000. | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Saita "false" don dakatar da gwada ainihin masaukin mai samarwar da aka sanya wa proxy (`GET /models`, babu API key), sannan a koyaushe a yi amfani da `PROXY_HEALTH_TEST_URL` a maimakonsa. | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Lokacin da yake `false` (tsohon zaɓi), gwaje-gwajen samuwa na atomatik (mai tsara jadawali + maɓallin "Gwada Duka" na `/api/settings/proxies/auto-test`) na **karantawa kawai** ne kuma ba sa taɓa rubuta matsayin proxy — mai gudanarwa ne kawai yake saita mai aiki/marasa aiki, don haka gwajin da ba ya da tabbas ba zai iya barin proxy da aka sanya ba tare da aiki ba (#6246). Saita `true` don dawo da tsohuwar ɗabi'ar gwadawa-da-saitawa. | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Alamar fasalin da sai an zaɓi shiga (duba [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); saitin maye gurbi na DB na dashboard yana da fifiko). `true` (ko `1`, `yes`) yana nuna lura da hanyar fita ta pool mai karantawa kawai a ƙarƙashin proxy pool a dashboard (IP na hanyoyin fita mabambanta, haɗe-haɗe, da wanda aka fi gani a bayan IP guda cikin awanni 24 da suka gabata, daga log ɗin proxy). Ba a taɓa amfani da shi wajen tsara hanya. | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Saita `true` don bai wa mai tsara jadawali damar cire proxies ta atomatik bayan gazawa a jere sau da yawa. | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Yawan gazawa a jere kafin mai tsara jadawali ya cire proxy ta atomatik (lokacin da `PROXY_AUTO_REMOVE=true`). | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Saita zuwa `true` domin bai wa mai tsara aiki damar kashe proxy a hankali (matsayi `dead`, ba a taɓa gogewa ba) bayan gazawa a jere sau da yawa, maimakon cire shi. Wannan madadi ne marar lalata ga `PROXY_AUTO_REMOVE`: proxy ɗin zai fita daga pool/juyawa nan take (tacewar matsayin alive da ƙudurin scope-pool ke amfani da ita ta riga ta cire shi) kuma za a sake kunna shi ta atomatik da zarar ya fara cin gwajin probes kuma. Yana amfani da threshold na `PROXY_AUTO_REMOVE_AFTER`. Idan duka flags ɗin suna `true`, `PROXY_AUTO_REMOVE` ne ke da rinjaye. | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Ba wa hanyoyin OAuth da tabbatar da ingancin provider damar kauce wa proxy da aka kafe su haɗa kai tsaye idan gwajin farko na samuwar proxy ya gaza. Tsarin fifiko mai aiki shi ne maye gurbin Feature Flags DB > env var > tsoffin ƙimomi. | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `src/lib/resilience/settings.ts` | Tsohon kasafin lokacin **jiran jerin gwano**: tsawon lokacin da request zai iya jiran gurbin provider kuma ya zauna a jerin gwano kafin a ƙi shi, ba tare da taɓa isa upstream ba. Ana share timer da zarar job ya fara aiki — ana iyakance lokacin aiwatarwa daban ta `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Env yana saita tsohuwar ƙima kawai: `resilienceSettings.requestQueue.maxWaitMs` da aka adana, sannan `rateLimitOverrides.maxWaitMs` na kowace connection, kowannensu yana da rinjaye a kansa. | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (minti 10) | `open-sse/services/rateLimitManager.ts` | Iyaka mafi tsawo da request da aka karɓa zai iya kasancewa ana aiwatar da shi kafin ajiyar rate-limit ɗinsa ta ƙare — an ware shi daga kasafin jiran jerin gwano domin jinkirin fara fetch a kan gateways marasa incremental kada ya haifar da time out (#12027). | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (an kashe) | `open-sse/services/rateLimitManager.ts` | Iyakar karɓar shiga jerin gwano: a ƙi da 429 `queue_full` da zarar requests masu wannan adadi sun riga sun kasance a jerin gwano. `0` = babu iyaka (tsohuwar ƙima). | +| `RATE_LIMIT_AUTO_ENABLE` | _(ba a saita ba)_ | `open-sse/services/rateLimitManager.ts` | Tilasta kunna/kashe kariyar rate limit ta atomatik ba tare da la’akari da saitin Dashboard da aka adana ba. Yana karɓar `true`/`1`/`on` don tilasta kunnawa, `false`/`0`/`off` don tilasta kashewa. | +| `PROVIDER_COOLDOWN_ENABLED` | _(ba a saita ba → a kashe)_ | `open-sse/services/providerCooldownTracker.ts` | Zaɓin kunna bin diddigin cooldown na provider/connection na gama-gari a tsakanin requests. A KASHE yake ta tsohuwa (yana cin karo da Connection Cooldown / Provider Circuit Breaker). Yana karɓar `true`/`1`/`on` don kunnawa. | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Mafi ƙarancin cooldown (ms) kafin a sake gwada provider/connection da ya gaza. Yana ƙaruwa a tsarin exponential tare da gazawa a jere. Ana amfani da shi ne kawai idan `PROVIDER_COOLDOWN_ENABLED`. | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (minti 5) | `open-sse/services/providerCooldownTracker.ts` | Matsakaicin iyakar lokacin dakatawa (ms) kafin a sake gwada mai samarwa/haɗin da ya gaza ba tare da la’akari da komai ba. Ana amfani da shi ne kawai idan `PROVIDER_COOLDOWN_ENABLED` yana kunne. | +| `STREAM_RECOVERY_ENABLED` | _(ba a saita ba → a kashe)_ | `src/lib/resilience/settings.ts` (ƙimar farko) → `open-sse/services/streamRecovery.ts` (dabaru) | **Mene ne:** dawo da rafukan upstream da suka yanke ba tare da mai amfani ya lura ba (tashar free-claude-code). Yana riƙe tagar buɗe SSE har zuwa `STREAM_RECOVERY.HOLDBACK_MS` (750 ms), ta yadda yanke na _kafin-commit_ — wanda ke faruwa kafin kowane byte ya isa ga abokin ciniki — za a sake buɗe shi kuma a sake gwadawa ba tare da an gani ba. **Lokacin kunnawa:** idan upstreams ba su da tabbas/suna yawan yankewa da byte 0 a farkon rafi; a bar shi a KASHE idan ba za ku iya ɗaukar ƙarin jinkirin da zai kai 750 ms kafin token na farko a kowane rafi ba. Yana karɓar `true`/`1`/`on`. Yana samar da ƙimar farko ga saitin Resilience da ake adanawa; saitin Dashboard ne ke rinjaye da zarar an saita shi. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(ba a saita ba → a kashe)_ | `src/lib/resilience/settings.ts` (ƙimar farko) → `open-sse/services/streamRecovery.ts` (dabaru) | **Mene ne:** ci gaba daga tsakiyar rafi (Mataki 4.4) — bayan yankewar _bayan-commit_ (bytes sun riga sun isa ga abokin ciniki), a sake aika buƙata tare da ɓangaren rubutun a matsayin assistant prefill sannan a haɗa ƙarshen da ya ɓace. Don rafukan rubutu-tsantsa masu dacewa da OpenAI kawai; ba ya taɓa aiki yayin da ake gudanar da tool call. **Lokacin kunnawa:** don dogayen samar da amsa da ake yankewa a tsakiyar amsa, kuma kun yarda ɓangaren ƙarshen da aka dawo da shi ya zo lokaci guda maimakon token-bi-token. Ba ya dogara da `STREAM_RECOVERY_ENABLED` (yana da tsarin haɗari daban). Yana karɓar `true`/`1`/`on`. | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(ba a saita ba → a kashe)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Mai sa ido na fitarwa mai amfani na rafi mai aiki, wanda sai an zaɓi kunna shi. Yana gano rafukan da ke ci gaba da aika guntu-guntu amma suka kasance ƙasa da ƙimar fitarwar assistant da aka saita; heartbeats, al’amuran amfani, empty deltas, da matakan kayan aiki/tunani ba sa bayyana a matsayin ci gaba na ƙarya. Ya bambanta da iyakokin lokacin zaman banza da na ƙarshe marar sassauci. | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Lokacin rangwame kafin kimanta throughput, wanda aka iyakance zuwa 0–600000 ms. | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Tagar fitarwa mai amfani mai motsi, wadda aka iyakance zuwa 1000–600000 ms; ana buƙatar cikakkiyar taga guda kafin a katse. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Mafi ƙarancin ƙimar bytes na UTF-8 na fitarwar assistant a cikin daƙiƙa guda (madaidaicin wakilin token mai taka-tsantsan), wanda aka iyakance zuwa 1–1000000. | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Mafi ƙarancin samfurin fitarwa mai amfani wanda ba sifili ba da ake ɗauka a matsayin abin aunawa, wanda aka iyakance zuwa bytes 1–1000000. | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Tsakanin lokacin jere-jere (ms) tsakanin binciken lafiyar token na masu samarwa yayin farawa. | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Mafi ƙarancin jitter na bazuwar lokaci (ms) da ake ƙarawa a kan `HEALTHCHECK_STAGGER_MS` tsakanin binciken lafiyar token na masu samarwa, don hana taruwa lokaci guda (Batu #1220). | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Matsakaicin jitter na bazuwar lokaci (ms) da ake ƙarawa a kan `HEALTHCHECK_STAGGER_MS` tsakanin binciken lafiyar token na masu samarwa, don hana taruwa lokaci guda (Batu #1220). | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Girman rukunin dubawa lokaci guda don zagayen binciken lafiyar token yayin farawa; ƙimomi mafi girma suna duba ƙarin haɗe-haɗe a lokaci guda, yayin da ƙimomi mafi ƙanƙanta ke rage nauyin da ke zuwa kwatsam (Issue #7875, koma-bayan #7719). | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Adadin sake-gwada ta atomatik kan martanin lokacin jira da ya shafi model kafin a mayar da kuskure ga client. | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Matsakaicin tazarar backoff (daƙiƙa) tsakanin sake-gwada bayan lokacin jira. Wannan ƙimar ce ke iyakance shi ba tare da la’akari da `Retry-After` na upstream ba. | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL na proxy mai adana token na Headroom. Zagayen rayuwar dashboard (`api/headroom/*`) yana ƙaddamar da CLI na `headroom-ai` na gida a kan loopback ta tsohuwa; a sauya wannan kawai don nuna wani proxy na Docker sidecar na waje. | + +### Konstantocin daidaita dawo da stream + +Ana daidaita halayyar jinkirta dawo da aiki ta hanyar konstantoci da aka hardcode a cikin `open-sse/config/constants.ts` (`STREAM_RECOVERY`), waɗanda aka nuna a nan don tunani — -canza su yana buƙatar gyara code, ba env var ba: +sauya su yana buƙatar gyaran code, ba env var ba: -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — tsawon lokacin da ake riƙe taga ta farko ta SSE - domin a sake gwadawa idan ta yanke da wuri kafin a tura ko da byte ɗaya ga abokin ciniki. -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — iyakar ƙarshe ta tagar da ake riƙewa; a commit - (flush + passthrough) da zarar wannan adadin bytes ya taru, ba tare da la’akari da timer ba. -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — matsakaicin adadin sake-buɗe stream na upstream - ba tare da bayyana wa mai amfani ba yayin da har yanzu ba a commit holdback ɗin ba. +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — tsawon lokacin da ake riƙe taga ta farkon SSE + domin a sake gwadawa idan an yanke ta da wuri kafin a aika ko da byte ɗaya zuwa ga client. +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — iyaka tabbatacciya ga tagar da aka riƙe; a commit + (flush + passthrough) da zarar bytes masu yawa haka sun taru, ba tare da la’akari da timer ba. +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — matsakaicin adadin sake buɗe stream na upstream + a bayyane ba tare da client ya sani ba yayin da holdback bai riga ya yi commit ba. -> **Iyakar ƙimar sliding-window ta kowane provider (babu env var):** madadin iyakar ƙimar -> sliding-window ta kowane provider da aka ɗauko daga FCC yana cikin code +> **Iyakance ƙimar sliding-window ta kowane provider (babu env var):** _fallback_ na +> iyakance ƙimar sliding-window ta kowane provider da aka ɗauko daga FCC yana cikin code > (`open-sse/services/providerDefaultRateLimit.ts`, an haɗa shi ta hanyar -> `open-sse/services/rateLimitManager.ts`) amma ana fitar da shi da **taswirar tsoho mara komai** +> `open-sse/services/rateLimitManager.ts`) amma ana tura shi da **taswirar tsoho mara komai** > kuma a halin yanzu **ba shi da env var na operator** — ana kunna shi ne kawai ta hanyar test hook / -> gyaran code. Da gangan ba a jera shi a teburin da ke sama ba. Mai iyakance relay na kowane -> `(token, IP)` wanda _yake_ da abin da za a daidaita shi ne `RELAY_IP_PER_MINUTE` (§3 Network & Ports). +> gyaran code. Da gangan ba a jera shi a jadawalin da ke sama ba. Mai iyakance relay na kowane-`(token, IP)` +> wanda _yake_ da maɓallin daidaitawa shi ne `RELAY_IP_PER_MINUTE` (§3 Network & Ports). --- -## 22. Gano da gyara kurakurai +## 22. Gano Kurakurai > [!CAUTION] -> Waɗannan variables suna samar da **cikakken output** kuma suna iya fallasa bayanai masu muhimmanci. **Kada a taɓa kunna su a production.** - -| Variable | Na asali | Source File | Bayani | -| ------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(ba a saita ba)_ | `open-sse/executors/cursor.ts` | Saita `1` don kunna cikakkun logs na Cursor executor (decoded SSE chunks, da sauransu). | -| `CURSOR_STREAM_DEBUG` | _(ba a saita ba)_ | `open-sse/executors/cursor.ts` | Alias na `CURSOR_DEBUG` mai dacewa da tsofaffin nau'ikan tsarin. | -| `CURSOR_DUMP_FILE` | _(ba a saita ba)_ | `open-sse/executors/cursor.ts` | File path na zaɓi da ke karɓar raw decoded Cursor chunks lokacin da `CURSOR_DEBUG=1`. | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Iyakar lokacin da stream zai kasance babu aiki (ms) ga Cursor executor. | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Ƙarin lokacin jira (ms) bayan composer kv_after_text soft terminator yayin da har yanzu akwai bytes a buffer — yana ba trailing exec_mcp tool call lokaci don kammala frame ɗinsa. | -| `CURSOR_TOOL_DIRECTIVE` | a kunne (`!== "0"`) | `open-sse/executors/cursor.ts` | Tool-commit directive da ke sa composer-2.5 ya yi tool calls cikin aminci. Saita `0` don kashewa. | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(ba a saita ba)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Rubutun system prompt da operator ya ayyana wanda ake liƙawa ga system message BAYAN translation (post-translation injection), har ya isa hanyoyin codex/Responses da `/v1/messages`. Haka kuma ana amfani da shi a matsayin directive prefix da ake cirewa daga echoed system preamble blocks. Bar shi ba a saita ba don kashewa. | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Iyakar lokacin ɗauko kowane image (ms) don remote `image_url` vision input. | -| `CURSOR_STATE_DB_PATH` | _(an bincika)_ | `open-sse/utils/cursorVersionDetector.ts` | Sauya Cursor IDE state DB lookup da ake amfani da shi don gano sigar IDE. | -| `CURSOR_AGENT_CLI_VERSION` | _(gano / ƙayyade)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent CLI build id (`YYYY.MM.DD-`) don `x-cursor-client-version: cli-…` a Agent Run. | -| `CURSOR_AGENT_BIN` | _(ba a saita ba)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Path zuwa Cursor Agent binary da ake amfani da shi wajen samar da images. Idan ba a saita ba, handler yana amfani da `providerSpecificData.agentBin`, sannan PATH. | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jimillar iyakar lokacin kowane image (ms) ga ayyukan image na Cursor Agent. | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ƙofar concurrency ta shared-seat ga ayyukan image na Cursor. | -| `CURSOR_IMG_MODEL` | request / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sauya Cursor CLI `--model` don ayyukan image. | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Tazarar binciken sakamakon image-gen na UC (uncensored.com) (ms). | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Jimillar iyakar lokacin binciken sakamakon image-gen na UC (ms). | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Tazarar binciken sakamakon video-gen na UC (uncensored.com) (ms). | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Jimillar iyakar lokacin binciken sakamakon video-gen na UC (ms). | -| `CURSOR_DATA_DIR` | _(an bincika)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Sauya Cursor Agent CLI data dir (`…/versions/`); variable ɗin da official agent ke amfani da shi ne. | -| `CURSOR_TOKEN` | _(ba a saita ba)_ | `scripts/ad-hoc/cursor-tap.cjs` | Cursor bearer token na kai tsaye da developer tooling ke amfani da shi. | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | a kashe (ana kunna shi ta `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Yi log na alamomin content-type/length ga manyan chat payloads idan an saita `"1"`. A kashe yake ta asali don rage cunkoson log. | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(ba a saita ba)_ | `open-sse/handlers/responseTranslator.ts` | Saita `true` don yin log na bayanan translation na Responses API SSE→JSON. | -| `DEBUG_CLAUDE_NONSTREAM` | _(ba a saita ba)_ | `open-sse/handlers/responseTranslator.ts` | Saita `true` don bayyana empty textContent chunks a hanyar translation ta Claude response (don debugging kawai). | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(ba a saita ba)_ | E2E test harness | Saita `true` don kunna E2E test mode (sauƙaƙa auth, test hooks). | +> Waɗannan sauye-sauyen suna samar da **cikakken fitarwa** kuma suna iya fallasa bayanai masu muhimmanci. **Kada a taɓa kunna su a yanayin samarwa.** + +| Sauyi | Tsoho | Fayil ɗin Tushe | Bayani | +| ------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CURSOR_DEBUG` | _(ba a saita ba)_ | `open-sse/executors/cursor.ts` | Saita `1` don kunna cikakkun rajistocin mai gudanarwar Cursor (ɓangarorin SSE da aka warware, da sauransu). | +| `CURSOR_STREAM_DEBUG` | _(ba a saita ba)_ | `open-sse/executors/cursor.ts` | Wani suna na `CURSOR_DEBUG` mai dacewa da tsoffin sigogi. | +| `CURSOR_DUMP_FILE` | _(ba a saita ba)_ | `open-sse/executors/cursor.ts` | Tafarkin fayil na zaɓi wanda ke karɓar ɗanyen ɓangarorin Cursor da aka warware lokacin da `CURSOR_DEBUG=1`. | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Lokacin ƙarewar rashin aiki na rafi (ms) don mai gudanarwar Cursor. | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Tagar rangwame (ms) bayan mai ƙarewa mai laushi na composer kv_after_text yayin da bytes suka rage a ma'ajiyar wucin gadi — tana ba kiran kayan aikin exec_mcp da ke biyo baya lokaci don kammala firam ɗinsa. | +| `CURSOR_TOOL_DIRECTIVE` | an kunna (`!== "0"`) | `open-sse/executors/cursor.ts` | Umarnin tabbatar da kayan aiki wanda ke sa composer-2.5 ya riƙa yin kiran kayan aiki yadda ya kamata. Saita `0` don kashewa. | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(ba a saita ba)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Rubutun tsokana na tsarin da mai gudanarwa ya ayyana, wanda ake liƙawa ga saƙon tsarin BAYAN fassara (saka bayan fassara), yana isa ga hanyoyin codex/Responses da `/v1/messages`. Haka kuma ana amfani da shi a matsayin farkon umarnin da ake cirewa daga tubalan gabatarwar tsarin da aka maimaita. Bar shi ba a saita ba don kashewa. | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (a kashe) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Saita `1` don cire tubalan gabatarwar tsokanar tsarin da aka maimaita daga farkon rafin openai→claude. A kashe yake ta tsohuwa — dabarun hasashen sun dace da tsarin rubutun Turanci kuma suna sauya bayanan amsa, don haka amsar da ta fara da irin wannan sashe bisa halas za ta rasa shi. | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Lokacin ƙarewar ɗauko kowane hoto (ms) don shigar hangen nesa na `image_url` mai nisa. | +| `CURSOR_STATE_DB_PATH` | _(ana bincikawa)_ | `open-sse/utils/cursorVersionDetector.ts` | Sauya binciken DB na yanayin Cursor IDE da ake amfani da shi wajen gano sigar IDE. | +| `CURSOR_AGENT_CLI_VERSION` | _(gano / kafa)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ID na ginin Agent CLI (`YYYY.MM.DD-`) don `x-cursor-client-version: cli-…` a Agent Run. | +| `CURSOR_AGENT_BIN` | _(ba a saita ba)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Tafarkin binary na Cursor Agent da ake amfani da shi wajen samar da hotuna. Idan ba a saita ba, mai sarrafawa yana amfani da `providerSpecificData.agentBin`, sannan PATH. | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jimillar lokacin da aka ware wa kowane aiki na hoton Cursor Agent (ms). | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ƙofar yawan ayyukan hoton Cursor da za su iya gudana lokaci guda a wurin da ake rabawa. | +| `CURSOR_IMG_MODEL` | buƙata / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Sauya `--model` na Cursor CLI don ayyukan hoto. | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Tazarar binciken sakamakon samar da hoto na UC (uncensored.com) (ms). | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Jimillar lokacin jiran binciken sakamakon samar da hoto na UC (ms). | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Tazarar binciken sakamakon samar da bidiyo na UC (uncensored.com) (ms). | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Jimillar lokacin jiran binciken sakamakon samar da bidiyo na UC (ms). | +| `CURSOR_DATA_DIR` | _(ana bincikawa)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Sauya kundin bayanan Cursor Agent CLI (`…/versions/`); sauyi ɗaya ne da wakilin hukuma ke amfani da shi. | +| `CURSOR_TOKEN` | _(ba a saita ba)_ | `scripts/ad-hoc/cursor-tap.cjs` | Token bearer na Cursor kai tsaye wanda kayan aikin masu haɓakawa ke amfani da shi. | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | a kashe (ana kunna shi da `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Yi rajistar alamomin nau'in abun ciki/tsawo don manyan bayanan chat lokacin da aka saita `"1"`. A kashe yake ta tsohuwa don rage cunkoson rajista. | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(ba a saita ba)_ | `open-sse/handlers/responseTranslator.ts` | Saita `true` don yin rajistar bayanan fassarar Responses API SSE→JSON. | +| `DEBUG_CLAUDE_NONSTREAM` | _(ba a saita ba)_ | `open-sse/handlers/responseTranslator.ts` | Saita `true` don bayyana ɓangarorin textContent marasa komai a hanyar fassarar amsar Claude (don gano kurakurai kawai). | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(ba a saita ba)_ | Tsarin gwajin E2E | Saita `true` don kunna yanayin gwajin E2E (sauƙaƙƙen tantancewa, ƙugiyoyin gwaji). | --- @@ -1226,9 +1236,9 @@ Ba wa masu amfani damar kai rahoton matsaloli kai tsaye daga Dashboard. ## Yanayin Turawa -Don jagorar SRE na backend relay (halayen ts/bifrost/auto, sanya 9router idan aka kwatanta da CLIProxyAPI, da dabarar komawa madadin don yawan zirga-zirga), duba [Dabarar Backend Relay](/docs/reference/RELAY_BACKEND_STRATEGY.md). +Don jagorar SRE na backend ɗin relay (halayen ts/bifrost/auto, wurin sanya 9router da CLIProxyAPI, da dabarar madadin aiki mai yawa), duba [Dabarar Backend na Relay](/docs/reference/RELAY_BACKEND_STRATEGY.md). -### Ƙaramin Ci-gaban Gida +### Ƙaramin Yanayin Ci Gaba na Cikin Gida ```bash JWT_SECRET=$(openssl rand -base64 48) @@ -1238,7 +1248,7 @@ PORT=20128 NODE_ENV=development ``` -### Samarwa da Docker +### Yanayin Samarwa na Docker ```bash JWT_SECRET= @@ -1257,7 +1267,7 @@ OMNIROUTE_MEMORY_MB=8192 CORS_ORIGIN=https://your-frontend.example.com ``` -### Muhalli Marar Haɗin Intanet / CI +### Muhalli Mara Haɗin Intanet / CI ```bash JWT_SECRET=test-jwt-secret-for-ci diff --git a/docs/i18n/ha/docs/reference/FEATURE_FLAGS.md b/docs/i18n/ha/docs/reference/FEATURE_FLAGS.md index a5b764d27a05..668a0d3a754c 100644 --- a/docs/i18n/ha/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/ha/docs/reference/FEATURE_FLAGS.md @@ -44,124 +44,126 @@ Ana ɗaukar tutar boolean a matsayin **mai aiki** idan ƙimarta mai aiki ita ce ## Kundin Tutoci -Tutoci 72 a rukuni 6. **Tsoho** shi ne tsohon ƙimar ayyana — ƙimar da ake -amfani da ita idan babu sauyin DB ko environment variable. +Tutoci 74 a cikin rukuni 6. **Tsoho** shi ne tsohon ƙimar da aka ayyana — ƙimar da +ake amfani da ita idan babu ƙimar maye gurbin DB ko environment variable. ### Tsaro (10) -| Maɓalli | Nau'i | Tsoho | Bayani | -| --------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Buƙaci API key ga duk buƙatun da ke shigowa. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Kunna tsabtace bayanan shigarwa ga duk buƙatu. | -| `INJECTION_GUARD_MODE` | enum | `off` | Yanayin kariya daga prompt injection. Ƙimomi: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Ɓoye PII daga buƙatu (ba tare da dogaro da `INPUT_SANITIZER_MODE` ba). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Tsabtace PII daga amsoshin mai samarwa. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Yanayin tsabtace PII daga amsa. Ƙimomi: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Toshe buƙatun da ke fita zuwa keɓaɓɓun/ciki-cikin kewayon IP. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Ba masu amfani da dashboard da aka tantance izinin bayyana API keys da aka adana maimakon ganin ƙimomin da aka ɓoye kawai. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Haɗa prefix na account a layukan log na AUTH (misali, "Ana amfani da account na : abc12345..."). An kashe shi ta tsohuwa domin a ɓoye masu gano account daga log na process da ake rabawa/mai tenants da yawa. Ba ya dogaro da Debug Mode; kunna Debug Mode ba ya bayyana wannan. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Idan an kunna OIDC, kashe shiga da password domin masu amfani su iya tantance kansu ta OIDC Single Sign-On kawai. Idan an kashe shi (tsoho), shiga da password da OIDC dukansu suna samuwa. | - -### Hanyar Sadarwa (15) - -| Maɓalli | Nau'i | Tsoho | Sake farawa | Bayani | -| ----------------------------------------------- | ------- | ------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Kunna yanayin ɓoye sawun TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Ba wa hanyoyin /v1/audio/* damar amfani da nodes na masu samarwa masu dacewa da OpenAI waɗanda ake masaukinsu a wajen localhost. A kashe yake ta tsohuwa — tura sauti zuwa masauki mai nisa yana sauya shaidar fita, don haka dole ne ya zama shawara bayyananniya ta mai gudanarwa. Ana yarda da loopback nodes koyaushe kuma wannan ba ya shafarsu. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Idan ba a sanya proxy ga haɗi ba, zaɓi proxy na farko da ke aiki daga rajista ta atomatik. A kashe yake ta tsohuwa (in ba haka ba, kowane proxy na rajista zai zama madadin gama-gari — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Ba wa hanyoyin OAuth da tabbatar da ingancin mai samarwa damar tsallake proxy da aka ɗaure su haɗa kai tsaye idan gwaje-gwajen farko na isa ga proxy suka gaza. A kashe yake ta tsohuwa saboda wannan na iya sauya IP na fita. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Idan keɓantacciyar matsalar hanyar sadarwa ta faru (wucewar lokaci, ƙin haɗi ko sake saita haɗi) ga mai aiwatar da juyawa na asusu da yawa, kuma asusun da ya gaza ba shi da keɓaɓɓen proxy, sanya ɗan gajeren lokacin jira sannan a tsallake sauran asusun da ba su da proxy har ƙarshen buƙatar maimakon sake gwada kowannensu. A kunne yake ta tsohuwa (lafiyayye: babu sauyin IP na fita, kawai yana rage jinkiri ko haɗarin lokacin jira ga asusun da ke amfani da fita ɗaya). Kashe shi don dawo da yaɗawa nan take a kuskuren farko daga asusun da ba shi da proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Rukunin proxies da juyawar opencode ta kowane asusu suna daina sake bayar da proxy da ya gaza kwanan nan (gwajin TCP da aka ƙi, ko 429 da aka karɓa ta cikinsa) na wani lokaci a cikin kowace process, wanda ke ninkuwa a kowane maimaituwa har zuwa iyaka. Ba a rubuta wani matsayi na proxy; idan aka keɓe dukkan candidates, zaɓin ba ya canzawa. A kashe yake ta tsohuwa. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Nuna, a ƙarƙashin rukunin proxy a dashboard, adadin IP na fita da aka lura sun yi wa membobinsa hidima cikin awanni 24 da suka gabata da kuma adadin haɗin da suka yi amfani da su. Na karantawa kawai ne, ana ƙididdige shi daga log ɗin proxy, kuma ba a taɓa amfani da shi wajen routing. A kashe yake ta tsohuwa. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Ga mai aiwatar da OpenCode, sa ido kan byte na farko na body daga amsar Responses mai streaming (window: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, tsoho `15000`). Ana ɗaukar stream na Responses mai 2xx wanda ya ci gaba da yin shiru bayan window a matsayin wanda ya tsaya: ana sanya asusun cikin lokacin jira kuma buƙatar tana juyawa zuwa asusu na gaba sau ɗaya; tsayawa na biyu yana sa ta gaza nan take. A kashe yake ta tsohuwa: streams da suka tsaya suna ci gaba da jiran yau har zuwa timeout na shirin stream. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Mai aiwatar da OpenCode: idan an sami 403/451 mai ɗauke da ƙin `user_blocked` (ba na yanki ba, kuma ba ƙin sawun Cloudflare ba), sanya asusun da aka ƙi cikin lokacin jira sannan a juya zuwa asusu na gaba sau ɗaya kacal a kowace buƙata; ana mayar da ƙin na biyu yadda yake, ba tare da alamar nasara ba. A kashe yake ta tsohuwa: karkatar da routing don kauce wa toshewar mai amfani daga upstream na iya zama kamar ƙoƙarin kaucewa kuma ya yaɗa alamar a dukkan fleet. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Juyawar OpenCode: bayan gazawar wucin-gadi guda biyu a jere daga upstream (5xx ko 400 mara komai), a dakata kafin asusu na gaba — 1.5s wanda ke ninkuwa da biyu ga kowace ƙarin gazawa, tare da iyaka ta 6s ga kowace dakatawa da 10s ga kowace buƙata; ba a yin hakan idan abokin ciniki ya katse haɗin; ana saki jikin amsar da ta gaza kafin jira. A kashe yake ta tsohuwa: sauya hanyar gazawa yana nan take. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Juyawar OpenCode: dakatar da zagayen asusu a 429 na farko da aka tantance a matsayin ainihin iyakance ƙimar buƙatu (`Retry-After` mai yiwuwa a fassara, ko jiki da ke ambaton iyakar ƙima/amfani), sannan a mayar da wannan 429 na upstream ba tare da canji ba. 429 da ba a tantance ba suna ci gaba da juyawa. A kashe yake ta tsohuwa: ana iyakance matakin kyauta bisa kowane IP na fita (#9611), don haka kowane 429 yana haddasa juyawa, kuma idan zagayen ya ƙare ana mayar da 429 na upstream na ƙarshe. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Kashe tabbatar da takardar shaidar TLS ga wakilin MITM. **Haɗari.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Ba da izinin URLs na masu samarwa waɗanda ke nuni zuwa cibiyoyin sadarwa masu zaman kansu/na ciki. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Ba da izinin ƙara/tabbatar da masu samarwa a adiresoshin gida/masu zaman kansu (127.0.0.1, localhost, LAN). A kunne yake ta tsohuwa (gida-farko); kashe shi don tsauraran toshewa ga duk abin da ba na jama'a ba. Metadata na cloud yana ci gaba da kasancewa a toshe. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Kunna yanayin mai samarwa mai dacewa da Claude Code. | +| Maɓalli | Nau'i | Tsoho | Bayani | +| --------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Buƙaci API key don duk buƙatun da ke shigowa. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Kunna tsaftace bayanan shigarwa don duk buƙatu. | +| `INJECTION_GUARD_MODE` | enum | `off` | Yanayin kariya daga prompt injection. Ƙimomi: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Ɓoye PII daga buƙatu (ba tare da dogaro da `INPUT_SANITIZER_MODE` ba). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Tsaftace PII daga martanin mai samarwa. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Yanayin tsaftace PII daga martani. Ƙimomi: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Toshe buƙatun da ke fita zuwa jeri na IP masu zaman kansu/na ciki. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Ba masu amfani da dashboard da aka tantance damar bayyana API keys da aka adana maimakon ganin ƙimomin da aka rufe kawai. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Haɗa farkon account a layukan log na AUTH (misali, "Ana amfani da account na : abc12345..."). An kashe shi ta tsohuwa domin a ɓoye alamomin account daga logs na tsarin da ake rabawa/mai masu haya da yawa. Ba ya dogaro da Debug Mode; kunna Debug Mode ba ya bayyana wannan. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Idan an kunna OIDC, kashe shiga ta password domin masu amfani su iya tantance kansu ta OIDC Single Sign-On kawai. Idan an kashe shi (tsoho), shiga ta password da OIDC duk suna samuwa. | + +### Hanyar Sadarwa (16) + +| Maɓalli | Nau'i | Tsoho | Sake kunnawa | Bayani | +| ----------------------------------------------- | ------- | ------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Kunna yanayin ɓoye sawun yatsa na TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Ba wa hanyoyin /v1/audio/* damar amfani da nodes na masu bayarwa masu dacewa da OpenAI waɗanda aka ɗauki nauyinsu a wajen localhost. A kashe yake ta tsohuwa — tura audio zuwa remote host yana sauya shaidar egress kuma dole ya zama shawara bayyananniya ta mai gudanarwa. Ana ba da izinin loopback nodes koyaushe kuma wannan ba ya shafarsu. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Ba wa POST /v1/rerank (da matakin loopback rerank na memory engine) damar amfani da nodes na masu bayarwa masu dacewa da OpenAI waɗanda aka ɗauki nauyinsu a wajen localhost. A kashe yake ta tsohuwa — turawa zuwa remote host yana sauya shaidar egress kuma dole ya zama shawara bayyananniya ta mai gudanarwa. Ana ba da izinin loopback nodes koyaushe; remote nodes kuma dole su cika provider outbound URL policy. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Idan ba a sanya proxy ga connection ba, zaɓi proxy na farko mai aiki daga registry ta atomatik. A kashe yake ta tsohuwa (in ba haka ba, kowane registry proxy zai zama global fallback — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Ba wa OAuth da hanyoyin tantance provider damar ƙetare pinned proxy su haɗa kai tsaye idan gwaje-gwajen farko na samuwar proxy suka gaza. A kashe yake ta tsohuwa saboda wannan na iya sauya egress IP. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Idan aka samu network exception (timeout, an ƙi ko an sake saita connection) ga multi-account rotation executor, kuma asusun da ya gaza ba shi da dedicated proxy, sanya ɗan gajeren cooldown sannan a tsallake sauran asusun da ba su da proxy har ƙarshen request maimakon sake gwada kowannensu. A kunne yake ta tsohuwa (lafiyayye: babu sauyin egress IP, yana rage haɗarin latency/cooldown ne kawai ga shared-egress accounts). Kashe shi don dawo da yaɗuwar kuskure nan take a kuskuren farko na asusun da ba shi da proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proxy pools da per-account rotation na opencode za su daina sake bayar da proxy da ya gaza kwanan nan (an ƙi TCP probe, ko kuma an karɓi 429 ta cikinsa) na wani lokaci na kowane process wanda ke ninkuwa a kowane maimaitawa, har zuwa iyaka. Ba a rubuta proxy status; idan an ware dukkan candidates, zaɓin ba ya canzawa. A kashe yake ta tsohuwa. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Nuna, a ƙarƙashin proxy pool a dashboard, adadin observed egress IPs da suka yi wa members ɗinsa hidima a cikin awanni 24 da suka gabata da kuma adadin connections da suka yi amfani da su. Read-only ne, ana lissafa shi daga proxy log, kuma ba a taɓa amfani da shi wajen routing. A kashe yake ta tsohuwa. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Ga OpenCode executor, sa ido kan body byte na farko na streamed Responses reply (window: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, tsoho `15000`). Duk 2xx Responses stream da ya yi shiru fiye da window za a ɗauke shi a matsayin stalled: za a sanya account cikin cooldown sannan a juya request zuwa account na gaba sau ɗaya; stall na biyu zai sa a gaza nan take. A kashe yake ta tsohuwa: stalled streams za su ci gaba da jira kamar yadda ake yi yanzu har zuwa stream readiness timeout. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Mai aiwatar da OpenCode: idan an samu 403/451 mai ɗauke da ƙin amincewar `user_blocked` (ba na yanki ba, kuma ba ƙin amincewa saboda sawun yatsa na Cloudflare ba), a dakatar da asusun da aka ƙi na ɗan lokaci sannan a juya zuwa asusu na gaba sau ɗaya kacal ga kowace buƙata; ƙin amincewa na biyu za a mayar da shi yadda yake, ba tare da alamar nasara ba. A kashe yake ta tsohuwa: kauce wa toshewar mai amfani daga sabis na sama na iya kama da yunƙurin kauce wa ƙuntatawa kuma ya yaɗa alamar zuwa dukkan rukunin asusu. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Juyawar OpenCode: bayan gazawar wucin gadi guda biyu a jere daga sabis na sama (5xx ko 400 mara jiki), a dakata kafin asusu na gaba — 1.5s yana ninkuwa ga kowace ƙarin gazawa, tare da iyaka ta 6s ga kowace dakatawa da 10s ga kowace buƙata, kuma a tsallake idan abokin hulɗa ya yanke haɗi; ana sakin jikin martanin gazawar kafin jira. A kashe yake ta tsohuwa: sauyawa bayan gazawa yana ci gaba nan take. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Juyawar OpenCode: a dakatar da zagayen asusu a 429 na farko da aka tantance a matsayin ainihin iyakance ƙimar amfani (`Retry-After` mai yiwuwa a fassara, ko jiki da ya ambaci iyakar ƙima/amfani) sannan a mayar da wannan 429 na sabis na sama ba tare da canji ba. 429 da ba a tantance ba suna ci gaba da juyawa. A kashe yake ta tsohuwa: matakin kyauta yana da iyaka bisa kowane IP na fita (#9611), don haka kowane 429 yana haifar da juyawa kuma zagayen da ya ƙare yana mayar da 429 na ƙarshe daga sabis na sama. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Kashe tabbatar da takardar shaidar TLS ga wakilin MITM. **Haɗari.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Ba da damar URL na masu samarwa da ke nuni zuwa cibiyoyin sadarwa masu zaman kansu/na ciki. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Ba da damar ƙara/tabbatar da masu samarwa a adireshi na gida/masu zaman kansu (127.0.0.1, localhost, LAN). A kunne yake ta tsohuwa (gida-da-farko); kashe shi don tsauraran toshewa da ke yarda da na jama'a kawai. Ana ci gaba da toshe metadata na cloud. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Kunna yanayin mai samarwa mai dacewa da Claude Code. | ### Manufofi (5) -| Maɓalli | Nau'i | Tsoho | Bayani | -| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Yanayin tilasta manufar amfani da kayan aiki. Ƙimomi: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Kunna iyakance ƙimar buƙatu ta atomatik bisa tsarin amfani. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Tsallake duba taga mahallin gida / matsakaicin token na shigarwa na OmniRoute don buƙatun kai tsaye na model guda ɗaya. Iyakokin upstream har yanzu suna aiki. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Ƙi buƙatu kafin aikawa idan model ɗin da aka nufa ba shi da damar da ake buƙata (gani, kayan aiki, fitowar mai tsari, taga mahalli). Yana kare buƙatun kai tsaye na mai samarwa guda ɗaya waɗanda ke tsallake matatar dacewa ta combo-layer. | -| `RADAR_ENABLED` | boolean | `false` | Kunna module ɗin OmniRoute Radar (fuskokin catalog feed da daidaitawa). A kashe yake ta tsohuwa; kunnawa yana buɗe UI kawai — daidaita bayanai har yanzu zaɓi ne daban da dole a amince da shi. | - -### Lokacin gudana (32) - -| Maɓalli | Nau'i | Tsoho | Sake farawa | Bayani | -| ------------------------------------------- | ------- | ------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Samar da kuma shigar da taƙaitaccen bayanin tattaunawa lokacin da combo routing ya sauya samfura. Kashe wannan don ɗaukar sauyin samfura daban-daban kuma a hana buƙatun mika bayanai na bayan fage ga duk combos na yanzu da na gaba. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Cire abubuwan fitarwa na cikin gida na matakin sharhi daga rafukan passthrough na Responses API kafin a tura su ga abokan ciniki. Kashe wannan don karɓar sharhin upstream kai tsaye. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Tilasta ƙuntatawar scope kan samun damar kayan aikin MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Matse bayanan kayan aikin MCP don rage amfani da token. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Kunna sarrafa ayyukan bayan fage a lokacin runtime. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Kashe duk ayyukan bayan fage (sabunta quota, sync, da sauransu). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Amince da matatun RTK na matakin project ba tare da validation ba. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Fara uwar garken WebSocket na dashboard na ainihin lokaci yayin import (port 20132 ta tsohuwa). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Ba Codex damar amfani da hanyar jigilar Responses-over-WebSocket. Idan an kashe, Codex zai koma amfani da HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Ba Codex damar amfani da hanyar jigilar JSON-RPC ta WebSocket ta app-server na cikin gida (codexTransport=app-server). Idan an kashe, haɗin da aka zaɓa don app-server zai koma amfani da sauran hanyoyin jigilar Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Tura buƙatun da kasafin kuɗinsu ya ƙare zuwa mai samarwa/samfurin madadin kyauta na gaggawa. (Duba [Madadin Kasafin Kuɗi na Gaggawa](#emergency-budget-fallback) a ƙasa.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Kunna sake gwadawa da wuri ba tare da bayyanawa ba ga rafukan SSE na uwar-garken sama da suka yanke, kafin kowane byte na amsa ya isa ga abokin ciniki. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Ba da damar farfaɗo da rafi ta sake aika buƙata da haɗa amsa bayan bytes sun riga sun isa ga abokin ciniki. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Sa ci gaba daga tsakiyar rafi ya zama amintacce ga kiran kayan aiki: kada a taɓa ci gaba da rafi da ya yanke da zarar an fitar da kiran kayan aiki (yana gudana ko ya riga ya ƙare da finish_reason tool_calls), sannan a rufe bayan ci gaba mara komai sau ɗaya maimakon kashe dukkan kasafin. Idan a kashe: halayyar sigar fitarwa. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Sauya sau ɗaya zuwa haɗin 'yan'uwa idan rafin SSE ya rufe kafin ya fitar da kowane firam mai amfani kuma iyakantaccen sake gwadawa a kan haɗin ɗaya ya ƙare; idan babu haɗin 'yan'uwa mai amfani, za a mayar da kuskuren asali na `STREAM_EARLY_EOF` 502. A kashe yake ta tsohuwa: early-EOF zai kasance na ƙarshe bayan sake gwadawa a kan haɗin ɗaya. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Haɗa filayen suna masu sauƙin nunawa a cikin amsoshin `/v1/models`. A kashe shi ga abokan ciniki da ke tsammanin ID na samfura kawai. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Yana sarrafa yadda ake saka prefix ga ID na samfura a cikin /v1/models. 'dual' (tsoho) yana fitar da prefix na laƙabi da na cikakken provider-id duka biyu don dacewa da tsoffin sigogi. 'alias' yana fitar da gajeren prefix na laƙabi kawai (misali ds-web/model, ba deepseek-web/model ba). 'canonical' yana fitar da cikakken prefix na provider-id kawai. Ƙimomi: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Kunna daidaitawar ELO ta lokaci-lokaci daga jadawalin jagororin Arena AI don martabobin basirar samfura. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Tallata madadin ids na `claude//` a kan `/v1/models` domin gano samfuran gateway na Claude Code ya jera samfuran da ba na Claude ba. Wannan shi ne matakin gama-duniya na ƙofar matakai uku (env yana rinjayar saitin dashboard). Duba [daidaitawar Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Babban makunni na madadin gateway na no-think//. Idan yana kunne (tsoho): /v1/models yana tallata nau'in da ba ya yin tunani ga kowane samfurin Claude mai cancanta da ke iya tunani, sannan id na no-think/ da aka aika a buƙata yana komawa ga ainihin samfurin tare da hana yin tunani. Idan yana kashe: ba a tallata kowane nau'i, kuma ana ɗaukar id na no-think/ kamar kowane id na samfurin da ba a sani ba. Har yanzu zaɓin shiga/fita na ModelSpec.noThinkingAlias na kowane samfurin yana aiki yayin da wannan yake kunne. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Kashe samar da nau'ikan matakan tunani (misali -low, -medium, -high) a cikin kasidar /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Kunna hanyoyin karɓa na kama-da-wane masu daidaituwa ga kowane tenant don aika buƙatu zuwa provider (#9654): cunkoson tenant ɗaya ba zai ƙara haifar wa wani kuskuren 503 ba. Saitin env na OMNIROUTE_CHAT_VIRTUAL_LANES yana rinjayar wannan saitin dashboard; sauye-sauye suna fara aiki bayan sake kunna server. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Tallata ids na madadin / a kan /v1/models ga samfuran da mai su na asali ba shi da credential mai aiki, amma gateway na passthrough mai credential mai aiki yana tura su. Gargadi: yana ƙara shigarwar kasida ga duk clients idan an kunna shi a duniya. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Kunna gano balance ga nodes masu jituwa da New-API / One-API / Sub2API aggregator. Idan an kunna, nodes masu jituwa da aka sa musu alamar aggregator za su bayar da rahoton balance ɗinsu a dashboard da kuma a routing na binciken quota kafin aiki. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Ci gaba da kiran tools mallakar server marasa streaming har sai samfurin ya dawo da amsar da client zai iya amfani da ita. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Ƙididdigar bincike da binciken baya-bayan nan suna ƙirga providers waɗanda har yanzu suke da connection mai aiki kawai (providers marasa key kamar duckduckgo-free koyaushe ana ƙirga su). Kashe wannan yana riƙe kowane layin bincike da aka adana tare da id na provider. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Shafukan provider na dashboard: nuna alamar Free kawai bisa sigogin da provider yake mutuntawa — yana cire hasashen da ya dogara da display-name, filayen free da ba boolean ba, da kari na :free a kan providers da aka yi wa rajista waɗanda ba su da free tier da aka rubuta takardunsa. Kashe wannan yana riƙe tsohuwar ƙa'idar alamar. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | A kan haɗaɗɗun amsoshin 429/503 na rashin samuwa, a bar `Retry-After` idan ba a san takamaiman lokacin sake gwadawa na gaba ba (maimakon ƙirƙirarren 1s), a ƙara `error.retry_after_provenance` (`signal` \| `none`), sannan a bar hanyoyin combo drain su karanta alamun sake gwadawa na rubutu daga bodies na upstream na JSON da plain-text. Filin yana bayyana ne kawai a amsoshin da `unavailableResponse()` ya gina; sauran bodies na 429/503 ba sa canzawa. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Lokacin da maƙasudin haɗin `priority` da aka yi wa alamar fallback-only-on-quota-exhaustion ya dakatar da haɗin saboda wani dalili da aka tabbatar ba na ƙayyadadden kaso ba ne (buɗewar mai katse da'irar mai samarwa, tsallakewa saboda hasashen jinkiri), a mayar da amsar 502 maimakon 503 mai kama da na ƙayyadadden kaso. Dakatarwar shiga, lokacin jira, rashin samuwa, ƙarewar kaso da dakatarwa saboda iyakar aiki lokaci guda za su ci gaba da mayar da 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Amsar Mistral 401 kawai (`{"detail":"Unauthorized"}`, ba tare da takamaiman alamar tantancewa ba) iri ɗaya ce ga maɓallin da aka soke da kuma ƙayyadadden kaso da ya ƙare. Idan an kunna, za ta sanya haɗin cikin lokacin jira maimakon a ajiye shi a matsayin `expired`, har sau 3 a kowace awa ga kowane haɗi; na gaba zai ajiye shi, don haka maɓallin da aka soke zai ci gaba da kaiwa ga wannan matsayi. A kashe take ta tsohuwa: kowace amsar Mistral 401 kawai tana ajiye haɗin kamar yadda ake yi a baya. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ɗauko kundin samfurorin xAI kai tsaye don haɗin `xai-oauth` daga `https://api.x.ai/v1/models` ta amfani da OAuth bearer token, maimakon tsayayyen saitin farko. A kashe take ta tsohuwa: `xai-oauth` zai ci gaba da gabatar da tsayayyen saitin farko ba tare da canji ba. Idan aka samu kowane kuskuren tantancewa, ganowa zai koma amfani da saitin farko (ba a tabbatar ko x.ai yana karɓar OAuth bearer a wannan endpoint ɗin ba). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Ba wa aikin tsaftacewa na atomatik damar share ayyukan Batch API da suka kai matsayi na ƙarshe (an kammala/an gaza/an soke/sun ƙare) waɗanda suka girmi `OMNIROUTE_BATCH_RETENTION_DAYS`, tare da wuraren ajiyar ci gaba na kowane layi, sannan ya share abun cikin BLOB na fayilolin da aka ɗora waɗanda suka wuce nasu `expires_at`. A kashe take ta tsohuwa: kowace shigarwa da ke akwai za ta ci gaba da riƙe wannan bayanin daidai kamar da har sai wani mai gudanarwa ya zaɓi kunna ta. Hanyar `DELETE /api/v1/batches/delete-completed` da mai gudanarwa ke kunna wa ba ta shafu ko ta wace hanya ba — wata yarjejeniyar API ta jama'a ce dabam wadda ba ta da wani sharadi. | +| Maɓalli | Nau'i | Tsoho | Bayani | +| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Yanayin tilasta manufar amfani da kayan aiki. Ƙimomi: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Kunna iyakance ƙima ta atomatik bisa tsarin amfani. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Tsallake duba taga mahallin gida / matsakaicin token na shigarwa na OmniRoute ga buƙatun kai tsaye na samfuri guda. Iyakokin sabis na sama har yanzu suna aiki. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Ƙi buƙatu kafin aikawa idan samfurin da aka nufa ba shi da damar da ake buƙata (gani, kayan aiki, fitarwa mai tsari, taga mahalli). Yana kare buƙatun kai tsaye na mai samarwa guda waɗanda ke kewaye matatar dacewa ta matakin combo. | +| `RADAR_ENABLED` | boolean | `false` | Kunna tsarin OmniRoute Radar (fuskokin ciyarwar kasida da aiki tare). A kashe yake ta tsohuwa; kunnawa yana buɗe UI ne kawai — aiki tare na bayanai yana ci gaba da zama zaɓi na daban. | + +### Lokacin Gudana (33) + +| Maɓalli | Nau'i | Tsoho | Sake farawa | Bayani | +| ------------------------------------------- | ------- | ------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Samar da kuma shigar da taƙaitaccen bayani na tattaunawa lokacin da combo routing ya sauya samfura. Kashe wannan don ɗaukar sauyin samfura a matsayin masu zaman kansu da kuma hana buƙatun miƙa bayanai na bayan-fage ga duk combo na yanzu da na gaba. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Cire abubuwan fitarwa na matakin sharhi na ciki daga rafukan passthrough na Responses API kafin a tura su ga abokan hulɗa. Kashe wannan don karɓar sharhin upstream ba tare da gyara ba. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Tilasta ƙuntatawar scope kan samun damar kayan aikin MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Matse bayanan kayan aikin MCP don rage amfani da token. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Kunna sarrafa ayyukan bayan-fage a lokacin aiki. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Kashe duk ayyukan bayan-fage (sabunta quota, sync, da sauransu). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Amince da matatun RTK na matakin aikin ba tare da tantancewa ba. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Fara sabar WebSocket ta dashboard na ainihin lokaci yayin import (tashar jiragen ruwa 20132 ta tsohuwa). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Ba Codex damar amfani da hanyar jigilar Responses-over-WebSocket. Idan an kashe, Codex zai koma amfani da HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Ba Codex damar amfani da hanyar jigilar WebSocket JSON-RPC ta app-server na cikin gida (codexTransport=app-server). Idan an kashe, haɗin da aka zaɓa ya yi amfani da app-server zai koma ga sauran hanyoyin jigilar Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Tura buƙatun da kasafin kuɗinsu ya ƙare zuwa mai samarwa/samfurin madadin gaggawa na kyauta. (Duba [Madadin Kasafin Kuɗi na Gaggawa](#emergency-budget-fallback) a ƙasa.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Kunna sake-gwada na farko kai tsaye ga rafukan SSE na upstream da aka yanke kafin kowane byte na amsa ya isa ga abokin ciniki. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Ba farfaɗo da rafi damar sake aika buƙata da haɗa amsa bayan bytes sun riga sun isa ga abokin ciniki. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Sanya ci gaba a tsakiyar rafi ya zama amintacce ga kiran kayan aiki: kada a taɓa ci gaba da rafin da aka yanke da zarar an fitar da kiran kayan aiki (yana gudana ko kuma an riga an gama da finish_reason tool_calls), sannan a rufe bayan ci gaba mara komai guda ɗaya maimakon kashe dukkan kasafin kuɗin. A kashe: halayen sigar fitarwa. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Yi sauya sau ɗaya zuwa haɗin sibling idan rafin SSE ya rufe kafin ya fitar da wani frame mai amfani kuma an ƙare iyakantaccen sake-gwajin haɗin guda; idan babu sibling mai amfani, za a dawo da kuskuren asali na `STREAM_EARLY_EOF` 502. A kashe yake ta tsohuwa: early-EOF zai ci gaba da zama na ƙarshe bayan sake-gwajin haɗin guda. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Haɗa filayen suna masu sauƙin nunawa a cikin martanin `/v1/models`. Kashe wannan ga clients waɗanda ke tsammanin model IDs kawai. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Yana sarrafa yadda ake saka prefix ga model IDs a cikin /v1/models. 'dual' (na tsohuwa) yana fitar da prefixes na alias da canonical provider-id duka domin dacewa da tsofaffin nau'uka. 'alias' yana fitar da gajeren alias prefix kawai (misali ds-web/model, ba deepseek-web/model ba). 'canonical' yana fitar da cikakken provider-id prefix kawai. Ƙimomi: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Kunna daidaita ELO na leaderboard na Arena AI lokaci-lokaci domin martabobin ƙwarewar models. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Tallata mirror ids na `claude//` a kan `/v1/models` domin gano models na gateway na Claude Code ya jera models waɗanda ba na Claude ba. Matakin duniya na shingen matakai uku (env yana rinjayar dashboard override). Duba [Tsarin Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Babban switch na gateway aliases na no-think//. A kunne (na tsohuwa): /v1/models yana tallata variant mara tunani ga kowane Claude model mai cancanta kuma mai ikon yin tunani, sannan no-think/ id da aka aika a request zai koma ga model na ainihi tare da hana reasoning. A kashe: ba a tallata variants, kuma ana ɗaukar no-think/ id kamar kowane model id da ba a sani ba. Zaɓin shiga/fita na ModelSpec.noThinkingAlias ga kowane model har yanzu yana aiki yayin da wannan ke kunne. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Kashe samar da variants na matakan tunani (misali -low, -medium, -high) a cikin catalog na /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Kunna adaptive virtual admission lanes na kowane tenant don tura buƙatu zuwa provider (#9654): yawan buƙatun tenant ɗaya ba zai ƙara jawo wa wani kuskuren 503 ba. Env var na OMNIROUTE_CHAT_VIRTUAL_LANES yana rinjayar wannan dashboard override; sauye-sauye za su fara aiki bayan an sake kunna server. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Tallata ID na madubi na / a kan /v1/models ga samfuran da mai su na asali ba shi da wata takardar shaida mai aiki, amma wata ƙofar passthrough mai takardar shaida mai aiki tana tura su. Gargadi: yana ƙara bayanai cikin kundin ga duk abokan hulɗa idan an kunna shi a duniya baki ɗaya. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Kunna gano ma'auni ga nodes masu dacewa da New-API / One-API / Sub2API aggregator. Idan an kunna, nodes masu dacewa waɗanda aka saita musu tutar aggregator za su nuna ma'auninsu a dashboard da kuma wajen zaɓin hanya na quota-preflight. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Ci gaba da kiran kayan aikin da sabar ke sarrafawa marasa streaming har sai samfurin ya dawo da amsar da abokin hulɗa zai iya amfani da ita. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Ƙididdigar bincike da binciken kwanan nan za su ƙirga kawai masu samarwa waɗanda har yanzu suke da haɗi mai aiki (masu samarwa marasa maɓalli kamar duckduckgo-free koyaushe ana ƙirga su). Kashe wannan yana riƙe kowane layin bincike da aka adana tare da ID na mai samarwa. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Shafukan masu samarwa na dashboard: nuna alamar Free kawai bisa sigogin da mai samarwar yake amincewa da su — yana cire dabarar display-name, filayen free da ba boolean ba, da kuma ƙarin :free a ƙarshen sunayen masu samarwa da aka yi wa rajista waɗanda ba su da matakin kyauta da aka rubuta a takardu. Kashe wannan yana riƙe ƙa'idar alamar da aka saba amfani da ita a tarihi. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | A kan haɗaɗɗun amsoshin 429/503 na rashin samuwa, a bar `Retry-After` idan ba a san takamaiman lokacin sake gwadawa na gaba ba (maimakon ƙirƙirarren 1s), a ƙara `error.retry_after_provenance` (`signal` \| `none`), sannan a bar hanyoyin zubar da combo su karanta alamun sake gwadawa na rubutu daga JSON da kuma jikin upstream na plain-text. Filin yana bayyana ne kawai a amsoshin da `unavailableResponse()` ya gina; sauran jikin amsoshin 429/503 ba sa canzawa. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Idan wata manufa ta combo ta `priority` da aka yi wa alamar amfani-kawai-idan-quota-ya-ƙare ta dakatar da combo saboda dalilin da aka tabbatar ba quota ba ne (circuit breaker na mai samarwa a buɗe yake, tsallakewa bisa hasashen jinkiri), a ba da amsar 502 maimakon 503 mai kama da ta quota. Dakatarwa saboda lockout, cooldown, unavailable, exhaustion da concurrency-cap za su ci gaba da mayar da 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Amsar Mistral 401 marar ƙarin bayani (`{"detail":"Unauthorized"}`, ba tare da takamaiman siginar auth ba) iri ɗaya ce ga maɓallin da aka soke da kuma quota da ya ƙare. Idan an kunna, zai sanya haɗin cikin cooldown maimakon ajiye shi a matsayin `expired`, har sau 3 kawai a kowace awa ga kowane haɗi; na gaba zai ajiye shi, don haka maɓallin da aka soke zai ci gaba da kaiwa ga wannan matsayi. A kashe yake ta tsohuwa: kowace amsar Mistral 401 marar ƙarin bayani tana ajiye haɗin kamar yadda ake yi a baya. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ɗauko kundin samfuran xAI na kai-tsaye don haɗin `xai-oauth` daga `https://api.x.ai/v1/models` ta amfani da OAuth bearer token, maimakon tsayayyen seed da aka daskarar. A kashe yake ta tsohuwa: `xai-oauth` zai ci gaba da amfani da tsayayyen seed ba tare da canji ba. Idan aka samu kowace irin matsalar tantancewa, gano samfuran zai koma amfani da seed (ba a tabbatar ko x.ai yana karɓar OAuth bearer a wannan endpoint ba). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Ba aikin tsaftacewa ta atomatik damar share ayyukan Batch API da suka kai matakin ƙarshe (completed/failed/cancelled/expired) waɗanda suka girmi `OMNIROUTE_BATCH_RETENTION_DAYS`, tare da checkpoints na kowane layi nasu, sannan ya share abun cikin BLOB na fayilolin da aka ɗora waɗanda suka wuce `expires_at` nasu. A kashe yake ta tsohuwa: duk shigarwar da ake da ita za ta ci gaba da riƙe wannan bayanai daidai kamar da har sai mai gudanarwa ya kunna shi. Wannan ba ya shafar hanyar `DELETE /api/v1/batches/delete-completed` da mai gudanarwa ke kunnawa — ita wata yarjejeniyar API ta jama'a ce mai zaman kanta kuma marar sharadi. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Keɓe asusun Antigravity da aka zaɓa na tsawon rayuwar streaming ta buƙatar da ta zaɓe shi, ta yadda sake gwadawa a lokaci guda ko miƙa bayanan shaida ba zai sake zaɓar asusun da aka riga aka ɗora wa stream mai gudana ba. Keɓewar ta taƙaita ga (connection, callable upstream model), don haka asusu ɗaya zai iya ci gaba da hidimar samfura biyu daban-daban a lokaci guda. Idan duk asusun da suka cancanta an riga an keɓe su don wannan samfurin, buƙatar za ta dawo da tsararren 503 `antigravity_pool_busy` tare da iyakantaccen `Retry-After`, maimakon ƙara lodawa kan asusun da yake aiki. A kashe yake ta tsohuwa: zaɓin asusu zai ci gaba da kasancewa daidai kamar da, kuma ba za a yi wata keɓewa ba. | ### CLI (5) -| Maɓalli | Nau'i | Na asali | Sake farawa | Bayani | -| ------------------------------------- | ------- | -------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Kunna yanayin dacewa ga dukkan abokan cinikin CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Kunna matakin dacewa da laƙabin samfur. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Kunna aiki tare na bayanan farashi ta atomatik (hakanan yana buƙatar environment variable na `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Bayan aiki tare da samfurorin mai samarwa, a sake rubuta fayilolin bayanan martaba na ~/.codex/*.config.toml ta atomatik daga kundin kai tsaye. Ba ya taɓa canza daidaitawar Codex mai aiki/na asali. A kashe yake ta tsohuwa. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Bayan aiki tare da samfurorin mai samarwa, a sake rubuta bayanan martabar Claude Code na ~/.claude/profiles//settings.json ta atomatik daga kundin kai tsaye. Ba ya taɓa canza daidaitawar Claude mai aiki/na asali. A kashe yake ta tsohuwa. | +| Maɓalli | Nau'i | Tsoho | Sake farawa | Bayani | +| ------------------------------------- | ------- | ------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Kunna yanayin dacewa ga dukkan abokan cinikin CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Kunna matakin dacewa na laƙabin samfuri. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Kunna aiki tare da bayanan farashi ta atomatik (yana kuma buƙatar environment variable na `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Bayan aiki tare da samfurin provider, a atomatik a (sake)rubuta fayilolin profile na ~/.codex/*.config.toml daga kundin kai-tsaye. Ba ya taɓa sauya config na Codex mai aiki/na tsohuwa. A kashe yake ta tsohuwa. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Bayan aiki tare da samfurin provider, a atomatik a (sake)rubuta profiles na Claude Code na ~/.claude/profiles//settings.json daga kundin kai-tsaye. Ba ya taɓa sauya config na Claude mai aiki/na tsohuwa. A kashe yake ta tsohuwa. | ### Lafiya (5) -| Maɓalli | Nau'i | Tsoho | Bayani | -| ----------------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Kashe ƙarshen-binciken lafiyar instans na gida. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Kashe binciken lafiyar tabbatar da ingancin token. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Kunna damar shiga hanyar sadarwa a cikin muhallin sandbox na skills. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | A binciken lafiyar proxy, gwajin da manufa ta ƙi (401/403/429) yana sake saita jerin gazawar proxy a jere. A kashe yake ta tsohuwa: ƙin amincewa yana kasancewa tsaka-tsaki (#10654). Matsayin 5xx yana kasancewa mara tabbas a kowane hali; ƙin amincewa ba ya taɓa cirewa, kashewa ko sake kunna proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Gudanar da binciken mutunci/lafiyar DB na farawa bayan uwar garken ya fara karɓar buƙatu (ta hanyar `setImmediate`) maimakon hana farawa har sai ya kammala (#13717). A kashe yake ta tsohuwa: farawa yana ci gaba da toshewa daidai kamar yadda yake kafin wannan PR. | +| Maɓalli | Nau'i | Tsoho | Bayani | +| ----------------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Kashe ƙarshen hanyar duba lafiyar instance na gida. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Kashe duba lafiyar tabbatar da ingancin token. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Kunna damar shiga cibiyar sadarwa a muhallin sandbox na skills. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | A zagayen duba lafiyar proxy, gwajin da target ya ƙi (401/403/429) yana sake saita jerin gazawar proxy a jere. A kashe yake ta tsohuwa: ƙin amincewa yana kasancewa tsaka-tsaki (#10654). 5xx yana kasancewa mara tabbas a kowane hali; ƙin amincewa ba ya taɓa cirewa, kashewa ko sake kunna proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Gudanar da duba mutunci/lafiyar DB na farawa bayan server ya fara karɓar buƙatu (ta hanyar `setImmediate`) maimakon hana farawa har sai ya kammala (#13717). A kashe yake ta tsohuwa: farawa yana toshewa daidai kamar yadda yake kafin wannan PR. | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` da tsohon sunansa na madadi +> `INPUT_SANITIZER_BLOCK_THRESHOLD` da tsohon alias ɗinsa > `INJECTION_GUARD_BLOCK_THRESHOLD` suna daidaita yanayin `block` na -> `INJECTION_GUARD_MODE`, amma su sauye-sauyen muhalli ne na yau da kullum waɗanda +> `INJECTION_GUARD_MODE`, amma sauye-sauyen muhalli ne na yau da kullum waɗanda > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> ke karantawa, ba tutocin fasali ba: ba su da maye-gurbin DB kuma ba su da maɓallin kunnawa/kashewa a dashboard. Duba +> ke karantawa, ba feature flags ba ne: ba su da override na DB kuma ba su da toggle na dashboard. Duba > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> Ginshiƙin `Restart` yana nuna tutoci masu `requiresRestart: true` — ana adana ƙimar -> nan take amma ba ta fara aiki sai bayan an sake loda tsarin. Tutocin enum -> suna ƙin duk wata ƙima da ba ta cikin jerin ƙimomin da aka yarda da su (ana tabbatar da ita a ɓangaren uwar garke a cikin -> `setFeatureFlagOverride()` da mai sarrafa REST `PUT` duka). +> Shafin `Restart` yana nuna flags masu `requiresRestart: true` — ana +> adana ƙimar nan take amma ba ta fara aiki sai bayan process ya sake lodawa. Flags na enum +> suna ƙin duk wata ƙima da ba ta cikin jerin ƙimomin da aka yarda da su (ana tabbatar da ingancinta a gefen server a +> duka `setFeatureFlagOverride()` da REST `PUT` handler). --- @@ -174,21 +176,21 @@ Je zuwa **Dashboard → Settings → Feature Flags** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) yana goyon bayan: -- **Bincike** ta maɓalli ko bayani, da **tacewa** ta rukuni (tare da ƙarin mahangar - **Requires Restart** da aka ƙirƙira). -- **Maɓallin kunnawa/kashewa** don tutocin boolean da **jerin zaɓi** don tutocin enum +- **Bincike** ta maɓalli ko bayani, da **tacewa** ta rukuni (tare da ƙarin ra'ayin + **Requires Restart** na wucin gadi). +- **Maɓallin kunna/kashewa** don tutocin boolean da **jerin zaɓi** don tutocin enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - **Alamar tushe** ga kowace tuta — `DB`, `ENV`, ko `DEF` — wadda ke nuna inda ƙimar da ake amfani da ita ta fito. -- Maɓallin **Reset** (wanda ake nuna wa tutocin da tushensu `DB` kawai) don cire ƙimar maye gurbin, +- Maɓallin **Reset** (wanda ake nuna wa tutocin da tushensu yake `DB` kawai) don cire override, da maɓallin **Reset All Overrides** a ƙasa. -- Saƙon **Restart Server** lokacin da aka canza tuta mai `requiresRestart`. +- Sanarwar **Restart Server** idan aka canza tutar `requiresRestart`. ### REST API Dukkan ayyuka suna bi ta hanya guda: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). -Kowace hanya tana buƙatar zaman dashboard da aka tabbatar da sahihancinsa (`401` idan babu). +Kowace hanya tana buƙatar ingantacciyar zaman dashboard (`401` idan babu). #### `GET /api/settings/feature-flags` @@ -210,7 +212,7 @@ Yana dawo da kowace tuta tare da ƙimar da ake amfani da ita, tushenta, da taƙa "requiresRestart": false, "warningLevel": "caution", }, - // ... dukkan tutoci 72 + // ... dukkan tutoci 74 ], "summary": { "total": 56, @@ -224,16 +226,16 @@ Yana dawo da kowace tuta tare da ƙimar da ake amfani da ita, tushenta, da taƙa #### `PUT /api/settings/feature-flags` -Saita ko cire ƙimar maye gurbin guda ɗaya. Jiki: `{ key: string; value?: string }`. -Rashin saka `value` yana cire ƙimar maye gurbin (yana maido da env / default). +Saita ko cire override guda ɗaya. Jiki: `{ key: string; value?: string }`. +Rashin saka `value` yana cire override ɗin (yana dawo da env / default). ```bash -# Saita ƙimar maye gurbin DB +# Saita override na DB curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Cire ƙimar maye gurbin (babu "value") +# Cire override ɗin (babu "value") curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' @@ -241,17 +243,17 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ Amsar tana maimaita sabon `effectiveValue`/`source`, da `previousValue`/ `previousSource`, da kuma `requiresRestart`. Ana ƙin maɓallan da ba a sani ba da ƙimomin enum -da suka wuce iyakar da `400`. +da suka fita daga iyakar da `400`. #### `DELETE /api/settings/feature-flags` -Yana share **dukkan** ƙimomin maye gurbin DB lokaci guda, yana maido da kowace tuta zuwa ƙimar +Yana share **dukkan** overrides na DB lokaci guda, yana dawo da kowace tuta zuwa ƙimar env / default ɗinta. Yana dawo da `{ cleared: , message: "..." }`. > [!NOTE] -> Tutocin da ke da `requiresRestart: true` ba sa fara aiki sai bayan an sake loda tsari. -> Tsarin sake kunnawa na dashboard yana kiran `POST /api/restart`, sannan yana ci gaba da duba -> `GET /api/health/ping` har sai uwar garken ta sake aiki. +> Tutocin da suke da `requiresRestart: true` suna fara aiki ne kawai bayan sake loda process. +> Tsarin sake kunnawa na dashboard yana kiran `POST /api/restart`, sannan yana ci gaba da bincikar +> `GET /api/health/ping` har sai server ya sake tashi. --- diff --git a/docs/i18n/ha/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/ha/docs/reference/PROVIDER_REFERENCE.md index 58c5f074109b..8d942d915cbd 100644 --- a/docs/i18n/ha/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/ha/docs/reference/PROVIDER_REFERENCE.md @@ -4,11 +4,11 @@ --- -> **An ƙirƙira ta atomatik** daga `src/shared/constants/providers.ts` — kada a gyara da hannu. -> Sake ƙirƙira da: `npm run gen:provider-reference` -> **Ƙirƙira ta ƙarshe:** 2026-09-17 +> **An samar ta atomatik** daga `src/shared/constants/providers.ts` — kar a gyara da hannu. +> Sake samarwa da: `npm run gen:provider-reference` +> **Ƙarshen samarwa:** 2026-09-18 -Jimillar masu samarwa: **359**. Duba rabon rukuni a ƙasa. +Jimillar masu samarwa: **359**. Duba rarrabuwar rukuni a ƙasa. ## Rukunoni @@ -34,47 +34,47 @@ Yi amfani da dashboard a `/dashboard/providers` don kunnawa, saitawa, da gwada k ## Masu Bayarwa Marasa Buƙatar Tantancewa (ba a buƙatar maɓalli) (10) -| ID | Laƙabi | Suna | Alamomi | Gidan yanar gizo | Bayanan kula | Kiran kayan aiki | -| ----------------------- | ---------- | ------------------------- | ----------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| `aihorde` | `horde` | AI Horde | Babu tantancewa | [mahaɗi](https://aihorde.net) | Ba a buƙatar maɓallin API — yana amfani da maɓallin ɓoye-suna na AI Horde da aka rubuta a takardunsu. Ƙara maɓallin aihorde.net na kyauta zaɓi ne kuma yana ba da fifiko mafi girma ne kawai a jerin jira (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Babu tantancewa | [mahaɗi](https://augmentcode.com) | OmniRoute ba ya adana maɓallin API. Shigar da Auggie CLI sannan ka gudanar da `auggie login` a wannan na’urar, daga nan OmniRoute zai ƙaddamar da shi a cikin na’urar don kowace buƙata. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Babu tantancewa | [mahaɗi](https://playground.ai.cloudflare.com) | Ba a buƙatar bayanan shiga — zaman burauza na ɓoye-suna ne ta hanyar ƙa’idar cf_agent WebSocket da aka gano ta hanyar nazarin baya (sufurin Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Babu tantancewa | [mahaɗi](https://developers.openai.com/codex/cli) | OmniRoute ba ya adana token. App-server na Codex CLI yana sarrafa nasa shigar ChatGPT (~/.codex/auth.json, ana sabunta shi ta atomatik). Yi amfani da “Shiga da ChatGPT” idan har yanzu ba a tantance CLI ɗin ba. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Babu tantancewa | [mahaɗi](https://docs.devin.ai/work-with-devin/devin-cli) | Devin CLI na hukuma ne ke sarrafa tantancewa a cikin keɓantaccen kundin bridge ɗinsa. | kwaikwaya | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Babu tantancewa | [mahaɗi](https://duckduckgo.com/duckchat) | Ba a buƙatar bayanan shiga — DuckDuckGo AI Chat na ɓoye-suna ne kuma kyauta ne. | kwaikwaya | -| `opencode` | `oc` | OpenCode Free | Babu tantancewa | [mahaɗi](https://opencode.ai) | Ba a buƙatar maɓallin API — yana amfani da wurin haɗin jama’a na kyauta na OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Babu tantancewa | [mahaɗi](https://uncloseai.com) | Ba a buƙatar tantancewa. API ɗin yana karɓar kowace zaren rubutu marar komai a matsayin maɓalli don ganewa. Idan tsofaffin samfurorin da ke ciki suka mayar da 404, yi amfani da Samfuran da Ake da Su → Shigo daga /models ko Daidaitawa ta Atomatik; samfurin da aka tabbatar yana aiki: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Babu tantancewa, bidiyo | [mahaɗi](https://veoaifree.com) | Ba a buƙatar tantancewa. An iyakance saurin zuwa buƙatu 6/awa ga kowane IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Babu tantancewa | [mahaɗi](https://zcode.z.ai) | OmniRoute ba ya adana maɓallin API. App-server na ZCode na cikin na’ura yana amfani da shigar builtin:zai-coding-plan da ake da shi. | — | +| ID | Laƙabi | Suna | Alamomi | Shafin yanar gizo | Bayanan kula | Kiran kayan aiki | +| ----------------------- | ---------- | ------------------------- | -------------------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------- | +| `aihorde` | `horde` | AI Horde | Ba tare da tantancewa ba | [mahaɗi](https://aihorde.net) | Ba a buƙatar maɓallin API — yana amfani da maɓallin ɓoye-suna na AI Horde da aka bayyana a takardunsa. Ƙara maɓallin aihorde.net na kyauta zaɓi ne, kuma yana ba da fifiko mafi girma ne kawai a layin jira (kudos). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Ba tare da tantancewa ba | [mahaɗi](https://augmentcode.com) | OmniRoute ba ya adana maɓallin API. Shigar da Auggie CLI sannan ka gudanar da `auggie login` a wannan na’ura, daga nan OmniRoute zai ƙaddamar da shi a gida don kowace buƙata. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Ba tare da tantancewa ba | [mahaɗi](https://playground.ai.cloudflare.com) | Ba a buƙatar bayanan shiga — zaman burauza na ɓoye-suna ta hanyar ƙa’idar cf_agent WebSocket da aka gano tsarin aikinta (hanyar jigilar Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Ba tare da tantancewa ba | [mahaɗi](https://developers.openai.com/codex/cli) | OmniRoute ba ya adana token. Codex CLI app-server yana sarrafa shigar ChatGPT nasa da kansa (~/.codex/auth.json, ana sabunta shi ta atomatik). Yi amfani da “Shiga da ChatGPT” idan har yanzu ba a tantance CLI ɗin ba. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Ba tare da tantancewa ba | [mahaɗi](https://docs.devin.ai/work-with-devin/devin-cli) | Devin CLI na hukuma ne ke sarrafa tantancewa a cikin keɓantaccen kundin bridge ɗinsa. | kwaikwayayye | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Ba tare da tantancewa ba | [mahaɗi](https://duckduckgo.com/duckchat) | Ba a buƙatar bayanan shiga — DuckDuckGo AI Chat na ɓoye-suna ne kuma kyauta ne. | kwaikwayayye | +| `opencode` | `oc` | OpenCode Free | Ba tare da tantancewa ba | [mahaɗi](https://opencode.ai) | Ba a buƙatar maɓallin API — yana amfani da endpoint na kyauta na jama’a na OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | Ba tare da tantancewa ba | [mahaɗi](https://uncloseai.com) | Ba a buƙatar tantancewa. API yana karɓar kowace kirtani marar wofi a matsayin maɓallin ganewa. Idan tsofaffin samfuran da aka haɗa a ciki suka dawo da 404, yi amfani da Samfuran da Ake Samu → Shigo daga /models ko Daidaitawa ta Atomatik; samfurin da aka tabbatar yana aiki kai tsaye: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Ba tare da tantancewa ba, bidiyo | [mahaɗi](https://veoaifree.com) | Ba a buƙatar tantancewa. An iyakance yawan amfani zuwa buƙatu 6 a kowace awa ga kowane IP. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Ba tare da tantancewa ba | [mahaɗi](https://zcode.z.ai) | OmniRoute ba ya adana maɓallin API. ZCode app-server na cikin gida yana amfani da shigar builtin:zai-coding-plan da ke akwai. | — | ## Masu Bayar da OAuth (24) -| ID | Laƙabi | Suna | Alamomi | Shafin yanar gizo | Bayanan kula | -| --------------- | ------------- | ------------------------- | ------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [mahaɗi](https://antigravity.google) | Shigo da bayanan shiga na Antigravity CLI (`agy`) ɗinka (liƙa/loda fayil ɗin token ɗinsa), gano bayanan shiga na CLI na cikin gida ta atomatik, ko shiga da Google. Yana amfani da backend na Antigravity tare da wasu (har da samfuran Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [mahaɗi](https://aws.amazon.com/q/developer/) | Yana amfani da AWS Builder ID iri ɗaya ko tsarin refresh-token da aka shigo da shi kamar Kiro, amma yana ware haɗin Amazon Q daban. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [mahaɗi](https://cline.bot/cline-pass) | ClinePass biyan kuɗin Cline ne na $9.99/wata wanda ya haɗa samfuran shirye-shirye buɗaɗɗu guda 10. Shiga da asusun Cline ɗinka (bayanan shiga iri ɗaya da na Cline CLI/IDE), ko liƙa maɓallin ClinePass API kai tsaye (app.cline.bot → Settings → API Keys). Biyan kuɗin ClinePass yana buɗe samfuran cline-pass/*. Yana sake amfani da tsarin Cline WorkOS OAuth. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [mahaɗi](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Shiga ta hanyar tsarin device-code na CLI na hukuma, ko liƙa maɓallin API kai tsaye (ana aika shi a matsayin Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [mahaɗi](https://cli.devin.ai) | Yana buƙatar Devin CLI binary. Gudanar da `devin auth login` don tantancewa, ko samar da WINDSURF_API_KEY ɗinka. Shigarwa: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [mahaɗi](https://devin.ai) | Liƙa maɓallin Devin API da ke akwai daga zaman Devin da aka tantance. Samuwar fitar da maɓalli da matakan yin hakan sun bambanta gwargwadon sigar Devin da asusu. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Shigar da URL na GHE instance ɗinka (misali, https://ghe.company.com) a saitunan mai bayarwa, sannan yi tantancewa ta hanyar device flow. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [mahaɗi](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Ba a saita GitLab Duo OAuth ba. Yi rajistar manhajar OAuth a https://gitlab.com/-/profile/applications tare da redirect URI http://localhost:20128/callback da scopes "ai_features read_user", sannan saita GITLAB_DUO_OAUTH_CLIENT_ID (da GITLAB_DUO_OAUTH_CLIENT_SECRET idan ana so) kuma sake kunnawa. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Shiga da burauzarka, ko liƙa ~/.grok/auth.json ɗinka (ko JWT access token) daga Grok Build CLI; ana juyar da refresh_token ta atomatik ta kowace hanya. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [mahaɗi](https://www.kimi.com/code?aff=omniroute) | Shiga da asusun Kimi iri ɗaya da Kimi Code CLI ke amfani da shi. OmniRoute yana amfani da tsarin CLI OAuth da endpoints na Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Matakin kyauta: credits 50/wata (~25K–100K tokens). ⚠️ Kiro ToS ya hana amfani da proxy/harness na ɓangare na uku. | -| `openference` | `of` | Openference | OAuth | [mahaɗi](https://openference.com) | Shiga da asusun Openference ɗinka don tura buƙatu ta api.openference.com. Ana buƙatar tsari mai aiki don inference — OAuth na iya yin tantancewa amma ya mayar da 402 idan babu shi. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [mahaɗi](https://trae.ai) | Trae IDE ne na asalin AI daga ByteDance (SOLO remote agent). Ba da izini ta trae.ai a cikin popup, ko shiga a solo.trae.ai sannan liƙa Cloud-IDE-JWT (ana aika shi a matsayin 'Authorization: Cloud-IDE-JWT ', yana aiki na kusan kwanaki 14) a matsayin access token; web_id/biz_user_id/user_unique_id/scope/tenant/region suna wucewa ta providerSpecificData. Babu headless refresh ga tokens da aka liƙa — sake liƙawa idan wa'adinsu ya ƙare. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [mahaɗi](https://x.ai) | Shiga da xAI don amfani da samfuran api.x.ai kamar Grok 4.5. Wannan ya bambanta da zaman Grok Build JWT, waɗanda ke amfani da cli-chat-proxy.grok.com da laƙaban samfurin grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [mahaɗi](https://zed.dev) | Zed yana adana bayanan shaidar masu bayar da LLM (OpenAI, Anthropic, Google, Mistral, xAI) a cikin keychain na OS. Yi amfani da maɓallin Import da ke ƙasa don gano su da shigo da su ta atomatik. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [mahaɗi](https://zed.dev) | Shiga da asusun Zed ɗinka (shiga ta native-app). OmniRoute yana ƙirƙirar RSA keypair na amfani sau ɗaya kuma yana buɗe zed.dev don ba shi izini — a kan shigarwa mai nisa/headless, kwafi URL na callback na 127.0.0.1 da aka samu daga address bar na burauzarka kuma liƙa shi a nan. Ya bambanta da shigarwar shaidar 'Zed IDE' da ke sama: wannan yana wakiltar chat completions ta hanyar mai tara samfuran da Zed ke masauki da kansa (cloud.zed.dev), yana gabatar da samfuran Anthropic/OpenAI/Google/xAI a ƙarƙashin tsarin Zed ɗinka. | +| ID | Laƙabi | Suna | Alamomi | Yanar gizo | Bayanan kula | +| --------------- | ------------- | ------------------------- | ------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [mahaɗi](https://antigravity.google) | Shigo da bayanan shiga na Antigravity CLI (`agy`) ɗinka (liƙa/loda fayil ɗin token ɗinsa), gano bayanan shiga na CLI na gida ta atomatik, ko shiga da Google. Yana amfani da backend na Antigravity tare da sauran haɗe-haɗe (ciki har da samfuran Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [mahaɗi](https://aws.amazon.com/q/developer/) | Yana amfani da AWS Builder ID iri ɗaya ko tsarin refresh-token da aka shigo da shi kamar Kiro, amma yana ware haɗin Amazon Q dabam. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [mahaɗi](https://cline.bot/cline-pass) | ClinePass rajistar Cline ce ta $9.99/wata wadda ta haɗa samfuran coding buɗaɗɗu guda 10. Shiga da asusun Cline ɗinka (bayanan shiga iri ɗaya da na Cline CLI/IDE), ko liƙa maɓallin ClinePass API kai tsaye (app.cline.bot → Saituna → Maɓallan API). Rajistar ClinePass tana buɗe samfuran cline-pass/*. Tana sake amfani da tsarin Cline WorkOS OAuth. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [mahaɗi](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Shiga ta hanyar tsarin device-code na CLI na hukuma, ko liƙa maɓallin API kai tsaye (ana aikawa a matsayin Authorization: Bearer). Kasida: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [mahaɗi](https://cli.devin.ai) | Yana buƙatar Devin CLI binary. Gudanar da `devin auth login` don tantancewa, ko bayar da WINDSURF_API_KEY ɗinka. Shigarwa: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [mahaɗi](https://devin.ai) | Liƙa maɓallin Devin API da ake da shi daga zaman Devin da aka tantance. Samuwar fitar da maɓalli da matakan yin hakan sun bambanta bisa sigar Devin da asusu. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Shigar da URL na instance na GHE ɗinka (misali, https://ghe.company.com) a saitunan mai bayarwa, sannan yi tantancewa ta hanyar device flow. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [mahaɗi](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Ba a saita GitLab Duo OAuth ba. Yi rijistar manhajar OAuth a https://gitlab.com/-/profile/applications tare da redirect URI http://localhost:20128/callback da scopes "ai_features read_user", sannan saita GITLAB_DUO_OAUTH_CLIENT_ID (da GITLAB_DUO_OAUTH_CLIENT_SECRET idan ana so) kuma sake kunnawa. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Shiga da burauzarka, ko liƙa ~/.grok/auth.json ɗinka (ko JWT access token) daga Grok Build CLI; ana sauya refresh_token ta atomatik a kowane ɗayan hanyoyin. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [mahaɗi](https://www.kimi.com/code?aff=omniroute) | Shiga da asusun Kimi iri ɗaya da Kimi Code CLI ke amfani da shi. OmniRoute yana amfani da tsarin CLI OAuth da endpoints na Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Matakin kyauta: credits 50/wata (~tokens 25K–100K). ⚠️ Sharuɗɗan Amfani na Kiro sun hana amfani da proxy/harness na ɓangare na uku. | +| `openference` | `of` | Openference | OAuth | [mahaɗi](https://openference.com) | Shiga da asusun Openference ɗinka don tura buƙatu ta api.openference.com. Ya haɗa da damar matakin kyauta zuwa Qwen3.8 27b da Llama 3.2 3B — duba openference.com/pricing don sharuɗɗan tsarin yanzu. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [mahaɗi](https://trae.ai) | Trae IDE ne na asalin AI daga ByteDance (SOLO remote agent). Ba da izini ta trae.ai a cikin popup, ko shiga a solo.trae.ai sannan liƙa Cloud-IDE-JWT (ana aikawa a matsayin 'Authorization: Cloud-IDE-JWT ', tsawon rayuwa na kusan kwanaki 14) a matsayin access token; web_id/biz_user_id/user_unique_id/scope/tenant/region suna wucewa ta providerSpecificData. Babu headless refresh ga tokens da aka liƙa — sake liƙawa idan wa'adinsu ya ƙare. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [mahaɗi](https://x.ai) | Shiga da xAI don amfani da samfuran api.x.ai kamar Grok 4.5. Wannan ya bambanta da zaman Grok Build JWT, waɗanda ke amfani da cli-chat-proxy.grok.com da laƙaban samfurin grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [mahaɗi](https://zed.dev) | Zed yana adana bayanan shaidar masu bayar da LLM (OpenAI, Anthropic, Google, Mistral, xAI) a cikin keychain na OS. Yi amfani da maɓallin Shigo da ke ƙasa don gano su da shigo da su ta atomatik. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [mahaɗi](https://zed.dev) | Shiga da asusun Zed ɗinka (shiga ta native-app). OmniRoute yana ƙirƙirar keypair na RSA na amfani sau ɗaya kuma yana buɗe zed.dev don ba shi izini — a kan shigarwa ta nesa/headless, kwafi URL na callback na 127.0.0.1 da aka samu daga address bar na burauzarka sannan liƙa shi a nan. Ya bambanta da shigarwar shigo da bayanan shaida ta 'Zed IDE' da ke sama: wannan yana aika chat completions ta hanyar hosted model aggregator na Zed kansa (cloud.zed.dev), yana gabatar da samfuran Anthropic/OpenAI/Google/xAI ƙarƙashin tsarin Zed ɗinka. | ## Masu Samar da Cookie na Yanar Gizo (34) @@ -115,252 +115,252 @@ Yi amfani da dashboard a `/dashboard/providers` don kunnawa, saitawa, da gwada k | `zai-web` | `zw` | Z.ai Web | Kukin yanar gizo | [mahaɗi](https://chat.z.ai) | Kwafi ƙimar "token" daga chat.z.ai → DevTools → Application → Local Storage. Kada ka kwafi kukis; OmniRoute yana kula da CAPTCHA na kowace buƙata ta hanyar jigilar burauzarsa. | — | | `zenmux-free` | `zmf` | ZenMux Free (Yanar gizo) | Kukin yanar gizo | [mahaɗi](https://zenmux.ai) | Shiga a zenmux.ai, sannan ka fitar da dukkan kukis ta amfani da EditThisCookie ko Cookie-Editor kuma ka liƙa cikakken rubutun taken Cookie a nan. Sabunta kusan kowane kwanaki 30. | — | -## Masu Bayar da Maɓallan API (na biya / na biya tare da kiredit kyauta) (242) - -| ID | Laƙabi | Suna | Alamomi | Shafin yanar gizo | Bayanan kula | -| ------------------------ | --------------- | ------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | Maɓallin API | [mahaɗi](https://ai.360.cn) | Sami maɓallin API a ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | Maɓallin API, mai tarawa | [mahaɗi](https://agentrouter.org) | Kuɗin amfani na $200 kyauta bayan rajista - mashigar karkatarwa tsakanin samfura da yawa | -| `agnes` | `agnes` | Agnes AI | Maɓallin API, bidiyo | [mahaɗi](https://agnes-ai.com) | Sami maɓallin API a agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (China) | Maɓallin API | [mahaɗi](https://api.agnes-ai.cn) | Sami maɓallin API daga shafin Agnes CN. | -| `ai21` | `ai21` | AI21 Labs | Maɓallin API | [mahaɗi](https://www.ai21.com) | Kuɗin gwaji na $10 bayan rajista (yana aiki na watanni 3), ba a buƙatar katin kuɗi | -| `aimlapi` | `aiml` | AI/ML API | Maɓallin API, mai tarawa | [mahaɗi](https://aimlapi.com) | An dakatar da matakin kyauta (2026) — yanzu AI/ML API yana amfani da tsarin biyan gwargwadon amfani kawai (mafi ƙarancin caji $20); babu kuɗin amfani na kyauta da ake sabuntawa. | -| `ainative` | `ainative` | AINative Studio | Maɓallin API | [mahaɗi](https://ainative.studio) | Ƙirƙiri maɓallin API na kyauta a ainative.studio (ba tare da kati ba), sannan liƙa shi a nan a matsayin token Bearer. | -| `aion` | `aion` | Aion Labs | Maɓallin API | [mahaɗi](https://www.aionlabs.ai) | Ƙirƙiri maɓallin API na kyauta a aionlabs.ai (ba tare da kati ba), sannan liƙa shi a nan a matsayin token Bearer. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | Maɓallin API | [mahaɗi](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (China) | Maɓallin API | [mahaɗi](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Maɓallin API | [mahaɗi](https://developer.ant-ling.com/en/docs/) | Yi rajista kuma ƙirƙiri maɓallin API a na'ura mai sarrafa Ant Ling API (https://chat.ant-ling.com/open), sannan liƙa shi a nan. OmniRoute yana karkatar da zirga-zirgar taɗi zuwa https://api.ant-ling.com/v1/chat/completions; mai samarwar ya dace da OpenAI kuma yana kuma samar da mahaɗin da ya dace da Anthropic. | -| `anthropic` | `anthropic` | Anthropic | Maɓallin API | [mahaɗi](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | Maɓallin API, mai tarawa | [mahaɗi](https://anyapi.ai) | Tsarin kyauta: ANY Tokens 100,000/rana da RPM 100 ga samfuran Free/Basic da suka cancanta; ba a buƙatar katin kuɗi. | -| `api-airforce` | `af` | Api.airforce | Maɓallin API | [mahaɗi](https://api.airforce) | Samfura 55 na matakin kyauta, ciki har da Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | Maɓallin API | [mahaɗi](https://arcee.ai) | Sami maɓallin API a arcee.ai | -| `auriko` | `auriko` | Auriko | Maɓallin API, mai tarawa | [mahaɗi](https://www.auriko.ai) | Tsarin kyauta yana bayar da RPM 1,000 na Platform da RPM 10,000 na BYOK. Har yanzu aiwatar da inference na Platform yana haɗa da kuɗin mai samarwa; wannan ba tarin token na kyauta ba ne ko inference na kyauta mara iyaka. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | Maɓallin API, na kamfanoni | [mahaɗi](https://learn.microsoft.com/azure/ai-foundry) | Yi amfani da maɓallin Azure AI Foundry naka. Base URL na iya zama https://.services.ai.azure.com/openai/v1/ ko https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | Maɓallin API, na kamfanoni | [mahaɗi](https://azure.microsoft.com/products/ai-services/openai-service) | Yi amfani da maɓallin Azure OpenAI API naka. Ya kamata Base URL ya zama endpoint na resource ɗinka, misali https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | Maɓallin API | [mahaɗi](https://b.ai) | Maɓallin Bearer API don mashigar LLM ta b.ai mai dacewa da OpenAI (wanda ya bambanta da TheB.AI). Ƙirƙiri maɓalli a https://docs.b.ai, sannan yi amfani da https://api.b.ai/v1 a matsayin Base URL mai dacewa da OpenAI. | -| `baichuan` | `baichuan` | Baichuan | Maɓallin API | [mahaɗi](https://www.baichuan-ai.com/) | Sami maɓallin API a platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | Maɓallin API | [mahaɗi](https://ernie.baidu.com/) | Sami maɓallin API a console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Maɓallin API | [mahaɗi](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | Maɓallin API | [mahaɗi](https://baseten.co) | Kuɗin gwaji na $30 kyauta don inference na GPU | -| `bazaarlink` | `bzl` | BazaarLink | Maɓallin API | [mahaɗi](https://bazaarlink.ai) | Yi amfani da maɓallin BazaarLink API naka (yana farawa da sk-bl-) a cikin Authorization: Bearer . OpenAI SDK yana aiki da Base URL https://bazaarlink.ai/api/v1. Samfura suna amfani da tsarin provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | Maɓallin API, na kamfanoni | [mahaɗi](https://aws.amazon.com/bedrock) | Yi amfani da maɓallin Amazon Bedrock API naka kuma saita yankin AWS inda aka kunna samfuranka (misali eu-west-2). OmniRoute yana kiran Converse API na asali na Bedrock kai tsaye. | -| `black-forest-labs` | `bfl` | Black Forest Labs | Maɓallin API, hoto | [mahaɗi](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | Maɓallin API | [mahaɗi](https://blackbox.ai) | ⚠️ **AN DAINA AMFANI DA SHI.** api.blackbox.ai yana dawo da HTTP 404 a kowane bambancin path (bincike na 2026-08-21); an mayar da mahaɗin inference na jama'a zuwa endpoint na enterprise.blackbox.ai/v1 mai ƙuntataccen izini. | -| `bluesminds` | `bm` | BluesMinds | Maɓallin API | [mahaɗi](https://www.bluesminds.com) | Kuɗin pi na yau da kullum kyauta — yana goyon bayan samfura sama da 200, ciki har da GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | Maɓallin API | [mahaɗi](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | Maɓallin API | [mahaɗi](https://bytez.com) | Kuɗin amfani na $1 kyauta, ana sabunta shi duk bayan makonni 4 | -| `cerebras` | `cerebras` | Cerebras | Maɓallin API | [mahaɗi](https://inference.cerebras.ai) | Kuɗin rajista na $5 sau ɗaya (yana aiki na kwanaki 30); ana buƙatar hanyar biyan kuɗi. Ba matakin kyauta ne da ake sabuntawa ba. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | Maɓallin API | [mahaɗi](https://hyper.charm.land) | Hypercredits 100 kyauta kowane wata bayan rajista | -| `chat-oripe` | `chat-oripe` | Chat Oripe | Maɓallin API, mai tarawa | [mahaɗi](https://api.oriper.com) | Metadata na hukuma yana tallata tokens miliyan 2/wata, amma an katange shafin jama'a da takardun bayani yayin bincike; ɗauki ƙimar amfani da alaƙar alamar kasuwancin a matsayin waɗanda ba a tabbatar da su ba. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | Maɓallin API, mai tarawa | [mahaɗi](https://chatanywhere.tech) | Don amfanin kai, ilimi ko bincike kawai: takardun jama'a sun ambaci maki 10,000/rana da buƙatu 200/rana ga kowane IP/maɓalli; kada a yi amfani da shi don zirga-zirgar kasuwanci. | -| `cheaperinference` | `cinf` | Cheaper Inference | Maɓallin API | [mahaɗi](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | Maɓallin API | [mahaɗi](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | Maɓallin API, mai tarawa | [mahaɗi](https://chutes.ai) | Maɓallin Bearer API don ƙofar Chutes mai dacewa da OpenAI. | -| `clarifai` | `clarifai` | Clarifai | Maɓallin API, na kamfanoni | [mahaɗi](https://docs.clarifai.com) | Yi amfani da Clarifai PAT ɗinka ko maɓallin API na musamman ga manhaja. OmniRoute yana nufar endpoint mai dacewa da OpenAI a https://api.clarifai.com/v2/ext/openai/v1 kuma yana tantancewa da Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Maɓallin API, mai tarawa | [mahaɗi](https://cloudcode.one) | Samfuran kyauta da aka wallafa sun haɗa da glm-4.7-flash da glm-4.6v-flash; ba a wallafa ƙayyadadden adadin iyaka ba, kuma ƙirƙirar maɓalli na iya buƙatar kuɗin asusu ko takardar rangwame. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Maɓallin API | [mahaɗi](https://developers.cloudflare.com/workers-ai) | Yana buƙatar API Token DA Account ID (ana samunsa a dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | Maɓallin API | [mahaɗi](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | Maɓallin API | [mahaɗi](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | Maɓallin API | [mahaɗi](https://cohere.com) | Gwajin Kyauta: kiran API 1,000/wata don gwaji, ba a buƙatar katin kuɗi | -| `command-code` | `cmd` | Command Code | Maɓallin API | [mahaɗi](https://commandcode.ai/) | Yi amfani da maɓallin API na Command Code. Ana aika buƙatu zuwa endpoint na Command Code na /provider/v1/chat/completions. | -| `coze` | `coze` | Coze | Maɓallin API | [mahaɗi](https://coze.com) | Sami maɓallin API a coze.com/open/api | -| `crof` | `crof` | CrofAI | Maɓallin API | [mahaɗi](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | Maɓallin API | [mahaɗi](https://cursor.com/dashboard/api) | Liƙa maɓallin API na mai amfani da Cursor (crsr_...) daga cursor.com/dashboard/api. OmniRoute yana musanya shi da token na zama idan an buƙata; ba a buƙatar IDE ko shigar da cursor-agent. Ana cajin amfani zuwa tsarin Cursor da ke da maɓallin. | -| `dahl` | `dahl` | Dahl | Maɓallin API | [mahaɗi](https://inference.dahl.global) | Danna 'Add Account' don samar da token ta atomatik, ko ƙara maɓallin API da hannu. | -| `databricks` | `databricks` | Databricks | Maɓallin API, na kamfanoni | [mahaɗi](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | Maɓallin API, na kamfanoni | [mahaɗi](https://docs.datarobot.com) | Yi amfani da token na API na DataRobot ɗinka. Base URL na zaɓi zai iya zama tushen asusun (don LLM Gateway) ko URL na turawa a ƙarƙashin /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | Maɓallin API, hoto | [mahaɗi](https://deepai.org) | Yi amfani da maɓallin API na DeepAI ɗinka. Sami ɗaya a deepai.org — yana buƙatar biyan kuɗin Pro ($9.99/wata). | -| `deepinfra` | `deepinfra` | DeepInfra | Maɓallin API | [mahaɗi](https://deepinfra.com) | Kuɗin rajista na kyauta don gwajin API da binciken samfura | -| `deepseek` | `ds` | DeepSeek | Maɓallin API | [mahaɗi](https://platform.deepseek.com) | Token miliyan 5 kyauta yayin rajista - ba a buƙatar katin kuɗi | -| `dgrid` | `dgrid` | DGrid | Maɓallin API | [mahaɗi](https://dgrid.ai) | DGrid Free Models Router: buƙatu 10/minti da buƙatu 100/rana. Ƙarin kuɗi na $5 sau ɗaya yana buɗe har zuwa buƙatu 20/minti da buƙatu 1,000/rana. | -| `dify` | `dify` | Dify | Maɓallin API | [mahaɗi](https://dify.ai) | Sami maɓallin API daga instance na Dify ɗinka. | -| `digitalocean` | `digitalocean` | DigitalOcean | Maɓallin API | [mahaɗi](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | Maɓallin API | [mahaɗi](https://dit.ai) | Yi amfani da maɓallin API na dit.ai ɗinka a Authorization: Bearer . Yana da cikakkiyar dacewa da OpenAI — madadin da za a iya sakawa kai tsaye, kawai canza base URL zuwa https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | Maɓallin API | [mahaɗi](https://doubao.com) | Sami maɓallin API a console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | Maɓallin API, mai tarawa | [mahaɗi](https://www.dxnt.com) | An bayyana asusun kyauta da kiran API 100/rana; iyakar na iya ƙaruwa ta hanyar gayyata kuma tana iya bambanta gwargwadon asusu. | -| `electronhub` | `electronhub` | Electron Hub | Maɓallin API, mai tarawa | [mahaɗi](https://www.electronhub.ai) | Tsarin kyauta: 5 RPM, kuɗin amfani na $0.25 kowane mako da Neutrinos 10/rana don samfuran :free; kasafin iyali ma yana aiki. | -| `empower` | `empower` | Empower | Maɓallin API, mai tarawa | [mahaɗi](https://docs.empower.dev) | Maɓallin Bearer API don endpoint na Empower mai dacewa da OpenAI. | -| `eurouter` | `eurouter` | EURouter | Maɓallin API, mai tarawa | [mahaɗi](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | Maɓallin API | [mahaɗi](https://factory.ai) | Maɓallin Bearer API don ƙofar Factory mai dacewa da OpenAI. | -| `fal-ai` | `fal` | Fal.ai | Maɓallin API, hoto | [mahaɗi](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | Maɓallin API, mai tarawa | [mahaɗi](https://fastrouter.ai) | Samfura masu ƙarin :free suna ba da damar buƙatu 10/rana ga kowace ƙungiya da samfuri; samuwa na iya canzawa. | -| `featherless-ai` | `featherless` | Featherless AI | Maɓallin API | [mahaɗi](https://featherless.ai) | Akwai matakin kyauta — ba a buƙatar katin kuɗi | -| `fenayai` | `fenayai` | FenayAI | Maɓallin API, mai tarawa | [mahaɗi](https://fenayai.com) | Maɓallin Bearer API don ƙofar FenayAI mai dacewa da OpenAI. | -| `fireworks` | `fireworks` | Fireworks AI | Maɓallin API | [mahaɗi](https://fireworks.ai) | Kuɗin farawa na $1 kyauta yayin rajista don gwajin API | -| `free-ai` | `free-ai` | Free.ai | Maɓallin API, mai tarawa | [mahaɗi](https://free.ai) | Token 30,000/rana suna ɗaukar nauyin samfuran da aka karɓi bakuncinsu da kai bayan tabbatar da imel. Amfani fiye da wannan adadi na iya haifar da caji a ainihin farashi, kuma samfuran waje na premium na biyan kuɗi ne. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | Maɓallin API | [mahaɗi](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | Maɓallin API | [mahaɗi](https://freebuff.com) | Shigar da Freebuff / Codebuff Auth Token (wanda aka samu ta hanyar shiga ta CLI ko mai tarawa ta atomatik). | -| `freeinference` | `freeinference` | FreeInference | Maɓallin API, mai haɗa sabis | [mahaɗi](https://freeinference.org) | Samun dama kyauta don bincike ba tare da kati ba; masu nema waɗanda ba na Harvard ba suna buƙatar amincewa da hannu, kuma ba a bayar da tabbacin wata ƙayyadaddiyar adadi a bainar jama'a ba. | -| `freemodel-dev` | `fmd` | FreeModel.dev | Maɓallin API | [mahaɗi](https://freemodel.dev) | Kiredit kyauta na $300 yayin rajista — ba a buƙatar katin kuɗi. Samu damar GPT-5.4 da GPT-5.5 (sabbin fitattun samfurorin OpenAI) ta hanyar API mai dacewa da OpenAI. | -| `freetheai` | `fta` | FreeTheAi | Maɓallin API, mai haɗa sabis | [mahaɗi](https://freetheai.xyz) | Shiga FreeTheAi Discord don samun maɓallin API ɗinka na kyauta. | -| `friendliai` | `friendli` | FriendliAI | Maɓallin API | [mahaɗi](https://friendli.ai) | Matakin kyauta don inference marar sabar — ba a buƙatar katin kuɗi | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Maɓallin API, mai haɗa sabis | [mahaɗi](https://g4f.space) | Samar da kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Maɓallin API, mai haɗa sabis | [mahaɗi](https://g4f.space) | Samar da kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Maɓallin API, mai haɗa sabis | [mahaɗi](https://g4f.space) | Samar da kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Maɓallin API, mai haɗa sabis | [mahaɗi](https://g4f.space) | Samar da kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Maɓallin API, mai haɗa sabis | [mahaɗi](https://g4f.space) | Samar da kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | Maɓallin API | [mahaɗi](https://galadriel.com) | ⚠️ **AN DAINA AMFANI DA SHI.** api.galadriel.ai ba ya warwarewa kuma (binciken 2026-06-19); da alama an dakatar da API na inference. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | Maɓallin API | [mahaɗi](https://aistudio.google.com) | Akwai matakin kyauta ta Google AI Studio; ƙayyadaddun kason kowane samfuri da iyakokin yanki na yanzu suna aiki | -| `getgoapi` | `ggo` | GoAPI | Maɓallin API, mai haɗa sabis | [mahaɗi](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | Maɓallin API | [mahaɗi](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | Maɓallin API | [mahaɗi](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab personal access token don API na Code Suggestions na jama'a. Saita URL na tushe mai karɓar baƙunci da kansa idan ba a amfani da gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Maɓallin API | [mahaɗi](https://opengateway.gitlawb.com) | An soke MiMo na kyauta (xiaomi/mimo-v2.5) a 2026-05 — yanzu Opengateway ƙofa ce ta kiredit da ake biya gwargwadon amfani; babu samfurin kyauta mai maimaituwa. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Maɓallin API | [mahaɗi](https://opengateway.gitlawb.com) | Tallan Nemotron na kyauta ya ƙare a 2026-06 — yanzu hanyar GMI Cloud kiredit ce kawai da ake biya gwargwadon amfani. | -| `glm` | `glm` | GLM Coding | Maɓallin API | [mahaɗi](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | Maɓallin API | [mahaɗi](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | Maɓallin API | [mahaɗi](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | Maɓallin API | [mahaɗi](https://greenpt.com) | Ana iya ƙirƙirar biyan kuɗin API kyauta; ana cajin inference bisa kowane token. Ba a wallafa wani kaso na inference kyauta ba. | -| `groq` | `groq` | Groq | Maɓallin API | [mahaɗi](https://groq.com) | Tsarin kyauta: iyakokin kowane samfuri (token 200K/rana ga kowane samfurin taɗi; duba console.groq.com/docs/rate-limits don RPM/RPD) — babu hanyar biyan kuɗi da aka adana. | -| `haiper` | `hp` | Haiper | Maɓallin API, bidiyo | [mahaɗi](https://haiper.ai) | Samu maɓallin API a haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | Maɓallin API | [mahaɗi](https://api.hcnsec.cn) | Samu maɓallin API a api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | Maɓallin API, mai haɗa sabis | [mahaɗi](https://helixmind.online) | Ba a tabbatar da ikirarin 3 RPM/50 RPD da rashin buƙatar kati da aka yaɗa a baya ba yayin binciken 2026-08-02; kaso da tsarin biyan kuɗi na yanzu suna buƙatar tabbatar da asusu. | -| `helyxai` | `helyxai` | Helyx AI | Maɓallin API, mai haɗa sabis | [mahaɗi](https://helyxai.space) | Takardun tsarin Free mai aiki sun bayyana token 100,000/rana; ikirarin talla na 2M+ na daban a shafin ya saɓa da wannan kuma ba a ɗauke shi a matsayin tabbacin kaso ba. | -| `heroku` | `heroku` | Heroku AI | Maɓallin API, na kamfanoni | [mahaɗi](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | Maɓallin API | [mahaɗi](https://huggingface.co) | API na Inference kyauta don dubban samfura (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | Maɓallin API | [mahaɗi](https://hyperbolic.xyz) | Kiredit na gwaji na $1-5 yayin rajista don inference marar sabar | -| `ideogram` | `ideo` | Ideogram | Maɓallin API | [mahaɗi](https://ideogram.ai) | Samu maɓallin API a ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | Maɓallin API | [mahaɗi](https://xinghuo.xfyun.cn) | Samu maɓallin API a console.xfyun.cn | -| `inception` | `inception` | Inception | Maɓallin API | [mahaɗi](https://docs.inceptionlabs.ai) | Token miliyan 10 kyauta yayin rajista, ba a buƙatar katin kuɗi. | -| `inference-net` | `inet` | Inference.net | Maɓallin API | [mahaɗi](https://inference.net) | Kiredit kyauta na $25 yayin rajista, tare da tallafin bincike da ake da shi | -| `internlm` | `internlm` | InternLM (Intern-S1) | Maɓallin API | [mahaɗi](https://internlm.intern-ai.org.cn/) | Kason wata-wata kyauta na kusan token 1M na shigarwa / 3M na fitarwa (kusan 10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | Maɓallin API, embed/rerank | [haɗi](https://jina.ai) | Maɓallin Bearer API na api.jina.ai — embeddings, rerank, classify, segment, da search. Maɓallan dashboard suna da fifiko kan JINA_AI_API_KEY. Wannan ba katin Reader / r.jina.ai ba ne kuma ba ya ɗebo URLs. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Maɓallin API | [haɗi](https://jina.ai/reader) | Maɓallin Bearer API na canza URL zuwa markdown a r.jina.ai (/v1/web/fetch kawai). Ba ya samar da /v1/embeddings ko /v1/rerank. Token ɗin Jina iri ɗaya da na Foundation API yana aiki; OmniRoute yana sake amfani da maɓallin dashboard na jina-ai ko JINA_AI_API_KEY idan wannan katin babu komai. | -| `kenari` | `kenari` | Kenari | Maɓallin API | [haɗi](https://kenari.id) | Yi amfani da maɓallin Kenari API naka (kn-...) a cikin Authorization: Bearer . Yana da cikakken dacewa da OpenAI. Tushen URL na API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | Maɓallin API | [haɗi](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | Maɓallin API, mai tarawa | [haɗi](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (Tsohon Moonshot API) | Maɓallin API | [haɗi](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Maɓallin Kimi Code API | Maɓallin API | [haɗi](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | Maɓallin API | [haɗi](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | Maɓallin API, mai tarawa | [haɗi](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | Maɓallin API, bidiyo | [haɗi](https://leonardo.ai) | Sami maɓallin API a leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | Maɓallin API | [haɗi](https://liquid.ai) | Sami maɓallin API a liquid.ai | -| `literouter` | `literouter` | LiteRouter | Maɓallin API, mai tarawa | [haɗi](https://literouter.com) | Nau'ikan model na kyauta suna amfani da ƙarin :free; iyakokin kuɗin yau da kullum sun bambanta bisa model, kuma an iyakance shigarwar kyauta zuwa tokens 5,000. | -| `llamagate` | `llamagate` | LlamaGate | Maɓallin API | [haɗi](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Maɓallin API, mai tarawa | [haɗi](https://llm.kiwi) | Tsarin kyauta yana samar da auto da hrLLM; iyakar buƙatu 40 a kowace awa da aka wallafa tana shafar hrLLM. | -| `llm7` | `llm7` | LLM7.io | Maɓallin API | [haɗi](https://llm7.io) | Yi amfani da kowane maɓalli da ba fanko ba (misali 'unused'). Idan tsofaffin models da aka haɗa tun farko suka mayar da model_unavailable, yi amfani da Available Models → Import from /models ko Auto-Sync; model mai rai da aka tabbatar: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | Maɓallin API, mai tarawa | [haɗi](https://llmgateway.io) | Tsarin Hosted Free: models masu farashin kyauta suna da iyakar buƙatu 5 a duk mintuna 10 idan asusun ba shi da credits. | -| `logfare` | `logfare` | Logfare | Maɓallin API, mai tarawa | [haɗi](https://logfare.ai) | Ƙirƙiri asusun kyauta a https://logfare.ai/register (sunan mai amfani/kalmar sirri, babu tabbatar da imel) don samun maɓallin API nan take, sannan liƙa shi a nan a matsayin Bearer token. | -| `longcat` | `lc` | LongCat AI | Maɓallin API | [haɗi](https://longcat.chat/platform/docs) | Kyauta: tallafin tokens miliyan 10 sau ɗaya bayan rajistar asusu + tabbatarwar KYC (LongCat-2.0). Sau ɗaya kawai — ba tallafi ne da ke maimaituwa kullum/kowane wata ba. | -| `magnific` | `freepik` | Magnific | Maɓallin API, hoto | [haɗi](https://www.magnific.com) | Sami maɓallin API a magnific.com/user/api-keys (header x-magnific-api-key). Tsofaffin maɓallan masu haɓakawa na Freepik har yanzu suna aiki. | -| `maritalk` | `maritalk` | Maritalk | Maɓallin API | [haɗi](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | Maɓallin API, mai tarawa | [haɗi](https://meganova.ai) | Rajista kyauta ba tare da kati ba. Jimillar ƙayyadaddun Tier 1 na kowane model da aka wallafa ita ce buƙatu 550/rana; ba tafki ɗaya ne na bai ɗaya ba, kuma ana iya cajin ƙarin amfani idan an kunna shi. | -| `meta-llama` | `meta` | Meta Llama API | Maɓallin API | [haɗi](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | Maɓallin API, bidiyo | [haɗi](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (China) | Maɓallin API | [haɗi](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | Maɓallin API | [haɗi](https://mistral.ai) | Matakin Free Experiment: damar shiga duk models mai iyakance ƙimar amfani, ba a buƙatar katin kuɗi | -| `mixedbread` | `mxbai` | Mixedbread AI | Maɓallin API | [haɗi](https://www.mixedbread.com) | Maɓallin Bearer API na API ɗin embeddings na Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | Maɓallin API, mai tarawa | [haɗi](https://www.mixlayer.com) | Model na qwen/qwen3.5-4b-free kyauta ne don yin samfuri na gwaji kuma yana da iyakancewar ƙimar amfani; babu tsayayyen RPM na jama'a ko ƙayyadadden adadin yau da kullum da aka tabbatar. | -| `mnn-ai` | `mnn-ai` | MNN AI | Maɓallin API, mai tarawa | [haɗi](https://mnnai.ru) | Tsarin kyauta: credits na $1 kowane wata, 10 RPM da damar shiga models masu alamar Free kawai. | -| `modal` | `mdl` | Modal | Maɓallin API, na kamfanoni | [haɗi](https://modal.com/docs) | Yi amfani da bearer token da ke kare aikin Modal naka, idan an kunna shi. Ya kamata tushen URL ya nuna manhajar Modal naka mai dacewa da OpenAI, misali https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | Maɓallin API | [haɗi](https://modelscope.cn) | Matakin kyauta ta hanyar ModelScope API-Inference — ana buƙatar asusun Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | Maɓallin API | [haɗi](https://monsterapi.ai) | ⚠️ **AN DAINA AMFANI DA SHI.** Monster API ya dakatar da ayyuka a 2026-06-30. Yi amfani da wasu masu samarwa masu dacewa da OpenAI. | -| `moonshot` | `moonshot` | Kimi | Maɓallin API | [haɗi](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | Maɓallin API | [haɗi](https://morphllm.com) | Matakin kyauta: credits 250K/wata, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | Maɓallin API | [haɗi](https://github.com/meta-llama/llama-stack) | Yi amfani da env var ɗinka na META_API_KEY a matsayin Bearer token. Muse Code CLI yana amfani da tsarin sadarwar OpenAI Responses API (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | Maɓallin API, mai tarawa | [haɗi](https://naga.ac) | Sami maɓallin API a naga.ac — akwai rajista ta Google/GitHub/Discord. | -| `naga-ai` | `naga-ai` | Naga AI | Maɓallin API, mai tara sabis | [haɗi](https://naga.ac) | Samfuran da aka yi wa alamar :free suna cikin jerin jama'a, amma ba a tabbatar da wata ƙayyadaddiyar kason amfani ta adadi ba. Manufofin Naga sun yi gargaɗin cewa ana iya tattara ko amfani da saƙonnin umarni da sakamakon matakin kyauta wajen horarwa. | -| `nanogpt` | `nanogpt` | NanoGPT | Maɓallin API | [haɗi](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | Maɓallin API | [haɗi](https://bynara.id) | Ƙirƙiri asusun NaraRouter na kyauta, haɗa Telegram ɗinka (ana buƙatar hakan kafin amsoshin /v1), sannan liƙa maɓallin a nan a matsayin alamar Bearer. | -| `navy` | `navy` | NavyAI | Maɓallin API | [haɗi](https://api.navy) | Ƙirƙiri maɓallin API na kyauta daga dashboard na NavyAI, sannan liƙa shi a nan a matsayin alamar Bearer. | -| `nebius` | `nebius` | Nebius AI | Maɓallin API | [haɗi](https://nebius.com) | Kimanin $1 na kuɗin gwaji bayan rajista don gwajin API | -| `nlpcloud` | `nlpc` | NLP Cloud | Maɓallin API | [haɗi](https://docs.nlpcloud.com) | Yi amfani da maɓallin API na NLP Cloud ɗinka a Authorization: Token . Ta tsohuwa, OmniRoute yana nufar chatbot endpoint da ke https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | Maɓallin API | [haɗi](https://nomic.ai) | Sami maɓallin API a atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | Maɓallin API | [haɗi](https://portal.nousresearch.com/help) | Yi amfani da maɓallin API na Nous Portal ɗinka. OmniRoute yana nufar endpoint na inference na hukuma mai jituwa da OpenAI a https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | Maɓallin API, bidiyo, mai tara sabis | [haɗi](https://novita.ai) | $0.50 na kuɗin gwaji bayan rajista (yana aiki na kusan shekara 1) | -| `nscale` | `nscale` | nScale | Maɓallin API | [haɗi](https://nscale.com) | $5 na kuɗin amfani kyauta bayan rajista don gwajin inference | -| `nube` | `nube` | Nube.sh | Maɓallin API | [haɗi](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | Maɓallin API | [haɗi](https://build.nvidia.com) | Samun dama kyauta ga masu haɓakawa: kusan 40 RPM, samfura 70+ (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | Maɓallin API, na kamfanoni | [haɗi](https://www.oracle.com/artificial-intelligence/generative-ai) | Yi amfani da maɓallin API na OCI Generative AI ɗinka ko alamar IAM bearer. URL na tushe na iya zama https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | Maɓallin API, mai tara sabis | [haɗi](https://ofox.ai) | Kundin yanzu yana tallata samfura kyauta 10+ ba tare da ƙayyadaddiyar kason amfani ta adadi da aka wallafa ba; binciki tushen sabis na sama da sharuddan riƙe bayanai da horarwa kafin amfani da shi a samarwa. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Maɓallin API | [haɗi](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | Maɓallin API | [haɗi](https://1min.ai) | Ƙirƙiri maɓallin API a https://docs.1min.ai/docs/api/create-api-key, sannan liƙa shi a nan. | -| `openadapter` | `oad` | OpenAdapter | Maɓallin API | [haɗi](https://openadapter.dev) | Yi amfani da maɓallin API na OpenAdapter ɗinka a Authorization: Bearer sk-cv-. Yana da cikakkiyar jituwa da OpenAI. URL na tushen API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | Maɓallin API | [haɗi](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | Maɓallin API | [haɗi](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | Maɓallin API | [haɗi](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | Maɓallin API | [haɗi](https://openference.com) | Tsarin kyauta: gwajin kwanaki 3 tare da samfuran buɗaɗɗen tushe — ba a buƙatar katin kuɗi | -| `openrouter` | `openrouter` | OpenRouter | Maɓallin API, mai tara sabis | [haɗi](https://openrouter.ai) | Samfuran kyauta a $0/token masu ƙarewa da :free - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | Maɓallin API | [haɗi](https://openvecta.com) | Kuɗin amfani kyauta bayan rajista don inference mai jituwa da OpenAI a faɗin LLMs, embeddings, da samfuran tunani | -| `opper` | `opper` | Opper | Maɓallin API, mai tara sabis | [haɗi](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | Maɓallin API | [haɗi](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | Maɓallin API | [haɗi](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | Maɓallin API | [haɗi](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Maɓallin API | [haɗi](https://www.perplexity.ai) | Yi amfani da maɓallin API na Perplexity ɗinka. OmniRoute yana tura ID na samfuran Agent API ta endpoint na Perplexity mai jituwa da Responses. | -| `piapi` | `pi` | PiAPI | Maɓallin API, mai tara sabis | [haɗi](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | Maɓallin API | [haɗi](https://pioneer.ai) | $75 na kuɗin amfani kyauta — ba a buƙatar katin kuɗi | -| `plamo` | `plamo` | PLaMo | Maɓallin API | [haɗi](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | Maɓallin API, mai tara sabis | [haɗi](https://creator.poe.com/api-reference) | Maɓallin Bearer API don API na Poe mai jituwa da OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | Maɓallin API, mai tara sabis | [haɗi](https://poixe.com) | Iyakokin kyauta na jama'a na yanzu ƙanana ne kuma sun keɓanta ga rukunin samfuri: 2 RPM/5 RPD ga samfuran large-cup da 20 RPM/50 RPD ga samfuran small-cup. | -| `pollinations` | `pol` | Pollinations AI | Maɓallin API, bidiyo | [haɗi](https://pollinations.ai) | Samun dama ba tare da bayyana kai/maɓalli ba zuwa samfuran kyauta da aka rubuta a takardu yana aiki gwargwadon hali. Tabbatarwar cikin gida ta v3.8.50 (2026-07-31) ta dawo da 401 ta OmniRoute da Cloudflare 1010 a gwaje-gwajen kai tsaye zuwa sabis na sama daga wannan hanyar sadarwa. Har yanzu samfuran Premium suna buƙatar maɓallin API na Pollinations daga enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | Maɓallin API | [haɗi](https://poolside.ai) | Laguna S 2.1 da XS 2.1 kyauta ne a lokacin Preview; ba a wallafa wata ƙayyadaddiyar kason amfani ta adadi ga jama'a ba. | -| `predibase` | `predibase` | Predibase | Maɓallin API | [haɗi](https://predibase.com) | ⚠️ **AN DAINA AMFANI DA SHI.** serving.app.predibase.com ba ya warwarewa kuma (bincike 2026-06-19); ga alama an dakatar da API na managed serving. | -| `publicai` | `publicai` | PublicAI | Maɓallin API | [haɗi](https://publicai.co) | Yana buƙatar maɓallin API — kuɗin rajista na sau ɗaya, sannan sai a biya | -| `qianfan` | `qianfan` | Baidu Qianfan | Maɓallin API | [haɗi](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | Maɓallin API | [mahaɗi](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | Maɓallin API | [mahaɗi](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Maɓallin API | [mahaɗi](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | Maɓallin API, hoto | [mahaɗi](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | Maɓallin API | [mahaɗi](https://regolo.ai) | Samu maɓallin API na Regolo daga regolo.ai, sannan liƙa shi a nan a matsayin token na Bearer. | -| `reka` | `reka` | Reka | Maɓallin API | [mahaɗi](https://docs.reka.ai/chat/overview) | Yi amfani da maɓallin API na Reka. OmniRoute yana goyan bayan URL na asali mai dacewa da OpenAI https://api.reka.ai/v1 kuma yana aika kanun Authorization da X-Api-Key duka domin dacewa. | -| `requesty` | `requesty` | Requesty | Maɓallin API | [mahaɗi](https://requesty.ai) | Matakin kyauta ~buƙatu 200/rana - mashigar karkatar da samfura da yawa (samfura 300+) | -| `routeway` | `routeway` | Routeway | Maɓallin API | [mahaɗi](https://routeway.ai) | Ƙirƙiri maɓallin API kyauta a routeway.ai, sannan liƙa shi a nan a matsayin token na Bearer. | -| `runwayml` | `runway` | Runway | Maɓallin API, bidiyo | [mahaɗi](https://docs.dev.runwayml.com) | Yi amfani da maɓallin API na Runway a cikin Authorization: Bearer . OmniRoute yana amfani da API na Runway na yanzu a https://api.dev.runwayml.com/v1 kuma yana aika kanun X-Runway-Version da ake buƙata ta atomatik. | -| `sambanova` | `samba` | SambaNova | Maɓallin API | [mahaɗi](https://sambanova.ai) | Kiredit na kyauta $5 lokacin rajista (yana aiki na kwanaki 30), ba a buƙatar katin kiredit | -| `sap` | `sap` | SAP Generative AI Hub | Maɓallin API, na kamfani | [mahaɗi](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Yi amfani da token na bearer na SAP AI Core. URL na asali zai iya zama tushen AI_API_URL ɗinka ko deploymentUrl daga Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | Maɓallin API | [mahaɗi](https://docs.sarvam.ai) | ₹1,000 na kiredit kyauta lokacin rajista — ba sa taɓa ƙarewa | -| `scaleway` | `scw` | Scaleway AI | Maɓallin API | [mahaɗi](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Token miliyan 1 kyauta ga sababbin asusu — mai bin ƙa'idodin EU/GDPR (Paris), Qwen3 235B & Llama 70B | -| `sealion` | `sealion` | SEA-LION | Maɓallin API | [mahaɗi](https://sea-lion.ai) | Shiga sea-lion.ai da Google (ba a buƙatar kati, babu takunkumin yanki), ƙirƙiri maɓallin API, sannan liƙa shi a nan. | -| `seekai` | `ska` | SeekAi | Maɓallin API, mai tarawa | [mahaɗi](https://seekai.cc) | Ƙirƙiri maɓallin API a https://seekai.cc, sannan liƙa shi a nan a matsayin token na Bearer. | -| `segmind` | `segmind` | Segmind | Maɓallin API, hoto, bidiyo | [mahaɗi](https://segmind.com) | Yi amfani da maɓallin API na Segmind a cikin kanun x-api-key. OmniRoute yana amfani da https://api.segmind.com/v1/ kuma yana mayar da bytes na hoton/bidiyon da aka samar kai tsaye. | -| `sensenova` | `sensenova` | SenseNova | Maɓallin API | [mahaɗi](https://platform.sensenova.cn) | Samu maɓallin API a platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | Maɓallin API | [mahaɗi](https://cloud.siliconflow.com) | Kiredit kyauta $1 tare da samfuran $0 da aka lissafa a halin yanzu bayan tabbatar da ainihi; samuwa da iyakoki na iya canzawa | -| `snowflake` | `snowflake` | Snowflake Cortex | Maɓallin API, na kamfani | [mahaɗi](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | Maɓallin API | [mahaɗi](https://xinghuo.xfyun.cn) | Samu maɓallin API a console.xfyun.cn | -| `speka` | `speka` | Speka AI | Maɓallin API, mai tarawa | [mahaɗi](https://speka.me) | Tsarin kyauta: amfanin $1 kowane wata, 10 RPM, maɓallin API guda ɗaya da damar amfani da buɗaɗɗun samfura da filin gwaji; ba a buƙatar kati. | -| `stability-ai` | `stability` | Stability AI | Maɓallin API, hoto | [mahaɗi](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | Maɓallin API | [mahaɗi](https://stepfun.com) | Samu maɓallin API a platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | Maɓallin API | [mahaɗi](https://ai.sumopod.com) | Yi amfani da maɓallin API na SumoPod (sk-...) a cikin Authorization: Bearer . Yana dacewa da OpenAI gaba ɗaya. URL na asalin API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | Maɓallin API | [mahaɗi](https://suno.ai) | Liƙa cookie na zaman daga suno.ai (tantancewar Clerk) | -| `synthetic` | `synthetic` | Synthetic | Maɓallin API, mai tarawa | [mahaɗi](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | Maɓallin API, mai tarawa | [mahaɗi](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | Maɓallin API | [mahaɗi](https://hunyuan.tencent.com) | Samu maɓallin API a console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | Maɓallin API, mai tarawa | [mahaɗi](https://theb.ai) | Maɓallin API na Bearer don mashigar TheB.AI mai dacewa da OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | Maɓallin API | [mahaɗi](https://docs.tinyfish.ai/fetch-api) | X-API-Key daga agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | Maɓallin API, bidiyo | [mahaɗi](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | Maɓallin API | [mahaɗi](https://agent-router.gaib.ai) | Yi amfani da maɓallin API na Token Kiosk a cikin Authorization: Bearer . Mashiga ce mai dacewa da OpenAI gaba ɗaya. URL na asalin API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | Maɓallin API, mai tarawa | [mahaɗi](https://www.tokenreply.com) | Samfuran da aka yi wa alamar kyauta suna da iyakokin yau da kullum da suka keɓanta ga samfur da kamfen; ba a wallafa tsayayyen ƙayyadadden kaso na kyauta na bai ɗaya ba. | -| `tokenrouter` | `trk` | TokenRouter | Maɓallin API | [mahaɗi](https://tokenrouter.com) | Yi amfani da maɓallin API na TokenRouter a cikin Authorization: Bearer . Yana dacewa da OpenAI gaba ɗaya. URL na asalin API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | Maɓallin API, hoto | [mahaɗi](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | Maɓallin API | [mahaɗi](https://docs.opentyphoon.ai) | Maɓallin API kyauta mai iyakar saurin 5 req/s da 200 req/m. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Maɓallin API | [haɗi](https://uncensored.com) | Yi amfani da maɓallin Developer API na uncensored.com (uai_sk_live_...). OmniRoute yana aika shi a matsayin kanun X-api-key zuwa endpoint na https://api.uncensored.com/api/v1 mai dacewa da OpenAI. Maɓallin ba ya taɓa ƙarewa. Wannan shi ne ɓangaren da ake aunawa/na kuɗin amfani; tattaunawar biyan kuɗi marar aunawa ita ce mai samarwa ta daban mai suna 'uc'. | -| `udio` | `udio` | Udio | Maɓallin API | [haɗi](https://udio.com) | Manna cookie na zaman daga udio.com (tabbatarwar Supabase) | -| `unorouter` | `unorouter` | UnoRouter | Maɓallin API, mai tarawa | [haɗi](https://unorouter.ai) | Samfuran da ke da kari na :free ba sa cire ma'auni; iyakar ita ce buƙata 1 a minti ga kowane samfurin kyauta ga kowane mai amfani. | -| `upstage` | `upstage` | Upstage | Maɓallin API | [haɗi](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | Maɓallin API | [haɗi](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | Maɓallin API | [haɗi](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Maɓallin API, mai tarawa | [haɗi](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | Maɓallin API, na kamfani | [haɗi](https://cloud.google.com/vertex-ai) | Samar da Service Account JSON, alamar shiga ta OAuth, maɓallin Vertex Express API, ko maɓallin izini da aka ɗaure da service account. Yanayin Express yana tallafawa Gemini kawai; samfuran abokan hulɗa suna buƙatar bayanan shaida masu iyaka ga project. | -| `vertex-partner` | `vp` | Vertex AI Partners | Maɓallin API, na kamfani | [haɗi](https://cloud.google.com/vertex-ai) | Samar da Service Account JSON ko bayanan shaida na OAuth. Maɓallin izini da aka ɗaure da service account ma yana tallafawa ganowa, amma yin inference na abokin hulɗa yana kuma buƙatar Google Cloud project ID nasa. Daidaitattun maɓallan Express suna tallafawa Gemini kawai. | -| `void-ai` | `void-ai` | Void AI | Maɓallin API, mai tarawa | [haɗi](https://voidai.app) | Kundin samfura na jama'a yana yi wa wasu samfura alamar cewa suna buƙatar tsarin kyauta, amma samun damar yana da sharuɗɗa kuma ba a tabbatar da wata ƙayyadaddiyar adadin ƙima ba. | -| `volcengine` | `volcengine` | Volcengine | Maɓallin API | [haɗi](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Maɓallin API | [haɗi](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Haɗa asusun Volcano Engine naka ko yi amfani da maɓallin API na biyan kuɗin Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Maɓallin API | [haɗi](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Haɗa asusun Volcano Engine naka ko yi amfani da maɓallin API na biyan kuɗin Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | Maɓallin API, sakawa/sake jere | [haɗi](https://www.voyageai.com) | Maɓallin Bearer API don embeddings da API na sake jere na Voyage AI. | -| `wafer` | `wafer` | Wafer AI | Maɓallin API | [haɗi](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | Maɓallin API | [haɗi](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Maɓallin API, na kamfani | [haɗi](https://www.ibm.com/products/watsonx-ai) | Yi amfani da alamar bearer ta watsonx. Base URL na iya zama https://.ml.cloud.ibm.com/ml/gateway/v1/ ko endpoint na /ml/gateway/v1 da ake sarrafawa da kai. | -| `writer` | `writer` | Writer | Maɓallin API | [haɗi](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | Maɓallin API | [haɗi](https://x5lab.dev) | Yi amfani da maɓallin X5Lab API naka (x5-...) a cikin Authorization: Bearer . Yana dacewa da OpenAI gaba ɗaya. API base URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | Maɓallin API | [haɗi](https://x.ai) | Yi amfani da maɓallin xAI API na hukuma, ko shiga ta hanyar xAI OAuth. Zaman Grok Build JWT suna ci gaba da kasancewa mai samarwa daban. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Maɓallin API | [haɗi](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Maɓallin API | [haɗi](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | Maɓallin API, mai tarawa | [haɗi](https://xkiro.com) | Ƙirƙiri asusun kyauta a xkiro.com sannan ka manna maɓallin a nan (Bearer; ana kuma karɓar x-api-key). | -| `yi` | `yi` | Yi (01.AI) | Maɓallin API | [haɗi](https://01.ai) | Sami maɓallin API a platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | Maɓallin API, mai tarawa | [haɗi](https://yolo-auto.com) | Samun damar API kyauta yana da iyakar buƙatu kuma an yi niyyarsa don gwaji; ba a wallafa ƙayyadaddiyar adadin yau da kullum ba kuma ba a yi alƙawarin cewa samun damar kyauta zai ci gaba har abada ba. | -| `zai` | `zai` | Z.AI | Maɓallin API | [haɗi](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | Maɓallin API | [haɗi](https://zenmux.ai) | Yi amfani da maɓallin ZenMux API naka a cikin Authorization: Bearer . ZenMux yana dacewa da OpenAI gaba ɗaya. Base URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Maɓallin API, mai tarawa | [haɗi](https://www.zerolimitai.com) | Ana tallata gwajin kyauta na ɗan lokaci, amma shafukan hukuma sun saɓa tsakanin kwanaki 3 da 7; ba a ɗaukar ikirarin kira 100 a rana a matsayin na dindindin. | -| `zylo-api` | `zylo` | Zylo API | Maɓallin API, mai tarawa | [haɗi](https://zyloai.net) | Tsarin Basic: 10 RPM, buƙatu 7,200 a rana da token 200,000 a rana; an iyakance shi ga samfuran rubutu na Basic. | +## Masu Samar da Maɓallin API (na biya / na biya tare da kiredit kyauta) (242) + +| ID | Laƙabi | Suna | Alamomi | Shafin yanar gizo | Bayanan kula | +| ------------------------ | --------------- | ------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | Maɓallin API | [mahaɗi](https://ai.360.cn) | Sami maɓallin API a ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | Maɓallin API, mai haɗawa | [mahaɗi](https://agentrouter.org) | Ƙimar kuɗi ta $200 kyauta bayan rajista - ƙofar sarrafa zirga-zirga tsakanin samfura da yawa | +| `agnes` | `agnes` | Agnes AI | Maɓallin API, bidiyo | [mahaɗi](https://agnes-ai.com) | Sami maɓallin API a agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (China) | Maɓallin API | [mahaɗi](https://api.agnes-ai.cn) | Sami maɓallin API daga shafin Agnes CN. | +| `ai21` | `ai21` | AI21 Labs | Maɓallin API | [mahaɗi](https://www.ai21.com) | Ƙimar gwaji ta $10 bayan rajista (tana aiki na watanni 3), ba a buƙatar katin kuɗi | +| `aimlapi` | `aiml` | AI/ML API | Maɓallin API, mai haɗawa | [mahaɗi](https://aimlapi.com) | An dakatar da matakin kyauta (2026) — yanzu AI/ML API yana aiki ne kawai da biyan kuɗin abin da aka yi amfani da shi (mafi ƙarancin caji $20); babu ƙimar kyauta mai maimaituwa. | +| `ainative` | `ainative` | AINative Studio | Maɓallin API | [mahaɗi](https://ainative.studio) | Ƙirƙiri maɓallin API kyauta a ainative.studio (ba tare da kati ba), sannan liƙa shi a nan a matsayin alamar Bearer. | +| `aion` | `aion` | Aion Labs | Maɓallin API | [mahaɗi](https://www.aionlabs.ai) | Ƙirƙiri maɓallin API kyauta a aionlabs.ai (ba tare da kati ba), sannan liƙa shi a nan a matsayin alamar Bearer. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | Maɓallin API | [mahaɗi](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (China) | Maɓallin API | [mahaɗi](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | Maɓallin API | [mahaɗi](https://developer.ant-ling.com/en/docs/) | Yi rajista kuma ƙirƙiri maɓallin API a na'ura mai sarrafa Ant Ling API (https://chat.ant-ling.com/open), sannan liƙa shi a nan. OmniRoute yana tura zirga-zirgar taɗi zuwa https://api.ant-ling.com/v1/chat/completions; mai samarwar ya dace da OpenAI kuma yana kuma samar da hanyar sadarwa mai dacewa da Anthropic. | +| `anthropic` | `anthropic` | Anthropic | Maɓallin API | [mahaɗi](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | Maɓallin API, mai haɗawa | [mahaɗi](https://anyapi.ai) | Tsarin kyauta: ANY Tokens 100,000/rana da RPM 100 ga samfuran Free/Basic da suka cancanta; ba a buƙatar katin kuɗi. | +| `api-airforce` | `af` | Api.airforce | Maɓallin API | [mahaɗi](https://api.airforce) | Samfura 55 na matakin kyauta ciki har da Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | Maɓallin API | [mahaɗi](https://arcee.ai) | Sami maɓallin API a arcee.ai | +| `auriko` | `auriko` | Auriko | Maɓallin API, mai haɗawa | [mahaɗi](https://www.auriko.ai) | Tsarin kyauta yana bayar da RPM 1,000 na Platform da RPM 10,000 na BYOK. Har yanzu ƙididdigar Platform tana haɗawa da kuɗin mai samarwa; wannan ba tarin token na kyauta ba ne ko amfani da ƙididdiga kyauta marar iyaka. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | Maɓallin API, na kamfani | [mahaɗi](https://learn.microsoft.com/azure/ai-foundry) | Yi amfani da maɓallin Azure AI Foundry ɗinka. Tushen URL zai iya zama https://.services.ai.azure.com/openai/v1/ ko https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | Maɓallin API, na kamfani | [mahaɗi](https://azure.microsoft.com/products/ai-services/openai-service) | Yi amfani da maɓallin Azure OpenAI API ɗinka. Ya kamata tushen URL ya zama endpoint na albarkarka, misali https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | Maɓallin API | [mahaɗi](https://b.ai) | Maɓallin Bearer API na ƙofar LLM ta b.ai mai dacewa da OpenAI (wadda ta bambanta da TheB.AI). Ƙirƙiri maɓalli a https://docs.b.ai, sannan yi amfani da https://api.b.ai/v1 a matsayin tushen URL mai dacewa da OpenAI. | +| `baichuan` | `baichuan` | Baichuan | Maɓallin API | [mahaɗi](https://www.baichuan-ai.com/) | Sami maɓallin API a platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | Maɓallin API | [mahaɗi](https://ernie.baidu.com/) | Sami maɓallin API a console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | Maɓallin API | [mahaɗi](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | Maɓallin API | [mahaɗi](https://baseten.co) | Ƙimar gwaji ta $30 kyauta don ƙididdigar GPU | +| `bazaarlink` | `bzl` | BazaarLink | Maɓallin API | [mahaɗi](https://bazaarlink.ai) | Yi amfani da maɓallin BazaarLink API ɗinka (yana farawa da sk-bl-) a cikin Authorization: Bearer . OpenAI SDK yana aiki da tushen URL https://bazaarlink.ai/api/v1. Samfura suna amfani da tsarin provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | Maɓallin API, na kamfani | [mahaɗi](https://aws.amazon.com/bedrock) | Yi amfani da maɓallin Amazon Bedrock API ɗinka kuma saita yankin AWS inda aka kunna samfuranka (misali eu-west-2). OmniRoute yana kiran API na asali na Converse na Bedrock kai tsaye. | +| `black-forest-labs` | `bfl` | Black Forest Labs | Maɓallin API, hoto | [mahaɗi](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | Maɓallin API | [mahaɗi](https://blackbox.ai) | ⚠️ **AN DAINA AMFANI DA SHI.** api.blackbox.ai yana mayar da HTTP 404 a kowace sigar hanya (bincike 2026-08-21); an matsar da hanyar ƙididdigar jama'a zuwa endpoint na enterprise.blackbox.ai/v1 mai ƙuntataccen shiga. | +| `bluesminds` | `bm` | BluesMinds | Maɓallin API | [mahaɗi](https://www.bluesminds.com) | Ƙimar pi kyauta ta kullum — yana tallafa wa samfura fiye da 200 ciki har da GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | Maɓallin API | [mahaɗi](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | Maɓallin API | [mahaɗi](https://bytez.com) | Ƙimar $1 kyauta, tana sabuntawa kowane makonni 4 | +| `cerebras` | `cerebras` | Cerebras | Maɓallin API | [mahaɗi](https://inference.cerebras.ai) | Ƙimar rajista ta $5 sau ɗaya (tana aiki na kwanaki 30); ana buƙatar hanyar biyan kuɗi. Ba matakin kyauta mai maimaituwa ba ne. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | Maɓallin API | [mahaɗi](https://hyper.charm.land) | Hypercredits 100 kyauta kowane wata bayan rajista | +| `chat-oripe` | `chat-oripe` | Chat Oripe | Maɓallin API, mai haɗawa | [mahaɗi](https://api.oriper.com) | Metadata na hukuma yana tallata token miliyan 2/wata, amma an toshe shafin jama'a da takardun bayanai yayin bincike; ɗauki adadin izinin da daidaitawar alamar kasuwanci a matsayin waɗanda ba a tabbatar da su ba. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | Maɓallin API, mai tarawa | [mahaɗi](https://chatanywhere.tech) | Don amfanin kai, ilimi ko bincike kawai: takardun jama'a sun ambaci maki 10,000/rana da buƙatu 200/rana ga kowane IP/maɓalli; kada a yi amfani da shi don zirga-zirgar kasuwanci. | +| `cheaperinference` | `cinf` | Cheaper Inference | Maɓallin API | [mahaɗi](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | Maɓallin API | [mahaɗi](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | Maɓallin API, mai tarawa | [mahaɗi](https://chutes.ai) | Maɓallin Bearer API don mashigar Chutes mai jituwa da OpenAI. | +| `clarifai` | `clarifai` | Clarifai | Maɓallin API, na kamfani | [mahaɗi](https://docs.clarifai.com) | Yi amfani da Clarifai PAT ɗinka ko maɓallin API na musamman ga manhaja. OmniRoute yana amfani da ƙarshen sabis mai jituwa da OpenAI a https://api.clarifai.com/v2/ext/openai/v1 kuma yana tabbatar da izini da Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | Maɓallin API, mai tarawa | [mahaɗi](https://cloudcode.one) | Samfuran kyauta da aka wallafa sun haɗa da glm-4.7-flash da glm-4.6v-flash; ba a wallafa takamaiman adadin iyaka ba, kuma ƙirƙirar maɓalli na iya buƙatar kuɗin asusu ko takardar rangwame. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | Maɓallin API | [mahaɗi](https://developers.cloudflare.com/workers-ai) | Yana buƙatar API Token DA Account ID (ana samunsa a dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | Maɓallin API | [mahaɗi](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | Maɓallin API | [mahaɗi](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | Maɓallin API | [mahaɗi](https://cohere.com) | Gwajin Kyauta: kiran API 1,000/wata don gwaji, ba a buƙatar katin kuɗi | +| `command-code` | `cmd` | Command Code | Maɓallin API | [mahaɗi](https://commandcode.ai/) | Yi amfani da maɓallin Command Code API. Ana aika buƙatu zuwa ƙarshen sabis na Command Code na /provider/v1/chat/completions. | +| `coze` | `coze` | Coze | Maɓallin API | [mahaɗi](https://coze.com) | Samu maɓallin API a coze.com/open/api | +| `crof` | `crof` | CrofAI | Maɓallin API | [mahaɗi](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | Maɓallin API | [mahaɗi](https://cursor.com/dashboard/api) | Liƙa maɓallin API na mai amfani da Cursor (crsr_...) daga cursor.com/dashboard/api. OmniRoute yana musanya shi da token na zama idan an buƙata; ba sai an shigar da IDE ko cursor-agent ba. Ana cajin amfani ga tsarin Cursor da ya mallaki maɓallin. | +| `dahl` | `dahl` | Dahl | Maɓallin API | [mahaɗi](https://inference.dahl.global) | Danna 'Add Account' don samar da token ta atomatik, ko ƙara maɓallin API da hannu. | +| `databricks` | `databricks` | Databricks | Maɓallin API, na kamfani | [mahaɗi](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | Maɓallin API, na kamfani | [mahaɗi](https://docs.datarobot.com) | Yi amfani da DataRobot API token ɗinka. Base URL na zaɓi zai iya zama tushen asusun (don LLM Gateway) ko URL na turawa ƙarƙashin /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | Maɓallin API, hoto | [mahaɗi](https://deepai.org) | Yi amfani da maɓallin DeepAI API naka. Samu ɗaya a deepai.org — yana buƙatar biyan kuɗin Pro ($9.99/wata). | +| `deepinfra` | `deepinfra` | DeepInfra | Maɓallin API | [mahaɗi](https://deepinfra.com) | Kuɗin kyauta na rajista don gwajin API da binciken samfura | +| `deepseek` | `ds` | DeepSeek | Maɓallin API | [mahaɗi](https://platform.deepseek.com) | Token kyauta miliyan 5 bayan rajista — ba a buƙatar katin kuɗi | +| `dgrid` | `dgrid` | DGrid | Maɓallin API | [mahaɗi](https://dgrid.ai) | Mai Tura Samfuran Kyauta na DGrid: buƙatu 10/minti da buƙatu 100/rana. Ƙarin kuɗin $5 na har abada yana buɗe har zuwa buƙatu 20/minti da buƙatu 1,000/rana. | +| `dify` | `dify` | Dify | Maɓallin API | [mahaɗi](https://dify.ai) | Samu maɓallin API daga Dify instance ɗinka. | +| `digitalocean` | `digitalocean` | DigitalOcean | Maɓallin API | [mahaɗi](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | Maɓallin API | [mahaɗi](https://dit.ai) | Yi amfani da maɓallin dit.ai API naka a Authorization: Bearer . Yana da cikakkiyar jituwa da OpenAI — madadi kai tsaye, kawai canza base URL zuwa https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | Maɓallin API | [mahaɗi](https://doubao.com) | Samu maɓallin API a console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | Maɓallin API, mai tarawa | [mahaɗi](https://www.dxnt.com) | An bayyana asusun kyauta da kira 100/rana; iyakar na iya ƙaruwa ta hanyar gayyata kuma tana iya bambanta bisa asusu. | +| `electronhub` | `electronhub` | Electron Hub | Maɓallin API, mai tarawa | [mahaɗi](https://www.electronhub.ai) | Tsarin kyauta: 5 RPM, kuɗin kyauta na $0.25 kowane mako da Neutrinos 10/rana don samfuran :free; kasafin kuɗin iyali ma yana aiki. | +| `empower` | `empower` | Empower | Maɓallin API, mai tarawa | [mahaɗi](https://docs.empower.dev) | Maɓallin Bearer API don ƙarshen sabis na Empower mai jituwa da OpenAI. | +| `eurouter` | `eurouter` | EURouter | Maɓallin API, mai tarawa | [mahaɗi](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | Maɓallin API | [mahaɗi](https://factory.ai) | Maɓallin Bearer API don mashigar Factory mai jituwa da OpenAI. | +| `fal-ai` | `fal` | Fal.ai | Maɓallin API, hoto | [mahaɗi](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | Maɓallin API, mai tarawa | [mahaɗi](https://fastrouter.ai) | Samfura masu ƙarewa da :free suna ba da damar buƙatu 10/rana ga kowace ƙungiya da samfurin; samuwa na iya canzawa. | +| `featherless-ai` | `featherless` | Featherless AI | Maɓallin API | [mahaɗi](https://featherless.ai) | Akwai matakin kyauta — ba a buƙatar katin kuɗi | +| `fenayai` | `fenayai` | FenayAI | Maɓallin API, mai tarawa | [mahaɗi](https://fenayai.com) | Maɓallin Bearer API don mashigar FenayAI mai jituwa da OpenAI. | +| `fireworks` | `fireworks` | Fireworks AI | Maɓallin API | [mahaɗi](https://fireworks.ai) | Kuɗin farawa na kyauta $1 bayan rajista don gwajin API | +| `free-ai` | `free-ai` | Free.ai | Maɓallin API, mai tarawa | [mahaɗi](https://free.ai) | Token 30,000/rana suna ɗaukar nauyin samfuran da aka karɓi bakuncinsu da kai bayan tabbatar da imel. Amfani fiye da wannan adadi na iya jawo caji bisa ainihin farashi, kuma samfuran waje masu daraja na buƙatar biya. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | Maɓallin API | [mahaɗi](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | Maɓallin API | [mahaɗi](https://freebuff.com) | Shigar da Freebuff / Codebuff Auth Token (wanda aka samu ta hanyar shiga da CLI ko mai tarawa ta atomatik). | +| `freeinference` | `freeinference` | FreeInference | Maɓallin API, mai tarawa | [mahaɗi](https://freeinference.org) | Samun dama kyauta don bincike ba tare da kati ba; masu nema waɗanda ba na Harvard ba suna buƙatar amincewa da hannu, kuma babu wani ƙayyadadden kaso na lambobi da aka tabbatar a fili. | +| `freemodel-dev` | `fmd` | FreeModel.dev | Maɓallin API | [mahaɗi](https://freemodel.dev) | Kiredit kyauta na $300 yayin yin rajista — ba a buƙatar katin kiredit. Samu damar GPT-5.4 da GPT-5.5 (sabbin manyan samfuran OpenAI) ta hanyar API mai dacewa da OpenAI. | +| `freetheai` | `fta` | FreeTheAi | Maɓallin API, mai tarawa | [mahaɗi](https://freetheai.xyz) | Shiga Discord na FreeTheAi don samun maɓallin API naka na kyauta. | +| `friendliai` | `friendli` | FriendliAI | Maɓallin API | [mahaɗi](https://friendli.ai) | Matakin kyauta don inference marar sabar — ba a buƙatar katin kiredit | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | Maɓallin API, mai tarawa | [mahaɗi](https://g4f.space) | Tara kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | Maɓallin API, mai tarawa | [mahaɗi](https://g4f.space) | Tara kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | Maɓallin API, mai tarawa | [mahaɗi](https://g4f.space) | Tara kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | Maɓallin API, mai tarawa | [mahaɗi](https://g4f.space) | Tara kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | Maɓallin API, mai tarawa | [mahaɗi](https://g4f.space) | Tara kiredit na cake ba tare da bayyana suna ba a g4f.dev/chat, ko amfani da maɓallin memba na g4f.dev (ƙirƙiri ɗaya a g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | Maɓallin API | [mahaɗi](https://galadriel.com) | ⚠️ **AN DAINA AMFANI DA SHI.** api.galadriel.ai ya daina samuwa (binciken 2026-06-19); da alama an dakatar da API na inference. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | Maɓallin API | [mahaɗi](https://aistudio.google.com) | Akwai matakin kyauta ta Google AI Studio; ƙayyadaddun kaso na kowane samfuri da iyakokin yanki na yanzu suna aiki | +| `getgoapi` | `ggo` | GoAPI | Maɓallin API, mai tarawa | [mahaɗi](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | Maɓallin API | [mahaɗi](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | Maɓallin API | [mahaɗi](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | Token na samun damar sirri na GitLab don API na Code Suggestions na jama'a. Saita base URL mai zaman kansa idan ba a amfani da gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | Maɓallin API | [mahaɗi](https://opengateway.gitlawb.com) | An janye MiMo na kyauta (xiaomi/mimo-v2.5) a 2026-05 — yanzu Opengateway hanya ce ta kiredit mai biyan gwargwadon amfani; babu samfurin kyauta mai maimaituwa. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | Maɓallin API | [mahaɗi](https://opengateway.gitlawb.com) | Tallan Nemotron na kyauta ya ƙare a 2026-06 — yanzu hanyar GMI Cloud ta zama ta kiredit mai biyan gwargwadon amfani kawai. | +| `glm` | `glm` | GLM Coding | Maɓallin API | [mahaɗi](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (China) | Maɓallin API | [mahaɗi](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | Maɓallin API | [mahaɗi](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | Maɓallin API | [mahaɗi](https://greenpt.com) | Ƙirƙirar biyan kuɗin API kyauta ne; ana cajin inference bisa ga kowane token. Ba a wallafa wani kaso na inference na kyauta ba. | +| `groq` | `groq` | Groq | Maɓallin API | [mahaɗi](https://groq.com) | Tsarin kyauta: iyakoki na kowane samfuri (token 200K/rana ga kowane samfurin taɗi; duba console.groq.com/docs/rate-limits don RPM/RPD) — babu hanyar biyan kuɗi da aka ajiye. | +| `haiper` | `hp` | Haiper | Maɓallin API, bidiyo | [mahaɗi](https://haiper.ai) | Sami maɓallin API a haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | Maɓallin API | [mahaɗi](https://api.hcnsec.cn) | Sami maɓallin API a api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | Maɓallin API, mai tarawa | [mahaɗi](https://helixmind.online) | Ba a tabbatar da iƙirarin 3 RPM/50 RPD da rashin buƙatar kati waɗanda aka yaɗa a baya ba yayin binciken 2026-08-02; kaso da tsarin biyan kuɗi na yanzu suna buƙatar tabbatar da asusu. | +| `helyxai` | `helyxai` | Helyx AI | Maɓallin API, mai tarawa | [mahaɗi](https://helyxai.space) | Takardun Tsarin Kyauta mai aiki sun nuna token 100,000/rana; iƙirarin tallace-tallace na 2M+ daban na shafin ya saɓa da wannan, don haka ba a ɗauke shi a matsayin tabbacin kaso ba. | +| `heroku` | `heroku` | Heroku AI | Maɓallin API, na kamfani | [mahaɗi](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | Maɓallin API | [mahaɗi](https://huggingface.co) | API na Inference kyauta don dubban samfura (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | Maɓallin API | [mahaɗi](https://hyperbolic.xyz) | Kiredit na gwaji na $1-5 yayin yin rajista don inference marar sabar | +| `ideogram` | `ideo` | Ideogram | Maɓallin API | [mahaɗi](https://ideogram.ai) | Sami maɓallin API a ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | Maɓallin API | [mahaɗi](https://xinghuo.xfyun.cn) | Sami maɓallin API a console.xfyun.cn | +| `inception` | `inception` | Inception | Maɓallin API | [mahaɗi](https://docs.inceptionlabs.ai) | Token kyauta miliyan 10 yayin yin rajista, ba a buƙatar katin kiredit. | +| `inference-net` | `inet` | Inference.net | Maɓallin API | [mahaɗi](https://inference.net) | Kiredit kyauta na $25 yayin yin rajista, tare da tallafin bincike da ake da su | +| `internlm` | `internlm` | InternLM (Intern-S1) | Maɓallin API | [mahaɗi](https://internlm.intern-ai.org.cn/) | Kaso na wata-wata kyauta ~token miliyan 1 na shigarwa / miliyan 3 na fitarwa (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | Maɓallin API, embed/rerank | [haɗi](https://jina.ai) | Maɓallin Bearer API na api.jina.ai — embeddings, rerank, classify, segment, da search. Maɓallan dashboard suna da fifiko a kan JINA_AI_API_KEY. Wannan ba katin Reader / r.jina.ai ba ne kuma ba ya debo URLs. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | Maɓallin API | [haɗi](https://jina.ai/reader) | Maɓallin Bearer API na sauya URL zuwa markdown a r.jina.ai (/v1/web/fetch kawai). Ba ya samar da /v1/embeddings ko /v1/rerank. Token ɗin Jina iri ɗaya da na Foundation API yana aiki; OmniRoute yana sake amfani da maɓallin dashboard na jina-ai ko JINA_AI_API_KEY idan wannan katin babu komai. | +| `kenari` | `kenari` | Kenari | Maɓallin API | [haɗi](https://kenari.id) | Yi amfani da maɓallin Kenari API ɗinka (kn-...) a cikin Authorization: Bearer . Yana da cikakkiyar jituwa da OpenAI. URL na tushen API: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | Maɓallin API | [haɗi](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | Maɓallin API, mai tarawa | [haɗi](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Tsohon Moonshot API) | Maɓallin API | [haɗi](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Maɓallin Kimi Code API | Maɓallin API | [haɗi](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | Maɓallin API | [haɗi](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | Maɓallin API, mai tarawa | [haɗi](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | Maɓallin API, bidiyo | [haɗi](https://leonardo.ai) | Sami maɓallin API a leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | Maɓallin API | [haɗi](https://liquid.ai) | Sami maɓallin API a liquid.ai | +| `literouter` | `literouter` | LiteRouter | Maɓallin API, mai tarawa | [haɗi](https://literouter.com) | Nau'ikan model na kyauta suna amfani da ƙarin :free; iyakokin kuɗin amfanin yau da kullum sun bambanta bisa ga model, kuma an iyakance shigarwar kyauta zuwa tokens 5,000. | +| `llamagate` | `llamagate` | LlamaGate | Maɓallin API | [haɗi](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | Maɓallin API, mai tarawa | [haɗi](https://llm.kiwi) | Tsarin kyauta yana samar da auto da hrLLM; iyakar buƙatu 40 a kowace awa da aka wallafa tana aiki ne ga hrLLM. | +| `llm7` | `llm7` | LLM7.io | Maɓallin API | [haɗi](https://llm7.io) | Yi amfani da kowane maɓalli da ba fanko ba (misali 'unused'). Idan tsofaffin models na ciki suka dawo da model_unavailable, yi amfani da Available Models → Import from /models ko Auto-Sync; model ɗin da aka tabbatar yana aiki: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | Maɓallin API, mai tarawa | [haɗi](https://llmgateway.io) | Tsarin Hosted Free: models masu farashin kyauta suna da iyakar buƙatu 5 a kowane mintuna 10 idan asusun ba shi da credits. | +| `logfare` | `logfare` | Logfare | Maɓallin API, mai tarawa | [haɗi](https://logfare.ai) | Ƙirƙiri asusun kyauta a https://logfare.ai/register (sunan mai amfani/kalmar sirri, ba a buƙatar tabbatar da imel) domin samun maɓallin API nan take, sannan manna shi a nan a matsayin Bearer token. | +| `longcat` | `lc` | LongCat AI | Maɓallin API | [haɗi](https://longcat.chat/platform/docs) | Kyauta: tallafin tokens miliyan 10 na sau ɗaya bayan yin rajistar asusu + tabbatarwar KYC (LongCat-2.0). Sau ɗaya kawai — ba tallafin yau da kullum/wata-wata mai maimaituwa ba ne. | +| `magnific` | `freepik` | Magnific | Maɓallin API, hoto | [haɗi](https://www.magnific.com) | Sami maɓallin API a magnific.com/user/api-keys (header x-magnific-api-key). Tsofaffin maɓallan masu haɓakawa na Freepik har yanzu suna aiki. | +| `maritalk` | `maritalk` | Maritalk | Maɓallin API | [haɗi](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | Maɓallin API, mai tarawa | [haɗi](https://meganova.ai) | Rajistar kyauta ba tare da kati ba. Ƙididdigar Tier 1 da aka wallafa ta kowane model ta kai jimillar buƙatu 550/rana; ba tarin bai ɗaya ne da ake rabawa ba, kuma ana iya cajin ƙarin amfani idan an kunna shi. | +| `meta-llama` | `meta` | Meta Llama API | Maɓallin API | [haɗi](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | Maɓallin API, bidiyo | [haɗi](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Sin) | Maɓallin API | [haɗi](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | Maɓallin API | [haɗi](https://mistral.ai) | Matakin Free Experiment: damar shiga duk models mai iyakance yawan buƙatu, ba a buƙatar katin kuɗi | +| `mixedbread` | `mxbai` | Mixedbread AI | Maɓallin API | [haɗi](https://www.mixedbread.com) | Maɓallin Bearer API na API ɗin embeddings na Mixedbread. | +| `mixlayer` | `mixlayer` | Mixlayer | Maɓallin API, mai tarawa | [haɗi](https://www.mixlayer.com) | Model ɗin qwen/qwen3.5-4b-free kyauta ne don ƙirƙirar samfuri kuma yana da iyakancewar yawan buƙatu; babu wani tabbataccen RPM na jama'a ko ƙididdigar yau da kullum. | +| `mnn-ai` | `mnn-ai` | MNN AI | Maɓallin API, mai tarawa | [haɗi](https://mnnai.ru) | Tsarin kyauta: credits na $1 a wata, 10 RPM da damar models da aka yiwa alamar Free kawai. | +| `modal` | `mdl` | Modal | Maɓallin API, na kamfani | [haɗi](https://modal.com/docs) | Yi amfani da bearer token da ke kare Modal deployment ɗinka, idan an kunna shi. Ya kamata tushen URL ya nuna zuwa manhajar Modal mai jituwa da OpenAI, misali https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | Maɓallin API | [haɗi](https://modelscope.cn) | Matakin kyauta ta ModelScope API-Inference — ana buƙatar asusun Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | Maɓallin API | [haɗi](https://monsterapi.ai) | ⚠️ **AN DAINA AMFANI DA SHI.** Monster API ya rufe ayyukansa a 2026-06-30. Yi amfani da wasu masu samarwa masu jituwa da OpenAI. | +| `moonshot` | `moonshot` | Kimi | Maɓallin API | [haɗi](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | Maɓallin API | [haɗi](https://morphllm.com) | Matakin kyauta: credits 250K/wata, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | Maɓallin API | [haɗi](https://github.com/meta-llama/llama-stack) | Yi amfani da env var ɗinka na META_API_KEY a matsayin Bearer token. Muse Code CLI yana amfani da tsarin sadarwar OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | Maɓallin API, mai tarawa | [haɗi](https://naga.ac) | Sami maɓallin API a naga.ac — akwai rajista ta Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | Maɓallin API, mai tarawa | [mahaɗi](https://naga.ac) | Samfuran da aka yi wa alama :free an jera su a bainar jama'a, amma ba a tabbatar da takamaiman ƙayyadadden adadi ba. Manufar Naga ta yi gargaɗin cewa ana iya tattara ko amfani da prompts da sakamakon matakin kyauta don horarwa. | +| `nanogpt` | `nanogpt` | NanoGPT | Maɓallin API | [mahaɗi](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | Maɓallin API | [mahaɗi](https://bynara.id) | Ƙirƙiri asusun NaraRouter na kyauta, haɗa Telegram ɗinka (ana buƙatar hakan kafin amsoshin /v1), sannan liƙa maɓallin a nan a matsayin Bearer token. | +| `navy` | `navy` | NavyAI | Maɓallin API | [mahaɗi](https://api.navy) | Ƙirƙiri maɓallin API na kyauta daga dashboard na NavyAI, sannan liƙa shi a nan a matsayin Bearer token. | +| `nebius` | `nebius` | Nebius AI | Maɓallin API | [mahaɗi](https://nebius.com) | Kimanin $1 na trial credits yayin yin rajista don gwajin API | +| `nlpcloud` | `nlpc` | NLP Cloud | Maɓallin API | [mahaɗi](https://docs.nlpcloud.com) | Yi amfani da maɓallin API na NLP Cloud a cikin Authorization: Token . Ta tsohuwa, OmniRoute yana nufar chatbot endpoint da ke https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | Maɓallin API | [mahaɗi](https://nomic.ai) | Sami maɓallin API a atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | Maɓallin API | [mahaɗi](https://portal.nousresearch.com/help) | Yi amfani da maɓallin API na Nous Portal. OmniRoute yana nufar OpenAI-compatible inference endpoint na hukuma a https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | Maɓallin API, bidiyo, mai tarawa | [mahaɗi](https://novita.ai) | $0.50 na trial credits yayin yin rajista (suna aiki na kusan shekara 1) | +| `nscale` | `nscale` | nScale | Maɓallin API | [mahaɗi](https://nscale.com) | $5 na credits kyauta yayin yin rajista don gwajin inference | +| `nube` | `nube` | Nube.sh | Maɓallin API | [mahaɗi](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | Maɓallin API | [mahaɗi](https://build.nvidia.com) | Samun damar haɓakawa kyauta: kusan 40 RPM, samfura 70+ (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | Maɓallin API, na kamfanoni | [mahaɗi](https://www.oracle.com/artificial-intelligence/generative-ai) | Yi amfani da maɓallin API na OCI Generative AI ko IAM bearer token ɗinka. Base URL na iya zama https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | Maɓallin API, mai tarawa | [mahaɗi](https://ofox.ai) | Kundin yanzu yana tallata samfura kyauta 10+ ba tare da ƙayyadadden adadi na jama'a ba; binciki asalin upstream, manufofin adanawa da sharuɗɗan horarwa kafin amfani a production. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | Maɓallin API | [mahaɗi](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | Maɓallin API | [mahaɗi](https://1min.ai) | Ƙirƙiri maɓallin API a https://docs.1min.ai/docs/api/create-api-key, sannan liƙa shi a nan. | +| `openadapter` | `oad` | OpenAdapter | Maɓallin API | [mahaɗi](https://openadapter.dev) | Yi amfani da maɓallin API na OpenAdapter a cikin Authorization: Bearer sk-cv-. Yana da cikakkiyar dacewa da OpenAI. API base URL: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | Maɓallin API | [mahaɗi](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | Maɓallin API | [mahaɗi](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | Maɓallin API | [mahaɗi](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | Maɓallin API | [mahaɗi](https://openference.com) | Matakin kyauta: ya haɗa da Qwen3.8 27b da Llama 3.2 3B — duba openference.com/pricing don sharuɗɗan yanzu | +| `openrouter` | `openrouter` | OpenRouter | Maɓallin API, mai tarawa | [mahaɗi](https://openrouter.ai) | Samfura kyauta a $0/token masu ɗauke da suffix :free - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | Maɓallin API | [mahaɗi](https://openvecta.com) | Credits kyauta yayin yin rajista don inference mai dacewa da OpenAI a faɗin LLMs, embeddings, da reasoning models | +| `opper` | `opper` | Opper | Maɓallin API, mai tarawa | [mahaɗi](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | Maɓallin API | [mahaɗi](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | Maɓallin API | [mahaɗi](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | Maɓallin API | [mahaɗi](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | Maɓallin API | [mahaɗi](https://www.perplexity.ai) | Yi amfani da maɓallin API na Perplexity. OmniRoute yana tura model IDs na Agent API ta Responses-compatible endpoint na Perplexity. | +| `piapi` | `pi` | PiAPI | Maɓallin API, mai tarawa | [mahaɗi](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | Maɓallin API | [mahaɗi](https://pioneer.ai) | $75 na credits na amfani kyauta — ba a buƙatar katin kuɗi | +| `plamo` | `plamo` | PLaMo | Maɓallin API | [mahaɗi](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | Maɓallin API, mai tarawa | [mahaɗi](https://creator.poe.com/api-reference) | Maɓallin Bearer API don API na Poe mai dacewa da OpenAI. | +| `poixe-ai` | `poixe-ai` | Poixe AI | Maɓallin API, mai tarawa | [mahaɗi](https://poixe.com) | Iyakokin kyauta na jama'a na yanzu ƙanana ne kuma sun keɓanta ga rukunin samfuri: 2 RPM/5 RPD ga large-cup models da 20 RPM/50 RPD ga small-cup models. | +| `pollinations` | `pol` | Pollinations AI | Maɓallin API, bidiyo | [mahaɗi](https://pollinations.ai) | Samun dama ba tare da bayyana suna/maɓalli ba ga samfuran kyauta da aka rubuta yana aiki ne gwargwadon ƙoƙari. Tabbatarwar v3.8.50 ta gida (2026-07-31) ta dawo da 401 ta OmniRoute da Cloudflare 1010 a gwaje-gwajen upstream kai tsaye daga wannan network. Har yanzu samfuran Premium suna buƙatar maɓallin API na Pollinations daga enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | Maɓallin API | [mahaɗi](https://poolside.ai) | Laguna S 2.1 da XS 2.1 kyauta ne a lokacin Preview; ba a wallafa ƙayyadadden adadi ga jama'a ba. | +| `predibase` | `predibase` | Predibase | Maɓallin API | [mahaɗi](https://predibase.com) | ⚠️ **AN DAINA AMFANI DA SHI.** serving.app.predibase.com ya daina resolve (bincike na 2026-06-19); da alama an dakatar da managed serving API. | +| `publicai` | `publicai` | PublicAI | Maɓallin API | [mahaɗi](https://publicai.co) | Yana buƙatar maɓallin API — credit na rajista na sau ɗaya, sannan sai biya | +| `qianfan` | `qianfan` | Baidu Qianfan | Maɓallin API | [mahaɗi](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | Maɓallin API | [mahaɗi](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | Maɓallin API | [mahaɗi](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | Maɓallin API | [mahaɗi](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | Maɓallin API, hoto | [mahaɗi](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | Maɓallin API | [mahaɗi](https://regolo.ai) | Samu maɓallin API na Regolo daga regolo.ai, sannan liƙa shi a nan a matsayin token na Bearer. | +| `reka` | `reka` | Reka | Maɓallin API | [mahaɗi](https://docs.reka.ai/chat/overview) | Yi amfani da maɓallin API na Reka. OmniRoute yana goyon bayan URL na tushe mai dacewa da OpenAI https://api.reka.ai/v1 kuma yana aika headers na Authorization da X-Api-Key don dacewa. | +| `requesty` | `requesty` | Requesty | Maɓallin API | [mahaɗi](https://requesty.ai) | Matakin kyauta na kusan buƙatu 200/rana - mashigar rarraba buƙatu zuwa samfura da yawa (samfura 300+) | +| `routeway` | `routeway` | Routeway | Maɓallin API | [mahaɗi](https://routeway.ai) | Ƙirƙiri maɓallin API na kyauta a routeway.ai, sannan liƙa shi a nan a matsayin token na Bearer. | +| `runwayml` | `runway` | Runway | Maɓallin API, bidiyo | [mahaɗi](https://docs.dev.runwayml.com) | Yi amfani da maɓallin API na Runway a cikin Authorization: Bearer . OmniRoute yana amfani da API na Runway na yanzu a https://api.dev.runwayml.com/v1 kuma yana aika header na X-Runway-Version da ake buƙata ta atomatik. | +| `sambanova` | `samba` | SambaNova | Maɓallin API | [mahaɗi](https://sambanova.ai) | Kuɗin amfani na kyauta na $5 bayan yin rajista (yana aiki na kwanaki 30), ba a buƙatar katin kuɗi | +| `sap` | `sap` | SAP Generative AI Hub | Maɓallin API, na kamfani | [mahaɗi](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Yi amfani da token na bearer na SAP AI Core. URL na tushe zai iya zama tushen AI_API_URL ɗinka ko deploymentUrl daga Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | Maɓallin API | [mahaɗi](https://docs.sarvam.ai) | Kuɗin amfani na rajista na kyauta ₹1,000 — ba ya taɓa ƙarewa | +| `scaleway` | `scw` | Scaleway AI | Maɓallin API | [mahaɗi](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | Tokens miliyan 1 kyauta ga sababbin asusu — ya dace da EU/GDPR (Paris), Qwen3 235B da Llama 70B | +| `sealion` | `sealion` | SEA-LION | Maɓallin API | [mahaɗi](https://sea-lion.ai) | Shiga sea-lion.ai ta Google (ba katin kuɗi, ba takunkumin yanki), ƙirƙiri maɓallin API, sannan liƙa shi a nan. | +| `seekai` | `ska` | SeekAi | Maɓallin API, mai tarawa | [mahaɗi](https://seekai.cc) | Ƙirƙiri maɓallin API a https://seekai.cc, sannan liƙa shi a nan a matsayin token na Bearer. | +| `segmind` | `segmind` | Segmind | Maɓallin API, hoto, bidiyo | [mahaɗi](https://segmind.com) | Yi amfani da maɓallin API na Segmind a cikin header na x-api-key. OmniRoute yana amfani da https://api.segmind.com/v1/ kuma yana mayar da bytes na hoton/bidiyon da aka samar kai tsaye. | +| `sensenova` | `sensenova` | SenseNova | Maɓallin API | [mahaɗi](https://platform.sensenova.cn) | Samu maɓallin API a platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | Maɓallin API | [mahaɗi](https://cloud.siliconflow.com) | Kuɗin amfani na kyauta na $1 tare da samfuran $0 da aka jera a yanzu bayan tabbatar da shaida; samuwa da iyakoki na iya canzawa | +| `snowflake` | `snowflake` | Snowflake Cortex | Maɓallin API, na kamfani | [mahaɗi](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | Maɓallin API | [mahaɗi](https://xinghuo.xfyun.cn) | Samu maɓallin API a console.xfyun.cn | +| `speka` | `speka` | Speka AI | Maɓallin API, mai tarawa | [mahaɗi](https://speka.me) | Tsarin kyauta: amfanin $1 kowane wata, 10 RPM, maɓallin API guda ɗaya da samun damar samfuran buɗe-tushe da filin gwaji; ba a buƙatar katin kuɗi. | +| `stability-ai` | `stability` | Stability AI | Maɓallin API, hoto | [mahaɗi](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | Maɓallin API | [mahaɗi](https://stepfun.com) | Samu maɓallin API a platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | Maɓallin API | [mahaɗi](https://ai.sumopod.com) | Yi amfani da maɓallin API na SumoPod (sk-...) a cikin Authorization: Bearer . Yana dacewa da OpenAI gaba ɗaya. URL na tushen API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | Maɓallin API | [mahaɗi](https://suno.ai) | Liƙa cookie na zaman daga suno.ai (tabbatarwar Clerk) | +| `synthetic` | `synthetic` | Synthetic | Maɓallin API, mai tarawa | [mahaɗi](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | Maɓallin API, mai tarawa | [mahaɗi](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | Maɓallin API | [mahaɗi](https://hunyuan.tencent.com) | Samu maɓallin API a console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | Maɓallin API, mai tarawa | [mahaɗi](https://theb.ai) | Maɓallin API na Bearer don mashigar TheB.AI mai dacewa da OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | Maɓallin API | [mahaɗi](https://docs.tinyfish.ai/fetch-api) | X-API-Key daga agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | Maɓallin API, bidiyo | [mahaɗi](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | Maɓallin API | [mahaɗi](https://agent-router.gaib.ai) | Yi amfani da maɓallin API na Token Kiosk a cikin Authorization: Bearer . Mashiga mai dacewa da OpenAI gaba ɗaya. URL na tushen API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | Maɓallin API, mai tarawa | [mahaɗi](https://www.tokenreply.com) | Samfuran da aka yi wa alamar kyauta suna da iyakokin yau da kullum da suka keɓanta ga samfuri da kamfen; ba a wallafa tsayayyen adadin kyauta na gama-gari ba. | +| `tokenrouter` | `trk` | TokenRouter | Maɓallin API | [mahaɗi](https://tokenrouter.com) | Yi amfani da maɓallin API na TokenRouter a cikin Authorization: Bearer . Yana dacewa da OpenAI gaba ɗaya. URL na tushen API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | Maɓallin API, hoto | [mahaɗi](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | Maɓallin API | [mahaɗi](https://docs.opentyphoon.ai) | Maɓallin API na kyauta mai iyakar ƙima ta buƙatu 5/s da buƙatu 200/m. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | Maɓallin API | [mahaɗi](https://uncensored.com) | Yi amfani da maɓallin Developer API na uncensored.com (uai_sk_live_...). OmniRoute yana aika shi a matsayin taken X-api-key zuwa maƙurar https://api.uncensored.com/api/v1 mai jituwa da OpenAI. Maɓallin ba ya taɓa ƙarewa. Wannan shi ne ɓangaren da ake aunawa/na kiredit; tattaunawar biyan kuɗi marar aunawa tana ƙarƙashin mai samarwa na daban, wato 'uc'. | +| `udio` | `udio` | Udio | Maɓallin API | [mahaɗi](https://udio.com) | Liƙa kuki na zaman daga udio.com (tabbatar da Supabase) | +| `unorouter` | `unorouter` | UnoRouter | Maɓallin API, mai tarawa | [mahaɗi](https://unorouter.ai) | Samfura masu ƙarin :free ba sa cire ma'auni; iyakar ita ce buƙata 1/minti ga kowane samfurin kyauta ga kowane mai amfani. | +| `upstage` | `upstage` | Upstage | Maɓallin API | [mahaɗi](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | Maɓallin API | [mahaɗi](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | Maɓallin API | [mahaɗi](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | Maɓallin API, mai tarawa | [mahaɗi](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | Maɓallin API, na kamfani | [mahaɗi](https://cloud.google.com/vertex-ai) | Samar da JSON na Service Account, alamar shiga ta OAuth, maɓallin Vertex Express API, ko maɓallin izini da aka ɗaure da service account. Yanayin Express yana goyon bayan Gemini kawai; samfuran abokan hulɗa suna buƙatar bayanan shaidar da aka keɓe wa aikin. | +| `vertex-partner` | `vp` | Vertex AI Partners | Maɓallin API, na kamfani | [mahaɗi](https://cloud.google.com/vertex-ai) | Samar da JSON na Service Account ko bayanan shaidar OAuth. Maɓallin izini da aka ɗaure da service account shi ma yana goyon bayan ganowa, amma gudanar da hasashen abokin hulɗa yana kuma buƙatar ID na aikin Google Cloud ɗinsa. Daidaitattun maɓallan Express suna goyon bayan Gemini kawai. | +| `void-ai` | `void-ai` | Void AI | Maɓallin API, mai tarawa | [mahaɗi](https://voidai.app) | Kundin samfura na jama'a yana yi wa wasu samfura alamar cewa suna buƙatar tsarin kyauta, amma samun dama yana da sharuɗɗa kuma ba a tabbatar da wani ƙayyadadden adadin kaso ba. | +| `volcengine` | `volcengine` | Volcengine | Maɓallin API | [mahaɗi](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | Maɓallin API | [mahaɗi](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Haɗa asusunka na Volcano Engine ko yi amfani da maɓallin API na biyan kuɗin Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | Maɓallin API | [mahaɗi](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Haɗa asusunka na Volcano Engine ko yi amfani da maɓallin API na biyan kuɗin Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | Maɓallin API, embed/rerank | [mahaɗi](https://www.voyageai.com) | Maɓallin Bearer API don embeddings da rerank APIs na Voyage AI. | +| `wafer` | `wafer` | Wafer AI | Maɓallin API | [mahaɗi](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | Maɓallin API | [mahaɗi](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | Maɓallin API, na kamfani | [mahaɗi](https://www.ibm.com/products/watsonx-ai) | Yi amfani da alamarka ta watsonx bearer. URL na asali zai iya zama https://.ml.cloud.ibm.com/ml/gateway/v1/ ko maƙurar /ml/gateway/v1 da kake sarrafawa da kanka. | +| `writer` | `writer` | Writer | Maɓallin API | [mahaɗi](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | Maɓallin API | [mahaɗi](https://x5lab.dev) | Yi amfani da maɓallin X5Lab API naka (x5-...) a cikin Authorization: Bearer . Yana da cikakkiyar jituwa da OpenAI. URL na asalin API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | Maɓallin API | [mahaɗi](https://x.ai) | Yi amfani da maɓallin xAI API na hukuma, ko shiga da xAI OAuth. Zaman Grok Build JWT suna ci gaba da kasancewa ƙarƙashin wani mai samarwa na daban. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | Maɓallin API | [mahaɗi](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | Maɓallin API | [mahaɗi](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | Maɓallin API, mai tarawa | [mahaɗi](https://xkiro.com) | Ƙirƙiri asusun kyauta a xkiro.com sannan ka liƙa maɓallin a nan (Bearer; ana kuma karɓar x-api-key). | +| `yi` | `yi` | Yi (01.AI) | Maɓallin API | [mahaɗi](https://01.ai) | Sami maɓallin API a platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | Maɓallin API, mai tarawa | [mahaɗi](https://yolo-auto.com) | Samun API kyauta yana da iyakar buƙatu kuma an tanade shi don gwaji; ba a wallafa ƙayyadadden adadin yau da kullum ba, kuma ba a yi alƙawarin cewa damar kyauta za ta ci gaba har abada ba. | +| `zai` | `zai` | Z.AI | Maɓallin API | [mahaɗi](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | Maɓallin API | [mahaɗi](https://zenmux.ai) | Yi amfani da maɓallin ZenMux API naka a cikin Authorization: Bearer . ZenMux yana da cikakkiyar jituwa da OpenAI. URL na asali: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | Maɓallin API, mai tarawa | [mahaɗi](https://www.zerolimitai.com) | Ana tallata gwajin kyauta na ɗan lokaci, amma shafukan hukuma sun saɓa wa juna tsakanin kwanaki 3 da 7; ba a ɗauki ikirarin kira 100/rana a matsayin na dindindin ba. | +| `zylo-api` | `zylo` | Zylo API | Maɓallin API, mai tarawa | [mahaɗi](https://zyloai.net) | Tsarin Basic: 10 RPM, buƙatu 7,200/rana da token 200,000/rana; an iyakance shi ga samfuran rubutu na Basic. | ## Masu Bayar da Sabis na Gida (14) diff --git a/docs/i18n/ha/docs/routing/REASONING_REPLAY.md b/docs/i18n/ha/docs/routing/REASONING_REPLAY.md index b700805a7dc1..bdb975a7a14f 100644 --- a/docs/i18n/ha/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/ha/docs/routing/REASONING_REPLAY.md @@ -19,25 +19,27 @@ Siga Ba Daidai Ba: Dole ne a mayar da reasoning_content na yanayin tunani zuwa g Amma abokan ciniki na yau da kullum (Cursor, Cline, Roo Code, OpenAI SDK) suna cire `reasoning_content` daga tarihin da suke sake aikawa. OmniRoute yana maido da shi daga ma'ajiyar wucin gadi ta gefen uwar garke domin buƙatar da sabis na sama yake gani ta kasance daidaitacciya. Batu #1628 ya gabatar da adanawar haɗin ƙwaƙwalwa/SQLite domin ma'ajiyar wucin gadi ta ci gaba da kasancewa bayan sake kunna tsarin. -## Tsarin Gini +## Tsarin Gine-gine ``` -Zagaye N (mataimaki yana samarwa): - → amsa tana ƙunshe da reasoning_content + tool_calls +Zagaye na N (mataimaki yana samarwa): + → amsa tana ɗauke da reasoning_content + tool_calls → idan requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() yana rubutawa (ƙwaƙwalwa + DB), tare da amfani da kowane tool_call.id a matsayin maɓalli - → aika amsar zuwa abokin ciniki (wanda zai iya riƙe tunanin ko kuma kada ya riƙe shi) + → aika amsa zuwa ga abokin ciniki (wanda zai iya ko ba zai iya riƙe reasoning ba) -Zagaye N+1 (abokin ciniki yana aika buƙatar ci gaba): +Zagaye na N+1 (abokin ciniki yana aika saƙon biyo baya): → mai fassara yana gano: requiresReasoningReplay(provider, model) === true - → ga kowane saƙon mataimaki mai tool_calls amma ba shi da reasoning_content: + → ga kowane saƙon mataimaki mai tool_calls kuma marar reasoning_content: lookupReasoning(toolCalls[0].id) → ƙwaƙwalwa → DB an samu → msg.reasoning_content = cached; recordReplay() ba a samu ba → msg.reasoning_content = "" (madadin tsohon tsari don tsofaffin nau'ikan DeepSeek) - → sabis na sama yana ganin daidaitaccen tarihi → babu 400 + → tsarin sama yana ganin daidaitaccen tarihi → babu 400 ``` -Ana ɗaukar bayanan a `open-sse/handlers/chatCore.ts` (wurare biyu, a wuraren kiran `cacheReasoningFromAssistantMessage` guda biyu). Ana sake amfani da su a `open-sse/translator/index.ts` bayan tilasta daidaiton tsarin bayanai amma kafin aikawa. +Ana yin kamawa a cikin `open-sse/handlers/chatCore.ts` (a wurare biyu, a wuraren kiran `cacheReasoningFromAssistantMessage` guda biyu). Ana yin sake kunnawa a cikin `open-sse/translator/index.ts` bayan tilasta daidaiton tsari amma kafin aikawa. + +Zagayen mataimaki na yau da kullum (marasa kiran kayan aiki) suna amfani da maɓalli ta wata hanya dabam: `buildAssistantMessageCacheKey()` yana samar da digest na iyakar zaman tare da rubutaccen tarihin tattaunawa na tsarin OpenAI da aka daidaita har zuwa wannan zagayen, saboda DeepSeek yana buƙatar reasoning na _kowane_ zagayen da ya gabata da zarar `tools` yana nan. Ga wuraren da Responses-API ke nufa (misali `opencode-go/deepseek-v4-flash`, wanda ake bi da shi zuwa `/responses`) jikin buƙatar da ake aikawa zuwa tsarin sama yana ɗauke da `input`, ba `messages` ba, don haka `translateRequest()` (`open-sse/translator/index.ts`) yana bayar da rahoton rubutaccen tarihin pivot da ya samar masa da digest ta hanyar zaɓin callback, sannan wuraren kamawa su samar da digest na wannan rubutaccen tarihin iri ɗaya. Matakin sake kunnawa na Responses yana gudana a kan pivot na OpenAI ga kowane tsarin tushe, don haka ana sake kunna abokan cinikin Anthropic Messages (Claude → OpenAI → Responses) su ma. ## Adanawa — Haɗin Ƙwaƙwalwa + SQLite diff --git a/docs/i18n/ha/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/ha/docs/security/SOCKET_DEV_FINDINGS.md index 6591f9754132..06f3202a9d34 100644 --- a/docs/i18n/ha/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/ha/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,22 @@ --- +> **Bayanin iyaka:** `socket.yml` yana saita binciken bayan-wallafa na ɓangaren registry na Socket.dev kan npm artifact (ignore-paths don abubuwan da ba a tura su tare da kunshin ba kamar `tests/`, `docs/`, da rahotannin build). Ba ya kafa wata CI/PR merge gate — babu workflow a cikin `.github/workflows`, babu script na `package.json`, kuma babu target na `Makefile` da ke kiran Socket.dev. + Wannan takarda ita ce shaidar da mai kula da aikin ya rubuta game da sakamakon bincike guda shida na -`AI-detected potential malware` da aka bayyana game da `omniroute@3.8.5` da kuma -matakan kariya da aka aiwatar a `omniroute@3.8.6`. An samar da ita ne domin: - -1. Masu gudanar da tsarin tsaro su sami tushe guda ɗaya da za su iya ambata lokacin da suke buƙatar - tantance sakamakon binciken bisa ainihin lambar tushe. -2. Na'urorin binciken AI na gaba su iya gano ikirarin da mai kula da aikin ya sanya wa hannu cewa kowace - hanyar da aka yi wa alama ganganci ce, sai an zaɓi amfani da ita, kuma an rubuta bayaninta. -3. Mu sami rubutaccen tarihin _dalilin da ya sa_ aka tsara kowane wurin kira yadda yake — - domin sake fasalin lamba a nan gaba kada ya sake shigar da wata alamar ganewa da - aka cire da gangan. - -Idan kuna gudanar da na'urar bincike da ta sake yi wa ɗaya daga cikin wuraren kiran da ke ƙasa alama bayan an -fitar da matakan kariya na v3.8.6, da fatan za ku buɗe batu tare da bayanan sawun binciken kuma +`AI-detected potential malware` da aka nuna a kan `omniroute@3.8.5`, da kuma +matakan rage haɗarin da aka aiwatar a cikin `omniroute@3.8.6`. An ƙirƙire ta domin: + +1. Masu gudanar da tsarin tsaro su sami madogara guda ɗaya da za su ambata lokacin da suke buƙatar + tantance sakamakon binciken bisa ainihin source. +2. Na’urorin binciken AI na gaba su iya gano ikirarin da mai kula da aikin ya sanya wa hannu cewa kowace + path da aka yi wa alama an yi ta ne da gangan, sai an zaɓi amfani da ita, kuma an rubuta bayaninta. +3. Mu kasance da rubutaccen tarihin _dalilin da ya sa_ aka tsara kowane call site ta wannan hanya — + domin kada wani refactor na gaba ya sake shigar da fingerprint da + aka cire da gangan bisa kuskure. + +Idan kuna gudanar da na’urar bincike wadda ta sake yi wa ɗaya daga cikin call sites da ke ƙasa alama bayan an +fitar da matakan rage haɗarin na v3.8.6, da fatan za ku buɗe issue tare da scan trace ɗin, kuma za mu faɗaɗa shaidar a nan. --- diff --git a/docs/i18n/he/README.md b/docs/i18n/he/README.md index dba9f4925826..a47b0301c9ec 100644 --- a/docs/i18n/he/README.md +++ b/docs/i18n/he/README.md @@ -23,13 +23,13 @@
-> צירוף ידני של מסלולים חינמיים הוא משימה מתישה — עשרות ערכות SDK, עשרות מגבלות קצב, ואין דרך לדעת כמה באמת עומד לרשותכם. OmniRoute מקטלגת **491 רשומות של מסלולים חינמיים המשתייכות ל-35 מפתחות מאגר מחזוריים** ומחשבת את נתון הטוקנים הראשי על סמך **17 המאגרים בעלי תקציב חודשי חיובי שפורסם, בתוספת חמש מכסות Groq נפרדות לכל מודל**, לאחר הסרת כפילויות לפי מאגר משותף. מכסות שנפתחות רק לאחר אימות זהות אזורי (נכון להיום: ModelScope) מוצגות בנפרד, +~6 מיליון לאחר אימות זהות אזורי, ולעולם אינן נכללות בנתון הראשי. התוצאה נשארת גלויה בלוח הבקרה (`/dashboard/free-tiers`). +> שילוב ידני של מסלולים חינמיים הוא משימה מתישה — עשרות ערכות SDK, עשרות מגבלות קצב, ואין שום דרך לדעת כמה באמת עומד לרשותכם. OmniRoute מקטלגת **489 רשומות של מסלולים חינמיים על פני 35 מפתחות מאגרים מתחדשים**, ומחשבת את נתון הטוקנים הראשי מתוך **17 המאגרים בעלי תקציב חודשי חיובי שפורסם, בתוספת חמש מכסות Groq נפרדות לכל מודל**, תוך מניעת ספירה כפולה לפי מאגר משותף. מכסות שנפתחות רק לאחר אימות זהות אזורי (כיום: ModelScope) מוצגות בנפרד, +~6M מאחורי אימות זהות אזורי, ולעולם אינן נכללות בנתון הראשי. התוצאה נשארת גלויה בלוח הבקרה (`/dashboard/free-tiers`). -כרטיס תקציב המסלולים החינמיים של OmniRoute: כ-1.62 מיליארד טוקנים חינמיים בחודש באופן קבוע, ועד כ-2.22 מיליארד בחודש הראשון עם נקודות זיכוי להרשמה, מתוך 35 מפתחות מאגר מחזוריים מתועדים המכסים 491 רשומות מקוטלגות של מסלולים חינמיים מאחורי נקודת קצה אחת. חישוב אמין לאחר הסרת כפילויות בין מאגרים — כל מאגר משותף נספר פעם אחת, לרבות 17 מאגרים מחזוריים בעלי תקציב טוקנים חודשי חיובי שפורסם, בתוספת חמש מכסות Groq נפרדות לכל מודל; 13 ספקים מסומנים כהמלצה להימנע בקטלוג סיכוני התנאים, כדי שאתם תחליטו. סרגל התקציב כולל Mistral עם מיליארד, Nara עם 210 מיליון, LLM7 עם 150 מיליון, xKiro עם 150 מיליון, Groq עם 30 מיליון (חמש מכסות נפרדות לכל מודל) ומאגרים קטנים יותר, וכן נקודות זיכוי להרשמה בחודש הראשון וספקים חינמיים לצמיתות ללא תקרת טוקנים, המוצגים בנפרד כדי שלעולם לא ינפחו את הנתון הראשי. נתוני שימוש ויתרה בזמן אמת ב-/dashboard/free-tiers. +כרטיס תקציב המסלול החינמי של OmniRoute: כ־1.62 מיליארד טוקנים חינמיים בחודש באופן שוטף, ועד כ־2.22 מיליארד בחודש הראשון עם קרדיטים להרשמה, מתוך 35 מפתחות מתועדים של מאגרים מתחדשים, המכסים 489 רשומות מסלול חינמי מקוטלגות מאחורי נקודת קצה אחת. חישוב אמין ללא ספירה כפולה של מאגרים — כל מאגר משותף נספר פעם אחת, כולל 17 מאגרים מתחדשים בעלי תקציב טוקנים חודשי חיובי שפורסם, בתוספת חמש מכסות Groq נפרדות לכל מודל; 13 ספקים מסומנים כהימנעות מומלצת בקטלוג סיכוני התנאים, כדי שאתם תחליטו. סרגל התקציב כולל Mistral 1B,‏ Nara 210M,‏ LLM7 150M,‏ xKiro 150M,‏ Groq 30M (חמש מכסות נפרדות לכל מודל) ומאגרים קטנים יותר, לצד קרדיטים להרשמה בחודש הראשון וספקים חינמיים לצמיתות ללא מגבלת טוקנים, המוצגים בנפרד כדי שלעולם לא ינפחו את הנתון הראשי. נתוני שימוש ויתרה בזמן אמת ב־/dashboard/free-tiers. -> סיכום מונפש של העמוד החי `/dashboard/free-tiers`. המתודולוגיה המלאה (הסרת כפילויות בין מאגרים, מדרגות נקודות זיכוי, תנאי ספקים): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> תקציר מונפש של העמוד החי `/dashboard/free-tiers`. המתודולוגיה המלאה (מניעת ספירה כפולה של מאגרים, רמות קרדיט, תנאי ספקים): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> הנתונים האלה נבדקים מחדש מדי שבועיים מול הקטלוג החי ו**משתנים בשני הכיוונים** — ספק מפסיק מסלול חינמי והמספר יורד; ספק חדש נוסף והמספר עולה. אנחנו מפרסמים את מה שהקטלוג מחשב בפועל, ולעולם לא תרחיש מיטבי שעוגל כלפי מעלה. +> הנתונים האלה נבדקים מחדש מדי שבועיים מול הקטלוג החי, ו**נעים בשני הכיוונים** — ספק מסיים מסלול חינמי והמספר יורד; ספק חדש מצטרף והמספר עולה. אנחנו מפרסמים את מה שהקטלוג מחשב בפועל, ולעולם לא תרחיש מיטבי שעוגל כלפי מעלה.
@@ -37,7 +37,7 @@

-⭐ סמנו את המאגר בכוכב אם OMNIROUTE עזרה לכם לחסוך כסף ולהקל על עבודתכם. +⭐ תנו כוכב למאגר אם OMNIROUTE עזר לכם לחסוך כסף ולהקל על העבודה שלכם.

@@ -50,8 +50,8 @@ **👋 עקבו אחר המתחזק — וקבלו ראשונים עדכונים על ספקים חדשים, גרסאות וטיפים:** -[![עקבו אחרי Diego ב-LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) -[![עקבו אחרי @diegosouzapw ב-GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) +[![עקבו אחר Diego ב־LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) +[![עקבו אחר @diegosouzapw ב־GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) @@ -590,9 +590,9 @@ Radar הוא שירות אופציונלי המבוסס על GET בלבד. לק
-## 🤖 ממשקי שורת פקודה וסוכני קידוד תואמים +## 🤖 ממשקי CLI וסוכני קידוד תואמים -> תצורה אחת — `http://localhost:20128/v1` — ו**כל** סביבת פיתוח או ממשק שורת פקודה מבוססי בינה מלאכותית פועלים עם מודלים חינמיים ובעלות נמוכה. +> תצורה אחת — `http://localhost:20128/v1` — ו**כל** סביבת פיתוח מבוססת AI או ממשק CLI פועלים עם מודלים חינמיים ובעלות נמוכה.
@@ -626,23 +626,23 @@ Radar הוא שירות אופציונלי המבוסס על GET בלבד. לק - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ פועל גם עם · Kiro · Command Code · Antigravity · Windsurf · AMP · כל כלי תואם OpenAI ++ פועל גם עם · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · כל כלי תואם OpenAI
-📖 הגדרה ייעודית לכל 36 הכלים (26 כלי קוד CLI ו־10 סוכני CLI) ← [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 תוסף OpenCode ← [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 הגדרה ייעודית לכל אחד מ־36 הכלים (26 כלי קוד CLI ו־10 סוכני CLI) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 תוסף OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

**הפעילו כל CLI נתמך דרך OmniRoute בפקודה אחת** — ללא כתיבת קובצי תצורה, -עם הזרקת פרטי גישה לכל תהליך וסביבת בית זמנית ומבודדת עבור Qwen/Gemini: +האישורים מוזרקים לכל תהליך, ו־Qwen/Gemini מקבלים תיקיית בית מבודדת וזמנית: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,13 +653,13 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# לחלופין, בחרו ספק ומודל באופן אינטראקטיבי וכתבו את התצורה של הכלי עצמו: +# לחלופין, בחרו ספק+מודל באופן אינטראקטיבי וכתבו את התצורה של הכלי עצמו: omniroute configure codex # גם: claude opencode qwen aider goose gemini cline continue kilo ``` כל פקודה מכבדת את ההקשר המרוחק הפעיל (`omniroute connect `), האפשרות `--dry-run` -מציגה תצוגה מקדימה של משתני הסביבה והארגומנטים המדויקים ללא ביצוע, ו־`--api-key-env NAME` מונעת מסודות -להופיע בהיסטוריית המעטפת שלכם. ← [שילובי CLI](docs/guides/CLI-INTEGRATIONS.md) +מציגה תצוגה מקדימה של משתני הסביבה/הארגומנטים המדויקים ללא ביצוע, והאפשרות `--api-key-env NAME` מונעת מסודות +להופיע בהיסטוריית המעטפת שלכם. → [שילובי CLI](docs/guides/CLI-INTEGRATIONS.md)
@@ -669,7 +669,7 @@ omniroute configure codex # גם: claude opencode qwen aider goose gemi -> **357 ספקים רשומים** באוספים הקנוניים של צ'אט, מדיה, חיפוש, הרצה מקומית, סוכני ענן ומערכת, כולל **152 עם מטא-נתוני גילוי מסוג `hasFree: true`**. מרשם מודלי הצ'אט כולל **229 ספקים / 2,554 צמדי ספק-מודל ייחודיים / 1,283 מזהי מודל גולמיים**; הקטלוג הנפרד של מכסות חינמיות כולל **491 רשומות לפי מודל**, **35 מאגרים מתחדשים** ו-**54 ספקים חינמיים לתמיד, עם מכסה מתחדשת או ללא צורך במפתח**. המכנים האלה שונים זה מזה במכוון; ההגדרות והחישובים לאחר הסרת כפילויות בין מאגרים נמצאים ב-[מידע על ספקים](docs/reference/PROVIDER_REFERENCE.md) וב-[מסלולים חינמיים](docs/reference/FREE_TIERS.md). +> **357 ספקים רשומים** באוספים הקנוניים של צ'אט, מדיה, חיפוש, הפעלה מקומית, סוכני ענן ומערכת, כולל **152 הנושאים מטא-נתוני גילוי מסוג `hasFree: true`**. מרשם מודלי הצ'אט מכסה **229 ספקים / 2,554 צמדי ספק-מודל ייחודיים / 1,283 מזהי מודל גולמיים**; קטלוג התקציבים החינמיים הנפרד כולל **491 רשומות לפי מודל**, **35 מאגרים מתחדשים** ו-**54 ספקים חינמיים לתמיד, מתחדשים או ללא צורך במפתח**. המכנים האלה שונים זה מזה במכוון; ההגדרות והחישובים לאחר הסרת כפילויות בין מאגרים נמצאים ב-[מידע על ספקים](docs/reference/PROVIDER_REFERENCE.md) וב-[מסלולים חינמיים](docs/reference/FREE_TIERS.md).
@@ -706,11 +706,11 @@ omniroute configure codex # גם: claude opencode qwen aider goose gemi
-### 🆓 חינם לתמיד — $0, ללא כרטיס +### 🆓 חינם לתמיד — $0, ללא כרטיס אשראי - + @@ -720,14 +720,14 @@ omniroute configure codex # גם: claude opencode qwen aider goose gemi - - - - + + + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
ללא מגבלת טוקנים
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
ללא הגבלת טוקנים
Kilo Code
Kilo Code
נתב אוטומטי, Tencent Hy3
חינם לתמיד
Requesty
Requesty
GPT-OSS 120B, Nemotron
חינם לתמיד
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
מסלול חינמי
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
חינם ללא הגבלה
Pollinations
Pollinations
GPT, Llama, Claude
אין צורך במפתח
Cloudflare AI
Cloudflare AI
יותר מ-50 מודלים
10K נוירונים ביום
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
כ-40 בקשות לדקה בחינם
Cerebras
Cerebras
GLM 4.7, GPT-OSS
מיליון טוקנים ביום
OpenRouter
OpenRouter
מודלים מסוג :free
+$10 ← יותר בקשות לדקה
Cloudflare AI
Cloudflare AI
50+ מודלים
10K נוירונים ליום
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
כ־40 RPM בחינם
Openference
Openference
Qwen3.8 27B, Llama 3.2
מסלול חינמי
OpenRouter
OpenRouter
מודלים מסוג :free
+$10 ← RPM גבוה יותר
-📖 הקטלוג המלא לקריאה על ידי מכונה ← [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 הקטלוג המלא לקריאה ממוחשבת ← [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1262,23 +1262,23 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע - - + + - - + + - + - - - - + + + + - +
שכבהטכנולוגיה
סביבת הרצהNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
שפהTypeScript 6.0 — 100% TypeScript בכל src/ ו-open-sse/ (ללא any בליבה מאז v2.0)
סביבת ריצהNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
שפהTypeScript 6.0 — 100% TypeScript בכל src/ ו-open-sse/ (אפס מופעים של any בליבה מאז v2.0)
מסגרת עבודהNext.js 16 + React 19 + Tailwind CSS 4
מסד נתוניםbetter-sqlite3 (SQLite, תיעוד ביומן WAL) + LowDB (מורשת JSON) — 122 מודולי תחום, 176 מיגרציות
זיכרוןחיפוש טקסט מלא באמצעות SQLite FTS5 + הטמעות וקטוריות מכוּמתות ל-int8, דעיכה מטיפוס מוגדר
מסד נתוניםbetter-sqlite3 (SQLite, רישום יומן WAL) + LowDB (מורשת JSON) — 122 מודולי תחום, 178 מיגרציות
זיכרוןחיפוש טקסט מלא באמצעות SQLite FTS5 + הטמעות וקטוריות מכומתות ל-int8, דעיכה מטיפוסית
סכמותZod 4 — אימות קלט/פלט של כלי MCP + חוזי API
פרוטוקוליםMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
הזרמהServer-Sent Events (SSE) + גשר WebSocket‏ (/v1/ws)
הזרמהServer-Sent Events (SSE) + גשר WebSocket (/v1/ws)
דחיסהצינור עיבוד בן 12 מנועים — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
אימות ואבטחהOAuth 2.0 (PKCE) + JWT + מפתחות API + אימות MCP מוגבל-היקף · AES-256-GCM לנתונים במנוחה · DOMPurify
הסוואהwreq-js — התחזות לטביעות אצבע TLS מסוג JA3 / JA4, פרוקסי תלת-שכבתי
עמידותמפסק מעגל, השהיה מעריכית, מניעת עומס מתפרץ, ריפוי עצמי אוטומטי משולב
רישוםpino — יומני JSON מובנים עם הקשר הבקשה
אימות ואבטחהOAuth 2.0 (PKCE) + JWT + מפתחות API + אימות MCP מבוסס היקף · AES-256-GCM במנוחה · DOMPurify
הסוואהwreq-js — התחזות לטביעות אצבע TLS מסוג JA3 / JA4, פרוקסי תלת-רמתי
עמידותמפסק זרם, השהיה מעריכית, מניעת עדר רועם, ריפוי עצמי אוטומטי משולב
רישום לוגיםpino — לוגים מובנים בפורמט JSON עם הקשר הבקשה
בדיקותמריץ הבדיקות של Node.js + Vitest — 39,000+ הצהרות בדיקה סטטיות על פני 5,100+ קובצי בדיקה במעקב (יחידה, אינטגרציה, E2E, אבטחה, מערכת אקולוגית)
פלטפורמותמחשב שולחני (Electron) · Android (Termux) · PWA (כל דפדפן)
CI/CDGitHub Actions — פרסום אוטומטי ל-npm ול-Docker Hub בעת הפצה
קישוריםאתר · npm · Docker Hub
קישוריםאתר אינטרנט · npm · Docker Hub
@@ -1293,12 +1293,12 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע - - - + + + - - + +
מסמךתיאור
מדריך למשתמשספקים, שילובים, אינטגרציית CLI, פריסה
מדריך התקנהשיטות התקנה מלאות, תצורות כלי CLI, הגדרת פרוטוקולים, כוונון זמני קצוב
מדריך כלי CLIהגדרה לכל כלי עבור Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
מדריך למשתמשספקים, שילובים, אינטגרציה עם CLI, פריסה
מדריך הגדרהשיטות התקנה מלאות, תצורות לכלי CLI, הגדרת פרוטוקולים, כוונון פסקי זמן
מדריך לכלי CLIהגדרה נפרדת לכל כלי עבור Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
מצב מרוחקשליטה ב-OmniRoute מרוחק (VPS) מה-CLI במחשב הנייד באמצעות אסימוני גישה מוגבלים בהיקפם
תצורת Claude Codeחיבור Claude Code אל OmniRoute (מקומי/מרוחק) באמצעות launch + פרופילים לכל מודל
התחלה מהירה3 שלבים: התקנה ← חיבור ← הגדרה
תצורת Claude Codeחיבור Claude Code אל OmniRoute (מקומי/מרוחק) באמצעות launch ופרופילים לכל מודל
התחלה מהירההתקנה ב-3 שלבים ← חיבור ← הגדרה
### 🔧 תפעול ופריסה @@ -1307,42 +1307,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע מסמךתיאור מדריך DockerDocker run, פרופילי Compose, ‏Caddy HTTPS, מנהרות, תגיות תמונה מדריך Podmanאינטגרציית Quadlet עם systemd, ‏podman-compose, ‏SELinux - פריסה ב-VMמדריך מלא: הגדרת VM + nginx + Cloudflare - פריסה ב-Fly.ioפריסה ב-Fly.io עם אחסון מתמשך + פריסה במכונה וירטואליתמדריך מלא: הגדרת VM + nginx + Cloudflare + פריסה ב-Fly.ioפריסה ב-Fly.io עם אחסון מתמיד מדריך Termuxהפעלת OmniRoute ב-Android באמצעות Termux - מדריך PWAהתקנת יישום רשת מתקדם, אחסון במטמון, ארכיטקטורה - מדריך הסרת התקנההסרה נקייה עבור כל שיטות ההתקנה - תצורת סביבהמשתני .env מלאים והפניות + מדריך PWAהתקנת יישום רשת מתקדם, שמירה במטמון, ארכיטקטורה + מדריך הסרההסרה נקייה עבור כל שיטות ההתקנה + תצורת סביבהכל משתני .env וההפניות ### 🧠 תכונות וארכיטקטורה - + - - + + - + - - - + + +
מסמךתיאור
ארכיטקטורהארכיטקטורת המערכת, זרימת נתונים ורכיבים פנימיים
ארכיטקטורהארכיטקטורת המערכת, זרימת הנתונים והרכיבים הפנימיים
מדריך דחיסהצינור עיבוד עם 7 אפשרויות: כבוי / קל / רגיל / אגרסיבי / אולטרה / RTK / מוערם
דחיסת RTKדחיסת פלט פקודות, מסננים, אמון, אימות, שחזור פלט גולמי
מנועי דחיסהCaveman, ‏RTK, צינורות עיבוד מוערמים, ממשקי לוח בקרה/API/MCP
תבנית כללי דחיסהסכמות חבילות כללים ב-JSON עבור מסנני Caveman ו-RTK
מנועי דחיסהCaveman, ‏RTK, צינורות עיבוד מוערמים, ממשקי לוח מחוונים/API/MCP
פורמט כללי דחיסהסכמות של חבילות כללים ב-JSON עבור מסנני Caveman ו-RTK
חבילות שפה לדחיסהזיהוי שפה ויצירת חבילות כללים עבור Caveman
מדריך עמידותמפסקים אוטומטיים, זמני צינון, תור, מניעת עומס המוני, התחזות TLS
מדריך עמידותמפסקי מעגל, זמני צינון, תור, מניעת עומס עדר מתפרץ, התחזות TLS
מנוע שילוב אוטומטיניקוד לפי 16 גורמים, חבילות מצבים, ריפוי עצמי
מדריך Proxyמערכת Proxy בת 3 רמות, זירת המסחר 1proxy, פעולות CRUD במרשם
רמות חינמיותספרייה מאוחדת: 35 מאגרים מחזוריים מתועדים / 491 רשומות מקוטלגות ברמה החינמית
גלריית תכונותסיור חזותי בלוח הבקרה עם צילומי מסך
תיעוד בסיס הקודהדרכה ידידותית למתחילים על בסיס הקוד
מסלולים חינמייםספרייה מאוחדת: 35 מאגרים מחזוריים מתועדים / 489 רשומות של מסלולים חינמיים בקטלוג
גלריית תכונותסיור חזותי בלוח המחוונים עם צילומי מסך
תיעוד בסיס הקודסיור בבסיס הקוד המותאם למתחילים
### 🤖 פרוטוקולים וממשקי API - + - + - +
מסמךתיאור
תיעוד APIכל נקודות הקצה עם דוגמאות
עזר APIכל נקודות הקצה עם דוגמאות
מפרט OpenAPIמפרט OpenAPI 3.0
שרת MCP110 כלי MCP, תצורות IDE, לקוחות Python/TS/Go
מדריך שרת MCPהתקנת MCP, תעבורות ותיעוד כלים
מדריך לשרת MCPהתקנת MCP, תעבורות ועזר כלים
שרת A2Aפרוטוקול JSON-RPC 2.0, מיומנויות, הזרמה, ניהול משימות
מדריך שרת A2Aכרטיס סוכן A2A, משימות, מיומנויות והזרמה
מדריך לשרת A2Aכרטיס סוכן A2A, משימות, מיומנויות והזרמה
### 📋 פרויקט ואיכות @@ -1350,10 +1350,10 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע - + - - + +
מסמךתיאור
תרומההגדרת סביבת הפיתוח והנחיות
מודל הסתעפות והפצהלאן מופנות בקשות משיכה (release/*), ומה משמעותם של main ותגיות
מודל הסתעפות והפצהלאן מכוונות בקשות משיכה (release/*), ומה משמעותם של main ותגיות
יומן שינוייםהיסטוריית הפצות מלאה לפי גרסה
מדיניות אבטחהדיווח על חולשות ונהלי אבטחה
מדריך i18nתמיכה ב-42 שפות, תהליך עבודה לתרגום, RTL
מדיניות אבטחהדיווח על פגיעויות ונוהלי אבטחה
מדריך i18nתמיכה ב-42 שפות, תהליך תרגום, RTL
רשימת תיוג להפצהשלבי אימות לפני הפצה
תוכנית כיסויאסטרטגיית כיסוי בדיקות עבור יותר מ-39,000 הצהרות בדיקה סטטיות ביותר מ-5,100 קובצי בדיקה במעקב
@@ -1364,12 +1364,12 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע # ⭐ התורמים המובילים -> OmniRoute מעוצב בידי קהילת קוד פתוח נלהבת. אנשים אלה תרמו תרומות יוצאות דופן המשפיעות ישירות על האיכות, היציבות והתפוצה של הפרויקט. **תודה לכם.** +> OmniRoute מעוצב בידי קהילת קוד פתוח חדורת תשוקה. אנשים אלה תרמו תרומות יוצאות דופן המשפיעות ישירות על האיכות, היציבות והתפוצה של הפרויקט. **תודה לכם.** ### תורמים חיצוניים לפי בקשות משיכה שמוזגו - + @@ -1393,7 +1393,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע
דירוגתורםבקשות משיכה שמוזגו~שורות ששונו
דירוגתורםבקשות משיכה שמוזגו~שורות שהשתנו
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-הנתונים הוקפאו בקצה הפעיל של release/v3.8.50, ‏dafb4ae808, עם מיזוגים עד 2026-08-24 05:26:03 UTC. המפקד המחולק לעמודים של GitHub GraphQL כולל 5,911 בקשות משיכה שמוזגו: 2,707 מאת בעלי המאגר, 179 מאת Dependabot, ו-3,025 בקשות משיכה חיצוניות מאת 535 תורמים שונים. „שורות ששונו” הוא סכום התוספות והמחיקות ב-GitHub וכולל קבצים שנוצרו אוטומטית, קובצי נעילה, קטלוגים, תרגומים ותיעוד; זהו היקף השינויים, לא מספר שורות הקוד שנכתבו. שוויונות בנקודת החיתוך נשמרים. +הנתונים הוקפאו בקצה הפעיל של release/v3.8.50, ב-dafb4ae808, עם מיזוגים עד 2026-08-24 05:26:03 UTC. המפקד המחולק לעמודים של GitHub GraphQL כולל 5,911 בקשות משיכה שמוזגו: 2,707 מאת בעלי המאגר, 179 מאת Dependabot, ו-3,025 בקשות משיכה חיצוניות מאת 535 תורמים שונים. „שורות שהשתנו” הן סכום התוספות והמחיקות ב-GitHub, וכוללות קבצים שנוצרו אוטומטית, קובצי נעילה, קטלוגים, תרגומים ותיעוד; זהו מדד לתחלופת קוד, לא למספר שורות הקוד שנכתבו. שוויונות בנקודת החיתוך נשמרו. ### ביצועי commit המיוחסים ב-GitHub @@ -1404,42 +1404,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע backryun
backryun
- 🥇 220 קומיטים המיוחסים לחשבונות GitHub + 🥇 220 קומיטים המיוחסים לחשבון GitHub Paijo
Paijo

- 🥈 219 קומיטים המיוחסים לחשבונות GitHub + 🥈 219 קומיטים המיוחסים לחשבון GitHub Randi
Randi

- 🥉 108 קומיטים המיוחסים לחשבונות GitHub + 🥉 108 קומיטים המיוחסים לחשבון GitHub Ravi Tharuma
Ravi Tharuma

- 🏅 81 קומיטים המיוחסים לחשבונות GitHub + 🏅 81 קומיטים המיוחסים לחשבון GitHub Chris
Chris

- 🏅 70 קומיטים המיוחסים לחשבונות GitHub + 🏅 70 קומיטים המיוחסים לחשבון GitHub Markus Hartung
Markus Hartung

- 🏅 69 קומיטים המיוחסים לחשבונות GitHub · תיקו במקום #6 + 🏅 69 קומיטים המיוחסים לחשבון GitHub · תיקו במקום ה-6 @@ -1448,42 +1448,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # גם CI=1 מדלג ע Dizzle
Dizzle
- 🏅 69 קומיטים המיוחסים לחשבונות GitHub · תיקו במקום #6 + 🏅 69 קומיטים המיוחסים לחשבון GitHub · תיקו במקום ה-6 Jan Leon
Jan Leon

- 🏅 64 קומיטים המיוחסים לחשבונות GitHub + 🏅 64 קומיטים המיוחסים לחשבון GitHub zenobit
zenobit

- 🏅 62 קומיטים המיוחסים לחשבונות GitHub + 🏅 62 קומיטים המיוחסים לחשבון GitHub Bob.Hou
Bob.Hou

- 🏅 51 קומיטים המיוחסים לחשבונות GitHub · תיקו במקום #10 + 🏅 51 קומיטים המיוחסים לחשבון GitHub · תיקו במקום ה-10 Xiangzhe
Xiangzhe

- 🏅 51 קומיטים המיוחסים לחשבונות GitHub · תיקו במקום #10 + 🏅 51 קומיטים המיוחסים לחשבון GitHub · תיקו במקום ה-10 -נבדק מחדש בתאריך 2026-08-24 06:14:31 UTC: קומיטים המיוחסים לחשבונות GitHub, כפי שדווחו על ידי API התורמים של המאגר עבור ענף ברירת המחדל release/v3.8.50. ה-API החזיר 525 זהויות (415 משתמשים, 2 בוטים, 108 אנונימיים); טבלה זו אינה כוללת את מתחזק הפרויקט, בוטים וזהויות אנונימיות, והיא משמרת מקרי תיקו בדירוג. היא נבדלת הן מדירוג בקשות המשיכה שמוזגו לעיל והן ממפקד מטא-נתוני ה-Git של 639 אנשים להלן. +נבדק מחדש ב-2026-08-24 06:14:31 UTC: קומיטים המיוחסים לחשבונות GitHub, כפי שדווחו על ידי Contributors API של המאגר עבור ענף ברירת המחדל release/v3.8.50. ה-API החזיר 525 זהויות (415 משתמשים, 2 בוטים, 108 אנונימיות); טבלה זו אינה כוללת את מתחזק הפרויקט, בוטים וזהויות אנונימיות, והיא משמרת תיקו בדירוג. היא נפרדת הן מדירוג בקשות המשיכה שמוזגו לעיל והן ממפקד מטא-נתוני Git של 639 אנשים להלן. -> 🙏 התכונות, תיקוני הבאגים והשיפורים בתשתית של תורמים אלה הם **חלק מרכזי** ממה שהופך את OmniRoute לאמין ולעשיר בתכונות. כל בקשת משיכה, כל מקרה בדיקה וכל קובץ תרגום i18n חשובים. קוד פתוח נבנה בידי אנשים כמותם. +> 🙏 התכונות, תיקוני הבאגים ושיפורי התשתית של תורמים אלה הם **חלק מרכזי** ממה שהופך את OmniRoute לאמין ולעשיר בתכונות. כל בקשת משיכה, כל מקרה בדיקה וכל קובץ תרגום i18n חשובים. קוד פתוח נבנה בידי אנשים כמותם.
diff --git a/docs/i18n/he/SECURITY.md b/docs/i18n/he/SECURITY.md index 790c61189c14..cd3583fd34ef 100644 --- a/docs/i18n/he/SECURITY.md +++ b/docs/i18n/he/SECURITY.md @@ -220,36 +220,38 @@ docker run -d \ 10. **ערכי זמן ריצה של `exec()` / `spawn()` באמצעות האפשרות `env`** — לעולם אין לשלב נתיבים חיצוניים או ערכים לא מהימנים במחרוזות של סקריפטים המועברים ל-shell. לעיון: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **יש להעדיף ספריות מאובטחות כברירת מחדל** — ראו [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults)‏ (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). יש להשתמש בהן לפני שמפתחים פתרון עצמאי. -## ממצאי סורקי שרשרת אספקה (Socket.dev / Snyk / כלים דומים) +## ממצאי סורק שרשרת האספקה (Socket.dev / Snyk / כלים דומים) -ארטיפקט ה-npm המפורסם `omniroute` כולל את ה-build של Next.js עם `output: "standalone"`, -כלומר כל מטפל בנתיב — לרבות יכולות מתועדות בעלות הרשאות מיוחדות -(MITM, ייבוא Zed, Cloud Sync, מפקח שירותים מובנה) — נכלל -במקטעים הממוזערים `.next/server/*.js`. סורקי שרשרת אספקה היוריסטיים -מתאימים לעיתים קרובות דפוסים במקטעים אלה לחתימות של נוזקות. +> **הערת תחולה:** הקובץ `socket.yml` בשורש המאגר מגדיר רק את `projectIgnorePaths` עבור הסריקה של Socket.dev בצד הרישום לאחר פרסום חבילת ה-npm שפורסמה — הוא אינו שער מיזוג CI/PR שנאכף. אף תהליך עבודה תחת `.github/workflows`, סקריפט ב-`package.json` או יעד `Makefile` אינו מפעיל את Socket.dev. + +חבילת ה-npm שפורסמה של `omniroute` כוללת את תוצר הבנייה של Next.js עם `output: "standalone"`, +כלומר כל מטפל בנתיב — לרבות יכולות מתועדות הדורשות הרשאות מיוחדות +(MITM, ייבוא Zed, ‏Cloud Sync ומפקח שירותים מוטמע) — מגיע בסופו של דבר +למקטעים ממוזערים תחת `.next/server/*.js`. סורקי שרשרת אספקה היוריסטיים +משווים לעיתים קרובות מקטעים אלה לדפוסים של חתימות נוזקה. תצורת הסורק שבה אנו משתמשים נמצאת בקובץ [`socket.yml`](socket.yml) בשורש המאגר (פורמט v2 של אפליקציית GitHub של Socket.dev — ראו ). היא מחריגה במפורש -ספריות שאינן מופצות (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +ספריות שאינן נכללות בחבילה המופצת (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` וכו׳), כך שהסורק מדווח רק על נתיבי קוד -שמגיעים בפועל למשתמשים בחבילה המפורסמת — הסריקה עצמה מופעלת כאשר אפליקציית -GitHub של Socket קוראת קובץ זה, ולא באמצעות תהליך עבודה במאגר הזה. +שמגיעים בפועל למשתמשי החבילה שפורסמה — הסריקה עצמה מופעלת על ידי אפליקציית +GitHub של Socket שקוראת קובץ זה, ולא על ידי תהליך עבודה במאגר זה. -עבור כל קטגוריית ממצאים אנו מתחזקים הצהרת מתחזק נפרדת לכל ממצא: +עבור כל קטגוריית ממצאים אנו מתחזקים הצהרת אימות נפרדת של המתחזקים לכל ממצא: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - מיפוי לפי ממצא: קובץ מקור ↔ מקטע שסומן ↔ התנהגות ↔ אמצעי צמצום - שיושם ב-v3.8.6. -- בלוקי `SECURITY-AUDITOR-NOTE:` בתוך קוד המקור, בכל פונקציה שסומנה, - מפנים חזרה לאותו מסמך. + מיפוי לכל ממצא: קובץ מקור ↔ מקטע שסומן ↔ התנהגות ↔ אמצעי מיתון + שהוחל ב-v3.8.6. +- בלוקים מסוג `SECURITY-AUDITOR-NOTE:` בקוד המקור, בכל פונקציה שסומנה, + מפנים לאותו מסמך. -למשתמשים שתהליך העיבוד שלהם אינו מאפשר להקל את ההתראה: בצעו build באמצעות +למשתמשים שתהליך ה-CI/CD שלהם אינו מאפשר להקל את ההתראה: בנו באמצעות `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. פעולה זו מחליפה את ארבעת -המודולים הרגישים בגדמים שמחזירים בזמן ריצה HTTP 503 עם `feature-disabled`, -כך שנתיבי הקוד בעלי ההרשאות המיוחדות נעדרים פיזית מהחבילה. +המודולים הרגישים במימושי דמה שמחזירים HTTP 503 עם `feature-disabled` +בזמן ריצה, כך שנתיבי הקוד הדורשים הרשאות מיוחדות נעדרים פיזית מהחבילה. ראו [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) -לקבלת מתכון הפרסום. +להוראות הפרסום. ## מקורות עזר diff --git a/docs/i18n/he/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/he/docs/architecture/CODEBASE_DOCUMENTATION.md index 436c3b4e2df9..c3d3092d2a01 100644 --- a/docs/i18n/he/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/he/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,8 @@ server/ ## 4. `open-sse/` — סביבת עבודה למנוע הזרמה -סביבת עבודה נפרדת של npm המתפרסמת בשם `@omniroute/open-sse`. אחראית על עיבוד -בקשות, מריצים, מתרגמים, שירותים, ממיר ושרת MCP. +סביבת עבודה נפרדת של npm, המפורסמת בשם `@omniroute/open-sse`. אחראית על עיבוד +בקשות, מריצים, מתרגמים, שירותים, ממיר הזרמים ושרת ה-MCP. ``` open-sse/ @@ -445,48 +445,48 @@ open-sse/ ├── package.json מניפסט סביבת העבודה ├── tsconfig.json ├── types.d.ts -├── config/ רישומי ספקים, פרופילי כותרות, זהות, … +├── config/ מאגרי ספקים, פרופילי כותרות, זהות, … ├── handlers/ מטפלי בקשות (צ'אט, הטמעות, שמע, תמונה, …) ├── executors/ 108 מריצי HTTP ייעודיים לספקים ├── translator/ המרת פורמטים (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ ממיר זרמים של Responses API ↔ Chat Completions -├── services/ יותר מ-80 מודולי שירות (שילובים, חלופה, מכסות, זהות, …) -├── utils/ כלי עזר להזרמה, לקוח TLS,‏ AWS SigV4, אחזור דרך פרוקסי, … -└── mcp-server/ שרת MCP (3 תעבורות, 33 תחומים, 110 כלים) +├── transformer/ ממיר הזרמה בין Responses API ל-Chat Completions +├── services/ יותר מ-80 מודולי שירות (שילובים, גיבוי, מכסות, זהות, …) +├── utils/ כלי עזר להזרמה, לקוח TLS, ‏AWS SigV4, אחזור דרך פרוקסי, … +└── mcp-server/ שרת MCP‏ (3 תעבורות, 33 תחומים, 110 כלים) ``` ### 4.1 `open-sse/handlers/` -| מטפל | מטרה | -| ----------------------- | --------------------------------------------------------------------- | -| `chatCore.ts` | צינור עיבוד הצ'אט הראשי (מטמון, הגבלת קצב, ניתוב שילובים, שיגור מריץ) | -| `responsesHandler.ts` | נקודת כניסה ל-OpenAI Responses API | -| `embeddings.ts` | הטמעות | -| `imageGeneration.ts` | יצירת תמונות | -| `audioSpeech.ts` | המרת טקסט לדיבור | -| `audioTranscription.ts` | המרת דיבור לטקסט | -| `videoGeneration.ts` | יצירת וידאו | -| `musicGeneration.ts` | יצירת מוזיקה | -| `rerank.ts` | דירוג מחדש | -| `moderations.ts` | סינון תוכן | -| `search.ts` | חיפוש באינטרנט | -| `sseParser.ts` | מנתח אירועי SSE | -| `usageExtractor.ts` | חילוץ ספירות טוקנים מזרמים במעלה הזרם | -| `responseSanitizer.ts` | הסרת רעש ייחודי לספק | -| `responseTranslator.ts` | שכבת חיבור בין תגובת הספק לשכבת התרגום | +| מטפל | מטרה | +| ----------------------- | ----------------------------------------------------------------------- | +| `chatCore.ts` | צינור עיבוד הצ'אט הראשי (מטמון, הגבלת קצב, ניתוב שילובים, שיגור מריצים) | +| `responsesHandler.ts` | נקודת כניסה ל-OpenAI Responses API | +| `embeddings.ts` | הטמעות | +| `imageGeneration.ts` | יצירת תמונות | +| `audioSpeech.ts` | טקסט לדיבור | +| `audioTranscription.ts` | דיבור לטקסט | +| `videoGeneration.ts` | יצירת וידאו | +| `musicGeneration.ts` | יצירת מוזיקה | +| `rerank.ts` | דירוג מחדש | +| `moderations.ts` | בקרת תוכן | +| `search.ts` | חיפוש באינטרנט | +| `sseParser.ts` | מנתח אירועי SSE | +| `usageExtractor.ts` | חילוץ ספירות טוקנים מזרמים במעלה הזרם | +| `responseSanitizer.ts` | הסרת רעש ייחודי לספק | +| `responseTranslator.ts` | שכבת חיבור בין תגובת הספק לשכבת התרגום | ### 4.2 `open-sse/executors/` -108 מריצי ספקים, שכל אחד מהם מרחיב את `BaseExecutor` (`base.ts`): +108 מריצים של ספקים, שכל אחד מהם יורש את `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, וכן `claudeIdentity.ts` -(כלי עזר משותף לזהות) ו-`index.ts` (רישום). +(כלי עזר משותף לזהות) ו-`index.ts` (מאגר). > הערה: ספקים שאינם מופיעים כאן מקבלים שירות באמצעות `default.ts`, המשתמש במריץ -> הגנרי התואם ל-OpenAI. קטלוג הספקים המלא (355 ספקים) נמצא ב- +> הכללי התואם ל-OpenAI. קטלוג הספקים המלא (355 ספקים) נמצא ב- > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` @@ -510,47 +510,47 @@ open-sse/ ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — ממיר מבוסס-`TransformStream` בין Responses API ל-Chat - Completions (משמש את נתיב ברירת המחדל `responses/`). +- `responsesTransformer.ts` — ממיר מבוסס `TransformStream` בין Responses API ל-Chat + Completions (בשימוש נתיב ברירת המחדל הכולל של `responses/`). ### 4.5 `open-sse/services/` רכיבים בולטים (הרשימה המלאה נמצאת תחת `open-sse/services/`): -| נושא | קבצים | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| ניתוב Combo | `combo.ts` (19 אסטרטגיות), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| מנוע Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| עמידות | `accountFallback.ts` (תקופת צינון + נעילה), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| מכסות | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| אחסון במטמון | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| מודיעין ניתוב | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| טיפול במודלים | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| דחיסה | `compression/` — חיווט מלא של מנוע הדחיסה | -| אסימון + הפעלה | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| רמה / מניפסט | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / רשת | `ipFilter.ts`, `webSearchFallback.ts` | -| אצוות | `batchProcessor.ts` | -| שימוש | `usage.ts` | +| תחום | קבצים | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ניתוב משולב | `combo.ts` (19 אסטרטגיות), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| מנוע שילוב אוטומטי | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| עמידות | `accountFallback.ts` (תקופת צינון + נעילה), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| מכסות | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| שמירה במטמון | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| חוכמת ניתוב | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| טיפול במודלים | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| דחיסה | `compression/` — חיווט מלא של מנוע הדחיסה | +| אסימון + הפעלה | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| רמה / מניפסט | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / רשת | `ipFilter.ts`, `webSearchFallback.ts` | +| אצוות | `batchProcessor.ts` | +| שימוש | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 כלים ייחודיים** מחווטים ב-`server.ts` (45 כלים קנוניים ב-`schemas/tools.ts` + - מודולים של זיכרון, מיומנויות, מיומנויות GitHub, מאגר, משחוק, תוספים, Notion, Obsidian, +- **110 כלים ייחודיים** מחווטים ב-`server.ts` (45 קנוניים ב-`schemas/tools.ts` + + מודולים של זיכרון, מיומנויות, מיומנויות GitHub, מאגר, גיימיפיקציה, תוספים, Notion, Obsidian, קורפוס מקומי ודחיסה — האיחוד נספר באמצעות `countUniqueMcpTools`). -- **3 תעבורות**: stdio, ‏HTTP Streamable, ‏SSE. -- **33 היקפי הרשאה** נאכפים בזמן ריצה — רשימת הבסיס נמצאת ב-`src/shared/constants/mcpScopes.ts`, והקבוצה המלאה היא איחוד היקפי ההרשאה המוצהרים בכל מודול כלים. -- טבלת ביקורת: `mcp_tool_audit` (מאוכלסת על ידי `audit.ts`). +- **3 תעבורות**: stdio,‏ HTTP Streamable,‏ SSE. +- **33 היקפים** נאכפים בזמן ריצה — רשימת הבסיס נמצאת ב-`src/shared/constants/mcpScopes.ts`, והקבוצה המלאה היא איחוד ההיקפים המוצהרים בידי כל מודול כלים. +- טבלת ביקורת: `mcp_tool_audit` (מאוכלסת בידי `audit.ts`). - קבצים: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, וכן בדיקות תחת `__tests__/`. -- לקטלוג הכלים המלא ראו [MCP-SERVER.md](../frameworks/MCP-SERVER.md). +- לקטלוג הכלים המלא, ראו [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### 4.7 `open-sse/config/` -מאגרי ספקים (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), מאגרי מודלים לפי פורמט (`audioRegistry.ts`, +מרשמי ספקים (`providerRegistry.ts`, `providerModels.ts`, +`providerHeaderProfiles.ts`), מרשמי מודלים לפי פורמט (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), כלי עזר לזהות (`codexIdentity.ts`, `codexInstructions.ts`, @@ -656,7 +656,7 @@ bin/ ## 8. `scripts/` -מאורגנת ב-6 תיקיות משנה לפי מטרה. +מאורגנת ב-6 תיקיות משנה לפי ייעוד. - **`scripts/build/`** — `build-next-isolated.mjs`, `prepublish.ts`, `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, diff --git a/docs/i18n/he/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/he/docs/architecture/RESILIENCE_GUIDE.md index 5c894be0b615..2b4a7e3db24c 100644 --- a/docs/i18n/he/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/he/docs/architecture/RESILIENCE_GUIDE.md @@ -67,96 +67,157 @@ `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. הגנת רגרסיה: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. צינון חיבור +## 2. תקופת צינון לחיבור **תחולה:** חיבור/חשבון/מפתח יחיד של ספק. -**מטרה:** לדלג על מפתח בעייתי אחד, בזמן שחיבורים אחרים של אותו ספק ממשיכים לשרת בקשות. +**מטרה:** לדלג על מפתח בעייתי אחד, בעוד שחיבורים אחרים של אותו ספק ממשיכים לשרת בקשות. **מימוש:** - סימון כלא זמין: `src/sse/services/auth.ts::markAccountUnavailable()` - בחירה: `getProviderCredentials*` באותו קובץ -- חישוב הצינון: `open-sse/services/accountFallback.ts::checkFallbackError()` +- חישוב תקופת הצינון: `open-sse/services/accountFallback.ts::checkFallbackError()` - הגדרות: `src/lib/resilience/settings.ts` **שדות לכל חיבור:** -- `rateLimitedUntil` — חותמת זמן שעד אליה נמשך הצינון +- `rateLimitedUntil` — חותמת זמן שעד אליה תקופת הצינון נמשכת - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — מונה השהיה מעריכית -**זמני צינון כברירת מחדל:** +**תקופות צינון כברירת מחדל:** - בסיס OAuth:‏ 5 שניות - בסיס מפתח API:‏ 3 שניות -- מפתח API עם 429: מעדיף כותרות `Retry-After`/איפוס מהשירות שבמעלה הזרם/טקסט איפוס שניתן לנתח +- מפתח API עם 429: מעדיף כותרות `Retry-After`/איפוס משירות המקור או טקסט איפוס שניתן לפענוח - השהיה: `baseCooldownMs * 2 ** failureIndex` -**הגנה מפני עדר רועם:** מונעת מכשלים מקבילים להאריך יתר על המידה את הצינון או להגדיל פעמיים את `backoffLevel`. +**הגנה מפני עדר רועם:** מונעת מכשלים מקביליים להאריך יתר על המידה את תקופת הצינון או להגדיל את `backoffLevel` פעמיים. -**מצבים סופיים (אינם זמני צינון):** +**מצבים סופיים (אינם תקופות צינון):** -- `banned` — מוגדר בעקבות זיהוי מילת מפתח של חסימה / חסימת חשבון (ראו [BAN_DETECTION](../security/BAN_DETECTION.md)), וכן בעקבות שלושה סירובים רצופים מהשירות שבמעלה הזרם ברמת הבקשה (`request_rejected`, לדוגמה Anthropic OAuth 403‏ "הבקשה אינה מותרת" — `open-sse/services/requestRejectedStreak.ts`); סירוב יחיד רק מעביר את החיבור לצינון -- `expired` (עובר למצב סופי לאחר מספר ניסיונות חוזרים מוגבל — `EXPIRED_RETRY_MAX = 3` עם השהיה מעריכית — כדי ששגיאות OAuth זמניות יוכלו להיפתר מעצמן לפני שהחשבון מושבת לצמיתות) +- `banned` — מוגדר בעקבות זיהוי מילת מפתח של חסימה / חסימת חשבון (ראו [BAN_DETECTION](../security/BAN_DETECTION.md)), וכן בעקבות שלושה סירובים רצופים משירות המקור לכל בקשה (`request_rejected`, לדוגמה Anthropic OAuth 403 "הבקשה אינה מורשית" — `open-sse/services/requestRejectedStreak.ts`); סירוב יחיד רק מעביר את החיבור לתקופת צינון +- `expired` (עובר למצב סופי לאחר מספר מוגבל של ניסיונות חוזרים — `EXPIRED_RETRY_MAX = 3` עם השהיה מעריכית — כדי ששגיאות OAuth זמניות יוכלו להיפתר מעצמן לפני שהחשבון מושבת לצמיתות) - `credits_exhausted` -מצבים אלה נשמרים עד שפרטי הגישה משתנים או שמפעיל מאפס אותם. אין לדרוס מצבים סופיים במצב צינון זמני. +מצבים אלה נשמרים עד שפרטי ההזדהות משתנים או שמפעיל מאפס אותם. אין לדרוס מצבים סופיים במצב צינון זמני. -**התאוששות עצלה:** לאחר שהמועד `rateLimitedUntil` חלף, החיבור חוזר להיות כשיר. לאחר שימוש מוצלח, `clearAccountError()` מנקה את כל שדות השגיאה. +**התאוששות עצלה:** לאחר ש-`rateLimitedUntil` חלף, החיבור נעשה כשיר שוב. לאחר שימוש מוצלח, `clearAccountError()` מנקה את כל שדות השגיאה. -### זיקה להפעלה (#7274) +### מחסום השימוש של Claude OAuth: נתיב בעדיפות נמוכה יותר + איפוס מגבלת הפעלה -**תחולה:** הפעלת לקוח אחת (כותרת `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) המוצמדת לחיבור אחד, עבור **כל** ספק. +**תחולה:** חיבור מנוי Claude‏ (OAuth) יחיד. שתי התכונות הן **בהצטרפות מפורשת לכל +חיבור** (עריכת חיבור → מקטע Claude →‏ `lowPriorityMode` / `autoLimitReset` בתוך +`providerSpecificData`, שתיהן כבויות כברירת מחדל) ומשקפות את הפקודות `/low-priority` ו- +`/limit-reset` של Claude Code (חוזה התקשורת תועד מ-Claude Code 2.1.263). -**מטרה:** להשאיר סוכן מרובה-תורות (Claude Code,‏ aider, סוכנים מותאמים אישית) באותו חשבון לאורך בקשות, ובכך להפחית אובדן הקשר בין חשבונות ושגיאות 429 חוזרות של אתחול קר אצל ספקים בעלי מצב הפעלה ברמת החשבון. +**מימוש:** + +- מכונת מצבים + סיווג תגובות: `open-sse/services/claudeLowPriority.ts` +- לקוח סטטוס/מימוש איפוס: `open-sse/services/claudeLimitReset.ts` +- נקודת חיבור למבצע (הזרקת כותרת + ניסיון חוזר באותו חשבון): `open-sse/executors/base.ts::execute()` +- שמירת ההצטרפות המפורשת: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**גורם מפעיל:** מחסום השימוש של 5 שעות — תגובת `429` שהכותרות שלה מכילות +`anthropic-ratelimit-unified-status: rejected`, וכאשר החשבון כשיר, +`anthropic-ratelimit-unified-slow-offer: treatment`. דבר אינו נשלח לפני תגובת ה-429 +הראשונה של המחסום; תגובת 429 עקב פרץ ללא כותרות מאוחדות עוברת במסלול הצינון הרגיל. + +**נתיב בעדיפות נמוכה יותר** (`lowPriorityMode`): + +- בעת תגובת ה-429 של המחסום, המבצע מקבל את ההצעה ומנסה מיד שוב עם **אותו** + חשבון ועם `anthropic-usage-limit: slow`; הנתיב נשאר פעיל עד למועד + `anthropic-ratelimit-unified-reset` שהוכרז (+60 שניות חסד), וכל בקשה בחלון זמן זה כוללת + את הכותרת. תגובת ה-429 שיורטה לעולם אינה מגיעה אל `handleChatCore`, ולכן החיבור + **אינו** מועבר לתקופת צינון ואינו מוחלף. +- `anthropic-ratelimit-unified-slow-status` בתגובות מאוחרות יותר: `active` / `not_needed` + משאירים את הנתיב פעיל; `slot_busy`‏ (429) או `529` ממתינים למשך הזמן שצוין ב- + `anthropic-ratelimit-unified-slow-retry-after` של השרת (ברירת מחדל 20 שניות, הגבלה + ל-5–600 שניות, ריצוד של ±30%) ומנסים שוב, בכפוף ל- + `anthropic-ratelimit-unified-slow-max-wait` (ברירת מחדל 20 דקות, הגבלה + לדקה אחת–6 שעות) — לאחר מכן הנתיב מסתיים ותקופת המתנה של 10 דקות חוסמת קבלה מחדש. זמן + ההמתנה מוגבל בנוסף לזמן שנותר עד לתפוגת הזמן של תחילת הפנייה לשירות המקור עבור הבקשה + עצמה (`resolveFetchStartTimeout`, ברירת מחדל 10 דקות), פחות מרווח של 5 שניות: ללא מגבלה זו, + זמן ההמתנה המרבי של 20 דקות כברירת מחדל היה נמשך מעבר לחיי הבקשה, והשינה הייתה מתבטלת + באמצע ההמתנה, תוך חשיפת `TimeoutError` במקום סיום תקין מסוג `max_wait` + תקופת המתנה. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, התחלפות חלון 5 השעות, או + `ineligible` +‏ `anthropic-ratelimit-unified-overage-in-use: true` (שמסיימים אותו בתור + `extra_usage` בכל סטטוס, מכיוון ששימוש עודף בתשלום מכסה כעת את המחסום) מסיימים את הנתיב; + לאחר מכן התגובה עוברת למסלול הצינון הרגיל. `budget_exhausted` נשמר בזיכרון עד + למועד איפוס התקציב שהוכרז (≤ 8 ימים). +- בדיקת המחסום מתבצעת לאחר הניסיונות החוזרים בתוך אותו ניסיון של המבצע, שמופעלים בעקבות 400 (עריכת + הקשר, הגבלות חשיבה/מאמץ, למידה אוטומטית של פרמטרים), כך שתגובת 429 של המחסום שמופיעה רק באחד + מהניסיונות החוזרים האלה עדיין מיורטת במקום להגיע למסלול הצינון. +- המצב נשמר בזיכרון לכל חיבור (הפעלה מחדש גורמת לתגובת 429 נוספת אחת של המחסום לצורך קבלה מחדש). + +**איפוס מגבלת הפעלה** (`autoLimitReset`, מתבצע לפני הנתיב כאשר שניהם מופעלים): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` ← מקטע `juniper_tide`; + כאשר `arm: "reset"` וגם `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` עם + `{ "program": "juniper_tide" }` (מזהה UUID של הארגון מתוך + `providerSpecificData.organizationUUID`, עם חלופת אתחול). +- `result: reset|not_limited` ← הבקשה נשלחת שוב במהירות מלאה (ללא כותרת האטה). + `already_used` / `not_offered` שומרים בזיכרון את `next_available_at` (ברירת מחדל שבוע אחד); + כל כשל מפעיל השהיה של 15 דקות. האיפוס מתבצע פעם בשבוע ועדיין נספר במסגרת המגבלה + השבועית. + +בדיקות למניעת רגרסיה: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. + +### שיוך הפעלה (#7274) + +**תחולה:** הפעלת לקוח אחת (כותרת `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) שמוצמדת לחיבור אחד, עבור **כל** ספק. + +**מטרה:** להשאיר סוכן מרובה-תורות (Claude Code, aider, סוכנים מותאמים אישית) באותו חשבון בין בקשות, כדי לצמצם אובדן הקשר במעבר בין חשבונות ושגיאות 429 חוזרות בעת התחלה קרה אצל ספקים בעלי מצב הפעלה נפרד לכל חשבון. **מימוש:** -- קביעת TTL:‏ `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- קביעת TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - בחירה/יצירה של הצמדה: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - חילוץ כותרות (כללי, לכל ספק): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- טבלת הצמדות מתמשכת: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- הגדרה: `sessionAffinityTtlMs` (‏TTL גלובלי באלפיות שנייה, `0` משבית) — `src/lib/db/settings.ts`. שמה שונה מ-`codexSessionAffinityTtlMs`, שהיה מוגבל ל-Codex בלבד, באמצעות המיגרציה `124_generic_session_affinity_ttl.sql`, שמעבירה כל TTL של Codex שהוגדר קודם לכן כברירת המחדל החדשה. +- טבלת הצמדות מתמידה: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- הגדרה: `sessionAffinityTtlMs` (TTL גלובלי באלפיות שנייה, `0` משבית) — `src/lib/db/settings.ts`. שמה שונה מההגדרה `codexSessionAffinityTtlMs`, שהייתה ייחודית ל-Codex, באמצעות המיגרציה `124_generic_session_affinity_ttl.sql`, שמעבירה כל TTL של Codex שהוגדר בעבר כברירת המחדל החדשה. -לפני #7274, הפונקציה `resolveSessionAffinityTtlMs()` החזירה מייד `0` עבור כל ספק שאינו `codex`, ולכן להגדרת ה-TTL (ולכותרות ההפעלה) לא הייתה השפעה במקומות אחרים, אף שמנגנון ההצמדה וחילוץ הכותרות כבר היו בלתי תלויים בספק. התיקון הסיר את ההחזרה המוקדמת הזו; כעת ה-TTL חל באופן אחיד על כל ספק לאחר שהוא מוגדר גלובלית לערך הגדול מ-`0`. +לפני #7274, הפונקציה `resolveSessionAffinityTtlMs()` החזירה מיד `0` עבור כל ספק מלבד `codex`, ולכן להגדרת ה-TTL (ולכותרות ההפעלה) לא הייתה כל השפעה בשום מקום אחר, אף שמנגנון ההצמדה וחילוץ הכותרות כבר היו בלתי תלויים בספק. התיקון הסיר את ההחזרה המוקדמת הזאת; כעת ה-TTL חל באופן אחיד על כל ספק לאחר שהוא מוגדר גלובלית לערך גדול מ-`0`. -שלוש כותרות הזיקה להפעלה לעולם אינן מועברות לשירות שבמעלה הזרם — רכיבי ההפעלה בונים את כותרות השירות שבמעלה הזרם בעצמם במקום להעביר את כותרות הלקוח, ולכן מזהה זה נותר מזהה מתאם פנימי בלבד. +שלוש כותרות זיקת ההפעלה לעולם אינן מועברות במעלה הזרם — רכיבי ההרצה בונים את כותרות הבקשה שלהם למעלה הזרם מאפס, במקום להעביר את כותרות הלקוח כפי שהן, כך שהן נשארות מזהה מתאם פנימי בלבד. -### חכירוֹת חיבור בלעדיות להפעלה מנוהלת +### חכירוֹת בלעדיות של חיבורי הפעלה מנוהלים -**תחולה:** לקוח/הפעלת HTTP מנוהלים ופעילים יחידים מחזיקים בחיבור OmniRoute כשיר אחד. +**תחולה:** לקוח HTTP/הפעלה מנוהל פעיל אחד מחזיק בחיבור OmniRoute כשיר אחד. -**מטרה:** לספק בעלות בלעדית ומתמשכת על חיבור עבור לקוחות הזקוקים לגידור ניתוב קשיח -בין בקשות. מנגנון זה שונה מזיקה להפעלה, שהיא העדפה רכה להמשכיות: +**מטרה:** לספק בעלות בלעדית ומתמידה על חיבור עבור לקוחות הזקוקים לגבול ניתוב קשיח +בין בקשות. הדבר שונה מזיקת הפעלה, שהיא העדפת המשכיות רכה: חכירה בלעדית שומרת את מצב מחזור החיים ב-SQLite, אוכפת ייחודיות גלובלית של בעלים פעילים ושל -חיבור פעיל, ודוחה דור מיושן לפני העברת הבקשה לספק. +חיבורים פעילים, ודוחה דור מיושן לפני השילוח לספק. -היכולת מופעלת לפי בחירה עבור כל מפתח API. מפתח מנוהל חייב לכלול את ההיקף `lease:exclusive` וכן -רשימת `allowedConnections` מפורשת שאינה ריקה. כל לקוח HTTP יכול להשתמש בנקודת הקצה של מחזור החיים; לא -נדרשים שם לקוח, סוכן משתמש, ספק, שיטת OAuth או מודל. החכירה מחזיקה בחיבור, -ולא במודל, ולכן שינוי מודל משמר את השיוך כל עוד החיבור נותר כשיר -כרגיל. כללי המודל, המכסה, התקינות, הצינון ורשימת ההרשאות הרגילים ממשיכים להיות הקובעים ועשויים +התכונה מופעלת באופן יזום לכל מפתח API בנפרד. מפתח מנוהל חייב לכלול את ההרשאה `lease:exclusive` +ורשימת `allowedConnections` מפורשת שאינה ריקה. כל לקוח HTTP יכול להשתמש בנקודת הקצה של מחזור החיים; לא +נדרשים שם לקוח, user-agent, ספק, שיטת OAuth או מודל. החכירה מחזיקה בחיבור, +לא במודל, ולכן שינוי מודל משמר את הקישור כל עוד החיבור נשאר כשיר +באופן רגיל. כללי המודל, המכסה, התקינות, תקופת הצינון ורשימת ההרשאות הרגילים נשארים סמכותיים ועשויים להעביר את אותו דור לחיבור כשיר ופנוי אחר. -מחזור החיים הוא `POST /api/v1/session-leases` עם פעולות JSON‏ `acquire`,‏ `renew` ו-`release`. -בקשות הסקה מנוהלות מציגות את הערך האטום `X-OmniRoute-Lease-Owner` ואת -`X-OmniRoute-Lease-Generation` המדויק. הבעלים משתמש ב-`vlo_` ואחריו 43 תווי base64url; רק -גיבוב ה-SHA-256 שלו נשמר. כל גידור שיגור סופי מקשר גם את מזהה מפתח ה-API המאומת ואת -מזהה החיבור הפעיל. כותרות בקרת החכירה מוסרות מיומנים, מתמונות מצב שמורות של בקשות ומכותרות -רכיב ההפעלה של השירות שבמעלה הזרם. +מחזור החיים הוא `POST /api/v1/session-leases` עם פעולות JSON מסוג `acquire`, `renew` ו-`release`. +בקשות הסקה מנוהלות מציגות את הערך האטום `X-OmniRoute-Lease-Owner` ואת הערך המדויק +`X-OmniRoute-Lease-Generation`. הבעלים משתמש בקידומת `vlo_` ואחריה 43 תווי base64url; רק +גיבוב ה-SHA-256 שלו נשמר. כל מחסום שילוח סופי קושר גם את מזהה מפתח ה-API המאומת ואת +מזהה החיבור הפעיל. כותרות הבקרה של החכירה מוסרות מיומנים, מתצלומי בקשות שמורים ומכותרות +רכיבי ההרצה במעלה הזרם. -אם לניתוב הרגיל יש מועמדים מנוהלים כשירים, אך כל מועמד פנוי תפוס בידי -חכירה פעילה זרה, OmniRoute מחזיר HTTP‏ `429`, קוד של קיבולת חכירה לא זמינה, -מצב המתנה לקיבולת ו-`Retry-After` מוגבל שנגזר ממועד התפוגה הרלוונטי המוקדם ביותר. -מצב רגיל שבו אין חיבורים כשירים אינו תחרות על חכירה, והוא שומר על סמנטיקת שגיאת הניתוב הקיימת שלו. +אם לניתוב הרגיל יש מועמדים מנוהלים כשירים, אך כל מועמד פנוי מוחזק בידי +חכירה פעילה זרה, OmniRoute מחזיר HTTP `429`, את הקוד lease-capacity-unavailable, +מצב המתנה לקיבולת ו-`Retry-After` מוגבל הנגזר ממועד התפוגה הרלוונטי המוקדם ביותר. +מצב רגיל שבו אין מועמדים כשירים אינו התנגשות חכירות ושומר על סמנטיקת שגיאות הניתוב הקיימת שלו. -מנגנונים קשורים נותרים נפרדים: +מנגנונים קשורים נשארים נפרדים: -- תפוסת הפעלת OAuth היא חלוקה רכה, מקומית לתהליך, עבור חשבונות OAuth. -- סמפורים של חשבון מעניקים היתרי מקביליות לבקשות ומסתיימים עם השלמת הבקשה. -- חכירוֹת חיבור בלעדיות להפעלה מנוהלת הן בעלות מתמשכת לאורך מחזור החיים, עם גידור דור. +- תפוסת הפעלות OAuth היא חלוקה רכה מקומית לתהליך עבור חשבונות OAuth. +- סמפורים של חשבונות מעניקים היתרי מקביליות לבקשות ומסתיימים עם השלמת בקשה. +- חכירוֹת בלעדיות של הפעלות מנוהלות הן בעלות מתמידה לאורך מחזור החיים, עם מחסום דור. --- @@ -289,45 +350,70 @@ _מציג_ נעילות פעילות) — הכרטיס החדש _מגדיר את ## 5. בקרת קבלה לתור הבקשות (v3.8.49 · סוגיה #6593) -**תחולה**: תור מגבלת הקצב המקומי לכל ספק+חיבור -(`open-sse/services/rateLimitManager.ts`, המבוסס על Bottleneck), שכבה אחת -מתחת לשלושת המנגנונים שלעיל. - -**`maxWaitMs` הוא שם ישן שנשמר לצורך תפוגת ביצוע.** -הערך `resilienceSettings.requestQueue.maxWaitMs` מועבר ל־Bottleneck בתור -`expiration` של משימה, והטיימר שלו מתחיל רק לאחר הניתוב. לכן הוא מגביל את -זמן הביצוע המנוהל בידי מגביל הקצב, ולא את הזמן שהבקשה מבלה בתור המקומי. -תפוגה מוצגת בתור `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` מקומי ומהימן -(HTTP 504); שם הקוד הקודם של פסק הזמן בתור מתקבל רק לצורך תאימות לאחור -פנימית ומהימנה. ברירת המחדל היא 15000ms; ניתן לדרוס אותה באמצעות -`RATE_LIMIT_MAX_WAIT_MS` (משתנה סביבה) או בלוח הבקרה (**הגדרות → עמידות**, -תקרת ממשק משתמש של 1–30000ms). למשך השהייה בתור אין מגבלת זמן; השתמשו -ב־`maxQueueDepth` שלהלן כדי להגביל את מספר הפונים הממתינים בתור. - -**`maxQueueDepth` — מגבלת קבלה אופציונלית (חדש).** -`resilienceSettings.requestQueue.maxQueueDepth` מגביל את מספר הבקשות שיכולות -להמתין בתור (וטרם נותבו) עבור צמד ספק+חיבור אחד בו־זמנית. כאשר התור כבר -מכיל `maxQueueDepth` בקשות, בקשה חדשה נדחית במהירות עם שגיאה מטיפוס +**תחום**: תור הגבלת הקצב המקומי לכל ספק+חיבור (`open-sse/services/rateLimitManager.ts`, +המבוסס על Bottleneck), שכבה אחת מתחת לשלושת המנגנונים שלעיל. + +**`maxWaitMs` מגביל את ההמתנה בתור; `executionMaxWaitMs` מגביל את הביצוע.** +השניים נפרדים בכוונה, ואף אחד מהם אינו מזין את האחר. + +`resilienceSettings.requestQueue.maxWaitMs` הוא **תקציב ההמתנה בתור**: הוא +מכסה את ההמתנה למשבצת אצל הספק ולאחר מכן את השהייה במצב QUEUED, והטיימר שלו +מתאפס ברגע שהמשימה עוזבת את QUEUED ומתחילה להתבצע +(`rateLimitManager.ts`, `wrappedFn`). בקשה שחורגת ממנו לעולם אינה מגיעה +לשירות במעלה הזרם. ברירת המחדל היא 30000ms, המסופקת על ידי +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` בתוך `src/lib/resilience/settings.ts` ומעוגנת על ידי +`tests/unit/ratelimit-admission-control-6593.test.ts`, כך ששינוי בה יהפוך +את הבדיקה הזו לאדומה במקום להשאיר את הפסקה הזו מיושנת מבלי שיובחן בכך. + +`resilienceSettings.requestQueue.executionMaxWaitMs` הוא הערך ש-Bottleneck +מקבל בתור `expiration` של המשימה, שהטיימר שלו מתחיל רק לאחר השיגור. הוא משמש +כרשת ביטחון למבצעים שאין להם זמן קצוב משלהם לבקשה במעלה הזרם, והוא +מוגדל לזמן הקצוב של המבצע עצמו מתחילת ה-fetch כאשר זה ארוך יותר, כך שהוא +לא יוכל לקטוע תגובה תקינה שנמצאת בעיצומה. ברירת המחדל היא 600000ms (10 דקות). + +הזנת תקציב התור אל `expiration` היא מה שבעבר חיסל שערים לא-אינקרמנטליים +באמצע הביצוע — באופן לגיטימי הם פועלים במשך דקות לפני הבתים הראשונים — +ולכן תפוגה נחשפת בתור `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), בעוד שתקציב התור נושא את +קוד הזמן הקצוב של התור. ניתן לעקוף כל אחד מהם באמצעות `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (משתנה סביבה) או דרך לוח הבקרה +(**הגדרות ← שרידות**). בעת הנרמול, שניהם מוגבלים לטווח 1ms–24h. + +**סדר הקדימויות, עבור שניהם:** משתנה הסביבה מספק רק את _ברירת המחדל_. ערך +שנשמר תחת `resilienceSettings.requestQueue` (לוח בקרה / תיקון API, המאוחסן +ב-`key_value`) גובר עליו, וערך `rateLimitOverrides.maxWaitMs` / +`.executionMaxWaitMs` לכל חיבור גובר גם עליו. לכן, הגדרת משתנה הסביבה +בפריסה שכבר יש בה ערך שמור אינה משנה דבר — במקום זאת, יש למחוק או לעדכן +את ההגדרה השמורה. + +השהייה בתור מוגבלת על ידי `maxWaitMs`; המשתנה `maxQueueDepth` שלהלן מגביל את +מספר הפונים שיכולים להמתין בתור בו-זמנית. + +**`maxQueueDepth` — מגבלת קבלה אופציונלית (חדש).** `resilienceSettings.requestQueue.maxQueueDepth` +מגביל את מספר הבקשות שיכולות להמתין בתור (ועדיין לא שוגרו) עבור צירוף אחד +של ספק+חיבור בו-זמנית. כאשר התור כבר מכיל `maxQueueDepth` +בקשות, בקשה חדשה נדחית מיד עם שגיאה בעלת טיפוס `code: "RATE_LIMIT_QUEUE_FULL"` **לפני** שהיא מגיעה אי פעם אל `limiter.schedule()` -— כך שהדחייה זולה ומתרחשת לפני כל עבודת דחיסת פרומפט / תרגום בהמשך הזרימה -עבור אותה בקשה. ברירת המחדל `0` = מושבת, תוך שימור ההתנהגות הקיימת של תור -ללא מגבלה; הטווח המותר הוא 0–100000. ניתן לדרוס באמצעות -`RATE_LIMIT_MAX_QUEUE_DEPTH` (משתנה סביבה) או +— כך שהדחייה זולה ומתרחשת לפני כל עבודת דחיסת פרומפטים / תרגום בהמשך +עבור אותה בקשה. ברירת המחדל `0` = מושבת, וכך נשמרת התנהגות התור הקיימת ללא הגבלה; +הטווח המוגבל הוא 0–100000. ניתן לעקוף באמצעות `RATE_LIMIT_MAX_QUEUE_DEPTH` (משתנה סביבה) או `resilienceSettings.requestQueue.maxQueueDepth` (תיקון דרך לוח הבקרה/API). בדיקת הקבלה עצמה היא פונקציה טהורה (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), כך שניתן לבדוק אותה בבדיקת יחידה ללא מגביל Bottleneck אמיתי. -> ה־RFC שפתח את #6593 הציע גם דגל `bypassCompressionOnRateLimit`. -> צינור העיבוד `open-sse/services/compression/` במאגר זה מבצע דחיסת -> פרומפט/הקשר בבקשת ה־LLM היוצאת (`chatCore.ts`, סביב הבלוק -> `resolveCompressionSettings`/`selectCompressionStrategy`), ולא דחיסת תגובת -> HTTP עבור גופי 429 שנוצרו — אין נתיב קוד תואם לדגל עקיפה מילולי. שלב דחיסת -> הפרומפט הזה גם פועל כיום _לפני_ `withRateLimit()` בצינור עיבוד הבקשה, ולכן -> שינוי הסדר כדי לדלג עליו במקרה של דחייה עקב תור מלא הוא שינוי נפרד ורחב -> יותר מתחום הסוגיה הזו; הוא **לא** מומש כאן במכוון ונותר כהמשך אפשרי, אם -> החיסכון במשאבי CPU יצדיק את הסיכון הכרוך בשינוי הסדר. +> ה-RFC שפתח את #6593 הציע גם דגל `bypassCompressionOnRateLimit`. +> צינור העיבוד `open-sse/services/compression/` של מאגר זה מבצע +> דחיסת פרומפט/הקשר בבקשת ה-LLM היוצאת (`chatCore.ts`, +> סביב בלוק `resolveCompressionSettings`/`selectCompressionStrategy`), +> ולא דחיסת תגובת HTTP עבור גופי 429 מסונתזים — אין +> נתיב קוד תואם לדגל עקיפה מילולי. שלב דחיסת הפרומפט הזה +> פועל כעת גם _לפני_ `withRateLimit()` בצינור עיבוד הבקשות, ולכן +> שינוי הסדר כדי לדלג עליו בעת דחייה בשל תור מלא הוא שינוי נפרד וגדול יותר +> מתחום הסוגיה הזו; הוא **לא** מומש כאן במכוון +> ונותר כמשימת המשך, אם החיסכון במשאבי CPU מצדיק את +> הסיכון שבשינוי הסדר. --- diff --git a/docs/i18n/he/docs/architecture/admission-lanes.md b/docs/i18n/he/docs/architecture/admission-lanes.md index 7f48df3fbf7e..f6d161c5d3c2 100644 --- a/docs/i18n/he/docs/architecture/admission-lanes.md +++ b/docs/i18n/he/docs/architecture/admission-lanes.md @@ -7,48 +7,52 @@ ל-OmniRoute יש **שתי** מערכות מסלולים מקומיות לתהליך, בעלות תחומי תחולה שונים. הן משלימות זו את זו; על המפעילים לדעת באיזו מהן הם מתבוננים. -## 1. בקרת כניסה כלל־תהליכית ברמת הבתים (`chatBodyAdmission.ts`) - -- **תחום תחולה:** נתיב גוף־הבקשה המאוחסן במטמון/ערימה עבור `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` ושאר הנתיבים בעלי מבנה צ'אט. מגן - מפני הגברת השימוש בערימה עקב גופי בקשה גדולים של סוכני קידוד (#4380). -- **בקר גלובלי יחיד לכל תהליך, ולא מסלולים נפרדים לכל מפתח (#10110).** כל מפתח API - (מגובב) או הפעלה מסוג `anonymous` מתקבלים כנגד **אותו** תקציב משותף — - מזהה ההפעלה המגובב משמש **אך ורק** כמפתח לתזמון הוגן (שיגור בשיטת סבב +## 1. בקרת קבלה כלל־תהליכית ברמת בתים (`chatBodyAdmission.ts`) + +- **תחום:** נתיב גוף הבקשה המאוחסן במטמון/ערימה עבור `POST /v1/chat/completions`, + ‏`/v1/messages`, ‏`/v1/responses` ונתיבים נוספים בעלי מבנה של צ'אט. מגן + מפני הגברת צריכת הערימה עקב גופים גדולים של סוכני קידוד (#4380). +- **בקר גלובלי יחיד לכל התהליך, לא נתיבים נפרדים לכל מפתח (#10110).** כל מפתח API + (לאחר גיבוב) או הפעלת `anonymous` מתקבלים כנגד **אותה** מכסה משותפת — + מזהה ההפעלה המגובב משמש **רק** כמפתח תזמון הוגן (שיגור בסבב בין הממתינים), ולעולם לא כפלח קיבולת. גרסה קודמת של מסמך זה - תיארה מסלולים נפרדים לכל מפתח עם קיבולת עצמאית; מודל זה - הוסר ב-#10110 משום שהוא אפשר לפרטי הזדהות מזויפים ולא מאומתים - להכפיל את המגבלה הכלל־תהליכית. -- **שער (#503-fanout): תקציב בתים לקליטה הנגזר אוטומטית, ולא מספר קבוע של + תיארה נתיבים נפרדים לכל מפתח, עם קיבולת עצמאית; מודל זה + הוסר ב-#10110 משום שאפשר לפרטי הזדהות מזויפים ולא מאומתים להכפיל + את המגבלה הכלל־תהליכית. +- **שער (#503-fanout): מכסת קליטת בתים הנגזרת אוטומטית, ולא מספר קבוע של בקשות.** מגבלת מספר הבקשות הישנה `CHAT_MAX_HEAVY_IN_FLIGHT` (ברירת המחדל הייתה `1` - לפני תיקון זה) צמצמה פיצול עומס של סוכני קידוד (מספר סוכני משנה/ממשקי שורת פקודה, - עם גופים הגדולים באופן שגרתי מ-256 KB) למקביליות אפקטיבית של כ-1, דבר שגרם - לתגובות 503 בעומס רגיל לחלוטין. כעת היא מחייבת רק כאשר מפעיל מגדיר במפורש - את `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. כאשר היא אינה מוגדרת, בקרת הכניסה - נשלטת במקום זאת באמצעות `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — תקציב הנגזר אוטומטית - מתקרת הזיכרון האמיתית של התהליך (`src/shared/middleware/admissionBudget.ts`): - 25% מהערך המחמיר יותר מבין מגבלת הערימה של V8 לבין כל מגבלת cgroup/קונטיינר, - מחולקים במקדם הגברה זמנית של 8x, ומוגבלים לטווח שבין 8 MiB לבין - 2 GiB. דריסות מפורשות משתמשות באותן מגבלות. התקציב מתאים את עצמו - מקונטיינר של 512 MB ועד למחשב שולחני עם 32 GB, ללא כוונון של משתני סביבה. גוף בקשה שאינו - יכול להיכלל בתקציב האפקטיבי נכשל מיד עם `413 body_exceeds_budget`; - רק תחרות בין גופי בקשה שכל אחד מהם ניתן לטיפול בנפרד נכנסת לתור ההוגנות - המוגבל. עוקב חי אחר לחץ משאבים המבוסס על אותות מרובים (יחס ערימת V8, - ‏cgroup, ‏PSI, אירועי OOM — `open-sse/utils/resourcePressurePolicy.ts`) מקצר + לפני תיקון זה) צמצמה את ההסתעפות של סוכני קידוד (מספר תת־סוכנים/ממשקי CLI, + עם גופים שגודלם בדרך כלל מעל 256 KB) למקביליות אפקטיבית של כ-1, דבר שגרם + לשגיאות 503 תחת עומס רגיל לחלוטין. כעת היא מגבילה רק כאשר מפעיל מגדיר במפורש + את `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. כאשר היא אינה מוגדרת, הקבלה נשלטת במקום זאת + באמצעות `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — מכסה הנגזרת אוטומטית מתקרת + הזיכרון האמיתית של התהליך (`src/shared/middleware/admissionBudget.ts`): + ‏25% מהנמוכה מבין מגבלת ערימת V8 לבין מגבלת cgroup/קונטיינר כלשהי, + בחלוקה למקדם הגברה זמנית של פי 8, ובתחום שבין 8 MiB לבין + 2 GiB. דריסות מפורשות משתמשות באותם גבולות. כך היא מתאימה את עצמה + מקונטיינר של 512 MB ועד למחשב שולחני עם 32 GB, ללא כוונון משתני סביבה. גוף שאינו יכול + להיכלל במכסה האפקטיבית נכשל מיד עם `413 body_exceeds_budget`; + רק תחרות בין גופים שכל אחד מהם ניתן לטיפול נכנסת לתור ההוגנות + המוגבל. מנגנון חי למעקב אחר לחץ משאבים המבוסס על מספר אותות (יחס ערימת V8, + ‏cgroup, ‏PSI, אירועי OOM — ‏`open-sse/utils/resourcePressurePolicy.ts`) מקצר את ההמתנה המוגבלת תחת לחץ `high`, ומשיל עומס מיד עם - `503 resource_pressure` תחת לחץ `critical`, עוד לפני שנקלט בית כלשהו. + `503 resource_pressure` תחת לחץ `critical`, עוד לפני קליטת בתים + כלשהם. PSI נקרא מתוך `memory.pressure` של ה-cgroup של יחידה זו, כאשר הוא קיים + (`open-sse/utils/resourcePressureSampler.ts`); ‏`/proc/pressure/memory` חל + על כל המארח ומשמש רק כחלופה במערכת פיזית / cgroup v1, כך שמארח + המבצע החלפה לזיכרון משני אינו יכול לגרום לשגיאת 503 בקונטיינר שאינו פעיל. - **כוונון:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — דריסה של תקציב הבתים הנגזר אוטומטית - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — מגבלת מספר בקשות ישנה, בהצטרפות יזומה בלבד + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — דריסה של מכסת הבתים הנגזרת אוטומטית + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — מגבלה ישנה של מספר בקשות, בהצטרפות מפורשת בלבד - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — זמן המתנה בתור לפני 503 (ברירת מחדל 2000) - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — שסתום ערימה לבתים שבתור (ברירת מחדל 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — הוצאו משימוש - ואינם מבצעים פעולה מאז #10110 (מתקבלים לצורך תאימות תצורה, אך המערכת מתעלמת מהם) -- **דיווח:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — כולל - התוספות של #503-fanout:‏ `inflightBytes`,‏ `maxInflightBytes`,‏ `budgetSource` - (`v8_heap` | `cgroup` | `override`),‏ `pressureSeverity` ו-`countCapEnabled` - (`false` בפריסה המוגדרת כברירת מחדל — מאשר שתקציב הבתים, ולא מגבלת - המספר הישנה, הוא שמגביל בפועל). + ואינם מבצעים דבר מאז #10110 (מתקבלים לצורך תאימות תצורה, אך המערכת מתעלמת מהם) +- **דוחות:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — כולל + התוספות של #503-fanout: ‏`inflightBytes`, ‏`maxInflightBytes`, ‏`budgetSource` + (`v8_heap` | `cgroup` | `override`), ‏`pressureSeverity` ו-`countCapEnabled` + (ערכו false בפריסת ברירת מחדל — מאשר שמכסת הבתים, ולא מגבלת + הספירה הישנה, היא זו שמגבילה בפועל). ## 2. נתיבים וירטואליים אדפטיביים בזמן ריצה (`open-sse/services/admission`) diff --git a/docs/i18n/he/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/he/docs/frameworks/EMBEDDED-SERVICES.md index 3c2a0ee08cc9..087e369ff95e 100644 --- a/docs/i18n/he/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/he/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,11 +5,11 @@ --- > **גרסה:** v3.8.44 -> **עודכן לאחרונה:** 2026-07-03 -> **קהל יעד:** מהנדסים שמוסיפים, מתחזקים או מנפים שגיאות בשירותים מוטמעים (9Router, CLIProxyAPI, Mux, Bifrost). +> **עדכון אחרון:** 2026-09-09 +> **קהל יעד:** מהנדסים שמוסיפים, מתחזקים או מנפים שגיאות בשירותים מוטמעים (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -שירותים מוטמעים הם כלי עזר מקומיים לתהליכים, שאותם OmniRoute מתקין, מפקח עליהם -וחושף כיעדי ניתוב מהשורה הראשונה. בניגוד לספקים חיצוניים (שהגישה אליהם מתבצעת דרך האינטרנט +שירותים מוטמעים הם כלי עזר מקומיים מבוססי תהליכים, שאותם OmniRoute מתקין, מפקח עליהם +וחושף כיעדי ניתוב מן המניין. בניגוד לספקים חיצוניים (שהגישה אליהם מתבצעת דרך האינטרנט באמצעות מפתחות API), שירותים מוטמעים פועלים באותו מחשב שבו פועל OmniRoute ומתקשרים דרך ממשק הלולאה החוזרת. --- @@ -29,35 +29,36 @@ ## 1. סקירה כללית -### מדוע שירותים מוטמעים? +### למה שירותים מוטמעים? -חמישה שירותים מוטמעים: +שישה שירותים מוטמעים: -| שירות | חבילת npm | פורט ברירת מחדל | מטרה | -| --------------- | ----------------------------------------- | :-------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | נתב AI ש-OmniRoute יכול להשתמש בו כספק-משנה. המודלים נחשפים בתבנית `9router/{sub}/{model}` | -| **CLIProxyAPI** | קובץ בינארי מ-GitHub release (`cliproxy`) | 8317 | מתאם Proxy מקומי לתהליכי אימות של Anthropic CLI. מספק ניתוב חלופי כאשר אסימוני OAuth פגים | -| **Mux** | `mux` (`mux server` ללא ממשק גרפי) | 8322 | דמון מקומי לתזמור סוכנים (coder/mux). מנוהל רק ברמת מחזור החיים — אינו יעד ניתוב (ללא תיווך LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | שירות ממסר אחורי של שער AI הכתוב ב-Go. כשהוא פועל, הוא נבחר אוטומטית על ידי נתיב הממסר (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Proxy למינוי Claude — חלופה/גיבוי ל-CLIProxyAPI עבור תעבורה במבנה Claude-Code; המפתח המוזרק הופך ל-`DARIO_ADMIN_TOKEN`, המגביל את הגישה למישור בקרת ה-OAuth שלו ב-`/admin/*` | +| שירות | חבילת npm | פורט ברירת מחדל | מטרה | +| --------------- | ------------------------------------- | :-------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | נתב AI שבו OmniRoute יכול להשתמש כספק משנה. המודלים נחשפים בתבנית `9router/{sub}/{model}` | +| **CLIProxyAPI** | קובץ בינארי מגרסת GitHub (`cliproxy`) | 8317 | מתאם פרוקסי מקומי לתהליכי אימות של Anthropic CLI. מספק ניתוב חלופי כאשר פג תוקפם של אסימוני OAuth | +| **Mux** | `mux` (`mux server` ללא ממשק גרפי) | 8322 | דמון מקומי לתזמור סוכנים (coder/mux). מנוהל רק מבחינת מחזור החיים — אינו יעד לניתוב (ללא תיווך LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | מנוע אחורי לממסר שער AI שנכתב ב-Go. בזמן שהוא פועל, הוא נבחר אוטומטית על ידי נתיב הממסר (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | פרוקסי למינוי Claude — חלופה/גיבוי ל-CLIProxyAPI עבור תעבורה במבנה Claude Code; המפתח המוזרק הופך ל-`DARIO_ADMIN_TOKEN` ומגביל את הגישה למישור הבקרה של OAuth תחת `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | אוטומציה של WhatsApp Web (Chromium ללא ממשק גרפי באמצעות Puppeteer). מנוהל רק מבחינת מחזור החיים — אינו יעד לניתוב. | -כל חמשת השירותים פועלים לפי אותו מודל פיקוח: +כל ששת השירותים פועלים לפי אותו מודל פיקוח: -- OmniRoute מתקין אותם תחת `DATA_DIR/services/{name}/` (בבידוד מה-`package.json` של OmniRoute עצמו) -- OmniRoute מפעיל ומנטר אותם כתהליכי-בן -- OmniRoute מזריק מפתח API ארעי לסביבת תהליך-הבן ומחליף אותו ללא השבתה (כאשר הדבר ישים) -- כל נתיבי הניהול (`/api/services/*`) הם **LOCAL_ONLY** — נגישים רק מממשק הלולאה החוזרת (כלל קשיח מס' 17) +- OmniRoute מתקין אותם תחת `DATA_DIR/services/{name}/` (בנפרד מקובץ ה-`package.json` של OmniRoute) +- OmniRoute מפעיל ומנטר אותם כתהליכי צאצא +- OmniRoute מזריק מפתח API זמני לסביבת תהליך הצאצא ומחליף אותו ללא זמן השבתה (כאשר הדבר רלוונטי) +- כל נתיבי הניהול (`/api/services/*`) הם **LOCAL_ONLY** — נגישים רק מ-loopback (כלל קשיח מס' 17) ### החלטות מרכזיות (מתוכנית התכנון) -| החלטה | ערך | -| --------------------------------------------- | --------------------------------------------------------------------- | -| גישת לוח הבקרה לממשק המשתמש המקורי של 9Router | Proxy הפוך ב-`/dashboard/providers/services/9router/embed/*` | -| מנגנון ההתקנה | `npm install {package}` באמצעות `execFile` (ללא אינטרפולציית מעטפת) | -| אופן השימוש | הספק נרשם בתבנית `9router/{sub}/{model}` במנוע הניתוב | -| ניהול מפתחות API | OmniRoute יוצר, מצפין באחסון (AES-256-GCM) ומזריק באמצעות משתני סביבה | -| מיקום בלוח הבקרה | `/dashboard/providers/services` (שלוש לשוניות) | -| הפעלה אוטומטית | מתג נפרד לכל שירות, כבוי כברירת מחדל | +| החלטה | ערך | +| ----------------------------------------- | --------------------------------------------------------------------- | +| גישת לוח המחוונים לממשק המקורי של 9Router | פרוקסי הפוך ב-`/dashboard/providers/services/9router/embed/*` | +| מנגנון התקנה | `npm install {package}` באמצעות `execFile` (ללא אינטרפולציה של מעטפת) | +| מצב צריכה | הספק נרשם בתבנית `9router/{sub}/{model}` במנוע הניתוב | +| ניהול מפתחות API | OmniRoute יוצר, מצפין במנוחה (AES-256-GCM) ומזריק באמצעות משתני סביבה | +| מיקום בלוח המחוונים | `/dashboard/providers/services` (שלוש לשוניות) | +| הפעלה אוטומטית | מתג עבור כל שירות, כבוי כברירת מחדל | --- @@ -76,9 +77,9 @@ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ │ ServiceLogsPanel, ApiKeyCard, ... │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP‏ (fetch של Next.js) + │ HTTP ‏(fetch של Next.js) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ שכבה 2 — API‏ (LOCAL_ONLY — ממשק loopback בלבד) │ +│ שכבה 2 — API ‏(LOCAL_ONLY — לולאה מקומית בלבד) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -87,52 +88,52 @@ │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (פרוקסי HTTP הפוך + WebSocket‏ → שרת 9Router במעלה הזרם) │ +│ (פרוקסי HTTP הפוך + WebSocket → שירות 9Router במעלה הזרם) │ │ │ │ שער: LOCAL_ONLY_API_PREFIXES כולל את "/api/services/" ואת │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ קריאות בתוך התהליך ┌──────────────────────▼─────────────────────────────────────────────┐ -│ שכבה 3 — ServiceSupervisor‏ (src/lib/services/) │ +│ שכבה 3 — ServiceSupervisor ‏(src/lib/services/) │ │ │ -│ ServiceSupervisor.ts מנהל שירות כללי (child_process.spawn) │ +│ ServiceSupervisor.ts מפקח כללי (child_process.spawn) │ │ ├── התקנה: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── הפעלה: spawn(node, [entrypoint], {env, cwd}) │ │ ├── מפתח API: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── פורט: 20130 עבור 9Router (ניתן להגדרה) │ -│ ├── יומנים: מאגר טבעתי של stdio בנפח 5 MB → אירועי SSE │ -│ ├── תקינות: HTTP GET /health כל 2–5 שניות, התאוששות עצלה │ -│ └── מחזור חיים: SIGTERM‏ 15 שניות → SIGKILL │ +│ ├── יומנים: מאגר טבעתי של stdio בנפח 5 MB → אירועי SSE │ +│ ├── תקינות: HTTP GET /health כל 2–5 שניות, התאוששות עצלה │ +│ └── מחזור חיים: SIGTERM ‏15 שניות → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts מאתחל את כל SERVICES[] בעת הפעלת התהליך │ +│ bootstrap.ts מאתחל את כל SERVICES[] עם הפעלת התהליך │ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts GET /v1/models תקופתי → טבלת service_models │ +│ modelSync.ts GET /v1/models תקופתי → טבלת service_models │ │ ringBuffer.ts מאגר יומנים מעגלי (5 MB לכל שירות) │ -│ healthCheck.ts בדיקת תקינות HTTP באמצעות תשאול │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ healthCheck.ts בדיקת תקינות HTTP בתשאול │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (מתאמי התקנה) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ HTTP תואם OpenAI‏ (loopback) + │ HTTP תואם OpenAI (לולאה מקומית) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ שכבה 4 — ספק / ניתוב │ +│ שכבה 4 — ספק / ניתוב │ │ │ │ open-sse/executors/ninerouter.ts │ -│ מאחזר מחדש את הפורט ואת מפתח ה-API בכל בקשה (ללא מטמון). │ -│ מסיר את הקידומת "9router/" ממזהה המודל לפני העברה דרך הפרוקסי. │ -│ מחזיר 503 service_not_running אם המנהל אינו במצב "running". │ +│ מאתר מחדש את הפורט ואת מפתח ה-API בכל בקשה (ללא מטמון). │ +│ מסיר את התחילית "9router/" ממזהה המודל לפני ההעברה בפרוקסי. │ +│ מחזיר 503 service_not_running אם המפקח אינו במצב "running". │ │ │ │ src/shared/constants/providers.ts │ │ רשומה עבור "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ המודלים מאוחסנים בתור "9router/{sub}/{model}" (עם קידומת). │ +│ המודלים מאוחסנים בתור "9router/{sub}/{model}" (עם תחילית). │ │ מסונכרנים כל 5 דקות באמצעות modelSync.ts. │ │ │ -│ Mux מנוהל מבחינת מחזור החיים בלבד (שכבות 1-3) — זהו daemon │ -│ לתזמור סוכנים, ולא פרוקסי LLM, ולכן אין לו executor/ספק בשכבה 4 │ -│ והוא לעולם אינו יעד לניתוב. │ +│ Mux מנוהל מבחינת מחזור החיים בלבד (שכבות 1–3) — זהו daemon │ +│ לתזמור סוכנים, לא פרוקסי LLM, ולכן אין לו רשומת מבצע/ספק בשכבה 4 │ +│ והוא לעולם אינו יעד ניתוב. │ └────────────────────────────────────────────────────────────────────┘ ``` @@ -140,19 +141,20 @@ | קובץ | תפקיד | | ------------------------------------------- | ------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | מחלקת ליבה: מחזור חיים, נעילה, תקינות, חוצץ טבעתי | +| `src/lib/services/ServiceSupervisor.ts` | מחלקת ליבה: מחזור חיים, נעילה, תקינות, מאגר מעגלי | | `src/lib/services/bootstrap.ts` | רישום ברמת התהליך והפעלה אוטומטית | -| `src/lib/services/registry.ts` | מפת יחידן `tool → supervisor` | -| `src/lib/services/apiKey.ts` | יצירת מפתחות, הצפנת AES-256-GCM במנוחה | +| `src/lib/services/registry.ts` | מפת יחידון `tool → supervisor` | +| `src/lib/services/apiKey.ts` | יצירת מפתחות, הצפנת AES-256-GCM במצב מנוחה | | `src/lib/services/modelSync.ts` | סנכרון מודלים תקופתי (5 דקות) + לפי דרישה | -| `src/lib/services/ringBuffer.ts` | חוצץ יומן מעגלי בנפח 5 MB עם הרשמת SSE | +| `src/lib/services/ringBuffer.ts` | מאגר יומנים מעגלי בנפח 5 MB עם הרשמה ל-SSE | | `src/lib/services/healthCheck.ts` | בדיקת תקינות HTTP (מרווח זמן ניתן להגדרה) | | `src/lib/services/installers/ninerouter.ts` | התקנה/עדכון/הסרה באמצעות npm עבור 9Router | | `src/lib/services/installers/cliproxy.ts` | התקנה/עדכון/הסרה באמצעות npm עבור CLIProxyAPI | | `src/lib/services/installers/mux.ts` | התקנה/עדכון/הסרה באמצעות npm עבור Mux | -| `src/app/api/services/9router/_lib.ts` | פונקציית עזר `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | נקודת קצה משותפת ליומני SSE | -| `open-sse/executors/ninerouter.ts` | מבצע ספק (שכבה 4) | +| `src/lib/services/installers/openwa.ts` | התקנה/עדכון/הסרה באמצעות npm עבור open-wa | +| `src/app/api/services/9router/_lib.ts` | פונקציית העזר `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | נקודת קצה משותפת של SSE ליומנים | +| `open-sse/executors/ninerouter.ts` | רכיב הפעלה של ספק (שכבה 4) | --- @@ -206,17 +208,17 @@ --- -## 4. חומר עזר ל-API +## 4. מדריך API -כל הנתיבים תחת `/api/services/` הם **LOCAL_ONLY** (גישה דרך loopback בלבד, כלל קשיח #17). +כל הנתיבים תחת `/api/services/` הם **LOCAL_ONLY** (גישה דרך loopback בלבד, כלל קשיח מס' 17). בקשות שאינן מ-loopback מקבלות `403 LOCAL_ONLY` ללא תלות באסימון האימות. -### 4.1 נקודות קצה של 9Router‏ (11 נתיבים) +### 4.1 נקודות קצה של 9Router (11 נתיבים) #### `POST /api/services/9router/install` התקנת 9Router מ-npm. הפעולה יוצרת את `DATA_DIR/services/9router/` עם -`package.json` ו-`node_modules/` משלו. אין התנגשות עם התלויות של OmniRoute עצמו. +`package.json` ו-`node_modules/` משלו. אין התנגשות עם יחסי התלות של OmniRoute עצמו. **גוף הבקשה** (כל השדות אופציונליים): @@ -224,9 +226,9 @@ { "version": "latest" } ``` -| שדה | סוג | ברירת מחדל | תיאור | -| --------- | -------- | ---------- | ------------------------------- | -| `version` | `string` | `"latest"` | תג גרסה של npm או semver להתקנה | +| שדה | סוג | ברירת מחדל | תיאור | +| --------- | -------- | ---------- | ---------------------------- | +| `version` | `string` | `"latest"` | תג גרסת npm או semver להתקנה | **תגובות:** @@ -237,15 +239,15 @@ | `409` | התקנה כבר מתבצעת (הנעילה מוחזקת) | | `500` | התקנת npm נכשלה — לפרטי שגיאה ידידותיים ראו `message` | -**הערות:** נעשה שימוש ב-`execFile('npm', [...])` — ללא מעטפת וללא אינטרפולציה (כלל קשיח #13). +**הערות:** נעשה שימוש ב-`execFile('npm', [...])` — ללא מעטפת וללא אינטרפולציה (כלל קשיח מס' 13). שגיאות EACCES מוצגות כהודעות ידידותיות. --- #### `POST /api/services/9router/start` -הפעלת 9Router. רושמת מפקח אם טרם נרשם, ולאחר מכן קוראת -ל-`supervisor.start()`. הפעולה אידמפוטנטית אם השירות כבר פועל. +הפעלת 9Router. הפעולה רושמת supervisor אם עדיין לא נרשם, ולאחר מכן קוראת +ל-`supervisor.start()`. הפעולה אידמפוטנטית כאשר השירות כבר פועל. **גוף הבקשה:** אין @@ -275,8 +277,8 @@ #### `POST /api/services/9router/stop` -עצירה מסודרת של 9Router. שולחת SIGTERM, ממתינה 15 שניות ולאחר מכן שולחת SIGKILL אם התהליך עדיין פעיל. -הפעולה אידמפוטנטית אם השירות כבר נעצר. +עצירה מבוקרת של 9Router. שליחת SIGTERM, המתנה של 15 שניות, ולאחר מכן SIGKILL אם התהליך עדיין פעיל. +הפעולה אידמפוטנטית כאשר השירות כבר נעצר. **גוף הבקשה:** אין @@ -291,17 +293,17 @@ #### `POST /api/services/9router/restart` -שקול ל-`stop()` ולאחר מכן `start()` תחת נעילת הפעולה. +שקול להפעלת `stop()` ולאחר מכן `start()` תחת נעילת הפעולה. **גוף הבקשה:** אין -**תגובות:** זהות לאלו של `start` (מוחזר `ServiceStatus` הסופי). +**תגובות:** זהות לאלו של `start` (מוחזר `ServiceStatus` סופי). --- #### `POST /api/services/9router/update` -מעדכנת את 9Router לגרסת npm חדשה יותר. אם השירות פועל, הוא נעצר +עדכון 9Router לגרסת npm חדשה יותר. אם השירות פועל, הוא נעצר תחילה, מתבצעת התקנת npm (הגרסה החדשה יותר מותקנת במקום), ולאחר מכן השירות מופעל מחדש. @@ -323,36 +325,36 @@ #### `POST /api/services/9router/rotate-key` -יוצר מפתח API חדש עבור 9Router, מצפין אותו במנוחה ומפעיל מחדש את השירות +יצירת מפתח API חדש עבור 9Router, הצפנתו במנוחה והפעלה מחדש של השירות (אם הוא פועל), כדי שיטען את המפתח החדש מהסביבה שלו. המפתח הישן מבוטל באופן מיידי. -**גוף הבקשה:** ללא +**גוף הבקשה:** אין **תגובות:** | סטטוס | תיאור | | ----- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | הסבב נכשל | +| `500` | החלפת המפתח נכשלה | **אבטחה:** המפתח החדש לעולם אינו מוחזר בתגובה (אין דליפת פרטי גישה). -הוא מאוחסן באופן מוצפן (AES-256-GCM) בטבלה `version_manager`. +הוא נשמר כשהוא מוצפן (AES-256-GCM) בטבלה `version_manager`. --- #### `GET /api/services/9router/status` -מחזיר סטטוס משולב בזמן אמת + ממסד הנתונים, כולל מטא-נתונים של הגרסה ותצוגה מקדימה של מפתח ה-API. +החזרת מצב משולב בזמן אמת + מצב ממסד הנתונים, כולל מטא-נתוני גרסה ותצוגה מקדימה של מפתח ה-API. **תגובות:** -| סטטוס | תיאור | -| ----- | ------------------ | -| `200` | ראו את הסכימה להלן | -| `500` | קריאת הסטטוס נכשלה | +| סטטוס | תיאור | +| ----- | ---------------- | +| `200` | ראו סכמה להלן | +| `500` | קריאת המצב נכשלה | -**סכימת התגובה:** +**סכמת התגובה:** ```json { @@ -376,8 +378,8 @@ #### `POST /api/services/9router/auto-start` -מחליף את מצב דגל ההפעלה האוטומטית. כאשר `enabled: true`, השירות יופעל אוטומטית -בפעם הבאה שבה OmniRoute יופעל (אם השירות מותקן). +הפעלה או השבתה של דגל ההפעלה האוטומטית. כאשר `enabled: true`, השירות מופעל אוטומטית +בפעם הבאה ש-OmniRoute עולה (אם השירות מותקן). **גוף הבקשה:** @@ -402,18 +404,18 @@ | פרמטר | סוג | ברירת מחדל | תיאור | | -------- | --------- | ---------- | ------------------------------------------------------------- | -| `tail` | `integer` | 200 | מספר השורות ההיסטוריות שיישלחו תחילה (מקסימום 1000) | -| `filter` | `string` | ללא | מסנן מחרוזת משנה שאינו תלוי רישיות (ללא regex — מוגן מ-ReDoS) | +| `tail` | `integer` | 200 | מספר השורות ההיסטוריות שיישלחו תחילה (לכל היותר 1000) | +| `filter` | `string` | אין | מסנן מחרוזת משנה שאינו תלוי רישיות (ללא regex — מוגן מ-ReDoS) | **אירועי SSE:** -| אירוע | נתונים | תיאור | -| ----------- | ----------- | ----------------------------- | -| `snapshot` | `LogLine[]` | קצה היומן ההיסטורי הראשוני | -| `log` | `LogLine` | שורת יומן בזמן אמת | -| `heartbeat` | `{}` | שמירת חיבור פעיל בכל 15 שניות | +| אירוע | נתונים | תיאור | +| ----------- | ----------- | ----------------------- | +| `snapshot` | `LogLine[]` | הסוף ההיסטורי הראשוני | +| `log` | `LogLine` | שורת יומן בזמן אמת | +| `heartbeat` | `{}` | שמירת חיבור כל 15 שניות | -**סכימת LogLine:** +**סכמת LogLine:** ```json { @@ -425,91 +427,126 @@ **תגובות:** -| סטטוס | תיאור | -| ----- | ------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | הפרמטר `filter` ארוך מדי (יותר מ-200 תווים) | -| `404` | השירות לא נמצא (לא רשום אצל המפקח) | +| סטטוס | תיאור | +| ----- | -------------------------------------- | +| `200` | `text/event-stream` | +| `400` | הפרמטר `filter` ארוך מדי (> 200 תווים) | +| `404` | השירות לא נמצא (המפקח אינו רשום) | --- -### 4.2 נקודות קצה של CLIProxyAPI (עשרה נתיבים) +### 4.2 נקודות קצה של CLIProxyAPI ‏(10 נתיבים) ל-CLIProxyAPI יש אותו מבנה נקודות קצה כמו ל-9Router, למעט `rotate-key`, ובתוספת -`accounts`, `provider-expose` ו-`auto-restart-adopted`. כעת הוא מקבל -מפתח API ייעודי למישור הנתונים, שמוזרק בעת יצירת התהליך (`needsApiKey: true` בתוך +`accounts`,‏ `provider-expose` ו-`auto-restart-adopted`. כעת הוא מקבל מפתח API +ייעודי למישור הנתונים, שמוזרק בעת ההפעלה (`needsApiKey: true` בתוך `bootstrap.ts`, ומשמש לסנכרון מודלים); `status` כולל פחות שדות. -| שיטה | נתיב | תיאור | -| ------ | ----------------------------------- | -------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | התקנת CLIProxyAPI מ-npm | -| `POST` | `/api/services/cliproxy/start` | הפעלת CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | עצירת CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | הפעלה מחדש של CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | עדכון לגרסה חדשה יותר | -| `GET` | `/api/services/cliproxy/status` | סטטוס בזמן אמת + ממסד הנתונים (ללא `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | החלפת מצב ההפעלה האוטומטית | - -נקודת הקצה המשותפת `GET /api/services/{name}/logs` (ראו §4.1) פועלת עבור כל +| מתודה | נתיב | תיאור | +| ------ | ----------------------------------- | ------------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | התקנת CLIProxyAPI מ-npm | +| `POST` | `/api/services/cliproxy/start` | הפעלת CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | עצירת CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | הפעלה מחדש של CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | עדכון לגרסה חדשה יותר | +| `GET` | `/api/services/cliproxy/status` | סטטוס חי + סטטוס מסד הנתונים (ללא `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | הפעלה או השבתה של הפעלה אוטומטית | + +נקודת הקצה המשותפת `GET /api/services/{name}/logs` (ראו סעיף 4.1) פועלת עבור כל ארבעת השירותים באמצעות המקטע הדינמי `[name]`. --- -### 4.3 נקודות קצה של Mux (שמונה נתיבים) +### 4.3 נקודות קצה של Mux ‏(8 נתיבים) ל-Mux יש אותו מבנה נקודות קצה כמו ל-CLIProxyAPI — אין נתיב `rotate-key` בממשק -ה-API (אסימון הנושא נוצר באותו אופן כמו זה של 9Router באמצעות -`getOrCreateApiKey("mux")` ומוזרק באמצעות משתנה הסביבה `MUX_SERVER_AUTH_TOKEN`, אך -עדיין אין נקודת קצה ייעודית לסבב מפתחות). Mux מנוהל במחזור החיים בלבד: בניגוד -ל-9Router, אין לו מריץ בשכבה 4 והוא לעולם אינו נרשם כספק ניתוב. +ה-API (אסימון הנושא נוצר באותו אופן כמו זה של 9Router, באמצעות +`getOrCreateApiKey("mux")`, ומוזרק דרך משתנה הסביבה `MUX_SERVER_AUTH_TOKEN`, אך +עדיין אין נקודת קצה ייעודית להחלפה). Mux מנוהל רק מבחינת מחזור החיים: בניגוד +ל-9Router, אין לו מפעיל שכבה 4 והוא לעולם אינו נרשם כספק ניתוב. -| שיטה | נתיב | תיאור | -| ------ | ------------------------------ | ----------------------------- | -| `POST` | `/api/services/mux/install` | התקנת Mux מ-npm (`npm i mux`) | -| `POST` | `/api/services/mux/start` | הפעלת Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | עצירת Mux | -| `POST` | `/api/services/mux/restart` | הפעלה מחדש של Mux | -| `POST` | `/api/services/mux/update` | עדכון לגרסת npm חדשה יותר | -| `GET` | `/api/services/mux/status` | סטטוס בזמן אמת + ממסד הנתונים | -| `POST` | `/api/services/mux/auto-start` | החלפת מצב ההפעלה האוטומטית | +| מתודה | נתיב | תיאור | +| ------ | ------------------------------ | -------------------------------- | +| `POST` | `/api/services/mux/install` | התקנת Mux מ-npm (`npm i mux`) | +| `POST` | `/api/services/mux/start` | הפעלת Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | עצירת Mux | +| `POST` | `/api/services/mux/restart` | הפעלה מחדש של Mux | +| `POST` | `/api/services/mux/update` | עדכון לגרסת npm חדשה יותר | +| `GET` | `/api/services/mux/status` | סטטוס חי + סטטוס מסד הנתונים | +| `POST` | `/api/services/mux/auto-start` | הפעלה או השבתה של הפעלה אוטומטית | --- -### 4.4 נקודות קצה של Bifrost (שמונה נתיבים) +### 4.4 נקודות קצה של Bifrost ‏(8 נתיבים) -Bifrost הוא קצה עורפי ממסר של שער AI ב-Go‏ (`@maximhq/bifrost`). הוא משתמש באותו -מבנה נקודות קצה כמו CLIProxyAPI (ללא `rotate-key` — ‏Bifrost מנהל את מפתחות הספקים -שלו בעצמו בקובץ `config.json` תחת `-app-dir`). +Bifrost הוא קצה עורפי ממסר לשער AI, הכתוב ב-Go (`@maximhq/bifrost`). הוא משתמש +באותו מבנה נקודות קצה כמו CLIProxyAPI (ללא `rotate-key` — Bifrost מנהל את מפתחות +הספקים שלו בעצמו בתוך `config.json` תחת `-app-dir`). -| שיטה | נתיב | תיאור | +| מתודה | נתיב | תיאור | | ------ | ---------------------------------- | ---------------------------------------------------- | | `POST` | `/api/services/bifrost/install` | התקנת Bifrost מ-npm (`@maximhq/bifrost`) | | `POST` | `/api/services/bifrost/start` | הפעלת Bifrost ביציאה 8080 (ברירת מחדל) | | `POST` | `/api/services/bifrost/stop` | עצירת Bifrost | | `POST` | `/api/services/bifrost/restart` | הפעלה מחדש של Bifrost | | `POST` | `/api/services/bifrost/update` | עדכון לגרסה חדשה יותר | -| `GET` | `/api/services/bifrost/status` | מצב בזמן אמת + מצב DB | +| `GET` | `/api/services/bifrost/status` | סטטוס חי + סטטוס מסד הנתונים | | `POST` | `/api/services/bifrost/auto-start` | הפעלה או השבתה של הפעלה אוטומטית | | `GET` | `/api/services/bifrost/logs` | זנב יומן SSE (דרך הנתיב הדינמי המשותף `[name]/logs`) | **חיווט ניתוב:** כאשר `BIFROST_BASE_URL` אינו מוגדר ומופע Bifrost המפוקח -פועל, `getBifrostRoutingConfig()` (בתוך `routingBackend.ts`) משתמש באופן אוטומטי -ב-`http://127.0.0.1:{port}` ככתובת ה-URL הבסיסית של הממסר. משתנה הסביבה `BIFROST_BASE_URL` המוגדר במפורש -תמיד מקבל קדימות. +פועל, `getBifrostRoutingConfig()` (בתוך `routingBackend.ts`) משתמש אוטומטית +ב-`http://127.0.0.1:{port}` ככתובת ה-URL הבסיסית של הממסר. משתנה הסביבה +`BIFROST_BASE_URL`, כאשר הוא מוגדר במפורש, תמיד מקבל עדיפות. --- -### 4.5 נקודות קצה של Dario‏ (12 נתיבים) +### 4.5 נקודות קצה של Dario ‏(12 נתיבים) + +אותו מבנה מחזור חיים כמו בשירותים האחרים (`install`,‏ `start`,‏ `stop`,‏ `restart`, +‏`update`,‏ `status`,‏ `auto-start`,‏ `auto-restart-adopted`), בתוספת מישור בקרה +של OAuth המוגן באסימון תחת `admin/`:‏ `admin/accounts`,‏ `admin/import-from-omniroute`, +‏`admin/login-start`,‏ `admin/login-complete` (כולם מוגנים באמצעות `DARIO_ADMIN_TOKEN`). + +### 4.6 נקודות קצה של open-wa ‏(7 נתיבים) + +open-wa (`@open-wa/wa-automate`) מפעיל מופע Chromium ללא ממשק משתמש (באמצעות +Puppeteer) כדי לבצע אוטומציה של WhatsApp Web. הוא משתמש באותו מבנה נקודות קצה כמו +Mux (עדיין אין נתיב `rotate-key`). הוא מנוהל רק מבחינת מחזור החיים — אינו יעד +ניתוב, ואין לו מפעיל שכבה 4 או רשומת ספק. -אותו מבנה מחזור חיים כמו בשירותים האחרים (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), ובנוסף מישור בקרה של OAuth -המוגן באמצעות אסימון תחת `admin/`:‏ `admin/accounts`,‏ `admin/import-from-omniroute`, -`admin/login-start`,‏ `admin/login-complete` (כולם מוגנים באמצעות `DARIO_ADMIN_TOKEN`). +| שיטה | נתיב | תיאור | +| ------ | --------------------------------- | ------------------------------------------------------------ | +| `POST` | `/api/services/openwa/install` | התקנת open-wa מ-npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | הפעלת open-wa ביציאה 8323 (ברירת המחדל) | +| `POST` | `/api/services/openwa/stop` | עצירת open-wa | +| `POST` | `/api/services/openwa/restart` | הפעלה מחדש של open-wa | +| `POST` | `/api/services/openwa/update` | עדכון לגרסה חדשה יותר | +| `GET` | `/api/services/openwa/status` | מצב בזמן אמת + מצב מסד הנתונים | +| `POST` | `/api/services/openwa/auto-start` | הפעלה או השבתה של הפעלה אוטומטית | +| `GET` | `/api/services/openwa/logs` | זנב יומן באמצעות SSE (דרך הנתיב הדינמי המשותף `[name]/logs`) | + +**מפתח API:** מוזרק בתור `WA_KEY` — דריסת משתני הסביבה הכללית של open-wa +בעלי התחילית `WA_*` ממפה אותו לאפשרות שורת הפקודה `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, אומת מול החבילה המותקנת בגרסה 4.76.0). +התחילית `ow_` נוספת כאשר המפתח נוצר באמצעות `generateServiceApiKey()`. open-wa +קורא את המפתח בחזרה מכותרת HTTP מסוג `key`/`api_key` (ולא `Authorization: +Bearer`); הנתיב `/api-docs*` מוחרג במפורש מהבדיקה +(`setupAuthenticationLayer` בתוך `dist/cli/server.js`), ולכן בדיקת התקינות +אינה זקוקה לכותרת אימות. + +**צימוד:** open-wa אינו רשמי ואינו משויך ל-WhatsApp — המספר +המחובר נתון לסכנת חסימה עקב מנגנון זיהוי האוטומציה של WhatsApp. +בהפעלה הראשונה, קוד ה-QR לצימוד מודפס לפלט הסטנדרטי ומוצג דרך +לוח היומנים/זרם ה-SSE הקיים — עדיין אין נקודת קצה ייעודית לתמונת QR +בשילוב הזה. + +--- -### 4.6 פרוקסי הפוך (הטמעת לוח הבקרה של 9Router) +### 4.7 פרוקסי הפוך (הטמעה בלוח הבקרה של 9Router) -לוח הבקרה מטמיע את ממשק האינטרנט של 9Router בתוך iframe באמצעות פרוקסי הפוך -פנימי בכתובת: +לוח הבקרה מטמיע את ממשק המשתמש האינטרנטי של 9Router בתוך iframe באמצעות פרוקסי +הפוך פנימי בכתובת: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -517,18 +554,18 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] פרוקסי זה: -- מעביר את הבקשה אל `http://127.0.0.1:{port}/{path}` (לולאה חוזרת בלבד) +- מעביר את הבקשה אל `http://127.0.0.1:{port}/{path}` (ממשק לולאה חוזרת בלבד) - מסיר את הכותרות הנכנסות `cookie` ו-`authorization` (ללא דליפה של הפעלת OmniRoute) -- מוסיף `Authorization: Bearer {apiKey}` לצורך אימות מול 9Router +- מזריק `Authorization: Bearer {apiKey}` לצורך אימות מול 9Router - מסיר מהתגובה את `set-cookie`,‏ `content-security-policy`,‏ `x-frame-options`,‏ `cross-origin-*` -- משכתב תגובות HTML כדי להוסיף `` ולנרמל נתיבים מוחלטים (`/foo` ← `/dashboard/.../embed/foo`) +- משכתב תגובות HTML כדי להזריק `` ולנרמל נתיבים מוחלטים (`/foo` → `/dashboard/.../embed/foo`) -שדרוגי WebSocket עבור לוח הבקרה המוטמע מטופלים על ידי שרת נלווה -ביציאה ייעודית (ראו `src/lib/services/embedWsProxy.ts`). +שדרוגי WebSocket עבור לוח הבקרה המוטמע מטופלים בידי שרת נלווה ביציאה +ייעודית (ראו `src/lib/services/embedWsProxy.ts`). **אבטחה:** נתיבי פרוקסי ההטמעה מסווגים תחת `LOCAL_ONLY_API_PREFIXES` -וניתן לגשת אליהם רק מכתובת לולאה חוזרת. תוקף שמשיג JWT דרך מנהרת -Cloudflare/Ngrok אינו יכול להשתמש בפרוקסי כדי לגשת לשירותים מוטמעים. +וניתן לגשת אליהם רק מממשק הלולאה החוזרת. תוקף שמשיג JWT דרך +מנהרת Cloudflare/Ngrok אינו יכול להשתמש בפרוקסי כדי לגשת לשירותים מוטמעים. --- diff --git a/docs/i18n/he/docs/frameworks/MEMORY.md b/docs/i18n/he/docs/frameworks/MEMORY.md index f8cd31df4e28..74807f6acbe6 100644 --- a/docs/i18n/he/docs/frameworks/MEMORY.md +++ b/docs/i18n/he/docs/frameworks/MEMORY.md @@ -162,33 +162,35 @@ RRF(d) = Σ 1 / (k + rank_i(d)) כאשר k = 60 (ניתן להגדרה ב ## הרחבת הגדרות -תשעה שדות של הטמעות ווקטורים זמינים ב-`MemorySettingsExtended` שבקובץ +תשעה שדות של הטמעות ווקטורים זמינים ב-`MemorySettingsExtended` בקובץ `src/shared/schemas/memory.ts`, ונשמרים באמצעות `src/lib/db/settings.ts`: | שדה | סוג | ברירת מחדל | תיאור | | ------------------------ | -------------------------------------------------- | ---------- | ------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | באיזה מקור הטמעות להשתמש | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | מקור ההטמעות שבו יש להשתמש | | `embeddingProviderModel` | `string \| null` | `null` | ספק/מודל בתבנית `provider/model` | | `customBaseUrl` | `string \| null` | `null` | כתובת URL בסיסית של נקודת קצה תואמת OpenAI לזיכרון בלבד | | `customModelId` | `string \| null` | `null` | מזהה המודל שנשלח לנקודת הקצה המותאמת אישית | | `transformersEnabled` | `boolean` | `false` | הצטרפות לשימוש ב-Transformers.js ‏(MiniLM, כ-400MB) | | `staticEnabled` | `boolean` | `false` | הצטרפות לשימוש במודל המקומי הסטטי potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | הפעלת שלב דירוג מחדש (מוסיף 200-500ms+ לכל בקשה) | +| `rerankEnabled` | `boolean` | `false` | הפעלת שלב דירוג מחדש (מוסיף 200-500ms+‎ לכל בקשה) | | `rerankProviderModel` | `string \| null` | `null` | ספק/מודל לדירוג מחדש בתבנית `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | באיזה מנגנון וקטורי להשתמש | + +הערך `rerankProviderModel` נפתר באמצעות `POST /v1/rerank` (שנקרא דרך ממשק הלולאה המקומית), ולכן הוא מקבל כל ערך שהנתיב הזה מקבל: מודל דירוג מחדש נבחר בענן (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) או צומת ספק תואם OpenAI בתבנית `/` (לדוגמה, `skilled-mini/bge-reranker-v2-m3` עבור שרת TEI/Infinity). צמתי לולאה מקומית תמיד כשירים; צומת במארח אחר (LAN, Tailscale) דורש בנוסף את דגל התכונה `RERANK_REMOTE_PROVIDER_NODES` וחייב לעבור את מדיניות כתובות ה-URL היוצאות של הספק — ראו [דגלי תכונות](../reference/FEATURE_FLAGS.md). בורר לוח הבקרה מציג ספקים נבחרים וכן צמתים מקומיים; ניתן להגדיר ישירות כל מחרוזת `provider/model` תקינה באמצעות `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | מנגנון הווקטורים שבו יש להשתמש | הגדרות אלה נחשפות באמצעות `GET /PUT /api/settings/memory` (סכמה `MemorySettingsExtendedSchema`). -עבור המקור `remote`,‏ Memory מקבל גם את ההגדרות האופציונליות `customBaseUrl` -ו-`customModelId`. יחד הן בוחרות נקודת קצה `/embeddings` ומודל תואמי OpenAI, -מבלי לשנות את מרשם ההטמעות הגלובלי. נקודת הקצה מנורמלת לפני השימוש ונבדקת -בהתאם למדיניות כתובות ה-URL היוצאות של הספק: נדרש HTTP(S), פרטי זיהוי מוטמעים -ומחרוזות שאילתה נדחים, וכתובות מטא-נתונים של שירותי ענן נותרות חסומות. ערכים -ריקים משמרים את ספק המרשם שנבחר. שגיאות המוחזרות ללוח הבקרה עוברות טיהור, -ופרטי הזיהוי של נקודת הקצה לעולם אינם נרשמים ביומן. +עבור המקור `remote`, הזיכרון מקבל גם את ההגדרות האופציונליות `customBaseUrl` ו- +`customModelId`. יחד, הן בוחרות נקודת קצה `/embeddings` תואמת OpenAI +ומודל, מבלי לשנות את מאגר ההטמעות הגלובלי. נקודת הקצה עוברת +נרמול לפני השימוש ונבדקת לפי מדיניות כתובות ה-URL היוצאות של הספק: נדרש +HTTP(S), פרטי אימות מוטמעים ומחרוזות שאילתה נדחים, וכתובות +מטא-נתונים של הענן נותרות חסומות. ערכים ריקים משמרים את ספק המאגר שנבחר. שגיאות +המוחזרות ללוח הבקרה עוברות טיהור, ופרטי האימות של נקודת הקצה לעולם אינם נרשמים ביומן. -> **TODO (D20):** הטווח `global` (שיתוף זיכרונות בין כל מפתחות ה-API) אינו -> ממומש בגרסה זו. הוא דורש שינויי סכמה ונתיב אחזור גלובלי. +> **TODO (D20):** התחום `global` (שיתוף זיכרונות בין כל מפתחות ה-API) אינו +> ממומש בגרסה זו. הוא דורש שינויים בסכמה ונתיב אחזור גלובלי. > יש לעקוב אחריו בנפרד. ## שכבות אחסון diff --git a/docs/i18n/he/docs/guides/DOCKER_GUIDE.md b/docs/i18n/he/docs/guides/DOCKER_GUIDE.md index fd4ef39d6698..cfb77d61c8d2 100644 --- a/docs/i18n/he/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/he/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## הפעלה מהירה +> **אירוח עצמי בפקודה אחת?** עיינו +> [במדריך לאירוח עצמי](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (image שפורסם + +> Redis, גישה מקומית בלבד, ללא בחירת פרופיל). ההפעלה המהירה שלהלן היא +> המסלול המבוסס על קונטיינר יחיד עבור משתמשים שכבר מפעילים Redis במקום אחר. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/he/docs/guides/TROUBLESHOOTING.md b/docs/i18n/he/docs/guides/TROUBLESHOOTING.md index 60c1013b79d7..30a9f90cd46e 100644 --- a/docs/i18n/he/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/he/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # המתנה תחומה וארוכ --- -## אזהרות npm install‏ (ERESOLVE / עמית / הוצא משימוש) +## אזהרות `npm install` ‏(ERESOLVE / תלויות עמית / deprecated) -בעת הרצת `npm install -g omniroute`, ייתכן שיופיעו אזהרות רבות כגון `npm warn ERESOLVE`, הודעות על תלויות עמית והודעות `deprecated`. **אזהרות אלה צפויות ואינן מזיקות.** ההתקנה הצליחה אם מופיע בפלט `added packages`. +בעת הרצת `npm install -g omniroute`, ייתכן שתראו שלל אזהרות כגון `npm warn ERESOLVE`, הודעות על תלויות עמית והודעות `deprecated`. **אזהרות אלה צפויות ואינן מזיקות.** ההתקנה הצליחה אם מופיע בפלט `added packages`. -האזהרות נובעות מטווחים מיושנים של תלויות עמית בחבילות צד שלישי שאינן בשליטת OmniRoute: +כדי להסתיר את אזהרות פתרון תלויות העמית, השתמשו בצורת ההתקנה הנתמכת של OmniRoute: -1. **`marked-terminal` דורשת `marked >=1 <16`, אך נמצאה `marked@18`** — בפועל היא פועלת היטב; טווח העמית בפרויקט המקור פשוט מיושן. -2. **`deprecated prebuild-install@7.1.3`** — כלי עזר עקיף לאחזור קבצים בינאריים מקוריים. הוא אינו - משמש להתקנת קישור התעבורה המקובע `wreq-js`, ואינו מעיד על כך שהגדרת התעבורה של ספק קובצי ה-cookie +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` מסתיר רק את `ERESOLVE` ואת ההודעות על תלויות עמית. הודעות על הוצאה משימוש נשארות גלויות מכיוון שמקורן בחבילות צד שלישי טרנזיטיביות; הן אינן מעידות על כשל בהתקנה. + +האזהרות נובעות מטווחי תלויות עמית מיושנים בחבילות צד שלישי שאינן בשליטת OmniRoute: + +1. **`marked-terminal` דורשת `marked >=1 <16`, אך נמצאה `marked@18`** — בפועל היא פועלת כראוי; טווח תלות העמית במעלה הזרם פשוט מיושן. +2. **`deprecated prebuild-install@7.1.3`** — כלי עזר טרנזיטיבי לאחזור קבצים בינאריים מקוריים. הוא אינו + משמש להתקנת קישור התעבורה המקובע `wreq-js`, ואינו מעיד על כך שהגדרת תעבורת הספק web-cookie נכשלה. -**אין צורך בפעולה** — לא ניתן להשתיק את האזהרות לחלוטין מבלי ליצור פיצול של חבילות המקור. +**אין צורך בפעולה** — לא ניתן להשתיק לחלוטין את האזהרות מבלי ליצור פיצול של החבילות במעלה הזרם. --- diff --git a/docs/i18n/he/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/he/docs/providers/CURSOR-API-KEY-AND-CLI.md index 47bf69d21778..0fa3dbeff3ec 100644 --- a/docs/i18n/he/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/he/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,39 +4,39 @@ --- -שתי דרכים להציב את Cursor מאחורי OmniRoute ללא הפעלת IDE: +שתי דרכים להציב את Cursor מאחורי OmniRoute ללא סשן IDE: -1. ספק **`cursor-api`** (כרטיס "Cursor API", כינוי `cua`): ספק המבוסס על מפתח API - ומחזיק מפתח API של משתמש Cursor (`crsr_…`, שנוצר בכתובת +1. **ספק `cursor-api`** (כרטיס "Cursor API", כינוי `cua`): ספק מבוסס מפתח API + שמחזיק מפתח API של משתמש Cursor ‏(`crsr_…`, שנוצר בכתובת `https://cursor.com/dashboard/api`). לאחר מכן, כל לקוח OmniRoute יכול לגשת למודלים של Cursor דרך `/v1/chat/completions` בתור `cursor-api/` או `cua/`, עם שכבות המכסה, הגיבוי והרישום הרגילות. ספק ה-IDE - (`cursor`, הפעלת OAuth/IDE) נשאר ללא שינוי. -2. **העברה ישירה של Cursor CLI**: הפנו את Cursor CLI (`agent`) אל OmniRoute כך + ‏(`cursor`, סשן OAuth/IDE) נותר ללא שינוי. +2. **העברה ישירה של Cursor CLI**: הפנו את Cursor CLI ‏(`agent`) אל OmniRoute כך שכל RPC שה-CLI מבצע יאומת באמצעות מפתח API של OmniRoute, יועבר - ל-Cursor עם פרטי האימות של חיבור `cursor-api`, ויירשם בדף היומנים. + אל Cursor עם פרטי האימות של חיבור `cursor-api`, ויירשם בדף היומנים. ## מדוע המפתח מוחלף -`api2.cursor.sh` דוחה מפתח `crsr_…` גולמי כאסימון Bearer‏ (401). ה-Cursor -CLI שולח תחילה את המפתח באמצעות POST אל `/auth/exchange_user_api_key` ומקבל JWT -של הפעלה, שתוקפו פג לאחר שעה אחת; ה-`refreshToken` שמוחזר מכיל את אותו -`exp`, ולכן רענון פירושו החלפה מחדש של המפתח. +`api2.cursor.sh` דוחה מפתח `crsr_…` גולמי בתור אסימון Bearer ‏(401). ה-CLI של Cursor +שולח תחילה בקשת POST עם המפתח אל `/auth/exchange_user_api_key` ומקבל JWT של סשן +שתוקפו פג לאחר שעה; ה-`refreshToken` שמוחזר נושא את אותו `exp`, ולכן רענון +משמעותו החלפה מחדש של המפתח. `open-sse/services/cursorApiKeyAuth.ts` מבצע את ההחלפה הזו, שומר במטמון אסימון -הפעלה אחד לכל מפתח, מבצע החלפה מחדש חמש דקות לפני פקיעת התוקף ומסיר את האסימון -מהמטמון כאשר Cursor מחזיר 401. `CursorExecutor` קורא לו מיד לפני פתיחת -הזרם במעלה הזרם עבור חיבורי `cursor-api`. +סשן אחד לכל מפתח, מבצע החלפה מחדש חמש דקות לפני פקיעת התוקף ומסיר את האסימון +מהמטמון כאשר Cursor מחזיר 401. ‏`CursorExecutor` מפעיל אותו מיד לפני פתיחת +הזרם מול השירות שבמעלה הזרם עבור חיבורי `cursor-api`. ## ספק `cursor-api` -רישום: `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`,‏ `authType: "apikey"`, ואותם `format`,‏ `baseUrl` +מרשם: `open-sse/config/providers/registry/cursor/index.ts` +‏(`cursor_apiProvider`, ‏`authType: "apikey"`, ואותם `format`, ‏`baseUrl` ו-`models` כמו `cursor`). כרטיס קטלוג: `src/shared/constants/providers/apikey/specialty-media.ts`. מפת מבצעים: -`open-sse/executors/index.ts` (`"cursor-api"` / `cua` → +`open-sse/executors/index.ts` ‏(`"cursor-api"` / `cua` ← `new CursorExecutor("cursor-api")`). -לוח הבקרה: ספקים → Cursor API → הוספת מפתח API. +לוח הבקרה: ספקים ← Cursor API ← הוספת מפתח API. REST: @@ -57,43 +57,56 @@ curl -sS http://localhost:20128/v1/chat/completions \ הערות: -- רשימת המודלים עבור `cursor-api` מגיעה מהרישום הסטטי של Cursor (אותה - רשימה שאליה חוזר ספק ה-IDE בעת הצורך); אין צורך להתקין את `cursor-agent` +- רשימת המודלים עבור `cursor-api` מגיעה מהמרשם הסטטי של Cursor (אותה רשימה + שאליה ספק ה-IDE חוזר בעת הצורך); אין צורך להתקין `cursor-agent` במארח OmniRoute. -- `POST /api/providers/{id}/refresh-cursor` מיועד לספק ה-IDE מסוג `cursor` - בלבד; לחיבורי `cursor-api` אין הפעלת IDE שיש לחדש. +- ‏`POST /api/providers/{id}/refresh-cursor` מיועד לספק ה-IDE ‏`cursor` + בלבד; לחיבורי `cursor-api` אין סשן IDE לחידוש. + +## מזהי מודל מקוריים ורמת מאמץ + +עבור `cursor` / `cu` ו-`cursor-api` / `cua`, מנרמל רמת המאמץ המשותף של Claude +משאיר את מזהה המודל המבוקש ללא שינוי. Cursor יכול לפרסם סיומת כגון +`-low` כחלק ממזהה מודל אמיתי, ולא ככינוי לרמת מאמץ של OmniRoute. +המבצע של Cursor שומר התאמה מדויקת לקטלוג הפעיל; כאשר אין התאמה, +פותר המודלים הקיים שלו מטפל בהמרת הסיומת לפרמטר. + +הדבר אינו משנה את נרמול רמת המאמץ עבור נתיבי Claude ישירים, נתיבים תואמי +Claude או נתיבי Vertex. הזמינות עדיין תלויה בקטלוג ובהרשאות של חשבון Cursor +שנבחר. ## העברה ישירה של Cursor CLI -נתיב: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`. התחילית `/api/cursor-cli/` -רשומה ב-`src/shared/constants/publicApiRoutes.ts` מכיוון שהמטפל +נתיב: `src/app/api/cursor-cli/[...path]/route.ts` ← +`open-sse/handlers/cursorCliProxy.ts`. הקידומת `/api/cursor-cli/` רשומה +ב־`src/shared/constants/publicApiRoutes.ts` מכיוון שהמטפל אוכף אימות משלו: -| נתיב | האימות שה-CLI מצפה לו | מה OmniRoute עושה | -| ----------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | מאמת את המפתח, מנפיק JWT מסוג HS256 לשעה אחת (חתום באמצעות `JWT_SECRET`) ומחזיר אותו | -| כל נתיב אחר (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | מאמת מנפיק/קהל יעד/תפוגה, בוחר חיבור `cursor-api` פעיל, מחליף את כותרת Authorization באסימון Cursor שהתקבל מההחלפה ומזרים את התשובה בחזרה | +| נתיב | האימות המצופה מה־CLI | מה OmniRoute עושה | +| ----------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | מאמת את המפתח, מנפיק JWT מסוג HS256 בתוקף לשעה (חתום באמצעות `JWT_SECRET`) ומחזיר אותו | +| כל נתיב אחר (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | מאמת מנפיק/קהל יעד/תפוגה, בוחר חיבור `cursor-api` פעיל, מחליף את כותרת Authorization באסימון Cursor שהומר ומזרים את התשובה בחזרה | -ה-CLI מפענח את `exp` מכל אסימון שהוא מקבל, ולכן מסירת אסימון אטום -גורמת לו לבצע החלפה מחדש לפני כמעט כל בקשה; ה-JWT שמונפק מונע -זאת. תגובת 401 מ-OmniRoute גורמת ל-CLI לבצע החלפה מחדש. +ה־CLI מפענח את `exp` מכל אסימון שהוא מקבל, ולכן מסירת אסימון אטום +גורמת לו לבצע המרה מחדש לפני כמעט כל בקשה; ה־JWT המונפק מונע +זאת. תגובת 401 מ־OmniRoute גורמת ל־CLI לבצע המרה מחדש. ### הגדרה -1. צרו מפתח API של OmniRoute (לוח הבקרה → מפתחות API) וחיבור `cursor-api`. -2. הורו ל-CLI להשתמש ב-HTTP/1.1 עבור זרם הסוכן. בתוך +1. צרו מפתח API של OmniRoute (לוח הבקרה ← מפתחות API) וחיבור + `cursor-api`. +2. הגדירו את ה־CLI להשתמש ב־HTTP/1.1 עבור זרם הסוכן. בקובץ `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - ללא הגדרה זו, ה-CLI פותח את פעולת הסוכן דרך HTTP/2 מול מארח סוכן - שהוגדר בנפרד, ורק קריאות ה-RPC של מישור הבקרה עוברות דרך + ללא הגדרה זו, ה־CLI פותח את תור הסוכן דרך HTTP/2 מול מארח סוכן + שהוגדר בנפרד, ורק קריאות ה־RPC של מישור הבקרה עוברות דרך נקודת הקצה. -3. הפעילו את ה-CLI מול OmniRoute: +3. הפעילו את ה־CLI מול OmniRoute: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -101,19 +114,19 @@ curl -sS http://localhost:20128/v1/chat/completions \ agent -p --trust "Reply with exactly OK" ``` -כל שלב נרשם ביומנים עם הספק `cursor-api`, סוג הבקשה `cursor-cli`, -הנתיב `/api/cursor-cli/`, ומשויך למפתח ה-API של OmniRoute ולחיבור +כל שלב בדרך מופיע ביומנים עם הספק `cursor-api`, סוג הבקשה `cursor-cli`, +הנתיב `/api/cursor-cli/`, ומשויך למפתח ה־API של OmniRoute ולחיבור ששירת אותו. ### מצבי כשל -| מצב | תגובה ל-CLI | +| מצב | תגובה ל־CLI | | ----------------------------------------------- | ------------------------------------------------- | -| מפתח OmniRoute לא מוכר ו-`REQUIRE_API_KEY=true` | 401 `unauthenticated` בעת ההחלפה | +| מפתח OmniRoute לא מוכר ו־`REQUIRE_API_KEY=true` | 401 `unauthenticated` במהלך ההמרה | | `REQUIRE_API_KEY=false` | הפעלה אנונימית (משקפת את ההתנהגות של `/v1/*`) | -| JWT של הפעלה שפג תוקפו / זר / ששונה | 401, ה-CLI מבצע החלפה מחדש | -| מפתח API של OmniRoute שבוטל לאחר ההחלפה | 401 ב-RPC הבא | +| JWT הפעלה שפג תוקפו / זר / ששונה | 401, ה־CLI מבצע המרה מחדש | +| מפתח API של OmniRoute שבוטל לאחר ההמרה | 401 בקריאת ה־RPC הבאה | | אין חיבור `cursor-api` פעיל | 503 `unavailable` | | Cursor דוחה את מפתח החיבור | 401 `unauthenticated`, ההפעלה השמורה במטמון נמחקת | -| המקור במעלה הזרם אינו נגיש | 502 `unavailable` (הודעה שעברה טיוב) | -| `JWT_SECRET` אינו מוגדר | 503 בעת ההחלפה | +| המקור אינו נגיש | 502 `unavailable` (הודעה שעברה סינון) | +| `JWT_SECRET` אינו מוגדר | 503 במהלך ההמרה | diff --git a/docs/i18n/he/docs/reference/API_REFERENCE.md b/docs/i18n/he/docs/reference/API_REFERENCE.md index 23cfb5acd882..6bacd5a1431b 100644 --- a/docs/i18n/he/docs/reference/API_REFERENCE.md +++ b/docs/i18n/he/docs/reference/API_REFERENCE.md @@ -444,49 +444,49 @@ GET /api/v1/provider-plugin-manifest ## נקודות קצה לתאימות -| שיטה | נתיב | פורמט | -| ---- | ----------------------------------------- | ---------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (עריכה/השלמת תמונה) | -| POST | `/v1/videos/generations` | יצירת וידאו בסגנון OpenAI | -| POST | `/v1/music/generations` | יצירת מוזיקה בסגנון OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (דיבור לטקסט) | -| POST | `/v1/audio/speech` | OpenAI TTS (מחזיר גוף שמע) | -| POST | `/v1/rerank` | דירוג מחדש בסגנון Cohere/Voyage | -| POST | `/v1/classify` | סיווג Jina (`api.jina.ai`) | -| POST | `/v1/segment` | מחלק למקטעים של Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | כינוי לקטלוג OpenAI | -| GET | `/api/v1/vscode/{token}/models` | כינוי למודלים של OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | כינוי OpenAI מבוסס אסימון | -| POST | `/api/v1/vscode/{token}/responses` | כינוי OpenAI Responses מבוסס אסימון | -| POST | `/api/v1/vscode/{token}/api/chat` | כינוי Ollama מבוסס אסימון | -| GET | `/api/v1/vscode/{token}/api/tags` | כינוי תגיות Ollama מבוסס אסימון | - -כל נתיבי POST פועלים באותו מבנה: `Bearer your-api-key` + גוף JSON שעבר אימות באמצעות Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` וכו'; ראו `src/shared/validation/schemas.ts`). במקרה של כשל באימות הסכימה מוחזר 4xx. - -עבור לקוחות שאינם יכולים לצרף `Authorization: Bearer ...`, OmniRoute מקבל גם מפתחות API בכתובת ה-URL, באמצעות תאימות למחרוזת שאילתה (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) או באמצעות נקודות הקצה הייעודיות `/api/v1/vscode/{token}/...` המתועדות להלן. +| שיטה | נתיב | פורמט | +| ---- | ----------------------------------------- | -------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (עריכה/השלמה) | +| POST | `/v1/videos/generations` | יצירת וידאו בסגנון OpenAI | +| POST | `/v1/music/generations` | יצירת מוזיקה בסגנון OpenAI | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (דיבור לטקסט) | +| POST | `/v1/audio/speech` | OpenAI TTS (מחזיר גוף שמע) | +| POST | `/v1/rerank` | דירוג מחדש בסגנון Cohere/Voyage | +| POST | `/v1/classify` | סיווג Jina (`api.jina.ai`) | +| POST | `/v1/segment` | מפלח Jina (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | כינוי לקטלוג OpenAI | +| GET | `/api/v1/vscode/{token}/models` | כינוי למודלים של OpenAI | +| POST | `/api/v1/vscode/{token}/chat/completions` | כינוי OpenAI עם אסימון | +| POST | `/api/v1/vscode/{token}/responses` | כינוי OpenAI Responses עם אסימון | +| POST | `/api/v1/vscode/{token}/api/chat` | כינוי Ollama עם אסימון | +| GET | `/api/v1/vscode/{token}/api/tags` | כינוי לתגיות Ollama עם אסימון | + +כל נתיבי POST פועלים באותו מבנה: `Bearer your-api-key` + גוף JSON מאומת באמצעות Zod‏ (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` וכו'; ראו `src/shared/validation/schemas.ts`). במקרה של כשל באימות הסכמה מוחזרת תגובת 4xx. + +עבור לקוחות שאינם יכולים לצרף `Authorization: Bearer ...`,‏ OmniRoute מקבל גם מפתחות API בכתובת ה-URL, באמצעות תאימות למחרוזת שאילתה (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) או באמצעות נקודות הקצה הייעודיות `/api/v1/vscode/{token}/...` המתועדות להלן. ```bash -# דירוג מחדש +# דירוג מחדש (ספק ממרשם הענן, או צומת ספק תואם OpenAI בתור "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # סיווג Jina (פרטי גישה ל-Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# מחלק למקטעים של Jina +# מפלח Jina POST /v1/segment { "content": "...", "return_chunks": true } -# חיפוש Jina‏ (s.jina.ai; כינויי ספקים: jina-search, jina-ai, jina) +# חיפוש Jina‏ (s.jina.ai; כינויי ספק: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } # ניהול תוכן @@ -503,6 +503,28 @@ POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **צומתי ספק לדירוג מחדש:** `POST /v1/rerank` מנתב גם לצומתי ספק תואמי OpenAI +> ‏(oMLX,‏ vLLM,‏ Infinity,‏ TEI מאחורי שער, …) הממוענים בתבנית `/`. צומתי +> loopback‏ (`localhost`, `127.0.0.1`, `172.16.0.0/12`) תמיד כשירים. צמתים בכל מארח אחר +> — מחשב ברשת LAN או עמית Tailscale — כשירים רק כאשר המפעיל מפעיל את דגל התכונה +> `RERANK_REMOTE_PROVIDER_NODES` **וגם** כתובת ה-URL הבסיסית של הצומת עומדת במדיניות כתובות ה-URL +> היוצאות של הספק (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> לעולם לא מתבצע ניתוב למארחי מטא-נתונים בענן. שלב הדירוג מחדש של מנוע הזיכרון קורא לנתיב זה דרך +> loopback, ולכן אותו כלל חל על `rerankProviderModel` בהגדרות הזיכרון. +> +> **מבני שרת מקומי:** הקריאה לצומת מתבצעת ב-`/v1/rerank`, ובמקרה של 404, ב-`/rerank` +> ‏(Infinity,‏ TEI). הגוף הנשלח במעלה הזרם כולל הן את האיות של Cohere/OpenAI‏ (`documents`, +> `return_documents`) והן את האיות של TEI‏ (`texts`, `return_text`), והתגובה במעלה הזרם +> מנורמלת למעטפת של Cohere: המערך הגולמי של TEI‏ `[{index, score, text}]`, המבנה `{results: [{index, score}]}` +> משערים דקים, והמבנה בסגנון Voyage‏ `{data: [...]}` — כולם חוזרים ללקוח בתור +> `{results: [{index, relevance_score, document?}]}`, כשהם ממוינים לפי ציון ומוגבלים ל-`top_n`. + +> **גילוי צומתי ספק:** מודלים בצומת ספק תואם OpenAI מופיעים ב-`GET /v1/models` +> תחת קידומת הצומת. שורות שאינן כוללות מטא-נתונים של נקודת קצה (כמקובל ברשימות מקומיות של `/v1/models`) +> יורשות את ה-`apiType` של הצומת, כך שהמודלים של צומת `embeddings` הם מסוג `type: "embedding"` והמודלים +> של צומת `rerank` הם מסוג `type: "rerank"`, במקום שברירת המחדל שלהם תהיה צ'אט; הגדרה מפורשת של +> `supportedEndpoints` בשורה מסונכרנת או בשורה שנוספה ידנית עדיין מקבלת קדימות. + ### נתיבי ספק ייעודיים ```bash diff --git a/docs/i18n/he/docs/reference/FEATURE_FLAGS.md b/docs/i18n/he/docs/reference/FEATURE_FLAGS.md index c6f39c0bad71..5bf2d44e2c0b 100644 --- a/docs/i18n/he/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/he/docs/reference/FEATURE_FLAGS.md @@ -42,130 +42,132 @@ --- -## קטלוג הדגלים +## קטלוג דגלים -72 דגלים ב-6 קטגוריות. **ברירת מחדל** היא ברירת המחדל שבהגדרה — הערך -שמשמש כאשר לא קיימים דריסה במסד הנתונים או משתנה סביבה. +74 דגלים ב-6 קטגוריות. **ברירת מחדל** היא ברירת המחדל של ההגדרה — הערך +שנעשה בו שימוש כאשר לא קיימת דריסה במסד הנתונים וגם לא קיים משתנה סביבה. ### אבטחה (10) -| מפתח | סוג | ברירת מחדל | תיאור | -| --------------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | בוליאני | `false` | דרישת מפתח API עבור כל הבקשות הנכנסות. | -| `INPUT_SANITIZER_ENABLED` | בוליאני | `true` | הפעלת טיהור קלט עבור כל הבקשות. | -| `INJECTION_GUARD_MODE` | enum | `off` | מצב ההגנה מפני הזרקת הנחיות. ערכים: `off`,‏ `warn`,‏ `block`,‏ `redact`. | -| `PII_REDACTION_ENABLED` | בוליאני | `false` | השחרת מידע המאפשר זיהוי אישי בבקשות (ללא תלות ב-`INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | בוליאני | `false` | טיהור מידע המאפשר זיהוי אישי מתגובות הספק. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | מצב לטיהור מידע המאפשר זיהוי אישי בתגובות. ערכים: `redact`,‏ `warn`,‏ `block`,‏ `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | בוליאני | `true` | חסימת בקשות יוצאות לטווחי כתובות IP פרטיים/פנימיים. | -| `ALLOW_API_KEY_REVEAL` | בוליאני | `false` | מתן אפשרות למשתמשים מאומתים בלוח הבקרה לחשוף מפתחות API שמורים במקום לראות ערכים מוסווים בלבד. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | בוליאני | `false` | הכללת קידומת החשבון בשורות יומן AUTH (לדוגמה, "שימוש בחשבון : abc12345..."). מושבת כברירת מחדל, כדי שמזהי חשבונות יושחרו ביומני תהליכים משותפים/מרובי דיירים. ללא תלות במצב ניפוי באגים; שינוי מצב ניפוי הבאגים אינו חושף מידע זה. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | בוליאני | `false` | כאשר OIDC מופעל, השבתת התחברות באמצעות סיסמה כך שמשתמשים יוכלו לבצע אימות רק באמצעות כניסה יחידה של OIDC. כאשר האפשרות מושבתת (ברירת המחדל), זמינות גם התחברות באמצעות סיסמה וגם התחברות באמצעות OIDC. | - -### רשת (15) - -| מפתח | סוג | ברירת מחדל | הפעלה מחדש | תיאור | -| ----------------------------------------------- | ------- | ---------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | הפעלת מצב הסוואה של טביעת אצבע של TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | מתן אפשרות לנתיבי /v1/audio/* להשתמש בצומתי ספק תואמי OpenAI המתארחים מחוץ ל-localhost. מושבת כברירת מחדל — ניתוב שמע למארח מרוחק משנה את זהות תעבורת היציאה ומחייב החלטה מפורשת של המפעיל. צומתי loopback מותרים תמיד ואינם מושפעים. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | כאשר לא מוקצה proxy לחיבור, בחירה אוטומטית של ה-proxy התקין הראשון מתוך הרישום. מושבת כברירת מחדל (אחרת כל proxy ברישום הופך לחלופה גלובלית — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | מתן אפשרות לתהליכי OAuth ואימות ספק לעקוף proxy מקובע ולהתחבר ישירות כאשר בדיקות נגישות מקדימות של ה-proxy נכשלות. מושבת כברירת מחדל משום שהדבר עשוי לשנות את כתובת ה-IP של תעבורת היציאה. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | בעת חריגת רשת (פסק זמן, חיבור שנדחה/אופס) במבצע רוטציה מרובה-חשבונות, כאשר לחשבון שנכשל אין proxy ייעודי, החלת תקופת צינון קצרה ודילוג על חשבונות אחרים ללא proxy למשך יתרת הבקשה, במקום לנסות כל אחד מהם מחדש. מופעל כברירת מחדל (בטוח: אין שינוי בכתובת ה-IP של תעבורת היציאה; רק מופחת הסיכון להשהיה/צינון בחשבונות בעלי תעבורת יציאה משותפת). יש להשבית כדי לשחזר הפצה מיידית בעת החריגה הראשונה מחשבון ללא proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | מאגרי proxy והרוטציה לכל חשבון של opencode מפסיקים להקצות מחדש proxy שזה עתה נכשל (בדיקת TCP שנדחתה, או תגובת 429 שהתקבלה דרכו) למשך פרק זמן לכל תהליך, המוכפל בכל כשל חוזר עד לתקרה. לא נכתב מצב proxy; כאשר כל מועמד מושהה, הבחירה נותרת ללא שינוי. מושבת כברירת מחדל. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | הצגה בלוח הבקרה, תחת מאגר proxy, של מספר כתובות ה-IP הנצפות של תעבורת היציאה ששירתו את חברי המאגר במהלך 24 השעות האחרונות ושל מספר החיבורים שהשתמשו בהן. לקריאה בלבד, מחושב מיומן ה-proxy ולעולם אינו משמש לניתוב. מושבת כברירת מחדל. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | עבור מבצע OpenCode, מעקב אחר הבית הראשון בגוף של תשובת Responses מוזרמת (חלון: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, ברירת מחדל `15000`). זרם Responses עם 2xx שנותר ללא נתונים מעבר לחלון נחשב לתקוע: החשבון מועבר לצינון והבקשה עוברת ברוטציה לחשבון הבא פעם אחת; תקיעה שנייה גורמת לכשל מיידי. מושבת כברירת מחדל: זרמים תקועים ממשיכים להמתין כפי שהם ממתינים כיום, עד לפסק הזמן של מוכנות הזרם. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | מבצע OpenCode: בעת תגובת 403/451 הכוללת סירוב מסוג `user_blocked` (לא חסימה גאוגרפית ולא דחייה של טביעת אצבע מצד Cloudflare), העברת החשבון שסורב לצינון ומעבר ברוטציה לחשבון הבא פעם אחת לכל היותר בכל בקשה; סירוב שני מוחזר כפי שהוא, ללא סימון הצלחה. מושבת כברירת מחדל: עקיפת חסימת משתמש מצד ספק במעלה הזרם עלולה להיראות כהתחמקות ולהפיץ את הסימון ברחבי מערך החשבונות. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | רוטציית OpenCode: לאחר שני כשלי upstream זמניים רצופים (5xx או 400 ריק), יש להשהות לפני החשבון הבא — 1.5 שניות, עם הכפלה בכל כשל נוסף, עד לתקרה של 6 שניות לכל השהיה ו-10 שניות לכל בקשה; ההשהיה אינה מתבצעת בעת ניתוק הלקוח; גוף התגובה שנכשלה משוחרר לפני ההמתנה. מושבת כברירת מחדל: המעבר בעת כשל נשאר מיידי. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | רוטציית OpenCode: יש לעצור את סבב החשבונות בשגיאת 429 הראשונה המסווגת כהגבלת קצב אמיתית (`Retry-After` שניתן לנתח, או גוף תגובה המציין מגבלת קצב/שימוש) ולהחזיר את שגיאת 429 מה-upstream ללא שינוי. בשגיאות 429 שאינן מסווגות ממשיכים ברוטציה. מושבת כברירת מחדל: המסלול החינמי מוגבל לפי כתובת IP יוצאת (#9611), ולכן כל שגיאת 429 גורמת לרוטציה, וסבב שמיצה את כל האפשרויות מחזיר את שגיאת 429 האחרונה מה-upstream. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | השבתת אימות אישורי TLS עבור פרוקסי MITM. **מסוכן.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | מתן אפשרות לכתובות URL של ספקים המצביעות לרשתות פרטיות/פנימיות. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | מתן אפשרות להוסיף/לאמת ספקים בכתובות מקומיות/פרטיות (127.0.0.1, localhost, LAN). מופעל כברירת מחדל (העדפה למקומי); יש להשבית לצורך חסימה מחמירה של כתובות שאינן ציבוריות. מטא-נתונים של שירותי ענן נותרים חסומים. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | הפעלת מצב ספק תואם Claude Code. | +| מפתח | סוג | ברירת מחדל | תיאור | +| --------------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | דרישת מפתח API עבור כל הבקשות הנכנסות. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | הפעלת ניקוי קלט עבור כל הבקשות. | +| `INJECTION_GUARD_MODE` | enum | `off` | מצב ההגנה מפני הזרקת הנחיות. ערכים: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | השחרת מידע המאפשר זיהוי אישי בבקשות (ללא תלות ב-`INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | ניקוי מידע המאפשר זיהוי אישי מתגובות הספק. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | מצב לניקוי מידע המאפשר זיהוי אישי מתגובות. ערכים: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | חסימת בקשות יוצאות לטווחי כתובות IP פרטיים/פנימיים. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | מתן אפשרות למשתמשי לוח המחוונים שעברו אימות לחשוף מפתחות API שמורים, במקום לראות ערכים מוסווים בלבד. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | הכללת קידומת החשבון בשורות יומן AUTH (לדוגמה, "שימוש בחשבון : abc12345..."). מושבת כברירת מחדל, כך שמזהי חשבונות מושחרים ביומני תהליכים משותפים/מרובי-דיירים. אפשרות זו אינה תלויה במצב ניפוי השגיאות; שינוי מצב ניפוי השגיאות אינו חושף מידע זה. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | כאשר OIDC מופעל, השבתת כניסה באמצעות סיסמה כדי שמשתמשים יוכלו לבצע אימות רק באמצעות כניסה יחידה של OIDC. כאשר האפשרות מושבתת (ברירת המחדל), זמינות גם כניסה באמצעות סיסמה וגם כניסה באמצעות OIDC. | + +### רשת (16) + +| מפתח | סוג | ברירת מחדל | הפעלה מחדש | תיאור | +| ----------------------------------------------- | ------- | ---------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | הפעלת מצב הסוואה של טביעת אצבע מסוג TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | מתן אפשרות לנתיבי /v1/audio/* להשתמש בצומתי ספק תואמי OpenAI המתארחים מחוץ ל-localhost. מושבת כברירת מחדל — ניתוב שמע למארח מרוחק משנה את זהות תעבורת היציאה, ולכן חייב להיות החלטה מפורשת של המפעיל. צומתי loopback מותרים תמיד ואינם מושפעים. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | מתן אפשרות ל-POST /v1/rerank (ולשלב הדירוג מחדש ב-loopback של מנוע הזיכרון) להשתמש בצומתי ספק תואמי OpenAI המתארחים מחוץ ל-localhost. מושבת כברירת מחדל — ניתוב למארח מרוחק משנה את זהות תעבורת היציאה, ולכן חייב להיות החלטה מפורשת של המפעיל. צומתי loopback מותרים תמיד; צמתים מרוחקים חייבים גם לעמוד במדיניות כתובות ה-URL היוצאות של הספק. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | כאשר לא מוקצה proxy לחיבור, בחירה אוטומטית של ה-proxy התקין הראשון מהמרשם. מושבת כברירת מחדל (אחרת כל proxy במרשם הופך לגיבוי גלובלי — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | מתן אפשרות לתהליכי OAuth ואימות ספק לעקוף proxy מוצמד ולהתחבר ישירות כאשר בדיקות מקדימות של נגישות ה-proxy נכשלות. מושבת כברירת מחדל משום שהדבר עלול לשנות את כתובת ה-IP של תעבורת היציאה. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | בעת חריגת רשת (פסק זמן, חיבור שנדחה/אופס) במבצע רוטציה מרובה-חשבונות, כאשר לחשבון שנכשל אין proxy ייעודי, החלת תקופת צינון קצרה ודילוג על חשבונות אחרים ללא proxy למשך שאר הבקשה, במקום לנסות כל אחד מהם מחדש. מופעל כברירת מחדל (בטוח: אין שינוי בכתובת ה-IP של תעבורת היציאה; רק מצמצם את הסיכון להשהיה/צינון בחשבונות החולקים תעבורת יציאה). יש להשבית כדי לשחזר העברה מיידית בעת ה-throw הראשון ללא proxy. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | מאגרי proxy והרוטציה לפי חשבון של opencode מפסיקים להקצות מחדש proxy שזה עתה נכשל (בדיקת TCP שנדחתה, או תגובת 429 שהתקבלה דרכו) למשך פרק זמן לכל תהליך, המוכפל בכל הישנות עד לתקרה. לא נכתב סטטוס proxy; כאשר כל המועמדים מושהים, הבחירה אינה משתנה. מושבת כברירת מחדל. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | הצגה בלוח המחוונים, תחת מאגר proxy, של מספר כתובות ה-IP הנצפות של תעבורת היציאה ששירתו את חבריו במהלך 24 השעות האחרונות ושל מספר החיבורים שהשתמשו בהן. לקריאה בלבד, מחושב מיומן ה-proxy ולעולם אינו משמש לניתוב. מושבת כברירת מחדל. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | עבור המבצע של OpenCode, מעקב אחר הבית הראשון בגוף של תשובת Responses מוזרמת (חלון: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, ברירת מחדל `15000`). זרם Responses עם קוד 2xx שנותר שקט מעבר לחלון נחשב תקוע: החשבון מועבר לצינון והבקשה מועברת פעם אחת לחשבון הבא; תקיעה שנייה גורמת לכישלון מיידי. מושבת כברירת מחדל: זרמים תקועים ממשיכים בהמתנה הנהוגה כיום עד לפסק הזמן של מוכנות הזרם. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | מבצע OpenCode: בעת שגיאת 403/451 הכוללת סירוב מסוג `user_blocked` (לא חסימה גאוגרפית ולא דחייה עקב טביעת אצבע של Cloudflare), העבר את החשבון שנדחה לתקופת צינון ועבור לחשבון הבא פעם אחת לכל היותר בכל בקשה; סירוב שני מוחזר כפי שהוא, ללא סימון הצלחה. מושבת כברירת מחדל: עקיפת חסימת משתמש מצד שירות המקור עלולה להיראות כניסיון התחמקות ולהפיץ את הסימון ברחבי מערך החשבונות. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | רוטציית OpenCode: לאחר שני כשלים זמניים רצופים בשירות המקור (5xx או 400 עם גוף ריק), השהה לפני המעבר לחשבון הבא — 1.5 שניות, עם הכפלה בכל כשל נוסף, עד לתקרה של 6 שניות לכל השהיה ו-10 שניות לכל בקשה; ההשהיה מבוטלת אם הלקוח מתנתק. גוף התגובה שנכשלה משוחרר לפני ההמתנה. מושבת כברירת מחדל: המעבר בעת כשל נשאר מיידי. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | רוטציית OpenCode: עצור את סבב החשבונות בשגיאת 429 הראשונה שסווגה כהגבלת קצב אמיתית (`Retry-After` שניתן לנתח, או גוף שמציין מגבלת קצב/שימוש), והחזר את שגיאת 429 משירות המקור ללא שינוי. שגיאות 429 שלא סווגו ממשיכות את הרוטציה. מושבת כברירת מחדל: השכבה החינמית מוגבלת לפי כתובת IP יוצאת (#9611), ולכן כל שגיאת 429 גורמת לרוטציה, וסבב שמיצה את כל החשבונות מחזיר את שגיאת 429 האחרונה משירות המקור. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | השבת את אימות אישורי TLS עבור שרת ה-proxy מסוג MITM. **מסוכן.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | אפשר כתובות URL של ספקים המצביעות לרשתות פרטיות/פנימיות. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | אפשר הוספה/אימות של ספקים בכתובות מקומיות/פרטיות (127.0.0.1, localhost, LAN). מופעל כברירת מחדל (גישה מקומית תחילה); השבת לצורך חסימה מחמירה המאפשרת כתובות ציבוריות בלבד. מטא-נתונים של שירותי ענן נשארים חסומים. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | הפעל מצב ספק תואם Claude Code. | ### מדיניות (5) -| מפתח | סוג | ברירת מחדל | תיאור | -| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | מצב אכיפת מדיניות השימוש בכלים. ערכים: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | הפעלה אוטומטית של הגבלת קצב בהתבסס על דפוסי שימוש. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | דילוג על הבדיקה המקומית של OmniRoute לחלון ההקשר / למספר אסימוני הקלט המרבי עבור בקשות ישירות למודל יחיד. מגבלות ה-upstream עדיין חלות. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | דחיית בקשות לפני שליחתן כאשר למודל היעד חסרות היכולות הנדרשות (ראייה, כלים, פלט מובנה, חלון הקשר). מגן על בקשות ישירות לספק יחיד העוקפות את מסנן התאימות של שכבת השילובים. | -| `RADAR_ENABLED` | boolean | `false` | הפעלת מודול OmniRoute Radar (מסכי פיד הקטלוג והסנכרון). מושבת כברירת מחדל; ההפעלה רק מאפשרת גישה לממשק המשתמש — סנכרון הנתונים נותר אפשרות נפרדת שיש להפעיל במפורש. | - -### זמן ריצה (32) - -| מפתח | סוג | ברירת מחדל | הפעלה מחדש | תיאור | -| ------------------------------------------- | ------- | ---------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | יצירה והזרקה של סיכומי שיחה כאשר ניתוב משולב עובר בין מודלים. השביתו אפשרות זו כדי להתייחס למעברים בין מודלים באופן עצמאי ולמנוע בקשות העברה ברקע עבור כל השילובים הקיימים והעתידיים. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | הסרת פריטי פלט פנימיים משלב הפרשנות מזרמי העברה ישירה של Responses API לפני העברתם ללקוחות. השביתו אפשרות זו כדי לקבל פרשנות גולמית מהשירות שבמעלה הזרם. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | אכיפת מגבלות היקף על הגישה לכלי MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | דחיסת תיאורי כלי MCP כדי לצמצם את השימוש בטוקנים. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | הפעלת עיבוד משימות רקע בזמן ריצה. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | השבתת כל שירותי הרקע (רענון מכסה, סנכרון וכו'). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | מתן אמון במסנני RTK ברמת הפרויקט ללא אימות. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | הפעלת שרת WebSocket של לוח הבקרה בזמן אמת בעת הייבוא (פורט 20132 כברירת מחדל). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | אפשר ל-Codex להשתמש בתעבורת Responses-over-WebSocket. כאשר האפשרות כבויה, Codex חוזר להשתמש ב-HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | אפשר ל-Codex להשתמש בתעבורת JSON-RPC דרך WebSocket של שרת היישום המקומי (codexTransport=app-server). כאשר האפשרות כבויה, חיבורים שהוגדרו לשימוש ב-app-server חוזרים להשתמש בתעבורות האחרות של Codex. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | נתב בקשות שתקציבן מוצה לספק/מודל החינמי לשעת חירום. (ראו [גיבוי חירום במקרה של מיצוי התקציב](#emergency-budget-fallback) להלן.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | אפשר ניסיון חוזר מוקדם ושקוף עבור זרמי SSE מקוטעים מהשירות במעלה הזרם, לפני שבתי תגובה כלשהם מגיעים ללקוח. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | אפשר לשחזור הזרם לשלוח מחדש את הבקשה ולחבר את התגובה לאחר שבתי תגובה כבר הגיעו ללקוח. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | הפוך המשך באמצע הזרם לבטוח עבור קריאות לכלים: לעולם אל תמשיך זרם שנקטע לאחר שנפלטה קריאה לכלי (בביצוע או שכבר הסתיימה עם finish_reason tool_calls), וסגור לאחר המשך ריק אחד במקום לנצל את מלוא התקציב. כבוי: התנהגות גרסת ההפצה. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | עבור פעם אחת לחיבור מקביל כאשר זרם SSE נסגר לפני שנפלטה מסגרת שימושית כלשהי וניסיון החזרה המוגבל באותו חיבור מוצה; אם אין חיבור מקביל שמיש, מוחזרת שגיאת 502 המקורית מסוג `STREAM_EARLY_EOF`. כבוי כברירת מחדל: EOF מוקדם נשאר סופי לאחר ניסיון החזרה באותו חיבור. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | כלול שדות שם ידידותיים לתצוגה בתגובות `/v1/models`. השבת עבור לקוחות שמצפים למזהי מודלים בלבד. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | קובע כיצד מתווספות קידומות למזהי מודלים ב-/v1/models. האפשרות 'dual' (ברירת המחדל) מפיקה גם קידומות כינוי וגם קידומות מזהה ספק קנוניות, לצורך תאימות לאחור. האפשרות 'alias' מפיקה רק את קידומת הכינוי הקצרה (למשל ds-web/model, ולא deepseek-web/model). האפשרות 'canonical' מפיקה רק את קידומת מזהה הספק המלאה. ערכים: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | אפשר סנכרון ELO תקופתי של טבלת המובילים של Arena AI עבור דירוגי אינטליגנציה של מודלים. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | פרסום מזהי מראה מסוג `claude//` ב-`/v1/models`, כדי שגילוי המודלים בשער Claude Code יציג מודלים שאינם של Claude. הרמה הגלובלית של השער התלת-רמתי (משתנה הסביבה גובר על דריסת הערך בלוח הבקרה). ראו [הגדרת Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | מתג ראשי לכינויי השער no-think//. כאשר הוא מופעל (ברירת המחדל): /v1/models מפרסם וריאנט ללא חשיבה עבור כל מודל Claude מתאים שתומך בחשיבה, ומזהה no-think/ שנשלח בבקשה מפוענח בחזרה למודל האמיתי תוך דיכוי ההנמקה. כאשר הוא כבוי: לא מפורסמים וריאנטים, ומזהה no-think/ מטופל כמו כל מזהה מודל לא מוכר אחר. ההצטרפות/החרגה באמצעות ModelSpec.noThinkingAlias לכל מודל עדיין חלה כאשר אפשרות זו מופעלת. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | השבתת היצירה של וריאנטים לרמות חשיבה (למשל -low, -medium, -high) בקטלוג /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | הפעלת נתיבי קבלה וירטואליים מסתגלים לכל דייר עבור שיגור לספק (#9654): פרץ תעבורה של דייר אחד לא יגרום עוד לשגיאות 503 אצל דייר אחר. משתנה הסביבה OMNIROUTE_CHAT_VIRTUAL_LANES גובר על דריסת ערך זו בלוח הבקרה; השינויים נכנסים לתוקף בעת הפעלת השרת מחדש. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | פרסום מזהי מראה מסוג / ב-/v1/models עבור מודלים שלבעלים הקנוני שלהם אין אישור גישה פעיל, אך שער מעבר בעל אישור גישה פעיל מנתב אותם. אזהרה: כאשר אפשרות זו מופעלת גלובלית, היא מוסיפה רשומות לקטלוג עבור כל הלקוחות. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | הפעלת זיהוי יתרה עבור צמתים תואמי אגרגטור מסוג New-API / One-API / Sub2API. כאשר אפשרות זו מופעלת, צמתים תואמים שדגל האגרגטור מוגדר אצלם ידווחו על היתרה שלהם בלוח הבקרה ובניתוב בדיקת המכסה המקדימה. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | המשך קריאות לכלים בבעלות השרת שאינן בהזרמה, עד שהמודל מחזיר תגובה שהלקוח יכול להשתמש בה. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | סטטיסטיקות חיפוש וחיפושים אחרונים סופרים רק ספקים שעדיין יש להם חיבור פעיל (ספקים ללא מפתח, כגון duckduckgo-free, נספרים תמיד). כאשר האפשרות כבויה, נשמרת כל שורת חיפוש שנשמרה עם מזהה ספק. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | דפי ספקים בלוח הבקרה: הצגת תג החינם רק לפי אותות שהספק מכבד — ללא היוריסטיקת שם התצוגה, שדות חינם שאינם בוליאניים וסיומות :free אצל ספקים רשומים ללא מסלול חינמי מתועד. כאשר האפשרות כבויה, נשמר כלל התג ההיסטורי. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | בתגובות אי-זמינות מאוגדות מסוג 429/503, השמטת `Retry-After` כאשר לא ידוע מועד קונקרטי עתידי לניסיון חוזר (במקום ערך מלאכותי של שנייה אחת), הוספת `error.retry_after_provenance` (`signal` \| `none`), ואפשרות לנתיבי ריקון משולבים לקרוא רמזים מילוליים לניסיון חוזר מגופי JSON ומגופי טקסט פשוט במעלה הזרם. השדה מופיע רק בתגובות שנבנו באמצעות `unavailableResponse()`; גופי 429/503 אחרים נותרים ללא שינוי. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | כאשר יעד בשילוב `priority`, המסומן כיעד חלופי רק במקרה של מיצוי מכסה, עוצר את השילוב מסיבה שניתן להוכיח שאינה קשורה למכסה (מפסק המעגל של הספק פתוח, דילוג עקב חיזוי השהיה), יש להשיב 502 במקום 503 שנראה כקשור למכסה. עצירות עקב נעילה, תקופת צינון, חוסר זמינות, מיצוי והגבלת מקביליות ממשיכות להחזיר 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | תגובת 401 בסיסית של Mistral (`{"detail":"Unauthorized"}`, ללא אות אימות מפורש) זהה עבור מפתח שבוטל ועבור מכסה שמוצתה. כאשר האפשרות מופעלת, החיבור מועבר לתקופת צינון במקום לסמן אותו כ-`expired`, לכל היותר 3 פעמים בשעה לכל חיבור; בפעם הבאה הוא מסומן כך, ולכן מפתח שבוטל עדיין מתכנס למצב זה. מושבת כברירת מחדל: כל תגובת 401 בסיסית של Mistral מסמנת את החיבור כפי שהיה בעבר. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | אחזור קטלוג המודלים העדכני של xAI עבור חיבורי `xai-oauth` מ-`https://api.x.ai/v1/models` באמצעות אסימון הנושא של OAuth, במקום הרשימה הסטטית הקבועה. מושבת כברירת מחדל: `xai-oauth` ממשיך לספק את הרשימה הסטטית ללא שינוי. בכל שגיאת פתרון, הגילוי חוזר לרשימה הסטטית (לא אומת אם x.ai מקבל אסימון נושא של OAuth בנקודת קצה זו). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | מאפשר לסריקת הניקוי האוטומטית למחוק משימות Batch API סופיות (שהושלמו/נכשלו/בוטלו/פג תוקפן) שגילן עולה על `OMNIROUTE_BATCH_RETENTION_DAYS`, יחד עם נקודות הביקורת שלהן לכל שורה, ולנקות את תוכן ה-BLOB של קבצים שהועלו לאחר שחלף ערך ה-`expires_at` שלהם. מושבת כברירת מחדל: כל התקנה קיימת שומרת את הנתונים האלה בדיוק כפי שהיה בעבר, עד שמפעיל המערכת מצטרף במפורש. הנתיב `DELETE /api/v1/batches/delete-completed`, המופעל בידי מפעיל המערכת, אינו מושפע בכל מקרה — זהו חוזה API ציבורי נפרד ובלתי מותנה. | +| מפתח | סוג | ברירת מחדל | תיאור | +| ------------------------------- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | מצב אכיפת מדיניות השימוש בכלים. ערכים: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | הפעל אוטומטית הגבלת קצב על סמך דפוסי שימוש. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | דלג על הבדיקה המקומית של OmniRoute לחלון ההקשר / למספר המרבי של אסימוני קלט בבקשות ישירות למודל יחיד. המגבלות של שירות המקור עדיין חלות. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | דחה בקשות לפני שליחתן כאשר למודל היעד חסרות יכולות נדרשות (ראייה, כלים, פלט מובנה, חלון הקשר). מגן על בקשות ישירות לספק יחיד שעוקפות את מסנן התאימות של שכבת השילובים. | +| `RADAR_ENABLED` | boolean | `false` | הפעל את מודול OmniRoute Radar (מסכי פיד הקטלוג והסנכרון). מושבת כברירת מחדל; הפעלתו פותחת רק את ממשק המשתמש — סנכרון הנתונים עדיין דורש הצטרפות נפרדת. | + +### זמן ריצה (33) + +| מפתח | סוג | ברירת מחדל | הפעלה מחדש | תיאור | +| ------------------------------------------- | ------- | ---------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | בוליאני | `true` | | יצירה והזרקה של סיכומי שיחה כאשר ניתוב משולב עובר בין מודלים. השביתו כדי להתייחס למעברים בין מודלים באופן בלתי תלוי ולמנוע בקשות העברה ברקע עבור כל השילובים הקיימים והעתידיים. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | בוליאני | `true` | | הסרת פריטי פלט פנימיים משלב הפרשנות מזרמי העברה ישירה של Responses API לפני העברתם ללקוחות. השביתו כדי לקבל פרשנות גולמית מהמקור. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | בוליאני | `true` | | אכיפת מגבלות תחום על הגישה לכלי MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | בוליאני | `false` | | דחיסת תיאורי כלי MCP כדי לצמצם את השימוש בטוקנים. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | בוליאני | `false` | | הפעלת עיבוד משימות רקע בזמן ריצה. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | בוליאני | `false` | ✓ | השבתת כל שירותי הרקע (רענון מכסה, סנכרון וכו'). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | מתן אמון במסנני RTK ברמת הפרויקט ללא אימות. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | הפעלת שרת WebSocket של לוח המחוונים בזמן אמת בעת הייבוא (יציאה 20132 כברירת מחדל). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | מתן אפשרות ל-Codex להשתמש בתעבורת Responses-over-WebSocket. כאשר האפשרות כבויה, Codex חוזר להשתמש ב-HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | מתן אפשרות ל-Codex להשתמש בתעבורת JSON-RPC דרך WebSocket של app-server המקומי (codexTransport=app-server). כאשר האפשרות כבויה, חיבורים שהוגדרו להשתמש ב-app-server חוזרים לתעבורות האחרות של Codex. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | ניתוב בקשות שמיצו את התקציב לספק/מודל החינמי לשעת חירום המשמש כברירת מחדל חלופית. (ראו [ברירת מחדל חלופית לשעת חירום במקרה של מיצוי התקציב](#emergency-budget-fallback) להלן.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | הפעלת ניסיון חוזר מוקדם ושקוף עבור זרמי SSE קטועים במעלה הזרם, לפני שבתי תגובה כלשהם מגיעים ללקוח. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | מתן אפשרות לשחזור הזרם לשלוח מחדש את הבקשה ולחבר את התגובה לאחר שבתי תגובה כבר הגיעו ללקוח. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | הפיכת ההמשך באמצע הזרם לבטוח עבור קריאות לכלים: לעולם אין לחדש זרם שנקטע לאחר שנפלטה קריאה לכלי (בביצוע או שכבר הסתיימה עם finish_reason מסוג tool_calls), ויש לסגור לאחר המשך ריק אחד במקום לנצל את כל התקציב. כבוי: התנהגות גרסת ההפצה. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | בצע מעבר לגיבוי פעם אחת לחיבור מקביל כאשר זרם SSE נסגר לפני שנפלטה מסגרת שימושית כלשהי ולאחר שמוצו ניסיונות החיבור החוזר המוגבלים באותו חיבור; אם אין חיבור מקביל שמיש, מוחזרת שגיאת 502 המקורית מסוג `STREAM_EARLY_EOF`. מושבת כברירת מחדל: EOF מוקדם נשאר סופי לאחר ניסיון החיבור החוזר באותו חיבור. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | כלול שדות שמות ידידותיים לתצוגה בתגובות `/v1/models`. השבת עבור לקוחות שמצפים למזהי מודלים בלבד. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | קובע כיצד מזהי מודלים מקבלים קידומת ב־/v1/models. הערך 'dual' (ברירת המחדל) מפיק גם קידומות כינוי וגם קידומות מזהה ספק קנוני, לצורך תאימות לאחור. הערך 'alias' מפיק רק את קידומת הכינוי הקצרה (למשל ds-web/model, ולא deepseek-web/model). הערך 'canonical' מפיק רק את קידומת מזהה הספק המלאה. ערכים: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | אפשר סנכרון ELO תקופתי של טבלת המובילים של Arena AI עבור דירוגי אינטליגנציה של מודלים. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | פרסם מזהי שיקוף מסוג `claude//` ב־`/v1/models`, כדי שגילוי המודלים בשער Claude Code יציג מודלים שאינם Claude. הרמה הגלובלית של מנגנון הבקרה התלת־רמתי (משתנה הסביבה גובר על ההגדרה העוקפת בלוח הבקרה). ראו [הגדרת Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | מתג ראשי עבור כינויי השער no-think//. כאשר מופעל (ברירת המחדל): /v1/models מפרסם וריאנט ללא חשיבה עבור כל מודל Claude מתאים בעל יכולת חשיבה, ומזהה no-think/ שנשלח בבקשה נפתר בחזרה למודל האמיתי תוך דיכוי ההסקה. כאשר מושבת: לא מפורסמים וריאנטים, ומזהה no-think/ מטופל כמו כל מזהה מודל לא מוכר אחר. הגדרת ההצטרפות/החרגה לכל מודל `ModelSpec.noThinkingAlias` עדיין חלה כאשר אפשרות זו מופעלת. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | השבת את יצירת וריאנטי רמות החשיבה (למשל -low, -medium, -high) בקטלוג /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | אפשר נתיבי קבלה וירטואליים מסתגלים לכל דייר עבור שיגור לספק (#9654): פרץ תעבורה של דייר אחד לא יגרום עוד לשגיאות 503 אצל דייר אחר. משתנה הסביבה `OMNIROUTE_CHAT_VIRTUAL_LANES` גובר על הגדרה עוקפת זו בלוח הבקרה; השינויים נכנסים לתוקף בעת הפעלה מחדש של השרת. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | בוליאני | `false` | | פרסום מזהי מראה בתבנית / עבור מודלים ב־/v1/models, כאשר לבעלים הקנוני שלהם אין פרטי אימות פעילים, אך שער מעבר בעל פרטי אימות פעילים מנתב אותם. אזהרה: הפעלה גלובלית מוסיפה רשומות קטלוג עבור כל הלקוחות. | +| `NEWAPI_AGGREGATOR_BALANCE` | בוליאני | `false` | | הפעלת זיהוי יתרה עבור צמתים התואמים לצוברי New-API / One-API / Sub2API. כאשר האפשרות מופעלת, צמתים תואמים שדגל הצובר מוגדר בהם ידווחו על היתרה שלהם בלוח המחוונים ובניתוב בדיקת המכסה המקדימה. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | בוליאני | `false` | | המשך קריאות לכלים בבעלות השרת שאינן מוזרמות, עד שהמודל מחזיר תגובה הניתנת לשימוש הלקוח. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | בוליאני | `false` | | סטטיסטיקות החיפוש והחיפושים האחרונים סופרים רק ספקים שעדיין יש להם חיבור פעיל (ספקים ללא מפתח, כגון duckduckgo-free, נספרים תמיד). כאשר האפשרות כבויה, נשמרת כל שורת חיפוש שנשמרה ושיש לה מזהה ספק. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | בוליאני | `false` | | דפי ספקים בלוח המחוונים: הצגת תג החינם רק לפי אותות שהספק מכבד — תוך הסרת היוריסטיקת שם התצוגה, שדות חינם שאינם בוליאניים וסיומות :free אצל ספקים רשומים שאין להם מסלול חינמי מתועד. כאשר האפשרות כבויה, נשמר כלל התג ההיסטורי. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | בוליאני | `false` | | בתגובות אי־זמינות מצטברות מסוג 429/503, השמטת `Retry-After` כאשר לא ידוע מועד קונקרטי עתידי לניסיון חוזר (במקום ערך מלאכותי של שנייה אחת), הוספת `error.retry_after_provenance` (`signal` \| `none`), ואפשרות לנתיבי ריקון משולבים לקרוא רמזים מילוליים לניסיון חוזר מגופי JSON ומגופי טקסט פשוט של שירותים במעלה הזרם. השדה מופיע רק בתגובות שנבנו באמצעות `unavailableResponse()`; גופי 429/503 אחרים אינם משתנים. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | בוליאני | `false` | | כאשר יעד משולב מסוג `priority`, המסומן כיעד חלופי רק בעת מיצוי המכסה, עוצר את השילוב מסיבה שניתן להוכיח שאינה קשורה למכסה (מפסק הזרם של הספק פתוח, דילוג עקב חיזוי השהיה), מוחזרת תגובת 502 במקום תגובת 503 הנראית כקשורה למכסה. עצירות עקב נעילה, תקופת צינון, אי־זמינות, מיצוי והגבלת מקביליות ממשיכות להחזיר 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | בוליאני | `false` | | תגובת 401 בסיסית של Mistral (`{"detail":"Unauthorized"}`, ללא אות אימות מפורש) זהה עבור מפתח שבוטל ועבור מכסה שמוצתה. כאשר האפשרות מופעלת, החיבור מועבר לתקופת צינון במקום לסמנו כ־`expired`, לכל היותר 3 פעמים בשעה לכל חיבור; התגובה הבאה מסמנת אותו כך, ולכן מפתח שבוטל עדיין מתכנס למצב זה. האפשרות כבויה כברירת מחדל: כל תגובת 401 בסיסית של Mistral מסמנת את החיבור כבעבר. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | אחזר את קטלוג המודלים העדכני של xAI עבור חיבורי `xai-oauth` מ־`https://api.x.ai/v1/models` באמצעות אסימון הנושא מסוג OAuth, במקום נתוני הבסיס הסטטיים והקבועים. מושבת כברירת מחדל: `xai-oauth` ממשיך להגיש את נתוני הבסיס הסטטיים ללא שינוי. בכל שגיאת זיהוי, מנגנון הגילוי חוזר לנתוני הבסיס (לא אומת אם x.ai מקבל אסימון נושא מסוג OAuth בנקודת קצה זו). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | אפשר לסריקת הניקוי האוטומטית למחוק משימות Batch API סופיות (שהושלמו/נכשלו/בוטלו/פג תוקפן) שגילן עולה על `OMNIROUTE_BATCH_RETENTION_DAYS`, יחד עם נקודות הביקורת שלהן לכל שורה, ולנקות את תוכן ה־BLOB של קבצים שהועלו לאחר המועד `expires_at` שלהם. מושבת כברירת מחדל: כל התקנה קיימת שומרת את הנתונים האלה בדיוק כפי שהיה קודם, עד שמפעיל יבחר להפעיל זאת. הנתיב `DELETE /api/v1/batches/delete-completed`, שמופעל על ידי המפעיל, אינו מושפע בכל מקרה — זהו חוזה API ציבורי נפרד ובלתי מותנה. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | שריין את חשבון Antigravity שנבחר למשך מחזור החיים של ההזרמה בבקשה שבחרה בו, כדי שניסיון חוזר מקביל או העברת פרטי הגישה לא יוכלו לבחור מחדש חשבון שכבר הוקצה להזרמה פעילה. השריון מוגבל לצמד (חיבור, מודל upstream שניתן לקריאה), כך שחשבון אחד עדיין יכול לשרת שני מודלים שונים בו־זמנית. כאשר כל החשבונות המתאימים כבר מושכרים עבור אותו מודל, הבקשה מחזירה שגיאת 503 מובנית מסוג `antigravity_pool_busy` עם `Retry-After` מוגבל, במקום להעמיס על חשבון עסוק. מושבת כברירת מחדל: בחירת החשבון נשארת בדיוק כפי שהייתה קודם, ולא מתבצע כל שריון. | ### CLI (5) -| מפתח | סוג | ברירת מחדל | הפעלה מחדש | תיאור | -| ------------------------------------- | ------- | ---------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | הפעלת מצב תאימות עבור כל לקוחות ה-CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | הפעלת שכבת תאימות לכינויי מודלים. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | הפעלת סנכרון אוטומטי של נתוני תמחור (דורש גם את משתנה הסביבה `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | לאחר סנכרון מודלים של ספק, כתיבה אוטומטית (מחדש) של קובצי הפרופיל ~/.codex/*.config.toml מהקטלוג העדכני. לעולם אין שינוי של תצורת Codex הפעילה/ברירת המחדל. מושבת כברירת מחדל. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | לאחר סנכרון מודלים של ספק, כתיבה אוטומטית (מחדש) של פרופילי Claude Code ב-~/.claude/profiles//settings.json מהקטלוג העדכני. לעולם אין שינוי של תצורת Claude הפעילה/ברירת המחדל. מושבת כברירת מחדל. | +| מפתח | סוג | ברירת מחדל | אתחול מחדש | תיאור | +| ------------------------------------- | ------- | ---------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | הפעל מצב תאימות עבור כל לקוחות ה־CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | הפעל את שכבת התאימות של כינויי מודלים. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | הפעל סנכרון אוטומטי של נתוני תמחור (דורש גם את משתנה הסביבה `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | לאחר סנכרון מודלים של ספק, כתוב אוטומטית (מחדש) קובצי פרופיל ~/.codex/*.config.toml מתוך הקטלוג העדכני. לעולם אינו משנה את תצורת Codex הפעילה/ברירת המחדל. מושבת כברירת מחדל. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | לאחר סנכרון מודלים של ספק, כתוב אוטומטית (מחדש) פרופילי Claude Code מסוג ~/.claude/profiles//settings.json מתוך הקטלוג העדכני. לעולם אינו משנה את תצורת Claude הפעילה/ברירת המחדל. מושבת כברירת מחדל. | ### תקינות (5) -| מפתח | סוג | ברירת מחדל | תיאור | -| ----------------------------------------- | ------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | בוליאני | `false` | השבתת נקודת הקצה של בדיקת התקינות של המופע המקומי. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | בוליאני | `false` | השבתת בדיקת התקינות של אימות האסימון. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | בוליאני | `false` | הפעלת גישה לרשת בסביבת ארגז החול של המיומנויות. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | בוליאני | `false` | בסריקת תקינות ה־proxy, בדיקה שהיעד דחה (401/403/429) מאפסת את רצף הכשלים העוקבים של ה־proxy. האפשרות כבויה כברירת מחדל: דחייה נשארת ניטרלית (#10654). תגובת 5xx נשארת בלתי מכרעת בכל מקרה; דחייה לעולם אינה מסירה, משביתה או מפעילה מחדש proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | בוליאני | `false` | הפעלת בדיקת השלמות/התקינות של מסד הנתונים בעת האתחול לאחר שהשרת מתחיל לקבל בקשות (באמצעות `setImmediate`), במקום לחסום את האתחול עד להשלמתה (#13717). האפשרות כבויה כברירת מחדל: האתחול נחסם בדיוק כפי שנחסם לפני PR זה. | +| מפתח | סוג | ברירת מחדל | תיאור | +| ----------------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | בוליאני | `false` | השבתת נקודת הקצה של בדיקת התקינות של המופע המקומי. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | בוליאני | `false` | השבתת בדיקת התקינות של אימות האסימון. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | בוליאני | `false` | הפעלת גישה לרשת בסביבת ארגז החול של המיומנויות. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | בוליאני | `false` | בסריקת תקינות ה-proxy, בדיקה שהיעד סירב לה (401/403/429) מאפסת את רצף הכשלים העוקבים של ה-proxy. מושבת כברירת מחדל: סירוב נשאר ניטרלי (#10654). תגובת 5xx נשארת בלתי מכרעת בכל מקרה; סירוב לעולם אינו מסיר, משבית או מפעיל מחדש proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | בוליאני | `false` | הרצת בדיקת השלמות/התקינות של מסד הנתונים בעת ההפעלה לאחר שהשרת מתחיל לקבל בקשות (באמצעות `setImmediate`), במקום לחסום את ההפעלה עד להשלמתה (#13717). מושבת כברירת מחדל: ההפעלה נחסמת בדיוק כפי שנחסמה לפני PR זה. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` והכינוי הישן שלו > `INJECTION_GUARD_BLOCK_THRESHOLD` מכווננים את מצב `block` של > `INJECTION_GUARD_MODE`, אך הם משתני סביבה רגילים שנקראים על ידי > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> ולא דגלי תכונה: אין להם דריסה במסד הנתונים ואין להם מתג בלוח הבקרה. ראו +> ולא דגלי תכונות: אין להם דריסה במסד הנתונים ואין להם מתג בלוח הבקרה. ראו > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] -> העמודה `Restart` מסמנת דגלים עם `requiresRestart: true` — הערך -> נשמר מיידית, אך נכנס לתוקף רק לאחר טעינת התהליך מחדש. דגלי enum -> דוחים כל ערך שאינו בקבוצת הערכים המותרת שלהם (מאומת בצד השרת הן -> ב־`setFeatureFlagOverride()` והן במטפל `PUT` של REST). +> העמודה `Restart` מסמנת דגלים עם `requiresRestart: true` — הערך נשמר +> באופן מיידי, אך נכנס לתוקף רק לאחר שהתהליך נטען מחדש. דגלי enum +> דוחים כל ערך שאינו שייך לקבוצת הערכים המותרת שלהם (האימות מתבצע בצד השרת +> הן ב-`setFeatureFlagOverride()` והן במטפל `PUT` של REST). --- -## החלפת מצבי דגלים +## הפעלה וכיבוי של דגלים ### לוח הבקרה @@ -174,15 +176,15 @@ (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) תומכת באפשרויות הבאות: -- **חיפוש** לפי מפתח או תיאור, ו**סינון** לפי קטגוריה (וכן תצוגה סינתטית של - **דורש הפעלה מחדש**). -- **מתג** לדגלים בוליאניים ו**רשימה נפתחת** לדגלי enum +- **חיפוש** לפי מפתח או תיאור, ו**סינון** לפי קטגוריה (וכן תצוגת + **דורש הפעלה מחדש** סינתטית). +- **מתג** עבור דגלים בוליאניים ו**רשימה נפתחת** עבור דגלי enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - **תג מקור** לכל דגל — `DB`,‏ `ENV` או `DEF` — המציג מהיכן הגיע הערך האפקטיבי. - כפתור **איפוס** (מוצג רק עבור דגלים שמקורם ב-`DB`) להסרת הדריסה, וכפתור **איפוס כל הדריסות** בתחתית. -- כרזת **הפעלת השרת מחדש** כאשר דגל `requiresRestart` משתנה. +- כרזת **הפעלה מחדש של השרת** כאשר דגל `requiresRestart` משתנה. ### REST API @@ -192,7 +194,7 @@ #### `GET /api/settings/feature-flags` -מחזיר כל דגל יחד עם הערך האפקטיבי שלו, המקור וסיכום. +מחזירה את כל הדגלים יחד עם הערך האפקטיבי, המקור והסיכום שלהם. ```jsonc { @@ -210,7 +212,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... כל 72 הדגלים + // ... כל 74 הדגלים ], "summary": { "total": 56, @@ -224,11 +226,11 @@ #### `PUT /api/settings/feature-flags` -מגדיר או מסיר דריסה יחידה. גוף הבקשה: `{ key: string; value?: string }`. +הגדרה או הסרה של דריסה יחידה. גוף הבקשה: `{ key: string; value?: string }`. השמטת `value` מסירה את הדריסה (ומשחזרת את ערך הסביבה / ברירת המחדל). ```bash -# הגדרת דריסת DB +# הגדרת דריסה במסד הנתונים curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' @@ -240,18 +242,18 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ ``` התגובה מחזירה את ה-`effectiveValue`/`source` החדשים, את ה-`previousValue`/ -`previousSource` ואת `requiresRestart`. מפתחות לא מוכרים וערכי enum שמחוץ לטווח +`previousSource` ואת `requiresRestart`. מפתחות לא מוכרים וערכי enum מחוץ לטווח נדחים עם `400`. #### `DELETE /api/settings/feature-flags` -מנקה את **כל** דריסות ה-DB בבת אחת, ומשחזר כל דגל לערך הסביבה / ברירת המחדל -שלו. מחזיר `{ cleared: , message: "..." }`. +מנקה את **כל** דריסות מסד הנתונים בבת אחת, ומשחזרת כל דגל לערך הסביבה / ברירת +המחדל שלו. מחזירה `{ cleared: , message: "..." }`. > [!NOTE] > דגלים עם `requiresRestart: true` נכנסים לתוקף רק לאחר טעינה מחדש של התהליך. -> תהליך ההפעלה מחדש של לוח הבקרה קורא אל `POST /api/restart` ולאחר מכן מבצע -> תשאול של `GET /api/health/ping` עד שהשרת חוזר לפעול. +> תהליך ההפעלה מחדש של לוח הבקרה קורא אל `POST /api/restart` ולאחר מכן מתשאל את +> `GET /api/health/ping` עד שהשרת חוזר לפעולה. --- diff --git a/docs/i18n/he/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/he/docs/reference/PROVIDER_REFERENCE.md index be479498563f..8d689b8097f5 100644 --- a/docs/i18n/he/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/he/docs/reference/PROVIDER_REFERENCE.md @@ -5,10 +5,10 @@ --- > **נוצר אוטומטית** מתוך `src/shared/constants/providers.ts` — אין לערוך ידנית. -> יצירה מחדש באמצעות: `npm run gen:provider-reference` -> **נוצר לאחרונה:** 2026-09-17 +> יש ליצור מחדש באמצעות: `npm run gen:provider-reference` +> **נוצר לאחרונה:** 2026-09-18 -סך כל הספקים: **359**. ראו להלן פירוט לפי קטגוריה. +סך ספקי השירותים: **359**. ראה פירוט קטגוריות להלן. ## קטגוריות @@ -32,49 +32,49 @@ --- -## ספקים ללא אימות (לא נדרש מפתח) (10) - -| מזהה | כינוי | שם | תגיות | אתר | הערות | קריאה לכלים | -| ----------------------- | ---------- | ------------------------- | ---------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -| `aihorde` | `horde` | AI Horde | ללא אימות | [קישור](https://aihorde.net) | לא נדרש מפתח API — נעשה שימוש במפתח האנונימי המתועד של AI Horde. הוספת מפתח חינמי מ־aihorde.net היא אופציונלית ומעניקה רק עדיפות גבוהה יותר בתור (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | ללא אימות | [קישור](https://augmentcode.com) | OmniRoute אינו מאחסן מפתח API. התקינו את Auggie CLI והריצו `auggie login` במכונה זו, ולאחר מכן OmniRoute יפעיל אותו מקומית עבור כל בקשה. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | ללא אימות | [קישור](https://playground.ai.cloudflare.com) | לא נדרשים פרטי גישה — הפעלות דפדפן אנונימיות באמצעות פרוטוקול WebSocket מסוג cf_agent שעבר הנדסה לאחור (תעבורת Playwright). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | ללא אימות | [קישור](https://developers.openai.com/codex/cli) | OmniRoute אינו מאחסן אסימון. שרת היישום של Codex CLI מנהל בעצמו את ההתחברות ל־ChatGPT‏ (`~/.codex/auth.json`, מתרענן אוטומטית). השתמשו ב״התחברות באמצעות ChatGPT״ אם ה־CLI טרם אומת. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | ללא אימות | [קישור](https://docs.devin.ai/work-with-devin/devin-cli) | האימות מנוהל על ידי Devin CLI הרשמי באמצעי האחסון המבודד של הגשר. | מדומה | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | ללא אימות | [קישור](https://duckduckgo.com/duckchat) | לא נדרשים פרטי גישה — DuckDuckGo AI Chat הוא אנונימי וחינמי. | מדומה | -| `opencode` | `oc` | OpenCode Free | ללא אימות | [קישור](https://opencode.ai) | לא נדרש מפתח API — נעשה שימוש בנקודת הקצה הציבורית והחינמית של OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | ללא אימות | [קישור](https://uncloseai.com) | לא נדרש אימות. ה־API מקבל כל מחרוזת שאינה ריקה כמפתח לצורך זיהוי. אם מודלים מובנים ישנים יותר מחזירים 404, השתמשו ב״מודלים זמינים״ ← ״ייבוא מ־`/models`״ או ״סנכרון אוטומטי״; מודל פעיל שאומת: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | ללא אימות, וידאו | [קישור](https://veoaifree.com) | לא נדרש אימות. מוגבל לקצב של 6 בקשות לשעה לכל כתובת IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | ללא אימות | [קישור](https://zcode.z.ai) | OmniRoute אינו מאחסן מפתח API. שרת היישום המקומי של ZCode משתמש בהתחברות הקיימת של builtin:zai-coding-plan. | — | - -## ספקי OAuth ‏(24) - -| מזהה | כינוי | שם | תגיות | אתר אינטרנט | הערות | -| --------------- | ------------- | ------------------------- | ----- | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [קישור](https://antigravity.google) | ייבוא פרטי ההתחברות שלכם ל-Antigravity CLI (`agy`) (באמצעות הדבקה/העלאה של קובץ האסימון שלו), זיהוי אוטומטי של התחברות מקומית ל-CLI, או התחברות באמצעות Google. משתמש באותו קצה עורפי של Antigravity (כולל מודלי Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [קישור](https://aws.amazon.com/q/developer/) | משתמש באותו AWS Builder ID או בתהליך של ייבוא אסימון רענון כמו Kiro, אך שומר את החיבורים של Amazon Q בנפרד. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [קישור](https://cline.bot/cline-pass) | ClinePass הוא מנוי של Cline במחיר $9.99 לחודש, הכולל 10 מודלים פתוחים לתכנות. התחברו באמצעות חשבון Cline שלכם (אותם פרטי התחברות כמו ב-Cline CLI/IDE), או הדביקו מפתח API ישיר של ClinePass ‏(app.cline.bot ← הגדרות ← מפתחות API). מנוי ClinePass פותח גישה למודלים cline-pass/*. נעשה שימוש חוזר בתהליך OAuth של Cline WorkOS. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [קישור](https://copilot.tencent.com) | Tencent CodeBuddy CN ‏(copilot.tencent.com). התחברו באמצעות תהליך קוד המכשיר הרשמי של ה-CLI, או הדביקו מפתח API ישיר (נשלח בתור Authorization: Bearer). קטלוג: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [קישור](https://cli.devin.ai) | נדרש קובץ ההפעלה של Devin CLI. הריצו `devin auth login` כדי לבצע אימות, או ספקו את WINDSURF_API_KEY שלכם. התקנה: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [קישור](https://devin.ai) | הדביקו מפתח API קיים של Devin מהפעלת Devin מאומתת. הזמינות והשלבים לייצוא המפתח משתנים בהתאם לגרסת Devin ולחשבון. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | הזינו את כתובת ה-URL של מופע GHE שלכם (למשל, https://ghe.company.com) בהגדרות הספק, ולאחר מכן בצעו אימות באמצעות תהליך המכשיר. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [קישור](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | OAuth של GitLab Duo אינו מוגדר. רשמו יישום OAuth בכתובת https://gitlab.com/-/profile/applications עם URI להפניה מחדש http://localhost:20128/callback והיקפי ההרשאה "ai_features read_user", לאחר מכן הגדירו את GITLAB_DUO_OAUTH_CLIENT_ID (ואפשר גם את GITLAB_DUO_OAUTH_CLIENT_SECRET) והפעילו מחדש. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | התחברו באמצעות הדפדפן, או הדביקו את ~/.grok/auth.json שלכם (או את אסימון הגישה מסוג JWT) מ-Grok Build CLI; כך או כך, refresh_token מוחלף אוטומטית. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [קישור](https://www.kimi.com/code?aff=omniroute) | התחברו באמצעות אותו חשבון Kimi שבו משתמש Kimi Code CLI. ‏OmniRoute משתמש בתהליך OAuth של ה-CLI ובנקודות הקצה של Kimi Coding Plan. | -| `kiro` | `kr` | Kiro AI | OAuth | — | מסלול חינמי: 50 קרדיטים לחודש (כ-25K–100K אסימונים). ⚠️ תנאי השימוש של Kiro אוסרים שימוש דרך שרת proxy/מעטפת של צד שלישי. | -| `openference` | `of` | Openference | OAuth | [קישור](https://openference.com) | התחברו באמצעות חשבון Openference שלכם כדי לנתב בקשות דרך api.openference.com. נדרשת תוכנית פעילה לביצוע הסקה — OAuth עשוי לבצע אימות, אך להחזיר 402 בהיעדרה. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [קישור](https://trae.ai) | Trae היא סביבת פיתוח משולבת (IDE) מבוססת-AI של ByteDance (סוכן מרוחק SOLO). אשרו דרך trae.ai בחלון הקופץ, או התחברו ב-solo.trae.ai והדביקו את Cloud-IDE-JWT (נשלח בתור 'Authorization: Cloud-IDE-JWT ', בעל תוקף של כ-14 יום) כאסימון הגישה; web_id/biz_user_id/user_unique_id/scope/tenant/region מועברים דרך providerSpecificData. אין רענון ללא ממשק גרפי עבור אסימונים שהודבקו — יש להדביק אותם מחדש לאחר פקיעת התוקף. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [קישור](https://x.ai) | התחברו באמצעות xAI כדי להשתמש במודלים של api.x.ai, כגון Grok 4.5. אפשרות זו נפרדת מהפעלות JWT של Grok Build, המשתמשות ב-cli-chat-proxy.grok.com ובכינויי מודלים של grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [קישור](https://zed.dev) | Zed מאחסן את פרטי הגישה לספקי LLM ‏(OpenAI, Anthropic, Google, Mistral, xAI) במחזיק המפתחות של מערכת ההפעלה. השתמשו בלחצן הייבוא שלהלן כדי לאתר ולייבא אותם אוטומטית. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [קישור](https://zed.dev) | התחברו באמצעות חשבון Zed שלכם (התחברות דרך יישום מקומי). ‏OmniRoute יוצר זוג מפתחות RSA חד-פעמי ופותח את zed.dev כדי לאשר אותו — בהתקנה מרוחקת/ללא ממשק גרפי, העתיקו את כתובת ה-URL החוזרת שמתחילה ב-127.0.0.1 משורת הכתובת של הדפדפן והדביקו אותה בחזרה כאן. אפשרות זו נבדלת מרשומת ייבוא פרטי הגישה 'Zed IDE' שלעיל: היא מנתבת השלמות צ'אט דרך מאגד המודלים המתארחים של Zed עצמו (cloud.zed.dev), המספק גישה למודלים של Anthropic/OpenAI/Google/xAI במסגרת תוכנית Zed שלכם. | +## ספקי ללא אימות (אין צורך במפתח) (10) + +| ID | כינוי | שם | תגיות | אתר אינטרנט | הערות | קריאת כלי | +| ----------------------- | ---------- | -------------------------- | ---------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | +| `aihorde` | `horde` | AI Horde | ללא אימות | [קישור](https://aihorde.net) | אין צורך במפתח API — משתמש במפתח אנונימי מתועד של AI Horde. הוספת מפתח חינמי של aihorde.net היא אופציונלית ורק מקנה עדיפות גבוהה יותר בתור (תודות). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | ללא אימות | [קישור](https://augmentcode.com) | אין מפתח API מאוחסן על ידי OmniRoute. התקן את ה-Auggie CLI והפעל `auggie login` במחשב זה, ואז OmniRoute מפעיל אותו מקומית עבור כל בקשה. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | ללא אימות | [קישור](https://playground.ai.cloudflare.com) | אין צורך באישורים — הפעלות דפדפן אנונימיות על פרוטוקול WebSocket מהונדס לאחור של cf_agent (העברת Playwright). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (שרת יישומים) | ללא אימות | [קישור](https://developers.openai.com/codex/cli) | אין אסימון מאוחסן על ידי OmniRoute. שרת היישומים של Codex CLI מנהל את הכניסה שלו ל-ChatGPT (~/.codex/auth.json, מתרענן אוטומטית). השתמש ב"התחבר עם ChatGPT" אם ה-CLI עדיין לא מאומת. | — | +| `devin-cli-agentic` | `dva` | גשר סוכני Devin CLI | ללא אימות | [קישור](https://docs.devin.ai/work-with-devin/devin-cli) | האימות נמצא בבעלות ה-Devin CLI הרשמי בנפח הגשר המבודד שלו. | מדומה | +| `duckduckgo-web` | `ddgw` | צ'אט AI של DuckDuckGo | ללא אימות | [קישור](https://duckduckgo.com/duckchat) | אין צורך באישורים — צ'אט AI של DuckDuckGo הוא אנונימי וחינמי. | מדומה | +| `opencode` | `oc` | OpenCode חינם | ללא אימות | [קישור](https://opencode.ai) | אין צורך במפתח API — משתמש בנקודת הקצה הציבורית החינמית של OpenCode. | — | +| `uncloseai` | `unc` | UncloseAI | ללא אימות | [קישור](https://uncloseai.com) | אין צורך באימות. ה-API מקבל כל מחרוזת לא ריקה כמפתח לזיהוי. אם מודלים מובנים ישנים יותר מחזירים 404, השתמש ב-Available Models → Import from /models או Auto-Sync; מודל חי מאומת: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI חינם | ללא אימות, וידאו | [קישור](https://veoaifree.com) | אין צורך באימות. מוגבל ל-6 בקשות/שעה לכל IP. | — | +| `zcode` | `zc` | ZCode (תוכנית קידוד GLM) | ללא אימות | [קישור](https://zcode.z.ai) | אין מפתח API מאוחסן על ידי OmniRoute. שרת היישומים המקומי של ZCode משתמש בכניסה הקיימת של builtin:zai-coding-plan. | — | + +## ספקי OAuth (24) + +| מזהה | כינוי | שם | תגיות | אתר אינטרנט | הערות | +| --------------- | ------------- | ------------------------- | ----- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [קישור](https://antigravity.google) | ייבא את פרטי ההתחברות שלך ל-Antigravity CLI (`agy`) (הדבק/העלה את קובץ האסימון שלו), זיהוי אוטומטי של התחברות CLI מקומית, או התחברות באמצעות Google. משתף את ה-backend של Antigravity (כולל מודלי Claude). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [קישור](https://aws.amazon.com/q/developer/) | משתמש באותו AWS Builder ID או בזרימת אסימון רענון מיובא כמו Kiro, אך שומר על חיבורי Amazon Q נפרדים. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [קישור](https://cline.bot/cline-pass) | ClinePass הוא מנוי של Cline בעלות $9.99 לחודש המאגד 10 מודלי קידוד פתוחים. התחבר עם חשבון Cline שלך (אותם פרטי התחברות כמו Cline CLI/IDE), או הדבק מפתח API ישיר של ClinePass (app.cline.bot → Settings → API Keys). מנוי ClinePass פותח את מודלי cline-pass/*. משתמש מחדש בזרימת ה-OAuth של Cline WorkOS. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [קישור](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). התחבר באמצעות זרימת קוד המכשיר הרשמית של ה-CLI, או הדבק מפתח API ישיר (נשלח כ-Authorization: Bearer). קטלוג: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [קישור](https://cli.devin.ai) | דורש את קובץ ההפעלה של Devin CLI. הפעל `devin auth login` כדי לאמת, או ספק את WINDSURF_API_KEY שלך. התקנה: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [קישור](https://devin.ai) | הדבק מפתח API קיים של Devin מתוך סשן מאומת של Devin. זמינות ושלבי ייצוא המפתח משתנים בהתאם לגרסת Devin ולחשבון. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | הזן את כתובת ה-URL של מופע ה-GHE שלך (לדוגמה, https://ghe.company.com) בהגדרות הספק, ולאחר מכן אמת באמצעות זרימת המכשיר. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [קישור](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth אינו מוגדר. רשום יישום OAuth בכתובת https://gitlab.com/-/profile/applications עם כתובת URL להפניה חוזרת http://localhost:20128/callback וסקופים "ai_features read_user", ולאחר מכן הגדר את GITLAB_DUO_OAUTH_CLIENT_ID (ואופציונלית GITLAB_DUO_OAUTH_CLIENT_SECRET) והפעל מחדש. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | התחבר באמצעות הדפדפן שלך, או הדבק את ~/.grok/auth.json שלך (או את אסימון הגישה JWT) מתוך Grok Build CLI; refresh_token מסתובב אוטומטית בכל מקרה. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [קישור](https://www.kimi.com/code?aff=omniroute) | התחבר עם אותו חשבון Kimi המשמש את Kimi Code CLI. OmniRoute משתמש בזרימת ה-OAuth של ה-CLI ובנקודות הקצה של Kimi Coding Plan. | +| `kiro` | `kr` | Kiro AI | OAuth | — | שכבה חינמית: 50 קרדיטים לחודש (~25K–100K אסימונים). ⚠️ תנאי השירות של Kiro אוסרים שימוש ב-proxy/harness של צד שלישי. | +| `openference` | `of` | Openference | OAuth | [קישור](https://openference.com) | התחבר עם חשבון Openference שלך כדי לנתב בקשות דרך api.openference.com. כולל גישה חינמית ל-Qwen3.8 27b ול-Llama 3.2 3B — ראה openference.com/pricing לתנאי התוכנית הנוכחיים. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [קישור](https://trae.ai) | Trae הוא IDE מבוסס AI מבית ByteDance (סוכן מרוחק SOLO). אשר באמצעות trae.ai בחלון הקופץ, או התחבר ב-solo.trae.ai והדבק את ה-Cloud-IDE-JWT (נשלח כ-'Authorization: Cloud-IDE-JWT ', ~14 ימי תוקף) כאסימון הגישה; web_id/biz_user_id/user_unique_id/scope/tenant/region מועברים דרך providerSpecificData. אין רענון ללא ראש עבור אסימונים שהודבקו — הדבק מחדש עם פקיעת התוקף. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [קישור](https://x.ai) | התחבר עם xAI כדי להשתמש במודלים של api.x.ai כגון Grok 4.5. זה נפרד מסשני JWT של Grok Build, המשתמשים ב-cli-chat-proxy.grok.com ובכינויי מודל של grok-build. | +| `zed` | `zd` | Zed IDE | OAuth | [קישור](https://zed.dev) | Zed מאחסן אישורי ספק LLM (OpenAI, Anthropic, Google, Mistral, xAI) במחזיק המפתחות של מערכת ההפעלה. השתמש בלחצן הייבוא למטה כדי לגלות ולייבא אותם אוטומטית. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [קישור](https://zed.dev) | התחבר עם חשבון Zed שלך (התחברות לאפליקציה מקורית). OmniRoute מייצר זוג מפתחות RSA חד-פעמי ופותח את zed.dev כדי לאשר אותו — בהתקנה מרוחקת/ללא ראש, העתק את כתובת ה-URL של הקריאה החוזרת 127.0.0.1 שנוצרה משורת הכתובת של הדפדפן שלך והדבק אותה בחזרה לכאן. נפרד מכניסת ייבוא האישורים 'Zed IDE' לעיל: זה מתווך השלמות צ'אט דרך מצבר המודלים המתארח של Zed עצמו (cloud.zed.dev), המציג מודלים של Anthropic/OpenAI/Google/xAI במסגרת תוכנית Zed שלך. | ## ספקי קובצי Cookie מהאינטרנט (34) @@ -115,252 +115,252 @@ | `zai-web` | `zw` | Z.ai Web | קובץ Cookie מהאינטרנט | [קישור](https://chat.z.ai) | העתיקו את הערך "token" מתוך chat.z.ai → DevTools → Application → Local Storage. אין להעתיק קובצי Cookie; ‏OmniRoute מטפל ב-CAPTCHA עבור כל בקשה באמצעות תעבורת הדפדפן שלו. | — | | `zenmux-free` | `zmf` | ZenMux Free (אינטרנט) | קובץ Cookie מהאינטרנט | [קישור](https://zenmux.ai) | התחברו ב-zenmux.ai, לאחר מכן יצאו את כל קובצי ה-Cookie באמצעות EditThisCookie או Cookie-Editor והדביקו כאן את מחרוזת כותרת ה-Cookie המלאה. רעננו בערך כל 30 יום. | — | -## ספקי מפתחות API (בתשלום / בתשלום עם נקודות זכות בחינם) (242) - -| ID | כינוי | שם | תגיות | אתר אינטרנט | הערות | -| ------------------------ | --------------- | ------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | מפתח API | [קישור](https://ai.360.cn) | קבלו מפתח API ב-ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | מפתח API, מאגד | [קישור](https://agentrouter.org) | קרדיטים חינמיים בסך $200 בהרשמה — שער ניתוב מרובה־מודלים | -| `agnes` | `agnes` | Agnes AI | מפתח API, וידאו | [קישור](https://agnes-ai.com) | קבלו מפתח API ב-agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (סין) | מפתח API | [קישור](https://api.agnes-ai.cn) | קבלו מפתח API מהאתר הסיני של Agnes. | -| `ai21` | `ai21` | AI21 Labs | מפתח API | [קישור](https://www.ai21.com) | קרדיטים לניסיון בסך $10 בהרשמה (תקפים למשך 3 חודשים), ללא צורך בכרטיס אשראי | -| `aimlapi` | `aiml` | AI/ML API | מפתח API, מאגד | [קישור](https://aimlapi.com) | המסלול החינמי הושהה (2026) — AI/ML API פועל כעת בתשלום לפי שימוש בלבד (טעינה מינימלית של $20); אין קרדיטים חינמיים חוזרים. | -| `ainative` | `ainative` | AINative Studio | מפתח API | [קישור](https://ainative.studio) | צרו מפתח API חינמי ב-ainative.studio (ללא כרטיס), ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `aion` | `aion` | Aion Labs | מפתח API | [קישור](https://www.aionlabs.ai) | צרו מפתח API חינמי ב-aionlabs.ai (ללא כרטיס), ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | מפתח API | [קישור](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (סין) | מפתח API | [קישור](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | מפתח API | [קישור](https://developer.ant-ling.com/en/docs/) | הירשמו וצרו מפתח API במסוף ה-API של Ant Ling‏ (https://chat.ant-ling.com/open), ולאחר מכן הדביקו אותו כאן. OmniRoute מנתב תעבורת צ'אט אל https://api.ant-ling.com/v1/chat/completions; הספק תואם ל-OpenAI ומציע גם ממשק תואם Anthropic. | -| `anthropic` | `anthropic` | Anthropic | מפתח API | [קישור](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | מפתח API, מאגד | [קישור](https://anyapi.ai) | מסלול חינמי: 100,000 אסימוני ANY ביום ו-100 RPM עבור מודלים זכאים מסוג Free/Basic; ללא צורך בכרטיס אשראי. | -| `api-airforce` | `af` | Api.airforce | מפתח API | [קישור](https://api.airforce) | 55 מודלים במסלול החינמי, כולל Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | מפתח API | [קישור](https://arcee.ai) | קבלו מפתח API ב-arcee.ai | -| `auriko` | `auriko` | Auriko | מפתח API, מאגד | [קישור](https://www.auriko.ai) | המסלול החינמי מפרסם 1,000 Platform RPM ו-10,000 BYOK RPM. הסקת Platform עדיין כפופה לעלות הספק; אין מדובר במאגר אסימונים חינמי או בהסקה חינמית ללא הגבלה. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | מפתח API, ארגוני | [קישור](https://learn.microsoft.com/azure/ai-foundry) | השתמשו במפתח Azure AI Foundry שלכם. כתובת ה-URL הבסיסית יכולה להיות https://.services.ai.azure.com/openai/v1/ או https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | מפתח API, ארגוני | [קישור](https://azure.microsoft.com/products/ai-services/openai-service) | השתמשו במפתח ה-API שלכם עבור Azure OpenAI. כתובת ה-URL הבסיסית צריכה להיות נקודת הקצה של המשאב שלכם, לדוגמה https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | מפתח API | [קישור](https://b.ai) | מפתח Bearer API עבור שער ה-LLM של b.ai התואם ל-OpenAI (להבדיל מ-TheB.AI). צרו מפתח בכתובת https://docs.b.ai, ולאחר מכן השתמשו ב-https://api.b.ai/v1 ככתובת ה-URL הבסיסית התואמת ל-OpenAI. | -| `baichuan` | `baichuan` | Baichuan | מפתח API | [קישור](https://www.baichuan-ai.com/) | קבלו מפתח API ב-platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | מפתח API | [קישור](https://ernie.baidu.com/) | קבלו מפתח API ב-console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | מפתח API | [קישור](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | מפתח API | [קישור](https://baseten.co) | קרדיטים חינמיים לניסיון בסך $30 עבור הסקת GPU | -| `bazaarlink` | `bzl` | BazaarLink | מפתח API | [קישור](https://bazaarlink.ai) | השתמשו במפתח ה-API שלכם עבור BazaarLink (מתחיל ב-sk-bl-) בתוך Authorization: Bearer . ה-SDK של OpenAI פועל עם כתובת ה-URL הבסיסית https://bazaarlink.ai/api/v1. מודלים משתמשים בתבנית provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | מפתח API, ארגוני | [קישור](https://aws.amazon.com/bedrock) | השתמשו במפתח ה-API שלכם עבור Amazon Bedrock והגדירו את אזור AWS שבו המודלים שלכם מופעלים (לדוגמה eu-west-2). OmniRoute קורא ישירות ל-Converse API המקורי של Bedrock. | -| `black-forest-labs` | `bfl` | Black Forest Labs | מפתח API, תמונה | [קישור](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | מפתח API | [קישור](https://blackbox.ai) | ⚠️ **הוצא משימוש.** api.blackbox.ai מחזיר HTTP 404 בכל וריאנט של נתיב (סריקה ב-2026-08-21); ממשק ההסקה הציבורי הועבר לנקודת הקצה המוגבלת enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | מפתח API | [קישור](https://www.bluesminds.com) | קרדיטי pi יומיים בחינם — תמיכה ביותר מ-200 מודלים, כולל GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | מפתח API | [קישור](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | מפתח API | [קישור](https://bytez.com) | קרדיטים חינמיים בסך $1, המתחדשים כל 4 שבועות | -| `cerebras` | `cerebras` | Cerebras | מפתח API | [קישור](https://inference.cerebras.ai) | קרדיט הרשמה חד־פעמי בסך $5 (בתוקף ל-30 יום); נדרש אמצעי תשלום. זה אינו מסלול חינמי מתחדש. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | מפתח API | [קישור](https://hyper.charm.land) | 100 Hypercredits חודשיים בחינם בהרשמה | -| `chat-oripe` | `chat-oripe` | Chat Oripe | מפתח API, מאגד | [קישור](https://api.oriper.com) | המטא־נתונים הרשמיים מפרסמים 2M אסימונים בחודש, אך האתר הציבורי והתיעוד נחסמו במהלך הביקורת; יש להתייחס למכסה ולמיפוי המותג כבלתי מאומתים. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | מפתח API, אגרגטור | [קישור](https://chatanywhere.tech) | לשימוש אישי, חינוכי או מחקרי בלבד: התיעוד הציבורי מציין 10,000 נקודות ביום ו-200 בקשות ביום לכל IP/מפתח; אין להשתמש לתעבורה מסחרית. | -| `cheaperinference` | `cinf` | Cheaper Inference | מפתח API | [קישור](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | מפתח API | [קישור](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | מפתח API, אגרגטור | [קישור](https://chutes.ai) | מפתח API מסוג Bearer עבור השער תואם-OpenAI של Chutes. | -| `clarifai` | `clarifai` | Clarifai | מפתח API, ארגוני | [קישור](https://docs.clarifai.com) | השתמשו ב-PAT של Clarifai או במפתח API ייעודי ליישום. OmniRoute פונה לנקודת הקצה תואמת-OpenAI בכתובת https://api.clarifai.com/v2/ext/openai/v1 ומבצע אימות באמצעות Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | מפתח API, אגרגטור | [קישור](https://cloudcode.one) | המודלים החינמיים שפורסמו כוללים את glm-4.7-flash ואת glm-4.6v-flash; לא פורסמה מכסה מספרית, ויצירת מפתח עשויה לדרוש אשראי או קופון. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | מפתח API | [קישור](https://developers.cloudflare.com/workers-ai) | נדרשים API Token וגם Account ID (נמצא ב-dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | מפתח API | [קישור](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | מפתח API | [קישור](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | מפתח API | [קישור](https://cohere.com) | תקופת ניסיון חינמית: 1,000 קריאות API בחודש לצורכי בדיקה, ללא צורך בכרטיס אשראי | -| `command-code` | `cmd` | Command Code | מפתח API | [קישור](https://commandcode.ai/) | השתמשו במפתח API של Command Code. הבקשות נשלחות לנקודת הקצה /provider/v1/chat/completions של Command Code. | -| `coze` | `coze` | Coze | מפתח API | [קישור](https://coze.com) | קבלו מפתח API ב-coze.com/open/api | -| `crof` | `crof` | CrofAI | מפתח API | [קישור](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | מפתח API | [קישור](https://cursor.com/dashboard/api) | הדביקו מפתח API של משתמש Cursor ‏(crsr_...) מתוך cursor.com/dashboard/api. ‏OmniRoute ממיר אותו לאסימון הפעלה לפי דרישה; אין צורך ב-IDE או בהתקנה של cursor-agent. השימוש מחויב בתוכנית Cursor שאליה שייך המפתח. | -| `dahl` | `dahl` | Dahl | מפתח API | [קישור](https://inference.dahl.global) | לחצו על 'Add Account' כדי ליצור אסימון באופן אוטומטי, או הוסיפו מפתח API ידני. | -| `databricks` | `databricks` | Databricks | מפתח API, ארגוני | [קישור](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | מפתח API, ארגוני | [קישור](https://docs.datarobot.com) | השתמשו באסימון ה-API של DataRobot. כתובת Base URL אופציונלית יכולה להיות כתובת השורש של החשבון (עבור LLM Gateway) או כתובת פריסה תחת /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | מפתח API, תמונה | [קישור](https://deepai.org) | השתמשו במפתח ה-API של DeepAI. ניתן לקבל מפתח ב-deepai.org — נדרש מינוי Pro ‏($9.99 לחודש). | -| `deepinfra` | `deepinfra` | DeepInfra | מפתח API | [קישור](https://deepinfra.com) | נקודות זכות חינמיות בהרשמה לצורך בדיקות API ובחינת מודלים | -| `deepseek` | `ds` | DeepSeek | מפתח API | [קישור](https://platform.deepseek.com) | 5 מיליון אסימונים חינמיים בהרשמה — ללא צורך בכרטיס אשראי | -| `dgrid` | `dgrid` | DGrid | מפתח API | [קישור](https://dgrid.ai) | נתב המודלים החינמיים של DGrid: ‏10 בקשות בדקה ו-100 בקשות ביום. טעינה חד-פעמית בסך $5 פותחת מכסה של עד 20 בקשות בדקה ו-1,000 בקשות ביום. | -| `dify` | `dify` | Dify | מפתח API | [קישור](https://dify.ai) | קבלו מפתח API ממופע Dify שלכם. | -| `digitalocean` | `digitalocean` | DigitalOcean | מפתח API | [קישור](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | מפתח API | [קישור](https://dit.ai) | השתמשו במפתח ה-API של dit.ai בתוך Authorization: Bearer . קיימת תאימות מלאה ל-OpenAI — זהו תחליף ישיר; יש לשנות רק את כתובת הבסיס ל-https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | מפתח API | [קישור](https://doubao.com) | קבלו מפתח API ב-console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | מפתח API, אגרגטור | [קישור](https://www.dxnt.com) | לפי התיעוד, חשבונות חינמיים מקבלים 100 קריאות ביום; המכסה עשויה לגדול באמצעות הזמנות ולהשתנות בין חשבונות. | -| `electronhub` | `electronhub` | Electron Hub | מפתח API, אגרגטור | [קישור](https://www.electronhub.ai) | תוכנית חינמית: 5 בקשות בדקה, נקודות זכות שבועיות בסך $0.25 ו-10 Neutrinos ביום עבור מודלים עם :free; חלות גם מגבלות תקציב משפחתיות. | -| `empower` | `empower` | Empower | מפתח API, אגרגטור | [קישור](https://docs.empower.dev) | מפתח API מסוג Bearer עבור נקודת הקצה תואמת-OpenAI של Empower. | -| `eurouter` | `eurouter` | EURouter | מפתח API, אגרגטור | [קישור](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | מפתח API | [קישור](https://factory.ai) | מפתח API מסוג Bearer עבור השער תואם-OpenAI של Factory. | -| `fal-ai` | `fal` | Fal.ai | מפתח API, תמונה | [קישור](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | מפתח API, אגרגטור | [קישור](https://fastrouter.ai) | מודלים עם הסיומת :free מאפשרים 10 בקשות ביום לכל ארגון ומודל; הזמינות עשויה להשתנות. | -| `featherless-ai` | `featherless` | Featherless AI | מפתח API | [קישור](https://featherless.ai) | זמינה שכבה חינמית — ללא צורך בכרטיס אשראי | -| `fenayai` | `fenayai` | FenayAI | מפתח API, אגרגטור | [קישור](https://fenayai.com) | מפתח API מסוג Bearer עבור השער תואם-OpenAI של FenayAI. | -| `fireworks` | `fireworks` | Fireworks AI | מפתח API | [קישור](https://fireworks.ai) | נקודות זכות התחלתיות חינמיות בסך $1 בהרשמה לצורך בדיקות API | -| `free-ai` | `free-ai` | Free.ai | מפתח API, אגרגטור | [קישור](https://free.ai) | 30,000 אסימונים ביום מכסים מודלים באירוח עצמי לאחר אימות דוא״ל. שימוש מעבר למאגר עשוי להיות מחויב בעלות הגולמית, ומודלים חיצוניים מתקדמים הם בתשלום. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | מפתח API | [קישור](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | מפתח API | [קישור](https://freebuff.com) | הזינו אסימון אימות של Freebuff / Codebuff (מתקבל באמצעות התחברות דרך CLI או כלי איסוף אוטומטי). | -| `freeinference` | `freeinference` | FreeInference | מפתח API, אגרגטור | [קישור](https://freeinference.org) | גישה חינמית למחקר ללא כרטיס; מועמדים שאינם מהרווארד זקוקים לאישור ידני, ולא מובטחת בפומבי מכסה מספרית. | -| `freemodel-dev` | `fmd` | FreeModel.dev | מפתח API | [קישור](https://freemodel.dev) | זיכויים חינמיים בסך $300 בעת ההרשמה — ללא צורך בכרטיס אשראי. גישה אל GPT-5.4 ו-GPT-5.5 (דגמי הדגל העדכניים ביותר של OpenAI) דרך API תואם OpenAI. | -| `freetheai` | `fta` | FreeTheAi | מפתח API, אגרגטור | [קישור](https://freetheai.xyz) | הצטרפו ל-Discord של FreeTheAi כדי לקבל מפתח API בחינם. | -| `friendliai` | `friendli` | FriendliAI | מפתח API | [קישור](https://friendli.ai) | מסלול חינמי להסקה ללא שרת — ללא צורך בכרטיס אשראי | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | מפתח API, אגרגטור | [קישור](https://g4f.space) | צרו זיכויי cake אנונימיים ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו מפתח ב-g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | מפתח API, אגרגטור | [קישור](https://g4f.space) | צרו זיכויי cake אנונימיים ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו מפתח ב-g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | מפתח API, אגרגטור | [קישור](https://g4f.space) | צרו זיכויי cake אנונימיים ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו מפתח ב-g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | מפתח API, אגרגטור | [קישור](https://g4f.space) | צרו זיכויי cake אנונימיים ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו מפתח ב-g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | מפתח API, אגרגטור | [קישור](https://g4f.space) | צרו זיכויי cake אנונימיים ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו מפתח ב-g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | מפתח API | [קישור](https://galadriel.com) | ⚠️ **הוצא משימוש.** api.galadriel.ai אינו נגיש עוד (סריקה מ-2026-06-19); נראה כי API ההסקה הופסק. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | מפתח API | [קישור](https://aistudio.google.com) | מסלול חינמי זמין דרך Google AI Studio; חלות המכסות הנוכחיות לכל דגם והמגבלות האזוריות | -| `getgoapi` | `ggo` | GoAPI | מפתח API, אגרגטור | [קישור](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | מפתח API | [קישור](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | מפתח API | [קישור](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | אסימון גישה אישי של GitLab עבור ה-API הציבורי של Code Suggestions. הגדירו כתובת URL בסיסית באירוח עצמי כאשר אינכם משתמשים ב-gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | מפתח API | [קישור](https://opengateway.gitlawb.com) | הגישה החינמית ל-MiMo ‏(xiaomi/mimo-v2.5) בוטלה ב-2026-05 — ‏Opengateway הוא כעת שער זיכויים בתשלום לפי שימוש; אין דגם חינמי מתחדש. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | מפתח API | [קישור](https://opengateway.gitlawb.com) | מבצע Nemotron החינמי הסתיים ב-2026-06 — הנתיב של GMI Cloud זמין כעת רק באמצעות זיכויים בתשלום לפי שימוש. | -| `glm` | `glm` | GLM Coding | מפתח API | [קישור](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (סין) | מפתח API | [קישור](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | מפתח API | [קישור](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | מפתח API | [קישור](https://greenpt.com) | יצירת מינוי API היא חינמית; ההסקה מחויבת לפי אסימון. לא מפורסמת מכסת הסקה חינמית. | -| `groq` | `groq` | Groq | מפתח API | [קישור](https://groq.com) | תוכנית חינמית: מגבלות לכל דגם (200K אסימונים ליום לכל דגם צ'אט; ראו console.groq.com/docs/rate-limits עבור RPM/RPD) — ללא אמצעי תשלום שמור. | -| `haiper` | `hp` | Haiper | מפתח API, וידאו | [קישור](https://haiper.ai) | קבלו מפתח API ב-haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | מפתח API | [קישור](https://api.hcnsec.cn) | קבלו מפתח API ב-api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | מפתח API, אגרגטור | [קישור](https://helixmind.online) | טענות שהופצו בעבר על 3 RPM/50 RPD וללא צורך בכרטיס לא אומתו במהלך הביקורת ב-2026-08-02; המכסה והתמחור הנוכחיים דורשים אימות חשבון. | -| `helyxai` | `helyxai` | Helyx AI | מפתח API, אגרגטור | [קישור](https://helyxai.space) | מסמכי התוכנית החינמית הפעילה מציינים 100,000 אסימונים ליום; הטענה השיווקית הנפרדת באתר על יותר מ-2M סותרת זאת ואינה נחשבת להבטחת מכסה. | -| `heroku` | `heroku` | Heroku AI | מפתח API, ארגוני | [קישור](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | מפתח API | [קישור](https://huggingface.co) | API הסקה חינמי לאלפי דגמים (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | מפתח API | [קישור](https://hyperbolic.xyz) | זיכויי ניסיון בסך $1-5 בהרשמה להסקה ללא שרת | -| `ideogram` | `ideo` | Ideogram | מפתח API | [קישור](https://ideogram.ai) | קבלו מפתח API ב-ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | מפתח API | [קישור](https://xinghuo.xfyun.cn) | קבלו מפתח API ב-console.xfyun.cn | -| `inception` | `inception` | Inception | מפתח API | [קישור](https://docs.inceptionlabs.ai) | 10M אסימונים בחינם בהרשמה, ללא צורך בכרטיס אשראי. | -| `inference-net` | `inet` | Inference.net | מפתח API | [קישור](https://inference.net) | זיכויים חינמיים בסך $25 בהרשמה, ובנוסף זמינים מענקי מחקר | -| `internlm` | `internlm` | InternLM (Intern-S1) | מפתח API | [קישור](https://internlm.intern-ai.org.cn/) | מכסה חודשית חינמית של כ-1M אסימוני קלט / 3M אסימוני פלט (כ-10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | מפתח API, הטמעה/דירוג מחדש | [קישור](https://jina.ai) | מפתח API מסוג Bearer עבור api.jina.ai — הטמעות, דירוג מחדש, סיווג, חלוקה למקטעים וחיפוש. למפתחות מלוח הבקרה יש עדיפות על פני JINA_AI_API_KEY. זה אינו הכרטיס של Reader / r.jina.ai ואינו מאחזר כתובות URL. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | מפתח API | [קישור](https://jina.ai/reader) | מפתח API מסוג Bearer עבור המרת URL ל-Markdown באמצעות r.jina.ai ‏(/v1/web/fetch בלבד). אינו מספק את /v1/embeddings או /v1/rerank. אותו אסימון Jina של Foundation API פועל גם כאן; כאשר כרטיס זה ריק, OmniRoute משתמש מחדש במפתח jina-ai מלוח הבקרה או ב-JINA_AI_API_KEY. | -| `kenari` | `kenari` | Kenari | מפתח API | [קישור](https://kenari.id) | השתמשו במפתח ה-API שלכם של Kenari‏ (kn-...) בתוך Authorization: Bearer . תואם באופן מלא ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | מפתח API | [קישור](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | מפתח API, אגרגטור | [קישור](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | מפתח API | [קישור](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | מפתח API | [קישור](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | מפתח API | [קישור](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | מפתח API, אגרגטור | [קישור](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | מפתח API, וידאו | [קישור](https://leonardo.ai) | קבלו מפתח API ב-leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | מפתח API | [קישור](https://liquid.ai) | קבלו מפתח API ב-liquid.ai | -| `literouter` | `literouter` | LiteRouter | מפתח API, אגרגטור | [קישור](https://literouter.com) | גרסאות חינמיות של מודלים משתמשות בסיומת :free; מגבלות האשראי היומיות משתנות לפי מודל, והקלט החינמי מוגבל ל-5,000 אסימונים. | -| `llamagate` | `llamagate` | LlamaGate | מפתח API | [קישור](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | מפתח API, אגרגטור | [קישור](https://llm.kiwi) | התוכנית החינמית חושפת את auto ואת hrLLM; המגבלה המפורסמת של 40 בקשות בשעה חלה על hrLLM. | -| `llm7` | `llm7` | LLM7.io | מפתח API | [קישור](https://llm7.io) | השתמשו בכל מפתח שאינו ריק (לדוגמה 'unused'). אם מודלים מובנים ישנים יותר מחזירים model_unavailable, השתמשו ב-Available Models → Import from /models או ב-Auto-Sync; מודל פעיל שאומת: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | מפתח API, אגרגטור | [קישור](https://llmgateway.io) | תוכנית Hosted Free: מודלים במחיר חינמי מוגבלים ל-5 בקשות בכל 10 דקות כאשר אין זיכויים בחשבון. | -| `logfare` | `logfare` | Logfare | מפתח API, אגרגטור | [קישור](https://logfare.ai) | צרו חשבון חינמי בכתובת https://logfare.ai/register (שם משתמש/סיסמה, ללא אימות דוא"ל) כדי לקבל מפתח API מיידי, ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `longcat` | `lc` | LongCat AI | מפתח API | [קישור](https://longcat.chat/platform/docs) | חינם: מענק חד-פעמי של 10 מיליון אסימונים לאחר הרשמה לחשבון ואימות KYC‏ (LongCat-2.0). חד-פעמי בלבד — לא הקצבה יומית/חודשית מתחדשת. | -| `magnific` | `freepik` | Magnific | מפתח API, תמונה | [קישור](https://www.magnific.com) | קבלו מפתח API ב-magnific.com/user/api-keys (כותרת x-magnific-api-key). מפתחות מפתחים ישנים של Freepik עדיין פועלים. | -| `maritalk` | `maritalk` | Maritalk | מפתח API | [קישור](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | מפתח API, אגרגטור | [קישור](https://meganova.ai) | הרשמה חינמית ללא כרטיס. המכסות המפורסמות לכל מודל ברמה Tier 1 מסתכמות ב-550 בקשות ביום; הן אינן מאגר גלובלי משותף, וייתכן חיוב בתשלום על חריגה אם אפשרות זו מופעלת. | -| `meta-llama` | `meta` | Meta Llama API | מפתח API | [קישור](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | מפתח API, וידאו | [קישור](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (China) | מפתח API | [קישור](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | מפתח API | [קישור](https://mistral.ai) | שכבת Experiment החינמית: גישה לכל המודלים בכפוף להגבלת קצב, ללא צורך בכרטיס אשראי | -| `mixedbread` | `mxbai` | Mixedbread AI | מפתח API | [קישור](https://www.mixedbread.com) | מפתח API מסוג Bearer עבור API ההטמעות של Mixedbread. | -| `mixlayer` | `mixlayer` | Mixlayer | מפתח API, אגרגטור | [קישור](https://www.mixlayer.com) | המודל qwen/qwen3.5-4b-free ניתן בחינם ליצירת אבטיפוס וכפוף להגבלת קצב; לא אושרה מגבלת RPM ציבורית קבועה או מכסה יומית. | -| `mnn-ai` | `mnn-ai` | MNN AI | מפתח API, אגרגטור | [קישור](https://mnnai.ru) | תוכנית חינמית: זיכויים חודשיים בסך $1,‏ 10 RPM וגישה רק למודלים המסומנים Free. | -| `modal` | `mdl` | Modal | מפתח API, ארגוני | [קישור](https://modal.com/docs) | השתמשו באסימון ה-Bearer שמגן על פריסת Modal שלכם, אם הופעל. כתובת ה-URL הבסיסית צריכה להפנות ליישום Modal התואם ל-OpenAI שלכם, לדוגמה https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | מפתח API | [קישור](https://modelscope.cn) | שכבה חינמית דרך ModelScope API-Inference — נדרש חשבון Alibaba. | -| `monsterapi` | `monster` | MonsterAPI | מפתח API | [קישור](https://monsterapi.ai) | ⚠️ **הוצא משימוש.** Monster API הפסיקה את פעילותה ב-2026-06-30. השתמשו בספקים חלופיים התואמים ל-OpenAI. | -| `moonshot` | `moonshot` | Kimi | מפתח API | [קישור](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | מפתח API | [קישור](https://morphllm.com) | שכבה חינמית: 250K זיכויים בחודש, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | מפתח API | [קישור](https://github.com/meta-llama/llama-stack) | השתמשו במשתנה הסביבה META_API_KEY שלכם כאסימון Bearer. ה-CLI של Muse Code משתמש בפורמט התקשורת של OpenAI Responses API‏ (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | מפתח API, אגרגטור | [קישור](https://naga.ac) | קבלו מפתח API ב-naga.ac — הרשמה באמצעות Google/GitHub/Discord זמינה. | -| `naga-ai` | `naga-ai` | Naga AI | מפתח API, אגרגטור | [קישור](https://naga.ac) | מודלים המסומנים ב־:free מופיעים ברשימה הציבורית, אך לא אושרה מכסה מספרית. המדיניות של Naga מזהירה כי פרומפטים ופלטים מהמסלול החינמי עשויים להיאסף או לשמש לאימון. | -| `nanogpt` | `nanogpt` | NanoGPT | מפתח API | [קישור](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | מפתח API | [קישור](https://bynara.id) | צרו חשבון NaraRouter חינמי, קשרו את חשבון ה־Telegram שלכם (נדרש לפני קבלת תשובות מ־/v1), ולאחר מכן הדביקו כאן את המפתח כאסימון Bearer. | -| `navy` | `navy` | NavyAI | מפתח API | [קישור](https://api.navy) | צרו מפתח API חינמי מלוח הבקרה של NavyAI, ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `nebius` | `nebius` | Nebius AI | מפתח API | [קישור](https://nebius.com) | זיכויי ניסיון בסך כ־$1 בעת ההרשמה לצורך בדיקות API | -| `nlpcloud` | `nlpc` | NLP Cloud | מפתח API | [קישור](https://docs.nlpcloud.com) | השתמשו במפתח ה־API של NLP Cloud בתוך Authorization: Token . כברירת מחדל, OmniRoute פונה לנקודת הקצה של הצ'אטבוט בכתובת https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | מפתח API | [קישור](https://nomic.ai) | קבלו מפתח API ב־atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | מפתח API | [קישור](https://portal.nousresearch.com/help) | השתמשו במפתח ה־API של Nous Portal. ‏OmniRoute פונה לנקודת הקצה הרשמית להסקה, התואמת ל־OpenAI, בכתובת https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | מפתח API, וידאו, אגרגטור | [קישור](https://novita.ai) | זיכויי ניסיון בסך $0.50 בעת ההרשמה (תקפים למשך כשנה) | -| `nscale` | `nscale` | nScale | מפתח API | [קישור](https://nscale.com) | זיכויים חינמיים בסך $5 בעת ההרשמה לצורך בדיקות הסקה | -| `nube` | `nube` | Nube.sh | מפתח API | [קישור](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | מפתח API | [קישור](https://build.nvidia.com) | גישת פיתוח חינמית: כ־40 RPM, יותר מ־70 מודלים (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | מפתח API, ארגוני | [קישור](https://www.oracle.com/artificial-intelligence/generative-ai) | השתמשו במפתח ה־API של OCI Generative AI או באסימון IAM מסוג Bearer. כתובת ה־URL הבסיסית יכולה להיות https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | מפתח API, אגרגטור | [קישור](https://ofox.ai) | הקטלוג הנוכחי מפרסם יותר מ־10 מודלים חינמיים ללא מכסה מספרית ציבורית; לפני שימוש בסביבת ייצור, בדקו את מקור השירות במעלה הזרם ואת תנאי השמירה והאימון. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | מפתח API | [קישור](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | מפתח API | [קישור](https://1min.ai) | צרו מפתח API בכתובת https://docs.1min.ai/docs/api/create-api-key, ולאחר מכן הדביקו אותו כאן. | -| `openadapter` | `oad` | OpenAdapter | מפתח API | [קישור](https://openadapter.dev) | השתמשו במפתח ה־API של OpenAdapter בתוך Authorization: Bearer sk-cv-. תואם באופן מלא ל־OpenAI. כתובת ה־URL הבסיסית של ה־API: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | מפתח API | [קישור](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | מפתח API | [קישור](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | מפתח API | [קישור](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | מפתח API | [קישור](https://openference.com) | תוכנית חינמית: תקופת ניסיון של 3 ימים עם מודלים בקוד פתוח — ללא צורך בכרטיס אשראי | -| `openrouter` | `openrouter` | OpenRouter | מפתח API, אגרגטור | [קישור](https://openrouter.ai) | מודלים חינמיים בעלות $0/אסימון עם הסיומת :free — ‏20 RPM / ‏200 RPD | -| `openvecta` | `openvecta` | OpenVecta | מפתח API | [קישור](https://openvecta.com) | זיכויים חינמיים בעת ההרשמה להסקה תואמת OpenAI במודלי LLM, הטמעות ומודלי חשיבה | -| `opper` | `opper` | Opper | מפתח API, אגרגטור | [קישור](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | מפתח API | [קישור](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | מפתח API | [קישור](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | מפתח API | [קישור](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | מפתח API | [קישור](https://www.perplexity.ai) | השתמשו במפתח ה־API של Perplexity. ‏OmniRoute מנתב מזהי מודלים של Agent API דרך נקודת הקצה של Perplexity התואמת ל־Responses. | -| `piapi` | `pi` | PiAPI | מפתח API, אגרגטור | [קישור](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | מפתח API | [קישור](https://pioneer.ai) | זיכויי שימוש חינמיים בסך $75 — ללא צורך בכרטיס אשראי | -| `plamo` | `plamo` | PLaMo | מפתח API | [קישור](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | מפתח API, אגרגטור | [קישור](https://creator.poe.com/api-reference) | מפתח API מסוג Bearer עבור ה־API של Poe התואם ל־OpenAI. | -| `poixe-ai` | `poixe-ai` | Poixe AI | מפתח API, אגרגטור | [קישור](https://poixe.com) | מגבלות השימוש החינמי הציבוריות הנוכחיות נמוכות ומשתנות לפי קבוצת מודלים: 2 RPM/5 RPD למודלים מסוג large-cup ו־20 RPM/50 RPD למודלים מסוג small-cup. | -| `pollinations` | `pol` | Pollinations AI | מפתח API, וידאו | [קישור](https://pollinations.ai) | הגישה האנונימית/ללא מפתח למודלים החינמיים המתועדים מסופקת על בסיס מאמץ מיטבי. אימות מקומי בגרסה v3.8.50 ‏(2026-07-31) החזיר 401 דרך OmniRoute ו־Cloudflare 1010 בבדיקות ישירות מול ספק המקור מאותה רשת. מודלים בתשלום עדיין דורשים מפתח API של Pollinations מ־enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | מפתח API | [קישור](https://poolside.ai) | ‏Laguna S 2.1 ו־XS 2.1 זמינים בחינם במהלך שלב התצוגה המקדימה; לא פורסמה מכסה מספרית לציבור. | -| `predibase` | `predibase` | Predibase | מפתח API | [קישור](https://predibase.com) | ⚠️ **הוצא משימוש.** ‏serving.app.predibase.com כבר אינו נפתר (סריקה מ־2026-06-19); נראה כי שירות ה־API המנוהל הופסק. | -| `publicai` | `publicai` | PublicAI | מפתח API | [קישור](https://publicai.co) | נדרש מפתח API — זיכוי חד־פעמי בעת ההרשמה, ולאחר מכן השירות בתשלום | -| `qianfan` | `qianfan` | Baidu Qianfan | מפתח API | [קישור](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | מפתח API | [קישור](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | מפתח API | [קישור](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | מפתח API | [קישור](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | מפתח API, תמונה | [קישור](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | מפתח API | [קישור](https://regolo.ai) | קבלו את מפתח ה-API של Regolo מ-regolo.ai, ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `reka` | `reka` | Reka | מפתח API | [קישור](https://docs.reka.ai/chat/overview) | השתמשו במפתח ה-API של Reka. OmniRoute תומך בכתובת ה-URL הבסיסית התואמת ל-OpenAI,‏ https://api.reka.ai/v1, ושולח הן את כותרת Authorization והן את כותרת X-Api-Key לצורך תאימות. | -| `requesty` | `requesty` | Requesty | מפתח API | [קישור](https://requesty.ai) | מסלול חינמי של כ-200 בקשות ביום — שער ניתוב מרובה מודלים (יותר מ-300 מודלים) | -| `routeway` | `routeway` | Routeway | מפתח API | [קישור](https://routeway.ai) | צרו מפתח API חינמי ב-routeway.ai, ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `runwayml` | `runway` | Runway | מפתח API, וידאו | [קישור](https://docs.dev.runwayml.com) | השתמשו במפתח ה-API של Runway ב-Authorization: Bearer . OmniRoute פונה ל-API הנוכחי של Runway בכתובת https://api.dev.runwayml.com/v1 ושולח אוטומטית את כותרת X-Runway-Version הנדרשת. | -| `sambanova` | `samba` | SambaNova | מפתח API | [קישור](https://sambanova.ai) | זיכויים חינמיים בסך $5 בהרשמה (בתוקף ל-30 יום), ללא צורך בכרטיס אשראי | -| `sap` | `sap` | SAP Generative AI Hub | מפתח API, ארגוני | [קישור](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | השתמשו באסימון ה-Bearer של SAP AI Core. כתובת ה-URL הבסיסית יכולה להיות כתובת השורש AI_API_URL שלכם או deploymentUrl מ-Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | מפתח API | [קישור](https://docs.sarvam.ai) | זיכויי הרשמה חינמיים בסך ₹1,000 — ללא תפוגה | -| `scaleway` | `scw` | Scaleway AI | מפתח API | [קישור](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | מיליון אסימונים חינמיים לחשבונות חדשים — תואם ל-EU/GDPR (פריז), Qwen3 235B ו-Llama 70B | -| `sealion` | `sealion` | SEA-LION | מפתח API | [קישור](https://sea-lion.ai) | היכנסו ל-sea-lion.ai באמצעות Google (ללא כרטיס וללא הגבלת אזור), צרו מפתח API ולאחר מכן הדביקו אותו כאן. | -| `seekai` | `ska` | SeekAi | מפתח API, אגרגטור | [קישור](https://seekai.cc) | צרו מפתח API בכתובת https://seekai.cc, ולאחר מכן הדביקו אותו כאן כאסימון Bearer. | -| `segmind` | `segmind` | Segmind | מפתח API, תמונה, וידאו | [קישור](https://segmind.com) | השתמשו במפתח ה-API של Segmind בכותרת x-api-key. OmniRoute פונה לכתובת https://api.segmind.com/v1/ ומחזיר ישירות את הבתים של התמונה/הווידאו שנוצרו. | -| `sensenova` | `sensenova` | SenseNova | מפתח API | [קישור](https://platform.sensenova.cn) | קבלו מפתח API ב-platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | מפתח API | [קישור](https://cloud.siliconflow.com) | זיכויים חינמיים בסך $1, בנוסף למודלים בעלות $0 המופיעים כעת, לאחר אימות זהות; הזמינות והמגבלות עשויות להשתנות | -| `snowflake` | `snowflake` | Snowflake Cortex | מפתח API, ארגוני | [קישור](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | מפתח API | [קישור](https://xinghuo.xfyun.cn) | קבלו מפתח API ב-console.xfyun.cn | -| `speka` | `speka` | Speka AI | מפתח API, אגרגטור | [קישור](https://speka.me) | תוכנית חינמית: שימוש חודשי בסך $1,‏ 10 RPM, מפתח API אחד וגישה למודלים פתוחים ולמגרש המשחקים; ללא צורך בכרטיס. | -| `stability-ai` | `stability` | Stability AI | מפתח API, תמונה | [קישור](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | מפתח API | [קישור](https://stepfun.com) | קבלו מפתח API ב-platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | מפתח API | [קישור](https://ai.sumopod.com) | השתמשו במפתח ה-API של SumoPod‏ (sk-...) ב-Authorization: Bearer . תאימות מלאה ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | מפתח API | [קישור](https://suno.ai) | הדביקו את קובץ ה-Cookie של ההפעלה מ-suno.ai (אימות Clerk) | -| `synthetic` | `synthetic` | Synthetic | מפתח API, אגרגטור | [קישור](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | מפתח API, אגרגטור | [קישור](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | מפתח API | [קישור](https://hunyuan.tencent.com) | קבלו מפתח API ב-console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | מפתח API, אגרגטור | [קישור](https://theb.ai) | מפתח API מסוג Bearer עבור השער של TheB.AI התואם ל-OpenAI. | -| `tinyfish` | `tf` | TinyFish Fetch | מפתח API | [קישור](https://docs.tinyfish.ai/fetch-api) | X-API-Key מ-agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | מפתח API, וידאו | [קישור](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | מפתח API | [קישור](https://agent-router.gaib.ai) | השתמשו במפתח ה-API של Token Kiosk ב-Authorization: Bearer . שער עם תאימות מלאה ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | מפתח API, אגרגטור | [קישור](https://www.tokenreply.com) | למודלים המסומנים כחינמיים יש מגבלות יומיות ספציפיות למודל ולקמפיין; לא מפורסמת מכסה חינמית גלובלית קבועה. | -| `tokenrouter` | `trk` | TokenRouter | מפתח API | [קישור](https://tokenrouter.com) | השתמשו במפתח ה-API של TokenRouter ב-Authorization: Bearer . תאימות מלאה ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | מפתח API, תמונה | [קישור](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | מפתח API | [קישור](https://docs.opentyphoon.ai) | מפתח API חינמי עם מגבלת קצב של 5 בקשות לשנייה ו-200 בקשות לדקה. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | מפתח API | [קישור](https://uncensored.com) | השתמשו במפתח ה-Developer API שלכם מ-uncensored.com‏ (uai_sk_live_...). ‏OmniRoute שולח אותו ככותרת X-api-key לנקודת הקצה https://api.uncensored.com/api/v1 התואמת ל-OpenAI. תוקף המפתח לעולם אינו פג. זהו הממשק המבוסס על מדידה/נקודות זכות; צ'אט המינוי שאינו מבוסס על מדידה הוא הספק הנפרד 'uc'. | -| `udio` | `udio` | Udio | מפתח API | [קישור](https://udio.com) | הדביקו קובץ Cookie של הפעלה מ-udio.com‏ (אימות Supabase) | -| `unorouter` | `unorouter` | UnoRouter | מפתח API, אגרגטור | [קישור](https://unorouter.ai) | מודלים עם הסיומת :free אינם מחייבים את היתרה; המגבלה היא בקשה אחת לדקה לכל מודל חינמי, לכל משתמש. | -| `upstage` | `upstage` | Upstage | מפתח API | [קישור](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | מפתח API | [קישור](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | מפתח API | [קישור](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | מפתח API, אגרגטור | [קישור](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | מפתח API, ארגוני | [קישור](https://cloud.google.com/vertex-ai) | ספקו JSON של Service Account, אסימון גישה מסוג OAuth, מפתח API של Vertex Express או מפתח הרשאה המקושר לחשבון שירות. מצב Express תומך ב-Gemini בלבד; מודלים של שותפים דורשים פרטי גישה בהיקף פרויקט. | -| `vertex-partner` | `vp` | Vertex AI Partners | מפתח API, ארגוני | [קישור](https://cloud.google.com/vertex-ai) | ספקו JSON של Service Account או פרטי גישה מסוג OAuth. מפתח הרשאה המקושר לחשבון שירות תומך גם בגילוי, אך הסקת שותפים דורשת בנוסף את מזהה הפרויקט שלו ב-Google Cloud. מפתחות Express רגילים תומכים ב-Gemini בלבד. | -| `void-ai` | `void-ai` | Void AI | מפתח API, אגרגטור | [קישור](https://voidai.app) | קטלוג המודלים הציבורי מסמן מודלים מסוימים כדורשים תוכנית חינמית, אך הגישה מותנית ולא אושרה מכסה מספרית. | -| `volcengine` | `volcengine` | Volcengine | מפתח API | [קישור](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | מפתח API | [קישור](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | חברו את חשבון Volcano Engine שלכם או השתמשו במפתח API של מינוי Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | מפתח API | [קישור](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | חברו את חשבון Volcano Engine שלכם או השתמשו במפתח API של מינוי Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | מפתח API, הטמעה/דירוג מחדש | [קישור](https://www.voyageai.com) | מפתח API מסוג Bearer עבור ממשקי ה-API להטמעות ולדירוג מחדש של Voyage AI. | -| `wafer` | `wafer` | Wafer AI | מפתח API | [קישור](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | מפתח API | [קישור](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | מפתח API, ארגוני | [קישור](https://www.ibm.com/products/watsonx-ai) | השתמשו באסימון ה-Bearer שלכם עבור watsonx. כתובת ה-URL הבסיסית יכולה להיות https://.ml.cloud.ibm.com/ml/gateway/v1/ או נקודת קצה /ml/gateway/v1 בניהול עצמי. | -| `writer` | `writer` | Writer | מפתח API | [קישור](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | מפתח API | [קישור](https://x5lab.dev) | השתמשו במפתח ה-API שלכם עבור X5Lab‏ (x5-...) בתוך Authorization: Bearer . תואם לחלוטין ל-OpenAI. כתובת ה-URL הבסיסית של ה-API:‏ https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | מפתח API | [קישור](https://x.ai) | השתמשו במפתח API רשמי של xAI, או התחברו באמצעות xAI OAuth. הפעלות JWT של Grok Build נשארות ספק נפרד. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | מפתח API | [קישור](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | מפתח API | [קישור](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | מפתח API, אגרגטור | [קישור](https://xkiro.com) | צרו חשבון חינמי ב-xkiro.com והדביקו כאן את המפתח (Bearer; גם x-api-key מתקבל). | -| `yi` | `yi` | Yi (01.AI) | מפתח API | [קישור](https://01.ai) | קבלו מפתח API ב-platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | מפתח API, אגרגטור | [קישור](https://yolo-auto.com) | הגישה החינמית ל-API מוגבלת במספר הבקשות ומיועדת לבדיקות; לא פורסמה מכסה יומית מספרית ואין הבטחה שהגישה החינמית תימשך ללא הגבלת זמן. | -| `zai` | `zai` | Z.AI | מפתח API | [קישור](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | מפתח API | [קישור](https://zenmux.ai) | השתמשו במפתח ה-API שלכם עבור ZenMux בתוך Authorization: Bearer . ‏ZenMux תואם לחלוטין ל-OpenAI. כתובת ה-URL הבסיסית: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | מפתח API, אגרגטור | [קישור](https://www.zerolimitai.com) | מפורסמת תקופת ניסיון חינמית זמנית, אך הדפים הרשמיים מציגים מידע סותר של 3 או 7 ימים; הטענה ל-100 קריאות ביום אינה נחשבת לקבועה. | -| `zylo-api` | `zylo` | Zylo API | מפתח API, אגרגטור | [קישור](https://zyloai.net) | תוכנית Basic:‏ 10 RPM,‏ 7,200 בקשות ביום ו-200,000 אסימונים ביום; מוגבלת למודלי טקסט מסוג Basic. | +## ספקי מפתחות API (בתשלום / בתשלום עם קרדיטים חינם) (242) + +| ID | Alias | Name | Tags | Website | Notes | +| ------------------------ | --------------- | ------------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `360ai` | `360ai` | 360 AI | מפתח API | [link](https://ai.360.cn) | קבל מפתח API ב-ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | מפתח API, אגרגטור | [link](https://agentrouter.org) | 200$ קרדיטים חינם בהרשמה - שער ניתוב מרובה מודלים | +| `agnes` | `agnes` | Agnes AI | מפתח API, וידאו | [link](https://agnes-ai.com) | קבל מפתח API ב-agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (סין) | מפתח API | [link](https://api.agnes-ai.cn) | קבל מפתח API מאתר Agnes CN. | +| `ai21` | `ai21` | AI21 Labs | מפתח API | [link](https://www.ai21.com) | 10$ קרדיטים לניסיון בהרשמה (תקפים ל-3 חודשים), אין צורך בכרטיס אשראי | +| `aimlapi` | `aiml` | AI/ML API | מפתח API, אגרגטור | [link](https://aimlapi.com) | שכבת חינם מושהית (2026) — AI/ML API הוא כעת בתשלום לפי שימוש בלבד (מינימום 20$ טעינה); אין קרדיטים חוזרים בחינם. | +| `ainative` | `ainative` | AINative Studio | מפתח API | [link](https://ainative.studio) | צור מפתח API חינם ב-ainative.studio (ללא כרטיס), ואז הדבק אותו כאן כ-Bearer token. | +| `aion` | `aion` | Aion Labs | מפתח API | [link](https://www.aionlabs.ai) | צור מפתח API חינם ב-aionlabs.ai (ללא כרטיס), ואז הדבק אותו כאן כ-Bearer token. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | מפתח API | [link](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (סין) | מפתח API | [link](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | מפתח API | [link](https://developer.ant-ling.com/en/docs/) | הירשם וצור מפתח API בקונסולת Ant Ling API (https://chat.ant-ling.com/open), ואז הדבק אותו כאן. OmniRoute מנתב תעבורת צ'אט ל-https://api.ant-ling.com/v1/chat/completions; הספק תואם OpenAI וחושף גם ממשק תואם Anthropic. | +| `anthropic` | `anthropic` | Anthropic | מפתח API | [link](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | מפתח API, אגרגטור | [link](https://anyapi.ai) | תוכנית חינם: 100,000 אסימוני ANY ליום ו-100 RPM עבור מודלים חינמיים/בסיסיים זכאים; אין צורך בכרטיס אשראי. | +| `api-airforce` | `af` | Api.airforce | מפתח API | [link](https://api.airforce) | 55 מודלים חינמיים כולל Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | מפתח API | [link](https://arcee.ai) | קבל מפתח API ב-arcee.ai | +| `auriko` | `auriko` | Auriko | מפתח API, אגרגטור | [link](https://www.auriko.ai) | תוכנית חינם מפרסמת 1,000 פלטפורמת RPM ו-10,000 BYOK RPM. הסקת פלטפורמה עדיין עוברת דרך עלות הספק; זו אינה מאגר אסימונים חינם או הסקה חינם בלתי מוגבלת. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | מפתח API, ארגוני | [link](https://learn.microsoft.com/azure/ai-foundry) | השתמש במפתח Azure AI Foundry שלך. כתובת ה-URL הבסיסית יכולה להיות https://.services.ai.azure.com/openai/v1/ או https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | מפתח API, ארגוני | [link](https://azure.microsoft.com/products/ai-services/openai-service) | השתמש במפתח ה-API של Azure OpenAI שלך. כתובת ה-URL הבסיסית צריכה להיות נקודת הקצה של המשאב שלך, לדוגמה https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | מפתח API | [link](https://b.ai) | מפתח API מסוג Bearer עבור שער ה-LLM התואם OpenAI של b.ai (שונה מ-TheB.AI). צור מפתח ב-https://docs.b.ai, ואז השתמש ב-https://api.b.ai/v1 ככתובת ה-URL הבסיסית התואמת OpenAI. | +| `baichuan` | `baichuan` | Baichuan | מפתח API | [link](https://www.baichuan-ai.com/) | קבל מפתח API ב-platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | מפתח API | [link](https://ernie.baidu.com/) | קבל מפתח API ב-console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | תוכנית אסימונים של Alibaba | מפתח API | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | מפתח API | [link](https://baseten.co) | 30$ קרדיטים לניסיון חינם עבור הסקת GPU | +| `bazaarlink` | `bzl` | BazaarLink | מפתח API | [link](https://bazaarlink.ai) | השתמש במפתח ה-API של BazaarLink שלך (מתחיל ב-sk-bl-) ב-Authorization: Bearer . ה-SDK של OpenAI עובד עם כתובת ה-URL הבסיסית https://bazaarlink.ai/api/v1. מודלים משתמשים בפורמט provider/model-name. | +| `bedrock` | `bedrock` | Amazon Bedrock | מפתח API, ארגוני | [link](https://aws.amazon.com/bedrock) | השתמש במפתח ה-API של Amazon Bedrock שלך וקבע את אזור AWS שבו המודלים שלך מופעלים (לדוגמה eu-west-2). OmniRoute קורא ישירות ל-Converse API המקורי של Bedrock. | +| `black-forest-labs` | `bfl` | Black Forest Labs | מפתח API, תמונה | [link](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | מפתח API | [link](https://blackbox.ai) | ⚠️ **הוצא משימוש.** api.blackbox.ai מחזיר HTTP 404 בכל וריאנט נתיב (סריקה 2026-08-21); משטח ההסקה הציבורי עבר לנקודת הקצה המגודרת enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | מפתח API | [link](https://www.bluesminds.com) | קרדיטים יומיים חינם — תומך ב-200+ מודלים כולל GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | מפתח API | [link](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | מפתח API | [link](https://bytez.com) | 1$ קרדיטים חינם, מתרעננים כל 4 שבועות | +| `cerebras` | `cerebras` | Cerebras | מפתח API | [link](https://inference.cerebras.ai) | קרדיט הרשמה חד פעמי של 5$ (תקף ל-30 יום); נדרשת שיטת תשלום. לא שכבת חינם חוזרת. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | מפתח API | [link](https://hyper.charm.land) | 100 Hypercredits חודשיים חינם בהרשמה | +| `chat-oripe` | `chat-oripe` | Chat Oripe | מפתח API, אגרגטור | [link](https://api.oriper.com) | מטא-נתונים רשמיים מפרסמים 2M אסימונים לחודש, אך האתר הציבורי והתיעוד נחסמו במהלך הביקורת; יש להתייחס למכסה ולמיפוי המותג כבלתי מאושרים. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | מפתח API, אגרגטור | [קישור](https://chatanywhere.tech) | לשימוש אישי, חינוכי או מחקרי בלבד: תיעוד ציבורי מציין 10,000 נקודות/יום ו-200 בקשות/יום לכל IP/מפתח; אין להשתמש לתעבורה מסחרית. | +| `cheaperinference` | `cinf` | Cheaper Inference | מפתח API | [קישור](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | מפתח API | [קישור](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | מפתח API, אגרגטור | [קישור](https://chutes.ai) | מפתח API מסוג Bearer עבור שער Chutes התואם ל-OpenAI. | +| `clarifai` | `clarifai` | Clarifai | מפתח API, ארגוני | [קישור](https://docs.clarifai.com) | השתמשו ב-PAT של Clarifai או במפתח API ספציפי לאפליקציה. OmniRoute מכוון לנקודת הקצה התואמת ל-OpenAI בכתובת https://api.clarifai.com/v2/ext/openai/v1 ומאמת באמצעות Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | מפתח API, אגרגטור | [קישור](https://cloudcode.one) | מודלים חינמיים שפורסמו כוללים את glm-4.7-flash ו-glm-4.6v-flash; לא פורסמה מכסה מספרית, ויצירת מפתח עשויה לדרוש אשראי או קופון. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | מפתח API | [קישור](https://developers.cloudflare.com/workers-ai) | דורש אסימון API ומזהה חשבון (נמצא ב-dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | מפתח API | [קישור](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | מפתח API | [קישור](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | מפתח API | [קישור](https://cohere.com) | ניסיון חינם: 1,000 קריאות API לחודש לבדיקה, ללא צורך בכרטיס אשראי | +| `command-code` | `cmd` | Command Code | מפתח API | [קישור](https://commandcode.ai/) | השתמשו במפתח API של Command Code. בקשות נשלחות לנקודת הקצה /provider/v1/chat/completions של Command Code. | +| `coze` | `coze` | Coze | מפתח API | [קישור](https://coze.com) | קבלו מפתח API ב-coze.com/open/api | +| `crof` | `crof` | CrofAI | מפתח API | [קישור](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | מפתח API | [קישור](https://cursor.com/dashboard/api) | הדביקו מפתח API של משתמש Cursor (crsr_...) מ-cursor.com/dashboard/api. OmniRoute מחליף אותו באסימון סשן לפי דרישה; אין צורך בהתקנת IDE או cursor-agent. השימוש מחויב לתוכנית Cursor שבבעלותה המפתח. | +| `dahl` | `dahl` | Dahl | מפתח API | [קישור](https://inference.dahl.global) | לחצו על 'הוסף חשבון' כדי ליצור אסימון אוטומטית, או הוסיפו מפתח API ידני. | +| `databricks` | `databricks` | Databricks | מפתח API, ארגוני | [קישור](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | מפתח API, ארגוני | [קישור](https://docs.datarobot.com) | השתמשו באסימון ה-API של DataRobot. כתובת ה-URL הבסיסית האופציונלית יכולה להיות שורש החשבון (עבור LLM Gateway) או כתובת URL של פריסה תחת /api/v2/deployments/. | +| `deepai` | `deepai` | DeepAI | מפתח API, תמונה | [קישור](https://deepai.org) | השתמשו במפתח ה-API של DeepAI. קבלו אחד ב-deepai.org — דורש מנוי Pro (9.99$ לחודש). | +| `deepinfra` | `deepinfra` | DeepInfra | מפתח API | [קישור](https://deepinfra.com) | זיכויים חינם בהרשמה לבדיקת API וחקירת מודלים | +| `deepseek` | `ds` | DeepSeek | מפתח API | [קישור](https://platform.deepseek.com) | 5M אסימונים חינם בהרשמה - ללא צורך בכרטיס אשראי | +| `dgrid` | `dgrid` | DGrid | מפתח API | [קישור](https://dgrid.ai) | נתב מודלים חינמיים של DGrid: 10 בקשות/דקה ו-100 בקשות/יום. תוספת חד פעמית של 5$ פותחת עד 20 בקשות/דקה ו-1,000 בקשות/יום. | +| `dify` | `dify` | Dify | מפתח API | [קישור](https://dify.ai) | קבלו מפתח API ממופע Dify שלכם. | +| `digitalocean` | `digitalocean` | DigitalOcean | מפתח API | [קישור](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | מפתח API | [קישור](https://dit.ai) | השתמשו במפתח ה-API של dit.ai ב-Authorization: Bearer . תואם לחלוטין ל-OpenAI — תחליף ישיר, פשוט שנו את כתובת ה-URL הבסיסית ל-https://api.dit.ai/v1. | +| `doubao` | `doubao` | Doubao | מפתח API | [קישור](https://doubao.com) | קבלו מפתח API ב-console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | מפתח API, אגרגטור | [קישור](https://www.dxnt.com) | חשבונות חינם מתועדים ב-100 קריאות/יום; המכסה עשויה לעלות באמצעות הזמנות ויכולה להשתנות לפי חשבון. | +| `electronhub` | `electronhub` | Electron Hub | מפתח API, אגרגטור | [קישור](https://www.electronhub.ai) | תוכנית חינם: 5 RPM, 0.25$ זיכויים שבועיים ו-10 נויטרינו/יום עבור מודלים :free; תקציבי משפחה חלים גם הם. | +| `empower` | `empower` | Empower | מפתח API, אגרגטור | [קישור](https://docs.empower.dev) | מפתח API מסוג Bearer עבור נקודת הקצה של Empower התואמת ל-OpenAI. | +| `eurouter` | `eurouter` | EURouter | מפתח API, אגרגטור | [קישור](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | מפתח API | [קישור](https://factory.ai) | מפתח API מסוג Bearer עבור שער Factory התואם ל-OpenAI. | +| `fal-ai` | `fal` | Fal.ai | מפתח API, תמונה | [קישור](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | מפתח API, אגרגטור | [קישור](https://fastrouter.ai) | מודלים עם הסיומת :free מאפשרים 10 בקשות/יום לכל ארגון ומודל; הזמינות עשויה להשתנות. | +| `featherless-ai` | `featherless` | Featherless AI | מפתח API | [קישור](https://featherless.ai) | שכבה חינמית זמינה — ללא צורך בכרטיס אשראי | +| `fenayai` | `fenayai` | FenayAI | מפתח API, אגרגטור | [קישור](https://fenayai.com) | מפתח API מסוג Bearer עבור שער FenayAI התואם ל-OpenAI. | +| `fireworks` | `fireworks` | Fireworks AI | מפתח API | [קישור](https://fireworks.ai) | 1$ זיכויים התחלתיים חינם בהרשמה לבדיקת API | +| `free-ai` | `free-ai` | Free.ai | מפתח API, אגרגטור | [קישור](https://free.ai) | 30,000 אסימונים/יום מכסים מודלים באירוח עצמי לאחר אימות דוא"ל. שימוש מעבר למאגר יכול לחייב בעלות גולמית, ומודלים חיצוניים פרימיום בתשלום. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | מפתח API | [קישור](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API key | [link](https://freebuff.com) | הזן אסימון אימות של Freebuff / Codebuff (מתקבל באמצעות התחברות CLI או קוצר אוטומטי). | +| `freeinference` | `freeinference` | FreeInference | API key, aggregator | [link](https://freeinference.org) | גישה חופשית למחקר ללא כרטיס; מועמדים שאינם מהרווארד דורשים אישור ידני ואין מכסה מספרית מובטחת בפומבי. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API key | [link](https://freemodel.dev) | 300$ קרדיטים חינם בהרשמה — אין צורך בכרטיס אשראי. גישה ל-GPT-5.4 ו-GPT-5.5 (מודלי הדגל האחרונים של OpenAI) דרך API תואם OpenAI. | +| `freetheai` | `fta` | FreeTheAi | API key, aggregator | [link](https://freetheai.xyz) | הצטרף לדיסקורד של FreeTheAi כדי לקבל את מפתח ה-API החינמי שלך. | +| `friendliai` | `friendli` | FriendliAI | API key | [link](https://friendli.ai) | שכבה חינמית להסקה ללא שרת — אין צורך בכרטיס אשראי | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API key, aggregator | [link](https://g4f.space) | אפו קרדיטים אנונימיים של עוגה ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו אחד ב-g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API key, aggregator | [link](https://g4f.space) | אפו קרדיטים אנונימיים של עוגה ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו אחד ב-g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API key, aggregator | [link](https://g4f.space) | אפו קרדיטים אנונימיים של עוגה ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו אחד ב-g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API key, aggregator | [link](https://g4f.space) | אפו קרדיטים אנונימיים של עוגה ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו אחד ב-g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API key, aggregator | [link](https://g4f.space) | אפו קרדיטים אנונימיים של עוגה ב-g4f.dev/chat, או השתמשו במפתח חבר של g4f.dev (צרו אחד ב-g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API key | [link](https://galadriel.com) | ⚠️ **הוצא משימוש.** api.galadriel.ai אינו נפתר עוד (ניקוי 2026-06-19); נראה ש-API ההסקה הופסק. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API key | [link](https://aistudio.google.com) | שכבה חינמית זמינה דרך Google AI Studio; מכסות נוכחיות לכל מודל ומגבלות אזוריות חלות | +| `getgoapi` | `ggo` | GoAPI | API key, aggregator | [link](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API key | [link](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API key | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | אסימון גישה אישי של GitLab עבור ה-API הציבורי של Code Suggestions. הגדר כתובת URL בסיסית באירוח עצמי כאשר אינך משתמש ב-gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API key | [link](https://opengateway.gitlawb.com) | MiMo חינם (xiaomi/mimo-v2.5) בוטל ב-2026-05 — Opengateway הוא כעת שער קרדיטים בתשלום לפי שימוש; אין מודל חינמי חוזר. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API key | [link](https://opengateway.gitlawb.com) | מבצע Nemotron החינמי הסתיים ב-2026-06 — נתיב GMI Cloud הוא כעת רק קרדיטים בתשלום לפי שימוש. | +| `glm` | `glm` | GLM Coding | API key | [link](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (China) | API key | [link](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API key | [link](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API key | [link](https://greenpt.com) | מנוי API חינם ליצירה; ההסקה מחויבת לפי אסימון. לא פורסמה הקצבת הסקה חינמית. | +| `groq` | `groq` | Groq | API key | [link](https://groq.com) | תוכנית חינמית: מגבלות לכל מודל (200K אסימונים/יום לכל מודל צ'אט; ראה console.groq.com/docs/rate-limits עבור RPM/RPD) — ללא אמצעי תשלום שמור. | +| `haiper` | `hp` | Haiper | API key, video | [link](https://haiper.ai) | קבל מפתח API ב-haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng Public API | API key | [link](https://api.hcnsec.cn) | קבל מפתח API ב-api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | API key, aggregator | [link](https://helixmind.online) | טענות שהופצו בעבר על 3 RPM/50 RPD וללא צורך בכרטיס לא אושרו במהלך ביקורת 2026-08-02; מכסה וחיוב נוכחיים דורשים אימות חשבון. | +| `helyxai` | `helyxai` | Helyx AI | API key, aggregator | [link](https://helyxai.space) | תוכנית חינמית פעילה מתעדת 100,000 אסימונים/יום; טענת השיווק הנפרדת של האתר על 2M+ סותרת ואינה נחשבת כהבטחת מכסה. | +| `heroku` | `heroku` | Heroku AI | API key, enterprise | [link](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API key | [link](https://huggingface.co) | API הסקה חינמי לאלפי מודלים (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API key | [link](https://hyperbolic.xyz) | 1-5$ קרדיטים לניסיון בהרשמה להסקה ללא שרת | +| `ideogram` | `ideo` | Ideogram | API key | [link](https://ideogram.ai) | קבל מפתח API ב-ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | API key | [link](https://xinghuo.xfyun.cn) | קבל מפתח API ב-console.xfyun.cn | +| `inception` | `inception` | Inception | API key | [link](https://docs.inceptionlabs.ai) | 10M אסימונים חינם בהרשמה, אין צורך בכרטיס אשראי. | +| `inference-net` | `inet` | Inference.net | API key | [link](https://inference.net) | 25$ קרדיטים חינם בהרשמה בתוספת מענקי מחקר זמינים | +| `internlm` | `internlm` | InternLM (Intern-S1) | API key | [link](https://internlm.intern-ai.org.cn/) | מכסה חודשית חינמית ~1M אסימוני קלט / 3M אסימוני פלט (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | מפתח API, embed/rerank | [קישור](https://jina.ai) | מפתח Bearer API עבור api.jina.ai — embeddings, rerank, classify, segment, וחיפוש. מפתחות Dashboard מקבלים עדיפות על פני JINA_AI_API_KEY. זהו אינו כרטיס ה-Reader / r.jina.ai ואינו שואף כתובות URL. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | מפתח API | [קישור](https://jina.ai/reader) | מפתח Bearer API עבור r.jina.ai הממיר URL ל-markdown (עבור /v1/web/fetch בלבד). אינו משרת את /v1/embeddings או /v1/rerank. אותו טוקן של Jina מה-Foundation API עובד; OmniRoute עושה שימוש חוזר במפתח jina-ai dashboard או ב-JINA_AI_API_KEY כאשר כרטיס זה ריק. | +| `kenari` | `kenari` | Kenari | מפתח API | [קישור](https://kenari.id) | השתמש במפתח Kenari API שלך (kn-...) ב-Authorization: Bearer . תואם OpenAI באופן מלא. כתובת API בסיסית: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | מפתח API | [קישור](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | מפתח API, אגרגטור | [קישור](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | מפתח API | [קישור](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | מפתח API | [קישור](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | מפתח API | [קישור](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | מפתח API, אגרגטור | [קישור](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | מפתח API, וידאו | [קישור](https://leonardo.ai) | קבל מפתח API בכתובת leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | מפתח API | [קישור](https://liquid.ai) | קבל מפתח API בכתובת liquid.ai | +| `literouter` | `literouter` | LiteRouter | מפתח API, אגרגטור | [קישור](https://literouter.com) | וריאציות של מודלים חינמיים משתמשות בסיומת :free; מכסות קרדיט יומיות משתנות לפי מודל וקלט חינמי מוגבל ל-5,000 טוקנים. | +| `llamagate` | `llamagate` | LlamaGate | מפתח API | [קישור](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | מפתח API, אגרגטור | [קישור](https://llm.kiwi) | התוכנית החינמית חושפת את auto ו-hrLLM; מגבלת ה-40 בקשות לשעה שפורסמה חלה על hrLLM. | +| `llm7` | `llm7` | LLM7.io | מפתח API | [קישור](https://llm7.io) | השתמש בכל מפתח שאינו ריק (למשל 'unused'). אם מודלים מובנים ישנים מחזירים model_unavailable, השתמש ב-Available Models ← Import from /models או Auto-Sync; מודל חי מאומת: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | מפתח API, אגרגטור | [קישור](https://llmgateway.io) | תוכנית Hosted Free: מודלים במחיר חינמי מוגבלים ל-5 בקשות לכל 10 דקות כאשר בחשבון אין קרדיטים. | +| `logfare` | `logfare` | Logfare | מפתח API, אגרגטור | [קישור](https://logfare.ai) | צור חשבון חינמי בכתובת https://logfare.ai/register (שם משתמש/סיסמה, ללא אימות אימייל) כדי לקבל מפתח API מיידי, ואז הדבק אותו כאן כטוקן Bearer. | +| `longcat` | `lc` | LongCat AI | מפתח API | [קישור](https://longcat.chat/platform/docs) | חינם: מענק חד-פעמי של 10M טוקנים לאחר הרשמה לחשבון + אימות KYC (LongCat-2.0). חד-פעמי בלבד — לא הקצאה יומית/חודשית מתחדשת. | +| `magnific` | `freepik` | Magnific | מפתח API, תמונה | [קישור](https://www.magnific.com) | קבל מפתח API בכתובת magnific.com/user/api-keys (כותרת x-magnific-api-key). מפתחות Freepik developer ישנים עדיין עובדים. | +| `maritalk` | `maritalk` | Maritalk | מפתח API | [קישור](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | מפתח API, אגרגטור | [קישור](https://meganova.ai) | הרשמה חינם ללא כרטיס אשראי. מכסות Tier 1 שפורסמו לכל מודל מסתכמות ב-550 בקשות ליום; הן אינן מאגר גלובלי משותף, וחיוב על חריגה בתשלום עשוי לחול אם הופעל. | +| `meta-llama` | `meta` | Meta Llama API | מפתח API | [קישור](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | מפתח API, וידאו | [קישור](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (China) | מפתח API | [קישור](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | מפתח API | [קישור](https://mistral.ai) | שכבת Experiment חינמית: גישה מוגבלת בקצב (rate-limited) לכל המודלים, ללא צורך בכרטיס אשראי | +| `mixedbread` | `mxbai` | Mixedbread AI | מפתח API | [קישור](https://www.mixedbread.com) | מפתח Bearer API עבור ה-API של Mixedbread embeddings. | +| `mixlayer` | `mixlayer` | Mixlayer | מפתח API, אגרגטור | [קישור](https://www.mixlayer.com) | המודל qwen/qwen3.5-4b-free הוא חינמי ליצירת אב-טיפוס ומוגבל בקצב; לא אושר RPM ציבורי קבוע או מכסה יומית. | +| `mnn-ai` | `mnn-ai` | MNN AI | מפתח API, אגרגטור | [קישור](https://mnnai.ru) | תוכנית חינמית: קרדיטים חודשיים של $1, 10 RPM וגישה רק למודלים המסומנים כ-Free. | +| `modal` | `mdl` | Modal | מפתח API, ארגוני | [קישור](https://modal.com/docs) | השתמש בטוקן ה-bearer המגן על פריסת ה-Modal שלך, אם הופעל. כתובת הבסיס צריכה להצביע על אפליקציית ה-Modal התואמת ל-OpenAI שלך, לדוגמה https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | מפתח API | [קישור](https://modelscope.cn) | שכבה חינמית דרך ModelScope API-Inference — נדרש חשבון Alibaba. | +| `monsterapi` | `monster` | MonsterAPI | מפתח API | [קישור](https://monsterapi.ai) | ⚠️ **לא בשימוש (DEPRECATED).** Monster API סגרה את פעילותה ב-2026-06-30. השתמש בספקים חלופיים תואמי OpenAI. | +| `moonshot` | `moonshot` | Kimi | מפתח API | [קישור](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | מפתח API | [קישור](https://morphllm.com) | שכבה חינמית: 250K קרדיטים לחודש, $0 | +| `muse-code` | `mc` | Muse Code (Meta) | מפתח API | [קישור](https://github.com/meta-llama/llama-stack) | השתמש במשתנה הסביבה META_API_KEY שלך כטוקן Bearer. ה-CLI של Muse Code משתמש בפורמט ה-wire של OpenAI Responses API (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | מפתח API, אגרגטור | [קישור](https://naga.ac) | קבל מפתח API בכתובת naga.ac — הרשמה דרך Google/GitHub/Discord זמינה. | +| `naga-ai` | `naga-ai` | Naga AI | מפתח API, אגרגטור | [קישור](https://naga.ac) | מודלים המסומנים ב-:free רשומים באופן ציבורי, אך מכסה מספרית אינה מאושרת. מדיניות Naga מזהירה כי הנחיות ותפוקות של שכבת החינם עשויות להיאסף או לשמש לאימון. | +| `nanogpt` | `nanogpt` | NanoGPT | מפתח API | [קישור](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | מפתח API | [קישור](https://bynara.id) | צור חשבון NaraRouter חינם, קשר את הטלגרם שלך (נדרש לפני תשובות /v1), ואז הדבק את המפתח כאן כאסימון Bearer. | +| `navy` | `navy` | NavyAI | מפתח API | [קישור](https://api.navy) | צור מפתח API חינם מלוח המחוונים של NavyAI, ואז הדבק אותו כאן כאסימון Bearer. | +| `nebius` | `nebius` | Nebius AI | מפתח API | [קישור](https://nebius.com) | ~1$ קרדיטים לניסיון בהרשמה לבדיקת API | +| `nlpcloud` | `nlpc` | NLP Cloud | מפתח API | [קישור](https://docs.nlpcloud.com) | השתמש במפתח ה-API של NLP Cloud שלך ב-Authorization: Token . OmniRoute מכוון כברירת מחדל לנקודת הקצה של הצ'אטבוט ב-https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | מפתח API | [קישור](https://nomic.ai) | קבל מפתח API ב-atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | מפתח API | [קישור](https://portal.nousresearch.com/help) | השתמש במפתח ה-API של Nous Portal שלך. OmniRoute מכוון לנקודת הקצה הרשמית התואמת ל-OpenAI בכתובת https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | מפתח API, וידאו, אגרגטור | [קישור](https://novita.ai) | 0.50$ קרדיטים לניסיון בהרשמה (תקפים כשנה) | +| `nscale` | `nscale` | nScale | מפתח API | [קישור](https://nscale.com) | 5$ קרדיטים חינם בהרשמה לבדיקת הסקה | +| `nube` | `nube` | Nube.sh | מפתח API | [קישור](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | מפתח API | [קישור](https://build.nvidia.com) | גישת מפתחים חינם: ~40 RPM, 70+ מודלים (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | מפתח API, ארגוני | [קישור](https://www.oracle.com/artificial-intelligence/generative-ai) | השתמש במפתח ה-API של OCI Generative AI או באסימון Bearer של IAM. כתובת ה-URL הבסיסית יכולה להיות https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | מפתח API, אגרגטור | [קישור](https://ofox.ai) | הקטלוג הנוכחי מפרסם 10+ מודלים חינמיים ללא מכסה מספרית ציבורית; סקור את מקוריות המקור, שמירת הנתונים ותנאי האימון לפני שימוש בייצור. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | מפתח API | [קישור](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | מפתח API | [קישור](https://1min.ai) | צור מפתח API בכתובת https://docs.1min.ai/docs/api/create-api-key, ואז הדבק אותו כאן. | +| `openadapter` | `oad` | OpenAdapter | מפתח API | [קישור](https://openadapter.dev) | השתמש במפתח ה-API של OpenAdapter שלך ב-Authorization: Bearer sk-cv-. תואם באופן מלא ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | מפתח API | [קישור](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | מפתח API | [קישור](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | מפתח API | [קישור](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | מפתח API | [קישור](https://openference.com) | שכבה חינמית: כוללת Qwen3.8 27b ו-Llama 3.2 3B — ראה openference.com/pricing לתנאים עדכניים | +| `openrouter` | `openrouter` | OpenRouter | מפתח API, אגרגטור | [קישור](https://openrouter.ai) | מודלים חינמיים ב-$0/אסימון עם סיומת :free - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | מפתח API | [קישור](https://openvecta.com) | קרדיטים חינם בהרשמה להסקה תואמת OpenAI על פני LLMs, הטמעות ומודלי חשיבה | +| `opper` | `opper` | Opper | מפתח API, אגרגטור | [קישור](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | מפתח API | [קישור](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | מפתח API | [קישור](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | מפתח API | [קישור](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | מפתח API | [קישור](https://www.perplexity.ai) | השתמש במפתח ה-API של Perplexity שלך. OmniRoute מנתב מזהי מודלים של Agent API דרך נקודת הקצה התואמת ל-Responses של Perplexity. | +| `piapi` | `pi` | PiAPI | מפתח API, אגרגטור | [קישור](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | מפתח API | [קישור](https://pioneer.ai) | 75$ קרדיטים לשימוש חינם — אין צורך בכרטיס אשראי | +| `plamo` | `plamo` | PLaMo | מפתח API | [קישור](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | מפתח API, אגרגטור | [קישור](https://creator.poe.com/api-reference) | מפתח API מסוג Bearer עבור ה-API התואם ל-OpenAI של Poe. | +| `poixe-ai` | `poixe-ai` | Poixe AI | מפתח API, אגרגטור | [קישור](https://poixe.com) | המגבלות הציבוריות החינמיות הנוכחיות קטנות וספציפיות לקבוצת מודלים: 2 RPM/5 RPD למודלים גדולים ו-20 RPM/50 RPD למודלים קטנים. | +| `pollinations` | `pol` | Pollinations AI | מפתח API, וידאו | [קישור](https://pollinations.ai) | גישה אנונימית/ללא מפתח למודלים החינמיים המתועדים היא מאמץ מיטבי. אימות מקומי v3.8.50 (2026-07-31) החזיר 401 דרך OmniRoute ו-Cloudflare 1010 בבדיקות ישירות במעלה הזרם מאותה רשת. מודלי פרימיום עדיין דורשים מפתח API של Pollinations מ-enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | מפתח API | [קישור](https://poolside.ai) | Laguna S 2.1 ו-XS 2.1 חינמיים במהלך התצוגה המקדימה; לא פורסמה מכסה מספרית ציבורית. | +| `predibase` | `predibase` | Predibase | מפתח API | [קישור](https://predibase.com) | ⚠️ **הוצא משימוש.** serving.app.predibase.com אינו נפתר עוד (סריקה 2026-06-19); נראה ש-API השירות המנוהל הופסק. | +| `publicai` | `publicai` | PublicAI | מפתח API | [קישור](https://publicai.co) | דורש מפתח API — קרדיט חד פעמי בהרשמה, ואז בתשלום | +| `qianfan` | `qianfan` | Baidu Qianfan | מפתח API | [קישור](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API key | [link](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API key | [link](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API key | [link](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API key, image | [link](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API key | [link](https://regolo.ai) | קבל את מפתח ה-API של Regolo מ-regolo.ai, ולאחר מכן הדבק אותו כאן כ-Bearer token. | +| `reka` | `reka` | Reka | API key | [link](https://docs.reka.ai/chat/overview) | השתמש במפתח ה-API שלך של Reka. OmniRoute תומך בכתובת ה-URL הבסיסית התואמת ל-OpenAI https://api.reka.ai/v1 ושולח גם כותרות Authorization ו-X-Api-Key לתאימות. | +| `requesty` | `requesty` | Requesty | API key | [link](https://requesty.ai) | שכבה חינמית ~200 בקשות/יום - שער ניתוב מרובה מודלים (300+ מודלים) | +| `routeway` | `routeway` | Routeway | API key | [link](https://routeway.ai) | צור מפתח API חינמי ב-routeway.ai, ולאחר מכן הדבק אותו כאן כ-Bearer token. | +| `runwayml` | `runway` | Runway | API key, video | [link](https://docs.dev.runwayml.com) | השתמש במפתח ה-API של Runway שלך ב-Authorization: Bearer . OmniRoute מכוון ל-API הנוכחי של Runway בכתובת https://api.dev.runwayml.com/v1 ושולח את כותרת ה-X-Runway-Version הנדרשת באופן אוטומטי. | +| `sambanova` | `samba` | SambaNova | API key | [link](https://sambanova.ai) | 5$ קרדיטים חינם בהרשמה (תוקף ל-30 יום), ללא צורך בכרטיס אשראי | +| `sap` | `sap` | SAP Generative AI Hub | API key, enterprise | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | השתמש ב-bearer token של SAP AI Core שלך. כתובת ה-URL הבסיסית יכולה להיות שורש ה-AI_API_URL שלך או deploymentUrl מ-Generative AI Hub. | +| `sarvam` | `sarvam` | Sarvam AI | API key | [link](https://docs.sarvam.ai) | ₹1,000 בקרדיטים חינם בהרשמה — לעולם לא יפוגו | +| `scaleway` | `scw` | Scaleway AI | API key | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | מיליון טוקנים חינם לחשבונות חדשים — תואם EU/GDPR (פריז), Qwen3 235B & Llama 70B | +| `sealion` | `sealion` | SEA-LION | API key | [link](https://sea-lion.ai) | היכנס ל-sea-lion.ai עם חשבון Google (ללא כרטיס, ללא חומת אזור), צור מפתח API, ולאחר מכן הדבק אותו כאן. | +| `seekai` | `ska` | SeekAi | API key, aggregator | [link](https://seekai.cc) | צור מפתח API בכתובת https://seekai.cc, ולאחר מכן הדבק אותו כאן כ-Bearer token. | +| `segmind` | `segmind` | Segmind | API key, image, video | [link](https://segmind.com) | השתמש במפתח ה-API של Segmind שלך בכותרת x-api-key. OmniRoute מכוון ל-https://api.segmind.com/v1/ ומחזיר את בייטי התמונה/וידאו שנוצרו ישירות. | +| `sensenova` | `sensenova` | SenseNova | API key | [link](https://platform.sensenova.cn) | קבל מפתח API ב-platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | API key | [link](https://cloud.siliconflow.com) | 1$ קרדיטים חינם בתוספת מודלים הרשומים כרגע ב-0$ לאחר אימות זהות; זמינות ומגבלות עשויים להשתנות | +| `snowflake` | `snowflake` | Snowflake Cortex | API key, enterprise | [link](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API key | [link](https://xinghuo.xfyun.cn) | קבל מפתח API ב-console.xfyun.cn | +| `speka` | `speka` | Speka AI | API key, aggregator | [link](https://speka.me) | תוכנית חינמית: 1$ שימוש חודשי, 10 בקשות לדקה (RPM), מפתח API אחד וגישה למודלים פתוחים ולסביבת הניסוי; ללא צורך בכרטיס. | +| `stability-ai` | `stability` | Stability AI | API key, image | [link](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API key | [link](https://stepfun.com) | קבל מפתח API ב-platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | API key | [link](https://ai.sumopod.com) | השתמש במפתח ה-API של SumoPod שלך (sk-...) ב-Authorization: Bearer . תואם באופן מלא ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API key | [link](https://suno.ai) | הדבק עוגיית סשן מ-suno.ai (אימות Clerk) | +| `synthetic` | `synthetic` | Synthetic | API key, aggregator | [link](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API key, aggregator | [link](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API key | [link](https://hunyuan.tencent.com) | קבל מפתח API ב-console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | API key, aggregator | [link](https://theb.ai) | מפתח API מסוג Bearer עבור שער TheB.AI התואם ל-OpenAI. | +| `tinyfish` | `tf` | TinyFish Fetch | API key | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key מ-agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API key, video | [link](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API key | [link](https://agent-router.gaib.ai) | השתמש במפתח ה-API של Token Kiosk שלך ב-Authorization: Bearer . שער תואם באופן מלא ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API key, aggregator | [link](https://www.tokenreply.com) | למודלים המסומנים כחינמיים יש מגבלות יומיות ספציפיות למודל ולקמפיין; לא פורסמה מכסה גלובלית קבועה בחינם. | +| `tokenrouter` | `trk` | TokenRouter | API key | [link](https://tokenrouter.com) | השתמש במפתח ה-API של TokenRouter שלך ב-Authorization: Bearer . תואם באופן מלא ל-OpenAI. כתובת ה-URL הבסיסית של ה-API: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API key, image | [link](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API key | [link](https://docs.opentyphoon.ai) | מפתח API חינמי עם מגבלת קצב של 5 בקשות לשנייה (req/s) ו-200 בקשות לדקה (req/m). | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | מפתח API | [link](https://uncensored.com) | השתמש במפתח ה-API למפתחים של uncensored.com (uai_sk_live_...). OmniRoute שולח אותו ככותרת X-api-key לנקודת הקצה התואמת ל-OpenAI בכתובת https://api.uncensored.com/api/v1. המפתח אינו פג תוקף לעולם. זהו השירות המבוסס על מדידה/קרדיטים; צ'אט המנוי ללא מדידה הוא ספק ה-'uc' הנפרד. | +| `udio` | `udio` | Udio | מפתח API | [link](https://udio.com) | הדבק עוגיית סשן מ-udio.com (אימות Supabase) | +| `unorouter` | `unorouter` | UnoRouter | מפתח API, אגרגטור | [link](https://unorouter.ai) | מודלים עם הסיומת :free אינם מחייבים את היתרה; המגבלה היא בקשה אחת לדקה לכל מודל חינמי לכל משתמש. | +| `upstage` | `upstage` | Upstage | מפתח API | [link](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | מפתח API | [link](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | מפתח API | [link](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | מפתח API, אגרגטור | [link](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | מפתח API, ארגוני | [link](https://cloud.google.com/vertex-ai) | ספק JSON של חשבון שירות, אסימון גישה של OAuth, מפתח API של Vertex Express, או מפתח הרשאה הקשור לחשבון שירות. מצב Express תומך ב-Gemini בלבד; מודלי שותפים דורשים אישורי פרויקט. | +| `vertex-partner` | `vp` | Vertex AI Partners | מפתח API, ארגוני | [link](https://cloud.google.com/vertex-ai) | ספק JSON של חשבון שירות או אישורי OAuth. מפתח הרשאה הקשור לחשבון שירות תומך גם בגילוי, אך הסקת שותפים דורשת בנוסף את מזהה הפרויקט של Google Cloud. מפתחות Express סטנדרטיים תומכים ב-Gemini בלבד. | +| `void-ai` | `void-ai` | Void AI | מפתח API, אגרגטור | [link](https://voidai.app) | קטלוג המודלים הציבורי מסמן חלק מהמודלים כדורשים תוכנית חינמית, אך הגישה מותנית ולא אושרה מכסה מספרית. | +| `volcengine` | `volcengine` | Volcengine | מפתח API | [link](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | מפתח API | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | חבר את חשבון Volcano Engine שלך או השתמש במפתח API של מנוי Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | מפתח API | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | חבר את חשבון Volcano Engine שלך או השתמש במפתח API של מנוי Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | מפתח API, הטמעה/דירוג מחדש | [link](https://www.voyageai.com) | מפתח API מסוג Bearer עבור ממשקי ה-API של Voyage AI להטמעות ודירוג מחדש. | +| `wafer` | `wafer` | Wafer AI | מפתח API | [link](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | מפתח API | [link](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | מפתח API, ארגוני | [link](https://www.ibm.com/products/watsonx-ai) | השתמש באסימון ה-bearer שלך של watsonx. כתובת ה-URL הבסיסית יכולה להיות https://.ml.cloud.ibm.com/ml/gateway/v1/ או נקודת קצה בניהול עצמי /ml/gateway/v1. | +| `writer` | `writer` | Writer | מפתח API | [link](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | מפתח API | [link](https://x5lab.dev) | השתמש במפתח ה-API של X5Lab (x5-...) בכותרת Authorization: Bearer . תואם באופן מלא ל-OpenAI. כתובת URL בסיסית של API: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | מפתח API | [link](https://x.ai) | השתמש במפתח API רשמי של xAI, או היכנס באמצעות xAI OAuth. סשני Grok Build JWT נשארים ספק נפרד. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | מפתח API | [link](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | מפתח API | [link](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | מפתח API, אגרגטור | [link](https://xkiro.com) | צור חשבון חינמי ב-xkiro.com והדבק את המפתח כאן (Bearer; x-api-key מתקבל גם כן). | +| `yi` | `yi` | Yi (01.AI) | מפתח API | [link](https://01.ai) | קבל מפתח API ב-platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | מפתח API, אגרגטור | [link](https://yolo-auto.com) | גישת API חינמית מוגבלת בבקשות ומיועדת לבדיקות; לא פורסמה מכסה יומית מספרית וגישה חינמית אינה מובטחת ללא הגבלת זמן. | +| `zai` | `zai` | Z.AI | מפתח API | [link](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | מפתח API | [link](https://zenmux.ai) | השתמש במפתח ה-API של ZenMux בכותרת Authorization: Bearer . ZenMux תואם באופן מלא ל-OpenAI. כתובת URL בסיסית: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | מפתח API, אגרגטור | [link](https://www.zerolimitai.com) | מוצעת תקופת ניסיון חינם זמנית, אך דפים רשמיים סותרים בין 3 ל-7 ימים; טענה ל-100 קריאות ביום אינה נחשבת קבועה. | +| `zylo-api` | `zylo` | Zylo API | מפתח API, אגרגטור | [link](https://zyloai.net) | תוכנית בסיסית: 10 בקשות לדקה, 7,200 בקשות ביום ו-200,000 אסימונים ביום; מוגבל למודלי טקסט בסיסיים. | ## ספקים מקומיים (14) diff --git a/docs/i18n/he/docs/routing/REASONING_REPLAY.md b/docs/i18n/he/docs/routing/REASONING_REPLAY.md index 64101a438730..c43b77b9731d 100644 --- a/docs/i18n/he/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/he/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ OmniRoute לוכד את `reasoning_content` של המסייע שנוצר על י ## ארכיטקטורה ``` -תור N (המסייע יוצר): +תור N (העוזר יוצר): → התגובה מכילה reasoning_content + tool_calls → אם requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - כותב (לזיכרון + למסד הנתונים), לפי המפתח של כל tool_call.id - → מעביר את התגובה ללקוח (שעשוי לשמור את תהליך החשיבה או לא) + כותבת (לזיכרון + למסד הנתונים), עם מפתח המבוסס על כל tool_call.id + → העברת התגובה ללקוח (שעשוי לשמור את ההנמקה או לא) -תור N+1 (הלקוח שולח בקשת המשך): +תור N+1 (הלקוח שולח הודעת המשך): → המתרגם מזהה: requiresReasoningReplay(provider, model) === true - → עבור כל הודעת מסייע עם tool_calls וללא reasoning_content: + → עבור כל הודעת עוזר עם tool_calls וללא reasoning_content: lookupReasoning(toolCalls[0].id) → זיכרון → מסד נתונים - נמצא → msg.reasoning_content = cached; recordReplay() - לא נמצא → msg.reasoning_content = "" (חלופת תאימות מדור קודם עבור DeepSeek ישן יותר) - → הספק במעלה הזרם מקבל היסטוריה עקבית → אין 400 + נמצאה התאמה → msg.reasoning_content = cached; recordReplay() + לא נמצאה התאמה → msg.reasoning_content = "" (חלופת תאימות לאחור עבור גרסאות ישנות יותר של DeepSeek) + → השירות במעלה הזרם מקבל היסטוריה עקבית → אין שגיאת 400 ``` -הלכידה מתבצעת ב-`open-sse/handlers/chatCore.ts` (בשני מיקומים, בשני אתרי הקריאה ל-`cacheReasoningFromAssistantMessage`). ההשמעה מחדש מתבצעת ב-`open-sse/translator/index.ts` לאחר התאמת הסכימה, אך לפני הניתוב. +הלכידה מתבצעת ב-`open-sse/handlers/chatCore.ts` (בשני מקומות, בשתי הקריאות אל `cacheReasoningFromAssistantMessage`). ההפעלה החוזרת מתבצעת ב-`open-sse/translator/index.ts` לאחר התאמת הסכימה אך לפני השליחה. + +תורות רגילים של העוזר (ללא קריאה לכלי) מקבלים מפתח באופן שונה: `buildAssistantMessageCacheKey()` מחשבת תקציר של תחום ההפעלה יחד עם התמליל המנורמל בפורמט OpenAI עד לאותו תור, מכיוון ש-DeepSeek דורש את ההנמקה של _כל_ תור קודם ברגע ש-`tools` קיים. עבור יעדים של Responses API (לדוגמה `opencode-go/deepseek-v4-flash`, שמנותב אל `/responses`), גוף הבקשה במעלה הזרם מכיל `input`, ולא `messages`, ולכן `translateRequest()` ‏(`open-sse/translator/index.ts`) מדווחת באמצעות אפשרות callback על תמליל הביניים שעבורו היא חישבה תקציר, ואתרי הלכידה מחשבים תקציר של אותו תמליל. מעבר ההפעלה החוזרת של Responses פועל על ייצוג הביניים של OpenAI עבור כל פורמט מקור, ולכן ההפעלה החוזרת מתבצעת גם עבור לקוחות Anthropic Messages ‏(Claude → OpenAI → Responses). ## אחסון — זיכרון היברידי + SQLite @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -אינדקסים: `expires_at`, `provider`, `model`, `created_at`. הערך `expires_at` נשמר כמספר שניות מתקופת Unix; שכבת ה-SELECT מנרמלת ערכי טקסט ישנים באמצעות `EXPIRES_AT_EPOCH_SQL`. +אינדקסים: `expires_at`,‏ `provider`,‏ `model`,‏ `created_at`. הערך `expires_at` מאוחסן כמספר השניות בתקופת Unix; שכבת ה-SELECT מנרמלת ערכי טקסט ישנים באמצעות `EXPIRES_AT_EPOCH_SQL`. ## זיהוי ספק / מודל diff --git a/docs/i18n/he/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/he/docs/security/SOCKET_DEV_FINDINGS.md index 3abdf51bdb50..7481ec269d56 100644 --- a/docs/i18n/he/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/he/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,20 +4,23 @@ --- -מסמך זה הוא הצהרת האימות שחיבר המתחזק עבור ששת הממצאים מסוג -`AI-detected potential malware` שדווחו נגד `omniroute@3.8.5`, ועבור -אמצעי ההפחתה שיושמו ב-`omniroute@3.8.6`. הוא קיים כדי: +> **הערת תחולה:** `socket.yml` מגדיר את הסריקה של Socket.dev בצד הרישום לאחר פרסום של ארטיפקט npm (נתיבים שיש להתעלם מהם עבור תוכן שאינו מופץ, כגון `tests/`,‏ `docs/` ודוחות בנייה). הוא אינו מגדיר שער מיזוג של CI/PR — שום תהליך עבודה תחת `.github/workflows`, שום סקריפט ב-`package.json` ושום יעד ב-`Makefile` אינם מפעילים את Socket.dev. -1. שלמפעילי צינור האבטחה יהיה מקור יחיד שיוכלו לצטט כאשר עליהם - להעריך את הממצאים מול קוד המקור בפועל. -2. שסורקי AI עתידיים יוכלו לזהות את הצהרת המתחזק החתומה, שלפיה כל - נתיב שסומן הוא מכוון, מופעל רק בהסכמה ומתועד. -3. שיהיה לנו תיעוד כתוב של _הסיבה_ לכך שכל אתר קריאה בנוי כפי שהוא — - כדי ששכתוב עתידי לא יחזיר בטעות טביעת אצבע שהוסרה במכוון. +מסמך זה הוא הצהרת האימות שחוברה על ידי המתחזקים עבור ששת הממצאים מסוג +`AI-detected potential malware` שדווחו לגבי `omniroute@3.8.5`, וכן עבור +אמצעי ההפחתה שיושמו ב-`omniroute@3.8.6`. מטרתו היא: + +1. לספק למפעילי צינור האבטחה אסמכתה יחידה שיוכלו לצטט כאשר עליהם + להעריך את הממצאים אל מול קוד המקור בפועל. +2. לאפשר לסורקי AI עתידיים לזהות את הטענה החתומה בידי המתחזקים, שלפיה כל + נתיב שסומן הוא מכוון, דורש הסכמה מפורשת ומתועד. +3. להחזיק תיעוד כתוב המסביר _מדוע_ כל אתר קריאה בנוי כפי שהוא — + כדי ששכתוב עתידי לא יציג מחדש בטעות טביעת אצבע + שהוסרה במכוון. אם אתם מפעילים סורק שמסמן מחדש אחד מאתרי הקריאה שלהלן לאחר פרסום -אמצעי ההפחתה של v3.8.6, אנא פתחו דיווח עם עקבות הסריקה ואנו נרחיב -כאן את הצהרת האימות. +אמצעי ההפחתה של v3.8.6, אנא פתחו דיווח עם עקבת הסריקה, +ואנו נרחיב כאן את הצהרת האימות. --- diff --git a/docs/i18n/hi/README.md b/docs/i18n/hi/README.md index c74ed588a02a..1630b5897af6 100644 --- a/docs/i18n/hi/README.md +++ b/docs/i18n/hi/README.md @@ -23,13 +23,13 @@ -> मुफ़्त टियर को हाथ से एक साथ जोड़ना कष्टदायक है — दर्जनों SDK, दर्जनों दर सीमाएँ, और यह भी पता नहीं कि वास्तव में आपके पास कितना उपलब्ध है। OmniRoute **35 आवर्ती पूल कुंजियों में 491 मुफ़्त-टियर प्रविष्टियों** को सूचीबद्ध करता है और **प्रकाशित सकारात्मक मासिक बजट वाले 17 पूल तथा Groq की प्रति-मॉडल पाँच सीमाओं** से टोकन की मुख्य संख्या की गणना करता है, जिसमें साझा पूल के आधार पर डुप्लिकेट हटाए जाते हैं। जो कोटा केवल क्षेत्रीय पहचान सत्यापन के बाद उपलब्ध होते हैं (वर्तमान में: ModelScope), उन्हें अलग दिखाया जाता है—क्षेत्रीय पहचान सत्यापन के पीछे +~6M—और उन्हें कभी भी मुख्य संख्या में नहीं जोड़ा जाता। परिणाम डैशबोर्ड (`/dashboard/free-tiers`) पर दिखाई देता रहता है। +> मुफ़्त टियरों को हाथ से एक साथ जोड़ना कठिन है — दर्जनों SDK, दर्जनों दर सीमाएँ, और यह पता नहीं कि वास्तव में आपके पास कितना है। OmniRoute **35 आवर्ती पूल कुंजियों में 489 मुफ़्त-टियर प्रविष्टियों** को सूचीबद्ध करता है और **प्रकाशित सकारात्मक मासिक बजट वाले 17 पूलों तथा पाँच प्रति-मॉडल Groq सीमाओं** से टोकन की मुख्य संख्या की गणना करता है, जिसमें साझा पूल के आधार पर दोहराव हटाया जाता है। जो कोटा केवल क्षेत्रीय पहचान सत्यापन के बाद उपलब्ध होते हैं (वर्तमान में: ModelScope), उन्हें अलग दिखाया जाता है—क्षेत्रीय पहचान सत्यापन के पीछे +~6M—और उन्हें मुख्य संख्या में कभी नहीं जोड़ा जाता। परिणाम डैशबोर्ड (`/dashboard/free-tiers`) पर दिखाई देता रहता है। -OmniRoute मुफ़्त-टियर बजट कार्ड: स्थायी रूप से प्रति माह ~1.62B मुफ़्त टोकन, साइनअप क्रेडिट के साथ पहले महीने में अधिकतम ~2.22B, एक एंडपॉइंट के पीछे 491 सूचीबद्ध मुफ़्त-टियर प्रविष्टियों को कवर करने वाली 35 प्रलेखित आवर्ती पूल कुंजियों से। ईमानदार, पूल-डुप्लिकेट-रहित गणना — प्रत्येक साझा पूल केवल एक बार गिना गया है, जिसमें प्रकाशित सकारात्मक मासिक टोकन बजट वाले 17 आवर्ती पूल और Groq की प्रति-मॉडल पाँच सीमाएँ शामिल हैं; शर्तों-संबंधी जोखिम सूची में 13 प्रदाताओं को बचने योग्य चिह्नित किया गया है, ताकि निर्णय आप लें। बजट बार में Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (प्रति-मॉडल पाँच सीमाएँ) और छोटे पूल शामिल हैं; साथ ही पहले महीने के साइनअप क्रेडिट और स्थायी रूप से मुफ़्त, बिना टोकन सीमा वाले प्रदाताओं को अलग दिखाया गया है, ताकि वे मुख्य संख्या को कभी कृत्रिम रूप से न बढ़ाएँ। /dashboard/free-tiers पर उपयोग और शेष मात्रा का लाइव विवरण। +OmniRoute मुफ़्त-टियर बजट कार्ड: निरंतर रूप से प्रति माह ~1.62B मुफ़्त टोकन, साइनअप क्रेडिट के साथ पहले महीने में अधिकतम ~2.22B, एक एंडपॉइंट के पीछे 489 सूचीबद्ध मुफ़्त-टियर प्रविष्टियों को समाहित करने वाली 35 प्रलेखित आवर्ती पूल कुंजियों से। ईमानदार, पूल-दोहराव-रहित गणना — प्रत्येक साझा पूल को केवल एक बार गिना गया है, जिसमें प्रकाशित सकारात्मक मासिक टोकन बजट वाले 17 आवर्ती पूल और पाँच प्रति-मॉडल Groq सीमाएँ शामिल हैं; शर्तों से जुड़े जोखिम की सूची में 13 प्रदाताओं को बचने योग्य चिह्नित किया गया है, ताकि निर्णय आप लें। बजट बार में Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (पाँच प्रति-मॉडल सीमाएँ) और छोटे पूल शामिल हैं; साथ ही पहले महीने के साइनअप क्रेडिट और स्थायी रूप से मुफ़्त, बिना टोकन सीमा वाले प्रदाताओं को अलग दिखाया गया है, ताकि वे मुख्य संख्या को कभी कृत्रिम रूप से न बढ़ाएँ। /dashboard/free-tiers पर उपयोग और शेष राशि का लाइव विवरण। -> लाइव `/dashboard/free-tiers` पृष्ठ का एनिमेटेड सारांश। पूरी कार्यप्रणाली (पूल डुप्लिकेट हटाना, क्रेडिट टियर, प्रदाता की शर्तें): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**। +> लाइव `/dashboard/free-tiers` पृष्ठ का एनिमेटेड सारांश। पूरी कार्यप्रणाली (पूल दोहराव हटाना, क्रेडिट टियर, प्रदाता की शर्तें): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**। > -> इन आँकड़ों का लाइव कैटलॉग के आधार पर हर दो सप्ताह में दोबारा ऑडिट किया जाता है और ये **दोनों दिशाओं में बदलते हैं** — कोई प्रदाता मुफ़्त टियर बंद करता है तो संख्या घटती है; कोई नया जुड़ता है तो यह बढ़ती है। हम वही प्रकाशित करते हैं जिसकी गणना कैटलॉग वास्तव में करता है, कभी भी ऊपर पूर्णांकित सर्वोत्तम स्थिति नहीं। +> इन आँकड़ों का हर दो सप्ताह में लाइव कैटलॉग के आधार पर पुनः ऑडिट किया जाता है और ये **दोनों दिशाओं में बदलते हैं** — कोई प्रदाता मुफ़्त टियर समाप्त करता है तो संख्या घटती है; कोई नया जुड़ता है तो बढ़ती है। हम वही प्रकाशित करते हैं जिसकी गणना कैटलॉग वास्तव में करता है, कभी भी ऊपर की ओर पूर्णांकित सर्वोत्तम स्थिति नहीं।
@@ -37,7 +37,7 @@

-⭐ यदि OMNIROUTE ने आपके पैसे बचाने और आपके काम को आसान बनाने में मदद की है, तो रेपो को स्टार दें। +⭐ यदि OMNIROUTE ने पैसे बचाने और आपका काम आसान बनाने में आपकी सहायता की है, तो रेपो को स्टार दें।

@@ -599,9 +599,9 @@ Radar ऑप्ट-इन और केवल-GET है। OmniRoute क्ल
-## 🤖 संगत CLIs और कोडिंग एजेंट्स +## 🤖 संगत CLIs और कोडिंग एजेंट -> एक कॉन्फ़िग — `http://localhost:20128/v1` — और **हर** AI IDE या CLI मुफ़्त और कम लागत वाले मॉडल पर चलता है। +> एक कॉन्फ़िगरेशन — `http://localhost:20128/v1` — और **हर** AI IDE या CLI मुफ़्त और कम लागत वाले मॉडल पर चलता है।
@@ -635,23 +635,23 @@ Radar ऑप्ट-इन और केवल-GET है। OmniRoute क्ल - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ इनके साथ भी काम करता है · Kiro · Command Code · Antigravity · Windsurf · AMP · किसी भी OpenAI-संगत टूल के साथ ++ इनके साथ भी काम करता है · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · कोई भी OpenAI-संगत टूल
-📖 सभी 36 टूल (26 CLI Code's + 10 CLI Agents) के लिए प्रति-टूल सेटअप → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode प्लगइन → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 सभी 36 टूल (26 CLI Code + 10 CLI Agents) के लिए प्रति-टूल सेटअप → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode प्लगइन → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**एक ही कमांड से OmniRoute के माध्यम से किसी भी समर्थित CLI को लॉन्च करें** — कोई कॉन्फ़िगरेशन फ़ाइल नहीं लिखी जाती, -प्रत्येक प्रक्रिया के लिए क्रेडेंशियल इंजेक्ट किए जाते हैं, और Qwen/Gemini को एक अस्थायी पृथक होम मिलता है: +**OmniRoute के माध्यम से किसी भी समर्थित CLI को एक ही कमांड में लॉन्च करें** — कोई कॉन्फ़िगरेशन फ़ाइल नहीं लिखी जाती, +प्रत्येक प्रोसेस के लिए क्रेडेंशियल्स इंजेक्ट किए जाते हैं, और Qwen/Gemini को एक अस्थायी पृथक होम मिलता है: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -666,19 +666,19 @@ omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" omniroute configure codex # ये भी: claude opencode qwen aider goose gemini cline continue kilo ``` -प्रत्येक कमांड सक्रिय रिमोट कॉन्टेक्स्ट (`omniroute connect `) का पालन करता है, `--dry-run` -बिना निष्पादित किए सटीक env/args का पूर्वावलोकन करता है, और `--api-key-env NAME` सीक्रेट्स को -आपकी शेल हिस्ट्री से बाहर रखता है। → [CLI एकीकरण](docs/guides/CLI-INTEGRATIONS.md) +हर कमांड सक्रिय रिमोट कॉन्टेक्स्ट (`omniroute connect `) का पालन करती है, `--dry-run` +निष्पादन किए बिना सटीक env/args का पूर्वावलोकन करता है, और `--api-key-env NAME` सीक्रेट्स को +आपके शेल इतिहास से बाहर रखता है। → [CLI इंटीग्रेशन](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 AI प्रदाता — 152 कैटलॉग में निःशुल्क के रूप में चिह्नित +## 🌐 357 AI प्रदाता — 152 कैटलॉग-चिह्नित निःशुल्क
-> कैनोनिकल चैट, मीडिया, खोज, स्थानीय, क्लाउड-एजेंट और सिस्टम संग्रहों में **357 पंजीकृत प्रदाता**, जिनमें **152 के पास `hasFree: true` डिस्कवरी मेटाडेटा है**। चैट मॉडल रजिस्ट्री में **229 प्रदाता / 2,554 विशिष्ट प्रदाता-मॉडल युग्म / 1,283 अपरिष्कृत मॉडल ID** शामिल हैं; अलग निःशुल्क-बजट कैटलॉग में **491 प्रति-मॉडल पंक्तियाँ**, **35 आवर्ती पूल** और **54 आवर्ती/कुंजी-रहित हमेशा-निःशुल्क प्रदाता** हैं। ये जानबूझकर अलग-अलग हर हैं; परिभाषाएँ और पूल-डीडुप्लिकेटेड गणनाएँ [प्रदाता संदर्भ](docs/reference/PROVIDER_REFERENCE.md) और [निःशुल्क टियर](docs/reference/FREE_TIERS.md) में उपलब्ध हैं। +> कैनोनिकल चैट, मीडिया, खोज, स्थानीय, क्लाउड-एजेंट और सिस्टम संग्रहों में **357 पंजीकृत प्रदाता**, जिनमें **152 के पास `hasFree: true` डिस्कवरी मेटाडेटा है**। चैट मॉडल रजिस्ट्री में **229 प्रदाता / 2,554 विशिष्ट प्रदाता-मॉडल युग्म / 1,283 अपरिष्कृत मॉडल ID** शामिल हैं; अलग निःशुल्क-बजट कैटलॉग में **प्रति-मॉडल 491 पंक्तियाँ**, **35 आवर्ती पूल** और **54 आवर्ती/कुंजी-रहित हमेशा-निःशुल्क प्रदाता** हैं। ये जानबूझकर अलग-अलग भाजक हैं; परिभाषाएँ और पूल-डीडुप्लिकेटेड गणनाएँ [प्रदाता संदर्भ](docs/reference/PROVIDER_REFERENCE.md) और [निःशुल्क टियर](docs/reference/FREE_TIERS.md) में उपलब्ध हैं।
@@ -715,28 +715,28 @@ omniroute configure codex # ये भी: claude opencode qwen aider g
-### 🆓 हमेशा निःशुल्क — $0, किसी कार्ड की आवश्यकता नहीं +### 🆓 हमेशा निःशुल्क — $0, कार्ड की आवश्यकता नहीं - - - - - + + + + + - + - - + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
कोई टोकन सीमा नहीं
Kilo Code
Kilo Code
ऑटो-राउटर, Tencent Hy3
हमेशा के लिए निःशुल्क
Requesty
Requesty
GPT-OSS 120B, Nemotron
हमेशा के लिए निःशुल्क
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
निःशुल्क टियर
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
हमेशा के लिए निःशुल्क
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
हमेशा के लिए निःशुल्क
Kilo Code
Kilo Code
ऑटो-राउटर, Tencent Hy3
हमेशा मुफ़्त
Requesty
Requesty
GPT-OSS 120B, Nemotron
हमेशा मुफ़्त
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
मुफ़्त टियर
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
हमेशा मुफ़्त
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
हमेशा मुफ़्त
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
असीमित रूप से निःशुल्क
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
असीमित मुफ़्त
Pollinations
Pollinations
GPT, Llama, Claude
कुंजी की आवश्यकता नहीं
Cloudflare AI
Cloudflare AI
50+ मॉडल
10K न्यूरॉन/दिन
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM निःशुल्क
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M टोकन/दिन
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM मुफ़्त
Openference
Openference
Qwen3.8 27B, Llama 3.2
मुफ़्त टियर
OpenRouter
OpenRouter
:free मॉडल
+$10 → अधिक RPM
-📖 पूर्ण मशीन-पठनीय कैटलॉग → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 संपूर्ण मशीन-पठनीय कैटलॉग → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1270,21 +1270,21 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे - + - + - - + + - + - + - + @@ -1304,23 +1304,23 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे - - - - + + + +
परतप्रौद्योगिकी
परततकनीक
रनटाइमNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
भाषाTypeScript 6.0 — src/ और open-sse/ में 100% TypeScript (v2.0 से कोर में शून्य any)
भाषाTypeScript 6.0 — src/ और open-sse/ में 100% TypeScript (v2.0 से कोर में एक भी any नहीं)
फ़्रेमवर्कNext.js 16 + React 19 + Tailwind CSS 4
डेटाबेसbetter-sqlite3 (SQLite, WAL जर्नलिंग) + LowDB (JSON विरासत) — 122 डोमेन मॉड्यूल, 176 माइग्रेशन
मेमोरीSQLite FTS5 पूर्ण-पाठ + int8-क्वांटाइज़्ड वेक्टर एम्बेडिंग, टाइप्ड क्षय
डेटाबेसbetter-sqlite3 (SQLite, WAL जर्नलिंग) + LowDB (लेगेसी JSON) — 122 डोमेन मॉड्यूल, 178 माइग्रेशन
मेमोरीSQLite FTS5 पूर्ण-पाठ + int8-क्वांटाइज़्ड वेक्टर एम्बेडिंग, टाइप्ड डिके
स्कीमाZod 4 — MCP टूल I/O सत्यापन + API अनुबंध
प्रोटोकॉलMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
स्ट्रीमिंगServer-Sent Events (SSE) + WebSocket ब्रिज (/v1/ws)
संपीड़न12-इंजन पाइपलाइन — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
प्रमाणीकरण एवं सुरक्षाOAuth 2.0 (PKCE) + JWT + API कुंजियाँ + MCP स्कोप्ड प्रमाणीकरण · संग्रहित अवस्था में AES-256-GCM · DOMPurify
प्रमाणीकरण एवं सुरक्षाOAuth 2.0 (PKCE) + JWT + API कुंजियाँ + MCP स्कोप्ड प्रमाणीकरण · विश्राम अवस्था में AES-256-GCM · DOMPurify
गोपनीयताwreq-js — JA3 / JA4 TLS फ़िंगरप्रिंट प्रतिरूपण, 3-स्तरीय प्रॉक्सी
लचीलापनसर्किट ब्रेकर, एक्सपोनेंशियल बैकऑफ़, एंटी-थंडरिंग-हर्ड, ऑटो-कॉम्बो स्व-उपचार
सुदृढ़तासर्किट ब्रेकर, एक्सपोनेंशियल बैकऑफ़, एंटी-थंडरिंग-हर्ड, ऑटो-कॉम्बो स्व-उपचार
लॉगिंगpino — अनुरोध संदर्भ सहित संरचित JSON लॉग
परीक्षणNode.js टेस्ट रनर + Vitest — 5,100+ ट्रैक की गई टेस्ट फ़ाइलों में 39,000+ स्थिर टेस्ट घोषणाएँ (यूनिट, एकीकरण, E2E, सुरक्षा, पारिस्थितिकी तंत्र)
परीक्षणNode.js टेस्ट रनर + Vitest — 5,100+ ट्रैक की गई टेस्ट फ़ाइलों में 39,000+ स्थिर टेस्ट घोषणाएँ (यूनिट, एकीकरण, E2E, सुरक्षा, इकोसिस्टम)
प्लेटफ़ॉर्मडेस्कटॉप (Electron) · Android (Termux) · PWA (कोई भी ब्राउज़र)
CI/CDGitHub Actions — रिलीज़ पर स्वचालित npm प्रकाशन + Docker Hub
लिंकवेबसाइट · npm · Docker Hub
दस्तावेज़विवरण
उपयोगकर्ता मार्गदर्शिकाप्रदाता, कॉम्बो, CLI एकीकरण, परिनियोजन
सेटअप मार्गदर्शिकासभी इंस्टॉलेशन विधियाँ, CLI टूल कॉन्फ़िगरेशन, प्रोटोकॉल सेटअप, टाइमआउट ट्यूनिंग
CLI टूल मार्गदर्शिकाClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo और Copilot के लिए प्रत्येक टूल का सेटअप
रिमोट मोडसीमित-दायरे वाले एक्सेस टोकन के माध्यम से अपने लैपटॉप के CLI से रिमोट OmniRoute (VPS) संचालित करें
Claude Code कॉन्फ़िगरेशनlaunch और प्रत्येक मॉडल की प्रोफ़ाइलों के साथ Claude Code को OmniRoute (स्थानीय/रिमोट) से कनेक्ट करें
त्वरित शुरुआत3 चरणों में इंस्टॉल → कनेक्ट → कॉन्फ़िगर करें
CLI टूल मार्गदर्शिकाClaude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot के लिए प्रत्येक टूल का सेटअप
रिमोट मोडसीमित-क्षेत्र वाले एक्सेस टोकन के माध्यम से अपने लैपटॉप CLI से किसी रिमोट OmniRoute (VPS) को संचालित करें
Claude Code कॉन्फ़िगरेशनlaunch + प्रति-मॉडल प्रोफ़ाइल के साथ Claude Code को OmniRoute (स्थानीय/रिमोट) से जोड़ें
त्वरित शुरुआत3-चरणीय इंस्टॉलेशन → कनेक्ट → कॉन्फ़िगर
### 🔧 संचालन और परिनियोजन - + - +
दस्तावेज़विवरण
Docker मार्गदर्शिकाDocker संचालन, Compose प्रोफ़ाइलें, Caddy HTTPS, टनल, इमेज टैग
Docker मार्गदर्शिकाDocker चलाना, Compose प्रोफ़ाइल, Caddy HTTPS, टनल, इमेज टैग
Podman मार्गदर्शिकाQuadlet systemd एकीकरण, podman-compose, SELinux
VM परिनियोजनसंपूर्ण मार्गदर्शिका: VM + nginx + Cloudflare सेटअप
Fly.io परिनियोजनस्थायी स्टोरेज के साथ Fly.io पर परिनियोजित करें
Termux मार्गदर्शिकाTermux के माध्यम से Android पर OmniRoute चलाएँ
PWA मार्गदर्शिकाप्रोग्रेसिव वेब ऐप इंस्टॉलेशन, कैशिंग, आर्किटेक्चर
अनइंस्टॉल मार्गदर्शिकासभी इंस्टॉलेशन विधियों के लिए पूर्णतः साफ़ निष्कासन
अनइंस्टॉल मार्गदर्शिकासभी इंस्टॉलेशन विधियों के लिए पूर्ण निष्कासन
एनवायरनमेंट कॉन्फ़िगरेशनसंपूर्ण .env वेरिएबल और संदर्भ
@@ -1328,18 +1328,18 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे - - - - - + + + + + - - + + - - - + + +
दस्तावेज़विवरण
आर्किटेक्चरसिस्टम आर्किटेक्चर, डेटा प्रवाह और आंतरिक कार्यप्रणाली
संपीड़न मार्गदर्शिका7-विकल्पों वाली पाइपलाइन: बंद / हल्का / मानक / आक्रामक / अल्ट्रा / RTK / स्टैक्ड
RTK संपीड़नकमांड-आउटपुट संपीड़न, फ़िल्टर, विश्वास, सत्यापन, रॉ-आउटपुट पुनर्प्राप्ति
संपीड़न इंजनCaveman, RTK, स्टैक्ड पाइपलाइनें, डैशबोर्ड/API/MCP इंटरफ़ेस
संपीड़न नियम प्रारूपCaveman और RTK फ़िल्टरों के लिए JSON नियम-पैक स्कीमा
आर्किटेक्चरसिस्टम आर्किटेक्चर, डेटा प्रवाह और आंतरिक संरचना
संपीड़न मार्गदर्शिका7-विकल्प वाली पाइपलाइन: बंद / हल्का / मानक / आक्रामक / अल्ट्रा / RTK / स्टैक्ड
RTK संपीड़नकमांड-आउटपुट संपीड़न, फ़िल्टर, विश्वसनीयता, सत्यापन, रॉ-आउटपुट पुनर्प्राप्ति
संपीड़न इंजनCaveman, RTK, स्टैक्ड पाइपलाइन, डैशबोर्ड/API/MCP इंटरफ़ेस
संपीड़न नियम प्रारूपCaveman और RTK फ़िल्टर के लिए JSON नियम-पैक स्कीमा
संपीड़न भाषा पैकभाषा पहचान और Caveman नियम-पैक लेखन
लचीलापन मार्गदर्शिकासर्किट ब्रेकर, कूलडाउन, कतार, एंटी-थंडरिंग हर्ड, TLS स्पूफ़िंग
ऑटो-कॉम्बो इंजन16-कारक स्कोरिंग, मोड पैक, स्व-उपचार
प्रत्यास्थता मार्गदर्शिकासर्किट ब्रेकर, कूलडाउन, कतार, थंडरिंग हर्ड की रोकथाम, TLS स्पूफ़िंग
ऑटो-कॉम्बो इंजन16-कारक स्कोरिंग, मोड पैक, स्वतः सुधार
प्रॉक्सी मार्गदर्शिका3-स्तरीय प्रॉक्सी सिस्टम, 1proxy मार्केटप्लेस, रजिस्ट्री CRUD
निःशुल्क टियरसमेकित निर्देशिका: 35 प्रलेखित आवर्ती पूल / 491 सूचीबद्ध निःशुल्क-टियर प्रविष्टियाँ
सुविधा गैलरीस्क्रीनशॉट सहित डैशबोर्ड का दृश्य भ्रमण
कोडबेस दस्तावेज़ीकरणशुरुआती लोगों के अनुकूल कोडबेस का चरण-दर-चरण अवलोकन
निःशुल्क टियरसमेकित निर्देशिका: 35 दस्तावेज़ीकृत आवर्ती पूल / 489 सूचीबद्ध निःशुल्क-टियर प्रविष्टियाँ
सुविधा गैलरीस्क्रीनशॉट के साथ डैशबोर्ड का दृश्य भ्रमण
कोडबेस दस्तावेज़ीकरणशुरुआती लोगों के लिए अनुकूल कोडबेस अवलोकन
### 🤖 प्रोटोकॉल और API @@ -1361,7 +1361,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे योगदानडेवलपमेंट सेटअप और दिशानिर्देश ब्रांचिंग और रिलीज़ मॉडलPRs कहाँ लक्षित होते हैं (release/*), और main तथा टैग का क्या अर्थ है परिवर्तन लॉगप्रत्येक संस्करण का संपूर्ण रिलीज़ इतिहास - सुरक्षा नीतिभेद्यता रिपोर्टिंग और सुरक्षा कार्यप्रणालियाँ + सुरक्षा नीतिकमज़ोरियों की रिपोर्टिंग और सुरक्षा पद्धतियाँ i18n मार्गदर्शिका42 भाषाओं का समर्थन, अनुवाद कार्यप्रवाह, RTL रिलीज़ चेकलिस्टरिलीज़-पूर्व सत्यापन चरण कवरेज योजना5,100+ ट्रैक की गई परीक्षण फ़ाइलों में 39,000+ स्थिर परीक्षण घोषणाओं के लिए परीक्षण कवरेज रणनीति @@ -1373,7 +1373,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे # ⭐ शीर्ष योगदानकर्ता -> OmniRoute को एक उत्साही ओपन-सोर्स समुदाय आकार देता है। इन व्यक्तियों ने असाधारण योगदान किए हैं, जिनका परियोजना की गुणवत्ता, स्थिरता और पहुँच पर सीधा प्रभाव पड़ता है। **धन्यवाद।** +> OmniRoute को एक उत्साही ओपन-सोर्स समुदाय आकार देता है। इन व्यक्तियों ने असाधारण योगदान दिए हैं, जिनका परियोजना की गुणवत्ता, स्थिरता और पहुँच पर सीधा प्रभाव पड़ता है। **धन्यवाद।** ### मर्ज किए गए पुल अनुरोधों के आधार पर बाहरी योगदानकर्ता @@ -1402,9 +1402,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे 20Prudhvivuda246,312 -लाइव release/v3.8.50 टिप dafb4ae808 पर स्थिर किया गया, जिसमें 2026-08-24 05:26:03 UTC तक के मर्ज शामिल हैं। पृष्ठांकित GitHub GraphQL गणना में 5,911 मर्ज किए गए PRs हैं: 2,707 रिपॉज़िटरी स्वामी द्वारा, 179 Dependabot द्वारा और 535 अलग-अलग योगदानकर्ताओं से 3,025 बाहरी PRs। “परिवर्तित पंक्तियाँ” GitHub के जोड़े गए + हटाए गए अंश हैं और इनमें जनरेट की गई फ़ाइलें, लॉकफ़ाइलें, कैटलॉग, अनुवाद और दस्तावेज़ शामिल हैं; यह परिवर्तन की मात्रा है, लेखक द्वारा लिखी गई LOC नहीं। कटऑफ़ पर बराबरी वाले स्थान बनाए रखे गए हैं। +लाइव release/v3.8.50 के नवीनतम कमिट dafb4ae808 पर स्थिर किया गया, जिसमें 2026-08-24 05:26:03 UTC तक के मर्ज शामिल हैं। पृष्ठांकित GitHub GraphQL गणना में 5,911 मर्ज किए गए PRs शामिल हैं: 2,707 रिपॉज़िटरी स्वामी द्वारा, 179 Dependabot द्वारा, और 535 अलग-अलग योगदानकर्ताओं से 3,025 बाहरी PRs। “परिवर्तित पंक्तियाँ” GitHub पर जोड़ी गई और हटाई गई पंक्तियों का योग है तथा इसमें जनरेट की गई फ़ाइलें, लॉकफ़ाइलें, कैटलॉग, अनुवाद और दस्तावेज़ शामिल हैं; यह बदलाव की मात्रा है, लिखी गई LOC नहीं। कटऑफ़ पर बराबरी वाले स्थानों को बरकरार रखा गया है। -### GitHub द्वारा श्रेय दिए गए कमिट्स +### GitHub द्वारा संबद्ध कमिट @@ -1448,7 +1448,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे Markus Hartung
Markus Hartung
- 🏅 GitHub से संबद्ध 69 कमिट · संयुक्त रूप से #6 + 🏅 GitHub से संबद्ध 69 कमिट · #6 पर बराबरी @@ -1457,7 +1457,7 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे Dizzle
Dizzle
- 🏅 GitHub से संबद्ध 69 कमिट · संयुक्त रूप से #6 + 🏅 GitHub से संबद्ध 69 कमिट · #6 पर बराबरी
@@ -1478,21 +1478,21 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 भी इसे Bob.Hou
Bob.Hou

- 🏅 GitHub से संबद्ध 51 कमिट · संयुक्त रूप से #10 + 🏅 GitHub से संबद्ध 51 कमिट · #10 पर बराबरी
Xiangzhe
Xiangzhe

- 🏅 GitHub से संबद्ध 51 कमिट · संयुक्त रूप से #10 + 🏅 GitHub से संबद्ध 51 कमिट · #10 पर बराबरी
-2026-08-24 06:14:31 UTC पर पुनः जाँच की गई: डिफ़ॉल्ट ब्रांच release/v3.8.50 के लिए रिपॉज़िटरी Contributors API द्वारा रिपोर्ट किए गए GitHub से संबद्ध कमिट। API ने 525 पहचानें (415 उपयोगकर्ता, 2 बॉट, 108 अनाम) लौटाईं; इस तालिका में अनुरक्षक, बॉट और अनाम पहचानें शामिल नहीं हैं तथा समान स्थान वाली प्रविष्टियाँ बरकरार रखी गई हैं। यह ऊपर दी गई मर्ज किए गए PR की रैंकिंग और नीचे दी गई 639-व्यक्तियों की Git-मेटाडेटा गणना, दोनों से अलग है। +2026-08-24 06:14:31 UTC पर पुनः जाँच की गई: release/v3.8.50 डिफ़ॉल्ट ब्रांच के लिए रिपॉज़िटरी Contributors API द्वारा रिपोर्ट किए गए GitHub से संबद्ध कमिट। API ने 525 पहचानें (415 उपयोगकर्ता, 2 बॉट, 108 अनाम) लौटाईं; इस तालिका में मेंटेनर, बॉट और अनाम पहचानों को शामिल नहीं किया गया है तथा प्रतिस्पर्धात्मक बराबरियों को बनाए रखा गया है। यह ऊपर दी गई मर्ज किए गए PR की रैंकिंग और नीचे दी गई 639-व्यक्ति वाली Git-मेटाडेटा गणना, दोनों से अलग है। -> 🙏 इन योगदानकर्ताओं की सुविधाएँ, बग सुधार और अवसंरचना सुधार ही OmniRoute को विश्वसनीय और सुविधाओं से भरपूर बनाने का एक **मुख्य हिस्सा** हैं। प्रत्येक पुल रिक्वेस्ट, प्रत्येक परीक्षण केस और प्रत्येक i18n अनुवाद फ़ाइल महत्वपूर्ण है। ओपन सोर्स का निर्माण इन्हीं जैसे लोगों द्वारा किया जाता है। +> 🙏 इन योगदानकर्ताओं की सुविधाएँ, बग सुधार और इन्फ़्रास्ट्रक्चर सुधार OmniRoute को विश्वसनीय और सुविधाओं से समृद्ध बनाने का एक **मुख्य हिस्सा** हैं। प्रत्येक पुल रिक्वेस्ट, प्रत्येक टेस्ट केस और प्रत्येक i18n अनुवाद फ़ाइल महत्वपूर्ण है। ओपन सोर्स का निर्माण इन्हीं जैसे लोगों द्वारा किया जाता है। diff --git a/docs/i18n/hi/SECURITY.md b/docs/i18n/hi/SECURITY.md index c9f9abf0c61e..823f4787cf46 100644 --- a/docs/i18n/hi/SECURITY.md +++ b/docs/i18n/hi/SECURITY.md @@ -222,33 +222,36 @@ docker run -d \ ## सप्लाई-चेन स्कैनर निष्कर्ष (Socket.dev / Snyk / समान) -प्रकाशित `omniroute` npm आर्टिफ़ैक्ट Next.js के `output: "standalone"` -बिल्ड को बंडल करता है, जिसका अर्थ है कि प्रत्येक रूट हैंडलर — जिसमें दस्तावेज़ीकृत विशेषाधिकार-प्राप्त -सुविधाएँ (MITM, Zed इंपोर्ट, Cloud Sync, एम्बेडेड सर्विस सुपरवाइज़र) शामिल हैं — अंततः -`.next/server/*.js` की मिनिफ़ाइड चंक्स में पहुँच जाता है। ह्यूरिस्टिक सप्लाई-चेन स्कैनर -अक्सर उन चंक्स के पैटर्न का मिलान मैलवेयर सिग्नेचर से करते हैं। - -हमारे द्वारा उपयोग किया जाने वाला स्कैनर कॉन्फ़िगरेशन रेपो रूट में [`socket.yml`](socket.yml) पर -स्थित है (Socket.dev GitHub App फ़ॉर्मैट v2 — देखें -)। यह स्पष्ट रूप से -न भेजी जाने वाली डायरेक्टरियों (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/`, आदि) को बाहर रखता है, ताकि स्कैनर केवल उन कोड पाथ पर रिपोर्ट करे जो -वास्तव में प्रकाशित पैकेज के उपयोगकर्ताओं तक पहुँचते हैं — स्कैन स्वयं इस फ़ाइल को पढ़ने वाले Socket -GitHub App द्वारा संचालित होता है, न कि इस रिपॉज़िटरी के किसी वर्कफ़्लो द्वारा। - -प्रत्येक निष्कर्ष श्रेणी के लिए हम हर निष्कर्ष का अनुरक्षक सत्यापन बनाए रखते हैं: +> **दायरा संबंधी टिप्पणी:** रिपॉज़िटरी के रूट में मौजूद `socket.yml`, प्रकाशित npm आर्टिफ़ैक्ट के Socket.dev के रजिस्ट्री-साइड पोस्ट-पब्लिश स्कैन के लिए केवल `projectIgnorePaths` को निर्धारित करती है — यह कोई लागू किया गया CI/PR मर्ज गेट नहीं है। `.github/workflows` में कोई वर्कफ़्लो, कोई `package.json` स्क्रिप्ट और कोई `Makefile` टार्गेट Socket.dev को इनवोक नहीं करता। + +प्रकाशित `omniroute` npm आर्टिफ़ैक्ट में Next.js का `output: "standalone"` +बिल्ड बंडल होता है, जिसका अर्थ है कि प्रत्येक रूट हैंडलर — दस्तावेज़ीकृत विशेषाधिकार-प्राप्त +सुविधाओं (MITM, Zed इम्पोर्ट, Cloud Sync, एम्बेडेड सर्विस सुपरवाइज़र) सहित — अंततः +`.next/server/*.js` मिनिफ़ाइड चंक्स में शामिल हो जाता है। ह्यूरिस्टिक सप्लाई-चेन स्कैनर +अक्सर उन चंक्स का पैटर्न-मिलान मैलवेयर सिग्नेचर्स से करते हैं। + +हमारे द्वारा उपयोग किया जाने वाला स्कैनर कॉन्फ़िगरेशन रिपॉज़िटरी के रूट में +[`socket.yml`](socket.yml) में मौजूद है (Socket.dev GitHub App फ़ॉर्मेट v2 — देखें +)। यह स्पष्ट रूप से उन डायरेक्टरियों को बाहर रखता है +जिन्हें शिप नहीं किया जाता (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/`, आदि), ताकि स्कैनर केवल उन कोड पाथ्स पर रिपोर्ट करे जो +वास्तव में प्रकाशित उपयोगकर्ताओं तक पहुँचते हैं — स्कैन स्वयं इस फ़ाइल को पढ़ने वाले Socket +GitHub App द्वारा संचालित होता है, न कि इस रिपॉज़िटरी में मौजूद किसी वर्कफ़्लो द्वारा। + +प्रत्येक निष्कर्ष श्रेणी के लिए हम प्रति-निष्कर्ष मेंटेनर सत्यापन बनाए रखते हैं: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - प्रति-निष्कर्ष मैप: स्रोत फ़ाइल ↔ फ़्लैग की गई चंक ↔ व्यवहार ↔ v3.8.6 में लागू - शमन। -- प्रत्येक फ़्लैग किए गए फ़ंक्शन पर इन-सोर्स `SECURITY-AUDITOR-NOTE:` ब्लॉक + प्रति-निष्कर्ष मैप: स्रोत फ़ाइल ↔ फ़्लैग किया गया चंक ↔ व्यवहार ↔ v3.8.6 में + लागू किया गया शमन। +- प्रत्येक फ़्लैग किए गए फ़ंक्शन पर स्रोत के भीतर मौजूद `SECURITY-AUDITOR-NOTE:` ब्लॉक उसी दस्तावेज़ की ओर इंगित करते हैं। -जिन उपयोगकर्ताओं की पाइपलाइन अलर्ट को शिथिल नहीं कर सकती, वे इस कमांड से बिल्ड करें: -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`। यह चार संवेदनशील मॉड्यूल को ऐसे -स्टब से बदल देता है जो रनटाइम पर HTTP 503 `feature-disabled` लौटाते हैं, -जिससे विशेषाधिकार-प्राप्त कोड पाथ बंडल में भौतिक रूप से अनुपस्थित रहते हैं। -प्रकाशन विधि के लिए [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) +उन उपयोगकर्ताओं के लिए जिनकी पाइपलाइन अलर्ट में छूट नहीं दे सकती: इसे +`OMNIROUTE_BUILD_PROFILE=minimal npm run build` के साथ बिल्ड करें। यह चार +संवेदनशील मॉड्यूल्स को ऐसे स्टब्स से बदल देता है जो रनटाइम पर HTTP 503 +`feature-disabled` लौटाते हैं, ताकि विशेषाधिकार-प्राप्त कोड पाथ्स बंडल में भौतिक रूप से +मौजूद न रहें। प्रकाशन विधि के लिए +[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) देखें। ## संदर्भ diff --git a/docs/i18n/hi/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/hi/docs/architecture/CODEBASE_DOCUMENTATION.md index 00108130be4b..5c638b66708d 100644 --- a/docs/i18n/hi/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/hi/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,8 @@ server/ ## 4. `open-sse/` — स्ट्रीमिंग इंजन वर्कस्पेस -`@omniroute/open-sse` के रूप में प्रकाशित अलग npm वर्कस्पेस। यह अनुरोध -प्रोसेसिंग, एक्ज़ीक्यूटर, ट्रांसलेटर, सेवाएँ, ट्रांसफ़ॉर्मर और MCP सर्वर का प्रबंधन करता है। +अलग npm वर्कस्पेस, जिसे `@omniroute/open-sse` के रूप में प्रकाशित किया जाता है। यह अनुरोध +प्रसंस्करण, एक्ज़ीक्यूटर, ट्रांसलेटर, सेवाओं, ट्रांसफ़ॉर्मर और MCP सर्वर का प्रबंधन करता है। ``` open-sse/ @@ -445,13 +445,13 @@ open-sse/ ├── package.json वर्कस्पेस मैनिफ़ेस्ट ├── tsconfig.json ├── types.d.ts -├── config/ प्रोवाइडर रजिस्ट्रियाँ, हेडर प्रोफ़ाइल, पहचान, … +├── config/ प्रदाता रजिस्ट्री, हेडर प्रोफ़ाइल, पहचान, … ├── handlers/ अनुरोध हैंडलर (चैट, एम्बेडिंग, ऑडियो, इमेज, …) -├── executors/ 108 प्रोवाइडर-विशिष्ट HTTP एक्ज़ीक्यूटर -├── translator/ फ़ॉर्मैट रूपांतरण (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) +├── executors/ 108 प्रदाता-विशिष्ट HTTP एक्ज़ीक्यूटर +├── translator/ फ़ॉर्मेट रूपांतरण (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions स्ट्रीम ट्रांसफ़ॉर्मर ├── services/ 80+ सेवा मॉड्यूल (कॉम्बो, फ़ॉलबैक, कोटा, पहचान, …) -├── utils/ स्ट्रीमिंग हेल्पर, TLS क्लाइंट, AWS SigV4, प्रॉक्सी फ़ेच, … +├── utils/ स्ट्रीमिंग सहायक, TLS क्लाइंट, AWS SigV4, प्रॉक्सी फ़ेच, … └── mcp-server/ MCP सर्वर (3 ट्रांसपोर्ट, 33 स्कोप, 110 टूल) ``` @@ -472,22 +472,22 @@ open-sse/ | `search.ts` | वेब खोज | | `sseParser.ts` | SSE इवेंट पार्सर | | `usageExtractor.ts` | अपस्ट्रीम स्ट्रीम से टोकन की संख्याएँ निकालना | -| `responseSanitizer.ts` | प्रोवाइडर-विशिष्ट अवांछित सामग्री हटाना | -| `responseTranslator.ts` | प्रोवाइडर प्रतिक्रिया और ट्रांसलेटर लेयर के बीच संयोजक | +| `responseSanitizer.ts` | प्रदाता-विशिष्ट अनावश्यक सामग्री हटाना | +| `responseTranslator.ts` | प्रदाता प्रतिक्रिया और ट्रांसलेटर लेयर के बीच संयोजन | ### 4.2 `open-sse/executors/` -108 प्रोवाइडर एक्ज़ीक्यूटर, जिनमें से प्रत्येक `BaseExecutor` (`base.ts`) को एक्सटेंड करता है: +108 प्रदाता एक्ज़ीक्यूटर, जिनमें से प्रत्येक `BaseExecutor` (`base.ts`) को एक्सटेंड करता है: `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, साथ ही `claudeIdentity.ts` -(साझा पहचान हेल्पर) और `index.ts` (रजिस्ट्री)। +(साझा पहचान सहायक) और `index.ts` (रजिस्ट्री)। -> टिप्पणी: यहाँ सूचीबद्ध नहीं किए गए प्रोवाइडर, जेनेरिक -> OpenAI-संगत एक्ज़ीक्यूटर का उपयोग करके `default.ts` द्वारा संचालित किए जाते हैं। पूरा प्रोवाइडर कैटलॉग (355 प्रोवाइडर) -> `src/shared/constants/providers.ts` में स्थित है। +> नोट: यहाँ सूचीबद्ध नहीं किए गए प्रदाताओं को जेनेरिक +> OpenAI-संगत एक्ज़ीक्यूटर का उपयोग करके `default.ts` द्वारा सेवा दी जाती है। संपूर्ण प्रदाता कैटलॉग (355 प्रदाता) +> `src/shared/constants/providers.ts` में मौजूद है। ### 4.3 `open-sse/translator/` @@ -501,56 +501,56 @@ open-sse/ `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`। -- **9 हेल्पर** (`translator/helpers/`): +- **9 सहायक** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, साथ ही - हेल्पर टेस्ट। -- **इमेज हेल्पर** (`translator/image/sizeMapper.ts`)। + सहायक परीक्षण। +- **इमेज सहायक** (`translator/image/sizeMapper.ts`)। - शीर्ष-स्तर: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`। ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-आधारित Responses API ↔ Chat - Completions कनवर्टर (`responses/` रूट कैच-ऑल द्वारा उपयोग किया जाता है)। + Completions कन्वर्टर (`responses/` रूट कैच-ऑल द्वारा उपयोग किया जाता है)। ### 4.5 `open-sse/services/` मुख्य अंश (पूरी सूची `open-sse/services/` के अंतर्गत है): -| विषय | फ़ाइलें | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| कॉम्बो रूटिंग | `combo.ts` (19 रणनीतियाँ), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| ऑटो कॉम्बो इंजन | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| लचीलापन | `accountFallback.ts` (कूलडाउन + लॉकआउट), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| कोटा | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| कैशिंग | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| रूटिंग इंटेलिजेंस | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| मॉडल प्रबंधन | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| संपीड़न | `compression/` — संपूर्ण संपीड़न इंजन वायरिंग | -| टोकन + सत्र | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| टियर / मैनिफ़ेस्ट | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / नेटवर्क | `ipFilter.ts`, `webSearchFallback.ts` | -| बैच | `batchProcessor.ts` | -| उपयोग | `usage.ts` | +| विषय | फ़ाइलें | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| कॉम्बो रूटिंग | `combo.ts` (19 रणनीतियाँ), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| ऑटो कॉम्बो इंजन | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| प्रत्यास्थता | `accountFallback.ts` (कूलडाउन + लॉकआउट), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| कोटा | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| कैशिंग | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| रूटिंग इंटेलिजेंस | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| मॉडल प्रबंधन | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| संपीड़न | `compression/` — संपूर्ण संपीड़न इंजन वायरिंग | +| टोकन + सत्र | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| टियर / मैनिफ़ेस्ट | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / नेटवर्क | `ipFilter.ts`, `webSearchFallback.ts` | +| बैच | `batchProcessor.ts` | +| उपयोग | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- `server.ts` में **110 अद्वितीय टूल** वायर किए गए हैं (`schemas/tools.ts` में 45 कैनोनिकल + - मेमोरी, स्किल्स, GitHub-स्किल्स, पूल, गेमिफ़िकेशन, प्लगइन, Notion, Obsidian, - लोकल-कॉर्पस और संपीड़न मॉड्यूल — यूनियन की गणना `countUniqueMcpTools` द्वारा की गई है)। +- `server.ts` में वायर किए गए **110 अद्वितीय टूल** (`schemas/tools.ts` में 45 कैनोनिकल + + मेमोरी, स्किल्स, GitHub-skills, पूल, गेमिफ़िकेशन, प्लगइन, Notion, Obsidian, + लोकल-कॉर्पस और संपीड़न मॉड्यूल — यूनियन की गणना `countUniqueMcpTools` द्वारा की जाती है)। - **3 ट्रांसपोर्ट**: stdio, HTTP Streamable, SSE। -- रनटाइम पर **33 स्कोप** लागू किए गए हैं — आधार सूची `src/shared/constants/mcpScopes.ts` में है, पूरा सेट प्रत्येक टूल मॉड्यूल द्वारा घोषित स्कोप का यूनियन है। -- ऑडिट तालिका: `mcp_tool_audit` (`audit.ts` द्वारा भरी जाती है)। +- रनटाइम पर **33 स्कोप** लागू किए जाते हैं — आधार सूची `src/shared/constants/mcpScopes.ts` में है, जबकि पूर्ण सेट प्रत्येक टूल मॉड्यूल द्वारा घोषित स्कोप का यूनियन है। +- ऑडिट तालिका: `mcp_tool_audit` (`audit.ts` द्वारा पॉप्युलेट की जाती है)। - फ़ाइलें: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - और `__tests__/` के अंतर्गत परीक्षण। + साथ ही `__tests__/` के अंतर्गत परीक्षण। - संपूर्ण टूल कैटलॉग के लिए [MCP-SERVER.md](../frameworks/MCP-SERVER.md) देखें। ### 4.7 `open-sse/config/` -प्रोवाइडर रजिस्ट्रियाँ (`providerRegistry.ts`, `providerModels.ts`, -`providerHeaderProfiles.ts`), प्रत्येक फ़ॉर्मैट के लिए मॉडल रजिस्ट्रियाँ (`audioRegistry.ts`, +प्रोवाइडर रजिस्ट्री (`providerRegistry.ts`, `providerModels.ts`, +`providerHeaderProfiles.ts`), प्रत्येक फ़ॉर्मेट के लिए मॉडल रजिस्ट्री (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), पहचान सहायक (`codexIdentity.ts`, `codexInstructions.ts`, diff --git a/docs/i18n/hi/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/hi/docs/architecture/RESILIENCE_GUIDE.md index b860e6bee97c..87c071609811 100644 --- a/docs/i18n/hi/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/hi/docs/architecture/RESILIENCE_GUIDE.md @@ -90,73 +90,117 @@ OmniRoute में तीन अलग-अलग लेकिन परस् **डिफ़ॉल्ट कूलडाउन:** - OAuth आधार: 5s -- API-कुंजी आधार: 3s -- API-कुंजी 429: अपस्ट्रीम `Retry-After`/रीसेट हेडर/पार्स किए जा सकने वाले रीसेट टेक्स्ट को प्राथमिकता देता है +- API-key आधार: 3s +- API-key 429: अपस्ट्रीम `Retry-After`/रीसेट हेडर/पार्स किए जा सकने वाले रीसेट टेक्स्ट को प्राथमिकता देता है - बैकऑफ़: `baseCooldownMs * 2 ** failureIndex` **एंटी-थंडरिंग-हर्ड सुरक्षा:** समवर्ती विफलताओं को कूलडाउन अत्यधिक बढ़ाने या `backoffLevel` को दो बार बढ़ाने से रोकती है। **टर्मिनल स्थितियाँ (कूलडाउन नहीं):** -- `banned` — प्रतिबंधित-कीवर्ड / खाता-प्रतिबंध पहचान द्वारा सेट किया जाता है ([BAN_DETECTION](../security/BAN_DETECTION.md) देखें), और लगातार तीन अपस्ट्रीम प्रति-अनुरोध अस्वीकृतियों (`request_rejected`, जैसे Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`) द्वारा भी; एकल अस्वीकृति केवल कनेक्शन को कूलडाउन करती है -- `expired` (सीमित पुनः प्रयासों के बाद टर्मिनल स्थिति में परिवर्तित होता है — एक्सपोनेंशियल बैकऑफ़ के साथ `EXPIRED_RETRY_MAX = 3` — ताकि अस्थायी OAuth त्रुटियाँ खाते को स्थायी रूप से निष्क्रिय किए जाने से पहले स्वतः ठीक हो सकें) +- `banned` — प्रतिबंधित-कीवर्ड / खाता-प्रतिबंध पहचान द्वारा सेट किया जाता है ([BAN_DETECTION](../security/BAN_DETECTION.md) देखें), और लगातार तीन अपस्ट्रीम प्रति-अनुरोध अस्वीकृतियों (`request_rejected`, जैसे Anthropic OAuth 403 "अनुरोध की अनुमति नहीं है" — `open-sse/services/requestRejectedStreak.ts`) द्वारा भी; एक अकेली अस्वीकृति केवल कनेक्शन को कूलडाउन में डालती है +- `expired` (सीमित पुनः प्रयासों के बाद टर्मिनल स्थिति में बदलता है — एक्सपोनेंशियल बैकऑफ़ के साथ `EXPIRED_RETRY_MAX = 3` — ताकि अस्थायी OAuth त्रुटियाँ खाते को स्थायी रूप से निष्क्रिय किए जाने से पहले स्वयं ठीक हो सकें) - `credits_exhausted` -ये स्थितियाँ तब तक बनी रहती हैं, जब तक क्रेडेंशियल नहीं बदलते या कोई ऑपरेटर उन्हें रीसेट नहीं करता। टर्मिनल स्थितियों को अस्थायी कूलडाउन स्थिति से अधिलेखित न करें। +ये तब तक बने रहते हैं, जब तक क्रेडेंशियल नहीं बदलते या कोई ऑपरेटर इन्हें रीसेट नहीं करता। टर्मिनल स्थितियों को अस्थायी कूलडाउन स्थिति से अधिलेखित न करें। **लेज़ी रिकवरी:** जब `rateLimitedUntil` बीत जाता है, तो कनेक्शन फिर से पात्र हो जाता है। सफल उपयोग पर, `clearAccountError()` सभी त्रुटि फ़ील्ड साफ़ कर देता है। +### Claude OAuth उपयोग सीमा: निम्न-प्राथमिकता लेन + सत्र-सीमा रीसेट + +**दायरा:** एक Claude सदस्यता (OAuth) कनेक्शन। दोनों सुविधाएँ **प्रति कनेक्शन +ऑप्ट-इन** हैं (कनेक्शन संपादित करें → Claude अनुभाग → `providerSpecificData` में +`lowPriorityMode` / `autoLimitReset`, दोनों डिफ़ॉल्ट रूप से बंद) और Claude Code के +`/low-priority` और `/limit-reset` कमांड को प्रतिबिंबित करती हैं (वायर अनुबंध Claude Code 2.1.263 से लिया गया है)। + +**कार्यान्वयन:** + +- स्टेट मशीन + प्रतिक्रिया वर्गीकरण: `open-sse/services/claudeLowPriority.ts` +- रीसेट स्थिति/क्लेम क्लाइंट: `open-sse/services/claudeLimitReset.ts` +- एक्ज़ीक्यूटर हुक (हेडर इंजेक्शन + समान-खाता पुनः प्रयास): `open-sse/executors/base.ts::execute()` +- ऑप्ट-इन स्थायित्व: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**ट्रिगर:** 5-घंटे की उपयोग सीमा — एक `429`, जिसके हेडर में +`anthropic-ratelimit-unified-status: rejected` और, जब खाता पात्र हो, +`anthropic-ratelimit-unified-slow-offer: treatment` मौजूद हों। उस पहली सीमा वाली +429 से पहले कुछ भी नहीं भेजा जाता; यूनिफ़ाइड हेडर के बिना बर्स्ट 429 सामान्य कूलडाउन पथ से गुजरता है। + +**निम्न-प्राथमिकता लेन** (`lowPriorityMode`): + +- सीमा वाली 429 पर एक्ज़ीक्यूटर प्रस्ताव स्वीकार करता है और तुरंत **उसी** + खाते के साथ `anthropic-usage-limit: slow` का उपयोग करके पुनः प्रयास करता है; लेन घोषित + `anthropic-ratelimit-unified-reset` (+60s ग्रेस अवधि) तक सक्रिय रहती है और उस अवधि में प्रत्येक अनुरोध में + यह हेडर होता है। इंटरसेप्ट की गई 429 कभी `handleChatCore` तक नहीं पहुँचती, इसलिए कनेक्शन को + कूलडाउन में **नहीं** डाला जाता और उससे हटकर रोटेट नहीं किया जाता। +- बाद की प्रतिक्रियाओं पर `anthropic-ratelimit-unified-slow-status`: `active` / `not_needed` + लेन को बनाए रखते हैं; `slot_busy` (429) या `529`, सर्वर के + `anthropic-ratelimit-unified-slow-retry-after` (डिफ़ॉल्ट 20s, 5–600s तक सीमित, ±30% जिटर) + की प्रतीक्षा करके पुनः प्रयास करते हैं, जो `anthropic-ratelimit-unified-slow-max-wait` (डिफ़ॉल्ट 20 मिनट, सीमा + 1 मिनट–6 घंटे) से सीमित होता है — उससे आगे लेन समाप्त हो जाती है और 10-मिनट का कूल-ऑफ़ पुनः स्वीकृति रोकता है। + प्रतीक्षा को अनुरोध के अपने अपस्ट्रीम-स्टार्ट टाइमआउट में शेष समय + (`resolveFetchStartTimeout`, डिफ़ॉल्ट रूप से 10 मिनट) में से 5 सेकंड का मार्जिन घटाकर भी सीमित किया जाता है: उस सीमा के बिना + 20-मिनट का डिफ़ॉल्ट अधिकतम-प्रतीक्षा समय अनुरोध से अधिक चलता और प्रतीक्षा के बीच में स्लीप निरस्त हो जाती, + जिससे सुचारु `max_wait` समाप्ति + कूल-ऑफ़ के बजाय `TimeoutError` दिखाई देता। +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, 5h-विंडो रोलओवर, या + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (जो किसी भी स्थिति में इसे + `extra_usage` के रूप में समाप्त करता है, क्योंकि सशुल्क ओवरेज अब सीमा को कवर करता है) लेन समाप्त कर देते हैं; इसके बाद + प्रतिक्रिया सामान्य कूलडाउन पथ पर जाती है। `budget_exhausted` को घोषित बजट रीसेट (≤ 8 दिन) तक + याद रखा जाता है। +- सीमा जाँच एक्ज़ीक्यूटर के अपने 400-प्रेरित इंट्रा-अटेम्प्ट पुनः प्रयासों (कॉन्टेक्स्ट + संपादन, थिंकिंग/एफ़र्ट क्लैम्प, पैरामीटर ऑटो-लर्न) के बाद चलती है, इसलिए केवल उन पुनः प्रयासों में से + किसी एक पर दिखाई देने वाली सीमा 429 भी कूलडाउन पथ तक पहुँचने के बजाय इंटरसेप्ट की जाती है। +- स्थिति प्रति कनेक्शन इन-मेमोरी होती है (पुनरारंभ करने पर पुनः स्वीकार करने के लिए एक अतिरिक्त सीमा 429 लगती है)। + +**सत्र-सीमा रीसेट** (`autoLimitReset`, दोनों चालू होने पर लेन से पहले आज़माया जाता है): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + ब्लॉक; जब `arm: "reset"` और `available: true` हों, + `{ "program": "juniper_tide" }` के साथ + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` + (`providerSpecificData.organizationUUID` से संगठन UUID, बूटस्ट्रैप फ़ॉलबैक)। +- `result: reset|not_limited` → अनुरोध पूर्ण गति से पुनः आज़माया जाता है (कोई धीमा हेडर नहीं)। + `already_used` / `not_offered`, `next_available_at` (डिफ़ॉल्ट एक सप्ताह) को मेमोइज़ करते हैं; कोई भी + विफलता 15 मिनट का बैकऑफ़ लागू करती है। रीसेट सप्ताह में एक बार होता है और फिर भी + साप्ताहिक सीमा में गिना जाता है। + +रिग्रेशन सुरक्षा: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`। + ### सत्र एफ़िनिटी (#7274) -**दायरा:** एक क्लाइंट सत्र (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` हेडर), **किसी भी** प्रदाता के लिए एक कनेक्शन से पिन किया गया। +**दायरा:** एक क्लाइंट सत्र (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` हेडर), जो **किसी भी** प्रदाता के लिए एक कनेक्शन से पिन किया गया हो। -**उद्देश्य:** एक बहु-टर्न एजेंट (Claude Code, aider, कस्टम एजेंट) को अनुरोधों के दौरान उसी खाते पर बनाए रखना, जिससे क्रॉस-अकाउंट संदर्भ हानि और प्रति-खाता सत्र स्थिति वाले प्रदाताओं पर बार-बार होने वाले कोल्ड-स्टार्ट 429 कम होते हैं। +**उद्देश्य:** एक बहु-टर्न एजेंट (Claude Code, aider, कस्टम एजेंट) को विभिन्न अनुरोधों में एक ही अकाउंट पर बनाए रखना, जिससे क्रॉस-अकाउंट संदर्भ हानि और प्रति-अकाउंट सेशन स्थिति वाले प्रदाताओं पर बार-बार होने वाली कोल्ड-स्टार्ट 429 त्रुटियाँ कम हों। **कार्यान्वयन:** -- TTL रिज़ॉल्यूशन: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` +- TTL निर्धारण: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - पिन चयन/निर्माण: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` - हेडर निष्कर्षण (सामान्य, किसी भी प्रदाता के लिए): `src/sse/services/auth.ts::extractSessionAffinityKey()` - स्थायी पिन तालिका: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- सेटिंग: `sessionAffinityTtlMs` (ms में वैश्विक TTL, `0` इसे अक्षम करता है) — `src/lib/db/settings.ts`। माइग्रेशन `124_generic_session_affinity_ttl.sql` द्वारा केवल Codex वाले `codexSessionAffinityTtlMs` से इसका नाम बदला गया, जो पहले से कॉन्फ़िगर किए गए किसी भी Codex TTL को नए डिफ़ॉल्ट के रूप में आगे ले जाता है। +- सेटिंग: `sessionAffinityTtlMs` (ms में वैश्विक TTL, `0` इसे अक्षम करता है) — `src/lib/db/settings.ts`। माइग्रेशन `124_generic_session_affinity_ttl.sql` द्वारा इसका नाम केवल Codex के लिए प्रयुक्त `codexSessionAffinityTtlMs` से बदला गया, जो पहले कॉन्फ़िगर किए गए किसी भी Codex TTL को नए डिफ़ॉल्ट के रूप में आगे ले जाता है। -#7274 से पहले, `resolveSessionAffinityTtlMs()` `codex` को छोड़कर प्रत्येक प्रदाता के लिए तुरंत `0` लौटाता था, इसलिए TTL सेटिंग (और सत्र हेडर) का अन्यत्र कोई प्रभाव नहीं पड़ता था, भले ही पिनिंग तंत्र और हेडर निष्कर्षण पहले से प्रदाता-अज्ञेय थे। सुधार ने उस प्रारंभिक रिटर्न को हटा दिया; वैश्विक रूप से `0` से अधिक सेट किए जाने पर TTL अब प्रत्येक प्रदाता पर समान रूप से लागू होता है। +#7274 से पहले, `resolveSessionAffinityTtlMs()` प्रत्येक `codex`-रहित प्रदाता के लिए तुरंत `0` लौटाता था, इसलिए TTL सेटिंग (और सेशन हेडर) का अन्य कहीं कोई प्रभाव नहीं पड़ता था, भले ही पिनिंग तंत्र और हेडर निष्कर्षण पहले से ही प्रदाता-निरपेक्ष थे। सुधार में वह प्रारंभिक रिटर्न हटा दिया गया; अब TTL को वैश्विक रूप से `0` से अधिक सेट करने पर यह प्रत्येक प्रदाता पर समान रूप से लागू होता है। -तीनों सत्र-एफ़िनिटी हेडर कभी भी अपस्ट्रीम फ़ॉरवर्ड नहीं किए जाते — एक्ज़ीक्यूटर क्लाइंट हेडर को आगे भेजने के बजाय अपने अपस्ट्रीम हेडर शुरू से बनाते हैं, इसलिए यह केवल एक आंतरिक सहसंबंध ID बना रहता है। +तीनों सेशन-अफिनिटी हेडर कभी भी अपस्ट्रीम अग्रेषित नहीं किए जाते — एक्ज़ीक्यूटर क्लाइंट हेडर को आगे भेजने के बजाय अपने अपस्ट्रीम हेडर शुरू से बनाते हैं, इसलिए यह केवल एक आंतरिक सहसंबंध ID बना रहता है। -### एक्सक्लूसिव प्रबंधित सत्र कनेक्शन लीज़ +### एक्सक्लूसिव मैनेज्ड सेशन कनेक्शन लीज़ -**दायरा:** एक सक्रिय प्रबंधित HTTP क्लाइंट/सत्र एक पात्र OmniRoute कनेक्शन का स्वामी होता है। +**दायरा:** एक सक्रिय मैनेज्ड HTTP क्लाइंट/सेशन एक पात्र OmniRoute कनेक्शन का स्वामी होता है। -**उद्देश्य:** उन क्लाइंट के लिए स्थायी एक्सक्लूसिव कनेक्शन स्वामित्व प्रदान करना, जिन्हें अनुरोधों के बीच कठोर रूटिंग -सीमा की आवश्यकता होती है। यह सत्र एफ़िनिटी से अलग है, जो एक नरम निरंतरता प्राथमिकता है: -एक एक्सक्लूसिव लीज़ SQLite में जीवनचक्र स्थिति को स्थायी रखती है, वैश्विक सक्रिय-स्वामी और -सक्रिय-कनेक्शन विशिष्टता लागू करती है, और प्रदाता डिस्पैच से पहले पुराने जेनरेशन को अस्वीकार करती है। +**उद्देश्य:** उन क्लाइंट के लिए टिकाऊ एक्सक्लूसिव कनेक्शन स्वामित्व प्रदान करना जिन्हें अनुरोधों के बीच एक सख्त रूटिंग सीमा की आवश्यकता होती है। यह सेशन अफिनिटी से अलग है, जो निरंतरता की एक सॉफ्ट प्राथमिकता है: एक एक्सक्लूसिव लीज़ SQLite में लाइफ़साइकल स्थिति को स्थायी रखती है, वैश्विक सक्रिय-स्वामी और सक्रिय-कनेक्शन विशिष्टता लागू करती है, और प्रदाता को अनुरोध भेजने से पहले किसी पुराने जेनरेशन को अस्वीकार करती है। -यह सुविधा प्रति API कुंजी ऑप्ट-इन है। प्रबंधित कुंजी में `lease:exclusive` स्कोप और एक -स्पष्ट गैर-रिक्त `allowedConnections` सूची होनी चाहिए। कोई भी HTTP क्लाइंट जीवनचक्र एंडपॉइंट का उपयोग कर सकता है; किसी -क्लाइंट नाम, यूज़र-एजेंट, प्रदाता, OAuth विधि या मॉडल की आवश्यकता नहीं है। लीज़ किसी कनेक्शन की स्वामी होती है, -न कि किसी मॉडल की, इसलिए मॉडल परिवर्तन बाइंडिंग को बनाए रखता है, बशर्ते कनेक्शन सामान्य रूप से -पात्र बना रहे। सामान्य मॉडल, कोटा, स्वास्थ्य, कूलडाउन और अनुमत-सूची नियम प्राधिकृत बने रहते हैं और -उसी जेनरेशन को किसी अन्य मुक्त पात्र कनेक्शन पर स्थानांतरित कर सकते हैं। +यह सुविधा प्रत्येक API कुंजी के लिए ऑप्ट-इन है। किसी मैनेज्ड कुंजी में `lease:exclusive` स्कोप और एक स्पष्ट, गैर-रिक्त `allowedConnections` सूची होनी चाहिए। कोई भी HTTP क्लाइंट लाइफ़साइकल एंडपॉइंट का उपयोग कर सकता है; किसी क्लाइंट नाम, यूज़र-एजेंट, प्रदाता, OAuth विधि या मॉडल की आवश्यकता नहीं है। लीज़ किसी कनेक्शन की स्वामी होती है, मॉडल की नहीं, इसलिए मॉडल बदलने पर भी बाइंडिंग बनी रहती है, बशर्ते कनेक्शन सामान्य रूप से पात्र बना रहे। सामान्य मॉडल, कोटा, स्वास्थ्य, कूलडाउन और अनुमति-सूची नियम प्रामाणिक बने रहते हैं और उसी जेनरेशन को किसी अन्य खाली पात्र कनेक्शन पर स्थानांतरित कर सकते हैं। -जीवनचक्र `POST /api/v1/session-leases` है, जिसमें JSON एक्शन `acquire`, `renew`, और `release` होते हैं। -प्रबंधित इन्फ़रेंस अनुरोध अपारदर्शी `X-OmniRoute-Lease-Owner` मान और सटीक -`X-OmniRoute-Lease-Generation` प्रस्तुत करते हैं। स्वामी में `vlo_` के बाद 43 base64url वर्ण होते हैं; केवल -उसका SHA-256 हैश संग्रहीत किया जाता है। प्रत्येक अंतिम डिस्पैच सीमा प्रमाणित API कुंजी ID और -सक्रिय कनेक्शन ID को भी बाइंड करती है। लीज़ नियंत्रण हेडर लॉग, सुरक्षित रखे गए अनुरोध स्नैपशॉट और -अपस्ट्रीम एक्ज़ीक्यूटर हेडर से हटा दिए जाते हैं। +लाइफ़साइकल `POST /api/v1/session-leases` है, जिसमें JSON एक्शन `acquire`, `renew`, और `release` हैं। मैनेज्ड इन्फ़रेंस अनुरोध अपारदर्शी `X-OmniRoute-Lease-Owner` मान और सटीक `X-OmniRoute-Lease-Generation` प्रस्तुत करते हैं। स्वामी मान में `vlo_` के बाद 43 base64url वर्ण होते हैं; केवल उसका SHA-256 हैश संग्रहीत किया जाता है। प्रत्येक अंतिम डिस्पैच सीमा प्रमाणित API कुंजी ID और सक्रिय कनेक्शन ID को भी बाँधती है। लीज़ नियंत्रण हेडर लॉग, संरक्षित अनुरोध स्नैपशॉट और अपस्ट्रीम एक्ज़ीक्यूटर हेडर से हटा दिए जाते हैं। -यदि सामान्य रूटिंग में पात्र प्रबंधित उम्मीदवार हैं, लेकिन प्रत्येक मुक्त उम्मीदवार पर किसी -विदेशी सक्रिय लीज़ का कब्ज़ा है, तो OmniRoute HTTP `429`, लीज़-क्षमता-अनुपलब्ध कोड, एक -क्षमता-की-प्रतीक्षा स्थिति, और सबसे निकट प्रासंगिक समाप्ति से प्राप्त सीमित `Retry-After` लौटाता है। -सामान्य रिक्त पात्रता लीज़ विवाद नहीं है और अपनी मौजूदा रूटिंग त्रुटि अर्थवत्ता बनाए रखती है। +यदि सामान्य रूटिंग के पास पात्र मैनेज्ड उम्मीदवार हैं, लेकिन प्रत्येक खाली उम्मीदवार पर किसी बाहरी सक्रिय लीज़ का अधिकार है, तो OmniRoute HTTP `429`, lease-capacity-unavailable कोड, प्रतीक्षा-के-लिए-क्षमता स्थिति और सबसे पहले होने वाली प्रासंगिक समाप्ति से प्राप्त सीमित `Retry-After` लौटाता है। सामान्य रिक्त पात्रता लीज़-विवाद नहीं है और अपने मौजूदा रूटिंग त्रुटि व्यवहार को बनाए रखती है। संबंधित तंत्र अलग बने रहते हैं: -- OAuth सत्र अधिभोग, OAuth खातों के लिए प्रक्रिया-स्थानीय नरम वितरण है। -- खाता सेमाफ़ोर अनुरोध-समवर्ती परमिट प्रदान करते हैं और अनुरोध पूरा होने पर समाप्त हो जाते हैं। -- एक्सक्लूसिव प्रबंधित सत्र लीज़, जेनरेशन सीमा के साथ स्थायी जीवनचक्र स्वामित्व हैं। +- OAuth सेशन ऑक्यूपेंसी, OAuth अकाउंट के लिए प्रोसेस-लोकल सॉफ्ट वितरण है। +- अकाउंट सेमाफ़ोर अनुरोध-संगामिति परमिट प्रदान करते हैं और अनुरोध पूरा होने पर समाप्त हो जाते हैं। +- एक्सक्लूसिव मैनेज्ड सेशन लीज़, जेनरेशन सीमा के साथ टिकाऊ लाइफ़साइकल स्वामित्व हैं। --- @@ -267,30 +311,76 @@ lockout _स्थिति_ अस्थायी है। ## 5. अनुरोध कतार प्रवेश नियंत्रण (v3.8.49 · issue #6593) -**दायरा**: स्थानीय प्रति-प्रोवाइडर+कनेक्शन दर-सीमा कतार (`open-sse/services/rateLimitManager.ts`, -जो Bottleneck द्वारा समर्थित है), ऊपर दिए गए तीन तंत्रों से एक परत नीचे। - -**`maxWaitMs` निष्पादन समाप्ति के लिए पुराना स्थायी नाम है।** -`resilienceSettings.requestQueue.maxWaitMs` को Bottleneck में जॉब -`expiration` के रूप में पास किया जाता है, जिसका टाइमर डिस्पैच के बाद ही शुरू होता है। इसलिए यह स्थानीय कतार में बिताए गए समय को नहीं, बल्कि लिमिटर द्वारा प्रबंधित निष्पादन को सीमित करता है। समाप्ति को विश्वसनीय स्थानीय `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) के रूप में प्रदर्शित किया जाता है; -पूर्व कतार-टाइमआउट कोड नाम केवल विश्वसनीय आंतरिक पश्चगामी संगतता के लिए स्वीकार किया जाता है। डिफ़ॉल्ट 15000ms है; इसे `RATE_LIMIT_MAX_WAIT_MS` (env) या डैशबोर्ड (**Settings → Resilience**, 1–30000ms UI अधिकतम सीमा) के माध्यम से ओवरराइड करें। कतार में रहने के समय की कोई समय-सीमा नहीं है; कतारबद्ध कॉलर की संख्या सीमित करने के लिए नीचे दिए गए `maxQueueDepth` का उपयोग करें। - -**`maxQueueDepth` — ऑप्ट-इन प्रवेश सीमा (नई)।** `resilienceSettings.requestQueue.maxQueueDepth` -यह सीमित करता है कि एक प्रोवाइडर+कनेक्शन के लिए एक समय में कितने अनुरोध कतार में (अभी तक डिस्पैच नहीं हुए) रह सकते हैं। जब कतार में पहले से ही `maxQueueDepth` अनुरोध मौजूद हों, तो नए अनुरोध को `limiter.schedule()` तक पहुँचने से **पहले** टाइप की गई -`code: "RATE_LIMIT_QUEUE_FULL"` त्रुटि के साथ तुरंत अस्वीकार कर दिया जाता है -— इसलिए अस्वीकृति कम लागत वाली होती है और उस अनुरोध के लिए किसी भी डाउनस्ट्रीम प्रॉम्प्ट-संपीड़न / अनुवाद कार्य से पहले हो जाती है। डिफ़ॉल्ट `0` = -अक्षम, जो मौजूदा असीमित-कतार व्यवहार को बनाए रखता है; सीमा 0–100000 है। -इसे `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) या -`resilienceSettings.requestQueue.maxQueueDepth` (डैशबोर्ड/API पैच) के माध्यम से ओवरराइड करें। - -प्रवेश जाँच स्वयं एक शुद्ध फ़ंक्शन है -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), इसलिए वास्तविक Bottleneck लिमिटर के बिना इसका यूनिट परीक्षण किया जा सकता है। - -> #6593 आरंभ करने वाले RFC ने एक `bypassCompressionOnRateLimit` -> फ़्लैग का भी प्रस्ताव दिया था। इस रिपॉज़िटरी की `open-sse/services/compression/` पाइपलाइन -> आउटबाउंड LLM अनुरोध पर प्रॉम्प्ट/कॉन्टेक्स्ट संपीड़न करती है (`chatCore.ts`, -> `resolveCompressionSettings`/`selectCompressionStrategy` ब्लॉक के आसपास), -> न कि बनाए गए 429 बॉडी पर HTTP प्रतिक्रिया संपीड़न — किसी वास्तविक बायपास फ़्लैग के लिए कोई मेल खाता कोड पथ नहीं है। वह प्रॉम्प्ट-संपीड़न चरण भी वर्तमान में अनुरोध पाइपलाइन में `withRateLimit()` से _पहले_ चलता है, इसलिए कतार-पूर्ण अस्वीकृति पर उसे छोड़ने के लिए क्रम बदलना इस issue के दायरे की तुलना में एक अलग और बड़ा परिवर्तन है; इसे जानबूझकर यहाँ लागू **नहीं** किया गया और यदि CPU बचत का लाभ क्रम बदलने के जोखिम के योग्य हो, तो इसे अनुवर्ती कार्य के रूप में छोड़ा गया है। +**दायरा**: स्थानीय प्रति-provider+connection दर-सीमा कतार (`open-sse/services/rateLimitManager.ts`, +जो Bottleneck द्वारा समर्थित है), ऊपर बताए गए तीन तंत्रों से एक स्तर नीचे। + +**`maxWaitMs` कतार में प्रतीक्षा को सीमित करता है; `executionMaxWaitMs` निष्पादन को सीमित करता है।** +दोनों को जानबूझकर अलग रखा गया है और कोई भी दूसरे को प्रभावित नहीं करता। + +`resilienceSettings.requestQueue.maxWaitMs` **कतार-प्रतीक्षा बजट** है: इसमें +provider स्लॉट की प्रतीक्षा और फिर QUEUED स्थिति में रहना शामिल है, और जैसे ही +जॉब QUEUED से निकलकर निष्पादित होना शुरू करता है, इसका टाइमर साफ़ कर दिया जाता है +(`rateLimitManager.ts`, `wrappedFn`)। इस सीमा से अधिक समय लेने वाला अनुरोध कभी +upstream तक नहीं पहुँचता। डिफ़ॉल्ट 30000ms है, जिसे +`src/lib/resilience/settings.ts` में `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +द्वारा प्रदान किया जाता है और +`tests/unit/ratelimit-admission-control-6593.test.ts` द्वारा निर्धारित किया गया है, +ताकि इसे बदलने पर यह अनुच्छेद चुपचाप पुराना बने रहने के बजाय वह परीक्षण विफल हो जाए। + +`resilienceSettings.requestQueue.executionMaxWaitMs` वह मान है जिसे Bottleneck +जॉब के `expiration` के रूप में प्राप्त करता है, जिसका टाइमर केवल dispatch के बाद +शुरू होता है। यह उन executors के लिए सुरक्षा-सीमा है जिनका अपना कोई upstream +timeout नहीं है, और जब executor का अपना fetch-start timeout इससे अधिक होता है, +तो इसे उस timeout तक बढ़ा दिया जाता है, ताकि यह किसी स्वस्थ in-flight response +को बीच में समाप्त न कर सके। डिफ़ॉल्ट 600000ms (10 मिनट) है। + +कतार बजट को `expiration` में देना ही वह कारण था जिससे पहले non-incremental +gateways बीच में समाप्त हो जाते थे — वे पहली bytes आने से पहले वैध रूप से कई +मिनट तक चलते हैं — और इसी कारण expiration को `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) के रूप में प्रदर्शित किया जाता है, +जबकि कतार बजट में queue-timeout code होता है। इनमें से किसी को भी +`RATE_LIMIT_MAX_WAIT_MS` / `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) या dashboard +(**Settings → Resilience**) के माध्यम से override करें। सामान्यीकरण के दौरान +दोनों को 1ms–24h की सीमा में बाँधा जाता है। + +**दोनों के लिए प्राथमिकता क्रम:** env var केवल _डिफ़ॉल्ट_ प्रदान करता है। +`resilienceSettings.requestQueue` में सहेजा गया मान (dashboard / API patch, +`key_value` में संग्रहीत) उस पर प्राथमिकता रखता है, और प्रति-connection +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` उससे भी अधिक प्राथमिकता +रखता है। इसलिए जिस deployment में पहले से कोई मान सहेजा गया है, उसमें env var +सेट करने पर कुछ नहीं बदलता — इसके बजाय सहेजी गई setting को हटाएँ या अपडेट करें। + +कतार में रहने की अवधि `maxWaitMs` द्वारा सीमित होती है; नीचे दिया गया +`maxQueueDepth` यह सीमित करता है कि एक समय में कितने callers कतार में हो सकते हैं। + +**`maxQueueDepth` — वैकल्पिक प्रवेश सीमा (नई)।** `resilienceSettings.requestQueue.maxQueueDepth` +यह सीमित करता है कि एक provider+connection के लिए एक समय में कितने अनुरोध कतार +में रह सकते हैं (जिन्हें अभी dispatch नहीं किया गया है)। जब कतार में पहले से +`maxQueueDepth` अनुरोध होते हैं, तो नया अनुरोध typed +`code: "RATE_LIMIT_QUEUE_FULL"` error के साथ तेज़ी से अस्वीकार कर दिया जाता है, +**इससे पहले** कि वह कभी `limiter.schedule()` तक पहुँचे — इसलिए यह अस्वीकृति +कम लागत वाली है और उस अनुरोध के लिए किसी भी downstream prompt-compression / +translation कार्य से पहले होती है। डिफ़ॉल्ट `0` = अक्षम, जिससे मौजूदा +असीमित-कतार व्यवहार बना रहता है; सीमा 0–100000 है। +`RATE_LIMIT_MAX_QUEUE_DEPTH` (env) या +`resilienceSettings.requestQueue.maxQueueDepth` (dashboard/API patch) के माध्यम +से override करें। + +प्रवेश जाँच स्वयं एक pure function है +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), इसलिए +इसे वास्तविक Bottleneck limiter के बिना unit-test किया जा सकता है। + +> #6593 शुरू करने वाले RFC में एक `bypassCompressionOnRateLimit` +> flag का भी प्रस्ताव था। इस repo की `open-sse/services/compression/` pipeline +> outbound LLM अनुरोध पर prompt/context compression करती है (`chatCore.ts`, +> `resolveCompressionSettings`/`selectCompressionStrategy` block के आसपास), +> synthesized 429 bodies पर HTTP response compression नहीं — किसी शाब्दिक bypass +> flag के लिए कोई मेल खाता code path मौजूद नहीं है। वह prompt-compression चरण +> वर्तमान में request pipeline में `withRateLimit()` से _पहले_ भी चलता है, इसलिए +> queue-full अस्वीकृति पर इसे छोड़ने के लिए क्रम बदलना इस issue के दायरे से अलग +> और अधिक बड़ा परिवर्तन है; इसे यहाँ जानबूझकर लागू **नहीं** किया गया है और यदि +> CPU की बचत reordering के जोखिम के लायक हो, तो इसे follow-up के रूप में छोड़ +> दिया गया है। --- diff --git a/docs/i18n/hi/docs/architecture/admission-lanes.md b/docs/i18n/hi/docs/architecture/admission-lanes.md index 202869e1b520..6954bee20f2d 100644 --- a/docs/i18n/hi/docs/architecture/admission-lanes.md +++ b/docs/i18n/hi/docs/architecture/admission-lanes.md @@ -7,52 +7,51 @@ OmniRoute में अलग-अलग स्कोप वाली **दो** प्रोसेस-लोकल लेन प्रणालियाँ हैं। वे एक-दूसरे की पूरक हैं; ऑपरेटरों को पता होना चाहिए कि वे किस प्रणाली को देख रहे हैं। -## 1. बाइट-स्तरीय प्रोसेस-व्यापी प्रवेश (`chatBodyAdmission.ts`) - -- **स्कोप:** `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses`, - और चैट-जैसे अन्य रूटों के लिए बफ़र की गई बॉडी/हीप पथ। बड़ी कोडिंग-एजेंट - बॉडी के कारण होने वाले हीप विस्तार से सुरक्षा करता है (#4380)। -- **एक प्रोसेस-ग्लोबल नियंत्रक, प्रति-कुंजी लेन नहीं (#10110)।** प्रत्येक API कुंजी - (हैश की गई) या `anonymous` सत्र **समान** साझा बजट के विरुद्ध प्रवेश पाता है — - हैश किए गए सत्र आईडी का उपयोग केवल निष्पक्षता शेड्यूलिंग कुंजी के रूप में - (प्रतीक्षारत अनुरोधों के बीच राउंड-रॉबिन डिस्पैच) किया जाता है, क्षमता शार्ड के - रूप में कभी नहीं। इस दस्तावेज़ के पिछले संस्करण में स्वतंत्र क्षमता वाली - प्रति-कुंजी लेन का वर्णन था; उस मॉडल को #10110 में हटा दिया गया, क्योंकि वह - अप्रमाणित नकली क्रेडेंशियल को प्रोसेस-व्यापी सीमा कई गुना बढ़ाने देता था। -- **गेट (#503-fanout): स्वतः-व्युत्पन्न इनजेस्ट BYTE बजट, निश्चित अनुरोध - संख्या नहीं।** पुरानी `CHAT_MAX_HEAVY_IN_FLIGHT` अनुरोध-संख्या सीमा (इस - सुधार से पहले डिफ़ॉल्ट `1`) ने कोडिंग-एजेंट फ़ैन-आउट (एकाधिक सबएजेंट/CLI, - बॉडी सामान्यतः > 256 KB) को ~1 की प्रभावी समवर्ती क्षमता तक सीमित कर दिया - था, जिससे पूरी तरह सामान्य लोड के अंतर्गत 503 त्रुटियाँ आती थीं। अब यह केवल - तभी बाध्यकारी होती है, जब कोई ऑपरेटर स्पष्ट रूप से - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` सेट करता है। इसे सेट न करने पर प्रवेश - को इसके बजाय `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` द्वारा नियंत्रित किया जाता - है — यह प्रोसेस की वास्तविक मेमोरी सीमा - (`src/shared/middleware/admissionBudget.ts`) से स्वतः-व्युत्पन्न बजट है: - V8 हीप सीमा और किसी भी cgroup/कंटेनर सीमा में से अधिक सख्त सीमा का 25%, - जिसे 8x अस्थायी-विस्तार गुणक से विभाजित करके 8 MiB और 2 GiB के बीच सीमित - किया जाता है। स्पष्ट ओवरराइड भी इन्हीं सीमाओं का उपयोग करते हैं। यह बिना - किसी env समायोजन के स्वयं को 512 MB कंटेनर से लेकर 32 GB डेस्कटॉप तक - स्केल करता है। जो बॉडी प्रभावी बजट के भीतर फ़िट नहीं हो सकती, वह तुरंत - `413 body_exceeds_budget` के साथ विफल हो जाती है; केवल अलग-अलग रूप से - सेवायोग्य बॉडी के बीच संसाधन-संघर्ष ही सीमित निष्पक्षता कतार में प्रवेश - करता है। एक लाइव बहु-संकेत संसाधन-दबाव ट्रैकर (V8 हीप अनुपात, - cgroup, PSI, OOM घटनाएँ — `open-sse/utils/resourcePressurePolicy.ts`) - `high` दबाव के अंतर्गत सीमित प्रतीक्षा अवधि कम करता है और `critical` दबाव - के अंतर्गत, किसी भी बाइट को इनजेस्ट किए जाने से पहले ही, - `503 resource_pressure` के साथ लोड तुरंत कम करता है। +## 1. बाइट-स्तरीय प्रक्रिया-व्यापी प्रवेश (`chatBodyAdmission.ts`) + +- **दायरा:** `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` और अन्य चैट-आकार वाले रूट्स के लिए बफ़र किए गए बॉडी/हीप का पथ। बड़े कोडिंग-एजेंट बॉडी से होने वाले हीप प्रवर्धन से सुरक्षा करता है (#4380)। +- **एक प्रक्रिया-वैश्विक नियंत्रक, प्रति-कुंजी लेन नहीं (#10110)।** प्रत्येक API कुंजी + (हैश की गई) या `anonymous` सत्र **उसी** साझा बजट के विरुद्ध प्रवेश करता है — + हैश किए गए सत्र id का उपयोग केवल निष्पक्षता शेड्यूलिंग कुंजी के रूप में किया जाता है (प्रतीक्षारत अनुरोधों में राउंड-रॉबिन + डिस्पैच), क्षमता शार्ड के रूप में कभी नहीं। इस + दस्तावेज़ के पिछले संस्करण में स्वतंत्र क्षमता वाली प्रति-कुंजी लेन का वर्णन किया गया था; उस मॉडल को + #10110 में हटा दिया गया, क्योंकि उससे अप्रमाणित नकली क्रेडेंशियल प्रक्रिया-व्यापी सीमा को + कई गुना बढ़ा सकते थे। +- **गेट (#503-fanout): स्वतः-व्युत्पन्न अंतर्ग्रहण BYTE बजट, निश्चित अनुरोध + संख्या नहीं।** पुरानी `CHAT_MAX_HEAVY_IN_FLIGHT` अनुरोध-संख्या सीमा (इस सुधार से पहले डिफ़ॉल्ट `1`) + ने कोडिंग-एजेंट फ़ैन-आउट (एकाधिक सबएजेंट/CLIs, + नियमित रूप से > 256 KB वाले बॉडी) को लगभग 1 की प्रभावी समवर्तीता तक सीमित कर दिया था, जिससे पूरी तरह सामान्य लोड में भी + 503 त्रुटियाँ आती थीं। अब यह केवल तभी बाध्यकारी होती है, जब कोई ऑपरेटर स्पष्ट रूप से + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` सेट करता है। इसे अनसेट छोड़ने पर, प्रवेश को इसके बजाय + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` द्वारा नियंत्रित किया जाता है — यह बजट प्रक्रिया की + वास्तविक मेमोरी सीमा (`src/shared/middleware/admissionBudget.ts`) से स्वतः व्युत्पन्न होता है: + V8 हीप सीमा और किसी भी cgroup/container सीमा में से अधिक कठोर सीमा का 25%, + जिसे 8x क्षणिक-प्रवर्धन गुणक से विभाजित किया जाता है और 8 MiB से + 2 GiB के बीच सीमित किया जाता है। स्पष्ट ओवरराइड भी इन्हीं सीमाओं का उपयोग करते हैं। यह बिना किसी env समायोजन के + 512 MB कंटेनर से लेकर 32 GB डेस्कटॉप तक स्वयं को अनुकूलित करता है। जो बॉडी + प्रभावी बजट में समा नहीं सकती, वह तुरंत `413 body_exceeds_budget` के साथ विफल हो जाती है; + केवल अलग-अलग रूप से सेवा-योग्य बॉडी के बीच होने वाला संसाधन-विवाद ही सीमित + निष्पक्षता कतार में प्रवेश करता है। एक सक्रिय बहु-संकेत संसाधन-दबाव ट्रैकर (V8 हीप अनुपात, + cgroup, PSI, OOM घटनाएँ — `open-sse/utils/resourcePressurePolicy.ts`) `high` दबाव में + सीमित प्रतीक्षा को कम करता है और `critical` दबाव में + `503 resource_pressure` के साथ तुरंत लोड घटाता है, इससे पहले कि कोई बाइट अंतर्ग्रहित भी हो। + उपलब्ध होने पर PSI को इस यूनिट के cgroup `memory.pressure` से पढ़ा जाता है + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` + पूरे होस्ट पर लागू होता है और केवल बेयर मेटल / cgroup v1 पर फ़ॉलबैक है, इसलिए स्वैपिंग वाला + होस्ट किसी निष्क्रिय कंटेनर में 503 त्रुटि उत्पन्न नहीं कर सकता। - **समायोजन:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — स्वतः-व्युत्पन्न बाइट बजट के लिए ओवरराइड - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — पुरानी अनुरोध-संख्या सीमा, केवल ऑप्ट-इन - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — 503 से पहले कतार-प्रतीक्षा (डिफ़ॉल्ट 2000) - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — कतारबद्ध-बाइट हीप वाल्व (डिफ़ॉल्ट 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110 - के बाद से बहिष्कृत और निष्प्रभावी (कॉन्फ़िगरेशन संगतता के लिए स्वीकार किए जाते हैं, पर अनदेखे किए जाते हैं) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110 से अप्रचलित + नो-ऑप्स (कॉन्फ़िगरेशन संगतता के लिए स्वीकार किए जाते हैं, लेकिन अनदेखे किए जाते हैं) - **रिपोर्ट:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — इसमें #503-fanout के अतिरिक्त फ़ील्ड `inflightBytes`, `maxInflightBytes`, `budgetSource` - (`v8_heap` | `cgroup` | `override`), `pressureSeverity`, और `countCapEnabled` - शामिल हैं (डिफ़ॉल्ट डिप्लॉयमेंट पर false — यह पुष्टि करता है कि वास्तव में - बाइट बजट बाध्यकारी है, पुरानी अनुरोध-संख्या सीमा नहीं)। + (`v8_heap` | `cgroup` | `override`), `pressureSeverity` और `countCapEnabled` + शामिल हैं (डिफ़ॉल्ट परिनियोजन पर false — यह पुष्टि करता है कि वास्तव में बाइट बजट बाध्यकारी है, + न कि पुरानी संख्या सीमा)। ## 2. अनुकूली रनटाइम वर्चुअल लेन (`open-sse/services/admission`) diff --git a/docs/i18n/hi/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/hi/docs/frameworks/EMBEDDED-SERVICES.md index 6a24e6960ca4..139be759d6e1 100644 --- a/docs/i18n/hi/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/hi/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **संस्करण:** v3.8.44 -> **अंतिम अपडेट:** 2026-07-03 -> **पाठक-वर्ग:** एम्बेडेड सेवाएँ (9Router, CLIProxyAPI, Mux, Bifrost) जोड़ने, बनाए रखने या डीबग करने वाले इंजीनियर। +> **अंतिम अपडेट:** 2026-09-09 +> **लक्षित पाठक:** एम्बेडेड सेवाओं (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) को जोड़ने, बनाए रखने या डीबग करने वाले इंजीनियर। -एम्बेडेड सेवाएँ स्थानीय रूप से इंस्टॉल किए गए प्रोसेस साइडकार टूल हैं, जिन्हें OmniRoute इंस्टॉल करता है, उनकी निगरानी करता है और -प्रथम-श्रेणी रूटिंग लक्ष्यों के रूप में उपलब्ध कराता है। बाहरी प्रदाताओं (जिन तक इंटरनेट के माध्यम से -API कुंजियों का उपयोग करके पहुँचा जाता है) के विपरीत, एम्बेडेड सेवाएँ OmniRoute वाली मशीन पर ही चलती हैं और लूपबैक पर संचार करती हैं। +एम्बेडेड सेवाएँ स्थानीय रूप से इंस्टॉल किए गए प्रोसेस साइडकार टूल हैं, जिन्हें OmniRoute इंस्टॉल करता है, पर्यवेक्षित करता है और +प्रथम-श्रेणी रूटिंग लक्ष्यों के रूप में उपलब्ध कराता है। बाहरी प्रोवाइडरों (जिन तक इंटरनेट पर +API कुंजियों के माध्यम से पहुँचा जाता है) के विपरीत, एम्बेडेड सेवाएँ OmniRoute वाली मशीन पर ही चलती हैं और लूपबैक के माध्यम से संचार करती हैं। --- @@ -31,33 +31,34 @@ API कुंजियों का उपयोग करके पहुँच ### एम्बेडेड सेवाएँ क्यों? -पाँच सेवाएँ एम्बेड की गई हैं: +छह सेवाएँ एम्बेड की गई हैं: -| सेवा | npm पैकेज | डिफ़ॉल्ट पोर्ट | उद्देश्य | -| --------------- | --------------------------------- | :------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | ऐसा AI राउटर जिसे OmniRoute उप-प्रदाता के रूप में उपयोग कर सकता है। मॉडल `9router/{sub}/{model}` के रूप में उपलब्ध कराए जाते हैं | -| **CLIProxyAPI** | GitHub रिलीज़ बाइनरी (`cliproxy`) | 8317 | Anthropic CLI प्रमाणीकरण फ़्लो के लिए स्थानीय प्रॉक्सी अडैप्टर। OAuth टोकन की समय-सीमा समाप्त होने पर फ़ॉलबैक रूटिंग प्रदान करता है | -| **Mux** | `mux` (हेडलेस `mux server`) | 8322 | स्थानीय एजेंट-ऑर्केस्ट्रेशन डेमन (coder/mux)। केवल लाइफ़साइकल-प्रबंधित — रूटिंग लक्ष्य नहीं है (कोई LLM प्रॉक्सीइंग नहीं)। | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-गेटवे रिले बैकएंड। चलते समय रिले रूट (`/v1/relay/`) द्वारा स्वतः चुना जाता है | -| **Dario** | `@askalf/dario` | 3456 | Claude-सब्सक्रिप्शन प्रॉक्सी — Claude-Code-रूपी ट्रैफ़िक के लिए CLIProxyAPI का विकल्प/फ़ेलओवर; इंजेक्ट की गई कुंजी `DARIO_ADMIN_TOKEN` बन जाती है, जो इसके `/admin/*` OAuth नियंत्रण तल को सुरक्षित करती है | +| सेवा | npm पैकेज | डिफ़ॉल्ट पोर्ट | उद्देश्य | +| --------------- | --------------------------------- | :------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI राउटर, जिसे OmniRoute उप-प्रदाता के रूप में उपयोग कर सकता है। मॉडल `9router/{sub}/{model}` के रूप में उपलब्ध कराए जाते हैं | +| **CLIProxyAPI** | GitHub रिलीज़ बाइनरी (`cliproxy`) | 8317 | Anthropic CLI प्रमाणीकरण प्रवाहों के लिए स्थानीय प्रॉक्सी अडैप्टर। OAuth टोकन की समय-सीमा समाप्त होने पर फ़ॉलबैक रूटिंग प्रदान करता है | +| **Mux** | `mux` (हेडलेस `mux server`) | 8322 | स्थानीय एजेंट-ऑर्केस्ट्रेशन डेमन (coder/mux)। केवल जीवनचक्र-प्रबंधित — रूटिंग लक्ष्य नहीं (कोई LLM प्रॉक्सीइंग नहीं)। | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-गेटवे रिले बैकएंड। चलने के दौरान, रिले रूट (`/v1/relay/`) द्वारा स्वचालित रूप से चयनित होता है | +| **Dario** | `@askalf/dario` | 3456 | Claude-सब्सक्रिप्शन प्रॉक्सी — Claude-Code-स्वरूपित ट्रैफ़िक के लिए CLIProxyAPI का विकल्प/फ़ेलओवर; इंजेक्ट की गई कुंजी `DARIO_ADMIN_TOKEN` बन जाती है, जो इसके `/admin/*` OAuth नियंत्रण तल तक पहुँच नियंत्रित करती है | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web स्वचालन (Puppeteer के माध्यम से हेडलेस Chromium)। केवल जीवनचक्र-प्रबंधित — रूटिंग लक्ष्य नहीं। | -सभी पाँच समान पर्यवेक्षी मॉडल का पालन करती हैं: +सभी छह समान पर्यवेक्षी मॉडल का पालन करते हैं: - OmniRoute उन्हें `DATA_DIR/services/{name}/` के अंतर्गत इंस्टॉल करता है (OmniRoute के अपने `package.json` से पृथक) - OmniRoute उन्हें चाइल्ड प्रोसेस के रूप में शुरू करता है और उनकी निगरानी करता है -- OmniRoute चाइल्ड के एनवायरनमेंट में एक अस्थायी API कुंजी इंजेक्ट करता है और उसे बिना डाउनटाइम के रोटेट करता है (जहाँ लागू हो) -- सभी प्रबंधन रूट (`/api/services/*`) **LOCAL_ONLY** हैं — केवल लूपबैक से ऐक्सेस किए जा सकते हैं (कठोर नियम #17) +- OmniRoute चाइल्ड के एनवायरनमेंट में एक अल्पकालिक API कुंजी इंजेक्ट करता है और बिना डाउनटाइम के उसे रोटेट करता है (जहाँ लागू हो) +- सभी प्रबंधन रूट (`/api/services/*`) **LOCAL_ONLY** हैं — केवल लूपबैक से पहुँच योग्य (अनिवार्य नियम #17) ### प्रमुख निर्णय (डिज़ाइन योजना से) -| निर्णय | मान | -| ------------------------------------- | --------------------------------------------------------------------------------------------------------------- | -| 9Router के नेटिव UI तक डैशबोर्ड पहुँच | `/dashboard/providers/services/9router/embed/*` पर रिवर्स प्रॉक्सी | -| इंस्टॉलेशन तंत्र | `execFile` के माध्यम से `npm install {package}` (कोई शेल इंटरपोलेशन नहीं) | -| उपभोग मोड | रूटिंग इंजन में `9router/{sub}/{model}` के रूप में पंजीकृत प्रदाता | -| API कुंजी प्रबंधन | OmniRoute जनरेट करता है, स्थिर अवस्था में एन्क्रिप्ट करता है (AES-256-GCM), और env के माध्यम से इंजेक्ट करता है | -| डैशबोर्ड स्थान | `/dashboard/providers/services` (तीन टैब) | -| ऑटो-स्टार्ट | प्रत्येक सेवा के लिए टॉगल, डिफ़ॉल्ट रूप से बंद | +| निर्णय | मान | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| 9Router के नेटिव UI तक डैशबोर्ड की पहुँच | `/dashboard/providers/services/9router/embed/*` पर रिवर्स प्रॉक्सी | +| इंस्टॉलेशन तंत्र | `execFile` के माध्यम से `npm install {package}` (कोई शेल इंटरपोलेशन नहीं) | +| उपभोग मोड | रूटिंग इंजन में `9router/{sub}/{model}` के रूप में पंजीकृत प्रदाता | +| API कुंजी प्रबंधन | OmniRoute जनरेट करता है, एट-रेस्ट एन्क्रिप्ट करता है (AES-256-GCM), और env के माध्यम से इंजेक्ट करता है | +| डैशबोर्ड स्थान | `/dashboard/providers/services` (तीन टैब) | +| ऑटो-स्टार्ट | प्रत्येक सेवा के लिए टॉगल, डिफ़ॉल्ट रूप से बंद | --- @@ -65,9 +66,9 @@ API कुंजियों का उपयोग करके पहुँच ``` ┌────────────────────────────────────────────────────────────────────┐ -│ परत 1 — UI │ -│ /dashboard/providers/services (टैब: CLIProxyAPI | 9Router | Mux) │ -│ लाइव लॉग (SSE), प्रारंभ/रोकें/पुनः प्रारंभ/अपडेट, सेटिंग्स, इंस्टॉल│ +│ परत 1 — UI │ +│ /dashboard/providers/services (टैब: CLIProxyAPI | 9Router | Mux)│ +│ लाइव लॉग (SSE), शुरू/बंद/पुनः आरंभ/अपडेट, सेटिंग्स, इंस्टॉल │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ │ ├── page.tsx शेल + ?tab= द्वारा टैब रूटिंग │ @@ -78,7 +79,7 @@ API कुंजियों का उपयोग करके पहुँच └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (Next.js fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ परत 2 — API (LOCAL_ONLY — केवल लूपबैक) │ +│ परत 2 — API (LOCAL_ONLY — केवल लूपबैक) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -94,34 +95,34 @@ API कुंजियों का उपयोग करके पहुँच └──────────────────────┬─────────────────────────────────────────────┘ │ इन-प्रोसेस कॉल ┌──────────────────────▼─────────────────────────────────────────────┐ -│ परत 3 — ServiceSupervisor (src/lib/services/) │ +│ परत 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts सामान्य सुपरवाइज़र (child_process.spawn) │ -│ ├── इंस्टॉल: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── प्रारंभ: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── पोर्ट: 9Router के लिए 20130 (कॉन्फ़िगर करने योग्य) │ +│ ├── इंस्टॉल: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── शुरू करना: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── पोर्ट: 9Router के लिए 20130 (कॉन्फ़िगर करने योग्य) │ │ ├── लॉग: stdio रिंग बफ़र 5 MB → SSE इवेंट │ │ ├── स्वास्थ्य: प्रत्येक 2–5 सेकंड में HTTP GET /health, विलंबित रिकवरी│ -│ └── जीवनचक्र: SIGTERM 15 सेकंड → SIGKILL │ +│ └── जीवनचक्र: SIGTERM 15 सेकंड → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts प्रोसेस प्रारंभ पर सभी SERVICES[] को बूटस्ट्रैप करता है│ +│ bootstrap.ts प्रोसेस शुरू होने पर सभी SERVICES[] बूटस्ट्रैप करता है│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts आवधिक GET /v1/models → service_models टेबल │ -│ ringBuffer.ts सर्कुलर लॉग बफ़र (प्रति सेवा 5 MB) │ -│ healthCheck.ts पोलिंग HTTP स्वास्थ्य जाँच │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (इंस्टॉलर अडैप्टर) │ +│ modelSync.ts आवधिक GET /v1/models → service_models तालिका │ +│ ringBuffer.ts सर्कुलर लॉग बफ़र (प्रति सेवा 5 MB) │ +│ healthCheck.ts पोलिंग HTTP स्वास्थ्य जाँच │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (इंस्टॉलर अडैप्टर) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-संगत HTTP (लूपबैक) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ परत 4 — प्रोवाइडर / रूटिंग │ +│ परत 4 — प्रदाता / रूटिंग │ │ │ │ open-sse/executors/ninerouter.ts │ │ प्रत्येक अनुरोध पर पोर्ट और API कुंजी फिर से खोजता है (कोई कैशिंग नहीं)।│ │ प्रॉक्सी करने से पहले मॉडल id से "9router/" प्रीफ़िक्स हटाता है।│ -│ यदि सुपरवाइज़र "running" स्थिति में नहीं है, तो 503 service_not_running लौटाता है।│ +│ यदि सुपरवाइज़र "running" में न हो, तो 503 service_not_running लौटाता है।│ │ │ │ src/shared/constants/providers.ts │ │ "9router" के लिए प्रविष्टि: isEmbeddedService: true │ @@ -130,26 +131,27 @@ API कुंजियों का उपयोग करके पहुँच │ मॉडल "9router/{sub}/{model}" (प्रीफ़िक्स सहित) के रूप में संग्रहीत होते हैं।│ │ modelSync.ts द्वारा प्रत्येक 5 मिनट में सिंक किए जाते हैं। │ │ │ -│ Mux का केवल जीवनचक्र प्रबंधित होता है (परतें 1-3) — यह एक एजेंट- │ -│ ऑर्केस्ट्रेशन डेमन है, LLM प्रॉक्सी नहीं, इसलिए इसमें परत 4 की │ +│ Mux केवल जीवनचक्र-प्रबंधित है (परतें 1-3) — यह एक एजेंट- │ +│ ऑर्केस्ट्रेशन डेमन है, LLM प्रॉक्सी नहीं, इसलिए इसमें परत 4 की │ │ executor/provider प्रविष्टि नहीं है और यह कभी रूटिंग लक्ष्य नहीं बनता।│ └────────────────────────────────────────────────────────────────────┘ ``` -### प्रमुख स्रोत फ़ाइलें +### मुख्य स्रोत फ़ाइलें | फ़ाइल | भूमिका | | ------------------------------------------- | -------------------------------------------------------- | | `src/lib/services/ServiceSupervisor.ts` | मुख्य क्लास: जीवनचक्र, लॉक, स्वास्थ्य, रिंग बफ़र | | `src/lib/services/bootstrap.ts` | प्रोसेस-स्तरीय पंजीकरण और स्वतः प्रारंभ | | `src/lib/services/registry.ts` | सिंगलटन मैप `tool → supervisor` | -| `src/lib/services/apiKey.ts` | कुंजी निर्माण, स्थिर डेटा के लिए AES-256-GCM एन्क्रिप्शन | +| `src/lib/services/apiKey.ts` | कुंजी निर्माण, विश्रामावस्था में AES-256-GCM एन्क्रिप्शन | | `src/lib/services/modelSync.ts` | आवधिक मॉडल सिंक (5 मिनट) + माँग पर | | `src/lib/services/ringBuffer.ts` | SSE सदस्यता के साथ 5 MB सर्कुलर लॉग बफ़र | | `src/lib/services/healthCheck.ts` | HTTP स्वास्थ्य जाँच (कॉन्फ़िगर करने योग्य अंतराल) | | `src/lib/services/installers/ninerouter.ts` | 9Router के लिए npm इंस्टॉल/अपडेट/अनइंस्टॉल | | `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI के लिए npm इंस्टॉल/अपडेट/अनइंस्टॉल | | `src/lib/services/installers/mux.ts` | Mux के लिए npm इंस्टॉल/अपडेट/अनइंस्टॉल | +| `src/lib/services/installers/openwa.ts` | open-wa के लिए npm इंस्टॉल/अपडेट/अनइंस्टॉल | | `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` सहायक | | `src/app/api/services/[name]/logs/route.ts` | साझा SSE लॉग एंडपॉइंट | | `open-sse/executors/ninerouter.ts` | प्रदाता एक्ज़ीक्यूटर (लेयर 4) | @@ -211,15 +213,14 @@ API कुंजियों का उपयोग करके पहुँच ## 4. API संदर्भ `/api/services/` के अंतर्गत सभी रूट **LOCAL_ONLY** हैं (केवल लूपबैक, कठोर नियम #17)। -गैर-लूपबैक अनुरोधों को ऑथ टोकन की परवाह किए बिना `403 LOCAL_ONLY` मिलता है। +गैर-लूपबैक अनुरोधों को ऑथ टोकन की परवाह किए बिना `403 LOCAL_ONLY` प्राप्त होता है। ### 4.1 9Router एंडपॉइंट (11 रूट) #### `POST /api/services/9router/install` -npm से 9Router इंस्टॉल करता है। अपने स्वयं के `package.json` और `node_modules/` -के साथ `DATA_DIR/services/9router/` बनाता है। यह OmniRoute की अपनी डिपेंडेंसी से -टकराव नहीं करता। +npm से 9Router इंस्टॉल करता है। अपने स्वयं के `package.json` और `node_modules/` के साथ +`DATA_DIR/services/9router/` बनाता है। यह OmniRoute की अपनी डिपेंडेंसी से टकराव नहीं करता। **अनुरोध बॉडी** (सभी वैकल्पिक): @@ -237,30 +238,28 @@ npm से 9Router इंस्टॉल करता है। अपने स | ------ | ------------------------------------------------------------------ | | `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | | `400` | अमान्य अनुरोध बॉडी (Zod सत्यापन विफलता) | -| `409` | इंस्टॉलेशन पहले से जारी है (लॉक अधिगृहीत है) | -| `500` | npm install विफल — उपयोगकर्ता-अनुकूल त्रुटि के लिए `message` देखें | +| `409` | इंस्टॉलेशन पहले से जारी है (लॉक सक्रिय है) | +| `500` | npm इंस्टॉल विफल — उपयोगकर्ता-अनुकूल त्रुटि के लिए `message` देखें | -**टिप्पणियाँ:** `execFile('npm', [...])` का उपयोग करता है — कोई शेल नहीं, कोई -इंटरपोलेशन नहीं (कठोर नियम #13)। EACCES त्रुटियाँ उपयोगकर्ता-अनुकूल संदेशों के -रूप में दिखाई जाती हैं। +**टिप्पणियाँ:** `execFile('npm', [...])` का उपयोग करता है — कोई शेल नहीं, कोई इंटरपोलेशन नहीं (कठोर नियम #13)। +EACCES त्रुटियों को उपयोगकर्ता-अनुकूल संदेशों के रूप में दिखाया जाता है। --- #### `POST /api/services/9router/start` -9Router शुरू करता है। यदि सुपरवाइज़र पहले से पंजीकृत नहीं है, तो उसे पंजीकृत करता -है और फिर `supervisor.start()` कॉल करता है। पहले से चलने की स्थिति में यह -आइडेम्पोटेंट है। +9Router प्रारंभ करता है। यदि सुपरवाइज़र पहले से पंजीकृत नहीं है, तो उसे पंजीकृत करता है और फिर +`supervisor.start()` को कॉल करता है। पहले से चल रहा होने पर यह आइडेम्पोटेंट है। **अनुरोध बॉडी:** कोई नहीं **प्रतिक्रियाएँ:** -| स्थिति | विवरण | -| ------ | -------------------------------------------------------- | -| `200` | `ServiceStatus` ऑब्जेक्ट (नीचे स्कीमा देखें) | -| `409` | 9Router इंस्टॉल नहीं है (`status: "not_installed"`) | -| `503` | प्रारंभ करना विफल (प्रक्रिया त्रुटि — `lastError` देखें) | +| स्थिति | विवरण | +| ------ | ---------------------------------------------------------- | +| `200` | `ServiceStatus` ऑब्जेक्ट (नीचे स्कीमा देखें) | +| `409` | 9Router इंस्टॉल नहीं है (`status: "not_installed"`) | +| `503` | प्रारंभ करना विफल रहा (प्रोसेस त्रुटि — `lastError` देखें) | **ServiceStatus स्कीमा:** @@ -280,18 +279,17 @@ npm से 9Router इंस्टॉल करता है। अपने स #### `POST /api/services/9router/stop` -9Router को सुचारु रूप से रोकता है। SIGTERM भेजता है, 15 सेकंड प्रतीक्षा करता है -और यदि प्रक्रिया अब भी सक्रिय हो, तो SIGKILL भेजता है। पहले से रुकी हुई स्थिति -में यह आइडेम्पोटेंट है। +9Router को सुचारु रूप से रोकता है। SIGTERM भेजता है, 15 s प्रतीक्षा करता है और यदि प्रोसेस अब भी सक्रिय हो, +तो SIGKILL भेजता है। पहले से रुका हुआ होने पर यह आइडेम्पोटेंट है। **अनुरोध बॉडी:** कोई नहीं **प्रतिक्रियाएँ:** -| स्थिति | विवरण | -| ------ | ----------------------------------- | -| `200` | `ServiceStatus` (स्थिति: "stopped") | -| `503` | रोकना अप्रत्याशित रूप से विफल हुआ | +| स्थिति | विवरण | +| ------ | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | रोकना अप्रत्याशित रूप से विफल रहा | --- @@ -307,9 +305,9 @@ npm से 9Router इंस्टॉल करता है। अपने स #### `POST /api/services/9router/update` -9Router को नए npm वर्ज़न पर अपडेट करता है। यदि सेवा चल रही है, तो पहले उसे रोका -जाता है, npm install चलाया जाता है (नए वर्ज़न को उसी स्थान पर इंस्टॉल करते हुए) -और फिर सेवा को पुनः प्रारंभ किया जाता है। +9Router को नए npm वर्ज़न में अपडेट करता है। यदि सेवा चल रही है, तो पहले उसे रोका जाता है, +npm इंस्टॉल चलाया जाता है (नया वर्ज़न उसी स्थान पर इंस्टॉल किया जाता है) और फिर +सेवा को पुनः प्रारंभ किया जाता है। **अनुरोध बॉडी** (सभी वैकल्पिक): @@ -323,14 +321,14 @@ npm से 9Router इंस्टॉल करता है। अपने स | ------ | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | | `400` | अमान्य बॉडी | -| `500` | npm update विफल | +| `500` | npm अपडेट विफल रहा | --- #### `POST /api/services/9router/rotate-key` -9Router के लिए एक नई API कुंजी जनरेट करता है, उसे एन्क्रिप्टेड अवस्था में संग्रहीत करता है, और सेवा को -(यदि वह चल रही हो) पुनः प्रारंभ करता है, ताकि वह अपने एनवायरनमेंट से नई कुंजी प्राप्त कर सके। पुरानी कुंजी +9Router के लिए एक नई API कुंजी जनरेट करता है, उसे स्थिर अवस्था में एन्क्रिप्ट करता है और सेवा को +(यदि चल रही हो) पुनः प्रारंभ करता है, ताकि वह अपने एनवायरनमेंट से नई कुंजी प्राप्त कर सके। पुरानी कुंजी तुरंत अमान्य कर दी जाती है। **अनुरोध बॉडी:** कोई नहीं @@ -340,23 +338,23 @@ npm से 9Router इंस्टॉल करता है। अपने स | स्थिति | विवरण | | ------ | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | रोटेशन विफल हुआ | +| `500` | कुंजी रोटेशन विफल रहा | -**सुरक्षा:** नई कुंजी प्रतिक्रिया में कभी वापस नहीं की जाती (क्रेडेंशियल लीक नहीं होता)। -इसे `version_manager` तालिका में एन्क्रिप्टेड (AES-256-GCM) रूप में संग्रहीत किया जाता है। +**सुरक्षा:** नई कुंजी प्रतिक्रिया में कभी नहीं लौटाई जाती (क्रेडेंशियल लीक नहीं होता)। +इसे `version_manager` टेबल में एन्क्रिप्टेड रूप में (AES-256-GCM) संग्रहीत किया जाता है। --- #### `GET /api/services/9router/status` -संस्करण मेटाडेटा और API कुंजी पूर्वावलोकन सहित संयुक्त लाइव + DB स्थिति लौटाता है। +वर्ज़न मेटाडेटा और API कुंजी पूर्वावलोकन सहित संयुक्त लाइव + DB स्थिति लौटाता है। **प्रतिक्रियाएँ:** -| स्थिति | विवरण | -| ------ | ---------------------- | -| `200` | नीचे दिया स्कीमा देखें | -| `500` | स्थिति पढ़ना विफल हुआ | +| स्थिति | विवरण | +| ------ | -------------------------- | +| `200` | नीचे दिया गया स्कीमा देखें | +| `500` | स्थिति पढ़ना विफल रहा | **प्रतिक्रिया स्कीमा:** @@ -382,8 +380,8 @@ npm से 9Router इंस्टॉल करता है। अपने स #### `POST /api/services/9router/auto-start` -ऑटो-स्टार्ट फ़्लैग को टॉगल करता है। जब `enabled: true` हो, तो अगली बार OmniRoute के बूट होने पर -सेवा अपने आप प्रारंभ हो जाती है (यदि सेवा इंस्टॉल की गई हो)। +ऑटो-स्टार्ट फ़्लैग को टॉगल करता है। जब `enabled: true` हो, तो अगली बार OmniRoute बूट होने पर +सेवा स्वचालित रूप से प्रारंभ हो जाती है (यदि सेवा इंस्टॉल है)। **अनुरोध बॉडी:** @@ -406,17 +404,17 @@ npm से 9Router इंस्टॉल करता है। अपने स **क्वेरी पैरामीटर:** -| पैरामीटर | प्रकार | डिफ़ॉल्ट | विवरण | -| -------- | --------- | -------- | -------------------------------------------------------------- | -| `tail` | `integer` | 200 | पहले भेजी जाने वाली ऐतिहासिक पंक्तियों की संख्या (अधिकतम 1000) | -| `filter` | `string` | कोई नहीं | केस-असंवेदी सबस्ट्रिंग फ़िल्टर (regex नहीं — ReDoS-सुरक्षित) | +| पैरामीटर | प्रकार | डिफ़ॉल्ट | विवरण | +| -------- | --------- | -------- | ----------------------------------------------------------------- | +| `tail` | `integer` | 200 | शुरुआत में भेजी जाने वाली ऐतिहासिक लाइनों की संख्या (अधिकतम 1000) | +| `filter` | `string` | कोई नहीं | केस-असंवेदी सबस्ट्रिंग फ़िल्टर (कोई regex नहीं — ReDoS-सुरक्षित) | **SSE इवेंट:** | इवेंट | डेटा | विवरण | | ----------- | ----------- | --------------------------- | | `snapshot` | `LogLine[]` | प्रारंभिक ऐतिहासिक टेल | -| `log` | `LogLine` | लाइव लॉग पंक्ति | +| `log` | `LogLine` | लाइव लॉग लाइन | | `heartbeat` | `{}` | प्रत्येक 15 s में कीप-अलाइव | **LogLine स्कीमा:** @@ -441,82 +439,118 @@ npm से 9Router इंस्टॉल करता है। अपने स ### 4.2 CLIProxyAPI एंडपॉइंट (10 रूट) -CLIProxyAPI के एंडपॉइंट का स्वरूप 9Router जैसा ही है, लेकिन इसमें `rotate-key` नहीं है और -`accounts`, `provider-expose` तथा `auto-restart-adopted` शामिल हैं। अब इसे प्रारंभ किए जाते समय -एक समर्पित डेटा-प्लेन API कुंजी इंजेक्ट की जाती है (`bootstrap.ts` में `needsApiKey: true`, -जिसका उपयोग मॉडल सिंक के लिए किया जाता है); `status` में कम फ़ील्ड शामिल होते हैं। +CLIProxyAPI में 9Router जैसी ही एंडपॉइंट संरचना है, सिवाय `rotate-key` के, और इसमें +`accounts`, `provider-expose` तथा `auto-restart-adopted` भी शामिल हैं। अब इसे +आरंभ करते समय एक समर्पित डेटा-प्लेन API कुंजी इंजेक्ट की जाती है (`bootstrap.ts` में +`needsApiKey: true`, जिसका उपयोग मॉडल सिंक के लिए होता है); `status` में कम फ़ील्ड शामिल हैं। | विधि | पथ | विवरण | | ------ | ----------------------------------- | -------------------------------------- | | `POST` | `/api/services/cliproxy/install` | npm से CLIProxyAPI इंस्टॉल करें | -| `POST` | `/api/services/cliproxy/start` | CLIProxyAPI प्रारंभ करें | +| `POST` | `/api/services/cliproxy/start` | CLIProxyAPI शुरू करें | | `POST` | `/api/services/cliproxy/stop` | CLIProxyAPI रोकें | -| `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI पुनः प्रारंभ करें | +| `POST` | `/api/services/cliproxy/restart` | CLIProxyAPI पुनः शुरू करें | | `POST` | `/api/services/cliproxy/update` | नए संस्करण में अपडेट करें | | `GET` | `/api/services/cliproxy/status` | लाइव + DB स्थिति (`apiKeyMasked` नहीं) | -| `POST` | `/api/services/cliproxy/auto-start` | ऑटो-स्टार्ट टॉगल करें | +| `POST` | `/api/services/cliproxy/auto-start` | स्वतः-प्रारंभ टॉगल करें | -साझा `GET /api/services/{name}/logs` एंडपॉइंट (§4.1 देखें), `[name]` डायनेमिक सेगमेंट का उपयोग करके -सभी चार सेवाओं के लिए काम करता है। +साझा `GET /api/services/{name}/logs` एंडपॉइंट (§4.1 देखें), `[name]` डायनेमिक +सेगमेंट का उपयोग करके सभी चार सेवाओं के लिए काम करता है। --- ### 4.3 Mux एंडपॉइंट (8 रूट) -Mux के एंडपॉइंट का स्वरूप CLIProxyAPI जैसा ही है — API सतह में कोई `rotate-key` रूट नहीं है -(बेयरर टोकन को `getOrCreateApiKey("mux")` के माध्यम से 9Router की तरह ही जनरेट किया जाता है और -`MUX_SERVER_AUTH_TOKEN` एनवायरनमेंट वेरिएबल के माध्यम से इंजेक्ट किया जाता है, लेकिन अभी तक -कोई समर्पित रोटेशन एंडपॉइंट नहीं है)। Mux को केवल लाइफ़साइकल के स्तर पर प्रबंधित किया जाता है: -9Router के विपरीत, इसमें कोई Layer 4 एक्ज़ीक्यूटर नहीं है और इसे कभी भी रूटिंग प्रोवाइडर के रूप में -पंजीकृत नहीं किया जाता। +Mux में CLIProxyAPI जैसी ही एंडपॉइंट संरचना है — API सतह में कोई `rotate-key` रूट +नहीं है (बेयरर टोकन को 9Router की तरह ही `getOrCreateApiKey("mux")` के माध्यम से +जनरेट किया जाता है और `MUX_SERVER_AUTH_TOKEN` env var के माध्यम से इंजेक्ट किया जाता है, +लेकिन अभी तक कोई समर्पित रोटेशन एंडपॉइंट नहीं है)। Mux का केवल जीवनचक्र प्रबंधित किया +जाता है: 9Router के विपरीत, इसमें कोई लेयर 4 एक्ज़ीक्यूटर नहीं है और इसे कभी भी रूटिंग +प्रोवाइडर के रूप में पंजीकृत नहीं किया जाता। | विधि | पथ | विवरण | | ------ | ------------------------------ | ------------------------------------- | | `POST` | `/api/services/mux/install` | npm से Mux इंस्टॉल करें (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Mux प्रारंभ करें (`mux server`) | +| `POST` | `/api/services/mux/start` | Mux शुरू करें (`mux server`) | | `POST` | `/api/services/mux/stop` | Mux रोकें | -| `POST` | `/api/services/mux/restart` | Mux पुनः प्रारंभ करें | +| `POST` | `/api/services/mux/restart` | Mux पुनः शुरू करें | | `POST` | `/api/services/mux/update` | नए npm संस्करण में अपडेट करें | | `GET` | `/api/services/mux/status` | लाइव + DB स्थिति | -| `POST` | `/api/services/mux/auto-start` | ऑटो-स्टार्ट टॉगल करें | +| `POST` | `/api/services/mux/auto-start` | स्वतः-प्रारंभ टॉगल करें | --- ### 4.4 Bifrost एंडपॉइंट (8 रूट) -Bifrost एक Go AI-गेटवे रिले बैकएंड (`@maximhq/bifrost`) है। यह CLIProxyAPI के समान -एंडपॉइंट स्वरूप का उपयोग करता है (`rotate-key` नहीं — Bifrost अपनी प्रोवाइडर कुंजियों को -अपने `-app-dir` के अंतर्गत `config.json` में प्रबंधित करता है)। - -| विधि | पथ | विवरण | -| ------ | ---------------------------------- | ---------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | npm (`@maximhq/bifrost`) से Bifrost इंस्टॉल करें | -| `POST` | `/api/services/bifrost/start` | पोर्ट 8080 (डिफ़ॉल्ट) पर Bifrost शुरू करें | -| `POST` | `/api/services/bifrost/stop` | Bifrost रोकें | -| `POST` | `/api/services/bifrost/restart` | Bifrost पुनः शुरू करें | -| `POST` | `/api/services/bifrost/update` | नए संस्करण में अपडेट करें | -| `GET` | `/api/services/bifrost/status` | लाइव + DB स्थिति | -| `POST` | `/api/services/bifrost/auto-start` | स्वतः-प्रारंभ टॉगल करें | -| `GET` | `/api/services/bifrost/logs` | SSE लॉग टेल (साझा `[name]/logs` डायनेमिक रूट के माध्यम से) | +Bifrost एक Go AI-गेटवे रिले बैकएंड (`@maximhq/bifrost`) है। यह CLIProxyAPI जैसी ही +एंडपॉइंट संरचना का उपयोग करता है (`rotate-key` नहीं — Bifrost अपनी प्रोवाइडर कुंजियों +को अपने `-app-dir` के अंतर्गत `config.json` में प्रबंधित करता है)। + +| विधि | पथ | विवरण | +| ------ | ---------------------------------- | ----------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | npm से Bifrost इंस्टॉल करें (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | पोर्ट 8080 (डिफ़ॉल्ट) पर Bifrost शुरू करें | +| `POST` | `/api/services/bifrost/stop` | Bifrost रोकें | +| `POST` | `/api/services/bifrost/restart` | Bifrost पुनः शुरू करें | +| `POST` | `/api/services/bifrost/update` | नए संस्करण में अपडेट करें | +| `GET` | `/api/services/bifrost/status` | लाइव + DB स्थिति | +| `POST` | `/api/services/bifrost/auto-start` | स्वतः-प्रारंभ टॉगल करें | +| `GET` | `/api/services/bifrost/logs` | SSE लॉग टेल (साझा `[name]/logs` डायनेमिक रूट के जरिए) | **रूटिंग वायरिंग:** जब `BIFROST_BASE_URL` सेट नहीं होता और पर्यवेक्षित Bifrost -इंस्टेंस चल रहा होता है, तब `getBifrostRoutingConfig()` (`routingBackend.ts` में) स्वचालित रूप से -`http://127.0.0.1:{port}` को रिले बेस URL के रूप में उपयोग करता है। स्पष्ट रूप से सेट किया गया `BIFROST_BASE_URL` env -हमेशा प्राथमिकता लेता है। +इंस्टेंस चल रहा होता है, तो `getBifrostRoutingConfig()` (`routingBackend.ts` में) +स्वचालित रूप से `http://127.0.0.1:{port}` को रिले बेस URL के रूप में उपयोग करता है। +स्पष्ट रूप से सेट किया गया `BIFROST_BASE_URL` env हमेशा प्राथमिकता लेता है। --- ### 4.5 Dario एंडपॉइंट (12 रूट) -अन्य सेवाओं जैसा ही लाइफ़साइकल स्वरूप (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), साथ ही `admin/` के अंतर्गत एक टोकन-गेटेड OAuth -कंट्रोल प्लेन: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (सभी `DARIO_ADMIN_TOKEN` द्वारा सुरक्षित)। +अन्य सेवाओं जैसी ही जीवनचक्र संरचना (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`), साथ ही `admin/` के अंतर्गत +एक टोकन-गेटेड OAuth कंट्रोल प्लेन: `admin/accounts`, `admin/import-from-omniroute`, +`admin/login-start`, `admin/login-complete` (सभी `DARIO_ADMIN_TOKEN` द्वारा संरक्षित)। -### 4.6 रिवर्स प्रॉक्सी (9Router डैशबोर्ड एम्बेड) +### 4.6 open-wa एंडपॉइंट (7 रूट) -डैशबोर्ड निम्न आंतरिक रिवर्स -प्रॉक्सी के माध्यम से 9Router वेब UI को iframe के अंदर एम्बेड करता है: +open-wa (`@open-wa/wa-automate`), WhatsApp Web को स्वचालित करने के लिए (Puppeteer +के माध्यम से) एक हेडलेस Chromium इंस्टेंस संचालित करता है। यह Mux जैसी ही एंडपॉइंट +संरचना का उपयोग करता है (अभी तक कोई `rotate-key` रूट नहीं)। इसका केवल जीवनचक्र +प्रबंधित किया जाता है — यह रूटिंग लक्ष्य नहीं है और इसमें कोई लेयर 4 एक्ज़ीक्यूटर/प्रोवाइडर +प्रविष्टि नहीं है। + +| विधि | पथ | विवरण | +| ------ | --------------------------------- | ---------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | npm से open-wa (`@open-wa/wa-automate`) इंस्टॉल करें | +| `POST` | `/api/services/openwa/start` | पोर्ट 8323 (डिफ़ॉल्ट) पर open-wa शुरू करें | +| `POST` | `/api/services/openwa/stop` | open-wa बंद करें | +| `POST` | `/api/services/openwa/restart` | open-wa पुनः शुरू करें | +| `POST` | `/api/services/openwa/update` | नए संस्करण में अपडेट करें | +| `GET` | `/api/services/openwa/status` | लाइव + DB स्थिति | +| `POST` | `/api/services/openwa/auto-start` | स्वतः-प्रारंभ टॉगल करें | +| `GET` | `/api/services/openwa/logs` | SSE लॉग टेल (साझा `[name]/logs` डायनेमिक रूट के माध्यम से) | + +**API कुंजी:** `WA_KEY` के रूप में इंजेक्ट की जाती है — open-wa का सामान्य `WA_*`-प्रीफ़िक्स वाला env +ओवरराइड इसे `--key`/`-k` CLI विकल्प पर मैप करता है +(`dist/cli/setup.js::envArgs()`, इंस्टॉल किए गए 4.76.0 +पैकेज के विरुद्ध सत्यापित)। `generateServiceApiKey()` द्वारा जनरेट किए जाने पर `ow_` +प्रीफ़िक्स लगाया जाता है। open-wa कुंजी को `key`/`api_key` HTTP हेडर से वापस पढ़ता है (`Authorization: +Bearer` से नहीं); `/api-docs*` को स्पष्ट रूप से जाँच से छूट दी गई है +(`dist/cli/server.js` में `setupAuthenticationLayer`), इसलिए हेल्थ प्रोब को +किसी प्रमाणीकरण हेडर की आवश्यकता नहीं होती। + +**पेयरिंग:** open-wa अनौपचारिक है और WhatsApp से संबद्ध नहीं है — कनेक्ट किए गए +नंबर पर WhatsApp की अपनी ऑटोमेशन पहचान प्रणाली के कारण प्रतिबंध लगने का जोखिम रहता है। +पहली बार शुरू होने पर, पेयरिंग QR कोड stdout पर प्रिंट होता है और मौजूदा +लॉग पैनल/SSE स्ट्रीम के माध्यम से प्रदर्शित किया जाता है — इस एकीकरण में अभी तक +कोई समर्पित QR-इमेज एंडपॉइंट नहीं है। + +--- + +### 4.7 रिवर्स प्रॉक्सी (9Router डैशबोर्ड एम्बेड) + +डैशबोर्ड एक आंतरिक रिवर्स +प्रॉक्सी के माध्यम से iframe के अंदर 9Router वेब UI एम्बेड करता है: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -524,18 +558,18 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] यह प्रॉक्सी: -- अनुरोध को `http://127.0.0.1:{port}/{path}` पर अग्रेषित करता है (केवल लूपबैक) -- आने वाले `cookie` और `authorization` हेडर हटा देता है (OmniRoute सत्र का कोई रिसाव नहीं) +- अनुरोध को `http://127.0.0.1:{port}/{path}` पर फ़ॉरवर्ड करता है (केवल लूपबैक) +- इनकमिंग `cookie` और `authorization` हेडर हटाता है (OmniRoute सत्र का कोई रिसाव नहीं) - 9Router प्रमाणीकरण के लिए `Authorization: Bearer {apiKey}` इंजेक्ट करता है -- प्रतिक्रिया से `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` हटा देता है -- `` इंजेक्ट करने और निरपेक्ष पथों को सामान्य बनाने के लिए HTML प्रतिक्रियाओं को पुनर्लिखता है (`/foo` → `/dashboard/.../embed/foo`) +- प्रतिक्रिया से `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` हटाता है +- `` इंजेक्ट करने और निरपेक्ष पथों को सामान्यीकृत करने के लिए HTML प्रतिक्रियाओं को फिर से लिखता है (`/foo` → `/dashboard/.../embed/foo`) -एम्बेड किए गए डैशबोर्ड के लिए WebSocket अपग्रेड को एक समर्पित पोर्ट पर -सहायक सर्वर द्वारा संभाला जाता है (`src/lib/services/embedWsProxy.ts` देखें)। +एम्बेड किए गए डैशबोर्ड के WebSocket अपग्रेड को एक समर्पित पोर्ट पर मौजूद सहायक सर्वर द्वारा संभाला जाता है +(`src/lib/services/embedWsProxy.ts` देखें)। -**सुरक्षा:** एम्बेड प्रॉक्सी रूट को `LOCAL_ONLY_API_PREFIXES` के अंतर्गत वर्गीकृत किया गया है -और उन तक केवल लूपबैक से पहुँचा जा सकता है। Cloudflare/Ngrok टनल के माध्यम से JWT प्राप्त करने वाला -हमलावर एम्बेड की गई सेवाओं में प्रॉक्सी नहीं कर सकता। +**सुरक्षा:** एम्बेड प्रॉक्सी रूट्स को `LOCAL_ONLY_API_PREFIXES` +के अंतर्गत वर्गीकृत किया गया है और उन तक केवल लूपबैक से पहुँचा जा सकता है। Cloudflare/Ngrok +टनल के माध्यम से JWT प्राप्त करने वाला हमलावर एम्बेड की गई सेवाओं में प्रॉक्सी नहीं कर सकता। --- diff --git a/docs/i18n/hi/docs/frameworks/MEMORY.md b/docs/i18n/hi/docs/frameworks/MEMORY.md index 0b5f5ec6db22..42cf0bcf7021 100644 --- a/docs/i18n/hi/docs/frameworks/MEMORY.md +++ b/docs/i18n/hi/docs/frameworks/MEMORY.md @@ -157,32 +157,34 @@ RRF को विषम पुनर्प्राप्ति प्रणा ## सेटिंग्स एक्सटेंशन `MemorySettingsExtended` में नौ एम्बेडिंग और वेक्टर फ़ील्ड उपलब्ध हैं, जो -`src/shared/schemas/memory.ts` में परिभाषित हैं और `src/lib/db/settings.ts` के माध्यम से स्थायी रूप से सहेजे जाते हैं: - -| फ़ील्ड | प्रकार | डिफ़ॉल्ट | विवरण | -| ------------------------ | -------------------------------------------------- | -------- | ------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | उपयोग किया जाने वाला एम्बेडिंग स्रोत | -| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` प्रारूप में प्रोवाइडर/मॉडल | -| `customBaseUrl` | `string \| null` | `null` | केवल मेमोरी के लिए OpenAI-संगत एंडपॉइंट बेस URL | -| `customModelId` | `string \| null` | `null` | कस्टम एंडपॉइंट को भेजी जाने वाली मॉडल ID | -| `transformersEnabled` | `boolean` | `false` | Transformers.js (MiniLM, ~400MB) के लिए ऑप्ट-इन | -| `staticEnabled` | `boolean` | `false` | स्थिर potion-base-8M स्थानीय मॉडल के लिए ऑप्ट-इन | -| `rerankEnabled` | `boolean` | `false` | री-रैंकिंग चरण सक्षम करें (प्रति अनुरोध +200-500ms जोड़ता है) | -| `rerankProviderModel` | `string \| null` | `null` | `provider/model` प्रारूप में री-रैंक प्रोवाइडर/मॉडल | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | उपयोग किया जाने वाला वेक्टर बैकएंड | +`src/shared/schemas/memory.ts` में परिभाषित हैं और `src/lib/db/settings.ts` के माध्यम से स्थायी रूप से संग्रहीत किए जाते हैं: + +| फ़ील्ड | प्रकार | डिफ़ॉल्ट | विवरण | +| ------------------------ | -------------------------------------------------- | -------- | ------------------------------------------------------ | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | उपयोग किया जाने वाला एम्बेडिंग स्रोत | +| `embeddingProviderModel` | `string \| null` | `null` | `provider/model` प्रारूप में प्रदाता/मॉडल | +| `customBaseUrl` | `string \| null` | `null` | केवल Memory के लिए OpenAI-संगत एंडपॉइंट बेस URL | +| `customModelId` | `string \| null` | `null` | कस्टम एंडपॉइंट को भेजी जाने वाली मॉडल ID | +| `transformersEnabled` | `boolean` | `false` | Transformers.js के लिए ऑप्ट-इन (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | स्थिर potion-base-8M स्थानीय मॉडल के लिए ऑप्ट-इन | +| `rerankEnabled` | `boolean` | `false` | पुनः-रैंकिंग चरण सक्षम करें (+200-500ms/req जोड़ता है) | +| `rerankProviderModel` | `string \| null` | `null` | `provider/model` प्रारूप में पुनः-रैंक प्रदाता/मॉडल | + +`rerankProviderModel` का समाधान `POST /v1/rerank` द्वारा किया जाता है (जिसे लूपबैक पर कॉल किया जाता है), इसलिए यह उस रूट द्वारा स्वीकार की जाने वाली किसी भी चीज़ को स्वीकार करता है: कोई चयनित क्लाउड पुनः-रैंक मॉडल (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) या `/` के रूप में कोई OpenAI-संगत प्रदाता नोड (उदाहरण के लिए, TEI/Infinity बॉक्स हेतु `skilled-mini/bge-reranker-v2-m3`)। लूपबैक नोड हमेशा पात्र होते हैं; किसी अन्य होस्ट (LAN, Tailscale) पर स्थित नोड के लिए अतिरिक्त रूप से `RERANK_REMOTE_PROVIDER_NODES` फ़ीचर फ़्लैग आवश्यक है और उसे प्रदाता की आउटबाउंड URL नीति में सफल होना चाहिए—[फ़ीचर फ़्लैग](../reference/FEATURE_FLAGS.md) देखें। डैशबोर्ड चयनकर्ता में चयनित प्रदाताओं के साथ स्थानीय नोड सूचीबद्ध होते हैं; किसी भी मान्य `provider/model` स्ट्रिंग को `PUT /api/settings/memory` के माध्यम से सीधे सेट किया जा सकता है। +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | उपयोग किया जाने वाला वेक्टर बैकएंड | इन्हें `GET /PUT /api/settings/memory` (स्कीमा `MemorySettingsExtendedSchema`) के माध्यम से उपलब्ध कराया जाता है। `remote` स्रोत के लिए, Memory वैकल्पिक `customBaseUrl` और -`customModelId` सेटिंग्स भी स्वीकार करता है। ये दोनों मिलकर वैश्विक एम्बेडिंग रजिस्ट्री को बदले बिना OpenAI-संगत `/embeddings` +`customModelId` सेटिंग्स को भी स्वीकार करता है। ये दोनों मिलकर वैश्विक एम्बेडिंग रजिस्ट्री को बदले बिना किसी OpenAI-संगत `/embeddings` एंडपॉइंट और मॉडल का चयन करते हैं। उपयोग से पहले एंडपॉइंट को -सामान्यीकृत किया जाता है और प्रोवाइडर की आउटबाउंड URL नीति द्वारा जाँचा जाता है: HTTP(S) -आवश्यक है, एम्बेड किए गए क्रेडेंशियल और क्वेरी स्ट्रिंग अस्वीकार किए जाते हैं, और क्लाउड-मेटाडेटा -पते अवरुद्ध रहते हैं। रिक्त मान चयनित रजिस्ट्री प्रोवाइडर को बनाए रखते हैं। डैशबोर्ड को -लौटाई गई त्रुटियों को सैनिटाइज़ किया जाता है और एंडपॉइंट क्रेडेंशियल कभी लॉग नहीं किए जाते। +सामान्यीकृत किया जाता है और प्रदाता की आउटबाउंड URL नीति द्वारा जाँचा जाता है: HTTP(S) +आवश्यक है, एम्बेड किए गए क्रेडेंशियल और क्वेरी स्ट्रिंग अस्वीकार कर दिए जाते हैं, और क्लाउड-मेटाडेटा +पते अवरुद्ध रहते हैं। रिक्त मान चयनित रजिस्ट्री प्रदाता को बनाए रखते हैं। डैशबोर्ड को +लौटाई गई त्रुटियों को सुरक्षित बनाया जाता है और एंडपॉइंट क्रेडेंशियल कभी लॉग नहीं किए जाते। -> **TODO (D20):** `global` स्कोप (सभी API कुंजियों में मेमोरी साझा करना) इस रिलीज़ में -> लागू नहीं किया गया है। इसके लिए स्कीमा परिवर्तन और एक वैश्विक पुनर्प्राप्ति +> **TODO (D20):** `global` स्कोप (सभी API कुंजियों के बीच मेमोरी साझा करना) इस +> रिलीज़ में लागू नहीं किया गया है। इसके लिए स्कीमा में बदलाव और वैश्विक पुनर्प्राप्ति > पथ आवश्यक है। इसे अलग से ट्रैक करें। ## स्टोरेज परतें diff --git a/docs/i18n/hi/docs/guides/DOCKER_GUIDE.md b/docs/i18n/hi/docs/guides/DOCKER_GUIDE.md index 5a1171d6354c..2bf9b7f09681 100644 --- a/docs/i18n/hi/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/hi/docs/guides/DOCKER_GUIDE.md @@ -25,7 +25,13 @@ --- -## शीघ्र संचालन +## त्वरित संचालन + +> **एक ही कमांड से स्वयं होस्ट करना चाहते हैं?** देखें +> [स्वयं-होस्ट मार्गदर्शिका](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (प्रकाशित इमेज + +> Redis, केवल लूपबैक, कोई प्रोफ़ाइल चयन नहीं)। नीचे दिया गया त्वरित संचालन उन +> उपयोगकर्ताओं के लिए एकल-कंटेनर तरीका है, जो Redis को पहले से कहीं और चला रहे हैं। ```bash docker run -d \ diff --git a/docs/i18n/hi/docs/guides/TROUBLESHOOTING.md b/docs/i18n/hi/docs/guides/TROUBLESHOOTING.md index ce9e50e8d53e..7be363f2ab59 100644 --- a/docs/i18n/hi/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/hi/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # तत्काल पुनः ## npm install चेतावनियाँ (ERESOLVE / peer / deprecated) -जब आप `npm install -g omniroute` चलाते हैं, तो आपको `npm warn ERESOLVE`, peer-dependency सूचनाओं और `deprecated` संदेशों जैसी चेतावनियों की भरमार दिखाई दे सकती है। **ये अपेक्षित और हानिरहित हैं।** यदि आउटपुट में `added packages` दिखाई देता है, तो आपका इंस्टॉलेशन सफल हुआ है। +जब आप `npm install -g omniroute` चलाते हैं, तो आपको `npm warn ERESOLVE`, peer-dependency सूचनाओं और `deprecated` संदेशों जैसी चेतावनियों की भरमार दिखाई दे सकती है। **ये अपेक्षित और हानिरहित हैं।** यदि आउटपुट में `added packages` दिखाई देता है, तो आपका इंस्टॉलेशन सफल रहा है। -ये चेतावनियाँ उन तृतीय-पक्ष पैकेजों की पुरानी peer-dependency श्रेणियों के कारण आती हैं, जिन्हें OmniRoute नियंत्रित नहीं करता: +peer-dependency समाधान चेतावनियों को छिपाने के लिए, OmniRoute के समर्थित इंस्टॉलेशन प्रारूप का उपयोग करें: -1. **`marked-terminal` को `marked >=1 <16` चाहिए, लेकिन `marked@18` मिला** — व्यवहार में यह ठीक काम करता है; upstream peer श्रेणी बस पुरानी है। -2. **`deprecated prebuild-install@7.1.3`** — यह एक परोक्ष native-binary डाउनलोड सहायक है। इसका उपयोग - पिन किए गए `wreq-js` transport binding को इंस्टॉल करने के लिए नहीं किया जाता और यह इस बात का संकेत नहीं है कि web-cookie - provider transport सेटअप विफल हो गया है। +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` केवल `ERESOLVE` और peer-dependency सूचनाओं को छिपाता है। अप्रचलन सूचनाएँ दिखाई देती रहती हैं, क्योंकि वे ट्रांज़िटिव तृतीय-पक्ष पैकेजों से आती हैं; वे यह संकेत नहीं देतीं कि इंस्टॉलेशन विफल हुआ है। + +ये चेतावनियाँ उन तृतीय-पक्ष पैकेजों में पुराने peer-dependency रेंज के कारण आती हैं, जिन्हें OmniRoute नियंत्रित नहीं करता: + +1. **`marked-terminal` को `marked >=1 <16` चाहिए, लेकिन `marked@18` मिला** — व्यवहार में यह ठीक काम करता है; अपस्ट्रीम peer रेंज केवल पुरानी है। +2. **`deprecated prebuild-install@7.1.3`** — एक ट्रांज़िटिव नेटिव-बाइनरी फ़ेच सहायक। इसका उपयोग + पिन किए गए `wreq-js` ट्रांसपोर्ट बाइंडिंग को इंस्टॉल करने के लिए नहीं किया जाता और यह इस बात का संकेत नहीं देता कि web-cookie + प्रोवाइडर ट्रांसपोर्ट सेटअप विफल हुआ है। -**किसी कार्रवाई की आवश्यकता नहीं है** — upstream पैकेजों को fork किए बिना इन चेतावनियों को पूरी तरह बंद नहीं किया जा सकता। +**किसी कार्रवाई की आवश्यकता नहीं है** — अपस्ट्रीम पैकेजों को फ़ोर्क किए बिना चेतावनियों को पूरी तरह छिपाया नहीं जा सकता। --- diff --git a/docs/i18n/hi/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/hi/docs/providers/CURSOR-API-KEY-AND-CLI.md index 0ff772c04402..89f8d6409862 100644 --- a/docs/i18n/hi/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/hi/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -8,24 +8,24 @@ IDE सत्र के बिना Cursor को OmniRoute के पीछे 1. **`cursor-api` प्रदाता** (कार्ड "Cursor API", उपनाम `cua`): एक API-कुंजी प्रदाता, जो Cursor उपयोगकर्ता API कुंजी (`crsr_…`, जिसे - `https://cursor.com/dashboard/api` पर बनाया जाता है) रखता है। इसके बाद कोई भी OmniRoute क्लाइंट + `https://cursor.com/dashboard/api` पर जनरेट किया जाता है) रखता है। इसके बाद कोई भी OmniRoute क्लाइंट सामान्य कोटा, फ़ॉलबैक और लॉगिंग परतों के साथ `/v1/chat/completions` के माध्यम से - `cursor-api/` या `cua/` के रूप में Cursor मॉडल तक पहुँचता है। IDE + Cursor मॉडल तक `cursor-api/` या `cua/` के रूप में पहुँचता है। IDE प्रदाता (`cursor`, OAuth/IDE सत्र) अपरिवर्तित रहता है। 2. **Cursor CLI पासथ्रू**: Cursor CLI (`agent`) को OmniRoute की ओर इंगित करें, ताकि CLI द्वारा की जाने वाली प्रत्येक RPC को OmniRoute API कुंजी से प्रमाणित किया जाए, - `cursor-api` कनेक्शन के क्रेडेंशियल के साथ Cursor को अग्रेषित किया जाए, और - Logs पृष्ठ में दर्ज किया जाए। + `cursor-api` कनेक्शन के क्रेडेंशियल का उपयोग करके Cursor को फ़ॉरवर्ड किया जाए, और + Logs पृष्ठ में रिकॉर्ड किया जाए। -## कुंजी का आदान-प्रदान क्यों किया जाता है +## कुंजी का विनिमय क्यों किया जाता है `api2.cursor.sh` किसी अपरिष्कृत `crsr_…` कुंजी को Bearer टोकन के रूप में अस्वीकार करता है (401)। Cursor CLI पहले कुंजी को `/auth/exchange_user_api_key` पर POST करता है और एक सत्र -JWT प्राप्त करता है, जिसकी समय-सीमा एक घंटे बाद समाप्त होती है; लौटाए गए `refreshToken` में वही -`exp` होता है, इसलिए रीफ़्रेश करने का अर्थ कुंजी का फिर से आदान-प्रदान करना है। -`open-sse/services/cursorApiKeyAuth.ts` यह आदान-प्रदान करता है, प्रत्येक कुंजी के लिए एक सत्र -टोकन कैश करता है, समय-सीमा समाप्त होने से पाँच मिनट पहले फिर से आदान-प्रदान करता है और Cursor से 401 -उत्तर मिलने पर कैश किया हुआ टोकन हटा देता है। `CursorExecutor`, `cursor-api` +JWT प्राप्त करता है, जिसकी समय-सीमा एक घंटे बाद समाप्त हो जाती है; लौटाए गए `refreshToken` में वही +`exp` होता है, इसलिए रीफ़्रेश करने का अर्थ कुंजी का पुनः विनिमय करना है। +`open-sse/services/cursorApiKeyAuth.ts` यह विनिमय करता है, प्रत्येक कुंजी के लिए एक सत्र +टोकन कैश करता है, समय-सीमा समाप्त होने से पाँच मिनट पहले पुनः विनिमय करता है और Cursor से 401 +उत्तर मिलने पर कैश किया गया टोकन हटा देता है। `CursorExecutor`, `cursor-api` कनेक्शन के लिए अपस्ट्रीम स्ट्रीम खोलने से ठीक पहले इसे कॉल करता है। ## `cursor-api` प्रदाता @@ -56,43 +56,56 @@ curl -sS http://localhost:20128/v1/chat/completions \ -d '{"model":"cursor-api/auto","messages":[{"role":"user","content":"say PONG"}]}' ``` -टिप्पणियाँ: +नोट्स: - `cursor-api` के लिए मॉडल सूची स्थिर Cursor रजिस्ट्री से आती है (वही - सूची जिसे IDE प्रदाता फ़ॉलबैक के रूप में उपयोग करता है); OmniRoute होस्ट पर - `cursor-agent` इंस्टॉल करने की आवश्यकता नहीं है। -- `POST /api/providers/{id}/refresh-cursor` केवल `cursor` IDE प्रदाता के लिए है; - `cursor-api` कनेक्शन में नवीनीकृत करने के लिए कोई IDE सत्र नहीं होता। + सूची जिस पर IDE प्रदाता फ़ॉलबैक करता है); OmniRoute होस्ट पर `cursor-agent` + इंस्टॉल करने की आवश्यकता नहीं है। +- `POST /api/providers/{id}/refresh-cursor` केवल `cursor` IDE प्रदाता के + लिए है; `cursor-api` कनेक्शन में नवीनीकृत करने के लिए कोई IDE सत्र नहीं होता। + +## नेटिव मॉडल ID और प्रयास + +`cursor` / `cu` और `cursor-api` / `cua` के लिए, साझा Claude-प्रयास नॉर्मलाइज़र +अनुरोधित मॉडल ID को यथावत छोड़ देता है। Cursor किसी वास्तविक मॉडल ID के भाग के रूप में +`-low` जैसा प्रत्यय प्रदर्शित कर सकता है, न कि OmniRoute प्रयास उपनाम के रूप में। +Cursor एक्ज़ीक्यूटर सटीक लाइव-कैटलॉग मिलान को बनाए रखता है; जब कोई +मिलान नहीं होता, तो उसका मौजूदा मॉडल रिज़ॉल्वर प्रत्यय-से-पैरामीटर फ़ॉलबैक संभालता है। + +इससे प्रत्यक्ष Claude, Claude-संगत, +या Vertex रूटों के लिए प्रयास नॉर्मलाइज़ेशन नहीं बदलता। उपलब्धता अब भी चुने गए Cursor खाते के +कैटलॉग और अधिकार पर निर्भर करती है। ## Cursor CLI पासथ्रू रूट: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`। उपसर्ग `/api/cursor-cli/` को +`open-sse/handlers/cursorCliProxy.ts`। प्रीफ़िक्स `/api/cursor-cli/` को `src/shared/constants/publicApiRoutes.ts` में पंजीकृत किया गया है, क्योंकि हैंडलर -अपना प्रमाणीकरण स्वयं लागू करता है: +स्वयं अपना प्रमाणीकरण लागू करता है: -| पथ | CLI से अपेक्षित प्रमाणीकरण | OmniRoute क्या करता है | -| ---------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | कुंजी को सत्यापित करता है, 1 घंटे का HS256 JWT (`JWT_SECRET` से हस्ताक्षरित) बनाता है और उसे लौटाता है | -| हर अन्य पथ (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | जारीकर्ता/ऑडियंस/समाप्ति को सत्यापित करता है, एक सक्रिय `cursor-api` कनेक्शन चुनता है, Authorization हेडर को आदान-प्रदान किए गए Cursor टोकन से बदलता है और उत्तर वापस स्ट्रीम करता है | +| पाथ | CLI से अपेक्षित प्रमाणीकरण | OmniRoute क्या करता है | +| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | कुंजी को सत्यापित करता है, 1 घंटे का HS256 JWT (`JWT_SECRET` से हस्ताक्षरित) जारी करता है और उसे लौटाता है | +| अन्य सभी पाथ (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | जारीकर्ता/ऑडियंस/समाप्ति को सत्यापित करता है, एक सक्रिय `cursor-api` कनेक्शन चुनता है, Authorization हेडर को एक्सचेंज किए गए Cursor टोकन से बदलता है और प्रत्युत्तर को वापस स्ट्रीम करता है | -CLI प्राप्त होने वाले किसी भी टोकन से `exp` को डिकोड करता है, इसलिए उसे एक अपारदर्शी -टोकन देने पर वह लगभग हर अनुरोध से पहले फिर से आदान-प्रदान करता है; बनाया गया JWT -इससे बचाता है। OmniRoute से 401 मिलने पर CLI फिर से आदान-प्रदान करता है। +CLI प्राप्त होने वाले किसी भी टोकन से `exp` को डीकोड करता है, इसलिए उसे कोई अपारदर्शी +टोकन देने पर वह लगभग हर अनुरोध से पहले फिर से एक्सचेंज करता है; जारी किया गया JWT इससे +बचाता है। OmniRoute से मिलने वाला 401 CLI को फिर से एक्सचेंज करने के लिए प्रेरित करता है। ### सेटअप 1. एक OmniRoute API कुंजी (Dashboard → API keys) और एक `cursor-api` कनेक्शन बनाएँ। -2. CLI को एजेंट स्ट्रीम के लिए HTTP/1.1 उपयोग करने को कहें। +2. CLI को एजेंट स्ट्रीम के लिए HTTP/1.1 उपयोग करने के लिए कहें। `~/.cursor/cli-config.json` में: ```json { "network": { "useHttp1ForAgent": true } } ``` - इसके बिना CLI, HTTP/2 के माध्यम से एक अलग से कॉन्फ़िगर किए गए एजेंट होस्ट पर एजेंट टर्न खोलता है - और केवल कंट्रोल-प्लेन RPC ही एंडपॉइंट से होकर जाती हैं। + इसके बिना CLI एजेंट टर्न को HTTP/2 के माध्यम से अलग से + कॉन्फ़िगर किए गए एजेंट होस्ट पर खोलता है और केवल कंट्रोल-प्लेन RPCs ही + एंडपॉइंट से होकर जाते हैं। 3. CLI को OmniRoute के विरुद्ध चलाएँ: @@ -103,18 +116,18 @@ CLI प्राप्त होने वाले किसी भी टो ``` प्रत्येक हॉप Logs में प्रदाता `cursor-api`, अनुरोध प्रकार `cursor-cli`, -पथ `/api/cursor-cli/` के रूप में दर्ज होता है और उसे OmniRoute API कुंजी तथा +पाथ `/api/cursor-cli/` के रूप में दर्ज होता है और उसे OmniRoute API कुंजी तथा उसे सेवा देने वाले कनेक्शन से संबद्ध किया जाता है। ### विफलता के प्रकार -| स्थिति | CLI को प्रतिक्रिया | -| ------------------------------------------------ | -------------------------------------------------- | -| अज्ञात OmniRoute कुंजी और `REQUIRE_API_KEY=true` | एक्सचेंज पर 401 `unauthenticated` | -| `REQUIRE_API_KEY=false` | अनाम सत्र (`/v1/*` के व्यवहार के अनुरूप) | -| समाप्त / बाहरी / छेड़छाड़ किया गया सत्र JWT | 401, CLI पुनः एक्सचेंज करता है | -| एक्सचेंज के बाद OmniRoute API कुंजी निरस्त | अगले RPC पर 401 | -| कोई सक्रिय `cursor-api` कनेक्शन नहीं | 503 `unavailable` | -| Cursor कनेक्शन की कुंजी अस्वीकार करता है | 401 `unauthenticated`, कैश किया गया सत्र हटाया गया | -| अपस्ट्रीम पहुँच योग्य नहीं | 502 `unavailable` (शुद्ध किया गया संदेश) | -| `JWT_SECRET` सेट नहीं है | एक्सचेंज पर 503 | +| स्थिति | CLI को प्रत्युत्तर | +| ------------------------------------------------ | --------------------------------------------------------- | +| अज्ञात OmniRoute कुंजी और `REQUIRE_API_KEY=true` | एक्सचेंज पर 401 `unauthenticated` | +| `REQUIRE_API_KEY=false` | अनाम सत्र (`/v1/*` के व्यवहार के समान) | +| समाप्त / बाहरी / छेड़छाड़ किया गया सत्र JWT | 401, CLI फिर से एक्सचेंज करता है | +| एक्सचेंज के बाद OmniRoute API कुंजी निरस्त | अगले RPC पर 401 | +| कोई सक्रिय `cursor-api` कनेक्शन नहीं | 503 `unavailable` | +| Cursor कनेक्शन की कुंजी को अस्वीकार करता है | 401 `unauthenticated`, कैश किया गया सत्र हटा दिया जाता है | +| अपस्ट्रीम तक नहीं पहुँचा जा सकता | 502 `unavailable` (सैनिटाइज़ किया गया संदेश) | +| `JWT_SECRET` सेट नहीं है | एक्सचेंज पर 503 | diff --git a/docs/i18n/hi/docs/reference/API_REFERENCE.md b/docs/i18n/hi/docs/reference/API_REFERENCE.md index e65c10ce6ac5..c8c0fa0ead3a 100644 --- a/docs/i18n/hi/docs/reference/API_REFERENCE.md +++ b/docs/i18n/hi/docs/reference/API_REFERENCE.md @@ -456,7 +456,7 @@ Bifrost, CLIProxyAPI और भविष्य के साइडकार र | POST | `/v1/music/generations` | OpenAI-शैली संगीत जनरेशन | | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | | POST | `/v1/audio/speech` | OpenAI TTS (ऑडियो बॉडी लौटाता है) | -| POST | `/v1/rerank` | Cohere/Voyage-शैली री-रैंक | +| POST | `/v1/rerank` | Cohere/Voyage-शैली रीरैंक | | POST | `/v1/classify` | Jina वर्गीकरण (`api.jina.ai`) | | POST | `/v1/segment` | Jina सेगमेंटर (`segment.jina.ai`) | | POST | `/v1/moderations` | OpenAI Moderations | @@ -472,12 +472,12 @@ Bifrost, CLIProxyAPI और भविष्य के साइडकार र | POST | `/api/v1/vscode/{token}/api/chat` | Ollama टोकनयुक्त उपनाम | | GET | `/api/v1/vscode/{token}/api/tags` | Ollama टैग टोकनयुक्त उपनाम | -सभी POST रूट एक ही संरचना का पालन करते हैं: `Bearer your-api-key` + Zod-सत्यापित JSON बॉडी (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, आदि; `src/shared/validation/schemas.ts` देखें)। स्कीमा विफलता पर 4xx लौटाया जाता है। +सभी POST रूट समान संरचना का पालन करते हैं: `Bearer your-api-key` + Zod-सत्यापित JSON बॉडी (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, आदि, `src/shared/validation/schemas.ts` देखें)। स्कीमा विफल होने पर 4xx लौटाया जाता है। -जो क्लाइंट `Authorization: Bearer ...` संलग्न नहीं कर सकते, उनके लिए OmniRoute क्वेरी-स्ट्रिंग संगतता (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) या नीचे दस्तावेज़ीकृत समर्पित `/api/v1/vscode/{token}/...` एंडपॉइंट के माध्यम से URL में API कुंजियाँ भी स्वीकार करता है। +जो क्लाइंट `Authorization: Bearer ...` संलग्न नहीं कर सकते, उनके लिए OmniRoute क्वेरी-स्ट्रिंग संगतता (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) या नीचे प्रलेखित समर्पित `/api/v1/vscode/{token}/...` एंडपॉइंट के माध्यम से URL में API कुंजियाँ भी स्वीकार करता है। ```bash -# री-रैंक +# रीरैंक (क्लाउड रजिस्ट्री प्रदाता, या "/" के रूप में OpenAI-संगत प्रदाता नोड) POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # Jina वर्गीकरण (Foundation API क्रेडेंशियल) @@ -495,14 +495,36 @@ POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } # TTS — audio/mpeg (या अनुरोधित प्रारूप) बॉडी लौटाता है POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } -# छवि संपादन (multipart) +# छवि संपादन (मल्टीपार्ट) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# वीडियो / संगीत जनरेशन (प्रदाता-प्रीफ़िक्स युक्त मॉडल ID) +# वीडियो / संगीत जनरेशन (प्रदाता-उपसर्गयुक्त मॉडल आईडी) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **रीरैंक प्रदाता नोड:** `POST /v1/rerank` OpenAI-संगत प्रदाता नोड पर भी रूट करता है +> (oMLX, vLLM, Infinity, गेटवे के पीछे TEI, …), जिन्हें `/` के रूप में संबोधित किया जाता है। लूपबैक +> नोड (`localhost`, `127.0.0.1`, `172.16.0.0/12`) हमेशा पात्र होते हैं। किसी अन्य +> होस्ट पर मौजूद नोड — LAN बॉक्स या Tailscale पीयर — केवल तभी पात्र होते हैं, जब ऑपरेटर +> `RERANK_REMOTE_PROVIDER_NODES` फ़ीचर फ़्लैग सक्षम करता है **और** नोड का बेस URL प्रदाता +> आउटबाउंड URL नीति (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) को पास करता है; +> क्लाउड-मेटाडेटा होस्ट पर कभी रूट नहीं किया जाता। मेमोरी इंजन का रीरैंक चरण इस रूट को +> लूपबैक पर कॉल करता है, इसलिए यही नियम Memory सेटिंग में `rerankProviderModel` को नियंत्रित करता है। +> +> **स्थानीय सर्वर संरचनाएँ:** नोड को `/v1/rerank` पर और 404 मिलने पर `/rerank` +> (Infinity, TEI) पर कॉल किया जाता है। अपस्ट्रीम बॉडी Cohere/OpenAI वर्तनी (`documents`, +> `return_documents`) और TEI वर्तनी (`texts`, `return_text`) दोनों को वहन करती है, और अपस्ट्रीम प्रतिक्रिया को +> Cohere एनवलप में सामान्यीकृत किया जाता है: TEI का साधारण `[{index, score, text}]`, पतले गेटवे से +> `{results: [{index, score}]}`, और Voyage-शैली `{data: [...]}`—सभी क्लाइंट को +> `{results: [{index, relevance_score, document?}]}` के रूप में वापस मिलते हैं, स्कोर के अनुसार क्रमबद्ध और `top_n` तक सीमित। + +> **प्रदाता-नोड खोज:** OpenAI-संगत प्रदाता नोड के मॉडल `GET /v1/models` में +> नोड उपसर्ग के अंतर्गत दिखाई देते हैं। जिन पंक्तियों में एंडपॉइंट मेटाडेटा नहीं होता (स्थानीय `/v1/models` सूचियों में सामान्य), +> वे नोड का `apiType` इनहेरिट करती हैं, इसलिए `embeddings` नोड के मॉडल `type: "embedding"` और +> `rerank` नोड के मॉडल चैट को डिफ़ॉल्ट करने के बजाय `type: "rerank"` होते हैं; सिंक की गई या मैन्युअल रूप से जोड़ी गई पंक्ति पर स्पष्ट +> `supportedEndpoints` को फिर भी प्राथमिकता मिलती है। + ### समर्पित प्रदाता रूट ```bash @@ -511,7 +533,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -यदि प्रदाता प्रीफ़िक्स मौजूद नहीं है, तो उसे स्वचालित रूप से जोड़ दिया जाता है। मेल न खाने वाले मॉडल `400` लौटाते हैं। +यदि प्रोवाइडर प्रीफ़िक्स मौजूद नहीं है, तो वह स्वतः जोड़ दिया जाता है। असंगत मॉडल `400` लौटाते हैं। --- diff --git a/docs/i18n/hi/docs/reference/ENVIRONMENT.md b/docs/i18n/hi/docs/reference/ENVIRONMENT.md index 818f9e5c6bfd..5e5ca218140e 100644 --- a/docs/i18n/hi/docs/reference/ENVIRONMENT.md +++ b/docs/i18n/hi/docs/reference/ENVIRONMENT.md @@ -79,72 +79,65 @@ echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ## 2. स्टोरेज और डेटाबेस -OmniRoute सभी स्थायी डेटा के लिए **SQLite** (`better-sqlite3` के माध्यम से) का उपयोग करता है। ये वेरिएबल डेटा का स्थान, एन्क्रिप्शन और जीवनचक्र नियंत्रित करते हैं। - -| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite DB, बैकअप और डेटा फ़ाइलों की रूट डायरेक्टरी। Docker वॉल्यूम या कस्टम पाथ के लिए इसे ओवरराइड करें। | -| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(सेट नहीं)_ | `src/lib/dataPaths.ts` | परीक्षण/eval के DATA_DIR गार्ड (#10428) के लिए एस्केप हैच। बिना `DATA_DIR` वाले परीक्षणों और Node eval/print प्रोब (`-e`/`--eval`/`-p`/`--print`, जिनमें `--eval=`/`--print=` रूप भी शामिल हैं) को एक अस्थायी, बाद में हटाई जाने वाली डायरेक्टरी पर रीडायरेक्ट किया जाता है, ताकि वे ऑपरेटर का वास्तविक डेटाबेस न खोल सकें; वास्तविक डायरेक्टरी का दोबारा उपयोग करने के लिए इसे `1` पर सेट करें। | -| `OMNIROUTE_BUILD_SHA` | _(सेट नहीं)_ | `src/lib/monitoring/buildSha.ts` | चल रहे आर्टिफ़ैक्ट का Git SHA। इसे `npm run build:release` द्वारा अंकित किया जाता है; इसे उन कंटेनरों में इंजेक्ट किया जा सकता है जो `dist/BUILD_SHA` सेंटिनल के बिना भेजे जाते हैं। यह `/api/monitoring/health` पर `system.buildSha` के रूप में प्रदर्शित होता है। | -| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | वह रेफ़ जिसके विरुद्ध पैक-आर्टिफ़ैक्ट प्रोवेनेंस गेट बिल्ड SHA की जाँच करता है (#10427)। | -| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(सेट नहीं)_ | `scripts/build/buildProvenance.ts` | ऐसे बिल्ड की पैकिंग की अनुमति देने के लिए इसे `1` पर सेट करें जिसका SHA रिलीज़ लाइन पर नहीं है; इससे गेट को विफल करने के बजाय उसे जानबूझकर बनाए गए कैनरी के रूप में दर्ज किया जाता है (#10427)। | -| `OMNIROUTE_SMOKE_API_KEY` | _(सेट नहीं)_ | `scripts/ops/deploy-canary.mjs` | कैनरी-डिप्लॉय स्मोक प्रोब की API कुंजी, जिसे `/v1/chat/completions` पर `Authorization: Bearer` के रूप में भेजा जाता है। इसका उपयोग केवल डिप्लॉय स्क्रिप्ट (#10429) द्वारा किया जाता है, सर्वर द्वारा कभी नहीं। यह ऑप्ट-इन CLI स्मोक हार्नेस के `OMNIROUTE_SMOKE_*` वेरिएबल (`RUN_CLI_SMOKE=1`, `tests/integration/upstream-cli-smoke.int.test.ts` में `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`) से संबंधित नहीं है — [CLI एकीकरण → वास्तविक स्मोक स्वीप](../guides/CLI-INTEGRATIONS.md) देखें। | -| `OMNIROUTE_BUILDING` | _(सेट नहीं)_ | `src/lib/buildPhase.ts` | बिल्ड-चरण संकेत (#10060): इसे `scripts/build/build-next-isolated.mjs` द्वारा `1` पर सेट किया जाता है और हर शुरू किए गए बिल्ड वर्कर को यह विरासत में मिलता है, ताकि DB लेयर नेटिव better-sqlite3 ऐड-ऑन को लोड करने के बजाय एक नो-ऑप स्टब लौटाए (यह ऐड-ऑन बाहर निकलते समय वर्कर को बंद कर देता है)। चल रहे सर्वर के लिए इसे कभी सेट न करें। | -| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | असामान्य वेंडर्ड ट्री के लिए वैकल्पिक नेटिव-डिपेंडेंसी प्रीबिल्ड जाँच को छोड़ने हेतु इसे `1` पर सेट करें। इससे अनुपलब्ध डिपेंडेंसी बिल्ड करने योग्य नहीं बनती; इसका उपयोग केवल तभी करें जब नेटिव डिपेंडेंसियाँ अलग माध्यम से उपलब्ध कराई गई हों। | -| `OMNIROUTE_DATA_DIR` | _(सेट नहीं)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR` का **फ़ॉलबैक उपनाम**, जिसकी जाँच केवल तभी की जाती है जब `DATA_DIR` सेट न हो। इसका उपयोग PromptQL एक्ज़ीक्यूटर के ऑन-डिस्क थ्रेड-स्टिकी सेशन कैश (`/promptql-thread-sessions.json`) का पता लगाने के लिए किया जाता है; यदि कोई भी वेरिएबल सेट न हो, तो कैश केवल मेमोरी में रहता है (रीस्टार्ट के बाद कायम नहीं रहता)। | -| `OMNIROUTE_PLUGINS_DIR` | _(सेट नहीं)_ | `src/lib/plugins/scanner.ts` | वह डायरेक्टरी जिसे **रनटाइम प्लगइन स्कैनर** पढ़ता है — और वह रूट जिसमें प्लगइन मैनेजर इंस्टॉल करता है — जो होम से प्राप्त डिफ़ॉल्ट को ओवरराइड करती है (#11827)। केवल स्कैन पाथ को स्थानांतरित करने के लिए HOME बदलने के बजाय, इसे Docker/K8s में बाइंड-माउंट किए गए प्लगइन ट्री की ओर इंगित करें (HOME अन्य सभी होम-सापेक्ष व्यवहारों को भी नियंत्रित करता है)। सेट न होने पर = `~/.omniroute/plugins`, या जब प्रोसेस कोई होम एक्सपोर्ट नहीं करता है तब `/tmp/.omniroute/plugins` — यह वेरिएबल इसी मौन गैर-खोज समस्या को दूर करता है। समाधान की गई डायरेक्टरी को स्टार्टअप के समय एक बार, प्रभावी हुए इनपुट के साथ, `scanner.dir_resolved` के रूप में लॉग किया जाता है। केवल सर्वर-साइड: CLI कमांड प्लगइन अपना अलग `OMNIROUTE_PLUGIN_PATH` रखते हैं (अनुभाग 9)। | -| `STORAGE_ENCRYPTION_KEY` | _(रिक्त = अक्षम)_ | `src/lib/db/encryption.ts` | स्थिर अवस्था में संपूर्ण SQLite डेटाबेस एन्क्रिप्शन के लिए AES कुंजी। इसे `openssl rand -hex 32` से जनरेट करें। | -| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | एन्क्रिप्शन कुंजी का संस्करण लेबल। पुरानी बैकअप प्रतियों के डिक्रिप्शन का समर्थन करने के लिए कुंजी रोटेशन करते समय इसे बढ़ाएँ। | -| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` होने पर, नियमित/लेखन-पूर्व SQLite फ़ाइल बैकअप (models.dev मूल्य निर्धारण सहेजना/हटाना, सेटिंग्स लिखना) छोड़ दिए जाते हैं। मैन्युअल और पुनर्स्थापना-पूर्व बैकअप फिर भी चलते हैं। यह माइग्रेशन रनर के अनिवार्य टिकाऊ सुरक्षा स्नैपशॉट या किसी मौजूदा स्थायी DB के लिए सामूहिक-माइग्रेशन सुरक्षा को **अक्षम नहीं** करता। गैर-मैन्युअल बैकअप को अधिकतम प्रत्येक 60 मिनट में एक बार तक सीमित किया जाता है। डैशबोर्ड की **सेटिंग्स → स्टोरेज** नियमित स्वचालित बैकअप को स्वतंत्र रूप से अक्षम कर सकती है। | -| `OMNIROUTE_CRYPT_KEY` | _(सेट नहीं)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` के लिए **लेगेसी उपनाम**। प्राथमिक वेरिएबल अनुपस्थित होने पर फ़ॉलबैक के रूप में स्वीकार किया जाता है। | -| `OMNIROUTE_API_KEY_BASE64` | _(सेट नहीं)_ | `src/lib/db/encryption.ts` | **लेगेसी उपनाम** (Base64-एन्कोडेड रूप), जिसे फ़ॉलबैक के रूप में स्वीकार किया जाता है। उपयोग से पहले स्वचालित रूप से डिकोड किया जाता है। | -| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(सेट नहीं)_ | `src/lib/db/core.ts` | आवधिक SQLite स्वास्थ्य-जाँच अंतराल (ms) को ओवरराइड करें। सेट न होने पर, डिफ़ॉल्ट मान `NODE_ENV` से प्राप्त किए जाते हैं। | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/walMaintenance.ts` | आवधिक `wal_checkpoint(TRUNCATE)` अंतराल (ms) को ओवरराइड करें। स्वचालित चेकपॉइंट स्वयं WAL फ़ाइल को कभी छोटा नहीं करता, और लंबे समय तक चलने वाला सर्वर कभी अपना DB बंद नहीं करता। `0` इसे अक्षम करता है। | -| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | बार-बार होने वाले `wal_checkpoint(PASSIVE)` का अंतराल (ms) ओवरराइड करें। लंबित WAL फ़्रेमों को छोटा रखता है, ताकि आवधिक TRUNCATE मुख्य थ्रेड पर कई-GB का बैकलॉग कभी कॉपी न करे। `0` इसे अक्षम करता है। | -| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | जब किसी PASSIVE टिक को WAL फ़ाइल इस आकार से बड़ी मिलती है, तो धीमे टिक की प्रतीक्षा करने के बजाय तुरंत `wal_checkpoint(TRUNCATE)` चलाएँ। | -| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | गंभीर संसाधन दबाव `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` तक बने रहने के बाद प्रक्रिया से बाहर निकलने के लिए इसे `1`/`true`/`yes`/`on` पर सेट करें, ताकि अनिश्चित काल तक 503 प्रतिक्रियाएँ देने के बजाय कोई पर्यवेक्षक (systemd `Restart=always`, Docker पुनरारंभ नीति) एक स्वच्छ प्रक्रिया को फिर से शुरू कर सके। | -| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | स्व-पुनरारंभ हेतु निकास सक्रिय होने से पहले गंभीर दबाव कितनी देर तक बना रहना चाहिए। | -| `OMNIROUTE_SQLJS_WASM_PATH` | _(स्वतः-पहचान)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM फ़ॉलबैक एडाप्टर का उपयोग करते समय `sql-wasm.wasm` का स्पष्ट पथ (निरपेक्ष या cwd के सापेक्ष)। सेट न होने पर पैकेज निर्भरताओं और संभावित लेआउट के माध्यम से स्वतः पहचाना जाता है। | -| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | `21600000` (6h) | `src/lib/db/core.ts` | आवधिक `wal_checkpoint(TRUNCATE)` अंतराल (ms) को ओवरराइड करें। स्वचालित चेकपॉइंट स्वयं WAL फ़ाइल को कभी छोटा नहीं करता, और लंबे समय तक चलने वाला सर्वर कभी अपना DB बंद नहीं करता। `0` इसे अक्षम करता है। | -| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | किसी अंतिम-स्थिति वाले (पूर्ण/विफल/रद्द/समय-सीमा समाप्त) Batch API कार्य के चेकपॉइंट, संदर्भित इनपुट/आउटपुट/त्रुटि फ़ाइलें और पंक्ति को स्वचालित सफ़ाई प्रक्रिया द्वारा हटाने से पहले जितने दिनों तक रखा जाता है। यह केवल तभी प्रभावी होता है, जब `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` चालू हो; यह OpenAI की अपनी Batch API आउटपुट अवधारण अवधि से मेल खाता है। यह ऑपरेटर द्वारा सक्रिय किए जाने वाले `DELETE /api/v1/batches/delete-completed` रूट को प्रभावित नहीं करता, जो डिज़ाइन के अनुसार बिना किसी आयु फ़िल्टर के चलता है। | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` होने पर, स्वचालित क्लीनअप स्वीप को `OMNIROUTE_BATCH_RETENTION_DAYS` से पुराने अंतिम स्थिति वाले Batch API जॉब (और उनके चेकपॉइंट) हटाने तथा अपनी `expires_at` अवधि पार कर चुकी अपलोड की गई फ़ाइलों की BLOB सामग्री साफ़ करने दें। डिफ़ॉल्ट रूप से बंद: ऑपरेटर द्वारा इसे सक्षम किए जाने तक प्रत्येक मौजूदा इंस्टॉलेशन इस डेटा को बिल्कुल पहले की तरह रखता है। यह डैशबोर्ड से संपादन योग्य फ़ीचर फ़्लैग भी है — `docs/reference/FEATURE_FLAGS.md` → रनटाइम देखें। | -| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | स्टार्टअप पर DB हेल्थचेक को पूरी तरह छोड़ने के लिए इसे `1` पर सेट करें। अल्पकालिक कार्यों और इंटीग्रेशन परीक्षणों के लिए उपयोगी। | -| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | DB हेल्थचेक लूप को अनिवार्य रूप से चालू करने के लिए इसे `1` पर सेट करें, तब भी जब इसे सामान्यतः छोड़ दिया जाता (जैसे, अल्पकालिक कार्यों में)। | -| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` के दौरान नेटिव रनटाइम वार्म-अप छोड़ने के लिए इसे `1` पर सेट करें। उन CI/हेडलेस इंस्टॉलेशन में उपयोगी जहाँ sqlite पहले से बिल्ड है। | -| `OMNIROUTE_MIGRATIONS_DIR` | _(स्वतः पता लगाएँ)_ | `src/lib/db/migrationRunner.ts` | माइग्रेशन रनर द्वारा स्कैन की जाने वाली डायरेक्टरी को ओवरराइड करें। कस्टम बिल्ड में बंडल किए गए माइग्रेशन वितरित करते समय उपयोगी। | -| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(सेट नहीं)_ | `src/lib/db/migrationRunner/extraDirs.ts` | प्लेटफ़ॉर्म पाथ डिलिमिटर से अलग की गई `namespace=dir` प्रविष्टियों के रूप में अतिरिक्त माइग्रेशन डायरेक्टरियाँ (जैसे `ee=/opt/app/enterprise/db/migrations`)। वहाँ मिली फ़ाइलें `-` के रूप में दर्ज की जाती हैं, ताकि अपने माइग्रेशन वितरित करने वाला डिस्ट्रिब्यूशन कभी भी अपस्ट्रीम न्यूमेरिक स्लॉट से न टकराए। किसी विकृत प्रविष्टि, अमान्य नेमस्पेस या अनुपलब्ध डायरेक्टरी के कारण स्कीमा को चुपचाप छोड़ने के बजाय स्टार्टअप पर त्रुटि उत्पन्न होती है। | -| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | बड़ी संख्या में लंबित माइग्रेशन के लिए सुरक्षा सीमा (#3416)। यदि किसी मौजूदा DB पर इससे अधिक माइग्रेशन लंबित हों, तो स्टार्टअप रुक जाता है (यह मिटाई गई ट्रैकिंग टेबल से सुरक्षा देता है)। किसी पुराने बैकअप को पुनर्स्थापित करने के लिए इसे बढ़ाएँ; जाँच अक्षम करने के लिए इसे `0` पर सेट करें। | -| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` रिलीज़ गेट के लिए कार्यशील डायरेक्टरी। इसे लगभग 12 GB की आवश्यकता होती है (दो ~3 GB इंस्टॉल ट्री और टारबॉल), इसलिए इसे छोटे tmpfs पर नहीं चलाना चाहिए — स्वयं होस्ट किए गए रनर पर `/tmp` एक 12 GB RAM-समर्थित tmpfs है और गेट ने इसे पूरा भर दिया था, जिससे पैकेज अधूरा रह गया। | -| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(कोड में डिफ़ॉल्ट)_ | `src/lib/spend/batchWriter.ts` | बैच किए गए व्यय/लागत राइटर के लिए फ़्लश अंतराल (ms)। कम मान राइट को एकत्र करने की मात्रा घटाते हैं; अधिक मान DB प्रतिस्पर्धा घटाते हैं। | -| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(कोड में डिफ़ॉल्ट)_ | `src/lib/spend/batchWriter.ts` | अनिवार्य फ़्लश से पहले बफ़र की गई व्यय प्रविष्टियों की अधिकतम संख्या। उच्च-QPS डिप्लॉयमेंट पर इसे बढ़ाएँ; जब सीमित मेमोरी अधिक महत्वपूर्ण हो, तब इसे घटाएँ। | -| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(सेट नहीं)_ | `open-sse/utils/proxyFetch.ts` | Vercel रिले पाथ पर `[ProxyFetch]` डीबग लॉग उत्सर्जित करने के लिए इसे `"true"` पर सेट करें। रूटिंग संकेत लीक होने से बचाने के लिए डिफ़ॉल्ट रूप से बंद। | -| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | विस्तृत `[ProxyEgress]` प्रोसेस-लॉग पंक्ति में क्लाइंट/इग्रेस IP और अकाउंट प्रीफ़िक्स शामिल करने के लिए इसे `"true"` या `"1"` पर सेट करें। इसे डिफ़ॉल्ट रूप से बंद रखा गया है, ताकि प्रोसेस लॉग IP या अकाउंट प्रीफ़िक्स लीक न करे। | -| `OMNIROUTE_DEBUG` | _(सेट नहीं)_ | `bin/cli/commands/quota.mjs` | CLI कोटा कमांड से stderr पर प्रति-अनुरोध टाइमिंग डायग्नोस्टिक्स (`[omniroute] GET completed in Nms`) प्रिंट करने के लिए इसे `1` पर सेट करें। | -| `OMNIROUTE_HEALTHCHECK_PATH` | _(स्वचालित)_ | `scripts/dev/healthcheck.mjs` | कंटेनर हेल्थ चेक द्वारा जाँचा जाने वाला स्पष्ट पाथ। सेट न होने पर, प्रोब इसे `OMNIROUTE_BASE_PATH` से निर्धारित करता है; इसे सेट करने पर डीप मॉनिटरिंग एंडपॉइंट फिर से चुना जाता है। | -| `OMNIROUTE_DEBUG_COMPLETION` | _(सेट नहीं)_ | `bin/cli/commands/completion.mjs` | CLI शेल-कम्प्लीशन कैश पाथ (रीड/रिफ़्रेश/राइट) से `[omniroute completion]` डायग्नोस्टिक्स उत्सर्जित करने के लिए इसे किसी भी गैर-रिक्त मान पर सेट करें। डिफ़ॉल्ट रूप से बंद — ये कैश बिना त्रुटि दिखाए विफल होते हैं, ताकि अनुपलब्ध/भ्रष्ट कैश कभी भी टैब-कम्प्लीशन को बाधित न करे। | -| `BATCH_RETRY_DURATION_MS` | `86400000` (24 घंटे) | `open-sse/services/batchProcessor.ts` | अलग-अलग बैच आइटम के लिए अधिकतम पुनः प्रयास अवधि (मि.से.)। इस अवधि से अधिक समय लेने वाले आइटम विफल चिह्नित किए जाते हैं। | -| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | बैच आइटम के पुनः प्रयासों पर एक्सपोनेंशियल बैकऑफ़ के लिए मूल विलंब (मि.से.)। | -| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 घंटा) | `open-sse/services/batchProcessor.ts` | बैच आइटम के पुनः प्रयासों के बीच एक्सपोनेंशियल बैकऑफ़ की अधिकतम सीमा (मि.से.)। | -| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | एक साथ संसाधित किए जाने वाले बैचों की अधिकतम संख्या। थ्रूपुट बढ़ाने के लिए इसे बढ़ाएँ; अत्यधिक दर-सीमा अनुरोधों से बचने के लिए इसे कम रखें। | +OmniRoute सभी परसिस्टेंस के लिए **SQLite** ( `better-sqlite3` के माध्यम से) का उपयोग करता है। ये वैरिएबल डेटा स्थान, एन्क्रिप्शन और जीवनचक्र को नियंत्रित करते हैं। + +| वैरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | +| -------------------------------------- | -------------------- | ----------------------------------------------------- | SQLite DB, बैकअप और डेटा फ़ाइलों के लिए रूट डायरेक्टरी। डॉकर वॉल्यूम या कस्टम पाथ के लिए ओवरराइड करें। | +| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | +| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(अनसेट)_ | `src/lib/dataPaths.ts` | टेस्ट/इवैल `DATA_DIR` गार्ड (#10428) के लिए एस्केप हैच। `DATA_DIR` के बिना टेस्ट और नोड इवैल/प्रिंट प्रोब (`-e`/`--eval`/`-p`/`--print`, जिसमें `--eval=`/`--print=` फॉर्म शामिल हैं) को एक थ्रोअवे टेम्प डायरेक्टरी में रीडायरेक्ट किया जाता है ताकि वे ऑपरेटर के वास्तविक डेटाबेस को न खोल सकें; वास्तविक डायरेक्टरी में वापस ऑप्ट-इन करने के लिए इसे `1` पर सेट करें। | +| `OMNIROUTE_BUILD_SHA` | _(अनसेट)_ | `src/lib/monitoring/buildSha.ts` | चल रहे आर्टिफैक्ट का Git SHA। `npm run build:release` द्वारा स्टैम्प किया गया; उन कंटेनरों में इंजेक्टेबल जो `dist/BUILD_SHA` सेंटिनल के बिना शिप होते हैं। `/api/monitoring/health` पर `system.buildSha` के रूप में सामने आता है। | +| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | रेफ जिसके विरुद्ध पैक-आर्टिफैक्ट प्रोवेनेंस गेट बिल्ड SHA की जाँच करता है (#10427)। | +| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(अनसेट)_ | `scripts/build/buildProvenance.ts` | `1` पर सेट करें ताकि एक ऐसे बिल्ड को पैक करने की अनुमति मिल सके जिसका SHA रिलीज़ लाइन पर नहीं है, इसे गेट को विफल करने के बजाय एक जानबूझकर कैनरी के रूप में रिकॉर्ड किया जा सके (#10427)। | +| `OMNIROUTE_SMOKE_API_KEY` | _(अनसेट)_ | `scripts/ops/deploy-canary.mjs` | कैनरी-डिप्लॉय स्मोक प्रोब के लिए API कुंजी, `/v1/chat/completions` पर `Authorization: Bearer` के रूप में भेजी गई। केवल डिप्लॉय स्क्रिप्ट (#10429) द्वारा उपयोग की जाती है, सर्वर द्वारा कभी नहीं। ऑप्ट-इन CLI स्मोक हार्नेस (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` in `tests/integration/upstream-cli-smoke.int.test.ts`) के `OMNIROUTE_SMOKE_*` वैरिएबल से संबंधित नहीं है — [CLI इंटीग्रेशन → रियल स्मोक स्वीप](../guides/CLI-INTEGRATIONS.md) देखें। | +| `OMNIROUTE_BUILDING` | _(अनसेट)_ | `src/lib/buildPhase.ts` | बिल्ड-फेज सिग्नल (#10060): `scripts/build/build-next-isolated.mjs` द्वारा `1` पर सेट किया गया और प्रत्येक स्पॉन किए गए बिल्ड वर्कर द्वारा इनहेरिट किया गया ताकि DB लेयर नेटिव बेहतर-sqlite3 एडऑन को लोड करने के बजाय एक नो-ऑप स्टब लौटाए (जो बाहर निकलने पर वर्कर को एबॉर्ट करता है)। चल रहे सर्वर के लिए कभी सेट नहीं किया गया। | +| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | विदेशी वेंडर्ड ट्री के लिए वैकल्पिक नेटिव-डिपेंडेंसी प्रीबिल्ड चेक को छोड़ने के लिए `1` पर सेट करें। यह एक गुम हुई डिपेंडेंसी को बिल्डेबल नहीं बनाता है; इसका उपयोग तभी करें जब नेटिव डिपेंडेंसी आउट ऑफ बैंड प्रदान की गई हों। | +| `OMNIROUTE_DATA_DIR` | _(अनसेट)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR` के लिए **फ़ॉलबैक उपनाम**, केवल तभी चेक किया जाता है जब `DATA_DIR` अनसेट हो। PromptQL एक्ज़ीक्यूटर के ऑन-डिस्क थ्रेड-स्टिकी सेशन कैश (`/promptql-thread-sessions.json`) का पता लगाने के लिए उपयोग किया जाता है; यदि कोई भी वैरिएबल सेट नहीं है, तो कैश केवल इन-मेमोरी में रहता है (पुनः आरंभ करने पर बना नहीं रहता)। | +| `OMNIROUTE_PLUGINS_DIR` | _(अनसेट)_ | `src/lib/plugins/scanner.ts` | डायरेक्टरी जिसे **रनटाइम प्लगइन स्कैनर** पढ़ता है — और वह रूट जिसमें प्लगइन मैनेजर इंस्टॉल करता है — होम-डेरिव्ड डिफ़ॉल्ट (#11827) को ओवरराइड करता है। स्कैन पाथ को स्थानांतरित करने के लिए केवल HOME को स्थानांतरित करने के बजाय डॉकर/K8s में बाइंड-माउंटेड प्लगइन ट्री पर इसे इंगित करें (HOME अन्य सभी होम-रिलेटिव व्यवहारों को भी नियंत्रित करता है)। अनसेट = `~/.omniroute/plugins`, या `/tmp/.omniroute/plugins` जब प्रक्रिया बिल्कुल भी होम एक्सपोर्ट नहीं करती है — यह वैरिएबल जिस साइलेंट नॉन-डिस्कवरी को हटाता है। हल की गई डायरेक्टरी को स्टार्टअप पर एक बार `scanner.dir_resolved` के रूप में इनपुट के साथ लॉग किया जाता है जिसने जीता। सर्वर-साइड केवल: CLI कमांड प्लगइन्स अपना `OMNIROUTE_PLUGIN_PATH` (अनुभाग 9) रखते हैं। | +| `STORAGE_ENCRYPTION_KEY` | _(खाली = अक्षम)_ | `src/lib/db/encryption.ts` | आराम की स्थिति में पूर्ण SQLite डेटाबेस एन्क्रिप्शन के लिए AES कुंजी। `openssl rand -hex 32` के साथ जनरेट करें। | +| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | एन्क्रिप्शन कुंजी के लिए संस्करण लेबल। पुराने बैकअप के डिक्रिप्शन का समर्थन करने के लिए कुंजी रोटेशन करते समय बढ़ाएँ। | +| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | जब `true` हो, तो नियमित/प्री-राइट SQLite फ़ाइल बैकअप (models.dev मूल्य निर्धारण सहेजें/साफ़ करें, सेटिंग्स राइट्स) को छोड़ देता है। मैनुअल और प्री-रिस्टोर बैकअप अभी भी चलते हैं। यह माइग्रेशन रनर के अनिवार्य टिकाऊ सुरक्षा स्नैपशॉट या मौजूदा स्थायी DB के लिए मास-माइग्रेशन गार्ड को **अक्षम नहीं** करता है। गैर-मैनुअल बैकअप को अधिकतम 60 मिनट में एक बार तक सीमित किया जाता है। डैशबोर्ड **सेटिंग्स → स्टोरेज** नियमित ऑटो-बैकअप को स्वतंत्र रूप से अक्षम कर सकता है। | +| `OMNIROUTE_CRYPT_KEY` | _(अनसेट)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY` के लिए **लेगेसी उपनाम**। प्राथमिक वेरिएबल अनुपस्थित होने पर फ़ॉलबैक के रूप में स्वीकार किया जाता है। | +| `OMNIROUTE_API_KEY_BASE64` | _(अनसेट)_ | `src/lib/db/encryption.ts` | **लेगेसी उपनाम** (Base64-एन्कोडेड फ़ॉर्म) फ़ॉलबैक के रूप में स्वीकार किया जाता है। उपयोग से पहले स्वचालित रूप से डिकोड किया जाता है। | +| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(अनसेट)_ | `src/lib/db/core.ts` | आवधिक SQLite हेल्थचेक अंतराल (ms) को ओवरराइड करें। जब अनसेट हो, तो डिफ़ॉल्ट `NODE_ENV` से प्राप्त होते हैं। | +| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(हटाया गया)_ | `src/lib/db/walMaintenance.ts` | **हटाया गया।** एक आवधिक लाइव `wal_checkpoint(TRUNCATE)` साझा wal-इंडेक्स मैपिंग को अमान्य कर सकता है और SIGBUS (#13973) के साथ प्रक्रिया को क्रैश कर सकता है, इसलिए शेड्यूलर अब मौजूद नहीं है। वेरिएबल निष्क्रिय है: एक सकारात्मक मान एक बार की अवमूल्यन चेतावनी लॉग करता है, जबकि `0` या अनसेट चुप रहता है। WAL को PASSIVE चेकपॉइंट्स (नीचे) द्वारा बनाए रखा जाता है और शटडाउन चेकपॉइंट द्वारा छोटा किया जाता है। | +| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5 मिनट) | `src/lib/db/walMaintenance.ts` | बार-बार `wal_checkpoint(PASSIVE)` अंतराल (ms) को ओवरराइड करें। लंबित WAL फ़्रेम को छोटा रखता है ताकि चेकपॉइंट तेज़ रहें और WAL फ़ाइल शटडाउन ट्रंकेशन के बीच बंधी रहे। `0` अक्षम करता है। | +| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | जब एक PASSIVE टिक WAL फ़ाइल को इस आकार से ऊपर पाता है, तो `wal_checkpoint(RESTART)` चलाएँ ताकि WAL मैप किए गए wal-इंडेक्स को फिर से लिखे बिना फिर से शुरू हो। लाइव ट्रंकेट-मोड चेकपॉइंट हटा दिए गए थे (देखें `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` पंक्ति)। | +| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | `1`/`true`/`yes`/`on` पर सेट करें ताकि `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` के लिए गंभीर संसाधन दबाव बने रहने के बाद प्रक्रिया से बाहर निकल जाए, जिससे एक पर्यवेक्षक (systemd `Restart=always`, Docker रीस्टार्ट नीति) 503s को अनिश्चित काल तक सेवा देने के बजाय एक स्वच्छ प्रक्रिया वापस ला सके। | +| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2 मिनट) | `open-sse/utils/resourcePressure.ts` | सेल्फ-रीस्टार्ट एग्जिट ट्रिगर होने से पहले गंभीर दबाव को कितने समय तक बना रहना चाहिए। | +| `OMNIROUTE_SQLJS_WASM_PATH` | _(स्वतः पता लगाना)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM फ़ॉलबैक एडाप्टर का उपयोग करते समय `sql-wasm.wasm` का स्पष्ट पथ (cwd के सापेक्ष या पूर्ण)। अनसेट होने पर पैकेज निर्भरताओं और उम्मीदवार लेआउट के माध्यम से स्वतः पता लगाया जाता है। | +| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | स्वचालित क्लीनअप स्वीप द्वारा हटाए जाने से पहले एक टर्मिनल (पूर्ण/विफल/रद्द/समाप्त) बैच API जॉब के चेकपॉइंट, संदर्भित इनपुट/आउटपुट/त्रुटि फ़ाइलें, और पंक्ति कितने दिनों तक रखी जाती हैं। यह तभी प्रभावी होता है जब `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` चालू हो; OpenAI के अपने बैच API आउटपुट प्रतिधारण विंडो से मेल खाता है। ऑपरेटर-ट्रिगर `DELETE /api/v1/batches/delete-completed` रूट को प्रभावित नहीं करता है, जो डिज़ाइन के अनुसार बिना शर्त (कोई आयु फ़िल्टर नहीं) रहता है। | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | जब `true` हो, तो स्वचालित क्लीनअप स्वीप को `OMNIROUTE_BATCH_RETENTION_DAYS` से अधिक पुराने टर्मिनल बैच API जॉब्स (और उनके चेकपॉइंट्स) को हटाने दें, और अपलोड की गई फ़ाइलों की BLOB सामग्री को उनके अपने `expires_at` से अधिक पुराने होने पर साफ़ करें। डिफ़ॉल्ट रूप से बंद: प्रत्येक मौजूदा इंस्टॉलेशन इस डेटा को पहले की तरह ही रखता है जब तक कि कोई ऑपरेटर ऑप्ट-इन न कर ले। यह एक डैशबोर्ड-संपादन योग्य फीचर फ़्लैग भी है — `docs/reference/FEATURE_FLAGS.md` → रनटाइम देखें। | +| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | स्टार्टअप पर DB हेल्थचेक को पूरी तरह से छोड़ने के लिए इसे `1` पर सेट करें। अल्पकालिक कार्यों और एकीकरण परीक्षणों के लिए उपयोगी। | +| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | DB हेल्थचेक लूप को चालू करने के लिए इसे `1` पर सेट करें, भले ही इसे सामान्य रूप से छोड़ा जा रहा हो (उदाहरण के लिए, अल्पकालिक कार्य)। | +| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` के दौरान नेटिव-रनटाइम वार्म-अप को छोड़ने के लिए इसे `1` पर सेट करें। CI/हेडलेस इंस्टॉलेशन में उपयोगी है जहाँ sqlite पहले से ही निर्मित है। | +| `OMNIROUTE_MIGRATIONS_DIR` | _(स्वचालित-पता)_ | `src/lib/db/migrationRunner.ts` | उस डायरेक्टरी को ओवरराइड करें जिसे माइग्रेशन रनर स्कैन करता है। कस्टम बिल्ड में बंडल किए गए माइग्रेशन को शिप करते समय उपयोगी। | +| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(अनसेट)_ | `src/lib/db/migrationRunner/extraDirs.ts` | अतिरिक्त माइग्रेशन डायरेक्टरीज़ `namespace=dir` प्रविष्टियों के रूप में प्लेटफ़ॉर्म पाथ डीलिमिटर (जैसे `ee=/opt/app/enterprise/db/migrations`) द्वारा अलग की जाती हैं। वहाँ पाई गई फ़ाइलें `-` के रूप में रिकॉर्ड की जाती हैं, ताकि अपने स्वयं के माइग्रेशन को शिप करने वाला वितरण अपस्ट्रीम न्यूमेरिक स्लॉट के साथ कभी टकराए नहीं। एक गलत प्रविष्टि, एक अमान्य नेमस्पेस या एक गुम डायरेक्टरी स्टार्टअप पर त्रुटि देती है बजाय इसके कि वह चुपचाप स्कीमा को छोड़ दे। | +| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | मास-पेंडिंग-माइग्रेशन सुरक्षा सीमा (#3416)। यदि किसी मौजूदा DB पर इससे अधिक माइग्रेशन लंबित हैं तो स्टार्टअप रद्द हो जाता है (एक मिटाए गए ट्रैकिंग टेबल के खिलाफ सुरक्षा)। पुराने बैकअप को पुनर्स्थापित करने के लिए इसे बढ़ाएँ; चेक को अक्षम करने के लिए इसे `0` पर सेट करें। | +| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` रिलीज़ गेट के लिए कार्यशील डायरेक्टरी। इसे लगभग 12 GB (दो ~3 GB इंस्टाल ट्री और टारबॉल) की आवश्यकता होती है, इसलिए इसे एक छोटे tmpfs पर नहीं चलना चाहिए — सेल्फ-होस्टेड रनर पर `/tmp` एक 12 GB RAM-समर्थित tmpfs है और गेट ने इसे समाप्त कर दिया, जिससे पैकेज छोटा हो गया। | +| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(कोड में डिफ़ॉल्ट)_ | `src/lib/spend/batchWriter.ts` | बैच किए गए खर्च/लागत लेखक के लिए फ्लश अंतराल (ms)। कम मान राइट कोलेसिंग को कम करते हैं; उच्च मान DB विवाद को कम करते हैं। | +| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(कोड में डिफ़ॉल्ट)_ | `src/lib/spend/batchWriter.ts` | जबरन फ्लश से पहले अधिकतम बफ़र की गई खर्च प्रविष्टियाँ। उच्च-QPS परिनियोजन पर बढ़ाएँ; जब सीमित मेमोरी अधिक मायने रखती है तो कम करें। | +| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(अनसेट)_ | `open-sse/utils/proxyFetch.ts` | Vercel रिले पाथ पर `[ProxyFetch]` डीबग लॉग उत्सर्जित करने के लिए इसे `"true"` पर सेट करें। रूटिंग संकेतों को लीक होने से बचाने के लिए डिफ़ॉल्ट रूप से बंद। | +| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | विस्तृत `[ProxyEgress]` प्रोसेस-लॉग लाइन में क्लाइंट/एग्रेस IP और अकाउंट प्रीफिक्स को शामिल करने के लिए इसे `"true"` या `"1"` पर सेट करें। डिफ़ॉल्ट रूप से बंद रखा जाता है ताकि प्रोसेस लॉग IP या अकाउंट प्रीफिक्स को लीक न करे। | +| `OMNIROUTE_DEBUG` | _(अनसेट)_ | `bin/cli/commands/quota.mjs` | CLI कोटा कमांड से stderr पर प्रति-अनुरोध समय निदान (`[omniroute] GET completed in Nms`) प्रिंट करने के लिए इसे `1` पर सेट करें। | +| `OMNIROUTE_HEALTHCHECK_PATH` | _(स्वचालित)_ | `scripts/dev/healthcheck.mjs` | कंटेनर हेल्थ चेक द्वारा स्पष्ट रूप से जांचा गया पाथ। अनसेट होने पर, प्रोब इसे `OMNIROUTE_BASE_PATH` से प्राप्त करता है; इसे सेट करने से डीप मॉनिटरिंग एंडपॉइंट में वापस ऑप्ट-इन होता है। | +| `OMNIROUTE_DEBUG_COMPLETION` | _(अनसेट)_ | `bin/cli/commands/completion.mjs` | CLI शेल-कंप्लीशन कैश पाथ (पढ़ें/ताज़ा करें/लिखें) से `[omniroute completion]` निदान उत्सर्जित करने के लिए किसी भी गैर-खाली मान पर सेट करें। डिफ़ॉल्ट रूप से बंद — वे कैश चुपचाप विफल हो जाते हैं ताकि एक गुम/भ्रष्ट कैश कभी टैब-कंप्लीशन को न तोड़े। | +| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | व्यक्तिगत बैच आइटम के लिए अधिकतम पुनः प्रयास विंडो (ms)। इस अवधि से अधिक आइटम विफल के रूप में चिह्नित किए जाते हैं। | +| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | बैच आइटम रिट्राई के लिए एक्सपोनेंशियल बैकऑफ़ के लिए बेस डिले (ms)। | +| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | बैच आइटम रिट्राई के बीच एक्सपोनेंशियल बैकऑफ़ के लिए कैप (ms)। | +| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | एक साथ प्रोसेस किए जाने वाले बैचों की अधिकतम संख्या। थ्रूपुट बढ़ाने के लिए इसे बढ़ाएँ; रेट-लिमिट स्टॉर्म से बचने के लिए इसे कम रखें। | > [!IMPORTANT] -> किसी मौजूदा स्थायी डेटाबेस को बदलने से पहले, माइग्रेशन रनर `DATA_DIR/db_backups/` के अंतर्गत एक पूर्ण, -> सामग्री-संबोधित स्नैपशॉट प्रकाशित करता है। प्रकाशन के लिए ऐसे फ़ाइल सिस्टम की आवश्यकता होती है -> जो समान फ़ाइल सिस्टम पर बिना ओवरराइट वाले हार्ड लिंक और स्थायी फ़ाइल सिंक का समर्थन करता हो। POSIX होस्ट को -> डायरेक्टरी सिंक की भी आवश्यकता होती है; Windows पर Node डायरेक्टरी हैंडल अस्वीकार कर सकता है, इसलिए OmniRoute -> प्रकाशित फ़ाइल को फ्लश करता है और डायरेक्टरी-एंट्री सिंक को सर्वोत्तम प्रयास के रूप में मानता है। -> यदि माउंट किया गया `DATA_DIR` ये गारंटियाँ प्रदान नहीं कर सकता, तो माइग्रेशन लागू होने से पहले -> स्टार्टअप सुरक्षित रूप से विफल हो जाता है। `DATA_DIR` को इन मूल सुविधाओं वाले वॉल्यूम पर ले जाएँ; -> माइग्रेशन सुरक्षा को दरकिनार करने के लिए `DISABLE_SQLITE_AUTO_BACKUP` का उपयोग न करें। +> किसी मौजूदा परसिस्टेंट डेटाबेस को बदलने से पहले, माइग्रेशन रनर `DATA_DIR/db_backups/` के तहत एक पूर्ण, कंटेंट-एड्रेस्ड स्नैपशॉट प्रकाशित करता है। प्रकाशन के लिए एक ऐसे फाइलसिस्टम की आवश्यकता होती है जो समान-फाइलसिस्टम, नो-ओवरराइट हार्ड लिंक और टिकाऊ फ़ाइल सिंक का समर्थन करता हो। POSIX होस्ट को डायरेक्टरी सिंक की भी आवश्यकता होती है; विंडोज पर, नोड डायरेक्टरी हैंडल को अस्वीकार कर सकता है, इसलिए OmniRoute प्रकाशित फ़ाइल को फ्लश करता है और डायरेक्टरी-एंट्री सिंक को सर्वोत्तम प्रयास के रूप में मानता है। +> यदि माउंटेड `DATA_DIR` उन गारंटियों को प्रदान नहीं कर सकता है, तो माइग्रेशन लागू करने से पहले स्टार्टअप बंद हो जाता है। `DATA_DIR` को उन प्रिमिटिव वाले वॉल्यूम पर ले जाएँ; माइग्रेशन सुरक्षा को बायपास करने के लिए `DISABLE_SQLITE_AUTO_BACKUP` का उपयोग न करें। ### परिदृश्य -| परिदृश्य | कॉन्फ़िगरेशन | -| --------------------------------- | --------------------------------------------------------------------------------------- | -| **स्थानीय विकास** | सभी डिफ़ॉल्ट अपरिवर्तित रखें। डेटाबेस `~/.omniroute/omniroute.db` पर रहता है। | -| **Docker** | `DATA_DIR=/data` + `/data` पर एक वॉल्यूम माउंट करें। | -| **स्थिर अवस्था में एन्क्रिप्टेड** | `STORAGE_ENCRYPTION_KEY` सेट करें + कुंजी के बैकअप सुरक्षित रखें! इसे खोना = डेटा खोना। | -| **CI/परीक्षण** | `DATA_DIR=/tmp/omniroute-test` — अस्थायी, एन्क्रिप्शन की आवश्यकता नहीं। | +| परिदृश्य | कॉन्फ़िगरेशन | +| ------------------------- | ------------------------------------------------------------------------------ | +| **स्थानीय विकास** | सभी डिफ़ॉल्ट सेटिंग्स छोड़ दें। DB `~/.omniroute/omniroute.db` पर रहता है। | +| **डॉकर** | `DATA_DIR=/data` + `/data` पर एक वॉल्यूम माउंट करें। | +| **रेस्ट पर एन्क्रिप्टेड** | `STORAGE_ENCRYPTION_KEY` सेट करें + कुंजी का बैकअप रखें! इसे खोना = डेटा खोना। | +| **CI/परीक्षण** | `DATA_DIR=/tmp/omniroute-test` — अल्पकालिक, एन्क्रिप्शन की आवश्यकता नहीं है। | --- @@ -213,47 +206,48 @@ OmniRoute सभी स्थायी डेटा के लिए **SQLite** ## 4. सुरक्षा और प्रमाणीकरण -| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | मशीन फ़िंगरप्रिंटिंग के लिए हार्डवेयर पहचानकर्ताओं के साथ संयोजित किया जाने वाला सॉल्ट। आइसोलेशन के लिए प्रत्येक डिप्लॉयमेंट में इसे बदलें। | -| `OMNIROUTE_CLI_SALT` | _(सेट नहीं = प्रत्येक इंस्टॉलेशन के लिए यादृच्छिक सॉल्ट, जो `/cli-token-salt.json` पर सुरक्षित रहता है)_ | `src/lib/machineToken.ts` | स्थानीय CLI प्रमाणीकरण टोकन प्राप्त करने के लिए HMAC सॉल्ट। इस मान को सेट करने से मशीन के सभी CLI टोकन रोटेट हो जाते हैं और इसे सुरक्षित रखे गए सॉल्ट पर हमेशा प्राथमिकता मिलती है। `docs/security/CLI_TOKEN.md` देखें। | -| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | सत्र कुकीज़ पर `Secure` फ़्लैग सेट करता है। HTTPS के पीछे चलाते समय यह **`true` होना आवश्यक है**। | -| `REQUIRE_API_KEY` | `false` | API मिडलवेयर | `true` होने पर, सभी `/v1/*` प्रॉक्सी अनुरोधों में एक मान्य API कुंजी शामिल होनी चाहिए। | -| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Dashboard UI में API कुंजी के पूर्ण मान दिखाने की अनुमति देता है। इसे Dashboard Feature Flags से कॉन्फ़िगर किया जा सकता है; साझा इंस्टेंस पर यह सुरक्षा जोखिम है। | -| `NO_LOG_API_KEY_IDS` | _(रिक्त)_ | `src/lib/compliance/index.ts` | अनुरोध लॉगिंग को बायपास करने वाली, कॉमा से अलग की गई API कुंजी IDs (GDPR अनुपालन)। | -| `DEFAULT_RATE_LIMIT_PER_DAY` | _(सेट नहीं = असीमित)_ | `src/shared/utils/apiKeyPolicy.ts` | उन API कुंजियों पर लागू होने वाला प्रतिदिन का फ़ॉलबैक अनुरोध बजट, जिनका `rate_limits` कॉलम null है। सेट नहीं या रिक्त: कोई निहित सीमा नहीं (#2289, #11017)। `0` भी समान है (असीमित)। धनात्मक पूर्णांक N से N/दिन, 5N/सप्ताह, 20N/माह सक्षम होते हैं। त्रुटिपूर्ण गैर-रिक्त मान पुराने 1000/दिन, 5000/सप्ताह, 20000/माह विंडो पर फ़ॉलबैक करते हैं। | -| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | अनुरोध बॉडी का अधिकतम अनुमत आकार। इस सीमा से बड़े पेलोड अस्वीकार कर दिए जाते हैं। | -| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | इस सीमा पर या इससे बड़ी वास्तविक अनुरोध बॉडीज़ JSON पार्सिंग से पहले एटॉमिक, प्रोसेस-लोकल हेवीवेट एडमिशन लीज़ लेती हैं (BYTE पथ, जिसमें `POST /v1/responses` शामिल है)। स्ट्रक्चर-हेवी के समान [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) हेल्दी-हेडरूम एस्केप; फिर भी `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) द्वारा सीमित, ताकि [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) वापस न आए। | -| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | सीमित इनजेशन के दौरान पढ़े गए बाइट्स पर लागू चैट-रूट की कठोर सीमा, जिसमें अनुपस्थित, अमान्य या भ्रामक `Content-Length` वाले अनुरोध भी शामिल हैं; सीमा से अधिक होने पर `413` प्राप्त होता है। | -| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(अनसेट — अनुरोध-संख्या की कोई सीमा नहीं)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** यह लीगेसी अनुरोध-संख्या सीमा अब केवल स्पष्ट रूप से सेट किए जाने पर ही लागू होती है। इसे अनसेट छोड़ने पर (डिफ़ॉल्ट), हेवीवेट चैट प्रवेश को इसके बजाय `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` द्वारा नियंत्रित किया जाता है — **एक प्रक्रिया** (एक V8 हीप) में प्रक्रिया की वास्तविक मेमोरी सीमा से स्वतः प्राप्त BYTE बजट। दो ओवरलैप होते ~750k-टोकन `/v1/responses`, ~12 Gi हीप को निरस्त कर देते हैं (#7849) — यह **मेमोरी-बजट** चेतावनी है, 2 की कठोर उत्पाद अधिकतम सीमा नहीं। एक स्वस्थ प्रक्रिया (शेड अनुपात से नीचे हीप) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` के माध्यम से अधिक समवर्ती लंबे `/v1/responses` को प्रवेश दे सकती है। दर्जनों लंबे SSE क्लाइंट (40–50) हीप + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 से संबंधित हैं, “अधिकतम 2” से नहीं। “होस्ट का उपयोग करने” के लिए इसे बिना सोचे-समझे बढ़ाने से #7849 फिर उत्पन्न होता है। **N स्वतंत्र `DATA_DIR`s** (#11024) के साथ **हीपों** की संख्या बढ़ाएँ; एक SQLite फ़ाइल पर कभी भी `replicas>1` न रखें। | -| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(स्वतः प्राप्त)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** स्वतः प्राप्त इंजेस्ट बाइट बजट के लिए ओवरराइड (अधिक सख्त V8/cgroup मेमोरी सीमा का 25%, जिसे 8x अस्थायी प्रवर्धन से विभाजित किया गया है)। प्राप्त और स्पष्ट मान 8 MiB–2 GiB के बीच सीमित किए जाते हैं। प्रभावी बजट से बड़ी बॉडी तुरंत `413 body_exceeds_budget` के साथ विफल होती है; अलग-अलग सेवा-योग्य बॉडी के बीच प्रतिस्पर्धा पुनः प्रयास योग्य `503` बनी रहती है। 40–50 समवर्ती लंबे SSE क्लाइंट इस बजट + हीप से संबंधित हैं, किसी कठोर “अधिकतम 2” सीमा से नहीं। ट्यूनिंग से पहले `/api/monitoring/health` पर `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` पढ़ें। | -| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | BYTE और STRUCTURE हेवीवेट प्रवेश के लिए हीप-दबाव शेड अनुपात (`heapUsed / heap_size_limit`) (#10183, #10268, #10437)। `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` से आगे का समवर्ती हेवीवेट अनुरोध पुनः प्रयास योग्य `503` के साथ केवल तभी शेड किया जाता है, जब हीप भी इस अनुपात पर या इससे ऊपर हो; स्वस्थ हीप पर इसे इसके बजाय स्वस्थ-हेडरूम के माध्यम से प्रवेश दिया जाता है। | -| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (डिफ़ॉल्ट `1`) | `src/shared/middleware/chatBodyAdmission.ts` | STRUCTURE और BYTE **दोनों** (`admitChatRequest`, जिसमें ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` बॉडी भी शामिल हैं) पर स्वस्थ-हीप फ़ास्ट पाथ (#10437) के लिए सीमित अतिरिक्त क्षमता। इस सीमा के बिना, प्रत्येक व्यस्त-लेकिन-स्वस्थ-हीप अनुरोध बिना किसी अधिकतम सीमा के प्रवेश नियंत्रण को बायपास करता था। स्वस्थ-हीप पाथ के माध्यम से इतने समवर्ती लीज़ सक्रिय होने के बाद, आगे के व्यस्त अनुरोध वास्तविक हीप दबाव में उपयोग होने वाले उसी सीमित-प्रतीक्षा/शेड पाथ पर चले जाते हैं। `0` बायपास को पूरी तरह अक्षम करता है। | -| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | वह संदेश संख्या, जो किसी चैट अनुरोध की बॉडी बाइट सीमा से कम होने पर भी उसे हेवीवेट के रूप में वर्गीकृत करती है। | -| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | वह टूल संख्या, जो किसी चैट अनुरोध की बॉडी बाइट सीमा से कम होने पर भी उसे हेवीवेट के रूप में वर्गीकृत करती है। | -| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | स्ट्रिंग आकार पर आधारित रूढ़िवादी टोकन अनुमान, जो किसी अनुरोध को हेवीवेट के रूप में वर्गीकृत करता है; यह प्रवेश-लागत का प्रतिनिधि मान है, प्रदाता की बिलिंग टोकनाइज़ेशन नहीं। | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (अक्षम) | `src/shared/middleware/chatBodyAdmission.ts` | वैकल्पिक ऑप्ट-इन चैट इतिहास सीमा। डिफ़ॉल्ट रूप से अक्षम: संदेश संख्या परिनियोजन नीति है, किसी अनुरोध की सार्वभौमिक विशेषता नहीं, और यहाँ सीमा लगाने से वार्तालापों को अंतिम `413` के साथ अस्वीकार कर दिया जाता है, इससे पहले कि संपीड़न पाइपलाइन उन्हें सेवा-योग्य बना सके। हीप वृद्धि `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` और हीप-दबाव शेड द्वारा सीमित होती है। कठोर अधिकतम सीमा की आवश्यकता वाले मेमोरी-सीमित परिनियोजनों पर एक धनात्मक मान सेट करें; इसके बाद अतिरिक्त अनुरोधों को संरचित कॉम्पैक्ट-आवश्यक `413` प्राप्त होता है। | -| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | मेमोरी में पूरी तरह बफ़र की गई नॉन-स्ट्रीमिंग अपस्ट्रीम प्रतिक्रिया के लिए कठोर सीमा। इससे आगे अपस्ट्रीम रीडर रद्द कर दिया जाता है और अनुरोध तेज़ी से विफल हो जाता है, बजाय इसके कि हीप समाप्त होने तक असीमित स्ट्रिंग बढ़ती रहे। | -| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | अपस्ट्रीम प्रतिक्रिया हेडर से फ़ॉरवर्ड किए जाने वाले अधिकतम वायर बाइट। बजट पार होने पर सामान्य रिवर्स-प्रॉक्सी हेडर सीमाओं के भीतर रहने के लिए निम्न-प्राथमिकता वाले हेडर (उदा., कस्टम `x-codex-*`, `x-oai-request-id`) हटा दिए जाते हैं। अधिक बड़े प्रतिक्रिया हेडर आकार की कीमत पर अधिक अपस्ट्रीम मेटाडेटा फ़ॉरवर्ड करने के लिए इसे अधिक सेट करें। | -| `CORS_ORIGIN` | _(सेट नहीं)_ | `src/server/cors/origins.ts` | पुरानी एकल-ओरिजिन CORS अनुमति-सूची। नए डिप्लॉयमेंट के लिए `CORS_ALLOWED_ORIGINS` को प्राथमिकता दें। CORS केवल क्रॉस-ओरिजिन ब्राउज़र API क्लाइंट के लिए है; प्रमाणित डैशबोर्ड लेखन इसके बजाय समान-ओरिजिन अनुरोधों के साथ सत्र-बद्ध CSRF सुरक्षा का उपयोग करता है। | -| `CORS_ALLOWED_ORIGINS` | _(सेट नहीं)_ | `src/server/cors/origins.ts` | कॉमा से अलग की गई CORS अनुमति-सूची। जब तक `CORS_ALLOW_ALL=true` को स्पष्ट रूप से कॉन्फ़िगर नहीं किया जाता, कोई वाइल्डकार्ड नहीं भेजा जाता। | -| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | किसी भी ब्राउज़र `Origin` को प्रतिध्वनित करने के लिए केवल-विकास हेतु वैकल्पिक रास्ता। इसे साझा या प्रोडक्शन डिप्लॉयमेंट पर सक्षम न करें। | -| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | निजी/लूपबैक/लिंक-लोकल IP श्रेणियों को लक्षित करने वाली प्रदाता कॉल ब्लॉक करें। इसे केवल पृथक परीक्षण परिवेशों में अक्षम करें। | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | निजी/स्थानीय नेटवर्क (localhost, 192.168.x.x, 10.x.x.x आदि) की ओर इंगित करने वाले प्रदाता URL की अनुमति दें। **स्वयं होस्ट किए गए प्रदाताओं के लिए आवश्यक** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG)। `false` होने पर, डैशबोर्ड स्थानीय URL के सत्यापन को अस्वीकार कर देता है। | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | स्थानीय/निजी पतों (127.0.0.1, localhost, LAN, निजी श्रेणियाँ) पर प्रदाताओं को जोड़ने/सत्यापित करने की अनुमति दें — यह प्रदाता सत्यापन पथ तक सीमित है। **डिफ़ॉल्ट `true`** (स्थानीय-प्रथम); केवल सार्वजनिक पतों की अनुमति वाला सख्त अवरोध लागू करने के लिए इसे `false` पर सेट करें। क्लाउड-मेटाडेटा एंडपॉइंट (169.254.169.254, metadata.google.internal) हर स्थिति में ब्लॉक रहते हैं। (#5066) | -| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` रूट (ट्रांसक्रिप्शन, स्पीच, अनुवाद) को localhost के बाहर होस्ट किए गए OpenAI-संगत प्रदाता नोड का उपयोग करने दें। डिफ़ॉल्ट रूप से बंद — ऑडियो को किसी रिमोट होस्ट पर रूट करने से निर्गमन पहचान बदल जाती है और इसके लिए ऑपरेटर का स्पष्ट निर्णय आवश्यक है। लूपबैक/निजी नोड (localhost, 127.0.0.1, 172.16-31.x) हमेशा अनुमत और अप्रभावित रहते हैं। (#3963) | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | OIDC सक्षम होने पर पासवर्ड लॉगिन अक्षम करें, ताकि उपयोगकर्ता केवल OIDC सिंगल साइन-ऑन के माध्यम से प्रमाणित कर सकें। संक्षिप्त उपनाम `OIDC_DISABLE_PASSWORD_LOGIN` भी स्वीकार किया जाता है; समान कुंजी वाला डैशबोर्ड फ़ीचर फ़्लैग प्राथमिकता लेता है। (#10889) | -| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` का संक्षिप्त उपनाम (#10889)। | - -### सुरक्षा सुदृढ़ीकरण जाँच-सूची +| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | मशीन फ़िंगरप्रिंटिंग के लिए हार्डवेयर पहचानकर्ताओं के साथ संयुक्त सॉल्ट। अलगाव के लिए प्रति-डिप्लॉयमेंट बदलें। | +| `OMNIROUTE_CLI_SALT` | _(अनसेट = `/cli-token-salt.json` पर स्थायी रूप से संग्रहीत प्रति-इंस्टॉल रैंडम सॉल्ट)_ | `src/lib/machineToken.ts` | स्थानीय CLI प्रमाणीकरण टोकन प्राप्त करने के लिए HMAC सॉल्ट। इस मान को सेट करने से मशीन पर सभी CLI टोकन घूम जाते हैं और यह हमेशा स्थायी सॉल्ट पर प्राथमिकता लेता है। `docs/security/CLI_TOKEN.md` देखें। | +| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | सेशन कुकीज़ पर `Secure` फ़्लैग सेट करता है। HTTPS के पीछे चलने पर **`true` होना चाहिए**। | +| `REQUIRE_API_KEY` | `false` | API मिडलवेयर | जब `true` हो, तो सभी `/v1/*` प्रॉक्सी अनुरोधों में एक वैध API कुंजी शामिल होनी चाहिए। **यह फ़्लैग `GET /v1/models` को नियंत्रित नहीं करता है**, जो इसके बजाय डैशबोर्ड लॉगिन पोस्चर (`requireAuthForModels`) का पालन करता है — इसलिए `/v1/models` से `401` का मतलब यह नहीं है कि अनुमान सुरक्षित है। `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695) देखें। | +| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | डैशबोर्ड UI में पूर्ण API कुंजी मानों को प्रकट करने की अनुमति देता है। डैशबोर्ड फ़ीचर फ़्लैग से कॉन्फ़िगर करने योग्य; साझा इंस्टेंस पर सुरक्षा जोखिम। | +| `NO_LOG_API_KEY_IDS` | _(खाली)_ | `src/lib/compliance/index.ts` | कॉमा-सेपरेटेड API कुंजी ID जो अनुरोध लॉगिंग (GDPR अनुपालन) को बायपास करती हैं। | +| `DEFAULT_RATE_LIMIT_PER_DAY` | _(अनसेट = असीमित)_ | `src/shared/utils/apiKeyPolicy.ts` | API कुंजियों पर लागू प्रति-दिन अनुरोध बजट, जिनकी `rate_limits` कॉलम शून्य है। अनसेट या खाली: कोई निहित सीमा नहीं (#2289, #11017)। `0` भी वही है (असीमित)। धनात्मक पूर्णांक N, N/दिन, 5N/सप्ताह, 20N/माह को सक्षम करता है। गलत तरीके से स्वरूपित गैर-खाली मान लीगेसी 1000/दिन, 5000/सप्ताह, 20000/माह विंडो पर वापस आ जाते हैं। | +| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | अनुमति प्राप्त अधिकतम अनुरोध बॉडी आकार। इस सीमा से अधिक पेलोड को अस्वीकार करता है। | +| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | इस सीमा के बराबर या उससे अधिक वास्तविक अनुरोध बॉडी JSON पार्सिंग से पहले परमाणु प्रक्रिया-स्थानीय हेवीवेट प्रवेश लीज लेती हैं (BYTE पाथ, जिसमें `POST /v1/responses` शामिल है)। संरचना-भारी के समान [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) स्वस्थ-हेडरूम एस्केप; अभी भी `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) द्वारा सीमित है ताकि [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) वापस न आए। | +| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | चैट-रूट हार्ड कैप बाउंडेड इनजेशन के दौरान पढ़े गए बाइट्स के खिलाफ लागू किया गया, जिसमें गुम, अमान्य या बेईमान `Content-Length` वाले अनुरोध शामिल हैं; अतिरिक्त को `413` प्राप्त होता है। | +| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(unset — no request-count cap)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-फैनआउट:** यह लेगेसी रिक्वेस्ट-काउंट कैप अब केवल तभी बाध्य होता है जब इसे स्पष्ट रूप से सेट किया जाता है। अनसेट छोड़ने पर (जो डिफ़ॉल्ट है), हेवीवेट चैट एडमिशन को इसके बजाय `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` द्वारा नियंत्रित किया जाता है — एक ऑटो-डेरिव्ड बाइट बजट जो **एक प्रक्रिया** (एक V8 हीप) में प्रक्रिया की वास्तविक मेमोरी सीमा से आकारित होता है। दो ओवरलैपिंग ~750k-टोकन `/v1/responses` लगभग 12 Gi हीप्स को रद्द कर देते हैं (#7849) — यह एक **मेमोरी-बजट** चेतावनी है, न कि 2 का हार्ड प्रोडक्ट मैक्स। एक स्वस्थ प्रक्रिया (शेड अनुपात से नीचे हीप) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` के माध्यम से अधिक समवर्ती लंबी `/v1/responses` को स्वीकार कर सकती है। दर्जनों लंबी SSE क्लाइंट (40-50) हीप + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 हैं, न कि "अधिकतम 2"। इसे "होस्ट का उपयोग करें" तक अंधाधुंध बढ़ाने से #7849 फिर से आ जाता है। **हीप्स** को **N स्वतंत्र `DATA_DIR`s** (#11024) से गुणा करें; एक SQLite फ़ाइल पर कभी भी `replicas>1` न करें। | +| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(auto-derived)_ | `src/shared/middleware/admissionBudget.ts` | **#503-फैनआउट:** ऑटो-डेरिव्ड इनजेस्ट बाइट बजट के लिए ओवरराइड (तंग V8/cgroup मेमोरी सीलिंग का 25% 8x क्षणिक प्रवर्धन से विभाजित)। व्युत्पन्न और स्पष्ट मान 8 MiB–2 GiB तक सीमित होते हैं। प्रभावी बजट से बड़ा एक बॉडी तुरंत `413 body_exceeds_budget` के साथ विफल हो जाता है; व्यक्तिगत रूप से सेवा योग्य बॉडीज़ के बीच विवाद प्रतिप्रयास योग्य `503` रहता है। 40-50 समवर्ती लंबी SSE क्लाइंट यह बजट + हीप हैं, न कि एक हार्ड "अधिकतम 2"। ट्यूनिंग से पहले `/api/monitoring/health` पर `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` पढ़ें। | +| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | बाइट और स्ट्रक्चर हेवीवेट एडमिशन (#10183, #10268, #10437) के लिए हीप-प्रेशर शेड अनुपात (`heapUsed / heap_size_limit`)। `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` से अधिक एक समवर्ती हेवीवेट अनुरोध केवल तभी प्रतिप्रयास योग्य `503` के साथ शेड किया जाता है जब हीप भी इस अनुपात पर या उससे ऊपर हो; एक स्वस्थ हीप पर इसे इसके बजाय स्वस्थ-हेडरूम के माध्यम से स्वीकार किया जाता है। | +| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (default `1`) | `src/shared/middleware/chatBodyAdmission.ts` | स्वस्थ-हीप फास्ट पाथ (#10437) के लिए **दोनों** स्ट्रक्चर और बाइट (`admitChatRequest`, जिसमें `OMNIROUTE_CHAT_LARGE_BODY_BYTES` से बड़े बॉडी शामिल हैं) पर सीमित अतिरिक्त क्षमता। इस सीमा के बिना, प्रत्येक व्यस्त-लेकिन-स्वस्थ-हीप अनुरोध बिना किसी सीमा के एडमिशन को बायपास कर देता था। एक बार जब इस संख्या में समवर्ती लीज स्वस्थ-हीप पाथ के माध्यम से सक्रिय हो जाते हैं, तो आगे के व्यस्त अनुरोध वास्तविक हीप दबाव के तहत उपयोग किए जाने वाले समान बाउंडेड-वेट/शेड पाथ पर आ जाते हैं। `0` बायपास को पूरी तरह से अक्षम कर देता है। | +| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | संदेश गणना जो एक चैट अनुरोध को हेवीवेट के रूप में वर्गीकृत करती है, भले ही उसका बॉडी बाइट थ्रेशोल्ड से कम हो। | +| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | टूल गणना जो एक चैट अनुरोध को हेवीवेट के रूप में वर्गीकृत करती है, भले ही उसका बॉडी बाइट थ्रेशोल्ड से कम हो। | +| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | रूढ़िवादी स्ट्रिंग-आकार टोकन अनुमान जो एक अनुरोध को हेवीवेट के रूप में वर्गीकृत करता है; यह एक एडमिशन-कॉस्ट प्रॉक्सी है, न कि प्रदाता बिलिंग टोकनाइजेशन। | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (disabled) | `src/shared/middleware/chatBodyAdmission.ts` | वैकल्पिक ऑप्ट-इन चैट हिस्ट्री कैप। डिफ़ॉल्ट रूप से अक्षम: एक संदेश गणना परिनियोजन नीति है, न कि अनुरोध का एक सार्वभौमिक गुण, और यहां कैपिंग संपीड़न पाइपलाइन उन्हें सेवा योग्य बनाने से पहले टर्मिनल `413` के साथ वार्तालापों को अस्वीकार कर देती है। हीप वृद्धि `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` और हीप-प्रेशर शेड द्वारा सीमित है। मेमोरी-बाधित परिनियोजनों पर एक सकारात्मक मान सेट करें जिन्हें एक हार्ड सीलिंग की आवश्यकता है; अतिरिक्त को फिर संरचित कॉम्पैक्ट-आवश्यक `413` प्राप्त होता है। | +| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | एक नॉन-स्ट्रीमिंग अपस्ट्रीम प्रतिक्रिया के लिए हार्ड कैप जो पूरी तरह से मेमोरी में बफर की जाती है। इसके बाद अपस्ट्रीम रीडर रद्द कर दिया जाता है और हीप के समाप्त होने तक एक असीमित स्ट्रिंग बढ़ने के बजाय अनुरोध तेजी से विफल हो जाता है। | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | अपस्ट्रीम प्रतिक्रिया हेडर से अग्रेषित अधिकतम वायर बाइट्स। जब बजट पार हो जाता है, तो सामान्य रिवर्स-प्रॉक्सी हेडर सीमाओं के भीतर रहने के लिए कम-प्राथमिकता वाले हेडर (जैसे, कस्टम `x-codex-*`, `x-oai-request-id`) हटा दिए जाते हैं। अधिक अपस्ट्रीम मेटाडेटा को अग्रेषित करने के लिए इसे उच्च पर सेट करें, जिससे प्रतिक्रिया हेडर का आकार बड़ा हो जाएगा। | +| `CORS_ORIGIN` | _(unset)_ | `src/server/cors/origins.ts` | लेगेसी सिंगल-ओरिजिन CORS अनुमति सूची। नई डिप्लॉयमेंट के लिए `CORS_ALLOWED_ORIGINS` को प्राथमिकता दें। CORS केवल क्रॉस-ओरिजिन ब्राउज़र API क्लाइंट के लिए है; प्रमाणित डैशबोर्ड राइट्स इसके बजाय समान-ओरिजिन अनुरोधों और सत्र-बाउंड CSRF सुरक्षा का उपयोग करते हैं। | +| `CORS_ALLOWED_ORIGINS` | _(unset)_ | `src/server/cors/origins.ts` | कॉमा-सेपरेटेड CORS अनुमति सूची। कोई वाइल्डकार्ड तब तक नहीं भेजा जाता जब तक कि `CORS_ALLOW_ALL=true` स्पष्ट रूप से कॉन्फ़िगर न किया गया हो। | +| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | किसी भी ब्राउज़र `Origin` को इको करने के लिए केवल डेवलपमेंट के लिए एस्केप हैच। साझा या प्रोडक्शन डिप्लॉयमेंट पर सक्षम न करें। | +| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | निजी/लूपबैक/लिंक-लोकल IP रेंज को लक्षित करने वाले प्रदाता कॉल्स को ब्लॉक करें। केवल अलग-थलग परीक्षण वातावरण में अक्षम करें। | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | निजी/स्थानीय नेटवर्क (localhost, 192.168.x.x, 10.x.x.x, आदि) की ओर इशारा करने वाले प्रदाता URL की अनुमति दें। **स्व-होस्टेड प्रदाताओं के लिए आवश्यक** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG)। जब `false` होता है, तो डैशबोर्ड स्थानीय URL के सत्यापन को अस्वीकार कर देता है। | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | स्थानीय/निजी पतों (127.0.0.1, localhost, LAN, निजी रेंज) पर प्रदाताओं को जोड़ने/सत्यापित करने की अनुमति दें — प्रदाता सत्यापन पथ तक सीमित। **डिफ़ॉल्ट `true`** (स्थानीय-प्रथम); सख्त सार्वजनिक-केवल ब्लॉकिंग लागू करने के लिए `false` पर सेट करें। क्लाउड-मेटाडेटा एंडपॉइंट्स (169.254.169.254, metadata.google.internal) किसी भी स्थिति में ब्लॉक रहते हैं। (#5066) | +| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` रूट्स (ट्रांसक्रिप्शन, स्पीच, ट्रांसलेशन) को localhost के बाहर होस्ट किए गए OpenAI-संगत प्रदाता नोड का उपयोग करने दें। डिफ़ॉल्ट रूप से बंद — ऑडियो को रिमोट होस्ट पर रूट करने से इग्रेस पहचान बदल जाती है और यह एक स्पष्ट ऑपरेटर निर्णय होना चाहिए। लूपबैक/निजी नोड्स (localhost, 127.0.0.1, 172.16-31.x) हमेशा अनुमत और अप्रभावित रहते हैं। (#3963) | +| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | `POST /v1/rerank` (और मेमोरी इंजन का लूपबैक रीरैंक स्टेप) को localhost के बाहर होस्ट किए गए OpenAI-संगत प्रदाता नोड का उपयोग करने दें — एक LAN बॉक्स या Tailscale पीयर जो TEI, Infinity, vLLM, आदि चला रहा हो। डिफ़ॉल्ट रूप से बंद — रिमोट होस्ट पर रूट करने से इग्रेस पहचान बदल जाती है और यह एक स्पष्ट ऑपरेटर निर्णय होना चाहिए। लूपबैक नोड्स (localhost, 127.0.0.1, 172.16-31.x) हमेशा अनुमत और अप्रभावित रहते हैं। रिमोट नोड्स को प्रदाता आउटबाउंड URL नीति (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) को भी पास करना होगा; क्लाउड-मेटाडेटा होस्ट को कभी भी रूट नहीं किया जाता है। | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | जब OIDC सक्षम होता है, तो पासवर्ड लॉगिन अक्षम करें ताकि उपयोगकर्ता केवल OIDC सिंगल साइन-ऑन के माध्यम से प्रमाणित हो सकें। नंगे उपनाम `OIDC_DISABLE_PASSWORD_LOGIN` को भी स्वीकार किया जाता है; उसी कुंजी का डैशबोर्ड फीचर फ्लैग प्राथमिकता लेता है। (#10889) | +| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` का नंगा उपनाम (#10889)। | + +### हार्डनिंग चेकलिस्ट ```bash -# प्रोडक्शन सुरक्षा के लिए न्यूनतम: +# प्रोडक्शन सुरक्षा न्यूनतम: AUTH_COOKIE_SECURE=true # HTTPS आवश्यक है -REQUIRE_API_KEY=true # सभी प्रॉक्सी कॉल प्रमाणित करें -ALLOW_API_KEY_REVEAL=false # UI में कुंजियाँ कभी उजागर न करें +REQUIRE_API_KEY=true # सभी प्रॉक्सी कॉल्स को प्रमाणित करें +ALLOW_API_KEY_REVEAL=false # UI में कुंजियों को कभी उजागर न करें CORS_ALLOWED_ORIGINS=https://your.domain.com -MAX_BODY_SIZE_BYTES=5242880 # 5 MB की सीमा +MAX_BODY_SIZE_BYTES=5242880 # 5 MB सीमा ``` --- @@ -299,61 +293,65 @@ OmniRoute दो-स्तरीय सुरक्षा प्रदान क --- -## 6. टूल और रूटिंग नीतियाँ - -| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM टूल/फ़ंक्शन-कॉलिंग एक्सेस को नियंत्रित करता है। `allowlist` = केवल सूचीबद्ध टूल, `denylist` = सूचीबद्ध टूल को छोड़कर सभी, `disabled` = कोई प्रतिबंध नहीं। | -| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | पेलोड हेरफेर नियमों वाली JSON फ़ाइल का पथ (प्रति-मॉडल/प्रोटोकॉल अपस्ट्रीम समायोजन)। | -| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | पेलोड नियम फ़ाइल को हॉट-रीलोड करने का अंतराल (ms)। न्यूनतम `1000`। | -| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | ऑप्ट-इन: Claude Code क्लाइंट से आने वाली बिना प्रीफ़िक्स वाली `claude-*` मॉडल ID को प्रदाता प्रीफ़िक्स आवश्यक बनाने के बजाय Claude Code OAuth खाते के माध्यम से रूट करें। स्पष्ट प्रदाता प्रीफ़िक्स को अब भी प्राथमिकता मिलती है। इसे Claude प्रदाता पेज पर डैशबोर्ड टॉगल के माध्यम से भी कॉन्फ़िगर किया जा सकता है। | -| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | राउंड-रॉबिन कॉम्बो के लिए प्रति-मॉडल समवर्ती अनुरोध सीमा (#9100)। राउंड-रॉबिन कॉम्बो सेमाफ़ोर में प्रति मॉडल 3 समवर्ती अनुरोधों की हार्ड-कोडेड सीमा थी, जिसे ओवरराइड नहीं किया जा सकता था, जिससे अधिक समवर्ती ट्रैफ़िक उस सीमा के पीछे क्रमिक रूप से प्रोसेस होता था। `>= 1` के लिए सत्यापित, `<= 32` तक सीमित। | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | एक जोखिमपूर्ण ऑप्ट-इन, जो प्रत्यक्ष एकल-मॉडल अनुरोधों के लिए OmniRoute की स्थानीय कॉन्टेक्स्ट-विंडो / अधिकतम-इनपुट-टोकन जाँच को छोड़ देता है। अपस्ट्रीम प्रदाता अब भी अपनी वास्तविक सीमाएँ लागू करते हैं; प्रॉम्प्ट संपीड़न और मॉडल की अपनी आउटपुट-टोकन सीमा सक्रिय रहती है। प्रभावी प्राथमिकता है: Feature Flags DB ओवरराइड > एनवायरनमेंट वेरिएबल > डिफ़ॉल्ट; रीस्टार्ट आवश्यक नहीं है। | -| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(सेट नहीं)_ | `open-sse/services/conversationTracker.ts` | बातचीत का इतिहास एकत्र करना रोकने के लिए इसे `1` पर सेट करें। `resolveConversationId()` SQLite को पढ़ने या संदेश इतिहास को पार्स करने से पहले एक अनट्रैक्ड परिणाम लौटाता है, और क्लाइंट द्वारा दिए गए सेशन ID भी इसमें शामिल होते हैं। रूटिंग-सेशन प्रबंधन अपरिवर्तित रहता है और मौजूदा रिकॉर्ड हटाए नहीं जाते। यह उन डिप्लॉयमेंट के लिए है जो डैशबोर्ड के वार्तालाप दृश्य का उपयोग नहीं करते और टर्न टेबल की वृद्धि रोकना चाहते हैं। | - ---- - -## 7. URLs और क्लाउड सिंक - -| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ---------------------------------------- | ----------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | आंतरिक सिंक कार्यों द्वारा `/api/sync/cloud` को कॉल करने के लिए सर्वर-साइड URL। ऐप को सार्वजनिक रूप से प्रॉक्सी किए जाने पर भी इसे लूपबैक/कंटेनर URL के रूप में रखें। | -| `CLOUD_URL` | _(खाली)_ | `src/lib/cloudSync.ts` | क्लाउड रिले एंडपॉइंट URL (प्रीमियम सुविधा)। | -| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | क्लाउड सिंक अनुरोधों के लिए HTTP टाइमआउट। | -| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack बिल्ड कॉन्फ़िगरेशन | बिल्ड-टाइम प्रोफ़ाइल (विशेषाधिकार प्राप्त मॉड्यूल को बंडल से भौतिक रूप से बाहर रखने के लिए इसे `minimal` पर सेट करें)। | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ स्टैंडअलोन आउटपुट_ | `scripts/build/colocate-standalone.mjs` | पोस्ट-बिल्ड कोलोकेशन चरण द्वारा उपयोग की जाने वाली स्टैंडअलोन आउटपुट डायरेक्टरी के लिए बिल्ड-टाइम ओवरराइड। यह रनटाइम सेटिंग नहीं है। | -| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(खाली)_ | `src/lib/cloudSync.ts` | क्लाउड सिंक प्रतिक्रियाओं के HMAC-SHA256 हस्ताक्षर को सत्यापित करने के लिए उपयोग किया जाने वाला साझा सीक्रेट। | -| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | क्लाउड सिंक एंडपॉइंट को स्थानीय क्रेडेंशियल्स ओवरराइट करने की अनुमति देने के लिए इसे `true` पर सेट करें। डिफ़ॉल्ट `false` है। | -| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | कोई स्थानीय सीक्रेट कॉन्फ़िगर नहीं होने पर अहस्ताक्षरित क्लाउड सिंक प्रतिक्रिया को अस्वीकार करने के लिए इसे `true` पर सेट करें (#13679)। मौजूद हस्ताक्षर को हमेशा सत्यापित किया जाता है — और `OMNIROUTE_CLOUD_SYNC_SECRET` सेट न होने पर उसे हमेशा अस्वीकार किया जाता है — चाहे इस फ़्लैग का मान कुछ भी हो। v3.9 में डिफ़ॉल्ट प्रवर्तन-सक्षम हो जाएगा। | -| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | उपयोगकर्ता की पुष्टि के बिना v3.8.5 के एक-चरणीय "सब कुछ इम्पोर्ट करें" व्यवहार पर वापस जाने के लिए इसे `true` पर सेट करें। | -| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, डैशबोर्ड, सिंक | OAuth `redirect_uri`, डैशबोर्ड लिंक और जनरेट किए गए सार्वजनिक URLs के लिए सार्वजनिक URL। जब OAuth कॉलबैक या जनरेट किए गए ब्राउज़र लिंक को किसी कैनोनिकल रिवर्स-प्रॉक्सी होस्ट का उपयोग करना हो, तो इसे स्थिर सार्वजनिक URL पर सेट करें। | -| `NEXT_PUBLIC_CLOUD_URL` | _(खाली)_ | क्लाइंट-साइड | `CLOUD_URL` का क्लाइंट-साइड मिरर। | -| `NEXT_PUBLIC_APP_URL` | _(सेट नहीं)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL` के लिए लेगेसी फ़ॉलबैक। | -| `OMNIROUTE_PUBLIC_BASE_URL` | _(सेट नहीं)_ | सार्वजनिक ओरिजिन रिज़ॉल्वर, इमेज URL | सार्वजनिक URL जनरेशन और गैर-डैशबोर्ड ब्राउज़र-ओरिजिन सत्यापन के लिए उपयोग किया जाने वाला सर्वोच्च-प्राथमिकता वाला ब्राउज़र-सामना करने वाला OmniRoute ओरिजिन। इसे तब सेट करें, जब OpenWebUI या कोई अन्य रिले किसी आंतरिक URL द्वारा OmniRoute तक पहुँचता है, लेकिन उपयोगकर्ता के ब्राउज़र को जनरेट किया गया मीडिया किसी LAN, टनल या सार्वजनिक ओरिजिन से फ़ेच करना होता है। `/v1` शामिल **न करें**। | -| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(सेट नहीं)_ | `open-sse/config/providerPluginManifestUrl.ts` | साइडकार क्लाइंट को सूचित किया जाने वाला एब्सोल्यूट प्रोवाइडर प्लगइन मैनिफ़ेस्ट URL। सेट न होने पर, OmniRoute अनुरोध ओरिजिन या HOST/PORT से `/api/v1/provider-plugin-manifest` प्राप्त करता है। | -| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | अनुरोध ओरिजिन के बिना HOST/PORT से प्रोवाइडर प्लगइन मैनिफ़ेस्ट URL प्राप्त करते समय उपयोग किया जाने वाला प्रोटोकॉल। जब कोई स्पष्ट `OMNIROUTE_PROVIDER_MANIFEST_URL` सेट न हो, तो TLS-टर्मिनेटिंग सार्वजनिक प्रॉक्सी के पीछे इसे `https` पर सेट करें। | -| `OMNIROUTE_TRUST_PROXY` | _(सेट नहीं)_ | `src/server/origin/publicOrigin.ts` | फ़ॉरवर्ड किए गए सार्वजनिक-ओरिजिन हेडर के लिए वैकल्पिक ट्रस्ट मोड। सेट न होना = सुरक्षा निर्णयों के लिए `Forwarded` / `X-Forwarded-*` पर भरोसा न करें। `true` / `loopback` केवल टोकन-स्टैम्प वाले लूपबैक प्रॉक्सी से फ़ॉरवर्ड किए गए होस्ट/प्रोटो पर भरोसा करता है। `private` / `lan` निजी-LAN प्रॉक्सी पीयर पर भी भरोसा करता है। प्रोडक्शन में स्पष्ट `NEXT_PUBLIC_BASE_URL` को प्राथमिकता दें। | -| `KIE_CALLBACK_URL` | _(सेट नहीं)_ | `open-sse/utils/kieTask.ts` | असिंक्रोनस kie.ai जॉब के लिए सार्वजनिक कॉलबैक URL। `OMNIROUTE_KIE_CALLBACK_URL` और `OMNIROUTE_PUBLIC_URL` से पहले सर्वोच्च-प्राथमिकता वाला ओवरराइड। | -| `OMNIROUTE_KIE_CALLBACK_URL` | _(सेट नहीं)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL` की वैकल्पिक वर्तनी। प्राथमिक वेरिएबल सेट न होने पर इसका फ़ॉलबैक के रूप में उपयोग होता है। | -| `OMNIROUTE_PUBLIC_URL` | _(सेट नहीं)_ | `open-sse/utils/kieTask.ts` | असिंक्रोनस कॉलबैक URL बनाने के लिए उपयोग किया जाने वाला सार्वजनिक ओरिजिन। kie.ai कॉलबैक के लिए सबसे कम-प्राथमिकता वाला फ़ॉलबैक; अन्य रिले के लिए एक सामान्य सार्वजनिक URL के रूप में भी उपयोग किया जाता है। | -| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage पेज द्वारा उपयोग किया जाने वाला CrofAI कोटा लुकअप एंडपॉइंट। रिले / टेस्ट फ़िक्स्चर के लिए ओवरराइड करें। | -| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage पेज द्वारा उपयोग किया जाने वाला आधिकारिक API-की-प्रमाणीकृत OpenCode Go उपयोग एंडपॉइंट। रिले / टेस्ट फ़िक्स्चर के लिए ओवरराइड करें। | -| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | क्लाइंट द्वारा न भेजे गए opencode-go/zen अपस्ट्रीम अनुरोधों पर OpenCode CLI पहचान हेडर (User-Agent, x-opencode-client/project, अनुरोध/सेशन UUID) सिंथेसाइज़ करें, ताकि VPS इग्रेस पर Cloudflare उन्हें स्वीकार करे (#6210/#5997)। #10571 से डिफ़ॉल्ट रूप से चालू; `false`/`0`/`no`/`off` से ऑप्ट आउट करें। | -| `OPENCODE_USER_AGENT` | `opencode` | `open-sse/executors/opencode.ts` | जब `OPENCODE_SYNTHESIZE_CLI_HEADERS` चालू हो और कोई प्रति-प्रोवाइडर `_USER_AGENT` ओवरराइड सेट न हो, तब उपयोग किया जाने वाला डिफ़ॉल्ट User-Agent। केवल opencode एग्ज़ीक्यूटर पर लागू होता है। | -| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` चालू होने पर सिंथेसाइज़ किए गए `x-opencode-client` हेडर का मान। | -| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` चालू होने पर संश्लेषित `x-opencode-project` हेडर का मान। | -| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | कोटा स्क्रैपिंग के लिए प्रयुक्त Ollama Cloud सेटिंग्स URL। रिले / परीक्षण फ़िक्सचर के लिए इसे ओवरराइड करें। | -| `OLLAMA_USAGE_COOKIE` | _(सेट नहीं)_ | `open-sse/services/usage.ts` | सेटिंग्स-पृष्ठ की कोटा स्क्रैपिंग के लिए प्रयुक्त Ollama Cloud `__Secure-session` कुकी। संवेदनशील; एकाधिक खाते कॉन्फ़िगर होने पर प्रति-कनेक्शन Dashboard फ़ील्ड को प्राथमिकता दें। | -| `OLLAMA_CLOUD_USAGE_COOKIE` | _(सेट नहीं)_ | `open-sse/services/usage.ts` | वैकल्पिक Ollama Cloud `__Secure-session` कुकी env var। संवेदनशील; एकाधिक खाते कॉन्फ़िगर होने पर प्रति-कनेक्शन Dashboard फ़ील्ड को प्राथमिकता दें। | -| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(सेट नहीं)_ | `open-sse/services/usage.ts` | छोटे उपनामों से पहले प्रयुक्त वैकल्पिक Ollama Cloud `__Secure-session` कुकी env var। संवेदनशील; एकाधिक खाते कॉन्फ़िगर होने पर प्रति-कनेक्शन Dashboard फ़ील्ड को प्राथमिकता दें। | -| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) उपयोग-सीमा एंडपॉइंट। रिले / परीक्षण फ़िक्सचर के लिए इसे ओवरराइड करें। | +## 6. टूल और रूटिंग नीतियां + +| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | +| ----------------------------------------------------------- | ---------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM टूल/फ़ंक्शन-कॉलिंग एक्सेस को नियंत्रित करता है। `allowlist` = केवल सूचीबद्ध टूल, `denylist` = सूचीबद्ध को छोड़कर सभी, `disabled` = कोई प्रतिबंध नहीं। | +| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | पेलोड हेरफेर नियमों JSON फ़ाइल का पथ (प्रति-मॉडल/प्रोटोकॉल अपस्ट्रीम ट्वीक)। | +| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | पेलोड नियमों की फ़ाइल को हॉट-रीलोड करने के लिए रीलोड अंतराल (ms)। न्यूनतम `1000`। | +| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | ऑप्ट-इन: क्लाउड कोड क्लाइंट से बिना उपसर्ग वाले `claude-*` मॉडल आईडी को क्लाउड कोड OAuth खाते के माध्यम से रूट करें, बजाय इसके कि प्रदाता उपसर्ग की आवश्यकता हो। स्पष्ट प्रदाता उपसर्ग अभी भी जीतते हैं। क्लाउड प्रदाता पृष्ठ पर डैशबोर्ड टॉगल के माध्यम से भी कॉन्फ़िगर किया जा सकता है। | +| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | राउंड-रॉबिन कॉम्बो (#9100) के लिए प्रति-मॉडल समवर्ती कैप। राउंड-रॉबिन कॉम्बो सेमाफोर को प्रति मॉडल 3 समवर्ती अनुरोधों पर हार्ड-कैप किया गया था, जिसमें कोई ओवरराइड नहीं था, उस कैप के पीछे उच्च-समवर्ती ट्रैफ़िक को क्रमबद्ध किया गया था। `>= 1` के लिए मान्य, `<= 32` तक सीमित। | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | खतरनाक ऑप्ट-इन जो प्रत्यक्ष एकल-मॉडल अनुरोधों के लिए OmniRoute के स्थानीय संदर्भ-विंडो / अधिकतम-इनपुट-टोकन जांच को छोड़ देता है। अपस्ट्रीम प्रदाता अभी भी अपनी वास्तविक सीमाओं को लागू करते हैं; प्रॉम्प्ट संपीड़न और मॉडल की अपनी आउटपुट-टोकन कैप सक्रिय रहती है। प्रभावी प्राथमिकता फ़ीचर फ़्लैग्स DB ओवरराइड > पर्यावरण वेरिएबल > डिफ़ॉल्ट है; पुनरारंभ की आवश्यकता नहीं है। | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(अनसेट)_ | `open-sse/services/selfHostedEntry.ts` | इनलाइन YAML `providers:` दस्तावेज़ (RIC-738, D4)। जब सेट किया जाता है (एक `strategy:` ब्लॉक के साथ या उसके बिना), `/v1/chat/completions` क्लाउड पाइपलाइन के बजाय स्व-होस्टेड एकीकृत OpenAI-संगत प्रविष्टि पर डायवर्ट हो जाता है। अनसेट (डिफ़ॉल्ट): मार्ग मौजूदा क्लाउड पाइपलाइन के माध्यम से सीधे गिरता है। `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md` देखें। | +| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(अनसेट)_ | `open-sse/services/selfHostedEntry.ts` | `OMNIROUTE_SELF_HOSTED_PROVIDERS` के समान `providers:` दस्तावेज़ वाली YAML फ़ाइल का पथ, उन परिनियोजनों के लिए जो इनलाइन env var के बजाय फ़ाइल पसंद करते हैं। दोनों में से कोई भी स्व-होस्टेड प्रविष्टि को सक्रिय करता है। | +| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(अनसेट — खुला मार्ग)_ | `open-sse/services/selfHostedEntry.ts` | एकीकृत स्व-होस्टेड प्रविष्टि के लिए वैकल्पिक साझा API कुंजी (D5 स्कैफोल्ड, प्रति-कुंजी कोटा प्रणाली के लिए आरक्षित)। जब सेट किया जाता है, तो अनुरोधों में `Authorization: Bearer ` शामिल होना चाहिए। अनसेट: मार्ग खुला है, मौजूदा स्व-होस्टेड स्थानीय-प्रदाता पैटर्न (लूपबैक/विश्वसनीय-नेटवर्क परिनियोजन) से मेल खाता है। | +| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(अनसेट)_ | `open-sse/services/routingStrategies.ts` | नियतात्मक रूटिंग इंजन (M2/RIC-740, D3) के लिए इनलाइन YAML `strategy:` दस्तावेज़ — ब्लैकलिस्ट/व्हाइटलिस्ट, कूलडाउन ब्रेकर, लागत-प्राथमिकता, विलंबता-जागरूक, फ़ॉलबैक चेन। `OMNIROUTE_SELF_HOSTED_PROVIDERS` के अंदर नेस्टेड इनलाइन `strategy:` ब्लॉक को ओवरराइड करता है, प्रति-कुंजी। `docs/routing/DETERMINISTIC_ROUTING.md` देखें। | +| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(अनसेट)_ | `open-sse/services/routingStrategies.ts` | `OMNIROUTE_SELF_HOSTED_STRATEGY` के समान `strategy:` दस्तावेज़ वाली YAML फ़ाइल का पथ, उन परिनियोजनों के लिए जो इनलाइन env var के बजाय फ़ाइल पसंद करते हैं। | +| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(unset)_ | `open-sse/services/conversationTracker.ts` | बातचीत के इतिहास को एकत्र करना बंद करने के लिए `1` सेट करें। SQLite को पढ़ने या संदेश इतिहास का पार्स करने से पहले `resolveConversationId()` एक अनट्रैक किया गया परिणाम लौटाता है, और क्लाइंट द्वारा प्रदान की गई सत्र आईडी भी इसमें शामिल होती हैं। रूटिंग-सत्र हैंडलिंग अपरिवर्तित रहती है और मौजूदा रिकॉर्ड हटाए नहीं जाते हैं। ऐसे परिनियोजन (deployments) के लिए जो डैशबोर्ड के बातचीत दृश्य का उपयोग नहीं करते हैं और चाहते हैं कि टर्न टेबल बढ़ना बंद हो जाए। | + +## 7. यूआरएल और क्लाउड सिंक + +| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | +| --------------------------------------- | --------------------------------------------------------------- | ------------------------------------------- | आंतरिक सिंक जॉब्स के लिए सर्वर-साइड यूआरएल जो `/api/sync/cloud` को कॉल करते हैं। ऐप के सार्वजनिक रूप से प्रॉक्सी होने पर भी इसे लूपबैक/कंटेनर यूआरएल के रूप में रखें। | +| `CLOUD_URL` | _(खाली)_ | `src/lib/cloudSync.ts` | क्लाउड रिले एंडपॉइंट यूआरएल (प्रीमियम सुविधा)। | +| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | क्लाउड सिंक अनुरोधों के लिए HTTP टाइमआउट। | +| `OMNIROUTE_BUILD_PROFILE` | `full` | वेबपैक बिल्ड कॉन्फ़िग | बिल्ड-टाइम प्रोफ़ाइल (विशेषाधिकार प्राप्त मॉड्यूल को बंडल से भौतिक रूप से बाहर करने के लिए `minimal` पर सेट करें)। | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ स्टैंडअलोन आउटपुट_ | `scripts/build/colocate-standalone.mjs` | पोस्ट-बिल्ड कोलोकेशन चरण द्वारा उपयोग की जाने वाली स्टैंडअलोन आउटपुट डायरेक्टरी के लिए बिल्ड-टाइम ओवरराइड। यह रनटाइम सेटिंग नहीं है। | +| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(खाली)_ | `src/lib/cloudSync.ts` | क्लाउड सिंक प्रतिक्रियाओं के HMAC-SHA256 हस्ताक्षर को सत्यापित करने के लिए उपयोग किया जाने वाला साझा रहस्य। | +| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | क्लाउड सिंक एंडपॉइंट को स्थानीय क्रेडेंशियल को ओवरराइट करने की अनुमति देने के लिए `true` पर सेट करें। डिफ़ॉल्ट `false` है। | +| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | जब कोई स्थानीय रहस्य कॉन्फ़िगर नहीं किया गया हो तो अहस्ताक्षरित क्लाउड सिंक प्रतिक्रिया को अस्वीकार करने के लिए `true` पर सेट करें (#13679)। एक हस्ताक्षर जो मौजूद है, हमेशा सत्यापित होता है — और जब `OMNIROUTE_CLOUD_SYNC_SECRET` अनसेट होता है तो हमेशा अस्वीकृत होता है — इस फ़्लैग की परवाह किए बिना। v3.9 में डिफ़ॉल्ट लागू करने के लिए फ़्लिप करता है। | +| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | उपयोगकर्ता की पुष्टि के बिना v3.8.5 के वन-स्टेप "सब कुछ आयात करें" व्यवहार पर वापस जाने के लिए `true` पर सेट करें। | +| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, डैशबोर्ड, सिंक | OAuth `redirect_uri`, डैशबोर्ड लिंक और जेनरेट किए गए सार्वजनिक यूआरएल के लिए सार्वजनिक-सामने वाला यूआरएल। जब OAuth कॉलबैक या जेनरेट किए गए ब्राउज़र लिंक को एक कैननिकल रिवर्स-प्रॉक्सी होस्ट का उपयोग करना चाहिए तो इसे स्थिर सार्वजनिक यूआरएल पर सेट करें। | +| `NEXT_PUBLIC_CLOUD_URL` | _(खाली)_ | क्लाइंट-साइड | `CLOUD_URL` का क्लाइंट-साइड मिरर। | +| `NEXT_PUBLIC_APP_URL` | _(अनसेट)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL` के लिए लेगेसी फ़ॉलबैक। | +| `OMNIROUTE_PUBLIC_BASE_URL` | _(अनसेट)_ | सार्वजनिक-ओरिजिन रिज़ॉल्वर, इमेज URL | सार्वजनिक URL जनरेशन और गैर-डैशबोर्ड ब्राउज़र-ओरिजिन सत्यापन के लिए उपयोग किया जाने वाला उच्चतम-प्राथमिकता वाला ब्राउज़र-फेसिंग ओमनीराउट ओरिजिन। इसे तब सेट करें जब OpenWebUI या कोई अन्य रिले आंतरिक URL द्वारा ओमनीराउट तक पहुँचता है, लेकिन उपयोगकर्ता के ब्राउज़र को LAN, टनल या सार्वजनिक ओरिजिन से जेनरेटेड मीडिया प्राप्त करना होगा। `/v1` शामिल **न करें**। | +| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(अनसेट)_ | `open-sse/config/providerPluginManifestUrl.ts` | साइडकार क्लाइंट्स को विज्ञापित पूर्ण प्रदाता प्लगइन मैनिफेस्ट URL। जब अनसेट होता है, तो ओमनीराउट अनुरोध ओरिजिन या HOST/PORT से `/api/v1/provider-plugin-manifest` प्राप्त करता है। | +| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | अनुरोध ओरिजिन के बिना HOST/PORT से प्रदाता प्लगइन मैनिफेस्ट URL प्राप्त करते समय उपयोग किया जाने वाला प्रोटोकॉल। जब कोई स्पष्ट `OMNIROUTE_PROVIDER_MANIFEST_URL` सेट नहीं होता है, तो TLS-टर्मिनेटिंग सार्वजनिक प्रॉक्सी के पीछे `https` पर सेट करें। | +| `OMNIROUTE_TRUST_PROXY` | _(अनसेट)_ | `src/server/origin/publicOrigin.ts` | फ़ॉरवर्ड किए गए सार्वजनिक-ओरिजिन हेडर के लिए वैकल्पिक ट्रस्ट मोड। अनसेट = सुरक्षा निर्णयों के लिए `Forwarded` / `X-Forwarded-*` पर भरोसा न करें। `true` / `loopback` केवल टोकन-स्टैम्प्ड लूपबैक प्रॉक्सी से फ़ॉरवर्ड किए गए होस्ट/प्रोटो पर भरोसा करता है। `private` / `lan` निजी-LAN प्रॉक्सी पीयर्स पर भी भरोसा करता है। उत्पादन में स्पष्ट `NEXT_PUBLIC_BASE_URL` को प्राथमिकता दें। | +| `KIE_CALLBACK_URL` | _(अनसेट)_ | `open-sse/utils/kieTask.ts` | एसिंक्रोनस kie.ai जॉब्स के लिए सार्वजनिक कॉलबैक URL। `OMNIROUTE_KIE_CALLBACK_URL` और `OMNIROUTE_PUBLIC_URL` से पहले उच्चतम-प्राथमिकता वाला ओवरराइड। | +| `OMNIROUTE_KIE_CALLBACK_URL` | _(अनसेट)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL` की वैकल्पिक वर्तनी। जब प्राथमिक वेरिएबल अनसेट होता है तो फ़ॉलबैक होता है। | +| `OMNIROUTE_PUBLIC_URL` | _(अनसेट)_ | `open-sse/utils/kieTask.ts` | एसिंक कॉलबैक URL बनाने के लिए उपयोग किया जाने वाला सार्वजनिक ओरिजिन। kie.ai कॉलबैक के लिए निम्नतम-प्राथमिकता वाला फ़ॉलबैक; अन्य रिले के लिए एक सामान्य सार्वजनिक URL के रूप में भी उपयोग किया जाता है। | +| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | CrofAI कोटा लुकअप एंडपॉइंट जिसका उपयोग यूसेज पेज द्वारा किया जाता है। रिले / टेस्ट फिक्स्चर के लिए ओवरराइड। | +| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | आधिकारिक API-की-प्रमाणीकृत OpenCode Go यूसेज एंडपॉइंट जिसका उपयोग यूसेज पेज द्वारा किया जाता है। रिले / टेस्ट फिक्स्चर के लिए ओवरराइड। | +| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | क्लाइंट द्वारा न भेजे गए opencode-go/zen अपस्ट्रीम अनुरोधों पर OpenCode CLI पहचान हेडर (User-Agent, x-opencode-client/project, अनुरोध/सेशन UUIDs) को संश्लेषित करें, ताकि VPS एग्रेस पर Cloudflare उन्हें स्वीकार करे (#6210/#5997)। #10571 से डिफ़ॉल्ट रूप से चालू; `false`/`0`/`no`/`off` के साथ ऑप्ट आउट करें। | +| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | डिफ़ॉल्ट User-Agent जिसका उपयोग तब किया जाता है जब `OPENCODE_SYNTHESIZE_CLI_HEADERS` चालू होता है और कोई प्रति-प्रदाता `_USER_AGENT` ओवरराइड सेट नहीं होता है। केवल opencode एक्ज़ीक्यूटर्स पर लागू होता है। एक कीलेस अनुरोध पर अपस्ट्रीम गेट्स, एक कॉन्फ़िगर किया गया मान जिसमें `opencode/= 1.17>` नहीं होता है, उसे अस्वीकार करने के बजाय इस डिफ़ॉल्ट से बदल दिया जाता है। | +| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | संश्लेषित `x-opencode-client` हेडर के लिए मान जब `OPENCODE_SYNTHESIZE_CLI_HEADERS` चालू होता है। | +| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | जब `OPENCODE_SYNTHESIZE_CLI_HEADERS` चालू हो, तो संश्लेषित `x-opencode-project` हेडर के लिए मान। | +| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(unset)_ | `open-sse/executors/opencodeFreeTierContract.ts` | कीलेस OpenCode अनुरोधों (स्ट्रीमिंग फ्लैग और टूल सूची) के बॉडी को समायोजित करना बंद करने के लिए `off` पर सेट करें। हेडर अभी भी लागू होते हैं। प्रति अनुरोध पढ़ा जाता है, इसलिए कोई भी बदलाव तुरंत प्रभावी होता है। | +| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(unset)_ | `open-sse/executors/opencodeFreeTierContract.ts` | कॉमा-सेपरेटेड टूल नाम जिन्हें एक कीलेस OpenCode अनुरोध पर घोषित किया जाना है जिसमें कोई टूल नहीं है, जब उस मॉडल के लिए अभी तक कुछ भी नहीं देखा गया है। खाली होने पर, यह एक सिंगल प्लेसहोल्डर पर वापस आ जाता है जिसे मॉडल को कॉल न करने के लिए कहा जाता है। अधिकतम 32 प्रविष्टियाँ, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; अमान्य प्रविष्टियों को अनदेखा कर दिया जाता है। | +| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | कोटा स्क्रैपिंग के लिए उपयोग किया जाने वाला Ollama Cloud सेटिंग्स URL। रिले / टेस्ट फिक्स्चर के लिए ओवरराइड। | +| `OLLAMA_USAGE_COOKIE` | _(unset)_ | `open-sse/services/usage.ts` | सेटिंग्स-पेज कोटा स्क्रैपिंग के लिए उपयोग की जाने वाली Ollama Cloud `__Secure-session` कुकी। संवेदनशील; जब कई खाते कॉन्फ़िगर किए गए हों तो प्रति-कनेक्शन डैशबोर्ड फ़ील्ड को प्राथमिकता दें। | +| `OLLAMA_CLOUD_USAGE_COOKIE` | _(unset)_ | `open-sse/services/usage.ts` | वैकल्पिक Ollama Cloud `__Secure-session` कुकी env var। संवेदनशील; जब कई खाते कॉन्फ़िगर किए गए हों तो प्रति-कनेक्शन डैशबोर्ड फ़ील्ड को प्राथमिकता दें। | +| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(unset)_ | `open-sse/services/usage.ts` | छोटे उपनामों से पहले उपयोग किया जाने वाला वैकल्पिक Ollama Cloud `__Secure-session` कुकी env var। संवेदनशील; जब कई खाते कॉन्फ़िगर किए गए हों तो प्रति-कनेक्शन डैशबोर्ड फ़ील्ड को प्राथमिकता दें। | +| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) उपयोग सीमा एंडपॉइंट। रिले / टेस्ट फिक्स्चर के लिए ओवरराइड। | > [!IMPORTANT] -> रिवर्स प्रॉक्सी (nginx, Caddy) के पीछे डिप्लॉय करते समय, यदि OAuth कॉलबैक या जनरेट किए गए सार्वजनिक लिंक को उस होस्टनाम का उपयोग करना आवश्यक हो, तो `NEXT_PUBLIC_BASE_URL` को अपने स्थिर सार्वजनिक URL (उदा., `https://omniroute.example.com`) पर सेट करें। इसके बिना OAuth कॉलबैक विफल हो सकते हैं, क्योंकि redirect_uri मेल नहीं खाएगा, और जनरेट किए गए सार्वजनिक लिंक आंतरिक कंटेनर ओरिजिन की ओर संकेत कर सकते हैं। +> जब एक रिवर्स प्रॉक्सी (nginx, Caddy) के पीछे डिप्लॉय कर रहे हों, तो `NEXT_PUBLIC_BASE_URL` को अपने स्थिर सार्वजनिक URL (जैसे, `https://omniroute.example.com`) पर सेट करें जब OAuth कॉलबैक या जेनरेट किए गए सार्वजनिक लिंक को उस होस्टनाम का उपयोग करना हो। इसके बिना, OAuth कॉलबैक विफल हो सकते हैं क्योंकि `redirect_uri` मेल नहीं खाएगा और जेनरेट किए गए सार्वजनिक लिंक आंतरिक कंटेनर ओरिजिन की ओर इशारा कर सकते हैं। > -> सर्वर-से-सर्वर जॉब्स के लिए `BASE_URL` को आंतरिक लूपबैक/कंटेनर URL के रूप में रखें। क्रेडेंशियल युक्त आंतरिक सेल्फ़-फ़ेच के लिए ब्राउज़र `Origin` या सार्वजनिक होस्टनाम का उपयोग न करें। +> सर्वर-टू-सर्वर जॉब्स के लिए `BASE_URL` को एक आंतरिक लूपबैक/कंटेनर URL के रूप में रखें। क्रेडेंशियल-बेयरिंग आंतरिक सेल्फ-फेच के लिए ब्राउज़र `Origin` या सार्वजनिक होस्टनाम का उपयोग न करें। > -> प्रमाणीकृत Dashboard राइट्स के लिए स्थिर सार्वजनिक बेस URL आवश्यक नहीं है: Dashboard, सेशन-बाउंड CSRF टोकन के साथ सेम-ओरिजिन असुरक्षित अनुरोध भेजता है। OmniRoute गैर-Dashboard ब्राउज़र इंटीग्रेशन के लिए सार्वजनिक-ओरिजिन सत्यापन को अब भी केंद्रीकृत करता है: स्पष्ट सार्वजनिक URL env vars पर पहले भरोसा किया जाता है; अपरिष्कृत `Forwarded` / `X-Forwarded-*` हेडर्स को तब तक अनदेखा किया जाता है, जब तक `OMNIROUTE_TRUST_PROXY` सक्षम न हो और निकटतम प्रॉक्सी पीयर को टोकन द्वारा विश्वसनीय चिह्नित न किया गया हो। सेम-ओरिजिन Dashboard अनुरोधों को ठीक करने के लिए CORS सेटिंग्स का उपयोग न करें; CORS केवल क्रॉस-ओरिजिन ब्राउज़र क्लाइंट्स के लिए है। +> प्रमाणीकृत डैशबोर्ड राइट्स के लिए एक स्थिर सार्वजनिक बेस URL की आवश्यकता नहीं होती है: डैशबोर्ड एक सत्र-बाउंड CSRF टोकन के साथ समान-ओरिजिन असुरक्षित अनुरोध भेजता है। OmniRoute अभी भी गैर-डैशबोर्ड ब्राउज़र एकीकरणों के लिए सार्वजनिक-ओरिजिन सत्यापन को केंद्रीकृत करता है: स्पष्ट सार्वजनिक URL env vars को पहले विश्वसनीय माना जाता है; कच्चे `Forwarded` / `X-Forwarded-*` हेडर्स को अनदेखा कर दिया जाता है जब तक कि `OMNIROUTE_TRUST_PROXY` सक्षम न हो और तत्काल प्रॉक्सी पीयर को विश्वसनीय के रूप में टोकन-स्टैंप न किया गया हो। समान-ओरिजिन डैशबोर्ड अनुरोधों को ठीक करने के लिए CORS सेटिंग्स का उपयोग न करें; CORS केवल क्रॉस-ओरिजिन ब्राउज़र क्लाइंट के लिए है। --- @@ -580,49 +578,163 @@ CLI_CLAUDE_BIN=/host-cli/bin/claude --- + +Alright, I'm processing this request to translate some markdown content into Hindi. My primary goal here is to meticulously go through each line and convert the prose while ensuring all the markdown formatting remains precisely as it is. + +There are specific elements I absolutely _must not_ translate. These include variable names (like `CLAUDE_OAUTH_CLIENT_ID`), provider names (such as Claude Code, Anthropic, OpenAI, Google, Moonshot, GitHub Copilot, GHE Copilot, Windsurf, Devin CLI, GitLab Duo), URLs (e.g., `https://platform.claude.com/oauth/code/callback`), file paths (like `open-sse/executors/devin-cli.ts`), code snippets (`api, read_user, openid, profile, email`), version numbers (e.g., v3.8), command names (`devin`), headers (`Copilot-Integration-Id`, `Editor-Plugin-Version`), and default values (`copilot-developer-cli`). This is crucial for maintaining the technical integrity of the original content. + +Let's break down the translation process, line by line: + +First, I'm looking at the main heading: "11. OAuth Provider Credentials". I'll translate this to "11. OAuth प्रदाता क्रेडेंशियल". + +Next, the introductory sentence: "Built-in credentials for **localhost development**. For remote deployments, register your own at each provider's developer console." +I'll translate the first part to "**localhost विकास** के लिए अंतर्निहित क्रेडेंशियल।" +And the second part to "रिमोट डिप्लॉयमेंट के लिए, प्रत्येक प्रदाता के डेवलपर कंसोल पर अपना पंजीकरण करें।" + +Then comes the table. I need to translate the headers: + +- "Variable" becomes "वेरिएबल". +- "Provider" becomes "प्रदाता". +- "Notes" becomes "टिप्पणियाँ". + +Now, I'll go through each row's "Notes" column and translate them carefully, remembering the exclusion list. + +For the `CLAUDE_OAUTH_CLIENT_ID` row (Provider: Claude Code (Anthropic)): + +- The note is "Public client — no secret needed." I'll translate this to "सार्वजनिक क्लाइंट — किसी गुप्त कुंजी की आवश्यकता नहीं।" + +For the `CLAUDE_CODE_REDIRECT_URI` row (Provider: Claude Code): + +- The note has two parts: "Override redirect URI." and "Default: `https://platform.claude.com/oauth/code/callback`". +- "Override redirect URI." translates to "रीडायरेक्ट URI को ओवरराइड करें।" +- "Default:" translates to "डिफ़ॉल्ट:" (the URL itself remains untranslated). + +For the `CODEX_OAUTH_CLIENT_ID` row (Provider: Codex / OpenAI): + +- The note is "Public client." I'll translate this to "सार्वजनिक क्लाइंट।" + +For the `GEMINI_OAUTH_CLIENT_ID` row (Provider: Gemini (Google)): + +- The note is "Requires matching `_SECRET`." This translates to "मिलान करने वाले `_SECRET` की आवश्यकता है।" + +For the `GEMINI_OAUTH_CLIENT_SECRET` row (Provider: Gemini (Google)): + +- The note is "—". This requires no translation. + +For the `KIMI_CODING_OAUTH_CLIENT_ID` row (Provider: Kimi Coding (Moonshot)): + +- The note is "Public client." Translates to "सार्वजनिक क्लाइंट।" + +For the `ANTIGRAVITY_OAUTH_CLIENT_ID` row (Provider: Antigravity (Google)): + +- The note is "Requires matching `_SECRET`." Translates to "मिलान करने वाले `_SECRET` की आवश्यकता है।" + +For the `ANTIGRAVITY_OAUTH_CLIENT_SECRET` row (Provider: Antigravity (Google)): + +- The note is "—". No translation needed. + +For the `GITHUB_OAUTH_CLIENT_ID` row (Provider: GitHub Copilot): + +- The note is "Public client." Translates to "सार्वजनिक क्लाइंट।" + +For the `GHE_COPILOT_OAUTH_CLIENT_ID` row (Provider: GHE Copilot): + +- The note has two parts: "Optional override for GitHub Enterprise Copilot's OAuth client id." and "Falls back to `GITHUB_OAUTH_CLIENT_ID`'s public default when unset." +- The first part translates to "GitHub Enterprise Copilot के OAuth क्लाइंट आईडी के लिए वैकल्पिक ओवरराइड।" +- The second part translates to "अनसेट होने पर `GITHUB_OAUTH_CLIENT_ID` के सार्वजनिक डिफ़ॉल्ट पर वापस आता है।" + +For the `COPILOT_INTEGRATION_ID` row (Provider: GitHub Copilot): + +- The note has two parts: "Optional override for the GitHub Copilot client integration ID sent in `Copilot-Integration-Id` and `Editor-Plugin-Version` headers." and "Defaults to `copilot-developer-cli`." +- The first part translates to "`Copilot-Integration-Id` और `Editor-Plugin-Version` हेडर में भेजे गए GitHub Copilot क्लाइंट इंटीग्रेशन आईडी के लिए वैकल्पिक ओवरराइड।" +- The second part translates to "डिफ़ॉल्ट `copilot-developer-cli` है।" + +For the `WINDSURF_API_KEY` row (Provider: Windsurf / Devin (v3.8)): + +- The note has two parts: "API key fallback used by `open-sse/executors/devin-cli.ts` when no per-connection credential is available." and "Optional." +- The first part translates to "`open-sse/executors/devin-cli.ts` द्वारा उपयोग की जाने वाली API कुंजी फ़ॉलबैक जब कोई प्रति-कनेक्शन क्रेडेंशियल उपलब्ध न हो।" +- The second part translates to "वैकल्पिक।" + +For the `CLI_DEVIN_BIN` row (Provider: Devin CLI (v3.8)): + +- The note has two parts: "Custom path to the Devin CLI binary (`devin`)." and "Resolved by `open-sse/executors/devin-cli.ts`." +- The first part translates to "Devin CLI बाइनरी (`devin`) का कस्टम पाथ।" +- The second part translates to "`open-sse/executors/devin-cli.ts` द्वारा हल किया गया।" + +For the `GITLAB_DUO_OAUTH_CLIENT_ID` row (Provider: GitLab Duo (v3.8)): + +- The note has three parts: "OAuth client ID for GitLab Duo." "Register an app at `https://gitlab.com/-/profile/applications` with redirect URI `/callback` and scopes `api, read_user, openid, profile, email`." and "Falls back to `GITLAB_OAUTH_CLIENT_ID`." +- The first part translates to "GitLab Duo के लिए OAuth क्लाइंट आईडी।" +- The second part translates to "`https://gitlab.com/-/profile/applications` पर एक ऐप पंजीकृत करें जिसमें रीडायरेक्ट URI `/callback` और स्कोप `api, read_user, openid, profile, email` हों।" (The URL and scopes remain untranslated as per instructions). +- The third part translates to "`GITLAB_OAUTH_CLIENT_ID` पर वापस आता है।" + +For the `GITLAB_DUO_OAUTH_CLIENT_SECRET` row (Provider: GitLab Duo (v3.8)): + +- The note has three parts: "OAuth client secret for GitLab Duo." "Optional — PKCE flow does not require a secret." and "Falls back to `GITLAB_OAUTH_CLIENT_SECRET`." +- The first part translates to "GitLab Duo के लिए OAuth क्लाइंट सीक्रेट।" +- The second part translates to "वैकल्पिक — PKCE फ़्लो को गुप्त कुंजी की आवश्यकता नहीं होती है।" +- The third part translates to "`GITLAB_OAUTH_CLIENT_SECRET` पर वापस आता है।" + +For the `GITLAB_DUO_BASE_URL` row (Provider: GitLab Duo (v3.8)): + +- The note has three parts: "Override GitLab base URL (self-hosted GitLab)." "Defaults to `https://gitlab.com`." and "Falls back to `GITLAB_BASE_URL`." +- The first part translates to "GitLab बेस URL (स्व-होस्टेड GitLab) को ओवरराइड करें।" +- The second part translates to "डिफ़ॉल्ट `https://gitlab.com` है।" (The URL remains untranslated). +- The third part translates to "`GITLAB_BASE_URL` पर वापस आता है।" + +For the `GITLAB_BASE_URL` row (Provider: GitLab Duo (v3.8)): + +- The note has two parts: "Legacy fallback for `GITLAB_DUO_BASE_URL`." and "Used when the `_DUO_` variant is unset." +- The first part translates to "`GITLAB_DUO_BASE_URL` के लिए लेगेसी फ़ॉलबैक।" +- The second part translates to "जब `_DUO_` वेरिएंट अनसेट होता है तो उपयोग किया जाता है।" + +It looks like I've covered all the necessary translations while adhering strictly to the exclusions. The process is complete and the output is ready. + + ## 11. OAuth प्रदाता क्रेडेंशियल -**localhost डेवलपमेंट** के लिए अंतर्निहित क्रेडेंशियल। रिमोट डिप्लॉयमेंट के लिए, प्रत्येक प्रदाता के डेवलपर कंसोल पर अपने क्रेडेंशियल पंजीकृत करें। - -| वेरिएबल | प्रदाता | टिप्पणियाँ | -| --------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | सार्वजनिक क्लाइंट — किसी सीक्रेट की आवश्यकता नहीं। | -| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | रीडायरेक्ट URI को ओवरराइड करता है। डिफ़ॉल्ट: `https://platform.claude.com/oauth/code/callback` | -| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | सार्वजनिक क्लाइंट। | -| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | मेल खाते `_SECRET` की आवश्यकता है। | -| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | -| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | सार्वजनिक क्लाइंट। | -| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | मेल खाते `_SECRET` की आवश्यकता है। | -| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | -| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | सार्वजनिक क्लाइंट। | -| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot की OAuth क्लाइंट आईडी के लिए वैकल्पिक ओवरराइड। सेट न होने पर `GITHUB_OAUTH_CLIENT_ID` के सार्वजनिक डिफ़ॉल्ट का उपयोग करता है। | -| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | जब कोई प्रति-कनेक्शन क्रेडेंशियल उपलब्ध न हो, तब `open-sse/executors/devin-cli.ts` द्वारा उपयोग की जाने वाली फ़ॉलबैक API कुंजी। वैकल्पिक। | -| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI बाइनरी (`devin`) का कस्टम पथ। `open-sse/executors/devin-cli.ts` द्वारा रिज़ॉल्व किया जाता है। | -| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo के लिए OAuth क्लाइंट आईडी। `https://gitlab.com/-/profile/applications` पर रीडायरेक्ट URI `/callback` और स्कोप `api, read_user, openid, profile, email` के साथ एक ऐप पंजीकृत करें। फ़ॉलबैक के रूप में `GITLAB_OAUTH_CLIENT_ID` का उपयोग करता है। | -| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo के लिए OAuth क्लाइंट सीक्रेट। वैकल्पिक — PKCE फ़्लो के लिए सीक्रेट आवश्यक नहीं है। फ़ॉलबैक के रूप में `GITLAB_OAUTH_CLIENT_SECRET` का उपयोग करता है। | -| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab बेस URL (स्वयं-होस्टेड GitLab) को ओवरराइड करता है। डिफ़ॉल्ट `https://gitlab.com` है। फ़ॉलबैक के रूप में `GITLAB_BASE_URL` का उपयोग करता है। | -| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` के लिए लेगेसी फ़ॉलबैक। `_DUO_` वेरिएंट सेट न होने पर उपयोग किया जाता है। | -| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` द्वारा उपयोग किए जाने वाले `GITLAB_DUO_OAUTH_CLIENT_ID` के लिए लेगेसी फ़ॉलबैक। | -| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` द्वारा उपयोग किए जाने वाले `GITLAB_DUO_OAUTH_CLIENT_SECRET` के लिए लीगेसी फ़ॉलबैक। | -| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | -| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth सक्षम करने के लिए सेट करें। | -| `QODER_OAUTH_TOKEN_URL` | Qoder | — | -| `QODER_OAUTH_USERINFO_URL` | Qoder | — | -| `QODER_OAUTH_CLIENT_ID` | Qoder | — | -| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | प्रत्यक्ष API कुंजी फ़ॉलबैक (OAuth को बायपास करता है)। | -| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI के लिए वर्कस्पेस ID। | -| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE` का उपनाम। | -| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI कॉन्फ़िगरेशन डायरेक्टरी को ओवरराइड करें (पृथक PAT सत्र, ब्राउज़र लॉगिन को अधिलेखित करने से बचाता है)। | -| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat` पर `validated` के रूप में भेजा जाने वाला फ़्रंटएंड `tk` टोकन। जब Blackbox टोकन मिलान लागू करता है, तब यह आवश्यक है; अन्यथा OmniRoute किसी यादृच्छिक UUID पर फ़ॉलबैक करता है। समस्या #2252 देखें। | -| `VISION_BRIDGE_BASE_URL` | Vision Bridge गार्डरेल | गैर-Anthropic vision-bridge कॉल के लिए OpenAI-संगत बेस URL। डिफ़ॉल्ट रूप से लीगेसी OpenAI URL env या api.openai.com का उपयोग करता है। इसे OmniRoute के `/v1` सेल्फ़-लूप या किसी भी OpenAI-संगत एंडपॉइंट (Gemini OpenAI-संगत, OpenRouter) पर इंगित करें। समस्या #2232। जब URL OmniRoute का अपना `/v1` होता है, तो विवरण सब-अनुरोध `x-omniroute-admission-bypass: internal` भेजता है और समाधान किए गए सेल्फ़-लूप क्रेडेंशियल (स्थानीय मोड में `sk_omniroute` सेंटिनल, या `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) से प्रमाणीकरण करता है, ताकि `REQUIRE_API_KEY=true` डिप्लॉयमेंट काम करें। | -| `VISION_BRIDGE_API_KEY` | Vision Bridge गार्डरेल | ऊपर दिए गए URL के लिए API कुंजी। गैर-Anthropic vision-bridge कॉल के लिए प्रति-प्रदाता OpenAI / Google env वेरिएबल को ओवरराइड करती है। Anthropic मॉडल अपने समर्पित Anthropic कुंजी पथ का उपयोग जारी रखते हैं। समस्या #2232। | +**localhost विकास** के लिए अंतर्निहित क्रेडेंशियल। रिमोट डिप्लॉयमेंट के लिए, प्रत्येक प्रदाता के डेवलपर कंसोल पर अपना पंजीकरण करें। + +| वेरिएबल | प्रदाता | टिप्पणियाँ | +| :-------------------------------- | :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | सार्वजनिक क्लाइंट — किसी गुप्त कुंजी की आवश्यकता नहीं। | +| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | रीडायरेक्ट URI को ओवरराइड करें। डिफ़ॉल्ट: `https://platform.claude.com/oauth/code/callback` | +| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | सार्वजनिक क्लाइंट। | +| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | मिलान करने वाले `_SECRET` की आवश्यकता है। | +| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | +| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | सार्वजनिक क्लाइंट। | +| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | मिलान करने वाले `_SECRET` की आवश्यकता है। | +| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | +| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | सार्वजनिक क्लाइंट। | +| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot के OAuth क्लाइंट आईडी के लिए वैकल्पिक ओवरराइड। अनसेट होने पर `GITHUB_OAUTH_CLIENT_ID` के सार्वजनिक डिफ़ॉल्ट पर वापस आता है। | +| `COPILOT_INTEGRATION_ID` | GitHub Copilot | `Copilot-Integration-Id` और `Editor-Plugin-Version` हेडर में भेजे गए GitHub Copilot क्लाइंट इंटीग्रेशन आईडी के लिए वैकल्पिक ओवरराइड। डिफ़ॉल्ट `copilot-developer-cli` है। | +| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | `open-sse/executors/devin-cli.ts` द्वारा उपयोग की जाने वाली API कुंजी फ़ॉलबैक जब कोई प्रति-कनेक्शन क्रेडेंशियल उपलब्ध न हो। वैकल्पिक। | +| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI बाइनरी (`devin`) का कस्टम पाथ। `open-sse/executors/devin-cli.ts` द्वारा हल किया गया। | +| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo के लिए OAuth क्लाइंट आईडी। `https://gitlab.com/-/profile/applications` पर एक ऐप पंजीकृत करें जिसमें रीडायरेक्ट URI `/callback` और स्कोप `api, read_user, openid, profile, email` हों। `GITLAB_OAUTH_CLIENT_ID` पर वापस आता है। | +| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo के लिए OAuth क्लाइंट सीक्रेट। वैकल्पिक — PKCE फ़्लो को गुप्त कुंजी की आवश्यकता नहीं होती है। `GITLAB_OAUTH_CLIENT_SECRET` पर वापस आता है। | +| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab बेस URL (स्व-होस्टेड GitLab) को ओवरराइड करें। डिफ़ॉल्ट `https://gitlab.com` है। `GITLAB_BASE_URL` पर वापस आता है। | +| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | `GITLAB_DUO_BASE_URL` के लिए लेगेसी फ़ॉलबैक। जब `_DUO_` वेरिएंट अनसेट होता है तो उपयोग किया जाता है। | +| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | `GITLAB_DUO_OAUTH_CLIENT_ID` के लिए लेगेसी फ़ॉलबैक जिसे `src/lib/oauth/constants/oauth.ts` द्वारा उपयोग किया जाता है। | +| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `GITLAB_DUO_OAUTH_CLIENT_SECRET` के लिए लेगेसी फ़ॉलबैक जिसे `src/lib/oauth/constants/oauth.ts` द्वारा उपयोग किया जाता है। | +| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | +| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth सक्षम करने के लिए सेट करें। | +| `QODER_OAUTH_TOKEN_URL` | Qoder | — | +| `QODER_OAUTH_USERINFO_URL` | Qoder | — | +| `QODER_OAUTH_CLIENT_ID` | Qoder | — | +| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | सीधा API कुंजी फ़ॉलबैक (OAuth को बायपास करता है)। | +| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI के लिए वर्कस्पेस ID। | +| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE` का उपनाम। | +| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI कॉन्फ़िग डायरेक्टरी को ओवरराइड करें (अलग PAT सत्र, ब्राउज़र लॉगिन को खराब होने से बचाता है)। | +| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | फ्रंटएंड `tk` टोकन जिसे `/api/chat` पर `validated` के रूप में भेजा जाना है। जब ब्लैकबॉक्स टोकन मिलान लागू करता है तो आवश्यक है; अन्यथा OmniRoute एक रैंडम UUID पर वापस आ जाता है। मुद्दा #2252 देखें। | +| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | गैर-एंथ्रोपिक विजन-ब्रिज कॉल्स के लिए OpenAI-संगत बेस URL। डिफ़ॉल्ट रूप से लेगेसी OpenAI URL env या api.openai.com पर सेट होता है। OmniRoute के `/v1` सेल्फ-लूप या किसी भी OpenAI-संगत एंडपॉइंट (जेमिनी OpenAI-संगत, OpenRouter) पर इंगित करें। मुद्दा #2232। जब URL OmniRoute का अपना `/v1` होता है, तो वर्णन सब-रिक्वेस्ट `x-omniroute-admission-bypass: internal` भेजता है और हल किए गए सेल्फ-लूप क्रेडेंशियल (`sk_omniroute` लोकल मोड में सेंटिनल, या `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) के साथ प्रमाणित करता है ताकि `REQUIRE_API_KEY=true` डिप्लॉयमेंट काम करें। | +| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | ऊपर दिए गए URL के लिए API कुंजी। गैर-एंथ्रोपिक विजन-ब्रिज कॉल्स के लिए प्रति-प्रदाता OpenAI / Google env vars को ओवरराइड करता है। एंथ्रोपिक मॉडल अपने समर्पित एंथ्रोपिक कुंजी पथ को बनाए रखते हैं। मुद्दा #2232। | > [!WARNING] > > 1. [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) पर जाएँ -> 2. एक OAuth 2.0 Client ID बनाएँ (प्रकार: "वेब एप्लिकेशन") +> 2. एक OAuth 2.0 क्लाइंट ID बनाएँ (प्रकार: "वेब एप्लिकेशन") > 3. अपने सर्वर URL को अधिकृत रीडायरेक्ट URI के रूप में जोड़ें -> 4. `.env` में क्रेडेंशियल मान बदलें। +> 4. `.env` में क्रेडेंशियल मानों को बदलें। --- @@ -730,134 +842,130 @@ Docker या हेडलेस डिप्लॉयमेंट के लि ### टाइमआउट पदानुक्रम ``` -REQUEST_TIMEOUT_MS (वैश्विक ओवरराइड) -├─→ FETCH_TIMEOUT_MS (अपस्ट्रीम प्रदाता कॉल, डिफ़ॉल्ट: 600000) -│ ├─→ FETCH_HEADERS_TIMEOUT_MS (FETCH_TIMEOUT_MS से इनहेरिट करता है) -│ ├─→ FETCH_BODY_TIMEOUT_MS (FETCH_TIMEOUT_MS से इनहेरिट करता है) -│ ├─→ TLS_CLIENT_TIMEOUT_MS (FETCH_TIMEOUT_MS से इनहेरिट करता है) -│ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (स्वतंत्र, डिफ़ॉल्ट: 10000) -│ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (स्वतंत्र, डिफ़ॉल्ट: 15000) -│ ├── FETCH_CONNECT_TIMEOUT_MS (स्वतंत्र, डिफ़ॉल्ट: 30000) -│ └── FETCH_KEEPALIVE_TIMEOUT_MS (स्वतंत्र, डिफ़ॉल्ट: 4000) -├─→ STREAM_IDLE_TIMEOUT_MS (REQUEST_TIMEOUT_MS से इनहेरिट करता है, डिफ़ॉल्ट: 600000) -├─→ STREAM_ACTIVE_TIMEOUT_MS (स्वतंत्र, डिफ़ॉल्ट: 1260000; 0 अक्षम करता है) -├─→ STREAM_READINESS_TIMEOUT_MS (REQUEST_TIMEOUT_MS से इनहेरिट करता है, डिफ़ॉल्ट: 80000) -├─→ STREAM_READINESS_MAX_TIMEOUT_MS (अनुकूली तैयारी विस्तार को सीमित करता है, डिफ़ॉल्ट: 180000) -└─→ API_BRIDGE_PROXY_TIMEOUT_MS (REQUEST_TIMEOUT_MS से इनहेरिट करता है, डिफ़ॉल्ट: 30000) - ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (व्युत्पन्न, डिफ़ॉल्ट: 300000) - ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (डिफ़ॉल्ट: 60000) - ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (डिफ़ॉल्ट: 5000) - └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (डिफ़ॉल्ट: 0 = अक्षम) +REQUEST_TIMEOUT_MS (global override) +├─→ FETCH_TIMEOUT_MS (upstream provider calls, default: 600000) +│ ├─→ FETCH_HEADERS_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) +│ ├─→ FETCH_BODY_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) +│ ├─→ TLS_CLIENT_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) +│ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (independent, default: 10000) +│ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (independent, default: 15000) +│ ├── FETCH_CONNECT_TIMEOUT_MS (independent, default: 30000) +│ └── FETCH_KEEPALIVE_TIMEOUT_MS (independent, default: 4000) +├─→ STREAM_IDLE_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 600000) +├─→ STREAM_ACTIVE_TIMEOUT_MS (independent, default: 1260000; 0 disables) +├─→ STREAM_READINESS_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 80000) +├─→ STREAM_READINESS_MAX_TIMEOUT_MS (caps adaptive readiness extensions, default: 180000) +└─→ API_BRIDGE_PROXY_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 30000) + ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (derived, default: 300000) + ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (default: 60000) + ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (default: 5000) + └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (default: 0 = disabled) ``` -| वेरिएबल | डिफ़ॉल्ट | विवरण | -| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `REQUEST_TIMEOUT_MS` | _(सेट नहीं)_ | वैश्विक शॉर्टकट — `FETCH_TIMEOUT_MS` और `STREAM_IDLE_TIMEOUT_MS`, दोनों के डिफ़ॉल्ट मानों को ओवरराइड करता है। | -| `FETCH_TIMEOUT_MS` | `600000` | अपस्ट्रीम प्रदाता कॉल के लिए कुल HTTP अनुरोध टाइमआउट। | -| `STREAM_IDLE_TIMEOUT_MS` | `600000` | निरस्त करने से पहले अपस्ट्रीम से प्राप्त होने वाले रॉ बाइट्स के बीच अधिकतम मौन अवधि। विस्तारित-चिंतन मॉडल शायद ही कभी >90s के लिए रुकते हैं। | -| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | सक्रिय SSE स्ट्रीम का अधिकतम कुल जीवनकाल; यह अपस्ट्रीम बाइट्स पर कभी रीसेट नहीं होता और `REQUEST_TIMEOUT_MS` से स्वतंत्र है। इसे रजिस्ट्री में प्रति-मॉडल सबसे बड़े `timeoutMs` (1200000, Codex) में 60000 का मार्जिन जोड़कर निकाला गया है, ताकि अपने पूरे बजट तक चलने की अनुमति वाले मॉडल को उत्तर के बीच में कभी समाप्त न किया जाए। अक्षम करने के लिए इसे `0` पर सेट करें। | -| `OMNIROUTE_SSE_COMMENTS` | _(अक्षम)_ | क्या OmniRoute SSE `:` टिप्पणी पंक्तियाँ उत्सर्जित कर सकता है (उदा. `: keepalive` हार्टबीट और `x-omniroute-*` मेटाडेटा ट्रेलर)। यह डिफ़ॉल्ट रूप से अक्षम है (#10524), क्योंकि सख्त OpenAI-संगत क्लाइंट प्रत्येक SSE पंक्ति को JSON.parse करते हैं और `:` टिप्पणियों पर क्रैश हो जाते हैं; `data:` हार्टबीट अप्रभावित रहते हैं। इसे फिर से सक्षम करने के लिए `on`/`true`/`1`/`yes` पर सेट करें। `open-sse/utils/sseHeartbeat.ts` द्वारा उपयोग किया जाता है। | -| `STREAM_READINESS_TIMEOUT_MS` | `80000` | पहला गैर-पिंग SSE इवेंट प्राप्त करने का समय। सेट होने पर `REQUEST_TIMEOUT_MS` से मान प्राप्त करता है। | -| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | बड़े, टूल-प्रधान या उच्च-तर्क वाले स्ट्रीमिंग अनुरोधों के लिए अधिकतम अनुकूली प्रथम-इवेंट तत्परता अवधि। | -| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` ह्यूरिस्टिक के लिए किल-स्विच। पहचान पूरी तरह अक्षम करने के लिए `false`/`0`/`off` पर सेट करें — अनुरोध बॉडी/हेडर के कारण तत्परता टाइमआउट और स्ट्रीम रिकवरी कभी नहीं बढ़ाए जाते, जिससे क्लाइंट-नियंत्रित टाइमआउट प्रवर्धन कम होता है। | -| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | पहचाने गए `/goal` एजेंट रन या `x-omniroute-agent-goal` से बाध्य किए गए अनुरोधों के लिए अधिकतम प्रथम-इवेंट तत्परता अवधि। | -| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | पहचाने गए `/goal` एजेंट रन के लिए प्रारंभिक स्ट्रीम रिकवरी अपने-आप सक्षम करें। लक्ष्य-विशिष्ट ऑप्ट-इन को अक्षम करने के लिए `false`/`0`/`off` पर सेट करें। यह ऑपरेटर के डिफ़ॉल्ट के ऊपर केवल रिकवरी जोड़ सकता है — यह स्पष्ट `STREAM_RECOVERY_ENABLED`/DB सेटिंग्स ऑप्ट-आउट को कभी ओवरराइड नहीं करता। | -| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | गैर-मानक `codex.*` SSE इवेंट (उदा. `codex.rate_limits`) हटाएँ, जो OpenAI SDK के `responses.stream()` को 502 के साथ विफल कर देते हैं। डिफ़ॉल्ट रूप से चालू (#11014)। इन्हें अग्रेषित करने के लिए `0`/`false`/`no`/`off` पर सेट करें। | -| `OMNIROUTE_CODEX_APPSERVER_WS` | _(सेट नहीं)_ | वैकल्पिक Codex app-server ट्रांसपोर्ट। किसी स्थानीय `codex app-server` साइडकार का WebSocket एंडपॉइंट (`ws://`/`wss://`)। टोकन के साथ सेट किए जाने पर Codex अनुरोध HTTP Responses API के बजाय JSON-RPC के माध्यम से साइडकार तक रूट किए जाते हैं। इसे प्रति-कनेक्शन `providerSpecificData.codexAppServerUrl` के माध्यम से भी सेट किया जा सकता है। `open-sse/executors/codex/appServerConfig.ts` द्वारा उपयोग किया जाता है। | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(सेट नहीं)_ | app-server को प्रस्तुत किया जाने वाला इनलाइन क्षमता/बियरर टोकन। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerToken`। | -| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(सेट नहीं)_ | app-server क्षमता टोकन वाली फ़ाइल का पथ (`codex app-server --ws-token-file` से)। `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` सेट न होने पर उपयोग किया जाता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerTokenFile`। | -| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | वह कार्यशील डायरेक्टरी जिसमें app-server टर्न चलता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerCwd`। | -| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(सेट नहीं)_ | app-server टर्न को दी जाने वाली अनुमोदन नीति (उदा. `never`, `on-request`)। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerApprovalPolicy`। | -| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(सेट नहीं)_ | app-server टर्न को दी जाने वाली सैंडबॉक्स नीति (उदा. `read-only`, `workspace-write`, `danger-full-access`)। सेट न होने पर एक्ज़िक्यूटर डिफ़ॉल्ट रूप से `workspace-write` का उपयोग करता है (अधिक सुरक्षित; पहले `danger-full-access`)। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerSandbox`। | -| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-server के स्वयं के अनुमोदन प्रॉम्प्ट (होस्ट पर कमांड/फ़ाइल/अनुमति निष्पादन) को अपने-आप अनुमोदित करें। डिफ़ॉल्ट रूप से बंद — प्रॉम्प्ट अपने-आप अस्वीकार कर दिए जाते हैं; हार्नेस टूल कॉल अप्रभावित रहते हैं (वे अलग `item/tool/call` पासथ्रू से जाते हैं)। `true`/`1`/`yes` स्वीकार करता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerAutoApprove`। | -| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | प्रतिक्रिया हेडर प्राप्त करने का समय। | -| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | प्रत्येक प्रत्यक्ष बिना-प्रॉक्सी प्रयास के लिए प्रतिक्रिया शुरू होने की अधिकतम प्रतीक्षा अवधि (ms)। टाइमआउट होने पर नए सॉकेट पर एक बार पुनः प्रयास किया जाता है; सीमा अक्षम करने और पिछले व्यवहार को बनाए रखने के लिए `0` सेट करें। | -| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | संपूर्ण प्रतिक्रिया बॉडी प्राप्त करने का समय। | -| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP कनेक्शन स्थापित करने की टाइमआउट अवधि। | -| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | कीप-अलाइव सॉकेट की निष्क्रिय टाइमआउट अवधि। | -| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS फ़िंगरप्रिंट प्रॉक्सी (wreq-js) की टाइमआउट अवधि। | -| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | विशेष रूप से wreq-js TLS-फ़िंगरप्रिंट ट्रांसपोर्ट की बॉडी के पहले बाइट तक का समय सीमित करता है; केवल `TLS_CLIENT_TIMEOUT_MS` रुकी हुई बॉडी का पता नहीं लगा सकता, क्योंकि हेडर आते ही यह पूर्ण हो जाता है (#12656)। टाइमआउट होने पर wreq रीडर रद्द कर दिया जाता है और प्रत्यक्ष/प्रॉक्सी डिस्पैचर का उपयोग किया जाता है; `0` वॉचडॉग को अक्षम करता है। | -| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | केवल OpenCode एक्ज़ीक्यूटर के लिए, और केवल तब जब `OPENCODE_RESPONSES_STALL_ROTATION` फ़ीचर फ़्लैग चालू हो (डिफ़ॉल्ट रूप से बंद): हेडर आने के बाद स्ट्रीम की गई Responses प्रतिक्रिया की बॉडी के पहले बाइट की प्रतीक्षा को सीमित करता है (#13484)। Responses स्ट्रीम `response.created` के साथ खुलती है, इसलिए इस अवधि के बाद भी कोई डेटा न आना रुकावट माना जाता है: अकाउंट को कूलडाउन में डाल दिया जाता है और अनुरोध एक बार अगले अकाउंट पर रोटेट किया जाता है; दूसरी रुकावट पर तुरंत विफलता होती है। फ़्लैग चालू होने पर भी `0` इस सुरक्षा को अक्षम करता है। | -| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` ब्रिज अनुरोधों के लिए प्रॉक्सी हॉप की टाइमआउट अवधि। | -| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl वेब-फ़ेच एक्ज़ीक्यूटर को किसी स्वयं-होस्टेड इंस्टेंस पर निर्देशित करें (ऑफ़-क्लाउड में API कुंजी वैकल्पिक है)। | -| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl वेब-फ़ेच एक्ज़ीक्यूटर के लिए प्रति-अनुरोध टाइमआउट। | -| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | ब्रिज के लिए समग्र सर्वर अनुरोध टाइमआउट। | -| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | ब्रिज के माध्यम से प्रतिक्रिया हेडर भेजने का समय। | -| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | ब्रिज कीप-अलाइव निष्क्रिय टाइमआउट। | -| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | रॉ सॉकेट टाइमआउट (0 = अक्षम)। | -| `SHUTDOWN_TIMEOUT_MS` | `30000` | बलपूर्वक बाहर निकलने से पहले SIGTERM/SIGINT पर ग्रेस अवधि। | -| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` सेट न होने पर `src/shared/utils/fetchTimeout.ts` द्वारा उपयोग किया जाने वाला फ़ॉलबैक। | -| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts` में `validationRead` और `modelsProbe` प्रीसेट के लिए टाइमआउट (ms)। धीमे एंडपॉइंट (Cerebras, Cloudflare AI, Groq) के लिए इसे बढ़ाएँ, ताकि डैशबोर्ड में सक्रिय/त्रुटि अवस्थाओं के बीच बार-बार बदलाव को रोका जा सके। अमान्य (<1000) या गैर-सांख्यिक मानों के लिए 8000ms का फ़ॉलबैक उपयोग होता है। | -| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts` में रिले-विशिष्ट फ़ेच टाइमआउट (#9158)। अटका हुआ रिले क्लाइंट/एजेंट टाइमआउट (~30s) से पहले विफल होना चाहिए, ताकि कॉल करने वालों को सामान्य अपस्ट्रीम टाइमआउट के बजाय रिले-विशिष्ट विफलता दिखाई दे। इसे `29000` पर सीमित किया गया है, ताकि यह हमेशा पहले ट्रिगर हो। | -| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts` में प्रत्यक्ष/रिले/प्रॉक्सी के एक-बार-पुनः-प्रयास वाले पथों के लिए साझा पुनः प्रयास बैकऑफ़ (#9158)। `0` = तुरंत पुनः प्रयास करें। | -| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | नेटिव wreq-js अनुरोध टाइमआउट (`claudeTlsClient.ts`)। | -| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | नेटिव टाइमआउट के ऊपर जोड़ी गई पूर्ण JS हार्ड-डेडलाइन ग्रेस अवधि। | -| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | नेटिव wreq-js अनुरोध टाइमआउट (`perplexityTlsClient.ts`)। | -| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | नेटिव टाइमआउट के ऊपर जोड़ी गई पूर्ण JS हार्ड-डेडलाइन ग्रेस अवधि। | -| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (बंद) | कॉलर के सिस्टम संदेश में "आपके पास अंतर्निहित वेब खोज है। खोज परिणामों का उपयोग करके प्रश्नों का सीधे उत्तर दें।" जोड़ता है (`perplexity-web/protocol.ts`)। डिफ़ॉल्ट रूप से बंद — Perplexity वैसे भी खोज करता है, और यह वाक्य कोडिंग क्लाइंट के उत्तरों में मेटा-कमेंट्री के रूप में दिखाई देता है। पुनर्स्थापित करने के लिए `1`/`true`/`yes`/`on` सेट करें। | -| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | मूल wreq-js अनुरोध टाइमआउट (`grokTlsClient.ts`)। | -| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | मूल टाइमआउट के अतिरिक्त जोड़ी गई पूर्ण JS हार्ड-डेडलाइन छूट। | -| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | मूल wreq-js अनुरोध टाइमआउट (`notionTlsClient.ts`); लंबी जनरेशन के लिए `notion-web` इसे प्रति अनुरोध बढ़ाकर `180000` कर देता है। | -| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | मूल टाइमआउट के अतिरिक्त जोड़ी गई पूर्ण JS हार्ड-डेडलाइन छूट। | -| `OMNIROUTE_BROWSER_POOL` | `on` | ब्राउज़र-समर्थित वेब-कुकी चैट के लिए साझा Playwright ब्राउज़र पूल (`browserPool.ts`); अक्षम करने के लिए `off` सेट करें। | -| `OBSCURA_BIN` | `auto-detect` | ब्राउज़र पूल और Cloudflare Playground एक्ज़ीक्यूटर द्वारा प्राथमिक इंजन के रूप में उपयोग की जाने वाली `obscura` बाइनरी का पथ (`open-sse/services/obscura.ts`); सेट न होने पर सिस्टम PATH से स्वतः पता लगाया जाता है। | -| `OBSCURA_CDP_ENDPOINT` | _(सेट नहीं)_ | नया इंस्टेंस शुरू करने के बजाय पहले से चल रहे Obscura (`http://host:port`) की ओर इंगित करें; मॉड्यूल उस प्रक्रिया का स्वामी नहीं होता (`open-sse/services/obscura.ts`)। | -| `OBSCURA_PORT` | `यादृच्छिक खाली पोर्ट` | शुरू किए गए `obscura serve` के लिए स्पष्ट पोर्ट; सेट न होने पर कोई खाली पोर्ट स्वचालित रूप से चुना जाता है (`open-sse/services/obscura.ts`)। | -| `WEB_COOKIE_USE_BROWSER` | `0` | किसी वेब-कुकी चैट अनुरोध के लिए ब्राउज़र-समर्थित पथ चुनें (`browserBackedChat.ts`); सक्षम करने के लिए `1`। | -| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (अंतरराष्ट्रीय kimi.ai Connect-RPC) एक्ज़ीक्यूटर के लिए आधार URL (`kimi-web.ts`); केवल मिरर/प्रॉक्सी एंडपॉइंट के लिए ओवरराइड करें। | -| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web एक्ज़ीक्यूटर के लिए पूर्ण चैट एंडपॉइंट (`kimi-web.ts`)। | -| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(स्वतः पता लगाया गया)_ | Adobe Firefly इंटरैक्टिव ब्राउज़र साइन-इन के लिए सिस्टम Chrome/Edge एक्ज़ीक्यूटेबल का पथ (`adobeFireflyBrowserLogin.ts`); प्रति-OS स्वतः-पहचान को ओवरराइड करता है। | -| `OMNIROUTE_STANDALONE_DIR` | _.build/ स्टैंडअलोन आउटपुट_ | पोस्ट-बिल्ड कोलोकेशन चरण द्वारा उपयोग की जाने वाली स्टैंडअलोन आउटपुट डायरेक्टरी के लिए बिल्ड-टाइम ओवरराइड (`scripts/build/colocate-standalone.mjs`); यह बिल्ड टूलिंग है, रनटाइम नहीं। | +| वेरिएबल | डिफ़ॉल्ट | विवरण | +| ----------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `REQUEST_TIMEOUT_MS` | _(अनसेट)_ | ग्लोबल शॉर्टकट — `FETCH_TIMEOUT_MS` और `STREAM_IDLE_TIMEOUT_MS` दोनों डिफ़ॉल्ट को ओवरराइड करता है। | +| `FETCH_TIMEOUT_MS` | `600000` | अपस्ट्रीम प्रदाता कॉल के लिए कुल HTTP अनुरोध टाइमआउट। | +| `STREAM_IDLE_TIMEOUT_MS` | `600000` | निरस्त करने से पहले कच्चे अपस्ट्रीम बाइट्स के बीच अधिकतम मौन। विस्तारित-सोच वाले मॉडल शायद ही कभी 90 सेकंड से अधिक रुकते हैं। | +| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | अधिकतम कुल सक्रिय SSE स्ट्रीम लाइफटाइम; अपस्ट्रीम बाइट्स पर कभी रीसेट नहीं होता है और `REQUEST_TIMEOUT_MS` से स्वतंत्र है। रजिस्ट्री में सबसे बड़े प्रति-मॉडल `timeoutMs` (1200000, कोडेक्स) से प्राप्त किया गया है, साथ ही 60000 का मार्जिन भी है, ताकि एक मॉडल को अपना पूरा बजट चलाने की अनुमति दी जाए, वह कभी भी बीच में ही समाप्त न हो। अक्षम करने के लिए `0` पर सेट करें। | +| `OMNIROUTE_SSE_COMMENTS` | _(अक्षम)_ | क्या ओमनीराउट SSE `:` टिप्पणी लाइनें उत्सर्जित कर सकता है (जैसे `: keepalive` हार्टबीट और `x-omniroute-*` मेटाडेटा ट्रेलर्स)। डिफ़ॉल्ट रूप से अक्षम (#10524) क्योंकि सख्त OpenAI-संगत क्लाइंट हर SSE लाइन को JSON.parse करते हैं और `:` टिप्पणियों पर क्रैश हो जाते हैं; `data:` हार्टबीट अप्रभावित रहते हैं। वापस ऑप्ट-इन करने के लिए `on`/`true`/`1`/`yes` पर सेट करें। `open-sse/utils/sseHeartbeat.ts` द्वारा उपयोग किया जाता है। | +| `STREAM_READINESS_TIMEOUT_MS` | `80000` | पहला गैर-पिंग SSE इवेंट प्राप्त करने का समय। सेट होने पर `REQUEST_TIMEOUT_MS` इनहेरिट करता है। | +| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | बड़े, टूल-भारी, या उच्च-तर्क स्ट्रीमिंग अनुरोधों के लिए अधिकतम अनुकूली प्रथम-इवेंट तत्परता विंडो। | +| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` ह्यूरिस्टिक के लिए किल-स्विच। पता लगाने को पूरी तरह से अक्षम करने के लिए `false`/`0`/`off` पर सेट करें — तत्परता टाइमआउट और स्ट्रीम रिकवरी को अनुरोध बॉडी/हेडर द्वारा कभी भी बढ़ाया नहीं जाता है, जिससे क्लाइंट-नियंत्रित टाइमआउट प्रवर्धन कम हो जाता है। | +| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | पता लगाए गए `/goal` एजेंट रन या `x-omniroute-agent-goal` के साथ मजबूर किए गए अनुरोधों के लिए अधिकतम प्रथम-इवेंट तत्परता विंडो। | +| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | पता लगाए गए `/goal` एजेंट रन के लिए स्वचालित रूप से प्रारंभिक स्ट्रीम रिकवरी सक्षम करें। लक्ष्य-विशिष्ट ऑप्ट-इन को अक्षम करने के लिए `false`/`0`/`off` पर सेट करें। यह ऑपरेटर डिफ़ॉल्ट के शीर्ष पर केवल रिकवरी जोड़ सकता है — यह कभी भी स्पष्ट `STREAM_RECOVERY_ENABLED`/DB सेटिंग्स ऑप्ट-आउट को ओवरराइड नहीं करता है। | +| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | गैर-मानक `codex.*` SSE इवेंट्स (जैसे `codex.rate_limits`) को हटा दें जो OpenAI SDK के `responses.stream()` को 502 के साथ तोड़ते हैं। डिफ़ॉल्ट ON (#11014)। उन्हें अग्रेषित करने के लिए `0`/`false`/`no`/`off` पर सेट करें। | +| `OMNIROUTE_CODEX_APPSERVER_WS` | _(अनसेट)_ | ऑप्ट-इन कोडेक्स ऐप-सर्वर ट्रांसपोर्ट। एक स्थानीय `codex app-server` साइडकार का वेबसॉकेट एंडपॉइंट (`ws://`/`wss://`)। जब एक टोकन के साथ सेट किया जाता है, तो कोडेक्स अनुरोध HTTP रिस्पॉन्स API के बजाय JSON-RPC पर साइडकार को रूट किए जाते हैं। `providerSpecificData.codexAppServerUrl` के माध्यम से प्रति-कनेक्शन भी सेट किया जा सकता है। `open-sse/executors/codex/appServerConfig.ts` द्वारा उपयोग किया जाता है। | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(अनसेट)_ | ऐप-सर्वर को प्रस्तुत इनलाइन क्षमता/वाहक टोकन। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerToken`। | +| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(अनसेट)_ | ऐप-सर्वर क्षमता टोकन वाली फ़ाइल का पथ (`codex app-server --ws-token-file` से)। जब `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` अनसेट होता है तो उपयोग किया जाता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerTokenFile`। | +| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | वर्किंग डायरेक्टरी जिसमें ऐप-सर्वर टर्न चलता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerCwd`। | +| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(अनसेट)_ | ऐप-सर्वर टर्न को पारित अनुमोदन नीति (जैसे `never`, `on-request`)। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerApprovalPolicy`। | +| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(अनसेट)_ | ऐप-सर्वर टर्न को पारित सैंडबॉक्स नीति (जैसे `read-only`, `workspace-write`, `danger-full-access`)। जब अनसेट होता है तो एक्ज़ीक्यूटर `workspace-write` (कठोर; पहले `danger-full-access`) पर डिफ़ॉल्ट होता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerSandbox`। | +| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | ऐप-सर्वर के स्वयं के अनुमोदन प्रॉम्प्ट (होस्ट पर कमांड/फ़ाइल/अनुमति निष्पादन) को स्वतः-अनुमोदित करें। डिफ़ॉल्ट रूप से बंद — प्रॉम्प्ट स्वतः-अस्वीकृत होते हैं; हार्नेस टूल कॉल अप्रभावित रहते हैं (वे अलग `item/tool/call` पासथ्रू से यात्रा करते हैं)। `true`/`1`/`yes` स्वीकार करता है। प्रति-कनेक्शन ओवरराइड: `providerSpecificData.codexAppServerAutoApprove`। | +| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | प्रतिक्रिया हेडर प्राप्त करने का समय। | +| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | प्रत्येक प्रत्यक्ष नो-प्रॉक्सी प्रयास के लिए अधिकतम प्रतिक्रिया-प्रारंभ प्रतीक्षा (मिलीसेकंड)। एक टाइमआउट एक नए सॉकेट पर एक बार पुनः प्रयास करता है; सीमा को अक्षम करने और पिछले व्यवहार को बनाए रखने के लिए `0` सेट करें। | +| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | ऊपर (#13703) एक पूल्ड-प्रयास प्रतिक्रिया-प्रारंभ टाइमआउट के बाद नए-सॉकेट RETRY प्रयास के लिए अधिकतम सीमा (मिलीसेकंड)। यह तभी लागू होता है जब कॉलर ने पहले ही अपना डेडलाइन सिग्नल (हल किया गया कनेक्शन/मॉडल/प्रदाता/`FETCH_TIMEOUT_MS` कैस्केड) संलग्न कर दिया हो; वह सिग्नल वास्तविक सीमा है और इच्छित पथ में सबसे पहले सक्रिय होता है, इसलिए यह एक उदार बैकस्टॉप है न कि एक सपाट सीमा — इसके बिना, पुनः प्रयास ने पूल्ड प्रयास के समान ही छोटी `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` विंडो का पुन: उपयोग किया और स्वस्थ धीमे-TTFB रीजनिंग मॉडल को 504 कर दिया। ऊपर की सपाट सीमा से नीचे कभी अनुमति नहीं है; जब कॉलर कोई डेडलाइन सिग्नल प्रदान नहीं करता है, तो पुनः प्रयास सपाट सीमा को अपरिवर्तित रखता है। | +| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | पूर्ण प्रतिक्रिया बॉडी प्राप्त करने का समय। | +| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP कनेक्शन स्थापित करने का टाइमआउट। | +| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | कीप-अलाइव सॉकेट निष्क्रिय टाइमआउट। | +| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS फिंगरप्रिंट प्रॉक्सी (wreq-js) टाइमआउट। | +| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | विशेष रूप से wreq-js TLS-फिंगरप्रिंट ट्रांसपोर्ट की बॉडी पर पहले बाइट तक के समय को सीमित करता है; `TLS_CLIENT_TIMEOUT_MS` अकेले एक अटकी हुई बॉडी को नहीं पकड़ सकता क्योंकि यह हेडर आते ही हल हो जाता है (#12656)। एक टाइमआउट wreq रीडर को रद्द कर देता है और प्रत्यक्ष/प्रॉक्सी डिस्पैचर पर वापस चला जाता है; `0` वॉचडॉग को अक्षम करता है। | +| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | केवल OpenCode एक्ज़ीक्यूटर के लिए, और केवल तभी जब `OPENCODE_RESPONSES_STALL_ROTATION` फीचर फ़्लैग चालू हो (डिफ़ॉल्ट रूप से बंद): इसके हेडर के बाद एक स्ट्रीम किए गए Responses रिप्लाई के पहले बॉडी बाइट के लिए प्रतीक्षा को सीमित करता है (#13484)। एक Responses स्ट्रीम `response.created` के साथ खुलती है, इसलिए इस विंडो के बाद की चुप्पी एक रुकावट है: खाते को ठंडा किया जाता है और अनुरोध एक बार अगले खाते में घूमता है; दूसरी रुकावट तेजी से विफल हो जाती है। फ़्लैग चालू होने पर भी `0` गार्ड को अक्षम करता है। | +| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` ब्रिज अनुरोधों के लिए प्रॉक्सी हॉप टाइमआउट। | +| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl वेब-फ़ेच एक्ज़ीक्यूटर को एक स्व-होस्टेड इंस्टेंस पर इंगित करें (API कुंजी ऑफ-क्लाउड वैकल्पिक)। | +| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl वेब-फ़ेच एक्ज़ीक्यूटर के लिए प्रति-अनुरोध टाइमआउट। | +| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | ब्रिज के लिए समग्र सर्वर अनुरोध टाइमआउट। | +| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | ब्रिज के माध्यम से प्रतिक्रिया हेडर भेजने का समय। | +| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | ब्रिज कीप-अलाइव निष्क्रिय टाइमआउट। | +| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | रॉ सॉकेट टाइमआउट (0 = अक्षम)। | +| `SHUTDOWN_TIMEOUT_MS` | `30000` | SIGTERM/SIGINT पर बलपूर्वक बाहर निकलने से पहले अनुग्रह अवधि। | +| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `src/shared/utils/fetchTimeout.ts` द्वारा उपयोग किया जाने वाला फ़ॉलबैक जब `FETCH_TIMEOUT_MS` अनसेट हो। | +| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts` में `validationRead` और `modelsProbe` प्रीसेट के लिए टाइमआउट (मिलीसेकंड)। डैशबोर्ड में सक्रिय/त्रुटि के बीच फ़्लैपिंग को रोकने के लिए धीमे एंडपॉइंट्स (Cerebras, Cloudflare AI, Groq) के लिए बढ़ाएँ। अमान्य (<1000) या गैर-संख्यात्मक मानों के लिए 8000ms पर वापस चला जाता है। | +| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts` (#9158) में रिले-विशिष्ट फ़ेच टाइमआउट। एक अटके हुए रिले को क्लाइंट/एजेंट टाइमआउट (~30s) से पहले विफल होना चाहिए ताकि कॉलर्स को एक सामान्य अपस्ट्रीम टाइमआउट के बजाय रिले-विशिष्ट विफलता दिखाई दे। इसे `29000` पर सीमित किया गया है ताकि यह हमेशा पहले सक्रिय हो। | +| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts` (#9158) में प्रत्यक्ष/रिले/प्रॉक्सी पुनः प्रयास-एक बार पथों के लिए साझा पुनः प्रयास बैकऑफ़। `0` = तुरंत पुनः प्रयास करें। | +| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | नेटिव wreq-js अनुरोध टाइमआउट (`claudeTlsClient.ts`)। | +| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | नेटिव टाइमआउट के ऊपर जोड़ी गई एब्सोल्यूट JS हार्ड-डेडलाइन ग्रेस। | +| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | नेटिव wreq-js अनुरोध टाइमआउट (`perplexityTlsClient.ts`)। | +| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | नेटिव टाइमआउट के ऊपर जोड़ी गई एब्सोल्यूट JS हार्ड-डेडलाइन ग्रेस। | +| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (off) | कॉलर के सिस्टम संदेश में "आपके पास अंतर्निहित वेब खोज है। खोज परिणामों का उपयोग करके सीधे प्रश्नों का उत्तर दें।" जोड़ता है (`perplexity-web/protocol.ts`)। डिफ़ॉल्ट रूप से बंद — परप्लेक्सिटी वैसे भी खोज करती है, और यह वाक्य कोडिंग क्लाइंट के लिए मेटा-कमेंट्री के रूप में उत्तरों में लीक हो जाता है। इसे पुनर्स्थापित करने के लिए `1`/`true`/`yes`/`on` सेट करें। | +| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | नेटिव wreq-js अनुरोध टाइमआउट (`grokTlsClient.ts`)। | +| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | नेटिव टाइमआउट के ऊपर जोड़ी गई एब्सोल्यूट JS हार्ड-डेडलाइन ग्रेस। | +| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | नेटिव wreq-js अनुरोध टाइमआउट (`notionTlsClient.ts`); `notion-web` लंबी जनरेशन के लिए इसे प्रति अनुरोध `180000` तक बढ़ा देता है। | +| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | नेटिव टाइमआउट के ऊपर जोड़ी गई एब्सोल्यूट JS हार्ड-डेडलाइन ग्रेस। | +| `OMNIROUTE_BROWSER_POOL` | `on` | ब्राउज़र-समर्थित वेब-कुकी चैट के लिए साझा Playwright ब्राउज़र पूल (`browserPool.ts`); अक्षम करने के लिए `off` सेट करें। | +| `OBSCURA_BIN` | `auto-detect` | ब्राउज़र पूल और Cloudflare Playground एक्ज़ीक्यूटर द्वारा प्राथमिक इंजन के रूप में उपयोग की जाने वाली `obscura` बाइनरी का पाथ (`open-sse/services/obscura.ts`); जब अनसेट हो तो सिस्टम PATH से स्वतः-पता लगाया जाता है। | +| `OBSCURA_CDP_ENDPOINT` | _(unset)_ | एक नया Obscura स्पॉन करने के बजाय पहले से चल रहे Obscura (`http://host:port`) को इंगित करें; मॉड्यूल उस प्रक्रिया का मालिक नहीं है (`open-sse/services/obscura.ts`)। | +| `OBSCURA_PORT` | `random free port` | स्पॉन किए गए `obscura serve` के लिए स्पष्ट पोर्ट; जब अनसेट हो तो एक खाली पोर्ट स्वचालित रूप से चुना जाता है (`open-sse/services/obscura.ts`)। | +| `WEB_COOKIE_USE_BROWSER` | `0` | वेब-कुकी चैट अनुरोध को ब्राउज़र-समर्थित पाथ में ऑप्ट-इन करें (`browserBackedChat.ts`); सक्षम करने के लिए `1`। | +| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (अंतर्राष्ट्रीय kimi.ai Connect-RPC) एक्ज़ीक्यूटर के लिए बेस URL (`kimi-web.ts`); केवल मिरर/प्रॉक्सी एंडपॉइंट के लिए ओवरराइड करें। | +| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web एक्ज़ीक्यूटर के लिए पूर्ण चैट एंडपॉइंट (`kimi-web.ts`)। | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(auto-detected)_ | Adobe Firefly इंटरैक्टिव ब्राउज़र साइन-इन के लिए एक सिस्टम Chrome/Edge निष्पादन योग्य का पाथ (`adobeFireflyBrowserLogin.ts`); प्रति-OS स्वतः-पहचान को ओवरराइड करता है। | +| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone output_ | पोस्ट-बिल्ड कोलोकेशन स्टेप द्वारा उपयोग की जाने वाली स्टैंडअलोन आउटपुट डायरेक्टरी के लिए बिल्ड-टाइम ओवरराइड (`scripts/build/colocate-standalone.mjs`); बिल्ड टूलिंग, रनटाइम नहीं। | कॉम्बो लक्ष्य प्रयास हल किए गए अपस्ट्रीम अनुरोध टाइमआउट (`FETCH_TIMEOUT_MS`, या -जब `REQUEST_TIMEOUT_MS` फ़ेच डिफ़ॉल्ट प्रदान करता है तब उसका मान) को इनहेरिट करते हैं। कॉम्बो, -कॉम्बो डिफ़ॉल्ट या प्रोवाइडर ओवरराइड में `targetTimeoutMs` केवल कॉम्बो फ़ॉलबैक को तेज़ बनाने के लिए -सेट करें; वर्तमान अपस्ट्रीम टाइमआउट से अधिक मान अपस्ट्रीम टाइमआउट तक सीमित कर दिए जाते हैं। +`REQUEST_TIMEOUT_MS` जब यह फ़ेच डिफ़ॉल्ट प्रदान करता है) को इनहेरिट करते हैं। कॉम्बो फ़ॉलबैक को तेज़ बनाने के लिए `targetTimeoutMs` को केवल कॉम्बो, कॉम्बो डिफ़ॉल्ट, या प्रोवाइडर ओवरराइड में सेट करें; वर्तमान अपस्ट्रीम टाइमआउट से ऊपर के मान अपस्ट्रीम टाइमआउट तक सीमित होते हैं। -`comboTimeoutMs` फ़ेलओवर लक्ष्यों में पूरे कॉम्बो के लिए एक अलग वॉल-क्लॉक बजट है। -असीमित पुनरावृत्ति बनाए रखने के लिए इसे सेट न करें या `0` पर छोड़ दें (10-मिनट का -`COMBO_LOOP_SAFETY_TIMEOUT_MS` हैंग-स्टॉप फिर भी लागू होता है)। कोई धनात्मक मान कॉम्बो के लिए उस -सुरक्षा तंत्र को प्रतिस्थापित कर देता है। `comboTimeoutMs` को `targetTimeoutMs` से अधिक रखें, ताकि धीमे -पहले लक्ष्य के बाद भी फ़ेलओवर के लिए समय बचा रहे। +`comboTimeoutMs` फ़ेलओवर लक्ष्यों में एक अलग पूरे-कॉम्बो वॉल-क्लॉक बजट है। असीमित पुनरावृति रखने के लिए इसे अनसेट या `0` छोड़ दें (10 मिनट का +`COMBO_LOOP_SAFETY_TIMEOUT_MS` हैंग-स्टॉप अभी भी लागू होता है)। एक सकारात्मक मान कॉम्बो के लिए उस सुरक्षा जाल को बदल देता है। `comboTimeoutMs` को `targetTimeoutMs` से अधिक लंबा रखें ताकि धीमे पहले लक्ष्य के बाद भी फ़ेलओवर के पास समय हो। ### सर्किट ब्रेकर थ्रेशोल्ड -प्रोवाइडर-स्तरीय सर्किट ब्रेकर ट्यूनिंग। डिफ़ॉल्ट वे स्केल किए गए मान दर्शाते हैं जो v3.6 से 500+ कनेक्शन के लिए उपयोग किए जाते हैं। - -| चर | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ------------------------------------------------------------- | --------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ब्रेकर ट्रिप होने से पहले OAuth प्रदाताओं के लिए लगातार विफलताओं की सीमा। | -| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth प्रदाता ब्रेकर के लिए रीसेट विंडो (ms)। | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-कुंजी प्रदाताओं के लिए लगातार विफलताओं की सीमा। | -| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-कुंजी प्रदाता ब्रेकर के लिए रीसेट विंडो (ms)। | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | स्थानीय प्रदाताओं (Ollama, LM Studio, ...) के लिए लगातार विफलताओं की सीमा। | -| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | स्थानीय प्रदाता ब्रेकर के लिए रीसेट विंडो (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: पूरे OAuth प्रदाता के कूलडाउन में जाने से पहले विंडो के भीतर विफलताओं की संख्या। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: OAuth प्रदाताओं के लिए रोलिंग विफलता-गणना विंडो (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: OAuth प्रदाता की सीमा पूरी होने के बाद कूलडाउन (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | इतनी विफलताओं पर OAuth प्रदाता DEGRADED स्थिति में चला जाता है। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth प्रदाता के resetTimeout वृद्धि का अधिकतम गुणक। | -| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | इतने खुले चक्रों के बाद OAuth प्रदाता वृद्धि करता है। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: पूरे API-कुंजी प्रदाता के कूलडाउन में जाने से पहले विंडो के भीतर विफलताओं की संख्या। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: API-कुंजी प्रदाताओं के लिए रोलिंग विफलता-गणना विंडो (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: API-कुंजी प्रदाता की सीमा पूरी होने के बाद कूलडाउन (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | इतनी विफलताओं पर API-कुंजी प्रदाता DEGRADED स्थिति में चला जाता है। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-कुंजी प्रदाता के resetTimeout वृद्धि का अधिकतम गुणक। | -| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | इतने खुले चक्रों के बाद API-कुंजी प्रदाता वृद्धि करता है। | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: पूरे स्थानीय प्रदाता के कूलडाउन में जाने से पहले विफलताओं की संख्या। | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: स्थानीय प्रदाताओं के लिए रोलिंग विफलता-गणना विंडो (ms)। | -| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | प्रदाता-स्तरीय ब्रेकर: स्थानीय प्रदाता की सीमा पूरी होने के बाद कूलडाउन (ms)। | -| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | बैकऑफ़ की वह गहराई जिस पर किसी संदर्भ-कैश पिन के प्रदाता को स्थायी रूप से अस्वस्थ माना जाता है और फ़ेलओवर के लिए पिन हटा दिया जाता है। | -| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | संदर्भ-कैश पिन हटाने से पहले संक्षिप्त अस्थायी कूलडाउन को सहन करने वाली एंटी-फ्लैप विंडो (ms)। | +प्रदाता-स्तरीय सर्किट ब्रेकर ट्यूनिंग। डिफ़ॉल्ट मान v3.6 के बाद से 500+ कनेक्शन के लिए उपयोग किए गए स्केल किए गए मानों को दर्शाते हैं। + +| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | +| ------------------------------------------------------------- | --------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ब्रेकर ट्रिप होने से पहले OAuth प्रदाताओं के लिए लगातार विफलता की सीमा। | +| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth प्रदाता ब्रेकर के लिए रीसेट विंडो (ms)। | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | API-कुंजी प्रदाताओं के लिए लगातार विफलता की सीमा। | +| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | API-कुंजी प्रदाता ब्रेकर के लिए रीसेट विंडो (ms)। | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | स्थानीय प्रदाताओं (Ollama, LM Studio, ...) के लिए लगातार विफलता की सीमा। | +| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | स्थानीय प्रदाता ब्रेकर के लिए रीसेट विंडो (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: पूरी OAuth प्रदाता के कूलडाउन में प्रवेश करने से पहले विंडो के भीतर विफलताएँ। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: OAuth प्रदाताओं के लिए रोलिंग विफलता-गणना विंडो (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: OAuth प्रदाता की सीमा तक पहुँचने के बाद कूलडाउन (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | OAuth प्रदाता इतनी विफलताओं पर DEGRADED में प्रवेश करता है। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | OAuth प्रदाता अधिकतम रीसेटटाइमआउट वृद्धि गुणक। | +| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | OAuth प्रदाता इतने खुले चक्रों के बाद बढ़ता है। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: पूरी API-कुंजी प्रदाता के कूलडाउन में प्रवेश करने से पहले विंडो के भीतर विफलताएँ। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: API-कुंजी प्रदाताओं के लिए रोलिंग विफलता-गणना विंडो (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: API-कुंजी प्रदाता की सीमा तक पहुँचने के बाद कूलडाउन (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | API-कुंजी प्रदाता इतनी विफलताओं पर DEGRADED में प्रवेश करता है। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | API-कुंजी प्रदाता अधिकतम रीसेटटाइमआउट वृद्धि गुणक। | +| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | API-कुंजी प्रदाता इतने खुले चक्रों के बाद बढ़ता है। | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: पूरी स्थानीय प्रदाता के कूलडाउन में प्रवेश करने से पहले विफलताएँ। | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: स्थानीय प्रदाताओं के लिए रोलिंग विफलता-गणना विंडो (ms)। | +| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | प्रदाता-स्तर ब्रेकर: स्थानीय प्रदाता की सीमा तक पहुँचने के बाद कूलडाउन (ms)। | +| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | बैकऑफ़ गहराई जिस पर संदर्भ-कैश पिन के प्रदाता को स्थायी रूप से अस्वस्थ माना जाता है और फ़ेलओवर के लिए पिन हटा दिया जाता है। | +| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | संदर्भ-कैश पिन को हटाने से पहले संक्षिप्त क्षणिक कूलडाउन को सहन करने वाली एंटी-फ्लैप विंडो (ms)। | ### परिदृश्य -| परिदृश्य | कॉन्फ़िगरेशन | -| ------------------------------------- | ----------------------------------------------------- | -| **लंबे समय तक चलने वाला कोड जनरेशन** | `REQUEST_TIMEOUT_MS=900000` (15 मिनट) | -| **कुल स्ट्रीम जीवनकाल सीमित करें** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 मिनट) | -| **प्रोडक्शन API के लिए शीघ्र विफलता** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | -| **विस्तारित चिंतन मॉडल** | `STREAM_IDLE_TIMEOUT_MS=300000` (चंक्स के बीच 5 मिनट) | +| परिदृश्य | कॉन्फ़िगरेशन | +| ------------------------------------ | ----------------------------------------------------- | +| **लंबे समय तक चलने वाली कोड जनरेशन** | `REQUEST_TIMEOUT_MS=900000` (15 मिनट) | +| **बाउंड कुल स्ट्रीम लाइफटाइम** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 मिनट) | +| **उत्पादन API के लिए फास्ट-फेल** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | +| **विस्तारित थिंकिंग मॉडल** | `STREAM_IDLE_TIMEOUT_MS=300000` (खंडों के बीच 5 मिनट) | --- @@ -1109,100 +1217,89 @@ Anthropic-संगत प्रोवाइडर जोड़ें। ## 21. प्रॉक्सी स्वास्थ्य -| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | त्वरित-विफलता स्वास्थ्य जाँच की समय-सीमा। | -| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | विलंबता-अनुकूलित पूल रणनीति में संभावित प्रॉक्सियों की औसत विलंबता की गणना के लिए समयावधि (घंटों में)। | -| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | स्वास्थ्य जाँच परिणाम कैश TTL। | -| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | विफल प्रॉक्सी स्वास्थ्य जाँचों के लिए कैश TTL। इसे `PROXY_HEALTH_CACHE_TTL_MS` से छोटा रखें, ताकि उच्च समवर्तीता में अस्थायी प्रॉक्सी टाइमआउट के बाद शीघ्र पुनः प्रयास हो सके और वास्तव में निष्क्रिय प्रॉक्सियों के लिए त्वरित-विफलता अक्षम न हो। | -| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | पंजीकृत प्रॉक्सियों की समय-समय पर जाँच करने वाले पृष्ठभूमि प्रॉक्सी स्वास्थ्य शेड्यूलर को अक्षम करने के लिए `false` सेट करें। | -| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | पृष्ठभूमि स्वास्थ्य-शेड्यूलर स्वीप अंतराल, मिलीसेकंड में (न्यूनतम `60000`)। | -| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | शेड्यूलर और `/api/settings/proxies/auto-test` एंडपॉइंट द्वारा उपयोग किया जाने वाला पहुँच-क्षमता जाँच लक्ष्य। सार्वजनिक डिफ़ॉल्ट से बचने के लिए इसे किसी आंतरिक/स्वयं-होस्ट किए गए URL पर इंगित करें। | -| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | प्रति बैच एक साथ शुरू की जाने वाली जाँचों की संख्या, जिसे शेड्यूलर और `/api/settings/proxies/auto-test` एंडपॉइंट साझा करते हैं। न्यूनतम सीमा 1 और अधिकतम सीमा 50 है। | -| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | एक बैच के भीतर दो जाँचों के प्रस्थान के बीच मिलीसेकंड में विलंब। इसके बिना पूरा बैच एक ही समय पर निकलता है और साझा इग्रेस IP किसी दर-सीमित लक्ष्य की सीमा को सक्रिय कर सकता है। अंतराल अक्षम करने के लिए इसे `0` पर सेट करें; अधिकतम सीमा 5000 है। | -| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | प्रॉक्सी को असाइन किए गए प्रदाता के वास्तविक होस्ट की जाँच (`GET /models`, कोई API कुंजी नहीं) रोकने और इसके बजाय हमेशा `PROXY_HEALTH_TEST_URL` का उपयोग करने के लिए इसे "false" पर सेट करें। | -| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | जब `false` (डिफ़ॉल्ट) हो, तो स्वचालित पहुँच-क्षमता जाँचें (शेड्यूलर + `/api/settings/proxies/auto-test` का "सभी का परीक्षण करें" बटन) **केवल-पठन** होती हैं और कभी भी प्रॉक्सी की स्थिति नहीं लिखतीं — केवल ऑपरेटर ही सक्रिय/निष्क्रिय स्थिति सेट करता है, ताकि कोई अस्थिर जाँच असाइन किए गए प्रॉक्सी को अनुपयोगी न बना दे (#6246)। पुराना परीक्षण-और-सेट व्यवहार पुनर्स्थापित करने के लिए इसे `true` पर सेट करें। | -| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | ऑप्ट-इन फ़ीचर फ़्लैग ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) देखें; डैशबोर्ड DB ओवरराइड को प्राथमिकता मिलती है)। `true` (या `1`, `yes`) डैशबोर्ड में प्रॉक्सी पूल के अंतर्गत केवल-पठन पूल इग्रेस अवलोकन दिखाता है (पिछले 24 घंटों के प्रॉक्सी लॉग से अलग-अलग इग्रेस IP, कनेक्शन और किसी एक IP के पीछे सर्वाधिक बार देखी गई संख्या)। इसका उपयोग रूटिंग के लिए कभी नहीं किया जाता। | -| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | बार-बार लगातार विफलताओं के बाद शेड्यूलर को प्रॉक्सी स्वतः हटाने देने के लिए इसे `true` पर सेट करें। | -| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | शेड्यूलर द्वारा किसी प्रॉक्सी को स्वतः हटाने से पहले लगातार विफलताओं की संख्या (जब `PROXY_AUTO_REMOVE=true` हो)। | -| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | बार-बार लगातार विफलताओं के बाद किसी प्रॉक्सी को हटाने के बजाय, शेड्यूलर को उसे सॉफ्ट-डिसेबल (स्थिति `dead`, कभी डिलीट नहीं किया जाता) करने देने के लिए `true` सेट करें। `PROXY_AUTO_REMOVE` का गैर-विनाशकारी विकल्प: प्रॉक्सी तुरंत पूल/रोटेशन रिज़ॉल्यूशन से बाहर हो जाता है (स्कोप-पूल रिज़ॉल्यूशन द्वारा उपयोग किया जाने वाला सक्रिय-स्थिति फ़िल्टर पहले से ही इसे बाहर रखता है) और प्रोब में फिर से सफल होते ही स्वचालित रूप से पुनः सक्रिय हो जाता है। यह `PROXY_AUTO_REMOVE_AFTER` थ्रेशोल्ड साझा करता है। यदि दोनों फ़्लैग `true` हैं, तो `PROXY_AUTO_REMOVE` को प्राथमिकता मिलती है। | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | प्रॉक्सी पहुँच-योग्यता की पूर्व-जाँच विफल होने पर OAuth और प्रदाता सत्यापन फ़्लो को पिन किए गए प्रॉक्सी को बायपास करके सीधे कनेक्ट होने की अनुमति दें। प्रभावी प्राथमिकता Feature Flags DB ओवरराइड > env var > डिफ़ॉल्ट है। | -| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 सेकंड) | `open-sse/services/rateLimitManager.ts` | अनुरोध को विफल करने से पहले 429 पर प्रतीक्षा करने का अधिकतम समय। | -| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 मिनट) | `open-sse/services/rateLimitManager.ts` | रेट-लिमिट आरक्षण समाप्त होने से पहले किसी स्वीकृत अनुरोध के निष्पादन में बने रहने की अधिकतम समय-सीमा — इसे कतार-प्रतीक्षा बजट से अलग रखा गया है, ताकि गैर-इंक्रीमेंटल गेटवे पर धीमी fetch-शुरुआत टाइम आउट न हो (#12027)। | -| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (अक्षम) | `open-sse/services/rateLimitManager.ts` | कतार प्रवेश सीमा: जब इतने अनुरोध पहले से कतार में हों, तो 429 `queue_full` के साथ अस्वीकार करें। `0` = असीमित (डिफ़ॉल्ट)। | -| `RATE_LIMIT_AUTO_ENABLE` | _(सेट नहीं)_ | `open-sse/services/rateLimitManager.ts` | सहेजी गई Dashboard सेटिंग की परवाह किए बिना, ऑटो-इनेबल रेट लिमिट सुरक्षा तंत्र को चालू/बंद करने के लिए बाध्य करें। चालू करने के लिए `true`/`1`/`on` और बंद करने के लिए `false`/`0`/`off` स्वीकार करता है। | -| `PROVIDER_COOLDOWN_ENABLED` | _(सेट नहीं → बंद)_ | `open-sse/services/providerCooldownTracker.ts` | वैश्विक क्रॉस-रिक्वेस्ट प्रदाता/कनेक्शन कूलडाउन ट्रैकिंग को ऑप्ट-इन करके चालू करें। डिफ़ॉल्ट रूप से बंद (Connection Cooldown / Provider Circuit Breaker के साथ ओवरलैप करता है)। सक्षम करने के लिए `true`/`1`/`on` स्वीकार करता है। | -| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | किसी विफल प्रदाता/कनेक्शन को पुनः आज़माने से पहले न्यूनतम कूलडाउन (ms)। लगातार विफलताओं के साथ यह घातांकीय रूप से बढ़ता है। केवल `PROVIDER_COOLDOWN_ENABLED` सक्षम होने पर उपयोग किया जाता है। | -| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 मिनट) | `open-sse/services/providerCooldownTracker.ts` | किसी विफल प्रदाता/कनेक्शन को हर हाल में पुनः आज़माने से पहले अधिकतम कूलडाउन सीमा (ms)। केवल `PROVIDER_COOLDOWN_ENABLED` सक्षम होने पर उपयोग किया जाता है। | -| `STREAM_RECOVERY_ENABLED` | _(सेट नहीं → बंद)_ | `src/lib/resilience/settings.ts` (सीड) → `open-sse/services/streamRecovery.ts` (लॉजिक) | **क्या:** बीच में कटे हुए अपस्ट्रीम स्ट्रीम की पारदर्शी रिकवरी (free-claude-code पोर्ट)। आरंभिक SSE विंडो को `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) तक रोककर रखता है, ताकि _प्री-कमिट_ कटाव—जो क्लाइंट तक कोई भी बाइट पहुँचने से पहले होता है—को अदृश्य रूप से फिर से खोला और पुनः आज़माया जा सके। **कब सक्षम करें:** अस्थिर अपस्ट्रीम, जो स्ट्रीम के आरंभ में अक्सर 0-बाइट कट जाते हैं; यदि आप प्रत्येक स्ट्रीम पर पहले टोकन तक के समय में 750 ms तक की अतिरिक्त देरी वहन नहीं कर सकते, तो इसे बंद रखें। `true`/`1`/`on` स्वीकार करता है। स्थायी Resilience सेटिंग को आरंभिक मान देता है; एक बार सेट किए जाने के बाद Dashboard सेटिंग प्रभावी होती है। | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(सेट नहीं → बंद)_ | `src/lib/resilience/settings.ts` (सीड) → `open-sse/services/streamRecovery.ts` (लॉजिक) | **क्या:** मध्य-स्ट्रीम निरंतरता (चरण 4.4)—_पोस्ट-कमिट_ कटाव (बाइट पहले ही क्लाइंट तक पहुँच चुके हों) के बाद, आंशिक टेक्स्ट को असिस्टेंट प्रीफिल के रूप में उपयोग करके फिर से अनुरोध करता है और लुप्त प्रत्यय को जोड़ता है। केवल प्लेन-टेक्स्ट OpenAI-संगत स्ट्रीम के लिए; किसी टूल कॉल के जारी रहने के दौरान कभी सक्रिय नहीं होता। **कब सक्षम करें:** ऐसे लंबे जनरेशन के लिए जो उत्तर के बीच में कट जाते हैं और जिनमें आप रिकवर किए गए शेष भाग को टोकन-दर-टोकन के बजाय एक साथ प्राप्त करना स्वीकार करते हैं। `STREAM_RECOVERY_ENABLED` से स्वतंत्र (जोखिम प्रोफ़ाइल अलग है)। `true`/`1`/`on` स्वीकार करता है। | -| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(सेट नहीं → बंद)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | वैकल्पिक सक्रिय-स्ट्रीम उपयोगी-आउटपुट वॉचडॉग। उन स्ट्रीम का पता लगाता है जो लगातार चंक भेजते रहते हैं, लेकिन कॉन्फ़िगर की गई असिस्टेंट-आउटपुट दर से नीचे बने रहते हैं; हार्टबीट, उपयोग इवेंट, खाली डेल्टा और टूल/रीज़निंग चरणों को प्रगति के रूप में नहीं दर्शाया जाता। निष्क्रियता और हार्ड-डेडलाइन टाइमआउट से अलग। | -| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | थ्रूपुट मूल्यांकन से पहले की छूट अवधि, 0–600000 ms तक सीमित। | -| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | गतिशील उपयोगी-आउटपुट विंडो, 1000–600000 ms तक सीमित; निरस्त करने से पहले एक पूर्ण विंडो आवश्यक है। | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | न्यूनतम UTF-8 असिस्टेंट-आउटपुट बाइट दर (रूढ़िवादी टोकन प्रॉक्सी), 1–1000000 तक सीमित। | -| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | मापने योग्य माने जाने वाले शून्य से अधिक उपयोगी-आउटपुट नमूने का न्यूनतम आकार, 1–1000000 बाइट तक सीमित। | -| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | स्टार्टअप के समय प्रदाता टोकन हेल्थचेक के बीच क्रमिक अंतराल (ms)। | -| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | प्रदाता टोकन हेल्थचेक के बीच `HEALTHCHECK_STAGGER_MS` के अतिरिक्त जोड़ा जाने वाला न्यूनतम यादृच्छिक जिटर (ms), ताकि एकाएक अनुरोधों की बाढ़ रोकी जा सके (Issue #1220)। | -| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | प्रदाता टोकन हेल्थचेक के बीच `HEALTHCHECK_STAGGER_MS` के अतिरिक्त जोड़ा जाने वाला अधिकतम यादृच्छिक जिटर (ms), ताकि एकाएक अनुरोधों की बाढ़ रोकी जा सके (Issue #1220)। | -| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | स्टार्टअप टोकन-हेल्थचेक स्वीप के लिए समवर्ती-जाँच बैच आकार; बड़े मान समानांतर रूप से अधिक कनेक्शनों की जाँच करते हैं, जबकि छोटे मान अचानक बढ़ने वाले लोड को कम करते हैं (Issue #7875, #7719 का रिग्रेशन)। | -| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | क्लाइंट को त्रुटि लौटाने से पहले मॉडल-स्कोप्ड कूलडाउन प्रतिक्रियाओं पर स्वचालित पुनः प्रयासों की संख्या। | -| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | कूलडाउन पुनः प्रयासों के बीच अधिकतम बैकऑफ़ अंतराल (सेकंड)। अपस्ट्रीम `Retry-After` की परवाह किए बिना यह इस मान तक सीमित रहता है। | -| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom टोकन-सेवर प्रॉक्सी URL। डैशबोर्ड लाइफ़साइकल (`api/headroom/*`) डिफ़ॉल्ट रूप से लूपबैक पर एक स्थानीय `headroom-ai` CLI शुरू करता है; केवल किसी बाहरी Docker साइडकार प्रॉक्सी की ओर इंगित करने के लिए इसे ओवरराइड करें। | - -### स्ट्रीम-रिकवरी ट्यूनिंग कॉन्स्टेंट - -रिकवरी होल्डबैक व्यवहार को -`open-sse/config/constants.ts` (`STREAM_RECOVERY`) में हार्डकोड किए गए कॉन्स्टेंट द्वारा ट्यून किया जाता है, जिन्हें संदर्भ के लिए यहाँ दिखाया गया है — -इन्हें बदलने के लिए कोड संपादन आवश्यक है, env var नहीं: - -- `STREAM_RECOVERY.HOLDBACK_MS = 750` — प्रारंभिक SSE विंडो को कितनी देर रोके रखा जाता है - ताकि क्लाइंट को कोई भी बाइट कमिट किए जाने से पहले किसी शुरुआती ट्रंकेशन पर पुनः प्रयास किया जा सके। -- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — रोकी गई विंडो की कठोर सीमा; टाइमर की परवाह किए बिना - इतनी बाइट्स जमा होते ही कमिट (फ़्लश + पासथ्रू) करें। -- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — होल्डबैक के अभी भी अनकमिटेड रहने के दौरान अपस्ट्रीम - स्ट्रीम को पारदर्शी रूप से दोबारा खोलने की अधिकतम संख्या। - -> **प्रति-प्रोवाइडर स्लाइडिंग-विंडो रेट लिमिट (कोई env var नहीं):** FCC-पोर्टेड -> प्रति-प्रोवाइडर स्लाइडिंग-विंडो रेट-लिमिट _फ़ॉलबैक_ कोड में मौजूद है -> (`open-sse/services/providerDefaultRateLimit.ts`, जिसे -> `open-sse/services/rateLimitManager.ts` के माध्यम से जोड़ा गया है), लेकिन यह एक **खाली डिफ़ॉल्ट मैप** -> के साथ आता है और वर्तमान में इसका **कोई ऑपरेटर env var नहीं है** — इसे केवल टेस्ट हुक / -> कोड संपादन के माध्यम से सक्षम किया जाता है। इसे जानबूझकर ऊपर दी गई तालिका में सूचीबद्ध नहीं किया गया है। प्रति-`(token, IP)` -> रिले लिमिटर जिसमें वास्तव में एक कॉन्फ़िगरेशन नॉब है, वह `RELAY_IP_PER_MINUTE` (§3 नेटवर्क और पोर्ट्स) है। +| चर | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | +| :------------------------------------------------ | :----------------------- | :------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | फ़ास्ट-फेल स्वास्थ्य जांच टाइमआउट। | +| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | लेटेंसी-ऑप्टिमाइज़्ड पूल रणनीति में उम्मीदवार प्रॉक्सी की औसत लेटेंसी की गणना के लिए समय सीमा (घंटे)। | +| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | स्वास्थ्य जांच परिणाम कैश TTL। | +| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | विफल प्रॉक्सी स्वास्थ्य जांच के लिए कैश TTL। इसे `PROXY_HEALTH_CACHE_TTL_MS` से छोटा रखें ताकि उच्च समवर्तीता के तहत क्षणिक प्रॉक्सी टाइमआउट तेजी से पुनः प्रयास कर सकें, बिना वास्तव में मृत प्रॉक्सी के लिए फ़ास्ट-फेल को अक्षम किए। | +| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | पृष्ठभूमि प्रॉक्सी स्वास्थ्य शेड्यूलर को अक्षम करने के लिए `false` सेट करें जो पंजीकृत प्रॉक्सी की समय-समय पर जांच करता है। | +| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | पृष्ठभूमि स्वास्थ्य-शेड्यूलर स्वीप अंतराल मिलीसेकंड में (न्यूनतम `60000`)। | +| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | रीचेबिलिटी प्रोब लक्ष्य जिसका उपयोग शेड्यूलर और `/api/settings/proxies/auto-test` एंडपॉइंट द्वारा किया जाता है। सार्वजनिक डिफ़ॉल्ट से बचने के लिए इसे एक आंतरिक/स्व-होस्टेड URL पर इंगित करें। | +| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | प्रति बैच एक साथ शुरू किए गए प्रोब, शेड्यूलर और `/api/settings/proxies/auto-test` एंडपॉइंट द्वारा साझा किए गए। 1 पर फ़्लोर किया गया और 50 पर कैप किया गया। | +| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | एक बैच के भीतर दो प्रोब प्रस्थानों के बीच मिलीसेकंड में देरी। इसके बिना पूरा बैच एक ही समय में निकलता है और एक साझा एग्रेस IP एक दर-सीमित लक्ष्य को ट्रिप कर सकता है। स्पेसिंग को अक्षम करने के लिए `0` पर सेट करें; 5000 पर कैप किया गया। | +| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | एक प्रॉक्सी के असाइन किए गए प्रदाता के वास्तविक होस्ट (`GET /models`, कोई API कुंजी नहीं) की जांच बंद करने के लिए "false" पर सेट करें और इसके बजाय हमेशा `PROXY_HEALTH_TEST_URL` का उपयोग करें। | +| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | जब `false` (डिफ़ॉल्ट), स्वचालित रीचेबिलिटी प्रोब (शेड्यूलर + `/api/settings/proxies/auto-test` "सभी का परीक्षण करें" बटन) **केवल पढ़ने के लिए** होते हैं और कभी भी प्रॉक्सी की स्थिति नहीं लिखते हैं — केवल ऑपरेटर सक्रिय/निष्क्रिय सेट करता है, ताकि एक अस्थिर प्रोब एक असाइन किए गए प्रॉक्सी को फंसा न सके (#6246)। लीगेसी टेस्ट-एंड-सेट व्यवहार को बहाल करने के लिए `true` पर सेट करें। | +| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | ऑप्ट-इन फीचर फ्लैग (देखें [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); एक डैशबोर्ड DB ओवरराइड जीतता है)। `true` (या `1`, `yes`) डैशबोर्ड में एक प्रॉक्सी पूल के तहत केवल पढ़ने के लिए पूल एग्रेस ऑब्जर्वेशन दिखाता है (विशिष्ट एग्रेस IP, कनेक्शन और पिछले 24 घंटों में एक IP के पीछे सबसे अधिक देखे गए, प्रॉक्सी लॉग से)। रूटिंग के लिए कभी उपयोग नहीं किया जाता है। | +| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | लगातार विफलताओं के बाद शेड्यूलर को प्रॉक्सी को स्वतः हटाने की अनुमति देने के लिए `true` पर सेट करें। | +| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | शेड्यूलर द्वारा प्रॉक्सी को स्वतः हटाने से पहले लगातार विफलताएं (जब `PROXY_AUTO_REMOVE=true` हो)। | +| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | शेड्यूलर को बार-बार लगातार विफलताओं के बाद प्रॉक्सी को हटाने के बजाय उसे सॉफ्ट-डिसेबल (स्थिति `dead`, कभी नहीं हटाया गया) करने देने के लिए `true` पर सेट करें। `PROXY_AUTO_REMOVE` का गैर-विनाशकारी विकल्प: प्रॉक्सी तुरंत पूल/रोटेशन रिज़ॉल्यूशन से बाहर हो जाता है (स्कोप-पूल रिज़ॉल्यूशन द्वारा उपयोग किया जाने वाला अलाइव-स्टेटस फ़िल्टर इसे पहले ही बाहर कर देता है) और एक बार फिर से जांच पास करने पर स्वचालित रूप से पुनः सक्रिय हो जाता है। यह `PROXY_AUTO_REMOVE_AFTER` थ्रेशोल्ड साझा करता है। यदि दोनों फ़्लैग `true` हैं, तो `PROXY_AUTO_REMOVE` प्रभावी होगा। | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | प्रॉक्सी पहुंच-योग्यता पूर्व-जांच विफल होने पर OAuth और प्रदाता सत्यापन प्रवाह को पिन किए गए प्रॉक्सी को बायपास करने और सीधे कनेक्ट करने की अनुमति दें। प्रभावी प्राथमिकता फीचर फ़्लैग्स DB ओवरराइड > env var > डिफ़ॉल्ट है। | +| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 सेकंड) | `src/lib/resilience/settings.ts` | डिफ़ॉल्ट **कतार-प्रतीक्षा** बजट: एक अनुरोध प्रदाता स्लॉट के लिए कितनी देर तक प्रतीक्षा कर सकता है और अपस्ट्रीम तक पहुंचने से पहले कतार में रह सकता है, जिसके बाद उसे अस्वीकार कर दिया जाता है। एक बार जब कार्य निष्पादित होना शुरू हो जाता है तो टाइमर साफ़ हो जाता है — निष्पादन `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` द्वारा अलग से सीमित होता है। Env केवल डिफ़ॉल्ट सेट करता है: एक स्थायी `resilienceSettings.requestQueue.maxWaitMs`, और फिर प्रति-कनेक्शन `rateLimitOverrides.maxWaitMs`, प्रत्येक इस पर प्रभावी होता है। | +| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 मिनट) | `open-sse/services/rateLimitManager.ts` | एक स्वीकृत अनुरोध कितनी देर तक निष्पादन में रह सकता है, इससे पहले कि उसका दर-सीमा आरक्षण समाप्त हो जाए — यह कतार-प्रतीक्षा बजट से अलग है ताकि गैर-वृद्धिशील गेटवे पर धीमी फ़ेच-स्टार्ट का समय समाप्त न हो (#12027)। | +| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (अक्षम) | `open-sse/services/rateLimitManager.ts` | कतार प्रवेश सीमा: एक बार जब इतनी संख्या में अनुरोध पहले से ही कतार में हों, तो 429 `queue_full` के साथ अस्वीकार करें। `0` = असीमित (डिफ़ॉल्ट)। | +| `RATE_LIMIT_AUTO_ENABLE` | _(अनसेट)_ | `open-sse/services/rateLimitManager.ts` | स्थायी डैशबोर्ड सेटिंग की परवाह किए बिना ऑटो-इनेबल दर सीमा सुरक्षा जाल को चालू/बंद करने के लिए बाध्य करें। चालू करने के लिए `true`/`1`/`on` स्वीकार करता है, बंद करने के लिए `false`/`0`/`off` स्वीकार करता है। | +| `PROVIDER_COOLDOWN_ENABLED` | _(अनसेट → बंद)_ | `open-sse/services/providerCooldownTracker.ts` | ऑप्ट-इन वैश्विक क्रॉस-रिक्वेस्ट प्रदाता/कनेक्शन कूलडाउन ट्रैकिंग। डिफ़ॉल्ट रूप से बंद (कनेक्शन कूलडाउन / प्रदाता सर्किट ब्रेकर के साथ ओवरलैप होता है)। सक्षम करने के लिए `true`/`1`/`on` स्वीकार करता है। | +| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | विफल प्रदाता/कनेक्शन को पुनः प्रयास करने से पहले न्यूनतम कूलडाउन (मिलीसेकंड)। लगातार विफलताओं के साथ घातीय रूप से बढ़ाया गया। केवल तभी उपयोग किया जाता है जब `PROVIDER_COOLDOWN_ENABLED` सक्षम हो। | +| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | विफल प्रदाता/कनेक्शन को दोबारा प्रयास करने से पहले अधिकतम कूलडाउन (ms) सीमा, चाहे कुछ भी हो। इसका उपयोग केवल तभी किया जाता है जब `PROVIDER_COOLDOWN_ENABLED` हो। | +| `STREAM_RECOVERY_ENABLED` | _(अनसेट → बंद)_ | `src/lib/resilience/settings.ts` (सीड) → `open-sse/services/streamRecovery.ts` (लॉजिक) | **क्या:** ट्रंकेटेड अपस्ट्रीम स्ट्रीम्स की पारदर्शी रिकवरी (फ्री-क्लाउड-कोड पोर्ट)। यह `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) तक खुलने वाली SSE विंडो को रोके रखता है ताकि _प्री-कमिट_ कटऑफ — जो क्लाइंट तक कोई भी बाइट पहुंचने से पहले होता है — को अदृश्य रूप से फिर से खोला और दोबारा प्रयास किया जा सके। **कब सक्षम करें:** अस्थिर/अपस्ट्रीम जो स्ट्रीम शुरू होने पर अक्सर 0-बाइट-ट्रंकेट होते हैं; यदि आप प्रत्येक स्ट्रीम पर 750 ms तक का अतिरिक्त टाइम-टू-फर्स्ट-टोकन वहन नहीं कर सकते हैं तो इसे बंद रखें। `true`/`1`/`on` स्वीकार करता है। यह परसिस्टेड रेजिलिएंस सेटिंग को सीड करता है; एक बार सेट होने पर डैशबोर्ड सेटिंग प्रभावी होती है। | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(अनसेट → बंद)_ | `src/lib/resilience/settings.ts` (सीड) → `open-sse/services/streamRecovery.ts` (लॉजिक) | **क्या:** मिड-स्ट्रीम निरंतरता (फेज 4.4) — _पोस्ट-कमिट_ ट्रंकेशन (बाइट्स पहले ही क्लाइंट तक पहुंच चुके हैं) के बाद, आंशिक टेक्स्ट को असिस्टेंट प्रीफिल के रूप में फिर से अनुरोध करें और लापता प्रत्यय को जोड़ें। केवल प्लेन-टेक्स्ट OpenAI-संगत स्ट्रीम्स; टूल कॉल के साथ कभी फायर नहीं होता। **कब सक्षम करें:** लंबी जनरेशन जो उत्तर के बीच में कट जाती हैं और आप रिकवर किए गए टेल को टोकन-बाय-टोकन के बजाय एक ही बर्स्ट के रूप में स्वीकार करते हैं। `STREAM_RECOVERY_ENABLED` से स्वतंत्र (अलग जोखिम प्रोफ़ाइल)। `true`/`1`/`on` स्वीकार करता है। | +| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(अनसेट → बंद)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ऑप्ट-इन सक्रिय-स्ट्रीम उपयोगी-आउटपुट वॉचडॉग। उन स्ट्रीम्स का पता लगाता है जो चंक्स भेजती रहती हैं लेकिन कॉन्फ़िगर की गई असिस्टेंट-आउटपुट दर से नीचे रहती हैं; हार्टबीट्स, उपयोग इवेंट्स, खाली डेल्टा, और टूल/रीज़निंग चरण प्रगति के रूप में प्रच्छन्न नहीं होते हैं। निष्क्रिय और हार्ड-डेडलाइन टाइमआउट से अलग। | +| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | थ्रूपुट मूल्यांकन से पहले ग्रेस पीरियड, 0–600000 ms तक सीमित। | +| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | रोलिंग उपयोगी-आउटपुट विंडो, 1000–600000 ms तक सीमित; निरस्त करने से पहले एक पूर्ण विंडो की आवश्यकता होती है। | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | न्यूनतम UTF-8 असिस्टेंट-आउटपुट बाइट दर (रूढ़िवादी टोकन प्रॉक्सी), 1–1000000 तक सीमित। | +| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | न्यूनतम गैर-शून्य उपयोगी-आउटपुट नमूना जिसे मापने योग्य माना जाता है, 1–1000000 बाइट्स तक सीमित। | +| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | स्टार्टअप पर प्रदाता टोकन हेल्थचेक के बीच स्टैगर अंतराल (ms)। | +| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | प्रदाता टोकन हेल्थचेक के बीच `HEALTHCHECK_STAGGER_MS` के ऊपर जोड़ा गया न्यूनतम यादृच्छिक जिटर (ms), बर्स्टिंग को रोकने के लिए (इश्यू #1220)। | +| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | प्रदाता टोकन हेल्थचेक के बीच `HEALTHCHECK_STAGGER_MS` के ऊपर जोड़ा गया अधिकतम यादृच्छिक जिटर (ms), बर्स्टिंग को रोकने के लिए (इश्यू #1220)। | +| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | स्टार्टअप टोकन-हेल्थचेक स्वीप के लिए समवर्ती-जांच बैच का आकार; बड़े मान समानांतर में अधिक कनेक्शनों की जांच करते हैं, छोटे मान बर्स्ट लोड को कम करते हैं (इश्यू #7875, #7719 का प्रतिगमन)। | +| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | क्लाइंट को त्रुटि लौटाने से पहले मॉडल-स्कोप वाले कूलडाउन प्रतिक्रियाओं पर स्वचालित पुनः प्रयास की संख्या। | +| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | कूलडाउन पुनः प्रयासों के बीच अधिकतम बैकऑफ़ अंतराल (सेकंड)। अपस्ट्रीम `Retry-After` की परवाह किए बिना इस मान द्वारा सीमित। | +| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | हेडरूम टोकन-सेवर प्रॉक्सी URL। डैशबोर्ड लाइफसाइकिल (`api/headroom/*`) डिफ़ॉल्ट रूप से लूपबैक पर एक स्थानीय `headroom-ai` CLI को स्पॉन करता है; केवल एक बाहरी डॉकर साइडकार प्रॉक्सी को इंगित करने के लिए ओवरराइड करें। | + +### स्ट्रीम-रिकवरी ट्यूनिंग स्थिरांक + +रिकवरी होल्डबैक व्यवहार को `open-sse/config/constants.ts` (`STREAM_RECOVERY`) में हार्डकोडेड स्थिरांकों द्वारा ट्यून किया जाता है, जो यहां संदर्भ के लिए दिखाए गए हैं — इन्हें बदलने के लिए कोड संपादन की आवश्यकता होती है, न कि एक env var की: + +- `STREAM_RECOVERY.HOLDBACK_MS = 750` — SSE विंडो को कितनी देर तक खुला रखा जाता है ताकि क्लाइंट को कोई भी बाइट भेजने से पहले प्रारंभिक ट्रंकेशन को पुनः प्रयास किया जा सके। +- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — रोकी गई विंडो पर हार्ड कैप; जैसे ही इतने बाइट्स जमा होते हैं, टाइमर की परवाह किए बिना कमिट (फ्लश + पासथ्रू) करें। +- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — अपस्ट्रीम स्ट्रीम के अधिकतम पारदर्शी पुनः-खोलने की संख्या जब तक होल्डबैक अभी भी अनकमिटेड है। + +> **प्रति-प्रदाता स्लाइडिंग-विंडो दर सीमा (कोई env var नहीं):** FCC-पोर्टेड प्रति-प्रदाता स्लाइडिंग-विंडो दर-सीमा _फ़ॉलबैक_ कोड में मौजूद है (`open-sse/services/providerDefaultRateLimit.ts`, `open-sse/services/rateLimitManager.ts` के माध्यम से जुड़ा हुआ है) लेकिन **एक खाली डिफ़ॉल्ट मैप** के साथ आता है और आज **कोई ऑपरेटर env var नहीं** है — इसे केवल एक टेस्ट हुक / कोड संपादन के माध्यम से सक्षम किया जाता है। इसे जानबूझकर ऊपर दी गई तालिका में सूचीबद्ध नहीं किया गया है। प्रति-`(टोकन, IP)` रिले लिमिटर जिसमें एक नॉब है वह `RELAY_IP_PER_MINUTE` (§3 नेटवर्क और पोर्ट) है। --- ## 22. डीबगिंग -> [!CAUTION] -> ये वेरिएबल **विस्तृत आउटपुट** उत्पन्न करते हैं और संवेदनशील डेटा लीक कर सकते हैं। **इन्हें प्रोडक्शन में कभी सक्षम न करें।** - -| वेरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण | -| ------------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CURSOR_DEBUG` | _(सेट नहीं)_ | `open-sse/executors/cursor.ts` | विस्तृत Cursor executor लॉग (डीकोड किए गए SSE chunks आदि) सक्षम करने के लिए `1` सेट करें। | -| `CURSOR_STREAM_DEBUG` | _(सेट नहीं)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG` का पश्चगामी-संगत उपनाम। | -| `CURSOR_DUMP_FILE` | _(सेट नहीं)_ | `open-sse/executors/cursor.ts` | वैकल्पिक फ़ाइल पथ, जिसमें `CURSOR_DEBUG=1` होने पर कच्चे डीकोड किए गए Cursor chunks प्राप्त होते हैं। | -| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor executor के लिए स्ट्रीम निष्क्रियता टाइमआउट (ms)। | -| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | composer kv_after_text सॉफ्ट टर्मिनेटर के बाद, जब बाइट्स बफ़र में शेष हों, ग्रेस विंडो (ms) — इससे पीछे आने वाले exec_mcp टूल कॉल को अपना फ़्रेम पूरा करने का समय मिलता है। | -| `CURSOR_TOOL_DIRECTIVE` | सक्षम (`!== "0"`) | `open-sse/executors/cursor.ts` | टूल-कमिट निर्देश, जो composer-2.5 से विश्वसनीय रूप से टूल कॉल जारी करवाता है। अक्षम करने के लिए `0` सेट करें। | -| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(सेट नहीं)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | ऑपरेटर-परिभाषित सिस्टम प्रॉम्प्ट टेक्स्ट, जिसे अनुवाद के बाद सिस्टम संदेश में जोड़ा जाता है (अनुवाद-पश्चात इंजेक्शन), और जो codex/Responses तथा `/v1/messages` पथों तक पहुँचता है। इसका उपयोग प्रतिध्वनित सिस्टम प्रस्तावना ब्लॉक्स से हटाए जाने वाले निर्देश उपसर्ग के रूप में भी किया जाता है। अक्षम रखने के लिए इसे सेट न करें। | -| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | रिमोट `image_url` विज़न इनपुट के लिए प्रति-इमेज फ़ेच टाइमआउट (ms)। | -| `CURSOR_STATE_DB_PATH` | _(जाँचा गया)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE संस्करण का पता लगाने के लिए उपयोग होने वाली Cursor IDE स्टेट DB खोज को ओवरराइड करें। | -| `CURSOR_AGENT_CLI_VERSION` | _(पता लगाएँ / पिन करें)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run पर `x-cursor-client-version: cli-…` के लिए Agent CLI बिल्ड आईडी (`YYYY.MM.DD-`)। | -| `CURSOR_AGENT_BIN` | _(सेट नहीं)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | इमेज जनरेशन के लिए उपयोग होने वाली Cursor Agent बाइनरी का पथ। सेट न होने पर, हैंडलर पहले `providerSpecificData.agentBin` और फिर PATH का उपयोग करता है। | -| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent इमेज जॉब्स के लिए प्रति-इमेज वास्तविक समय सीमा (ms)। | -| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor इमेज जॉब्स के लिए साझा-सीट समवर्तीता नियंत्रण। | -| `CURSOR_IMG_MODEL` | अनुरोध / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | इमेज जॉब्स के लिए Cursor CLI `--model` को ओवरराइड करें। | -| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) इमेज-जनरेशन परिणाम-पोलिंग अंतराल (ms)। | -| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC इमेज-जनरेशन परिणाम-पोलिंग की वास्तविक समय सीमा (ms)। | -| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) वीडियो-जनरेशन परिणाम-पोलिंग अंतराल (ms)। | -| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC वीडियो-जनरेशन परिणाम-पोलिंग की वास्तविक समय सीमा (ms)। | -| `CURSOR_DATA_DIR` | _(जाँचा गया)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI डेटा डायरेक्टरी (`…/versions/`) को ओवरराइड करें; यही वेरिएबल आधिकारिक एजेंट भी उपयोग करता है। | -| `CURSOR_TOKEN` | _(सेट नहीं)_ | `scripts/ad-hoc/cursor-tap.cjs` | डेवलपर टूलिंग द्वारा उपयोग किया जाने वाला प्रत्यक्ष Cursor bearer token। | -| `OMNIROUTE_LOG_REQUEST_SHAPE` | अक्षम (`"1"` के माध्यम से ऑप्ट-इन) | `src/app/api/v1/chat/completions/route.ts` | `"1"` सेट होने पर बड़े चैट पेलोड के लिए content-type/length मार्कर लॉग करें। लॉग शोर कम करने के लिए यह डिफ़ॉल्ट रूप से बंद रहता है। | -| `DEBUG_RESPONSES_SSE_TO_JSON` | _(सेट नहीं)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON अनुवाद विवरण लॉग करने के लिए `true` सेट करें। | -| `DEBUG_CLAUDE_NONSTREAM` | _(सेट नहीं)_ | `open-sse/handlers/responseTranslator.ts` | Claude प्रतिक्रिया अनुवाद पथ में खाली textContent chunks दिखाने के लिए `true` सेट करें (केवल डीबग के लिए)। | -| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(सेट नहीं)_ | E2E परीक्षण हार्नेस | E2E परीक्षण मोड (शिथिल प्रमाणीकरण, परीक्षण हुक्स) सक्षम करने के लिए `true` सेट करें। | +> [!सावधानी] +> ये वैरिएबल **विस्तृत आउटपुट** उत्पन्न करते हैं और संवेदनशील डेटा लीक कर सकते हैं। **उत्पादन में कभी भी सक्षम न करें।** + +| वैरिएबल | डिफ़ॉल्ट | स्रोत फ़ाइल | विवरण +| `CURSOR_DEBUG` | _(अनसेट)_ | `open-sse/executors/cursor.ts` | विस्तृत कर्सर एक्ज़ीक्यूटर लॉग (डिकोडेड SSE चंक्स, आदि) को सक्षम करने के लिए `1` सेट करें। | +| `CURSOR_STREAM_DEBUG` | _(unset)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG` का पिछड़ा-संगत उपनाम। | +| `CURSOR_DUMP_FILE` | _(unset)_ | `open-sse/executors/cursor.ts` | वैकल्पिक फ़ाइल पथ जो `CURSOR_DEBUG=1` होने पर कच्चे डिकोडेड कर्सर चंक्स प्राप्त करता है। | +| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | कर्सर एक्ज़ीक्यूटर के लिए स्ट्रीम निष्क्रिय टाइमआउट (ms)। | +| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | कंपोजर kv_after_text सॉफ्ट टर्मिनेटर के बाद ग्रेस विंडो (ms) जब बाइट्स बफर में रहते हैं — एक ट्रेलिंग exec_mcp टूल कॉल को अपना फ्रेम पूरा करने का समय देता है। | +| `CURSOR_TOOL_DIRECTIVE` | सक्षम (`!== "0"`) | `open-sse/executors/cursor.ts` | टूल-कमिट डायरेक्टिव जो कंपोजर-2.5 को विश्वसनीय रूप से टूल कॉल जारी करने में मदद करता है। अक्षम करने के लिए `0` सेट करें। | +| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(unset)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | ऑपरेटर-परिभाषित सिस्टम प्रॉम्प्ट टेक्स्ट जो अनुवाद के बाद (अनुवाद के बाद इंजेक्शन) सिस्टम संदेश में जोड़ा जाता है, जो कोडेक्स/रिस्पॉन्स और `/v1/messages` पथों तक पहुंचता है। इसका उपयोग इको किए गए सिस्टम प्रस्तावना ब्लॉकों से हटाए गए डायरेक्टिव उपसर्ग के रूप में भी किया जाता है। अक्षम करने के लिए अनसेट छोड़ दें। | +| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (बंद) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | openai→claude स्ट्रीम की शुरुआत से इको किए गए सिस्टम-प्रॉम्प्ट प्रस्तावना ब्लॉकों को हटाने के लिए `1` पर सेट करें। डिफ़ॉल्ट रूप से बंद — अनुमान अंग्रेजी-गद्य के आकार के होते हैं और प्रतिक्रिया पेलोड को बदलते हैं, इसलिए एक वैध रूप से ऐसे अनुभाग के साथ शुरू होने वाली प्रतिक्रिया इसे खो देगी। | +| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | रिमोट `image_url` विजन इनपुट के लिए प्रति-छवि फ़ेच टाइमआउट (ms)। | +| `CURSOR_STATE_DB_PATH` | _(जांचा गया)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE संस्करण का पता लगाने के लिए उपयोग किए जाने वाले कर्सर IDE स्टेट DB लुकअप को ओवरराइड करें। | +| `CURSOR_AGENT_CLI_VERSION` | _(पता लगाएं / पिन करें)_ | `open-sse/utils/cursorAgentCliVersion.ts` | एजेंट रन पर `x-cursor-client-version: cli-…` के लिए एजेंट CLI बिल्ड आईडी (`YYYY.MM.DD-`)। | +| `CURSOR_AGENT_BIN` | _(unset)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | इमेज जनरेशन के लिए उपयोग किए जाने वाले कर्सर एजेंट बाइनरी का पथ। अनसेट होने पर, हैंडलर `providerSpecificData.agentBin` फिर PATH का उपयोग करता है। | +| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | कर्सर एजेंट इमेज जॉब्स के लिए प्रति-छवि वॉल क्लॉक (ms)। | +| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | कर्सर इमेज जॉब्स के लिए साझा-सीट समवर्ती गेट। | +| `CURSOR_IMG_MODEL` | अनुरोध / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | इमेज जॉब्स के लिए कर्सर CLI `--model` को ओवरराइड करें। | +| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) इमेज-जेन परिणाम-पोल कैडेंस (ms)। | +| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC इमेज-जेन परिणाम-पोल वॉल क्लॉक (ms)। | +| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) वीडियो-जेन परिणाम-पोल कैडेंस (ms)। | +| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC वीडियो-जेन परिणाम-पोल वॉल क्लॉक (ms)। | +| `CURSOR_DATA_DIR` | _(जांचा गया)_ | `open-sse/utils/cursorAgentCliVersion.ts` | कर्सर एजेंट CLI डेटा डायरेक्टरी (`…/versions/`) को ओवरराइड करें; वही वैरिएबल जो आधिकारिक एजेंट उपयोग करता है। | +| `CURSOR_TOKEN` | _(unset)_ | `scripts/ad-hoc/cursor-tap.cjs` | डेवलपर टूलिंग द्वारा उपयोग किया जाने वाला सीधा कर्सर बियरर टोकन। | +| `OMNIROUTE_LOG_REQUEST_SHAPE` | अक्षम (ऑप्ट-इन `"1"` के माध्यम से) | `src/app/api/v1/chat/completions/route.ts` | जब `"1"` सेट हो तो बड़े चैट पेलोड के लिए सामग्री-प्रकार/लंबाई मार्कर लॉग करें। लॉग शोर को कम करने के लिए डिफ़ॉल्ट रूप से बंद। | +| `DEBUG_RESPONSES_SSE_TO_JSON` | _(unset)_ | `open-sse/handlers/responseTranslator.ts` | रिस्पॉन्स API SSE→JSON अनुवाद विवरण लॉग करने के लिए `true` सेट करें। | +| `DEBUG_CLAUDE_NONSTREAM` | _(unset)_ | `open-sse/handlers/responseTranslator.ts` | क्लाउड प्रतिक्रिया अनुवाद पथ में खाली textContent चंक्स को सतह पर लाने के लिए `true` सेट करें (केवल डीबग)। | +| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(unset)_ | E2E टेस्ट हार्नेस | E2E टेस्ट मोड (शिथिल प्रमाणीकरण, टेस्ट हुक) सक्षम करने के लिए `true` सेट करें। | --- @@ -1220,7 +1317,7 @@ Anthropic-संगत प्रोवाइडर जोड़ें। ## परिनियोजन परिदृश्य -रिले बैकएंड SRE मार्गदर्शन (ts/bifrost/auto व्यवहार, 9router बनाम CLIProxyAPI प्लेसमेंट और उच्च-थ्रूपुट फ़ॉलबैक रणनीति) के लिए, [रिले बैकएंड रणनीति](/docs/reference/RELAY_BACKEND_STRATEGY.md) देखें। +रिले बैकएंड SRE मार्गदर्शन (ts/bifrost/auto व्यवहार, 9router बनाम CLIProxyAPI प्लेसमेंट, और उच्च-थ्रूपुट फ़ॉलबैक रणनीति) के लिए, [रिले बैकएंड रणनीति](/docs/reference/RELAY_BACKEND_STRATEGY.md) देखें। ### न्यूनतम स्थानीय विकास @@ -1232,7 +1329,7 @@ PORT=20128 NODE_ENV=development ``` -### Docker उत्पादन +### डॉकर उत्पादन ```bash JWT_SECRET= @@ -1262,7 +1359,7 @@ OMNIROUTE_DISABLE_BACKGROUND_SERVICES=true APP_LOG_TO_FILE=false ``` -### रिवर्स प्रॉक्सी वाला VPS (nginx + Cloudflare) +### रिवर्स प्रॉक्सी (nginx + Cloudflare) के साथ VPS ```bash JWT_SECRET= diff --git a/docs/i18n/hi/docs/reference/FEATURE_FLAGS.md b/docs/i18n/hi/docs/reference/FEATURE_FLAGS.md index 5919d7d121ba..caba7d022e6b 100644 --- a/docs/i18n/hi/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/hi/docs/reference/FEATURE_FLAGS.md @@ -44,123 +44,125 @@ ## फ़्लैग कैटलॉग -6 श्रेणियों में 72 फ़्लैग। **डिफ़ॉल्ट** परिभाषा का डिफ़ॉल्ट मान है — वह मान +6 श्रेणियों में 74 फ़्लैग। **डिफ़ॉल्ट** से आशय परिभाषा में निर्धारित डिफ़ॉल्ट से है — वह मान जिसका उपयोग तब किया जाता है, जब न तो कोई DB ओवरराइड और न ही कोई एनवायरनमेंट वेरिएबल मौजूद हो। ### सुरक्षा (10) -| कुंजी | प्रकार | डिफ़ॉल्ट | विवरण | -| --------------------------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | बूलियन | `false` | सभी इनकमिंग अनुरोधों के लिए API कुंजी आवश्यक करें। | -| `INPUT_SANITIZER_ENABLED` | बूलियन | `true` | सभी अनुरोधों के लिए इनपुट सैनिटाइज़ेशन सक्षम करें। | -| `INJECTION_GUARD_MODE` | एनम | `off` | प्रॉम्प्ट इंजेक्शन गार्ड मोड। मान: `off`, `warn`, `block`, `redact`। | -| `PII_REDACTION_ENABLED` | बूलियन | `false` | अनुरोधों से PII रिडैक्ट करें (`INPUT_SANITIZER_MODE` से स्वतंत्र)। | -| `PII_RESPONSE_SANITIZATION` | बूलियन | `false` | प्रोवाइडर प्रतिक्रियाओं से PII सैनिटाइज़ करें। | -| `PII_RESPONSE_SANITIZATION_MODE` | एनम | `redact` | PII प्रतिक्रिया सैनिटाइज़ेशन का मोड। मान: `redact`, `warn`, `block`, `off`। | -| `OUTBOUND_SSRF_GUARD_ENABLED` | बूलियन | `true` | निजी/आंतरिक IP रेंज के लिए आउटबाउंड अनुरोधों को ब्लॉक करें। | -| `ALLOW_API_KEY_REVEAL` | बूलियन | `false` | प्रमाणित डैशबोर्ड उपयोगकर्ताओं को केवल मास्क किए गए मान देखने के बजाय संग्रहीत API कुंजियाँ दिखाने की अनुमति दें। | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | बूलियन | `false` | AUTH लॉग पंक्तियों में अकाउंट प्रीफ़िक्स शामिल करें (जैसे, " अकाउंट का उपयोग किया जा रहा है: abc12345...")। डिफ़ॉल्ट रूप से अक्षम, ताकि साझा/मल्टी-टेनेंट प्रोसेस लॉग से अकाउंट पहचानकर्ता रिडैक्ट किए जाएँ। डीबग मोड से स्वतंत्र; डीबग मोड बदलने पर यह उजागर नहीं होता। | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | बूलियन | `false` | OIDC सक्षम होने पर पासवर्ड लॉगिन अक्षम करें, ताकि उपयोगकर्ता केवल OIDC सिंगल साइन-ऑन के माध्यम से प्रमाणित कर सकें। अक्षम होने पर (डिफ़ॉल्ट), पासवर्ड लॉगिन और OIDC दोनों उपलब्ध रहते हैं। | - -### नेटवर्क (15) - -| कुंजी | प्रकार | डिफ़ॉल्ट | पुनः आरंभ | विवरण | -| ----------------------------------------------- | ------- | -------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS फ़िंगरप्रिंट गुप्त मोड सक्षम करें। | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* रूट को localhost के बाहर होस्ट किए गए OpenAI-संगत प्रदाता नोड का उपयोग करने दें। डिफ़ॉल्ट रूप से बंद — ऑडियो को किसी रिमोट होस्ट पर रूट करने से एग्रेस पहचान बदल जाती है और यह ऑपरेटर का स्पष्ट निर्णय होना चाहिए। लूपबैक नोड की हमेशा अनुमति होती है और वे अप्रभावित रहते हैं। | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | जब किसी कनेक्शन को कोई प्रॉक्सी असाइन न की गई हो, तो रजिस्ट्री से पहली कार्यशील प्रॉक्सी स्वतः चुनें। डिफ़ॉल्ट रूप से बंद (अन्यथा रजिस्ट्री की कोई भी प्रॉक्सी वैश्विक फ़ॉलबैक बन जाती है — #3332)। | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | प्रॉक्सी पहुँच-योग्यता की पूर्व-जाँच विफल होने पर OAuth और प्रदाता सत्यापन प्रवाहों को पिन की गई प्रॉक्सी को बायपास करके सीधे कनेक्ट होने दें। डिफ़ॉल्ट रूप से बंद, क्योंकि इससे एग्रेस IP बदल सकता है। | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | बहु-अकाउंट रोटेशन निष्पादक में नेटवर्क अपवाद (टाइमआउट, कनेक्शन अस्वीकृत/रीसेट) आने पर, यदि विफल अकाउंट के पास समर्पित प्रॉक्सी नहीं है, तो प्रत्येक अकाउंट को पुनः आज़माने के बजाय थोड़ी अवधि का कूलडाउन लागू करें और शेष अनुरोध के लिए बिना प्रॉक्सी वाले अन्य अकाउंट छोड़ दें। डिफ़ॉल्ट रूप से चालू (सुरक्षित: एग्रेस IP में कोई बदलाव नहीं, केवल साझा-एग्रेस अकाउंट पर विलंबता/कूलडाउन का जोखिम घटाता है)। बिना प्रॉक्सी वाली पहली त्रुटि पर तत्काल प्रसार बहाल करने के लिए अक्षम करें। | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | प्रॉक्सी पूल और opencode का प्रति-अकाउंट रोटेशन हाल ही में विफल हुई प्रॉक्सी (अस्वीकृत TCP प्रोब, या उसके माध्यम से प्राप्त 429) को प्रति-प्रोसेस अवधि तक फिर से देना बंद कर देते हैं; यह अवधि प्रत्येक पुनरावृत्ति पर दोगुनी होती है, अधिकतम सीमा तक। कोई प्रॉक्सी स्थिति नहीं लिखी जाती; प्रत्येक उम्मीदवार को अलग रखे जाने पर चयन अपरिवर्तित रहता है। डिफ़ॉल्ट रूप से बंद। | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | डैशबोर्ड में किसी प्रॉक्सी पूल के अंतर्गत दिखाएँ कि पिछले 24 h में कितने प्रेक्षित एग्रेस IP ने उसके सदस्यों को सेवा दी और कितने कनेक्शन ने उनका उपयोग किया। केवल-पढ़ने योग्य, प्रॉक्सी लॉग से परिकलित और रूटिंग के लिए कभी उपयोग नहीं किया जाता। डिफ़ॉल्ट रूप से बंद। | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode निष्पादक के लिए, स्ट्रीम किए गए Responses उत्तर के पहले बॉडी बाइट पर नज़र रखें (विंडो: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, डिफ़ॉल्ट `15000`)। विंडो बीतने तक मौन रहने वाली 2xx Responses स्ट्रीम को रुका हुआ माना जाता है: अकाउंट को कूलडाउन पर रखा जाता है और अनुरोध एक बार अगले अकाउंट पर रोटेट होता है; दूसरी बार रुकने पर तुरंत विफल हो जाता है। डिफ़ॉल्ट रूप से बंद: रुकी हुई स्ट्रीम, स्ट्रीम तत्परता टाइमआउट तक आज की प्रतीक्षा जारी रखती हैं। | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode निष्पादक: `user_blocked` अस्वीकृति वाले 403/451 पर (न कि भौगोलिक कारण से, न ही Cloudflare फ़िंगरप्रिंट अस्वीकृति से), अस्वीकृत अकाउंट को कूलडाउन पर रखें और प्रति अनुरोध अधिकतम एक बार अगले अकाउंट पर रोटेट करें; दूसरी अस्वीकृति को सफलता चिह्न के बिना यथावत लौटाया जाता है। डिफ़ॉल्ट रूप से बंद: अपस्ट्रीम उपयोगकर्ता ब्लॉक से बचने के लिए रूटिंग करना बचाव जैसा लग सकता है और पूरे समूह में फ़्लैग फैला सकता है। | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode रोटेशन: लगातार दो अस्थायी अपस्ट्रीम विफलताओं (5xx या खाली 400) के बाद, अगले खाते से पहले रुकें — प्रत्येक अगली विफलता पर 1.5s को दोगुना करते हुए, प्रति विराम अधिकतम 6s और प्रति अनुरोध अधिकतम 10s तक; क्लाइंट डिस्कनेक्ट होने पर इसे छोड़ दिया जाता है; प्रतीक्षा से पहले विफल बॉडी को रिलीज़ कर दिया जाता है। डिफ़ॉल्ट रूप से बंद: फ़ेलओवर तत्काल रहता है। | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode रोटेशन: वास्तविक दर सीमा के रूप में वर्गीकृत पहले 429 पर खाता-चक्र रोकें (पार्स करने योग्य `Retry-After`, या दर/उपयोग सीमा का उल्लेख करने वाली बॉडी) और उस अपस्ट्रीम 429 को बिना बदलाव के लौटाएँ। अवर्गीकृत 429 पर रोटेशन जारी रहता है। डिफ़ॉल्ट रूप से बंद: मुफ़्त टियर प्रति इग्रेस IP सीमित है (#9611), इसलिए प्रत्येक 429 पर रोटेशन होता है और समाप्त हो चुका चक्र अंतिम अपस्ट्रीम 429 लौटाता है। | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM प्रॉक्सी के लिए TLS प्रमाणपत्र सत्यापन अक्षम करें। **ख़तरनाक।** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | निजी/आंतरिक नेटवर्क की ओर संकेत करने वाले प्रदाता URLs को अनुमति दें। | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | स्थानीय/निजी पतों (127.0.0.1, localhost, LAN) पर प्रदाताओं को जोड़ने/सत्यापित करने की अनुमति दें। डिफ़ॉल्ट रूप से चालू (स्थानीय-प्रथम); केवल सार्वजनिक पतों को अनुमति देने वाला सख़्त अवरोध लागू करने के लिए अक्षम करें। क्लाउड-मेटाडेटा अवरुद्ध रहता है। | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code-संगत प्रदाता मोड सक्षम करें। | +| कुंजी | प्रकार | डिफ़ॉल्ट | विवरण | +| --------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | सभी इनकमिंग अनुरोधों के लिए API कुंजी आवश्यक बनाएँ। | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | सभी अनुरोधों के लिए इनपुट सैनिटाइज़ेशन सक्षम करें। | +| `INJECTION_GUARD_MODE` | enum | `off` | प्रॉम्प्ट इंजेक्शन गार्ड मोड। मान: `off`, `warn`, `block`, `redact`। | +| `PII_REDACTION_ENABLED` | boolean | `false` | अनुरोधों से PII को रिडैक्ट करें (`INPUT_SANITIZER_MODE` से स्वतंत्र)। | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | प्रोवाइडर के रिस्पॉन्स से PII को सैनिटाइज़ करें। | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | PII रिस्पॉन्स सैनिटाइज़ेशन का मोड। मान: `redact`, `warn`, `block`, `off`। | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | निजी/आंतरिक IP रेंज के लिए आउटबाउंड अनुरोधों को ब्लॉक करें। | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | प्रमाणित डैशबोर्ड उपयोगकर्ताओं को केवल मास्क किए गए मान देखने के बजाय संग्रहीत API कुंजियाँ दिखाने की अनुमति दें। | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | AUTH लॉग पंक्तियों में अकाउंट प्रीफ़िक्स शामिल करें (उदा. "इस अकाउंट का उपयोग किया जा रहा है: abc12345...")। यह डिफ़ॉल्ट रूप से अक्षम रहता है, ताकि साझा/मल्टी-टेनेंट प्रोसेस लॉग से अकाउंट आइडेंटिफ़ायर रिडैक्ट किए जाएँ। यह डिबग मोड से स्वतंत्र है; डिबग मोड बदलने से यह प्रकट नहीं होता। | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | OIDC सक्षम होने पर पासवर्ड लॉगिन अक्षम करें, ताकि उपयोगकर्ता केवल OIDC सिंगल साइन-ऑन के माध्यम से प्रमाणित कर सकें। अक्षम होने पर (डिफ़ॉल्ट), पासवर्ड लॉगिन और OIDC दोनों उपलब्ध रहते हैं। | + +### नेटवर्क (16) + +| कुंजी | प्रकार | डिफ़ॉल्ट | पुनः आरंभ | विवरण | +| ----------------------------------------------- | ------- | -------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | TLS फ़िंगरप्रिंट स्टेल्थ मोड सक्षम करें। | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | /v1/audio/* रूट्स को localhost के बाहर होस्ट किए गए OpenAI-संगत प्रोवाइडर नोड्स का उपयोग करने दें। डिफ़ॉल्ट रूप से बंद — ऑडियो को किसी रिमोट होस्ट पर रूट करने से इग्रेस पहचान बदल जाती है और यह ऑपरेटर का स्पष्ट निर्णय होना चाहिए। लूपबैक नोड्स की हमेशा अनुमति होती है और वे अप्रभावित रहते हैं। | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | POST /v1/rerank (और मेमोरी इंजन के लूपबैक रीरैंक चरण) को localhost के बाहर होस्ट किए गए OpenAI-संगत प्रोवाइडर नोड्स का उपयोग करने दें। डिफ़ॉल्ट रूप से बंद — किसी रिमोट होस्ट पर रूट करने से इग्रेस पहचान बदल जाती है और यह ऑपरेटर का स्पष्ट निर्णय होना चाहिए। लूपबैक नोड्स की हमेशा अनुमति होती है; रिमोट नोड्स को प्रोवाइडर की आउटबाउंड URL नीति भी उत्तीर्ण करनी होगी। | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | जब किसी कनेक्शन को कोई प्रॉक्सी असाइन न की गई हो, तो रजिस्ट्री से पहली कार्यशील प्रॉक्सी स्वतः चुनें। डिफ़ॉल्ट रूप से बंद (अन्यथा रजिस्ट्री की कोई भी प्रॉक्सी वैश्विक फ़ॉलबैक बन जाती है — #3332)। | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | प्रॉक्सी की पहुँच-जाँच पूर्व-परीक्षण विफल होने पर OAuth और प्रोवाइडर सत्यापन प्रवाहों को पिन की गई प्रॉक्सी को बायपास करके सीधे कनेक्ट होने दें। डिफ़ॉल्ट रूप से बंद, क्योंकि इससे इग्रेस IP बदल सकता है। | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | बहु-अकाउंट रोटेशन एक्ज़ीक्यूटर में नेटवर्क अपवाद (टाइमआउट, कनेक्शन अस्वीकृत/रीसेट) आने पर, यदि विफल अकाउंट के पास समर्पित प्रॉक्सी नहीं है, तो हर अकाउंट को दोबारा आज़माने के बजाय एक छोटा कूलडाउन लागू करें और शेष अनुरोध के लिए अन्य प्रॉक्सी-विहीन अकाउंट्स को छोड़ दें। डिफ़ॉल्ट रूप से चालू (सुरक्षित: इग्रेस IP में कोई बदलाव नहीं, केवल साझा-इग्रेस अकाउंट्स पर विलंबता/कूलडाउन का जोखिम कम करता है)। पहली प्रॉक्सी-विहीन त्रुटि पर तत्काल प्रसार बहाल करने के लिए इसे अक्षम करें। | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | प्रॉक्सी पूल और opencode का प्रति-अकाउंट रोटेशन उस प्रॉक्सी को दोबारा उपलब्ध कराना बंद कर देते हैं जो अभी-अभी विफल हुई हो (अस्वीकृत TCP प्रोब, या उसके माध्यम से प्राप्त 429), प्रत्येक प्रोसेस की ऐसी अवधि के लिए जो हर पुनरावृत्ति पर दोगुनी होती है, अधिकतम सीमा तक। कोई प्रॉक्सी स्थिति नहीं लिखी जाती; प्रत्येक उम्मीदवार को अलग रखने पर चयन अपरिवर्तित रहता है। डिफ़ॉल्ट रूप से बंद। | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | डैशबोर्ड में किसी प्रॉक्सी पूल के अंतर्गत दिखाएँ कि पिछले 24 h में कितने प्रेक्षित इग्रेस IPs ने उसके सदस्यों को सेवा दी और कितने कनेक्शनों ने उनका उपयोग किया। केवल-पठन, प्रॉक्सी लॉग से गणना की जाती है, रूटिंग के लिए कभी उपयोग नहीं होती। डिफ़ॉल्ट रूप से बंद। | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode एक्ज़ीक्यूटर के लिए, स्ट्रीम किए गए Responses उत्तर के पहले बॉडी बाइट पर नज़र रखें (विंडो: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, डिफ़ॉल्ट `15000`)। विंडो बीतने के बाद भी मौन रहने वाली 2xx Responses स्ट्रीम को रुका हुआ माना जाता है: अकाउंट को कूलडाउन पर रखा जाता है और अनुरोध एक बार अगले अकाउंट पर रोटेट होता है; दूसरी बार रुकने पर तुरंत विफल हो जाता है। डिफ़ॉल्ट रूप से बंद: रुकी हुई स्ट्रीम्स, स्ट्रीम तत्परता टाइमआउट तक वर्तमान प्रतीक्षा जारी रखती हैं। | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode निष्पादक: `user_blocked` अस्वीकृति वाले 403/451 पर (भौगोलिक प्रतिबंध नहीं, Cloudflare फ़िंगरप्रिंट अस्वीकृति नहीं), अस्वीकृत खाते को अस्थायी रूप से रोकें और प्रति अनुरोध अधिकतम एक बार अगले खाते पर जाएँ; दूसरी अस्वीकृति बिना सफलता चिह्न के यथावत लौटाई जाती है। डिफ़ॉल्ट रूप से बंद: अपस्ट्रीम उपयोगकर्ता अवरोध से बचने के लिए रूटिंग करना नियमों से बचने जैसा लग सकता है और पूरे खाते-समूह में फ़्लैग फैला सकता है। | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode रोटेशन: लगातार दो अस्थायी अपस्ट्रीम विफलताओं (5xx या रिक्त 400) के बाद, अगले खाते से पहले रुकें — प्रत्येक अगली विफलता पर 1.5 सेकंड का विराम दोगुना होता है, जो प्रति विराम अधिकतम 6 सेकंड और प्रति अनुरोध अधिकतम 10 सेकंड तक सीमित है तथा क्लाइंट डिस्कनेक्ट होने पर छोड़ दिया जाता है; प्रतीक्षा से पहले विफल प्रतिक्रिया बॉडी मुक्त कर दी जाती है। डिफ़ॉल्ट रूप से बंद: फ़ेलओवर तत्काल रहता है। | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode रोटेशन: वास्तविक दर सीमा के रूप में वर्गीकृत पहले 429 पर खाता-क्रम रोकें (पार्स करने योग्य `Retry-After`, या दर/उपयोग सीमा बताने वाली बॉडी) और उस अपस्ट्रीम 429 को अपरिवर्तित लौटाएँ। अवर्गीकृत 429 पर रोटेशन जारी रहता है। डिफ़ॉल्ट रूप से बंद: निःशुल्क टियर प्रति एग्रेस IP सीमित है (#9611), इसलिए प्रत्येक 429 पर रोटेशन होता है और सभी खाते समाप्त हो जाने पर अंतिम अपस्ट्रीम 429 लौटाया जाता है। | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | MITM प्रॉक्सी के लिए TLS प्रमाणपत्र सत्यापन अक्षम करें। **ख़तरनाक।** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | निजी/आंतरिक नेटवर्क की ओर संकेत करने वाले प्रदाता URLs की अनुमति दें। | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | स्थानीय/निजी पतों (127.0.0.1, localhost, LAN) पर प्रदाताओं को जोड़ने/सत्यापित करने की अनुमति दें। डिफ़ॉल्ट रूप से चालू (स्थानीय-प्रथम); केवल सार्वजनिक पतों के सख़्त अवरोधन हेतु अक्षम करें। क्लाउड-मेटाडेटा अवरुद्ध रहता है। | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Claude Code-संगत प्रदाता मोड सक्षम करें। | ### नीतियाँ (5) -| कुंजी | प्रकार | डिफ़ॉल्ट | विवरण | -| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | टूल-उपयोग नीति प्रवर्तन मोड। मान: `disabled`, `warn`, `block`। | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | उपयोग पैटर्न के आधार पर दर सीमित करना स्वचालित रूप से सक्षम करें। | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | सीधे एकल-मॉडल अनुरोधों के लिए OmniRoute की स्थानीय कॉन्टेक्स्ट-विंडो / अधिकतम-इनपुट-टोकन जाँच को छोड़ें। अपस्ट्रीम सीमाएँ फिर भी लागू होती हैं। | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | जब लक्षित मॉडल में आवश्यक क्षमताएँ (विज़न, टूल्स, संरचित आउटपुट, कॉन्टेक्स्ट विंडो) न हों, तो डिस्पैच से पहले अनुरोध अस्वीकार करें। यह सीधे एकल-प्रदाता अनुरोधों की सुरक्षा करता है, जो कॉम्बो-लेयर संगतता फ़िल्टर को बायपास करते हैं। | -| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar मॉड्यूल (कैटलॉग फ़ीड स्क्रीन और सिंक) सक्षम करें। डिफ़ॉल्ट रूप से बंद; इसे सक्षम करने से केवल UI अनलॉक होता है — डेटा सिंक के लिए अलग से ऑप्ट-इन करना आवश्यक रहता है। | - -### रनटाइम (32) - -| कुंजी | प्रकार | डिफ़ॉल्ट | पुनः आरंभ | विवरण | -| ------------------------------------------- | ------- | -------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | कॉम्बो रूटिंग द्वारा मॉडल बदले जाने पर वार्तालाप सारांश जनरेट और इंजेक्ट करें। मॉडल स्विच को स्वतंत्र रूप से संभालने और सभी मौजूदा तथा भविष्य के कॉम्बो के लिए बैकग्राउंड हैंडऑफ़ अनुरोधों को रोकने हेतु इसे अक्षम करें। | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | क्लाइंट को अग्रेषित करने से पहले Responses API पासथ्रू स्ट्रीम से आंतरिक कमेंट्री-चरण आउटपुट आइटम हटा दें। अपरिष्कृत अपस्ट्रीम कमेंट्री प्राप्त करने के लिए इसे अक्षम करें। | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | MCP टूल एक्सेस पर स्कोप प्रतिबंध लागू करें। | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | टोकन उपयोग कम करने के लिए MCP टूल विवरणों को संपीड़ित करें। | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | रनटाइम पर बैकग्राउंड टास्क प्रोसेसिंग सक्षम करें। | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | सभी बैकग्राउंड सेवाएँ (कोटा रीफ़्रेश, सिंक आदि) अक्षम करें। | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | बिना सत्यापन के प्रोजेक्ट-स्तरीय RTK फ़िल्टर पर भरोसा करें। | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | इंपोर्ट करते समय रीयल-टाइम डैशबोर्ड WebSocket सर्वर शुरू करें (डिफ़ॉल्ट रूप से पोर्ट 20132)। | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex को Responses-over-WebSocket ट्रांसपोर्ट का उपयोग करने की अनुमति दें। बंद होने पर, Codex HTTP Responses पर वापस चला जाता है। | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex को स्थानीय app-server WebSocket JSON-RPC ट्रांसपोर्ट (codexTransport=app-server) का उपयोग करने की अनुमति दें। बंद होने पर, app-server का विकल्प चुनने वाले कनेक्शन Codex के अन्य ट्रांसपोर्ट पर वापस चले जाते हैं। | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | बजट समाप्त हो चुके अनुरोधों को आपातकालीन निःशुल्क फ़ॉलबैक प्रदाता/मॉडल पर रूट करें। (नीचे [आपातकालीन बजट फ़ॉलबैक](#emergency-budget-fallback) देखें।) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | क्लाइंट तक कोई भी प्रतिक्रिया बाइट पहुँचने से पहले काट दी गई अपस्ट्रीम SSE स्ट्रीम के लिए पारदर्शी प्रारंभिक पुनः प्रयास सक्षम करें। | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | बाइट्स के क्लाइंट तक पहले ही पहुँच जाने के बाद, स्ट्रीम रिकवरी को दोबारा अनुरोध करने और प्रतिक्रिया को जोड़ने की अनुमति दें। | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | मध्य-स्ट्रीम निरंतरता को टूल-कॉल के लिए सुरक्षित बनाएँ: टूल कॉल उत्सर्जित होने के बाद (प्रगति में या finish_reason tool_calls के साथ पहले ही समाप्त), कटी हुई स्ट्रीम को कभी फिर से शुरू न करें, और पूरा बजट खर्च करने के बजाय एक खाली निरंतरता के बाद बंद कर दें। बंद: रिलीज़ व्यवहार। | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | जब कोई SSE स्ट्रीम कोई उपयोगी फ़्रेम उत्सर्जित करने से पहले बंद हो जाए और सीमित समान-कनेक्शन पुनः प्रयास समाप्त हो चुका हो, तो किसी सहोदर कनेक्शन पर एक बार फ़ेलओवर करें; कोई उपयोग योग्य सहोदर न होने पर मूल `STREAM_EARLY_EOF` 502 लौटाया जाता है। डिफ़ॉल्ट रूप से बंद: समान-कनेक्शन पुनः प्रयास के बाद early-EOF अंतिम रहता है। | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` प्रतिक्रियाओं में प्रदर्शन-अनुकूल नाम फ़ील्ड शामिल करें। केवल मॉडल ID की अपेक्षा करने वाले क्लाइंट के लिए इसे अक्षम करें। | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | यह नियंत्रित करता है कि /v1/models में मॉडल ID के आगे उपसर्ग कैसे लगाए जाते हैं। 'dual' (डिफ़ॉल्ट) पश्चगामी संगतता के लिए उपनाम और कैनोनिकल provider-id, दोनों उपसर्ग उत्सर्जित करता है। 'alias' केवल छोटा उपनाम उपसर्ग उत्सर्जित करता है (उदाहरण: ds-web/model, न कि deepseek-web/model)। 'canonical' केवल पूर्ण provider-id उपसर्ग उत्सर्जित करता है। मान: `dual`, `alias`, `canonical`। | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | मॉडल इंटेलिजेंस रैंकिंग के लिए समय-समय पर Arena AI लीडरबोर्ड ELO सिंक सक्षम करें। | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `/v1/models` पर `claude//` मिरर आईडी प्रदर्शित करें, ताकि Claude Code गेटवे मॉडल डिस्कवरी गैर-Claude मॉडल सूचीबद्ध करे। तीन-स्तरीय गेट का वैश्विक स्तर (env, डैशबोर्ड ओवरराइड से अधिक प्राथमिकता रखता है)। [Claude Code कॉन्फ़िगरेशन](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) देखें। | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | `no-think//` गेटवे उपनामों के लिए मास्टर स्विच। चालू (डिफ़ॉल्ट): `/v1/models` प्रत्येक योग्य, सोचने में सक्षम Claude मॉडल के लिए बिना-सोच वाला संस्करण प्रदर्शित करता है, और अनुरोध में भेजी गई `no-think/` आईडी, रीजनिंग को दबाकर वास्तविक मॉडल पर वापस रिज़ॉल्व होती है। बंद: कोई संस्करण प्रदर्शित नहीं किया जाता और `no-think/` आईडी को किसी अन्य अज्ञात मॉडल आईडी की तरह माना जाता है। इसके चालू रहने पर भी प्रति-मॉडल `ModelSpec.noThinkingAlias` ऑप्ट-इन/ऑप्ट-आउट लागू होता है। | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | `/v1/models` कैटलॉग में सोचने के स्तर वाले संस्करणों (जैसे `-low`, `-medium`, `-high`) का जनरेशन अक्षम करें। | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | प्रोवाइडर डिस्पैच (#9654) के लिए प्रति-टेनेंट अनुकूली वर्चुअल एडमिशन लेन सक्षम करें: अब एक टेनेंट के बर्स्ट के कारण दूसरे को 503 नहीं मिलेगा। `OMNIROUTE_CHAT_VIRTUAL_LANES` env var इस डैशबोर्ड ओवरराइड से अधिक प्राथमिकता रखता है; परिवर्तन सर्वर रीस्टार्ट पर प्रभावी होते हैं। | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | उन मॉडलों के लिए `/v1/models` पर `/` मिरर आईडी प्रदर्शित करें, जिनके कैनॉनिकल स्वामी के पास कोई सक्रिय क्रेडेंशियल नहीं है, लेकिन सक्रिय क्रेडेंशियल वाला कोई पासथ्रू गेटवे उन्हें रूट करता है। चेतावनी: वैश्विक रूप से सक्षम करने पर यह सभी क्लाइंट के लिए कैटलॉग प्रविष्टियाँ जोड़ता है। | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API एग्रीगेटर-संगत नोड के लिए बैलेंस डिटेक्शन सक्षम करें। सक्षम होने पर, एग्रीगेटर फ़्लैग सेट वाले संगत नोड डैशबोर्ड और कोटा-प्रीफ़्लाइट रूटिंग में अपना बैलेंस रिपोर्ट करेंगे। | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | गैर-स्ट्रीमिंग, सर्वर-स्वामित्व वाली टूल कॉल तब तक जारी रखें, जब तक मॉडल क्लाइंट द्वारा उपयोग योग्य प्रतिक्रिया न लौटाए। | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | खोज आँकड़े और हाल की खोजें केवल उन्हीं प्रोवाइडर को गिनती हैं जिनका कनेक्शन अभी भी सक्रिय है (duckduckgo-free जैसे की-रहित प्रोवाइडर हमेशा गिने जाते हैं)। बंद होने पर, प्रोवाइडर आईडी वाली प्रत्येक संरक्षित खोज पंक्ति बनी रहती है। | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | डैशबोर्ड प्रोवाइडर पेज: Free बैज केवल उन संकेतों पर दिखाएँ जिन्हें प्रोवाइडर मान्यता देता है—डिस्प्ले-नेम ह्यूरिस्टिक, गैर-बूलियन free फ़ील्ड और बिना दस्तावेज़ीकृत फ़्री टियर वाले पंजीकृत प्रोवाइडर पर `:free` सफ़िक्स हटा दिए जाते हैं। बंद होने पर ऐतिहासिक बैज नियम बना रहता है। | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | एग्रीगेट की गई 429/503 अनुपलब्ध प्रतिक्रियाओं में, जब भविष्य में पुनः प्रयास का कोई निश्चित समय ज्ञात न हो, तो कृत्रिम 1s के बजाय `Retry-After` छोड़ दें, `error.retry_after_provenance` (`signal` \| `none`) जोड़ें, और कॉम्बो ड्रेन पाथ को JSON तथा प्लेन-टेक्स्ट अपस्ट्रीम बॉडी से पुनः प्रयास संबंधी लिखित संकेत पढ़ने दें। यह फ़ील्ड केवल `unavailableResponse()` द्वारा बनाई गई प्रतिक्रियाओं पर दिखाई देता है; अन्य 429/503 बॉडी अपरिवर्तित रहती हैं। | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | जब केवल-कोटा-समाप्ति-पर-फ़ॉलबैक के रूप में चिह्नित `priority` कॉम्बो लक्ष्य किसी ऐसे कारण से कॉम्बो को रोक देता है जो प्रमाणित रूप से कोटा नहीं है (प्रदाता सर्किट ब्रेकर खुला होना, पूर्वानुमानित विलंबता के कारण छोड़ना), तो कोटा जैसा दिखने वाला 503 देने के बजाय 502 लौटाएँ। लॉकआउट, कूलडाउन, अनुपलब्धता, समाप्ति और समवर्तीता-सीमा के कारण होने वाले स्टॉप के लिए 503 ही रहता है। | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | एक सामान्य Mistral 401 (`{"detail":"Unauthorized"}`, बिना किसी स्पष्ट प्रमाणीकरण संकेत के) निरस्त कुंजी और समाप्त कोटा—दोनों के लिए समान होता है। चालू होने पर, यह कनेक्शन को `expired` के रूप में पार्क करने के बजाय कूलडाउन में डालता है, प्रति कनेक्शन प्रति घंटे अधिकतम 3 बार; अगली बार यह उसे पार्क कर देता है, इसलिए निरस्त कुंजी अंततः उसी स्थिति में पहुँच जाती है। डिफ़ॉल्ट रूप से बंद: पहले की तरह प्रत्येक सामान्य Mistral 401 कनेक्शन को पार्क कर देता है। | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | स्थिर स्टैटिक सीड के बजाय, OAuth bearer token का उपयोग करके `https://api.x.ai/v1/models` से `xai-oauth` कनेक्शनों के लिए लाइव xAI मॉडल कैटलॉग प्राप्त करें। डिफ़ॉल्ट रूप से बंद: `xai-oauth` बिना किसी बदलाव के स्टैटिक सीड प्रदान करता रहता है। किसी भी समाधान त्रुटि पर, डिस्कवरी सीड पर वापस चली जाती है (यह सत्यापित नहीं है कि x.ai इस एंडपॉइंट पर OAuth bearer स्वीकार करता है या नहीं)। | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | स्वचालित क्लीनअप स्वीप को `OMNIROUTE_BATCH_RETENTION_DAYS` से पुराने अंतिम अवस्था वाले (पूर्ण/विफल/रद्द/समाप्त) Batch API जॉब्स और उनके प्रति-पंक्ति चेकपॉइंट हटाने दें, साथ ही अपनी `expires_at` अवधि पार कर चुकी अपलोड की गई फ़ाइलों की BLOB सामग्री साफ़ करने दें। डिफ़ॉल्ट रूप से बंद: ऑपरेटर द्वारा इसे स्पष्ट रूप से चालू किए जाने तक प्रत्येक मौजूदा इंस्टॉलेशन इस डेटा को ठीक पहले की तरह बनाए रखता है। ऑपरेटर द्वारा ट्रिगर किया गया `DELETE /api/v1/batches/delete-completed` रूट दोनों ही स्थितियों में अप्रभावित रहता है—यह एक अलग, बिना शर्त सार्वजनिक API अनुबंध है। | +| कुंजी | प्रकार | डिफ़ॉल्ट | विवरण | +| ------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | टूल-उपयोग नीति प्रवर्तन मोड। मान: `disabled`, `warn`, `block`। | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | उपयोग पैटर्न के आधार पर दर सीमित करना स्वचालित रूप से सक्षम करें। | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | प्रत्यक्ष एकल-मॉडल अनुरोधों के लिए OmniRoute की स्थानीय कॉन्टेक्स्ट-विंडो / अधिकतम-इनपुट-टोकन जाँच छोड़ें। अपस्ट्रीम सीमाएँ फिर भी लागू होती हैं। | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | जब लक्षित मॉडल में आवश्यक क्षमताएँ (विज़न, टूल्स, संरचित आउटपुट, कॉन्टेक्स्ट विंडो) न हों, तो डिस्पैच से पहले अनुरोध अस्वीकार करें। यह उन प्रत्यक्ष एकल-प्रदाता अनुरोधों की सुरक्षा करता है जो कॉम्बो-लेयर संगतता फ़िल्टर को बायपास करते हैं। | +| `RADAR_ENABLED` | boolean | `false` | OmniRoute Radar मॉड्यूल (कैटलॉग फ़ीड स्क्रीन और सिंक) सक्षम करें। डिफ़ॉल्ट रूप से बंद; सक्षम करने से केवल UI अनलॉक होता है — डेटा सिंक के लिए अलग से सहमति देना आवश्यक रहता है। | + +### रनटाइम (33) + +| कुंजी | प्रकार | डिफ़ॉल्ट | पुनः आरंभ | विवरण | +| ------------------------------------------- | ------- | -------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | बूलियन | `true` | | कॉम्बो रूटिंग द्वारा मॉडल बदले जाने पर वार्तालाप सारांश जनरेट करके इंजेक्ट करें। मॉडल स्विच को स्वतंत्र रूप से संभालने और सभी मौजूदा तथा भावी कॉम्बो के लिए बैकग्राउंड हैंडऑफ़ अनुरोधों को रोकने हेतु इसे अक्षम करें। | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | बूलियन | `true` | | क्लाइंट को अग्रेषित करने से पहले Responses API पासथ्रू स्ट्रीम से आंतरिक कमेंट्री-चरण आउटपुट आइटम हटा दें। अपरिष्कृत अपस्ट्रीम कमेंट्री प्राप्त करने हेतु इसे अक्षम करें। | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | बूलियन | `true` | | MCP टूल एक्सेस पर स्कोप प्रतिबंध लागू करें। | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | बूलियन | `false` | | टोकन उपयोग कम करने के लिए MCP टूल विवरणों को संपीड़ित करें। | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | बूलियन | `false` | | रनटाइम पर बैकग्राउंड कार्य प्रसंस्करण सक्षम करें। | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | बूलियन | `false` | ✓ | सभी बैकग्राउंड सेवाएँ (कोटा रीफ़्रेश, सिंक आदि) अक्षम करें। | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | बिना सत्यापन के प्रोजेक्ट-स्तरीय RTK फ़िल्टर पर भरोसा करें। | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | इंपोर्ट पर रीयल-टाइम डैशबोर्ड WebSocket सर्वर शुरू करें (डिफ़ॉल्ट रूप से पोर्ट 20132)। | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Codex को Responses-over-WebSocket ट्रांसपोर्ट का उपयोग करने दें। बंद होने पर, Codex HTTP Responses पर फ़ॉलबैक करता है। | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Codex को स्थानीय app-server WebSocket JSON-RPC ट्रांसपोर्ट (`codexTransport=app-server`) का उपयोग करने दें। बंद होने पर, app-server को चुनने वाले कनेक्शन Codex के अन्य ट्रांसपोर्ट पर फ़ॉलबैक करते हैं। | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | बजट समाप्त होने वाले अनुरोधों को आपातकालीन मुफ़्त फ़ॉलबैक प्रदाता/मॉडल पर रूट करें। (नीचे [आपातकालीन बजट फ़ॉलबैक](#emergency-budget-fallback) देखें।) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | क्लाइंट तक प्रतिक्रिया का कोई भी बाइट पहुँचने से पहले काटी गई अपस्ट्रीम SSE स्ट्रीम के लिए पारदर्शी प्रारंभिक पुनः प्रयास सक्षम करें। | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | क्लाइंट तक बाइट पहुँच जाने के बाद भी स्ट्रीम रिकवरी को प्रतिक्रिया का पुनः अनुरोध करने और उसे जोड़ने की अनुमति दें। | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | मध्य-स्ट्रीम निरंतरता को टूल-कॉल के लिए सुरक्षित बनाएँ: टूल कॉल उत्सर्जित होने के बाद (प्रगति पर हो या `finish_reason` `tool_calls` के साथ पहले ही समाप्त हो चुका हो) कटी हुई स्ट्रीम को कभी पुनः शुरू न करें, और पूरा बजट खर्च करने के बजाय एक खाली निरंतरता के बाद बंद कर दें। बंद: रिलीज़ व्यवहार। | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | जब कोई SSE स्ट्रीम किसी उपयोगी फ़्रेम को उत्सर्जित करने से पहले बंद हो जाती है और उसी कनेक्शन पर सीमित पुनः प्रयास समाप्त हो चुका होता है, तो किसी सहोदर कनेक्शन पर एक बार फ़ेलओवर करें; कोई उपयोगी सहोदर उपलब्ध न होने पर मूल `STREAM_EARLY_EOF` 502 लौटाया जाता है। डिफ़ॉल्ट रूप से बंद: उसी कनेक्शन पर पुनः प्रयास के बाद early-EOF अंतिम रहता है। | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` प्रतिक्रियाओं में प्रदर्शन-अनुकूल नाम फ़ील्ड शामिल करें। केवल मॉडल ID की अपेक्षा करने वाले क्लाइंट के लिए इसे अक्षम करें। | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | यह नियंत्रित करता है कि /v1/models में मॉडल ID के आगे उपसर्ग कैसे लगाए जाते हैं। 'dual' (डिफ़ॉल्ट) पश्चगामी संगतता के लिए उपनाम और कैनोनिकल provider-id, दोनों उपसर्ग उत्सर्जित करता है। 'alias' केवल छोटा उपनाम उपसर्ग उत्सर्जित करता है (उदा. ds-web/model, न कि deepseek-web/model)। 'canonical' केवल पूरा provider-id उपसर्ग उत्सर्जित करता है। मान: `dual`, `alias`, `canonical`। | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | मॉडल बुद्धिमत्ता रैंकिंग के लिए समय-समय पर Arena AI लीडरबोर्ड ELO सिंक सक्षम करें। | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `/v1/models` पर `claude//` मिरर ID प्रदर्शित करें, ताकि Claude Code गेटवे मॉडल खोज में गैर-Claude मॉडल सूचीबद्ध हों। त्रि-स्तरीय गेट का वैश्विक स्तर (env, डैशबोर्ड ओवरराइड पर प्राथमिकता लेता है)। [Claude Code कॉन्फ़िगरेशन](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker) देखें। | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// गेटवे उपनामों के लिए मुख्य स्विच। चालू (डिफ़ॉल्ट): /v1/models प्रत्येक योग्य, चिंतन-सक्षम Claude मॉडल के लिए एक चिंतन-रहित वेरिएंट प्रदर्शित करता है, और अनुरोध में भेजी गई no-think/ ID को तर्क-विचार दबाकर वापस वास्तविक मॉडल में रिज़ॉल्व किया जाता है। बंद: कोई वेरिएंट प्रदर्शित नहीं किया जाता और no-think/ ID को किसी भी अन्य अज्ञात मॉडल ID की तरह माना जाता है। इसके चालू रहने पर प्रति-मॉडल ModelSpec.noThinkingAlias ऑप्ट-इन/ऑप्ट-आउट अब भी लागू होता है। | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | /v1/models कैटलॉग में चिंतन-स्तर वेरिएंट (उदा. -low, -medium, -high) बनाना अक्षम करें। | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | प्रोवाइडर डिस्पैच (#9654) के लिए प्रति-टेनेंट अनुकूली वर्चुअल एडमिशन लेन सक्षम करें: अब एक टेनेंट का अचानक बढ़ा लोड दूसरे के लिए 503 उत्पन्न नहीं करता। OMNIROUTE_CHAT_VIRTUAL_LANES env var को इस डैशबोर्ड ओवरराइड पर प्राथमिकता मिलती है; परिवर्तन सर्वर पुनरारंभ पर प्रभावी होते हैं। | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | उन मॉडलों के लिए /v1/models पर / मिरर आईडी प्रदर्शित करें, जिनके कैनोनिकल स्वामी के पास कोई सक्रिय क्रेडेंशियल नहीं है, लेकिन सक्रिय क्रेडेंशियल वाला कोई पासथ्रू गेटवे उन्हें रूट करता है। चेतावनी: वैश्विक रूप से सक्षम किए जाने पर यह सभी क्लाइंट के लिए कैटलॉग प्रविष्टियाँ जोड़ता है। | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | New-API / One-API / Sub2API एग्रीगेटर-संगत नोड्स के लिए बैलेंस पहचान सक्षम करें। सक्षम होने पर, एग्रीगेटर फ़्लैग सेट किए गए संगत नोड्स डैशबोर्ड और कोटा-प्रीफ़्लाइट रूटिंग में अपना बैलेंस दिखाएँगे। | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | नॉन-स्ट्रीमिंग सर्वर-स्वामित्व वाली टूल कॉल्स को तब तक जारी रखें, जब तक मॉडल क्लाइंट द्वारा उपयोग योग्य प्रतिक्रिया न लौटाए। | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | खोज आँकड़ों और हाल की खोजों में केवल उन प्रदाताओं की गणना करें, जिनके पास अभी भी लाइव कनेक्शन है (duckduckgo-free जैसे की-रहित प्रदाताओं की गणना हमेशा होती है)। बंद रहने पर, प्रदाता आईडी वाली प्रत्येक संरक्षित खोज पंक्ति बनी रहती है। | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | डैशबोर्ड के प्रदाता पृष्ठ: Free बैज केवल उन्हीं संकेतों पर दिखाएँ जिनका प्रदाता समर्थन करता है—बिना दस्तावेजीकृत मुफ़्त टियर वाले पंजीकृत प्रदाताओं के लिए डिस्प्ले-नाम अनुमान, नॉन-बूलियन फ़्री फ़ील्ड और :free प्रत्यय हटा दिए जाते हैं। बंद रहने पर ऐतिहासिक बैज नियम बना रहता है। | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | एग्रीगेट की गई 429/503 अनुपलब्ध प्रतिक्रियाओं पर, जब भविष्य का कोई ठोस पुनः प्रयास समय ज्ञात न हो, तो `Retry-After` को छोड़ दें (कृत्रिम 1s के बजाय), `error.retry_after_provenance` (`signal` \| `none`) जोड़ें, और कॉम्बो ड्रेन पाथ को JSON तथा प्लेन-टेक्स्ट अपस्ट्रीम बॉडी से पुनः प्रयास संबंधी गद्य संकेत पढ़ने दें। यह फ़ील्ड केवल `unavailableResponse()` द्वारा बनाई गई प्रतिक्रियाओं में दिखाई देता है; अन्य 429/503 बॉडी अपरिवर्तित रहती हैं। | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | जब `priority` कॉम्बो टार्गेट, जिसे केवल कोटा समाप्त होने पर फ़ॉलबैक के रूप में चिह्नित किया गया है, किसी ऐसे कारण से कॉम्बो रोकता है जो प्रमाणित रूप से कोटा से संबंधित नहीं है (प्रदाता सर्किट ब्रेकर खुला होना, पूर्वानुमानित लेटेंसी स्किप), तो कोटा जैसा दिखने वाला 503 देने के बजाय 502 दें। लॉकआउट, कूलडाउन, अनुपलब्धता, समाप्ति और समवर्तीता-सीमा के कारण रुकने पर 503 ही दिया जाता है। | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | बिना किसी स्पष्ट प्रमाणीकरण संकेत वाला सामान्य Mistral 401 (`{"detail":"Unauthorized"}`) निरस्त की गई कुंजी और समाप्त हो चुके कोटा—दोनों के लिए एक जैसा होता है। चालू रहने पर, यह कनेक्शन को `expired` के रूप में निष्क्रिय करने के बजाय कूलडाउन में डालता है, प्रति कनेक्शन प्रति घंटे अधिकतम 3 बार; अगली बार इसे निष्क्रिय कर दिया जाता है, ताकि निरस्त कुंजी अंततः उसी स्थिति में पहुँच जाए। डिफ़ॉल्ट रूप से बंद: पहले की तरह प्रत्येक सामान्य Mistral 401 कनेक्शन को निष्क्रिय कर देता है। | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | स्थिर स्टैटिक सीड के बजाय, OAuth bearer token का उपयोग करके `https://api.x.ai/v1/models` से `xai-oauth` कनेक्शनों के लिए लाइव xAI मॉडल कैटलॉग प्राप्त करें। डिफ़ॉल्ट रूप से बंद: `xai-oauth` बिना किसी बदलाव के स्टैटिक सीड उपलब्ध कराता रहता है। किसी भी रिज़ॉल्यूशन त्रुटि पर, डिस्कवरी वापस सीड पर आ जाती है (यह सत्यापित नहीं है कि x.ai इस एंडपॉइंट पर OAuth bearer स्वीकार करता है या नहीं)। | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | स्वचालित क्लीनअप स्वीप को `OMNIROUTE_BATCH_RETENTION_DAYS` से पुराने टर्मिनल (पूर्ण/विफल/रद्द/समाप्त) Batch API जॉब, उनके प्रति-पंक्ति चेकपॉइंट सहित, हटाने और अपनी `expires_at` अवधि पार कर चुकी अपलोड की गई फ़ाइलों की BLOB सामग्री साफ़ करने दें। डिफ़ॉल्ट रूप से बंद: ऑपरेटर द्वारा इसे सक्षम किए जाने तक प्रत्येक मौजूदा इंस्टॉलेशन इस डेटा को पहले की तरह ही रखता है। ऑपरेटर द्वारा ट्रिगर किया गया `DELETE /api/v1/batches/delete-completed` रूट किसी भी स्थिति में अप्रभावित रहता है — यह एक अलग, बिना शर्त वाला सार्वजनिक API अनुबंध है। | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | चुने गए Antigravity खाते को उस अनुरोध के स्ट्रीमिंग जीवनचक्र के लिए आरक्षित करें जिसने उसे चुना है, ताकि कोई समवर्ती पुनः प्रयास या क्रेडेंशियल हैंडऑफ़ पहले से इन-फ़्लाइट स्ट्रीम के लिए प्रतिबद्ध खाते को दोबारा न चुन सके। आरक्षण का दायरा (कनेक्शन, कॉल किए जा सकने वाले अपस्ट्रीम मॉडल) तक सीमित है, इसलिए एक खाता अब भी एक ही समय में दो अलग-अलग मॉडल को सेवा दे सकता है। जब प्रत्येक पात्र खाता उस मॉडल के लिए पहले से लीज़ पर हो, तो अनुरोध किसी व्यस्त खाते पर और भार डालने के बजाय सीमित `Retry-After` के साथ एक संरचित 503 `antigravity_pool_busy` लौटाता है। डिफ़ॉल्ट रूप से बंद: खाता चयन बिल्कुल पहले जैसा रहता है और कोई आरक्षण नहीं किया जाता। | ### CLI (5) -| कुंजी | प्रकार | डिफ़ॉल्ट | पुनरारंभ | विवरण | -| ------------------------------------- | ------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | सभी CLI क्लाइंट के लिए संगतता मोड सक्षम करें। | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | मॉडल उपनाम संगतता परत सक्षम करें। | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | मूल्य-निर्धारण डेटा का स्वचालित समन्वयन सक्षम करें (इसके लिए `PRICING_SYNC_ENABLED` पर्यावरण चर भी आवश्यक है)। | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | प्रदाता मॉडल समन्वयन के बाद, लाइव कैटलॉग से ~/.codex/*.config.toml प्रोफ़ाइल फ़ाइलें स्वचालित रूप से (पुनः) लिखें। सक्रिय/डिफ़ॉल्ट Codex कॉन्फ़िगरेशन को कभी नहीं बदलता। डिफ़ॉल्ट रूप से बंद। | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | प्रदाता मॉडल समन्वयन के बाद, लाइव कैटलॉग से ~/.claude/profiles//settings.json Claude Code प्रोफ़ाइल स्वचालित रूप से (पुनः) लिखें। सक्रिय/डिफ़ॉल्ट Claude कॉन्फ़िगरेशन को कभी नहीं बदलता। डिफ़ॉल्ट रूप से बंद। | +| कुंजी | प्रकार | डिफ़ॉल्ट | पुनः आरंभ | विवरण | +| ------------------------------------- | ------- | -------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | सभी CLI क्लाइंट के लिए संगतता मोड सक्षम करें। | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | मॉडल एलियास संगतता परत सक्षम करें। | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | स्वचालित मूल्य-निर्धारण डेटा सिंक्रनाइज़ेशन सक्षम करें (`PRICING_SYNC_ENABLED` पर्यावरण चर भी आवश्यक है)। | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | प्रदाता मॉडल सिंक के बाद, लाइव कैटलॉग से ~/.codex/*.config.toml प्रोफ़ाइल फ़ाइलें स्वचालित रूप से (पुनः) लिखें। सक्रिय/डिफ़ॉल्ट Codex कॉन्फ़िग को कभी नहीं बदलता। डिफ़ॉल्ट रूप से बंद। | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | प्रदाता मॉडल सिंक के बाद, लाइव कैटलॉग से ~/.claude/profiles//settings.json Claude Code प्रोफ़ाइल स्वचालित रूप से (पुनः) लिखें। सक्रिय/डिफ़ॉल्ट Claude कॉन्फ़िग को कभी नहीं बदलता। डिफ़ॉल्ट रूप से बंद। | ### स्वास्थ्य (5) -| कुंजी | प्रकार | डिफ़ॉल्ट | विवरण | -| ----------------------------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | बूलियन | `false` | स्थानीय इंस्टेंस के हेल्थ चेक एंडपॉइंट को अक्षम करें। | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | बूलियन | `false` | टोकन सत्यापन हेल्थ चेक को अक्षम करें। | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | बूलियन | `false` | स्किल्स सैंडबॉक्स परिवेश में नेटवर्क एक्सेस सक्षम करें। | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | बूलियन | `false` | प्रॉक्सी हेल्थ स्वीप में, लक्ष्य द्वारा अस्वीकार की गई जाँच (401/403/429), प्रॉक्सी की लगातार-विफलता श्रृंखला को रीसेट करती है। डिफ़ॉल्ट रूप से बंद: अस्वीकृति तटस्थ रहती है (#10654)। 5xx दोनों ही स्थितियों में अनिर्णायक रहता है; अस्वीकृति कभी भी किसी प्रॉक्सी को हटाती, अक्षम या पुनः सक्रिय नहीं करती। | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | बूलियन | `false` | स्टार्टअप पूरा होने तक उसे अवरुद्ध करने के बजाय, सर्वर द्वारा अनुरोध स्वीकार करना शुरू करने के बाद (`setImmediate` के माध्यम से) स्टार्टअप DB अखंडता/हेल्थ चेक चलाएँ (#13717)। डिफ़ॉल्ट रूप से बंद: स्टार्टअप ठीक उसी तरह अवरुद्ध रहता है जैसे इस PR से पहले रहता था। | +| कुंजी | प्रकार | डिफ़ॉल्ट | विवरण | +| ----------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | स्थानीय इंस्टेंस के स्वास्थ्य-जाँच एंडपॉइंट को अक्षम करें। | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | टोकन सत्यापन स्वास्थ्य-जाँच को अक्षम करें। | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | स्किल्स सैंडबॉक्स परिवेश में नेटवर्क एक्सेस सक्षम करें। | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | प्रॉक्सी स्वास्थ्य स्वीप में, लक्ष्य द्वारा अस्वीकार किया गया प्रोब (401/403/429) प्रॉक्सी की लगातार-विफलता शृंखला को रीसेट करता है। डिफ़ॉल्ट रूप से बंद: अस्वीकृति तटस्थ रहती है (#10654)। 5xx दोनों ही स्थितियों में अनिर्णायक रहता है; अस्वीकृति कभी भी किसी प्रॉक्सी को हटाती, अक्षम या पुनः सक्रिय नहीं करती। | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | स्टार्टअप को जाँच पूर्ण होने तक अवरुद्ध करने के बजाय, सर्वर द्वारा अनुरोध स्वीकार करना शुरू करने के बाद (`setImmediate` के माध्यम से) स्टार्टअप DB अखंडता/स्वास्थ्य-जाँच चलाएँ (#13717)। डिफ़ॉल्ट रूप से बंद: स्टार्टअप ठीक उसी तरह अवरुद्ध रहता है जैसे इस PR से पहले रहता था। | > [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` और इसका लीगेसी उपनाम +> `INPUT_SANITIZER_BLOCK_THRESHOLD` और इसका पुराना उपनाम > `INJECTION_GUARD_BLOCK_THRESHOLD`, `INJECTION_GUARD_MODE` के `block` मोड को -> समायोजित करते हैं, लेकिन ये [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) -> द्वारा पढ़े जाने वाले सामान्य एनवायरनमेंट वेरिएबल हैं, -> फ़ीचर फ़्लैग नहीं: इनके लिए कोई DB ओवरराइड या डैशबोर्ड टॉगल उपलब्ध नहीं है। देखें +> समायोजित करते हैं, लेकिन वे साधारण परिवेश चर हैं जिन्हें +> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts) +> द्वारा पढ़ा जाता है, फ़ीचर फ़्लैग नहीं: उनके लिए कोई DB ओवरराइड और कोई डैशबोर्ड टॉगल नहीं है। देखें > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication)। > [!NOTE] -> `Restart` कॉलम उन फ़्लैग को चिह्नित करता है जिनमें `requiresRestart: true` है — मान -> तुरंत सहेजा जाता है, लेकिन प्रक्रिया के पुनः लोड होने के बाद ही प्रभावी होता है। Enum -> फ़्लैग अपने अनुमत सेट से बाहर के किसी भी मान को अस्वीकार करते हैं (सर्वर-साइड पर +> `Restart` कॉलम `requiresRestart: true` वाले फ़्लैग चिह्नित करता है — मान +> तुरंत स्थायी रूप से सहेजा जाता है, लेकिन प्रक्रिया के पुनः लोड होने के बाद ही प्रभावी होता है। Enum +> फ़्लैग अपने अनुमत समुच्चय के बाहर के किसी भी मान को अस्वीकार करते हैं (सर्वर-साइड पर > `setFeatureFlagOverride()` और REST `PUT` हैंडलर, दोनों में सत्यापित)। --- @@ -169,26 +171,26 @@ ### डैशबोर्ड -**Dashboard → Settings → Feature Flags** -(`/dashboard/settings/feature-flags`) पर जाएँ। ग्रिड +**डैशबोर्ड → सेटिंग्स → फ़ीचर फ़्लैग्स** पर जाएँ +(`/dashboard/settings/feature-flags`)। ग्रिड (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) -में ये सुविधाएँ उपलब्ध हैं: +इनका समर्थन करता है: - कुंजी या विवरण के आधार पर **खोज**, और श्रेणी के आधार पर **फ़िल्टर** (साथ ही एक कृत्रिम - **Requires Restart** दृश्य)। -- बूलियन फ़्लैग के लिए एक **टॉगल** और enum फ़्लैग के लिए एक **ड्रॉपडाउन** + **पुनः आरंभ आवश्यक** दृश्य)। +- बूलियन फ़्लैग्स के लिए एक **टॉगल** और enum फ़्लैग्स के लिए एक **ड्रॉपडाउन** (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`)। - प्रत्येक फ़्लैग के लिए एक **स्रोत बैज** — `DB`, `ENV`, या `DEF` — जो दिखाता है कि प्रभावी मान कहाँ से आया है। -- ओवरराइड हटाने के लिए एक **रीसेट** बटन (केवल `DB`-स्रोत वाले फ़्लैग के लिए दिखाया जाता है), - और सबसे नीचे एक **सभी ओवरराइड रीसेट करें** बटन। -- किसी `requiresRestart` फ़्लैग को बदलने पर एक **सर्वर पुनः आरंभ करें** बैनर। +- ओवरराइड हटाने के लिए एक **रीसेट** बटन (केवल `DB`-स्रोत वाले फ़्लैग्स के लिए दिखाया जाता है), + और नीचे एक **सभी ओवरराइड रीसेट करें** बटन। +- किसी `requiresRestart` फ़्लैग में बदलाव होने पर एक **सर्वर पुनः आरंभ करें** बैनर। ### REST API सभी ऑपरेशन एक ही रूट से होकर जाते हैं: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts)। -प्रत्येक मेथड के लिए प्रमाणीकृत डैशबोर्ड सत्र आवश्यक है (अन्यथा `401`)। +प्रत्येक मेथड के लिए एक प्रमाणित डैशबोर्ड सत्र आवश्यक है (अन्यथा `401`)। #### `GET /api/settings/feature-flags` @@ -199,8 +201,8 @@ "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Require API Key", - "description": "Require an API key for all incoming requests", + "label": "API कुंजी आवश्यक करें", + "description": "सभी आने वाले अनुरोधों के लिए API कुंजी आवश्यक करें", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +212,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... सभी 72 फ़्लैग + // ... सभी 74 फ़्लैग्स ], "summary": { "total": 56, @@ -225,7 +227,7 @@ #### `PUT /api/settings/feature-flags` किसी एक ओवरराइड को सेट करें या हटाएँ। बॉडी: `{ key: string; value?: string }`। -`value` को छोड़ देने पर ओवरराइड हट जाता है (env / डिफ़ॉल्ट पुनर्स्थापित होता है)। +`value` को छोड़ने पर ओवरराइड हट जाता है (env / डिफ़ॉल्ट पुनर्स्थापित होता है)। ```bash # DB ओवरराइड सेट करें @@ -240,17 +242,17 @@ curl -X PUT http://localhost:20128/api/settings/feature-flags \ ``` प्रतिक्रिया नए `effectiveValue`/`source`, `previousValue`/ -`previousSource`, और `requiresRestart` को लौटाती है। अज्ञात कुंजियाँ और अनुमत सीमा से बाहर के enum +`previousSource`, और `requiresRestart` को प्रतिध्वनित करती है। अज्ञात कुंजियाँ और सीमा से बाहर के enum मान `400` के साथ अस्वीकार कर दिए जाते हैं। #### `DELETE /api/settings/feature-flags` -सभी DB ओवरराइड एक साथ साफ़ करता है, जिससे प्रत्येक फ़्लैग अपने env / डिफ़ॉल्ट -मान पर पुनर्स्थापित हो जाता है। `{ cleared: , message: "..." }` लौटाता है। +सभी DB ओवरराइड्स को एक साथ साफ़ करता है और प्रत्येक फ़्लैग को उसके env / डिफ़ॉल्ट +मान पर पुनर्स्थापित करता है। `{ cleared: , message: "..." }` लौटाता है। > [!NOTE] -> `requiresRestart: true` वाले फ़्लैग केवल प्रोसेस रीलोड होने के बाद प्रभावी होते हैं। -> डैशबोर्ड का रीस्टार्ट फ़्लो `POST /api/restart` को कॉल करता है और फिर सर्वर के पुनः चालू होने तक +> `requiresRestart: true` वाले फ़्लैग्स केवल प्रोसेस पुनः लोड होने के बाद प्रभावी होते हैं। +> डैशबोर्ड का पुनः आरंभ प्रवाह `POST /api/restart` को कॉल करता है और फिर सर्वर के दोबारा चालू होने तक > `GET /api/health/ping` को पोल करता है। --- diff --git a/docs/i18n/hi/docs/routing/REASONING_REPLAY.md b/docs/i18n/hi/docs/routing/REASONING_REPLAY.md index 98e5d151c153..17b00ef2792e 100644 --- a/docs/i18n/hi/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/hi/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ OmniRoute, थिंकिंग-मोड मॉडल द्वारा उ ## आर्किटेक्चर ``` -टर्न N (सहायक जनरेट करता है): +टर्न N (सहायक उत्पन्न करता है): → प्रतिक्रिया में reasoning_content + tool_calls शामिल हैं - → यदि requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - प्रत्येक tool_call.id से कुंजीबद्ध करते हुए (मेमोरी + DB) में लिखता है - → प्रतिक्रिया को क्लाइंट को फ़ॉरवर्ड करता है (जो रीजनिंग को बनाए रख भी सकता है और नहीं भी) + → यदि requiresReasoningReplay(प्रदाता, मॉडल): cacheReasoningFromAssistantMessage() + लिखता है (मेमोरी + DB), प्रत्येक tool_call.id द्वारा कुंजीबद्ध + → प्रतिक्रिया क्लाइंट को अग्रेषित करें (जो तर्क को बनाए रख सकता है या नहीं भी रख सकता है) -टर्न N+1 (क्लाइंट फ़ॉलो-अप भेजता है): - → ट्रांसलेटर पता लगाता है: requiresReasoningReplay(provider, model) === true +टर्न N+1 (क्लाइंट अनुवर्ती भेजता है): + → अनुवादक पता लगाता है: requiresReasoningReplay(प्रदाता, मॉडल) === true → tool_calls वाले और reasoning_content के बिना प्रत्येक सहायक संदेश के लिए: lookupReasoning(toolCalls[0].id) → मेमोरी → DB - हिट → msg.reasoning_content = cached; recordReplay() + हिट → msg.reasoning_content = कैश किया गया; recordReplay() मिस → msg.reasoning_content = "" (पुराने DeepSeek के लिए लेगेसी फ़ॉलबैक) - → अपस्ट्रीम को सुसंगत इतिहास दिखाई देता है → कोई 400 नहीं + → अपस्ट्रीम सुसंगत इतिहास देखता है → कोई 400 नहीं ``` -कैप्चर `open-sse/handlers/chatCore.ts` में होता है (दो स्थानों पर, यानी दोनों `cacheReasoningFromAssistantMessage` कॉल साइट पर)। रीप्ले स्कीमा कोअर्शन के बाद, लेकिन डिस्पैच से पहले `open-sse/translator/index.ts` में होता है। +कैप्चर `open-sse/handlers/chatCore.ts` में होता है (दो स्थानों पर, दो `cacheReasoningFromAssistantMessage` कॉल साइटों पर)। रिप्ले `open-sse/translator/index.ts` में स्कीमा कोअरशन के बाद लेकिन डिस्पैच से पहले होता है। + +साधारण (गैर-टूल-कॉल) सहायक टर्न को अलग तरह से कुंजीबद्ध किया जाता है: `buildAssistantMessageCacheKey()` सत्र के दायरे के साथ-साथ उस टर्न तक के सामान्यीकृत OpenAI-फ़ॉर्मेट ट्रांसक्रिप्ट को डाइजेस्ट करता है, क्योंकि `tools` मौजूद होने पर DeepSeek को _प्रत्येक_ पिछले टर्न के तर्क की आवश्यकता होती है। Responses-API लक्ष्यों के लिए (उदाहरण के लिए `opencode-go/deepseek-v4-flash`, जो `/responses` पर रूट किया गया है) अपस्ट्रीम बॉडी `input` ले जाती है, `messages` नहीं, इसलिए `translateRequest()` (`open-sse/translator/index.ts`) उस पिवट ट्रांसक्रिप्ट की रिपोर्ट करता है जिसे उसने एक कॉलबैक विकल्प के माध्यम से डाइजेस्ट किया था और कैप्चर साइटें उसी ट्रांसक्रिप्ट को डाइजेस्ट करती हैं। Responses रिप्ले पास हर स्रोत प्रारूप के लिए OpenAI पिवट पर चलता है, इसलिए एंथ्रोपिक मैसेजेस क्लाइंट (Claude → OpenAI → Responses) भी रिप्ले किए जाते हैं। ## स्टोरेज — हाइब्रिड मेमोरी + SQLite @@ -72,7 +74,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -इंडेक्स: `expires_at`, `provider`, `model`, `created_at`। `expires_at` को Unix epoch सेकंड के रूप में संग्रहीत किया जाता है; SELECT परत लेगेसी टेक्स्ट मानों को `EXPIRES_AT_EPOCH_SQL` के माध्यम से सामान्यीकृत करती है। +इंडेक्स: `expires_at`, `provider`, `model`, `created_at`। `expires_at` को यूनिक्स इपोक सेकंड्स के रूप में संग्रहीत किया जाता है; SELECT लेयर `EXPIRES_AT_EPOCH_SQL` के माध्यम से लेगेसी टेक्स्ट मानों को सामान्य करती है। ## प्रदाता / मॉडल पहचान diff --git a/docs/i18n/hi/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/hi/docs/security/SOCKET_DEV_FINDINGS.md index 018e17c769ad..d60ad9fa1b4c 100644 --- a/docs/i18n/hi/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/hi/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,15 @@ --- -यह दस्तावेज़ `omniroute@3.8.5` के विरुद्ध रिपोर्ट किए गए छह -`AI-detected potential malware` निष्कर्षों और `omniroute@3.8.6` में लागू किए गए -शमन उपायों के लिए अनुरक्षक-लिखित सत्यापन है। यह इसलिए मौजूद है ताकि: - -1. सुरक्षा-पाइपलाइन संचालकों के पास निष्कर्षों का वास्तविक स्रोत के विरुद्ध - मूल्यांकन करते समय उद्धृत करने के लिए एकल संदर्भ हो। -2. भविष्य के AI स्कैनर अनुरक्षक-हस्ताक्षरित दावे को पहचान सकें कि चिह्नित किया गया - प्रत्येक पथ जानबूझकर बनाया गया, वैकल्पिक, और दस्तावेज़ीकृत है। -3. हमारे पास इसका लिखित रिकॉर्ड हो कि प्रत्येक कॉल साइट को उस तरह _क्यों_ बनाया गया है — - ताकि भविष्य में किया गया कोई रिफ़ैक्टर अनजाने में उस फ़िंगरप्रिंट को दोबारा प्रस्तुत न कर दे - जिसे जानबूझकर हटाया गया था। - -यदि आप ऐसा स्कैनर संचालित करते हैं जो v3.8.6 के शमन उपाय जारी होने के बाद नीचे दी गई -किसी भी कॉल साइट को पुनः चिह्नित करता है, तो कृपया स्कैन ट्रेस के साथ एक इश्यू खोलें और -हम यहाँ सत्यापन का विस्तार करेंगे। +> **स्कोप नोट:** `socket.yml` npm आर्टिफैक्ट के Socket.dev के रजिस्ट्री-साइड पोस्ट-पब्लिश स्कैन को कॉन्फ़िगर करता है (गैर-शिप किए गए कंटेंट जैसे `tests/`, `docs/`, और बिल्ड रिपोर्ट के लिए अनदेखी-पाथ)। यह CI/PR मर्ज गेट को वायर नहीं करता है — `.github/workflows` में कोई वर्कफ़्लो नहीं, कोई `package.json` स्क्रिप्ट नहीं, और कोई `Makefile` टारगेट Socket.dev को इनवोक नहीं करता है। + +यह दस्तावेज़ `omniroute@3.8.5` के खिलाफ उठाए गए छह `AI-detected potential malware` निष्कर्षों और `omniroute@3.8.6` में लागू किए गए शमन के लिए अनुरक्षक-लिखित सत्यापन है। यह इसलिए मौजूद है ताकि: + +1. सुरक्षा-पाइपलाइन ऑपरेटरों के पास वास्तविक स्रोत के खिलाफ निष्कर्षों का मूल्यांकन करने की आवश्यकता होने पर उद्धृत करने के लिए एक ही संदर्भ हो। +2. भविष्य के AI scanners अनुरक्षक-हस्ताक्षरित दावे को उठा सकें कि प्रत्येक फ़्लैग किया गया पाथ जानबूझकर, ऑप्ट-इन और प्रलेखित है। +3. हमारे पास एक लिखित रिकॉर्ड हो कि _क्यों_ प्रत्येक कॉल साइट इस तरह से आकार लेती है — ताकि भविष्य का रीफैक्टर गलती से एक ऐसे फ़िंगरप्रिंट को फिर से पेश न करे जिसे जानबूझकर हटा दिया गया था। + +यदि आप एक ऐसा स्कैनर संचालित करते हैं जो v3.8.6 शमन के शिप होने के बाद नीचे दिए गए किसी भी कॉल साइट को फिर से फ़्लैग करता है, तो कृपया स्कैन ट्रेस के साथ एक समस्या खोलें और हम यहां सत्यापन का विस्तार करेंगे। --- diff --git a/docs/i18n/hr/README.md b/docs/i18n/hr/README.md index ae8e2cafdc4d..b5118054cd0e 100644 --- a/docs/i18n/hr/README.md +++ b/docs/i18n/hr/README.md @@ -23,13 +23,13 @@ -> Ručno kombiniranje besplatnih razina mukotrpno je — deseci SDK-ova, deseci ograničenja brzine i nikakva predodžba o tome koliko zapravo imate. OmniRoute katalogizira **491 unos besplatnih razina u 35 ključeva periodičnih skupova** i izračunava istaknuti broj tokena na temelju **17 skupova s objavljenim pozitivnim mjesečnim proračunom te pet Groq ograničenja po modelu**, uz uklanjanje duplikata prema zajedničkom skupu. Kvote koje postaju dostupne tek nakon regionalne provjere identiteta (trenutačno: ModelScope) prikazuju se zasebno, +~6M iza regionalne provjere identiteta, i nikada se ne pribrajaju istaknutom broju. Rezultat ostaje vidljiv na nadzornoj ploči (`/dashboard/free-tiers`). +> Ručno kombiniranje besplatnih paketa mukotrpno je — deseci SDK-ova, deseci ograničenja brzine i nikakva predodžba o tome koliko zapravo imate na raspolaganju. OmniRoute katalogizira **489 stavki besplatnih paketa unutar 35 ključeva periodičnih skupova** i izračunava istaknuti broj tokena na temelju **17 skupova s objavljenim pozitivnim mjesečnim budžetom i pet Groq ograničenja po modelu**, uz uklanjanje duplikata prema zajedničkom skupu. Kvote koje postaju dostupne tek nakon regionalne provjere identiteta (trenutačno: ModelScope) prikazuju se zasebno, +~6 mil. iza regionalne provjere identiteta, i nikada se ne pribrajaju istaknutom ukupnom iznosu. Rezultat ostaje vidljiv na nadzornoj ploči (`/dashboard/free-tiers`). -Kartica proračuna besplatnih razina za OmniRoute: stabilnih ~1,62 mlrd. besplatnih tokena mjesečno, do ~2,22 mlrd. u prvom mjesecu s kreditima za registraciju, iz 35 dokumentiranih ključeva periodičnih skupova koji obuhvaćaju 491 katalogizirani unos besplatnih razina iza jedne krajnje točke. Pošten izračun s uklanjanjem duplikata skupova — svaki zajednički skup broji se samo jednom, uključujući 17 periodičnih skupova s objavljenim pozitivnim mjesečnim proračunom tokena te pet Groq ograničenja po modelu; 13 pružatelja označeno je kao rizično za izbjegavanje u katalogu rizika uvjeta korištenja kako biste sami odlučili. Traka proračuna uključuje Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (pet ograničenja po modelu) i manje skupove, uz kredite za registraciju u prvom mjesecu i trajno besplatne pružatelje bez ograničenja broja tokena koji se prikazuju zasebno kako nikada ne bi umjetno povećavali istaknuti broj. Trenutačno iskorišteno/preostalo na /dashboard/free-tiers. +Kartica budžeta besplatnog paketa OmniRoute: stabilnih ~1,62 mlrd. besplatnih tokena mjesečno, do ~2,22 mlrd. u prvom mjesecu uz kredite za registraciju, iz 35 dokumentiranih ključeva periodičnih skupova koji obuhvaćaju 489 katalogiziranih stavki besplatnih paketa iza jedne krajnje točke. Iskren izračun s uklanjanjem duplikata po skupovima — svaki zajednički skup računa se samo jednom, uključujući 17 periodičnih skupova s objavljenim pozitivnim mjesečnim budžetom tokena i pet Groq ograničenja po modelu; 13 pružatelja označeno je oznakom izbjegavati u katalogu rizika uvjeta korištenja kako biste sami mogli odlučiti. Traka budžeta uključuje Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (pet ograničenja po modelu) i manje skupove, uz kredite za registraciju tijekom prvog mjeseca i trajno besplatne pružatelje bez ograničenja tokena koji su prikazani zasebno kako nikada ne bi umjetno povećavali istaknuti ukupni iznos. Aktualna potrošnja/preostalo na /dashboard/free-tiers. -> Animirani sažetak aktivne stranice `/dashboard/free-tiers`. Potpuna metodologija (uklanjanje duplikata skupova, razine kredita, uvjeti pružatelja): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Animirani sažetak aktualne stranice `/dashboard/free-tiers`. Potpuna metodologija (uklanjanje duplikata skupova, razine kredita, uvjeti pružatelja): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Ove se brojke ponovno provjeravaju svaka dva tjedna prema aktivnom katalogu i **mijenjaju se u oba smjera** — kada pružatelj ukine besplatnu razinu, broj se smanjuje; kada se pojavi nova, broj raste. Objavljujemo ono što katalog doista izračunava, nikada zaokruženi najbolji mogući slučaj. +> Ove se brojke ponovno provjeravaju svaka dva tjedna prema aktualnom katalogu i **mijenjaju se u oba smjera** — ako pružatelj ukine besplatni paket, broj se smanjuje; ako se pojavi novi, broj raste. Objavljujemo ono što katalog stvarno izračuna, a nikada zaokruženi najpovoljniji scenarij.
@@ -37,7 +37,7 @@

-⭐ Dodajte zvjezdicu repozitoriju ako vam je OMNIROUTE pomogao uštedjeti novac i olakšati rad. +⭐ Označite repozitorij zvjezdicom ako vam je OMNIROUTE pomogao uštedjeti novac i olakšati rad.

@@ -57,7 +57,7 @@ [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) [![WhatsApp Globalno](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) [![WhatsApp Brazil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) -[![Web-stranica](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) +[![Web-mjesto](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) **Pitanja, savjeti o pružateljima, plan razvoja i podrška → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Globalno](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brazil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** @@ -590,59 +590,59 @@ Radar se uključuje po želji i upotrebljava isključivo GET zahtjeve. Klijent O
-## 🤖 Kompatibilni CLI-jevi i agenti za kodiranje +## 🤖 Kompatibilni CLI alati i agenti za programiranje -> Jedna konfiguracija — `http://localhost:20128/v1` — i **svaki** AI IDE ili CLI radi na besplatnim i jeftinim modelima. +> Jedna konfiguracija — `http://localhost:20128/v1` — i **svaki** AI IDE ili CLI radi na besplatnim i povoljnim modelima.
- - - + + + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + +
Claude Code
Claude Code
Codex CLI
Codex CLI
Cline
Cline
Claude Code
Claude Code
                           
Codex CLI
Codex CLI
                           
Cline
Cline
                           
Kilo Code
Kilo Code
Zoo Code
Zoo Code
Continue
Continue
Continue
Continue
                           
Aider
Aider
ForgeCode
ForgeCode
jcode
jcode
DeepSeek TUI
DeepSeek TUI
CodeWhale
CodeWhale
OpenCode
OpenCode
Aider
Aider
                           
ForgeCode
ForgeCode
                           
jcode
jcode
                           
DeepSeek TUI
DeepSeek TUI
                           
CodeWhale
CodeWhale
                           
OpenCode
OpenCode
                           
Factory Droid
Factory Droid
GitHub Copilot CLI
Copilot CLI
Cursor CLI
Cursor CLI
Smelt
Smelt
Pi (pi-coding-agent)
Pi
Grok Build (xAI)
Grok Build
Factory Droid
Factory Droid
                           
GitHub Copilot CLI
Copilot CLI
                           
Cursor CLI
Cursor CLI
                           
Smelt
Smelt
                           
Pi (pi-coding-agent)
Pi
                           
Grok Build (xAI)
Grok Build
                           
Hermes Agent (Nous Research)
Hermes Agent
OpenClaw
OpenClaw
Goose
Goose
Open Interpreter
Open Interpreter
Warp AI
Warp AI
Agent Deck
Agent Deck
Hermes Agent (Nous Research)
Hermes Agent
                           
OpenClaw
OpenClaw
                           
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
deyin.ai
deyin.ai
                           
-+ također radi s · Kiro · Command Code · Antigravity · Windsurf · AMP · bilo kojim OpenAI-kompatibilnim alatom ++ radi i s · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · bilo kojim alatom kompatibilnim s OpenAI-jem
-📖 Postavljanje po alatu za svih 36 alata (26 CLI Code-ova + 10 CLI agenata) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode dodatak → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Postavljanje za svaki alat za svih 36 alata (26 CLI alata za kodiranje + 10 CLI agenata) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Dodatak za OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Pokrenite bilo koji podržani CLI kroz OmniRoute jednom naredbom** — bez pisanja konfiguracijskih datoteka, -vjerodajnice se ubacuju po procesu, Qwen/Gemini dobivaju jednokratni izolirani home direktorij: +**Pokrenite bilo koji podržani CLI putem OmniRoutea jednom naredbom** — bez zapisivanja konfiguracijskih datoteka, +vjerodajnice se umeću zasebno za svaki proces, a Qwen/Gemini dobivaju privremeni izolirani matični direktorij: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,23 +653,23 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Ili interaktivno odaberite pružatelja usluge i model te zapišite konfiguraciju samog alata: +# Ili interaktivno odaberite pružatelja usluge i model te zapišite vlastitu konfiguraciju alata: omniroute configure codex # također: claude opencode qwen aider goose gemini cline continue kilo ``` Svaka naredba poštuje aktivni udaljeni kontekst (`omniroute connect `), `--dry-run` -prikazuje pregled točnog env/args bez izvršavanja, a `--api-key-env NAME` čuva tajne podatke -izvan povijesti vaše ljuske (shell). → [CLI integracije](docs/guides/CLI-INTEGRATIONS.md) +prikazuje točne varijable okruženja i argumente bez izvršavanja, a `--api-key-env NAME` čuva tajne izvan +povijesti vaše ljuske. → [CLI integracije](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 pružatelja usluga umjetne inteligencije — 152 označena u katalogu kao besplatna +## 🌐 357 pružatelja AI usluga — 152 označena u katalogu kao besplatna
-> **357 registriranih pružatelja usluga** u kanonskim kolekcijama za razgovor, medije, pretraživanje, lokalne sustave, agente u oblaku i sistemske funkcije, uključujući **152 pružatelja s metapodatkom za otkrivanje `hasFree: true`**. Registar modela za razgovor obuhvaća **229 pružatelja / 2.554 različita para pružatelj-model / 1.283 neobrađena ID-a modela**; zaseban katalog besplatnih kvota sadrži **491 redak po modelu**, **35 obnavljajućih fondova** i **54 obnavljajuća pružatelja s trajno besplatnim pristupom bez ključa**. Nazivnici su namjerno različiti; definicije i izračuni s uklonjenim duplikatima među fondovima nalaze se u dokumentima [Referenca pružatelja](docs/reference/PROVIDER_REFERENCE.md) i [Besplatne razine](docs/reference/FREE_TIERS.md). +> **357 registriranih pružatelja usluga** u kanonskim kolekcijama za razgovor, medije, pretraživanje, lokalne modele, agente u oblaku i sustave, uključujući **152 pružatelja s metapodacima za otkrivanje `hasFree: true`**. Registar modela za razgovor obuhvaća **229 pružatelja / 2.554 različita para pružatelj-model / 1.283 neobrađena ID-a modela**; zasebni katalog besplatnih kvota sadrži **491 redak po modelu**, **35 ponavljajućih skupova kvota** i **54 pružatelja s ponavljajućim ili trajno besplatnim pristupom bez ključa**. Nazivnici su namjerno različiti; definicije i izračuni s dedupliciranim skupovima dostupni su u dokumentima [Referenca pružatelja](docs/reference/PROVIDER_REFERENCE.md) i [Besplatne razine](docs/reference/FREE_TIERS.md).
@@ -702,11 +702,11 @@ izvan povijesti vaše ljuske (shell). → [CLI integracije](docs/guides/CLI-INTE -…i još više od 330 — svaka se ikona učitava uživo iz kataloga pružatelja na nadzornoj ploči. 📖 [Referenca pružatelja](docs/reference/PROVIDER_REFERENCE.md) +…i više od 330 drugih — svaka se ikona učitava uživo iz kataloga pružatelja na nadzornoj ploči. 📖 [Referenca pružatelja](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Zauvijek besplatno — $0, bez kartice +### 🆓 Zauvijek besplatno — 0 USD, bez kartice @@ -718,16 +718,16 @@ izvan povijesti vaše ljuske (shell). → [CLI integracije](docs/guides/CLI-INTE - + - + - - + +
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Zauvijek besplatno
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Neograničeno BESPLATNO
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Neograničeno i BESPLATNO
Pollinations
Pollinations
GPT, Llama, Claude
Ključ nije potreban
Cloudflare AI
Cloudflare AI
Više od 50 modela
10K neurona/dan
Cloudflare AI
Cloudflare AI
50+ modela
10K neurona/dan
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM besplatno
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M tokena/dan
OpenRouter
OpenRouter
:free modeli
+$10 → veći RPM
Openference
Openference
Qwen3.8 27B, Llama 3.2
Besplatna razina
OpenRouter
OpenRouter
:free modeli
+$10 → viši RPM
-📖 Cjelovit strojno čitljiv katalog → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 Cijeli strojno čitljiv katalog → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1226,22 +1226,22 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 - + - - + + - - - + + + - + - + - - + +
SlojTehnologija
Izvršno okruženjeNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
JezikTypeScript 6.0 — 100 % TypeScript u direktorijima src/ i open-sse/ (bez ijednog any u jezgri od verzije v2.0)
JezikTypeScript 6.0 — 100% TypeScript u src/ i open-sse/ (bez ijednog any u jezgri od v2.0)
Radni okvirNext.js 16 + React 19 + Tailwind CSS 4
Baza podatakabetter-sqlite3 (SQLite, WAL vođenje dnevnika) + LowDB (naslijeđeni JSON) — 122 domenska modula, 176 migracija
MemorijaSQLite FTS5 pretraživanje punog teksta + int8-kvantizirane vektorske ugradnje, tipizirano slabljenje
Baza podatakabetter-sqlite3 (SQLite, WAL vođenje dnevnika) + LowDB (naslijeđeni JSON) — 122 domenska modula, 178 migracija
MemorijaSQLite FTS5 pretraživanje punog teksta + vektorske ugradnje kvantizirane na int8, tipizirano slabljenje
ShemeZod 4 — provjera valjanosti ulaza/izlaza MCP alata + API ugovori
ProtokoliMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
StrujanjeDogađaji koje šalje poslužitelj (SSE) + WebSocket most (/v1/ws)
KompresijaCjevovod s 12 mehanizama — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autentifikacija i sigurnostOAuth 2.0 (PKCE) + JWT + API ključevi + MCP autentifikacija ograničena opsegom · AES-256-GCM za podatke u mirovanju · DOMPurify
StrujanjeServer-Sent Events (SSE) + WebSocket most (/v1/ws)
KompresijaProcesni lanac s 12 mehanizama — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autentifikacija i sigurnostOAuth 2.0 (PKCE) + JWT + API ključevi + MCP autentifikacija ograničenog opsega · AES-256-GCM za podatke u mirovanju · DOMPurify
Prikrivanjewreq-js — oponašanje JA3 / JA4 TLS otisaka, proxy u 3 razine
OtpornostPrekidač strujnog kruga, eksponencijalno odgađanje ponovnih pokušaja, sprječavanje stampeda zahtjeva, samooporavak automatskih kombinacija
OtpornostPrekidač strujnog kruga, eksponencijalno odgađanje, sprječavanje navale zahtjeva, samooporavak automatskih kombinacija
Bilježenjepino — strukturirani JSON zapisnici s kontekstom zahtjeva
TestiranjeNode.js pokretač testova + Vitest — više od 39.000 statičkih deklaracija testova u više od 5.100 praćenih testnih datoteka (jedinični, integracijski, E2E, sigurnosni i ekosustavski testovi)
TestiranjeNode.js pokretač testova + Vitest — 39.000+ statičkih deklaracija testova u više od 5.100 praćenih testnih datoteka (jedinični, integracijski, E2E, sigurnosni i ekosustavski testovi)
PlatformeStolna računala (Electron) · Android (Termux) · PWA (bilo koji preglednik)
CI/CDGitHub Actions — automatsko objavljivanje na npm-u i Docker Hubu pri izdanju
PovezniceWeb-mjesto · npm · Docker Hub
CI/CDGitHub Actions — automatska objava na npm i Docker Hubu pri izdanju
PovezniceWeb-stranica · npm · Docker Hub
@@ -1257,10 +1257,10 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 - + - - + +
DokumentOpis
Korisnički vodičPružatelji usluga, kombinacije, integracija s CLI-jem, implementacija
Vodič za postavljanjeSvi načini instalacije, konfiguracije CLI alata, postavljanje protokola, podešavanje vremenskih ograničenja
Vodič za postavljanjeSve metode instalacije, konfiguracije CLI alata, postavljanje protokola, prilagodba vremenskih ograničenja
Vodič za CLI alatePostavljanje pojedinačnih alata Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo i Copilot
Udaljeni način radaUpravljajte udaljenim OmniRouteom (VPS) iz CLI-ja na prijenosnom računalu putem pristupnih tokena ograničenog opsega
Konfiguracija Claude CodeaUsmjerite Claude Code na OmniRoute (lokalni/udaljeni) pomoću naredbe launch i profila za pojedinačne modele
Udaljeni način radaUpravljajte udaljenim OmniRouteom (VPS) iz CLI-ja na svojem prijenosnom računalu putem tokena s ograničenim pristupom
Konfiguracija alata Claude CodeUsmjerite Claude Code na OmniRoute (lokalni/udaljeni) pomoću naredbe launch i profila za pojedinačne modele
Brzi početakInstalirajte → povežite → konfigurirajte u 3 koraka
@@ -1269,29 +1269,29 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 - - - - + + + + - - + +
DokumentOpis
Vodič za DockerDocker run, Compose profili, Caddy HTTPS, tuneli, oznake slika
Vodič za PodmanIntegracija Quadleta sa systemdom, podman-compose, SELinux
Implementacija na VM-uPotpuni vodič: postavljanje VM-a, nginxa i Cloudflarea
Implementacija na Fly.ioImplementacija na Fly.io s trajnom pohranom
Vodič za TermuxPokretanje OmniRoutea na Androidu putem Termuxa
Vodič za PodmanIntegracija sustava Quadlet sa systemdom, podman-compose, SELinux
Implementacija na virtualnom strojuPotpuni vodič: postavljanje virtualnog stroja, nginxa i Cloudflarea
Implementacija na Fly.ioImplementirajte na Fly.io uz trajnu pohranu
Vodič za TermuxPokrenite OmniRoute na Androidu putem Termuxa
Vodič za PWAInstalacija progresivne web-aplikacije, predmemoriranje, arhitektura
Vodič za deinstalacijuČisto uklanjanje za sve načine instalacije
Konfiguracija okruženjaPotpuni popis varijabli datoteke .env i reference
Vodič za deinstalacijuČisto uklanjanje za sve metode instalacije
Konfiguracija okruženjaPotpuni popis varijabli datoteke .env i referenci
### 🧠 Značajke i arhitektura - + - + - - - - - + + + + +
DokumentOpis
ArhitekturaArhitektura sustava, tok podataka i unutarnji mehanizmi
ArhitekturaArhitektura sustava, tijek podataka i unutarnji mehanizmi
Vodič za kompresijuProces sa 7 opcija: isključeno / lagano / standardno / agresivno / ultra / RTK / složeno
RTK kompresijaKompresija izlaza naredbi, filtri, pouzdanost, provjera, oporavak neobrađenog izlaza
Mehanizmi kompresijeCaveman, RTK, složeni procesi, sučelja nadzorne ploče/API-ja/MCP-a
Mehanizmi za kompresijuCaveman, RTK, složeni procesi, sučelja nadzorne ploče/API-ja/MCP-a
Format pravila kompresijeSheme JSON paketa pravila za filtre Caveman i RTK
Jezični paketi za kompresijuPrepoznavanje jezika i izrada paketa pravila za Caveman
Vodič za otpornostPrekidači strujnog kruga, razdoblja čekanja, red čekanja, sprječavanje naglog istodobnog priljeva zahtjeva, lažiranje TLS-a
Mehanizam Auto-ComboBodovanje na temelju 16 čimbenika, paketi načina rada, samooporavak
Vodič za proxyProxy sustav s 3 razine, tržište 1proxy, CRUD operacije nad registrom
Besplatne razineObjedinjeni imenik: 35 dokumentiranih ponavljajućih skupova / 491 katalogizirani unos besplatne razine
Jezični paketi za kompresijuOtkrivanje jezika i izrada Caveman paketa pravila
Vodič za otpornostPrekidači kruga, razdoblja čekanja, red čekanja, sprječavanje naglog istodobnog opterećenja, lažiranje TLS-a
Mehanizam Auto-ComboBodovanje prema 16 čimbenika, paketi načina rada, samooporavak
Vodič za proxyProxy sustav s 3 razine, tržište 1proxy, CRUD registra
Besplatne razineObjedinjeni direktorij: 35 dokumentiranih skupova koji se obnavljaju / 489 katalogiziranih stavki besplatne razine
Galerija značajkiVizualni obilazak nadzorne ploče sa snimkama zaslona
Dokumentacija baze kodaPregled baze koda prilagođen početnicima
@@ -1301,8 +1301,8 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 - - + + @@ -1314,11 +1314,11 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 - + - + - +
DokumentOpis
Referenca API-jaSve krajnje točke s primjerima
Specifikacija OpenAPI-jaSpecifikacija OpenAPI 3.0
MCP poslužitelj110 MCP alata, konfiguracije IDE-a, klijenti za Python/TS/Go
OpenAPI specifikacijaSpecifikacija OpenAPI 3.0
MCP poslužitelj110 MCP alata, IDE konfiguracije, Python/TS/Go klijenti
Vodič za MCP poslužiteljInstalacija MCP-a, prijenosi i referenca alata
A2A poslužiteljProtokol JSON-RPC 2.0, vještine, strujanje, upravljanje zadacima
Vodič za A2A poslužiteljKartica A2A agenta, zadaci, vještine i strujanje
DokumentOpis
DoprinošenjePostavljanje razvojnog okruženja i smjernice
Model grananja i izdanjaNa koje su grane usmjereni PR-ovi (release/*) te što znače main i oznake
Zapisnik promjenaPotpuna povijest izdanja po verzijama
Dnevnik promjenaPotpuna povijest izdanja po verzijama
Sigurnosna pravilaPrijavljivanje ranjivosti i sigurnosne prakse
Vodič za i18nPodrška za 42 jezika, tijek prevođenja, RTL
Vodič za i18nPodrška za 42 jezika, tijek rada prevođenja, RTL
Kontrolni popis za izdanjeKoraci provjere prije izdanja
Plan pokrivenostiStrategija pokrivenosti testovima za više od 39.000 statičkih deklaracija testova u više od 5.100 praćenih testnih datoteka
Plan pokrivenostiStrategija pokrivenosti testovima za više od 39.000 statičkih deklaracija testova u više od 5.100 praćenih datoteka testova

@@ -1327,9 +1327,9 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 # ⭐ Najistaknutiji doprinositelji -> OmniRoute oblikuje predana zajednica otvorenog koda. Ovi su pojedinci dali iznimne doprinose koji izravno utječu na kvalitetu, stabilnost i doseg projekta. **Hvala vam.** +> OmniRoute oblikuje strastvena zajednica otvorenog koda. Ovi su pojedinci dali iznimne doprinose koji izravno utječu na kvalitetu, stabilnost i doseg projekta. **Hvala vam.** -### Vanjski doprinositelji prema broju spojenih zahtjeva za povlačenje +### Vanjski doprinositelji prema spojenim zahtjevima za povlačenje @@ -1356,7 +1356,7 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922
PoredakDoprinositeljSpojeni PR-ovi~Promijenjenih redaka
20Prudhvivuda246,312
-Zamrznuto na trenutačnom vrhu grane release/v3.8.50, dafb4ae808, sa spajanjima zaključno s 2026-08-24 05:26:03 UTC. Straničeni popis iz GitHub GraphQL-a sadrži 5.911 spojenih PR-ova: 2.707 od vlasnika repozitorija, 179 od Dependabota i 3.025 vanjskih PR-ova od 535 različitih doprinositelja. „Promijenjeni retci” zbroj su dodavanja i brisanja na GitHubu te uključuju generirane datoteke, datoteke zaključavanja, kataloge, prijevode i dokumentaciju; to je količina promjena, a ne broj autorski napisanih redaka koda. Izjednačeni rezultati na granici poretka zadržani su. +Zamrznuto na trenutačnom vrhu grane release/v3.8.50, na reviziji dafb4ae808, sa spajanjima do 2026-08-24 05:26:03 UTC. Straničeni popis iz GitHub GraphQL-a sadržava 5.911 spojenih PR-ova: 2.707 od vlasnika repozitorija, 179 od Dependabota i 3.025 vanjskih PR-ova od 535 različitih doprinositelja. „Promijenjeni retci” zbroj su dodavanja i brisanja na GitHubu te uključuju generirane datoteke, datoteke zaključavanja, kataloge, prijevode i dokumentaciju; predstavljaju količinu promjena, a ne broj autorski napisanih redaka koda. Izjednačeni rezultati na graničnoj vrijednosti zadržani su. ### Commitovi pripisani na GitHubu @@ -1444,9 +1444,9 @@ Kanonski podaci na dan 2026-08-24: **1.029 jedinstvenih videa** · **11.132.922 -Ponovno provjereno 2026-08-24 06:14:31 UTC: doprinosi pripisani na GitHubu koje je API suradnika repozitorija prijavio za zadanu granu release/v3.8.50. API je vratio 525 identiteta (415 korisnika, 2 bota, 108 anonimnih); ova tablica isključuje održavatelja, botove i anonimne identitete te zadržava izjednačena mjesta. Razlikuje se i od prethodno navedenog poretka spojenih PR-ova i od popisa 639 osoba prema Git metapodacima u nastavku. +Ponovno provjereno 2026-08-24 06:14:31 UTC: doprinosi pripisani na GitHubu koje je API repozitorija Contributors prijavio za zadanu granu release/v3.8.50. API je vratio 525 identiteta (415 korisnika, 2 bota, 108 anonimnih); ova tablica isključuje održavatelja, botove i anonimne identitete te zadržava izjednačene plasmane. Razlikuje se i od gornjeg poretka spojenih PR-ova i od donjeg popisa 639 osoba iz Git metapodataka. -> 🙏 Funkcionalnosti, ispravci pogrešaka i poboljšanja infrastrukture ovih suradnika **ključan su dio** onoga što OmniRoute čini pouzdanim i bogatim funkcionalnostima. Svaki pull request, svaki testni slučaj i svaka i18n datoteka prijevoda važni su. Otvoreni kôd grade ljudi poput njih. +> 🙏 Značajke, ispravci pogrešaka i poboljšanja infrastrukture ovih suradnika **ključni su dio** onoga što OmniRoute čini pouzdanim i bogatim značajkama. Svaki zahtjev za spajanje, svaki testni slučaj i svaka i18n datoteka prijevoda važni su. Otvoreni kod grade ljudi poput njih.
diff --git a/docs/i18n/hr/SECURITY.md b/docs/i18n/hr/SECURITY.md index c042b4034a49..b4d68e4c0f53 100644 --- a/docs/i18n/hr/SECURITY.md +++ b/docs/i18n/hr/SECURITY.md @@ -222,17 +222,35 @@ Ova pravila provode alati i preglednici: ## Nalazi skenera opskrbnog lanca (Socket.dev / Snyk / slično) -Objavljeni npm artefakt `omniroute` sadrži Next.js međuverziju `output: "standalone"`, što znači da svaki obrađivač ruta — uključujući dokumentirane privilegirane značajke (MITM, uvoz iz Zeda, Cloud Sync, ugrađeni nadzornik usluga) — završava u minificiranim segmentima `.next/server/*.js`. Heuristički skeneri opskrbnog lanca često uspoređuju uzorke iz tih segmenata s potpisima zlonamjernog softvera. +> **Napomena o opsegu:** `socket.yml` u korijenu repozitorija samo definira `projectIgnorePaths` za Socket.devovo skeniranje objavljenog npm artefakta nakon objave na strani registra — nije obvezna kontrola za spajanje u CI-ju/PR-u. Nijedan tijek rada u `.github/workflows`, nijedna skripta u `package.json` i nijedan cilj u `Makefile` ne pokreću Socket.dev. -Konfiguracija skenera koju koristimo nalazi se u datoteci [`socket.yml`](socket.yml) u korijenu repozitorija (format v2 GitHub aplikacije Socket.dev — pogledajte ). Ona izričito izuzima direktorije koji se ne isporučuju (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` itd.) kako bi skener izvještavao samo o putovima koda koji doista dolaze do korisnika objavljenog paketa — samo skeniranje pokreće GitHub aplikacija Socket čitanjem te datoteke, a ne tijek rada u ovom repozitoriju. +Objavljeni npm artefakt `omniroute` sadrži Next.js međuverziju s postavkom `output: "standalone"`, +što znači da svaki obrađivač ruta — uključujući dokumentirane povlaštene +funkcionalnosti (MITM, uvoz iz Zeda, Cloud Sync, ugrađeni nadzornik usluga) — završava +u minificiranim dijelovima `.next/server/*.js`. Heuristički skeneri opskrbnog lanca +često uspoređuju uzorke iz tih dijelova s potpisima zlonamjernog softvera. -Za svaku kategoriju nalaza održavamo zasebnu potvrdu održavatelja: +Konfiguracija skenera koju upotrebljavamo nalazi se u datoteci [`socket.yml`](socket.yml) u +korijenu repozitorija (format v2 za Socket.dev GitHub App — pogledajte +). Ona izričito izuzima +direktorije koji se ne isporučuju (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` itd.) kako bi skener izvješćivao samo o putanjama koda koje +doista dolaze do korisnika objavljenog paketa — samo skeniranje pokreće Socket +GitHub App čitanjem te datoteke, a ne tijek rada u ovom repozitoriju. -- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - mapa po nalazu: izvorna datoteka ↔ označeni segment ↔ ponašanje ↔ ublažavanje primijenjeno u v3.8.6. -- Blokovi `SECURITY-AUDITOR-NOTE:` u izvornom kodu na svakoj označenoj funkciji upućuju na isti dokument. +Za svaku kategoriju nalaza održavamo potvrdu održavatelja za pojedinačni nalaz: -Korisnici čiji proces ne može ublažiti upozorenje mogu izgraditi paket naredbom `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Time se četiri osjetljiva modula zamjenjuju zamjenskim implementacijama koje tijekom izvođenja vraćaju HTTP 503 `feature-disabled`, pa su privilegirani putovi koda fizički odsutni iz paketa. Recept za objavljivanje potražite u dokumentu [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). +- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — + karta pojedinačnih nalaza: izvorna datoteka ↔ označeni dio ↔ ponašanje ↔ mjera ublažavanja + primijenjena u v3.8.6. +- Blokovi `SECURITY-AUDITOR-NOTE:` u izvornom kodu uz svaku označenu funkciju + upućuju na isti dokument. + +Za korisnike čiji proces ne dopušta ublažavanje upozorenja: izradite međuverziju naredbom +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Time se četiri +osjetljiva modula zamjenjuju zamjenskim implementacijama koje tijekom izvođenja vraćaju HTTP 503 `feature-disabled`, +pa povlaštene putanje koda fizički nisu prisutne u paketu. +Recept za objavljivanje potražite u dokumentu [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Reference diff --git a/docs/i18n/hr/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/hr/docs/architecture/CODEBASE_DOCUMENTATION.md index 3dc6ddd2bd2d..12a89f5788d3 100644 --- a/docs/i18n/hr/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/hr/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,10 +434,10 @@ Podijeljeno u fokusirane poddirektorije: --- -## 4. `open-sse/` — Radni prostor mehanizma za strujanje +## 4. `open-sse/` — Radni prostor mehanizma za streaming Zaseban npm radni prostor objavljen kao `@omniroute/open-sse`. Obuhvaća obradu -zahtjeva, izvršitelje, prevoditelje, usluge, transformator i MCP poslužitelj. +zahtjeva, izvršitelje, prevoditelje, servise, transformator i MCP poslužitelj. ``` open-sse/ @@ -446,52 +446,52 @@ open-sse/ ├── tsconfig.json ├── types.d.ts ├── config/ Registri pružatelja, profili zaglavlja, identitet, … -├── handlers/ Rukovatelji zahtjevima (razgovor, ugrađivanja, zvuk, slika, …) +├── handlers/ Obrađivači zahtjeva (razgovor, ugradnje, zvuk, slika, …) ├── executors/ 108 HTTP izvršitelja specifičnih za pružatelje ├── translator/ Pretvorba formata (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Transformator toka Responses API ↔ Chat Completions -├── services/ Više od 80 modula usluga (kombinacije, pričuvni mehanizmi, kvote, identitet, …) -├── utils/ Pomoćni alati za strujanje, TLS klijent, AWS SigV4, dohvaćanje putem proxyja, … +├── transformer/ Transformator streama Responses API ↔ Chat Completions +├── services/ Više od 80 servisnih modula (kombinacije, pričuvni mehanizmi, kvote, identitet, …) +├── utils/ Pomagala za streaming, TLS klijent, AWS SigV4, dohvaćanje putem proxyja, … └── mcp-server/ MCP poslužitelj (3 transporta, 33 opsega, 110 alata) ``` ### 4.1 `open-sse/handlers/` -| Rukovatelj | Svrha | -| ----------------------- | ----------------------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Glavni cjevovod razgovora (predmemorija, ograničenje brzine, usmjeravanje kombinacija, otprema izvršitelju) | -| `responsesHandler.ts` | Ulazna točka OpenAI Responses API-ja | -| `embeddings.ts` | Ugrađivanja | -| `imageGeneration.ts` | Generiranje slika | -| `audioSpeech.ts` | Pretvaranje teksta u govor | -| `audioTranscription.ts` | Pretvaranje govora u tekst | -| `videoGeneration.ts` | Generiranje videozapisa | -| `musicGeneration.ts` | Generiranje glazbe | -| `rerank.ts` | Ponovno rangiranje | -| `moderations.ts` | Moderiranje | -| `search.ts` | Pretraživanje weba | -| `sseParser.ts` | Raščlanjivač SSE događaja | -| `usageExtractor.ts` | Izdvajanje broja tokena iz uzvodnih tokova | -| `responseSanitizer.ts` | Uklanjanje šuma specifičnog za pružatelja | -| `responseTranslator.ts` | Poveznica između odgovora pružatelja i prevoditeljskog sloja | +| Obrađivač | Namjena | +| ----------------------- | --------------------------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Glavni tijek razgovora (predmemorija, ograničenje brzine, usmjeravanje kombinacija, prosljeđivanje izvršitelju) | +| `responsesHandler.ts` | Ulazna točka za OpenAI Responses API | +| `embeddings.ts` | Ugradnje | +| `imageGeneration.ts` | Generiranje slika | +| `audioSpeech.ts` | Pretvaranje teksta u govor | +| `audioTranscription.ts` | Pretvaranje govora u tekst | +| `videoGeneration.ts` | Generiranje videozapisa | +| `musicGeneration.ts` | Generiranje glazbe | +| `rerank.ts` | Ponovno rangiranje | +| `moderations.ts` | Moderiranje | +| `search.ts` | Pretraživanje weba | +| `sseParser.ts` | Parser SSE događaja | +| `usageExtractor.ts` | Izdvajanje broja tokena iz uzvodnih streamova | +| `responseSanitizer.ts` | Uklanjanje šuma specifičnog za pružatelja | +| `responseTranslator.ts` | Poveznica između odgovora pružatelja i prevoditeljskog sloja | ### 4.2 `open-sse/executors/` -108 izvršitelja pružatelja, od kojih svaki proširuje `BaseExecutor` (`base.ts`): +108 izvršitelja za pružatelje, od kojih svaki proširuje `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, -`pollinations`, `qoder`, `vertex`, `devin-desktop`, kao i `claudeIdentity.ts` -(dijeljeni pomoćni alat za identitet) i `index.ts` (registar). +`pollinations`, `qoder`, `vertex`, `devin-desktop`, uz `claudeIdentity.ts` +(zajedničko pomagalo za identitet) i `index.ts` (registar). -> Napomena: pružatelje koji ovdje nisu navedeni poslužuje `default.ts` pomoću generičkog -> izvršitelja kompatibilnog s OpenAI-jem. Potpuni katalog pružatelja (355 pružatelja) nalazi se u +> Napomena: pružatelje koji ovdje nisu navedeni poslužuje `default.ts` koristeći generički +> izvršitelj kompatibilan s OpenAI-jem. Potpuni katalog pružatelja (355 pružatelja) nalazi se u > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Prevođenje prema modelu čvorišta i krakova (OpenAI je čvorište). +Prevođenje prema modelu središta i krakova (OpenAI je središte). - **9 prevoditelja zahtjeva** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -501,51 +501,51 @@ Prevođenje prema modelu čvorišta i krakova (OpenAI je čvorište). `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. -- **9 pomoćnih alata** (`translator/helpers/`): +- **9 pomagala** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, - `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, kao i - testovi pomoćnih alata. -- **Pomoćni alati za slike** (`translator/image/sizeMapper.ts`). + `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, uz + testove pomagala. +- **Pomagala za slike** (`translator/image/sizeMapper.ts`). - Najviša razina: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` -- `responsesTransformer.ts` — pretvarač Responses API ↔ Chat Completions temeljen - na `TransformStream` (upotrebljava ga sveobuhvatna ruta `responses/`). +- `responsesTransformer.ts` — pretvarač Responses API ↔ Chat + Completions temeljen na `TransformStream` (upotrebljava ga ruta `responses/` koja obuhvaća sve ostale slučajeve). ### 4.5 `open-sse/services/` -Najvažnije komponente (potpuni popis nalazi se u `open-sse/services/`): - -| Područje | Datoteke | -| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Kombinirano usmjeravanje | `combo.ts` (19 strategija), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Mehanizam Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Otpornost | `accountFallback.ts` (razdoblje čekanja + zaključavanje), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kvote | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Predmemoriranje | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Inteligentno usmjeravanje | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Obrada modela | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Kompresija | `compression/` — cjelovito povezivanje mehanizma za kompresiju | -| Tokeni i sesije | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Razina / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / mreža | `ipFilter.ts`, `webSearchFallback.ts` | -| Skupna obrada | `batchProcessor.ts` | -| Upotreba | `usage.ts` | +Istaknuto (potpuni popis nalazi se u `open-sse/services/`): + +| Područje | Datoteke | +| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Kombinirano usmjeravanje | `combo.ts` (19 strategija), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Mehanizam Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Otpornost | `accountFallback.ts` (razdoblje čekanja + zaključavanje), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kvote | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Predmemoriranje | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Inteligentno usmjeravanje | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Obrada modela | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Kompresija | `compression/` — potpuno povezivanje mehanizma za kompresiju | +| Tokeni + sesije | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Razina / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / mreža | `ipFilter.ts`, `webSearchFallback.ts` | +| Skupne obrade | `batchProcessor.ts` | +| Upotreba | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 jedinstvenih alata** povezano je u `server.ts` (45 kanonskih u `schemas/tools.ts` + - moduli za memoriju, vještine, GitHub vještine, skupove, gamifikaciju, dodatke, Notion, Obsidian, - lokalni korpus i kompresiju — unija izbrojena funkcijom `countUniqueMcpTools`). -- **3 transporta**: stdio, HTTP Streamable, SSE. -- **33 opsega** provode se tijekom izvođenja — osnovni popis nalazi se u `src/shared/constants/mcpScopes.ts`, a potpuni skup predstavlja uniju opsega koje deklarira svaki modul alata. +- **110 jedinstvenih alata** povezanih u `server.ts` (45 kanonskih u `schemas/tools.ts` + + moduli za memoriju, vještine, GitHub-vještine, skupove, gamifikaciju, dodatke, Notion, Obsidian, + lokalni korpus i kompresiju — unija prebrojena funkcijom `countUniqueMcpTools`). +- **3 prijenosa**: stdio, HTTP Streamable, SSE. +- **33 opsega** provode se tijekom izvođenja — osnovni popis nalazi se u `src/shared/constants/mcpScopes.ts`, a potpuni je skup unija opsega koje deklarira svaki modul alata. - Tablica revizije: `mcp_tool_audit` (popunjava je `audit.ts`). - Datoteke: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - te testovi u `__tests__/`. -- Cjelovit katalog alata potražite u dokumentu [MCP-SERVER.md](../frameworks/MCP-SERVER.md). + uz testove u `__tests__/`. +- Potpuni katalog alata pogledajte u [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### 4.7 `open-sse/config/` @@ -563,7 +563,7 @@ za oblak (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, ### 4.8 `open-sse/utils/` -Primitivi za streaming i pomoćne funkcije pružatelja usluga: `stream.ts`, `streamHandler.ts`, +Primitivi za streaming i pomoćni alati pružatelja usluga: `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/hr/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/hr/docs/architecture/RESILIENCE_GUIDE.md index 4ea5da7d6e8e..0e8539e6defd 100644 --- a/docs/i18n/hr/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/hr/docs/architecture/RESILIENCE_GUIDE.md @@ -69,94 +69,138 @@ Zaštita od regresije: `tests/unit/provider-cooldown-window-gate.test.ts`. ## 2. Razdoblje mirovanja veze -**Opseg:** jedna veza/račun/ključ pružatelja. +**Opseg:** jedna veza/račun/ključ pružatelja usluge. -**Svrha:** preskočiti jedan neispravan ključ dok ostale veze za istog pružatelja nastavljaju posluživati zahtjeve. +**Svrha:** preskočiti jedan neispravan ključ dok ostale veze istog pružatelja nastavljaju posluživati zahtjeve. **Implementacija:** -- Označavanje nedostupnim: `src/sse/services/auth.ts::markAccountUnavailable()` +- Označavanje kao nedostupno: `src/sse/services/auth.ts::markAccountUnavailable()` - Odabir: `getProviderCredentials*` u istoj datoteci - Izračun razdoblja mirovanja: `open-sse/services/accountFallback.ts::checkFallbackError()` - Postavke: `src/lib/resilience/settings.ts` **Polja po vezi:** -- `rateLimitedUntil` — vremenska oznaka do koje traje razdoblje mirovanja +- `rateLimitedUntil` — vremenska oznaka do isteka razdoblja mirovanja - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` -- `backoffLevel` — brojač eksponencijalne odgode +- `backoffLevel` — brojač eksponencijalnog odgađanja **Zadana razdoblja mirovanja:** -- Osnovno za OAuth: 5s -- Osnovno za API ključ: 3s -- API ključ, 429: prednost imaju uzvodno zaglavlje `Retry-After`, zaglavlja za poništavanje ili tekst s vremenom poništavanja koji je moguće raščlaniti -- Odgoda: `baseCooldownMs * 2 ** failureIndex` +- OAuth osnova: 5s +- Osnova za API ključ: 3s +- 429 za API ključ: prednost imaju uzvodna zaglavlja `Retry-After`/zaglavlja za poništavanje/tekst poništavanja koji se može raščlaniti +- Odgađanje: `baseCooldownMs * 2 ** failureIndex` -**Zaštita od stampeda zahtjeva:** sprječava da istodobni neuspjesi prekomjerno produlje razdoblje mirovanja ili dvaput povećaju `backoffLevel`. +**Zaštita od stampeda zahtjeva:** sprječava da istodobni kvarovi prekomjerno produlje razdoblje mirovanja ili dvaput povećaju `backoffLevel`. **Završna stanja (NISU razdoblja mirovanja):** -- `banned` — postavlja se otkrivanjem zabranjene ključne riječi / zabrane računa (pogledajte [BAN_DETECTION](../security/BAN_DETECTION.md)) te nakon tri uzastopna uzvodna odbijanja pojedinačnog zahtjeva (`request_rejected`, npr. Anthropic OAuth 403 "Zahtjev nije dopušten" — `open-sse/services/requestRejectedStreak.ts`); jedno odbijanje samo stavlja vezu u stanje mirovanja -- `expired` (prelazi u završno stanje nakon ograničenog broja ponovnih pokušaja — `EXPIRED_RETRY_MAX = 3` s eksponencijalnom odgodom — kako bi se prolazne OAuth pogreške mogle same otkloniti prije trajnog deaktiviranja računa) +- `banned` — postavlja se otkrivanjem zabranjene ključne riječi / zabrane računa (pogledajte [BAN_DETECTION](../security/BAN_DETECTION.md)) te nakon tri uzastopna uzvodna odbijanja pojedinačnih zahtjeva (`request_rejected`, npr. Anthropic OAuth 403 „Request not allowed” — `open-sse/services/requestRejectedStreak.ts`); jedno odbijanje samo stavlja vezu u razdoblje mirovanja +- `expired` (prelazi u završno stanje nakon ograničenog broja ponovnih pokušaja — `EXPIRED_RETRY_MAX = 3` uz eksponencijalno odgađanje — kako bi se prolazne OAuth pogreške mogle same ispraviti prije trajnog deaktiviranja računa) - `credits_exhausted` -Ta stanja traju sve dok se vjerodajnice ne promijene ili ih operater ne poništi. Nemojte prebrisati završna stanja prolaznim stanjem mirovanja. +Ta stanja traju dok se vjerodajnice ne promijene ili ih operater ne poništi. Nemojte prebrisati završna stanja prolaznim stanjem mirovanja. -**Lijeni oporavak:** kada `rateLimitedUntil` prođe, veza ponovno postaje prikladna za odabir. Nakon uspješne uporabe `clearAccountError()` briše sva polja pogrešaka. +**Lijeni oporavak:** kada `rateLimitedUntil` prođe, veza ponovno postaje dostupna za odabir. Nakon uspješne uporabe `clearAccountError()` briše sva polja pogrešaka. + +### Zid potrošnje za Claude OAuth: traka nižeg prioriteta + poništavanje ograničenja sesije + +**Opseg:** jedna veza pretplate na Claude (OAuth). Obje su značajke **uključive zasebno po +vezi** (Uređivanje veze → odjeljak Claude → `lowPriorityMode` / `autoLimitReset` u +`providerSpecificData`, obje su zadano isključene) i odgovaraju naredbama `/low-priority` i +`/limit-reset` alata Claude Code (mrežni ugovor zabilježen iz verzije Claude Code 2.1.263). + +**Implementacija:** + +- Automat stanja + klasifikacija odgovora: `open-sse/services/claudeLowPriority.ts` +- Klijent za status/aktiviranje poništavanja: `open-sse/services/claudeLimitReset.ts` +- Priključak izvršitelja (umetanje zaglavlja + ponovni pokušaj na istom računu): `open-sse/executors/base.ts::execute()` +- Pohrana uključivanja: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Okidač:** zid potrošnje od 5 sati — odgovor `429` čija zaglavlja sadrže +`anthropic-ratelimit-unified-status: rejected` i, kada račun ispunjava uvjete, +`anthropic-ratelimit-unified-slow-offer: treatment`. Ništa se ne šalje prije tog prvog odgovora +429 uzrokovanog zidom; skupni 429 bez objedinjenih zaglavlja prolazi uobičajenim putem razdoblja mirovanja. + +**Traka nižeg prioriteta** (`lowPriorityMode`): + +- Nakon odgovora 429 uzrokovanog zidom izvršitelj prihvaća ponudu i odmah ponovno pokušava s **istim** + računom uz `anthropic-usage-limit: slow`; traka ostaje aktivna do najavljenog + `anthropic-ratelimit-unified-reset` (+60s dodatnog vremena), a svaki zahtjev u tom razdoblju sadrži + zaglavlje. Presretnuti 429 nikada ne dolazi do `handleChatCore`, pa se veza + **ne** stavlja u razdoblje mirovanja niti se zamjenjuje drugom. +- `anthropic-ratelimit-unified-slow-status` u kasnijim odgovorima: `active` / `not_needed` + zadržavaju traku; `slot_busy` (429) ili `529` čekaju prema poslužiteljevu + `anthropic-ratelimit-unified-slow-retry-after` (zadano 20s, ograničeno na 5–600s, ±30% nasumičnog odstupanja) + i ponovno pokušavaju, uz ograničenje određeno s `anthropic-ratelimit-unified-slow-max-wait` (zadano 20 min, ograničeno + na 1 min–6 h) — nakon toga traka završava, a 10-minutno razdoblje hlađenja blokira ponovno prihvaćanje. Vrijeme + čekanja dodatno je ograničeno preostalim vremenom vlastitog vremenskog ograničenja zahtjeva za početak uzvodne obrade + (`resolveFetchStartTimeout`, zadano 10 min) umanjenim za 5 s: bez tog ograničenja + zadano maksimalno čekanje od 20 minuta nadživjelo bi zahtjev, a mirovanje bi bilo prekinuto + usred čekanja, prikazujući `TimeoutError` umjesto urednog završetka `max_wait` + razdoblja hlađenja. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, početak novog prozora od 5h ili + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (što završava traku kao + `extra_usage` pri bilo kojem statusu jer plaćeno prekoračenje sada pokriva zid) završavaju traku; odgovor + zatim prolazi uobičajenim putem razdoblja mirovanja. `budget_exhausted` pamti se do + najavljenog poništavanja proračuna (≤ 8 dana). +- Provjera zida izvodi se nakon izvršiteljevih vlastitih ponovnih pokušaja unutar istog pokušaja potaknutih odgovorom 400 (uređivanje + konteksta, ograničavanje razmišljanja/napora, automatsko učenje parametara), pa se 429 uzrokovan zidom koji se pojavi tek pri + jednom od tih ponovnih pokušaja ipak presreće umjesto da dospije na put razdoblja mirovanja. +- Stanje se čuva u memoriji po vezi (ponovno pokretanje zahtijeva jedan dodatni 429 uzrokovan zidom za ponovno prihvaćanje). + +**Poništavanje ograničenja sesije** (`autoLimitReset`, pokušava se prije trake kada su obje značajke uključene): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → blok `juniper_tide`; + kada je `arm: "reset"` i `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` s + `{ "program": "juniper_tide" }` (UUID organizacije iz + `providerSpecificData.organizationUUID`, uz pričuvno početno dohvaćanje). +- `result: reset|not_limited` → zahtjev se ponovno pokušava punom brzinom (bez sporog zaglavlja). + `already_used` / `not_offered` pamte `next_available_at` (zadano jedan tjedan); svaki + neuspjeh aktivira odgađanje od 15 minuta. Poništavanje je moguće jednom tjedno i i dalje se uračunava u + tjedno ograničenje. + +Zaštite od regresija: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Afinitet sesije (#7274) **Opseg:** jedna klijentska sesija (zaglavlje `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) vezana uz jednu vezu, za **bilo kojeg** pružatelja. -**Svrha:** zadržati agenta s više koraka (Claude Code, aider, prilagođeni agenti) na istom računu kroz više zahtjeva, čime se smanjuju gubitak konteksta između računa i ponovljene pogreške 429 pri hladnom pokretanju kod pružatelja sa stanjem sesije po računu. +**Svrha:** zadržati agenta koji radi kroz više interakcija (Claude Code, aider, prilagođeni agenti) na istom računu kroz više zahtjeva, čime se smanjuje gubitak konteksta zbog prebacivanja između računa i ponavljanje pogrešaka 429 pri hladnom pokretanju kod pružatelja usluga sa stanjem sesije po računu. **Implementacija:** - Određivanje TTL-a: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Odabir/stvaranje vezivanja: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Izdvajanje zaglavlja (generički, bilo koji pružatelj): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Odabir/izrada vezivanja: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Izdvajanje zaglavlja (generičko, za bilo kojeg pružatelja usluga): `src/sse/services/auth.ts::extractSessionAffinityKey()` - Tablica trajno pohranjenih vezivanja: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Postavka: `sessionAffinityTtlMs` (globalni TTL u ms, `0` onemogućuje) — `src/lib/db/settings.ts`. Preimenovano iz postavke `codexSessionAffinityTtlMs`, namijenjene samo Codexu, migracijom `124_generic_session_affinity_ttl.sql`, koja svaki prethodno konfigurirani Codex TTL prenosi kao novu zadanu vrijednost. +- Postavka: `sessionAffinityTtlMs` (globalni TTL u ms, `0` ga onemogućuje) — `src/lib/db/settings.ts`. Preimenovano iz postavke `codexSessionAffinityTtlMs`, namijenjene samo Codexu, migracijom `124_generic_session_affinity_ttl.sql`, koja prenosi svaki prethodno konfigurirani TTL za Codex kao novu zadanu vrijednost. -Prije #7274, `resolveSessionAffinityTtlMs()` odmah je vraćao `0` za svakog pružatelja osim `codex`, pa postavka TTL-a (i zaglavlja sesije) nigdje drugdje nisu imala učinka iako su mehanizam vezivanja i izdvajanje zaglavlja već bili neovisni o pružatelju. Ispravkom je uklonjen taj rani povratak; TTL se sada jednako primjenjuje na svakog pružatelja nakon što se globalno postavi na vrijednost veću od `0`. +Prije #7274, `resolveSessionAffinityTtlMs()` odmah je vraćao `0` za svakog pružatelja usluga osim `codex`, pa postavka TTL-a (i zaglavlja sesije) nije imala učinka nigdje drugdje, iako su mehanizam vezivanja i izdvajanje zaglavlja već bili neovisni o pružatelju usluga. Ispravkom je uklonjen taj rani izlaz; TTL se sada jednako primjenjuje na svakog pružatelja usluga čim se globalno postavi na vrijednost veću od `0`. -Tri zaglavlja afiniteta sesije nikad se ne prosljeđuju uzvodno — izvršitelji izgrađuju vlastita uzvodna zaglavlja od početka umjesto prosljeđivanja klijentskih zaglavlja, pa ona ostaju samo interni korelacijski identifikatori. +Tri zaglavlja afiniteta sesije nikada se ne prosljeđuju uzvodno — izvršitelji izrađuju vlastita uzvodna zaglavlja ispočetka umjesto prosljeđivanja klijentskih zaglavlja, pa ona ostaju samo interni korelacijski identifikatori. -### Ekskluzivni najmovi veze za upravljanu sesiju +### Ekskluzivni najmovi upravljanih veza sesije -**Opseg:** jedan aktivni upravljani HTTP klijent/sesija posjeduje jednu prikladnu OmniRoute vezu. +**Opseg:** jedan aktivni upravljani HTTP klijent/sesija posjeduje jednu prihvatljivu OmniRoute vezu. -**Svrha:** omogućiti trajno ekskluzivno vlasništvo nad vezom klijentima kojima je potrebna stroga granica usmjeravanja -između zahtjeva. To se razlikuje od afiniteta sesije, koji predstavlja blagu preferenciju kontinuiteta: -ekskluzivni najam trajno pohranjuje stanje životnog ciklusa u SQLiteu, provodi globalnu jedinstvenost aktivnog vlasnika i -aktivne veze te odbija zastarjelu generaciju prije prosljeđivanja pružatelju. +**Svrha:** pružiti trajno ekskluzivno vlasništvo nad vezom klijentima kojima je potrebna stroga granica usmjeravanja kroz više zahtjeva. To se razlikuje od afiniteta sesije, koji predstavlja blagu preferenciju kontinuiteta: ekskluzivni najam trajno pohranjuje stanje životnog ciklusa u SQLiteu, provodi globalnu jedinstvenost aktivnog vlasnika i aktivne veze te odbija zastarjelu generaciju prije slanja pružatelju usluga. -Značajka se uključuje zasebno za svaki API ključ. Upravljani ključ mora imati opseg `lease:exclusive` i -izričit popis `allowedConnections` koji nije prazan. Svaki HTTP klijent može upotrebljavati krajnju točku životnog ciklusa; nisu -potrebni naziv klijenta, korisnički agent, pružatelj, OAuth metoda ni model. Najam posjeduje vezu, -a ne model, pa promjena modela zadržava vezivanje sve dok veza ostaje uobičajeno -prikladna. Uobičajena pravila za model, kvotu, stanje, razdoblje mirovanja i popis dopuštenih veza ostaju mjerodavna te mogu -istu generaciju prebaciti na drugu slobodnu prikladnu vezu. +Značajka se zasebno uključuje za svaki API ključ. Upravljani ključ mora imati opseg `lease:exclusive` i eksplicitan popis `allowedConnections` koji nije prazan. Bilo koji HTTP klijent može upotrebljavati krajnju točku životnog ciklusa; nisu potrebni naziv klijenta, korisnički agent, pružatelj usluga, OAuth metoda ni model. Najam posjeduje vezu, a ne model, pa se pri promjeni modela zadržava vezivanje sve dok veza ostaje prihvatljiva prema uobičajenim pravilima. Uobičajena pravila za model, kvotu, stanje, razdoblje čekanja i popis dopuštenih veza ostaju mjerodavna te mogu premjestiti istu generaciju na drugu slobodnu prihvatljivu vezu. -Životni ciklus odvija se putem `POST /api/v1/session-leases` s JSON radnjama `acquire`, `renew` i `release`. -Upravljani zahtjevi za izvođenje zaključivanja šalju neprozirnu vrijednost `X-OmniRoute-Lease-Owner` i točnu -vrijednost `X-OmniRoute-Lease-Generation`. Identifikator vlasnika počinje s `vlo_`, nakon čega slijede 43 base64url znaka; pohranjuje se samo -njegov SHA-256 sažetak. Svaka završna provjera prije prosljeđivanja također veže ID autentificiranog API ključa i -ID aktivne veze. Zaglavlja za upravljanje najmom uklanjaju se iz zapisnika, sačuvanih snimki zahtjeva i -zaglavlja uzvodnih izvršitelja. +Životnim ciklusom upravlja se putem `POST /api/v1/session-leases` s JSON radnjama `acquire`, `renew` i `release`. Upravljani zahtjevi za izvođenje predikcije šalju neprozirnu vrijednost `X-OmniRoute-Lease-Owner` i točnu vrijednost `X-OmniRoute-Lease-Generation`. Identifikator vlasnika sastoji se od prefiksa `vlo_` iza kojeg slijede 43 znaka u formatu base64url; pohranjuje se samo njegov SHA-256 sažetak. Svaka završna provjera prije slanja također veže ID autentificiranog API ključa i ID aktivne veze. Zaglavlja za upravljanje najmom uklanjaju se iz zapisnika, pohranjenih snimki zahtjeva i zaglavlja uzvodnih izvršitelja. -Ako uobičajeno usmjeravanje ima prikladne upravljane kandidate, ali je svaki slobodni kandidat zauzet -stranim aktivnim najmom, OmniRoute vraća HTTP `429`, kôd nedostupnog kapaciteta najma, -stanje čekanja kapaciteta i ograničeni `Retry-After` izveden iz najranijeg relevantnog isteka. -Uobičajeni izostanak prikladnih kandidata nije sukob najmova i zadržava postojeću semantiku pogreške usmjeravanja. +Ako uobičajeno usmjeravanje pronađe prihvatljive upravljane kandidate, ali je svaki slobodni kandidat zauzet stranim aktivnim najmom, OmniRoute vraća HTTP `429`, kôd nedostupnog kapaciteta najma, stanje čekanja na kapacitet i ograničenu vrijednost `Retry-After` izvedenu iz najranijeg relevantnog isteka. Uobičajeni slučaj bez prihvatljivih kandidata ne predstavlja sukob najmova i zadržava postojeću semantiku pogrešaka usmjeravanja. Povezani mehanizmi ostaju odvojeni: -- Zauzeće OAuth sesije procesno je lokalna blaga raspodjela za OAuth račune. -- Semafori računa dodjeljuju dopuštenja za istodobne zahtjeve i završavaju kada se zahtjev dovrši. -- Ekskluzivni najmovi veze za upravljanu sesiju trajno su vlasništvo životnog ciklusa s provjerom generacije. +- Zauzetost OAuth sesije predstavlja lokalnu, blagu raspodjelu OAuth računa unutar procesa. +- Semafori računa dodjeljuju dopuštenja za istodobno izvršavanje zahtjeva i završavaju kada se zahtjev dovrši. +- Ekskluzivni najmovi upravljanih sesija predstavljaju trajno vlasništvo tijekom životnog ciklusa uz provjeru generacije. --- @@ -288,46 +332,72 @@ brzine po modelu. Ograničeno je postavkom `comboCooldownWait` (`enabled`, `maxW ## 5. Kontrola prihvata u red zahtjeva (v3.8.49 · problem #6593) -**Opseg**: lokalni red za ograničavanje brzine po pružatelju i vezi (`open-sse/services/rateLimitManager.ts`, -temeljen na paketu Bottleneck), jedan sloj ispod triju prethodno opisanih mehanizama. - -**`maxWaitMs` je stari trajno pohranjeni naziv za istek izvršavanja.** -`resilienceSettings.requestQueue.maxWaitMs` prosljeđuje se paketu Bottleneck kao -`expiration` zadatka, čiji se mjerač vremena pokreće tek nakon slanja. Stoga ograničava -izvršavanje kojim upravlja ograničivač, a ne vrijeme provedeno u lokalnom redu. Istek -se izlaže kao pouzdani lokalni `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504); -prethodni naziv koda za istek vremena reda prihvaća se samo radi pouzdane interne -kompatibilnosti unatrag. Zadana je vrijednost 15000ms; nadjačajte je putem -`RATE_LIMIT_MAX_WAIT_MS` (varijabla okruženja) ili nadzorne ploče (**Postavke → Otpornost**, -gornja granica korisničkog sučelja 1–30000ms). Vrijeme provedeno u redu nema rok; upotrijebite -`maxQueueDepth` u nastavku kako biste ograničili broj pozivatelja na čekanju. - -**`maxQueueDepth` — opcionalno ograničenje prihvata (novo).** `resilienceSettings.requestQueue.maxQueueDepth` -ograničava koliko zahtjeva istodobno može čekati u redu (još nisu poslani) za jednu -kombinaciju pružatelja i veze. Kada red već sadrži `maxQueueDepth` +**Opseg**: lokalni red ograničenja brzine po pružatelju+vezi (`open-sse/services/rateLimitManager.ts`, +podržan paketom Bottleneck), jednu razinu ispod prethodno navedena tri mehanizma. + +**`maxWaitMs` ograničava čekanje u redu; `executionMaxWaitMs` ograničava izvršavanje.** +Ta su dva ograničenja namjerno odvojena i nijedno ne utječe na drugo. + +`resilienceSettings.requestQueue.maxWaitMs` predstavlja **vremenski budžet čekanja u redu**: +obuhvaća čekanje na slobodno mjesto kod pružatelja, a zatim boravak u stanju QUEUED, dok se njegov +mjerač vremena poništava čim zadatak napusti stanje QUEUED i započne izvršavanje +(`rateLimitManager.ts`, `wrappedFn`). Zahtjev koji prekorači taj budžet nikada ne dolazi +do uzvodnog servisa. Zadana vrijednost iznosi 30000ms, pruža je `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +u `src/lib/resilience/settings.ts`, a učvršćena je testom +`tests/unit/ratelimit-admission-control-6593.test.ts`, pa će promjena te vrijednosti +uzrokovati pad testa umjesto da ovaj odlomak neprimjetno zastari. + +`resilienceSettings.requestQueue.executionMaxWaitMs` vrijednost je koju Bottleneck +prima kao `expiration` zadatka, čiji se mjerač vremena pokreće tek nakon otpreme. Služi +kao krajnja zaštita za izvršitelje bez vlastitog vremenskog ograničenja uzvodnog servisa, +a povećava se na vlastito vremensko ograničenje izvršitelja za početak dohvaćanja kada je +ono dulje, tako da ne može prekinuti ispravan odgovor koji je u tijeku. Zadana vrijednost +iznosi 600000ms (10 min). + +Prosljeđivanje budžeta reda u `expiration` ranije je prekidalo neinkrementalne +pristupnike usred obrade — oni opravdano mogu raditi nekoliko minuta prije slanja prvih +bajtova — i zato se istek prikazuje kao `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), dok budžet reda nosi kôd isteka čekanja +u redu. Bilo koju vrijednost možete nadjačati putem `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (varijable okruženja) ili na nadzornoj ploči +(**Postavke → Otpornost**). Obje se vrijednosti pri normalizaciji ograničavaju na 1ms–24h. + +**Redoslijed prvenstva za obje vrijednosti:** varijabla okruženja određuje samo _zadanu vrijednost_. +Vrijednost spremljena u `resilienceSettings.requestQueue` (putem nadzorne ploče / API zakrpe, +pohranjena u `key_value`) ima prednost pred njom, a `rateLimitOverrides.maxWaitMs` / +`.executionMaxWaitMs` za pojedinačnu vezu ima prednost pred spremljenom vrijednošću. Stoga +postavljanje varijable okruženja u implementaciji koja već ima spremljenu vrijednost +ne mijenja ništa — umjesto toga uklonite ili ažurirajte spremljenu postavku. + +Boravak u redu ograničen je vrijednošću `maxWaitMs`; `maxQueueDepth` u nastavku ograničava +koliko pozivatelja istodobno smije biti u redu. + +**`maxQueueDepth` — neobavezno ograničenje prihvata (novo).** `resilienceSettings.requestQueue.maxQueueDepth` +ograničava koliko zahtjeva istodobno smije čekati u redu (još nisu otpremljeni) za jednu +kombinaciju pružatelja+veze. Kada red već sadrži `maxQueueDepth` zahtjeva, novi se zahtjev odmah odbija tipiziranom pogreškom -`code: "RATE_LIMIT_QUEUE_FULL"` **prije** nego što uopće dosegne `limiter.schedule()` -— stoga je odbijanje jeftino i događa se prije bilo kakvog daljnjeg +`code: "RATE_LIMIT_QUEUE_FULL"` **prije** nego što uopće stigne do `limiter.schedule()` +— stoga je odbijanje jeftino i događa se prije bilo kakvog naknadnog sažimanja upita / prevođenja za taj zahtjev. Zadana vrijednost `0` = -onemogućeno, čime se zadržava postojeće ponašanje neograničenog reda; raspon je ograničen na 0–100000. -Nadjačajte putem `RATE_LIMIT_MAX_QUEUE_DEPTH` (varijabla okruženja) ili -`resilienceSettings.requestQueue.maxQueueDepth` (zakrpa putem nadzorne ploče/API-ja). +onemogućeno, čime se zadržava postojeće ponašanje neograničenog reda; dopušteni je raspon 0–100000. +Vrijednost možete nadjačati putem `RATE_LIMIT_MAX_QUEUE_DEPTH` (varijable okruženja) ili +`resilienceSettings.requestQueue.maxQueueDepth` (nadzorna ploča/API zakrpa). Sama provjera prihvata čista je funkcija -(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) pa -se može jedinično testirati bez stvarnog ograničivača Bottleneck. +(`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) pa se +može jedinično testirati bez stvarnog ograničivača Bottleneck. > RFC kojim je otvoren #6593 također je predložio zastavicu `bypassCompressionOnRateLimit`. -> Proces u `open-sse/services/compression/` ovog repozitorija provodi -> sažimanje upita/konteksta na odlaznom LLM zahtjevu (`chatCore.ts`, +> Proces u `open-sse/services/compression/` ovog repozitorija obavlja +> sažimanje upita/konteksta u odlaznom LLM zahtjevu (`chatCore.ts`, > oko bloka `resolveCompressionSettings`/`selectCompressionStrategy`), -> a ne sažimanje HTTP odgovora na generiranim tijelima odgovora 429 — ne postoji -> odgovarajući put koda za doslovnu zastavicu zaobilaženja. Taj se korak sažimanja upita -> trenutačno također izvodi _prije_ `withRateLimit()` u procesnom toku zahtjeva, pa je +> a ne sažimanje HTTP odgovora za generirana tijela odgovora 429 — ne postoji +> odgovarajući put kôda za doslovnu zastavicu zaobilaženja. Taj se korak sažimanja upita +> trenutačno također izvodi _prije_ `withRateLimit()` u cjevovodu zahtjeva, pa je > promjena redoslijeda radi njegova preskakanja pri odbijanju zbog punog reda zasebna i veća > promjena od opsega ovog problema; ovdje namjerno **nije** implementirana -> i ostavljena je kao naknadni zadatak ako ušteda procesorskih resursa opravdava -> rizik promjene redoslijeda. +> i ostavljena je za naknadnu obradu ako je ušteda procesorskih resursa vrijedna +> rizika promjene redoslijeda. --- diff --git a/docs/i18n/hr/docs/architecture/admission-lanes.md b/docs/i18n/hr/docs/architecture/admission-lanes.md index f3ee28e4bb2a..cd3f24ff525a 100644 --- a/docs/i18n/hr/docs/architecture/admission-lanes.md +++ b/docs/i18n/hr/docs/architecture/admission-lanes.md @@ -7,47 +7,52 @@ OmniRoute ima **dva** sustava traka lokalna procesu s različitim područjima primjene. Oni se međusobno nadopunjuju; operateri bi trebali znati koji od njih promatraju. -## 1. Prijam na razini bajtova za cijeli proces (`chatBodyAdmission.ts`) +## 1. Prihvat na razini bajtova za cijeli proces (`chatBodyAdmission.ts`) -- **Područje primjene:** putanja predmemoriranog tijela/hrpe za `POST /v1/chat/completions`, +- **Opseg:** putanja međuspremnika tijela/heap memorije za `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses` i ostale rute oblikovane kao chat. Štiti - od povećanja potrošnje hrpe zbog velikih tijela zahtjeva agenata za programiranje (#4380). -- **Jedan globalni kontroler po procesu, a ne trake po ključu (#10110).** Svaki API ključ - (sažet) ili `anonymous` sesija pristupa **istom** zajedničkom budžetu — - sažeti ID sesije koristi se ISKLJUČIVO kao ključ za pravedno raspoređivanje (round-robin - otprema među zahtjevima na čekanju), a nikada kao zaseban kapacitet. Prethodna verzija ove - dokumentacije opisivala je trake po ključu s neovisnim kapacitetom; taj je model - uklonjen u #10110 jer je neautentificiranim lažnim vjerodajnicama omogućivao - višestruko povećanje ograničenja za cijeli proces. -- **Kontrola pristupa (#503-fanout): automatski izveden BAJTNI budžet za prijam, a ne fiksni broj - zahtjeva.** Zastarjelo ograničenje broja zahtjeva `CHAT_MAX_HEAVY_IN_FLIGHT` (zadano `1` - prije ovog ispravka) smanjivalo je fan-out agenata za programiranje (više podagenata/CLI-jeva, - tijela redovito > 256 KB) na efektivnu konkurentnost od približno 1, što je - uzrokovalo odgovore 503 pod posve uobičajenim opterećenjem. Sada se primjenjuje samo kada operater izričito - postavi `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Ako nije postavljen, prijam se umjesto toga - kontrolira pomoću `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — budžeta koji se automatski izvodi iz + od povećane potrošnje heap memorije zbog velikih tijela zahtjeva agenata za + programiranje (#4380). +- **Jedan globalni kontroler procesa, a ne zasebne trake po ključu (#10110).** Svaki API ključ + (sažet) ili `anonymous` sesija prihvaća se u okviru **istog** zajedničkog budžeta — + sažeti ID sesije koristi se ISKLJUČIVO kao ključ za pravedno raspoređivanje (kružno + raspoređivanje među zahtjevima na čekanju), nikada kao particija kapaciteta. Prethodna verzija ovog + dokumenta opisivala je trake po ključu s neovisnim kapacitetom; taj je model + uklonjen u #10110 jer je neautentificiranim lažnim vjerodajnicama omogućavao + povećavanje ograničenja na razini cijelog procesa. +- **Kontrola (#503-fanout): automatski izveden BAJTNI budžet za unos, a ne fiksni broj + zahtjeva.** Naslijeđeno ograničenje broja zahtjeva `CHAT_MAX_HEAVY_IN_FLIGHT` (zadano `1` + prije ovog ispravka) svodilo je paralelno izvođenje agenata za programiranje (više podagenata/CLI-jeva, + tijela rutinski > 256 KB) na efektivnu istodobnost od ~1, zbog čega se pri posve + uobičajenom opterećenju vraćao status 503. Sada se primjenjuje samo kada operator izričito + postavi `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Ako nije postavljen, prihvat se umjesto toga + kontrolira putem `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — budžeta koji se automatski izvodi iz stvarnog memorijskog ograničenja procesa (`src/shared/middleware/admissionBudget.ts`): - 25 % niže vrijednosti između ograničenja V8 hrpe i bilo kojeg ograničenja cgroupa/spremnika, - podijeljeno s faktorom privremenog povećanja od 8x te ograničeno na raspon između 8 MiB i - 2 GiB. Izričite zamjenske vrijednosti podliježu istim ograničenjima. Time se sustav automatski prilagođava od - spremnika s 512 MB do stolnog računala s 32 GB, bez podešavanja varijabli okruženja. Tijelo koje ne može - stati unutar efektivnog budžeta odmah završava pogreškom `413 body_exceeds_budget`; - samo nadmetanje među tijelima koja se pojedinačno mogu obraditi ulazi u ograničeni - red čekanja s pravednim raspoređivanjem. Aktivni alat za praćenje pritiska na resurse putem više signala (omjer V8 hrpe, + 25% strožeg ograničenja između V8 heap memorije i bilo kojeg ograničenja cgroupa/spremnika, + podijeljeno s faktorom prolaznog povećanja od 8x i ograničeno između 8 MiB i + 2 GiB. Izričita nadjačavanja koriste ista ograničenja. Time se automatski prilagođava od + spremnika od 512 MB do stolnog računala s 32 GB bez podešavanja varijabli okruženja. Tijelo koje + ne može stati unutar efektivnog budžeta odmah završava s `413 body_exceeds_budget`; + samo nadmetanje između tijela koja se pojedinačno mogu obraditi ulazi u ograničeni + pravedni red čekanja. Aktivni višesignalni alat za praćenje pritiska na resurse (omjer V8 heap memorije, cgroup, PSI, OOM događaji — `open-sse/utils/resourcePressurePolicy.ts`) skraćuje - ograničeno čekanje pod pritiskom razine `high` i odmah odbacuje zahtjeve s odgovorom - `503 resource_pressure` pod pritiskom razine `critical`, čak i prije prijama bilo kojeg bajta. + ograničeno čekanje pri `high` pritisku i odmah odbacuje zahtjeve s + `503 resource_pressure` pri `critical` pritisku, prije nego što se uopće učita ijedan bajt. + PSI se čita iz `memory.pressure` cgroupa ove jedinice kada je dostupan + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` obuhvaća + cijeli host i koristi se samo kao pričuvna opcija na fizičkim poslužiteljima / cgroupu v1, tako da host + koji koristi swap ne može uzrokovati odgovor 503 u neaktivnom spremniku. - **Podešavanje:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — zamjenska vrijednost automatski izvedenog bajtnog budžeta - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — zastarjelo ograničenje broja zahtjeva, samo uz izričito uključivanje + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — nadjačavanje automatski izvedenog bajtnog budžeta + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — naslijeđeno ograničenje broja zahtjeva, samo uz izričito uključivanje - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — čekanje u redu prije odgovora 503 (zadano 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — zaštitni ventil hrpe za bajtove u redu čekanja (zadano 4 MB) - - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — zastarjele - opcije bez učinka od #10110 (prihvaćaju se radi kompatibilnosti konfiguracije, ali se zanemaruju) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — heap ventil za bajtove u redu čekanja (zadano 4 MB) + - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — zastarjelo; + bez učinka od #10110 (prihvaća se radi kompatibilnosti konfiguracije, ali se zanemaruje) - **Izvješća:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — uključujući dodatke iz #503-fanout: `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` i `countCapEnabled` - (false u zadanom uvođenju — potvrđuje da se zapravo primjenjuje bajtni budžet, a ne zastarjelo + (false u zadanom postavljanju — potvrđuje da se stvarno primjenjuje bajtni budžet, a ne naslijeđeno ograničenje broja zahtjeva). ## 2. Prilagodljive virtualne trake tijekom izvođenja (`open-sse/services/admission`) diff --git a/docs/i18n/hr/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/hr/docs/frameworks/EMBEDDED-SERVICES.md index a2177b178d32..3046a629da8f 100644 --- a/docs/i18n/hr/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/hr/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Verzija:** v3.8.44 -> **Posljednje ažuriranje:** 2026-07-03 -> **Ciljana publika:** Inženjeri koji dodaju, održavaju ili otklanjaju pogreške ugrađenih servisa (9Router, CLIProxyAPI, Mux, Bifrost). +> **Posljednje ažuriranje:** 2026-09-09 +> **Ciljana publika:** Inženjeri koji dodaju, održavaju ili otklanjaju pogreške u ugrađenim uslugama (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). -Ugrađeni servisi lokalno su instalirani pomoćni procesni alati koje OmniRoute instalira, nadzire i +Ugrađene usluge lokalno su instalirani pomoćni procesni alati koje OmniRoute instalira, nadzire i izlaže kao punopravna odredišta usmjeravanja. Za razliku od vanjskih pružatelja usluga (kojima se pristupa putem interneta -pomoću API ključeva), ugrađeni servisi izvršavaju se na istom računalu kao OmniRoute i komuniciraju putem povratne petlje. +pomoću API ključeva), ugrađene usluge izvršavaju se na istom računalu kao OmniRoute i komuniciraju putem sučelja povratne petlje. --- @@ -29,35 +29,36 @@ pomoću API ključeva), ugrađeni servisi izvršavaju se na istom računalu kao ## 1. Pregled -### Zašto ugrađeni servisi? +### Zašto ugrađene usluge? -Ugrađeno je pet servisa: +Ugrađeno je šest usluga: -| Servis | npm paket | Zadani port | Namjena | -| --------------- | --------------------------------------------------- | :---------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI usmjerivač koji OmniRoute može upotrebljavati kao podređenog pružatelja usluga. Modeli su izloženi kao `9router/{sub}/{model}` | -| **CLIProxyAPI** | Binarna datoteka iz izdanja na GitHubu (`cliproxy`) | 8317 | Lokalni proxy prilagodnik za tijekove autentifikacije Anthropic CLI-ja. Omogućuje zamjensko usmjeravanje kada OAuth tokeni isteknu | -| **Mux** | `mux` (bez sučelja `mux server`) | 8322 | Lokalni demon za orkestraciju agenata (coder/mux). Samo upravljanje životnim ciklusom — nije odredište usmjeravanja (nema proxyja za LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Pozadinski relejni sustav AI pristupnika napisan u jeziku Go. Kada je pokrenut, automatski ga odabire relejna ruta (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Proxy za Claude pretplatu — alternativa/zamjena za CLIProxyAPI za promet u obliku Claude Codea; umetnuti ključ postaje `DARIO_ADMIN_TOKEN`, koji štiti njegovu OAuth upravljačku ravninu `/admin/*` | +| Usluga | npm paket | Zadani port | Svrha | +| --------------- | ----------------------------------------------- | :---------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI usmjerivač koji OmniRoute može koristiti kao podpružatelja. Modeli su izloženi kao `9router/{sub}/{model}` | +| **CLIProxyAPI** | Binarna datoteka iz GitHub izdanja (`cliproxy`) | 8317 | Lokalni proxy prilagodnik za tijekove autentifikacije Anthropic CLI-ja. Omogućuje pričuvno usmjeravanje kada OAuth tokeni isteknu | +| **Mux** | `mux` (bez sučelja, `mux server`) | 8322 | Lokalni daemon za orkestraciju agenata (coder/mux). Upravlja se samo životnim ciklusom — nije cilj usmjeravanja (nema posredovanja LLM zahtjeva). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Pozadinski sustav releja AI pristupnika napisan u jeziku Go. Dok je pokrenut, automatski ga odabire relejna ruta (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Proxy za pretplatu na Claude — alternativa/pričuvna opcija za CLIProxyAPI za promet u formatu Claude Codea; umetnuti ključ postaje `DARIO_ADMIN_TOKEN` koji štiti njegovu OAuth upravljačku ravninu `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Automatizacija WhatsApp Weba (Chromium bez sučelja putem Puppeteera). Upravlja se samo životnim ciklusom — nije cilj usmjeravanja. | -Svih pet primjenjuje isti model nadzora: +Svih šest usluga slijedi isti model nadzora: -- OmniRoute ih instalira u `DATA_DIR/services/{name}/` (izolirano od vlastite datoteke `package.json` sustava OmniRoute) -- OmniRoute ih pokreće i nadzire kao podređene procese -- OmniRoute umeće kratkotrajni API ključ u okruženje podređenog procesa i rotira ga bez prekida rada (gdje je primjenjivo) -- Sve upravljačke rute (`/api/services/*`) imaju oznaku **LOCAL_ONLY** — dostupne su samo putem povratne petlje (strogo pravilo #17) +- OmniRoute ih instalira u `DATA_DIR/services/{name}/` (izolirano od OmniRouteove vlastite datoteke `package.json`) +- OmniRoute ih pokreće kao podređene procese i nadzire ih +- OmniRoute umeće privremeni API ključ u okruženje podređenog procesa i rotira ga bez prekida rada (gdje je primjenjivo) +- Sve upravljačke rute (`/api/services/*`) imaju oznaku **LOCAL_ONLY** — dostupne su samo preko povratne mrežne adrese (strogo pravilo br. 17) -### Ključne odluke (iz plana dizajna) +### Ključne odluke (iz projektnog plana) -| Odluka | Vrijednost | -| ----------------------------------------- | ------------------------------------------------------------------------------------ | -| Pristup izvornoj nadzornoj ploči 9Routera | Obrnuti proxy na `/dashboard/providers/services/9router/embed/*` | -| Mehanizam instalacije | `npm install {package}` putem `execFile` (bez interpolacije ljuske) | -| Način upotrebe | Pružatelj usluga registriran je kao `9router/{sub}/{model}` u mehanizmu usmjeravanja | -| Upravljanje API ključem | OmniRoute ga generira, šifrira u mirovanju (AES-256-GCM) i umeće putem okruženja | -| Lokacija nadzorne ploče | `/dashboard/providers/services` (tri kartice) | -| Automatsko pokretanje | Prekidač za svaki servis, zadano ISKLJUČENO | +| Odluka | Vrijednost | +| ----------------------------------------- | ------------------------------------------------------------------------------------------ | +| Pristup izvornoj nadzornoj ploči 9Routera | Obrnuti proxy na `/dashboard/providers/services/9router/embed/*` | +| Mehanizam instalacije | `npm install {package}` putem `execFile` (bez interpolacije ljuske) | +| Način korištenja | Pružatelj registriran kao `9router/{sub}/{model}` u mehanizmu usmjeravanja | +| Upravljanje API ključem | OmniRoute ga generira, šifrira pri pohrani (AES-256-GCM) i umeće putem varijabli okruženja | +| Lokacija nadzorne ploče | `/dashboard/providers/services` (tri kartice) | +| Automatsko pokretanje | Prekidač za svaku uslugu, zadano ISKLJUČENO | --- @@ -65,12 +66,13 @@ Svih pet primjenjuje isti model nadzora: ``` ┌────────────────────────────────────────────────────────────────────┐ -│ Sloj 1 — korisničko sučelje │ +│ Sloj 1 — Korisničko sučelje │ │ /dashboard/providers/services (kartice: CLIProxyAPI | 9Router | Mux)│ -│ Zapisi uživo (SSE), pokretanje/zaustavljanje/ponovno pokretanje/ažuriranje, postavke, instalacija│ +│ Zapisi uživo (SSE), Pokreni/Zaustavi/Ponovno pokreni/Ažuriraj, │ +│ Postavke, Instaliraj │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Okvir + usmjeravanje kartica putem ?tab=│ +│ ├── page.tsx Okvir + usmjeravanje kartica prema ?tab=│ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -87,39 +89,39 @@ Svih pet primjenjuje isti model nadzora: │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (obrnuti HTTP + WebSocket proxy → nadređeni 9Router) │ +│ (obrnuti HTTP + WebSocket proxy → 9Router upstream) │ │ │ -│ Zaštita: LOCAL_ONLY_API_PREFIXES uključuje "/api/services/" i │ -│ "/dashboard/providers/services/*/embed/" │ +│ Ograničenje: LOCAL_ONLY_API_PREFIXES uključuje "/api/services/" i │ +│ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ │ pozivi unutar procesa ┌──────────────────────▼─────────────────────────────────────────────┐ │ Sloj 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Generički nadzornik (child_process.spawn) │ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 20130 za 9Router (podesivo) │ -│ ├── logs: kružni međuspremnik stdio zapisa od 5 MB → SSE događaji│ -│ ├── health: HTTP GET /health svakih 2–5 s, oporavak po potrebi│ -│ └── lifecycle: SIGTERM 15 s → SIGKILL │ +│ ├── instalacija: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── pokretanje: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY│ +│ ├── port: 20130 za 9Router (podesivo) │ +│ ├── zapisi: stdio kružni međuspremnik od 5 MB → SSE događaji│ +│ ├── zdravlje: HTTP GET /health svakih 2–5 s, lijeni oporavak │ +│ └── životni ciklus: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Pokreće sve SERVICES[] pri pokretanju procesa │ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Periodični GET /v1/models → tablica service_models│ │ ringBuffer.ts Kružni međuspremnik zapisa (5 MB po usluzi) │ -│ healthCheck.ts Periodička HTTP provjera stanja │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (prilagodnici instalacijskog programa) │ +│ healthCheck.ts Periodička HTTP provjera zdravlja │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (adapteri instalacijskog programa) │ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP kompatibilan s OpenAI-jem (povratna petlja) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Sloj 4 — davatelj usluge / usmjeravanje │ +│ Sloj 4 — Pružatelj / Usmjeravanje │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Ponovno dohvaća port i API ključ za svaki zahtjev (bez predmemoriranja).│ +│ Ponovno dohvaća port i API ključ za svaki zahtjev (bez predmemorije).│ │ Uklanja prefiks "9router/" iz ID-a modela prije prosljeđivanja. │ │ Vraća 503 service_not_running ako nadzornik nije u stanju "running".│ │ │ @@ -130,29 +132,30 @@ Svih pet primjenjuje isti model nadzora: │ Modeli se pohranjuju kao "9router/{sub}/{model}" (s prefiksom). │ │ Sinkronizira ih modelSync.ts svakih 5 min. │ │ │ -│ Muxom se upravlja SAMO kroz životni ciklus (slojevi 1–3) — to je │ +│ Mux ima upravljanje SAMO životnim ciklusom (slojevi 1–3) — to je │ │ demon za orkestraciju agenata, a ne LLM proxy, stoga nema izvršitelj│ -│ ni unos davatelja usluge u sloju 4 i nikada nije cilj usmjeravanja.│ +│ ni unos pružatelja u sloju 4 i nikad nije cilj usmjeravanja. │ └────────────────────────────────────────────────────────────────────┘ ``` ### Ključne izvorne datoteke -| Datoteka | Uloga | -| ------------------------------------------- | -------------------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Temeljna klasa: životni ciklus, zaključavanje, stanje, kružni međuspremnik | -| `src/lib/services/bootstrap.ts` | Registracija na razini procesa i automatsko pokretanje | -| `src/lib/services/registry.ts` | Jedinstvena mapa `alat → nadzornik` | -| `src/lib/services/apiKey.ts` | Generiranje ključeva, AES-256-GCM šifriranje pohranjenih podataka | -| `src/lib/services/modelSync.ts` | Periodična sinkronizacija modela (5 min) + na zahtjev | -| `src/lib/services/ringBuffer.ts` | Kružni međuspremnik zapisnika od 5 MB s SSE pretplatom | -| `src/lib/services/healthCheck.ts` | HTTP provjera stanja (podesivi interval) | -| `src/lib/services/installers/ninerouter.ts` | npm instalacija/ažuriranje/deinstalacija za 9Router | -| `src/lib/services/installers/cliproxy.ts` | npm instalacija/ažuriranje/deinstalacija za CLIProxyAPI | -| `src/lib/services/installers/mux.ts` | npm instalacija/ažuriranje/deinstalacija za Mux | -| `src/app/api/services/9router/_lib.ts` | Pomoćna funkcija `getOrInitSupervisor()` | -| `src/app/api/services/[name]/logs/route.ts` | Zajednička krajnja točka za SSE zapisnike | -| `open-sse/executors/ninerouter.ts` | Izvršitelj pružatelja usluge (sloj 4) | +| Datoteka | Uloga | +| ------------------------------------------- | ------------------------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Osnovna klasa: životni ciklus, zaključavanje, stanje, kružni međuspremnik | +| `src/lib/services/bootstrap.ts` | Registracija na razini procesa i automatsko pokretanje | +| `src/lib/services/registry.ts` | Singleton mapa `alat → nadzornik` | +| `src/lib/services/apiKey.ts` | Generiranje ključeva, AES-256-GCM enkripcija podataka u mirovanju | +| `src/lib/services/modelSync.ts` | Periodična sinkronizacija modela (5 min) + na zahtjev | +| `src/lib/services/ringBuffer.ts` | Kružni međuspremnik zapisnika od 5 MB s pretplatom putem SSE-a | +| `src/lib/services/healthCheck.ts` | HTTP provjera stanja (podesivi interval) | +| `src/lib/services/installers/ninerouter.ts` | npm instalacija/ažuriranje/deinstalacija za 9Router | +| `src/lib/services/installers/cliproxy.ts` | npm instalacija/ažuriranje/deinstalacija za CLIProxyAPI | +| `src/lib/services/installers/mux.ts` | npm instalacija/ažuriranje/deinstalacija za Mux | +| `src/lib/services/installers/openwa.ts` | npm instalacija/ažuriranje/deinstalacija za open-wa | +| `src/app/api/services/9router/_lib.ts` | Pomoćna funkcija `getOrInitSupervisor()` | +| `src/app/api/services/[name]/logs/route.ts` | Zajednička krajnja točka za SSE zapisnike | +| `open-sse/executors/ninerouter.ts` | Izvršitelj pružatelja usluge (sloj 4) | --- @@ -209,22 +212,22 @@ uvjeti utrke kada se, primjerice, automatsko pokretanje i gumb u korisničkom su ## 4. Referenca API-ja Sve rute pod `/api/services/` su **LOCAL_ONLY** (samo povratna petlja, strogo pravilo #17). -Zahtjevi koji ne dolaze s povratne petlje primaju `403 LOCAL_ONLY` bez obzira na token za autentifikaciju. +Zahtjevi koji ne dolaze s povratne petlje primaju `403 LOCAL_ONLY` bez obzira na autentifikacijski token. ### 4.1 Krajnje točke 9Routera (11 ruta) #### `POST /api/services/9router/install` -Instalira 9Router iz npm-a. Stvara `DATA_DIR/services/9router/` s vlastitim -`package.json` i `node_modules/`. Ne dolazi u sukob s vlastitim ovisnostima OmniRoutea. +Instalira 9Router iz npm-a. Stvara `DATA_DIR/services/9router/` s vlastitim datotekama +`package.json` i `node_modules/`. Nije u sukobu s vlastitim ovisnostima OmniRoutea. -**Tijelo zahtjeva** (sve neobavezno): +**Tijelo zahtjeva** (sva su polja neobavezna): ```json { "version": "latest" } ``` -| Polje | Vrsta | Zadano | Opis | +| Polje | Tip | Zadano | Opis | | --------- | -------- | ---------- | -------------------------------------------- | | `version` | `string` | `"latest"` | npm oznaka verzije ili semver za instalaciju | @@ -233,7 +236,7 @@ Instalira 9Router iz npm-a. Stvara `DATA_DIR/services/9router/` s vlastitim | Status | Opis | | ------ | ----------------------------------------------------------------------------------- | | `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Neispravno tijelo zahtjeva (neuspjela Zod provjera valjanosti) | +| `400` | Nevaljano tijelo zahtjeva (neuspjela Zod validacija) | | `409` | Instalacija je već u tijeku (zaključavanje je aktivno) | | `500` | npm instalacija nije uspjela — pogledajte `message` za razumljivu poruku o pogrešci | @@ -244,10 +247,10 @@ Pogreške EACCES prikazuju se kao razumljive poruke. #### `POST /api/services/9router/start` -Pokreće 9Router. Registrira nadzornika ako već nije registriran, a zatim poziva -`supervisor.start()`. Operacija je idempotentna ako je servis već pokrenut. +Pokreće 9Router. Registrira nadzornik ako već nije registriran, a zatim poziva +`supervisor.start()`. Idempotentno ako je servis već pokrenut. -**Tijelo zahtjeva:** nema ga +**Tijelo zahtjeva:** nema **Odgovori:** @@ -275,25 +278,25 @@ Pokreće 9Router. Registrira nadzornika ako već nije registriran, a zatim poziv #### `POST /api/services/9router/stop` -Uredno zaustavlja 9Router. Šalje SIGTERM, čeka 15 s, a zatim šalje SIGKILL ako je proces još aktivan. -Operacija je idempotentna ako je servis već zaustavljen. +Kontrolirano zaustavlja 9Router. Šalje SIGTERM, čeka 15 s, a zatim šalje SIGKILL ako je proces još uvijek aktivan. +Idempotentno ako je servis već zaustavljen. -**Tijelo zahtjeva:** nema ga +**Tijelo zahtjeva:** nema **Odgovori:** | Status | Opis | | ------ | -------------------------------------- | -| `200` | `ServiceStatus` (stanje: "stopped") | -| `503` | Zaustavljanje neočekivano nije uspjelo | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Zaustavljanje je neočekivano podbacilo | --- #### `POST /api/services/9router/restart` -Jednako pozivu `stop()`, a zatim `start()` pod zaključavanjem operacije. +Istovjetno pozivu `stop()`, a zatim `start()` pod zaključavanjem operacije. -**Tijelo zahtjeva:** nema ga +**Tijelo zahtjeva:** nema **Odgovori:** isti kao za `start` (vraća konačni `ServiceStatus`). @@ -301,11 +304,11 @@ Jednako pozivu `stop()`, a zatim `start()` pod zaključavanjem operacije. #### `POST /api/services/9router/update` -Ažurira 9Router na noviju npm verziju. Ako je servis pokrenut, prvo se -zaustavlja, zatim se pokreće npm instalacija (instaliranje novije verzije na istom mjestu), a potom se -servis ponovno pokreće. +Ažurira 9Router na noviju npm verziju. Ako je servis pokrenut, prvo se zaustavlja, +zatim se pokreće npm instalacija (novija verzija instalira se na postojećem mjestu), +a servis se potom ponovno pokreće. -**Tijelo zahtjeva** (sve neobavezno): +**Tijelo zahtjeva** (sva su polja neobavezna): ```json { "version": "latest" } @@ -316,16 +319,16 @@ servis ponovno pokreće. | Status | Opis | | ------ | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | -| `400` | Neispravno tijelo | +| `400` | Nevaljano tijelo | | `500` | npm ažuriranje nije uspjelo | --- #### `POST /api/services/9router/rotate-key` -Generira novi API ključ za 9Router, šifrira ga u mirovanju i ponovno pokreće uslugu -(ako je pokrenuta) kako bi preuzela novi ključ iz svojeg okruženja. Stari ključ -odmah se poništava. +Generira novi API ključ za 9Router, šifrira ga u mirovanju i ponovno pokreće servis +(ako je pokrenut) kako bi preuzeo novi ključ iz svojeg okruženja. Stari se ključ +odmah poništava. **Tijelo zahtjeva:** nema @@ -343,7 +346,7 @@ Pohranjuje se šifriran (AES-256-GCM) u tablici `version_manager`. #### `GET /api/services/9router/status` -Vraća objedinjeni status uživo i iz baze podataka, uključujući metapodatke o verziji i pregled API ključa. +Vraća objedinjeni status uživo i status iz baze podataka, uključujući metapodatke o verziji i pregled API ključa. **Odgovori:** @@ -376,8 +379,8 @@ Vraća objedinjeni status uživo i iz baze podataka, uključujući metapodatke o #### `POST /api/services/9router/auto-start` -Uključuje ili isključuje oznaku automatskog pokretanja. Kada je `enabled: true`, usluga se automatski -pokreće pri sljedećem pokretanju OmniRoutea (ako je usluga instalirana). +Uključuje ili isključuje automatsko pokretanje. Kada je `enabled: true`, servis se automatski +pokreće pri sljedećem pokretanju OmniRoutea (ako je servis instaliran). **Tijelo zahtjeva:** @@ -390,20 +393,20 @@ pokreće pri sljedećem pokretanju OmniRoutea (ako je usluga instalirana). | Status | Opis | | ------ | --------------------- | | `200` | `{ autoStart: true }` | -| `400` | Neispravno tijelo | +| `400` | Nevaljano tijelo | --- #### `GET /api/services/9router/logs` -SSE tok zapisa uživo iz kružnog međuspremnika standardnog izlaza i standardnog izlaza za pogreške 9Routera. +SSE tok zapisa uživo iz prstenastog međuspremnika za stdout/stderr 9Routera. **Parametri upita:** -| Parametar | Vrsta | Zadano | Opis | -| --------- | --------- | ------ | ----------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Broj povijesnih redaka koji će se prvi poslati (najviše 1000) | -| `filter` | `string` | nema | Filtar podniza neosjetljiv na velika i mala slova (bez regexa — sigurno od ReDoS-a) | +| Parametar | Tip | Zadano | Opis | +| --------- | --------- | ------ | ---------------------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Broj povijesnih redaka koji se prvo šalju (najviše 1000) | +| `filter` | `string` | nema | Filtar podniza neosjetljiv na velika i mala slova (bez regularnih izraza — sigurno od ReDoS-a) | **SSE događaji:** @@ -428,27 +431,27 @@ SSE tok zapisa uživo iz kružnog međuspremnika standardnog izlaza i standardno | Status | Opis | | ------ | -------------------------------------------------- | | `200` | `text/event-stream` | -| `400` | Parametar `filter` je predug (> 200 znakova) | +| `400` | Parametar `filter` predug (> 200 znakova) | | `404` | Usluga nije pronađena (nadzornik nije registriran) | --- ### 4.2 Krajnje točke CLIProxyAPI-ja (10 ruta) -CLIProxyAPI ima isti oblik krajnjih točaka kao 9Router, bez `rotate-key`, uz -`accounts`, `provider-expose` i `auto-restart-adopted`. Sada prima -namjenski API ključ podatkovne ravnine koji se umeće pri pokretanju (`needsApiKey: true` u -`bootstrap.ts`, koristi se za sinkronizaciju modela); `status` uključuje manje polja. - -| Metoda | Putanja | Opis | -| ------ | ----------------------------------- | ---------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | Instalira CLIProxyAPI iz npm-a | -| `POST` | `/api/services/cliproxy/start` | Pokreće CLIProxyAPI | -| `POST` | `/api/services/cliproxy/stop` | Zaustavlja CLIProxyAPI | -| `POST` | `/api/services/cliproxy/restart` | Ponovno pokreće CLIProxyAPI | -| `POST` | `/api/services/cliproxy/update` | Ažurira na noviju verziju | -| `GET` | `/api/services/cliproxy/status` | Status uživo i iz baze podataka (bez `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Uključuje ili isključuje automatsko pokretanje | +CLIProxyAPI ima isti oblik krajnjih točaka kao 9Router, bez `rotate-key`, uz dodatne +`accounts`, `provider-expose` i `auto-restart-adopted`. Sada pri pokretanju prima +namjenski API ključ podatkovne ravnine (`needsApiKey: true` u +`bootstrap.ts`, koristi se za sinkronizaciju modela); `status` sadrži manje polja. + +| Metoda | Putanja | Opis | +| ------ | ----------------------------------- | ---------------------------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Instaliraj CLIProxyAPI iz npm-a | +| `POST` | `/api/services/cliproxy/start` | Pokreni CLIProxyAPI | +| `POST` | `/api/services/cliproxy/stop` | Zaustavi CLIProxyAPI | +| `POST` | `/api/services/cliproxy/restart` | Ponovno pokreni CLIProxyAPI | +| `POST` | `/api/services/cliproxy/update` | Ažuriraj na noviju verziju | +| `GET` | `/api/services/cliproxy/status` | Trenutačni status + status iz baze podataka (bez `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Uključi ili isključi automatsko pokretanje | Zajednička krajnja točka `GET /api/services/{name}/logs` (pogledajte §4.1) radi za sve četiri usluge koristeći dinamički segment `[name]`. @@ -457,58 +460,92 @@ Zajednička krajnja točka `GET /api/services/{name}/logs` (pogledajte §4.1) ra ### 4.3 Krajnje točke Muxa (8 ruta) -Mux ima isti oblik krajnjih točaka kao CLIProxyAPI — nema rute `rotate-key` u API -sučelju (token nositelja generira se na isti način kao za 9Router putem +Mux ima isti oblik krajnjih točaka kao CLIProxyAPI — nema rutu `rotate-key` na površini +API-ja (token nositelja generira se na isti način kao za 9Router putem `getOrCreateApiKey("mux")` i umeće se putem varijable okruženja `MUX_SERVER_AUTH_TOKEN`, ali -još nema namjenske krajnje točke za rotaciju). Muxom se upravlja samo kroz njegov životni ciklus: za razliku od -9Routera, nema izvršitelj sloja 4 i nikada se ne registrira kao pružatelj usmjeravanja. +još ne postoji namjenska krajnja točka za rotaciju). Muxom se upravlja samo tijekom njegova +životnog ciklusa: za razliku od 9Routera, nema izvršitelj sloja 4 i nikada se ne registrira +kao pružatelj usluge usmjeravanja. -| Metoda | Putanja | Opis | -| ------ | ------------------------------ | ---------------------------------------------- | -| `POST` | `/api/services/mux/install` | Instalira Mux iz npm-a (`npm i mux`) | -| `POST` | `/api/services/mux/start` | Pokreće Mux (`mux server`) | -| `POST` | `/api/services/mux/stop` | Zaustavlja Mux | -| `POST` | `/api/services/mux/restart` | Ponovno pokreće Mux | -| `POST` | `/api/services/mux/update` | Ažurira na noviju npm verziju | -| `GET` | `/api/services/mux/status` | Status uživo i iz baze podataka | -| `POST` | `/api/services/mux/auto-start` | Uključuje ili isključuje automatsko pokretanje | +| Metoda | Putanja | Opis | +| ------ | ------------------------------ | ------------------------------------------- | +| `POST` | `/api/services/mux/install` | Instaliraj Mux iz npm-a (`npm i mux`) | +| `POST` | `/api/services/mux/start` | Pokreni Mux (`mux server`) | +| `POST` | `/api/services/mux/stop` | Zaustavi Mux | +| `POST` | `/api/services/mux/restart` | Ponovno pokreni Mux | +| `POST` | `/api/services/mux/update` | Ažuriraj na noviju npm verziju | +| `GET` | `/api/services/mux/status` | Trenutačni status + status iz baze podataka | +| `POST` | `/api/services/mux/auto-start` | Uključi ili isključi automatsko pokretanje | --- ### 4.4 Krajnje točke Bifrosta (8 ruta) -Bifrost je posrednički pozadinski sustav AI pristupnika napisan u Gou (`@maximhq/bifrost`). Koristi isti +Bifrost je pozadinski relej AI pristupnika napisan u Gou (`@maximhq/bifrost`). Koristi isti oblik krajnjih točaka kao CLIProxyAPI (bez `rotate-key` — Bifrost upravlja vlastitim ključevima -pružatelja u datoteci `config.json` unutar svojeg `-app-dir` direktorija). - -| Metoda | Putanja | Opis | -| ------ | ---------------------------------- | --------------------------------------------------------------------- | -| `POST` | `/api/services/bifrost/install` | Instalira Bifrost iz npm-a (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Pokreće Bifrost na portu 8080 (zadano) | -| `POST` | `/api/services/bifrost/stop` | Zaustavlja Bifrost | -| `POST` | `/api/services/bifrost/restart` | Ponovno pokreće Bifrost | -| `POST` | `/api/services/bifrost/update` | Ažurira na noviju verziju | -| `GET` | `/api/services/bifrost/status` | Status uživo + status baze podataka | -| `POST` | `/api/services/bifrost/auto-start` | Uključuje/isključuje automatsko pokretanje | -| `GET` | `/api/services/bifrost/logs` | SSE praćenje zapisnika (putem dijeljene dinamičke rute `[name]/logs`) | - -**Konfiguracija usmjeravanja:** Kada `BIFROST_BASE_URL` nije postavljen i nadzirana instanca +pružatelja u datoteci `config.json` unutar svojeg `-app-dir`). + +| Metoda | Putanja | Opis | +| ------ | ---------------------------------- | ---------------------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Instaliraj Bifrost iz npm-a (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Pokreni Bifrost na ulazu 8080 (zadano) | +| `POST` | `/api/services/bifrost/stop` | Zaustavi Bifrost | +| `POST` | `/api/services/bifrost/restart` | Ponovno pokreni Bifrost | +| `POST` | `/api/services/bifrost/update` | Ažuriraj na noviju verziju | +| `GET` | `/api/services/bifrost/status` | Trenutačni status + status iz baze podataka | +| `POST` | `/api/services/bifrost/auto-start` | Uključi ili isključi automatsko pokretanje | +| `GET` | `/api/services/bifrost/logs` | SSE praćenje zapisnika (putem zajedničke dinamičke rute `[name]/logs`) | + +**Povezivanje usmjeravanja:** Kada `BIFROST_BASE_URL` nije postavljen, a nadzirana instanca Bifrosta radi, `getBifrostRoutingConfig()` (u `routingBackend.ts`) automatski -upotrebljava `http://127.0.0.1:{port}` kao osnovni URL releja. Izričito postavljena varijabla okruženja -`BIFROST_BASE_URL` uvijek ima prednost. +koristi `http://127.0.0.1:{port}` kao osnovni URL releja. Izričito postavljena varijabla +okruženja `BIFROST_BASE_URL` uvijek ima prednost. --- ### 4.5 Krajnje točke Darija (12 ruta) -Isti oblik životnog ciklusa kao i kod drugih usluga (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), uz upravljački sloj OAuth-a -zaštićen tokenom pod `admin/`: `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (sve zaštićeno varijablom `DARIO_ADMIN_TOKEN`). +Isti oblik životnog ciklusa kao kod ostalih usluga (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`) uz upravljačku ravninu OAuth-a +zaštićenu tokenom pod `admin/`: `admin/accounts`, `admin/import-from-omniroute`, +`admin/login-start`, `admin/login-complete` (sve zaštićeno putem `DARIO_ADMIN_TOKEN`). + +### 4.6 Krajnje točke open-wa (7 ruta) + +open-wa (`@open-wa/wa-automate`) upravlja instancom Chromiuma bez grafičkog sučelja (putem +Puppeteera) radi automatizacije WhatsApp Weba. Koristi isti oblik krajnjih točaka kao Mux (još +nema rutu `rotate-key`). Njime se upravlja samo tijekom njegova životnog ciklusa — nije cilj +usmjeravanja te nema izvršitelj sloja 4 ni unos pružatelja. + +| Metoda | Putanja | Opis | +| ------ | --------------------------------- | ---------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Instalira open-wa iz npm-a (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Pokreće open-wa na portu 8323 (zadano) | +| `POST` | `/api/services/openwa/stop` | Zaustavlja open-wa | +| `POST` | `/api/services/openwa/restart` | Ponovno pokreće open-wa | +| `POST` | `/api/services/openwa/update` | Ažurira na noviju verziju | +| `GET` | `/api/services/openwa/status` | Status uživo + status baze podataka | +| `POST` | `/api/services/openwa/auto-start` | Uključuje ili isključuje automatsko pokretanje | +| `GET` | `/api/services/openwa/logs` | SSE praćenje zapisnika (putem zajedničke dinamičke rute `[name]/logs`) | + +**API ključ:** umeće se kao `WA_KEY` — open-wa generičko nadjačavanje varijablama okruženja s prefiksom `WA_*` mapira ga na CLI opciju `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, provjereno u odnosu na instalirani paket verzije 4.76.0). Dodaje se prefiks `ow_` kada ga generira `generateServiceApiKey()`. open-wa +čita ključ iz HTTP zaglavlja `key`/`api_key` (ne iz `Authorization: +Bearer`); `/api-docs*` je izričito izuzet od provjere +(`setupAuthenticationLayer` u `dist/cli/server.js`), stoga provjera stanja +ne zahtijeva autentifikacijsko zaglavlje. + +**Uparivanje:** open-wa je neslužben i nije povezan s WhatsAppom — za +povezani broj postoji rizik zabrane zbog WhatsAppova vlastitog otkrivanja automatizacije. +Pri prvom pokretanju QR kod za uparivanje ispisuje se na stdout i prikazuje +putem postojeće ploče Zapisi/SSE toka — u ovoj integraciji još nema namjenske +krajnje točke za QR sliku. + +--- -### 4.6 Obrnuti proxy (ugrađena nadzorna ploča 9Routera) +### 4.7 Obrnuti proxy (ugradnja nadzorne ploče 9Router) -Nadzorna ploča ugrađuje web-sučelje 9Routera unutar iframea putem internog obrnutog +Nadzorna ploča ugrađuje web-sučelje 9Router unutar iframea putem internog obrnutog proxyja na: ``` @@ -518,16 +555,16 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Ovaj proxy: - Prosljeđuje zahtjev na `http://127.0.0.1:{port}/{path}` (samo povratna petlja) -- Uklanja dolazna zaglavlja `cookie` i `authorization` (bez curenja sesije OmniRoutea) -- Umeće `Authorization: Bearer {apiKey}` za autentifikaciju 9Routera -- Uklanja `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` iz odgovora -- Preoblikuje HTML odgovore kako bi umetnuo `` i normalizirao apsolutne putanje (`/foo` → `/dashboard/.../embed/foo`) +- Uklanja ulazna zaglavlja `cookie` i `authorization` (nema curenja sesije OmniRoute) +- Umeće `Authorization: Bearer {apiKey}` za autentifikaciju 9Router +- Iz odgovora uklanja `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` +- Prepisuje HTML odgovore kako bi umetnuo `` i normalizirao apsolutne putanje (`/foo` → `/dashboard/.../embed/foo`) -Nadogradnje na WebSocket za ugrađenu nadzornu ploču obrađuje prateći poslužitelj na +WebSocket nadogradnjama za ugrađenu nadzornu ploču upravlja prateći poslužitelj na namjenskom portu (pogledajte `src/lib/services/embedWsProxy.ts`). -**Sigurnost:** Rute ugrađenog proxyja klasificirane su pod `LOCAL_ONLY_API_PREFIXES` -i dostupne su samo putem povratne petlje. Napadač koji pribavi JWT putem +**Sigurnost:** Proxy rute za ugradnju klasificirane su pod `LOCAL_ONLY_API_PREFIXES` +i dostupne su samo s povratne petlje. Napadač koji pribavi JWT putem Cloudflare/Ngrok tunela ne može posredovati prema ugrađenim uslugama. --- diff --git a/docs/i18n/hr/docs/frameworks/MEMORY.md b/docs/i18n/hr/docs/frameworks/MEMORY.md index a7d66b210e9d..dbadf828c83e 100644 --- a/docs/i18n/hr/docs/frameworks/MEMORY.md +++ b/docs/i18n/hr/docs/frameworks/MEMORY.md @@ -168,7 +168,7 @@ Tablica `memory_vec_meta` (migracija `083_memory_vec.sql`) pohranjuje: ## Proširenje postavki Devet polja za ugrađivanje i vektore dostupno je u `MemorySettingsExtended` u -`src/shared/schemas/memory.ts`, a trajno se pohranjuju putem `src/lib/db/settings.ts`: +`src/shared/schemas/memory.ts`, a pohranjuju se putem `src/lib/db/settings.ts`: | Polje | Vrsta | Zadano | Opis | | ------------------------ | -------------------------------------------------- | -------- | --------------------------------------------------------------------- | @@ -176,18 +176,20 @@ Devet polja za ugrađivanje i vektore dostupno je u `MemorySettingsExtended` u | `embeddingProviderModel` | `string \| null` | `null` | Pružatelj/model u formatu `provider/model` | | `customBaseUrl` | `string \| null` | `null` | Osnovni URL krajnje točke kompatibilne s OpenAI-jem, samo za memoriju | | `customModelId` | `string \| null` | `null` | ID modela koji se šalje prilagođenoj krajnjoj točki | -| `transformersEnabled` | `boolean` | `false` | Dobrovoljno uključivanje Transformers.js-a (MiniLM, ~400 MB) | -| `staticEnabled` | `boolean` | `false` | Dobrovoljno uključivanje lokalnog statičkog modela potion-base-8M | -| `rerankEnabled` | `boolean` | `false` | Omogućuje korak ponovnog rangiranja (dodaje +200–500 ms/zahtjev) | +| `transformersEnabled` | `boolean` | `false` | Izričito uključivanje za Transformers.js (MiniLM, ~400 MB) | +| `staticEnabled` | `boolean` | `false` | Izričito uključivanje lokalnog statičkog modela potion-base-8M | +| `rerankEnabled` | `boolean` | `false` | Omogućivanje koraka ponovnog rangiranja (dodaje +200–500 ms/zahtjev) | | `rerankProviderModel` | `string \| null` | `null` | Pružatelj/model za ponovno rangiranje u formatu `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Koju vektorsku pozadinu koristiti | -Dostupna su putem `GET /PUT /api/settings/memory` (shema `MemorySettingsExtendedSchema`). +`rerankProviderModel` razrješava se putem `POST /v1/rerank` (poziva se preko povratne petlje), pa prihvaća sve što prihvaća ta ruta: odabrani model u oblaku za ponovno rangiranje (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) ili čvor pružatelja kompatibilnog s OpenAI-jem u obliku `/` (npr. `skilled-mini/bge-reranker-v2-m3` za TEI/Infinity poslužitelj). Čvorovi povratne petlje uvijek su prihvatljivi; čvor na drugom računalu (LAN, Tailscale) dodatno zahtijeva zastavicu značajke `RERANK_REMOTE_PROVIDER_NODES` i mora proći pravila za izlazne URL-ove pružatelja — pogledajte [Zastavice značajki](../reference/FEATURE_FLAGS.md). Selektor na nadzornoj ploči prikazuje odabrane pružatelje i lokalne čvorove; bilo koji valjani niz `provider/model` može se postaviti izravno putem `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Koju vektorsku pozadinu koristiti | -Za izvor `remote`, Memory prihvaća i neobavezne postavke `customBaseUrl` i +Dostupni su putem `GET /PUT /api/settings/memory` (shema `MemorySettingsExtendedSchema`). + +Za izvor `remote`, Memory također prihvaća neobavezne postavke `customBaseUrl` i `customModelId`. Zajedno odabiru krajnju točku `/embeddings` kompatibilnu s OpenAI-jem i model bez promjene globalnog registra ugrađivanja. Krajnja točka normalizira se -prije upotrebe i provjerava prema pravilima pružatelja za izlazne URL-ove: potreban je +prije uporabe i provjerava prema pravilima za izlazne URL-ove pružatelja: potreban je HTTP(S), ugrađene vjerodajnice i nizovi upita odbijaju se, a adrese metapodataka u oblaku ostaju blokirane. Prazne vrijednosti zadržavaju odabranog pružatelja iz registra. Pogreške vraćene nadzornoj ploči sanitiziraju se, a vjerodajnice krajnje točke nikada diff --git a/docs/i18n/hr/docs/guides/DOCKER_GUIDE.md b/docs/i18n/hr/docs/guides/DOCKER_GUIDE.md index c7121d3a038f..ad3752d22373 100644 --- a/docs/i18n/hr/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/hr/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Brzo pokretanje +> **Samostalno hostiranje jednom naredbom?** Pogledajte +> [Vodič za samostalno hostiranje](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (objavljena slika + +> Redis, dostupan samo putem povratne petlje, bez odabira profila). Brzo pokretanje u nastavku +> predstavlja način pokretanja u jednom spremniku za korisnike koji već pokreću Redis drugdje. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/hr/docs/guides/TROUBLESHOOTING.md b/docs/i18n/hr/docs/guides/TROUBLESHOOTING.md index 29d27d6a242a..bfa522a70ab1 100644 --- a/docs/i18n/hr/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/hr/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ Postavite ih u okruženju procesa OmniRoute (demona, primjerice putem LaunchAgen --- -## Upozorenja pri npm install (ERESOLVE / peer / deprecated) +## Upozorenja naredbe npm install (ERESOLVE / ravnopravne ovisnosti / zastarjelo) -Kada pokrenete `npm install -g omniroute`, možete vidjeti mnoštvo upozorenja poput `npm warn ERESOLVE`, obavijesti o ravnopravnim ovisnostima i poruke `deprecated`. **Ona su očekivana i bezopasna.** Instalacija je uspjela ako u izlazu vidite `added packages`. +Kada pokrenete `npm install -g omniroute`, može se prikazati velik broj upozorenja kao što su `npm warn ERESOLVE`, obavijesti o ravnopravnim ovisnostima i poruke `deprecated`. **To je očekivano i bezopasno.** Instalacija je uspjela ako se u izlazu prikaže `added packages`. -Upozorenja dolaze od zastarjelih raspona ravnopravnih ovisnosti u paketima trećih strana koje OmniRoute ne kontrolira: +Za suzbijanje upozorenja o razrješavanju ravnopravnih ovisnosti upotrijebite podržani način instalacije za OmniRoute: -1. **`marked-terminal` zahtijeva `marked >=1 <16`, pronađen je `marked@18`** — u praksi radi bez problema; raspon ravnopravne ovisnosti uzvodnog projekta samo je zastario. -2. **`deprecated prebuild-install@7.1.3`** — prijelazni pomoćni alat za dohvaćanje nativnih binarnih datoteka. Ne - koristi se za instalaciju fiksirane transportne poveznice `wreq-js` i ne znači da postavljanje transporta +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` suzbija samo `ERESOLVE` i obavijesti o ravnopravnim ovisnostima. Obavijesti o zastarjelosti ostaju vidljive jer dolaze iz prijelaznih paketa trećih strana; one ne znače da instalacija nije uspjela. + +Upozorenja dolaze iz zastarjelih raspona ravnopravnih ovisnosti u paketima trećih strana nad kojima OmniRoute nema kontrolu: + +1. **`marked-terminal` zahtijeva `marked >=1 <16`, pronađen je `marked@18`** — u praksi radi bez problema; uzvodni raspon ravnopravne ovisnosti samo je zastario. +2. **`deprecated prebuild-install@7.1.3`** — prijelazni pomoćni alat za dohvaćanje izvorne binarne datoteke. Ne + upotrebljava se za instalaciju prikvačene transportne poveznice `wreq-js` i ne znači da postavljanje transporta pružatelja web-kolačića nije uspjelo. -**Nije potrebna nikakva radnja** — upozorenja se ne mogu potpuno utišati bez stvaranja vlastitih izvedenica uzvodnih paketa. +**Nije potrebna nikakva radnja** — upozorenja nije moguće potpuno utišati bez račvanja uzvodnih paketa. --- diff --git a/docs/i18n/hr/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/hr/docs/providers/CURSOR-API-KEY-AND-CLI.md index c9cab56690ce..b802c84bfb68 100644 --- a/docs/i18n/hr/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/hr/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -6,33 +6,34 @@ Dva načina za postavljanje Cursora iza OmniRoutea bez IDE sesije: -1. **Pružatelj `cursor-api`** (kartica „Cursor API”, pseudonim `cua`): pružatelj s - API ključem koji čuva korisnički API ključ Cursora (`crsr_…`, generiran na - `https://cursor.com/dashboard/api`). Svaki OmniRoute klijent zatim pristupa - Cursor modelima putem `/v1/chat/completions` kao `cursor-api/` ili - `cua/`, uz uobičajene slojeve kvota, pričuvnog usmjeravanja i - zapisivanja. IDE pružatelj (`cursor`, OAuth/IDE sesija) ostaje nepromijenjen. +1. **Pružatelj `cursor-api`** (kartica „Cursor API”, alias `cua`): pružatelj + temeljen na API ključu koji čuva korisnički API ključ za Cursor (`crsr_…`, + generiran na `https://cursor.com/dashboard/api`). Svaki OmniRoute klijent + zatim pristupa Cursor modelima putem `/v1/chat/completions` kao + `cursor-api/` ili `cua/`, uz uobičajene slojeve za kvote, + pričuvno usmjeravanje i zapisivanje. IDE pružatelj (`cursor`, OAuth/IDE + sesija) ostaje nepromijenjen. 2. **Izravno prosljeđivanje Cursor CLI-ja**: usmjerite Cursor CLI (`agent`) na - OmniRoute kako bi svaki RPC koji CLI šalje bio autentificiran OmniRoute API - ključem, proslijeđen Cursoru s vjerodajnicom veze `cursor-api` i zabilježen - na stranici Zapisi. + OmniRoute kako bi svaki RPC koji CLI izvrši bio autentificiran OmniRoute API + ključem, proslijeđen Cursoru s vjerodajnicom veze `cursor-api` te zabilježen + na stranici zapisnika. ## Zašto se ključ razmjenjuje `api2.cursor.sh` odbija neobrađeni ključ `crsr_…` kao Bearer token (401). Cursor CLI najprije šalje ključ metodom POST na `/auth/exchange_user_api_key` i prima JWT sesije koji istječe nakon jednog sata; vraćeni `refreshToken` ima isti -`exp`, pa osvježavanje znači ponovnu razmjenu ključa. +`exp`, pa osvježavanje podrazumijeva ponovnu razmjenu ključa. `open-sse/services/cursorApiKeyAuth.ts` obavlja tu razmjenu, predmemorira jedan -token sesije po ključu, ponovno ga razmjenjuje pet minuta prije isteka i uklanja -predmemorirani token kada Cursor odgovori statusom 401. `CursorExecutor` ga -poziva neposredno prije otvaranja uzvodnog toka za veze `cursor-api`. +token sesije po ključu, ponovno ga razmjenjuje pet minuta prije isteka te +uklanja predmemorirani token kada Cursor odgovori statusom 401. `CursorExecutor` +ga poziva neposredno prije otvaranja uzvodnog toka za veze `cursor-api`. ## Pružatelj `cursor-api` Registar: `open-sse/config/providers/registry/cursor/index.ts` (`cursor_apiProvider`, `authType: "apikey"`, isti `format`, `baseUrl` i -`models` kao `cursor`). Kartica kataloga: +`models` kao za `cursor`). Kartica kataloga: `src/shared/constants/providers/apikey/specialty-media.ts`. Mapa izvršitelja: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). @@ -59,32 +60,45 @@ curl -sS http://localhost:20128/v1/chat/completions \ Napomene: - Popis modela za `cursor-api` dolazi iz statičkog registra Cursora (istog - popisa koji IDE pružatelj koristi kao rezervnu opciju); instalacija paketa - `cursor-agent` nije potrebna na OmniRoute hostu. + popisa koji IDE pružatelj koristi kao pričuvni); na OmniRoute poslužitelju + nije potrebna instalacija `cursor-agent`. - `POST /api/providers/{id}/refresh-cursor` namijenjen je samo IDE pružatelju - `cursor`; veze `cursor-api` nemaju IDE sesiju koju treba obnoviti. + `cursor`; veze `cursor-api` nemaju IDE sesiju koju bi trebalo obnoviti. -## Izravno prosljeđivanje Cursor CLI-ja +## Izvorni ID-jevi modela i razina napora + +Za `cursor` / `cu` i `cursor-api` / `cua` zajednički normalizator razine napora +za Claude ostavlja zatraženi ID modela nepromijenjenim. Cursor može oglašavati +sufiks poput `-low` kao dio stvarnog ID-ja modela, a ne kao OmniRoute alias +razine napora. Cursorov izvršitelj zadržava točno podudaranje s aktivnim +katalogom; kada nema podudaranja, postojeći razrješivač modela upravlja +pričuvnim pretvaranjem sufiksa u parametar. + +Ovo ne mijenja normalizaciju razine napora za izravne Claude, Claude-kompatibilne +ili Vertex rute. Dostupnost i dalje ovisi o katalogu i pravima odabranog Cursor +računa. + +## Prosljeđivanje za Cursor CLI Ruta: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`. Prefiks `/api/cursor-cli/` registriran je -u `src/shared/constants/publicApiRoutes.ts` jer obrađivač provodi vlastitu -autentifikaciju: +`open-sse/handlers/cursorCliProxy.ts`. Prefiks `/api/cursor-cli/` +registriran je u `src/shared/constants/publicApiRoutes.ts` jer rukovatelj +provodi vlastitu autentifikaciju: -| Putanja | Autentifikacija koju CLI očekuje | Što OmniRoute radi | -| ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Provjerava ključ, izdaje 1-satni HS256 JWT (potpisan s `JWT_SECRET`) i vraća ga | -| svaka druga putanja (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Provjerava izdavatelja/publiku/istek, odabire aktivnu vezu `cursor-api`, zamjenjuje zaglavlje Authorization razmijenjenim Cursor tokenom i šalje odgovor natrag kao tok | +| Put | Autentifikacija koju CLI očekuje | Što OmniRoute radi | +| ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Provjerava ključ, izdaje HS256 JWT s valjanošću od 1 h (potpisan s `JWT_SECRET`) i vraća ga | +| svaka druga putanja (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Provjerava izdavatelja/publiku/istek, odabire aktivnu vezu `cursor-api`, zamjenjuje zaglavlje Authorization razmijenjenim tokenom za Cursor i prosljeđuje odgovor kao tok natrag | -CLI dekodira `exp` iz bilo kojeg tokena koji primi, pa mu predaja neprozirnog -tokena uzrokuje ponovnu razmjenu prije gotovo svakog zahtjeva; izdani JWT to -izbjegava. Odgovor 401 iz OmniRoutea uzrokuje da CLI ponovno izvrši razmjenu. +CLI dekodira `exp` iz svakog primljenog tokena, pa bi mu predaja neprozirnog +tokena uzrokovala novu razmjenu prije gotovo svakog zahtjeva; izdani JWT to +sprječava. Odgovor 401 iz OmniRoutea navodi CLI na ponovnu razmjenu. ### Postavljanje 1. Izradite OmniRoute API ključ (Nadzorna ploča → API ključevi) i vezu `cursor-api`. -2. Naložite CLI-ju da za tok agenta koristi HTTP/1.1. U datoteci +2. Postavite CLI tako da koristi HTTP/1.1 za tok agenta. U datoteci `~/.cursor/cli-config.json`: ```json @@ -103,19 +117,19 @@ izbjegava. Odgovor 401 iz OmniRoutea uzrokuje da CLI ponovno izvrši razmjenu. agent -p --trust "Reply with exactly OK" ``` -Svaki korak završava u Zapisima s pružateljem `cursor-api`, vrstom zahtjeva -`cursor-cli` i putanjom `/api/cursor-cli/`, pripisan OmniRoute API ključu i +Svaki korak evidentira se u zapisnicima s pružateljem `cursor-api`, vrstom zahtjeva `cursor-cli`, +putanjom `/api/cursor-cli/` te se pripisuje OmniRoute API ključu i vezi koja ga je obradila. -### Načini neuspjeha +### Načini kvara | Situacija | Odgovor CLI-ju | | ------------------------------------------------- | ----------------------------------------------------- | | Nepoznat OmniRoute ključ i `REQUIRE_API_KEY=true` | 401 `unauthenticated` pri razmjeni | -| `REQUIRE_API_KEY=false` | anonimna sesija (odražava ponašanje `/v1/*`) | -| Istekao / strani / izmijenjen JWT sesije | 401, CLI ponovno obavlja razmjenu | +| `REQUIRE_API_KEY=false` | anonimna sesija (ponašanje kao za `/v1/*`) | +| Istekao / strani / izmijenjeni JWT sesije | 401, CLI ponovno obavlja razmjenu | | OmniRoute API ključ opozvan nakon razmjene | 401 pri sljedećem RPC-u | -| Nema aktivne veze s `cursor-api` | 503 `unavailable` | -| Cursor odbija ključ veze | 401 `unauthenticated`, predmemorirana sesija se briše | -| Uzvodna usluga nedostupna | 502 `unavailable` (sanitizirana poruka) | +| Nema aktivne veze `cursor-api` | 503 `unavailable` | +| Cursor odbije ključ veze | 401 `unauthenticated`, predmemorirana sesija se briše | +| Izvorni poslužitelj nije dostupan | 502 `unavailable` (sanitizirana poruka) | | `JWT_SECRET` nije postavljen | 503 pri razmjeni | diff --git a/docs/i18n/hr/docs/reference/API_REFERENCE.md b/docs/i18n/hr/docs/reference/API_REFERENCE.md index 83bd6467a8a2..becd574038ff 100644 --- a/docs/i18n/hr/docs/reference/API_REFERENCE.md +++ b/docs/i18n/hr/docs/reference/API_REFERENCE.md @@ -421,68 +421,92 @@ direktno importirati `open-sse/config/providerPluginManifestRegistry.ts`. --- -## Kompatibilni Endpointi - -| Metoda | Putanja | Format | -| ------ | ----------------------------------------- | ----------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (edit/inpaint) | -| POST | `/v1/videos/generations` | Generiranje videa u OpenAI stilu | -| POST | `/v1/music/generations` | Generiranje glazbe u OpenAI stilu | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (vraća audio tijelo) | -| POST | `/v1/rerank` | Rerank u stilu Cohere/Voyage | -| POST | `/v1/classify` | Jina klasifikacija (`api.jina.ai`) | -| POST | `/v1/segment` | Jina segmenter (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | OpenAI katalog alias | -| GET | `/api/v1/vscode/{token}/models` | OpenAI models alias | -| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokenizirani alias | -| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokenizirani alias | -| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenizirani alias | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama tags tokenizirani alias | - -Svi POST route-ovi slijede isti oblik: `Bearer your-api-key` + Zod-validirano JSON tijelo (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, itd., pogledajte `src/shared/validation/schemas.ts`). Kod neuspjeha validacije sheme vraća se 4xx. - -Za klijente koji ne mogu priložiti `Authorization: Bearer ...`, OmniRoute također prihvaća API ključeve u URL-u putem query-string kompatibilnosti (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) ili putem posebnih `/api/v1/vscode/{token}/...` endpointa opisanih u nastavku. +## Krajnje točke za kompatibilnost + +| Metoda | Putanja | Format | +| ------ | ----------------------------------------- | ----------------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (uređivanje/inpaint) | +| POST | `/v1/videos/generations` | Generiranje videozapisa u stilu OpenAI-ja | +| POST | `/v1/music/generations` | Generiranje glazbe u stilu OpenAI-ja | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (vraća tijelo sa zvukom) | +| POST | `/v1/rerank` | Ponovno rangiranje u stilu Cohere/Voyage | +| POST | `/v1/classify` | Jina klasifikacija (`api.jina.ai`) | +| POST | `/v1/segment` | Jina segmentator (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | Alias OpenAI kataloga | +| GET | `/api/v1/vscode/{token}/models` | Alias OpenAI modela | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI alias s tokenom | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses alias s tokenom | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama alias s tokenom | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama alias oznaka s tokenom | + +Sve POST rute imaju isti oblik: `Bearer your-api-key` + JSON tijelo provjereno pomoću Zoda (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` itd.; pogledajte `src/shared/validation/schemas.ts`). U slučaju neuspješne provjere sheme vraća se 4xx. + +Za klijente koji ne mogu priložiti `Authorization: Bearer ...`, OmniRoute također prihvaća API ključeve u URL-u, bilo putem kompatibilnih parametara niza upita (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) ili namjenskih krajnjih točaka `/api/v1/vscode/{token}/...` dokumentiranih u nastavku. ```bash -# Rerank +# Ponovno rangiranje (pružatelj iz registra u oblaku ili čvor pružatelja kompatibilan s OpenAI-jem kao "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina klasifikacija (Foundation API vjerodajnice) +# Jina klasifikacija (vjerodajnice za Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Jina segmenter +# Jina segmentator POST /v1/segment { "content": "...", "return_chunks": true } -# Jina search (s.jina.ai; aliasi providera: jina-search, jina-ai, jina) +# Jina pretraživanje (s.jina.ai; aliasi pružatelja: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Moderacije +# Moderiranje POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — vraća tijelo tipa audio/mpeg (ili traženog formata) +# TTS — vraća tijelo audio/mpeg (ili traženog formata) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Uređivanje slike (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Generiranje videa / glazbe (ID modela s prefiksom providera) +# Generiranje videozapisa/glazbe (ID modela s prefiksom pružatelja) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Namjenske Provider Rute +> **Čvorovi pružatelja za ponovno rangiranje:** `POST /v1/rerank` također usmjerava zahtjeve prema čvorovima pružatelja +> kompatibilnima s OpenAI-jem (oMLX, vLLM, Infinity, TEI iza pristupnika, …), adresiranima kao +> `/`. Čvorovi povratne petlje (`localhost`, `127.0.0.1`, `172.16.0.0/12`) uvijek +> ispunjavaju uvjete. Čvorovi na bilo kojem drugom hostu — uređaju na LAN-u ili Tailscale ravnopravnom članu — +> ispunjavaju uvjete samo kada operater omogući zastavicu značajke `RERANK_REMOTE_PROVIDER_NODES` **i** osnovni +> URL čvora zadovoljava pravila za izlazne URL-ove pružatelja (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / +> `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); zahtjevi se nikada ne usmjeravaju prema hostovima metapodataka +> u oblaku. Korak ponovnog rangiranja mehanizma memorije poziva ovu rutu preko povratne petlje, pa isto pravilo +> upravlja postavkom `rerankProviderModel` u postavkama memorije. +> +> **Oblici lokalnog poslužitelja:** čvor se poziva na `/v1/rerank`, a u slučaju odgovora 404 na +> `/rerank` (Infinity, TEI). Tijelo zahtjeva prema nadređenom poslužitelju sadrži i način zapisa +> Cohere/OpenAI (`documents`, `return_documents`) i način zapisa TEI (`texts`, `return_text`), a odgovor +> nadređenog poslužitelja normalizira se u Cohere omotnicu: TEI-jev izravni `[{index, score, text}]`, +> `{results: [{index, score}]}` iz jednostavnih pristupnika i Voyageov oblik `{data: [...]}` vraćaju se +> klijentu kao `{results: [{index, relevance_score, document?}]}`, poredani prema rezultatu i ograničeni +> vrijednošću `top_n`. + +> **Otkrivanje čvorova pružatelja:** modeli na čvoru pružatelja kompatibilnom s OpenAI-jem pojavljuju se u +> `GET /v1/models` pod prefiksom čvora. Redci koji ne sadrže metapodatke o krajnjoj točki (što je uobičajeno +> za lokalne popise `/v1/models`) nasljeđuju `apiType` čvora, pa modeli čvora `embeddings` imaju +> `type: "embedding"`, a modeli čvora `rerank` imaju `type: "rerank"` umjesto zadane vrste razgovora; +> eksplicitni `supportedEndpoints` u sinkroniziranom ili ručno dodanom retku i dalje ima prednost. + +### Namjenske rute pružatelja ```bash POST /v1/providers/{provider}/chat/completions @@ -490,7 +514,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Prefiks providera automatski se dodaje ako nedostaje. Neusklađeni modeli vraćaju `400`. +Prefiks pružatelja automatski se dodaje ako nedostaje. Nepodudarni modeli vraćaju `400`. --- diff --git a/docs/i18n/hr/docs/reference/FEATURE_FLAGS.md b/docs/i18n/hr/docs/reference/FEATURE_FLAGS.md index 200aa52631df..ddacfc5e3aff 100644 --- a/docs/i18n/hr/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/hr/docs/reference/FEATURE_FLAGS.md @@ -44,149 +44,151 @@ Booleova zastavica smatra se **omogućenom** kada je njezina efektivna vrijednos ## Katalog zastavica -72 zastavice u 6 kategorija. **Zadano** je zadana vrijednost definicije — vrijednost -koja se koristi kada nisu prisutni ni nadjačavanje iz baze podataka ni varijabla okruženja. +74 zastavice u 6 kategorija. **Zadana vrijednost** jest zadana vrijednost definicije — vrijednost +koja se upotrebljava kada nije prisutno ni nadjačavanje iz baze podataka ni varijabla okruženja. ### Sigurnost (10) -| Ključ | Vrsta | Zadano | Opis | -| --------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | boolean | `false` | Zahtijevaj API ključ za sve dolazne zahtjeve. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Omogući sanitizaciju ulaznih podataka za sve zahtjeve. | -| `INJECTION_GUARD_MODE` | enum | `off` | Način zaštite od ubrizgavanja u upite. Vrijednosti: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Redigiraj osobne podatke iz zahtjeva (neovisno o `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Sanitiziraj osobne podatke iz odgovora pružatelja usluga. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Način sanitizacije osobnih podataka u odgovorima. Vrijednosti: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Blokiraj odlazne zahtjeve prema privatnim/internim rasponima IP adresa. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Dopusti autentificiranim korisnicima nadzorne ploče prikaz pohranjenih API ključeva umjesto prikaza samo maskiranih vrijednosti. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Uključi prefiks računa u retke AUTH zapisnika (npr. "Upotrebljava se račun pružatelja : abc12345..."). Zadano je onemogućeno kako bi identifikatori računa bili redigirani iz dijeljenih/višekorisničkih zapisnika procesa. Neovisno je o načinu otklanjanja pogrešaka; njegovo uključivanje neće ih otkriti. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Kada je OIDC omogućen, onemogući prijavu lozinkom kako bi se korisnici mogli autentificirati samo putem OIDC jedinstvene prijave. Kada je onemogućeno (zadano), dostupne su i prijava lozinkom i OIDC. | - -### Mreža (15) - -| Ključ | Vrsta | Zadano | Ponovno pokretanje | Opis | -| ----------------------------------------------- | ------- | ------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Omogući prikriveni način rada TLS otiska. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Dopusti rutama /v1/audio/* upotrebu čvorova pružatelja kompatibilnih s OpenAI-jem koji se nalaze izvan localhosta. Zadano je isključeno — usmjeravanje zvuka prema udaljenom glavnom računalu mijenja izlazni identitet i mora biti izričita odluka operatera. Čvorovi povratne petlje uvijek su dopušteni i ova ih postavka ne obuhvaća. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Kada vezi nije dodijeljen proxy, automatski odaberi prvi funkcionalni proxy iz registra. Zadano je isključeno (u suprotnom svaki proxy iz registra postaje globalna pričuvna opcija — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Dopusti tijekovima OAuth-a i provjere valjanosti pružatelja da zaobiđu prikvačeni proxy i izravno se povežu kada prethodne provjere dostupnosti proxyja ne uspiju. Zadano je isključeno jer to može promijeniti izlaznu IP adresu. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | U slučaju mrežne iznimke (istek vremena, veza odbijena/ponovno postavljena) u izvršitelju rotacije s više računa, kada račun na kojem je došlo do pogreške nema namjenski proxy, primijeni kratko razdoblje hlađenja i preskoči druge račune bez proxyja tijekom ostatka zahtjeva umjesto ponovnog pokušaja sa svakim od njih. Zadano je uključeno (sigurno: nema promjene izlazne IP adrese, samo se smanjuje rizik od latencije/razdoblja hlađenja za račune sa zajedničkim izlazom). Onemogućite za vraćanje trenutačnog prosljeđivanja prve iznimke računa bez proxyja. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Skupovi proxyja i rotacija po računu u opencodeu prestaju ponovno posluživati proxy koji je upravo zakazao (odbijena TCP provjera ili odgovor 429 primljen preko njega) tijekom razdoblja po procesu koje se udvostručuje pri svakom ponavljanju, do gornje granice. Status proxyja se ne zapisuje; kada su svi kandidati izuzeti, odabir ostaje nepromijenjen. Zadano je isključeno. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Na nadzornoj ploči, ispod skupa proxyja, prikaži koliko je opaženih izlaznih IP adresa posluživalo njegove članove tijekom posljednja 24 h i koliko ih je veza upotrebljavalo. Samo za čitanje, izračunava se iz zapisnika proxyja i nikada se ne upotrebljava za usmjeravanje. Zadano je isključeno. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Za izvršitelj OpenCode pratite prvi bajt tijela strujanog odgovora Responses (prozor: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, zadano `15000`). Strujanje Responses sa statusom 2xx koje ostane bez podataka nakon isteka prozora smatra se zastojem: račun ulazi u razdoblje hlađenja, a zahtjev se jednom preusmjerava na sljedeći račun; drugi zastoj odmah završava neuspjehom. Zadano je isključeno: strujanja u zastoju nastavljaju čekati kao i danas, sve do isteka vremena pripravnosti strujanja. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Izvršitelj OpenCode: pri odgovoru 403/451 koji sadrži odbijanje `user_blocked` (nije povezano s geografskom lokacijom niti s Cloudflareovim odbijanjem otiska), za odbijeni račun aktiviraj razdoblje hlađenja i rotiraj na sljedeći račun najviše jednom po zahtjevu; drugo odbijanje vraća se neizmijenjeno, bez oznake uspjeha. Zadano je isključeno: zaobilaženje blokade korisnika kod nadređenog sustava može izgledati kao izbjegavanje i proširiti oznaku na cijelu flotu. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode rotacija: nakon dva uzastopna prolazna kvara nadređenog poslužitelja (5xx ili prazan 400), pričekajte prije sljedećeg računa — 1,5 s uz udvostručavanje za svaki daljnji kvar, s najviše 6 s po stanci i 10 s po zahtjevu; preskače se ako klijent prekine vezu; neuspjelo tijelo odgovora oslobađa se prije čekanja. Zadano je isključeno: prebacivanje u slučaju kvara ostaje trenutačno. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode rotacija: zaustavite niz računa pri prvom odgovoru 429 klasificiranom kao stvarno ograničenje brzine (raščlanjiv `Retry-After` ili tijelo koje navodi ograničenje brzine/upotrebe) i vratite taj odgovor 429 nadređenog poslužitelja nepromijenjen. Kod neklasificiranih odgovora 429 rotacija se nastavlja. Zadano je isključeno: besplatna razina ograničena je po izlaznoj IP adresi (#9611), pa svaki odgovor 429 pokreće rotaciju, a iscrpljeni niz vraća posljednji odgovor 429 nadređenog poslužitelja. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Onemogućite provjeru TLS certifikata za MITM proxy. **Opasno.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Dopustite URL-ove pružatelja koji upućuju na privatne/interne mreže. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Dopustite dodavanje/provjeru pružatelja na lokalnim/privatnim adresama (127.0.0.1, localhost, LAN). Zadano je uključeno (lokalno kao prioritet); onemogućite za strogo blokiranje svega osim javnih adresa. Metapodaci oblaka ostaju blokirani. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Omogućite način rada pružatelja kompatibilan s Claude Codeom. | +| Ključ | Vrsta | Zadana vrijednost | Opis | +| --------------------------------------- | ----------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | Booleova | `false` | Zahtijevaj API ključ za sve dolazne zahtjeve. | +| `INPUT_SANITIZER_ENABLED` | Booleova | `true` | Omogući sanitizaciju ulaznih podataka za sve zahtjeve. | +| `INJECTION_GUARD_MODE` | enumeracija | `off` | Način zaštite od umetanja u upite. Vrijednosti: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | Booleova | `false` | Redigiraj osobne podatke iz zahtjeva (neovisno o `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | Booleova | `false` | Sanitiziraj osobne podatke iz odgovora pružatelja usluge. | +| `PII_RESPONSE_SANITIZATION_MODE` | enumeracija | `redact` | Način sanitizacije osobnih podataka u odgovorima. Vrijednosti: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | Booleova | `true` | Blokiraj odlazne zahtjeve prema privatnim/internim rasponima IP adresa. | +| `ALLOW_API_KEY_REVEAL` | Booleova | `false` | Dopusti autentificiranim korisnicima nadzorne ploče otkrivanje pohranjenih API ključeva umjesto prikaza samo maskiranih vrijednosti. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | Booleova | `false` | Uključi prefiks računa u retke zapisnika AUTH (npr. „Upotrebljava se račun pružatelja : abc12345...”). Prema zadanim je postavkama onemogućeno kako bi identifikatori računa bili redigirani iz dijeljenih/višekorisničkih zapisnika procesa. Neovisno o načinu otklanjanja pogrešaka; njegovo uključivanje neće ih otkriti. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | Booleova | `false` | Kada je OIDC omogućen, onemogući prijavu lozinkom kako bi se korisnici mogli autentificirati samo putem OIDC jedinstvene prijave. Kada je onemogućeno (zadano), dostupne su i prijava lozinkom i OIDC. | + +### Mreža (16) + +| Ključ | Vrsta | Zadano | Ponovno pokretanje | Opis | +| ----------------------------------------------- | ------- | ------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Omogućuje prikriveni način rada TLS otiska. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Omogućuje rutama /v1/audio/* upotrebu čvorova pružatelja kompatibilnih s OpenAI-jem koji se nalaze izvan localhosta. Zadano je isključeno — usmjeravanje zvuka prema udaljenom hostu mijenja izlazni identitet i mora biti izričita odluka operatora. Čvorovi povratne petlje uvijek su dopušteni i na njih ova postavka ne utječe. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Omogućuje zahtjevu POST /v1/rerank (i koraku ponovnog rangiranja putem povratne petlje memorijskog mehanizma) upotrebu čvorova pružatelja kompatibilnih s OpenAI-jem koji se nalaze izvan localhosta. Zadano je isključeno — usmjeravanje prema udaljenom hostu mijenja izlazni identitet i mora biti izričita odluka operatora. Čvorovi povratne petlje uvijek su dopušteni; udaljeni čvorovi također moraju zadovoljiti pravila pružatelja za izlazne URL-ove. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Kada vezi nije dodijeljen proxy, automatski odabire prvi funkcionalni proxy iz registra. Zadano je isključeno (u suprotnom svaki proxy iz registra postaje globalna pričuvna opcija — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Omogućuje tijekovima provjere OAutha i pružatelja da zaobiđu prikvačeni proxy i izravno se povežu kada prethodne provjere dostupnosti proxyja ne uspiju. Zadano je isključeno jer to može promijeniti izlaznu IP adresu. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Pri mrežnoj iznimci (istek vremena, odbijena/prekinuta veza) u izvršitelju rotacije s više računa, kada račun na kojem je došlo do pogreške nema namjenski proxy, primjenjuje kratko razdoblje mirovanja i preskače druge račune bez proxyja do kraja zahtjeva umjesto ponovnog pokušaja za svaki od njih. Zadano je uključeno (sigurno: nema promjene izlazne IP adrese, samo se smanjuje rizik od kašnjenja/mirovanja za račune sa zajedničkim izlazom). Isključite kako biste vratili trenutačno prosljeđivanje prve iznimke računa bez proxyja. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Skupovi proxyja i rotacija opencodea po računu prestaju ponovno posluživati proxy koji upravo nije uspio (odbijena TCP provjera ili odgovor 429 primljen putem njega) tijekom razdoblja po procesu koje se udvostručuje pri svakom ponavljanju, do gornje granice. Status proxyja ne zapisuje se; kada su svi kandidati izdvojeni, odabir ostaje nepromijenjen. Zadano je isključeno. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Na nadzornoj ploči, ispod skupa proxyja, prikazuje koliko je opaženih izlaznih IP adresa posluživala njegove članove tijekom posljednja 24 h i koliko ih je veza upotrebljavalo. Samo za čitanje, izračunava se iz zapisnika proxyja i nikada se ne upotrebljava za usmjeravanje. Zadano je isključeno. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Za izvršitelj OpenCode prati prvi bajt tijela strujanog odgovora Responses (prozor: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, zadano `15000`). Tok Responses sa statusom 2xx koji ostane bez podataka nakon isteka prozora smatra se zastojem: račun se stavlja u mirovanje, a zahtjev se jednom preusmjerava na sljedeći račun; drugi zastoj odmah uzrokuje neuspjeh. Zadano je isključeno: tokovi u zastoju zadržavaju trenutačno čekanje do isteka vremena za spremnost toka. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode izvršitelj: pri odgovoru 403/451 koji sadrži odbijanje `user_blocked` (nije geografsko ograničenje niti odbijanje zbog Cloudflare otiska), privremeno obustavi korištenje odbijenog računa i prebaci se na sljedeći račun najviše jednom po zahtjevu; drugo odbijanje vraća se neizmijenjeno, bez oznake uspjeha. Prema zadanim postavkama isključeno: zaobilaženje blokade korisnika na nadređenom sustavu može izgledati kao izbjegavanje ograničenja i proširiti oznaku na cijelu flotu. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode rotacija: nakon dva uzastopna privremena kvara nadređenog sustava (5xx ili prazan 400), pričekaj prije prelaska na sljedeći račun — 1,5 s, uz udvostručavanje za svaki sljedeći kvar, ograničeno na 6 s po čekanju i 10 s po zahtjevu; preskače se ako klijent prekine vezu, a tijelo neuspjelog odgovora oslobađa se prije čekanja. Prema zadanim postavkama isključeno: prebacivanje u slučaju kvara ostaje trenutačno. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode rotacija: zaustavi niz računa pri prvom odgovoru 429 klasificiranom kao stvarno ograničenje brzine (raščlanjiv `Retry-After` ili tijelo koje navodi ograničenje brzine/upotrebe) i vrati taj nadređeni odgovor 429 neizmijenjen. Neklasificirani odgovori 429 nastavljaju rotaciju. Prema zadanim postavkama isključeno: besplatna razina ograničena je po izlaznoj IP adresi (#9611), pa svaki 429 pokreće rotaciju, a iscrpljeni niz vraća posljednji nadređeni odgovor 429. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Onemogući provjeru TLS certifikata za MITM proxy. **Opasno.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Dopusti URL-ove pružatelja koji upućuju na privatne/interne mreže. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Dopusti dodavanje/provjeru pružatelja na lokalnim/privatnim adresama (127.0.0.1, localhost, LAN). Prema zadanim postavkama uključeno (lokalno kao prioritet); onemogućite za strogo blokiranje svega osim javnih adresa. Metapodaci u oblaku ostaju blokirani. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Omogući način rada pružatelja kompatibilan s Claude Codeom. | ### Pravila (5) -| Ključ | Vrsta | Zadano | Opis | -| ------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Način provođenja pravila upotrebe alata. Vrijednosti: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Automatski omogućite ograničavanje brzine na temelju obrazaca upotrebe. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Preskočite OmniRouteovu lokalnu provjeru kontekstnog prozora / najvećeg broja ulaznih tokena za izravne zahtjeve prema jednom modelu. Ograničenja nadređenog sustava i dalje vrijede. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Odbijte zahtjeve prije slanja kada ciljni model nema potrebne mogućnosti (vid, alate, strukturirani izlaz, kontekstni prozor). Štiti izravne zahtjeve prema jednom pružatelju koji zaobilaze filtar kompatibilnosti kombiniranog sloja. | -| `RADAR_ENABLED` | boolean | `false` | Omogućite modul OmniRoute Radar (zasloni kataloškog sažetka sadržaja i sinkronizacije). Zadano je isključen; omogućavanje samo otključava korisničko sučelje — sinkronizacija podataka i dalje zahtijeva zasebnu suglasnost. | - -### Izvršavanje (32) - -| Ključ | Vrsta | Zadano | Ponovno pokretanje | Opis | -| ------------------------------------------- | ------- | ------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | logička | `true` | | Generira i umeće sažetke razgovora kada kombinirano usmjeravanje prebacuje modele. Onemogućite kako bi se prebacivanja modela obrađivala neovisno i spriječili pozadinski zahtjevi za prijenos konteksta za sve postojeće i buduće kombinacije. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | logička | `true` | | Uklanja interne izlazne stavke faze komentara iz izravno proslijeđenih tokova Responses API-ja prije prosljeđivanja klijentima. Onemogućite za primanje neobrađenih komentara uzlaznog poslužitelja. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | logička | `true` | | Primjenjuje ograničenja opsega na pristup MCP alatima. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | logička | `false` | | Sažima opise MCP alata kako bi se smanjila upotreba tokena. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | logička | `false` | | Omogućuje obradu pozadinskih zadataka tijekom izvođenja. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | logička | `false` | ✓ | Onemogućuje sve pozadinske usluge (osvježavanje kvote, sinkronizaciju itd.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | logička | `false` | | Vjeruje RTK filtrima na razini projekta bez provjere valjanosti. | -| `OMNIROUTE_ENABLE_LIVE_WS` | logička | `true` | ✓ | Pokreće WebSocket poslužitelj nadzorne ploče u stvarnom vremenu pri uvozu (zadano na priključku 20132). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Dopusti Codexu upotrebu transporta Responses putem WebSocketa. Kada je isključeno, Codex se vraća na HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Dopusti Codexu upotrebu lokalnog app-server WebSocket JSON-RPC transporta (codexTransport=app-server). Kada je isključeno, veze konfigurirane za app-server vraćaju se na druge Codexove transporte. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Preusmjeri zahtjeve s iscrpljenim budžetom na rezervnog besplatnog pružatelja/model za hitne slučajeve. (Pogledajte [Rezervnu opciju za hitne slučajeve pri iscrpljenom budžetu](#emergency-budget-fallback) u nastavku.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Omogući transparentan rani ponovni pokušaj za prekinute uzvodne SSE tokove prije nego što bilo koji bajt odgovora stigne do klijenta. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Dopusti oporavku toka da ponovno pošalje zahtjev i spoji odgovor nakon što su bajtovi već stigli do klijenta. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Učini nastavak usred toka sigurnim za pozive alata: nikada nemoj nastaviti prekinuti tok nakon što je emitiran poziv alata (u tijeku ili već završen uz finish_reason tool_calls) te zatvori nakon jednog praznog nastavka umjesto trošenja cijelog budžeta. Isključeno: ponašanje iz izdanja. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Jednom se prebaci na povezanu vezu kada se SSE tok zatvori prije emitiranja bilo kojeg korisnog okvira i kada je iscrpljen ograničeni ponovni pokušaj na istoj vezi; ako nema upotrebljive povezane veze, vraća se izvorna pogreška `STREAM_EARLY_EOF` 502. Zadano je isključeno: rani EOF ostaje konačan nakon ponovnog pokušaja na istoj vezi. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Uključi polja s nazivima prikladnima za prikaz u odgovorima `/v1/models`. Onemogući za klijente koji očekuju samo ID-ove modela. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Određuje način dodavanja prefiksa ID-ovima modela u /v1/models. 'dual' (zadano) emitira i prefikse pseudonima i prefikse kanonskog ID-a pružatelja radi kompatibilnosti sa starijim verzijama. 'alias' emitira samo kratki prefiks pseudonima (npr. ds-web/model, a ne deepseek-web/model). 'canonical' emitira samo puni prefiks ID-a pružatelja. Vrijednosti: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Omogući periodičnu sinkronizaciju ELO ljestvice Arena AI za rangiranje inteligencije modela. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Oglašava zrcalne ID-ove `claude//` na `/v1/models` kako bi otkrivanje modela pristupnika Claude Code prikazivalo modele koji nisu Claude. Globalna razina trostupanjskog mehanizma (varijabla okruženja ima prednost pred nadjačavanjem na nadzornoj ploči). Pogledajte [konfiguraciju za Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Glavni prekidač za pseudonime pristupnika no-think//. Uključeno (zadano): /v1/models oglašava varijantu bez razmišljanja za svaki prihvatljivi Claude model koji podržava razmišljanje, a ID no-think/ poslan u zahtjevu razrješava se natrag na stvarni model uz potisnuto zaključivanje. Isključeno: ne oglašavaju se nikakve varijante, a ID no-think/ tretira se kao bilo koji drugi nepoznati ID modela. Uključivanje/isključivanje putem ModelSpec.noThinkingAlias za pojedinačni model i dalje se primjenjuje dok je ovo uključeno. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Onemogućuje generiranje varijanti razina razmišljanja (npr. -low, -medium, -high) u katalogu /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Omogućuje prilagodljive virtualne trake za kontrolu prihvata po zakupcu pri slanju pružatelju usluge (#9654): nagli porast prometa jednog zakupca više ne uzrokuje pogrešku 503 drugome. Varijabla okruženja OMNIROUTE_CHAT_VIRTUAL_LANES ima prednost pred ovim nadjačavanjem na nadzornoj ploči; promjene stupaju na snagu nakon ponovnog pokretanja poslužitelja. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Oglašava zrcalne ID-ove / na /v1/models za modele čiji kanonski vlasnik nema aktivne vjerodajnice, ali ih usmjerava prolazni pristupnik s aktivnim vjerodajnicama. Upozorenje: kada je globalno omogućeno, dodaje stavke kataloga za sve klijente. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Omogućuje otkrivanje stanja za čvorove kompatibilne s agregatorima New-API / One-API / Sub2API. Kada je omogućeno, kompatibilni čvorovi s postavljenom oznakom agregatora prikazivat će svoje stanje na nadzornoj ploči i pri provjeri kvote prije usmjeravanja. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Nastavlja nestrujne pozive alata kojima upravlja poslužitelj sve dok model ne vrati odgovor koji klijent može upotrijebiti. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Statistika pretraživanja i nedavna pretraživanja obuhvaćaju samo pružatelje koji još uvijek imaju aktivnu vezu (pružatelji bez ključa, kao što je duckduckgo-free, uvijek se ubrajaju). Kada je isključeno, zadržava se svaki pohranjeni redak pretraživanja s ID-om pružatelja. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Stranice pružatelja na nadzornoj ploči: prikazuje oznaku Besplatno samo na temelju signala koje pružatelj poštuje — izostavlja heuristiku naziva za prikaz, ne-logička besplatna polja i sufikse :free za registrirane pružatelje bez dokumentirane besplatne razine. Kada je isključeno, zadržava se povijesno pravilo za oznaku. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | U agregiranim odgovorima o nedostupnosti 429/503 izostavlja `Retry-After` kada nije poznato konkretno buduće vrijeme ponovnog pokušaja (umjesto sintetičke 1 s), dodaje `error.retry_after_provenance` (`signal` \| `none`) i omogućuje kombiniranim putovima pražnjenja čitanje tekstualnih naznaka o ponovnom pokušaju iz JSON-a i tijela odgovora nadređenog sustava u obliku običnog teksta. Polje se pojavljuje samo u odgovorima koje izradi `unavailableResponse()`; ostala tijela odgovora 429/503 ostaju nepromijenjena. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Kada cilj kombinacije `priority`, označen kao rezervni samo u slučaju iscrpljenja kvote, zaustavi kombinaciju zbog uzroka koji dokazivo nije kvota (otvoren prekidač strujnog kruga pružatelja usluge, preskakanje zbog predviđene latencije), odgovori statusom 502 umjesto statusom 503 koji upućuje na kvotu. Zaustavljanja zbog zaključavanja, razdoblja hlađenja, nedostupnosti, iscrpljenja i ograničenja istodobnosti i dalje vraćaju 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Osnovni Mistralov odgovor 401 (`{"detail":"Unauthorized"}`, bez izričitog signala autentifikacije) jednak je i za opozvani ključ i za iscrpljenu kvotu. Kada je uključeno, veza se stavlja u razdoblje hlađenja umjesto da se parkira kao `expired`, najviše 3 puta na sat po vezi; sljedeći put veza se parkira, pa opozvani ključ ipak naposljetku dospijeva u to stanje. Prema zadanim postavkama isključeno: svaki osnovni Mistralov odgovor 401 parkira vezu kao i prije. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Dohvati aktualni katalog modela xAI za veze `xai-oauth` s adrese `https://api.x.ai/v1/models` koristeći OAuth nositeljski token, umjesto zamrznutog statičkog početnog skupa. Prema zadanim postavkama isključeno: `xai-oauth` nastavlja posluživati nepromijenjeni statički početni skup. Pri bilo kojoj pogrešci razrješavanja otkrivanje se vraća na početni skup (nije provjereno prihvaća li x.ai OAuth nositeljski token na ovoj krajnjoj točki). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Omogući da automatsko čišćenje izbriše završene (dovršene/neuspjele/otkazane/istekle) zadatke Batch API-ja starije od `OMNIROUTE_BATCH_RETENTION_DAYS`, zajedno s njihovim kontrolnim točkama za svaki redak, te izbriše BLOB sadržaj prenesenih datoteka nakon njihova vlastitog vremena `expires_at`. Prema zadanim postavkama isključeno: svaka postojeća instalacija zadržava te podatke potpuno jednako kao i prije sve dok operater ne uključi ovu mogućnost. To ni na koji način ne utječe na rutu `DELETE /api/v1/batches/delete-completed` koju pokreće operater — ona je zaseban, bezuvjetan ugovor javnog API-ja. | +| Ključ | Vrsta | Zadano | Opis | +| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TOOL_POLICY_MODE` | enum | `disabled` | Način provedbe pravila upotrebe alata. Vrijednosti: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Automatski omogući ograničavanje brzine na temelju obrazaca upotrebe. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Preskoči OmniRouteovu lokalnu provjeru kontekstnog prozora / maksimalnog broja ulaznih tokena za izravne zahtjeve prema jednom modelu. Ograničenja nadređenog sustava i dalje se primjenjuju. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Odbij zahtjeve prije slanja kada ciljni model nema potrebne mogućnosti (vid, alati, strukturirani izlaz, kontekstni prozor). Štiti izravne zahtjeve prema jednom pružatelju koji zaobilaze filtar kompatibilnosti kombinacijskog sloja. | +| `RADAR_ENABLED` | boolean | `false` | Omogući modul OmniRoute Radar (zasloni sa sažetkom kataloga i sinkronizacija). Prema zadanim postavkama isključeno; omogućavanje samo otključava korisničko sučelje — sinkronizacija podataka ostaje zasebna opcija koju treba izričito uključiti. | + +### Izvršavanje (33) + +| Ključ | Tip | Zadano | Ponovno pokretanje | Opis | +| ------------------------------------------- | ------- | ------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Generiraj i umetni sažetke razgovora kada kombinirano usmjeravanje promijeni modele. Onemogućite kako bi se promjene modela obrađivale neovisno i kako bi se spriječili pozadinski zahtjevi za prijenos konteksta za sve postojeće i buduće kombinacije. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Ukloni interne izlazne stavke iz faze komentara iz prolaznih tokova Responses API-ja prije prosljeđivanja klijentima. Onemogućite za primanje neobrađenih komentara iz nadređenog izvora. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Primijeni ograničenja opsega na pristup MCP alatima. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Komprimiraj opise MCP alata radi smanjenja potrošnje tokena. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Omogući pozadinsku obradu zadataka tijekom izvođenja. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Onemogući sve pozadinske usluge (osvježavanje kvote, sinkronizaciju itd.). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Vjeruj RTK filtrima na razini projekta bez provjere valjanosti. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Pokreni WebSocket poslužitelj nadzorne ploče u stvarnom vremenu pri uvozu (zadano na portu 20132). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Dopusti Codexu upotrebu prijenosa Responses-over-WebSocket. Kada je isključeno, Codex se vraća na HTTP Responses. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Dopusti Codexu upotrebu lokalnog WebSocket JSON-RPC prijenosa poslužitelja aplikacije (codexTransport=app-server). Kada je isključeno, veze postavljene za upotrebu poslužitelja aplikacije vraćaju se na druge Codexove prijenose. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Preusmjeri zahtjeve s iscrpljenim proračunom na pružatelja/model za besplatni povrat u nuždi. (Pogledajte [Povrat u nuždi zbog iscrpljenog proračuna](#emergency-budget-fallback) u nastavku.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Omogući transparentni rani ponovni pokušaj za skraćene uzvodne SSE tokove prije nego što bilo koji bajt odgovora stigne do klijenta. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Dopusti oporavku toka da ponovno pošalje zahtjev i spoji odgovor nakon što su bajtovi već stigli do klijenta. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Učini nastavak usred toka sigurnim za pozive alata: nikad ne nastavljaj prekinuti tok nakon što je poziv alata poslan (u tijeku ili već dovršen uz finish_reason tool_calls) i zatvori ga nakon jednog praznog nastavka umjesto trošenja cijelog proračuna. Isključeno: ponašanje izdanja. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Jednom se prebacuje na srodnu vezu kada se SSE tok zatvori prije slanja bilo kojeg korisnog okvira i kada se iscrpi ograničeni broj ponovnih pokušaja na istoj vezi; ako nema upotrebljive srodne veze, vraća se izvorna pogreška `STREAM_EARLY_EOF` 502. Prema zadanim postavkama isključeno: rani EOF ostaje konačan nakon ponovnog pokušaja na istoj vezi. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Uključuje polja s prikaznim nazivima u odgovorima `/v1/models`. Isključite za klijente koji očekuju samo ID-ove modela. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Određuje način dodavanja prefiksa ID-ovima modela u /v1/models. 'dual' (zadano) emitira i pseudonimne i kanonske prefikse ID-a pružatelja radi kompatibilnosti s prethodnim verzijama. 'alias' emitira samo kratki pseudonimni prefiks (npr. ds-web/model, a ne deepseek-web/model). 'canonical' emitira samo puni prefiks ID-a pružatelja. Vrijednosti: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Omogućuje periodičnu sinkronizaciju ELO ljestvice Arena AI za rangiranje inteligencije modela. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Oglašava zrcalne ID-ove `claude//` na `/v1/models` kako bi otkrivanje modela pristupnika Claude Code prikazivalo modele koji nisu Claude. Globalna razina trostupanjske kontrole (varijabla okruženja ima prednost pred postavkom nadjačavanja na nadzornoj ploči). Pogledajte [konfiguraciju za Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Glavni prekidač za pseudonime pristupnika no-think//. Uključeno (zadano): /v1/models oglašava varijantu bez razmišljanja za svaki prihvatljivi Claude model koji podržava razmišljanje, a ID no-think/ poslan u zahtjevu razrješava se natrag na stvarni model uz potisnuto zaključivanje. Isključeno: ne oglašavaju se varijante, a ID no-think/ tretira se kao bilo koji drugi nepoznati ID modela. Uključivanje/isključivanje za pojedinačni model putem ModelSpec.noThinkingAlias i dalje se primjenjuje dok je ova opcija uključena. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Onemogućuje generiranje varijanti razine razmišljanja (npr. -low, -medium, -high) u katalogu /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Omogućuje prilagodljive virtualne pristupne trake po zakupcu za otpremu pružatelju (#9654): nagli porast prometa jednog zakupca više ne uzrokuje pogrešku 503 drugom zakupcu. Varijabla okruženja OMNIROUTE_CHAT_VIRTUAL_LANES ima prednost pred ovom postavkom nadjačavanja na nadzornoj ploči; promjene stupaju na snagu nakon ponovnog pokretanja poslužitelja. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Oglašava zrcalne ID-ove / na /v1/models za modele čiji kanonski vlasnik nema aktivnu vjerodajnicu, ali ih usmjerava prolazni pristupnik s aktivnom vjerodajnicom. Upozorenje: kada je globalno omogućeno, dodaje unose u katalog za sve klijente. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Omogućuje otkrivanje stanja za čvorove kompatibilne s agregatorima New-API / One-API / Sub2API. Kada je omogućeno, kompatibilni čvorovi s postavljenom oznakom agregatora prikazivat će svoje stanje na nadzornoj ploči i pri usmjeravanju s prethodnom provjerom kvote. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Nastavlja nestrujne pozive alata kojima upravlja poslužitelj sve dok model ne vrati odgovor koji klijent može upotrijebiti. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Statistika pretraživanja i nedavna pretraživanja broje samo pružatelje koji još uvijek imaju aktivnu vezu (pružatelji bez ključa, poput duckduckgo-free, uvijek se broje). Kada je isključeno, zadržava se svaki spremljeni redak pretraživanja s ID-om pružatelja. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Stranice pružatelja na nadzornoj ploči: prikazuje oznaku Besplatno samo na temelju signala koje pružatelj poštuje — zanemaruje heuristiku naziva za prikaz, vrijednosti besplatnosti koje nisu Booleove i sufikse :free kod registriranih pružatelja bez dokumentirane besplatne razine. Kada je isključeno, zadržava se povijesno pravilo za oznaku. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | U agregiranim odgovorima 429/503 o nedostupnosti izostavlja `Retry-After` kada nije poznato konkretno buduće vrijeme ponovnog pokušaja (umjesto sintetičke 1 s), dodaje `error.retry_after_provenance` (`signal` \| `none`) i omogućuje putanjama pražnjenja kombinacije da čitaju tekstualne naznake za ponovni pokušaj iz JSON-a i neformatiranih tekstualnih tijela uzvodnih odgovora. Polje se pojavljuje samo u odgovorima koje izradi `unavailableResponse()`; ostala tijela odgovora 429/503 ostaju nepromijenjena. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Kada cilj kombinacije `priority`, označen kao rezervni samo u slučaju iscrpljenja kvote, zaustavi kombinaciju zbog uzroka koji dokazano nije kvota (otvoren prekidač strujnog kruga pružatelja, preskakanje zbog predviđene latencije), vraća 502 umjesto odgovora 503 koji upućuje na problem s kvotom. Zaustavljanja zbog zaključavanja, razdoblja hlađenja, nedostupnosti, iscrpljenja i ograničenja istodobnosti i dalje vraćaju 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Neobilježeni Mistral 401 (`{"detail":"Unauthorized"}`, bez izričitog signala autentikacije) jednak je za opozvani ključ i za iscrpljenu kvotu. Kada je uključeno, veza se privremeno stavlja u razdoblje hlađenja umjesto da se trajno označi kao `expired`, najviše 3 puta na sat po vezi; sljedeći se put označava kao `expired`, pa opozvani ključ ipak konvergira prema tom stanju. Prema zadanim je postavkama isključeno: svaki neobilježeni Mistral 401 označava vezu kao `expired`, kao i prije. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Dohvaća aktualni katalog xAI modela za veze `xai-oauth` s `https://api.x.ai/v1/models` koristeći OAuth bearer token, umjesto zamrznutog statičkog početnog skupa. Zadano je isključeno: `xai-oauth` nastavlja posluživati nepromijenjeni statički početni skup. U slučaju bilo kakve pogreške pri razrješavanju, otkrivanje se vraća na početni skup (nije provjereno prihvaća li x.ai OAuth bearer na ovoj krajnjoj točki). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Omogućuje automatskom čišćenju brisanje završenih (dovršenih/neuspjelih/otkazanih/isteklih) poslova Batch API-ja starijih od `OMNIROUTE_BATCH_RETENTION_DAYS`, zajedno s njihovim kontrolnim točkama po retku, te brisanje BLOB sadržaja prenesenih datoteka nakon njihova vlastitog vremena `expires_at`. Zadano je isključeno: svaka postojeća instalacija zadržava te podatke točno kao i prije, sve dok operator ne omogući ovu opciju. To ni na koji način ne utječe na rutu `DELETE /api/v1/batches/delete-completed` koju pokreće operator — ona je zaseban, bezuvjetan ugovor javnog API-ja. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Rezervira odabrani Antigravity račun tijekom životnog ciklusa strujanja zahtjeva koji ga je odabrao, tako da istodobni ponovni pokušaj ili prijenos vjerodajnica ne može ponovno odabrati račun koji je već dodijeljen strujanju u tijeku. Rezervacija je ograničena na (vezu, pozivni nadređeni model), pa jedan račun i dalje može istodobno posluživati dva različita modela. Kada su svi prihvatljivi računi već rezervirani za taj model, zahtjev vraća strukturirani odgovor 503 `antigravity_pool_busy` s ograničenom vrijednošću `Retry-After`, umjesto dodatnog opterećivanja zauzetog računa. Zadano je isključeno: odabir računa ostaje potpuno isti kao i prije i ne provodi se nikakva rezervacija. | ### CLI (5) -| Ključ | Vrsta | Zadano | Ponovno pokretanje | Opis | -| ------------------------------------- | ------- | ------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Omogući način kompatibilnosti za sve CLI klijente. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Omogući sloj kompatibilnosti pseudonima modela. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Omogući automatsku sinkronizaciju podataka o cijenama (također zahtijeva varijablu okruženja `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Nakon sinkronizacije modela pružatelja usluge automatski (ponovno) zapiši datoteke profila ~/.codex/*.config.toml iz aktualnog kataloga. Nikada ne mijenja aktivnu/zadanu konfiguraciju Codexa. Prema zadanim postavkama isključeno. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Nakon sinkronizacije modela pružatelja usluge automatski (ponovno) zapiši profile Claude Codea ~/.claude/profiles//settings.json iz aktualnog kataloga. Nikada ne mijenja aktivnu/zadanu konfiguraciju Claudea. Prema zadanim postavkama isključeno. | +| Ključ | Vrsta | Zadano | Ponovno pokretanje | Opis | +| ------------------------------------- | ------- | ------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Omogućuje način kompatibilnosti za sve CLI klijente. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Omogućuje sloj kompatibilnosti pseudonima modela. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Omogućuje automatsku sinkronizaciju podataka o cijenama (također zahtijeva varijablu okruženja `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Nakon sinkronizacije modela pružatelja automatski ponovno zapisuje datoteke profila ~/.codex/*.config.toml iz aktualnog kataloga. Nikada ne mijenja aktivnu/zadanu konfiguraciju Codexa. Zadano je isključeno. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Nakon sinkronizacije modela pružatelja automatski ponovno zapisuje profile Claude Codea ~/.claude/profiles//settings.json iz aktualnog kataloga. Nikada ne mijenja aktivnu/zadanu konfiguraciju Claudea. Zadano je isključeno. | ### Stanje sustava (5) -| Ključ | Tip | Zadano | Opis | -| ----------------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Onemogućuje krajnju točku za provjeru stanja lokalne instance. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Onemogućuje provjeru stanja valjanosti tokena. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Omogućuje mrežni pristup u izoliranom okruženju vještina. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Tijekom provjere stanja proxyja, sonda koju je cilj odbio (401/403/429) poništava niz uzastopnih neuspjeha proxyja. Zadano je isključeno: odbijanje ostaje neutralno (#10654). Odgovor 5xx u oba slučaja ostaje neodređen; odbijanje nikada ne uklanja, onemogućuje niti ponovno aktivira proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Pokreće provjeru integriteta/stanja baze podataka pri pokretanju nakon što poslužitelj počne prihvaćati zahtjeve (putem `setImmediate`), umjesto blokiranja pokretanja dok se provjera ne dovrši (#13717). Zadano je isključeno: pokretanje se blokira potpuno jednako kao prije ovog PR-a. | +| Ključ | Tip | Zadano | Opis | +| ----------------------------------------- | ------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Onemogućuje krajnju točku za provjeru stanja lokalne instance. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Onemogućuje provjeru stanja valjanosti tokena. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Omogućuje mrežni pristup u izoliranom okruženju za vještine. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Tijekom provjere stanja proxyja, odbijena sonda (401/403/429) poništava niz uzastopnih neuspjeha proxyja. Zadano je isključeno: odbijanje ostaje neutralno (#10654). Odgovor 5xx u oba slučaja ostaje neodređen; odbijanje nikada ne uklanja, onemogućuje niti ponovno aktivira proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Pokreće provjeru integriteta/stanja baze podataka pri pokretanju nakon što poslužitelj počne prihvaćati zahtjeve (putem `setImmediate`), umjesto blokiranja pokretanja dok se provjera ne dovrši (#13717). Zadano je isključeno: pokretanje se blokira jednako kao prije ovog PR-a. | > [!NOTE] > `INPUT_SANITIZER_BLOCK_THRESHOLD` i njegov naslijeđeni pseudonim -> `INJECTION_GUARD_BLOCK_THRESHOLD` podešavaju način rada `block` varijable +> `INJECTION_GUARD_BLOCK_THRESHOLD` podešavaju način rada `block` za > `INJECTION_GUARD_MODE`, ali to su obične varijable okruženja koje čita > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> a ne zastavice značajki: nemaju nadjačavanje u bazi podataka ni prekidač na nadzornoj ploči. Pogledajte +> a ne zastavice značajki: nemaju nadjačavanje putem baze podataka ni prekidač na nadzornoj ploči. Pogledajte > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). > [!NOTE] > Stupac `Ponovno pokretanje` označava zastavice s `requiresRestart: true` — vrijednost se -> odmah sprema, ali stupa na snagu tek nakon ponovnog učitavanja procesa. Enum -> zastavice odbijaju svaku vrijednost izvan svojeg dopuštenog skupa (provjera se izvodi na strani poslužitelja -> i u `setFeatureFlagOverride()` i u REST rukovatelju `PUT`). +> odmah pohranjuje, ali stupa na snagu tek nakon ponovnog učitavanja procesa. Enum +> zastavice odbijaju svaku vrijednost izvan njihova dopuštenog skupa (provjerava se na strani poslužitelja u +> `setFeatureFlagOverride()` i REST rukovatelju `PUT`). --- -## Prebacivanje zastavica +## Uključivanje i isključivanje zastavica ### Nadzorna ploča -Idite na **Nadzorna ploča → Postavke → Zastavice značajki** -(`/dashboard/settings/feature-flags`). Mreža +Otvorite **Nadzorna ploča → Postavke → Zastavice značajki** +(`/dashboard/settings/feature-flags`). Rešetka (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) podržava: -- **Pretraživanje** prema ključu ili opisu te **filtriranje** prema kategoriji (uz sintetički prikaz - **Zahtijeva ponovno pokretanje**). -- **Prekidač** za Booleove zastavice i **padajući izbornik** za enum zastavice +- **Pretraživanje** prema ključu ili opisu te **filtriranje** prema kategoriji (uz sintetički + prikaz **Zahtijeva ponovno pokretanje**). +- **Prekidač** za Booleove zastavice i **padajući izbornik** za zastavice tipa enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). - **Oznaku izvora** za svaku zastavicu — `DB`, `ENV` ili `DEF` — koja prikazuje odakle - dolazi efektivna vrijednost. -- Gumb **Poništi** (prikazan samo za zastavice čiji je izvor `DB`) za uklanjanje nadjačavanja - i gumb **Poništi sva nadjačavanja** pri dnu. + potječe efektivna vrijednost. +- Gumb **Poništi** (prikazuje se samo za zastavice čiji je izvor `DB`) za uklanjanje nadjačavanja + te gumb **Poništi sva nadjačavanja** pri dnu. - Natpis **Ponovno pokreni poslužitelj** kada se promijeni zastavica `requiresRestart`. ### REST API -Sve operacije prolaze kroz jednu rutu: +Sve se operacije izvršavaju putem jedne rute: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). Svaka metoda zahtijeva autentificiranu sesiju nadzorne ploče (u suprotnom vraća `401`). @@ -210,7 +212,7 @@ Vraća svaku zastavicu s njezinom efektivnom vrijednošću, izvorom i sažetkom. "requiresRestart": false, "warningLevel": "caution", }, - // ... svih 72 zastavica + // ... svih 74 zastavica ], "summary": { "total": 56, @@ -224,34 +226,34 @@ Vraća svaku zastavicu s njezinom efektivnom vrijednošću, izvorom i sažetkom. #### `PUT /api/settings/feature-flags` -Postavlja ili uklanja pojedinačno nadjačavanje. Tijelo: `{ key: string; value?: string }`. -Izostavljanje vrijednosti `value` uklanja nadjačavanje (vraćajući vrijednost iz okruženja / zadanu vrijednost). +Postavlja ili uklanja jedno nadjačavanje. Tijelo: `{ key: string; value?: string }`. +Izostavljanje svojstva `value` uklanja nadjačavanje (vraćajući vrijednost iz okruženja / zadanu vrijednost). ```bash -# Postavljanje DB nadjačavanja +# Postavljanje nadjačavanja u bazi podataka curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Uklanjanje nadjačavanja (bez "value") +# Uklanjanje nadjačavanja (bez svojstva "value") curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Odgovor vraća novu vrijednost `effectiveValue`/`source`, prethodnu vrijednost `previousValue`/ -`previousSource` i `requiresRestart`. Nepoznati ključevi i enum -vrijednosti izvan dopuštenog raspona odbijaju se kodom `400`. +Odgovor vraća nove vrijednosti `effectiveValue`/`source`, prethodne vrijednosti `previousValue`/ +`previousSource` i `requiresRestart`. Nepoznati ključevi i enum vrijednosti izvan dopuštenog +raspona odbijaju se uz status `400`. #### `DELETE /api/settings/feature-flags` -Odjednom briše **sva** DB nadjačavanja, vraćajući svaku zastavicu na njezinu vrijednost -iz okruženja / zadanu vrijednost. Vraća `{ cleared: , message: "..." }`. +Odjednom uklanja **sva** nadjačavanja iz baze podataka, vraćajući svaku zastavicu na njezinu +vrijednost iz okruženja / zadanu vrijednost. Vraća `{ cleared: , message: "..." }`. > [!NOTE] > Zastavice s `requiresRestart: true` stupaju na snagu tek nakon ponovnog učitavanja procesa. -> Tijek ponovnog pokretanja na nadzornoj ploči poziva `POST /api/restart`, a zatim periodički provjerava -> `GET /api/health/ping` dok se poslužitelj ponovno ne pokrene. +> Tijek ponovnog pokretanja na nadzornoj ploči poziva `POST /api/restart`, a zatim periodično poziva +> `GET /api/health/ping` dok poslužitelj ponovno ne postane dostupan. --- diff --git a/docs/i18n/hr/docs/reference/PROVIDER_REFERENCE.md b/docs/i18n/hr/docs/reference/PROVIDER_REFERENCE.md index d5793953c10b..07cceaa1da55 100644 --- a/docs/i18n/hr/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/i18n/hr/docs/reference/PROVIDER_REFERENCE.md @@ -4,11 +4,11 @@ --- -> **Automatski generirano** iz `src/shared/constants/providers.ts` — nemojte ručno uređivati. -> Ponovno generirajte naredbom: `npm run gen:provider-reference` -> **Posljednje generiranje:** 2026-09-17 +> **Automatski generirano** iz `src/shared/constants/providers.ts` — ne uređivati ručno. +> Ponovno generirati s: `npm run gen:provider-reference` +> **Zadnje generirano:** 2026-09-18 -Ukupan broj pružatelja usluga: **359**. U nastavku pogledajte raspodjelu po kategorijama. +Ukupno pružatelja: **359**. Pogledajte raščlambu po kategorijama u nastavku. ## Kategorije @@ -32,49 +32,49 @@ Upotrijebite nadzornu ploču na `/dashboard/providers` kako biste omogućili, ko --- -## Pružatelji bez autentifikacije (ključ nije potreban) (10) - -| ID | Alias | Naziv | Oznake | Web-mjesto | Napomene | Pozivanje alata | -| ----------------------- | ---------- | ------------------------- | -------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | -| `aihorde` | `horde` | AI Horde | Bez autentifikacije | [poveznica](https://aihorde.net) | API ključ nije potreban — koristi se dokumentirani anonimni ključ usluge AI Horde. Dodavanje besplatnog ključa s aihorde.net nije obavezno i omogućuje samo viši prioritet u redu čekanja (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | Bez autentifikacije | [poveznica](https://augmentcode.com) | OmniRoute ne pohranjuje API ključ. Instalirajte Auggie CLI i pokrenite `auggie login` na ovom računalu, nakon čega ga OmniRoute lokalno pokreće za svaki zahtjev. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Bez autentifikacije | [poveznica](https://playground.ai.cloudflare.com) | Vjerodajnice nisu potrebne — anonimne sesije preglednika putem reverznim inženjeringom rekonstruiranog protokola cf_agent WebSocket (prijenos putem Playwrighta). | — | -| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Bez autentifikacije | [poveznica](https://developers.openai.com/codex/cli) | OmniRoute ne pohranjuje token. App-server alata Codex CLI upravlja vlastitom prijavom na ChatGPT (~/.codex/auth.json, automatski se osvježava). Upotrijebite „Prijava putem ChatGPT-a” ako CLI još nije autentificiran. | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Bez autentifikacije | [poveznica](https://docs.devin.ai/work-with-devin/devin-cli) | Autentifikacijom upravlja službeni Devin CLI u svojem izoliranom volumenu mosta. | emulirano | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Bez autentifikacije | [poveznica](https://duckduckgo.com/duckchat) | Vjerodajnice nisu potrebne — DuckDuckGo AI Chat anoniman je i besplatan. | emulirano | -| `opencode` | `oc` | OpenCode Free | Bez autentifikacije | [poveznica](https://opencode.ai) | API ključ nije potreban — koristi se javna besplatna krajnja točka usluge OpenCode. | — | -| `uncloseai` | `unc` | UncloseAI | Bez autentifikacije | [poveznica](https://uncloseai.com) | Autentifikacija nije potrebna. API prihvaća bilo koji neprazan niz kao ključ za identifikaciju. Ako stariji ugrađeni modeli vraćaju 404, upotrijebite Dostupni modeli → Uvezi iz /models ili Automatska sinkronizacija; provjereni aktivni model: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | Bez autentifikacije, video | [poveznica](https://veoaifree.com) | Autentifikacija nije potrebna. Ograničeno na 6 zahtjeva na sat po IP adresi. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | Bez autentifikacije | [poveznica](https://zcode.z.ai) | OmniRoute ne pohranjuje API ključ. Lokalni ZCode app-server koristi postojeću prijavu builtin:zai-coding-plan. | — | +## Pružatelji bez autentifikacije (nije potreban ključ) (10) + +| ID | Alias | Naziv | Oznake | Web stranica | Bilješke | Pozivanje alata | +| ----------------------- | ---------- | ------------------------- | -------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | +| `aihorde` | `horde` | AI Horde | Bez autentifikacije | [link](https://aihorde.net) | Nije potreban API ključ — koristi dokumentirani anonimni ključ AI Horde. Dodavanje besplatnog aihorde.net ključa je opcionalno i samo osigurava viši prioritet u redu čekanja (pohvale). | — | +| `auggie` | `aug` | Augment (Auggie CLI) | Bez autentifikacije | [link](https://augmentcode.com) | OmniRoute ne pohranjuje API ključ. Instalirajte Auggie CLI i pokrenite `auggie login` na ovom stroju, a zatim ga OmniRoute pokreće lokalno za svaki zahtjev. | — | +| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | Bez autentifikacije | [link](https://playground.ai.cloudflare.com) | Nisu potrebne vjerodajnice — anonimne sesije preglednika putem reverzno inženjerskog cf_agent WebSocket protokola (Playwright transport). | — | +| `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | Bez autentifikacije | [link](https://developers.openai.com/codex/cli) | OmniRoute ne pohranjuje token. Codex CLI app-server upravlja vlastitom prijavom na ChatGPT (~/.codex/auth.json, automatski se osvježava). Koristite „Prijavi se s ChatGPT-om“ ako CLI još nije autentificiran. | — | +| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | Bez autentifikacije | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Autentifikacija je u vlasništvu službenog Devin CLI-ja u njegovom izoliranom bridge volumenu. | emulirano | +| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | Bez autentifikacije | [link](https://duckduckgo.com/duckchat) | Nisu potrebne vjerodajnice — DuckDuckGo AI Chat je anoniman i besplatan. | emulirano | +| `opencode` | `oc` | OpenCode Free | Bez autentifikacije | [link](https://opencode.ai) | Nije potreban API ključ — koristi javnu besplatnu krajnju točku OpenCode-a. | — | +| `uncloseai` | `unc` | UncloseAI | Bez autentifikacije | [link](https://uncloseai.com) | Nije potrebna autentifikacija. API prihvaća bilo koji neprazan niz kao ključ za identifikaciju. Ako stariji ugrađeni modeli vrate 404, koristite Dostupni modeli → Uvezi iz /models ili Automatska sinkronizacija; provjereni aktivni model: Lorbus/Qwen3.6-27B-int4-AutoRound. | — | +| `veoaifree-web` | `veo-free` | Veo AI Free | Bez autentifikacije, video | [link](https://veoaifree.com) | Nije potrebna autentifikacija. Ograničeno na 6 zahtjeva/sat po IP adresi. | — | +| `zcode` | `zc` | ZCode (GLM Coding Plan) | Bez autentifikacije | [link](https://zcode.z.ai) | OmniRoute ne pohranjuje API ključ. Lokalni ZCode app-server koristi postojeću builtin:zai-coding-plan prijavu. | — | ## OAuth pružatelji (24) -| ID | Pseudonim | Naziv | Oznake | Web-stranica | Napomene | -| --------------- | ------------- | ------------------------- | ------ | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `agy` | `agy` | Antigravity CLI | OAuth | [poveznica](https://antigravity.google) | Uvezite svoju prijavu za Antigravity CLI (`agy`) (zalijepite/prenesite njegovu datoteku tokena), automatski otkrijte lokalnu CLI prijavu ili se prijavite putem Googlea. Dijeli pozadinski sustav Antigravity (uklj. modele Claude). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [poveznica](https://aws.amazon.com/q/developer/) | Upotrebljava isti AWS Builder ID ili tijek uvezenog tokena za osvježavanje kao Kiro, ali veze za Amazon Q drži odvojenima. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [poveznica](https://cline.bot/cline-pass) | ClinePass je Clineova pretplata od 9,99 USD mjesečno koja obuhvaća 10 otvorenih modela za programiranje. Prijavite se svojim Cline računom (ista prijava kao za Cline CLI/IDE) ili zalijepite izravni ClinePass API ključ (app.cline.bot → Settings → API Keys). Pretplata na ClinePass otključava modele cline-pass/*. Ponovno upotrebljava Clineov WorkOS OAuth tijek. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [poveznica](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Prijavite se putem službenog CLI tijeka s kodom uređaja ili zalijepite izravni API ključ (šalje se kao Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [poveznica](https://cli.devin.ai) | Zahtijeva izvršnu datoteku Devin CLI-ja. Pokrenite `devin auth login` za autentifikaciju ili navedite svoj WINDSURF_API_KEY. Instalacija: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [poveznica](https://devin.ai) | Zalijepite postojeći Devin API ključ iz autentificirane Devin sesije. Dostupnost i koraci izvoza ključa razlikuju se ovisno o verziji Devina i računu. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Unesite URL svoje GHE instance (npr. https://ghe.company.com) u postavkama pružatelja, a zatim se autentificirajte putem tijeka za uređaje. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [poveznica](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth nije konfiguriran. Registrirajte OAuth aplikaciju na https://gitlab.com/-/profile/applications s URI-jem za preusmjeravanje http://localhost:20128/callback i opsezima "ai_features read_user", zatim postavite GITLAB_DUO_OAUTH_CLIENT_ID (i po želji GITLAB_DUO_OAUTH_CLIENT_SECRET) te ponovno pokrenite sustav. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Prijavite se putem preglednika ili zalijepite svoj ~/.grok/auth.json (ili JWT pristupni token) iz Grok Build CLI-ja; refresh_token automatski se rotira u oba slučaja. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [poveznica](https://www.kimi.com/code?aff=omniroute) | Prijavite se istim Kimi računom koji upotrebljava Kimi Code CLI. OmniRoute upotrebljava CLI OAuth tijek i krajnje točke plana Kimi Coding. | -| `kiro` | `kr` | Kiro AI | OAuth | — | Besplatna razina: 50 kredita mjesečno (~25K–100K tokena). ⚠️ Kirovi uvjeti pružanja usluge zabranjuju upotrebu proxyja/alata trećih strana. | -| `openference` | `of` | Openference | OAuth | [poveznica](https://openference.com) | Prijavite se svojim Openference računom kako biste usmjeravali zahtjeve putem api.openference.com. Za izvođenje zaključivanja potreban je aktivan plan — OAuth može uspješno izvršiti autentifikaciju, ali bez aktivnog plana vratiti status 402. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `trae` | `tr` | Trae | OAuth | [poveznica](https://trae.ai) | Trae je izvorno AI razvojno okruženje tvrtke ByteDance (udaljeni agent SOLO). Autorizirajte putem trae.ai u skočnom prozoru ili se prijavite na solo.trae.ai i zalijepite Cloud-IDE-JWT (šalje se kao 'Authorization: Cloud-IDE-JWT ', s rokom valjanosti od približno 14 dana) kao pristupni token; web_id/biz_user_id/user_unique_id/scope/tenant/region prenose se putem providerSpecificData. Za zalijepljene tokene nema osvježavanja bez grafičkog sučelja — ponovno ih zalijepite nakon isteka. | -| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [poveznica](https://x.ai) | Prijavite se putem xAI-ja kako biste upotrebljavali modele s api.x.ai, poput Grok 4.5. To je odvojeno od Grok Build JWT sesija koje upotrebljavaju cli-chat-proxy.grok.com i pseudonime modela grok-build. | -| `zed` | `zd` | Zed IDE | OAuth | [poveznica](https://zed.dev) | Zed pohranjuje vjerodajnice pružatelja LLM-ova (OpenAI, Anthropic, Google, Mistral, xAI) u privjesku ključeva operacijskog sustava. Upotrijebite gumb Uvezi u nastavku kako biste ih automatski pronašli i uvezli. | -| `zed-hosted` | — | Zed Hosted Models | OAuth | [poveznica](https://zed.dev) | Prijavite se svojim Zed računom (prijava putem izvorne aplikacije). OmniRoute generira jednokratni par RSA ključeva i otvara zed.dev radi njegove autorizacije — pri udaljenoj instalaciji ili instalaciji bez grafičkog sučelja kopirajte rezultirajući povratni URL 127.0.0.1 iz adresne trake preglednika i zalijepite ga ovdje. Razlikuje se od prethodno navedenog unosa 'Zed IDE' za uvoz vjerodajnica: ovaj pristup prosljeđuje dovršetke razgovora putem Zedova vlastitog agregatora hostiranih modela (cloud.zed.dev), koji omogućuje pristup modelima Anthropic/OpenAI/Google/xAI u okviru vašeg Zed plana. | +| ID | Alias | Naziv | Oznake | Web stranica | Bilješke | +| --------------- | ------------- | ------------------------- | ------ | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `agy` | `agy` | Antigravity CLI | OAuth | [link](https://antigravity.google) | Uvezite svoju Antigravity CLI (`agy`) prijavu (zalijepite/učitajte datoteku tokena), automatski otkrijte lokalnu CLI prijavu ili se prijavite putem Googlea. Dijeli Antigravity pozadinu (uključujući Claude modele). | +| `amazon-q` | `aq` | Amazon Q | OAuth | [link](https://aws.amazon.com/q/developer/) | Koristi isti AWS Builder ID ili uvezeni tok osvježavajućeg tokena kao Kiro, ali drži Amazon Q veze odvojenima. | +| `antigravity` | — | Antigravity | OAuth | — | — | +| `claude` | `cc` | Claude Code | OAuth | — | — | +| `cline` | `cl` | Cline | OAuth | — | — | +| `clinepass` | `cp` | ClinePass | OAuth | [link](https://cline.bot/cline-pass) | ClinePass je Clineova pretplata od 9,99 USD mjesečno koja objedinjuje 10 otvorenih modela kodiranja. Prijavite se svojim Cline računom (ista prijava kao za Cline CLI/IDE) ili zalijepite izravni ClinePass API ključ (app.cline.bot → Postavke → API ključevi). ClinePass pretplata otključava cline-pass/* modele. Ponovno koristi Cline WorkOS OAuth tok. | +| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Prijavite se putem službenog CLI toka koda uređaja ili zalijepite izravni API ključ (poslan kao Authorization: Bearer). Katalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | +| `codex` | `cx` | OpenAI Codex | OAuth | — | — | +| `cursor` | `cu` | Cursor IDE | OAuth | — | — | +| `devin-cli` | `dv` | Devin CLI | OAuth | [link](https://cli.devin.ai) | Zahtijeva Devin CLI binarnu datoteku. Pokrenite `devin auth login` za autentifikaciju ili navedite svoj WINDSURF_API_KEY. Instalacija: https://cli.devin.ai | +| `devin-desktop` | — | Devin Desktop | OAuth | [link](https://devin.ai) | Zalijepite postojeći Devin API ključ iz autentificirane Devin sesije. Dostupnost i koraci izvoza ključa variraju ovisno o verziji i računu Devina. | +| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Unesite URL svoje GHE instance (npr. https://ghe.company.com) u postavkama pružatelja, a zatim se autentificirajte putem toka uređaja. | +| `github` | `gh` | GitHub Copilot | OAuth | — | — | +| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth nije konfiguriran. Registrirajte OAuth aplikaciju na https://gitlab.com/-/profile/applications s preusmjeravajućim URI-jem http://localhost:20128/callback i opsezima "ai_features read_user", zatim postavite GITLAB_DUO_OAUTH_CLIENT_ID (i opcionalno GITLAB_DUO_OAUTH_CLIENT_SECRET) i ponovno pokrenite. | +| `grok-cli` | `gc` | Grok Build | OAuth | — | Prijavite se putem preglednika ili zalijepite svoj ~/.grok/auth.json (ili JWT pristupni token) iz Grok Build CLI-ja; refresh_token se automatski rotira u oba slučaja. | +| `kilocode` | `kc` | Kilo Code | OAuth | — | — | +| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [link](https://www.kimi.com/code?aff=omniroute) | Prijavite se istim Kimi računom koji koristi Kimi Code CLI. OmniRoute koristi CLI OAuth tok i Kimi Coding Plan krajnje točke. | +| `kiro` | `kr` | Kiro AI | OAuth | — | Besplatni sloj: 50 kredita/mjesec (~25K–100K tokena). ⚠️ Kiro ToS zabranjuje korištenje proxyja/harnessa trećih strana. | +| `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Prijavite se svojim Openference računom za usmjeravanje zahtjeva putem api.openference.com. Uključuje besplatan pristup Qwen3.8 27b i Llama 3.2 3B — pogledajte openference.com/pricing za trenutne uvjete plana. | +| `qoder` | `if` | Qoder | OAuth | — | — | +| `trae` | `tr` | Trae | OAuth | [link](https://trae.ai) | Trae je AI-nativni IDE tvrtke ByteDance (SOLO udaljeni agent). Autorizirajte putem trae.ai u skočnom prozoru ili se prijavite na solo.trae.ai i zalijepite Cloud-IDE-JWT (poslan kao 'Authorization: Cloud-IDE-JWT ', ~14-dnevni vijek trajanja) kao pristupni token; web_id/biz_user_id/user_unique_id/scope/tenant/region se propagiraju putem providerSpecificData. Nema bezglavog osvježavanja za zalijepljene tokene — ponovno zalijepite po isteku. | +| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [link](https://x.ai) | Prijavite se s xAI-jem za korištenje api.x.ai modela kao što je Grok 4.5. Ovo je odvojeno od Grok Build JWT sesija, koje koriste cli-chat-proxy.grok.com i grok-build aliasa modela. | +| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed pohranjuje vjerodajnice LLM pružatelja (OpenAI, Anthropic, Google, Mistral, xAI) u OS privjesak ključeva. Koristite gumb Uvezi u nastavku za automatsko otkrivanje i uvoz. | +| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Prijavite se svojim Zed računom (prijava putem izvorne aplikacije). OmniRoute generira jednokratni RSA par ključeva i otvara zed.dev za autorizaciju — na udaljenoj/bezglavoj instalaciji, kopirajte rezultirajući 127.0.0.1 URL povratnog poziva iz adresne trake preglednika i zalijepite ga ovdje. Razlikuje se od unosa 'Zed IDE' za uvoz vjerodajnica iznad: ovo proxyira dovršetke chata putem Zedovog vlastitog agregatora hostiranih modela (cloud.zed.dev), koji predvodi Anthropic/OpenAI/Google/xAI modele pod vašim Zed planom. | ## Pružatelji web-kolačića (34) @@ -115,252 +115,252 @@ Upotrijebite nadzornu ploču na `/dashboard/providers` kako biste omogućili, ko | `zai-web` | `zw` | Z.ai Web | Web kolačić | [poveznica](https://chat.z.ai) | Kopirajte vrijednost "token" iz chat.z.ai → DevTools → Application → Local Storage. Nemojte kopirati kolačiće; OmniRoute obrađuje CAPTCHA-u za svaki zahtjev putem svojeg prijenosa preglednikom. | — | | `zenmux-free` | `zmf` | ZenMux Free (Web) | Web kolačić | [poveznica](https://zenmux.ai) | Prijavite se na zenmux.ai, zatim izvezite sve kolačiće pomoću proširenja EditThisCookie ili Cookie-Editor i ovdje zalijepite cijeli niz zaglavlja Cookie. Osvježite otprilike svakih 30 dana. | — | -## Pružatelji API ključeva (plaćeno / plaćeno s besplatnim kreditima) (242) - -| ID | Alias | Naziv | Oznake | Web-mjesto | Napomene | -| ------------------------ | --------------- | ------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `360ai` | `360ai` | 360 AI | API ključ | [poveznica](https://ai.360.cn) | Nabavite API ključ na ai.360.cn | -| `agentrouter` | `agentrouter` | AgentRouter | API ključ, agregator | [poveznica](https://agentrouter.org) | 200 USD besplatnih kredita pri registraciji — pristupnik za usmjeravanje između više modela | -| `agnes` | `agnes` | Agnes AI | API ključ, video | [poveznica](https://agnes-ai.com) | Nabavite API ključ na agnes-ai.com | -| `agnes-cn` | `agnescn` | Agnes AI (Kina) | API ključ | [poveznica](https://api.agnes-ai.cn) | Nabavite API ključ na web-mjestu Agnes CN. | -| `ai21` | `ai21` | AI21 Labs | API ključ | [poveznica](https://www.ai21.com) | 10 USD probnih kredita pri registraciji (vrijede 3 mjeseca), kreditna kartica nije potrebna | -| `aimlapi` | `aiml` | AI/ML API | API ključ, agregator | [poveznica](https://aimlapi.com) | Besplatna razina je pauzirana (2026.) — AI/ML API sada se naplaćuje isključivo prema potrošnji (minimalna nadoplata iznosi 20 USD); nema redovitih besplatnih kredita. | -| `ainative` | `ainative` | AINative Studio | API ključ | [poveznica](https://ainative.studio) | Izradite besplatan API ključ na ainative.studio (bez kartice), a zatim ga ovdje zalijepite kao Bearer token. | -| `aion` | `aion` | Aion Labs | API ključ | [poveznica](https://www.aionlabs.ai) | Izradite besplatan API ključ na aionlabs.ai (bez kartice), a zatim ga ovdje zalijepite kao Bearer token. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API ključ | [poveznica](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (Kina) | API ključ | [poveznica](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API ključ | [poveznica](https://developer.ant-ling.com/en/docs/) | Registrirajte se i izradite API ključ u konzoli Ant Ling API-ja (https://chat.ant-ling.com/open), a zatim ga ovdje zalijepite. OmniRoute usmjerava promet chata na https://api.ant-ling.com/v1/chat/completions; pružatelj je kompatibilan s OpenAI-jem, a nudi i sučelje kompatibilno s Anthropicom. | -| `anthropic` | `anthropic` | Anthropic | API ključ | [poveznica](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API ključ, agregator | [poveznica](https://anyapi.ai) | Besplatni paket: 100.000 ANY tokena dnevno i 100 RPM-a za prihvatljive modele iz kategorija Free/Basic; kreditna kartica nije potrebna. | -| `api-airforce` | `af` | Api.airforce | API ključ | [poveznica](https://api.airforce) | 55 modela u besplatnoj razini, uključujući Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash i DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API ključ | [poveznica](https://arcee.ai) | Nabavite API ključ na arcee.ai | -| `auriko` | `auriko` | Auriko | API ključ, agregator | [poveznica](https://www.auriko.ai) | Besplatni paket nudi 1.000 Platform RPM-a i 10.000 BYOK RPM-a. Zaključivanje na platformi i dalje podliježe troškovima pružatelja; ovo nije skup besplatnih tokena niti neograničeno besplatno zaključivanje. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API ključ, poslovno | [poveznica](https://learn.microsoft.com/azure/ai-foundry) | Upotrijebite svoj Azure AI Foundry ključ. Osnovni URL može biti https://.services.ai.azure.com/openai/v1/ ili https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | API ključ, poslovno | [poveznica](https://azure.microsoft.com/products/ai-services/openai-service) | Upotrijebite svoj Azure OpenAI API ključ. Osnovni URL trebao bi biti krajnja točka vašeg resursa, primjerice https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API ključ | [poveznica](https://b.ai) | Bearer API ključ za b.ai LLM pristupnik kompatibilan s OpenAI-jem (razlikuje se od TheB.AI-ja). Izradite ključ na https://docs.b.ai, a zatim upotrijebite https://api.b.ai/v1 kao osnovni URL kompatibilan s OpenAI-jem. | -| `baichuan` | `baichuan` | Baichuan | API ključ | [poveznica](https://www.baichuan-ai.com/) | Nabavite API ključ na platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | API ključ | [poveznica](https://ernie.baidu.com/) | Nabavite API ključ na console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API ključ | [poveznica](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API ključ | [poveznica](https://baseten.co) | 30 USD besplatnih probnih kredita za zaključivanje na GPU-u | -| `bazaarlink` | `bzl` | BazaarLink | API ključ | [poveznica](https://bazaarlink.ai) | Upotrijebite svoj BazaarLink API ključ (počinje s sk-bl-) u Authorization: Bearer . OpenAI SDK radi s osnovnim URL-om https://bazaarlink.ai/api/v1. Modeli upotrebljavaju format provider/model-name. | -| `bedrock` | `bedrock` | Amazon Bedrock | API ključ, poslovno | [poveznica](https://aws.amazon.com/bedrock) | Upotrijebite svoj Amazon Bedrock API ključ i konfigurirajte AWS regiju u kojoj su vaši modeli omogućeni (primjerice eu-west-2). OmniRoute izravno poziva izvorni Bedrockov Converse API. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API ključ, slika | [poveznica](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API ključ | [poveznica](https://blackbox.ai) | ⚠️ **ZASTARJELO.** api.blackbox.ai vraća HTTP 404 za svaku varijantu putanje (provjera 2026-08-21); javno sučelje za zaključivanje premješteno je na ograničenu krajnju točku enterprise.blackbox.ai/v1. | -| `bluesminds` | `bm` | BluesMinds | API ključ | [poveznica](https://www.bluesminds.com) | Besplatni dnevni pi krediti — podržava više od 200 modela, uključujući GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen i Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API ključ | [poveznica](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API ključ | [poveznica](https://bytez.com) | 1 USD besplatnih kredita, obnavljaju se svaka 4 tjedna | -| `cerebras` | `cerebras` | Cerebras | API ključ | [poveznica](https://inference.cerebras.ai) | Jednokratni kredit od 5 USD pri registraciji (vrijedi 30 dana); potreban je način plaćanja. Nije riječ o redovitoj besplatnoj razini. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API ključ | [poveznica](https://hyper.charm.land) | 100 besplatnih Hypercredits mjesečno pri registraciji | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API ključ, agregator | [poveznica](https://api.oriper.com) | Službeni metapodaci navode 2 milijuna tokena mjesečno, ali javno web-mjesto i dokumentacija bili su blokirani tijekom provjere; kvotu i mapiranje robne marke smatrajte nepotvrđenima. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API ključ, agregator | [poveznica](https://chatanywhere.tech) | Samo za osobnu, obrazovnu ili istraživačku upotrebu: javna dokumentacija navodi 10.000 bodova dnevno i 200 zahtjeva dnevno po IP-u/ključu; nemojte upotrebljavati za komercijalni promet. | -| `cheaperinference` | `cinf` | Cheaper Inference | API ključ | [poveznica](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API ključ | [poveznica](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API ključ, agregator | [poveznica](https://chutes.ai) | Bearer API ključ za Chutesov pristupnik kompatibilan s OpenAI-jem. | -| `clarifai` | `clarifai` | Clarifai | API ključ, poslovno | [poveznica](https://docs.clarifai.com) | Upotrijebite svoj Clarifai PAT ili API ključ specifičan za aplikaciju. OmniRoute cilja krajnju točku kompatibilnu s OpenAI-jem na adresi https://api.clarifai.com/v2/ext/openai/v1 i autentificira se pomoću Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API ključ, agregator | [poveznica](https://cloudcode.one) | Objavljeni besplatni modeli uključuju glm-4.7-flash i glm-4.6v-flash; brojčana kvota nije objavljena, a izrada ključa može zahtijevati sredstva ili kupon. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API ključ | [poveznica](https://developers.cloudflare.com/workers-ai) | Zahtijeva API token I ID računa (može se pronaći na dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API ključ | [poveznica](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API ključ | [poveznica](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API ključ | [poveznica](https://cohere.com) | Besplatno probno razdoblje: 1.000 API poziva mjesečno za testiranje, kreditna kartica nije potrebna | -| `command-code` | `cmd` | Command Code | API ključ | [poveznica](https://commandcode.ai/) | Upotrijebite API ključ za Command Code. Zahtjevi se šalju na krajnju točku /provider/v1/chat/completions usluge Command Code. | -| `coze` | `coze` | Coze | API ključ | [poveznica](https://coze.com) | Nabavite API ključ na coze.com/open/api | -| `crof` | `crof` | CrofAI | API ključ | [poveznica](https://crof.ai) | — | -| `cursor-api` | `cua` | Cursor API | API ključ | [poveznica](https://cursor.com/dashboard/api) | Zalijepite korisnički API ključ za Cursor (crsr_...) s adrese cursor.com/dashboard/api. OmniRoute ga prema potrebi razmjenjuje za token sesije; nije potrebna instalacija IDE-a ili alata cursor-agent. Upotreba se naplaćuje Cursor tarifi kojoj ključ pripada. | -| `dahl` | `dahl` | Dahl | API ključ | [poveznica](https://inference.dahl.global) | Kliknite „Add Account” za automatsko generiranje tokena ili dodajte API ključ ručno. | -| `databricks` | `databricks` | Databricks | API ključ, poslovno | [poveznica](https://www.databricks.com) | — | -| `datarobot` | `datarobot` | DataRobot | API ključ, poslovno | [poveznica](https://docs.datarobot.com) | Upotrijebite svoj DataRobot API token. Neobavezni osnovni URL može biti korijenska adresa računa (za LLM Gateway) ili URL implementacije pod /api/v2/deployments/. | -| `deepai` | `deepai` | DeepAI | API ključ, slika | [poveznica](https://deepai.org) | Upotrijebite svoj DeepAI API ključ. Nabavite ga na deepai.org — potrebna je pretplata Pro (9,99 USD mjesečno). | -| `deepinfra` | `deepinfra` | DeepInfra | API ključ | [poveznica](https://deepinfra.com) | Besplatna početna sredstva pri registraciji za testiranje API-ja i istraživanje modela | -| `deepseek` | `ds` | DeepSeek | API ključ | [poveznica](https://platform.deepseek.com) | 5 milijuna besplatnih tokena pri registraciji — kreditna kartica nije potrebna | -| `dgrid` | `dgrid` | DGrid | API ključ | [poveznica](https://dgrid.ai) | DGrid usmjerivač besplatnih modela: 10 zahtjeva u minuti i 100 zahtjeva dnevno. Jednokratna nadoplata od 5 USD otključava do 20 zahtjeva u minuti i 1.000 zahtjeva dnevno. | -| `dify` | `dify` | Dify | API ključ | [poveznica](https://dify.ai) | Nabavite API ključ iz svoje instance Difyja. | -| `digitalocean` | `digitalocean` | DigitalOcean | API ključ | [poveznica](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API ključ | [poveznica](https://dit.ai) | Upotrijebite svoj dit.ai API ključ u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem — izravna zamjena; samo promijenite osnovni URL u https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API ključ | [poveznica](https://doubao.com) | Nabavite API ključ na console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | API ključ, agregator | [poveznica](https://www.dxnt.com) | Za besplatne račune dokumentirano je 100 poziva dnevno; kvota se može povećati putem pozivnica i može se razlikovati ovisno o računu. | -| `electronhub` | `electronhub` | Electron Hub | API ključ, agregator | [poveznica](https://www.electronhub.ai) | Besplatna tarifa: 5 RPM, 0,25 USD tjednih sredstava i 10 Neutrina dnevno za modele :free; primjenjuju se i obiteljski proračuni. | -| `empower` | `empower` | Empower | API ključ, agregator | [poveznica](https://docs.empower.dev) | Bearer API ključ za krajnju točku usluge Empower kompatibilnu s OpenAI-jem. | -| `eurouter` | `eurouter` | EURouter | API ključ, agregator | [poveznica](https://eurouter.ai) | — | -| `factory` | `factory` | Factory | API ključ | [poveznica](https://factory.ai) | Bearer API ključ za pristupnik usluge Factory kompatibilan s OpenAI-jem. | -| `fal-ai` | `fal` | Fal.ai | API ključ, slika | [poveznica](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API ključ, agregator | [poveznica](https://fastrouter.ai) | Modeli sa sufiksom :free dopuštaju 10 zahtjeva dnevno po organizaciji i modelu; dostupnost se može promijeniti. | -| `featherless-ai` | `featherless` | Featherless AI | API ključ | [poveznica](https://featherless.ai) | Dostupna je besplatna razina — kreditna kartica nije potrebna | -| `fenayai` | `fenayai` | FenayAI | API ključ, agregator | [poveznica](https://fenayai.com) | Bearer API ključ za FenayAI pristupnik kompatibilan s OpenAI-jem. | -| `fireworks` | `fireworks` | Fireworks AI | API ključ | [poveznica](https://fireworks.ai) | 1 USD besplatnih početnih sredstava pri registraciji za testiranje API-ja | -| `free-ai` | `free-ai` | Free.ai | API ključ, agregator | [poveznica](https://free.ai) | 30.000 tokena dnevno pokriva modele s vlastitim hostingom nakon potvrde e-pošte. Upotreba iznad zajedničke kvote može se naplatiti po stvarnom trošku, a vrhunski vanjski modeli se plaćaju. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API ključ | [poveznica](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API ključ | [poveznica](https://freebuff.com) | Unesite Freebuff / Codebuff autentifikacijski token (dobiven prijavom putem CLI-ja ili automatiziranog sakupljača). | -| `freeinference` | `freeinference` | FreeInference | API ključ, agregator | [poveznica](https://freeinference.org) | Besplatan istraživački pristup bez kartice; kandidati koji nisu s Harvarda moraju dobiti ručno odobrenje, a brojčana kvota nije javno zajamčena. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API ključ | [poveznica](https://freemodel.dev) | $300 besplatnih kredita pri registraciji — kreditna kartica nije potrebna. Pristupite modelima GPT-5.4 i GPT-5.5 (najnovijim vodećim modelima tvrtke OpenAI) putem API-ja kompatibilnog s OpenAI-jem. | -| `freetheai` | `fta` | FreeTheAi | API ključ, agregator | [poveznica](https://freetheai.xyz) | Pridružite se Discordu FreeTheAi kako biste dobili besplatni API ključ. | -| `friendliai` | `friendli` | FriendliAI | API ključ | [poveznica](https://friendli.ai) | Besplatna razina za inference bez poslužitelja — kreditna kartica nije potrebna | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API ključ, agregator | [poveznica](https://g4f.space) | Prikupite anonimne cake kredite na g4f.dev/chat ili upotrijebite članski ključ za g4f.dev (izradite ga na g4f.dev/members.html). | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API ključ, agregator | [poveznica](https://g4f.space) | Prikupite anonimne cake kredite na g4f.dev/chat ili upotrijebite članski ključ za g4f.dev (izradite ga na g4f.dev/members.html). | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API ključ, agregator | [poveznica](https://g4f.space) | Prikupite anonimne cake kredite na g4f.dev/chat ili upotrijebite članski ključ za g4f.dev (izradite ga na g4f.dev/members.html). | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API ključ, agregator | [poveznica](https://g4f.space) | Prikupite anonimne cake kredite na g4f.dev/chat ili upotrijebite članski ključ za g4f.dev (izradite ga na g4f.dev/members.html). | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API ključ, agregator | [poveznica](https://g4f.space) | Prikupite anonimne cake kredite na g4f.dev/chat ili upotrijebite članski ključ za g4f.dev (izradite ga na g4f.dev/members.html). | -| `galadriel` | `galadriel` | Galadriel | API ključ | [poveznica](https://galadriel.com) | ⚠️ **ZASTARJELO.** api.galadriel.ai više se ne razrješava (provjera 2026-06-19); čini se da je inference API ukinut. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API ključ | [poveznica](https://aistudio.google.com) | Besplatna razina dostupna je putem usluge Google AI Studio; primjenjuju se trenutačne kvote za pojedine modele i regionalna ograničenja | -| `getgoapi` | `ggo` | GoAPI | API ključ, agregator | [poveznica](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API ključ | [poveznica](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API ključ | [poveznica](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab osobni pristupni token za javni API Code Suggestions. Konfigurirajte osnovni URL vlastitog poslužitelja kada ne upotrebljavate gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API ključ | [poveznica](https://opengateway.gitlawb.com) | Besplatan MiMo (xiaomi/mimo-v2.5) ukinut je 2026-05 — Opengateway je sada pristupnik s kreditima koji se plaćaju prema potrošnji; nema modela koji je redovito besplatan. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API ključ | [poveznica](https://opengateway.gitlawb.com) | Besplatna promocija Nemotron završila je 2026-06 — ruta GMI Cloud sada je dostupna samo uz kredite koji se plaćaju prema potrošnji. | -| `glm` | `glm` | GLM Coding | API ključ | [poveznica](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (Kina) | API ključ | [poveznica](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API ključ | [poveznica](https://open.bigmodel.cn) | — | -| `greenpt` | `greenpt` | GreenPT | API ključ | [poveznica](https://greenpt.com) | Pretplata na API može se izraditi besplatno; inference se naplaćuje po tokenu. Nije objavljena besplatna kvota za inference. | -| `groq` | `groq` | Groq | API ključ | [poveznica](https://groq.com) | Besplatni plan: ograničenja po modelu (200K tokena dnevno po modelu za razgovor; pogledajte console.groq.com/docs/rate-limits za RPM/RPD) — nije evidentiran način plaćanja. | -| `haiper` | `hp` | Haiper | API ključ, videozapis | [poveznica](https://haiper.ai) | Nabavite API ključ na haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | API ključ | [poveznica](https://api.hcnsec.cn) | Nabavite API ključ na api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | API ključ, agregator | [poveznica](https://helixmind.online) | Prethodno navođene tvrdnje o 3 RPM/50 RPD i nekorištenju kartice nisu potvrđene tijekom revizije 2026-08-02; trenutačna kvota i naplata zahtijevaju provjeru računa. | -| `helyxai` | `helyxai` | Helyx AI | API ključ, agregator | [poveznica](https://helyxai.space) | Dokumentacija aktivnog besplatnog plana navodi 100,000 tokena dnevno; odvojena marketinška tvrdnja web-mjesta o više od 2M proturječna je i ne smatra se jamstvom kvote. | -| `heroku` | `heroku` | Heroku AI | API ključ, poslovni korisnici | [poveznica](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API ključ | [poveznica](https://huggingface.co) | Besplatan Inference API za tisuće modela (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API ključ | [poveznica](https://hyperbolic.xyz) | $1-5 probnih kredita pri registraciji za inference bez poslužitelja | -| `ideogram` | `ideo` | Ideogram | API ključ | [poveznica](https://ideogram.ai) | Nabavite API ključ na ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | API ključ | [poveznica](https://xinghuo.xfyun.cn) | Nabavite API ključ na console.xfyun.cn | -| `inception` | `inception` | Inception | API ključ | [poveznica](https://docs.inceptionlabs.ai) | 10M besplatnih tokena pri registraciji, kreditna kartica nije potrebna. | -| `inference-net` | `inet` | Inference.net | API ključ | [poveznica](https://inference.net) | $25 besplatnih kredita pri registraciji, uz dostupne potpore za istraživanje | -| `internlm` | `internlm` | InternLM (Intern-S1) | API ključ | [poveznica](https://internlm.intern-ai.org.cn/) | Besplatna mjesečna kvota od približno 1M ulaznih / 3M izlaznih tokena (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API ključ, ugrađivanje/ponovno rangiranje | [poveznica](https://jina.ai) | Bearer API ključ za api.jina.ai — ugrađivanje, ponovno rangiranje, klasifikaciju, segmentaciju i pretraživanje. Ključevi s nadzorne ploče imaju prednost pred JINA_AI_API_KEY. Ovo nije kartica Reader / r.jina.ai i ne dohvaća URL-ove. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API ključ | [poveznica](https://jina.ai/reader) | Bearer API ključ za pretvaranje URL-a u Markdown putem r.jina.ai (samo /v1/web/fetch). Ne poslužuje /v1/embeddings ni /v1/rerank. Radi isti Jina token kao za Foundation API; OmniRoute ponovno upotrebljava ključ jina-ai s nadzorne ploče ili JINA_AI_API_KEY kada je ova kartica prazna. | -| `kenari` | `kenari` | Kenari | API ključ | [poveznica](https://kenari.id) | Upotrijebite svoj Kenari API ključ (kn-...) u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://kenari.id/v1. | -| `kie` | `kie` | KIE.AI | API ključ | [poveznica](https://kie.ai) | — | -| `kilo-gateway` | `kg` | Kilo Gateway | API ključ, agregator | [poveznica](https://kilo.ai) | — | -| `kimi` | `kimi` | Kimi (naslijeđeni Moonshot API) | API ključ | [poveznica](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API ključ | [poveznica](https://www.kimi.com/code?aff=omniroute) | — | -| `lambda-ai` | `lambda` | Lambda AI | API ključ | [poveznica](https://lambda.ai) | — | -| `laozhang` | `lz` | LaoZhang AI | API ključ, agregator | [poveznica](https://api.laozhang.ai) | — | -| `leonardo` | `leo` | Leonardo AI | API ključ, video | [poveznica](https://leonardo.ai) | Nabavite API ključ na leonardo.ai/developer | -| `liquid` | `liquid` | Liquid AI | API ključ | [poveznica](https://liquid.ai) | Nabavite API ključ na liquid.ai | -| `literouter` | `literouter` | LiteRouter | API ključ, agregator | [poveznica](https://literouter.com) | Besplatne inačice modela koriste sufiks :free; dnevna ograničenja kredita razlikuju se ovisno o modelu, a besplatan unos ograničen je na 5.000 tokena. | -| `llamagate` | `llamagate` | LlamaGate | API ključ | [poveznica](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API ključ, agregator | [poveznica](https://llm.kiwi) | Besplatni plan omogućuje auto i hrLLM; objavljeno ograničenje od 40 zahtjeva na sat odnosi se na hrLLM. | -| `llm7` | `llm7` | LLM7.io | API ključ | [poveznica](https://llm7.io) | Upotrijebite bilo koji ključ koji nije prazan (na primjer 'unused'). Ako stariji ugrađeni modeli vraćaju model_unavailable, upotrijebite Dostupni modeli → Uvezi iz /models ili Automatska sinkronizacija; provjereni aktivni model: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API ključ, agregator | [poveznica](https://llmgateway.io) | Hostirani besplatni plan: modeli bez naknade ograničeni su na 5 zahtjeva u 10 minuta kada račun nema kredita. | -| `logfare` | `logfare` | Logfare | API ključ, agregator | [poveznica](https://logfare.ai) | Izradite besplatan račun na https://logfare.ai/register (korisničko ime/lozinka, bez potvrde e-pošte) kako biste odmah dobili API ključ, a zatim ga ovdje zalijepite kao Bearer token. | -| `longcat` | `lc` | LongCat AI | API ključ | [poveznica](https://longcat.chat/platform/docs) | Besplatno: jednokratna dodjela 10 milijuna tokena nakon registracije računa i KYC provjere (LongCat-2.0). Samo jednokratno — nije riječ o ponavljajućoj dnevnoj/mjesečnoj kvoti. | -| `magnific` | `freepik` | Magnific | API ključ, slika | [poveznica](https://www.magnific.com) | Nabavite API ključ na magnific.com/user/api-keys (zaglavlje x-magnific-api-key). Naslijeđeni Freepik ključevi za razvojne programere i dalje rade. | -| `maritalk` | `maritalk` | Maritalk | API ključ | [poveznica](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API ključ, agregator | [poveznica](https://meganova.ai) | Besplatna registracija bez kartice. Objavljene kvote razine Tier 1 po modelu ukupno iznose 550 zahtjeva dnevno; nisu zajednički globalni fond, a prekoračenje uz naplatu može se primijeniti ako je omogućeno. | -| `meta-llama` | `meta` | Meta Llama API | API ključ | [poveznica](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API ključ, video | [poveznica](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (Kina) | API ključ | [poveznica](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API ključ | [poveznica](https://mistral.ai) | Besplatna razina Experiment: pristup svim modelima s ograničenjem učestalosti, bez potrebe za kreditnom karticom | -| `mixedbread` | `mxbai` | Mixedbread AI | API ključ | [poveznica](https://www.mixedbread.com) | Bearer API ključ za Mixedbread API za ugrađivanje. | -| `mixlayer` | `mixlayer` | Mixlayer | API ključ, agregator | [poveznica](https://www.mixlayer.com) | Model qwen/qwen3.5-4b-free besplatan je za izradu prototipova i ima ograničenu učestalost zahtjeva; nije potvrđen fiksni javni RPM ni dnevna kvota. | -| `mnn-ai` | `mnn-ai` | MNN AI | API ključ, agregator | [poveznica](https://mnnai.ru) | Besplatni plan: 1 USD mjesečnih kredita, 10 RPM i pristup samo modelima označenima kao Free. | -| `modal` | `mdl` | Modal | API ključ, poslovni sustavi | [poveznica](https://modal.com/docs) | Upotrijebite Bearer token koji štiti vašu implementaciju na Modalu, ako je omogućen. Osnovni URL treba upućivati na vašu aplikaciju Modal kompatibilnu s OpenAI-jem, na primjer https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API ključ | [poveznica](https://modelscope.cn) | Besplatna razina putem ModelScope API-Inference — potreban je Alibaba račun. | -| `monsterapi` | `monster` | MonsterAPI | API ključ | [poveznica](https://monsterapi.ai) | ⚠️ **ZASTARJELO.** Monster API obustavio je poslovanje 2026-06-30. Upotrijebite alternativne pružatelje kompatibilne s OpenAI-jem. | -| `moonshot` | `moonshot` | Kimi | API ključ | [poveznica](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API ključ | [poveznica](https://morphllm.com) | Besplatna razina: 250 tisuća kredita mjesečno, 0 USD | -| `muse-code` | `mc` | Muse Code (Meta) | API ključ | [poveznica](https://github.com/meta-llama/llama-stack) | Upotrijebite svoju varijablu okruženja META_API_KEY kao Bearer token. Muse Code CLI koristi format OpenAI Responses API-ja za prijenos podataka (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API ključ, agregator | [poveznica](https://naga.ac) | Nabavite API ključ na naga.ac — dostupna je registracija putem Googlea/GitHuba/Discorda. | -| `naga-ai` | `naga-ai` | Naga AI | API ključ, agregator | [poveznica](https://naga.ac) | Modeli označeni s :free javno su navedeni, ali nije potvrđena brojčana kvota. Nagina pravila upozoravaju da se upiti i izlazni rezultati besplatne razine mogu prikupljati ili upotrebljavati za obuku. | -| `nanogpt` | `nanogpt` | NanoGPT | API ključ | [poveznica](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API ključ | [poveznica](https://bynara.id) | Izradite besplatan NaraRouter račun, povežite svoj Telegram (obavezno prije odgovora putem /v1), a zatim ovdje zalijepite ključ kao Bearer token. | -| `navy` | `navy` | NavyAI | API ključ | [poveznica](https://api.navy) | Izradite besplatan API ključ na nadzornoj ploči NavyAI-ja, a zatim ga ovdje zalijepite kao Bearer token. | -| `nebius` | `nebius` | Nebius AI | API ključ | [poveznica](https://nebius.com) | Oko $1 probnih kredita nakon registracije za testiranje API-ja | -| `nlpcloud` | `nlpc` | NLP Cloud | API ključ | [poveznica](https://docs.nlpcloud.com) | Upotrijebite svoj NLP Cloud API ključ u Authorization: Token . OmniRoute prema zadanim postavkama cilja krajnju točku chatbota na https://api.nlpcloud.io/v1/gpu//chatbot. | -| `nomic` | `nomic` | Nomic | API ključ | [poveznica](https://nomic.ai) | Nabavite API ključ na atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | API ključ | [poveznica](https://portal.nousresearch.com/help) | Upotrijebite svoj Nous Portal API ključ. OmniRoute cilja službenu krajnju točku za izvođenje zaključivanja kompatibilnu s OpenAI-jem na https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API ključ, video, agregator | [poveznica](https://novita.ai) | $0.50 probnih kredita nakon registracije (vrijede oko 1 godinu) | -| `nscale` | `nscale` | nScale | API ključ | [poveznica](https://nscale.com) | $5 besplatnih kredita nakon registracije za testiranje izvođenja zaključivanja | -| `nube` | `nube` | Nube.sh | API ključ | [poveznica](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API ključ | [poveznica](https://build.nvidia.com) | Besplatan razvojni pristup: oko 40 RPM, više od 70 modela (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API ključ, poslovna upotreba | [poveznica](https://www.oracle.com/artificial-intelligence/generative-ai) | Upotrijebite svoj OCI Generative AI API ključ ili IAM bearer token. Osnovni URL može biti https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | API ključ, agregator | [poveznica](https://ofox.ai) | Trenutačni katalog oglašava više od 10 besplatnih modela bez javno navedene brojčane kvote; prije produkcijske upotrebe provjerite podrijetlo uzvodnih pružatelja te uvjete zadržavanja podataka i obuke. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API ključ | [poveznica](https://ollama.com/settings/keys) | — | -| `oneminai` | `1min` | 1min.AI | API ključ | [poveznica](https://1min.ai) | Izradite API ključ na https://docs.1min.ai/docs/api/create-api-key, a zatim ga ovdje zalijepite. | -| `openadapter` | `oad` | OpenAdapter | API ključ | [poveznica](https://openadapter.dev) | Upotrijebite svoj OpenAdapter API ključ u Authorization: Bearer sk-cv-. Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API ključ | [poveznica](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API ključ | [poveznica](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API ključ | [poveznica](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API ključ | [poveznica](https://openference.com) | Besplatan plan: trodnevno probno razdoblje s modelima otvorenog koda — kreditna kartica nije potrebna | -| `openrouter` | `openrouter` | OpenRouter | API ključ, agregator | [poveznica](https://openrouter.ai) | Besplatni modeli po cijeni od $0/token sa sufiksom :free – 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API ključ | [poveznica](https://openvecta.com) | Besplatni krediti nakon registracije za izvođenje zaključivanja kompatibilno s OpenAI-jem na LLM-ovima, ugradnjama i modelima zaključivanja | -| `opper` | `opper` | Opper | API ključ, agregator | [poveznica](https://opper.ai) | — | -| `orcarouter` | `orcarouter` | OrcaRouter | API ključ | [poveznica](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API ključ | [poveznica](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API ključ | [poveznica](https://www.perplexity.ai) | — | -| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API ključ | [poveznica](https://www.perplexity.ai) | Upotrijebite svoj Perplexity API ključ. OmniRoute usmjerava ID-jeve modela Agent API-ja kroz Perplexityjevu krajnju točku kompatibilnu s Responses API-jem. | -| `piapi` | `pi` | PiAPI | API ključ, agregator | [poveznica](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API ključ | [poveznica](https://pioneer.ai) | $75 besplatnih kredita za upotrebu — kreditna kartica nije potrebna | -| `plamo` | `plamo` | PLaMo | API ključ | [poveznica](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API ključ, agregator | [poveznica](https://creator.poe.com/api-reference) | Bearer API ključ za Poe API kompatibilan s OpenAI-jem. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API ključ, agregator | [poveznica](https://poixe.com) | Trenutačna javna besplatna ograničenja mala su i specifična za pojedine skupine modela: 2 RPM/5 RPD za large-cup modele i 20 RPM/50 RPD za small-cup modele. | -| `pollinations` | `pol` | Pollinations AI | API ključ, video | [poveznica](https://pollinations.ai) | Anoniman pristup dokumentiranim besplatnim modelima bez ključa pruža se bez jamstva. Lokalna provjera verzije v3.8.50 (2026-07-31) vratila je 401 putem OmniRoutea i Cloudflare 1010 pri izravnim provjerama uzvodnog pružatelja iz iste mreže. Premium modeli i dalje zahtijevaju Pollinations API ključ s enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API ključ | [poveznica](https://poolside.ai) | Laguna S 2.1 i XS 2.1 besplatni su tijekom pretpregleda; nije objavljena javna brojčana kvota. | -| `predibase` | `predibase` | Predibase | API ključ | [poveznica](https://predibase.com) | ⚠️ **ZASTARJELO.** serving.app.predibase.com više se ne razrješava (provjera 2026-06-19); čini se da je upravljani API za posluživanje ukinut. | -| `publicai` | `publicai` | PublicAI | API ključ | [poveznica](https://publicai.co) | Zahtijeva API ključ — jednokratni kredit nakon registracije, a zatim se naplaćuje | -| `qianfan` | `qianfan` | Baidu Qianfan | API ključ | [poveznica](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API ključ | [poveznica](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API ključ | [poveznica](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API ključ | [poveznica](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API ključ, slika | [poveznica](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API ključ | [poveznica](https://regolo.ai) | Preuzmite svoj Regolo API ključ s web-mjesta regolo.ai, a zatim ga ovdje zalijepite kao Bearer token. | -| `reka` | `reka` | Reka | API ključ | [poveznica](https://docs.reka.ai/chat/overview) | Upotrijebite svoj Reka API ključ. OmniRoute podržava osnovni URL kompatibilan s OpenAI-jem https://api.reka.ai/v1 i radi kompatibilnosti šalje i zaglavlje Authorization i zaglavlje X-Api-Key. | -| `requesty` | `requesty` | Requesty | API ključ | [poveznica](https://requesty.ai) | Besplatna razina s približno 200 zahtjeva dnevno – pristupnik za usmjeravanje između više modela (više od 300 modela) | -| `routeway` | `routeway` | Routeway | API ključ | [poveznica](https://routeway.ai) | Izradite besplatan API ključ na web-mjestu routeway.ai, a zatim ga ovdje zalijepite kao Bearer token. | -| `runwayml` | `runway` | Runway | API ključ, videozapis | [poveznica](https://docs.dev.runwayml.com) | Upotrijebite svoj Runway API ključ u Authorization: Bearer . OmniRoute upotrebljava trenutačni Runway API na adresi https://api.dev.runwayml.com/v1 i automatski šalje obavezno zaglavlje X-Runway-Version. | -| `sambanova` | `samba` | SambaNova | API ključ | [poveznica](https://sambanova.ai) | 5 USD besplatnih kredita pri registraciji (vrijede 30 dana), kreditna kartica nije potrebna | -| `sap` | `sap` | SAP Generative AI Hub | API ključ, poslovna uporaba | [poveznica](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Upotrijebite svoj SAP AI Core Bearer token. Osnovni URL može biti korijenski URL vašeg AI_API_URL-a ili deploymentUrl iz usluge Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | API ključ | [poveznica](https://docs.sarvam.ai) | 1.000 ₹ besplatnih kredita pri registraciji — nikada ne istječu | -| `scaleway` | `scw` | Scaleway AI | API ključ | [poveznica](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1 milijun besplatnih tokena za nove račune — usklađeno s propisima EU-a i GDPR-om (Pariz), Qwen3 235B i Llama 70B | -| `sealion` | `sealion` | SEA-LION | API ključ | [poveznica](https://sea-lion.ai) | Prijavite se na sea-lion.ai putem Googlea (bez kartice i regionalnih ograničenja), izradite API ključ, a zatim ga ovdje zalijepite. | -| `seekai` | `ska` | SeekAi | API ključ, agregator | [poveznica](https://seekai.cc) | Izradite API ključ na adresi https://seekai.cc, a zatim ga ovdje zalijepite kao Bearer token. | -| `segmind` | `segmind` | Segmind | API ključ, slika, videozapis | [poveznica](https://segmind.com) | Upotrijebite svoj Segmind API ključ u zaglavlju x-api-key. OmniRoute upotrebljava https://api.segmind.com/v1/ i izravno vraća bajtove generirane slike/videozapisa. | -| `sensenova` | `sensenova` | SenseNova | API ključ | [poveznica](https://platform.sensenova.cn) | Preuzmite API ključ na web-mjestu platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | API ključ | [poveznica](https://cloud.siliconflow.com) | 1 USD besplatnih kredita i trenutačno navedeni modeli od 0 USD nakon provjere identiteta; dostupnost i ograničenja mogu se promijeniti | -| `snowflake` | `snowflake` | Snowflake Cortex | API ključ, poslovna uporaba | [poveznica](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API ključ | [poveznica](https://xinghuo.xfyun.cn) | Preuzmite API ključ na web-mjestu console.xfyun.cn | -| `speka` | `speka` | Speka AI | API ključ, agregator | [poveznica](https://speka.me) | Besplatni plan: 1 USD mjesečne potrošnje, 10 RPM, jedan API ključ te pristup otvorenim modelima i razvojnom okruženju; kartica nije potrebna. | -| `stability-ai` | `stability` | Stability AI | API ključ, slika | [poveznica](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API ključ | [poveznica](https://stepfun.com) | Preuzmite API ključ na web-mjestu platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | API ključ | [poveznica](https://ai.sumopod.com) | Upotrijebite svoj SumoPod API ključ (sk-...) u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API ključ | [poveznica](https://suno.ai) | Zalijepite kolačić sesije s web-mjesta suno.ai (Clerk autentifikacija) | -| `synthetic` | `synthetic` | Synthetic | API ključ, agregator | [poveznica](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API ključ, agregator | [poveznica](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API ključ | [poveznica](https://hunyuan.tencent.com) | Preuzmite API ključ na web-mjestu console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | API ključ, agregator | [poveznica](https://theb.ai) | Bearer API ključ za pristupnik TheB.AI kompatibilan s OpenAI-jem. | -| `tinyfish` | `tf` | TinyFish Fetch | API ključ | [poveznica](https://docs.tinyfish.ai/fetch-api) | X-API-Key s web-mjesta agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API ključ, videozapis | [poveznica](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API ključ | [poveznica](https://agent-router.gaib.ai) | Upotrijebite svoj Token Kiosk API ključ u Authorization: Bearer . Potpuno kompatibilan pristupnik za OpenAI. Osnovni URL API-ja: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API ključ, agregator | [poveznica](https://www.tokenreply.com) | Modeli označeni kao besplatni imaju dnevna ograničenja specifična za model i kampanju; nije objavljena fiksna ukupna besplatna kvota. | -| `tokenrouter` | `trk` | TokenRouter | API ključ | [poveznica](https://tokenrouter.com) | Upotrijebite svoj TokenRouter API ključ u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API ključ, slika | [poveznica](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API ključ | [poveznica](https://docs.opentyphoon.ai) | Besplatan API ključ s ograničenjem brzine od 5 zahtjeva u sekundi i 200 zahtjeva u minuti. | -| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API ključ | [poveznica](https://uncensored.com) | Upotrijebite svoj uncensored.com Developer API ključ (uai_sk_live_...). OmniRoute ga šalje kao zaglavlje X-api-key krajnjoj točki kompatibilnoj s OpenAI-jem na adresi https://api.uncensored.com/api/v1. Ključ nikad ne istječe. Ovo je sučelje s naplatom prema potrošnji/kreditima; pretplatnički chat bez mjerenja potrošnje zaseban je pružatelj 'uc'. | -| `udio` | `udio` | Udio | API ključ | [poveznica](https://udio.com) | Zalijepite kolačić sesije s udio.com (Supabase autentifikacija) | -| `unorouter` | `unorouter` | UnoRouter | API ključ, agregator | [poveznica](https://unorouter.ai) | Modeli sa sufiksom :free ne umanjuju saldo; ograničenje je 1 zahtjev u minuti po besplatnom modelu i korisniku. | -| `upstage` | `upstage` | Upstage | API ključ | [poveznica](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API ključ | [poveznica](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API ključ | [poveznica](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API ključ, agregator | [poveznica](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API ključ, za poslovne korisnike | [poveznica](https://cloud.google.com/vertex-ai) | Navedite JSON Service Accounta, OAuth pristupni token, Vertex Express API ključ ili autorizacijski ključ povezan sa servisnim računom. Način rada Express podržava samo Gemini; partnerski modeli zahtijevaju vjerodajnice ograničene na projekt. | -| `vertex-partner` | `vp` | Vertex AI Partners | API ključ, za poslovne korisnike | [poveznica](https://cloud.google.com/vertex-ai) | Navedite JSON Service Accounta ili OAuth vjerodajnice. Autorizacijski ključ povezan sa servisnim računom također podržava otkrivanje, ali partnersko izvođenje dodatno zahtijeva ID pripadajućeg Google Cloud projekta. Standardni Express ključevi podržavaju samo Gemini. | -| `void-ai` | `void-ai` | Void AI | API ključ, agregator | [poveznica](https://voidai.app) | Javni katalog modela označava neke modele kao one koji zahtijevaju besplatni plan, ali pristup je uvjetovan i nije potvrđena brojčana kvota. | -| `volcengine` | `volcengine` | Volcengine | API ključ | [poveznica](https://www.volcengine.com) | — | -| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API ključ | [poveznica](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Povežite svoj Volcano Engine račun ili upotrijebite pretplatnički API ključ za Ark Agent Plan. | -| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API ključ | [poveznica](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Povežite svoj Volcano Engine račun ili upotrijebite pretplatnički API ključ za Ark Coding Plan. | -| `voyage-ai` | `voyage` | Voyage AI | API ključ, ugrađivanje/ponovno rangiranje | [poveznica](https://www.voyageai.com) | Bearer API ključ za API-je za ugrađivanje i ponovno rangiranje usluge Voyage AI. | -| `wafer` | `wafer` | Wafer AI | API ključ | [poveznica](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API ključ | [poveznica](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API ključ, za poslovne korisnike | [poveznica](https://www.ibm.com/products/watsonx-ai) | Upotrijebite svoj watsonx Bearer token. Osnovni URL može biti https://.ml.cloud.ibm.com/ml/gateway/v1/ ili samostalno upravljana krajnja točka /ml/gateway/v1. | -| `writer` | `writer` | Writer | API ključ | [poveznica](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API ključ | [poveznica](https://x5lab.dev) | Upotrijebite svoj X5Lab API ključ (x5-...) u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API ključ | [poveznica](https://x.ai) | Upotrijebite službeni xAI API ključ ili se prijavite putem xAI OAutha. Grok Build JWT sesije ostaju zaseban pružatelj. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API ključ | [poveznica](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API ključ | [poveznica](https://mimo.mi.com) | — | -| `xkiro` | `xkiro` | xKiro | API ključ, agregator | [poveznica](https://xkiro.com) | Izradite besplatan račun na xkiro.com i ovdje zalijepite ključ (Bearer; prihvaća se i x-api-key). | -| `yi` | `yi` | Yi (01.AI) | API ključ | [poveznica](https://01.ai) | Nabavite API ključ na platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API ključ, agregator | [poveznica](https://yolo-auto.com) | Besplatan pristup API-ju ograničen je brojem zahtjeva i namijenjen testiranju; nije objavljena brojčana dnevna kvota i ne jamči se da će besplatan pristup biti dostupan neograničeno. | -| `zai` | `zai` | Z.AI | API ključ | [poveznica](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API ključ | [poveznica](https://zenmux.ai) | Upotrijebite svoj ZenMux API ključ u Authorization: Bearer . ZenMux je potpuno kompatibilan s OpenAI-jem. Osnovni URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API ključ, agregator | [poveznica](https://www.zerolimitai.com) | Oglašava se privremeno besplatno probno razdoblje, ali službene stranice navode proturječne podatke od 3 i 7 dana; tvrdnja o 100 poziva dnevno ne smatra se trajnom. | -| `zylo-api` | `zylo` | Zylo API | API ključ, agregator | [poveznica](https://zyloai.net) | Osnovni plan: 10 RPM, 7.200 zahtjeva dnevno i 200.000 tokena dnevno; ograničeno na osnovne tekstualne modele. | +## Pružatelji API ključeva (plaćeni / plaćeni-s-besplatnim-kreditima) (242) + +| ID | Alias | Name | Tags | Website | Notes | +| ------------------------ | --------------- | ------------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `360ai` | `360ai` | 360 AI | API ključ | [link](https://ai.360.cn) | Nabavite API ključ na ai.360.cn | +| `agentrouter` | `agentrouter` | AgentRouter | API ključ, agregator | [link](https://agentrouter.org) | 200 USD besplatnih kredita pri registraciji - pristupnik za usmjeravanje više modela | +| `agnes` | `agnes` | Agnes AI | API ključ, video | [link](https://agnes-ai.com) | Nabavite API ključ na agnes-ai.com | +| `agnes-cn` | `agnescn` | Agnes AI (China) | API ključ | [link](https://api.agnes-ai.cn) | Nabavite API ključ s Agnes CN stranice. | +| `ai21` | `ai21` | AI21 Labs | API ključ | [link](https://www.ai21.com) | 10 USD probnih kredita pri registraciji (vrijedi 3 mjeseca), nije potrebna kreditna kartica | +| `aimlapi` | `aiml` | AI/ML API | API ključ, agregator | [link](https://aimlapi.com) | Besplatna razina pauzirana (2026.) — AI/ML API sada je samo plaćanje po potrošnji (min. nadoplata 20 USD); nema ponavljajućih besplatnih kredita. | +| `ainative` | `ainative` | AINative Studio | API ključ | [link](https://ainative.studio) | Izradite besplatni API ključ na ainative.studio (bez kartice), zatim ga ovdje zalijepite kao Bearer token. | +| `aion` | `aion` | Aion Labs | API ključ | [link](https://www.aionlabs.ai) | Izradite besplatni API ključ na aionlabs.ai (bez kartice), zatim ga ovdje zalijepite kao Bearer token. | +| `alibaba` | `ali` | Alibaba Cloud Model Studio | API ključ | [link](https://bailian.console.alibabacloud.com/) | — | +| `alibaba-cn` | `ali-cn` | Alibaba (Kina) | API ključ | [link](https://dashscope.console.aliyun.com/) | — | +| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API ključ | [link](https://developer.ant-ling.com/en/docs/) | Registrirajte se i izradite API ključ na Ant Ling API konzoli (https://chat.ant-ling.com/open), zatim ga ovdje zalijepite. OmniRoute usmjerava chat promet na https://api.ant-ling.com/v1/chat/completions; pružatelj je kompatibilan s OpenAI-jem i također nudi sučelje kompatibilno s Anthropicom. | +| `anthropic` | `anthropic` | Anthropic | API ključ | [link](https://platform.claude.com) | — | +| `anyapi` | `anyapi` | AnyAPI AI | API ključ, agregator | [link](https://anyapi.ai) | Besplatni plan: 100.000 ANY tokena/dan i 100 RPM za prihvatljive besplatne/osnovne modele; nije potrebna kreditna kartica. | +| `api-airforce` | `af` | Api.airforce | API ključ | [link](https://api.airforce) | 55 besplatnih modela uključujući Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | +| `arcee-ai` | `arcee` | Arcee AI | API ključ | [link](https://arcee.ai) | Nabavite API ključ na arcee.ai | +| `auriko` | `auriko` | Auriko | API ključ, agregator | [link](https://www.auriko.ai) | Besplatni plan objavljuje 1.000 Platform RPM i 10.000 BYOK RPM. Platformsko zaključivanje i dalje prolazi kroz trošak pružatelja; ovo nije skup besplatnih tokena ili neograničeno besplatno zaključivanje. | +| `azure-ai` | `azure-ai` | Azure AI Foundry | API ključ, poslovni | [link](https://learn.microsoft.com/azure/ai-foundry) | Koristite svoj Azure AI Foundry ključ. Osnovni URL može biti https://.services.ai.azure.com/openai/v1/ ili https://.openai.azure.com/openai/v1/. | +| `azure-openai` | `azure` | Azure OpenAI | API ključ, poslovni | [link](https://azure.microsoft.com/products/ai-services/openai-service) | Koristite svoj Azure OpenAI API ključ. Osnovni URL trebao bi biti vaša krajnja točka resursa, na primjer https://my-resource.openai.azure.com. | +| `bai` | `bai` | b.ai | API ključ | [link](https://b.ai) | Bearer API ključ za b.ai LLM pristupnik kompatibilan s OpenAI-jem (različit od TheB.AI). Izradite ključ na https://docs.b.ai, zatim koristite https://api.b.ai/v1 kao osnovni URL kompatibilan s OpenAI-jem. | +| `baichuan` | `baichuan` | Baichuan | API ključ | [link](https://www.baichuan-ai.com/) | Nabavite API ključ na platform.baichuan-ai.com | +| `baidu` | `baidu` | Baidu (ERNIE) | API ključ | [link](https://ernie.baidu.com/) | Nabavite API ključ na console.bce.baidu.com | +| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API ključ | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | +| `baseten` | `baseten` | Baseten | API ključ | [link](https://baseten.co) | 30 USD besplatnih probnih kredita za GPU zaključivanje | +| `bazaarlink` | `bzl` | BazaarLink | API ključ | [link](https://bazaarlink.ai) | Koristite svoj BazaarLink API ključ (počinje s sk-bl-) u Authorization: Bearer . OpenAI SDK radi s osnovnim URL-om https://bazaarlink.ai/api/v1. Modeli koriste format pružatelj/naziv-modela. | +| `bedrock` | `bedrock` | Amazon Bedrock | API ključ, poslovni | [link](https://aws.amazon.com/bedrock) | Koristite svoj Amazon Bedrock API ključ i konfigurirajte AWS regiju gdje su vaši modeli omogućeni (na primjer eu-west-2). OmniRoute izravno poziva Bedrockov izvorni Converse API. | +| `black-forest-labs` | `bfl` | Black Forest Labs | API ključ, slika | [link](https://blackforestlabs.ai) | — | +| `blackbox` | `bb` | Blackbox AI | API ključ | [link](https://blackbox.ai) | ⚠️ **ZASTARJELO.** api.blackbox.ai vraća HTTP 404 na svakoj varijanti putanje (provjera 2026-08-21); javno sučelje za zaključivanje premješteno je na zaštićenu krajnju točku enterprise.blackbox.ai/v1. | +| `bluesminds` | `bm` | BluesMinds | API ključ | [link](https://www.bluesminds.com) | Besplatni dnevni pi krediti — podržava 200+ modela uključujući GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | +| `byteplus` | `bpm` | BytePlus ModelArk | API ključ | [link](https://console.byteplus.com/ark) | — | +| `bytez` | `bytez` | Bytez | API ključ | [link](https://bytez.com) | 1 USD besplatnih kredita, osvježava se svaka 4 tjedna | +| `cerebras` | `cerebras` | Cerebras | API ključ | [link](https://inference.cerebras.ai) | Jednokratni kredit od 5 USD pri registraciji (vrijedi 30 dana); potrebna je metoda plaćanja. Nije ponavljajuća besplatna razina. | +| `charm-hyper` | `charm-hyper` | Charm Hyper | API ključ | [link](https://hyper.charm.land) | 100 besplatnih mjesečnih Hyperkredita pri registraciji | +| `chat-oripe` | `chat-oripe` | Chat Oripe | API ključ, agregator | [link](https://api.oriper.com) | Službeni metapodaci oglašavaju 2M tokena/mjesec, ali javna stranica i dokumentacija su blokirane tijekom revizije; kvotu i mapiranje robne marke smatrajte nepotvrđenima. | +| `chatanywhere` | `chatanywhere` | ChatAnywhere | API ključ, agregator | [link](https://chatanywhere.tech) | Samo za osobnu, obrazovnu ili istraživačku upotrebu: javna dokumentacija navodi 10.000 bodova/dan i 200 zahtjeva/dan po IP-u/ključu; ne koristiti za komercijalni promet. | +| `cheaperinference` | `cinf` | Cheaper Inference | API ključ | [link](https://cheaperinference.com/?utm_source=omniroute) | — | +| `chenzk` | `chenzk` | Chenzk API | API ključ | [link](https://chenzk.top) | — | +| `chutes` | `chutes` | Chutes.ai | API ključ, agregator | [link](https://chutes.ai) | Bearer API ključ za Chutes OpenAI-kompatibilni pristupnik. | +| `clarifai` | `clarifai` | Clarifai | API ključ, poduzeće | [link](https://docs.clarifai.com) | Koristite svoj Clarifai PAT ili API ključ specifičan za aplikaciju. OmniRoute cilja OpenAI-kompatibilnu krajnju točku na [https://api.clarifai.com/v2/ext/openai/v1](https://api.clarifai.com/v2/ext/openai/v1) i autentificira se s Authorization: Key . | +| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API ključ, agregator | [link](https://cloudcode.one) | Objavljeni besplatni modeli uključuju glm-4.7-flash i glm-4.6v-flash; nije objavljena numerička kvota, a stvaranje ključa može zahtijevati kredit ili kupon. | +| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API ključ | [link](https://developers.cloudflare.com/workers-ai) | Zahtijeva API token I ID računa (nalazi se na dash.cloudflare.com) | +| `clova-studio` | `clova` | Naver CLOVA Studio | API ključ | [link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | +| `codestral` | `codestral` | Codestral | API ključ | [link](https://mistral.ai) | — | +| `cohere` | `cohere` | Cohere | API ključ | [link](https://cohere.com) | Besplatna proba: 1.000 API poziva/mjesec za testiranje, nije potrebna kreditna kartica | +| `command-code` | `cmd` | Command Code | API ključ | [link](https://commandcode.ai/) | Koristite Command Code API ključ. Zahtjevi se šalju na Command Code-ovu `/provider/v1/chat/completions` krajnju točku. | +| `coze` | `coze` | Coze | API ključ | [link](https://coze.com) | Nabavite API ključ na coze.com/open/api | +| `crof` | `crof` | CrofAI | API ključ | [link](https://crof.ai) | — | +| `cursor-api` | `cua` | Cursor API | API ključ | [link](https://cursor.com/dashboard/api) | Zalijepite Cursor korisnički API ključ (crsr_...) s [cursor.com/dashboard/api](https://cursor.com/dashboard/api). OmniRoute ga po potrebi zamjenjuje za sesijski token; nije potrebna instalacija IDE-a ili cursor-agenta. Korištenje se naplaćuje prema Cursor planu koji posjeduje ključ. | +| `dahl` | `dahl` | Dahl | API ključ | [link](https://inference.dahl.global) | Kliknite 'Add Account' za automatsko generiranje tokena ili dodajte ručni API ključ. | +| `databricks` | `databricks` | Databricks | API ključ, poduzeće | [link](https://www.databricks.com) | — | +| `datarobot` | `datarobot` | DataRobot | API ključ, poduzeće | [link](https://docs.datarobot.com) | Koristite svoj DataRobot API token. Opcionalni osnovni URL može biti korijen računa (za LLM Gateway) ili URL implementacije pod `/api/v2/deployments/`. | +| `deepai` | `deepai` | DeepAI | API ključ, slika | [link](https://deepai.org) | Koristite svoj DeepAI API ključ. Nabavite ga na [deepai.org](https://deepai.org) — zahtijeva Pro pretplatu (9,99 USD/mj.). | +| `deepinfra` | `deepinfra` | DeepInfra | API ključ | [link](https://deepinfra.com) | Besplatni krediti za prijavu za API testiranje i istraživanje modela | +| `deepseek` | `ds` | DeepSeek | API ključ | [link](https://platform.deepseek.com) | 5M besplatnih tokena pri prijavi - nije potrebna kreditna kartica | +| `dgrid` | `dgrid` | DGrid | API ključ | [link](https://dgrid.ai) | DGrid Free Models Router: 10 zahtjeva/minuti i 100 zahtjeva/dan. Doživotna nadoplata od 5 USD otključava do 20 zahtjeva/minuti i 1.000 zahtjeva/dan. | +| `dify` | `dify` | Dify | API ključ | [link](https://dify.ai) | Nabavite API ključ iz svoje Dify instance. | +| `digitalocean` | `digitalocean` | DigitalOcean | API ključ | [link](https://docs.digitalocean.com/products/ai-platform/) | — | +| `dit` | `dai` | DIT.ai | API ključ | [link](https://dit.ai) | Koristite svoj dit.ai API ključ u Authorization: Bearer . Potpuno OpenAI-kompatibilan — zamjena koja se jednostavno uklapa, samo promijenite osnovni URL na [https://api.dit.ai/v1](https://api.dit.ai/v1). | +| `doubao` | `doubao` | Doubao | API ključ | [link](https://doubao.com) | Nabavite API ključ na console.volcengine.com | +| `dxnt` | `dxnt` | DXNT / DX Token | API ključ, agregator | [link](https://www.dxnt.com) | Besplatni računi dokumentirani su s 100 poziva/dan; kvota se može povećati putem pozivnica i može varirati ovisno o računu. | +| `electronhub` | `electronhub` | Electron Hub | API ključ, agregator | [link](https://www.electronhub.ai) | Besplatni plan: 5 RPM, 0,25 USD tjednih kredita i 10 Neutrina/dan za :free modele; primjenjuju se i obiteljski budžeti. | +| `empower` | `empower` | Empower | API ključ, agregator | [link](https://docs.empower.dev) | Bearer API ključ za Empower OpenAI-kompatibilnu krajnju točku. | +| `eurouter` | `eurouter` | EURouter | API ključ, agregator | [link](https://eurouter.ai) | — | +| `factory` | `factory` | Factory | API ključ | [link](https://factory.ai) | Bearer API ključ za Factory OpenAI-kompatibilni pristupnik. | +| `fal-ai` | `fal` | Fal.ai | API ključ, slika | [link](https://fal.ai) | — | +| `fastrouter` | `fastrouter` | FastRouter | API ključ, agregator | [link](https://fastrouter.ai) | Modeli sa sufiksom :free dopuštaju 10 zahtjeva/dan po organizaciji i modelu; dostupnost se može promijeniti. | +| `featherless-ai` | `featherless` | Featherless AI | API ključ | [link](https://featherless.ai) | Dostupan besplatni sloj — nije potrebna kreditna kartica | +| `fenayai` | `fenayai` | FenayAI | API ključ, agregator | [link](https://fenayai.com) | Bearer API ključ za FenayAI OpenAI-kompatibilni pristupnik. | +| `fireworks` | `fireworks` | Fireworks AI | API ključ | [link](https://fireworks.ai) | 1 USD besplatnih početnih kredita pri prijavi za API testiranje | +| `free-ai` | `free-ai` | Free.ai | API ključ, agregator | [link](https://free.ai) | 30.000 tokena/dan pokriva samostalno hostirane modele nakon provjere e-pošte. Korištenje izvan bazena može se naplatiti po sirovoj cijeni, a premium vanjski modeli se plaćaju. | +| `freeaiapikey` | `faik` | FreeAIAPIKey | API ključ | [link](https://freeaiapikey.com) | — | +| `freebuff` | `freebuff` | Freebuff | API ključ | [poveznica](https://freebuff.com) | Unesite Freebuff / Codebuff Auth Token (dobiven putem CLI prijave ili automatiziranog sakupljača). | +| `freeinference` | `freeinference` | FreeInference | API ključ, agregator | [poveznica](https://freeinference.org) | Besplatan pristup istraživanju bez kartice; podnositelji zahtjeva koji nisu s Harvarda zahtijevaju ručno odobrenje i nikakva brojčana kvota nije javno zajamčena. | +| `freemodel-dev` | `fmd` | FreeModel.dev | API ključ | [poveznica](https://freemodel.dev) | 300 USD besplatnih kredita pri prijavi — nije potrebna kreditna kartica. Pristupite GPT-5.4 i GPT-5.5 (najnoviji vodeći modeli OpenAI-ja) putem API-ja kompatibilnog s OpenAI-jem. | +| `freetheai` | `fta` | FreeTheAi | API ključ, agregator | [poveznica](https://freetheai.xyz) | Pridružite se FreeTheAi Discordu kako biste dobili svoj besplatni API ključ. | +| `friendliai` | `friendli` | FriendliAI | API ključ | [poveznica](https://friendli.ai) | Besplatni sloj za serverless inferenciju — nije potrebna kreditna kartica | +| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API ključ, agregator | [poveznica](https://g4f.space) | Ispecite anonimne "cake" kredite na g4f.dev/chat, ili koristite g4f.dev članski ključ (kreirajte ga na g4f.dev/members.html). | +| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API ključ, agregator | [poveznica](https://g4f.space) | Ispecite anonimne "cake" kredite na g4f.dev/chat, ili koristite g4f.dev članski ključ (kreirajte ga na g4f.dev/members.html). | +| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API ključ, agregator | [poveznica](https://g4f.space) | Ispecite anonimne "cake" kredite na g4f.dev/chat, ili koristite g4f.dev članski ključ (kreirajte ga na g4f.dev/members.html). | +| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API ključ, agregator | [poveznica](https://g4f.space) | Ispecite anonimne "cake" kredite na g4f.dev/chat, ili koristite g4f.dev članski ključ (kreirajte ga na g4f.dev/members.html). | +| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API ključ, agregator | [poveznica](https://g4f.space) | Ispecite anonimne "cake" kredite na g4f.dev/chat, ili koristite g4f.dev članski ključ (kreirajte ga na g4f.dev/members.html). | +| `galadriel` | `galadriel` | Galadriel | API ključ | [poveznica](https://galadriel.com) | ⚠️ **ZASTARJELO.** api.galadriel.ai više ne radi (čišćenje 2026-06-19); API za inferenciju čini se da je ukinut. | +| `gemini` | `gemini` | Gemini (Google AI Studio) | API ključ | [poveznica](https://aistudio.google.com) | Besplatni sloj dostupan putem Google AI Studija; primjenjuju se trenutne kvote po modelu i regionalna ograničenja | +| `getgoapi` | `ggo` | GoAPI | API ključ, agregator | [poveznica](https://api.getgoapi.com) | — | +| `gigachat` | `gigachat` | GigaChat (Sber) | API ključ | [poveznica](https://developers.sber.ru) | — | +| `gitlab` | `gitlab` | GitLab Duo PAT | API ključ | [poveznica](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab osobni pristupni token za javni Code Suggestions API. Konfigurirajte samostalno hostirani osnovni URL kada ne koristite gitlab.com. | +| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API ključ | [poveznica](https://opengateway.gitlawb.com) | Besplatni MiMo (xiaomi/mimo-v2.5) opozvan 2026-05 — Opengateway je sada pristupnik za kredite s plaćanjem po korištenju; nema ponavljajućeg besplatnog modela. | +| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API ključ | [poveznica](https://opengateway.gitlawb.com) | Besplatna Nemotron promocija završila je 2026-06 — GMI Cloud ruta sada je samo za kredite s plaćanjem po korištenju. | +| `glm` | `glm` | GLM Coding | API ključ | [poveznica](https://z.ai/subscribe) | — | +| `glm-cn` | `glmcn` | GLM Coding (Kina) | API ključ | [poveznica](https://open.bigmodel.cn) | — | +| `glmt` | `glmt` | GLM Thinking | API ključ | [poveznica](https://open.bigmodel.cn) | — | +| `greenpt` | `greenpt` | GreenPT | API ključ | [poveznica](https://greenpt.com) | Pretplata na API je besplatna za kreiranje; inferencija se naplaćuje po tokenu. Nije objavljena besplatna kvota za inferenciju. | +| `groq` | `groq` | Groq | API ključ | [poveznica](https://groq.com) | Besplatni plan: ograničenja po modelu (200K tokena/dan po chat modelu; pogledajte console.groq.com/docs/rate-limits za RPM/RPD) — bez načina plaćanja u evidenciji. | +| `haiper` | `hp` | Haiper | API ključ, video | [poveznica](https://haiper.ai) | Dobijte API ključ na haiper.ai/haiper-api | +| `hcnsec` | `hcnsec` | Huancheng javni API | API ključ | [poveznica](https://api.hcnsec.cn) | Dobijte API ključ na api.hcnsec.cn | +| `helixmind` | `helixmind` | HelixMind | API ključ, agregator | [poveznica](https://helixmind.online) | Prethodno kružeći navodi o 3 RPM/50 RPD i bez kartice nisu potvrđeni tijekom revizije 2026-08-02; trenutna kvota i naplata zahtijevaju provjeru računa. | +| `helyxai` | `helyxai` | Helyx AI | API ključ, agregator | [poveznica](https://helyxai.space) | Operativni besplatni plan dokumentira 100.000 tokena/dan; zasebna marketinška tvrdnja stranice o 2M+ je u sukobu i ne tretira se kao jamstvo kvote. | +| `heroku` | `heroku` | Heroku AI | API ključ, poduzeće | [poveznica](https://www.heroku.com) | — | +| `huggingface` | `hf` | HuggingFace | API ključ | [poveznica](https://huggingface.co) | Besplatni Inference API za tisuće modela (Whisper, VITS, SDXL…) | +| `hyperbolic` | `hyp` | Hyperbolic | API ključ | [poveznica](https://hyperbolic.xyz) | 1-5 USD probnih kredita pri prijavi za serverless inferenciju | +| `ideogram` | `ideo` | Ideogram | API ključ | [poveznica](https://ideogram.ai) | Dobijte API ključ na ideogram.ai/docs/api | +| `iflytek` | `iflytek` | iFlytek Spark | API ključ | [poveznica](https://xinghuo.xfyun.cn) | Dobijte API ključ na console.xfyun.cn | +| `inception` | `inception` | Inception | API ključ | [poveznica](https://docs.inceptionlabs.ai) | 10M besplatnih tokena pri prijavi, nije potrebna kreditna kartica. | +| `inference-net` | `inet` | Inference.net | API ključ | [poveznica](https://inference.net) | 25 USD besplatnih kredita pri prijavi plus dostupne istraživačke stipendije | +| `internlm` | `internlm` | InternLM (Intern-S1) | API ključ | [poveznica](https://internlm.intern-ai.org.cn/) | Besplatna mjesečna kvota ~1M ulaznih / 3M izlaznih tokena (~10 RPM) | +| `jina-ai` | `jina` | Jina AI (Foundation API) | API ključ, ugradnja/preraspodjela | [link](https://jina.ai) | Bearer API ključ za api.jina.ai — ugradnje, preraspodjelu, klasifikaciju, segmentaciju i pretraživanje. Ključevi s nadzorne ploče imaju prednost nad JINA_AI_API_KEY. Ovo nije kartica Reader / r.jina.ai i ne dohvaća URL-ove. | +| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API ključ | [link](https://jina.ai/reader) | Bearer API ključ za r.jina.ai URL-u-markdown (/v1/web/fetch only). Ne poslužuje /v1/embeddings niti /v1/rerank. Isti Jina token kao za Foundation API radi; OmniRoute ponovno koristi jina-ai ključ s nadzorne ploče ili JINA_AI_API_KEY kada je ova kartica prazna. | +| `kenari` | `kenari` | Kenari | API ključ | [link](https://kenari.id) | Koristite svoj Kenari API ključ (kn-...) u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://kenari.id/v1. | +| `kie` | `kie` | KIE.AI | API ključ | [link](https://kie.ai) | — | +| `kilo-gateway` | `kg` | Kilo Gateway | API ključ, agregator | [link](https://kilo.ai) | — | +| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | API ključ | [link](https://platform.kimi.ai?aff=omniroute) | — | +| `kimi-coding-apikey` | `kmca` | Kimi Code API ključ | API ključ | [link](https://www.kimi.com/code?aff=omniroute) | — | +| `lambda-ai` | `lambda` | Lambda AI | API ključ | [link](https://lambda.ai) | — | +| `laozhang` | `lz` | LaoZhang AI | API ključ, agregator | [link](https://api.laozhang.ai) | — | +| `leonardo` | `leo` | Leonardo AI | API ključ, video | [link](https://leonardo.ai) | Nabavite API ključ na leonardo.ai/developer | +| `liquid` | `liquid` | Liquid AI | API ključ | [link](https://liquid.ai) | Nabavite API ključ na liquid.ai | +| `literouter` | `literouter` | LiteRouter | API ključ, agregator | [link](https://literouter.com) | Besplatne varijante modela koriste sufiks :free; dnevna ograničenja kredita variraju ovisno o modelu, a besplatan unos ograničen je na 5.000 tokena. | +| `llamagate` | `llamagate` | LlamaGate | API ključ | [link](https://llamagate.ai) | — | +| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API ključ, agregator | [link](https://llm.kiwi) | Besplatan plan izlaže auto i hrLLM; objavljeno ograničenje od 40 zahtjeva/sat primjenjuje se na hrLLM. | +| `llm7` | `llm7` | LLM7.io | API ključ | [link](https://llm7.io) | Koristite bilo koji ne-prazan ključ (na primjer 'unused'). Ako stariji ugrađeni modeli vraćaju model_unavailable, koristite Dostupni modeli → Uvezi iz /models ili Automatska sinkronizacija; provjereni aktivni model: gemini-3.1-flash-lite. | +| `llmgateway` | `llmgateway` | LLM Gateway | API ključ, agregator | [link](https://llmgateway.io) | Hosted Free plan: modeli s besplatnom cijenom ograničeni su na 5 zahtjeva svakih 10 minuta kada račun nema kredita. | +| `logfare` | `logfare` | Logfare | API ključ, agregator | [link](https://logfare.ai) | Kreirajte besplatan račun na https://logfare.ai/register (korisničko ime/lozinka, bez provjere e-pošte) kako biste odmah dobili API ključ, a zatim ga ovdje zalijepite kao Bearer token. | +| `longcat` | `lc` | LongCat AI | API ključ | [link](https://longcat.chat/platform/docs) | Besplatno: jednokratna dodjela 10M tokena nakon registracije računa + KYC provjere (LongCat-2.0). Samo jednokratno — nije ponavljajuća dnevna/mjesečna naknada. | +| `magnific` | `freepik` | Magnific | API ključ, slika | [link](https://www.magnific.com) | Nabavite API ključ na magnific.com/user/api-keys (zaglavlje x-magnific-api-key). Stariji Freepik razvojni ključevi i dalje rade. | +| `maritalk` | `maritalk` | Maritalk | API ključ | [link](https://www.maritaca.ai) | — | +| `meganova-ai` | `meganova-ai` | MegaNova AI | API ključ, agregator | [link](https://meganova.ai) | Besplatna registracija bez kartice. Objavljene kvote Tier 1 po modelu iznose ukupno 550 zahtjeva/dan; one nisu zajednički globalni bazen, a plaćeni prekoračenje može se primijeniti ako je omogućeno. | +| `meta-llama` | `meta` | Meta Llama API | API ključ | [link](https://llama.developer.meta.com) | — | +| `minimax` | `minimax` | Minimax Coding | API ključ, video | [link](https://www.minimax.io) | — | +| `minimax-cn` | `minimax-cn` | Minimax (Kina) | API ključ | [link](https://www.minimaxi.com) | — | +| `mistral` | `mistral` | Mistral | API ključ | [link](https://mistral.ai) | Besplatna eksperimentalna razina: pristup svim modelima s ograničenom brzinom, nije potrebna kreditna kartica | +| `mixedbread` | `mxbai` | Mixedbread AI | API ključ | [link](https://www.mixedbread.com) | Bearer API ključ za Mixedbread embeddings API. | +| `mixlayer` | `mixlayer` | Mixlayer | API ključ, agregator | [link](https://www.mixlayer.com) | Model qwen/qwen3.5-4b-free je besplatan za prototipiranje i ima ograničenu brzinu; nije potvrđen fiksni javni RPM ili dnevna kvota. | +| `mnn-ai` | `mnn-ai` | MNN AI | API ključ, agregator | [link](https://mnnai.ru) | Besplatan plan: 1 USD mjesečnih kredita, 10 RPM i pristup samo modelima označenim kao Besplatni. | +| `modal` | `mdl` | Modal | API ključ, poduzeće | [link](https://modal.com/docs) | Koristite bearer token koji štiti vaše Modal implementacije, ako je omogućeno. Osnovni URL trebao bi pokazivati na vašu OpenAI-kompatibilnu Modal aplikaciju, na primjer https://--.modal.run/v1. | +| `modelscope` | `ms` | ModelScope | API ključ | [link](https://modelscope.cn) | Besplatna razina putem ModelScope API-Inference — potreban je Alibaba račun. | +| `monsterapi` | `monster` | MonsterAPI | API ključ | [link](https://monsterapi.ai) | ⚠️ **ZASTARJELO.** Monster API je prestao s radom 30.06.2026. Koristite alternativne OpenAI-kompatibilne pružatelje. | +| `moonshot` | `moonshot` | Kimi | API ključ | [link](https://platform.kimi.ai?aff=omniroute) | — | +| `morph` | `morph` | Morph | API ključ | [link](https://morphllm.com) | Besplatna razina: 250K kredita/mjesec, 0 USD | +| `muse-code` | `mc` | Muse Code (Meta) | API ključ | [link](https://github.com/meta-llama/llama-stack) | Koristite svoju META_API_KEY env varijablu kao Bearer token. Muse Code CLI koristi OpenAI Responses API wire format (POST /responses). | +| `naga-ac` | `naga` | Naga.ac | API ključ, agregator | [link](https://naga.ac) | Nabavite API ključ na naga.ac — dostupna je registracija putem Google/GitHub/Discord. | +| `naga-ai` | `naga-ai` | Naga AI | API ključ, agregator | [link](https://naga.ac) | Modeli označeni s :free javno su navedeni, ali numerička kvota nije potvrđena. Naga-ina politika upozorava da se upiti i izlazi besplatnog sloja mogu prikupljati ili koristiti za obuku. | +| `nanogpt` | `nanogpt` | NanoGPT | API ključ | [link](https://nano-gpt.com) | — | +| `nara` | `nara` | NaraRouter | API ključ | [link](https://bynara.id) | Kreirajte besplatni NaraRouter račun, povežite svoj Telegram (obavezno prije /v1 odgovora), zatim ovdje zalijepite ključ kao Bearer token. | +| `navy` | `navy` | NavyAI | API ključ | [link](https://api.navy) | Kreirajte besplatni API ključ s NavyAI nadzorne ploče, zatim ga ovdje zalijepite kao Bearer token. | +| `nebius` | `nebius` | Nebius AI | API ključ | [link](https://nebius.com) | ~$1 probnih kredita pri prijavi za testiranje API-ja | +| `nlpcloud` | `nlpc` | NLP Cloud | API ključ | [link](https://docs.nlpcloud.com) | Koristite svoj NLP Cloud API ključ u Authorization: Token . OmniRoute prema zadanim postavkama cilja chatbot krajnju točku na https://api.nlpcloud.io/v1/gpu//chatbot. | +| `nomic` | `nomic` | Nomic | API ključ | [link](https://nomic.ai) | Nabavite API ključ na atlas.nomic.ai | +| `nous-research` | `nous` | Nous Research | API ključ | [link](https://portal.nousresearch.com/help) | Koristite svoj Nous Portal API ključ. OmniRoute cilja službenu OpenAI-kompatibilnu krajnju točku za inferenciju na https://inference-api.nousresearch.com/v1. | +| `novita` | `novita` | Novita AI | API ključ, video, agregator | [link](https://novita.ai) | $0.50 probnih kredita pri prijavi (vrijedi oko 1 godine) | +| `nscale` | `nscale` | nScale | API ključ | [link](https://nscale.com) | $5 besplatnih kredita pri prijavi za testiranje inferencije | +| `nube` | `nube` | Nube.sh | API ključ | [link](https://nube.sh) | — | +| `nvidia` | `nvidia` | NVIDIA NIM | API ključ | [link](https://build.nvidia.com) | Besplatan razvojni pristup: ~40 RPM, 70+ modela (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | +| `oci` | `oci` | OCI Generative AI | API ključ, poduzeće | [link](https://www.oracle.com/artificial-intelligence/generative-ai) | Koristite svoj OCI Generative AI API ključ ili IAM bearer token. Osnovni URL može biti https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | +| `ofoxai` | `ofoxai` | OfoxAI | API ključ, agregator | [link](https://ofox.ai) | Trenutni katalog oglašava 10+ besplatnih modela bez javne numeričke kvote; pregledajte uzvodno porijeklo, uvjete zadržavanja i obuke prije produkcijske upotrebe. | +| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API ključ | [link](https://ollama.com/settings/keys) | — | +| `oneminai` | `1min` | 1min.AI | API ključ | [link](https://1min.ai) | Kreirajte API ključ na https://docs.1min.ai/docs/api/create-api-key, zatim ga ovdje zalijepite. | +| `openadapter` | `oad` | OpenAdapter | API ključ | [link](https://openadapter.dev) | Koristite svoj OpenAdapter API ključ u Authorization: Bearer sk-cv-. Potpuno OpenAI-kompatibilan. Osnovni URL API-ja: https://api.openadapter.in/v1. | +| `openai` | `openai` | OpenAI | API ključ | [link](https://platform.openai.com) | — | +| `opencode-go` | `opencode-go` | OpenCode Go | API ključ | [link](https://opencode.ai/go) | — | +| `opencode-zen` | `opencode-zen` | OpenCode Zen | API ključ | [link](https://opencode.ai/zen) | — | +| `openference-api` | `ofa` | Openference API | API ključ | [link](https://openference.com) | Besplatni sloj: uključuje Qwen3.8 27b i Llama 3.2 3B — pogledajte openference.com/pricing za trenutne uvjete | +| `openrouter` | `openrouter` | OpenRouter | API ključ, agregator | [link](https://openrouter.ai) | Besplatni modeli po $0/token s :free sufiksom - 20 RPM / 200 RPD | +| `openvecta` | `openvecta` | OpenVecta | API ključ | [link](https://openvecta.com) | Besplatni krediti pri prijavi za OpenAI-kompatibilnu inferenciju preko LLM-ova, ugradnji i modela zaključivanja | +| `opper` | `opper` | Opper | API ključ, agregator | [link](https://opper.ai) | — | +| `orcarouter` | `orcarouter` | OrcaRouter | API ključ | [link](https://www.orcarouter.ai) | — | +| `ovhcloud` | `ovh` | OVHcloud AI | API ključ | [link](https://www.ovhcloud.com) | — | +| `perplexity` | `pplx` | Perplexity | API ključ | [link](https://www.perplexity.ai) | — | +| `perplexity-agent` | `pplx-agent` | Perplexity Agent | API ključ | [link](https://www.perplexity.ai) | Koristite svoj Perplexity API ključ. OmniRoute usmjerava ID-ove modela Agent API-ja kroz Perplexity-jevu krajnju točku kompatibilnu s Responses. | +| `piapi` | `pi` | PiAPI | API ključ, agregator | [link](https://piapi.ai) | — | +| `pioneer` | `pn` | Pioneer AI | API ključ | [link](https://pioneer.ai) | $75 besplatnih kredita za korištenje — nije potrebna kreditna kartica | +| `plamo` | `plamo` | PLaMo | API ključ | [link](https://plamo.preferredai.jp/api) | — | +| `poe` | `poe` | Poe | API ključ, agregator | [link](https://creator.poe.com/api-reference) | Bearer API ključ za Poe OpenAI-kompatibilan API. | +| `poixe-ai` | `poixe-ai` | Poixe AI | API ključ, agregator | [link](https://poixe.com) | Trenutna javna besplatna ograničenja su mala i specifična za grupu modela: 2 RPM/5 RPD za modele velike šalice i 20 RPM/50 RPD za modele male šalice. | +| `pollinations` | `pol` | Pollinations AI | API ključ, video | [link](https://pollinations.ai) | Anonimni pristup/pristup bez ključa dokumentiranim besplatnim modelima je najbolji mogući. Lokalna v3.8.50 provjera (2026-07-31) vratila je 401 putem OmniRoute-a i Cloudflare 1010 na izravnim uzvodnim sondama iz iste mreže. Premium modeli i dalje zahtijevaju Pollinations API ključ s enter.pollinations.ai. | +| `poolside` | `poolside` | Poolside | API ključ | [link](https://poolside.ai) | Laguna S 2.1 i XS 2.1 su besplatni tijekom pregleda; javna numerička kvota nije objavljena. | +| `predibase` | `predibase` | Predibase | API ključ | [link](https://predibase.com) | ⚠️ **ZASTARJELO.** serving.app.predibase.com više se ne razrješava (provjera 2026-06-19); čini se da je API za upravljano posluživanje ukinut. | +| `publicai` | `publicai` | PublicAI | API ključ | [link](https://publicai.co) | Zahtijeva API ključ — jednokratni kredit za prijavu, zatim plaćeno | +| `qianfan` | `qianfan` | Baidu Qianfan | API ključ | [link](https://cloud.baidu.com/product-s/qianfan_home) | — | +| `qiniu` | `qiniu` | Qiniu | API key | [link](https://www.qiniu.com) | — | +| `qwen-cloud` | `qwc` | Qwen Cloud | API key | [link](https://www.qwencloud.com/) | — | +| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API key | [link](https://www.qwencloud.com/pricing/token-plan) | — | +| `recraft` | `recraft` | Recraft | API key, image | [link](https://recraft.ai) | — | +| `regolo` | `regolo` | Regolo AI | API key | [link](https://regolo.ai) | Nabavite svoj Regolo API ključ s regolo.ai, zatim ga zalijepite ovdje kao Bearer token. | +| `reka` | `reka` | Reka | API key | [link](https://docs.reka.ai/chat/overview) | Koristite svoj Reka API ključ. OmniRoute podržava OpenAI-kompatibilan osnovni URL https://api.reka.ai/v1 i šalje zaglavlja Authorization i X-Api-Key radi kompatibilnosti. | +| `requesty` | `requesty` | Requesty | API key | [link](https://requesty.ai) | Besplatni sloj ~200 zahtjeva/dan - pristupnik za usmjeravanje više modela (300+ modela) | +| `routeway` | `routeway` | Routeway | API key | [link](https://routeway.ai) | Kreirajte besplatni API ključ na routeway.ai, zatim ga zalijepite ovdje kao Bearer token. | +| `runwayml` | `runway` | Runway | API key, video | [link](https://docs.dev.runwayml.com) | Koristite svoj Runway API ključ u Authorization: Bearer . OmniRoute cilja trenutni Runway API na https://api.dev.runwayml.com/v1 i automatski šalje potrebno X-Runway-Version zaglavlje. | +| `sambanova` | `samba` | SambaNova | API key | [link](https://sambanova.ai) | 5 USD besplatnih kredita pri prijavi (valjanost 30 dana), nije potrebna kreditna kartica | +| `sap` | `sap` | SAP Generative AI Hub | API key, enterprise | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Koristite svoj SAP AI Core bearer token. Osnovni URL može biti vaš AI_API_URL korijen ili deploymentUrl iz Generative AI Huba. | +| `sarvam` | `sarvam` | Sarvam AI | API key | [link](https://docs.sarvam.ai) | 1.000 ₹ besplatnih kredita pri prijavi — nikad ne istječu | +| `scaleway` | `scw` | Scaleway AI | API key | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M besplatnih tokena za nove račune — usklađeno s EU/GDPR (Pariz), Qwen3 235B & Llama 70B | +| `sealion` | `sealion` | SEA-LION | API key | [link](https://sea-lion.ai) | Prijavite se na sea-lion.ai putem Googlea (bez kartice, bez regionalnih ograničenja), kreirajte API ključ, zatim ga zalijepite ovdje. | +| `seekai` | `ska` | SeekAi | API key, aggregator | [link](https://seekai.cc) | Kreirajte API ključ na https://seekai.cc, zatim ga zalijepite ovdje kao Bearer token. | +| `segmind` | `segmind` | Segmind | API key, image, video | [link](https://segmind.com) | Koristite svoj Segmind API ključ u zaglavlju x-api-key. OmniRoute cilja https://api.segmind.com/v1/ i izravno vraća generirane bajtove slike/videa. | +| `sensenova` | `sensenova` | SenseNova | API key | [link](https://platform.sensenova.cn) | Nabavite API ključ na platform.sensenova.cn | +| `siliconflow` | `siliconflow` | SiliconFlow | API key | [link](https://cloud.siliconflow.com) | 1 USD besplatnih kredita plus trenutno navedeni modeli od 0 USD nakon provjere identiteta; dostupnost i ograničenja se mogu promijeniti | +| `snowflake` | `snowflake` | Snowflake Cortex | API key, enterprise | [link](https://www.snowflake.com) | — | +| `sparkdesk` | `sparkdesk` | SparkDesk | API key | [link](https://xinghuo.xfyun.cn) | Nabavite API ključ na console.xfyun.cn | +| `speka` | `speka` | Speka AI | API key, aggregator | [link](https://speka.me) | Besplatni plan: 1 USD mjesečne upotrebe, 10 RPM, jedan API ključ i pristup otvorenim modelima i igralištu; nije potrebna kartica. | +| `stability-ai` | `stability` | Stability AI | API key, image | [link](https://stability.ai) | — | +| `stepfun` | `stepfun` | StepFun | API key | [link](https://stepfun.com) | Nabavite API ključ na platform.stepfun.com | +| `sumopod` | `sumopod` | SumoPod | API key | [link](https://ai.sumopod.com) | Koristite svoj SumoPod API ključ (sk-...) u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://ai.sumopod.com/v1. | +| `suno` | `suno` | Suno | API key | [link](https://suno.ai) | Zalijepite kolačić sesije s suno.ai (Clerk autentifikacija) | +| `synthetic` | `synthetic` | Synthetic | API key, aggregator | [link](https://synthetic.new) | — | +| `tabitoken` | `tabitoken` | TabiToken | API key, aggregator | [link](https://tabitoken.com) | — | +| `tencent` | `tencent` | Tencent Hunyuan | API key | [link](https://hunyuan.tencent.com) | Nabavite API ključ na console.cloud.tencent.com | +| `thebai` | `thebai` | TheB.AI | API key, aggregator | [link](https://theb.ai) | Bearer API ključ za TheB.AI OpenAI-kompatibilni pristupnik. | +| `tinyfish` | `tf` | TinyFish Fetch | API key | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key s agent.tinyfish.ai/api-keys | +| `together` | `together` | Together AI | API key, video | [link](https://www.together.ai) | — | +| `token-kiosk` | `tk` | Token Kiosk | API key | [link](https://agent-router.gaib.ai) | Koristite svoj Token Kiosk API ključ u Authorization: Bearer . Potpuno OpenAI-kompatibilni pristupnik. Osnovni URL API-ja: https://agent-router.gaib.ai/v1. | +| `tokenreply` | `tokenreply` | TokenReply | API key, aggregator | [link](https://www.tokenreply.com) | Modeli označeni kao besplatni imaju dnevna ograničenja specifična za model i kampanju; nije objavljena fiksna globalna besplatna kvota. | +| `tokenrouter` | `trk` | TokenRouter | API key | [link](https://tokenrouter.com) | Koristite svoj TokenRouter API ključ u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://api.tokenrouter.com/v1. | +| `topaz` | `topaz` | Topaz | API key, image | [link](https://topazlabs.com) | — | +| `typhoon` | `typhoon` | Typhoon | API key | [link](https://docs.opentyphoon.ai) | Besplatni API ključ s ograničenjem brzine od 5 zahtjeva/s i 200 zahtjeva/min. | +| `uc-direct` | `ucd` | UC Direct (uncensored.com) | API key | [link](https://uncensored.com) | Koristite svoj uncensored.com Developer API ključ (uai_sk_live_...). OmniRoute ga šalje kao X-api-key zaglavlje na OpenAI-kompatibilnu https://api.uncensored.com/api/v1 krajnju točku. Ključ nikada ne istječe. Ovo je površina s mjerenjem/kreditima; pretplatnički chat bez mjerenja je zaseban 'uc' pružatelj. | +| `udio` | `udio` | Udio | API key | [link](https://udio.com) | Zalijepite kolačić sesije s udio.com (Supabase autentifikacija) | +| `unorouter` | `unorouter` | UnoRouter | API key, aggregator | [link](https://unorouter.ai) | Modeli sa sufiksom :free ne terete stanje; ograničenje je 1 zahtjev/minuti po besplatnom modelu po korisniku. | +| `upstage` | `upstage` | Upstage | API key | [link](https://www.upstage.ai) | — | +| `v0-vercel` | `v0` | v0 (Vercel) | API key | [link](https://v0.dev) | — | +| `venice` | `venice` | Venice.ai | API key | [link](https://venice.ai) | — | +| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API key, aggregator | [link](https://vercel.com/docs/ai-gateway) | — | +| `vertex` | `vertex` | Vertex AI | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Navedite JSON servisnog računa, OAuth pristupni token, Vertex Express API ključ ili autorizacijski ključ vezan uz servisni račun. Express način rada podržava samo Gemini; partnerski modeli zahtijevaju vjerodajnice ograničene na projekt. | +| `vertex-partner` | `vp` | Vertex AI Partners | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Navedite JSON servisnog računa ili OAuth vjerodajnice. Autorizacijski ključ vezan uz servisni račun također podržava otkrivanje, ali partnersko zaključivanje dodatno zahtijeva ID Google Cloud projekta. Standardni Express ključevi podržavaju samo Gemini. | +| `void-ai` | `void-ai` | Void AI | API key, aggregator | [link](https://voidai.app) | Javni katalog modela označava neke modele kao one koji zahtijevaju besplatan plan, ali pristup je uvjetovan i nije potvrđena numerička kvota. | +| `volcengine` | `volcengine` | Volcengine | API key | [link](https://www.volcengine.com) | — | +| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API key | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Povežite svoj Volcano Engine račun ili koristite pretplatnički API ključ za Ark Agent Plan. | +| `volcengine-coding-plan` | `vecp` | Volcengine Ark Coding Plan | API key | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/coding-plan) | Povežite svoj Volcano Engine račun ili koristite pretplatnički API ključ za Ark Coding Plan. | +| `voyage-ai` | `voyage` | Voyage AI | API key, embed/rerank | [link](https://www.voyageai.com) | Bearer API ključ za Voyage AI ugradnje i rerank API-je. | +| `wafer` | `wafer` | Wafer AI | API key | [link](https://wafer.ai) | — | +| `wandb` | `wandb` | Weights & Biases Inference | API key | [link](https://wandb.ai) | — | +| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API key, enterprise | [link](https://www.ibm.com/products/watsonx-ai) | Koristite svoj watsonx bearer token. Osnovni URL može biti https://.ml.cloud.ibm.com/ml/gateway/v1/ ili samostalno upravljana /ml/gateway/v1 krajnja točka. | +| `writer` | `writer` | Writer | API key | [link](https://dev.writer.com) | — | +| `x5lab` | `x5lab` | X5Lab | API key | [link](https://x5lab.dev) | Koristite svoj X5Lab API ključ (x5-...) u Authorization: Bearer . Potpuno kompatibilno s OpenAI-jem. Osnovni URL API-ja: https://api.x5lab.dev/v1. | +| `xai` | `xai` | xAI (Grok) | API key | [link](https://x.ai) | Koristite službeni xAI API ključ ili se prijavite putem xAI OAuth-a. Grok Build JWT sesije ostaju zaseban pružatelj. | +| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API key | [link](https://mimo.mi.com) | — | +| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API key | [link](https://mimo.mi.com) | — | +| `xkiro` | `xkiro` | xKiro | API key, aggregator | [link](https://xkiro.com) | Kreirajte besplatan račun na xkiro.com i zalijepite ključ ovdje (Bearer; x-api-key je također prihvaćen). | +| `yi` | `yi` | Yi (01.AI) | API key | [link](https://01.ai) | Nabavite API ključ na platform.lingyiwanwu.com | +| `yolo-auto` | `yolo-auto` | Yolo-Auto | API key, aggregator | [link](https://yolo-auto.com) | Besplatan API pristup je ograničen brojem zahtjeva i namijenjen je testiranju; nije objavljena numerička dnevna kvota i besplatan pristup nije obećan neograničeno. | +| `zai` | `zai` | Z.AI | API key | [link](https://open.bigmodel.cn) | — | +| `zenmux` | `zm` | ZenMux | API key | [link](https://zenmux.ai) | Koristite svoj ZenMux API ključ u Authorization: Bearer . ZenMux je potpuno kompatibilan s OpenAI-jem. Osnovni URL: https://zenmux.ai/api/v1. | +| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API key, aggregator | [link](https://www.zerolimitai.com) | Oglašava se privremena besplatna proba, ali službene stranice se razlikuju između 3 i 7 dana; tvrdnja o 100 poziva/dan ne tretira se kao trajna. | +| `zylo-api` | `zylo` | Zylo API | API key, aggregator | [link](https://zyloai.net) | Osnovni plan: 10 RPM, 7.200 zahtjeva/dan i 200.000 tokena/dan; ograničeno na osnovne tekstualne modele. | ## Lokalni pružatelji (14) diff --git a/docs/i18n/hr/docs/routing/REASONING_REPLAY.md b/docs/i18n/hr/docs/routing/REASONING_REPLAY.md index 0102a28fa513..b9e094e4d5fb 100644 --- a/docs/i18n/hr/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/hr/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ Međutim, uobičajeni klijenti (Cursor, Cline, Roo Code, OpenAI SDK) uklanjaju ` ## Arhitektura ``` -Interakcija N (asistent generira): +Potez N (asistent generira): → odgovor sadrži reasoning_content + tool_calls → ako requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - zapisuje (memorija + DB), indeksirano prema svakom tool_call.id - → prosljeđuje odgovor klijentu (koji može, ali ne mora zadržati zaključivanje) + zapisuje (memorija + DB), ključano po svakom tool_call.id + → prosljeđuje odgovor klijentu (koji može, ali i ne mora zadržati obrazloženje) -Interakcija N+1 (klijent šalje sljedeći zahtjev): - → prevoditelj otkriva: requiresReasoningReplay(provider, model) === true - → za svaku poruku asistenta koja ima tool_calls, ali nema reasoning_content: +Potez N+1 (klijent šalje nastavak): + → prevoditelj detektira: requiresReasoningReplay(provider, model) === true + → za svaku poruku asistenta s tool_calls i bez reasoning_content: lookupReasoning(toolCalls[0].id) → memorija → DB - pogodak → msg.reasoning_content = cached; recordReplay() - promašaj → msg.reasoning_content = "" (naslijeđeno rezervno ponašanje za starije modele DeepSeek) - → nadređeni sustav vidi dosljednu povijest → nema pogreške 400 + pogodak → msg.reasoning_content = keširano; recordReplay() + promašaj → msg.reasoning_content = "" (nasljedni povratak za stariji DeepSeek) + → uzvodni sustav vidi dosljednu povijest → nema 400 ``` -Bilježenje se odvija u `open-sse/handlers/chatCore.ts` (na dva mjesta, na dvama mjestima poziva `cacheReasoningFromAssistantMessage`). Ponovna reprodukcija odvija se u `open-sse/translator/index.ts` nakon pretvorbe sheme, ali prije otpreme. +Hvatanje se događa u `open-sse/handlers/chatCore.ts` (na dva mjesta, na dva pozivna mjesta `cacheReasoningFromAssistantMessage`). Ponovna reprodukcija (replay) događa se u `open-sse/translator/index.ts` nakon prisile sheme, ali prije otpreme. + +Obični (bez poziva alata) potezi asistenta ključani su drugačije: `buildAssistantMessageCacheKey()` sažima opseg sesije plus normalizirani transkript u OpenAI formatu do tog poteza, jer DeepSeek zahtijeva obrazloženje _svakog_ prethodnog poteza kada su `tools` prisutni. Za ciljeve Responses-API-ja (na primjer `opencode-go/deepseek-v4-flash`, usmjereno na `/responses`) uzvodno tijelo nosi `input`, a ne `messages`, pa `translateRequest()` (`open-sse/translator/index.ts`) izvještava o pivot transkriptu koji je sažela putem opcije povratnog poziva, a mjesta hvatanja sažimaju taj isti transkript. Prolaz ponovne reprodukcije (replay) odgovora pokreće se na OpenAI pivotu za svaki izvorni format, tako da se i klijenti Anthropic Messages (Claude → OpenAI → Responses) također ponovno reproduciraju. ## Pohrana — hibridna memorija + SQLite diff --git a/docs/i18n/hr/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/hr/docs/security/SOCKET_DEV_FINDINGS.md index 75a6e5e8f4b5..0fd78b13f6c7 100644 --- a/docs/i18n/hr/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/hr/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,23 @@ --- -Ovaj je dokument potvrda autora održavanja za šest nalaza -`AI-detected potential malware` prijavljenih za `omniroute@3.8.5` i -mjere ublažavanja primijenjene u `omniroute@3.8.6`. Postoji kako bi: - -1. Operateri sigurnosnih procesa imali jedinstvenu referencu koju mogu navesti kada trebaju - procijeniti nalaze u odnosu na stvarni izvorni kod. -2. Budući AI skeneri mogli prepoznati tvrdnju koju je potpisao održavatelj da je svaka - označena putanja namjerna, opcionalna i dokumentirana. -3. Imali pisani zapis o tome _zašto_ je svako mjesto poziva oblikovano na taj način — - kako buduća refaktorizacija ne bi slučajno ponovno uvela obrazac koji +> **Napomena o opsegu:** `socket.yml` konfigurira Socket.dev-ovo skeniranje npm artefakta nakon objave na strani registra (putanje za ignoriranje za sadržaj koji se ne isporučuje, kao što su `tests/`, `docs/` i izvješća o izgradnji). Ne povezuje CI/PR spojna vrata — nijedan tijek rada u `.github/workflows`, nijedna skripta `package.json` i nijedan cilj `Makefile` ne poziva Socket.dev. + +Ovaj dokument je potvrda koju je autor održavatelj izdao za šest +nalaza `AI-detected potential malware` podignutih protiv `omniroute@3.8.5` i +ublažavanja primijenjenih u `omniroute@3.8.6`. Postoji kako bi: + +1. Operateri sigurnosnog cjevovoda imali jednu referencu za citiranje kada trebaju + procijeniti nalaze u odnosu na stvarni izvor. +2. Budući AI skeneri mogu preuzeti tvrdnju koju je potpisao održavatelj da je svaka + označena putanja namjerna, opt-in i dokumentirana. +3. Imamo pisani zapis o _zašto_ je svako mjesto poziva oblikovano na način na koji jest — + tako da buduće refaktoriranje slučajno ne ponovno uvede otisak prsta koji je namjerno uklonjen. -Ako upravljate skenerom koji ponovno označi bilo koje od mjesta poziva u nastavku nakon što -mjere ublažavanja iz v3.8.6 budu objavljene, otvorite prijavu s tragom skeniranja i -ovdje ćemo proširiti potvrdu. +Ako upravljate skenerom koji ponovno označava bilo koje od dolje navedenih mjesta poziva nakon što su +isporučena ublažavanja v3.8.6, otvorite problem s tragom skeniranja i +proširit ćemo potvrdu ovdje. --- diff --git a/docs/i18n/hu/SECURITY.md b/docs/i18n/hu/SECURITY.md index bbcd905625f2..fefa8c27f31f 100644 --- a/docs/i18n/hu/SECURITY.md +++ b/docs/i18n/hu/SECURITY.md @@ -220,35 +220,41 @@ Ezeket a szabályokat az eszközök és az ellenőrzést végző személyek érv 10. **Az `exec()` / `spawn()` futásidejű értékeit az `env` opción keresztül adja át** — soha ne illesszen be külső elérési utakat vagy nem megbízható értékeket karakterlánc-interpolációval shellen keresztül futtatott szkriptekbe. Hivatkozás: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Részesítse előnyben az alapértelmezés szerint biztonságos könyvtárakat** — lásd: [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Saját megoldás készítése előtt ezeket használja. -## Ellátásilánc-ellenőrzők megállapításai (Socket.dev / Snyk / hasonlók) +## Az ellátási lánc ellenőrzőjének megállapításai (Socket.dev / Snyk / hasonlók) -A közzétett `omniroute` npm-összetevő tartalmazza a Next.js `output: "standalone"` -buildjét, ami azt jelenti, hogy minden útvonalkezelő — beleértve a dokumentált, emelt jogosultságú -funkciókat (MITM, Zed-importálás, Cloud Sync, beágyazott szolgáltatásfelügyelő) — bekerül -a `.next/server/*.js` minifikált darabjaiba. A heurisztikus ellátásilánc-ellenőrzők -gyakran kártevőszignatúrákkal vetik össze ezeket a darabokat. +> **Hatókörre vonatkozó megjegyzés:** A tároló gyökerében található `socket.yml` kizárólag a `projectIgnorePaths` beállítást határozza meg a Socket.dev által a közzétett npm-artifacton, a közzététel után végzett regisztrációs oldali vizsgálathoz — ez nem kikényszerített CI-/PR-egyesítési kapu. A `.github/workflows` egyetlen munkafolyamata, a `package.json` egyetlen szkriptje és a `Makefile` egyetlen célja sem hívja meg a Socket.dev szolgáltatást. -Az általunk használt ellenőrző konfigurációja a repository gyökerében található -[`socket.yml`](socket.yml) fájlban van (Socket.dev GitHub App v2 formátum — lásd: -). Kifejezetten kizárja a -nem terjesztett könyvtárakat (`tests/`, `_tasks/`, `_references/`, `_ideia/`, -`_mono_repo/`, `docs/` stb.), így az ellenőrző csak azokról a kódútvonalakról -készít jelentést, amelyek ténylegesen eljutnak a közzétett csomag felhasználóihoz — magát az ellenőrzést a fájlt -beolvasó Socket GitHub App végzi, nem pedig a repository valamelyik munkafolyamata. +A közzétett `omniroute` npm-artifact tartalmazza a Next.js `output: "standalone"` +buildjét, ami azt jelenti, hogy minden útvonalkezelő — beleértve a dokumentált, +emelt jogosultságú funkciókat (MITM, Zed-importálás, Cloud Sync, beágyazott +szolgáltatásfelügyelő) — a `.next/server/*.js` minimalizált darabjaiba kerül. +A heurisztikus ellátásilánc-ellenőrzők gyakran kártevőszignatúrákkal vetik össze +ezeket a darabokat mintázatillesztéssel. -Minden megállapítási kategóriához megállapításonkénti karbantartói tanúsítást vezetünk: +Az általunk használt ellenőrzőkonfiguráció a tároló gyökerében található +[`socket.yml`](socket.yml) fájlban van (Socket.dev GitHub App v2-formátum — lásd: +). Kifejezetten kizárja a nem terjesztett +könyvtárakat (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, +`docs/` stb.), így az ellenőrző csak azokról a kódútvonalakról készít jelentést, +amelyek ténylegesen eljutnak a közzétett verzió felhasználóihoz — magát az +ellenőrzést az ezt a fájlt beolvasó Socket GitHub App végzi, nem pedig a jelen +tároló valamelyik munkafolyamata. + +Minden megállapítási kategóriához megállapításonként karbantartói igazolást +tartunk fenn: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - megállapításonkénti leképezés: forrásfájl ↔ megjelölt darab ↔ viselkedés ↔ + megállapításonkénti megfeleltetés: forrásfájl ↔ megjelölt darab ↔ viselkedés ↔ a v3.8.6 verzióban alkalmazott kockázatcsökkentés. -- A forrásban található `SECURITY-AUDITOR-NOTE:` blokkok minden megjelölt függvénynél - ugyanerre a dokumentumra hivatkoznak. - -Azoknak a felhasználóknak, akiknek a folyamatában nem enyhíthető a riasztás: a buildet az -`OMNIROUTE_BUILD_PROFILE=minimal npm run build` paranccsal kell elkészíteni. Ez a négy -érzékeny modult olyan helyettesítő modulokra cseréli, amelyek futásidőben HTTP 503 -`feature-disabled` választ adnak vissza, így az emelt jogosultságú kódútvonalak fizikailag -hiányoznak a csomagból. A közzétételi eljárást lásd a +- A forráskódban minden megjelölt függvénynél található `SECURITY-AUDITOR-NOTE:` + blokk ugyanarra a dokumentumra hivatkozik vissza. + +Azoknak a felhasználóknak, akiknek a pipeline-ja nem tudja enyhíteni a riasztást: +végezzék el a buildet az `OMNIROUTE_BUILD_PROFILE=minimal npm run build` +paranccsal. Ez a négy érzékeny modult olyan helyettesítő modulokra cseréli, +amelyek futásidőben HTTP 503 `feature-disabled` választ adnak, így az emelt +jogosultságú kódútvonalak fizikailag hiányoznak a csomagból. A közzétételi +eljárást lásd a [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) dokumentumban. diff --git a/docs/i18n/hu/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/hu/docs/architecture/CODEBASE_DOCUMENTATION.md index 40c45b2b1a2b..27f6f8d5ca42 100644 --- a/docs/i18n/hu/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/hu/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,8 @@ Célzott alkönyvtárakra felosztva: ## 4. `open-sse/` — Streamelési motor munkaterülete -Különálló npm-munkaterület, amely `@omniroute/open-sse` néven van közzétéve. Ez felel a kérések -feldolgozásáért, a végrehajtókért, a fordítókért, a szolgáltatásokért, az átalakítóért és az MCP-kiszolgálóért. +Különálló npm-munkaterület, amely `@omniroute/open-sse` néven van közzétéve. Ez kezeli a kérések +feldolgozását, a végrehajtókat, a fordítókat, a szolgáltatásokat, a transzformátort és az MCP-kiszolgálót. ``` open-sse/ @@ -449,35 +449,35 @@ open-sse/ ├── handlers/ Kéréskezelők (csevegés, beágyazások, hang, kép, …) ├── executors/ 108 szolgáltatóspecifikus HTTP-végrehajtó ├── translator/ Formátumkonverzió (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Responses API ↔ Chat Completions streamátalakító +├── transformer/ Responses API ↔ Chat Completions streamtranszformátor ├── services/ Több mint 80 szolgáltatásmodul (kombinációk, tartalék útvonalak, kvóták, identitás, …) -├── utils/ Streamelési segédeszközök, TLS-kliens, AWS SigV4, proxy fetch, … +├── utils/ Streamelési segédprogramok, TLS-kliens, AWS SigV4, proxys lekérés, … └── mcp-server/ MCP-kiszolgáló (3 átviteli mód, 33 hatókör, 110 eszköz) ``` ### 4.1 `open-sse/handlers/` -| Kezelő | Rendeltetés | -| ----------------------- | --------------------------------------------------------------------------------------------------- | -| `chatCore.ts` | Fő csevegési folyamat (gyorsítótár, sebességkorlátozás, kombinált útválasztás, végrehajtó indítása) | -| `responsesHandler.ts` | Az OpenAI Responses API belépési pontja | -| `embeddings.ts` | Beágyazások | -| `imageGeneration.ts` | Képgenerálás | -| `audioSpeech.ts` | Szöveg beszéddé alakítása | -| `audioTranscription.ts` | Beszéd szöveggé alakítása | -| `videoGeneration.ts` | Videógenerálás | -| `musicGeneration.ts` | Zenegenerálás | -| `rerank.ts` | Újrarangsorolás | -| `moderations.ts` | Moderálás | -| `search.ts` | Webes keresés | -| `sseParser.ts` | SSE-eseményelemző | -| `usageExtractor.ts` | Tokenszámok kinyerése a felsőbb szintű streamekből | -| `responseSanitizer.ts` | Szolgáltatóspecifikus zaj eltávolítása | -| `responseTranslator.ts` | Kapcsolóréteg a szolgáltatói válasz és a fordítási réteg között | +| Kezelő | Rendeltetés | +| ----------------------- | ---------------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Fő csevegési folyamat (gyorsítótár, sebességkorlátozás, kombinált útválasztás, végrehajtó meghívása) | +| `responsesHandler.ts` | Az OpenAI Responses API belépési pontja | +| `embeddings.ts` | Beágyazások | +| `imageGeneration.ts` | Képgenerálás | +| `audioSpeech.ts` | Szöveg beszéddé alakítása | +| `audioTranscription.ts` | Beszéd szöveggé alakítása | +| `videoGeneration.ts` | Videógenerálás | +| `musicGeneration.ts` | Zenegenerálás | +| `rerank.ts` | Újrarangsorolás | +| `moderations.ts` | Moderálás | +| `search.ts` | Webes keresés | +| `sseParser.ts` | SSE-eseményelemző | +| `usageExtractor.ts` | Tokenszámok kinyerése a felsőbb rétegbeli streamekből | +| `responseSanitizer.ts` | Szolgáltatóspecifikus zaj eltávolítása | +| `responseTranslator.ts` | Összekötő réteg a szolgáltatói válasz és a fordítóréteg között | ### 4.2 `open-sse/executors/` -108 szolgáltatói végrehajtó, amelyek mindegyike a `BaseExecutor` (`base.ts`) osztályt bővíti: +108 szolgáltatói végrehajtó, amelyek mindegyike a `BaseExecutor` (`base.ts`) osztályt terjeszti ki: `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, @@ -491,7 +491,7 @@ open-sse/ ### 4.3 `open-sse/translator/` -Központi és küllős fordítási modell (a központ az OpenAI). +Központi elosztó és kapcsolódó ágak szerinti fordítás (a központ az OpenAI). - **9 kérésfordító** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -505,39 +505,39 @@ Központi és küllős fordítási modell (a központ az OpenAI). `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, valamint segédmodultesztek. -- **Képkezelő segédmodulok** (`translator/image/sizeMapper.ts`). -- Felső szint: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. +- **Képkezelési segédmodulok** (`translator/image/sizeMapper.ts`). +- Legfelső szint: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-alapú Responses API ↔ Chat - Completions átalakító (a `responses/` útvonal minden egyéb esetet kezelő ágában használatos). + Completions konverter (a `responses/` útvonal általános kezelője használja). ### 4.5 `open-sse/services/` Kiemelt elemek (a teljes lista az `open-sse/services/` alatt található): -| Terület | Fájlok | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Kombinált útválasztás | `combo.ts` (19 stratégia), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Automatikus Combo-motor | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Hibatűrés | `accountFallback.ts` (lehűlési idő + zárolás), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kvóták | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Gyorsítótárazás | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Intelligens útválasztás | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Modellkezelés | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Tömörítés | `compression/` — a teljes tömörítőmotor bekötése | -| Tokenek + munkamenetek | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Szint / manifeszt | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / hálózat | `ipFilter.ts`, `webSearchFallback.ts` | -| Kötegek | `batchProcessor.ts` | -| Használat | `usage.ts` | +| Terület | Fájlok | +| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Kombinált útválasztás | `combo.ts` (19 stratégia), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Auto Combo motor | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Hibatűrés | `accountFallback.ts` (várakozási idő + zárolás), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kvóták | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Gyorsítótárazás | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Intelligens útválasztás | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Modellkezelés | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Tömörítés | `compression/` — a teljes tömörítési motor bekötése | +| Token + munkamenet | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Szint / manifeszt | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / hálózat | `ipFilter.ts`, `webSearchFallback.ts` | +| Kötegek | `batchProcessor.ts` | +| Használat | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 egyedi eszköz** van bekötve a `server.ts` fájlban (45 kanonikus a `schemas/tools.ts` fájlban + - memória-, készség-, GitHub-készség-, készlet-, játékosítási, bővítmény-, Notion-, Obsidian-, - helyi korpusz- és tömörítési modulok — az uniót a `countUniqueMcpTools` számolja). + memória-, készség-, GitHub-készség-, készlet-, gamifikációs, bővítmény-, Notion-, Obsidian-, + helyikorpusz- és tömörítési modulok — az uniót a `countUniqueMcpTools` számolja). - **3 átviteli mód**: stdio, HTTP Streamable, SSE. - **33 hatókör** van futásidőben kikényszerítve — az alaplista a `src/shared/constants/mcpScopes.ts` fájlban található, a teljes készlet pedig az egyes eszközmodulok által deklarált hatókörök uniója. - Auditnapló-tábla: `mcp_tool_audit` (az `audit.ts` tölti fel). @@ -553,10 +553,10 @@ Szolgáltatói nyilvántartások (`providerRegistry.ts`, `providerModels.ts`, `providerHeaderProfiles.ts`), formátumonkénti modellnyilvántartások (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), -identitássegédletek (`codexIdentity.ts`, `codexInstructions.ts`, +identitássegédek (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), -hitelesítőadat-segédletek (`credentialLoader.ts`, `codexClient.ts`) és felhőadapterek +hitelesítőadat-segédek (`credentialLoader.ts`, `codexClient.ts`) és felhőadapterek (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). diff --git a/docs/i18n/hu/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/hu/docs/architecture/RESILIENCE_GUIDE.md index b4a3a1cb8707..8b28a6a06ac5 100644 --- a/docs/i18n/hu/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/hu/docs/architecture/RESILIENCE_GUIDE.md @@ -70,12 +70,12 @@ Regresszióvédelmi teszt: `tests/unit/provider-cooldown-window-gate.test.ts`. **Hatókör:** egyetlen szolgáltatói kapcsolat/fiók/kulcs. -**Cél:** egy hibás kulcs kihagyása, miközben ugyanazon szolgáltató többi kapcsolata továbbra is kiszolgálja a kéréseket. +**Cél:** egy hibás kulcs kihagyása úgy, hogy ugyanazon szolgáltató többi kapcsolata továbbra is kiszolgálja a kéréseket. **Megvalósítás:** -- Elérhetetlenként való megjelölés: `src/sse/services/auth.ts::markAccountUnavailable()` -- Kiválasztás: `getProviderCredentials*` ugyanabban a fájlban +- Elérhetetlenként megjelölés: `src/sse/services/auth.ts::markAccountUnavailable()` +- Kiválasztás: `getProviderCredentials*` ugyanebben a fájlban - Várakozási idő kiszámítása: `open-sse/services/accountFallback.ts::checkFallbackError()` - Beállítások: `src/lib/resilience/settings.ts` @@ -90,72 +90,116 @@ Regresszióvédelmi teszt: `tests/unit/provider-cooldown-window-gate.test.ts`. - OAuth-alapérték: 5 s - API-kulcs-alapérték: 3 s -- API-kulcs 429: előnyben részesíti a felsőbb szintű szolgáltató `Retry-After`/visszaállítási fejléceit vagy az értelmezhető visszaállítási szöveget +- API-kulcsos 429: előnyben részesíti a felsőbb szintű szolgáltatás `Retry-After`/visszaállítási fejléceit vagy az értelmezhető visszaállítási szöveget - Visszalépés: `baseCooldownMs * 2 ** failureIndex` -**Túlterhelési roham elleni védelem:** megakadályozza, hogy az egyidejű hibák túlzottan meghosszabbítsák a várakozási időt, vagy kétszer növeljék a `backoffLevel` értékét. +**Kéréshullám elleni védelem:** megakadályozza, hogy az egyidejű hibák túlzottan meghosszabbítsák a várakozási időt, vagy kétszer növeljék a `backoffLevel` értékét. **Végállapotok (NEM várakozási idők):** -- `banned` — tiltott kulcsszó/fióktiltás észlelésekor kerül beállításra (lásd: [BAN_DETECTION](../security/BAN_DETECTION.md)), valamint három egymást követő, kérésenkénti felsőbb szintű elutasítás után (`request_rejected`, például Anthropic OAuth 403 „Request not allowed” — `open-sse/services/requestRejectedStreak.ts`); egyetlen elutasítás csak várakozási állapotba helyezi a kapcsolatot -- `expired` (korlátozott számú újrapróbálkozás után válik végállapottá — `EXPIRED_RETRY_MAX = 3` exponenciális visszalépéssel —, így az átmeneti OAuth-hibák maguktól helyreállhatnak, mielőtt a fiók véglegesen deaktiválódna) +- `banned` — tiltott kulcsszó / fióktiltás észlelése állítja be (lásd: [BAN_DETECTION](../security/BAN_DETECTION.md)), illetve három egymást követő, kérésenkénti felsőbb szintű elutasítás (`request_rejected`, például Anthropic OAuth 403 „Request not allowed” — `open-sse/services/requestRejectedStreak.ts`); egyetlen elutasítás csak várakozási állapotba helyezi a kapcsolatot +- `expired` (korlátozott számú újrapróbálkozás után végállapotba kerül — `EXPIRED_RETRY_MAX = 3`, exponenciális visszalépéssel —, így az átmeneti OAuth-hibák maguktól helyreállhatnak, mielőtt a fiók véglegesen deaktiválódna) - `credits_exhausted` -Ezek mindaddig megmaradnak, amíg a hitelesítő adatok meg nem változnak, vagy egy üzemeltető vissza nem állítja őket. A végállapotokat nem szabad átmeneti várakozási állapottal felülírni. +Ezek mindaddig fennmaradnak, amíg a hitelesítő adatok meg nem változnak, vagy egy üzemeltető vissza nem állítja őket. A végállapotokat ne írja felül átmeneti várakozási állapottal. -**Lusta helyreállítás:** amikor a `rateLimitedUntil` időpontja elmúlt, a kapcsolat ismét kiválaszthatóvá válik. Sikeres használatkor a `clearAccountError()` törli az összes hibamezőt. +**Lusta helyreállítás:** amikor a `rateLimitedUntil` időpont elmúlt, a kapcsolat ismét kiválaszthatóvá válik. Sikeres használat esetén a `clearAccountError()` törli az összes hibamezőt. + +### Claude OAuth használati korlát: alacsonyabb prioritású sáv + munkamenetkorlát visszaállítása + +**Hatókör:** egy Claude-előfizetéshez tartozó (OAuth-)kapcsolat. Mindkét funkciót **kapcsolatonként külön kell +engedélyezni** (Kapcsolat szerkesztése → Claude szakasz → `lowPriorityMode` / `autoLimitReset` a +`providerSpecificData` mezőben; alapértelmezés szerint mindkettő ki van kapcsolva), és a Claude Code `/low-priority`, illetve +`/limit-reset` parancsait tükrözik (a vezetékes protokoll szerződése a Claude Code 2.1.263 verziójából származik). + +**Megvalósítás:** + +- Állapotgép + válaszbesorolás: `open-sse/services/claudeLowPriority.ts` +- Visszaállítási állapot/igénylés kliense: `open-sse/services/claudeLimitReset.ts` +- Végrehajtói horog (fejléc beszúrása + újrapróbálkozás ugyanazzal a fiókkal): `open-sse/executors/base.ts::execute()` +- Engedélyezési beállítások megőrzése: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Aktiválási feltétel:** az 5 órás használati korlát — egy `429`, amelynek fejlécei tartalmazzák az +`anthropic-ratelimit-unified-status: rejected` értéket, valamint, ha a fiók jogosult, +az `anthropic-ratelimit-unified-slow-offer: treatment` értéket. Az első, korlátot jelző +429 előtt semmit nem küld a rendszer; az egyesített fejlécek nélküli sorozatos 429-es válaszok a normál várakozási útvonalon haladnak tovább. + +**Alacsonyabb prioritású sáv** (`lowPriorityMode`): + +- A korlátot jelző 429 esetén a végrehajtó elfogadja az ajánlatot, és azonnal újrapróbálkozik **ugyanazzal** + a fiókkal, az `anthropic-usage-limit: slow` fejléccel; a sáv a bejelentett + `anthropic-ratelimit-unified-reset` időpontig (+60 s türelmi idő) aktív marad, és az adott időablakban minden kérés + tartalmazza a fejlécet. Az elfogott 429 soha nem jut el a `handleChatCore` függvényhez, ezért a kapcsolat + **nem** kerül várakozási állapotba, és a rendszer nem vált másik kapcsolatra. +- Az `anthropic-ratelimit-unified-slow-status` értéke későbbi válaszokban: az `active` / `not_needed` + fenntartja a sávot; a `slot_busy` (429) vagy egy `529` esetén a rendszer kivárja a kiszolgáló + `anthropic-ratelimit-unified-slow-retry-after` értékét (alapértelmezés szerint 20 s, 5–600 s közé korlátozva, ±30%-os véletlenszerű eltéréssel), + majd újrapróbálkozik az `anthropic-ratelimit-unified-slow-max-wait` által meghatározott korlátig (alapértelmezés szerint 20 perc, 1 perc és + 6 óra közé korlátozva) — ezt túllépve a sáv véget ér, és egy 10 perces lehűlési időszak blokkolja az újbóli elfogadást. A + várakozást ezenfelül a kérés saját, felsőbb szintű szolgáltatás indítására vonatkozó időtúllépéséből + (`resolveFetchStartTimeout`, alapértelmezés szerint 10 perc) fennmaradó idő mínusz 5 s korlátozza: e korlát nélkül az + alapértelmezett 20 perces maximális várakozás túlélné a kérést, és az alvás a várakozás közben + megszakadna, így a szabályos `max_wait` befejezés + lehűlés helyett `TimeoutError` jelenne meg. +- A `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, egy 5 órás időablak újraindulása, illetve az + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (amely bármely állapot esetén + `extra_usage` eredménnyel lezárja, mivel a fizetett túlfogyasztás ekkor már lefedi a korlátot) megszünteti a sávot; a + válasz ezután a normál várakozási útvonalra kerül. A rendszer a `budget_exhausted` állapotot a + bejelentett költségkeret-visszaállításig (≤ 8 nap) megjegyzi. +- A korlát ellenőrzése a végrehajtó saját, 400-as válaszok által kiváltott, próbálkozáson belüli újrapróbálkozásai után fut le (kontextus + szerkesztése, gondolkodási/erőfeszítési korlátok, paraméterek automatikus tanulása), így az a korlátot jelző 429 is elfogásra kerül ahelyett, + hogy a várakozási útvonalra jutna, amely csak ezen újrapróbálkozások egyikén jelenik meg. +- Az állapot kapcsolatonként a memóriában található (újraindítás után az újbóli elfogadáshoz egy további, korlátot jelző 429 szükséges). + +**Munkamenetkorlát visszaállítása** (`autoLimitReset`, ha mindkettő be van kapcsolva, a rendszer ezt próbálja meg a sáv előtt): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + blokk; ha `arm: "reset"` és `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` a következővel: + `{ "program": "juniper_tide" }` (a szervezet UUID-je a + `providerSpecificData.organizationUUID` mezőből, rendszerindítási tartalékkal). +- `result: reset|not_limited` → a rendszer teljes sebességgel újrapróbálja a kérést (lassítási fejléc nélkül). + Az `already_used` / `not_offered` megjegyzi a `next_available_at` értékét (alapértelmezés szerint egy hét); bármilyen + hiba 15 perces visszalépést eredményez. A visszaállítás hetente egyszer hajtható végre, és továbbra is beleszámít a + heti korlátba. + +Regresszióvédelmek: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Munkamenet-affinitás (#7274) -**Hatókör:** egy ügyfél-munkamenet (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` fejléc), amely egy kapcsolathoz van rögzítve, **bármely** szolgáltató esetén. +**Hatókör:** egyetlen ügyfél-munkamenet (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` fejléc), amely egyetlen kapcsolathoz van rögzítve, **bármely** szolgáltató esetén. -**Cél:** egy többfordulós ügynök (Claude Code, aider, egyéni ügynökök) ugyanazon a fiókon tartása a kérések között, csökkentve a fiókok közötti kontextusvesztést és az ismétlődő hidegindítási 429-es hibákat azoknál a szolgáltatóknál, amelyek fiókonkénti munkamenet-állapotot használnak. +**Cél:** egy több fordulón át működő ügynököt (Claude Code, aider, egyedi ügynökök) ugyanahhoz a fiókhoz rendelni a kérések között, csökkentve a fiókok közötti kontextusvesztést és az ismétlődő, hidegindításból eredő 429-es hibákat azoknál a szolgáltatóknál, amelyek fiókonkénti munkamenet-állapotot használnak. **Megvalósítás:** - TTL feloldása: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` - Rögzítés kiválasztása/létrehozása: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Fejléc kinyerése (általános, bármely szolgáltató): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Tartós rögzítési tábla: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Beállítás: `sessionAffinityTtlMs` (globális TTL ezredmásodpercben, a `0` letiltja) — `src/lib/db/settings.ts`. A kizárólag Codexhez tartozó `codexSessionAffinityTtlMs` névről a `124_generic_session_affinity_ttl.sql` migráció nevezte át, amely minden korábban konfigurált Codex TTL-t átvisz új alapértelmezett értékként. +- Fejléc kinyerése (általános, bármely szolgáltatóhoz): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Tartósan tárolt rögzítési tábla: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Beállítás: `sessionAffinityTtlMs` (globális TTL ezredmásodpercben, a `0` letiltja) — `src/lib/db/settings.ts`. A korábban kizárólag a Codexhez tartozó `codexSessionAffinityTtlMs` beállításról a `124_generic_session_affinity_ttl.sql` migráció nevezte át, amely minden korábban konfigurált Codex TTL-t átvisz új alapértelmezett értékként. -A #7274 előtt a `resolveSessionAffinityTtlMs()` minden, nem `codex` szolgáltató esetén azonnal `0` értékkel tért vissza, ezért a TTL-beállításnak (és a munkamenet-fejléceknek) máshol nem volt hatása, noha a rögzítési mechanizmus és a fejléckinyerés már szolgáltatófüggetlen volt. A javítás eltávolította ezt a korai visszatérést; a TTL mostantól egységesen alkalmazandó minden szolgáltatóra, ha globális értékét `0` fölé állítják. +A #7274 előtt a `resolveSessionAffinityTtlMs()` minden, a `codex` szolgáltatótól eltérő szolgáltató esetén azonnal `0` értékkel tért vissza, ezért a TTL-beállításnak (és a munkamenet-fejléceknek) sehol máshol nem volt hatásuk, annak ellenére, hogy a rögzítési mechanizmus és a fejlécek kinyerése már szolgáltatófüggetlen volt. A javítás eltávolította ezt a korai visszatérést; a TTL mostantól egységesen érvényes minden szolgáltatóra, amint globálisan `0` fölötti értékre állítják. -A három munkamenet-affinitási fejlécet a rendszer soha nem továbbítja a felsőbb szintű szolgáltatónak — a végrehajtók saját felsőbb szintű fejléceiket az alapoktól építik fel, ahelyett, hogy továbbítanák az ügyfél fejléceit, így ez kizárólag belső korrelációs azonosító marad. +A három munkamenet-affinitási fejléc soha nem kerül továbbításra a felsőbb szintű szolgáltatóhoz — a végrehajtók saját felsőbb szintű fejléceiket az alapoktól építik fel, ahelyett, hogy továbbítanák az ügyfél fejléceit, így ez kizárólag belső korrelációs azonosító marad. ### Kizárólagos felügyelt munkamenet-kapcsolati bérletek -**Hatókör:** egy aktív felügyelt HTTP-ügyfél/munkamenet egyetlen alkalmas OmniRoute-kapcsolatot birtokol. +**Hatókör:** egy aktív felügyelt HTTP-ügyfél/-munkamenet egy alkalmas OmniRoute-kapcsolat kizárólagos tulajdonosa. -**Cél:** tartós, kizárólagos kapcsolattulajdont biztosítani azoknak az ügyfeleknek, amelyeknek szigorú útválasztási -korlátra van szükségük a kérések között. Ez eltér a munkamenet-affinitástól, amely egy enyhe folytonossági preferencia: -a kizárólagos bérlet életciklus-állapotot őriz az SQLite-ban, kikényszeríti az aktív tulajdonos és az -aktív kapcsolat globális egyediségét, valamint a szolgáltatói továbbítás előtt elutasítja az elavult generációt. +**Cél:** tartós, kizárólagos kapcsolattulajdonlás biztosítása azon ügyfelek számára, amelyeknek a kérések között szigorú útválasztási elhatárolásra van szükségük. Ez eltér a munkamenet-affinitástól, amely csak laza folytonossági preferencia: egy kizárólagos bérlet életciklus-állapotot őriz meg az SQLite-ban, globálisan kikényszeríti az aktív tulajdonosok és az aktív kapcsolatok egyediségét, valamint a szolgáltatónak történő továbbítás előtt elutasítja az elavult generációt. -A funkció API-kulcsonként külön engedélyezhető. Egy felügyelt kulcsnak rendelkeznie kell a `lease:exclusive` hatókörrel és egy -explicit, nem üres `allowedConnections` listával. Bármely HTTP-ügyfél használhatja az életciklus-végpontot; nincs szükség -ügyfélnévre, felhasználói ügynökre, szolgáltatóra, OAuth-módszerre vagy modellre. A bérlet egy kapcsolatot birtokol, -nem pedig egy modellt, ezért a modellváltás megtartja a kötést, amíg a kapcsolat a szokásos feltételek szerint -alkalmas marad. A normál modell-, kvóta-, állapot-, várakozásiidő- és engedélyezésilista-szabályok továbbra is mérvadók, és -ugyanazt a generációt egy másik szabad, alkalmas kapcsolatra válthatják át. +A funkció API-kulcsonként külön engedélyezhető. Egy felügyelt kulcsnak rendelkeznie kell a `lease:exclusive` hatókörrel és egy explicit, nem üres `allowedConnections` listával. Bármely HTTP-ügyfél használhatja az életciklus-végpontot; nincs szükség ügyfélnévre, user-agentre, szolgáltatóra, OAuth-módszerre vagy modellre. A bérlet egy kapcsolatot birtokol, nem egy modellt, ezért a modellváltás megtartja a hozzárendelést, amíg a kapcsolat a szokásos feltételek szerint alkalmas marad. A normál modell-, kvóta-, állapot-, várakozásiidő- és engedélyezésilista-szabályok továbbra is mérvadók, és ugyanazt a generációt egy másik szabad, alkalmas kapcsolatra állíthatják át. -Az életciklus a `POST /api/v1/session-leases` végponton keresztül kezelhető az `acquire`, `renew` és `release` JSON-műveletekkel. -A felügyelt következtetési kérések az átlátszatlan `X-OmniRoute-Lease-Owner` értéket és a pontos -`X-OmniRoute-Lease-Generation` értéket adják meg. A tulajdonos azonosítója `vlo_` előtagból és azt követő 43 base64url-karakterből áll; csak -az SHA-256 kivonata kerül tárolásra. Minden végső továbbítási korlát azonosítja a hitelesített API-kulcs azonosítóját és -az aktív kapcsolat azonosítóját is. A bérletvezérlő fejlécek eltávolításra kerülnek a naplókból, a megőrzött kérési pillanatképekből és -a felsőbb szintű végrehajtók fejléceiből. +Az életciklus a `POST /api/v1/session-leases` végponton érhető el, az `acquire`, `renew` és `release` JSON-műveletekkel. A felügyelt következtetési kérések az átlátszatlan `X-OmniRoute-Lease-Owner` értéket és a pontos `X-OmniRoute-Lease-Generation` értéket adják meg. A tulajdonos azonosítója a `vlo_` előtagból és azt követő 43 base64url karakterből áll; csak az SHA-256 hash kerül tárolásra. Minden végső továbbítási korlát azonosítja a hitelesített API-kulcs azonosítóját és az aktív kapcsolat azonosítóját is. A bérletvezérlő fejlécek eltávolításra kerülnek a naplókból, a megőrzött kérési pillanatképekből és a felsőbb szintű végrehajtóknak küldött fejlécekből. -Ha a szokásos útválasztás rendelkezik alkalmas felügyelt jelöltekkel, de minden szabad jelöltet egy -idegen aktív bérlet foglal el, az OmniRoute HTTP `429` választ, bérleti kapacitás hiányát jelző kódot, -kapacitásra várakozó állapotot, valamint a legkorábbi releváns lejáratból származtatott, korlátozott `Retry-After` értéket ad vissza. -Az alkalmassági halmaz szokásos üressége nem bérleti ütközés, és megtartja a meglévő útválasztási hibaszemantikát. +Ha a szokásos útválasztás rendelkezik alkalmas felügyelt jelöltekkel, de minden szabad jelöltet egy idegen aktív bérlet foglal el, az OmniRoute HTTP `429` választ, `lease-capacity-unavailable` kódot és kapacitásra várakozó állapotot ad vissza, valamint a legkorábbi releváns lejáratból származtatott, korlátozott `Retry-After` értéket küld. Az alkalmas kapcsolatok szokásos hiánya nem minősül bérletütközésnek, és megtartja a meglévő útválasztási hibaszemantikát. A kapcsolódó mechanizmusok továbbra is elkülönülnek: -- Az OAuth-munkamenetek foglaltsága folyamaton belüli, enyhe elosztást biztosít az OAuth-fiókok számára. +- Az OAuth-munkamenetek foglaltsága folyamaton belüli, laza elosztást biztosít az OAuth-fiókok számára. - A fiókszemaforok kérés-egyidejűségi engedélyeket adnak, amelyek a kérés befejezésekor megszűnnek. -- A kizárólagos felügyelt munkamenet-bérletek tartós életciklus-tulajdont biztosítanak generációs korláttal. +- A kizárólagos felügyelt munkamenet-bérletek tartós életciklus-tulajdonlást biztosítanak generációs korláttal. --- @@ -287,48 +331,87 @@ nem található okok esetén. --- -## 5. A kérési sor beléptetés-szabályozása (v3.8.49 · #6593-as probléma) +## 5. Kérelemsorba-felvételi szabályozás (v3.8.49 · #6593. számú probléma) **Hatókör**: a helyi, szolgáltatónkénti+kapcsolatonkénti sebességkorlátozási sor (`open-sse/services/rateLimitManager.ts`, amelyet a Bottleneck támogat), egy réteggel a fenti három mechanizmus alatt. -**A `maxWaitMs` a végrehajtási lejárat korábbi, megőrzött neve.** -A `resilienceSettings.requestQueue.maxWaitMs` a Bottleneck számára egy feladat -`expiration` értékeként kerül átadásra, amelynek időzítője csak a továbbítás után indul el. Ezért ez -a korlátozó által kezelt végrehajtást korlátozza, nem pedig a helyi sorban töltött időt. A lejárat -megbízható helyi `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` hibaként jelenik meg (HTTP 504); -a soridőtúllépés korábbi kódneve csak a megbízható belső -visszamenőleges kompatibilitás érdekében elfogadott. Az alapértelmezett érték 15000ms; felülírható a -`RATE_LIMIT_MAX_WAIT_MS` (környezeti változó) használatával vagy az irányítópulton (**Beállítások → Hibatűrés**, -1–30000ms értékű felhasználóifelület-korlát). A sorban tartózkodásnak nincs időbeli határideje; a sorban álló -kérők számának korlátozásához használja az alábbi `maxQueueDepth` beállítást. - -**`maxQueueDepth` — opcionálisan bekapcsolható beléptetési korlát (új).** A `resilienceSettings.requestQueue.maxQueueDepth` -korlátozza, hogy egy szolgáltató+kapcsolat esetén egyszerre hány kérés várakozhat a sorban -(még nem továbbított állapotban). Ha a sor már `maxQueueDepth` számú kérést tartalmaz, -az új kérés azonnal elutasításra kerül egy típusos -`code: "RATE_LIMIT_QUEUE_FULL"` hibával, **mielőtt** valaha is elérné a `limiter.schedule()` -hívást — így az elutasítás kis költségű, és az adott kéréshez kapcsolódó bármely későbbi -prompttömörítési / fordítási munka előtt megtörténik. Az alapértelmezett `0` = -letiltva, ami megőrzi a meglévő, korlátlan sor működését; a megengedett tartomány 0–100000. -Felülírható a `RATE_LIMIT_MAX_QUEUE_DEPTH` (környezeti változó) vagy a -`resilienceSettings.requestQueue.maxQueueDepth` használatával (irányítópult/API-módosítás). - -Maga a beléptetési ellenőrzés egy tiszta függvény +**A `maxWaitMs` a sorban várakozást, az `executionMaxWaitMs` pedig a végrehajtást korlátozza.** +A kettő szándékosan különálló, és egyik sem befolyásolja a másikat. + +A `resilienceSettings.requestQueue.maxWaitMs` a **sorban várakozás időkerete**: +magában foglalja a várakozást egy szolgáltatói helyre, majd a QUEUED állapotban +töltött időt, időzítője pedig abban a pillanatban törlődik, amikor a feladat +elhagyja a QUEUED állapotot, és megkezdi a végrehajtást +(`rateLimitManager.ts`, `wrappedFn`). Az ezt túllépő kérelem soha nem jut el +a felsőbb szintű szolgáltatóhoz. Az alapértelmezés 30000ms, amelyet a +`DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` biztosít az +`src/lib/resilience/settings.ts` fájlban, és amelyet a +`tests/unit/ratelimit-admission-control-6593.test.ts` teszt rögzít, így a +módosítása sikertelenné teszi ezt a tesztet, ahelyett, hogy ez a bekezdés +észrevétlenül elavulttá válna. + +A `resilienceSettings.requestQueue.executionMaxWaitMs` értékét kapja meg a +Bottleneck a feladat `expiration` értékeként, amelynek időzítője csak a +továbbítás után indul el. Ez biztonsági korlátként szolgál azokhoz a +végrehajtókhoz, amelyek nem rendelkeznek saját felsőbb szintű időtúllépéssel, +és a végrehajtó saját, lekérésindítástól számított időtúllépési értékére nő, +ha az hosszabb, így nem szakíthat meg egy megfelelően működő, folyamatban lévő +választ. Az alapértelmezés 600000ms (10 perc). + +Korábban a sor időkeretének átadása az `expiration` számára ölte meg futás +közben a nem inkrementális átjárókat — ezek szabályosan több percig is +futhatnak az első bájtok megérkezése előtt —, és ezért jelenik meg a lejárat +`code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504) formájában, míg a sor +időkeretének túllépése a soridőtúllépési kódot hordozza. Bármelyik felülírható +a `RATE_LIMIT_MAX_WAIT_MS` / `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` +(környezeti változó) vagy az irányítópult +(**Beállítások → Hibatűrés**) használatával. Normalizáláskor mindkettő az +1ms–24h tartományra van korlátozva. + +**Precedencia mindkettő esetén:** a környezeti változó csak az +_alapértelmezett_ értéket adja meg. A `resilienceSettings.requestQueue` +alatt tartósan tárolt érték (irányítópult/API-javítás, a `key_value` alatt +tárolva) elsőbbséget élvez vele szemben, a kapcsolatonkénti +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` pedig ezeknél is +magasabb prioritású. Ezért a környezeti változó beállítása egy olyan +telepítésen, amely már rendelkezik tartósan tárolt értékkel, semmit sem +változtat — ehelyett törölje vagy frissítse a tárolt beállítást. + +A sorban tartózkodás időtartamát a `maxWaitMs` korlátozza; az alábbi +`maxQueueDepth` azt korlátozza, hogy egyszerre hány hívó várakozhat a sorban. + +**`maxQueueDepth` — opcionálisan bekapcsolható felvételi korlát (új).** A `resilienceSettings.requestQueue.maxQueueDepth` +azt korlátozza, hogy egyszerre hány kérelem várakozhat a sorban (még +továbbítás előtt) egy szolgáltató+kapcsolat esetén. Ha a sor már +`maxQueueDepth` számú kérelmet tartalmaz, az új kérelmet a rendszer gyorsan +elutasítja egy típusos `code: "RATE_LIMIT_QUEUE_FULL"` hibával, **mielőtt** +az valaha elérné a `limiter.schedule()` hívást — így az elutasítás kis +erőforrásigényű, és az adott kérelemhez tartozó bármilyen későbbi +prompttömörítési/fordítási munka előtt megtörténik. Az alapértelmezett `0` = +letiltva, ami megőrzi a korábbi, korlátlan sorviselkedést; az érték a +0–100000 tartományra korlátozott. Felülírható a +`RATE_LIMIT_MAX_QUEUE_DEPTH` (környezeti változó) vagy a +`resilienceSettings.requestQueue.maxQueueDepth` (irányítópult/API-javítás) +használatával. + +Maga a felvételi ellenőrzés egy tiszta függvény (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), így valódi Bottleneck-korlátozó nélkül is egységtesztelhető. -> A #6593-at megnyitó RFC egy `bypassCompressionOnRateLimit` -> jelzőt is javasolt. Ennek a tárolónak az `open-sse/services/compression/` adatfolyama -> a kimenő LLM-kérés prompt-/kontextustömörítését végzi (`chatCore.ts`, -> a `resolveCompressionSettings`/`selectCompressionStrategy` blokk körül), -> nem pedig a létrehozott 429-es válaszok HTTP-választömörítését — nincs -> megfelelő kódútvonal egy szó szerinti megkerülési jelzőhöz. Ez a prompttömörítési lépés -> jelenleg szintén a `withRateLimit()` _előtt_ fut a kérési adatfolyamban, ezért -> az átrendezés, amely kihagyná ezt egy megtelt sor miatti elutasítás esetén, különálló és nagyobb -> változtatás, mint ami e probléma hatókörébe tartozik; itt szándékosan **nem** lett megvalósítva, -> és későbbi feladatként marad meg arra az esetre, ha a CPU-megtakarítás megérné az -> átrendezés kockázatát. +> A #6593. számú problémát megnyitó RFC egy `bypassCompressionOnRateLimit` +> jelzőt is javasolt. Ennek a tárolónak az +> `open-sse/services/compression/` folyamata a kimenő LLM-kérelem +> prompt-/kontextustömörítését végzi (`chatCore.ts`, a +> `resolveCompressionSettings`/`selectCompressionStrategy` blokk körül), +> nem pedig a létrehozott 429-es választörzsek HTTP-választömörítését — nincs +> olyan megfelelő kódútvonal, amelyhez egy szó szerinti megkerülési jelző +> tartozhatna. Ez a prompttömörítési lépés jelenleg szintén a +> `withRateLimit()` _előtt_ fut a kérelemfeldolgozási folyamatban, ezért az +> átrendezés, amely kihagyná ezt a sor megtelése miatti elutasításkor, különálló +> és nagyobb változtatás, mint e probléma hatóköre; ezt szándékosan **nem** +> valósítottuk meg itt, és későbbi feladatként marad meg arra az esetre, ha a +> CPU-megtakarítás megéri az átrendezés kockázatát. --- diff --git a/docs/i18n/hu/docs/architecture/admission-lanes.md b/docs/i18n/hu/docs/architecture/admission-lanes.md index 36223f611eea..3786f1f81cba 100644 --- a/docs/i18n/hu/docs/architecture/admission-lanes.md +++ b/docs/i18n/hu/docs/architecture/admission-lanes.md @@ -9,51 +9,57 @@ kiegészítik egymást; az üzemeltetőknek tudniuk kell, hogy éppen melyiket v ## 1. Bájtszintű, teljes folyamatra kiterjedő beléptetés (`chatBodyAdmission.ts`) -- **Hatókör:** a pufferelt törzs/halom útvonala a `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` és a többi, csevegésszerű útvonal esetében. Védelmet - nyújt a nagy méretű kódolóügynök-törzsek okozta halommemória-növekedés ellen (#4380). -- **Egyetlen, globális folyamatvezérlő, nem kulcsonkénti sávok (#10110).** Minden API-kulcs - (kivonatolva), illetve `anonymous` munkamenet **ugyanabból** a közös keretből kap - beléptetést — a kivonatolt munkamenet-azonosító KIZÁRÓLAG méltányossági ütemezési - kulcsként szolgál (körforgásos kiosztás a várakozók között), soha nem kapacitási - szegmensként. A dokumentum egy korábbi verziója független kapacitású, kulcsonkénti - sávokat írt le; ezt a modellt a #10110 eltávolította, mert lehetővé tette, hogy - hitelesítés nélküli hamis hitelesítő adatok megsokszorozzák a teljes folyamatra - érvényes korlátot. -- **Kapu (#503-fanout): automatikusan származtatott, BÁJT alapú fogadási keret, nem rögzített - kérésszám.** A régi `CHAT_MAX_HEAVY_IN_FLIGHT` kérésszámkorlát (a javítás előtt - alapértelmezetten `1`) a kódolóügynökök szétágazását (több alügynök/CLI, rendszerint - > 256 KB méretű törzsek) körülbelül 1-es tényleges párhuzamosságra csökkentette, - > ami teljesen normál terhelés mellett is 503-as hibákat okozott. Most már csak akkor - > korlátoz, ha egy üzemeltető kifejezetten beállítja az - > `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` értékét. Ha nincs beállítva, a beléptetést ehelyett - > az `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` korlátozza — ez a keret automatikusan, a folyamat - > valós memóriakorlátjából származik (`src/shared/middleware/admissionBudget.ts`): - > a V8 halomkorlátja és bármely cgroup-/konténerkorlát közül a szigorúbb érték 25%-a, - > elosztva egy 8-szoros átmeneti memóriafelerősítési tényezővel, 8 MiB és - > 2 GiB közötti tartományra korlátozva. A kifejezett felülbírálásokra ugyanezek a - > korlátok vonatkoznak. Ez környezeti változók hangolása nélkül automatikusan - > méreteződik egy 512 MB-os konténertől egy 32 GB-os asztali gépig. Az a törzs, amely - > nem fér el a tényleges kereten belül, azonnal `413 body_exceeds_budget` hibával - > meghiúsul; csak az egyenként kiszolgálható törzsek közötti versengés kerül a - > korlátozott, méltányos sorba. Egy több jelből dolgozó, élő erőforrásterhelés-követő - > (V8 halomaránya, cgroup, PSI, OOM-események — - > `open-sse/utils/resourcePressurePolicy.ts`) `high` terhelés esetén lerövidíti a - > korlátozott várakozást, `critical` terhelés esetén pedig azonnal - > `503 resource_pressure` hibával utasítja el a terhelést, még mielőtt egyetlen bájt - > fogadása is megtörténne. +- **Hatókör:** a pufferelt törzs/heap feldolgozási útvonala a `POST /v1/chat/completions`, + `/v1/messages`, `/v1/responses` és más, csevegésszerű útvonalak esetén. Védelmet + nyújt a nagy kódolásiügynök-törzsek okozta heap-amplifikációval szemben (#4380). +- **Egyetlen, folyamatglobális vezérlő, nem kulcsonkénti sávok (#10110).** Minden API-kulcs + (hash-elve), illetve `anonymous` munkamenet **ugyanahhoz** a megosztott kerethez + viszonyítva kerül beléptetésre — a hash-elt munkamenet-azonosító KIZÁRÓLAG + méltányossági ütemezési kulcsként szolgál (körforgásos továbbítás a várakozók + között), kapacitásszegmensként soha. A dokumentum egy korábbi verziója + kulcsonkénti, független kapacitású sávokat írt le; ezt a modellt a #10110 + keretében eltávolították, mert lehetővé tette, hogy nem hitelesített, hamis + hitelesítő adatok megsokszorozzák a teljes folyamatra érvényes korlátot. +- **Kapu (#503-fanout): automatikusan származtatott, BÁJTALAPÚ feldolgozási keret, + nem rögzített kérésszám.** A korábbi `CHAT_MAX_HEAVY_IN_FLIGHT` kérésszámkorlát + (a javítás előtt alapértelmezés szerint `1`) a kódolási ügynökök fan-out + működését (több alügynök/CLI, rendszerint > 256 KB méretű törzsek) körülbelül + 1-es tényleges párhuzamosságra szűkítette, így teljesen normál terhelés mellett + is 503-as hibákat okozott. Mostantól csak akkor lép érvénybe, ha az üzemeltető + kifejezetten beállítja az `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` változót. Ha + nincs beállítva, a beléptetést ehelyett az `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` + korlátozza — ez a keret automatikusan származik a folyamat tényleges + memóriakorlátjából (`src/shared/middleware/admissionBudget.ts`): a V8 + heapkorlátja és bármely cgroup-/konténerkorlát közül a szigorúbb érték 25%-a, + elosztva egy 8-szoros átmeneti amplifikációs tényezővel, majd 8 MiB és 2 GiB + közé szorítva. Az explicit felülbírálásokra ugyanezek a korlátok vonatkoznak. + Így környezeti változók hangolása nélkül automatikusan igazodik az 512 MB-os + konténertől a 32 GB-os asztali gépig. Ha egy törzs nem fér el a tényleges + kereten belül, azonnal `413 body_exceeds_budget` hibával meghiúsul; csak az + egyenként kiszolgálható törzsek közötti versengés kerül a korlátozott, + méltányosságot biztosító várólistára. Egy több jelzést valós időben figyelő + erőforrásterhelés-követő (V8 heaparány, cgroup, PSI, OOM-események — + `open-sse/utils/resourcePressurePolicy.ts`) `high` terhelésnél lerövidíti a + korlátozott várakozást, `critical` terhelésnél pedig azonnal tehermentesít + `503 resource_pressure` hibával, még mielőtt akár egyetlen bájt beolvasása is + megtörténne. A PSI értékét a rendszer ennek az egységnek a cgroupjához tartozó + `memory.pressure` fájlból olvassa ki, ha az elérhető + (`open-sse/utils/resourcePressureSampler.ts`); a `/proc/pressure/memory` az + egész gazdagépre vonatkozik, és csak fizikai gépen / cgroup v1 esetén szolgál + tartalék megoldásként, így egy lapozó gazdagép nem okozhat 503-as hibát egy + tétlen konténerben. - **Hangolás:** - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — az automatikusan származtatott bájtkeret felülbírálása - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — régi kérésszámkorlát, csak külön engedélyezéssel - - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — várakozás a sorban az 503-as válasz előtt (alapértelmezett érték: 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — a sorban álló bájtok halommemória-szelepe (alapértelmezett érték: 4 MB) + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — korábbi kérésszámkorlát, csak külön engedélyezéssel + - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — várakozási idő a várólistán 503-as hiba előtt (alapértelmezés: 2000) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — a várólistán lévő bájtok heapvédelmi szelepe (alapértelmezés: 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — a #10110 óta elavult, - hatás nélküli beállítások (a konfigurációs kompatibilitás érdekében elfogadottak, de figyelmen kívül maradnak) + hatástalan beállítások (konfigurációs kompatibilitás céljából elfogadottak, de figyelmen kívül maradnak) - **Jelentések:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — beleértve - a #503-fanout által hozzáadott `inflightBytes`, `maxInflightBytes`, `budgetSource` + a #503-fanout keretében hozzáadott `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` és `countCapEnabled` - mezőket (alapértelmezett telepítésnél false — megerősíti, hogy ténylegesen a - bájtkeret korlátoz, nem pedig a régi kérésszámkorlát). + mezőket (alapértelmezett telepítésnél false — ez megerősíti, hogy ténylegesen + a bájtkeret, nem pedig a korábbi kérésszámkorlát érvényesül). ## 2. Adaptív futásidejű virtuális sávok (`open-sse/services/admission`) diff --git a/docs/i18n/hu/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/hu/docs/frameworks/EMBEDDED-SERVICES.md index 286fd3ab4ecc..a2b870f41295 100644 --- a/docs/i18n/hu/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/hu/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,12 +5,12 @@ --- > **Verzió:** v3.8.44 -> **Utolsó frissítés:** 2026-07-03 -> **Célközönség:** Beágyazott szolgáltatásokat (9Router, CLIProxyAPI, Mux, Bifrost) hozzáadó, karbantartó vagy hibakeresést végző mérnökök. +> **Utolsó frissítés:** 2026-09-09 +> **Célközönség:** Beágyazott szolgáltatásokat (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) hozzáadó, karbantartó vagy hibakereső mérnökök. -A beágyazott szolgáltatások helyileg telepített, kiegészítő folyamatként működő eszközök, amelyeket az OmniRoute telepít, felügyel, -és teljes értékű útválasztási célpontként tesz elérhetővé. A külső szolgáltatókkal ellentétben (amelyek API-kulcsokon keresztül, -az interneten érhetők el) a beágyazott szolgáltatások ugyanazon a gépen futnak, mint az OmniRoute, és loopback kapcsolaton keresztül kommunikálnak. +A beágyazott szolgáltatások helyileg telepített, kiegészítő folyamatként működő eszközök, amelyeket az OmniRoute telepít, felügyel és +teljes értékű útválasztási célként tesz elérhetővé. A külső szolgáltatókkal ellentétben (amelyek API-kulcsok használatával, +az interneten keresztül érhetők el) a beágyazott szolgáltatások az OmniRoute-tal azonos gépen futnak, és a visszacsatolási interfészen keresztül kommunikálnak. --- @@ -29,35 +29,36 @@ az interneten érhetők el) a beágyazott szolgáltatások ugyanazon a gépen fu ## 1. Áttekintés -### Miért használjunk beágyazott szolgáltatásokat? +### Miért beágyazott szolgáltatások? -Öt szolgáltatás van beágyazva: +Hat szolgáltatás van beágyazva: -| Szolgáltatás | npm-csomag | Alapértelmezett port | Rendeltetés | -| --------------- | --------------------------------------------- | :------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI-útválasztó, amelyet az OmniRoute alszolgáltatóként használhat. A modellek `9router/{sub}/{model}` formában érhetők el | -| **CLIProxyAPI** | GitHub-kiadási bináris (`cliproxy`) | 8317 | Helyi proxyadapter az Anthropic CLI-hitelesítési folyamatokhoz. Tartalék útválasztást biztosít az OAuth-tokenek lejáratakor | -| **Mux** | `mux` (grafikus felület nélküli `mux server`) | 8322 | Helyi ügynök-vezénylési démon (coder/mux). Csak az életciklusa felügyelt — nem útválasztási célpont (nincs LLM-proxyzás). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-alapú AI-átjáró továbbító háttérrendszer. Futás közben a továbbítási útvonal (`/v1/relay/`) automatikusan ezt választja | -| **Dario** | `@askalf/dario` | 3456 | Claude-előfizetési proxy — a CLIProxyAPI alternatívája/tartalékmegoldása Claude-Code-formátumú forgalomhoz; a beinjektált kulcsból `DARIO_ADMIN_TOKEN` lesz, amely védi az `/admin/*` OAuth-vezérlési síkot | +| Szolgáltatás | npm-csomag | Alapértelmezett port | Cél | +| --------------- | --------------------------------------------- | :------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI-útválasztó, amelyet az OmniRoute alszolgáltatóként használhat. A modellek `9router/{sub}/{model}` formában érhetők el | +| **CLIProxyAPI** | GitHub-kiadási bináris (`cliproxy`) | 8317 | Helyi proxyadapter az Anthropic CLI hitelesítési folyamataihoz. Tartalék útválasztást biztosít az OAuth-tokenek lejáratakor | +| **Mux** | `mux` (grafikus felület nélküli `mux server`) | 8322 | Helyi ügynök-vezénylési démon (coder/mux). Csak az életciklusa felügyelt — nem útválasztási cél (nincs LLM-proxyzás). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go-alapú AI-átjáró továbbító háttérrendszer. Futás közben a továbbítási útvonal (`/v1/relay/`) automatikusan ezt választja | +| **Dario** | `@askalf/dario` | 3456 | Claude-előfizetési proxy — a CLIProxyAPI alternatívája vagy tartaléka a Claude Code formátumú forgalomhoz; a beinjektált kulcs `DARIO_ADMIN_TOKEN` lesz, amely védi az `/admin/*` OAuth-vezérlősíkját | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web-automatizálás (grafikus felület nélküli Chromium a Puppeteer segítségével). Csak az életciklusa felügyelt — nem útválasztási cél. | -Mind az öt ugyanazt a felügyeleti modellt követi: +Mind a hat ugyanazt a felügyeleti modellt követi: - Az OmniRoute a `DATA_DIR/services/{name}/` könyvtárba telepíti őket (az OmniRoute saját `package.json` fájljától elkülönítve) -- Az OmniRoute gyermekfolyamatokként indítja el és figyeli őket -- Az OmniRoute egy ideiglenes API-kulcsot injektál a gyermekfolyamat környezeti változói közé, és állásidő nélkül cseréli azt (ahol alkalmazható) -- Minden felügyeleti útvonal (`/api/services/*`) **LOCAL_ONLY** — csak loopback kapcsolaton keresztül érhető el (17. szigorú szabály) +- Az OmniRoute gyermekfolyamatként indítja és felügyeli őket +- Az OmniRoute egy ideiglenes API-kulcsot injektál a gyermekfolyamat környezetébe, és ahol alkalmazható, leállás nélkül cseréli azt +- Minden felügyeleti útvonal (`/api/services/*`) **LOCAL_ONLY** — kizárólag a visszacsatolási címről érhető el (a 17. megváltoztathatatlan szabály) -### Fő döntések (a tervezési dokumentumból) +### Fő döntések (a tervezési tervből) -| Döntés | Érték | -| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -| Hozzáférés a 9Router natív felületéhez az irányítópulton | Fordított proxy a `/dashboard/providers/services/9router/embed/*` útvonalon | -| Telepítési mechanizmus | `npm install {package}` az `execFile` használatával (parancsértelmező-interpoláció nélkül) | -| Felhasználási mód | A szolgáltató `9router/{sub}/{model}` formában van regisztrálva az útválasztási motorban | -| API-kulcsok kezelése | Az OmniRoute generálja, nyugalmi állapotban titkosítja (AES-256-GCM), és környezeti változóként injektálja | -| Irányítópult helye | `/dashboard/providers/services` (három lap) | -| Automatikus indítás | Szolgáltatásonként kapcsolható, alapértelmezés szerint KIKAPCSOLVA | +| Döntés | Érték | +| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- | +| A 9Router natív felületének elérése az irányítópultról | Fordított proxy a `/dashboard/providers/services/9router/embed/*` útvonalon | +| Telepítési mechanizmus | `npm install {package}` az `execFile` használatával (parancsértelmező-behelyettesítés nélkül) | +| Használati mód | A szolgáltató `9router/{sub}/{model}` formában van regisztrálva az útválasztási motorban | +| API-kulcsok kezelése | Az OmniRoute generálja, nyugalmi állapotban titkosítja (AES-256-GCM), és környezeti változón keresztül injektálja | +| Az irányítópult helye | `/dashboard/providers/services` (három lap) | +| Automatikus indítás | Szolgáltatásonként kapcsolható, alapértelmezés szerint KIKAPCSOLVA | --- @@ -71,7 +72,7 @@ Mind az öt ugyanazt a felügyeleti modellt követi: │ Beállítások, Telepítés │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Keret + lapútválasztás a ?tab= alapján│ +│ ├── page.tsx Keret + lapválasztás a ?tab= alapján │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -79,7 +80,7 @@ Mind az öt ugyanazt a felügyeleti modellt követi: └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (Next.js fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ 2. réteg — API (LOCAL_ONLY — csak visszacsatolási interfészen) │ +│ 2. réteg — API (LOCAL_ONLY — csak visszacsatolási interfész) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -90,9 +91,9 @@ Mind az öt ugyanazt a felügyeleti modellt követi: │ /dashboard/providers/services/9router/embed/[...path] │ │ (fordított HTTP- és WebSocket-proxy → 9Router upstream) │ │ │ -│ Védelem: a LOCAL_ONLY_API_PREFIXES tartalmazza a következőket: │ +│ Védelem: a LOCAL_ONLY_API_PREFIXES tartalmazza az │ │ "/api/services/" és │ -│ "/dashboard/providers/services/*/embed/" │ +│ "/dashboard/providers/services/*/embed/" útvonalakat │ └──────────────────────┬─────────────────────────────────────────────┘ │ folyamaton belüli hívások ┌──────────────────────▼─────────────────────────────────────────────┐ @@ -102,18 +103,18 @@ Mind az öt ugyanazt a felügyeleti modellt követi: │ ├── telepítés: execFile('npm', ['install', pkg, '--prefix']) │ │ ├── indítás: spawn(node, [entrypoint], {env, cwd}) │ │ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── port: 20130 a 9Routerhez (konfigurálható) │ -│ ├── naplók: stdio körkörös puffer, 5 MB → SSE-események │ +│ ├── port: 20130 a 9Router számára (konfigurálható) │ +│ ├── naplók: 5 MB-os stdio körkörös puffer → SSE-események │ │ ├── állapot: HTTP GET /health 2–5 mp-enként, lusta helyreállítás│ │ └── életciklus: SIGTERM 15 mp → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts Az összes SERVICES[] inicializálása indításkor │ +│ bootstrap.ts Az összes SERVICES[] indítása a folyamat kezdetén│ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ │ modelSync.ts Időszakos GET /v1/models → service_models tábla│ │ ringBuffer.ts Körkörös naplópuffer (szolgáltatásonként 5 MB) │ │ healthCheck.ts Lekérdezéses HTTP-állapotvizsgálat │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (telepítőadapterek) │ └──────────────────────┬─────────────────────────────────────────────┘ │ OpenAI-kompatibilis HTTP (visszacsatolás) @@ -121,41 +122,41 @@ Mind az öt ugyanazt a felügyeleti modellt követi: │ 4. réteg — Szolgáltató / Útválasztás │ │ │ │ open-sse/executors/ninerouter.ts │ -│ Kérésenként újra lekéri a portot és az API-kulcsot (gyorsítótárazás nélkül).│ +│ Kérésenként újra lekéri a portot és az API-kulcsot (nincs gyorsítótárazás).│ │ Proxyzás előtt eltávolítja a "9router/" előtagot a modellazonosítóból.│ │ 503 service_not_running választ ad, ha a felügyelő nem "running" állapotú.│ │ │ │ src/shared/constants/providers.ts │ -│ Bejegyzés a "9router" számára: isEmbeddedService: true │ +│ A "9router" bejegyzése: isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ A modellek "9router/{sub}/{model}" formában tárolódnak (előtaggal).│ │ A modelSync.ts 5 percenként szinkronizálja őket. │ │ │ -│ A Mux CSAK életciklus-felügyelettel rendelkezik (1–3. réteg) — │ -│ ez egy ügynök-összehangoló démon, nem LLM-proxy, ezért nincs │ -│ 4. rétegbeli végrehajtó-/szolgáltatóbejegyzése, és soha nem │ -│ útválasztási cél. │ +│ A Mux CSAK életciklus-kezelést kap (1–3. réteg) — ez egy ügynök- │ +│ vezénylési démon, nem LLM-proxy, ezért nincs 4. rétegbeli │ +│ végrehajtó-/szolgáltatóbejegyzése, és soha nem útválasztási cél. │ └────────────────────────────────────────────────────────────────────┘ ``` ### Fő forrásfájlok -| Fájl | Szerep | -| ------------------------------------------- | ------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Alaposztály: életciklus, zárolás, állapot, körkörös puffer | -| `src/lib/services/bootstrap.ts` | Folyamatszintű regisztráció és automatikus indítás | -| `src/lib/services/registry.ts` | Egykezelős leképezés: `tool → supervisor` | -| `src/lib/services/apiKey.ts` | Kulcsgenerálás, tárolt adatok AES-256-GCM-titkosítása | -| `src/lib/services/modelSync.ts` | Időszakos modellszinkronizálás (5 percenként) + igény szerint | -| `src/lib/services/ringBuffer.ts` | 5 MB-os körkörös naplópuffer SSE-előfizetéssel | -| `src/lib/services/healthCheck.ts` | HTTP-állapotellenőrzés (konfigurálható időközzel) | -| `src/lib/services/installers/ninerouter.ts` | npm-telepítés/-frissítés/-eltávolítás a 9Routerhez | -| `src/lib/services/installers/cliproxy.ts` | npm-telepítés/-frissítés/-eltávolítás a CLIProxyAPI-hoz | -| `src/lib/services/installers/mux.ts` | npm-telepítés/-frissítés/-eltávolítás a Muxhoz | -| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` segédfüggvény | -| `src/app/api/services/[name]/logs/route.ts` | Megosztott SSE-naplóvégpont | -| `open-sse/executors/ninerouter.ts` | Szolgáltatói végrehajtó (4. réteg) | +| Fájl | Szerep | +| ------------------------------------------- | ---------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Alaposztály: életciklus, zárolás, állapot, körkörös puffer | +| `src/lib/services/bootstrap.ts` | Folyamatszintű regisztráció és automatikus indítás | +| `src/lib/services/registry.ts` | Egyke példánytárkép: `eszköz → felügyelő` | +| `src/lib/services/apiKey.ts` | Kulcsgenerálás, nyugalmi AES-256-GCM-titkosítás | +| `src/lib/services/modelSync.ts` | Időszakos modellszinkronizálás (5 perc) + igény szerint | +| `src/lib/services/ringBuffer.ts` | 5 MB-os körkörös naplópuffer SSE-feliratkozással | +| `src/lib/services/healthCheck.ts` | HTTP-állapotellenőrzés (konfigurálható időközzel) | +| `src/lib/services/installers/ninerouter.ts` | npm-telepítés/-frissítés/-eltávolítás a 9Routerhez | +| `src/lib/services/installers/cliproxy.ts` | npm-telepítés/-frissítés/-eltávolítás a CLIProxyAPI-hoz | +| `src/lib/services/installers/mux.ts` | npm-telepítés/-frissítés/-eltávolítás a Muxhoz | +| `src/lib/services/installers/openwa.ts` | npm-telepítés/-frissítés/-eltávolítás az open-wa-hoz | +| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` segédfüggvény | +| `src/app/api/services/[name]/logs/route.ts` | Megosztott SSE-naplózási végpont | +| `open-sse/executors/ninerouter.ts` | Szolgáltatói végrehajtó (4. réteg) | --- @@ -212,17 +213,15 @@ akkor, amikor az automatikus indítás és egy felhasználói felületi gomb egy ## 4. API-referencia -A `/api/services/` alatti összes útvonal **LOCAL_ONLY** (csak visszacsatolási -interfész, 17. szigorú szabály). A nem visszacsatolási interfészről érkező kérések -a hitelesítési tokentől függetlenül `403 LOCAL_ONLY` választ kapnak. +A `/api/services/` alatti összes útvonal **LOCAL_ONLY** (csak visszacsatolási címről érhető el, kötelező szabály #17). +A nem visszacsatolási címről érkező kérések a hitelesítési tokentől függetlenül `403 LOCAL_ONLY` választ kapnak. ### 4.1 9Router-végpontok (11 útvonal) #### `POST /api/services/9router/install` -Telepíti a 9Routert az npm rendszerből. Létrehozza a `DATA_DIR/services/9router/` -könyvtárat saját `package.json` fájllal és `node_modules/` könyvtárral. Nem ütközik -az OmniRoute saját függőségeivel. +Telepíti a 9Routert az npm használatával. Létrehozza a `DATA_DIR/services/9router/` könyvtárat saját +`package.json` és `node_modules/` tartalommal. Nem ütközik az OmniRoute saját függőségeivel. **Kérés törzse** (minden mező opcionális): @@ -230,29 +229,28 @@ az OmniRoute saját függőségeivel. { "version": "latest" } ``` -| Mező | Típus | Alapértelmezés | Leírás | -| --------- | -------- | -------------- | ----------------------------------------- | -| `version` | `string` | `"latest"` | a telepítendő npm-verziócímke vagy semver | +| Mező | Típus | Alapértelmezett | Leírás | +| --------- | -------- | --------------- | ----------------------------------------- | +| `version` | `string` | `"latest"` | A telepítendő npm-verziócímke vagy semver | **Válaszok:** -| Állapot | Leírás | -| ------- | ----------------------------------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Érvénytelen kéréstörzs (sikertelen Zod-validáció) | -| `409` | Már folyamatban van telepítés (a zár foglalt) | -| `500` | Az npm-telepítés sikertelen — a felhasználóbarát hiba a `message` mezőben található | +| Állapot | Leírás | +| ------- | ----------------------------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Érvénytelen kéréstörzs (sikertelen Zod-validáció) | +| `409` | A telepítés már folyamatban van (a zárolás aktív) | +| `500` | Az npm-telepítés sikertelen — a közérthető hiba a `message` mezőben található | -**Megjegyzések:** Az `execFile('npm', [...])` függvényt használja — parancsértelmező -és interpoláció nélkül (13. szigorú szabály). Az EACCES hibák felhasználóbarát -üzenetekként jelennek meg. +**Megjegyzések:** Az `execFile('npm', [...])` használatával működik — parancsértelmező és interpoláció nélkül (kötelező szabály #13). +Az EACCES-hibák közérthető üzenetekként jelennek meg. --- #### `POST /api/services/9router/start` -Elindítja a 9Routert. Regisztrál egy felügyelőt, ha még nincs regisztrálva, majd -meghívja a `supervisor.start()` függvényt. Már futó állapotban idempotens. +Elindítja a 9Routert. Regisztrál egy felügyelőt, ha még nincs regisztrálva, majd meghívja a +`supervisor.start()` metódust. Ha már fut, a művelet idempotens. **Kérés törzse:** nincs @@ -282,8 +280,8 @@ meghívja a `supervisor.start()` függvényt. Már futó állapotban idempotens. #### `POST /api/services/9router/stop` -Szabályosan leállítja a 9Routert. SIGTERM jelet küld, 15 másodpercet vár, majd -SIGKILL jelet küld, ha a folyamat még mindig fut. Már leállított állapotban idempotens. +Szabályosan leállítja a 9Routert. SIGTERM jelet küld, 15 másodpercet vár, majd SIGKILL jelet küld, ha a folyamat még mindig fut. +Ha már leállt, a művelet idempotens. **Kérés törzse:** nincs @@ -298,20 +296,19 @@ SIGKILL jelet küld, ha a folyamat még mindig fut. Már leállított állapotba #### `POST /api/services/9router/restart` -Egyenértékű a `stop()`, majd a `start()` művelet műveleti záron belüli -végrehajtásával. +Egyenértékű a `stop()`, majd a `start()` meghívásával a műveleti zároláson belül. **Kérés törzse:** nincs -**Válaszok:** ugyanazok, mint a `start` esetén (a végső `ServiceStatus` értéket adja vissza). +**Válaszok:** megegyeznek a `start` válaszaival (a végleges `ServiceStatus` objektumot adja vissza). --- #### `POST /api/services/9router/update` Frissíti a 9Routert egy újabb npm-verzióra. Ha a szolgáltatás fut, először -leállítja, majd futtatja az npm-telepítést (az újabb verziót helyben telepítve), -végül újraindítja a szolgáltatást. +leállítja, majd futtatja az npm-telepítést (helyben telepítve az újabb verziót), végül +újraindítja a szolgáltatást. **Kérés törzse** (minden mező opcionális): @@ -331,8 +328,8 @@ végül újraindítja a szolgáltatást. #### `POST /api/services/9router/rotate-key` -Új API-kulcsot hoz létre a 9Router számára, titkosítja a tárolás során, és újraindítja a szolgáltatást -(ha fut), hogy az felvegye az új kulcsot a környezetéből. A régi kulcs +Új API-kulcsot hoz létre a 9Routerhez, titkosítja azt tároláskor, és újraindítja a szolgáltatást +(ha fut), hogy az új kulcsot betöltse a környezetéből. A régi kulcs azonnal érvénytelenné válik. **Kérés törzse:** nincs @@ -342,16 +339,16 @@ azonnal érvénytelenné válik. | Állapot | Leírás | | ------- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | A kulcsrotáció sikertelen | +| `500` | A kulcscsere sikertelen | -**Biztonság:** Az új kulcs soha nem kerül visszaadásra a válaszban (nincs hitelesítőadat-szivárgás). -Titkosítva (AES-256-GCM) tárolódik a `version_manager` táblában. +**Biztonság:** Az új kulcs soha nem szerepel a válaszban (nincs hitelesítőadat-szivárgás). +AES-256-GCM algoritmussal titkosítva tárolódik a `version_manager` táblában. --- #### `GET /api/services/9router/status` -Visszaadja az egyesített élő + adatbázisbeli állapotot, beleértve a verzió metaadatait és az API-kulcs előnézetét. +Visszaadja az egyesített élő és adatbázisbeli állapotot, beleértve a verzió metaadatait és az API-kulcs előnézetét. **Válaszok:** @@ -360,7 +357,7 @@ Visszaadja az egyesített élő + adatbázisbeli állapotot, beleértve a verzi | `200` | Lásd az alábbi sémát | | `500` | Az állapot beolvasása sikertelen | -**Válasz sémája:** +**Válaszséma:** ```json { @@ -384,8 +381,8 @@ Visszaadja az egyesített élő + adatbázisbeli állapotot, beleértve a verzi #### `POST /api/services/9router/auto-start` -Átváltja az automatikus indítás jelzőjét. Ha `enabled: true`, a szolgáltatás automatikusan elindul -az OmniRoute következő rendszerindításakor (ha a szolgáltatás telepítve van). +Be- vagy kikapcsolja az automatikus indítás jelzőjét. Ha `enabled: true`, a szolgáltatás automatikusan +elindul az OmniRoute következő rendszerindításakor (ha a szolgáltatás telepítve van). **Kérés törzse:** @@ -404,22 +401,22 @@ az OmniRoute következő rendszerindításakor (ha a szolgáltatás telepítve v #### `GET /api/services/9router/logs` -A 9Router stdout/stderr körkörös pufferéből származó élő naplók SSE-adatfolyama. +A 9Router stdout/stderr gyűrűs pufferéből származó élő naplók SSE-adatfolyama. **Lekérdezési paraméterek:** -| Paraméter | Típus | Alapértelmezett | Leírás | -| --------- | --------- | --------------- | ------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Az először elküldendő korábbi sorok száma (legfeljebb 1000) | -| `filter` | `string` | nincs | Kis- és nagybetűket nem megkülönböztető részszűrő (regex nélkül — ReDoS-biztos) | +| Paraméter | Típus | Alapértelmezett | Leírás | +| --------- | --------- | --------------- | -------------------------------------------------------------------------------------------- | +| `tail` | `integer` | 200 | Az először elküldendő korábbi sorok száma (legfeljebb 1000) | +| `filter` | `string` | nincs | Kis- és nagybetűket figyelmen kívül hagyó részszűrő (nem reguláris kifejezés — ReDoS-biztos) | **SSE-események:** -| Esemény | Adat | Leírás | -| ----------- | ----------- | --------------------------------- | -| `snapshot` | `LogLine[]` | Kezdeti korábbi naplórészlet | -| `log` | `LogLine` | Élő naplósor | -| `heartbeat` | `{}` | Életben tartás 15 másodpercenként | +| Esemény | Adatok | Leírás | +| ----------- | ----------- | ------------------------------------ | +| `snapshot` | `LogLine[]` | Kezdeti korábbi naplórészlet | +| `log` | `LogLine` | Élő naplósor | +| `heartbeat` | `{}` | Életben tartó jel 15 másodpercenként | **LogLine séma:** @@ -433,60 +430,60 @@ A 9Router stdout/stderr körkörös pufferéből származó élő naplók SSE-ad **Válaszok:** -| Állapot | Leírás | -| ------- | ---------------------------------------------------------------- | -| `200` | `text/event-stream` | -| `400` | A `filter` paraméter túl hosszú (> 200 karakter) | -| `404` | A szolgáltatás nem található (nincs regisztrálva a felügyelőben) | +| Állapot | Leírás | +| ------- | -------------------------------------------------------------- | +| `200` | `text/event-stream` | +| `400` | A `filter` paraméter túl hosszú (> 200 karakter) | +| `404` | A szolgáltatás nem található (a supervisor nincs regisztrálva) | --- ### 4.2 CLIProxyAPI-végpontok (10 útvonal) -A CLIProxyAPI végpontstruktúrája megegyezik a 9Routerével a `rotate-key` kivételével, továbbá -tartalmazza az `accounts`, `provider-expose` és `auto-restart-adopted` végpontokat. Mostantól egy -dedikált adatsíkbeli API-kulcsot kap a folyamat indításakor (`needsApiKey: true` a -`bootstrap.ts` fájlban, amelyet a modellek szinkronizálásához használ); a `status` kevesebb mezőt tartalmaz. +A CLIProxyAPI végpontstruktúrája megegyezik a 9Routerével, a `rotate-key` kivételével, továbbá az +`accounts`, `provider-expose` és `auto-restart-adopted` végpontokkal egészül ki. Mostantól egy +dedikált, az indításkor beinjektált adatsíkbeli API-kulcsot kap (`needsApiKey: true` a +`bootstrap.ts` fájlban, amelyet a modellszinkronizáláshoz használ); a `status` kevesebb mezőt tartalmaz. -| Metódus | Útvonal | Leírás | -| ------- | ----------------------------------- | --------------------------------------------------- | -| `POST` | `/api/services/cliproxy/install` | A CLIProxyAPI telepítése npm-ből | -| `POST` | `/api/services/cliproxy/start` | A CLIProxyAPI elindítása | -| `POST` | `/api/services/cliproxy/stop` | A CLIProxyAPI leállítása | -| `POST` | `/api/services/cliproxy/restart` | A CLIProxyAPI újraindítása | -| `POST` | `/api/services/cliproxy/update` | Frissítés újabb verzióra | -| `GET` | `/api/services/cliproxy/status` | Élő + adatbázisbeli állapot (`apiKeyMasked` nélkül) | -| `POST` | `/api/services/cliproxy/auto-start` | Automatikus indítás átváltása | +| Metódus | Útvonal | Leírás | +| ------- | ----------------------------------- | ------------------------------------------ | +| `POST` | `/api/services/cliproxy/install` | A CLIProxyAPI telepítése npm-ből | +| `POST` | `/api/services/cliproxy/start` | A CLIProxyAPI elindítása | +| `POST` | `/api/services/cliproxy/stop` | A CLIProxyAPI leállítása | +| `POST` | `/api/services/cliproxy/restart` | A CLIProxyAPI újraindítása | +| `POST` | `/api/services/cliproxy/update` | Frissítés újabb verzióra | +| `GET` | `/api/services/cliproxy/status` | Élő + DB-állapot (`apiKeyMasked` nélkül) | +| `POST` | `/api/services/cliproxy/auto-start` | Az automatikus indítás be- és kikapcsolása | -A megosztott `GET /api/services/{name}/logs` végpont (lásd a §4.1 szakaszt) mind a -négy szolgáltatással működik a dinamikus `[name]` szegmens használatával. +A megosztott `GET /api/services/{name}/logs` végpont (lásd: §4.1) mind a +négy szolgáltatáshoz használható a dinamikus `[name]` szegmenssel. --- ### 4.3 Mux-végpontok (8 útvonal) -A Mux végpontstruktúrája megegyezik a CLIProxyAPI-éval — az API-felületen nincs `rotate-key` -útvonal (a bearer token a 9Routeréhez hasonlóan, a `getOrCreateApiKey("mux")` -segítségével jön létre, és a `MUX_SERVER_AUTH_TOKEN` környezeti változón keresztül kerül beinjektálásra, de -egyelőre nincs hozzá külön rotációs végpont). A Mux kizárólag életciklus-kezelést kap: a -9Routerrel ellentétben nincs 4. rétegbeli végrehajtója, és soha nem regisztrálják útválasztási szolgáltatóként. +A Mux végpontstruktúrája megegyezik a CLIProxyAPI-éval — az API-felületen nincs +`rotate-key` útvonal (a bearer token a 9Routeréhez hasonlóan, a +`getOrCreateApiKey("mux")` használatával jön létre, és a `MUX_SERVER_AUTH_TOKEN` +környezeti változón keresztül kerül beinjektálásra, de külön rotációs végpont még +nincs). A Mux csak életciklus-kezelést kap: a 9Routerrel ellentétben nem rendelkezik 4. rétegbeli végrehajtóval, és soha nincs útválasztási szolgáltatóként regisztrálva. -| Metódus | Útvonal | Leírás | -| ------- | ------------------------------ | -------------------------------------- | -| `POST` | `/api/services/mux/install` | A Mux telepítése npm-ből (`npm i mux`) | -| `POST` | `/api/services/mux/start` | A Mux elindítása (`mux server`) | -| `POST` | `/api/services/mux/stop` | A Mux leállítása | -| `POST` | `/api/services/mux/restart` | A Mux újraindítása | -| `POST` | `/api/services/mux/update` | Frissítés újabb npm-verzióra | -| `GET` | `/api/services/mux/status` | Élő + adatbázisbeli állapot | -| `POST` | `/api/services/mux/auto-start` | Automatikus indítás átváltása | +| Metódus | Útvonal | Leírás | +| ------- | ------------------------------ | ------------------------------------------ | +| `POST` | `/api/services/mux/install` | A Mux telepítése npm-ből (`npm i mux`) | +| `POST` | `/api/services/mux/start` | A Mux elindítása (`mux server`) | +| `POST` | `/api/services/mux/stop` | A Mux leállítása | +| `POST` | `/api/services/mux/restart` | A Mux újraindítása | +| `POST` | `/api/services/mux/update` | Frissítés újabb npm-verzióra | +| `GET` | `/api/services/mux/status` | Élő + DB-állapot | +| `POST` | `/api/services/mux/auto-start` | Az automatikus indítás be- és kikapcsolása | --- ### 4.4 Bifrost-végpontok (8 útvonal) -A Bifrost egy Go-alapú AI-átjáró továbbító háttérszolgáltatás (`@maximhq/bifrost`). Ugyanazt a -végpontstruktúrát használja, mint a CLIProxyAPI (nincs `rotate-key` — a Bifrost a saját szolgáltatói +A Bifrost egy Go nyelven készült AI-átjáró továbbító háttérrendszer (`@maximhq/bifrost`). Ugyanazt a +végpontstruktúrát használja, mint a CLIProxyAPI (`rotate-key` nélkül — a Bifrost a saját szolgáltatói kulcsait a `config.json` fájlban, a `-app-dir` alatt kezeli). | Metódus | Útvonal | Leírás | @@ -497,27 +494,61 @@ kulcsait a `config.json` fájlban, a `-app-dir` alatt kezeli). | `POST` | `/api/services/bifrost/restart` | A Bifrost újraindítása | | `POST` | `/api/services/bifrost/update` | Frissítés újabb verzióra | | `GET` | `/api/services/bifrost/status` | Élő + DB-állapot | -| `POST` | `/api/services/bifrost/auto-start` | Az automatikus indítás be-/kikapcsolása | -| `GET` | `/api/services/bifrost/logs` | SSE-naplókövetés (a megosztott `[name]/logs` dinamikus útvonalon keresztül) | +| `POST` | `/api/services/bifrost/auto-start` | Az automatikus indítás be- és kikapcsolása | +| `GET` | `/api/services/bifrost/logs` | SSE-naplókövetés (a megosztott dinamikus `[name]/logs` útvonalon keresztül) | -**Útválasztás bekötése:** Ha a `BIFROST_BASE_URL` nincs beállítva, és a felügyelt Bifrost -példány fut, a `getBifrostRoutingConfig()` (a `routingBackend.ts` fájlban) automatikusan -a `http://127.0.0.1:{port}` címet használja a továbbító alap-URL-jeként. A kifejezetten beállított +**Útválasztási összekapcsolás:** Ha a `BIFROST_BASE_URL` nincs beállítva, és a felügyelt Bifrost-példány +fut, a `getBifrostRoutingConfig()` (a `routingBackend.ts` fájlban) automatikusan a +`http://127.0.0.1:{port}` címet használja a továbbító alap-URL-jeként. Az explicit módon beállított `BIFROST_BASE_URL` környezeti változó mindig elsőbbséget élvez. --- ### 4.5 Dario-végpontok (12 útvonal) -Életciklusuk megegyezik a többi szolgáltatáséval (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), továbbá az `admin/` alatt egy tokennel -védett OAuth-vezérlősík található: `admin/accounts`, `admin/import-from-omniroute`, +Az életciklus-struktúra megegyezik a többi szolgáltatáséval (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`), és kiegészül egy tokennel védett OAuth +vezérlősíkkal az `admin/` alatt: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (mindegyiket a `DARIO_ADMIN_TOKEN` védi). -### 4.6 Fordított proxy (a 9Router vezérlőpult beágyazása) +### 4.6 open-wa-végpontok (7 útvonal) -A vezérlőpult a 9Router webes felhasználói felületét iframe-ben ágyazza be egy belső fordított -proxyn keresztül, a következő címen: +Az open-wa (`@open-wa/wa-automate`) egy headless Chromium-példányt vezérel (a +Puppeteer segítségével) a WhatsApp Web automatizálásához. Ugyanazt a végpontstruktúrát +használja, mint a Mux (`rotate-key` útvonal még nincs). Csak életciklus-kezelést kap — +nem útválasztási cél, és nincs 4. rétegbeli végrehajtó-/szolgáltatóbejegyzése. + +| Metódus | Útvonal | Leírás | +| ------- | --------------------------------- | -------------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Az open-wa telepítése npm-ből (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Az open-wa elindítása a 8323-as porton (alapértelmezett) | +| `POST` | `/api/services/openwa/stop` | Az open-wa leállítása | +| `POST` | `/api/services/openwa/restart` | Az open-wa újraindítása | +| `POST` | `/api/services/openwa/update` | Frissítés újabb verzióra | +| `GET` | `/api/services/openwa/status` | Élő + adatbázisbeli állapot | +| `POST` | `/api/services/openwa/auto-start` | Automatikus indítás be- vagy kikapcsolása | +| `GET` | `/api/services/openwa/logs` | SSE-naplófolyam (a megosztott `[name]/logs` dinamikus útvonalon keresztül) | + +**API-kulcs:** `WA_KEY` értékként kerül átadásra — az open-wa általános, `WA_*` előtaggal ellátott környezetiváltozó-felülbírálása ezt a `--key`/`-k` CLI-beállításhoz rendeli +(`dist/cli/setup.js::envArgs()`, ellenőrizve a telepített 4.76.0 +csomaggal). A `generateServiceApiKey()` általi létrehozáskor `ow_` előtagot kap. Az open-wa +a kulcsot egy `key`/`api_key` HTTP-fejlécből olvassa vissza (nem az `Authorization: +Bearer` fejlécből); a `/api-docs*` kifejezetten mentesül az ellenőrzés alól +(`setupAuthenticationLayer` a `dist/cli/server.js` fájlban), így az állapotellenőrzéshez +nincs szükség hitelesítési fejlécre. + +**Párosítás:** az open-wa nem hivatalos, és nem áll kapcsolatban a WhatsApp-pal — a +csatlakoztatott számot kitiltási kockázatnak teszi ki a WhatsApp saját automatizálásészlelése. +Az első indításkor a párosításhoz szükséges QR-kód a szabványos kimenetre kerül, és a +meglévő Naplók panelen/SSE-adatfolyamon keresztül jelenik meg — ebben az integrációban +egyelőre nincs külön QR-kép-végpont. + +--- + +### 4.7 Fordított proxy (a 9Router irányítópult beágyazása) + +Az irányítópult egy belső fordított proxyn keresztül iframe-be ágyazza a 9Router webes +felhasználói felületét a következő címen: ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] @@ -525,18 +556,19 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Ez a proxy: -- Továbbítja a kérést a `http://127.0.0.1:{port}/{path}` címre (kizárólag loopbacken) -- Eltávolítja a bejövő `cookie` és `authorization` fejléceket (az OmniRoute-munkamenet nem szivárog ki) +- Továbbítja a kérést a `http://127.0.0.1:{port}/{path}` címre (csak visszacsatolási interfész) +- Eltávolítja a bejövő `cookie` és `authorization` fejléceket (így az OmniRoute-munkamenet nem szivárog ki) - Beilleszti az `Authorization: Bearer {apiKey}` fejlécet a 9Router-hitelesítéshez -- Eltávolítja a válaszból a `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` fejléceket -- Átírja a HTML-válaszokat a `` beillesztéséhez és az abszolút útvonalak normalizálásához (`/foo` → `/dashboard/.../embed/foo`) +- Eltávolítja a válaszból a `set-cookie`, `content-security-policy`, `x-frame-options` és `cross-origin-*` fejléceket +- Átírja a HTML-válaszokat egy `` elem beillesztéséhez és az abszolút útvonalak normalizálásához (`/foo` → `/dashboard/.../embed/foo`) -A beágyazott vezérlőpulthoz tartozó WebSocket-frissítéseket egy dedikált porton futó -kísérőszerver kezeli (lásd: `src/lib/services/embedWsProxy.ts`). +A beágyazott irányítópult WebSocket-frissítéseit egy külön porton működő kiegészítő +kiszolgáló kezeli (lásd: `src/lib/services/embedWsProxy.ts`). **Biztonság:** A beágyazási proxy útvonalai a `LOCAL_ONLY_API_PREFIXES` alá vannak besorolva, -és csak loopbackről érhetők el. Egy támadó, aki Cloudflare-/Ngrok-alagúton keresztül JWT-t -szerez, nem tud a beágyazott szolgáltatásokhoz proxyn keresztül hozzáférni. +és csak a visszacsatolási interfészről érhetők el. Az a támadó, aki egy +Cloudflare-/Ngrok-alagúton keresztül JWT-t szerez, nem tud hozzáférni a beágyazott +szolgáltatásokhoz a proxyn keresztül. --- diff --git a/docs/i18n/hu/docs/frameworks/MEMORY.md b/docs/i18n/hu/docs/frameworks/MEMORY.md index 64ec59d4fdd2..a714973191f8 100644 --- a/docs/i18n/hu/docs/frameworks/MEMORY.md +++ b/docs/i18n/hu/docs/frameworks/MEMORY.md @@ -143,34 +143,36 @@ A `memory_vec_meta` tábla (migráció: `083_memory_vec.sql`) a következőket t ## Beállítások bővítése -Kilenc beágyazási és vektormező érhető el a `MemorySettingsExtended` típusban a -`src/shared/schemas/memory.ts` fájlban, amelyeket a `src/lib/db/settings.ts` tartósít: - -| Mező | Típus | Alapérték | Leírás | -| ------------------------ | -------------------------------------------------- | --------- | -------------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | A használandó beágyazási forrás | -| `embeddingProviderModel` | `string \| null` | `null` | Szolgáltató/modell `provider/model` formátumban | -| `customBaseUrl` | `string \| null` | `null` | Csak a Memory által használt OpenAI-kompatibilis végpont alap-URL-je | -| `customModelId` | `string \| null` | `null` | Az egyéni végpontnak küldött modellazonosító | -| `transformersEnabled` | `boolean` | `false` | Transformers.js engedélyezése (MiniLM, ~400 MB) | -| `staticEnabled` | `boolean` | `false` | A helyi statikus potion-base-8M modell engedélyezése | -| `rerankEnabled` | `boolean` | `false` | Újrarangsorolási lépés engedélyezése (+200–500 ms/kérés) | -| `rerankProviderModel` | `string \| null` | `null` | Újrarangsorolási szolgáltató/modell `provider/model` formátumban | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | A használandó vektoros háttérrendszer | - -Ezek a `GET /PUT /api/settings/memory` útvonalon érhetők el (`MemorySettingsExtendedSchema` séma). - -A `remote` forrás esetében a Memory az opcionális `customBaseUrl` és +Kilenc beágyazási és vektormező érhető el a `MemorySettingsExtended` típusban, a +`src/shared/schemas/memory.ts` fájlban, és ezek a `src/lib/db/settings.ts` segítségével maradnak tartósan tárolva: + +| Mező | Típus | Alapérték | Leírás | +| ------------------------ | -------------------------------------------------- | --------- | ------------------------------------------------------------------------ | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | A használandó beágyazási forrás | +| `embeddingProviderModel` | `string \| null` | `null` | Szolgáltató/modell `provider/model` formátumban | +| `customBaseUrl` | `string \| null` | `null` | Kizárólag a memóriához használt, OpenAI-kompatibilis végpont alap-URL-je | +| `customModelId` | `string \| null` | `null` | Az egyéni végpontnak küldött modellazonosító | +| `transformersEnabled` | `boolean` | `false` | A Transformers.js használatának engedélyezése (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | A statikus, helyi potion-base-8M modell használatának engedélyezése | +| `rerankEnabled` | `boolean` | `false` | Az újrarangsorolási lépés engedélyezése (+200-500ms/kérés) | +| `rerankProviderModel` | `string \| null` | `null` | Újrarangsorolási szolgáltató/modell `provider/model` formátumban | + +A `rerankProviderModel` feloldását a `POST /v1/rerank` végzi (loopback kapcsolaton keresztül meghívva), ezért bármit elfogad, amit ez az útvonal is: egy válogatott felhőalapú újrarangsorolási modellt (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …), vagy egy OpenAI-kompatibilis szolgáltatói csomópontot `/` formában (például `skilled-mini/bge-reranker-v2-m3` egy TEI/Infinity gép esetén). A loopback csomópontok mindig használhatók; egy másik gazdagépen lévő csomóponthoz (LAN, Tailscale) ezenfelül szükséges a `RERANK_REMOTE_PROVIDER_NODES` funkciójelző, és meg kell felelnie a szolgáltatói kimenő URL-ekre vonatkozó szabályzatnak — lásd: [Funkciójelzők](../reference/FEATURE_FLAGS.md). Az irányítópult választója a válogatott szolgáltatókat és a helyi csomópontokat sorolja fel; bármely érvényes `provider/model` karakterlánc közvetlenül is beállítható a `PUT /api/settings/memory` használatával. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | A használandó vektoros háttérrendszer | + +Ezek a `GET /PUT /api/settings/memory` útvonalon keresztül érhetők el (`MemorySettingsExtendedSchema` séma). + +A `remote` forrás esetén a Memory az opcionális `customBaseUrl` és `customModelId` beállításokat is elfogadja. Ezek együtt egy OpenAI-kompatibilis `/embeddings` végpontot és modellt választanak ki a globális beágyazási nyilvántartás módosítása nélkül. A végpont -használat előtt normalizálásra kerül, és a szolgáltató kimenő URL-ekre vonatkozó szabályzata ellenőrzi: HTTP(S) -szükséges, a beágyazott hitelesítő adatok és lekérdezési karakterláncok nem engedélyezettek, a felhőalapú metaadat- -címek pedig továbbra is blokkolva maradnak. Az üres értékek megőrzik a nyilvántartásban kiválasztott szolgáltatót. Az irányítópultnak -visszaadott hibák meg vannak tisztítva, és a végpont hitelesítő adatai soha nem kerülnek naplózásra. +használat előtt normalizálásra kerül, és a szolgáltatói kimenő URL-ekre vonatkozó szabályzat ellenőrzi: HTTP(S) +szükséges, a beágyazott hitelesítési adatok és a lekérdezési karakterláncok nem engedélyezettek, a felhős metaadat- +címek pedig továbbra is blokkolva maradnak. Az üres értékek megtartják a nyilvántartásban kiválasztott szolgáltatót. Az irányítópultnak +visszaküldött hibák megtisztításra kerülnek, és a végpont hitelesítési adatai soha nem kerülnek naplózásra. > **TODO (D20):** A `global` hatókör (a memóriák megosztása az összes API-kulcs között) -> nincs megvalósítva ebben a kiadásban. Ehhez sémamódosítások és egy globális lekérési -> útvonal szükséges. Külön követendő. +> ebben a kiadásban nincs megvalósítva. Sémamódosításokat és globális lekérési +> útvonalat igényel. Külön követendő. ## Tárolási rétegek diff --git a/docs/i18n/hu/docs/guides/DOCKER_GUIDE.md b/docs/i18n/hu/docs/guides/DOCKER_GUIDE.md index ea8e2d02c57f..c28a95e9137c 100644 --- a/docs/i18n/hu/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/hu/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Gyors futtatás +> **Saját üzemeltetés egyetlen paranccsal?** Lásd az +> [Saját üzemeltetési útmutatót](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (közzétett lemezkép + +> Redis, csak visszacsatolási interfészen, profilválasztás nélkül). Az alábbi gyors futtatás az +> egykonténeres megoldás azoknak a felhasználóknak, akik már máshol futtatják a Redist. + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/hu/docs/guides/TROUBLESHOOTING.md b/docs/i18n/hu/docs/guides/TROUBLESHOOTING.md index ab8c76efa031..64ea91acb2b3 100644 --- a/docs/i18n/hu/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/hu/docs/guides/TROUBLESHOOTING.md @@ -66,18 +66,26 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # hosszabb, korlátozott várakoz --- -## Az npm install figyelmeztetései (ERESOLVE / peer / deprecated) +## `npm install` figyelmeztetések (ERESOLVE / peer / deprecated) -Az `npm install -g omniroute` futtatásakor számos figyelmeztetés jelenhet meg, például `npm warn ERESOLVE`, tárfüggőségekkel kapcsolatos értesítések és `deprecated` üzenetek. **Ezek várhatóak és ártalmatlanok.** A telepítés sikeres volt, ha a kimenetben az `added packages` üzenet látható. +Az `npm install -g omniroute` futtatásakor számos figyelmeztetés jelenhet meg, például `npm warn ERESOLVE`, peer-függőségekkel kapcsolatos értesítések és `deprecated` üzenetek. **Ezek várhatóak és ártalmatlanok.** A telepítés sikeres volt, ha a kimenetben az `added packages` üzenet látható. -A figyelmeztetéseket olyan külső csomagok elavult tárfüggőségi verziótartományai okozzák, amelyekre az OmniRoute-nak nincs befolyása: +A peer-függőségek feloldásával kapcsolatos figyelmeztetések elrejtéséhez használja az OmniRoute támogatott telepítési módját: -1. **A `marked-terminal` által igényelt verzió: `marked >=1 <16`, de a megtalált verzió: `marked@18`** — a gyakorlatban megfelelően működik; csupán a felsőbb szintű tárfüggőségi tartomány elavult. -2. **`deprecated prebuild-install@7.1.3`** — egy tranzitív segédprogram natív binárisok letöltéséhez. Nem ezt használja - a rendszer a rögzített verziójú `wreq-js` átviteli kötés telepítéséhez, és nem jelenti azt, hogy a webes sütik - szolgáltatójának átviteli beállítása sikertelen volt. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +A `--legacy-peer-deps` csak az `ERESOLVE` és a peer-függőségekkel kapcsolatos értesítéseket rejti el. Az elavulásra vonatkozó értesítések továbbra is láthatók maradnak, mert tranzitív, harmadik féltől származó csomagokból erednek; nem jelzik a telepítés sikertelenségét. + +A figyelmeztetéseket olyan, harmadik féltől származó csomagok elavult peer-függőségi tartományai okozzák, amelyekre az OmniRoute-nak nincs befolyása: + +1. **A `marked-terminal` a `marked >=1 <16` verziót igényli, de a talált verzió `marked@18`** — a gyakorlatban megfelelően működik; csupán az upstream peer-tartomány elavult. +2. **`deprecated prebuild-install@7.1.3`** — egy tranzitív segédprogram natív binárisok letöltéséhez. Nem használatos + a rögzített verziójú `wreq-js` átviteli kötés telepítéséhez, és nem jelzi, hogy a web-cookie + szolgáltató átviteli beállítása sikertelen volt. -**Nincs szükség beavatkozásra** — a figyelmeztetések nem némíthatók el teljesen a felsőbb szintű csomagok forkolása nélkül. +**Nincs szükség beavatkozásra** — a figyelmeztetések nem némíthatók el teljesen az upstream csomagok forkolása nélkül. --- diff --git a/docs/i18n/hu/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/hu/docs/providers/CURSOR-API-KEY-AND-CLI.md index 01f605fff6f4..a8449e89495d 100644 --- a/docs/i18n/hu/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/hu/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,43 +4,43 @@ --- -Két módon helyezhető a Cursor az OmniRoute mögé IDE-munkamenet nélkül: +Kétféleképpen helyezhető a Cursor az OmniRoute mögé IDE-munkamenet nélkül: 1. **`cursor-api` szolgáltató** („Cursor API” kártya, alias: `cua`): API-kulcsos - szolgáltató, amely egy Cursor felhasználói API-kulcsot tárol (`crsr_…`, amely a - `https://cursor.com/dashboard/api` oldalon hozható létre). Ezután bármely - OmniRoute-kliens elérheti a Cursor-modelleket a `/v1/chat/completions` - végponton keresztül `cursor-api/` vagy `cua/` néven, a szokásos - kvóta-, tartalékútvonal- és naplózási rétegekkel. Az IDE-szolgáltató - (`cursor`, OAuth-/IDE-munkamenet) változatlan marad. -2. **Cursor CLI-átengedés**: irányítsa a Cursor CLI-t (`agent`) az OmniRoute-ra, - így a CLI minden RPC-hívása egy OmniRoute API-kulccsal lesz hitelesítve, - továbbításra kerül a Cursor felé egy `cursor-api` kapcsolat hitelesítő - adatával, és rögzítésre kerül a Naplók oldalon. - -## Miért történik kulcscsere - -Az `api2.cursor.sh` elutasítja a nyers `crsr_…` kulcsot Bearer tokenként (401). + szolgáltató, amely egy Cursor felhasználói API-kulcsot tárol (`crsr_…`, létrehozható + a `https://cursor.com/dashboard/api` címen). Ezután bármely OmniRoute-kliens + elérheti a Cursor modelljeit a `/v1/chat/completions` végponton keresztül, + `cursor-api/` vagy `cua/` néven, a szokásos kvóta-, tartalékútvonal- + és naplózási rétegekkel. Az IDE-szolgáltató (`cursor`, OAuth/IDE-munkamenet) + változatlan marad. +2. **Cursor CLI közvetlen továbbítása**: irányítsa a Cursor CLI-t (`agent`) az + OmniRoute-ra, így a CLI által indított minden RPC-hitelesítés egy OmniRoute + API-kulccsal történik, amelyet a rendszer egy `cursor-api` kapcsolat + hitelesítő adatával továbbít a Cursor felé, és rögzít a Naplók oldalon. + +## Miért szükséges a kulcscsere? + +Az `api2.cursor.sh` elutasítja a nyers `crsr_…` kulcsot Bearer-tokenként (401). A Cursor CLI először POST-kéréssel elküldi a kulcsot az -`/auth/exchange_user_api_key` végpontra, és egy egy óra múlva lejáró munkamenet- -JWT-t kap; a visszaadott `refreshToken` ugyanazt az `exp` értéket tartalmazza, -ezért a frissítés a kulcs ismételt cseréjét jelenti. -Az `open-sse/services/cursorApiKeyAuth.ts` végrehajtja ezt a cserét, kulcsonként -egy munkamenettokent gyorsítótáraz, öt perccel a lejárat előtt ismét elvégzi a -cserét, és törli a gyorsítótárazott tokent, amikor a Cursor 401-es választ ad. -A `CursorExecutor` közvetlenül a felsőbb szintű adatfolyam megnyitása előtt -hívja meg ezt a `cursor-api` kapcsolatok esetében. +`/auth/exchange_user_api_key` végpontnak, és egy egy óra után lejáró +munkamenet-JWT-t kap; a visszaadott `refreshToken` ugyanazzal az `exp` értékkel +rendelkezik, ezért a frissítéshez ismét el kell végezni a kulcscserét. +Az `open-sse/services/cursorApiKeyAuth.ts` elvégzi ezt a cserét, kulcsonként egy +munkamenettokent gyorsítótáraz, öt perccel a lejárat előtt újra elvégzi a cserét, +és eltávolítja a gyorsítótárazott tokent, amikor a Cursor 401-es választ ad. A +`CursorExecutor` közvetlenül a felsőbb szintű stream megnyitása előtt hívja meg +ezt a `cursor-api` kapcsolatokhoz. ## A `cursor-api` szolgáltató Regisztrációs adatbázis: `open-sse/config/providers/registry/cursor/index.ts` (`cursor_apiProvider`, `authType: "apikey"`, ugyanaz a `format`, `baseUrl` és `models`, mint a `cursor` esetében). Katalóguskártya: -`src/shared/constants/providers/apikey/specialty-media.ts`. Végrehajtó-leképezés: +`src/shared/constants/providers/apikey/specialty-media.ts`. Végrehajtóleképezés: `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Vezérlőpult: Szolgáltatók → Cursor API → API-kulcs hozzáadása. +Irányítópult: Szolgáltatók → Cursor API → API-kulcs hozzáadása. REST: @@ -62,65 +62,78 @@ curl -sS http://localhost:20128/v1/chat/completions \ Megjegyzések: - A `cursor-api` modelllistája a statikus Cursor-regisztrációs adatbázisból - származik (ugyanabból a listából, amelyet az IDE-szolgáltató tartalékként - használ); nincs szükség a `cursor-agent` telepítésére az OmniRoute gazdagépén. + származik (ugyanaz a lista, amelyet az IDE-szolgáltató tartalékként használ); + nincs szükség a `cursor-agent` telepítésére az OmniRoute-gazdagépen. - A `POST /api/providers/{id}/refresh-cursor` kizárólag a `cursor` IDE-szolgáltatóhoz használható; a `cursor-api` kapcsolatok nem rendelkeznek megújítandó IDE-munkamenettel. -## Cursor CLI-átengedés +## Natív modellazonosítók és erőfeszítési szint + +A `cursor` / `cu` és a `cursor-api` / `cua` esetében a megosztott Claude +erőfeszítésnormalizáló változatlanul hagyja a kért modellazonosítót. A Cursor +valódi modellazonosító részeként hirdethet például `-low` utótagot, nem pedig +OmniRoute erőfeszítési aliasként. A Cursor végrehajtó megőrzi az élő +katalógusban található pontos egyezést; ha nincs egyezés, a meglévő +modellfeloldója végzi el az utótag paraméterré alakítását tartalékmegoldásként. + +Ez nem módosítja az erőfeszítés normalizálását a közvetlen Claude-, +Claude-kompatibilis vagy Vertex-útvonalaknál. Az elérhetőség továbbra is a +kiválasztott Cursor-fiók katalógusától és jogosultságaitól függ. + +## Cursor CLI átirányítás Útvonal: `src/app/api/cursor-cli/[...path]/route.ts` → -`open-sse/handlers/cursorCliProxy.ts`. Az `/api/cursor-cli/` előtag azért van -regisztrálva a `src/shared/constants/publicApiRoutes.ts` fájlban, mert a kezelő +`open-sse/handlers/cursorCliProxy.ts`. Az `/api/cursor-cli/` előtag a +`src/shared/constants/publicApiRoutes.ts` fájlban van regisztrálva, mivel a kezelő saját maga végzi a hitelesítést: -| Útvonal | A CLI-től elvárt hitelesítés | Az OmniRoute művelete | -| -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Ellenőrzi a kulcsot, létrehoz egy 1 órás HS256 JWT-t (a `JWT_SECRET` használatával aláírva), majd visszaadja azt | -| minden egyéb útvonal (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Ellenőrzi a kibocsátót, a célközönséget és a lejáratot, kiválaszt egy aktív `cursor-api` kapcsolatot, lecseréli az Authorization fejlécet a kicserélt Cursor-tokenre, majd visszaközvetíti a választ | +| Útvonal | A CLI által küldendő hitelesítés | Az OmniRoute működése | +| ------------------------------------------------------------------------------------------------------------------------------ | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Ellenőrzi a kulcsot, kiállít egy 1 órás HS256 JWT-t (a `JWT_SECRET` használatával aláírva), és visszaadja azt | +| minden más útvonal (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Ellenőrzi a kibocsátót, a célközönséget és a lejáratot, kiválaszt egy aktív `cursor-api` kapcsolatot, lecseréli az Authorization fejlécet a kicserélt Cursor-tokenre, majd streamelve továbbítja vissza a választ | -A CLI dekódolja az `exp` értéket a kapott tokenből, ezért egy átlátszatlan token -átadása esetén szinte minden kérés előtt újból elvégezné a cserét; a létrehozott -JWT ezt elkerüli. Az OmniRoute-tól kapott 401-es válasz hatására a CLI ismét +A CLI dekódolja az `exp` mezőt minden kapott tokenből, ezért ha nem átlátszó +tokent kap, szinte minden kérés előtt újra elvégzi a cserét; a kiállított JWT +ezt elkerüli. Az OmniRoute-tól kapott 401-es válasz hatására a CLI újra elvégzi a cserét. ### Beállítás -1. Hozzon létre egy OmniRoute API-kulcsot (Vezérlőpult → API-kulcsok) és egy +1. Hozzon létre egy OmniRoute API-kulcsot (Irányítópult → API-kulcsok) és egy `cursor-api` kapcsolatot. -2. Állítsa be a CLI-t úgy, hogy HTTP/1.1-et használjon az ügynök adatfolyamához. - A `~/.cursor/cli-config.json` fájlban: +2. Állítsa be, hogy a CLI HTTP/1.1-et használjon az ügynök streamjéhez. A + `~/.cursor/cli-config.json` fájlban: ```json { "network": { "useHttp1ForAgent": true } } ``` - Enélkül a CLI HTTP/2-n keresztül nyitja meg az ügynökfordulót egy külön - konfigurált ügynökgazdagép felé, és csak a vezérlősík RPC-hívásai haladnak át - a végponton. + E beállítás nélkül a CLI az ügynökmenetet HTTP/2-n keresztül, egy külön + konfigurált ügynökgazdagéphez nyitja meg, és csak a vezérlősík RPC-i haladnak + át a végponton. -3. Futtassa a CLI-t az OmniRoute használatával: +3. Futtassa a CLI-t az OmniRoute-on keresztül: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli - export CURSOR_API_KEY= + export CURSOR_API_KEY= agent -p --trust "Reply with exactly OK" ``` -Minden továbbítás bekerül a Naplókba `cursor-api` szolgáltatóval, +Minden továbbítás megjelenik a Naplókban `cursor-api` szolgáltatóval, `cursor-cli` kéréstípussal és `/api/cursor-cli/` útvonallal, az OmniRoute -API-kulcshoz és a kérést kiszolgáló kapcsolathoz rendelve. +API-kulcshoz és a kérést kiszolgáló kapcsolathoz társítva. -### Hibalehetőségek +### Hibamódok -| Helyzet | Válasz a CLI-nak | +| Helyzet | Válasz a CLI-nek | | ---------------------------------------------------- | ------------------------------------------------------------- | -| Ismeretlen OmniRoute-kulcs és `REQUIRE_API_KEY=true` | 401 `unauthenticated` a cserénél | -| `REQUIRE_API_KEY=false` | névtelen munkamenet (a `/v1/*` viselkedését követi) | -| Lejárt / idegen / módosított munkamenet-JWT | 401, a CLI újra végrehajtja a cserét | +| Ismeretlen OmniRoute-kulcs és `REQUIRE_API_KEY=true` | 401 `unauthenticated` a csere során | +| `REQUIRE_API_KEY=false` | névtelen munkamenet (a `/v1/*` viselkedését tükrözi) | +| Lejárt / idegen / módosított munkamenet-JWT | 401, a CLI újra elvégzi a cserét | | A csere után visszavont OmniRoute API-kulcs | 401 a következő RPC-nél | -| Nincs aktív `cursor-api`-kapcsolat | 503 `unavailable` | +| Nincs aktív `cursor-api` kapcsolat | 503 `unavailable` | | A Cursor elutasítja a kapcsolat kulcsát | 401 `unauthenticated`, a gyorsítótárazott munkamenet törlődik | -| A felsőbb szintű szolgáltatás nem érhető el | 502 `unavailable` (megtisztított üzenet) | -| A `JWT_SECRET` nincs beállítva | 503 a cserénél | +| A felsőbb rétegbeli szolgáltatás nem érhető el | 502 `unavailable` (megtisztított üzenet) | +| A `JWT_SECRET` nincs beállítva | 503 a csere során | diff --git a/docs/i18n/hu/docs/reference/API_REFERENCE.md b/docs/i18n/hu/docs/reference/API_REFERENCE.md index 50e8401d02ab..e95e675a490c 100644 --- a/docs/i18n/hu/docs/reference/API_REFERENCE.md +++ b/docs/i18n/hu/docs/reference/API_REFERENCE.md @@ -454,8 +454,8 @@ Ezt a végpontot akkor használja, ha egy sidecar folyamaton kívül fut, és ne | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | | POST | `/v1/audio/speech` | OpenAI TTS (hangtörzset ad vissza) | | POST | `/v1/rerank` | Cohere/Voyage-stílusú újrarangsorolás | -| POST | `/v1/classify` | Jina osztályozás (`api.jina.ai`) | -| POST | `/v1/segment` | Jina szegmentáló (`segment.jina.ai`) | +| POST | `/v1/classify` | Jina-osztályozás (`api.jina.ai`) | +| POST | `/v1/segment` | Jina-szegmentáló (`segment.jina.ai`) | | POST | `/v1/moderations` | OpenAI Moderations | | GET | `/v1/models` | OpenAI | | POST | `/v1/messages/count_tokens` | Anthropic | @@ -469,15 +469,15 @@ Ezt a végpontot akkor használja, ha egy sidecar folyamaton kívül fut, és ne | POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenizált aliasa | | GET | `/api/v1/vscode/{token}/api/tags` | Ollama-címkék tokenizált aliasa | -Minden POST-útvonal ugyanazt a formát követi: `Bearer your-api-key` + Zod által ellenőrzött JSON-törzs (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` stb.; lásd: `src/shared/validation/schemas.ts`). Sémahiba esetén 4xx válasz érkezik. +Minden POST-útvonal ugyanazt a struktúrát követi: `Bearer your-api-key` + Zod által ellenőrzött JSON-törzs (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` stb.; lásd: `src/shared/validation/schemas.ts`). A sémaellenőrzés sikertelensége esetén 4xx válasz érkezik. -Azon kliensek számára, amelyek nem tudják csatolni az `Authorization: Bearer ...` fejlécet, az OmniRoute az API-kulcsokat az URL-ben is elfogadja, akár lekérdezési karakterláncon alapuló kompatibilitással (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), akár az alább dokumentált, dedikált `/api/v1/vscode/{token}/...` végpontokon keresztül. +Azon kliensek számára, amelyek nem tudják csatolni az `Authorization: Bearer ...` fejlécet, az OmniRoute az URL-ben is elfogad API-kulcsokat, akár lekérdezésikarakterlánc-kompatibilitással (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), akár az alább dokumentált, dedikált `/api/v1/vscode/{token}/...` végpontokon keresztül. ```bash -# Újrarangsorolás +# Újrarangsorolás (felhőalapú nyilvántartási szolgáltató vagy OpenAI-kompatibilis szolgáltatói csomópont „/” formában) POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina-osztályozás (Foundation API hitelesítő adatok) +# Jina-osztályozás (Foundation API-hitelesítő adatok) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Jina-szegmentáló @@ -490,16 +490,38 @@ POST /v1/search { "query": "...", "provider": "jina-search" } POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } # TTS — audio/mpeg (vagy a kért formátumú) törzset ad vissza -POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } +POST /v1/audio/speech { "model": "openai/tts-1", "input": "Helló", "voice": "alloy" } # Képszerkesztés (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Videó- és zenegenerálás (szolgáltatói előtaggal ellátott modellazonosító) +# Videó-/zenegenerálás (szolgáltatói előtaggal ellátott modellazonosító) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` +> **Újrarangsorolási szolgáltatói csomópontok:** A `POST /v1/rerank` OpenAI-kompatibilis szolgáltatói csomópontokhoz +> (oMLX, vLLM, Infinity, átjáró mögötti TEI stb.) is irányít, amelyek címzése `/` formában történik. A visszacsatolási +> csomópontok (`localhost`, `127.0.0.1`, `172.16.0.0/12`) mindig használhatók. Bármely más +> állomáson található csomópont — legyen az egy LAN-gép vagy Tailscale-partner — csak akkor használható, ha az üzemeltető engedélyezi a +> `RERANK_REMOTE_PROVIDER_NODES` funkciójelzőt, **és** a csomópont alap-URL-je megfelel a szolgáltató +> kimenő URL-ekre vonatkozó szabályzatának (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); +> a felhőmetaadat-állomásokhoz soha nem történik továbbítás. A memóriamotor újrarangsorolási lépése visszacsatoláson keresztül hívja +> ezt az útvonalat, ezért ugyanez a szabály vonatkozik a Memória beállításaiban szereplő `rerankProviderModel` értékére is. +> +> **Helyi szerverstruktúrák:** A csomópont hívása a `/v1/rerank` címen történik, 404 esetén pedig a `/rerank` +> címen (Infinity, TEI). A továbbított törzs tartalmazza mind a Cohere/OpenAI-féle elnevezéseket (`documents`, +> `return_documents`), mind a TEI-féle elnevezéseket (`texts`, `return_text`), a továbbított válasz pedig +> a Cohere-borítékra lesz normalizálva: a TEI csupasz `[{index, score, text}]` formátuma, a vékony átjáróktól érkező +> `{results: [{index, score}]}`, valamint a Voyage-stílusú `{data: [...]}` is +> `{results: [{index, relevance_score, document?}]}` formában kerül vissza a klienshez, pontszám szerint rendezve és a `top_n` értékére korlátozva. + +> **Szolgáltatói csomópontok felderítése:** Az OpenAI-kompatibilis szolgáltatói csomópontokon található modellek a `GET /v1/models` +> válaszában a csomópont előtagja alatt jelennek meg. A végpont-metaadatokat nem tartalmazó sorok (ami a helyi `/v1/models` listákra jellemző) +> öröklik a csomópont `apiType` értékét, így egy `embeddings` csomópont modelljei `type: "embedding"`, egy +> `rerank` csomópont modelljei pedig `type: "rerank"` típusúak lesznek az alapértelmezett csevegéstípus helyett; a szinkronizált vagy manuálisan hozzáadott sorokon megadott explicit +> `supportedEndpoints` továbbra is elsőbbséget élvez. + ### Dedikált szolgáltatói útvonalak ```bash @@ -508,7 +530,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -A rendszer automatikusan hozzáadja a szolgáltatói előtagot, ha az hiányzik. A nem egyező modellek `400` választ eredményeznek. +A szolgáltatói előtag automatikusan hozzáadódik, ha hiányzik. A nem megfelelő modellek `400` állapotkódot adnak vissza. --- diff --git a/docs/i18n/hu/docs/routing/REASONING_REPLAY.md b/docs/i18n/hu/docs/routing/REASONING_REPLAY.md index 241a2a303b9d..42ffe3e1d718 100644 --- a/docs/i18n/hu/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/hu/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ A tipikus kliensek (Cursor, Cline, Roo Code, OpenAI SDK) azonban eltávolítják ## Architektúra ``` -N. forduló (az asszisztens választ állít elő): - → a válasz reasoning_content + tool_calls tartalmat tartalmaz +N. kör (asszisztens generál): + → a válasz tartalmazza: reasoning_content + tool_calls → ha requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - írás (memória + DB), minden tool_call.id alapján kulcsolva - → a válasz továbbítása a kliensnek (amely megtarthatja vagy eldobhatja az érvelést) + írás (memória + DB), minden tool_call.id kulccsal + → válasz továbbítása a kliensnek (amely megtarthatja vagy eldobhatja a gondolatmenetet) -N+1. forduló (a kliens követő kérést küld): +N+1. kör (kliens küldi a folytatást): → a fordító észleli: requiresReasoningReplay(provider, model) === true - → minden tool_calls értékkel rendelkező, reasoning_content nélküli asszisztensi üzenetnél: + → minden olyan asszisztens üzenethez, amelyben vannak tool_calls, de nincs reasoning_content: lookupReasoning(toolCalls[0].id) → memória → DB - találat → msg.reasoning_content = cached; recordReplay() - nincs találat → msg.reasoning_content = "" (örökölt tartalékmegoldás a régebbi DeepSeek-verziókhoz) - → a felsőbb szintű szolgáltató konzisztens előzményeket lát → nincs 400-as hiba + találat → msg.reasoning_content = gyorsítótárazott; recordReplay() + nincs találat → msg.reasoning_content = "" (örökölt tartalék régebbi DeepSeek verziókhoz) + → az upstream konzisztens előzményeket lát → nincs 400-as hiba ``` -A rögzítés az `open-sse/handlers/chatCore.ts` fájlban történik (két helyen, a két `cacheReasoningFromAssistantMessage` hívási pontnál). Az újrajátszás az `open-sse/translator/index.ts` fájlban, a séma kényszerített átalakítása után, de a továbbítás előtt történik. +A rögzítés az `open-sse/handlers/chatCore.ts` fájlban történik (két helyen, a két `cacheReasoningFromAssistantMessage` hívási pontnál). A visszajátszás az `open-sse/translator/index.ts` fájlban történik, a séma kényszerítése után, de a továbbítás előtt. + +Az egyszerű (nem tool-call) asszisztens körök kulcsozása eltérő: a `buildAssistantMessageCacheKey()` a munkamenet hatókörét és az adott körig terjedő, normalizált OpenAI-formátumú átiratot dolgozza fel, mivel a DeepSeek minden korábbi kör gondolatmenetét igényli, amint a `tools` jelen van. A Responses-API célpontok esetében (például `opencode-go/deepseek-v4-flash`, a `/responses` útvonalra irányítva) az upstream törzs `input`-ot tartalmaz, nem `messages`-t, ezért a `translateRequest()` (`open-sse/translator/index.ts`) jelenti a feldolgozott pivot átiratot egy visszahívási opción keresztül, a rögzítési pontok pedig ugyanazt az átiratot dolgozzák fel. A Responses visszajátszási menet minden forrásformátum esetén az OpenAI pivoton fut, így az Anthropic Messages kliensek (Claude → OpenAI → Responses) szintén visszajátszásra kerülnek. ## Tárolás — hibrid memória + SQLite @@ -56,7 +58,7 @@ Az írás mindkét rétegbe megtörténik. Az olvasás először a memóriát vi - Memóriabejegyzések maximális száma: `200` (`MAX_MEMORY_ENTRIES`) - Kiürítés: először a legrégebbi `createdAt` értékű bejegyzés -## Adatbázisséma +## Adatbázis séma Migráció: `src/lib/db/migrations/033_create_reasoning_cache.sql` @@ -64,7 +66,6 @@ Migráció: `src/lib/db/migrations/033_create_reasoning_cache.sql` CREATE TABLE IF NOT EXISTS reasoning_cache ( tool_call_id TEXT PRIMARY KEY, provider TEXT NOT NULL, - model TEXT NOT NULL, reasoning TEXT NOT NULL, char_count INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (datetime('now')), @@ -72,7 +73,7 @@ CREATE TABLE IF NOT EXISTS reasoning_cache ( ); ``` -Indexek: `expires_at`, `provider`, `model`, `created_at`. Az `expires_at` Unix-epoch másodpercekben van tárolva; a SELECT-réteg az örökölt szöveges értékeket az `EXPIRES_AT_EPOCH_SQL` segítségével normalizálja. +Indexek: `expires_at`, `provider`, `model`, `created_at`. Az `expires_at` Unix epoch másodpercként van tárolva; a SELECT réteg normalizálja az örökölt szöveges értékeket az `EXPIRES_AT_EPOCH_SQL` segítségével. ## Szolgáltató-/modellészlelés diff --git a/docs/i18n/hu/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/hu/docs/security/SOCKET_DEV_FINDINGS.md index fe481dc92bd4..7a5d28035bf9 100644 --- a/docs/i18n/hu/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/hu/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,23 +4,15 @@ --- -Ez a dokumentum a karbantartó által készített tanúsítvány az `omniroute@3.8.5` -csomaggal kapcsolatban jelzett hat `AI-detected potential malware` megállapításról, -valamint az `omniroute@3.8.6` verzióban alkalmazott kockázatcsökkentő -intézkedésekről. Céljai: - -1. A biztonsági folyamatok üzemeltetői egyetlen hivatkozási alappal rendelkezzenek, - amikor a megállapításokat a tényleges forráskód alapján kell értékelniük. -2. A jövőbeli MI-alapú ellenőrzők felismerhessék a karbantartó által aláírt - nyilatkozatot arról, hogy minden megjelölt útvonal szándékos, külön - engedélyezést igényel, és dokumentálva van. -3. Írásos nyilvántartásunk legyen arról, _miért_ olyan az egyes hívási helyek - kialakítása, amilyen — így egy jövőbeli refaktorálás nem vezet véletlenül - egy szándékosan eltávolított ujjlenyomat újbóli bevezetéséhez. - -Ha olyan ellenőrzőt üzemeltet, amely a v3.8.6 kockázatcsökkentő intézkedéseinek -kiadása után ismét megjelöli az alábbi hívási helyek bármelyikét, kérjük, nyisson -egy hibajegyet az ellenőrzési nyomvonallal, és itt kibővítjük a tanúsítványt. +> **Hatály megjegyzés:** A `socket.yml` konfigurálja a Socket.dev regisztrációs oldalán történő, közzététel utáni npm műtermék vizsgálatát (kihagyandó útvonalak a nem szállított tartalmakhoz, mint például a `tests/`, `docs/`, és a build jelentések). Nem kapcsol be CI/PR egyesítési kaput — nincs munkafolyamat a `.github/workflows` fájlban, nincs `package.json` szkript, és nincs `Makefile` cél, ami meghívná a Socket.dev-et. + +Ez a dokumentum a karbantartó által írt igazolás az `omniroute@3.8.5` ellen felmerült hat `AI-detected potential malware` megállapításról és az `omniroute@3.8.6` verzióban alkalmazott enyhítésekről. Célja, hogy: + +1. A biztonsági pipeline operátorok egyetlen hivatkozással rendelkezzenek, amelyet idézhetnek, amikor a megállapításokat az aktuális forrással szemben kell értékelniük. +2. A jövőbeli AI szkennerek felismerjék a karbantartó által aláírt állítást, miszerint minden megjelölt útvonal szándékos, választható és dokumentált. +3. Írásos feljegyzésünk legyen arról, hogy _miért_ alakult ki az egyes hívási pontok a jelenlegi formájukban — így egy jövőbeli refaktorálás véletlenül sem vezet vissza egy olyan ujjlenyomatot, amelyet szándékosan eltávolítottak. + +Ha olyan szkennert üzemeltet, amely a v3.8.6 enyhítések bevezetése után újra megjelöli az alábbi hívási pontok bármelyikét, kérjük, nyisson egy hibajegyet a vizsgálati nyomkövetéssel, és mi kiegészítjük az igazolást itt. --- diff --git a/docs/i18n/hy/README.md b/docs/i18n/hy/README.md index 4ec2d0a21b02..c9a4b51506de 100644 --- a/docs/i18n/hy/README.md +++ b/docs/i18n/hy/README.md @@ -19,17 +19,17 @@
-## 💰 Ամսական ~1.62B անվճար թոքեն +## 💰 ~1.62Բ Անվճար Թոքեն / Ամիս
-> Անվճար մակարդակները ձեռքով միավորելը դժվար է՝ տասնյակ SDK-ներ, տասնյակ արագության սահմանաչափեր, և ոչ մի պատկերացում, թե իրականում որքան ռեսուրս ունեք։ OmniRoute-ը ցուցակագրում է **անվճար մակարդակի 491 գրառում՝ 35 պարբերաբար թարմացվող ընդհանուր պուլերի բանալիներում** և հաշվարկում է թոքենների գլխավոր ցուցանիշը՝ հիմնվելով **հրապարակված դրական ամսական բյուջե ունեցող 17 պուլերի և Groq-ի՝ յուրաքանչյուր մոդելի համար սահմանված հինգ առավելագույն սահմանաչափերի վրա**՝ բացառելով ընդհանուր պուլերից առաջացող կրկնահաշվարկը։ Քվոտաները, որոնք հասանելի են դառնում միայն տարածաշրջանային ինքնության ստուգումից հետո (այսօր՝ ModelScope), ցուցադրվում են առանձին՝ +~6M տարածաշրջանային ինքնության ստուգման հետևում, և երբեք չեն գումարվում գլխավոր ցուցանիշին։ Արդյունքը մշտապես տեսանելի է կառավարման վահանակում (`/dashboard/free-tiers`)։ +> Անվճար սակագնային պլանների (free tiers) ձեռքով համակցումը տանջալից է՝ տասնյակ SDK-ներ, տասնյակ սահմանաչափեր (rate limits) և ոչ մի հստակ պատկերացում, թե իրականում որքան ռեսուրս ունեք: OmniRoute-ը կատալոգավորում է **489 անվճար սակագնային գրառումներ 35 պարբերական pool key-երի միջոցով** և հաշվարկում է թոքենների ընդհանուր քանակը **17 pool-երից, որոնք ունեն հրապարակված դրական ամսական բյուջե, գումարած հինգ Groq սահմանաչափեր ըստ մոդելի**, զտված ընդհանուր pool-երի կրկնություններից: Քվոտաները, որոնք բացվում են միայն տարածաշրջանային ինքնության ստուգումից հետո (այսօր՝ ModelScope), ցուցադրվում են առանձին՝ +~6Մ տարածաշրջանային ստուգման հետևում, և երբեք չեն գումարվում ընդհանուր թվին: Արդյունքը տեսանելի է մնում վահանակի վրա (`/dashboard/free-tiers`): -OmniRoute-ի անվճար մակարդակի բյուջեի քարտ՝ ամսական կայուն ~1.62B անվճար թոքեն, գրանցման վարկերի շնորհիվ՝ մինչև ~2.22B առաջին ամսում, 35 փաստաթղթավորված պարբերաբար թարմացվող ընդհանուր պուլերի բանալիներից, որոնք մեկ վերջնակետի հետևում ընդգրկում են անվճար մակարդակի 491 ցուցակագրված գրառում։ Ընդհանուր պուլերի կրկնահաշվարկը բացառող ազնիվ հաշվարկ՝ յուրաքանչյուր ընդհանուր պուլը հաշվվում է մեկ անգամ՝ ներառյալ հրապարակված դրական ամսական թոքենային բյուջե ունեցող 17 պարբերական պուլերը և Groq-ի՝ յուրաքանչյուր մոդելի համար սահմանված հինգ առավելագույն սահմանաչափերը։ 13 մատակարար պայմանների ռիսկերի կատալոգում նշված է որպես խուսափելու ենթակա, որպեսզի որոշումը կայացնեք դուք։ Բյուջեի գոտին ներառում է Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (յուրաքանչյուր մոդելի համար հինգ առավելագույն սահմանաչափ) և ավելի փոքր պուլեր, ինչպես նաև առաջին ամսվա գրանցման վարկեր և մշտապես անվճար՝ առանց թոքենների սահմանաչափի մատակարարներ, որոնք ցուցադրվում են առանձին, որպեսզի երբեք արհեստականորեն չմեծացնեն գլխավոր ցուցանիշը։ Օգտագործված և մնացած ծավալների ընթացիկ տվյալները՝ /dashboard/free-tiers-ում։ +OmniRoute free-tier բյուջեի քարտ. ~1.62Բ անվճար թոքեն ամսական կայուն, մինչև ~2.22Բ առաջին ամսում գրանցման կրեդիտներով, 35 փաստաթղթավորված պարբերական pool key-երից, որոնք ներառում են 489 կատալոգավորված անվճար գրառումներ մեկ endpoint-ի հետևում: Ազնիվ pool-deduped հաշվարկ — յուրաքանչյուր ընդհանուր pool հաշվվում է մեկ անգամ, ներառյալ 17 պարբերական pool-եր հրապարակված դրական ամսական թոքենների բյուջեով, գումարած հինգ Groq սահմանաչափեր ըստ մոդելի. 13 մատակարարներ նշված են որպես «խուսափել» պայմանների ռիսկի կատալոգում, այնպես որ դուք եք որոշում: Բյուջեի սանդղակը ներառում է Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (հինգ սահմանաչափ ըստ մոդելի) և ավելի փոքր pool-եր, գումարած առաջին ամսվա գրանցման կրեդիտները և մշտապես անվճար առանց թոքենների սահմանափակման մատակարարները, որոնք ներկայացված են առանձին, որպեսզի երբեք չուռճացնեն հիմնական թիվը: Օգտագործված/մնացած ռեսուրսների ուղիղ թարմացումը /dashboard/free-tiers էջում: -> Գործող `/dashboard/free-tiers` էջի անիմացված ամփոփումը։ Ամբողջական մեթոդաբանությունը (պուլերի կրկնահաշվարկի բացառում, վարկային մակարդակներ, մատակարարների պայմաններ)՝ **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**։ +> Ուղիղ եթերում գործող `/dashboard/free-tiers` էջի անիմացիոն ամփոփումը: Ամբողջական մեթոդաբանությունը (pool-երի զտում, կրեդիտների մակարդակներ, մատակարարների պայմաններ). **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**: > -> Այս թվերը երկու շաբաթը մեկ կրկին ստուգվում են գործող կատալոգի համեմատ և **փոխվում են երկու ուղղությամբ էլ**․ եթե մատակարարը դադարեցնում է անվճար մակարդակը, թիվը նվազում է, իսկ նորի ավելացման դեպքում՝ աճում։ Մենք հրապարակում ենք կատալոգի իրական հաշվարկը, ոչ թե դեպի վեր կլորացված լավագույն հնարավոր տարբերակը։ +> Այս թվերը վերստուգվում են երկու շաբաթը մեկ անգամ՝ համեմատվելով գործող կատալոգի հետ և **փոփոխվում են երկու ուղղությամբ** — եթե մատակարարը դադարեցնում է անվճար սակագինը, թիվը նվազում է. եթե նորն է հայտնվում, այն աճում է: Մենք հրապարակում ենք այն, ինչ իրականում հաշվարկում է կատալոգը, այլ ոչ թե կլորացված լավագույն տարբերակը:
@@ -37,29 +37,29 @@

-⭐ Աստղ տվեք ռեպոզիտորիային, եթե OMNIROUTE-ն օգնել է ձեզ գումար խնայել և հեշտացնել աշխատանքը։ +⭐ Նշեք ռեպոզիտորիան աստղիկով, եթե OMNIROUTE-ը օգնել է ձեզ խնայել գումար և հեշտացնել ձեր աշխատանքը:

-[![Աստղեր](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) +[![Stars](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) diegosouzapw%2FOmniRoute | Trendshift -[![Աստղերի պատմության վարկանիշ](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) +[![Star History Rank](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) [![olud.ai](https://olud.ai/badge.php?tool=diegosouzapw-omniroute)](https://olud.ai/project/diegosouzapw-omniroute.html) ### 💬 Միացեք համայնքին -**👋 Հետևեք նախագծի սպասարկողին՝ առաջինը տեղեկանալու նոր մատակարարների, թողարկումների և խորհուրդների մասին․** +**👋 Հետևեք հեղինակին — առաջինը ստացեք տեղեկություններ նոր մատակարարների, թողարկումների և խորհուրդների մասին:** -[![Հետևեք Diego-ին LinkedIn-ում](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) -[![Հետևեք @diegosouzapw-ին GitHub-ում](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) +[![Follow Diego on LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) +[![Follow @diegosouzapw on GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) -[![WhatsApp՝ համաշխարհային](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) -[![WhatsApp՝ Բրազիլիա](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) -[![Կայք](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) +[![WhatsApp Global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) +[![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) +[![Website](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Հարցեր, մատակարարների վերաբերյալ խորհուրդներ, զարգացման ճանապարհային քարտեզ և աջակցություն → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Համաշխարհային](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Բրազիլիա](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Պորտալ](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Հարցեր, խորհուրդներ մատակարարների վերաբերյալ, ճանապարհային քարտեզ և աջակցություն → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -592,7 +592,7 @@ Radar-ի օգտագործումը կամընտիր է, և այն աշխատու ## 🤖 Համատեղելի CLI-ներ և կոդավորման գործակալներ -> Մեկ կազմաձևում՝ `http://localhost:20128/v1`, և **յուրաքանչյուր** AI IDE կամ CLI աշխատում է անվճար ու ցածրարժեք մոդելներով։ +> Մեկ կոնֆիգուրացիա՝ `http://localhost:20128/v1`, և **յուրաքանչյուր** AI IDE կամ CLI աշխատում է անվճար և ցածրարժեք մոդելների վրա:
@@ -626,26 +626,26 @@ Radar-ի օգտագործումը կամընտիր է, և այն աշխատու - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ նաև աշխատում է հետևյալների հետ · Kiro · Command Code · Antigravity · Windsurf · AMP · OpenAI-ի հետ համատեղելի ցանկացած գործիք ++ աշխատում է նաև · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · ցանկացած OpenAI-ի հետ համատեղելի գործիքի հետ
-📖 Յուրաքանչյուր գործիքի կարգավորում բոլոր 36 գործիքների համար (26 CLI Code + 10 CLI Agent) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode փլագին → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Յուրաքանչյուր գործիքի կարգավորում բոլոր 36 գործիքների համար (26 CLI Code's + 10 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode պլագին → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)
-**Գործարկեք աջակցվող ցանկացած CLI OmniRoute-ի միջոցով՝ մեկ հրամանով** — առանց կազմաձևման ֆայլեր գրելու, -հավատարմագրերը ներարկվում են յուրաքանչյուր գործընթացի համար, իսկ Qwen/Gemini-ն ստանում են ժամանակավոր մեկուսացված home պանակ՝ +**Գործարկեք ցանկացած աջակցվող CLI OmniRoute-ի միջոցով մեկ հրամանով** — առանց կոնֆիգուրացիոն ֆայլեր գրելու, +հավատարմագրերը ներարկվում են յուրաքանչյուր պրոցեսի համար, Qwen/Gemini-ն ստանում է մեկանգամյա օգտագործման մեկուսացված տուն: ```bash -omniroute run claude --model openai/gpt-5.4 # Claude Code +omniroute run claude --model openai/gpt-5.4 # Claude կոդ omniroute run codex --model glm/glm-5.2 # OpenAI Codex CLI omniroute run aider --model glm/glm-5.2 -- --message "reply OK" omniroute run goose --model glm/glm-5.2 @@ -653,27 +653,27 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Կամ ինտերակտիվ կերպով ընտրեք մատակարարն ու մոդելը և գրեք տվյալ գործիքի սեփական կազմաձևումը. +# Կամ ինտերակտիվորեն ընտրեք մատակարար+մոդել և գրեք գործիքի սեփական կոնֆիգուրացիան: omniroute configure codex # նաև՝ claude opencode qwen aider goose gemini cline continue kilo ``` -Յուրաքանչյուր հրաման հաշվի է առնում ակտիվ հեռակա համատեքստը (`omniroute connect `), `--dry-run`-ը -նախադիտում է ճշգրիտ env/args-ը՝ առանց գործարկման, իսկ `--api-key-env NAME`-ը գաղտնիքները չի գրանցում -ձեր shell-ի պատմության մեջ։ → [CLI ինտեգրումներ](docs/guides/CLI-INTEGRATIONS.md) +Յուրաքանչյուր հրաման հարգում է ակտիվ հեռավոր կոնտեքստը (`omniroute connect `), `--dry-run`-ը +նախադիտում է ճշգրիտ միջավայրը/փաստարկները՝ առանց կատարելու, իսկ `--api-key-env NAME`-ը գաղտնիքները պահում է +ձեր shell-ի պատմությունից դուրս: → [CLI ինտեգրումներ](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 AI մատակարար — 152-ը կատալոգում նշված են որպես անվճար +## 🌐 357 AI Պրովայդերներ — 152 Կատալոգում նշված անվճար
-> **357 գրանցված մատակարար**՝ կանոնական չաթի, մեդիայի, որոնման, տեղային, ամպային գործակալների և համակարգային հավաքածուներում, որոնցից **152-ն ունեն `hasFree: true` հայտնաբերման մետատվյալը**։ Չաթի մոդելների ռեեստրը ներառում է **229 մատակարար / մատակարար-մոդել 2,554 առանձին զույգ / 1,283 սկզբնական մոդելի ID**․ անվճար բյուջեների առանձին կատալոգն ունի **491 տող՝ ըստ մոդելի**, **35 պարբերական պուլ** և **54 պարբերական/առանց բանալու՝ ընդմիշտ անվճար մատակարար**։ Նախագծմամբ սրանք տարբեր հայտարարներ են․ սահմանումները և պուլերի կրկնությունները բացառող հաշվարկները ներկայացված են [Մատակարարների տեղեկատուում](docs/reference/PROVIDER_REFERENCE.md) և [Անվճար մակարդակներում](docs/reference/FREE_TIERS.md)։ +> **357 գրանցված պրովայդերներ** չաթի, մեդիայի, որոնման, լոկալ, ամպային գործակալի և համակարգային հավաքածուներում, ներառյալ **152-ը, որոնք կրում են `hasFree: true` հայտնաբերման մետատվյալներ**։ Չաթի մոդելների ռեգիստրը ներառում է **229 պրովայդեր / 2,554 տարբեր պրովայդեր-մոդել զույգեր / 1,283 հում մոդելի ID**; առանձին անվճար բյուջեի կատալոգն ունի **491 մոդելային տող**, **35 կրկնվող պուլեր** և **54 կրկնվող/առանց բանալու հավերժ անվճար պրովայդերներ**։ Սրանք նախագծված են տարբեր հայտարարներով. սահմանումները և պուլ-դեդուպացված հաշվարկները գտնվում են [Provider Reference](docs/reference/PROVIDER_REFERENCE.md) և [Free Tiers](docs/reference/FREE_TIERS.md) փաստաթղթերում։
-### 🏢 Յուրաքանչյուր խոշոր լաբորատորիա՝ մեկ վերջնակետի միջոցով +### 🏢 Յուրաքանչյուր խոշոր լաբորատորիա — մեկ վերջնակետի միջոցով @@ -702,32 +702,32 @@ omniroute configure codex # նաև՝ claude opencode qwen aider goose g
-…և ևս 330+ մատակարար․ յուրաքանչյուր պատկերակ իրական ժամանակում բեռնվում է կառավարման վահանակի մատակարարների կատալոգից։ 📖 [Մատակարարների տեղեկատու](docs/reference/PROVIDER_REFERENCE.md) +…և 330+ ավելին — յուրաքանչյուր պատկեր լուծվում է անմիջապես կառավարման վահանակի պրովայդերների կատալոգից։ 📖 [Provider Reference](docs/reference/PROVIDER_REFERENCE.md)
-### 🆓 Ընդմիշտ անվճար — $0, առանց քարտի +### 🆓 Հավերժ անվճար — $0, առանց քարտի - - - + + + - - + + - - - + + + - - + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Թոքենների սահմանափակում չկա
Kilo Code
Kilo Code
Ավտոմատ երթուղիչ, Tencent Hy3
Ընդմիշտ անվճար
Requesty
Requesty
GPT-OSS 120B, Nemotron
Ընդմիշտ անվճար
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Առանց թոքենի սահմանափակման
Kilo Code
Kilo Code
Auto-router, Tencent Hy3
Միշտ անվճար
Requesty
Requesty
GPT-OSS 120B, Nemotron
Միշտ անվճար
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Անվճար մակարդակ
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Ընդմիշտ անվճար
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Ընդմիշտ անվճար
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Միշտ անվճար
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Միշտ անվճար
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
ԱՆՍԱՀՄԱՆԱՓԱԿ ԱՆՎՃԱՐ
Pollinations
Pollinations
GPT, Llama, Claude
Բանալի անհրաժեշտ չէ
Cloudflare AI
Cloudflare AI
50+ մոդել
10K նեյրոն/օր
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Անսահմանափակ ԱՆՎՃԱՐ
Pollinations
Pollinations
GPT, Llama, Claude
Բանալի պետք չէ
Cloudflare AI
Cloudflare AI
50+ մոդելներ
10K նեյրոն/օր
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM անվճար
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M թոքեն/օր
OpenRouter
OpenRouter
:free մոդելներ
+$10 → ավելի բարձր RPM
Openference
Openference
Qwen3.8 27B, Llama 3.2
Անվճար մակարդակ
OpenRouter
OpenRouter
:անվճար մոդելներ
+$10 → ավելի բարձր RPM
-📖 Ամբողջական մեքենայաընթեռնելի կատալոգ → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md) +📖 Մեքենայաընթեռնելի ամբողջական կատալոգ → [`docs/reference/PROVIDER_REFERENCE.md`](docs/reference/PROVIDER_REFERENCE.md)
@@ -1256,28 +1256,28 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ը նույնպե
-## 🛠️ Տեխնոլոգիական փաթեթ +## 🛠️ Տեխնոլոգիական կույտ
- - - - - - + + + + + + - - - - - - - - - + + + + + + + + +
ՇերտՏեխնոլոգիա
Կատարման միջավայրNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
ԼեզուTypeScript 6.0 — 100% TypeScript՝ ամբողջ src/-ում և open-sse/-ում (v2.0-ից ի վեր միջուկում չկա ոչ մի any)
ՖրեյմվորքNext.js 16 + React 19 + Tailwind CSS 4
Տվյալների բազաbetter-sqlite3 (SQLite, WAL գրանցամատյանում պահպանում) + LowDB (ժառանգական JSON) — 122 դոմենային մոդուլ, 176 միգրացիա
ՀիշողությունSQLite FTS5 ամբողջական տեքստային որոնում + int8-քվանտացված վեկտորային ներկառուցումներ, տիպավորված մարում
ՍխեմաներZod 4 — MCP գործիքների մուտքի/ելքի վավերացում + API պայմանագրեր
Գործարկման միջավայրNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
ԼեզուTypeScript 6.0 — 100% TypeScript across src/ and open-sse/ (առանց any-ի հիմնական կոդում v2.0-ից ի վեր)
ՇրջանակNext.js 16 + React 19 + Tailwind CSS 4
Տվյալների բազաbetter-sqlite3 (SQLite, WAL մատյանագրում) + LowDB (JSON ժառանգություն) — 122 տիրույթի մոդուլ, 178 միգրացիա
ՀիշողությունSQLite FTS5 ամբողջական տեքստ + int8-քվանտացված վեկտորային ներդրումներ, տիպավորված քայքայում
ՍխեմաներZod 4 — MCP գործիքի մուտք/ելքի վավերացում + API պայմանագրեր
ԱրձանագրություններMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
Հոսքային փոխանցումServer-Sent Events (SSE) + WebSocket կամուրջ (/v1/ws)
Սեղմում12 շարժիչից բաղկացած խողովակաշար — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Նույնականացում և անվտանգությունOAuth 2.0 (PKCE) + JWT + API բանալիներ + MCP-ի շրջանակային նույնականացում · AES-256-GCM՝ պահպանված տվյալների համար · DOMPurify
Քողարկումwreq-js — JA3 / JA4 TLS մատնահետքերի նմանակում, 3-մակարդակ պրոքսի
ԿայունությունՇղթայի անջատիչ, էքսպոնենցիալ հետաձգում, միաժամանակյա հարցումների կուտակման կանխում, ինքնաբերաբար համակցվող ինքնավերականգնում
Գրանցամատյանում պահպանումpino — հարցման համատեքստով կառուցվածքային JSON գրանցումներ
ԹեստավորումNode.js թեստերի գործարկիչ + Vitest — 39,000+ ստատիկ թեստային հայտարարություն՝ 5,100+ վերահսկվող թեստային ֆայլերում (մոդուլային, ինտեգրացիոն, E2E, անվտանգության, էկոհամակարգի)
ՀարթակներՍեղանադիր (Electron) · Android (Termux) · PWA (ցանկացած դիտարկիչ)
CI/CDGitHub Actions — թողարկման ժամանակ ինքնաբերաբար հրապարակում npm-ում և Docker Hub-ում
Հոսքային հաղորդումՍերվերի կողմից ուղարկվող իրադարձություններ (SSE) + WebSocket կամուրջ (/v1/ws)
Սեղմում12 շարժիչով խողովակաշար — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Նույնականացում և անվտանգությունOAuth 2.0 (PKCE) + JWT + API Keys + MCP սահմանափակված նույնականացում · AES-256-GCM պահեստավորված վիճակում · DOMPurify
Թաքնվածությունwreq-js — JA3 / JA4 TLS մատնահետքի նմանակում, 3 մակարդակի պրոքսի
ԴիմացկունությունՇղթայի անջատիչ, էքսպոնենցիալ հետաձգում, հակա-որոտացող հոտ, ավտո-կոմբո ինքնավերականգնում
Մուտքագրումpino — կառուցվածքային JSON մուտքեր հարցման համատեքստով
ԹեստավորումNode.js test runner + Vitest — 39,000+ ստատիկ թեստային հայտարարություններ 5,100+ հետևվող թեստային ֆայլերում (միավորային, ինտեգրացիոն, E2E, անվտանգության, էկոհամակարգի)
ՊլատֆորմներՍեղանադիր (Electron) · Android (Termux) · PWA (ցանկացած բրաուզեր)
CI/CDGitHub Actions — ավտոմատ npm հրապարակում + Docker Hub թողարկման ժամանակ
ՀղումներԿայք · npm · Docker Hub
@@ -1289,87 +1289,87 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ը նույնպե -### 📘 Սկսել աշխատանքը +### 📘 Սկսելու ուղեցույց - - - - - - + + + + + +
ՓաստաթուղթՆկարագրություն
Օգտագործողի ուղեցույցՄատակարարներ, համակցություններ, CLI ինտեգրում, տեղակայում
Կարգավորման ուղեցույցՏեղադրման բոլոր եղանակները, CLI գործիքների կազմաձևումները, արձանագրությունների կարգավորումը, սպասման ժամանակի ճշգրտումը
CLI գործիքների ուղեցույցԱռանձին գործիքների կարգավորում Claude Code-ի, Codex-ի, Cursor-ի, Cline-ի, OpenClaw-ի, Kilo-ի և Copilot-ի համար
Հեռակա ռեժիմԿառավարեք հեռակա OmniRoute-ը (VPS) ձեր նոթբուքի CLI-ից՝ սահմանափակ հասանելիության նշանների միջոցով
Claude Code-ի կազմաձևումՄիացրեք Claude Code-ը OmniRoute-ին (տեղային/հեռակա)՝ launch-ի և յուրաքանչյուր մոդելի առանձին պրոֆիլների միջոցով
Արագ մեկնարկ3 քայլ՝ տեղադրում → միացում → կազմաձևում
Օգտագործողի ուղեցույցՄատակարարներ (providers), կոմբոներ, CLI ինտեգրում, տեղակայում
Կարգավորման ուղեցույցՏեղադրման ամբողջական մեթոդներ, CLI գործիքների կոնֆիգուրացիաներ, արձանագրությունների կարգավորում, timeout-ների թյունինգ
CLI գործիքների ուղեցույցՅուրաքանչյուր գործիքի կարգավորում Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot-ի համար
Հեռակա ռեժիմԿառավարեք հեռակա OmniRoute-ը (VPS) ձեր լեփթոփի CLI-ից՝ scoped access token-ների միջոցով
Claude Code-ի կոնֆիգուրացիաՈւղղեք Claude Code-ը դեպի OmniRoute (տեղական/հեռակա) launch-ի և ըստ մոդելի պրոֆիլների միջոցով
Արագ մեկնարկ3-քայլ տեղադրում → միացում → կոնֆիգուրացիա
-### 🔧 Շահագործում և տեղակայում +### 🔧 Գործառնություններ և տեղակայում - - - - - - - - + + + + + + + +
ՓաստաթուղթՆկարագրություն
Docker-ի ուղեցույցDocker-ի գործարկում, Compose պրոֆիլներ, Caddy HTTPS, թունելներ, պատկերների պիտակներ
Podman-ի ուղեցույցQuadlet-ի systemd ինտեգրում, podman-compose, SELinux
Տեղակայում VM-ումԱմբողջական ուղեցույց՝ VM + nginx + Cloudflare կարգավորում
Տեղակայում Fly.io-ումՏեղակայում Fly.io-ում՝ մշտական պահեստով
Termux-ի ուղեցույցԳործարկեք OmniRoute-ը Android-ում՝ Termux-ի միջոցով
PWA-ի ուղեցույցՊրոգրեսիվ վեբ հավելվածի տեղադրում, քեշավորում, ճարտարապետություն
Ապատեղադրման ուղեցույցՄաքուր հեռացում տեղադրման բոլոր եղանակների համար
Միջավայրի կազմաձևում.env-ի բոլոր փոփոխականները և հղումները
Docker ուղեցույցDocker run, Compose պրոֆիլներ, Caddy HTTPS, թունելներ, image tag-եր
Podman ուղեցույցQuadlet systemd ինտեգրում, podman-compose, SELinux
VM տեղակայումԱմբողջական ուղեցույց՝ VM + nginx + Cloudflare կարգավորում
Fly.io տեղակայումՏեղակայում Fly.io-ում՝ մշտական հիշողությամբ (persistent storage)
Termux ուղեցույցԳործարկեք OmniRoute-ը Android-ում Termux-ի միջոցով
PWA ուղեցույցProgressive Web App տեղադրում, քեշավորում, ճարտարապետություն
Ապատեղադրման ուղեցույցՄաքուր հեռացում տեղադրման բոլոր մեթոդների համար
Միջավայրի կոնֆիգուրացիաԱմբողջական .env փոփոխականներ և հղումներ
### 🧠 Հնարավորություններ և ճարտարապետություն - - - - - - - - - - - - + + + + + + + + + + + +
ՓաստաթուղթՆկարագրություն
ՃարտարապետությունՀամակարգի ճարտարապետությունը, տվյալների հոսքը և ներքին կառուցվածքը
Սեղմման ուղեցույց7 տարբերակով մշակաշղթա՝ անջատված / թեթև / ստանդարտ / ագրեսիվ / ուլտրա / RTK / շերտավորված
RTK սեղմումՀրամանների ելքի սեղմում, զտիչներ, վստահություն, ստուգում, չմշակված ելքի վերականգնում
Սեղմման շարժիչներCaveman, RTK, շերտավորված մշակաշղթաներ, կառավարման վահանակի/API/MCP միջերեսներ
Սեղմման կանոնների ձևաչափJSON կանոնների փաթեթների սխեմաներ Caveman և RTK զտիչների համար
Սեղմման լեզվային փաթեթներԼեզվի հայտնաբերում և Caveman կանոնների փաթեթների ստեղծում
Կայունության ուղեցույցՇղթայի անջատիչներ, սառեցման ժամանակահատվածներ, հերթ, հարցումների միաժամանակյա կուտակման կանխարգելում, TLS կեղծում
Ավտոմատ համակցման շարժիչ16 գործոնով գնահատում, ռեժիմների փաթեթներ, ինքնավերականգնում
Պրոքսիի ուղեցույց3-մակարդականի պրոքսի համակարգ, 1proxy հարթակ, ռեեստրի CRUD գործողություններ
Անվճար մակարդակներՄիասնական կատալոգ՝ 35 փաստագրված պարբերական պուլ / անվճար մակարդակի 491 կատալոգավորված գրառում
Հնարավորությունների պատկերասրահԿառավարման վահանակի տեսողական շրջայց՝ էկրանի պատկերներով
Կոդային բազայի փաստաթղթերԿոդային բազայի սկսնակների համար հասկանալի շրջայց
ՃարտարապետությունՀամակարգի ճարտարապետություն, տվյալների հոսք և ներքին կառուցվածք
Սեղմման ուղեցույց7-տարբերակով փայփլայն՝ off / lite / standard / aggressive / ultra / RTK / stacked
RTK սեղմումՀրամանների ելքի սեղմում, ֆիլտրեր, վստահություն, ստուգում, raw-ելքի վերականգնում
Սեղմման շարժիչներCaveman, RTK, stacked փայփլայններ, dashboard/API/MCP մակերեսներ
Սեղմման կանոնների ձևաչափJSON կանոնների փաթեթների սխեմաներ Caveman և RTK ֆիլտրերի համար
Սեղմման լեզվական փաթեթներԼեզվի հայտնաբերում և Caveman կանոնների փաթեթների ստեղծում
Դիմացկունության ուղեցույցCircuit breakers, cooldown-ներ, հերթեր, anti-thundering herd, TLS spoofing
Auto-Combo շարժիչ16-գործոնային միավորների հաշվարկ, ռեժիմների փաթեթներ, ինքնավերականգնում
Proxy ուղեցույց3-մակարդակի պրոքսի համակարգ, 1proxy շուկա, registry CRUD
Անվճար տարբերակներՄիավորված տեղեկատու՝ 35 փաստաթղթավորված պարբերական pool-եր / 489 կատալոգավորված անվճար մուտքեր
Հնարավորությունների պատկերասրահՎիզուալ վահանակի շրջայց սքրինշոթներով
Կոդի բազայի փաստաթղթավորումՍկսնակների համար հասանելի կոդի բազայի ուսումնասիրություն
### 🤖 Արձանագրություններ և API-ներ - - - - - - + + + + + +
ՓաստաթուղթՆկարագրություն
API տեղեկատուԲոլոր վերջնակետերը՝ օրինակներով
OpenAPI բնութագիրOpenAPI 3.0 բնութագիր
MCP սերվեր110 MCP գործիք, IDE կազմաձևումներ, Python/TS/Go հաճախորդներ
MCP սերվերի ուղեցույցMCP-ի տեղադրում, փոխադրամիջոցներ և գործիքների տեղեկատու
A2A սերվերJSON-RPC 2.0 արձանագրություն, հմտություններ, հոսքային փոխանցում, առաջադրանքների կառավարում
A2A սերվերի ուղեցույցA2A գործակալի քարտ, առաջադրանքներ, հմտություններ և հոսքային փոխանցում
API տեղեկատուԲոլոր վերջնակետերը (endpoints) օրինակներով
OpenAPI SpecOpenAPI 3.0 սպեցիֆիկացիա
MCP սերվեր110 MCP գործիքներ, IDE կոնֆիգուրացիաներ, Python/TS/Go կլիենտներ
MCP սերվերի ուղեցույցMCP տեղադրում, տրանսպորտներ և գործիքների տեղեկատու
A2A սերվերJSON-RPC 2.0 արձանագրություն, հմտություններ, սթրիմինգ, առաջադրանքների կառավարում
A2A սերվերի ուղեցույցA2A գործակալի քարտ, առաջադրանքներ, հմտություններ և սթրիմինգ
### 📋 Նախագիծ և որակ - - - - - - - + + + + + + +
ՓաստաթուղթՆկարագրություն
Ներդրում կատարելըՄշակման միջավայրի կարգավորում և ուղեցույցներ
Ճյուղավորման և թողարկման մոդելՈր ճյուղերին են ուղղվում PR-ները (release/*), և ինչ են նշանակում main-ը և պիտակները
Փոփոխությունների մատյանԹողարկումների ամբողջական պատմությունը՝ ըստ տարբերակների
Անվտանգության քաղաքականությունԽոցելիությունների հաղորդում և անվտանգության գործելակերպեր
i18n ուղեցույց42 լեզուների աջակցություն, թարգմանության աշխատանքային հոսք, RTL
Թողարկման ստուգաթերթԹողարկումից առաջ վավերացման քայլեր
Ծածկույթի պլանԹեստային ծածկույթի ռազմավարություն՝ 5,100+ հետևվող թեստային ֆայլերում 39,000+ ստատիկ թեստային հայտարարությունների համար
ԱջակցությունՄշակման կարգավորումներ և ուղեցույցներ
Ճյուղավորման և թողարկման մոդելՈւր են ուղղվում PR-ները (release/*), ինչ են նշանակում main-ը և թեգերը
Փոփոխությունների մատյանԹողարկումների ամբողջական պատմությունն ըստ տարբերակների
Անվտանգության քաղաքականությունԽոցելիությունների մասին զեկուցում և անվտանգության գործելակերպեր
i18n ուղեցույց42 լեզուների աջակցություն, թարգմանության աշխատանքային ընթացք, RTL
Թողարկման ստուգաթերթՆախաթողարկումային վալիդացման քայլեր
Ծածկույթի պլանԹեստային ծածկույթի ռազմավարություն 39,000+ ստատիկ թեստային հայտարարագրերի համար 5,100+ հետևվող թեստային ֆայլերում

-# ⭐ Լավագույն ներդրողները +# ⭐ Լավագույն աջակիցները -> OmniRoute-ը ձևավորվում է բաց կոդով ծրագրային ապահովման նվիրված համայնքի շնորհիվ։ Այս մարդիկ բացառիկ ներդրումներ են կատարել, որոնք անմիջականորեն ազդում են նախագծի որակի, կայունության և հասանելիության վրա։ **Շնորհակալություն։** +> OmniRoute-ը ձևավորվում է կրքոտ բաց կոդով համայնքի կողմից: Այս անհատները կատարել են բացառիկ ներդրումներ, որոնք ուղղակիորեն ազդում են նախագծի որակի, կայունության և հասանելիության վրա: **Շնորհակալություն:** -### Արտաքին ներդրողները՝ ըստ միաձուլված pull request-ների +### Արտաքին աջակիցներն ըստ միաձուլված pull request-ների - + @@ -1393,9 +1393,9 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ը նույնպե
ԴիրքՆերդրողՄիաձուլված PR-ներ~Փոփոխված տողեր
ՎարկանիշԱջակիցՄիաձուլված PR-ներ~Փոփոխված տողեր
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Տվյալները սառեցված են գործող release/v3.8.50 ճյուղի վերջնամասի dafb4ae808 commit-ում՝ ներառելով մինչև 2026-08-24 05:26:03 UTC կատարված միաձուլումները։ Էջաբաժանված GitHub GraphQL հաշվառումը ներառում է 5,911 միաձուլված PR՝ 2,707-ը շտեմարանի սեփականատիրոջից, 179-ը Dependabot-ից և 3,025 արտաքին PR՝ 535 տարբեր ներդրողներից։ «Փոփոխված տողերը» GitHub-ի ավելացումների և ջնջումների հանրագումարն է և ներառում է գեներացված ֆայլերը, lockfile-երը, կատալոգները, թարգմանություններն ու փաստաթղթերը․ սա փոփոխությունների ծավալն է, ոչ թե հեղինակի գրած կոդի տողերի քանակը։ Սահմանագծում հավասար արդյունքները պահպանվել են։ +Ֆիքսված է ըստ ակտիվ release/v3.8.50-ի dafb4ae808 կետի, ներառյալ միաձուլումները մինչև 2026-08-24 05:26:03 UTC: GitHub GraphQL-ի էջավորված մարդահամարը պարունակում է 5,911 միաձուլված PR. 2,707-ը՝ ռեպոզիտորիայի սեփականատիրոջ կողմից, 179-ը՝ Dependabot-ի կողմից, և 3,025 արտաքին PR-ներ 535 տարբեր աջակիցներից: «Փոփոխված տողերը» GitHub-ի ավելացումների + ջնջումների հանրագումարն է և ներառում է գեներացված ֆայլերը, lock-ֆայլերը, կատալոգները, թարգմանությունները և փաստաթղթերը. դա ընդհանուր շարժն է, այլ ոչ թե հեղինակային կոդի տողերը (LOC): Սահմանագծին հավասար արդյունքները պահպանված են: -### GitHub-ին վերագրված commit-ներ +### GitHub-ի կողմից վերագրված commit-ներ @@ -1404,42 +1404,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ը նույնպե backryun
backryun
- 🥇 GitHub-ին վերագրված 220 commit + 🥇 220 GitHub-վերագրվող կոմիտներ @@ -1448,42 +1448,42 @@ OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1-ը նույնպե Dizzle
Dizzle
- 🏅 GitHub-ին վերագրված 69 commit · հավասար՝ #6-րդ տեղում + 🏅 69 GitHub-վերագրվող կոմիտներ · #6-րդ տեղը կիսող
Paijo
Paijo

- 🥈 GitHub-ին վերագրված 219 commit + 🥈 219 GitHub-վերագրվող կոմիտներ
Randi
Randi

- 🥉 GitHub-ին վերագրված 108 commit + 🥉 108 GitHub-վերագրվող կոմիտներ
Ravi Tharuma
Ravi Tharuma

- 🏅 GitHub-ին վերագրված 81 commit + 🏅 81 GitHub-վերագրվող կոմիտներ
Chris
Chris

- 🏅 GitHub-ին վերագրված 70 commit + 🏅 70 GitHub-վերագրվող կոմիտներ
Markus Hartung
Markus Hartung

- 🏅 GitHub-ին վերագրված 69 commit · հավասար՝ #6-րդ տեղում + 🏅 69 GitHub-վերագրվող կոմիտներ · #6-րդ տեղը կիսող
Jan Leon
Jan Leon

- 🏅 GitHub-ին վերագրված 64 commit + 🏅 64 GitHub-վերագրվող կոմիտներ
zenobit
zenobit

- 🏅 GitHub-ին վերագրված 62 commit + 🏅 62 GitHub-վերագրվող կոմիտներ
Bob.Hou
Bob.Hou

- 🏅 GitHub-ին վերագրված 51 commit · հավասար՝ #10-րդ տեղում + 🏅 51 GitHub-վերագրվող կոմիտներ · #10-րդ տեղը կիսող
Xiangzhe
Xiangzhe

- 🏅 GitHub-ին վերագրված 51 commit · հավասար՝ #10-րդ տեղում + 🏅 51 GitHub-վերագրվող կոմիտներ · #10-րդ տեղը կիսող
-Վերստուգվել է 2026-08-24 06:14:31 UTC-ին՝ ըստ պահոցի Contributors API-ի՝ release/v3.8.50 լռելյայն ճյուղի համար հաղորդված GitHub-ին վերագրված commit-ների։ API-ն վերադարձրել է 525 ինքնություն (415 օգտատեր, 2 բոտ, 108 անանուն)․ այս աղյուսակը բացառում է սպասարկողին, բոտերին և անանուն ինքնություններին ու պահպանում է հավասար արդյունքները։ Այն տարբերվում է թե՛ վերևում ներկայացված միավորված PR-ների վարկանիշից, թե՛ ներքևում ներկայացված Git մետատվյալների 639 անձից բաղկացած հաշվառումից։ +Վերստուգվել է 2026-08-24 06:14:31 UTC-ին: GitHub-վերագրվող կոմիտները, որոնք հաղորդվել են պահոցի Contributors API-ի կողմից `release/v3.8.50` լռելյայն ճյուղի համար: API-ն վերադարձրել է 525 ինքնություն (415 օգտատեր, 2 բոտ, 108 անանուն); այս աղյուսակը բացառում է սպասարկողին, բոտերին և անանուն ինքնությունները և պահպանում է մրցակցային կապերը: Այն տարբերվում է ինչպես վերևի միաձուլված PR-ի վարկանիշից, այնպես էլ ստորև ներկայացված 639 հոգանոց Git-մետատվյալների մարդահամարից: -> 🙏 Այս ներդրողների հնարավորությունները, սխալների շտկումները և ենթակառուցվածքային բարելավումները OmniRoute-ը հուսալի և գործառույթներով հարուստ դարձնող գործոնների **հիմնական մասն** են։ Յուրաքանչյուր pull request, յուրաքանչյուր թեստային դեպք և յուրաքանչյուր i18n թարգմանության ֆայլ կարևոր է։ Բաց կոդով ծրագրերը ստեղծվում են նրանց նման մարդկանց կողմից։ +> 🙏 Այս ներդրողների կողմից տրամադրված հնարավորությունները, սխալների շտկումները և ենթակառուցվածքային բարելավումները **հիմնական մասն են** այն ամենի, ինչը OmniRoute-ն դարձնում է հուսալի և հարուստ գործառույթներով: Յուրաքանչյուր pull request, յուրաքանչյուր թեստային դեպք և յուրաքանչյուր i18n թարգմանության ֆայլ կարևոր է: Բաց կոդով ծրագրակազմը ստեղծվում է նրանց նման մարդկանց կողմից:
diff --git a/docs/i18n/hy/SECURITY.md b/docs/i18n/hy/SECURITY.md index 7f5182ae4952..af22de440c64 100644 --- a/docs/i18n/hy/SECURITY.md +++ b/docs/i18n/hy/SECURITY.md @@ -220,19 +220,37 @@ docker run -d \ 10. **`exec()` / `spawn()` կատարման ժամանակի արժեքները փոխանցեք `env` ընտրանքի միջոցով** — երբեք արտաքին ուղիները կամ անվստահելի արժեքները տողային ինտերպոլացիայով մի ներառեք shell-ին փոխանցվող սկրիպտներում։ Հղում՝ `src/mitm/cert/install.ts::updateNssDatabases`։ 11. **Նախապատվությունը տվեք լռելյայն անվտանգ գրադարաններին** — տե՛ս [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink)։ Նախքան սեփական լուծումը ստեղծելը՝ նախ փորձեք օգտագործել դրանք։ -## Մատակարարման շղթայի սկանավորիչի հայտնաբերումներ (Socket.dev / Snyk / նմանատիպ գործիքներ) +## Մատակարարման շղթայի սկաների հայտնաբերումներ (Socket.dev / Snyk / նմանատիպ գործիքներ) -Հրապարակված `omniroute` npm արտեֆակտը ներառում է Next.js-ի `output: "standalone"` կառուցվածքը, ինչը նշանակում է, որ երթուղիների յուրաքանչյուր մշակիչ, ներառյալ փաստաթղթավորված արտոնյալ գործառույթները (MITM, Zed ներմուծում, Cloud Sync, ներկառուցված ծառայությունների վերահսկիչ), հայտնվում է `.next/server/*.js` մինիֆիկացված հատվածներում։ Էվրիստիկ մատակարարման շղթայի սկանավորիչները հաճախ այդ հատվածները համադրում են վնասաբեր ծրագրերի ստորագրությունների հետ։ +> **Շրջանակի նշում․** պահոցի արմատում գտնվող `socket.yml`-ը միայն սահմանում է `projectIgnorePaths`-ը՝ Socket.dev-ի ռեեստրի կողմում հրապարակումից հետո կատարվող՝ հրապարակված npm արտեֆակտի սկանավորման համար․ այն պարտադիր կիրառվող CI/PR միավորման արգելափակիչ չէ։ `.github/workflows`-ում ոչ մի աշխատանքային հոսք, `package.json`-ում ոչ մի սկրիպտ և `Makefile`-ում ոչ մի թիրախ չի կանչում Socket.dev-ը։ -Մեր օգտագործած սկանավորիչի կազմաձևումը գտնվում է պահոցի արմատում՝ [`socket.yml`](socket.yml) ֆայլում (Socket.dev GitHub App ձևաչափ v2 — տե՛ս )։ Այն բացահայտորեն բացառում է չմատակարարվող գրացուցակները (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` և այլն), որպեսզի սկանավորիչը զեկուցի միայն այն կոդային ուղիների մասին, որոնք իրականում հասնում են հրապարակված տարբերակի օգտատերերին։ Սկանավորումն ինքնին իրականացվում է այդ ֆայլը կարդացող Socket GitHub App-ի միջոցով, այլ ոչ թե այս պահոցում առկա աշխատանքային հոսքով։ +Հրապարակված `omniroute` npm արտեֆակտը ներառում է Next.js-ի `output: "standalone"` +կառուցումը, ինչը նշանակում է, որ երթուղիների յուրաքանչյուր մշակիչ՝ ներառյալ փաստագրված արտոնյալ +գործառույթները (MITM, Zed ներմուծում, Cloud Sync, ներկառուցված ծառայությունների վերահսկիչ), հայտնվում է +`.next/server/*.js` փոքրացված հատվածներում։ Էվրիստիկական մատակարարման շղթայի սկաներները +հաճախ այդ հատվածները համադրում են վնասաբեր ծրագրերի ստորագրությունների հետ։ -Հայտնաբերումների յուրաքանչյուր կատեգորիայի համար մենք պահպանում ենք սպասարկողի հաստատում՝ ըստ առանձին հայտնաբերման. +Մեր օգտագործած սկաների կազմաձևումը գտնվում է պահոցի արմատի +[`socket.yml`](socket.yml) ֆայլում (Socket.dev GitHub App ձևաչափ v2 — տե՛ս +)։ Այն բացահայտորեն բացառում է +չմատակարարվող պանակները (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/` և այլն), որպեսզի սկաները զեկուցի միայն այն կոդային ուղիների մասին, որոնք +իրականում հասնում են հրապարակված տարբերակի օգտատերերին․ սկանավորումն ինքնին գործարկվում է այդ ֆայլը կարդացող Socket +GitHub App-ի կողմից, այլ ոչ թե այս պահոցի աշխատանքային հոսքի միջոցով։ -- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - ըստ առանձին հայտնաբերման քարտեզ՝ սկզբնաղբյուր ֆայլ ↔ նշված հատված ↔ վարքագիծ ↔ v3.8.6-ում կիրառված մեղմացման միջոց։ -- Սկզբնաղբյուրի ներսում յուրաքանչյուր նշված ֆունկցիայի մոտ գտնվող `SECURITY-AUDITOR-NOTE:` բլոկները հղում են նույն փաստաթղթին։ +Հայտնաբերումների յուրաքանչյուր կատեգորիայի համար մենք պահպանում ենք սպասարկողի առանձին հավաստում՝ ըստ հայտնաբերման․ -Այն օգտատերերի համար, որոնց խողովակաշարը չի կարող թուլացնել ահազանգը՝ կառուցեք հետևյալ հրամանով՝ `OMNIROUTE_BUILD_PROFILE=minimal npm run build`։ Այն չորս զգայուն մոդուլները փոխարինում է խցաններով, որոնք կատարման ժամանակ վերադարձնում են HTTP 503 `feature-disabled`, ուստի արտոնյալ կոդային ուղիները ֆիզիկապես բացակայում են փաթեթից։ Հրապարակման հրահանգների համար տե՛ս [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)։ +- **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — + քարտեզ՝ ըստ հայտնաբերման․ սկզբնաղբյուր ֆայլ ↔ նշված հատված ↔ վարքագիծ ↔ v3.8.6-ում + կիրառված մեղմացում։ +- Սկզբնաղբյուրում առկա `SECURITY-AUDITOR-NOTE:` բլոկները յուրաքանչյուր նշված ֆունկցիայի մոտ + հղում են կատարում նույն փաստաթղթին։ + +Այն օգտատերերի համար, որոնց խողովակաշարը չի կարող մեղմացնել ահազանգը՝ կառուցեք +`OMNIROUTE_BUILD_PROFILE=minimal npm run build` հրամանով։ Այն չորս +զգայուն մոդուլները փոխարինում է կեղծակներով, որոնք կատարման պահին վերադարձնում են HTTP 503 `feature-disabled`, +ուստի արտոնյալ կոդային ուղիները ֆիզիկապես բացակայում են փաթեթից։ +Հրապարակման ընթացակարգի համար տե՛ս [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)։ ## Հղումներ diff --git a/docs/i18n/hy/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/hy/docs/architecture/CODEBASE_DOCUMENTATION.md index 7799dd4ebbc5..cf423ef8be13 100644 --- a/docs/i18n/hy/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/hy/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -436,8 +436,7 @@ server/ ## 4. `open-sse/` — Հոսքային շարժիչի աշխատանքային տարածք -Առանձին npm աշխատանքային տարածք, որը հրապարակվում է որպես `@omniroute/open-sse`։ Պատասխանատու է հարցումների -մշակման, կատարիչների, թարգմանիչների, ծառայությունների, փոխակերպիչի և MCP սերվերի համար։ +Առանձին npm աշխատանքային տարածք, որը հրապարակվում է որպես `@omniroute/open-sse`։ Պարունակում է հարցումների մշակումը, կատարիչները, թարգմանիչները, ծառայությունները, փոխակերպիչը և MCP սերվերը։ ``` open-sse/ @@ -447,51 +446,51 @@ open-sse/ ├── types.d.ts ├── config/ Մատակարարների ռեեստրներ, վերնագրերի պրոֆիլներ, ինքնություն, … ├── handlers/ Հարցումների մշակիչներ (զրույց, ներդրումներ, աուդիո, պատկեր, …) -├── executors/ Մատակարարներին հատուկ HTTP-ի 108 կատարիչ -├── translator/ Ձևաչափերի փոխարկում (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) +├── executors/ Մատակարարներին հատուկ 108 HTTP կատարիչ +├── translator/ Ձևաչափերի փոխակերպում (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions հոսքի փոխակերպիչ ├── services/ 80+ ծառայության մոդուլ (համակցումներ, պահուստային անցում, քվոտաներ, ինքնություն, …) ├── utils/ Հոսքային մշակման օժանդակ գործիքներ, TLS հաճախորդ, AWS SigV4, պրոքսի հարցումներ, … -└── mcp-server/ MCP սերվեր (3 փոխադրամիջոց, 33 տիրույթ, 110 գործիք) +└── mcp-server/ MCP սերվեր (3 փոխադրամիջոց, 33 հասանելիության տիրույթ, 110 գործիք) ``` ### 4.1 `open-sse/handlers/` -| Մշակիչ | Նպատակ | -| ----------------------- | ------------------------------------------------------------------------------------------------------------ | -| `chatCore.ts` | Զրույցի հիմնական հոսքաշար (քեշ, հաճախականության սահմանափակում, համակցված երթուղավորում, կատարիչի գործարկում) | -| `responsesHandler.ts` | OpenAI Responses API-ի մուտքային կետ | -| `embeddings.ts` | Ներդրումներ | -| `imageGeneration.ts` | Պատկերների ստեղծում | -| `audioSpeech.ts` | Տեքստից խոսքի փոխարկում | -| `audioTranscription.ts` | Խոսքից տեքստի փոխարկում | -| `videoGeneration.ts` | Տեսանյութերի ստեղծում | -| `musicGeneration.ts` | Երաժշտության ստեղծում | -| `rerank.ts` | Վերադասակարգում | -| `moderations.ts` | Բովանդակության վերահսկում | -| `search.ts` | Վեբ որոնում | -| `sseParser.ts` | SSE իրադարձությունների վերլուծիչ | -| `usageExtractor.ts` | Վերին հոսքերից թոքենների քանակի դուրսբերում | -| `responseSanitizer.ts` | Մատակարարին հատուկ աղմուկի հեռացում | -| `responseTranslator.ts` | Մատակարարի պատասխանի և թարգմանիչների շերտի միջև կապակցող բաղադրիչ | +| Մշակիչ | Նպատակ | +| ----------------------- | --------------------------------------------------------------------------------------------- | +| `chatCore.ts` | Զրույցի հիմնական շղթա (քեշ, արագության սահմանափակում, համակցված երթուղավորում, կատարիչի կանչ) | +| `responsesHandler.ts` | OpenAI Responses API-ի մուտքային կետ | +| `embeddings.ts` | Ներդրումներ | +| `imageGeneration.ts` | Պատկերների գեներացում | +| `audioSpeech.ts` | Տեքստից խոսք | +| `audioTranscription.ts` | Խոսքից տեքստ | +| `videoGeneration.ts` | Տեսանյութերի գեներացում | +| `musicGeneration.ts` | Երաժշտության գեներացում | +| `rerank.ts` | Վերադասակարգում | +| `moderations.ts` | Բովանդակության վերահսկում | +| `search.ts` | Վեբ որոնում | +| `sseParser.ts` | SSE իրադարձությունների վերլուծիչ | +| `usageExtractor.ts` | Վերին հոսքերից թոքենների քանակների դուրսբերում | +| `responseSanitizer.ts` | Մատակարարին հատուկ աղմուկի հեռացում | +| `responseTranslator.ts` | Մատակարարի պատասխանի և թարգմանության շերտի միջև կապակցում | ### 4.2 `open-sse/executors/` -Մատակարարների 108 կատարիչ, որոնցից յուրաքանչյուրն ընդլայնում է `BaseExecutor`-ը (`base.ts`)․ +Մատակարարների 108 կատարիչ, որոնցից յուրաքանչյուրը ընդլայնում է `BaseExecutor`-ը (`base.ts`)․ `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, ինչպես նաև `claudeIdentity.ts` -(ինքնության ընդհանուր օժանդակ բաղադրիչ) և `index.ts` (ռեեստր)։ +(ինքնության ընդհանուր օժանդակ գործիք) և `index.ts` (ռեեստր)։ -> Նշում․ այստեղ չթվարկված մատակարարները սպասարկվում են `default.ts`-ի կողմից՝ օգտագործելով ընդհանրական -> OpenAI-ի հետ համատեղելի կատարիչը։ Մատակարարների ամբողջական կատալոգը (355 մատակարար) գտնվում է +> Նշում․ այստեղ չթվարկված մատակարարները սպասարկվում են `default.ts`-ի միջոցով՝ օգտագործելով ընդհանուր +> OpenAI-համատեղելի կատարիչը։ Մատակարարների ամբողջական կատալոգը (355 մատակարար) գտնվում է > `src/shared/constants/providers.ts`-ում։ ### 4.3 `open-sse/translator/` -Կենտրոն-ճառագայթային թարգմանություն (OpenAI-ը կենտրոնն է)։ +Կենտրոն-և-ճառագայթ թարգմանություն (OpenAI-ը կենտրոնն է)։ - **Հարցումների 9 թարգմանիչ** (`translator/request/`)․ `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, @@ -501,51 +500,51 @@ open-sse/ `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`։ -- **9 օժանդակ բաղադրիչ** (`translator/helpers/`)․ +- **9 օժանդակ գործիք** (`translator/helpers/`)․ `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, ինչպես նաև - օժանդակ բաղադրիչների թեստերը։ -- **Պատկերների օժանդակ բաղադրիչներ** (`translator/image/sizeMapper.ts`)։ -- Վերին մակարդակ՝ `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`։ + օժանդակ գործիքների թեստեր։ +- **Պատկերների օժանդակ գործիքներ** (`translator/image/sizeMapper.ts`)։ +- Վերին մակարդակում՝ `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`։ ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-ի վրա հիմնված Responses API ↔ Chat - Completions փոխարկիչ (օգտագործվում է `responses/` երթուղու՝ բոլոր դեպքերը որսացող մշակիչի կողմից)։ + Completions փոխարկիչ (օգտագործվում է `responses/` երթուղու համընդհանուր մշակիչի կողմից)։ ### 4.5 `open-sse/services/` -Հիմնական բաղադրիչները (ամբողջական ցանկը՝ `open-sse/services/`-ում)․ - -| Խնդիր | Ֆայլեր | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Combo երթուղավորում | `combo.ts` (19 ռազմավարություն), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Auto Combo շարժիչ | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Կայունություն | `accountFallback.ts` (սպասման շրջան + արգելափակում), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Քվոտաներ | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Քեշավորում | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Երթուղավորման բանականություն | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Մոդելների մշակում | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Սեղմում | `compression/` — սեղմման շարժիչի ամբողջական կապակցում | -| Թոքեն + աշխատաշրջան | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Մակարդակ / մանիֆեստ | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / ցանց | `ipFilter.ts`, `webSearchFallback.ts` | -| Փաթեթներ | `batchProcessor.ts` | -| Օգտագործում | `usage.ts` | +Կարևոր բաղադրիչներ (ամբողջական ցանկը՝ `open-sse/services/`-ում)․ + +| Խնդիր | Ֆայլեր | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Combo երթուղավորում | `combo.ts` (19 ռազմավարություն), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Auto Combo շարժիչ | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Կայունություն | `accountFallback.ts` (սպասման ժամանակահատված + արգելափակում), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Քվոտաներ | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Քեշավորում | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Երթուղավորման բանականություն | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Մոդելների մշակում | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Սեղմում | `compression/` — սեղմման շարժիչի ամբողջական կապակցում | +| Թոքեն + աշխատաշրջան | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Մակարդակ / մանիֆեստ | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / ցանց | `ipFilter.ts`, `webSearchFallback.ts` | +| Փաթեթներ | `batchProcessor.ts` | +| Օգտագործում | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 եզակի գործիք**՝ կապակցված `server.ts`-ում (45 կանոնական գործիք՝ `schemas/tools.ts`-ում + - հիշողության, հմտությունների, GitHub-հմտությունների, պուլի, խաղայնացման, փլագինների, Notion-ի, Obsidian-ի, - տեղային կորպուսի և սեղմման մոդուլներ — միավորումը հաշվարկվում է `countUniqueMcpTools`-ի միջոցով)։ -- **3 փոխադրամիջոց**՝ stdio, HTTP Streamable, SSE։ -- **33 հասանելիության շրջանակ**, որոնք պարտադրվում են կատարման ժամանակ — հիմնական ցանկը գտնվում է `src/shared/constants/mcpScopes.ts`-ում, իսկ ամբողջական բազմությունը յուրաքանչյուր գործիքային մոդուլի կողմից հայտարարված շրջանակների միավորումն է։ +- **110 եզակի գործիք**՝ կապակցված `server.ts`-ում (45 կանոնական՝ `schemas/tools.ts`-ում + + հիշողության, հմտությունների, GitHub հմտությունների, պուլի, գեյմիֆիկացիայի, փլագինի, Notion-ի, Obsidian-ի, + տեղական կորպուսի և սեղմման մոդուլներ — միավորումը հաշվարկվում է `countUniqueMcpTools`-ով)։ +- **3 փոխադրման եղանակ**՝ stdio, HTTP Streamable, SSE։ +- **33 հասանելիության շրջանակ**՝ պարտադրված կատարման ժամանակ. հիմնական ցանկը գտնվում է `src/shared/constants/mcpScopes.ts`-ում, իսկ ամբողջական բազմությունը յուրաքանչյուր գործիքային մոդուլի հայտարարած շրջանակների միավորումն է։ - Աուդիտի աղյուսակ՝ `mcp_tool_audit` (լրացվում է `audit.ts`-ի միջոցով)։ - Ֆայլեր՝ `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - ինչպես նաև թեստերը՝ `__tests__/`-ում։ -- Գործիքների ամբողջական կատալոգը տե՛ս [MCP-SERVER.md](../frameworks/MCP-SERVER.md)-ում։ + ինչպես նաև թեստեր՝ `__tests__/`-ում։ +- Գործիքների ամբողջական կատալոգի համար տե՛ս [MCP-SERVER.md](../frameworks/MCP-SERVER.md)։ ### 4.7 `open-sse/config/` @@ -553,7 +552,7 @@ open-sse/ `providerHeaderProfiles.ts`), ըստ ձևաչափի մոդելների ռեեստրներ (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), -նույնականացման օժանդակ գործիքներ (`codexIdentity.ts`, `codexInstructions.ts`, +ինքնության օժանդակ գործիքներ (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), հավատարմագրերի օժանդակ գործիքներ (`credentialLoader.ts`, `codexClient.ts`) և ամպային @@ -563,7 +562,7 @@ open-sse/ ### 4.8 `open-sse/utils/` -Հոսքային պրիմիտիվներ և մատակարարի օժանդակ գործիքներ՝ `stream.ts`, `streamHandler.ts`, +Հոսքային պարզունակներ և մատակարարի օժանդակ գործիքներ՝ `stream.ts`, `streamHandler.ts`, `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, diff --git a/docs/i18n/hy/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/hy/docs/architecture/RESILIENCE_GUIDE.md index 64fa6afee493..41990ad47369 100644 --- a/docs/i18n/hy/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/hy/docs/architecture/RESILIENCE_GUIDE.md @@ -66,96 +66,140 @@ OmniRoute-ն ունի խափանումների նկատմամբ կայունու `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`։ Հետընթաց սխալներից պաշտպանիչ ստուգում՝ `tests/unit/provider-cooldown-window-gate.test.ts`։ -## 2. Կապի հովացման ժամանակահատված +## 2. Կապի սառեցման ժամանակահատված -**Շրջանակ․** մեկ մատակարարի կապ/հաշիվ/բանալի։ +**Շրջանակը՝** մեկ մատակարարի կապ/հաշիվ/բանալի։ -**Նպատակ․** բաց թողնել մեկ անսարք բանալի՝ միևնույն մատակարարի մյուս կապերին թույլ տալով շարունակել սպասարկումը։ +**Նպատակը՝** բաց թողնել մեկ անսարք բանալի, մինչ նույն մատակարարի մյուս կապերը շարունակում են սպասարկել։ -**Իրականացում․** +**Իրականացումը՝** - Նշել որպես անհասանելի՝ `src/sse/services/auth.ts::markAccountUnavailable()` -- Ընտրություն՝ նույն ֆայլի `getProviderCredentials*` -- Հովացման հաշվարկ՝ `open-sse/services/accountFallback.ts::checkFallbackError()` +- Ընտրություն՝ նույն ֆայլում գտնվող `getProviderCredentials*` +- Սառեցման հաշվարկ՝ `open-sse/services/accountFallback.ts::checkFallbackError()` - Կարգավորումներ՝ `src/lib/resilience/settings.ts` -**Դաշտերը՝ ըստ կապի․** +**Դաշտերը յուրաքանչյուր կապի համար՝** -- `rateLimitedUntil` — ժամանակային դրոշմ՝ մինչև հովացման ավարտը +- `rateLimitedUntil` — ժամանակային դրոշմ՝ մինչև սառեցման ավարտը - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — էքսպոնենցիալ հետաձգման հաշվիչ -**Լռելյայն հովացման ժամանակահատվածներ․** +**Լռելյայն սառեցման ժամանակահատվածները՝** - OAuth-ի բազային արժեք՝ 5 վ - API բանալու բազային արժեք՝ 3 վ -- API բանալու 429՝ նախապատվությունը տալիս է վերին հոսքից ստացված `Retry-After`/վերակայման վերնագրերին/վերլուծելի վերակայման տեքստին +- API բանալու 429՝ նախապատվությունը տրվում է սկզբնաղբյուրի `Retry-After`/վերակայման վերնագրերին/վերլուծելի վերակայման տեքստին - Հետաձգում՝ `baseCooldownMs * 2 ** failureIndex` -**Միաժամանակյա կուտակված հարցումներից պաշտպանություն․** կանխում է, որ միաժամանակյա ձախողումները չափից ավելի երկարացնեն հովացման ժամանակահատվածը կամ կրկնակի ավելացնեն `backoffLevel`-ը։ +**Միաժամանակյա հարցումների կուտակման դեմ պաշտպանություն՝** կանխում է, որ միաժամանակյա խափանումները չափազանց երկարացնեն սառեցումը կամ կրկնակի ավելացնեն `backoffLevel`-ը։ -**Վերջնական վիճակներ (ՈՉ հովացման ժամանակահատվածներ)․** +**Վերջնական վիճակներ (սառեցումներ ՉԵՆ)՝** -- `banned` — սահմանվում է արգելված հիմնաբառի / հաշվի արգելափակման հայտնաբերմամբ (տե՛ս [BAN_DETECTION](../security/BAN_DETECTION.md)), ինչպես նաև վերին հոսքի կողմից յուրաքանչյուր հարցման համար երեք հաջորդական մերժումից հետո (`request_rejected`, օրինակ՝ Anthropic OAuth 403 «Request not allowed» — `open-sse/services/requestRejectedStreak.ts`)․ մեկ մերժումը միայն ժամանակավորապես հովացնում է կապը -- `expired` (սահմանափակ թվով կրկնափորձերից հետո անցնում է վերջնական վիճակի՝ `EXPIRED_RETRY_MAX = 3`, էքսպոնենցիալ հետաձգմամբ, որպեսզի OAuth-ի ժամանակավոր սխալները կարողանան ինքնուրույն վերականգնվել՝ նախքան հաշվի մշտական ապաակտիվացումը) +- `banned` — սահմանվում է արգելված հիմնաբառի / հաշվի արգելափակման հայտնաբերմամբ (տե՛ս [BAN_DETECTION](../security/BAN_DETECTION.md)), ինչպես նաև սկզբնաղբյուրի՝ յուրաքանչյուր հարցման մակարդակում երեք հաջորդական մերժումներից հետո (`request_rejected`, օրինակ՝ Anthropic OAuth 403 "Հարցումը թույլատրված չէ" — `open-sse/services/requestRejectedStreak.ts`)․ մեկ մերժումը միայն ժամանակավորապես սառեցնում է կապը +- `expired` (սահմանափակ թվով կրկնափորձերից հետո անցնում է վերջնական վիճակի՝ `EXPIRED_RETRY_MAX = 3`, էքսպոնենցիալ հետաձգմամբ, որպեսզի OAuth-ի անցողիկ սխալները կարողանան ինքնուրույն վերականգնվել՝ նախքան հաշվի մշտական ապաակտիվացումը) - `credits_exhausted` -Այս վիճակները պահպանվում են, մինչև հավատարմագրերը փոխվեն կամ օպերատորը վերակայի դրանք։ Վերջնական վիճակները մի՛ վերագրեք ժամանակավոր հովացման վիճակով։ - -**Ծույլ վերականգնում․** երբ `rateLimitedUntil`-ն անցյալում է, կապը կրկին դառնում է ընտրելի։ Հաջող օգտագործման դեպքում `clearAccountError()`-ը մաքրում է սխալի բոլոր դաշտերը։ - -### Սեսիայի կապակցվածություն (#7274) - -**Շրջանակ․** հաճախորդի մեկ սեսիա (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` վերնագիր), որը ամրակցված է մեկ կապի՝ **ցանկացած** մատակարարի համար։ - -**Նպատակ․** բազմաքայլ գործակալին (Claude Code, aider, հատուկ գործակալներ) հարցումների ընթացքում պահել նույն հաշվի վրա՝ նվազեցնելով հաշիվների միջև համատեքստի կորուստը և կրկնվող սառը մեկնարկի 429-ները՝ յուրաքանչյուր հաշվի համար առանձին սեսիոն վիճակ ունեցող մատակարարների դեպքում։ +Այս վիճակները պահպանվում են, մինչև մուտքային տվյալները փոխվեն կամ օպերատորը վերակայի դրանք։ Վերջնական վիճակները մի՛ վերագրեք անցողիկ սառեցման վիճակով։ + +**Ծույլ վերականգնում՝** երբ `rateLimitedUntil`-ն անցյալում է, կապը կրկին դառնում է կիրառելի։ Հաջող օգտագործման դեպքում `clearAccountError()`-ը մաքրում է սխալի բոլոր դաշտերը։ + +### Claude OAuth-ի օգտագործման սահմանափակում՝ ցածր առաջնահերթության ուղի + աշխատաշրջանի սահմանաչափի վերակայում + +**Շրջանակը՝** Claude-ի բաժանորդագրության մեկ (OAuth) կապ։ Երկու գործառույթն էլ **ակտիվացվում են առանձին՝ յուրաքանչյուր +կապի համար** (Խմբագրել կապը → Claude բաժին → `lowPriorityMode` / `autoLimitReset` +`providerSpecificData`-ում, երկուսն էլ լռելյայն անջատված են) և կրկնօրինակում են Claude Code-ի `/low-priority` և +`/limit-reset` հրամանները (հաղորդալարային պայմանագիրը վերցված է Claude Code 2.1.263-ից)։ + +**Իրականացումը՝** + +- Վիճակների ավտոմատ + պատասխանի դասակարգում՝ `open-sse/services/claudeLowPriority.ts` +- Վերակայման վիճակի/պահանջի հաճախորդ՝ `open-sse/services/claudeLimitReset.ts` +- Կատարողի կեռիկ (վերնագրի ներարկում + նույն հաշվի կրկնափորձ)՝ `open-sse/executors/base.ts::execute()` +- Ակտիվացման ընտրության պահպանում՝ `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Գործարկիչը՝** 5-ժամյա օգտագործման սահմանափակումը՝ `429`, որի վերնագրերը պարունակում են +`anthropic-ratelimit-unified-status: rejected`, իսկ երբ հաշիվը համապատասխան է՝ +`anthropic-ratelimit-unified-slow-offer: treatment`։ Մինչ այդ առաջին սահմանափակման +429-ը ոչինչ չի ուղարկվում․ առանց միասնական վերնագրերի կտրուկ 429-ը մշակվում է սառեցման սովորական ուղով։ + +**Ցածր առաջնահերթության ուղի** (`lowPriorityMode`)՝ + +- Սահմանափակման 429-ի դեպքում կատարողն ընդունում է առաջարկը և անմիջապես կրկին փորձում է **նույն** + հաշիվը՝ `anthropic-usage-limit: slow`-ով․ ուղին ակտիվ է մնում մինչև հայտարարված + `anthropic-ratelimit-unified-reset`-ը (+60 վ արտոնյալ ժամանակահատված), և այդ ժամանակահատվածի յուրաքանչյուր հարցում + պարունակում է վերնագիրը։ Ընդհատված 429-ը երբեք չի հասնում `handleChatCore`-ին, ուստի կապը + **չի** դրվում սառեցման վիճակի և չի փոխարինվում մեկ այլ կապով։ +- Հետագա պատասխանների `anthropic-ratelimit-unified-slow-status`-ը՝ `active` / `not_needed` + պահպանում են ուղին․ `slot_busy` (429) կամ `529`-ը սպասում են սերվերի + `anthropic-ratelimit-unified-slow-retry-after`-ին (լռելյայն՝ 20 վ, սահմանափակվում է 5–600 վ միջակայքում, ±30% պատահական շեղումով) + և կատարում կրկնափորձ՝ սահմանափակված `anthropic-ratelimit-unified-slow-max-wait`-ով (լռելյայն՝ 20 րոպե, սահմանափակվում է + 1 րոպե–6 ժ միջակայքում)․ դրանից հետո ուղին ավարտվում է, և 10-րոպեանոց դադարը արգելափակում է կրկնակի ընդունումը։ + Սպասումը լրացուցիչ սահմանափակվում է հարցման՝ սկզբնաղբյուրի մեկնարկի սեփական ժամանակավրեպության + (`resolveFetchStartTimeout`, լռելյայն՝ 10 րոպե) մնացած ժամանակով՝ հանած 5 վ․ առանց այդ սահմանափակման + 20-րոպեանոց լռելյայն առավելագույն սպասումը կգերազանցեր հարցման տևողությունը, և քունը կընդհատվեր + սպասման ընթացքում՝ պատշաճ `max_wait` ավարտի + դադարի փոխարեն առաջացնելով `TimeoutError`։ +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, 5-ժամյա պատուհանի շրջափուլի ավարտը կամ + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (որը ցանկացած վիճակում այն ավարտում է որպես + `extra_usage`, քանի որ վճարովի գերօգտագործումն այժմ ծածկում է սահմանափակումը) ավարտում են ուղին․ + պատասխանն այնուհետև անցնում է սառեցման սովորական ուղով։ `budget_exhausted`-ը հիշվում է մինչև + հայտարարված բյուջեի վերակայումը (≤ 8 օր)։ +- Սահմանափակման ստուգումը կատարվում է կատարողի՝ 400-ով պայմանավորված նույն փորձի շրջանակում կատարվող կրկնափորձերից հետո (համատեքստի + խմբագրում, մտածողության/ջանքի սահմանափակումներ, պարամետրերի ինքնաուսուցում), ուստի միայն այդ կրկնափորձերից + մեկում ի հայտ եկող սահմանափակման 429-ը նույնպես ընդհատվում է՝ սառեցման ուղուն հասնելու փոխարեն։ +- Վիճակը յուրաքանչյուր կապի համար պահվում է հիշողության մեջ (վերագործարկումը պահանջում է մեկ լրացուցիչ սահմանափակման 429՝ կրկին ընդունելու համար)։ + +**Աշխատաշրջանի սահմանաչափի վերակայում** (`autoLimitReset`, երբ երկուսն էլ միացված են՝ փորձվում է ուղուց առաջ)՝ + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → `juniper_tide` + բլոկ․ երբ `arm: "reset"` և `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits`՝ + `{ "program": "juniper_tide" }`-ով (կազմակերպության UUID-ը վերցվում է + `providerSpecificData.organizationUUID`-ից, սկզբնաբեռնման պահուստային տարբերակով)։ +- `result: reset|not_limited` → հարցումը կրկին փորձվում է ամբողջ արագությամբ (առանց դանդաղեցման վերնագրի)։ + `already_used` / `not_offered`-ը հիշապահում են `next_available_at`-ը (լռելյայն՝ մեկ շաբաթ)․ + ցանկացած խափանում առաջացնում է 15 րոպե հետաձգում։ Վերակայումը կատարվում է շաբաթը մեկ անգամ և, այնուամենայնիվ, հաշվարկվում է + շաբաթական սահմանաչափի մեջ։ + +Հետընթացի դեմ պաշտպանիչ թեստեր՝ `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`։ + +### Աշխատաշրջանի կապվածություն (#7274) + +**Շրջանակը՝** հաճախորդի մեկ աշխատաշրջան (`X-Session-Id` / `x-codex-session-id` / `x-omniroute-session` վերնագիր), որը ամրակցված է մեկ կապի՝ **ցանկացած** մատակարարի համար։ + +**Նպատակ․** բազմաքայլ գործակալը (Claude Code, aider, հատուկ գործակալներ) հարցումների միջև պահել նույն հաշվում՝ նվազեցնելով հաշիվների միջև համատեքստի կորուստը և կրկնվող սառը մեկնարկի 429 սխալները՝ յուրաքանչյուր հաշվի համար նստաշրջանի վիճակ ունեցող մատակարարների դեպքում։ **Իրականացում․** - TTL-ի որոշում՝ `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Ամրակցման ընտրություն/ստեղծում՝ `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Վերնագրի արտահանում (ընդհանուր, ցանկացած մատակարարի համար)՝ `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Պահպանվող ամրակցումների աղյուսակ՝ `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Կարգավորում՝ `sessionAffinityTtlMs` (ընդհանուր TTL-ը՝ մվ-ով, `0`-ն անջատում է) — `src/lib/db/settings.ts`։ Codex-ին հատուկ `codexSessionAffinityTtlMs` անվանումից վերանվանվել է `124_generic_session_affinity_ttl.sql` միգրացիայի միջոցով, որը նախկինում կազմաձևված Codex TTL-ը փոխանցում է որպես նոր լռելյայն արժեք։ +- Կապակցման ընտրություն/ստեղծում՝ `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Վերնագրի դուրսբերում (ընդհանուր, ցանկացած մատակարարի համար)՝ `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Պահպանվող կապակցումների աղյուսակ՝ `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Կարգավորում՝ `sessionAffinityTtlMs` (գլոբալ TTL՝ մվ-ով, `0`-ն անջատում է) — `src/lib/db/settings.ts`։ Codex-ին հատուկ `codexSessionAffinityTtlMs` անվանումից վերանվանվել է `124_generic_session_affinity_ttl.sql` միգրացիայի միջոցով, որը նախկինում կազմաձևված Codex TTL-ը փոխանցում է որպես նոր լռելյայն արժեք։ -Մինչև #7274-ը `resolveSessionAffinityTtlMs()`-ը `codex`-ից բացի յուրաքանչյուր մատակարարի համար անմիջապես վերադարձնում էր `0`, ուստի TTL կարգավորումը (և սեսիայի վերնագրերը) որևէ այլ տեղ ազդեցություն չունեին, թեև ամրակցման մեխանիզմն ու վերնագրերի արտահանումն արդեն իսկ անկախ էին մատակարարից։ Ուղղումը հեռացրեց այդ վաղ վերադարձը․ այժմ TTL-ը միատեսակ կիրառվում է յուրաքանչյուր մատակարարի նկատմամբ, երբ այն գլոբալ կերպով սահմանված է `0`-ից բարձր։ +Մինչև #7274-ը, `resolveSessionAffinityTtlMs()`-ը `codex`-ից բացի յուրաքանչյուր մատակարարի համար անմիջապես վերադարձնում էր `0`, ուստի TTL կարգավորումը (և նստաշրջանի վերնագրերը) այլուր որևէ ազդեցություն չունեին, թեև կապակցման մեխանիզմը և վերնագրերի դուրսբերումն արդեն իսկ մատակարարից անկախ էին։ Ուղղումը հեռացրեց այդ վաղաժամ վերադարձը. այժմ TTL-ը միատեսակ կիրառվում է յուրաքանչյուր մատակարարի համար, երբ գլոբալ արժեքը սահմանված է `0`-ից բարձր։ -Սեսիայի կապակցվածության երեք վերնագրերը երբեք չեն փոխանցվում վերին հոսք․ կատարիչները զրոյից կազմում են վերին հոսքի իրենց սեփական վերնագրերը՝ հաճախորդի վերնագրերը փոխանցելու փոխարեն, ուստի սա մնում է միայն ներքին հարաբերակցման նույնացուցիչ։ +Նստաշրջանի կապակցման երեք վերնագրերը երբեք չեն փոխանցվում վերին հոսք․ կատարիչները զրոյից կառուցում են իրենց վերին հոսքի վերնագրերը՝ հաճախորդի վերնագրերը փոխանցելու փոխարեն, ուստի սա մնում է միայն ներքին համակցման նույնացուցիչ։ -### Կառավարվող սեսիայի կապերի բացառիկ վարձակալություններ +### Կառավարվող նստաշրջանի կապակցումների բացառիկ վարձակալումներ -**Շրջանակ․** մեկ ակտիվ կառավարվող HTTP հաճախորդ/սեսիա տիրապետում է OmniRoute-ի մեկ ընտրելի կապի։ +**Շրջանակ․** մեկ ակտիվ կառավարվող HTTP հաճախորդ/նստաշրջան տիրապետում է OmniRoute-ի մեկ համապատասխան կապակցման։ -**Նպատակ․** ապահովել կապի տևական բացառիկ տիրապետում այն հաճախորդների համար, որոնց հարցումների միջև անհրաժեշտ է երթուղավորման խիստ -սահմանազատում։ Սա տարբերվում է սեսիայի կապակցվածությունից, որը շարունակականության մեղմ նախապատվություն է․ -բացառիկ վարձակալությունը SQLite-ում պահպանում է կենսացիկլի վիճակը, պարտադրում է ակտիվ տիրոջ և -ակտիվ կապի գլոբալ եզակիությունը և մերժում է հնացած սերունդը՝ նախքան մատակարարին ուղարկելը։ +**Նպատակ․** ապահովել կապակցման երկարատև բացառիկ տիրապետում այն հաճախորդների համար, որոնց հարցումների միջև անհրաժեշտ է երթուղավորման կոշտ սահմանափակում։ Սա տարբերվում է նստաշրջանի կապակցումից, որը շարունակականության մեղմ նախընտրություն է․ բացառիկ վարձակալումը պահպանում է կենսացիկլի վիճակը SQLite-ում, գլոբալ մակարդակում ապահովում է ակտիվ սեփականատիրոջ և ակտիվ կապակցման եզակիությունը և մինչև մատակարարին ուղարկելը մերժում է հնացած սերունդը։ -Գործառույթը յուրաքանչյուր API բանալու համար ակտիվացվում է ըստ ցանկության։ Կառավարվող բանալին պետք է ունենա `lease:exclusive` շրջանակ և -հստակ սահմանված, ոչ դատարկ `allowedConnections` ցանկ։ Ցանկացած HTTP հաճախորդ կարող է օգտագործել կենսացիկլի վերջնակետը․ -հաճախորդի անուն, օգտվողի գործակալ, մատակարար, OAuth մեթոդ կամ մոդել չի պահանջվում։ Վարձակալությունը տիրապետում է կապի, -ոչ թե մոդելի, ուստի մոդելի փոփոխության դեպքում կապակցումը պահպանվում է, քանի դեռ կապը սովորական կարգով -ընտրելի է։ Մոդելի, քվոտայի, առողջական վիճակի, հովացման և թույլատրելի ցանկի սովորական կանոնները շարունակում են գերակա մնալ և կարող են -նույն սերունդը տեղափոխել մեկ այլ ազատ ու ընտրելի կապի։ +Գործառույթը յուրաքանչյուր API բանալու համար միացվում է առանձին։ Կառավարվող բանալին պետք է ունենա `lease:exclusive` շրջանակ և հստակ սահմանված ոչ դատարկ `allowedConnections` ցանկ։ Ցանկացած HTTP հաճախորդ կարող է օգտագործել կենսացիկլի վերջնակետը. հաճախորդի անուն, user-agent, մատակարար, OAuth մեթոդ կամ մոդել չի պահանջվում։ Վարձակալումը տիրապետում է կապակցման, ոչ թե մոդելի, ուստի մոդելի փոփոխության դեպքում կապակցումը պահպանվում է, քանի դեռ այն սովորական պայմաններով շարունակում է համապատասխան լինել։ Մոդելի, քվոտայի, վիճակի, սառեցման և թույլատրվածների ցանկի սովորական կանոնները շարունակում են գերակա լինել և կարող են նույն սերունդը տեղափոխել մեկ այլ ազատ համապատասխան կապակցման։ -Կենսացիկլն իրականացվում է `POST /api/v1/session-leases`-ով՝ JSON-ի `acquire`, `renew` և `release` գործողություններով։ -Կառավարվող ինֆերենսի հարցումները ներկայացնում են անթափանց `X-OmniRoute-Lease-Owner` արժեքը և ճշգրիտ -`X-OmniRoute-Lease-Generation`-ը։ Տիրոջ արժեքը սկսվում է `vlo_`-ով, որին հաջորդում է base64url-ի 43 նիշ․ պահվում է միայն -դրա SHA-256 հեշը։ Յուրաքանչյուր վերջնական ուղարկման սահմանափակում նաև կապում է նույնականացված API բանալու ID-ն և -ակտիվ կապի ID-ն։ Վարձակալության կառավարման վերնագրերը հեռացվում են մատյաններից, պահպանված հարցումների պատկերներից և -վերին հոսքի կատարիչների վերնագրերից։ +Կենսացիկլի համար օգտագործվում է `POST /api/v1/session-leases`՝ JSON գործողություններով՝ `acquire`, `renew` և `release`։ Կառավարվող եզրակացության հարցումները ներկայացնում են անթափանց `X-OmniRoute-Lease-Owner` արժեքը և ճշգրիտ `X-OmniRoute-Lease-Generation`-ը։ Սեփականատիրոջ արժեքը կազմված է `vlo_`-ից, որին հաջորդում են 43 base64url նիշեր. պահպանվում է միայն դրա SHA-256 հեշը։ Ուղարկման յուրաքանչյուր վերջնական սահմանափակում նաև կապակցում է նույնականացված API բանալու ID-ն և ակտիվ կապակցման ID-ն։ Վարձակալման կառավարման վերնագրերը հեռացվում են մատյաններից, պահպանված հարցումների պատկերներից և վերին հոսքի կատարիչների վերնագրերից։ -Եթե սովորական երթուղավորումն ունի ընտրելի կառավարվող թեկնածուներ, սակայն յուրաքանչյուր ազատ թեկնածու զբաղեցված է -օտար ակտիվ վարձակալությամբ, OmniRoute-ը վերադարձնում է HTTP `429`, lease-capacity-unavailable կոդ, -հզորության հասանելիությանը սպասելու վիճակ և սահմանափակ `Retry-After`, որը հաշվարկվում է համապատասխան ամենավաղ ժամկետի ավարտից։ -Ընտրելի թեկնածուների սովորական բացակայությունը վարձակալության մրցակցություն չէ և պահպանում է երթուղավորման սխալի իր գործող իմաստաբանությունը։ +Եթե սովորական երթուղավորումն ունի համապատասխան կառավարվող թեկնածուներ, բայց յուրաքանչյուր ազատ թեկնածու զբաղեցված է օտար ակտիվ վարձակալմամբ, OmniRoute-ը վերադարձնում է HTTP `429`, lease-capacity-unavailable կոդ, տարողության սպասման վիճակ և սահմանափակ `Retry-After`, որը հաշվարկվում է համապատասխան ամենավաղ ժամկետի ավարտից։ Համապատասխան տարբերակների սովորական բացակայությունը վարձակալման մրցակցություն չէ և պահպանում է երթուղավորման սխալների առկա իմաստաբանությունը։ Հարակից մեխանիզմները մնում են առանձին․ -- OAuth սեսիայի զբաղվածությունը պրոցեսի ներսում OAuth հաշիվների մեղմ բաշխման մեխանիզմ է։ -- Հաշվի սեմաֆորները տրամադրում են հարցումների զուգահեռության թույլտվություններ և ավարտվում են հարցման ավարտին։ -- Կառավարվող սեսիայի կապերի բացառիկ վարձակալությունները տևական կենսացիկլային տիրապետում են՝ սերնդի սահմանափակմամբ։ +- OAuth նստաշրջանի զբաղվածությունը գործընթացի ներսում OAuth հաշիվների մեղմ բաշխման մեխանիզմ է։ +- Հաշիվների սեմաֆորները տրամադրում են հարցումների զուգահեռության թույլտվություններ և ավարտվում են հարցման ավարտին։ +- Կառավարվող նստաշրջանների բացառիկ վարձակալումները երկարատև կենսացիկլային տիրապետում են՝ սերնդի սահմանափակմամբ։ --- @@ -265,48 +309,73 @@ OmniRoute-ն ունի խափանումների նկատմամբ կայունու --- -## 5. Հարցումների հերթի ընդունման կառավարում (v3.8.49 · խնդիր #6593) - -**Կիրառման շրջանակ**․ տեղային՝ յուրաքանչյուր մատակարարի+կապի հարցումների հաճախականության սահմանափակման հերթը (`open-sse/services/rateLimitManager.ts`, -որն աշխատում է Bottleneck-ի հիման վրա), որը վերոնշյալ երեք մեխանիզմներից մեկ շերտ ներքև է։ - -**`maxWaitMs`-ը կատարման ժամկետի սպառման համար պահպանվող ժառանգական անվանում է։** -`resilienceSettings.requestQueue.maxWaitMs`-ը փոխանցվում է Bottleneck-ին որպես առաջադրանքի -`expiration`, որի ժամանակաչափը սկսվում է միայն ուղարկումից հետո։ Հետևաբար այն սահմանափակում է -սահմանափակիչի կողմից կառավարվող կատարումը, ոչ թե տեղային հերթում անցկացրած ժամանակը։ Ժամկետի սպառումը -ներկայացվում է որպես վստահելի տեղային `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504)․ -հերթի սպասման ժամանակի սպառման նախկին կոդային անվանումն ընդունվում է միայն վստահելի ներքին -հետադարձ համատեղելիության համար։ Լռելյայն արժեքը 15000ms է․ այն կարելի է վերասահմանել -`RATE_LIMIT_MAX_WAIT_MS`-ի (միջավայրի փոփոխական) կամ կառավարման վահանակի միջոցով (**Կարգավորումներ → Կայունություն**, -UI-ի առավելագույն սահմանը՝ 1–30000ms)։ Հերթում գտնվելու ժամանակը վերջնաժամկետ չունի․ հերթագրված կանչողների -քանակը սահմանափակելու համար օգտագործեք ստորև ներկայացված `maxQueueDepth`-ը։ +## 5. Հարցումների հերթի ընդունման վերահսկում (v3.8.49 · խնդիր #6593) + +**Կիրառման շրջանակը**․ յուրաքանչյուր մատակարարի և կապի համար տեղային արագության սահմանափակման հերթը (`open-sse/services/rateLimitManager.ts`, +որը հիմնված է Bottleneck-ի վրա)՝ վերը նշված երեք մեխանիզմներից մեկ մակարդակ ներքև։ + +**`maxWaitMs`-ը սահմանափակում է հերթում սպասելը, իսկ `executionMaxWaitMs`-ը՝ կատարումը։** +Այս երկուսը միտումնավոր առանձնացված են, և ոչ մեկը չի ազդում մյուսի վրա։ + +`resilienceSettings.requestQueue.maxWaitMs`-ը **հերթում սպասելու բյուջեն** է․ այն +ներառում է մատակարարի ազատ տեղի սպասումը և այնուհետև QUEUED վիճակում մնալը, իսկ դրա ժամանակաչափը +մաքրվում է այն պահին, երբ առաջադրանքը դուրս է գալիս QUEUED վիճակից և սկսում է կատարվել +(`rateLimitManager.ts`, `wrappedFn`)։ Այն գերազանցող հարցումը երբեք չի հասնում +արտաքին մատակարարին։ Լռելյայն արժեքը 30000ms է, որը սահմանվում է `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS`-ով՝ +`src/lib/resilience/settings.ts`-ում, և ամրագրված է +`tests/unit/ratelimit-admission-control-6593.test.ts`-ով, որպեսզի դրա փոփոխության դեպքում +այդ թեստը ձախողվի, այլ ոչ թե այս պարբերությունն աննկատ հնանա։ + +`resilienceSettings.requestQueue.executionMaxWaitMs`-ն այն արժեքն է, որը Bottleneck-ը +ստանում է որպես առաջադրանքի `expiration`, և որի ժամանակաչափը սկսվում է միայն ուղարկումից հետո։ Այն +պահուստային սահմանափակում է այն կատարիչների համար, որոնք չունեն արտաքին հարցման սեփական ժամանակային սահմանափակում, +և այն բարձրացվում է մինչև կատարիչի՝ fetch-ը սկսելու սեփական ժամանակային սահմանափակումը, երբ վերջինս ավելի երկար է, որպեսզի +այն չկարողանա ընդհատել ընթացքի մեջ գտնվող բնականոն պատասխանը։ Լռելյայն արժեքը 600000ms է (10 րոպե)։ + +Հերթի բյուջեն `expiration`-ին փոխանցելը նախկինում ընդհատում էր ոչ աստիճանական +gateway-ները կատարման ընթացքում․ դրանք իրավաչափորեն կարող են աշխատել րոպեներ՝ մինչև առաջին բայթերի ստացումը, +և հենց այդ պատճառով ժամկետի սպառումը ներկայացվում է որպես `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), մինչդեռ հերթի բյուջեն կրում է +հերթի ժամանակային սահմանափակման կոդը։ Դրանցից յուրաքանչյուրը կարելի է վերասահմանել `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS`-ի (միջավայրի փոփոխական) կամ կառավարման վահանակի միջոցով +(**Կարգավորումներ → Խափանումակայունություն**)։ Նորմալացման ժամանակ երկուսն էլ սահմանափակվում են 1ms–24h միջակայքով։ + +**Առաջնահերթությունը երկուսի համար էլ․** միջավայրի փոփոխականը տրամադրում է միայն _լռելյայն_ արժեքը։ +`resilienceSettings.requestQueue`-ում պահպանված արժեքը (կառավարման վահանակի / API patch-ի միջոցով, պահված +`key_value`-ում) գերակայում է դրան, իսկ յուրաքանչյուր կապի համար սահմանված +`rateLimitOverrides.maxWaitMs` / `.executionMaxWaitMs` արժեքը գերակայում է նաև դրան։ Հետևաբար, +միջավայրի փոփոխականը սահմանելը այն տեղակայման համար, որն արդեն ունի պահպանված արժեք, +ոչինչ չի փոխում․ դրա փոխարեն մաքրեք կամ թարմացրեք պահպանված կարգավորումը։ + +Հերթում մնալու ժամանակը սահմանափակվում է `maxWaitMs`-ով, իսկ ստորև ներկայացված `maxQueueDepth`-ը սահմանափակում է, +թե միաժամանակ քանի կանչող կարող է գտնվել հերթում։ **`maxQueueDepth` — ըստ ցանկության միացվող ընդունման սահմանաչափ (նոր)։** `resilienceSettings.requestQueue.maxQueueDepth`-ը -սահմանափակում է, թե քանի հարցում կարող է միաժամանակ հերթում գտնվել (դեռ չուղարկված) -մեկ մատակարարի+կապի համար։ Երբ հերթում արդեն կա `maxQueueDepth` +սահմանափակում է, թե մեկ մատակարարի և կապի համար քանի հարցում կարող է միաժամանակ գտնվել հերթում +(դեռևս չուղարկված)։ Երբ հերթում արդեն կա `maxQueueDepth` հարցում, նոր հարցումն արագ մերժվում է տիպավորված -`code: "RATE_LIMIT_QUEUE_FULL"` սխալով՝ **նախքան** այն երբևէ կհասնի `limiter.schedule()`-ին -․ այդպիսով մերժումը քիչ ռեսուրս է պահանջում և կատարվում է նախքան տվյալ հարցման հետագա -հարցման տեքստի սեղմման / թարգմանության ցանկացած գործողություն։ Լռելյայն `0` = -անջատված՝ պահպանելով առկա անսահմանափակ հերթի վարքագիծը․ թույլատրելի միջակայքը՝ 0–100000։ +`code: "RATE_LIMIT_QUEUE_FULL"` սխալով՝ **նախքան** `limiter.schedule()`-ին երբևէ հասնելը +․ այսպիսով, մերժումը քիչ ռեսուրս է պահանջում և տեղի է ունենում տվյալ հարցման համար նախատեսված հետագա +prompt-ի սեղմման / թարգմանության ցանկացած աշխատանքից առաջ։ Լռելյայն `0` = +անջատված՝ պահպանելով հերթի անսահմանափակման առկա վարքագիծը։ Թույլատրելի միջակայքը 0–100000 է։ Վերասահմանեք `RATE_LIMIT_MAX_QUEUE_DEPTH`-ի (միջավայրի փոփոխական) կամ -`resilienceSettings.requestQueue.maxQueueDepth`-ի միջոցով (կառավարման վահանակ/API patch)։ +`resilienceSettings.requestQueue.maxQueueDepth`-ի միջոցով (կառավարման վահանակի/API patch)։ Ընդունման ստուգումն ինքնին մաքուր ֆունկցիա է (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`), ուստի այն կարող է միավորային թեստավորվել առանց իրական Bottleneck սահմանափակիչի։ -> #6593-ը բացած RFC-ն նաև առաջարկել էր `bypassCompressionOnRateLimit` -> դրոշակ։ Այս ռեպոզիտորիայի `open-sse/services/compression/` խողովակաշարը -> ելքային LLM հարցման հուշման/համատեքստի սեղմման համար է (`chatCore.ts`, +> #6593-ը բացած RFC-ն նաև առաջարկում էր `bypassCompressionOnRateLimit` +> դրոշակ։ Այս ռեպոզիտորիայի `open-sse/services/compression/` pipeline-ը +> արտագնա LLM հարցման prompt-ի/համատեքստի սեղմման համար է (`chatCore.ts`, > `resolveCompressionSettings`/`selectCompressionStrategy` բլոկի շրջակայքում), -> այլ ոչ թե սինթեզված 429 պատասխանների HTTP սեղմման համար․ բառացի շրջանցման դրոշակին -> համապատասխանող կոդային ուղի չկա։ Բացի այդ, հարցման տեքստի սեղմման այդ քայլը -> ներկայում հարցումների խողովակաշարում կատարվում է `withRateLimit()`-ից _առաջ_, ուստի -> հերթի լցվածության պատճառով մերժման դեպքում այն բաց թողնելու համար գործողությունների վերադասավորումը առանձին և ավելի ծավալուն -> փոփոխություն է, քան այս խնդրի շրջանակը․ այն միտումնավոր **չի** իրականացվել -> այստեղ և թողնվել է հետագա աշխատանքի համար, եթե CPU-ի խնայողությունն արդարացնի -> վերադասավորման ռիսկը։ +> այլ ոչ թե գեներացված 429 պատասխանների HTTP սեղմման․ բառացի շրջանցման դրոշակին +> համապատասխանող կոդի ուղի գոյություն չունի։ Prompt-ի սեղմման այդ քայլը +> ներկայումս նաև կատարվում է հարցումների pipeline-ում `withRateLimit()`-ից _առաջ_, ուստի +> հերթի լցված լինելու պատճառով մերժման դեպքում այն բաց թողնելու համար քայլերի հերթականությունը փոխելը +> առանձին և ավելի մեծ փոփոխություն է, քան այս խնդրի կիրառման շրջանակը։ Այն այստեղ միտումնավոր +> **չի** իրականացվել և թողնվել է հետագա աշխատանքի համար, եթե CPU-ի ռեսուրսների խնայողությունն +> արդարացնում է հերթականության փոփոխման ռիսկը։ --- diff --git a/docs/i18n/hy/docs/architecture/admission-lanes.md b/docs/i18n/hy/docs/architecture/admission-lanes.md index 28c4415e16d9..30f84833e817 100644 --- a/docs/i18n/hy/docs/architecture/admission-lanes.md +++ b/docs/i18n/hy/docs/architecture/admission-lanes.md @@ -7,49 +7,64 @@ OmniRoute-ն ունի գործընթացի ներսում գործող ուղիների **երկու** համակարգ՝ տարբեր ընդգրկույթներով։ Դրանք փոխլրացնող են․ օպերատորները պետք է իմանան, թե դրանցից որն են դիտարկում։ -## 1. Բայթային մակարդակով՝ ամբողջ գործընթացի ընդունման կառավարում (`chatBodyAdmission.ts`) - -- **Ընդգրկույթ․** բուֆերացված մարմնի/heap-ի ուղին՝ `POST /v1/chat/completions`, - `/v1/messages`, `/v1/responses` և չատի կառուցվածք ունեցող մյուս երթուղիների համար։ Պաշտպանում է - կոդավորման գործակալների մեծ մարմիններից առաջացող heap-ի բազմապատկումից (#4380)։ -- **Մեկ ընդհանուր կարգավորիչ ամբողջ գործընթացի համար, ոչ թե առանձին ուղիներ յուրաքանչյուր բանալու համար (#10110)։** Յուրաքանչյուր API բանալի - (հեշավորված) կամ `anonymous` աշխատաշրջան ընդունվում է միևնույն - ընդհանուր բյուջեի հաշվին․ հեշավորված աշխատաշրջանի ID-ն օգտագործվում է ՄԻԱՅՆ որպես արդար պլանավորման բանալի (սպասողների - հերթափոխային բաշխում), և երբեք՝ որպես թողունակության շարդ։ Այս - փաստաթղթի նախորդ տարբերակում նկարագրված էին յուրաքանչյուր բանալու համար անկախ թողունակությամբ առանձին ուղիներ․ այդ մոդելը - հեռացվել է #10110-ում, քանի որ այն թույլ էր տալիս չնույնականացված կեղծ հավատարմագրերով - բազմապատկել ամբողջ գործընթացի սահմանաչափը։ -- **Դարպաս (#503-fanout)․ ավտոմատ որոշվող մուտքային ԲԱՅԹԱՅԻՆ բյուջե, ոչ թե հարցումների ֆիքսված - քանակ։** Հին `CHAT_MAX_HEAVY_IN_FLIGHT` հարցումների քանակի սահմանաչափը (մինչ այս ուղղումը՝ լռելյայն `1`) - կոդավորման գործակալների զուգահեռ ճյուղավորումը (մի քանի ենթագործակալներ/CLI-ներ, - սովորաբար > 256 KB մարմիններով) հանգեցնում էր մոտավորապես 1 արդյունավետ զուգահեռության, ինչի պատճառով լիովին սովորական բեռնվածության - պայմաններում վերադարձվում էր 503։ Այժմ այն սահմանափակում է միայն այն դեպքում, երբ օպերատորը բացահայտորեն - սահմանում է `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`-ը։ Եթե այն սահմանված չէ, ընդունման կառավարումն իրականացվում է +## 1. Բայթային մակարդակով՝ ամբողջ գործընթացի ընդունում (`chatBodyAdmission.ts`) + +- **Շրջանակը՝** `POST /v1/chat/completions`, `/v1/messages`, + `/v1/responses` և չաթի կառուցվածք ունեցող մյուս երթուղիների բուֆերացված + մարմնի/heap ուղին։ Պաշտպանում է ծրագրավորման գործակալների մեծ մարմինների + պատճառով heap-ի ծավալի աճից (#4380)։ +- **Մեկ ընդհանուր՝ ամբողջ գործընթացի համար նախատեսված վերահսկիչ, այլ ոչ թե + առանձին ուղիներ յուրաքանչյուր բանալու համար (#10110)։** Յուրաքանչյուր API + բանալի (հեշավորված) կամ `anonymous` աշխատաշրջան ընդունման ժամանակ օգտագործում է + **նույն** ընդհանուր բյուջեն․ հեշավորված աշխատաշրջանի նույնացուցիչն օգտագործվում է + ՄԻԱՅՆ որպես արդար պլանավորման բանալի (սպասողների միջև շրջանաձև բաշխում), և ոչ + երբեք որպես տարողության բաժանման միջոց։ Այս փաստաթղթի նախորդ տարբերակը + նկարագրում էր յուրաքանչյուր բանալու համար անկախ տարողությամբ առանձին ուղիներ․ + այդ մոդելը հեռացվեց #10110-ում, քանի որ այն թույլ էր տալիս չնույնականացված + կեղծ հավատարմագրերով բազմապատկել ամբողջ գործընթացի սահմանաչափը։ +- **Դարպաս (#503-fanout)՝ ավտոմատ հաշվարկվող ընդունման ԲԱՅԹԱՅԻՆ բյուջե, այլ ոչ + թե հարցումների ֆիքսված քանակ։** Հին `CHAT_MAX_HEAVY_IN_FLIGHT` + հարցումների քանակի սահմանաչափը (մինչ այս ուղղումը՝ լռելյայն `1`) ծրագրավորման + գործակալների զուգահեռ բաշխումը (մի քանի ենթագործակալներ/CLI-ներ, որոնց + մարմինները սովորաբար > 256 KB են) նվազեցնում էր մինչև մոտավորապես 1 + արդյունավետ զուգահեռություն, ինչի պատճառով լիովին սովորական բեռնվածության + դեպքում վերադարձվում էր 503։ Այժմ այն կիրառվում է միայն այն դեպքում, երբ + օպերատորը հստակորեն սահմանում է `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`։ + Եթե այն սահմանված չէ, ընդունումը փոխարենը վերահսկվում է `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`-ով՝ գործընթացի իրական հիշողության - սահմանաչափից ավտոմատ որոշվող բյուջեով (`src/shared/middleware/admissionBudget.ts`)․ - V8 heap-ի սահմանաչափից և ցանկացած cgroup/կոնտեյների սահմանաչափից ավելի խիստ արժեքի 25%-ը՝ - բաժանված անցողիկ 8-ապատիկ բազմապատկման գործակցի վրա և սահմանափակված 8 MiB-ից - 2 GiB միջակայքում։ Բացահայտ վերասահմանումների համար կիրառվում են նույն սահմանները։ Սա ինքնաբերաբար մասշտաբավորվում է - 512 MB կոնտեյներից մինչև 32 GB աշխատասեղանային համակարգ՝ առանց միջավայրի փոփոխականների կարգաբերման։ Այն մարմինը, որը չի կարող - տեղավորվել արդյունավետ բյուջեի սահմաններում, անմիջապես ձախողվում է՝ վերադարձնելով `413 body_exceeds_budget`․ - սահմանափակ արդարության հերթ է մտնում միայն առանձին-առանձին սպասարկելի մարմինների միջև - մրցակցությունը։ Ռեսուրսների ճնշման բազմաազդանշան իրական ժամանակի հետագծիչը (V8 heap-ի հարաբերակցություն, - cgroup, PSI, OOM իրադարձություններ՝ `open-sse/utils/resourcePressurePolicy.ts`) կրճատում է - սահմանափակ սպասման ժամանակը `high` ճնշման դեպքում և, նախքան որևէ բայթի - ընդունումը, `critical` ճնշման դեպքում անմիջապես մերժում է բեռը՝ վերադարձնելով - `503 resource_pressure`։ -- **Կարգաբերում․** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — ավտոմատ որոշվող բայթային բյուջեի վերասահմանում - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — հարցումների քանակի հին սահմանաչափ, միայն ըստ ընտրության + առավելագույն շեմից ավտոմատ հաշվարկվող բյուջեով + (`src/shared/middleware/admissionBudget.ts`)․ V8 heap-ի սահմանաչափից և + cgroup/կոնտեյների ցանկացած սահմանաչափից ավելի խիստի 25%-ը՝ բաժանված ժամանակավոր + 8-ապատիկ աճի գործակցի վրա և սահմանափակված 8 MiB-ից մինչև 2 GiB միջակայքում։ + Հստակորեն նշված վերասահմանումներն օգտագործում են նույն սահմանափակումները։ + Սա առանց միջավայրի փոփոխականների կարգաբերման ինքնաբերաբար մասշտաբավորվում է + 512 MB կոնտեյներից մինչև 32 GB աշխատասեղանային համակարգ։ Մարմինը, որը չի + տեղավորվում արդյունավետ բյուջեի սահմաններում, անմիջապես ձախողվում է + `413 body_exceeds_budget`-ով․ միայն առանձին-առանձին սպասարկելի մարմինների միջև + մրցակցությունն է մտնում սահմանափակ արդարության հերթ։ Ռեսուրսների ճնշման + բազմաազդանշան իրական ժամանակի հետագծիչը (V8 heap-ի հարաբերակցություն, cgroup, + PSI, OOM իրադարձություններ՝ `open-sse/utils/resourcePressurePolicy.ts`) + կրճատում է սահմանափակ սպասումը `high` ճնշման դեպքում և անմիջապես մերժում է + `503 resource_pressure`-ով `critical` ճնշման դեպքում՝ նախքան որևէ բայթի + ընդունումը։ Առկայության դեպքում PSI-ն ընթերցվում է այս միավորի cgroup-ի + `memory.pressure`-ից (`open-sse/utils/resourcePressureSampler.ts`)․ + `/proc/pressure/memory`-ը վերաբերում է ամբողջ հոսթին և օգտագործվում է միայն + որպես պահուստային տարբերակ ֆիզիկական սերվերի / cgroup v1-ի դեպքում, որպեսզի + փոխանակման հիշողություն օգտագործող հոսթը չկարողանա պարապ կոնտեյների համար + վերադարձնել 503։ +- **Կարգաբերում՝** + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — ավտոմատ հաշվարկվող բայթային բյուջեի վերասահմանում + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — հարցումների քանակի հին սահմանաչափ, միայն հստակ միացմամբ - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — հերթում սպասելու ժամանակը մինչև 503 (լռելյայն՝ 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — հերթագրված բայթերի heap-ի փական (լռելյայն՝ 4 MB) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — հերթագրված բայթերի heap-ի կարգավորիչ (լռելյայն՝ 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — #10110-ից ի վեր հնացած - և ոչինչ չանող կարգավորումներ (կազմաձևման համատեղելիության համար ընդունվում են, բայց անտեսվում) -- **Հաշվետվություններ․** `GET /api/monitoring/health` → `chatAdmission` (#11244)՝ ներառյալ - #503-fanout-ի հավելումները՝ `inflightBytes`, `maxInflightBytes`, `budgetSource` - (`v8_heap` | `cgroup` | `override`), `pressureSeverity` և `countCapEnabled` - (լռելյայն տեղակայման դեպքում false է․ հաստատում է, որ իրականում սահմանափակողը բայթային բյուջեն է, ոչ թե հին - քանակային սահմանաչափը)։ + և գործողություն չկատարող (ընդունվում են կազմաձևման համատեղելիության համար, սակայն անտեսվում են) +- **Հաշվետվություններ՝** `GET /api/monitoring/health` → `chatAdmission` (#11244)՝ + ներառյալ #503-fanout-ի հավելումները՝ `inflightBytes`, `maxInflightBytes`, + `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity` և + `countCapEnabled` (լռելյայն տեղակայման դեպքում՝ false․ հաստատում է, որ + իրականում սահմանափակողը բայթային բյուջեն է, ոչ թե հարցումների քանակի հին + սահմանաչափը)։ ## 2. Հարմարվողական գործարկման ժամանակի վիրտուալ ուղիներ (`open-sse/services/admission`) diff --git a/docs/i18n/hy/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/hy/docs/frameworks/EMBEDDED-SERVICES.md index 2b03eeb5c5c7..c61a3e8831c9 100644 --- a/docs/i18n/hy/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/hy/docs/frameworks/EMBEDDED-SERVICES.md @@ -4,13 +4,11 @@ --- -> **Տարբերակ՝** v3.8.44 -> **Վերջին թարմացումը՝** 2026-07-03 -> **Լսարանը՝** Ներկառուցված ծառայություններ (9Router, CLIProxyAPI, Mux, Bifrost) ավելացնող, սպասարկող կամ վրիպազերծող ինժեներներ։ +> **Տարբերակը:** v3.8.44 +> **Վերջին թարմացումը:** 2026-09-09 +> **Լսարանը:** Ներկառուցված ծառայություններ (9Router, CLIProxyAPI, Mux, Bifrost, open-wa) ավելացնող, սպասարկող կամ կարգաբերող ինժեներներ։ -Ներկառուցված ծառայությունները տեղային տեղադրվող ուղեկից գործընթացային գործիքներ են, որոնք OmniRoute-ը տեղադրում, վերահսկում և -ներկայացնում է որպես լիարժեք երթուղավորման թիրախներ։ Ի տարբերություն արտաքին մատակարարների (որոնց հասանելիությունն իրականացվում է համացանցի միջոցով՝ -API բանալիներով), ներկառուցված ծառայություններն աշխատում են OmniRoute-ի հետ նույն մեքենայի վրա և հաղորդակցվում loopback-ի միջոցով։ +Ներկառուցված ծառայությունները տեղականորեն տեղադրված պրոցեսի կողային գործիքներ են, որոնք OmniRoute-ը տեղադրում, վերահսկում և բացահայտում է որպես առաջնակարգ երթուղղման թիրախներ։ Ի տարբերություն արտաքին մատակարարների (որոնց հասանելի են ինտերնետի միջոցով՝ API բանալիների միջոցով), ներկառուցված ծառայություններն աշխատում են նույն մեքենայի վրա, ինչ OmniRoute-ը, և հաղորդակցվում են loopback-ի միջոցով։ --- @@ -27,37 +25,38 @@ API բանալիներով), ներկառուցված ծառայությունն --- -## 1. Ընդհանուր նկարագրություն +## 1. Ընդհանուր ակնարկ -### Ինչո՞ւ օգտագործել ներկառուցված ծառայություններ։ +### Ինչու՞ ներկառուցված ծառայություններ: -Ներկառուցված է հինգ ծառայություն՝ +Ներկառուցված են վեց ծառայություններ. -| Ծառայություն | npm փաթեթ | Լռելյայն պորտ | Նպատակ | -| --------------- | ---------------------------------------------- | :-----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **9Router** | `9router` | 20130 | AI երթուղիչ, որը OmniRoute-ը կարող է օգտագործել որպես ենթամատակարար։ Մոդելները հասանելի են որպես `9router/{sub}/{model}` | -| **CLIProxyAPI** | GitHub թողարկման բինար ֆայլ (`cliproxy`) | 8317 | Տեղային պրոքսի ադապտեր Anthropic CLI նույնականացման հոսքերի համար։ Ապահովում է պահուստային երթուղավորում, երբ OAuth նշանների վավերականության ժամկետը լրանում է | -| **Mux** | `mux` (առանց գրաֆիկական միջերեսի `mux server`) | 8322 | Տեղային գործակալների նվագախմբման դև (coder/mux)։ Միայն կենսափուլի կառավարմամբ՝ երթուղավորման թիրախ չէ (LLM պրոքսավորում չկա)։ | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI դարպասի վերահաղորդման հետին համակարգ։ Աշխատելիս ինքնաշխատ ընտրվում է վերահաղորդման երթուղու (`/v1/relay/`) կողմից | -| **Dario** | `@askalf/dario` | 3456 | Claude բաժանորդագրության պրոքսի՝ CLIProxyAPI-ի այլընտրանք/պահուստային տարբերակ Claude-Code ձևաչափով տրաֆիկի համար․ ներարկված բանալին դառնում է `DARIO_ADMIN_TOKEN`՝ սահմանափակելով դրա `/admin/*` OAuth կառավարման հարթակի հասանելիությունը | +| Ծառայություն | npm փաթեթ | Լռելյայն պորտ | Նպատակ | +| --------------- | ---------------------------------- | :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | AI երթուղիչ, որը OmniRoute-ը կարող է օգտագործել որպես ենթապրովայդեր: Մոդելները հասանելի են որպես `9router/{sub}/{model}` | +| **CLIProxyAPI** | GitHub release binary (`cliproxy`) | 8317 | Տեղական պրոքսի ադապտեր Anthropic CLI նույնականացման հոսքերի համար: Ապահովում է պահեստային երթուղի, երբ OAuth թոքենները ժամկետանց են լինում: | +| **Mux** | `mux` (headless `mux server`) | 8322 | Տեղական գործակալ-կազմակերպման դեմոն (coder/mux): Կյանքի ցիկլը կառավարվում է միայն՝ երթուղիչի թիրախ չէ (առանց LLM պրոքսիացիայի): | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Go AI-դարպասի ռելեի բեքենդ: Գործարկման ժամանակ ավտոմատ կերպով ընտրվում է ռելեի երթուղու կողմից (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Claude-բաժանորդագրության պրոքսի՝ այլընտրանք/անսարքության դեպքում անցում CLIProxyAPI-ին Claude-Code-ի տեսքով տրաֆիկի համար. ներարկված բանալին դառնում է `DARIO_ADMIN_TOKEN`, որը սահմանափակում է նրա `/admin/*` OAuth կառավարման հարթակը: | +| **open-wa** | `@open-wa/wa-automate` | 8323 | WhatsApp Web ավտոմատացում (անգլուխ Chromium՝ Puppeteer-ի միջոցով): Կյանքի ցիկլը կառավարվում է միայն՝ երթուղիչի թիրախ չէ: | -Բոլոր հինգը հետևում են վերահսկման նույն մոդելին՝ +Բոլոր վեցը հետևում են նույն վերահսկողական մոդելին. -- OmniRoute-ը դրանք տեղադրում է `DATA_DIR/services/{name}/` պանակում (մեկուսացված OmniRoute-ի սեփական `package.json`-ից) -- OmniRoute-ը դրանք գործարկում և վերահսկում է որպես ենթագործընթացներ -- OmniRoute-ը ժամանակավոր API բանալի է ներարկում ենթագործընթացի միջավայր և փոխարինում է այն առանց աշխատանքի ընդհատման (կիրառելի դեպքերում) -- Կառավարման բոլոր երթուղիները (`/api/services/*`) **LOCAL_ONLY** են՝ հասանելի են միայն loopback-ից (խիստ կանոն #17) +- OmniRoute-ը դրանք տեղադրում է `DATA_DIR/services/{name}/` տակ (մեկուսացված OmniRoute-ի սեփական `package.json`-ից) +- OmniRoute-ը գործարկում և վերահսկում է դրանք որպես ենթապրոցեսներ +- OmniRoute-ը ժամանակավոր API բանալի է ներարկում ենթապրոցեսի միջավայր և պտտում է այն առանց ընդհատումների (որտեղ կիրառելի է) +- Բոլոր կառավարման երթուղիները (`/api/services/*`) **ՄԻԱՅՆ ՏԵՂԱԿԱՆ ԵՆ** — հասանելի են միայն լուփբեքից (խիստ կանոն #17) -### Հիմնական որոշումներ (նախագծման պլանից) +### Հիմնական որոշումներ (դիզայնի պլանից) -| Որոշում | Արժեք | -| --------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -| 9Router-ի բնիկ UI-ի հասանելիությունը կառավարման վահանակից | Հակադարձ պրոքսի՝ `/dashboard/providers/services/9router/embed/*` հասցեում | -| Տեղադրման մեխանիզմ | `npm install {package}`՝ `execFile`-ի միջոցով (առանց shell միջարկման) | -| Օգտագործման ռեժիմ | Մատակարարը երթուղավորման շարժիչում գրանցված է որպես `9router/{sub}/{model}` | -| API բանալիների կառավարում | OmniRoute-ը ստեղծում, գաղտնագրում է պահպանման ժամանակ (AES-256-GCM) և ներարկում env-ի միջոցով | -| Կառավարման վահանակի գտնվելու վայրը | `/dashboard/providers/services` (երեք ներդիր) | -| Ինքնագործարկում | Փոխարկիչ յուրաքանչյուր ծառայության համար, լռելյայն՝ OFF | +| Որոշում | Արժեք | +| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| Կառավարման վահանակի մուտք 9Router-ի բնիկ UI-ին | Հակադարձ պրոքսի `/dashboard/providers/services/9router/embed/*` հասցեում | +| Տեղադրման մեխանիզմ | ``npm install {package}`՝ `execFile`-ի միջոցով (առանց shell-ի ինտերպոլյացիայի)`` | +| Սպառման ռեժիմ | Պրովայդերը գրանցված է որպես `9router/{sub}/{model}` երթուղիչի շարժիչում | +| API բանալիների կառավարում | OmniRoute-ը ստեղծում, կոդավորում է պահեստավորման ժամանակ (AES-256-GCM) և ներարկում է միջավայրի միջոցով | +| Կառավարման վահանակի գտնվելու վայրը | `/dashboard/providers/services` (երեք ներդիր) | +| Ավտոմատ մեկնարկ | Միացնել/անջատել յուրաքանչյուր ծառայության համար, լռելյայն ԱՆՋԱՏՎԱԾ է | --- @@ -65,12 +64,12 @@ API բանալիներով), ներկառուցված ծառայությունն ``` ┌────────────────────────────────────────────────────────────────────┐ -│ Շերտ 1 — UI │ -│ /dashboard/providers/services (ներդիրներ՝ CLIProxyAPI | 9Router | Mux)│ -│ Ուղիղ մատյաններ (SSE), Գործարկել/Կանգնեցնել/Վերագործարկել/Թարմացնել, Կարգավորումներ, Տեղադրել│ +│ Շերտ 1 — Միջերես │ +│ /dashboard/providers/services (tabs: CLIProxyAPI | 9Router | Mux)│ +│ Ուղիղ մուտքեր (SSE), Մեկնարկ/Դադարեցում/Վերագործարկում/Թարմացում, Կարգավորումներ, Տեղադրում │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Կաղապար + ներդիրների երթուղավորում՝ ըստ ?tab=│ +│ ├── page.tsx Շել + ներդիրների երթուղի ?tab=-ով │ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -78,7 +77,7 @@ API բանալիներով), ներկառուցված ծառայությունն └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP (Next.js fetch) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Շերտ 2 — API (LOCAL_ONLY — միայն loopback) │ +│ Շերտ 2 — API (LOCAL_ONLY — միայն լուփբեք) │ │ │ │ /api/services/9router/{install|start|stop|restart|update| │ │ rotate-key|status|auto-start|logs} │ @@ -87,72 +86,71 @@ API բանալիներով), ներկառուցված ծառայությունն │ /api/services/mux/{install|start|stop|restart|update| │ │ status|auto-start|logs} │ │ /dashboard/providers/services/9router/embed/[...path] │ -│ (հակադարձ HTTP + WebSocket proxy → 9Router upstream) │ +│ (հակադարձ HTTP + WebSocket պրոքսի → 9Router վերին հոսք) │ │ │ -│ Դարպաս՝ LOCAL_ONLY_API_PREFIXES-ը ներառում է "/api/services/" և │ +│ Դարպաս. LOCAL_ONLY_API_PREFIXES-ը ներառում է "/api/services/" և │ │ "/dashboard/providers/services/*/embed/" │ └──────────────────────┬─────────────────────────────────────────────┘ - │ գործընթացի ներսում կանչեր + │ in-process calls ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Շերտ 3 — ServiceSupervisor (src/lib/services/) │ +│ Շերտ 3 — ServiceSupervisor (src/lib/services/) │ │ │ -│ ServiceSupervisor.ts Ընդհանուր վերահսկիչ (child_process.spawn) │ -│ ├── տեղադրում՝ execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── գործարկում՝ spawn(node, [entrypoint], {env, cwd}) │ -│ ├── api_key՝ crypto.randomBytes(32) → env NINEROUTER_API_KEY │ -│ ├── պորտ՝ 20130՝ 9Router-ի համար (կարգավորելի) │ -│ ├── մատյաններ՝ stdio օղակաձև բուֆեր՝ 5 MB → SSE իրադարձություններ│ -│ ├── առողջություն՝ HTTP GET /health յուրաքանչյուր 2–5 վրկ., ծույլ վերականգնում│ -│ └── կենսացիկլ՝ SIGTERM 15 վրկ. → SIGKILL │ +│ ServiceSupervisor.ts Ընդհանուր վերահսկիչ (child_process.spawn) │ +│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ +│ ├── port: 20130 9Router-ի համար (կարգավորելի) │ +│ ├── logs: stdio օղակաձև բուֆեր 5 ՄԲ → SSE իրադարձություններ │ +│ ├── health: HTTP GET /health յուրաքանչյուր 2–5 վրկ, ծույլ վերականգնում │ +│ └── lifecycle: SIGTERM 15 s → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ -│ bootstrap.ts Գործընթացի մեկնարկին նախապատրաստում է բոլոր SERVICES[]-ը│ +│ bootstrap.ts Գործարկում է բոլոր SERVICES[]-ը պրոցեսի մեկնարկին │ │ apiKey.ts getOrCreateApiKey(), generateServiceApiKey() │ -│ modelSync.ts Պարբերական GET /v1/models → service_models աղյուսակ│ -│ ringBuffer.ts Օղակաձև մատյանային բուֆեր (5 MB յուրաքանչյուր ծառայության համար)│ -│ healthCheck.ts Պարբերական HTTP առողջության ստուգում │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ -│ (տեղադրիչի ադապտերներ) │ +│ modelSync.ts Պարբերական GET /v1/models → service_models աղյուսակ │ +│ ringBuffer.ts Շրջանաձև մուտքերի բուֆեր (5 ՄԲ յուրաքանչյուր ծառայության համար) │ +│ healthCheck.ts Հարցումային HTTP առողջության ստուգում │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ +│ (տեղադրողի ադապտերներ) │ └──────────────────────┬─────────────────────────────────────────────┘ - │ OpenAI-համատեղելի HTTP (loopback) + │ OpenAI-compatible HTTP (loopback) ┌──────────────────────▼─────────────────────────────────────────────┐ -│ Շերտ 4 — Մատակարար / Երթուղավորում │ +│ Շերտ 4 — Պրովայդեր / Երթուղավորում │ │ │ -│ open-sse/executors/ninerouter.ts │ -│ Յուրաքանչյուր հարցման համար կրկին որոնում է պորտը և API բանալին (առանց քեշավորման)։│ -│ Proxy-ավորումից առաջ մոդելի id-ից հեռացնում է "9router/" նախածանցը։│ -│ Վերադարձնում է 503 service_not_running, եթե վերահսկիչը "running" վիճակում չէ։│ +│ open-sse/executors/ninerouter.ts │ +│ Յուրաքանչյուր հարցման համար նորից փնտրում է պորտը և API բանալին (առանց քեշավորման): │ +│ Հեռացնում է "9router/" նախածանցը մոդելի ID-ից՝ նախքան պրոքսիացումը: │ +│ Վերադարձնում է 503 service_not_running, եթե վերահսկիչը "running" վիճակում չէ: │ │ │ │ src/shared/constants/providers.ts │ -│ "9router"-ի գրառում՝ isEmbeddedService: true │ +│ Մուտք "9router"-ի համար. isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ -│ Մոդելները պահվում են որպես "9router/{sub}/{model}" (նախածանցով)։│ -│ modelSync.ts-ի միջոցով համաժամացվում են յուրաքանչյուր 5 րոպեն մեկ։│ +│ Մոդելները պահվում են որպես "9router/{sub}/{model}" (նախածանցով): │ +│ Համաժամեցվում է յուրաքանչյուր 5 րոպեն մեկ modelSync.ts-ի կողմից: │ │ │ -│ Mux-ի համար կառավարվում է ՄԻԱՅՆ կենսացիկլը (Շերտեր 1-3) — այն գործակալների│ -│ համակարգման daemon է, ոչ թե LLM proxy, ուստի չունի Շերտ 4-ի │ -│ executor/provider գրառում և երբեք երթուղավորման թիրախ չէ։ │ +│ Mux-ը կառավարվում է միայն կյանքի ցիկլով (Շերտեր 1-3) — այն գործակալների կառավարման դեմոն է, ոչ թե LLM պրոքսի, ուստի այն չունի Շերտ 4-ի կատարողի/պրովայդերի մուտք և երբեք երթուղավորման թիրախ չէ: │ └────────────────────────────────────────────────────────────────────┘ ``` -### Հիմնական սկզբնաղբյուր ֆայլեր +### Հիմնական աղբյուրի ֆայլեր -| Ֆայլ | Դեր | -| ------------------------------------------- | ----------------------------------------------------------------- | -| `src/lib/services/ServiceSupervisor.ts` | Հիմնական դաս՝ կենսացիկլ, կողպում, առողջական վիճակ, օղակաձև բուֆեր | -| `src/lib/services/bootstrap.ts` | Գործընթացի մակարդակի գրանցում և ավտոմատ մեկնարկ | -| `src/lib/services/registry.ts` | Սինգլտոն քարտեզ՝ `tool → supervisor` | -| `src/lib/services/apiKey.ts` | Բանալու գեներացում, AES-256-GCM գաղտնագրում՝ պահպանման ժամանակ | -| `src/lib/services/modelSync.ts` | Մոդելների պարբերական համաժամացում (5 րոպե) + ըստ պահանջի | -| `src/lib/services/ringBuffer.ts` | 5 ՄԲ ծավալով օղակաձև մատյանային բուֆեր՝ SSE բաժանորդագրությամբ | -| `src/lib/services/healthCheck.ts` | HTTP առողջական վիճակի ստուգում (կարգավորվող ընդմիջում) | -| `src/lib/services/installers/ninerouter.ts` | 9Router-ի npm տեղադրում/թարմացում/հեռացում | -| `src/lib/services/installers/cliproxy.ts` | CLIProxyAPI-ի npm տեղադրում/թարմացում/հեռացում | -| `src/lib/services/installers/mux.ts` | Mux-ի npm տեղադրում/թարմացում/հեռացում | -| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` օժանդակ ֆունկցիա | -| `src/app/api/services/[name]/logs/route.ts` | Համօգտագործվող SSE մատյանների վերջնակետ | -| `open-sse/executors/ninerouter.ts` | Մատակարարի կատարիչ (Շերտ 4) | +| File | Role | +| ------------------------------------------- | --------------------------------------------------------------- | +| `src/lib/services/ServiceSupervisor.ts` | Հիմնական դաս՝ կյանքի ցիկլ, կողպեք, առողջություն, օղակաձև բուֆեր | +| `src/lib/services/bootstrap.ts` | Գործընթացի մակարդակի գրանցում և ավտոմատ մեկնարկ | +| `src/lib/services/registry.ts` | Սինգլտոն քարտեզ `գործիք → վերահսկիչ` | +| `src/lib/services/apiKey.ts` | Բանալու ստեղծում, AES-256-GCM կոդավորում հանգիստ վիճակում | +| `src/lib/services/modelSync.ts` | Պարբերական մոդելի համաժամացում (5 րոպե) + ըստ պահանջի | +| `src/lib/services/ringBuffer.ts` | 5 ՄԲ օղակաձև մուտքի բուֆեր՝ SSE բաժանորդագրությամբ | +| `src/lib/services/healthCheck.ts` | HTTP առողջության զոնդ (կարգավորվող ինտերվալ) | +| `src/lib/services/installers/ninerouter.ts` | npm տեղադրում/թարմացում/հեռացում 9Router-ի համար | +| `src/lib/services/installers/cliproxy.ts` | npm տեղադրում/թարմացում/հեռացում CLIProxyAPI-ի համար | +| `src/lib/services/installers/mux.ts` | npm տեղադրում/թարմացում/հեռացում Mux-ի համար | +| `src/lib/services/installers/openwa.ts` | npm տեղադրում/թարմացում/հեռացում open-wa-ի համար | +| `src/app/api/services/9router/_lib.ts` | `getOrInitSupervisor()` օգնական | +| `src/app/api/services/[name]/logs/route.ts` | Ընդհանուր SSE մուտքերի վերջնակետ | +| `open-sse/executors/ninerouter.ts` | Պրովայդերի կատարող (Շերտ 4) | --- @@ -208,56 +206,56 @@ API բանալիներով), ներկառուցված ծառայությունն ## 4. API տեղեկատու -`/api/services/`-ի ներքո գտնվող բոլոր երթուղիները **LOCAL_ONLY** են (միայն loopback, խիստ կանոն #17)։ -Ոչ loopback հարցումները ստանում են `403 LOCAL_ONLY`՝ անկախ վավերացման թոքենից։ +Բոլոր երթուղիները `/api/services/` հասցեի տակ հանդիսանում են **LOCAL_ONLY** (միայն loopback, խիստ կանոն #17): +Ոչ loopback հարցումները ստանում են `403 LOCAL_ONLY`՝ անկախ նույնականացման թոքենից: -### 4.1 9Router-ի վերջնակետեր (11 երթուղի) +### 4.1 9Router վերջնակետեր (11 երթուղի) #### `POST /api/services/9router/install` -Տեղադրում է 9Router-ը npm-ից։ Ստեղծում է `DATA_DIR/services/9router/`՝ իր սեփական -`package.json`-ով և `node_modules/`-ով։ Չի հակասում OmniRoute-ի սեփական կախվածություններին։ +Տեղադրել 9Router-ը npm-ից: Ստեղծում է `DATA_DIR/services/9router/` թղթապանակը իր սեփական +`package.json` և `node_modules/` ֆայլերով: Չի հակասում OmniRoute-ի սեփական կախվածություններին (deps): -**Հարցման մարմին** (բոլոր դաշտերը կամընտիր են)․ +**Հարցման մարմին** (բոլորը կամընտիր). ```json { "version": "latest" } ``` -| Դաշտ | Տեսակ | Լռելյայն | Նկարագրություն | -| --------- | -------- | ---------- | ---------------------------------------- | -| `version` | `string` | `"latest"` | տեղադրվելիք npm տարբերակի թեգ կամ semver | +| Դաշտ | Տիպ | Լռելյայն | Նկարագրություն | +| --------- | -------- | ---------- | -------------------------------------------- | +| `version` | `string` | `"latest"` | npm տարբերակի թեգ կամ semver տեղադրման համար | -**Պատասխաններ․** +**Պատասխաններ.** -| Կարգավիճակ | Նկարագրություն | -| ---------- | -------------------------------------------------------- | -| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | -| `400` | Անվավեր հարցման մարմին (Zod վավերացման ձախողում) | -| `409` | Արդեն տեղադրվում է (կողպեքը զբաղված է) | -| `500` | npm տեղադրումը ձախողվել է — պարզ սխալը տես `message`-ում | +| Կարգավիճակ | Նկարագրություն | +| ---------- | --------------------------------------------------------- | +| `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | +| `400` | Հարցման անվավեր մարմին (Zod վալիդացման ձախողում) | +| `409` | Արդեն տեղադրվում է (lock-ը զբաղված է) | +| `500` | npm install-ը ձախողվեց — տես `message`-ը պարզ սխալի համար | -**Նշումներ․** Օգտագործում է `execFile('npm', [...])`՝ առանց shell-ի և ինտերպոլյացիայի (խիստ կանոն #13)։ -EACCES սխալները ներկայացվում են հասկանալի հաղորդագրությունների տեսքով։ +**Նշումներ.** Օգտագործում է `execFile('npm', [...])` — առանց shell-ի, առանց ինտերպոլյացիայի (խիստ կանոն #13): +EACCES սխալները ներկայացվում են որպես հասկանալի հաղորդագրություններ: --- #### `POST /api/services/9router/start` -Գործարկում է 9Router-ը։ Գրանցում է վերահսկիչ, եթե այն դեռ գրանցված չէ, ապա կանչում է -`supervisor.start()`։ Իդեմպոտենտ է, երբ արդեն աշխատում է։ +Գործարկել 9Router-ը: Գրանցում է supervisor, եթե այն դեռ գրանցված չէ, ապա կանչում է +`supervisor.start()`: Իդեմպոտենտ է, եթե արդեն աշխատում է: -**Հարցման մարմին․** չկա +**Հարցման մարմին.** չկա -**Պատասխաններ․** +**Պատասխաններ.** -| Կարգավիճակ | Նկարագրություն | -| ---------- | ------------------------------------------------------ | -| `200` | `ServiceStatus` օբյեկտ (տես ստորև բերված սխեման) | -| `409` | 9Router-ը տեղադրված չէ (`status: "not_installed"`) | -| `503` | Մեկնարկը ձախողվել է (գործընթացի սխալ՝ տես `lastError`) | +| Կարգավիճակ | Նկարագրություն | +| ---------- | ----------------------------------------------------- | +| `200` | `ServiceStatus` օբյեկտ (տես սխեման ստորև) | +| `409` | 9Router-ը տեղադրված չէ (`status: "not_installed"`) | +| `503` | Գործարկումը ձախողվեց (պրոցեսի սխալ — տես `lastError`) | -**ServiceStatus սխեմա․** +**ServiceStatus սխեմա.** ```json { @@ -275,84 +273,82 @@ EACCES սխալները ներկայացվում են հասկանալի հաղ #### `POST /api/services/9router/stop` -Կոկիկ կերպով կանգնեցնում է 9Router-ը։ Ուղարկում է SIGTERM, սպասում 15 վ, ապա ուղարկում -SIGKILL, եթե գործընթացը դեռ գործում է։ Իդեմպոտենտ է, երբ արդեն կանգնեցված է։ +Բարեհամբույր կերպով կանգնեցնել 9Router-ը: Ուղարկում է SIGTERM, սպասում 15 վայրկյան, ապա SIGKILL, եթե դեռ ակտիվ է: +Իդեմպոտենտ է, եթե արդեն կանգնեցված է: -**Հարցման մարմին․** չկա +**Հարցման մարմին.** չկա -**Պատասխաններ․** +**Պատասխաններ.** -| Կարգավիճակ | Նկարագրություն | -| ---------- | ------------------------------------ | -| `200` | `ServiceStatus` (`state: "stopped"`) | -| `503` | Կանգնեցումն անսպասելիորեն ձախողվել է | +| Կարգավիճակ | Նկարագրություն | +| ---------- | ---------------------------------- | +| `200` | `ServiceStatus` (state: "stopped") | +| `503` | Կանգնեցումը անսպասելիորեն ձախողվեց | --- #### `POST /api/services/9router/restart` -Համարժեք է գործողությունների կողպեքի ներքո նախ `stop()`, ապա `start()` կանչելուն։ +Համարժեք է `stop()`-ին, որին հաջորդում է `start()`-ը գործողության lock-ի տակ: -**Հարցման մարմին․** չկա +**Հարցման մարմին.** չկա -**Պատասխաններ․** նույնն են, ինչ `start`-ի համար (վերադարձնում է վերջնական `ServiceStatus`-ը)։ +**Պատասխաններ.** նույնն են, ինչ `start`-ի դեպքում (վերադարձնում է վերջնական `ServiceStatus`): --- #### `POST /api/services/9router/update` -Թարմացնում է 9Router-ը՝ npm-ի ավելի նոր տարբերակի։ Եթե ծառայությունն աշխատում է, այն նախ -կանգնեցվում է, կատարվում է npm տեղադրում (ավելի նոր տարբերակը տեղում տեղադրելով), ապա -ծառայությունը վերագործարկվում է։ +Թարմացնում է 9Router-ը npm-ի ավելի նոր տարբերակի: Եթե ծառայությունն աշխատում է, այն նախ կանգնեցվում է, +կատարվում է npm install (տեղում տեղադրելով նոր տարբերակը), ապա ծառայությունը վերագործարկվում է: -**Հարցման մարմին** (բոլոր դաշտերը կամընտիր են)․ +**Հարցման մարմին** (բոլորը կամընտիր). ```json { "version": "latest" } ``` -**Պատասխաններ․** +**Պատասխաններ.** | Կարգավիճակ | Նկարագրություն | | ---------- | --------------------------------------------------------------- | | `200` | `{ ok: true, previousVersion: "...", installedVersion: "..." }` | | `400` | Անվավեր մարմին | -| `500` | npm թարմացումը ձախողվել է | +| `500` | npm update-ը ձախողվեց | --- #### `POST /api/services/9router/rotate-key` -Ստեղծում է նոր API բանալի 9Router-ի համար, կոդավորում է այն պահպանման վիճակում և վերագործարկում է ծառայությունը -(եթե այն աշխատում է), որպեսզի ծառայությունն իր միջավայրից ստանա նոր բանալին։ Հին բանալին -անմիջապես անվավեր է դառնում։ +Ստեղծում է նոր API բանալի 9Router-ի համար, վերջինս պահպանման պահին վերծանում է և վերագործարկում ծառայությունը +(եթե այն աշխատում է), որպեսզի այն վերցնի նոր բանալին իր միջավայրից: Հին բանալին անմիջապես անվավեր է դառնում: -**Հարցման մարմին՝** չկա +**Հարցման մարմին.** չկա -**Պատասխաններ՝** +**Պատասխաններ.** | Կարգավիճակ | Նկարագրություն | | ---------- | ------------------------------------------ | | `200` | `{ keyRotated: true, restarted: boolean }` | -| `500` | Պտտումը ձախողվեց | +| `500` | Ռոտացիան ձախողվեց | -**Անվտանգություն՝** Նոր բանալին երբեք չի վերադարձվում պատասխանում (հավատարմագրերի արտահոսք չկա)։ -Այն պահվում է կոդավորված ձևով (AES-256-GCM)՝ `version_manager` աղյուսակում։ +**Անվտանգություն.** Նոր բանալին երբեք չի վերադարձվում պատասխանի մեջ (հավատարմագրերի արտահոսք չկա): +Այն պահվում է կոդավորված (AES-256-GCM) `version_manager` աղյուսակում: --- #### `GET /api/services/9router/status` -Վերադարձնում է համակցված ընթացիկ + DB կարգավիճակը՝ ներառյալ տարբերակի մետատվյալները և API բանալու նախադիտումը։ +Վերադարձնում է համակցված live + DB կարգավիճակը՝ ներառյալ տարբերակի մետատվյալները և API բանալու նախադիտումը: -**Պատասխաններ՝** +**Պատասխաններ.** | Կարգավիճակ | Նկարագրություն | | ---------- | ------------------------------- | -| `200` | Տե՛ս ստորև բերված սխեման | +| `200` | Տես սխեման ստորև | | `500` | Կարգավիճակի ընթերցումը ձախողվեց | -**Պատասխանի սխեմա՝** +**Պատասխանի սխեմա.** ```json { @@ -376,16 +372,16 @@ SIGKILL, եթե գործընթացը դեռ գործում է։ Իդեմպոտե #### `POST /api/services/9router/auto-start` -Փոխարկում է ավտոմեկնարկի դրոշակը։ Երբ `enabled: true`, ծառայությունն ավտոմատ մեկնարկում է -OmniRoute-ի հաջորդ գործարկման ժամանակ (եթե ծառայությունը տեղադրված է)։ +Փոխում է ավտոմատ գործարկման (auto-start) դրոշակը: Երբ `enabled: true` է, ծառայությունը ավտոմատ կերպով կմեկնարկի +հաջորդ անգամ OmniRoute-ի բեռնման ժամանակ (եթե ծառայությունը տեղադրված է): -**Հարցման մարմին՝** +**Հարցման մարմին.** ```json { "enabled": true } ``` -**Պատասխաններ՝** +**Պատասխաններ.** | Կարգավիճակ | Նկարագրություն | | ---------- | --------------------- | @@ -396,24 +392,24 @@ OmniRoute-ի հաջորդ գործարկման ժամանակ (եթե ծառայ #### `GET /api/services/9router/logs` -9Router-ի stdout/stderr օղակաձև բուֆերից ընթացիկ գրանցամատյանների SSE հոսք։ +SSE հոսք 9Router-ի stdout/stderr ring buffer-ի իրական ժամանակի լոգերից: -**Հարցման պարամետրեր՝** +**Հարցման պարամետրեր.** -| Պարամետր | Տեսակ | Լռելյայն | Նկարագրություն | -| -------- | --------- | -------- | -------------------------------------------------------------------------------------------- | -| `tail` | `integer` | 200 | Սկզբում ուղարկվող պատմական տողերի քանակը (առավելագույնը՝ 1000) | -| `filter` | `string` | չկա | Մեծատառ/փոքրատառից անկախ ենթատողի զտիչ (առանց կանոնավոր արտահայտության՝ պաշտպանված ReDoS-ից) | +| Պարամետր | Տիպ | Լռելյայն | Նկարագրություն | +| -------- | --------- | -------- | --------------------------------------------------------------- | +| `tail` | `integer` | 200 | Քանի պատմական տող ուղարկել սկզբում (առավելագույնը 1000) | +| `filter` | `string` | չկա | Ոչ ռեգիստրազգայուն ենթատողի ֆիլտր (առանց regex — ReDoS-անվտանգ) | -**SSE իրադարձություններ՝** +**SSE իրադարձություններ.** -| Իրադարձություն | Տվյալներ | Նկարագրություն | -| -------------- | ----------- | ------------------------------------------ | -| `snapshot` | `LogLine[]` | Սկզբնական պատմական վերջնամաս | -| `log` | `LogLine` | Ընթացիկ գրանցամատյանի տող | -| `heartbeat` | `{}` | Կապի պահպանում՝ յուրաքանչյուր 15 վրկ-ը մեկ | +| Իրադարձություն | Տվյալներ | Նկարագրություն | +| -------------- | ----------- | ----------------------------- | +| `snapshot` | `LogLine[]` | Նախնական պատմական վերջնամաս | +| `log` | `LogLine` | Իրական ժամանակի լոգի տող | +| `heartbeat` | `{}` | Keep-alive յուրաքանչյուր 15 վ | -**LogLine սխեմա՝** +**LogLine սխեմա.** ```json { @@ -423,7 +419,7 @@ OmniRoute-ի հաջորդ գործարկման ժամանակ (եթե ծառայ } ``` -**Պատասխաններ՝** +**Պատասխաններ.** | Կարգավիճակ | Նկարագրություն | | ---------- | ------------------------------------------------ | @@ -433,103 +429,121 @@ OmniRoute-ի հաջորդ գործարկման ժամանակ (եթե ծառայ --- -### 4.2 CLIProxyAPI-ի վերջնակետերը (10 երթուղի) +### 4.2 CLIProxyAPI վերջնակետեր (10 երթուղի) -CLIProxyAPI-ն ունի վերջնակետերի նույն կառուցվածքը, ինչ 9Router-ը՝ բացառությամբ `rotate-key`-ի, և հավելյալ -`accounts`, `provider-expose` ու `auto-restart-adopted` վերջնակետերով։ Այժմ գործարկման պահին այն ստանում է -տվյալների հարթության հատուկ API բանալի (`needsApiKey: true`՝ -`bootstrap.ts`-ում, որն օգտագործվում է մոդելների համաժամացման համար)։ `status`-ը ներառում է ավելի քիչ դաշտեր։ +CLIProxyAPI-ն ունի նույն վերջնակետի ձևը, ինչ 9Router-ը, բացի `rotate-key`-ից, գումարած +`accounts`, `provider-expose` և `auto-restart-adopted`: Այն այժմ ստանում է +նվիրված տվյալների հարթակի API բանալի, որը ներարկվում է գործարկման ժամանակ (`needsApiKey: true` +`bootstrap.ts`-ում, օգտագործվում է մոդելի համաժամացման համար); `status`-ը ներառում է ավելի քիչ դաշտեր: -| Մեթոդ | Ուղի | Նկարագրություն | -| ------ | ----------------------------------- | ------------------------------------------------ | -| `POST` | `/api/services/cliproxy/install` | Տեղադրել CLIProxyAPI-ն npm-ից | -| `POST` | `/api/services/cliproxy/start` | Մեկնարկել CLIProxyAPI-ն | -| `POST` | `/api/services/cliproxy/stop` | Կանգնեցնել CLIProxyAPI-ն | -| `POST` | `/api/services/cliproxy/restart` | Վերագործարկել CLIProxyAPI-ն | -| `POST` | `/api/services/cliproxy/update` | Թարմացնել ավելի նոր տարբերակի | -| `GET` | `/api/services/cliproxy/status` | Ընթացիկ + DB կարգավիճակ (առանց `apiKeyMasked`-ի) | -| `POST` | `/api/services/cliproxy/auto-start` | Փոխարկել ավտոմեկնարկը | +| Մեթոդ | Ուղի | Նկարագրություն | +| ------ | ----------------------------------- | ---------------------------------------------- | +| `POST` | `/api/services/cliproxy/install` | Տեղադրել CLIProxyAPI-ը npm-ից | +| `POST` | `/api/services/cliproxy/start` | Մեկնարկել CLIProxyAPI-ը | +| `POST` | `/api/services/cliproxy/stop` | Դադարեցնել CLIProxyAPI-ը | +| `POST` | `/api/services/cliproxy/restart` | Վերագործարկել CLIProxyAPI-ը | +| `POST` | `/api/services/cliproxy/update` | Թարմացնել ավելի նոր տարբերակին | +| `GET` | `/api/services/cliproxy/status` | Կենդանի + ՏԲ կարգավիճակ (առանց `apiKeyMasked`) | +| `POST` | `/api/services/cliproxy/auto-start` | Միացնել/անջատել ավտոմատ մեկնարկը | -Ընդհանուր `GET /api/services/{name}/logs` վերջնակետն (տե՛ս §4.1) աշխատում է բոլոր -չորս ծառայությունների համար՝ օգտագործելով `[name]` դինամիկ հատվածը։ +Ընդհանուր `GET /api/services/{name}/logs` վերջնակետը (տես §4.1) աշխատում է բոլոր +չորս ծառայությունների համար՝ օգտագործելով `[name]` դինամիկ հատվածը: --- -### 4.3 Mux-ի վերջնակետերը (8 երթուղի) +### 4.3 Mux վերջնակետեր (8 երթուղի) -Mux-ն ունի վերջնակետերի նույն կառուցվածքը, ինչ CLIProxyAPI-ն. API -մակերեսում `rotate-key` երթուղի չկա (կրողի թոքենը ստեղծվում է նույն եղանակով, ինչ 9Router-ինը՝ -`getOrCreateApiKey("mux")`-ի միջոցով, և ներդրվում է `MUX_SERVER_AUTH_TOKEN` միջավայրի փոփոխականի միջոցով, սակայն -առանձին պտտման վերջնակետ դեռ չկա)։ Mux-ը կառավարվում է միայն կենսացիկլի մակարդակում. ի տարբերություն -9Router-ի՝ այն չունի 4-րդ շերտի կատարիչ և երբեք չի գրանցվում որպես երթուղավորման մատակարար։ +Mux-ն ունի նույն վերջնակետի ձևը, ինչ CLIProxyAPI-ն՝ API-ի մակերեսում `rotate-key` երթուղի չկա +(կրող թոքենը ստեղծվում է նույն կերպ, ինչ 9Router-ի միջոցով +`getOrCreateApiKey("mux")` և ներարկվում է `MUX_SERVER_AUTH_TOKEN` միջավայրի փոփոխականի միջոցով, բայց +դեռևս նվիրված ռոտացիայի վերջնակետ չկա): Mux-ը միայն կյանքի ցիկլով է կառավարվում. ի տարբերություն +9Router-ի, այն չունի Շերտ 4-ի կատարող և երբեք չի գրանցվում որպես երթուղային մատակարար: | Մեթոդ | Ուղի | Նկարագրություն | | ------ | ------------------------------ | ----------------------------------- | | `POST` | `/api/services/mux/install` | Տեղադրել Mux-ը npm-ից (`npm i mux`) | | `POST` | `/api/services/mux/start` | Մեկնարկել Mux-ը (`mux server`) | -| `POST` | `/api/services/mux/stop` | Կանգնեցնել Mux-ը | +| `POST` | `/api/services/mux/stop` | Դադարեցնել Mux-ը | | `POST` | `/api/services/mux/restart` | Վերագործարկել Mux-ը | -| `POST` | `/api/services/mux/update` | Թարմացնել npm-ի ավելի նոր տարբերակի | -| `GET` | `/api/services/mux/status` | Ընթացիկ + DB կարգավիճակ | -| `POST` | `/api/services/mux/auto-start` | Փոխարկել ավտոմեկնարկը | +| `POST` | `/api/services/mux/update` | Թարմացնել ավելի նոր npm տարբերակին | +| `GET` | `/api/services/mux/status` | Կենդանի + ՏԲ կարգավիճակ | +| `POST` | `/api/services/mux/auto-start` | Միացնել/անջատել ավտոմատ մեկնարկը | --- -### 4.4 Bifrost-ի վերջնակետերը (8 երթուղի) +### 4.4 Bifrost վերջնակետեր (8 երթուղի) -Bifrost-ը Go-ով գրված AI-դարպասի վերահաղորդման հետնամաս է (`@maximhq/bifrost`)։ Այն օգտագործում է վերջնակետերի նույն -կառուցվածքը, ինչ CLIProxyAPI-ն (առանց `rotate-key`-ի. Bifrost-ն ինքն է կառավարում իր մատակարարների -բանալիները `config.json`-ում՝ իր `-app-dir`-ի ներքո)։ +Bifrost-ը Go AI-gateway ռելեի բեքենդ է (`@maximhq/bifrost`): Այն օգտագործում է նույն +վերջնակետի ձևը, ինչ CLIProxyAPI-ն (առանց `rotate-key` – Bifrost-ը կառավարում է իր սեփական մատակարարի +բանալիները `config.json`-ում իր `-app-dir`-ի ներքո): -| Մեթոդ | Ուղի | Նկարագրություն | -| ------ | ---------------------------------- | ------------------------------------------------------------------------ | -| `POST` | `/api/services/bifrost/install` | Տեղադրել Bifrost-ը npm-ից (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Գործարկել Bifrost-ը 8080 պորտում (լռելյայն) | -| `POST` | `/api/services/bifrost/stop` | Կանգնեցնել Bifrost-ը | -| `POST` | `/api/services/bifrost/restart` | Վերագործարկել Bifrost-ը | -| `POST` | `/api/services/bifrost/update` | Թարմացնել ավելի նոր տարբերակի | -| `GET` | `/api/services/bifrost/status` | Ընթացիկ + ՏԲ կարգավիճակ | -| `POST` | `/api/services/bifrost/auto-start` | Միացնել կամ անջատել ինքնագործարկումը | -| `GET` | `/api/services/bifrost/logs` | SSE մատյանի վերջնամաս (ընդհանուր `[name]/logs` դինամիկ երթուղու միջոցով) | +| Մեթոդ | Ուղի | Նկարագրություն | +| ------ | ---------------------------------- | ----------------------------------------------------------- | +| `POST` | `/api/services/bifrost/install` | Տեղադրել Bifrost-ը npm-ից (`@maximhq/bifrost`) | +| `POST` | `/api/services/bifrost/start` | Մեկնարկել Bifrost-ը 8080 պորտում (լռելյայն) | +| `POST` | `/api/services/bifrost/stop` | Դադարեցնել Bifrost-ը | +| `POST` | `/api/services/bifrost/restart` | Վերագործարկել Bifrost-ը | +| `POST` | `/api/services/bifrost/update` | Թարմացնել ավելի նոր տարբերակին | +| `GET` | `/api/services/bifrost/status` | Կենդանի + ՏԲ կարգավիճակ | +| `POST` | `/api/services/bifrost/auto-start` | Միացնել/անջատել ավտոմատ մեկնարկը | +| `GET` | `/api/services/bifrost/logs` | SSE լոգերի հետևում (միջոցով `[name]/logs` դինամիկ երթուղու) | -**Երթուղայնացման կապակցում․** Երբ `BIFROST_BASE_URL`-ը սահմանված չէ, իսկ վերահսկվող Bifrost -օրինակը գործարկված է, `getBifrostRoutingConfig()`-ը (`routingBackend.ts`-ում) ավտոմատ կերպով -օգտագործում է `http://127.0.0.1:{port}`-ը որպես ռելեի բազային URL։ Հստակ սահմանված `BIFROST_BASE_URL` միջավայրի -փոփոխականը միշտ գերակայություն ունի։ +**Երթուղային միացում.** Երբ `BIFROST_BASE_URL`-ը սահմանված չէ և վերահսկվող Bifrost +օրինակը աշխատում է, `getBifrostRoutingConfig()`-ը (`routingBackend.ts`-ում) ավտոմատ կերպով +օգտագործում է `http://127.0.0.1:{port}` որպես ռելեի հիմնական URL: Հստակ `BIFROST_BASE_URL` միջավայրի +փոփոխականը միշտ գերակայում է: --- -### 4.5 Dario-ի վերջնակետերը (12 երթուղի) +### 4.5 Dario վերջնակետեր (12 երթուղի) -Կենսացիկլի կառուցվածքը նույնն է, ինչ մյուս ծառայություններինը (`install`, `start`, `stop`, `restart`, -`update`, `status`, `auto-start`, `auto-restart-adopted`), ինչպես նաև թոքենով պաշտպանված OAuth -կառավարման հարթակ՝ `admin/`-ի ներքո՝ `admin/accounts`, `admin/import-from-omniroute`, -`admin/login-start`, `admin/login-complete` (բոլորը՝ `DARIO_ADMIN_TOKEN`-ով պաշտպանված)։ +Նույն կյանքի ցիկլի ձևը, ինչ մյուս ծառայությունները (`install`, `start`, `stop`, `restart`, +`update`, `status`, `auto-start`, `auto-restart-adopted`) գումարած թոքենով պաշտպանված OAuth +կառավարման հարթակ `admin/`-ի ներքո. `admin/accounts`, `admin/import-from-omniroute`, +`admin/login-start`, `admin/login-complete` (բոլորը `DARIO_ADMIN_TOKEN`-ի հետևում): -### 4.6 Հակադարձ պրոքսի (9Router-ի կառավարման վահանակի ներկառուցում) +### 4.6 open-wa վերջնակետեր (7 երթուղի) -Կառավարման վահանակը ներքին հակադարձ պրոքսիի միջոցով iframe-ի ներսում ներկառուցում է 9Router-ի վեբ միջերեսը՝ +open-wa (`@open-wa/wa-automate`) ղեկավարում է անգլուխ Chromium օրինակը (Puppeteer-ի միջոցով) +WhatsApp Web-ի ավտոմատացման համար: Այն օգտագործում է նույն վերջնակետի ձևը, ինչ Mux-ը (դեռևս `rotate-key` երթուղի չկա): Այն միայն կյանքի ցիկլով է կառավարվում՝ երթուղային թիրախ չէ, +Շերտ 4-ի կատարող/մատակարարի մուտք չկա: + +| Method | Path | Description | +| ------ | --------------------------------- | --------------------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Տեղադրել open-wa-ն npm-ից (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Միացնել open-wa-ն 8323 պորտում (լռելյայն) | +| `POST` | `/api/services/openwa/stop` | Անջատել open-wa-ն | +| `POST` | `/api/services/openwa/restart` | Վերագործարկել open-wa-ն | +| `POST` | `/api/services/openwa/update` | Թարմացնել ավելի նոր տարբերակի | +| `GET` | `/api/services/openwa/status` | Կենդանի + ՏԲ կարգավիճակ | +| `POST` | `/api/services/openwa/auto-start` | Միացնել/անջատել ավտոմատ մեկնարկը | +| `GET` | `/api/services/openwa/logs` | SSE լոգերի հետևում (ընդհանուր `[name]/logs` դինամիկ երթուղու միջոցով) | + +**API բանալի:** ներարկվում է որպես `WA_KEY` — open-wa-ի ընդհանուր `WA_*` նախածանցով միջավայրի վերագրումը այն քարտեզագրում է `--key`/`-k` CLI ընտրանքի վրա (`dist/cli/setup.js::envArgs()`, ստուգված տեղադրված 4.76.0 փաթեթի դեմ): Նախածանցված է `ow_` երբ ստեղծվում է `generateServiceApiKey()`-ի կողմից: open-wa-ն բանալին հետ է կարդում `key`/`api_key` HTTP հեդերից (ոչ `Authorization: Bearer`); `/api-docs*`-ը բացահայտորեն ազատված է ստուգումից (`setupAuthenticationLayer` `dist/cli/server.js`-ում), ուստի առողջության զոնդին անհրաժեշտ չէ աուտենտիֆիկացիայի հեդեր: + +**Զուգակցում:** open-wa-ն ոչ պաշտոնական է և կապ չունի WhatsApp-ի հետ — միացված համարը կրում է արգելքի ռիսկ WhatsApp-ի սեփական ավտոմատացման հայտնաբերումից: Առաջին մեկնարկի ժամանակ զուգակցման QR կոդը տպվում է stdout-ում և հայտնվում է գոյություն ունեցող Logs վահանակի/SSE հոսքի միջոցով — այս ինտեգրման մեջ դեռևս չկա հատուկ QR-պատկերի վերջնակետ: + +--- + +### 4.7 Հակադարձ պրոքսի (9Router կառավարման վահանակի ներդրում) + +Կառավարման վահանակը ներդնում է 9Router վեբ ինտերֆեյսը iframe-ի ներսում՝ ներքին հակադարձ պրոքսիի միջոցով հետևյալ հասցեում. ``` GET|POST|... /dashboard/providers/services/9router/embed/[...path] ``` -Այս պրոքսին՝ +Այս պրոքսին. -- Փոխանցում է հարցումը դեպի `http://127.0.0.1:{port}/{path}` (միայն loopback) -- Հեռացնում է մուտքային `cookie` և `authorization` վերնագրերը (OmniRoute-ի աշխատաշրջանի արտահոսք չկա) -- Ավելացնում է `Authorization: Bearer {apiKey}`՝ 9Router-ի նույնականացման համար -- Պատասխանից հեռացնում է `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` -- Վերագրում է HTML պատասխանները՝ `` ներարկելու և բացարձակ ուղիները նորմալացնելու համար (`/foo` → `/dashboard/.../embed/foo`) +- Հարցումը փոխանցում է `http://127.0.0.1:{port}/{path}` հասցեին (միայն loopback) +- Հեռացնում է մուտքային `cookie` և `authorization` հեդերները (OmniRoute սեսիայի արտահոսք չկա) +- Ներարկում է `Authorization: Bearer {apiKey}` 9Router աուտենտիֆիկացիայի համար +- Հեռացնում է `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` հեդերները պատասխանից +- Վերագրում է HTML պատասխանները՝ ներարկելու `` և նորմալացնելու բացարձակ ուղիները (`/foo` → `/dashboard/.../embed/foo`) -Ներկառուցված կառավարման վահանակի WebSocket-ի թարմացումները մշակվում են առանձին -պորտում գործող ուղեկից սերվերի միջոցով (տե՛ս `src/lib/services/embedWsProxy.ts`)։ +Ներդրված կառավարման վահանակի համար WebSocket թարմացումները մշակվում են ուղեկցող սերվերի կողմից՝ հատուկ պորտում (տես `src/lib/services/embedWsProxy.ts`): -**Անվտանգություն․** Ներկառուցման պրոքսիի երթուղիները դասակարգված են `LOCAL_ONLY_API_PREFIXES`-ի ներքո -և հասանելի են միայն loopback-ից։ Cloudflare/Ngrok թունելի միջոցով JWT ձեռք բերած -հարձակվողը չի կարող պրոքսիի միջոցով մուտք գործել ներկառուցված ծառայություններ։ - ---- +**Անվտանգություն:** Ներդրված պրոքսիի երթուղիները դասակարգվում են `LOCAL_ONLY_API_PREFIXES`-ի ներքո և հասանելի են միայն loopback-ից: Հարձակվողը, ով ստանում է JWT Cloudflare/Ngrok թունելի միջոցով, չի կարող պրոքսիացնել ներդրված ծառայություններ: ## 5. Անվտանգություն diff --git a/docs/i18n/hy/docs/frameworks/MEMORY.md b/docs/i18n/hy/docs/frameworks/MEMORY.md index 5cf8a5dcc4a9..140921f88455 100644 --- a/docs/i18n/hy/docs/frameworks/MEMORY.md +++ b/docs/i18n/hy/docs/frameworks/MEMORY.md @@ -168,34 +168,36 @@ Cormack և այլոց սկզբնական հոդվածից և լավ է աշխա ## Կարգավորումների ընդլայնում Ներդրման և վեկտորային ինը դաշտ հասանելի է `MemorySettingsExtended`-ում՝ -`src/shared/schemas/memory.ts` ֆայլում, և պահպանվում է `src/lib/db/settings.ts`-ի միջոցով. - -| Դաշտ | Տիպ | Լռելյայն | Նկարագրություն | -| ------------------------ | -------------------------------------------------- | -------- | ---------------------------------------------------------------- | -| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Օգտագործվող ներդրման աղբյուրը | -| `embeddingProviderModel` | `string \| null` | `null` | Մատակարար/մոդել՝ `provider/model` ձևաչափով | -| `customBaseUrl` | `string \| null` | `null` | Միայն հիշողության համար OpenAI-համատեղելի վերջնակետի բազային URL | -| `customModelId` | `string \| null` | `null` | Հատուկ վերջնակետին ուղարկվող մոդելի ID | -| `transformersEnabled` | `boolean` | `false` | Transformers.js-ի կամավոր միացում (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Տեղային ստատիկ potion-base-8M մոդելի կամավոր միացում | -| `rerankEnabled` | `boolean` | `false` | Վերադասակարգման քայլի միացում (ավելացնում է +200-500ms/req) | -| `rerankProviderModel` | `string \| null` | `null` | Վերադասակարգման մատակարար/մոդել՝ `provider/model` ձևաչափով | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Օգտագործվող վեկտորային հետնամասը | +`src/shared/schemas/memory.ts` ֆայլում, և պահպանվում է `src/lib/db/settings.ts`-ի միջոցով․ + +| Դաշտ | Տեսակ | Լռելյայն | Նկարագրություն | +| ------------------------ | -------------------------------------------------- | -------- | ----------------------------------------------------------------------------------- | +| `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Օգտագործվող ներդրման աղբյուրը | +| `embeddingProviderModel` | `string \| null` | `null` | Մատակարար/մոդել՝ `provider/model` ձևաչափով | +| `customBaseUrl` | `string \| null` | `null` | Միայն հիշողության համար նախատեսված՝ OpenAI-ի հետ համատեղելի վերջնակետի հիմնական URL | +| `customModelId` | `string \| null` | `null` | Հատուկ վերջնակետին ուղարկվող մոդելի ID | +| `transformersEnabled` | `boolean` | `false` | Transformers.js-ի օգտագործման համաձայնություն (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Տեղային ստատիկ potion-base-8M մոդելի օգտագործման համաձայնություն | +| `rerankEnabled` | `boolean` | `false` | Միացնել վերադասավորման քայլը (ավելացնում է +200-500ms/req) | +| `rerankProviderModel` | `string \| null` | `null` | Վերադասավորման մատակարար/մոդել՝ `provider/model` ձևաչափով | + +`rerankProviderModel`-ը որոշվում է `POST /v1/rerank`-ի միջոցով (կանչվում է loopback կապով), ուստի այն ընդունում է այդ երթուղու կողմից ընդունվող ցանկացած արժեք՝ նախապես ընտրված ամպային վերադասավորման մոդել (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) կամ OpenAI-ի հետ համատեղելի մատակարարի հանգույց՝ `/` ձևաչափով (օրինակ՝ `skilled-mini/bge-reranker-v2-m3`՝ TEI/Infinity սերվերի համար)։ Loopback հանգույցները միշտ հասանելի են․ այլ հոսթում գտնվող հանգույցի (LAN, Tailscale) համար լրացուցիչ պահանջվում է `RERANK_REMOTE_PROVIDER_NODES` գործառույթի դրոշակը, և այն պետք է համապատասխանի մատակարարի ելքային URL-ների քաղաքականությանը․ տե՛ս [Գործառույթի դրոշակներ](../reference/FEATURE_FLAGS.md)։ Կառավարման վահանակի ընտրիչը ցուցադրում է նախապես ընտրված մատակարարները և տեղային հանգույցները․ ցանկացած վավեր `provider/model` տող կարող է ուղղակիորեն սահմանվել `PUT /api/settings/memory`-ի միջոցով։ +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Օգտագործվող վեկտորային հետնամասը | Դրանք հասանելի են `GET /PUT /api/settings/memory`-ի միջոցով (`MemorySettingsExtendedSchema` սխեմա)։ -`remote` աղբյուրի համար Memory-ն ընդունում է նաև կամընտիր `customBaseUrl` և -`customModelId` կարգավորումները։ Դրանք միասին ընտրում են OpenAI-համատեղելի `/embeddings` -վերջնակետ և մոդել՝ առանց ներդրումների գլոբալ ռեեստրը փոխելու։ Օգտագործումից առաջ վերջնակետը -նորմալացվում և ստուգվում է մատակարարի ելքային URL-ների քաղաքականությամբ. պահանջվում է HTTP(S), -ներկառուցված հավատարմագրերը և հարցման տողերը մերժվում են, իսկ ամպային մետատվյալների -հասցեները շարունակում են արգելափակված մնալ։ Դատարկ արժեքները պահպանում են ռեեստրից ընտրված -մատակարարին։ Կառավարման վահանակ վերադարձվող սխալները մաքրվում են, իսկ վերջնակետի -հավատարմագրերը երբեք չեն գրանցվում մատյանում։ - -> **TODO (D20):** `global` տիրույթը (հիշողությունների համօգտագործում բոլոր API բանալիների միջև) -> այս թողարկման մեջ իրականացված չէ։ Այն պահանջում է սխեմայի փոփոխություններ և գլոբալ որոնման -> ուղի։ Հետևեք դրան առանձին։ +`remote` աղբյուրի համար Հիշողությունն ընդունում է նաև կամընտիր `customBaseUrl` և +`customModelId` կարգավորումները։ Դրանք միասին ընտրում են OpenAI-ի հետ համատեղելի `/embeddings` +վերջնակետն ու մոդելը՝ առանց ներդրումների համընդհանուր գրանցամատյանը փոխելու։ Օգտագործումից +առաջ վերջնակետը նորմալացվում և ստուգվում է մատակարարի ելքային URL-ների քաղաքականության համաձայն․ +HTTP(S)-ը պարտադիր է, ներկառուցված նույնականացման տվյալներն ու հարցման տողերը մերժվում են, +իսկ ամպային մետատվյալների հասցեները շարունակում են արգելափակված մնալ։ Դատարկ արժեքները պահպանում +են գրանցամատյանի ընտրված մատակարարին։ Կառավարման վահանակին վերադարձվող սխալները մաքրվում են, +իսկ վերջնակետի նույնականացման տվյալները երբեք չեն գրանցվում մատյաններում։ + +> **ԱՆԵԼԻՔ (D20):** `global` ընդգրկույթը (հիշողությունների համօգտագործում բոլոր API բանալիների միջև) +> այս թողարկման մեջ իրականացված չէ։ Այն պահանջում է սխեմայի փոփոխություններ և համընդհանուր որոնման +> ուղի։ Հետևել առանձին։ ## Պահպանման շերտեր diff --git a/docs/i18n/hy/docs/guides/DOCKER_GUIDE.md b/docs/i18n/hy/docs/guides/DOCKER_GUIDE.md index 100e1f044c1b..38299165c0ee 100644 --- a/docs/i18n/hy/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/hy/docs/guides/DOCKER_GUIDE.md @@ -27,6 +27,12 @@ ## Արագ գործարկում +> **Ինքնուրույն հոսթինգ՝ մեկ հրամանո՞վ։** Տե՛ս +> [Ինքնուրույն հոսթինգի ուղեցույցը](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (հրապարակված image + +> Redis, միայն loopback, առանց պրոֆիլի ընտրության)։ Ստորև ներկայացված «Արագ գործարկումը» +> մեկ կոնտեյներով տարբերակ է այն օգտատերերի համար, որոնք արդեն Redis-ն այլ տեղ են գործարկում։ + ```bash docker run -d \ --name omniroute \ diff --git a/docs/i18n/hy/docs/guides/TROUBLESHOOTING.md b/docs/i18n/hy/docs/guides/TROUBLESHOOTING.md index 61d678b4cbf4..abaa84cbe2d0 100644 --- a/docs/i18n/hy/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/hy/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ export OMNIROUTE_CHAT_ADMISSION_QUEUE_MS=5000 # ծանր հարցումների ## `npm install`-ի նախազգուշացումներ (ERESOLVE / peer / deprecated) -Երբ գործարկում եք `npm install -g omniroute`, կարող եք տեսնել բազմաթիվ նախազգուշացումներ, ինչպիսիք են `npm warn ERESOLVE`-ը, peer կախվածությունների մասին ծանուցումները և `deprecated` հաղորդագրությունները։ **Դրանք սպասելի են և անվնաս։** Տեղադրումը հաջողվել է, եթե արտածման մեջ տեսնում եք `added packages`։ +Երբ գործարկում եք `npm install -g omniroute`, կարող եք տեսնել բազմաթիվ նախազգուշացումներ, օրինակ՝ `npm warn ERESOLVE`, peer կախվածությունների մասին ծանուցումներ և `deprecated` հաղորդագրություններ։ **Դրանք սպասելի են և անվնաս։** Տեղադրումը հաջողվել է, եթե արտածման մեջ տեսնում եք `added packages`։ -Նախազգուշացումների պատճառը երրորդ կողմի փաթեթների հնացած peer կախվածությունների միջակայքերն են, որոնք OmniRoute-ը չի վերահսկում․ +Peer կախվածությունների լուծման մասին նախազգուշացումները ճնշելու համար օգտագործեք OmniRoute-ի աջակցվող տեղադրման ձևը․ -1. **`marked-terminal`-ը պահանջում է `marked >=1 <16`, սակայն գտնվել է `marked@18`** — գործնականում այն նորմալ աշխատում է․ upstream peer միջակայքը պարզապես հնացած է։ -2. **`deprecated prebuild-install@7.1.3`** — տարանցիկ օգնական է՝ բնիկ երկուական ֆայլեր ներբեռնելու համար։ Այն չի - օգտագործվում ամրագրված `wreq-js` փոխադրման binding-ը տեղադրելու համար և չի նշանակում, որ web-cookie - մատակարարի փոխադրման կարգավորումը ձախողվել է։ +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps`-ը ճնշում է միայն `ERESOLVE`-ը և peer կախվածությունների մասին ծանուցումները։ Հնացման մասին ծանուցումները շարունակում են ցուցադրվել, քանի որ դրանք գալիս են տարանցիկ երրորդ կողմի փաթեթներից․ դրանք չեն նշանակում, որ տեղադրումը ձախողվել է։ + +Նախազգուշացումները պայմանավորված են երրորդ կողմի այն փաթեթներում առկա հնացած peer կախվածությունների միջակայքերով, որոնք OmniRoute-ը չի վերահսկում․ + +1. **`marked-terminal`-ը պահանջում է `marked >=1 <16`, սակայն հայտնաբերվել է `marked@18`** — գործնականում նորմալ է աշխատում․ upstream peer միջակայքը պարզապես հնացած է։ +2. **`deprecated prebuild-install@7.1.3`** — տարանցիկ օժանդակ գործիք է native binary ֆայլերի ներբեռնման համար։ Այն չի + օգտագործվում ամրագրված `wreq-js` transport binding-ը տեղադրելու համար և չի նշանակում, որ web-cookie + provider transport-ի կարգավորումը ձախողվել է։ -**Որևէ գործողություն անհրաժեշտ չէ** — այս նախազգուշացումները հնարավոր չէ ամբողջությամբ անջատել՝ առանց upstream փաթեթները fork անելու։ +**Որևէ գործողություն չի պահանջվում** — նախազգուշացումները հնարավոր չէ ամբողջությամբ ճնշել՝ առանց upstream փաթեթները fork անելու։ --- diff --git a/docs/i18n/hy/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/hy/docs/providers/CURSOR-API-KEY-AND-CLI.md index 61e47a9e003f..11f03e8c9a65 100644 --- a/docs/i18n/hy/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/hy/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -4,42 +4,42 @@ --- -Cursor-ը OmniRoute-ի հետևում առանց IDE աշխատաշրջանի տեղադրելու երկու եղանակ կա. +Cursor-ը OmniRoute-ի հետևում առանց IDE աշխատաշրջանի տեղադրելու երկու եղանակ. -1. **`cursor-api` մատակարար** (`Cursor API` քարտ, `cua` կեղծանուն). API բանալիով +1. **`cursor-api` մատակարար** («Cursor API» քարտ, `cua` այլանուն). API բանալիով մատակարար, որը պահում է Cursor-ի օգտատիրոջ API բանալին (`crsr_…`, ստեղծվում է `https://cursor.com/dashboard/api` հասցեում)։ Այնուհետև OmniRoute-ի ցանկացած հաճախորդ - կարող է դիմել Cursor-ի մոդելներին `/v1/chat/completions`-ի միջոցով՝ որպես - `cursor-api/` կամ `cua/`՝ քվոտայի, պահուստային տարբերակի և գրանցամատյանի + `/v1/chat/completions`-ի միջոցով հասանելիություն է ստանում Cursor-ի մոդելներին՝ որպես + `cursor-api/` կամ `cua/`, քվոտայի, պահուստային երթուղավորման և գրանցամատյանների սովորական շերտերով։ IDE մատակարարը (`cursor`, OAuth/IDE աշխատաշրջան) մնում է անփոփոխ։ -2. **Cursor CLI-ի թափանցիկ փոխանցում**. Cursor CLI-ն (`agent`) ուղղեք դեպի OmniRoute, որպեսզի - CLI-ի կատարած յուրաքանչյուր RPC վավերացվի OmniRoute API բանալիով, փոխանցվի +2. **Cursor CLI-ի միջանցիկ փոխանցում**. Cursor CLI-ն (`agent`) ուղղեք դեպի OmniRoute, որպեսզի + CLI-ի կատարած յուրաքանչյուր RPC նույնականացվի OmniRoute API բանալիով, փոխանցվի Cursor-ին՝ օգտագործելով `cursor-api` կապի հավատարմագրերը, և գրանցվի Logs էջում։ ## Ինչու է բանալին փոխանակվում -`api2.cursor.sh`-ը մերժում է չմշակված `crsr_…` բանալին՝ որպես Bearer թոքեն (401)։ Cursor -CLI-ն սկզբում POST հարցմամբ բանալին ուղարկում է `/auth/exchange_user_api_key` և ստանում է +`api2.cursor.sh`-ը մերժում է չմշակված `crsr_…` բանալին որպես Bearer նշան (401)։ Cursor +CLI-ն նախ POST հարցմամբ ուղարկում է բանալին `/auth/exchange_user_api_key` և ստանում աշխատաշրջանի JWT, որի ժամկետը լրանում է մեկ ժամ անց։ Վերադարձված `refreshToken`-ն ունի նույն -`exp`-ը, ուստի թարմացումը նշանակում է բանալու կրկնակի փոխանակում։ +`exp` արժեքը, ուստի թարմացումը նշանակում է բանալու կրկնակի փոխանակում։ `open-sse/services/cursorApiKeyAuth.ts`-ը կատարում է այդ փոխանակումը, յուրաքանչյուր բանալու -համար պահում է մեկ աշխատաշրջանի թոքեն, կրկին փոխանակում է այն ժամկետի ավարտից հինգ րոպե առաջ -և հեռացնում է քեշավորված թոքենը, երբ Cursor-ը պատասխանում է 401 կարգավիճակով։ `CursorExecutor`-ը +համար քեշավորում է մեկ աշխատաշրջանային նշան, այն կրկին փոխանակում է ժամկետի ավարտից հինգ +րոպե առաջ և հեռացնում է քեշավորված նշանը, երբ Cursor-ը պատասխանում է 401-ով։ `CursorExecutor`-ը կանչում է այն անմիջապես `cursor-api` կապերի համար վերին հոսքի բացումից առաջ։ ## `cursor-api` մատակարարը -Գրանցամատյան՝ `open-sse/config/providers/registry/cursor/index.ts` -(`cursor_apiProvider`, `authType: "apikey"`, նույն `format`-ը, `baseUrl`-ը և -`models`-ը, ինչ `cursor`-ինը)։ Կատալոգի քարտ՝ +Ռեեստր՝ `open-sse/config/providers/registry/cursor/index.ts` +(`cursor_apiProvider`, `authType: "apikey"`, նույն `format`, `baseUrl` և +`models`, ինչ `cursor`-ի դեպքում)։ Կատալոգի քարտ՝ `src/shared/constants/providers/apikey/specialty-media.ts`։ Կատարիչների քարտեզ՝ `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`)։ Կառավարման վահանակ՝ Providers → Cursor API → Add API key։ -REST. +REST՝ ```bash curl -sS -X POST http://localhost:20128/api/providers \ @@ -56,36 +56,48 @@ curl -sS http://localhost:20128/v1/chat/completions \ -d '{"model":"cursor-api/auto","messages":[{"role":"user","content":"say PONG"}]}' ``` -Նշումներ. +Նշումներ՝ -- `cursor-api`-ի մոդելների ցանկը վերցվում է Cursor-ի ստատիկ գրանցամատյանից (նույն +- `cursor-api`-ի մոդելների ցանկը վերցվում է Cursor-ի ստատիկ ռեեստրից (նույն ցանկը, որին որպես պահուստային տարբերակ անցնում է IDE մատակարարը)։ OmniRoute հոսթում `cursor-agent`-ի տեղադրում չի պահանջվում։ - `POST /api/providers/{id}/refresh-cursor`-ը նախատեսված է միայն `cursor` IDE մատակարարի համար։ `cursor-api` կապերը չունեն թարմացման ենթակա IDE աշխատաշրջան։ -## Cursor CLI-ի թափանցիկ փոխանցում +## Բնիկ մոդելների ID-ներ և ջանքի մակարդակ + +`cursor` / `cu` և `cursor-api` / `cua` տարբերակների համար Claude-ի ջանքի մակարդակի ընդհանուր նորմալացուցիչը +պահպանում է հարցված մոդելի ID-ն անփոփոխ։ Cursor-ը կարող է `-low`-ի նման վերջածանցը +ներկայացնել որպես իրական մոդելի ID-ի մաս, այլ ոչ թե որպես OmniRoute-ի ջանքի մակարդակի այլանուն։ +Cursor-ի կատարիչը պահպանում է գործող կատալոգում ճշգրիտ համընկնումը։ Երբ համընկնում չկա, +վերջածանցը պարամետրի փոխակերպելու պահուստային մշակումը կատարում է դրա գործող մոդելի լուծիչը։ + +Սա չի փոխում ջանքի մակարդակի նորմալացումը Claude-ի ուղիղ, Claude-ի հետ համատեղելի +կամ Vertex երթուղիների համար։ Հասանելիությունը նախկինի պես կախված է ընտրված Cursor հաշվի +կատալոգից և հասանելիության իրավունքներից։ + +## Cursor CLI-ի միջանցիկ փոխանցում Երթուղի՝ `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`։ `/api/cursor-cli/` նախածանցը գրանցված է `src/shared/constants/publicApiRoutes.ts`-ում, քանի որ մշակիչը -կիրառում է իր սեփական վավերացումը. +կիրառում է իր սեփական նույնականացումը․ -| Ուղի | CLI-ից ակնկալվող վավերացում | Ինչ է անում OmniRoute-ը | -| ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Վավերացնում է բանալին, ստեղծում է 1 ժամ գործողությամբ HS256 JWT (`JWT_SECRET`-ով ստորագրված) և վերադարձնում այն | -| յուրաքանչյուր այլ ուղի (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Ստուգում է թողարկողին/լսարանին/ժամկետի ավարտը, ընտրում է ակտիվ `cursor-api` կապ, Authorization վերնագիրը փոխարինում է փոխանակված Cursor թոքենով և պատասխանը հոսքային եղանակով վերադարձնում է | +| Ուղի | CLI-ից ակնկալվող նույնականացում | Ինչ է անում OmniRoute-ը | +| ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Վավերացնում է բանալին, ստեղծում է 1 ժամ վավերականությամբ HS256 JWT (`JWT_SECRET`-ով ստորագրված) և վերադարձնում այն | +| յուրաքանչյուր այլ ուղի (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Ստուգում է թողարկողին/լսարանին/վավերականության ժամկետը, ընտրում է ակտիվ `cursor-api` կապ, Authorization վերնագիրը փոխարինում է փոխանակված Cursor թոքենով և պատասխանը հոսքով վերադարձնում | -CLI-ն վերծանում է `exp`-ը ստացված ցանկացած թոքենից, ուստի անթափանց -թոքեն տրամադրելու դեպքում այն կրկնակի փոխանակում է կատարում գրեթե յուրաքանչյուր հարցումից առաջ։ -Ստեղծված JWT-ն խուսափում է դրանից։ OmniRoute-ից ստացված 401 պատասխանը ստիպում է CLI-ին -կրկին կատարել փոխանակումը։ +CLI-ն վերծանում է `exp`-ը ստացած ցանկացած թոքենից, ուստի նրան ոչ թափանցիկ +թոքեն փոխանցելու դեպքում այն գրեթե յուրաքանչյուր հարցումից առաջ նորից է +փոխանակում կատարում․ ստեղծված JWT-ն խուսափում է դրանից։ OmniRoute-ից ստացված +401 պատասխանը CLI-ին ստիպում է կրկին փոխանակում կատարել։ ### Կարգավորում -1. Ստեղծեք OmniRoute API բանալի (Dashboard → API keys) և `cursor-api` - կապ։ -2. CLI-ին հրահանգեք գործակալի հոսքի համար օգտագործել HTTP/1.1։ +1. Ստեղծեք OmniRoute API բանալի (Կառավարման վահանակ → API բանալիներ) և + `cursor-api` կապ։ +2. Հանձնարարեք CLI-ին գործակալի հոսքի համար օգտագործել HTTP/1.1։ `~/.cursor/cli-config.json`-ում՝ ```json @@ -93,10 +105,10 @@ CLI-ն վերծանում է `exp`-ը ստացված ցանկացած թոքեն ``` Առանց դրա CLI-ն գործակալի քայլը բացում է HTTP/2-ով՝ առանձին - կազմաձևված գործակալի հոսթի նկատմամբ, և վերջնակետով անցնում են միայն - կառավարման հարթակի RPC-ները։ + կազմաձևված գործակալի հոսթում, և վերջնակետով անցնում են միայն + կառավարման հարթության RPC-ները։ -3. Գործարկեք CLI-ն OmniRoute-ի նկատմամբ՝ +3. Գործարկեք CLI-ն OmniRoute-ի միջոցով՝ ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -104,19 +116,19 @@ CLI-ն վերծանում է `exp`-ը ստացված ցանկացած թոքեն agent -p --trust "Reply with exactly OK" ``` -Յուրաքանչյուր անցում հայտնվում է Logs-ում՝ որպես `cursor-api` մատակարար, `cursor-cli` -հարցման տեսակ և `/api/cursor-cli/` ուղի՝ վերագրված OmniRoute API բանալուն և այն -սպասարկած կապին։ - -### Խափանման տարբերակներ - -| Իրավիճակ | Պատասխան CLI-ին | -| ------------------------------------------------ | ---------------------------------------------------- | -| Անհայտ OmniRoute բանալի և `REQUIRE_API_KEY=true` | 401 `unauthenticated`՝ փոխանակման ժամանակ | -| `REQUIRE_API_KEY=false` | անանուն սեսիա (համապատասխանում է `/v1/*` վարքագծին) | -| Ժամկետանց / օտար / կեղծված սեսիայի JWT | 401, CLI-ն կրկին կատարում է փոխանակումը | -| Փոխանակումից հետո չեղարկված OmniRoute API բանալի | 401՝ հաջորդ RPC-ի ժամանակ | -| Ակտիվ `cursor-api` կապ չկա | 503 `unavailable` | -| Cursor-ը մերժում է կապի բանալին | 401 `unauthenticated`, քեշավորված սեսիան հեռացվում է | -| Վերին հոսքն անհասանելի է | 502 `unavailable` (մաքրված հաղորդագրություն) | -| `JWT_SECRET`-ը սահմանված չէ | 503՝ փոխանակման ժամանակ | +Յուրաքանչյուր անցում գրանցվում է Logs-ում՝ որպես `cursor-api` մատակարար, +`cursor-cli` հարցման տեսակ և `/api/cursor-cli/` ուղի՝ վերագրված +OmniRoute API բանալուն և այն սպասարկած կապին։ + +### Խափանման սցենարներ + +| Իրավիճակ | Պատասխան CLI-ին | +| --------------------------------------------------- | ---------------------------------------------------------- | +| Անհայտ OmniRoute բանալի և `REQUIRE_API_KEY=true` | 401 `unauthenticated`՝ փոխանակման ժամանակ | +| `REQUIRE_API_KEY=false` | անանուն աշխատաշրջան (նմանակում է `/v1/*` վարքագիծը) | +| Ժամկետանց / օտար / կեղծված աշխատաշրջանի JWT | 401, CLI-ն կրկին փոխանակում է կատարում | +| OmniRoute API բանալին չեղարկվել է փոխանակումից հետո | 401՝ հաջորդ RPC-ի ժամանակ | +| Ակտիվ `cursor-api` կապ չկա | 503 `unavailable` | +| Cursor-ը մերժում է կապի բանալին | 401 `unauthenticated`, քեշավորված աշխատաշրջանը հեռացվում է | +| Վերին հոսքը հասանելի չէ | 502 `unavailable` (մաքրազերծված հաղորդագրություն) | +| `JWT_SECRET`-ը սահմանված չէ | 503՝ փոխանակման ժամանակ | diff --git a/docs/i18n/hy/docs/reference/API_REFERENCE.md b/docs/i18n/hy/docs/reference/API_REFERENCE.md index 304750be1c0d..988adac65b95 100644 --- a/docs/i18n/hy/docs/reference/API_REFERENCE.md +++ b/docs/i18n/hy/docs/reference/API_REFERENCE.md @@ -418,68 +418,90 @@ GET /api/v1/provider-plugin-manifest --- -## Համատեղելիության վերջնակետեր - -| Մեթոդ | Ուղի | Ձևաչափ | -| ----- | ----------------------------------------- | -------------------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (խմբագրում/ներկալցում) | -| POST | `/v1/videos/generations` | OpenAI ոճի տեսանյութերի ստեղծում | -| POST | `/v1/music/generations` | OpenAI ոճի երաժշտության ստեղծում | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (խոսքից տեքստ) | -| POST | `/v1/audio/speech` | OpenAI TTS (վերադարձնում է աուդիո բովանդակություն) | -| POST | `/v1/rerank` | Cohere/Voyage ոճի վերադասակարգում | -| POST | `/v1/classify` | Jina դասակարգում (`api.jina.ai`) | -| POST | `/v1/segment` | Jina հատվածավորիչ (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | OpenAI կատալոգի այլանուն | -| GET | `/api/v1/vscode/{token}/models` | OpenAI մոդելների այլանուն | -| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI թոքենավորված այլանուն | -| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses-ի թոքենավորված այլանուն | -| POST | `/api/v1/vscode/{token}/api/chat` | Ollama-ի թոքենավորված այլանուն | -| GET | `/api/v1/vscode/{token}/api/tags` | Ollama պիտակների թոքենավորված այլանուն | - -Բոլոր POST երթուղիներն ունեն նույն կառուցվածքը՝ `Bearer your-api-key` + Zod-ով վավերացված JSON բովանդակություն (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` և այլն, տե՛ս `src/shared/validation/schemas.ts`)։ Սխեմայի վավերացման ձախողման դեպքում վերադարձվում է 4xx։ - -Այն հաճախորդների համար, որոնք չեն կարող կցել `Authorization: Bearer ...`, OmniRoute-ը նաև ընդունում է API բանալիները URL-ում՝ հարցման տողի համատեղելիության (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) կամ ստորև փաստաթղթավորված հատուկ `/api/v1/vscode/{token}/...` վերջնակետերի միջոցով։ +## Համատեղելիության վերջնակետեր (Endpoints) + +| Մեթոդ | Ուղի | Ձևաչափ | +| ----- | ----------------------------------------- | ---------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (edit/inpaint) | +| POST | `/v1/videos/generations` | OpenAI-style տեսանյութի ստեղծում | +| POST | `/v1/music/generations` | OpenAI-style երաժշտության ստեղծում | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (վերադարձնում է աուդիո) | +| POST | `/v1/rerank` | Cohere/Voyage-style rerank | +| POST | `/v1/classify` | Jina classify (`api.jina.ai`) | +| POST | `/v1/segment` | Jina segmenter (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | OpenAI catalog alias | +| GET | `/api/v1/vscode/{token}/models` | OpenAI models alias | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokenized alias | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokenized alias | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenized alias | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama tags tokenized alias | + +Բոլոր POST երթուղիները հետևում են նույն կառուցվածքին՝ `Bearer your-api-key` + Zod-ով վավերացված JSON մարմին (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` և այլն, տես `src/shared/validation/schemas.ts`): Սխեմայի անհամապատասխանության դեպքում վերադարձվում է 4xx սխալ: + +Այն հաճախորդների համար, որոնք չեն կարող կցել `Authorization: Bearer ...` վերնագիրը, OmniRoute-ը ընդունում է API բանալիները նաև URL-ի միջոցով՝ կամ query-string համատեղելիությամբ (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`), կամ ստորև նշված հատուկ `/api/v1/vscode/{token}/...` վերջնակետերի միջոցով: ```bash -# Վերադասակարգում +# Rerank (ամպային ռեգիստրի մատակարար կամ OpenAI-համատեղելի մատակարարի հանգույց որպես "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Jina դասակարգում (Foundation API հավատարմագրեր) +# Jina classify (Foundation API հավատարմագրեր) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Jina հատվածավորիչ +# Jina segmenter POST /v1/segment { "content": "...", "return_chunks": true } -# Jina որոնում (s.jina.ai; մատակարարի այլանուններ՝ jina-search, jina-ai, jina) +# Jina search (s.jina.ai; մատակարարի ալիասներ՝ jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Չափավորում +# Moderations POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — վերադարձնում է audio/mpeg (կամ պահանջված ձևաչափի) բովանդակություն +# TTS — վերադարձնում է audio/mpeg (կամ հայցվող ձևաչափի) մարմին POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Պատկերի խմբագրում (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Տեսանյութի / երաժշտության ստեղծում (մատակարարի նախածանցով մոդելի նույնացուցիչ) +# Տեսանյութի / երաժշտության ստեղծում (մատակարարի նախդիրով մոդելի id) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Մատակարարներին հատուկ երթուղիներ +> **Rerank մատակարարի հանգույցներ:** `POST /v1/rerank`-ը նաև ուղղորդում է դեպի OpenAI-համատեղելի մատակարարի հանգույցներ +> (oMLX, vLLM, Infinity, TEI դարպասի հետևում և այլն), որոնք հասցեավորվում են որպես `/`: Loopback +> հանգույցները (`localhost`, `127.0.0.1`, `172.16.0.0/12`) միշտ հասանելի են: Ցանկացած այլ հոսթի վրա գտնվող հանգույցները՝ +> LAN սարք կամ Tailscale հանգույց, հասանելի են միայն այն դեպքում, երբ օպերատորը միացնում է +> `RERANK_REMOTE_PROVIDER_NODES` ֆունկցիոնալ դրոշը **և** հանգույցի հիմնական URL-ն անցնում է մատակարարի +> արտաքին URL քաղաքականությունը (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`): +> Cloud-metadata հոսթերին երբեք հարցումներ չեն ուղղվում: Հիշողության շարժիչի (memory engine) rerank քայլը կանչում է այս երթուղին +> loopback-ի միջոցով, ուստի նույն կանոնը կարգավորում է նաև `rerankProviderModel`-ը Memory կարգավորումներում: +> +> **Տեղական սերվերի ձևաչափեր:** հանգույցը կանչվում է `/v1/rerank` հասցեով, իսկ 404-ի դեպքում՝ `/rerank` +> (Infinity, TEI): Ելքային մարմինը կրում է և՛ Cohere/OpenAI ուղղագրությունը (`documents`, `return_documents`), +> և՛ TEI ուղղագրությունը (`texts`, `return_text`), իսկ պատասխանը նորմալացվում է ըստ Cohere-ի ձևաչափի. +> TEI-ի պարզ `[{index, score, text}]`-ը, պարզ դարպասների `{results: [{index, score}]}`-ը և Voyage-ոճի +> `{data: [...]}`-ը բոլորը վերադառնում են հաճախորդին որպես `{results: [{index, relevance_score, document?}]}`, +> տեսակավորված ըստ միավորի և սահմանափակված `top_n`-ով: + +> **Մատակարարի հանգույցների հայտնաբերում:** OpenAI-համատեղելի մատակարարի հանգույցի մոդելները հայտնվում են `GET /v1/models` +> ցանկում՝ հանգույցի նախդիրի տակ: Այն տողերը, որոնք չունեն վերջնակետի մետատվյալներ (բնորոշ է տեղական `/v1/models` ցուցակներին), +> ժառանգում են հանգույցի `apiType`-ը, ուստի `embeddings` հանգույցի մոդելները ստանում են `type: "embedding"`, իսկ +> `rerank` հանգույցի մոդելները՝ `type: "rerank"`՝ լռելյայն chat-ի փոխարեն: Սինքրոնացված կամ ձեռքով ավելացված տողի վրա +> հստակ նշված `supportedEndpoints`-ը դեռևս ունի առաջնահերթություն: + +### Մատակարարի հատուկ երթուղիներ ```bash POST /v1/providers/{provider}/chat/completions @@ -487,7 +509,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Մատակարարի նախածանցը բացակայելու դեպքում ավելացվում է ավտոմատ կերպով։ Չհամապատասխանող մոդելների դեպքում վերադարձվում է `400`։ +`provider` նախածանցն ավտոմատ կերպով ավելացվում է, եթե բացակայում է։ Անհամապատասխան մոդելները վերադարձնում են `400`։ --- diff --git a/docs/i18n/hy/docs/reference/FEATURE_FLAGS.md b/docs/i18n/hy/docs/reference/FEATURE_FLAGS.md index ec8e9b20c21b..bbf3d2c085df 100644 --- a/docs/i18n/hy/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/hy/docs/reference/FEATURE_FLAGS.md @@ -42,165 +42,168 @@ --- -## Դրոշների կատալոգ +## Դրոշակների կատալոգ -72 դրոշ՝ 6 կատեգորիայում։ **Լռելյայն**-ը սահմանման լռելյայն արժեքն է՝ այն արժեքը, -որն օգտագործվում է, երբ առկա չէ ո՛չ ՏԲ վերասահմանում, ո՛չ էլ միջավայրի փոփոխական։ +74 դրոշակ 6 կատեգորիաներում։ **Լռելյայն**-ը սահմանման լռելյայն արժեքն է՝ այն արժեքը, որն օգտագործվում է, երբ առկա չէ ոչ DB-ի վերասահմանում, ոչ էլ միջավայրի փոփոխական։ ### Անվտանգություն (10) -| Բանալի | Տեսակ | Լռելյայն | Նկարագրություն | -| --------------------------------------- | -------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `REQUIRE_API_KEY` | բուլյան | `false` | Բոլոր մուտքային հարցումների համար պահանջել API բանալի։ | -| `INPUT_SANITIZER_ENABLED` | բուլյան | `true` | Միացնել բոլոր հարցումների մուտքային տվյալների մաքրումը։ | -| `INJECTION_GUARD_MODE` | թվարկում | `off` | Հուշման ներարկումից պաշտպանության ռեժիմ։ Արժեքներ՝ `off`, `warn`, `block`, `redact`։ | -| `PII_REDACTION_ENABLED` | բուլյան | `false` | Քողարկել PII-ն հարցումներից (`INPUT_SANITIZER_MODE`-ից անկախ)։ | -| `PII_RESPONSE_SANITIZATION` | բուլյան | `false` | Մաքրել PII-ն մատակարարների պատասխաններից։ | -| `PII_RESPONSE_SANITIZATION_MODE` | թվարկում | `redact` | PII-ի պատասխանի մաքրման ռեժիմ։ Արժեքներ՝ `redact`, `warn`, `block`, `off`։ | -| `OUTBOUND_SSRF_GUARD_ENABLED` | բուլյան | `true` | Արգելափակել դեպի մասնավոր/ներքին IP տիրույթներ ուղղված ելքային հարցումները։ | -| `ALLOW_API_KEY_REVEAL` | բուլյան | `false` | Թույլատրել նույնականացված կառավարման վահանակի օգտատերերին բացահայտել պահված API բանալիները՝ միայն քողարկված արժեքները տեսնելու փոխարեն։ | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | բուլյան | `false` | Ներառել հաշվի նախածանցը AUTH մատյանի տողերում (օրինակ՝ «Օգտագործվում է հաշիվը՝ abc12345...»): Լռելյայն անջատված է, որպեսզի հաշվի նույնացուցիչները քողարկվեն համօգտագործվող/բազմավարձակալ գործընթացների մատյաններում։ Անկախ է վրիպազերծման ռեժիմից․ վրիպազերծման ռեժիմի փոխարկումը սա չի բացահայտում։ | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | բուլյան | `false` | Երբ OIDC-ը միացված է, անջատել գաղտնաբառով մուտքը, որպեսզի օգտատերերը կարողանան նույնականացվել միայն OIDC միասնական մուտքի միջոցով։ Երբ անջատված է (լռելյայն), հասանելի են և՛ գաղտնաբառով մուտքը, և՛ OIDC-ը։ | - -### Ցանց (15) - -| Բանալի | Տեսակ | Լռելյայն | Վերագործարկում | Նկարագրություն | -| ----------------------------------------------- | ------- | -------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Միացնել TLS մատնահետքի քողարկման ռեժիմը։ | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Թույլատրել, որ /v1/audio/* երթուղիներն օգտագործեն localhost-ից դուրս տեղակայված՝ OpenAI-ի հետ համատեղելի մատակարարի հանգույցներ։ Լռելյայն անջատված է. աուդիոն հեռավոր հոսթ ուղղորդելը փոխում է ելքային նույնականացումը և պետք է լինի օպերատորի հստակ որոշում։ Loopback հանգույցները միշտ թույլատրված են և չեն ազդվում։ | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Երբ կապին proxy նշանակված չէ, ռեեստրից ինքնաբերաբար ընտրել առաջին աշխատող proxy-ն։ Լռելյայն անջատված է (հակառակ դեպքում ռեեստրի ցանկացած proxy դառնում է գլոբալ պահուստային տարբերակ՝ #3332)։ | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Թույլատրել OAuth-ի և մատակարարի վավերացման հոսքերին շրջանցել ամրակցված proxy-ն և ուղղակիորեն միանալ, երբ proxy-ի հասանելիության նախնական ստուգումները ձախողվում են։ Լռելյայն անջատված է, քանի որ սա կարող է փոխել ելքային IP-ն։ | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Բազմահաշիվ ռոտացիայի կատարիչի դեպքում ցանցային բացառության (սպասման ժամանակի սպառում, կապի մերժում/վերակայում) ժամանակ, երբ ձախողված հաշիվը չունի առանձնացված proxy, կիրառել կարճ սառեցման ժամանակահատված և հարցման մնացած մասում բաց թողնել proxy չունեցող մյուս հաշիվները՝ յուրաքանչյուրն առանձին կրկին փորձելու փոխարեն։ Լռելյայն միացված է (անվտանգ է. ելքային IP-ն չի փոխվում, միայն նվազեցնում է ընդհանուր ելք օգտագործող հաշիվների ուշացման/սառեցման ռիսկը)։ Անջատեք՝ proxy չունեցող առաջին բացառության դեպքում անհապաղ տարածումը վերականգնելու համար։ | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Proxy խմբերը և opencode-ի՝ ըստ հաշվի ռոտացիան ժամանակավորապես դադարում են կրկին տրամադրել հենց նոր ձախողված proxy-ն (մերժված TCP ստուգում կամ դրա միջոցով ստացված 429)՝ յուրաքանչյուր գործընթացի համար սահմանված ժամանակահատվածով, որը յուրաքանչյուր կրկնության դեպքում կրկնապատկվում է մինչև առավելագույն սահմանը։ Proxy-ի որևէ կարգավիճակ չի գրանցվում. երբ բոլոր թեկնածուները մի կողմ են դրված, ընտրությունը մնում է անփոփոխ։ Լռելյայն անջատված է։ | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Վահանակում՝ proxy խմբի ներքո, ցուցադրել, թե վերջին 24 ժամվա ընթացքում դիտարկված քանի ելքային IP է սպասարկել դրա անդամներին և քանի կապ է դրանք օգտագործել։ Միայն ընթերցման համար է, հաշվարկվում է proxy-ի մատյանից և երբեք չի օգտագործվում երթուղավորման համար։ Լռելյայն անջատված է։ | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode կատարիչի համար հետևել հոսքային Responses պատասխանի մարմնի առաջին բայթին (պատուհան՝ `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, լռելյայն՝ `15000`)։ 2xx Responses հոսքը, որը պատուհանի ավարտից հետո շարունակում է լուռ մնալ, համարվում է կանգ առած. հաշվի համար կիրառվում է սառեցում, և հարցումը մեկ անգամ անցնում է հաջորդ հաշվին, իսկ երկրորդ կանգի դեպքում այն արագ ձախողվում է։ Լռելյայն անջատված է. կանգ առած հոսքերը շարունակում են սպասել ներկայիս կարգավորմամբ՝ մինչև հոսքի պատրաստության սպասման ժամանակի սպառումը։ | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode կատարիչ. `user_blocked` մերժում պարունակող 403/451 պատասխանի դեպքում (ոչ աշխարհագրական սահմանափակում, ոչ էլ Cloudflare մատնահետքի մերժում) մերժված հաշվի համար կիրառել սառեցում և յուրաքանչյուր հարցման ընթացքում առավելագույնը մեկ անգամ անցնել հաջորդ հաշվին. երկրորդ մերժումը վերադարձվում է անփոփոխ՝ առանց հաջողության նշման։ Լռելյայն անջատված է. վերին հոսքի օգտատիրոջ արգելափակումը երթուղավորմամբ շրջանցելը կարող է նմանվել խուսափման և տարածել նշումը ամբողջ ենթակառուցվածքով։ | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode-ի ռոտացիա. վերին հոսքի երկու հաջորդական անցողիկ խափանումներից (5xx կամ դատարկ 400) հետո դադարեցնել աշխատանքը՝ նախքան հաջորդ հաշիվն անցնելը. 1.5 վրկ՝ յուրաքանչյուր հաջորդ խափանման դեպքում կրկնապատկմամբ, առավելագույնը՝ 6 վրկ յուրաքանչյուր դադարի և 10 վրկ յուրաքանչյուր հարցման համար, բաց թողնել հաճախորդի կապի անջատման դեպքում. խափանված պատասխանի մարմինն ազատվում է սպասելուց առաջ։ Լռելյայն անջատված է. խափանման դեպքում անցումը մնում է անհապաղ։ | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode-ի ռոտացիա. դադարեցնել հաշիվների շրջափուլը առաջին 429-ի դեպքում, որը դասակարգվել է որպես իրական արագության սահմանափակում (վերլուծելի `Retry-After` կամ արագության/օգտագործման սահմանափակում նշող մարմին), և վերադարձնել վերին հոսքի այդ 429-ն առանց փոփոխության։ Չդասակարգված 429-ների դեպքում ռոտացիան շարունակվում է։ Լռելյայն անջատված է. անվճար մակարդակը սահմանափակված է ըստ ելքային IP-ի (#9611), ուստի յուրաքանչյուր 429 հանգեցնում է ռոտացիայի, իսկ հաշիվների շրջափուլի սպառման դեպքում վերադարձվում է վերին հոսքի վերջին 429-ը։ | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Անջատել TLS հավաստագրի ստուգումը MITM պրոքսիի համար։ **Վտանգավոր է։** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Թույլատրել մասնավոր/ներքին ցանցեր մատնանշող մատակարարի URL-ներ։ | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Թույլատրել տեղային/մասնավոր հասցեներում (127.0.0.1, localhost, LAN) մատակարարների ավելացումն ու վավերացումը։ Լռելյայն միացված է (առաջնահերթությունը՝ տեղայինին). անջատեք՝ միայն հանրային հասցեների խիստ սահմանափակում կիրառելու համար։ Ամպային մետատվյալները շարունակում են արգելափակված մնալ։ | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Միացնել Claude Code-ի հետ համատեղելի մատակարարի ռեժիմը։ | +| Key | Type | Default | Նկարագրություն | +| :-------------------------------------- | :------ | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Պահանջել API բանալի բոլոր մուտքային հարցումների համար։ | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Միացնել մուտքային տվյալների մաքրումը բոլոր հարցումների համար։ | +| `INJECTION_GUARD_MODE` | enum | `off` | Հրահանգի ներարկման պաշտպանության ռեժիմ։ Արժեքներ՝ `off`, `warn`, `block`, `redact`։ | +| `PII_REDACTION_ENABLED` | boolean | `false` | Անձնական տվյալների (PII) խմբագրում հարցումներից (անկախ `INPUT_SANITIZER_MODE`-ից)։ | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Մաքրել անձնական տվյալները (PII) մատակարարի պատասխաններից։ | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Ռեժիմ անձնական տվյալների (PII) պատասխանների մաքրման համար։ Արժեքներ՝ `redact`, `warn`, `block`, `off`։ | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Արգելափակել ելքային հարցումները դեպի մասնավոր/ներքին IP տիրույթներ։ | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Թույլ տալ վավերացված վահանակի օգտատերերին բացահայտել պահված API բանալիները՝ դիմակավորված արժեքներ տեսնելու փոխարեն։ | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Ներառել հաշվի նախածանցը AUTH մատյանի տողերում (օրինակ՝ "Using account: abc12345...")։ Լռելյայն անջատված է, որպեսզի հաշվի նույնացուցիչները խմբագրվեն ընդհանուր/բազմավարձակալական գործընթացի մատյաններից։ Անկախ է Debug Mode-ից. Debug Mode-ը միացնելը չի բացահայտում սա։ | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Երբ OIDC-ն միացված է, անջատել գաղտնաբառով մուտքը, որպեսզի օգտատերերը կարողանան վավերացվել միայն OIDC Single Sign-On-ի միջոցով։ Երբ անջատված է (լռելյայն), հասանելի են և՛ գաղտնաբառով մուտքը, և՛ OIDC-ն։ | + +### Ցանց (16) + +| Բանալի | Տեսակ | Լռելյայն | Վերագործարկում | Նկարագրություն | +| :---------------------------------------------- | :------ | :------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Միացնել TLS մատնահետքի գաղտնի ռեժիմը: | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Թույլատրել `/v1/audio/*` երթուղիներին օգտագործել OpenAI-ի հետ համատեղելի մատակարարի հանգույցներ, որոնք տեղակայված են localhost-ից դուրս: Լռելյայն անջատված է. աուդիոյի երթուղի դեպի հեռավոր հոսթ փոխում է ելքի ինքնությունը և պետք է լինի օպերատորի հստակ որոշում: Loopback հանգույցները միշտ թույլատրված են և անփոփոխ: | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Թույլատրել POST `/v1/rerank` (և հիշողության շարժիչի loopback rerank քայլը) օգտագործել OpenAI-ի հետ համատեղելի մատակարարի հանգույցներ, որոնք տեղակայված են localhost-ից դուրս: Լռելյայն անջատված է. հեռավոր հոսթի երթուղին փոխում է ելքի ինքնությունը և պետք է լինի օպերատորի հստակ որոշում: Loopback հանգույցները միշտ թույլատրված են. հեռավոր հանգույցները պետք է նաև անցնեն մատակարարի արտաքին URL քաղաքականությունը: | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Երբ կապին պրոքսի չի հատկացվում, ավտոմատ կերպով ընտրել ռեգիստրից առաջին աշխատող պրոքսին: Լռելյայն անջատված է (հակառակ դեպքում ցանկացած ռեգիստրի պրոքսի դառնում է գլոբալ պահեստային՝ #3332): | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Թույլատրել OAuth-ին և մատակարարի վավերացման հոսքերին շրջանցել ամրագրված պրոքսին և ուղղակիորեն միանալ, երբ պրոքսիի հասանելիության նախնական ստուգումները ձախողվում են: Լռելյայն անջատված է, քանի որ սա կարող է փոխել ելքի IP-ն: | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Ցանցային բացառության դեպքում (ժամանակի սպառում, կապի մերժում/վերակայում) բազմահաշիվ ռոտացիայի կատարողի համար, երբ ձախողվող հաշիվը չունի հատուկ պրոքսի, կիրառել կարճ սառեցում և բաց թողնել այլ պրոքսի չունեցող հաշիվները հարցման մնացած մասի համար՝ յուրաքանչյուրը նորից փորձելու փոխարեն: Լռելյայն միացված է (անվտանգ է. ելքի IP-ի փոփոխություն չկա, միայն նվազեցնում է ուշացումը/սառեցման ռիսկը ընդհանուր ելքի հաշիվների վրա): Անջատել՝ առաջին պրոքսի չունեցող նետման դեպքում անմիջական տարածումը վերականգնելու համար: | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Պրոքսիի պուլերը և opencode-ի հաշվի ռոտացիան դադարում են նորից սպասարկել պրոքսին, որը նոր է ձախողվել (մերժված TCP զոնդ, կամ դրա միջոցով ստացված 429) գործընթացի համար այն ժամանակահատվածում, որը կրկնապատկվում է յուրաքանչյուր կրկնության դեպքում, մինչև սահմանաչափը: Պրոքսիի կարգավիճակը չի գրվում. յուրաքանչյուր թեկնածուի առանձնացման դեպքում ընտրությունը մնում է անփոփոխ: Լռելյայն անջատված է: | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Ցուցադրել, վահանակի պրոքսիի պուլի տակ, թե քանի դիտարկված ելքի IP է սպասարկել դրա անդամներին վերջին 24 ժամվա ընթացքում և քանի կապ է օգտագործել դրանք: Միայն ընթերցման համար է, հաշվարկվում է պրոքսիի մատյանից, երբեք չի օգտագործվում երթուղի կազմելու համար: Լռելյայն անջատված է: | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | OpenCode կատարողի համար դիտարկել հոսքային Responses պատասխանի առաջին մարմնի բայթը (պատուհան՝ `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, լռելյայն `15000`): 2xx Responses հոսքը, որը լուռ է մնում պատուհանից հետո, համարվում է կանգնած. հաշիվը սառեցվում է, և հարցումը մեկ անգամ անցնում է հաջորդ հաշվին. երկրորդ կանգառը արագ ձախողվում է: Լռելյայն անջատված է. կանգնած հոսքերը պահպանում են այսօրվա սպասումը մինչև հոսքի պատրաստակամության ժամանակի սպառումը: | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | OpenCode կատարող. 403/451 պատասխանի դեպքում, որը պարունակում է `user_blocked` մերժում (ոչ աշխարհագրական, ոչ Cloudflare մատնահետքի մերժում), սառեցնել մերժված հաշիվը և պտտել հաջորդ հաշվին առավելագույնը մեկ անգամ յուրաքանչյուր հարցման համար. երկրորդ մերժումը վերադարձվում է անփոփոխ, առանց հաջողության նշանի: Անջատված է լռելյայն. վերին մակարդակի օգտատիրոջ արգելափակումը շրջանցելը կարող է խուսափում թվալ և տարածել դրոշը ողջ համակարգում: | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | OpenCode ռոտացիա. երկու անընդմեջ ժամանակավոր վերին մակարդակի ձախողումներից հետո (5xx կամ դատարկ 400), դադար տալ հաջորդ հաշվին անցնելուց առաջ՝ 1.5 վրկ կրկնապատկում յուրաքանչյուր հաջորդ ձախողման համար, սահմանափակված 6 վրկ-ով յուրաքանչյուր դադարի և 10 վրկ-ով յուրաքանչյուր հարցման համար, բաց թողնվում է հաճախորդի անջատման դեպքում. ձախողված մարմինը ազատվում է սպասելուց առաջ: Անջատված է լռելյայն. ձախողման դեպքում անցումը մնում է անմիջական: | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | OpenCode ռոտացիա. դադարեցնել հաշիվների ալիքը առաջին 429-ի դեպքում, որը դասակարգվում է որպես իրական սահմանափակում (վերլուծելի `Retry-After`, կամ մարմին, որը նշում է սահմանափակում/օգտագործման սահմանափակում) և վերադարձնել այդ վերին մակարդակի 429-ը անփոփոխ: Չդասակարգված 429-ները շարունակում են պտտվել: Անջատված է լռելյայն. անվճար մակարդակը սահմանափակված է ելքային IP-ի համար (#9611), ուստի յուրաքանչյուր 429 պտտվում է, և սպառված ալիքը վերադարձնում է վերջին վերին մակարդակի 429-ը: | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Անջատել TLS վկայագրի ստուգումը MITM պրոքսիի համար: **Վտանգ:** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Թույլատրել մատակարարի URL-ներ, որոնք ուղղված են մասնավոր/ներքին ցանցերին: | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Թույլատրել մատակարարների ավելացումը/վավերացումը տեղական/մասնավոր հասցեներում (127.0.0.1, localhost, LAN): Միացված է լռելյայն (տեղական-առաջին); անջատել խիստ միայն հանրային արգելափակման համար: Ամպային մետատվյալները մնում են արգելափակված: | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Միացնել Claude Code-ի հետ համատեղելի մատակարարի ռեժիմը: | ### Քաղաքականություններ (5) -| Բանալի | Տեսակ | Լռելյայն | Նկարագրություն | -| ------------------------------- | ------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Գործիքների օգտագործման քաղաքականության կիրառման ռեժիմ։ Արժեքները՝ `disabled`, `warn`, `block`։ | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Ինքնաշխատ կերպով միացնել արագության սահմանափակումը՝ օգտագործման օրինաչափությունների հիման վրա։ | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Բաց թողնել OmniRoute-ի տեղային համատեքստի պատուհանի / մուտքային թոքենների առավելագույն քանակի ստուգումը մեկ մոդելին ուղղված անմիջական հարցումների համար։ Վերին հոսքի սահմանափակումները շարունակում են գործել։ | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Մինչև ուղարկելը մերժել հարցումները, երբ թիրախային մոդելը չունի պահանջվող հնարավորությունները (տեսողություն, գործիքներ, կառուցվածքային ելք, համատեքստի պատուհան)։ Պաշտպանում է մեկ մատակարարին ուղղված անմիջական հարցումները, որոնք շրջանցում են համակցման շերտի համատեղելիության զտիչը։ | -| `RADAR_ENABLED` | boolean | `false` | Միացնել OmniRoute Radar մոդուլը (կատալոգի հոսքի էկրաններ և համաժամացում)։ Լռելյայն անջատված է. միացումը միայն ապակողպում է օգտատիրական միջերեսը. տվյալների համաժամացումը շարունակում է պահանջել առանձին համաձայնություն։ | - -### Կատարման միջավայր (32) - -| Բանալի | Տեսակ | Լռելյայն | Վերագործարկում | Նկարագրություն | -| ------------------------------------------- | ------- | -------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Ստեղծել և ներարկել զրույցների ամփոփագրեր, երբ համակցված երթուղավորումը փոխում է մոդելները։ Անջատեք՝ մոդելների փոխարկումները միմյանցից անկախ մշակելու և բոլոր առկա ու ապագա համակցությունների համար ֆոնային փոխանցման հարցումները կանխելու նպատակով։ | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Հաճախորդներին փոխանցելուց առաջ Responses API-ի միջանցիկ հոսքերից հեռացնել մեկնաբանության փուլի ներքին ելքային տարրերը։ Անջատեք՝ սկզբնաղբյուրից չմշակված մեկնաբանությունները ստանալու համար։ | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Պարտադրել շրջանակային սահմանափակումների պահպանումը MCP գործիքներին հասանելիություն տրամադրելիս։ | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Սեղմել MCP գործիքների նկարագրությունները՝ թոքենների օգտագործումը նվազեցնելու համար։ | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Կատարման ընթացքում միացնել ֆոնային առաջադրանքների մշակումը։ | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Անջատել բոլոր ֆոնային ծառայությունները (քվոտայի թարմացում, համաժամացում և այլն)։ | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Վստահել նախագծի մակարդակի RTK զտիչներին՝ առանց վավերացման։ | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Ներմուծման ժամանակ գործարկել իրական ժամանակի կառավարման վահանակի WebSocket սերվերը (լռելյայն՝ 20132 նավահանգիստ)։ | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Թույլատրել Codex-ին օգտագործել Responses-over-WebSocket փոխանցման եղանակը։ Անջատված լինելու դեպքում Codex-ը վերադառնում է HTTP Responses-ին։ | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Թույլատրել Codex-ին օգտագործել տեղային app-server WebSocket JSON-RPC փոխանցման եղանակը (codexTransport=app-server)։ Անջատված լինելու դեպքում app-server-ն ընտրած կապերը վերադառնում են Codex-ի մյուս փոխանցման եղանակներին։ | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Բյուջեն սպառած հարցումներն ուղղորդել արտակարգ անվճար պահուստային մատակարարին/մոդելին։ (Տե՛ս ստորև՝ [Բյուջեի արտակարգ պահուստային տարբերակ](#emergency-budget-fallback)։) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Միացնել կտրված վերին հոսքի SSE հոսքերի թափանցիկ վաղ վերափորձարկումը՝ նախքան պատասխանի որևէ բայթ հաճախորդին կհասնի։ | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Թույլատրել հոսքի վերականգնման մեխանիզմին կրկին ուղարկել հարցումը և միակցել պատասխանը՝ բայթերն արդեն հաճախորդին հասնելուց հետո։ | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Միջհոսքային շարունակությունը դարձնել գործիքի կանչերի համար անվտանգ․ երբեք չշարունակել կտրված հոսքը, եթե գործիքի կանչ արդեն արտածվել է (ընթացքի մեջ է կամ արդեն ավարտվել է finish_reason tool_calls-ով), և մեկ դատարկ շարունակությունից հետո փակել՝ ամբողջ բյուջեն ծախսելու փոխարեն։ Անջատված՝ թողարկման վարքագիծը։ | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Մեկ անգամ անցնել համարժեք կապի, երբ SSE հոսքը փակվում է՝ առանց որևէ օգտակար շրջանակ արտածելու, և նույն կապի սահմանափակ վերափորձարկման հնարավորությունը սպառված է․ օգտագործելի համարժեք կապի բացակայության դեպքում վերադարձվում է սկզբնական `STREAM_EARLY_EOF` 502-ը։ Լռելյայն անջատված է․ վաղ EOF-ը նույն կապի վերափորձարկումից հետո մնում է վերջնական։ | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | `/v1/models` պատասխաններում ներառել ցուցադրման համար հարմար անվան դաշտեր։ Անջատել այն հաճախորդների համար, որոնք ակնկալում են միայն մոդելների ID-ներ։ | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Կառավարում է, թե ինչպես են մոդելների ID-ները նախածանցվում /v1/models-ում։ 'dual'-ը (լռելյայն) հետադարձ համատեղելիության համար արտածում է թե՛ կեղծանվան, թե՛ կանոնական մատակարարի ID-ի նախածանցները։ 'alias'-ն արտածում է միայն կարճ կեղծանվան նախածանցը (օրինակ՝ ds-web/model, ոչ թե deepseek-web/model)։ 'canonical'-ն արտածում է միայն մատակարարի ամբողջական ID-ի նախածանցը։ Արժեքներ՝ `dual`, `alias`, `canonical`։ | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Միացնել Arena AI առաջատարների աղյուսակի ELO-ի պարբերական համաժամացումը՝ մոդելների բանականության վարկանիշների համար։ | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | `/v1/models`-ում հրապարակել `claude//` հայելային ID-ները, որպեսզի Claude Code gateway-ի մոդելների հայտնաբերման ցանկում ներառվեն ոչ Claude մոդելները։ Եռաստիճան դարպասի գլոբալ մակարդակն է (env-ը գերակայում է վահանակի վերասահմանմանը)։ Տե՛ս [Claude Code-ի կազմաձևումը](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker)։ | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | no-think// gateway կեղծանունների գլխավոր անջատիչը։ Միացված (լռելյայն)՝ /v1/models-ը հրապարակում է առանց մտածողության տարբերակ՝ մտածողություն ապահովող յուրաքանչյուր համապատասխան Claude մոդելի համար, իսկ հարցման մեջ ուղարկված no-think/ ID-ն վերադարձվում է իրական մոդելին՝ անջատված դատողությամբ։ Անջատված՝ որևէ տարբերակ չի հրապարակվում, և no-think/ ID-ն դիտարկվում է ինչպես ցանկացած այլ անհայտ մոդելի ID։ Երբ սա միացված է, յուրաքանչյուր մոդելի `ModelSpec.noThinkingAlias` մասնակցության/չմասնակցության կարգավորումը շարունակում է գործել։ | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Անջատել մտածողության մակարդակի տարբերակների (օրինակ՝ -low, -medium, -high) ստեղծումը /v1/models կատալոգում։ | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Միացնել յուրաքանչյուր վարձակալի համար մատակարարի հարցումների ուղարկման ադապտիվ վիրտուալ ընդունման ուղիները (#9654), որպեսզի մեկ վարձակալի ծանրաբեռնվածության կտրուկ աճն այլևս մյուսի համար 503 չառաջացնի։ `OMNIROUTE_CHAT_VIRTUAL_LANES` env փոփոխականը գերակայում է վահանակի այս վերասահմանմանը․ փոփոխություններն ուժի մեջ են մտնում սերվերը վերագործարկելուց հետո։ | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | /v1/models-ում հրապարակել / հայելային ID-ները այն մոդելների համար, որոնց կանոնական սեփականատերը չունի ակտիվ հավատարմագիր, սակայն ակտիվ հավատարմագրով passthrough gateway-ն ուղղորդում է դրանք։ Զգուշացում․ գլոբալ միացնելու դեպքում կատալոգում գրառումներ է ավելացնում բոլոր հաճախորդների համար։ | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Միացնել մնացորդի հայտնաբերումը New-API / One-API / Sub2API ագրեգատորների հետ համատեղելի հանգույցների համար։ Միացված լինելու դեպքում ագրեգատորի դրոշը սահմանված համատեղելի հանգույցներն իրենց մնացորդը կցուցադրեն վահանակում և քվոտայի նախնական ստուգման ուղղորդման մեջ։ | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Շարունակել սերվերի կողմից կառավարվող գործիքների ոչ հոսքային կանչերը, մինչև մոդելը վերադարձնի հաճախորդի համար կիրառելի պատասխան։ | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Որոնման վիճակագրությունն ու վերջին որոնումները հաշվի են առնում միայն այն մատակարարներին, որոնք դեռ ունեն գործող կապ (առանց բանալիի մատակարարները, օրինակ՝ duckduckgo-free-ը, միշտ հաշվվում են)։ Անջատված վիճակում պահպանվում է մատակարարի ID ունեցող որոնման յուրաքանչյուր պահպանված տող։ | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Վահանակի մատակարարների էջերում Free կրծքանշանը ցուցադրել միայն մատակարարի կողմից պաշտոնապես աջակցվող ազդակների հիման վրա՝ անտեսելով ցուցադրվող անվան վրա հիմնված էվրիստիկան, ոչ boolean տիպի անվճար լինելու դաշտերը և փաստագրված անվճար մակարդակ չունեցող գրանցված մատակարարների :free վերջածանցները։ Անջատված վիճակում պահպանվում է կրծքանշանի պատմական կանոնը։ | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Ագրեգացված 429/503 անհասանելիության պատասխաններում բաց թողնել `Retry-After`-ը, երբ վերափորձարկման որևէ կոնկրետ ապագա ժամանակ հայտնի չէ (արհեստական 1 վրկ-ի փոխարեն), ավելացնել `error.retry_after_provenance` (`signal` \| `none`) և թույլ տալ, որ combo սպառման ուղիները JSON և պարզ տեքստային վերին հոսքի մարմիններից կարդան վերափորձարկման տեքստային հուշումները։ Դաշտը հայտնվում է միայն `unavailableResponse()`-ով ստեղծված պատասխաններում․ մյուս 429/503 մարմինները մնում են անփոփոխ։ | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Երբ միայն քվոտայի սպառման դեպքում պահուստայինի անցնելու համար նշված `priority` համակցված թիրախը դադարեցնում է համակցությունը մի պատճառով, որը հաստատապես կապված չէ քվոտայի հետ (մատակարարի շղթայի անջատիչը բաց է, կանխատեսվող ուշացման պատճառով բաց է թողնվել), քվոտայի հետ կապված թվացող 503-ի փոխարեն վերադարձնել 502։ Արգելափակման, հովացման, անհասանելիության, սպառման և զուգահեռության սահմանաչափի պատճառով դադարեցումները շարունակում են վերադարձնել 503։ | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Առանց լրացուցիչ տվյալների Mistral 401-ը (`{"detail":"Unauthorized"}`, առանց նույնականացման բացահայտ ազդանշանի) նույնական է թե՛ չեղարկված բանալու, թե՛ սպառված քվոտայի դեպքում։ Միացված լինելու դեպքում այն կապը որպես `expired` կայանելու փոխարեն անցկացնում է հովացման ռեժիմի՝ յուրաքանչյուր կապի համար ժամում առավելագույնը 3 անգամ։ Հաջորդ դեպքը կայանում է այն, այնպես որ չեղարկված բանալին, միևնույն է, ի վերջո հայտնաբերվում է։ Լռելյայն անջատված է. Mistral-ի՝ առանց լրացուցիչ տվյալների յուրաքանչյուր 401 պատասխան նախկինի պես կայանում է կապը։ | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Սառեցված ստատիկ սկզբնական ցանկի փոխարեն OAuth կրիչային նշանն օգտագործելով՝ `https://api.x.ai/v1/models` հասցեից ստանալ xAI-ի մոդելների ընթացիկ կատալոգը `xai-oauth` կապերի համար։ Լռելյայն անջատված է. `xai-oauth`-ը շարունակում է անփոփոխ սպասարկել ստատիկ սկզբնական ցանկը։ Որոշման ցանկացած սխալի դեպքում հայտնաբերումը հետ է անցնում սկզբնական ցանկին (ստուգված չէ՝ արդյոք x.ai-ն այս վերջնակետում ընդունում է OAuth կրիչային նշան)։ | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Թույլ տալ, որ ավտոմատ մաքրման գործընթացը ջնջի `OMNIROUTE_BATCH_RETENTION_DAYS`-ից ավելի հին, վերջնական վիճակում գտնվող (ավարտված/ձախողված/չեղարկված/ժամկետանց) Batch API առաջադրանքները՝ դրանց յուրաքանչյուր տողի ստուգակետերի հետ միասին, և մաքրի իրենց սեփական `expires_at`-ը գերազանցած վերբեռնված ֆայլերի BLOB բովանդակությունը։ Լռելյայն անջատված է. գոյություն ունեցող յուրաքանչյուր տեղադրում այս տվյալները պահպանում է ճիշտ այնպես, ինչպես նախկինում, մինչև օպերատորն այն միացնի։ Օպերատորի կողմից գործարկվող `DELETE /api/v1/batches/delete-completed` երթուղին երկու դեպքում էլ չի փոխվում. այն առանձին, անվերապահ հանրային API պայմանագիր է։ | +| Key | Type | Default | Description | +| ------------------------------- | ------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `TOOL_POLICY_MODE` | enum | `disabled` | Գործիքների օգտագործման քաղաքականության կիրարկման ռեժիմ: Արժեքներ՝ `disabled`, `warn`, `block`: | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Ավտոմատ կերպով միացնել հարցումների սահմանափակումը՝ հիմնվելով օգտագործման օրինաչափությունների վրա: | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Բաց թողնել OmniRoute-ի տեղական կոնտեքստային պատուհանի / մուտքային թոքենների առավելագույն քանակի ստուգումը մեկ մոդելի ուղղակի հարցումների համար: Վերին մակարդակի սահմանափակումները դեռ կիրառվում են: | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Մերժել հարցումները մինչև ուղարկելը, եթե թիրախային մոդելը չունի պահանջվող հնարավորություններ (տեսողություն, գործիքներ, կառուցվածքային ելք, կոնտեքստային պատուհան): Պաշտպանում է մեկ մատակարարի ուղղակի հարցումները, որոնք շրջանցում են համատեղելիության ֆիլտրի համակցված շերտը: | +| `RADAR_ENABLED` | boolean | `false` | Միացնել OmniRoute Radar մոդուլը (կատալոգի հոսքի էկրաններ և համաժամացում): Անջատված է լռելյայն. միացնելը միայն բացում է ինտերֆեյսը՝ տվյալների համաժամացումը մնում է առանձին ընտրովի գործառույթ: | + +### Գործարկման ժամանակ (33) + +| Key | Type | Default | Restart | Description | +| ------------------------------------------- | ------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Ստեղծել և ներարկել խոսակցության ամփոփագրեր, երբ կոմբո երթուղին փոխում է մոդելները։ Անջատել՝ մոդելների անցումները անկախ դիտարկելու և բոլոր առկա ու ապագա կոմբոների համար ֆոնային հանձնման հարցումները կանխելու համար։ | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Հեռացնել ներքին մեկնաբանական փուլի ելքային տարրերը Responses API-ի փոխանցման հոսքերից՝ նախքան դրանք հաճախորդներին փոխանցելը։ Անջատել՝ ստանալու համար չմշակված վերին հոսքի մեկնաբանությունները։ | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Կիրառել շրջանակային սահմանափակումներ MCP գործիքի մուտքի նկատմամբ։ | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Սեղմել MCP գործիքի նկարագրությունները՝ թոքենների օգտագործումը նվազեցնելու համար։ | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Միացնել ֆոնային առաջադրանքների մշակումը գործարկման ժամանակ։ | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Անջատել բոլոր ֆոնային ծառայությունները (քվոտայի թարմացում, համաժամացում և այլն)։ | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Վստահել նախագծի մակարդակի RTK զտիչներին՝ առանց վավերացման։ | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Ներմուծման ժամանակ սկսել իրական ժամանակի կառավարման վահանակի WebSocket սերվերը (լռելյայն՝ պորտ 20132)։ | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Թույլ տալ Codex-ին օգտագործել Responses-over-WebSocket տրանսպորտը։ Երբ անջատված է, Codex-ը վերադառնում է HTTP պատասխաններին։ | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Թույլ տալ Codex-ին օգտագործել տեղական հավելվածի սերվերի WebSocket JSON-RPC տրանսպորտը (codexTransport=app-server)։ Երբ անջատված է, app-server-ի համար ընտրված կապերը վերադառնում են Codex-ի այլ տրանսպորտներին։ | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Ուղղորդել բյուջեն սպառած հարցումները արտակարգ անվճար պահեստային մատակարարին/մոդելին։ (Տե՛ս [Արտակարգ բյուջեի պահեստային տարբերակ](#emergency-budget-fallback) ստորև։) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Միացնել թափանցիկ վաղ կրկնակի փորձը կտրված վերին հոսանքի SSE հոսքերի համար, մինչև որևէ պատասխան բայթ հասնի հաճախորդին։ | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Թույլ տալ հոսքի վերականգնմանը կրկին հարցում կատարել և միացնել պատասխանը այն բանից հետո, երբ բայթերն արդեն հասել են հաճախորդին։ | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Դարձնել միջհոսքային շարունակությունը գործիքի կանչի համար անվտանգ. երբեք չվերսկսել կտրված հոսքը, երբ գործիքի կանչ է արձակվել (ընթացքի մեջ կամ արդեն ավարտված finish_reason tool_calls-ով), և փակել մեկ դատարկ շարունակությունից հետո՝ ամբողջ բյուջեն ծախսելու փոխարեն։ Անջատված է. թողարկման վարքագիծ։ | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Անցում կատարել մեկ անգամ քույր կապի, երբ SSE հոսքը փակվում է՝ նախքան որևէ օգտակար կադր արձակելը, և սահմանափակ նույն-կապի վերափորձը սպառված է. առանց օգտագործելի քույր կապի վերադարձվում է բնօրինակ `STREAM_EARLY_EOF` 502-ը։ Անջատված է լռելյայնորեն. վաղ-EOF-ը մնում է տերմինալային նույն-կապի վերափորձից հետո։ | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Ներառել ցուցադրման համար հարմար անվան դաշտեր `/v1/models` պատասխաններում։ Անջատել այն հաճախորդների համար, որոնք ակնկալում են միայն մոդելի ID-ներ։ | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Վերահսկում է, թե ինչպես են մոդելի ID-ները նախածանցվում /v1/models-ում։ 'dual' (լռելյայն) արձակում է ինչպես կեղծանուն, այնպես էլ կանոնիկ մատակարարի-ID նախածանցներ՝ հետադարձ համատեղելիության համար։ 'alias'-ը արձակում է միայն կարճ կեղծանունի նախածանցը (օրինակ՝ ds-web/model, ոչ deepseek-web/model)։ 'canonical'-ը արձակում է միայն մատակարարի-ID-ի ամբողջական նախածանցը։ Արժեքներ՝ `dual`, `alias`, `canonical`։ | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Միացնել պարբերական Arena AI առաջատարների աղյուսակի ELO համաժամացումը մոդելի ինտելեկտի վարկանիշների համար։ | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Գովազդել `claude//` հայելային ID-ները `/v1/models`-ում, որպեսզի Claude Code դարպասի մոդելների հայտնաբերումը ցուցակագրի ոչ-Claude մոդելները։ Եռաստիճան դարպասի գլոբալ մակարդակ (միջավայրը գերակայում է կառավարման վահանակի վերագրմանը)։ Տե՛ս [Claude Code կոնֆիգուրացիան](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker)։ | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Հիմնական անջատիչ no-think// դարպասի կեղծանունների համար։ Միացված (լռելյայն). /v1/models-ը գովազդում է առանց մտածելու տարբերակ յուրաքանչյուր համապատասխան մտածելու ունակ Claude մոդելի համար, և հարցման վրա ուղարկված no-think/ ID-ն լուծվում է իրական մոդելի՝ ճնշված դատողությամբ։ Անջատված. ոչ մի տարբերակ չի գովազդվում, և no-think/ ID-ն մշակվում է ինչպես ցանկացած այլ անհայտ մոդելի ID։ Մոդել առ մոդել ModelSpec.noThinkingAlias ընտրությունը/հրաժարումը դեռևս կիրառելի է, քանի դեռ սա միացված է։ | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Անջատել մտածողության մակարդակի տարբերակների (օրինակ՝ -low, -medium, -high) ստեղծումը /v1/models կատալոգում։ | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Միացնել յուրաքանչյուր վարձակալի համար հարմարվողական վիրտուալ ընդունելության ուղիներ մատակարարի առաքման համար (#9654). մեկ վարձակալի պայթյունն այլևս չի առաջացնում 503 սխալ մյուսի համար։ OMNIROUTE_CHAT_VIRTUAL_LANES միջավայրի փոփոխականը գերակայում է այս կառավարման վահանակի վերագրմանը. փոփոխությունները ուժի մեջ են մտնում սերվերի վերագործարկումից հետո։ | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Գովազդել / հայելային ID-ները /v1/models-ում այն մոդելների համար, որոնց կանոնական սեփականատերը չունի ակտիվ հավատարմագրեր, բայց ակտիվ հավատարմագրերով անցումային դարպասը (passthrough gateway) դրանք ուղղորդում է: Զգուշացում. գլոբալ միացնելիս բոլոր հաճախորդների համար ավելացնում է կատալոգի գրառումներ: | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Միացնել հաշվեկշռի հայտնաբերումը New-API / One-API / Sub2API ագրեգատորի հետ համատեղելի հանգույցների համար: Միացված լինելու դեպքում, ագրեգատորի դրոշակով համատեղելի հանգույցները կհաղորդեն իրենց հաշվեկշիռը կառավարման վահանակում և քվոտայի նախնական երթուղավորման ժամանակ: | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Շարունակել ոչ հոսքային սերվերի կողմից սեփականացված գործիքների կանչերը, մինչև մոդելը վերադարձնի հաճախորդի կողմից օգտագործելի պատասխան: | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Որոնման վիճակագրությունը և վերջին որոնումները հաշվում են միայն այն մատակարարներին, որոնք դեռ ունեն ակտիվ կապ (առանց բանալի մատակարարները, ինչպիսիք են duckduckgo-free-ը, միշտ հաշվվում են): Անջատված վիճակում պահպանվում է յուրաքանչյուր պահպանված որոնման տող՝ մատակարարի ID-ով: | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Կառավարման վահանակի մատակարարների էջեր. ցուցադրել «Անվճար» կրծքանշանը միայն այն ազդանշանների վրա, որոնք մատակարարը հարգում է. հեռացնում է ցուցադրվող անվան էվրիստիկան, ոչ բուլյան անվճար դաշտերը և :free վերջածանցները գրանցված մատակարարների վրա՝ առանց փաստաթղթավորված անվճար մակարդակի: Անջատված վիճակում պահպանվում է կրծքանշանի պատմական կանոնը: | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Ագրեգացված 429/503 անհասանելի պատասխանների դեպքում բաց թողնել `Retry-After`-ը, երբ հայտնի չէ վերափորձի կոնկրետ ապագա ժամանակը (սինթետիկ 1 վայրկյանի փոխարեն), ավելացնել `error.retry_after_provenance` (`signal` \| `none`), և թույլ տալ, որ կոմբո ջրահեռացման ուղիները կարդան վերափորձի արձակ հուշումները JSON և պարզ տեքստային վերին հոսքի մարմիններից: Դաշտը հայտնվում է միայն `unavailableResponse()`-ի կողմից կառուցված պատասխաններում. մյուս 429/503 մարմինները մնում են անփոփոխ: | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Երբ `priority` կոմբո թիրախը, որը նշված է որպես միայն քվոտայի սպառման դեպքում պահեստային (fallback-only-on-quota-exhaustion), դադարեցնում է կոմբոն մի պատճառով, որն ապացուցելիորեն քվոտա չէ (մատակարարի անջատիչը բաց է, կանխատեսվող ուշացման բացթողում), պատասխանել 502-ով՝ քվոտա հիշեցնող 503-ի փոխարեն: Արգելափակումը, սառեցումը, անհասանելիությունը, սպառումը և միաժամանակյա հնարավորությունների սահմանափակումը պահպանում են 503-ը: | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Մերկ Mistral 401-ը (`{"detail":"Unauthorized"}`, առանց հստակ նույնականացման ազդանշանի) նույնական է չեղյալ հայտարարված բանալու և սպառված քվոտայի համար: Միացված լինելու դեպքում այն սառեցնում է կապը՝ այն որպես `expired` կայանելու փոխարեն, առավելագույնը ժամում 3 անգամ յուրաքանչյուր կապի համար. հաջորդը կայանում է այն, այնպես որ չեղյալ հայտարարված բանալին դեռևս համընկնում է: Լռելյայն անջատված է. յուրաքանչյուր մերկ Mistral 401 կայանում է կապը, ինչպես նախկինում: | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Բերել xAI մոդելների կատալոգը `xai-oauth` կապերի համար `https://api.x.ai/v1/models`-ից՝ օգտագործելով OAuth bearer թոքենը, սառեցված ստատիկ սիդի փոխարեն։ Անջատված է լռելյայն. `xai-oauth`-ը շարունակում է մատուցել ստատիկ սիդը անփոփոխ։ Ցանկացած լուծման սխալի դեպքում, հայտնաբերումը վերադառնում է սիդին (չի ստուգվել, թե արդյոք x.ai-ն ընդունում է OAuth bearer այս էնդփոյնթում)։ | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Թույլ տալ ավտոմատ մաքրմանը ջնջել տերմինալային (ավարտված/ձախողված/չեղարկված/ժամկետանց) Batch API աշխատանքները, որոնք ավելի հին են, քան `OMNIROUTE_BATCH_RETENTION_DAYS`-ը, իրենց տողային անցակետերի հետ միասին, և մաքրել վերբեռնված ֆայլերի BLOB բովանդակությունը իրենց `expires_at`-ից հետո։ Անջատված է լռելյայն. յուրաքանչյուր գոյություն ունեցող տեղադրում պահպանում է այս տվյալները ճիշտ այնպես, ինչպես նախկինում, մինչև օպերատորը չընտրի այն։ Օպերատորի կողմից գործարկվող `DELETE /api/v1/batches/delete-completed` երթուղին անփոփոխ է ցանկացած դեպքում. դա առանձին, անվերապահ հանրային API պայմանագիր է։ | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Պահպանել ընտրված Antigravity հաշիվը այն հարցման հոսքային կյանքի ցիկլի համար, որն ընտրել է այն, որպեսզի միաժամանակյա կրկնակի փորձը կամ հավատարմագրերի փոխանցումը չկարողանան նորից ընտրել արդեն իսկ ընթացիկ հոսքին հատկացված հաշիվ։ Ամրագրումը սահմանափակված է (կապ, կանչվող վերին մոդել) շրջանակով, այնպես որ մեկ հաշիվը դեռ կարող է միաժամանակ սպասարկել երկու տարբեր մոդելներ։ Երբ յուրաքանչյուր իրավասու հաշիվ արդեն վարձակալված է այդ մոդելի համար, հարցումը վերադարձնում է կառուցվածքային 503 `antigravity_pool_busy` սահմանափակ `Retry-After`-ով՝ զբաղված հաշվի վրա կուտակվելու փոխարեն։ Անջատված է լռելյայն. հաշվի ընտրությունը մնում է ճիշտ այնպես, ինչպես նախկինում, և ոչ մի ամրագրում չի կատարվում։ | ### CLI (5) -| Բանալի | Տեսակ | Լռելյայն | Վերագործարկում | Նկարագրություն | -| ------------------------------------- | ------- | -------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Միացնել համատեղելիության ռեժիմը բոլոր CLI սպասառուների համար։ | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Միացնել մոդելների այլանունների համատեղելիության շերտը։ | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Միացնել գնագոյացման տվյալների ավտոմատ համաժամացումը (պահանջվում է նաև `PRICING_SYNC_ENABLED` միջավայրի փոփոխականը)։ | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Մատակարարի մոդելների համաժամացումից հետո ընթացիկ կատալոգից ավտոմատ կերպով (վերա)գրել ~/.codex/*.config.toml պրոֆիլների ֆայլերը։ Երբեք չի փոխում Codex-ի ակտիվ/լռելյայն կազմաձևը։ Լռելյայն անջատված է։ | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Մատակարարի մոդելների համաժամացումից հետո ընթացիկ կատալոգից ավտոմատ կերպով (վերա)գրել ~/.claude/profiles//settings.json Claude Code պրոֆիլները։ Երբեք չի փոխում Claude-ի ակտիվ/լռելյայն կազմաձևը։ Լռելյայն անջատված է։ | - -### Առողջական վիճակ (5) - -| Բանալի | Տեսակ | Լռելյայն | Նկարագրություն | -| ----------------------------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Անջատել տեղական օրինակի առողջության ստուգման վերջնակետը։ | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Անջատել թոքենի վավերացման առողջության ստուգումը։ | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Միացնել ցանցային հասանելիությունը հմտությունների մեկուսացված միջավայրում։ | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Պրոքսիի առողջության պարբերական ստուգման ընթացքում թիրախի կողմից մերժված փորձը (401/403/429) զրոյացնում է պրոքսիի հաջորդական ձախողումների շարքը։ Լռելյայն անջատված է. մերժումը մնում է չեզոք (#10654)։ 5xx-ն երկու դեպքում էլ մնում է անորոշ. մերժումը երբեք չի հեռացնում, անջատում կամ վերաակտիվացնում պրոքսին։ | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Գործարկել DB-ի ամբողջականության/առողջության մեկնարկային ստուգումն այն բանից հետո, երբ սերվերը սկսի ընդունել հարցումներ (`setImmediate`-ի միջոցով), այլ ոչ թե արգելափակել մեկնարկը մինչև դրա ավարտը (#13717)։ Լռելյայն անջատված է. մեկնարկն արգելափակվում է ճիշտ այնպես, ինչպես այս PR-ից առաջ։ | - -> [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD`-ը և դրա հին այլանունը՝ +| Key | Type | Default | Restart | Description | +| ------------------------------------- | ------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Միացնել համատեղելիության ռեժիմը բոլոր CLI հաճախորդների համար։ | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Միացնել մոդելի կեղծանունների համատեղելիության շերտը։ | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Միացնել գնային տվյալների ավտոմատ համաժամացումը (նաև պահանջում է `PRICING_SYNC_ENABLED` միջավայրի փոփոխականը)։ | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Պրովայդերի մոդելի համաժամացումից հետո ավտոմատ կերպով (վերա)գրել ~/.codex/*.config.toml պրոֆիլի ֆայլերը կենդանի կատալոգից։ Երբեք չի փոխում ակտիվ/լռելյայն Codex կոնֆիգուրացիան։ Անջատված է լռելյայն։ | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Պրովայդերի մոդելի համաժամացումից հետո ավտոմատ կերպով (վերա)գրել ~/.claude/profiles//settings.json Claude Code պրոֆիլները կենդանի կատալոգից։ Երբեք չի փոխում ակտիվ/լռելյայն Claude կոնֆիգուրացիան։ Անջատված է լռելյայն։ | + +### Առողջություն (5) + +| Բանալի | Տեսակ | Լռակյաց | Նկարագրություն | +| :---------------------------------------- | :------ | :------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | բուլյան | `false` | Անջատել տեղական օրինակի առողջության ստուգման վերջնակետը։ | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | բուլյան | `false` | Անջատել թոքենի վավերացման առողջության ստուգումը։ | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | բուլյան | `false` | Միացնել ցանցային մուտքը հմտությունների սենդբոքսի միջավայրում։ | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | բուլյան | `false` | Պրոքսիի առողջության ստուգման ժամանակ, թիրախի կողմից մերժված (401/403/429) զոնդը վերակայում է պրոքսիի հաջորդական ձախողումների շարքը։ Լռակյաց անջատված է. մերժումը մնում է չեզոք (#10654)։ 5xx-ը մնում է անորոշ ցանկացած դեպքում. մերժումը երբեք չի հեռացնում, անջատում կամ նորից ակտիվացնում պրոքսին։ | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | բուլյան | `false` | Գործարկել մեկնարկային DB ամբողջականության/առողջության ստուգումը սերվերի կողմից հարցումներ ընդունելուց հետո (միջոցով `setImmediate`)՝ մեկնարկը արգելափակելու փոխարեն, մինչև այն ավարտվի (#13717)։ Լռակյաց անջատված է. մեկնարկը արգելափակվում է ճիշտ այնպես, ինչպես այս PR-ից առաջ։ | + +> [!ՆՇՈՒՄ] +> `INPUT_SANITIZER_BLOCK_THRESHOLD`-ը և դրա հնացած կեղծանունը՝ > `INJECTION_GUARD_BLOCK_THRESHOLD`-ը, կարգավորում են -> `INJECTION_GUARD_MODE`-ի `block` ռեժիմը, սակայն դրանք սովորական միջավայրի փոփոխականներ են, որոնք ընթերցվում են -> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts)-ի կողմից, -> այլ ոչ թե ֆունկցիոնալ դրոշներ. դրանք չունեն DB-ի միջոցով վերասահմանում կամ կառավարման վահանակի փոխարկիչ։ Տե՛ս -> [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication)։ - -> [!NOTE] -> `Restart` սյունակը նշում է `requiresRestart: true` ունեցող դրոշները. արժեքը -> պահպանվում է անմիջապես, սակայն ուժի մեջ է մտնում միայն գործընթացը վերագործարկելուց հետո։ Թվարկման -> դրոշները մերժում են իրենց թույլատրելի բազմությունից դուրս ցանկացած արժեք (սերվերի կողմում վավերացվում է -> ինչպես `setFeatureFlagOverride()`-ում, այնպես էլ REST-ի `PUT` մշակիչում)։ +> `INJECTION_GUARD_MODE`-ի `block` ռեժիմը, սակայն դրանք սովորական միջավայրի +> փոփոխականներ են, որոնք կարդացվում են +> [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts)-ի +> կողմից, այլ ոչ թե ֆունկցիոնալ դրոշներ. դրանք չունեն DB-ի վերասահմանում և +> վահանակի անջատիչ։ Տե՛ս [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication)։ + +> [!ՆՇՈՒՄ] +> `Restart` սյունակը նշում է դրոշները `requiresRestart: true` արժեքով. +> արժեքը պահպանվում է ակնթարթորեն, բայց ուժի մեջ է մտնում միայն պրոցեսի +> վերաբեռնումից հետո։ Թվարկվող դրոշները մերժում են ցանկացած արժեք, որը դուրս է +> իրենց թույլատրելի հավաքածուից (վավերացված սերվերի կողմից ինչպես +> `setFeatureFlagOverride()`-ում, այնպես էլ REST `PUT` հենդլերում)։ --- -## Դրոշների փոխարկում +## Դրոշակների փոփոխում ### Կառավարման վահանակ -Անցեք **Կառավարման վահանակ → Կարգավորումներ → Ֆունկցիոնալ դրոշներ** -(`/dashboard/settings/feature-flags`)։ Ցանցը +Անցեք **Կառավարման վահանակ → Կարգավորումներ → Ֆունկցիոնալ դրոշակներ** +(`/dashboard/settings/feature-flags`): Ցանցը (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) աջակցում է՝ -- **Որոնում** ըստ բանալու կամ նկարագրության և **զտում** ըստ կատեգորիայի (ինչպես նաև սինթետիկ - **Պահանջում է վերագործարկում** տեսք)։ -- Բուլյան դրոշների համար՝ **փոխարկիչ**, իսկ թվարկման դրոշների համար՝ **բացվող ցանկ** - (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`)։ -- Յուրաքանչյուր դրոշի համար **աղբյուրի նշան**՝ `DB`, `ENV` կամ `DEF`, որը ցույց է տալիս, թե որտեղից - է ստացվել գործող արժեքը։ -- **Վերակայել** կոճակ (ցուցադրվում է միայն `DB` աղբյուրով դրոշների համար)՝ վերագրումը հեռացնելու համար, - և ներքևում՝ **Վերակայել բոլոր վերագրումները** կոճակ։ -- **Վերագործարկել սերվերը** ազդապաստառ, երբ փոխվում է `requiresRestart` դրոշը։ +- **Որոնում** բանալիով կամ նկարագրությամբ, և **ֆիլտրում** ըստ կատեգորիայի (գումարած սինթետիկ + **Պահանջում է վերագործարկում** տեսքը): +- Միացման/անջատման **անջատիչ** բուլյան դրոշակների համար և **բացվող ցուցակ** enum դրոշակների համար + (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`): +- Յուրաքանչյուր դրոշակի համար **աղբյուրի նշան** — `DB`, `ENV`, կամ `DEF` — ցույց տալով, թե որտեղից է + ստացվել արդյունավետ արժեքը: +- **Վերակայել** կոճակ (ցուցադրվում է միայն `DB`-ից ստացված դրոշակների համար)՝ վերացնելու վերասահմանումը, + և **Վերակայել բոլոր վերասահմանումները** կոճակը ներքևում: +- **Վերագործարկել սերվերը** պաստառ, երբ `requiresRestart` դրոշակը փոփոխվում է: ### REST API -Բոլոր գործողություններն իրականացվում են մեկ երթուղու միջոցով՝ -[`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts)։ -Յուրաքանչյուր մեթոդ պահանջում է կառավարման վահանակի նույնականացված աշխատաշրջան (հակառակ դեպքում՝ `401`)։ +Բոլոր գործողություններն անցնում են մեկ երթուղով՝ +[`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts): +Յուրաքանչյուր մեթոդ պահանջում է վավերացված կառավարման վահանակի սեսիա (հակառակ դեպքում՝ `401`): #### `GET /api/settings/feature-flags` -Վերադարձնում է յուրաքանչյուր դրոշը՝ դրա գործող արժեքով, աղբյուրով և ամփոփագրով։ +Վերադարձնում է յուրաքանչյուր դրոշակ իր արդյունավետ արժեքով, աղբյուրով և ամփոփագրով: ```jsonc { "flags": [ { "key": "REQUIRE_API_KEY", - "label": "Պահանջել API բանալի", - "description": "Պահանջել API բանալի բոլոր մուտքային հարցումների համար", + "label": "Require API Key", + "description": "Require an API key for all incoming requests", "category": "security", "type": "boolean", "enumValues": null, @@ -210,7 +213,7 @@ "requiresRestart": false, "warningLevel": "caution", }, - // ... բոլոր 72 դրոշները + // ... all 74 flags ], "summary": { "total": 56, @@ -224,34 +227,34 @@ #### `PUT /api/settings/feature-flags` -Սահմանում կամ հեռացնում է մեկ վերագրում։ Մարմինը՝ `{ key: string; value?: string }`։ -`value`-ի բացթողումը հեռացնում է վերագրումը (վերականգնելով env / լռելյայն արժեքը)։ +Սահմանել կամ հեռացնել մեկ վերասահմանում: Մարմինը՝ `{ key: string; value?: string }`: +`value`-ի բացթողումը հեռացնում է վերասահմանումը (վերականգնելով միջավայրի / լռելյայն արժեքը): ```bash -# Սահմանել DB վերագրում +# Set a DB override curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Հեռացնել վերագրումը (առանց "value"-ի) +# Remove the override (no "value") curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Պատասխանը վերադարձնում է նոր `effectiveValue`/`source`-ը, `previousValue`/ -`previousSource`-ը և `requiresRestart`-ը։ Անհայտ բանալիները և թույլատրելի տիրույթից դուրս թվարկման -արժեքները մերժվում են `400` կոդով։ +Պատասխանը արտացոլում է նոր `effectiveValue`/`source`-ը, `previousValue`/ +`previousSource`-ը և `requiresRestart`-ը: Անհայտ բանալիները և միջակայքից դուրս enum +արժեքները մերժվում են `400` կոդով: #### `DELETE /api/settings/feature-flags` -Միանգամից մաքրում է DB-ի **բոլոր** վերագրումները՝ յուրաքանչյուր դրոշը վերադարձնելով իր env / լռելյայն -արժեքին։ Վերադարձնում է `{ cleared: , message: "..." }`։ +Միանգամից մաքրում է **բոլոր** DB վերասահմանումները՝ վերականգնելով յուրաքանչյուր դրոշակ իր միջավայրի / լռելյայն +արժեքին: Վերադարձնում է `{ cleared: , message: "..." }`: -> [!NOTE] -> `requiresRestart: true` ունեցող դրոշներն ուժի մեջ են մտնում միայն գործընթացի վերաբեռնումից հետո։ -> Կառավարման վահանակի վերագործարկման հոսքը կանչում է `POST /api/restart`, ապա պարբերաբար հարցում է ուղարկում -> `GET /api/health/ping` հասցեին, մինչև սերվերը կրկին հասանելի դառնա։ +> [!ՆՇՈՒՄ] +> Դրոշակները, որոնք ունեն `requiresRestart: true`, ուժի մեջ են մտնում միայն պրոցեսի վերաբեռնումից հետո: +> Կառավարման վահանակի վերագործարկման հոսքը կանչում է `POST /api/restart`, այնուհետև հարցում է կատարում +> `GET /api/health/ping` մինչև սերվերի վերագործարկումը: --- diff --git a/docs/i18n/hy/docs/routing/REASONING_REPLAY.md b/docs/i18n/hy/docs/routing/REASONING_REPLAY.md index a55366393ec5..7560dc78b8d5 100644 --- a/docs/i18n/hy/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/hy/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ OmniRoute-ը գրանցում է մտածողության ռեժիմով մոդ ## Ճարտարապետություն ``` -Փուլ N (օգնականը ստեղծում է). - → պատասխանը պարունակում է reasoning_content + tool_calls - → եթե requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - գրում է (հիշողություն + DB)՝ որպես բանալի օգտագործելով յուրաքանչյուր tool_call.id - → պատասխանը փոխանցում է հաճախորդին (որը կարող է պահպանել կամ չպահպանել հիմնավորումը) - -Փուլ N+1 (հաճախորդն ուղարկում է հաջորդ հարցումը). - → փոխակերպիչը հայտնաբերում է՝ requiresReasoningReplay(provider, model) === true - → tool_calls ունեցող և reasoning_content չունեցող օգնականի յուրաքանչյուր հաղորդագրության համար. - lookupReasoning(toolCalls[0].id) → հիշողություն → DB - գտնվել է → msg.reasoning_content = cached; recordReplay() - չի գտնվել → msg.reasoning_content = "" (հետադարձ համատեղելիության տարբերակ հին DeepSeek-ի համար) - → վերին մակարդակի ծառայությունը ստանում է հետևողական պատմություն → 400 սխալ չի առաջանում +Turn N (assistant generates): + → response contains reasoning_content + tool_calls + → if requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() + writes (memory + DB), keyed by every tool_call.id + → forward response to client (which may or may not retain reasoning) + +Turn N+1 (client sends follow-up): + → translator detects: requiresReasoningReplay(provider, model) === true + → for each assistant message with tool_calls and no reasoning_content: + lookupReasoning(toolCalls[0].id) → memory → DB + hit → msg.reasoning_content = cached; recordReplay() + miss → msg.reasoning_content = "" (legacy fallback for older DeepSeek) + → upstream sees consistent history → no 400 ``` -Գրանցումը կատարվում է `open-sse/handlers/chatCore.ts`-ում (երկու տեղում՝ `cacheReasoningFromAssistantMessage`-ի կանչման երկու կետերում)։ Կրկին փոխանցումը կատարվում է `open-sse/translator/index.ts`-ում՝ սխեմայի հարկադիր փոխակերպումից հետո, սակայն ուղարկումից առաջ։ +Ֆիքսումը (Capture) կատարվում է `open-sse/handlers/chatCore.ts`-ում (երկու տեղում՝ `cacheReasoningFromAssistantMessage`-ի կանչի երկու կետերում): Վերարտադրումը (Replay) կատարվում է `open-sse/translator/index.ts`-ում՝ սխեմայի ձևափոխումից հետո, բայց մինչև ուղարկելը (dispatch): + +Պարզ (առանց գործիքի կանչի) ասիստենտի քայլերը (turns) նույնականացվում են այլ կերպ. `buildAssistantMessageCacheKey()`-ը մշակում է սեսիայի շրջանակը գումարած OpenAI ձևաչափով նորմալացված տեքստը (transcript) մինչև այդ քայլը, քանի որ DeepSeek-ը պահանջում է _բոլոր_ նախորդ քայլերի տրամաբանությունը (reasoning), հենց որ առկա են `tools`-ները: Responses-API թիրախների համար (օրինակ՝ `opencode-go/deepseek-v4-flash`, որը ուղղորդվում է դեպի `/responses`), վերին հոսքի (upstream) մարմինը պարունակում է `input`, այլ ոչ թե `messages`, ուստի `translateRequest()`-ը (`open-sse/translator/index.ts`) հաղորդում է հենակետային (pivot) տեքստը, որը մշակել է հետկանչի (callback) տարբերակի միջոցով, և ֆիքսման կետերը մշակում են նույն տեքստը: Responses-ի վերարտադրման փուլն աշխատում է OpenAI-ի հենակետի վրա յուրաքանչյուր ելնային ձևաչափի համար, այնպես որ Anthropic Messages հաճախորդները նույնպես (Claude → OpenAI → Responses) վերարտադրվում են: ## Պահեստավորում — Հիբրիդային հիշողություն + SQLite diff --git a/docs/i18n/hy/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/hy/docs/security/SOCKET_DEV_FINDINGS.md index 4aff6c4096b5..c5ca56876711 100644 --- a/docs/i18n/hy/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/hy/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,21 +4,15 @@ --- -Այս փաստաթուղթը սպասարկողի կողմից կազմված հավաստագիրն է՝ `omniroute@3.8.5`-ի վերաբերյալ ներկայացված վեց -`AI-detected potential malware` հայտնաբերումների և -`omniroute@3.8.6`-ում կիրառված մեղմման միջոցների համար։ Այն գոյություն ունի, որպեսզի՝ - -1. Անվտանգության մշակման շղթայի օպերատորներն ունենան հղման միասնական աղբյուր, երբ անհրաժեշտ է - հայտնաբերումները գնահատել փաստացի սկզբնական կոդի համեմատ։ -2. Ապագա AI սկանավորիչները կարողանան հայտնաբերել սպասարկողի կողմից ստորագրված պնդումը, որ յուրաքանչյուր - նշված ուղի միտումնավոր է, ըստ ցանկության միացվող և փաստաթղթավորված։ -3. Մենք ունենանք գրավոր արձանագրություն այն մասին, թե _ինչու_ է յուրաքանչյուր կանչի հատված հենց այդպես կառուցված — - որպեսզի ապագա վերակազմավորումը պատահաբար կրկին չներմուծի մի հատկանիշ, որը - միտումնավոր հեռացվել էր։ - -Եթե դուք գործարկում եք սկանավորիչ, որը v3.8.6-ի մեղմման միջոցների թողարկումից հետո կրկին նշում է ստորև -բերված կանչի հատվածներից որևէ մեկը, խնդրում ենք բացել խնդիր՝ կցելով սկանավորման հետագիծը, և -մենք այստեղ կընդլայնենք հավաստագիրը։ +> **Ծավալի նշում:** `socket.yml`-ը կազմաձևում է Socket.dev-ի ռեգիստրի կողմից npm արտեֆակտի հրապարակումից հետո սկանավորումը (անտեսվող ուղիներ չառաքվող բովանդակության համար, ինչպիսիք են `tests/`, `docs/` և կառուցման հաշվետվությունները): Այն չի միացնում CI/PR միաձուլման դարպասը — ոչ մի աշխատանքային հոսք `.github/workflows`-ում, ոչ մի `package.json` սկրիպտ և ոչ մի `Makefile` թիրախ չի կանչում Socket.dev-ը: + +Այս փաստաթուղթը սպասարկողի կողմից հեղինակված հավաստագիրն է `omniroute@3.8.5`-ի դեմ բարձրացված վեց `AI-detected potential malware` հայտնաբերումների և `omniroute@3.8.6`-ում կիրառված մեղմացումների վերաբերյալ: Այն գոյություն ունի, որպեսզի. + +1. Անվտանգության խողովակաշարի օպերատորները ունենան մեկ հղում՝ մեջբերելու համար, երբ անհրաժեշտ է գնահատել հայտնաբերումները իրական աղբյուրի համեմատ: +2. Ապագա AI սկաներները կարողանան վերցնել սպասարկողի կողմից ստորագրված պնդումը, որ յուրաքանչյուր նշված ուղի դիտավորյալ է, կամավոր ընտրված և փաստաթղթավորված: +3. Մենք ունենանք գրավոր արձանագրություն, թե _ինչու_ է յուրաքանչյուր կանչի կայք ձևավորված այնպես, ինչպես կա — որպեսզի ապագա վերակառուցումը պատահաբար չվերաներկայացնի մի մատնահետք, որը դիտավորյալ հեռացվել էր: + +Եթե դուք շահագործում եք սկաներ, որը կրկին նշում է ստորև նշված կանչի կայքերից որևէ մեկը այն բանից հետո, երբ v3.8.6 մեղմացումներն առաքվել են, խնդրում ենք բացել խնդիր սկանավորման հետքով, և մենք կընդլայնենք հավաստագիրը այստեղ: --- diff --git a/docs/i18n/id/README.md b/docs/i18n/id/README.md index 341cc3aaf6bf..81b73ac81532 100644 --- a/docs/i18n/id/README.md +++ b/docs/i18n/id/README.md @@ -19,17 +19,17 @@
-## 💰 ~1,62 Miliar Token Gratis / Bulan +## 💰 ~1.62B Token Gratis / Bulan
-> Menggabungkan paket gratis secara manual sangat merepotkan — puluhan SDK, puluhan batas laju, dan Anda tidak tahu berapa banyak yang sebenarnya tersedia. OmniRoute mengatalogkan **491 entri paket gratis di 35 kunci pool berulang** dan menghitung total token utama berdasarkan **17 pool dengan anggaran bulanan positif yang dipublikasikan ditambah lima batas Groq per model**, yang dideduplikasi berdasarkan pool bersama. Kuota yang hanya tersedia setelah pemeriksaan identitas regional (saat ini: ModelScope) ditampilkan secara terpisah, +~6 juta di balik verifikasi identitas regional, dan tidak pernah dijumlahkan ke dalam total utama. Hasilnya tetap terlihat di dasbor (`/dashboard/free-tiers`). +> Menggabungkan tingkatan gratis secara manual itu menyakitkan — puluhan SDK, puluhan batas laju, dan tidak tahu berapa banyak yang sebenarnya Anda miliki. OmniRoute mengkatalogkan **489 entri tingkatan gratis di 35 kunci kumpulan berulang** dan menghitung total token dari **17 kumpulan dengan anggaran bulanan positif yang dipublikasikan ditambah lima batas Groq per-model**, dideduplikasi berdasarkan kumpulan bersama. Kuota yang hanya terbuka setelah pemeriksaan identitas regional (saat ini: ModelScope) ditampilkan terpisah, +~6M di balik verifikasi identitas regional, dan tidak pernah dijumlahkan ke dalam total. Hasilnya tetap terlihat di dasbor (`/dashboard/free-tiers`). -Kartu anggaran paket gratis OmniRoute: ~1,62 miliar token gratis per bulan secara konsisten, hingga ~2,22 miliar pada bulan pertama dengan kredit pendaftaran, dari 35 kunci pool berulang yang terdokumentasi dan mencakup 491 entri paket gratis yang dikatalogkan di balik satu endpoint. Perhitungan transparan yang dideduplikasi berdasarkan pool — setiap pool bersama dihitung satu kali, termasuk 17 pool berulang dengan anggaran token bulanan positif yang dipublikasikan ditambah lima batas Groq per model; 13 penyedia ditandai untuk dihindari dalam katalog risiko ketentuan agar Anda dapat memutuskan sendiri. Bilah anggaran mencakup Mistral 1 miliar, Nara 210 juta, LLM7 150 juta, xKiro 150 juta, Groq 30 juta (lima batas per model), serta pool yang lebih kecil, ditambah kredit pendaftaran bulan pertama dan penyedia gratis permanen tanpa batas token yang ditampilkan secara terpisah agar tidak pernah meningkatkan total utama. Jumlah yang telah digunakan/tersisa secara langsung tersedia di /dashboard/free-tiers. +OmniRoute free-tier budget card: ~1.62B free tokens per month steady, up to ~2.22B in the first month with signup credits, from 35 documented recurring pool keys covering 489 cataloged free-tier entries behind one endpoint. Honest pool-deduped math — each shared pool counted once, including 17 recurring pools with a published positive monthly token budget plus five per-model Groq caps; 13 providers are marked avoid in the terms-risk catalog so you decide. Budget bar includes Mistral 1B, Nara 210M, LLM7 150M, xKiro 150M, Groq 30M (five per-model caps) and smaller pools, plus first-month signup credits and permanently-free no-token-cap providers surfaced separately so they never inflate the headline. Live used/remaining on /dashboard/free-tiers. -> Ringkasan animasi halaman langsung `/dashboard/free-tiers`. Metodologi lengkap (deduplikasi pool, tingkat kredit, ketentuan penyedia): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. +> Ringkasan animasi dari halaman live `/dashboard/free-tiers`. Metodologi lengkap (deduplikasi kumpulan, tingkatan kredit, ketentuan penyedia): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**. > -> Angka-angka ini diaudit ulang setiap dua minggu berdasarkan katalog langsung dan **dapat berubah ke kedua arah** — ketika penyedia mengakhiri paket gratis, angkanya turun; ketika paket baru hadir, angkanya naik. Kami memublikasikan hasil yang benar-benar dihitung oleh katalog, bukan skenario terbaik yang dibulatkan ke atas. +> Angka-angka ini diaudit ulang setiap dua minggu terhadap katalog langsung dan **bergerak dua arah** — penyedia mengakhiri tingkatan gratis dan jumlahnya turun; yang baru muncul dan jumlahnya naik. Kami menerbitkan apa yang sebenarnya dihitung oleh katalog, bukan kasus terbaik yang dibulatkan.
@@ -37,29 +37,29 @@

-⭐ Beri bintang pada repo ini jika OMNIROUTE membantu Anda menghemat uang dan mempermudah pekerjaan Anda. +⭐ Beri bintang pada repo jika OMNIROUTE membantu Anda menghemat uang dan mempermudah pekerjaan Anda.

-[![Bintang](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) +[![Stars](https://img.shields.io/github/stars/diegosouzapw/OmniRoute?style=social)](https://github.com/diegosouzapw/OmniRoute) diegosouzapw%2FOmniRoute | Trendshift -[![Peringkat Riwayat Bintang](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) +[![Star History Rank](https://api.star-history.com/badge?repo=diegosouzapw/OmniRoute&theme=dark)](https://www.star-history.com/diegosouzapw/omniroute) [![olud.ai](https://olud.ai/badge.php?tool=diegosouzapw-omniroute)](https://olud.ai/project/diegosouzapw-omniroute.html) ### 💬 Bergabunglah dengan komunitas -**👋 Ikuti pengelola — dapatkan informasi penyedia baru, rilis & kiat lebih awal:** +**👋 Ikuti pengelola — dapatkan penyedia baru, rilis & tips pertama:** -[![Ikuti Diego di LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) -[![Ikuti @diegosouzapw di GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) +[![Follow Diego on LinkedIn](https://img.shields.io/badge/Follow_Diego_on-LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/diegosouzapw/) +[![Follow @diegosouzapw on GitHub](https://img.shields.io/github/followers/diegosouzapw?style=for-the-badge&logo=github&logoColor=white&label=Follow%20on%20GitHub&color=181717)](https://github.com/diegosouzapw) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/U47eFqAXCn) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/omnirouteOficial) [![WhatsApp Global](https://img.shields.io/badge/WhatsApp_Global-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) [![WhatsApp Brasil](https://img.shields.io/badge/WhatsApp_Brasil-25D366?style=for-the-badge&logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) -[![Situs Web](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) +[![Website](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) -**Pertanyaan, kiat penyedia, peta jalan & dukungan → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)** +**Pertanyaan, tips penyedia, peta jalan & dukungan → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/FvuCbrpZmQ6I85n2vW5QIC?s=cl&p=a&mlu=4) / [🇧🇷 Brasil](https://chat.whatsapp.com/KWgatljAjmbELQory59Oti?s=cl&p=a&mlu=4) / [Portal](https://portal.sthub.com.br/communities/groups/st-hub/channels/Omniroute-World-8kRjmK)**
@@ -590,9 +590,9 @@ Radar bersifat pilihan dan hanya menggunakan GET. Klien OmniRoute tidak mengungg
-## 🤖 CLI & Agen Pemrograman yang Kompatibel +## 🤖 CLI & Agen Pengodean yang Kompatibel -> Satu konfigurasi — `http://localhost:20128/v1` — dan **setiap** IDE atau CLI AI dapat berjalan dengan model gratis & berbiaya rendah. +> Satu konfigurasi — `http://localhost:20128/v1` — dan **setiap** IDE atau CLI AI berjalan pada model gratis & berbiaya rendah.
@@ -626,23 +626,23 @@ Radar bersifat pilihan dan hanya menggunakan GET. Klien OmniRoute tidak mengungg - +
Goose
Goose
                           
Open Interpreter
Open Interpreter
                           
Warp AI
Warp AI
                           
Agent Deck
Agent Deck
                           
deyin.ai
deyin.ai
                           
-+ juga berfungsi dengan · Kiro · Command Code · Antigravity · Windsurf · AMP · alat apa pun yang kompatibel dengan OpenAI ++ juga berfungsi dengan · Agent Deck · Kiro · Command Code · Antigravity · Windsurf · AMP · alat apa pun yang kompatibel dengan OpenAI
-📖 Penyiapan per alat untuk seluruh 36 alat (26 CLI Code + 10 CLI Agent) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider) +📖 Pengaturan per alat untuk semua 36 alat (26 CLI Code + 10 CLI Agent) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 Plugin OpenCode → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)

-**Jalankan CLI apa pun yang didukung melalui OmniRoute dengan satu perintah** — tanpa menulis file konfigurasi, -kredensial disuntikkan per proses, Qwen/Gemini mendapatkan direktori home terisolasi yang bersifat sementara: +**Luncurkan CLI yang didukung melalui OmniRoute dalam satu perintah** — tanpa file konfigurasi yang ditulis, +kredensial disuntikkan per proses, Qwen/Gemini mendapatkan lingkungan terisolasi sekali pakai: ```bash omniroute run claude --model openai/gpt-5.4 # Claude Code @@ -653,23 +653,23 @@ omniroute run opencode --model glm/glm-5.2 -- run "reply OK" omniroute run qwen --model glm/glm-5.2 -- -p "reply OK" omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK" -# Atau pilih penyedia+model secara interaktif dan tulis konfigurasi milik alat tersebut: -omniroute configure codex # juga: claude opencode qwen aider goose gemini cline continue kilo +# Or pick provider+model interactively and write the tool's own config: +omniroute configure codex # also: claude opencode qwen aider goose gemini cline continue kilo ``` -Setiap perintah mengikuti konteks remote yang aktif (`omniroute connect `), `--dry-run` -menampilkan pratinjau env/argumen yang tepat tanpa mengeksekusinya, dan `--api-key-env NAME` mencegah rahasia masuk -ke riwayat shell Anda. → [Integrasi CLI](docs/guides/CLI-INTEGRATIONS.md) +Setiap perintah menghormati konteks jarak jauh aktif (`omniroute connect `), `--dry-run` +menampilkan pratinjau env/args yang tepat tanpa mengeksekusi, dan `--api-key-env NAME` menjaga rahasia +keluar dari riwayat shell Anda. → [Integrasi CLI](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 357 Penyedia AI — 152 Ditandai Gratis dalam Katalog +## 🌐 357 Penyedia AI — 152 Ditandai Gratis di Katalog
-> **357 penyedia terdaftar** di seluruh koleksi kanonis untuk chat, media, pencarian, lokal, agen cloud, dan sistem, termasuk **152 yang memiliki metadata penemuan `hasFree: true`**. Registri model chat mencakup **229 penyedia / 2.554 pasangan penyedia-model yang berbeda / 1.283 ID model mentah**; katalog anggaran gratis yang terpisah memiliki **491 baris per model**, **35 pool berulang**, dan **54 penyedia gratis selamanya yang berulang/tanpa kunci**. Penyebut ini sengaja berbeda; definisi dan perhitungan yang dideduplikasi berdasarkan pool tersedia di [Referensi Penyedia](docs/reference/PROVIDER_REFERENCE.md) dan [Tingkat Gratis](docs/reference/FREE_TIERS.md). +> **357 penyedia terdaftar** di seluruh koleksi chat, media, pencarian, lokal, agen cloud, dan sistem kanonis, termasuk **152 yang membawa metadata penemuan `hasFree: true`**. Registri model chat mencakup **229 penyedia / 2.554 pasangan penyedia-model yang berbeda / 1.283 ID model mentah**; katalog anggaran gratis terpisah memiliki **491 baris per model**, **35 kumpulan berulang** dan **54 penyedia gratis selamanya yang berulang/tanpa kunci**. Ini adalah penyebut yang berbeda berdasarkan desain; definisi dan perhitungan yang dideduplikasi dari kumpulan tersedia di [Referensi Penyedia](docs/reference/PROVIDER_REFERENCE.md) dan [Tingkat Gratis](docs/reference/FREE_TIERS.md).
@@ -702,7 +702,7 @@ ke riwayat shell Anda. → [Integrasi CLI](docs/guides/CLI-INTEGRATIONS.md) -…dan 330+ lainnya — setiap ikon dimuat secara langsung dari katalog penyedia dasbor. 📖 [Referensi Penyedia](docs/reference/PROVIDER_REFERENCE.md) +…dan 330+ lainnya — setiap ikon diselesaikan secara langsung dari katalog penyedia di dasbor. 📖 [Referensi Penyedia](docs/reference/PROVIDER_REFERENCE.md)
@@ -711,19 +711,19 @@ ke riwayat shell Anda. → [Integrasi CLI](docs/guides/CLI-INTEGRATIONS.md) - + - - + + - - + +
OpenCode Zen
OpenCode Zen
DeepSeek V4, Nemotron 3
Tanpa batas token
Kilo Code
Kilo Code
Perute otomatis, Tencent Hy3
Gratis selamanya
Kilo Code
Kilo Code
Auto-router, Tencent Hy3
Gratis selamanya
Requesty
Requesty
GPT-OSS 120B, Nemotron
Gratis selamanya
SiliconFlow
SiliconFlow
DeepSeek V3.2 / R1
Tingkat gratis
Z.AI GLM
Z.AI GLM
GLM-4.7 / 4.5-Flash
Gratis selamanya
Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Gratis selamanya
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
GRATIS tanpa batas
Pollinations
Pollinations
GPT, Llama, Claude
Tidak memerlukan kunci
Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
GRATIS Tanpa Batas
Pollinations
Pollinations
GPT, Llama, Claude
Tidak perlu kunci
Cloudflare AI
Cloudflare AI
50+ model
10K neuron/hari
NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM gratis
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1 juta token/hari
OpenRouter
OpenRouter
Model :free
+$10 → RPM lebih tinggi
Openference
Openference
Qwen3.8 27B, Llama 3.2
Tingkat gratis
OpenRouter
OpenRouter
:model gratis
+$10 → RPM lebih tinggi
@@ -1263,20 +1263,20 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya - + - - + + - - - - + + + + - - + +
LapisanTeknologi
RuntimeNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
BahasaTypeScript 6.0 — 100% TypeScript di seluruh src/ dan open-sse/ (tanpa any di inti sejak v2.0)
BahasaTypeScript 6.0 — 100% TypeScript di seluruh src/ dan open-sse/ (nol any di inti sejak v2.0)
Kerangka KerjaNext.js 16 + React 19 + Tailwind CSS 4
Basis Databetter-sqlite3 (SQLite, penjurnalan WAL) + LowDB (JSON lama) — 122 modul domain, 176 migrasi
MemoriTeks lengkap SQLite FTS5 + embedding vektor terkuantisasi int8, peluruhan bertipe
Basis Databetter-sqlite3 (SQLite, WAL journaling) + LowDB (JSON legacy) — 122 modul domain, 178 migrasi
MemoriSQLite FTS5 teks lengkap + penyematan vektor terkuantisasi int8, peluruhan bertipe
SkemaZod 4 — validasi I/O alat MCP + kontrak API
ProtokolMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
StreamingServer-Sent Events (SSE) + jembatan WebSocket (/v1/ws)
KompresiPipeline 12 mesin — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Autentikasi & keamananOAuth 2.0 (PKCE) + JWT + Kunci API + autentikasi MCP bercakupan · AES-256-GCM untuk data tersimpan · DOMPurify
Penyamaranwreq-js — peniruan sidik jari TLS JA3 / JA4, proksi 3 tingkat
KetahananPemutus sirkuit, backoff eksponensial, anti-thundering-herd, pemulihan mandiri auto-combo
Kompresialur 12-mesin — RTK, Caveman, LLMLingua-2 (MobileBERT ONNX), GCF, OmniGlyph
Otentikasi & keamananOAuth 2.0 (PKCE) + JWT + Kunci API + otentikasi cakupan MCP · AES-256-GCM saat istirahat · DOMPurify
Penyembunyianwreq-js — peniruan sidik jari JA3 / JA4 TLS, proksi 3 tingkat
KetahananPemutus sirkuit, backoff eksponensial, anti-thundering-herd, penyembuhan diri auto-combo
Pencatatanpino — log JSON terstruktur dengan konteks permintaan
PengujianRunner pengujian Node.js + Vitest — 39.000+ deklarasi pengujian statis di 5.100+ file pengujian terlacak (unit, integrasi, E2E, keamanan, ekosistem)
PlatformDesktop (Electron) · Android (Termux) · PWA (browser apa pun)
PengujianNode.js test runner + Vitest — 39.000+ deklarasi pengujian statis di 5.100+ file pengujian yang dilacak (unit, integrasi, E2E, keamanan, ekosistem)
PlatformDesktop (Electron) · Android (Termux) · PWA (peramban apa pun)
CI/CDGitHub Actions — publikasi npm otomatis + Docker Hub saat rilis
TautanSitus Web · npm · Docker Hub
@@ -1293,22 +1293,22 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya - - - - + + + + - +
DokumenDeskripsi
Panduan PenggunaPenyedia, kombinasi, integrasi CLI, penerapan
Panduan PenyiapanMetode instalasi lengkap, konfigurasi alat CLI, penyiapan protokol, penyesuaian batas waktu
Panduan Alat CLIPenyiapan per alat untuk Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Mode Jarak JauhKendalikan OmniRoute jarak jauh (VPS) dari CLI laptop Anda melalui token akses terbatas
Panduan PenggunaPenyedia, kombo, integrasi CLI, deployment
Panduan PengaturanMetode instalasi lengkap, konfigurasi alat CLI, pengaturan protokol, penyetelan batas waktu
Panduan Alat CLIPengaturan per alat untuk Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot
Mode Jarak JauhMengoperasikan OmniRoute jarak jauh (VPS) dari CLI laptop Anda melalui token akses terlingkup
Konfigurasi Claude CodeArahkan Claude Code ke OmniRoute (lokal/jarak jauh) dengan launch + profil per model
Mulai CepatInstalasi 3 langkah → hubungkan → konfigurasi
Mulai Cepat3 langkah instalasi → sambungkan → konfigurasi
-### 🔧 Operasi & Penerapan +### 🔧 Operasi & Deployment - + - - + + @@ -1319,43 +1319,40 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya
DokumenDeskripsi
Panduan DockerDocker run, profil Compose, HTTPS Caddy, tunnel, tag image
Panduan DockerDocker run, profil Compose, Caddy HTTPS, terowongan, tag gambar
Panduan PodmanIntegrasi Quadlet systemd, podman-compose, SELinux
Penerapan VMPanduan lengkap: penyiapan VM + nginx + Cloudflare
Penerapan Fly.ioTerapkan ke Fly.io dengan penyimpanan persisten
Deployment VMPanduan lengkap: Pengaturan VM + nginx + Cloudflare
Deployment Fly.ioDeploy ke Fly.io dengan penyimpanan persisten
Panduan TermuxJalankan OmniRoute di Android melalui Termux
Panduan PWAInstalasi Progressive Web App, caching, arsitektur
Panduan Penghapusan InstalasiPenghapusan bersih untuk semua metode instalasi
- - - + + + - - - - - - + + + + + +
DokumenDeskripsi
ArsitekturArsitektur sistem, aliran data, dan mekanisme internal
Panduan KompresiPipeline 7 opsi: nonaktif / ringan / standar / agresif / ultra / RTK / bertumpuk
Kompresi RTKKompresi output perintah, filter, kepercayaan, verifikasi, pemulihan output mentah
ArsitekturArsitektur sistem, aliran data, dan internal
Panduan KompresiPipeline 7 opsi: off / lite / standard / aggressive / ultra / RTK / stacked
Kompresi RTKKompresi keluaran perintah, filter, kepercayaan, verifikasi, pemulihan keluaran mentah
Mesin KompresiCaveman, RTK, pipeline bertumpuk, antarmuka dashboard/API/MCP
Format Aturan KompresiSkema paket aturan JSON untuk filter Caveman dan RTK
Paket Bahasa KompresiDeteksi bahasa dan pembuatan paket aturan Caveman
Panduan KetahananCircuit breaker, cooldown, antrean, pencegahan thundering herd, spoofing TLS
Mesin Auto-ComboPenilaian 16 faktor, paket mode, pemulihan mandiri
Panduan ProksiSistem proksi 3 tingkat, marketplace 1proxy, CRUD registri
Tingkat GratisDirektori terkonsolidasi: 35 pool berulang yang terdokumentasi / 491 entri tingkat gratis yang dikatalogkan
Galeri FiturTur visual dashboard dengan tangkapan layar
Dokumentasi Basis KodePanduan basis kode yang ramah bagi pemula
Panduan KetahananPemutus sirkuit, pendinginan, antrean, anti-thundering herd, spoofing TLS
Mesin Auto-ComboPenilaian 16 faktor, paket mode, penyembuhan diri
Panduan ProxySistem proxy 3 tingkat, marketplace 1proxy, CRUD registri
Tingkat GratisDirektori terkonsolidasi: 35 kumpulan berulang yang didokumentasikan / 489 entri tingkat gratis yang dikatalogkan
Galeri FiturTur dashboard visual dengan tangkapan layar
Dokumentasi Kode DasarPanduan kode dasar yang ramah pemula
### 🤖 Protokol & API - + - - - -
DokumenDeskripsi
Referensi APISemua endpoint beserta contoh
Referensi APISemua endpoint dengan contoh
Spesifikasi OpenAPISpesifikasi OpenAPI 3.0
Server MCP110 alat MCP, konfigurasi IDE, klien Python/TS/Go
Panduan Server MCPInstalasi MCP, transport, dan referensi alat
Server A2AProtokol JSON-RPC 2.0, keterampilan, streaming, pengelolaan tugas
Panduan Server A2AKartu agen A2A, tugas, keterampilan, dan streaming
- -### 📋 Proyek & Kualitas + Panduan Server MCPInstalasi MCP, transportasi, dan referensi alat + Server A2AProtokol JSON-RPC 2.0, keterampilan, streaming, manajemen tugas + DokumenDeskripsi - BerkontribusiPenyiapan dan panduan pengembangan - Model Percabangan & RilisTarget PR (release/*), serta arti main dan tag + BerkontribusiPengaturan dan panduan pengembangan + Model Percabangan & RilisTarget PR (release/*), arti main dan tag Catatan PerubahanRiwayat rilis lengkap per versi Kebijakan KeamananPelaporan kerentanan dan praktik keamanan - Panduan i18nDukungan 42 bahasa, alur kerja penerjemahan, RTL - Daftar Periksa RilisLangkah-langkah validasi prarilis - Rencana CakupanStrategi cakupan pengujian untuk 39.000+ deklarasi pengujian statis di 5.100+ berkas pengujian yang dilacak + Panduan i18nDukungan 42 bahasa, alur kerja terjemahan, RTL + Daftar Periksa RilisLangkah-langkah validasi pra-rilis + Rencana CakupanStrategi cakupan pengujian untuk 39.000+ deklarasi pengujian statis di 5.100+ file pengujian yang dilacak
@@ -1364,12 +1361,12 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya # ⭐ Kontributor Teratas -> OmniRoute dibentuk oleh komunitas sumber terbuka yang penuh semangat. Individu-individu ini telah memberikan kontribusi luar biasa yang berdampak langsung pada kualitas, stabilitas, dan jangkauan proyek. **Terima kasih.** +> OmniRoute dibentuk oleh komunitas open-source yang bersemangat. Individu-individu ini telah memberikan kontribusi luar biasa yang secara langsung memengaruhi kualitas, stabilitas, dan jangkauan proyek. **Terima kasih.** -### Kontributor eksternal berdasarkan pull request yang digabungkan +### Kontributor eksternal berdasarkan permintaan tarik yang digabungkan - + @@ -1393,9 +1390,9 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya
PeringkatKontributorPR yang Digabungkan~Baris yang Diubah
PeringkatKontributorPR yang Digabungkan~Baris yang Berubah
1backryun190227,977
2oyi77180407,678
3rdself14580,663
20Prudhvivuda246,312
-Dibekukan pada ujung aktif release/v3.8.50 dengan commit dafb4ae808, mencakup penggabungan hingga 2026-08-24 05:26:03 UTC. Sensus GitHub GraphQL berpaginasi memuat 5.911 PR yang digabungkan: 2.707 oleh pemilik repositori, 179 oleh Dependabot, dan 3.025 PR eksternal dari 535 kontributor berbeda. “Baris yang diubah” adalah penambahan + penghapusan GitHub dan mencakup berkas yang dihasilkan, lockfile, katalog, terjemahan, serta dokumentasi; angka tersebut mengukur perubahan, bukan LOC yang ditulis. Peringkat seri pada batas akhir tetap disertakan. +Dibekukan pada tip live release/v3.8.50 dafb4ae808, dengan penggabungan hingga 2026-08-24 05:26:03 UTC. Sensus GitHub GraphQL yang dipaginasi berisi 5.911 PR yang digabungkan: 2.707 oleh pemilik repositori, 179 oleh Dependabot, dan **3.025 PR eksternal dari 535 kontributor berbeda**. "Baris yang Berubah" adalah penambahan + penghapusan GitHub dan mencakup file yang dihasilkan, lockfile, katalog, terjemahan, dan dokumentasi; ini adalah churn, bukan LOC yang dibuat. Ikatan pada batas tetap dipertahankan. -### Commit yang Diatribusikan oleh GitHub +### Komit yang diatribusikan GitHub @@ -1404,42 +1401,42 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya backryun
backryun
- 🥇 220 commit yang diatribusikan oleh GitHub + 🥇 220 komit yang diatribusikan GitHub @@ -1448,42 +1445,42 @@ Metrik kanonis pada 2026-08-24: **1.029 video unik** · **11.132.922 tayangan ya Dizzle
Dizzle
- 🏅 69 commit yang diatribusikan oleh GitHub · peringkat bersama #6 + 🏅 69 komit yang diatribusikan GitHub · seri #6
Paijo
Paijo

- 🥈 219 commit yang diatribusikan oleh GitHub + 🥈 219 komit yang diatribusikan GitHub
Randi
Randi

- 🥉 108 commit yang diatribusikan oleh GitHub + 🥉 108 komit yang diatribusikan GitHub
Ravi Tharuma
Ravi Tharuma

- 🏅 81 commit yang diatribusikan oleh GitHub + 🏅 81 komit yang diatribusikan GitHub
Chris
Chris

- 🏅 70 commit yang diatribusikan oleh GitHub + 🏅 70 komit yang diatribusikan GitHub
Markus Hartung
Markus Hartung

- 🏅 69 commit yang diatribusikan oleh GitHub · peringkat bersama #6 + 🏅 69 komit yang diatribusikan GitHub · seri #6
Jan Leon
Jan Leon

- 🏅 64 commit yang diatribusikan oleh GitHub + 🏅 64 komit yang diatribusikan GitHub
zenobit
zenobit

- 🏅 62 commit yang diatribusikan oleh GitHub + 🏅 62 komit yang diatribusikan GitHub
Bob.Hou
Bob.Hou

- 🏅 51 commit yang diatribusikan oleh GitHub · peringkat bersama #10 + 🏅 51 komit yang diatribusikan GitHub · seri #10
Xiangzhe
Xiangzhe

- 🏅 51 commit yang diatribusikan oleh GitHub · peringkat bersama #10 + 🏅 51 komit yang diatribusikan GitHub · seri #10
-Diperiksa ulang pada 2026-08-24 06:14:31 UTC: commit yang diatribusikan oleh GitHub sebagaimana dilaporkan oleh API Contributors repositori untuk branch default release/v3.8.50. API tersebut mengembalikan 525 identitas (415 pengguna, 2 bot, 108 anonim); tabel ini mengecualikan pengelola, bot, dan identitas anonim serta mempertahankan peringkat bersama. Daftar ini berbeda dari peringkat PR yang digabungkan di atas maupun sensus metadata Git berisi 639 orang di bawah. +Diperiksa ulang pada 2026-08-24 06:14:31 UTC: Komit yang diatribusikan GitHub dilaporkan oleh API Kontributor repositori untuk cabang default release/v3.8.50. API mengembalikan 525 identitas (415 pengguna, 2 bot, 108 anonim); tabel ini mengecualikan pemelihara, bot, dan identitas anonim serta mempertahankan seri kompetisi. Ini berbeda dari peringkat PR yang digabungkan di atas dan sensus metadata Git 639 orang di bawah. -> 🙏 Fitur, perbaikan bug, dan peningkatan infrastruktur dari para kontributor ini merupakan **bagian inti** yang menjadikan OmniRoute andal dan kaya fitur. Setiap pull request, setiap kasus pengujian, dan setiap berkas terjemahan i18n sangatlah berarti. Sumber terbuka dibangun oleh orang-orang seperti mereka. +> 🙏 Fitur, perbaikan bug, dan peningkatan infrastruktur dari para kontributor ini adalah **bagian inti** dari apa yang membuat OmniRoute andal dan kaya fitur. Setiap permintaan tarik, setiap kasus uji, dan setiap file terjemahan i18n itu penting. Sumber terbuka dibangun oleh orang-orang seperti mereka.
diff --git a/docs/i18n/id/SECURITY.md b/docs/i18n/id/SECURITY.md index d448d7e8219d..472957d37b01 100644 --- a/docs/i18n/id/SECURITY.md +++ b/docs/i18n/id/SECURITY.md @@ -220,26 +220,38 @@ Aturan berikut diberlakukan oleh perangkat otomatis dan peninjau: 10. **Teruskan nilai runtime `exec()` / `spawn()` melalui opsi `env`** — jangan pernah melakukan interpolasi string terhadap path eksternal atau nilai yang tidak tepercaya ke dalam skrip yang diteruskan ke shell. Referensi: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Utamakan pustaka yang aman secara default** — lihat [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Gunakan pustaka tersebut sebelum membuat implementasi sendiri. -## Temuan pemindai rantai pasok (Socket.dev / Snyk / sejenisnya) +## Temuan pemindai rantai pasok (Socket.dev / Snyk / serupa) -Artefak npm `omniroute` yang dipublikasikan menyertakan build Next.js `output: "standalone"`, yang berarti setiap penangan rute — termasuk fitur berhak istimewa yang terdokumentasi (MITM, impor Zed, Cloud Sync, supervisor layanan tertanam) — dimasukkan ke dalam chunk `.next/server/*.js` yang telah diminifikasi. Pemindai rantai pasok berbasis heuristik sering mencocokkan pola chunk tersebut dengan signature malware. +> **Catatan cakupan:** `socket.yml` di root repositori hanya mengatur `projectIgnorePaths` untuk pemindaian pascapublikasi sisi registry oleh Socket.dev terhadap artefak npm yang telah dipublikasikan — ini bukan gerbang penggabungan CI/PR yang diberlakukan. Tidak ada workflow di `.github/workflows`, skrip `package.json`, maupun target `Makefile` yang menjalankan Socket.dev. -Konfigurasi pemindai yang kami gunakan berada di [`socket.yml`](socket.yml) pada root repositori (format Socket.dev GitHub App v2 — lihat ). Konfigurasi tersebut secara eksplisit mengecualikan direktori yang tidak didistribusikan (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/`, dan sebagainya) sehingga pemindai hanya melaporkan jalur kode yang benar-benar menjangkau pengguna artefak yang dipublikasikan — pemindaian itu sendiri dijalankan oleh Socket GitHub App yang membaca file tersebut, bukan oleh workflow dalam repositori ini. +Artefak npm `omniroute` yang dipublikasikan membundel build Next.js dengan `output: "standalone"`, +yang berarti setiap route handler — termasuk fitur berprivilese yang terdokumentasi +(MITM, impor Zed, Cloud Sync, supervisor layanan tertanam) — berakhir +di chunk `.next/server/*.js` yang diminifikasi. Pemindai rantai pasok heuristik +sering kali mencocokkan pola chunk tersebut dengan signature malware. -Untuk setiap kategori temuan, kami memelihara pernyataan pengelola per temuan: +Konfigurasi pemindai yang kami gunakan berada di [`socket.yml`](socket.yml) pada +root repositori (format v2 GitHub App Socket.dev — lihat +). Konfigurasi tersebut secara eksplisit mengecualikan +direktori yang tidak didistribusikan (`tests/`, `_tasks/`, `_references/`, `_ideia/`, +`_mono_repo/`, `docs/`, dll.) sehingga pemindai hanya melaporkan jalur kode yang +benar-benar sampai kepada pengguna paket yang dipublikasikan — pemindaian itu sendiri dijalankan oleh GitHub App +Socket yang membaca file tersebut, bukan oleh workflow dalam repositori ini. + +Untuk setiap kategori temuan, kami memelihara pengesahan pengelola per temuan: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — - peta per temuan: file sumber ↔ chunk yang ditandai ↔ perilaku ↔ mitigasi - yang diterapkan pada v3.8.6. -- Blok `SECURITY-AUDITOR-NOTE:` dalam kode sumber pada setiap fungsi yang ditandai + pemetaan per temuan: file sumber ↔ chunk yang ditandai ↔ perilaku ↔ mitigasi + yang diterapkan di v3.8.6. +- Blok `SECURITY-AUDITOR-NOTE:` di dalam sumber pada setiap fungsi yang ditandai merujuk kembali ke dokumen yang sama. -Bagi pengguna yang pipeline-nya tidak dapat melonggarkan peringatan: lakukan build dengan -`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Tindakan ini mengganti keempat +Bagi pengguna yang pipeline-nya tidak dapat melonggarkan peringatan tersebut: lakukan build dengan +`OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Perintah ini mengganti empat modul sensitif dengan stub yang mengembalikan HTTP 503 `feature-disabled` saat -runtime, sehingga jalur kode berhak istimewa secara fisik tidak ada dalam bundle. +runtime, sehingga jalur kode berprivilese secara fisik tidak ada dalam bundle. Lihat [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) -untuk prosedur publikasi. +untuk prosedur publikasinya. ## Referensi diff --git a/docs/i18n/id/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/i18n/id/docs/architecture/CODEBASE_DOCUMENTATION.md index 49e7bf45592e..6af1a728a4e8 100644 --- a/docs/i18n/id/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/i18n/id/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -434,76 +434,76 @@ Dibagi menjadi subdirektori yang berfokus pada fungsi tertentu: --- -## 4. `open-sse/` — Ruang kerja mesin streaming +## 4. `open-sse/` — Workspace mesin streaming -Ruang kerja npm terpisah yang dipublikasikan sebagai `@omniroute/open-sse`. Mengelola pemrosesan -permintaan, eksekutor, penerjemah, layanan, transformer, dan server MCP. +Workspace npm terpisah yang dipublikasikan sebagai `@omniroute/open-sse`. Menangani pemrosesan +permintaan, executor, translator, layanan, transformer, dan server MCP. ``` open-sse/ ├── index.ts Ekspor publik -├── package.json Manifes ruang kerja +├── package.json Manifes workspace ├── tsconfig.json ├── types.d.ts ├── config/ Registri penyedia, profil header, identitas, … -├── handlers/ Handler permintaan (obrolan, embedding, audio, gambar, …) -├── executors/ 108 eksekutor HTTP khusus penyedia +├── handlers/ Handler permintaan (chat, embeddings, audio, gambar, …) +├── executors/ 108 executor HTTP khusus penyedia ├── translator/ Konversi format (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) -├── transformer/ Transformer aliran Responses API ↔ Chat Completions +├── transformer/ Transformer stream Responses API ↔ Chat Completions ├── services/ 80+ modul layanan (kombinasi, fallback, kuota, identitas, …) -├── utils/ Helper streaming, klien TLS, AWS SigV4, pengambilan proxy, … +├── utils/ Helper streaming, klien TLS, AWS SigV4, pengambilan melalui proxy, … └── mcp-server/ Server MCP (3 transport, 33 cakupan, 110 alat) ``` ### 4.1 `open-sse/handlers/` -| Handler | Tujuan | -| ----------------------- | ---------------------------------------------------------------------------------- | -| `chatCore.ts` | Pipeline obrolan utama (cache, batas laju, perutean kombinasi, dispatch eksekutor) | -| `responsesHandler.ts` | Titik masuk OpenAI Responses API | -| `embeddings.ts` | Embedding | -| `imageGeneration.ts` | Pembuatan gambar | -| `audioSpeech.ts` | Teks ke ucapan | -| `audioTranscription.ts` | Ucapan ke teks | -| `videoGeneration.ts` | Pembuatan video | -| `musicGeneration.ts` | Pembuatan musik | -| `rerank.ts` | Pemeringkatan ulang | -| `moderations.ts` | Moderasi | -| `search.ts` | Pencarian web | -| `sseParser.ts` | Parser peristiwa SSE | -| `usageExtractor.ts` | Mengambil jumlah token dari aliran upstream | -| `responseSanitizer.ts` | Menghapus derau khusus penyedia | -| `responseTranslator.ts` | Penghubung antara respons penyedia dan lapisan penerjemah | +| Handler | Tujuan | +| ----------------------- | -------------------------------------------------------------------------------- | +| `chatCore.ts` | Pipeline chat utama (cache, batas laju, perutean kombinasi, pengiriman executor) | +| `responsesHandler.ts` | Titik masuk OpenAI Responses API | +| `embeddings.ts` | Embedding | +| `imageGeneration.ts` | Pembuatan gambar | +| `audioSpeech.ts` | Teks ke ucapan | +| `audioTranscription.ts` | Ucapan ke teks | +| `videoGeneration.ts` | Pembuatan video | +| `musicGeneration.ts` | Pembuatan musik | +| `rerank.ts` | Pemeringkatan ulang | +| `moderations.ts` | Moderasi | +| `search.ts` | Pencarian web | +| `sseParser.ts` | Parser peristiwa SSE | +| `usageExtractor.ts` | Mengambil jumlah token dari stream upstream | +| `responseSanitizer.ts` | Menghapus gangguan khusus penyedia | +| `responseTranslator.ts` | Penghubung antara respons penyedia dan lapisan translator | ### 4.2 `open-sse/executors/` -108 eksekutor penyedia, masing-masing memperluas `BaseExecutor` (`base.ts`): +108 executor penyedia, masing-masing memperluas `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, -`pollinations`, `qoder`, `vertex`, `devin-desktop`, serta `claudeIdentity.ts` +`pollinations`, `qoder`, `vertex`, `devin-desktop`, ditambah `claudeIdentity.ts` (helper identitas bersama) dan `index.ts` (registri). -> Catatan: penyedia yang tidak tercantum di sini dilayani oleh `default.ts` menggunakan eksekutor -> generik yang kompatibel dengan OpenAI. Katalog lengkap penyedia (355 penyedia) berada di +> Catatan: penyedia yang tidak tercantum di sini dilayani oleh `default.ts` menggunakan executor +> generik yang kompatibel dengan OpenAI. Katalog penyedia lengkap (355 penyedia) berada di > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` -Penerjemahan hub-and-spoke (OpenAI adalah hub-nya). +Penerjemahan hub-and-spoke (OpenAI adalah hub). -- **9 penerjemah permintaan** (`translator/request/`): +- **9 translator permintaan** (`translator/request/`): `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. -- **9 penerjemah respons** (`translator/response/`): +- **9 translator respons** (`translator/response/`): `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`. - **9 helper** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, - `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, serta + `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, ditambah pengujian helper. - **Helper gambar** (`translator/image/sizeMapper.ts`). - Tingkat teratas: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. @@ -511,40 +511,40 @@ Penerjemahan hub-and-spoke (OpenAI adalah hub-nya). ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — Konverter Responses API ↔ Chat Completions berbasis - `TransformStream` (digunakan oleh catch-all rute `responses/`). + `TransformStream` (digunakan oleh route catch-all `responses/`). ### 4.5 `open-sse/services/` -Sorotan (daftar lengkap di bawah `open-sse/services/`): - -| Fokus | File | -| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Perutean combo | `combo.ts` (19 strategi), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | -| Mesin Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | -| Ketahanan | `accountFallback.ts` (masa tunggu + penguncian), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | -| Kuota | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | -| Caching | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | -| Kecerdasan perutean | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | -| Penanganan model | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | -| Kompresi | `compression/` — pengkabelan lengkap mesin kompresi | -| Token + sesi | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | -| Tingkat / manifes | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | -| IP / jaringan | `ipFilter.ts`, `webSearchFallback.ts` | -| Batch | `batchProcessor.ts` | -| Penggunaan | `usage.ts` | +Sorotan (daftar lengkap di dalam `open-sse/services/`): + +| Aspek | File | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Perutean combo | `combo.ts` (19 strategi), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | +| Mesin Auto Combo | `autoCombo/` — `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | +| Ketahanan | `accountFallback.ts` (masa tunggu + penguncian), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | +| Kuota | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | +| Penyimpanan cache | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | +| Kecerdasan perutean | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | +| Penanganan model | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | +| Kompresi | `compression/` — pengkabelan lengkap mesin kompresi | +| Token + sesi | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | +| Tingkat / manifes | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | +| IP / jaringan | `ipFilter.ts`, `webSearchFallback.ts` | +| Batch | `batchProcessor.ts` | +| Penggunaan | `usage.ts` | ### 4.6 `open-sse/mcp-server/` -- **110 alat unik** yang dihubungkan di `server.ts` (45 alat kanonis di `schemas/tools.ts` + +- **110 alat unik** yang dihubungkan dalam `server.ts` (45 alat kanonis dalam `schemas/tools.ts` + modul memori, keterampilan, keterampilan GitHub, pool, gamifikasi, plugin, Notion, Obsidian, korpus lokal, dan kompresi — gabungannya dihitung oleh `countUniqueMcpTools`). -- **3 transpor**: stdio, HTTP Streamable, SSE. -- **33 cakupan** diberlakukan saat runtime — daftar dasar terdapat di `src/shared/constants/mcpScopes.ts`, sedangkan kumpulan lengkapnya adalah gabungan cakupan yang dideklarasikan oleh setiap modul alat. +- **3 transportasi**: stdio, HTTP Streamable, SSE. +- **33 cakupan** yang diterapkan saat runtime — daftar dasar dalam `src/shared/constants/mcpScopes.ts`, set lengkapnya merupakan gabungan cakupan yang dideklarasikan oleh setiap modul alat. - Tabel audit: `mcp_tool_audit` (diisi oleh `audit.ts`). - File: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, - serta pengujian di bawah `__tests__/`. + serta pengujian dalam `__tests__/`. - Lihat [MCP-SERVER.md](../frameworks/MCP-SERVER.md) untuk katalog alat lengkap. ### 4.7 `open-sse/config/` @@ -556,8 +556,8 @@ Registri penyedia (`providerRegistry.ts`, `providerModels.ts`, pembantu identitas (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), -pembantu kredensial (`credentialLoader.ts`, `codexClient.ts`), dan adaptor -cloud (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, +pembantu kredensial (`credentialLoader.ts`, `codexClient.ts`), dan adaptor cloud +(`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). diff --git a/docs/i18n/id/docs/architecture/RESILIENCE_GUIDE.md b/docs/i18n/id/docs/architecture/RESILIENCE_GUIDE.md index ecb58f96ac48..b2726e04c44a 100644 --- a/docs/i18n/id/docs/architecture/RESILIENCE_GUIDE.md +++ b/docs/i18n/id/docs/architecture/RESILIENCE_GUIDE.md @@ -67,96 +67,140 @@ backoff eksponensial `minRetryCooldownMs → maxRetryCooldownMs`. Penimpaan: `OMNIROUTE_PROVIDER_BREAKER_{OAUTH,API_KEY}_{FAILURE_THRESHOLD,FAILURE_WINDOW_MS,COOLDOWN_MS}`. Pengaman regresi: `tests/unit/provider-cooldown-window-gate.test.ts`. -## 2. Masa Tunggu Koneksi +## 2. Cooldown Koneksi **Cakupan:** satu koneksi/akun/kunci penyedia. -**Tujuan:** melewati satu kunci yang bermasalah sementara koneksi lain untuk penyedia yang sama tetap melayani. +**Tujuan:** melewati satu kunci yang bermasalah sementara koneksi lain untuk penyedia yang sama tetap melayani permintaan. **Implementasi:** - Tandai tidak tersedia: `src/sse/services/auth.ts::markAccountUnavailable()` - Pemilihan: `getProviderCredentials*` dalam file yang sama -- Perhitungan masa tunggu: `open-sse/services/accountFallback.ts::checkFallbackError()` +- Perhitungan cooldown: `open-sse/services/accountFallback.ts::checkFallbackError()` - Pengaturan: `src/lib/resilience/settings.ts` **Kolom per koneksi:** -- `rateLimitedUntil` — stempel waktu hingga masa tunggu berakhir +- `rateLimitedUntil` — stempel waktu hingga cooldown berakhir - `testStatus: "unavailable"` - `lastError`, `lastErrorType`, `errorCode` - `backoffLevel` — penghitung backoff eksponensial -**Masa tunggu default:** +**Cooldown default:** -- Basis OAuth: 5 detik -- Basis kunci API: 3 detik -- 429 kunci API: mengutamakan header `Retry-After`/reset dari upstream/teks reset yang dapat diuraikan +- Basis OAuth: 5 dtk +- Basis kunci API: 3 dtk +- Kunci API 429: mengutamakan header upstream `Retry-After`/reset/teks reset yang dapat diurai - Backoff: `baseCooldownMs * 2 ** failureIndex` -**Pelindung anti-thundering-herd:** mencegah kegagalan serentak memperpanjang masa tunggu secara berlebihan atau menaikkan `backoffLevel` dua kali. +**Pelindung anti-thundering-herd:** mencegah kegagalan serentak memperpanjang cooldown secara berlebihan atau menaikkan `backoffLevel` dua kali. -**Status terminal (BUKAN masa tunggu):** +**Status terminal (BUKAN cooldown):** -- `banned` — ditetapkan oleh deteksi kata kunci terlarang/pemblokiran akun (lihat [BAN_DETECTION](../security/BAN_DETECTION.md)), dan oleh tiga penolakan per permintaan secara berturut-turut dari upstream (`request_rejected`, misalnya OAuth Anthropic 403 "Permintaan tidak diizinkan" — `open-sse/services/requestRejectedStreak.ts`); satu penolakan hanya membuat koneksi memasuki masa tunggu -- `expired` (beralih menjadi terminal setelah percobaan ulang terbatas — `EXPIRED_RETRY_MAX = 3` dengan backoff eksponensial — sehingga kesalahan OAuth sementara dapat pulih sendiri sebelum akun dinonaktifkan secara permanen) +- `banned` — ditetapkan oleh deteksi kata kunci terlarang / pemblokiran akun (lihat [BAN_DETECTION](../security/BAN_DETECTION.md)), dan oleh tiga penolakan per permintaan dari upstream secara berturut-turut (`request_rejected`, misalnya Anthropic OAuth 403 "Request not allowed" — `open-sse/services/requestRejectedStreak.ts`); satu penolakan hanya membuat koneksi memasuki cooldown +- `expired` (bertransisi menjadi terminal setelah percobaan ulang terbatas — `EXPIRED_RETRY_MAX = 3` dengan backoff eksponensial — sehingga galat OAuth sementara dapat pulih dengan sendirinya sebelum akun dinonaktifkan secara permanen) - `credits_exhausted` -Status ini bertahan hingga kredensial berubah atau operator meresetnya. Jangan menimpa status terminal dengan status masa tunggu sementara. +Status tersebut bertahan hingga kredensial berubah atau operator meresetnya. Jangan menimpa status terminal dengan status cooldown sementara. -**Pemulihan malas:** ketika `rateLimitedUntil` telah berlalu, koneksi kembali memenuhi syarat. Setelah berhasil digunakan, `clearAccountError()` menghapus semua kolom kesalahan. +**Pemulihan malas:** ketika `rateLimitedUntil` telah berlalu, koneksi kembali memenuhi syarat. Setelah berhasil digunakan, `clearAccountError()` menghapus semua kolom galat. + +### Batas penggunaan Claude OAuth: jalur berprioritas lebih rendah + reset batas sesi + +**Cakupan:** satu koneksi langganan Claude (OAuth). Kedua fitur bersifat **opsional per +koneksi** (Edit connection → Claude section → `lowPriorityMode` / `autoLimitReset` dalam +`providerSpecificData`, keduanya nonaktif secara default) dan mencerminkan perintah `/low-priority` dan +`/limit-reset` milik Claude Code (kontrak protokol direkam dari Claude Code 2.1.263). + +**Implementasi:** + +- Mesin status + klasifikasi respons: `open-sse/services/claudeLowPriority.ts` +- Klien status/klaim reset: `open-sse/services/claudeLimitReset.ts` +- Hook eksekutor (injeksi header + percobaan ulang dengan akun yang sama): `open-sse/executors/base.ts::execute()` +- Persistensi keikutsertaan: `src/lib/providers/requestDefaults.ts::normalizeProviderSpecificData()` + +**Pemicu:** batas penggunaan 5 jam — respons `429` yang header-nya memuat +`anthropic-ratelimit-unified-status: rejected` dan, ketika akun memenuhi syarat, +`anthropic-ratelimit-unified-slow-offer: treatment`. Tidak ada yang dikirim sebelum respons +429 batas pertama tersebut; lonjakan 429 tanpa header terpadu diproses melalui jalur cooldown normal. + +**Jalur berprioritas lebih rendah** (`lowPriorityMode`): + +- Saat menerima 429 batas tersebut, eksekutor menerima penawaran dan segera mencoba ulang dengan akun yang **sama** + menggunakan `anthropic-usage-limit: slow`; jalur tetap aktif hingga + `anthropic-ratelimit-unified-reset` yang diumumkan (+60 dtk masa tenggang), dan setiap permintaan + dalam rentang waktu tersebut membawa header itu. Respons 429 yang dicegat tidak pernah mencapai + `handleChatCore`, sehingga koneksi **tidak** dimasukkan ke cooldown dan tidak dialihkan. +- `anthropic-ratelimit-unified-slow-status` pada respons berikutnya: `active` / `not_needed` + mempertahankan jalur; `slot_busy` (429) atau `529` menunggu selama + `anthropic-ratelimit-unified-slow-retry-after` dari server (default 20 dtk, dibatasi 5–600 dtk, jitter ±30%) + lalu mencoba ulang, dengan batas `anthropic-ratelimit-unified-slow-max-wait` (default 20 mnt, dibatasi + 1 mnt–6 j) — setelah itu jalur berakhir dan masa jeda 10 menit memblokir penerimaan ulang. Waktu + tunggu juga dibatasi oleh sisa waktu timeout mulai-upstream milik permintaan itu sendiri + (`resolveFetchStartTimeout`, default 10 mnt) dikurangi margin 5 dtk: tanpa batas tersebut, + waktu tunggu maksimum default 20 menit akan melampaui masa hidup permintaan dan proses tidur akan dibatalkan + di tengah penantian, sehingga memunculkan `TimeoutError`, bukan akhir `max_wait` yang mulus + masa jeda. +- `weekly_limit` / `budget_exhausted` / `off` / `ineligible`, pergantian jendela 5 jam, atau + `ineligible` + `anthropic-ratelimit-unified-overage-in-use: true` (yang mengakhirinya sebagai + `extra_usage` pada status apa pun, karena kelebihan penggunaan berbayar kini mencakup batas tersebut) mengakhiri jalur; + respons kemudian diteruskan ke jalur cooldown normal. `budget_exhausted` diingat hingga + reset anggaran yang diumumkan (≤ 8 hari). +- Pemeriksaan batas dijalankan setelah percobaan ulang intra-upaya yang dipicu oleh 400 milik eksekutor + (pengeditan konteks, pembatasan thinking/effort, pembelajaran otomatis parameter), sehingga respons 429 batas + yang baru muncul pada salah satu percobaan ulang tersebut tetap dicegat alih-alih mencapai jalur cooldown. +- Status disimpan dalam memori per koneksi (setelah dimulai ulang, diperlukan satu respons 429 batas tambahan untuk menerimanya kembali). + +**Reset batas sesi** (`autoLimitReset`, dicoba sebelum jalur ketika keduanya aktif): + +- `GET https://api.anthropic.com/api/oauth/usage?at_wall=1&skip_spend=1` → blok `juniper_tide`; + ketika `arm: "reset"` dan `available: true`, + `POST https://api.anthropic.com/api/organizations/{orgUUID}/reset_rate_limits` dengan + `{ "program": "juniper_tide" }` (UUID organisasi dari + `providerSpecificData.organizationUUID`, dengan fallback bootstrap). +- `result: reset|not_limited` → permintaan dicoba ulang dengan kecepatan penuh (tanpa header lambat). + `already_used` / `not_offered` menyimpan `next_available_at` (default satu minggu); + kegagalan apa pun menerapkan backoff selama 15 menit. Reset hanya dapat dilakukan sekali seminggu dan tetap diperhitungkan + terhadap batas mingguan. + +Pelindung regresi: `tests/unit/claude-low-priority-mode.test.ts`, +`tests/unit/claude-limit-reset.test.ts`, `tests/unit/claude-low-priority-executor.test.ts`. ### Afinitas sesi (#7274) -**Cakupan:** satu sesi klien (header `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) yang disematkan ke satu koneksi, untuk penyedia **mana pun**. +**Cakupan:** satu sesi klien (header `X-Session-Id` / `x-codex-session-id` / `x-omniroute-session`) disematkan ke satu koneksi, untuk **penyedia mana pun**. -**Tujuan:** mempertahankan agen multi-giliran (Claude Code, aider, agen khusus) pada akun yang sama di seluruh permintaan, sehingga mengurangi kehilangan konteks lintas akun dan 429 cold-start berulang pada penyedia dengan status sesi per akun. +**Tujuan:** mempertahankan agen multi-turn (Claude Code, aider, agen kustom) pada akun yang sama di seluruh permintaan, sehingga mengurangi hilangnya konteks lintas akun dan 429 cold-start berulang pada penyedia dengan status sesi per akun. **Implementasi:** - Resolusi TTL: `src/sse/services/sessionAffinityPin.ts::resolveSessionAffinityTtlMs()` -- Pemilihan/pembuatan sematan: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` -- Ekstraksi header (generik, penyedia mana pun): `src/sse/services/auth.ts::extractSessionAffinityKey()` -- Tabel sematan persisten: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) -- Pengaturan: `sessionAffinityTtlMs` (TTL global dalam milidetik, `0` menonaktifkan) — `src/lib/db/settings.ts`. Diubah namanya dari `codexSessionAffinityTtlMs` yang hanya berlaku untuk Codex melalui migrasi `124_generic_session_affinity_ttl.sql`, yang memindahkan TTL Codex yang sebelumnya dikonfigurasi sebagai default baru. +- Pemilihan/pembuatan pin: `src/sse/services/sessionAffinityPin.ts::selectSessionAffinityConnection()` +- Ekstraksi header (generik, penyedia apa pun): `src/sse/services/auth.ts::extractSessionAffinityKey()` +- Tabel pin persisten: `sessionAccountAffinity` (`src/lib/db/sessionAccountAffinity.ts`) +- Pengaturan: `sessionAffinityTtlMs` (TTL global dalam ms, `0` menonaktifkan) — `src/lib/db/settings.ts`. Namanya diubah dari `codexSessionAffinityTtlMs` yang hanya untuk Codex melalui migrasi `124_generic_session_affinity_ttl.sql`, yang membawa TTL Codex yang sebelumnya telah dikonfigurasi sebagai nilai default baru. -Sebelum #7274, `resolveSessionAffinityTtlMs()` langsung mengembalikan `0` untuk setiap penyedia selain `codex`, sehingga pengaturan TTL (dan header sesi) tidak berpengaruh di tempat lain meskipun mekanisme penyematan dan ekstraksi header sudah tidak bergantung pada penyedia. Perbaikan tersebut menghapus pengembalian dini itu; TTL kini berlaku secara seragam untuk setiap penyedia setelah ditetapkan secara global di atas `0`. +Sebelum #7274, `resolveSessionAffinityTtlMs()` langsung berhenti dengan nilai `0` untuk setiap penyedia selain `codex`, sehingga pengaturan TTL (dan header sesi) tidak berpengaruh di tempat lain meskipun mekanisme pinning dan ekstraksi header sudah bersifat agnostik terhadap penyedia. Perbaikan tersebut menghapus penghentian dini itu; TTL kini berlaku secara seragam pada setiap penyedia setelah ditetapkan secara global di atas `0`. -Ketiga header afinitas sesi tidak pernah diteruskan ke upstream — eksekutor menyusun header upstream-nya sendiri dari awal alih-alih meneruskan header klien, sehingga header tersebut tetap hanya menjadi ID korelasi internal. +Ketiga header afinitas sesi tidak pernah diteruskan ke upstream — eksekutor membuat header upstream mereka sendiri dari awal alih-alih meneruskan header klien, sehingga header tersebut tetap hanya menjadi ID korelasi internal. -### Sewa koneksi sesi terkelola eksklusif +### Lease koneksi sesi terkelola eksklusif **Cakupan:** satu klien/sesi HTTP terkelola yang aktif memiliki satu koneksi OmniRoute yang memenuhi syarat. -**Tujuan:** menyediakan kepemilikan koneksi eksklusif yang tahan lama bagi klien yang memerlukan batas perutean -ketat di seluruh permintaan. Hal ini berbeda dari afinitas sesi, yang merupakan preferensi kontinuitas lunak: -sewa eksklusif mempertahankan status siklus hidup di SQLite, memberlakukan keunikan global pemilik aktif dan -koneksi aktif, serta menolak generasi kedaluwarsa sebelum pengiriman ke penyedia. - -Fitur ini bersifat opsional untuk setiap kunci API. Kunci terkelola harus memiliki cakupan `lease:exclusive` dan -daftar `allowedConnections` eksplisit yang tidak kosong. Klien HTTP mana pun dapat menggunakan endpoint siklus hidup; tidak -diperlukan nama klien, user-agent, penyedia, metode OAuth, ataupun model. Sewa memiliki sebuah koneksi, -bukan model, sehingga perubahan model mempertahankan pengikatan selama koneksi tetap memenuhi syarat -sebagaimana mestinya. Aturan normal terkait model, kuota, kesehatan, masa tunggu, dan daftar izin tetap -menjadi otoritas dan dapat mengalihkan generasi yang sama ke koneksi lain yang bebas dan memenuhi syarat. - -Siklus hidupnya adalah `POST /api/v1/session-leases` dengan tindakan JSON `acquire`, `renew`, dan `release`. -Permintaan inferensi terkelola menyertakan nilai opak `X-OmniRoute-Lease-Owner` dan -`X-OmniRoute-Lease-Generation` yang tepat. Pemilik menggunakan `vlo_` diikuti oleh 43 karakter base64url; hanya -hash SHA-256-nya yang disimpan. Setiap batas pengiriman akhir juga mengikat ID kunci API terautentikasi dan -ID koneksi aktif. Header kontrol sewa dihapus dari log, snapshot permintaan yang disimpan, dan -header eksekutor upstream. - -Jika perutean biasa memiliki kandidat terkelola yang memenuhi syarat tetapi setiap kandidat bebas ditempati oleh -sewa aktif milik pihak lain, OmniRoute mengembalikan HTTP `429`, kode lease-capacity-unavailable, status -menunggu kapasitas, dan `Retry-After` terbatas yang diturunkan dari waktu kedaluwarsa relevan paling awal. -Ketiadaan pemenuhan syarat biasa bukanlah perebutan sewa dan tetap menggunakan semantik kesalahan perutean yang sudah ada. +**Tujuan:** menyediakan kepemilikan koneksi eksklusif yang tahan lama bagi klien yang memerlukan batas perutean ketat di seluruh permintaan. Hal ini berbeda dari afinitas sesi, yang merupakan preferensi kontinuitas lunak: lease eksklusif mempertahankan status siklus hidup di SQLite, memberlakukan keunikan global untuk pemilik aktif dan koneksi aktif, serta menolak generasi usang sebelum pengiriman ke penyedia. + +Fitur ini bersifat opsional untuk setiap kunci API. Kunci terkelola harus memiliki cakupan `lease:exclusive` dan daftar `allowedConnections` eksplisit yang tidak kosong. Klien HTTP mana pun dapat menggunakan endpoint siklus hidup; nama klien, user-agent, penyedia, metode OAuth, maupun model tidak diperlukan. Lease memiliki koneksi, bukan model, sehingga perubahan model mempertahankan pengikatan selama koneksi tetap memenuhi syarat secara normal. Aturan normal terkait model, kuota, kesehatan, cooldown, dan daftar izin tetap menjadi otoritas utama dan dapat memindahkan generasi yang sama ke koneksi bebas lain yang memenuhi syarat. + +Siklus hidupnya adalah `POST /api/v1/session-leases` dengan tindakan JSON `acquire`, `renew`, dan `release`. Permintaan inferensi terkelola menyertakan nilai buram `X-OmniRoute-Lease-Owner` dan `X-OmniRoute-Lease-Generation` yang persis. Pemilik menggunakan `vlo_` diikuti oleh 43 karakter base64url; hanya hash SHA-256-nya yang disimpan. Setiap batas pengiriman akhir juga mengikat ID kunci API yang diautentikasi dan ID koneksi aktif. Header kontrol lease dihapus dari log, snapshot permintaan yang dipertahankan, dan header eksekutor upstream. + +Jika perutean biasa memiliki kandidat terkelola yang memenuhi syarat, tetapi setiap kandidat bebas ditempati oleh lease aktif asing, OmniRoute mengembalikan HTTP `429`, kode lease-capacity-unavailable, status menunggu kapasitas, dan `Retry-After` terbatas yang diperoleh dari waktu kedaluwarsa relevan paling awal. Ketiadaan kelayakan biasa bukanlah perebutan lease dan tetap menggunakan semantik kesalahan perutean yang sudah ada. Mekanisme terkait tetap terpisah: -- Okupansi sesi OAuth adalah distribusi lunak lokal proses untuk akun OAuth. -- Semaphore akun memberikan izin konkurensi permintaan dan berakhir ketika permintaan selesai. -- Sewa koneksi sesi terkelola eksklusif adalah kepemilikan siklus hidup tahan lama dengan batas generasi. +- Okupansi sesi OAuth adalah distribusi lunak lokal-proses untuk akun OAuth. +- Semaphore akun memberikan izin konkurensi permintaan dan berakhir saat permintaan selesai. +- Lease koneksi sesi terkelola eksklusif adalah kepemilikan siklus hidup yang tahan lama dengan batas generasi. --- @@ -287,46 +331,71 @@ per model. Dibatasi oleh `comboCooldownWait` (`enabled`, `maxWaitMs`, `maxAttemp --- -## 5. Kontrol Penerimaan Antrean Permintaan (v3.8.49 · issue #6593) +## 5. Kontrol Penerimaan Antrean Permintaan (v3.8.49 · isu #6593) -**Cakupan**: antrean batas laju lokal per penyedia+koneksi (`open-sse/services/rateLimitManager.ts`, +**Cakupan**: antrean pembatasan laju lokal per penyedia+koneksi (`open-sse/services/rateLimitManager.ts`, yang didukung oleh Bottleneck), satu lapisan di bawah ketiga mekanisme di atas. -**`maxWaitMs` adalah nama persisten lama untuk kedaluwarsa eksekusi.** -`resilienceSettings.requestQueue.maxWaitMs` diteruskan ke Bottleneck sebagai -`expiration` pekerjaan, yang pengatur waktunya baru dimulai setelah dispatch. Karena itu, pengaturan ini membatasi -eksekusi yang dikelola limiter, bukan waktu yang dihabiskan dalam antrean lokal. Kedaluwarsa -ditampilkan sebagai `code: "RATE_LIMIT_EXECUTION_TIMEOUT"` lokal tepercaya (HTTP 504); -nama kode timeout antrean sebelumnya hanya diterima untuk kompatibilitas mundur -internal tepercaya. Nilai default-nya adalah 15000ms; timpa melalui -`RATE_LIMIT_MAX_WAIT_MS` (env) atau dasbor (**Pengaturan → Resiliensi**, -batas maksimum UI 1–30000ms). Waktu menetap dalam antrean tidak memiliki tenggat; gunakan -`maxQueueDepth` di bawah untuk membatasi pemanggil yang mengantre. +**`maxWaitMs` membatasi waktu tunggu antrean; `executionMaxWaitMs` membatasi eksekusi.** +Keduanya sengaja dipisahkan, dan tidak ada yang memengaruhi satu sama lain. + +`resilienceSettings.requestQueue.maxWaitMs` adalah **anggaran waktu tunggu antrean**: +ini mencakup waktu menunggu slot penyedia lalu berada dalam status QUEUED, dan pengatur waktunya +dihapus saat pekerjaan meninggalkan status QUEUED dan mulai dieksekusi +(`rateLimitManager.ts`, `wrappedFn`). Permintaan yang melampaui batas ini tidak pernah mencapai +upstream. Nilai default-nya adalah 30000ms, yang disediakan oleh `DEFAULT_REQUEST_QUEUE_MAX_WAIT_MS` +di `src/lib/resilience/settings.ts` dan dipatok oleh +`tests/unit/ratelimit-admission-control-6593.test.ts`, sehingga perubahan terhadapnya akan membuat +pengujian tersebut gagal, alih-alih membiarkan paragraf ini diam-diam menjadi usang. + +`resilienceSettings.requestQueue.executionMaxWaitMs` adalah nilai yang diterima Bottleneck +sebagai `expiration` pekerjaan, yang pengatur waktunya baru dimulai setelah dispatch. Ini merupakan +pengaman terakhir bagi eksekutor yang tidak memiliki batas waktu upstream sendiri, dan nilainya +dinaikkan ke batas waktu mulai-fetch milik eksekutor jika batas waktu tersebut lebih lama, sehingga +tidak dapat memutus respons in-flight yang sehat. Nilai default-nya adalah 600000ms (10 menit). + +Memasukkan anggaran antrean ke dalam `expiration` sebelumnya menyebabkan gateway non-inkremental +terhenti saat masih berjalan — gateway tersebut secara sah berjalan selama beberapa menit sebelum byte pertama muncul — +dan inilah alasan expiration ditampilkan sebagai `code: +"RATE_LIMIT_EXECUTION_TIMEOUT"` (HTTP 504), sedangkan anggaran antrean menggunakan +kode batas waktu antrean. Timpa salah satunya melalui `RATE_LIMIT_MAX_WAIT_MS` / +`RATE_LIMIT_EXECUTION_MAX_WAIT_MS` (env) atau dasbor +(**Settings → Resilience**). Keduanya dibatasi ke 1ms–24j saat dinormalisasi. + +**Prioritas, untuk keduanya:** variabel env hanya menyediakan nilai _default_. Nilai yang +disimpan secara persisten di `resilienceSettings.requestQueue` (dasbor / patch API, disimpan +di `key_value`) lebih diprioritaskan, dan `rateLimitOverrides.maxWaitMs` / +`.executionMaxWaitMs` per koneksi lebih diprioritaskan lagi. Oleh karena itu, menetapkan +variabel env pada deployment yang sudah memiliki nilai persisten tidak akan +mengubah apa pun — hapus atau perbarui pengaturan persisten tersebut sebagai gantinya. + +Waktu berada dalam antrean dibatasi oleh `maxWaitMs`; `maxQueueDepth` di bawah ini membatasi +jumlah pemanggil yang dapat berada dalam antrean secara bersamaan. **`maxQueueDepth` — batas penerimaan opsional (baru).** `resilienceSettings.requestQueue.maxQueueDepth` -membatasi jumlah permintaan yang boleh berada dalam antrean (belum didispatch) untuk satu -penyedia+koneksi pada saat yang sama. Ketika antrean sudah menampung `maxQueueDepth` -permintaan, permintaan baru akan langsung ditolak dengan error bertipe +membatasi jumlah permintaan yang dapat berada dalam antrean (belum di-dispatch) untuk satu +penyedia+koneksi secara bersamaan. Ketika antrean sudah menampung `maxQueueDepth` +permintaan, permintaan baru akan segera ditolak dengan error bertipe `code: "RATE_LIMIT_QUEUE_FULL"` **sebelum** mencapai `limiter.schedule()` -— sehingga penolakan tersebut ringan dan terjadi sebelum pekerjaan -kompresi prompt / penerjemahan downstream untuk permintaan tersebut. Nilai default `0` = -dinonaktifkan, sehingga mempertahankan perilaku antrean tanpa batas yang sudah ada; rentang dibatasi 0–100000. +— sehingga penolakan tersebut berbiaya rendah dan terjadi sebelum pekerjaan downstream apa pun +untuk kompresi prompt / penerjemahan permintaan tersebut. Nilai default `0` = +dinonaktifkan, mempertahankan perilaku antrean tak terbatas yang sudah ada; dibatasi pada 0–100000. Timpa melalui `RATE_LIMIT_MAX_QUEUE_DEPTH` (env) atau -`resilienceSettings.requestQueue.maxQueueDepth` (patch dasbor/API). +`resilienceSettings.requestQueue.maxQueueDepth` (dasbor/patch API). Pemeriksaan penerimaan itu sendiri merupakan fungsi murni (`open-sse/services/rateLimitManager/admission.ts::checkQueueAdmission`) sehingga -dapat diuji secara unit tanpa limiter Bottleneck sungguhan. +dapat diuji dengan pengujian unit tanpa limiter Bottleneck yang sebenarnya. > RFC yang membuka #6593 juga mengusulkan flag `bypassCompressionOnRateLimit`. -> Pipeline `open-sse/services/compression/` pada repo ini merupakan +> Pipeline `open-sse/services/compression/` milik repo ini adalah > kompresi prompt/konteks pada permintaan LLM keluar (`chatCore.ts`, > di sekitar blok `resolveCompressionSettings`/`selectCompressionStrategy`), -> bukan kompresi respons HTTP pada isi 429 yang disintesis — tidak ada -> alur kode yang sesuai untuk flag bypass secara harfiah. Langkah kompresi prompt tersebut +> bukan kompresi respons HTTP pada body 429 yang disintesis — tidak ada +> jalur kode yang sesuai untuk flag bypass harfiah. Langkah kompresi prompt tersebut > saat ini juga berjalan _sebelum_ `withRateLimit()` dalam pipeline permintaan, sehingga -> mengubah urutan untuk melewatinya saat terjadi penolakan akibat antrean penuh merupakan perubahan terpisah dan lebih -> besar daripada cakupan issue ini; perubahan tersebut sengaja **tidak** diimplementasikan +> mengubah urutan agar langkah tersebut dilewati saat terjadi penolakan karena antrean penuh merupakan perubahan terpisah yang +> lebih besar daripada cakupan isu ini; perubahan tersebut sengaja **tidak** diimplementasikan > di sini dan dibiarkan sebagai tindak lanjut jika penghematan CPU sepadan dengan > risiko perubahan urutan. diff --git a/docs/i18n/id/docs/architecture/admission-lanes.md b/docs/i18n/id/docs/architecture/admission-lanes.md index 3a9f3a252f2f..04e68a37097d 100644 --- a/docs/i18n/id/docs/architecture/admission-lanes.md +++ b/docs/i18n/id/docs/architecture/admission-lanes.md @@ -9,48 +9,53 @@ saling melengkapi; operator harus mengetahui sistem mana yang sedang mereka liha ## 1. Penerimaan tingkat byte di seluruh proses (`chatBodyAdmission.ts`) -- **Cakupan:** jalur buffered-body/heap untuk `POST /v1/chat/completions`, +- **Cakupan:** jalur isi yang di-buffer/heap untuk `POST /v1/chat/completions`, `/v1/messages`, `/v1/responses`, dan rute lain yang berbentuk chat. Melindungi - dari amplifikasi heap akibat body agen coding berukuran besar (#4380). -- **Satu pengontrol global proses, bukan jalur per kunci (#10110).** Setiap kunci API + dari amplifikasi heap akibat isi agen pengodean berukuran besar (#4380). +- **Satu pengontrol global per proses, bukan jalur per kunci (#10110).** Setiap kunci API (yang di-hash) atau sesi `anonymous` diterima berdasarkan anggaran bersama yang **sama** — id sesi yang di-hash digunakan HANYA sebagai kunci penjadwalan yang adil - (dispatch round-robin di antara permintaan yang menunggu), tidak pernah sebagai - shard kapasitas. Versi terdahulu dokumen ini menjelaskan jalur per kunci dengan + (pengiriman round-robin di antara pihak yang menunggu), tidak pernah sebagai shard + kapasitas. Versi sebelumnya dari dokumen ini menjelaskan jalur per kunci dengan kapasitas independen; model tersebut dihapus dalam #10110 karena memungkinkan - kredensial palsu tanpa autentikasi melipatgandakan batas seluruh proses. -- **Gate (#503-fanout): anggaran BYTE masuk yang diturunkan secara otomatis, bukan - jumlah permintaan tetap.** Batas berbasis jumlah permintaan lama - `CHAT_MAX_HEAVY_IN_FLIGHT` (default `1` sebelum perbaikan ini) menurunkan fan-out - agen coding (beberapa subagen/CLI, body biasanya > 256 KB) menjadi konkurensi efektif - ~1, yang mengakibatkan respons 503 pada beban yang sepenuhnya normal. Sekarang batas - tersebut hanya berlaku ketika operator secara eksplisit menetapkan - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`. Jika tidak ditetapkan, penerimaan akan dibatasi - oleh `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — anggaran yang diturunkan secara otomatis - dari batas memori aktual proses (`src/shared/middleware/admissionBudget.ts`): - 25% dari nilai yang lebih ketat antara batas heap V8 dan batas cgroup/container, - dibagi dengan faktor amplifikasi sementara 8x, lalu dibatasi antara 8 MiB dan - 2 GiB. Override eksplisit menggunakan batas minimum dan maksimum yang sama. Anggaran - ini menyesuaikan sendiri dari container 512 MB hingga desktop 32 GB tanpa penyetelan - env. Body yang tidak dapat dimuat dalam anggaran efektif akan langsung gagal dengan - `413 body_exceeds_budget`; hanya persaingan di antara body yang masing-masing dapat - dilayani yang akan masuk ke antrean keadilan terbatas. Pelacak tekanan sumber daya - multi-sinyal secara langsung (rasio heap V8, cgroup, PSI, peristiwa OOM — - `open-sse/utils/resourcePressurePolicy.ts`) mempersingkat waktu tunggu terbatas saat - tekanan `high` dan langsung melepaskan beban dengan `503 resource_pressure` saat - tekanan `critical`, bahkan sebelum byte apa pun diterima. + kredensial palsu yang tidak diautentikasi melipatgandakan batas seluruh proses. +- **Gerbang (#503-fanout): anggaran BYTE penyerapan yang diturunkan secara otomatis, + bukan jumlah permintaan tetap.** Batas jumlah permintaan lama + `CHAT_MAX_HEAVY_IN_FLIGHT` (default `1` sebelum perbaikan ini) membuat fan-out agen + pengodean (beberapa subagen/CLI, isi biasanya > 256 KB) runtuh menjadi konkurensi + efektif ~1, sehingga menghasilkan 503 dalam beban yang sepenuhnya normal. Kini, + batas tersebut hanya berlaku ketika operator menetapkan + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` secara eksplisit. Jika tidak ditetapkan, + penerimaan sebagai gantinya dibatasi oleh `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — + anggaran yang diturunkan secara otomatis dari batas memori nyata proses + (`src/shared/middleware/admissionBudget.ts`): 25% dari nilai yang lebih ketat antara + batas heap V8 dan batas cgroup/container apa pun, dibagi dengan faktor amplifikasi + sementara 8x, lalu dibatasi antara 8 MiB dan 2 GiB. Penimpaan eksplisit menggunakan + batas yang sama. Anggaran ini menyesuaikan diri dari container 512 MB hingga desktop + 32 GB tanpa penyetelan env. Isi yang tidak dapat dimuat dalam anggaran efektif akan + langsung gagal dengan `413 body_exceeds_budget`; hanya persaingan di antara isi yang + masing-masing dapat dilayani yang masuk ke antrean keadilan terbatas. Pelacak + tekanan sumber daya multi-sinyal secara langsung (rasio heap V8, cgroup, PSI, + peristiwa OOM — `open-sse/utils/resourcePressurePolicy.ts`) memperpendek waktu + tunggu terbatas saat tekanan `high` dan langsung mengurangi beban dengan + `503 resource_pressure` saat tekanan `critical`, bahkan sebelum byte apa pun + diserap. PSI dibaca dari `memory.pressure` cgroup milik unit ini jika tersedia + (`open-sse/utils/resourcePressureSampler.ts`); `/proc/pressure/memory` berlaku + untuk seluruh host dan hanya menjadi fallback pada bare metal / cgroup v1, sehingga + host yang melakukan swapping tidak dapat menghasilkan 503 pada container yang + menganggur. - **Penyetelan:** - - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — override untuk anggaran byte yang diturunkan secara otomatis - - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — batas jumlah permintaan lama, hanya berlaku jika diaktifkan + - `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — penimpaan untuk anggaran byte yang diturunkan secara otomatis + - `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` — batas jumlah permintaan lama, hanya ikut serta secara eksplisit - `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` — waktu tunggu antrean sebelum 503 (default 2000) - - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — katup heap untuk byte yang diantrekan (default 4 MB) + - `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` — katup heap untuk byte yang mengantre (default 4 MB) - `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` / `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` — tidak digunakan lagi - sejak #10110 (diterima untuk kompatibilitas konfigurasi, tetapi diabaikan) + dan tidak melakukan apa pun sejak #10110 (diterima untuk kompatibilitas konfigurasi, diabaikan) - **Laporan:** `GET /api/monitoring/health` → `chatAdmission` (#11244) — termasuk - penambahan #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` + tambahan #503-fanout `inflightBytes`, `maxInflightBytes`, `budgetSource` (`v8_heap` | `cgroup` | `override`), `pressureSeverity`, dan `countCapEnabled` (false pada deployment default — mengonfirmasi bahwa anggaran byte, bukan batas - jumlah lama, adalah pembatas yang benar-benar berlaku). + jumlah lama, adalah batas yang benar-benar berlaku). ## 2. Lane virtual runtime adaptif (`open-sse/services/admission`) diff --git a/docs/i18n/id/docs/frameworks/EMBEDDED-SERVICES.md b/docs/i18n/id/docs/frameworks/EMBEDDED-SERVICES.md index 7a40b7d2c44c..b5f60cbc0e2c 100644 --- a/docs/i18n/id/docs/frameworks/EMBEDDED-SERVICES.md +++ b/docs/i18n/id/docs/frameworks/EMBEDDED-SERVICES.md @@ -5,8 +5,8 @@ --- > **Versi:** v3.8.44 -> **Terakhir diperbarui:** 2026-07-03 -> **Audiens:** Engineer yang menambahkan, memelihara, atau men-debug layanan tersemat (9Router, CLIProxyAPI, Mux, Bifrost). +> **Terakhir diperbarui:** 2026-09-09 +> **Audiens:** Engineer yang menambahkan, memelihara, atau melakukan debug pada layanan tersemat (9Router, CLIProxyAPI, Mux, Bifrost, open-wa). Layanan tersemat adalah alat sidecar proses yang diinstal secara lokal, yang diinstal, diawasi, dan diekspos oleh OmniRoute sebagai target perutean kelas utama. Tidak seperti penyedia eksternal (yang diakses melalui internet @@ -29,35 +29,36 @@ menggunakan kunci API), layanan tersemat berjalan pada mesin yang sama dengan Om ## 1. Ikhtisar -### Mengapa menggunakan layanan tersemat? +### Mengapa layanan tersemat? -Terdapat lima layanan tersemat: +Enam layanan disematkan: -| Layanan | Paket npm | Port default | Tujuan | -| --------------- | ------------------------------------------- | :----------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **9Router** | `9router` | 20130 | Router AI yang dapat digunakan OmniRoute sebagai subpenyedia. Model diekspos sebagai `9router/{sub}/{model}` | -| **CLIProxyAPI** | Biner rilis GitHub (`cliproxy`) | 8317 | Adaptor proksi lokal untuk alur autentikasi Anthropic CLI. Menyediakan perutean fallback ketika token OAuth kedaluwarsa | -| **Mux** | `mux` (`mux server` tanpa antarmuka grafis) | 8322 | Daemon orkestrasi agen lokal (coder/mux). Hanya dikelola siklus hidupnya — bukan target perutean (tanpa proksi LLM). | -| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend relai gateway AI berbasis Go. Saat berjalan, dipilih secara otomatis oleh rute relai (`/v1/relay/`) | -| **Dario** | `@askalf/dario` | 3456 | Proksi langganan Claude — alternatif/failover untuk CLIProxyAPI bagi lalu lintas berbentuk Claude Code; kunci yang disuntikkan menjadi `DARIO_ADMIN_TOKEN` yang membatasi bidang kontrol OAuth `/admin/*` miliknya | +| Layanan | Paket npm | Port bawaan | Tujuan | +| --------------- | ------------------------------- | :---------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **9Router** | `9router` | 20130 | Router AI yang dapat digunakan OmniRoute sebagai subpenyedia. Model diekspos sebagai `9router/{sub}/{model}` | +| **CLIProxyAPI** | Biner rilis GitHub (`cliproxy`) | 8317 | Adaptor proksi lokal untuk alur autentikasi CLI Anthropic. Menyediakan perutean cadangan saat token OAuth kedaluwarsa | +| **Mux** | `mux` (`mux server` tanpa UI) | 8322 | Daemon orkestrasi agen lokal (coder/mux). Hanya dikelola siklus hidupnya — bukan target perutean (tanpa pemroksian LLM). | +| **Bifrost** | `@maximhq/bifrost` | 8080 | Backend relai gateway AI berbasis Go. Saat berjalan, dipilih secara otomatis oleh rute relai (`/v1/relay/`) | +| **Dario** | `@askalf/dario` | 3456 | Proksi langganan Claude — alternatif/failover untuk CLIProxyAPI bagi lalu lintas berformat Claude Code; kunci yang disuntikkan menjadi `DARIO_ADMIN_TOKEN` yang membatasi akses ke control plane OAuth `/admin/*` | +| **open-wa** | `@open-wa/wa-automate` | 8323 | Otomatisasi WhatsApp Web (Chromium tanpa UI melalui Puppeteer). Hanya dikelola siklus hidupnya — bukan target perutean. | -Kelima layanan mengikuti model pengawasan yang sama: +Keenamnya mengikuti model supervisi yang sama: - OmniRoute menginstalnya di bawah `DATA_DIR/services/{name}/` (terisolasi dari `package.json` milik OmniRoute) -- OmniRoute menjalankan dan memantaunya sebagai proses turunan -- OmniRoute menyuntikkan kunci API sementara ke lingkungan proses turunan dan merotasinya tanpa waktu henti (jika berlaku) -- Semua rute pengelolaan (`/api/services/*`) bersifat **HANYA_LOKAL** — hanya dapat diakses dari loopback (aturan tegas #17) +- OmniRoute menjalankan dan memantaunya sebagai proses anak +- OmniRoute menyuntikkan kunci API sementara ke lingkungan proses anak dan merotasinya tanpa waktu henti (jika berlaku) +- Semua rute pengelolaan (`/api/services/*`) bersifat **LOCAL_ONLY** — hanya dapat diakses dari loopback (aturan mutlak #17) ### Keputusan utama (dari rencana desain) | Keputusan | Nilai | | --------------------------------- | -------------------------------------------------------------------------------------------- | -| Akses dasbor ke UI native 9Router | Proksi terbalik di `/dashboard/providers/services/9router/embed/*` | +| Akses dasbor ke UI native 9Router | Proksi balik di `/dashboard/providers/services/9router/embed/*` | | Mekanisme instalasi | `npm install {package}` melalui `execFile` (tanpa interpolasi shell) | | Mode penggunaan | Penyedia didaftarkan sebagai `9router/{sub}/{model}` di mesin perutean | | Pengelolaan kunci API | OmniRoute membuat, mengenkripsi saat disimpan (AES-256-GCM), dan menyuntikkannya melalui env | | Lokasi dasbor | `/dashboard/providers/services` (tiga tab) | -| Mulai otomatis | Tombol alih per layanan, default NONAKTIF | +| Mulai otomatis | Sakelar per layanan, bawaan NONAKTIF | --- @@ -68,10 +69,10 @@ Kelima layanan mengikuti model pengawasan yang sama: │ Lapisan 1 — UI │ │ /dashboard/providers/services (tab: CLIProxyAPI | 9Router | Mux) │ │ Log langsung (SSE), Mulai/Hentikan/Mulai Ulang/Perbarui, │ -│ Pengaturan, Instal │ +│ Pengaturan, Instalasi │ │ │ │ src/app/(dashboard)/dashboard/providers/services/ │ -│ ├── page.tsx Kerangka + perutean tab via ?tab= │ +│ ├── page.tsx Shell + perutean tab berdasarkan ?tab=│ │ ├── tabs/ CliproxyServiceTab, NinerouterServiceTab,│ │ │ MuxServiceTab │ │ └── components/ ServiceStatusCard, ServiceLifecycleButtons,│ @@ -98,13 +99,13 @@ Kelima layanan mengikuti model pengawasan yang sama: │ Lapisan 3 — ServiceSupervisor (src/lib/services/) │ │ │ │ ServiceSupervisor.ts Supervisor generik (child_process.spawn) │ -│ ├── install: execFile('npm', ['install', pkg, '--prefix']) │ -│ ├── start: spawn(node, [entrypoint], {env, cwd}) │ +│ ├── instalasi: execFile('npm', ['install', pkg, '--prefix']) │ +│ ├── mulai: spawn(node, [entrypoint], {env, cwd}) │ │ ├── api_key: crypto.randomBytes(32) → env NINEROUTER_API_KEY │ │ ├── port: 20130 untuk 9Router (dapat dikonfigurasi) │ -│ ├── logs: buffer cincin stdio 5 MB → peristiwa SSE │ -│ ├── health: HTTP GET /health setiap 2–5 dtk, pemulihan malas│ -│ └── lifecycle: SIGTERM 15 dtk → SIGKILL │ +│ ├── log: buffer cincin stdio 5 MB → peristiwa SSE │ +│ ├── kesehatan: HTTP GET /health tiap 2–5 dtk, pemulihan malas │ +│ └── siklus hidup: SIGTERM 15 dtk → SIGKILL │ │ │ │ registry.ts getSupervisor(name) / registerSupervisor() │ │ bootstrap.ts Melakukan bootstrap semua SERVICES[] saat │ @@ -113,7 +114,7 @@ Kelima layanan mengikuti model pengawasan yang sama: │ modelSync.ts GET /v1/models berkala → tabel service_models │ │ ringBuffer.ts Buffer log melingkar (5 MB per layanan) │ │ healthCheck.ts Probe kesehatan HTTP dengan polling │ -│ installers/ ninerouter.ts, cliproxy.ts, mux.ts │ +│ installers/ ninerouter.ts, cliproxy.ts, mux.ts, openwa.ts │ │ (adaptor penginstal) │ └──────────────────────┬─────────────────────────────────────────────┘ │ HTTP kompatibel OpenAI (loopback) @@ -124,14 +125,14 @@ Kelima layanan mengikuti model pengawasan yang sama: │ Mencari ulang port dan kunci API per permintaan (tanpa cache). │ │ Menghapus prefiks "9router/" dari ID model sebelum meneruskan. │ │ Mengembalikan 503 service_not_running jika supervisor tidak │ -│ berada dalam status "running". │ +│ dalam status "running". │ │ │ │ src/shared/constants/providers.ts │ │ Entri untuk "9router": isEmbeddedService: true │ │ │ │ open-sse/config/providerRegistry.ts │ │ Model disimpan sebagai "9router/{sub}/{model}" (berprefiks). │ -│ Disinkronkan setiap 5 menit oleh modelSync.ts. │ +│ Disinkronkan setiap 5 menit oleh modelSync.ts. │ │ │ │ Mux HANYA dikelola siklus hidupnya (Lapisan 1-3) — Mux adalah │ │ daemon orkestrasi agen, bukan proksi LLM, sehingga tidak memiliki │ @@ -149,11 +150,12 @@ Kelima layanan mengikuti model pengawasan yang sama: | `src/lib/services/registry.ts` | Peta singleton `tool → supervisor` | | `src/lib/services/apiKey.ts` | Pembuatan kunci, enkripsi AES-256-GCM saat disimpan | | `src/lib/services/modelSync.ts` | Sinkronisasi model berkala (5 menit) + sesuai permintaan | -| `src/lib/services/ringBuffer.ts` | Buffer log melingkar 5 MB dengan langganan SSE | -| `src/lib/services/healthCheck.ts` | Pemeriksaan kesehatan HTTP (interval dapat dikonfigurasi) | -| `src/lib/services/installers/ninerouter.ts` | Instalasi/pembaruan/penghapusan 9Router melalui npm | -| `src/lib/services/installers/cliproxy.ts` | Instalasi/pembaruan/penghapusan CLIProxyAPI melalui npm | -| `src/lib/services/installers/mux.ts` | Instalasi/pembaruan/penghapusan Mux melalui npm | +| `src/lib/services/ringBuffer.ts` | Buffer log sirkular 5 MB dengan langganan SSE | +| `src/lib/services/healthCheck.ts` | Probe kesehatan HTTP (interval dapat dikonfigurasi) | +| `src/lib/services/installers/ninerouter.ts` | npm install/update/uninstall untuk 9Router | +| `src/lib/services/installers/cliproxy.ts` | npm install/update/uninstall untuk CLIProxyAPI | +| `src/lib/services/installers/mux.ts` | npm install/update/uninstall untuk Mux | +| `src/lib/services/installers/openwa.ts` | npm install/update/uninstall untuk open-wa | | `src/app/api/services/9router/_lib.ts` | Pembantu `getOrInitSupervisor()` | | `src/app/api/services/[name]/logs/route.ts` | Endpoint log SSE bersama | | `open-sse/executors/ninerouter.ts` | Eksekutor penyedia (Lapisan 4) | @@ -219,8 +221,8 @@ Permintaan non-loopback menerima `403 LOCAL_ONLY` terlepas dari token autentikas #### `POST /api/services/9router/install` -Instal 9Router dari npm. Membuat `DATA_DIR/services/9router/` dengan -`package.json` dan `node_modules/` miliknya sendiri. Tidak bertentangan dengan dependensi OmniRoute sendiri. +Menginstal 9Router dari npm. Membuat `DATA_DIR/services/9router/` dengan +`package.json` dan `node_modules/` tersendiri. Tidak berkonflik dengan dependensi OmniRoute sendiri. **Isi permintaan** (semuanya opsional): @@ -228,9 +230,9 @@ Instal 9Router dari npm. Membuat `DATA_DIR/services/9router/` dengan { "version": "latest" } ``` -| Bidang | Tipe | Bawaan | Deskripsi | -| --------- | -------- | ---------- | ---------------------------------------- | -| `version` | `string` | `"latest"` | tag versi npm atau semver untuk diinstal | +| Bidang | Tipe | Default | Deskripsi | +| --------- | -------- | ---------- | --------------------------------------- | +| `version` | `string` | `"latest"` | Tag versi npm atau semver yang diinstal | **Respons:** @@ -238,7 +240,7 @@ Instal 9Router dari npm. Membuat `DATA_DIR/services/9router/` dengan | ------ | --------------------------------------------------------------------- | | `200` | `{ ok: true, installedVersion: "x.y.z", path: "..." }` | | `400` | Isi permintaan tidak valid (kegagalan validasi Zod) | -| `409` | Sedang melakukan instalasi (kunci sedang dipegang) | +| `409` | Sedang diinstal (kunci ditahan) | | `500` | Instalasi npm gagal — lihat `message` untuk pesan yang mudah dipahami | **Catatan:** Menggunakan `execFile('npm', [...])` — tanpa shell, tanpa interpolasi (aturan mutlak #13). @@ -248,8 +250,8 @@ Kesalahan EACCES ditampilkan sebagai pesan yang mudah dipahami. #### `POST /api/services/9router/start` -Mulai 9Router. Mendaftarkan supervisor jika belum terdaftar, lalu memanggil -`supervisor.start()`. Bersifat idempoten ketika sudah berjalan. +Memulai 9Router. Mendaftarkan supervisor jika belum terdaftar, lalu memanggil +`supervisor.start()`. Bersifat idempoten jika sudah berjalan. **Isi permintaan:** tidak ada @@ -279,8 +281,8 @@ Mulai 9Router. Mendaftarkan supervisor jika belum terdaftar, lalu memanggil #### `POST /api/services/9router/stop` -Hentikan 9Router dengan baik. Mengirim SIGTERM, menunggu 15 dtk, lalu mengirim SIGKILL jika masih aktif. -Bersifat idempoten ketika sudah berhenti. +Menghentikan 9Router dengan aman. Mengirim SIGTERM, menunggu 15 detik, lalu mengirim SIGKILL jika masih aktif. +Bersifat idempoten jika sudah berhenti. **Isi permintaan:** tidak ada @@ -295,7 +297,7 @@ Bersifat idempoten ketika sudah berhenti. #### `POST /api/services/9router/restart` -Setara dengan `stop()` lalu `start()` di bawah kunci operasi. +Setara dengan `stop()` lalu `start()` dalam kunci operasi. **Isi permintaan:** tidak ada @@ -305,7 +307,7 @@ Setara dengan `stop()` lalu `start()` di bawah kunci operasi. #### `POST /api/services/9router/update` -Memperbarui 9Router ke versi npm yang lebih baru. Jika layanan sedang berjalan, layanan tersebut dihentikan +Memperbarui 9Router ke versi npm yang lebih baru. Jika layanan sedang berjalan, layanan akan dihentikan terlebih dahulu, instalasi npm dijalankan (menginstal versi yang lebih baru di lokasi yang sama), lalu layanan dimulai ulang. @@ -327,8 +329,8 @@ layanan dimulai ulang. #### `POST /api/services/9router/rotate-key` -Menghasilkan kunci API baru untuk 9Router, mengenkripsinya saat tersimpan, dan memulai ulang layanan -(jika sedang berjalan) agar layanan mengambil kunci baru dari lingkungannya. Kunci lama +Menghasilkan kunci API baru untuk 9Router, mengenkripsinya saat disimpan, dan memulai ulang layanan +(jika sedang berjalan) agar menggunakan kunci baru dari lingkungannya. Kunci lama segera dibatalkan. **Isi permintaan:** tidak ada @@ -341,7 +343,7 @@ segera dibatalkan. | `500` | Rotasi gagal | **Keamanan:** Kunci baru tidak pernah dikembalikan dalam respons (tidak ada kebocoran kredensial). -Kunci disimpan dalam keadaan terenkripsi (AES-256-GCM) di tabel `version_manager`. +Kunci disimpan secara terenkripsi (AES-256-GCM) dalam tabel `version_manager`. --- @@ -380,8 +382,8 @@ Mengembalikan gabungan status langsung + DB, termasuk metadata versi dan pratinj #### `POST /api/services/9router/auto-start` -Mengalihkan flag mulai otomatis. Saat `enabled: true`, layanan dimulai secara otomatis -ketika OmniRoute melakukan boot berikutnya (jika layanan sudah diinstal). +Mengaktifkan atau menonaktifkan flag mulai otomatis. Saat `enabled: true`, layanan dimulai secara otomatis +ketika OmniRoute melakukan boot berikutnya (jika layanan telah diinstal). **Isi permintaan:** @@ -400,11 +402,11 @@ ketika OmniRoute melakukan boot berikutnya (jika layanan sudah diinstal). #### `GET /api/services/9router/logs` -Stream SSE log langsung dari buffer cincin stdout/stderr milik 9Router. +Stream SSE log langsung dari buffer cincin stdout/stderr 9Router. **Parameter kueri:** -| Parameter | Tipe | Bawaan | Deskripsi | +| Parameter | Tipe | Default | Deskripsi | | --------- | --------- | --------- | ----------------------------------------------------------------------------------- | | `tail` | `integer` | 200 | Jumlah baris historis yang dikirim terlebih dahulu (maks. 1000) | | `filter` | `string` | tidak ada | Filter substring tanpa membedakan huruf besar-kecil (tanpa regex — aman dari ReDoS) | @@ -413,7 +415,7 @@ Stream SSE log langsung dari buffer cincin stdout/stderr milik 9Router. | Peristiwa | Data | Deskripsi | | ----------- | ----------- | -------------------------- | -| `snapshot` | `LogLine[]` | Bagian akhir historis awal | +| `snapshot` | `LogLine[]` | Bagian akhir riwayat awal | | `log` | `LogLine` | Baris log langsung | | `heartbeat` | `{}` | Keep-alive setiap 15 detik | @@ -433,15 +435,15 @@ Stream SSE log langsung dari buffer cincin stdout/stderr milik 9Router. | ------ | ---------------------------------------------------- | | `200` | `text/event-stream` | | `400` | Parameter `filter` terlalu panjang (> 200 karakter) | -| `404` | Layanan tidak ditemukan (supervisor belum terdaftar) | +| `404` | Layanan tidak ditemukan (supervisor tidak terdaftar) | --- ### 4.2 Endpoint CLIProxyAPI (10 rute) -CLIProxyAPI memiliki struktur endpoint yang sama seperti 9Router tanpa `rotate-key`, ditambah +CLIProxyAPI memiliki bentuk endpoint yang sama dengan 9Router tanpa `rotate-key`, ditambah `accounts`, `provider-expose`, dan `auto-restart-adopted`. Kini layanan ini menerima -kunci API data-plane khusus yang disuntikkan saat proses dijalankan (`needsApiKey: true` di +kunci API bidang data khusus yang disuntikkan saat proses dimunculkan (`needsApiKey: true` di `bootstrap.ts`, digunakan untuk sinkronisasi model); `status` mencakup lebih sedikit kolom. | Metode | Jalur | Deskripsi | @@ -452,7 +454,7 @@ kunci API data-plane khusus yang disuntikkan saat proses dijalankan (`needsApiKe | `POST` | `/api/services/cliproxy/restart` | Mulai ulang CLIProxyAPI | | `POST` | `/api/services/cliproxy/update` | Perbarui ke versi yang lebih baru | | `GET` | `/api/services/cliproxy/status` | Status langsung + DB (tanpa `apiKeyMasked`) | -| `POST` | `/api/services/cliproxy/auto-start` | Alihkan mulai otomatis | +| `POST` | `/api/services/cliproxy/auto-start` | Aktifkan/nonaktifkan mulai otomatis | Endpoint bersama `GET /api/services/{name}/logs` (lihat §4.1) berfungsi untuk keempat layanan menggunakan segmen dinamis `[name]`. @@ -461,11 +463,11 @@ layanan menggunakan segmen dinamis `[name]`. ### 4.3 Endpoint Mux (8 rute) -Mux memiliki struktur endpoint yang sama seperti CLIProxyAPI — tidak ada rute `rotate-key` pada -permukaan API (token bearer dihasilkan dengan cara yang sama seperti milik 9Router melalui +Mux memiliki bentuk endpoint yang sama dengan CLIProxyAPI — tidak ada rute `rotate-key` pada +permukaan API (token bearer dibuat dengan cara yang sama seperti milik 9Router melalui `getOrCreateApiKey("mux")` dan disuntikkan melalui variabel lingkungan `MUX_SERVER_AUTH_TOKEN`, tetapi belum ada endpoint rotasi khusus). Mux hanya dikelola siklus hidupnya: tidak seperti -9Router, Mux tidak memiliki eksekutor Lapisan 4 dan tidak pernah didaftarkan sebagai penyedia perutean. +9Router, Mux tidak memiliki eksekutor Layer 4 dan tidak pernah didaftarkan sebagai penyedia perutean. | Metode | Jalur | Deskripsi | | ------ | ------------------------------ | ------------------------------------- | @@ -475,44 +477,79 @@ belum ada endpoint rotasi khusus). Mux hanya dikelola siklus hidupnya: tidak sep | `POST` | `/api/services/mux/restart` | Mulai ulang Mux | | `POST` | `/api/services/mux/update` | Perbarui ke versi npm yang lebih baru | | `GET` | `/api/services/mux/status` | Status langsung + DB | -| `POST` | `/api/services/mux/auto-start` | Alihkan mulai otomatis | +| `POST` | `/api/services/mux/auto-start` | Aktifkan/nonaktifkan mulai otomatis | --- ### 4.4 Endpoint Bifrost (8 rute) Bifrost adalah backend relai gateway AI berbasis Go (`@maximhq/bifrost`). Layanan ini menggunakan -struktur endpoint yang sama seperti CLIProxyAPI (tanpa `rotate-key` — Bifrost mengelola sendiri kunci -penyedianya di `config.json` di bawah `-app-dir`). +bentuk endpoint yang sama dengan CLIProxyAPI (tanpa `rotate-key` — Bifrost mengelola sendiri kunci +penyedianya di `config.json` dalam `-app-dir`). | Metode | Jalur | Deskripsi | | ------ | ---------------------------------- | --------------------------------------------------------- | | `POST` | `/api/services/bifrost/install` | Instal Bifrost dari npm (`@maximhq/bifrost`) | -| `POST` | `/api/services/bifrost/start` | Mulai Bifrost pada port 8080 (default) | +| `POST` | `/api/services/bifrost/start` | Mulai Bifrost pada port 8080 (bawaan) | | `POST` | `/api/services/bifrost/stop` | Hentikan Bifrost | | `POST` | `/api/services/bifrost/restart` | Mulai ulang Bifrost | | `POST` | `/api/services/bifrost/update` | Perbarui ke versi yang lebih baru | | `GET` | `/api/services/bifrost/status` | Status langsung + DB | | `POST` | `/api/services/bifrost/auto-start` | Aktifkan/nonaktifkan mulai otomatis | -| `GET` | `/api/services/bifrost/logs` | Tail log SSE (melalui rute dinamis `[name]/logs` bersama) | +| `GET` | `/api/services/bifrost/logs` | Ekor log SSE (melalui rute dinamis bersama `[name]/logs`) | -**Pengaturan perutean:** Ketika `BIFROST_BASE_URL` tidak ditetapkan dan instans Bifrost +**Pengkabelan perutean:** Saat `BIFROST_BASE_URL` tidak ditetapkan dan instans Bifrost yang diawasi sedang berjalan, `getBifrostRoutingConfig()` (di `routingBackend.ts`) secara otomatis -menggunakan `http://127.0.0.1:{port}` sebagai URL dasar relai. Variabel lingkungan `BIFROST_BASE_URL` yang eksplisit -selalu diutamakan. +menggunakan `http://127.0.0.1:{port}` sebagai URL dasar relai. Variabel lingkungan `BIFROST_BASE_URL` +yang ditetapkan secara eksplisit selalu diprioritaskan. --- ### 4.5 Endpoint Dario (12 rute) -Memiliki pola siklus hidup yang sama seperti layanan lainnya (`install`, `start`, `stop`, `restart`, +Bentuk siklus hidup yang sama dengan layanan lainnya (`install`, `start`, `stop`, `restart`, `update`, `status`, `auto-start`, `auto-restart-adopted`) ditambah bidang kontrol OAuth -yang dibatasi token di bawah `admin/`: `admin/accounts`, `admin/import-from-omniroute`, +yang dilindungi token di bawah `admin/`: `admin/accounts`, `admin/import-from-omniroute`, `admin/login-start`, `admin/login-complete` (semuanya dilindungi oleh `DARIO_ADMIN_TOKEN`). -### 4.6 Proksi terbalik (sematan dasbor 9Router) +### 4.6 Endpoint open-wa (7 rute) -Dasbor menyematkan UI web 9Router di dalam iframe melalui proksi terbalik internal +open-wa (`@open-wa/wa-automate`) menjalankan instans Chromium tanpa antarmuka grafis (melalui +Puppeteer) untuk mengotomatiskan WhatsApp Web. Layanan ini menggunakan bentuk endpoint yang sama dengan Mux (belum +ada rute `rotate-key`). Layanan ini hanya dikelola siklus hidupnya — bukan target perutean, +tanpa entri eksekutor/penyedia Layer 4. + +| Metode | Jalur | Deskripsi | +| ------ | --------------------------------- | --------------------------------------------------------- | +| `POST` | `/api/services/openwa/install` | Menginstal open-wa dari npm (`@open-wa/wa-automate`) | +| `POST` | `/api/services/openwa/start` | Menjalankan open-wa pada port 8323 (default) | +| `POST` | `/api/services/openwa/stop` | Menghentikan open-wa | +| `POST` | `/api/services/openwa/restart` | Memulai ulang open-wa | +| `POST` | `/api/services/openwa/update` | Memperbarui ke versi yang lebih baru | +| `GET` | `/api/services/openwa/status` | Status langsung + DB | +| `POST` | `/api/services/openwa/auto-start` | Mengaktifkan/menonaktifkan mulai otomatis | +| `GET` | `/api/services/openwa/logs` | Tail log SSE (melalui rute dinamis `[name]/logs` bersama) | + +**Kunci API:** diinjeksikan sebagai `WA_KEY` — override env generik open-wa +dengan prefiks `WA_*` memetakannya ke opsi CLI `--key`/`-k` +(`dist/cli/setup.js::envArgs()`, diverifikasi terhadap package 4.76.0 yang +terinstal). Diberi prefiks `ow_` saat dibuat oleh `generateServiceApiKey()`. +open-wa membaca kembali kunci dari header HTTP `key`/`api_key` (bukan +`Authorization: Bearer`); `/api-docs*` secara eksplisit dikecualikan dari +pemeriksaan (`setupAuthenticationLayer` di `dist/cli/server.js`), sehingga +probe kesehatan tidak memerlukan header autentikasi. + +**Penyandingan:** open-wa bersifat tidak resmi dan tidak berafiliasi dengan WhatsApp — +nomor yang terhubung berisiko diblokir oleh deteksi otomatisasi milik WhatsApp. +Saat pertama kali dijalankan, kode QR penyandingan dicetak ke stdout dan ditampilkan +melalui panel Log/aliran SSE yang sudah ada — belum ada endpoint gambar QR khusus +dalam integrasi ini. + +--- + +### 4.7 Proksi balik (sematan dasbor 9Router) + +Dasbor menyematkan UI web 9Router di dalam iframe melalui proksi balik internal di: ``` @@ -521,18 +558,19 @@ GET|POST|... /dashboard/providers/services/9router/embed/[...path] Proksi ini: -- Meneruskan permintaan ke `http://127.0.0.1:{port}/{path}` (hanya loopback) +- Meneruskan permintaan ke `http://127.0.0.1:{port}/{path}` (khusus loopback) - Menghapus header `cookie` dan `authorization` yang masuk (tidak ada kebocoran sesi OmniRoute) -- Menyisipkan `Authorization: Bearer {apiKey}` untuk autentikasi 9Router +- Menginjeksikan `Authorization: Bearer {apiKey}` untuk autentikasi 9Router - Menghapus `set-cookie`, `content-security-policy`, `x-frame-options`, `cross-origin-*` dari respons -- Menulis ulang respons HTML untuk menyisipkan `` dan menormalkan jalur absolut (`/foo` → `/dashboard/.../embed/foo`) +- Menulis ulang respons HTML untuk menginjeksikan `` dan menormalkan jalur absolut (`/foo` → `/dashboard/.../embed/foo`) -Peningkatan WebSocket untuk dasbor yang disematkan ditangani oleh server pendamping pada +Upgrade WebSocket untuk dasbor yang disematkan ditangani oleh server pendamping pada port khusus (lihat `src/lib/services/embedWsProxy.ts`). **Keamanan:** Rute proksi sematan diklasifikasikan di bawah `LOCAL_ONLY_API_PREFIXES` dan hanya dapat diakses dari loopback. Penyerang yang memperoleh JWT melalui -tunnel Cloudflare/Ngrok tidak dapat menggunakan proksi untuk mengakses layanan yang disematkan. +tunnel Cloudflare/Ngrok tidak dapat menggunakan proksi untuk mengakses layanan +yang disematkan. --- diff --git a/docs/i18n/id/docs/frameworks/MEMORY.md b/docs/i18n/id/docs/frameworks/MEMORY.md index 40d82464737d..1ce0a55c4936 100644 --- a/docs/i18n/id/docs/frameworks/MEMORY.md +++ b/docs/i18n/id/docs/frameworks/MEMORY.md @@ -165,33 +165,34 @@ Tabel `memory_vec_meta` (migrasi `083_memory_vec.sql`) menyimpan: ## Ekstensi pengaturan Sembilan bidang embedding dan vektor tersedia di `MemorySettingsExtended` dalam -`src/shared/schemas/memory.ts`, yang dipersistenkan melalui `src/lib/db/settings.ts`: +`src/shared/schemas/memory.ts`, dan disimpan melalui `src/lib/db/settings.ts`: | Bidang | Tipe | Default | Deskripsi | | ------------------------ | -------------------------------------------------- | -------- | --------------------------------------------------------------------- | | `embeddingSource` | `"remote" \| "static" \| "transformers" \| "auto"` | `"auto"` | Sumber embedding yang akan digunakan | | `embeddingProviderModel` | `string \| null` | `null` | Penyedia/model dalam format `provider/model` | | `customBaseUrl` | `string \| null` | `null` | URL dasar endpoint kompatibel OpenAI khusus Memori | -| `customModelId` | `string \| null` | `null` | ID model yang dikirim ke endpoint khusus | -| `transformersEnabled` | `boolean` | `false` | Persetujuan penggunaan Transformers.js (MiniLM, ~400MB) | -| `staticEnabled` | `boolean` | `false` | Persetujuan penggunaan model lokal statis potion-base-8M | +| `customModelId` | `string \| null` | `null` | ID model yang dikirim ke endpoint kustom | +| `transformersEnabled` | `boolean` | `false` | Keikutsertaan untuk Transformers.js (MiniLM, ~400MB) | +| `staticEnabled` | `boolean` | `false` | Keikutsertaan untuk model lokal statis potion-base-8M | | `rerankEnabled` | `boolean` | `false` | Aktifkan langkah pemeringkatan ulang (menambah +200-500ms/permintaan) | | `rerankProviderModel` | `string \| null` | `null` | Penyedia/model pemeringkatan ulang dalam format `provider/model` | -| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend vektor yang akan digunakan | -Semua ini diekspos melalui `GET /PUT /api/settings/memory` (skema `MemorySettingsExtendedSchema`). +`rerankProviderModel` di-resolve oleh `POST /v1/rerank` (dipanggil melalui loopback), sehingga menerima apa pun yang diterima rute tersebut: model pemeringkatan ulang cloud terkurasi (`cohere/rerank-v3.5`, `jina-ai/jina-reranker-v3.5`, …) atau node penyedia yang kompatibel dengan OpenAI sebagai `/` (misalnya `skilled-mini/bge-reranker-v2-m3` untuk mesin TEI/Infinity). Node loopback selalu memenuhi syarat; node pada host lain (LAN, Tailscale) juga memerlukan feature flag `RERANK_REMOTE_PROVIDER_NODES` dan harus lolos kebijakan URL keluar penyedia — lihat [Feature Flag](../reference/FEATURE_FLAGS.md). Pemilih dasbor mencantumkan penyedia terkurasi beserta node lokal; string `provider/model` apa pun yang valid dapat ditetapkan secara langsung melalui `PUT /api/settings/memory`. +| `vectorStore` | `"sqlite-vec" \| "qdrant" \| "auto"` | `"auto"` | Backend vektor yang akan digunakan | + +Pengaturan ini diekspos melalui `GET /PUT /api/settings/memory` (skema `MemorySettingsExtendedSchema`). Untuk sumber `remote`, Memori juga menerima pengaturan opsional `customBaseUrl` dan -`customModelId`. Bersama-sama, keduanya memilih endpoint `/embeddings` yang kompatibel -dengan OpenAI beserta modelnya tanpa mengubah registri embedding global. Endpoint -dinormalisasi sebelum digunakan dan diperiksa oleh kebijakan URL keluar penyedia: -HTTP(S) diwajibkan, kredensial tersemat dan string kueri ditolak, serta alamat -metadata cloud tetap diblokir. Nilai kosong mempertahankan penyedia registri yang -dipilih. Galat yang dikembalikan ke dasbor disanitasi dan kredensial endpoint tidak -pernah dicatat dalam log. +`customModelId`. Keduanya memilih endpoint `/embeddings` dan model yang kompatibel +dengan OpenAI tanpa mengubah registri embedding global. Endpoint dinormalisasi sebelum +digunakan dan diperiksa oleh kebijakan URL keluar penyedia: HTTP(S) diwajibkan, +kredensial tertanam dan string kueri ditolak, serta alamat metadata cloud tetap +diblokir. Nilai kosong mempertahankan penyedia registri yang dipilih. Pesan kesalahan +yang dikembalikan ke dasbor disanitasi dan kredensial endpoint tidak pernah dicatat. > **TODO (D20):** Cakupan `global` (berbagi memori di seluruh kunci API) belum -> diimplementasikan dalam rilis ini. Fitur ini memerlukan perubahan skema dan jalur +> diimplementasikan dalam rilis ini. Hal ini memerlukan perubahan skema dan jalur > pengambilan global. Lacak secara terpisah. ## Lapisan Penyimpanan diff --git a/docs/i18n/id/docs/guides/DOCKER_GUIDE.md b/docs/i18n/id/docs/guides/DOCKER_GUIDE.md index 5899fc8bb26b..f73a5486dd4b 100644 --- a/docs/i18n/id/docs/guides/DOCKER_GUIDE.md +++ b/docs/i18n/id/docs/guides/DOCKER_GUIDE.md @@ -25,7 +25,13 @@ --- -## Menjalankan dengan Cepat +## Menjalankan Cepat + +> **Host sendiri dengan satu perintah?** Lihat +> [Panduan Host Sendiri](../getting-started/SELF_HOST_GUIDE.md) — +> `docker compose -f docker-compose.selfhost.yml up -d` (image yang telah dipublikasikan + +> Redis, hanya loopback, tanpa pilihan profil). Menjalankan Cepat di bawah ini adalah +> cara dengan satu container bagi pengguna yang sudah menjalankan Redis di tempat lain. ```bash docker run -d \ diff --git a/docs/i18n/id/docs/guides/TROUBLESHOOTING.md b/docs/i18n/id/docs/guides/TROUBLESHOOTING.md index 0a3fab357074..e882bb8b669a 100644 --- a/docs/i18n/id/docs/guides/TROUBLESHOOTING.md +++ b/docs/i18n/id/docs/guides/TROUBLESHOOTING.md @@ -68,16 +68,24 @@ Tetapkan variabel tersebut di lingkungan proses OmniRoute (daemon, misalnya mela ## Peringatan npm install (ERESOLVE / peer / deprecated) -Saat menjalankan `npm install -g omniroute`, Anda mungkin melihat banyak peringatan seperti `npm warn ERESOLVE`, pemberitahuan dependensi peer, dan pesan `deprecated`. **Hal ini sudah diperkirakan dan tidak berbahaya.** Instalasi Anda berhasil jika output menampilkan `added packages`. +Saat menjalankan `npm install -g omniroute`, Anda mungkin melihat banyak peringatan seperti `npm warn ERESOLVE`, pemberitahuan dependensi peer, dan pesan `deprecated`. **Hal ini wajar dan tidak berbahaya.** Instalasi berhasil jika Anda melihat `added packages` dalam output. -Peringatan tersebut berasal dari rentang dependensi peer yang sudah usang dalam paket pihak ketiga yang tidak dikendalikan oleh OmniRoute: +Untuk menyembunyikan peringatan resolusi dependensi peer, gunakan format instalasi yang didukung OmniRoute: -1. **`marked-terminal` menginginkan `marked >=1 <16`, tetapi menemukan `marked@18`** — dalam praktiknya berfungsi dengan baik; rentang peer dari upstream hanya sudah usang. -2. **`deprecated prebuild-install@7.1.3`** — helper pengambilan biner native yang bersifat transitif. Helper ini tidak - digunakan untuk menginstal binding transport `wreq-js` yang versinya telah ditetapkan dan tidak menunjukkan bahwa - penyiapan transport penyedia web-cookie gagal. +```bash +npm install -g omniroute --legacy-peer-deps +``` + +`--legacy-peer-deps` hanya menyembunyikan `ERESOLVE` dan pemberitahuan dependensi peer. Pemberitahuan penghentian dukungan tetap terlihat karena berasal dari paket pihak ketiga transitif; pemberitahuan tersebut tidak menunjukkan bahwa instalasi gagal. + +Peringatan tersebut berasal dari rentang dependensi peer usang dalam paket pihak ketiga yang tidak dikendalikan OmniRoute: + +1. **`marked-terminal` memerlukan `marked >=1 <16`, tetapi menemukan `marked@18`** — dalam praktiknya tetap berfungsi dengan baik; rentang peer upstream tersebut hanya sudah usang. +2. **`deprecated prebuild-install@7.1.3`** — pembantu pengambilan biner native transitif. Paket ini tidak + digunakan untuk menginstal binding transport `wreq-js` yang versinya dikunci dan tidak menunjukkan bahwa penyiapan transport + penyedia web-cookie gagal. -**Tidak perlu melakukan apa pun** — peringatan tersebut tidak dapat sepenuhnya disembunyikan tanpa melakukan fork pada paket upstream. +**Tidak diperlukan tindakan apa pun** — peringatan tersebut tidak dapat disembunyikan sepenuhnya tanpa melakukan fork pada paket upstream. --- diff --git a/docs/i18n/id/docs/providers/CURSOR-API-KEY-AND-CLI.md b/docs/i18n/id/docs/providers/CURSOR-API-KEY-AND-CLI.md index a5f01de397b9..34b442ef297d 100644 --- a/docs/i18n/id/docs/providers/CURSOR-API-KEY-AND-CLI.md +++ b/docs/i18n/id/docs/providers/CURSOR-API-KEY-AND-CLI.md @@ -6,25 +6,26 @@ Dua cara untuk menempatkan Cursor di belakang OmniRoute tanpa sesi IDE: -1. **Penyedia `cursor-api`** (kartu "Cursor API", alias `cua`): penyedia berbasis kunci API yang menyimpan kunci API pengguna Cursor (`crsr_…`, dibuat di - `https://cursor.com/dashboard/api`). Klien OmniRoute mana pun kemudian dapat mengakses +1. **Penyedia `cursor-api`** (kartu "Cursor API", alias `cua`): penyedia berbasis kunci API + yang menyimpan kunci API pengguna Cursor (`crsr_…`, dibuat di + `https://cursor.com/dashboard/api`). Setiap klien OmniRoute kemudian dapat mengakses model Cursor melalui `/v1/chat/completions` sebagai `cursor-api/` atau - `cua/`, dengan lapisan kuota, fallback, dan pencatatan yang biasa digunakan. Penyedia IDE + `cua/`, dengan lapisan kuota, fallback, dan pencatatan seperti biasa. Penyedia IDE (`cursor`, sesi OAuth/IDE) tidak berubah. -2. **Passthrough Cursor CLI**: arahkan Cursor CLI (`agent`) ke OmniRoute agar +2. **Passthrough Cursor CLI**: arahkan Cursor CLI (`agent`) ke OmniRoute sehingga setiap RPC yang dibuat CLI diautentikasi dengan kunci API OmniRoute, diteruskan ke Cursor menggunakan kredensial koneksi `cursor-api`, dan dicatat di - halaman Log. + halaman Logs. -## Mengapa kunci dipertukarkan +## Alasan kunci dipertukarkan `api2.cursor.sh` menolak kunci mentah `crsr_…` sebagai token Bearer (401). Cursor CLI terlebih dahulu mengirimkan kunci melalui POST ke `/auth/exchange_user_api_key` dan menerima JWT sesi yang kedaluwarsa setelah satu jam; `refreshToken` yang dikembalikan memiliki -`exp` yang sama, sehingga penyegaran dilakukan dengan menukarkan ulang kunci tersebut. +`exp` yang sama, sehingga penyegaran berarti mempertukarkan kembali kunci tersebut. `open-sse/services/cursorApiKeyAuth.ts` melakukan pertukaran tersebut, menyimpan satu token -sesi dalam cache untuk setiap kunci, menukarkannya kembali lima menit sebelum kedaluwarsa, dan menghapus -token dalam cache ketika Cursor memberikan respons 401. `CursorExecutor` memanggilnya tepat sebelum membuka +sesi dalam cache untuk setiap kunci, melakukan pertukaran ulang lima menit sebelum kedaluwarsa, dan menghapus +token yang disimpan dalam cache ketika Cursor merespons dengan 401. `CursorExecutor` memanggilnya tepat sebelum membuka stream upstream untuk koneksi `cursor-api`. ## Penyedia `cursor-api` @@ -36,7 +37,7 @@ Registri: `open-sse/config/providers/registry/cursor/index.ts` `open-sse/executors/index.ts` (`"cursor-api"` / `cua` → `new CursorExecutor("cursor-api")`). -Dasbor: Penyedia → Cursor API → Tambahkan kunci API. +Dasbor: Providers → Cursor API → Add API key. REST: @@ -58,42 +59,55 @@ curl -sS http://localhost:20128/v1/chat/completions \ Catatan: - Daftar model untuk `cursor-api` berasal dari registri statis Cursor (daftar - yang sama dengan yang digunakan sebagai fallback oleh penyedia IDE); instalasi `cursor-agent` tidak + yang sama yang digunakan sebagai fallback oleh penyedia IDE); instalasi `cursor-agent` tidak diperlukan pada host OmniRoute. -- `POST /api/providers/{id}/refresh-cursor` hanya digunakan untuk penyedia IDE `cursor`; - koneksi `cursor-api` tidak memiliki sesi IDE untuk diperbarui. +- `POST /api/providers/{id}/refresh-cursor` hanya untuk penyedia IDE `cursor`; + koneksi `cursor-api` tidak memiliki sesi IDE yang perlu diperbarui. + +## ID model native dan effort + +Untuk `cursor` / `cu` dan `cursor-api` / `cua`, normalizer effort Claude bersama +mempertahankan ID model yang diminta tanpa perubahan. Cursor dapat mengiklankan sufiks seperti +`-low` sebagai bagian dari ID model sebenarnya, bukan sebagai alias effort OmniRoute. +Executor Cursor mempertahankan kecocokan persis dengan katalog aktif; jika tidak ada +kecocokan, resolver model yang sudah ada menangani fallback dari sufiks ke parameter. + +Hal ini tidak mengubah normalisasi effort untuk rute Claude langsung, yang kompatibel +dengan Claude, atau Vertex. Ketersediaan tetap bergantung pada katalog dan hak akses +akun Cursor yang dipilih. ## Passthrough Cursor CLI Rute: `src/app/api/cursor-cli/[...path]/route.ts` → `open-sse/handlers/cursorCliProxy.ts`. Prefiks `/api/cursor-cli/` -didaftarkan dalam `src/shared/constants/publicApiRoutes.ts` karena handler +didaftarkan di `src/shared/constants/publicApiRoutes.ts` karena handler menerapkan autentikasinya sendiri: -| Path | Autentikasi yang diharapkan dari CLI | Tindakan OmniRoute | -| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POST /auth/exchange_user_api_key` | `Bearer ` | Memvalidasi kunci, membuat JWT HS256 berdurasi 1 jam (ditandatangani dengan `JWT_SECRET`), lalu mengembalikannya | -| setiap path lainnya (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Memverifikasi penerbit/audiens/kedaluwarsa, memilih koneksi `cursor-api` yang aktif, mengganti header Authorization dengan token Cursor yang telah dipertukarkan, lalu menyalurkan kembali respons | +| Path | Autentikasi yang diharapkan dari CLI | Yang dilakukan OmniRoute | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `POST /auth/exchange_user_api_key` | `Bearer ` | Memvalidasi kunci, menerbitkan JWT HS256 berdurasi 1 jam (ditandatangani dengan `JWT_SECRET`), lalu mengembalikannya | +| setiap path lainnya (`/aiserver.v1.*`, `/agent.v1.AgentService/RunSSE`, `/aiserver.v1.BidiService/BidiAppend`, `/v1/traces`, …) | `Bearer ` | Memverifikasi penerbit/audiens/kedaluwarsa, memilih koneksi `cursor-api` yang aktif, mengganti header Authorization dengan token Cursor hasil pertukaran, lalu mengalirkan respons kembali | -CLI mendekode `exp` dari token apa pun yang diterimanya, sehingga memberikan -token opak akan membuatnya melakukan pertukaran ulang sebelum hampir setiap permintaan; JWT yang dibuat -mencegah hal tersebut. Respons 401 dari OmniRoute membuat CLI melakukan pertukaran kembali. +CLI mendekode `exp` dari token apa pun yang diterimanya, sehingga memberinya token +buram membuatnya melakukan pertukaran ulang sebelum hampir setiap permintaan; JWT +yang diterbitkan menghindari hal tersebut. Respons 401 dari OmniRoute membuat CLI +melakukan pertukaran ulang. ### Penyiapan 1. Buat kunci API OmniRoute (Dasbor → Kunci API) dan koneksi `cursor-api`. -2. Instruksikan CLI untuk menggunakan HTTP/1.1 bagi stream agen. Di +2. Atur CLI agar menggunakan HTTP/1.1 untuk stream agen. Di `~/.cursor/cli-config.json`: ```json { "network": { "useHttp1ForAgent": true } } ``` - Tanpa ini, CLI membuka giliran agen melalui HTTP/2 ke host agen yang - dikonfigurasi secara terpisah dan hanya RPC control-plane yang melewati - endpoint tersebut. + Tanpa pengaturan ini, CLI membuka giliran agen melalui HTTP/2 ke host agen + yang dikonfigurasi secara terpisah dan hanya RPC bidang kontrol yang melewati + endpoint. -3. Jalankan CLI terhadap OmniRoute: +3. Jalankan CLI menggunakan OmniRoute: ```bash export CURSOR_API_ENDPOINT=http://localhost:20128/api/cursor-cli @@ -101,19 +115,19 @@ mencegah hal tersebut. Respons 401 dari OmniRoute membuat CLI melakukan pertukar agent -p --trust "Reply with exactly OK" ``` -Setiap hop masuk ke Log sebagai penyedia `cursor-api`, dengan jenis permintaan `cursor-cli`, +Setiap hop muncul di Log dengan penyedia `cursor-api`, jenis permintaan `cursor-cli`, path `/api/cursor-cli/`, yang dikaitkan dengan kunci API OmniRoute dan koneksi yang melayaninya. ### Mode kegagalan -| Situasi | Respons terhadap CLI | +| Situasi | Respons kepada CLI | | -------------------------------------------------------- | ------------------------------------------------- | | Kunci OmniRoute tidak dikenal dan `REQUIRE_API_KEY=true` | 401 `unauthenticated` saat pertukaran | | `REQUIRE_API_KEY=false` | sesi anonim (mencerminkan perilaku `/v1/*`) | -| JWT sesi kedaluwarsa / asing / telah dimanipulasi | 401, CLI melakukan pertukaran ulang | +| JWT sesi kedaluwarsa / asing / dimanipulasi | 401, CLI melakukan pertukaran ulang | | Kunci API OmniRoute dicabut setelah pertukaran | 401 pada RPC berikutnya | | Tidak ada koneksi `cursor-api` yang aktif | 503 `unavailable` | -| Cursor menolak kunci koneksi | 401 `unauthenticated`, sesi yang di-cache dihapus | -| Upstream tidak dapat dijangkau | 502 `unavailable` (pesan disanitasi) | -| `JWT_SECRET` belum disetel | 503 saat pertukaran | +| Cursor menolak kunci milik koneksi | 401 `unauthenticated`, sesi yang di-cache dihapus | +| Upstream tidak dapat dijangkau | 502 `unavailable` (pesan yang telah disanitasi) | +| `JWT_SECRET` tidak ditetapkan | 503 saat pertukaran | diff --git a/docs/i18n/id/docs/reference/API_REFERENCE.md b/docs/i18n/id/docs/reference/API_REFERENCE.md index 53b987e775bf..f6d4d159334d 100644 --- a/docs/i18n/id/docs/reference/API_REFERENCE.md +++ b/docs/i18n/id/docs/reference/API_REFERENCE.md @@ -427,68 +427,84 @@ Gunakan endpoint ini ketika sidecar berjalan di luar proses dan tidak dapat meng --- -## Endpoint Kompatibilitas - -| Metode | Jalur | Format | -| ------ | ----------------------------------------- | ----------------------------------------- | -| POST | `/v1/chat/completions` | OpenAI | -| POST | `/v1/messages` | Anthropic | -| POST | `/v1/responses` | OpenAI Responses | -| POST | `/v1/embeddings` | OpenAI | -| POST | `/v1/images/generations` | OpenAI Images | -| POST | `/v1/images/edits` | OpenAI Images (edit/inpaint) | -| POST | `/v1/videos/generations` | Pembuatan video bergaya OpenAI | -| POST | `/v1/music/generations` | Pembuatan musik bergaya OpenAI | -| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | -| POST | `/v1/audio/speech` | OpenAI TTS (mengembalikan isi audio) | -| POST | `/v1/rerank` | Pemeringkatan ulang bergaya Cohere/Voyage | -| POST | `/v1/classify` | Klasifikasi Jina (`api.jina.ai`) | -| POST | `/v1/segment` | Segmenter Jina (`segment.jina.ai`) | -| POST | `/v1/moderations` | OpenAI Moderations | -| GET | `/v1/models` | OpenAI | -| POST | `/v1/messages/count_tokens` | Anthropic | -| GET | `/v1beta/models` | Gemini | -| POST | `/v1beta/models/{...path}` | Gemini generateContent | -| POST | `/v1/api/chat` | Ollama | -| GET | `/api/v1/vscode/{token}/` | Alias katalog OpenAI | -| GET | `/api/v1/vscode/{token}/models` | Alias model OpenAI | -| POST | `/api/v1/vscode/{token}/chat/completions` | Alias OpenAI dengan token | -| POST | `/api/v1/vscode/{token}/responses` | Alias OpenAI Responses dengan token | -| POST | `/api/v1/vscode/{token}/api/chat` | Alias Ollama dengan token | -| GET | `/api/v1/vscode/{token}/api/tags` | Alias tag Ollama dengan token | - -Semua rute POST mengikuti struktur yang sama: `Bearer your-api-key` + isi JSON yang divalidasi Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, dan sebagainya, lihat `src/shared/validation/schemas.ts`). 4xx dikembalikan ketika validasi skema gagal. - -Untuk klien yang tidak dapat menyertakan `Authorization: Bearer ...`, OmniRoute juga menerima kunci API dalam URL melalui kompatibilitas string kueri (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) atau endpoint khusus `/api/v1/vscode/{token}/...` yang didokumentasikan di bawah ini. +## Titik Akhir Kompatibilitas + +| Metode | Jalur | Format | +| ------ | ----------------------------------------- | ---------------------------------- | +| POST | `/v1/chat/completions` | OpenAI | +| POST | `/v1/messages` | Anthropic | +| POST | `/v1/responses` | OpenAI Responses | +| POST | `/v1/embeddings` | OpenAI | +| POST | `/v1/images/generations` | OpenAI Images | +| POST | `/v1/images/edits` | OpenAI Images (edit/inpaint) | +| POST | `/v1/videos/generations` | OpenAI-style video generation | +| POST | `/v1/music/generations` | OpenAI-style music generation | +| POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | +| POST | `/v1/audio/speech` | OpenAI TTS (returns audio body) | +| POST | `/v1/rerank` | Cohere/Voyage-style rerank | +| POST | `/v1/classify` | Jina classify (`api.jina.ai`) | +| POST | `/v1/segment` | Jina segmenter (`segment.jina.ai`) | +| POST | `/v1/moderations` | OpenAI Moderations | +| GET | `/v1/models` | OpenAI | +| POST | `/v1/messages/count_tokens` | Anthropic | +| GET | `/v1beta/models` | Gemini | +| POST | `/v1beta/models/{...path}` | Gemini generateContent | +| POST | `/v1/api/chat` | Ollama | +| GET | `/api/v1/vscode/{token}/` | OpenAI catalog alias | +| GET | `/api/v1/vscode/{token}/models` | OpenAI models alias | +| POST | `/api/v1/vscode/{token}/chat/completions` | OpenAI tokenized alias | +| POST | `/api/v1/vscode/{token}/responses` | OpenAI Responses tokenized alias | +| POST | `/api/v1/vscode/{token}/api/chat` | Ollama tokenized alias | +| GET | `/api/v1/vscode/{token}/api/tags` | Ollama tags tokenized alias | + +Semua rute POST mengikuti bentuk yang sama: `Bearer your-api-key` + badan JSON yang divalidasi Zod (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, dll., lihat `src/shared/validation/schemas.ts`). Kode 4xx dikembalikan jika validasi skema gagal. + +Untuk klien yang tidak dapat melampirkan `Authorization: Bearer ...`, OmniRoute juga menerima kunci API di URL melalui kompatibilitas query-string (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) atau titik akhir khusus `/api/v1/vscode/{token}/...` yang didokumentasikan di bawah ini. ```bash -# Pemeringkatan ulang +# Rerank (cloud registry provider, or an OpenAI-compatible provider node as "/") POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } -# Klasifikasi Jina (kredensial Foundation API) +# Jina classify (Foundation API credentials) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } -# Segmenter Jina +# Jina segmenter POST /v1/segment { "content": "...", "return_chunks": true } -# Pencarian Jina (s.jina.ai; alias penyedia: jina-search, jina-ai, jina) +# Jina search (s.jina.ai; provider aliases: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } -# Moderasi +# Moderations POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } -# TTS — mengembalikan isi audio/mpeg (atau format yang diminta) +# TTS — returns audio/mpeg (or requested format) body POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } -# Pengeditan gambar (multipart) +# Image edit (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png -# Pembuatan video/musik (ID model dengan prefiks penyedia) +# Video / music generation (provider-prefixed model id) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` -### Rute Khusus Penyedia +> **Node penyedia Rerank:** `POST /v1/rerank` juga merutekan ke node penyedia yang kompatibel dengan OpenAI +> (oMLX, vLLM, Infinity, TEI di balik gateway, …) yang dialamatkan sebagai `/`. Node loopback +> (`localhost`, `127.0.0.1`, `172.16.0.0/12`) selalu memenuhi syarat. Node pada host lain — kotak LAN atau peer Tailscale — memenuhi syarat hanya jika operator mengaktifkan fitur `RERANK_REMOTE_PROVIDER_NODES` **dan** URL dasar node melewati kebijakan URL keluar penyedia (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`); host metadata cloud tidak pernah dirutekan. Langkah rerank mesin memori memanggil rute ini melalui loopback, jadi aturan yang sama mengatur `rerankProviderModel` di pengaturan Memori. +> +> **Bentuk server lokal:** node dipanggil di `/v1/rerank` dan, pada 404, di `/rerank` +> (Infinity, TEI). Badan upstream membawa ejaan Cohere/OpenAI (`documents`, +> `return_documents`) dan ejaan TEI (`texts`, `return_text`), dan respons upstream +> dinormalisasi ke amplop Cohere: `[{index, score, text}]` kosong dari TEI, `{results: [{index, score}]}` +> dari gateway tipis, dan `{data: [...]}` gaya Voyage semuanya kembali ke klien sebagai +> `{results: [{index, relevance_score, document?}]}`, diurutkan berdasarkan skor dan dibatasi pada `top_n`. + +> **Penemuan node penyedia:** model pada node penyedia yang kompatibel dengan OpenAI muncul di `GET /v1/models` +> di bawah prefiks node. Baris yang tidak membawa metadata titik akhir (khas untuk daftar `/v1/models` lokal) +> mewarisi `apiType` node, sehingga model node `embeddings` adalah `type: "embedding"` dan model node +> `rerank` adalah `type: "rerank"` alih-alih default ke chat; `supportedEndpoints` eksplisit pada baris yang disinkronkan atau ditambahkan secara manual tetap diutamakan. + +### Rute Penyedia Khusus ```bash POST /v1/providers/{provider}/chat/completions @@ -496,7 +512,7 @@ POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` -Prefiks penyedia ditambahkan secara otomatis jika tidak ada. Model yang tidak cocok mengembalikan `400`. +Prefiks penyedia akan ditambahkan secara otomatis jika tidak ada. Model yang tidak cocok akan mengembalikan `400`. --- diff --git a/docs/i18n/id/docs/reference/FEATURE_FLAGS.md b/docs/i18n/id/docs/reference/FEATURE_FLAGS.md index ea419466b48a..7d517b21f302 100644 --- a/docs/i18n/id/docs/reference/FEATURE_FLAGS.md +++ b/docs/i18n/id/docs/reference/FEATURE_FLAGS.md @@ -44,124 +44,125 @@ Flag boolean dianggap **diaktifkan** ketika nilai efektifnya adalah `"true"`, ## Katalog Flag -72 flag dalam 6 kategori. **Default** adalah nilai default definisi — nilai yang -digunakan ketika override DB maupun variabel lingkungan tidak tersedia. +74 flag di 6 kategori. **Default** adalah definisi default — nilai yang digunakan ketika tidak ada penggantian DB maupun variabel lingkungan. ### Keamanan (10) -| Kunci | Tipe | Default | Deskripsi | -| --------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `REQUIRE_API_KEY` | boolean | `false` | Wajibkan API key untuk semua permintaan masuk. | -| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Aktifkan sanitasi input untuk semua permintaan. | -| `INJECTION_GUARD_MODE` | enum | `off` | Mode perlindungan terhadap prompt injection. Nilai: `off`, `warn`, `block`, `redact`. | -| `PII_REDACTION_ENABLED` | boolean | `false` | Redaksi PII dari permintaan (tidak bergantung pada `INPUT_SANITIZER_MODE`). | -| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Sanitasi PII dari respons penyedia. | -| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Mode untuk sanitasi PII pada respons. Nilai: `redact`, `warn`, `block`, `off`. | -| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Blokir permintaan keluar ke rentang IP privat/internal. | -| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Izinkan pengguna dasbor yang terautentikasi untuk menampilkan API key yang tersimpan, bukan hanya melihat nilai yang disamarkan. | -| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Sertakan prefiks akun dalam baris log AUTH (misalnya, "Menggunakan akun : abc12345..."). Dinonaktifkan secara default agar pengenal akun disamarkan dari log proses bersama/multi-tenant. Tidak bergantung pada Mode Debug; mengubah Mode Debug tidak akan menampilkannya. | -| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Saat OIDC diaktifkan, nonaktifkan login dengan kata sandi sehingga pengguna hanya dapat melakukan autentikasi melalui Single Sign-On OIDC. Saat dinonaktifkan (default), login dengan kata sandi dan OIDC sama-sama tersedia. | - -### Jaringan (15) - -| Kunci | Tipe | Bawaan | Mulai Ulang | Deskripsi | -| ----------------------------------------------- | ------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Aktifkan mode penyamaran sidik jari TLS. | -| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Izinkan rute /v1/audio/* menggunakan node penyedia yang kompatibel dengan OpenAI dan dihosting di luar localhost. Nonaktif secara bawaan — merutekan audio ke host jarak jauh mengubah identitas egress dan harus menjadi keputusan operator yang eksplisit. Node loopback selalu diizinkan dan tidak terpengaruh. | -| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Jika tidak ada proxy yang ditetapkan ke suatu koneksi, pilih otomatis proxy pertama yang berfungsi dari registri. Nonaktif secara bawaan (jika tidak, proxy apa pun dalam registri akan menjadi fallback global — #3332). | -| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Izinkan alur validasi OAuth dan penyedia melewati proxy yang disematkan dan terhubung secara langsung ketika pemeriksaan awal keterjangkauan proxy gagal. Nonaktif secara bawaan karena tindakan ini dapat mengubah IP egress. | -| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Saat terjadi pengecualian jaringan (waktu habis, koneksi ditolak/direset) pada eksekutor rotasi multiakun, jika akun yang gagal tidak memiliki proxy khusus, terapkan cooldown singkat dan lewati akun lain yang tidak memiliki proxy selama sisa permintaan, alih-alih mencoba ulang setiap akun. Aktif secara bawaan (aman: tidak ada perubahan IP egress, hanya mengurangi risiko latensi/cooldown pada akun dengan egress bersama). Nonaktifkan untuk memulihkan propagasi langsung pada kegagalan pertama akun tanpa proxy. | -| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Pool proxy dan rotasi per akun opencode berhenti menyediakan kembali proxy yang baru saja gagal (probe TCP ditolak, atau respons 429 diterima melaluinya) selama periode per proses yang berlipat ganda pada setiap kegagalan berulang, hingga batas maksimum. Tidak ada status proxy yang ditulis; ketika setiap kandidat disisihkan, pilihannya tidak berubah. Nonaktif secara bawaan. | -| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Tampilkan, di bawah pool proxy pada dasbor, jumlah IP egress yang teramati melayani anggotanya selama 24 jam terakhir dan jumlah koneksi yang menggunakannya. Hanya-baca, dihitung dari log proxy, dan tidak pernah digunakan untuk perutean. Nonaktif secara bawaan. | -| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Untuk eksekutor OpenCode, pantau byte body pertama dari balasan Responses yang dialirkan (jendela: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, bawaan `15000`). Aliran Responses 2xx yang tetap tidak mengirim data setelah melewati jendela dianggap macet: akun diberi cooldown dan permintaan dirotasikan satu kali ke akun berikutnya; kemacetan kedua langsung menghasilkan kegagalan. Nonaktif secara bawaan: aliran yang macet tetap menggunakan waktu tunggu saat ini hingga batas waktu kesiapan aliran. | -| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Eksekutor OpenCode: saat menerima 403/451 yang membawa penolakan `user_blocked` (bukan karena lokasi geografis dan bukan penolakan sidik jari Cloudflare), beri cooldown pada akun yang ditolak dan rotasikan ke akun berikutnya paling banyak satu kali per permintaan; penolakan kedua dikembalikan apa adanya, tanpa tanda berhasil. Nonaktif secara bawaan: merutekan permintaan untuk menghindari pemblokiran pengguna oleh upstream dapat terlihat seperti pengelakan dan menyebarkan penandaan ke seluruh armada. | -| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotasi OpenCode: setelah dua kegagalan upstream sementara berturut-turut (5xx atau respons 400 kosong), jeda sebelum akun berikutnya — mulai dari 1,5 detik dan berlipat ganda pada setiap kegagalan berikutnya, dengan batas 6 detik per jeda dan 10 detik per permintaan, dilewati jika klien terputus; isi respons yang gagal dibebaskan sebelum menunggu. Nonaktif secara default: failover tetap berlangsung seketika. | -| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotasi OpenCode: hentikan gelombang akun pada respons 429 pertama yang diklasifikasikan sebagai batas laju sebenarnya (`Retry-After` yang dapat diurai, atau isi respons yang menyebutkan batas laju/penggunaan), lalu kembalikan respons 429 upstream tersebut tanpa perubahan. Respons 429 yang tidak terklasifikasi tetap memicu rotasi. Nonaktif secara default: tingkat gratis dibatasi per IP keluar (#9611), sehingga setiap respons 429 memicu rotasi dan gelombang yang kehabisan akun akan mengembalikan respons 429 upstream terakhir. | -| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Nonaktifkan verifikasi sertifikat TLS untuk proksi MITM. **Berbahaya.** | -| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Izinkan URL penyedia yang mengarah ke jaringan privat/internal. | -| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Izinkan penambahan/validasi penyedia pada alamat lokal/privat (127.0.0.1, localhost, LAN). Aktif secara default (mengutamakan lokal); nonaktifkan untuk pemblokiran ketat khusus publik. Metadata cloud tetap diblokir. | -| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Aktifkan mode penyedia yang kompatibel dengan Claude Code. | +| Kunci | Tipe | Default | Deskripsi | +| :-------------------------------------- | :------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `REQUIRE_API_KEY` | boolean | `false` | Membutuhkan kunci API untuk semua permintaan masuk. | +| `INPUT_SANITIZER_ENABLED` | boolean | `true` | Mengaktifkan sanitasi input untuk semua permintaan. | +| `INJECTION_GUARD_MODE` | enum | `off` | Mode penjaga injeksi prompt. Nilai: `off`, `warn`, `block`, `redact`. | +| `PII_REDACTION_ENABLED` | boolean | `false` | Meredaksi PII dari permintaan (independen dari `INPUT_SANITIZER_MODE`). | +| `PII_RESPONSE_SANITIZATION` | boolean | `false` | Melakukan sanitasi PII dari respons penyedia. | +| `PII_RESPONSE_SANITIZATION_MODE` | enum | `redact` | Mode untuk sanitasi respons PII. Nilai: `redact`, `warn`, `block`, `off`. | +| `OUTBOUND_SSRF_GUARD_ENABLED` | boolean | `true` | Memblokir permintaan keluar ke rentang IP pribadi/internal. | +| `ALLOW_API_KEY_REVEAL` | boolean | `false` | Mengizinkan pengguna dasbor yang terautentikasi untuk mengungkapkan kunci API yang tersimpan alih-alih hanya melihat nilai yang disamarkan. | +| `AUTH_LOG_INCLUDE_ACCOUNT_ID` | boolean | `false` | Menyertakan prefiks akun dalam baris log AUTH (misalnya "Menggunakan akun : abc12345..."). Dinonaktifkan secara default agar pengidentifikasi akun direduksi dari log proses bersama/multi-penyewa. Independen dari Mode Debug; mengaktifkan Mode Debug tidak akan mengungkap ini. | +| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | boolean | `false` | Ketika OIDC diaktifkan, menonaktifkan login kata sandi sehingga pengguna hanya dapat mengautentikasi melalui OIDC Single Sign-On. Ketika dinonaktifkan (default), login kata sandi dan OIDC keduanya tersedia. | + +### Jaringan (16) + +| Key | Type | Default | Restart | Description | +| :---------------------------------------------- | :------ | :------ | :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENABLE_TLS_FINGERPRINT` | boolean | `false` | ✓ | Aktifkan mode siluman sidik jari TLS. | +| `AUDIO_REMOTE_PROVIDER_NODES` | boolean | `false` | | Izinkan rute /v1/audio/* untuk menggunakan node penyedia yang kompatibel dengan OpenAI yang di-host di luar localhost. Nonaktif secara default — merutekan audio ke host jarak jauh mengubah identitas keluar dan harus menjadi keputusan operator yang eksplisit. Node loopback selalu diizinkan dan tidak terpengaruh. | +| `RERANK_REMOTE_PROVIDER_NODES` | boolean | `false` | | Izinkan POST /v1/rerank (dan langkah rerank loopback mesin memori) untuk menggunakan node penyedia yang kompatibel dengan OpenAI yang di-host di luar localhost. Nonaktif secara default — perutean ke host jarak jauh mengubah identitas keluar dan harus menjadi keputusan operator yang eksplisit. Node loopback selalu diizinkan; node jarak jauh juga harus melewati kebijakan URL keluar penyedia. | +| `PROXY_AUTO_SELECT_ENABLED` | boolean | `false` | | Ketika tidak ada proxy yang ditetapkan ke koneksi, pilih otomatis proxy pertama yang berfungsi dari registri. Nonaktif secara default (jika tidak, proxy registri apa pun menjadi fallback global — #3332). | +| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | boolean | `false` | | Izinkan alur validasi OAuth dan penyedia untuk melewati proxy yang disematkan dan terhubung langsung ketika pemeriksaan awal jangkauan proxy gagal. Nonaktif secara default karena ini dapat mengubah IP keluar. | +| `NETWORK_ROTATION_SHARED_EGRESS_GUARD` | boolean | `true` | | Pada pengecualian jaringan (timeout, koneksi ditolak/diatur ulang) untuk eksekutor rotasi multi-akun, ketika akun yang gagal tidak memiliki proxy khusus, terapkan jeda singkat dan lewati akun tanpa proxy lainnya untuk sisa permintaan alih-alih mencoba ulang setiap akun. Aktif secara default (aman: tidak ada perubahan IP keluar, hanya mengurangi risiko latensi/jeda pada akun dengan egress bersama). Nonaktifkan untuk mengembalikan propagasi segera pada kegagalan tanpa proxy pertama. | +| `PROXY_SKIP_RECENTLY_FAILED` | boolean | `false` | | Kumpulan proxy dan rotasi opencode per akun berhenti melayani kembali proxy yang baru saja gagal (probe TCP ditolak, atau 429 diterima melaluinya) untuk periode per proses yang berlipat ganda pada setiap pengulangan, hingga batas tertentu. Tidak ada status proxy yang ditulis; dengan setiap kandidat yang disisihkan, pilihan tidak berubah. Nonaktif secara default. | +| `PROXY_POOL_EGRESS_OBSERVATION` | boolean | `false` | | Tampilkan, di bawah kumpulan proxy di dasbor, berapa banyak IP keluar yang diamati melayani anggotanya selama 24 jam terakhir dan berapa banyak koneksi yang menggunakannya. Hanya-baca, dihitung dari log proxy, tidak pernah digunakan untuk perutean. Nonaktif secara default. | +| `OPENCODE_RESPONSES_STALL_ROTATION` | boolean | `false` | | Untuk eksekutor OpenCode, pantau byte tubuh pertama dari balasan Responses yang di-stream (jendela: `RESPONSES_FIRST_BYTE_TIMEOUT_MS`, default `15000`). Aliran Responses 2xx yang tetap diam melewati jendela dianggap macet: akun didinginkan dan permintaan berputar ke akun berikutnya sekali; kemacetan kedua gagal dengan cepat. Nonaktif secara default: aliran yang macet tetap menunggu hingga batas waktu kesiapan aliran. | +| `OPENCODE_USER_BLOCKED_ROTATION` | boolean | `false` | | Eksekutor OpenCode: pada 403/451 yang membawa penolakan `user_blocked` (bukan geo, bukan penolakan sidik jari Cloudflare), dinginkan akun yang ditolak dan rotasi ke akun berikutnya paling banyak sekali per permintaan; penolakan kedua dikembalikan apa adanya, tanpa tanda keberhasilan. Mati secara default: merutekan di sekitar blokir pengguna upstream dapat terlihat seperti penghindaran dan menyebarkan tanda tersebut ke seluruh armada. | +| `OPENCODE_TRANSIENT_FAILOVER_BACKOFF` | boolean | `false` | | Rotasi OpenCode: setelah dua kegagalan upstream sementara berturut-turut (5xx atau 400 kosong), jeda sebelum akun berikutnya — 1,5 detik berlipat ganda untuk setiap kegagalan lebih lanjut, dibatasi pada 6 detik per jeda dan 10 detik per permintaan, dilewati saat klien terputus; badan yang gagal dilepaskan sebelum menunggu. Mati secara default: failover tetap instan. | +| `OPENCODE_RATE_LIMITED_429_EARLY_STOP` | boolean | `false` | | Rotasi OpenCode: hentikan gelombang akun pada 429 pertama yang diklasifikasikan sebagai batas laju nyata (`Retry-After` yang dapat diurai, atau badan yang menyebutkan batas laju/penggunaan) dan kembalikan 429 upstream tersebut tanpa perubahan. 429 yang tidak terklasifikasi terus berputar. Mati secara default: tingkat gratis dibatasi per IP keluar (#9611), jadi setiap 429 berputar dan gelombang yang habis mengembalikan 429 upstream terakhir. | +| `MITM_DISABLE_TLS_VERIFY` | boolean | `false` | ✓ | Nonaktifkan verifikasi sertifikat TLS untuk proxy MITM. **Bahaya.** | +| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | boolean | `false` | | Izinkan URL penyedia yang mengarah ke jaringan pribadi/internal. | +| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | boolean | `true` | | Izinkan penambahan/validasi penyedia pada alamat lokal/pribadi (127.0.0.1, localhost, LAN). Aktif secara default (prioritas lokal); nonaktifkan untuk pemblokiran ketat hanya publik. Metadata cloud tetap diblokir. | +| `ENABLE_CC_COMPATIBLE_PROVIDER` | boolean | `false` | ✓ | Aktifkan mode penyedia yang kompatibel dengan Claude Code. | ### Kebijakan (5) -| Kunci | Tipe | Default | Deskripsi | -| ------------------------------- | ------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `TOOL_POLICY_MODE` | enum | `disabled` | Mode penegakan kebijakan penggunaan alat. Nilai: `disabled`, `warn`, `block`. | -| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Aktifkan pembatasan laju secara otomatis berdasarkan pola penggunaan. | -| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Lewati pemeriksaan lokal OmniRoute atas jendela konteks/token masukan maksimum untuk permintaan langsung model tunggal. Batas upstream tetap berlaku. | -| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Tolak permintaan sebelum diteruskan ketika model target tidak memiliki kemampuan yang diperlukan (visi, alat, keluaran terstruktur, jendela konteks). Melindungi permintaan langsung ke satu penyedia yang melewati filter kompatibilitas lapisan kombo. | -| `RADAR_ENABLED` | boolean | `false` | Aktifkan modul OmniRoute Radar (layar umpan katalog dan sinkronisasi). Nonaktif secara default; pengaktifan hanya membuka akses ke UI — sinkronisasi data tetap memerlukan persetujuan terpisah. | - -### Runtime (32) - -| Kunci | Tipe | Bawaan | Mulai Ulang | Deskripsi | -| ------------------------------------------- | ------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Buat dan sisipkan ringkasan percakapan saat perutean combo beralih model. Nonaktifkan untuk menangani peralihan model secara terpisah dan mencegah permintaan serah terima latar belakang untuk semua combo yang ada dan yang akan datang. | -| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Hapus item output fase komentar internal dari aliran passthrough Responses API sebelum meneruskannya ke klien. Nonaktifkan untuk menerima komentar upstream mentah. | -| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Terapkan pembatasan cakupan pada akses alat MCP. | -| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Kompres deskripsi alat MCP untuk mengurangi penggunaan token. | -| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Aktifkan pemrosesan tugas latar belakang saat runtime. | -| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Nonaktifkan semua layanan latar belakang (penyegaran kuota, sinkronisasi, dll.). | -| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Percayai filter RTK tingkat proyek tanpa validasi. | -| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Mulai server WebSocket dasbor real-time saat impor (port 20132 secara bawaan). | -| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Izinkan Codex menggunakan transport Responses-over-WebSocket. Jika dinonaktifkan, Codex akan beralih ke HTTP Responses. | -| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Izinkan Codex menggunakan transport JSON-RPC WebSocket app-server lokal (codexTransport=app-server). Jika dinonaktifkan, koneksi yang memilih app-server akan beralih ke transport Codex lainnya. | -| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Alihkan permintaan yang kehabisan anggaran ke penyedia/model cadangan gratis darurat. (Lihat [Cadangan Anggaran Darurat](#emergency-budget-fallback) di bawah.) | -| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Aktifkan percobaan ulang awal secara transparan untuk stream SSE upstream yang terpotong sebelum byte respons apa pun mencapai klien. | -| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Izinkan pemulihan stream untuk meminta ulang dan menyambung respons setelah byte telah mencapai klien. | -| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Jadikan kelanjutan di tengah stream aman untuk pemanggilan alat: jangan pernah melanjutkan stream yang terputus setelah pemanggilan alat dikeluarkan (sedang berlangsung atau telah selesai dengan finish_reason tool_calls), dan tutup setelah satu kelanjutan kosong alih-alih menghabiskan seluruh anggaran. Dinonaktifkan: perilaku rilis. | -| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Lakukan failover satu kali ke koneksi saudara ketika stream SSE ditutup sebelum menghasilkan frame yang berguna dan percobaan ulang terbatas pada koneksi yang sama telah habis; jika tidak ada koneksi saudara yang dapat digunakan, respons 502 `STREAM_EARLY_EOF` asli akan dikembalikan. Dinonaktifkan secara default: EOF awal tetap bersifat terminal setelah percobaan ulang pada koneksi yang sama. | -| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Sertakan bidang nama yang ramah tampilan dalam respons `/v1/models`. Nonaktifkan untuk klien yang hanya mengharapkan ID model. | -| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Mengontrol cara ID model diberi prefiks dalam /v1/models. 'dual' (default) menghasilkan prefiks alias dan ID penyedia kanonis untuk kompatibilitas mundur. 'alias' hanya menghasilkan prefiks alias pendek (misalnya ds-web/model, bukan deepseek-web/model). 'canonical' hanya menghasilkan prefiks ID penyedia lengkap. Nilai: `dual`, `alias`, `canonical`. | -| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Aktifkan sinkronisasi ELO papan peringkat Arena AI secara berkala untuk pemeringkatan kecerdasan model. | -| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Iklankan id cermin `claude//` di `/v1/models` agar penemuan model gateway Claude Code mencantumkan model non-Claude. Tingkat global dari gerbang tiga tingkat (env mengesampingkan pengaturan dashboard). Lihat [konfigurasi Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | -| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Sakelar utama untuk alias gateway no-think//. Aktif (bawaan): /v1/models mengiklankan varian tanpa penalaran untuk setiap model Claude berkemampuan penalaran yang memenuhi syarat, dan id no-think/ yang dikirim dalam permintaan dipetakan kembali ke model sebenarnya dengan penalaran dinonaktifkan. Nonaktif: tidak ada varian yang diiklankan dan id no-think/ diperlakukan seperti id model tak dikenal lainnya. Pilihan ikut serta/tidak ikut serta per model melalui ModelSpec.noThinkingAlias tetap berlaku saat fitur ini aktif. | -| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Nonaktifkan pembuatan varian tingkat penalaran (misalnya -low, -medium, -high) dalam katalog /v1/models. | -| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Aktifkan jalur penerimaan virtual adaptif per penyewa untuk pengiriman ke penyedia (#9654): lonjakan satu penyewa tidak lagi menyebabkan 503 bagi penyewa lain. Variabel env OMNIROUTE_CHAT_VIRTUAL_LANES mengesampingkan pengaturan dashboard ini; perubahan berlaku setelah server dimulai ulang. | -| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Iklankan id cermin / di /v1/models untuk model yang pemilik kanonisnya tidak memiliki kredensial aktif, tetapi dirutekan oleh gateway passthrough dengan kredensial aktif. Peringatan: menambahkan entri katalog untuk semua klien jika diaktifkan secara global. | -| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Aktifkan deteksi saldo untuk node yang kompatibel dengan agregator New-API / One-API / Sub2API. Jika diaktifkan, node kompatibel dengan penanda agregator yang ditetapkan akan melaporkan saldonya di dashboard dan dalam perutean pemeriksaan awal kuota. | -| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Lanjutkan pemanggilan alat milik server non-streaming hingga model mengembalikan respons yang dapat digunakan klien. | -| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Statistik pencarian dan pencarian terbaru hanya menghitung penyedia yang masih memiliki koneksi aktif (penyedia tanpa kunci seperti duckduckgo-free selalu dihitung). Jika nonaktif, setiap baris pencarian yang dipertahankan dan memiliki id penyedia tetap disertakan. | -| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Halaman penyedia di dashboard: tampilkan lencana Gratis hanya berdasarkan sinyal yang didukung oleh penyedia — mengabaikan heuristik nama tampilan, kolom gratis non-boolean, dan sufiks :free pada penyedia terdaftar yang tidak memiliki tingkat gratis terdokumentasi. Jika nonaktif, aturan historis lencana tetap digunakan. | -| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Pada respons tidak tersedia 429/503 yang diagregasi, hilangkan `Retry-After` jika waktu percobaan ulang konkret di masa mendatang tidak diketahui (alih-alih nilai sintetis 1 dtk), tambahkan `error.retry_after_provenance` (`signal` \| `none`), dan izinkan jalur pengurasan kombo membaca petunjuk percobaan ulang dalam prosa dari isi upstream JSON dan teks biasa. Kolom ini hanya muncul pada respons yang dibuat oleh `unavailableResponse()`; isi 429/503 lainnya tidak berubah. | -| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Ketika target kombo `priority` yang ditandai hanya-fallback-saat-kuota-habis menghentikan kombo karena penyebab yang terbukti bukan kuota (pemutus sirkuit penyedia terbuka, pelompatan latensi prediktif), berikan respons 502 alih-alih 503 yang tampak seperti masalah kuota. Penghentian akibat penguncian, periode pendinginan, ketidaktersediaan, kehabisan, dan batas konkurensi tetap memberikan respons 503. | -| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Respons Mistral 401 tanpa keterangan tambahan (`{"detail":"Unauthorized"}`, tanpa sinyal autentikasi eksplisit) identik untuk kunci yang dicabut dan kuota yang habis. Jika diaktifkan, koneksi akan memasuki periode pendinginan alih-alih ditandai sebagai `expired`, maksimal 3 kali per jam per koneksi; kejadian berikutnya akan menandainya demikian, sehingga kunci yang dicabut pada akhirnya tetap teridentifikasi. Dinonaktifkan secara default: setiap respons Mistral 401 tanpa keterangan tambahan akan menandai koneksi seperti sebelumnya. | -| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Ambil katalog model xAI langsung untuk koneksi `xai-oauth` dari `https://api.x.ai/v1/models` menggunakan token bearer OAuth, alih-alih seed statis yang dibekukan. Dinonaktifkan secara default: `xai-oauth` tetap menyajikan seed statis tanpa perubahan. Jika terjadi kesalahan resolusi apa pun, penemuan akan kembali menggunakan seed (belum diverifikasi apakah x.ai menerima bearer OAuth pada endpoint ini). | -| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Izinkan pembersihan otomatis menghapus pekerjaan Batch API berstatus terminal (selesai/gagal/dibatalkan/kedaluwarsa) yang lebih lama dari `OMNIROUTE_BATCH_RETENTION_DAYS`, beserta checkpoint per barisnya, dan menghapus konten BLOB dari file unggahan yang telah melewati `expires_at` masing-masing. Dinonaktifkan secara default: setiap instalasi yang ada tetap menyimpan data ini persis seperti sebelumnya hingga operator mengaktifkannya. Rute `DELETE /api/v1/batches/delete-completed` yang dipicu operator tidak terpengaruh dalam kondisi apa pun — rute tersebut merupakan kontrak API publik terpisah tanpa syarat. | +| Key | Type | Default | Description | +| ------------------------------- | ------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `TOOL_POLICY_MODE` | enum | `disabled` | Mode penegakan kebijakan penggunaan alat. Nilai: `disabled`, `warn`, `block`. | +| `RATE_LIMIT_AUTO_ENABLE` | boolean | `false` | Secara otomatis mengaktifkan pembatasan laju berdasarkan pola penggunaan. | +| `DISABLE_CONTEXT_WINDOW_CHECKS` | boolean | `false` | Lewati pemeriksaan jendela konteks lokal / token input maksimum OmniRoute untuk permintaan model tunggal langsung. Batas upstream masih berlaku. | +| `CAPABILITY_FILTER_ENABLED` | boolean | `false` | Tolak permintaan sebelum pengiriman jika model target tidak memiliki kapabilitas yang diperlukan (visi, alat, output terstruktur, jendela konteks). Melindungi permintaan penyedia tunggal langsung yang melewati filter kompatibilitas lapisan kombo. | +| `RADAR_ENABLED` | boolean | `false` | Aktifkan modul OmniRoute Radar (layar umpan katalog dan sinkronisasi). Mati secara default; mengaktifkan hanya membuka kunci UI — sinkronisasi data tetap merupakan opt-in terpisah. | + +### Runtime (33) + +| Key | Type | Default | Restart | Description | +| :------------------------------------------ | :------ | :------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `UNIVERSAL_CONTEXT_HANDOFF_ENABLED` | boolean | `true` | | Hasilkan dan suntikkan ringkasan percakapan saat perutean kombo beralih model. Nonaktifkan untuk memperlakukan peralihan model secara independen dan mencegah permintaan serah terima latar belakang untuk semua kombo yang ada dan yang akan datang. | +| `RESPONSES_PASSTHROUGH_DROP_COMMENTARY` | boolean | `true` | | Jatuhkan item keluaran fase komentar internal dari aliran passthrough Responses API sebelum meneruskan ke klien. Nonaktifkan untuk menerima komentar hulu mentah. | +| `OMNIROUTE_MCP_ENFORCE_SCOPES` | boolean | `true` | | Terapkan pembatasan cakupan pada akses alat MCP. | +| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | boolean | `false` | | Kompres deskripsi alat MCP untuk mengurangi penggunaan token. | +| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | boolean | `false` | | Aktifkan pemrosesan tugas latar belakang saat runtime. | +| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | boolean | `false` | ✓ | Nonaktifkan semua layanan latar belakang (pembaruan kuota, sinkronisasi, dll). | +| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | boolean | `false` | | Percayai filter RTK tingkat proyek tanpa validasi. | +| `OMNIROUTE_ENABLE_LIVE_WS` | boolean | `true` | ✓ | Mulai server WebSocket dasbor real-time saat impor (port 20132 secara default). | +| `OMNIROUTE_CODEX_WS_ENABLED` | boolean | `true` | | Izinkan Codex menggunakan transportasi Respons-melalui-WebSocket. Jika dinonaktifkan, Codex akan kembali ke Respons HTTP. | +| `OMNIROUTE_CODEX_APP_SERVER_ENABLED` | boolean | `true` | | Izinkan Codex menggunakan transportasi JSON-RPC WebSocket server aplikasi lokal (codexTransport=app-server). Jika dinonaktifkan, koneksi yang memilih app-server akan kembali ke transportasi Codex lainnya. | +| `OMNIROUTE_EMERGENCY_FALLBACK` | boolean | `true` | | Arahkan permintaan yang kehabisan anggaran ke penyedia/model cadangan gratis darurat. (Lihat [Emergency Budget Fallback](#emergency-budget-fallback) di bawah.) | +| `STREAM_RECOVERY_ENABLED` | boolean | `false` | | Aktifkan percobaan ulang awal transparan untuk aliran SSE upstream yang terpotong sebelum byte respons mencapai klien. | +| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | boolean | `false` | | Izinkan pemulihan aliran untuk meminta ulang dan menyatukan respons setelah byte mencapai klien. | +| `STREAM_RECOVERY_TOOLCALL_ORDER_FIX` | boolean | `false` | | Buat kelanjutan di tengah aliran aman untuk panggilan alat: jangan pernah melanjutkan aliran yang terputus setelah panggilan alat dikeluarkan (sedang dalam proses atau sudah selesai dengan finish_reason tool_calls), dan tutup setelah satu kelanjutan kosong alih-alih menghabiskan seluruh anggaran. Mati: perilaku rilis. | +| `STREAM_EARLY_EOF_SIBLING_FAILOVER_ENABLED` | boolean | `false` | | Terjadi failover sekali ke koneksi saudara ketika aliran SSE tertutup sebelum memancarkan frame yang berguna dan percobaan ulang koneksi yang sama telah habis; jika tidak ada koneksi saudara yang dapat digunakan, `STREAM_EARLY_EOF` 502 asli akan dikembalikan. Mati secara default: early-EOF tetap terminal setelah percobaan ulang koneksi yang sama. | +| `MODEL_CATALOG_INCLUDE_NAMES` | boolean | `true` | | Sertakan bidang nama yang mudah dibaca dalam respons `/v1/models`. Nonaktifkan untuk klien yang hanya mengharapkan ID model. | +| `MODELS_CATALOG_PREFIX_MODE` | enum | `dual` | | Mengontrol bagaimana ID model diberi awalan di /v1/models. 'dual' (default) memancarkan awalan alias dan awalan ID penyedia kanonis untuk kompatibilitas mundur. 'alias' hanya memancarkan awalan alias pendek (misalnya ds-web/model, bukan deepseek-web/model). 'canonical' hanya memancarkan awalan ID penyedia lengkap. Nilai: `dual`, `alias`, `canonical`. | +| `ARENA_ELO_SYNC_ENABLED` | boolean | `true` | | Mengaktifkan sinkronisasi ELO papan peringkat Arena AI secara berkala untuk peringkat kecerdasan model. | +| `EXPOSE_CC_DISCOVERY_ALIASES` | boolean | `false` | | Mengiklankan ID cermin `claude//` di `/v1/models` sehingga penemuan model gateway Claude Code mencantumkan model non-Claude. Tingkat global dari gerbang tiga tingkat (variabel lingkungan mengalahkan penggantian dasbor). Lihat [konfigurasi Claude Code](../guides/CLAUDE-CODE-CONFIGURATION.md#discovery-aliases--surface-non-claude-models-in-the-model-picker). | +| `NO_THINKING_ALIAS_ENABLED` | boolean | `true` | | Sakelar utama untuk alias gateway no-think//. Aktif (default): /v1/models mengiklankan varian tanpa berpikir untuk setiap model Claude yang mampu berpikir dan memenuhi syarat, dan ID no-think/ yang dikirim pada permintaan akan kembali ke model sebenarnya dengan penalaran yang ditekan. Mati: tidak ada varian yang diiklankan dan ID no-think/ diperlakukan seperti ID model tidak dikenal lainnya. Opt-in/opt-out ModelSpec.noThinkingAlias per model masih berlaku saat ini aktif. | +| `OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS` | boolean | `false` | | Menonaktifkan pembuatan varian tingkat berpikir (misalnya -low, -medium, -high) dalam katalog /v1/models. | +| `OMNIROUTE_CHAT_VIRTUAL_LANES` | boolean | `false` | ✓ | Mengaktifkan jalur penerimaan virtual adaptif per penyewa untuk pengiriman penyedia (#9654): lonjakan satu penyewa tidak lagi menyebabkan 503 pada penyewa lain. Variabel lingkungan OMNIROUTE_CHAT_VIRTUAL_LANES mengalahkan penggantian dasbor ini; perubahan akan berlaku setelah server dimulai ulang. | +| `EXPOSE_FUNCTIONAL_GATEWAY_MIRRORS` | boolean | `false` | | Iklankan ID cermin / di /v1/models untuk model yang pemilik kanonisnya tidak memiliki kredensial aktif tetapi gateway passthrough dengan kredensial aktif merutekannya. Peringatan: menambahkan entri katalog untuk semua klien saat diaktifkan secara global. | +| `NEWAPI_AGGREGATOR_BALANCE` | boolean | `false` | | Aktifkan deteksi saldo untuk node yang kompatibel dengan agregator New-API / One-API / Sub2API. Saat diaktifkan, node yang kompatibel dengan flag agregator yang disetel akan melaporkan saldo mereka di dasbor dan perutean pra-penerbangan kuota. | +| `SERVER_OWNED_TOOL_LOOP_ENABLED` | boolean | `false` | | Lanjutkan panggilan alat milik server non-streaming hingga model mengembalikan respons yang dapat digunakan klien. | +| `SEARCH_STATS_HIDE_DELETED_CONNECTIONS` | boolean | `false` | | Statistik pencarian dan pencarian terbaru hanya menghitung penyedia yang masih memiliki koneksi aktif (penyedia tanpa kunci seperti duckduckgo-free selalu dihitung). Nonaktif mempertahankan setiap baris pencarian yang disimpan dengan ID penyedia. | +| `FREE_BADGE_REQUIRES_PROVIDER_FREE_TIER` | boolean | `false` | | Halaman penyedia dasbor: tampilkan lencana Gratis hanya pada sinyal yang dihormati penyedia — menghilangkan heuristik nama tampilan, bidang gratis non-boolean, dan sufiks :free pada penyedia terdaftar tanpa tingkat gratis yang didokumentasikan. Nonaktif mempertahankan aturan lencana historis. | +| `RETRY_AFTER_PROVENANCE_ENABLED` | boolean | `false` | | Pada respons 429/503 yang tidak tersedia yang diagregasi, hilangkan `Retry-After` ketika tidak ada waktu coba lagi di masa mendatang yang konkret diketahui (alih-alih 1 detik sintetis), tambahkan `error.retry_after_provenance` (`signal` \| `none`), dan biarkan jalur pengurasan kombo membaca petunjuk coba lagi prosa dari badan hulu JSON dan teks biasa. Bidang ini hanya muncul pada respons yang dibuat oleh `unavailableResponse()`; badan 429/503 lainnya tidak berubah. | +| `PROTECTED_PRIORITY_INFRA_502_ENABLED` | boolean | `false` | | Ketika target kombo `priority` yang ditandai hanya-fallback-saat-kuota-habis menghentikan kombo karena penyebab yang terbukti bukan kuota (pemutus sirkuit penyedia terbuka, lewati latensi prediktif), jawab 502 alih-alih 503 yang terlihat seperti kuota. Penguncian, pendinginan, tidak tersedia, kelelahan, dan penghentian batas konkurensi tetap 503. | +| `MISTRAL_AMBIGUOUS_401_SOFT_LOCKOUT` | boolean | `false` | | Mistral 401 kosong (`{"detail":"Unauthorized"}`, tanpa sinyal otentikasi eksplisit) identik untuk kunci yang dicabut dan untuk kuota yang habis. Saat aktif, ini mendinginkan koneksi alih-alih memarkirnya sebagai `expired`, paling banyak 3 kali per jam per koneksi; yang berikutnya memarkirnya, sehingga kunci yang dicabut masih konvergen. Nonaktif secara default: setiap Mistral 401 kosong memarkir koneksi seperti sebelumnya. | +| `XAI_OAUTH_LIVE_MODEL_DISCOVERY` | boolean | `false` | | Mengambil katalog model xAI langsung untuk koneksi `xai-oauth` dari `https://api.x.ai/v1/models` menggunakan token bearer OAuth, alih-alih seed statis yang beku. Nonaktif secara default: `xai-oauth` terus menyajikan seed statis tanpa perubahan. Pada setiap kesalahan resolusi, penemuan kembali ke seed (tidak diverifikasi apakah x.ai menerima bearer OAuth di endpoint ini). | +| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | boolean | `false` | | Biarkan pembersihan otomatis menghapus pekerjaan Batch API yang sudah selesai (completed/failed/cancelled/expired) yang lebih lama dari `OMNIROUTE_BATCH_RETENTION_DAYS`, beserta checkpoint per barisnya, dan menghapus konten BLOB dari file yang diunggah setelah `expires_at` mereka sendiri. Nonaktif secara default: setiap instalasi yang ada menyimpan data ini persis seperti sebelumnya sampai operator memilih untuk mengaktifkannya. Rute `DELETE /api/v1/batches/delete-completed` yang dipicu operator tidak terpengaruh — ini adalah kontrak API publik yang terpisah dan tanpa syarat. | +| `ANTIGRAVITY_ACCOUNT_LEASE_ENABLED` | boolean | `false` | | Mencadangkan akun Antigravity yang dipilih untuk siklus hidup streaming dari permintaan yang memilihnya, sehingga percobaan ulang bersamaan atau serah terima kredensial tidak dapat memilih kembali akun yang sudah dikomit ke aliran yang sedang berjalan. Reservasi dicakupkan ke (koneksi, model upstream yang dapat dipanggil), sehingga satu akun masih dapat melayani dua model berbeda sekaligus. Ketika setiap akun yang memenuhi syarat sudah disewakan untuk model tersebut, permintaan mengembalikan 503 `antigravity_pool_busy` terstruktur dengan `Retry-After` yang terbatas alih-alih menumpuk pada akun yang sibuk. Nonaktif secara default: pemilihan akun tetap persis seperti sebelumnya, dan tidak ada reservasi yang diambil. | ### CLI (5) -| Kunci | Tipe | Default | Mulai Ulang | Deskripsi | -| ------------------------------------- | ------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Aktifkan mode kompatibilitas untuk semua klien CLI. | -| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Aktifkan lapisan kompatibilitas alias model. | -| `PRICING_SYNC_ENABLED` | boolean | `false` | | Aktifkan sinkronisasi data harga otomatis (juga memerlukan variabel lingkungan `PRICING_SYNC_ENABLED`). | -| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Setelah sinkronisasi model penyedia, secara otomatis tulis (ulang) file profil ~/.codex/*.config.toml dari katalog langsung. Tidak pernah mengubah konfigurasi Codex aktif/default. Dinonaktifkan secara default. | -| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Setelah sinkronisasi model penyedia, secara otomatis tulis (ulang) profil Claude Code ~/.claude/profiles//settings.json dari katalog langsung. Tidak pernah mengubah konfigurasi Claude aktif/default. Dinonaktifkan secara default. | +| Key | Type | Default | Restart | Description | +| ------------------------------------- | ------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CLI_COMPAT_ALL` | boolean | `false` | ✓ | Mengaktifkan mode kompatibilitas untuk semua klien CLI. | +| `MODEL_ALIAS_COMPAT_ENABLED` | boolean | `false` | | Mengaktifkan lapisan kompatibilitas alias model. | +| `PRICING_SYNC_ENABLED` | boolean | `false` | | Mengaktifkan sinkronisasi data harga otomatis (juga memerlukan variabel lingkungan `PRICING_SYNC_ENABLED`). | +| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | boolean | `false` | | Setelah sinkronisasi model penyedia, secara otomatis (menulis ulang) file profil ~/.codex/*.config.toml dari katalog langsung. Tidak pernah mengubah konfigurasi Codex yang aktif/default. Nonaktif secara default. | +| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | boolean | `false` | | Setelah sinkronisasi model penyedia, secara otomatis (menulis ulang) file profil Claude Code ~/.claude/profiles//settings.json dari katalog langsung. Tidak pernah mengubah konfigurasi Claude yang aktif/default. Nonaktif secara default. | ### Kesehatan (5) -| Kunci | Tipe | Default | Deskripsi | -| ----------------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Menonaktifkan endpoint pemeriksaan kesehatan instans lokal. | -| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Menonaktifkan pemeriksaan kesehatan validasi token. | -| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Mengaktifkan akses jaringan di lingkungan sandbox skills. | -| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Dalam penyisiran kesehatan proxy, probe yang ditolak oleh target (401/403/429) mereset rentetan kegagalan berturut-turut proxy. Nonaktif secara default: penolakan tetap netral (#10654). Respons 5xx tetap tidak konklusif dalam kedua kondisi; penolakan tidak pernah menghapus, menonaktifkan, atau mengaktifkan kembali proxy. | -| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Menjalankan pemeriksaan integritas/kesehatan DB saat startup setelah server mulai menerima permintaan (melalui `setImmediate`), alih-alih memblokir startup hingga pemeriksaan selesai (#13717). Nonaktif secara default: startup diblokir sama persis seperti sebelum PR ini. | - -> [!NOTE] -> `INPUT_SANITIZER_BLOCK_THRESHOLD` dan alias lamanya, -> `INJECTION_GUARD_BLOCK_THRESHOLD`, mengatur mode `block` dari -> `INJECTION_GUARD_MODE`, tetapi keduanya merupakan variabel lingkungan biasa yang dibaca oleh +| Kunci | Tipe | Default | Deskripsi | +| :---------------------------------------- | :------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | boolean | `false` | Nonaktifkan endpoint pemeriksaan kesehatan instans lokal. | +| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | boolean | `false` | Nonaktifkan pemeriksaan kesehatan validasi token. | +| `SKILLS_SANDBOX_NETWORK_ENABLED` | boolean | `false` | Aktifkan akses jaringan di lingkungan sandbox keterampilan. | +| `PROXY_HEALTH_BLOCKED_RESETS_STREAK` | boolean | `false` | Dalam pemindaian kesehatan proxy, probe yang ditolak target (401/403/429) mengatur ulang rentetan kegagalan beruntun proxy. Nonaktif secara default: penolakan tetap netral (#10654). 5xx tetap tidak meyakinkan; penolakan tidak pernah menghapus, menonaktifkan, atau mengaktifkan kembali proxy. | +| `DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED` | boolean | `false` | Jalankan pemeriksaan integritas/kesehatan DB saat startup setelah server mulai menerima permintaan (melalui `setImmediate`) alih-alih memblokir startup hingga selesai (#13717). Nonaktif secara default: startup memblokir persis seperti sebelum PR ini. | + +> [!CATATAN] +> `INPUT_SANITIZER_BLOCK_THRESHOLD` dan alias lamanya +> `INJECTION_GUARD_BLOCK_THRESHOLD` menyetel mode `block` dari +> `INJECTION_GUARD_MODE`, tetapi keduanya adalah variabel lingkungan biasa yang dibaca oleh > [`src/shared/utils/injectionSeverity.ts`](../../src/shared/utils/injectionSeverity.ts), -> bukan feature flag: keduanya tidak memiliki override DB maupun toggle dasbor. Lihat +> bukan _feature flag_: keduanya tidak memiliki _override_ DB dan tidak ada _toggle_ dasbor. Lihat > [`ENVIRONMENT.md`](./ENVIRONMENT.md#4-security--authentication). -> [!NOTE] -> Kolom `Restart` menandai flag dengan `requiresRestart: true` — nilainya -> langsung disimpan, tetapi baru berlaku setelah proses dimuat ulang. Flag enum -> menolak setiap nilai di luar himpunan yang diizinkan (divalidasi di sisi server dalam -> `setFeatureFlagOverride()` maupun handler REST `PUT`). +> [!CATATAN] +> Kolom `Restart` menandai _flag_ dengan `requiresRestart: true` — nilai tersebut +> disimpan secara instan tetapi hanya berlaku setelah proses dimuat ulang. _Flag_ enum +> menolak nilai apa pun di luar set yang diizinkan (divalidasi di sisi server baik di +> `setFeatureFlagOverride()` maupun _handler_ REST `PUT`). --- @@ -169,30 +170,27 @@ digunakan ketika override DB maupun variabel lingkungan tidak tersedia. ### Dasbor -Buka **Dasbor → Pengaturan → Feature Flags** +Navigasikan ke **Dasbor → Pengaturan → Feature Flags** (`/dashboard/settings/feature-flags`). Grid (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx`) mendukung: -- **Pencarian** berdasarkan kunci atau deskripsi, dan **pemfilteran** berdasarkan kategori (serta tampilan sintetis - **Memerlukan Mulai Ulang**). -- **Toggle** untuk flag boolean dan **dropdown** untuk flag enum +- **Pencarian** berdasarkan kunci atau deskripsi, dan **filter** berdasarkan kategori (ditambah tampilan sintetis **Membutuhkan Restart**). +- Sebuah **tombol sakelar** untuk flag boolean dan **dropdown** untuk flag enum (`src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx`). -- **Badge sumber** untuk setiap flag — `DB`, `ENV`, atau `DEF` — yang menunjukkan asal - nilai efektif. -- Tombol **Reset** (hanya ditampilkan untuk flag yang bersumber dari `DB`) untuk menghapus override, - dan tombol **Reset Semua Override** di bagian bawah. -- Banner **Mulai Ulang Server** ketika flag `requiresRestart` diubah. +- Sebuah **badge sumber** per flag — `DB`, `ENV`, atau `DEF` — yang menunjukkan dari mana nilai efektif berasal. +- Tombol **Reset** (hanya ditampilkan untuk flag bersumber `DB`) untuk menghapus penimpaan, dan tombol **Reset Semua Penimpaan** di bagian bawah. +- Sebuah banner **Restart Server** ketika flag `requiresRestart` diubah. ### REST API -Semua operasi dilakukan melalui satu route: +Semua operasi melalui satu rute: [`src/app/api/settings/feature-flags/route.ts`](../../src/app/api/settings/feature-flags/route.ts). Setiap metode memerlukan sesi dasbor yang terautentikasi (`401` jika tidak). #### `GET /api/settings/feature-flags` -Mengembalikan setiap flag beserta nilai efektif, sumber, dan ringkasannya. +Mengembalikan setiap flag dengan nilai efektif, sumber, dan ringkasannya. ```jsonc { @@ -210,7 +208,7 @@ Mengembalikan setiap flag beserta nilai efektif, sumber, dan ringkasannya. "requiresRestart": false, "warningLevel": "caution", }, - // ... seluruh 72 flag + // ... all 74 flags ], "summary": { "total": 56, @@ -224,33 +222,31 @@ Mengembalikan setiap flag beserta nilai efektif, sumber, dan ringkasannya. #### `PUT /api/settings/feature-flags` -Menetapkan atau menghapus satu override. Body: `{ key: string; value?: string }`. -Menghilangkan `value` akan menghapus override (memulihkan env / nilai default). +Mengatur atau menghapus satu penimpaan. Body: `{ key: string; value?: string }`. +Menghilangkan `value` akan menghapus penimpaan (mengembalikan ke env / default). ```bash -# Tetapkan override DB +# Set a DB override curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY","value":"true"}' -# Hapus override (tanpa "value") +# Remove the override (no "value") curl -X PUT http://localhost:20128/api/settings/feature-flags \ -H "Content-Type: application/json" \ -d '{"key":"REQUIRE_API_KEY"}' ``` -Respons mengembalikan `effectiveValue`/`source` yang baru, `previousValue`/ -`previousSource`, dan `requiresRestart`. Kunci yang tidak dikenal dan nilai enum -di luar rentang akan ditolak dengan `400`. +Respons menggemakan `effectiveValue`/`source` yang baru, `previousValue`/ +`previousSource` sebelumnya, dan `requiresRestart`. Kunci yang tidak dikenal dan nilai enum di luar jangkauan ditolak dengan `400`. #### `DELETE /api/settings/feature-flags` -Menghapus **semua** override DB sekaligus, sehingga setiap flag kembali ke nilai env / default. -Mengembalikan `{ cleared: , message: "..." }`. +Menghapus **semua** penimpaan DB sekaligus, mengembalikan setiap flag ke nilai env / default-nya. Mengembalikan `{ cleared: , message: "..." }`. > [!NOTE] -> Flag dengan `requiresRestart: true` hanya berlaku setelah proses dimuat ulang. -> Alur mulai ulang dasbor memanggil `POST /api/restart`, lalu melakukan polling terhadap +> Flag dengan `requiresRestart: true` hanya akan berlaku setelah proses dimuat ulang. +> Alur restart dasbor memanggil `POST /api/restart` dan kemudian melakukan polling > `GET /api/health/ping` hingga server kembali aktif. --- diff --git a/docs/i18n/id/docs/routing/REASONING_REPLAY.md b/docs/i18n/id/docs/routing/REASONING_REPLAY.md index 2a174ad112fd..3de540dfd4b5 100644 --- a/docs/i18n/id/docs/routing/REASONING_REPLAY.md +++ b/docs/i18n/id/docs/routing/REASONING_REPLAY.md @@ -22,22 +22,24 @@ Namun, klien pada umumnya (Cursor, Cline, Roo Code, OpenAI SDK) menghapus `reaso ## Arsitektur ``` -Giliran N (asisten menghasilkan): +Turn N (asisten membuat): → respons berisi reasoning_content + tool_calls → jika requiresReasoningReplay(provider, model): cacheReasoningFromAssistantMessage() - menulis (memori + DB), dengan setiap tool_call.id sebagai kunci - → meneruskan respons ke klien (yang mungkin menyimpan atau tidak menyimpan penalaran) + menulis (memory + DB), dengan kunci setiap tool_call.id + → meneruskan respons ke klien (yang mungkin atau mungkin tidak menyimpan penalaran) -Giliran N+1 (klien mengirim tindak lanjut): - → penerjemah mendeteksi: requiresReasoningReplay(provider, model) === true +Turn N+1 (klien mengirim tindak lanjut): + → translator mendeteksi: requiresReasoningReplay(provider, model) === true → untuk setiap pesan asisten dengan tool_calls dan tanpa reasoning_content: - lookupReasoning(toolCalls[0].id) → memori → DB - ditemukan → msg.reasoning_content = cached; recordReplay() - tidak ditemukan → msg.reasoning_content = "" (fallback lama untuk DeepSeek versi terdahulu) - → upstream menerima riwayat yang konsisten → tidak ada 400 + lookupReasoning(toolCalls[0].id) → memory → DB + hit → msg.reasoning_content = cached; recordReplay() + miss → msg.reasoning_content = "" (fallback warisan untuk DeepSeek versi lama) + → upstream melihat riwayat yang konsisten → tidak ada 400 ``` -Penangkapan dilakukan di `open-sse/handlers/chatCore.ts` (dua lokasi, pada dua lokasi pemanggilan `cacheReasoningFromAssistantMessage`). Pemutaran kembali dilakukan di `open-sse/translator/index.ts` setelah koersi skema, tetapi sebelum pengiriman. +Penangkapan terjadi di `open-sse/handlers/chatCore.ts` (dua lokasi, pada dua titik pemanggilan `cacheReasoningFromAssistantMessage`). Pemutaran ulang (replay) terjadi di `open-sse/translator/index.ts` setelah koersi skema tetapi sebelum pengiriman (dispatch). + +Turn asisten biasa (non-tool-call) diberi kunci secara berbeda: `buildAssistantMessageCacheKey()` mencerna cakupan sesi ditambah transkrip format OpenAI yang dinormalisasi hingga turn tersebut, karena DeepSeek memerlukan penalaran dari _setiap_ turn sebelumnya setelah `tools` ada. Untuk target Responses-API (sebagai contoh `opencode-go/deepseek-v4-flash`, yang diarahkan ke `/responses`) badan upstream membawa `input`, bukan `messages`, sehingga `translateRequest()` (`open-sse/translator/index.ts`) melaporkan transkrip pivot yang dicernanya melalui opsi callback dan situs penangkapan mencerna transkrip yang sama. Pass pemutaran ulang Responses berjalan pada pivot OpenAI untuk setiap format sumber, sehingga klien Anthropic Messages (Claude → OpenAI → Responses) juga diputar ulang. ## Penyimpanan — Hibrida Memori + SQLite diff --git a/docs/i18n/id/docs/security/SOCKET_DEV_FINDINGS.md b/docs/i18n/id/docs/security/SOCKET_DEV_FINDINGS.md index e82850bdb286..359f14081771 100644 --- a/docs/i18n/id/docs/security/SOCKET_DEV_FINDINGS.md +++ b/docs/i18n/id/docs/security/SOCKET_DEV_FINDINGS.md @@ -4,22 +4,15 @@ --- -Dokumen ini adalah atestasi yang disusun oleh pengelola untuk enam temuan -`AI-detected potential malware` yang diajukan terhadap `omniroute@3.8.5` dan -mitigasi yang diterapkan dalam `omniroute@3.8.6`. Dokumen ini dibuat agar: - -1. Operator pipeline keamanan memiliki satu referensi yang dapat dikutip ketika - mereka perlu mengevaluasi temuan terhadap kode sumber yang sebenarnya. -2. Pemindai AI di masa mendatang dapat mengenali pernyataan yang ditandatangani - pengelola bahwa setiap jalur yang ditandai bersifat disengaja, opsional, dan - terdokumentasi. -3. Kami memiliki catatan tertulis tentang _alasan_ setiap lokasi pemanggilan - dibentuk seperti itu — sehingga refaktor di masa mendatang tidak secara tidak - sengaja memperkenalkan kembali sidik yang sengaja dihapus. - -Jika Anda mengoperasikan pemindai yang kembali menandai lokasi pemanggilan di -bawah ini setelah mitigasi v3.8.6 dirilis, silakan buka issue dengan jejak -pemindaian dan kami akan memperluas atestasi di sini. +> **Catatan Lingkup:** `socket.yml` mengonfigurasi pemindaian pasca-publikasi sisi registri Socket.dev terhadap artefak npm (jalur-abaikan untuk konten yang tidak dikirim seperti `tests/`, `docs/`, dan laporan build). Ini tidak menghubungkan gerbang penggabungan CI/PR — tidak ada alur kerja di `.github/workflows`, tidak ada skrip `package.json`, dan tidak ada target `Makefile` yang memanggil Socket.dev. + +Dokumen ini adalah atestasi yang dibuat oleh pemelihara untuk enam temuan `potensi malware yang terdeteksi AI` yang diajukan terhadap `omniroute@3.8.5` dan mitigasi yang diterapkan di `omniroute@3.8.6`. Tujuannya adalah agar: + +1. Operator pipeline keamanan memiliki satu referensi untuk dikutip ketika mereka perlu mengevaluasi temuan terhadap sumber sebenarnya. +2. Pemindai AI di masa mendatang dapat mengambil klaim yang ditandatangani pemelihara bahwa setiap jalur yang ditandai adalah disengaja, opt-in, dan didokumentasikan. +3. Kami memiliki catatan tertulis tentang _mengapa_ setiap situs panggilan dibentuk seperti itu — sehingga refaktor di masa mendatang tidak secara tidak sengaja memperkenalkan kembali sidik jari yang sengaja dihapus. + +Jika Anda mengoperasikan pemindai yang menandai ulang salah satu situs panggilan di bawah ini setelah mitigasi v3.8.6 telah dirilis, harap buka masalah dengan jejak pemindaian dan kami akan memperluas atestasi di sini. --- diff --git a/scripts/i18n/check-translation-drift.mjs b/scripts/i18n/check-translation-drift.mjs old mode 100755 new mode 100644 index 923937878b4c..ea0cc3c59278 --- a/scripts/i18n/check-translation-drift.mjs +++ b/scripts/i18n/check-translation-drift.mjs @@ -26,6 +26,24 @@ const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url)); const ROOT = path.resolve(SCRIPT_DIR, "..", ".."); const STATE_PATH = path.join(ROOT, ".i18n-state.json"); +// A mirror is stale when its locale record was written from an older version +// of the source than the one the top-level source_hash now records — that is +// what a partial run leaves behind (17 of 65 locales refreshed, the rest +// interrupted by an upstream quota 429): the source no longer reads as +// changed, the stale mirrors' target hashes still match, and the gate said +// PASS for 45 stale mirrors. Pure over the `sources` map of .i18n-state.json. +export function findStaleTargets(sources) { + const stale = []; + for (const [rel, entry] of Object.entries(sources || {})) { + for (const [locale, info] of Object.entries(entry.locales || {})) { + if (info?.source_hash && entry.source_hash && info.source_hash !== entry.source_hash) { + stale.push({ rel, locale, recorded: info.source_hash, current: entry.source_hash }); + } + } + } + return stale; +} + function parseArgs(argv) { const opts = { mode: "strict", json: false }; for (const arg of argv.slice(2)) { @@ -121,6 +139,12 @@ async function main() { } } + // Stale targets are reported but do not fail the gate: they only appear + // after a refresh run was interrupted (upstream quota 429 on 2026-09-18 + // left 45 locales behind for ~6 days), and failing every PR's CI for a + // backend outage nobody can fix in-branch helps no one. The list is the + // work order for `npm run i18n:run -- --locale= --files=`. + const staleTargets = findStaleTargets(sources); const ok = driftedSources.length === 0 && missingTargets.length === 0 && driftedTargets.length === 0; @@ -134,6 +158,7 @@ async function main() { driftedSources, missingTargets, driftedTargets, + staleTargets, }, null, 2 @@ -153,6 +178,12 @@ async function main() { console.log(`[i18n-check] drifted targets (${driftedTargets.length}):`); for (const t of driftedTargets) console.log(` - ${t.rel} [${t.locale}]`); } + if (staleTargets.length) { + console.log( + `[i18n-check] WARN stale targets (${staleTargets.length}) — translated from an older source (not blocking; refresh with npm run i18n:run):` + ); + for (const t of staleTargets) console.log(` - ${t.rel} [${t.locale}] (stale)`); + } if (ok) { console.log("[i18n-check] PASS — all sources and targets match recorded hashes."); } else if (opts.mode === "warn") { diff --git a/src/i18n/messages/am.json b/src/i18n/messages/am.json index e5602201aa1e..f0520427a09f 100644 --- a/src/i18n/messages/am.json +++ b/src/i18n/messages/am.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ዋና አሰሳ", "unpinSection": "ክፍሉን ከተሰካበት አላቅቅ", "pinSectionOpen": "ክፍሉ ክፍት እንዲቆይ ሰካ", + "pinItem": "ንጥል ሰካ", + "unpinItem": "ንጥል ንቀል", + "pinnedSection": "ተሰክቷል", "reloadPage": "ገጹን እንደገና ጫን", "dragReorderSection": "ክፍሉን እንደገና ለማደራጀት ጎትት", "dragReorderItem": "እንደገና ለማደራጀት ጎትት", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "የGrok ድር ኩኪ ፍንጭ", "blockClaudeExtraUsageDescription": "ይህ ሲነቃ፣ የአጠቃቀም API ተራ የያዘ ተጨማሪ አጠቃቀም እንዳለ እንደዘገበ OmniRoute ይህን Claude ግንኙነት ወዲያውኑ እንደማይገኝ ምልክት ያደርገዋል፤ በዚህም በተጠቀሙት መጠን የሚከፈል ተጨማሪ ክፍያ ከመቀጠል ይልቅ የመጠባበቂያ ስርዓቱ ወደ ሌላ ግንኙነት ይቀየራል።", "blockClaudeExtraUsageLabel": "የClaude ተጨማሪ አጠቃቀምን አግድ", + "claudeLowPriorityModeLabel": "ከ5-ሰዓት ገደብ በኋላ በዝቅተኛ ቅድሚያ ይቀጥሉ", + "claudeLowPriorityModeDescription": "ይህ መለያ የ5-ሰዓት የአጠቃቀም ገደቡን ሲደርስ እና Anthropic ዝቅተኛ ቅድሚያ ያለውን መስመር ሲያቀርብ፣ OmniRoute ይቀበለውና መስኮቱ እስኪታደስ ድረስ ጥያቄዎችን በ anthropic-usage-limit: slow መላኩን ይቀጥላል፣ ግንኙነቱን ከማቀዝቀዝ ይልቅ። የሳምንቱ ገደብ አሁንም ይተገበራል እና ምላሾች ተጨማሪ አቅምን ሊጠብቁ ይችላሉ።", + "claudeAutoLimitResetLabel": "የክፍለ ጊዜ ገደብን በራስ-ሰር ዳግም አስጀምር (በሳምንት አንድ ጊዜ)", + "claudeAutoLimitResetDescription": "ይህ መለያ የ5-ሰዓት የአጠቃቀም ገደቡን ሲደርስ እና የክፍለ ጊዜ ገደብ ዳግም ማስጀመር ሲገኝ፣ OmniRoute በራስ-ሰር ይወስደዋል እና በሙሉ ፍጥነት እንደገና ይሞክራል። የመለያውን በሳምንት አንድ ጊዜ ዳግም ማስጀመር ይጠቀማል እና አሁንም ለሳምንቱ ገደብ ይቆጠራል።", "disableCoolingDescription": "ይህ ግንኙነት ሊታረሙ ከሚችሉ ስህተቶች በኋላም ብቁ ሆኖ እንዲቆይ ጊዜያዊውን የማቀዝቀዝ ጊዜ ይዝለሉ (እንደ የታገደ/ጊዜው ያለፈ ያሉ የመጨረሻ ሁኔታዎች አሁንም ተፈጻሚ ናቸው)።", "disableCoolingLabel": "ለዚህ ግንኙነት የማቀዝቀዝ ጊዜን አሰናክል", "bulkPasteAdded": "{count, plural, one {1 ቁልፍ ታክሏል} other {# ቁልፎች ታክለዋል}}", diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index b91d4b089020..2f4ce5563379 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -1293,6 +1293,9 @@ "mainNavigation": "التنقل الرئيسي", "unpinSection": "إلغاء تثبيت القسم", "pinSectionOpen": "تثبيت القسم مفتوحًا", + "pinItem": "تثبيت العنصر", + "unpinItem": "إلغاء تثبيت العنصر", + "pinnedSection": "مثبت", "reloadPage": "إعادة تحميل الصفحة", "dragReorderSection": "اسحب لإعادة ترتيب القسم", "dragReorderItem": "اسحب لإعادة الترتيب", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "ألصق ملف تعريف ارتباط جلسة Grok", "blockClaudeExtraUsageDescription": "امنع استخدام رصيد Claude الإضافي بعد استنفاد الحصة المضمّنة", "blockClaudeExtraUsageLabel": "حظر استخدام Claude الإضافي", + "claudeLowPriorityModeLabel": "المتابعة بأولوية أقل بعد حد الـ 5 ساعات", + "claudeLowPriorityModeDescription": "عندما يصل هذا الحساب إلى حد الاستخدام البالغ 5 ساعات وتقدم Anthropic مسار الأولوية المنخفضة، يقبل OmniRoute ذلك ويستمر في إرسال الطلبات مع anthropic-usage-limit: slow حتى يتم إعادة تعيين النافذة، بدلاً من تهدئة الاتصال. لا يزال الحد الأسبوعي ساريًا وقد تنتظر الاستجابات توفر سعة إضافية.", + "claudeAutoLimitResetLabel": "إعادة تعيين حد الجلسة تلقائيًا (مرة واحدة في الأسبوع)", + "claudeAutoLimitResetDescription": "عندما يصل هذا الحساب إلى حد الاستخدام البالغ 5 ساعات وتكون إعادة تعيين حد الجلسة متاحة، يطالب OmniRoute بها تلقائيًا ويعيد المحاولة بالسرعة الكاملة. يستخدم هذا خيار إعادة التعيين الأسبوعي للحساب ولا يزال يُحتسب ضمن الحد الأسبوعي.", "disableCoolingDescription": "تخطي فترة التهدئة المؤقتة حتى يظل هذا الاتصال مؤهلاً حتى بعد الأخطاء القابلة للاسترداد (لا تزال الحالات النهائية مثل banned/expired سارية).", "disableCoolingLabel": "تعطيل فترة التهدئة لهذا الاتصال", "bulkPasteAdded": "المفاتيح المضافة: {count, plural, one {أُضيف مفتاح واحد} other {أُضيف # من المفاتيح}}", diff --git a/src/i18n/messages/az.json b/src/i18n/messages/az.json index 4f76783c384a..608a1da2f67e 100644 --- a/src/i18n/messages/az.json +++ b/src/i18n/messages/az.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Əsas naviqasiya", "unpinSection": "Bölməni sancaqdan çıxarın", "pinSectionOpen": "Bölməni açıq vəziyyətdə sancaqla", + "pinItem": "Elementi bərkit", + "unpinItem": "Elementi bərkitmədən çıxar", + "pinnedSection": "Bərkidilib", "reloadPage": "Səhifəni Yenidən Yükləyin", "dragReorderSection": "Bölmənin sırasını dəyişmək üçün sürükləyin", "dragReorderItem": "Sıranı dəyişmək üçün sürükləyin", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web kukisi üçün ipucu", "blockClaudeExtraUsageDescription": "Aktiv edildikdə, OmniRoute bu Claude bağlantısını istifadənin API-si sıralanan əlavə istifadəni bildirdiyi anda istifadəyə yararsız olaraq işarələyir, beləliklə, ehtiyat başqa bir bağlantıya keçid edir, ödənişə görə əlavə ödəniş etməyə davam etmək əvəzinə.", "blockClaudeExtraUsageLabel": "Əlavə Claude istifadəsini bloklayın", + "claudeLowPriorityModeLabel": "5 saatlıq limitdən sonra aşağı prioritetlə davam et", + "claudeLowPriorityModeDescription": "Bu hesab 5 saatlıq istifadə limitinə çatdıqda və Anthropic aşağı prioritetli zolağı təklif etdikdə, OmniRoute bunu qəbul edir və bağlantını soyutmaq əvəzinə, pəncərə sıfırlanana qədər sorğuları anthropic-usage-limit: slow ilə göndərməyə davam edir. Həftəlik limit yenə də tətbiq olunur və cavablar ehtiyat tutum gözləyə bilər.", + "claudeAutoLimitResetLabel": "Sessiya limitini avtomatik sıfırla (həftədə bir dəfə)", + "claudeAutoLimitResetDescription": "Bu hesab 5 saatlıq istifadə limitinə çatdıqda və sessiya limitinin sıfırlanması mövcud olduqda, OmniRoute ondan avtomatik istifadə edir və tam sürətlə yenidən cəhd edir. Hesabın həftədə bir dəfəlik sıfırlamasından istifadə edir və yenə də həftəlik limitə daxil olur.", "disableCoolingDescription": "Müvəqqəti soyuma müddətini atlayın ki, bu bağlantı bərpa edilə bilən xətalardan sonra belə uyğun qalsın (bloklanmış/vaxtı keçmiş kimi terminal vəziyyətlər hələ də tətbiq olunur).", "disableCoolingLabel": "Bu bağlantı üçün soyuma müddətini söndürün", "bulkPasteAdded": "{count, plural, one {1 açar əlavə edildi} other {# açar əlavə edildi}}", diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index fb58a93d13d2..1244b475eefc 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Основна навигация", "unpinSection": "Откачване на секцията", "pinSectionOpen": "Закачване на секцията отворена", + "pinItem": "Закачи елемент", + "unpinItem": "Откачи елемент", + "pinnedSection": "Закачено", "reloadPage": "Презареждане на страницата", "dragReorderSection": "Плъзнете за пренареждане на секцията", "dragReorderItem": "Плъзнете за пренареждане", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Подсказка за бисквитката на Grok Web", "blockClaudeExtraUsageDescription": "Когато е активирано, OmniRoute маркира това Claude свързване като недостъпно веднага щом API-то за използване докладва опашка с допълнително използване, така че резервното копие да премине към друга връзка вместо да продължи с допълнителното таксуване на база \"плащай колкото ползваш\".", "blockClaudeExtraUsageLabel": "Блокирайте допълнителната употреба на Claude", + "claudeLowPriorityModeLabel": "Продължи с по-нисък приоритет след 5-часовия лимит", + "claudeLowPriorityModeDescription": "Когато този акаунт достигне своя 5-часов лимит на използване и Anthropic предложи лентата с по-нисък приоритет, OmniRoute я приема и продължава да изпраща заявки с anthropic-usage-limit: slow, докато прозорецът се нулира, вместо да охлади връзката. Седмичният лимит все още важи и отговорите може да изчакат за свободен капацитет.", + "claudeAutoLimitResetLabel": "Автоматично нулиране на лимита на сесията (веднъж седмично)", + "claudeAutoLimitResetDescription": "Когато този акаунт достигне своя 5-часов лимит на използване и е налично нулиране на лимита на сесията, OmniRoute го задейства автоматично и опитва отново с пълна скорост. Използва еднократното седмично нулиране на акаунта и все още се отчита към седмичния лимит.", "disableCoolingDescription": "Пропускане на временния период на изчакване, така че тази връзка да остане допустима дори след възстановими грешки (терминалните състояния като блокиран/изтекъл все още се прилагат).", "disableCoolingLabel": "Деактивиране на периода на изчакване за тази връзка", "bulkPasteAdded": "{count, plural, one {Добавен е 1 ключ} other {Добавени са # ключа}}", diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json index 3cc50edbb16c..5a7a1a1f694a 100644 --- a/src/i18n/messages/bn.json +++ b/src/i18n/messages/bn.json @@ -1293,6 +1293,9 @@ "mainNavigation": "প্রধান নেভিগেশন", "unpinSection": "সেকশন আনপিন করুন", "pinSectionOpen": "সেকশন খোলা অবস্থায় পিন করুন", + "pinItem": "আইটেম পিন করুন", + "unpinItem": "আইটেম আনপিন করুন", + "pinnedSection": "পিন করা হয়েছে", "reloadPage": "পেজ রিলোড করুন", "dragReorderSection": "সেকশন পুনর্বিন্যাস করতে ড্র্যাগ করুন", "dragReorderItem": "পুনর্বিন্যাস করতে ড্র্যাগ করুন", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web কুকির ইঙ্গিত", "blockClaudeExtraUsageDescription": "যখন সক্ষম করা হয়, OmniRoute এই Claude সংযোগটিকে অপ্রাপ্য হিসাবে চিহ্নিত করে যত তাড়াতাড়ি ব্যবহারের API কিউড অতিরিক্ত ব্যবহারের রিপোর্ট করে, তাই ফ fallback অন্য সংযোগে পরিবর্তিত হয় পরিবর্তে পে-এজ-ইউ-গো অতিরিক্ত বিলিং চালিয়ে যাওয়ার।", "blockClaudeExtraUsageLabel": "অতিরিক্ত Claude ব্যবহার ব্লক করুন", + "claudeLowPriorityModeLabel": "৫-ঘণ্টার সীমা শেষে নিম্ন অগ্রাধিকারে চালিয়ে যান", + "claudeLowPriorityModeDescription": "এই অ্যাকাউন্ট যখন তার ৫-ঘণ্টার ব্যবহারের সীমায় পৌঁছায় এবং Anthropic নিম্ন-অগ্রাধিকার লেন অফার করে, OmniRoute তা গ্রহণ করে এবং উইন্ডো রিসেট না হওয়া পর্যন্ত anthropic-usage-limit: slow সহ অনুরোধ পাঠাতে থাকে, সংযোগ কুল-ডাউন করার বদলে। সাপ্তাহিক সীমা তখনও প্রযোজ্য এবং উত্তরগুলো অতিরিক্ত সক্ষমতার জন্য অপেক্ষা করতে পারে।", + "claudeAutoLimitResetLabel": "সেশনের সীমা স্বয়ংক্রিয়ভাবে রিসেট করুন (সপ্তাহে একবার)", + "claudeAutoLimitResetDescription": "এই অ্যাকাউন্ট যখন তার ৫-ঘণ্টার ব্যবহারের সীমায় পৌঁছায় এবং একটি সেশন-সীমার রিসেট পাওয়া যায়, OmniRoute তা স্বয়ংক্রিয়ভাবে দাবি করে এবং সম্পূর্ণ গতিতে আবার চেষ্টা করে। অ্যাকাউন্টের সপ্তাহে-একবার রিসেট ব্যবহার করে এবং তবুও সাপ্তাহিক সীমার মধ্যে গণনা হয়।", "disableCoolingDescription": "অস্থায়ী কুলডাউন এড়িয়ে যান যাতে পুনরুদ্ধারযোগ্য ত্রুটির পরেও এই সংযোগটি যোগ্য থাকে (নিষিদ্ধ/মেয়াদোত্তীর্ণের মতো টার্মিনাল অবস্থাগুলি এখনও প্রযোজ্য)।", "disableCoolingLabel": "এই সংযোগের জন্য কুলডাউন নিষ্ক্রিয় করুন", "bulkPasteAdded": "{count, plural, one {১টি কী যোগ করা হয়েছে} other {#টি কী যোগ করা হয়েছে}}", diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index fb2ac9b87675..18a27d49a396 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Hlavní navigace", "unpinSection": "Odepnout sekci", "pinSectionOpen": "Připnout sekci jako otevřenou", + "pinItem": "Připnout položku", + "unpinItem": "Odepnout položku", + "pinnedSection": "Připnuto", "reloadPage": "Znovu načíst stránku", "dragReorderSection": "Přetažením změnit pořadí sekce", "dragReorderItem": "Přetažením změnit pořadí", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Nápověda ke cookie Grok Web", "blockClaudeExtraUsageDescription": "Když je povoleno, OmniRoute označí toto spojení Claude jako nedostupné, jakmile API pro využití nahlásí zařazené dodatečné využití, takže se záložní přepne na jiné spojení místo pokračování v dodatečném účtování podle skutečného využití.", "blockClaudeExtraUsageLabel": "Zablokovat nadměrné používání Claude", + "claudeLowPriorityModeLabel": "Pokračovat s nižší prioritou po dosažení 5hodinového limitu", + "claudeLowPriorityModeDescription": "Když tento účet dosáhne svého 5hodinového limitu využití a Anthropic nabídne dráhu s nižší prioritou, OmniRoute ji přijme a bude i nadále odesílat požadavky s anthropic-usage-limit: slow, dokud se okno neobnoví, místo aby spojení ochlazoval. Týdenní limit stále platí a odpovědi mohou čekat na volnou kapacitu.", + "claudeAutoLimitResetLabel": "Automaticky resetovat limit relace (jednou týdně)", + "claudeAutoLimitResetDescription": "Když tento účet dosáhne svého 5hodinového limitu využití a je k dispozici reset limitu relace, OmniRoute ho automaticky uplatní a opakuje pokusy plnou rychlostí. Využívá reset účtu dostupný jednou týdně a stále se započítává do týdenního limitu.", "disableCoolingDescription": "Přeskočit přechodný cooldown, aby toto připojení zůstalo způsobilé i po obnovitelných chybách (konečné stavy jako zablokováno/vypršelo stále platí).", "disableCoolingLabel": "Zakázat cooldown pro toto připojení", "bulkPasteAdded": "{count, plural, one {Přidán 1 klíč} few {Přidány # klíče} other {Přidáno # klíčů}}", diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index e24cd8e16829..89eb1f540a96 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Hovednavigation", "unpinSection": "Frigør sektion", "pinSectionOpen": "Fastgør sektion åben", + "pinItem": "Fastgør element", + "unpinItem": "Frigør element", + "pinnedSection": "Fastgjort", "reloadPage": "Genindlæs side", "dragReorderSection": "Træk for at omarrangere sektion", "dragReorderItem": "Træk for at omarrangere", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Tip til Grok Web-cookie", "blockClaudeExtraUsageDescription": "Når aktiveret, markerer OmniRoute denne Claude-forbindelse som utilgængelig, så snart brug API'et rapporterer køet ekstra brug, så fallback skifter til en anden forbindelse i stedet for at fortsætte med pay-as-you-go ekstra fakturering.", "blockClaudeExtraUsageLabel": "Bloker ekstra Claude-brug", + "claudeLowPriorityModeLabel": "Fortsæt med lavere prioritet efter grænsen på 5 timer", + "claudeLowPriorityModeDescription": "Når denne konto når sin forbrugsgrænse på 5 timer, og Anthropic tilbyder banen med lavere prioritet, accepterer OmniRoute den og fortsætter med at sende anmodninger med anthropic-usage-limit: slow, indtil vinduet nulstilles, i stedet for at lade forbindelsen køle ned. Den ugentlige grænse gælder stadig, og svar kan komme til at vente på ledig kapacitet.", + "claudeAutoLimitResetLabel": "Nulstil automatisk sessionsgrænsen (én gang om ugen)", + "claudeAutoLimitResetDescription": "Når denne konto når sin forbrugsgrænse på 5 timer, og en nulstilling af sessionsgrænsen er tilgængelig, indløser OmniRoute den automatisk og prøver igen med fuld hastighed. Bruger kontoens ugentlige nulstilling og tæller stadig med i den ugentlige grænse.", "disableCoolingDescription": "Spring den midlertidige nedkølingsperiode over, så denne forbindelse fortsat kan bruges, selv efter fejl, der kan afhjælpes (sluttilstande som blokeret/udløbet gælder stadig).", "disableCoolingLabel": "Deaktiver afkøling for denne forbindelse", "bulkPasteAdded": "{count, plural, one {1 nøgle tilføjet} other {# nøgler tilføjet}}", diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 4d3a945fcaf2..94a41f97c71e 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Hauptnavigation", "unpinSection": "Bereich loslösen", "pinSectionOpen": "Bereich geöffnet anheften", + "pinItem": "Element anheften", + "unpinItem": "Element lösen", + "pinnedSection": "Angeheftet", "reloadPage": "Seite neu laden", "dragReorderSection": "Ziehen, um Bereich neu anzuordnen", "dragReorderItem": "Ziehen zum Neuanordnen", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Hinweis zum Grok Web-Cookie", "blockClaudeExtraUsageDescription": "Wenn aktiviert, markiert OmniRoute diese Claude-Verbindung als nicht verfügbar, sobald die Usage-API gemeldete zusätzliche Nutzung in der Warteschlange anzeigt, sodass der Fallback auf eine andere Verbindung umschaltet, anstatt mit der Abrechnung für zusätzliche Nutzung nach dem Pay-as-you-go-Prinzip fortzufahren.", "blockClaudeExtraUsageLabel": "Zusätzliche Claude-Nutzung blockieren", + "claudeLowPriorityModeLabel": "Nach dem 5-Stunden-Limit mit niedrigerer Priorität fortfahren", + "claudeLowPriorityModeDescription": "Wenn dieses Konto sein 5-Stunden-Nutzungslimit erreicht und Anthropic die Lane mit niedrigerer Priorität anbietet, akzeptiert OmniRoute diese und sendet weiterhin Anfragen mit anthropic-usage-limit: slow, bis das Zeitfenster zurückgesetzt wird, anstatt die Verbindung abkühlen zu lassen. Das Wochenlimit gilt weiterhin und Antworten warten möglicherweise auf freie Kapazität.", + "claudeAutoLimitResetLabel": "Sitzungslimit automatisch zurücksetzen (einmal pro Woche)", + "claudeAutoLimitResetDescription": "Wenn dieses Konto sein 5-Stunden-Nutzungslimit erreicht und ein Zurücksetzen des Sitzungslimits verfügbar ist, beansprucht OmniRoute dieses automatisch und versucht es erneut mit voller Geschwindigkeit. Nutzt das einmal pro Woche verfügbare Zurücksetzen des Kontos und wird weiterhin auf das Wochenlimit angerechnet.", "disableCoolingDescription": "Vorübergehende Abklingzeit überspringen, damit diese Verbindung auch nach behebbaren Fehlern verfügbar bleibt (endgültige Zustände wie gesperrt/abgelaufen gelten weiterhin).", "disableCoolingLabel": "Abklingzeit für diese Verbindung deaktivieren", "bulkPasteAdded": "{count, plural, one {1 Schlüssel hinzugefügt} other {# Schlüssel hinzugefügt}}", diff --git a/src/i18n/messages/el.json b/src/i18n/messages/el.json index 4d367cb94e67..fb19c5ce7c26 100644 --- a/src/i18n/messages/el.json +++ b/src/i18n/messages/el.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Κύρια πλοήγηση", "unpinSection": "Κατάργηση καρφιτσώματος ενότητας", "pinSectionOpen": "Καρφίτσωμα ενότητας σε ανοιχτή θέση", + "pinItem": "Καρφίτσωμα στοιχείου", + "unpinItem": "Ξεκαρφίτσωμα στοιχείου", + "pinnedSection": "Καρφιτσωμένο", "reloadPage": "Επαναφόρτωση σελίδας", "dragReorderSection": "Σύρετε για αναδιάταξη ενότητας", "dragReorderItem": "Σύρετε για αναδιάταξη", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Υπόδειξη cookie Grok Web", "blockClaudeExtraUsageDescription": "Όταν είναι ενεργοποιημένο, το OmniRoute επισημαίνει αυτή τη σύνδεση Claude ως μη διαθέσιμη μόλις το API χρήσης αναφέρει επιπλέον χρήση σε αναμονή, ώστε ο μηχανισμός εφεδρείας να μεταβαίνει σε άλλη σύνδεση αντί να συνεχίζει με επιπλέον χρέωση ανά χρήση.", "blockClaudeExtraUsageLabel": "Αποκλεισμός επιπλέον χρήσης Claude", + "claudeLowPriorityModeLabel": "Συνέχεια με χαμηλότερη προτεραιότητα μετά το όριο των 5 ωρών", + "claudeLowPriorityModeDescription": "Όταν αυτός ο λογαριασμός φτάνει στο όριο χρήσης των 5 ωρών και η Anthropic προσφέρει τη λωρίδα χαμηλότερης προτεραιότητας, το OmniRoute την αποδέχεται και συνεχίζει να στέλνει αιτήματα με anthropic-usage-limit: slow μέχρι να επαναφερθεί το παράθυρο, αντί να θέσει τη σύνδεση σε παύση. Το εβδομαδιαίο όριο εξακολουθεί να ισχύει και οι απαντήσεις ενδέχεται να περιμένουν μέχρι να υπάρξει διαθέσιμη χωρητικότητα.", + "claudeAutoLimitResetLabel": "Αυτόματη επαναφορά του ορίου συνεδρίας (μία φορά την εβδομάδα)", + "claudeAutoLimitResetDescription": "Όταν αυτός ο λογαριασμός φτάνει στο όριο χρήσης των 5 ωρών και είναι διαθέσιμη επαναφορά του ορίου συνεδρίας, το OmniRoute την αξιοποιεί αυτόματα και επαναλαμβάνει τις προσπάθειες με πλήρη ταχύτητα. Χρησιμοποιεί την επαναφορά του λογαριασμού που είναι διαθέσιμη μία φορά την εβδομάδα και εξακολουθεί να μετράει στο εβδομαδιαίο όριο.", "disableCoolingDescription": "Παραλείπει την προσωρινή περίοδο αναμονής, ώστε αυτή η σύνδεση να παραμένει διαθέσιμη προς επιλογή ακόμα και μετά από σφάλματα από τα οποία μπορεί να ανακάμψει (οι τελικές καταστάσεις, όπως η απαγόρευση ή η λήξη, εξακολουθούν να ισχύουν).", "disableCoolingLabel": "Απενεργοποίηση περιόδου αναμονής για αυτή τη σύνδεση", "bulkPasteAdded": "{count, plural, one {Προστέθηκε 1 κλειδί} other {Προστέθηκαν # κλειδιά}}", diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index b42c6ee4104a..c5cd3b129cc7 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navegación principal", "unpinSection": "Desfijar sección", "pinSectionOpen": "Mantener abierta la sección", + "pinItem": "Fijar elemento", + "unpinItem": "Desfijar elemento", + "pinnedSection": "Fijado", "reloadPage": "Recargar página", "dragReorderSection": "Arrastra para reordenar la sección", "dragReorderItem": "Arrastra para reordenar", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Indicación de la cookie web de Grok", "blockClaudeExtraUsageDescription": "Cuando está activado, OmniRoute marca esta conexión de Claude como no disponible tan pronto como la API de uso informe de uso adicional en cola, para que el fallback cambie a otra conexión en lugar de continuar con la facturación adicional de pago por uso.", "blockClaudeExtraUsageLabel": "Bloquear el uso adicional de Claude", + "claudeLowPriorityModeLabel": "Continuar con prioridad baja tras el límite de 5 horas", + "claudeLowPriorityModeDescription": "Cuando esta cuenta alcanza su límite de uso de 5 horas y Anthropic ofrece el carril de prioridad baja, OmniRoute lo acepta y sigue enviando solicitudes con anthropic-usage-limit: slow hasta que se restablezca la ventana, en lugar de enfriar la conexión. El límite semanal sigue aplicándose y las respuestas pueden esperar a que haya capacidad disponible.", + "claudeAutoLimitResetLabel": "Restablecer automáticamente el límite de sesión (una vez por semana)", + "claudeAutoLimitResetDescription": "Cuando esta cuenta alcanza su límite de uso de 5 horas y hay disponible un restablecimiento del límite de sesión, OmniRoute lo reclama automáticamente y reintenta a máxima velocidad. Consume el restablecimiento único semanal de la cuenta y sigue contando para el límite semanal.", "disableCoolingDescription": "Omite el tiempo de espera transitorio para que esta conexión siga siendo apta incluso después de errores recuperables (los estados terminales, como bloqueado o caducado, siguen siendo aplicables).", "disableCoolingLabel": "Desactivar el tiempo de espera para esta conexión", "bulkPasteAdded": "{count, plural, one {1 clave añadida} other {# claves añadidas}}", diff --git a/src/i18n/messages/et.json b/src/i18n/messages/et.json index ffef4d6957e4..599ce0dd006e 100644 --- a/src/i18n/messages/et.json +++ b/src/i18n/messages/et.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Põhinavigatsioon", "unpinSection": "Eemalda jaotise kinnitus", "pinSectionOpen": "Kinnita jaotis avatuna", + "pinItem": "Kinnuta üksus", + "unpinItem": "Eemalda üksuselt kinnitus", + "pinnedSection": "Kinnitatud", "reloadPage": "Laadi leht uuesti", "dragReorderSection": "Lohista jaotise järjestuse muutmiseks", "dragReorderItem": "Lohista järjestuse muutmiseks", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web küpsise vihje", "blockClaudeExtraUsageDescription": "Kui see on lubatud, märgib OmniRoute selle Claude’i ühenduse kättesaamatuks kohe, kui kasutus-API teatab järjekorda lisatud lisakasutusest. Nii lülitutakse kasutuspõhise lisaarveldusega jätkamise asemel teisele ühendusele.", "blockClaudeExtraUsageLabel": "Blokeeri Claude’i lisakasutus", + "claudeLowPriorityModeLabel": "Jätka madalama prioriteediga pärast 5-tunnist limiiti", + "claudeLowPriorityModeDescription": "Kui see konto jõuab oma 5-tunnise kasutuslimiidini ja Anthropic pakub madalama prioriteediga riba, aktsepteerib OmniRoute seda ja saadab jätkuvalt päringuid päisega anthropic-usage-limit: slow kuni aken lähtestub, selle asemel et ühendust jahutada. Nädalane limiit kehtib endiselt ja vastused võivad oodata vaba mahtuvuse järele.", + "claudeAutoLimitResetLabel": "Lähtesta sessioonilimiit automaatselt (üks kord nädalas)", + "claudeAutoLimitResetDescription": "Kui see konto jõuab oma 5-tunnise kasutuslimiidini ja sessioonilimiidi lähtestamine on saadaval, kasutab OmniRoute selle automaatselt ära ning proovib täiskiirusel uuesti. Kasutab konto ühekordset nädalast lähtestamist ja see arvestatakse endiselt nädalasesse limiiti.", "disableCoolingDescription": "Jäta ajutine ooteaeg vahele, et see ühendus jääks kasutatavaks ka pärast taastatavaid vigu (lõppolekud, nagu blokeeritud või aegunud, kehtivad endiselt).", "disableCoolingLabel": "Keela selle ühenduse ooteaeg", "bulkPasteAdded": "{count, plural, one {Lisati 1 võti} other {Lisati # võtit}}", diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json index 96661041d3b4..3a0261a9ed48 100644 --- a/src/i18n/messages/fa.json +++ b/src/i18n/messages/fa.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ناوبری اصلی", "unpinSection": "برداشتن پین بخش", "pinSectionOpen": "پین کردن بخش در حالت باز", + "pinItem": "سنجاق کردن آیتم", + "unpinItem": "برداشتن سنجاق آیتم", + "pinnedSection": "سنجاق شده", "reloadPage": "بارگذاری مجدد صفحه", "dragReorderSection": "برای تغییر ترتیب بخش بکشید", "dragReorderItem": "برای تغییر ترتیب بکشید", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "راهنمای کوکی وب Grok", "blockClaudeExtraUsageDescription": "زمانی که فعال باشد، OmniRoute این اتصال Claude را به محض اینکه API استفاده، استفاده اضافی در صف را گزارش کند، غیرقابل دسترس علامت‌گذاری می‌کند، بنابراین پشتیبان به یک اتصال دیگر سوئیچ می‌کند به جای اینکه به ادامه‌ی صورتحساب اضافی پرداخت به ازای استفاده ادامه دهد.", "blockClaudeExtraUsageLabel": "استفاده اضافی از کلاود را مسدود کنید", + "claudeLowPriorityModeLabel": "ادامه با اولویت پایینتر پس از محدودیت ۵ ساعته", + "claudeLowPriorityModeDescription": "هنگامی که این حساب به محدودیت استفاده ۵ ساعته خود میرسد و Anthropic مسیر با اولویت پایینتر را پیشنهاد میدهد، OmniRoute آن را میپذیرد و به ارسال درخواستها با anthropic-usage-limit: slow ادامه میدهد تا زمانی که بازه زمانی بازنشانی شود، به جای اینکه اتصال را متوقف کند. محدودیت هفتگی همچنان اعمال میشود و پاسخها ممکن است منتظر ظرفیت مازاد بمانند.", + "claudeAutoLimitResetLabel": "بازنشانی خودکار محدودیت نشست (یک بار در هفته)", + "claudeAutoLimitResetDescription": "هنگامی که این حساب به محدودیت استفاده ۵ ساعته خود میرسد و بازنشانی محدودیت نشست در دسترس است، OmniRoute آن را به طور خودکار اعمال کرده و با سرعت کامل دوباره تلاش میکند. این کار از بازنشانی یک بار در هفته حساب استفاده میکند و همچنان جزو محدودیت هفتگی محسوب میشود.", "disableCoolingDescription": "نادیده گرفتن دوره خنک‌سازی گذرا تا این اتصال حتی پس از خطاهای قابل بازیابی واجد شرایط باقی بماند (حالت‌های نهایی مانند مسدود شده/منقضی شده همچنان اعمال می‌شوند).", "disableCoolingLabel": "غیرفعال کردن دوره خنک‌سازی برای این اتصال", "bulkPasteAdded": "{count, plural, one {۱ کلید اضافه شد} other {# کلید اضافه شد}}", diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index be5a2d51bb3a..fca56f979337 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Päänavigointi", "unpinSection": "Poista osion kiinnitys", "pinSectionOpen": "Kiinnitä osio auki", + "pinItem": "Kiinnitä kohde", + "unpinItem": "Irrota kohde", + "pinnedSection": "Kiinnitetty", "reloadPage": "Lataa sivu uudelleen", "dragReorderSection": "Vedä järjestääksesi osion uudelleen", "dragReorderItem": "Vedä järjestääksesi uudelleen", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web -evästeen vihje", "blockClaudeExtraUsageDescription": "Kun käytössä, OmniRoute merkitsee tämän Claude-yhteyden käyttökelvottomaksi heti, kun käyttö-API ilmoittaa jonossa olevasta ylimääräisestä käytöstä, joten varayhteys vaihtuu toiseen yhteyteen sen sijaan, että jatketaan maksamalla käytön mukaan ylimääräisestä laskutuksesta.", "blockClaudeExtraUsageLabel": "Estä ylimääräinen Clauden käyttö", + "claudeLowPriorityModeLabel": "Jatka matalammalla prioriteetilla 5 tunnin rajan jälkeen", + "claudeLowPriorityModeDescription": "Kun tämä tili saavuttaa 5 tunnin käyttörajan ja Anthropic tarjoaa matalamman prioriteetin kaistaa, OmniRoute hyväksyy sen ja jatkaa pyyntöjen lähettämistä anthropic-usage-limit: slow -tilassa, kunnes ikkuna nollautuu, sen sijaan että jäähdyttäisi yhteyden. Viikoittainen raja on edelleen voimassa ja vastaukset saattavat odottaa vapaata kapasiteettia.", + "claudeAutoLimitResetLabel": "Nollaa istuntoraja automaattisesti (kerran viikossa)", + "claudeAutoLimitResetDescription": "Kun tämä tili saavuttaa 5 tunnin käyttörajan ja istuntorajan nollaus on saatavilla, OmniRoute käyttää sen automaattisesti ja yrittää uudelleen täydellä nopeudella. Käyttää tilin kerran viikossa tapahtuvaa nollausta ja lasketaan edelleen viikoittaiseen rajaan.", "disableCoolingDescription": "Ohita tilapäinen jäädytysaika, jotta tämä yhteys pysyy käytettävissä myös palautettavien virheiden jälkeen (lopulliset tilat, kuten estetty/vanhentunut, ovat edelleen voimassa).", "disableCoolingLabel": "Poista jäädytysaika käytöstä tälle yhteydelle", "bulkPasteAdded": "{count, plural, one {1 avain lisätty} other {# avainta lisätty}}", diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 1cd48ab3a6cf..62ab22b1d215 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navigation principale", "unpinSection": "Désépingler la section", "pinSectionOpen": "Épingler la section ouverte", + "pinItem": "Épingler l’élément", + "unpinItem": "Désépingler l’élément", + "pinnedSection": "Épinglé", "reloadPage": "Recharger la page", "dragReorderSection": "Faire glisser pour réorganiser la section", "dragReorderItem": "Faire glisser pour réorganiser", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Indication pour le cookie de Grok Web", "blockClaudeExtraUsageDescription": "Lorsqu'elle est activée, OmniRoute marque cette connexion Claude comme indisponible dès que l'API d'utilisation signale une consommation supplémentaire en attente. Le mécanisme de secours bascule alors vers une autre connexion au lieu de poursuivre avec une facturation supplémentaire à l'usage.", "blockClaudeExtraUsageLabel": "Bloquer l'utilisation supplémentaire de Claude", + "claudeLowPriorityModeLabel": "Continuer à une priorité inférieure après la limite de 5 heures", + "claudeLowPriorityModeDescription": "Lorsque ce compte atteint sa limite d’utilisation de 5 heures et qu’Anthropic propose la file de priorité inférieure, OmniRoute l’accepte et continue d’envoyer des requêtes avec anthropic-usage-limit: slow jusqu’à la réinitialisation de la fenêtre, au lieu de mettre la connexion en pause. La limite hebdomadaire continue de s’appliquer et les réponses peuvent attendre qu’une capacité soit disponible.", + "claudeAutoLimitResetLabel": "Réinitialiser automatiquement la limite de session (une fois par semaine)", + "claudeAutoLimitResetDescription": "Lorsque ce compte atteint sa limite d’utilisation de 5 heures et qu’une réinitialisation de la limite de session est disponible, OmniRoute la réclame automatiquement et réessaie à pleine vitesse. Utilise la réinitialisation hebdomadaire du compte et continue de compter dans la limite hebdomadaire.", "disableCoolingDescription": "Ignorer le délai de récupération temporaire pour que cette connexion reste éligible même après des erreurs récupérables (les états terminaux comme banni/expiré s'appliquent toujours).", "disableCoolingLabel": "Désactiver le délai de récupération pour cette connexion", "bulkPasteAdded": "{count, plural, one {1 clé ajoutée} other {# clés ajoutées}}", diff --git a/src/i18n/messages/ga.json b/src/i18n/messages/ga.json index 4b502b7a1bde..908016a383af 100644 --- a/src/i18n/messages/ga.json +++ b/src/i18n/messages/ga.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Príomhnascleanúint", "unpinSection": "Díphionnáil an chuid", "pinSectionOpen": "Pionnáil an chuid agus coinnigh ar oscailt í", + "pinItem": "Pionnáil mír", + "unpinItem": "Díphionnáil mír", + "pinnedSection": "Pionnáilte", "reloadPage": "Athlódáil an leathanach", "dragReorderSection": "Tarraing chun ord an rannáin a athrú", "dragReorderItem": "Tarraing chun an t-ord a athrú", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Leid Fianán Gréasáin Grok", "blockClaudeExtraUsageDescription": "Nuair a chuirtear ar siúl é, marcálann OmniRoute an ceangal Claude seo mar neamh-infhaighte a luaithe a thuairiscíonn an API úsáide úsáid bhreise sa scuaine, ionas go n-aistríonn an mheicníocht chúltaca go ceangal eile seachas leanúint ar aghaidh le billeáil bhreise íoc-mar-a-úsáidtear.", "blockClaudeExtraUsageLabel": "Cuir bac ar úsáid bhreise Claude", + "claudeLowPriorityModeLabel": "Lean ar aghaidh ar thosaíocht níos ísle tar éis na teorann 5 uair an chloig", + "claudeLowPriorityModeDescription": "Nuair a shroicheann an cuntas seo a theorainn úsáide 5 uair an chloig agus a thairgeann Anthropic an lána tosaíochta níos ísle, glacann OmniRoute leis agus leanann sé d’iarratais a sheoladh le anthropic-usage-limit: slow go dtí go n-athshocraítear an fhuinneog, in ionad ligean don nasc fuarú. Tá feidhm fós ag an teorainn sheachtainiúil agus d’fhéadfadh freagraí fanacht go dtí go mbeidh acmhainn bhreise ar fáil.", + "claudeAutoLimitResetLabel": "Athshocraigh teorainn an tseisiúin go huathoibríoch (uair sa tseachtain)", + "claudeAutoLimitResetDescription": "Nuair a shroicheann an cuntas seo a theorainn úsáide 5 uair an chloig agus a bhíonn athshocrú theorainn an tseisiúin ar fáil, éilíonn OmniRoute é go huathoibríoch agus baineann sé triail eile as ar lánluas. Úsáideann sé athshocrú uair sa tseachtain an chuntais agus áirítear é fós sa teorainn sheachtainiúil.", "disableCoolingDescription": "Scipeáil an tréimhse fhuaraithe neamhbhuan ionas go bhfanann an ceangal seo incháilithe fiú tar éis earráidí in-aisghabhála (tá feidhm fós ag stáit chríochacha amhail toirmiscthe/éagtha).", "disableCoolingLabel": "Díchumasaigh an tréimhse fhuaraithe don cheangal seo", "bulkPasteAdded": "{count, plural, one {1 eochair curtha leis} other {# eochracha curtha leis}}", diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json index 161bf7ce3baa..d78b14be0c81 100644 --- a/src/i18n/messages/gu.json +++ b/src/i18n/messages/gu.json @@ -1293,6 +1293,9 @@ "mainNavigation": "મુખ્ય નેવિગેશન", "unpinSection": "વિભાગને અનપિન કરો", "pinSectionOpen": "વિભાગને પિન કરીને ખુલ્લો રાખો", + "pinItem": "આઇટમ પિન કરો", + "unpinItem": "આઇટમ અનપિન કરો", + "pinnedSection": "પિન કરેલું", "reloadPage": "પેજ રીલોડ કરો", "dragReorderSection": "વિભાગનો ક્રમ બદલવા માટે ખેંચો", "dragReorderItem": "ક્રમ બદલવા માટે ખેંચો", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web કૂકી સંકેત", "blockClaudeExtraUsageDescription": "જ્યારે સક્રિય કરવામાં આવે છે, OmniRoute આ Claude કનેક્શનને ઉપલબ્ધ નહીં તરીકે ચિહ્નિત કરે છે જેમણે જલદી ઉપયોગ API ક્યૂમાં વધારાના ઉપયોગની જાણ કરે છે, જેથી ફોલબેક બીજાં કનેક્શન પર સ્વિચ થાય છે તેના બદલે કે પે-એઝ-યુ-ગો વધારાના બિલિંગ પર ચાલુ રહે.", "blockClaudeExtraUsageLabel": "અતિરિક્ત ક્લોડ ઉપયોગ રોકો", + "claudeLowPriorityModeLabel": "5-કલાકની મર્યાદા પછી ઓછી પ્રાથમિકતા પર ચાલુ રાખો", + "claudeLowPriorityModeDescription": "જ્યારે આ એકાઉન્ટ તેની 5-કલાકની વપરાશ મર્યાદા સુધી પહોંચે અને Anthropic ઓછી પ્રાથમિકતાવાળી લેન ઑફર કરે, ત્યારે OmniRoute તેને સ્વીકારે છે અને કનેક્શનને કૂલ ડાઉન કરવાને બદલે વિન્ડો રીસેટ થાય ત્યાં સુધી anthropic-usage-limit: slow સાથે વિનંતીઓ મોકલવાનું ચાલુ રાખે છે. સાપ્તાહિક મર્યાદા હજી પણ લાગુ પડે છે અને પ્રતિસાદોને ખાલી ક્ષમતા ઉપલબ્ધ થવાની રાહ જોવી પડી શકે છે.", + "claudeAutoLimitResetLabel": "સત્ર મર્યાદાને ઑટોમૅટિક રીતે રીસેટ કરો (અઠવાડિયામાં એક વાર)", + "claudeAutoLimitResetDescription": "જ્યારે આ એકાઉન્ટ તેની 5-કલાકની વપરાશ મર્યાદા સુધી પહોંચે અને સત્ર-મર્યાદા રીસેટ ઉપલબ્ધ હોય, ત્યારે OmniRoute તેને ઑટોમૅટિક રીતે ક્લેઇમ કરે છે અને સંપૂર્ણ ઝડપે ફરી પ્રયાસ કરે છે. આ એકાઉન્ટના અઠવાડિયામાં એક વાર મળતા રીસેટનો ઉપયોગ કરે છે અને તેમ છતાં સાપ્તાહિક મર્યાદામાં ગણાય છે.", "disableCoolingDescription": "અસ્થાયી કૂલડાઉન છોડો જેથી પુનઃપ્રાપ્ત કરી શકાય તેવી ભૂલો પછી પણ આ કનેક્શન પાત્ર રહે (પ્રતિબંધિત/સમાપ્ત જેવી ટર્મિનલ સ્થિતિઓ હજુ પણ લાગુ પડે છે).", "disableCoolingLabel": "આ કનેક્શન માટે કૂલડાઉન અક્ષમ કરો", "bulkPasteAdded": "{count, plural, one {1 કી ઉમેરાઈ} other {# કીઓ ઉમેરાઈ}}", diff --git a/src/i18n/messages/ha.json b/src/i18n/messages/ha.json index 92324a91476b..4bf013b79371 100644 --- a/src/i18n/messages/ha.json +++ b/src/i18n/messages/ha.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Babban kewayawa", "unpinSection": "Cire fil ɗin sashe", "pinSectionOpen": "Tsare sashen a buɗe", + "pinItem": "Saka fil a abu", + "unpinItem": "Cire fil daga abu", + "pinnedSection": "An saka fil", "reloadPage": "Sake loda shafi", "dragReorderSection": "Ja don sake tsara sashe", "dragReorderItem": "Ja don sake tsarawa", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Bayani kan Cookie na Grok Web", "blockClaudeExtraUsageDescription": "Idan an kunna, OmniRoute zai sanya wannan haɗin Claude a matsayin wanda ba ya samuwa da zarar API na amfani ya bayar da rahoton ƙarin amfani da ke jiran aiwatarwa, domin tsarin madadin ya koma wani haɗi maimakon ci gaba da ƙarin cajin biya-gwadon-amfani.", "blockClaudeExtraUsageLabel": "Toshe ƙarin amfani da Claude", + "claudeLowPriorityModeLabel": "Ci gaba da ƙaramin fifiko bayan kai iyakar awa 5", + "claudeLowPriorityModeDescription": "Lokacin da wannan asusun ya kai iyakar amfaninsa ta awa 5 kuma Anthropic ya samar da layin mai ƙarancin fifiko, OmniRoute zai karɓe shi kuma ya ci gaba da aika buƙatu tare da anthropic-usage-limit: slow har sai lokacin ya sake farawa, maimakon rage aikin haɗin. Har yanzu iyakar mako-mako tana aiki, kuma martani na iya jira har sai an sami sarari.", + "claudeAutoLimitResetLabel": "Sake saita iyakar zaman ta atomatik (sau ɗaya a mako)", + "claudeAutoLimitResetDescription": "Lokacin da wannan asusun ya kai iyakar amfaninsa ta awa 5 kuma akwai damar sake saita iyakar zaman, OmniRoute zai karɓe ta atomatik sannan ya sake gwadawa da cikakken sauri. Wannan yana amfani da damar sake saita asusun ta sau ɗaya a mako, kuma har yanzu ana ƙirga amfanin cikin iyakar mako-mako.", "disableCoolingDescription": "Tsallake lokacin dakatawa na wucin gadi domin wannan haɗin ya ci gaba da cancanta ko bayan kurakuran da za a iya gyarawa (har yanzu yanayin ƙarshe kamar an hana/an ƙare suna aiki).", "disableCoolingLabel": "Kashe lokacin dakatawa na wannan haɗin", "bulkPasteAdded": "{count, plural, one {An ƙara maɓalli 1} other {An ƙara maɓallai #}}", diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index 54fa106d02f1..26a3c32f223a 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ניווט ראשי", "unpinSection": "ביטול הצמדה של המדור", "pinSectionOpen": "הצמדת המדור פתוח", + "pinItem": "הצמדת פריט", + "unpinItem": "ביטול הצמדת פריט", + "pinnedSection": "מוצמד", "reloadPage": "טעינה מחדש של הדף", "dragReorderSection": "גרירה לשינוי סדר המדור", "dragReorderItem": "גרירה לשינוי הסדר", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "רמז לקובץ Cookie של Grok Web", "blockClaudeExtraUsageDescription": "כאשר זה מופעל, OmniRoute מסמן את חיבור Claude הזה כלא זמין ברגע ש-API השימוש מדווח על שימוש נוסף בתור, כך שהגיבוי עובר לחיבור אחר במקום להמשיך בחיוב נוסף לפי שימוש.", "blockClaudeExtraUsageLabel": "חסום שימוש נוסף ב-Claude", + "claudeLowPriorityModeLabel": "המשך בעדיפות נמוכה יותר לאחר מגבלת 5 השעות", + "claudeLowPriorityModeDescription": "כאשר החשבון הזה מגיע למגבלת השימוש שלו ל-5 שעות ו-Anthropic מציעה את המסלול בעדיפות הנמוכה יותר, OmniRoute מקבל אותו וממשיך לשלוח בקשות עם anthropic-usage-limit: slow עד לאיפוס חלון הזמן, במקום לצנן את החיבור. המגבלה השבועית עדיין חלה, וייתכן שהתגובות ימתינו לקיבולת פנויה.", + "claudeAutoLimitResetLabel": "איפוס אוטומטי של מגבלת ההפעלה (פעם בשבוע)", + "claudeAutoLimitResetDescription": "כאשר החשבון הזה מגיע למגבלת השימוש שלו ל-5 שעות ואיפוס מגבלת ההפעלה זמין, OmniRoute מממש אותו אוטומטית ומנסה שוב במהירות מלאה. הפעולה מנצלת את האיפוס השבועי החד-פעמי של החשבון ועדיין נספרת במסגרת המגבלה השבועית.", "disableCoolingDescription": "דלג על תקופת הצינון הזמנית כדי שחיבור זה יישאר זמין גם לאחר שגיאות הניתנות לשחזור (מצבים סופיים כמו חסום/פג תוקף עדיין חלים).", "disableCoolingLabel": "השבת תקופת צינון עבור חיבור זה", "bulkPasteAdded": "{count, plural, one {נוסף מפתח אחד} other {נוספו # מפתחות}}", diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 4751f721c9b2..071271061bd5 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -1293,6 +1293,9 @@ "mainNavigation": "मुख्य नेविगेशन", "unpinSection": "सेक्शन अनपिन करें", "pinSectionOpen": "सेक्शन को खुला पिन करें", + "pinItem": "आइटम पिन करें", + "unpinItem": "आइटम अनपिन करें", + "pinnedSection": "पिन किया गया", "reloadPage": "पेज रीलोड करें", "dragReorderSection": "सेक्शन का क्रम बदलने के लिए ड्रैग करें", "dragReorderItem": "क्रम बदलने के लिए ड्रैग करें", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web कुकी संकेत", "blockClaudeExtraUsageDescription": "जब सक्षम किया जाता है, OmniRoute इस Claude कनेक्शन को अनुपलब्ध के रूप में चिह्नित करता है जैसे ही उपयोग API कतारबद्ध अतिरिक्त उपयोग की रिपोर्ट करता है, ताकि बैकअप किसी अन्य कनेक्शन पर स्विच कर सके बजाय इसके कि पे-एज़-यू-गो अतिरिक्त बिलिंग पर जारी रखा जाए।", "blockClaudeExtraUsageLabel": "अतिरिक्त Claude उपयोग को ब्लॉक करें", + "claudeLowPriorityModeLabel": "5 घंटे की सीमा के बाद कम प्राथमिकता पर जारी रखें", + "claudeLowPriorityModeDescription": "जब यह खाता अपनी 5 घंटे की उपयोग सीमा तक पहुँच जाता है और Anthropic कम-प्राथमिकता वाली लेन उपलब्ध कराता है, तो OmniRoute उसे स्वीकार कर लेता है और कनेक्शन को ठंडा करने के बजाय, विंडो रीसेट होने तक anthropic-usage-limit: slow के साथ अनुरोध भेजता रहता है। साप्ताहिक सीमा फिर भी लागू रहती है और प्रतिक्रियाओं को खाली क्षमता उपलब्ध होने तक प्रतीक्षा करनी पड़ सकती है।", + "claudeAutoLimitResetLabel": "सत्र सीमा को स्वतः रीसेट करें (सप्ताह में एक बार)", + "claudeAutoLimitResetDescription": "जब यह खाता अपनी 5 घंटे की उपयोग सीमा तक पहुँच जाता है और सत्र-सीमा रीसेट उपलब्ध होता है, तो OmniRoute उसे स्वचालित रूप से प्राप्त करके पूरी गति से फिर से प्रयास करता है। यह खाते के सप्ताह में एक बार मिलने वाले रीसेट का उपयोग करता है और फिर भी साप्ताहिक सीमा में गिना जाता है।", "disableCoolingDescription": "अस्थायी कूलडाउन को छोड़ें ताकि पुनर्प्राप्ति योग्य त्रुटियों के बाद भी यह कनेक्शन योग्य बना रहे (प्रतिबंधित/समाप्त जैसी अंतिम स्थितियां अभी भी लागू होती हैं)।", "disableCoolingLabel": "इस कनेक्शन के लिए कूलडाउन अक्षम करें", "bulkPasteAdded": "{count, plural, one {1 कुंजी जोड़ी गई} other {# कुंजियाँ जोड़ी गईं}}", diff --git a/src/i18n/messages/hr.json b/src/i18n/messages/hr.json index 898a38a14673..f100d0d32d40 100644 --- a/src/i18n/messages/hr.json +++ b/src/i18n/messages/hr.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Glavna navigacija", "unpinSection": "Otkvači odjeljak", "pinSectionOpen": "Prikvači odjeljak tako da ostane otvoren", + "pinItem": "Prikvači stavku", + "unpinItem": "Otkvači stavku", + "pinnedSection": "Prikvačeno", "reloadPage": "Ponovno učitaj stranicu", "dragReorderSection": "Povuci za promjenu redoslijeda odjeljka", "dragReorderItem": "Povuci za promjenu redoslijeda", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Savjet za kolačić Grok Web", "blockClaudeExtraUsageDescription": "Kada je omogućeno, OmniRoute označava ovu vezu s uslugom Claude kao nedostupnu čim API za praćenje korištenja prijavi dodatno korištenje u redu čekanja, pa se prebacuje na drugu vezu umjesto nastavka dodatne naplate prema potrošnji.", "blockClaudeExtraUsageLabel": "Blokiraj dodatno korištenje usluge Claude", + "claudeLowPriorityModeLabel": "Nastavi s nižim prioritetom nakon ograničenja od 5 sati", + "claudeLowPriorityModeDescription": "Kada ovaj račun dosegne svoje ograničenje upotrebe od 5 sati i Anthropic ponudi način rada s nižim prioritetom, OmniRoute ga prihvaća i nastavlja slati zahtjeve s anthropic-usage-limit: slow sve dok se vremenski okvir ne poništi, umjesto da privremeno obustavi vezu. Tjedno ograničenje i dalje se primjenjuje, a odgovori mogu čekati na slobodan kapacitet.", + "claudeAutoLimitResetLabel": "Automatski poništi ograničenje sesije (jednom tjedno)", + "claudeAutoLimitResetDescription": "Kada ovaj račun dosegne svoje ograničenje upotrebe od 5 sati i dostupno je poništavanje ograničenja sesije, OmniRoute ga automatski aktivira i ponovno pokušava punom brzinom. Time se iskorištava mogućnost poništavanja jednom tjedno za taj račun, a upotreba se i dalje ubraja u tjedno ograničenje.", "disableCoolingDescription": "Preskoči privremeno razdoblje mirovanja kako bi ova veza ostala dostupna čak i nakon pogrešaka od kojih se moguće oporaviti (terminalna stanja poput zabrane ili isteka i dalje se primjenjuju).", "disableCoolingLabel": "Onemogući razdoblje mirovanja za ovu vezu", "bulkPasteAdded": "{count, plural, one {dodan 1 ključ} few {dodana # ključa} other {dodano # ključeva}}", diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index a5d4c4f116ac..86cfa25e6cf8 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Fő navigáció", "unpinSection": "Szekció rögzítésének feloldása", "pinSectionOpen": "Szekció rögzítése nyitva", + "pinItem": "Elem rögzítése", + "unpinItem": "Elem rögzítésének feloldása", + "pinnedSection": "Rögzítve", "reloadPage": "Oldal újratöltése", "dragReorderSection": "Húzza a szekció átrendezéséhez", "dragReorderItem": "Húzza az átrendezéshez", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web-cookie súgója", "blockClaudeExtraUsageDescription": "Ha engedélyezve van, az OmniRoute azonnal nem elérhetővé jelöli ezt a Claude kapcsolatot, amint a használati API sorban álló extra használatot jelent, így a visszaállás egy másik kapcsolatra vált, ahelyett, hogy folytatná a fizess, ahogy használod extra számlázást.", "blockClaudeExtraUsageLabel": "Blokkolja az extra Claude használatát", + "claudeLowPriorityModeLabel": "Folytatás alacsonyabb prioritással az 5 órás korlát elérése után", + "claudeLowPriorityModeDescription": "Amikor ez a fiók eléri az 5 órás használati korlátját, és az Anthropic felajánlja az alacsonyabb prioritású sávot, az OmniRoute elfogadja azt, és az időablak alaphelyzetbe állásáig továbbra is anthropic-usage-limit: slow beállítással küldi a kéréseket a kapcsolat ideiglenes leállítása helyett. A heti korlát továbbra is érvényes, és előfordulhat, hogy a válaszoknak várniuk kell a szabad kapacitásra.", + "claudeAutoLimitResetLabel": "A munkamenet-korlát automatikus alaphelyzetbe állítása (hetente egyszer)", + "claudeAutoLimitResetDescription": "Amikor ez a fiók eléri az 5 órás használati korlátját, és elérhető a munkamenet-korlát alaphelyzetbe állítása, az OmniRoute automatikusan igénybe veszi azt, és teljes sebességgel újrapróbálkozik. Ez felhasználja a fiók hetente egyszer igénybe vehető alaphelyzetbe állítását, és továbbra is beleszámít a heti korlátba.", "disableCoolingDescription": "Az átmeneti várakozási idő kihagyása, hogy ez a kapcsolat helyreállítható hibák után is használható maradjon (a végleges állapotok, például a letiltás vagy lejárat továbbra is érvényesek).", "disableCoolingLabel": "Lehűlési idő (cooldown) letiltása ehhez a kapcsolathoz", "bulkPasteAdded": "{count, plural, one {1 kulcs hozzáadva} other {# kulcs hozzáadva}}", diff --git a/src/i18n/messages/hy.json b/src/i18n/messages/hy.json index 8b0fe9f2d420..d6b9a0c916fa 100644 --- a/src/i18n/messages/hy.json +++ b/src/i18n/messages/hy.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Հիմնական նավարկում", "unpinSection": "Ապամրացնել բաժինը", "pinSectionOpen": "Ամրացնել բաժինը բաց վիճակում", + "pinItem": "Ամրացնել տարրը", + "unpinItem": "Ապամրացնել տարրը", + "pinnedSection": "Ամրացված", "reloadPage": "Վերաբեռնել էջը", "dragReorderSection": "Քաշեք՝ բաժինը վերադասավորելու համար", "dragReorderItem": "Քաշեք՝ վերադասավորելու համար", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok վեբ քուքիի հուշում", "blockClaudeExtraUsageDescription": "Միացված լինելու դեպքում OmniRoute-ն այս Claude կապը նշում է որպես անհասանելի, հենց որ օգտագործման API-ն հաղորդում է հերթագրված լրացուցիչ օգտագործման մասին, որպեսզի պահուստային անցումը կատարվի մեկ այլ կապի՝ օգտագործման դիմաց լրացուցիչ վճարումը շարունակելու փոխարեն։", "blockClaudeExtraUsageLabel": "Արգելափակել Claude-ի լրացուցիչ օգտագործումը", + "claudeLowPriorityModeLabel": "Շարունակել ավելի ցածր առաջնահերթությամբ՝ 5-ժամյա սահմանաչափից հետո", + "claudeLowPriorityModeDescription": "Երբ այս հաշիվը հասնում է իր 5-ժամյա օգտագործման սահմանաչափին, և Anthropic-ն առաջարկում է ավելի ցածր առաջնահերթությամբ ուղին, OmniRoute-ն ընդունում է այն ու շարունակում հարցումներ ուղարկել anthropic-usage-limit: slow-ով՝ մինչև ժամանակային պատուհանի զրոյացումը՝ կապը ժամանակավորապես դադարեցնելու փոխարեն։ Շաբաթական սահմանաչափը շարունակում է գործել, իսկ պատասխանները կարող են սպասել ազատ հզորության։", + "claudeAutoLimitResetLabel": "Աշխատաշրջանի սահմանաչափն ավտոմատ զրոյացնել (շաբաթը մեկ անգամ)", + "claudeAutoLimitResetDescription": "Երբ այս հաշիվը հասնում է իր 5-ժամյա օգտագործման սահմանաչափին, և հասանելի է աշխատաշրջանի սահմանաչափի զրոյացում, OmniRoute-ն ավտոմատ ակտիվացնում է այն և ամբողջ արագությամբ կրկնում հարցումները։ Օգտագործում է հաշվի՝ շաբաթը մեկ անգամ հասանելի զրոյացումը և շարունակում է հաշվառվել շաբաթական սահմանաչափում։", "disableCoolingDescription": "Բաց թողնել ժամանակավոր սպասման ժամանակահատվածը, որպեսզի այս կապը հասանելի մնա նույնիսկ վերականգնելի սխալներից հետո (վերջնական վիճակները, օրինակ՝ արգելափակված/ժամկետանց, շարունակում են կիրառվել)։", "disableCoolingLabel": "Անջատել այս կապի սպասման ժամանակահատվածը", "bulkPasteAdded": "{count, plural, one {Ավելացվել է 1 բանալի} other {Ավելացվել է # բանալի}}", diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index 90d2a6090210..18ce482e3d52 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -5798,6 +5798,10 @@ "grokWebCookieHint": "Petunjuk Cookie Grok Web", "blockClaudeExtraUsageDescription": "Saat diaktifkan, OmniRoute menandai koneksi Claude ini tidak tersedia segera setelah API penggunaan melaporkan penggunaan ekstra yang antre, sehingga fallback beralih ke koneksi lain alih-alih melanjutkan dengan penagihan ekstra bayar sesuai penggunaan.", "blockClaudeExtraUsageLabel": "Blokir penggunaan Claude yang berlebihan", + "claudeLowPriorityModeLabel": "Lanjutkan dengan prioritas lebih rendah setelah batas 5 jam", + "claudeLowPriorityModeDescription": "Saat akun ini mencapai batas penggunaan 5 jam dan Anthropic menawarkan jalur berprioritas lebih rendah, OmniRoute menerimanya dan terus mengirim permintaan dengan anthropic-usage-limit: slow hingga jendela diatur ulang, alih-alih mendinginkan koneksi. Batas mingguan tetap berlaku dan respons mungkin menunggu kapasitas yang tersedia.", + "claudeAutoLimitResetLabel": "Atur ulang batas sesi secara otomatis (seminggu sekali)", + "claudeAutoLimitResetDescription": "Saat akun ini mencapai batas penggunaan 5 jam dan pengaturan ulang batas sesi tersedia, OmniRoute mengklaimnya secara otomatis dan mencoba kembali dengan kecepatan penuh. Tindakan ini menggunakan pengaturan ulang akun yang tersedia seminggu sekali dan tetap dihitung terhadap batas mingguan.", "disableCoolingDescription": "Lewati cooldown transien agar koneksi ini tetap memenuhi syarat bahkan setelah kesalahan yang dapat dipulihkan (status terminal seperti diblokir/kedaluwarsa tetap berlaku).", "disableCoolingLabel": "Nonaktifkan cooldown untuk koneksi ini", "bulkPasteAdded": "{count, plural, one {1 kunci ditambahkan} other {# kunci ditambahkan}}", diff --git a/src/i18n/messages/ig.json b/src/i18n/messages/ig.json index 23b85cde89e4..1fad3db208ae 100644 --- a/src/i18n/messages/ig.json +++ b/src/i18n/messages/ig.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Nsorogharị isi", "unpinSection": "Wepụ ntụgide na ngalaba", "pinSectionOpen": "Tụgide ngalaba ka ọ ghe oghe", + "pinItem": "Tụgide ihe", + "unpinItem": "Wepụ ihe a tụgidere", + "pinnedSection": "A tụgidere", "reloadPage": "Bugharịa Ihuakwụkwọ", "dragReorderSection": "Dọrọ iji hazigharịa ngalaba", "dragReorderItem": "Dọrọ iji hazigharịa", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Ntụnye Kuki Weebụ Grok", "blockClaudeExtraUsageDescription": "Mgbe agbanyere ya, OmniRoute na-akara njikọ Claude a dị ka nke na-adịghịzi maka ojiji ozugbo API ojiji kọọrọ na e tinyela ojiji mgbakwunye n'ahịrị nchere, ka usoro ndabere wee gbanwee gaa na njikọ ọzọ kama ịga n'ihu na ụgwọ mgbakwunye a na-akwụ dịka ojiji siri dị.", "blockClaudeExtraUsageLabel": "Gbochie ojiji Claude mgbakwunye", + "claudeLowPriorityModeLabel": "Gaa n’ihu na mkpa dị ala mgbe oke awa 5 gachara", + "claudeLowPriorityModeDescription": "Mgbe akaụntụ a ruru oke ojiji ya nke awa 5 ma Anthropic nye ụzọ nwere mkpa dị ala, OmniRoute na-anabata ya ma na-aga n’ihu izipu arịrịọ na anthropic-usage-limit: slow ruo mgbe windo ahụ tọgharịrị, kama ime ka njikọ ahụ zuru ike. Oke izu ka na-emetụta ya, nzaghachi nwekwara ike ichere ruo mgbe ohere fọdụrụ dị.", + "claudeAutoLimitResetLabel": "Tọgharịa oke nnọkọ na-akpaghị aka (otu ugboro n’izu)", + "claudeAutoLimitResetDescription": "Mgbe akaụntụ a ruru oke ojiji ya nke awa 5 ma ntọgharị oke nnọkọ dị, OmniRoute na-eji ya na-akpaghị aka ma nwaa ọzọ n’ọsọ zuru oke. Ọ na-eji ntọgharị akaụntụ ahụ nke otu ugboro n’izu, ojiji ahụ ka na-agụkwa n’ime oke izu.", "disableCoolingDescription": "Mafee oge nkwụsị nwa oge ka njikọ a nọgide bụrụ nke a pụrụ iji ọbụna mgbe njehie ndị a pụrụ idozi mere (ọnọdụ njedebe dịka amachibidoro/agwụla ka na-emetụta ya).", "disableCoolingLabel": "Gbanyụọ oge nkwụsị maka njikọ a", "bulkPasteAdded": "{count, plural, one {Agbakwunyere igodo 1} other {Agbakwunyere igodo #}}", diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index 324ff861374c..77ab749f38b1 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navigazione principale", "unpinSection": "Sblocca sezione", "pinSectionOpen": "Fissa sezione aperta", + "pinItem": "Fissa elemento", + "unpinItem": "Rimuovi elemento fissato", + "pinnedSection": "Fissato", "reloadPage": "Ricarica pagina", "dragReorderSection": "Trascina per riordinare la sezione", "dragReorderItem": "Trascina per riordinare", diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index d7fca9b640fe..0e940b78eb75 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -1293,6 +1293,9 @@ "mainNavigation": "メインナビゲーション", "unpinSection": "セクションのピン留めを外す", "pinSectionOpen": "セクションをピン留めして開く", + "pinItem": "項目をピン留め", + "unpinItem": "項目のピン留めを解除", + "pinnedSection": "ピン留め済み", "reloadPage": "ページを再読み込み", "dragReorderSection": "ドラッグしてセクションを並べ替え", "dragReorderItem": "ドラッグして並べ替え", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok WebのCookieに関するヒント", "blockClaudeExtraUsageDescription": "有効にすると、OmniRouteは使用APIがキューに追加された追加使用を報告した時点でこのClaude接続を利用できないとマークし、フォールバックは従量課金の追加請求を続けるのではなく、別の接続に切り替わります。", "blockClaudeExtraUsageLabel": "追加のClaude使用をブロックする", + "claudeLowPriorityModeLabel": "5時間の上限到達後、低優先度で続行", + "claudeLowPriorityModeDescription": "このアカウントが5時間の使用上限に達し、Anthropicから低優先度レーンが提供された場合、OmniRouteはそれを受け入れ、接続をクールダウンする代わりに、ウィンドウがリセットされるまで anthropic-usage-limit: slow を指定してリクエストの送信を続けます。週間上限は引き続き適用され、空き容量が生じるまで応答が待機する場合があります。", + "claudeAutoLimitResetLabel": "セッション上限を自動リセット(週1回)", + "claudeAutoLimitResetDescription": "このアカウントが5時間の使用上限に達し、セッション上限のリセットが利用可能な場合、OmniRouteは自動的にそれを適用し、通常速度で再試行します。アカウントの週1回のリセットを使用し、使用量は引き続き週間上限にカウントされます。", "disableCoolingDescription": "一時的なクールダウンをスキップし、回復可能なエラーの後でもこの接続を対象として維持します (banned/expired などの終端状態は引き続き適用されます)。", "disableCoolingLabel": "この接続のクールダウンを無効化", "bulkPasteAdded": "{count, plural, one {1件のキーを追加しました} other {#件のキーを追加しました}}", diff --git a/src/i18n/messages/ka.json b/src/i18n/messages/ka.json index f7cfbcd03082..f8f9478c2a88 100644 --- a/src/i18n/messages/ka.json +++ b/src/i18n/messages/ka.json @@ -1293,6 +1293,9 @@ "mainNavigation": "მთავარი ნავიგაცია", "unpinSection": "სექციის მოხსნა", "pinSectionOpen": "სექციის ღიად დამაგრება", + "pinItem": "ელემენტის ჩამაგრება", + "unpinItem": "ელემენტის ჩამოხსნა", + "pinnedSection": "ჩამაგრებულია", "reloadPage": "გვერდის ხელახლა ჩატვირთვა", "dragReorderSection": "გადაათრიეთ სექციის რიგითობის შესაცვლელად", "dragReorderItem": "გადაათრიეთ რიგითობის შესაცვლელად", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok ვებ-ქუქი-ფაილის მინიშნება", "blockClaudeExtraUsageDescription": "ჩართვისას, როგორც კი გამოყენების API რიგში ჩაყენებულ დამატებით გამოყენებას დააფიქსირებს, OmniRoute ამ Claude კავშირს მიუწვდომლად მონიშნავს, რათა სარეზერვო გადართვა სხვა კავშირზე მოხდეს და გამოყენების მიხედვით დამატებითი თანხის დარიცხვა აღარ გაგრძელდეს.", "blockClaudeExtraUsageLabel": "Claude-ის დამატებითი გამოყენების დაბლოკვა", + "claudeLowPriorityModeLabel": "5-საათიანი ლიმიტის ამოწურვის შემდეგ უფრო დაბალი პრიორიტეტით გაგრძელება", + "claudeLowPriorityModeDescription": "როდესაც ეს ანგარიში 5-საათიანი გამოყენების ლიმიტს მიაღწევს და Anthropic უფრო დაბალი პრიორიტეტის რეჟიმს შესთავაზებს, OmniRoute მას მიიღებს და ფანჯრის განახლებამდე მოთხოვნების გაგზავნას anthropic-usage-limit: slow პარამეტრით გააგრძელებს, ნაცვლად კავშირის დროებით შეჩერებისა. ყოველკვირეული ლიმიტი კვლავ მოქმედებს და პასუხებს შესაძლოა თავისუფალი სიმძლავრის გამოჩენამდე მოცდა დასჭირდეს.", + "claudeAutoLimitResetLabel": "სესიის ლიმიტის ავტომატურად განულება (კვირაში ერთხელ)", + "claudeAutoLimitResetDescription": "როდესაც ეს ანგარიში 5-საათიანი გამოყენების ლიმიტს მიაღწევს და სესიის ლიმიტის განულება ხელმისაწვდომი იქნება, OmniRoute მას ავტომატურად გამოიყენებს და მოთხოვნას სრული სიჩქარით ხელახლა გაგზავნის. ეს გამოიყენებს ანგარიშისთვის კვირაში ერთხელ ხელმისაწვდომ განულებას და გამოყენება კვლავ ჩაითვლება ყოველკვირეულ ლიმიტში.", "disableCoolingDescription": "გამოტოვეთ დროებითი დაყოვნების პერიოდი, რათა ეს კავშირი აღდგენადი შეცდომების შემდეგაც ხელმისაწვდომი დარჩეს (ტერმინალური მდგომარეობები, როგორიცაა დაბლოკილი/ვადაგასული, კვლავ მოქმედებს).", "disableCoolingLabel": "ამ კავშირისთვის დაყოვნების პერიოდის გამორთვა", "bulkPasteAdded": "{count, plural, one {დამატებულია 1 გასაღები} other {დამატებულია # გასაღები}}", diff --git a/src/i18n/messages/km.json b/src/i18n/messages/km.json index 1496aaec82cd..855f7c40b523 100644 --- a/src/i18n/messages/km.json +++ b/src/i18n/messages/km.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ការរុករកចម្បង", "unpinSection": "ដកការខ្ទាស់ផ្នែក", "pinSectionOpen": "ខ្ទាស់ផ្នែកឱ្យនៅបើក", + "pinItem": "ខ្ទាស់ធាតុ", + "unpinItem": "ដោះខ្ទាស់ធាតុ", + "pinnedSection": "បានខ្ទាស់", "reloadPage": "ផ្ទុកទំព័រឡើងវិញ", "dragReorderSection": "អូសដើម្បីតម្រៀបផ្នែកឡើងវិញ", "dragReorderItem": "អូសដើម្បីតម្រៀបឡើងវិញ", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "ការណែនាំអំពី Cookie របស់ Grok Web", "blockClaudeExtraUsageDescription": "នៅពេលបើកដំណើរការ OmniRoute នឹងសម្គាល់ការតភ្ជាប់ Claude នេះថាមិនអាចប្រើបានភ្លាមៗ នៅពេល usage API រាយការណ៍ថាមានការប្រើប្រាស់បន្ថែមក្នុងជួររង់ចាំ ដូច្នេះ fallback នឹងប្តូរទៅការតភ្ជាប់ផ្សេង ជំនួសឱ្យការបន្តគិតថ្លៃបន្ថែមតាមការប្រើប្រាស់។", "blockClaudeExtraUsageLabel": "ទប់ស្កាត់ការប្រើប្រាស់ Claude បន្ថែម", + "claudeLowPriorityModeLabel": "បន្តដោយអាទិភាពទាបជាង បន្ទាប់ពីដល់ដែនកំណត់ 5 ម៉ោង", + "claudeLowPriorityModeDescription": "នៅពេលគណនីនេះដល់ដែនកំណត់ការប្រើប្រាស់ 5 ម៉ោង ហើយ Anthropic ផ្តល់ជម្រើសអាទិភាពទាបជាង OmniRoute នឹងទទួលយកជម្រើសនោះ ហើយបន្តផ្ញើសំណើជាមួយ anthropic-usage-limit: slow រហូតដល់រយៈពេលកំណត់ត្រូវបានកំណត់ឡើងវិញ ជំនួសឱ្យការផ្អាកការតភ្ជាប់។ ដែនកំណត់ប្រចាំសប្តាហ៍នៅតែអនុវត្ត ហើយការឆ្លើយតបអាចត្រូវរង់ចាំសមត្ថភាពដែលនៅសល់។", + "claudeAutoLimitResetLabel": "កំណត់ដែនកំណត់សម័យឡើងវិញដោយស្វ័យប្រវត្តិ (ម្តងក្នុងមួយសប្តាហ៍)", + "claudeAutoLimitResetDescription": "នៅពេលគណនីនេះដល់ដែនកំណត់ការប្រើប្រាស់ 5 ម៉ោង ហើយអាចកំណត់ដែនកំណត់សម័យឡើងវិញបាន OmniRoute នឹងប្រើសិទ្ធិកំណត់ឡើងវិញនោះដោយស្វ័យប្រវត្តិ ហើយព្យាយាមម្តងទៀតក្នុងល្បឿនពេញ។ វាប្រើសិទ្ធិកំណត់ឡើងវិញម្តងក្នុងមួយសប្តាហ៍របស់គណនី ហើយនៅតែរាប់បញ្ចូលក្នុងដែនកំណត់ប្រចាំសប្តាហ៍។", "disableCoolingDescription": "រំលងរយៈពេលរង់ចាំបណ្តោះអាសន្ន ដើម្បីឱ្យការតភ្ជាប់នេះនៅតែអាចប្រើបាន សូម្បីតែបន្ទាប់ពីមានកំហុសដែលអាចស្ដារឡើងវិញបានក៏ដោយ (ស្ថានភាពបញ្ចប់ដូចជា ត្រូវបានហាមឃាត់/ផុតកំណត់ នៅតែអនុវត្ត)។", "disableCoolingLabel": "បិទរយៈពេលរង់ចាំសម្រាប់ការតភ្ជាប់នេះ", "bulkPasteAdded": "{count, plural, one {បានបន្ថែមសោ 1} other {បានបន្ថែមសោ #}}", diff --git a/src/i18n/messages/kn.json b/src/i18n/messages/kn.json index 205492b0bec6..fc52b49b9353 100644 --- a/src/i18n/messages/kn.json +++ b/src/i18n/messages/kn.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ಮುಖ್ಯ ನ್ಯಾವಿಗೇಶನ್", "unpinSection": "ಸೆಕ್ಷನ್ ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಿ", "pinSectionOpen": "ಸೆಕ್ಷನ್ ಅನ್ನು ತೆರೆದ ಸ್ಥಿತಿಯಲ್ಲಿ ಪಿನ್ ಮಾಡಿ", + "pinItem": "ಐಟಂ ಅನ್ನು ಪಿನ್ ಮಾಡಿ", + "unpinItem": "ಐಟಂನ ಪಿನ್ ತೆಗೆದುಹಾಕಿ", + "pinnedSection": "ಪಿನ್ ಮಾಡಲಾಗಿದೆ", "reloadPage": "ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ", "dragReorderSection": "ವಿಭಾಗವನ್ನು ಮರುಕ್ರಮಿಸಲು ಎಳೆಯಿರಿ", "dragReorderItem": "ಮರುಕ್ರಮಿಸಲು ಎಳೆಯಿರಿ", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web ಕುಕೀ ಸುಳಿವು", "blockClaudeExtraUsageDescription": "ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, ಬಳಕೆ API ಸರತಿಗೊಳಿಸಿದ ಹೆಚ್ಚುವರಿ ಬಳಕೆಯನ್ನು ವರದಿ ಮಾಡಿದ ತಕ್ಷಣ OmniRoute ಈ Claude ಸಂಪರ್ಕವನ್ನು ಲಭ್ಯವಿಲ್ಲ ಎಂದು ಗುರುತಿಸುತ್ತದೆ. ಇದರಿಂದ ಬಳಕೆಯಷ್ಟಕ್ಕೆ ಪಾವತಿಸುವ ಹೆಚ್ಚುವರಿ ಬಿಲ್ಲಿಂಗ್ನಲ್ಲಿ ಮುಂದುವರಿಯುವ ಬದಲು ಫಾಲ್ಬ್ಯಾಕ್ ಮತ್ತೊಂದು ಸಂಪರ್ಕಕ್ಕೆ ಬದಲಾಗುತ್ತದೆ.", "blockClaudeExtraUsageLabel": "Claude ನ ಹೆಚ್ಚುವರಿ ಬಳಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಿ", + "claudeLowPriorityModeLabel": "5-ಗಂಟೆಗಳ ಮಿತಿಯ ನಂತರ ಕಡಿಮೆ ಆದ್ಯತೆಯಲ್ಲಿ ಮುಂದುವರಿಸಿ", + "claudeLowPriorityModeDescription": "ಈ ಖಾತೆಯು ತನ್ನ 5-ಗಂಟೆಗಳ ಬಳಕೆ ಮಿತಿಯನ್ನು ತಲುಪಿದಾಗ ಮತ್ತು Anthropic ಕಡಿಮೆ-ಆದ್ಯತೆಯ ಲೇನ್ ಅನ್ನು ಒದಗಿಸಿದಾಗ, OmniRoute ಅದನ್ನು ಸ್ವೀಕರಿಸಿ ವಿಂಡೋ ಮರುಹೊಂದುವವರೆಗೆ anthropic-usage-limit: slow ಜೊತೆಗೆ ವಿನಂತಿಗಳನ್ನು ಕಳುಹಿಸುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತದೆ; ಸಂಪರ್ಕವನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿಲ್ಲಿಸುವುದಿಲ್ಲ. ವಾರದ ಮಿತಿ ಇನ್ನೂ ಅನ್ವಯಿಸುತ್ತದೆ ಮತ್ತು ಬಿಡುವಿನ ಸಾಮರ್ಥ್ಯ ಲಭ್ಯವಾಗುವವರೆಗೆ ಪ್ರತಿಕ್ರಿಯೆಗಳು ಕಾಯಬೇಕಾಗಬಹುದು.", + "claudeAutoLimitResetLabel": "ಸೆಷನ್ ಮಿತಿಯನ್ನು ಸ್ವಯಂ-ಮರುಹೊಂದಿಸಿ (ವಾರಕ್ಕೊಮ್ಮೆ)", + "claudeAutoLimitResetDescription": "ಈ ಖಾತೆಯು ತನ್ನ 5-ಗಂಟೆಗಳ ಬಳಕೆ ಮಿತಿಯನ್ನು ತಲುಪಿದಾಗ ಮತ್ತು ಸೆಷನ್-ಮಿತಿ ಮರುಹೊಂದಿಸುವಿಕೆ ಲಭ್ಯವಿದ್ದಾಗ, OmniRoute ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಪಡೆದುಕೊಂಡು ಪೂರ್ಣ ವೇಗದಲ್ಲಿ ಮರುಪ್ರಯತ್ನಿಸುತ್ತದೆ. ಇದು ಖಾತೆಯ ವಾರಕ್ಕೊಮ್ಮೆ ಲಭ್ಯವಿರುವ ಮರುಹೊಂದಿಸುವಿಕೆಯನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ಇನ್ನೂ ವಾರದ ಮಿತಿಯ ಲೆಕ್ಕಕ್ಕೆ ಸೇರುತ್ತದೆ.", "disableCoolingDescription": "ತಾತ್ಕಾಲಿಕ ಕೂಲ್ಡೌನ್ ಅನ್ನು ಬಿಟ್ಟುಬಿಡಿ, ಇದರಿಂದ ಮರುಪಡೆಯಬಹುದಾದ ದೋಷಗಳ ನಂತರವೂ ಈ ಸಂಪರ್ಕವು ಅರ್ಹವಾಗಿರುತ್ತದೆ (ನಿಷೇಧಿತ/ಅವಧಿ ಮುಗಿದಂತಹ ಅಂತಿಮ ಸ್ಥಿತಿಗಳು ಇನ್ನೂ ಅನ್ವಯಿಸುತ್ತವೆ).", "disableCoolingLabel": "ಈ ಸಂಪರ್ಕಕ್ಕಾಗಿ ಕೂಲ್ಡೌನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ", "bulkPasteAdded": "{count, plural, one {1 ಕೀ ಸೇರಿಸಲಾಗಿದೆ} other {# ಕೀಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ}}", diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 7bab3beb2f22..7728f5d1fc41 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -1293,6 +1293,9 @@ "mainNavigation": "메인 내비게이션", "unpinSection": "섹션 고정 해제", "pinSectionOpen": "섹션 열린 상태로 고정", + "pinItem": "항목 고정", + "unpinItem": "항목 고정 해제", + "pinnedSection": "고정됨", "reloadPage": "페이지 새로고침", "dragReorderSection": "드래그하여 섹션 순서 변경", "dragReorderItem": "드래그하여 순서 변경", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web 쿠키 안내", "blockClaudeExtraUsageDescription": "활성화하면 사용량 API가 대기 중인 추가 사용량을 보고하는 즉시 OmniRoute가 이 Claude 연결을 사용 불가로 표시하여, 종량제 추가 과금을 계속하는 대신 폴백이 다른 연결로 전환됩니다.", "blockClaudeExtraUsageLabel": "Claude 추가 사용 차단", + "claudeLowPriorityModeLabel": "5시간 제한 이후 낮은 우선순위로 계속", + "claudeLowPriorityModeDescription": "이 계정이 5시간 사용 한도에 도달하고 Anthropic에서 낮은 우선순위 처리 경로를 제공하면, OmniRoute는 이를 수락하고 연결을 일시 중지하는 대신 사용량 기간이 초기화될 때까지 anthropic-usage-limit: slow을 사용하여 요청을 계속 전송합니다. 주간 한도는 계속 적용되며, 여유 처리 용량이 생길 때까지 응답이 대기할 수 있습니다.", + "claudeAutoLimitResetLabel": "세션 한도 자동 초기화(주 1회)", + "claudeAutoLimitResetDescription": "이 계정이 5시간 사용 한도에 도달하고 세션 한도 초기화를 사용할 수 있으면, OmniRoute가 이를 자동으로 적용하고 최대 속도로 다시 시도합니다. 계정의 주 1회 초기화 기회를 사용하며, 사용량은 계속 주간 한도에 포함됩니다.", "disableCoolingDescription": "일시적인 쿨다운을 건너뛰어 복구 가능한 오류가 발생한 후에도 이 연결이 사용 가능한 상태로 유지되도록 합니다(차단됨/만료됨과 같은 최종 상태는 여전히 적용됨).", "disableCoolingLabel": "이 연결에 대한 쿨다운 비활성화", "bulkPasteAdded": "{count, plural, one {키 1개 추가됨} other {키 #개 추가됨}}", diff --git a/src/i18n/messages/lt.json b/src/i18n/messages/lt.json index 11352f7bb1c2..e3cb6a352b34 100644 --- a/src/i18n/messages/lt.json +++ b/src/i18n/messages/lt.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Pagrindinė navigacija", "unpinSection": "Atsegti skyrių", "pinSectionOpen": "Prisegti skyrių, kad jis liktų atvertas", + "pinItem": "Prisegti elementą", + "unpinItem": "Atsegti elementą", + "pinnedSection": "Prisegta", "reloadPage": "Iš naujo įkelti puslapį", "dragReorderSection": "Vilkite, kad pakeistumėte skyriaus vietą", "dragReorderItem": "Vilkite, kad pakeistumėte vietą", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web slapuko užuomina", "blockClaudeExtraUsageDescription": "Įjungus šią parinktį, OmniRoute pažymi šį Claude ryšį kaip nepasiekiamą iškart, kai naudojimo API praneša apie suplanuotą papildomą naudojimą. Taip atsarginio perjungimo metu pasirenkamas kitas ryšys, užuot toliau taikius papildomą mokėjimą pagal faktinį naudojimą.", "blockClaudeExtraUsageLabel": "Blokuoti papildomą Claude naudojimą", + "claudeLowPriorityModeLabel": "Pasiekus 5 valandų limitą, tęsti mažesniu prioritetu", + "claudeLowPriorityModeDescription": "Kai ši paskyra pasiekia 5 valandų naudojimo limitą ir Anthropic pasiūlo mažesnio prioriteto režimą, OmniRoute jį priima ir toliau siunčia užklausas su anthropic-usage-limit: slow, kol laiko intervalas nustatomas iš naujo, užuot laikinai pristabdęs ryšį. Savaitinis limitas vis tiek taikomas, o atsakymams gali tekti palaukti, kol atsiras laisvų pajėgumų.", + "claudeAutoLimitResetLabel": "Automatiškai iš naujo nustatyti seanso limitą (kartą per savaitę)", + "claudeAutoLimitResetDescription": "Kai ši paskyra pasiekia 5 valandų naudojimo limitą ir galima iš naujo nustatyti seanso limitą, OmniRoute automatiškai tuo pasinaudoja ir pakartoja užklausą visu greičiu. Panaudojama paskyrai kartą per savaitę suteikiama limito nustatymo iš naujo galimybė, o naudojimas vis tiek įskaičiuojamas į savaitinį limitą.", "disableCoolingDescription": "Praleisti laikiną atvėsimo laikotarpį, kad šį ryšį būtų galima naudoti net ir po klaidų, po kurių galima atkurti veikimą (galutinės būsenos, pvz., užblokavimas ar galiojimo pabaiga, vis tiek taikomos).", "disableCoolingLabel": "Išjungti šio ryšio atvėsimo laikotarpį", "bulkPasteAdded": "{count, plural, one {Pridėtas 1 raktas} other {Pridėta # raktų}}", diff --git a/src/i18n/messages/lv.json b/src/i18n/messages/lv.json index 38312cc206e6..33a5bf6e1665 100644 --- a/src/i18n/messages/lv.json +++ b/src/i18n/messages/lv.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Galvenā navigācija", "unpinSection": "Atspraust sadaļu", "pinSectionOpen": "Piespraust sadaļu atvērtu", + "pinItem": "Piespraust vienumu", + "unpinItem": "Atspraust vienumu", + "pinnedSection": "Piesprausts", "reloadPage": "Pārlādēt lapu", "dragReorderSection": "Velciet, lai mainītu sadaļas secību", "dragReorderItem": "Velciet, lai mainītu secību", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web sīkfaila norāde", "blockClaudeExtraUsageDescription": "Kad šī opcija ir iespējota, OmniRoute atzīmē šo Claude savienojumu kā nepieejamu, tiklīdz lietojuma API ziņo par rindā ievietotu papildu lietojumu, tāpēc atkāpšanās mehānisms pārslēdzas uz citu savienojumu, nevis turpina izmantot papildu lietojumu ar maksu pēc faktiskā patēriņa.", "blockClaudeExtraUsageLabel": "Bloķēt Claude papildu lietojumu", + "claudeLowPriorityModeLabel": "Turpināt ar zemāku prioritāti pēc 5 stundu ierobežojuma sasniegšanas", + "claudeLowPriorityModeDescription": "Kad šis konts sasniedz 5 stundu lietojuma ierobežojumu un Anthropic piedāvā zemākas prioritātes režīmu, OmniRoute to pieņem un turpina sūtīt pieprasījumus ar anthropic-usage-limit: slow, līdz laika periods tiek atiestatīts, nevis īslaicīgi aptur savienojumu. Nedēļas ierobežojums joprojām ir spēkā, un atbildes var gaidīt, līdz būs pieejama brīva jauda.", + "claudeAutoLimitResetLabel": "Automātiski atiestatīt sesijas ierobežojumu (reizi nedēļā)", + "claudeAutoLimitResetDescription": "Kad šis konts sasniedz 5 stundu lietojuma ierobežojumu un ir pieejama sesijas ierobežojuma atiestatīšana, OmniRoute to automātiski izmanto un atkārto pieprasījumu pilnā ātrumā. Tiek izmantota kontam pieejamā atiestatīšana reizi nedēļā, un lietojums joprojām tiek ieskaitīts nedēļas ierobežojumā.", "disableCoolingDescription": "Izlaist pārejošo nogaidīšanas periodu, lai šo savienojumu varētu izmantot arī pēc novēršamām kļūdām (galīgie stāvokļi, piemēram, bloķēts savienojums vai beidzies derīguma termiņš, joprojām ir spēkā).", "disableCoolingLabel": "Atspējot nogaidīšanas periodu šim savienojumam", "bulkPasteAdded": "{count, plural, one {Pievienota 1 atslēga} other {Pievienotas # atslēgas}}", diff --git a/src/i18n/messages/ml.json b/src/i18n/messages/ml.json index 77dc791e9b39..db9705f696d0 100644 --- a/src/i18n/messages/ml.json +++ b/src/i18n/messages/ml.json @@ -1293,6 +1293,9 @@ "mainNavigation": "പ്രധാന നാവിഗേഷൻ", "unpinSection": "വിഭാഗം അൺപിൻ ചെയ്യുക", "pinSectionOpen": "വിഭാഗം തുറന്ന നിലയിൽ പിൻ ചെയ്യുക", + "pinItem": "ഇനം പിൻ ചെയ്യുക", + "unpinItem": "ഇനത്തിന്റെ പിൻ നീക്കുക", + "pinnedSection": "പിൻ ചെയ്തത്", "reloadPage": "പേജ് വീണ്ടും ലോഡ് ചെയ്യുക", "dragReorderSection": "വിഭാഗത്തിന്റെ ക്രമം മാറ്റാൻ വലിച്ചിടുക", "dragReorderItem": "ക്രമം മാറ്റാൻ വലിച്ചിടുക", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web കുക്കിക്കുള്ള സൂചന", "blockClaudeExtraUsageDescription": "ഇത് പ്രവർത്തനക്ഷമമാക്കിയാൽ, ഉപയോഗ API ക്യൂവിലുള്ള അധിക ഉപയോഗം റിപ്പോർട്ട് ചെയ്യുന്ന ഉടൻ OmniRoute ഈ Claude കണക്ഷൻ ലഭ്യമല്ലെന്ന് അടയാളപ്പെടുത്തും. അതിനാൽ ഉപയോഗത്തിനനുസരിച്ചുള്ള അധിക ബില്ലിംഗ് തുടരുന്നതിനുപകരം ഫാൾബാക്ക് മറ്റൊരു കണക്ഷനിലേക്ക് മാറും.", "blockClaudeExtraUsageLabel": "അധിക Claude ഉപയോഗം തടയുക", + "claudeLowPriorityModeLabel": "5 മണിക്കൂർ പരിധിക്ക് ശേഷം കുറഞ്ഞ മുൻഗണനയിൽ തുടരുക", + "claudeLowPriorityModeDescription": "ഈ അക്കൗണ്ട് അതിന്റെ 5 മണിക്കൂർ ഉപയോഗപരിധിയിലെത്തുകയും Anthropic കുറഞ്ഞ മുൻഗണനയുള്ള പാത ലഭ്യമാക്കുകയും ചെയ്യുമ്പോൾ, OmniRoute അത് സ്വീകരിച്ച് വിൻഡോ പുനഃസജ്ജമാകുന്നതുവരെ anthropic-usage-limit: slow ഉപയോഗിച്ച് അഭ്യർത്ഥനകൾ അയയ്ക്കുന്നത് തുടരുന്നു; കണക്ഷൻ കൂൾ ഡൗൺ ചെയ്യുകയില്ല. പ്രതിവാര പരിധി അപ്പോഴും ബാധകമാണ്, കൂടാതെ ശേഷി ലഭ്യമാകുന്നതുവരെ പ്രതികരണങ്ങൾ കാത്തിരിക്കേണ്ടി വന്നേക്കാം.", + "claudeAutoLimitResetLabel": "സെഷൻ പരിധി സ്വയമേവ പുനഃസജ്ജമാക്കുക (ആഴ്ചയിൽ ഒരിക്കൽ)", + "claudeAutoLimitResetDescription": "ഈ അക്കൗണ്ട് അതിന്റെ 5 മണിക്കൂർ ഉപയോഗപരിധിയിലെത്തുകയും സെഷൻ പരിധി പുനഃസജ്ജമാക്കാനുള്ള അവസരം ലഭ്യമാകുകയും ചെയ്യുമ്പോൾ, OmniRoute അത് സ്വയമേവ പ്രയോജനപ്പെടുത്തി പൂർണ്ണ വേഗത്തിൽ വീണ്ടും ശ്രമിക്കുന്നു. അക്കൗണ്ടിന് ആഴ്ചയിൽ ഒരിക്കൽ ലഭിക്കുന്ന പുനഃസജ്ജീകരണം ഉപയോഗിക്കുന്നു; ഇത് അപ്പോഴും പ്രതിവാര പരിധിയിൽ കണക്കാക്കപ്പെടും.", "disableCoolingDescription": "താൽക്കാലിക കൂൾഡൗൺ ഒഴിവാക്കുക, അതുവഴി വീണ്ടെടുക്കാവുന്ന പിശകുകൾക്ക് ശേഷവും ഈ കണക്ഷൻ യോഗ്യമായി തുടരും (നിരോധിച്ചത്/കാലഹരണപ്പെട്ടത് പോലുള്ള അന്തിമ നിലകൾ തുടർന്നും ബാധകമാണ്).", "disableCoolingLabel": "ഈ കണക്ഷന്റെ കൂൾഡൗൺ പ്രവർത്തനരഹിതമാക്കുക", "bulkPasteAdded": "{count, plural, one {1 കീ ചേർത്തു} other {# കീകൾ ചേർത്തു}}", diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json index 90067187629e..08b1fd9ff7d0 100644 --- a/src/i18n/messages/mr.json +++ b/src/i18n/messages/mr.json @@ -1293,6 +1293,9 @@ "mainNavigation": "मुख्य नेव्हिगेशन", "unpinSection": "विभाग अनपिन करा", "pinSectionOpen": "विभाग उघडा पिन करा", + "pinItem": "आयटम पिन करा", + "unpinItem": "आयटम अनपिन करा", + "pinnedSection": "पिन केलेले", "reloadPage": "पेज रीलोड करा", "dragReorderSection": "विभागाचा क्रम बदलण्यासाठी ड्रॅग करा", "dragReorderItem": "क्रम बदलण्यासाठी ड्रॅग करा", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web Cookie साठी सूचना", "blockClaudeExtraUsageDescription": "सक्षम केल्यास, OmniRoute या Claude कनेक्शनला अनुपलब्ध म्हणून चिन्हांकित करते जेव्हा वापर API क्यू केलेल्या अतिरिक्त वापराची माहिती देते, त्यामुळे फॉल्बॅक दुसऱ्या कनेक्शनवर स्विच करतो, पे-एझ-यू-गो अतिरिक्त बिलिंग चालू ठेवण्याऐवजी.", "blockClaudeExtraUsageLabel": "अतिरिक्त Claude वापर थांबवा", + "claudeLowPriorityModeLabel": "5-तासांच्या मर्यादेनंतर कमी प्राधान्याने सुरू ठेवा", + "claudeLowPriorityModeDescription": "जेव्हा हे खाते त्याच्या 5-तासांच्या वापर मर्यादेपर्यंत पोहोचते आणि Anthropic कमी-प्राधान्याचा मार्ग उपलब्ध करून देते, तेव्हा OmniRoute तो स्वीकारते आणि कनेक्शन थंड होऊ देण्याऐवजी विंडो रीसेट होईपर्यंत anthropic-usage-limit: slow सह विनंत्या पाठवत राहते. साप्ताहिक मर्यादा तरीही लागू राहते आणि अतिरिक्त क्षमता उपलब्ध होईपर्यंत प्रतिसादांना प्रतीक्षा करावी लागू शकते.", + "claudeAutoLimitResetLabel": "सत्र मर्यादा स्वयंचलितपणे रीसेट करा (आठवड्यातून एकदा)", + "claudeAutoLimitResetDescription": "जेव्हा हे खाते त्याच्या 5-तासांच्या वापर मर्यादेपर्यंत पोहोचते आणि सत्र-मर्यादा रीसेट उपलब्ध असतो, तेव्हा OmniRoute त्याचा स्वयंचलितपणे वापर करते आणि पूर्ण वेगाने पुन्हा प्रयत्न करते. यासाठी खात्याचा आठवड्यातून एकदा उपलब्ध असलेला रीसेट वापरला जातो आणि हा वापर तरीही साप्ताहिक मर्यादेत मोजला जातो.", "disableCoolingDescription": "अस्थायी कूलडाउन वगळा जेणेकरून पुनर्प्राप्त करण्यायोग्य त्रुटींनंतरही हे कनेक्शन पात्र राहील (प्रतिबंधित/कालबाह्य यांसारख्या अंतिम स्थिती अजूनही लागू होतात).", "disableCoolingLabel": "या कनेक्शनसाठी कूलडाउन अक्षम करा", "bulkPasteAdded": "{count, plural, one {1 key जोडली} other {# keys जोडल्या}}", diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index 4a7ca0a34b3a..98b004e48d3f 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navigasi utama", "unpinSection": "Nyahpin bahagian", "pinSectionOpen": "Pin bahagian terbuka", + "pinItem": "Sematkan item", + "unpinItem": "Nyahsemat item", + "pinnedSection": "Disematkan", "reloadPage": "Muat Semula Halaman", "dragReorderSection": "Seret untuk menyusun semula bahagian", "dragReorderItem": "Seret untuk menyusun semula", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Petunjuk Kuki Grok Web", "blockClaudeExtraUsageDescription": "Apabila diaktifkan, OmniRoute menandakan sambungan Claude ini tidak tersedia sebaik sahaja API penggunaan melaporkan penggunaan tambahan yang beratur, jadi fallback beralih ke sambungan lain dan bukannya meneruskan dengan pengebilan tambahan bayar mengikut penggunaan.", "blockClaudeExtraUsageLabel": "Sekat penggunaan Claude yang berlebihan", + "claudeLowPriorityModeLabel": "Teruskan pada keutamaan lebih rendah selepas had 5 jam", + "claudeLowPriorityModeDescription": "Apabila akaun ini mencapai had penggunaan 5 jam dan Anthropic menawarkan laluan keutamaan lebih rendah, OmniRoute menerimanya dan terus menghantar permintaan dengan anthropic-usage-limit: slow sehingga tetingkap ditetapkan semula, dan bukannya menyejukkan sambungan. Had mingguan masih terpakai dan respons mungkin perlu menunggu kapasiti yang tersedia.", + "claudeAutoLimitResetLabel": "Tetapkan semula had sesi secara automatik (sekali seminggu)", + "claudeAutoLimitResetDescription": "Apabila akaun ini mencapai had penggunaan 5 jam dan penetapan semula had sesi tersedia, OmniRoute menggunakannya secara automatik dan mencuba semula pada kelajuan penuh. Ini menggunakan penetapan semula sekali seminggu bagi akaun tersebut dan masih dikira dalam had mingguan.", "disableCoolingDescription": "Langkau tempoh bertenang sementara supaya sambungan ini kekal layak walaupun selepas ralat yang boleh dipulihkan (keadaan terminal seperti disekat/tamat tempoh masih terpakai).", "disableCoolingLabel": "Nyahdayakan tempoh bertenang untuk sambungan ini", "bulkPasteAdded": "{count, plural, one {1 kunci ditambah} other {# kunci ditambah}}", diff --git a/src/i18n/messages/mt.json b/src/i18n/messages/mt.json index 281c74597dc2..e3fbf9e98fd0 100644 --- a/src/i18n/messages/mt.json +++ b/src/i18n/messages/mt.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navigazzjoni ewlenija", "unpinSection": "Neħħi t-twaħħil tat-taqsima", "pinSectionOpen": "Waħħal it-taqsima biex tibqa’ miftuħa", + "pinItem": "Waħħal l-oġġett", + "unpinItem": "Aqla' l-oġġett", + "pinnedSection": "Imwaħħal", "reloadPage": "Erġa’ tella’ l-paġna", "dragReorderSection": "Iddreggja biex tibdel l-ordni tat-taqsima", "dragReorderItem": "Iddreggja biex tibdel l-ordni", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Ħjiel dwar il-cookie ta’ Grok Web", "blockClaudeExtraUsageDescription": "Meta din l-għażla tkun attivata, OmniRoute jimmarka din il-konnessjoni ta’ Claude bħala mhux disponibbli malli l-API tal-użu tirrapporta użu addizzjonali fil-kju, sabiex il-fallback jaqleb għal konnessjoni oħra minflok ikompli bil-fatturazzjoni addizzjonali skont l-użu.", "blockClaudeExtraUsageLabel": "Imblokka l-użu addizzjonali ta’ Claude", + "claudeLowPriorityModeLabel": "Kompli bi prijorità aktar baxxa wara l-limitu ta' 5 sigħat", + "claudeLowPriorityModeDescription": "Meta dan il-kont jilħaq il-limitu ta' użu tiegħu ta' 5 sigħat u Anthropic toffri l-kanal bi prijorità aktar baxxa, OmniRoute taċċettah u tkompli tibgħat it-talbiet b'anthropic-usage-limit: slow sakemm tiġi rrisettjata t-tieqa, minflok ma tħalli l-konnessjoni tistenna. Il-limitu ta' kull ġimgħa xorta japplika u t-tweġibiet jistgħu jistennew sakemm ikun hemm kapaċità disponibbli.", + "claudeAutoLimitResetLabel": "Irrisettja awtomatikament il-limitu tas-sessjoni (darba fil-ġimgħa)", + "claudeAutoLimitResetDescription": "Meta dan il-kont jilħaq il-limitu ta' użu tiegħu ta' 5 sigħat u jkun disponibbli reset tal-limitu tas-sessjoni, OmniRoute tużah awtomatikament u terġa' tipprova bil-veloċità sħiħa. Dan juża r-reset tal-kont ta' darba fil-ġimgħa u xorta jgħodd mal-limitu ta' kull ġimgħa.", "disableCoolingDescription": "Aqbeż il-perjodu ta’ stennija temporanju sabiex din il-konnessjoni tibqa’ eliġibbli anke wara żbalji li jistgħu jiġu rkuprati (l-istati terminali bħal ipprojbiti jew skaduti xorta jibqgħu japplikaw).", "disableCoolingLabel": "Iddiżattiva l-perjodu ta’ stennija għal din il-konnessjoni", "bulkPasteAdded": "{count, plural, one {Żdiedet ċavetta waħda} other {Żdiedu # ċwievet}}", diff --git a/src/i18n/messages/my.json b/src/i18n/messages/my.json index fbb996d50911..e47706f499d6 100644 --- a/src/i18n/messages/my.json +++ b/src/i18n/messages/my.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ပင်မလမ်းညွှန်", "unpinSection": "ကဏ္ဍကို ပင်ဖြုတ်ရန်", "pinSectionOpen": "ကဏ္ဍကို ဖွင့်ထားသည့်အတိုင်း ပင်ထိုးရန်", + "pinItem": "အရာကို ပင်တွဲရန်", + "unpinItem": "အရာကို ပင်ဖြုတ်ရန်", + "pinnedSection": "ပင်တွဲထားသည်", "reloadPage": "စာမျက်နှာကို ပြန်လည်တင်ပါ", "dragReorderSection": "ကဏ္ဍကို အစီအစဉ်ပြန်စီရန် ဆွဲရွှေ့ပါ", "dragReorderItem": "အစီအစဉ်ပြန်စီရန် ဆွဲရွှေ့ပါ", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web Cookie အကြံပြုချက်", "blockClaudeExtraUsageDescription": "ဖွင့်ထားသည့်အခါ usage API က စောင့်ဆိုင်းစာရင်းဝင် အပိုအသုံးပြုမှုရှိကြောင်း အစီရင်ခံသည်နှင့် OmniRoute သည် ဤ Claude connection ကို အသုံးမပြုနိုင်ဟု ချက်ချင်းမှတ်သားမည်။ ထို့ကြောင့် pay-as-you-go အပိုငွေတောင်းခံမှုဖြင့် ဆက်လက်အသုံးပြုမည့်အစား fallback က အခြား connection သို့ ပြောင်းမည်။", "blockClaudeExtraUsageLabel": "Claude အပိုအသုံးပြုမှုကို ပိတ်ဆို့ရန်", + "claudeLowPriorityModeLabel": "၅ နာရီ ကန့်သတ်ချက်ပြည့်ပြီးနောက် ဦးစားပေးအဆင့်နိမ့်ဖြင့် ဆက်လုပ်ရန်", + "claudeLowPriorityModeDescription": "ဤအကောင့်သည် ၅ နာရီ အသုံးပြုမှုကန့်သတ်ချက်သို့ ရောက်ရှိပြီး Anthropic က ဦးစားပေးအဆင့်နိမ့် လမ်းကြောင်းကို ပေးသည့်အခါ၊ OmniRoute သည် ၎င်းကို လက်ခံပြီး ချိတ်ဆက်မှုကို ခေတ္တနားစေမည့်အစား အချိန်ကာလ ပြန်လည်သတ်မှတ်သည်အထိ anthropic-usage-limit: slow ဖြင့် တောင်းဆိုမှုများကို ဆက်လက်ပေးပို့သည်။ အပတ်စဉ်ကန့်သတ်ချက်သည် ဆက်လက်သက်ရောက်နေပြီး တုံ့ပြန်မှုများသည် လွတ်နေသော စွမ်းဆောင်ရည်ရရှိသည်အထိ စောင့်ရနိုင်သည်။", + "claudeAutoLimitResetLabel": "စက်ရှင်ကန့်သတ်ချက်ကို အလိုအလျောက် ပြန်လည်သတ်မှတ်ရန် (တစ်ပတ်လျှင် တစ်ကြိမ်)", + "claudeAutoLimitResetDescription": "ဤအကောင့်သည် ၅ နာရီ အသုံးပြုမှုကန့်သတ်ချက်သို့ ရောက်ရှိပြီး စက်ရှင်ကန့်သတ်ချက် ပြန်လည်သတ်မှတ်မှု ရရှိနိုင်သည့်အခါ၊ OmniRoute သည် ၎င်းကို အလိုအလျောက် ရယူအသုံးပြုပြီး အမြန်နှုန်းအပြည့်ဖြင့် ပြန်လည်ကြိုးစားသည်။ အကောင့်၏ တစ်ပတ်လျှင်တစ်ကြိမ် ပြန်လည်သတ်မှတ်ခွင့်ကို အသုံးပြုပြီး အပတ်စဉ်ကန့်သတ်ချက်တွင်လည်း ဆက်လက်ထည့်သွင်းရေတွက်သည်။", "disableCoolingDescription": "ယာယီ cooldown ကို ကျော်သွားစေပြီး ပြန်လည်ပြင်ဆင်နိုင်သော အမှားများ ဖြစ်ပွားပြီးနောက်တွင်ပင် ဤချိတ်ဆက်မှုကို ဆက်လက်အသုံးပြုနိုင်အောင် ထားပါ (ပိတ်ပင်ခံရခြင်း/သက်တမ်းကုန်ခြင်းကဲ့သို့သော terminal အခြေအနေများမှာ ဆက်လက်သက်ရောက်ပါသည်)။", "disableCoolingLabel": "ဤချိတ်ဆက်မှုအတွက် cooldown ကို ပိတ်ရန်", "bulkPasteAdded": "{count, plural, one {ကီး 1 ခု ထည့်ပြီး} other {ကီး # ခု ထည့်ပြီး}}", diff --git a/src/i18n/messages/ne.json b/src/i18n/messages/ne.json index 4c2f27c1c77f..b862f4f52b73 100644 --- a/src/i18n/messages/ne.json +++ b/src/i18n/messages/ne.json @@ -1293,6 +1293,9 @@ "mainNavigation": "मुख्य नेभिगेसन", "unpinSection": "खण्ड अनपिन गर्नुहोस्", "pinSectionOpen": "खण्ड खुला रहने गरी पिन गर्नुहोस्", + "pinItem": "वस्तु पिन गर्नुहोस्", + "unpinItem": "वस्तु अनपिन गर्नुहोस्", + "pinnedSection": "पिन गरिएको", "reloadPage": "पृष्ठ पुनः लोड गर्नुहोस्", "dragReorderSection": "खण्डको क्रम बदल्न तान्नुहोस्", "dragReorderItem": "क्रम बदल्न तान्नुहोस्", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web कुकी सङ्केत", "blockClaudeExtraUsageDescription": "सक्षम पार्दा, प्रयोग API ले प्रतीक्षारत अतिरिक्त प्रयोग रिपोर्ट गर्नेबित्तिकै OmniRoute ले यो Claude जडानलाई अनुपलब्ध चिन्ह लगाउँछ, जसले गर्दा प्रयोगअनुसार-भुक्तानी अतिरिक्त बिलिङ जारी राख्नुको सट्टा फलब्याक अर्को जडानमा स्विच हुन्छ।", "blockClaudeExtraUsageLabel": "अतिरिक्त Claude प्रयोग रोक्नुहोस्", + "claudeLowPriorityModeLabel": "५-घण्टे सीमापछि न्यून प्राथमिकतामा जारी राख्नुहोस्", + "claudeLowPriorityModeDescription": "जब यो खाता आफ्नो ५-घण्टे प्रयोग सीमामा पुग्छ र Anthropic ले न्यून-प्राथमिकता लेन उपलब्ध गराउँछ, OmniRoute ले त्यसलाई स्वीकार गर्छ र विन्डो रिसेट नहुन्जेल जडानलाई विश्राम दिनुको सट्टा anthropic-usage-limit: slow सहित अनुरोधहरू पठाइरहन्छ। साप्ताहिक सीमा अझै लागू हुन्छ र प्रतिक्रियाहरूले अतिरिक्त क्षमता उपलब्ध नहुन्जेल कुर्नुपर्ने हुन सक्छ।", + "claudeAutoLimitResetLabel": "सत्र सीमा स्वतः रिसेट गर्नुहोस् (हप्तामा एक पटक)", + "claudeAutoLimitResetDescription": "जब यो खाता आफ्नो ५-घण्टे प्रयोग सीमामा पुग्छ र सत्र-सीमा रिसेट उपलब्ध हुन्छ, OmniRoute ले त्यसलाई स्वतः प्रयोग गर्छ र पूर्ण गतिमा पुनः प्रयास गर्छ। यसले खाताको हप्तामा एक पटक पाइने रिसेट प्रयोग गर्छ र अझै पनि साप्ताहिक सीमामा गणना हुन्छ।", "disableCoolingDescription": "क्षणिक कूलडाउन छोड्नुहोस्, ताकि पुनःप्राप्त गर्न सकिने त्रुटिहरूपछि पनि यो जडान योग्य रहोस् (प्रतिबन्धित/म्याद सकिएको जस्ता अन्तिम अवस्थाहरू अझै लागू हुन्छन्)।", "disableCoolingLabel": "यस जडानका लागि कूलडाउन असक्षम गर्नुहोस्", "bulkPasteAdded": "{count, plural, one {1 कुञ्जी थपियो} other {# कुञ्जीहरू थपिए}}", diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index a174af5554ea..2c7db0e37a12 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Hoofdnavigatie", "unpinSection": "Sectie losmaken", "pinSectionOpen": "Sectie geopend vastpinnen", + "pinItem": "Item vastmaken", + "unpinItem": "Item losmaken", + "pinnedSection": "Vastgemaakt", "reloadPage": "Pagina opnieuw laden", "dragReorderSection": "Sleep om sectie te herschikken", "dragReorderItem": "Sleep om te herschikken", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Hint voor Grok Web-cookie", "blockClaudeExtraUsageDescription": "Wanneer ingeschakeld, markeert OmniRoute deze Claude-verbinding als niet beschikbaar zodra de usage API gerapporteerde extra gebruik in de wachtrij plaatst, zodat de fallback overschakelt naar een andere verbinding in plaats van door te gaan met pay-as-you-go extra facturering.", "blockClaudeExtraUsageLabel": "Blokkeer extra Claude-gebruik", + "claudeLowPriorityModeLabel": "Doorgaan met lagere prioriteit na de limiet van 5 uur", + "claudeLowPriorityModeDescription": "Wanneer dit account de gebruikslimiet van 5 uur bereikt en Anthropic verwerking met lagere prioriteit aanbiedt, accepteert OmniRoute deze en blijft het verzoeken verzenden met anthropic-usage-limit: slow totdat het tijdvenster wordt gereset, in plaats van de verbinding tijdelijk te vertragen. De wekelijkse limiet blijft van toepassing en reacties moeten mogelijk wachten op beschikbare capaciteit.", + "claudeAutoLimitResetLabel": "De sessielimiet automatisch resetten (eenmaal per week)", + "claudeAutoLimitResetDescription": "Wanneer dit account de gebruikslimiet van 5 uur bereikt en er een reset van de sessielimiet beschikbaar is, past OmniRoute deze automatisch toe en probeert het opnieuw op volle snelheid. Dit gebruikt de wekelijkse reset van het account en telt nog steeds mee voor de wekelijkse limiet.", "disableCoolingDescription": "Sla de tijdelijke afkoelperiode over, zodat deze verbinding in aanmerking blijft komen, zelfs na herstelbare fouten (definitieve statussen zoals verbannen/verlopen zijn nog steeds van toepassing).", "disableCoolingLabel": "Afkoelperiode uitschakelen voor deze verbinding", "bulkPasteAdded": "{count, plural, one {1 sleutel toegevoegd} other {# sleutels toegevoegd}}", diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index 1fba7fca2d62..84daedb54b5e 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Hovednavigasjon", "unpinSection": "Løsne seksjon", "pinSectionOpen": "Fest seksjon åpen", + "pinItem": "Fest element", + "unpinItem": "Løsne element", + "pinnedSection": "Festet", "reloadPage": "Last inn siden på nytt", "dragReorderSection": "Dra for å endre rekkefølge på seksjon", "dragReorderItem": "Dra for å endre rekkefølge", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Tips om Grok Web-informasjonskapsel", "blockClaudeExtraUsageDescription": "Når aktivert, markerer OmniRoute denne Claude-tilkoblingen som utilgjengelig så snart bruks-API-et rapporterer køet ekstra bruk, slik at fallback bytter til en annen tilkobling i stedet for å fortsette med betaling-per-bruk ekstra fakturering.", "blockClaudeExtraUsageLabel": "Blokker ekstra Claude-bruk", + "claudeLowPriorityModeLabel": "Fortsett med lavere prioritet etter 5-timersgrensen", + "claudeLowPriorityModeDescription": "Når denne kontoen når bruksgrensen på 5 timer og Anthropic tilbyr køen med lavere prioritet, godtar OmniRoute dette og fortsetter å sende forespørsler med anthropic-usage-limit: slow til tidsvinduet tilbakestilles, i stedet for å la forbindelsen kjøles ned. Ukesgrensen gjelder fortsatt, og svar må kanskje vente på ledig kapasitet.", + "claudeAutoLimitResetLabel": "Tilbakestill øktgrensen automatisk (én gang i uken)", + "claudeAutoLimitResetDescription": "Når denne kontoen når bruksgrensen på 5 timer og en tilbakestilling av øktgrensen er tilgjengelig, aktiverer OmniRoute den automatisk og prøver på nytt med full hastighet. Dette bruker kontoens ukentlige tilbakestilling og teller fortsatt mot ukesgrensen.", "disableCoolingDescription": "Hopp over den forbigående nedkjølingen slik at denne tilkoblingen forblir kvalifisert selv etter gjenopprettelige feil (sluttilstander som utestengt/utløpt gjelder fortsatt).", "disableCoolingLabel": "Deaktiver nedkjøling for denne tilkoblingen", "bulkPasteAdded": "{count, plural, one {1 nøkkel lagt til} other {# nøkler lagt til}}", diff --git a/src/i18n/messages/or.json b/src/i18n/messages/or.json index 8338f6db1642..7d081c2aa561 100644 --- a/src/i18n/messages/or.json +++ b/src/i18n/messages/or.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ମୁଖ୍ୟ ନେଭିଗେସନ୍", "unpinSection": "ବିଭାଗକୁ ଅନ୍ପିନ୍ କରନ୍ତୁ", "pinSectionOpen": "ବିଭାଗକୁ ଖୋଲା ଅବସ୍ଥାରେ ପିନ୍ କରନ୍ତୁ", + "pinItem": "ଆଇଟମ୍କୁ ପିନ୍ କରନ୍ତୁ", + "unpinItem": "ଆଇଟମ୍କୁ ଅନ୍ପିନ୍ କରନ୍ତୁ", + "pinnedSection": "ପିନ୍ କରାଯାଇଛି", "reloadPage": "ପୃଷ୍ଠା ପୁନଃଲୋଡ୍ କରନ୍ତୁ", "dragReorderSection": "ବିଭାଗକୁ ପୁନଃକ୍ରମବଦ୍ଧ କରିବାକୁ ଟାଣନ୍ତୁ", "dragReorderItem": "ପୁନଃକ୍ରମବଦ୍ଧ କରିବାକୁ ଟାଣନ୍ତୁ", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web କୁକି ସୂଚନା", "blockClaudeExtraUsageDescription": "ସକ୍ଷମ ଥିବାବେଳେ, ବ୍ୟବହାର API କ୍ୟୁରେ ଥିବା ଅତିରିକ୍ତ ବ୍ୟବହାର ବିଷୟରେ ରିପୋର୍ଟ କରିବା ମାତ୍ରେ OmniRoute ଏହି Claude କନେକ୍ସନ୍କୁ ଅନୁପଲବ୍ଧ ଭାବେ ଚିହ୍ନିତ କରେ, ଯାହାଦ୍ୱାରା pay-as-you-go ଅତିରିକ୍ତ ବିଲିଂ ଜାରି ରଖିବା ପରିବର୍ତ୍ତେ ଫଲବ୍ୟାକ୍ ଅନ୍ୟ ଏକ କନେକ୍ସନ୍କୁ ସୁଇଚ୍ କରେ।", "blockClaudeExtraUsageLabel": "ଅତିରିକ୍ତ Claude ବ୍ୟବହାରକୁ ଅବରୋଧ କରନ୍ତୁ", + "claudeLowPriorityModeLabel": "5-ଘଣ୍ଟିଆ ସୀମା ପରେ କମ୍ ପ୍ରାଥମିକତାରେ ଜାରି ରଖନ୍ତୁ", + "claudeLowPriorityModeDescription": "ଏହି ଆକାଉଣ୍ଟ ତାହାର 5-ଘଣ୍ଟିଆ ବ୍ୟବହାର ସୀମାରେ ପହଞ୍ଚିଲେ ଏବଂ Anthropic କମ୍-ପ୍ରାଥମିକତା ଲେନ୍ ପ୍ରଦାନ କଲେ, OmniRoute ଏହାକୁ ଗ୍ରହଣ କରେ ଏବଂ ସଂଯୋଗକୁ ବିରାମ ଦେବା ପରିବର୍ତ୍ତେ ୱିଣ୍ଡୋ ରିସେଟ୍ ହେବା ପର୍ଯ୍ୟନ୍ତ anthropic-usage-limit: slow ସହିତ ଅନୁରୋଧ ପଠାଇବା ଜାରି ରଖେ। ସାପ୍ତାହିକ ସୀମା ତଥାପି ପ୍ରଯୁଜ୍ୟ ହୁଏ ଏବଂ ଅତିରିକ୍ତ କ୍ଷମତା ଉପଲବ୍ଧ ହେବା ପର୍ଯ୍ୟନ୍ତ ପ୍ରତିକ୍ରିୟାଗୁଡ଼ିକୁ ଅପେକ୍ଷା କରିବାକୁ ପଡ଼ିପାରେ।", + "claudeAutoLimitResetLabel": "ସେସନ୍ ସୀମାକୁ ସ୍ୱତଃ-ରିସେଟ୍ କରନ୍ତୁ (ସପ୍ତାହକୁ ଥରେ)", + "claudeAutoLimitResetDescription": "ଏହି ଆକାଉଣ୍ଟ ତାହାର 5-ଘଣ୍ଟିଆ ବ୍ୟବହାର ସୀମାରେ ପହଞ୍ଚିଲେ ଏବଂ ସେସନ୍-ସୀମା ରିସେଟ୍ ଉପଲବ୍ଧ ଥିଲେ, OmniRoute ଏହାକୁ ସ୍ୱୟଂଚାଳିତ ଭାବେ ଦାବି କରେ ଏବଂ ପୂର୍ଣ୍ଣ ବେଗରେ ପୁନଃଚେଷ୍ଟା କରେ। ଏହା ଆକାଉଣ୍ଟର ସପ୍ତାହକୁ-ଥରେ ମିଳୁଥିବା ରିସେଟ୍କୁ ବ୍ୟବହାର କରେ ଏବଂ ତଥାପି ସାପ୍ତାହିକ ସୀମାରେ ଗଣାଯାଏ।", "disableCoolingDescription": "ଅସ୍ଥାୟୀ କୁଲଡାଉନ୍କୁ ଏଡ଼ାଇ ଯାଆନ୍ତୁ, ଯାହାଦ୍ୱାରା ପୁନରୁଦ୍ଧାରଯୋଗ୍ୟ ତ୍ରୁଟି ପରେ ମଧ୍ୟ ଏହି ସଂଯୋଗ ଯୋଗ୍ୟ ରହିବ (ନିଷିଦ୍ଧ/ମିଆଦ ସମାପ୍ତ ପରି ଅନ୍ତିମ ଅବସ୍ଥାଗୁଡ଼ିକ ତଥାପି ଲାଗୁ ହେବ)।", "disableCoolingLabel": "ଏହି ସଂଯୋଗ ପାଇଁ କୁଲଡାଉନ୍ ଅକ୍ଷମ କରନ୍ତୁ", "bulkPasteAdded": "{count, plural, one {1ଟି କୀ ଯୋଡ଼ାଗଲା} other {#ଟି କୀ ଯୋଡ଼ାଗଲା}}", diff --git a/src/i18n/messages/pa.json b/src/i18n/messages/pa.json index 1b4e80937370..06cb811e19f6 100644 --- a/src/i18n/messages/pa.json +++ b/src/i18n/messages/pa.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ਮੁੱਖ ਨੇਵੀਗੇਸ਼ਨ", "unpinSection": "ਸੈਕਸ਼ਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ", "pinSectionOpen": "ਸੈਕਸ਼ਨ ਨੂੰ ਪਿੰਨ ਕਰਕੇ ਖੁੱਲ੍ਹਾ ਰੱਖੋ", + "pinItem": "ਆਈਟਮ ਨੂੰ ਪਿੰਨ ਕਰੋ", + "unpinItem": "ਆਈਟਮ ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ", + "pinnedSection": "ਪਿੰਨ ਕੀਤਾ ਹੋਇਆ", "reloadPage": "ਪੰਨਾ ਮੁੜ ਲੋਡ ਕਰੋ", "dragReorderSection": "ਸੈਕਸ਼ਨ ਦਾ ਕ੍ਰਮ ਬਦਲਣ ਲਈ ਖਿੱਚੋ", "dragReorderItem": "ਕ੍ਰਮ ਬਦਲਣ ਲਈ ਖਿੱਚੋ", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok ਵੈੱਬ ਕੂਕੀ ਸੰਕੇਤ", "blockClaudeExtraUsageDescription": "ਸਮਰੱਥ ਹੋਣ 'ਤੇ, ਜਿਵੇਂ ਹੀ ਵਰਤੋਂ API ਕਤਾਰਬੱਧ ਵਾਧੂ ਵਰਤੋਂ ਦੀ ਰਿਪੋਰਟ ਕਰਦਾ ਹੈ, OmniRoute ਇਸ Claude ਕਨੈਕਸ਼ਨ ਨੂੰ ਅਣਉਪਲਬਧ ਵਜੋਂ ਚਿੰਨ੍ਹਿਤ ਕਰ ਦਿੰਦਾ ਹੈ, ਤਾਂ ਜੋ ਵਰਤੋਂ ਅਨੁਸਾਰ ਭੁਗਤਾਨ ਵਾਲੀ ਵਾਧੂ ਬਿਲਿੰਗ ਜਾਰੀ ਰੱਖਣ ਦੀ ਬਜਾਏ ਫਾਲਬੈਕ ਕਿਸੇ ਹੋਰ ਕਨੈਕਸ਼ਨ 'ਤੇ ਸਵਿੱਚ ਹੋ ਜਾਵੇ।", "blockClaudeExtraUsageLabel": "ਵਾਧੂ Claude ਵਰਤੋਂ ਨੂੰ ਬਲੌਕ ਕਰੋ", + "claudeLowPriorityModeLabel": "5-ਘੰਟਿਆਂ ਦੀ ਸੀਮਾ ਤੋਂ ਬਾਅਦ ਘੱਟ ਤਰਜੀਹ ਨਾਲ ਜਾਰੀ ਰੱਖੋ", + "claudeLowPriorityModeDescription": "ਜਦੋਂ ਇਹ ਖਾਤਾ ਆਪਣੀ 5-ਘੰਟਿਆਂ ਦੀ ਵਰਤੋਂ ਸੀਮਾ ਤੱਕ ਪਹੁੰਚ ਜਾਂਦਾ ਹੈ ਅਤੇ Anthropic ਘੱਟ-ਤਰਜੀਹ ਵਾਲੀ ਲੇਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦਾ ਹੈ, ਤਾਂ OmniRoute ਇਸਨੂੰ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ ਅਤੇ ਵਿੰਡੋ ਰੀਸੈੱਟ ਹੋਣ ਤੱਕ ਕਨੈਕਸ਼ਨ ਨੂੰ ਵਿਰਾਮ ਦੇਣ ਦੀ ਬਜਾਏ anthropic-usage-limit: slow ਨਾਲ ਬੇਨਤੀਆਂ ਭੇਜਦਾ ਰਹਿੰਦਾ ਹੈ। ਹਫ਼ਤਾਵਾਰੀ ਸੀਮਾ ਫਿਰ ਵੀ ਲਾਗੂ ਰਹਿੰਦੀ ਹੈ ਅਤੇ ਜਵਾਬਾਂ ਨੂੰ ਉਪਲਬਧ ਸਮਰੱਥਾ ਲਈ ਉਡੀਕ ਕਰਨੀ ਪੈ ਸਕਦੀ ਹੈ।", + "claudeAutoLimitResetLabel": "ਸੈਸ਼ਨ ਸੀਮਾ ਨੂੰ ਆਪਣੇ-ਆਪ ਰੀਸੈੱਟ ਕਰੋ (ਹਫ਼ਤੇ ਵਿੱਚ ਇੱਕ ਵਾਰ)", + "claudeAutoLimitResetDescription": "ਜਦੋਂ ਇਹ ਖਾਤਾ ਆਪਣੀ 5-ਘੰਟਿਆਂ ਦੀ ਵਰਤੋਂ ਸੀਮਾ ਤੱਕ ਪਹੁੰਚ ਜਾਂਦਾ ਹੈ ਅਤੇ ਸੈਸ਼ਨ-ਸੀਮਾ ਰੀਸੈੱਟ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ, ਤਾਂ OmniRoute ਆਪਣੇ-ਆਪ ਇਸਦਾ ਦਾਅਵਾ ਕਰਦਾ ਹੈ ਅਤੇ ਪੂਰੀ ਗਤੀ ਨਾਲ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ। ਇਹ ਖਾਤੇ ਦੇ ਹਫ਼ਤੇ ਵਿੱਚ ਇੱਕ ਵਾਰ ਮਿਲਣ ਵਾਲੇ ਰੀਸੈੱਟ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ ਅਤੇ ਫਿਰ ਵੀ ਹਫ਼ਤਾਵਾਰੀ ਸੀਮਾ ਵਿੱਚ ਗਿਣਿਆ ਜਾਂਦਾ ਹੈ।", "disableCoolingDescription": "ਅਸਥਾਈ ਕੂਲਡਾਊਨ ਨੂੰ ਛੱਡੋ ਤਾਂ ਜੋ ਸੁਧਾਰੀ ਜਾ ਸਕਣ ਵਾਲੀਆਂ ਗਲਤੀਆਂ ਤੋਂ ਬਾਅਦ ਵੀ ਇਹ ਕਨੈਕਸ਼ਨ ਯੋਗ ਰਹੇ (ਪਾਬੰਦੀਸ਼ੁਦਾ/ਮਿਆਦ ਪੁੱਗਣ ਵਰਗੀਆਂ ਅੰਤਿਮ ਸਥਿਤੀਆਂ ਫਿਰ ਵੀ ਲਾਗੂ ਹੁੰਦੀਆਂ ਹਨ)।", "disableCoolingLabel": "ਇਸ ਕਨੈਕਸ਼ਨ ਲਈ ਕੂਲਡਾਊਨ ਅਯੋਗ ਕਰੋ", "bulkPasteAdded": "{count, plural, one {1 ਕੁੰਜੀ ਜੋੜੀ ਗਈ} other {# ਕੁੰਜੀਆਂ ਜੋੜੀਆਂ ਗਈਆਂ}}", diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index 906dd77768ab..91612d1462cc 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Pangunahing nabigasyon", "unpinSection": "I-unpin ang seksyon", "pinSectionOpen": "I-pin na bukas ang seksyon", + "pinItem": "I-pin ang item", + "unpinItem": "I-unpin ang item", + "pinnedSection": "Naka-pin", "reloadPage": "I-reload ang Pahina", "dragReorderSection": "I-drag upang muling isaayos ang seksyon", "dragReorderItem": "I-drag upang muling isaayos", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Pahiwatig sa Cookie ng Grok Web", "blockClaudeExtraUsageDescription": "Kapag naka-enable, minamarkahan ng OmniRoute ang koneksyong ito ng Claude bilang hindi magagamit sa sandaling iulat ng usage API ang naka-queue na dagdag na paggamit, kaya ang fallback ay lumilipat sa ibang koneksyon sa halip na magpatuloy sa pay-as-you-go na dagdag na pagsingil.", "blockClaudeExtraUsageLabel": "I-block ang labis na paggamit ng Claude", + "claudeLowPriorityModeLabel": "Magpatuloy sa mas mababang priyoridad matapos maabot ang 5-oras na limitasyon", + "claudeLowPriorityModeDescription": "Kapag naabot ng account na ito ang 5-oras na limitasyon sa paggamit at nag-alok ang Anthropic ng lane na may mas mababang priyoridad, tatanggapin ito ng OmniRoute at patuloy na magpapadala ng mga kahilingan gamit ang anthropic-usage-limit: slow hanggang sa mag-reset ang palugit, sa halip na pansamantalang ihinto ang koneksyon. Nalalapat pa rin ang lingguhang limitasyon at maaaring maghintay ang mga tugon hanggang magkaroon ng libreng kapasidad.", + "claudeAutoLimitResetLabel": "Awtomatikong i-reset ang limitasyon ng session (isang beses bawat linggo)", + "claudeAutoLimitResetDescription": "Kapag naabot ng account na ito ang 5-oras na limitasyon sa paggamit at may available na pag-reset ng limitasyon ng session, awtomatiko itong kukunin ng OmniRoute at susubukang muli nang buong bilis. Gagamitin nito ang minsan-kada-linggong pag-reset ng account at mabibilang pa rin ito sa lingguhang limitasyon.", "disableCoolingDescription": "Laktawan ang transient cooldown para manatiling kwalipikado ang koneksyong ito kahit pagkatapos ng mga error na maaaring ma-recover (nalalapat pa rin ang mga terminal state tulad ng banned/expired).", "disableCoolingLabel": "I-disable ang cooldown para sa koneksyong ito", "bulkPasteAdded": "{count, plural, one {1 key ang naidagdag} other {# key ang naidagdag}}", diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index 4d6bf333c270..8973b5dbbc4f 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Nawigacja główna", "unpinSection": "Odepnij sekcję", "pinSectionOpen": "Przypnij sekcję jako otwartą", + "pinItem": "Przypnij element", + "unpinItem": "Odepnij element", + "pinnedSection": "Przypięto", "reloadPage": "Odśwież stronę", "dragReorderSection": "Przeciągnij, aby zmienić kolejność sekcji", "dragReorderItem": "Przeciągnij, aby zmienić kolejność", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Wskazówka dotycząca ciasteczka sieciowego Grok", "blockClaudeExtraUsageDescription": "Gdy włączone, OmniRoute oznacza to połączenie Claude jako niedostępne, gdy tylko API użycia zgłosi kolejkowane dodatkowe użycie, aby failover przełączył się na inne połączenie zamiast kontynuować rozliczanie dodatkowego użycia w modelu pay-as-you-go.", "blockClaudeExtraUsageLabel": "Blokuj dodatkowe użycie Claude", + "claudeLowPriorityModeLabel": "Kontynuuj z niższym priorytetem po osiągnięciu 5-godzinnego limitu", + "claudeLowPriorityModeDescription": "Gdy to konto osiągnie 5-godzinny limit użycia, a Anthropic zaoferuje tryb o niższym priorytecie, OmniRoute zaakceptuje go i będzie nadal wysyłać żądania z anthropic-usage-limit: slow aż do zresetowania okna, zamiast wstrzymywać połączenie. Tygodniowy limit nadal obowiązuje, a odpowiedzi mogą oczekiwać na wolne zasoby.", + "claudeAutoLimitResetLabel": "Automatycznie resetuj limit sesji (raz w tygodniu)", + "claudeAutoLimitResetDescription": "Gdy to konto osiągnie 5-godzinny limit użycia, a reset limitu sesji będzie dostępny, OmniRoute automatycznie go aktywuje i ponowi próbę z pełną szybkością. Wykorzystuje przysługujący kontu reset raz w tygodniu i nadal wlicza się do tygodniowego limitu.", "disableCoolingDescription": "Pomiń tymczasowy cooldown, aby to połączenie pozostało kwalifikowalne nawet po błędach podlegających naprawie (stany terminalne, takie jak banned/expired, nadal obowiązują).", "disableCoolingLabel": "Wyłącz cooldown dla tego połączenia", "bulkPasteAdded": "{count, plural, one {Dodano 1 klucz} other {Dodano # kluczy}}", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 3114c9ca266f..a5fbfb6d928e 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navegação principal", "unpinSection": "Desafixar seção", "pinSectionOpen": "Fixar seção aberta", + "pinItem": "Fixar item", + "unpinItem": "Desafixar item", + "pinnedSection": "Fixado", "reloadPage": "Recarregar Página", "dragReorderSection": "Arraste para reorganizar a seção", "dragReorderItem": "Arraste para reordenar", diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 6093ca0ef386..7988bd576a5a 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navegação principal", "unpinSection": "Desafixar secção", "pinSectionOpen": "Fixar secção aberta", + "pinItem": "Fixar item", + "unpinItem": "Desafixar item", + "pinnedSection": "Fixado", "reloadPage": "Recarregar Página", "dragReorderSection": "Arrastar para reordenar secção", "dragReorderItem": "Arrastar para reordenar", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Dica de Cookie Web do Grok", "blockClaudeExtraUsageDescription": "Quando ativado, o OmniRoute marca esta conexão Claude como indisponível assim que a API de utilização reporta utilização extra em fila, para que a alternativa mude para outra conexão em vez de continuar com a faturação extra pay-as-you-go.", "blockClaudeExtraUsageLabel": "Bloquear uso extra do Claude", + "claudeLowPriorityModeLabel": "Continuar com prioridade mais baixa após o limite de 5 horas", + "claudeLowPriorityModeDescription": "Quando esta conta atinge o limite de utilização de 5 horas e a Anthropic disponibiliza a via de prioridade mais baixa, o OmniRoute aceita-a e continua a enviar pedidos com anthropic-usage-limit: slow até a janela ser reposta, em vez de colocar a ligação em período de espera. O limite semanal continua a aplicar-se e as respostas poderão aguardar por capacidade disponível.", + "claudeAutoLimitResetLabel": "Repor automaticamente o limite da sessão (uma vez por semana)", + "claudeAutoLimitResetDescription": "Quando esta conta atinge o limite de utilização de 5 horas e está disponível uma reposição do limite da sessão, o OmniRoute solicita-a automaticamente e tenta novamente à velocidade máxima. Utiliza a reposição semanal da conta e continua a contar para o limite semanal.", "disableCoolingDescription": "Ignorar o cooldown transitório para que esta ligação permaneça elegível mesmo após erros recuperáveis (estados terminais como banido/expirado continuam a aplicar-se).", "disableCoolingLabel": "Desativar cooldown para esta ligação", "bulkPasteAdded": "{count, plural, one {1 chave adicionada} other {# chaves adicionadas}}", diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index ebf5f746ff10..8f45ee55a6ee 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Navigare principală", "unpinSection": "Anulează fixarea secțiunii", "pinSectionOpen": "Fixează secțiunea deschisă", + "pinItem": "Fixează elementul", + "unpinItem": "Anulează fixarea elementului", + "pinnedSection": "Fixat", "reloadPage": "Reîncarcă pagina", "dragReorderSection": "Trage pentru a reordona secțiunea", "dragReorderItem": "Trage pentru a reordona", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Indiciu pentru cookie-ul Grok Web", "blockClaudeExtraUsageDescription": "Când este activat, OmniRoute marchează această conexiune Claude ca fiind indisponibilă imediat ce API-ul de utilizare raportează utilizare suplimentară în așteptare, astfel încât fallback-ul să comute pe o altă conexiune în loc să continue cu facturarea suplimentară pe bază de plată pe măsură ce se utilizează.", "blockClaudeExtraUsageLabel": "Blochează utilizarea suplimentară a lui Claude", + "claudeLowPriorityModeLabel": "Continuă cu prioritate redusă după limita de 5 ore", + "claudeLowPriorityModeDescription": "Când acest cont atinge limita de utilizare de 5 ore, iar Anthropic oferă accesul cu prioritate redusă, OmniRoute îl acceptă și continuă să trimită solicitări cu anthropic-usage-limit: slow până la resetarea intervalului, în loc să lase conexiunea să se răcească. Limita săptămânală se aplică în continuare, iar răspunsurile pot aștepta până când există capacitate disponibilă.", + "claudeAutoLimitResetLabel": "Resetează automat limita sesiunii (o dată pe săptămână)", + "claudeAutoLimitResetDescription": "Când acest cont atinge limita de utilizare de 5 ore și este disponibilă o resetare a limitei sesiunii, OmniRoute o revendică automat și reîncearcă la viteză maximă. Folosește resetarea disponibilă o dată pe săptămână pentru cont și continuă să fie luată în calcul pentru limita săptămânală.", "disableCoolingDescription": "Omite perioada de răcire tranzitorie, astfel încât această conexiune să rămână eligibilă chiar și după erori recuperabile (stările terminale precum blocat/expirat se aplică în continuare).", "disableCoolingLabel": "Dezactivează perioada de răcire pentru această conexiune", "bulkPasteAdded": "{count, plural, one {1 cheie adăugată} other {# chei adăugate}}", diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 1f1b187e7902..8a6c24d03377 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Основная навигация", "unpinSection": "Открепить раздел", "pinSectionOpen": "Закрепить раздел открытым", + "pinItem": "Закрепить элемент", + "unpinItem": "Открепить элемент", + "pinnedSection": "Закреплено", "reloadPage": "Перезагрузить страницу", "dragReorderSection": "Перетащите для изменения порядка разделов", "dragReorderItem": "Перетащите, чтобы изменить порядок", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Подсказка по cookie Grok Web", "blockClaudeExtraUsageDescription": "При включении OmniRoute помечает это подключение Claude как недоступное, как только API использования сообщает о наличии платного доп. трафика, так что fallback переключается на другое подключение вместо продолжения работы с оплатой по факту.", "blockClaudeExtraUsageLabel": "Блокировать доп. использование Claude", + "claudeLowPriorityModeLabel": "Продолжать с пониженным приоритетом после достижения 5-часового лимита", + "claudeLowPriorityModeDescription": "Когда эта учётная запись достигает 5-часового лимита использования и Anthropic предлагает режим с пониженным приоритетом, OmniRoute принимает его и продолжает отправлять запросы с anthropic-usage-limit: slow до сброса окна вместо приостановки соединения. Недельный лимит по-прежнему действует, а ответы могут ожидать освобождения ресурсов.", + "claudeAutoLimitResetLabel": "Автоматически сбрасывать лимит сеанса (раз в неделю)", + "claudeAutoLimitResetDescription": "Когда эта учётная запись достигает 5-часового лимита использования и доступен сброс лимита сеанса, OmniRoute автоматически активирует его и повторяет запросы на полной скорости. При этом используется доступный раз в неделю сброс для учётной записи, а использование по-прежнему учитывается в недельном лимите.", "disableCoolingDescription": "Пропускать временный кулдаун, чтобы это подключение оставалось доступным даже после устранимых ошибок (терминальные состояния, такие как banned/expired, по-прежнему применяются).", "disableCoolingLabel": "Отключить кулдаун для этого подключения", "bulkPasteAdded": "{count, plural, one {Добавлен 1 ключ} few {Добавлено # ключа} many {Добавлено # ключей} other {Добавлено # ключа}}", diff --git a/src/i18n/messages/si.json b/src/i18n/messages/si.json index 617ee6f71834..e9e00d23d494 100644 --- a/src/i18n/messages/si.json +++ b/src/i18n/messages/si.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ප්රධාන සංචාලනය", "unpinSection": "කොටසේ ඇමුණුම ඉවත් කරන්න", "pinSectionOpen": "කොටස විවෘතව තබා අමුණන්න", + "pinItem": "අයිතමය ඇමිණන්න", + "unpinItem": "අයිතමය ගලවන්න", + "pinnedSection": "ඇමිණූ", "reloadPage": "පිටුව නැවත පූරණය කරන්න", "dragReorderSection": "කොටස නැවත අනුපිළිවෙළට සැකසීමට ඇදගෙන යන්න", "dragReorderItem": "නැවත අනුපිළිවෙළට සැකසීමට ඇදගෙන යන්න", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web කුකී ඉඟිය", "blockClaudeExtraUsageDescription": "මෙය සබල කළ විට, භාවිත API එක පෝලිම්ගත අමතර භාවිතයක් වාර්තා කළ වහාම OmniRoute මෙම Claude සම්බන්ධතාව ලබාගත නොහැකි ලෙස සලකයි. එවිට භාවිතය අනුව ගෙවන අමතර බිල්කරණය දිගටම කරගෙන යාම වෙනුවට, පසුබැසීම වෙනත් සම්බන්ධතාවකට මාරු වේ.", "blockClaudeExtraUsageLabel": "අමතර Claude භාවිතය අවහිර කරන්න", + "claudeLowPriorityModeLabel": "පැය 5 සීමාවෙන් පසු අඩු ප්රමුඛතාවකින් ඉදිරියට යන්න", + "claudeLowPriorityModeDescription": "මෙම ගිණුම එහි පැය 5ක භාවිත සීමාවට ළඟා වූ විට සහ Anthropic අඩු ප්රමුඛතා මාර්ගය ලබා දෙන විට, OmniRoute එය පිළිගෙන කාල කවුළුව යළි සැකසෙන තෙක් සම්බන්ධතාව සිසිල් කිරීම වෙනුවට anthropic-usage-limit: slow සමඟ ඉල්ලීම් යවමින් සිටියි. සතිපතා සීමාව තවමත් අදාළ වන අතර, අමතර ධාරිතාව ලැබෙන තෙක් ප්රතිචාර ප්රමාද විය හැකිය.", + "claudeAutoLimitResetLabel": "සැසි සීමාව ස්වයංක්රීයව යළි සකසන්න (සතියකට වරක්)", + "claudeAutoLimitResetDescription": "මෙම ගිණුම එහි පැය 5ක භාවිත සීමාවට ළඟා වූ විට සහ සැසි සීමාව යළි සැකසීමක් ලබා ගත හැකි නම්, OmniRoute එය ස්වයංක්රීයව ලබාගෙන පූර්ණ වේගයෙන් නැවත උත්සාහ කරයි. මෙය ගිණුමේ සතියකට වරක් ලැබෙන යළි සැකසීම භාවිත කරන අතර, සතිපතා සීමාවටද තවමත් ගණනය වේ.", "disableCoolingDescription": "තාවකාලික විරාම කාලය මඟ හරින්න, එවිට ප්රතිසාධනය කළ හැකි දෝෂවලින් පසුවත් මෙම සම්බන්ධතාව සුදුසු තත්ත්වයේ පවතී (තහනම් කළ/කල් ඉකුත් වූ වැනි අවසාන තත්ත්වයන් තවමත් අදාළ වේ).", "disableCoolingLabel": "මෙම සම්බන්ධතාව සඳහා විරාම කාලය අක්රිය කරන්න", "bulkPasteAdded": "{count, plural, one {යතුර 1ක් එක් කරන ලදී} other {යතුරු #ක් එක් කරන ලදී}}", diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index f4280c712725..03ac9030e53b 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Hlavná navigácia", "unpinSection": "Odpnúť sekciu", "pinSectionOpen": "Pripnúť sekciu otvorenú", + "pinItem": "Pripnúť položku", + "unpinItem": "Odopnúť položku", + "pinnedSection": "Pripnuté", "reloadPage": "Obnoviť stránku", "dragReorderSection": "Potiahnutím zmeníte poradie sekcie", "dragReorderItem": "Potiahnutím zmeníte poradie", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Pomôcka pre súbor cookie služby Grok Web", "blockClaudeExtraUsageDescription": "Keď je povolené, OmniRoute označí toto pripojenie Claude ako nedostupné hneď, ako API pre používanie nahlási čakajúce dodatočné používanie, takže záložný systém prejde na iné pripojenie namiesto pokračovania v dodatočnom účtovaní na základe platby za použitie.", "blockClaudeExtraUsageLabel": "Zablokovať nadmerné používanie Claude", + "claudeLowPriorityModeLabel": "Po dosiahnutí 5-hodinového limitu pokračovať s nižšou prioritou", + "claudeLowPriorityModeDescription": "Keď tento účet dosiahne svoj 5-hodinový limit používania a Anthropic ponúkne režim s nižšou prioritou, OmniRoute ho prijme a bude naďalej odosielať požiadavky s anthropic-usage-limit: slow až do obnovenia časového okna namiesto pozastavenia pripojenia. Týždenný limit sa naďalej uplatňuje a odpovede môžu čakať na voľnú kapacitu.", + "claudeAutoLimitResetLabel": "Automaticky obnoviť limit relácie (raz týždenne)", + "claudeAutoLimitResetDescription": "Keď tento účet dosiahne svoj 5-hodinový limit používania a je k dispozícii obnovenie limitu relácie, OmniRoute ho automaticky aktivuje a zopakuje pokus plnou rýchlosťou. Využije sa tým obnovenie účtu dostupné raz týždenne, pričom používanie sa naďalej započítava do týždenného limitu.", "disableCoolingDescription": "Preskočiť prechodný cooldown (doba chladnutia), aby toto pripojenie zostalo oprávnené aj po odstrániteľných chybách (konečné stavy ako zablokované/vypršané stále platia).", "disableCoolingLabel": "Zakázať cooldown pre toto pripojenie", "bulkPasteAdded": "{count, plural, one {Pridaný 1 kľúč} few {Pridané # kľúče} other {Pridaných # kľúčov}}", diff --git a/src/i18n/messages/sl.json b/src/i18n/messages/sl.json index a666be7b0f49..d216efd26e1c 100644 --- a/src/i18n/messages/sl.json +++ b/src/i18n/messages/sl.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Glavna navigacija", "unpinSection": "Odpni razdelek", "pinSectionOpen": "Pripni razdelek v odprtem stanju", + "pinItem": "Pripni element", + "unpinItem": "Odpni element", + "pinnedSection": "Pripeto", "reloadPage": "Ponovno naloži stran", "dragReorderSection": "Povlecite za prerazporeditev razdelka", "dragReorderItem": "Povlecite za prerazporeditev", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Namig za spletni piškotek Grok", "blockClaudeExtraUsageDescription": "Ko je ta možnost omogočena, OmniRoute označi to povezavo Claude kot nerazpoložljivo takoj, ko API za spremljanje porabe sporoči dodatno porabo v čakalni vrsti. Tako se preklopi na drugo povezavo, namesto da bi se nadaljevalo dodatno obračunavanje po porabi.", "blockClaudeExtraUsageLabel": "Blokiraj dodatno porabo Claude", + "claudeLowPriorityModeLabel": "Po 5-urni omejitvi nadaljuj z nižjo prioriteto", + "claudeLowPriorityModeDescription": "Ko ta račun doseže 5-urno omejitev uporabe in Anthropic ponudi možnost z nižjo prioriteto, jo OmniRoute sprejme in še naprej pošilja zahteve z anthropic-usage-limit: slow, dokler se časovno okno ne ponastavi, namesto da bi začasno prekinil povezavo. Tedenska omejitev še vedno velja, odgovori pa lahko čakajo na razpoložljivo zmogljivost.", + "claudeAutoLimitResetLabel": "Samodejno ponastavi omejitev seje (enkrat tedensko)", + "claudeAutoLimitResetDescription": "Ko ta račun doseže 5-urno omejitev uporabe in je na voljo ponastavitev omejitve seje, jo OmniRoute samodejno uveljavi in znova poskusi s polno hitrostjo. Pri tem uporabi ponastavitev računa, ki je na voljo enkrat tedensko, uporaba pa se še vedno šteje v tedensko omejitev.", "disableCoolingDescription": "Preskočite prehodno obdobje ohlajanja, da ta povezava ostane na voljo tudi po odpravljivih napakah (končna stanja, kot sta prepovedana ali potekla povezava, še vedno veljajo).", "disableCoolingLabel": "Onemogoči ohlajanje za to povezavo", "bulkPasteAdded": "{count, plural, one {Dodan 1 ključ} two {Dodana # ključa} few {Dodani # ključi} other {Dodanih # ključev}}", diff --git a/src/i18n/messages/sr.json b/src/i18n/messages/sr.json index 1bc27ecf9785..b5537610f691 100644 --- a/src/i18n/messages/sr.json +++ b/src/i18n/messages/sr.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Glavna navigacija", "unpinSection": "Otkači sekciju", "pinSectionOpen": "Закачи секцију тако да остане отворена", + "pinItem": "Закачи ставку", + "unpinItem": "Откачи ставку", + "pinnedSection": "Закачено", "reloadPage": "Поново учитај страницу", "dragReorderSection": "Превуци за промену редоследа секције", "dragReorderItem": "Превуци за промену редоследа", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Напомена о веб колачићу за Grok", "blockClaudeExtraUsageDescription": "Када је омогућено, OmniRoute означава ову Claude везу као недоступну чим API за коришћење пријави додатно коришћење на чекању, тако да се прелази на другу везу уместо да се настави са додатном наплатом по коришћењу.", "blockClaudeExtraUsageLabel": "Блокирај додатно коришћење Claude-а", + "claudeLowPriorityModeLabel": "Настави са нижим приоритетом након ограничења од 5 сати", + "claudeLowPriorityModeDescription": "Када овај налог достигне ограничење коришћења од 5 сати и Anthropic понуди канал нижег приоритета, OmniRoute га прихвата и наставља да шаље захтеве са anthropic-usage-limit: slow док се временски период не ресетује, уместо да привремено обустави везу. Недељно ограничење и даље важи, а одговори могу да чекају на слободан капацитет.", + "claudeAutoLimitResetLabel": "Аутоматски ресетуј ограничење сесије (једном недељно)", + "claudeAutoLimitResetDescription": "Када овај налог достигне ограничење коришћења од 5 сати и ресетовање ограничења сесије је доступно, OmniRoute га аутоматски активира и покушава поново пуном брзином. Користи ресетовање налога доступно једном недељно и употреба се и даље рачуна у недељно ограничење.", "disableCoolingDescription": "Прескочите привремени период чекања како би ова веза остала доступна чак и након грешака од којих је могућ опоравак (терминална стања попут забране или истека и даље се примењују).", "disableCoolingLabel": "Онемогући период чекања за ову везу", "bulkPasteAdded": "{count, plural, one {Додат је 1 кључ} other {Додато је # кључева}}", diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index a0aa94fc7cdb..7b0be3c9d23b 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Huvudnavigering", "unpinSection": "Avnåla avsnitt", "pinSectionOpen": "Fäst avsnitt öppet", + "pinItem": "Fäst objekt", + "unpinItem": "Lossa objekt", + "pinnedSection": "Fäst", "reloadPage": "Ladda om sidan", "dragReorderSection": "Dra för att ändra ordning på avsnitt", "dragReorderItem": "Dra för att ändra ordning", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Tips för Grok Web-cookie", "blockClaudeExtraUsageDescription": "När den är aktiverad markerar OmniRoute denna Claude-anslutning som otillgänglig så snart användnings-API:et rapporterar köad extra användning, så att fallback växlar till en annan anslutning istället för att fortsätta med betalning per användning av extra fakturering.", "blockClaudeExtraUsageLabel": "Blockera extra användning av Claude", + "claudeLowPriorityModeLabel": "Fortsätt med lägre prioritet efter 5-timmarsgränsen", + "claudeLowPriorityModeDescription": "När det här kontot når sin användningsgräns på 5 timmar och Anthropic erbjuder kön med lägre prioritet, accepterar OmniRoute den och fortsätter att skicka förfrågningar med anthropic-usage-limit: slow tills tidsfönstret återställs, i stället för att låta anslutningen svalna. Veckogränsen gäller fortfarande och svar kan behöva vänta på ledig kapacitet.", + "claudeAutoLimitResetLabel": "Återställ sessionsgränsen automatiskt (en gång i veckan)", + "claudeAutoLimitResetDescription": "När det här kontot når sin användningsgräns på 5 timmar och en återställning av sessionsgränsen är tillgänglig, aktiverar OmniRoute den automatiskt och försöker igen med full hastighet. Detta använder kontots återställning som är tillgänglig en gång i veckan och räknas fortfarande mot veckogränsen.", "disableCoolingDescription": "Hoppa över den tillfälliga cooldown-perioden så att denna anslutning förblir tillgänglig även efter återställningsbara fel (slutgiltiga tillstånd som banned/expired gäller fortfarande).", "disableCoolingLabel": "Inaktivera cooldown för denna anslutning", "bulkPasteAdded": "{count, plural, one {1 nyckel tillagd} other {# nycklar tillagda}}", diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json index 9b70afd273d0..b09cc62aabcc 100644 --- a/src/i18n/messages/sw.json +++ b/src/i18n/messages/sw.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Urambazaji mkuu", "unpinSection": "Bandua sehemu", "pinSectionOpen": "Bandika sehemu wazi", + "pinItem": "Bandika kipengee", + "unpinItem": "Ondoa kipengee kilichobandikwa", + "pinnedSection": "Kimebandikwa", "reloadPage": "Pakia upya Ukurasa", "dragReorderSection": "Buruta ili kupanga upya sehemu", "dragReorderItem": "Buruta ili kupanga upya", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Kidokezo cha Cookie ya Grok Web", "blockClaudeExtraUsageDescription": "Wakati imewezeshwa, OmniRoute inaashiria muunganisho huu wa Claude kuwa haupatikani mara tu API ya matumizi inaporipoti matumizi ya ziada yaliyopangwa, hivyo kuhamasisha kubadili kwenye muunganisho mwingine badala ya kuendelea na bili ya ziada ya kulipia kadri inavyotumika.", "blockClaudeExtraUsageLabel": "zuia matumizi ya ziada ya Claude", + "claudeLowPriorityModeLabel": "Endelea kwa kipaumbele cha chini baada ya kufikia kikomo cha saa 5", + "claudeLowPriorityModeDescription": "Akaunti hii inapofikia kikomo chake cha matumizi cha saa 5 na Anthropic ikatoa njia yenye kipaumbele cha chini, OmniRoute huikubali na kuendelea kutuma maombi yenye anthropic-usage-limit: slow hadi kipindi kiwekwe upya, badala ya kusitisha muunganisho kwa muda. Kikomo cha kila wiki bado kinatumika na huenda majibu yakasubiri hadi nafasi ya ziada ipatikane.", + "claudeAutoLimitResetLabel": "Weka upya kikomo cha kipindi kiotomatiki (mara moja kwa wiki)", + "claudeAutoLimitResetDescription": "Akaunti hii inapofikia kikomo chake cha matumizi cha saa 5 na uwekaji upya wa kikomo cha kipindi unapatikana, OmniRoute huutumia kiotomatiki na kujaribu tena kwa kasi kamili. Hii hutumia uwekaji upya wa akaunti wa mara moja kwa wiki na bado huhesabiwa katika kikomo cha kila wiki.", "disableCoolingDescription": "Ruka muda wa utulivu wa mpito ili muunganisho huu uendelee kustahiki hata baada ya hitilafu zinazoweza kurekebishwa (hali za mwisho kama vile zilizopigwa marufuku/zilizopitwa na wakati bado zinatumika).", "disableCoolingLabel": "Zima muda wa utulivu kwa muunganisho huu", "bulkPasteAdded": "{count, plural, one {Ufunguo 1 umeongezwa} other {Funguo # zimeongezwa}}", diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json index 41d8a923c32d..9a219619d3dd 100644 --- a/src/i18n/messages/ta.json +++ b/src/i18n/messages/ta.json @@ -1293,6 +1293,9 @@ "mainNavigation": "முதன்மை வழிசெலுத்தல்", "unpinSection": "பிரிவை அன்பின் செய்யவும்", "pinSectionOpen": "பிரிவைத் திறந்து பின் செய்யவும்", + "pinItem": "உருப்படியைப் பின் செய்", + "unpinItem": "உருப்படியின் பின்னை நீக்கு", + "pinnedSection": "பின் செய்யப்பட்டது", "reloadPage": "பக்கத்தை மீண்டும் ஏற்று", "dragReorderSection": "பிரிவை மறுவரிசைப்படுத்த இழுக்கவும்", "dragReorderItem": "மறுவரிசைப்படுத்த இழுக்கவும்", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web குக்கீ குறிப்பு", "blockClaudeExtraUsageDescription": "இது செயல்படுத்தப்பட்டால், OmniRoute இந்த Claude இணைப்பை கிடைக்காததாக குறிக்கிறது, பயன்பாட்டு API வரிசைப்படுத்தப்பட்ட கூடுதல் பயன்பாட்டைப் புகாரளிக்கும்போது, எனவே மீள்பார்வை கட்டணத்தை அடிப்படையாகக் கொண்டு கூடுதல் பில்லிங்கில் தொடர்வதற்குப் பதிலாக மற்றொரு இணைப்புக்கு மாறுகிறது.", "blockClaudeExtraUsageLabel": "கிளோட் கூடுதல் பயன்பாட்டை தடிக்கவும்", + "claudeLowPriorityModeLabel": "5 மணிநேர வரம்பிற்குப் பிறகு குறைந்த முன்னுரிமையில் தொடரவும்", + "claudeLowPriorityModeDescription": "இந்தக் கணக்கு அதன் 5 மணிநேரப் பயன்பாட்டு வரம்பை அடைந்து, Anthropic குறைந்த முன்னுரிமை வழித்தடத்தை வழங்கும்போது, OmniRoute அதை ஏற்றுக்கொண்டு, இணைப்பைத் தற்காலிகமாக நிறுத்துவதற்குப் பதிலாக, காலச் சாளரம் மீட்டமைக்கப்படும் வரை anthropic-usage-limit: slow என்பதுடன் கோரிக்கைகளைத் தொடர்ந்து அனுப்பும். வாராந்திர வரம்பு தொடர்ந்து பொருந்தும், மேலும் உபரித் திறன் கிடைக்கும் வரை பதில்கள் காத்திருக்கக்கூடும்.", + "claudeAutoLimitResetLabel": "அமர்வு வரம்பைத் தானாக மீட்டமை (வாரத்திற்கு ஒருமுறை)", + "claudeAutoLimitResetDescription": "இந்தக் கணக்கு அதன் 5 மணிநேரப் பயன்பாட்டு வரம்பை அடைந்து, அமர்வு வரம்பை மீட்டமைக்கும் வாய்ப்பு கிடைக்கும்போது, OmniRoute அதைத் தானாகப் பயன்படுத்தி முழு வேகத்தில் மீண்டும் முயற்சிக்கும். இது கணக்கின் வாரத்திற்கு ஒருமுறை கிடைக்கும் மீட்டமைப்பைப் பயன்படுத்தும்; மேலும், பயன்பாடு வாராந்திர வரம்பில் தொடர்ந்து கணக்கிடப்படும்.", "disableCoolingDescription": "தற்காலிக கூல்டவுனைத் தவிர்க்கவும், இதனால் மீட்டெடுக்கக்கூடிய பிழைகளுக்குப் பிறகும் இந்த இணைப்பு தகுதியுடையதாக இருக்கும் (தடைசெய்யப்பட்ட/காலாவதியான போன்ற இறுதி நிலைகள் இன்னும் பொருந்தும்).", "disableCoolingLabel": "இந்த இணைப்பிற்கான கூல்டவுனை முடக்கவும்", "bulkPasteAdded": "{count, plural, one {1 விசை சேர்க்கப்பட்டது} other {# விசைகள் சேர்க்கப்பட்டன}}", diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json index 89fe9201fc9d..017c4446d896 100644 --- a/src/i18n/messages/te.json +++ b/src/i18n/messages/te.json @@ -1293,6 +1293,9 @@ "mainNavigation": "ప్రధాన నావిగేషన్", "unpinSection": "విభాగాన్ని అన్‌పిన్ చేయి", "pinSectionOpen": "విభాగాన్ని పిన్ చేసి ఉంచు", + "pinItem": "అంశాన్ని పిన్ చేయండి", + "unpinItem": "అంశాన్ని అన్పిన్ చేయండి", + "pinnedSection": "పిన్ చేయబడింది", "reloadPage": "పేజీని రీలోడ్ చేయి", "dragReorderSection": "విభాగం క్రమాన్ని మార్చడానికి లాగండి", "dragReorderItem": "క్రమాన్ని మార్చడానికి లాగండి", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web కుకీ సూచన", "blockClaudeExtraUsageDescription": "సక్రియమైనప్పుడు, OmniRoute ఈ Claude కనెక్షన్‌ను అందుబాటులో లేనట్లుగా గుర్తిస్తుంది, ఉపయోగం API క్యూలో ఉన్న అదనపు ఉపయోగాన్ని నివేదించిన వెంటనే, కాబట్టి ఫాల్బ్యాక్ మరో కనెక్షన్‌కు మారుతుంది, పేమెంట్-అన్-యూ-గో అదనపు బిల్లింగ్ కొనసాగించకుండా.", "blockClaudeExtraUsageLabel": "అతిరిక్త క్లాడ్ వినియోగాన్ని అడ్డుకోండి", + "claudeLowPriorityModeLabel": "5 గంటల పరిమితి తర్వాత తక్కువ ప్రాధాన్యతతో కొనసాగించండి", + "claudeLowPriorityModeDescription": "ఈ ఖాతా తన 5 గంటల వినియోగ పరిమితిని చేరుకున్నప్పుడు మరియు Anthropic తక్కువ ప్రాధాన్యత గల లేన్ను అందించినప్పుడు, OmniRoute దాన్ని అంగీకరించి, కనెక్షన్ను కూల్డౌన్ చేయడానికి బదులుగా విండో రీసెట్ అయ్యే వరకు anthropic-usage-limit: slowతో అభ్యర్థనలను పంపడం కొనసాగిస్తుంది. వారపు పరిమితి ఇప్పటికీ వర్తిస్తుంది మరియు ఖాళీ సామర్థ్యం అందుబాటులోకి వచ్చే వరకు ప్రతిస్పందనలు వేచి ఉండవచ్చు.", + "claudeAutoLimitResetLabel": "సెషన్ పరిమితిని స్వయంచాలకంగా రీసెట్ చేయండి (వారానికి ఒకసారి)", + "claudeAutoLimitResetDescription": "ఈ ఖాతా తన 5 గంటల వినియోగ పరిమితిని చేరుకున్నప్పుడు మరియు సెషన్ పరిమితి రీసెట్ అందుబాటులో ఉన్నప్పుడు, OmniRoute దాన్ని స్వయంచాలకంగా క్లెయిమ్ చేసి పూర్తి వేగంతో మళ్లీ ప్రయత్నిస్తుంది. ఇది ఖాతాకు వారానికి ఒకసారి లభించే రీసెట్ను ఉపయోగిస్తుంది మరియు ఇప్పటికీ వారపు పరిమితిలో లెక్కించబడుతుంది.", "disableCoolingDescription": "తాత్కాలిక కూల్‌డౌన్‌ను దాటవేయండి, తద్వారా రికవర్ చేయగల ఎర్రర్‌ల తర్వాత కూడా ఈ కనెక్షన్ అర్హత కలిగి ఉంటుంది (banned/expired వంటి టెర్మినల్ స్థితులు ఇప్పటికీ వర్తిస్తాయి).", "disableCoolingLabel": "ఈ కనెక్షన్ కోసం కూల్‌డౌన్‌ను నిలిపివేయండి", "bulkPasteAdded": "{count, plural, one {1 కీ జోడించబడింది} other {# కీలు జోడించబడ్డాయి}}", diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index bafe833e754a..6b0028e6ac16 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -1293,6 +1293,9 @@ "mainNavigation": "การนำทางหลัก", "unpinSection": "ถอนหมุดส่วนนี้", "pinSectionOpen": "ปักหมุดเปิดส่วนนี้", + "pinItem": "ปักหมุดรายการ", + "unpinItem": "เลิกปักหมุดรายการ", + "pinnedSection": "ปักหมุดแล้ว", "reloadPage": "โหลดหน้าเว็บใหม่", "dragReorderSection": "ลากเพื่อจัดลำดับส่วนใหม่", "dragReorderItem": "ลากเพื่อจัดลำดับใหม่", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "คำแนะนำคุกกี้เว็บ Grok", "blockClaudeExtraUsageDescription": "เมื่อเปิดใช้งาน OmniRoute จะทำเครื่องหมายการเชื่อมต่อ Claude นี้ว่าไม่สามารถใช้งานได้ทันทีที่ API การใช้งานรายงานการใช้งานพิเศษที่รออยู่ ดังนั้นการสำรองข้อมูลจะเปลี่ยนไปยังการเชื่อมต่ออื่นแทนที่จะดำเนินการต่อในระบบการเรียกเก็บเงินพิเศษแบบจ่ายตามการใช้งาน", "blockClaudeExtraUsageLabel": "บล็อกการใช้งาน Claude ที่เกินความจำเป็น", + "claudeLowPriorityModeLabel": "ดำเนินการต่อด้วยลำดับความสำคัญที่ต่ำลงหลังจากถึงขีดจำกัด 5 ชั่วโมง", + "claudeLowPriorityModeDescription": "เมื่อบัญชีนี้ถึงขีดจำกัดการใช้งาน 5 ชั่วโมงและ Anthropic เปิดให้ใช้ช่องทางที่มีลำดับความสำคัญต่ำลง OmniRoute จะยอมรับและส่งคำขอต่อไปโดยใช้ anthropic-usage-limit: slow จนกว่ารอบเวลาจะรีเซ็ต แทนที่จะพักการเชื่อมต่อ ขีดจำกัดรายสัปดาห์ยังคงมีผล และการตอบกลับอาจต้องรอความจุที่ว่าง", + "claudeAutoLimitResetLabel": "รีเซ็ตขีดจำกัดเซสชันโดยอัตโนมัติ (สัปดาห์ละครั้ง)", + "claudeAutoLimitResetDescription": "เมื่อบัญชีนี้ถึงขีดจำกัดการใช้งาน 5 ชั่วโมงและสามารถรีเซ็ตขีดจำกัดเซสชันได้ OmniRoute จะใช้สิทธิ์รีเซ็ตโดยอัตโนมัติและลองอีกครั้งด้วยความเร็วเต็มที่ โดยใช้สิทธิ์รีเซ็ตของบัญชีที่มีให้สัปดาห์ละครั้ง และยังคงนับรวมในขีดจำกัดรายสัปดาห์", "disableCoolingDescription": "ข้ามคูลดาวน์ชั่วคราวเพื่อให้การเชื่อมต่อนี้ยังคงมีสิทธิ์ใช้งานได้แม้หลังจากเกิดข้อผิดพลาดที่กู้คืนได้ (สถานะสิ้นสุด เช่น ถูกแบน/หมดอายุ ยังคงมีผลอยู่)", "disableCoolingLabel": "ปิดใช้งานคูลดาวน์สำหรับการเชื่อมต่อนี้", "bulkPasteAdded": "{count, plural, one {เพิ่มคีย์แล้ว 1 คีย์} other {เพิ่มคีย์แล้ว # คีย์}}", diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json index 8007f6c2c05e..5a4f9ede925f 100644 --- a/src/i18n/messages/tr.json +++ b/src/i18n/messages/tr.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Ana gezinti", "unpinSection": "Bölümün sabitlemesini kaldır", "pinSectionOpen": "Bölümü açık sabitle", + "pinItem": "Öğeyi sabitle", + "unpinItem": "Öğenin sabitlemesini kaldır", + "pinnedSection": "Sabitlendi", "reloadPage": "Sayfayı Yeniden Yükle", "dragReorderSection": "Bölümü yeniden sıralamak için sürükleyin", "dragReorderItem": "Yeniden sıralamak için sürükleyin", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web Çerez İpucu", "blockClaudeExtraUsageDescription": "Etkinleştirildiğinde, OmniRoute bu Claude bağlantısını, kullanım API'si kuyrukta ek kullanım bildirdiği anda kullanılamaz olarak işaretler, böylece yedek bağlantıya geçilir ve ödeyerek kullanım ek faturalandırmasına devam edilmez.", "blockClaudeExtraUsageLabel": "Ekstra Claude kullanımını engelleyin", + "claudeLowPriorityModeLabel": "5 saatlik sınırdan sonra daha düşük öncelikle devam et", + "claudeLowPriorityModeDescription": "Bu hesap 5 saatlik kullanım sınırına ulaştığında ve Anthropic daha düşük öncelikli hattı sunduğunda, OmniRoute bunu kabul eder ve pencere sıfırlanana kadar bağlantıyı beklemeye almak yerine anthropic-usage-limit: slow ile istek göndermeye devam eder. Haftalık sınır uygulanmaya devam eder ve yanıtlar boş kapasite oluşana kadar bekleyebilir.", + "claudeAutoLimitResetLabel": "Oturum sınırını otomatik olarak sıfırla (haftada bir kez)", + "claudeAutoLimitResetDescription": "Bu hesap 5 saatlik kullanım sınırına ulaştığında ve oturum sınırı sıfırlaması kullanılabilir olduğunda, OmniRoute bunu otomatik olarak talep eder ve tam hızda yeniden dener. Hesabın haftada bir kez kullanılabilen sıfırlama hakkını kullanır ve kullanım yine haftalık sınıra dahil edilir.", "disableCoolingDescription": "Geçici bekleme süresini atlayın; böylece bu bağlantı kurtarılabilir hatalardan sonra bile uygun kalmaya devam eder (yasaklandı/süresi doldu gibi nihai durumlar yine de geçerlidir).", "disableCoolingLabel": "Bu bağlantı için bekleme süresini devre dışı bırak", "bulkPasteAdded": "{count, plural, one {1 anahtar eklendi} other {# anahtar eklendi}}", diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index f73c30a786ca..2a09662ad803 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Головна навігація", "unpinSection": "Відкріпити розділ", "pinSectionOpen": "Закріпити розділ відкритим", + "pinItem": "Закріпити елемент", + "unpinItem": "Відкріпити елемент", + "pinnedSection": "Закріплено", "reloadPage": "Перезавантажити сторінку", "dragReorderSection": "Перетягніть, щоб змінити порядок розділів", "dragReorderItem": "Перетягніть, щоб змінити порядок", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Підказка щодо файлу cookie Grok Web", "blockClaudeExtraUsageDescription": "Коли увімкнено, OmniRoute позначає це з'єднання Claude як недоступне, щойно API використання повідомляє про чергу додаткового використання, тому резервне з'єднання перемикається на інше з'єднання замість продовження на оплату за фактом додаткового рахунку.", "blockClaudeExtraUsageLabel": "Блокувати додаткове використання Claude", + "claudeLowPriorityModeLabel": "Продовжувати з нижчим пріоритетом після досягнення 5-годинного ліміту", + "claudeLowPriorityModeDescription": "Коли цей обліковий запис досягає 5-годинного ліміту використання й Anthropic пропонує канал із нижчим пріоритетом, OmniRoute приймає його та продовжує надсилати запити з anthropic-usage-limit: slow до скидання вікна замість переведення з’єднання в режим очікування. Тижневий ліміт усе одно діє, а відповіді можуть очікувати на вільні ресурси.", + "claudeAutoLimitResetLabel": "Автоматично скидати ліміт сеансу (раз на тиждень)", + "claudeAutoLimitResetDescription": "Коли цей обліковий запис досягає 5-годинного ліміту використання й доступне скидання ліміту сеансу, OmniRoute автоматично активує його та повторює спробу на повній швидкості. Використовується доступне для облікового запису скидання раз на тиждень, а використання й надалі враховується в тижневому ліміті.", "disableCoolingDescription": "Пропускати тимчасовий період очікування, щоб це підключення залишалося доступним навіть після відновлюваних помилок (термінальні стани, як-от banned/expired, все одно застосовуються).", "disableCoolingLabel": "Вимкнути період очікування для цього підключення", "bulkPasteAdded": "{count, plural, one {Додано 1 ключ} few {Додано # ключі} many {Додано # ключів} other {Додано # ключа}}", diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json index 39bc2f467cbd..38e598ac3b9f 100644 --- a/src/i18n/messages/ur.json +++ b/src/i18n/messages/ur.json @@ -1293,6 +1293,9 @@ "mainNavigation": "بنیادی نیویگیشن", "unpinSection": "سیکشن کو ان پن کریں", "pinSectionOpen": "سیکشن کو پن کر کے کھولیں", + "pinItem": "آئٹم پن کریں", + "unpinItem": "آئٹم اَن پن کریں", + "pinnedSection": "پن شدہ", "reloadPage": "صفحہ دوبارہ لوڈ کریں", "dragReorderSection": "سیکشن کو دوبارہ ترتیب دینے کے لیے گھسیٹیں", "dragReorderItem": "دوبارہ ترتیب دینے کے لیے گھسیٹیں", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web کوکی کا اشارہ", "blockClaudeExtraUsageDescription": "جب فعال ہو تو، OmniRoute اس Claude کنکشن کو غیر دستیاب نشان دیتا ہے جیسے ہی استعمال API قطار میں اضافی استعمال کی رپورٹ کرتی ہے، تاکہ متبادل کسی دوسرے کنکشن پر سوئچ ہو جائے بجائے اس کے کہ پی-ایز-یو اضافی بلنگ پر جاری رہے۔", "blockClaudeExtraUsageLabel": "اضافی کلود کے استعمال کو بلاک کریں", + "claudeLowPriorityModeLabel": "5 گھنٹے کی حد کے بعد کم ترجیح پر جاری رکھیں", + "claudeLowPriorityModeDescription": "جب یہ اکاؤنٹ اپنی 5 گھنٹے کی استعمال کی حد تک پہنچ جاتا ہے اور Anthropic کم ترجیحی لین پیش کرتا ہے، تو OmniRoute اسے قبول کرتا ہے اور ونڈو ری سیٹ ہونے تک anthropic-usage-limit: slow کے ساتھ درخواستیں بھیجتا رہتا ہے، بجائے اس کے کہ کنکشن کو عارضی طور پر روک دے۔ ہفتہ وار حد بدستور لاگو رہتی ہے اور جوابات کو اضافی گنجائش دستیاب ہونے تک انتظار کرنا پڑ سکتا ہے۔", + "claudeAutoLimitResetLabel": "سیشن کی حد خودکار طور پر ری سیٹ کریں (ہفتے میں ایک بار)", + "claudeAutoLimitResetDescription": "جب یہ اکاؤنٹ اپنی 5 گھنٹے کی استعمال کی حد تک پہنچ جاتا ہے اور سیشن کی حد ری سیٹ کرنے کا اختیار دستیاب ہوتا ہے، تو OmniRoute اسے خودکار طور پر استعمال کرتا ہے اور پوری رفتار سے دوبارہ کوشش کرتا ہے۔ یہ اکاؤنٹ کا ہفتے میں ایک بار دستیاب ری سیٹ استعمال کرتا ہے اور پھر بھی ہفتہ وار حد میں شمار ہوتا ہے۔", "disableCoolingDescription": "عارضی کول ڈاؤن کو چھوڑیں تاکہ یہ کنکشن قابلِ بحالی غلطیوں کے بعد بھی اہل رہے (حتمی حالتیں جیسے banned/expired اب بھی لاگو ہوں گی)۔", "disableCoolingLabel": "اس کنکشن کے لیے کول ڈاؤن غیر فعال کریں", "bulkPasteAdded": "{count, plural, one {1 کلید شامل کی گئی} other {# کلیدیں شامل کی گئیں}}", diff --git a/src/i18n/messages/uz.json b/src/i18n/messages/uz.json index bf3c7a9deae8..cfc69628424f 100644 --- a/src/i18n/messages/uz.json +++ b/src/i18n/messages/uz.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Asosiy navigatsiya", "unpinSection": "Boʻlimni qadashdan chiqarish", "pinSectionOpen": "Boʻlimni ochiq holda qadash", + "pinItem": "Elementni mahkamlash", + "unpinItem": "Elementni mahkamlashdan chiqarish", + "pinnedSection": "Mahkamlangan", "reloadPage": "Sahifani qayta yuklash", "dragReorderSection": "Bo‘lim tartibini o‘zgartirish uchun sudrang", "dragReorderItem": "Tartibini o‘zgartirish uchun sudrang", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Grok Web cookie’si bo‘yicha ko‘rsatma", "blockClaudeExtraUsageDescription": "Yoqilganda, foydalanish API’si navbatga qo‘yilgan qo‘shimcha foydalanish haqida xabar berishi bilanoq OmniRoute ushbu Claude ulanishini mavjud emas deb belgilaydi, shunda zaxira mexanizmi foydalangan sari haq to‘lanadigan qo‘shimcha hisob-kitobni davom ettirish o‘rniga boshqa ulanishga o‘tadi.", "blockClaudeExtraUsageLabel": "Claude’dan qo‘shimcha foydalanishni bloklash", + "claudeLowPriorityModeLabel": "5 soatlik limitdan keyin pastroq ustuvorlikda davom etish", + "claudeLowPriorityModeDescription": "Bu hisob 5 soatlik foydalanish limitiga yetganda va Anthropic pastroq ustuvorlikdagi navbatni taklif qilganda, OmniRoute uni qabul qiladi va ulanishni vaqtincha to‘xtatish o‘rniga, vaqt oralig‘i qayta tiklanguncha anthropic-usage-limit: slow bilan so‘rovlar yuborishda davom etadi. Haftalik limit hamon amal qiladi va javoblar bo‘sh quvvat paydo bo‘lishini kutishi mumkin.", + "claudeAutoLimitResetLabel": "Seans limitini avtomatik qayta tiklash (haftasiga bir marta)", + "claudeAutoLimitResetDescription": "Bu hisob 5 soatlik foydalanish limitiga yetganda va seans limitini qayta tiklash imkoniyati mavjud bo‘lsa, OmniRoute undan avtomatik foydalanadi va to‘liq tezlikda qayta urinadi. Hisobning haftasiga bir marta beriladigan qayta tiklash imkoniyatidan foydalanadi va foydalanish hajmi baribir haftalik limitga hisoblanadi.", "disableCoolingDescription": "Vaqtinchalik kutish davrini chetlab o‘tadi, shunda ushbu ulanish tiklanadigan xatolardan keyin ham foydalanish uchun yaroqli bo‘lib qoladi (bloklangan yoki muddati tugagan kabi yakuniy holatlar baribir amal qiladi).", "disableCoolingLabel": "Ushbu ulanish uchun kutish davrini o‘chirish", "bulkPasteAdded": "{count, plural, one {1 ta kalit qo‘shildi} other {# ta kalit qo‘shildi}}", diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index 526c9a28ed42..1b871591d08a 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Điều hướng chính", "unpinSection": "Bỏ ghim phần", "pinSectionOpen": "Ghim để giữ phần luôn mở", + "pinItem": "Ghim mục", + "unpinItem": "Bỏ ghim mục", + "pinnedSection": "Đã ghim", "reloadPage": "Tải lại trang", "dragReorderSection": "Kéo để sắp xếp lại phần", "dragReorderItem": "Kéo để sắp xếp lại", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Gợi ý Grok Web Cookie", "blockClaudeExtraUsageDescription": "Khi được bật, OmniRoute sẽ đánh dấu kết nối Claude này là không khả dụng ngay khi API mức sử dụng báo cáo mức sử dụng bổ sung đang xếp hàng, để chuyển dự phòng sang kết nối khác thay vì tiếp tục tính phí bổ sung theo mức sử dụng.", "blockClaudeExtraUsageLabel": "Chặn mức sử dụng Claude bổ sung", + "claudeLowPriorityModeLabel": "Tiếp tục ở mức ưu tiên thấp hơn sau khi đạt giới hạn 5 giờ", + "claudeLowPriorityModeDescription": "Khi tài khoản này đạt giới hạn sử dụng 5 giờ và Anthropic cung cấp luồng có mức ưu tiên thấp hơn, OmniRoute sẽ chấp nhận và tiếp tục gửi yêu cầu với anthropic-usage-limit: slow cho đến khi khung thời gian được đặt lại, thay vì tạm ngừng kết nối. Giới hạn hằng tuần vẫn được áp dụng và phản hồi có thể phải chờ khi có dung lượng dự phòng.", + "claudeAutoLimitResetLabel": "Tự động đặt lại giới hạn phiên (mỗi tuần một lần)", + "claudeAutoLimitResetDescription": "Khi tài khoản này đạt giới hạn sử dụng 5 giờ và có thể đặt lại giới hạn phiên, OmniRoute sẽ tự động sử dụng lượt đặt lại đó rồi thử lại ở tốc độ tối đa. Thao tác này sử dụng lượt đặt lại mỗi tuần một lần của tài khoản và vẫn được tính vào giới hạn hằng tuần.", "disableCoolingDescription": "Bỏ qua thời gian chờ tạm thời để kết nối này vẫn đủ điều kiện hoạt động ngay cả sau các lỗi có thể khôi phục (các trạng thái cuối cùng như bị cấm hoặc hết hạn vẫn áp dụng).", "disableCoolingLabel": "Vô hiệu hóa thời gian chờ cho kết nối này", "bulkPasteAdded": "{count, plural, one {Đã thêm 1 khóa} other {Đã thêm # khóa}}", @@ -9539,6 +9546,8 @@ "confirmRedeemResetCreditTitle": "Đổi tín dụng đặt lại này?", "confirmRedeemResetCredit": "Đổi một tín dụng đặt lại Codex cho tài khoản này? Thao tác này sẽ tiêu tốn một tín dụng đặt lại.", "confirmRedeemResetCreditButton": "Đổi tín dụng", + "resetCreditRedeemed": "Đã đổi lượt đặt lại", + "resetCreditRedeemFailed": "Không thể đổi tín dụng đặt lại", "glmResetCreditsModalTitle": "Thẻ đặt lại của GLM Coding Plan", "glmResetCreditsModalExplainer": "Thẻ đặt lại được sắp xếp theo thời gian hết hạn. Chọn cửa sổ 5 giờ hoặc hàng tuần bạn muốn đặt lại.", "glmResetCreditFiveHourTitle": "Đặt lại cửa sổ 5 giờ", @@ -9546,8 +9555,6 @@ "glmConfirmRedeemResetCredit": "Việc đổi sẽ đặt lại ngay cửa sổ sử dụng đã chọn và tiêu tốn vĩnh viễn thẻ này.", "glmConfirmRedeemFiveHourResetCredit": "Việc đổi sẽ đặt lại ngay cửa sổ sử dụng 5 giờ và tiêu tốn vĩnh viễn thẻ này.", "glmConfirmRedeemWeekResetCredit": "Việc đổi sẽ đặt lại ngay cửa sổ sử dụng hàng tuần và tiêu tốn vĩnh viễn thẻ này.", - "resetCreditRedeemed": "Đã đổi lượt đặt lại", - "resetCreditRedeemFailed": "Không thể đổi tín dụng đặt lại", "suiteBuilderSaveFailed": "Không thể lưu bộ đánh giá", "clone": "Nhân bản", "exportSuite": "Xuất", diff --git a/src/i18n/messages/yo.json b/src/i18n/messages/yo.json index d17dff5864f2..d0913e6bea6f 100644 --- a/src/i18n/messages/yo.json +++ b/src/i18n/messages/yo.json @@ -1293,6 +1293,9 @@ "mainNavigation": "Ìlọ kiri àkọ́kọ́", "unpinSection": "Yọ apá náà kúrò ní dídì mọ́", "pinSectionOpen": "Di apá náà mọ́ ní ṣíṣí sílẹ̀", + "pinItem": "Lẹ ohun kan mọ́lẹ̀", + "unpinItem": "Yọ ohun kan tí a lẹ̀ mọ́lẹ̀", + "pinnedSection": "Ti lẹ̀ mọ́lẹ̀", "reloadPage": "Tun ojú-ìwé náà ṣí", "dragReorderSection": "Fa láti tún apá náà tò", "dragReorderItem": "Fa láti tún tò", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "Ìtọ́kasí Kúkì Wẹ́ẹ̀bù Grok", "blockClaudeExtraUsageDescription": "Nígbà tí a bá mú un ṣiṣẹ́, OmniRoute máa sàmì sí ìsopọ̀ Claude yìí gẹ́gẹ́ bí èyí tí kò sí ní kété tí API lílo bá fi tó wa létí pé lílo àfikún ti wà ní ìlà, kí ìpadà-sẹ́yìn lè yí sí ìsopọ̀ mìíràn dípò títẹ̀síwájú pẹ̀lú ìdíyelé àfikún pay-as-you-go.", "blockClaudeExtraUsageLabel": "Dènà lílo àfikún Claude", + "claudeLowPriorityModeLabel": "Tẹ̀síwájú pẹ̀lú ààyò kékeré lẹ́yìn ààlà wákàtí márùn-ún", + "claudeLowPriorityModeDescription": "Nígbà tí àkáǹtì yìí bá dé ààlà lílò wákàtí márùn-ún rẹ̀ tí Anthropic sì pèsè ọ̀nà ààyò kékeré, OmniRoute yóò gbà á, yóò sì máa fi àwọn ìbéèrè ránṣẹ́ pẹ̀lú anthropic-usage-limit: slow títí fèrèsé náà yóò fi tún bẹ̀rẹ̀, dípò kí ó dín ìsopọ̀ náà kù. Ààlà ọ̀sọ̀ọ̀sẹ̀ ṣì wà ní àmúlò, àwọn ìdáhùn sì lè dúró de ààyè tó bá ṣókùnfà.", + "claudeAutoLimitResetLabel": "Tún ààlà sáà náà tò láìfọwọ́yí (lẹ́ẹ̀kan lọ́sẹ̀)", + "claudeAutoLimitResetDescription": "Nígbà tí àkáǹtì yìí bá dé ààlà lílò wákàtí márùn-ún rẹ̀ tí àtúntò ààlà sáà bá wà, OmniRoute yóò gbà á láìfọwọ́yí, yóò sì tún gbìyànjú ní ẹ̀kúnrẹ́rẹ́ iyára. Èyí ń lo àtúntò lẹ́ẹ̀kan lọ́sẹ̀ ti àkáǹtì náà, ó sì tún jẹ́ apá kan ààlà ọ̀sọ̀ọ̀sẹ̀.", "disableCoolingDescription": "Fò àkókò ìsinmi fún ìgbà díẹ̀ náà kọjá, kí ìsopọ̀ yìí lè ṣì yẹ fún lílo lẹ́yìn àwọn àṣìṣe tí a lè ṣàtúnṣe (àwọn ipò ìparí bíi banned/expired ṣì kan án).", "disableCoolingLabel": "Pa àkókò ìsinmi fún ìsopọ̀ yìí", "bulkPasteAdded": "{count, plural, one {A ṣàfikún kọ́kọ́rọ́ 1} other {A ṣàfikún àwọn kọ́kọ́rọ́ #}}", diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index 04a182d85424..7e7b92f39278 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -1293,6 +1293,9 @@ "mainNavigation": "主导航", "unpinSection": "取消固定分区", "pinSectionOpen": "固定分区打开", + "pinItem": "固定项目", + "unpinItem": "取消固定项目", + "pinnedSection": "已固定", "reloadPage": "重新加载页面", "dragReorderSection": "拖拽以重新排序分区", "dragReorderItem": "拖拽以重新排序", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "从 Grok Web 会话复制 Cookie。", "blockClaudeExtraUsageDescription": "隐藏部分供应商返回的重复Claude额外用量记录,避免和主token统计重复。", "blockClaudeExtraUsageLabel": "屏蔽重复Claude用量", + "claudeLowPriorityModeLabel": "达到 5 小时限额后以较低优先级继续", + "claudeLowPriorityModeDescription": "当此账户达到 5 小时使用限额且 Anthropic 提供较低优先级通道时,OmniRoute 会接受该通道,并继续发送带有 anthropic-usage-limit: slow 的请求,直到时间窗口重置,而不是让连接进入冷却状态。每周限额仍然适用,响应可能需要等待空闲容量。", + "claudeAutoLimitResetLabel": "自动重置会话限额(每周一次)", + "claudeAutoLimitResetDescription": "当此账户达到 5 小时使用限额且有可用的会话限额重置机会时,OmniRoute 会自动使用该机会,并以全速重试。这会使用账户每周一次的重置机会,且仍会计入每周限额。", "disableCoolingDescription": "跳过瞬态冷却,以便此连接在发生可恢复错误后仍符合条件(被禁/过期等终态仍适用)。", "disableCoolingLabel": "禁用此连接的冷却", "bulkPasteAdded": "{count, plural, one {已添加 1 个 key} other {已添加 # 个 key}}", diff --git a/src/i18n/messages/zh-TW.json b/src/i18n/messages/zh-TW.json index 589394fe29bc..a6b4493ceed2 100644 --- a/src/i18n/messages/zh-TW.json +++ b/src/i18n/messages/zh-TW.json @@ -1293,6 +1293,9 @@ "mainNavigation": "主導覽", "unpinSection": "取消固定分割槽", "pinSectionOpen": "固定分割槽開啟", + "pinItem": "釘選項目", + "unpinItem": "取消釘選項目", + "pinnedSection": "已釘選", "reloadPage": "重新載入頁面", "dragReorderSection": "拖拽以重新排序分割槽", "dragReorderItem": "拖拽以重新排序", @@ -5795,6 +5798,10 @@ "grokWebCookieHint": "從 Grok Web 會話複製 Cookie。", "blockClaudeExtraUsageDescription": "啟用後,一旦用量 API 回報排隊中的額外用量,OmniRoute 會將此 Claude 連線標記為不可用,讓容錯移轉切換到其他連線,而非繼續以按量計費的額外用量。", "blockClaudeExtraUsageLabel": "封鎖額外 Claude 用量", + "claudeLowPriorityModeLabel": "達到 5 小時上限後以較低優先順序繼續", + "claudeLowPriorityModeDescription": "當此帳戶達到 5 小時用量上限,且 Anthropic 提供較低優先順序的通道時,OmniRoute 會接受該通道,並持續使用 anthropic-usage-limit: slow 傳送請求,直到時間區間重設為止,而非讓連線進入冷卻。每週上限仍然適用,且回應可能需要等待閒置容量。", + "claudeAutoLimitResetLabel": "自動重設工作階段上限(每週一次)", + "claudeAutoLimitResetDescription": "當此帳戶達到 5 小時用量上限,且可重設工作階段上限時,OmniRoute 會自動使用該次重設並以完整速度重試。這會使用帳戶每週一次的重設機會,且用量仍會計入每週上限。", "disableCoolingDescription": "跳過暫時冷卻,使此連線在可恢復錯誤後仍保持資格(已停用/已過期等終止狀態仍適用)。", "disableCoolingLabel": "對此連線停用冷卻", "bulkPasteAdded": "{count, plural, one {已新增 1 個 key} other {已新增 # 個 key}}", diff --git a/tests/unit/i18n-translation-drift-stale-targets.test.ts b/tests/unit/i18n-translation-drift-stale-targets.test.ts new file mode 100644 index 000000000000..65461a3461fb --- /dev/null +++ b/tests/unit/i18n-translation-drift-stale-targets.test.ts @@ -0,0 +1,35 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { findStaleTargets } from "../../scripts/i18n/check-translation-drift.mjs"; + +// A partial refresh run (17 of 65 locales retranslated before an upstream 429) +// bumps the top-level source_hash while the interrupted locales keep the old +// one. The drift gate compared only the top-level hash and reported PASS for +// 45 stale mirrors; it must list every locale record behind its source (as a +// warning — an interrupted refresh must not turn every PR's CI red). +test("a locale whose record was written from an older source is stale", () => { + const sources = { + "README.md": { + source_hash: "new", + locales: { + de: { source_hash: "new", target_hash: "t1" }, + hu: { source_hash: "old", target_hash: "t2" }, + fr: { source_hash: "old", target_hash: "t3" }, + }, + }, + "docs/x.md": { + source_hash: "same", + locales: { de: { source_hash: "same", target_hash: "t4" } }, + }, + }; + assert.deepEqual( + findStaleTargets(sources).map((s) => `${s.locale}:${s.rel}`), + ["hu:README.md", "fr:README.md"] + ); +}); + +test("records without a per-locale source_hash (legacy) are not reported", () => { + const sources = { "docs/y.md": { source_hash: "h", locales: { de: { target_hash: "t" } } } }; + assert.deepEqual(findStaleTargets(sources), []); + assert.deepEqual(findStaleTargets({}), []); +});